当前位置: 首页 > news >正文

springboot+vue实现登录案例(附VUE整个项目代码)

文章目录

  • 前言
  • 一、准备环境
    • 1.1 sptingboot 整合mybatis、swagger、代码生成器、Lombok
    • 1.2 环境工具
  • 二、开发思路及流程
    • 2.1 根据前端登录代码和用户页面设计对象返回类型
    • 2.2 根据列表参数和返回类型设计controller层
    • 2.3 根据前端登录代码和用户页面设计接口和数据库的表
    • 2.4 编写service层的代码
    • 2.5 编写dao层(mapper)的代码
    • 2.6 根据数据库的表生成Entity层的User对象代码
  • 三、运行项目
  • 总结


前言

提示:这里可以添加本文要记录的大概内容:


一、准备环境

1.1 sptingboot 整合mybatis、swagger、代码生成器、Lombok

上一篇文章已经讲到

sptingboot 整合mybatis、swagger、代码生成器、Lombok

1.2 环境工具

vue 框架(使vscode导入已经写好的前端项目)
springboot框架(IDEA开发工具)

二、开发思路及流程

2.1 根据前端登录代码和用户页面设计对象返回类型

前端代码页面
在这里插入图片描述
根据上述的前端页面和代码,发现success和msg是公共的(都需要返回的一个数据);
除此之外,还有一个data,这个应该是一个用户的实体类对象。这个data的属性还包含了token。
根据上述页面设计返回对象的工具类及相关的对象。
1、提取公共的属性:

package com.tzw.ecbms.util;

import lombok.Data;
import lombok.experimental.Accessors;

import java.util.HashMap;
import java.util.Map;

/**
 * @author tzw
 * @version 1.0
 * 返回结果
 */
@Data
@Accessors(chain = true)
public class Resp {
    //操作是否成功
    private Boolean success;
    //状态码
    private Integer code;
    //消息
    private  String message;


}

2、针对code去设计一个接口,里面存放code常量

package com.tzw.ecbms.util;

/**
 * @author tzw
 * @version 1.0
 */
public interface ResultCode {
    Integer SUCCESS = 20000;//成功
    Integer ERROR = 20001;//失败

}

3、返回的数据不能携带密码,所以针对用户去重新设计一个返回类。(不含密码,且包含需要返回的数据)

package com.tzw.ecbms.util;

import lombok.Data;

/**
 * @author tzw
 * @version 1.0
 */
@Data
public class UserResp {
    private String deptId;
    private String realName;
    private Long accountId;
    private String userPhone;
    private String status;
    private String token;

}

4、返回的对象中既包括用户信息,还包含公共的数据。所以我们针对用户登录再去设计一个返回类。它继承公共数据Resp类,然后把UserResp类作为data加入到自己的属性中,这样登录类的返回信息就较为完善了。

package com.tzw.ecbms.util;

import lombok.Data;

/**
 * @author tzw
 * @version 1.0
 */
@Data
public class LoginResp extends Resp {
    private UserResp data;
}

2.2 根据列表参数和返回类型设计controller层

在这里插入图片描述
通过查看前端的接口,编写controller层的代码。

package com.tzw.ecbms.controller;

import com.tzw.ecbms.service.IUserService;
import com.tzw.ecbms.util.LoginResp;
import io.swagger.annotations.ApiOperation;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

/**
 * @author tzw
 * @version 1.0
 */
@RestController
@RequestMapping("/api")
public class LoginController {
    @Autowired
    IUserService userService;

    @ApiOperation("登录")
    @PostMapping("/login")
    LoginResp login(@RequestParam(value = "username") String accountId,
                           @RequestParam(value = "password") String password){
        return userService.login(accountId, password);
    }
}

2.3 根据前端登录代码和用户页面设计接口和数据库的表

在这里插入图片描述

在这里插入图片描述

2.4 编写service层的代码

根据controller层的列表参数和返回类型,设计Service的接口和实现类。
IUserService接口:

package com.tzw.ecbms.service;

