又到一年毕业季,后台咨询里“Java毕设”“Spring Boot源码”“部署说明”这类关键词明显多了起来。我每年都会接到不少同学的提问:想做一个基于Spring Boot的管理系统,但又不知道该选什么题,或者怕选了题做不出东西。今天挑一个很典型的题目来拆——慢性病健康知识科普管理系统。这题本身不稀奇,但它的业务场景、功能边界、技术落地点都控制得很好,非常适合作为Spring Boot毕设实战项目。
我会按自己实际带项目、也亲手做过类似系统的方式,把这个题从需求分析、技术选型、数据库设计,到核心代码实现、部署打包、文档整理和演示视频录制,完整走一遍。你如果正卡在这个题或同类管理系统上,这篇文章可以直接当“作战指南”用,文里所有配置、代码片段、坑点都是我验证过的思路,照着做能省下大量试错时间。
1. 项目选题与整体设计思路
1.1 为什么选“慢性病健康知识科普管理系统”这个题
先说选题逻辑。毕设题目最重要的一点是:功能边界清楚,深度可调节,而且答辩时能讲出“做了什么事”。慢性病健康知识科普管理系统作为管理类系统,表面看和“图书管理系统”“学生信息管理系统”差不多,都是增删改查。但它的差异点在于业务场景很具体——面向的是慢病患者、家属、健康关注人群,做的是健康资讯的发布、分类、检索、互动。这就让整个系统有了真实的使用逻辑,而不是一个干巴巴的CRUD空壳。
这个题另一个好处是功能能浅能深。基础版就是文章管理加用户管理,进阶版可以加入健康自测问卷、资讯收藏、评论互动、数据统计看板。哪怕你只做基础版,只要把模块间的关系讲清楚,老师和评委不会觉得单薄;如果时间和精力允许,我建议在核心流程跑通后,挑一个亮点模块做深,比如健康自测的问卷计分逻辑,或者资讯推荐的热度排序。
从技术训练角度看,这个题覆盖了Spring Boot项目开发的主线:用户认证、权限区分、数据建模、CRUD接口、分页搜索、统一异常处理。做完后,你收获的不只是一个能交差的毕设,而是一整套对Web项目结构的整体感知。这对后续找Java开发相关工作,是一个极其直观的练手项目。
1.2 技术栈选型:从Spring Boot到前端方案
技术选型往往是很多同学纠结的地方。我直接给出自己用下来最稳的组合:
- 后端框架:Spring Boot 2.7.18。这里特别提醒一下,很多同学一上来就选了Spring Boot 3.x,结果JDK还是1.8,项目直接起不来。Spring Boot 3.x强制要求JDK 17及以上,如果不想换环境,老老实实用2.7.18,它是2.x系列最后一个版本,稳定且生态兼容好。
- 持久层框架:MyBatis-Plus 3.5.3。为什么不用原生MyBatis?因为毕设时间紧张,单表CRUD用MyBatis-Plus能省下大量XML编写时间,它的BaseMapper内置了增删改查方法,分页插件也现成,学习成本比原生MyBatis低很多。
- 数据库:MySQL 5.7或8.0都行,没有特殊要求。推荐8.0,安装时记得选utf8mb4字符集,避免中文乱码。
- 权限认证:JWT(JSON Web Token)。Session方案虽然简单,但前后端分离或需要接口鉴权时,JWT无状态、好解释,答辩时也能把这个点作为技术亮点。
- 前端方案:如果基础一般,直接用Thymeleaf模板引擎加Bootstrap/Element UI的CDN资源,页面少但够用。如果熟练,可以做Vue前后端分离,但那样工作量会明显增大。多数同学做毕设是为了顺利毕业,我建议别在复杂的前端构建上耗费时间。
这套组合的核心优势在于:它不需要额外的中间件服务,不需要复杂的部署环节,一个jar包就能跑起来,对最终录制演示视频和写部署说明都特别友好。
1.3 功能模块拆解:两类端各做什么
需求不明确是很多同学写代码写到一半崩掉的原因。这个系统我是按两类用户来拆的:
普通用户(C端):
- 注册、登录,登录后才能收藏文章、发表评论
- 浏览科普文章列表,按分类筛选,按关键词搜索
- 查看文章详情,查看浏览量
- 收藏和取消收藏文章
- 参与健康自测问卷,查看测评结果
管理员(B端):
- 登录后台:管理员账号由数据库预置,不开放注册
- 分类管理:维护文章所属分类,如高血压、糖尿病、合理膳食
- 文章管理:发布、编辑、删除文章,支持草稿和发布状态切换,设置是否推荐首页
- 评论管理:查看和删除不当评论
- 用户管理:查看注册用户列表,禁用异常账号
- 数据看板:统计文章数量、用户数量、今日浏览量等
模块设计就是这样一张清晰的图。我强烈建议你在动手前先把这些模块写到纸上,每条对应哪几个接口、哪几张表,都列出来。先画好图再写代码,是避免返工最重要的一件事。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 数据库设计与核心模块细节
2.1 数据表设计:从需求到落地
数据库是管理系统的地基,表结构设计得不合理,后面接口写起来全是泪。我这个系统一共设计了六张核心表,分别是用户表、分类表、文章表、评论表、收藏表、健康自测记录表。这里挑三张重点表讲讲。
用户表(sys_user)
| 字段名 | 类型 | 说明 |
|---|---|---|
| id | bigint | 主键,自增 |
| username | varchar(50) | 用户名,唯一 |
| password | varchar(100) | BCrypt加密后的密码 |
| nickname | varchar(50) | 昵称 |
| role | varchar(20) | 角色:admin/user |
| status | tinyint | 状态:1正常,0禁用 |
| created_time | datetime | 创建时间 |
特别注意角色字段。很多同学喜欢单独建一张角色表,再建用户角色关联表,但如果系统只有两种角色,完全没有必要搞三张表,一个role字段足够了,简单高效,答辩时也说得通。
分类表(article_category)
| 字段名 | 类型 | 说明 |
|---|---|---|
| id | bigint | 主键 |
| name | varchar(50) | 分类名称 |
| sort | int | 排序号 |
| status | tinyint | 状态:1启用,0停用 |
文章表(article)
| 字段名 | 类型 | 说明 |
|---|---|---|
| id | bigint | 主键 |
| category_id | bigint | 所属分类 |
| title | varchar(100) | 标题 |
| cover | varchar(255) | 封面图URL |
| summary | varchar(255) | 摘要 |
| content | text | 正文内容 |
| status | tinyint | 状态:0草稿,1已发布 |
| is_recommend | tinyint | 是否推荐:0否,1是 |
| view_count | int | 浏览量 |
| created_time | datetime | 创建时间 |
| update_time | datetime | 更新时间 |
这里想提醒几个细节:文章表里要有summary字段,列表页展示摘要,避免每次查全表都把大字段content捞出来;view_count平时可以直接+1,到数据量大了再考虑异步刷新,毕设不用过度设计;status字段一定要有,因为“草稿和发布”是内容管理系统的标准需求,答辩时这就是一个贴合业务场景的细节。
2.2 用户权限体系:角色区分与登录认证
权限部分我用的是JWT加拦截器方案。具体逻辑是:用户登录成功后,后端根据用户id、用户名、角色生成一个token返回给前端;前端后续请求在请求头里带上这个token;后端加一个拦截器,拦截所有需要登录才能访问的接口,从token解析出用户信息,再判断角色权限。
为什么选JWT而不是Session?核心原因是无状态。Session依赖服务器端存储,如果页面刷新、Session过期、服务重启,登录状态容易丢;JWT把用户状态加密装在token里,客户端自己保存,服务端只要验签就行。这个思路虽然简单,却是当前主流的接口鉴权方式,面试也常问。
具体实现时,我建议用io.jsonwebtoken:jjwt这个库,它生成和解析token的API很简洁。生成token时设置过期时间,我一般设24小时,并额外存一个user_id字段方便在做权限判断时直接取用。
拦截器里要放行登录、注册、文章列表、文章详情、分类列表这些公开接口,其他接口一律校验token。放行配置可以用Spring Boot的拦截器注册类完成,写起来很顺手。
2.3 科普文章模块:发布到展示的完整闭环
文章模块是整个系统的核心。管理员发布文章时,需要选择分类、填写标题、上传封面、写摘要、编辑正文。正文编辑我建议直接用一个开源的Markdown编辑器,或者富文本编辑器,不推荐自己从头写编辑器,那是一个巨大的坑。用JQuery版或者原生版轻量编辑器,后端接收HTML文本直接存库,展示时用Thymeleaf的th:utext渲染即可。
首页的文章列表按发布时间倒序,也可以在列表页增加搜索框,前端传一个keyword参数,后端在标题和摘要字段上做模糊查询。推荐位文章在首页单独展示,这个通过is_recommend字段筛选,结合创建时间排序。
文章详情页除了展示正文,还要做浏览量的累加,以及收藏按钮、评论列表。浏览量更新我建议写在详情查询接口里,一次查询就把count加一,这虽然不是一个高并发方案,但对毕设场景来说完全够用,而且逻辑直观。
收藏和评论都是关联表,分别记录用户与文章的关联关系。收藏表有唯一约束,防止用户重复收藏同一篇文章;评论表记录用户id、文章id、内容、时间,删除时管理员可以直接通过评论管理接口删除。
3. 环境准备与项目搭建实操
3.1 手把手版本清单:JDK、Maven、MySQL、IDEA
开始写代码前,先把环境一次配齐。我见过太多同学卡在环境问题上,第一节课就浪费两天。这里我给出一份经过验证的版本组合:
- JDK:1.8(对应Spring Boot 2.7.x)
- Maven:3.6.3或3.8.x,建议用IDEA自带的Maven
- MySQL:5.7或8.0,本地开发用8.0没问题
- IDEA:2022.1或更高版本,社区版做Spring Boot也够用,但Ultimate版对Spring的提示更友好
- Lombok插件:新版IDEA自带,没有的话到Plugins里装一个
一个特别常见的坑是:IDEA导入项目后,Lombok报错“you aren't using a compiler supported by lombok”,这通常是因为IDEA里的Annotation Processing没有开启。在Settings -> Build, Execution, Deployment -> Compiler -> Annotation Processors里勾选Enable annotation processing,重启后Lombok就正常了。这个坑每年都有大量同学踩,提前写好能帮你避开。
3.2 初始化项目:依赖怎么选
打开IDEA,新建Spring Initializr项目,填写Group和Artifact,比如com.shop和health-system。Type选Maven,Java版本选8。依赖先勾上这几个:
- Spring Web(提供MVC能力和内置Tomcat)
- MySQL Driver(数据库连接驱动)
- Lombok(简化实体类代码)
- Validation(做参数校验)
等基础项目生成好以后,还需要手动往pom.xml里加入MyBatis-Plus依赖,以及JWT依赖。我给出核心依赖片段:
xml复制<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>3.5.3.1</version>
</dependency>
<dependency>
<groupId>io.jsonwebtoken</groupId>
<artifactId>jjwt-api</artifactId>
<version>0.11.5</version>
</dependency>
<dependency>
<groupId>io.jsonwebtoken</groupId>
<artifactId>jjwt-impl</artifactId>
<version>0.11.5</version>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>io.jsonwebtoken</groupId>
<artifactId>jjwt-jackson</artifactId>
<version>0.11.5</version>
<scope>runtime</scope>
</dependency>
为什么用MyBatis-Plus 3.5.3.1?因为这个版本对Spring Boot 2.x的兼容性最好,不会出现启动时Bean冲突。如果依赖版本太高,可能会和Spring Boot 2.7的内部组件不匹配。
3.3 核心配置详解:application.yml该怎么写
Spring Boot的核心配置都在application.yml里。我的习惯是分环境,本地开发用application-dev.yml,生产打包用application-prod.yml,避免不同环境反复改配置。核心配置如下:
yaml复制server:
port: 8080
spring:
datasource:
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://localhost:3306/health_db?useUnicode=true&characterEncoding=utf8&useSSL=false&serverTimezone=Asia/Shanghai
username: root
password: 123456
jackson:
date-format: yyyy-MM-dd HH:mm:ss
time-zone: GMT+8
servlet:
multipart:
max-file-size: 10MB
max-request-size: 20MB
mybatis-plus:
configuration:
map-underscore-to-camel-case: true
log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
global-config:
db-config:
logic-delete-field: deleted
logic-delete-value: 1
logic-not-delete-value: 0
jwt:
secret: your-secret-key-your-secret-key
expire: 86400
这里有三个小的关键点。第一,数据库URL里必须加上serverTimezone=Asia/Shanghai,否则MySQL 8.0连接会报时区异常。第二,map-underscore-to-camel-case要开启,这样数据库的下划线字段会自动映射为实体类的驼峰属性,字段名不用再手工别名。第三,jwt.secret要尽量复杂一些,至少32位,不然jjwt工具类会报密钥太短的问题。
配置文件之后,记得在启动类上加上@MapperScan注解,扫描Mapper接口所在包。这一步漏掉的话,MyBatis-Plus的Mapper无法注入,启动时会报一堆找不到Bean的错误。
4. 关键功能实现与代码走读
4.1 统一返回结果Result:前端协议从第一天就定义好
做接口开发前,我强烈建议先定好统一返回结构。前端拿到的不应该是乱七八糟的Map或直接返回实体。我通常会写一个泛型Result类:
java复制@Data
public class Result<T> {
private Integer code;
private String message;
private T data;
public static <T> Result<T> success(T data) {
Result<T> result = new Result<>();
result.setCode(200);
result.setMessage("success");
result.setData(data);
return result;
}
public static <T> Result<T> error(String message) {
Result<T> result = new Result<>();
result.setCode(500);
result.setMessage(message);
return result;
}
}
代码很简单,但作用很大。它让前端处理逻辑变得统一:先看code是不是200,是就取data,不是就提示message。任何接口都返回Result,这样即使某个接口出错了,前端也不会因为拿不到data而崩溃。做登录、注册等接口时,返回的Result里还能携带token或错误信息,调试效率高很多。
4.2 登录认证实现:JWT生成与拦截器校验
登录接口是系统的入口。我以管理员登录为例,说明完整流程。其实普通用户登录几乎一样,只是角色不同。
java复制@PostMapping("/admin/login")
public Result<Map<String, Object>> login(@RequestBody LoginDTO loginDTO) {
String username = loginDTO.getUsername();
String password = loginDTO.getPassword();
User user = userMapper.selectOne(new LambdaQueryWrapper<User>()
.eq(User::getUsername, username));
if (user == null) {
return Result.error("用户不存在");
}
if (!passwordEncoder.matches(password, user.getPassword())) {
return Result.error("密码错误");
}
if (user.getStatus() == 0) {
return Result.error("账号已被禁用,请联系管理员");
}
String token = jwtUtil.generateToken(user.getId(), user.getUsername(), user.getRole());
Map<String, Object> data = new HashMap<>();
data.put("token", token);
data.put("username", user.getUsername());
data.put("role", user.getRole());
return Result.success(data);
}
密码校验用BCryptPasswordEncoder的matches方法,它是不可逆加密,比MD5安全得多。数据库里存的password字段是BCrypt加密后的字符串,不是明文,这也是毕设里一个很加分的点。
拦截器我写一个AuthInterceptor,实现HandlerInterceptor接口。在preHandle方法里取请求头的Authorization字段,去掉Bearer前缀,调用JWT工具类解析。解析成功就把用户id放到request的attribute里,controller方法可以直接取用;解析失败直接返回401状态码加错误json,不放行。
注意一个常见的坑:使用Thymeleaf时,如果页面渲染也会经过拦截器,你需要把静态资源和渲染路径全放行,否则登录页面的css、js全部加载不出来,页面看起来是“裸奔”的。放行配置在WebConfig里,addPathPatterns和excludePathPatterns要写清楚。
4.3 文章分页查询:MyBatis-Plus分页插件配置与使用
文章列表接口是典型的分页加条件查询。MyBatis-Plus提供了一套非常方便的分页方案,但需要先配置一个分页插件:
java复制@Configuration
public class MybatisPlusConfig {
@Bean
public MybatisPlusInterceptor mybatisPlusInterceptor() {
MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
interceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.MYSQL));
return interceptor;
}
}
没有这个配置,调用分页方法时page对象返回的记录列表是空的,这个坑我见过很多次。配置好之后,接口里写起来就会非常简洁:
java复制@Override
public Page<ArticleVO> getArticlePage(Integer pageNum, Integer pageSize, String keyword, Long categoryId) {
Page<ArticleVO> page = new Page<>(pageNum, pageSize);
LambdaQueryWrapper<Article> wrapper = new LambdaQueryWrapper<>();
wrapper.eq(Article::getStatus, 1)
.eq(categoryId != null, Article::getCategoryId, categoryId)
.and(StringUtils.hasText(keyword), w -> w
.like(Article::getTitle, keyword)
.or()
.like(Article::getSummary, keyword))
.orderByDesc(Article::getIsRecommend)
.orderByDesc(Article::getCreatedTime);
return articleMapper.selectPage(page, wrapper);
}
这里用了条件构造器的eq方法重载,第一个参数是boolean条件,条件为true才拼接这个查询条件,这样就不用写一堆if判断了。搜索时用title和summary两个字段做模糊匹配,用and方法包裹or,避免SQL拼接优先级错误。列表页还可以顺手查一下分类名,返回一个VO对象,把分类名补进去,前端展示更直接。
4.4 健康自测模块:问券计分的亮点实现
这个模块是我额外推荐加的一个“亮点”。原理不复杂:在数据库里建一张问卷问题表,每个问题对应一个选项分数,用户提交答案后,后端计算总分,按区间返回结果和建议。它可以是一个简单的问卷服务Controller,甚至不需要复杂的关系表,但呈现出的“系统价值”会明显高于基础CRUD。
比如高血压风险评估问卷,一共十道题,每个选项分值为0到3分,总分0到10分为低风险,11到20分为中风险,21到30分为高风险。后端通过循环遍历提交答案列表,累加得分,再查询一个结果建议表,返回对应的建议文案。
这篇设计的小逻辑可以写进论文里,“通过定量评估用户自测结果并匹配健康建议”,听起来就比普通增删改查项目高级不少。而且实现成本低,非常适合在中期检查或结题答辩时放在PPT上重点讲。
5. 部署与打包:从本地到服务器
5.1 本地打包:mvn clean package的完整流程
项目开发完成后,要把它打包成可直接运行的jar包。在IDEA右侧Maven面板里,先执行clean,再执行package。执行package时可能会触发单元测试,如果测试类里没有特殊逻辑,我建议用-DskipTests跳过,避免打包因为测试环境失败:
bash复制mvn clean package -DskipTests
打包完成后,在target目录下会生成一个health-system-0.0.1-SNAPSHOT.jar。在本地要验证能否运行,直接执行:
bash复制java -jar health-system-0.0.1-SNAPSHOT.jar
启动日志出现Started HealthSystemApplication就是成功了。如果首页能打开,说明jar包正常。这里有个容易踩的坑:如果本地测试时把端口8080占用了,会报Port 8080 was already in use。处理方法很简单,要么改端口,要么杀掉占用进程。Windows下先找到进程:
bash复制netstat -ano | findstr 8080
taskkill /pid 2123 /f
Linux或macOS下用:
bash复制lsof -i:8080
kill -9 进程号
5.2 服务器三选一:jar、systemd还是Docker
部署方式我推荐按场景选。如果只是临时演示,直接java -jar临时起一个进程就够了;如果要稳定跑一段时间,建议配置成systemd服务,开机自启、日志收集、进程守护都有了。我习惯在服务器上做这样一件事:写一个health.service单元文件,放到/etc/systemd/system/下,内容如下:
ini复制[Unit]
Description=Health System
After=network.target
[Service]
Type=simple
User=root
WorkingDirectory=/opt/health
ExecStart=/usr/bin/java -jar health-system-0.0.1-SNAPSHOT.jar
Restart=always
RestartSec=10
[Install]
WantedBy=multi-user.target
之后通过systemctl daemon-reload、systemctl start health、systemctl status health管理服务。这样即使服务器重启,服务也会自动拉起,比手输命令行可靠得多。
如果你喜欢Docker,也可以为Spring Boot 2.7项目写一个简单的Dockerfile:
dockerfile复制FROM openjdk:8-jdk-alpine
WORKDIR /app
COPY target/health-system-0.0.1-SNAPSHOT.jar app.jar
EXPOSE 8080
ENTRYPOINT ["java", "-jar", "app.jar"]
构建镜像时注意,基础镜像要选openjdk:8,因为项目用的是JDK1.8,如果你选的是openjdk:17,跑起来分分钟报class版本错误,那会让人非常抓狂。
5.3 前端资源和数据库初始化:部署前最后一步
如果前端用的是Thymeleaf模板,那么jar包已经包含了所有静态资源和页面模板,不需要额外部署前端。但要记得把最新SQL脚本在服务器数据库上执行一遍,把数据库初始化好,否则后端启动后查询接口会报表不存在的错误。
我建议把建表SQL放在项目的src/main/resources/sql/目录下,这样交付源码时自带初始化脚本,部署说明里也只需要写一句“执行该目录下的init.sql”即可。同时提醒一句:服务器MySQL的时区配置最好和本地一致,否则后端插入时间会出现8小时的偏移。可以在MySQL连接URL里直接加serverTimezone=Asia/Shanghai解决,稳妥。
6. 毕设交付里的那些事:源码、LW、演示视频
6.1 交付物不该只是“能跑的代码”
一个完整的毕设项目,源码只占一部分。按目前不少高校的要求和实际答辩情况,你最好准备齐这几样东西:源码工程、论文/说明文档(LW)、部署说明、演示视频、答辩PPT。这五样合起来就是标题里说的“一条龙”。
这套交付逻辑其实很有价值。很多同学觉得“代码跑通就完事了”,但答辩时老师根本没时间一行行看你的代码,更多是看你怎么讲,怎么证明系统是你自己做的。一份逻辑清晰的说明文档,一段流畅的演示视频,能大幅提高通过率,也让整个项目看起来更完整专业。
6.2 LW文档各章节怎么组织
写论文或说明文档时,我建议按照经典软件工程流程来组织。对于这个系统,大致章节如下:
- 第一章绪论:写研究背景与意义,可以落脚到慢病高发背景、健康科普必要性、信息化管理工具的作用。这里不用写太宏大,两三页即可。
- 第二章需求分析:分普通用户和管理员用户,写功能需求、用例描述、非功能需求。
- 第三章系统设计:画出或描述总体架构、功能模块图、技术选型、数据库ER图和数表说明。
- 第四章系统实现:按模块贴关键代码和截图,讲实现思路。
- 第五章系统测试:写功能测试用例表,包括用例编号、操作步骤、预期结果、实际结果。
- 第六章总结:简单写个人收获和不足即可。
写文档最忌讳的是大量截图堆砌和代码堆砌。每个功能模块配一个核心代码片段加一到两张运行截图,用文字讲清楚逻辑,是最合适的篇幅。文档排版我用Word自带的标题样式,自动生成目录,方便老师翻阅。
6.3 演示视频录制的实用技巧
演示视频别录太长,5到8分钟足够。录制前先写一个演示提纲,顺序建议这样:
- 开头30秒:介绍系统名称、技术栈、面向人群
- 2分钟:演示首页,说明文章分类、推荐位、文章列表
- 2分钟:演示用户注册、登录、查看文章详情、收藏、评论
- 2分钟:演示管理员后台,文章发布、分类管理、评论删除
- 1分钟:演示健康自测模块
录制时用OBS或EV录屏,分辨率至少1080p,操作鼠标时速度放慢,关键页面停顿两秒再点击交互,方便评阅人看清。如果不想露脸,可以纯屏幕录制加麦克风讲解,声音清晰清楚,比花哨特效重要得多。视频文件命名建议用“系统演示.mp4”,方便上传到百度网盘或钉钉文档。
6.4 关于毕设这件事,我的真实建议
做毕设的过程里,我见过太多人执着于“项目要新颖”“功能要全面”,结果工期一拖再拖,最终连基本流程都没跑通。以我长期带项目的经验,毕设的优先级应当是:先跑通,再美化,再扩展。这套系统哪怕只包含用户管理、文章分类、文章发布、登录认证这几个模块,只要运行流畅、代码整洁、文档清楚,已经能达到绝大多数学校中等偏上的评价标准。
如果有余力,再把健康自测、数据统计看板这类亮点模块加进去,会让整个项目有“记忆点”。答辩时主动从业务出发,讲清楚“为什么存这张表”“为什么这样鉴权”“哪里能改进”,比被动等老师提问要好得多。
我自己在实操中还有一个习惯:在源码目录里新建一个README.md,把项目介绍、技术栈、运行步骤、账号信息全部写进去。这个东西不仅能成为部署说明的一部分,也能在指导老师抽查时展示标准化意识,一举两得。
