# domain_driver_design
**Repository Path**: zc_oss/domain_driver_design
## Basic Information
- **Project Name**: domain_driver_design
- **Description**: 基于DDD领域驱动设计&CQRS职责分离模式, 使用领域对象完成相应的业务操作, 功能职责分离, 通过划定领域界限上下文来保证业务的高度内聚
- **Primary Language**: Unknown
- **License**: Not specified
- **Default Branch**: master
- **Homepage**: None
- **GVP Project**: No
## Statistics
- **Stars**: 4
- **Forks**: 2
- **Created**: 2020-08-05
- **Last Updated**: 2024-07-03
## Categories & Tags
**Categories**: Uncategorized
**Tags**: None
## README
# **需求文档设计**
* [1. 业务需求分析](#1-业务需求分析)
* [2. 业务数据流转](#2-业务数据流转)
* [3. 领域设计](#3-领域设计)
* [3.1. 通用语言](#31-通用语言)
* [3.2. api列表](#32-api列表)
* [3.3. 领域模型](#33-领域模型)
* [3.4. 仓库](#34-仓库)
* [4. 架构设计](#4-架构设计)
* [4.1. 非功能设计](#41-非功能设计)
* [4.1.1. 账户余额防止超扣](#411-账户余额防止超扣)
* [5. 测试](#5-测试)
* [5.1 测试相关要求](#51-测试相关要求)
* [5.2 测试的要点](#52-测试的要点)
## 1. 业务需求分析
#### 术语
余额,交易明细,账户冻结,身份证唯一
#### 假设、约束与前置条件
* 使用身份证开通账户时确保次身份证号此前未开通过
* 账户未初始化设置密码不可使用
* 单次存钱上限不得高于1w元
* 取款每日上限额度2w元
## 2. 业务数据流转
在账户进行转账时,必须要确保转出方和转入方的转账数据一致性
## 3. 领域设计
#### 3.1. 通用语言
中文|英文|描述
---|---|---
身份证|identityCard|用来标识账户绑定
账户金额|amount|此账户中的存款金额
转账|transfer|把一个账户中的存款转账到另外一个账户
冻结|suspend| 后台管理员可冻结账户,账户冻结后不可使用
存款|deposit| 用户向账户中存入存款
取款|withdraw| 用户从账户中取出金额
检查账户可用性|checkAvailability|检查用户是否设置了密码和是否被冻结,能否正常使用
#### 3.2. api 列表
请求方式|api|功能
---|---|---
GET |/account| 账户分页检索
POST |/account| 身份证开户
PUT |/account/{id}| 为账户设置密码
PUT |/account/{id}/suspend |冻结账户
PUT |/account/{id}/deposit |存钱
PUT |/account/{id}/withdraw|取钱
PUT |/account/{id}/transfer/{targetId}|转账
GET |/account/balance|余额查询
#### 3.3. 领域模型

* 身份证开户: 用户可以根据身份证进行账号开通,身份证必须唯一
* 设置密码: 开通账号后需要用户进行密码设置才可正常使用
* 存钱: 可以对账号一次性存入不超过1万元
* 取钱: 可以对账号一次性取出2千五百元,每日最多可取出2万元
* 转账: 可以对其他账户进行转账,转账次数和金额不受限制
#### 3.4. 仓库
本项目使用jpa来做数据持久化的orm框架,数据会保存在阿里云的rds mysql数据库服务中
## 4. 架构设计
#### 4.1. 非功能设计
###### 4.1.1. 账户余额防止超扣
当用户使用手机银行客户端,或者多浏览器同时执行扣款时,可能在并发时会出现超扣的现象.
考虑使用分布式锁或在数据库乐观锁的方式来控制并发的数据不安全性.
## 5. 测试
#### 5.1. 测试相关要求
1. 每一个测试方法上使用@Test进行修饰
2. 每一个测试方法必须使用public void 进行修饰
3. 每一个测试方法不能携带参数
4. 测试代码和源代码在两个不同的项目路径下
5. 测试类的包应该和被测试类保持一致
6. 测试单元中的每个方法必须可以独立测试
#### 5.2. 测试的要点
* 尽可能的细化测试的粒度, 确保测试的覆盖率
* 测试要包含不同的预期和结果验证, 尽量每种情况都要考虑到
* 测试类编写不可依赖外部特定环境或服务, 可使用mock的方式来模拟环境
* 配合 assert 来验证结果