本科毕业设计系统的技术选型与架构实践:从单体到可维护的轻量级方案
摘要:很多高校同学在毕设冲刺阶段才发现——代码越写越乱、功能一改就崩、答辩演示现场“翻车”。本文用“技术科普”视角,带你把“能跑就行”的毕设系统拆成可维护的轻量级方案:先盘点常见踩坑,再对比主流框架,最后给出可直接抄作业的代码与部署清单。读完你可以用 1~2 周把旧项目重构到“能放心写进简历”的程度。
1. 背景痛点:为什么毕设系统总在最后 10 天崩溃?
硬编码泛滥
数据库 IP、文件上传路径、管理员密码全写在代码里,本机跑得好好的,到答辩教室连不上网就当场社死。无分层,一锅炖
所有逻辑塞在 JSP/PHP 页面里,HTML 与 SQL 齐飞,调试靠System.out.println,需求一改,牵一发动全身。安全“裸奔”
密码明文存储、SQL 拼接、未做身份校验;老师一插 U 盘,演示数据被“删库跑路”。部署灾难
本地 Windows 路径D:\workspace\upload写死,服务器 Linux 没有 D 盘;Git 上传时把 2 GB 的测试视频一并推上去,克隆等到天荒地老。
一句话总结:“跑起来”≠“能交差”,毕设也要讲工程素养。
2. 技术选型对比:Spring Boot vs Flask vs Express
| 维度 | Spring Boot | Flask | Express |
|---|---|---|---|
| 学习曲线 | 中等(注解多,IDE 友好) | 平缓(50 行能跑) | 平缓(JS 前后通吃) |
| 开发效率 | 高(Starter 一键依赖) | 高(自由组装插件) | 高(npm 生态爆炸) |
| 社区/教程 | 国内教程海量 | 英文文档优质 | 中英文都丰富 |
| 打包部署 | 单 jar 直接java -jar | gunicorn + nginx | pm2 / docker |
| 适合场景 | 想写 Java、以后进“厂” | Python 爱好者、算法接口多 | 全栈 JS、Vue/React 同构 |
结论:
- 如果你已熟悉 Java,直接上Spring Boot,国内答辩老师秒懂;
- 若钟爱 Python,选Flask足够轻量,且 AI 模块可无缝集成;
- 想炫技 SSR/全栈,Express + Next.js一条龙,但别把时间都花在配 webpack。
下面以“Spring Boot + MyBatis-Plus + MySQL”为例展开,其他框架思路同理可迁移。
3. 核心实现细节:把系统拆成“三层小楼”
Controller 层
只干两件事:参数校验、调用 Service。任何if/else业务逻辑都往下扔。Service 层
组合 DAO,做事务控制。例如“提交课题”要同时插入thesis记录与audit_log,在这里加@Transactional。DAO / Mapper 层
用 MyBatis-Plus 的BaseMapper省掉手写 CRUD;复杂查询再写 XML,保持接口整洁。DTO / VO 分离
数据库实体叫DO,对外返回叫VO,表单接收叫DTO。字段不一致时,用 MapStruct 一键转换,杜绝把密码 accidentally 序列化给前端。统一返回格式
所有接口R<T>包装,固定字段:code、msg、data。前端拿到后统一拦截,省得res.data?.data?.list层层套娃。
4. 代码示例:用户登录最小闭环(Spring Boot)
只贴核心片段,完整工程已开源在 GitHub,文末自取。
- 表结构(MySQL)
CREATE TABLE user( id BIGINT PRIMARY KEY AUTO_INCREMENT, username VARCHAR(20) UNIQUE NOT NULL, password_hash VARCHAR(60) NOT NULL, -- bcrypt 长度固定 60 role TINYINT DEFAULT 1 COMMENT '1学生 2导师 3管理员' );- 密码工具类(bcrypt 单向哈希 + 随机盐)
public class PasswordUtil { private static final BCryptPasswordEncoder ENCODER = new BCryptPasswordEncoder(); public static String hash(String raw) { return ENCODER.encode(raw); // 每次盐值随机 } public static boolean match(String raw, String hash) { return ENCODER.matches(raw, hash); } }- UserService.java
@Service public class UserService { @Resource private UserMapper userMapper; public String login(LoginDTO dto){ User user = userMapper.selectOne( Wrappers.<User>lambdaQuery().eq(User::getUsername, dto.getUsername())); if (user == null || !PasswordUtil.match(dto.getPassword(), user.getPasswordHash())) { throw new BizException("用户名或密码错误"); } return JwtUtil.createToken(user.getId(), user.getRole()); } }- LoginController.java
@RestController @RequestMapping("/api/auth") @Validated public class LoginController { @Resource private UserService userService; @PostMapping("/login") public R<String> login(@Valid @RequestBody LoginDTO dto){ String token = userService.login(dto); return R.ok(token); } }- 统一异常拦截(省得每个 Controller try-catch)
@RestControllerAdvice public class GlobalExceptionHandler { @ExceptionException(BizException.class) public R<String> handle(BizException e) { return R.fail(e.getMessage()); } }代码要点
- 密码全程
char[]/String流转,日志绝不打印;BizException继承RuntimeException,事务回滚更干净;- JWT 有效期 2 h,刷新靠 Redis 存黑名单,实现“踢人下线”。
5. 性能与安全:别让小疏忽毁了整场答辩
SQL 注入
MyBatis#{}预编译已防住 99%,千万别用${}拼接字段。接口幂等
关键操作(选题、评分)要求前端带uuid作为幂等 Token,后端用 RedisSETNX保证只执行一次。密码哈希
别再用 MD5 + 盐!bcrypt / Argon2 才是标准;Spring Security 5.x 内置。文件上传
- 限制大小与后缀,白名单
jpg,pdf,zip; - 重命名
UUID.+ext,路径按日期打散; - 存储目录放项目外,防打包 jar 后消失。
- 限制大小与后缀,白名单
HTTPS & 安全头
即使校内网也申请免费证书,Nginx 加两行配置,瞬间高大上;再加X-Content-Type-Options: nosniff等头,OWASP Top10 基本齐活。
6. 生产环境避坑指南:让代码在服务器上也睡得香
Git 分支模型
采用main/dev/feature/bugfix四支:main永远可部署;dev每日合并,集成测试;- 功能分支用完即删,保持图谱清爽。
环境变量 > 配置文件
数据库密码、JWT 密钥、邮件账号全部走环境变量,Spring 用${ENV}占位,Docker 启动时-e注入,避免把敏感信息推到 GitHub。路径解耦
上传、日志、临时目录统一用System.getProperty("user.dir")/../data或 Docker Volume,Windows / Linux 双端无痛。自动化脚本
提供Makefile或mvnw一键:make build编译 + 单测;make image打构建 Docker 镜像;make deploy远程 ssh 拉镜像、停旧容器、启新容器。
答辩当天,老师看你敲一行命令就完成升级,印象分直接 +10。
日志与监控
引入logback-spring.xml按天滚动,保留 30 天; actuator 暴露/health,服务器 5 分钟自检一次,宕机短信提醒——别等老师打不开系统才后知后觉。
7. 动手重构:把“能跑”变“能吹”
- 先拉分支
refactor/2024,备份旧代码; - 按本文目录依次替换:统一返回格式 → 拆 Service → 加 bcrypt → 写单测;
- 每完成一块,本地跑一遍单元测试,绿色通过再
git push; - 最后写一页“架构亮点”放答辩 PPT:分层、安全、可扩展,老师听完就知道你“有工程能力”。
思考:毕设不是“跑通功能”而是“展示思维”。代码结构、提交记录、部署脚本、安全细节都是你的加分项。现在就把项目
git log里那堆“fix bug”改写成“feat: 新增选题幂等控制”,让每一次 commit 都在讲故事——这份“工程履历”会比论文更打动未来的面试官。
祝你重构顺利,答辩高分!