前台代码

  1. // 在static/js/news/index.js文件中
  2.  
  3. $(function () {
  4. // 新闻列表功能
  5. let $newsLi = $(".news-nav ul li");
  6. let iPage = 1; //默认第1页
  7. let iTotalPage = 1; //默认总页数为1
  8. let sCurrentTagId = 0; //默认分类标签为0
  9. let bIsLoadData = true; // 是否正在向后台加载数据
  10.  
  11. // 加载新闻列表信息
  12. fn_load_content();
  13.  
  14. $newsLi.click(function () {
  15. // 点击分类标签,则为点击的标签加上一个class属性为active
  16. // 并移除其它兄弟元素上的,值为active的class属性
  17. $(this).addClass('active').siblings('li').removeClass('active');
  18. // 获取绑定在当前选中分类上的data-id属性值
  19. let sClickTagId = $(this).children('a').attr('data-id');
  20.  
  21. if (sClickTagId !== sCurrentTagId) {
  22. sCurrentTagId = sClickTagId; // 记录当前分类id
  23. // 重置分页参数
  24. iPage = 1;
  25. iTotalPage = 1;
  26. fn_load_content()
  27. }
  28. });
  29.  
  30. //页面滚动加载相关
  31. $(window).scroll(function () {
  32. // 浏览器窗口高度
  33. let showHeight = $(window).height();
  34.  
  35. // 整个网页的高度
  36. let pageHeight = $(document).height();
  37.  
  38. // 页面可以滚动的距离
  39. let canScrollHeight = pageHeight - showHeight;
  40.  
  41. // 页面滚动了多少,这个是随着页面滚动实时变化的
  42. let nowScroll = $(document).scrollTop();
  43.  
  44. if ((canScrollHeight - nowScroll) < 100) {
  45. // 判断页数,去更新新闻数据
  46. if (!bIsLoadData) {
  47. bIsLoadData = true;
  48. // 如果当前页数据如果小于总页数,那么才去加载数据
  49. if (iPage < iTotalPage) {
  50. iPage += 1;
  51. $(".btn-more").remove(); // 删除标签
  52. // 去加载数据
  53. fn_load_content()
  54. } else {
  55. message.showInfo('已全部加载,没有更多内容!');
  56. $(".btn-more").remove(); // 删除标签
  57. $(".news-list").append($('<a href="javascript:void(0);" class="btn-more">已全部加载,没有更多内容!</a>'))
  58.  
  59. }
  60. }
  61. }
  62. });
  63.  
  64. // 新闻轮播图功能
  65. fn_load_banner();
  66. /*=== bannerStart ===*/
  67. let $banner = $('.banner');
  68. let $picLi = $(".banner .pic li");
  69. let $prev = $('.banner .prev');
  70. let $next = $('.banner .next');
  71. let $tabLi = $('.banner .tab li');
  72. let index = 0;
  73.  
  74. // 小原点
  75. $tabLi.click(function () {
  76. index = $(this).index();
  77. $(this).addClass('active').siblings('li').removeClass('active');
  78. $picLi.eq(index).fadeIn(1500).siblings('li').fadeOut(1500);
  79. });
  80. // 点击切换上一张
  81. $prev.click(function () {
  82. index--;
  83. if (index < 0) {
  84. index = $tabLi.length - 1
  85. }
  86. $tabLi.eq(index).addClass('active').siblings('li').removeClass('active');
  87. $picLi.eq(index).fadeIn(1500).siblings('li').fadeOut(1500);
  88. }).mousedown(function () {
  89. return false
  90. });
  91.  
  92. $next.click(function () {
  93. auto();
  94. }).mousedown(function () {
  95. return false
  96. });
  97. // 图片向前滑动
  98. function auto() {
  99. index++;
  100. index %= $tabLi.length;
  101. $tabLi.eq(index).addClass('active').siblings('li').removeClass('active');
  102. $picLi.eq(index).fadeIn(3000).siblings('li').fadeOut(3000);
  103. }
  104.  
  105. // 定时器
  106. let timer = setInterval(auto, 2000);
  107. $banner.hover(function () {
  108. clearInterval(timer)
  109. }, function () {
  110. auto();
  111. });
  112.  
  113. /*=== bannerEnd ===*/
  114.  
  115. // 定义向后端获取新闻列表数据的请求
  116. function fn_load_content() {
  117. // let sCurrentTagId = $('.active a').attr('data-id');
  118.  
  119. // 创建请求参数
  120. let sDataParams = {
  121. "tag_id": sCurrentTagId,
  122. "page": iPage
  123. };
  124.  
  125. // 创建ajax请求
  126. $.ajax({
  127. // 请求地址
  128. url: "/news/", // url尾部需要添加/
  129. // 请求方式
  130. type: "GET",
  131. data: sDataParams,
  132. // 响应数据的格式(后端返回给前端的格式)
  133. dataType: "json",
  134. })
  135. .done(function (res) {
  136. if (res.errno === "0") {
  137. iTotalPage = res.data.total_pages; // 后端传过来的总页数
  138. if (iPage === 1) {
  139. $(".news-list").html("")
  140. }
  141.  
  142. res.data.news.forEach(function (one_news) {
  143. let content = `
  144. <li class="news-item">
  145. <a href="https://www.shiguangkey.com/course/2432" class="news-thumbnail" target="_blank">
  146. <img src="${one_news.image_url}" alt="${one_news.title}" title="${one_news.title}">
  147. </a>
  148. <div class="news-content">
  149. <h4 class="news-title"><a href="#">${one_news.title}</a></h4>
  150. <p class="news-details">${one_news.digest}</p>
  151. <div class="news-other">
  152. <span class="news-type">${one_news.tag_name}</span>
  153. <span class="news-time">${one_news.update_time}</span>
  154. <span class="news-author">${one_news.author}</span>
  155. </div>
  156. </div>
  157. </li>`;
  158. $(".news-list").append(content)
  159. });
  160.  
  161. $(".news-list").append($('<a href="javascript:void(0);" class="btn-more">滚动加载更多</a>'));
  162. // 数据加载完毕,设置正在加载数据的变量为false,表示当前没有在加载数据
  163. bIsLoadData = false;
  164.  
  165. } else {
  166. // 登录失败,打印错误信息
  167. message.showError(res.errmsg);
  168. }
  169. })
  170. .fail(function () {
  171. message.showError('服务器超时,请重试!');
  172. });
  173. }
  174.  
  175. // 轮播图
  176. function fn_load_banner() {
  177. $.ajax({
  178. // 请求地址
  179. url: "/news/banners/", // url尾部需要添加/
  180. // 请求方式
  181. type: "GET",
  182. async: false
  183. })
  184. .done(function (res) {
  185. if (res.errno === "0") {
  186. let content = ``;
  187. let tab_content = ``;
  188. res.data.banners.forEach(function (one_banner, index) {
  189. if (index === 0){
  190. content = `
  191. <li style="display:block;"><a href="javascript:void(0);">
  192. <img src="${one_banner.image_url}" alt="${one_banner.news_title}"></a></li>
  193. `;
  194. tab_content = `<li class="active"></li>`;
  195. } else {
  196. content = `
  197. <li><a href="javascript:void(0);"><img src="${one_banner.image_url}" alt="${one_banner.news_title}"></a></li>
  198. `;
  199. tab_content = `<li></li>`;
  200. }
  201.  
  202. $(".pic").append(content);
  203. $(".tab").append(tab_content)
  204. });
  205.  
  206. } else {
  207. // 登录失败,打印错误信息
  208. message.showError(res.errmsg);
  209. }
  210. })
  211. .fail(function () {
  212. message.showError('服务器超时,请重试!');
  213. });
  214. }
  215.  
  216. });

  注释静态测试代码:

