复现'新闻发布'项目

提要

如题,之前做过“新闻发布”这个项目,这里讲一下复现

之前文章如下

https://wnhyang.github.io/article/48213f39.html

https://wnhyang.github.io/article/54805cfd.html

之前也说过我的一些设计是参考简书的,所以下面展示的也是很像

开始

一个简易的新闻发布系统,前台可实现,新闻的在线编辑(富文本编辑器实现),查看新闻,评论新闻,问题反馈,个人信息修改等功能,后台就是实现包括用户、新闻分类、新闻信息、评论等管理

首页参考下图

首页

反馈参考下图

反馈

架构图

系统架构图

数据库设计

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
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
CREATE TABLE `user` (
`id` BIGINT ( 20 ) UNSIGNED NOT NULL AUTO_INCREMENT COMMENT '自增主键id',
`user_name` VARCHAR ( 20 ) NOT NULL DEFAULT '' COMMENT '用户名',
`password` VARCHAR ( 100 ) NOT NULL DEFAULT '123456' COMMENT '密码',
`email` VARCHAR ( 30 ) NOT NULL DEFAULT '' COMMENT '邮箱',
`user_type` TINYINT ( 4 ) NOT NULL DEFAULT '0' COMMENT '用户类型(0:普通用户,1:媒体人,2:管理员)',
`phone` VARCHAR ( 50 ) NOT NULL DEFAULT '' COMMENT '手机号',
`show_phone` TINYINT ( 1 ) NOT NULL DEFAULT '0' COMMENT '是否展示手机号(0:是,1否)',
`sign` VARCHAR ( 30 ) NOT NULL DEFAULT '' COMMENT '签名',
`intro` VARCHAR ( 100 ) NOT NULL DEFAULT '' COMMENT '介绍',
`valid` TINYINT ( 1 ) NOT NULL DEFAULT '1' COMMENT '是否有效(0:无效,1有效)',
`create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
`update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
PRIMARY KEY ( `id` ),
UNIQUE KEY `idx_user_name` ( `user_name` ),
UNIQUE KEY `idx_email` ( `email` ),
KEY `idx_update_time` ( `update_time` )
) ENGINE = INNODB AUTO_INCREMENT = 20 DEFAULT CHARSET = utf8mb4 COMMENT = '新闻用户表';
CREATE TABLE `user_cert` (
`id` BIGINT ( 20 ) UNSIGNED NOT NULL AUTO_INCREMENT COMMENT '自增主键id',
`user_id` BIGINT ( 20 ) NOT NULL DEFAULT '-1' COMMENT '用户id',
`cert_info` VARCHAR ( 50 ) NOT NULL DEFAULT '' COMMENT '认证信息',
`cert_material` VARCHAR ( 255 ) NOT NULL DEFAULT '' COMMENT '认证材料',
`state` TINYINT ( 4 ) NOT NULL DEFAULT '0' COMMENT '认证状态(0:待审核,1:通过,2:未通过)',
`remark` VARCHAR ( 50 ) NOT NULL DEFAULT '' COMMENT '备注',
`valid` TINYINT ( 1 ) NOT NULL DEFAULT '1' COMMENT '是否有效(0:无效,1有效)',
`create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
`update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
PRIMARY KEY ( `id` ),
KEY `idx_update_time` ( `update_time` ),
KEY `idx_user_id` ( `user_id` )
) ENGINE = INNODB AUTO_INCREMENT = 12 DEFAULT CHARSET = utf8mb4 COMMENT = '用户认证表';
CREATE TABLE `news` (
`id` BIGINT ( 20 ) UNSIGNED NOT NULL AUTO_INCREMENT COMMENT '自增主键id',
`category_id` BIGINT ( 20 ) NOT NULL DEFAULT '-1' COMMENT '新闻分类id',
`user_id` BIGINT ( 20 ) NOT NULL DEFAULT '-1' COMMENT '作者id',
`title` VARCHAR ( 50 ) NOT NULL DEFAULT '' COMMENT '新闻标题',
`summary` VARCHAR ( 30 ) NOT NULL DEFAULT '' COMMENT '新闻摘要',
`content` VARCHAR ( 1000 ) NOT NULL DEFAULT '' COMMENT '新闻内容',
`state` TINYINT ( 4 ) NOT NULL DEFAULT '0' COMMENT '新闻状态(0:未操作,草稿状态,1:等待,2:通过,3:不通过)',
`remark` VARCHAR ( 50 ) NOT NULL DEFAULT '' COMMENT '备注',
`comment_count` INT ( 10 ) NOT NULL DEFAULT '0' COMMENT '评论数,只计算一级评论',
`star_count` INT ( 10 ) NOT NULL DEFAULT '0' COMMENT '收藏数',
`like_count` INT ( 10 ) NOT NULL DEFAULT '0' COMMENT '喜欢数',
`valid` TINYINT ( 1 ) NOT NULL DEFAULT '1' COMMENT '是否有效(0:无效,1有效)',
`create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
`update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
PRIMARY KEY ( `id` ),
KEY `idx_news_title` ( `title` ),
KEY `idx_update_time` ( `update_time` ),
KEY `idx_user_id` ( `user_id` ),
KEY `idx_category_id` ( `category_id` )
) ENGINE = INNODB AUTO_INCREMENT = 32 DEFAULT CHARSET = utf8mb4 COMMENT = '新闻表';
CREATE TABLE `news_category` (
`id` BIGINT ( 20 ) UNSIGNED NOT NULL AUTO_INCREMENT COMMENT '自增主键id',
`category_name` VARCHAR ( 10 ) NOT NULL DEFAULT '' COMMENT '新闻分类名',
`valid` TINYINT ( 1 ) NOT NULL DEFAULT '1' COMMENT '是否有效(0:无效,1有效)',
`create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
`update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
PRIMARY KEY ( `id` ),
KEY `idx_update_time` ( `update_time` )
) ENGINE = INNODB AUTO_INCREMENT = 23 DEFAULT CHARSET = utf8mb4 COMMENT = '新闻分类表';
CREATE TABLE `news_comment` (
`id` BIGINT ( 20 ) UNSIGNED NOT NULL AUTO_INCREMENT COMMENT '自增主键id',
`news_id` BIGINT ( 20 ) NOT NULL DEFAULT '-1' COMMENT '新闻id',
`user_id` BIGINT ( 20 ) NOT NULL DEFAULT '-1' COMMENT '作者id',
`parent_id` BIGINT ( 20 ) NOT NULL DEFAULT '-1' COMMENT '父评论id',
`is_top` TINYINT ( 1 ) NOT NULL DEFAULT '1' COMMENT '是否一级评论,只有两级评论',
`content` VARCHAR ( 100 ) NOT NULL DEFAULT '' COMMENT '评论内容',
`valid` TINYINT ( 1 ) NOT NULL DEFAULT '1' COMMENT '是否有效(0:无效,1有效)',
`create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
`update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
PRIMARY KEY ( `id` ),
KEY `idx_update_time` ( `update_time` ),
KEY `idx_news_id` ( `news_id` )
) ENGINE = INNODB AUTO_INCREMENT = 20 DEFAULT CHARSET = utf8mb4 COMMENT = '新闻评论表';
CREATE TABLE `user_like_news` (
`id` BIGINT ( 20 ) UNSIGNED NOT NULL AUTO_INCREMENT COMMENT '自增主键id',
`news_id` BIGINT ( 20 ) NOT NULL DEFAULT '-1' COMMENT '新闻id',
`user_id` BIGINT ( 20 ) NOT NULL DEFAULT '-1' COMMENT '用户id',
`valid` TINYINT ( 1 ) NOT NULL DEFAULT '1' COMMENT '是否有效(0:无效,1有效)',
`create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
`update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
PRIMARY KEY ( `id` ),
KEY `idx_update_time` ( `update_time` ),
KEY `idx_user_id` ( `user_id` ),
KEY `idx_news_id` ( `news_id` )
) ENGINE = INNODB AUTO_INCREMENT = 25 DEFAULT CHARSET = utf8mb4 COMMENT = '用户喜欢新闻表';
CREATE TABLE `user_star_news` (
`id` BIGINT ( 20 ) UNSIGNED NOT NULL AUTO_INCREMENT COMMENT '自增主键id',
`news_id` BIGINT ( 20 ) NOT NULL DEFAULT '-1' COMMENT '新闻id',
`user_id` BIGINT ( 20 ) NOT NULL DEFAULT '-1' COMMENT '用户id',
`valid` TINYINT ( 1 ) NOT NULL DEFAULT '1' COMMENT '是否有效(0:无效,1有效)',
`create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
`update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
PRIMARY KEY ( `id` ),
KEY `idx_update_time` ( `update_time` ),
KEY `idx_user_id` ( `user_id` ),
KEY `idx_news_id` ( `news_id` )
) ENGINE = INNODB AUTO_INCREMENT = 14 DEFAULT CHARSET = utf8mb4 COMMENT = '用户收藏新闻表';
CREATE TABLE `feedback` (
`id` BIGINT ( 20 ) UNSIGNED NOT NULL AUTO_INCREMENT COMMENT '自增主键id',
`user_id` BIGINT ( 20 ) NOT NULL DEFAULT '-1' COMMENT '反馈人id',
`type_id` BIGINT ( 20 ) NOT NULL DEFAULT '-1' COMMENT '反馈类型id',
`content` VARCHAR ( 100 ) NOT NULL DEFAULT '' COMMENT '反馈内容',
`state` TINYINT ( 1 ) NOT NULL DEFAULT '0' COMMENT '反馈状态(0:未处理,1:处理)',
`remark` VARCHAR ( 50 ) NOT NULL DEFAULT '' COMMENT '备注',
`valid` TINYINT ( 1 ) NOT NULL DEFAULT '1' COMMENT '是否有效(0:无效,1有效)',
`create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
`update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
PRIMARY KEY ( `id` ),
KEY `idx_update_time` ( `update_time` ),
KEY `idx_user_id` ( `user_id` ),
KEY `idx_type_id` ( `type_id` )
) ENGINE = INNODB AUTO_INCREMENT = 9 DEFAULT CHARSET = utf8mb4 COMMENT = '反馈表';
CREATE TABLE `feedback_type` (
`id` BIGINT ( 20 ) UNSIGNED NOT NULL AUTO_INCREMENT COMMENT '自增主键id',
`type_name` VARCHAR ( 20 ) NOT NULL DEFAULT '' COMMENT '反馈类型名',
`valid` TINYINT ( 1 ) NOT NULL DEFAULT '1' COMMENT '是否有效(0:无效,1有效)',
`create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
`update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
PRIMARY KEY ( `id` ),
KEY `idx_update_time` ( `update_time` )
) ENGINE = INNODB AUTO_INCREMENT = 21 DEFAULT CHARSET = utf8mb4 COMMENT = '反馈类型表';

