springboot结合element-ui实现增删改查,附前端完整代码

news2024/11/23 8:05:32

实现功能

前端完整代码
后端接口
登录,注册,查询所有用户,根据用户名模糊查询,添加用户,更新用户,删除用户
前端
注册,登录,退出,用户增删改查,导航栏,分页
前端代码地址 https://download.csdn.net/download/2301_76809965/88215774
效果图
在这里插入图片描述

后端接口主要代码

Result类用于统一返回结果
JwtUtil类用户生成验证token
corsConfig处理跨域问题
Result设置统一返回结果
没有做拦截器,名字太长了写不下去,记不住以后再写
项目依赖

		<dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

        <dependency>
            <groupId>com.mysql</groupId>
            <artifactId>mysql-connector-j</artifactId>
            <scope>runtime</scope>
        </dependency>
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <optional>true</optional>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>com.baomidou</groupId>
            <artifactId>mybatis-plus-boot-starter</artifactId>
            <version>3.5.3</version>
        </dependency>
        <!-- https://mvnrepository.com/artifact/com.alibaba/druid -->
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>druid-spring-boot-starter</artifactId>
            <version>1.2.16</version>
        </dependency>
        <dependency>
            <groupId>com.auth0</groupId>
            <artifactId>java-jwt</artifactId>
            <version>3.3.0</version>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-jpa</artifactId>
        </dependency>
package com.example.demo.util;

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

@Data
@AllArgsConstructor
public class Result<T> {
    private Integer code;
    private String message;
    private T data;
    private long timestamp;

    public Result(){
        this.timestamp = System.currentTimeMillis();
    }

    public static <T> Result success(T data){
        Result result= new Result<>();
        result.setData(data);
        return  result;
    }

    public static <T> Result error(int code,String message){
        Result result= new Result<>();
        result.setCode(code);
        result.setMessage(message);
        return result;
    }
}

JwtUtil类

package com.example.demo.util;

import com.auth0.jwt.JWT;
import com.auth0.jwt.JWTVerifier;
import com.auth0.jwt.algorithms.Algorithm;
import com.auth0.jwt.interfaces.DecodedJWT;

import java.sql.Date;
import java.util.HashMap;
import java.util.Map;

public class JwtUtil {
    //设置5h过期
    private static final long EXPIRE_DATE=5*60*60*1000;
    //token秘钥
    private static final String TOKEN_SECRET = "147258";

    //加密
    public static String tokenTest (String username,String password){

        String token = "";
        try {
            //过期时间
            Date date = new Date(System.currentTimeMillis()+EXPIRE_DATE);
            //秘钥及加密算法
            Algorithm algorithm = Algorithm.HMAC256(TOKEN_SECRET);
            //设置头部信息
            Map<String,Object> header = new HashMap<>();
            header.put("typ","JWT");
            header.put("alg","HS256");
            //携带username,password信息,生成签名
            token = JWT.create()
                    .withHeader(header)
                    .withClaim("username",username)
                    .withClaim("password",password).withExpiresAt(date)
                    .sign(algorithm);
        }catch (Exception e){
            e.printStackTrace();
            return  null;
        }
        return token;
    }
    //解密
    public static boolean verify(String token){
        try {
            Algorithm algorithm = Algorithm.HMAC256(TOKEN_SECRET);
            JWTVerifier verifier = JWT.require(algorithm).build();
            DecodedJWT jwt = verifier.verify(token);
            return true;
        }catch (Exception e){
            e.printStackTrace();
            return  false;
        }
    }
}



UserController控制器类

package com.example.demo.controller;

import com.example.demo.enity.User;
import com.example.demo.service.impl.UserServiceImpl;
import com.example.demo.util.JwtUtil;
import com.example.demo.util.Result;
import org.apache.ibatis.annotations.Mapper;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

import java.util.List;

@RestController
@RequestMapping("/user")
public class UserController{
    public static long time = System.currentTimeMillis();
    @Autowired
    private UserServiceImpl userService;

//    登录接口
    @PostMapping("/login")
    public Result login(@RequestBody User user){
        User user1 = userService.getByUsername(user.getUsername(), user.getPassword());
        if(user1==null){
            return new Result<>(201,"登录失败",null,time);
        }
        String token = JwtUtil.tokenTest(user.getUsername(),user.getPassword());
        return new Result<>(200,"登录成功",token,time);
    }

