DDD实战进阶第一波(十一):开发一般业务的大健康行业直销系统(实现经销商代注册用例与登录令牌分发)

前两篇文章主要实现了经销商代注册的仓储与领域逻辑、经销商登录的仓储与相关逻辑,这篇文章主要讲述经销商代注册的用例与经销商登录的查询功能。

一.经销商代注册用例

在经销商代注册用例中,我们需要传递经销商的基本注册信息,这个信息是做成了DTO对象。

1.经销商注册的DTO对象:

1public class AddDealerDTO 2 { 3 public string Name { get; set; } 4 public string Tel { get; set; } 5 public decimal EleMoney { get; set; } 6 public Guid? Parentid { get; set; } 7 public List<string> ContactNames { get; set; } 8 public List<string> ContactTels { get; set; } 9 public List<string> ContactProvinces { get; set; } 10 public List<string> ContactCities { get; set; } 11 public List<string> ContactZeors { get; set; } 12 public List<string> ContactStreets { get; set; } 13 public List<int> IsDefaultContact { get; set; } 14 }

在上述DTO对象中,Name和Tel属性是子经销商的名字和电话号码;EleMoney代表子经销商注册时的电子币,从领域逻辑中可以看到,电子币会从父经销商扣除并附加到子经销

商,并且根据EleMoney确定了子经销商的级别;Parentid是当前登录的父经销商的Id;其他剩余属性是子经销商的联系信息。

2.经销商注册用例:

1public class AddDealerUseCase:BaseAppSrv 2 { 3 private readonly IRepository irepository; 4 private readonly IDealerRepository idealerrepository; 5 private readonly ILoginRepository iloginrepository; 6 public AddDealerUseCase(IRepository irepository, IDealerRepository idealerrepository, 7 ILoginRepository iloginrepository) 8 { 9 this.irepository = irepository; 10 this.idealerrepository = idealerrepository; 11 this.iloginrepository = iloginrepository; 12 } 13 public ResultEntity<bool> AddDealer(AddDealerDTO adddealerdto) 14 { 15 var dealerid = Guid.NewGuid(); 16 var dealercontacts = new List<Contact>(); 17 for(int i = 0; i < adddealerdto.ContactNames.Count; i++) 18 { 19 var dealercontact = new Contact().CreateContact(dealerid, adddealerdto.ContactNames[i], 20 adddealerdto.ContactTels[i], adddealerdto.ContactProvinces[i], 21 adddealerdto.ContactCities[i], adddealerdto.ContactZeors[i], adddealerdto.ContactStreets[i], 22 adddealerdto.IsDefaultContact[i]); 23 dealercontacts.Add(dealercontact); 24 } 25 var dealer = new Dealers(idealerrepository).RegisterDealer(dealerid, adddealerdto.Name, 26 adddealerdto.Tel, adddealerdto.EleMoney, dealercontacts, adddealerdto.Parentid); 27 var login = new Login().CreateLogin(dealer.Tel, dealerid); 28 try 29 { 30 using (irepository) 31 { 32 idealerrepository.CreateDealer(dealer); 33 if (adddealerdto.Parentid != null) 34 { 35 idealerrepository.SubParentEleMoney(Guid.Parse(adddealerdto.Parentid.ToString()), 36 adddealerdto.EleMoney); 37 } 38 idealerrepository.AddParentSubCount(adddealerdto.Parentid); 39 iloginrepository.CreateLogin(login); 40 41 irepository.Commit(); 42 } 43 return GetResultEntity(true); 44 } 45 catch (OverTowSubException error) 46 { 47 throw error; 48 } 49 catch(Exception error) 50 { 51 throw error; 52 } 53 } 54 }

从上面代码可以看到,调用了注册经销商的逻辑,并且调用了相关仓储进行父经销商电子币扣除、将父经销商子个数加1、并持久化子经销商信息,如果父经销商的子

经销商个数超过2个,则抛出OverTowSubException异常。

这里不再讲述经销商注册的WebApi实现,可以参考前面的文章实现相应的WebApi。

二.经销商登录功能

经销商登录时,只需要传递电话号码和密码就可以了,所以先定义相关的DTO对象。

1.经销商登录的DTO对象

1public class UserLoginDTO 2 { 3 public string Telphone { get; set; } 4 public string Password { get; set; } 5 }

2.经销商登录查询

经销商登录这个功能不是一个用例,应该叫查询,调用前面文章实现的查询逻辑即可实现。

1public class UserLoginQuery:BaseAppSrv 2 { 3 private readonly IRepository irepository; 4 private readonly ILoginRepository iloginrepository; 5 public UserLoginQuery(IRepository irepository, ILoginRepository iloginrepository) 6 { 7 this.iloginrepository = iloginrepository; 8 this.irepository = irepository; 9 } 10 public Guid Login(UserLoginDTO userlogindto) 11 { 12 try 13 { 14 using (irepository) 15 { 16 return iloginrepository.UserLogin(userlogindto.Telphone, userlogindto.Password); 17 } 18 } 19 catch(Exception error) 20 { 21 throw error; 22 } 23 } 24 }

3.经销商登录的WebApi

