1. 项目概述:SSM+Vue的小型企业OA系统设计与实现
去年给本地一家30人规模的商贸公司实施办公自动化系统时,我选择了SSM+Vue的技术组合。这个技术栈在中小型企业管理系统中有着独特的优势——Spring+SpringMVC+MyBatis提供了成熟稳定的后端架构,而Vue.js的渐进式特性让前端开发可以快速响应业务变化。实际开发周期只用了6周,系统上线后纸质文件流转量减少了78%,这让我意识到即使是小型OA系统,选对技术方案也能产生巨大效益。
这个系统主要包含六大核心模块:权限管理采用RBAC模型实现多级审批流程;公文管理模块支持在线编辑和版本控制;日程管理整合了腾讯日历API;公告通知实现了微信消息联动;档案管理具备电子签章功能;统计报表则通过ECharts实现可视化。特别要说明的是,所有前端页面都采用Vue CLI脚手架初始化,通过axios与后端交互,这种前后端分离的架构让移动端适配工作量减少了60%。
提示:小型企业OA系统数据库设计要预留20%的扩展字段,我们最初设计的员工表只有基础字段,后期新增指纹考勤功能时不得不进行表结构变更
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 技术选型深度解析
2.1 为什么选择SSM框架
Spring 5.2.6版本提供了完善的IoC容器和声明式事务管理,我们特别利用了它的AOP特性实现操作日志记录。比如下面这段环绕通知代码,可以自动记录所有Controller方法的执行情况:
java复制@Around("execution(* com..controller.*.*(..))")
public Object logAround(ProceedingJoinPoint joinPoint) throws Throwable {
long start = System.currentTimeMillis();
Object result = joinPoint.proceed();
String method = joinPoint.getSignature().getName();
logService.saveLog(method, System.currentTimeMillis()-start);
return result;
}
MyBatis 3.5.3配合PageHelper分页插件,在处理报表查询时表现出色。这里有个性能优化技巧:在mybatis-config.xml中配置aggressiveLazyLoading=false,可以避免N+1查询问题。我们统计模块的复合查询响应时间从最初的4.2秒优化到了800毫秒左右。
2.2 Vue 2.6 + ElementUI前端方案
前端采用Vue CLI 4.x搭建,有三个关键配置需要注意:
- 在vue.config.js中设置devServer.proxy解决跨域
- 使用chainWebpack配置alias简化路径引用
- 生产环境关闭sourcemap以保护代码安全
路由管理采用动态加载方案,配合路由守卫实现权限控制:
javascript复制// 动态路由示例
const asyncRoutes = [
{
path: '/document',
component: Layout,
meta: { title: '公文管理', icon: 'document' },
children: [
{
path: 'approve',
component: () => import('@/views/document/approve'),
meta: { title: '审批流程', permission: ['admin','leader'] }
}
]
}
]
3. 核心模块实现细节
3.1 权限管理系统设计
RBAC模型我们扩展了数据权限控制,通过部门数据隔离实现不同分公司只能查看本部门数据。数据库关键表结构如下:
| 表名 | 关键字段 | 说明 |
|---|---|---|
| sys_user | id, dept_id, username, password | 用户基础信息 |
| sys_role | id, name, data_scope | 数据范围(1全部 2本级 3自定义) |
| sys_user_role | user_id, role_id | 用户角色关联 |
| sys_menu | id, parent_id, path, component | 前端路由配置 |
权限验证的核心逻辑在Shiro过滤器中实现,特别注意要放行登录接口和静态资源:
java复制filterChainDefinitionMap.put("/login", "anon");
filterChainDefinitionMap.put("/static/**", "anon");
filterChainDefinitionMap.put("/**", "authc");
3.2 公文流转模块实现
采用工作流引擎Activiti 7.1.0.M3处理审批流程,与业务系统集成时需要注意:
- 在Spring配置文件中声明ProcessEngineFactoryBean
- 使用Activiti的IdentityService同步用户数据
- 部署流程定义文件时要包含BPMN和PNG两种格式
公文版本控制采用Git-like机制,每次修改生成新的版本号,核心SQL:
sql复制UPDATE document SET current_version = false WHERE doc_id = ?;
INSERT INTO document (doc_id, version, content, modifier)
VALUES (?, ?, ?, ?);
4. 开发中的典型问题与解决方案
4.1 前后端数据交互问题
日期类型处理是个常见坑点,推荐两种方案:
- 后端配置Jackson的全局日期格式
java复制@Configuration
public class WebConfig implements WebMvcConfigurer {
@Override
public void extendMessageConverters(List<HttpMessageConverter<?>> converters) {
MappingJackson2HttpMessageConverter converter = new MappingJackson2HttpMessageConverter();
ObjectMapper mapper = converter.getObjectMapper();
mapper.setDateFormat(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"));
converters.add(0, converter);
}
}
- 前端使用moment.js处理日期格式化
4.2 性能优化实践
我们通过以下措施将系统吞吐量提升了3倍:
- 启用MyBatis二级缓存,配置Cache Hit Ratio监控
- 对超过500条的列表查询强制分页
- Vue组件异步加载
- 使用Webpack的SplitChunksPlugin拆分代码包
内存泄漏排查案例:发现退出登录后内存未释放,最终定位是ECharts实例未正确dispose。解决方案是在Vue的beforeDestroy钩子中手动清理:
javascript复制beforeDestroy() {
if (this.chart) {
this.chart.dispose();
this.chart = null;
}
}
5. 毕业论文写作建议
技术类论文写作要突出创新点和实证数据,建议结构:
- 引言部分用行业数据说明OA系统必要性
- 技术选型章节做同类框架对比(如SSM vs Spring Boot)
- 系统实现章节配UML图和核心代码片段
- 测试部分展示JMeter压力测试结果
- 结论部分量化系统实施效果(如流程效率提升百分比)
特别提醒:论文中的代码截图要保持IDE默认主题,避免使用深色背景;数据库设计要符合第三范式并标注主外键关系;所有图表都需要有编号和标题说明。
在系统测试阶段,我们使用Postman做了完整的API测试用例集,这个可以作为论文的附件材料。测试数据建议使用Mockaroo生成符合业务场景的仿真数据,比如员工姓名、部门名称等字段应该看起来真实可信。
