C#编程之一步步搭建自己的博客 .NET版(2、评论功能)
小标 2019-04-08 来源 : 阅读 1918 评论 0

摘要:本文主要向大家介绍了C#编程之一步步搭建自己的博客 .NET版(2、评论功能),通过具体的内容向大家展示,希望对大家学习C#编程有所帮助。

本文主要向大家介绍了C#编程之一步步搭建自己的博客 .NET版(2、评论功能),通过具体的内容向大家展示,希望对大家学习C#编程有所帮助。

C#编程之一步步搭建自己的博客 .NET版(2、评论功能)

    这次开发的博客主要功能或特点:
    第一:可以兼容各终端,特别是手机端。
    第二:到时会用到大量html5,炫啊。
    第三:导入博客园的精华文章,并做分类。(不要封我)
    第四:做个插件,任何网站上的技术文章都可以转发收藏 到本博客。

    上一篇《一步步开发自己的博客(一)》发表之后得到的效应还不错,得到了二十几个赞。然后建的QQ群 两天不到 就有了进三十来个人。大家在群里关于建站经验讨论也是十分热烈。由此可见,大家对拥有自己的独立空间 是多么的渴望。

    这篇主要是分析 评论功能。在这里,不得不吐槽下 博客园的评论功能。

    第一、对于阅读者。大家有没有在看评论的时候,看着看着有往上翻?特别是有些对骂的评论,都不知道是谁在骂谁。不得不往上翻那个@的人发的是什么。不知道 这句话 是 对谁的哪句话做的回复。虽然有“引用”功能,但也有很多人没有使用。

    第二、对于博主。在回复各位园友时,点击回复 ,然后 跳到 最下方,然后评论框 自动出现@***  回复之后。想回复下一位,又要把滚动条拖上去。然后 又忘记 这个人是不是已经回复过了。又往下拖 看自己有没有回复过,或者有没有漏掉谁。如果评论够多的话 我相信 各位应该都这样的感觉,我的那个头 我的那个晕。

    在这里 我就打算规避这类问题,像QQ空间的评论 就很爽,谁在和谁对话 一目了然。

表结构

      对于这样的一个需求,没有做过的也许一时没有了头绪。这里最主要的关系就是,“引用”- 谁对谁说。是对哪条评论 展开的讨论。

      其实我把表结构拿出来,相信大家就明白了。

      这里  我再详细分析下每个字段。

      ID:表主键

      Content:评论的内容     

 

      CommentID:引用的评论内容的ID。

      BlogUsersId:用户ID

      BlogsId:博客ID

      ReplyUserID:引用的评论的用户ID。

      ReplyUserName:引用的评论的用户名。

 

      CommentSort:没用(本来以为会用到)

      ContentLevy:没用(本来以为会用到)

       这里要说明下    CommentID:引用的评论内容的ID。其实并非真的是评论内容ID 而是"父评论ID"。我们为了简单起见,把评论分成两种。

父评论,子评论。什么是父评论,子评论?父:初始评论,子:在父评论的基础上进行评论,或者子评论的基础上进行评论。(这里就不分 子子评论  子子子评论了。我想递归应该也可以做到,但不想那么复杂了)

      那么上面还有一个字段没有解释:

      IsInitial  是否是"父评论"

 

如图:      

实现

     通过对表结构的简单分析,我相信 大家应该已经非常明白 我会怎么去实现了。

   第一、评论提交

var BlogId = int.Parse(Request.Form["BlogId"]);var UserId = MySession.UserInfoSessioin.Id; //int.Parse(Request.Form["UserId"]);var CommentID = int.Parse(Request.Form["CommentID"]);var Content = Request.Form["Content"];var ReplyUserID = int.Parse(Request.Form["ReplyUser"]);var ReplyUserName = string.Empty;var User = BLL.Common.CacheData.GetUserInfo().Where(t => t.Id == ReplyUserID).FirstOrDefault();if (null != User){    ReplyUserName = string.IsNullOrEmpty(User.UserNickname) ? User.UserName : User.UserNickname;}BLL.BlogCommentBLL comment = new BLL.BlogCommentBLL();comment.Add(new BlogComment(){    BlogUsersId = UserId,    BlogsId = BlogId,    Content = Content,    CommentID = CommentID,    ReplyUserID = ReplyUserID,    ReplyUserName = ReplyUserName,    IsInitial = CommentID == -1});comment.save();

       一目了然,其实就是一个对象存入数据库了。至于每个字段的取值,你想怎么取看你自己的。

   第二、加载评论

      评论的加载 可能会比提交复杂那么一点。提交有前后 怎么去归类布局呢?

      首先要对 父评论 的筛选,然后加载父评论 和 父评论下的子评论。感觉要进行多次数据库的查询,那么我们只能尝试尽可能少的查询。

      下面来具体看实现代码。      

