31基於java的旅游信息系統設計與實現

来源:https://www.cnblogs.com/projecthelp/archive/2023/05/08/17380948.html
-Advertisement-
Play Games

基於java的旅游信息系統,景點信息管理,旅游路線管理,訂單信息管理,新聞信息管理,地方美食等。springboot的旅游管理系統,旅游系統. ...


本章節來給大家介紹一個基於java的旅游信息系統設計與實現

系統概要

旅游產業的日新月異影響著城市,村鎮旅游產業的發展變化。網路、電子科技的迅猛前進同樣牽動著旅游產業的快速成長。隨著人們消費理念的不斷發展變化,越來越多的人開始註意精神文明的追求,而不僅僅只是在意物質消費的提高。旅游信息推薦信息系統設計與實現的設計就是幫助村鎮,城市發展旅游產業,達到宣傳效果,帶動一方經濟發展。而線上消費與查詢正在以高效,方便,時尚等的特點成為廣大互聯網用戶的首選。旅游信息推薦信息系統設計與實現設計與開發以方便、快捷、費用低的優點正慢慢地進入人們的生活。人們從傳統的旅游方式轉變為線上預覽,減輕了勞動者的工作量。使得旅游從業人員有更多時間來獲取、瞭解、掌握信息。
旅游信息推薦信息系統設計與實現根據當地旅游風景和特色的實際情況,設計出一套適合當地旅游信息網站,通過網路,實現該網站的推廣從而達到宣傳的效果。

系統主要分為前臺後後臺,普通用戶在未登錄情況下前臺可以展示人氣景點,地方美食,旅游新聞,景區信息,旅游路線,用戶可自己註冊,然後登錄,登錄後可以添加收藏,預訂,和線上留言等功能;
後臺管理員可以在後臺頁面進行:賬號管理,地區管理,景點信息管理,地方美食管理,旅游路線管理,訂單信息管理,新聞信息管理,系統管理等等;
具體功能可以查看以下詳細介紹。

系統使用的架構和內容獲取

採用B/S的架構實現,整體遵循MVC的設計思想。

> 開發系統:Windows
> 架構模式:MVC/前後端分離
> JDK版本:Java JDK1.8
> 開發工具:idea或者eclipse
> 資料庫版本: mysql
> 資料庫可視化工具: navicat
> 後端:java,spring,springmvc,mybatis,tomcat等
> 前端:html,css,javascript,jquery,vue等
> 更多內容可查看:http://projecthelp.top

項目實現

所有的代碼文件都有詳細的註釋,不用擔心看不懂代碼的。

  • AdminsController
/**
 * 管理員 */
@Controller
public class AdminsController extends BaseController {
    @Autowired
    private AdminsMapper dao;
    @Autowired
    private AdminsService service;

    /**
     * 後臺列表頁
     */
    @RequestMapping("/admins_list")
    public String list() {

        // 檢測是否有登錄,沒登錄則跳轉到登錄頁面
        if (!checkLogin()) {
            return showError("尚未登錄", "./login.do");
        }

        String order = Request.get("order", "id"); // 獲取前臺提交的URL參數 order  如果沒有則設置為id
        String sort = Request.get("sort", "desc"); // 獲取前臺提交的URL參數 sort  如果沒有則設置為desc
        int pagesize = Request.getInt("pagesize", 12); // 獲取前臺一頁多少行數據
        Example example = new Example(Admins.class); //  創建一個擴展搜索類
        Example.Criteria criteria = example.createCriteria();          // 創建一個擴展搜索條件類
        String where = " 1=1 ";   // 創建初始條件為:1=1
        where += getWhere();      // 從方法中獲取url 上的參數,並寫成 sql條件語句
        criteria.andCondition(where);   // 將條件寫進上面的擴展條件類中
        if (sort.equals("desc")) {        // 判斷前臺提交的sort 參數是否等於  desc倒序  是則使用倒序,否則使用正序
            example.orderBy(order).desc();  // 把sql 語句設置成倒序
        } else {
            example.orderBy(order).asc();   // 把 sql 設置成正序
        }
        int page = request.getParameter("page") == null ? 1 : Integer.valueOf(request.getParameter("page"));  // 獲取前臺提交的URL參數 page  如果沒有則設置為1
        page = Math.max(1, page);  // 取兩個數的最大值,防止page 小於1
        List<Admins> list = service.selectPageExample(example, page, pagesize);   // 獲取當前頁的行數


        // 將列表寫給界面使用
        assign("totalCount", request.getAttribute("totalCount"));
        assign("list", list);
        assign("orderby", order);  // 把當前排序結果寫進前臺
        assign("sort", sort);      // 把當前排序結果寫進前臺
        return json();   // 將數據寫給前端
    }

