# CLAUDE.md This file provides guidance to Claude Code (claude.ai/code) when working with code in this repository. ## Project Overview RuoYi-Vue-Plus frontend — a multi-tenant admin management system. Built with **Vue 3 + TypeScript + Vite + Element Plus + Pinia + UnoCSS**. The backend is a Java/Spring Boot service (separate repo). ## Project Directory Structure High-level map of the repository (excluding `node_modules/`, `dist/`, and `.git/`). The app boots from **`index.html`** → **`src/main.ts`** → **`src/App.vue`**. ### Repository root | Path | Purpose | |------|---------| | `src/` | All Vue application source | | `public/` | Static assets served as-is by Vite (favicon, etc.) | | `vite/` | Vite config fragments; **`vite/plugins/`** holds custom plugins (auto-import, icons, compression, etc.) | | `bin/` | Optional shell/helper scripts | | `html/` | Extra static HTML assets used by the project | | `.claude/` | Local Claude Code agents, rules, skills (optional; may be gitignored in some clones) | | `CLAUDE.md` | AI / contributor guidance for this repo | | `vite.config.ts` | Vite entry config | | `tsconfig.json` | TypeScript compiler options | | `uno.config.ts` | UnoCSS utility config | | `eslint.config.ts` | ESLint flat config | | `.env.development` / `.env.production` | `VITE_*` environment variables | | `package.json` / `pnpm-lock.yaml` | Dependencies and scripts (pnpm) | | `README.md` | Human-oriented project readme | | `LICENSE` | License file | | `.editorconfig` / `.prettierrc` / `.prettierignore` | Editor & Prettier defaults | | `.eslintrc-auto-import.json` | ESLint metadata for auto-imported globals | ### `.claude/` (local only, gitignored) Not committed to the repo; present on some dev machines for Claude Code: - `agents/` — agent prompt files (e.g. `jarvis.md`) - `commands/` — custom slash commands - `rules/` — extra coding rules - `skills/` — reusable skill docs (e.g. `mock-data`, `vue3-admin`) ### `src/` — top-level files | File | Purpose | |------|---------| | `main.ts` | App bootstrap, global styles, plugin registration | | `App.vue` | Root component | | `permission.ts` | Router navigation guard (token, dynamic routes, progress bar) | | `settings.ts` | Default layout / UI settings | | `animate.ts` | Transition / animation helpers (if used by layout) | ### `src/api/` — HTTP clients (mirrors backend modules) Organized by business area; each folder usually has `index.ts` and sometimes `types.ts`. | Area | Folders | |------|---------| | **System** | `system/` — user, role, menu, dept, post, dict, config, notice, oss, ossConfig, tenant, tenantPackage, client, social, … | | **Monitor** | `monitor/` — online, operlog, loginInfo, cache | | **Tool** | `tool/gen/` — code generation | | **Workflow** | `workflow/` — category, definition, instance, task, leave, spel, workflowCommon | | **Demo** | `demo/demo`, `demo/tree` | | **Project extensions** | `WarningList/`, `equipmentList/`, `fileList/`, `systemList/` — domain-specific APIs alongside RuoYi modules | | **Other** | `menu.ts` — menu-related calls at API root | ### `src/views/` — routed pages Lazy-loaded via `import.meta.glob` in the permission store. Mirrors `src/api/` layout: - **`system/`** — CRUD pages for users, roles, menus, tenants, dict, OSS, etc. - **`monitor/`** — online users, operlog, logininfor, cache, admin, snailjob - **`tool/gen/`** — generator UI - **`workflow/`** — process definition/instance, tasks, leave, spel, category - **`demo/`** — sample pages - **`error/`** — 404 and error views - **`redirect/`** — redirect helper route - **Extensions** — `WarningList/`, `equipmentList/`, `fileList/`, `systemList/` (e.g. `systemList/user`, `base`, `password`, `role`) - **Root views** — `login.vue`, `register.vue`, `index.vue` (home/dashboard) ### `src/components/` — shared Vue components Reusable UI (each subfolder is typically a small component package): `Breadcrumb`, `DictTag`, `Editor`, `FileUpload`, `ImageUpload`, `ImagePreview`, `Pagination`, `SvgIcon`, `IconSelect`, `Process` (workflow), `UserSelect`, `RoleSelect`, `LangSelect`, `SizeSelect`, `Screenfull`, `Hamburger`, `iFrame`, `TopNav`, `RightToolbar`, `ParentView`, `RuoYiDoc`, `RuoYiGit`, etc. ### `src/layout/` — application shell - **`index.vue`** — main layout wrapper - **`components/`** — `AppMain`, `Navbar`, `Sidebar/` (menu, logo, items), `TagsView`, `Settings`, `TopBar`, `notice`, `IframeToggle`, `InnerLink`, `SocialCallback` ### `src/store/modules/` — Pinia stores `user`, `permission`, `settings`, `tagsView`, `dict`, `notice`, `app`, etc. (see Architecture table below). ### Other `src/` directories | Path | Purpose | |------|---------| | `router/` | Static route table; dynamic routes appended at runtime | | `plugins/` | `index.ts` registers global properties (`$tab`, `$modal`, `$download`, …) | | `directive/` | `permission/` (v-hasPermi, v-hasRoles), `common/` | | `utils/` | `request.ts`, crypto, theme, ruoyi helpers, websocket, SSE, … | | `lang/` | i18n messages (`zh_CN`, `en_US`) and `index.ts` | | `hooks/` | Composables (e.g. `useDialog`) | | `enums/` | Shared enums (HTTP codes, etc.) | | `types/` | Global `.d.ts` and TS augmentations | | `assets/` | `logo/`, `images/`, `icons/svg/`, `styles/` (global SCSS) | ### Directory tree (compact) ``` Visualize/ ├── bin/ ├── html/ ├── public/ ├── vite/ │ └── plugins/ # auto-import, icons, compression, … ├── src/ │ ├── api/ # REST modules by domain (+ WarningList, equipmentList, …) │ ├── assets/ # images, svg icons, logo, scss │ ├── components/ # shared UI (see list above) │ ├── directive/ │ ├── enums/ │ ├── hooks/ │ ├── lang/ │ ├── layout/ # shell + layout/components/* │ ├── plugins/ │ ├── router/ │ ├── store/modules/ │ ├── types/ │ ├── utils/ │ ├── views/ # pages: system, monitor, workflow, tool, demo, … │ ├── App.vue │ ├── main.ts │ ├── permission.ts │ └── settings.ts ├── CLAUDE.md ├── index.html ├── package.json ├── uno.config.ts ├── vite.config.ts └── tsconfig.json ``` ## Commands ```bash # Install dependencies (pnpm is used, despite docs mentioning npm) pnpm install --registry=https://registry.npmmirror.com # Dev server on port 80, proxies /dev-api to localhost:8080 pnpm dev # Production build pnpm build:prod # Linting pnpm lint:eslint # check only pnpm lint:eslint:fix # auto-fix pnpm prettier # format all files # Preview production build pnpm preview ``` There are no tests configured in this project. ## Architecture ### Permission & Routing The routing system is permission-driven: 1. [src/permission.ts](src/permission.ts) is the navigation guard. On first visit with a valid token, it calls `useUserStore().getInfo()` to fetch roles/permissions, then `usePermissionStore().generateRoutes()` to build dynamic routes from the backend menu API. 2. [src/router/index.ts](src/router/index.ts) defines `constantRoutes` (login, 404, redirect, home) and an empty `dynamicRoutes` array. Dynamic routes returned from the backend are added via `router.addRoute()`. 3. The backend returns route metadata as JSON; [src/store/modules/permission.ts](src/store/modules/permission.ts) maps component strings like `'Layout'`, `'ParentView'` to actual Vue components, and lazy-loads view components via `import.meta.glob('./../../views/**/*.vue')`. 4. Route guards check `roles` and `permissions` arrays on each user. Button-level permission uses the `v-hasPermi` / `v-hasRoles` directives defined in [src/directive/permission/](src/directive/permission/). ### API Layer & Encryption - [src/utils/request.ts](src/utils/request.ts): Axios instance with interceptors for token injection, repeat-submit prevention (session-based, 500ms window), and optional RSA+AES body encryption (`VITE_APP_ENCRYPT=true`). Response interceptor handles 401 → re-login prompt, error code mapping from [src/enums/RespEnum.ts](src/enums/RespEnum.ts). - [src/utils/crypto.ts](src/utils/crypto.ts): AES key generation, encrypt/decrypt utilities. - [src/utils/jsencrypt.ts](src/utils/jsencrypt.ts): RSA encrypt/decrypt for the AES key exchange header. - API modules are organized under [src/api/](src/api/) mirroring backend controllers: `system/`, `monitor/`, `tool/`, `workflow/`, `demo/`, plus project-specific folders (e.g. `WarningList/`, `equipmentList/`) — see **Project Directory Structure**. ### State Management (Pinia) | Store module | Purpose | |---|---| | `app` | Sidebar toggle, device type, language locale, element size | | `user` | Token, roles, permissions, login/logout/getInfo | | `permission` | Dynamic route generation from backend menu data | | `settings` | Layout config (theme, nav layout, tagsView, etc.), persisted to localStorage | | `tagsView` | Open page tabs state | | `dict` | Data dictionary cache | | `notice` | Notification/websocket state | ### Global Plugins & Directives [src/plugins/index.ts](src/plugins/index.ts) installs these on `app.config.globalProperties`: - `$tab` — page tab operations - `$modal` — modal dialogs - `$cache` — session/local storage helpers - `$download` — file download with loading indicator - `$auth` — permission check methods (`hasPermi`, `hasRole`, etc.) - Utility functions: `useDict`, `parseTime`, `addDateRange`, `handleTree`, `selectDictLabel` Custom directives (v-hasPermi, v-hasRoles, v-copyText) registered in [src/directive/index.ts](src/directive/index.ts). ### Layout [src/layout/index.vue](src/layout/index.vue) is the main layout shell. Key sub-components: - `Sidebar/` — left sidebar menu (renders from `permissionStore.sidebarRouters`) - `Navbar.vue` — top bar with breadcrumb, user menu, fullscreen toggle - `TagsView/` — tabbed page navigation - `Settings/` — layout configuration drawer - `TopBar/` — alternative top-navigation bar layout ### Views & API Organization `src/views/` and `src/api/` are organized by business domain: - `system/` — Users, roles, menus, departments, tenants, dictionary, config, notices, OSS - `monitor/` — Online users, operation logs, login logs, cache monitoring, admin/snail-job dashboards - `workflow/` — Process definitions, instances, tasks, categories - `tool/` — Code generation - `demo/` — Demo/example pages - **This repo also adds** `WarningList/`, `equipmentList/`, `fileList/`, `systemList/` under both `views/` and `api/` (see **Project Directory Structure** above). ### Styling - [UnoCSS](https://unocss.dev) for utility-first CSS (see [uno.config.ts](uno.config.ts)) - Element Plus with SCSS preprocessing - Dark mode via Element Plus CSS vars (`element-plus/theme-chalk/dark/css-vars.css`) - Theme color configurable in settings, applied in [src/utils/theme.ts](src/utils/theme.ts) ### i18n Vue I18n with `zh_CN` (default) and `en_US` in [src/lang/](src/lang/). Language preference persisted to localStorage. ## Key Conventions - Path alias `@/` maps to `src/` - `@/` is used for all internal imports - Environment variables prefixed with `VITE_APP_` are available via `import.meta.env` - Vite dev server proxies `VITE_APP_BASE_API` (default `/dev-api`) to `http://localhost:8080` - `.claude/` is listed in [`.gitignore`](.gitignore) and is not committed; **`CLAUDE.md` at repo root is tracked** and documents this project for AI / contributors.