接口设计

操作人 主要接口 说明
管理员 对几乎所有内容的管理
用户认证审核
用户管理
新闻分类管理
新闻审核
新闻管理
新闻评论管理
反馈管理
/user/info/(list/update/add/delete)
/user/cert/(list/update/delete)
/news/category/(list/update/add/delete)
/news/info/(list/update/add/delete)
/comment/info/list
/comment/delete
/feedback/type/(list/update/add/delete)
/feedback/info/(list/update/delete)
就正常管理界面
媒体人 新闻来源
需要通过认证审核可发新闻(可限制时间,一段时间后还需认证)
个人新闻增删改
个人信息修改提交认证
查看新闻
喜欢收藏新闻
评论新闻
反馈
/news/add
/news/delete
/news/{userId}/news
/news/{userId}/content
/news/{userId}/submit
/news/{userId}/cancel
编辑界面参考如下在此可看到自己所有新闻(所有状态),可编辑修改
编辑
认证成功
认证失败
一般用户 普通用户
个人信息修改
提交认证,通过认证可变为媒体人
查看新闻
喜欢收藏新闻
评论新闻
反馈
/news/{newsId}/comment
/news/{newsId}/star
/news/{newsId}/like
/news/{newsId}/unlike
/user/update
/user/delete
/user/cert/add
/user/{userId}/cert
/feedback/all
/feedback/add
/user/{userId}/feedback
个人主页参考如下展示基本个人信息同时,显示已过审核新闻,喜欢收藏新闻
个人主页
游客 查看新闻 /news/{newsId}
/comment/list
/user/{userId}
/user/{userId}/like
/user/like/list
/user/{userId}/star
/user/star/list
/news/category/all
/{cId}
查看新闻参考如下显示新闻标题、内容、分类、评论、推荐新闻等
新闻详情

