Skip to content

Commit 7e83c8c

Browse files
committed
feat: add ai rules
1 parent 8edb334 commit 7e83c8c

5 files changed

Lines changed: 248 additions & 0 deletions

File tree

.cursor/rules/git.mdc

Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
---
2+
description: 辅助生成 Git 提交信息
3+
alwaysApply: false
4+
---
5+
6+
# Git 提交规范
7+
8+
## Commit 规范
9+
10+
提交模板 `type: message`,具体要求如下:
11+
12+
1. 注意英文冒号后有一个空格
13+
2. `type` 的枚举值有:
14+
15+
- `feat` 新功能
16+
- `fix` 修复错误
17+
- `perf` 性能优化
18+
- `refactor` 重构代码
19+
- `docs` 文档和注释
20+
- `types` 类型相关
21+
- `test` 单测相关
22+
- `ci` 持续集成、工作流
23+
- `revert` 撤销更改
24+
- `chore` 琐事(更新依赖、修改配置等)
25+
26+
3. 保持 `message` 简洁明了,描述清楚变更内容
27+
28+
## 分支说明
29+
30+
- `main / master`: 主分支
31+
- `4.x`: 已停止维护的 4.x 版本代码
32+
- `gh-pages`: GitHub Pages 构建分支
33+
34+
## 其他
35+
36+
- 禁止自动提交,除非有明确的指示
37+
- 提交前确保代码通过代码校验和单元测试
38+
- 避免大型提交,尽量将变更分解为小的、相关的提交

.cursor/rules/index.mdc

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
---
2+
alwaysApply: true
3+
---
4+
5+
# 规则
6+
7+
## 模型回复
8+
9+
- 请简明扼要地回答,避免不必要的重复或填充语言
10+
- 始终以简体中文回复
11+
12+
## 细分规则文件
13+
14+
- project.mdc: 项目开发规范
15+
- vue.mdc: Vue 开发规范
16+
- git.mdc: Git 提交规范
17+
- ts.mdc: TypeScript 开发规范

.cursor/rules/project.mdc

Lines changed: 87 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,87 @@
1+
---
2+
alwaysApply: true
3+
---
4+
5+
# 项目开发规范
6+
7+
## 技术栈
8+
9+
- 框架: Vue 3.5+
10+
- 打包构建工具: Vite 7+
11+
- 路由管理: Vue Router
12+
- 状态管理: Pinia
13+
- UI 组件库: Element Plus
14+
- CSS 预处理器: Scss
15+
- 代码校验与格式化: ESLint
16+
- 开发语言: TypeScript
17+
- 包管理工具: pnpm
18+
- 网络请求: Axios
19+
20+
## 目录结构
21+
22+
```sh
23+
# v3-admin-vite
24+
├─ .husky # commit 时进行代码校验和格式化
25+
├─ .vscode # vscode 配置和插件
26+
├─ public
27+
│ ├─ favicon.ico # 网站头像
28+
│ ├─ app-loading.css # 首屏 loading 动画
29+
│ └─ detect-ie.js # 检测 ie
30+
├─ src
31+
│ ├─ common # 通用目录
32+
│ │ ├─ apis # 通用目录 - 接口
33+
│ │ ├─ assets # 通用目录 - 静态资源
34+
│ │ ├─ components # 通用目录 - 组件
35+
│ │ ├─ composables # 通用目录 - 组合式函数
36+
│ │ ├─ constants # 通用目录 - 常量
37+
│ │ └─ utils # 通用目录 - 工具函数
38+
│ ├─ http # 网络请求
39+
│ ├─ layouts # 布局
40+
│ ├─ pages # 页面
41+
│ │ └─ login # 登录模块
42+
│ │ ├─ apis # 登录模块 - 私有接口
43+
│ │ ├─ components # 登录模块 - 私有组件
44+
│ │ ├─ composables # 登录模块 - 私有组合式函数
45+
│ │ ├─ images # 登录模块 - 私有图片
46+
│ │ └─ index.vue # 登录模块 - 页面
47+
│ ├─ pinia # 状态管理
48+
│ ├─ plugins # 插件(全局组件、自定义指令等)
49+
│ ├─ router # 路由
50+
│ ├─ App.vue # 入口页面
51+
│ └─ main.ts # 入口文件
52+
├─ tests # 单元测试
53+
├─ types # 类型声明
54+
├─ .editorconfig # 编辑器配置
55+
├─ .env # 所有环境
56+
├─ .env.development # 开发环境
57+
├─ .env.production # 生产环境
58+
├─ .env.staging # 预发布环境
59+
├─ eslint.config.js # eslint 配置
60+
├─ tsconfig.json # ts 配置
61+
├─ uno.config.ts # unocss 配置
62+
└─ vite.config.ts # vite 配置
63+
```
64+
65+
- 保持目录结构清晰,遵循现有目录规范(同一个业务逻辑的代码和资源应当被收拢到了一起,避免在不同的目录间来回跳跃)
66+
67+
## 代码
68+
69+
- 编写整洁不冗余、可读性强的代码,始终提取共用逻辑
70+
- 编写对开发者友好的注释
71+
- 代码必须能够立即运行,包含所有必要的导入和依赖
72+
- 尽量避免使用兼容性不好的 JS、CSS 语法,使用时必须提供相应的注释
73+
- 建议参考项目已有代码的编码风格
74+
75+
## 导入规范
76+
77+
- 使用路径别名 `@` 指向 `src` 目录
78+
- 使用路径别名 `@@` 指向 `src/common` 目录
79+
80+
## 代码检查
81+
82+
- 使用 ESLint 进行代码校验与格式化
83+
- 禁用 Prettier 进行代码格式化
84+
85+
## 其他
86+
87+
- 优先使用现有第三方依赖,避免重新发明轮子

