仓储层和服务层建好了,那么就开始也业务逻辑吧。
首先在服务层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标志,就好了。
先实现一下登录功能先。
登录成功进入到首页
由于我们还没有建立菜单和首页,所以什么都没有。
下一篇我们来显示左侧菜单。