<五>输入输出模型的建立及登陆验证

仓储层和服务层建好了,那么就开始也业务逻辑吧。

首先在服务层SysUserApp里面新建一个函数叫CheckLogin好了。

public UserDto CheckLogin(LoginInputDto inputDto)
        {
            SysUserEntity entity= _sysUserRepository.GetAll().Where(b=>b.UserName.Equals(inputDto.name)&&b.Password.Equals(inputDto.pwd)).FirstOrDefault(); 
UserDto dto
= AutoMapper.Mapper.Map<UserDto>(entity); return dto;
}

看到代码里面的UserDto了没有。

那是个什么东西?

abp规定了数据在服务层和展示层的数据传输必须用数据传输对象。

这样做的目的当然是层与层之间的分离拉。不懂的可以移步:https://aspnetboilerplate.com/Pages/Documents/Data-Transfer-Objects

然后注意到AutoMapper没有?这也是个神一样模型类转换的框架,

使用前需要配置一下映射,如何配置?打开Application层下的一个ApplicationModule文件,

在Initialize函数里面添加automapper的映射配置,如下图:

 记得模块上面要加上依赖mapper的模块依赖:[DependsOn(typeof(AbpAutoMapperModule))]

这是个啥玩意?想知道abp的模块系统?移步:https://aspnetboilerplate.com/Pages/Documents/Module-System

我的登录验证输入dto只需要两个字段,一个是name ,一个是pwd,如下:

 public  class LoginInputDto
    {
     public LOginInputDto(string name,string pwd)
     {
      Name=naem;Pwd=pwd;
     }
[Required]
public string Name { get; set; } [Required] public string Pwd { get; set; } }

发现了Required了吗?加入验证的特性后,abp会自动帮我们验证Name和Pwd是否为null,

当然加入其他特性也会进行验证,如果有异常会自动抛出AbpValidationException的异常。

传输对象弄好了,那么应该撸controller的checklogin代码了。

[DontWrapResult]
        [DisableAbpAntiForgeryTokenValidation]
        public ActionResult CheckLogin(string username, string password, string code)
        {try
            {
                if (SessionHelper.GetSession(SessionKey.session_verifycode.ToString())==string.Empty || Md5.GetMD5(code.ToLower()) != SessionHelper.GetSession(SessionKey.session_verifycode.ToString()))
                {                   throw new Exception("验证码错误,请重新输入");
                }
                LoginInputDto inputDto = new LoginInputDto(username, Md5.GetMD5(password));
                UserDto  userDto = _sysUser.CheckLogin(inputDto);
                if (userDto != null)
                {
                    UserInfo info = new UserInfo();
                    info.UserID = userDto.Id;
                    info.UserName = userDto.UserName;
                    FormsAuthenticationTicket authTicket = new FormsAuthenticationTicket
                    (1, JsonConvert.SerializeObject(info), DateTime.Now, DateTime.Now.AddMinutes(20), false, "role");
                    string encryptedTicket = FormsAuthentication.Encrypt(authTicket);
                    HttpCookie authCookie = new HttpCookie(FormsAuthentication.FormsCookieName, encryptedTicket);
                    System.Web.HttpContext.Current.Response.Cookies.Add(authCookie);
            return Json(new AjaxResult{State=ResultType.success.ToString(),message="登录成功!"}) }
return Json(new AjaxResult { state = ResultType.error.ToString(), message = "用户名或密码错误" }); } catch (Exception ex) { return Json(new AjaxResult { state = ResultType.error.ToString(), message = ex.Message }); } }

实际上abp给我们实现了IAbpSession的接口会话,用来保存当前登录的用户Id和租户Id,但是只有这两个是不够的,拓展起来又贼麻烦。

暂时不用它,等到要拓展多租户功能的时候再来用它,干脆先自己定义一个UserInfo类,权且保存当前的登录用户信息。后面再搞。

大家注意到这个玩意了吗?[DisableAbpAntiForgeryTokenValidation]

这个是防止CSRF(跨网站请求伪造)的,abp默认为action添加了这个验证,

如果我们不使用abp.ajax进行请求的话,会报这个没有 AntiForgeryToken的错误。加上这个去掉默认验证。

所以当我们只用jquery的ajax进行请求的话,加上取消防CSRF标志,就好了。

先实现一下登录功能先。

登录成功进入到首页

由于我们还没有建立菜单和首页,所以什么都没有。

下一篇我们来显示左侧菜单。

原文地址:https://www.cnblogs.com/choii/p/11443877.html