# 账号管理 — 技术方案

> **依据：** 《账号管理功能需求.md》v1.1  
> **范围：** 平台管理端全平台 `sys_user` 账号列表/详情/改资料/改密/删除；复用 `biz_merchant_account` 识别商户管理员。  
> **原则：** 与店铺账号管理 **共用** `IAccountProfileService`；**不提供** POST 开户。

---

## 1. 技术架构

| 项 | 选型 |
|----|------|
| 基础框架 | RuoYi v3.9.2（springboot2） |
| 数据库 | MySQL 5.7.39 |
| 响应 | `AjaxResult` / `TableDataInfo`（code、msg、data/rows） |

### 1.1 模块落位（命名规范）

```text
com.ruoyi.web.modules.account/
├── controller/AccountManageController.java      # /agri/accountManage
├── service/IAccountManageService.java
├── service/impl/AccountManageServiceImpl.java
├── service/IAccountProfileService.java          # 与店铺模块共用写操作
├── service/impl/AccountProfileServiceImpl.java
├── support/AccountManageSupport.java
├── constant/AccountManageConstants.java
├── domain/AccountManageQuery.java
├── domain/AccountManageRow.java
├── dto/AccountProfileUpdateDTO.java
├── dto/AccountPasswordUpdateDTO.java
├── vo/AccountManageListVO.java
├── vo/AccountManageDetailVO.java
└── mapper/AccountManageMapper.java

resources/mapper/account/AccountManageMapper.xml
sql/agri_account_manage_menu.sql
```

### 1.2 菜单与权限

| 项 | 值 |
|----|-----|
| 路由 | `/agri/accountManage` |
| 权限前缀 | `agri:accountManage` |
| 前端组件 | `agri/accountManage/index`（本期不改前端） |

---

## 2. 数据库与列表 SQL

**无新建表。** 列表以 `sys_user` 为主表：

```sql
SELECT u.user_id, u.nick_name, u.user_name, u.phonenumber, u.email, u.create_time,
       a.merchant_id,
       CASE WHEN a.account_id IS NOT NULL
            THEN (SELECT COUNT(1) FROM biz_shop s
                   WHERE s.merchant_id = a.merchant_id AND s.del_flag = '0')
            ELSE NULL END AS shop_count
FROM sys_user u
LEFT JOIN biz_merchant_account a
       ON u.user_id = a.account_id AND a.del_flag = '0' AND a.shop_id IS NULL
WHERE u.del_flag = '0'
  AND (u.nick_name LIKE #{accountName})   -- 可选
ORDER BY u.create_time DESC
```

---

## 3. 接口设计

**基路径：** `/agri/accountManage`

| 方法 | 路径 | 权限 | 说明 |
|------|------|------|------|
| GET | `/list` | list | 分页列表；Query: `accountName` |
| GET | `/{userId}` | query | 详情（手机号完整） |
| PUT | `/` | edit | 修改资料 |
| PUT | `/resetPwd` | resetPwd | 修改密码 |
| DELETE | `/{userIds}` | remove | 删除（逗号分隔批量） |

### 3.1 列表 VO（AccountManageListVO）

| 字段 | 说明 |
|------|------|
| userId | sys_user.user_id |
| accountName | nick_name 优先 |
| mobile | 脱敏 |
| email | |
| shopCount | **Integer，可为 null** |
| createTime | |

### 3.2 修改资料（AccountProfileUpdateDTO）

| 字段 | 说明 |
|------|------|
| userId | 必填 |
| accountName | → nick_name |
| mobile | 11 位 |
| email | 选填 |
| confirm | 商户管理员改手机号时二次确认 |

**商户管理员：** 改 mobile 更新 `user_name` + `phonenumber`；改前 `needConfirm`。  
**其他账号：** 改 mobile 仅更新 `phonenumber`。

### 3.3 删除

- 商户管理员：`logicDeleteByUserId`（绑定 del_flag=2），前置 shopCount=0；
- 其他：`sysUserMapper.deleteUserById`；
- 不可删 self、userId=1。

### 3.4 店铺模块协作

`ShopServiceImpl.updateMerchantAccount` 委托 `IAccountProfileService`，字段映射：

| 店铺 DTO | AccountProfileUpdateDTO |
|----------|-------------------------|
| adminName | accountName |
| loginName | mobile |
| confirm | confirm |

---

## 4. BizMerchantAccountMapper 扩展

| 方法 | 说明 |
|------|------|
| selectMerchantAdminByUserId | 按 userId 查商户管理员绑定 |
| updateSysUserProfile | 含 email、phonenumber |
| logicDeleteByUserId | 逻辑删绑定 |

---

## 5. 权限 SQL

见 `sql/agri_account_manage_menu.sql`：`agri:accountManage:list|query|edit|resetPwd|remove`。

---

## 6. 修订记录

| 版本 | 说明 |
|------|------|
| v1.0 | 仅商户管理员，`/agri/merchantAccount` |
| **v1.1** | 全平台 sys_user；规范命名 `AccountManage*`；路由 `/agri/accountManage` |

---

*文档版本：v1.1 · RuoYi v3.9.2-springboot2 · MySQL 5.7.39*
