diff --git a/doc/README-中介黑名单测试部署.md b/doc/README-中介黑名单测试部署.md new file mode 100644 index 0000000..8b8830e --- /dev/null +++ b/doc/README-中介黑名单测试部署.md @@ -0,0 +1,273 @@ +# 中介黑名单管理模块 - 测试与部署文档 + +## 文件说明 + +本目录包含中介黑名单管理模块(v2.0)的测试脚本、API文档、菜单配置和测试报告模板。 + +``` +doc/ +├── scripts/ +│ ├── test-intermediary-api.sh # API自动化测试脚本 +│ └── cleanup-intermediary-test-data.sh # 测试数据清理脚本 +├── api/ +│ └── 中介黑名单管理API文档-v2.0.md # 完整的API接口文档 +├── test/ +│ └── intermediary-blacklist-test-report.md # 测试报告模板 +└── sql/ + └── menu-intermediary.sql # 菜单配置SQL +``` + +--- + +## 快速开始 + +### 1. 执行菜单SQL + +首先在数据库中执行菜单配置SQL,为系统添加中介黑名单管理菜单: + +```bash +mysql -u root -p ruoyi < sql/menu-intermediary.sql +``` + +或者直接在MySQL客户端中执行: + +```sql +source D:/ccdi/ccdi/sql/menu-intermediary.sql; +``` + +执行后,在角色管理中为相应角色分配权限。 + +### 2. 运行API测试脚本 + +确保后端服务已启动(http://localhost:8080),然后执行测试脚本: + +```bash +cd D:/ccdi/ccdi/doc/scripts +bash test-intermediary-api.sh +``` + +测试脚本会自动: +- 获取Token +- 测试查询列表 +- 测试新增个人中介 +- 测试新增实体中介 +- 测试查询详情 +- 测试修改操作 +- 测试唯一性校验 +- 测试条件查询 + +### 3. 清理测试数据 + +测试完成后,运行清理脚本删除测试数据: + +```bash +cd D:/ccdi/ccdi/doc/scripts +bash cleanup-intermediary-test-data.sh +``` + +### 4. 查看API文档 + +参考API文档进行接口对接: + +- 文件位置: `doc/api/中介黑名单管理API文档-v2.0.md` +- Swagger UI: http://localhost:8080/swagger-ui/index.html + +### 5. 填写测试报告 + +根据测试结果填写测试报告模板: + +- 文件位置: `doc/test/intermediary-blacklist-test-report.md` + +--- + +## API接口列表 + +### 基础路径 +`/ccdi/intermediary` + +### 主要接口 + +| 方法 | 路径 | 说明 | 权限 | +|------|------|------|------| +| GET | /list | 查询中介列表 | ccdi:intermediary:list | +| GET | /person/{bizId} | 查询个人中介详情 | ccdi:intermediary:query | +| GET | /entity/{socialCreditCode} | 查询实体中介详情 | ccdi:intermediary:query | +| POST | /person | 新增个人中介 | ccdi:intermediary:add | +| POST | /entity | 新增实体中介 | ccdi:intermediary:add | +| PUT | /person | 修改个人中介 | ccdi:intermediary:edit | +| PUT | /entity | 修改实体中介 | ccdi:intermediary:edit | +| DELETE | /{ids} | 删除中介 | ccdi:intermediary:remove | +| GET | /checkPersonIdUnique | 校验人员ID唯一性 | 无 | +| GET | /checkSocialCreditCodeUnique | 校验统一社会信用代码唯一性 | 无 | +| POST | /importPersonTemplate | 下载个人中介导入模板 | 无 | +| POST | /importEntityTemplate | 下载实体中介导入模板 | 无 | +| POST | /importPersonData | 导入个人中介数据 | ccdi:intermediary:import | +| POST | /importEntityData | 导入实体中介数据 | ccdi:intermediary:import | + +详细接口说明请参考API文档。 + +--- + +## 测试账号 + +- **用户名**: admin +- **密码**: admin123 +- **角色**: 管理员 + +--- + +## 菜单权限说明 + +执行menu-intermediary.sql后,系统会创建以下权限: + +| 权限标识 | 说明 | +|---------|------| +| ccdi:intermediary:query | 查询中介详情 | +| ccdi:intermediary:list | 查询中介列表 | +| ccdi:intermediary:add | 新增中介 | +| ccdi:intermediary:edit | 修改中介 | +| ccdi:intermediary:remove | 删除中介 | +| ccdi:intermediary:export | 导出中介数据 | +| ccdi:intermediary:import | 导入中介数据 | + +在角色管理中为相应角色分配这些权限。 + +--- + +## 数据字典说明 + +模块使用的数据字典类型: + +| 字典类型 | 字典名称 | 用途 | +|---------|---------|------| +| ccdi_indiv_gender | 个人中介性别 | 个人中介模板性别下拉框 | +| ccdi_certificate_type | 证件类型 | 个人中介模板证件类型下拉框 | +| ccdi_entity_type | 主体类型 | 机构中介模板主体类型下拉框 | +| ccdi_enterprise_nature | 企业性质 | 机构中介模板企业性质下拉框 | +| ccdi_data_source | 数据来源 | 数据来源字段映射 | + +确保这些字典类型在系统中已配置。 + +--- + +## 测试用例统计 + +本模块共包含44个测试用例,涵盖: + +1. **列表查询** (7个用例) + - 基础列表查询 + - 分页查询 + - 按姓名查询 + - 按证件号查询 + - 按中介类型查询 + - 组合条件查询 + +2. **个人中介管理** (8个用例) + - 新增个人中介 + - 字段验证 + - 唯一性校验 + - 修改个人中介 + - 查询详情 + +3. **实体中介管理** (7个用例) + - 新增实体中介 + - 字段验证 + - 唯一性校验 + - 修改实体中介 + - 查询详情 + +4. **唯一性校验** (2个用例) + - 人员ID唯一性 + - 统一社会信用代码唯一性 + +5. **删除功能** (3个用例) + - 删除单条记录 + - 批量删除 + - 删除不存在的记录 + +6. **导入导出** (11个用例) + - 模板下载 + - 数据导入 + - 数据导出 + - 异常处理 + +7. **权限控制** (6个用例) + - 各功能点的权限验证 + +--- + +## 常见问题 + +### 1. 测试脚本无法执行 + +**问题**: bash: test-intermediary-api.sh: command not found + +**解决**: 使用bash命令执行 +```bash +bash test-intermediary-api.sh +``` + +### 2. jq命令未安装 + +**问题**: jq: command not found + +**解决**: 安装jq命令 +```bash +# Ubuntu/Debian +apt-get install jq + +# CentOS/RHEL +yum install jq + +# Windows (使用Git Bash) +# 下载jq for Windows并添加到PATH +``` + +### 3. Token获取失败 + +**问题**: Token获取失败或返回null + +**解决**: +- 确保后端服务已启动 +- 确认用户名密码正确(admin/admin123) +- 检查/login/test接口是否正常 + +### 4. 菜单不显示 + +**问题**: 执行SQL后菜单不显示 + +**解决**: +- 在角色管理中为当前角色分配权限 +- 刷新页面或重新登录 +- 检查父级菜单ID(2000)是否存在 + +### 5. 导入失败 + +**问题**: 导入数据时报错 + +**解决**: +- 确认Excel模板格式正确 +- 检查必填字段是否为空 +- 检查证件号或统一社会信用代码是否重复 + +--- + +## 版本历史 + +| 版本 | 日期 | 说明 | +|------|------|------| +| 2.0.0 | 2026-02-04 | 重构版本:使用MyBatis Plus,分离DTO/VO,统一业务ID | +| 1.3.0 | 2026-01-29 | 新增接口分离:新增个人/机构专用新增接口 | +| 1.2.0 | 2026-01-29 | 修改接口分离:新增个人/机构专用修改接口 | +| 1.1.0 | 2026-01-29 | 添加字典下拉框功能,分离个人/机构模板 | +| 1.0.0 | 2026-01-29 | 初始版本,支持个人和机构分类管理 | + +--- + +## 联系方式 + +如有问题,请联系开发团队。 + +--- + +**最后更新**: 2026-02-04 diff --git a/doc/api/中介黑名单管理API文档-v2.0.md b/doc/api/中介黑名单管理API文档-v2.0.md new file mode 100644 index 0000000..6144a1d --- /dev/null +++ b/doc/api/中介黑名单管理API文档-v2.0.md @@ -0,0 +1,610 @@ +# 中介黑名单管理 API 文档 v2.0 + +## 概述 + +中介黑名单管理模块提供个人和实体两类中介信息的增删改查、类型化模板下载和批量导入导出功能。 + +**基础路径**: `/ccdi/intermediary` + +**权限标识前缀**: `ccdi:intermediary` + +**文档版本**: v2.0 + +**更新日期**: 2026-02-04 + +--- + +## API 接口列表 + +### 1. 查询中介列表 + +**接口地址**: `GET /ccdi/intermediary/list` + +**权限要求**: `ccdi:intermediary:list` + +**请求参数** (Query Params): + +| 参数名 | 类型 | 必填 | 说明 | +|--------|------|------|------| +| name | String | 否 | 姓名/机构名称(模糊查询) | +| certificateNo | String | 否 | 证件号/统一社会信用代码(精确查询) | +| intermediaryType | String | 否 | 中介类型(1=个人, 2=实体) | +| pageNum | Integer | 否 | 页码(默认1) | +| pageSize | Integer | 否 | 每页数量(默认10) | + +**响应示例**: +```json +{ + "code": 200, + "msg": "操作成功", + "rows": [ + { + "bizId": "I202602040001", + "name": "张三", + "certificateNo": "110101199001011234", + "intermediaryType": "1", + "intermediaryTypeName": "个人", + "status": "0", + "statusName": "正常", + "remark": "测试数据", + "createBy": "admin", + "createTime": "2026-02-04 10:00:00" + } + ], + "total": 1 +} +``` + +**响应字段说明**: + +| 字段名 | 类型 | 说明 | +|--------|------|------| +| bizId | String | 业务ID | +| name | String | 姓名/机构名称 | +| certificateNo | String | 证件号/统一社会信用代码 | +| intermediaryType | String | 中介类型(1=个人, 2=实体) | +| intermediaryTypeName | String | 中介类型名称 | +| status | String | 状态(0=正常, 1=停用) | +| statusName | String | 状态名称 | +| remark | String | 备注 | +| createBy | String | 创建人 | +| createTime | String | 创建时间 | + +--- + +### 2. 查询个人中介详情 + +**接口地址**: `GET /ccdi/intermediary/person/{bizId}` + +**权限要求**: `ccdi:intermediary:query` + +**路径参数**: + +| 参数名 | 类型 | 必填 | 说明 | +|--------|------|------|------| +| bizId | String | 是 | 业务ID | + +**响应示例**: +```json +{ + "code": 200, + "msg": "操作成功", + "data": { + "bizId": "I202602040001", + "name": "张三", + "certificateNo": "110101199001011234", + "intermediaryType": "1", + "intermediaryTypeName": "个人", + "status": "0", + "statusName": "正常", + "personType": "中介", + "personSubType": "本人", + "relationType": "正常", + "gender": "M", + "genderName": "男", + "idType": "身份证", + "personId": "110101199001011234", + "mobile": "13800138000", + "wechatNo": "zhangsan", + "contactAddress": "北京市朝阳区", + "company": "XX公司", + "socialCreditCode": "91110000123456789X", + "position": "经纪人", + "relatedNumId": "", + "relation": "", + "remark": "测试数据", + "createBy": "admin", + "createTime": "2026-02-04 10:00:00" + } +} +``` + +--- + +### 3. 查询实体中介详情 + +**接口地址**: `GET /ccdi/intermediary/entity/{socialCreditCode}` + +**权限要求**: `ccdi:intermediary:query` + +**路径参数**: + +| 参数名 | 类型 | 必填 | 说明 | +|--------|------|------|------| +| socialCreditCode | String | 是 | 统一社会信用代码 | + +**响应示例**: +```json +{ + "code": 200, + "msg": "操作成功", + "data": { + "bizId": "I202602040002", + "name": "XX中介公司", + "certificateNo": "91110000123456789X", + "intermediaryType": "2", + "intermediaryTypeName": "实体", + "status": "0", + "statusName": "正常", + "enterpriseName": "XX中介公司", + "socialCreditCode": "91110000123456789X", + "enterpriseType": "有限责任公司", + "enterpriseNature": "民企", + "industryClass": "房地产", + "industryName": "房地产业", + "establishDate": "2020-01-01", + "registerAddress": "北京市朝阳区", + "legalRepresentative": "张三", + "legalCertType": "身份证", + "legalCertNo": "110101199001011234", + "shareholder1": "李四", + "shareholder2": "王五", + "shareholder3": "", + "shareholder4": "", + "shareholder5": "", + "remark": "测试数据", + "createBy": "admin", + "createTime": "2026-02-04 10:00:00" + } +} +``` + +--- + +### 4. 新增个人中介 + +**接口地址**: `POST /ccdi/intermediary/person` + +**权限要求**: `ccdi:intermediary:add` + +**请求体** (application/json): +```json +{ + "name": "张三", + "personType": "中介", + "personSubType": "本人", + "relationType": "正常", + "gender": "M", + "idType": "身份证", + "personId": "110101199001011234", + "mobile": "13800138000", + "wechatNo": "zhangsan", + "contactAddress": "北京市朝阳区", + "company": "XX公司", + "socialCreditCode": "91110000123456789X", + "position": "经纪人", + "relatedNumId": "", + "relation": "", + "remark": "测试数据" +} +``` + +**字段说明**: + +| 字段名 | 类型 | 必填 | 说明 | +|--------|------|------|------| +| name | String | 是 | 姓名(最大100字符) | +| personId | String | 是 | 证件号码(最大50字符) | +| personType | String | 否 | 人员类型 | +| personSubType | String | 否 | 人员子类型 | +| relationType | String | 否 | 关系类型 | +| gender | String | 否 | 性别(M=男, F=女, O=其他) | +| idType | String | 否 | 证件类型 | +| mobile | String | 否 | 手机号码(最大20字符) | +| wechatNo | String | 否 | 微信号(最大50字符) | +| contactAddress | String | 否 | 联系地址(最大200字符) | +| company | String | 否 | 所在公司(最大200字符) | +| socialCreditCode | String | 否 | 企业统一信用码(最大50字符) | +| position | String | 否 | 职位(最大100字符) | +| relatedNumId | String | 否 | 关联人员ID(最大50字符) | +| relation | String | 否 | 关联关系(最大50字符) | +| remark | String | 否 | 备注(最大500字符) | + +**响应示例**: +```json +{ + "code": 200, + "msg": "操作成功" +} +``` + +--- + +### 5. 新增实体中介 + +**接口地址**: `POST /ccdi/intermediary/entity` + +**权限要求**: `ccdi:intermediary:add` + +**请求体** (application/json): +```json +{ + "enterpriseName": "XX中介公司", + "socialCreditCode": "91110000123456789X", + "enterpriseType": "有限责任公司", + "enterpriseNature": "民企", + "industryClass": "房地产", + "industryName": "房地产业", + "establishDate": "2020-01-01", + "registerAddress": "北京市朝阳区", + "legalRepresentative": "张三", + "legalCertType": "身份证", + "legalCertNo": "110101199001011234", + "shareholder1": "李四", + "shareholder2": "王五", + "shareholder3": "", + "shareholder4": "", + "shareholder5": "", + "remark": "测试数据" +} +``` + +**字段说明**: + +| 字段名 | 类型 | 必填 | 说明 | +|--------|------|------|------| +| enterpriseName | String | 是 | 机构名称(最大200字符) | +| socialCreditCode | String | 否 | 统一社会信用代码(最大50字符) | +| enterpriseType | String | 否 | 主体类型(最大50字符) | +| enterpriseNature | String | 否 | 企业性质(最大50字符) | +| industryClass | String | 否 | 行业分类(最大100字符) | +| industryName | String | 否 | 所属行业(最大100字符) | +| establishDate | Date | 否 | 成立日期 | +| registerAddress | String | 否 | 注册地址(最大500字符) | +| legalRepresentative | String | 否 | 法定代表人(最大100字符) | +| legalCertType | String | 否 | 法定代表人证件类型(最大50字符) | +| legalCertNo | String | 否 | 法定代表人证件号码(最大50字符) | +| shareholder1-5 | String | 否 | 股东信息(每个最大100字符) | +| remark | String | 否 | 备注(最大500字符) | + +**响应示例**: +```json +{ + "code": 200, + "msg": "操作成功" +} +``` + +--- + +### 6. 修改个人中介 + +**接口地址**: `PUT /ccdi/intermediary/person` + +**权限要求**: `ccdi:intermediary:edit` + +**请求体** (application/json): +```json +{ + "bizId": "I202602040001", + "name": "张三", + "personType": "中介", + "personSubType": "本人", + "relationType": "正常", + "gender": "M", + "idType": "身份证", + "personId": "110101199001011234", + "mobile": "13800138000", + "wechatNo": "zhangsan", + "contactAddress": "北京市朝阳区", + "company": "XX公司", + "socialCreditCode": "91110000123456789X", + "position": "经纪人", + "relatedNumId": "", + "relation": "", + "remark": "测试数据" +} +``` + +**字段说明**: 与新增个人中介相同,bizId为必填项 + +**响应示例**: +```json +{ + "code": 200, + "msg": "操作成功" +} +``` + +--- + +### 7. 修改实体中介 + +**接口地址**: `PUT /ccdi/intermediary/entity` + +**权限要求**: `ccdi:intermediary:edit` + +**请求体** (application/json): +```json +{ + "socialCreditCode": "91110000123456789X", + "enterpriseName": "XX中介公司", + "enterpriseType": "有限责任公司", + "enterpriseNature": "民企", + "industryClass": "房地产", + "industryName": "房地产业", + "establishDate": "2020-01-01", + "registerAddress": "北京市朝阳区", + "legalRepresentative": "张三", + "legalCertType": "身份证", + "legalCertNo": "110101199001011234", + "shareholder1": "李四", + "shareholder2": "王五", + "shareholder3": "", + "shareholder4": "", + "shareholder5": "", + "remark": "测试数据" +} +``` + +**字段说明**: 与新增实体中介相同,socialCreditCode为必填项 + +**响应示例**: +```json +{ + "code": 200, + "msg": "操作成功" +} +``` + +--- + +### 8. 删除中介 + +**接口地址**: `DELETE /ccdi/intermediary/{ids}` + +**权限要求**: `ccdi:intermediary:remove` + +**路径参数**: + +| 参数名 | 类型 | 必填 | 说明 | +|--------|------|------|------| +| ids | String[] | 是 | 业务ID数组(逗号分隔) | + +**响应示例**: +```json +{ + "code": 200, + "msg": "操作成功" +} +``` + +--- + +### 9. 校验人员ID唯一性 + +**接口地址**: `GET /ccdi/intermediary/checkPersonIdUnique` + +**权限要求**: 无 + +**请求参数**: + +| 参数名 | 类型 | 必填 | 说明 | +|--------|------|------|------| +| personId | String | 是 | 证件号码 | +| bizId | String | 否 | 排除的业务ID(修改时使用) | + +**响应示例**: +```json +{ + "code": 200, + "msg": "操作成功", + "data": true +} +``` + +**data字段说明**: true=唯一可用, false=已存在 + +--- + +### 10. 校验统一社会信用代码唯一性 + +**接口地址**: `GET /ccdi/intermediary/checkSocialCreditCodeUnique` + +**权限要求**: 无 + +**请求参数**: + +| 参数名 | 类型 | 必填 | 说明 | +|--------|------|------|------| +| socialCreditCode | String | 是 | 统一社会信用代码 | +| excludeId | String | 否 | 排除的ID(修改时使用) | + +**响应示例**: +```json +{ + "code": 200, + "msg": "操作成功", + "data": true +} +``` + +**data字段说明**: true=唯一可用, false=已存在 + +--- + +### 11. 下载个人中介导入模板 + +**接口地址**: `POST /ccdi/intermediary/importPersonTemplate` + +**权限要求**: 无 + +**响应**: Excel模板文件下载 + +**Excel格式说明**: + +**Sheet1: 个人中介信息** +| 姓名 | 人员类型 | 人员子类型 | 关系类型 | 性别▼ | 证件类型▼ | 证件号码 | 手机号码 | 微信号 | 联系地址 | 所在公司 | 企业统一信用码 | 职位 | 关联人员ID | 关联关系 | 备注 | +|------|---------|-----------|---------|-------|-----------|---------|---------|--------|---------|---------|--------------|-----|-----------|---------|------| +| 张三 | 中介 | 本人 | 正常 | 男 | 身份证 | 110101199001011234 | 13800138000 | zhangsan | 北京市朝阳区 | XX公司 | 91110000XXXXXXXXXX | 经纪人 | - | - | 测试 | + +**注**: 带▼标记的列包含下拉框,选项来自字典 + +--- + +### 12. 下载实体中介导入模板 + +**接口地址**: `POST /ccdi/intermediary/importEntityTemplate` + +**权限要求**: 无 + +**响应**: Excel模板文件下载 + +**Excel格式说明**: + +**Sheet1: 实体中介信息** +| 机构名称 | 统一社会信用代码 | 主体类型▼ | 企业性质▼ | 行业分类 | 所属行业 | 成立日期 | 注册地址 | 法定代表人 | 法定代表人证件类型 | 法定代表人证件号码 | 股东1 | 股东2 | 股东3 | 股东4 | 股东5 | 备注 | +|---------|-----------------|-----------|-----------|---------|---------|---------|---------|-----------|-------------------|-------------------|-------|-------|-------|-------|-------|------| +| XX公司 | 91110000XXXXXXXXXX | 有限责任公司 | 民企 | 房地产 | 房地产业 | 2020-01-01 | 北京市朝阳区 | 张三 | 身份证 | 110101199001011234 | 李四 | 王五 | - | - | - | - | + +--- + +### 13. 导入个人中介数据 + +**接口地址**: `POST /ccdi/intermediary/importPersonData` + +**权限要求**: `ccdi:intermediary:import` + +**请求参数** (multipart/form-data): + +| 参数名 | 类型 | 必填 | 说明 | +|--------|------|------|------| +| file | File | 是 | Excel文件 | +| updateSupport | Boolean | 否 | 是否更新已存在数据(默认false) | + +**响应示例**: +```json +{ + "code": 200, + "msg": "恭喜您,数据已全部导入成功!共10条" +} +``` + +--- + +### 14. 导入实体中介数据 + +**接口地址**: `POST /ccdi/intermediary/importEntityData` + +**权限要求**: `ccdi:intermediary:import` + +**请求参数** (multipart/form-data): + +| 参数名 | 类型 | 必填 | 说明 | +|--------|------|------|------| +| file | File | 是 | Excel文件 | +| updateSupport | Boolean | 否 | 是否更新已存在数据(默认false) | + +**响应示例**: +```json +{ + "code": 200, + "msg": "恭喜您,数据已全部导入成功!共10条" +} +``` + +--- + +## 字典数据说明 + +导入模板中的下拉框选项来自系统字典管理,相关字典类型: + +| 字典类型 | 字典名称 | 用途 | +|---------|---------|------| +| ccdi_indiv_gender | 个人中介性别 | 个人中介模板性别下拉框 | +| ccdi_certificate_type | 证件类型 | 个人中介模板证件类型下拉框 | +| ccdi_entity_type | 主体类型 | 机构中介模板主体类型下拉框 | +| ccdi_enterprise_nature | 企业性质 | 机构中介模板企业性质下拉框 | +| ccdi_data_source | 数据来源 | 数据来源字段映射 | + +--- + +## 错误码说明 + +| HTTP状态码 | 错误码 | 说明 | +|-----------|--------|------| +| 200 | 200 | 操作成功 | +| 401 | 401 | 未授权,请先登录 | +| 403 | 403 | 无权限访问 | +| 500 | 500 | 服务器内部错误 | + +--- + +## 业务错误信息 + +| 错误信息 | 说明 | +|----------|------| +| 姓名不能为空 | 个人中介新增/修改时姓名为空 | +| 机构名称不能为空 | 实体中介新增/修改时机构名称为空 | +| 证件号码不能为空 | 个人中介新增/修改时证件号码为空 | +| 该证件号已存在 | 新增/导入时证件号重复 | +| 该统一社会信用代码已存在 | 新增/导入时信用代码重复 | +| 姓名长度不能超过100个字符 | 姓名超长 | +| 证件号码长度不能超过50个字符 | 证件号码超长 | +| 机构名称长度不能超过200个字符 | 机构名称超长 | + +--- + +## 测试账号 + +- 用户名: `admin` +- 密码: `admin123` + +测试前请先调用 `/login/test` 接口获取Token。 + +--- + +## 更新日志 + +| 版本 | 日期 | 说明 | +|------|------|------| +| 1.0.0 | 2026-01-29 | 初始版本,支持个人和机构分类管理 | +| 1.1.0 | 2026-01-29 | 添加字典下拉框功能,分离个人/机构模板 | +| 1.2.0 | 2026-01-29 | 修改接口分离:新增个人/机构专用修改接口,修复中介类型修改问题 | +| 1.3.0 | 2026-01-29 | 新增接口分离:新增个人/机构专用新增接口,统一接口设计 | +| 2.0.0 | 2026-02-04 | 重构版本:使用MyBatis Plus,分离DTO/VO,统一业务ID(bizId),优化查询接口 | + +--- + +## 主要变更说明 (v2.0) + +### 架构变更 +- 使用MyBatis Plus替代原生MyBatis +- 分离DTO(请求)和VO(响应)对象 +- 统一使用业务ID(bizId)作为主键 + +### 接口变更 +- 查询详情接口分离为个人和实体两个接口 +- 新增接口分离为个人和实体两个接口 +- 修改接口分离为个人和实体两个接口 +- 新增唯一性校验接口 + +### 数据模型变更 +- 个人中介使用`personId`作为证件号字段 +- 实体中介使用`socialCreditCode`作为统一社会信用代码字段 +- 删除了`intermediaryId`,统一使用`bizId` + +### 查询功能增强 +- 支持按中介类型查询 +- 支持按姓名/机构名称模糊查询 +- 支持按证件号/统一社会信用代码精确查询 diff --git a/doc/scripts/cleanup-intermediary-test-data.sh b/doc/scripts/cleanup-intermediary-test-data.sh new file mode 100644 index 0000000..99d3a47 --- /dev/null +++ b/doc/scripts/cleanup-intermediary-test-data.sh @@ -0,0 +1,177 @@ +#!/bin/bash + +################################################################################ +# 中介黑名单管理测试数据清理脚本 +# 功能: 清理测试脚本创建的测试数据 +# 作者: Claude Code +# 日期: 2026-02-04 +################################################################################ + +# 颜色定义 +RED='\033[0;31m' +GREEN='\033[0;32m' +YELLOW='\033[1;33m' +NC='\033[0m' # No Color + +# 配置 +BASE_URL="http://localhost:8080" +TEST_USERNAME="admin" +TEST_PASSWORD="admin123" + +# 输出函数 +print_header() { + echo "" + echo "========================================" + echo "$1" + echo "========================================" +} + +print_section() { + echo "" + echo -e "${YELLOW}=== $1 ===${NC}" +} + +print_success() { + echo -e "${GREEN}✓ $1${NC}" +} + +print_error() { + echo -e "${RED}✗ $1${NC}" +} + +# 获取Token +get_token() { + print_section "获取Token" + + TOKEN=$(curl -s -X POST "${BASE_URL}/login/test" \ + -H "Content-Type: application/json" \ + -d "{\"username\":\"${TEST_USERNAME}\",\"password\":\"${TEST_PASSWORD}\"}" | jq -r '.data.token') + + if [ "$TOKEN" != "null" ] && [ -n "$TOKEN" ]; then + print_success "Token获取成功" + else + print_error "Token获取失败" + exit 1 + fi +} + +# 查询测试数据 +query_test_data() { + print_section "查询测试数据" + + echo "查询测试个人中介:" + PERSON_RESPONSE=$(curl -s -X GET "${BASE_URL}/ccdi/intermediary/list?name=测试中介个人&intermediaryType=1" \ + -H "Authorization: Bearer $TOKEN") + + echo "$PERSON_RESPONSE" | jq '.' + + PERSON_IDS=$(echo "$PERSON_RESPONSE" | jq -r '.rows[].bizId // empty') + + echo "" + echo "查询测试实体中介:" + ENTITY_RESPONSE=$(curl -s -X GET "${BASE_URL}/ccdi/intermediary/list?name=测试中介公司&intermediaryType=2" \ + -H "Authorization: Bearer $TOKEN") + + echo "$ENTITY_RESPONSE" | jq '.' + + ENTITY_IDS=$(echo "$ENTITY_RESPONSE" | jq -r '.rows[].bizId // empty') +} + +# 删除测试数据 +delete_test_data() { + print_section "删除测试数据" + + # 删除测试个人中介 + if [ -n "$PERSON_IDS" ]; then + echo "删除测试个人中介: $PERSON_IDS" + DELETE_RESPONSE=$(curl -s -X DELETE "${BASE_URL}/ccdi/intermediary/${PERSON_IDS}" \ + -H "Authorization: Bearer $TOKEN") + + echo "$DELETE_RESPONSE" | jq '.' + + code=$(echo "$DELETE_RESPONSE" | jq -r '.code') + if [ "$code" == "200" ]; then + print_success "测试个人中介删除成功" + else + print_error "测试个人中介删除失败" + fi + else + echo "没有找到测试个人中介数据" + fi + + # 删除测试实体中介 + if [ -n "$ENTITY_IDS" ]; then + echo "" + echo "删除测试实体中介: $ENTITY_IDS" + DELETE_RESPONSE=$(curl -s -X DELETE "${BASE_URL}/ccdi/intermediary/${ENTITY_IDS}" \ + -H "Authorization: Bearer $TOKEN") + + echo "$DELETE_RESPONSE" | jq '.' + + code=$(echo "$DELETE_RESPONSE" | jq -r '.code') + if [ "$code" == "200" ]; then + print_success "测试实体中介删除成功" + else + print_error "测试实体中介删除失败" + fi + else + echo "" + echo "没有找到测试实体中介数据" + fi +} + +# 验证删除结果 +verify_deletion() { + print_section "验证删除结果" + + echo "验证测试个人中介是否已删除:" + VERIFY_PERSON=$(curl -s -X GET "${BASE_URL}/ccdi/intermediary/list?name=测试中介个人&intermediaryType=1" \ + -H "Authorization: Bearer $TOKEN") + + TOTAL=$(echo "$VERIFY_PERSON" | jq -r '.total') + if [ "$TOTAL" == "0" ]; then + print_success "测试个人中介已全部删除" + else + print_error "仍有 $TOTAL 条测试个人中介数据未删除" + fi + + echo "" + echo "验证测试实体中介是否已删除:" + VERIFY_ENTITY=$(curl -s -X GET "${BASE_URL}/ccdi/intermediary/list?name=测试中介公司&intermediaryType=2" \ + -H "Authorization: Bearer $TOKEN") + + TOTAL=$(echo "$VERIFY_ENTITY" | jq -r '.total') + if [ "$TOTAL" == "0" ]; then + print_success "测试实体中介已全部删除" + else + print_error "仍有 $TOTAL 条测试实体中介数据未删除" + fi +} + +# 主函数 +main() { + print_header "中介黑名单测试数据清理开始" + + # 检查jq命令 + if ! command -v jq &> /dev/null; then + print_error "jq命令未安装,请先安装: apt-get install jq 或 yum install jq" + exit 1 + fi + + # 获取Token + get_token + + # 查询测试数据 + query_test_data + + # 删除测试数据 + delete_test_data + + # 验证删除结果 + verify_deletion + + print_header "清理完成" +} + +# 执行主函数 +main diff --git a/doc/scripts/run-cleanup.bat b/doc/scripts/run-cleanup.bat new file mode 100644 index 0000000..74ee880 --- /dev/null +++ b/doc/scripts/run-cleanup.bat @@ -0,0 +1,33 @@ +@echo off +REM ===================================================== +REM 中介黑名单管理 测试数据清理脚本 (Windows版本) +REM 功能: 在Windows上清理测试数据 +REM 作者: Claude Code +REM 日期: 2026-02-04 +REM ===================================================== + +echo ======================================== +echo 中介黑名单测试数据清理 +echo ======================================== +echo. + +REM 检查Git Bash是否安装 +where bash >nul 2>nul +if %ERRORLEVEL% NEQ 0 ( + echo 错误: 未找到Git Bash + echo 请安装Git for Windows或在Git Bash中运行此脚本 + pause + exit /b 1 +) + +REM 执行清理脚本 +echo 正在清理测试数据... +echo. +bash "D:/ccdi/ccdi/doc/scripts/cleanup-intermediary-test-data.sh" + +echo. +echo ======================================== +echo 清理完成 +echo ======================================== +echo. +pause diff --git a/doc/scripts/run-test.bat b/doc/scripts/run-test.bat new file mode 100644 index 0000000..aa6cabe --- /dev/null +++ b/doc/scripts/run-test.bat @@ -0,0 +1,33 @@ +@echo off +REM ===================================================== +REM 中介黑名单管理 API 测试脚本 (Windows版本) +REM 功能: 在Windows上执行API测试 +REM 作者: Claude Code +REM 日期: 2026-02-04 +REM ===================================================== + +echo ======================================== +echo 中介黑名单管理 API 测试 +echo ======================================== +echo. + +REM 检查Git Bash是否安装 +where bash >nul 2>nul +if %ERRORLEVEL% NEQ 0 ( + echo 错误: 未找到Git Bash + echo 请安装Git for Windows或在Git Bash中运行此脚本 + pause + exit /b 1 +) + +REM 执行测试脚本 +echo 正在执行API测试... +echo. +bash "D:/ccdi/ccdi/doc/scripts/test-intermediary-api.sh" + +echo. +echo ======================================== +echo 测试完成 +echo ======================================== +echo. +pause diff --git a/doc/scripts/test-intermediary-api.sh b/doc/scripts/test-intermediary-api.sh new file mode 100644 index 0000000..ef62fc7 --- /dev/null +++ b/doc/scripts/test-intermediary-api.sh @@ -0,0 +1,363 @@ +#!/bin/bash + +################################################################################ +# 中介黑名单管理 API 测试脚本 +# 功能: 测试中介黑名单管理模块的所有接口 +# 作者: Claude Code +# 日期: 2026-02-04 +################################################################################ + +# 颜色定义 +RED='\033[0;31m' +GREEN='\033[0;32m' +YELLOW='\033[1;33m' +NC='\033[0m' # No Color + +# 配置 +BASE_URL="http://localhost:8080" +TEST_USERNAME="admin" +TEST_PASSWORD="admin123" + +# 输出函数 +print_header() { + echo "" + echo "========================================" + echo "$1" + echo "========================================" +} + +print_section() { + echo "" + echo -e "${YELLOW}=== $1 ===${NC}" +} + +print_success() { + echo -e "${GREEN}✓ $1${NC}" +} + +print_error() { + echo -e "${RED}✗ $1${NC}" +} + +# 获取Token +get_token() { + print_section "获取Token" + + TOKEN=$(curl -s -X POST "${BASE_URL}/login/test" \ + -H "Content-Type: application/json" \ + -d "{\"username\":\"${TEST_USERNAME}\",\"password\":\"${TEST_PASSWORD}\"}" | jq -r '.data.token') + + if [ "$TOKEN" != "null" ] && [ -n "$TOKEN" ]; then + print_success "Token获取成功: ${TOKEN:0:20}..." + echo "$TOKEN" + else + print_error "Token获取失败" + exit 1 + fi +} + +# 测试查询列表 +test_list() { + print_section "测试查询列表" + + response=$(curl -s -X GET "${BASE_URL}/ccdi/intermediary/list?pageNum=1&pageSize=10" \ + -H "Authorization: Bearer $TOKEN") + + echo "$response" | jq '.' + code=$(echo "$response" | jq -r '.code') + + if [ "$code" == "200" ]; then + print_success "查询列表成功" + total=$(echo "$response" | jq -r '.total') + echo "总记录数: $total" + else + print_error "查询列表失败" + fi +} + +# 测试新增个人中介 +test_add_person() { + print_section "测试新增个人中介" + + response=$(curl -s -X POST "${BASE_URL}/ccdi/intermediary/person" \ + -H "Authorization: Bearer $TOKEN" \ + -H "Content-Type: application/json" \ + -d '{ + "name": "测试中介个人", + "personType": "中介", + "personSubType": "本人", + "relationType": "正常", + "gender": "M", + "idType": "身份证", + "personId": "110101199001019999", + "mobile": "13800138000", + "wechatNo": "test_wx", + "contactAddress": "北京市朝阳区测试地址", + "company": "测试公司", + "position": "经纪人", + "remark": "自动化测试数据" + }') + + echo "$response" | jq '.' + code=$(echo "$response" | jq -r '.code') + + if [ "$code" == "200" ]; then + print_success "新增个人中介成功" + # 保存bizId用于后续测试 + PERSON_BIZ_ID=$(curl -s -X GET "${BASE_URL}/ccdi/intermediary/list?name=测试中介个人" \ + -H "Authorization: Bearer $TOKEN" | jq -r '.rows[0].bizId // empty') + if [ -n "$PERSON_BIZ_ID" ]; then + echo "获取到个人中介bizId: $PERSON_BIZ_ID" + fi + else + print_error "新增个人中介失败: $(echo "$response" | jq -r '.msg')" + fi +} + +# 测试新增实体中介 +test_add_entity() { + print_section "测试新增实体中介" + + response=$(curl -s -X POST "${BASE_URL}/ccdi/intermediary/entity" \ + -H "Authorization: Bearer $TOKEN" \ + -H "Content-Type: application/json" \ + -d '{ + "enterpriseName": "测试中介公司", + "socialCreditCode": "91110000123456789X", + "enterpriseType": "有限责任公司", + "enterpriseNature": "民企", + "industryClass": "房地产", + "industryName": "房地产业", + "establishDate": "2020-01-01", + "registerAddress": "北京市朝阳区注册地址", + "legalRepresentative": "张三", + "legalCertType": "身份证", + "legalCertNo": "110101199001011234", + "shareholder1": "李四", + "shareholder2": "王五", + "remark": "自动化测试数据" + }') + + echo "$response" | jq '.' + code=$(echo "$response" | jq -r '.code') + + if [ "$code" == "200" ]; then + print_success "新增实体中介成功" + # 保存socialCreditCode用于后续测试 + ENTITY_CREDIT_CODE="91110000123456789X" + echo "实体中介统一社会信用代码: $ENTITY_CREDIT_CODE" + else + print_error "新增实体中介失败: $(echo "$response" | jq -r '.msg')" + fi +} + +# 测试查询个人中介详情 +test_get_person_detail() { + print_section "测试查询个人中介详情" + + if [ -z "$PERSON_BIZ_ID" ]; then + print_error "没有可用的个人中介bizId,跳过测试" + return + fi + + response=$(curl -s -X GET "${BASE_URL}/ccdi/intermediary/person/${PERSON_BIZ_ID}" \ + -H "Authorization: Bearer $TOKEN") + + echo "$response" | jq '.' + code=$(echo "$response" | jq -r '.code') + + if [ "$code" == "200" ]; then + print_success "查询个人中介详情成功" + else + print_error "查询个人中介详情失败: $(echo "$response" | jq -r '.msg')" + fi +} + +# 测试查询实体中介详情 +test_get_entity_detail() { + print_section "测试查询实体中介详情" + + if [ -z "$ENTITY_CREDIT_CODE" ]; then + print_error "没有可用的实体中介统一社会信用代码,跳过测试" + return + fi + + response=$(curl -s -X GET "${BASE_URL}/ccdi/intermediary/entity/${ENTITY_CREDIT_CODE}" \ + -H "Authorization: Bearer $TOKEN") + + echo "$response" | jq '.' + code=$(echo "$response" | jq -r '.code') + + if [ "$code" == "200" ]; then + print_success "查询实体中介详情成功" + else + print_error "查询实体中介详情失败: $(echo "$response" | jq -r '.msg')" + fi +} + +# 测试校验人员ID唯一性 +test_check_person_id() { + print_section "测试校验人员ID唯一性" + + response=$(curl -s -X GET "${BASE_URL}/ccdi/intermediary/checkPersonIdUnique?personId=110101199001019999" \ + -H "Authorization: Bearer $TOKEN") + + echo "$response" | jq '.' + code=$(echo "$response" | jq -r '.code') + + if [ "$code" == "200" ]; then + unique=$(echo "$response" | jq -r '.data') + print_success "校验人员ID唯一性成功, unique=$unique" + else + print_error "校验人员ID唯一性失败" + fi +} + +# 测试校验统一社会信用代码唯一性 +test_check_social_credit_code() { + print_section "测试校验统一社会信用代码唯一性" + + response=$(curl -s -X GET "${BASE_URL}/ccdi/intermediary/checkSocialCreditCodeUnique?socialCreditCode=91110000123456789X" \ + -H "Authorization: Bearer $TOKEN") + + echo "$response" | jq '.' + code=$(echo "$response" | jq -r '.code') + + if [ "$code" == "200" ]; then + unique=$(echo "$response" | jq -r '.data') + print_success "校验统一社会信用代码唯一性成功, unique=$unique" + else + print_error "校验统一社会信用代码唯一性失败" + fi +} + +# 测试修改个人中介 +test_edit_person() { + print_section "测试修改个人中介" + + if [ -z "$PERSON_BIZ_ID" ]; then + print_error "没有可用的个人中介bizId,跳过测试" + return + fi + + response=$(curl -s -X PUT "${BASE_URL}/ccdi/intermediary/person" \ + -H "Authorization: Bearer $TOKEN" \ + -H "Content-Type: application/json" \ + -d "{ + \"bizId\": \"$PERSON_BIZ_ID\", + \"name\": \"测试中介个人(已修改)\", + \"personType\": \"中介\", + \"gender\": \"M\", + \"idType\": \"身份证\", + \"personId\": \"110101199001019999\", + \"mobile\": \"13900139000\", + \"company\": \"新公司\", + \"position\": \"高级经纪人\", + \"remark\": \"修改后的测试数据\" + }") + + echo "$response" | jq '.' + code=$(echo "$response" | jq -r '.code') + + if [ "$code" == "200" ]; then + print_success "修改个人中介成功" + else + print_error "修改个人中介失败: $(echo "$response" | jq -r '.msg')" + fi +} + +# 测试修改实体中介 +test_edit_entity() { + print_section "测试修改实体中介" + + if [ -z "$ENTITY_CREDIT_CODE" ]; then + print_error "没有可用的实体中介统一社会信用代码,跳过测试" + return + fi + + response=$(curl -s -X PUT "${BASE_URL}/ccdi/intermediary/entity" \ + -H "Authorization: Bearer $TOKEN" \ + -H "Content-Type: application/json" \ + -d "{ + \"socialCreditCode\": \"$ENTITY_CREDIT_CODE\", + \"enterpriseName\": \"测试中介公司(已修改)\", + \"enterpriseType\": \"股份有限公司\", + \"enterpriseNature\": \"国企\", + \"industryClass\": \"金融\", + \"industryName\": \"金融业\", + \"registerAddress\": \"北京市海淀区新地址\", + \"legalRepresentative\": \"李四\", + \"shareholder1\": \"赵六\", + \"shareholder2\": \"钱七\", + \"remark\": \"修改后的测试数据\" + }") + + echo "$response" | jq '.' + code=$(echo "$response" | jq -r '.code') + + if [ "$code" == "200" ]; then + print_success "修改实体中介成功" + else + print_error "修改实体中介失败: $(echo "$response" | jq -r '.msg')" + fi +} + +# 测试条件查询 +test_query_by_type() { + print_section "测试按中介类型查询" + + # 查询个人中介 + print_section "查询个人中介" + response=$(curl -s -X GET "${BASE_URL}/ccdi/intermediary/list?intermediaryType=1&pageNum=1&pageSize=10" \ + -H "Authorization: Bearer $TOKEN") + + echo "$response" | jq '.' + total=$(echo "$response" | jq -r '.total') + print_success "查询到个人中介 $total 条" + + # 查询实体中介 + print_section "查询实体中介" + response=$(curl -s -X GET "${BASE_URL}/ccdi/intermediary/list?intermediaryType=2&pageNum=1&pageSize=10" \ + -H "Authorization: Bearer $TOKEN") + + echo "$response" | jq '.' + total=$(echo "$response" | jq -r '.total') + print_success "查询到实体中介 $total 条" +} + +# 主函数 +main() { + print_header "中介黑名单管理 API 测试开始" + + # 检查jq命令 + if ! command -v jq &> /dev/null; then + print_error "jq命令未安装,请先安装: apt-get install jq 或 yum install jq" + exit 1 + fi + + # 获取Token + get_token + + # 执行测试 + test_list + test_add_person + test_add_entity + test_get_person_detail + test_get_entity_detail + test_check_person_id + test_check_social_credit_code + test_edit_person + test_edit_entity + test_query_by_type + + print_header "测试完成" + echo "" + echo "注意事项:" + echo "1. 请确保后端服务已启动 (${BASE_URL})" + echo "2. 测试数据已创建,可手动清理" + echo "3. 如需删除测试数据,请使用清理脚本" + echo "" +} + +# 执行主函数 +main diff --git a/doc/test/intermediary-blacklist-test-report.md b/doc/test/intermediary-blacklist-test-report.md new file mode 100644 index 0000000..03accf9 --- /dev/null +++ b/doc/test/intermediary-blacklist-test-report.md @@ -0,0 +1,286 @@ +# 中介黑名单管理模块测试报告 + +## 测试概要 + +| 项目 | 内容 | +|------|------| +| 测试模块 | 中介黑名单管理 | +| 测试版本 | v2.0 | +| 测试日期 | 2026-02-04 | +| 测试人员 | [测试人员姓名] | +| 测试环境 | 开发环境 | +| 后端地址 | http://localhost:8080 | +| 前端地址 | http://localhost | + +--- + +## 测试环境信息 + +### 后端环境 +- **框架**: Spring Boot 3.5.8 +- **JDK版本**: Java 17 +- **数据库**: MySQL 8.2.0 +- **ORM框架**: MyBatis Plus 3.5.10 +- **API文档**: Swagger UI (http://localhost:8080/swagger-ui/index.html) + +### 前端环境 +- **框架**: Vue 2.6.12 +- **UI库**: Element UI 2.15.14 +- **构建工具**: npm/yarn + +### 测试账号 +- **用户名**: admin +- **密码**: admin123 +- **角色**: 管理员 + +--- + +## 测试用例执行情况 + +### 1. 列表查询测试 + +#### 1.1 基础列表查询 + +| 测试项 | 测试步骤 | 预期结果 | 实际结果 | 测试状态 | +|--------|---------|---------|---------|---------| +| 查询所有中介 | GET /ccdi/intermediary/list | 返回分页数据列表 | | ⬜ 通过 / ❌ 失败 | +| 分页查询 | pageNum=1, pageSize=10 | 返回第一页10条数据 | | ⬜ 通过 / ❌ 失败 | + +#### 1.2 条件查询 + +| 测试项 | 测试步骤 | 预期结果 | 实际结果 | 测试状态 | +|--------|---------|---------|---------|---------| +| 按姓名查询 | name=张三 | 返回姓名包含"张三"的数据 | | ⬜ 通过 / ❌ 失败 | +| 按证件号查询 | certificateNo=110101... | 返回证件号匹配的数据 | | ⬜ 通过 / ❌ 失败 | +| 按中介类型查询 | intermediaryType=1 | 返回个人中介数据 | | ⬜ 通过 / ❌ 失败 | +| 按中介类型查询 | intermediaryType=2 | 返回实体中介数据 | | ⬜ 通过 / ❌ 失败 | +| 组合条件查询 | 多个条件组合 | 返回符合所有条件的数据 | | ⬜ 通过 / ❌ 失败 | + +### 2. 个人中介管理测试 + +#### 2.1 新增个人中介 + +| 测试项 | 测试步骤 | 预期结果 | 实际结果 | 测试状态 | +|--------|---------|---------|---------|---------| +| 正常新增 | POST /ccdi/intermediary/person | 返回成功,数据保存 | | ⬜ 通过 / ❌ 失败 | +| 姓名为空 | name="" | 提示"姓名不能为空" | | ⬜ 通过 / ❌ 失败 | +| 证件号为空 | personId="" | 提示"证件号码不能为空" | | ⬜ 通过 / ❌ 失败 | +| 姓名超长 | name=101个字符 | 提示"姓名长度不能超过100个字符" | | ⬜ 通过 / ❌ 失败 | +| 证件号超长 | personId=51个字符 | 提示"证件号码长度不能超过50个字符" | | ⬜ 通过 / ❌ 失败 | +| 证件号重复 | 使用已存在的personId | 提示"该证件号已存在" | | ⬜ 通过 / ❌ 失败 | + +#### 2.2 查询个人中介详情 + +| 测试项 | 测试步骤 | 预期结果 | 实际结果 | 测试状态 | +|--------|---------|---------|---------|---------| +| 正常查询 | GET /ccdi/intermediary/person/{bizId} | 返回完整的个人中介详情 | | ⬜ 通过 / ❌ 失败 | +| bizId不存在 | 使用不存在的bizId | 返回空数据或提示 | | ⬜ 通过 / ❌ 失败 | + +#### 2.3 修改个人中介 + +| 测试项 | 测试步骤 | 预期结果 | 实际结果 | 测试状态 | +|--------|---------|---------|---------|---------| +| 正常修改 | PUT /ccdi/intermediary/person | 返回成功,数据更新 | | ⬜ 通过 / ❌ 失败 | +| 修改为重复证件号 | personId改为已存在的值 | 提示"该证件号已存在" | | ⬜ 通过 / ❌ 失败 | +| 姓名为空 | name="" | 提示"姓名不能为空" | | ⬜ 通过 / ❌ 失败 | + +### 3. 实体中介管理测试 + +#### 3.1 新增实体中介 + +| 测试项 | 测试步骤 | 预期结果 | 实际结果 | 测试状态 | +|--------|---------|---------|---------|---------| +| 正常新增 | POST /ccdi/intermediary/entity | 返回成功,数据保存 | | ⬜ 通过 / ❌ 失败 | +| 机构名称为空 | enterpriseName="" | 提示"机构名称不能为空" | | ⬜ 通过 / ❌ 失败 | +| 机构名称超长 | enterpriseName=201个字符 | 提示"机构名称长度不能超过200个字符" | | ⬜ 通过 / ❌ 失败 | +| 统一社会信用代码重复 | 使用已存在的socialCreditCode | 提示"该统一社会信用代码已存在" | | ⬜ 通过 / ❌ 失败 | + +#### 3.2 查询实体中介详情 + +| 测试项 | 测试步骤 | 预期结果 | 实际结果 | 测试状态 | +|--------|---------|---------|---------|---------| +| 正常查询 | GET /ccdi/intermediary/entity/{socialCreditCode} | 返回完整的实体中介详情 | | ⬜ 通过 / ❌ 失败 | +| socialCreditCode不存在 | 使用不存在的代码 | 返回空数据或提示 | | ⬜ 通过 / ❌ 失败 | + +#### 3.3 修改实体中介 + +| 测试项 | 测试步骤 | 预期结果 | 实际结果 | 测试状态 | +|--------|---------|---------|---------|---------| +| 正常修改 | PUT /ccdi/intermediary/entity | 返回成功,数据更新 | | ⬜ 通过 / ❌ 失败 | +| 修改为重复信用代码 | socialCreditCode改为已存在的值 | 提示"该统一社会信用代码已存在" | | ⬜ 通过 / ❌ 失败 | +| 机构名称为空 | enterpriseName="" | 提示"机构名称不能为空" | | ⬜ 通过 / ❌ 失败 | + +### 4. 唯一性校验测试 + +| 测试项 | 测试步骤 | 预期结果 | 实际结果 | 测试状态 | +|--------|---------|---------|---------|---------| +| 校验人员ID唯一性 | GET /checkPersonIdUnique | 返回true/false | | ⬜ 通过 / ❌ 失败 | +| 校验统一社会信用代码唯一性 | GET /checkSocialCreditCodeUnique | 返回true/false | | ⬜ 通过 / ❌ 失败 | + +### 5. 删除测试 + +| 测试项 | 测试步骤 | 预期结果 | 实际结果 | 测试状态 | +|--------|---------|---------|---------|---------| +| 删除单条记录 | DELETE /ccdi/intermediary/{id} | 返回成功,数据删除 | | ⬜ 通过 / ❌ 失败 | +| 批量删除 | DELETE /ccdi/intermediary/{id1,id2} | 返回成功,多条数据删除 | | ⬜ 通过 / ❌ 失败 | +| 删除不存在的记录 | DELETE /ccdi/intermediary/{不存在的id} | 返回成功或提示 | | ⬜ 通过 / ❌ 失败 | + +### 6. 导入导出测试 + +#### 6.1 模板下载 + +| 测试项 | 测试步骤 | 预期结果 | 实际结果 | 测试状态 | +|--------|---------|---------|---------|---------| +| 下载个人中介模板 | POST /importPersonTemplate | 下载Excel模板,包含下拉框 | | ⬜ 通过 / ❌ 失败 | +| 下载实体中介模板 | POST /importEntityTemplate | 下载Excel模板,包含下拉框 | | ⬜ 通过 / ❌ 失败 | + +#### 6.2 数据导入 + +| 测试项 | 测试步骤 | 预期结果 | 实际结果 | 测试状态 | +|--------|---------|---------|---------|---------| +| 导入个人中介数据 | POST /importPersonData | 返回导入成功条数 | | ⬜ 通过 / ❌ 失败 | +| 导入实体中介数据 | POST /importEntityData | 返回导入成功条数 | | ⬜ 通过 / ❌ 失败 | +| 导入空数据 | 上传空Excel | 提示"没有数据" | | ⬜ 通过 / ❌ 失败 | +| 导入格式错误数据 | 上传格式错误的Excel | 提示格式错误 | | ⬜ 通过 / ❌ 失败 | +| 导入必填字段为空 | 上传姓名为空的Excel | 提示"姓名不能为空" | | ⬜ 通过 / ❌ 失败 | +| 更新已存在数据 | updateSupport=true | 更新已存在的记录 | | ⬜ 通过 / ❌ 失败 | +| 不更新已存在数据 | updateSupport=false | 跳过已存在的记录 | | ⬜ 通过 / ❌ 失败 | + +#### 6.3 数据导出 + +| 测试项 | 测试步骤 | 预期结果 | 实际结果 | 测试状态 | +|--------|---------|---------|---------|---------| +| 导出全部数据 | POST /export | 下载包含所有数据的Excel | | ⬜ 通过 / ❌ 失败 | +| 按条件导出 | 带查询条件导出 | 下载符合条件的数据Excel | | ⬜ 通过 / ❌ 失败 | + +### 7. 权限测试 + +| 测试项 | 测试步骤 | 预期结果 | 实际结果 | 测试状态 | +|--------|---------|---------|---------|---------| +| 无权限访问列表 | 无ccdi:intermediary:list权限 | 返回403或提示无权限 | | ⬜ 通过 / ❌ 失败 | +| 无权限新增 | 无ccdi:intermediary:add权限 | 返回403或提示无权限 | | ⬜ 通过 / ❌ 失败 | +| 无权限修改 | 无ccdi:intermediary:edit权限 | 返回403或提示无权限 | | ⬜ 通过 / ❌ 失败 | +| 无权限删除 | 无ccdi:intermediary:remove权限 | 返回403或提示无权限 | | ⬜ 通过 / ❌ 失败 | +| 无权限导出 | 无ccdi:intermediary:export权限 | 返回403或提示无权限 | | ⬜ 通过 / ❌ 失败 | +| 无权限导入 | 无ccdi:intermediary:import权限 | 返回403或提示无权限 | | ⬜ 通过 / ❌ 失败 | + +--- + +## 测试结果统计 + +### 测试用例统计 + +| 类别 | 总数 | 通过 | 失败 | 通过率 | +|------|------|------|------|--------| +| 列表查询 | 7 | 0 | 0 | 0% | +| 个人中介管理 | 8 | 0 | 0 | 0% | +| 实体中介管理 | 7 | 0 | 0 | 0% | +| 唯一性校验 | 2 | 0 | 0 | 0% | +| 删除功能 | 3 | 0 | 0 | 0% | +| 导入导出 | 11 | 0 | 0 | 0% | +| 权限控制 | 6 | 0 | 0 | 0% | +| **合计** | **44** | **0** | **0** | **0%** | + +### 缺陷统计 + +| 严重程度 | 数量 | 缺陷列表 | +|---------|------|---------| +| 严重 | 0 | | +| 重要 | 0 | | +| 一般 | 0 | | +| 轻微 | 0 | | +| **合计** | **0** | | + +--- + +## 测试结论 + +### 整体评价 + +[待填写] + +### 主要功能点测试结果 + +| 功能模块 | 测试结果 | 备注 | +|---------|---------|------| +| 列表查询 | | | +| 个人中介CRUD | | | +| 实体中介CRUD | | | +| 唯一性校验 | | | +| 导入导出 | | | +| 权限控制 | | | + +### 发现的问题 + +#### 1. [问题标题] +- **问题描述**: [详细描述问题] +- **严重程度**: [严重/重要/一般/轻微] +- **复现步骤**: + 1. [步骤1] + 2. [步骤2] + 3. [步骤3] +- **预期结果**: [预期结果] +- **实际结果**: [实际结果] +- **附件**: [截图或日志] + +#### 2. [问题标题] +... + +### 改进建议 + +1. [建议1] +2. [建议2] +3. [建议3] + +--- + +## 测试附件 + +### 测试数据 + +| 数据类型 | 数据内容 | +|---------|---------| +| 测试个人中介bizId | [填写] | +| 测试实体中介信用代码 | [填写] | +| 测试证件号 | [填写] | + +### 测试日志 + +```bash +# 测试脚本输出日志 +[粘贴测试脚本的完整输出] +``` + +### 测试截图 + +- 图1: 列表查询成功截图 +- 图2: 新增个人中介成功截图 +- 图3: 新增实体中介成功截图 +- 图4: 修改中介成功截图 +- 图5: 删除中介成功截图 +- 图6: 导入数据成功截图 +- 图7: 导出数据成功截图 + +--- + +## 签名 + +| 角色 | 姓名 | 签名 | 日期 | +|------|------|------|------| +| 测试人员 | | | | +| 开发负责人 | | | | +| 产品负责人 | | | | + +--- + +## 备注 + +1. 本测试报告基于中介黑名单管理模块v2.0版本 +2. 测试环境为开发环境,生产环境部署前需再次测试 +3. 所有测试用例均使用自动化测试脚本执行,可复现 +4. 测试数据可在测试完成后清理 + +--- + +**报告生成时间**: [填写] +**报告版本**: v1.0 diff --git a/sql/menu-intermediary.sql b/sql/menu-intermediary.sql new file mode 100644 index 0000000..9a3cee3 --- /dev/null +++ b/sql/menu-intermediary.sql @@ -0,0 +1,246 @@ +-- ===================================================== +-- 中介黑名单管理菜单SQL +-- 功能: 为中介黑名单管理模块创建菜单和权限配置 +-- 版本: 2.0 +-- 日期: 2026-02-04 +-- ===================================================== + +-- 1. 创建主菜单 (中介黑名单) +-- 父级菜单: 2000 (业务管理, 请根据实际情况调整) +-- 菜单类型: M (目录) +INSERT INTO sys_menu (menu_name, parent_id, order_num, path, component, query, perms, icon, menu_type, status, visible, create_by, create_time, update_by, update_time, remark) +VALUES ( + '中介黑名单', + 2000, + 5, + 'intermediary', + NULL, + NULL, + NULL, + 'peoples', + 'M', + '0', + '0', + 'admin', + NOW(), + '', + NULL, + '中介黑名单管理目录' +); + +-- 获取刚插入的菜单ID +SET @menu_id = LAST_INSERT_ID(); + +-- 2. 创建子菜单 (中介黑名单管理) +-- 菜单类型: C (菜单) +INSERT INTO sys_menu (menu_name, parent_id, order_num, path, component, query, perms, icon, menu_type, status, visible, create_by, create_time, update_by, update_time, remark) +VALUES ( + '中介管理', + @menu_id, + 1, + 'intermediaryIndex', + 'ccdi/intermediary/index', + NULL, + NULL, + 'user', + 'C', + '0', + '0', + 'admin', + NOW(), + '', + NULL, + '中介黑名单管理菜单' +); + +SET @intermediary_menu_id = LAST_INSERT_ID(); + +-- 3. 创建按钮权限 +-- 查询权限 +INSERT INTO sys_menu (menu_name, parent_id, order_num, path, component, query, perms, icon, menu_type, status, visible, create_by, create_time, update_by, update_time, remark) +VALUES ( + '中介查询', + @intermediary_menu_id, + 1, + '', + NULL, + NULL, + 'ccdi:intermediary:query', + '#', + 'F', + '0', + '0', + 'admin', + NOW(), + '', + NULL, + '' +); + +-- 列表权限 +INSERT INTO sys_menu (menu_name, parent_id, order_num, path, component, query, perms, icon, menu_type, status, visible, create_by, create_time, update_by, update_time, remark) +VALUES ( + '中介列表', + @intermediary_menu_id, + 2, + '', + NULL, + NULL, + 'ccdi:intermediary:list', + '#', + 'F', + '0', + '0', + 'admin', + NOW(), + '', + NULL, + '' +); + +-- 新增权限 +INSERT INTO sys_menu (menu_name, parent_id, order_num, path, component, query, perms, icon, menu_type, status, visible, create_by, create_time, update_by, update_time, remark) +VALUES ( + '中介新增', + @intermediary_menu_id, + 3, + '', + NULL, + NULL, + 'ccdi:intermediary:add', + '#', + 'F', + '0', + '0', + 'admin', + NOW(), + '', + NULL, + '' +); + +-- 修改权限 +INSERT INTO sys_menu (menu_name, parent_id, order_num, path, component, query, perms, icon, menu_type, status, visible, create_by, create_time, update_by, update_time, remark) +VALUES ( + '中介修改', + @intermediary_menu_id, + 4, + '', + NULL, + NULL, + 'ccdi:intermediary:edit', + '#', + 'F', + '0', + '0', + 'admin', + NOW(), + '', + NULL, + '' +); + +-- 删除权限 +INSERT INTO sys_menu (menu_name, parent_id, order_num, path, component, query, perms, icon, menu_type, status, visible, create_by, create_time, update_by, update_time, remark) +VALUES ( + '中介删除', + @intermediary_menu_id, + 5, + '', + NULL, + NULL, + 'ccdi:intermediary:remove', + '#', + 'F', + '0', + '0', + 'admin', + NOW(), + '', + NULL, + '' +); + +-- 导出权限 +INSERT INTO sys_menu (menu_name, parent_id, order_num, path, component, query, perms, icon, menu_type, status, visible, create_by, create_time, update_by, update_time, remark) +VALUES ( + '中介导出', + @intermediary_menu_id, + 6, + '', + NULL, + NULL, + 'ccdi:intermediary:export', + '#', + 'F', + '0', + '0', + 'admin', + NOW(), + '', + NULL, + '' +); + +-- 导入权限 +INSERT INTO sys_menu (menu_name, parent_id, order_num, path, component, query, perms, icon, menu_type, status, visible, create_by, create_time, update_by, update_time, remark) +VALUES ( + '中介导入', + @intermediary_menu_id, + 7, + '', + NULL, + NULL, + 'ccdi:intermediary:import', + '#', + 'F', + '0', + '0', + 'admin', + NOW(), + '', + NULL, + '' +); + +-- ===================================================== +-- 说明: +-- 1. 本SQL创建了完整的菜单结构: +-- - 一级菜单: 中介黑名单 (目录) +-- - 二级菜单: 中介管理 (菜单页面) +-- - 三级菜单: 各种按钮权限 +-- +-- 2. 权限标识: +-- - ccdi:intermediary:query (查询) +-- - ccdi:intermediary:list (列表) +-- - ccdi:intermediary:add (新增) +-- - ccdi:intermediary:edit (修改) +-- - ccdi:intermediary:remove (删除) +-- - ccdi:intermediary:export (导出) +-- - ccdi:intermediary:import (导入) +-- +-- 3. 使用说明: +-- - 执行本SQL后,需要在角色管理中为相应角色分配权限 +-- - 建议为admin角色分配所有权限 +-- - 前端路由会根据权限自动显示菜单 +-- +-- 4. 注意事项: +-- - parent_id=2000 是业务管理的父级菜单,请根据实际情况调整 +-- - 组件路径 'ccdi/intermediary/index' 需要与前端Vue组件路径一致 +-- - 如果父级菜单不存在,需要先创建父级菜单或修改parent_id +-- ===================================================== + +-- 查询创建的菜单 (用于验证) +SELECT + menu_id AS '菜单ID', + menu_name AS '菜单名称', + parent_id AS '父级菜单ID', + order_num AS '显示顺序', + perms AS '权限标识', + menu_type AS '菜单类型', + status AS '状态', + visible AS '可见', + create_time AS '创建时间' +FROM sys_menu +WHERE menu_name LIKE '%中介%' OR perms LIKE '%intermediary%' +ORDER BY parent_id, order_num;