# Sub-Plan D: Vue 3 后台管理 > **For agentic workers:** REQUIRED SUB-SKILL: Use superpowers:subagent-driven-development > **前置依赖:** Spring Boot 后端 `/api/admin/**` 接口就绪 **目标:** 运营后台,提供数据查询和系统配置管理 **技术:** Vite + Vue 3 + Element Plus + Axios --- ## 项目结构 ``` admin/ ├── index.html ├── vite.config.js ├── package.json ├── src/ │ ├── main.js │ ├── App.vue │ ├── router/index.js │ ├── api/ │ │ ├── request.js # axios 封装 │ │ ├── dashboard.js │ │ ├── users.js │ │ ├── charts.js │ │ ├── orders.js │ │ ├── commissions.js │ │ └── config.js │ ├── views/ │ │ ├── login/index.vue │ │ ├── dashboard/index.vue │ │ ├── users/index.vue │ │ ├── charts/index.vue │ │ ├── orders/index.vue │ │ ├── commissions/index.vue │ │ ├── withdraw/index.vue │ │ └── settings/index.vue │ └── components/ │ └── Sidebar.vue ``` --- ### Task 1: 项目初始化 - [ ] **Step 1:** `npm create vite@latest admin -- --template vue` - [ ] **Step 2:** 安装 Element Plus: `npm install element-plus axios vue-router@4 @element-plus/icons-vue` - [ ] **Step 3: 配置 vite.config.js** ```javascript import { defineConfig } from 'vite' import vue from '@vitejs/plugin-vue' export default defineConfig({ plugins: [vue()], server: { port: 3000, proxy: { '/api': { target: 'http://localhost:8080', changeOrigin: true } } } }) ``` - [ ] **Step 4: 创建路由** ```javascript // router/index.js const routes = [ { path: '/login', component: () => import('@/views/login/index.vue') }, { path: '/', component: () => import('@/components/Sidebar.vue'), children: [ { path: '', redirect: '/dashboard' }, { path: 'dashboard', component: () => import('@/views/dashboard/index.vue') }, { path: 'users', component: () => import('@/views/users/index.vue') }, { path: 'charts', component: () => import('@/views/charts/index.vue') }, { path: 'orders', component: () => import('@/views/orders/index.vue') }, { path: 'commissions', component: () => import('@/views/commissions/index.vue') }, { path: 'withdraw', component: () => import('@/views/withdraw/index.vue') }, { path: 'settings', component: () => import('@/views/settings/index.vue') }, ]} ] ``` - [ ] **Step 5: Commit** --- ### Task 2: API 层 - [ ] **Step 1: request.js** ```javascript import axios from 'axios' import { ElMessage } from 'element-plus' const request = axios.create({ baseURL: '/api/admin' }) request.interceptors.request.use(config => { const token = localStorage.getItem('adminToken') if (token) config.headers.Authorization = 'Bearer ' + token return config }) request.interceptors.response.use( res => { if (res.data.code === 0) return res.data.data; ElMessage.error(res.data.message); return Promise.reject(res.data) }, err => { ElMessage.error('网络错误'); return Promise.reject(err) } ) export default request ``` - [ ] **Step 2: API 模块** ```javascript // api/dashboard.js export const getStats = () => request.post('/dashboard/stats') // api/users.js export const listUsers = (data) => request.post('/users/list', data) export const userDetail = (id) => request.post('/users/detail', { id }) // api/charts.js export const listCharts = (data) => request.post('/charts/list', data) // api/orders.js export const listOrders = (data) => request.post('/orders/list', data) export const refund = (id) => request.post('/orders/refund', { id }) // api/commissions.js export const listCommissions = (data) => request.post('/commissions/list', data) // api/withdraw.js export const listWithdraw = (data) => request.post('/withdraw/list', data) export const approveWithdraw = (id) => request.post('/withdraw/approve', { id }) // api/config.js export const getConfig = () => request.post('/config/get') export const updateConfig = (key, value) => request.post('/config/update', { key, value }) ``` - [ ] **Step 3: Commit** --- ### Task 3: 登录页 + 仪表盘 - [ ] **Step 1: 登录页 — login/index.vue** ```vue ``` - [ ] **Step 2: 仪表盘 — dashboard/index.vue** ```vue ``` - [ ] **Step 3: Commit** --- ### Task 4: 用户管理页 - [ ] **Step 1: users/index.vue** — 表格 + 搜索 ```vue ``` - [ ] **Step 2: Commit** --- ### Task 5: 订单 & 佣金 & 提现审核 - [ ] **Step 1: orders/index.vue** — 订单列表 表格列:ID / 用户ID / 金额(元) / 商品 / 状态 / 支付时间 / 操作(退款) - [ ] **Step 2: commissions/index.vue** — 佣金列表 表格列:ID / 来源用户 / 获得用户 / 层级(一级/二级) / 金额 / 状态 / 时间 - [ ] **Step 3: withdraw/index.vue** — 提现审核 表格 + 操作按钮:「审核通过」「拒绝」 ```javascript // 审核通过 const approve = async (id) => { await approveWithdraw(id) ElMessage.success('已审核通过') load() } ``` - [ ] **Step 4: Commit** --- ### Task 6: 系统配置页 - [ ] **Step 1: settings/index.vue** ```vue ``` - [ ] **Step 2: Commit**