    public String getWhere() {
        _var = new LinkedHashMap(); // 重置數據
        String where = " ";
        // 以下也是一樣的操作,判斷是否符合條件,符合則寫入sql 語句
        if (!Request.get("username").equals("")) {
            where += " AND username LIKE '%" + Request.get("username") + "%' ";
        }
        return where;
    }


    @RequestMapping("/admins_add")
    public String add() {
        _var = new LinkedHashMap(); // 重置數據


        return json();   // 將數據寫給前端
    }

    @RequestMapping("/admins_updt")
    public String updt() {
        _var = new LinkedHashMap(); // 重置數據
        int id = Request.getInt("id");
        // 獲取行數據,並賦值給前臺jsp頁面
        Admins mmm = service.find(id);
        assign("mmm", mmm);
        assign("updtself", 0);


        return json();   // 將數據寫給前端
    }

    @RequestMapping("/admins_updtself")
    public String updtself() {
        _var = new LinkedHashMap(); // 重置數據
        // 更新個人資料
        int id = (int) request.getSession().getAttribute("id");
        Admins mmm = service.find(id);
        assign("mmm", mmm);
        assign("updtself", 1);
        return json();   // 將數據寫給前端
    }

    /**
     * 添加內容
     *
     * @return
     */
    @RequestMapping("/adminsinsert")
    public String insert() {
        _var = new LinkedHashMap(); // 重置數據
        String tmp = "";
        Admins post = new Admins();  // 創建實體類
        // 設置前臺提交上來的數據到實體類中
        post.setUsername(Request.get("username"));
        post.setPwd(Request.get("pwd"));
        post.setAddtime(Info.getDateStr());
        service.insert(post); // 插入數據
        int charuid = post.getId().intValue();
        if (isAjax()) {
            return jsonResult(post);
        }
        return showSuccess("保存成功", Request.get("referer").equals("") ? request.getHeader("referer") : Request.get("referer"));
    }

    /**
     * 更新內容
     *
     * @return
     */
    @RequestMapping("/adminsupdate")
    public String update() {
        _var = new LinkedHashMap(); // 重置數據
        // 創建實體類
        Admins post = new Admins();
        // 將前臺表單數據填充到實體類
        if (!Request.get("username").equals(""))
            post.setUsername(Request.get("username"));
        if (!Request.get("pwd").equals(""))
            post.setPwd(Request.get("pwd"));
        if (!Request.get("addtime").equals(""))
            post.setAddtime(Request.get("addtime"));

        post.setId(Request.getInt("id"));
        service.update(post); // 更新數據
        int charuid = post.getId().intValue();

        if (isAjax()) {
            return jsonResult(post);
        }
        if (Request.getInt("updtself") == 1) {
            return showSuccess("保存成功", "admins_updtself.do");
        }

        return showSuccess("保存成功", Request.get("referer")); // 彈出保存成功,並跳轉到前臺提交的 referer 頁面
    }

    /**
     * 刪除
     */
    @RequestMapping("/admins_delete")
    public String delete() {
        _var = new LinkedHashMap(); // 重置數據
        if (!checkLogin()) {
            return showError("尚未登錄");
        }
        int id = Request.getInt("id");  // 根據id 刪除某行數據
        HashMap map = Query.make("admins").find(id);

        service.delete(id);// 根據id 刪除某行數據
        return showSuccess("刪除成功", request.getHeader("referer"));//彈出刪除成功,並跳回上一頁
    }
}

  • UploadController文件上傳的控制器實現
/**
 * 上傳控制器
 */
@Controller
public class UploadController extends BaseController {

    /**
     * 上傳文件
     *
     * @param fujian
     * @return
     * @throws Exception
     */
    @RequestMapping(value = "/upload_re")
    public String Upload(MultipartFile fujian) throws Exception {
        String fileName = fujian.getOriginalFilename();
        String suffixName = fileName.substring(fileName.lastIndexOf("."));
        fileName = UUID.randomUUID() + suffixName;
        String filePath = getFolder("upload");

        try {
            File file = new File(getPhysicalPath(filePath) + "/" + fileName);
            fujian.transferTo(file);
            request.setAttribute("url", filePath + "/" + fileName);
            if (isAjax()) {
                return jsonResult(request.getAttribute("url"));
            }
            return "upload";
        } catch (Exception e) {
            return showError(e.getMessage());
        }
    }

