# Admin Production-Grade (Demo + RBAC) Implementation Plan > **For Claude:** REQUIRED SUB-SKILL: Use superpowers:executing-plans to implement this plan task-by-task. **Goal:** 在 admin 端实现生产级功能框架与演示登录/数据,同时预留真实鉴权接入。 **Architecture:** 前端引入 AuthAdapter + RBAC + DemoDataService,未登录默认演示管理员视图,真实鉴权仅需替换 Adapter 与数据源。 **Tech Stack:** Vue 3, Pinia, Vue Router, Vite, TypeScript, Tailwind --- ## Decisions / Constraints - 不新增依赖(如 Vitest)除非你确认。 - 不执行 git commit(如需提交请明确指示)。 --- ### Task 1: 建立 auth 目录结构 **Files:** - Create: `frontend/admin/src/auth/types.ts` - Create: `frontend/admin/src/auth/roles.ts` - Create: `frontend/admin/src/auth/adapters/AuthAdapter.ts` - Create: `frontend/admin/src/auth/adapters/DemoAuthAdapter.ts` **Step 1: 定义角色与权限枚举** - File: `frontend/admin/src/auth/roles.ts` - 内容:`AdminRole`、`Permission`、`RolePermissions` 映射 **Step 2: 定义认证类型与接口** - File: `frontend/admin/src/auth/types.ts` - 内容:`AuthUser`、`AuthState`、`LoginResult`、`AuthAdapter` 类型 **Step 3: 实现 DemoAuthAdapter** - File: `frontend/admin/src/auth/adapters/DemoAuthAdapter.ts` - 行为:返回演示管理员账号 + 支持“切换角色” --- ### Task 2: 新增 auth store **Files:** - Create: `frontend/admin/src/stores/auth.ts` **Step 1: 定义 state/actions** - 初始状态为 demo admin - actions: `loginDemo()`, `logout()`, `setRole(role)` **Step 2: 暴露 getters** - `isAuthenticated`, `role`, `hasPermission(permission)` --- ### Task 3: 路由与权限守卫 **Files:** - Modify: `frontend/admin/src/router/index.ts` **Step 1: 给 routes 增加 meta.roles** - 所有页面默认 `['admin','operator','viewer']` - 敏感页面(用户/配置/审计)限制为 `['admin']` **Step 2: 添加 global beforeEach** - 未登录自动 `auth.loginDemo()` - role 不满足则跳转到 `/403` **Step 3: 添加 403 页面** - Create: `frontend/admin/src/views/ForbiddenView.vue` - Route: `/403` --- ### Task 4: 登录页 + 演示一键登录 **Files:** - Create: `frontend/admin/src/views/LoginView.vue` - Modify: `frontend/admin/src/router/index.ts` **Step 1: 登录页 UI** - 表单(用户名/密码)显示但禁用 - 一键登录按钮调用 `auth.loginDemo()` 并跳转首页 **Step 2: 路由接入** - `/login` route --- ### Task 5: 统一演示数据层 **Files:** - Create: `frontend/admin/src/services/demo/DemoDataService.ts` - Create: `frontend/admin/src/services/api/ApiDataService.ts` - Create: `frontend/admin/src/services/index.ts` **Step 1: 定义服务接口** - `getDashboard()`, `getActivities()`, `getUsers()`, `getRewards()`, `getAlerts()`, `getAuditLogs()`, `getConfig()` **Step 2: Demo 实现** - 返回结构稳定的 mock 数据 - 支持分页/筛选参数但本地处理 **Step 3: Api 实现占位** - 使用现有 `useMosquito()` 封装(暂不调用后端登录) --- ### Task 6: 页面完善(运营/用户/奖励/风控/审计/通知) **Files:** - Create: `frontend/admin/src/views/UsersView.vue` - Create: `frontend/admin/src/views/RewardsView.vue` - Create: `frontend/admin/src/views/RiskView.vue` - Create: `frontend/admin/src/views/AuditLogView.vue` - Create: `frontend/admin/src/views/NotificationsView.vue` - Modify: `frontend/admin/src/router/index.ts` - Modify: `frontend/admin/src/App.vue` **Step 1: UsersView** - 用户列表 + 角色标签 + 搜索框 **Step 2: RewardsView** - 奖励发放列表 + 状态筛选 **Step 3: RiskView** - 黑名单/风控规则列表 + 占位操作 **Step 4: AuditLogView** - 审计日志表格 + 时间筛选 **Step 5: NotificationsView** - 通知列表 + 未读标记 **Step 6: 导航接入** - App header 新增导航项,按角色控制可见 --- ### Task 7: 现有页面接入新数据服务 **Files:** - Modify: `frontend/admin/src/views/DashboardView.vue` - Modify: `frontend/admin/src/views/ActivityListView.vue` **Step 1: 替换为统一服务调用** - 用 `services/index.ts` 中的 `dataService` **Step 2: 演示模式标识** - header 显示“演示模式”badge --- ### Task 8: 权限与演示状态的 UI 反馈 **Files:** - Modify: `frontend/admin/src/App.vue` - Modify: `frontend/admin/src/styles/index.css` **Step 1: 顶部状态条** - 显示当前角色/是否演示 **Step 2: 非授权页面提示** - 403 页面完善 --- ### Task 9: 文档 **Files:** - Create: `docs/admin-demo-auth.md` **Step 1: 说明演示模式** - 如何进入演示 - 未来如何替换为真实鉴权 --- ### Task 10: 手工验证清单 **Steps:** 1. 启动 admin:`npm --prefix "frontend/admin" run dev -- --host 127.0.0.1 --port 5174 --strictPort` 2. 访问 `/login`,点击“一键登录”进入首页 3. 切换角色(admin/operator/viewer),观察菜单变化 4. 访问 `/403` 验证无权限提示 5. 各页面可渲染且无控制台错误 --- ## Execution Handoff Plan complete and saved to `docs/plans/2026-02-04-admin-production-plan.md`. Two execution options: 1. Subagent-Driven (this session) - I dispatch fresh subagent per task, review between tasks, fast iteration 2. Parallel Session (separate) - Open new session with executing-plans, batch execution with checkpoints Which approach?