大学生创新创业训练计划(简称"大创")是高校培养学生创新能力的重要平台,但传统管理模式存在诸多痛点:纸质材料堆积如山、审批流程繁琐、进度跟踪困难、数据统计效率低下。我们团队开发的这套前后端分离管理系统,正是为了解决这些实际问题而生。
这个系统的技术选型非常典型——SpringBoot+Vue的组合堪称当前企业级开发的标准配置。后端采用SpringBoot简化配置,整合MyBatis实现ORM映射,MySQL作为关系型数据库;前端使用Vue.js构建响应式单页应用。这种架构不仅性能优越,更重要的是便于团队成员分工协作——前端同学可以专注界面交互,后端同学则负责业务逻辑和API开发。
提示:选择前后端分离架构时,一定要提前规划好接口文档规范。我们团队初期就因接口定义混乱吃了亏,后来采用Swagger统一管理才解决问题。
后端选择SpringBoot而非传统SSM框架,主要基于三点考虑:
前端选用Vue.js而非React/Angular,主要因为:
数据库选择MySQL 8.0版本,利用了其:
核心功能模块包括:
用户中心:RBAC权限模型设计
项目管理:全生命周期管理
mermaid复制graph TD
A[立项申请] --> B[中期检查]
B --> C[结题验收]
C --> D[成果展示]
(注:实际实现时应替换为文字描述)
评审系统:多维度打分机制
统计报表:动态数据可视化
JWT认证流程优化:
java复制// 示例:JWT工具类关键代码
public static String generateToken(UserDetails userDetails) {
Map<String, Object> claims = new HashMap<>();
claims.put("roles", userDetails.getAuthorities());
return Jwts.builder()
.setClaims(claims)
.setSubject(userDetails.getUsername())
.setExpiration(new Date(System.currentTimeMillis() + EXPIRATION_TIME))
.signWith(SignatureAlgorithm.HS512, SECRET)
.compact();
}
动态表单设计方案:
sql复制CREATE TABLE form_template (
id BIGINT PRIMARY KEY,
form_name VARCHAR(100),
form_schema JSON NOT NULL
);
API请求封装:
javascript复制// api/request.js
const service = axios.create({
baseURL: process.env.VUE_APP_BASE_API,
timeout: 5000
})
// 请求拦截器
service.interceptors.request.use(
config => {
if (store.getters.token) {
config.headers['Authorization'] = 'Bearer ' + getToken()
}
return config
},
error => {
return Promise.reject(error)
}
)
权限控制实现:
javascript复制{
path: '/project-approval',
component: Layout,
meta: { roles: ['department-admin', 'school-admin'] }
}
javascript复制Vue.directive('permission', {
inserted(el, binding) {
const { value } = binding
const roles = store.getters.roles
if (!roles.some(role => value.includes(role))) {
el.parentNode && el.parentNode.removeChild(el)
}
}
})
后端部署要点:
dockerfile复制FROM openjdk:8-jdk-alpine
VOLUME /tmp
ADD target/mis-project.jar app.jar
ENTRYPOINT ["java","-Djava.security.egd=file:/dev/./urandom","-jar","/app.jar"]
nginx复制upstream backend {
server 192.168.1.101:8080 weight=5;
server 192.168.1.102:8080;
}
server {
location /api/ {
proxy_pass http://backend;
}
}
前端部署注意事项:
env复制# .env.production
VUE_APP_BASE_API = '/api'
VUE_APP_USE_MOCK = false
nginx复制gzip on;
gzip_types text/plain application/xml application/javascript;
跨域问题解决方案:
javascript复制// vue.config.js
devServer: {
proxy: {
'/api': {
target: 'http://localhost:8080',
changeOrigin: true
}
}
}
性能优化经验:
java复制@Cacheable(value = "projects", key = "#status")
public List<Project> getProjectsByStatus(String status) {
return projectMapper.selectByStatus(status);
}
这套系统在实际运行中,我们还规划了以下增强功能:
在开发过程中最大的收获是:文档的重要性远超预期。我们建立了完善的Markdown格式文档体系,包括:
对于想尝试类似项目的同学,我的建议是:先从核心业务流程入手(如立项审批流程),再逐步扩展周边功能。不要一开始就追求大而全,而应该采用迭代式开发,每个版本都确保有可演示的完整功能闭环。