概括

0.1 项目整体介绍

根据任务书实现西华头条系统开发。

本课题拟模仿目前流行的网络应用设计一款针对西华的传媒应用。本系统能实现用户管理、各类不同的新闻管理、新闻发起、用户交互管理、分享扩散等功能。要求本应用达到或接近目前网络上流行应用质量。根据题目主要要求,可参考“今日头条”,“抖音”,“百度贴吧”。

具体要求

  1. 数据库设计: 参考网上同类网站,设计出数据库

  2. 用户分类模块:管理员、员工、注册用户、一般访客。不同级别用户在登陆后的操作权限不同。

  3. 用户信息维护模块:用户注册(含头像)、用户登录、浏览个人信息、编辑个人信息。

  4. 新闻贴子基本数据管理模块:实现各类数据的录入(带文件)、数据修改、删除等维护功能。

  5. 用户查看新闻模块:针对不同类型的新闻(纯文字、带1张图片、带多张图片,要闻)实现不同风格的查看界面

  6. 对贴子点赞、回复模块:实现用户对新闻点赞,回复,用户可以对自己的点赞取消和回复编辑。

  7. 管理员对帖子和回复审核功能模块:建立敏感字数据表,针对表中的的敏感字进行过滤。

  8. 爬取其它指定网站新的新闻贴子,或爬取指定关键字相关的贴子并存放到自己数据库

  9. 严格按照MVVC模式开发,至少解决3种及以上安全设计问题


0.2 具体实现流程

通过多个阶段完成

  1. 阶段一:奠定基石 (后台管理与数据库)

    • 完成开发环境配置

    • 完成表设计

    • 完成用户分类模块、信息维护模块

    • 后台管理系统初步构建

    • 基础的增删改查 (CRUD)

  2. 阶段二:用户端与身份认证

    • 用户端设计

    • 基础身份校验功能,登录认证实现 (JWT)

    • 新闻帖子数据管理模块

  3. 阶段三:核心业务与安全

    • 回复审核功能模块

    • 爬虫功能模块

    • 并发测试

  4. 阶段四:性能与进阶 (根据项目进度待定)

    • 引入Redis优化性能(缓存、计数)

    • 压力并发测试

    • 基于 WebSocket 的实时通知

    • 互斥、分布式锁保证安全

    • 微服务部分


第一阶段:奠定基石(后台管理与数据库)

目标: 所有人把“开发工厂”建好(配好环境),并搭建起项目的“毛坯房”(数据库和后端框架),最后打通一个最基础的功能(用户管理)。

1.1 开发环境配置

后端

  1. JDK 17

    • 作用: Java 开发工具包。就像我们的“中文(Java)字典和语法书”,让电脑能看懂我们写的Java代码。
  2. IntelliJ IDEA (Ultimate Edition)

    • 作用: 我们的“集成开发环境”(IDE),也就是写后端代码的“智能厨房”。它提供了自动提示、纠错等功能,比记事本强大无数倍。
  3. Maven

    • 作用: 项目的“物流管理员”。我们项目中需要用到很多别人的“轮子”(第三方库,如SpringBoot),Maven可以帮我们自动下载和管理这些“轮子”,我们不需要自己到处找。
  4. MySQL (最好是 5.7.4.3)

    • 作用: 我们的“数据大仓库”(数据库)。所有用户信息、帖子、评论都存在这里。

    • 安装教程: Mysql 5.7.43下载安装配置 (请严格按照教程配置)

  5. DataGrip

    • 作用: 数据库的“可视化管理”工具。MySQL仓库本身是黑乎乎的命令行,DataGrip 给了我们一个“窗户”,可以直观地用鼠标看数据、改数据

    • 安装地址 :DataGrip | JetBrains for Data

    • idea也可以在这里下

  6. Git

    • 作用: 代码的“时光机”与“协作工具”。

    • 时光机: 它可以帮你保存代码的每一个版本,写错了可以随时“穿越”回之前的版本。

    • 协作: 你们三个人写的代码,最后可以通过 Git 合并在一起,而不会互相覆盖。

    • 教程: git的安装和配置

    • 项目地址: yumoni6809/XHU_HeadLine (大家把项目 fork 到自己账号,再 clone 到本地)

前端

  1. Node.js (LTS 18+)

  2. VS Code (Visual Studio Code)

    • 作用: 前端的“智能厨房”(IDE),用来写 Vue 代码。它轻量、插件多。

    • 教程: VS Code 安装与插件配置 (注意安装教程里提到的 Vue Language Features (Volar) 插件)

  3. Vue CLI (Command Line Interface)

    • 作用: Vue 的“项目脚手架”(脚手架 = 快速搭建工具)。我们不用从零开始建文件,它能一键帮我们生成 Vue 项目的“毛坯房”。

    • 安装命令 (在电脑终端或CMD运行):

       npm install -g @vue/cli

1.2 数据库设计

任务书要求: 设计数据库,支持用户分类。

在设计表之前,我们先明确几个核心“实体”以及它们的关系:

  1. 用户 (User):系统的基础,可以发布帖子

  2. 帖子 (NewsPost):由用户发布,属于某个分类

  3. 分类 (Category):用于组织帖子(如 “要闻”)。

  4. 评论 (Comment)用户可以对帖子发表评论评论之间也可以互回。

  5. 点赞 (Like)用户可以对帖子评论进行点赞。

  6. 敏感词 (SensitiveWord):用于审核帖子评论

关系图景:

  • 一个用户可以发布多个帖子和多个评论

  • 一个帖子只能有一个作者(用户),但可以有多个评论

  • 一个帖子只属于一个分类

  • 一个点赞记录了“哪个用户”赞了“哪个帖子/评论”。

核心表设计 :

  1. 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='用户信息表';
  1. 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='新闻分类表';
  1. 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='新闻贴子表';
  1. 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='评论回复表';
  1. likes (点赞关系表)

    • id (BIGINT, 主键, 自动增长)

    • user_id (BIGINT) - 点赞的用户ID

    • target_id (BIGINT) - 目标ID (可能是 post_idcomment_id)

    • target_type (TINYINT) - 目标类型 (1-帖子, 2-评论)

    • create_time (DATETIME)

    • (设计思路: user_idtarget_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='点赞关系表';
  1. 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 (用户管理)

  • 待完成

第二阶段:用户端与身份认证体系


第三阶段:核心功能深度实现


第四阶段 (进阶):性能优化与架构演进


想温柔的对待这个世界