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

关于项目的一些完善功能

文章目录

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

一、登录加密机制
  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.xdnf.cn/news/16645.html

相关文章:

  • C语言:函数指针、二级指针、常量指针常量、野指针
  • 基于deepseek的事件穿透分析-风险传导图谱
  • Linux系统编程Day1-- 免费云服务器获取以及登录操作
  • 分层解耦(Controller,Service,Dao)
  • [Agent开发平台] API网关 | 业务领域 | DTO格式 | 分页令牌
  • 当人生低谷无人帮助时,如何独自奏响人生乐章
  • Abaqus2022下载与保姆级安装教程!!
  • 人工智能通信协议三种协议:MCP协议、A2A协议、AG-UI协议是什么
  • spark入门-helloword
  • CMS框架GetShell
  • 自动驾驶车辆的敏捷安全档案
  • 使用HaiSnap做了一款取件码App(一键生成)
  • 力扣热题100---------35.搜索插入为位置
  • 查询账户余额
  • 9.项目起步(3)
  • Scala实现常用排序算法
  • 第十二天:C++ 标准库函数分类总结
  • 【AI】开源项目整理
  • [Python] -进阶理解10- 用 Python 实现简易爬虫框架
  • 【同济大学】双速率自动驾驶架构LeAD:端到端+LLM,CARLA实测93%路线完成率,性能SOTA!
  • 基于 Hadoop 生态圈的数据仓库实践 —— OLAP 与数据可视化(四)
  • 机器学习之线性回归的入门学习
  • 语音识别dolphin 学习笔记
  • Linux 日志管理与时钟同步
  • 51单片机入门:数码管原理介绍及C代码实现
  • python快速复习篇(一)
  • Mysql事务基础
  • 7. 传输层协议 TCP
  • 国内数据集成厂商有哪些?如何选择最适合的数据集成平台?
  • Smart #5 Brabus使用45天(7500KM+)初步体验