03: 将帖子展示到页面、点赞

1.1 将帖子展示到页面效果图

    功能1:从后台获取指定页数的帖子,根据是否置顶推送到对应的列表
    功能2:调用create_post_list,将已分类的帖子展示到页面
    功能3:调用create_paginator生成分页标签
    功能4:点赞
    功能5:生成分页标签

1.2 各功能点code

  1、功能1:初始化函数调用view_posts函数,展示帖子

<div class="left_container fl">
    <div class="post_list">
        <div class="normal_posts">
            <!-- 生成一个完整帖子:开头 -->
            <div class="post_container clearfix" post_id="18">
                <div class="row_container clearfix">
                    <div class="left_container fl">
                        <div class="post_content">文能一剪梅,武能嘿嘿嘿</div>
                        <div class="post_bar">
                            <a href="javascript:void(0);" class="like_btn" onclick="like(this,18)" like_count="1">已赞(1)</a>
                            <a href="javascript:void(0);" class="show_comments_btn" onclick="show_comments(this,18)">评(0)</a>
                            <span>tom</span>
                            <i>在 2018-01-07 09:51:29 发布</i>
                        </div>
                    </div>
                    <div class="right_container fl"><img src=""></div>
                </div>
                <div class="comment_container hide"><div class="comment_text_container">
                        <!-- 生成一个textarea发布框放到这里 -->
                </div>
                    <div class="comment_content_container">
                        <!-- 用户评论会放到这个div中 -->
                    </div>
                </div>
            </div>
            <!-- 生成一个完整帖子:结尾 -->

            <div class="post_container clearfix" post_id="17">
                <div class="row_container clearfix">
                    <div class="left_container fl">
                        <div class="post_content">段子手祖师爷</div>
                        <div class="post_bar">
                            <a href="javascript:void(0);" class="like_btn" onclick="like(this,17)" like_count="1">已赞(1)</a>
                            <a href="javascript:void(0);" class="show_comments_btn" onclick="show_comments(this,17)">评(0)</a>
                            <span>tom</span>
                            <i>在 2018-01-07 09:50:20 发布</i>
                        </div>
                    </div>
                    <div class="right_container fl">
                        <img src="/static/img/upload/94b6296a408cf6a270d1a873ee877763.jpg">
                    </div>
                </div>
                <div class="comment_container hide">
                    <div class="comment_text_container">

                    </div>
                    <div class="comment_content_container">

                    </div>
                </div>
            </div>
        </div>
    </div>
    <div class="paginator"><a class="current" href="javascript:void(0);" onclick="view_posts(this,1,1)">1</a></div>
</div>

生成展示帖子的HTML文件

<script>
    /* 初始化函数 */
    $(function () {
        /* 显示首页 */
        view_posts($(".nav:first-child")[0],0,1);
        // ".nav:first-child" 默认选中的是展示帖子分类中“全部”那个a标签
        //0 代表“全部”那个分类对应的分类id
        //1 默认显示第1页
    });
</script>

index.html 中js初始化函数

/*
 * 功能1:从后台获取指定页数的帖子,根据是否置顶推送到对应的列表
 * 功能2:调用create_post_list,将已分类的帖子展示到页面
 * 功能3:调用create_paginator生成分页标签
 */
function view_posts(ele, catalog, page) {
    $(ele).siblings(‘a‘).removeClass("current");
    $(ele).addClass("current");
    $("div.paginator").children().remove();
    $.get({
        url:"/app01/posts/",
        data:{"catalog":catalog, "page":page},
        dataType:"json",
        success:function (response) {
            if(response.status==‘ok‘){
                // 服务器返回数据
                // console.log(response);
                var posts = response[‘data‘][‘posts‘];
                var current_page = response[‘data‘][‘current_page‘];
                var page_count = response[‘data‘][‘page_count‘];

                if(posts.length>0){
                    // 有帖子数据
                    // 区分置顶和普通帖子
                    var top_post_list = [];
                    var normal_post_list = [];
                    for(var key in posts){
                        var post = posts[key];
                        if(post.top){
                            // 帖子有置顶属性
                            if(post.catalog_id==response[‘data‘][‘current_catalog‘]){
                                // 帖子是当前类别
                                post.content = ‘【置顶】‘+ post.content;
                                top_post_list.push(post);
                            }else{
                                // 推入非置顶帖子
                                normal_post_list.push(post);
                            }
                        }else{
                            // 非置顶帖子
                            normal_post_list.push(post);
                        }
                    }

                    // 分好之后交给对应的函数处理
                    $("div.post_list").html("");
                    create_post_list(top_post_list,"top_posts");
                    create_post_list(normal_post_list,"normal_posts");
                    create_paginator(page_count, current_page);
                }else {
                    // 没有帖子
                    $("div.post_list").text("还没有帖子喲,要不你发一个:)");
                }
            }
        }
    });
}

