# 角色字段统一方案总结 ## 📋 概述 为了提高代码可读性和语义清晰度,我们将商城系统中的用户角色字段从 `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` 中的回滚脚本 --- **总结**:角色字段统一方案提供了更清晰、更语义化的用户角色管理,同时保持了完整的向后兼容性和迁移安全性。