    //注册接口
    @PostMapping("/register")
    public Result register(@RequestBody User user){
        Boolean flag = userService.save(user);
        if(!flag){
            return new Result<>(201,"注册失败",null,time);
        }
        return new Result<>(200,"注册成功",user.getId(),time);
    }
    //获取所有用户
    @GetMapping("/getall")
    public Result getAllUser(){
        List<User> userList = userService.list();
        return new Result<>(200,"获取数据成功",userList,time);
    }
    //模糊查询
    @GetMapping("/getlikeuser")
    public Result getLikeUser(@RequestParam("usernamePattern") String pattern ){
        List<User> users = userService.getLikeUser(pattern);
        int num = users.size();
        return new Result<>(200,"共获取"+num+"条数据",users,time);
    }
    //添加用户
    @PostMapping("/adduser")
    public Result addUser(@RequestBody User user){
        Boolean flag = userService.save(user);
        if(!flag){
            return new Result<>(201,"添加失败",null,time);
        }
        return new Result<>(200,"添加成功",user.getId(),time);
    }

    //根据id修改用户
    @PostMapping("/updateuser")
    public Result updateUser(@RequestBody User user){
        boolean flag = userService.updateById(user);
        if (!flag){
            return new Result<>(201,"更新失败",null,time);
        }
        return new Result<>(200,"更新成功",user.getId(),time);
    }
    //根据id删除用户
    @GetMapping("/delete")
    public Result deleteById(@RequestParam("id") int id){
        boolean flag = userService.removeById(id);
        if (!flag){
            return new Result<>(201,"删除失败",null,time);
        }
        return new Result<>(200,"删除成功",id,time);
    }
}

corsConfig处理跨域问题

package com.example.demo.config;

import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.CorsRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
@Configuration
public class CorsConfig implements WebMvcConfigurer {
    @Override
    public void addCorsMappings(CorsRegistry registry) {
        registry.addMapping("/**")
//                .allowedOrigins("*")
                .allowedOriginPatterns("*")
                .allowedMethods("GET", "HEAD", "POST", "PUT", "DELETE", "OPTIONS")
                .allowCredentials(true)
                .maxAge(3600)
                .allowedHeaders("*")
                .exposedHeaders("*");
    }
}

前端部分代码

登录成功后在session保存token

 methods:{
        async login(loginFormRef){
            this.$refs[loginFormRef].validate((valid)=>{
                if(!valid){
                    this.$message.error("请输入合法的用户名或密码")
                    this.resetForm(loginFormRef)
                    return
                }
            })
                const {data:res} = await this.$axios.post("http://127.0.0.1/user/login",this.loginForm)
                if(res.code!=200){
                    this.$message.error("用户名或密码错误")
                    this.resetForm(loginFormRef)
                    return
                }
                this.$message.success("登录成功")
                window.sessionStorage.setItem("token",res.data)
                window.sessionStorage.setItem("username",this.loginForm.username)
                this.$router.push({
                    name:"home",
                })
        },
        resetForm(loginFormRef) {
        this.$refs[loginFormRef].resetFields();
        },
        register(){
            this.$router.push({
                path:"/register",
            })
        }
    },
    created(){
        if(this.$route.params){
            this.loginForm = this.$route.params
        }
    }

路由守卫
除了注册登录页面,其他页面的访问都需要token

router.beforeEach((to, from, next) => {
    const token = window.sessionStorage.getItem("token");
   
    if (token && (to.path === "/login" || to.path === "/register")) {
      // 如果用户已经登录,但尝试访问登录或注册页面,直接跳转到其他页面
      next("/home");
    } else if (to.path === "/login" || to.path === "/register") {
      // 如果用户未登录,但尝试访问登录或注册页面,允许访问
      next();
    } else {
      // 对于其他路由,需要 token 才能访问
      token ? next() : next("/login");
    }
  });

其他的就不用说了
前端源码地址 https://download.csdn.net/download/2301_76809965/88215774

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

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

相关文章

