From bfdc0e0e6d5e47aa501f9b6fadd143d9c97cf00a Mon Sep 17 00:00:00 2001
From: gaoluyang <2820782392@qq.com>
Date: 星期三, 24 六月 2026 17:40:39 +0800
Subject: [PATCH] Merge remote-tracking branch 'origin/dev' into dev

---
 .claude/feature-development.md               |   38 ++
 .claude/database-migration.md                |   36 +
 .claude/add-language-rules.md                |   39 ++
 .claude/skills/frontend-code-review/SKILL.md |  168 ++++++++
 .claude/vue-page.md                          |   95 +++++
 .claude/vue-component.md                     |   87 ++++
 CLAUDE.md                                    |   94 ++++
 .claude/api-service.md                       |   84 ++++
 .claude/settings.local.json                  |    7 
 .claude/skills/antd-vue-components/SKILL.md  |  212 +++++++++++
 .claude/skills/vue3-development/SKILL.md     |  155 ++++++++
 .claude/pinia-store.md                       |   99 +++++
 12 files changed, 1,110 insertions(+), 4 deletions(-)

diff --git a/.claude/add-language-rules.md b/.claude/add-language-rules.md
new file mode 100644
index 0000000..4d17abf
--- /dev/null
+++ b/.claude/add-language-rules.md
@@ -0,0 +1,39 @@
+---
+name: add-language-rules
+description: Workflow command scaffold for add-language-rules in everything-claude-code.
+allowed_tools: ["Bash", "Read", "Write", "Grep", "Glob"]
+---
+
+# /add-language-rules
+
+Use this workflow when working on **add-language-rules** in `everything-claude-code`.
+
+## Goal
+
+Adds a new programming language to the rules system, including coding style, hooks, patterns, security, and testing guidelines.
+
+## Common Files
+
+- `rules/*/coding-style.md`
+- `rules/*/hooks.md`
+- `rules/*/patterns.md`
+- `rules/*/security.md`
+- `rules/*/testing.md`
+
+## Suggested Sequence
+
+1. Understand the current state and failure mode before editing.
+2. Make the smallest coherent change that satisfies the workflow goal.
+3. Run the most relevant verification for touched files.
+4. Summarize what changed and what still needs review.
+
+## Typical Commit Signals
+
+- Create a new directory under rules/{language}/
+- Add coding-style.md, hooks.md, patterns.md, security.md, and testing.md files with language-specific content
+- Optionally reference or link to related skills
+
+## Notes
+
+- Treat this as a scaffold, not a hard-coded script.
+- Update the command if the workflow evolves materially.
\ No newline at end of file
diff --git a/.claude/api-service.md b/.claude/api-service.md
new file mode 100644
index 0000000..4c0574c
--- /dev/null
+++ b/.claude/api-service.md
@@ -0,0 +1,84 @@
+---
+name: api-service
+description: 鍒涘缓鏂扮殑 API 鏈嶅姟妯″潡锛屽寘鍚� TypeScript 绫诲瀷瀹氫箟
+allowed_tools: ["Bash", "Read", "Write", "Grep", "Glob"]
+---
+
+# /api-service
+
+鍒涘缓鏂扮殑 API 鏈嶅姟妯″潡鏃朵娇鐢ㄦ宸ヤ綔娴併��
+
+## 鐩爣
+
+鍒涘缓涓�涓被鍨嬪畨鍏ㄧ殑 API 鏈嶅姟妯″潡锛屽寘鍚纭殑璇锋眰/鍝嶅簲绫诲瀷瀹氫箟銆�
+
+## 甯哥敤鏂囦欢
+
+- `src/api/**/*.ts`
+- `src/services/**/*.ts`
+
+## 寤鸿姝ラ
+
+1. 瀹氫箟璇锋眰/鍝嶅簲鐨� TypeScript 鎺ュ彛
+2. 鍒涘缓甯︾被鍨嬫柟娉曠殑 API 鏈嶅姟瀵硅薄
+3. 瀵煎嚭绫诲瀷鍜屾湇鍔�
+4. 濡傞渶瑕侊紝娣诲姞閿欒澶勭悊
+
+## API 鏈嶅姟妯℃澘
+
+```typescript
+// types.ts
+export interface User {
+  id: number;
+  name: string;
+  email: string;
+  createdAt: string;
+}
+
+export interface UserQuery {
+  page?: number;
+  pageSize?: number;
+  name?: string;
+}
+
+export interface CreateUserDTO {
+  name: string;
+  email: string;
+}
+
+export interface UserListResponse {
+  list: User[];
+  total: number;
+}
+
+// user.ts
+import { request } from '#/utils/request';
+import type { User, UserQuery, CreateUserDTO, UserListResponse } from './types';
+
+export const userApi = {
+  // 鑾峰彇鐢ㄦ埛鍒楄〃
+  getList: (params?: UserQuery) =>
+    request.get<UserListResponse>('/users', { params }),
+
+  // 鏍规嵁ID鑾峰彇鐢ㄦ埛
+  getById: (id: number) =>
+    request.get<User>(`/users/${id}`),
+
+  // 鍒涘缓鐢ㄦ埛
+  create: (data: CreateUserDTO) =>
+    request.post<User>('/users', data),
+
+  // 鏇存柊鐢ㄦ埛
+  update: (id: number, data: Partial<CreateUserDTO>) =>
+    request.put<User>(`/users/${id}`, data),
+
+  // 鍒犻櫎鐢ㄦ埛
+  delete: (id: number) =>
+    request.delete<void>(`/users/${id}`),
+};
+```
+
+## 鍏稿瀷鎻愪氦淇℃伅
+
+- feat: add [妯″潡鍚峕 API service
+- feat: implement [妯″潡鍚峕 API with types
\ No newline at end of file
diff --git a/.claude/database-migration.md b/.claude/database-migration.md
new file mode 100644
index 0000000..855f94e
--- /dev/null
+++ b/.claude/database-migration.md
@@ -0,0 +1,36 @@
+---
+name: database-migration
+description: Workflow command scaffold for database-migration in everything-claude-code.
+allowed_tools: ["Bash", "Read", "Write", "Grep", "Glob"]
+---
+
+# /database-migration
+
+Use this workflow when working on **database-migration** in `everything-claude-code`.
+
+## Goal
+
+Database schema changes with migration files
+
+## Common Files
+
+- `**/schema.*`
+- `migrations/*`
+
+## Suggested Sequence
+
+1. Understand the current state and failure mode before editing.
+2. Make the smallest coherent change that satisfies the workflow goal.
+3. Run the most relevant verification for touched files.
+4. Summarize what changed and what still needs review.
+
+## Typical Commit Signals
+
+- Create migration file
+- Update schema definitions
+- Generate/update types
+
+## Notes
+
+- Treat this as a scaffold, not a hard-coded script.
+- Update the command if the workflow evolves materially.
\ No newline at end of file
diff --git a/.claude/feature-development.md b/.claude/feature-development.md
new file mode 100644
index 0000000..864a880
--- /dev/null
+++ b/.claude/feature-development.md
@@ -0,0 +1,38 @@
+---
+name: feature-development
+description: Workflow command scaffold for feature-development in everything-claude-code.
+allowed_tools: ["Bash", "Read", "Write", "Grep", "Glob"]
+---
+
+# /feature-development
+
+Use this workflow when working on **feature-development** in `everything-claude-code`.
+
+## Goal
+
+Standard feature implementation workflow
+
+## Common Files
+
+- `manifests/*`
+- `schemas/*`
+- `**/*.test.*`
+- `**/api/**`
+
+## Suggested Sequence
+
+1. Understand the current state and failure mode before editing.
+2. Make the smallest coherent change that satisfies the workflow goal.
+3. Run the most relevant verification for touched files.
+4. Summarize what changed and what still needs review.
+
+## Typical Commit Signals
+
+- Add feature implementation
+- Add tests for feature
+- Update documentation
+
+## Notes
+
+- Treat this as a scaffold, not a hard-coded script.
+- Update the command if the workflow evolves materially.
\ No newline at end of file
diff --git a/.claude/pinia-store.md b/.claude/pinia-store.md
new file mode 100644
index 0000000..a3f238a
--- /dev/null
+++ b/.claude/pinia-store.md
@@ -0,0 +1,99 @@
+---
+name: pinia-store
+description: 鍒涘缓鏂扮殑 Pinia 鐘舵�佸瓨鍌紝鍖呭惈 TypeScript 绫诲瀷
+allowed_tools: ["Bash", "Read", "Write", "Grep", "Glob"]
+---
+
+# /pinia-store
+
+鍒涘缓鏂扮殑 Pinia 鐘舵�佸瓨鍌ㄦ椂浣跨敤姝ゅ伐浣滄祦銆�
+
+## 鐩爣
+
+浣跨敤 Composition API 椋庢牸鍒涘缓绫诲瀷瀹夊叏鐨� Pinia 鐘舵�佸瓨鍌ㄣ��
+
+## 甯哥敤鏂囦欢
+
+- `src/stores/**/*.ts`
+- `src/**/store.ts`
+
+## 寤鸿姝ラ
+
+1. 瀹氫箟鐘舵�佹帴鍙�
+2. 浣跨敤 setup 璇硶鍒涘缓 store
+3. 娣诲姞璁$畻灞炴�э紙getters锛�
+4. 娣诲姞鎿嶄綔鏂规硶锛坅ctions锛�
+5. 濡傞渶瑕侊紝閰嶇疆鎸佷箙鍖�
+
+## Pinia Store 妯℃澘
+
+```typescript
+// stores/user.ts
+import { ref, computed } from 'vue';
+import { defineStore } from 'pinia';
+import type { User } from '#/api/types';
+
+interface UserState {
+  user: User | null;
+  token: string | null;
+}
+
+export const useUserStore = defineStore(
+  'user',
+  () => {
+    // 鐘舵��
+    const user = ref<User | null>(null);
+    const token = ref<string | null>(null);
+
+    // 璁$畻灞炴�� (Getters)
+    const isLoggedIn = computed(() => !!token.value && !!user.value);
+    const userName = computed(() => user.value?.name ?? '');
+    const userRoles = computed(() => user.value?.roles ?? []);
+
+    // 鎿嶄綔鏂规硶 (Actions)
+    const setUser = (newUser: User) => {
+      user.value = newUser;
+    };
+
+    const setToken = (newToken: string) => {
+      token.value = newToken;
+    };
+
+    const logout = () => {
+      user.value = null;
+      token.value = null;
+    };
+
+    const hasRole = (role: string) => {
+      return userRoles.value.includes(role);
+    };
+
+    return {
+      // 鐘舵��
+      user,
+      token,
+      // 璁$畻灞炴��
+      isLoggedIn,
+      userName,
+      userRoles,
+      // 鎿嶄綔鏂规硶
+      setUser,
+      setToken,
+      logout,
+      hasRole,
+    };
+  },
+  {
+    persist: {
+      key: 'user-store',
+      storage: localStorage,
+      pick: ['token'], // 鍙寔涔呭寲 token锛屼笉鎸佷箙鍖栫敤鎴峰璞�
+    },
+  }
+);
+```
+
+## 鍏稿瀷鎻愪氦淇℃伅
+
+- feat: add [Store鍚峕 store
+- feat: implement [Store鍚峕 state management
\ No newline at end of file
diff --git a/.claude/settings.local.json b/.claude/settings.local.json
index e4eccce..82123c6 100644
--- a/.claude/settings.local.json
+++ b/.claude/settings.local.json
@@ -1,10 +1,9 @@
 {
   "permissions": {
     "allow": [
-      "Bash(pnpm install *)",
-      "Bash(pnpm view *)",
-      "Bash(pnpm approve-builds *)",
-      "Bash(pnpm ls *)"
+      "WebFetch(domain:github.com)",
+      "Bash(gh repo *)",
+      "WebSearch"
     ]
   }
 }
diff --git a/.claude/skills/antd-vue-components/SKILL.md b/.claude/skills/antd-vue-components/SKILL.md
new file mode 100644
index 0000000..97f402c
--- /dev/null
+++ b/.claude/skills/antd-vue-components/SKILL.md
@@ -0,0 +1,212 @@
+---
+name: antd-vue-components
+description: Ant Design Vue 缁勪欢寮�鍙戞ā寮忓拰鏈�浣冲疄璺�
+---
+
+# Ant Design Vue 缁勪欢鎶�鑳�
+
+## 浣曟椂浣跨敤
+
+鍦ㄤ互涓嬪満鏅縺娲绘鎶�鑳斤細
+- 浣跨敤 Ant Design Vue 缁勪欢鏋勫缓琛ㄥ崟
+- 鍒涘缓 Vxe-Table 鎴� Ant Design 琛ㄦ牸
+- 瀹炵幇妯℃�佹鍜屾娊灞夌粍浠�
+- 浣跨敤 Ant Design 琛ㄥ崟楠岃瘉
+- 鑷畾涔� Ant Design 涓婚
+
+## 宸ヤ綔鍘熺悊
+
+姝ゆ妧鑳戒负 Ant Design Vue 4.x 寮�鍙戞ā寮忔彁渚涙寚瀵笺��
+
+## 鎶�鏈爤
+
+- **Ant Design Vue**: 4.2.x
+- **Vxe-Table**: 4.19.x锛堢敤浜庡鏉傝〃鏍硷級
+- **琛ㄥ崟楠岃瘉**: VeeValidate + Zod schema
+- **鍥炬爣**: @iconify/vue 鍜� @lucide/vue
+
+## 甯哥敤妯″紡
+
+### 甯﹂獙璇佺殑琛ㄥ崟
+
+```vue
+<script setup lang="ts">
+import { useForm } from 'vee-validate';
+import { toTypedSchema } from '@vee-validate/zod';
+import { z } from 'zod';
+
+const schema = toTypedSchema(
+  z.object({
+    username: z.string().min(3, '鐢ㄦ埛鍚嶈嚦灏�3涓瓧绗�'),
+    email: z.string().email('閭鏍煎紡涓嶆纭�'),
+    role: z.enum(['admin', 'user', 'guest']),
+  })
+);
+
+const { handleSubmit, setFieldValue, values } = useForm({
+  validationSchema: schema,
+  initialValues: {
+    username: '',
+    email: '',
+    role: 'user',
+  },
+});
+
+const onSubmit = handleSubmit(async (values) => {
+  // 绫诲瀷瀹夊叏鐨� values
+  console.log(values);
+});
+</script>
+
+<template>
+  <a-form @submit="onSubmit">
+    <a-form-item label="鐢ㄦ埛鍚�" name="username">
+      <a-input v-model:value="values.username" />
+    </a-form-item>
+    <a-form-item label="閭" name="email">
+      <a-input v-model:value="values.email" type="email" />
+    </a-form-item>
+    <a-form-item label="瑙掕壊" name="role">
+      <a-select v-model:value="values.role">
+        <a-select-option value="admin">绠$悊鍛�</a-select-option>
+        <a-select-option value="user">鐢ㄦ埛</a-select-option>
+        <a-select-option value="guest">璁垮</a-select-option>
+      </a-select>
+    </a-form-item>
+    <a-button type="primary" html-type="submit">鎻愪氦</a-button>
+  </a-form>
+</template>
+```
+
+### 甯︽搷浣滃垪鐨勮〃鏍�
+
+```vue
+<script setup lang="ts">
+import { ref, computed } from 'vue';
+import type { TableColumn } from '#/types';
+
+interface User {
+  id: number;
+  name: string;
+  email: string;
+  status: 'active' | 'inactive';
+}
+
+const columns: TableColumn<User>[] = [
+  { title: '濮撳悕', dataIndex: 'name', key: 'name' },
+  { title: '閭', dataIndex: 'email', key: 'email' },
+  {
+    title: '鐘舵��',
+    dataIndex: 'status',
+    key: 'status',
+    customRender: ({ text }) => text === 'active' ? '鍚敤' : '绂佺敤',
+  },
+  {
+    title: '鎿嶄綔',
+    key: 'actions',
+    width: 150,
+  },
+];
+
+const dataSource = ref<User[]>([]);
+const loading = ref(false);
+
+const handleEdit = (record: User) => {
+  // 缂栬緫閫昏緫
+};
+
+const handleDelete = (id: number) => {
+  // 鍒犻櫎閫昏緫
+};
+</script>
+
+<template>
+  <a-table
+    :columns="columns"
+    :data-source="dataSource"
+    :loading="loading"
+    row-key="id"
+  >
+    <template #bodyCell="{ column, record }">
+      <template v-if="column.key === 'actions'">
+        <a-space>
+          <a-button type="link" @click="handleEdit(record)">缂栬緫</a-button>
+          <a-popconfirm
+            title="纭畾瑕佸垹闄ゅ悧锛�"
+            @confirm="handleDelete(record.id)"
+          >
+            <a-button type="link" danger>鍒犻櫎</a-button>
+          </a-popconfirm>
+        </a-space>
+      </template>
+    </template>
+  </a-table>
+</template>
+```
+
+### 妯℃�佹
+
+```vue
+<script setup lang="ts">
+import { ref } from 'vue';
+
+const visible = ref(false);
+const loading = ref(false);
+
+const open = () => {
+  visible.value = true;
+};
+
+const handleOk = async () => {
+  loading.value = true;
+  try {
+    // 淇濆瓨閫昏緫
+    visible.value = false;
+  } finally {
+    loading.value = false;
+  }
+};
+
+const handleCancel = () => {
+  visible.value = false;
+};
+
+defineExpose({ open });
+</script>
+
+<template>
+  <a-modal
+    v-model:open="visible"
+    title="瀵硅瘽妗嗘爣棰�"
+    :confirm-loading="loading"
+    @ok="handleOk"
+    @cancel="handleCancel"
+  >
+    <p>妯℃�佹鍐呭</p>
+  </a-modal>
+</template>
+```
+
+## 鏈�浣冲疄璺�
+
+### 鎺ㄨ崘
+
+- 澶嶆潅琛ㄥ崟楠岃瘉浣跨敤 VeeValidate + Zod
+- Ant Design 杈撳叆妗嗕娇鐢� `v-model:value`
+- 鍦ㄦā鏉垮瑙f瀯琛ㄦ牸鍒楀畾涔�
+- 鍗遍櫓鎿嶄綔浣跨敤 `a-popconfirm` 纭
+- 璁剧疆琛ㄦ牸 `row-key` 鎻愬崌鎬ц兘
+
+### 閬垮厤
+
+- 涓嶈娣风敤 Ant Design 3.x 鍜� 4.x API
+- 涓嶈蹇樿澶勭悊鍔犺浇鐘舵��
+- 涓嶈浣跨敤鍐呰仈鏍峰紡 - 浣跨敤 Tailwind 鎴� scoped CSS
+
+## Vxe-Table 澶嶆潅琛ㄦ牸
+
+浠ヤ笅鍦烘櫙浣跨敤 Vxe-Table锛�
+- 澶ф暟鎹泦铏氭嫙婊氬姩
+- Excel 椋庢牸缂栬緫
+- 澶嶆潅鍗曞厓鏍煎悎骞�
+- 鏍戝舰鏁版嵁灞曞紑/鎶樺彔
diff --git a/.claude/skills/frontend-code-review/SKILL.md b/.claude/skills/frontend-code-review/SKILL.md
new file mode 100644
index 0000000..124769d
--- /dev/null
+++ b/.claude/skills/frontend-code-review/SKILL.md
@@ -0,0 +1,168 @@
+---
+name: frontend-code-review
+description: Vue 3 + TypeScript 椤圭洰鍓嶇浠g爜瀹℃煡鎸囧崡
+---
+
+# 鍓嶇浠g爜瀹℃煡鎶�鑳�
+
+## 浣曟椂浣跨敤
+
+鍦ㄤ互涓嬪満鏅縺娲绘鎶�鑳斤細
+- 瀹℃煡 Pull Request
+- 杩涜 Vue 缁勪欢浠g爜瀹℃煡
+- 妫�鏌ュ畨鍏ㄦ紡娲�
+- 楠岃瘉 TypeScript 绫诲瀷瀹夊叏
+- 瀹℃煡鎬ц兘浼樺寲
+
+## 宸ヤ綔鍘熺悊
+
+姝ゆ妧鑳芥彁渚涘墠绔唬鐮佸鏌ョ殑妫�鏌ユ竻鍗曞拰鎸囧崡銆�
+
+## 瀹℃煡娓呭崟
+
+### TypeScript 鍜岀被鍨�
+
+- [ ] 娌℃湁涓嶅悎鐞嗙殑 `any` 绫诲瀷
+- [ ] Props 鍜� Emits 鏈夋纭殑 TypeScript 鎺ュ彛
+- [ ] API 鍝嶅簲鏈夌被鍨嬫帴鍙�
+- [ ] 姝g‘浣跨敤娉涘瀷
+- [ ] 绫诲瀷瀵煎叆浣跨敤 `import type` 璇硶
+
+### Vue 缁勪欢
+
+- [ ] 浣跨敤 `<script setup>` 璇硶
+- [ ] 鍙�� Props 鏈夐粯璁ゅ��
+- [ ] Emits 浣跨敤 TypeScript 绫诲瀷
+- [ ] 娌℃湁鐩存帴淇敼 props
+- [ ] 姝g‘浣跨敤 `computed` vs `watch`
+- [ ] 鍦� `onUnmounted` 涓竻鐞嗗壇浣滅敤
+
+### 瀹夊叏鎬�
+
+- [ ] 娌℃湁 XSS 婕忔礊锛堢敤鎴峰唴瀹逛娇鐢� `v-dompurify-html`锛�
+- [ ] 娌℃湁纭紪鐮佺殑瀵嗛挜鎴� API Key
+- [ ] 鐢ㄦ埛杈撳叆宸茶繃婊�
+- [ ] 鏁忔劅鏁版嵁涓嶅湪 localStorage锛堜娇鐢� secure-ls 鎴� sessionStorage锛�
+- [ ] CSRF token 姝g‘澶勭悊
+
+### 鎬ц兘
+
+- [ ] 澶у垪琛ㄤ娇鐢ㄨ櫄鎷熸粴鍔�
+- [ ] 鍥剧墖宸蹭紭鍖�
+- [ ] 璺敱鎳掑姞杞�
+- [ ] 娌℃湁涓嶅繀瑕佺殑閲嶆覆鏌�
+- [ ] 姝g‘浣跨敤 `v-memo` 鍜� `v-once`
+
+### 鍙闂��
+
+- [ ] 姝g‘鐨� ARIA 灞炴��
+- [ ] 閿洏瀵艰埅鍙敤
+- [ ] 棰滆壊瀵规瘮搴﹁冻澶�
+- [ ] 妯℃�佹鐒︾偣绠$悊
+
+### 浠g爜璐ㄩ噺
+
+- [ ] 鍑芥暟鑱岃矗鍗曚竴
+- [ ] 娌℃湁閲嶅浠g爜锛堟彁鍙栧埌缁勫悎寮忓嚱鏁帮級
+- [ ] 閿欒澶勭悊瀹屽杽
+- [ ] 鍔犺浇鐘舵�佸凡澶勭悊
+- [ ] 杈圭晫鎯呭喌宸茶�冭檻
+
+## 甯歌闂鏍囪
+
+### 1. 鐩存帴淇敼 Props
+
+```typescript
+// 閿欒
+props.value = newValue;
+
+// 姝g‘
+emit('update:value', newValue);
+```
+
+### 2. 鍐呭瓨娉勬紡
+
+```typescript
+// 閿欒 - 娌℃湁娓呯悊
+onMounted(() => {
+  window.addEventListener('resize', handleResize);
+});
+
+// 姝g‘ - 缁勪欢鍗歌浇鏃舵竻鐞�
+onMounted(() => {
+  window.addEventListener('resize', handleResize);
+});
+
+onUnmounted(() => {
+  window.removeEventListener('resize', handleResize);
+});
+```
+
+### 3. 涓嶅繀瑕佺殑鍝嶅簲寮�
+
+```typescript
+// 閿欒 - 闈欐�佹暟鎹笉闇�瑕佸搷搴斿紡
+const menuItems = reactive([
+  { label: '棣栭〉', path: '/' },
+  { label: '鍏充簬', path: '/about' },
+]);
+
+// 姝g‘ - 闈欐�佹暟鎹笉闇�瑕佸搷搴斿紡
+const menuItems = [
+  { label: '棣栭〉', path: '/' },
+  { label: '鍏充簬', path: '/about' },
+];
+```
+
+### 4. 缂哄皯閿欒杈圭晫
+
+```vue
+<!-- 閿欒 - 娌℃湁閿欒澶勭悊 -->
+<template>
+  <ExpensiveComponent />
+</template>
+
+<!-- 姝g‘ - 鏈夐敊璇竟鐣� -->
+<template>
+  <ErrorBoundary>
+    <ExpensiveComponent />
+  </ErrorBoundary>
+</template>
+```
+
+## 瀹夊叏绾㈢嚎
+
+1. **XSS 椋庨櫓**
+   - 浣跨敤 `v-html` 浣嗘病鏈夎繃婊�
+   - 娓叉煋鐢ㄦ埛鐢熸垚鐨勫唴瀹�
+   - 閫氳繃 `window.location` 杩涜 URL 娉ㄥ叆
+
+2. **鏁版嵁娉勯湶**
+   - 鎺у埗鍙拌緭鍑烘晱鎰熸暟鎹�
+   - Token 鍦� localStorage 涓湭鍔犲瘑
+   - 婧愪唬鐮佷腑鏈� API Key
+
+3. **娉ㄥ叆椋庨櫓**
+   - 鍔ㄦ�佺粍浠跺悕鏉ヨ嚜鐢ㄦ埛杈撳叆
+   - 浣跨敤 `eval()` 鎴� `Function()`
+   - API 璋冪敤涓殑 SQL 娉ㄥ叆
+
+## 瀹℃煡鎰忚鏍煎紡
+
+浣跨敤寤鸿鎬х殑璇勮锛�
+
+```markdown
+**寤鸿**: 杩欓噷鑰冭檻浣跨敤 `computed` 鏇夸唬 `watch` 浠ヨ幏寰楁洿濂界殑鎬ц兘銆�
+
+```typescript
+// 褰撳墠浠g爜
+watch(() => props.value, (val) => {
+  doubled.value = val * 2;
+});
+
+// 寤鸿淇敼
+const doubled = computed(() => props.value * 2);
+```
+
+鍘熷洜: 璁$畻灞炴�ф湁缂撳瓨锛屽彧鏈変緷璧栧彉鍖栨椂鎵嶉噸鏂拌绠椼��
+```
diff --git a/.claude/skills/vue3-development/SKILL.md b/.claude/skills/vue3-development/SKILL.md
new file mode 100644
index 0000000..06bf8ce
--- /dev/null
+++ b/.claude/skills/vue3-development/SKILL.md
@@ -0,0 +1,155 @@
+---
+name: vue3-development
+description: Vue 3 + TypeScript + Composition API 寮�鍙戣鑼冨拰鏈�浣冲疄璺�
+---
+
+# Vue 3 寮�鍙戞妧鑳�
+
+## 浣曟椂浣跨敤
+
+鍦ㄤ互涓嬪満鏅縺娲绘鎶�鑳斤細
+- 浣跨敤 Composition API 寮�鍙� Vue 3 缁勪欢
+- 涓� Vue 搴旂敤缂栧啓 TypeScript 浠g爜
+- 璁剧疆 Pinia 鐘舵�佸瓨鍌ㄦ垨 Vue Router
+- 浣跨敤缁勫悎寮忓嚱鏁板拰鍝嶅簲寮忕姸鎬�
+- 浼樺寲 Vue 缁勪欢鎬ц兘
+
+## 宸ヤ綔鍘熺悊
+
+姝ゆ妧鑳戒负 Vue 3 寮�鍙戞ā寮忔彁渚涙寚瀵笺��
+
+## 鎶�鏈爤
+
+- **Vue**: 3.5.x 浣跨敤 Composition API
+- **TypeScript**: 瀹屾暣绫诲瀷瀹夊叏
+- **鐘舵�佺鐞�**: Pinia + persistedstate
+- **璺敱**: Vue Router 5.x
+- **琛ㄥ崟楠岃瘉**: VeeValidate + Zod
+- **HTTP 瀹㈡埛绔�**: Axios
+
+## 浠g爜椋庢牸
+
+### 缁勪欢缁撴瀯
+
+```vue
+<script setup lang="ts">
+import { ref, computed, onMounted } from 'vue';
+import type { PropType } from 'vue';
+
+// 浣跨敤 TypeScript 瀹氫箟 Props
+interface Props {
+  title: string;
+  items?: string[];
+}
+
+const props = withDefaults(defineProps<Props>(), {
+  items: () => [],
+});
+
+// 浣跨敤 TypeScript 瀹氫箟 Emits
+interface Emits {
+  (e: 'update', value: string): void;
+  (e: 'delete', id: number): void;
+}
+
+const emit = defineEmits<Emits>();
+
+// 鍝嶅簲寮忕姸鎬�
+const isLoading = ref(false);
+const localData = ref<string | null>(null);
+
+// 璁$畻灞炴��
+const formattedTitle = computed(() => props.title.toUpperCase());
+
+// 鏂规硶
+const handleSubmit = async () => {
+  isLoading.value = true;
+  try {
+    // ...
+  } finally {
+    isLoading.value = false;
+  }
+};
+
+// 鐢熷懡鍛ㄦ湡
+onMounted(() => {
+  // 鍒濆鍖�
+});
+</script>
+
+<template>
+  <div class="component-wrapper">
+    <h1>{{ formattedTitle }}</h1>
+    <slot />
+  </div>
+</template>
+
+<style scoped>
+.component-wrapper {
+  /* scoped 鏍峰紡 */
+}
+</style>
+```
+
+### 缁勫悎寮忓嚱鏁版ā寮�
+
+```typescript
+// composables/useUser.ts
+import { ref, computed } from 'vue';
+import { defineStore } from 'pinia';
+
+export const useUserStore = defineStore('user', () => {
+  const user = ref<User | null>(null);
+  const isLoggedIn = computed(() => !!user.value);
+
+  const login = async (credentials: LoginCredentials) => {
+    // 瀹炵幇
+  };
+
+  const logout = () => {
+    user.value = null;
+  };
+
+  return { user, isLoggedIn, login, logout };
+});
+```
+
+### API 闆嗘垚
+
+```typescript
+// api/user.ts
+import { request } from '#/utils/request';
+
+export const userApi = {
+  getList: (params: UserQuery) => request.get<UserList>('/users', { params }),
+  getById: (id: number) => request.get<User>(`/users/${id}`),
+  create: (data: CreateUserDTO) => request.post<User>('/users', data),
+  update: (id: number, data: UpdateUserDTO) => request.put<User>(`/users/${id}`, data),
+  delete: (id: number) => request.delete(`/users/${id}`),
+};
+```
+
+## 鏈�浣冲疄璺�
+
+### 鎺ㄨ崘
+
+- 鎵�鏈夌粍浠朵娇鐢� `<script setup>` 璇硶
+- 浣跨敤 TypeScript 鎺ュ彛瀹氫箟 props 鍜� emits
+- 浣跨敤缁勫悎寮忓嚱鏁板鐢ㄩ�昏緫
+- 灏藉彲鑳戒娇鐢� `computed` 鑰岄潪 `watch`
+- 璺敱绾х粍浠朵娇鐢� `defineAsyncComponent` 鎳掑姞杞�
+- 淇濇寔缁勪欢鑱岃矗鍗曚竴
+
+### 閬垮厤
+
+- 涓嶈浣跨敤 Options API锛堟帹鑽� Composition API锛�
+- 涓嶈鐩存帴淇敼 props
+- 涓嶈浣跨敤 `any` 绫诲瀷 - 瀹氫箟姝g‘鐨勬帴鍙�
+- 涓嶈蹇樿鍦� `onUnmounted` 涓竻鐞嗗壇浣滅敤
+
+## 鎬ц兘浼樺寲寤鸿
+
+1. 瀵逛簬涓嶉渶瑕佹繁搴﹀搷搴旂殑澶у瀷瀵硅薄浣跨敤 `shallowRef`
+2. 瀵逛簬鏄傝吹鐨勫垪琛ㄦ覆鏌撲娇鐢� `v-memo`
+3. 浣跨敤 `defineAsyncComponent` 鎳掑姞杞界粍浠�
+4. 瀵逛簬闈欐�佸唴瀹逛娇鐢� `v-once`
diff --git a/.claude/vue-component.md b/.claude/vue-component.md
new file mode 100644
index 0000000..13fa224
--- /dev/null
+++ b/.claude/vue-component.md
@@ -0,0 +1,87 @@
+---
+name: vue-component
+description: 鍒涘缓鏂扮殑 Vue 3 缁勪欢锛屽寘鍚� TypeScript 绫诲瀷瀹氫箟鍜屾渶浣冲疄璺�
+allowed_tools: ["Bash", "Read", "Write", "Grep", "Glob"]
+---
+
+# /vue-component
+
+鍒涘缓鏂扮殑 Vue 3 缁勪欢鏃朵娇鐢ㄦ宸ヤ綔娴併��
+
+## 鐩爣
+
+鍒涘缓涓�涓粨鏋勮壇濂界殑 Vue 3 缁勪欢锛屽寘鍚� TypeScript 绫诲瀷銆佹纭殑 props/emit 瀹氫箟锛屽苟閬靛惊椤圭洰瑙勮寖銆�
+
+## 甯哥敤鏂囦欢
+
+- `src/components/**/*.vue`
+- `src/views/**/*.vue`
+- `src/**/components/*.vue`
+
+## 寤鸿姝ラ
+
+1. 鏍规嵁浣滅敤鍩熺‘瀹氱粍浠朵綅缃紙鍏ㄥ眬缁勪欢 vs 鍔熻兘缁勪欢锛�
+2. 鍒涘缓 `.vue` 鏂囦欢锛屼娇鐢� `<script setup lang="ts">`
+3. 瀹氫箟 Props 鍜� Emits 鐨� TypeScript 鎺ュ彛
+4. 浣跨敤 Composition API 瀹炵幇缁勪欢閫昏緫
+5. 娣诲姞妯℃澘鍜屾纭殑缁戝畾
+6. 濡傞渶瑕侊紝娣诲姞 scoped 鏍峰紡
+7. 瀵煎嚭缁勪欢渚涗娇鐢�
+
+## 缁勪欢妯℃澘
+
+```vue
+<script setup lang="ts">
+import { ref, computed } from 'vue';
+
+// Props 瀹氫箟
+interface Props {
+  title: string;
+  disabled?: boolean;
+}
+
+const props = withDefaults(defineProps<Props>(), {
+  disabled: false,
+});
+
+// Emits 瀹氫箟
+interface Emits {
+  (e: 'click', value: string): void;
+}
+
+const emit = defineEmits<Emits>();
+
+// 鍝嶅簲寮忕姸鎬�
+const isActive = ref(false);
+
+// 鏂规硶
+const handleClick = () => {
+  if (!props.disabled) {
+    isActive.value = !isActive.value;
+    emit('click', props.title);
+  }
+};
+</script>
+
+<template>
+  <div
+    class="component-name"
+    :class="{ 'is-active': isActive, 'is-disabled': disabled }"
+    @click="handleClick"
+  >
+    <span>{{ title }}</span>
+    <slot />
+  </div>
+</template>
+
+<style scoped>
+.component-name {
+  /* 鏍峰紡 */
+}
+</style>
+```
+
+## 鍏稿瀷鎻愪氦淇℃伅
+
+- feat: add [缁勪欢鍚峕 component
+- feat: implement [缁勪欢鍚峕 for [鍔熻兘鍚峕
\ No newline at end of file
diff --git a/.claude/vue-page.md b/.claude/vue-page.md
new file mode 100644
index 0000000..95c78f2
--- /dev/null
+++ b/.claude/vue-page.md
@@ -0,0 +1,95 @@
+---
+name: vue-page
+description: 鍒涘缓鏂扮殑椤甸潰/瑙嗗浘锛屽寘鍚� Vue Router 璺敱閰嶇疆
+allowed_tools: ["Bash", "Read", "Write", "Grep", "Glob"]
+---
+
+# /vue-page
+
+鍒涘缓鏂扮殑椤甸潰/瑙嗗浘鏃朵娇鐢ㄦ宸ヤ綔娴併��
+
+## 鐩爣
+
+鍒涘缓鏂扮殑椤甸潰缁勪欢骞跺湪 Vue Router 涓敞鍐岃矾鐢便��
+
+## 甯哥敤鏂囦欢
+
+- `src/views/**/*.vue`
+- `src/router/routes/**/*.ts`
+
+## 寤鸿姝ラ
+
+1. 鍦� `src/views/` 涓嬪垱寤洪〉闈㈢粍浠�
+2. 瀹氫箟璺敱閰嶇疆
+3. 灏嗚矾鐢辨坊鍔犲埌璺敱鍣�
+4. 濡傞渶瑕侊紝娣诲姞椤甸潰鏍囬鍜� meta 淇℃伅
+
+## 椤甸潰妯℃澘
+
+```vue
+<script setup lang="ts">
+import { ref, onMounted } from 'vue';
+import { useRoute } from 'vue-router';
+
+defineOptions({
+  name: 'PageName',
+});
+
+const route = useRoute();
+const loading = ref(false);
+
+onMounted(() => {
+  // 鍒濆鍖栭〉闈㈡暟鎹�
+});
+</script>
+
+<template>
+  <div class="page-container">
+    <a-spin :spinning="loading">
+      <!-- 椤甸潰鍐呭 -->
+      <h1>椤甸潰鏍囬</h1>
+    </a-spin>
+  </div>
+</template>
+
+<style scoped>
+.page-container {
+  padding: 16px;
+}
+</style>
+```
+
+## 璺敱閰嶇疆
+
+```typescript
+// router/routes/module.ts
+import type { RouteRecordRaw } from 'vue-router';
+
+const routes: RouteRecordRaw[] = [
+  {
+    path: '/module',
+    name: 'ModuleList',
+    component: () => import('#/views/module/index.vue'),
+    meta: {
+      title: '妯″潡鍒楄〃',
+      icon: 'mdi:list',
+    },
+  },
+  {
+    path: '/module/:id',
+    name: 'ModuleDetail',
+    component: () => import('#/views/module/detail.vue'),
+    meta: {
+      title: '妯″潡璇︽儏',
+      hideMenu: true,
+    },
+  },
+];
+
+export default routes;
+```
+
+## 鍏稿瀷鎻愪氦淇℃伅
+
+- feat: add [椤甸潰鍚峕 page
+- feat: implement [椤甸潰鍚峕 view
\ No newline at end of file
diff --git a/CLAUDE.md b/CLAUDE.md
new file mode 100644
index 0000000..b6cdce2
--- /dev/null
+++ b/CLAUDE.md
@@ -0,0 +1,94 @@
+# 椤圭洰鎸囧崡
+
+杩欐槸鍩轰簬 **Vue Vben Admin** 鐨勫墠绔」鐩紝浣跨敤 Vue 3 + TypeScript + Vite + Ant Design Vue銆�
+
+## 鎶�鏈爤
+
+- **妗嗘灦**: Vue 3.5 + TypeScript 6.0
+- **鏋勫缓宸ュ叿**: Vite 8.0
+- **UI 缁勪欢**: Ant Design Vue 4.2
+- **鐘舵�佺鐞�**: Pinia 3.0 + persistedstate
+- **璺敱**: Vue Router 5.1
+- **琛ㄥ崟楠岃瘉**: VeeValidate + Zod
+- **HTTP 瀹㈡埛绔�**: Axios
+- **鏍峰紡**: Tailwind CSS 4.3 + SCSS
+- **鍥捐〃**: ECharts 6.1
+- **瀵屾枃鏈紪杈戝櫒**: TinyMCE 7.9, Tiptap 3.26
+- **娴佺▼鍥�**: BPMN.js 18.16
+
+## 椤圭洰缁撴瀯
+
+```
+src/
+鈹溾攢鈹� api/              # API 鎺ュ彛瀹氫箟
+鈹溾攢鈹� components/       # 鍏叡缁勪欢
+鈹溾攢鈹� composables/      # 缁勫悎寮忓嚱鏁�
+鈹溾攢鈹� layouts/          # 甯冨眬缁勪欢
+鈹溾攢鈹� locales/          # 鍥介檯鍖�
+鈹溾攢鈹� router/           # 璺敱閰嶇疆
+鈹溾攢鈹� stores/           # Pinia 鐘舵�佺鐞�
+鈹溾攢鈹� styles/           # 鍏ㄥ眬鏍峰紡
+鈹溾攢鈹� utils/            # 宸ュ叿鍑芥暟
+鈹斺攢鈹� views/            # 椤甸潰缁勪欢
+```
+
+## 寮�鍙戝懡浠�
+
+```bash
+# 寮�鍙�
+pnpm dev
+
+# 鏋勫缓
+pnpm build
+
+# 绫诲瀷妫�鏌�
+pnpm typecheck
+
+# 棰勮鏋勫缓缁撴灉
+pnpm preview
+```
+
+## 浠g爜瑙勮寖
+
+### 缁勪欢鍛藉悕
+
+- 缁勪欢鏂囦欢浣跨敤 PascalCase: `UserList.vue`
+- 缁勪欢 name 浣跨敤 PascalCase: `defineOptions({ name: 'UserList' })`
+
+### TypeScript
+
+- 绂佹浣跨敤 `any` 绫诲瀷
+- Props 鍜� Emits 蹇呴』瀹氫箟 TypeScript 鎺ュ彛
+- 浣跨敤 `import type` 瀵煎叆绫诲瀷
+
+### Vue 缁勪欢
+
+- 缁熶竴浣跨敤 `<script setup lang="ts">` 璇硶
+- Props 浣跨敤 `withDefaults` + `defineProps<T>()`
+- Emits 浣跨敤 `defineEmits<T>()`
+
+### 鏍峰紡
+
+- 浼樺厛浣跨敤 Tailwind CSS 绫�
+- 缁勪欢鏍峰紡浣跨敤 `scoped`
+- 棰滆壊浣跨敤 CSS 鍙橀噺
+
+## 鍙敤鍛戒护
+
+- `/vue-component` - 鍒涘缓鏂扮殑 Vue 缁勪欢
+- `/vue-page` - 鍒涘缓鏂扮殑椤甸潰
+- `/api-service` - 鍒涘缓 API 鏈嶅姟妯″潡
+- `/pinia-store` - 鍒涘缓 Pinia 鐘舵�佸瓨鍌�
+
+## 鍙敤鎶�鑳�
+
+- `vue3-development` - Vue 3 寮�鍙戣鑼�
+- `antd-vue-components` - Ant Design Vue 缁勪欢妯″紡
+- `frontend-code-review` - 鍓嶇浠g爜瀹℃煡鎸囧崡
+
+## 娉ㄦ剰浜嬮」
+
+1. 璺緞鍒悕 `#/*` 鎸囧悜 `./src/*`
+2. 浣跨敤 VeeValidate + Zod 杩涜琛ㄥ崟楠岃瘉
+3. 浣跨敤 `v-dompurify-html` 澶勭悊鐢ㄦ埛杈撳叆鐨� HTML
+4. 鏁忔劅鏁版嵁浣跨敤 `secure-ls` 鍔犲瘑瀛樺偍

--
Gitblit v1.9.3