热门新闻推荐功能

1.分析

请求方法GET

url定义/

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

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

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

导入测试数据库数据

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

代码说明 :

  1. # 关联到 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 文件,对取出贩数据进行渲染,

原文件:

更改填充数据:

  1.  

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

  1. 潭州课堂25班:Ph201805201 django 项目 第二十一课 文章主页 新闻列表页面功能 (课堂笔记)

    新闻列表页功能 1.分析 业务处理流程: 判断前端传的标签分类id是否为空,是否为整数.是否超过范围 判断前端传的当前文章页数是否为空,是否为整数.是否超过范围 请求方法:GET url定义:/new ...

  2. 潭州课堂25班:Ph201805201 django 项目 第二十七课 docker简介,配置文件 (课堂笔记)

    新闻搜索功能实现 一.docker介绍 1.什么是docker? 使用容器让创建.部署.运行应用程序更简单的一个工具 让应用所需的库和依赖环境打包 有一点点像虚拟机 2.为什么使用docker? 3. ...

  3. 潭州课堂25班:Ph201805201 django 项目 第十三课 短信验证码后台的实现 (课堂笔记)

    d 发送短信验证码之前,后台要得到三个参数 : 1,用户手机吗,, 2,用户输入的图片验证文本, 3,前台的 uuid , 在60秒内是否有发送短信的记录 只有用户输入的手机号,文本信息与 uudi ...

  4. 潭州课堂25班:Ph201805201 django 项目 第二十课 数据库分析设计图 (课堂笔记)

    https://www.dbdesigner.net/

  5. 潭州课堂25班:Ph201805201 django 项目 第五课 静态页面转为模板 (课堂笔记)

    一.分析静态页面   1.静态vs动态 条目 静态页面 动态页面 网站内容 固定不变 经常变动 浏览器加载速度 更快(无需向服务器发起请求) 更慢 改变网站内容 很难(修改或者创建新的html页面) ...

  6. 潭州课堂25班:Ph201805201 django 项目 第二十八课 新闻elasticsearch搜索前后功台能实现 (课堂笔记)

    后端功能实现 文件,类,字段,命名不要改动, 在apps/news/search_indexes.py中创建如下类:(名称固定为search_indexes.py) # -*-# -*- coding ...

  7. 潭州课堂25班:Ph201805201 django 项目 第十课 自定义错误码,完成图片验证码,用户是否被注册功能 (课堂笔记)

    把 视图传到前台的  JsonResponse(data=data) 先进行处理,之后再传到前台, 处理:引用自定义错误代码,把错误代码返回给前台,前台根据错误代码中文提示 class Code: O ...

  8. 潭州课堂25班:Ph201805201 django 项目 第七课 用户模型设计 (课堂笔记

    在 user 的应用中的 models.py: 导入 dango 自带的用户模型 from django.contrib.auth.models import AbstractUser,UserMan ...

  9. 潭州课堂25班:Ph201805201 django 项目 第四课 项目搭建 课堂笔记)

    创建一用户,授予对这个 myblog 库的所有表的权限(.*),在任何 ip 地址中访问(@“%”), 刷新: 退出,用新创建的用户登录,并进入这个库, 在昨天创建的项目中,配置文件中 为了数据库的案 ...

