# 店铺级角色继承功能提案 ## Why 当前系统的角色分配是账号级别的,平台需要为每个代理店铺的每个账号逐一分配角色。在 MVP 阶段,一个店铺内的所有账号权限通常是一致的(如 10 个员工都是"代理店长"角色),逐个分配造成了不必要的操作负担。本变更通过引入店铺级角色继承机制,允许平台在店铺层面设置默认角色,该店铺下所有账号自动继承,同时保留账号级覆盖能力以支持未来的权限差异化需求。 ## What Changes - **新增店铺级角色管理功能**:平台可为代理店铺设置默认角色,该店铺下所有账号自动继承 - **账号级角色覆盖机制**:特殊账号可单独设置角色,覆盖店铺默认角色 - **角色解析逻辑升级**:权限检查时优先查找账号级角色,如无则继承店铺级角色 - **新增数据库表**:`tb_shop_role` 用于存储店铺-角色关联关系 - **新增 API 接口**:`POST/GET/DELETE /api/admin/shops/:id/roles` 用于管理店铺角色 - **适用范围限定**:仅适用于代理账号(UserType=3),企业账号和平台账号保持现状(账号级角色) ## Capabilities ### New Capabilities - `shop-role-management`: 店铺级角色管理能力,包括为店铺分配角色、查询店铺角色、删除店铺角色等功能 ### Modified Capabilities - `rbac-permission-check`: 角色权限检查能力需要修改,增加店铺级角色继承逻辑,权限解析时需要支持"账号角色优先,无则继承店铺角色"的规则 ## Impact ### 数据库层 - **新增表**:`tb_shop_role`(店铺-角色关联表) - **保留表**:`tb_account_role`(向后兼容) ### 代码模块 - **新增**: - `internal/model/shop_role.go`(ShopRole 模型) - `internal/store/postgres/shop_role_store.go`(ShopRoleStore 数据访问层) - `internal/service/shop/shop_role.go`(店铺角色业务逻辑) - `internal/handler/admin/shop_role.go`(店铺角色 HTTP 处理器) - `internal/model/dto/shop_role_dto.go`(店铺角色 DTO) - **修改**: - `internal/service/account/role_resolver.go`(新增角色解析逻辑) - `internal/service/permission/service.go`(修改权限检查,使用新的角色解析) - `internal/routes/shop.go`(注册店铺角色路由) - `internal/bootstrap/stores.go`(注册 ShopRoleStore) - `internal/bootstrap/handlers.go`(注册 ShopRoleHandler) ### API 接口 - **新增**: - `POST /api/admin/shops/:shop_id/roles`(分配店铺角色) - `GET /api/admin/shops/:shop_id/roles`(查询店铺角色) - `DELETE /api/admin/shops/:shop_id/roles/:role_id`(删除店铺角色) - **行为变更**: - `GET /api/admin/accounts/:id/roles`(查询账号角色时,返回结果可能包含继承的店铺角色,需要标识来源) ### 用户类型影响范围 - **代理账号(UserType=3)**:受影响,支持继承店铺角色 - **平台账号(UserType=2)**:不受影响,保持账号级角色 - **企业账号(UserType=4)**:不受影响,保持账号级角色 - **超级管理员(UserType=1)**:不受影响,跳过权限检查 - **个人客户(UserType=5)**:不受影响,无角色系统 ### 性能考虑 - 角色解析增加一次额外查询(查询店铺角色),但通过 Redis 缓存权限结果(30 分钟),性能影响可忽略 - 店铺角色修改时需清理该店铺下所有账号的权限缓存 ### 向后兼容性 - ✅ 完全向后兼容:保留 `tb_account_role` 表和现有逻辑 - ✅ 现有账号级角色不受影响,优先级高于店铺级角色 - ✅ 不设置店铺角色的店铺,行为与现在完全一致