黑馬旅遊網編寫練習(10)--用戶收藏線路的展示功能

黑馬旅遊網編寫練習(10)–用戶收藏線路的展示功能

分析
當用戶點擊我的收藏按鈕時,需要將用戶所收藏的所有線路進行展示;並且點擊響應的線路,就會跳轉到該線路對應的詳情頁面。
旅遊線路的分頁展示功能之前已經進行了實現,此處只需要仿照該方法,將查詢的表格修改爲tab_favorite即可;
跳轉到路線詳情頁面之前也進行過實現,此處也只需要仿照該處傳遞相應的參數即可。

首先完成’我的收藏’按鈕的跳轉功能

此處需要要展示的頁面是根據當前登錄的,所以首先查詢用戶是否登錄;若未登錄,則彈出未登陸提示,然後跳轉到登陸頁面;若用戶已登錄,則跳轉到favoriterank.html頁面。具體代碼如下:

    // 點擊我的收藏按鈕調用此函數
    function myFavorite() {
        // 訪問user/helloUser查詢用戶是否登錄
        $.post("user/helloUser",{},function (user) {
            if(user != null){
                // 用戶已經登陸
                // 傳遞到favoriterank.html頁面
                location.href="http://localhost/travel/favoriterank.html";
            }else{
                // 用戶尚未登陸
                alert("您尚未登錄,請先登錄");
                // 跳轉到登陸頁面
                location.href="http://localhost/travel/login.html";
            }
        });
    }

然後在favoriterank.html頁面向服務器發送請求進行查詢