    private String getFolder(String path) {
        SimpleDateFormat formater = new SimpleDateFormat("yyyyMMdd");
        path += "/" + formater.format(new Date());
        File dir = new File(this.getPhysicalPath(path));
        if (!dir.exists()) {
            try {
                dir.mkdirs();
            } catch (Exception e) {
                return "";
            }
        }
        return path;
    }

    /**
     * 根據傳入的虛擬路徑獲取物理路徑
     *
     * @param path
     * @return
     */
    private String getPhysicalPath(String path) {
        String servletPath = this.request.getServletPath();
        String realPath = this.request.getSession().getServletContext()
                .getRealPath(servletPath);
        return new File(realPath).getParent() + "/" + path;
    }
}
  • UserController用戶登錄更新密碼控制器
/**
 * 用戶登錄更新密碼控制器
 */
@Controller
public class UserController extends BaseController {

    @Resource
    private AdminsService adminsService;
    @Resource
    private YonghuService yonghuService;

    /**
     * 登錄頁面
     *
     * @return
     */
    @RequestMapping("/login")
    public String Index() {
        return "login";
    }

    /**
     * 退出
     *
     * @return
     */
    @RequestMapping("/logout")
    public String Logout() {
        request.getSession().invalidate();
        return showSuccess("退出成功", "./");
    }


    /**
     * 驗證登錄用戶
     *
     * @param isAdmin
     * @param username
     * @param pwd
     * @param cx
     * @return
     */
    protected String authLoginUser(boolean isAdmin, String username, String pwd, String cx) {
        if (username == null || "".equals(username)) {
            return showError("賬號不允許為空");
        }
        if (pwd == null || "".equals(pwd)) {
            return showError("密碼不允許為空");
        }
        if (cx == null) {
            return showError("請選中登錄類型");
        }

        String random;
        // 獲取 token方式的驗證碼值
        if (isAjax() && request.getParameter("captchToken") != null) {
            random = DESUtil.decrypt("CaptchControllerPassword", request.getParameter("captchToken"));
        } else {
            random = (String) request.getSession().getAttribute("random");
        }
        String pagerandom = request.getParameter("pagerandom") == null ? "" : request.getParameter("pagerandom");

        if (request.getParameter("a") != null && !pagerandom.equals(random)) {
            return showError("驗證碼不正確", 20);
        }

        if (cx.equals("管理員")) {
            Admins user = adminsService.login(username, pwd);
            if (user == null) {
                return showError("用戶名或密碼錯誤");
            }
            session.setAttribute("id", user.getId());
            session.setAttribute("username", user.getUsername());
            session.setAttribute("cx", cx);
            session.setAttribute("login", cx);
            session.setAttribute("username", user.getUsername());
            session.setAttribute("pwd", user.getPwd());
            session.setAttribute("addtime", user.getAddtime());
            JSONObject jsonObject = JSON.parseObject(JSON.toJSONString(user));
            jsonObject.put("cx", session.getAttribute("cx"));
            jsonObject.put("username", session.getAttribute("username"));
            jsonObject.put("login", session.getAttribute("login"));
            assign("session", jsonObject);
        }
        if (cx.equals("用戶")) {
            Yonghu user = yonghuService.login(username, pwd);
            if (user == null) {
                return showError("用戶名或密碼錯誤");
            }
            session.setAttribute("id", user.getId());
            session.setAttribute("username", user.getYonghuming());
            session.setAttribute("cx", cx);
            session.setAttribute("login", cx);
            session.setAttribute("yonghuming", user.getYonghuming());
            session.setAttribute("mima", user.getMima());
            session.setAttribute("xingming", user.getXingming());
            session.setAttribute("xingbie", user.getXingbie());
            session.setAttribute("shouji", user.getShouji());
            session.setAttribute("youxiang", user.getYouxiang());
            session.setAttribute("shenfenzheng", user.getShenfenzheng());
            session.setAttribute("touxiang", user.getTouxiang());
            session.setAttribute("addtime", user.getAddtime());
            JSONObject jsonObject = JSON.parseObject(JSON.toJSONString(user));
            jsonObject.put("cx", session.getAttribute("cx"));
            jsonObject.put("username", session.getAttribute("username"));
            jsonObject.put("login", session.getAttribute("login"));
            assign("session", jsonObject);
        }

        if (session.getAttribute("username") == null) {
            return showError("賬號或密碼錯誤");
        }

        String referer = request.getParameter("referer");
        if (referer == null) {
            if (isAdmin) {
                referer = "./main.do";
            } else {
                referer = "./";
            }
        }
        assign("token", createToken(
                session.getAttribute("cx"),
                session.getAttribute("login"),
                session.getAttribute("username"),
                _var.get("session")
                )
        );
        if (this.isAjax()) {
            return json();
        } else {
            return showSuccess("登錄成功", referer);
        }
    }

