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的相关方法说明请参考前一篇文章。

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏斑斓

代码诊所

几年前,我有机会负责一个项目的咨询。团队很小,目标是对旧有系统的后端用Java改写,而团队的开发人员全为C程序员。我的工作职责是负责项目设计、开发,以及担任项目...

4186
来自专栏JAVA高级架构

程序员遇到bug后的七种反应

每一个被bug缠身的程序员,都想拥有孙悟空的本领。要么七十二变,要么一转眼灰飞烟灭 ? 1、谁动了我的代码 ? 这确实是一种曾相识的感觉,我经过无数次的解释都没...

3657
来自专栏PPV课数据科学社区

【概率论——上帝的赌术】第3话:正态分布,众生的百态

第2话中说到,大数定律证明了,单个事件变化莫测,大量事件的结果才是稳定的,是“真实可信”的,所以要用于尝试。但,总有人生来光芒万丈,有人却要奋斗20...

3567
来自专栏刘望舒

一个妹子的Android秋招面试总结(已拿BAT等7家口头offer)

在2018Android暑期实习面试总结曾介绍过个人情况、自学经历、校招流程和复习重点,这部分就不再赘述。那么本篇先以日历形式回顾秋招之路,方便各位参考某厂的处...

1.1K2
来自专栏编程一生

JVM知识在离线数据中的运用

1583
来自专栏恰童鞋骚年

设计模式的征途—14.职责链(Chain of Responsibility)模式

相信大家都玩过类似于“斗地主”的纸牌游戏,某人出牌给他的下家,下家看看手中的牌,如果要不起,则将出牌请求转发给他的下家,其下家再进行判断。一个循环下来,如果其他...

883
来自专栏领域驱动设计DDD实战进阶

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

1122
来自专栏恰童鞋骚年

自己动手写游戏:飞机大战

  要说微信中最火爆的小游戏是哪款,可能既不是精心打造的3D大作,也不是《植物大战僵尸2》,而是微信5.0刚开启时的《飞机大战》。

4341
来自专栏Python中文社区

GayHub用户及仓库分析爬虫

專 欄 ❈陈键冬,Python中文社区专栏作者 GitHub: https://github.com/chenjiandongx ❈ 爬虫介绍 Github ...

2867
来自专栏Crossin的编程教室

编写让别人能读懂的代码

作者:richieyang 随着软件行业的不断发展,历史遗留的程序越来越多,代码的维护成本越来越大,甚至大于开发成本。而新功能的开发又常常依赖于旧代码,阅读旧代...

3278

扫码关注云+社区

领取腾讯云代金券