請求查詢代碼如下,此處還未編寫查詢結果的展示代碼,結果的展示在查詢後臺代碼完成後再進行編寫。此處代碼目前爲:

    $(function () {

        // 調用load函數向服務器發送Ajax請求獲取頁面數據
        load();
    });

   function load(currentPage) {
       // 向服務器發送Ajax請求獲取頁面數據
       $.post("route/myFavorite",{currentPage:currentPage},function (data) {

       }
   }

接下來編寫後臺查詢代碼
由於收藏的路線和用戶相關,所以便將查詢我的收藏功能在UserServlet中進行實現。在其中添加一個myFavorite方法,該方法的主要內容如下:

    /**
     * 查詢用戶收藏的所有旅遊線路
     * @param request
     * @param response
     * @throws IOException
     */
    public void myFavorite(HttpServletRequest request, HttpServletResponse response) throws IOException{
        // 獲取當前登錄用戶
        User user = (User) request.getSession().getAttribute("user");
        if(user == null || "".equals(user)){
            // 用戶未登錄,請求錯誤
            System.out.println("用戶未登錄,收藏線路請求錯誤");
            return;
        }

        // 接收當前頁碼
        String currentPage_str = request.getParameter("currentPage");

        if(currentPage_str == null || currentPage_str.length() == 0){
            // currentPage爲空,設置默認值爲1,訪問首頁
            currentPage_str = "1";
        }
        int currentPage = Integer.parseInt(currentPage_str);

        // 調用favoriteService中方法查詢用戶收藏的所有旅遊線路,返回一個PageBean對象
        PageBean<Favorite> pageBean = favoriteService.myFavorite(user, currentPage);

        // 將pageBean對象序列化爲json並響應給客戶端
        responseJson(response,pageBean);

    }

service層首先需要調用favoriteDao中查詢總線路條數,計算總頁面數;然後調用favoriteDao層查詢該用戶所有收藏的線路信息,將其封裝到favorite對象中,得到一個list集合;然後需要遍歷集合,對每一個favorite對象,分別設置其路線的詳細信息,路線的信息首先要調用RouteDao中通過rid查詢tab_route表的方法,然後需要再調用favoriteDao查詢tab_favorite表中該路線被收藏次數。最後封裝pageBean對象返回。主要代碼如下:

    /**
     * 查詢用戶的所有收藏線路,響應pageBean對象給客戶端
     * @param user
     * @param currentPage
     * @return
     */
    @Override
    public PageBean<Favorite> myFavorite(User user, int currentPage, int pageSize) {
        System.out.println("FavoriteService收到的currentPage:"+ currentPage);
        // 定義PageBean對象
        PageBean<Favorite> pageBean = new PageBean<Favorite>();

        // 調用favoriteDao中查詢總線路條數
        int totalCount = favoriteDao.findTotalCountByUid(user.getUid());

        // 計算總頁面數
        int totalPage = (totalCount % pageSize == 0)?(totalCount / pageSize):(totalCount / pageSize + 1);

        // 計算開始查詢位置
        int start = (currentPage - 1) * pageSize;

        // 通過favoriteDao調用uid查詢tab_favorite表,返回list集合
        List<Favorite> list = favoriteDao.findByUid(user.getUid(),start,pageSize);

        // 遍歷集合;
        Route route;    // 定義旅遊路線對象
        for (Favorite favorite : list) {
            // 調用RouteDao中通過rid查詢tab_route表
            route = routeDao.findRouteByRid(favorite.getRid());

            // 調用favoriteDao查詢tab_favorite表中該路線被收藏次數
            route.setCount(favoriteDao.findByRid(favorite.getRid()));
            // 查詢結果賦值給route對象
            favorite.setRoute(route);
        }

        // 封裝pageBean對象
        pageBean.setTotalCount(totalCount);
        pageBean.setTotalPage(totalPage);
        pageBean.setCurrentPage(currentPage);
        pageBean.setPageSize(pageSize);
        pageBean.setList(list);
        return pageBean;
    }

dao層需要編寫的方法有兩個,一個是favoriteDao中查詢總線路條數方法;另一個是favoriteDao層查詢該用戶收藏的線路信息方法注意,並不是查詢所有,而是查詢指定數目的線路信息;這兩個方法內容分別如下所示:

    /**
     * 通過用戶uid查詢favorite表,將內容封裝到list集合中
     * @param uid
     * @return
     */
    @Override
    public List<Favorite> findByUid(int uid, int start, int pageSize) {

        String sql = "select * from tab_favorite where uid = ? limit ? ,? ";
        List<Favorite> list = template.query(sql, new BeanPropertyRowMapper<Favorite>(Favorite.class), uid,start,pageSize);
        return list;
    }

    /**
     * 查詢用戶共收藏線路條數
     * @param uid
     * @return
     */
    @Override
    public int findTotalCountByUid(int uid) {

        // 定義sql
        String sql = "select count(*) from tab_favorite where uid = ?";

        return template.queryForObject(sql,Integer.class,uid);
    }

至此,已經完成了後臺代碼的編寫。接下來需要在前臺將響應的json數據填充到相應的位置即可。

前臺收藏線路的填充

這部分工作與之前的黑馬旅遊網編寫練習(6)旅遊線路分頁展示功能基本一致,具體可參考該處文章;此處不再詳細講解;直接給出實現代碼,如下:

    function load(currentPage) {
       // 向服務器發送Ajax請求獲取頁面數據
       $.post("user/myFavorite",{currentPage:currentPage},function (pageBean) {
           var routes = pageBean.list;

           // 展示共多少頁,共多少條記錄
           $("#totalCount").html(pageBean.totalCount);
           $("#totalPage").html(pageBean.totalPage);

           // 展示路線
           var rou_str;
           for (var i = 0; i < routes.length; i++) {
                var li = ' <li>\n' +
                    '                        <span class="num one">'+(i+1)+'</span>\n' +
                    '                        <a href="route_detail.html"><img src="'+routes[i].route.rimage+'" alt=""></a>\n' +
                    '                        <h4><a href="route_detail.html">'+routes[i].route.rname+'</a></h4>\n' +
                    '                        <p>\n' +
                    '                            <b class="price">&yen;<span>'+routes[i].route.price+'</span>起</b>\n' +
                    '                            <span class="shouchang">已收藏'+routes[i].route.count+'次</span>\n' +
                    '                        </p>\n' +
                    '                    </li>';
                rou_str += li;
           }

           $("#route").html(rou_str);

           // 展示頁碼工具條,實現前5後4的效果
           var beforeNum = pageBean.currentPage - 1;
           if(beforeNum <= 0){
               beforeNum = 1;
           }
           // 拼接首頁和上一頁
            var lis = '<li οnclick="javascript:load(1)"><a href="javascript:void(0);">首頁</a></li>\n' +
                '                    <li οnclick="javascript:load('+beforeNum+')" class="threeword"><a href="javascript:void(0);">上一頁</a></li>';

           var beginNum = pageBean.currentPage - 5;
           var endNum = pageBean.currentPage + 4;

           if(beginNum <= 0){
               beginNum = 1;
               endNum = beginNum + 9;
           }
           if(endNum > pageBean.totalPage){
               endNum = pageBean.totalPage;
               beginNum = endNum - 9;
           }
           // 若總頁面不足10頁
           if(pageBean.totalPage < 10){
               beginNum = 1;
               endNum = pageBean.totalPage;
           }

           for (var i = beginNum; i <= endNum; i++) {
               var li = ' <li οnclick="javascript:load('+i+')"><a href="javascript:void(0);">'+i+'</a></li>';
               lis += li;
           }

           // 設置下一頁
           var nextNum = pageBean.currentPage + 1;
           if(nextNum > pageBean.totalPage){
               nextNum = pageBean.totalPage;
           }

           lis += ' <li οnclick="javascript:load('+nextNum+')" class="threeword"><a href="javascript:void(0);">下一頁</a></li>\n' +
               '                    <li οnclick="javascript:load('+pageBean.totalPage+')" class="threeword"><a href="javascript:void(0);">末頁</a></li>';

           $("#page").html(lis);

       });
   }

最後還差一個,點擊收藏線路的標題,或者圖片,能夠跳轉到該線路的詳情頁面
該功能也與黑馬旅遊網編寫練習(6)旅遊線路分頁展示功能中的查案詳情處基本相似;因爲此處也是要跳轉到route_detail.html頁面;所以需要傳遞的參數以及路徑都是一致的;分別爲圖片和標題添加如下所示的路徑即可。

    // 展示路線
   var rou_str;
   for (var i = 0; i < routes.length; i++) {
        var li = ' <li>\n' +
            '                        <span class="num one">'+(i+1)+'</span>\n' +
            '                        <a href="route_detail.html?rid='+routes[i].route.rid+'"><img src="'+routes[i].route.rimage+'" alt=""></a>\n' +
            '                        <h4><a  href="route_detail.html?rid='+routes[i].route.rid+'">'+routes[i].route.rname+'</a></h4>\n' +
            '                        <p>\n' +
            '                            <b class="price">&yen;<span>'+routes[i].route.price+'</span>起</b>\n' +
            '                            <span class="shouchang">已收藏'+routes[i].route.count+'次</span>\n' +
            '                        </p>\n' +
            '                    </li>';
        rou_str += li;
   }

至此,用戶的旅遊路線的收藏功能便已實現完畢。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章