view_posts(js) 函数获取帖子、并根据指定与否分类到列表中,调用下面两个函数

/* 将view_posts中分好类的帖子展示到页面 */
function create_post_list(posts, cls) {
    if(posts.length>0){
        var big_div = document.createElement(‘div‘);
        big_div.className = cls;
        for(var i=0;i<posts.length;i++){
            var post_div = document.createElement(‘div‘); // 包裹着整个帖子的div
            post_div.className="post_container clearfix";
            post_div.setAttribute("post_id", posts[i].id);
            var left_div = document.createElement(‘div‘);
            left_div.className="left_container fl";
            var right_div = document.createElement(‘div‘);
            right_div.className="right_container fl";
            var content_div = document.createElement(‘div‘);
            content_div.className="post_content";
            var bar_div = document.createElement(‘div‘);
            bar_div.className="post_bar";
            var comment_div = document.createElement(‘div‘);
            comment_div.className="comment_container hide";

            content_div.innerText = posts[i].content;
            var like = posts[i].like?"已赞":"赞";
            var like_a = document.createElement(‘a‘);
            var comment_a = document.createElement(‘a‘);
            var displayname_span = document.createElement("span");
            var create_i = document.createElement(‘i‘);
            like_a.href = comment_a.href = "javascript:void(0);";
            like_a.className="like_btn";
            like_a.setAttribute("onclick", "like(this," + posts[i].id + ")");
            like_a.setAttribute("like_count", posts[i].like_count);
            like_a.innerText = like+ ‘(‘ + posts[i].like_count + ‘)‘;
            comment_a.className="show_comments_btn";
            comment_a.setAttribute("onclick", "show_comments(this,"+ posts[i].id +")");
            comment_a.innerText = ‘评(‘+posts[i].comment_count+‘)‘;
            displayname_span.innerText = posts[i].user__display_name;
            create_i.innerText=‘在 ‘+posts[i].create_on+‘ 发布‘;
            bar_div.appendChild(like_a);
            bar_div.appendChild(comment_a);
            bar_div.appendChild(displayname_span);
            bar_div.appendChild(create_i);

            // comment_div.innerText = "这里是评论";
            var comment_text_container = document.createElement(‘div‘);
            var comment_content_container = document.createElement(‘div‘);
            comment_text_container.className="comment_text_container";
            comment_content_container.className="comment_content_container";
            comment_div.appendChild(comment_text_container);
            comment_div.appendChild(comment_content_container);

            left_div.appendChild(content_div);
            left_div.appendChild(bar_div);

            if(posts[i].hasOwnProperty("img_link")){
                var img = document.createElement(‘img‘);
                img.src = posts[i].img_link;
                right_div.appendChild(img);
            }

            var row_container = document.createElement(‘div‘);
            row_container.className="row_container clearfix";
            row_container.appendChild(left_div);
            row_container.appendChild(right_div);

            post_div.appendChild(row_container);
            post_div.appendChild(comment_div);

            big_div.appendChild(post_div);
        }
        $("div.post_list").append(big_div);
    }
}

create_post_list(js) 函数将view_posts中分好类的帖子展示到页面

/* 分页 */
function create_paginator(total, current) {
    if(total>0){
        var paginator_container = $("div.paginator");
        paginator_container.children().remove();
        for(var i=1;i<=total;i++){
            var a = document.createElement(‘a‘);
            a.innerText=i;
            if(i==current) a.className="current";
            a.href="javascript:void(0);";
            var cid = $("div.nav a.current").attr("cid");
            a.setAttribute("onclick", "view_posts(this,"+cid+","+i+")");
            paginator_container.append(a);
        }
    }
}

create_paginator(js) 函数生成分页标签

