SpringBoot+Vue3学生管理系统实战:从零搭建到源码解析

张开发
2026/4/20 5:45:54 15 分钟阅读

分享文章

SpringBoot+Vue3学生管理系统实战:从零搭建到源码解析
1. 环境准备与工具安装要搭建一个完整的SpringBootVue3学生管理系统首先需要配置好开发环境。这里我推荐使用2024年主流的开发工具组合避免使用过时的技术栈。实测下来这套配置在Windows和MacOS系统都能稳定运行我自己在多个项目中验证过。开发Java后端首选IntelliJ IDEA社区版完全够用。安装时建议勾选Add launchers dir to the PATH选项这样可以在终端直接输入idea命令启动。前端开发推荐VS Code搭配Volar插件对Vue3的支持非常完善。JDK建议选择长期支持版本目前JDK17是最佳选择。安装完成后记得检查环境变量java -version javac -version如果两个命令都能正确输出版本信息说明配置成功。Maven建议使用3.8.x以上版本配置settings.xml时要注意镜像源的选择国内开发者可以使用阿里云镜像加速依赖下载。MySQL安装时建议选择8.0版本初始化时记得设置密码加密方式为mysql_native_password避免新版默认的caching_sha2_password导致连接问题。Node.js选择16.x或18.x的LTS版本即可安装后检查node -v npm -v2. 项目初始化与模板工程我推荐使用优化后的youlai-boot作为基础模板相比原版若依框架它删减了约40%的冗余代码保留了核心功能模块。这个模板已经配置好了Spring Security和JWT的整合省去了从零搭建权限系统的麻烦。后端项目克隆命令git clone https://gitee.com/dwp1216/boot4j.git前端项目克隆git clone https://gitee.com/dwp1216/boot4j_ui.git导入IDEA后需要特别注意几点Maven依赖下载完成后检查是否有红色报错application.yml中的数据库配置需要修改为自己的前端项目的.env文件需要配置VITE_API_BASE_URL3. 数据库设计与建模学生管理系统的核心表结构设计要考虑扩展性。我在原模板基础上增加了学生信息表、课程表和成绩表采用三范式设计原则。关键点在于处理好学生-课程之间的多对多关系。学生表设计示例CREATE TABLE student ( id bigint NOT NULL AUTO_INCREMENT, student_no varchar(20) NOT NULL COMMENT 学号, name varchar(50) NOT NULL COMMENT 姓名, gender tinyint DEFAULT 0 COMMENT 性别(0:未知 1:男 2:女), birthday date DEFAULT NULL COMMENT 出生日期, class_id bigint DEFAULT NULL COMMENT 班级ID, status tinyint DEFAULT 1 COMMENT 状态(0:禁用 1:正常), create_time datetime DEFAULT CURRENT_TIMESTAMP, update_time datetime DEFAULT NULL ON UPDATE CURRENT_TIMESTAMP, PRIMARY KEY (id), UNIQUE KEY uk_student_no (student_no) ) ENGINEInnoDB DEFAULT CHARSETutf8mb4;成绩表设计特别注意索引优化CREATE TABLE score ( id bigint NOT NULL AUTO_INCREMENT, student_id bigint NOT NULL, course_id bigint NOT NULL, score decimal(5,2) DEFAULT NULL, term varchar(20) DEFAULT NULL COMMENT 学期, create_time datetime DEFAULT CURRENT_TIMESTAMP, PRIMARY KEY (id), UNIQUE KEY uk_student_course (student_id,course_id,term), KEY idx_course (course_id) ) COMMENT成绩表;4. 核心功能实现4.1 学生信息管理模块后端采用MyBatis-Plus实现快速开发Service层代码示例Service RequiredArgsConstructor public class StudentServiceImpl implements StudentService { private final StudentMapper studentMapper; Override public PageStudentVO pageQuery(StudentQueryDTO queryDTO) { PageStudent page new Page(queryDTO.getPageNum(), queryDTO.getPageSize()); LambdaQueryWrapperStudent wrapper Wrappers.lambdaQuery(Student.class) .like(StringUtils.isNotBlank(queryDTO.getName()), Student::getName, queryDTO.getName()) .eq(queryDTO.getClassId() ! null, Student::getClassId, queryDTO.getClassId()) .orderByDesc(Student::getCreateTime); return studentMapper.selectPage(page, wrapper).convert(this::toVo); } private StudentVO toVo(Student entity) { // 对象转换逻辑 } }前端使用Vue3的Composition API实现表格展示script setup const queryParams reactive({ name: , classId: null, pageNum: 1, pageSize: 10 }) const { data, loading, execute } useAxios({ url: /api/student/page, method: get, params: queryParams }, { immediate: false }) watchEffect(() { execute() }) /script4.2 权限控制实现系统采用RBAC权限模型前端路由守卫实现方案router.beforeEach(async (to) { const userStore useUserStore() if (!userStore.token) { if (to.meta.requiresAuth) { return { path: /login, query: { redirect: to.fullPath } } } return true } if (!userStore.hasRoles) { try { await userStore.fetchUserInfo() const routes await userStore.generateRoutes() routes.forEach(route { router.addRoute(route) }) return to.fullPath } catch (err) { userStore.resetToken() return /login } } if (to.meta.roles !userStore.hasPermission(to.meta.roles)) { return /403 } })后端接口权限使用Spring Security配置Configuration EnableWebSecurity RequiredArgsConstructor public class SecurityConfig { private final JwtAuthenticationFilter jwtFilter; Bean SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception { http .csrf().disable() .sessionManagement().sessionCreationPolicy(SessionCreationPolicy.STATELESS) .and() .authorizeRequests() .antMatchers(/api/auth/**).permitAll() .antMatchers(/api/student/**).hasAnyRole(ADMIN, TEACHER) .antMatchers(/api/score/**).hasRole(TEACHER) .anyRequest().authenticated(); http.addFilterBefore(jwtFilter, UsernamePasswordAuthenticationFilter.class); return http.build(); } }5. 项目优化与部署5.1 性能优化建议接口响应优化添加Spring Cache缓存学生基础信息Cacheable(value student, key #id) public StudentVO getById(Long id) { return studentMapper.selectById(id); }前端打包优化配置vite的chunk分割build: { rollupOptions: { output: { manualChunks(id) { if (id.includes(node_modules)) { return vendor } } } } }5.2 部署方案推荐使用Docker Compose部署整套系统version: 3 services: mysql: image: mysql:8.0 environment: MYSQL_ROOT_PASSWORD: root volumes: - ./mysql/data:/var/lib/mysql backend: build: ./backend ports: - 8080:8080 depends_on: - mysql frontend: build: ./frontend ports: - 80:80后端Dockerfile示例FROM openjdk:17-jdk COPY target/student-system.jar app.jar ENTRYPOINT [java,-jar,/app.jar]6. 常见问题排查在开发过程中可能会遇到几个典型问题前端跨域问题确保后端配置了正确的CORSBean WebMvcConfigurer corsConfigurer() { return new WebMvcConfigurer() { Override public void addCorsMappings(CorsRegistry registry) { registry.addMapping(/**) .allowedOrigins(*) .allowedMethods(*) .allowedHeaders(*); } }; }JWT失效问题检查服务端和客户端的时钟是否同步MyBatis-Plus分页不生效确认配置了分页插件Configuration public class MyBatisPlusConfig { Bean public MybatisPlusInterceptor mybatisPlusInterceptor() { MybatisPlusInterceptor interceptor new MybatisPlusInterceptor(); interceptor.addInnerInterceptor(new PaginationInnerInterceptor()); return interceptor; } }这套学生管理系统经过多个学校的实际使用验证能够支撑2000学生的日常管理需求。开发时特别要注意数据权限的控制比如班主任只能看到自己班级的学生信息。源码中已经实现了基于部门的数据权限控制开发者可以根据实际需求进行调整。

更多文章