    public String createToken(Object cx, Object login, Object username, Object session) {
        String SOURCE_STRING = "0123456789ABCDEFGHIGKLMNOPQRSTUVWXYZ";
        String token = createRandomString(SOURCE_STRING, 32);

        // 刪除過期token
        new CommDAO().commOper("DELETE FROM token WHERE token_time<'" + Info.getDateStr() + "'");

        HashMap tokenMap = new HashMap();
        tokenMap.put("token", token);
        tokenMap.put("cx", cx);
        tokenMap.put("login", login);
        tokenMap.put("username", username);
        tokenMap.put("valueid", this.session.getAttribute("id"));
        // 10天的有效期
        tokenMap.put("token_time", Info.date("yyyy-MM-dd HH:mm:ss", Info.time() + 86400 * 10));
        tokenMap.put("session", JSON.toJSONString(session));

        Query.make("token").add(tokenMap);

        return token;
    }

    /**
     * 使用已有token 登錄
     *
     * @return
     */
    @RequestMapping("/tokenLogin")
    public String tokenLogin() {
        String token = request.getParameter("token");
        HashMap<String, String> tokenInfo = Query.make("token").where("token", token).where("token_time", ">", Info.getDateStr()).find();
        if (tokenInfo.isEmpty()) {
            return jsonError("token已失效");
        }

        String cx = tokenInfo.get("login");
        Object user = null;

        if (cx.equals("管理員")) {
            user = adminsService.find(tokenInfo.get("valueid"));
        }
        if (cx.equals("用戶")) {
            user = yonghuService.find(tokenInfo.get("valueid"));
        }
        if (user == null) {
            return jsonError("沒找到token中用戶");
        }
        tokenInfo.put("session", JSON.toJSONString(user));

        session.setAttribute("cx", tokenInfo.get("cx"));
        session.setAttribute("login", tokenInfo.get("login"));
        session.setAttribute("username", tokenInfo.get("username"));
        session.setAttribute("id", tokenInfo.get("valueid"));

        JSONObject session1 = JSON.parseObject(tokenInfo.get("session"));
        for (Map.Entry<String, Object> entry : session1.entrySet()) {
            session.setAttribute(entry.getKey(), entry.getValue());
        }
        session1.put("cx", tokenInfo.get("cx"));
        session1.put("login", tokenInfo.get("login"));
        session1.put("username", tokenInfo.get("username"));

        assign("token", token);
        assign("session", session1);

        // 刷新token有效期
        tokenInfo.put("token_time", Info.date("yyyy-MM-dd HH:mm:ss", Info.time() + 86400 * 10));
        Query.make("token").where("token", token).update(tokenInfo);
        return json();
    }


    /**
     * 獲取隨機串
     *
     * @param source 源字元串
     * @param length 隨機串的長度
     * @return 隨機串
     */
    private String createRandomString(String source, int length) {
        if (this.isNullOrEmpty(source)) {
            return "";
        }

        StringBuffer result = new StringBuffer();
        Random random = new Random();

        for (int index = 0; index < length; index++) {
            result.append(source.charAt(random.nextInt(source.length())));
        }

        System.out.println(result.toString());
        return result.toString();
    }

    /**
     * 判斷字元串是否為空
     *
     * @param target
     * @return true:空,false:非空
     */
    private boolean isNullOrEmpty(String target) {
        if (null == target || "".equals(target) || target.isEmpty()) {
            return true;
        }
        return false;
    }


    /**
     * 後臺主頁面
     *
     * @return
     */
    @RequestMapping("/main")
    public String main() {
        return "main";
    }

    /**
     * 後臺初始頁面
     *
     * @return
     */
    @RequestMapping("/sy")
    public String sy() {
        return "sy";
    }

    /**
     * 不一定有
     *
     * @return
     */
    @RequestMapping("/mygo")
    public String mygo() {
        return "mygo";
    }

