SpringCould+Vue3-Element-Admin 登录接口,用户信息接口以及Token验证的实现【VegePig教育平台】

news2024/12/25 1:16:36

文章目录

  • 一.SpringCould+Vue3-Element-Admin 登录接口,用户信息接口以及Token验证的实现【VegePig教育平台】
    • 1.1 背景
    • 1.2 数据库
  • 二、登录接口及其Token实现
    • 2.1 前端
    • 2.2 后端
      • 2.2.1 控制层
      • 2.2.2 service层
      • 2.2.3 工具类:CreateJwt
      • 2.2.4 Dao-Mapper
  • 三、用户信息接口及其验证Token功能实现
    • 3.1 前端
    • 3.2 后端
      • 3.2.1 控制层
      • 3.2.3 service层
      • 3.2.3 工具类:CreateJwt
      • 3.2.4 Dao-Mapper

一.SpringCould+Vue3-Element-Admin 登录接口,用户信息接口以及Token验证的实现【VegePig教育平台】

1.1 背景

本项目为重构:行知在线综合教育平台。本项目更名为:VegePig教育平台

关键字:SpringBoot、SpringCould、Vue3、Uni-app

前端后台管理系统采用开源项目:Vue3-Element-Admin。

本文主要为了实现SpringCould+Vue3-Element-Admin 后台管理系统的登录接口,用户信息接口以及Token验证实现

1.2 数据库

image-20230417160848283

二、登录接口及其Token实现

2.1 前端

前端采用开源项目:Vue3-Element-Admin

以下均为对Vue3-Element-Admin的代码魔改。

登录页面如下:

image-20230417165812848

分析原始项目的请求接口返回值:

image-20230417170045064

请求负载:

image-20230417170114619

更改前端请求接口:

接口目录位置:Src->api->login.js

// 登录接口
export const Login = data => {
  return request({
    url: 'http://localhost:8001/user/login',
    // url: '/api/login',
    method: 'post',
    data,
  })
}

2.2 后端

2.2.1 控制层

后端接收到前端的传值:

后台登录:

@PostMapping("/user/login")
@ResponseBody  //返回给前端一个文本格式
public Message login(@RequestBody BackLoginUser user) {
    Message msg=new Message();
    System.out.println(user.getUsername());
    System.out.println(user.getPassword());
    try {
        if (StringUtils.isEmpty(user.getUsername())) {
            msg.setMessage("登录失败,用户名不能为空");
            msg.setStatus(400);
            return msg;
        }
        if (StringUtils.isEmpty(user.getPassword())) {
            msg.setMessage("登录失败,密码不能为空");
            msg.setStatus(400);
            return msg;
        }
        msg = sysUserService.doLogin(user);
        return msg;

    } catch (Exception ex) {
        ex.printStackTrace();
    }
    return null;
}

代码解释:

@RequestBody BackLoginUser user:前端过来的json字符串存储到user。

user分别有username、password。

if (StringUtils.isEmpty(user.getUsername()))和 if (StringUtils.isEmpty(user.getPassword())) 是为了排除登录传值俩个字段为空的情况。

如果正常的话就继续往下。

没问题的话就传入了service层继续逻辑操作(查询用户是否存在,是否账号密码正确)

@Autowired
SysUserService sysUserService;

如下:

msg = sysUserService.doLogin(user);
return msg;

2.2.2 service层

代码如下:

    public Message doLogin(BackLoginUser user) {
        User userx = new User();
        Message msg=new Message();
        userx = sysUserDao.LoginByname(user.getUsername());
        System.out.println(userx);
        if (userx==null){
            msg.setMessage("用户不存在,请注册!");
            msg.setStatus(405);
            return msg;
        }else {
            if (user.getUsername().equals(userx.getUsername())
                    && user.getPassword().equals(userx.getPassword()) ){
                String token = CreateJwt.getoken(userx);
                Map<String, String> map = new HashMap<>();
                map.put("token",token);
                msg.setData(map);
                msg.setMessage("登录成功");
                msg.setStatus(200);
                return msg;
            }else {
                msg.setMessage("登录失败,密码错误");
                msg.setStatus(405);
                return msg;
            }
        }
    }

代码解释:

前面俩行没有可说的。

userx = sysUserDao.LoginByname(user.getUsername()); 调用了Dao层执行数据查询操作。

第一个if是排除用户不存在的问题(用户账号输错)。

else里分为登录成功或者密码错误。

登录成功代表需要生成Token。

