【学生管理系统】权限管理

本文涉及的产品
Redis 开源版,标准版 2GB
推荐场景:
搭建游戏排行榜
云数据库 Tair(兼容Redis),内存型 2GB
简介: 【学生管理系统】权限管理

# 7. 程序升级


## 7.1 登录升级


### 7.1.1 图片验证码


* 后端:

 * 需要一个生成验证码controller,并将生成的验证码随机字符串存放到redis中

 * 用户登录时,获得验证码,对验证码进行校验

* 前端:

 * 编写表单,显示验证码(编写函数修改图片验证码路径),点击时可以切换

 * 网关放行


1. 需要一个生成验证码controller,并将生成的验证码随机字符串存放到redis中


2034a496e7db48f19f9286adef0852bb.png


2. 用户登录时,获得验证码,对验证码进行校验

3fd9caaca0624e7082629df407c3e37b.png

@PostMapping("/login")
    public BaseResult login(@RequestBody TbUser tbUser) {
        //0.1 校验:图片验证码
        String key = "login" + tbUser.getUserName();
        String redisVerifyCode = stringRedisTemplate.opsForValue().get(key);
        stringRedisTemplate.delete(key);
        if(redisVerifyCode == null) {
            return BaseResult.error("验证码无效");
        }
        if(! redisVerifyCode.equalsIgnoreCase(tbUser.getImageVerifyCode())) {
            return BaseResult.error("验证码错误");
        }
        //.....
    }

3. 编写表单,显示验证码(编写函数修改图片验证码路径),点击时可以切换


b07516781ed54d7596ea6ad7911c826c.png


4. 网关放行


64a2f8c04d474be6a6d9c7de9528093c.png


### 7.1.2 邮箱验证码


* 方案1:使用邮件发送工具类,直接发送邮件。【选择】

 * 特点:工具依赖第三方,所以第三方如果比较慢时,我们的程序也会慢

* 方案2:使用MQ作为中间件共享发送的信息,然后使用MQ服务进行邮件的发送。(之前演示)

 * 特点:使用MQ将第三方解耦,我们的程序不需要依赖第三方的响应时间。


* 后端:

 * 准备工作:坐标、yml、工具类

 * 编写send方法,用于邮件的发送

 * 用户登录时,校验邮箱验证码

* 前端:

 * 提供填写邮箱的位置,并有发送按钮

 * 提供填写验证码的位置

 * 网关放行


* 后端:


 * 准备工作:坐标、yml、工具类


2f71ec2b74ef49cd9bfffb8119fc04ea.png


  ~~~xml
    <!-- JavaMail 启动器 -->
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-mail</artifactId>
            </dependency>
    ~~~
    ~~~yml
    spring:
      mail:
        host: smtp.126.com          #发送邮件服务器
        username: itcast_lt@126.com #账号
        password: 1qaz2wsx          #密码
        default-encoding: UTF-8     #默认编码时
    ~~~

编写send方法,用于邮件的发送

276b9e880449487591f34133936abf2e.png

 @Resource
    private JavaMailSender javaMailSender;
    @PostMapping("/send")
    public BaseResult send(@RequestBody TbUser tbUser) {
        try {
            // 随机验证码
            String code = RandomStringUtils.randomNumeric(4);
            // 保存到redis
            String key = "loginEmail" + tbUser.getUserName();
            stringRedisTemplate.opsForValue().set(key, code , 5 , TimeUnit.MINUTES);
            // 发送
            EmailUtils.sendEmail(javaMailSender, "用户登录", tbUser.getEmail(), "验证码为:" + code);
            // 返回
            return BaseResult.ok("邮件发送成功");
        } catch (Exception e) {
            e.printStackTrace();
            return BaseResult.error("发送邮件失败");
        }
    }

 * 用户登录时,校验邮箱验证码

fb9379b08e4642c78e434e6804073fcd.png

  //0.2 校验:邮件验证码
        String keyEmail = "loginEmail" + tbUser.getUserName();
        String redisEmailVerifyCode = stringRedisTemplate.opsForValue().get(keyEmail);
        stringRedisTemplate.delete(keyEmail);
        if(redisEmailVerifyCode == null) {
            return BaseResult.error("email验证码无效");
        }
        if(! redisEmailVerifyCode.equalsIgnoreCase(tbUser.getEmailVerifyCode())) {
            return BaseResult.error("email验证码错误");
        }

* 前端:

 * 提供填写邮箱的位置,并有发送按钮

d4df969e8aba4d8a828aed40ab559286.png

async sendEmail() {
      let { data: baseResult } = await this.$axios.post(`/user-service/user/send`, this.user)
      // 提示
      if( baseResult.code == 20000 ) {
        this.$message.success( baseResult.message )
      } else {
        this.$message.error( baseResult.message )
      }
    }

 * 提供填写验证码的位置

