|
提要
如题,之前做过“新闻发布”这个项目,这里讲一下复现
之前文章如下
https://wnhyang.gitee.io/article/48213f39.html
https://wnhyang.gitee.io/article/54805cfd.html
之前也说过我的一些设计是参考简书的,所以下面展示的也是很像
开始
一个简易的新闻发布系统,前台可实现,新闻的在线编辑(富文本编辑器实现),查看新闻,评论新闻,问题反馈,个人信息修改等功能,后台就是实现包括用户、新闻分类、新闻信息、评论等管理
首页参考下图
[图片上传失败...(image-92f3ff-1648794005365)]
反馈参考下图
[图片上传失败...(image-ae9dec-1648794005366)]
架构图
[图片上传失败...(image-43f710-1648794005366)]
数据库设计
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 | 编辑界面参考如下在此可看到自己所有新闻(所有状态),可编辑修改
[图片上传失败...(image-768a63-1648794005366)]
[图片上传失败...(image-ee54cb-1648794005366)]
[图片上传失败...(image-374743-1648794005366)] |
| 一般用户 | 普通用户
个人信息修改
提交认证,通过认证可变为媒体人
查看新闻
喜欢收藏新闻
评论新闻
反馈 | /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 | 个人主页参考如下展示基本个人信息同时,显示已过审核新闻,喜欢收藏新闻
[图片上传失败...(image-d9c492-1648794005366)] |
| 游客 | 查看新闻 | /news/{newsId}
/comment/list
/user/{userId}
/user/{userId}/like
/user/like/list
/user/{userId}/star
/user/star/list
/news/category/all
/{cId} | 查看新闻参考如下显示新闻标题、内容、分类、评论、推荐新闻等
[图片上传失败...(image-ea12f-1648794005366)] |
新闻状态转换图
[图片上传失败...(image-c4ef90-1648794005366)]
部分数据流转图
[图片上传失败...(image-4f3f1b-1648794005366)]
缓存设计
新闻点赞缓存设计
https://wnhyang.gitee.io/article/1e9afcf1.html
新闻分类名和反馈类型名转为JSON字符串存储,因为这部分只由管理员修改,而且几乎不变,所以没有设置过期时间,并在修改时删除缓存,以做到数据一致
单个新闻分类名、单个反馈类型名、用户名、新闻标题、用户邮箱存对应字符串,有过期时间,也会在删除修改时删除缓存
没做的
新闻评论数、点击量的缓存hash
每个用户的新闻列表缓存set/zset
新闻简单信息缓存hash
热门新闻内容缓存hash
推荐列表list
收藏夹set/zset
新闻总热榜,分类热榜set/zset
总结
问题/需要改进
评论关联其他评论(一级评论或回复之间的),数据库需要再设计,删除需要重新考虑逻辑
在扩展功能时要考虑数据库表是否需要重新设计
简单的关联表(两个id组成的),可以省去关联表的id,由关联的两个id组成复合主键
展望
用户权限,可使用SpringSecurity等安全框架,同时对敏感信息加密存储
单个服务过大时,考虑拆分服务
分布式场景考虑,事务问题,定时任务同样也要考虑分布式下的问题
加入ES优化查询
数据表结构,索引优化
|
|