新闻状态转换图

流程图

部分数据流转图

数据流转

缓存设计

新闻点赞缓存设计

https://wnhyang.github.io/article/1e9afcf1.html

新闻分类名和反馈类型名转为JSON字符串存储,因为这部分只由管理员修改,而且几乎不变,所以没有设置过期时间,并在修改时删除缓存,以做到数据一致

单个新闻分类名、单个反馈类型名、用户名、新闻标题、用户邮箱存对应字符串,有过期时间,也会在删除修改时删除缓存

没做的

新闻评论数、点击量的缓存hash

每个用户的新闻列表缓存set/zset

新闻简单信息缓存hash

热门新闻内容缓存hash

推荐列表list

收藏夹set/zset

新闻总热榜,分类热榜set/zset

总结

问题/需要改进

评论关联其他评论(一级评论或回复之间的),数据库需要再设计,删除需要重新考虑逻辑

在扩展功能时要考虑数据库表是否需要重新设计

简单的关联表(两个id组成的),可以省去关联表的id,由关联的两个id组成复合主键

展望

  • 用户权限,可使用SpringSecurity等安全框架,同时对敏感信息加密存储

  • 单个服务过大时,考虑拆分服务

  • 分布式场景考虑,事务问题,定时任务同样也要考虑分布式下的问题

  • 加入ES优化查询

  • 数据表结构,索引优化