1. 项目背景与核心需求
在数字化转型浪潮下,传统办公系统正面临三大痛点:信息孤岛严重、流程审批低效、移动办公支持不足。地纬公司作为一家拥有200+员工的中型科技企业,原有OA系统已运行8年,存在表单流转平均耗时3.2天、移动端访问成功率仅65%等典型问题。经过三个月的需求调研,我们确定了智能办公系统的三大核心目标:
- 全流程电子化:将17类纸质审批流程转为线上,实现合同审批周期从5天缩短至8小时内
- 智能辅助决策:通过历史数据分析,自动推荐审批路径和常见处理方案
- 多终端无缝体验:支持PC、移动端、平板等多设备自适应访问,响应时间控制在1秒内
技术选型上,我们采用SSM(Spring+SpringMVC+MyBatis)作为后端框架,其优势在于:
- Spring的IoC容器管理着系统46个核心Bean,通过AOP实现了统一的日志切面
- MyBatis的动态SQL生成器处理了83%的复杂查询场景
- SpringMVC的拦截器链完成了权限验证、数据加密等横切关注点
前端选用Vue.js 2.6+Element UI的组合方案,主要考虑:
- 虚拟DOM机制使列表渲染性能提升40%
- 组件化开发让5人前端团队可以并行开发28个功能模块
- Vuex状态管理解决了多组件数据同步问题
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 系统架构设计与技术实现
2.1 分层架构解析
系统采用经典的三层架构,但针对办公场景做了特殊优化:
表现层:
- 基于Vue Router实现动态路由加载,按权限加载158个路由节点
- 使用axios拦截器处理Token刷新,401错误自动重试机制
- 采用WebSocket实现实时消息推送,消息延迟<300ms
业务逻辑层:
- Spring的声明式事务管理了29个核心业务方法
- 自定义注解@OperateLog实现了关键操作日志追踪
- 策略模式处理了6种不同的审批流程变体
数据持久层:
- MyBatis的二级缓存使高频查询TPS提升3倍
- 动态数据源切换支持主从库分离
- 乐观锁机制解决并发审批冲突
2.2 核心功能模块实现
2.2.1 智能表单引擎
采用JSON Schema定义表单结构,关键技术点包括:
java复制// 后端表单校验逻辑示例
@PostMapping("/form/submit")
public Result submitForm(@Valid @RequestBody FormData formData) {
// 动态校验规则加载
ValidatorFactory factory = Validation.buildDefaultValidatorFactory();
Validator validator = factory.getValidator();
Set<ConstraintViolation<FormData>> violations = validator.validate(formData);
if (!violations.isEmpty()) {
throw new BusinessException(violations.iterator().next().getMessage());
}
// 业务处理...
}
前端实现亮点:
- 使用Vue的动态组件渲染不同类型表单控件
- 实现级联选择器的懒加载,减少初始数据量
- 开发了自定义的富文本附件组件
2.2.2 流程审批中心
基于Activiti 7.0改造的工作流引擎包含:
- 可视化流程设计器(采用GoJS库实现)
- 会签、或签等8种审批节点类型
- 历史流程实例分析模块
关键数据库表设计:
| 表名 | 主要字段 | 索引设计 |
|---|---|---|
| ACT_RU_TASK | ID_, NAME_, ASSIGNEE_ | 复合索引(ASSIGNEE_, CREATE_TIME_) |
| BIZ_APPROVAL | approval_id, form_data, status | 单列索引(status) |
3. 性能优化实践
3.1 前端性能提升方案
通过Chrome Lighthouse测试,我们实施了以下优化:
- 组件懒加载:
javascript复制const ApprovalList = () => import('./views/approval/List.vue')
// 路由配置
{
path: '/approval',
component: ApprovalList,
meta: { requiresAuth: true }
}
- 请求合并与缓存:
- 使用axios的cancelToken取消重复请求
- 高频接口数据存入localStorage,设置5分钟过期
- 渲染优化:
- 复杂表格采用vue-virtual-scroller虚拟滚动
- 避免v-if与v-for同时使用
3.2 后端性能调优
JVM参数调优:
code复制-Xms1024m -Xmx2048m -XX:MaxMetaspaceSize=512m
-XX:+UseG1GC -XX:MaxGCPauseMillis=200
MySQL优化措施:
- 为act_ru_task表增加covering index
- 调整innodb_buffer_pool_size为物理内存的70%
- 慢查询日志监控发现并优化了12个SQL语句
压力测试结果对比:
| 场景 | 优化前TPS | 优化后TPS | 提升幅度 |
|---|---|---|---|
| 表单提交 | 128 | 342 | 167% |
| 流程启动 | 85 | 210 | 147% |
4. 安全防护体系
4.1 认证与授权
采用JWT+RBAC的混合方案:
- AccessToken有效期2小时
- RefreshToken有效期7天,使用Redis存储
- 权限粒度控制到按钮级别
安全防护措施:
- 密码加密:PBKDF2WithHmacSHA256算法,迭代20000次
- XSS防护:前端使用DOMPurify过滤,后端统一转义
- CSRF防护:SameSite Cookie + 自定义请求头
4.2 数据安全
敏感数据加密方案:
- 数据库字段级加密(AES-256)
- 日志脱敏处理(身份证号、手机号等)
- 文件上传加密存储
审计日志设计:
java复制@Aspect
@Component
public class AuditLogAspect {
@AfterReturning(pointcut = "@annotation(auditLog)", returning = "result")
public void afterReturning(JoinPoint joinPoint, AuditLog auditLog, Object result) {
// 记录操作日志到ES
logService.saveLog(buildLogInfo(joinPoint, auditLog, result));
}
}
5. 部署与运维方案
5.1 容器化部署
Docker Compose编排方案:
yaml复制version: '3'
services:
mysql:
image: mysql:5.7
environment:
MYSQL_ROOT_PASSWORD: ${DB_PASSWORD}
volumes:
- ./mysql/data:/var/lib/mysql
backend:
build: ./ssm-backend
ports:
- "8080:8080"
depends_on:
- mysql
- redis
5.2 监控体系
Prometheus监控指标:
- JVM内存使用率(jvm_memory_used_bytes)
- 接口响应时间(http_server_requests_seconds_sum)
- 数据库连接池使用情况(hikaricp_connections_active)
日志收集方案:
Filebeat -> Logstash -> Elasticsearch链路,关键日志字段包括:
- traceId(全链路追踪)
- operator(操作人)
- operation(操作类型)
6. 项目成果与经验总结
上线6个月后的关键数据:
- 流程审批效率提升73%
- 移动端使用占比达到58%
- 系统平均可用性99.96%
踩坑经验分享:
- Vue的响应式陷阱:当直接通过索引修改数组元素时,必须使用Vue.set()
- MyBatis缓存问题:在批量操作后需要手动清除二级缓存
- 跨域问题:开发环境需配置proxyTable,生产环境使用Nginx反向代理
性能优化心得:
- 接口响应时间>500ms的必须优化
- 列表查询必须分页,默认每页20条
- 避免在循环中查询数据库
扩展方向:
- 集成OCR实现票据自动识别
- 增加语音交互功能
- 开发数据分析看板