在前一篇文章中,我们实现了登录成功时令牌生成的逻辑,所以在WebApi中,如果经销商登录成功,我们将返回经销商的Id、电话号码与Token信息,这些

信息存储到一个DTO对象中。

1public class UserLoginResultDTO 2 { 3 public string Tel { get; set; } 4 public Guid DealerId { get; set; } 5 public string Token { get; set; } 6 }

然后实现WebApi接口

1[AllowAnonymous] 2 [HttpPost] 3 [Route("UserLogin")] 4 public ResultEntity<UserLoginResultDTO> UserLogin([FromBody] UserLoginDTO userlogindto) 5 { 6 var result = new ResultEntity<UserLoginResultDTO>(); 7 var idealercontext = servicelocator.GetService<IDealerContext>(); 8 var irepository = 9 servicelocator.GetService<IRepository>(new ParameterOverrides { { "context", idealercontext } }); 10 var iloginrepository = servicelocator.GetService<ILoginRepository>(new ParameterOverrides { { "context", idealercontext } }); 11 UserLoginQuery userloginquery = new UserLoginQuery(irepository, iloginrepository); 12 try 13 { 14 var dealerid = userloginquery.Login(userlogindto); 15 if (dealerid != Guid.Empty) 16 { 17 var token = new JwtTokenBuilder() 18 .AddSecurityKey(JwtSecurityKey.Create("msshcjsecretmsshcjsecret")) 19 .AddSubject(userlogindto.Telphone) 20 .AddIssuer("DDD1ZXSystem") 21 .AddAudience("DDD1ZXSystem") 22 .AddClaim("role", "NormalUser") 23 .AddExpiry(600) 24 .Build(); 25 26 var userloginresultdto = new UserLoginResultDTO(); 27 userloginresultdto.Tel = userlogindto.Telphone; 28 userloginresultdto.DealerId = dealerid; 29 userloginresultdto.Token = token.Value; 30 31 result.IsSuccess = true; 32 result.Data = userloginresultdto; 33 result.Msg = "登录成功!"; 34 } 35 else 36 { 37 result.ErrorCode = 300; 38 result.Msg = "登录失败!"; 39 } 40 41 } 42 catch (Exception error) 43 { 44 result.ErrorCode = 200; 45 result.Msg = error.Message; 46 } 47 return result; 48 }

 上述代码中JwtTokenBuilder的相关方法说明请参考前一篇文章。

QQ讨论群:309287205

DDD实战进阶视频请关注微信公众号:

点赞
收藏

评论区

加载中...

相关推荐

React与Koa一起打造一个功能丰富的全栈个人博客(业务篇)

前言豆哥的个人博客又改版了,本版主要技术栈是前台用的React,后台用的Koa。博客改版的初衷是自己可以练练React(公司的项目部分要用React,我也没法啊,再说早晚得学)。本文主要介绍博客的业务逻辑,对技术方面不过多讲述。想了解技术的话,可以等我下一篇《技术篇》哦!好了,转入正题。功能模块登录注册首页文章详情文章评论发文章发文章权限圈子

Android Binder原理(五)系统服务的获取过程

Binder原理Android框架层本文首发于微信公众号「后厂技术官」<!more前言在本系列的此前文章中,以MediaPlayerService为例,讲解了系统服务是如何注册的(addService),既然有注册那肯定也要有获取,本篇文章仍旧以MediaPlayerService为例,来讲解系统服务的获取过程(getService)。文章会分为两个部分

DDD实战进阶第一波(二):开发一般业务的大健康行业直销系统(搭建支持DDD的轻量级框架一)

本系列文章DDD实战进阶第一波(一):开发一般业务的大健康行业直销系统(概述)(https://www.oschina.net/action/GoToLink?urlhttp%3A%2F%2Fwww.cnblogs.com%2Fmalaoko%2Fp%2F8717348.html)DDD实战进阶第一波(二):开发一般业务的大健康行业直销系统(

Ionic6使用组件出现错误:Did you add it to @NgModule.entryComponents

缘由在Ionic6和Angular8项目中使用组件时出现错误:Error:NocomponentfactoryfoundforLoginComponent.Didyouadditto@NgModule.entryComponents?在我的上一篇文章:移动开发:Ionic框架实现注册与登录功能(https:

PHP制作登录注册页面

用PHP制作登录和注册页面,一共6个页面,三个可视页面:登录、注册、主页,三个处理页面:验证、添加用户、清除退出注册<!这是注册页面d&z2z.php,用户可以提交用户名和密码进行注册,点击注册按钮提交给d&z4add.php页面处理<!doctypehtml<html<head

Java 可以用已知帐号登录,且可以注册后登录的小程序

|需求说明1、写一个注册和登录功能,使用已知的帐号和密码可以直接登录,如果没有帐号,注册后可以用刚注册的帐号登录2、注册的时候,如果帐号已经存在,不能注册3、注册的时候,设置两次密码,如果两次密码设置得不同,不能注册4、登录的时候,密码输错三次,锁定帐号5、登录的时候,如果没有这个帐号,则提醒用户注册,注册后可以登录6、登录的时候

DDD实战进阶第一波(十一):开发一般业务的大健康行业直销系统(实现经销商代注册用例与登录令牌分发) - HelloWorld