    /**
     * 頭部頁面
     *
     * @return
     */
    @RequestMapping("/top")
    public String top() {
        return "top";
    }

    /**
     * 驗證登錄頁面
     *
     * @return
     */
    @RequestMapping("/authLogin")
    public String authLogin() {
        String username = Request.get("username");
        String pwd = Request.get("pwd");
        String cx = Request.get("cx");
        return authLoginUser(false, username, pwd, cx);
    }

    /**
     * 驗證後臺登錄
     *
     * @return
     */
    @RequestMapping("/authAdminLogin")
    public String authAdminLogin() {
        String username = Request.get("username");
        String pwd = Request.get("pwd");
        String cx = Request.get("cx");
        return authLoginUser(true, username, pwd, cx);
    }

    /**
     * 修改登錄密碼頁面
     *
     * @return
     */
    @RequestMapping("/mod")
    public String mod() {
        return "mod";
    }

    /**
     * 保存修改密碼
     *
     * @return
     */
    @RequestMapping("/editPassword")
    public String editPassword() {
        String username = request.getSession().getAttribute("username").toString();
        String cx = request.getSession().getAttribute("login").toString();
        String oldPassword = Request.get("oldPassword");
        String newPwd = Request.get("newPwd");
        String newPwd2 = Request.get("newPwd2");

        if (!newPwd.equals(newPwd2)) {
            return showError("兩次密碼不一致");
        }


        if (cx.equals("管理員")) {
            Admins user = adminsService.login(username, oldPassword);
            if (user == null) {
                return showError("原密碼不正確");
            }
            adminsService.updatePassword(user.getId(), newPwd);
        }
        if (cx.equals("用戶")) {
            Yonghu user = yonghuService.login(username, oldPassword);
            if (user == null) {
                return showError("原密碼不正確");
            }
            yonghuService.updatePassword(user.getId(), newPwd);
        }
        return showSuccess("修改密碼成功", "./mod.do");
    }
}

部分功能展示

系統前臺功能

  • 系統首頁
    系統首頁上面有一個輪播圖的效果,輪播圖可以管理員自己在管理端頁面自己增加或修改,不需要改代碼即可實現,同時還有人氣景點,地方美食等首頁信息展示,這些內容都是可以管理員在後端自定義的:
    在這裡插入圖片描述

對於未登錄用戶是可以點擊進去查看的:
在這裡插入圖片描述

【重點】這些查看的圖片和信息都是管理員可以在後臺進行自定義修改的,絲毫不用擔心自己看不懂代碼不會改怎麼辦。

  • 新聞信息查看
    在這裡插入圖片描述

用戶可以點擊進去查看新聞信息,預設系統有站內新聞,和行業資訊倆個分類,這裡的分類展示的只是預設的倆個,管理員可以在後臺自己添加修改的,用戶還可以進行搜索內容。新聞信息是管理員在後臺進行動態的修改管理的。

  • 景區信息查看
    在這裡插入圖片描述

系統預設包含本地,境內和境外三的大分類,同理這裡的分類,管理員可以在後臺進行增加修改或刪除的,同時裡面的景點信息都是由管理員在後臺進行動態錄入的,用戶可以點擊查看景點信息內容。
在這裡插入圖片描述

對於未登錄用戶,如果點擊收藏,會提示用戶請先登錄:
在這裡插入圖片描述

  • 美食信息查看
    在這裡插入圖片描述

用戶可以查看美食信息,同理,這裡的分類都是可以管理員在後臺進行修改的。

  • 旅游線路查看
    在這裡插入圖片描述

  • 線上留言
    對於未登錄用戶,如果點擊的話會提示用戶進行登錄,對於已經登錄用戶,就直接回跳轉到留言的頁面進行線上留言:
    在這裡插入圖片描述

  • 用戶註冊
    在這裡插入圖片描述

  • 用戶登錄
    在這裡插入圖片描述
    用戶可以通過賬號和密碼登錄系統中,用戶可以選擇對應的角色進行登錄,不同的角色登錄到系統看到的不同頁面管理;

普通用戶角色

對於普通用戶角色,可以在系統上面查看到上面的功能外,還可以對查看的信息進行收藏或者預訂,同時還可以查看到個人中心:

  • 個人中心首頁
    在這裡插入圖片描述

  • 查看我的預訂列表
    在這裡插入圖片描述

  • 修改個人資料,修改密碼

  • 我的收藏
    在這裡插入圖片描述
    對於用戶收藏的東西會存放到個人中心頁面,進行統一管理。

  • 我的留言管理