# 根据用户提交的类别catalog来读取帖子
def posts(request):
    if request.method == ‘GET‘:
        is_login = request.session.get("is_login", False)
        catalog_id = int(request.GET.get("catalog", 0))  # 如果URL参数中没有catalog,则为0,代表全部的意思
        page = int(request.GET.get("page", 1))  # 如果URL参数中没有page,视为从第一页开始取
        if page <= 0:
            # 如果page是0或者负数,则视为第一页
            page = 1
        start = (page - 1) * settings.POSTS_PARAMETERS.get(‘LIMIT‘, 10)  # 根据page和LIMIT获得起始位
        end = page * settings.POSTS_PARAMETERS.get(‘LIMIT‘, 10)  # 获得终结位
        if catalog_id == 0:
            post_list = Post.objects.all().order_by("-id")[start:end]  # 获取全部帖子,并逆序排序
            posts_count = Post.objects.all().count()
        else:
            # post_list = Post.objects.filter(catalog_id=catalog_id).all().order_by("-id")[start:end]
            post_list = Catalog.objects.filter(id=catalog_id, visible=True).first()                             .posts.all().order_by("-id")[start:end]
            posts_count = Catalog.objects.filter(id=catalog_id, visible=True).first()                 .posts.all().count()
        page_count, mod = divmod(posts_count, 5)
        if mod > 0:
            page_count += 1
        ret = {}
        ret[‘status‘] = ‘ok‘
        ret[‘data‘] = {}
        ret[‘data‘][‘page_count‘] = page_count
        ret[‘data‘][‘current_page‘] = page if page <= page_count else "超出范围了!"
        ret[‘data‘][‘current_catalog‘] = catalog_id
        ret[‘data‘][‘posts‘] = list(post_list.values("id",
                                                     "user__display_name",
                                                     "catalog_id",
                                                     "catalog__name",
                                                     "create_on",
                                                     "content",
                                                     "top",
                                                     "top_time",
                                                     "like_count",
                                                     "comment_count",
                                                     "img_link"))

        # 判断当前用户是否赞
        if is_login:
            current_user = request.session.get("current_user")
            current_user_likes = Like.objects.filter(user_id=current_user[‘id‘]).values_list("post_id", flat=True)
        else:
            current_user_likes = []
        for post in ret[‘data‘][‘posts‘]:
            post[‘like‘] = post[‘id‘] in current_user_likes

        return HttpResponse(json.dumps(ret, cls=DateTimeJSONEncoder))

views.py 根据用户提交的类别catalog来读取帖子

  2、功能2:点赞

/* 点赞 */
function like(ele, post_id) {
    if(!is_login()){
        show_login_reg_frm();
        return false;
    }
    $.get({
        url:"/app01/like_post/",
        data:{‘post‘:post_id},
        dataType:"json",
        success: function (response) {
            console.log(response);
            if(response.status="ok"){
                var like_count = parseInt($(ele).attr("like_count"));
                if(response.msg==‘liked‘){
                    // 已赞
                    alert("已赞");
                    like_count++;
                    $(ele).text("已赞("+like_count+")");
                }else if(response.msg==‘unliked‘){
                    // 已取消赞
                    alert("已取消赞");
                    like_count--;
                    $(ele).text("赞("+like_count+")");
                }
                $(ele).attr("like_count", like_count);
            }
        }
    });
}

like(js) 点赞

# 点赞功能,如果用户未赞过,则点赞;否则,取消赞
@check_login
def like_post(request):
    ret = {‘status‘: ‘ok‘}
    if request.method == ‘GET‘:
        post_id = request.GET.get("post")
        user_id = request.session.get("current_user")[‘id‘]
        like_record = Like.objects.filter(user_id=user_id, post_id=post_id).all()
        if like_record:
            # 已赞过,取消赞
            like_record.delete()
            ret[‘msg‘] = ‘unliked‘
            Post.objects.filter(id=post_id).update(like_count=F("like_count") - 1)
        else:
            # 未赞过,赞一下
            Like.objects.create(user_id=user_id, post_id=post_id)
            Post.objects.filter(id=post_id).update(like_count=F("like_count") + 1)
            ret[‘msg‘] = ‘liked‘

        return HttpResponse(json.dumps(ret))

views.py 点赞

