# YanTi **Repository Path**: taozitongxue/yan-ti ## Basic Information - **Project Name**: YanTi - **Description**: 研题app! - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 1 - **Created**: 2024-12-11 - **Last Updated**: 2026-03-31 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # YanTi # 一、项目简介 YanTi 是一款研题 app,致力于为用户提供便捷、高效的学习研题服务。通过本应用,用户可以在学习过程中更轻松地整理、探讨题目,助力提升学习效果。 # 二、软件架构 本项目采用“前后端分离”架构模式构建,前端用的是UNI-APP。后端主要使用 Java 语言进行业务逻辑的处理和实现,占比 84.3%;数据库相关操作则借助 Mysql语言,占比 15.7%。中间件使用了Redis作为缓存。这种架构设计使系统具备良好的扩展性和维护性,方便后续功能的迭代与优化。 # 三、安装教程 ## 环境准备:确保系统已安装 Java 运行环境(JDK),版本要求JDK17及以上;同时,安装 MySQL 数据库,版本要求 MySQL 8.0.25 及以上。 ## 获取项目代码:在本地合适的目录下,使用 git 命令git clone https://gitee.com/taozitongxue/yan-ti.git克隆本项目仓库到本地。 ## 配置数据库:进入项目的sql目录,找到数据库初始化脚本文件,在Mysql数据库中执行该脚本,完成数据库表结构的创建以及初始数据的插入(若有)。 项目构建与启动:进入项目根目录,使用 Maven 命令mvn clean install进行项目构建,构建成功后,可通过java -jar target/[项目打包后的jar包名]启动项目。 # 四、使用说明 用户注册与登录:打开应用,首次使用需进行注册,填写有效信息完成注册流程;注册成功后,使用注册的账号密码登录系统。 题目操作:登录后,可进行题目添加、编辑、删除等操作。添加题目时,填写题目内容、所属科目等信息;编辑题目可修改已有内容;对于不再需要的题目,可选择删除。 研题功能:用户可以针对具体题目发表自己的见解、解题思路等,还能查看其他用户的研题内容,与他人进行交流互动,共同探讨学习。 # 五、参与贡献 ## Fork 本仓库:在 Gitee 平台上找到本项目仓库,点击 “Fork” 按钮,将仓库复制到自己的 Gitee 账号下。 ## 新建 Feat_xxx 分支:进入自己 Fork 后的仓库,新建一个以 “Feat_xxx” 命名的分支(“xxx” 为本次贡献的功能描述或问题编号),用于开发新功能或修复问题。 ## 提交代码:在新建的分支上进行代码开发,完成功能实现或问题修复后,将代码提交到本地仓库,并推送至 Gitee 上自己的仓库分支。 ## 新建 Pull Request:回到原项目仓库,点击 “新建 Pull Request” 按钮,选择自己的仓库及对应的分支,详细描述本次提交的内容和目的,提交 Pull Request,等待项目维护者审核与合并。 # 六、许可证 本项目使用 [具体许可证名称,文档中未提及则可说明 “遵循仓库中 LICENSE 文件所规定的许可协议”],详情请查看仓库中的 LICENSE 文件。在使用本项目代码时,请务必遵循相应的许可协议。 # 七、主要Git提交记录 1.优化了部分redis的keys删除(还有一部分没有被优化),keys命令在生产环境中不可用,redis是单线程的而keys命令… …会阻塞redis,这其中redis不可用。部分换为了Scan扫描 2.桥接了部分业务,移除了MongoDB的User 1.封装了Redis统计的工具类,还没有进行调用,减少冗余代码书写 2.解决了统计各科学习时间的bug,原来的逻辑是查找数据库+R… …edis,这样的逻辑会计算了两次用户暂存的时间,一旦用户正式提交了redis的暂存时间又没有了,暂存+正式(直接走数据库)这是目前的解决办法,不走缓存了。 1.添加了全局异常捕获、接口参数校验,添加了自定义异常。2.修改了自定义响应工具类,使其与全局异常处理和参数校验配合好。3.参数校… …验具体是关于手机号格式的参数校验,通过注解的方式,拦截非法请求,减少无效业务操作。。4.引入了自定义线程池,线程池可以用来处理并发任务,尤其是需要执行大量异步任务时,可以提高系统的响应速度和吞吐量。 1.将角色-权限数据同步到Redis中,实现了ApplicationRunner这个接口以实现,用到了Mybatis手写sql。2… ….加上了Redis分布式锁去应对Redis集群下的Runner多次运行同步问题,使用Redis的SETNX命令来实现。 1.搭建了本地的Minio对象存储服务。策略模式 + 工厂模式:实现文件处理可扩展,方便以后业务发展。接口开发完成,上传文件然后返… …回url,该url是以本机地址:9000端口+文件路径的形式呈现。修改了异常类。 1.修改了请求头的token风格,通过修改配置类的方式进行修改。2.增加了退出登录的接口,增加了一个过滤器,在SaServletF… …ilter之后的,用于解析token拿到userId!然后构造请求头,传给下游服务 1.过滤器+ThreadLocal实现上下文传递,方便的获取登录用户ID。2.由于项目可能通过异步线程会执行异步操作,这样就不能通… …过ThreadLocal去拿到当前用户了。所以引入了阿里的TransmittableThreadLocal去解决解决异步获取上下文的问题。3.利用了SpringSecurity的BCryptPasswordEncoder工具对密码进行加密。4.完善了通过账号密码登录的功能,之前是通过手机去进行注册的。 1.新增修改用户信息的接口,以及回显用户信息的接口。2.修改了application文件,增加了开发环境和生产环境的配置,只需要修… …改application里面的profiles属性值就能进行修改。3.修改了sql文件,记得更新。 1.新增AI对话模块,实现了对话持久化即多轮对话,以及用户的对话历史功能。2.引入了MongoDB作为AI对话存储。 fix:1.重构了刷题的大部分逻辑,特别是时间统计部分,以前是分不清是用户哪一天刷题的时间,统计起来贼麻烦,存在重复统计的情况。目前的逻辑:只要提交就将时间统计到数据库中,同时也写到缓存中,双写,缓存里面存了用户暂存题目的用时以及当日学习时间,统计:获取当天学习时间就从缓存直接获取,统计:累计学习时间就从DB+缓存。不过目前没有写清理缓存的逻辑,待完善。 增加了MP的逻辑删除配置,MP的自动填充也待完善。2.完善了用户获取个人信息的逻辑,以及文件上传的逻辑,用户上传图片是一个请求一个文件,当然,可以发多条请求。