int blogId = int.Parse(Request.Form["blogID"]);int pageIndex = int.Parse(Request.Form["pageIndex"]);BLL.CommentHandle com = new BLL.CommentHandle();Dictionary<string, object> dic = new Dictionary<string, object>();var comObj = com.GetComment(blogId, pageIndex);if (null == comObj)    return PartialView("Null");dic.Add("commentList", comObj);//对应的评论dic.Add("SessionUser", BLL.Common.MySession.UserInfoSessioin);return PartialView(dic);

  com.GetComment(blogId, pageIndex) 方法 根据 博客ID  和  第几页评论 做为参数,取评论数据,下面给出方法的详细实现:

public List<List<BlogComment>> GetComment(int blogId, int pageIndex){    int total;    BLL.BlogCommentBLL com = new BlogCommentBLL();    //IsInitial == true 父评论 (第一次数据库查询:查询30条父评论)    List<int> disCom = com.GetList<int>(pageIndex, 30, out total, t => t.IsInitial == true && t.BlogsId == blogId,                        false, t => t.Id).Select(t => t.Id).ToList();    if (pageIndex > total)//已经没有评论信息了    {        return null;    }    //第二次数据库查询:查询30条父评论 和30条父评论下的子评论    var listCom = com.GetList(t => disCom.Contains(t.CommentID) || disCom.Contains(t.Id)).ToList();    List<List<BlogComment>> ComObj = new List<List<BlogComment>>();    var ini = listCom.Where(t => t.IsInitial == true).ToList();//这里就不查数据库了直接进行集合筛选    //对评论进行分组(以父评论 分组)    foreach (BlogComment item in ini)    {        item.BlogUsers = CacheData.GetUserInfo().Where(t => t.Id == item.BlogUsersId).FirstOrDefault();                      var userobj = CacheData.GetUserInfo().Where(t => t.Id == item.ReplyUserID).FirstOrDefault();        if (null != userobj)            item.ReplyUserName = userobj.UserNickname;        //添加 以父评论 为一分组 的评论        ComObj.Add(GetCom(item, listCom));    }    return ComObj;}

    上面进行了二次数据库查询,其余的时候 都是进行 数据集合的筛选。在上面的代码中 我们看到了 方法 GetCom(item, listCom)// 取 顶级评论 下的子评论

private List<BlogComment> GetCom(BlogComment com, List<BlogComment> list){    var li = list.Where(t => t.CommentID == com.Id).ToList();    li.Insert(0, com);    return li;}

效果图和演示地址

        在此实现的全部过程都已经分析完了。我们来看看效果图和演示地址。

     那就是怎样更好的统计文章阅读量。

     我知道的方式:

     第一、通过Cookie。(缺点:如果要进行访问量排行的话,可以人为清理cookie,恶意刷新访问量)

     第二、通过客户端取得IP(缺点:1.如果访问量大的话,每次插入数据库之前都要先查询是否存在。2.现在我们大多是公用外网IP,无法统计独立访客)

     疑问:1.cnzz的独立访客(UV)是怎么统计的。2.博客园的文章阅读量是怎么统计的。(进过测试,文章刷新第二遍的时候可以看到 阅读量 加一 ,然后清理cookie 后刷新 阅读量 加一,然后不管怎么刷 都没反应了)

     如果实在是找不到好的解决方案,我打算用 IP+系统版本+浏览器版本号 作为“联合主键”,如果“主键”24小时内重复两次以上,则不统计,如果cookie存在也不统计。


本文由职坐标整理并发布,希望对同学们有所帮助。了解更多详情请关注职坐标编程语言C#.NET频道!

本文由 @小标 发布于职坐标。未经许可,禁止转载。
喜欢 | 1 不喜欢 | 0
看完这篇文章有何感觉?已经有1人表态,100%的人喜欢 快给朋友分享吧~
评论(0)
后参与评论

您输入的评论内容中包含违禁敏感词

我知道了

助您圆梦职场 匹配合适岗位
验证码手机号,获得海同独家IT培训资料
选择就业方向:
人工智能物联网
大数据开发/分析
人工智能Python
Java全栈开发
WEB前端+H5

请输入正确的手机号码

请输入正确的验证码

获取验证码

您今天的短信下发次数太多了,明天再试试吧!

提交

我们会在第一时间安排职业规划师联系您!

您也可以联系我们的职业规划师咨询:

小职老师的微信号:z_zhizuobiao
小职老师的微信号:z_zhizuobiao

版权所有 职坐标-一站式IT培训就业服务领导者 沪ICP备13042190号-4
上海海同信息科技有限公司 Copyright ©2015 www.zhizuobiao.com,All Rights Reserved.
 沪公网安备 31011502005948号    

©2015 www.zhizuobiao.com All Rights Reserved

208小时内训课程