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

物流项目第一期(登录业务)

实现分析

 验证码功能

Controller

@ApiOperation(value = "验证码", notes = "验证码")@GetMapping(value = "/captcha", produces = "image/png")public void captcha(@RequestParam(value = "key") String key, HttpServletResponse response) throws IOException {this.authService.createCaptcha(key, response);}

AuthService

	private static final String CAPTCHA_REDIS_PREFIX = "CAPTCHA_";@Overridepublic void createCaptcha(String key, HttpServletResponse response) throws IOException {//1. 生成验证码,指定宽、高、字符个数、干扰线条数LineCaptcha lineCaptcha = CaptchaUtil.createLineCaptcha(115, 42, 0, 10);//1.1 设置生成器为数字计算验证码生成器并且指定参与计算最大数字位数为1,也就是个位数相加lineCaptcha.setGenerator(new MathGenerator(1));//1.2 获取生成的验证码值String code = lineCaptcha.getCode();//2. 将验证码的值写入到redis,有效期为1分钟String redisKey = CAPTCHA_REDIS_PREFIX + key;this.stringRedisTemplate.opsForValue().set(redisKey, code, Duration.ofMinutes(1));//3. 输出到页面,设置页面不缓存response.setHeader(HttpHeaders.PRAGMA, "No-cache");response.setHeader(HttpHeaders.CACHE_CONTROL, "No-cache");response.setDateHeader(HttpHeaders.EXPIRES, 0L);lineCaptcha.write(response.getOutputStream());}

实现登录

AuthService

    /*** 登录** @param login 用户登录信息* @return 登录结果*/@Overridepublic R<LoginDTO> login(LoginParamDTO login) {//1. 校验参数if (ObjectUtil.hasEmpty(login.getCode(), login.getKey())) {return R.error("验证码不能为空");}if (ObjectUtil.hasEmpty(login.getAccount(), login.getPassword())) {return R.error("用户名、密码不能为空");}//2. 校验验证码String redisKey = CAPTCHA_REDIS_PREFIX + login.getKey();String redisValue = this.stringRedisTemplate.opsForValue().get(redisKey);if (ObjectUtil.isEmpty(redisValue)) {return R.error("验证码已过期");}//验证码只能使用一次,所以需要将验证码删除this.stringRedisTemplate.delete(redisKey);boolean verify = new MathGenerator().verify(redisValue, login.getCode());if (!verify) {return R.error("验证码不正确");}//3. 校验用户名密码,校验通过生成tokenreturn this.login(login.getAccount(), login.getPassword());}/*** 登录获取token** @param account  账号* @param password 密码* @return 登录信息*/public R<LoginDTO> login(String account, String password) {//调用权限管家接口,传递用户名和密码Result<LoginDTO> result = this.authTemplate.opsForLogin().token(account, password);if (ObjectUtil.equal(result.getCode(), 0)) {//登录成功return R.success(result.getData());}//登录失败return R.error(result.getMsg());}

Controller

    /*** 管理端登录** @param login 登录信息* @return 用户信息*/@PostMapping(value = "/login")@ApiOperation(value = "登录", notes = "登录")public R<LoginDTO> login(@RequestBody LoginParamDTO login) {return this.authService.login(login);}

http://www.xdnf.cn/news/536959.html

相关文章:

  • 40亿非负整数中找到出现两次的数和所有数的中位数
  • 技术决策缺乏团队参与,如何增强执行力?
  • 修改样式还能影响功能?是的!
  • 掌握Python编程:从C++/C#/Java开发者到AI与医学影像开发专家
  • C#编写软件添加菜单栏
  • 2 sys库
  • 陀螺匠部门默认角色怎么用
  • Java日志记录教程:log4j 1.2.11配置与使用详解(附示例代码)
  • 基于poetry管理python项目学术版gurobipy WSL安装方式
  • Linux架构篇、第五章_06Jenkins 触发器全面解析与实战指南
  • 智能门锁为什么需要做EN 18031欧盟检测认证
  • 成功案例|单细胞与空间转录组学:解锁前列腺癌微环境密码
  • 没有公网ip怎么端口映射外网访问?使用内网穿透可以解决
  • 实验-使用递归计算阶乘-RISC-V(计算机组成原理)
  • 异步委托执行管理器:更新
  • 机器学习教程简介:从基础概念到实践应用的全面指南
  • Windows逆向工程提升之二进制分析工具:HEX查看与对比技术
  • 高性能锁机制 CAS:Java 并发编程中的深度剖析
  • 【通用智能体】Lynx :一款基于终端的纯文本网页浏览器
  • 用 SamGeo 库实现遥感影像自动分割:从本地 TIFF 到 SHP/GeoJSON 的一站式处理(Python 脚本实现)
  • 理解 Swift 逃逸闭包与 implicit `self`
  • 终端安全与终端管理:有什么区别及其重要性?
  • DSRC|动态交换路况信息,减少事故优化流量的无线通信技术【无线通信小百科】
  • select * from 限制个数
  • (1) 查看端口状态
  • DeepSeek 如何实现 128K 上下文窗口?
  • MySQL的锁机制
  • javascript 编程基础(2)javascript与Node.js
  • 文本分类实战:使用LSTM对微博评论进行情感分析
  • 数据库中的SCHEMA