vue-elementui-template 中登录的前后端实现

关于vue-elementui-template 中登录的请求思路参考vue-admin-template学习(一),本文直接上代码,加少量解释。后端代码是通用的,前端的代码,其中的参数名我根据另外一个后端项目进行了更改(如username改成了phone,user用户具体成了teacher),虽然参数名有所改变,但是道理都是一样的。

后端

1.项目目录在这里插入图片描述porm中添加依赖

<dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <optional>true</optional>
        </dependency>
        <dependency>
            <groupId>com.auth0</groupId>
            <artifactId>java-jwt</artifactId>
            <version>3.5.0</version>
        </dependency>
        <dependency>
            <groupId>cn.hutool</groupId>
            <artifactId>hutool-all</artifactId>
            <version>5.1.0</version>
        </dependency>

2.UserController


@CrossOrigin
@RestController
@RequestMapping("/user")
public class UserController {

    @Autowired
    private IUserService userService;

    Logger logger = LoggerFactory.getLogger(UserController.class);

    @RequestMapping("/login")
    public ResultResponse login(@RequestBody VoUser user){
        ResultResponse res = new ResultResponse();
        try{
//            logger.info("传进来的user:" + user);
            // 调用UserService完成username和password的验证
            VoUser u = this.userService.verify(user);
//            logger.info("经过验证后的user:" + user);
            // 根据验证结果,组合响应对象返回
            if (u != null){
                // 创建一个token数据,封装到res对象中
                String token = JwtUtil.sign(user.getUsername(),"-1");
                res.setCode(Constants.STATUS_OK);
                res.setMessage(Constants.MESSAGE_OK);
                res.setData(new VoToken(token));
            }else{
                res.setCode(Constants.STATUS_FALL);
                res.setMessage(Constants.MESSAGE_FALL + "用户名和密码不匹配!");
                res.setData("fail");
            }
        } catch (Exception e){
            res.setCode(Constants.STATUS_FALL);
            res.setMessage(Constants.MESSAGE_FALL + e.getMessage());
            res.setData("fail");
            e.printStackTrace();
        }

        return res;
    }

    @RequestMapping("/info")
    public ResultResponse info( String token){
        ResultResponse res = new ResultResponse();
        logger.info("传进来的token:" + token);
        // 验证token的合法和有效性
        String tokenValue = JwtUtil.verity(token);  // success:zhangsan1
        if(tokenValue != null && tokenValue.startsWith(JwtUtil.TOKEN_SUCCESS)){
            // 如果ok ,返回需要的用户信息
            String username = tokenValue.replaceFirst(JwtUtil.TOKEN_SUCCESS,"");
//            VoUser user = this.userService.searchUserByUserName(username);
            VoUserInfo info = new VoUserInfo();
            info.setAvatar("https://wpimg.wallstcn.com/f778738c-e4f8-4870-b634-56703b4acafe.gif");
            info.setIntroduction("测试用户");
            info.setName(username);
            List<String> roles = Arrays.asList("admin");
            info.setRoles(roles);

            res.setData(info);
            res.setMessage(Constants.MESSAGE_OK);
            res.setCode(Constants.STATUS_OK);
        } else{
            // 否则:500
            res.setCode(Constants.STATUS_FALL);
            res.setMessage(Constants.MESSAGE_FALL);
        }

        return res;
    }

    @RequestMapping("logout")
    public ResultResponse logout( String token ){
        ResultResponse res = new ResultResponse();
        // 验证token的合法和有效性
        String tokenValue = JwtUtil.verity(token);
        // 获取token中的用户名
        String username = tokenValue.replaceFirst(JwtUtil.TOKEN_SUCCESS,"");
        // 移除session中的登记标记(或者redis中的登陆标记)
        res.setMessage("logout success");
        res.setData("logout success");
        res.setCode(Constants.STATUS_OK);

        return res;
    }
}