随机推荐

  1. javascript 自动填充功能

    javascript 自动填充功能 javascript: (function(){ $("#zipcode").val("zip");$("#pho ...

  2. python 全栈开发,Day71(模型层-单表操作)

    昨日内容回顾 1. {% include '' %} 2. extend base.html: <html> ..... ..... ..... {% block content%} {% ...

  3. 论文阅读笔记二十五:Spatial Pyramid Pooling in Deep Convolutional Networks for Visual Recognition(SPPNet CVPR2014)

    论文源址:https://arxiv.org/abs/1406.4729 tensorflow相关代码:https://github.com/peace195/sppnet 摘要 深度卷积网络需要输入 ...

  4. 异常:Keyword not supported: 'data source'的解决办法

    将连接字符串中的&quot换为“'”,一个单引号即可. 详细解释:https://blogs.msdn.microsoft.com/rickandy/2008/12/09/explicit-c ...

  5. Beyond-Compare 4 -linux 破解

    key失效了可以去https://www.serials.be/serial/Beyond_Compare_4_Linux_68803632.html生成 Crack-Beyond-Compare-l ...

  6. 647. Palindromic Substrings

    Given a string, your task is to count how many palindromic substrings in this string. The substrings ...

  7. dubbo的工作原理

    dubbo工作原理 第一层:service层,接口层,给服务提供者和消费者来实现的 第二层:config层,配置层,主要是对dubbo进行各种配置的 第三层:proxy层,服务代理层,透明生成客户端的 ...

  8. [转]笔记本怎么设置WIfi热点

    https://jingyan.baidu.com/article/335530da4f774019cb41c3eb.html 随着手机的发展,流量的消耗也是大大地增加.虽然很多手机支持wifi,但是 ...

  9. 【AtCoder】ExaWizards 2019

    ExaWizards 2019 C - Snuke the Wizard 发现符文的相对位置不变,直接二分某个位置是否到达最左或最右来计算 #include <bits/stdc++.h> ...

  10. ios线程和GCD和队列同步异步的关系

    1.什么是进程? 进程是指在系统中正在运行的一个应用程序.比如同时打开QQ.Xcode,系统就会分别启动2个进程.截图 2.什么是线程? 1).一个进程要想执行任务,必须得有线程(每一个进程至少要有一 ...