86 lines
5.0 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

---
name: project-framework
description: Defines the PolyClientVuetify project's framework, structure, and coding conventions. Use when adding or modifying any code in this repository so that changes follow the same stack, patterns, and style.
---
# 项目框架规范
在**新增或修改**本仓库内任何代码时,按以下规范执行,保证风格与架构一致。
## 技术栈
- **框架**Vue 3Composition API+ TypeScript
- **构建**Vite 7路径别名 `@/*``./src/*`
- **UI**Vuetify 4`v-app``v-card``v-btn` 等)
- **状态**Pinia
- **路由**Vue Router 5createWebHistory
- **代码质量**ESLint + Prettier + oxlint单测 VitestE2E Playwright
## 目录与文件放置
| 用途 | 目录/文件 | 说明 |
|----------------|------------------------------|------|
| 页面级视图 | `src/views/` | 对应路由,一个路由一个 Vue 文件 |
| 可复用组件 | `src/components/` | 被多个 view 或其它组件引用 |
| 接口与类型 | `src/api/` | 请求封装、接口函数、响应/请求类型 |
| 全局状态 | `src/stores/` | Pinia store按领域拆分 |
| 路由配置 | `src/router/index.ts` | 集中声明 routes |
| 入口与插件 | `src/main.ts``src/plugins/` | 不随意新增顶级文件 |
- 新页面:在 `views/` 新增 `.vue`,并在 `router/index.ts` 增加 `path``name``component`
- 新接口:在 `api/` 下合适模块(如 `event.ts`)或新建 `xxx.ts`,复用 `request.ts``get`/`post`,并导出类型与函数。
## Vue 组件规范
1. **单文件结构顺序**`<template>``<script setup lang="ts">``<style scoped>`
2. **Script**:一律使用 `<script setup lang="ts">`,不用 Options API。
3. **Props**:用 `defineProps({ ... })` 声明,带 `type` 与必要时 `default`;在 script 中通过 `props.xxx` 访问。
4. **Emits**:用 `defineEmits<{ eventName: [arg1Type, arg2?] }>()` 做类型声明,再 `emit('eventName', ...)`
5. **组合式用法**:从 `vue` 按需导入 `ref``computed``watch` 等;从 `vue-router``useRouter`/`useRoute`;从 `@/stores/xxx` 用对应 `useXxxStore()`
6. **组件命名**:文件名 PascalCase`MarketCard.vue`),在模板或路由中可写为 PascalCase 或 kebab-case。
## 模板与样式
- **模板**:优先使用 Vuetify 组件;自定义类名用 **kebab-case**(如 `market-card``semi-progress-wrap`)。
- **样式**:使用 `<style scoped>`,类名与模板中的 class 一致;需要时可加简短注释区分区块(如 `/* Top Section */`)。
- **多语言**:当前为中文 + 英文混用,文案风格与现有页面保持一致即可。
## API 层规范
- **基础请求**:统一通过 `src/api/request.ts``get<T>(path, params?, config?)` 等;鉴权在 `config.headers['x-token']` 传入。
- **接口模块**:每个接口文件导出:
- 请求/响应用到的 **TypeScript 接口**(如 `XxxListItem``XxxResponse``PageResult<T>`
- 对外调用的 **异步函数**(如 `getXxxList(params)`),函数上方用注释标明 `GET /Xxx/Yyy``POST /Xxx/Yyy`
- **命名**:列表项类型 `XxxListItem`,分页结果 `PageResult<T>`,统一响应体 `XxxResponse`;与现有 `event.ts` 保持一致。
## 状态Pinia
- 使用 **setup 写法**`defineStore('storeName', () => { ... return { state, getters, actions } })`
- 状态用 `ref`,派生用 `computed`,方法直接定义为函数并 return。
- 需要持久化的(如登录态)在 store 内用 `localStorage` 读写,键名常量化。
## 路由
- 路由表在 `src/router/index.ts` 中集中配置;每个路由包含 `path``name``component`
- 页面跳转使用 `router.push()``router.replace()`;需要带参时用 `path` + `query``params`(如 `/trade-detail/:id`)。
## 格式与规范
- **Prettier**已配置无分号、单引号、printWidth 100。修改或新增代码后保持格式化项目内可运行 `npm run format`)。
- **TypeScript**:启用严格类型;新接口、函数需有明确类型,避免 `any`
- **命名**
- 文件名:组件/视图 PascalCase其余 camelCase 或 kebab-case 与现有一致;
- 变量/函数camelCase
- 常量:全大写下划线或 camelCase 与现有文件一致;
- 类型/接口PascalCase。
## 修改与新增时的自检
- [ ] 新页面已加入 `router/index.ts`,组件放在 `views/``components/` 正确位置。
- [ ] 新接口在 `api/` 中实现,使用 `request.ts` 并导出类型与函数。
- [ ] Vue 文件使用 `<script setup lang="ts">`Props/Emits 有类型。
- [ ] 样式使用 scoped类名 kebab-case。
- [ ] 符合现有 Prettier/ESLint 配置,无新增 lint 报错。
遵循本规范可保证与本项目现有架构和风格一致;涉及接口文档与接口实现细节时,可结合 `xtrader-api-docs` skill 使用。