String token = CreateJwt.getoken(userx);

2.2.3 工具类:CreateJwt

getoken方法为:生成Token,根据时间,用户的id,用户的用户名,现在的时间,和过期时间。过程如下。

    private static final String key = "0123456789_0123456789_0123456789";

    public static String  getoken(User user) {
        // 设置过期时间,这里设置为1小时
        long expirationTime = System.currentTimeMillis() + 3600000;
        SecretKey secretKey = new SecretKeySpec(key.getBytes(), SignatureAlgorithm.HS256.getJcaName());
        String jwt = Jwts.builder()
                .setId(user.getId()+"")
                .setSubject(user.getUsername())
                .setIssuedAt(new Date())
                .setExpiration(new Date(expirationTime)) // 设置过期时间
                .signWith(secretKey)
                .compact();
        return jwt;
    }

2.2.4 Dao-Mapper

Dao:

public User LoginByname(String username);

Mapper:

<select id="LoginByname" parameterType="String" resultType="User">
    select * from user where username = #{username};
</select>

三、用户信息接口及其验证Token功能实现

3.1 前端

获取登录用户信息:发起请求需要携带Token。发送给后端,后端需要验证Token才可返回值。

import axios from 'axios'

export const GetUserinfo = () => {
  const token = localStorage.getItem('VEA-TOKEN');

  return axios({
    method: 'get',
    url: 'http://localhost:8001/api/userinfo',
    headers: {
      'Authorization': 'Bearer ' + token,
    }
  });
};

发送过后,我们分析传回的值。

image-20230417183532577

改动获取用户信息的data:data.data

原因:

我在对接后端接口之后无法实现用户的信息展示,排除后发现,我后端传来的值,如果想要取到data里的值,需要data.data。

// 获取用户信息
    async getUserinfo() {
      const { status, data } = await GetUserinfo()
      if (+status === 200) {
        this.userinfo = data.data
        console.log("myurl:",data.data);
        return Promise.resolve(data)
      }
    },

实现效果:

image-20230417183920392

3.2 后端

3.2.1 控制层