3.IUserServiceImpl
因为没写mapper映射文件,在Service层添加一个代码块用来生成登录数据。


@Service
public class IUserServiceImpl implements IUserService {
    private Map<String,VoUser> users = new HashMap<>();
    {
        // 代码块
        VoUser user = null;
        for (int i=0;i<10;i++){
            user = new VoUser("zhangsan"+i,"password"+i);
            users.put(user.getUsername(),user);
        }
    }

    public VoUser verify(VoUser user){
        VoUser u = null;
        u = this.users.get(user.getUsername());
        if (u != null){
            if(!u.getPassword().equals(user.getPassword())){
                u = null;
            }
        }
        return u;
    }
}

4.dto文件夹中的
(1)VoToken

@Data
@NoArgsConstructor
@ToString
public class VoToken implements java.io.Serializable{
    private String token;

    public VoToken(String token) {
        this.token = token;
    }

    public String getToken() {
        return token;
    }

    public void setToken(String token) {
        this.token = token;
    }
}

(2)VoUser

@ToString
public class VoUser implements java.io.Serializable{
    private String username;

    private String password;

    public VoUser(String username, String password) {
        this.username = username;
        this.password = password;
    }

    public String getUsername() {
        return username;
    }

    public void setUsername(String username) {
        this.username = username;
    }

    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }
}

(3) VoUserInfo


public class VoUserInfo {
    private List<String>  roles;
    private String introduction;
    private String avatar;
    private String name;


    @Override
    public String toString() {
        return "VoUserInfo{" +
                "roles=" + roles +
                ", introduction='" + introduction + '\'' +
                ", avatar='" + avatar + '\'' +
                ", name='" + name + '\'' +
                '}';
    }

    public List<String> getRoles() {
        return roles;
    }

    public void setRoles(List<String> roles) {
        this.roles = roles;
    }

    public String getIntroduction() {
        return introduction;
    }

    public void setIntroduction(String introduction) {
        this.introduction = introduction;
    }

    public String getAvatar() {
        return avatar;
    }

    public void setAvatar(String avatar) {
        this.avatar = avatar;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
}

5.ResultResponse

@Data
@AllArgsConstructor
@NoArgsConstructor
@ToString
public class ResultResponse implements java.io.Serializable{

    private int code;
    private String message;
    private Object data;

    public int getCode() {
        return code;
    }

    public void setCode(int code) {
        this.code = code;
    }

    public String getMessage() {
        return message;
    }

    public void setMessage(String message) {
        this.message = message;
    }

    public Object getData() {
        return data;
    }

    public void setData(Object data) {
        this.data = data;
    }
}

6.utils
(1)Constants

public final class Constants {
    public final static int STATUS_OK = 20000;
    public final static int STATUS_FALL = 500;
    public final static String MESSAGE_OK = "success";
    public final static String MESSAGE_FALL = "fail";
}

(2)JwtUtil

public class JwtUtil {
    public static final String TOKEN_LOGIN_NAME = "loginName";
    public static final String TOKEN_LOGIN_ID = "userId";
    public static final String TOKEN_SUCCESS = "success";
    public static final String TOKEN_FALL = "fail";

    private static final long EXPIRE_TIME = 24*60*60*1000;

    private static final String TOKEN_SECRET = "joijsdfjlsjfljfljl15135313135";

    public static String sign(String username,String userId){
        // 过期时间
        Date date = new Date(System.currentTimeMillis() + EXPIRE_TIME);
        // 私钥及加密算法
        Algorithm algorithm = Algorithm.HMAC256(TOKEN_SECRET);
        // 设置头信息
        HashMap<String,Object> header = new HashMap<>(2);
        header.put("typ","jwt");
        header.put("alg","HS256");
        // 附带username和userID生成签名
        return JWT.create().withHeader(header).withClaim(TOKEN_LOGIN_NAME,username)
                .withClaim(TOKEN_LOGIN_ID,userId).withExpiresAt(date).sign(algorithm);
    }

