1. 项目概述
这个前后端分离的Web项目申报系统采用了当前主流的技术栈组合:SpringBoot+Vue+MyBatis+MySQL。作为一名长期从事全栈开发的工程师,我认为这种架构选择既考虑了开发效率,又保证了系统性能,特别适合中小型管理系统的快速迭代开发。
系统核心功能围绕项目申报全流程设计,从用户注册登录、项目信息填写、材料上传、审批流转到最终结果公示,形成完整的闭环。我在实际开发中发现,这种系统在高校科研管理、企业创新项目申报等场景中需求非常普遍,但市面上很多同类产品要么功能过于简单,要么使用体验不佳。
2. 技术架构解析
2.1 前端技术选型
Vue.js作为前端框架有几个明显优势:
- 组件化开发模式让申报表单、审批流程等模块可以高度复用
- 响应式特性完美适配不同终端设备
- 丰富的生态系统(Element UI、Vuex等)加速开发进程
实际开发中我特别推荐使用Vue CLI 4.x作为脚手架,它能自动处理Webpack配置,集成Babel转译和ESLint校验。对于表单验证,建议采用async-validator库,配合Element UI的Form组件,可以优雅地处理复杂的申报字段校验逻辑。
2.2 后端技术组合
SpringBoot 2.5+版本提供了开箱即用的特性:
- 内嵌Tomcat服务器简化部署
- 自动配置减少了大量XML配置
- Actuator端点方便监控系统健康状态
MyBatis-Plus 3.x作为ORM框架,其强大的CRUD接口和Wrapper条件构造器,让审批流程中的复杂查询变得简单。我在实际项目中总结出一个技巧:对于多表关联查询,可以结合@TableField注解和XML映射文件混合使用,既保持灵活性又提高开发效率。
2.3 数据库设计要点
MySQL 8.0推荐使用InnoDB引擎,关键表设计建议:
sql复制CREATE TABLE `project_application` (
`id` bigint NOT NULL AUTO_INCREMENT COMMENT '主键ID',
`project_name` varchar(100) NOT NULL COMMENT '项目名称',
`applicant_id` bigint NOT NULL COMMENT '申请人ID',
`status` tinyint NOT NULL DEFAULT '0' COMMENT '审批状态(0-草稿 1-待审核 2-已通过 3-已驳回)',
`attachment_url` varchar(255) DEFAULT NULL COMMENT '附件地址',
`create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP,
`update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
PRIMARY KEY (`id`),
KEY `idx_applicant` (`applicant_id`),
KEY `idx_status` (`status`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;
注意:status字段使用tinyint而非enum类型,便于后期状态扩展。所有时间字段建议统一使用datetime类型并设置默认值。
3. 核心功能实现
3.1 用户认证模块
采用JWT+Spring Security的认证方案:
- 前端登录成功后获取token
- 后端通过SecurityConfig配置权限拦截
- 使用自定义注解@PreAuthorize实现方法级权限控制
关键配置示例:
java复制@Configuration
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {
@Override
protected void configure(HttpSecurity http) throws Exception {
http.csrf().disable()
.authorizeRequests()
.antMatchers("/api/auth/**").permitAll()
.antMatchers("/api/admin/**").hasRole("ADMIN")
.anyRequest().authenticated()
.and()
.addFilter(new JwtAuthenticationFilter(authenticationManager()))
.sessionManagement().sessionCreationPolicy(SessionCreationPolicy.STATELESS);
}
}
3.2 项目申报流程
典型业务流程实现:
- 前端使用Vue动态表单生成器渲染申报模板
- 后端采用工作流引擎(如Activiti)或状态模式处理审批流转
- 文件上传使用阿里云OSS或本地存储(需考虑Nginx静态资源映射)
状态转换示例代码:
java复制public class ApplicationService {
@Transactional
public void submitApplication(Long applicationId) {
Application app = applicationMapper.selectById(applicationId);
if (app.getStatus() != Draft) {
throw new BusinessException("只能提交草稿状态的项目");
}
app.setStatus(Pending);
applicationMapper.updateById(app);
// 发送站内信通知审批人
messageService.notifyReviewers(app);
}
}
3.3 数据统计看板
使用ECharts实现可视化统计:
- 后端通过MyBatis动态SQL聚合数据
- 前端采用异步加载和缓存策略优化性能
- 添加响应式resize事件处理不同屏幕尺寸
4. 系统部署方案
4.1 开发环境准备
推荐工具组合:
- JDK 1.8+(建议Amazon Corretto 11)
- Node.js 14.x + npm 6.x
- MySQL 8.0+ 或 MariaDB 10.5+
- IDE:IntelliJ IDEA + VS Code
4.2 后端部署要点
- 打包命令:
mvn clean package -DskipTests - 启动参数配置示例:
bash复制java -jar application.jar \
--spring.profiles.active=prod \
--spring.datasource.url=jdbc:mysql://127.0.0.1:3306/application_db?useSSL=false \
--spring.datasource.username=app_user \
--spring.datasource.password=StrongPassword123!
- 建议使用Nginx反向代理,配置示例:
nginx复制server {
listen 80;
server_name api.yourdomain.com;
location / {
proxy_pass http://127.0.0.1:8080;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
}
}
4.3 前端部署实践
- 生产环境构建:
npm run build - 部署到Nginx的配置关键点:
nginx复制server {
listen 80;
server_name yourdomain.com;
root /var/www/html;
index index.html;
location / {
try_files $uri $uri/ /index.html;
}
location /api {
proxy_pass http://api.yourdomain.com;
}
}
- 静态资源缓存策略建议:
nginx复制location /static {
expires 365d;
add_header Cache-Control "public";
}
5. 常见问题排查
5.1 跨域问题解决方案
开发环境常见报错及处理:
- 确保后端添加@CrossOrigin注解或全局CORS配置
- 检查前端axios请求的baseURL配置
- 复杂请求需处理OPTIONS预检请求
5.2 文件上传大小限制
SpringBoot默认限制文件上传大小为1MB,需要调整配置:
yaml复制spring:
servlet:
multipart:
max-file-size: 10MB
max-request-size: 10MB
同时Nginx也需要相应调整:
nginx复制client_max_body_size 10M;
5.3 性能优化建议
-
数据库层面:
- 为审批状态、用户ID等高频查询字段添加索引
- 大文本字段考虑分表存储
- 使用连接池(HikariCP推荐)
-
缓存策略:
- 热点数据使用Redis缓存
- 前端采用localStorage存储用户偏好设置
-
前端优化:
- 路由懒加载
- 第三方库按需引入
- 生产环境开启Gzip压缩
6. 项目扩展方向
基于这个基础框架,可以考虑以下增强功能:
- 多级审批流程配置化
- 移动端适配(使用Vant等移动端UI库)
- 与钉钉/企业微信集成
- 添加项目成果管理模块
- 接入短信/邮件通知服务
在实际开发中,我特别建议先完善日志系统(Logback+ELK),这对后期运维排查问题非常重要。另外,接口文档使用Swagger UI或YApi管理,能显著提升前后端协作效率。