美文网首页
2020-06-23--flask项目06--新闻类型栏,新闻信

2020-06-23--flask项目06--新闻类型栏,新闻信

作者: program_white | 来源:发表于2020-06-23 19:40 被阅读0次
  • 新闻类型栏

新闻类型栏

也就是:

实现这块内容采用类似于django中的方法。
1.后端代码:
在index/views.py/index()中

    '''选则栏'''
    category = Category.query.all()        #查询所有的选项
获取后加到data中
返回到前端页面

2.前端显示

<ul class="menu fl">
         {% for cate in data.category %}
               <li class="{% if loop.index == 1 %}active{% endif %}" data-cid="{{ cate.id }}"><a href="javascript:;">{{ cate['name'] }}</a></li>
         {% endfor %}
</ul>

分析:在后端获取所有的选项数据,返回到前端,在前端for循环出来。
并且还用添加

  • data_cid属性值:category.id
  • 默认的class值:active(使用loop.index判断是否等于1,就显示)

在之前的django中使用的是前端点击时,后端根据点击的信息查询后,将数据和选项再次返回到前端。进行判断class值。

这里使用js处理class值的变换,在加载index页面的时候,会加载两个js文件:main.js和index.js

index.js:

也就是说当进入index页面时,这个函数就会调用。默认显示第一页
获取当前的新闻类型的id值,如果不一样的话更新该值,重新调用更新新闻的函数。

新闻列表的显示

在之前的django中显示内容就是在后端查询好后发送到前端,如果有选项的点击就在该选项上加上链接,以get方式请求后端,后端返回相应的信息,页面也会刷新。
而这个采用ajax的方式,不再刷新页面,有了更好的用户体验。

具体的流程:

在上一步中每当用户点击了一个不同的li选项,就调用获取新闻的函数updateNewsData(),那么在index.js中编写该函数:用于根据用户点击的新闻类型发送ajax请求到后端获取数据。

function updateNewsData() {
    // TODO 更新新闻数据
    var params = {
        'page':1,
        'per_page':10,
        'cid':currentCid
    }
    $.get('/newslist',params,function (resp) {

        if (resp){
            //清空原来数据
            $(".list_con").html("")
            //显示数据
            for(var i=0;i < resp.news_list.length;i++){
                //获取单个新闻信息
                var news = resp.news_list[i]
                //拼接新闻内容
                var content = '<li>'
                content+='<a href="#" class="news_pic fl"><img src="' + news.index_image_url + '?imageView2/1/w/170/h/170"></a>'
                content+='<a href="#" class="news_title fl">'+news.title+'</a>'
                content+='<a href="#" class="news_detail fl">'+news.digest+'</a>\n'
                content+='<div class="author_info fl">\n' +
                    '                    <div class="author fl">\n' +
                    // '                        <img src="../../static/news/images/person.png" alt="author">\n' +
                    '                        <a href="#">来源:'+news.source+'</a>\n' +
                    '                    </div>\n' +
                    '                    <div class="time fl">'+news.create_time+'</div>\n' +
                    '                </div>'
                content+='</li>'
                $('.list_con').append(content)
            }
        }
    })
}

在index/views.py下,创建新的路由和函数与上边的请求地址一致

#新闻列表
@index_blue.route('/newslist')
def get_news_list():
    # 1.获取参数
    arg_list = request.args
    page = arg_list.get('page',1)       #page参数:第几页,默认为1
    per_page = arg_list.get('per_page',constants.HOME_PAGE_MAX_NEWS)  #一页多少数据

    # cid:新闻类别的编号
    category_id = arg_list.get('cid',1)


    # 2.校验参数
    try:
        page = int(page)
        per_page = int(per_page)
    except Exception as e:
        current_app.logger.error(e)
        return jsonify(errno = RET.PARAMERR,errmsg = '参数错误')

    # 3.查询数据
    filters = []
    if category_id != "1":              #id为1时,显示的时所有数据,即filter=[]
        filters.append(News.category_id == category_id)

    try:
        # 查询所有的数据并分页,返回一个paginate对象
        paginate = News.query.filter(*filters).order_by(News.create_time.desc()).paginate(page,per_page,False)
        # 通过paginate对象获取查询的数据
        items = paginate.items
        # 获取总页数
        total_page = paginate.pages
        # 当前页
        current_page = paginate.page
    except Exception as e:

        current_app.logger.error(e)
        return jsonify(errno=RET.PARAMERR, errmsg='数据查询失败')
    news_list = []
    for news in items:
        news_list.append(news.to_basic_dict())

    return jsonify(errno=RET.OK, errmsg='OK',
                   #数据
                   total_page=total_page,      #总页数
                   current_page=current_page,    #当前页
                   news_list=news_list,         #新闻列表
                   cid = category_id        #新闻类型id
                   )

在index.html中删除静态的新闻数据:
分析:

  • 当用户第一次访问index时,触发index.js,直接调用updateNewsData(),这时默认显示第一页的数据,并且新闻类型也为默认为id为1的“最新”。

  • 以get方式发起ajax请求给后端。
    参数:page:显示第几页的内容,per_page:每页数据的个数,cid:当前的新闻类型

  • 在后端获取这些个参数,默认为1

  • 判断传过来的新闻类型的id是否为1,如果不为1,将这个id值加到一个filters列表中

  • 在数据库中根据上一步获取的列表filters进行获取数据,并根据创建时间排序,转化为paginate对象(将page和per_page传进去)。

  • 通过paginate对象获取要显示数据,获取总页数,获取当前页

  • 将上一步获取到的数据遍历转换为字典类型,加到新的列表中。

  • 以jsonify的形式返回

    • errno
    • errmsg
    • 数据
  • 在回调函数的参数resp就是后端返回的数据
    首先清空显示新闻列表ul的数据,遍历这个resp.news_list中的数据,在循环中获取单个news对象,使用js拼接html代码,加上传过来的数据库中的数据,最后将整个变量content加到index.html中的显示新闻信息的ul中

第一次访问:



点击股市:


相关文章

网友评论

      本文标题:2020-06-23--flask项目06--新闻类型栏,新闻信

      本文链接:https://www.haomeiwen.com/subject/leehfktx.html