1. 项目定位与架构选型:为什么是SSM + 微信小程序
每年到毕业设计季,我都能收到大量类似的问题:实习管理类系统到底怎么选型?能不能用Spring Boot?前端用Vue还是小程序?说实话,技术选型没有绝对的对错,只有合不合适的区别。这个项目选择SSM框架 + 微信小程序的组合,并不是随大流,而是出于几个非常实际的考量。
先说SSM框架,也就是Spring + SpringMVC + MyBatis。这个组合在当下的企业级开发里确实不算最前沿,Spring Boot已经成为新项目的主流选择,但对于学生项目、课程设计以及那些需要快速搭建、稳定运行的业务系统来说,SSM依然是一个非常扎实的底子。为什么?因为SSM的边界非常清晰:Spring负责对象管理和事务控制,SpringMVC负责HTTP请求的路由和参数绑定,MyBatis负责数据库操作。这种各司其职的结构,对于理解Java Web开发的核心流程非常有帮助,而且绝大多数高校的课程内容仍然围绕SSM展开,遇到问题查资料、问老师都方便得多。
再说微信小程序端。这里要展开讲一下,因为很多人在选型时纠结的是:为什么不做App?为什么不做H5?我的看法是,实习记录这个业务场景,核心使用场景是学生在外实习期间快速记录工作内容,比如在地铁上、在公司工位上、在回学校的路上,掏出手机随手记录一段文字拍一张照片。小程序天然契合这个场景:无需安装、微信内即点即用、不占用手机存储空间,最重要的是学生群体对微信的依赖度极高,从微信聊天切到小程序记录实习内容,路径极短。
从通信机制上看,小程序端和SSM后端的交互模式是典型的前后端分离。小程序通过wx.request发起HTTP请求,后端以RESTful风格提供JSON接口,两者通过HTTPS协议通信。这种架构的一个明显好处是,将来业务扩张到需要App端或PC管理后台时,后端接口可以几乎不改动地复用,只需要新增前端入口就行。
这个项目的完整技术栈如下表所示:
| 层次 | 选型 | 说明 |
|---|---|---|
| 客户端 | 微信小程序原生开发 | 不需要额外引入uni-app等跨端框架,原生开发稳定性最高,调试最直接 |
| 服务端 | Spring + SpringMVC + MyBatis | 经典的SSM组合,Maven管理依赖,打War包部署到Tomcat |
| 数据库 | MySQL 5.7+ | InnoDB引擎,utf8mb4字符集,保证中文和表情符号存储无压力 |
| 工具 | IDEA + 微信开发者工具 + Navicat | 后端开发、小程序调试、数据库可视化操作各司其职 |
这个选型方案还有一个隐藏的好处:学习资料极其丰富。不管是SSM整合过程、微信小程序登录流程,还是MySQL表设计,网上随便一搜都有大量的博客、视频和开源项目可以参考。对于时间紧、任务重的毕业设计来说,这一点非常关键。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 核心需求拆解与数据库设计:先把业务想清楚再动手
很多人拿到这类题目就直接开始写代码,结果写到一半发现业务逻辑捋不清、表结构设计不合理,只能推倒重来。我个人的习惯是,先花半天到一天时间把需求彻底拆透,把每一张表、每一个状态都设计好,再开始动键盘。这个项目虽然叫"实习记录小程序系统",但它的业务逻辑远比表面上看起来的要复杂。
2.1 用户角色与权限边界
这个系统里有三类核心角色,每类角色对系统的需求和权限边界完全不同:
- 学生:注册登录后,可以维护个人基本信息,填写实习单位信息,提交每日/每周的实习记录,查看指导教师的审核意见,修改被驳回的记录后重新提交。
- 指导教师:查看自己所带学生的名单,审核学生提交的实习记录,给出"通过"或"驳回"的意见,对实习情况进行简单的统计和跟踪。
- 系统管理员:管理全部用户账号,维护专业、班级等基础数据,查看整体实习进展数据。
需要注意的是,学生和指导教师的身份可以统一存放在一张用户表中,通过role字段区分,但是学生的学号、班级等扩展信息,以及教师的工号、职称等扩展信息,则需要单独的表来存储。这样可以避免一张表里堆太多字段,也方便将来扩展其他角色。
2.2 数据库表结构设计
这个项目的核心表我建议至少设计以下几张:
用户表(sys_user)
| 字段 | 类型 | 说明 |
|---|---|---|
| id | bigint | 主键,自增 |
| username | varchar(50) | 登录账号(学号/工号) |
| password | varchar(100) | 密码,BCrypt加密存储 |
| role | int | 1-学生,2-教师,3-管理员 |
| create_time | datetime | 创建时间 |
学生信息表(tb_student)
| 字段 | 类型 | 说明 |
|---|---|---|
| id | bigint | 主键 |
| user_id | bigint | 关联sys_user表 |
| student_no | varchar(30) | 学号 |
| name | varchar(30) | 姓名 |
| major | varchar(50) | 专业 |
| class_name | varchar(50) | 班级 |
| teacher_id | bigint | 指导教师ID,关联教师表 |
| phone | varchar(20) | 联系电话 |
教师信息表(tb_teacher)
| 字段 | 类型 | 说明 |
|---|---|---|
| id | bigint | 主键 |
| user_id | bigint | 关联sys_user表 |
| teacher_no | varchar(30) | 工号 |
| name | varchar(30) | 姓名 |
| title | varchar(30) | 职称 |
实习单位表(tb_company)
| 字段 | 类型 | 说明 |
|---|---|---|
| id | bigint | 主键 |
| student_id | bigint | 关联学生表 |
| company_name | varchar(100) | 单位名称 |
| company_address | varchar(200) | 单位地址 |
| position | varchar(50) | 实习岗位 |
| start_date | date | 实习开始日期 |
| end_date | date | 实习结束日期 |
实习记录表(tb_practice_record)
| 字段 | 类型 | 说明 |
|---|---|---|
| id | bigint | 主键 |
| student_id | bigint | 关联学生表 |
| record_date | date | 记录日期 |
| work_content | text | 工作内容 |
| work_summary | text | 心得总结 |
| image_url |
