--- description: Vue 3 前端架构规范和组件开发 globs: - "frontend/**/*.vue" - "frontend/**/*.ts" alwaysApply: false --- # 前端架构规范 ## 组件结构 ### 目录组织 - 页面组件放在 `views/` 目录下,按模块组织 - 公共组件放在 `components/` 目录下 - 组件命名使用 PascalCase ### 组件语法 使用 Vue 3 Composition API 的 ` ``` ## API 调用规范 ### 目录结构 所有 API 调用放在 `api/` 目录下,按模块组织: ``` api/ ├── users.ts ├── roles.ts ├── contests.ts └── auth.ts ``` ### API 函数命名 - `getXxx` - 获取数据 - `createXxx` - 创建数据 - `updateXxx` - 更新数据 - `deleteXxx` - 删除数据 ### 示例 ```typescript // api/users.ts import request from "@/utils/request"; export interface User { id: number; username: string; nickname: string; email?: string; validState: number; } export interface CreateUserDto { username: string; password: string; nickname: string; email?: string; roleIds?: number[]; } export const getUsers = (params?: { skip?: number; take?: number }) => { return request.get("/users", { params }); }; export const createUser = (data: CreateUserDto) => { return request.post("/users", data); }; export const updateUser = (id: number, data: Partial) => { return request.put(`/users/${id}`, data); }; export const deleteUser = (id: number) => { return request.delete(`/users/${id}`); }; ``` ## 状态管理 (Pinia) ### Store 规范 - Store 文件放在 `stores/` 目录下 - 使用 `defineStore()` 定义 store - Store 命名使用 camelCase + Store 后缀 ### 示例 ```typescript // stores/auth.ts import { defineStore } from "pinia"; import { ref, computed } from "vue"; import { login, getUserInfo, type LoginDto, type User } from "@/api/auth"; export const useAuthStore = defineStore("auth", () => { const token = ref(localStorage.getItem("token")); const user = ref(null); const menus = ref([]); const isAuthenticated = computed(() => !!token.value && !!user.value); const loginAction = async (loginDto: LoginDto) => { const { accessToken, user: userInfo, menus: userMenus, } = await login(loginDto); token.value = accessToken; user.value = userInfo; menus.value = userMenus; localStorage.setItem("token", accessToken); }; const logout = () => { token.value = null; user.value = null; menus.value = []; localStorage.removeItem("token"); }; return { token, user, menus, isAuthenticated, loginAction, logout, }; }); ``` ## 路由管理 ### 路由规范 - 路由配置在 `router/index.ts` - 支持动态路由(基于菜单权限) - 路由路径包含租户编码:`/:tenantCode/xxx` - 路由 meta 包含权限信息 ### 示例 ```typescript { path: '/:tenantCode/users', name: 'Users', component: () => import('@/views/users/Index.vue'), meta: { requiresAuth: true, permissions: ['user:read'], roles: ['admin'], }, } ``` ## 表单验证 ### 使用 VeeValidate + Zod ```vue ``` ## UI 组件规范 ### Ant Design Vue - 使用 Ant Design Vue 组件库 - 遵循 Ant Design 设计规范 ### 样式 - 使用 Tailwind CSS 工具类 - 复杂样式使用 SCSS - 响应式设计,移动端优先 ### 状态管理 组件必须有 loading 和 error 状态: ```vue ``` ## TypeScript 类型定义 ### 类型文件组织 - TypeScript 类型定义放在 `types/` 目录下 - 接口类型使用 `interface` - 数据模型使用 `type` - 导出类型供其他模块使用 ### 示例 ```typescript // types/user.ts export interface User { id: number; username: string; nickname: string; email?: string; tenantId: number; validState: number; createTime: string; modifyTime: string; } export type CreateUserParams = Omit< User, "id" | "tenantId" | "createTime" | "modifyTime" >; export type UserRole = { userId: number; roleId: number; role: Role; }; ``` ## 性能优化 ### 路由懒加载 ```typescript const routes = [ { path: "/users", component: () => import("@/views/users/Index.vue"), }, ]; ``` ### 组件按需加载 ```typescript import { defineAsyncComponent } from "vue"; const AsyncComponent = defineAsyncComponent( () => import("@/components/HeavyComponent.vue") ); ``` ### 避免不必要的重新渲染 使用 `computed`、`watchEffect` 和 `memo` 优化性能。