5.0 KiB
Raw Permalink Blame History

name, description
name description
project-framework 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/*
  • UIVuetify 4v-appv-cardv-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.tssrc/plugins/ 不随意新增顶级文件
  • 新页面:在 views/ 新增 .vue,并在 router/index.ts 增加 pathnamecomponent
  • 新接口:在 api/ 下合适模块(如 event.ts)或新建 xxx.ts,复用 request.tsget/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 按需导入 refcomputedwatch 等;从 vue-routeruseRouter/useRoute;从 @/stores/xxx 用对应 useXxxStore()
  6. 组件命名:文件名 PascalCaseMarketCard.vue),在模板或路由中可写为 PascalCase 或 kebab-case。

模板与样式

  • 模板:优先使用 Vuetify 组件;自定义类名用 kebab-case(如 market-cardsemi-progress-wrap)。
  • 样式:使用 <style scoped>,类名与模板中的 class 一致;需要时可加简短注释区分区块(如 /* Top Section */)。
  • 多语言:当前为中文 + 英文混用,文案风格与现有页面保持一致即可。

API 层规范

  • 基础请求:统一通过 src/api/request.tsget<T>(path, params?, config?) 等;鉴权在 config.headers['x-token'] 传入。
  • 接口模块:每个接口文件导出:
    • 请求/响应用到的 TypeScript 接口(如 XxxListItemXxxResponsePageResult<T>
    • 对外调用的 异步函数(如 getXxxList(params)),函数上方用注释标明 GET /Xxx/YyyPOST /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 中集中配置;每个路由包含 pathnamecomponent
  • 页面跳转使用 router.push()router.replace();需要带参时用 path + queryparams(如 /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 使用。