x-blog之论坛核心表简单设计

前言

如果放在一张表里,控制起来很复杂,所以干脆设置成三张表
t_blog_info(帖子表)、t_comment_info(评论表)、t_floor_info(楼中楼表)
为了方便直接贴出截图(以下是按照自己的想法建的结构,仅作为项目说明,如不合理,请谅解)

数据库设计

  1. t_blog_info(帖子表)
    Alt text
    其中visitor_hasread为帖子访问量,
    blog_item帖子唯一索引,用来快速定义帖子详情,blog_state帖子状态,标记是普通贴还是精贴等等,用枚举值标记。

  2. t_comment_info(顶层评论表)
    Alt text
    其中blog_id用来定位所属那篇帖子

  3. t_floor_info(楼中楼表)
    Alt text
    其中blog_id,comment_id用来定位唯一楼中楼评论

ok,以上三张基础表建好了,就可以在此基础上扩展功能了

功能简单介绍

围绕论坛基本功能主要分为搜索帖子,所有帖子展示(包含不同状态的帖子),用户个人所有帖子展示,访问量控制,评论与楼中楼加载等等

  1. 搜索帖子改进由like模糊查询->lucene->es,其中将帖子标题和内容进行分词和搜索,具体见es包下封装
  2. 所有帖子展示,分页查询所有帖子和热门贴,一般要门后端分类号直接给前端,要么前端加载利用jstl进行判断分类,由于目前每页显示数据量不大,所有直接通过前端判断分类显示了
    3.用户个人所有帖子展示 同所有帖子,只不过加个用户id
    4.访问量计算 按照ip和用户的访问表进行登记判断,以一天为准,通过定时器凌晨自动清空访问表,并且访问量记录在帖子表更新下
    Alt text
    5.评论与楼中楼加载,按照所属哪个帖子直接加载其下所有数据即可,如下代码
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    /**
    * 返回帖子内容页
    *
    * @param currentPage 当前页
    * @param encodeBlogId 帖子id
    * @param mv ModelAndView对象
    * @param request 域对象
    * @return 帖子内容页
    * @author slycmiaoxi
    * @since 2019-06-28
    */
    @RequestMapping("show/{currentPage}/{encodeBlogId}")
    public ModelAndView show(@PathVariable int currentPage, @PathVariable String encodeBlogId, ModelAndView mv,
    HttpServletRequest request) {
    long blogId = Long.parseLong(CodecUtils.decodeData(encodeBlogId));
    // 1.该篇文章数据
    ArticleDto articleDto = itBlogInfoService.getDtoById(blogId);
    // 2.楼中楼数据
    List<FloorDto> floorDtos =
    (List<FloorDto>)itFloorInfoService.queryListbyPage(new Page(), new ResultMap("blogId", blogId).toMap())
    .getList();
    // 3.访问量统计
    boolean checked = itCritiquerecordInfoService.checkRepeat(blogId, request.getRemoteAddr());
    if (!checked) {
    TCritiquerecordInfo po = new TCritiquerecordInfo();
    po.setBlogId(blogId);
    po.setIpAddress(request.getRemoteAddr());
    po.setGmtCreate(new Date());
    po.setDeleteFlag(Enable.YES.getValue());
    itCritiquerecordInfoService.insert(po);
    TBlogInfo blogInfo = itBlogInfoService.selectById(blogId);
    int hasReadCount = blogInfo.getVisitorHasread();
    blogInfo.setVisitorHasread(++hasReadCount);
    itBlogInfoService.updateById(blogInfo);
    }
    // 4.评论数据
    Page page = new Page(currentPage, Constants.DEFAULT_EVERY_PAGE);
    PageModal pg = itCommentInfoService.queryListbyPage(page, new ResultMap("blogId", blogId).toMap());
    long total = itCommentInfoService.queryTotal(new ResultMap("blogId", blogId).toMap());
    new PageListUtil().pageModelList(total, mv, pg);
    mv.addObject("blogInfo", articleDto);
    mv.addObject("Floor", floorDtos);
    mv.setViewName("article/articleContent");
    return mv;
    }

首页设计

旧版本这里的设计是对应模块,比如友情链接,关于吧主模块等等,都是在设计一张表,然后通过一个监听器,初始化(initxx),放在session里,然后定时更新session。
目前简化了,直接提供接口,实时改变。比如友情连接
Alt text

1
2
3
4
5
6
7
8
9
10
11
12
13
@RequestMapping("portal")
public String getDoorView(Model model) {
// 1.加载链接栏信息
List<TLinkInfo> linkList = itLinkInfoService.selectList(new EntityWrapper<TLinkInfo>());
model.addAttribute("linkList", linkList);
// 2.加载热门贴
List<ArticleDto> hotDtos = itBlogInfoService.listHotDtos();
model.addAttribute("hotBlog", hotDtos);
return "portal/index";
}

不足

由于个人经验和能力的不足以及前端比较短板,目前该模块有许多不足之处,请谅解!
比如,楼中楼的前端分页显示,自己做不出来~,有能力的在校生或者大佬如果添加,将及时更新

热评文章