概括
0.1 项目整体介绍
根据任务书实现西华头条系统开发。
本课题拟模仿目前流行的网络应用设计一款针对西华的传媒应用。本系统能实现用户管理、各类不同的新闻管理、新闻发起、用户交互管理、分享扩散等功能。要求本应用达到或接近目前网络上流行应用质量。根据题目主要要求,可参考“今日头条”,“抖音”,“百度贴吧”。
具体要求
-
数据库设计: 参考网上同类网站,设计出数据库
-
用户分类模块:管理员、员工、注册用户、一般访客。不同级别用户在登陆后的操作权限不同。
-
用户信息维护模块:用户注册(含头像)、用户登录、浏览个人信息、编辑个人信息。
-
新闻贴子基本数据管理模块:实现各类数据的录入(带文件)、数据修改、删除等维护功能。
-
用户查看新闻模块:针对不同类型的新闻(纯文字、带1张图片、带多张图片,要闻)实现不同风格的查看界面
-
对贴子点赞、回复模块:实现用户对新闻点赞,回复,用户可以对自己的点赞取消和回复编辑。
-
管理员对帖子和回复审核功能模块:建立敏感字数据表,针对表中的的敏感字进行过滤。
-
爬取其它指定网站新的新闻贴子,或爬取指定关键字相关的贴子并存放到自己数据库
-
严格按照MVVC模式开发,至少解决3种及以上安全设计问题
0.2 具体实现流程
通过多个阶段完成
-
阶段一:奠定基石 (后台管理与数据库)
-
完成开发环境配置
-
完成表设计
-
完成用户分类模块、信息维护模块
-
后台管理系统初步构建
-
基础的增删改查 (CRUD)
-
-
阶段二:用户端与身份认证
-
用户端设计
-
基础身份校验功能,登录认证实现 (JWT)
-
新闻帖子数据管理模块
-
-
阶段三:核心业务与安全
-
回复审核功能模块
-
爬虫功能模块
-
并发测试
-
-
阶段四:性能与进阶 (根据项目进度待定)
-
引入Redis优化性能(缓存、计数)
-
压力并发测试
-
基于 WebSocket 的实时通知
-
互斥、分布式锁保证安全
-
微服务部分
-
第一阶段:奠定基石(后台管理与数据库)
目标: 所有人把“开发工厂”建好(配好环境),并搭建起项目的“毛坯房”(数据库和后端框架),最后打通一个最基础的功能(用户管理)。
1.1 开发环境配置
后端
-
JDK 17
- 作用: Java 开发工具包。就像我们的“中文(Java)字典和语法书”,让电脑能看懂我们写的Java代码。
-
IntelliJ IDEA (Ultimate Edition)
- 作用: 我们的“集成开发环境”(IDE),也就是写后端代码的“智能厨房”。它提供了自动提示、纠错等功能,比记事本强大无数倍。
-
Maven
- 作用: 项目的“物流管理员”。我们项目中需要用到很多别人的“轮子”(第三方库,如SpringBoot),Maven可以帮我们自动下载和管理这些“轮子”,我们不需要自己到处找。
-
MySQL (最好是 5.7.4.3)
-
作用: 我们的“数据大仓库”(数据库)。所有用户信息、帖子、评论都存在这里。
-
安装教程: Mysql 5.7.43下载安装配置 (请严格按照教程配置)
-
-
DataGrip
-
作用: 数据库的“可视化管理”工具。MySQL仓库本身是黑乎乎的命令行,DataGrip 给了我们一个“窗户”,可以直观地用鼠标看数据、改数据
-
idea也可以在这里下
-
-
Git
-
作用: 代码的“时光机”与“协作工具”。
-
时光机: 它可以帮你保存代码的每一个版本,写错了可以随时“穿越”回之前的版本。
-
协作: 你们三个人写的代码,最后可以通过 Git 合并在一起,而不会互相覆盖。
-
教程: git的安装和配置
-
项目地址: yumoni6809/XHU_HeadLine (大家把项目
fork到自己账号,再clone到本地)
-
前端
-
Node.js (LTS 18+)
-
作用: 另一本“字典和语法书”。它是运行前端代码(JavaScript)的环境。
-
附带:
npm,前端的“物流管理员”,功能类似 Maven。 -
教程: Nodejs安装零基础教程
-
-
VS Code (Visual Studio Code)
-
作用: 前端的“智能厨房”(IDE),用来写 Vue 代码。它轻量、插件多。
-
教程: VS Code 安装与插件配置 (注意安装教程里提到的
Vue Language Features (Volar)插件)
-
-
Vue CLI (Command Line Interface)
-
作用: Vue 的“项目脚手架”(脚手架 = 快速搭建工具)。我们不用从零开始建文件,它能一键帮我们生成 Vue 项目的“毛坯房”。
-
安装命令 (在电脑终端或CMD运行):
-
npm install -g @vue/cli
1.2 数据库设计
任务书要求: 设计数据库,支持用户分类。
在设计表之前,我们先明确几个核心“实体”以及它们的关系:
-
用户 (User):系统的基础,可以发布帖子。
-
帖子 (NewsPost):由用户发布,属于某个分类。
-
分类 (Category):用于组织帖子(如 “要闻”)。
-
评论 (Comment):用户可以对帖子发表评论,评论之间也可以互回。
-
点赞 (Like):用户可以对帖子或评论进行点赞。
-
敏感词 (SensitiveWord):用于审核帖子和评论。
关系图景:
-
一个用户可以发布多个帖子和多个评论。
-
一个帖子只能有一个作者(用户),但可以有多个评论。
-
一个帖子只属于一个分类。
-
一个点赞记录了“哪个用户”赞了“哪个帖子/评论”。
核心表设计 :
-
user(用户信息表)-
id(BIGINT, 主键, 自动增长) - 用户的唯一身份证号 -
user_name(VARCHAR, 唯一) - 登录用户名 -
password(VARCHAR) - 登录密码 (安全点: 数据库存的是加密后的哈希值,不是明文) -
nick_name(VARCHAR) - 用户昵称 -
avatar_url(VARCHAR) - 头像图片地址 -
phone(VARCHAR, 唯一) - 手机号 -
role(TINYINT) - (Req 2) 角色 (关键字段): 0-管理员, 1-员工, 2-注册用户 -
create_time(DATETIME) - 账号创建时间 -
update_time(DATETIME) - 信息最后修改时间 -
deleted(TINYINT) - 逻辑删除 (0-未删, 1-已删)
-
-- ----------------------------
-- 表 1: user (用户信息表)
-- ----------------------------
CREATE TABLE `user` (
`id` BIGINT NOT NULL AUTO_INCREMENT COMMENT '用户唯一ID (主键)',
`user_name` VARCHAR(100) NOT NULL COMMENT '登录用户名 (Req 3)',
`password` VARCHAR(255) NOT NULL COMMENT '登录密码 (Req 3, 安全点: 存储BCrypt哈希值)',
`nick_name` VARCHAR(100) NOT NULL DEFAULT '西华用户' COMMENT '昵称 (Req 3)',
`avatar_url` VARCHAR(500) NULL DEFAULT NULL COMMENT '头像图片地址 (Req 3)',
`phone` VARCHAR(20) NULL DEFAULT NULL COMMENT '手机号 (可选的登录/找回凭据)',
`role` TINYINT NOT NULL DEFAULT 2 COMMENT '角色 (Req 2): 0=管理员, 1=员工, 2=注册用户',
`create_time` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '账号创建时间',
`update_time` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '信息最后修改时间',
`deleted` TINYINT NOT NULL DEFAULT 0 COMMENT '逻辑删除 (0=未删, 1=已删)',
PRIMARY KEY (`id`),
UNIQUE KEY `uk_user_name` (`user_name`),
UNIQUE KEY `uk_phone` (`phone`)
) ENGINE=InnoDB AUTO_INCREMENT=1001 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='用户信息表';
-
news_category(新闻分类表)-
id(INT, 主键, 自动增长) - 分类ID -
name(VARCHAR) - 分类名称 (如: “要闻”, “校园”, “科技”)
-
-- ----------------------------
-- 表 2: news_category (新闻分类表)
-- ----------------------------
CREATE TABLE `news_category` (
`id` INT NOT NULL AUTO_INCREMENT COMMENT '分类ID (主键)',
`name` VARCHAR(50) NOT NULL COMMENT '分类名称 (Req 5, 例如: "要闻", "校园")',
`sort_order` INT NOT NULL DEFAULT 0 COMMENT '排序权重 (数字越大越靠前)',
PRIMARY KEY (`id`),
UNIQUE KEY `uk_name` (`name`)
) ENGINE=InnoDB AUTO_INCREMENT=101 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='新闻分类表';
-
news_post(新闻贴子表)-
id(BIGINT, 主键, 自动增长) - 帖子ID -
author_id(BIGINT) - 作者ID (关联user.id) -
category_id(INT) - 分类ID (关联news_category.id) -
title(VARCHAR) - 标题 -
content(TEXT) - 内容 (存储纯文本或富文本HTML) -
cover_images(TEXT) - (Req 5) 封面图 (存储图片URL列表的JSON字符串, e.g.,["url1.jpg", "url2.png"]) -
status(TINYINT) - 状态 (0-草稿, 1-待审核, 2-已发布, 3-已驳回) -
view_count(INT) - 浏览量 -
like_count(INT) - 点赞量 (冗余字段,便于查询) -
comment_count(INT) - 评论量 (冗余字段,便于查询) -
create_time(DATETIME) -
update_time(DATETIME)
-
-- ----------------------------
-- 表 3: news_post (新闻贴子表)
-- ----------------------------
CREATE TABLE `news_post` (
`id` BIGINT NOT NULL AUTO_INCREMENT COMMENT '帖子ID (主键)',
`author_id` BIGINT NOT NULL COMMENT '作者ID (关联 user.id)',
`category_id` INT NOT NULL COMMENT '分类ID (关联 news_category.id)',
`title` VARCHAR(255) NOT NULL COMMENT '帖子标题 (Req 4)',
`content` TEXT NOT NULL COMMENT '帖子内容 (Req 4)',
`cover_images` TEXT NULL COMMENT '封面图 (Req 5, JSON数组: "[]"=纯文字, "[\"url1\"]"=单图)',
`status` TINYINT NOT NULL DEFAULT 1 COMMENT '帖子状态 (Req 7): 0=草稿, 1=待审核, 2=已发布, 3=已驳回',
`view_count` INT NOT NULL DEFAULT 0 COMMENT '浏览量',
`like_count` INT NOT NULL DEFAULT 0 COMMENT '点赞量 (冗余字段)',
`comment_count` INT NOT NULL DEFAULT 0 COMMENT '评论量 (冗余字段)',
`source` VARCHAR(255) NULL DEFAULT NULL COMMENT '来源 (Req 8, e.g., "原创", "爬虫: 某某网站")',
`create_time` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
`update_time` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
`deleted` TINYINT NOT NULL DEFAULT 0 COMMENT '逻辑删除 (0=未删, 1=已删)',
PRIMARY KEY (`id`),
KEY `idx_author_id` (`author_id`),
KEY `idx_category_id` (`category_id`),
KEY `idx_status` (`status`),
CONSTRAINT `fk_post_author` FOREIGN KEY (`author_id`) REFERENCES `user` (`id`),
CONSTRAINT `fk_post_category` FOREIGN KEY (`category_id`) REFERENCES `news_category` (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=10001 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='新闻贴子表';
-
comment(评论回复表)-
id(BIGINT, 主键, 自动增长) - 评论ID -
post_id(BIGINT) - 帖子ID (关联news_post.id) -
user_id(BIGINT) - 评论者ID (关联user.id) -
content(TEXT) - 评论内容 -
parent_id(BIGINT) - 父评论ID (0 表示对帖子的评论;>0 表示对评论的回复,实现“盖楼”) -
status(TINYINT) - 状态 (0-待审核, 1-已发布, 2-已屏蔽) -
create_time(DATETIME)
-
-- ----------------------------
-- 表 4: comment (评论回复表)
-- ----------------------------
CREATE TABLE `comment` (
`id` BIGINT NOT NULL AUTO_INCREMENT COMMENT '评论ID (主键)',
`post_id` BIGINT NOT NULL COMMENT '所属帖子ID (关联 news_post.id)',
`user_id` BIGINT NOT NULL COMMENT '评论者ID (关联 user.id)',
`content` TEXT NOT NULL COMMENT '评论内容 (Req 6)',
`parent_id` BIGINT NOT NULL DEFAULT 0 COMMENT '父ID (Req 6): 0=对帖子的评论, >0=对 comment.id 的回复',
`status` TINYINT NOT NULL DEFAULT 1 COMMENT '评论状态 (Req 7): 1=已发布, 2=待审核, 3=已屏蔽',
`like_count` INT NOT NULL DEFAULT 0 COMMENT '点赞量 (冗余字段)',
`create_time` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
`update_time` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间 (Req 6: 回复编辑)',
PRIMARY KEY (`id`),
KEY `idx_post_id` (`post_id`),
KEY `idx_user_id` (`user_id`),
KEY `idx_parent_id` (`parent_id`),
CONSTRAINT `fk_comment_post` FOREIGN KEY (`post_id`) REFERENCES `news_post` (`id`),
CONSTRAINT `fk_comment_user` FOREIGN KEY (`user_id`) REFERENCES `user` (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=20001 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='评论回复表';
-
likes(点赞关系表)-
id(BIGINT, 主键, 自动增长) -
user_id(BIGINT) - 点赞的用户ID -
target_id(BIGINT) - 目标ID (可能是post_id或comment_id) -
target_type(TINYINT) - 目标类型 (1-帖子, 2-评论) -
create_time(DATETIME) -
(设计思路:
user_id和target_id+target_type应该建立联合唯一索引,防止重复点赞)
-
-- ----------------------------
-- 表 5: likes (点赞关系表)
-- ----------------------------
CREATE TABLE `likes` (
`id` BIGINT NOT NULL AUTO_INCREMENT COMMENT '关系ID (主键)',
`user_id` BIGINT NOT NULL COMMENT '点赞用户ID (关联 user.id)',
`target_id` BIGINT NOT NULL COMMENT '目标ID (帖子ID或评论ID)',
`target_type` TINYINT NOT NULL COMMENT '目标类型 (Req 6): 1=帖子, 2=评论',
`create_time` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '点赞时间',
PRIMARY KEY (`id`),
UNIQUE KEY `uk_user_target` (`user_id`, `target_id`, `target_type`),
KEY `idx_target` (`target_id`, `target_type`),
CONSTRAINT `fk_likes_user` FOREIGN KEY (`user_id`) REFERENCES `user` (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=30001 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='点赞关系表';
-
sensitive_word(敏感字表)-
id(INT, 主键, 自动增长) -
word(VARCHAR, 唯一) - 敏感词
-
-- ----------------------------
-- 表 6: sensitive_word (敏感字表)
-- ----------------------------
CREATE TABLE `sensitive_word` (
`id` INT NOT NULL AUTO_INCREMENT COMMENT '唯一ID (主键)',
`word` VARCHAR(100) NOT NULL COMMENT '敏感词 (Req 7)',
`create_time` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '添加时间',
PRIMARY KEY (`id`),
UNIQUE KEY `uk_word` (`word`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='敏感字表';
1.3 丰富数据库 :使用DataGrip连接上数据库
**对你们的要求:自己动手实现 成功连上远程数据库
**1. 环境配置
- 按照上面的要求安装好软件
- 根据我发在群里的文件破解
2.连接远程数据库
- 点击数据库资源管理器左上角的+号
- 依次选择 数据源 -> Amzon
- 主机处输入
- 117.72.193.98
- 我的服务器
- 端口
- 3336
- (注意不是3306)
- 用户
- XHU_HeadLine
- 密码
- 114514
- 数据库
- xhu_headline
- 左下角测试连接
**3.插入数据
- 详细阅读以上表数据
- 插入部分表数据
1.4 搭建“后台”:Spring Boot 项目初始化
任务书要求: Java, SpringBoot, MyBatis, MVC。
**对你们的要求:看懂代码 理解架构
给零基础同学的话:理解 MVC - “餐厅运营模式”
我们的后端代码(SpringBoot)遵循 MVC 模式,这是一种高效的分工。
Model (模型): 指的是数据,比如一个
User对象(一个用户的信息)。View (视图): 指的是前端页面 (Vue)。
Controller (控制器): “餐厅服务员”。唯一和“顾客”(前端)打交道的人。负责接收前端发来的“点单”(请求)。
Service (服务): “餐厅厨师”。真正干活的人,负责处理复杂的“菜品”(业务逻辑),比如“注册时要加密密码”。
Mapper/DAO (数据访问): “仓库管理员”。只负责从“仓库”(数据库)里拿东西(
SELECT)或放东西(INSERT)。流程: 顾客点单 -> Controller(服务员) 接单 -> Service(厨师) 炒菜 -> Mapper(仓管) 取/放原料 -> 菜炒好了 -> 服务员上菜 -> 顾客拿到菜。
1. 创建项目
-
方式: 使用
IDEA->File->New Project...->Spring Initializr。 -
配置:
-
Group:
com.xhu(组织名) -
Artifact:
HeadLine_server(项目名) -
Type:
Maven -
Java Version:
17
-
-
核心依赖 (Dependencies) - (Maven 会帮我们下载):
-
Spring Web: 让我们能搭建“餐厅”(Web API)的基础。 -
MyBatis Framework: “仓库管理员”的操作手册,帮我们更方便地操作数据库。 -
MySQL Driver: 连接 MySQL 仓库的“驱动程序”。 -
Lombok: 简化代码的工具(如自动生成get/set,减少废话)。 -
后续需要再加
-
2. 配置项目 (application.properties)
在 src/main/resources/ 目录下找到该文件,配置“仓库”地址:
Properties
spring.application.name=XHU_HeadLine
# 服务器端口
server.port=8455
# 数据库配置
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
spring.datasource.url=jdbc:mysql://117.72.193.98:3336/xhu_headline?useUnicode=true&characterEncoding=utf-8&useSSL=false&serverTimezone=Asia/Shanghai
spring.datasource.username=XHU_HeadLine
spring.datasource.password=114514
3. 创建 MVC 结构 (包)
在 com.xhu.headline_server 包下创建以下子包(文件夹),这是我们的代码规范,让“厨房”井井有条:
-
controller: 存放“服务员” (Controller) -
service: 存放“厨师” (Service) -
mapper: 存放“仓库管理员” (Mapper) -
entity: 存放“数据模型” (如 User.java, NewsPost.java) -
config: 存放配置类 -
utils: 存放工具类
1.5 搭建“前台”:Vue 3 (后台管理) 项目初始化
- 待完成
1.6 实践:跑通第一个 CRUD (用户管理)
- 待完成