import com.tzw.ecbms.entity.User;
import com.baomidou.mybatisplus.extension.service.IService;
import com.tzw.ecbms.util.LoginResp;
import com.tzw.ecbms.util.UserResp;

/**
 * <p>
 *  服务类
 * </p>
 *
 * @author student_tzw
 * @since 2022-08-30
 */
public interface IUserService {
    public LoginResp login(String accountId, String password);
}

IUserServiceImpl实现类

package com.tzw.ecbms.service.impl;


import com.tzw.ecbms.mapper.UserMapper;
import com.tzw.ecbms.service.IUserService;
import com.tzw.ecbms.util.LoginResp;
import com.tzw.ecbms.util.UserResp;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

/**
 * <p>
 *  服务实现类
 * </p>
 *
 * @author student_tzw
 * @since 2022-08-30
 */
@Service
public class UserServiceImpl implements IUserService {

    @Autowired
    UserMapper userMapper;
    @Override
    public LoginResp login(String accountId, String password) {
        LoginResp loginResp = new LoginResp();
        UserResp userResp = userMapper.login(accountId, password);
        if(userResp == null){
            loginResp.setSuccess(false);
            loginResp.setMessage("用户名或密码错误");
            return loginResp;
           // return (LoginResp)loginResp.setSuccess(false).setMessage("用户名或密码不存在");
        }
        loginResp.setData(userResp);
        loginResp.setSuccess(true);
        loginResp.setMessage("登录成功");
        return loginResp;
    }
}
  • 首先注入userMapper的对象通过对象调用login()方法,方法参数包含登录所需要的用户名和密码。登录的时候传入用户名和密码的时候,首先应该从数据库中查询有没有当前用户名,然后再判断密码是否正确。登录失败,则返回失败相关的数据,登录成功返回需要的对象及相关信息。
  • 因为msg 和 success这些信息是没有存储到数据库的,所以在mapper层只是根据对应的用户名和密码来查询User对象对应的UserResp返回类。用这个返回的对象来处理逻辑代码。如果验证成功,则把这个UserResp作为data以及msg、success传给最终的返回结果对象LoginResp。

2.5 编写dao层(mapper)的代码

UserMapper.java

package com.tzw.ecbms.mapper;
import com.tzw.ecbms.util.UserResp;
import org.apache.ibatis.annotations.Param;
import org.springframework.stereotype.Repository;

/**
 * <p>
 *  Mapper 接口
 * </p>
 * @author student_tzw
 * @since 2022-08-30
 */
@Repository
public interface UserMapper {
    UserResp login(@Param("accountId") String accountId, @Param("password") String password);
}

UserMapper.xml (查询我们需要的信息,然后返回给service)

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.tzw.ecbms.mapper.UserMapper">
    
    <select id="login" resultType="com.tzw.ecbms.util.UserResp">
        select account_id,dept_id,real_name,user_phone,status
            from tb_user where account_id=#{accountId} and password=#{password};
    </select>
    
</mapper>

2.6 根据数据库的表生成Entity层的User对象代码

package com.tzw.ecbms.entity;

import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import java.io.Serializable;
import java.time.LocalDateTime;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import lombok.Getter;
import lombok.Setter;

/**
 * <p>
 * 
 * </p>
 *
 * @author student_tzw
 * @since 2022-08-30
 */
@Data
@TableName("tb_user")
@ApiModel(value = "User对象", description = "")
public class User implements Serializable {

    private static final long serialVersionUID = 1L;

    @ApiModelProperty("表的字段id")
    @TableId(value = "id", type = IdType.AUTO)
    private Long id;

    @ApiModelProperty("公司部门id	")
    private String deptId;

    @ApiModelProperty("用户姓名")
    private String realName;

    @ApiModelProperty("登录账号")
    private Long accountId;

    @ApiModelProperty("登录密码")
    private String password;

    @ApiModelProperty("邮箱地址")
    private String email;

    @ApiModelProperty("手机号")
    private String userPhone;

