• 潭州课堂25班:Ph201805201 django 项目 第二十三课 文章主页 轮播图前端实现 热门新闻推荐实现 详情页实现 (课堂笔记)


    前台代码 

    // 在static/js/news/index.js文件中
    
    $(function () {
      // 新闻列表功能
      let $newsLi = $(".news-nav ul li");
      let iPage = 1;  //默认第1页
      let iTotalPage = 1; //默认总页数为1
      let sCurrentTagId = 0; //默认分类标签为0
      let bIsLoadData = true;   // 是否正在向后台加载数据
    
      // 加载新闻列表信息
      fn_load_content();
    
      $newsLi.click(function () {
        // 点击分类标签,则为点击的标签加上一个class属性为active
        // 并移除其它兄弟元素上的,值为active的class属性
        $(this).addClass('active').siblings('li').removeClass('active');
        // 获取绑定在当前选中分类上的data-id属性值
        let sClickTagId = $(this).children('a').attr('data-id');
    
        if (sClickTagId !== sCurrentTagId) {
                sCurrentTagId = sClickTagId;  // 记录当前分类id
                // 重置分页参数
                iPage = 1;
                iTotalPage = 1;
                fn_load_content()
            }
      });
    
      //页面滚动加载相关
      $(window).scroll(function () {
        // 浏览器窗口高度
        let showHeight = $(window).height();
    
        // 整个网页的高度
        let pageHeight = $(document).height();
    
        // 页面可以滚动的距离
        let canScrollHeight = pageHeight - showHeight;
    
        // 页面滚动了多少,这个是随着页面滚动实时变化的
        let nowScroll = $(document).scrollTop();
    
        if ((canScrollHeight - nowScroll) < 100) {
          // 判断页数,去更新新闻数据
          if (!bIsLoadData) {
            bIsLoadData = true;
            // 如果当前页数据如果小于总页数,那么才去加载数据
            if (iPage < iTotalPage) {
              iPage += 1;
              $(".btn-more").remove();  // 删除标签
              // 去加载数据
              fn_load_content()
            } else {
              message.showInfo('已全部加载,没有更多内容!');
              $(".btn-more").remove();  // 删除标签
              $(".news-list").append($('<a href="javascript:void(0);" class="btn-more">已全部加载,没有更多内容!</a>'))
    
            }
          }
        }
      });
    
      // 新闻轮播图功能
      fn_load_banner();
      /*=== bannerStart ===*/
      let $banner = $('.banner');
      let $picLi = $(".banner .pic li");
      let $prev = $('.banner .prev');
      let $next = $('.banner .next');
      let $tabLi = $('.banner .tab li');
      let index = 0;
    
      // 小原点
      $tabLi.click(function () {
        index = $(this).index();
        $(this).addClass('active').siblings('li').removeClass('active');
        $picLi.eq(index).fadeIn(1500).siblings('li').fadeOut(1500);
      });
      // 点击切换上一张
      $prev.click(function () {
        index--;
        if (index < 0) {
          index = $tabLi.length - 1
        }
        $tabLi.eq(index).addClass('active').siblings('li').removeClass('active');
        $picLi.eq(index).fadeIn(1500).siblings('li').fadeOut(1500);
      }).mousedown(function () {
        return false
      });
    
      $next.click(function () {
        auto();
      }).mousedown(function () {
        return false
      });
      //  图片向前滑动
      function auto() {
        index++;
        index %= $tabLi.length;
        $tabLi.eq(index).addClass('active').siblings('li').removeClass('active');
        $picLi.eq(index).fadeIn(3000).siblings('li').fadeOut(3000);
      }
    
      // 定时器
      let timer = setInterval(auto, 2000);
      $banner.hover(function () {
        clearInterval(timer)
      }, function () {
        auto();
      });
    
      /*=== bannerEnd ===*/
    
    
      // 定义向后端获取新闻列表数据的请求
      function fn_load_content() {
        // let sCurrentTagId = $('.active a').attr('data-id');
    
        // 创建请求参数
        let sDataParams = {
          "tag_id": sCurrentTagId,
          "page": iPage
        };
    
        // 创建ajax请求
        $.ajax({
          // 请求地址
          url: "/news/",  // url尾部需要添加/
          // 请求方式
          type: "GET",
          data: sDataParams,
          // 响应数据的格式(后端返回给前端的格式)
          dataType: "json",
        })
          .done(function (res) {
            if (res.errno === "0") {
              iTotalPage = res.data.total_pages;  // 后端传过来的总页数
              if (iPage === 1) {
                $(".news-list").html("")
              }
    
              res.data.news.forEach(function (one_news) {
                let content = `
                  <li class="news-item">
                     <a href="https://www.shiguangkey.com/course/2432" class="news-thumbnail" target="_blank">
                        <img src="${one_news.image_url}" alt="${one_news.title}" title="${one_news.title}">
                     </a>
                     <div class="news-content">
                        <h4 class="news-title"><a href="#">${one_news.title}</a></h4>
                        <p class="news-details">${one_news.digest}</p>
                        <div class="news-other">
                          <span class="news-type">${one_news.tag_name}</span>
                          <span class="news-time">${one_news.update_time}</span>
                          <span class="news-author">${one_news.author}</span>
                        </div>
                     </div>
                  </li>`;
                $(".news-list").append(content)
              });
    
              $(".news-list").append($('<a href="javascript:void(0);" class="btn-more">滚动加载更多</a>'));
              // 数据加载完毕,设置正在加载数据的变量为false,表示当前没有在加载数据
              bIsLoadData = false;
    
            } else {
              // 登录失败,打印错误信息
              message.showError(res.errmsg);
            }
          })
          .fail(function () {
            message.showError('服务器超时,请重试!');
          });
      }
    
      // 轮播图
      function fn_load_banner() {
        $.ajax({
          // 请求地址
          url: "/news/banners/",  // url尾部需要添加/
          // 请求方式
          type: "GET",
          async: false
        })
          .done(function (res) {
            if (res.errno === "0") {
              let content = ``;
              let tab_content = ``;
              res.data.banners.forEach(function (one_banner, index) {
                if (index === 0){
                  content = `
                    <li style="display:block;"><a href="javascript:void(0);">
                     <img src="${one_banner.image_url}" alt="${one_banner.news_title}"></a></li>
                  `;
                  tab_content = `<li class="active"></li>`;
                } else {
                  content = `
                  <li><a href="javascript:void(0);"><img src="${one_banner.image_url}" alt="${one_banner.news_title}"></a></li>
                  `;
                  tab_content = `<li></li>`;
                }
    
                $(".pic").append(content);
                $(".tab").append(tab_content)
              });
    
            } else {
              // 登录失败,打印错误信息
              message.showError(res.errmsg);
            }
          })
          .fail(function () {
            message.showError('服务器超时,请重试!');
          });
      }
    
    });
    

      注释静态测试代码:

    热门新闻推荐功能

    1.分析

    请求方法GET

    url定义/

    请求参数:前端无需传入参数

    热门新闻推荐功能直接通过模版渲染的方式来实现。

    对热门新闻的数据库优化下,对优先级进行限制

     

     导入测试数据库数据

     

     后台代码: 与 index 视图写在一起,认浏览器一打开 ,就进行渲染

    代码说明 :

    # 关联到 news 表,只查字段:
    # 没有逻辑删除的,根据优先级,点击量排序, - 号:倒序,从大到小,
    # [0:3]

    在news目录下constants.py中定义如下常量:

     显示热门新闻条数

    SHOW_HOTNEWS_COUNT = 3

    在index.html 文件中 ,接收数据库数据,

    新闻详情页功能

    1.分析

    业务处理流程:

    • 判断前端传的新闻id是否为空,是否为整数、是否不存在

    请求方法GET

    url定义'/news/<int:news_id>'

    请求参数:url路径参数

    参数类型前端是否必须传描述
    news_id 整数 新闻id

    新闻详情页直接通过模版渲染的方式来实现。

     

     在news目录下的views.py文件中创建如下类视图:

    更改 html 文件,对取出贩数据进行渲染,

    原文件:

    更改填充数据:

    
    
  • 相关阅读:
    题解 P2280 【[HNOI2003]激光炸弹】
    线段树求逆序对
    题解 P3378 【【模板】堆】
    动态规划-最大算式 蓝桥杯ALGO-116
    动态规划-树形动态规划-结点选择
    Trie树(字典树)-题解 P2580 【于是他错误的点名开始了】
    清北学堂-DAY2-数论专题-中国剩余定理(CRT)
    听课笔记--DP--Authentication Failed
    听课笔记--DP--最大子矩阵和
    多媒体基础
  • 原文地址:https://www.cnblogs.com/gdwz922/p/10159748.html
Copyright © 2020-2023  润新知