提要
如題,之前做過(guò)“新聞發(fā)布”這個(gè)項(xiàng)目,這里講一下復(fù)現(xiàn)
之前文章如下
https://wnhyang.gitee.io/article/48213f39.html
https://wnhyang.gitee.io/article/54805cfd.html
之前也說(shuō)過(guò)我的一些設(shè)計(jì)是參考簡(jiǎn)書(shū)的,所以下面展示的也是很像
開(kāi)始
一個(gè)簡(jiǎn)易的新聞發(fā)布系統(tǒng)毫玖,前臺(tái)可實(shí)現(xiàn)蛋勺,新聞的在線編輯(富文本編輯器實(shí)現(xiàn)),查看新聞烁登,評(píng)論新聞,問(wèn)題反饋蔚舀,個(gè)人信息修改等功能饵沧,后臺(tái)就是實(shí)現(xiàn)包括用戶(hù)锨络、新聞分類(lèi)、新聞信息狼牺、評(píng)論等管理
首頁(yè)參考下圖
[圖片上傳失敗...(image-92f3ff-1648794005365)]
反饋參考下圖
[圖片上傳失敗...(image-ae9dec-1648794005366)]
架構(gòu)圖
[圖片上傳失敗...(image-43f710-1648794005366)]
數(shù)據(jù)庫(kù)設(shè)計(jì)
CREATE TABLE `user` (
`id` BIGINT ( 20 ) UNSIGNED NOT NULL AUTO_INCREMENT COMMENT '自增主鍵id',
`user_name` VARCHAR ( 20 ) NOT NULL DEFAULT '' COMMENT '用戶(hù)名',
`password` VARCHAR ( 100 ) NOT NULL DEFAULT '123456' COMMENT '密碼',
`email` VARCHAR ( 30 ) NOT NULL DEFAULT '' COMMENT '郵箱',
`user_type` TINYINT ( 4 ) NOT NULL DEFAULT '0' COMMENT '用戶(hù)類(lèi)型(0:普通用戶(hù)羡儿,1:媒體人,2:管理員)',
`phone` VARCHAR ( 50 ) NOT NULL DEFAULT '' COMMENT '手機(jī)號(hào)',
`show_phone` TINYINT ( 1 ) NOT NULL DEFAULT '0' COMMENT '是否展示手機(jī)號(hào)(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:無(wú)效失受,1有效)',
`create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '創(chuàng)建時(shí)間',
`update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新時(shí)間',
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 = '新聞?dòng)脩?hù)表';
CREATE TABLE `user_cert` (
`id` BIGINT ( 20 ) UNSIGNED NOT NULL AUTO_INCREMENT COMMENT '自增主鍵id',
`user_id` BIGINT ( 20 ) NOT NULL DEFAULT '-1' COMMENT '用戶(hù)id',
`cert_info` VARCHAR ( 50 ) NOT NULL DEFAULT '' COMMENT '認(rèn)證信息',
`cert_material` VARCHAR ( 255 ) NOT NULL DEFAULT '' COMMENT '認(rèn)證材料',
`state` TINYINT ( 4 ) NOT NULL DEFAULT '0' COMMENT '認(rèn)證狀態(tài)(0:待審核,1:通過(guò)咏瑟,2:未通過(guò))',
`remark` VARCHAR ( 50 ) NOT NULL DEFAULT '' COMMENT '備注',
`valid` TINYINT ( 1 ) NOT NULL DEFAULT '1' COMMENT '是否有效(0:無(wú)效拂到,1有效)',
`create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '創(chuàng)建時(shí)間',
`update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新時(shí)間',
PRIMARY KEY ( `id` ),
KEY `idx_update_time` ( `update_time` ),
KEY `idx_user_id` ( `user_id` )
) ENGINE = INNODB AUTO_INCREMENT = 12 DEFAULT CHARSET = utf8mb4 COMMENT = '用戶(hù)認(rèn)證表';
CREATE TABLE `news` (
`id` BIGINT ( 20 ) UNSIGNED NOT NULL AUTO_INCREMENT COMMENT '自增主鍵id',
`category_id` BIGINT ( 20 ) NOT NULL DEFAULT '-1' COMMENT '新聞分類(lèi)id',
`user_id` BIGINT ( 20 ) NOT NULL DEFAULT '-1' COMMENT '作者id',
`title` VARCHAR ( 50 ) NOT NULL DEFAULT '' COMMENT '新聞標(biāo)題',
`summary` VARCHAR ( 30 ) NOT NULL DEFAULT '' COMMENT '新聞?wù)?,
`content` VARCHAR ( 1000 ) NOT NULL DEFAULT '' COMMENT '新聞內(nèi)容',
`state` TINYINT ( 4 ) NOT NULL DEFAULT '0' COMMENT '新聞狀態(tài)(0:未操作,草稿狀態(tài)码泞,1:等待兄旬,2:通過(guò),3:不通過(guò))',
`remark` VARCHAR ( 50 ) NOT NULL DEFAULT '' COMMENT '備注',
`comment_count` INT ( 10 ) NOT NULL DEFAULT '0' COMMENT '評(píng)論數(shù)余寥,只計(jì)算一級(jí)評(píng)論',
`star_count` INT ( 10 ) NOT NULL DEFAULT '0' COMMENT '收藏?cái)?shù)',
`like_count` INT ( 10 ) NOT NULL DEFAULT '0' COMMENT '喜歡數(shù)',
`valid` TINYINT ( 1 ) NOT NULL DEFAULT '1' COMMENT '是否有效(0:無(wú)效领铐,1有效)',
`create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '創(chuàng)建時(shí)間',
`update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新時(shí)間',
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 '新聞分類(lèi)名',
`valid` TINYINT ( 1 ) NOT NULL DEFAULT '1' COMMENT '是否有效(0:無(wú)效,1有效)',
`create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '創(chuàng)建時(shí)間',
`update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新時(shí)間',
PRIMARY KEY ( `id` ),
KEY `idx_update_time` ( `update_time` )
) ENGINE = INNODB AUTO_INCREMENT = 23 DEFAULT CHARSET = utf8mb4 COMMENT = '新聞分類(lèi)表';
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 '父評(píng)論id',
`is_top` TINYINT ( 1 ) NOT NULL DEFAULT '1' COMMENT '是否一級(jí)評(píng)論宋舷,只有兩級(jí)評(píng)論',
`content` VARCHAR ( 100 ) NOT NULL DEFAULT '' COMMENT '評(píng)論內(nèi)容',
`valid` TINYINT ( 1 ) NOT NULL DEFAULT '1' COMMENT '是否有效(0:無(wú)效绪撵,1有效)',
`create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '創(chuàng)建時(shí)間',
`update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新時(shí)間',
PRIMARY KEY ( `id` ),
KEY `idx_update_time` ( `update_time` ),
KEY `idx_news_id` ( `news_id` )
) ENGINE = INNODB AUTO_INCREMENT = 20 DEFAULT CHARSET = utf8mb4 COMMENT = '新聞評(píng)論表';
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 '用戶(hù)id',
`valid` TINYINT ( 1 ) NOT NULL DEFAULT '1' COMMENT '是否有效(0:無(wú)效,1有效)',
`create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '創(chuàng)建時(shí)間',
`update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新時(shí)間',
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 = '用戶(hù)喜歡新聞表';
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 '用戶(hù)id',
`valid` TINYINT ( 1 ) NOT NULL DEFAULT '1' COMMENT '是否有效(0:無(wú)效祝蝠,1有效)',
`create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '創(chuàng)建時(shí)間',
`update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新時(shí)間',
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 = '用戶(hù)收藏新聞表';
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 '反饋類(lèi)型id',
`content` VARCHAR ( 100 ) NOT NULL DEFAULT '' COMMENT '反饋內(nèi)容',
`state` TINYINT ( 1 ) NOT NULL DEFAULT '0' COMMENT '反饋狀態(tài)(0:未處理音诈,1:處理)',
`remark` VARCHAR ( 50 ) NOT NULL DEFAULT '' COMMENT '備注',
`valid` TINYINT ( 1 ) NOT NULL DEFAULT '1' COMMENT '是否有效(0:無(wú)效,1有效)',
`create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '創(chuàng)建時(shí)間',
`update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新時(shí)間',
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 '反饋類(lèi)型名',
`valid` TINYINT ( 1 ) NOT NULL DEFAULT '1' COMMENT '是否有效(0:無(wú)效绎狭,1有效)',
`create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '創(chuàng)建時(shí)間',
`update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新時(shí)間',
PRIMARY KEY ( `id` ),
KEY `idx_update_time` ( `update_time` )
) ENGINE = INNODB AUTO_INCREMENT = 21 DEFAULT CHARSET = utf8mb4 COMMENT = '反饋類(lèi)型表';
接口設(shè)計(jì)
操作人 | 可 | 主要接口 | 說(shuō)明 |
---|---|---|---|
管理員 | 對(duì)幾乎所有內(nèi)容的管理 |
用戶(hù)認(rèn)證審核
用戶(hù)管理
新聞分類(lèi)管理
新聞審核
新聞管理
新聞評(píng)論管理
反饋管理 | /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) | 就正常管理界面 |
| 媒體人 | 新聞來(lái)源
需要通過(guò)認(rèn)證審核可發(fā)新聞(可限制時(shí)間细溅,一段時(shí)間后還需認(rèn)證)
個(gè)人新聞增刪改
個(gè)人信息修改提交認(rèn)證
查看新聞
喜歡收藏新聞
評(píng)論新聞
反饋 | /news/add
/news/delete
/news/{userId}/news
/news/{userId}/content
/news/{userId}/submit
/news/{userId}/cancel | 編輯界面參考如下在此可看到自己所有新聞(所有狀態(tài)),可編輯修改
[圖片上傳失敗...(image-768a63-1648794005366)]
[圖片上傳失敗...(image-ee54cb-1648794005366)]
[圖片上傳失敗...(image-374743-1648794005366)] |
| 一般用戶(hù) | 普通用戶(hù)
個(gè)人信息修改
提交認(rèn)證儡嘶,通過(guò)認(rèn)證可變?yōu)槊襟w人
查看新聞
喜歡收藏新聞
評(píng)論新聞
反饋 | /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 | 個(gè)人主頁(yè)參考如下展示基本個(gè)人信息同時(shí)喇聊,顯示已過(guò)審核新聞,喜歡收藏新聞
[圖片上傳失敗...(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} | 查看新聞參考如下顯示新聞標(biāo)題蹦狂、內(nèi)容誓篱、分類(lèi)、評(píng)論凯楔、推薦新聞等
[圖片上傳失敗...(image-ea12f-1648794005366)] |
新聞狀態(tài)轉(zhuǎn)換圖
[圖片上傳失敗...(image-c4ef90-1648794005366)]
部分?jǐn)?shù)據(jù)流轉(zhuǎn)圖
[圖片上傳失敗...(image-4f3f1b-1648794005366)]
緩存設(shè)計(jì)
新聞點(diǎn)贊緩存設(shè)計(jì)
https://wnhyang.gitee.io/article/1e9afcf1.html
新聞分類(lèi)名和反饋類(lèi)型名轉(zhuǎn)為JSON字符串存儲(chǔ)窜骄,因?yàn)檫@部分只由管理員修改,而且?guī)缀醪蛔兲淅保詻](méi)有設(shè)置過(guò)期時(shí)間,并在修改時(shí)刪除緩存御滩,以做到數(shù)據(jù)一致
單個(gè)新聞分類(lèi)名鸥拧、單個(gè)反饋類(lèi)型名党远、用戶(hù)名、新聞標(biāo)題富弦、用戶(hù)郵箱存對(duì)應(yīng)字符串沟娱,有過(guò)期時(shí)間,也會(huì)在刪除修改時(shí)刪除緩存
沒(méi)做的
新聞評(píng)論數(shù)腕柜、點(diǎn)擊量的緩存hash
每個(gè)用戶(hù)的新聞列表緩存set/zset
新聞簡(jiǎn)單信息緩存hash
熱門(mén)新聞內(nèi)容緩存hash
推薦列表list
收藏夾set/zset
新聞總熱榜济似,分類(lèi)熱榜set/zset
總結(jié)
問(wèn)題/需要改進(jìn)
評(píng)論關(guān)聯(lián)其他評(píng)論(一級(jí)評(píng)論或回復(fù)之間的),數(shù)據(jù)庫(kù)需要再設(shè)計(jì)盏缤,刪除需要重新考慮邏輯
在擴(kuò)展功能時(shí)要考慮數(shù)據(jù)庫(kù)表是否需要重新設(shè)計(jì)
簡(jiǎn)單的關(guān)聯(lián)表(兩個(gè)id組成的)砰蠢,可以省去關(guān)聯(lián)表的id,由關(guān)聯(lián)的兩個(gè)id組成復(fù)合主鍵
展望
用戶(hù)權(quán)限唉铜,可使用SpringSecurity等安全框架台舱,同時(shí)對(duì)敏感信息加密存儲(chǔ)
單個(gè)服務(wù)過(guò)大時(shí),考慮拆分服務(wù)
分布式場(chǎng)景考慮潭流,事務(wù)問(wèn)題竞惋,定時(shí)任務(wù)同樣也要考慮分布式下的問(wèn)題
加入ES優(yōu)化查詢(xún)
數(shù)據(jù)表結(jié)構(gòu),索引優(yōu)化