    @ApiModelProperty("创建时间")
    private LocalDateTime createTime;

    @ApiModelProperty("创建人")
    private String createUser;

    @ApiModelProperty("更新人")
    private String updateUser;

    @ApiModelProperty("更新时间")
    private LocalDateTime updateTime;

    @ApiModelProperty("状态")
    private String status;
}

三、运行项目

查看前端登录网址。
在这里插入图片描述
在新终端输入运行项目命令:
在这里插入图片描述
运行项目到登录页面:
在这里插入图片描述
执行后端代码:
在这里插入图片描述

输入正确的账号和密码:登录成功!
在这里插入图片描述


总结

相关文章:

  • 如何使用LOTO示波器 绘制 频率响应特性曲线?
  • 智能科学与技术——介绍概要
  • Controller设计--Kafka从入门到精通(十五)
  • 数据结构之查找和排序
  • CREO:CREO软件之工程图界面的【创建】、【布局】、【表】、【注释】的简介(图文教程)之详细攻略
  • .NET 回调、接口回调、 委托
  • 儒家思想发展历程
  • C程序设计基础-数据类型
  • 【组成原理-指令】指令系统
  • 2022/08/31 day14:企业级解决方案
  • HJ26 字符串排序 ●●
  • Java程序员毕业N年系列----毕业二年
  • 抖音小程序模板全行业整理合集,抖音小程序制作平台分享
  • 嘉立创EDA专业版--彩色丝印?启用
  • 获评中国教育照明25强,利尔达引领教育照明行业“智变”
  • (ckeditor+ckfinder用法)Jquery,js获取ckeditor值
  • 30天自制操作系统-2
  • Android 架构优化~MVP 架构改造
  • Apache Spark Streaming 使用实例
  • AzureCon上微软宣布了哪些容器相关的重磅消息
  • electron原来这么简单----打包你的react、VUE桌面应用程序
  • golang 发送GET和POST示例
  • Java 多线程编程之:notify 和 wait 用法
  • JavaScript服务器推送技术之 WebSocket
  • JavaWeb(学习笔记二)
  • JS正则表达式精简教程(JavaScript RegExp 对象)
  • NSTimer学习笔记
  • python_bomb----数据类型总结
  • tweak 支持第三方库
  • 程序员最讨厌的9句话,你可有补充?
  • 关于 Linux 进程的 UID、EUID、GID 和 EGID
  • 基于web的全景—— Pannellum小试
  • 解决iview多表头动态更改列元素发生的错误
  • 快速体验 Sentinel 集群限流功能,只需简单几步
  • 每天10道Java面试题,跟我走,offer有!
  • 前嗅ForeSpider教程:创建模板
  • 三分钟教你同步 Visual Studio Code 设置
  • 深度解析利用ES6进行Promise封装总结
  • 世界上最简单的无等待算法(getAndIncrement)
  • 06-01 点餐小程序前台界面搭建
  • # include “ “ 和 # include < >两者的区别
  • #mysql 8.0 踩坑日记
  • ( 10 )MySQL中的外键
  • (8)Linux使用C语言读取proc/stat等cpu使用数据
  • (c语言版)滑动窗口 给定一个字符串,只包含字母和数字,按要求找出字符串中的最长(连续)子串的长度
  • (LNMP) How To Install Linux, nginx, MySQL, PHP
  • (Matalb时序预测)WOA-BP鲸鱼算法优化BP神经网络的多维时序回归预测
  • (八)Flask之app.route装饰器函数的参数
  • (翻译)Entity Framework技巧系列之七 - Tip 26 – 28
  • (非本人原创)我们工作到底是为了什么?​——HP大中华区总裁孙振耀退休感言(r4笔记第60天)...
  • (附表设计)不是我吹!超级全面的权限系统设计方案面世了
  • (附源码)springboot社区居家养老互助服务管理平台 毕业设计 062027
  • (十六)串口UART
  • (数据结构)顺序表的定义
  • .bat批处理(九):替换带有等号=的字符串的子串