ba3766d313154ec3b16000803f8d3889.png

 * 网关放行

9536f17d61a14910a5e77158f898bea1.png

### 7.1.3 作业:短信验证码

## 7.2 学生列表升级

* 注释掉原有内容:

f50415b8bfe1479599a5b6492b7eab3c.png

* 编写 asyncData 发送SSR请求

f59580dedc8642ccbc66a65e68d2b9bb.png

~~~js
    async asyncData( context ) {
      // ajax
      let { data: baseResult } = await context.$axios.get('/classes-service/classes')
      // 返回结果
      return {
        classesList: baseResult.data
      }
    },
  ~~~

* 注意:SSR发送请求时,无法获得浏览器端相应的内容(localStorage、sessionStorage、cookie 等)

 * 在网关放行


2e905834148e42b5a800d36a14223158.png

## 7.3 角色列表升级

* 注释已有的

100fa7c285094102a5c4f84a57841f5f.png


编写asyncData发送2次ajax


79e1dda808bb467bb12c3fbee74cb623.png

  ~~~js
    async asyncData( context ) {
      // 发送2次ajax
      let ajax1 = context.$axios.get('/user-service/role')
      let ajax2 = context.$axios.get(`/user-service/perm/parent/0`)
      let [{data: roleBaseResult}, {data: permBaseResult}] = await Promise.all([ajax1, ajax2])
      // 处理数据
      return {
        roleList: roleBaseResult.data,
        permList: permBaseResult.data
      }
    },
  ~~~

* 网关配置


a122a2fc02f64658a511aaa5356590ec.png



相关实践学习
基于Redis实现在线游戏积分排行榜
本场景将介绍如何基于Redis数据库实现在线游戏中的游戏玩家积分排行榜功能。
云数据库 Redis 版使用教程
云数据库Redis版是兼容Redis协议标准的、提供持久化的内存数据库服务,基于高可靠双机热备架构及可无缝扩展的集群架构,满足高读写性能场景及容量需弹性变配的业务需求。 产品详情:https://www.aliyun.com/product/kvstore &nbsp; &nbsp; ------------------------------------------------------------------------- 阿里云数据库体验:数据库上云实战 开发者云会免费提供一台带自建MySQL的源数据库&nbsp;ECS 实例和一台目标数据库&nbsp;RDS实例。跟着指引,您可以一步步实现将ECS自建数据库迁移到目标数据库RDS。 点击下方链接,领取免费ECS&amp;RDS资源,30分钟完成数据库上云实战!https://developer.aliyun.com/adc/scenario/51eefbd1894e42f6bb9acacadd3f9121?spm=a2c6h.13788135.J_3257954370.9.4ba85f24utseFl
相关文章
|
5月前
学生管理系统-登录操作设计
学生管理系统-登录操作设计
43 1
|
4月前
|
监控 数据安全/隐私保护
若依修改---功能详解--权限控制,demo超级管理员,可以查看所有功能菜单,zhangsan,登录之后,仅可以查看线索的菜单,不同角色岗位,登录查看的内容不同,若依通过用户管理,角色管理,菜单管理控
若依修改---功能详解--权限控制,demo超级管理员,可以查看所有功能菜单,zhangsan,登录之后,仅可以查看线索的菜单,不同角色岗位,登录查看的内容不同,若依通过用户管理,角色管理,菜单管理控
|
6月前
|
Java 数据库连接 数据库
用户登录功能实现案例
用户登录功能实现案例
71 0
|
SQL 前端开发 数据安全/隐私保护
【学生管理系统】权限管理
【学生管理系统】权限管理
135 0
【学生管理系统】权限管理
|
数据库 数据安全/隐私保护
【学生管理系统】权限管理之用户管理(一)
【学生管理系统】权限管理之用户管理
157 0
【学生管理系统】权限管理之用户管理(一)
|
前端开发 数据库 数据安全/隐私保护
【学生管理系统】权限管理之用户管理(二)
【学生管理系统】权限管理之用户管理
65 0
【学生管理系统】权限管理之用户管理(二)
|
缓存 前端开发 数据安全/隐私保护
【学生管理系统】权限管理之角色管理
【学生管理系统】权限管理之角色管理
133 0
【学生管理系统】权限管理之角色管理
|
存储 安全 Java
权限管理介绍|学习笔记
快速学习权限管理介绍
权限管理介绍|学习笔记
|
安全 Java 数据库
权限管理准备工作|学习笔记
快速学习权限管理准备工作
权限管理准备工作|学习笔记
|
前端开发 API Nacos
权限管理-前端整合 | 学习笔记
快速学习 权限管理-前端整合
权限管理-前端整合 | 学习笔记