原文地址:https://www.cnblogs.com/xiaonq/p/8227376.html

时间: 2024-08-13 02:03:45

03: 将帖子展示到页面、点赞的相关文章

从数据库取图片并展示到页面

图片以varchar(max)数据格式存储于数据库,每张照片对应一个检测流水号,需要将其取出展示到页面. 一.BLL publict byte[] GetPhotoData(string jclsh) { byte[] photoData=new byte[4000]; try { string sqlStr="select fimage from imagetable where jclsh=\'"+jclsh+"\'"; DataTable dt=new YTH

UIWebView --- IOS用于展示Web页面的控件

UIWebView是IOS中用于展示Web页面的基本控件,提供了非常简便高效的使用方式. 首先,要现在storyboard中建立一个UIWebView的IBOutlet,且与ViewController关联起来. 然后就是代码执行过程了: //webView与storyboard连接起来 var webView: UIWebView! //先设置好webView的样式等 webView!.frame = self.view.frame webView!.backgroundColor = UIC

用github展示前端页面

今天尝试了一下使用github展示前端页面,还是比较简单的,平时做一些小的demo时,可以用这个方法展示自己的页面,在此记录下方法. 首先打开自己的github项目仓库,比如   https://github.com/zqqya/ToDoList 创建一个新的分支,名字为gh-pages(只能为这个名字),这个分支会自动把master下的文件拷贝过来 然后就可以直接访问以下地址: http://(user_name|org_name).github.io/repo_name 就可以展示你的项目的

node创建服务器之展示html页面

在上篇随笔中,我只说了如何建立一个http服务,并没有说如何展示html页面,毕竟最后我们在web服务器上是要返回给用户不同的html页面的,那么我们如何根据用户的请求来为用户呈现出不同的页面列,这里我们就需要用到fs模块来实现了,fs模块也是node集成的一个模块,这个模块看字面意思就知道,是用来操作文件的,有了fs模块,js就可以在node环境下操作服务器的文件了,这个模块十分有用,哈哈哈,看一下,如何使用这个模块为用户呈现一个html页面的内容 var http = require('ht

django 将表数据通过API展示到页面上(转)

需求: 我在learn这个app下创建了两张表,其中一个表为user,我希望通过API,在页面是展示这些数据,当用户访问指定的url时,将表中所有对象展示到页面上. 先看learn/models.py文件代码 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 #coding:utf8 from django.db import models class Group(models.Model):     Name = models.CharField(max_le

关于html5与jsp页面同样的html代码展示的页面效果不一样的问题

1 private void Ws_NewMessageReceived(WebSocketSession session, string value) 2 { 3 Dictionary<string, string> res = login(value, session, this) as Dictionary<string, string>; 4 switch (res["send"]) 5 { 6 case "0": 7 res.Rem

Redis应用2-Redis实现开发者头条页面点赞功能

开发者头条是一个资源丰富的程序猿学习网站.当网站发布新的咨询的时候,内容优秀的咨询总是会被点赞.今天就利用Redis实现这个小小的功能. 为什么使用Redis而不是Mysql实现? Redis 和 Mysql应用场景不同. 从效率来说: Redis的数据存放在内存,所以速度快但是会受到内存空间限制. MySQL存放在硬盘,在速度上肯定没有Redis快,但是存放的数据量要多的多. 从功能来说: Redis是一个K-V数据库,同时还支持List/Hash/Set/Sorted Set等几个简单数据结

MVC简易购物车项目--展示购物车页面

在展示购物车这个页面可以看到自己的订单,并且可以修改商品的数量,并更新总价,还可以删除商品. 当在购物大厅点击购买时,提交给GoShowMyCart这个servlet处理 GoShowMyCart.java public class GoShowMyCart extends HttpServlet { public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletExceptio

excel-to-json(将excel表格数据展示到页面中)

今天,老大给我提了一个需求,他需要将爬虫爬出的数据展示到页面上,因为大多数都是图片数据,所以我的第一反应是循环拼字符串 但是,老大给我的数据都是存在excel表格中的,所以需要将excel表格转化为字符串.找了很多方法,都不合适,最后找到一个NPM的包叫做excel-to-json的包,现在总结一下. 首先  npm install excel-to-json ,然后配置package.json, package.json配置如下 { "name": "abc",