DDD實戰進階第一波(十一):開發一般業務的大健康行業直銷系統(實現經銷商代注冊用例與登錄令牌分發)


前兩篇文章主要實現了經銷商代注冊的倉儲與領域邏輯、經銷商登錄的倉儲與相關邏輯,這篇文章主要講述經銷商代注冊的用例與經銷商登錄的查詢功能。

一.經銷商代注冊用例

在經銷商代注冊用例中,我們需要傳遞經銷商的基本注冊信息,這個信息是做成了DTO對象。

1.經銷商注冊的DTO對象:

 public class AddDealerDTO
    {
        public string Name { get; set; }
        public string Tel { get; set; }
        public decimal EleMoney { get; set; }
        public Guid? Parentid { get; set; }
        public List<string> ContactNames { get; set; }
        public List<string> ContactTels { get; set; }
        public List<string> ContactProvinces { get; set; }
        public List<string> ContactCities { get; set; }
        public List<string> ContactZeors { get; set; }
        public List<string> ContactStreets { get; set; }
        public List<int> IsDefaultContact { get; set; }
    }

在上述DTO對象中,Name和Tel屬性是子經銷商的名字和電話號碼;EleMoney代表子經銷商注冊時的電子幣,從領域邏輯中可以看到,電子幣會從父經銷商扣除並附加到子經銷

商,並且根據EleMoney確定了子經銷商的級別;Parentid是當前登錄的父經銷商的Id;其他剩余屬性是子經銷商的聯系信息。

 

2.經銷商注冊用例:

public class AddDealerUseCase:BaseAppSrv
    {
        private readonly IRepository irepository;
        private readonly IDealerRepository idealerrepository;
        private readonly ILoginRepository iloginrepository;
        public AddDealerUseCase(IRepository irepository, IDealerRepository idealerrepository,
            ILoginRepository iloginrepository)
        {
            this.irepository = irepository;
            this.idealerrepository = idealerrepository;
            this.iloginrepository = iloginrepository;
        }
        public ResultEntity<bool> AddDealer(AddDealerDTO adddealerdto)
        {
            var dealerid = Guid.NewGuid();
            var dealercontacts = new List<Contact>();
            for(int i = 0; i < adddealerdto.ContactNames.Count; i++)
            {
                var dealercontact = new Contact().CreateContact(dealerid, adddealerdto.ContactNames[i],
                    adddealerdto.ContactTels[i], adddealerdto.ContactProvinces[i],
                    adddealerdto.ContactCities[i], adddealerdto.ContactZeors[i], adddealerdto.ContactStreets[i],
                    adddealerdto.IsDefaultContact[i]);
                dealercontacts.Add(dealercontact);
            }
            var dealer = new Dealers(idealerrepository).RegisterDealer(dealerid, adddealerdto.Name,
                adddealerdto.Tel, adddealerdto.EleMoney, dealercontacts, adddealerdto.Parentid);
            var login = new Login().CreateLogin(dealer.Tel, dealerid);
            try
            {
                using (irepository)
                {
                    idealerrepository.CreateDealer(dealer);
                    if (adddealerdto.Parentid != null)
                    {
                        idealerrepository.SubParentEleMoney(Guid.Parse(adddealerdto.Parentid.ToString()),
                            adddealerdto.EleMoney);
                    }
                    idealerrepository.AddParentSubCount(adddealerdto.Parentid);
                    iloginrepository.CreateLogin(login);

                    irepository.Commit();
                }
                return GetResultEntity(true);
            }
            catch (OverTowSubException error)
            {
                throw error;
            }
            catch(Exception error)
            {
                throw error;
            }
        }
    }

從上面代碼可以看到,調用了注冊經銷商的邏輯,並且調用了相關倉儲進行父經銷商電子幣扣除、將父經銷商子個數加1、並持久化子經銷商信息,如果父經銷商的子

經銷商個數超過2個,則拋出OverTowSubException異常。

這里不再講述經銷商注冊的WebApi實現,可以參考前面的文章實現相應的WebApi。

 

二.經銷商登錄功能

經銷商登錄時,只需要傳遞電話號碼和密碼就可以了,所以先定義相關的DTO對象。

1.經銷商登錄的DTO對象

public class UserLoginDTO
    {
        public string Telphone { get; set; }
        public string Password { get; set; }
    }

2.經銷商登錄查詢

經銷商登錄這個功能不是一個用例,應該叫查詢,調用前面文章實現的查詢邏輯即可實現。

 public class UserLoginQuery:BaseAppSrv
    {
        private readonly IRepository irepository;
        private readonly ILoginRepository iloginrepository;
        public UserLoginQuery(IRepository irepository, ILoginRepository iloginrepository)
        {
            this.iloginrepository = iloginrepository;
            this.irepository = irepository;
        }
        public Guid Login(UserLoginDTO userlogindto)
        {
            try
            {
                using (irepository)
                {
                    return iloginrepository.UserLogin(userlogindto.Telphone, userlogindto.Password);
                }
            }
            catch(Exception error)
            {
                throw error;
            }
        }
    }

3.經銷商登錄的WebApi

在前一篇文章中,我們實現了登錄成功時令牌生成的邏輯,所以在WebApi中,如果經銷商登錄成功,我們將返回經銷商的Id、電話號碼與Token信息,這些

信息存儲到一個DTO對象中。

 public class UserLoginResultDTO
    {
        public string Tel { get; set; }
        public Guid DealerId { get; set; }
        public string Token { get; set; }
    }

然后實現WebApi接口

[AllowAnonymous]
        [HttpPost]
        [Route("UserLogin")]
        public ResultEntity<UserLoginResultDTO> UserLogin([FromBody] UserLoginDTO userlogindto)
        {
            var result = new ResultEntity<UserLoginResultDTO>();
            var idealercontext = servicelocator.GetService<IDealerContext>();
            var irepository =
                servicelocator.GetService<IRepository>(new ParameterOverrides { { "context", idealercontext } });
            var iloginrepository = servicelocator.GetService<ILoginRepository>(new ParameterOverrides { { "context", idealercontext } });
            UserLoginQuery userloginquery = new UserLoginQuery(irepository, iloginrepository);
            try
            {
                var dealerid = userloginquery.Login(userlogindto);
                if (dealerid != Guid.Empty)
                {
                    var token = new JwtTokenBuilder()
                        .AddSecurityKey(JwtSecurityKey.Create("msshcjsecretmsshcjsecret"))
                        .AddSubject(userlogindto.Telphone)
                        .AddIssuer("DDD1ZXSystem")
                        .AddAudience("DDD1ZXSystem")
                        .AddClaim("role", "NormalUser")                        
                        .AddExpiry(600)
                        .Build();

                    var userloginresultdto = new UserLoginResultDTO();
                    userloginresultdto.Tel = userlogindto.Telphone;
                    userloginresultdto.DealerId = dealerid;
                    userloginresultdto.Token = token.Value;

                    result.IsSuccess = true;
                    result.Data = userloginresultdto;
                    result.Msg = "登錄成功!";
                }
                else
                {
                    result.ErrorCode = 300;
                    result.Msg = "登錄失敗!";
                }

            }
            catch (Exception error)
            {
                result.ErrorCode = 200;
                result.Msg = error.Message;
            }
            return result;
        }

 上述代碼中JwtTokenBuilder的相關方法說明請參考前一篇文章。

 

QQ討論群:309287205

DDD實戰進階視頻請關注微信公眾號:


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2026 CODEPRJ.COM