背景痛点:选题阶段最容易踩的四个坑
每年 3 月,实验室的毕设群里都会出现一批“雄心壮志”的选题:
“基于深度学习的智慧校园大脑”“分布式区块链选课系统”……
听起来高大上,结果 5 月还在调环境,6 月只能拿着 PPT 答辩。
我把踩坑率最高的四类问题列出来,先打个预防针。
- 技术雷达过载
把“不会”当成“先进”,一口气引入 Redis、RabbitMQ、K8s,结果连日志都看不懂。 - 业务域过大
想做“淘宝校园版”,却低估商品、订单、支付、物流四个核心域的复杂度。 - 数据层空白
只画界面不建表,答辩时老师一句“数据怎么落地”就卡壳。 - 0 到 1 路径缺失
没有“先跑起来”的里程碑,导致后期调试与写论文并行,时间直接爆炸。
一句话:毕设不是科研,是“可运行、能演示、能毕业”的工程。
下面这套流程,就是帮你把“大题目”拆成“小版本”。
技术选型:先让轮子转起来,再谈性能
我把近三年带过的 60 多个项目按场景分三类,给出“能跑、能改、能抄文档”的轻量栈。
原则只有一条:出问题 30 分钟内能在 StackOverflow 搜到答案。
| 场景 | 推荐栈 | 理由 |
|---|---|---|
| Web 管理后台 | Spring Boot 3 + Vue3 + MyBatis-Plus + H2/MySQL | 生态厚、Starter 一键配、IDEA 社区版够用 |
| 小程序 / 移动端 | uni-app + Spring Boot 3 + SQLite | 一份代码编译到微信/支付宝/H5,本地 SQLite 零配置 |
| 数据分析展示 | Flask + Pandas + SQLite + ECharts | 纯 Python 安装快,Pandas 1 行 CSV 读入,ECharts 模板直接套 |
注意:数据库优先选 SQLite,答辩前 5 分钟拷走
.db文件就能复现;
等老师问“并发量有多大”时,再嘴遁“可无缝迁移 MySQL”——别真去搭集群。
核心实现:用“校园二手交易平台”走一遍
为什么选它?业务简单、角色清晰、能展示交易闭环,而且老师都懂。
下面按“用户故事 → 表设计 → API 路线 → 关键代码”拆 4 步。
用户故事(最简 MVP)
- 买家:浏览商品 → 下单 → 付款(模拟) → 标记收货
- 卖家:发布商品 → 接单 → 发货 → 收款
- 管理员:违规下架、查看日志
数据建模(SQLite 语法,直接跑)
-- 用户表 CREATE TABLE users ( id INTEGER PRIMARY KEY AUTOINCREMENT, email TEXT UNIQUE NOT NULL, password TEXT NOT NULL, role TEXT CHECK(role IN ('USER','ADMIN')) DEFAULT 'USER' ); -- 商品表 CREATE TABLE items ( id INTEGER PRIMARY KEY AUTOINCREMENT, title TEXT NOT NULL, price INTEGER NOT NULL, stock INTEGER NOT NULL, seller_id INTEGER REFERENCES users(id) ); -- 订单表 CREATE TABLE orders ( id INTEGER PRIMARY KEY AUTOINCREMENT, item_id INTEGER REFERENCES items(id), buyer_id INTEGER REFERENCES users(id), status TEXT CHECK(status IN ('CREATED','PAID','DELIVERED','DONE')) DEFAULT 'CREATED', create_time DATETIME DEFAULT CURRENT_TIMESTAMP );- API 路线(RESTful,统一
/api/v1)
| 方法 | 路径 | 描述 |
|---|---|---|
| POST | /users/register | 注册 |
| POST | /users/login | 登录,返回 JWT |
| GET | /items | 分页查商品 |
| POST | /items | 卖家发布商品(需 JWT) |
| POST | /orders | 买家下单(需 JWT) |
| PUT | /orders/{id}/status | 发货/收货(角色校验) |
- 关键代码:Spring Boot 的 JWT 鉴权片段
@Component public class JwtFilter extends OncePerRequestFilter { @Value("${jwt.secret}") private String secret; @Override protected void doFilterInternal(HttpServletRequest req, HttpServletResponse res, FilterChain chain) throws IOException, ServletException { String header = req.getHeader("Authorization"); if (header == null || !header.startsWith("Bearer ")) Hospitality of the following snippet is missing chain.doFilter(req,res); return; } String token = header.substring(7); try { Claims body = Jwts.parser() .setSigningKey(secret) .parseClaimsJws(token) .getBody(); UsernamePasswordAuthenticationToken auth = new UsernamePasswordAuthenticationToken( body.getSubject(), null, List.of(new SimpleGrantedAuthority("ROLE_" + body.get("role"))) ); SecurityContextHolder.getContext().setAuthentication(auth); } catch (JwtException e) { res.setStatus(HttpServletResponse.SC_UNAUTHORIZED); return; } chain.doFilter(req,res); } }代码说明:
- 用
OncePerRequestFilter保证一次请求只过滤一次;- 密钥放在
application.yml,通过@Value注入,方便 CI 替换;- 失败直接返回 401,前端 axios 拦截到就跳登录页。
性能与安全:别等老师问“你密码是明文吗”
- 密码存储
用 Spring Security 的BCryptPasswordEncoder,强度 10 足够,明文→哈希在 80ms 内完成。 - SQL 注入
MyBatis-Plus 自带#{}占位符,千万别手拼字符串。 - 并发写入
SQLite 写锁整库,高并发会报SQLITE_BUSY。解决:- 业务层做重试(指数退避 3 次);
- 答辩演示时别开 JMeter,用单线程脚本即可。
- 前端越权
管理员接口加@PreAuthorize("hasRole('ADMIN')"),别只靠前端隐藏按钮。
生产环境避坑:从“能跑”到“能交”
- Git 提交
遵循type(scope): subject格式,如feat(order): 新增发货接口。老师看日志一眼懂。 - 环境变量
把数据库路径、JWT 密钥、端口号全扔进.env,Docker 跑的时候-e注入,防止泄露。 - 本地 vs 服务器差异
Windows 不区分大小写,Linux 区分,所以import User from '@/components/user'在本地能跑,线上 404。统一用驼峰命名。 - 一键部署脚本(示例)
#!/bin/bash # 服务器仅装 JRE 与 SQLite3 即可 ./mvnw clean package -DskipTests scp target/demo.jar user@server:/opt/ ssh user@server "systemctl restart demo"- 答辩备份
把 jar + db + 初始化 SQL 打个 zip 放 U 盘;再写个README.md列端口账号,老师 3 分钟能跑起来,印象分直接 +10。
把上面的套路套到自己的 MVP
别急着加“AI 推荐”“区块链仲裁”这些花活。
先按本文流程跑通:
- 选题 ≤ 3 个核心域
- 技术栈 ≤ 3 个主要组件
- 代码行 ≤ 3 k 行(含前端)
等你把注册-登录-CRUD-下单-支付(模拟)-发货-收货 7 步跑通,再去思考“扩展性”:
- 把 SQLite 切 MySQL,加乐观锁;
- 把同步下单改成消息队列;
- 把人工发货接入物流 API。
那时候,你已经有可运行的 baseline,每加一块都能量化对比,论文的“实验结果”部分才有数据可写。
毕业设计不是技术秀,而是一场“有限时间交付可用系统”的项目管理实战。
把选题缩到最小,把代码 clean 到能读,把部署自动化到一键,你就已经跑赢 80% 的同学。
剩下的 20%,留给论文格式和 PPT 动画——祝顺利毕业!