7.7 KiB
CLAUDE.md
This file provides guidance to Claude Code (claude.ai/code) when working with code in this repository.
Project Overview
JeecgBoot Vue3 frontend — an enterprise low-code platform built with Vue 3 + Vite 6 + Ant Design Vue 4 + TypeScript. Uses pnpm as package manager. Node 18 or 20+ required (engines: "^18 || >=20").
Common Commands
pnpm dev # Start dev server (port 3100, mock enabled)
pnpm build # Production build (output: dist/)
pnpm build:docker # Docker production build
pnpm build:dockercloud # Docker cloud production build
pnpm build:report # Build with bundle visualizer
pnpm preview # Build + preview
# Linting (no unified "lint" script — run individually)
npx eslint src/path/to/file.vue # Lint specific file
npx stylelint "src/**/*.{vue,less,css}" # Stylelint
pnpm batch:prettier # Format all src files
# Testing (Jest configured but not integrated into npm scripts)
# Tests exist in tests/ directory but no test script in package.json
# Run manually if needed: npx jest
pnpm clean:cache # Clear Vite cache
pnpm gen:icon # Regenerate icon data
pnpm reinstall # Clean reinstall all dependencies
Path Aliases
/@/and@/→src//#/and#/→types/~icons/{collection}/{name}→ unplugin-icons (compile-time icon imports)
The /@/ prefix (with leading slash) is the project's conventional alias — prefer it for consistency.
Architecture
Bootstrap Sequence (src/main.ts)
createApp → createRouter → setupStore (pinia) → setupProps → i18n → initAppConfigStore → registerPackages (@jeecg/online) → registerGlobComp (core Ant Design components) → SSO login → registerSuper (dynamic module discovery) → setupRouter → guards → directives → error handler → registerThirdComp (vxe-table, emoji, dayjs) → setupElectron → router.isReady() → mount
Routing & Permissions
- Permission mode: BACK — routes and menus are fetched from the backend API via
getBackMenuAndPerms() - Dynamic routes added at runtime in
src/store/modules/permission.ts - Static routes: login, oauth2-login, token-login, error pages, AI dashboard
- Router mode: HTML5 history (hash mode when running in Electron)
- Super modules discovered dynamically via
import.meta.glob('./**/register.ts')insrc/views/super/registerSuper.ts
State Management (Pinia)
Key stores in src/store/modules/:
user.ts(app-user) — auth token, user info, roles, tenant, dict itemspermission.ts(app-permission) — dynamic routes, permission codes, backend menusapp.ts(app) — project config, theme, layout settingslocale.ts(app-locale) — i18n localemultipleTab.ts(app-multiple-tab) — tab state
Auth persisted in localStorage via src/utils/auth/index.ts.
API Layer
- Custom Axios wrapper:
src/utils/http/axios/— configured instance exported asdefHttp - All requests signed with MD5 via
signMd5Utils - Tenant ID injected as header when
VITE_GLOB_TENANT_MODEis enabled - Response format:
{ code, result, message, success }wherecode === 200is success
Component Registration
- Auto-import:
unplugin-vue-componentswithAntDesignVueResolverauto-imports all Ant Design Vue components (no manual import needed in templates) - Global manual:
registerGlobComp.tsregisters Icon, AIcon, JUploadButton, Button, TinyMCE Editor - Third-party:
registerThirdComp.tsregisters vxe-table (full import), custom vxe cell components, emoji picker, dayjs plugins - Async loading: Heavy components use
src/utils/factory/createAsyncComponent.tsx
Icon System
Three icon approaches:
- Iconify runtime —
<Icon icon="mdi:home" />via@iconify/iconifyCDN lazy-load - SVG sprites —
<Icon icon="icon-name|svg" />viavite-plugin-svg-icons - unplugin-icons —
import IconName from '~icons/collection/name'for compile-time tree-shaken icons
Theme System
- Less variables generated by
build/generate/generateModifyVars.ts - Dark mode via Ant Design Vue
theme.darkAlgorithm - CSS variable
--j-global-primary-colorset dynamically from theme color - CSS class prefix:
jeecg(defined insrc/settings/designSetting.ts)
External Packages
@jeecg/onlineand@jeecg/aifloware external monorepo packages excluded from Vite optimizeDeps (CJS compatibility issues)- Registered via
registerPackages(app)in main.ts
Performance Optimization Patterns
Critical: Use dynamic imports for non-critical modules
- Static
importat top of file causes the entire dependency chain to load on initial page - Use
await import('module')orimport('path/to/module').then()for lazy loading - Key files using dynamic imports:
src/settings/registerThirdComp.ts— vxe-table, emoji picker (loaded after mount)src/views/super/registerSuper.ts— dynamic module discovery- Non-critical Ant Design Vue components loaded asynchronously
Vite optimizeDeps
- Pre-bundled dependencies in
vite.config.tsinclude: dayjs, axios, pinia, nprogress, qs, crypto-js, md5, sortablejs, xe-utils, vue-i18n, lodash-es, xss, mockjs - External packages (
@jeecg/*) excluded due to CJS issues
Micro-Frontend (Qiankun)
- Can run as master (hosting sub-apps) or child (embedded in parent)
- Config in
src/qiankun/, sub-apps viaVITE_APP_SUB_*env vars - Child mode activated when
VITE_GLOB_QIANKUN_MICRO_APP_NAMEis set
Electron Support
src/electron/— uses hash router mode- Platform detected via
VITE_GLOB_RUN_PLATFORM === 'electron'
Key Configuration
Environment Variables
.env— base config (port 3100, app title, SSO/qiankun flags).env.development— mock enabled, proxy tolocalhost:8080/jeecg-boot.env.production— mock disabled, gzip compression.env.docker— Docker production build config.env.dockercloud— Docker cloud production build config.env.prod_electron— Electron production build configVITE_GLOB_*vars are injected at runtime viadist/_app.config.js(changeable post-build)
Build
- Manual chunks:
vue-vendor,antd-vue-vendor,vxe-table-vendor,emoji-mart-vue-fast,china-area-data-vendor - Post-build:
build/script/postBuild.tsgenerates runtime config;copyChat.tscopies chat assets - Console/debugger stripped in production via esbuild
Code Style
- Prettier: 150 char width, single quotes, trailing commas (es5), 2-space indent,
endOfLine: 'auto',vueIndentScriptAndStyle: true(indent inside<script>/<style>),htmlWhitespaceSensitivity: 'strict' - ESLint: Vue3 recommended + TypeScript recommended + Prettier.
anyis allowed. Unused vars prefixed with_are ignored. Note:prettier/prettierrule is'off'— Prettier is not enforced via ESLint, run it separately - Commits: Conventional commits enforced via commitlint. Types: feat, fix, perf, style, docs, test, refactor, build, ci, chore, revert, wip, workflow, types, release. Max header: 108 chars
- i18n: Chinese (zh-CN) and English supported. Locale files in
src/locales/lang/
Important Directories
build/ # Vite plugins, build scripts, theme generation
src/api/ # API definitions (sys/, common/, demo/)
src/components/jeecg/ # Jeecg-specific components (JVxeTable, OnLine, etc.)
src/layouts/default/ # Main app layout (header, sider, tabs, menu)
src/settings/ # Project settings (design, components, locale, encryption)
src/utils/http/axios/ # HTTP client configuration
src/views/system/ # System management pages (user, role, menu, dict, etc.)
src/views/super/ # Dynamically-discovered extension modules
types/ # Global TypeScript declarations