    public static String verity(String token){
        String result = TOKEN_SUCCESS;
        try{
            Algorithm algorithm = Algorithm.HMAC256(TOKEN_SECRET);
            JWTVerifier verifier = JWT.require(algorithm).build();
            DecodedJWT jwt = verifier.verify(token);
            result += jwt.getClaims().get(TOKEN_LOGIN_NAME).asString();
            return result;  // success:username
        } catch (IllegalArgumentException e){
            return  TOKEN_FALL + e.getMessage();
        } catch (JWTVerificationException e){
            return  TOKEN_FALL + e.getMessage();
        } catch (Exception e){
            return  TOKEN_FALL + e.getMessage();
        }
    }
}

前端

前端需要修改几个地方
1.
在这里插入图片描述
2. /views/login/index
在这里插入图片描述
3./store/modules/user.js
在这里插入图片描述
在这里插入图片描述

4./api/user.js
在这里插入图片描述
在这里插入图片描述

实现注册功能

1.先创建页面,设置路由然后修改下面的配置在这里插入图片描述

2.response响应,把对状态码的检验注释掉,直接返回res
在这里插入图片描述
在这里插入图片描述

3.在这里插入图片描述
4.在这里插入图片描述
在这里插入图片描述
有疑问欢迎在评论区讨论!

  • 2
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是Vue ElementUI和Spring Boot实现文件上传的前后端代码示例: 前端代码: ```vue <template> <el-upload class="upload-demo" action="/api/upload" :headers="{ Authorization: 'Bearer ' + token }" :data="{ name: 'avatar' }" :on-success="handleSuccess" :before-upload="beforeUpload"> <el-button slot="trigger" size="small" type="primary">上传文件</el-button> <div slot="tip" class="el-upload__tip">只能上传jpg/png文件,且不超过500kb</div> </el-upload> </template> <script> import axios from 'axios'; export default { data() { return { token: '', } }, mounted() { this.token = localStorage.getItem('token'); }, methods: { beforeUpload(file) { const isJPG = file.type === 'image/jpeg' || file.type === 'image/png'; const isLt500K = file.size / 1024 < 500; if (!isJPG) { this.$message.error('上传头像图片只能是 JPG/PNG 格式!'); } if (!isLt500K) { this.$message.error('上传头像图片大小不能超过 500KB!'); } return isJPG && isLt500K; }, handleSuccess(res) { if (res.code === 0) { this.$message.success('上传成功'); } else { this.$message.error('上传失败'); } } } } </script> ``` 后端代码(Spring Boot): ```java @RestController public class FileUploadController { private static final Logger logger = LoggerFactory.getLogger(FileUploadController.class); @Value("${file.upload-dir}") private String uploadDir; @PostMapping("/api/upload") public ResponseEntity<?> uploadFile(@RequestParam("file") MultipartFile file, @RequestParam("name") String name) { if (file.isEmpty()) { return ResponseEntity.badRequest().body("上传失败,请选择文件"); } String fileName = name + "_" + System.currentTimeMillis() + "_" + file.getOriginalFilename(); try { // 保存文件到指定目录 Path path = Paths.get(uploadDir + fileName); Files.copy(file.getInputStream(), path, StandardCopyOption.REPLACE_EXISTING); } catch (IOException e) { logger.error("文件保存失败", e); return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).body("文件保存失败,请重试"); } logger.info("文件上传成功:{}", fileName); return ResponseEntity.ok().body("文件上传成功"); } } ``` 以上代码示例,前端代码使用了Vue ElementUI的el-upload组件实现文件上传,设置了文件类型和大小的限制,并通过axios发送文件上传请求,同时在请求头携带了JWT Token和其他参数。后端代码使用了Spring Boot的MultipartFile和Files类处理文件上传请求,将上传的文件保存到指定目录,并返回上传结果和文件信息。其,上传目录的路径通过@Value注解从配置文件读取。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值