ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

基于SpringBoot的大学生兼职家教系统设计开发实现

基于SpringBoot的大学生兼职家教系统设计开发实现 温馨提示本人主页置顶文章(点我)开头有 CSDN 平台官方提供的学长联系方式的名片1. 项目背景与意义随着高等教育的普及大学生群体数量持续增长兼职家教成为许多在校学生获取实践经验、缓解经济压力的重要途径。然而传统家教信息获取方式主要依赖熟人介绍、线下中介或零散的网络信息普遍存在信息不对称、匹配效率低、交易缺乏保障等问题。一方面家长难以快速找到专业对口、时间匹配且信誉可靠的大学生家教另一方面大学生也缺乏一个集中、可信的平台来发布自己的授课能力和可支配时间。信息分散在微信群、QQ群、贴吧等渠道导致沟通成本高、筛选困难。基于SpringBoot的大学生兼职家教系统旨在解决上述痛点通过信息化手段搭建一个连接家长与大学生家教的双向平台。系统提供家教信息发布、智能检索、在线预约、订单管理、评价反馈等核心功能能够有效提升家教匹配效率降低沟通成本并为交易过程提供一定的规范化保障。该系统的设计与实现既具有服务校园与社区的实际应用价值也是SpringBoot、MyBatis-Plus、Vue等主流前后端技术栈在真实业务场景中的综合实践。2. 系统技术栈本系统采用前后端分离架构后端基于SpringBoot构建RESTful API前端使用Vue框架配合Element UI组件库数据库选用MySQLORM层使用MyBatis-Plus。整体技术选型兼顾了开发效率、生态成熟度与后期可维护性。层次技术选型说明后端框架SpringBoot 2.7.x快速构建独立运行的Spring应用简化配置持久层MyBatis-Plus 3.5.x增强MyBatis提供通用CRUD、分页、条件构造器数据库MySQL 8.0存储用户、家教信息、订单、评价等业务数据权限认证Spring Security JWT实现登录认证与接口访问控制前端框架Vue 3 Element Plus构建单页应用提供组件化开发体验构建工具Maven / npm后端依赖管理与前端工程化构建接口文档Knife4jSwagger增强自动生成在线接口调试文档除上述核心组件外系统还使用Lombok简化实体类开发使用Hutool工具库处理通用业务逻辑并通过Redis缓存热点数据以提升查询性能。3. 系统功能模块设计根据角色划分系统主要包含三类用户家长雇主、大学生家教兼职者以及系统管理员。不同角色拥有差异化的功能权限。3.1 家长端功能账号注册与登录家长通过手机号注册账号登录后可维护个人资料。家教信息浏览与搜索按科目、年级、授课方式、价格区间等条件筛选合适的家教。在线预约下单对心仪的家教发起预约填写授课时间、地点、课时费等需求。订单管理查看订单状态待接单、进行中、已完成、已取消确认完成并结算。评价反馈订单完成后对家教的授课质量进行评分和文字评价。3.2 大学生家教端功能个人简历管理填写学校、专业、年级、可授课科目、家教经验、自我简介等信息。接单管理查看家长发起的预约请求接受或拒绝订单。授课日程管理维护自己的可授课时间段避免时间冲突。收入记录查看已完成订单的课时费收入明细。3.3 管理员端功能用户管理审核注册用户禁用违规账号。信息审核审核家教发布的简历信息确保真实合规。订单监管查看全平台订单流转情况处理纠纷投诉。数据统计统计注册用户数、订单量、交易金额等运营指标。4. 数据库设计系统核心数据表包括用户表、家教信息表、订单表、评价表和科目分类表。下面给出主要表的结构说明。4.1 用户表t_user字段名类型说明idbigint主键自增usernamevarchar(50)登录用户名passwordvarchar(100)加密后的密码phonevarchar(20)手机号roletinyint角色1家长2家教3管理员statustinyint账号状态0正常1禁用create_timedatetime注册时间4.2 家教信息表t_tutor_info字段名类型说明idbigint主键自增user_idbigint关联用户表家教账号IDschoolvarchar(100)就读学校majorvarchar(100)专业gradevarchar(50)年级subjectsvarchar(200)可授课科目逗号分隔price_per_hourdecimal(10,2)每小时课时费experiencetext家教经验描述statustinyint审核状态0待审核1通过2驳回4.3 订单表t_order字段名类型说明idbigint主键自增order_novarchar(50)订单编号parent_idbigint家长用户IDtutor_idbigint家教用户IDsubjectvarchar(50)授课科目class_hourint课时数total_amountdecimal(10,2)订单总金额statustinyint0待接单1进行中2已完成3已取消create_timedatetime下单时间5. 核心功能实现与代码本节选取系统中最具代表性的几个功能点给出核心代码实现。5.1 登录认证与JWT签发系统使用Spring Security整合JWT实现无状态认证。用户登录成功后后端生成JWT令牌返回给前端前端在后续请求中通过Authorization请求头携带令牌。下面给出登录接口的核心实现。RestController RequestMapping(/api/auth) public class AuthController { Resource private AuthService authService; PostMapping(/login) public Resultlt;LoginVOgt; login(RequestBody LoginDTO dto) { // 调用认证服务完成登录校验并签发JWT LoginVO vo authService.login(dto.getUsername(), dto.getPassword()); return Result.success(vo); } }认证服务中通过UserDetailsService加载用户信息使用PasswordEncoder比对密码校验通过后生成JWT令牌。Service public class AuthServiceImpl implements AuthService { Resource private UserMapper userMapper; Resource private PasswordEncoder passwordEncoder; Resource private JwtUtil jwtUtil; Override public LoginVO login(String username, String rawPassword) { User user userMapper.selectOne( new LambdaQueryWrapperlt;Usergt;() .eq(User::getUsername, username)); if (user null) { throw new BusinessException(用户名或密码错误); } if (!passwordEncoder.matches(rawPassword, user.getPassword())) { throw new BusinessException(用户名或密码错误); } if (user.getStatus() 1) { throw new BusinessException(账号已被禁用请联系管理员); } // 生成JWT令牌有效期24小时 String token jwtUtil.generateToken(user.getId(), user.getRole()); LoginVO vo new LoginVO(); vo.setToken(token); vo.setUserId(user.getId()); vo.setUsername(user.getUsername()); vo.setRole(user.getRole()); return vo; } }5.2 家教信息发布与审核大学生家教登录后可以发布或更新自己的家教简历。发布时系统会校验必填字段并将状态置为待审核。管理员审核通过后该简历才会在前台展示给家长浏览。Service public class TutorInfoServiceImpl implements TutorInfoService { Resource private TutorInfoMapper tutorInfoMapper; Override public void publish(TutorInfoDTO dto, Long userId) { // 校验必填字段 if (StrUtil.hasBlank(dto.getSchool(), dto.getMajor(), dto.getSubjects())) { throw new BusinessException(学校、专业、授课科目不能为空); } TutorInfo info new TutorInfo(); BeanUtil.copyProperties(dto, info); info.setUserId(userId); info.setStatus(0); // 待审核 tutorInfoMapper.insert(info); } Override public void audit(Long infoId, Integer status) { TutorInfo info tutorInfoMapper.selectById(infoId); if (info null) { throw new BusinessException(家教信息不存在); } info.setStatus(status); tutorInfoMapper.updateById(info); } }5.3 家教检索与分页查询家长端通过科目、价格区间等条件检索家教。系统使用MyBatis-Plus的分页插件和LambdaQueryWrapper实现动态条件查询避免手写复杂SQL。Service public class TutorSearchServiceImpl implements TutorSearchService { Resource private TutorInfoMapper tutorInfoMapper; Override public Pagelt;TutorInfoVOgt; search(TutorQueryDTO query) { // 构建分页对象 Pagelt;TutorInfogt; page new Pagelt;gt;(query.getPageNum(), query.getPageSize()); // 动态条件查询 LambdaQueryWrapperlt;TutorInfogt; wrapper new LambdaQueryWrapperlt;gt;(); wrapper.eq(TutorInfo::getStatus, 1); // 仅查询审核通过的家教 if (StrUtil.isNotBlank(query.getSubject())) { wrapper.like(TutorInfo::getSubjects, query.getSubject()); } if (query.getMaxPrice() ! null) { wrapper.le(TutorInfo::getPricePerHour, query.getMaxPrice()); } wrapper.orderByDesc(TutorInfo::getCreateTime); // 执行分页查询 Pagelt;TutorInfogt; result tutorInfoMapper.selectPage(page, wrapper); // 转换为VO返回 return convertToVO(result); } }5.4 订单创建与状态流转家长选定家教后发起预约下单系统生成唯一订单编号并记录订单信息。家教端可以接受或拒绝订单订单状态随之流转。Service public class OrderServiceImpl implements OrderService { Resource private OrderMapper orderMapper; Resource private TutorInfoMapper tutorInfoMapper; Override public Long createOrder(OrderCreateDTO dto, Long parentId) { // 校验家教信息是否存在且已审核通过 TutorInfo tutor tutorInfoMapper.selectById(dto.getTutorInfoId()); if (tutor null || tutor.getStatus() ! 1) { throw new BusinessException(家教信息不可用); } Order order new Order(); order.setOrderNo(generateOrderNo()); order.setParentId(parentId); order.setTutorId(tutor.getUserId()); order.setSubject(dto.getSubject()); order.setClassHour(dto.getClassHour()); // 计算总金额 课时数 * 每小时单价 BigDecimal total tutor.getPricePerHour() .multiply(BigDecimal.valueOf(dto.getClassHour())); order.setTotalAmount(total); order.setStatus(0); // 待接单 orderMapper.insert(order); return order.getId(); } Override public void acceptOrder(Long orderId, Long tutorId) { Order order orderMapper.selectById(orderId); if (order null || !order.getTutorId().equals(tutorId)) { throw new BusinessException(订单不存在或无权操作); } if (order.getStatus() ! 0) { throw new BusinessException(订单当前状态不可接单); } order.setStatus(1); // 进行中 orderMapper.updateById(order); } private String generateOrderNo() { return ORD System.currentTimeMillis() RandomUtil.randomNumbers(4); } }5.5 前端核心页面示例前端使用Vue 3组合式API开发。下面给出家教列表页的核心代码片段展示如何调用后端接口并渲染数据。template div classtutor-list el-input v-modelquery.subject placeholder请输入科目如数学 clearable / el-button typeprimary clickloadTutors搜索/el-button el-table :datatutors stripe el-table-column propschool label学校 / el-table-column propmajor label专业 / el-table-column propsubjects label可授科目 / el-table-column proppricePerHour label课时费(元/小时) / el-table-column label操作 template #defaultscope el-button typeprimary sizesmall clickopenOrderDialog(scope.row) 预约/el-button /template /el-table-column /el-table /div /template script setup import { ref, onMounted } from vue import { searchTutors } from /api/tutor import { ElMessage } from element-plus const query ref({ subject: , pageNum: 1, pageSize: 10 }) const tutors ref([]) const loadTutors async () { const res await searchTutors(query.value) tutors.value res.data.records } onMounted(loadTutors)
返回列表