一.明确项目开发流程
-
编写需求文档
-
设计数据库表结构
-
定义项目接口清单
-
搭建项目框架环境
-
创建数据库实体类
-
编写 Controller 接口
-
编写 Service 业务逻辑
-
编写Mapper 数据操作
-
进行接口功能测试
-
开发前端页面
-
修复 BUG 优化功能
-
项目部署上线发布
二.编写需求文档
校园交流论坛项目需求文档(第一版)
1. 项目的核心目标
定位:校园交流论坛,用于学生之间发布、查看、交流信息。
用途:个人独立开发、积累完整项目经验、可写进简历,后期可正式上线使用。
使用场景:校内信息分享、学习交流、生活求助、兴趣讨论。
预期效果:支持日常几百人同时访问,运行稳定,核心流程无卡顿。
开发边界:先做最小可用版本,不做复杂高并发功能,不使用微服务。
2. 项目包含哪些用户角色
游客(未登录用户)
普通注册用户
管理员
3. 每个角色的核心需求
游客:浏览板块、查看帖子列表、查看帖子详情。
普通用户:注册、登录、修改密码;发帖、编辑自己的帖子、删除自己的帖子;查看个人中心、查看自己发的帖子。
管理员:管理用户(启用 / 禁用);审核帖子、删除违规帖子;管理论坛板块;查看基础数据。
4. 每个需求对应什么具体功能
; 用户与登录模块最后写。
发帖:填写标题、内容,选择板块,提交发布。
编辑帖子:仅可修改自己的帖子,修改后重新提交。
删除帖子:仅可删除自己的帖子,删除前确认。
浏览帖子:按时间倒叙展示
管理员审核帖子:查看待审核列表,通过 / 驳回并填写原因。
管理员管理用户:查看用户列表,可禁用 / 启用账号。
管理员管理板块:新增、修改、删除板块。
5. 项目需要哪些页面
注册页面
登录页面
忘记密码页面
论坛首页(板块列表)
板块帖子列表页
帖子详情页
发帖 / 编辑帖子页
个人中心页
管理员后台首页
管理员用户管理页
管理员帖子审核页
管理员板块管理页
6. 哪些功能必须做,哪些暂时不做
必须做(核心功能)
用户注册、登录、密码重置
发帖、编辑、删除自己的帖子
帖子浏览、详情查看
管理员审核帖子
管理员管理用户、管理板块
暂时不做(后续迭代)
评论、点赞、收藏
图片上传、附件上传
私信、通知
搜索、排序、置顶、精华
积分、等级、签到
敏感词过滤、验证码
7. 各角色的权限边界如何划分
游客:只能浏览,不能发帖、编辑、删除。
普通用户:只能管理自己的帖子,不能操作他人帖子,不能进后台。
管理员:拥有全部后台权限,可管理所有用户、所有帖子、所有板块。
越权处理:访问无权限接口,返回 "无操作权限"。
8. 功能的异常场景如何处理
登录:用户名不存在、密码错误、账号被禁用,给出对应提示。
注册:用户名已存在、密码不一致、格式错误,拦截并提示。
发帖:标题或内容为空,不允许提交。
编辑 / 删除:不是本人帖子,提示无权限。
审核:帖子已被删除,提示 "帖子不存在"。
系统异常:统一提示 "系统异常,请稍后再试"。
9. 项目的交互逻辑有哪些核心要求
帖子默认按最新发布时间倒序展示。
登录后跳转到首页。
发帖成功后跳转到帖子详情页。
删除操作必须二次确认。
管理员审核后,帖子状态同步更新。
页面操作后给出明确成功 / 失败提示。
三.设计数据库表结构
1.用户表
id INT 主键 自增
username VARCHAR(50) 用户名(唯一)
password VARCHAR(100) 密码
status TINYINT 0=禁用 1=正常
role TINYINT 0=普通用户 1=管理员
create_time DATETIME
2.板块表
id INT 主键 自增
name VARCHAR(50) 板块名称(如:学习交流、生活求助)
intro VARCHAR(255) 板块介绍
create_time DATETIME
3.帖子表
id INT 主键 自增
title VARCHAR(100) 帖子标题
content TEXT 帖子内容
user_id INT 发布人ID
board_id INT 所属板块ID(关联板块表)
status TINYINT 0=待审核 1=已通过 2=已驳回
create_time DATETIME
update_time DATETIME
4.审核表
id INT 主键 自增
post_id INT 帖子ID
admin_id INT 管理员ID
reason VARCHAR(255) 驳回原因
status TINYINT 1=通过 2=驳回
audit_time DATETIME
四.定义项目接口清单
<1>分析接口
1、用户模块接口(最后开发)
- 用户登录接口功能:用户输入用户名密码,完成登录
- 用户注册接口功能:新用户注册账号
- 密码重置接口功能:忘记密码,重置密码
- 获取当前登录用户信息接口功能:获取登录状态、用户名、角色权限
2、板块模块接口
- 查询所有板块列表接口功能:首页展示所有论坛板块
- 查询单个板块详情接口功能:进入板块,查看板块信息
- 管理员新增板块接口功能:管理员添加新板块
- 管理员修改板块接口功能:编辑板块名称、简介
- 管理员删除板块接口功能:删除无用板块
3、帖子模块接口(核心)
- 发布帖子接口功能:登录用户发布新帖子
- 修改自己的帖子接口功能:仅发布者可编辑自己的帖子
- 删除自己的帖子接口功能:仅发布者可删除自己的帖子
- 查询帖子列表接口功能:按时间倒序展示所有帖子
- 查询单个板块下的帖子列表接口功能:查看某个板块里的全部帖子
- 查询帖子详情接口功能:查看帖子完整内容
4、管理员审核接口
- 查询待审核帖子列表接口功能:管理员查看需要审核的帖子
- 审核帖子通过接口功能:管理员同意帖子发布
- 审核帖子驳回接口功能:管理员拒绝帖子,并填写原因
- 管理员删除任意帖子接口功能:删除违规内容
5、用户管理接口(管理员)
- 查询所有用户列表接口功能:管理员查看全部用户
- 禁用用户账号接口功能:禁止违规用户登录
- 启用用户账号接口功能:恢复被禁用用户
6、个人中心接口
- 查询自己发布的所有帖子接口功能:个人中心展示我的帖子
<2>生成接口文档
@1、用户模块接口(最后开发)
1. 用户登录接口
- 接口地址:
/user/login - 请求方式:
POST - 功能说明:用户输入用户名密码完成登录
- 请求参数:
- username:用户名
- password:密码
- 返回结果:
Result.success(用户信息)
2. 用户注册接口
- 接口地址:
/user/register - 请求方式:
POST - 功能说明:新用户注册账号
- 请求参数:
- username:用户名
- password:密码
- phone:手机号
- 返回结果:
Result.success()
3. 密码重置接口
- 接口地址:
/user/resetPassword - 请求方式:
POST - 功能说明:忘记密码,重置密码
- 请求参数:
- username:用户名
- newPassword:新密码
- 返回结果:
Result.success()
4. 获取当前登录用户信息接口
- 接口地址:
/user/info - 请求方式:
GET - 功能说明:获取登录状态、用户名、角色权限
- 返回结果:
Result.success(用户信息)
@2、板块模块接口
1. 查询所有板块列表接口
- 接口地址:
/category/list - 请求方式:
GET - 功能说明:首页展示所有论坛板块
- 返回结果:
Result.success(板块列表)
2. 查询单个板块详情接口
- 接口地址:
/category/get/{id} - 请求方式:
GET - 功能说明:进入板块,查看板块信息
- 返回结果:
Result.success(板块详情)
3. 管理员新增板块接口
- 接口地址:
/category/add - 请求方式:
POST - 功能说明:管理员添加新板块
- 请求参数:name、description
- 返回结果:
Result.success()
4. 管理员修改板块接口
- 接口地址:
/category/update - 请求方式:
POST - 功能说明:编辑板块名称、简介
- 返回结果:
Result.success()
5. 管理员删除板块接口
- 接口地址:
/category/delete/{id} - 请求方式:
DELETE - 功能说明:删除无用板块
- 返回结果:
Result.success()
@3、帖子模块接口(核心)
1. 发布帖子接口
- 接口地址:
/post/add - 请求方式:
POST - 功能说明:登录用户发布新帖子
- 请求参数:title、content、categoryId
- 返回结果:
Result.success()
2. 修改自己的帖子接口
- 接口地址:
/post/update - 请求方式:
POST - 功能说明:仅发布者可编辑自己的帖子
- 返回结果:
Result.success()
3. 删除自己的帖子接口
- 接口地址:
/post/delete/{id} - 请求方式:
DELETE - 功能说明:仅发布者可删除自己的帖子
- 返回结果:
Result.success()
4. 查询帖子列表接口
- 接口地址:
/post/list - 请求方式:
GET - 功能说明:按时间倒序展示所有帖子
- 返回结果:
Result.success(帖子列表)
5. 查询单个板块下的帖子列表接口
- 接口地址:
/post/listByCategory/{categoryId} - 请求方式:
GET - 功能说明:查看某个板块里的全部帖子
- 返回结果:
Result.success(帖子列表)
6. 查询帖子详情接口
- 接口地址:
/post/get/{id} - 请求方式:
GET - 功能说明:查看帖子完整内容
- 返回结果:
Result.success(帖子详情)
@4、管理员审核接口
1. 查询待审核帖子列表接口
- 接口地址:
/post/auditList - 请求方式:
GET - 功能说明:管理员查看需要审核的帖子
- 返回结果:
Result.success(列表)
2. 审核帖子通过接口
- 接口地址:
/post/auditPass/{id} - 请求方式:
POST - 功能说明:管理员同意帖子发布
- 返回结果:
Result.success()
3. 审核帖子驳回接口
- 接口地址:
/post/auditReject - 请求方式:
POST - 功能说明:管理员拒绝帖子,并填写原因
- 请求参数:id、reason
- 返回结果:
Result.success()
4. 管理员删除任意帖子接口
- 接口地址:
/post/adminDelete/{id} - 请求方式:
DELETE - 功能说明:删除违规内容
- 返回结果:
Result.success()
@5、用户管理接口(管理员)
1. 查询所有用户列表接口
- 接口地址:
/admin/user/list - 请求方式:
GET - 功能说明:管理员查看全部用户
- 返回结果:
Result.success(用户列表)
2. 禁用用户账号接口
- 接口地址:
/admin/user/disable/{id} - 请求方式:
POST - 功能说明:禁止违规用户登录
- 返回结果:
Result.success()
3. 启用用户账号接口
- 接口地址:
/admin/user/enable/{id} - 请求方式:
POST - 功能说明:恢复被禁用用户
- 返回结果:
Result.success()
@6、个人中心接口
1. 查询自己发布的所有帖子接口
- 接口地址:
/user/myPosts - 请求方式:
GET - 功能说明:个人中心展示我的帖子
- 返回结果:
Result.success(我的帖子列表)
<3>效果图

