当前位置: 首页 > news >正文

关于项目的一些完善功能

文章目录

        • 一、登录加密机制
        • 二、文件上传功能
        • 三、验证码功能
        • 四、分页查询功能
        • 五、自动获取学号功能

一、登录加密机制
  1. CodeVO设计

    • 作用:作为前后端加密交互的媒介,包含code(随机加密密钥)、currentTime(生成时间戳)、minute(有效时长,单位:分钟,如10分钟)。
    • 生成逻辑:后端通过java.util.Random生成随机数作为code,结合当前时间戳和预设有效时长创建CodeVO对象,存入HttpSession(键为固定标识如LOGIN_CODE),同时返回给前端。
  2. 前端加密流程

    • 前端通过GET请求获取CodeVO,提取code.code存入全局变量key
    • 编写加密函数encoding(str, key):采用对称加密算法(如AES),以key为密钥对明文账号(userID)和密码(pwd)加密,加密后通过POST请求提交给后端。
  3. 后端解密与验证

    • 解密工具:MyUtil.encoding(str, -code),其中-code为解密密钥(与前端加密密钥对应),对前端传来的加密字符串解密得到明文。
    • 会话校验:从HttpSession中提取之前存储的CodeVO,验证currentTime是否在有效时长内(通过currentTime + minute*60*1000 >= 系统当前时间戳判断),失效则返回“加密信息过期”。
    • 登录成功后:调用session.removeAttribute("LOGIN_CODE")清除会话中的CodeVO,避免重复使用。
二、文件上传功能
  1. 前端实现

    • 页面添加<input type="file" id="fileUpload">组件,编写文件选择监听函数,通过FormData对象封装文件数据,使用axios.post发送multipart/form-data类型请求(设置Content-Type: multipart/form-data)。
  2. 后端处理流程

    • Controller层:定义接收方法,使用@RequestParam("file") MultipartFile file接收文件。
    • 存储逻辑:
      • 指定服务器存储路径(如/upload/files/),确保路径存在(通过File.mkdirs()创建多级目录)。
      • 生成唯一文件名(如UUID + 原文件后缀),避免重名覆盖。
      • 调用file.transferTo(new File(存储路径 + 唯一文件名))完成存储,返回完整文件路径(如/upload/files/uuid_filename.jpg)给前端。
    • 异常处理:捕获文件过大(通过spring.servlet.multipart.max-file-size配置限制)、格式错误等异常,返回友好提示。
三、验证码功能
  1. 验证码VO设计

    • 定义CaptchaVO,包含code(验证码字符串,如4位数字字母组合)、expireTime(过期时间戳)。
  2. 后端生成与存储

    • 生成逻辑:使用Random生成随机验证码(可结合BufferedImage生成图片验证码,此处以字符串为例),设置过期时间(如5分钟),创建CaptchaVO对象,存入HttpSession(键为CAPTCHA_CODE),返回给前端。
  3. 验证流程

    • 前端:用户输入验证码后,随登录请求一同提交userInputCode
    • 后端:
      • 从会话中获取CaptchaVO,若不存在则返回“验证码已过期”。
      • 比对userInputCodecaptchaVO.code(忽略大小写),不一致则返回“验证码错误”。
      • 验证通过后清除会话中的验证码,避免重复使用。
四、分页查询功能
  1. 核心类与工具

    • PageInfo:包含page(当前页码)、size(每页条数)、pages(总页数)、rows(当前页数据列表)、total(总条数)、uuid(查询唯一标识)。
    • QueryPools:静态工具类,内部维护HashMap<String, PageInfo>(键为uuid,值为分页数据),提供:
      • put(String uuid, PageInfo pageInfo):存储分页数据。
      • getPage(PageInfo pageInfo):通过pageInfo中的uuid从HashMap获取数据,填充到pageInfo并返回。
  2. 实现流程

    • Mapper层:修改getAllStu方法,添加start(起始索引,(page-1)*size)和size参数,SQL为select * from studentinfo limit #{start}, #{size};新增countAllStu方法查询总条数(select count(*) from studentinfo)。
    • Service层:
      • 计算总条数total = countAllStu(),总页数pages = (total + size - 1) / size
      • 查询当前页数据rows = getAllStu(start, size),封装为PageInfo对象。
    • Controller层:
      • 首次查询:生成uuid(如UUID.randomUUID().toString()),存入PageInfo,调用Service获取数据后通过QueryPools.put(uuid, pageInfo)存储。
      • 非首次查询:从前端接收包含uuid的PageInfo,调用QueryPools.getPage(pageInfo)获取完整分页数据并返回。
五、自动获取学号功能
  1. 学号池设计

    • XHPools:单例模式,内部维护链表结构Node(属性:sno(学号)、next(下一个节点)、sessionID(会话标识)),以及max(当前最大学号数值)。
    • 初始化:调用Mapper层getMaxSno()获取数据库中最大学号(如20230001),解析数值部分(2023000120230001)赋值给max
  2. 学号分配逻辑

    • 遍历链表,若存在sessionID与当前会话ID一致的节点,返回该节点的sno(保持会话内学号不变)。
    • 若不存在,则max++,拼接学号前缀(如“2023”)生成新学号(如20230002),创建新Node插入链表,返回新学号。
    • Mapper层方法:select max(sno) from student(需处理学号为字符串的情况,如提取数字部分转换为Long类型)。
http://www.lryc.cn/news/604563.html

相关文章:

  • AD里面出现元器件PCB封装不能编辑的情况
  • 使用SpringBoot 3.2.4 + CXF 4.0.0 + JDK17实现WebService服务
  • 招工招聘小程序系统开发——打造一站式招聘服务平台
  • duiLib 自定义资源目录
  • C语言《智能自平衡小车,实现平衡功能的基础上,加入了超声波避障、超声波跟随、蓝牙遥控等功能》+源代码+文档说明
  • ECharts从入门到精通:解锁数据可视化的魔法世界
  • 游戏盾能够防御哪些类型攻击?从哪些方面防护?
  • Spark大数据分与实践笔记(第五章 HBase分布式数据库-04)
  • 【Dv3admin】ORM数据库无法查询的问题
  • Golang 指针与引用深度解析:对比 C/C++ 的内存管理哲学
  • DIY循迹模块多路改造指南
  • 伪装成华硕游戏辅助软件的ArmouryLoader:突破系统安全防护的恶意代码注入器
  • 什么是云原生?
  • Netty的Http解码器源码分析
  • 【解决方案】frida-ps -Ua报错unable to perform ptrace pokedata: I/O error
  • cgroups测试cpu bug
  • 达芬奇速成班-面板介绍
  • 什么是CHO细胞?
  • 深入剖析 StarRocks 与 Hive 的区别、使用场景及协同方案实践
  • Spring Cloud Gateway静态路由实战:Maven多模块高效配置指南
  • 安全和AI方向的学习路线
  • docker常用命令集(6)
  • Shopify Draggable + Vue 3 完整指南:打造现代化拖拽交互体验
  • Apache Ignite 与 Spring Data 集成
  • 人工智能与安全:智能安防的创新与伦理边界
  • 把Java程序部署到本地Docker
  • 常见CMS
  • NVIDIA Isaac平台推动医疗AI机器人发展研究
  • Hyperchain 的分级权限体系如何应对潜在的安全威胁和攻击?
  • 关于Docker【常见问题解决方案】