说明
该文章是属于OverallAuth2.0系列文章,每周更新一篇该系列文章(从0到1完成系统开发)。
该系统文章,我会尽量说的非常详细,做到不管新手、老手都能看懂。
说明:OverallAuth2.0 是一个简单、易懂、功能强大的权限+可视化流程管理系统。
友情提醒:本篇文章是属于系列文章,看该文章前,建议先看之前文章,可以更好理解项目结构。
qq群:801913255,进群有什么不懂的尽管问,群主都会耐心解答。
有兴趣的朋友,请关注我吧(*^▽^*)。
关注我,学不会你来打我
前言
随着前后端框架(轮子)的逐渐搭建完成,我们的OverallAuth2.0项目也正式迈入功能开发阶段。
今天我们的目标是做一个带有认证的用户登录功能。
看该文章前,说明一点。最好结合我之前的系列文章观看,因为会使用到之前系列文章中的代码。当然有一定基础的码友可自动忽略。
流程图
从流程图上可以看出,本次登录非常简单,它没有过多的业务逻辑,就是一个简单的用户登录验证,成功之后,就能进入系统。至于说登录之后的业务逻辑处理,本篇文章不会涉及(交由之后的系列文章)。
实现功能
1、用户登录
2、登录失效处理
3、异常信息提示
编写后端接口
这里需要编写用户登录接口,并且返回用户数据。
建立一个用户登录后的返回模型,由于在之前已经创建(LoginOutPut),我们只需在该模型中添加一个UserId即可,代码如下- /// <summary>
- /// 登录输出模型
- /// </summary>
- public class LoginOutPut
- {
- /// <summary>
- /// 用户ID
- /// </summary>
- public int UserId { get; set; }
- /// <summary>
- /// 用户名
- /// </summary>
- public string? UserName { get; set; }
- /// <summary>
- /// 密码
- /// </summary>
- public string? Password { get; set; }
- /// <summary>
- /// Token
- /// </summary>
- public string? Token { get; set; }
- /// <summary>
- /// Token过期时间
- /// </summary>
- public string? ExpiresDate { get; set; }
- }
复制代码 ISysUserRepository仓储接口中,添加一个根据用户名和密码查找数据的接口- /// <summary>
- /// 根据用户名称和密码获取用户信息
- /// </summary>
- /// <param name="userName">用户名称</param>
- /// <param name="password">用户密码</param>
- /// <returns></returns>
- public SysUser? GetUserMsg(string userName, string password);
复制代码 SysUserRepository仓储中,实现接口- /// <summary>
- /// 根据用户名称和密码获取用户信息
- /// </summary>
- /// <param name="userName">用户名称</param>
- /// <param name="password">用户密码</param>
- /// <returns></returns>
- public SysUser? GetUserMsg(string userName, string password)
- {
- string sql = " select * from Sys_User where UserName =@UserName and Password=@Password";
- using var connection = DataBaseConnectConfig.GetSqlConnection();
- return connection.QueryFirstOrDefault<SysUser>(sql, new { UserName = userName, Password = password });
- }
复制代码 同理在SysUserService、ISysUserService层中,添加相同接口
ISysUserService- /// <summary>
- /// 根据用户名称和密码获取用户信息
- /// </summary>
- /// <param name="userName">用户名称</param>
- /// <param name="password">用户密码</param>
- /// <returns></returns>
- ReceiveStatus<LoginOutPut> GetUserMsg(string userName, string password);
复制代码 SysUserService- /// <summary>
- /// 根据用户名称和密码获取用户信息
- /// </summary>
- /// <param name="userName">用户名称</param>
- /// <param name="password">用户密码</param>
- /// <returns></returns>
- public ReceiveStatus<LoginOutPut> GetUserMsg(string userName, string password)
- {
- ReceiveStatus<LoginOutPut> receiveStatus = new ReceiveStatus<LoginOutPut>();
- List<LoginOutPut> loginResultsList = new List<LoginOutPut>();
- if (string.IsNullOrEmpty(userName))
- return ExceptionHelper<LoginOutPut>.CustomExceptionData("用户名不能为空!");
- if (string.IsNullOrEmpty(password))
- return ExceptionHelper<LoginOutPut>.CustomExceptionData("密码不能为空!");
- var result = _sysUserRepository.GetUserMsg(userName, password);
- if (result == null)
- return ExceptionHelper<LoginOutPut>.CustomExceptionData(string.Format("用户【{0}】不存在,或账号密码输入错误", userName));
- if (result.IsOpen == false)
- return ExceptionHelper<LoginOutPut>.CustomExceptionData(string.Format("用户【{0}】已停用,请开启后再登录", userName));
-
- LoginOutPut loginResults = new LoginOutPut()
- {
- UserId = result.UserId,
- UserName = result.UserName,
- Token = string.Empty,
- ExpiresDate = string.Empty
- };
- loginResultsList.Add(loginResults);
- receiveStatus.data = loginResultsList;
- receiveStatus.msg = "登录成功";
- return receiveStatus;
- }
复制代码 上述接口中,我们要验证用户名、密码是否为空,是否正确,用户账号是否启用等。如果验证不通过。我们使用ExceptionHelper异常帮助类,把异常信息,反馈给前端。
如果验证通过,我们需要返回用户名、用户id、token、过期时间给前端。
在SysUserController控制器中,添加如下接口- /// <summary>
- /// 登录
- /// </summary>
- /// <returns></returns>
- [HttpPost]
- [AllowAnonymous] // 不验证权限
- public ReceiveStatus<LoginOutPut> Login(LoginInput loginModel)
- {
- var result = _userService.GetUserMsg(loginModel.UserName ?? string.Empty, loginModel.Password ?? string.Empty);
- if (result.success)
- {
- var loginResult = result.data.First();
- var tokenResult = JwtPlugIn.BuildToken(loginModel);
- loginResult.Token = tokenResult.Token;
- loginResult.ExpiresDate = tokenResult.ExpiresDate;
- result.data = new List<LoginOutPut>() { loginResult };
- }
- return result;
- }
复制代码 因为是用户登录接口,所以不需要jwt验证
在用户登录成功后,我们根据用户名、用户密码、jwt配置信息生成token和过期时间。
ps:jwt配置信息请查看之前系列文章
前端结构调整
移动一下文件(不是跟着系列文章的,请忽略,主要是前端结构调整)
把components文件夹下的图片,移动到同src文件夹同级的resources的picture目录下(记住调整图片引用路径)。
把components文件夹下的HelloWorld.vue文件内容,拷贝到views下的framework文件夹中(没有就新建),然后删除components文件夹。
搭建登录界面
在scr文件夹下创建model文件夹,并在下面创建user文件夹,然后再user文件夹下创建一个LoginInput.ts的文件,用于存放字段(model文件夹以后作为存放模型的文件夹)- export interface LoginInput {
- //用户名称
- UserName: string;
- //用户密码
- Password: string;
- }
复制代码 接着往下。
在api文件夹下创建user文件夹,并添加index.ts文件内容如下(api文件夹以后作为存放调用后端接口的文件夹)- import { LoginInput } from '@/model/user/LoginInput';
- import Http from '../http';
- export const login = function(loginForm: LoginInput) {
- return Http.post('/api/SysUser/Login', loginForm)
- }
复制代码 该代码主要是调用后端写的登录接口
接着往下。
在views文件夹目录下,创建login文件夹,并添加index.vue文件。内容如下
[code] OverallAuth2.0 权限管理系统 简单、易懂、功能强大,欢迎访问使用。 密码登录 登录 *为了帮助更多的人知道及了解本项目,请帮忙Star。拜谢各位
来源:程序园用户自行投稿发布,如果侵权,请联系站长删除
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作! |