# Vben Admin Web-Antd AI 开发规则手册 ## 项目概述 本项目基于 **Vben Admin 5.x** 框架开发,使用 Vue 3 + TypeScript + Ant Design Vue。项目采用 **monorepo** 结构,当前应用位于 `apps/web-antd`,依赖 `packages` 目录下的框架核心包。 ### 技术栈 - **框架**: Vue 3.5+ (Composition API) - **语言**: TypeScript 5.8+ - **UI 库**: Ant Design Vue 4.x - **状态管理**: Pinia - **路由**: Vue Router 4.x - **构建工具**: Vite 6.x - **包管理器**: pnpm (必须使用,不能用 npm/yarn) - **图标**: Iconify + Lucide --- ## 项目结构 ``` apps/web-antd/ ├── src/ │ ├── api/ # API 请求封装 │ │ ├── core/ # 核心 API (auth, menu, user) │ │ ├── request.ts # 请求客户端配置 │ │ └── index.ts # 导出所有 API │ ├── router/ # 路由配置 │ │ ├── routes/ # 路由定义 │ │ │ ├── core/ # 核心路由 (login, 404等) │ │ │ └── modules/ # 业务路由模块 │ │ └── index.ts # 路由实例 │ ├── store/ # Pinia 状态管理 │ ├── views/ # 页面组件 │ │ ├── _core/ # 核心页面 (login, 404) │ │ ├── dashboard/ # 仪表盘 │ │ └── demos/ # 示例页面 │ ├── layouts/ # 布局组件(如需自定义) │ ├── locales/ # 国际化配置 │ ├── adapter/ # 组件适配器 │ ├── app.vue # 根组件 │ ├── main.ts # 入口文件 │ └── preferences.ts # 应用偏好设置 ├── package.json └── vite.config.ts ``` --- ## 核心开发规范 ### 1. 命名规范 #### 文件命名 - **组件文件**: PascalCase,如 `UserProfile.vue`, `DataTable.vue` - **工具文件**: kebab-case,如 `format-date.ts`, `use-table.ts` - **API 文件**: kebab-case,如 `user-api.ts`, `order-api.ts` - **路由文件**: kebab-case,如 `user-management.ts` #### 变量命名 - **组件变量**: PascalCase,如 `const UserTable = defineComponent(...)` - **普通变量**: camelCase,如 `const userInfo = ref({})` - **常量**: UPPER_SNAKE_CASE,如 `const API_BASE_URL = '...'` - **类型/接口**: PascalCase,如 `interface UserInfo { ... }` ### 2. Vue 组件规范 **必须使用 Composition API + ` ``` ### 3. 导入路径别名 使用 `#/` 别名指向 `src/` 目录: ```typescript // ✅ 正确 import { useAuthStore } from '#/store'; import type { UserInfo } from '#/api/types'; import { $t } from '#/locales'; // ❌ 错误 - 不要使用相对路径 import { useAuthStore } from '../../../store'; ``` ### 4. 框架组件导入 框架提供的组件从 `@vben/*` 包导入: ```typescript // UI 组件 import { Button, Modal, Drawer } from '@vben/common-ui'; import { Page, Card } from '@vben/common-ui'; import { VbenForm, VbenTable } from '@vben/common-ui'; // 布局组件 import { BasicLayout, PageWrapper } from '@vben/layouts'; // 图标 import { SvgIcon, IconSvg } from '@vben/icons'; // Hooks import { usePreferences, useAppConfig } from '@vben/hooks'; // 工具函数 import { formatDate, formatMoney } from '@vben/utils'; // 权限 import { useAccess } from '@vben/access'; // Store import { useAccessStore, useUserStore } from '@vben/stores'; // 请求 import { RequestClient } from '@vben/request'; ``` --- ## 开发模式详解 ### 1. 创建新页面 #### 步骤 1: 创建视图组件 在 `src/views/` 下创建页面组件: ```vue ``` #### 步骤 2: 添加路由配置 在 `src/router/routes/modules/` 下创建路由模块: ```typescript // src/router/routes/modules/user.ts import type { RouteRecordRaw } from 'vue-router'; import { $t } from '#/locales'; const routes: RouteRecordRaw[] = [ { meta: { icon: 'lucide:users', title: '用户管理', order: 10, // 菜单排序 }, name: 'User', path: '/user', children: [ { name: 'UserList', path: '/user/list', component: () => import('#/views/user/user-list.vue'), meta: { icon: 'lucide:user-cog', title: '用户列表', }, }, { name: 'UserDetail', path: '/user/detail/:id', component: () => import('#/views/user/user-detail.vue'), meta: { hideInMenu: true, // 不在菜单中显示 title: '用户详情', activeMenu: '/user/list', // 激活父菜单 }, }, ], }, ]; export default routes; ``` **路由配置要点:** - 必须 `export default routes` - `component` 使用动态导入 `() => import(...)` - 使用 `#/views/` 别名 - 图标使用 Iconify 格式,如 `lucide:users` - `meta.order` 控制菜单顺序(数字越小越靠前) #### 步骤 3: 添加国际化(可选) ```typescript // src/locales/lang/zh-CN/user.ts export default { userManagement: '用户管理', userList: '用户列表', userName: '用户名', email: '邮箱', }; ``` ### 2. API 请求规范 #### 在 `src/api/` 下创建 API 模块: ```typescript // src/api/user.ts import { requestClient } from './request'; export interface UserInfo { id: string; username: string; email: string; status: 'active' | 'inactive'; } export interface UserListParams { page?: number; pageSize?: number; keyword?: string; } /** * 获取用户列表 */ export async function getUserListApi(params?: UserListParams) { return requestClient.get('/user/list', { params }); } /** * 获取用户详情 */ export async function getUserDetailApi(id: string) { return requestClient.get(`/user/${id}`); } /** * 创建用户 */ export async function createUserApi(data: Partial) { return requestClient.post('/user', data); } /** * 更新用户 */ export async function updateUserApi(id: string, data: Partial) { return requestClient.put(`/user/${id}`, data); } /** * 删除用户 */ export async function deleteUserApi(id: string) { return requestClient.delete(`/user/${id}`); } ``` **API 规范:** - 使用 `requestClient` 发起请求(已配置拦截器、token、错误处理) - 函数名以 `Api` 结尾 - 使用 TypeScript 定义请求参数和返回类型 - 添加 JSDoc 注释说明用途 ### 3. 状态管理 (Pinia) #### 创建 Store: ```typescript // src/store/modules/user.ts import { defineStore } from 'pinia'; import { ref, computed } from 'vue'; import type { UserInfo } from '#/api/types'; import { getUserDetailApi } from '#/api/user'; export const useUserStore = defineStore('user', () => { // State const userInfo = ref(null); const loading = ref(false); // Getters const isLoggedIn = computed(() => !!userInfo.value); const userName = computed(() => userInfo.value?.username || 'Guest'); // Actions async function fetchUserInfo() { loading.value = true; try { const data = await getUserDetailApi('me'); userInfo.value = data; } finally { loading.value = false; } } function clearUser() { userInfo.value = null; } return { // State userInfo, loading, // Getters isLoggedIn, userName, // Actions fetchUserInfo, clearUser, }; }); ``` **使用 Store:** ```vue ``` ### 4. 使用框架表单组件 (VbenForm) ```vue ``` ### 5. 使用框架表格组件 (VbenTable) ```vue ``` ### 6. 权限控制 ```vue ``` ### 7. 使用图标 ```vue ``` **常用图标集:** - `lucide:*` - Lucide 图标(推荐) - `mdi:*` - Material Design Icons - `carbon:*` - Carbon Icons - `heroicons:*` - Heroicons 浏览图标:https://icon-sets.iconify.design/ --- ## 样式规范 ### 1. 使用 Tailwind CSS 优先使用 Tailwind CSS 工具类: ```vue ``` ### 2. Scoped 样式 需要自定义样式时使用 ` ``` ### 3. 响应式设计 使用 Tailwind 响应式前缀: ```vue ``` --- ## 常见问题和注意事项 ### 1. ❌ 不要做的事 - **不要使用 Options API**(必须用 Composition API) - **不要使用相对路径导入**(使用 `#/` 别名) - **不要直接修改 `packages/` 下的框架代码** - **不要在组件中直接操作 DOM**(使用 Vue 的响应式系统) - **不要使用 yarn/npm**(必须用 pnpm) - **不要在路由配置中使用 `require`**(使用 `import()`) ### 2. ✅ 最佳实践 - **组件拆分**: 单个组件不超过 300 行,复杂组件拆分成子组件 - **类型安全**: 所有 API 响应、组件 Props、函数参数都定义 TypeScript 类型 - **错误处理**: 使用 `try-catch` 处理异步错误 - **加载状态**: 异步操作要有 loading 状态 - **国际化**: 所有用户可见的文本使用 `$t()` 函数 - **权限控制**: 敏感操作添加权限检查 ### 3. 性能优化 ```vue ``` ### 4. 调试技巧 ```typescript // 开发环境打印日志 if (import.meta.env.DEV) { console.log('调试信息:', data); } // 使用 Vue Devtools // Chrome 扩展:Vue.js devtools ``` --- ## 开发命令 ```bash # 启动开发服务器 pnpm run dev:antd # 构建生产版本 pnpm run build:antd # 类型检查 pnpm run check:type # 代码格式化 pnpm run format # 代码检查 pnpm run lint # 单元测试 pnpm run test:unit ``` --- ## API Mock 数据(开发阶段) 如果后端接口未就绪,可以使用 Mock 数据: ```typescript // src/api/user.ts import { requestClient } from './request'; export async function getUserListApi() { // 开发环境使用 mock 数据 if (import.meta.env.DEV) { return Promise.resolve([ { id: '1', username: 'admin', email: 'admin@example.com', status: 'active' }, { id: '2', username: 'user', email: 'user@example.com', status: 'inactive' }, ]); } // 生产环境调用真实 API return requestClient.get('/user/list'); } ``` --- ## 环境变量配置 配置文件位置: - `.env` - 所有环境 - `.env.development` - 开发环境 - `.env.production` - 生产环境 ```bash # .env.development VITE_APP_TITLE=DevOps 管理系统 VITE_API_URL=http://localhost:8080/api ``` 使用方式: ```typescript import { useAppConfig } from '@vben/hooks'; const { apiURL } = useAppConfig(import.meta.env, import.meta.env.PROD); console.log('API地址:', apiURL); ``` --- ## 总结 遵循本手册的规范,可以确保: 1. ✅ 代码风格统一,易于维护 2. ✅ 充分利用框架能力,避免重复造轮子 3. ✅ 类型安全,减少运行时错误 4. ✅ 性能优化,用户体验良好 5. ✅ 团队协作顺畅,代码可读性强 **开发新功能前,请先参考 `playground` 和 `demos` 目录下的示例代码!**