大学生创新创业训练项目(简称"大创")是高校培养学生创新能力的重要平台,但传统管理模式普遍存在流程繁琐、信息孤岛、协作低效等问题。我们团队在参与校级大创项目管理时,深刻体会到纸质审批、Excel统计和群聊沟通带来的效率瓶颈。去年作为项目负责人,我曾因材料版本混乱差点错过中期检查,这促使我们决定开发这套前后端分离的管理系统。
系统采用SpringBoot+Vue技术栈实现,主要解决三大痛点:
采用经典的前后端分离架构,通过RESTful API进行数据交互。技术选型经过多轮对比:
技术选型心得:放弃JPA选择MyBatis-Plus是因为需要复杂SQL处理报表统计,其Wrapper条件构造器能大幅减少XML编写。Vue3的Composition API更适合我们团队有React经验的成员快速上手。
核心表关系设计遵循三范式原则,关键表包括:
sql复制CREATE TABLE `project` (
`id` bigint NOT NULL AUTO_INCREMENT,
`project_name` varchar(100) NOT NULL COMMENT '项目名称',
`status` tinyint NOT NULL DEFAULT '0' COMMENT '状态',
`current_process_id` bigint DEFAULT NULL COMMENT '当前流程节点',
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
申报材料模板需要支持各学院自定义字段,我们开发了基于JSON Schema的表单设计器:
java复制// 表单模板示例
{
"title": "创新训练项目申请表",
"properties": {
"projectType": {
"type": "string",
"enum": ["创新训练", "创业训练", "创业实践"]
},
"budget": {
"type": "number",
"minimum": 0,
"maximum": 10000
}
}
}
使用Activiti 7实现审批流程可视化配置,关键实现:
踩坑记录:最初直接使用Activiti原生API导致事务问题,后改用Spring的@Transactional注解管理,并在TaskService上添加AOP日志。
在标准RBAC基础上增加数据权限控制:
java复制@GetMapping("/list")
@DataScope(collegeAlias = "p")
public R list(Project project) {
// 自动注入学院条件
startPage();
List<Project> list = projectService.selectProjectList(project);
return R.success(getDataTable(list));
}
javascript复制// 路由配置示例
{
path: '/project',
component: Layout,
meta: {
title: '项目管理',
roles: ['admin', 'college']
}
}
使用Docker Compose编排服务:
yaml复制version: '3'
services:
mysql:
image: mysql:8.0
environment:
MYSQL_ROOT_PASSWORD: 123456
volumes:
- ./mysql/data:/var/lib/mysql
backend:
build: ./backend
ports:
- "8080:8080"
depends_on:
- mysql
开发环境常见跨域问题,需配置:
java复制@Configuration
public class CorsConfig implements WebMvcConfigurer {
@Override
public void addCorsMappings(CorsRegistry registry) {
registry.addMapping("/**")
.allowedOrigins("*")
.allowedMethods("*")
.maxAge(3600);
}
}
SpringBoot默认1MB限制,需调整:
properties复制# application.properties
spring.servlet.multipart.max-file-size=50MB
spring.servlet.multipart.max-request-size=50MB
这套系统在我校试运行期间,将项目平均审批周期从15天缩短至3天,文档版本错误率降为零。特别提醒:数据库设计时要预留足够varchar长度,我们初期因"项目名称"字段长度不足导致截断问题。