五.搭建项目框架环境1.创建springboot项目

上图仅供参考,具体请看下面
1.创建springboot项目
2.勾选依赖
<1>spring web
<2>MySQL Driver
<3>MyBatis Framework
3.配置数据库
# 1. 数据库连接地址 # localhost=本机 3306=MySQL端口 campushub=数据库名 spring.datasource.url=jdbc:mysql://localhost:3306/campushub?useSSL=false&serverTimezone=UTC # 2. 数据库用户名(默认都是root) spring.datasource.username=root # 3. 数据库密码(你自己的密码) spring.datasource.password=1234 # 4. 数据库驱动(固定写法,不用改) spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver # 5. MyBatis映射文件路径(固定写法,不用改) mybatis.mapper-locations=classpath:mapper/*.xml
4.创建数据库表
-- 使用你的项目数据库
-- ==============================
-- 1. 用户表
-- ==============================
CREATE TABLE user (
id INT PRIMARY KEY AUTO_INCREMENT COMMENT '用户ID',
username VARCHAR(50) NOT NULL UNIQUE COMMENT '账号',
password VARCHAR(100) NOT NULL COMMENT '密码',
nickname VARCHAR(50) COMMENT '昵称',
create_time DATETIME DEFAULT NOW() COMMENT '创建时间'
) COMMENT = '用户表';
-- ==============================
-- 2. 帖子表
-- ==============================
CREATE TABLE post (
id INT PRIMARY KEY AUTO_INCREMENT COMMENT '帖子ID',
title VARCHAR(200) NOT NULL COMMENT '标题',
content TEXT NOT NULL COMMENT '内容',
user_id INT COMMENT '发布人ID',
create_time DATETIME DEFAULT NOW() COMMENT '发布时间',
FOREIGN KEY (user_id) REFERENCES user(id)
) COMMENT = '帖子表';
-- ==============================
-- 3. 评论表
-- ==============================
CREATE TABLE comment (
id INT PRIMARY KEY AUTO_INCREMENT COMMENT '评论ID',
content VARCHAR(500) NOT NULL COMMENT '评论内容',
post_id INT COMMENT '所属帖子ID',
user_id INT COMMENT '评论人ID',
create_time DATETIME DEFAULT NOW() COMMENT '评论时间',
FOREIGN KEY (post_id) REFERENCES post(id),
FOREIGN KEY (user_id) REFERENCES user(id)
) COMMENT = '评论表';
5.创建controller,service,mapper,entity,common包
六.创建数据库实体类
1.创建实体类对象
comment
package com.campus.campushub.entity;
import lombok.Data;
import java.time.LocalDateTime;
@Data
public class Comment {
private Long id;
private Long postId; // 帖子ID
private Long userId; // 评论人ID
private String content; // 评论内容
private LocalDateTime createTime;
}
post
package com.campus.campushub.entity;
import lombok.Data;
import java.time.LocalDateTime;
@Data
public class Post {
private Long id;
private Long userId; // 发布人ID
private String title; // 标题
private String content; // 内容
private LocalDateTime createTime;
}
user
package com.campus.campushub.entity;
import lombok.Data;
@Data
public class User {
private Long id;
private String username;
private String password;
private String phone;
private String avatar;
}
2.创建Result对象
package com.campus.campushub.common;
import lombok.Data;
/**
* 统一返回结果类
* 所有接口都用这个返回
*/
@Data
public class Result<T> {
// 响应状态码:200成功 500失败
private Integer code;
// 响应消息
private String msg;
// 响应数据
private T data;
// 成功返回(不带数据)
public static <T> Result<T> success() {
Result<T> result = new Result<>();
result.setCode(200);
result.setMsg("操作成功");
return result;
}
// 成功返回(带数据)
public static <T> Result<T> success(T data) {
Result<T> result = new Result<>();
result.setCode(200);
result.setMsg("操作成功");
result.setData(data);
return result;
}
// 失败返回
public static <T> Result<T> error(String msg) {
Result<T> result = new Result<>();
result.setCode(500);
result.setMsg(msg);
return result;
}
}
3.效果图
