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 = ; 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()
.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 = ;
result.Msg = "登录失败!";
} }
catch (Exception error)
{
result.ErrorCode = ;
result.Msg = error.Message;
}
return result;
}
上述代码中JwtTokenBuilder的相关方法说明请参考前一篇文章。
QQ讨论群:309287205
DDD实战进阶视频请关注微信公众号:
DDD实战进阶第一波(十一):开发一般业务的大健康行业直销系统(实现经销商代注册用例与登录令牌分发)的更多相关文章
- DDD实战进阶第一波(十四):开发一般业务的大健康行业直销系统(订单上下文应用服务用例与接口)
上一篇文章我们主要讲了订单上下文的领域逻辑,在领域逻辑中完成了订单项的计算逻辑.订单的计算逻辑以及如何生成相应的实体code,这篇文章我们通过 在应用服务中实现一个下单的用例,来将这些领域逻辑以及仓储 ...
- DDD实战进阶第一波(一):开发一般业务的大健康行业直销系统(概述)
本系列文章 DDD实战进阶第一波(一):开发一般业务的大健康行业直销系统(概述) DDD实战进阶第一波(二):开发一般业务的大健康行业直销系统(搭建支持DDD的轻量级框架一) 近年来,关于如何开发基于 ...
- DDD实战进阶第一波(二):开发一般业务的大健康行业直销系统(搭建支持DDD的轻量级框架一)
要实现软件设计.软件开发在一个统一的思想.统一的节奏下进行,就应该有一个轻量级的框架对开发过程与代码编写做一定的约束. 虽然DDD是一个软件开发的方法,而不是具体的技术或框架,但拥有一个轻量级的框架仍 ...
- DDD实战进阶第一波(八):开发一般业务的大健康行业直销系统(业务逻辑条件判断最佳实践)
这篇文章其实是大健康行业直销系统的番外篇,主要给大家讲讲如何在领域逻辑中,有效的处理业务逻辑条件判断的最佳实践问题. 大家都知道,聚合根.实体和值对象这些领域对象都自身处理自己的业务逻辑.在业务处理过 ...
- DDD实战进阶第一波(三):开发一般业务的大健康行业直销系统(搭建支持DDD的轻量级框架二)
了解了DDD的好处与基本的核心组件后,我们先不急着进入支持DDD思想的轻量级框架开发,也不急于直销系统需求分析和具体代码实现,我们还少一块, 那就是经典DDD的架构,只有了解了经典DDD的架构,你才能 ...
- DDD实战进阶第一波(五):开发一般业务的大健康行业直销系统(实现产品上下文领域层)
从这篇文章开始,我们根据前面的DDD理论与DDD框架的约束,正式进入直销系统案例的开发. 本篇文章主要讲产品上下文中的领域层的主要实现,先简单讲下业务方面的需求:产品SPU与产品SKU,产品SPU主要 ...
- DDD实战进阶第一波(十五):开发一般业务的大健康行业直销系统(总结篇)
前面我们花了14篇的文章来给大家介绍经典DDD的概念.架构和实践.这篇文章我们来做一个完整的总结,另外生成一个Api接口文档. 一.DDD解决传统的开发的几大问题: 没有描述需求的设计模型:而是直接通 ...
- DDD实战进阶第一波(六):开发一般业务的大健康行业直销系统(实现产品上下文仓储与应用服务层)
前一篇文章我们完成了产品上下文的领域层,我们已经有了关于产品方面的简单领域逻辑,我们接着来实现产品上下文关于仓储持久化与应用层的用例如何来协调 领域逻辑与仓储持久化. 首先大家需要明确的是,产品上下文 ...
- DDD实战进阶第一波(十二):开发一般业务的大健康行业直销系统(订单上下文POCO模型)
在本系列前面的文章中,我们主要讨论了产品上下文与经销商上下文相关的实现,大家对DDD的方法与架构已经有了初步的了解. 但是在这两个界限上下文中,业务逻辑很简单,也没有用到更多的值对象的内容.从这篇文章 ...
随机推荐
- mybatis --- 以接口的方式进行编程
); 我们来学习下接口方式的编程. 接口类IBookDao.java package com.mybatis.dao; import com.mybatis.model.Book; public i ...
- rails中migration数据库后测试不通过的问题
rails项目中由于后期需求变化,需要在products数据库中增加一个字段来满足多国家商品的分类: rails g migration add_locale_to_products locale:s ...
- oracle索引建立和删除
1.多列建立索引 SQL> create index dex_index2 on dex(sex,name); Index created. SQL> select object_name ...
- 在线学习Java免费资源推荐
你想学习Java吗?来对地方了!这篇文章将会介绍很多高质量的免费资源,包括网页.论坛.电子书和速查表. Java是一种面向对象的编程语言,拥有独立.多线程.安全.动态和健壮的特点.归功于其多功能的特点 ...
- MySQL MEB常见用法
1. 备份成镜像 备份: ./mysqlbackup --socket=/usr/local/mysql-advanced--linux-glibc2.-x86_64/data/mysql.sock ...
- Day16 Django
学Django之前,先看下http基础,老师的网页地址: web框架 - Yuan先生 - 博客园 http://www.cnblogs.com/yuanchenqi/articles/7690561 ...
- Django push: Using Server-Sent Events and WebSocket with Django
http://curella.org/blog/2012/jul/17/django-push-using-server-sent-events-and-websocket/ The goal of ...
- 利用nginx解决cookie跨域
一.写在前面 最近需要把阿里云上的四台服务器的项目迁移到客户提供的新的项目中,原来的四台服务器中用到了一级域名和二级域名.比如aaa.abc.com 和bbb.abc.com 和ccc.abc.com ...
- HTML学习笔记4:文档申明和编码标签
①文档申明 作用:为了使浏览器更好的显示HTML文件,必须告知浏览器你的文件为HTML 语法:<!DOCTYPE html> 声明必须放在HTML文档第一行 声明不是HTM ...
- 利用webmagic获取天猫评论
引言 爬取商品信息 爬取商品评论 数据清洗 1. 引言 现代网页往往其HTML只有基本结构,而数据是通过AJAX或其他方法获取后填充,这样的模式对爬虫有一定阻碍,但是熟练以后获取并不困难,本文以爬取天 ...