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


    # 7. 程序升级

    ## 7.1 登录升级

    ### 7.1.1 图片验证码

    * 后端:
      * 需要一个生成验证码controller,并将生成的验证码随机字符串存放到redis中
      * 用户登录时,获得验证码,对验证码进行校验
    * 前端:
      * 编写表单,显示验证码(编写函数修改图片验证码路径),点击时可以切换
      * 网关放行

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

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

    1. @PostMapping("/login")
    2. public BaseResult login(@RequestBody TbUser tbUser) {
    3. //0.1 校验:图片验证码
    4. String key = "login" + tbUser.getUserName();
    5. String redisVerifyCode = stringRedisTemplate.opsForValue().get(key);
    6. stringRedisTemplate.delete(key);
    7. if(redisVerifyCode == null) {
    8. return BaseResult.error("验证码无效");
    9. }
    10. if(! redisVerifyCode.equalsIgnoreCase(tbUser.getImageVerifyCode())) {
    11. return BaseResult.error("验证码错误");
    12. }
    13. //.....
    14. }

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

    4. 网关放行

    ### 7.1.2 邮箱验证

    * 方案1:使用邮件发送工具类,直接发送邮件。【选择】
      * 特点:工具依赖第三方,所以第三方如果比较慢时,我们的程序也会慢
    * 方案2:使用MQ作为中间件共享发送的信息,然后使用MQ服务进行邮件的发送。(之前演示)
      * 特点:使用MQ将第三方解耦,我们的程序不需要依赖第三方的响应时间。

    * 后端:
      * 准备工作:坐标、yml、工具类
      * 编写send方法,用于邮件的发送
      * 用户登录时,校验邮箱验证码
    * 前端:
      * 提供填写邮箱的位置,并有发送按钮
      * 提供填写验证码的位置
      * 网关放行

    * 后端:

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

        ~~~xml
       
               
                    org.springframework.boot
                    spring-boot-starter-mail
               

        ~~~

        ~~~yml
        spring:
          mail:
            host: smtp.126.com          #发送邮件服务器
            username: itcast_lt@126.com #账号
            password: 1qaz2wsx          #密码
            default-encoding: UTF-8     #默认编码时
        ~~~

        

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

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

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

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

    * 前端:

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

    1. async sendEmail() {
    2. let { data: baseResult } = await this.$axios.post(`/user-service/user/send`, this.user)
    3. // 提示
    4. if( baseResult.code == 20000 ) {
    5. this.$message.success( baseResult.message )
    6. } else {
    7. this.$message.error( baseResult.message )
    8. }
    9. }

      * 提供填写验证码的位置

      * 网关放行

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

    ## 7.2 学生列表升级

    * 注释掉原有内容:

    * 编写 asyncData 发送SSR请求

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

      

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

      * 在网关放行

    ## 7.3 角色列表升级

    * 注释已有的

    * 编写asyncData发送2次ajax

      ~~~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
          }
        },
      ~~~

    * 网关配置

  • 相关阅读:
    基于多头注意力机制卷积神经网络结合双向门控单元CNN-BIGRU-Mutilhead-Attention实现柴油机故障诊断附matlab代码
    Google codelab WebGPU入门教程源码<3> - 绘制网格(源码)
    Qt单一应用实例判断
    如何在Mac上清理磁盘空间?这些方法你必须要懂
    14. happens-before模型
    java web 前置知识——Servlet(一)
    java计算机毕业设计某高校学生成绩信息管理系统源码+程序+lw文档+mysql数据库
    【无标题】
    SQLAlchemy 封装的工具类,数据库pgsql(数据库连接池)
    设计模式:适配器模式
  • 原文地址:https://blog.csdn.net/weixin_45481821/article/details/127669905