Files
ccdi/openspec/changes/add-intermediary-blacklist/design.md
2026-01-28 09:58:31 +08:00

442 lines
13 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# Design: 中介人员黑名单管理模块
## 数据库设计
### 表dpc_intermediary_blacklist
中介人员/机构黑名单主表。
```sql
CREATE TABLE `dpc_intermediary_blacklist` (
`intermediary_id` BIGINT NOT NULL AUTO_INCREMENT COMMENT '中介ID',
`name` VARCHAR(100) NOT NULL COMMENT '姓名/机构名称',
`certificate_no` VARCHAR(50) DEFAULT NULL COMMENT '证件号',
`intermediary_type` CHAR(1) NOT NULL DEFAULT '1' COMMENT '中介类型1个人 2机构',
`status` CHAR(1) NOT NULL DEFAULT '0' COMMENT '状态0正常 1停用',
`remark` VARCHAR(500) DEFAULT NULL COMMENT '备注',
`create_by` VARCHAR(64) DEFAULT '' COMMENT '创建者',
`create_time` DATETIME DEFAULT NULL COMMENT '创建时间',
`update_by` VARCHAR(64) DEFAULT '' COMMENT '更新者',
`update_time` DATETIME DEFAULT NULL COMMENT '更新时间',
PRIMARY KEY (`intermediary_id`),
KEY `idx_name` (`name`),
KEY `idx_certificate_no` (`certificate_no`),
KEY `idx_intermediary_type` (`intermediary_type`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='中介人员黑名单表';
```
### 字段说明
| 字段名 | 类型 | 说明 | 必填 | 默认值 |
|-------|------|------|-----|-------|
| intermediary_id | BIGINT | 中介ID主键 | 是 | 自增 |
| name | VARCHAR(100) | 姓名/机构名称 | 是 | - |
| certificate_no | VARCHAR(50) | 证件号 | 否 | NULL |
| intermediary_type | CHAR(1) | 中介类型1个人 2机构 | 是 | '1' |
| status | CHAR(1) | 状态0正常 1停用 | 是 | '0' |
| remark | VARCHAR(500) | 备注 | 否 | NULL |
| create_by | VARCHAR(64) | 创建者 | 是 | - |
| create_time | DATETIME | 创建时间 | 是 | - |
| update_by | VARCHAR(64) | 更新者 | 否 | '' |
| update_time | DATETIME | 更新时间 | 否 | NULL |
### 索引设计
- 主键索引:`intermediary_id`
- 普通索引:`name`(支持按名称搜索)
- 普通索引:`certificate_no`(支持按证件号精确匹配)
- 普通索引:`intermediary_type`(支持按类型筛选)
## 后端设计
### 模块结构
```
ruoyi-dpc/
├── src/main/java/com/ruoyi/dpc/
│ ├── controller/
│ │ └── DpcIntermediaryBlacklistController.java
│ ├── domain/
│ │ ├── DpcIntermediaryBlacklist.java
│ │ ├── dto/
│ │ │ ├── DpcIntermediaryBlacklistAddDTO.java
│ │ │ ├── DpcIntermediaryBlacklistEditDTO.java
│ │ │ └── DpcIntermediaryBlacklistQueryDTO.java
│ │ └── vo/
│ │ └── DpcIntermediaryBlacklistVO.java
│ ├── mapper/
│ │ └── DpcIntermediaryBlacklistMapper.java
│ └── service/
│ ├── IDpcIntermediaryBlacklistService.java
│ └── impl/
│ └── DpcIntermediaryBlacklistServiceImpl.java
└── src/main/resources/mapper/dpc/
└── DpcIntermediaryBlacklistMapper.xml
```
### Controller 层设计
**DpcIntermediaryBlacklistController**
```java
@RestController
@RequestMapping("/dpc/intermediary")
public class DpcIntermediaryBlacklistController extends BaseController {
/**
* 查询中介黑名单列表
*/
@PreAuthorize("@ss.hasPermi('dpc:intermediary:list')")
@GetMapping("/list")
public TableDataInfo list(DpcIntermediaryBlacklistQueryDTO queryDTO) {
// 分页查询逻辑
}
/**
* 导出中介黑名单列表
*/
@PreAuthorize("@ss.hasPermi('dpc:intermediary:export')")
@Log(title = "中介黑名单", businessType = BusinessType.EXPORT)
@PostMapping("/export")
public void export(HttpServletResponse response, DpcIntermediaryBlacklistQueryDTO queryDTO) {
// 导出逻辑
}
/**
* 获取中介黑名单详细信息
*/
@PreAuthorize("@ss.hasPermi('dpc:intermediary:query')")
@GetMapping(value = "/{intermediaryId}")
public AjaxResult getInfo(@PathVariable Long intermediaryId) {
// 查询详情逻辑
}
/**
* 新增中介黑名单
*/
@PreAuthorize("@ss.hasPermi('dpc:intermediary:add')")
@Log(title = "中介黑名单", businessType = BusinessType.INSERT)
@PostMapping
public AjaxResult add(@Validated @RequestBody DpcIntermediaryBlacklistAddDTO addDTO) {
// 新增逻辑
}
/**
* 修改中介黑名单
*/
@PreAuthorize("@ss.hasPermi('dpc:intermediary:edit')")
@Log(title = "中介黑名单", businessType = BusinessType.UPDATE)
@PutMapping
public AjaxResult edit(@Validated @RequestBody DpcIntermediaryBlacklistEditDTO editDTO) {
// 修改逻辑
}
/**
* 删除中介黑名单
*/
@PreAuthorize("@ss.hasPermi('dpc:intermediary:remove')")
@Log(title = "中介黑名单", businessType = BusinessType.DELETE)
@DeleteMapping("/{intermediaryIds}")
public AjaxResult remove(@PathVariable Long[] intermediaryIds) {
// 删除逻辑
}
/**
* 下载导入模板
*/
@PostMapping("/importTemplate")
public void importTemplate(HttpServletResponse response) {
// 生成 Excel 模板
}
/**
* 导入中介黑名单
*/
@PreAuthorize("@ss.hasPermi('dpc:intermediary:import')")
@Log(title = "中介黑名单", businessType = BusinessType.IMPORT)
@PostMapping("/importData")
public AjaxResult importData(MultipartFile file) {
// 导入逻辑
}
}
```
### Service 层设计
**IDpcIntermediaryBlacklistService**
```java
public interface IDpcIntermediaryBlacklistService {
/**
* 查询中介黑名单列表
*/
List<DpcIntermediaryBlacklistVO> selectIntermediaryList(DpcIntermediaryBlacklistQueryDTO queryDTO);
/**
* 查询中介黑名单详细信息
*/
DpcIntermediaryBlacklistVO selectIntermediaryById(Long intermediaryId);
/**
* 新增中介黑名单
*/
int insertIntermediary(DpcIntermediaryBlacklistAddDTO addDTO);
/**
* 修改中介黑名单
*/
int updateIntermediary(DpcIntermediaryBlacklistEditDTO editDTO);
/**
* 批量删除中介黑名单
*/
int deleteIntermediaryByIds(Long[] intermediaryIds);
/**
* 导入中介黑名单数据
*/
String importIntermediary(List<DpcIntermediaryBlacklistAddDTO> addDTOList, boolean isUpdateSupport);
}
```
### Domain 层设计
**实体类注解**
```java
public class DpcIntermediaryBlacklist {
/** 中介ID */
private Long intermediaryId;
/** 姓名/机构名称 */
@Excel(name = "姓名/机构名称")
private String name;
/** 证件号 */
@Excel(name = "证件号")
private String certificateNo;
/** 中介类型 */
@Excel(name = "中介类型", readConverterExp = "1=个人,2=机构")
private String intermediaryType;
/** 状态 */
@Excel(name = "状态", readConverterExp = "0=正常,1=停用")
private String status;
/** 备注 */
@Excel(name = "备注")
private String remark;
/** 创建者 */
private String createBy;
/** 创建时间 */
private Date createTime;
/** 更新者 */
private String updateBy;
/** 更新时间 */
private Date updateTime;
}
```
## 前端设计
### 页面结构
```
ruoyi-ui/src/views/dpcIntermediary/
├── index.vue # 主页面(列表 + 搜索)
└── components/
└── form-dialog.vue # 新增/编辑对话框
```
### 主要功能组件
**1. 搜索区**
- 按姓名/机构名称搜索(模糊)
- 按证件号搜索(精确)
- 按中介类型筛选(下拉:全部/个人/机构)
- 按状态筛选(下拉:全部/正常/停用)
**2. 操作按钮区**
- 新增按钮
- 导入按钮
- 导出按钮
- 下载模板按钮
**3. 数据表格**
- 列:姓名/机构名称、证件号、中介类型、状态、创建时间、操作
- 操作列:编辑、删除
**4. 新增/编辑对话框**
- 姓名/机构名称(必填)
- 证件号(选填)
- 中介类型(必填,单选:个人/机构)
- 状态(必填,单选:正常/停用)
- 备注(选填,文本域)
**5. 导入对话框**
- 上传 Excel 文件
- 显示导入结果(成功/失败数量)
- 显示错误详情(如有)
### API 设计
**dpcIntermediary.js**
```javascript
import request from '@/utils/request'
// 查询中介黑名单列表
export function listIntermediary(query) {
return request({
url: '/dpc/intermediary/list',
method: 'get',
params: query
})
}
// 查询中介黑名单详细
export function getIntermediary(intermediaryId) {
return request({
url: '/dpc/intermediary/' + intermediaryId,
method: 'get'
})
}
// 新增中介黑名单
export function addIntermediary(data) {
return request({
url: '/dpc/intermediary',
method: 'post',
data: data
})
}
// 修改中介黑名单
export function updateIntermediary(data) {
return request({
url: '/dpc/intermediary',
method: 'put',
data: data
})
}
// 删除中介黑名单
export function delIntermediary(intermediaryIds) {
return request({
url: '/dpc/intermediary/' + intermediaryIds,
method: 'delete'
})
}
// 导出中介黑名单
export function exportIntermediary(query) {
return request({
url: '/dpc/intermediary/export',
method: 'post',
params: query
})
}
// 下载导入模板
export function importTemplate() {
return request({
url: '/dpc/intermediary/importTemplate',
method: 'post'
})
}
// 导入中介黑名单
export function importData(data) {
return request({
url: '/dpc/intermediary/importData',
method: 'post',
data: data
})
}
```
## Excel 导入导出设计
### Excel 模板格式
| 姓名/机构名称 | 证件号 | 中介类型 | 状态 | 备注 |
|-------------|-------|---------|------|------|
| 张三 | 110101199001011234 | 个人 | 正常 | 测试数据 |
| XX中介公司 | 91110000XXXXXXXXXX | 机构 | 正常 | - |
### 导入数据验证规则
1. **姓名/机构名称**:必填,长度 1-100 字符
2. **证件号**:选填,长度不超过 50 字符
3. **中介类型**:必填,只能填"个人"或"机构"
4. **状态**:必填,只能填"正常"或"停用"
5. **备注**:选填,长度不超过 500 字符
### 导入错误处理
- 记录每一行的错误信息
- 返回导入结果统计(成功数、失败数)
- 失败数据不写入数据库
- 支持更新模式(可选)
## 权限设计
| 权限标识 | 说明 | 对应接口 |
|---------|------|---------|
| dpc:intermediary:list | 查询中介黑名单列表 | GET /dpc/intermediary/list |
| dpc:intermediary:query | 查询中介黑名单详情 | GET /dpc/intermediary/{id} |
| dpc:intermediary:add | 新增中介黑名单 | POST /dpc/intermediary |
| dpc:intermediary:edit | 修改中介黑名单 | PUT /dpc/intermediary |
| dpc:intermediary:remove | 删除中介黑名单 | DELETE /dpc/intermediary/{ids} |
| dpc:intermediary:export | 导出中介黑名单 | POST /dpc/intermediary/export |
| dpc:intermediary:import | 导入中介黑名单 | POST /dpc/intermediary/importData |
## 菜单设计
在系统菜单表中添加以下菜单记录:
```sql
-- 一级菜单:信息维护
INSERT INTO sys_menu VALUES (
2000, '信息维护', NULL, 1, 0, 'dpc', NULL, 1, 0, 'M', '0', '0', '', 'example', 'admin', NOW(), '', NULL, '信息维护目录'
);
-- 二级菜单:中介库管理
INSERT INTO sys_menu VALUES (
2001, '中介库管理', 2000, 1, 0, 'intermediary', 'dpcIntermediary/index', 1, 0, 'C', '0', '0', 'dpc:intermediary:list', 'user', 'admin', NOW(), '', NULL, '中介库管理菜单'
);
-- 中介库管理按钮权限
INSERT INTO sys_menu VALUES (2002, '中介查询', 2001, 1, 0, '', '', 1, 0, 'F', '0', '0', 'dpc:intermediary:query', '#', 'admin', NOW(), '', NULL, '');
INSERT INTO sys_menu VALUES (2003, '中介新增', 2001, 2, 0, '', '', 1, 0, 'F', '0', '0', 'dpc:intermediary:add', '#', 'admin', NOW(), '', NULL, '');
INSERT INTO sys_menu VALUES (2004, '中介修改', 2001, 3, 0, '', '', 1, 0, 'F', '0', '0', 'dpc:intermediary:edit', '#', 'admin', NOW(), '', NULL, '');
INSERT INTO sys_menu VALUES (2005, '中介删除', 2001, 4, 0, '', '', 1, 0, 'F', '0', '0', 'dpc:intermediary:remove', '#', 'admin', NOW(), '', NULL, '');
INSERT INTO sys_menu VALUES (2006, '中介导出', 2001, 5, 0, '', '', 1, 0, 'F', '0', '0', 'dpc:intermediary:export', '#', 'admin', NOW(), '', NULL, '');
INSERT INTO sys_menu VALUES (2007, '中介导入', 2001, 6, 0, '', '', 1, 0, 'F', '0', '0', 'dpc:intermediary:import', '#', 'admin', NOW(), '', NULL, '');
```
## 字典数据设计
### 中介类型dpc_intermediary_type
| 字典值 | 字典标签 | 排序 | 状态 |
|-------|---------|-----|------|
| 1 | 个人 | 1 | 正常 |
| 2 | 机构 | 2 | 正常 |
## 技术约束
1. **后端框架**Spring Boot 3.5.8
2. **ORM 框架**MyBatis 3.0.5
3. **Excel 处理**EasyExcel 3.3.4(依赖 `replace-poi-with-easyexcel` change
4. **前端框架**Vue 2.6.12 + Element UI 2.15.14
5. **数据库**MySQL 8.2.0
6. **字符编码**UTF-8utf8mb4