关于单行文本input和多行文本textarea唤起自动完成功能

若不要自动完成功能&#xff0c;则增加 autocomplete"off" 属性到控件或窗体中&#xff0c;默认 autocomplete"on" 处于开启状态。 实测过程中&#xff0c;单行文本可以有自动完成功能&#xff0c;多行文本无论如何实验都不行。查了查资料&#xff0c;MDN…

算法提高-线段树

线段树 线段树和树状数组线段树的五个操作单点修改&#xff08;不需要懒标记&#xff09;要求的答案就是我们要维护的属性&#xff0c;不需要维护其他的属性帮助我们获得答案要求的答案还需要其他属性去维护 区间修改&#xff08;需要懒标记&#xff0c;pushdown&#xff09;有…

小爱同学今日起开启邀请测试, 小米Al 大模型团队整装待发

在小米雷军年度演讲中&#xff0c;小米宣布未来将在技术研发上投入超过200亿元人民币&#xff0c;并预计在2023年达到这一目标。除此之外&#xff0c;雷军还强调了5G技术在小米发展中的重要性&#xff0c;称其为必要标准&#xff0c;并预测小米将进入世界前十的位置。 雷军还透…

配置 yum/dnf 置您的系统以使用默认存储库

题目 给系统配置默认存储库&#xff0c;要求如下&#xff1a; YUM 的 两 个 存 储 库 的 地 址 分 别 是 &#xff1a; ftp://host.domain8.rhce.cc/dvd/BaseOS ftp://host.domain8.rhce.cc/dvd/AppStream vim /etc/yum.repos.d/redhat.repo [base] namebase baseurlftp:/…

釉面陶瓷器皿SOR/2016-175标准上架亚马逊加拿大站

亲爱的釉面陶瓷器皿和玻璃器皿制造商和卖家&#xff0c;亚马逊加拿大站将执行SOR/2016-175法规。这是一份新的法规&#xff0c;规定了含有铅和镉的釉面陶瓷器和玻璃器皿需要满足的要求。让我们一起来看一看&#xff0c;为什么要实行SOR/2016-175法规&#xff1f;这是一个保护消…

Unity游戏源码分享-中国象棋Unity5.6版本

Unity游戏源码分享-中国象棋Unity5.6版本 项目地址&#xff1a; https://download.csdn.net/download/Highning0007/88215699

linux系统服务学习(一)Linux高级命令扩展

文章目录 Linux高级命令&#xff08;扩展&#xff09;一、find命令1、find命令作用2、基本语法3、*星号通配符4、根据文件修改时间搜索文件☆ 聊一下Windows中的文件时间概念&#xff1f;☆ 使用stat命令获取文件的最后修改时间☆ 创建文件时设置修改时间以及修改文件的修改时间…

母牛的故事

一、题目 有一头母牛&#xff0c;它每年年初生一头小母牛。每头小母牛从第四个年头开始&#xff0c;每年年初也生一头小母牛。请编程实现在第n年的时候&#xff0c;共有多少头母牛&#xff1f; Input 输入数据由多个测试实例组成&#xff0c;每个测试实例占一行&#xff0c;包…

11 个 Python 编码习惯

让你成为糟糕程序员的 11 个 Python 编码习惯 简介 Python 因其简洁性和可读性而备受推崇&#xff0c;但即使是最有经验的程序员也可能会陷入影响代码质量的习惯中。 在本博客中&#xff0c;我们将探讨 10 种常见的编码习惯&#xff0c;它们会降低您作为 Python 程序员的效率。…

深入探析设计模式:工厂模式的三种姿态

深入探析设计模式&#xff1a;工厂模式的三种姿态 1. 简单工厂模式1.1 概念1.2 案例1.3 优缺点 2. 抽象工厂模式2.1 概念2.2 案例&#xff1a;跨品牌手机生产2.3 优缺点 3. 超级工厂模式3.1 概念3.2 案例&#xff1a;动物园游览3.3 优缺点 4. 总结 欢迎阅读本文&#xff0c;今天…

windows10和linux18.04中配置mmhuman3d