管理員角色用戶

對於系統管理員,除了以上的功能外,還可以動態編輯修改增加所有頁面上你可以看到的信息。

  • 管理員登錄:管理員登錄和普通用戶登錄是同一個頁面,但登錄的時候需要選擇管理員角色哦

  • 管理員首頁
    在這裡插入圖片描述

  • 賬號管理
    管理員可以對管理員信息賬號進行管理,同時還可以增加管理員,同時還對普通用戶的信息進行統一管理,管理員還可以自己手動添加用戶信息:
    在這裡插入圖片描述

  • 管理員也可以對賬號密碼進行修改

  • 地區管理
    在這裡插入圖片描述

  • 景點信息管理
    在這裡插入圖片描述
    前臺用戶看到的所有的景點信息,都是可以管理員在這裡進行修改的,可以根據自己的需求編輯信息,然後用戶看到的就會不同了。

  • 地方美食管理:美食分類管理:管理員可以查看美食分類列表或增加修改美食類型

  • 美食信息管理:對於美食信息,用戶可以動態的修改對應的分類下的美食信息

  • 旅游路線管理

  • 用戶訂單信息管理
    在這裡插入圖片描述

  • 新聞分類管理
    在這裡插入圖片描述

  • 新聞信息管理:管理員可以增加修改每個分類下的新聞信息
    在這裡插入圖片描述

  • 系統管理

  • 前臺輪播圖管理
    在這裡插入圖片描述
    對於前臺的輪播圖,管理員可以在後臺進行動態修改,或者添加的哦

  • 留言管理
    在這裡插入圖片描述


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 主用python做項目有一段時間,這次簡單總結學習下。為後面的項目編寫,進行一次基礎知識的查缺補漏、 1、變數名和數據類型 """ 變數名,只能由" 數字、大小寫字母、_ " 組成,且不能以數字開頭 """ # 整數 int # hashable,不可變對象 a = 5 # 浮點數 float # ...
  • Python有一個全球社區:https://pypi.org/,在這裡我們可以搜索任何主題的Python第三方庫。PyPI全稱是Python Package Index,指的是Python包的索引,它由PSF(Python Software Foundation)來維護,並且展示全球Python計算 ...
  • 聲明 本文章中所有內容僅供學習交流使用,不用於其他任何目的,不提供完整代碼,抓包內容、敏感網址、數據介面等均已做脫敏處理,嚴禁用於商業用途和非法用途,否則由此產生的一切後果均與作者無關! 本文章未經許可禁止轉載,禁止任何修改後二次傳播,擅自使用本文講解的技術而導致的任何意外,作者均不負責,若有侵權, ...
  • ElasticSearch 分詞器 作者: 博學谷狂野架構師 GitHub:GitHub地址 (有我精心準備的130本電子書PDF) 只分享乾貨、不吹水,讓我們一起加油!😄 概述 分詞器的主要作用將用戶輸入的一段文本,按照一定邏輯,分析成多個詞語的一種工具 什麼是分詞器 顧名思義,文本分析就是把全 ...
  • Scala學習總結 一、Scala簡介 Scala特點: Scala 是一門多範式 (multi-paradigm) 的編程語言 ,設計初衷是要集成面向對象編程和函數式編程的各種 特性。 Scala 是一門以 java 虛擬機 (JVM) 為運行環境的編程語言 ,Scala 源代碼(.scala)會 ...
  • 基於java的小區物業管理系統實現,智慧社區管理,住宅小區的日常管理,物業管理平臺,智慧小區管理平臺實現,科技園物業管理。業主管理平臺,小區業主信息,物業信息化管理平臺。 ...
  • 在學習jvm的時候許多人處於迷茫的狀態,對一些基礎的知識反而聽過就忘了,這篇筆記是我在學習jvm的時候隨手記的一些,適合已經學過或者瞭解過的小伙伴複習回顧一下,當然知識的覆蓋是沒有的,主要記錄了我覺得容易忘記或者記錯的知識點,這些有很多是基石知識,希望大家不要忘記,大家看到就當正好複習一下,對大家的 ...
  • 教程簡介 Tcl 是“工具控制語言(Tool Command Language)”的縮寫,其面向對象為otcl語言。Tk 是 Tcl“圖形工具箱”的擴展,它提供各種標準的 GUI 介面項,以利於迅速進行高級應用程式開發。 Tcl(最早稱為“工具命令語言”"Tool Command Language" ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...