1. 项目背景与需求分析
最近刚完成了一个实习生管理系统的开发项目,作为企业HR数字化转型的重要组成部分。传统实习生管理通常依赖Excel表格和邮件往来,存在信息分散、流程混乱、统计困难等问题。特别是在实习生规模超过50人时,手工管理方式几乎难以为继。
这个系统主要解决以下几个痛点:
- 实习生信息碎片化(简历、考勤、考核分散在不同部门)
- 实习过程缺乏标准化流程(入职、培训、考核没有统一平台)
- 数据统计困难(无法快速生成实习生的出勤率、任务完成率等报表)
- 沟通成本高(导师与实习生之间的指导记录难以沉淀)
系统采用前后端分离架构,后端使用SpringBoot 2.7 + MyBatis Plus,前端采用Vue 3 + Element Plus。这种技术组合既保证了开发效率,又能满足企业级应用对稳定性和性能的要求。
2. 系统架构设计
2.1 技术选型考量
后端选择SpringBoot主要基于以下考虑:
- 快速启动特性:内嵌Tomcat,无需单独部署
- 丰富的starter生态:整合Redis、MySQL等组件只需添加依赖
- 完善的文档支持:Spring社区活跃,问题解决效率高
- 与MyBatis Plus的完美配合:简化90%的CRUD操作
前端选择Vue 3组合:
- Composition API更适合复杂业务逻辑组织
- Element Plus组件库成熟度高,减少UI开发成本
- Vite构建工具显著提升开发体验
2.2 系统模块划分
系统采用模块化设计,主要分为六个核心模块:
| 模块名称 | 功能说明 | 技术实现 |
|---|---|---|
| 权限管理 | RBAC模型实现角色权限控制 | Spring Security + JWT |
| 实习生档案 | 完整生命周期管理 | MyBatis Plus动态查询 |
| 考勤管理 | 打卡记录与异常处理 | 腾讯位置服务API集成 |
| 任务系统 | 任务发布与进度跟踪 | WebSocket实时通知 |
| 考核评价 | 多维度评估体系 | 自定义评分规则引擎 |
| 数据统计 | 可视化数据分析 | ECharts集成 |
数据库设计遵循第三范式,核心表包括:
- 用户表(sys_user)
- 角色表(sys_role)
- 实习生表(intern)
- 考勤记录表(attendance)
- 任务表(task)
- 考核表(evaluation)
3. 核心功能实现
3.1 权限控制系统
采用RBAC(基于角色的访问控制)模型,实现精细化的权限管理:
// 权限校验核心逻辑 @PreAuthorize("hasRole('HR') or hasAuthority('intern:manage')") @PostMapping("/interns") public Result addIntern(@Valid @RequestBody InternDTO dto) { return internService.saveIntern(dto); }开发中遇到的典型问题及解决方案:
- 权限缓存不一致:通过Redis统一管理权限数据,设置合理过期时间
- 前端按钮级权限控制:自定义v-permission指令实现
- JWT续期问题:采用双token机制(access_token + refresh_token)
3.2 考勤定位校验
为防止虚假打卡,系统集成腾讯位置服务API:
// 前端获取地理位置 const getLocation = () => { return new Promise((resolve) => { if (navigator.geolocation) { navigator.geolocation.getCurrentPosition( (position) => { resolve({ lat: position.coords.latitude, lng: position.coords.longitude }); }, (error) => { // 错误处理逻辑 } ); } }); };后台校验逻辑:
- 比对打卡坐标与预设办公地点围栏
- 记录设备信息防止代打卡
- 异常打卡自动触发审批流程
4. 开发经验与优化技巧
4.1 后端性能优化
- 接口响应优化:
- 启用MyBatis Plus二级缓存
- 复杂查询使用@Transactional(readOnly = true)
- 分页查询统一使用PageHelper插件
- 数据库优化实践:
- 建立复合索引:如(company_id, status)组合查询
- 大文本字段单独建表:如实习评价内容
- 定期归档历史数据:设置archive策略
4.2 前端开发技巧
- 状态管理方案:
- 简单场景使用Pinia替代Vuex
- 复杂表单使用v-model配合computed
- 全局状态通过provide/inject传递
- 组件化实践:
- 表格封装为动态组件,支持配置化列
- 表单验证统一使用async-validator
- 自定义指令处理权限和业务逻辑
5. 典型问题排查记录
5.1 跨域问题解决方案
开发环境配置:
@Configuration public class CorsConfig implements WebMvcConfigurer { @Override public void addCorsMappings(CorsRegistry registry) { registry.addMapping("/**") .allowedOrigins("*") .allowedMethods("*") .maxAge(3600); } }生产环境注意事项:
- 严格限制allowedOrigins为可信域名
- 敏感接口禁用CORS,使用Nginx反向代理
- 预检请求缓存时间不宜过长
5.2 文件上传漏洞防护
安全措施实现:
- 文件类型白名单校验
private static final List<String> ALLOWED_EXTENSIONS = Arrays.asList("jpg", "png", "pdf"); public void validateFile(MultipartFile file) { String ext = getExtension(file.getOriginalFilename()); if (!ALLOWED_EXTENSIONS.contains(ext.toLowerCase())) { throw new IllegalFileTypeException(); } }- 病毒扫描集成:
- 调用ClamAV进行病毒检测
- 大文件分块检查
- 可疑文件自动隔离
6. 部署与运维实践
6.1 生产环境部署
推荐使用Docker Compose编排:
version: '3' services: mysql: image: mysql:5.7 environment: MYSQL_ROOT_PASSWORD: ${DB_PASSWORD} volumes: - ./mysql-data:/var/lib/mysql backend: build: ./backend ports: - "8080:8080" depends_on: - mysql关键配置项:
- JVM参数调优:-Xmx根据服务器内存设置
- 日志分割:使用logback-spring.xml配置
- 健康检查:集成Spring Boot Actuator
6.2 监控方案
基础监控体系:
- Prometheus + Grafana监控:
- JVM内存使用
- 接口响应时间
- 数据库连接池状态
- 业务监控:
- 每日活跃实习生数
- 任务逾期率
- 考勤异常率
这个项目从技术选型到最终上线历时3个月,最大的收获是理解了企业级应用开发中稳定性与开发效率的平衡。特别是在权限设计和数据安全方面,需要考虑的细节远超学校项目。建议后续可以增加实习生能力画像功能,通过机器学习分析实习生的成长轨迹