JECloud AI 灵象 · 操作说明书
低代码平台单机版(灵象)操作说明书
共 48 篇 · 图片位于同级 assets/ 目录 · 左侧三级目录可收缩与搜索定位
一、产品入门
JECloud AI 灵象 · 操作说明书 ​
灵象是什么 ​
JECloud AI 灵象是一套 AI 加持的低代码平台——基于元数据模型构建,可视化搭建 + AI 生成。让你不用从零写代码、不用扩编开发团队,就能把进销存、客户管理、生产报工这类业务系统搭出来:需求不再排进漫长的开发队列,系统按周上线、按天调整,业务怎么变,系统跟着变。
它的底层是深耕低代码十余年的原厂引擎——流程、表单、权限、报表都被打磨了十年,撑得起 ERP / CRM / MES 级别的复杂系统,不是只能做问卷的玩具。
灵象同时是 JECloud 数字员工生态的技术底座:智能体「烟花」在它之上搭系统,数字员工「小匠」在它产出的业务模块上跑业务。一句话——灵象建平台、烟花搭系统、小匠跑业务。

人提需求 → 智能体「烟花」在灵象上搭系统 → 系统长出来 → 数字员工「小匠」上岗跑业务:灵象建平台、烟花搭系统、小匠跑业务。
本手册讲的是灵象的「单机部署版」(standalone)。 它把平台原本的多个微服务合并成一个 Spring Boot 进程,内嵌 MariaDB 与 Redis,无需任何外部中间件;支持私有化部署、数据不出内网,解压后双击
start.bat(Windows)或执行start.sh(Linux / macOS)即可运行——真正开箱即用。
适用场景——企业与个人信息化建设的技术中台 / 软件工具:
灵象把"建系统"的能力装进一个可本地运行的发行包,作为自有的低代码技术中台,沉淀业务、数据与流程:
- 企业信息化:中小企业或部门级团队,无需服务器集群,在一台机器上搭起进销存、CRM、OA、项目管理、MES 等业务系统,作为企业自有的技术中台持续沉淀与迭代。
- 个人 / 小团队:把它当作随身的低代码软件工具,在本机快速搭建、验证、交付业务应用——开箱即用、数据全在本机。
- 集成与二次开发:作为技术底座嵌入现有信息化环境,二次开发自定义模块,与已有 ERP / OA / 第三方系统打通。
单机版不替代微服务版——当并发或数据量超出单机承载能力时,可迁移至微服务版(数据 mysqldump 后导入);也可就地横向扩展为多节点轮询集群(主节点 + 若干从节点 + nginx)应对更高并发。

作为低代码技术中台:新系统在其上快速搭建,老旧系统通过它打通数据孤岛、重新赋能。
平台能力引擎 ​
灵象用一组开箱即用的配置引擎驱动业务搭建——这些是你做低代码开发时真正用到的能力:
| 引擎 | 能力 |
|---|---|
| 数据引擎(资源表) | 对接关系型数据库,可视化维护普通表、树形表、视图、索引、键,并记录数据结构变更日志 |
| 列表工具 | 点选、拖拽即可配置字段排序、显隐、编辑、列锁定、列查询、复杂表头、分组合计等 |
| 表单工具 | 提供文本框、下拉框、日期、附件、人员选择器、查询选择器等 20+ 表单组件,支持主从表单 |
| 工作流引擎 | 基于 Activiti 的可视化流程设计,支持发起、撤销、退回、转办、加签、会签、传阅等中国特色审批规则 |
| 图报表引擎 | 常用报表、交叉报表、填报报表,以及饼图、柱图、折线图、雷达图、仪表图等图形报表 |
| 门户引擎 | 拖拽配置门户展板,组合功能数据、图形报表、轮播、日历、超链接等组件 |
国产化适配:平台体系支持麒麟 / 普华操作系统、达梦 / 神通 / 人大金仓数据库、OpenJDK 1.8、龙芯 / 鲲鹏处理器、WPS 等国产软硬件环境(单机版以本手册 系统要求 为准)。
安全与性能:传输参数加密、统一 SQL 解析防注入、严格的数据访问授权、三级密码校验。
平台内置完整的组织 / 账号 / 角色 / 权限体系,支持单点登录与功能权限、数据权限的精细授权:

内外部组织机构、账号管理、角色授权与数据授权一体化(授权配置见 菜单配置)。
能做什么 ​
① 浏览器里低代码搭应用
在浏览器里按「资源表 → 数据字典 → 功能 → 功能列表 → 表单 → 子功能 → 菜单 → 授权」八步搭出业务模块,再叠加工作流与报表,AI 辅助生成页面与逻辑,全程无需编写后端代码。
② IDEA 里进行代码开发
在 IntelliJ IDEA 中开发自定义业务插件、功能事件与自定义服务,利用 dev-forward 断点调试功能在本机单步调试平台代码。
③ 单机或集群部署运维
配置证书、管理定时任务(XXL-Job 调度中心)、执行版本升级、备份与恢复数据,以及横向扩展为多节点集群。
这本手册怎么读 ​
手册按板块组织,按需选读:
| 板块 | 内容 | 入口 |
|---|---|---|
| 产品入门 | 了解产品、完成首次启动、跑通第一个应用 | 快速安装体验 |
| 平台配置(低代码) | 低代码开发主线:资源表 → 数据字典 → 功能配置 → 菜单配置 → 流程引擎 | 低代码总览 |
| 代码开发 | 源码 / IDEA 调试 / 定时任务 / 功能事件 / 基础组件 / 前端 Ajax / 插件 / 构建 | 代码开发总览 |
| 部署集成 | 配置说明、各系统单机部署、集群负载均衡、备份、增强套件、排错 | 配置说明 |
| 授权证书 | 证书申请与安装 | 授权证书 |
| 规则规范 | 二次开发的命名 / 资源表 / 功能 / 字典 / 菜单等规范 | 规范总览 |
| 版本发布 | 版本升级操作与变更历史 | 版本升级 |
| 场景案例 | 销售、项目管理等行业模块拆解 | 场景案例总览 |
默认端口与账号 ​
| 服务 | 端口 | 说明 |
|---|---|---|
| HTTP(平台入口) | 8080 | 浏览器访问地址 http://localhost:8080 |
| WebSocket | 7010 | 实时消息推送(Netty) |
| MariaDB(内嵌) | 33306 | 避开与宿主 MySQL 3306 冲突 |
| Redis(内嵌) | 61379 | 避开与宿主 Redis 6379 冲突 |
| XXL-Job 调度中心 | 3060 | 定时任务管理后台 |
| XXL-Job 执行器 | 9999 | 任务执行器监听端口 |
| 集群 nginx 入口 | 80 | 仅多节点集群模式下使用 |
| 账号类型 | 用户名 | 密码 |
|---|---|---|
| 平台登录 | admin |
123456 |
| 调度中心登录 | admin |
123456 |
| 数据库(MariaDB) | root |
bt5 |
完整参考
端口可改性说明、目录结构、常用命令、术语表,见 附录。
快速安装体验 ​
最快路径:解压 → 启动 → 申请证书 → 登录,几分钟跑起来。环境要求、端口、配置参数等放在本页末尾的 补充:环境与参数,正式部署再看。
第一步:解压发行包 ​
把你系统对应的发行包解压到一个目录即可(不需要安装程序)。各系统发行包:
| 系统 | 发行包 |
|---|---|
| Windows | jecloud-standalone-*-windows.zip |
| Linux x86_64 | jecloud-standalone-*-linux-x86_64.tar.gz |
| Linux ARM64 / 麒麟 ARM | jecloud-standalone-*-linux-arm64.tar.gz |
| macOS Apple Silicon(M1/M2/M3/M4) | jecloud-standalone-*-macos-arm64.zip |
| macOS Intel | jecloud-standalone-*-macos-x86_64.zip |
解压路径要求(所有平台)
目标目录必须 纯 ASCII、无空格、无符号链接,例如 D:\jecloud 或 /opt/jecloud。含中文、空格或符号链接的路径会导致内嵌 MariaDB 初始化失败。
第二步:启动 ​
Windows ​
进入解压后的根目录,双击 start.bat(或在命令行运行 start.bat)。首次启动约需 60–90 秒。
Linux ​
在根目录执行:
bash start.sh
macOS ​
macOS 会给从网络下载的文件加"隔离"标记,首次启动需先解除,再启动。在根目录执行:
sudo xattr -cr .
bash ./start.command
各系统更细的启动差异(后台运行、开机自启、macOS 签名修复等)见 部署集成 › 单机部署:Windows 部署 / Linux 部署 / macOS 部署。
第三步:申请并放入证书 ​
首次启动若 license/jecloud.license 不存在,平台会打印引导面板并退出(exit code 2):
╔════════════════════════════════════════════════════════════════════╗
║ [!] 未检测到授权证书,系统无法启动 ║
║ license\jecloud.license 不存在。 ║
║ 首次使用请到官网在线申请授权证书: ║
║ https://jecloud.net/download ║
║ 申请后将 jecloud.license 放入 license\ 目录,重新运行 start.bat 即可。
╚════════════════════════════════════════════════════════════════════╝
申请并安装:
- 访问 https://jecloud.net/download 在线申请授权证书,拿到官方签发的
jecloud.license(通常在一个 zip 包里) - 将
jecloud.license(及随附的插件 key)放入发行包根目录下的license/文件夹(该目录始终存在,含LICENSE-README.txt说明) - 重新运行启动脚本
完整的申请与安装、续期、排错见 授权证书。
开发跳过
开发调试时可在 JVM 参数加 -Djecloud.standalone.license.skip=true 跳过证书检查(.bat/.sh 脚本层不识别此参数,需直接传给 JVM)。
第四步:登录体验 ​
启动成功时,控制台会打印信息面板(StartupBanner):
╔════════════════════════════════════════════════════════════════════╗
║ JECloud AI 灵象 启动完成 (耗时 XX 秒) ║
║ 访问地址 http://localhost:8080 ║
║ 登录账号 admin ║
║ 登录密码 123456 ║
║ 数据库密码 root / bt5 (127.0.0.1:33306) ║
║ 关闭服务请运行 stop.bat(Linux/macOS:bash stop.sh) ║
╚════════════════════════════════════════════════════════════════════╝
打开浏览器访问 http://localhost:8080,使用账号 admin / 123456 登录即可。
可通过以下接口验证服务就绪:
| 检查项 | 地址 | 预期结果 |
|---|---|---|
| 主程序健康 | http://localhost:8080/actuator/health |
返回 {"status":"UP",...} |
| 调度中心 | http://127.0.0.1:3060 |
显示 XXL-Job 管理界面 |
TIP
/actuator/health 中 Redis 的 status 字段有时显示 DOWN,是内嵌 Redis 健康指标的误报,不影响业务功能,可忽略。
停止 ​
:: Windows
scripts\stop.bat
# Linux / macOS
bash scripts/stop.sh
停止脚本会依次关闭应用进程(8080)、WebSocket(7010)、内嵌 MariaDB(33306)、内嵌 Redis(61379)与调度中心(3060),并验证端口已释放。
重装 / 清空数据库
要把数据库恢复为全新状态(数据将全部丢失):① 先停服;② 删除 data/mysql/ 整个目录;③ 重新启动(会重新初始化并执行全部建库脚本)。
补充:环境与参数(按需查阅) ​
快速跑通后,正式部署前可参考以下内容。
支持的操作系统 ​
| 操作系统 | 支持状态 | 说明 |
|---|---|---|
| Windows 10(1809+)及以上 x64 | 主力支持 | 已完整验证,桌面部署首选(含 Windows 11、Server 2016/2019/2022) |
| 国产化 OS · 银河麒麟 / 麒麟(ARM64 与 x86_64) | 支持 | 信创环境;ARM64 用随包自包含 MariaDB |
| Linux x64(Ubuntu 20.04+ / CentOS 7+) | 支持 | start.sh 已提供 |
| Linux ARM64(aarch64) | 支持 | 用随包自包含 MariaDB,需 linux-arm64 发行包 |
| macOS Intel x64 | 支持 | 首次启动需执行特殊命令,见 macOS 部署 |
| macOS Apple Silicon(M1/M2/M3/M4) | 支持 | 用随包自包含 MariaDB(arm64 发行包) |
硬件要求 ​
| 维度 | 最低配置 | 推荐配置 |
|---|---|---|
| CPU | 双核 2.0 GHz | 四核 2.5 GHz+ |
| 内存 | 4 GB RAM | 8 GB+ |
| 磁盘 | 50 GB 可用 | 100 GB+ SSD |
| 网络 | 离线可运行(首次激活除外) | — |
单机并发上限
单机版面向低并发场景,推荐配置下建议同时在线用户不超过 50 人。规模增长可横向扩展为 多节点集群,或迁移至微服务版。
运行环境(Java 8) ​
灵象基于 Java 8(JDK/JRE 8) 构建,不兼容 JDK 17+。slim 包需目标机预装 JDK/JRE 8;full 包自带 OpenJDK 8 JRE,无需预装。命令行执行 java -version,确认包含 version "1.8.*"。
端口、目录与配置参数 ​
首次启动会发生什么 ​
首次启动会按顺序自动完成(约 60–90 秒,控制台打印 [1/8]…[8/8] 进度):
- 端口预检 — 检查 8080 / 7010 / 33306 / 61379 是否空闲,任一被占用则报错退出
- 启动内嵌 MariaDB(33306)— 初始化数据目录
data/mysql/ - 执行数据库初始化脚本 — 按文件名顺序运行
sql/schema、sql/data、sql/upgrade(幂等) - 启动内嵌 Redis(61379)
- 启动应用服务(Tomcat 8080)— 加载平台服务插件、启动 Netty WebSocket(7010)
- 启动调度中心(jecloud-job-admin,3060)— 主程序健康检查通过后自动拉起
遇到启动失败、端口冲突等问题,见 常见问题与排错。
快速上手应用 ​
目标 ​
跟着一条完整的「开发流转路线」走一遍,理解灵象低代码"不写后端代码就能搭出业务系统"的全过程。下文以平台内置的客户管理为例,每一步都配上系统真实界面。
开发流转路线 ​
一个业务模块从无到有,标准顺序如下——数据底座(①②)→ 业务功能(③)→ 交付(④⑤)→ 运行(⑥):
下面每一步都遵循「先创建、再配置」两个动作:创建会弹窗输入基本信息,确定后进入配置 / 编辑区——对照两张截图即可看出"创建"与"配置"的区别。
① 资源表:定义业务数据 ​
创建——选中模块,点工具栏「新建表」,在弹出的对话框里选类型、填表名称与表编码,点「确定」:

配置——确定后(或在左侧资源树选中一张已有表),右侧进入字段设计区,逐字段定义字段名称、编码、类型、是否必填、排序等,保存同步后映射为业务库的物理表:

详见 资源表。
② 数据字典:维护可复用枚举 ​
创建——点「新建列表字典」,在弹出的空白表单里填字典名称 / 编码 / 类型 / 所属模块:

配置——切到「数据字典项」标签页,逐项维护项名称、值、排序、颜色、图标,把状态/类型/分类等下拉选项沉淀为可复用字典,改一处全局生效:

详见 数据字典。
③ 功能配置:列表 + 表单 + 子功能 ​
入口——从「开发 › 应用中心」进入,左上切到「业务服务」,逐级展开「子系统 › 模块 › 功能」:

创建——选中目标模块,点「+ 添加 › 功能」,在弹出的对话框里填名称、编码、功能类型、表名、主键:

配置——确定后双击该功能打开「功能配置」设计器,分页签配置列表(显示哪些列)、表单(录入哪些字段、必填/只读)、按钮与子功能:

详见 功能配置。
④ 菜单配置:挂入导航 ​
在「菜单管理」展开菜单树、选中一个节点,右侧即出现该菜单的配置信息(名称、图标、类型、所属服务、绑定的功能等)——新建菜单节点并绑定刚配好的功能,它就出现在导航树中:

详见 菜单配置。
⑤ 授权:授予角色 ​
没有授权的用户看不到入口。两种授权方式:开发期可在「菜单管理」工具栏点「授权给开发人员」一键授权;正式交付则用角色授权精细控制——顶部 管理 › 角色授权,选中角色后右侧管理该角色的账户:

关键一步——切到右侧「权限配置」页签,展开「菜单授权 / 功能授权」,勾选要开放给该角色的菜单与功能:

详见 菜单配置。
⑥ 运行验证:最终用户使用 ​
切换到运行态(工作 菜单),在导航中找到功能,录入数据验证新增、编辑、删除、查询:

