A complete operational and architectural reference for JeecgBoot 3.9.2 — the boot3 line built on Spring Boot 3.5.5 and Java 17. This guide is for administrators, DevOps engineers, architects, and developers who deploy, configure, secure, operate, and extend JeecgBoot. It is the source-based companion to the User Guide (which covers day-to-day feature usage).
Note
Versions in this guide are taken from the actual
pom.xmland configuration files at commit3f826c4(2026-05-21), not the project README — the README in this snapshot still lists the older Spring Boot 2.7 stack and is stale for theboot3branch.
1. Executive Summary
JeecgBoot is an enterprise low-code / AI development platform. It combines a Java backend (Spring Boot 3, optionally Spring Cloud Alibaba microservices) with a Vue 3 frontend and a code generator, plus a large suite of low-code tools: Online Forms, JimuReport reporting, JimuBI dashboards, a form/process designer, and an AI module (chat, RAG knowledge base, AI workflow).
Key architectural facts an operator must know:
| Aspect | Value |
|---|---|
| Backend framework | Spring Boot 3.5.5, Java 17 (17/21/24/25 supported) |
| Microservice stack | Spring Cloud 2025.0.0 + Spring Cloud Alibaba 2023.0.3.3, Nacos 2.0.4 |
| Persistence | MyBatis-Plus 3.5.12, dynamic-datasource 4.3.1, Druid 1.2.24 |
| Security | Apache Shiro 2.0.5 (jakarta) + JWT (java-jwt 4.5.0), stateless tokens |
| Cache / lock | Redis (jedis 3.8.0), Redisson distributed locks |
| Scheduling | Quartz (clustered, JDBC store) + xxl-job 2.4.1 |
| Messaging | RabbitMQ, RocketMQ (microservice mode) |
| Reporting | JimuReport 2.3.4, JimuBI 2.3.2, AutoPoi 2.0.4 |
| AI | langchain4j 1.12.2 (OpenAI/Ollama/Gemini/Zhipu/Qianfan/DashScope/Anthropic), pgvector |
| Frontend | Vue 3 + TypeScript + Vite 6 + Ant Design Vue + Pinia + ECharts |
| Default monolith port | 8080, context path /jeecg-boot |
| Default credentials | admin / 123456 |
| License | Apache License 2.0 |
Deployment shapes: a single Spring Boot process (monolith, port 8080) or a set of Spring Cloud microservices behind a gateway (port 9999) with Nacos service discovery. The same business code runs in both; which one is active is decided at runtime by the presence of service-discovery configuration.
Important
JeecgBoot ships with development-friendly defaults that are unsafe for production: default credentials, exposed Druid/Knife4j consoles, verbose error stack traces, permissive CORS, and
lowCodeMode: dev. §5 (Security) lists every one and how to harden it. Do not expose a default install to the internet.
2. Architecture
2.1 High-level topology (monolith)
Browser (Vue 3 SPA, :3100 dev / nginx :80 prod)
│ REST + X-Access-Token (JWT)
▼
┌──────────────────────────────────────────┐
│ jeecg-system-start (Spring Boot, :8080) │
│ context-path /jeecg-boot │
│ │
│ Shiro JWT filter chain ── CORS filter │
│ Controllers → Services → MyBatis-Plus │
│ Quartz scheduler · WebSocket endpoints │
└───────┬───────────────┬───────────┬───────┘
│ │ │
▼ ▼ ▼
MySQL/… Redis File store
(dynamic DS) (cache/lock) local/MinIO/OSS
│
(optional) PostgreSQL+pgvector ← AI RAG
2.2 High-level topology (microservices)
Browser ─▶ Gateway (:9999) ─▶ Nacos (:8848 registry+config)
│
├─▶ jeecg-system-cloud-start (:7001)
├─▶ jeecg-demo-cloud-start (:7002)
├─▶ Sentinel (:9000) flow control
├─▶ xxl-job (:9080) distributed jobs
├─▶ Spring Boot Admin / Monitor (:9111)
└─▶ RabbitMQ / RocketMQ / Seata / ShardingSphere (optional)
Inter-service calls use OpenFeign; resilience via Sentinel; config and discovery via Nacos; distributed transactions via Seata; sharding via ShardingSphere.
2.3 Maven module layout
jeecg-boot-parent (org.jeecgframework.boot3:3.9.2)
├─ jeecg-boot-base-core Core: config, security, MyBatis-Plus, utils, AI config beans
├─ jeecg-module-system
│ ├─ jeecg-system-biz System business logic (users, roles, menus, dict, online, jimureport)
│ ├─ jeecg-system-start ★ MONOLITH entry point (port 8080)
│ └─ jeecg-system-api
│ ├─ jeecg-system-local-api API interfaces for monolith (in-process)
│ └─ jeecg-system-cloud-api API interfaces for microservices (OpenFeign)
├─ jeecg-boot-module
│ ├─ jeecg-module-demo Example business module (CRUD samples)
│ └─ jeecg-boot-module-airag AI module: langchain4j, RAG, aiflow (liteflow), tools
└─ jeecg-server-cloud (active only under -PSpringCloud profile)
├─ jeecg-cloud-gateway Gateway (9999)
├─ jeecg-cloud-nacos Embedded Nacos (8848)
├─ jeecg-system-cloud-start System microservice (7001)
├─ jeecg-demo-cloud-start Demo microservice (7002)
└─ jeecg-visual
├─ jeecg-cloud-monitor Spring Boot Admin (9111)
├─ jeecg-cloud-xxljob xxl-job admin (9080)
├─ jeecg-cloud-sentinel Sentinel dashboard (9000)
└─ jeecg-cloud-test Samples: rabbitmq, rocketmq, seata, shardingsphere
Note
The
-Pdevprofile activates only the monolith modules. The-PSpringCloudprofile (active by default in the parent POM via anactiveByDefaultprofile) addsjeecg-server-cloud. Use-Pdev,SpringCloudto build the cloud stack.
2.4 Monolith vs. microservice switching
This is decided by a Spring Condition reading CommonConstant.CLOUD_SERVER_KEY from the environment:
JeecgCloudCondition— beans annotated with it load only when service-discovery config is present (microservice mode).CorsFilterCondition— the in-appCorsFilterloads only when service discovery is absent (monolith mode). In microservice mode, CORS is the gateway's job.
So the same codebase self-configures based on whether it finds Nacos/cloud config. No code change is needed to switch — only the build profile and runtime config.
2.5 Request lifecycle (backend)
HTTP request → CORS filter (monolith only)
→ Shiro filter chain
├─ anon paths (login, register, thirdLogin, sms, captcha) → pass
└─ protected paths → JwtFilter validates X-Access-Token
→ stateless (noSessionCreation), authz cached in Redis
→ @RestController (org.jeecg.modules.*)
→ @Service (IService / MyBatis-Plus)
→ Mapper (BaseMapper, dynamic datasource via @DS)
→ DB
Response ← unified Result<T> JSON (ObjectMapper: yyyy-MM-dd HH:mm:ss, GMT+8)
2.6 Persistence and dynamic datasource
- MyBatis-Plus provides the
IService/BaseMapperCRUD layer,LambdaQueryWrapperconditional queries, andIPagepagination. Global config:id-type: ASSIGN_ID(snowflake IDs),table-underline: true, mapper XML atclasspath*:org/jeecg/**/xml/*Mapper.xml. - dynamic-datasource lets services target named datasources via
@DS("name"). The default ismaster. Add datasources underspring.datasource.dynamic.datasource.*. - Druid is the connection pool and SQL monitor (stat + wall filters). The
DruidConfigbean strips Druid's built-in ad banner;DruidWallConfigRegisterrelaxes theselectWhereAlwayTrueCheckwall rule at startup. - ShardingSphere (optional) provides sharding and read/write splitting; configured via
sharding.yamlreferenced through ajdbc:shardingsphere:datasource URL. ThedatabaseNameinsharding.yamlmust match the@DSname and the datasource key.
2.7 Web/MVC configuration (from WebMvcConfiguration)
- CORS:
allowCredentials=true,allowedOriginPattern=*, all headers/methods — monolith only, viaCorsFilterCondition. - Static resources: serves uploaded files from
jeecg.path.upload(default/opt/upFiles) andjeecg.path.webapp(/opt/webapp) plus classpath static, with a 30-dayCache-Control. - Root redirect:
/→/doc.html(Knife4j). Can be repointed to a packagedindex.html. - ObjectMapper: BigDecimal as plain, lenient deserialization,
yyyy-MM-dd HH:mm:ssdate formats, JSR-310 (LocalDate/Time) serializers. - WebSocket:
ServerEndpointExporterplus aWebsocketFilterregistered for endpoints/websocket/*,/taskCountSocket/*,/eoaSocket/*,/eoaNewChatSocket/*,/newsWebsocket/*,/dragChannelSocket/*,/vxeSocket/*.
2.8 API documentation (Knife4j / springdoc)
OpenAPI 3 via Swagger3Config (springdoc + Knife4j UI). The security scheme is the X-Access-Token API-key header, auto-applied to all operations except the public set (/sys/login, /sys/phoneLogin, /sys/mLogin, /sys/sms, /sys/randomImage/**, /sys/thirdLogin/**, /sys/user/register, /sys/cas/client/validateLogin, /test/jeecgDemo/demo3). Enabled by knife4j.enable; gated off in production by knife4j.production.
3. Requirements and Capacity
3.1 Software prerequisites
| Component | Version | Required? |
|---|---|---|
| JDK | 17+ (17/21/24/25) | Yes |
| Maven | 3.x | Yes (build) |
| Node.js | 20+ (v20.15.0) |
Yes (frontend build) |
| pnpm | 9+ | Yes (frontend) |
| MySQL | 5.7+ | Yes (or another supported DB) |
| Redis | recent | Yes |
| Docker + Docker Compose | recent | For container deployment |
| PostgreSQL + pgvector | — | Only for AI knowledge base (RAG) |
| Nacos / Sentinel / RabbitMQ | per stack | Only for microservice mode |
Supported databases: MySQL, Oracle 11g, SQL Server 2017, PostgreSQL, MariaDB, TiDB, Dameng (达梦 / DmJdbcDriver18), Kingbase (人大金仓 / kingbase8).
3.2 Environment preflight
Run the bundled checker before provisioning:
python check_jeecgenv.py
It validates JDK 17+, Maven, Node 20+, pnpm 9+, and prints reference config blocks for MySQL, Redis, AI chat, and the pgvector store.
3.3 Sizing notes
- The monolith is a single JVM; size heap for your dataset and concurrency. Druid pool defaults:
initial-size=5,min-idle=5,maxActive=1000,maxWait=60000ms. - Quartz thread pool is 10 threads; the AI RAG scheduler (
TaskSchedulerConfig) adds a separate 10-threadThreadPoolTaskScheduler. - The AIRAG module pulls large optional dependencies (Kotlin scripting, GraalJS, Groovy — ~50MB each, marked
provided/runtime). Exclude unused script engines to slim the artifact. - Microservice mode multiplies the footprint (gateway + Nacos + per-service JVMs + Sentinel + middleware). Plan memory accordingly.
4. Configuration Mastery
All backend configuration lives in jeecg-boot/jeecg-module-system/jeecg-system-start/src/main/resources/:
| File | Purpose |
|---|---|
application.yml |
Selects the active profile (@profile.name@) and imports config/application-liteflow.yml |
application-dev.yml |
The main config (database, Redis, jeecg.*, integrations) |
application-prod.yml, application-test.yml, application-docker.yml |
Environment overrides |
application-{postgresql,oracle,sqlserver,dm8,kingbase8}.yml |
Per-database datasource overrides |
logback-spring.xml |
Logging |
flyway/sql/{db}/ |
Versioned migration SQL |
jeecg/ |
Code-generator templates |
The active profile is set at build time via the Maven profile.name property (dev/test/docker/prod).
4.1 Server and framework
| Key | Default | Notes |
|---|---|---|
server.port |
8080 |
Backend port |
server.servlet.context-path |
/jeecg-boot |
All paths are prefixed |
server.error.include-stacktrace |
ALWAYS |
Disable in prod (info leak) |
server.compression.enabled |
true |
gzip for JSON/JS/CSS ≥1KB |
spring.servlet.multipart.max-file-size |
10MB |
Upload limit |
spring.jackson.time-zone |
GMT+8 |
Timestamp zone |
management.endpoints.web.exposure.include |
metrics,httpexchanges,jeecghttptrace |
Actuator surface |
4.2 Datasource (Druid + dynamic)
spring:
datasource:
druid:
stat-view-servlet:
enabled: true
loginUsername: admin # ← Druid console creds — CHANGE/DISABLE in prod
loginPassword: 123456
dynamic:
datasource:
master:
url: jdbc:mysql://127.0.0.1:3306/jeecg-boot?characterEncoding=UTF-8&useSSL=false&allowPublicKeyRetrieval=true&serverTimezone=Asia/Shanghai
username: root
password: root
driver-class-name: com.mysql.cj.jdbc.Driver
Caution
The Druid stat-view servlet is enabled with
admin/123456by default and exposes SQL, sessions, and URI stats at…/jeecg-boot/druid/. Disable it or change the credentials before any non-local deployment.
4.3 Cache, scheduling, mail
| Area | Keys | Default |
|---|---|---|
| Redis | spring.data.redis.host/port/password/database |
127.0.0.1:6379, db 0, no password |
| Quartz | spring.quartz.job-store-type |
jdbc, clustered (isClustered: true), 10 threads |
spring.mail.host/username/password |
smtp.163.com, placeholder creds |
|
| Flyway | spring.flyway.enabled |
false; clean-disabled: true (keep true — prevents schema wipe) |
| MyBatis-Plus | mybatis-plus.global-config.db-config.id-type |
ASSIGN_ID (snowflake), table-underline: true |
Warning
spring.flyway.clean-disabledmust remaintruein production. Setting itfalseallows Flyway to drop all tables in the schema — a catastrophic data-loss risk the config comments explicitly warn about.
4.4 The jeecg.* namespace (platform settings)
Bound by JeecgBaseConfig (@ConfigurationProperties(prefix="jeecg")):
| Key | Purpose | Default |
|---|---|---|
jeecg.uploadType |
File store backend: local / minio / alioss |
local |
jeecg.path.upload |
Local upload root | /opt/upFiles |
jeecg.path.webapp |
Local webapp path | /opt/webapp |
jeecg.signatureSecret |
HMAC signing key for sensitive (dictionary) APIs | a shared default — change it |
jeecg.signUrls |
Endpoints that require request signing | dict/sms endpoints |
jeecg.shiro.excludeUrls |
Extra paths excluded from Shiro auth | demo/bigscreen paths |
jeecg.smsSendType |
aliyun / tencent |
aliyun |
jeecg.domainUrl.pc / .app |
Frontend base URLs | :3100 / :8051 |
jeecg.firewall.dataSourceSafe |
Require data source for Online report/chart | false |
jeecg.firewall.lowCodeMode |
dev (online design on) / prod (off) |
dev |
jeecg.firewall.is-concurrent |
Allow same account multi-login | true |
Integration sub-namespaces (all default to ?? placeholders — fill what you use):
jeecg.oss.*— Aliyun OSS keys + SMS templates (accessKey,secretKey,endpoint,bucketName,sms-template.*).jeecg.tencent.*— Tencent Cloud SMS (secretId,secretKey,sdkAppId,region).jeecg.minio.*— MinIO (minio_url,minio_name,minio_pass,bucketName).jeecg.jmreport.*— JimuReport:saasMode,firewall.dataSourceSafe,firewall.lowCodeMode,gao-de-api.*(Amap key for BI maps).jeecg.xxljob.*— xxl-job:enabled(defaultfalse),adminAddresses(http://127.0.0.1:9080/xxl-job-admin),appname,accessToken,address,port(30007).jeecg.redisson.*— distributed lock:address,password,type: STANDALONE,enabled: true.jeecg.baidu-api.*— Baidu OCR (app-id,api-key,secret-key).jeecg.file-view-domain— online file-preview server (http://fileview.jeecg.com).
4.5 AI configuration
Bound by AiChatConfig (prefix=jeecg.ai-chat) and AiRagConfigBean (prefix=jeecg.airag):
jeecg:
ai-chat:
enabled: true
model: deepseek-chat
apiKey: ?? # ← REQUIRED for AI chat
apiHost: https://api.deepseek.com/v1
timeout: 60
ai-model-draw: { provider: QWEN, model: wan2.2-t2i-flash, apiKey: sk-?? } # text→image
ai-model-pic-draw:{ provider: QWEN, model: wan2.5-i2i-preview, apiKey: sk-?? } # image→image
ai-model-voice: { provider: ZHIPU, model: glm-tts, voice: tongtong, speed: 1.0 }
ai-model-video: { provider: ZHIPU }
ai-model-embed: { provider: QWEN, model: text-embedding-v1 } # default embeddings
ai-rag:
allow-sensitive-nodes: sql,stdio # ← enables SQL/command-line AI flow nodes (risky)
embed-store: # pgvector store for RAG
host: 127.0.0.1
port: 5432
database: postgres
user: postgres
password: postgres
table: embeddings
brave-search: # AI agent web search (optional)
api-key: ??
count: 10
timeout: 15
Caution
jeecg.ai-rag.allow-sensitive-nodes: sql,stdioenables SQL execution and command-line (stdio) nodes in AI workflows. These let AI flows run database queries and shell commands. Removestdio(andsqlif not needed) on any multi-tenant or internet-facing deployment — they are powerful and a serious risk if an attacker can author flows.
4.6 Authentication integrations
- Knife4j basic auth:
knife4j.basic.enable/username/password(jeecg/jeecg1314). Enable + change in prod, or setknife4j.production: trueto disable docs entirely. - JustAuth third-party login (
justauth.*): GitHub, WeChat Enterprise/Open, DingTalk — each withclient-id/client-secret/redirect-uri. - CAS SSO:
cas.prefixUrlfor single sign-on.
5. Security
Important
JeecgBoot is a legitimate, widely-used open-source platform, but its defaults are tuned for developer convenience. Treat every item below as a required hardening step before exposing an instance. JeecgBoot's public issue tracker actively receives security reports (privilege-escalation, SSRF, SQL-injection, and OAuth open-redirect reports appear in the open issues for 3.9.x); the single most important control is to run a patched, current release.
5.1 Authentication and authorization model
- Stateless JWT via Shiro. Login (
/sys/login) issues a JWT; the frontend returns it in theX-Access-Tokenheader on every request. A custom Shiro realm (extendingAuthorizingRealm) validates the token (doGetAuthenticationInfo) and resolves roles/permissions (doGetAuthorizationInfo), with the chain running innoSessionCreation(no server session). Authorization data is cached in Redis (shiro-redis). - RBAC + wildcard permissions (
@RequiresPermissions("user:edit"),@RequiresRoles("admin")), extended with data permissions (row-level) and field permissions, all enforced server-side. - Request signing. Sensitive dictionary/SMS endpoints (
jeecg.signUrls) require an HMAC signature derived fromjeecg.signatureSecret. The frontend and backend secrets must match.
5.2 Hardening checklist
- [ ] Change the
admin/123456account password (and all default-seeded accounts). - [ ] Rotate
jeecg.signatureSecretto a unique value (and update the frontend to match). - [ ] Disable or re-credential the Druid stat-view servlet (
spring.datasource.druid.stat-view-servlet). - [ ] Set
knife4j.production: true(or strongknife4j.basiccreds) to lock API docs in prod. - [ ] Set
server.error.include-stacktrace/include-exception/include-messageto off — the dev config leaks stack traces. - [ ] Set
jeecg.firewall.lowCodeMode: prodandjeecg.jmreport.firewall.lowCodeMode: prodto disable online design tools. - [ ] Set
jeecg.firewall.dataSourceSafe: true(and the JimuReport one) so Online report/chart cannot use arbitrary platform data sources. - [ ] Consider
jeecg.firewall.is-concurrent: falseto prevent the same account logging in from multiple locations. - [ ] Remove
stdio(and reviewsql) fromjeecg.ai-rag.allow-sensitive-nodes. - [ ] Restrict CORS — the monolith default
allowedOriginPattern=*withallowCredentials=trueis permissive; front the app with a reverse proxy enforcing allowed origins, or overrideWebMvcConfiguration's CORS bean. - [ ] Validate every JustAuth
redirect-uriagainst an allowlist (open-redirect class of issues has been reported onthirdLogin). - [ ] Keep
spring.flyway.clean-disabled: true. - [ ] Set real, non-
??credentials for any enabled integration (OSS/SMS/mail/AI) and store secrets outside the repo (env vars / Nacos / a vault). - [ ] Stay on the latest 3.9.x patch; monitor the GitHub issue tracker and advisories.
5.3 Network exposure
In production, expose only the frontend (nginx) and, if needed, the backend API behind a reverse proxy. Do not expose Nacos (8848), Druid console, Knife4j, Sentinel (9000), Spring Boot Admin (9111), or xxl-job (9080) to the public internet — these are operator tools with weak or default credentials.
5.4 Multi-tenancy (SaaS)
JeecgBoot supports a SaaS multi-tenant model. When enabled, MyBatis-Plus rewrites SQL to scope queries by tenant_id (a tenant-line handler), and the TENANT_ID header carries tenant context. Verify tenant isolation end-to-end before hosting multiple customers — tenant-scoping bugs are a recurring class of issue in multi-tenant low-code platforms.
6. Operations
6.1 Build
# Monolith
cd jeecg-boot && mvn clean install -Pdev # or -Pprod / -Pdocker
# Microservices
mvn clean install -Pdev,SpringCloud
# Frontend
cd jeecgboot-vue3 && pnpm install
pnpm build # generic prod build
pnpm run build:docker # monolith docker build
pnpm run build:dockercloud # cloud docker build
The build skips tests by default (maven-surefire-plugin skipTests=true).
6.2 Run
- Monolith: run
org.jeecg.JeecgSystemApplication(modulejeecg-system-start). Listens on:8080at/jeecg-boot. - Microservices: start Nacos, then gateway, system, demo, and any middleware. Each service is a separate Spring Boot jar.
6.3 Docker deployment
Two compose files ship at the repo root:
| File | Stack |
|---|---|
docker-compose.yml |
Monolith: MySQL (jeecg-boot/db), Redis, backend, Vue/nginx |
docker-compose-cloud.yml |
Microservices: MySQL (host 13306), Redis, Nacos (8848), system, demo, gateway (9999), Sentinel (9000), xxl-job (9080), pgvector, Vue/nginx (80) |
One-click scripts (start-docker-compose.sh / start-docker-compose-cloud.sh, plus .bat variants) compile both halves and bring the stack up. They also add jeecg-boot-system/jeecg-boot-gateway and jeecg-boot-mysql to /etc/hosts.
Base image: java:17-anolis (Anolis/RHEL family), timezone Asia/Shanghai, LANG=en_US.UTF-8. The compose MySQL uses utf8mb4, lower_case_table_names=1, caching_sha2_password, max_allowed_packet=128M.
Note
Microservice components also support Kubernetes and Jenkins per the README; Loki+Grafana and SkyWalking are referenced for distributed logging and tracing. Those are external to this repository's compose files.
6.4 Database migrations (Flyway)
Flyway is disabled by default (spring.flyway.enabled: false) — initial schema comes from the bundled SQL in jeecg-boot/db/. Versioned migrations live under jeecg-system-start/src/main/resources/flyway/sql/{mysql,...}/ using the naming V[date]_[seq]__[module]_[op]_[desc].sql (run-once, V prefix) and R__*.sql (repeatable, R prefix, re-runs when changed). To enable auto-migration, set spring.flyway.enabled: true and point locations at your DB folder. Archive old increments and clear flyway_schema_history (rows installed_rank > 1) when starting a new baseline.
Warning
Enabling Flyway disables the "lazy-initialization startup acceleration" option and runs migrations on boot. Test migrations against a copy of production first; never run with
clean-disabled: false.
6.5 Monitoring and logs
- In-app: System Monitoring menu (Redis, server/JVM, Quartz, online users, request trace, SQL via Druid, system logs, datasource, gateway routes).
- Microservice: Spring Boot Admin (
9111,admin/admin), Sentinel (9000,sentinel/sentinel) — Sentinel rules persist to Nacos and currently govern the gateway. - Actuator/Prometheus:
micrometer-registry-prometheusis included; the exposed endpoints aremetrics,httpexchanges, and a customjeecghttptrace. - Logging: logback (
logback-spring.xml); xxl-job handler logs default tologs/jeecg/job/jobhandler/with 30-day retention.
6.6 Backups
Back up: the application database(s), Redis (if you rely on cached state beyond tokens), the file-upload store (/opt/upFiles for local mode, or the MinIO/OSS bucket), and the pgvector store if AI RAG is in use. Online Forms, generated menus, dictionaries, and permission rules all live in the database — a DB backup captures the low-code configuration.
7. Developer Internals
7.1 Repository structure (top level)
README.md / README.en-US.md / README.ja-JP.md Project intro (multi-language)
README-AI.md AI feature notes
check_jeecgenv.py Environment preflight checker
docker-compose.yml / docker-compose-cloud.yml Deployment stacks
start-docker-compose*.sh / .bat One-click start scripts
LICENSE Apache 2.0
jeecg-boot/ Backend (Maven multi-module)
jeecgboot-vue3/ Frontend (Vue 3 / Vite / pnpm)
7.2 Frontend internals
- Stack: Vue 3 + TypeScript + Vite 6 + Ant Design Vue + Pinia + ECharts. Based on the Vben-admin architecture.
- Structure (
jeecgboot-vue3/src/):api/(HTTP services),components/(the Jeecg component library —Table,Form,jeecg/JVxeTable,Modal,Drawer,Tinymce,Markdown,Cropper, etc.),views/(pages),router/(dynamic routing + guards),store/(Pinia),hooks/,utils/,layouts/,locales/(i18n),settings/,directives/,design/(themes). - Cross-cutting features: dynamic menu routing, i18n (zh-CN/en/ja), theme switching, qiankun micro-frontend host (
src/qiankun/), and an Electron desktop wrapper (electron/+src/electron/). - HTTP: an Axios wrapper (
src/utils/http/axios/) attaches theX-Access-Tokenheader and centralizes error handling.
7.3 Backend code patterns
- Layering:
@RestController→IService/ServiceImpl(MyBatis-Plus) →BaseMapper+ XML. UnifiedResult<T>response envelope. - Config beans:
JeecgBaseConfig(thejeecg.*root),AiChatConfig,AiRagConfigBean,WebMvcConfiguration(CORS/static/JSON/WebSocket),Swagger3Config,DruidConfig,RestTemplateConfig,TaskSchedulerConfig. Conditions:JeecgCloudCondition,CorsFilterCondition. - AutoPoi Excel:
@Excel(name="Gender", dicCode="sex")auto-translates dictionary values on import/export (AutoPoiDictConfig). - Lombok is used pervasively (
@Data,@Slf4j) — the IDE Lombok plugin is mandatory. - Conventions (from in-code comments): changes are wrapped in
update-begin/update-endauthor/date markers and reference issue IDs — preserve these when merging upstream.
7.4 AI module (jeecg-boot-module-airag)
Built on langchain4j 1.12.2 with broad provider coverage (OpenAI, Ollama, Gemini, Zhipu, Qianfan, DashScope, Anthropic) and pgvector for embeddings. Document parsing uses Apache Tika and POI (Word/Excel/PPT/PDF/text). AI workflow ("aiflow") is built on liteflow with pluggable script engines (Groovy/JS/Kotlin/Python/Aviator). MCP support and a tools/skills system are present (langchain4j-mcp, langchain4j-skills, experimental shell skills). poi-tl powers Word-template generation; jsoup parses HTML.
Caution
The AI module bundles a shell-execution skill (
langchain4j-experimental-skills-shell) and scripting engines. Combined withallow-sensitive-nodes: stdio, AI flows can run shell commands. Audit who can author AI flows and disable shell/stdio capabilities unless you specifically need them.
7.5 Testing strategy
Backend tests use spring-boot-starter-test + JUnit Platform, but the build skips tests by default (maven-surefire-plugin skipTests=true); test coverage in the repository is sparse (the briefing flagged low test coverage). The microservice jeecg-cloud-test-* modules are runnable samples (RabbitMQ, RocketMQ, Seata, ShardingSphere), not unit tests. If you fork JeecgBoot for a product, add a real test suite — especially around permissions, data-permission rules, and tenant isolation — and stop skipping tests in CI.
7.6 Suggested improvements (observations)
- Tighten production defaults. Ship a
application-prod.ymlthat flips every §5 hardening item by default, so production is secure-by-default rather than secure-by-checklist. - Externalize secrets. Replace the
??placeholders and inlinesignatureSecretwith environment-variable / Nacos / vault references; never commit live keys. - Add automated tests for auth, RBAC, data permissions, and multi-tenant scoping; enable them in CI (
skipTests=false). - Pin/scan dependencies. The stack is large with many custom-repo artifacts; add dependency vulnerability scanning and watch the security tracker.
- Document the monolith↔microservice switch prominently — the
CLOUD_SERVER_KEYcondition is powerful but non-obvious to new operators.
8. Troubleshooting (operational)
Error: application fails to start, Cannot create datasource / SQL errors at boot
Cause: Database unreachable, wrong credentials, or schema not imported.
Solution: Verify the master datasource URL/credentials in application-{profile}.yml; import the SQL from jeecg-boot/db/; confirm the DB engine matches the profile.
Prevention: Run check_jeecgenv.py; use the bundled docker-compose.yml MySQL for local.
Error: NOAUTH Authentication required / Redis errors
Cause: Redis password mismatch or Redis down.
Solution: Set spring.data.redis.password and jeecg.redisson.password; start Redis. Redis is mandatory.
Error: microservices can't find each other / gateway 503
Cause: Nacos not running or services not registered (wrong config.server-addr/namespace).
Solution: Start Nacos (8848); confirm each service's Nacos namespace/group (springboot3 / DEFAULT_GROUP by default) and that they are UP in the Nacos console.
Prevention: Bring up Nacos before other services; use the cloud compose file which orders dependencies.
Error: Sentinel dashboard is empty
Cause: Expected on first load — Sentinel only shows rules after a microservice request has flowed through the gateway. Solution: Make a request through the gateway, then refresh. Sentinel here governs the gateway and persists rules to Nacos.
Error: file uploads return 404 when served back
Cause: jeecg.path.upload/webapp not writable or not matching the static resource handler.
Solution: Ensure /opt/upFiles and /opt/webapp exist and are writable, or switch jeecg.uploadType to minio/alioss with valid keys.
Error: scheduled jobs run multiple times in a cluster
Cause: Quartz misconfiguration across instances.
Solution: Quartz is configured clustered (isClustered: true) with a shared JDBC store — ensure all instances point at the same database and have synchronized clocks. For distributed jobs, prefer xxl-job.
Error: Online report/chart can query arbitrary data / data source
Cause: dataSourceSafe: false (dev default).
Solution: Set jeecg.firewall.dataSourceSafe: true and jeecg.jmreport.firewall.dataSourceSafe: true, and lowCodeMode: prod.
Error: compilation failed / dependency download errors
Cause: Wrong JDK, missing Lombok, or unreachable Jeecg/Aliyun Maven mirrors.
Solution: JDK 17+, Lombok plugin, mvn -U to refresh; verify the Aliyun (maven.aliyun.com) and Jeecg (maven.jeecg.org) repositories are reachable.
9. Quick Reference
Ports
| Service | Port | Default creds |
|---|---|---|
| Backend (monolith) | 8080 (/jeecg-boot) |
admin/123456 |
| Gateway | 9999 | — |
| Nacos | 8848 | (Nacos default) |
| System cloud service | 7001 | — |
| Demo cloud service | 7002 | — |
| Spring Boot Admin (monitor) | 9111 | admin/admin |
| xxl-job admin | 9080 | admin/123456 |
| Sentinel | 9000 | sentinel/sentinel |
| MySQL (cloud compose) | 13306→3306 | root/root |
| pgvector | 5432 | postgres/postgres |
| Druid console | …/jeecg-boot/druid/ |
admin/123456 |
| Knife4j docs | …/jeecg-boot/doc.html |
(basic: jeecg/jeecg1314 if enabled) |
Key build profiles
| Profile | Effect |
|---|---|
dev (default) |
Monolith, dev config, Nacos addr jeecg-boot-nacos:8848, namespace springboot3 |
test / prod / docker |
Environment overrides |
SpringCloud |
Adds jeecg-server-cloud modules |
Critical hardening settings (production)
| Setting | Dev default | Production |
|---|---|---|
admin password |
123456 |
change |
jeecg.signatureSecret |
shared default | rotate |
spring.datasource.druid.stat-view-servlet.enabled |
true |
false / re-credential |
knife4j.production |
false |
true |
server.error.include-stacktrace |
ALWAYS |
never |
jeecg.firewall.lowCodeMode |
dev |
prod |
jeecg.firewall.dataSourceSafe |
false |
true |
jeecg.ai-rag.allow-sensitive-nodes |
sql,stdio |
remove stdio |
spring.flyway.clean-disabled |
true |
true (never false) |
Configuration file map
| Need | File |
|---|---|
| Main config | jeecg-boot/jeecg-module-system/jeecg-system-start/src/main/resources/application-dev.yml |
| Profile selector | application.yml |
| DB-specific | application-{postgresql,oracle,sqlserver,dm8,kingbase8}.yml |
| Liteflow (AI flow) | config/application-liteflow.yml |
| Logging | logback-spring.xml |
| Migrations | flyway/sql/{db}/ |
| Schema/seed | jeecg-boot/db/*.sql |