分类&#xff1a;动作捕捉 github地址&#xff1a;https://github.com/open-mmlab/mmhuman3d 所需环境&#xff1a; Windows10&#xff0c;CUDA11.6&#xff0c;conda 4.13.0&#xff0c;Visual Studio 2017&#xff1b; Ubuntu18.04&#xff0c;conda22.9.0&#xff0c;CUDA11…

人工智能能够通过所有[创造力测试]

沃顿商学院教授Ethan Mollick emollick 分享了三篇新的实验性论文&#xff0c;证明了AI在实际情境中的创造力。 https://www.oneusefulthing.org/p/automating-creativity “GPT-4 现在在替代用途测试中击败了 91% 的人类&#xff0c;在托伦斯创造性思维测试中击败了 99% 的人类…

每天一道leetcode:1466. 重新规划路线(图论中等广度优先遍历)

今日份题目&#xff1a; n 座城市&#xff0c;从 0 到 n-1 编号&#xff0c;其间共有 n-1 条路线。因此&#xff0c;要想在两座不同城市之间旅行只有唯一一条路线可供选择&#xff08;路线网形成一颗树&#xff09;。去年&#xff0c;交通运输部决定重新规划路线&#xff0c;以…

网络安全专业术语英文缩写对照表

因在阅读文献过程中经常遇到各种专业缩写&#xff0c;所以把各种缩写总结了一下。 因能力有限&#xff0c;错误在所难免&#xff0c;欢迎进行纠错与补充&#xff1a;https://github.com/piaolin/CSAbbr 渗透相关 缩写全称解释备注XSSCross Site Script Attack跨站脚本攻击为…

前端食堂技术周刊第 94 期:TS 5.2 RC、从零实现 RSC、Redux 迁移至 ESM 之旅、HTML 满汉全席

美味值&#xff1a;&#x1f31f;&#x1f31f;&#x1f31f;&#x1f31f;&#x1f31f; 口味&#xff1a;葡茉美式 食堂技术周刊仓库地址&#xff1a;https://github.com/Geekhyt/weekly 大家好&#xff0c;我是童欧巴。欢迎来到前端食堂技术周刊&#xff0c;我们先来看下…

揭秘国产操作系统的黄金测试利器:探索开源测试工具的神秘世界

揭秘国产操作系统的黄金测试利器&#xff1a;探索开源测试工具的神秘世界 文章目录 1.前言2.国产操作系统现状的深度解析3.国产操作系统的质量保障神器(开源测试工具)4.开源测试工具的重要性5.国产操作系统如何利用开源测试工具进行黄金测试6.国产操作系统的开源测试工具整合方…

python安装第三方包时报错:...\lib\site-packages\pip\_vendor\urllib3\response.py...

安装redis第三方包&#xff1a; pip install redis报错现象&#xff1a; 解决方法&#xff1a;使用以下命令可成功安装 pip install redis -i http://pypi.douban.com/simple --trusted-host pypi.douban.com

IT运维:使用数据分析平台监控深信服防火墙

概述 深信服防火墙自身监控可以满足绝大部分需求&#xff0c;比如哪个应用占了最大带宽&#xff0c;哪个用户访问了哪些网站&#xff1f;这里我们为什么使用鸿鹄呢&#xff1f;因为我们要的是数据的处理和分析&#xff0c;比如某个用户在某个事件都做了哪些行为&#xff0c;这个…

OpenCV图像处理——轮廓检测

目录 图像的轮廓查找轮廓绘制轮廓 轮廓的特征轮廓面积轮廓周长轮廓近似凸包边界矩形最小外接圆椭圆拟合直线拟合 图像的矩特征矩的概念图像中的矩特征 图像的轮廓 查找轮廓 binary,contours,hierarchycv.findContours(img,mode,method)绘制轮廓 cv.drawContours(img,coutours…

找不到mfc140u.dll怎么办?mfc140u.dll丢失怎样修复?简单三招搞定

最近我遇到了一个问题&#xff0c;发现我的电脑上出现了mfc140u.dll文件丢失的错误提示。这个错误导致一些应用程序无法正常运行&#xff0c;让我感到非常困扰。经过一番研究和尝试&#xff0c;我终于成功修复了这个问题&#xff0c;并从中总结出了一些心得。 mfc140u.dll丢失原…