至此,一个完整的低代码应用就搭建并交付完成了。
附录 ​
端口清单 ​
| 端口 | 用途 | 可否修改 | 联动点(改端口时须同步修改以下位置) |
|---|---|---|---|
8080 |
HTTP / REST API / 前端页面 | 可改 | StandaloneApplication.main、config/application.yml、instant.conf |
7010 |
WebSocket(Netty,实时推送) | 可改 | StandaloneApplication.main、config/application.yml、instant.conf、数据库表 JE_CORE_WEBSOCKETURL |
33306 |
内嵌 MariaDB(嵌入式数据库) | 可改 | StandaloneApplication.main、config/application.yml、instant.conf |
61379 |
内嵌 Redis(缓存 / 会话) | 可改 | StandaloneApplication.main、config/application.yml、instant.conf |
3060 |
XXL-Job 调度中心 Admin | 可改 | config/jecloud-job.properties、config/application.yml(jecloud.standalone.xxl-job.admin-addresses) |
9999 |
XXL-Job 执行器(Executor) | 可改 | config/application.yml(jecloud.standalone.xxl-job.executor-port)、调度中心分组配置中的执行器地址 |
80 |
集群模式 nginx 入口 | 可改 | nginx/conf/nginx.conf |
注意:MariaDB 默认使用 33306 而非标准的 3306,目的是避免与宿主机已安装的 MySQL 冲突。修改任何端口后须同时更新上表所列的所有联动点,否则会出现连接失败或端口预检 fail-fast 报错。
默认账号 ​
| 系统 / 服务 | 用户名 | 密码 | 说明 |
|---|---|---|---|
| 平台(Web 登录) | admin |
123456 |
初始超级管理员,拥有全部权限;首次登录后建议立即修改密码 |
| XXL-Job 调度中心 | admin |
123456 |
调度中心 Web 管理界面登录账号 |
| 内嵌 MariaDB | root |
bt5 |
数据库 root 账号,首次初始化时写入 |
| 内嵌 Redis | —(无用户名) | 123456 |
Redis requirepass 密码 |
生产环境请修改默认密码
默认密码仅适用于开发 / 演示环境。生产部署前请参阅 配置说明 修改数据库密码、Redis 密码及平台 admin 密码。修改数据库密码后须删除 data/mysql/ 目录并重新初始化。
内置数据库 ​
三个数据库均运行在同一内嵌 MariaDB 进程(端口 33306)上,账号统一为 root/bt5:
| 库名 | 用途 | 连接示例 |
|---|---|---|
jecloud_platform |
平台核心数据(账号/权限/元数据/流程/消息等) | mysql -h 127.0.0.1 -P 33306 -u root -pbt5 jecloud_platform |
jecloud_business |
业务方案数据(低代码建表/插件表,可独立备份恢复) | mysql -h 127.0.0.1 -P 33306 -u root -pbt5 jecloud_business |
jecloud-job |
XXL-Job 调度配置(任务/执行器/日志,与平台库物理隔离) | mysql -h 127.0.0.1 -P 33306 -u root -pbt5 jecloud-job |
详细说明见 配置说明 › 内置的三个数据库。
目录结构 ​
发行包解压后的完整目录树及各目录用途如下:
<发行包根>/
├── jeapp-standalone.jar 主程序 jar(薄壳 + 适配层 + FQN 复写 + PluginLoader)
├── plugins/
│ ├── system/ 平台内置 8 个微服务 jar(出厂自带,勿手动修改)
│ └── business/ 业务插件放置目录(出厂为空,二次开发成果放此处)
├── lib/ 三方依赖 jar(由主程序自动加载,勿手动修改)
├── license/ 证书文件目录(jecloud.license + 各服务 plugin key)
├── data/
│ └── mysql/ 内嵌 MariaDB 数据目录(删此目录等于重置数据库)
├── files/ 用户上传 / 下载文件及临时文件(workflow / preview / local)
├── sql/
│ ├── schema/ 初始建表 SQL,按文件名顺序执行,幂等(_jecloud_schema_version 追踪)
│ ├── data/ 初始种子数据 SQL
│ └── upgrade/ 增量升级 SQL,每次版本升级追加于此
├── config/
│ ├── application.yml 主配置文件(端口 / 数据库 / Redis / XXL-Job 等所有运行时参数)
│ └── jecloud-job.properties XXL-Job 调度中心独立配置(datasource / 端口 / access token)
├── apollo-cache/ 本地 Apollo 配置缓存(程序启动时自动生成,勿手动编辑)
├── logs/ 运行日志(spring.log,按日期滚动)
├── web/ 前端静态资源(Vue dist + ExtJS build,由 Tomcat 直接 serve)
├── job/
│ └── jecloud-job-admin.jar XXL-Job 调度中心独立进程 jar
├── upgrade/ 版本升级包存放目录(upgrade.bat 读取此处的升级 zip)
├── nginx/ 集群模式专用:nginx 可执行文件 + nginx.conf(单机模式不启用)
└── scripts/ 辅助脚本(start-job-admin.bat/.sh、start-node.bat 等)
Windows 路径注意事项:发行包所在路径须为纯 ASCII 字符、不含空格、不含符号链接,否则内嵌 MariaDB 初始化(
ibdata1)可能失败。
命令速查 ​
启停 ​
:: Windows 启动(主节点,all 模式:DB + Redis + 应用 + 定时任务)
start.bat
:: Windows 停止(同时终止应用进程、mysqld、redis-server、nginx)
stop.bat
# Linux / macOS 启动
./scripts/start.sh
# Linux / macOS 停止
./scripts/stop.sh
健康检查 ​
# 返回 {"status":"UP"} 表示服务就绪(可用于脚本轮询等待启动完成)
curl http://localhost:8080/actuator/health
端口排查 ​
:: Windows:查看指定端口占用情况(以 8080 为例)
netstat -ano | findstr :8080
# Linux / macOS:查看端口占用(以 8080 为例)
lsof -i :8080
备份 ​
:: Windows:备份数据目录与文件(停服后执行)
xcopy /E /I /H data\ backup\data\
xcopy /E /I /H files\ backup\files\
# Linux / macOS:打包备份(停服后执行)
tar -czf backup-$(date +%Y%m%d).tar.gz data/ files/
版本升级 ​
:: Windows:执行交互式升级向导(离线 / 在线 → 目标版本 → 自动 / 手动)
upgrade.bat
数据清理 ​
缺省即真执行
不带 confirm 参数时直接清数据,无预览保护。 想先确认清单,请加 confirm=true(仅预览,不动数据)。
# 仅预览(confirm=true,只统计不动数据)
curl -X POST "http://127.0.0.1:8080/je/standalone/cleanup/data?productCode=<方案编码>&confirm=true"
# 真执行(缺省即真删,不带 confirm)
curl -X POST "http://127.0.0.1:8080/je/standalone/cleanup/data?productCode=<方案编码>"
源码构建 ​
# slim 构建(不含 JRE,依赖宿主机已安装 Java 8)
mvn clean package -P slim
# full 构建(含 JRE,需先将 OpenJDK 8 x64 放入 src/main/jre/)
mvn clean package -P full
术语表 ​
| 术语 | 含义 |
|---|---|
| 单体 / standalone | 将 JECloud 平台的 8 个 ServiceComb 微服务合并到同一个 Spring Boot 进程中运行的部署形态,以薄启动器(thin launcher)拉起、第三方依赖外置在 lib/,附带内嵌 MariaDB 与 Redis,面向桌面 / 低配 Linux / macOS 场景。 |
| 卫星实例(Satellite) | 在 dev-forward 调试场景中,独立运行于另一端口(如 8090)的另一个 standalone 进程;它连接与主实例共享的 MariaDB / Redis,专门承载开发者正在断点调试的目标微服务流量。 |
| dev-forward | 开发态服务转发功能;主实例通过 HTTP 反向代理将特定微服务的流量转发到卫星实例,使开发者在 IDEA 中对单个服务打断点调试时无需停主进程。 |
| 方案(产品) | 平台中对业务应用的称呼,对应表 JE_PRODUCT_MANAGE,PRODUCT_TYPE='1' 为用户自建方案,PRODUCT_TYPE='2' 为平台内置服务;方案数据存放在 jecloud_business 库,平台数据存放在 jecloud_platform 库(双库隔离)。 |
| 功能 | 方案下的一个业务模块单元,对应表 JE_META_RES_TABLE 及相关元数据表,表示一个可配置的低代码页面或数据对象。 |
| 元数据 | 描述"功能"结构与行为的配置数据(字段定义、表单布局、权限规则等),存储于 jecloud / jecloud_platform 数据库,由 10-meta.sql 初始化(约 22 MB)。 |
| 执行器 / 调度中心 | XXL-Job 的两个角色:调度中心(jecloud-job-admin.jar,端口 3060)负责存储任务定义、触发调度;执行器(内嵌在主进程,端口 9999)负责实际运行 @XxlJob 处理方法。 |
| 插件 bucket | plugins/ 目录下的每个子目录称为一个 bucket;启动时按固定顺序加载:system/ 最先,business/ 其次,其余子目录按字母顺序加载;bucket 名称无语义约束,仅影响加载顺序。 |
本页为权威参考
本页所列的端口、账号、目录与命令为 JECloud AI 灵象的唯一权威数据源。手册其他页面若与本页记录不一致,以本页为准。
二、平台配置(低代码)
低代码总览 ​
开发工作台
浏览器登录平台(默认 http://localhost:8080,账号 admin / 123456)后,点击顶部 开发 进入开发工作台。「快捷入口」与左侧「核心引擎」聚合了低代码开发的全部模块(资源表、数据字典、菜单管理、工作流引擎 …),「平台数据」展示当前产品 / 资源表 / 菜单 / 功能 / 数据字典 / 工作流的数量统计。

本章目标 ​
理解灵象低代码的配置开发模型,掌握不写代码、只在浏览器里配置即可搭出一个完整业务应用的标准路径。
灵象平台引擎靠配置驱动:先建好数据底座(资源表 + 数据字典),再围绕资源表搭出业务功能(功能 + 功能列表 + 表单 + 子功能),最后通过菜单与授权把功能交付给指定角色使用。这是区别于「代码开发」(在 IDEA 里写 Java)的纯配置侧路径。
标准开发主线(八步) ​
一个业务模块从无到有,标准顺序如下:
①创建资源表 → ②创建数据字典 → ③创建功能 → ④配置功能列表
→ ⑤配置表单 → ⑥配置子功能 → ⑦创建菜单 → ⑧授权
| 步骤 | 做什么 | 说明 | 详见 |
|---|---|---|---|
| ① 创建资源表 | 定义业务数据结构 | 字段、类型、主子表与关联关系,映射为业务库物理表,是整个应用的数据基础 | 资源表 |
| ② 创建数据字典 | 维护可复用的枚举/编码 | 状态、类型等下拉选项集中维护,供多个字段引用,改一处全局生效 | 数据字典 |
| ③ 创建功能 | 把资源表包装成业务模块 | 一个功能 = 一个可访问的业务页面,挂载某张资源表 | 功能配置 |
| ④ 配置功能列表 | 配置列表视图 | 显示哪些列、查询条件、排序、操作按钮(新增/编辑/删除/导出) | 功能配置 |
| ⑤ 配置表单 | 配置新增/编辑表单 | 拖拽控件、字段绑定、校验规则、布局 | 功能配置 |
| ⑥ 配置子功能 | 配置从属/明细功能 | 主子表明细、关联列表、详情页签等挂在主功能下的子节点 | 功能配置 |
| ⑦ 创建菜单 | 把功能挂到导航树 | 将功能节点配置到菜单树的对应位置,成为用户可见的入口 | 菜单配置 |
| ⑧ 授权 | 把菜单/功能授予角色 | 在角色上勾选功能权限与数据权限,账号通过角色获得访问权,完成交付闭环 | 菜单配置 |
前两步搭数据底座,③~⑥围绕资源表搭业务功能,⑦⑧通过菜单与授权完成交付——这条主线适用于绝大多数业务模块。
在主线之上叠加 ​
主线跑通后,按需叠加以下能力:
- 流程引擎:为功能绑定审批流程,驱动业务状态流转。见 流程引擎。
要点提纲 ​
- 产品与方案:产品是应用的顶层容器,方案是产品下的子模块;理解两者的层次关系
- 运行态 vs 设计态:设计态在管理界面编辑配置,运行态是最终用户看到的应用界面;两者可独立刷新
- 元数据与 loadFunc 链路:平台在运行时通过元数据驱动页面渲染,了解 loadFunc 的调用链路有助于排查问题
- 角色 / 权限模型:账号 → 角色 → 功能权限 / 数据权限,授权链路贯穿第⑧步
- 与代码开发的关系:低代码满足不了的场景可通过业务插件扩展,详见 代码开发
待补 ​
- [ ] 各步骤操作截图
- [ ] 端到端建一个完整业务模块的分步详解
资源表 ​
低代码开发主线第 ① 步:创建资源表——先把业务数据结构定下来,这是整个应用的数据底座。
入口
浏览器登录平台后,从顶部 开发 进入开发工作台,左侧「核心引擎 › 资源表」。
本章目标 ​
用建模工具创建业务资源表与字段,保存同步后映射为业务库的物理表。
创建资源表 ​
打开「资源表」后,首页会给出资源总数、类型分布与名词解释(普通表 / 单根树形表 / 多根树形表 / 视图 / 导入表 / 关系视图):

左侧「核心元数据」树按引擎分类组织全部资源表(资源表引擎 / 功能引擎 / 字典引擎 / 数据源引擎 …):

新建一张业务表 ​
- 切换到业务服务:左下角的服务下拉(默认「元数据服务」)切换到 业务服务——业务资源表都建在这里。
- 选中模块:在左侧资源树展开目标子系统(如「客户关系管理(CRM)」),选中要建表的模块(如「销售管理」)。
- 点击「新建表」:点击树上方工具栏的「新建表」图标,弹出新建表对话框——先选类型(普通表 / 单根树表 / 多根树表),再填 表名称 与 表编码(推荐命名规范
系统名_模块名_实体名,如JE_RBAC_ENDUSER),点「确定」即创建:

- 编辑字段:确定后进入字段设计,逐字段维护字段名称、字段编码、字段类型、是否为空、唯一/索引、排序等:

查看 / 编辑已有表(配置区) ​
在左侧资源树展开到具体表(如 客户关系管理 › 销售管理 › 客户相关 › 客户管理),选中即在右侧打开该表的设计视图,可继续维护列、键、索引,并通过顶部「设计视图 / 关系视图 / DDL 视图 / SQL 视图」切换查看:

设计视图内还有 表格列 / 表格键 / 表索引 / 历史留痕 四个子页签:
切到「表格键」页签,维护主键与外键关联(键编码、字段编码、类型、关联表 / 关联字段 / 关联类型):

切到「表索引」页签,维护索引(索引编码、字段名称、是否唯一、分类、排序):

操作要点 ​
- 建模型 / 建表:在模型设计器中新建数据模型,映射为数据库物理表
- 字段类型:文本、数字、日期、布尔、枚举等常用类型及其配置项
- 主子表与关联关系:一对多主子表配置、外键关联关系的定义方式
- 系统字段自动生成:平台默认为每张表追加
SY_开头的系统字段(主键、数据状态、登记人/时间、所属公司/机构、工作流字段等),无需手工维护 - 生成数据库表:在设计态保存并同步后,平台自动在业务库执行 DDL
- 与双库路由的关系:灵象在独立业务库与平台库之间路由查询,了解业务数据落在哪个库;详见 数据库使用规则
命名与建模规范
资源表 / 字段的命名、类型、键、索引等规范,见 规则规范 › 资源表设计规范。
下一步 ​
数据底座建好后,继续 数据字典(第 ② 步),再到 功能配置。
待补 ​
- [ ] 主子表 / 关系视图建模的分步截图
数据字典 ​
低代码开发主线第 ② 步:创建数据字典——集中维护可复用的枚举 / 编码,供多个资源表字段引用。
入口
开发工作台左侧「核心引擎 › 数据字典」,或开发展板「快捷入口 › 数据字典」。
本章目标 ​
维护可复用的数据字典(如状态、类型、分类),改一处全局生效,为表单下拉、列表展示提供统一取值。
创建数据字典 ​
左侧按业务套件分类组织字典,右侧是字典列表(字典名称 / 编码 / 类型 / 所属模块):

新建字典:在字典列表上方点击「新建列表字典」,即弹出空白的字典编辑表单(也可双击已有字典进入编辑)。「基础信息」填写 字典名称 / 字典编码(如 CRM_SALES_SSHY)、字典类型(列表 / 树形 …)、所属模块:

基础信息填好后,切到下方「数据字典项」标签页,点「添加项」逐项维护 项名称、值(编码,全大写英文如 ISV/HLW)、排序、是否启用、背景/字体颜色、图标,最后「保存」:

操作要点 ​
- 建字典:定义字典分类与字典项(编码 + 显示文本)
- 字段引用字典:资源表字段绑定字典后,表单下拉、列表展示自动取字典文本
- 维护与扩展:字典项可随业务增长持续追加,无需改表结构
字典规范
字典编码、类型选型(LIST / TREE / DYNA_TREE / SQL 等)、字典项编码规范,见 规则规范 › 字典设计规范。
下一步 ​
字典就绪后,进入 功能配置(第 ③~⑥ 步)。
待补 ​
- [ ] 字典类型选型与维护分步详解
功能配置 ​
低代码开发主线第 ③~⑥ 步:创建功能 → 配置功能列表 → 配置表单 → 配置子功能——围绕资源表搭出可操作的业务模块。
入口:应用中心 → 双击功能 ​
功能配置在「应用中心」里完成。从顶部 开发 › 应用中心 进入,左上角切换到对应服务 / 产品(业务功能在「业务服务」下),逐级展开「子系统 → 模块 → 功能」:

新建功能(创建) ​
要新建功能:在左侧选中目标模块,点工具栏「+ 添加 › 功能」,在弹出的「功能添加」对话框里填写 名称、编码、功能类型、表名、主键名,点「确定」即创建一个空功能:

打开功能配置(配置) ​
找到目标功能(如 客户关系管理 › 销售管理 › 客户管理),双击该功能,即弹出「功能配置」设计器。设计器顶部分为 功能 / 列表 / 表单 / 按钮 / 子功能 五个页签——列表归列表、表单归表单,各管各的配置。
③ 创建功能(功能页签) ​
「功能」页签是核心配置:功能编码、功能名称、绑定的表名、主键、功能类型、数据录入方式,以及视图操作表、主从展示、流程绑定等:

- 功能编码 = 资源表编码(如
CRM_SALES_CUSTOMER),表名指向资源表或其视图(如V_CRM_SALES_CUSTOMER) - 功能类型:操作视图 / 普通功能等
- 流程绑定:可为功能绑定工作流(如"客户报备审批"),录入数据即进入审批
④ 配置功能列表(列表页签) ​
「列表」页签配置列表视图:选哪些字段作为列、列宽、对齐、是否隐藏、排序、列锁定、是否可编辑等,逐列配置:

⑤ 配置表单(表单页签) ​
「表单」页签配置新增/编辑表单:设置表单宽度与列数,逐字段配置必填 / 只读 / 隐藏、列宽、控件类型,右侧"字段库"可把资源表字段拖入表单:

配置按钮(按钮页签) ​
「按钮」页签配置工具栏 / 表单 / 行菜单上的按钮:每个按钮设置编码、名称、类型(列表 TABLE / 表单 FORM)、绑定事件、隐藏 / 禁用 / 授权、图标与样式。除内置的新增 / 编辑 / 删除 / 导出外,可添加自定义按钮(如下图"转移负责人"):

按钮的「事件」即在 平台功能事件 里为按钮(
click/before-click/after-click)挂脚本。
⑥ 配置子功能(子功能页签) ​
「子功能」页签挂主子表 / 关联功能:每个子功能绑定一张表(或视图)、设置展示方式与父子关联字段。下图客户管理挂了 客户联系人、客户情报 两个子功能,运行时即表单顶部的页签:

运行效果 ​
配置完成后,运行态即得到一个可用的业务功能——列表、表单、子功能页签一应俱全,参见 场景案例 › 销售模块。
功能规范
功能编码、功能树层级、列字段 / 表单字段(XTYPE)、按钮、子功能等规范,见 规则规范 › 功能设计规范。
下一步 ​
功能搭好后,进入 菜单配置(第 ⑦⑧ 步)把它交付给用户。
待补 ​
- [ ] 字段控件类型(XTYPE)逐项说明与截图
- [ ] 按钮事件与权限配置分步详解
流程引擎 ​
在低代码主线之上叠加:为业务功能绑定审批流程,驱动业务状态流转。平台流程引擎基于 Activiti,支持发起、撤销、退回、转办、加签、会签、传阅等中国特色审批规则。
入口
从顶部 开发 › 工作流引擎 进入;功能与流程的绑定在 功能配置 的「功能」页签设置(绑定工作流)。
本章目标 ​
为业务配置审批流程,并把流程绑定到功能,让用户提交数据即进入审批流转。
流程列表 ​
「工作流引擎」左侧按业务分类组织流程,右侧是流程清单(流程名称、编码、分类、版本、是否部署等):

打开流程设计器 ​
在流程列表中,点击某条流程 「规划」列下的 action 按钮(注意:不是双击行),即弹出流程引擎设计器:

- 左侧:节点组件库——开始 / 结束 / 判断 / 任务 / 分支 / 聚合 / 会签 / 固定人 / 候选 / 多人审批 等,拖到画布即添加节点。
- 中间画布:拖拽连线绘制审批流(如 开始 → 填单人 → 领导审核 → 结束)。
- 右侧:基础配置(流程名称、绑定功能、流程分类、部署环境)、启动配置(任何人启动 / 可启动角色 / 启动表达式 / 定时启动)、扩展配置。
要点提纲 ​
- 流程设计器:可视化绘制审批流程图,添加节点与连线
- 节点与审批人:配置各审批节点的处理人(指定人员、角色或动态表达式)
- 表单绑定:将流程与业务表单关联,控制各节点的字段可见与可编辑范围
- 发起与审批:最终用户如何发起审批申请、审批人如何处理待办任务
- 与 Activiti 引擎的关系:平台流程引擎底层基于 Activiti,
ACT_*表由平台初始化脚本预置,无需手动干预
流程规范
流程相关的命名与配置规范,见 规则规范 › 功能设计规范(功能与流程绑定部分)。
待补 ​
- [ ] 可视化流程设计器(节点/连线/审批人)操作截图
- [ ] 发起与审批分步详解
三、代码开发
代码开发总览 ​
代码开发是什么 ​
代码开发是指在 IDEA 里给灵象底座编写自定义 Java 代码——业务插件、自定义服务接口、数据库扩展——以满足超出浏览器低代码能力范围的定制需求。本板块区别于「平台配置(低代码)」——低代码是在浏览器里配资源表 / 功能 / 菜单,不写代码;代码开发是在 IDEA 里写 Java、构建产物、扩展平台行为。
本板块同时涵盖围绕平台的定时任务(XXL-Job)配置:XXL-Job 调度中心随发行包一同启动,执行器内嵌在主进程中,开发者在这里了解如何配置、注册和管理定时任务。
如果你的需求可以通过数据建模、表单设计、菜单配置、工作流来完成,那更推荐先走 低代码开发,无需编写 Java 代码。代码开发适合那些需要自定义接口逻辑、复杂数据计算、或深度集成外部系统的场景。
两仓协作 ​
灵象代码开发涉及两个 Git 仓库,职责严格分离:
| 仓库 | 职责 | 说明 |
|---|---|---|
jecloud-standalone |
适配层 + 打包 | 本手册对应的仓库。只包含适配胶水代码、插件加载器、发行包打包配置,不含微服务版源码,也不改微服务版源码 |
| 各平台微服务仓 | 平台业务逻辑 | rbac / meta / api / document / message / gateway / connector / workflow 各有独立 git 仓,编译后以 jar 形式发布到 maven.jepaas.com |
同步微服务版更新的标准三连:
# 1. 进入微服务仓,拉最新
cd <微服务仓目录>
git pull
# 2. 安装到本地 Maven 仓库
mvn install -DskipTests
# 3. 回到 standalone 仓,重新打包适配层
cd jecloud-standalone
mvn -pl standalone-boot package -DskipTests
模块结构 ​
jecloud-standalone 仓包含以下模块:
| 模块 | 职责 |
|---|---|
standalone-bridge-api |
RPC 桥接 SPI 定义——RpcRegistry / RpcReferenceResolver / BridgeBeanNames 接口,与具体 RPC 框架无关 |
standalone-bridge-servicecomb |
默认实现:将 @RpcSchema bean 注册为本地别名,将 @RpcReference 解析为同 JVM Spring bean 直调,并禁用 ServiceComb 注册中心 |
standalone-bridge-springcloud |
占位模块,src/ 目录不存在,为未来切换 Spring Cloud / OpenFeign 桥接预留位置 |
standalone-config |
内嵌 MariaDB / Redis 自动配置、PortPreflightCheck、SqlBootstrapRunner、StandaloneOverridesAutoConfiguration(6 个 BeanDefinition 手术 PostProcessor) |
standalone-boot |
主入口 StandaloneApplication、插件加载器 PluginLoader、FQN 复写类、ServiceComb→Spring Filter 适配层 |
standalone-dist |
packaging=pom,驱动 maven-assembly-plugin 生成三平台 zip/tar.gz,并向发行版 jar 注入 META-INF/jecloud-plugin.yml manifest |
三条红线 ​
代码开发(二次开发)时务必遵守以下约束,违反任一条都可能导致后续升级困难或功能失效:
| 禁止 | 原因 |
|---|---|
不改微服务版 .java |
一旦与上游微服务仓分叉,后续 git pull 同步将持续冲突,维护成本指数级增长 |
| 不反编译 jar 找代码 | 每个微服务均有独立 git 源码仓,直接读源码即可;反编译产物丢失注释和泛型信息,极易误判逻辑 |
不动 jecloud-placeholder-*.jar |
这是混淆加密的证书校验库;任何字节级改动会使整个 license 算法失效,导致系统无法启动 |
需要修改 dist 类的正确做法
在 standalone-boot/src/main/java/ 下放一个相同包名 + 相同类名的文件(FQN 复写)。Spring Boot Loader 优先加载 BOOT-INF/classes/,会在运行时自动覆盖 plugin jar 里的同名类。每处复写都必须在 _OverrideIndex.java 登记原始 FQN、文件路径和复写理由。
后续章节导引 ​
本板块分为四组——项目代码开发(搭建工程、调试、构建的全流程)、微应用开发、平台功能事件、前端组件与工具。
项目代码开发 ​
围绕 jecloud-standalone 工程的搭建、调试、扩展与构建:
| 章节 | 内容 |
|---|---|
| 获取源码与产物 | 克隆仓库、Maven 依赖配置、内网离线方案、构建命令 |
| IDEA 配置与运行 | 导入工程、Run Configuration、Working Directory、热重载 |
| dev-forward 断点调试 | 对单个平台微服务做本地断点调试,不重打整包 |
| 平台基础组件与工具类 | 后端可复用的 CRUD / 查询 / 字典 / 用户组织 / 文件等工具类 |
| 定时任务(XXL-Job) | 调度中心启停、注册任务、配置执行器、管理内置四个平台任务 |
| 数据库使用规则 | 建表命名规范、双库路由、SQL 升级文件约定 |
| 业务插件开发与打包 | 业务插件结构、打包、放入 plugins/business/ 加载 |
微应用开发 ​
| 章节 | 内容 |
|---|---|
| 微应用开发 | 微应用是什么、在哪里创建管理、与功能 / 菜单的关系、打包与部署 |
平台功能事件 ​
| 章节 | 内容 |
|---|---|
| 平台功能事件 | 在已有功能 / 表单 / 按钮 / 字段上挂自定义逻辑(前端 / 后端事件) |
前端组件与工具 ​
| 章节 | 内容 |
|---|---|
| 前端组件与工具 | 前端二次开发统一入口:通用组件 + Ajax 统一请求封装与接口调用 |
获取源码与产物 ​
业务代码 = business 插件包
JECloud 是低代码平台,二次开发出来的"业务代码"是一个 business 业务插件包——构建产出一个业务 service jar,放进单机发行包的 plugins/business/ 目录由平台加载,不是传统意义上独立部署的单体工程。本页给出两类源码 / 产物的获取方式:① 业务 service 工程骨架(用来生成你自己的业务插件),② 平台内置服务源码(开源,供阅读与断点调试)。
① 业务 service 工程骨架 ​
业务后端逻辑(自定义 Controller / Service / DAO)在一个独立的 Maven 工程中开发,构建产出 business 插件 jar。这个工程从官方提供的 archetype 模板一键生成。
它是什么 ​
- 仓库:
https://gitee.com/ketr/jecloud-service-archetype - 定位:JECloud 微服务项目骨架(Maven archetype 模板),用来快速生成符合平台规范的业务 service 工程——预置好包结构、
pom.xml依赖、manifest 等,避免从零搭建。
前置环境 ​
| 工具 | 要求 |
|---|---|
| JDK | 1.8 |
| Maven | 已安装(建议 3.6+) |
| 私服 | 依赖官方私服 http://maven.jepaas.com——这些依赖未上传中央仓库,需在 Maven settings.xml 中配置该仓库 |
必须配置私服仓库
archetype 及其生成工程的依赖均来自 http://maven.jepaas.com,中央仓库拉不到。请先在 settings.xml 中加入该仓库(<repository> 或 <mirror>),否则 mvn install / 工程构建会因找不到依赖而失败。
安装与创建工程 ​
本地方式——先克隆 archetype 仓库并安装到本地 .m2:
git clone https://gitee.com/ketr/jecloud-service-archetype
cd jecloud-service-archetype
mvn clean install
安装完成后,在 IDEA 的 New Project → Maven → Create from archetype 中点击 Add Archetype,选用刚安装的 jecloud:jecloud-service-archetype,填写你自己的 GroupId / ArtifactId 创建工程。
远程方式——不在本地预装,直接在 IDEA 的 archetype 配置中添加私服 http://maven.jepaas.com,然后选用同一个 jecloud-service-archetype 创建工程即可。
工程运行约束
该 archetype 生成的业务 service 工程需依附一套已安装的 JECloud 低代码平台运行(依赖平台的数据库、元数据、网关等能力),且开发机与平台之间网络互通。它无法脱离平台独立运行。
产出与挂载 ​
构建生成的就是 business 业务插件 jar。在单机 SKU 下,把它放入发行包的 plugins/business/ 目录,由平台在启动期加载——挂载流程、manifest 规范与类加载顺序详见 业务插件开发与打包。
② 平台内置服务源码(开源) ​
平台自身的 8 个微服务及配套基础库均开源,托管在 Gitee 组织 https://gitee.com/ketr 下。阅读这些源码是定位平台行为、在 IDEA 中做断点调试(见 IDEA 配置与运行)的基础。
后端服务与基础库:
jecloud— 低代码平台旗舰仓库(聚合入口)jecloud-common— 基础模块(公共工具、基类)jecloud-gateway— 动态网关jecloud-meta— 元数据服务jecloud-rbac— 权限服务jecloud-bpm— 工作流中间件jecloud-connector— 推送连接器jecloud-job— 改造版 XXL-Job 调度jecloud-auth— 认证服务je-ibatis— 定制版 MyBatis
前端:
jecloud-pc-archetype— 微应用骨架jecloud-pc-libs— 前端基础库
源码与 jar 版本
单机底座从私服拉取的平台服务 jar 固定在 ${jecloud.dist.version}(当前 3.1.0),与本适配仓自身版本 ${jecloud.version}(3.1.1)分离。断点调试时请让源码分支与所用 jar 版本对齐,避免 API 漂移。
待补 ​
jecloud-service-archetype生成工程的目录树,以及打包 / 插件挂载的精确命令:archetype 仓库 README 外链至doc.jepaas.com,此处尚未文档化,待补齐后补充示例工程结构与逐步命令。
IDEA 配置与运行 ​
本页讲如何在 IntelliJ IDEA 中跑一个平台服务(以 jecloud-meta 元数据服务为例)、命中源码断点调试。聚焦四个关键点,最后给出"调试配置中心"截图。
调试原理:反向代理到本地服务实例
单机主进程(8080)把某个服务的请求反向代理到你在 IDEA 中本地跑起来的该服务实例,请求落到你的源码上,从而命中断点。需要两端配合:
- 服务工程侧——引入单体调试桥接 starter,并改
dev配置(端口、桥接开关、指向单机的 DB / Redis、关闭配置中心)。 - 单机侧——在"调试配置中心"开启该服务的转发(并确保后端总开关已打开)。
链路全景与配置文件细节见 dev-forward 断点调试。
要点一:引入单体调试桥接 starter ​
在服务工程的 aggregate-tomcat/pom.xml 中增加依赖:
<dependency>
<groupId>com.je.standalone</groupId>
<artifactId>jecloud-standalone-bridge-debug</artifactId>
<version>3.1.1</version>
</dependency>
作用(pom 注释要点):当开关 jecloud.standalone-debug.enabled=true 打开后——
- 本服务在无注册中心的环境下也能对外提供 controller / RPC(ServiceComb 的
SCBEngine直接进入READY状态); @RpcReference远程引用被短路成本进程内本地 bean,不再发起远程调用;- 于是本服务可被单机的 dev-forward 把流量转发过来,落到源码做断点调试。
引入即安全
该开关默认关闭。仅引入这个依赖、不打开开关时,不改变原微服务的任何行为,可放心提交。
要点二:修改 dev 环境配置 ​
在服务工程的 aggregate-tomcat/src/main/resources/dev/ 目录下,改三个配置文件。
application.yml ​
端口设为 8085,且 ServiceComb 的 REST 监听地址与之保持一致;打开桥接开关;关闭配置中心与 Apollo(避免去连远程拉旧配置);允许 bean 覆盖:
server:
port: 8085
servicecomb:
rest:
address: 0.0.0.0:8085 # 必须与 server.port 一致
jecloud:
standalone-debug:
enabled: true # 要点一的桥接开关
enableConfigCenter: 0 # 关闭配置中心
apollo:
bootstrap:
enabled: false # 关闭 Apollo
meta: http://127.0.0.1:1 # 指向不可达地址,确保不去连远程
spring:
main:
allow-bean-definition-overriding: true
端口两处要一致
server.port 与 servicecomb.rest.address 的端口必须相同(这里都是 8085),否则 dev-forward 反代过来的请求会落到错误端口。
jdbc.properties(指向单机内嵌库) ​
让本地服务实例连单机主进程的内嵌 MariaDB(33306):
jdbc.url=jdbc:mysql://localhost:33306/jecloud_platform?useOldAliasMetadataBehavior=true&characterEncoding=UTF-8
jdbc.username=root
jdbc.password=bt5
redis.properties(指向单机内嵌 Redis) ​
让本地服务实例连单机的内嵌 Redis(61379)。必须显式写密码,否则报 NOAUTH:
redis.host=localhost
redis.port=61379
redis.pass=123456
spring.redis.host=localhost
spring.redis.port=61379
spring.redis.password=123456
恢复连开发环境
调试结束、要切回团队公共开发环境时,把上面三处改回去即可:apollo.bootstrap.enabled 改回 true、apollo.meta 改回团队地址、enableConfigCenter 改回 1。
要点三:找到启动类并运行 ​
服务工程的启动类是 com.je.AppMain,路径 aggregate-tomcat/src/main/java/com/je/AppMain.java。它带有 @SpringBootApplication(scanBasePackages = {"com.je"})、@EnableServiceComb 等注解。
在 IDEA 中把 com.je.AppMain 设为 Run/Debug 主类直接运行——dev profile 默认激活,服务监听 8085。以 Debug 模式启动,即可在源码中打断点。
要点四:在调试配置中心开启转发 ​
进入平台 开发 › 服务管理 › 调试配置中心,为目标服务(如 元数据服务 meta)配置本地转发地址(如 http://localhost:8085)并打开开关。
单机侧需打开后端总开关
界面顶部有提示:单机侧需在后端配置 jecloud.standalone.dev-forward.enabled=true 并重新打包后才生效。总开关默认关闭,对生产环境零开销。
开启后的完整链路:
前端 → 单机:8080 → 命中该服务路由 → 反代到 http://localhost:8085 → IDEA 命中断点

调试配置中心:逐个服务填写本地转发地址(如 http://localhost:8085)并打开开关;顶部提示需后端开启总开关并重新打包。
更多转发链路细节、配置文件格式与常见问题,见 dev-forward 断点调试。
待补 ​
- 各平台服务的默认端口对照表(meta / gateway / rbac / … 在 dev 下各自建议监听的端口)。
- 卫星实例运行参数的细节(
run-mode=app的完整启动参数与共享数据层注意事项)。
dev-forward 断点调试 ​
dev-forward(开发态服务转发)允许开发者在 IDEA 中以原生断点调试某个平台微服务(如 meta、gateway),同时单体实例继续正常服务其余所有接口,无需重打整包、无需重启主进程。
前置条件
已按 IDEA 配置与运行 完成 IDEA 导入和卫星实例运行配置。
概念 ​
前端 → 单体主实例 :8080
↓ DevForwardFilter(最高优先级)
↓ URL 路由匹配(UrlRouterMatcher)
↓ 读取转发配置(config/dev-forward.json,启动时加载 / 调保存接口立即热加载)
├── 未命中或 debug=false → 主实例进程内 controller 处理
└── 命中转发配置 → ReverseProxySupport(HTTP 流式反代)
↓
卫星实例 :8090
(源码断点 + IDEA Debug)
核心机制:单体在请求边缘按 URL 路由检测该 URL 所属微服务,然后查询 config/dev-forward.json 中的转发配置,决定是就地处理还是反代给本机卫星。卫星连接同一个内嵌 MariaDB(33306)和 Redis(61379),以 run-mode=app 运行,源码 Module 覆盖对应 jar 使断点生效。
源码变更说明
dev-forward 配置机制在 2026-06-07 由数据库表字段迁移为 JSON 配置文件 + REST 接口。运行中的旧版单体 需要重新打包后使用新 jar 才能识别 config/dev-forward.json;旧包仍读取数据库,请勿混用。
总开关 ​
dev-forward 功能默认关闭,必须通过 JVM 参数显式启用:
-Djecloud.standalone.dev-forward.enabled=true
在 IDEA 的主实例 Run Configuration 的 VM options 中加入此参数,或在命令行启动时追加即可。不加此参数时 DevForwardFilter 不注册,对生产环境零开销。REST 接口(/je/dev-forward/*)也仅在此开关开启时注册。
5 步调试流程 ​
第 1 步:以转发模式启动主实例 ​
在主实例(StandaloneApplication,端口 8080)的 VM options 中加入:
-Djecloud.standalone.dev-forward.enabled=true
然后以 Debug 或 Run 模式启动主实例,等待控制台输出启动完成标志。
第 2 步:配置转发目标 ​
转发配置存储在发行包根目录下的 config/dev-forward.json 文件(与 application.yml 同级)。
方式 A — 直接编辑配置文件(需重启主实例生效)
在 dist 根目录的 config/dev-forward.json 中,将目标服务的 debug 设为 true、url 填入本机卫星地址。文件不存在时视为空列表(不转发任何请求)。
[
{
"pdCode": "meta",
"pdName": "元数据服务",
"debug": true,
"url": "http://localhost:8090"
}
]
字段说明
| 字段 | 类型 | 说明 |
|---|---|---|
pdCode |
string,必填 | 服务编码,必须等于 urlRouter.xml 中对应路由的 microServiceName(如 meta、gateway) |
pdName |
string,可选 | 显示名称,仅用于标识,不参与路由匹配 |
debug |
boolean,必填 | true = 转发到 url;false = 记录保留但不转发 |
url |
string,debug=true 时必填 | 本机卫星实例地址,含协议和端口,如 http://localhost:8090 |
方式 B — 调用 REST 接口(立即热加载,无需重启)
主实例启动后,可通过保存接口对单个服务的配置进行新增或更新,接口自动将变更写入 config/dev-forward.json 并立即重新加载转发缓存,无需重启主实例。
接口需要平台登录态(Bearer token),路径前缀为 /je/**,未登录返回 401。
查看当前配置:
curl -H "Authorization: <token>" http://localhost:8080/je/dev-forward/list
新增或更新某服务的转发配置:
curl -X POST http://localhost:8080/je/dev-forward/save \
-H "Content-Type: application/json" \
-H "Authorization: <token>" \
-d '{"pdCode":"meta","pdName":"元数据服务","debug":true,"url":"http://localhost:8090"}'
- 请求体为单个服务对象,按
pdCode做 upsert。 - 返回值为保存后的完整配置数组。
pdCode为空、或debug=true时url为空,返回 400。
第 3 步:以 Debug 模式启动卫星实例 ​
在 IDEA 顶部 Run Configuration 下拉中选择 "Satellite (run-mode=app)"(或自建的卫星配置),点击 Debug 按钮。
卫星会:
- 连接主实例已启动的内嵌 MariaDB(
33306)和 Redis(61379) - 以
run-mode=app跳过内嵌库初始化和 Connector/XXL-Job 启动 - 在端口
8090上就绪 - IDEA Debug 面板显示
Connected状态
在待调试服务的源码中(如 meta 模块的某个 ServiceImpl)打上断点。
第 4 步:前端操作,触发断点 ​
用浏览器访问 http://localhost:8080,正常操作涉及目标服务(此处为 meta)的功能。
请求路径为:
前端 → 单体:8080 → 检测到 meta 路由 → 反代到 http://localhost:8090 → 卫星命中断点
IDEA Debug 面板中断点挂起,可正常查看调用栈、变量值、单步执行。
第 5 步:关闭转发 ​
调试完成后,将该服务的 debug 设为 false(记录保留,后续可快速重新开启):
通过 REST 接口(立即生效,无需重启):
curl -X POST http://localhost:8080/je/dev-forward/save \
-H "Content-Type: application/json" \
-H "Authorization: <token>" \
-d '{"pdCode":"meta","pdName":"元数据服务","debug":false,"url":"http://localhost:8090"}'
或直接编辑 config/dev-forward.json 将 debug 改为 false,然后重启主实例生效。
配置项参考 ​
在 standalone-boot/src/main/resources/application.yml 中可调整以下参数:
jecloud:
standalone:
dev-forward:
enabled: false # 总开关,false = Filter 不注册
connect-timeout-ms: 5000 # 连接卫星超时(毫秒),默认 5000
read-timeout-ms: 30000 # 等待卫星响应超时(毫秒),默认 30000
exclude-paths: # 不转发的路径(Ant 通配符)
- /je/dev-forward/**
- /actuator/**
enabled 建议通过 JVM 参数覆盖(-Djecloud.standalone.dev-forward.enabled=true),不改 yml 文件,以免误提交到 git。
同时调试多个服务 ​
需要同时调试多个平台服务(如 meta + gateway)时,启动多个卫星实例,分别监听不同端口:
- 卫星 A(调试
meta):端口8090 - 卫星 B(调试
gateway):端口8091
在 config/dev-forward.json 中为每个服务配置一条记录,各自指向对应端口:
[
{
"pdCode": "meta",
"pdName": "元数据服务",
"debug": true,
"url": "http://localhost:8090"
},
{
"pdCode": "gateway",
"pdName": "网关服务",
"debug": true,
"url": "http://localhost:8091"
}
]
或通过保存接口逐条 upsert,效果相同。两个卫星均以 run-mode=app 运行,共享同一个内嵌数据库,互不干扰。
已知限制 ​
| 限制 | 原因 | 规避 |
|---|---|---|
| 内存缓存漂移 | 单体与卫星各维护独立的内存缓存(如 MetaCache);Redis 态共享,内存态不同步 | 单人调试通常无感;如需一致,清空一方缓存或重启 |
| 卫星禁用 Connector(7010) | run-mode=app 下 ConnectorAutoConfiguration 条件不满足,Netty 服务不启动;端口 7010 由主实例占用 |
WebSocket / 推送无法在卫星断点;若需调试 connector,另行启动完整实例并修改所有端口 |
| 版本漂移 | 源码版本 3.1.1,plugins/system/ 中 jar 版本 3.1.0;卫星内混用两个版本可能有 API 差异 |
保持源码版本与 jar 版本同步;升级 ${jecloud.dist.version} 后重新构建 |
| 大文件 / 长连接超时 | 转发通过 JDK HttpURLConnection 流式转发,超大 multipart 可能超时 |
增大 read-timeout-ms,如 read-timeout-ms: 120000 |
FAQ ​
Q1:卫星启动后连接数据库失败 ​
现象:Can't get a connection, pool error Timeout waiting for idle object
原因:主实例未启动,内嵌 MariaDB(33306)和 Redis(61379)不可用。
排查:
- 确认主实例已启动且控制台出现启动完成标志。
- 检查主实例日志是否含
EmbeddedMariaDB started和EmbeddedRedis started。 - 用 MySQL 客户端验证:
mysql -h localhost -P 33306 -u root -pbt5。
Q2:配置后请求仍然到主实例,没有转发 ​
排查:
- 主实例 VM options 是否包含
-Djecloud.standalone.dev-forward.enabled=true。 - 检查
config/dev-forward.json是否存在且内容正确:pdCode是否与urlRouter.xml中对应路由的microServiceName完全一致(区分大小写)。debug字段是否为true(布尔值,非字符串)。url字段是否填写正确(含协议,如http://localhost:8090)。
- 若直接编辑了文件,需重启主实例(或调用一次
POST /je/dev-forward/save触发热加载)。 - 在主实例日志中搜索
[dev-forward]关键字查看转发决策日志。
Q3:卫星启动报错 "port 7010 in use" ​
原因:7010 端口已被主实例 Connector Netty 服务占用。
说明:run-mode=app 下卫星会自动跳过 Connector 初始化,正常情况不会绑定 7010。若仍报错,检查是否有第三方进程占用:
netstat -ano | findstr :7010
找到占用进程 PID 后,在任务管理器中结束该进程,或修改主实例 connector 端口。
Q4:收到 502 Bad Gateway ​
原因:卫星未启动或端口不匹配。
排查:
- 确认卫星已启动:
curl http://localhost:8090/actuator/health(期望返回{"status":"UP"})。 - 确认
config/dev-forward.json中对应服务的url端口与卫星启动端口一致。 - 提升卫星日志级别辅助排查:yaml
logging: level: com.je.standalone.dev.forward: DEBUG
Q5:修改了卫星源码,需要重启吗 ​
需要。卫星不支持热重载。修改源码后:
- IDEA 自动编译(或 Build → Compile)。
- 在 Debug 面板点击 Restart(或 Ctrl+F5 / Shift+F10)。
继续阅读 业务插件开发与打包 了解如何开发业务插件;或回到 IDEA 配置与运行 查看卫星 Run Configuration 详情。
平台基础组件与工具类 ​
它在二次开发中的位置
本章属于代码开发板块,聚焦后端基础组件与工具类。在写业务插件或挂平台功能事件时,很多通用能力(CRUD、查询、字典、用户 / 组织、文件等)平台已经封装好,直接复用即可,不要重复造轮子。本章帮你建立「先找平台已有组件」的意识。
前端通用组件与请求封装不在本章——请看前端组件与工具。
本章目标 ​
读完本章,你应当能够:
- 知道灵象在二次开发中可复用的后端基础组件与工具类有哪些大类。
- 在动手写代码前,先判断「平台是否已经提供了对应能力」,避免重复实现。
要点提纲 ​
后端基础组件与工具类 ​
下面按能力大类列出常见的可复用方向(具体类名 / 方法签名以平台为准,见各小节「待补」):
| 能力大类 | 用途 | 备注 |
|---|---|---|
| 通用 CRUD | 对资源表数据做增删改查,免写重复样板 | 通常基于平台元数据 |
| 查询封装 | 构造条件、分页、排序的查询对象 | 与通用查询接口配合 |
| 字典工具 | 读取 / 翻译数据字典项 | |
| 用户 / 组织工具 | 取当前登录用户、所属组织、权限等 | |
| 文件工具 | 上传 / 下载 / 读取附件 | document 服务相关 |
| 其他通用工具 | 日期、字符串、JSON、ID 生成等 |
待补
上表每一类的具体类名、所在包、关键方法签名、最小用法示例均待补。请对照平台实际提供的工具类填写,严禁编造类名 / 方法名。补充时建议每类给:类全名 + 1~2 个常用方法 + 一段示例。
通用 CRUD ​
待补
平台通用 CRUD 入口(基类 / 服务 / Mapper 约定)待补,并给出「新增一条 / 按主键查询 / 更新 / 删除」的最小示例。
查询封装 ​
待补
查询条件对象的构造方式、分页 / 排序参数、与前端通用查询接口的对应关系待补。
字典 / 用户 / 组织 / 文件工具 ​
待补
分别补充字典工具、当前用户 / 组织工具、文件工具的类名与常用方法。其中文件工具涉及 document 服务,注意单机版文件存储位置(参见多节点集群中关于文件只存主节点的说明)。
使用建议 ​
- 先查后写:动手前先确认平台是否已有对应工具,优先复用。
- 遵守红线:复用平台组件不等于可以改平台源码,二次开发约束见代码开发总览的「三条红线」。
- 依赖范围:在业务插件里引用平台依赖时用
provided,原因见业务插件开发与打包。
待补 ​
- [ ] 补充后端通用 CRUD 的入口与最小示例。
- [ ] 补充查询封装对象的构造与分页 / 排序用法。
- [ ] 补充字典工具类名与常用方法。
- [ ] 补充用户 / 组织工具类名与常用方法(取当前用户、组织、权限)。
- [ ] 补充文件工具类名与上传 / 下载 / 读取示例。
- [ ] 补充其他通用工具(日期 / 字符串 / JSON / ID 生成等)清单。
前端内容请看这里 ​
前端通用组件、统一请求封装(Ajax 与接口调用)等前端二次开发内容已统一收口到前端组件与工具。
定时任务(XXL-Job) ​
架构概述 ​
JECloud AI 灵象采用调度/执行分离架构:调度中心(admin,端口 3060)与单体内的执行器(端口 9999)各自独立运行,共用内嵌 MariaDB(端口 33306)上的专用数据库 jecloud-job。
- 执行器:随单体进程启停,自动注册所有定时任务处理器(Handler)。
- 调度中心:
job/jecloud-job-admin.jar独立进程,提供任务配置与触发的 Web 界面;按照 cron 计划向执行器发起 HTTP 回调,触发实际业务逻辑。 - 专用数据库:
jecloud-job库与业务数据完全隔离,由启动脚本在单体就绪后自动创建。
启动与停止 ​
启动 ​
执行 scripts\start.bat(Windows)或 bash scripts/start.sh(Linux/macOS)。脚本会自动完成以下顺序:
- 启动单体(Tomcat 8080 + 内嵌 MariaDB 33306 + 内嵌 Redis 61379)。
- 单体启动过程中,
SqlBootstrapRunner在内嵌 MariaDB 上建立jecloud-job库。 - 后台脚本每隔 5 秒轮询
http://localhost:8080/actuator/health,直到单体返回"status":"UP"。 - 单体就绪后,拉起调度中心
job/jecloud-job-admin.jar(端口 3060)。
不要手动提前启动调度中心
调度中心启动时必须能连到 jecloud-job 数据库。如果抢在单体前启动,SqlBootstrapRunner 尚未建库,调度中心会报 Unknown database 'jecloud-job' 后退出。务必通过 start.bat / start.sh 统一启动。
单体与调度中心全部就绪后:
| 入口 | 地址 | 默认账号 |
|---|---|---|
| 业务平台 | http://localhost:8080 |
admin / 123456 |
| 调度中心 | http://127.0.0.1:3060 |
admin / 123456 |
停止 ​
执行 scripts\stop.bat(Windows)或 bash scripts/stop.sh(Linux/macOS)。停止脚本会同时清理 8080 / 7010 / 33306 / 61379 / 3060 上的进程,调度中心随之停止。
详细的启停说明见 启停与健康检查。
登录调度中心 ​
-
浏览器访问
http://127.0.0.1:3060。 -
使用默认账号登录:
字段 值 用户名 admin密码 123456
建议首次登录后修改密码
登录后进入右上角用户管理,将默认密码修改为强密码。
新增 / 启停任务 ​
-
在调度中心左侧菜单,进入任务管理,选择执行器分组。
-
点击新增,填写以下关键字段:
字段 说明 执行器 选择 jecloud-standalone-executorJobHandler 填写单体内 @XxlJob("…")注解括号里的名称,大小写须完全一致Cron 标准 cron 表达式,如 0 0 2 * * ?表示每天凌晨 2 点 -
保存后点击任务右侧的启动按钮,任务即按计划触发。
内置的 4 个平台 Handler ​
| Handler 名称 | 所属服务 | 默认 cron | 默认状态 |
|---|---|---|---|
staffStatisticHandler |
rbac | */5 * * * * ?(每 5 秒) |
默认禁用,需手动启用 |
calendarServiceTask |
meta | 0 * * * * ?(每分钟) |
默认启用 |
cleanCodeGenerator |
meta | 0 0 0 * * ?(每天零点) |
默认启用 |
earlyWarningJobHandler |
workflow | 按需配置 | 按需启用 |
迁移生产任务配置 ​
如果已有生产 XXL-Job 任务配置(xxl_job_group、xxl_job_info 等),可以直接导入。
第一步:从生产数据库导出
mysqldump -u <用户名> -p <生产库名> xxl_job_group xxl_job_info > exported-jobs.sql
第二步:导入单体内嵌 MariaDB
mysql -h 127.0.0.1 -P 33306 -u root -pbt5 jecloud-job < exported-jobs.sql
执行器分组已存在时
若 xxl_job_group 中有与默认分组同名的行,导入前请先在调度中心的执行器管理页删除对应分组,或在 SQL 文件中去掉冲突的行。
第三步:修改执行器地址
生产环境可能有多个执行器节点,而灵象单体只有一个。在调度中心执行器管理页,将分组的"注册方式"改为手动录入,地址填:
http://127.0.0.1:9999/
也可以直接更新数据库:
UPDATE xxl_job_group
SET address_type = 1,
address_list = 'http://127.0.0.1:9999/'
WHERE app_name IN ('jecloud-rbac-executor', 'jecloud-meta-executor');
关闭定时任务 ​
如果不需要定时任务功能,可以通过以下方式关闭执行器(调度中心仍独立运行,但不会触发任何业务逻辑)。
在 config/application.yml 中添加:
jecloud:
standalone:
xxl-job:
enabled: false
关闭后,单体不再监听 9999 端口,调度中心的所有回调请求均会 Connection Refused。
常见问题 ​
Q1:调度中心显示执行器"离线" ​
排查步骤:
- 确认单体已正常启动,日志中应出现
>>>>>>>>>>> xxl-job registry success。 - 检查执行器端口 9999 是否被占用或被防火墙拦截:
- Windows:
netstat -ano | findstr :9999 - Linux/macOS:
lsof -i :9999
- Windows:
- 进入调度中心执行器管理,确认分组的在线机器地址为
127.0.0.1:9999(含结尾斜杠)。 - 检查
config/jecloud-job.properties中的xxl.job.accessToken与config/application.yml中的jecloud.standalone.xxl-job.access-token是否一致(默认均为空,不配置即可)。
Q2:调度中心启动报 Unknown database 'jecloud-job' ​
原因:单体尚未完成启动,jecloud-job 数据库还未创建。
解决:使用 scripts\start.bat 统一启动,让脚本等待单体就绪后再拉起调度中心。
如果需要手动启动调度中心,先确认单体已完全就绪:
mysql -h 127.0.0.1 -P 33306 -u root -pbt5 -e "SHOW DATABASES;"
确认 jecloud-job 出现在列表中后,再运行:
java -Xms128m -Xmx512m -jar job/jecloud-job-admin.jar \
--spring.config.additional-location=optional:file:./config/jecloud-job.properties
Q3:端口 3060 被占用,调度中心无法启动 ​
Windows:
netstat -ano | findstr :3060
taskkill /F /PID <pid>
Linux/macOS:
lsof -ti tcp:3060 | xargs kill -9
如需更换端口,修改 config/jecloud-job.properties 中的 server.port,同时修改 config/application.yml 中的 jecloud.standalone.xxl-job.admin-addresses,保持一致。
Q4:端口 9999 被占用,执行器无法启动 ​
在 config/application.yml 中更换执行器端口:
jecloud:
standalone:
xxl-job:
executor-port: 9998
同步在调度中心执行器管理页将分组地址改为 http://127.0.0.1:9998/。
Q5:任务触发后无执行日志 / 无回调 ​
排查步骤:
- 查看调度中心日志
logs/job-admin.out,确认是否有Routing LocalFirst failed等错误。 - 确认单体日志中有
>>>>>>>>>>> xxl-job registry success。 - 在调度中心执行器管理 → 对应分组 → 在线机器列表应显示
127.0.0.1:9999,若为空则执行器未注册成功,参考 Q1 排查。
配置参考 ​
执行器配置(config/application.yml) ​
jecloud:
standalone:
xxl-job:
enabled: true # 总开关(默认 true)
admin-addresses: http://127.0.0.1:3060 # 调度中心地址
app-name: jecloud-standalone-executor # 执行器分组 appname
executor-port: 9999 # 执行器监听端口
log-path: ./logs/xxl-job # handler 执行日志目录
log-retention-days: 30 # 执行日志保留天数
access-token: # 访问令牌(与 jecloud-job.properties 保持一致,默认空)
调度中心配置(config/jecloud-job.properties) ​
server.port=3060
spring.datasource.url=jdbc:mysql://127.0.0.1:33306/jecloud-job?useUnicode=true&characterEncoding=UTF-8&serverTimezone=Asia/Shanghai
spring.datasource.username=root
spring.datasource.password=bt5
xxl.job.accessToken=
修改 DB 密码后须同步更新此文件
调度中心不读取 config/application.yml,数据库凭据在 config/jecloud-job.properties 中单独配置。若重新初始化了数据库并更改了密码,务必同步修改 config/jecloud-job.properties 中的 spring.datasource.password,否则调度中心无法连接数据库。详见 配置说明。
相关链接 ​
数据库使用规则 ​
本章说明灵象的物理数据库布局、业务表路由机制、建表约束和 SQL 升级文件规范。
物理三库 ​
灵象运行时在同一个内嵌 MariaDB 实例(端口 33306)上维护三个互相隔离的 schema:
| Schema | 用途 |
|---|---|
jecloud_platform |
平台系统表(rbac、meta、document、message、workflow、connector 等) |
jecloud_business |
客户业务表(通过平台低代码建表或插件 SQL 创建的自定义表) |
jecloud-job |
调度库——XXL-Job 的 xxl_job_* 任务配置表;由独立部署的调度中心(默认端口 3060)连接读写;与平台/业务库物理隔离,开发者无需直接操作此库 |
本章路由机制涉及平台库与业务库,调度库(jecloud-job)由调度中心独立管理,详见 定时任务(XXL-Job)。
两个业务相关 schema 均位于同一个内嵌 MariaDB 实例(端口 33306)上,物理上独立,无需开发者手动切换连接。
路由机制: MyBatis 拦截器 BusinessTableRoutingInterceptor 在 SQL 执行前检查涉及的表名。对于 BusinessTableRegistry 白名单中的业务表,拦截器自动在表名前加上 jecloud_business. 前缀,将 SQL 路由到业务库;平台表则保持默认,路由到平台库。这一切对业务代码透明——你写 SELECT * FROM CRM_CUSTOMER,框架自动改写为 SELECT * FROM jecloud_business.CRM_CUSTOMER。
归属判定 ​
一张表究竟属于业务库还是平台库,由以下规则确定:
归属判定 = je_core_resourcetable ⋈ je_product_manage
具体逻辑:
JE_PRODUCT_MANAGE.PRODUCT_TYPE |
含义 | 归属 |
|---|---|---|
'1' |
方案类(客户业务产品) | 路由到 jecloud_business |
'2' |
平台服务类 | 路由到 jecloud_platform |
| 同一表名同时出现在两集合中 | 冲突 | 平台优先,路由到 jecloud_platform |
不是"有 SY_PRODUCT_CODE 就是业务表"
早期文档曾用 SY_PRODUCT_CODE 非空作为业务表判据——这是错误的。正确判据是 je_core_resourcetable ⋈ je_product_manage 的 PRODUCT_TYPE 字段。详见 BusinessTableRegistry javadoc。
建表注意 ​
全局表名唯一 ​
灵象单机运行时,所有产品的业务表共享同一个 jecloud_business schema。微服务版中每个产品可以有独立数据库(同名表不冲突),但在灵象里会直接报 ER_TABLE_EXISTS_ERROR。
命名约定: <产品代号大写>_<业务实体大写>
CRM_CUSTOMER ✅ 前缀清楚
CRM_ORDER ✅
CUSTOMER ❌ 无前缀,来源不明,极易撞名
跨服务撞名案例: instant_push_news 同时出现在平台的消息服务(30-message.sql)和连接器服务(50-connector.sql),后导入的 DROP TABLE IF EXISTS 覆盖前者。业务表命名时须检查是否与平台已有表名重复。
系统列 ​
每张业务表必须包含平台标准系统列(SY_PRODUCT_ID、SY_PRODUCT_CODE、SY_TENANT_ID、SY_CREATEORGID、SY_CREATEUSERID、SY_CREATETIME 等审计列)。通过平台建表 UI 操作会自动补全;手写 SQL 时须手动添加。
字符集 ​
所有表必须使用 utf8mb4:
CREATE TABLE CRM_CUSTOMER (
ID VARCHAR(50) NOT NULL,
NAME VARCHAR(100) NOT NULL,
...
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci;
不要使用 utf8(MySQL 历史遗留的 3 字节编码,无法存储 emoji)。
改 schema ​
使用 SQL 升级文件 ​
所有 schema 变更(加表、加列、加索引、数据迁移)必须通过升级文件完成,不得直接在生产库执行裸 SQL。
升级文件位于:
sql/upgrade/
├── 2026-05-08-standalone-defaults.sql
├── 2026-06-01-add-crm-tables.sql
└── 2026-06-15-add-status-column.sql
命名规范: <YYYY-MM-DD>-<英文短描述>.sql
- 日期前缀保证按文件名字典序执行的顺序正确
- 文件名必须全局唯一,发布后不可重命名或修改内容
- 内容发布后只能通过新增升级文件来修正,不能回头改老文件
幂等性 ​
每个升级文件只会执行一次,执行结果记录在 _jecloud_schema_version 表中。即使如此,升级文件本身也必须写成幂等的,以防历史记录丢失时重跑不出错:
-- 不幂等(重跑报错)
ALTER TABLE CRM_ORDER ADD COLUMN STATUS VARCHAR(20);
-- 幂等写法
ALTER TABLE CRM_ORDER ADD COLUMN IF NOT EXISTS STATUS VARCHAR(20);
-- 不幂等
INSERT INTO JE_CORE_DICTIONARY (DIC_CODE, DIC_NAME) VALUES ('CRM_STATUS_NEW', '新建');
-- 幂等写法
INSERT INTO JE_CORE_DICTIONARY (DIC_CODE, DIC_NAME)
SELECT 'CRM_STATUS_NEW', '新建' FROM DUAL
WHERE NOT EXISTS (
SELECT 1 FROM JE_CORE_DICTIONARY WHERE DIC_CODE = 'CRM_STATUS_NEW'
);
不要在升级文件里 DROP 表或 DELETE 数据 ​
升级 / 回滚 / 灾难恢复时,数据丢失最常见的原因就是升级脚本里的 DROP TABLE 或 DELETE。需要废弃一张表时,先重命名:
RENAME TABLE old_table TO old_table_DEPRECATED_20260615;
等三个版本(约半年)确认无人使用再 DROP。
禁止启用 jecloud-workflow-service 的 databaseSchemaUpdate=true
40-workflow.sql 已经完整建好了 Activiti 的 ACT_* 系列表。如果在 application.yml 或配置文件中将 jecloud-workflow-service 的 databaseSchemaUpdate 设为 true,Activiti 会在启动时尝试重建这些表,破坏已有的 ACT_* 数据结构,导致工作流功能不可用。这个配置项必须保持关闭(false 或不填)。
深度参考
- 单库 / 双库选型决策与历史:产品隔离
- 建表命名、索引、MariaDB 兼容性等完整规范:数据库使用规则(维护者版)
业务插件开发与打包 ​
本章面向需要在灵象底座上开发自定义 Java 业务逻辑的开发者,介绍插件目录结构、manifest 规范、安装方法和类加载顺序。
推荐先读
IDEA 配置与运行 — 建立好 IDEA 开发环境后,本章的"安装/更新"流程才能跑通。
插件目录 ​
灵象发行包根目录下的 plugins/ 文件夹称为插件根目录,其中每个子目录是一个桶(bucket):
plugins/
├── system/ ← 平台 8 个服务 jar(出厂随包,不要手动改动)
├── business/ ← 客户二开 jar(出厂为空,你的插件放这里)
└── <其他>/ ← 自定义桶,字母序加载(高级用法)
加载顺序(固定):
plugins/system/— 平台 8 个微服务,最先加载plugins/business/— 客户业务插件,次之- 其余子目录,按目录名字母序依次加载
不支持热插拔
插件加载发生在 JVM 启动期,Spring 容器初始化之前。运行中复制或删除 jar 不会触发重载。永远按照 stop → 复制 jar → start 的顺序操作,详见 安装 / 更新。
打你的业务插件 ​
包名规则 ​
| 顶层包名 | 处理方式 |
|---|---|
com.je.* |
主 @ComponentScan(basePackages="com.je") 已覆盖,不需要 manifest 声明 componentScan |
其他(如 com.example.crm) |
必须在 manifest 的 componentScan 字段声明,否则 Spring 扫不到你的 bean |
推荐使用自定义包名(如 com.example.crm),避免与平台代码命名空间冲突。
Manifest 文件 ​
每个业务 jar 的 META-INF/jecloud-plugin.yml 是插件的自描述清单,告诉 PluginPackageRegistrar 需要额外扫描哪些包。
最小 manifest 示例:
name: customer-crm
version: 1.0.0
type: business
description: 客户 CRM 模块
componentScan:
- com.example.crm
字段说明:
| 字段 | 必填 | 说明 |
|---|---|---|
name |
是 | 全局唯一,推荐与 Maven artifactId 保持一致 |
version |
是 | 语义版本(如 1.0.0) |
type |
是 | 固定填 business |
description |
否 | 一行说明 |
componentScan |
视情况 | 顶层包名非 com.je.* 时必填;可列多个包 |
没有 manifest 也能运行
不带 manifest 的 jar 仍会被加入 classpath。如果你的业务代码顶层包是 com.je.*,Spring 主扫描自动覆盖,无需 manifest;但强烈建议始终提供 manifest,方便后续依赖管理和 SQL 集成。
pom.xml 依赖范围 ​
业务插件的 pom.xml 引用平台依赖时,一律使用 <scope>provided</scope>,因为这些依赖运行时已由主 jar 提供:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
<scope>provided</scope>
</dependency>
项目骨架 ​
使用 jecloud-service-archetype 起新仓(或参考文档站的示例工程),目录结构如下:
customer-crm/
├── pom.xml
└── src/main/
├── java/com/example/crm/
│ ├── controller/CrmController.java
│ ├── service/CrmService.java
│ └── dao/CrmMapper.java
└── resources/
├── META-INF/
│ └── jecloud-plugin.yml ← 插件 manifest
└── mapper/CrmMapper.xml
构建:
mvn -DskipTests package
# → target/customer-crm-1.0.0.jar
安装 / 更新 ​
永远按以下三步操作,不存在例外:
第 1 步:停止灵象
Windows: scripts\stop.bat
Linux: ./scripts/stop.sh
第 2 步:复制 jar 到插件目录
cp customer-crm-1.0.0.jar <灵象根>/plugins/business/
第 3 步:启动灵象
Windows: scripts\start.bat
Linux: ./scripts/start.sh
更新插件时同样执行以上三步:先停再换 jar 再起。不要在运行中替换 jar——LaunchedURLClassLoader 已在启动期缓存 URL,替换文件对运行中的 JVM 无效,且会导致 ClassNotFoundException。
类加载顺序 ​
灵象使用 Spring Boot 的 LaunchedURLClassLoader,PluginLoader.prioritizePluginUrls() 在启动期完成 URL 重排,最终顺序如下:
1. BOOT-INF/classes/ ← 适配层 + FQN 复写(最高优先级)
2. plugins/**/*.jar ← 你的业务 jar + 平台 8 个 service jar
3. BOOT-INF/lib/ ← SDK stub + 三方依赖(最低优先级)
为什么这个顺序是固定的:
- 第 1 层放在最前:保证适配层对平台类的 FQN 复写能覆盖 plugin jar 里的同名类。
- 第 2 层(plugin)在 SDK stub 之前:保证平台真正的实现类被加载,而不是 SDK 存根(stub)。
- 第 3 层放在最后:SDK stub 仅做编译期占位,运行期被前两层覆盖。
不要尝试改变这个顺序——颠倒任何一层都会导致 bean 注入拿到空 stub 或 FQN 复写失效。
深度参考
- 插件加载器实现细节:插件架构
- Manifest 完整 schema(含
sqlResources、dependsOn、lifecycle等高级字段):Plugin Manifest 规范
微应用开发 ​
入口
微应用 是基于 JECloud 前端微应用骨架开发、独立打包、再挂载到平台运行的前端小应用。平台 工作 菜单下的"工作展板"本身就是一个微应用示例;自研微应用基于前端骨架开发,完成后在 开发 › 核心引擎 › 微应用管理 中注册挂载。
① 获取前端骨架 ​
微应用工程从官方前端骨架仓库脚手架而来,配合前端基础库一起使用:
- 骨架仓库:
https://gitee.com/ketr/jecloud-pc-archetype - 前端基础库:
https://gitee.com/ketr/jecloud-pc-libs
运行环境(版本需严格对齐,避免依赖编译失败):
| 工具 | 版本 |
|---|---|
| Node.js | v14.18.3 |
| npm | v6.14.15 |
npm 私服
依赖发布在 JECloud 私有 npm 仓库,安装前请把 registry 指向私服:
npm config set registry http://verdaccio.jecloud.net/
工程结构:
├─.vscode # vscode 配置
├─build # webpack 与 git hooks
├─docs # 文档
├─service # 系统文件(不要修改)
├─public # 静态资源
└─src # 源码
service 目录请勿改动
service 是骨架的系统文件目录,由脚手架维护,手动修改会在升级骨架时被覆盖或导致构建异常。你的业务代码应只写在 src 下。
② 安装依赖 ​
按是否需要调试基础库源码,分两种安装方式。
非源码用户(只用骨架,不改基础库):
npm run setup:lib
源码 / 调试用户(需要本地联调 jecloud-pc-libs):
先在基础库工程里发布本地包,再回到微应用工程安装:
# 1. 全局安装联调工具
npm i yalc lerna@^6.0.0 -g
# 2. 拉取并构建基础库,本地发布
git clone https://gitee.com/ketr/jecloud-pc-libs.git
npm run setup
npm run yalc:publish
# 3. 回到微应用工程安装依赖
npm run setup
yalc 是什么
yalc 把本地的 jecloud-pc-libs 当作本地 npm 包发布到微应用工程,改一处基础库源码即可在微应用里实时联调,无需反复发版到私服。
③ 本地运行与打包 ​
| 命令 | 用途 |
|---|---|
npm run dev |
本地开发,启动开发服务器 |
npm run build |
打包产物(用于挂载到平台) |
npm run commit |
规范化提交(按约定式提交交互生成 commit message) |
npm run changelog |
生成变更日志 |
下图是骨架自带的微应用示例(设备运营数据驾驶舱),执行 npm run dev 后即可在浏览器看到:

骨架自带的"设备运营数据驾驶舱"示例,npm run dev 启动后的本地预览效果。
④ 挂载到平台 ​
开发完成后,把 npm run build 的产物挂载到平台:在 开发 › 核心引擎 › 微应用管理 中添加该微应用并完成注册。

开发 › 核心引擎 › 微应用管理:注册并挂载自研微应用的入口界面。
待补
npm run build 产物挂载 / 注册到平台的精确字段与操作步骤(如应用编码、入口地址、上传方式等)骨架 README 未文档化,待对照平台实际界面补全。完整流程可参考主仓库:https://gitee.com/ketr/jecloud.git。
平台功能事件 ​
它在二次开发中的位置
在平台 开发 › 平台帮助 › 脚本模板 里,可以给平台组件(表格、表单、按钮、各类字段等)挂 JS 事件脚本,实现列表渲染、字段联动、保存前校验等自定义行为。功能事件介于纯低代码配置与业务插件开发之间——很多定制需求不必新建插件,挂一个功能事件脚本即可。

脚本模板按适用组件分组列出全部功能事件,左侧选组件、右侧看事件清单与脚本编辑区。
一、事件脚本写法(方法体) ​
事件脚本写的是方法体:从全局 EventOptions 解构出当前事件的上下文对象,按事件语义处理逻辑或 return 渲染内容。下面是平台真实示例(list-row-renderer 列表行渲染事件):
const {
$func, // 功能对象
$grid, // 功能列表对象
row, // 行对象,使用 row.字段编码 取字段值,也可赋值
} = EventOptions;
// 处理渲染内容
// return JE.h('div', { style: '' }, '展示内容');
return '';
要点:
- 事件方法体从
EventOptions解构上下文,不同事件的可用字段不同——常见有$func(功能对象)、$grid(列表对象)、row(行对象)等。 - 渲染类事件(如行渲染、列字段渲染)需要
return渲染内容,可用JE.h创建 vnode(虚拟 DOM 节点);JE全局方法见前端组件与工具。 - 每个事件都标有适用范围:
全部(电脑端与移动端均生效)/电脑端/移动端。
二、全部事件清单(按适用组件) ​
下面按适用组件逐个列出平台支持的全部功能事件。左侧在脚本模板中选定组件后,右侧即对应该组件下表中的事件清单。
表格(功能) ​
| 事件编码 | 事件名称 | 适用范围 | 说明 |
|---|---|---|---|
init-config |
初始化列表配置 | 电脑端 | |
row-expand-renderer |
展开行渲染 | 电脑端 | |
column-init-config |
初始化列配置 | 电脑端 | |
list-row-renderer |
列表行渲染事件 | 电脑端 | 自定义表格 |
row-renderer |
行渲染 | 移动端 | 移动端列表行渲染事件 |
rendered |
初始化 | 全部 | |
cell-click |
列单击 | 全部 | 单元格被点击时触发 |
before-cell-click |
列单击前 | 全部 | |
after-cell-click |
列单击后 | 全部 | |
cell-dblclick |
列双击 | 全部 | 单元格被双击时触发 |
before-cell-dblclick |
列双击前 | 全部 | |
after-cell-dblclick |
列双击后 | 全部 | |
edit-actived |
列编辑 | 电脑端 | 单元格被激活编辑时触发 |
before-edit-actived |
列编辑前 | 电脑端 | |
edit-closed |
列编辑后 | 电脑端 | 单元格编辑关闭时触发 |
cell-style |
列样式 | 全部 | |
row-style |
行样式 | 全部 | 灵活控制整行数据样式 |
header-cell-style |
表头列样式 | 全部 | |
header-row-style |
表头行样式 | 全部 | |
load |
数据加载 | 全部 | |
before-load |
数据加载前 | 全部 | |
transform-querys |
处理查询条件 | 全部 | 设置列表查询条件时触发 |
transform-default-values |
处理默认值 | 全部 | 功能默认值处理回调 |
drop |
拖动后 | 电脑端 | 列表数据拖动后 |
before-drop |
拖动前 | 电脑端 | 列表数据拖动前 |
func-activate |
功能激活 | 电脑端 | 应用菜单切换时触发 |
top-renderer |
扩展面板外上 | 电脑端 | |
bottom-renderer |
扩展面板外下 | 电脑端 | |
left-renderer |
扩展面板外左 | 电脑端 | |
right-renderer |
扩展面板外右 | 电脑端 | |
tbar-renderer |
扩展面板内上 | 电脑端 | |
bbar-renderer |
扩展面板内下 | 电脑端 | |
lbar-renderer |
扩展面板内左 | 电脑端 | |
rbar-renderer |
扩展面板内右 | 电脑端 |
表格列 ​
| 事件编码 | 事件名称 | 适用范围 | 说明 |
|---|---|---|---|
renderer |
渲染 | 全部 | 功能列字段渲染回调 |
link-click |
超链接 | 全部 | 功能列字段超链接点击 |
header-renderer |
列头渲染 | 电脑端 |
表单 ​
| 事件编码 | 事件名称 | 适用范围 | 说明 |
|---|---|---|---|
activate |
表单激活 | 全部 | |
model-change |
字段改变 | 全部 | 表单字段改变时回调 |
rendered |
初始化 | 全部 |
字段表达式 ​
| 事件编码 | 事件名称 | 适用范围 | 说明 |
|---|---|---|---|
suffix |
后缀 | 全部 | 表单字段后缀点击事件 |
validator |
自定义验证 | 全部 | 字段自定义验证 |
common |
公共事件 | 全部 | 用于显隐/绑定/只读等表达式事件 |
按钮 ​
| 事件编码 | 事件名称 | 适用范围 | 说明 |
|---|---|---|---|
click |
单击 | 全部 | 点击事件回调 |
before-click |
单击前 | 全部 | |
after-click |
单击后 | 全部 |
action 列 ​
| 事件编码 | 事件名称 | 适用范围 | 说明 |
|---|---|---|---|
click |
单击 | 电脑端 | 单击事件回调 |
before-click |
单击前 | 电脑端 | |
after-click |
单击后 | 电脑端 | |
hidden |
隐藏 | 电脑端 | 按钮隐藏事件 |
disabled |
禁用 | 电脑端 | 按钮禁用事件 |
子功能集合 ​
| 事件编码 | 事件名称 | 适用范围 | 说明 |
|---|---|---|---|
change |
值改变 | 全部 | |
before-action |
点击操作按钮之前 | 全部 | |
after-action |
点击按钮之后 | 全部 |
代码编辑器 ​
| 事件编码 | 事件名称 | 适用范围 | 说明 |
|---|---|---|---|
change |
值改变 | 电脑端 | 内容值改变回调 |
editor-save |
保存 | 电脑端 | 保存回调 |
editor-config |
配置项 | 电脑端 | 初始化配置项 |
颜色选择器 ​
| 事件编码 | 事件名称 | 适用范围 | 说明 |
|---|---|---|---|
change |
值改变 | 电脑端 | |
select |
选择 | 电脑端 | 选中内容回调 |
关联选择 ​
| 事件编码 | 事件名称 | 适用范围 | 说明 |
|---|---|---|---|
change |
值改变 | 全部 | |
select |
选择 | 全部 | 选中内容回调 |
before-select |
选择前 | 全部 | 选中数据前回调 |
树形选择 ​
| 事件编码 | 事件名称 | 适用范围 | 说明 |
|---|---|---|---|
change |
值改变 | 全部 | 清空内容回调 |
select |
选择 | 全部 | 选中内容回调 |
before-select |
选择前 | 全部 | 选中前回调 |
人员选择 ​
| 事件编码 | 事件名称 | 适用范围 | 说明 |
|---|---|---|---|
change |
值改变 | 全部 | |
select |
选择 | 全部 | 选中内容回调 |
before-select |
选择前 | 全部 | 选中数据前回调 |
图标选择器 ​
| 事件编码 | 事件名称 | 适用范围 | 说明 |
|---|---|---|---|
change |
值改变 | 电脑端 | |
select |
选择 | 电脑端 | 选中内容回调 |
图片选择器 ​
| 事件编码 | 事件名称 | 适用范围 | 说明 |
|---|---|---|---|
before-file-action |
操作前 | 电脑端 | 图片选择器所有操作前事件 |
change |
值改变 | 全部 |
附件 ​
| 事件编码 | 事件名称 | 适用范围 | 说明 |
|---|---|---|---|
before-file-action |
操作前 | 全部 | 附件所有操作前事件 |
change |
值改变 | 全部 |
多附件 ​
| 事件编码 | 事件名称 | 适用范围 | 说明 |
|---|---|---|---|
change |
值改变 | 全部 | |
before-file-action |
操作前 | 全部 | 多附件所有操作前事件 |
数据集合 ​
| 事件编码 | 事件名称 | 适用范围 | 说明 |
|---|---|---|---|
grid-render |
列表渲染 | 全部 | |
change |
值改变 | 全部 |
下拉框 ​
| 事件编码 | 事件名称 | 适用范围 | 说明 |
|---|---|---|---|
change |
值改变 | 全部 | 选中 option 或 value 变化时调用 |
before-select |
选择前 | 全部 |
虚拟字段 ​
| 事件编码 | 事件名称 | 适用范围 | 说明 |
|---|---|---|---|
change |
值改变 | 全部 | |
renderer |
渲染 | 全部 | |
input-style |
input样式 | 电脑端 |
其他单事件组件 ​
下列组件各只有一个事件,合并列出:
| 组件 | 事件编码 | 事件名称 | 适用范围 | 说明 |
|---|---|---|---|---|
| 多选框 | change |
值改变 | 全部 | 输入框内容变化回调 |
| HTML编辑器 | change |
值改变 | 全部 | 编辑器内容变化回调 |
| 时间 | change |
值改变 | 全部 | 时间变化回调 |
| 日期 | change |
值改变 | 全部 | 时间变化回调 |
| 数值框 | change |
值改变 | 全部 | 变化回调 |
| 拼音 | change |
值改变 | 全部 | |
| 单选框 | change |
值改变 | 全部 | 选项变化回调 |
| 评星 | change |
值改变 | 全部 | |
| 文本域 | change |
值改变 | 全部 | |
| 编号 | change |
值改变 | 全部 | |
| 文本框 | change |
值改变 | 全部 | 输入框内容变化回调 |
| 智能查询 | query |
查询后 | 全部 | |
| 公共 | common-base |
公共事件脚本 | 全部 | 平台函数编辑器帮助按钮激活适用 |
TIP
全平台共 96 个功能事件。带 change / click / select 等的多为异步事件,其脚本可执行异步逻辑(如发请求后再决定后续行为)。可在系统 开发 › 平台帮助 › 脚本模板 按组件浏览并编辑脚本,请勿凭空编造事件名或上下文字段。
前端组件与工具 ​
它在二次开发中的位置
前端二次开发用到的全局 API,都可在 开发 › 平台帮助 › 平台前台API 查阅——那是一棵树形目录,每个方法都附带说明与代码案例。这些方法在平台功能事件的事件脚本里可直接使用。
平台前台API 树分四个顶层类目:JE(全局静态类与 Vue 能力)、EventOptions(事件上下文对象)、实例对象、常用案例。本页重点列出 JE 类目。

平台前台API 以树形列出全部全局方法,点开任一方法可查看说明与代码案例。
JE 全局静态类 ​
JE 是全局静态类,可在所有事件脚本里直接使用。下表列出其全部全局方法:
| 方法 | 说明 |
|---|---|
h() |
创建虚拟 DOM 节点(vnode) |
uuid() |
生成 UUID 唯一码 |
ajax(options) |
ajax 数据请求 |
syncAjax(options) |
同步 ajax 数据请求 |
encode(object) |
将对象转为 JSON 字符串 |
decode(string) |
将 JSON 字符串转为对象 |
pinyin(str, type) |
文字转拼音 |
uploadFile(options) |
上传附件 |
toValue(value, defaultValue) |
取值,如果空取默认值 |
dateFormat(date, format) |
日期格式化为字符串 |
dateParse(dateStr, format) |
日期字符串解析为日期对象 |
dateClearTime(date) |
日期清空时分秒 |
useVue() |
vue 类库(取得下方 Vue 能力) |
Vue 3 能力(通过 useVue 暴露) ​
通过 JE.useVue() 取得 Vue 3 的核心能力,事件脚本 / 前端微应用可基于这套能力按 Vue 3 组合式 API 的常规写法开发。按用途分组如下:
通用 ​
| 方法 | 说明 |
|---|---|
nextTick() |
等待下一次 DOM 更新刷新的工具方法 |
defineComponent() |
定义 Vue 组件时提供类型推导的辅助函数 |
defineAsyncComponent() |
定义异步组件,运行时懒加载 |
响应式:核心 ​
| 方法 | 说明 |
|---|---|
ref() |
接受内部值,返回响应式可更改的 ref 对象(.value 访问) |
computed() |
接受 getter,返回只读响应式 ref;也可传 get/set 创建可写 ref |
reactive() |
返回对象的响应式代理 |
readonly() |
返回原值的只读代理 |
watchEffect() |
立即运行函数并响应式追踪依赖,依赖变化时重执行 |
watch() |
侦听一个或多个响应式数据源,变化时调用回调 |
生命周期钩子 ​
| 方法 | 说明 |
|---|---|
onMounted() |
组件挂载完成后执行 |
onUpdated() |
组件因响应式状态变更更新 DOM 树后调用 |
onUnmounted() |
组件卸载后调用 |
onBeforeMount() |
组件完成响应式状态设置、DOM 节点创建前调用 |
TIP
平台还提供 onBeforeUpdate、onBeforeUnmount 等其余 Vue 生命周期钩子,完整可在系统树中浏览。
ajax 数据请求 ​
JE.ajax(options) 是统一的请求封装,参数:url / params / headers / method(默认 POST) / timeout(默认 300000) / token(默认 true) / baseURL;返回 Promise。下面是平台真实示例:
// JE.ajax(options) 参数:url / params / headers / method(默认 POST) / timeout(默认 300000) / token(默认 true) / baseURL;返回 Promise
// 无参数
JE.ajax('/je/xxx').then((data) => {
console.log(data);
});
// 对象参数
JE.ajax({ url: '/je/xxx', params: {}, headers: {} }).then((data) => {
console.log(data);
});
// 多 ajax 同步等待
Promise.all([JE.ajax('/je/xxx'), JE.ajax('/je/yyy')]).then(([a, b]) => {
// ...
});
其他类目 ​
平台前台API 树除 JE 外,还有三个类目:
- EventOptions:事件方法体里解构的上下文对象,例如
$func、$grid、row等。它是功能事件脚本的入参,承载当前功能、表格、行数据等上下文,详见平台功能事件。 - 实例对象:表单、表格、按钮等运行时实例的可调用对象,提供取值、刷新、校验等实例级操作。
- 常用案例:按场景整理的可复制代码案例,覆盖事件脚本中的高频写法。
TIP
以上为 JE 类目全部全局方法;各方法的完整参数与返回结构,以及 EventOptions / 实例对象 / 常用案例 的代码案例,可在系统 开发 › 平台帮助 › 平台前台API 逐项查看。
四、部署集成
Windows 启动 ​
本页介绍在 Windows 10 / 11 上解压并启动 JECloud AI 灵象的完整流程。
第一步:解压 ​
将下载到的 -windows.zip 发行包解压到一个纯 ASCII、无空格、无符号链接的目录,例如:
D:\jecloud-linxiang
路径要求
- 路径只能包含英文字母、数字和常见符号(
-_/\) - 路径各级目录名不能含中文、空格
- 安装目录不能是符号链接
错误示例:C:\Program Files\灵象\ 或 C:\用户\我的程序。
原因:内嵌 MariaDB 在初始化时会把路径传给 mysqld 子进程,路径含有非 ASCII 字符或空格时,InnoDB 无法正常启动。
解压后目录结构如下:
D:\jecloud-linxiang\
├── jeapp-standalone.jar 主程序(薄启动器,依赖在 lib/,不能 java -jar)
├── plugins/
│ ├── system/ 平台 8 个服务 jar(出厂自带,勿删)
│ └── business/ 业务插件(自定义开发时放这里,出厂为空)
├── lib/ 第三方依赖库(运行时由脚本加入 -cp)
├── license/ 证书文件目录(放 jecloud.license)
├── data/
│ └── mysql/ MariaDB 数据目录(首次启动时自动创建)
├── config/
│ └── application.yml 外部配置(端口、DB/Redis 凭据等)
├── logs/ 运行日志(spring.log,按日期滚动)
├── web/ 前端静态资源
├── job/
│ └── jecloud-job-admin.jar 定时任务调度中心(独立进程)
└── scripts/
├── start.bat 全量启动
├── stop.bat 停止
├── start-mysql.bat 仅启动 MariaDB
├── start-redis.bat 仅启动 Redis
├── start-app.bat 仅启动应用(需 DB/Redis 已运行)
└── start-debug.bat 调试模式启动(开启远程调试端口)
第二步:一键启动 ​
在命令提示符(cmd)或文件资源管理器中双击运行:
scripts\start.bat
start.bat 做的事 ​
- 端口预检 — 检查 8080 / 7010 / 33306 / 61379 是否空闲;任一占用则立即报错退出
- 清理残留端口 — 如有上次未正常退出的残留进程,强制清理
- 启动内嵌 MariaDB(端口 33306)及 SQL bootstrap(建库/建表/写初始数据)
- 启动内嵌 Redis(端口 61379)
- 启动 Spring 应用(Tomcat 8080 + Netty WebSocket 7010)
- 后台拉起 job-admin — 等待主程序
/actuator/health返回 UP 后自动启动调度中心(3060)
Java 运行时选择顺序 ​
脚本按以下优先级选择 JVM,无需手动安装 Java(-full 包已内置):
jdk\bin\java.exe(发行包内置 JDK,优先)jre\bin\java.exe(发行包内置 JRE)- PATH 环境变量中的
java(系统已安装的 Java,须为 Java 8)
仅支持 Java 8
平台服务依赖 Java 8 API。若系统 PATH 中的 Java 为 9+,启动后 PluginLoader 的 sun.misc 反射会崩溃。使用内置 JDK/JRE 可避免此问题(-full 发行包已包含)。
关键 JVM 参数 ​
| 参数 | 值 | 说明 |
|---|---|---|
-Xms |
2048m |
初始堆大小 |
-Xmx |
4096m |
最大堆大小 |
-XX:+UseG1GC |
— | 使用 G1 垃圾收集器 |
-XX:MaxGCPauseMillis |
200 |
G1 目标最大停顿时间(ms) |
-Dfile.encoding |
UTF-8 |
文件编码(SQL bootstrap 读 UTF-8 文件) |
-DCONSOLE_LOG_CHARSET |
GBK |
控制台日志编码(Windows cmd 默认 GBK) |
-Duser.timezone |
Asia/Shanghai |
时区 |
-Duser.home |
%CD% |
重定向至发行包根目录(证书 RoPgin 依赖) |
-Dspring.config.additional-location |
file:./config/ |
外部配置目录 |
主程序以 -cp(非 -jar)方式启动,classpath 顺序为:
jeapp-standalone.jar → plugins/system/* → plugins/business/* → lib/*
此顺序是架构约束,不能调整(见 产品内核 · 插件化架构)。
分量启动(按需) ​
开发或排查问题时,可单独启动各组件:
仅启动数据库 ​
scripts\start-mysql.bat
- 运行模式:
run-mode=mysql - 堆:
-Xms64m -Xmx256m - 该窗口即是数据库进程,关闭窗口等同于停止 MariaDB
仅启动 Redis ​
scripts\start-redis.bat
- 运行模式:
run-mode=redis - 堆:
-Xms32m -Xmx128m
仅启动应用(需 DB / Redis 已运行) ​
scripts\start-app.bat
- 运行模式:
run-mode=app - 堆:
-Xms2048m -Xmx4096m - 适合只改了代码需重启应用的场景:DB/Redis 保持运行,仅重启应用进程,避免重新初始化数据库
调试模式(IDEA 远程调试) ​
scripts\start-debug.bat
与 start.bat 相同,额外追加:
-agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=*:5005
默认调试端口 5005;可通过环境变量 DEBUG_PORT 覆盖:
set DEBUG_PORT=5006
scripts\start-debug.bat
在 IDEA 中新建 Remote JVM Debug 配置,Host localhost,Port 5005(或自定义端口),连接后即可设置断点。
停止 ​
scripts\stop.bat
停止流程:
- POST
/actuator/shutdown优雅关闭应用 - 等待 5 秒
- 两轮端口清扫(pass2 使用
Stop-Process -Force)
清扫端口范围:8080(应用)、7010(WebSocket)、33306(MariaDB)、61379(Redis)、3060(job-admin)。端口值优先级:命令行参数 → config/application.yml → 内置默认值。
首次启动提示与登录 ​
首次启动时请参阅 安装与首次启动 · 总览 中的「首次启动若缺授权证书」和「启动完成后」两节,了解:
- LicenseGate 证书检查面板及处理步骤
- StartupBanner 启动完成信息框(访问地址、登录账号、数据库凭据)
- 健康检查地址
http://localhost:8080/actuator/health
Linux 启动 ​
本页介绍在 Linux(x86_64 与 aarch64/ARM64)上解压并启动 JECloud AI 灵象的完整流程。
第一步:解压 ​
根据机器架构选择对应发行包:
| 架构 | 发行包 |
|---|---|
| x86_64(Intel/AMD 64位) | jecloud-linxiang-<ver>-linux-x86_64.tar.gz |
| aarch64 / ARM64 | jecloud-linxiang-<ver>-linux-arm64.tar.gz |
解压到一个纯 ASCII、无空格、无符号链接的目录,例如:
tar -xzf jecloud-linxiang-3.1.1-linux-x86_64.tar.gz -C /opt
cd /opt/jecloud-linxiang
路径要求
- 路径只能包含英文字母、数字和常见符号(
-_/) - 路径各级目录名不能含中文、空格
- 安装目录不能是符号链接
原因:内嵌 MariaDB 在初始化时会把路径传给 mysqld 子进程,路径含有非 ASCII 字符或空格时,InnoDB 无法正常启动。
第二步:赋予执行权限 ​
chmod +x scripts/*.sh
第三步:启动 ​
bash scripts/start.sh
首次启动的幂等前置步骤 ​
首次运行时,start.sh 会自动执行以下前置脚本(幂等,已安装则跳过):
scripts/install-jre-bundle.sh— 按平台解压内置 JRE 到jre/目录(-full 包专有;-slim 包依赖外部 Java)scripts/install-mariadb-bundle.sh— macOS 及 aarch64 Linux 解压自包含 MariaDB 到mariadb/目录(x86_64 使用 mariaDB4j 内嵌二进制,无需此步骤)
start.sh 做的事 ​
- 运行幂等前置 — install-jre-bundle / install-mariadb-bundle
- 端口预检 — 检查 8080 / 7010 / 33306 / 61379 是否空闲;任一占用则立即报错退出
- 启动内嵌 MariaDB(端口 33306)及 SQL bootstrap(建库/建表/写初始数据)
- 启动内嵌 Redis(端口 61379)
- 启动 Spring 应用(Tomcat 8080 + Netty WebSocket 7010)
- 后台拉起 job-admin — 等待主程序
/actuator/health返回 UP 后自动启动调度中心(3060)
Java 运行时选择顺序 ​
脚本按以下优先级选择 JVM:
./jdk/bin/java(发行包内置 JDK,优先)./jre/bin/java(发行包内置 JRE)- PATH 环境变量中的
java(系统已安装的 Java,须为 Java 8)
仅支持 Java 8
平台服务依赖 Java 8 API。若系统 PATH 中的 Java 为 9+,启动后 PluginLoader 的 sun.misc 反射会崩溃。推荐使用 -full 发行包(内置 OpenJDK 8)。
关键 JVM 参数 ​
| 参数 | 值 | 说明 |
|---|---|---|
-Xms |
2048m |
初始堆大小 |
-Xmx |
4096m |
最大堆大小 |
-XX:+UseG1GC |
— | 使用 G1 垃圾收集器 |
-XX:MaxGCPauseMillis |
200 |
G1 目标最大停顿时间(ms) |
-Dfile.encoding |
UTF-8 |
文件编码 |
-Duser.timezone |
Asia/Shanghai |
时区 |
-Duser.home |
$(pwd) |
重定向至发行包根目录(证书 RoPgin 依赖) |
-Dspring.config.additional-location |
file:./config/ |
外部配置目录 |
Linux 控制台默认 UTF-8,无需 -DCONSOLE_LOG_CHARSET 参数(Windows 专用)。
主程序以 -cp(非 -jar)方式启动,classpath 顺序为:
jeapp-standalone.jar:plugins/system/*:plugins/business/*:lib/*
ARM64(aarch64)说明 ​
linux-arm64 发行包随包含自包含 MariaDB(因 mariaDB4j 2.5.0 无 aarch64 二进制)。首次启动时 install-mariadb-bundle.sh 会自动将 mariadb/linux-arm64.tar.gz 展开,后续启动直接使用,无需重复操作。
其他启动流程与 x86_64 完全相同。
停止 ​
bash scripts/stop.sh
停止流程:
curl -X POST http://localhost:8080/actuator/shutdown优雅关闭应用- sleep 3 秒
- 杀主进程 + job-admin 进程
lsof清理残留端口(8080 / 7010 / 33306 / 61379 / 3060)
集群从节点(可选) ​
多节点部署时,从节点使用 start-node.sh 启动(仅运行应用,连接主节点的共享 DB/Redis):
bash scripts/start-node.sh
默认主节点 IP 为 10.0.0.1(MAIN_HOST 变量),根据实际情况修改:
MAIN_HOST=192.168.1.100 bash scripts/start-node.sh
从节点特点:
- 运行模式:
run-mode=app(不启动 DB/Redis,不存文件,不跑定时任务) - 连接主节点共享 MariaDB(33306)与 Redis(61379)
- 本机仍启动 WebSocket(7010),支持推送
- 需在主节点 nginx 配置中加入从节点地址
详见 多节点集群与负载均衡。
首次启动提示与登录 ​
首次启动时请参阅 安装与首次启动 · 总览 中的「首次启动若缺授权证书」和「启动完成后」两节,了解:
- LicenseGate 证书检查面板及处理步骤
- StartupBanner 启动完成信息框(访问地址、登录账号、数据库凭据)
- 健康检查地址
http://localhost:8080/actuator/health
macOS 启动 ​
本页介绍在 macOS(Apple Silicon 与 Intel)上解压并启动 JECloud AI 灵象的完整流程。
本页内容参考随包附带的 macOS 跨机首次启动说明文档(
docs/jecloud-macos-跨机首次启动说明.html)。
发行包选择 ​
| 机型 | 发行包 |
|---|---|
| Apple Silicon(M 系列芯片) | jecloud-linxiang-<ver>-macos-arm64.zip |
| Intel Mac | jecloud-linxiang-<ver>-macos-x86_64.zip |
第一步:解压 ​
将发行包解压到一个纯 ASCII、无空格、无符号链接的目录,例如:
mkdir -p ~/work
unzip jecloud-linxiang-3.1.1-macos-arm64.zip -d ~/work/jecloud-linxiang
cd ~/work/jecloud-linxiang
路径要求
- 路径只能包含英文字母、数字和常见符号(
-_/) - 路径各级目录名不能含中文、空格
- 安装目录不能是符号链接
原因:内嵌 MariaDB 在初始化时会把路径传给 mysqld 子进程,非 ASCII 字符或空格会导致 InnoDB 无法正常启动。
第二步:清除隔离标记(quarantine)— 必须执行 ​
从网络下载或跨机拷贝来的发行包,macOS 会自动添加 quarantine(隔离)标记。若直接双击运行,系统会对包内每个可执行文件逐一弹出"无法验证开发者"对话框,导致内置 mysqld 等原生库无法启动。
首次启动前,须在终端执行一次清除操作:
cd ~/work/jecloud-linxiang # 进入解压目录
sudo xattr -cr . # 清除隔离标记(每份包仅需一次)
bash ./scripts/start.sh # 或双击 start.command
清除后即可直接双击 start.command 启动,无需每次执行。
进阶修复(清理后仍失败时) ​
若执行 sudo xattr -cr . 后仍然报"损坏"或 mysqld 无法启动,请尝试重签名原生库并重置数据目录:
cd ~/work/jecloud-linxiang
sudo xattr -cr .
find mariadb/macos-arm64 -type f \( -perm -111 -o -name '*.dylib' \) -exec codesign --force --sign - {} \; 2>/dev/null
rm -rf data/mysql
bash ./scripts/start.sh
Intel Mac
Intel Mac 请将上述命令中的 macos-arm64 替换为 macos-x86_64:
find mariadb/macos-x86_64 -type f \( -perm -111 -o -name '*.dylib' \) -exec codesign --force --sign - {} \; 2>/dev/null
第三步:启动 ​
bash scripts/start.sh
或在 Finder 中双击 start.command。
首次启动的幂等前置步骤 ​
首次运行时,start.sh 会自动执行以下前置脚本(幂等,已安装则跳过):
scripts/install-jre-bundle.sh— 按平台解压内置 JRE 到jre/目录(-full 包专有)scripts/install-mariadb-bundle.sh— 解压自包含 MariaDB 到mariadb/目录(macOS 随包含自包含 MariaDB,MariaDB.org 不提供 macOS 通用二进制)
start.sh 做的事 ​
- 运行幂等前置 — install-jre-bundle / install-mariadb-bundle
- 端口预检 — 检查 8080 / 7010 / 33306 / 61379 是否空闲;任一占用则立即报错退出
- 启动内嵌 MariaDB(端口 33306)及 SQL bootstrap(建库/建表/写初始数据)
- 启动内嵌 Redis(端口 61379)
- 启动 Spring 应用(Tomcat 8080 + Netty WebSocket 7010)
- 后台拉起 job-admin — 等待主程序
/actuator/health返回 UP 后自动启动调度中心(3060)
平台共 8 个启动阶段,控制台会依次打印 [1/8]…[8/8] 进度提示。首次约需 60–90 秒。
Java 运行时选择顺序 ​
脚本按以下优先级选择 JVM:
./jdk/bin/java(发行包内置 JDK,优先)./jre/bin/java(发行包内置 JRE)- PATH 环境变量中的
java(系统已安装的 Java,须为 Java 8)
仅支持 Java 8
平台服务依赖 Java 8 API。推荐使用 -full 发行包(内置 OpenJDK 8)。macOS 系统默认 Java 版本通常较新,会导致 PluginLoader 反射失败。
关键 JVM 参数 ​
| 参数 | 值 | 说明 |
|---|---|---|
-Xms |
2048m |
初始堆大小 |
-Xmx |
4096m |
最大堆大小 |
-XX:+UseG1GC |
— | 使用 G1 垃圾收集器 |
-XX:MaxGCPauseMillis |
200 |
G1 目标最大停顿时间(ms) |
-Dfile.encoding |
UTF-8 |
文件编码 |
-Duser.timezone |
Asia/Shanghai |
时区 |
-Duser.home |
$(pwd) |
重定向至发行包根目录(证书 RoPgin 依赖) |
-Dspring.config.additional-location |
file:./config/ |
外部配置目录 |
macOS 终端默认 UTF-8,无需 -DCONSOLE_LOG_CHARSET 参数(Windows 专用)。
停止 ​
bash scripts/stop.sh
停止流程:
curl -X POST http://localhost:8080/actuator/shutdown优雅关闭应用- sleep 3 秒
- 杀主进程 + job-admin 进程
lsof清理残留端口(8080 / 7010 / 33306 / 61379 / 3060)
首次启动提示与登录 ​
首次启动时请参阅 安装与首次启动 · 总览 中的「首次启动若缺授权证书」和「启动完成后」两节,了解:
- LicenseGate 证书检查面板及处理步骤
- StartupBanner 启动完成信息框(访问地址、登录账号、数据库凭据)
- 健康检查地址
http://localhost:8080/actuator/health
配置说明 ​
配置在哪 ​
所有运行时配置只需修改一个文件:
<发行包根>/config/application.yml
发行包内置的默认值写在 jeapp-standalone.jar 里的 BOOT-INF/classes/application.yml,不要修改 jar 内的文件。启动时通过 -Dspring.config.additional-location=file:./config/ 加载外部配置,外部 yml 中的字段会覆盖 jar 内默认值。
三层优先级(从低到高):
| 层级 | 位置 | 说明 |
|---|---|---|
| 1(最低) | jar 内 BOOT-INF/classes/application.yml |
默认值,随版本更新 |
| 2 | config/application.yml |
生产/现场配置,只改这里 |
| 3(最高) | JVM 参数 -Dxxx 或命令行 --xxx=yyy |
临时覆盖,重启后仍有效(若写入 start.bat) |
端口配置 ​
默认端口及联动关系:
| 端口 | 用途 | 配置位置 |
|---|---|---|
| 8080 | HTTP(Tomcat) | config/application.yml → server.port |
| 7010 | WebSocket(connector) | jar 内 instant.conf(需提取覆盖) |
| 33306 | 内嵌 MariaDB | config/application.yml → jecloud.standalone.embedded-db.port |
| 61379 | 内嵌 Redis | config/application.yml → jecloud.standalone.embedded-redis.port |
| 3060 | 调度中心(XXL-Job admin) | config/jecloud-job.properties → server.port |
| 9999 | 调度执行器(XXL-Job executor) | config/application.yml → jecloud.standalone.xxl-job.executor-port |
改端口须同步三处(8080 / 7010 / 33306 / 61379)
StandaloneApplication 启动期、config/application.yml、instant.conf 三处都记录了端口。只改其中一处会造成内嵌库或 connector 绑错端口。具体联动:
- 改 8080:改
server.port同时,若有反向代理需同步更新上游地址。 - 改 7010:WebSocket 端口在 jar 内
instant.conf里,需从 jar 中提取到config/instant.conf,修改后在 start.bat 中增加-Dconfig.file=./config/instant.conf。 - 改 33306 / 61379:改
config/application.yml即可;调度中心 datasource URL 也需同步更新。 - 改 3060(调度中心):需同步修改
config/jecloud-job.properties(server.port)和config/application.yml(jecloud.standalone.xxl-job.admin-addresses)。 - 改 9999(执行器):需同步修改
config/application.yml(jecloud.standalone.xxl-job.executor-port)。
DB / Redis 凭据 ​
所有数据库和缓存凭据统一在一处配置:config/application.yml。
默认值:
spring:
datasource:
username: root # 内嵌 MariaDB 固定使用 root 账号
password: bt5 # 数据库密码(默认 bt5)
redis:
password: 123456 # Redis 密码(默认 123456)
- 主节点:首次启动时程序用这份凭据初始化内嵌 MariaDB(创建
localhost/127.0.0.1/%三个 host 的root账号并设置密码),同时设置 Redisrequirepass,并灌入全量基础数据。运行时平台服务也使用同一份凭据连接。 - 从节点 / 外部库:在同一份 yml 设置
jecloud.standalone.shared-host为主节点 IP,username/password填目标库凭据,run-mode=app不初始化库、直接连接。
改密码必须重新初始化数据库
密码在首次初始化时写入 data/mysql/(MariaDB 内部用户表)。直接修改 yml 后重启无效,旧密码仍生效。
正确的改密码流程:
- 停服:
scripts\stop.bat - 删除数据目录:
del /S /Q data\mysql\(Windows)或rm -rf data/mysql/(Linux/macOS) - 修改
config/application.yml中的密码 - 启动:
scripts\start.bat(重新建库并使用新密码初始化)
正常重启(不删 data/mysql/)是幂等的,不会重新初始化密码。
内置的三个数据库 ​
standalone 用一个内嵌 MariaDB 进程(端口 33306,账号 root/bt5)承载三个互相隔离的数据库:
| 数据库 | 用途 |
|---|---|
jecloud_platform |
平台库——平台 8 个服务的核心数据:账号/角色/权限/部门、功能与元数据、流程定义、附件登记、消息、系统配置等不可卸载模块。对应 sql/ 的 platform 基线。 |
jecloud_business |
业务库——各方案/产品包(demo / crm / hr 等)建的业务表,可随方案独立卸载/重装。standalone 的 MyBatis 拦截器在 SQL 解析时给业务表自动加 jecloud_business. 前缀路由到此库;可单独 mysqldump --databases jecloud_business 备份。 |
jecloud-job |
调度库——XXL-Job 的 xxl_job_* 任务配置表;由独立部署的调度中心(默认端口 3060)连接读写;与平台/业务库物理隔离。 |
三个库均通过同一账号 root/bt5 连接同一个 MariaDB 进程(端口 33306),但在 schema 层面完全独立。
相关文档
- 备份恢复见 备份与恢复
- 业务表路由机制见 数据库使用规则
- 调度库详细说明见 定时任务(XXL-Job)
安全提示 ​
使用非默认密码时,请注意以下几点:
-
凭据明文写入 Apollo 缓存:启动期程序会把
spring.datasource.*、spring.redis.*等凭据以明文写入apollo-cache/jecloud-standalone/config-cache/*.properties(平台服务通过该文件读取连接信息)。该目录权限等同本机文件,请确保 dist 安装目录只有受信任的用户可访问,并将该目录排除出备份/同步范围,避免明文外泄。 -
灌库阶段密码短暂可见:
SqlBootstrapRunner调用 mysql 命令行客户端时,密码以--password=参数传入。在子进程存活的短暂窗口内,密码可被本机ps命令或任务管理器看到。单机本地部署可接受;多用户共享主机请注意。 -
调度中心密码单独配置:调度中心(XXL-Job admin)是独立的 Java 进程,不读取
config/application.yml,其数据库连接在config/jecloud-job.properties中单独配置(spring.datasource.password,默认bt5,连接同一台内嵌 MariaDB 的jecloud-job库)。如果修改了 DB 密码并重新初始化,必须同步修改config/jecloud-job.properties中的密码,否则调度中心启动后无法连接数据库。
功能开关速查 ​
| 配置项 | 默认值 | 说明 |
|---|---|---|
jecloud.standalone.xxl-job.enabled |
true |
关闭后不启动 XXL-Job 执行器;调度中心仍独立运行。详见 定时任务(XXL-Job) |
jecloud.standalone.dev-forward.enabled |
false |
开发态服务转发(dev-forward)总开关;生产环境保持关闭。详见 dev-forward 断点调试 |
jecloud.standalone.shared-host |
(空) | 多节点集群时填写主节点 IP,从节点连接主节点的 MariaDB/Redis。详见 多节点集群与负载均衡 |
相关链接 ​
多节点集群与负载均衡 ​
架构概述 ​
JECloud AI 灵象支持横向扩展为"1 主节点 + N 从节点 + nginx 轮询"架构,分摊高并发请求。
| 角色 | 启动脚本 | 职责 |
|---|---|---|
| 主节点(×1) | scripts\start.bat(run-mode=all) |
起内嵌 MariaDB(33306) + 内嵌 Redis(61379) + 应用(8080) + WebSocket(7010) + 定时任务;存储文件 |
| 从节点(×N) | scripts\start-node.bat(run-mode=app) |
连接主节点共享 MariaDB / Redis;不起 DB / Redis,不存文件,不跑定时任务;本机起应用(8080) + WebSocket(7010) |
| nginx(×1) | scripts\start-nginx.bat / start-nginx.sh |
反向代理轮询全部节点;文件流量(document)固定转发主节点 |
登录态无需会话粘滞:身份验证基于 token + 共享 Redis,任意节点都能验证,nginx 轮询不需要 sticky session。
部署步骤 ​
第一步:启动主节点 ​
在主节点机器上正常执行:
scripts\start.bat
主节点就绪后,放开防火墙,允许所有从节点访问:
- 端口 33306(MariaDB)
- 端口 61379(Redis)
内网隔离
33306 和 61379 仅应对从节点所在子网开放,切勿暴露到公网。详见下方已知限制中的安全说明。
第二步:配置并启动从节点 ​
在每台从节点机器上:
-
解压同一份发行包。
-
Windows:用文本编辑器打开
scripts\start-node.bat,将顶部的MAIN_HOST改为主节点 IP:batset "MAIN_HOST=<主节点IP>" -
Linux/macOS:编辑
scripts/start-node.sh顶部的MAIN_HOST:bashMAIN_HOST=<主节点IP>或以环境变量方式传入:
bashMAIN_HOST=<主节点IP> bash scripts/start-node.sh -
运行脚本:
batscripts\start-node.bat从节点不会初始化
data/mysql/,也不会监听 33306 / 61379。
第三步:配置并启动 nginx ​
准备 nginx 二进制:
- Windows:发行包已内置
nginx/nginx.exe,无需安装。 - Linux:
sudo apt install nginx或sudo yum install nginx。 - macOS:
brew install nginx。
脚本检测到 nginx/ 目录下有二进制时优先使用,否则使用系统 PATH 中的 nginx。
编辑 nginx/conf/nginx.conf,修改三个 upstream:
# 文件流量 —— 只填主节点
upstream jecloud_main {
server <主节点IP>:8080;
}
# HTTP 业务流量 —— 填全部节点(主节点建议 weight=1,从节点 weight=3)
upstream jecloud_http {
server <主节点IP>:8080 weight=1;
server <从节点1IP>:8080 weight=3;
server <从节点2IP>:8080 weight=3;
}
# WebSocket —— 填全部节点
upstream jecloud_ws {
server <主节点IP>:7010;
server <从节点1IP>:7010;
server <从节点2IP>:7010;
}
启动 nginx:
scripts\start-nginx.bat
Linux/macOS:
bash scripts/start-nginx.sh
启动后,浏览器通过 nginx 80 端口访问平台。
停止 nginx:
scripts\stop-nginx.bat
验证 ​
部署完成后,执行以下检查确认集群正常工作:
- 轮询不掉线:反复刷新页面或在不同标签页操作,登录态始终稳定,不出现需要重新登录的情况。
- 跨节点推送:在一个节点发起操作(如审批、消息),目标用户无论连接到哪个节点都能收到实时推送(待办/通知)。
- 文件上传下载:从任意节点上传文件,通过任意节点均可正常下载/预览(document 服务流量恒落主节点)。
- 定时任务只跑一份:确认定时任务仅在主节点执行(从节点
jecloud.standalone.xxl-job.enabled=false),不重复触发。
已知限制 ​
-
文件吞吐瓶颈:所有文件存储在主节点磁盘。文件上传下载量较大时,主节点磁盘 I/O 和带宽是瓶颈。如有需要,可后续接入共享存储或对象存储。
-
主节点负载偏重:主节点同时承担数据层(MariaDB / Redis)、文件存储和定时任务。通过 nginx 将大部分 HTTP 流量引到从节点(
weight=3)可以减轻主节点的应用层压力。 -
从节点本地临时文件:少数导出/预览功能可能在处理请求的节点本地生成临时文件;若该节点不是主节点,跨节点拉取时可能找不到该文件(边缘场景)。
-
主节点单点:主节点宕机则整个集群不可用(本版本不提供主节点高可用,HA 列入后续路线图)。
-
安全:主节点的 33306 / 61379 端口需对从节点子网开放,务必置于可信内网并配合防火墙隔离,切勿暴露到公网。
相关链接 ​
- 配置说明 — DB / Redis 凭据修改、
shared-host配置项说明 - 启停与健康检查 — 单节点启停脚本说明
- 定时任务(XXL-Job) — 集群中定时任务只在主节点运行
备份与恢复 ​
定期备份可以在磁盘损坏、误操作或升级失败后快速恢复现场。本文说明需要备份哪些目录、如何执行冷备份与热备份,以及如何完整恢复。
要备份什么 ​
| 目录 | 重要性 | 说明 |
|---|---|---|
data/mysql/ |
最关键 | 内嵌 MariaDB 数据文件,所有业务数据都在这里 |
files/ |
高 | 用户上传的附件、导出文件、工作流附件等 |
license/ |
高 | 证书文件(jecloud.license 及各插件密钥),重装后无法自动恢复 |
config/ |
高 | application.yml(含端口、密码自定义)、jecloud-job.properties 等运维配置 |
apollo-cache/ |
可省略 | 含明文数据库/Redis 凭据,重启时会自动从 config/application.yml 重建,无需备份 |
logs/ |
可省略 | 日志文件,不影响业务恢复 |
最小备份集
如果磁盘空间紧张,至少保证备份 data/mysql/、files/、license/、config/ 这四个目录。
冷备份流程(推荐) ​
冷备份在停服状态下进行,数据一致性最强,是推荐方案。
步骤 ​
-
停服(确保 MariaDB 数据文件完整落盘):
batscripts\stop.bat -
复制关键目录到备份位置。
Windows(xcopy):
batxcopy /E /I /Y data backup\data xcopy /E /I /Y files backup\files xcopy /E /I /Y license backup\license xcopy /E /I /Y config backup\configLinux / macOS(tar):
bashtar czf backup-$(date +%Y%m%d%H%M%S).tgz data files license config -
重新启动:
batscripts\start.bat
建议频率
业务数据每天冷备份一次;重大操作(升级、大批量导入)前必须备份。
恢复流程 ​
-
停服:
batscripts\stop.bat -
用备份覆盖对应目录(整体替换,不要合并):
Windows:
batrmdir /S /Q data\mysql xcopy /E /I /Y backup\data\mysql data\mysql xcopy /E /I /Y backup\files files xcopy /E /I /Y backup\license license xcopy /E /I /Y backup\config configLinux / macOS:
bashrm -rf data/mysql tar xzf backup-20240601120000.tgz -
启动:
batscripts\start.bat
恢复密码一致性
data/mysql/ 里存储的是 MariaDB 内部用户表,密码在首次初始化时写入数据库。如果备份时的 config/application.yml 与当前的 config/application.yml 数据库密码(spring.datasource.password,默认 bt5)不一致,恢复后应用将无法连接数据库。
解决方法:恢复 data/mysql/ 时,同步恢复对应的 config/application.yml,确保密码与数据库一致。
不建议跨密码恢复;如果必须切换密码,需停服后删除 data/mysql/ 让系统重新初始化(所有数据将丢失)。详见 配置说明。
不停机热备(进阶) ​
如果业务不能中断,可以用 mysqldump 对运行中的内嵌 MariaDB 做逻辑热备。热备的一致性弱于冷备(备份期间仍有写入时,多表间可能存在短暂不一致),适合作为冷备的补充。
mysqldump -h 127.0.0.1 -P 33306 -u root -p<密码> \
--single-transaction \
--routines --triggers \
jecloud > backup-jecloud-$(date +%Y%m%d%H%M%S).sql
把
`<密码>`替换为实际密码(默认bt5;-p与密码之间不加空格)。
恢复时:
mysql -h 127.0.0.1 -P 33306 -u root -p<密码> jecloud < backup-jecloud-20240601.sql
热备局限
热备只备份数据库内容,不包含 files/、license/、config/ 等目录。生产环境建议配合冷备一起使用。
相关链接 ​
数据清理与方案整理 ​
操作不可逆,务必二次确认
以下两个清理操作会永久删除数据,请一定在确认后再点击,并建议先备份(见 备份与恢复)。
清理方案有两种方式:直接在平台界面点按钮(界面操作,推荐日常使用),或调用本机 REST 端点(命令行方式,适合脚本化/批量)。两者最终落到同一套后端逻辑。
界面操作 ​
入口 ​
进入 开发 › 服务管理 › 方案类服务管理,点击 business(业务服务)这条数据进入其表单,表单顶部工具栏有两个红色按钮:

开发 › 服务管理 › 方案类服务管理:进入 business 后,表单顶部工具栏的两个红色清理按钮。
两个按钮的含义 ​
| 按钮 | 含义 |
|---|---|
| 清理测试数据 | 清理所有的流程实例和测试业务数据(保留方案骨架:资源表 / 功能 / 菜单等配置) |
| 清理开发所有数据 | 移除所有业务开发的资源表、功能、菜单、数据字典、工作流资源(卸载整个方案的开发产物) |
两者的差别一定要分清
- 清理测试数据:只清空演示 / 测试的业务数据行,方案骨架(资源表、功能、菜单、字典等配置)原样保留,常用于演示完毕后归零数据。
- 清理开发所有数据:会删掉你搭的所有低代码资源,等同清空整个方案,慎用。执行后无法撤销,务必先备份。
命令行方式(脚本化) ​
JECloud AI 灵象同时提供两个本机管理端点,用于清理方案数据或清空方案业务内容。两个端点均只绑 127.0.0.1,只能从安装了灵象的本机调用。集群/反代部署时,dist 自带 nginx 模板已禁止 /je/standalone/ 路径;自定义反代配置务必同样封堵,否则远端用户可绕过本机限制。
两个端点 ​
| 端点 | 作用 |
|---|---|
POST /je/standalone/cleanup/data?productCode=xxx |
清空该方案所有业务表的数据行 + 流程运行/历史实例(表结构、字典、流程定义等设计信息全部保留;树形表保留 ROOT 根节点) |
POST /je/standalone/cleanup/design?productCode=xxx |
清空方案业务内容、保留方案骨架:删流程实例+定义、资源表(PT/TREE/VIEW 三类按产品库 DROP)、功能(含子系统全部删除)、子菜单、字典;保留根菜单(SY_PARENT='ROOT')与方案记录本体(JE_PRODUCT_MANAGE) |
使用前提:
- 仅允许方案类服务(产品管理中
PRODUCT_TYPE='1');meta / rbac / workflow 等平台服务会被拒绝,返回错误提示。 - 同一时刻只允许一个清理请求执行(并发调用返回"另一个清理操作正在执行,请稍后重试")。
用法 ​
缺省即真执行——不带 confirm 就会动数据
confirm 参数的语义与直觉相反:缺省(不带参数)= 真执行,confirm=true = 仅预览不动数据。 执行不可逆操作前,务必先加 confirm=true 预览,确认清单无误后再去掉参数真正执行。
# 1. 只预览将清理的内容(confirm=true,不动数据)
curl -X POST "http://127.0.0.1:8080/je/standalone/cleanup/data?productCode=demo&confirm=true"
# 2. 真执行(缺省即真删,无需任何额外参数)
curl -X POST "http://127.0.0.1:8080/je/standalone/cleanup/data?productCode=demo"
同理,design 端点:
# 预览将清空的业务内容(保留骨架;confirm=true 仅预览)
curl -X POST "http://127.0.0.1:8080/je/standalone/cleanup/design?productCode=demo&confirm=true"
# 真执行(表 DROP 不可逆!建议先备份 data/;缺省即真执行)
curl -X POST "http://127.0.0.1:8080/je/standalone/cleanup/design?productCode=demo"
confirm 参数解析规则:true、1、yes、on(大小写不敏感)均视为仅预览;缺省或 false 为真执行;非法值(如 ture、ok)返回 HTTP 400 且不会执行任何操作。
返回结构 ​
两个端点均返回统一 JSON 格式,data.steps[] 逐步列出统计与执行结果:
{
"code": "1000",
"success": true,
"message": "操作成功",
"data": {
"productCode": "demo",
"productName": "第一个服务",
"dryRun": true,
"steps": [
{ "step": "workflow-instances", "instances": 12, "status": "ok" },
{ "step": "business-tables",
"tables": [{ "name": "HR_QJSQ", "type": "PT", "rows": 2 }],
"status": "ok" }
],
"hasFailures": false,
"executed": false
}
}
真执行(缺省,不带 confirm)时每个表条目追加实际删除行数,TREE 类型表追加 rootPreserved(true = 已保留 ROOT 根节点),executed 为 true。执行过程的逐步进度通过控制台 log.info 实时输出(含"共 N 张表、当前第 i/N 张");接口同步返回,响应体不含逐步日志,仍返回完整 steps[]。
每步 status 取值:
| status | 含义 |
|---|---|
ok |
成功 |
failed |
本步执行失败(计入 hasFailures) |
warning |
附加能力(工作流清理)失败,已跳过;不计入 hasFailures,不阻塞后续步骤 |
脚本判定失败的三层契约 ​
必须按三层顺序逐一检查,不能只看 HTTP 状态码
| 层 | 信号 | 含义 |
|---|---|---|
| 第 1 层 | HTTP 状态非 2xx | 请求未进入业务逻辑(如 confirm 非法值的 400) |
| 第 2 层 | success == false |
前置被拒(方案不存在、非方案类服务、互斥锁占用等);此时无 hasFailures 字段,HTTP 仍为 200,原因看 message |
| 第 3 层 | success == true 且 data.hasFailures == true |
操作执行了但至少一步 failed,逐步看 data.steps[].status 与 errors |
推荐 bash + jq 判定写法(以真执行为例):
# 真执行 = 缺省、不带 confirm(带 confirm=true 只会预览不动数据)
resp=$(curl -s -w '\n%{http_code}' -X POST \
"http://127.0.0.1:8080/je/standalone/cleanup/data?productCode=demo")
body=$(echo "$resp" | head -n -1)
http=$(echo "$resp" | tail -n 1)
[ "$http" = "200" ] || { echo "HTTP $http"; exit 1; }
[ "$(echo "$body" | jq -r .success)" = "true" ] || { echo "$body" | jq -r .message; exit 1; }
[ "$(echo "$body" | jq -r .data.hasFailures)" = "false" ] || { echo "$body" | jq '.data.steps'; exit 1; }
echo "清理完成"
完整调用示例 ​
# 1. 预览将清理的业务数据(confirm=true,无副作用)
curl -X POST "http://127.0.0.1:8080/je/standalone/cleanup/data?productCode=demo&confirm=true"
# 2. 核对无误后真执行(缺省即真删,不带 confirm)
curl -X POST "http://127.0.0.1:8080/je/standalone/cleanup/data?productCode=demo"
# 3. 预览清空业务内容(保留骨架;confirm=true,无副作用)
curl -X POST "http://127.0.0.1:8080/je/standalone/cleanup/design?productCode=demo&confirm=true"
# 4. 核对无误后真执行(表 DROP 不可逆!建议先备份 data/)
curl -X POST "http://127.0.0.1:8080/je/standalone/cleanup/design?productCode=demo"
安全 ​
反代部署请封堵 /je/standalone/ 路径
- 两个端点只绑
127.0.0.1,非本机来源一律返回403,无需平台 token 鉴权。 - dist 自带 nginx 模板已
deny/je/standalone/前缀。 - 自定义反代配置(含集群节点对外的 nginx/HAProxy)必须同样封堵该路径前缀,否则远端用户可绕过本机限制。
design 端点执行前务必备份 ​
design 端点中的资源表 DROP 不可逆
/cleanup/design 会 DROP 物理数据表,执行后无法撤销。
执行前务必完成以下步骤:
- 停止应用:
scripts\stop.bat - 冷拷贝
data/目录到安全位置(详见 备份与恢复) - 重启应用,再执行清理
常见问题 ​
"仅允许清理方案类服务"
productCode 指向的是平台服务(如 meta、rbac、workflow)或产品类型不是 '1'。请在产品管理界面确认该方案的 PRODUCT_TYPE 为 '1'。
design 会删掉方案本身吗?
不会。design 现在是"清空业务内容、保留骨架":保留根菜单(SY_PARENT='ROOT')与方案记录本体(JE_PRODUCT_MANAGE);流程实例/定义、资源表(PT/TREE/VIEW 三类按产品库 DROP)、功能(含子系统全部删除)、子菜单、字典都清。因此不再需要先移除开发者角色,可直接调用 design 端点。
树形表清完为什么还剩一行?
data 清理对树形(TREE)表会保留主键值为 ROOT 的根节点(业务树需要根节点占位)。主键列由 INFORMATION_SCHEMA 实时解析;万一无法识别唯一主键列,会回退全表清空并在日志/rootPreserved=false 中标注。design 端点是整表 DROP,不涉及此项。
执行时怎么看进度?
清理为同步执行(无后台任务),过程逐步打到控制台日志(log.info),含"共 N 张表、当前第 i/N 张表"等进度;接口同步返回完整 steps[],失败原因在 steps[].error 一并回前端。
workflow 步骤显示 warning
工作流清理为附加能力(best-effort):先调引擎接口删(byEngine),删不掉的转 SQL 兜底(bySql)。引擎不可用或删除异常时,该步骤标记为 warning 并跳过,不影响其余清理步骤,hasFailures 不受影响。如需彻底清理流程,修复原因后重新调用同一端点即可续删(操作幂等)。
resource-tables 步骤报"互引环或子表不在本方案内"
错误信息会列出每张卡住表的 children(引用它的子表)详情。按提示在低代码建模工具中解开相互引用关系后,重新调用端点重试。
删视图报 Unknown table 'jecloud_platform.v_xxx'?
已修复。现按产品类型判定所属库(平台层→jecloud_platform,方案类→jecloud_business),带库前缀显式 DROP,PT/TREE/VIEW 三类一致。若仍出现此错误,说明您使用的是旧版本,建议升级。
想彻底重来、清空所有数据
停止应用,删除 data/mysql/ 目录,重启后系统会从零重建全新数据库(包含基线数据)。注意:此操作同时清空所有方案及平台数据,不可恢复。
相关链接 ​
增强组件(增强套件) ​
增强组件是 JECloud 平台核心之外、可按需选装的能力包。底座保持精简,需要门户大屏、移动端、升级运维、信创安全等进阶能力时,再以套件形式选装即可。
本页整理自 JECloud 官方商城 jecloud.net/shop 的「增强组件」目录,列出全部官方增强组件及其说明,方便你按业务需要选型。
购买与授权
增强组件为商业增值组件。官方说明:「此产品在购买时,需要与平台商业证书进行绑定。在您支付前,请确认使用本产品的 JECloud 平台商业证书。」 标价仅供参考,未标价者为「立即咨询」,具体以官方报价为准——请通过 官方商城 联系销售。单机版(灵象)能装载哪些组件、是否随包交付,以你的实际授权与交付物为准。
一、流程与业务编排 ​
| 组件 | 价格 | 官方说明 |
|---|---|---|
| 流程管理套件 | 立即咨询 | 优化流程审批流转,提升流程审批效能 |
| 业务全流程套件 | 立即咨询 | 让整个业务系统串联起来的神器 |
二、端与展现 ​
| 组件 | 价格 | 官方说明 |
|---|---|---|
| 手机套件 | 立即咨询 | 支持 IOS、Android、H5、微信小程序配置开发 |
| 展示套件 | ¥14000 | 支持图表配置开发与综合门户设计 |
| 工艺图组态套件 | 立即咨询 | 企业生产管控一体化 |
三、开发与运维 ​
| 组件 | 价格 | 官方说明 |
|---|---|---|
| 升级套件 | ¥4000 | 支持各个项目之间的功能级迁移与升级 |
| 运维套件 | ¥8000 | 用于自动化运维基于 JECloud 平台开发出的项目 |
| 脚本套件 | 立即咨询 | 支持全局脚本库、全局样式库、SQL 模板开发 |
| 接口引擎 | ¥6000 | 快速搭建系统对外的调用 API 接口 |
| 元数据湖 | ¥3000 | 快速定位平台各类配置数据库 |
四、文档与办公集成 ​
| 组件 | 价格 | 官方说明 |
|---|---|---|
| 文档套件 | ¥8000 | 支持动态生成 word 报告文档、在线浏览 |
| 钉钉套件 | 立即咨询 | 支持钉钉单点登录,组织人员数据同步,移动端集成 |
| 企微套件 | 立即咨询 | 支持企微单点登录,组织人员数据同步,移动端集成 |
五、安全合规(信创 / 等保) ​
| 组件 | 价格 | 官方说明 |
|---|---|---|
| 三员套件 | 立即咨询 | 支持标准的三员管理体系 |
| 密级套件 | 立即咨询 | 支持国家要求的信息化系统密级管理体系 |
| 国产化适配 | 立即咨询 | 数据库、服务器、中间件、浏览器等 |
| 数据库适配(可指定) | ¥5000 | 除 MySQL 外的其他一种数据库适配 |
六、通信与存储 ​
| 组件 | 价格 | 官方说明 |
|---|---|---|
| 存储套件 | ¥4000 | 用于扩展第三方对象存储接口 |
| 短信套件(253) | ¥2000 | 让 JECloud 支持 253 平台短信接口 |
| 短信套件(阿里云) | ¥2000 | 让 JECloud 支持阿里云平台短信接口 |
重点组件详解 ​
部分常用组件已在本手册单独成页,含官方完整介绍:
流程管理套件 ​
JECloud 的流程管理套件通过梳理和优化业务流程,减少冗余步骤,精确识别流程中的关键环节,确保每个环节都能高效运转。它包含七大核心功能:
- 流程监控:实时跟踪流程执行情况,保障业务流程顺畅流转与持续优化。
- 运行时流程:含【流程调拨】和【前后跳转】,可灵活调整业务流程与步骤执行顺序,实现资源高效配置与任务动态分配。
- 运行时规划:已发起的流程不满足当前业务需求时,可在不影响其他规划的前提下,单独对该流程做出规划调整。
- 历史流程:记录与分析过去操作为优化决策提供依据,并可将已结束流程重新启动。
- 异常流程:流程提交或执行发生异常时,管理员能清晰定位异常数据并调整。
- 运行时流程交接:人员工作变动时,可将其待办一键交给他人,实现责任动态转移。
- 未来处理人交接:人员变动时统一调整流程规划中的处理人,避免手动逐条修改的遗漏。
业务全流程套件 ​
业务流是一个公司的流程链——一项业务的几个流程的顺序,用于描述各部门、各人员之间的业务关系、作业顺序,以及整个业务的流程与走向。通过业务流,公司可对整体业务的推进进度、处理过程、时间节点及时把控,并及时发现并调整不合理的流向,保证效率。业务流图形样式支持自定义,可通过左侧元素库拖拽组合快速搭建流程,并对图形进行样式、状态、颜色等编辑。
手机套件 ​
作为专业的企业级移动应用开发平台,JEAPP 提供各种在线的 App 开发工具,可快速开发出适配多平台(iOS、Android、H5、微信小程序)的移动应用,服务领域覆盖互联网、能源、电商、教育、金融、医疗、旅游等行业。典型场景:移动审批方便快捷、外出办公随时查看工作数据。
官方特殊说明:手机套件提供 2 次免费打包服务(支持安卓、iOS 打包);超过 2 次后按 1500 元/次收取打包服务费用。
运维套件 ​
用于自动化运维基于 JECloud 平台开发出的软件项目,一键发布前后端代码包。
装载方式概述 ​
增强组件通常有两种装法(具体以各组件交付说明为准):
- 插件桶装载:把组件 jar 放到发行包
plugins/下对应的桶目录,再按 stop → 放入 → start 重启加载。插件桶的概念、加载顺序与「不支持热插拔」的约束见 业务插件开发与打包。 - 随升级包下发:部分组件(如升级套件)作为版本升级的一部分下发,配合 版本升级 流程一并安装。
以实际交付为准
各组件确切的装载目录、是否需要数据库 / 配置变更、验证方式以官方交付物为准。拿不准时一律按「待补」处理,不要臆测目录或步骤。
展示套件 ​
它属于哪里
本页属于增强套件。展示套件是可选装的能力包,不装也不影响平台核心使用。
官方定价:¥14000(标价仅供参考,以官方报价为准)。一句话:支持图表配置开发与综合门户设计。
套件介绍(官方) ​
JECloud 的展示套件包含三个关键引擎:
- 图表引擎——软件运行中产生的业务数据常需图形化分析展示,工程师可通过点选配置的方式开发出柱形图、条形图、饼图、线图、面积图、雷达图等常用图表。
- 报表引擎——可完成普通报表、交叉报表、查询报表等常见报表功能。
- 门户引擎——图表与报表开发完毕后,用门户引擎进行页面排版规划;门户除了可引入图表,还可嵌入功能数据、标准日历、超级链接、图片轮播等常用组件。当现有组件不足以支撑业务需求时,门户还提供插件机制,充分发挥工程师的创造力。
本章目标 ​
读完本章,你应当能够:
- 了解展示套件提供的能力——图表引擎 / 报表引擎 / 门户引擎三大展示类能力。
- 知道如何获取、部署和验证展示套件。
待补
上述为官方能力概述。展示套件在单机版中的确切配置入口(图表 / 报表 / 门户的设计器在哪个菜单进入)以平台实际交付为准,请勿编造功能项。补充时建议逐条列:能力名 + 一句话说明 + 配置入口。
安装与部署步骤(提纲) ​
以下为通用流程提纲,确切目录与验证方式以套件实际交付物为准。
- 获取套件:从平台 / 官方渠道获取展示套件交付物(通常为一个或多个 jar)。
- 放入插件桶:将套件 jar 放到发行包
plugins/下对应的桶目录。插件桶概念与加载顺序见业务插件开发与打包。 - 重启加载:按 stop → 放入 → start 重启灵象(插件加载发生在启动期,不支持热插拔)。
- 验证:启动完成后,确认展示相关入口 / 菜单已出现并可正常使用。
待补
- 套件确切的桶目录名(如
plugins/system/plugins/business/ 自定义桶)待确认,拿不准就留待补。 - 是否需要数据库变更 / 额外配置待补。
- 验证清单(启动后看哪个菜单、访问哪个地址确认生效)待补。
待补 ​
- [ ] 补充展示套件的具体能力清单与配置入口。
- [ ] 确认套件交付物形态(jar 数量 / 是否含前端资源)。
- [ ] 确认安装目录(具体插件桶)与是否需数据库 / 配置变更。
- [ ] 补充验证步骤(启动后如何确认生效)。
升级套件 ​
官方定价:¥4000(标价仅供参考,以官方报价为准)。一句话:支持各个项目之间的功能级迁移与升级。
套件介绍(官方) ​
在软件项目开发过程中,研发团队通常需要建立多个环境(开发、测试、生产等)。功能模块在开发环境完成后,需要打包升级到测试环境,验证无误后再升级到生产环境。JECloud 的升级套件正是为简化这一流程而设计——它能自动化打包软件中的各种资源:
- 物理表结构数据、功能配置数据、工作流配置数据
- 菜单数据、字典数据、角色数据
- 甚至业务数据
这些打包后的升级包可以轻松地在各个环境中安装和使用。
官方提示:如果项目只需要单一环境且要求不高,那么升级套件可能并不会带来太大的帮助。
与单机版内置升级的关系
单机版(灵象)已内置一套版本升级能力(保库升级、离线/在线、目标版本选择、自动/手动)。商业「升级套件」侧重跨环境、功能级的打包迁移,与内置升级互为补充,二者关系以实际交付为准。
本章目标 ​
读完本章,你应当能够:
- 了解升级套件的定位——跨环境、功能级的打包迁移升级能力包,通常随升级包下发。
- 知道如何获取、部署升级套件,以及它与版本升级流程的关系。
待补
上述为官方能力概述。升级套件在单机版中的确切交付与放置方式以平台实际交付为准,请勿编造。
与版本升级的关系 ​
升级套件不是独立运行的功能模块,而是版本升级流程的一部分。它一般随升级包一同下发,在执行升级时被一并应用。完整的升级操作(保库升级、离线 / 在线、目标版本选择、自动 / 手动)见版本升级。
安装与部署步骤(提纲) ​
以下为通用流程提纲,确切步骤以升级包说明为准。
- 获取套件:随版本升级包一同获取升级套件交付物。
- 随升级流程应用:按版本升级的步骤执行升级,套件在升级过程中被应用。
- 验证:升级完成、重启后确认目标版本生效、新增能力可用。
待补
- 升级套件是否需要单独放置(如某个目录),还是完全内含于升级包,待确认。
- 是否伴随数据库升级 / 配置变更待补(参考版本升级中的数据升级说明)。
- 验证清单(升级后如何确认套件生效、版本号何时 stamp)待补。
待补 ​
- [ ] 补充升级套件的具体能力与定位(相对标准升级的增量)。
- [ ] 确认套件交付与放置方式(内含于升级包 / 需单独放置)。
- [ ] 补充是否伴随数据库 / 配置变更。
- [ ] 补充升级后的验证步骤。
启停与健康检查 ​
启动脚本 ​
发行包根目录下的 scripts/ 提供全量启停脚本。
Windows:start.bat ​
双击或在命令提示符中执行:
scripts\start.bat
start.bat 按顺序完成以下动作:
- 端口预检:检查 8080 / 7010 / 33306 / 61379 是否被占用,任一端口冲突立即报错退出(避免启动到一半失败)。
- 启动内嵌 MariaDB(端口 33306):初始化数据目录
data/mysql/,首次启动自动建库。 - 建库 / 升级(
SqlBootstrapRunner):按顺序执行sql/schema/、sql/data/、sql/upgrade/下的 SQL 文件,已执行过的脚本自动跳过(幂等)。必须在 Spring 启动前完成,因为平台服务的@PostConstruct会查询数据库。 - 启动内嵌 Redis(端口 61379)。
- 启动 Tomcat / Spring 应用(端口 8080,WebSocket 7010):加载
plugins/下全部平台服务 jar,初始化所有业务模块。 - 等待应用就绪后拉起调度中心(
start-job-admin.bat):脚本循环轮询http://localhost:8080/actuator/health,直到返回"status":"UP"才启动独立进程job/jecloud-job-admin.jar(端口 3060)。这样可以保证jecloud-job数据库(由SqlBootstrapRunner建立)已存在,调度中心不会因找不到库而启动失败。
首次启动耗时较长
首次启动需要初始化数据库、灌入全量基础数据,通常需要 60~120 秒。后续重启约 30~60 秒。
Linux / macOS:start.sh ​
chmod +x scripts/start.sh
bash scripts/start.sh
start.sh 与 start.bat 行为一致(全量启动 MariaDB + Redis + 应用 + 调度中心)。
内置 JRE(full 包) ​
full 发行包在 jre/ 目录内置了 OpenJDK 8,脚本会优先使用 jre/bin/java,无需本机预装 Java。
停止脚本 ​
Windows:stop.bat ​
scripts\stop.bat
stop.bat 依次执行:
- 向
http://localhost:8080/actuator/shutdown发送优雅关闭请求,等待约 8 秒。 - 用
jps找到jeapp-standalone.jar的<pid>并执行taskkill /F /T /PID <pid>(杀进程树)。 - 按进程名兜底扫描并终止残留的
mysqld.exe/redis-server.exe。 - 检查 8080 / 7010 / 33306 / 61379 / 3060 各端口是否已释放,未释放则打印警告。
为什么要强杀?
MariaDB4j 启动的 mysqld 子进程和嵌入式 Redis 子进程与父 JVM 是分离的(detached),父 JVM 退出后它们仍然存活。残留的 mysqld 进程会持有 data/mysql/ibdata1 的文件锁,导致下次启动时 InnoDB 初始化失败;残留的 Redis 进程会占用 61379 端口,导致下次启动的端口预检失败。因此脚本必须主动扫描并终止这些子进程。
Linux / macOS:stop.sh ​
bash scripts/stop.sh
同样会清理 8080 / 7010 / 33306 / 61379 / 3060 各端口上的进程。
健康检查 ​
应用完全就绪后,可通过以下方式确认状态:
Actuator 接口 ​
http://localhost:8080/actuator/health
返回示例(正常):
{"status":"UP"}
调度中心就绪后还可访问:
http://localhost:3060/xxl-job-admin/
默认账号 admin / 123456。
端口自检命令 ​
确认各端口是否已监听:
Windows(命令提示符):
netstat -ano | findstr :8080
netstat -ano | findstr :7010
netstat -ano | findstr :33306
netstat -ano | findstr :61379
netstat -ano | findstr :3060
输出含 LISTENING 一行,最后一列为 <pid>(进程 ID)。
Linux / macOS:
lsof -i :8080
lsof -i :7010
lsof -i :33306
lsof -i :61379
lsof -i :3060
直接运行 jar ​
发行包的 jeapp-standalone.jar 不能 java -jar 直接启动
发行包里的 jeapp-standalone.jar 是薄启动器(thin launcher)——只含本仓编译类,第三方依赖外置在 lib/,没有完整的 Main-Class 清单,无法用 -jar 方式启动。
正常使用请直接运行 start.bat / start.sh,脚本内部会按以下 classpath 顺序启动(classpath 顺序 app → plugins → lib 不可乱):
java -cp "jeapp-standalone.jar;plugins/*;lib/*" com.je.standalone.StandaloneApplication
java -cp "jeapp-standalone.jar:plugins/*:lib/*" com.je.standalone.StandaloneApplication
如需自定义 JVM 参数(堆大小、GC 策略等),修改 scripts/start.bat 或 scripts/start.sh 里的 JAVA_OPTS 变量即可,无需手写完整启动命令。
-Duser.home 不可省略
无论通过脚本还是手动调整 JVM 参数,-Duser.home 必须指向发行包根目录,license 加载器会从 ${user.home}/license/jecloud.license 读取证书。省略后 license 将从 OS 用户目录(C:\Users\<用户名>\)查找,导致证书缺失报错。详见 证书 / License 替换。
相关链接 ​
常见问题与排错 ​
本文汇总运维过程中最常见的问题,每条给出现象 → 原因 → 解决三段说明。遇到问题先翻本页,大多数情况可以在 10 分钟内定位。
端口被占用(启动 preflight 报错) ​
现象
启动时控制台打印类似:
[FATAL] 端口 8080 已被占用,请先释放该端口后再启动
或启动后访问页面无响应,netstat 看不到对应端口监听。
原因
灵象启动前会检查四个端口(8080 / 7010 / 33306 / 61379)是否被其他进程占用,任何一个被占就会拒绝启动(fail-fast 预检)。
解决
查找占用进程:
:: Windows
netstat -ano | findstr :8080
:: 输出示例:TCP 0.0.0.0:8080 ... LISTENING 12345
:: 12345 即为 PID
# Linux / macOS
lsof -i :8080
找到 PID 后终止进程:
:: Windows
taskkill /F /PID `<pid>`
# Linux / macOS
kill -9 `<pid>`
把
`<pid>`替换为实际进程 ID。
终止后重新运行 scripts\start.bat。
mysqld / redis 残尸锁住端口或 ibdata1 ​
现象
- 使用任务管理器或
Ctrl+C强行终止应用后,下次启动报端口 33306 已被占用或InnoDB: Unable to lock ibdata1 stop.bat执行后端口仍然占用
原因
内嵌 MariaDB(mysqld 子进程)和 Redis 以独立子进程形式运行,强行终止父进程(Java)后子进程不会自动退出,继续持有端口和数据文件锁。
解决
运行 stop.bat / stop.sh,脚本会尝试清理所有子进程:
scripts\stop.bat
若仍有残留,手动强杀:
Windows(cmd):
taskkill /F /IM mysqld.exe
taskkill /F /IM redis-server.exe
Windows(PowerShell):
Get-Process mysqld | Stop-Process -Force
Get-Process redis-server | Stop-Process -Force
Linux / macOS:
pkill -f mysqld
pkill -f redis-server
清理完毕后重新启动。
改密码后应用连不上数据库 ​
现象
修改 config/application.yml 中的 spring.datasource.password 后重启,启动日志出现 Access denied for user 'root'@'...',应用无法启动。
原因
数据库密码在首次初始化时写入 MariaDB 内部用户表(data/mysql/)。修改配置文件中的密码不会同步修改数据库中已存储的密码,导致两者不一致。
解决
以下操作会丢失所有业务数据
必须先做好 备份 再继续。
- 停服:
scripts\stop.bat - 删除数据目录:
rmdir /S /Q data\mysql(Windows)或rm -rf data/mysql(Linux/macOS) - 修改
config/application.yml中的密码为新密码 - 启动:
scripts\start.bat—— 系统将以新密码重新初始化数据库
详细配置说明见 配置说明。
License 加载失败(启动 fatal 退出) ​
现象
启动日志出现:
ERROR jecloud: The license can't be finded
然后 JVM 直接退出。
原因
证书加载库(混淆)硬编码从 ${user.home}/license/jecloud.license 读取证书,灵象启动时已将 user.home 重定向到发行包根目录。若 license/ 目录为空或证书文件缺失,启动必然失败。
解决
详见 证书 / License 替换。
调度中心离线 / jecloud-job 库不存在 ​
现象
job/jecloud-job-admin.jar启动失败,日志报Unknown database 'jecloud-job'或Access denied- 调度中心(
http://localhost:3060)无法访问
原因
调度中心依赖 jecloud-job 数据库,该库由 start.bat 在主应用启动并通过健康检查后创建。如果调度中心在主应用完全就绪前启动,或主应用本身未正常启动,就会出现上述错误。
解决
确认主应用已正常启动(http://localhost:8080 可访问)后,再单独重启调度中心:
scripts\start-job-admin.bat
详细操作见 定时任务(XXL-Job)。
前端白屏 / WebSocket 连不上 ​
现象
- 登录后页面白屏或一直转圈
- 浏览器 F12 → 网络 → WS 选项卡,看到
/jesocket连接失败((failed)或一直pending)
原因
前端启动时从 JE_CORE_WEBSOCKETURL 读取 WebSocket 地址。若该值为空或指向错误地址(如 ws://localhost:7010 但从局域网内其他机器访问),连接必然失败,导致功能初始化卡住、页面白屏。
解决
第一步:确认 WebSocket 服务正常监听
netstat -ano | findstr :7010
:: 应该看到 LISTENING 状态
第二步:检查 JE_CORE_WEBSOCKETURL 配置
SELECT CODE, VALUE FROM JE_CORE_SETTING WHERE CODE = 'JE_CORE_WEBSOCKETURL';
正确值示例:
- 本机访问:
ws://localhost:7010/jesocket - 局域网访问:
ws://192.168.1.100:7010/jesocket
若值为空或地址错误,参照 局域网 / 跨主机访问 修正后,退出重新登录使配置生效。
控制台中文乱码 ​
现象
Windows cmd 窗口启动时,部分中文输出显示为乱码(如 ??? 或方框)。
原因与说明
这是预期行为,不影响应用正常运行。
灵象启动时已在 Java 层将 System.out / System.err 替换为 GBK 输出流,同时启动脚本带有 -DCONSOLE_LOG_CHARSET=GBK 参数,适配 Windows zh-CN cmd 的 GBK 编码。数据库读写和日志文件均使用 UTF-8,不存在乱码风险。
若控制台仍有乱码,可执行:
chcp 65001
切换 cmd 为 UTF-8 编码页(可能导致部分旧工具显示异常,仅建议调试时使用)。
Redis health 指标显示 DOWN ​
现象
访问 http://localhost:8080/actuator/health 或健康检查端点,redis 状态显示 DOWN:
{
"redis": {
"status": "DOWN",
"details": {
"error": "Cannot read Redis info; ...Malformed \\uxxxx encoding."
}
}
}
原因
这是已知的误报(假阳性)。内嵌 Redis(codemonstur fork)的 INFO 命令返回的字节串包含特殊字符,Spring Boot Redis 健康指标解析失败,误报 DOWN。实际 Redis 工作完全正常,业务不受影响。
解决
业务无影响时忽略即可。如需消除误报,在 config/application.yml 中添加:
management:
health:
redis:
enabled: false
重启后健康端点不再检查 Redis 状态。
SQL 日志(排障用) ​
灵象默认不输出 SQL(零开销);报错的 SQL 始终输出到 logs/error.log,无需任何配置。需要查看成功 SQL 时,编辑部署包根目录的 config/logback.xml(注意:不是 config/application.yml),改完 60 秒内热生效,不用重启。
打开全部 SQL 输出
找到以下行,将 OFF 改为 INFO,保存即可:
<!-- 默认关闭 -->
<logger name="com.je.standalone.sql" level="OFF"/>
<!-- 改为打开 -->
<logger name="com.je.standalone.sql" level="INFO"/>
成功 SQL 会打印到控制台 + logs/standalone.log,含展开参数后的完整 SQL、影响行数、耗时。排障完记得改回 OFF。
全开,但排除某些高频服务(如推送、连接器)
<logger name="com.je.standalone.sql" level="INFO"/>
<logger name="com.je.standalone.sql.com.je.message" level="OFF"/> <!-- 推送 -->
<logger name="com.je.standalone.sql.com.je.connector" level="OFF"/> <!-- 连接器 -->
只看某一个服务(总开关保持 OFF)
<logger name="com.je.standalone.sql.com.je.rbac" level="INFO"/>
服务名 = com.je.standalone.sql. + 该服务的包前缀(平台 8 服务:com.je.rbac / com.je.meta / com.je.api / com.je.document / com.je.message / com.je.gateway / com.je.connector / com.je.workflow)。
注意:改 config/logback.xml,不是 application.yml
config/application.yml 里的 logging.level.* 是启动时一次性套用,改它要重启;SQL 开关请改 config/logback.xml(支持 60 秒热生效)。
日志位置参考 ​
若上述排查步骤未能解决问题,查阅日志获取完整错误堆栈:
<发行包根>/
└── logs/
├── console.log 启动脚本重定向的 stdout(启动期信息最全)
├── spring.log Logback 主日志(滚动,含业务堆栈)
└── xxl-job/ 调度任务执行日志
搜索关键字:Exception、ERROR、Caused by、Failed。
五、授权证书
授权证书 ​
灵象采用证书授权:首次启动会校验 license/jecloud.license。本页讲证书申请与证书安装两件事。
证书申请 ​
首次启动若 license/jecloud.license 缺失,平台会在启动早期(MariaDB 启动之前)打印引导面板并以 exit code 2 退出:
╔════════════════════════════════════════════════════════════════════╗
║ [!] 未检测到授权证书,系统无法启动 ║
║ license\jecloud.license 不存在。 ║
║ 首次使用请到官网在线申请授权证书: ║
║ https://jecloud.net/download ║
║ 申请后将 jecloud.license 放入 license\ 目录,重新运行 start.bat 即可。
╚════════════════════════════════════════════════════════════════════╝
申请步骤:
- 访问 https://jecloud.net/download 在线申请授权证书(按提示提供客户单位、账号上限等信息)
- 拿到官方签发的 license 文件包(通常是 zip,含
jecloud.license+ 插件 key) - 按下文 证书安装 将文件放入发行包根的
license/目录
开发跳过
开发调试可在 JVM 参数加 -Djecloud.standalone.license.skip=true 跳过证书检查(.bat/.sh 脚本层不识别此参数,需直接传给 JVM)。
证书安装 ​
license 放哪 ​
发行包根目录下的 license/ 目录存放全套证书文件:
license/
├── jecloud.license ← 平台根证书(绑定客户名 / 账号上限 / 过期时间)
├── plugins.lock ← 插件锁定文件
├── jecloud_plugin_api.key ┐
├── jecloud_plugin_app.key │
├── jecloud_plugin_devops.key │
├── jecloud_plugin_dingtalk.key │
├── jecloud_plugin_document_aliyun.key │
├── jecloud_plugin_document_tencent.key │
├── jecloud_plugin_metadata.key │ 16 个插件 key
├── jecloud_plugin_note_253.key │
├── jecloud_plugin_note_aliyun.key│
├── jecloud_plugin_office.key │
├── jecloud_plugin_script.key │
├── jecloud_plugin_security.key │
├── jecloud_plugin_threemember.key│
├── jecloud_plugin_ui.key │
├── jecloud_plugin_upgrade.key │
└── jecloud_plugin_wechat.key ┘
发行包内已内置测试用 license(开发环境签发)。生产部署必须替换为 JECloud 官方为客户机签发的正式 license。
为什么必须指向发行包根?
start.bat 在启动时通过 -Duser.home="%CD%" 把 JVM 的 user.home 指向发行包根目录。license 加载器(jecloud-placeholder-co.jar 中的 RoPgin 类)硬编码从 ${user.home}/license/jecloud.license 读取证书,因此证书必须放在发行包根的 license/ 目录下。直接运行 jar 时同样需要通过 -Duser.home 明确指定,否则会从 OS 用户目录查找而找不到文件。
替换步骤 ​
收到 JECloud 官方发送的正式 license 文件包(通常是一个 zip)后,按以下步骤替换:
REM 1. 停止服务
scripts\stop.bat
REM 2. 备份旧 license
move license license.bak
REM 3. 解压新 license 到 license/
REM (将官方提供的 zip 解压到 license\ 目录)
REM 4. 确认文件齐全(应为 18 个文件:1 个 .license + 1 个 .lock + 16 个 .key)
dir license\
REM 5. 启动
scripts\start.bat
启动后确认以下信息表示 license 生效:
logs/spring.log中没有ERROR jecloud: The license can't be finded等错误- 浏览器登录后右上角显示客户单位名称(而非测试用"凯特伟业")
- 页面无"证书过期"红色提示横幅
不要修改 jecloud-placeholder-*.jar 文件
发行包根目录下的 jecloud-placeholder-base.jar 和 jecloud-placeholder-co.jar 是经过混淆处理的证书算法库,严禁修改、替换、重命名或移动这两个文件。碰了这两个 jar 会导致 license 校验算法失效,即使 license 文件本身完全正确也无法通过验证。
排错 ​
The license can't be finded! please setting the jecloud.license into the directory! ​
原因:license/jecloud.license 文件不存在,或启动时 user.home 未正确指向发行包根目录。
排查步骤:
- 确认
license/jecloud.license文件存在:batdir license\jecloud.license - 确认
start.bat(或直接运行时的命令)中含有-Duser.home="%CD%"(Windows)或-Duser.home="$(pwd)"(Linux/macOS)。 - 确认从发行包根目录启动(
%CD%必须是发行包根,不能从子目录运行 start.bat)。 - 重启后查看
logs/spring.log,搜索license关键字确认加载结果。
更多证书错误的排查,请参见 常见问题与排错。
其他常见错误 ​
| 错误信息 | 原因 | 处理 |
|---|---|---|
您的授权证书已过期!请联系我们! |
jecloud.license 过期 |
联系 JECloud 商务申请续期 |
您的账号数已超过证书授权限制! |
数据库账号数超过 license 上限 | 清理冗余账号或扩容 license |
解密异常! |
license 文件损坏或版本不匹配 | 重新下载 license 文件 |
授权证书文件或文件夹不存在! |
插件 key 文件不全 | 重新完整解压 license 文件包 |
相关链接 ​
- 常见问题与排错 — 详细日志查看方法、更多错误码说明
六、规则规范
规则规范总览 ​
这套规范写给谁
本栏目面向使用 JECloud 灵象做二次开发的客户。如果你正在用低代码引擎搭建资源表、功能、字典、菜单,或者要让多人协作交付一套业务方案,这里的命名与配置约定能让你的产物可维护、可协作、可复用。
为什么需要这套规范 ​
灵象平台是配置驱动的:业务能力不是写死在代码里,而是落在四类元数据上——
- 资源表(数据底座:表、字段、键、索引)
- 功能(业务页面:列表、表单、按钮、子功能、数据权限)
- 字典(可复用的枚举 / 编码)
- 菜单(前端导航入口与授权)
平台前端按这些元数据实时渲染界面、按命名约定自动联动(如字段配了字典就自动出下拉框、双字段自动回填)。因此元数据的命名是否规范、结构是否一致,直接决定了:
- 产物能不能被别人接手维护(命名混乱 = 没人敢动);
- 跨表 / 跨功能能不能正确引用(命名不对齐 = 前端绑不上数据);
- 同一套方案能不能多人分工同时交付(约定不统一 = 合并冲突 / 引用断裂)。
本栏目讲的是约定与规范(怎么命名、怎么取类型、怎么组织层级);具体的界面操作步骤(在哪点哪个按钮)见 低代码总览。两者配合使用。
本栏目导航 ​
| 篇目 | 讲什么 |
|---|---|
| 编码与命名通用约定 | 三段式编码骨架、跨模块核心表省前缀、常用英文保留清单、SY_ORDERINDEX 连续整数 |
| 资源表设计规范 | 表编码、7 种表类型、字段命名与类型档、系统字段组、主键 / 外键 / 索引、字典关联字段 |
| 功能设计规范 | funcCode===tableCode、功能树三层、表单字段 29 种 XTYPE、按钮四件套、子功能、数据权限 |
| 字典设计规范 | 字典编码三段式、6 种字典类型选型、字典项编码与排序、联建 vs 复用、所属模块 |
| 菜单设计规范 | 叶子 / 文件夹菜单命名、菜单图标默认值、层级、_MODULE 后缀、排序步长 |
| 测试数据生成规范 | 字段值 5 类策略、行内一致性(双字段配对)、占位符、平台主数据只读 |
| 文档产出规范 | HTML 自包含离线可打开、系统字段不入字段表、双字段都列、模板单源 |
| 交付与协作规范 | 单 run_id 落盘、跨对象引用用 CODE、manifest.json、失败恢复、提交署名 |
通用硬约束速查 ​
下面这些规则跨所有元数据类型生效,是最容易踩坑、也最值得先记住的:
这些是硬约束,违反会导致数据偏移或前端渲染失败
SY_ORDERINDEX一律连续整数1, 2, 3, 4 …,严禁100, 200, 300或100, 110, 120跨段写法。每个对象集(一张表的字段、一个功能的列 / 表单字段 / 按钮、一个字典的项、同层菜单)内部各自从1起算。funcCode === tableCode,不加任何后缀。所有功能类型(普通功能 / 树形功能 / 子功能)的功能编码直接等于绑定表的编码,不要加_FUNC/_TF/_SUB。区分功能类型靠类型字段,不靠后缀。唯一例外是模块层(子系统 / 模块)可加_MOD避歧义。- 双字段必须成对出现。涉及"编码 + 名称"或"ID + 名称"的场景一律建两个字段:字典关联用
XXX_CODE+XXX_NAME;人员 / 部门 / 外键用XXX_ID+XXX_NAME。少建一个,前端展示就会错乱。 - 菜单 / 功能图标默认
fal fa-poll-h,严禁臆造。平台图标库只渲染已注册的图标,凭想象写的图标(如jeicon-handshake/fal fa-bullhorn)在系统里不存在,前端会渲染失败(空白 / 404)。顶部菜单默认jeicon jeicon-work1,资源表默认jeicon jeicon-table。 - 业务引用字段不加本表业务前缀。A 表引用 B 表时,A 上的引用字段命名 = B 的原字段名 + B 的主键名。例:
PT_OPP引用PT_CUST→ 字段CUST_NAME+PT_CUST_ID(不是OPP_CUST_NAME)。
常用英文保留清单
字段命名遵循"业务概念两段英文 → 中文简拼合并",但下列常用通用词保留英文,不必硬改简拼:
_NAME / _CODE / _TITLE / _ID / PHONE / EMAIL / ADDRESS / PHOTO / FILES / REMARK / INTRO / DEPT / CONTENT / DESC / DATE / TIME。
怎么用这套规范 ​
- 建表 / 建功能 / 建字典 / 建菜单前,先读对应篇目,按规则推断命名与配置,再在界面里落地。
- 遇到对照例子(标注 ✅ 正确 / ❌ 错误)时,重点看错误例子——那些都是真实踩过的坑。
- 规范没覆盖的边角,按业务常识处理;本栏目标注
待补的位置是平台细节尚未沉淀的部分,可先按现有约定走。
编码与命名通用约定 ​
本篇是命名规范的"地基"——资源表、功能、字典、菜单的编码都从这套约定派生。先读这篇,再读各专项篇目。
编码字符集(机器约束) ​
所有元数据编码(表编码、字段编码、字典编码、功能编码等)统一遵循:
- 只能用 大写字母、数字、下划线;
- 必须以字母开头(正则
^[A-Z][A-Z0-9_]*$); - 长度建议 ≤ 60 字符。
WARNING
菜单索引名是个例外:索引名用小写字母 / 数字 / 下划线(uk_ / idx_ 前缀),与其他编码的大写规则不同。详见 资源表设计规范 · 索引。
三段式编码骨架 ​
业务编码的通用骨架是三段:
<系统前缀>_<模块前缀>_<业务名>
| 段 | 取值规则 | 例 |
|---|---|---|
| 系统前缀 | 产品 / 系统服务编码大写 | OM / EPM / DEMO |
| 模块前缀 | 业务所属功能模块的简拼(≤5 字符,全大写) | 人事管理 RSGL、日常管理 RCGL、作业票 ZYP |
| 业务名 | 业务对象的英文 / 拼音首字母简拼,全大写 | LEAVE(请假)、WC(外出)、EQ(设备) |
示例:OM_RSGL_LEAVE(OM 服务 / 人事管理模块 / 请假单)。
业务名拼写偏好 ​
| 情况 | 推荐写法 | 示例 |
|---|---|---|
| 有清晰英文且 ≤6 字符 | 直接用英文 | LEAVE / USER / DEPT / PLAN / TASK |
| 英文较长 / 不清晰 | 取中文每字首字母大写 | 日常管理 → RCGL、停送电 → TSD |
| 简拼太短易混淆 | 取重要含义字首字母 | 投资分析管理 → TZFZGL(只取 TZ 易撞) |
| 简拼冲突 | 冲突字首字全拼区分 | 汉族 HZ / 回族 HUIZ(回字全拼避撞 HZ) |
跨模块核心表省略模块前缀 ​
跨模块复用的核心档案表 / 元数据表,命名简化为两段 <系统前缀>_<业务名>:
| 业务对象 | 推荐编码 |
|---|---|
| 客户 | OM_KH |
| 合同 | OM_HT |
| 项目 | OM_XM |
| 用户 | OM_USER |
| 部门 | OM_DEPT |
| 供应商 | OM_GYS |
判断标准:表数据被 ≥2 个业务模块引用,或属于"主数据 / 元数据"性质,就省略模块前缀。
业务引用字段不加本表业务前缀 ​
硬约束
业务表 A 引用业务表 B,A 上的引用字段命名 = B 的原字段名 + B 的主键名,不加 A 的业务前缀。
✅ 正确:PT_OPP 引用 PT_CUST → 字段 CUST_NAME + PT_CUST_ID
❌ 错误:OPP_CUST_NAME + OPP_CUST_ID(多加了本表前缀 OPP_)
原因:跨表查询 / 视图 JOIN 时字段语义跟引用表保持一致,前端关联配置也对齐。这条与子表外键命名同源(都用被引用表的字段名)。详见 资源表设计规范 · 主键 / 外键。
常用英文保留清单 ​
字段命名总体偏好"业务概念两段英文 → 中文简拼合并"(如 WIN_REASON → YDYY),但下列常用通用词保留英文,不硬改简拼:
| 类别 | 保留词 | 例 |
|---|---|---|
| 标识 / 编码 | _NAME / _CODE / _TITLE / _ID |
CUST_NAME / CUST_CODE |
| 联系方式 | PHONE / EMAIL / ADDRESS |
CUST_PHONE / CUST_EMAIL |
| 媒体 | PHOTO / FILES(多附件)/ FILE(单附件) |
CUST_PHOTO / ATTACH_FILES |
| 通用语义 | REMARK / INTRO / DEPT / CONTENT / DESC |
CUST_REMARK / CUST_INTRO |
| 时间后缀 | DATE / TIME |
OM_HT_DUEDATE |
判断标准:英文 ≤5 字符且在保留清单内 → 保留;英文 ≥6 字符 / 不在清单 / 业务概念两段拼接 → 改中文简拼合并。注意字典 / 关联的后缀(_CODE / _NAME / _ID)本身是约定,不算"两段",LEAVE_TYPE_CODE 合法。
SY_ORDERINDEX 连续整数约束 ​
硬约束
所有对象集的 SY_ORDERINDEX 一律用连续整数 1, 2, 3, 4 …,严禁 100, 200, 300 或 100, 110, 120 跨段写法。
每个对象集内部各自从 1 起算:
| 对象集 | 起算范围 |
|---|---|
| 一张表的字段 | 每张表内 1, 2, 3 … |
| 一个字典的字典项 | 每个字典内 1, 2, 3 …(树形字典按 DFS 深度遍历全局连续编号) |
| 一个功能的列字段 / 表单字段 / 按钮 | 每个功能内各自 1, 2, 3 …(含多表头、分组框也连续) |
| 一个主功能下的子功能 | 每个主功能内 1, 2, 3 … |
| 同层菜单兄弟节点 | 同层各自从 1 起算,跨层级独立 |
✅ 正确:columns[0]=1, columns[1]=2, columns[2]=3
❌ 错误:columns[0]=100, columns[1]=200, columns[2]=300
为什么不留间隔:跨段写法(100/200/300)源于"留位置可插入"的旧惯例,但实际插入靠工具重排即可;连续整数清晰、可读、无歧义。
菜单的特例
叶子菜单 / 文件夹菜单的排序号按 10 递增(10、20、30…),便于后期插入——这是菜单导航的传统步长,与上面表格里"元数据对象集连续整数"是两套场景。详见 菜单设计规范 · 排序。
资源表设计规范 ​
资源表是整个应用的数据底座。本篇规定表编码、表类型、字段命名与类型、系统字段、键与索引、字典关联字段的约定。操作步骤见 资源表。
一、表编码命名 ​
遵循 编码与命名通用约定 的三段式骨架 <系统前缀>_<模块前缀>_<业务名>,跨模块核心表省模块前缀(两段式 OM_KH)。本节只补充表特有的命名场景。
子表命名 ​
| 场景 | 规则 | 例 |
|---|---|---|
| 多子表(不同业务面) | 用业务含义命名 | OM_XM(项目)→ OM_XM_USER(成员)/ OM_XM_PLAN(计划) |
| 单子表 + 明细行语义 | 用 MX 拼主表末段(无下划线) |
OM_LEAVE → OM_LEAVEMX;DEMO_CGGL_CGDD → DEMO_CGGL_CGDDMX |
子表的字段前缀按主表末段派生:主表 DEMO_CGGL_CGDD 字段前缀 CGDD_,子表 DEMO_CGGL_CGDDMX 字段前缀 CGDDMX_。
历史兼容
既有带下划线 _MX 的表(如 OM_LEAVE_MX)是旧规则,可继续使用;新建子表统一用无下划线 MX。
视图与模块表 ​
| 类型 | 命名规则 | 例 |
|---|---|---|
| 视图 | 必须 V_ 开头:V_<系统>_<模块>_<业务名> |
V_OM_XM_GS |
| 模块容器 | 必须 _MODULE 结尾:<系统>_<模块名>_MODULE |
OM_HR_MODULE |
二、7 种表类型 ​
| typeCode | 中文名 | 适用场景 |
|---|---|---|
PT |
普通表(~85%) | 业务单据、明细、日志,默认 |
TREE |
树形表(~10%) | 树形结构(单根树如菜单 / 多根树如字典项) |
VIEW |
视图(~4%) | 多表 SQL 拼接,无物理存储 |
MODULE |
模块(~1%) | 模块容器,_MODULE 结尾,不存业务数据 |
平台前端"名词解释"里还会列出导入表、关系视图作为细分形态,但建表 API 的类型字段取上述四个之一。无特殊关键词默认
PT;出现"树/层级/父子/分类树/组织"→TREE;"视图/汇总/报表/多表查询"→VIEW。
树形表的派生字段不要重名
TREE 表平台会自动派生节点字段 <前缀>_TEXT(节点名称)和 <前缀>_CODE(节点编号)。业务"区域名称 / 区域编号"应直接复用这两个派生字段,不要在字段里再建同名的 XXX_CODE / XXX_NAME——否则报"字段编码重复"并留下空白脏字段。需要改中文名时走"修改字段"调显示名即可。
三、字段命名 ​
业务前缀 ​
首次建表时,所有业务字段统一加前缀,前缀 = 表编码的最后一段(不是整个表编码):
| 表编码 | ✅ 正确字段 | ❌ 错误字段 |
|---|---|---|
OM_RSGL_WC |
WC_SQR_ID |
OM_RSGL_WC_SQR_ID |
JWGL_CLASSROOM |
CLASSROOM_NAME |
JWGL_CLASSROOM_NAME |
SBGL_JBXX_EQ |
EQ_NAME |
SBGL_JBXX_EQ_NAME |
何时不加前缀:跨模块两段式核心档案表(OM_KH / OM_DEPT,避免子表里出现 KH_KH_NAME);系统字段(SY_*)不参与;用户明示不加时。
通用命名约定 ​
| 场景 | 字段写法 | 推荐类型 |
|---|---|---|
| 核心业务名 | XXX_NAME |
VARCHAR100 |
| 核心业务编码 | XXX_CODE |
VARCHAR50 |
| 时间(开始/结束) | XXX_STARTTIME / XXX_ENDTIME |
DATETIME |
| 业务事件 + 日期(中文简拼) | XXX_<简拼>DATE(必带 DATE 后缀,合并写) |
DATE |
| 数量 | XXX_NUM |
NUMBER |
| 金额 | XXX_AMT |
FLOAT2 |
| 备注 | REMARK / XXX_REMARK |
CLOB |
| 长文本 / 说明 | XXX_CONTENT / XXX_DESC |
CLOB |
| 多附件(默认) | XXX_FILES |
CLOB |
| 单附件(业务明确单文件) | XXX_FILE |
VARCHAR100 |
| 排序号 | ❌ 不建业务字段 | 复用系统派生的 SY_ORDERINDEX |
几条易错约定
- 附件一律默认多附件
XXX_FILES(带 S,CLOB);只有业务明确"只能传单个文件"才用XXX_FILE。 - 日期 / 时间合并写,不要
_END_DATE/_BIRTH_DATE这种带中间下划线的形式。 - 中文简拼事件标识必带 DATE / TIME 后缀(如出生日期
DYDA_CSDATE),否则单看简拼分不清是日期还是状态。
双字段约定 ​
涉及"ID + 名称"或"编码 + 名称"必须成对出现:
| 场景 | 字段对 | 长度 |
|---|---|---|
| 人员 | XXX_ID + XXX_NAME |
V50 + V100 |
| 部门(无具体含义) | XXX_DEPT_ID + XXX_DEPT_NAME |
V50 + V100 |
| 部门(有具体含义) | 业务简拼替换 DEPT,如责任部门 WCSQ_ZRBM_ID/NAME |
V50 + V100 |
| 字典单选 | XXX_CODE + XXX_NAME |
V50 + V100 |
| 字典多选 | XXX_CODE + XXX_NAME |
V255 + V255 |
| 是否型 | XXX_<语义>_CODE + XXX_<语义>_NAME,走系统字典 YESORNO |
V50 + V100 |
双字段命名要点
- 人员字段不要写
_USERID/_USERNAME,用业务简拼直接挂表前缀(负责人FZR_ID+FZR_NAME)。 - 部门字段不要在前缀和
DEPT之间塞人员简拼:WCSQ_SQR_DEPT_ID❌,应是WCSQ_DEPT_ID✅。 - 是否型字段:中文含"是否/启用/禁用/发布/有效/可用"→ 一律走系统字典
YESORNO(1=是 /0=否)+ 双字段,严禁建VARCHAR1/NUMBER(1)单字段。命名用<前缀>_IS<中文简拼>合并写:是否决策人CONTACT_ISJZR_CODE(不是CONTACT_IS_DECISION_CODE)。
双字段的中文名(TABLECOLUMN_NAME)两类规则相反:
- 字典关联:
_CODE用业务原名(如"性别"),_NAME用"业务原名 +_NAME"(如"性别_NAME")——因为_CODE是实际含义字段; - 人员 / 部门 / 外键:
_ID用"业务原名 +_ID"(如"负责人_ID"),_NAME用业务原名(如"负责人")——因为前端主显的是_NAME。
四、字段类型 ​
快捷档(形式 A)优先 ​
字符串字段优先选快捷档(typeCode 自带长度,不写 LENGTH);业务长度不在快捷档就升档到上一档,不要走"通用类型 + LENGTH":
| 业务长度 | 推荐(升档) |
|---|---|
| ≤ 30 | VARCHAR30 |
| 31–50 | VARCHAR50 |
| 51–100 | VARCHAR100 |
| 101–255(含常见 200) | VARCHAR255 |
| 256–1000(含 500) | VARCHAR1000 |
| > 1000 | CLOB |
✅ 业务名称字段推 VARCHAR255(升档)
❌ 推 VARCHAR + LENGTH=200(除非用户明示"必须精确 200")
VARCHAR2000 / 4000 默认升 CLOB
要 VARCHAR2000 / VARCHAR4000 的字段,默认直接推 CLOB。多个超长 VARCHAR 同表可能撞 MySQL 行大小上限(Row size too large);CLOB 走 TEXT 列行外存储,无此风险。
完整 22 种 typeCode ​
| 分组 | typeCode |
|---|---|
| 字符串快捷档(form A) | VARCHAR30 / VARCHAR50 / VARCHAR100 / VARCHAR255 / VARCHAR767 / VARCHAR1000 / VARCHAR2000 / VARCHAR4000 |
| 小数快捷档(form A) | FLOAT2(2 位小数) |
| 通用类型(form B,需配 LENGTH) | VARCHAR / FLOAT |
| 简单类型 | NUMBER(整数)/ DATE / DATETIME / YESORNO(布尔)/ CLOB(长文本)/ BIGCLOB(富文本)/ ID / CUSTOMID / FOREIGNKEY / CUSTOMFOREIGNKEY / BLOB(二进制) |
不允许的写法
- 自创 typeCode:
VARCHAR20/FLOAT3等不在清单内(用 form B 或升档)。 - 整数变体:
INT/INTEGER/LONG/BIGINT→ 一律NUMBER。 - 布尔变体:
BOOLEAN/BOOL/BIT→YESORNO。 - 不定长自由文本走
VARCHAR + 大 LENGTH:备注 / 描述 / 公式应该用CLOB。
可空性与唯一性都不在表层硬约束 ​
业务字段一律 ISNULL=1、UNIQUE=0
除系统主键 <TABLE>_ID 外,所有业务字段的可空标记一律设"可空"、唯一标记一律设"不唯一",与字段的中文"必填 / 唯一"语义无关。
- 真正的"必填"放在功能表单层(字段的
RESOURCEFIELD_REQUIRE),见 功能设计规范 · 表单字段; - 真正的"唯一"走唯一索引(
uk_索引,见本篇第七节)。
原因:表层 DDL 硬约束会让数据迁移被拦、让同一字段在不同功能里无法分场景表达必填、让多功能复用失效。
五、系统字段组 ​
系统字段(SY_ 开头)由平台自动派生,建表时不要手动声明,业务侧只消费、不修改。按需添加这几组:
| 组 | 何时加 | 关键字段 |
|---|---|---|
| 基础组(所有表必加) | 自动 | <TABLECODE>_ID(主键)、SY_STATUS、SY_ORDERINDEX、SY_CREATEUSERID/NAME、SY_CREATETIME、登记部门 |
| 修改信息组(建议加) | 业务单据 / 主数据表 | SY_MODIFYUSERID/NAME、SY_MODIFYTIME、修改人部门 |
| 公司 / 集团 / 机构 / 租户组 | 多租户 / 多公司架构 | SY_COMPANY_ID/NAME、SY_GROUP_COMPANY_*、SY_ORG_ID、SY_TENANT_* |
| 树形组(仅 TREE 表) | 自动 | SY_PARENT、SY_NODETYPE、SY_LAYER、SY_PATH、SY_TREEORDERINDEX 等 + 派生的 <前缀>_TEXT / <前缀>_CODE |
| 扩展组(按需) | 用户明示"预留扩展位" | SY_EXTEND01 ~ SY_EXTEND10 |
| 工作流组(勾选审核时) | 自动 | SY_ACKFLAG、SY_AUDFLAG、SY_PIID、SY_APPROVEDUSERS 等 |
| 产品归属组(多产品平台) | 自动 / 建议 | SY_PRODUCT_ID/CODE/NAME |
业务字段不能与主键同名
不要把自引用上级字段命名为 <TABLECODE>_ID——那是平台保留的主键名,会冲突。自引用用 <语义>_PARENT_ID(如 DECISION_PARENT_ID)。
六、主键 / 外键 ​
| 键类型 | 何时用 | 关键约定 |
|---|---|---|
| 主键(Primary) | 每张表 1 条,平台自动建 | 字段 <TABLECODE>_ID,建表时不要在配置里显式列出 |
| 自关联(Inline) | 树形表 | SY_PARENT → 本表主键,级联删除 |
| 子表外键(Foreign) | 子表 → 主表(父子关系) | 引用字段 = <主表 TABLECODE>_ID,类型默认 FOREIGNKEY,级联删除 |
子表外键 vs 业务引用(关键区分) ​
只有"子表 → 主表"父子关系才创外键
子表 → 主表(命名带 MX / 详情页 tab 归属的那张主表)→ 创 Foreign 外键,引用字段类型 FOREIGNKEY。
业务表 A → 业务表 B(无父子关系,如商机引用客户)→ 不创外键,引用字段用 VARCHAR50 + 配 QUERYCONFIG。
业务引用为什么不创外键:跨业务表的数据库外键耦合太强,数据生命周期不一致(客户软删 / 合并 / 拆分)。改用查询关联配置后,平台前端自动渲染为"关联选择"控件(弹窗选择 + 自动回填双字段),DB 层无强约束。
多父场景:子表业务上同时关联多个表时,只挂"直接上层"的外键(详情页 tab 切换中出现的那张主表),其他业务关联走业务引用。
业务引用字段的查询关联配置(QUERYCONFIG)是 4 段格式:
<目标功能编码>,<本表NAME字段>~<本表ID字段>,<目标NAME字段>~<目标主键>,<M|S>
由于业务引用字段命名 = 引用表原字段名,第 2、3 段字段名往往完全相同,例(PT_CUST 引用 PT_TERRITORY):
PT_TERRITORY,TERRITORY_NAME~PT_TERRITORY_ID,TERRITORY_NAME~PT_TERRITORY_ID,S
七、索引 ​
首次建表只要 2 条系统索引
首次建表只保留平台自动建的 主键索引 + SY_ORDERINDEX 索引 两条;树形附加索引、子表外键索引、业务唯一 / 普通索引首次一律不预置,等需要时再单独追加。
| 索引类型 | 命名前缀 | 何时建 |
|---|---|---|
| 唯一索引 | uk_<表>_<字段> |
业务编号 / 邮箱 / 手机号 / 工号等需唯一的字段 |
| 普通索引 | idx_<表>_<字段> |
状态过滤 / 分类过滤 / 时间范围 / 外键反查等高频查询字段 |
索引命名特例
索引名用小写字母 / 数字 / 下划线(与表 / 字段编码的大写规则不同),长度 ≤ 64 字符。多字段联合唯一索引把字段用逗号分隔(如 字段A,字段B)。
八、字典关联字段 ​
字典单选 / 多选 / 状态码 / 分类码 / 是否型等"双字段 + 字典关联"场景,_CODE 字段必须配字典关联配置(DICCONFIG),否则前端下拉框为空。_NAME 字段不配(由 _CODE 联动)。
字典关联配置是 4 段格式:
<字典DDCODE>,<本表NAME字段>~<本表CODE字段>,name~code,<S|M>
| 段 | 含义 |
|---|---|
| 1 | 关联的字典编码(全限定名,含产品前缀,如 DEMO_DYDA_XB) |
| 2 | 本表 NAME 字段 ~ 本表 CODE 字段(NAME 在前,CODE 在后) |
| 3 | 固定写 name~code |
| 4 | S 单选 / M 多选(VARCHAR50 → S,VARCHAR255 → M) |
完整例:
DEMO_DYDA_XB,DYDA_XB_NAME~DYDA_XB_CODE,name~code,S
字典字段三处必须对齐
建表时遇到字典关联字段,三件事必须一一对齐:① 联建对应字典(字典编码 = 字段名去 _CODE);② 建双字段(命名见本篇第三节);③ 在 _CODE 字段写字典关联配置。任一处不对齐,前端就绑不上字典。详见 字典设计规范。
表层配好字典关联后,建功能时平台会自动派生到表单字段(设为下拉框 + 填好关联配置),功能层无需重复传。
功能设计规范 ​
功能把资源表包装成可访问的业务页面(列表 + 表单 + 按钮 + 子功能)。本篇规定功能命名、功能树层级、本体配置、列字段、表单字段、按钮、子功能、数据权限的约定。操作步骤见 功能配置。
一、功能命名 ​
funcCode === tableCode,不加后缀
功能编码 FUNCCODE 直接等于绑定表的编码 TABLECODE,功能名 FUNCNAME 强默认等于表名。所有功能类型都不加后缀。
| 表 | ❌ 错误 funcCode | ✅ 正确 funcCode | 类型 |
|---|---|---|---|
PT_CUST |
PT_CUST_FUNC |
PT_CUST |
普通功能 |
PT_TERRITORY |
PT_TERRITORY_TF |
PT_TERRITORY |
树形功能 |
PT_CUST_CONTACT(子表) |
PT_CUST_CONTACT_FUNC |
PT_CUST_CONTACT |
子功能 |
区分功能类型靠类型字段(FUNC / TREE / MODEL / SYSTEM),不靠后缀。跨域命名空间独立——同一个 code 在表 / 功能 / 菜单里各占一个,互不冲突。
唯一例外:模块层(子系统 / 模块)可加 _MOD 后缀避歧义(如 SUPER_CRM_SALES_MOD),因为模块层没有对应业务表。叶子层(普通功能 / 树形功能 / 子功能)严禁加后缀。
何时功能名可以偏离表名
默认表名是什么功能名就是什么。仅在"同表多功能(复制 _QUERY / _AUDIT 视图)"、"表名是简拼而功能名习惯加'管理'"、"用户口语显式给了功能名"时偏离,且要明确告知用户偏离原因——不主动加"管理"后缀。
二、功能树三层结构 ​
功能树用类型字段区分节点用途,用父节点区分树形位置:
| 树形位置 | 类型 | 中文叫法 | 说明 |
|---|---|---|---|
| L1(挂在 ROOT 下) | SYSTEM |
子系统 | 业务大类容器。L1 必须 SYSTEM,不能 MODEL |
| L2…N-1(中间) | MODEL |
模块 | 业务子模块,可嵌套多层 |
| L 叶子(主功能) | FUNC / TREE / VIEW |
功能 | 真正绑表的业务功能 |
| L 子叶子(子功能) | FUNC |
子功能 | 父节点 = 主功能(不是父模块),通过关系行表达主子关系 |
ROOT
└── 营销管理(CRM) [SYSTEM] ← L1 子系统
└── 销售管理(CRM_XSGL) [MODEL] ← L2 模块
└── 客户档案(CRM_KHGL) [FUNC] ← 叶子功能,绑表 CRM_KHGL
常见层级违规
- L1 写成
MODEL挂在 ROOT 下 → L1 一律SYSTEM。 - 跳过 SYSTEM 直接
ROOT → MODEL → FUNC→ 加一层 SYSTEM。 - 类型写简写
"SYS"/"MOD"→ 平台只认精确枚举"SYSTEM"/"MODEL"/"FUNC"。
功能类型按绑表类型联动:绑 PT 表 → FUNC;绑 TREE 表 → TREE(前端才按树形渲染,左树右明细);绑 VIEW 表 → VIEW。严禁绑 TREE 表却写 FUNC。
三、功能本体配置 ​
| 字段 | 推荐值 | 说明 |
|---|---|---|
FUNCINFO_FORMWIDTH |
1024 |
表单总宽度(px),强推荐显式传 |
FUNCINFO_FORMCOLS |
"2" |
表单列布局,默认 2 列 |
FUNCINFO_FORMLABELWIDTH |
140 |
字段标签宽度,长标签可设 150–180 |
FUNCINFO_DISABLEQUERYSQL |
"group,strategy" |
默认禁用"分组查询""查询策略"高级元素 |
FUNCINFO_ICON |
fal fa-poll-h |
与模块层 / 菜单层对齐,不要写 jeicon jeicon-folder |
表单列布局按字段数自适应:≤4 字段 → 1 列;5–12 字段 → 2 列(默认);13–24 字段 → 3 列;>24 字段 → 必须分组(每组 ≤12 字段)。
四、列字段(列表展示) ​
列字段平台从表自动派生(一字段一列),但列宽 / 对齐 / 是否隐藏 / 排序平台没给合理默认,需要按业务推断。不要留空数组等平台兜底。
列表展示的 4 条硬约束
- 字典双字段:列上显示
_CODE(居中),隐藏_NAME(与表单相反——列表常需 grep / 排序编码)。 - 人员 / 部门 / 外键双字段:列上显示
_NAME,隐藏_ID(用户看人名 / 单据名)。 SY_ORDERINDEX连续1, 2, 3, 4,跨多表头 + 普通列统一全局序号,不留间隔。- 列宽用 10 的整数倍 + 业务语义,不要一刀切默认 100。
列宽参考:短编码 80;编码 _CODE 100–150;人名 / 名称 100–120;日期 100;日期时间 150–160;金额 100–120;长备注 / _REMARK 300;字典枚举列宽由字典项最长文本决定(≤3 字 → 80,4–5 字 → 100–110)。对齐:短文本居中、长文本左对齐、数值右对齐、字典列居中。
- 业务编码列默认左固定(横滚时始终可见,辅助识别行);序号列也左固定。
- 关键文本字段(
_NAME/_CODE)默认配模糊查询(列表表头可直接搜索)。 _DESC/_REMARK/_CONTENT默认不隐藏("顺序后置" ≠ "列表隐藏"),长内容列配列提示(tooltip)。
多表头(列分组) ​
仅在列数 ≥12 或业务有明显分组语义时用。平台默认编码 morecolumn_1 / morecolumn_2 … 依次递增,普通列引用多表头时填 CODE 字符串("morecolumn_1"),严禁填中文名。
五、表单字段 ​
表单字段也是平台从表派生,建功能时只做三件事:调整派生字段(改宽度 / 标签 / 必填 / 默认值)、新建分组框(fieldset)、新建虚拟展示字段(display)。
XTYPE 严格枚举(29 种) ​
表单字段 XTYPE 必须在清单内
RESOURCEFIELD_XTYPE 必须严格在下面 29 种之内,严禁用清单外的别名(如 cbbtextfield / textareafield / userfield / treefield / htmleditor / hiddenfield / passwordfield 等),即便平台后端可能也接受。
| XTYPE | 中文名 | 用途 |
|---|---|---|
textfield |
文本框 | 短文本 |
numberfield |
数值框 | 整数 / 小数 / 金额 |
rgroup |
单选框 | 字典固定项(单选按钮组,项 ≤5) |
cgroup |
复选框 | 字典固定项(多选复选框组,项 ≤5) |
cbbfield |
下拉框 | 字典关联(单 / 多选) |
textarea |
文本域 | 长文本(≤4000) |
ckeditor |
HTML 编辑器 | 富文本 |
textcode |
编号 | 业务编号(平台可生成规则) |
uxfilefield |
附件 | 单附件上传 |
uxfilesfield |
多附件 | 多附件上传 |
imagepickerfield |
图片选择器 | 图片上传 / 预览 |
datefield |
日期 | DATE / DATETIME |
clocktimefield |
时间 | 时间(HH:mm:ss) |
switch |
是否 | YESORNO 开关 |
treessfield |
树形选择 | 树形字典 / 树形外键 |
gridssfield |
关联选择 | 外键关联(单 / 多选弹窗) |
vueuserfield |
人员选择 | 单 / 多人员选择器 |
colorfield |
颜色选择器 | 颜色码 |
childfuncfield |
子功能集合 | 嵌套多个子功能 |
fieldset |
分组框 | 分组容器 |
displayfield |
虚拟字段 | 只读 / 计算 / 提示展示 |
starfield |
评星 | 评分(1–5 星) |
pinyinfield |
拼音 | 中文转拼音 |
barfield |
进度条 | 数值进度(0–100%) |
codeeditor |
代码编辑器 | 代码 / SQL / JSON |
child |
子功能 | 单个子功能挂载 |
iconfield |
图标选择器 | jeicon 图标选 |
workflowhistory |
审批记录 | 工作流审批历史 |
jsonarrayfield |
数据集合 | JSON 数组结构化数据 |
typeCode → XTYPE 映射 ​
| 表层 typeCode | 默认 XTYPE |
|---|---|
VARCHAR30/50/100(无字典) |
textfield |
VARCHAR50 + 字典(单选) |
cbbfield |
VARCHAR255 + 字典(多选) |
cbbfield(多选) |
VARCHAR1000 / CLOB / BIGCLOB(所有长文本) |
textarea(默认不主动用 ckeditor,仅用户明确要富文本才用) |
NUMBER / FLOAT / FLOAT2 |
numberfield |
DATE / DATETIME |
datefield |
YESORNO |
cbbfield(YESORNO 字典)或 switch |
FOREIGNKEY |
gridssfield |
| 树形外键 | treessfield |
字段名特征推断(优先级高于 typeCode) ​
| 字段名特征 | XTYPE |
|---|---|
*_USER_ID / *_ZRR_* / *_FZR_* 人员双字段 |
vueuserfield |
*_DEPT_* 部门 / *_ORG_* 机构 |
gridssfield |
*_FILE 单附件 / *_FILES 多附件 |
uxfilefield / uxfilesfield |
*_IMG / *_IMAGE 图片 |
imagepickerfield |
*_TYPE_CODE / *_TZT_CODE 字典 |
cbbfield |
*_AMT / *_PRICE 金额 |
numberfield |
*_COLOR / *_ICON / *_PROGRESS / *_SCORE |
colorfield / iconfield / barfield / starfield |
displayfield 只用于虚拟字段
displayfield 是数据库没有对应字段的虚拟展示位(跨表带值 / 计算字段 / 纯提示文本 / 工作流派生)。数据库有实际字段的只读展示,严禁用 displayfield——登记人 / 登记时间 / 自动编号 / 状态联动只读等,用对应组件 + 只读标记(textfield + READONLY="1" / datefield + READONLY="1")。用 displayfield 包装真实字段会丢失字典关联配置和数据类型校验。
人员字段别让用户手输
人员双字段(*_ZRR_* / *_USER_* / *_FZR_*)的 _NAME 字段必用 vueuserfield + 人员查询配置(功能编码固定 JE_RBAC_VUSERQUERY),_ID 字段隐藏只读(选人后自动回填)。不要把 _NAME 配成 textfield 让用户手敲人名。
分组框(fieldset) ​
字段超 12 个建议分组。分组框 RESOURCEFIELD_CODE 显式按 fieldset_1 / fieldset_2 … 命名,RESOURCEFIELD_NAME 用业务中文名("基本信息" / "状态与责任" / "描述信息")。
普通字段引用分组框用 CODE 不是中文名
普通字段的 RESOURCEFIELD_GROUPNAME 引用 fieldset 的 CODE 字符串("fieldset_1"),不是中文名("基本信息")。
必填 / 只读 / 默认值 ​
- 必填在表单层(
RESOURCEFIELD_REQUIRE),不在表层。核心标识(_NAME/_CODE)、业务时间 / 金额 / 经办人默认必填;备注 / 描述 / 状态(有默认值)默认非必填。 - 只读:主键、状态(审批流改)、自动计算字段(如天数)、系统字段、双字段的
_ID。 - 默认值:状态默认
DRAFT、申请时间默认now()、申请人 / 部门用平台变量。双字段给默认值要_CODE+_NAME都给(否则展示混乱)。
字段顺序:名称 → 编码 → 类型 / 分类 → 时间 → 数值 → 状态 / 责任 → 描述类后置 → 备注倒数第一 → 登记审计字段最后。SY_ORDERINDEX 跨分组 + 普通字段 + display 全局连续 1, 2, 3, 4。
六、按钮 ​
创建功能时按钮一律留空
建功能时 buttons 一律是空数组,AI / 配置者不写任何按钮。
- 平台 4 件套自派生:新增(ADD)、编辑(EDIT)、删除(DELETE)、查询(QUERY)——平台自动建,不要重复声明。要调整 4 件套属性用"修改按钮"。
- 业务按钮(提交 SUBMIT / 通过 APPROVE / 驳回 REJECT / 导出 EXPORT / 导入 IMPORT / 打印 PRINT / 复制 COPY / 撤回 RECALL)建功能时不写,由用户后续单独"添加按钮"追加——因为业务按钮的触发事件 / 显隐表达式 / 状态机往往需要用户明确,开局就空更省事。
按钮位置:工具栏(TOOLBAR)、表单(FORM)、行菜单(ROWMENU)。按钮编码用英文动词大写(BATCH_APPROVE / EXPORT_PDF),不要用拼音。
唯一例外:用户在创建对话里明示"创建时就要带 X/Y/Z 按钮",才写进 buttons。
七、子功能 ​
子功能是主功能下的子板块(主子表明细 / 业务事件记录 / 附件等)。子功能本身是一条独立功能(独立 funcInfo),通过关系行挂到主功能下。
子功能的父节点是主功能,不是父模块
子功能的父节点 = 主功能(让平台前端把它渲染成主功能详情页下方的 Tab 子板块),不是父功能模块。
关系行关键配置:
| 字段 | 主子表默认 | 说明 |
|---|---|---|
FUNCRELATION_RELYONTYPE |
func |
类型枚举:func(普通功能,绝大多数子板块)/ file(附件)/ micro(微应用)/ history(仅字段值修改审计) |
FUNCRELATION_SHOWTYPE |
formOuterHorizontal |
显示位置,9 种之一;主子表 Tab 用 formOuterHorizontal |
FUNCRELATION_COPY |
"1"(func 主子表)/ "0"(其他) |
是否级联复制 |
FUNCRELATION_ENABLED |
"1" |
启用 |
SY_ORDERINDEX |
从 1 起递增 | 多子功能时 1, 2, 3, 4 连续 |
业务事件记录走 func 不是 history
"维护记录 / 维修记录 / 出入库流水 / 跟进记录"是业务数据(每条有自己的字段集),走 func。只有"字段值修改审计"(谁 / 何时 / 改了哪个字段 / 改前改后值)才用 history。
子功能除关系行外,还要配关联字段映射(主表外键 ↔ 子表外键的对应关系),否则主子数据关联不上。
八、数据权限 ​
数据权限控制行级可见范围(与菜单级 RBAC、按钮级权限是不同维度)。常见场景:
| 场景 | 含义 | 适用 |
|---|---|---|
| 本人看本人 | 记录登记人 = 当前用户 | 个人申请类(请假 / 报销) |
| 本部门可见 | 记录登记部门 = 当前用户部门 | 部门级隔离 |
| 直属领导可见 | 创建人的直属领导 = 当前用户 | 审批场景 |
| 公开 | 无过滤 | 基础档案 / 字典 / 公告 |
| 自定义 SQL | 一段 SQL 拼到 WHERE | 复杂权限 |
待补
平台数据权限的具体配置字段名、各业务场景的默认推断、跨功能继承(主子表 / 关联功能)规则尚未在规则源中沉淀完整。当前实践:创建功能阶段默认"公开",后续在界面上单独配置数据权限。待补内容:真实数据权限字段名与样例、各场景默认推断、与流程审批的协调。
字典设计规范 ​
字典集中维护可复用的枚举 / 编码,供多个字段引用,改一处全局生效。本篇规定字典编码、字典类型、字典项、联建与复用、所属模块的约定。操作步骤见 数据字典。
一、字典编码 ​
字典编码三段式,第一段必须是产品 / 系统服务编码大写:
<系统服务名>_<业务领域>_<语义>
| 示例字典 | 解析 |
|---|---|
DEMO_DYDA_XB |
DEMO 服务 / 党员档案 / 性别 |
OM_LEAVE_TYPE |
OM 服务 / 请假 / 请假类型 |
EPM_XM_TZT |
EPM 服务 / 项目 / 项目状态 |
业务字典必带产品前缀
所有业务字典编码第一段必带产品前缀(跨产品复用避免命名冲突)。只有平台内置通用字典(YESORNO / SEX / NATION / PRIORITY 等跨产品共享的)才省前缀。字段的字典关联配置引用字典时也要用全限定名(DEMO_DYDA_XB),否则前端引用不到。
二、字段名 → 字典编码推导 ​
字典编码 = <产品前缀>_<字段名去掉 _CODE 后缀>:
| 字段(在某表里) | 关联字典编码 |
|---|---|
DYDA_XB_CODE(产品 demo) |
DEMO_DYDA_XB |
LEAVE_TYPE_CODE(产品 om) |
OM_LEAVE_TYPE |
STATUS_TZT_CODE(产品 om) |
OM_STATUS_TZT |
常见业务领域命名:状态字典 <对象>_STATUS 或 <对象>_TZT;分类字典 <对象>_TYPE 或 <对象>_TFL;是否型直接复用平台 YESORNO。
三、6 种字典类型 ​
| DDTYPE | 用途 | 数据源 |
|---|---|---|
LIST |
普通单层枚举(请假类型、状态、性别) | 字典项表 |
TREE |
树形分类(地区树、组织架构、商品分类) | 字典项表 + 父节点 |
DYNA_TREE |
动态树(运行时动态加载,用业务表当字典源) | 自定义,不传字典项 |
CUSTOM |
自定义(SQL / JS 实现) | 自定义,不传字典项 |
SQL |
SQL 查询字典(复杂联表过滤) | 配 SQL,不传字典项 |
SQL_TREE |
SQL 出树形结果 | 配 SQL,不传字典项 |
选型默认
约 90% 场景用 LIST。简单枚举(项数 ≤10、无层级)→ LIST;多级分类(省 / 市 / 区)→ TREE;除非业务明显需要分级,默认推 LIST。
枚举值用大写
字典类型枚举值是大写(LIST / TREE / DYNA_TREE / CUSTOM / SQL / SQL_TREE)。旧版文档里出现过 single / tree / outtree / sql 是过期命名,新建一律用大写枚举。
四、字典项 ​
字典项编码 ​
ITEMCODE 用全大写英文单词,不用下划线(除非语义需要):
| 中文 | ITEMCODE |
|---|---|
| 年假 / 病假 / 事假 | ANNUAL / SICK / PERSONAL |
| 草稿 / 审批中 / 已批准 / 已驳回 | DRAFT / APPROVING / APPROVED / REJECTED |
没合适英文的回退:男 / 女 → M / F 或 MALE / FEMALE;是 / 否 → 复用 YESORNO 字典;中文专有名词(如民族)→ 拼音首字母(HZ 汉族 / HUIZ 回族)。
字典项排序 ​
SY_ORDERINDEX 从 1 开始的自然顺序,不留间隔(不要用 100 / 200 / 300)。高频选项排前,状态按生命周期顺序(草稿 → 提交 → 审批中 → 通过 / 驳回)。
树形字典按 DFS 全局连续编号
LIST 字典直接按数组顺序 1, 2, 3 … N;TREE 字典按深度优先遍历从 1 到 N 全局连续编号(展开后从上到下读的视觉顺序),不要每层重置从 1 开始。
✅ 正确(DFS 全局连续):
PRIMARY 1
ELEMENTARY 2
SECONDARY 3
JUNIOR 4
SENIOR 5
❌ 错误(每层从 1 重置 → 前端展开后排序乱):
PRIMARY 1
ELEMENTARY 1 ← 子项又从 1 开始
SECONDARY 2
字典项节点类型 ​
树形字典的每条字典项有节点类型 SY_NODETYPE:
| 节点类型 | 含义 | 由谁创建 |
|---|---|---|
ROOT |
根节点(字典的虚拟容器) | 平台自动建(建字典壳时同步建,一字典一条) |
GENERAL |
中间父节点 | 业务建(TREE 字典中层) |
LEAF |
叶子节点 | 业务建(LIST 字典所有项 / TREE 末端) |
业务字典项挂在自动建的根节点下
建字典时平台会自动建一条 ROOT 根节点。业务字典项的父节点必须挂在这个根节点的真实 ID 下,不是字符串 "ROOT"。
字典项默认建议显式传:SY_FLAG("1" 启用 / "0" 禁用)、SY_ORDERINDEX(从 1 起)。颜色 / 图标可选(状态色等业务明显需要时才填)。
五、联建 vs 复用 ​
建表遇到字典关联字段(_CODE / _NAME 双字段)时:
| 决策 | 何时 |
|---|---|
| 默认联建 | 一般情况——在建表的同时把对应字典一起建出来,字典编码 = 字段名去 _CODE |
| 复用 | 字典语义是平台通用基础(性别 / 是否 / 民族),且已有平台内置版本(SEX / YESORNO / NATION)→ 用通用编码 |
联建时按字段语义预设最常见的 3–6 项(性别 → M/男 + F/女;党员状态 → 预备 / 正式 / 已转出 / 已取消),由用户在确认环节修改。
六、所属模块(belongs_to) ​
字典要挂到一个业务子系统下(字典市场展示用)。三件套字段:
| 字段 | 含义 | 形态 |
|---|---|---|
MODULE_CODE |
业务子系统编码 | 字符串,如 OA / HR / DJGL |
MODULE_NAME |
业务子系统中文名 | 字符串,如 办公自动化 / 党建管理 |
MODULE_PATH |
资源表模块的 ID 树形路径 | /ROOT/<module_id> 或多层 |
常见子系统编码:OA(办公)/ HR(人事)/ EAM(资产)/ EPM(项目)/ CRM(客户关系)/ FIN(财务)/ SYS(系统通用)。
MODULE_PATH 必须是完整层级 ID 链
MODULE_PATH 不是模块名拼接(如 党建管理/子模块),而是从 ROOT 起经所有父模块到当前模块的完整 ID 链(/ROOT/<父1 ID>/<父2 ID>/<本 ID>),不是只末段模块 ID。只传末段会导致字段落空(数据库写入 NULL,但接口返回看起来有值,迷惑性强)。完整路径从平台模块树探底获取,不要手拼。
联建字典自动继承归属
建表时联建的字典会自动继承本次建表所属的模块 + 产品,配置者不必在字典里显式传 belongs_to。只有单独建独立字典时才需要选定模块并注入完整 MODULE_PATH。
注意区分:
MODULE_CODE(业务子系统编码,语义分类)和产品 ID(SY_PRODUCT_ID,决定字典存哪个库)是两回事——字典常跨产品共享业务子系统(如SEX在所有产品都属SYS),但产品 ID 决定数据落库位置。
测试数据生成规范 ​
建好资源表与功能后,常需要生成一批测试 / 演示数据来验证页面。本篇规定字段值生成策略、行内一致性、占位符、平台主数据只读的约定。
一、字段值 5 类策略 ​
对目标表的每个字段,按下列优先级匹配——命中即停,不再往下试:
| 优先级 | 字段特征 | 策略 |
|---|---|---|
| ① 系统字段 | code 以 SY_ 开头 |
跳过(后端自动派生,不出现在数据里) |
| ② 外键 | 外键类型 / 命中关联表 | 从真实主键池取真值,同步取 _NAME 双字段 |
| ③ 子表关联主键 | 命中主子关系的子表外键 | 保留占位符 {parent_pk.X.<i>}(入库时替换) |
| ④ 字典关联 | *_CODE 且配了字典关联 |
从字典项随机挑,_CODE + _NAME 配对写 |
| ⑤ 普通业务字段 | 其他 | 按字段名特征 + 类型生成(见第二节) |
字段值必须基于元数据探底,不能凭空推断
生成数据前必须先拿到目标表的真实结构(字段类型 + 字典配置 + 外键关系)、外键真值池、字典池。严禁凭口语 / 经验编造字段值——尤其是外键和字典字段,编造的值前端点不开、下拉框显示错乱。
二、字段名特征取值清单 ​
普通业务字段按字段名后缀 / 关键字推断取值:
| 字段名特征 | 取值策略 | 示例 |
|---|---|---|
*_NAME / *_USER_NAME |
中文人名 | "张三" / "王晓明" |
*_DEPT_NAME / *_ORG_NAME |
中文部门名 | "市场部" / "研发一组" |
*_PHONE / *_MOBILE |
11 位手机号 | "13812345678" |
*_EMAIL |
邮箱 | "zhangsan@example.com" |
*_CODE(非字典) |
编号序列(前缀 + 序号) | "LV-2026-0001" |
*_AMOUNT / *_MONEY / *_PRICE |
100–10000 两位小数 | 1234.56 |
*_QTY / *_NUM / *_COUNT |
1–100 整数 | 5 |
*_DATE |
场景时间窗内随机日期 | "2026-03-15" |
*_TIME / *_DATETIME |
场景时间窗内随机时间戳 | "2026-03-15 14:23:00" |
*_REMARK / *_DESC / *_CONTENT |
贴合业务的短句(15–40 字) | "因家中急事需请假 3 天" |
应用顺序:更精确的特征先匹配(
*_USER_NAME比*_NAME先匹配)。无特征时按类型兜底:短文本→短 token /NUMBER→1–100 /DATE→近 30 天 /CLOB→段落。同一字段在同表 N 行里各行独立生成(姓名 / 描述 / 日期都不重复)。
三、行内一致性 ​
一次性生成一整行(不是逐字段独立产),保证行内字段相互合理:
| 约束 | 例 |
|---|---|
| 双字段配对 | LV_TYPE_CODE="ANNUAL" 必配 LV_TYPE_NAME="年假" |
| 起止时间倒序 | LV_END_DATE >= LV_START_DATE |
| 主从字段引用 | LV_USER_NAME = 取外键池时同记录的姓名 |
| 数值范围合理 | 金额 / 数量 > 0;天数 = 结束 - 开始 |
| 状态-时间耦合 | 状态=已通过时审批时间非空;待审时审批时间为空 |
双字段不能错配
*_CODE 和 *_NAME 必须取自同一字典项 / 同一外键记录。严禁出现 LV_TYPE_CODE=ANNUAL 但 LV_TYPE_NAME=病假 的错配——这会让前端下拉框显示错乱。
落盘前对每行自检:JSON 合法、双字段配对、数值范围合理、必填字段非空。自检失败重产那一行(最多 3 次),不要让错误行进库。
四、占位符与拓扑序 ​
同一批同时建主子表时,子表数据引用主表 PK 用占位符:
{parent_pk.<主表TABLECODE>.<行索引>}
例(子表数据引用主表第 0、1、2 行):
{"PT_LEAVE_ID":"{parent_pk.PT_LEAVE.0}","APPROVE_STATUS_CODE":"PASSED"}
{"PT_LEAVE_ID":"{parent_pk.PT_LEAVE.1}","APPROVE_STATUS_CODE":"PENDING"}
入库时序:主表先入库记录每行真实 PK → 子表入库前把占位符替换为真实 PK → 再逐行入库。行索引必须小于主表行数,否则报错中止。
五、深浅度模式 ​
| 模式 | 外键 ID | 外键 NAME |
|---|---|---|
| 深度模式 | 从真实主键池取真值 | 同步取对应记录真实姓名 |
| 浅度模式 | 写 null | 由生成器估一个假姓名 |
深度模式数据"点得开"(关联能跳转),浅度模式只用于纯展示。
六、平台主数据只读 ​
平台核心表只读,不生成
平台核心表(用户 JE_RBAC_* / 核心 JE_CORE_* / 文件 JE_FILE_* 等)在测试数据里只能作为外键真值池来源,严禁往这些表里写数据。
如果探底发现深度模式所需的主数据不足(场景要 5 个员工但只有 3 个),不要自作主张造系统主数据,而要 fail-fast 让用户三选一:改浅度模式 / 用现有数据循环复用 / 取消。严禁默默 fallback 到浅度(用户可能不知道数据点不开)。
文档产出规范 ​
建表 / 建功能时同步产出说明文档(Markdown + HTML),方便交付给客户阅读、归档。本篇规定文档产出的格式与内容约定。
一、HTML 自包含,离线可打开 ​
HTML 必须自包含,零外链
产出的 index.html 必须是 vanilla HTML5 + 内嵌 <style>,严禁:
- CDN 外链(
<link>/<script src>) - 外部 JS / 外部图标 / 外部字体
- 任何需联网才能渲染的资源
原因:HTML 要在离线环境 / 客户机 / 任意浏览器双击直接打开,断网不影响渲染。所有样式内嵌、所有资源自带。
二、系统字段不入字段表 ​
字段表只列业务字段
SY_CREATETIME / SY_CREATEUSERID / SY_PRODUCT_CODE 等后端派生的系统字段不出现在文档的字段表里——读者要看的是业务字段,系统字段是平台自动维护的噪音。
三、双字段都列 ​
业务双字段(字典 _CODE + _NAME,外键 _ID + _NAME)在字段表里两个都列,避免读者误以为只有 _NAME 是真字段:
| 字段类型 | 字段表里的标注 |
|---|---|
字典 _CODE 字段 |
"字典"列写字典编码 |
字典 _NAME 字段 |
"备注"列写"字典 NAME 配对(<X_CODE>)" |
外键 _ID 字段 |
"关联查询"列写关联表 |
外键 _NAME 字段 |
"备注"列写"外键 NAME 配对(<X_ID>)" |
四、模板单源 ​
Markdown 模板的节顺序、HTML 模板的锚点 id 约定只在一处维护(文档域的模板文件)。各处引用模板,不复制——避免多份模板漂移不一致。
与界面操作的关系
本篇讲的是自动产出的说明文档的格式约定。如果你只是想了解平台界面怎么操作,看 低代码总览 即可,不需要关心这套文档产出规范。
待补 ​
待补
- [ ] Markdown 模板的完整节顺序清单
- [ ] HTML 模板的字段表列定义与示例
- [ ] 小贴士 / 业务说明段的产出策略
交付与协作规范 ​
一套业务方案往往由多人分工、分批次交付。本篇规定落盘组织、跨对象引用、清单文件、失败恢复、提交署名的约定,保证产物可追溯、可协作。
一、整项目落盘归一(单 run_id) ​
同一项目所有资源落到单个 run 目录
同一项目 / 同一需求文档的所有资源(顶部菜单 + 模块 + 字典 + 表 + 功能 + 菜单 + 子功能 + 按钮)落到单个 command/<date>/<run_id>/ 目录,不拆多个 run_id。可以分批次陆续写文件,但数据物理位置归一。
目录结构(全项目集中):
command/<date>/<run_id>/
├── manifest.json # 清单(累加更新)
├── module/{header-menu,table,func,menu}.json
├── dicts/<DDCODE>.json × N
├── tables/<TABLECODE>.json × N
├── funcs/<FUNCCODE>.json × N
└── menus/<MENU_CODE>.json × N
禁止:
- ❌ 同一项目拆多个 run_id(如
130000-batch1+130100-batch2,要合并到一个) - ❌ 跨 run_id 引用资源(batch2 的表引用 batch1 的模块——引用必须在同 run 目录内可查到)
为什么:跨 run 目录引用的父节点 / 归属模块 / 绑定表在交付(执行)阶段无法解析;同项目资源生命周期一致(同批审查 / 同批应用 / 同批回滚),物理分散会让追溯困难。逻辑分批(基础设施批 → 业务底座批 → 业务执行批)只是检查点节奏,不分拆目录。
二、跨对象引用用 CODE ​
落盘那一刻,被引用对象的真实主键(PK)往往还没生成。所以跨对象引用一律用业务编码(CODE)占位,由交付阶段翻译为真实 PK:
| 引用场景 | 落盘写法 | 交付时翻译为 |
|---|---|---|
| 功能的父节点 | SY_PARENT_CODE(模块 code / 主功能 funcCode) |
父节点真实 PK |
| 子功能引用 | FUNCRELATION_FUNCCODE_REF(子功能 funcCode) |
子功能真实 PK |
| 字典所属模块路径 | MODULE_PATH(完整 code 链) |
完整 ID 路径 |
拓扑顺序保证引用可解析
被引用方必须先建:子功能先建、主功能后建(主功能的关系行引用子功能);父模块先建、子节点后建。交付阶段按引用关系拓扑排序,有环则中止报错(平台不支持双向关系)。
三、manifest.json 的作用 ​
manifest.json 是整个 run 的资源清单,记录本次创建了哪些字典 / 表 / 功能 / 菜单的摘要。分批写文件时累加更新(每批写完把新增条目追加到对应数组,不重写整个文件)。它是交付与回溯的索引——审查、执行、回滚都以它为准。
四、失败恢复 ​
进度可续传
交付(执行)过程中如果某一步失败,已成功创建的资源会记录在进度文件 / 清单里,可从断点续传,不必从头重来。每个对象的真实 PK 入库后写入清单,后续引用从清单查取真实 PK。
测试数据入库失败时,看顶层失败标记判断是否需要回滚;一键清理方案数据时缺省走 dry-run(预演),脚本判失败看顶层标记。详见各自的使用说明。
五、提交 / 署名协作约定 ​
多人协作交付时的 Git 约定:
- 提交信息含中文时用文件方式提交(
git commit -F <文件>),不要用命令行内联——内联的中文 commit message 在某些 shell 下会被拆散。 - 分支隔离:在功能分支上开发,不直接提交默认分支。
- 按需提交 / 推送:只在需要时提交或推送,不自动批量提交。
待补
具体的代码 / 配置提交署名格式、协作分支命名、合并 PR 的约定,按各团队的工程规范执行。本篇只给与方案落盘交付直接相关的约定。
自包含原则 ​
本栏目所有规范篇目自包含——使用灵象做二次开发时,只需读本栏目相关篇目即可完整工作,不依赖外部规范文档。
七、版本发布
版本升级 ​
分工说明 ​
| 脚本 | 职责 |
|---|---|
scripts\start.bat |
只保证三库存在:首次启动时初始化合并基线,正常重启不触发任何升级逻辑 |
scripts\upgrade.bat |
对运行中应用触发升级:SQL 增量 + 附件同步 + 平台升级包装载 + 程序文件覆盖;完成后提示重启 |
升级前应用必须已启动并通过健康检查;程序文件覆盖(阶段 1.5)是在线完成,被 JVM 锁定的 jar 会列入手动清单,需停服后手动替换再重启。
操作步骤 ​
第一步:备份 ​
停止应用前,整目录冷拷贝以下三个目录:
data/— 内嵌 MariaDB 数据文件与版本记录files/— 平台附件文件config/— 本机定制配置
第二步:覆盖程序文件与脚本(三条红线) ​
将新版发行包内容覆盖到当前目录时,必须遵守以下三条红线:
三条绝不可违反的红线
- 绝不覆盖
data/mysql/— 直接覆盖会损坏正在使用的 InnoDB 数据文件,导致数据库无法启动。 files/只做合并拷贝(只增/同名覆盖,不先删后拷) — 现有附件文件不能被删除。config/只新增文件、不覆盖已存在文件 — 本机定制项(数据库凭据、端口等)必须保留;新增配置键由 jar 内置 yml 自动生效。
升级包内程序文件覆盖语义:只增/同名覆盖、不删;config/ 不进升级包;data/ 绝不碰;job/application.properties 自动跳过。
第三步:放置升级资源 ​
在发行包根目录下,每个版本的升级资源放在 upgrade/<版本>/ 目录中:
upgrade/
└── <版本>/
├── sql/ # 增量 SQL 文件(数据)
├── files/ # 新附件(按 files/ 下相对路径摆放)(数据)
├── platzip/ # 平台升级包 ZIP(数据)
├── app/ # jeapp-standalone.jar(程序文件)
├── lib/ # 外置第三方依赖层(程序文件)
├── plugins/ # 插件 jar(程序文件)
├── web/ # 前端静态资源(程序文件)
├── job/ # jecloud-job-admin.jar(程序文件)
├── scripts/ # 启停脚本(程序文件)
└── root/ # VERSION / README / 根启动器(程序文件)
data/、sql/、files/、platzip/ 为数据类(可在线应用);app/、lib/、plugins/ 等为程序文件(可能被 JVM 锁定,需停服替换)。
lib/ 是薄启动器后新增的程序文件层
自薄启动器(thin launcher)架构起,第三方运行时依赖外置在 lib/(而非内嵌于 fat jar)。升级包 upgrade/<版本>/lib/ 同样由 ProgramFileOverlay 覆盖——若升级包含依赖版本变更,必须包含 lib/ 层,否则依赖升级落空。
第四步:启动应用并等待就绪 ​
scripts\start.bat
等待控制台输出 [OK] 或通过健康检查:
curl http://127.0.0.1:8080/actuator/health
返回 "status":"UP" 后再执行下一步。
第五步:运行 upgrade.bat ​
upgrade.bat
脚本会弹出三段交互式选择:
三段交互式选择 ​
选择一:来源 ​
[1] 离线(资源已在 upgrade/<版本>/ 目录下)
[2] 在线(本期未实现)
在线升级本期未开放
选 [2] 会提示"在线升级本期未实现,请使用离线方式"。请选 [1] 并确保升级资源已放到对应目录。
选择二:目标版本 ​
留空 = 应用所有高于当前已安装版本的版本(按版本号升序逐个应用)
指定版本号 = 只应用到该版本为止(含该版本)
例:当前已安装 3.1.0,upgrade/ 下有 3.1.1、3.1.2:
- 留空 → 依次应用
3.1.1、3.1.2 - 填
3.1.1→ 只应用3.1.1,3.1.2跳过
选择三:覆盖模式 ​
[1] 自动 — 就地覆盖所有能覆盖的程序文件;被 JVM 锁定的文件列入 manual 清单
[2] 手动 — 只列出所有需覆盖的文件清单,由你自己拷贝
选 [1] 自动 后,脚本调用本机端点:
POST http://127.0.0.1:8080/je/standalone/upgrade/apply
完成在线部分(SQL 增量、附件同步、平台升级包装载、未锁程序文件覆盖),并返回 JSON 报告。
被锁文件处理 ​
运行中的 JVM 会锁定以下文件,无法在线覆盖:
jeapp-standalone.jar— 主应用 jar(JVM 加载中)plugins/system/*.jar、plugins/business/*.jar等 — 已加载的插件 jarjob/jecloud-job-admin.jar— 调度中心进程(端口 3060)正在占用
这些文件会出现在返回 JSON 的 manual 清单中(字段 needManual: true),格式示例:
{
"needManual": true,
"manual": [
{
"from": "upgrade\\3.1.1\\app\\jeapp-standalone.jar",
"to": "jeapp-standalone.jar",
"reason": "file locked by JVM"
},
{
"from": "upgrade\\3.1.1\\job\\jecloud-job-admin.jar",
"to": "job\\jecloud-job-admin.jar",
"reason": "file locked by port 3060 process"
}
]
}
处理流程:
-
停止应用:
batscripts\stop.bat -
对
manual里每一项,将from拷贝到to:batcopy /Y upgrade\3.1.1\app\jeapp-standalone.jar jeapp-standalone.jar copy /Y upgrade\3.1.1\job\jecloud-job-admin.jar job\jecloud-job-admin.jarLinux/macOS:
bashcp upgrade/3.1.1/app/jeapp-standalone.jar jeapp-standalone.jar cp upgrade/3.1.1/job/jecloud-job-admin.jar job/jecloud-job-admin.jar -
重启应用:
batscripts\start.bat
版本号何时更新 ​
重启前必须完成所有 manual 清单中的 jar 替换
端点不会在执行时更新版本号。版本号在重启完成后的启动期才会写入 data/INSTALLED_VERSION 与数据库版本标记。
如果未替换 manual 清单中的 jar 就重启,系统会将版本号标记为新版,但实际运行的仍是旧代码,导致版本号与代码不匹配。
版本识别规则:
| 文件 | 说明 |
|---|---|
VERSION(dist 根目录) |
目标版本号,随程序文件覆盖更新 |
data/INSTALLED_VERSION |
已成功升级到的版本,不随程序覆盖变化,只在启动期写入 |
断点续传 ​
升级进度记录在 data/upgrade-progress(该目录永不被覆盖)。
中途失败或手动换完 jar 后,再次运行 upgrade.bat 会自动跳过已完成的(版本, 阶段)组合,不重复执行。
防重复执行 ​
- SQL 增量:
sql/upgrade/*.sql按文件名记录在_jecloud_schema_version表,已执行过的文件永不重跑;已发布文件内容绝对不能修改,修改会触发启动告警。 - 平台升级包:按资源 ID 合并,已成功装载的包再次触发会自动跳过。
- 附件文件:只增/同名覆盖,不删除现有文件。
安全 ​
升级端点 /je/standalone/upgrade/apply 只绑 127.0.0.1(由 LocalhostOnlyFilter 强制),非本机访问一律返回 403,无需平台 token 鉴权。集群反代部署时,nginx 模板已 deny /je/standalone/ 前缀,自定义反代须同样封堵。
常见问题 ​
curl not found
Windows 10 / 11 已内置 curl,无需额外安装。确认 curl 在 PATH 中(开始菜单搜索"命令提示符",输入 curl --version)。
端点返回 403
升级端点只允许从本机调用,必须在安装了灵象的机器上双击 upgrade.bat 执行,不能通过远程 IP 访问。
回滚
阶段一未内置自动回滚。使用第一步冷拷贝的备份手动恢复:
- 停止应用:
scripts\stop.bat - 删除或覆盖
data/、files/、config/(从备份目录还原) - 还原程序文件(
jeapp-standalone.jar、lib/、plugins/、web/、job/等) - 重启:
scripts\start.bat
相关链接 ​
- 备份与恢复 — 冷备份操作步骤
- 启停与健康检查 — start.bat / stop.bat 用法
- 定时任务(XXL-Job) — 调度中心(端口 3060)管理
发布记录 ​
灵象的版本升级方式见 版本升级(upgrade.bat 三段式离线升级 + 程序文件覆盖)。
版本历史 ​
持续维护
完整版本变更日志陆续补充;当前发行版本号见发行包根目录 VERSION 文件,已安装版本见 data/INSTALLED_VERSION。
| 版本 | 说明 |
|---|---|
| 3.1.x | 平台 8 服务合并单进程、内嵌 MariaDB/Redis、薄启动器分层 dist、增量升级、多节点集群等 |
八、场景案例
场景案例 ​
本栏目用「按场景看一个真实模块」的方式,带你理解灵象能搭出什么、以及它是怎么搭出来的。
平台内置了一套完整的业务样板(销售、项目管理、合同、产品、客户成功等),可直接作为二次开发的参考。登录后从顶部 工作 进入即可体验。
案例清单 ​
| 序号 | 案例 | 包含模块 | 入口 |
|---|---|---|---|
| 1 | 销售CRM | 网站运营 / 产品管理 / 销售管理 / 合同管理 | 销售CRM |
| 2 | 项目PM | 效率工具 / 项目管理 / 客户成功 | 项目PM |
| 3 | 待定 | 进销存 / OA / MES 等行业场景陆续补充 | — |
怎么"搭"出来
想了解这些模块的搭建方法,对照 平台配置 › 低代码总览 的八步主线:资源表 → 数据字典 → 功能 → 功能列表 → 表单 → 子功能 → 菜单 → 授权。
计划中的行业场景 ​
案例陆续补充
以下典型场景案例正在整理(含截图与分步):
- 进销存(库存 / 出入库 / 供应商)
- OA 审批(请假 / 报销 / 用印)
- 生产报工 MES(工单 / 报工 / 质检)
销售CRM ​
平台内置的「销售 CRM」是一套完整的客户关系管理业务样板,由 网站运营、产品管理、销售管理、合同管理 四个业务模块组成,可作为二次开发的参考。登录后从顶部 工作 进入对应模块。
业务架构 ​
销售 CRM 的四个模块与全部功能(菜单):客户管理为核心主功能(含子功能),其余为列表型功能。
工作展板 ​
「工作展板」聚合了销售相关的统计看板(借款分布、招待费分布等,支持本周/本月/本季度切换):

一、网站运营 ​
站点索引 ​
汇总各站点的访问索引数据,掌握站点整体流量与活跃情况。

页面热点 ​
统计页面被访问、点击的热度分布,定位用户最关注的重点页面。

来源索引 ​
按访问来源(渠道、搜索词等)归集流量,分析获客来源结构。

站点访客 ​
记录访客明细与行为轨迹,沉淀潜在客户线索。

二、产品管理 ​
产品管理 ​
维护产品主数据(名称、分类、规格、状态等),是销售与合同环节的产品来源。

产品文档维护 ​
为产品上传、维护说明书、白皮书等文档资料。

产品文档查询 ​
按产品检索已维护的文档,供销售与客户快速取用。

三、销售管理 ​
「销售管理」是 CRM 的核心模块,客户管理为主功能。
客户管理(主功能) ​
客户管理维护客户主档,是销售业务的核心。列表视图——顶部检索 + 操作按钮(新建客户等),表体按列展示客户数据:

双击一条记录进入详情表单:分组录入基本信息(带 * 为必填),顶部 客户联系人 / 客户情报 页签即随主记录联动的子功能:

客户联系人 ​
维护客户方的联系人档案(姓名、职务、电话等),可随客户主记录联动。

销售商机 ​
记录销售机会(商机名称、金额、阶段、预计成交时间等),推进销售漏斗。

追踪计划 ​
为客户与商机制定跟进计划与提醒,保证销售动作不遗漏。

重点工作 ​
标记并跟踪需要重点推进的销售事项。

商机变更 ​
记录商机阶段、金额等关键信息的变更过程,留痕可追溯。

四、合同管理 ​
合同审核 ​
提交合同走审批流程,审核通过后方可执行。

合同执行 ​
跟踪已生效合同的执行进度与状态。

开票申请 ​
针对合同发起开票申请并走审批。

回款计划执行 ​
按合同回款计划,跟踪每期回款的执行情况。

回款登记 ​
登记实际到账回款,核销回款计划。

对照低代码主线
这套 CRM 的每个功能都是按 低代码总览 的八步搭出来的:资源表 → 数据字典 → 功能配置(列表+表单+子功能)→ 菜单配置 → 授权。
项目PM ​
平台内置的「项目 PM」覆盖从立项到执行、验收的全流程,由 效率工具、项目管理、客户成功 三个业务模块组成,可作为项目型业务二次开发的参考。登录后从顶部 工作 进入对应模块。
业务架构 ​
项目 PM 的三个模块与全部功能(菜单):项目立项为核心主功能(含收益分配子表),其余为列表型功能。
一、效率工具 ​
霁月清单 ​
个人 / 团队的待办清单工具,集中管理日常工作事项。

二、项目管理 ​
「项目管理」是 PM 的核心模块,项目立项为主功能。
项目立项(主功能) ​
项目立项是 PM 的核心入口。列表视图——按列展示项目名称、项目编号、收益分配等信息,顶部提供检索与「项目立项」操作按钮:

双击一条记录进入详情表单:分组录入合同信息、立项信息,并在下方以子表维护收益分配明细(主子表 / 子功能的典型形态):

项目执行 ​
跟踪立项后项目的执行进度与里程碑。

收益分配执行 ​
按立项时约定的收益分配方案,执行分配动作。

项目执行模板 ​
预置标准的项目执行流程模板,新项目可快速套用。

需求收集 ​
汇集来自客户与内部的原始需求条目。

需求规格 ​
把需求整理为规格说明,作为开发与验收依据。

任务单 ​
把需求 / 工作拆分为可执行任务并指派、跟踪。

缺陷单 ​
登记并跟踪测试 / 使用中发现的缺陷,直至关闭。

项目验收申请 ​
项目完成后发起验收申请并走审批。

项目终止申请 ​
对需提前终止的项目发起终止申请并审批。

收益分配数据 ​
汇总项目收益分配的明细数据。

三、客户成功 ​
客户团队 ​
维护服务该客户的团队成员构成。

服务清单(客服) ​
从客服视角记录与跟踪客户服务事项。

服务清单(监控) ​
从监控视角跟踪服务 / 系统运行状况。

客户投诉 ​
登记并处理客户投诉,直至闭环。

对照低代码主线
PM 的每个功能同样按 低代码总览 的八步搭出:资源表(含主子表)→ 数据字典 → 功能配置(列表+表单+子功能)→ 菜单配置 → 授权。
JECloud 灵象·操作说明书
