# CLAUDE.md This file provides guidance to Claude Code (claude.ai/code) when working with code in this repository. ## 项目概述 基于 [yudao-ui-admin-vue3](https://gitee.com/yudaocode/yudao-ui-admin-vue3) 的中后台管理前端项目(名为 keyLove),采用 Vue 3 + Vite + Element Plus + TypeScript 技术栈。前端对接芋道后端 Java 服务(Spring Boot / Spring Cloud),通过 RESTful API (`/admin-api`) 通信。 ## 常用命令 ```bash # 安装依赖(强制使用 pnpm) pnpm install # 本地开发(使用 .env.local 配置) pnpm dev # 连接远程开发环境后端 pnpm dev-server # TypeScript 类型检查 pnpm ts:check # 构建 pnpm build:local # 本地构建 pnpm build:dev # 开发环境 pnpm build:prod # 生产环境 # 代码规范 pnpm lint:eslint # ESLint 检查并修复 pnpm lint:format # Prettier 格式化 pnpm lint:style # Stylelint 样式检查 ``` 要求:Node.js >= 16.18.0,pnpm >= 8.6.0。 ## 架构概览 ### 入口与初始化 `src/main.ts` 按序初始化:i18n → Pinia Store → 全局组件 → Element Plus → FormCreate → Router → 指令(权限、焦点)→ WangEditor 插件 → 挂载。 ### 路由与权限系统 - **静态路由**:`src/router/modules/remaining.ts` 定义登录、重定向、404 等固定页面 - **动态路由**:后端返回菜单数据,`src/store/modules/permission.ts` 中的 `generateRoutes()` 将其转换为路由并通过 `router.addRoute()` 动态注册 - **路由守卫**:`src/permission.ts` 实现 beforeEach 守卫,处理 token 校验、用户信息加载、动态路由注入 - **组件动态加载**:`src/utils/routerHelper.ts` 使用 `import.meta.glob('../views/**/*.{vue,tsx}')` 按路径自动匹配视图组件 - **权限指令**:`v-hasPermi` 和 `v-hasRole`(`src/directives/permission/`)用于按钮级权限控制 ### HTTP 请求层 - **封装位置**:`src/config/axios/` 目录 - `config.ts`:基础配置,baseURL = `VITE_BASE_URL + VITE_API_URL` - `service.ts`:Axios 实例,包含请求拦截(token 注入、租户 ID 头、API 加密)和响应拦截(401 无感刷新 token、错误码统一处理) - `index.ts`:导出 `request` 对象,提供 `get/post/put/delete/download/upload` 方法 - **调用方式**:`import request from '@/config/axios'`,然后 `request.get({ url, params })` / `request.post({ url, data })` ### API 模块约定 API 文件按业务域组织在 `src/api/{模块}/{子模块}/index.ts`,每个文件: 1. 定义 TypeScript VO 接口(如 `TenantVO`)和请求参数接口 2. 导出具名函数(如 `getTenantPage`、`createTenant`、`updateTenant`、`deleteTenant`) 3. 使用 `request.get/post/put/delete` 调用后端接口 主要业务域:`system`(系统管理)、`infra`(基础设施)、`bpm`(工作流)、`crm`、`erp`、`mall`(商城)、`ai`、`iot`、`pay`(支付)、`mp`(微信公众号) ### 状态管理 Pinia Store 位于 `src/store/modules/`,使用 `pinia-plugin-persistedstate` 持久化: - `user.ts`:用户信息、登录状态 - `permission.ts`:动态路由、菜单 - `dict.ts`:数据字典缓存 - `app.ts`:应用全局状态(布局、主题等) - `tagsView.ts`:标签页导航 - `locale.ts`:语言设置 每个 Store 导出 `useXxxStoreWithOut()` 函数,用于在 setup 外部获取 Store 实例。 ### 视图页面约定 视图文件在 `src/views/{模块}/` 下,典型的 CRUD 页面结构: - `index.vue`:列表页,包含搜索表单 + 数据表格 + 分页,使用 `ContentWrap` 组件包裹 - `{Entity}Form.vue`:新增/编辑表单弹窗 - 使用 `` 全局图标组件(Iconify) - 使用 `v-hasPermi="['module:entity:action']"` 控制按钮权限 - 使用 `getIntDictOptions(DICT_TYPE.XXX)` 获取字典数据渲染下拉框 ### 环境变量 - `.env`:通用配置(应用标题、端口、租户开关、验证码开关等) - `.env.local`:本地开发(连接本地后端,`VITE_BASE_URL` 指向本地服务) - `.env.dev`:远程开发环境 - `.env.prod`:生产环境 关键变量: - `VITE_BASE_URL`:后端 API 根地址 - `VITE_API_URL`:API 路径前缀(默认 `/admin-api`) - `VITE_APP_TENANT_ENABLE`:多租户开关 - `VITE_APP_CAPTCHA_ENABLE`:验证码开关 ### 核心工具 - `src/utils/auth.ts`:Token 存取(AccessToken / RefreshToken / TenantId) - `src/utils/dict.ts`:字典工具函数(`getDictOptions`、`getIntDictOptions`) - `src/utils/routerHelper.ts`:路由生成与组件动态加载 - `src/utils/formatter.ts`:数据格式化 - `src/utils/download.ts`:文件下载 - `src/utils/tree.ts`:树形数据处理 - `src/hooks/web/useTable.ts`:表格数据加载 Hook - `src/hooks/web/useCrudSchemas.ts`:CRUD Schema 配置 Hook ### 样式系统 - UnoCSS 原子化 CSS(可在模板中直接使用如 `class="!w-240px mb-15px"`) - SCSS 变量:`src/styles/variables.scss`(通过 Vite 全局注入) - 全局样式入口:`src/styles/index.scss` ### 国际化 `src/locales/` 下 `zh-CN.ts` 和 `en.ts`,通过 `vue-i18n` 实现。组件中使用 `useI18n()` 的 `t()` 函数。 ### 路径别名 `@/` 映射到 `src/`(在 `vite.config.ts` 和 `tsconfig.json` 中均配置)。