用户信息

 @GetMapping("/api/userinfo")
    public Message getUserInfo(@RequestHeader("Authorization") String token,
                               @RequestHeader("User-Agent") String userAgent) {
        Message msg=new Message();
        try{
            String[] parts = token.split("\\s+");
            String jwtToken = parts[1];
            System.out.println(jwtToken);
            String tokenValue = JsonPath.parse(jwtToken).read("$.token");
            System.out.println(tokenValue);
            msg = sysUserService.userinfo(tokenValue);

            return msg;
        } catch (Exception e) {
            return null;
        }

代码解释

@RequestHeader(“Authorization”) String token,:接受前端传值Token。

try里面的值是我取字符串里面Token值的代码。

sysUserService.userinfo是把Token传入service进行处理。

msg = sysUserService.userinfo(tokenValue);

3.2.3 service层

代码如下:

public Message userinfo(String token) {
        Message msg=new Message();
        Claims claims = CreateJwt.parseToken(token);
        User userx = new User();
        System.out.println("claims.getId():"+claims.getId());
        userx = sysUserDao.LoginById(claims.getId());
        System.out.println(userx);
        Map<String, String> map = new HashMap<>();
        map.put("id", String.valueOf(userx.getId()));
        map.put("name",userx.getName());
//        role: 0 admin  1 teacher  0 student
        String role = "";
        if (userx.getRole()==0){
            role="admin";
        }if (userx.getRole()==1){
            role="teacher";
        }else {
            role="student";
        }
        map.put("role",role);
        map.put("avatar","https://s1.ax1x.com/2023/04/17/p9CjIr6.png");
        msg.setData(map);
        msg.setMessage("登录成功");
        msg.setStatus(200);
        return msg;
    }

userinfo主要实现了token的解析,和返回值。

写到这里,我发现这块还没有写完,应该判断一下token解析的结果,如果错误的话返回状态码500。

role是一个简单的判断赋值:role: 0 admin 1 teacher 0 student

使用一个HashMap,将需要的数据值直接压入,最后放到Data里传递给后端。

3.2.3 工具类:CreateJwt

public static Claims parseToken(String token) {
    System.out.println(token);
    try {
        SecretKey secretKey = new SecretKeySpec(key.getBytes(), SignatureAlgorithm.HS256.getJcaName());
        Claims claims = Jwts.parser().setSigningKey(secretKey).parseClaimsJws(token).getBody();
        return claims;
    } catch (ExpiredJwtException e) {
        // Token已过期
        System.out.println("Token已过期");
    } catch (JwtException e) {
        // Token解析失败
        System.out.println("Token解析失败");
    }
    return null;
}

这块的代码是我用Chatgpt生成的,当然有我的小部分调试。Chatgpt写的相当不错。

这块主要是解析token的作用。

3.2.4 Dao-Mapper

Dao:

User LoginById(String id);

Mapper:

    <select id="LoginById"  parameterType="String" resultType="User">
        select * from user where id = #{id};
    </select>

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/466756.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Android NDK 开发入门学习

android ndk技术早已经不是什么新的技术&#xff0c;但是由于工作中没有涉及到&#xff0c;所以一直没有尝试&#xff0c;今天抽空了解学习一下&#xff0c;顺便记录一下&#xff0c;方便后续回顾&#xff0c;由于是刚学习&#xff0c;很多资料也是网上找的&#xff0c;写的不对…

Docker 容器学习【1】

1.容器概述 1.1什么是容器 容器是一种沙盒技术&#xff0c;主要目的是为了将应用运行在其中&#xff0c;与外界隔离&#xff1b;及方便这个沙盒可以被转移到其它宿主机器。本质上&#xff0c;它是一个特殊的进程。通过名称空间&#xff08;Namespace&#xff09;、控制组&…

vivo 推送系统的容灾建设与实践

作者&#xff1a;vivo 互联网服务器团队 - Yu Quan 本文介绍了推送系统容灾建设和关键技术方案&#xff0c;以及实践过程中的思考与挑战。 一、推送系统介绍 vivo推送平台是vivo公司向开发者提供的消息推送服务&#xff0c;通过在云端与客户端之间建立一条稳定、可靠的长连接…

BI实施项目干系人分析案例

最近有在学项目管理&#xff0c;做了个项目干系人分析的小案例 项目背景&#xff1a;BI决策报表实施项目&#xff0c;主要为了甲方公司高层及经理做一些决策报表。 1.识别项目干系人 项目组主要成员&#xff1a; 乙方&#xff1a;王某&#xff08;技术leader&#xff09;&am…

关于小波,Morlet,Grossmann,Meyer,Daubechies,Mallat

转自&#xff1a;未来数学家&#xff0c;向大佬致敬。 匈牙利电子工程师丹尼斯加博尔&#xff08;Dennis Gabor&#xff09;1946年提出加窗傅里叶变换&#xff0c;开创了在时间-频率平面上分析信号的方法&#xff0c;Gabor还发明了全息摄影术&#xff0c;这项工作让他获得了19…

Clickhouse的数据副本协同原理详解(借助ZK实现)

Clickhouse的数据副本协同原理详解&#xff08;借助ZK实现&#xff09; 文章目录 Clickhouse的数据副本协同原理详解&#xff08;借助ZK实现&#xff09;Clickhouse数据副本副本的特点 ReplicatedMergeTree原理解析数据结构Zookeeper内的节点结构元数据判断标识操作日志 Entry日…

【AXU3EG】Zynq UltraScale平台启动引导过程

Zynq UltraScale MPSoC&#xff08;16nm&#xff09; 的核心是两个 CPU 模块&#xff1a; 应用处理单元&#xff08;APU&#xff09;&#xff1a;四核 ARM Cortex-A53&#xff0c;适合于 Linux 和裸机应用程序。实时处理单元&#xff08;RPU&#xff09;&#xff1a;双核 ARM …

Unity 高级程序员应该具备怎样的能力?要怎样成长为 Unity 高级程序员?

如何从零基础小白成长为 Unity 高级程序员&#xff1f;【全篇学习内容免费&#xff01;快来白嫖】 高能预警&#xff0c;下文包含从零基础新手到高级程序员一站式技术学习、学习方法、心态等内容&#xff0c;供各个阶段的同学进行参考。 从零基础到高级程序员 上干货 话不多说…

MySQL——存储过程和函数从零基础到入门必学教程(涵盖基础实战)

文章目录 目录 文章目录 前言 一、创建存储过程 二、在存储过程中使用变量 1.定义变量 2.为变量赋值 三、光标的使用 1.打开光标 2.打开光标 3.使用光标 4.关闭光标 四、流程控制的作用 1.IF语句 2.CASE语句 3.LOOP语句 4.LEAVE语句 5.ITERATE语句 6.REPEAT语…

碳酸氢锂硫酸锂溶液除钙镁

#碳酸氢锂硫酸锂溶液除钙镁 随着新能源汽车快速发展&#xff0c;以粗Li2CO3(85-98&#xff05;)和工业级Li2CO3(98.5-99.0&#xff05;)为原料制备高纯电池级Li2CO3(99.5-99.9&#xff05;)的工艺的突破&#xff0c;显得尤为重要&#xff0c;正越来越受到人们的关注。 粗Li2CO3…

智能排班系统

大家好&#xff0c;我是csdn的博主&#xff1a;lqj_本人 担任本次比赛的队长&#xff0c;这是我的个人博客主页&#xff1a; lqj_本人的博客_CSDN博客-微信小程序,前端,python领域博主lqj_本人擅长微信小程序,前端,python,等方面的知识https://blog.csdn.net/lbcyllqj?spm1011…

安全技术交底大全

交底内容得过大&#xff0c;过宽&#xff0c;不要造成土建结构缺陷。02)管路敷设完后应立即进行保护其他工种在操作时应注意不要将管子砸扁和踩坏。(3)在碎板&#xff0c;加气板上别洞时&#xff0c;注意不要剔断钢筋&#xff0c;剔洞时应先用钻打孔&#xff0c;再护孔&#xf…

visual stdio c++调用python混合编程

visual stdio2019 c调用python混合编程 1.Python环境的搭建 关于环境创建可以参考https://blog.csdn.net/qq_36559788/article/details/123174309 这里python我用的是anaconda里的python38&#xff0c;并且没有debug库&#xff0c;所以我只用了release库 在vs中设置项目属性…

谈谈JVM的垃圾回收机制

目录 1. 死亡对象的判断算法 1.1 引用计数算法 1.2 可达性分析算法 2. 垃圾回收算法 2.1 标记——清除算法 2.2 复制算法 2.3 标记——整理算法 2.4 分代算法 1. 死亡对象的判断算法 对于支持垃圾回收机制的编程语言来说&#xff0c;常见的死亡对象的判断方法有引用计数…

成功上岸北大!总分418分,数学150分,经验贴+方法论

Datawhale干货 作者&#xff1a;葛云阳&#xff0c;杭州电子科技大学&#xff0c;Datawhale成员 前 言 大家好&#xff0c;我是北海。2023年以总分418分的成绩上岸北京大学信息工程学院计算机应用技术专业&#xff0c;其中初试第三&#xff0c;复试第五&#xff0c;总成绩第三…

《编程思维与实践》1038.排版

《编程思维与实践》1038.排版 题目 思路 分两个步骤进行解决: 1.在给定长度下找到每一行可以容纳的最多单词数(单词长度&#xff1c;M/2保证每行至少有两个单词); 2.输出时补充额外的空格. 其中,第一个步骤可以通过分割字符串将每个字符串存起来,再找到第一个超过给定长度M的单…

Java项目上线之云服务器环境篇(二)——Tomcat的安装与配置

Java项目上线之云服务器环境篇&#xff08;二&#xff09;——Tomcat的安装与配置 Tomcat的选择&#xff1a; 云服务器tomcat的选择最好与本机项目运行的tomcat版本号一致&#xff0c;避免一些不必要的问题。 配置步骤&#xff1a; 1、首先进入云服务器创建好放置tomcat的文件…

UE5实现Runtime环境下绘制线功能

文章目录 1.实现目标2.实现过程2.1 C++实现2.2 蓝图调用3.参考资料1.实现目标 UE5在Runtime环境下基于PDI绘制线,GIF动图如下: 2.实现过程 在UE5 Runtime环境下常用的绘制线方法有使用以下几种方式。一是基于SplineMeshComponent,即使用已有的点位去初始化样条线,然后在挂…

Ae:合成查看器 - 视图选项

合成查看器、素材查看器、图层查看器等面板底部的视图选项大同小异。 放大率弹出式菜单 Magnification ratio popup 用于显示和控制当前的放大率。 默认为适应当前面板大小。 更改放大率时&#xff0c;只是改变了面板中预览的外观&#xff0c;而不是合成的实际分辨率和像素。 适…

数据挖掘实验-week8-关联规则挖掘(Association Rule Mining)

Contents 0. 引言0.1 关联规则挖掘0.2 Apriori算法 实验Step 1&#xff1a;Familiarize yourself with the arules package in R.1.1 Load the package.1.2 To load data into R enter.1.3 To get information about the total number of transactions in a file sample1.csv e…