2025.10.15 这是创建的 思维导图
2025.10.21
登录模块
登录鉴权 :该项目采用SpringAOP + 自定义注解@RoleRequire实现RBAC鉴权
现有的登录鉴权方式:
- SpringSecurity+RBAC模型+JWT实现认证与授权
- SpringBoot + Sa-Token + MyBatis + MySQL + Redis 实现用户鉴权、角色管理、权限管理
- Apache Shiro 是一个轻量级的安全框架,适合需要简单易用的权限管理的项目
- 自定义 定义用户、角色、权限三张表,设计合理的关联关系, 使用拦截器或 AOP 实现权限校验逻辑。根据业务需求设计动态权限分配机制。
JWT实现无状态认证(不需要服务器存储用户的会话状态),一个JWT包括头部,载荷,签名。
过程:用户登录认证时,服务端验证用户身份,成功的话,服务端生成JWT返回给客户端,客户端在之后的请求中将JWT放在请求的头部(Authorization),然后服务端通过解析JWT从而确定用户的身份和权限
双token机制实现无感刷新:分为两种token 一种是access token(访问令牌)短期有效 ,一种是 refresh token(刷新令牌),长期有效。
过程:客户端登录,认证成功,服务端签发access_token(返回给前端)和refresh token(存入cookie) 之后,客户端访问接口都带着access_token 当access_token过期之后 客户端发送给refresh token给服务端 验证通过则生成新的access token和refresh token,从而实现无感刷新
双 Token 认证机制:从原理到实践的完整实现双 Token 认证机制:从原理到实践的完整实现 在现代 Web 应用中 - 掘金
登录模块展示:首先进入登录页面:
 然后根据角色的不同,进入不同的主页,系统分为三种角色Admin,Teacher,Student
然后根据角色的不同,进入不同的主页,系统分为三种角色Admin,Teacher,Student

秒杀抢课模块
1.获取动态路径 使用UUID + MD5生成一个唯一标识符 结合前端URL生成动态路径 避免被脚本直接访问
2.实现限流保护 使用令牌桶实现限流保护( Redis + 令牌桶算法),这里创建一个工具类TokenBucket,里面的参数包括桶的最大容量,间隔几秒补充几个令牌,当前可用令牌数…方法包括令牌补充refill和获取令牌逻辑try Acquire 从而实现限流。
还可以利用redission实现分布式限流 基于 Redisson 的分布式限流实战:令牌桶算法的优雅实现 - 你小志蒸不戳 - 博客园,比如保护AI访问的API
其他限流方式:固定窗口、滑动窗口、漏桶限流和令牌桶限流算法
- 检验动态路径(在获取动态path的时候会将动态path存入Redis,用于此时的动态路径校验)
- 检查当前用户是否重复秒杀 (幂等控制) 通过三级缓存实现 本地缓存采用Caffine/Guava 二级缓存采用Redis 三级缓存采用数据库 当发现任意一级的数据库中已经有选课记录了 就返回重复秒杀异常
幂等性指的是一个操作,无论执行多少次,都能得到相同的结果,即它不会因为执行多次而影响系统的状态。这在处理网络请求、数据库操作等场景中尤为重要,例如在订单支付、消息推送等操作中,即使因为网络延迟或其他原因导致多次请求,也应保证操作只执行一次,避免重复处理。
- 
进入秒杀的核心阶段 Redis + Lua脚本 + RocketMQ 实现 库存预减 + 异步入队 
Lua脚本进行双重判断,首先判断是否售罄标志,然后再判断库存预减之后的库存数量,并且在脚本中实现库存减1的操作 如果成功返回1 失败返回 0.Lua脚本返回成功,系统发送消息到消息队列(RocketMQ)采用事务消息机制保证数据的最终一致性。
生产者发送半消息 本地事务创建选课记录(订单) 根据事务的执行结果通知Broker是投递该消息还是丢弃该消息 消费者异步从MQ中消费信息 完成后续业务。

页面展示:
首先填写预选课信息(类似于商城系统的购物车),然后查看选课信息(普通选课和秒杀抢课)
 如果用户是首次抢课且库存充足,则显示抢课成功
如果用户是首次抢课且库存充足,则显示抢课成功
 如果用户重复抢课则提醒请勿重复秒杀
如果用户重复抢课则提醒请勿重复秒杀
 Admin端新增抢课信息
Admin端新增抢课信息
 当学生张三选过课程之后,该课程已经“售罄”了 接下来用李四来选课会提醒库存不足 抢课失败
当学生张三选过课程之后,该课程已经“售罄”了 接下来用李四来选课会提醒库存不足 抢课失败

之后可以考虑用jmeter测试高并发场景下的抢课情况。
支付模块
支付过程:
用户点击缴费 进入AliPayController 用请求头中的Authorization进行身份验证 用请求体中的PaymentPO来生成缴费信息【前端会收集页面信息 当用户点击缴费按钮就会构建PaymentPO写入请求体中传给后端】 初始化订单信息 订单的状态初始化为0 标识未缴费 每个订单有一个唯一的订单号 使用创建好的支付工具类PayUtil 调用支付宝接口完成支付流程
PayUtil中的核心方法即发起支付和查询支付结果方法: 发起支付:1.初始化支付宝客户端 2. 创建支付请求 3.设置业务参数 4.发起请求并且返回支付结果 查询支付结果:创建查询请求-执行查询-处理查询结果
结果展示:
学生点击缴费之后,跳转到支付页面

GitHub上面有一些支付服务的项目: https://github.com/search?q=%E6%94%AF%E4%BB%98&ref=opensearch&type=repositories 可以支持支付服务的快速开发。
AI选课助手模块
chatClient介绍:https://springdoc.cn/spring-ai/api/chatclient.html
- 
请求接收与路由:用户通过Vue3前端界面提出问题,后端RESTful API接收请求。核心的智能路由逻辑会根据预设关键词(如“选课”、“推荐”、“统计”等)判断问题类型。 
- 
业务上下文构建:对于选课相关问题,系统会调用 CourseSelectionService ,通过 JdbcTemplate 高效查询选课数据库,获取课程热度、名额、个人成绩倾向等实时统计数据。 
- 
Prompt工程与模型调用:将查询到的业务数据作为上下文,与预先设计好的系统Prompt(如“你是一名选课顾问…”)进行组装,形成完整的提示信息,然后通过Spring AI调用本地的Ollama (Qwen2:7b)模型。 
- 
响应返回:模型生成的个性化建议或通用回答最终通过统一的API返回给前端展示。 
我总觉得代码生成器(Mybatis-Plus,RuoYi代码生成器)的实现方式和这也差不多 首先创建模板(这里是提示词)然后查询表结构数据,再进行模板渲染得到生成的代码
过程:请求流程:chatClient.call(message) → 调用 OllamaChatClient → 向本地 Ollama 服务发送请求 智能路由:isCourseSelectionQuestion 方法实现业务问题识别,将选课相关问题路由到 BusinessAIService
chatClient是SpringAi提供的聊天 页面展示:
2025.10.22
论坛模块
对于论坛模块,学生可以发帖评价课程,教师不能发帖,两者都可以进行评论回复交流
论坛主页展示一些帖子和热门榜单(Redis缓存)【这都是些简单的增删改查】




想到了一个小玩意,在用户进行发布帖子和进行评论的时候,进行敏感词检查。如果内容中包含敏感词 就弹出提示。实现起来挺简单的,让Java后端负责业务逻辑,python负责机器学习,python运行在本地端口,两者通过http进行通信。 详情请看这篇文章 如何实现一个简单的敏感词检测
