# CLAUDE.md
本文档为 Claude Code (claude.ai/code) 在此仓库中处理代码时提供指导。
## 项目概述
RuoYi-Vue 3.9.0 —— 一个 Vue 3 企业级后台管理系统(若依管理系统)。此为**前端**项目;通过 Vite 代理 REST API 连接到 Java Spring Boot 后端。
## 命令
- `npm run dev` —— 启动开发服务器(端口 80,将 `/dev-api` 代理到 `http://localhost:8081`)
- `npm run build:prod` —— 生产环境构建(输出目录:`dist/`)
- `npm run build:stage` —— 预发布环境构建
- `npm run preview` —— 预览生产构建产物
未配置任何测试框架。
## 架构
### 技术栈
Vue 3.5 + Vite 6 + Pinia 3 + Vue Router 4 + Element Plus 2.10 + Axios。使用 `unplugin-auto-import`,因此无需手动导入 Vue/Pinia API(如 ref、computed、defineStore 等)。
### 路径别名
- `@` → `./src`
- `~` → 项目根目录
### 主要目录
- `src/api/` —— 按后端领域组织的 API 模块(system/、monitor/、tool/)
- `src/views/` —— 页面组件,与 API 模块结构对应
- `src/store/modules/` —— Pinia 存储:`user`、`permission`、`app`、`settings`、`tagsView`、`dict`
- `src/layout/` —— 外壳布局(侧边栏、导航栏、标签视图、主内容区)
- `src/components/` —— 全局组件,在 main.js 中注册(Pagination、DictTag、Editor、FileUpload、ImageUpload、ImagePreview、RightToolbar)
- `src/plugins/` —— 插件系统:auth、cache、modal、tab、download
- `src/directive/` —— 自定义 Vue 指令(基于权限的元素可见性)
- `src/utils/` —— 共享工具函数(request.js、auth.js、ruoyi.js、validate.js、dict.js)
- `vite/` —— Vite 插件配置(auto-import、svg-icons、compression、setup-extend)
### 路由与权限
路由是**从后端动态加载**的(`GET /getRouters`)。系统包含两种路由类型:
- `src/router/index.js` 中的 `constantRoutes` —— 公共路由(登录、注册、404、401、首页)
- 动态路由 —— 从后端 API 获取,通过 `src/store/modules/permission.js` 中的 `filterAsyncRouter()` 转换为 Vue Router 路由
组件解析使用 `import.meta.glob('./../../views/**/*.vue')`,将后端返回的路由组件字符串(如 `"system/user/index"`)映射到实际的 Vue 组件。
三种特殊组件类型:`Layout`(主外壳)、`ParentView`(嵌套路由包装器)、`InnerLink`(iframe 嵌入)。
路由 meta 选项:`hidden`、`alwaysShow`、`noCache`、`title`、`icon`、`breadcrumb`、`activeMenu`、`roles`、`permissions`。
### 认证流程
1. JWT 令牌通过 js-cookie 存储在 cookie 中(`Admin-Token`)
2. `src/permission.js` —— 全局路由守卫,每次导航时检查令牌
3. 首次认证导航时:获取用户信息(`/getInfo`),生成动态路由
4. 令牌通过 axios 拦截器以 `Authorization: Bearer {token}` 头部注入
5. 权限检查:`*:*:*` = 全部权限,`admin` = 超级管理员角色
6. 权限格式遵循 `模块:实体:操作` 模式(例如 `system:user:edit`)
### API 层(`src/utils/request.js`)
- Axios 实例,基础 URL 来自环境变量 `VITE_APP_BASE_API`
- 10 秒超时
- 防重复提交:1 秒内阻止相同的 POST/PUT 请求
- 响应码:200=成功,401=会话过期(自动弹出注销提示),500=错误,601=警告
- `download()` 导出方法,处理带 blob 验证的文件下载
### 环境文件
- `.env.development` —— `VITE_APP_BASE_API = '/dev-api'`
- `.env.production` —— `VITE_APP_BASE_API = '/prod-api'`
- `.env.staging` —— 预发布环境配置
- 后端代理目标在 `vite.config.js` 中配置(`baseUrl` 变量)
### 全局属性(可通过 Options API 的 `this.` 或 `getCurrentInstance()` 访问)
`useDict`、`download`、`parseTime`、`resetForm`、`handleTree`、`addDateRange`、`getConfigKey`、`selectDictLabel`、`selectDictLabels`
### SVG 图标
将 SVG 文件放在 `src/assets/icons/svg/` 目录下。它们会通过 `vite-plugin-svg-icons` 自动注册,使用时用 ``。
## 约定
- 全项目使用中文语言环境(Element Plus zh-cn、界面文本、注释)
- API 模块为每个端点导出独立的函数(例如 `listUser`、`getUser`、`addUser`、`updateUser`、`delUser`)
- 视图遵循 CRUD 模式:带有搜索表单、表格和添加/编辑对话框的列表页
- 字典值通过 `useDict()` 组合式函数加载,并使用 `` 组件显示
- 组件尺寸存储在 cookie(`size`)中,默认值为 `'default'`
- UI 设置在 `src/settings.js` 中可配置(侧边栏主题、标签视图、顶部导航、固定头部、Logo、页脚)