.cursor/rules/ts.mdc

Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
---
2+
globs: *.ts,*.tsx,*.d.ts
3+
alwaysApply: false
4+
---
5+
6+
# TypeScript 开发规范
7+
8+
## 类型
9+
10+
- 对于对象定义,优先使用接口而非类型
11+
- 对于联合类型、交叉类型和映射类型,使用 `type`
12+
- 避免使用 `any`,对于未知类型优先使用 `unknown`
13+
- 使用泛型实现可复用的类型模式
14+
- 不可变属性使用 `readonly`
15+
16+
## 命名
17+
18+
- 类型名称和接口使用 PascalCase
19+
- 变量和函数使用 camelCase
20+
- 常量使用 UPPER_CASE
21+
- 使用带有辅助动词的描述性名称(例如 isLoading、hasError)
22+
23+
## 代码组织
24+
25+
- 类型定义应靠近使用它们的地方
26+
- 共享的类型和接口从公共类型文件导出
27+
- 将 `*.d.ts` 文件放在 `types` 目录中
28+
29+
## 错误处理
30+
31+
- 捕获可能的异常,并对其进行处理
32+
33+
## 其他
34+
35+
- 实现适当的空值检查
36+
- 避免不必要的类型断言
37+
- 为公共函数使用显式返回类型
38+
- 回调使用箭头函数
39+
- 启用 TypeScript 严格模式

.cursor/rules/vue.mdc

Lines changed: 67 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,67 @@
1+
---
2+
globs: *.vue
3+
alwaysApply: false
4+
---
5+
6+
# Vue 开发规范
7+
8+
## 代码风格
9+
10+
- 组件: 使用单文件组件 (SFC)
11+
- API: 使用组合式 API (Composition API) 并搭配 `<script setup>` 语法糖
12+
- 语法: 没有特殊说明则使用 TS 进行开发 `<script setup lang="ts">`
13+
14+
## 命名
15+
16+
- 组件 (Component) 命名: 始终采用单词大写开头 (PascalCase) 的命名方式, 并且避免与 HTML 元素冲突
17+
- 组件 (Component) 命名示例: 以全局的 `SearchMenu` 组件 `@@/components/SearchMenu/index.vue` 和 `@@/components/SearchMenu/Modal.vue` 作为参考,注意 `index` 是不需要遵循大驼峰格式的
18+
- 页面 (Page) 命名: 始终采用短横线连接 (kebab-case) 的命名方式
19+
- 页面 (Page) 命名示例: 以增删改查示例页面作为参考 `@/pages/demo/element-plus/index.vue`
20+
- 组合式函数 (Composable) 命名: 始终采用小驼峰 (camelCase) 的命名方式
21+
- 组合式函数 (Composable) 命名示例: 以水印组合式函数作为参考 `@@/composables/useWatermark.ts`
22+
- Props 命名: 在声明 prop 的时候,其命名应该始终采用小驼峰 (camelCase),而在模板和 JSX 中应该始终采用短横线连接 (kebab-case)
23+
- Props 命名示例: 声明时 `const { isActive = false } = defineProps<Props>()` 和传递时 `<Demo :is-active="true" />`
24+
- TS 或 JS 文件命名: 始终采用短横线连接 (kebab-case) 的命名方式
25+
- TS 或 JS 文件命名示例: `@@/constants/app-key.ts`
26+
27+
## API
28+
29+
- 定义响应式变量时优先使用 `ref` 而非 `reactive`
30+
- 复杂的模板表达式则应该重构为计算属性或方法
31+
- 尽量避免侦听器的循坏触发,防止进入死循环
32+
33+
## Props
34+
35+
- Prop 定义应该尽量详细,包括类型、必传、默认值
36+
- 如果是使用了 TS 那么应该使用「基于类型的声明」,默认值则使用「响应式 Props 解构」,示例: `const { isActive = false } = defineProps<Props>()`
37+
38+
## 路由
39+
40+
- 对应目录: `@/router`
41+
- 路由名称必须与组件名称保持一致
42+
- 路由守卫逻辑缜密,应当避免频繁更改
43+
44+
## 状态管理
45+
46+
- 对应目录: `@/pinia`
47+
- 使用 Pinia
48+
- Store 应该按模块划分
49+
- 优先使用 Setup store 语法,而不是 Option Store 语法
50+
- 避免无脑使用全局状态管理
51+
52+
## 样式
53+
54+
- 优先使用 Scoped CSS,示例: `<style scoped lang="scss">`
55+
- 尽可能避免使用 `!important`
56+
- 如果涉及到多主题,请考虑使用 CSS 变量,示例: `@@/assets/styles/variables.css`
57+
58+
## 其他
59+
60+
- 避免直接操作 DOM
61+
- 尽可能编写原子化组件
62+
- 使用 `v-for` 时必须提供唯一的 `key` (不要轻易使用数组下标 `index` 当做 `key`)
63+
- 不要在同一元素上同时使用 `v-if` 和 `v-for`
64+
65+
# 参考示例文件
66+
67+
@/pages/demo/element-plus/index.vue

0 commit comments

Comments
 (0)