
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_token3.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 ListString 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 Actuator6.2 监控方案基础监控体系Prometheus Grafana监控JVM内存使用接口响应时间数据库连接池状态业务监控每日活跃实习生数任务逾期率考勤异常率这个项目从技术选型到最终上线历时3个月最大的收获是理解了企业级应用开发中稳定性与开发效率的平衡。特别是在权限设计和数据安全方面需要考虑的细节远超学校项目。建议后续可以增加实习生能力画像功能通过机器学习分析实习生的成长轨迹