diff --git a/.gitignore b/.gitignore index 99220a4..b08bd6e 100644 --- a/.gitignore +++ b/.gitignore @@ -1,4 +1,3 @@ -CLAUDE.md .DS_Store .history node_modules/ diff --git a/CLAUDE.md b/CLAUDE.md new file mode 100644 index 0000000..8c34d5c --- /dev/null +++ b/CLAUDE.md @@ -0,0 +1,247 @@ +# 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.