---
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` 优化性能。