复现-新闻发布-项目

90 阅读7分钟

提要

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

之前文章如下

wnhyang.github.io/article/482…

wnhyang.github.io/article/548…

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

开始

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

首页参考下图

图片转存失败,建议将图片保存下来直接上传

反馈参考下图

图片转存失败,建议将图片保存下来直接上传

架构图

图片转存失败,建议将图片保存下来直接上传

数据库设计

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}
查看新闻参考如下显示新闻标题、内容、分类、评论、推荐新闻等
图片转存失败,建议将图片保存下来直接上传

新闻状态转换图

图片转存失败,建议将图片保存下来直接上传

部分数据流转图

图片转存失败,建议将图片保存下来直接上传

缓存设计

新闻点赞缓存设计

wnhyang.github.io/article/1e9…

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

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

没做的

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

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

新闻简单信息缓存hash

热门新闻内容缓存hash

推荐列表list

收藏夹set/zset

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

总结

问题/需要改进

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

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

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

展望

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

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

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

  • 加入ES优化查询

  • 数据表结构,索引优化