# 角色字段统一方案总结

## 📋 概述

为了提高代码可读性和语义清晰度，我们将商城系统中的用户角色字段从 `user_type` (INTEGER) 统一为 `role` (TEXT)。

## 🔄 修改内容

### 1. 字段类型变更

#### 原始设计 (已废弃)
```sql
-- ml_user_profiles 表
user_type INTEGER DEFAULT 1 NOT NULL
-- 约束：CHECK (user_type IN (1,2,3,4,5))
-- 1:消费者 2:商家 3:配送员 4:客服 5:管理员
```

#### 新设计 (当前版本)
```sql
-- ml_user_profiles 表 + ak_users 表
role TEXT DEFAULT 'customer' NOT NULL
-- 约束：CHECK (role IN ('customer', 'merchant', 'delivery', 'service', 'admin'))
-- customer:消费者, merchant:商家, delivery:配送员, service:客服, admin:管理员
```

### 2. 数据映射关系

| 旧 user_type (INTEGER) | 新 role (TEXT) | 中文含义 |
|------------------------|----------------|----------|
| 1                      | customer       | 消费者   |
| 2                      | merchant       | 商家     |
| 3                      | delivery       | 配送员   |
| 4                      | service        | 客服     |
| 5                      | admin          | 管理员   |

### 3. 统一后的优势

1. **语义清晰**：`role` 比 `user_type` 更符合业务语义
2. **代码可读**：字符串值比数字更易理解
3. **扩展性好**：便于添加新角色类型
4. **国际化友好**：角色名称可直接用于多语言映射
5. **API友好**：前端可直接使用角色字符串

## 📁 相关文件

### 核心数据库文件
- ✅ `complete_mall_database.sql` - 主数据库结构（已更新）
- ✅ `mock_data_insert.sql` - 测试数据插入（已更新）

### 迁移脚本
- 🆕 `quick_role_migration.sql` - 快速迁移脚本（推荐）
- 🆕 `role_field_unification.sql` - 完整统一方案

### 其他升级脚本（自动兼容）
- ✅ `mall_alter_upgrade.sql` - 增量升级脚本
- ✅ `mall_fields_only_upgrade.sql` - 字段升级脚本
- ✅ `mall_migration.sql` - 完整迁移脚本
- ✅ `mall_seo_security.sql` - SEO和安全脚本

### 文档
- ✅ `UPGRADE_GUIDE.md` - 升级指南（已更新）

## 🚀 执行步骤

### 对于新项目
直接使用最新的 `complete_mall_database.sql`，已包含 `role` 字段设计。

### 对于现有项目
如果您的数据库中存在 `user_type` 字段，请按以下步骤升级：

#### 步骤 1：数据备份
```bash
pg_dump your_database > backup_before_role_migration.sql
```

#### 步骤 2：执行快速迁移
```bash
psql -d your_database -f quick_role_migration.sql
```

#### 步骤 3：验证迁移结果
```sql
-- 检查角色分布
SELECT role, COUNT(*) as count 
FROM ml_user_profiles 
GROUP BY role;

-- 检查数据一致性
SELECT COUNT(*) as inconsistent_records
FROM ak_users u
JOIN ml_user_profiles p ON u.id = p.user_id
WHERE u.role != p.role;
```

#### 步骤 4：（可选）清理旧字段
迁移成功并确认无误后，可删除旧的 `user_type` 字段：
```sql
ALTER TABLE ml_user_profiles DROP COLUMN user_type;
```

## 🔧 技术细节

### 更新的数据库对象

1. **表结构**
   - `ml_user_profiles.role` - 新增字段
   - `ak_users.role` - 与之保持同步

2. **约束**
   - `chk_ml_user_role` - 角色值约束
   - 移除：`chk_ml_user_type`

3. **索引**
   - `idx_ml_user_profiles_role` - 角色字段索引
   - 移除：`idx_ml_user_profiles_type`

4. **函数**
   - `is_verified_merchant()` - 商家验证函数
   - `get_user_role()` - 获取用户角色
   - `check_user_permission()` - 权限检查
   - `upgrade_user_role()` - 角色升级

5. **视图**
   - `ml_users_view` - 用户信息视图
   - `vw_user_info` - 用户完整信息视图
   - `vw_role_statistics` - 角色统计视图

6. **RLS策略**
   - 所有涉及角色检查的策略已更新

### 兼容性说明

- ✅ **向前兼容**：新脚本可在空数据库上运行
- ✅ **向后兼容**：提供完整回滚方案
- ✅ **增量升级**：支持现有数据的平滑迁移
- ✅ **Supabase兼容**：完全支持Supabase环境

## 🔍 测试验证

### 测试用例
```sql
-- 1. 测试角色约束
INSERT INTO ml_user_profiles (user_id, role) 
VALUES (uuid_generate_v4(), 'invalid_role'); -- 应该失败

-- 2. 测试函数
SELECT get_user_role('user-uuid-here');
SELECT check_user_permission('user-uuid-here', ARRAY['admin', 'merchant']);

-- 3. 测试视图
SELECT * FROM vw_role_statistics;
SELECT * FROM ml_users_view WHERE role = 'merchant';
```

### 性能影响
- 角色查询性能：通过 `idx_ml_user_profiles_role` 索引优化
- 存储开销：TEXT字段比INTEGER稍大，但差异微小
- 查询兼容：所有现有查询逻辑已更新

## 📞 支持

如果在角色字段迁移过程中遇到问题，请：

1. 检查错误日志
2. 确认数据备份完整
3. 运行 `mall_database_check.sql` 诊断问题
4. 如需回滚，使用 `quick_role_migration.sql` 中的回滚脚本

---

**总结**：角色字段统一方案提供了更清晰、更语义化的用户角色管理，同时保持了完整的向后兼容性和迁移安全性。
