从学生到开发者:我是如何用Vue3+SpringBoot复刻学校毕设系统的(踩坑总结)
·
从学生视角构建毕设管理系统:Vue3+SpringBoot全栈实战手记
去年此时,我还是个对着学校毕设系统手足无措的计算机系学生,如今却能用自己搭建的系统完成论文全流程管理。这个蜕变始于一个简单的想法:为什么不亲手复刻每天使用的系统?八个月的开发历程,从数据库设计到云部署,从权限控制到性能优化,我把这段充满"坑点"的实战经历浓缩成以下技术札记。
1. 技术选型:为什么是Vue3+SpringBoot
当决定复刻学校系统时,技术组合的抉择花费了我整整两周。最终方案背后是数十个对比实验的结论:
前端技术栈对比表
| 维度 | Vue3 | Vue2 | React |
|---|---|---|---|
| 响应式原理 | Proxy | Object.defineProperty | Virtual DOM |
| TypeScript支持 | 原生友好 | 需要额外配置 | 需要额外配置 |
| 打包体积 | 22.5KB (gzipped) | 23KB (gzipped) | 43KB (gzipped) |
| 组合式API | 提供 | 需插件支持 | 需使用Hooks |
选择Vue3的关键因素:
- Composition API 让功能模块化更符合毕设系统的组件划分
- Volar插件 在VS Code中提供媲美IDE的类型提示
- Pinia状态管理 简化了跨组件共享论文状态的需求
后端选择SpringBoot则源于:
// 典型SpringBoot启动类配置
@SpringBootApplication
@EnableTransactionManagement
@MapperScan("com.thesis.mapper")
public class ThesisSystemApplication {
public static void main(String[] args) {
SpringApplication.run(ThesisSystemApplication.class, args);
}
}
提示:SpringBoot 2.7.x版本在JDK17环境下有最佳性能表现
2. 权限系统设计:从学生到管理者的多维视角
原系统最让我困惑的是不同角色看到的界面差异。自己实现时,采用RBAC模型结合JWT的方案:
权限控制流程图
- 用户登录 → 生成包含角色的JWT
- 前端路由守卫校验权限元数据
- 后端接口添加
@PreAuthorize注解 - 数据库操作增加行级权限过滤
// 前端路由权限控制示例
const routes = [
{
path: '/paper',
component: PaperManage,
meta: { roles: ['STUDENT', 'TEACHER'] }
},
{
path: '/admin',
component: AdminPanel,
meta: { roles: ['ADMIN'] }
}
]
遇到的典型坑点:
- JWT续期问题 :采用双Token方案(accessToken 30分钟 + refreshToken 7天)
- 权限粒度控制 :使用自定义注解
@DataScope实现数据可见性过滤 - 菜单动态加载 :根据角色权限树递归生成导航菜单
3. 核心功能实现:论文生命周期管理
系统最复杂的业务逻辑集中在论文状态流转上。我采用状态机模式设计论文生命周期:
论文状态转换表
| 当前状态 | 允许操作 | 下一状态 |
|---|---|---|
| 选题中 | 提交选题申请 | 待导师确认 |
| 待导师确认 | 导师通过/拒绝 | 写作中/已驳回 |
| 写作中 | 提交初稿 | 待批改 |
| 待批改 | 导师添加批注 | 修改中 |
| 修改中 | 提交修订版 | 待批改 |
| 待答辩 | 录入答辩结果 | 已归档 |
状态机实现关键代码:
public enum PaperState {
TOPIC_SELECTING {
@Override
public PaperState nextState(Action action) {
return action == Action.SUBMIT_TOPIC ?
TOPIC_PENDING_APPROVAL : this;
}
},
// 其他状态枚举...
}
// 使用示例
paper.setState(paper.getState().nextState(action));
4. 性能优化实战:从本地到生产的蜕变
当系统数据量突破1000条记录时,明显感受到性能下降。通过以下措施将响应时间从1200ms降至200ms内:
优化措施对比
-
数据库层面
- 添加论文标题、学号的联合索引
- 将文件存储从数据库BLOB改为OSS对象存储
- 使用JOIN替代多次单表查询
-
缓存策略
@Cacheable(value = "paperCache", key = "#paperId") public PaperDetailVO getPaperDetail(Long paperId) { // 数据库查询逻辑 }注意:缓存雪崩防护采用随机过期时间
-
前端优化
- 论文列表采用虚拟滚动
- 使用Web Worker处理批量导出
- 按需加载富文本编辑器
5. 部署踩坑全记录
从本地开发到公网访问,部署环节的教训最为深刻:
典型部署问题解决方案
- 跨域问题 :Nginx配置增加
add_header指令 - HTTPS证书 :使用acme.sh自动续签Let's Encrypt
- 内存泄漏 :通过Arthas定位到未关闭的PDFBox实例
- 并发提交 :数据库添加乐观锁版本控制
部署 checklist:
- [ ] 生产环境禁用Swagger
- [ ] 日志切割配置(logrotate)
- [ ] 健康检查接口
/actuator/health - [ ] 备份策略(每日增量+每周全量)
6. 那些教科书没告诉你的实战经验
八个月的开发让我积累了许多非常规技巧:
效率工具链
- 代码生成 :基于MyBatis Generator定制模板
- 接口调试 :使用Postman的Collection Runner
- SQL分析 :Arthas的
watch命令监控慢查询 - 压力测试 :JMeter模拟百人并发提交
开发环境配置建议:
# .npmrc 配置
registry=https://registry.npmmirror.com
sass_binary_site=https://npmmirror.com/mirrors/node-sass
最值得安装的VS Code插件:
- Vue Language Features (Volar)
- Java Extension Pack
- REST Client
- GitLens
这段开发经历最宝贵的不是最终上线的系统,而是解决问题的思维方式。当看到自己构建的系统真正帮助同学完成论文管理时,那些调试到凌晨的夜晚都变得值得。技术成长的路上没有捷径,但每个踩过的坑都会成为脚下的台阶。
更多推荐
所有评论(0)