Leaf SMS 学生管理系统:Spring Boot3+Vue3 前后端分离开发与 Docker 部署
项目简介
Leaf SMS 是一款基于 Spring Boot 3 和 Vue 3 的学生信息管理系统,具备完善的多角色权限控制。这个项目最初是为了本科毕业设计而开发的,但随着功能的不断完善,现在已经成长为一个功能完整、架构清晰、易于扩展的学生管理系统。
系统采用了前后端分离的架构设计,后端使用 Spring Boot 3 框架,前端使用 Vue.js 3 配合 Element Plus 组件库,数据库采用 MySQL 8.0。
系统预览
首页

登录页面

注册页面

学生首页

教师首页

核心特性
-
完善的三端权限控制:系统分为管理员、教师、学生三个角色,每个角色都有独立的功能模块和权限控制。
-
JWT Token认证机制:采用 JSON Web Token 进行用户身份认证,无状态设计,支持分布式部署。
-
统一的异常处理和响应格式:后端采用统一的异常处理机制和响应格式,前端可以统一处理各种异常情况。
-
MyBatis Plus简化CRUD操作:使用 MyBatis Plus 框架,大大简化了数据库操作,支持分页查询、条件查询等高级功能。
-
分页查询支持:所有列表页面都支持分页查询,提高大数据量下的查询性能。
-
选课时间控制功能:管理员可以灵活控制选课功能的启用和禁用状态,以及设置选课的开始和结束时间。
-
密码加密存储:用户密码采用加密存储,确保用户信息安全。
-
CORS跨域支持:支持跨域访问,方便前后端分离部署。
-
全局请求拦截器:前端采用全局请求拦截器,统一处理Token添加、错误处理等逻辑。
技术栈
后端技术
后端采用 Spring Boot 3.1.0 作为核心框架,配合 MyBatis Plus 3.5.4.1 进行数据库操作。Spring Boot 3 是目前最新的稳定版本,提供了更好的性能和更多的特性。MyBatis Plus 是 MyBatis 的增强工具,在 MyBatis 的基础上只做增强不做改变,为简化开发、提高效率而生。
数据库采用 MySQL 8.0,这是目前最流行的开源关系型数据库之一,性能稳定,功能强大。认证方面使用 JWT (jjwt 0.11.5),这是一种基于 Token 的认证方式,相比传统的 Session 认证方式更加灵活和安全。
前端技术
前端采用 Vue.js 3 作为核心框架,这是目前最流行的前端框架之一,采用组合式 API,代码组织更加清晰。UI 组件库使用 Element Plus 2.10.4,这是基于 Vue 3 的企业级 UI 组件库,提供了丰富的组件和完善的文档。
前端采用模块化开发,将 API 接口、组件、页面、路由等分离管理,代码结构清晰,易于维护和扩展。
环境要求
在开始使用 Leaf SMS 之前,请确保您的开发环境满足以下要求:
- JDK 17+:Spring Boot 3 要求 JDK 版本至少为 17,推荐使用 JDK 17 或 JDK 21
- Node.js 16+:Vue 3 要求 Node.js 版本至少为 16,推荐使用 Node.js 18 或 Node.js 20
- MySQL 8.0+:数据库采用 MySQL 8.0 或更高版本
- Maven 3.6+:后端项目使用 Maven 进行依赖管理和构建
快速开始
数据库配置
项目根目录下有 init.sql 文件,包含数据库表结构和初始数据。
1. 创建数据库
bash
mysql -u root -p < init.sql
2. 修改数据库配置
编辑 backend-java/src/main/resources/application-dev.yml 文件:
yaml
spring:
datasource:
url: jdbc:mysql://localhost:3306/leaf_sms?useSSL=false&serverTimezone=Asia/Shanghai&allowPublicKeyRetrieval=true&characterEncoding=utf8
username: root
password: your_password
请将 your_password 替换为您实际的 MySQL 数据库密码。
后端启动
1. 进入后端目录
bash
cd backend-java
2. 编译运行
bash
mvn clean install
mvn spring-boot:run
后端服务将在 http://localhost:8081/api 启动。
前端启动
1. 进入前端目录
bash
cd frontend
2. 安装依赖
bash
npm install
3. 启动开发服务器
bash
npm run serve
前端服务将在 http://localhost:8080 启动。
Docker 部署
本节介绍如何使用 Docker 快速部署 Leaf SMS 系统。
前置要求
- Docker 20.10+:确保已安装 Docker
- init.sql 文件 :确保项目根目录下有
init.sql数据库初始化脚本
部署步骤
1. 创建 Docker 网络
bash
docker network create leaf-sms-network
2. 启动 MySQL 容器
bash
docker run -d \
--name=leaf-sms-mysql \
--restart=always \
--network=leaf-sms-network \
-p 3306:3306 \
-e MYSQL_ROOT_PASSWORD=123456 \
mysql:8.0
3. 初始化数据库
bash
docker exec -i leaf-sms-mysql mysql -uroot -p123456 < init.sql
4. 启动后端容器
bash
docker run -d \
--name=leaf-sms-backend \
--restart=always \
--network=leaf-sms-network \
-p 8081:8081 \
yangshengzhou/leafsms:backend-v1
5. 启动前端容器
bash
docker run -d \
--name=leaf-sms-frontend \
--restart=always \
--network=leaf-sms-network \
-p 80:80 \
yangshengzhou/leafsms:frontend-v1
6. 验证部署
bash
docker ps
应该看到三个容器都在运行:
bash
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
.. yangshengzhou/leafsms:frontend-v1 "/docker-entrypoint...." .. Up .. 0.0.0.0:80->80/tcp, [::]:80->80/tcp leaf-sms-frontend
.. yangshengzhou/leafsms:backend-v1 "java -jar /app/app...." .. Up .. 0.0.0.0:8081->8081/tcp, [::]:8081->8081/tcp leaf-sms-backend
.. mysql:8.0 "docker-entrypoint.s..." .. Up .. 0.0.0.0:3306->3306/tcp, [::]:3306->3306/tcp, 33060/tcp leaf-sms-mysql
在浏览器中访问 http://服务器IP 即可使用系统(例如:http://192.168.1.100)。
常用命令
查看容器日志
bash
docker logs leaf-sms-mysql
docker logs leaf-sms-backend
docker logs leaf-sms-frontend
停止容器
bash
docker stop leaf-sms-frontend leaf-sms-backend leaf-sms-mysql
启动容器
bash
docker start leaf-sms-mysql leaf-sms-backend leaf-sms-frontend
删除容器
bash
docker rm -f leaf-sms-frontend leaf-sms-backend leaf-sms-mysql
删除网络
bash
docker network rm leaf-sms-network
镜像信息
- 后端镜像 :
yangshengzhou/leafsms:backend-v1 - 前端镜像 :
yangshengzhou/leafsms:frontend-v1 - 数据库镜像 :
mysql:8.0
注意事项
- MySQL 密码 :默认 root 密码为
123456,生产环境建议修改为强密码 - 端口占用:确保 80、8081、3306 端口没有被其他程序占用
- 数据持久化 :当前配置未挂载数据卷,容器删除后数据会丢失,如需持久化请添加
-v参数挂载数据卷 - 防火墙设置:确保服务器防火墙已开放相应端口
数据持久化配置(可选)
bash
docker run -d \
--name=leaf-sms-mysql \
--restart=always \
--network=leaf-sms-network \
-p 3306:3306 \
-e MYSQL_ROOT_PASSWORD=123456 \
-v mysql-data:/var/lib/mysql \
mysql:8.0
默认账号
系统初始化时会创建三个默认用户,分别对应管理员、教师和学生角色。您可以使用这些账号登录系统进行测试。
管理员账号
- 邮箱:
admin@qq.com - 密码:
123456
管理员拥有系统的最高权限,可以管理所有用户、课程、部门、公告等数据,还可以配置系统参数,如选课时间控制等。
教师账号
- 邮箱:
teacher@qq.com - 密码:
123456
教师可以管理自己的课程,查看学生信息,录入和修改学生成绩,查看教学计划等。
学生账号
- 邮箱:
student@qq.com - 密码:
123456
学生可以查看个人信息,进行选课和退课操作,查询成绩和课表,查看公告等。
功能模块
管理员功能
管理员是系统的最高权限用户,负责整个系统的管理和维护工作。管理员功能模块包括:
-
用户管理:管理员可以对系统中的所有用户进行增删改查操作,包括学生、教师和管理员账号的创建、修改和删除。
-
课程管理:管理员可以管理所有课程信息,包括课程的基本信息、学分、学时、所属部门等,支持课程的增删改查操作。
-
成绩管理:管理员可以查看和管理所有学生的成绩信息,支持成绩的增删改查操作。
-
部门管理:管理员可以管理学校的部门信息,包括部门的创建、修改和删除,部门信息用于组织和管理课程和人员。
-
公告管理:管理员可以发布和管理系统公告,公告可以针对全体用户、学生或教师,支持公告的增删改查操作。
-
系统配置:管理员可以配置系统参数,特别是选课时间控制功能,可以设置选课的开始和结束时间,以及启用或禁用选课功能。管理员还可以管理学期信息,包括添加和删除学期,学期数据会从教学任务中自动提取。
-
个人资料管理:管理员可以查看和修改自己的个人信息,包括用户名、邮箱、手机号、地址等。
教师功能
教师是教学活动的主要执行者,负责课程教学和学生成绩管理。教师功能模块包括:
-
个人信息管理:教师可以查看和修改自己的个人信息,包括用户名、邮箱、手机号、地址等。
-
学生管理:教师可以查看选修自己课程的学生信息,了解学生的基本情况。
-
课程管理:教师可以管理自己负责的课程,包括课程的基本信息、教学安排、教室分配等,支持课程的增删改查操作。
-
成绩录入与管理:教师可以录入和修改选修自己课程的学生成绩,包括平时成绩、期中成绩、期末成绩等,系统会自动计算总成绩和等级。
-
教学计划查看:教师可以查看自己的教学计划,了解课程安排和时间表。
学生功能
学生是系统的主要使用者,通过系统进行选课、查询成绩和课表等操作。学生功能模块包括:
-
个人信息管理:学生可以查看和修改自己的个人信息,包括用户名、邮箱、手机号、地址等。
-
选课/退课:学生可以在选课时间内选择或退选课程,系统会实时显示可选课程和已选课程,以及已选学分等信息。
-
成绩查询:学生可以查询自己的所有课程成绩,包括平时成绩、期中成绩、期末成绩、总成绩和等级等信息。
-
课表查询:学生可以查看自己的课程表,了解课程的时间、地点等信息。
-
公告查看:学生可以查看系统发布的公告,了解学校的最新通知和安排。
API接口说明
系统采用 RESTful API 设计,所有接口都返回统一的 JSON 格式数据。以下是主要的 API 接口说明。
登录接口
登录接口用于用户身份认证,支持密码登录和邮箱登录两种方式。
POST /login/password- 密码登录,邮箱和密码作为请求参数POST /login/email- 邮箱登录,邮箱和验证码作为请求参数POST /login/resetPassword- 重置密码,需要提供邮箱和验证码POST /login/sendCode- 发送验证码,用于邮箱登录和密码重置GET /login/profile- 获取个人信息,需要携带 JWT TokenPUT /login/profile- 更新个人信息,需要携带 JWT Token
管理员接口
管理员接口用于管理系统的各项数据,包括用户、课程、部门、公告、成绩等。
GET /admin/home- 获取首页统计数据,包括用户数、课程数、部门数等GET /admin/users- 获取用户列表,支持分页和条件查询POST /admin/users- 添加新用户,包括学生、教师和管理员PUT /admin/users- 更新用户信息DELETE /admin/users/{userId}- 删除指定用户GET /admin/courses- 获取课程列表,支持分页和条件查询POST /admin/courses- 添加新课程PUT /admin/courses- 更新课程信息DELETE /admin/courses/{courseId}- 删除指定课程GET /admin/departments- 获取部门列表,支持分页和条件查询POST /admin/departments- 添加新部门PUT /admin/departments- 更新部门信息DELETE /admin/departments/{departmentId}- 删除指定部门GET /admin/announcements- 获取公告列表,支持分页和条件查询GET /admin/announcements/{announcementId}- 获取公告详情POST /admin/announcements- 创建新公告PUT /admin/announcements- 更新公告信息DELETE /admin/announcements/{announcementId}- 删除指定公告GET /admin/grades- 获取成绩列表,支持分页和条件查询PUT /admin/grades- 更新成绩信息DELETE /admin/grades/{gradeId}- 删除指定成绩
系统配置接口
系统配置接口用于管理系统参数,包括选课时间控制、学期管理和系统配置项。
GET /admin/config/course-selection- 获取选课配置,包括选课开始时间、结束时间、是否启用等POST /admin/config/course-selection/update- 更新选课配置GET /admin/config- 获取系统配置列表,支持分页和条件查询GET /admin/config/{configId}- 获取指定配置详情POST /admin/config- 创建新系统配置PUT /admin/config- 更新系统配置信息DELETE /admin/config/{configId}- 删除指定系统配置GET /admin/semesters- 获取学期列表POST /admin/semesters- 添加新学期DELETE /admin/semesters/{semester}- 删除指定学期
学生接口
学生接口用于学生进行选课、查询成绩和课表等操作。
GET /student/home- 获取首页统计数据,包括已选课程数、已完成课程数、平均成绩等GET /student/grades/pagination- 分页获取成绩列表GET /student/schedule- 获取课表信息GET /student/announcements- 获取公告列表GET /student/courses/available/pagination- 分页获取可选课程列表GET /student/courses/selected/pagination- 分页获取已选课程列表POST /student/courses/select- 选择课程POST /student/courses/drop- 退选课程
教师接口
教师接口用于教师管理课程和学生成绩。
GET /teacher/home- 获取首页统计数据,包括课程数、学生数等GET /teacher/students- 获取学生列表,支持分页和条件查询GET /teacher/students/stats- 获取学生统计数据,包括总学生数、正常在校人数、特殊状态人数、专业数量GET /teacher/courses- 获取课程列表,支持分页和条件查询GET /teacher/departments- 获取部门列表,支持分页和条件查询POST /teacher/courses- 创建新课程PUT /teacher/courses/{assignmentId}- 更新课程信息DELETE /teacher/courses/{assignmentId}- 删除指定课程GET /teacher/courses/{courseId}/grades- 获取课程成绩列表PUT /teacher/course-grades/{selectionId}- 更新成绩信息DELETE /teacher/course-grades/{selectionId}- 删除指定成绩
注意事项
-
确保MySQL服务已启动:启动后端服务前,确保 MySQL 服务已启动,数据库已创建并初始化。
-
确保数据库配置正确 :确保
application-dev.yml中的数据库连接信息正确。 -
端口不要冲突:前端默认使用 8080 端口,后端默认使用 8081 端口,请确保端口未被占用。
-
首次运行需要执行init.sql :首次运行项目时,需要执行
init.sql文件创建数据库表结构和初始数据。 -
默认密码为123456 :系统默认用户的密码都是
123456,正式使用时建议修改默认密码。 -
JWT Token认证 :需要认证的接口需在请求头中携带 JWT Token,格式为
Authorization: Bearer {token}。 -
选课时间控制:管理员可以控制选课功能的启用/禁用状态,设置选课的开始和结束时间。
项目结构
Leaf SMS 采用前后端分离的架构,项目结构清晰,便于理解和扩展。
leaf-sms/
├── backend-java/ # 后端项目
│ ├── src/
│ │ ├── java/ # Java源码
│ │ │ └── com/leafsms/
│ │ │ ├── common/ # 通用类,包括Result、PageResult等
│ │ │ ├── config/ # 配置类,包括MyBatisPlusConfig、WebMvcConfig等
│ │ │ ├── controller/ # 控制器,处理HTTP请求
│ │ │ ├── entity/ # 实体类,对应数据库表
│ │ │ ├── interceptor/ # 拦截器,包括JWT拦截器
│ │ │ ├── mapper/ # 数据访问层,MyBatis Mapper接口
│ │ │ ├── service/ # 业务逻辑层,包括Service接口和实现类
│ │ │ └── util/ # 工具类,包括JWT工具类、Excel工具类等
│ │ └── resources/ # 配置文件,包括application.yml、application-dev.yml等
│ └── pom.xml # Maven配置文件
├── frontend/ # 前端项目
│ ├── src/
│ │ ├── api/ # API接口,封装所有后端接口调用
│ │ ├── assets/ # 静态资源,包括图片、样式等
│ │ ├── components/ # 组件,包括布局组件等
│ │ ├── views/ # 页面,包括所有业务页面
│ │ ├── router/ # 路由配置
│ │ └── utils/ # 工具函数,包括请求封装等
│ └── package.json # npm配置文件
└── init.sql # 数据库初始化脚本
常见问题
在使用 Leaf SMS 的过程中,可能会遇到一些常见问题,这里提供一些解决方案。
1. 后端启动失败
如果后端启动失败,请检查以下几个方面:
- 检查 JDK 版本是否为 17+,Spring Boot 3 要求 JDK 版本至少为 17
- 检查 MySQL 连接配置是否正确,包括数据库名称、用户名和密码
- 检查端口 8081 是否被其他程序占用
- 确保数据库已经创建并初始化,执行了
init.sql文件
2. 前端启动失败
如果前端启动失败,请检查以下几个方面:
- 检查 Node.js 版本是否为 16+,Vue 3 要求 Node.js 版本至少为 16
- 删除
node_modules文件夹,重新执行npm install安装依赖 - 检查端口 8080 是否被其他程序占用
3. 登录失败
如果登录失败,请检查以下几个方面:
- 检查数据库是否已经初始化,执行了
init.sql文件 - 检查邮箱和密码是否正确,默认密码都是
123456 - 查看后端日志,排查具体的错误信息
4. 接口401错误
如果接口返回 401 错误,表示未授权访问,请检查以下几个方面:
- 检查 JWT Token 是否过期,Token 有效期一般为 24 小时
- 检查请求头是否正确携带 Token,格式为
Authorization: Bearer {token} - 重新登录获取新的 Token
开发说明
本项目为本科毕业设计,代码结构清晰,功能完整。如果您想基于本项目进行二次开发,建议按照以下步骤进行:
-
先熟悉数据库表结构:了解各个表之间的关系和字段含义,这是理解系统功能的基础。
-
了解前后端接口对应关系:查看前端 API 文件和后端 Controller,了解前后端是如何交互的。
-
参考现有功能模块进行扩展:在添加新功能时,参考现有功能的实现方式,保持代码风格一致。
-
遵循现有的代码规范和命名规则:保持代码风格一致,便于维护和协作。