JECloudJECloud 灵象·操作说明书

JECloud AI 灵象 · 操作说明书

低代码平台单机版(灵象)操作说明书

共 48 篇 · 图片位于同级 assets/ 目录 · 左侧三级目录可收缩与搜索定位

一、产品入门

一、产品入门 › 1、产品简介

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

完整参考

端口可改性说明、目录结构、常用命令、术语表,见 附录

一、产品入门 › 2、快速安装体验

快速安装体验

最快路径:解压 → 启动 → 申请证书 → 登录,几分钟跑起来。环境要求、端口、配置参数等放在本页末尾的 补充:环境与参数,正式部署再看。

快速安装体验 · 三步上手

第一步:解压发行包

把你系统对应的发行包解压到一个目录即可(不需要安装程序)。各系统发行包:

系统 发行包
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
bash start.sh

macOS

macOS 会给从网络下载的文件加"隔离"标记,首次启动需先解除,再启动。在根目录执行:

bash
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 即可。
╚════════════════════════════════════════════════════════════════════╝

申请并安装:

  1. 访问 https://jecloud.net/download 在线申请授权证书,拿到官方签发的 jecloud.license(通常在一个 zip 包里)
  2. jecloud.license(及随附的插件 key)放入发行包根目录下的 license/ 文件夹(该目录始终存在,含 LICENSE-README.txt 说明)
  3. 重新运行启动脚本

完整的申请与安装、续期、排错见 授权证书

开发跳过

开发调试时可在 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 健康指标的误报,不影响业务功能,可忽略。

停止

bat
:: Windows
scripts\stop.bat
bash
# 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.*"

端口、目录与配置参数

  • 端口占用目录结构完整清单见 附录
  • 配置参数(端口、数据库 / Redis 密码、XXL-Job 等)见 配置说明

首次启动会发生什么

首次启动会按顺序自动完成(约 60–90 秒,控制台打印 [1/8][8/8] 进度):

  1. 端口预检 — 检查 8080 / 7010 / 33306 / 61379 是否空闲,任一被占用则报错退出
  2. 启动内嵌 MariaDB(33306)— 初始化数据目录 data/mysql/
  3. 执行数据库初始化脚本 — 按文件名顺序运行 sql/schemasql/datasql/upgrade(幂等)
  4. 启动内嵌 Redis(61379)
  5. 启动应用服务(Tomcat 8080)— 加载平台服务插件、启动 Netty WebSocket(7010)
  6. 启动调度中心(jecloud-job-admin,3060)— 主程序健康检查通过后自动拉起

遇到启动失败、端口冲突等问题,见 常见问题与排错

一、产品入门 › 3、快速上手应用

快速上手应用

目标

跟着一条完整的「开发流转路线」走一遍,理解灵象低代码"不写后端代码就能搭出业务系统"的全过程。下文以平台内置的客户管理为例,每一步都配上系统真实界面。

开发流转路线

一个业务模块从无到有,标准顺序如下——数据底座(①②)→ 业务功能(③)→ 交付(④⑤)→ 运行(⑥):

低代码开发流转路线

下面每一步都遵循「先创建、再配置」两个动作:创建会弹窗输入基本信息,确定后进入配置 / 编辑区——对照两张截图即可看出"创建"与"配置"的区别。

① 资源表:定义业务数据

创建——选中模块,点工具栏「新建表」,在弹出的对话框里选类型、填表名称与表编码,点「确定」:

第一步 · 新建资源表(创建)

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

第一步 · 资源表字段设计(配置)

详见 资源表

② 数据字典:维护可复用枚举

创建——点「新建列表字典」,在弹出的空白表单里填字典名称 / 编码 / 类型 / 所属模块:

第二步 · 新建数据字典(创建)

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

第二步 · 数据字典项编辑(配置)

详见 数据字典

③ 功能配置:列表 + 表单 + 子功能

入口——从「开发 › 应用中心」进入,左上切到「业务服务」,逐级展开「子系统 › 模块 › 功能」:

第三步 · 应用中心功能树(入口)

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

第三步 · 应用中心新建功能(创建)

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

第三步 · 功能配置表单页签(配置)

详见 功能配置

④ 菜单配置:挂入导航

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

第四步 · 菜单配置(选中节点看右侧配置)

详见 菜单配置

⑤ 授权:授予角色

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

第五步 · 角色授权(角色与账户)

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

第五步 · 权限配置(切到权限配置页签并展开勾选)

详见 菜单配置

⑥ 运行验证:最终用户使用

切换到运行态(工作 菜单),在导航中找到功能,录入数据验证新增、编辑、删除、查询:

第六步 · 运行态使用

至此,一个完整的低代码应用就搭建并交付完成了。


想深入了解每个步骤?

对照 平台配置(低代码) 的八步主线,每个环节都有专题详解:

一、产品入门 › 4、附录

附录

端口清单

端口 用途 可否修改 联动点(改端口时须同步修改以下位置)
8080 HTTP / REST API / 前端页面 可改 StandaloneApplication.mainconfig/application.ymlinstant.conf
7010 WebSocket(Netty,实时推送) 可改 StandaloneApplication.mainconfig/application.ymlinstant.conf、数据库表 JE_CORE_WEBSOCKETURL
33306 内嵌 MariaDB(嵌入式数据库) 可改 StandaloneApplication.mainconfig/application.ymlinstant.conf
61379 内嵌 Redis(缓存 / 会话) 可改 StandaloneApplication.mainconfig/application.ymlinstant.conf
3060 XXL-Job 调度中心 Admin 可改 config/jecloud-job.propertiesconfig/application.ymljecloud.standalone.xxl-job.admin-addresses
9999 XXL-Job 执行器(Executor) 可改 config/application.ymljecloud.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)可能失败。


命令速查

启停

bat
:: Windows 启动(主节点,all 模式:DB + Redis + 应用 + 定时任务)
start.bat

:: Windows 停止(同时终止应用进程、mysqld、redis-server、nginx)
stop.bat
bash
# Linux / macOS 启动
./scripts/start.sh

# Linux / macOS 停止
./scripts/stop.sh

健康检查

bash
# 返回 {"status":"UP"} 表示服务就绪(可用于脚本轮询等待启动完成)
curl http://localhost:8080/actuator/health

端口排查

bat
:: Windows:查看指定端口占用情况(以 8080 为例)
netstat -ano | findstr :8080
bash
# Linux / macOS:查看端口占用(以 8080 为例)
lsof -i :8080

备份

bat
:: Windows:备份数据目录与文件(停服后执行)
xcopy /E /I /H data\ backup\data\
xcopy /E /I /H files\ backup\files\
bash
# Linux / macOS:打包备份(停服后执行)
tar -czf backup-$(date +%Y%m%d).tar.gz data/ files/

版本升级

bat
:: Windows:执行交互式升级向导(离线 / 在线 → 目标版本 → 自动 / 手动)
upgrade.bat

数据清理

缺省即真执行

不带 confirm 参数时直接清数据,无预览保护。 想先确认清单,请加 confirm=true(仅预览,不动数据)。

bash
# 仅预览(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=<方案编码>"

源码构建

bash
# 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_MANAGEPRODUCT_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 灵象的唯一权威数据源。手册其他页面若与本页记录不一致,以本页为准

二、平台配置(低代码)

二、平台配置(低代码) › 1、低代码总览

低代码总览

开发工作台

浏览器登录平台(默认 http://localhost:8080,账号 admin / 123456)后,点击顶部 开发 进入开发工作台。「快捷入口」与左侧「核心引擎」聚合了低代码开发的全部模块(资源表、数据字典、菜单管理、工作流引擎 …),「平台数据」展示当前产品 / 资源表 / 菜单 / 功能 / 数据字典 / 工作流的数量统计。

开发工作台 · 快捷入口与平台数据

本章目标

理解灵象低代码的配置开发模型,掌握不写代码、只在浏览器里配置即可搭出一个完整业务应用的标准路径。

灵象平台引擎靠配置驱动:先建好数据底座(资源表 + 数据字典),再围绕资源表搭出业务功能(功能 + 功能列表 + 表单 + 子功能),最后通过菜单与授权把功能交付给指定角色使用。这是区别于「代码开发」(在 IDEA 里写 Java)的纯配置侧路径。

标准开发主线(八步)

一个业务模块从无到有,标准顺序如下:

①创建资源表 → ②创建数据字典 → ③创建功能 → ④配置功能列表
   → ⑤配置表单 → ⑥配置子功能 → ⑦创建菜单 → ⑧授权
步骤 做什么 说明 详见
① 创建资源表 定义业务数据结构 字段、类型、主子表与关联关系,映射为业务库物理表,是整个应用的数据基础 资源表
② 创建数据字典 维护可复用的枚举/编码 状态、类型等下拉选项集中维护,供多个字段引用,改一处全局生效 数据字典
③ 创建功能 把资源表包装成业务模块 一个功能 = 一个可访问的业务页面,挂载某张资源表 功能配置
④ 配置功能列表 配置列表视图 显示哪些列、查询条件、排序、操作按钮(新增/编辑/删除/导出) 功能配置
⑤ 配置表单 配置新增/编辑表单 拖拽控件、字段绑定、校验规则、布局 功能配置
⑥ 配置子功能 配置从属/明细功能 主子表明细、关联列表、详情页签等挂在主功能下的子节点 功能配置
⑦ 创建菜单 把功能挂到导航树 将功能节点配置到菜单树的对应位置,成为用户可见的入口 菜单配置
⑧ 授权 把菜单/功能授予角色 在角色上勾选功能权限与数据权限,账号通过角色获得访问权,完成交付闭环 菜单配置

前两步搭数据底座,③~⑥围绕资源表搭业务功能,⑦⑧通过菜单与授权完成交付——这条主线适用于绝大多数业务模块。

在主线之上叠加

主线跑通后,按需叠加以下能力:

  • 流程引擎:为功能绑定审批流程,驱动业务状态流转。见 流程引擎

要点提纲

  • 产品与方案:产品是应用的顶层容器,方案是产品下的子模块;理解两者的层次关系
  • 运行态 vs 设计态:设计态在管理界面编辑配置,运行态是最终用户看到的应用界面;两者可独立刷新
  • 元数据与 loadFunc 链路:平台在运行时通过元数据驱动页面渲染,了解 loadFunc 的调用链路有助于排查问题
  • 角色 / 权限模型:账号 → 角色 → 功能权限 / 数据权限,授权链路贯穿第⑧步
  • 与代码开发的关系:低代码满足不了的场景可通过业务插件扩展,详见 代码开发

待补

  • [ ] 各步骤操作截图
  • [ ] 端到端建一个完整业务模块的分步详解
二、平台配置(低代码) › 2、资源表

资源表

低代码开发主线第 ① 步:创建资源表——先把业务数据结构定下来,这是整个应用的数据底座。

入口

浏览器登录平台后,从顶部 开发 进入开发工作台,左侧「核心引擎 › 资源表」。

本章目标

用建模工具创建业务资源表与字段,保存同步后映射为业务库的物理表。

创建资源表

打开「资源表」后,首页会给出资源总数、类型分布与名词解释(普通表 / 单根树形表 / 多根树形表 / 视图 / 导入表 / 关系视图):

资源表 · 模块首页与名词解释

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

资源表 · 元数据分类树

新建一张业务表

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

资源表 · 新建表对话框

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

资源表 · 字段设计

查看 / 编辑已有表(配置区)

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

资源表 · 选中已有表的设计视图

设计视图内还有 表格列 / 表格键 / 表索引 / 历史留痕 四个子页签:

切到「表格键」页签,维护主键与外键关联(键编码、字段编码、类型、关联表 / 关联字段 / 关联类型):

资源表 · 表格键页签

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

资源表 · 表索引页签

操作要点

  1. 建模型 / 建表:在模型设计器中新建数据模型,映射为数据库物理表
  2. 字段类型:文本、数字、日期、布尔、枚举等常用类型及其配置项
  3. 主子表与关联关系:一对多主子表配置、外键关联关系的定义方式
  4. 系统字段自动生成:平台默认为每张表追加 SY_ 开头的系统字段(主键、数据状态、登记人/时间、所属公司/机构、工作流字段等),无需手工维护
  5. 生成数据库表:在设计态保存并同步后,平台自动在业务库执行 DDL
  6. 与双库路由的关系:灵象在独立业务库与平台库之间路由查询,了解业务数据落在哪个库;详见 数据库使用规则

命名与建模规范

资源表 / 字段的命名、类型、键、索引等规范,见 规则规范 › 资源表设计规范

下一步

数据底座建好后,继续 数据字典(第 ② 步),再到 功能配置

待补

  • [ ] 主子表 / 关系视图建模的分步截图
二、平台配置(低代码) › 3、数据字典

数据字典

低代码开发主线第 ② 步:创建数据字典——集中维护可复用的枚举 / 编码,供多个资源表字段引用。

入口

开发工作台左侧「核心引擎 › 数据字典」,或开发展板「快捷入口 › 数据字典」。

本章目标

维护可复用的数据字典(如状态、类型、分类),改一处全局生效,为表单下拉、列表展示提供统一取值。

创建数据字典

左侧按业务套件分类组织字典,右侧是字典列表(字典名称 / 编码 / 类型 / 所属模块):

数据字典 · 字典分类与字典列表

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

数据字典 · 新建字典表单

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

数据字典 · 字典项编辑

操作要点

  1. 建字典:定义字典分类与字典项(编码 + 显示文本)
  2. 字段引用字典:资源表字段绑定字典后,表单下拉、列表展示自动取字典文本
  3. 维护与扩展:字典项可随业务增长持续追加,无需改表结构

字典规范

字典编码、类型选型(LIST / TREE / DYNA_TREE / SQL 等)、字典项编码规范,见 规则规范 › 字典设计规范

下一步

字典就绪后,进入 功能配置(第 ③~⑥ 步)。

待补

  • [ ] 字典类型选型与维护分步详解
二、平台配置(低代码) › 4、功能配置

功能配置

低代码开发主线第 ③~⑥ 步:创建功能 → 配置功能列表 → 配置表单 → 配置子功能——围绕资源表搭出可操作的业务模块。

入口:应用中心 → 双击功能

功能配置在「应用中心」里完成。从顶部 开发 › 应用中心 进入,左上角切换到对应服务 / 产品(业务功能在「业务服务」下),逐级展开「子系统 → 模块 → 功能」:

应用中心 · 业务服务功能树

新建功能(创建)

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

应用中心 · 新建功能(创建)

打开功能配置(配置)

找到目标功能(如 客户关系管理 › 销售管理 › 客户管理),双击该功能,即弹出「功能配置」设计器。设计器顶部分为 功能 / 列表 / 表单 / 按钮 / 子功能 五个页签——列表归列表、表单归表单,各管各的配置。

③ 创建功能(功能页签)

「功能」页签是核心配置:功能编码、功能名称、绑定的表名、主键、功能类型、数据录入方式,以及视图操作表、主从展示、流程绑定等:

功能配置 · 功能页签(核心配置)

  • 功能编码 = 资源表编码(如 CRM_SALES_CUSTOMER),表名指向资源表或其视图(如 V_CRM_SALES_CUSTOMER
  • 功能类型:操作视图 / 普通功能等
  • 流程绑定:可为功能绑定工作流(如"客户报备审批"),录入数据即进入审批

④ 配置功能列表(列表页签)

「列表」页签配置列表视图:选哪些字段作为列、列宽、对齐、是否隐藏、排序、列锁定、是否可编辑等,逐列配置:

功能配置 · 列表页签

⑤ 配置表单(表单页签)

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

功能配置 · 表单页签

配置按钮(按钮页签)

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

功能配置 · 按钮页签

按钮的「事件」即在 平台功能事件 里为按钮(click / before-click / after-click)挂脚本。

⑥ 配置子功能(子功能页签)

「子功能」页签挂主子表 / 关联功能:每个子功能绑定一张表(或视图)、设置展示方式与父子关联字段。下图客户管理挂了 客户联系人客户情报 两个子功能,运行时即表单顶部的页签:

功能配置 · 子功能页签

运行效果

配置完成后,运行态即得到一个可用的业务功能——列表、表单、子功能页签一应俱全,参见 场景案例 › 销售模块

功能规范

功能编码、功能树层级、列字段 / 表单字段(XTYPE)、按钮、子功能等规范,见 规则规范 › 功能设计规范

下一步

功能搭好后,进入 菜单配置(第 ⑦⑧ 步)把它交付给用户。

待补

  • [ ] 字段控件类型(XTYPE)逐项说明与截图
  • [ ] 按钮事件与权限配置分步详解
二、平台配置(低代码) › 5、菜单配置

菜单配置

低代码开发主线第 ⑦⑧ 步:创建菜单 → 授权——把搭好的功能挂到菜单树,并授权给角色,完成"从配置到用户可用"的交付闭环。

入口

菜单管理 在「开发 › 核心引擎」;角色授权 在顶部 管理 菜单下。

本章目标

把配置好的功能挂到菜单树,并授权给角色,让最终用户能在导航中看到并使用。

⑦ 创建菜单

菜单是功能暴露给最终用户的导航入口。在「菜单管理」中,左侧「菜单地图」按方案组织菜单树(开发平台 / 系统管理 / 工作),通过 添加 新建菜单节点并绑定功能:

菜单管理 · 菜单地图

操作步骤:

  1. 在「菜单地图」中展开并选中要挂载的父节点,点击右侧上方的「添加」新建菜单节点。
  2. 展开菜单树、选中某个菜单节点,右侧即出现该菜单的配置信息——名称、图标、类型、所属服务、绑定的功能、是否显示、排序等,逐项修改即可:

菜单配置 · 选中节点看右侧配置

要点:菜单分一级 / 二级层级;叶子菜单绑定已配置好的功能;图标请用平台内置图标(见 菜单设计规范)。

⑧ 授权

没有授权的用户看不到对应入口。授权有两种方式:

方式一:菜单一键授权给开发人员 —— 「菜单管理」工具栏上有「授权给开发人员」按钮,开发期可一键把菜单授权给开发角色,快速可见。

方式二:角色授权(精细控制) —— 顶部 管理 › 角色授权:左侧是角色列表(公司领导 / 销售总监 / 财务人员 …),选中角色后,右侧「账户配置」管理该角色下的账号:

角色授权 · 角色与账户配置

切到右侧「权限配置」页签,展开「菜单授权 / 功能授权」,勾选要开放给该角色的菜单与功能(可「全部展开」逐项勾选):

角色授权 · 权限配置(菜单 / 功能授权)

  • 功能权限 vs 数据权限:功能权限控制菜单 / 按钮的可见性;数据权限(顶部 管理 › 数据授权)控制数据行的可读范围
  • 账号 → 角色 → 权限:账号关联角色,角色获得勾选的功能与数据权限,完成授权闭环

菜单规范

菜单命名、图标默认值(严禁臆造平台不存在的图标)、层级与排序规范,见 规则规范 › 菜单设计规范

下一步

主线跑通后,可继续叠加 流程引擎

待补

  • [ ] 菜单「添加」对话框(新建节点时填写的字段)截图
二、平台配置(低代码) › 6、流程引擎

流程引擎

在低代码主线之上叠加:为业务功能绑定审批流程,驱动业务状态流转。平台流程引擎基于 Activiti,支持发起、撤销、退回、转办、加签、会签、传阅等中国特色审批规则。

入口

从顶部 开发 › 工作流引擎 进入;功能与流程的绑定在 功能配置 的「功能」页签设置(绑定工作流)。

本章目标

为业务配置审批流程,并把流程绑定到功能,让用户提交数据即进入审批流转。

流程列表

「工作流引擎」左侧按业务分类组织流程,右侧是流程清单(流程名称、编码、分类、版本、是否部署等):

流程引擎 · 流程列表

打开流程设计器

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

流程引擎 · 流程设计器(点「规划」action 打开)

  • 左侧:节点组件库——开始 / 结束 / 判断 / 任务 / 分支 / 聚合 / 会签 / 固定人 / 候选 / 多人审批 等,拖到画布即添加节点。
  • 中间画布:拖拽连线绘制审批流(如 开始 → 填单人 → 领导审核 → 结束)。
  • 右侧:基础配置(流程名称、绑定功能、流程分类、部署环境)、启动配置(任何人启动 / 可启动角色 / 启动表达式 / 定时启动)、扩展配置。

要点提纲

  • 流程设计器:可视化绘制审批流程图,添加节点与连线
  • 节点与审批人:配置各审批节点的处理人(指定人员、角色或动态表达式)
  • 表单绑定:将流程与业务表单关联,控制各节点的字段可见与可编辑范围
  • 发起与审批:最终用户如何发起审批申请、审批人如何处理待办任务
  • 与 Activiti 引擎的关系:平台流程引擎底层基于 Activiti,ACT_* 表由平台初始化脚本预置,无需手动干预

流程规范

流程相关的命名与配置规范,见 规则规范 › 功能设计规范(功能与流程绑定部分)。

待补

  • [ ] 可视化流程设计器(节点/连线/审批人)操作截图
  • [ ] 发起与审批分步详解

三、代码开发

三、代码开发 › 1、代码开发总览

代码开发总览

代码开发是什么

代码开发是指在 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

同步微服务版更新的标准三连:

bash
# 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 自动配置、PortPreflightCheckSqlBootstrapRunnerStandaloneOverridesAutoConfiguration(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 统一请求封装与接口调用
三、代码开发 › (1) 获取源码与产物

获取源码与产物

业务代码 = 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

bash
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,此处尚未文档化,待补齐后补充示例工程结构与逐步命令。
三、代码开发 › (2) IDEA 配置与运行

IDEA 配置与运行

本页讲如何在 IntelliJ IDEA 中跑一个平台服务(以 jecloud-meta 元数据服务为例)、命中源码断点调试。聚焦四个关键点,最后给出"调试配置中心"截图。

调试原理:反向代理到本地服务实例

单机主进程(8080)把某个服务的请求反向代理到你在 IDEA 中本地跑起来的该服务实例,请求落到你的源码上,从而命中断点。需要两端配合

  1. 服务工程侧——引入单体调试桥接 starter,并改 dev 配置(端口、桥接开关、指向单机的 DB / Redis、关闭配置中心)。
  2. 单机侧——在"调试配置中心"开启该服务的转发(并确保后端总开关已打开)。

链路全景与配置文件细节见 dev-forward 断点调试

要点一:引入单体调试桥接 starter

服务工程aggregate-tomcat/pom.xml 中增加依赖:

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 覆盖:

yaml
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.portservicecomb.rest.address 的端口必须相同(这里都是 8085),否则 dev-forward 反代过来的请求会落到错误端口。

jdbc.properties(指向单机内嵌库)

让本地服务实例连单机主进程的内嵌 MariaDB(33306):

properties
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

properties
redis.host=localhost
redis.port=61379
redis.pass=123456
spring.redis.host=localhost
spring.redis.port=61379
spring.redis.password=123456

恢复连开发环境

调试结束、要切回团队公共开发环境时,把上面三处改回去即可:apollo.bootstrap.enabled 改回 trueapollo.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 的完整启动参数与共享数据层注意事项)。
三、代码开发 › (3) dev-forward 断点调试

dev-forward 断点调试

dev-forward(开发态服务转发)允许开发者在 IDEA 中以原生断点调试某个平台微服务(如 metagateway),同时单体实例继续正常服务其余所有接口,无需重打整包、无需重启主进程。

前置条件

已按 IDEA 配置与运行 完成 IDEA 导入和卫星实例运行配置。

概念

dev-forward 开发态服务转发 · 调试链路

前端 → 单体主实例 :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

然后以 DebugRun 模式启动主实例,等待控制台输出启动完成标志。

第 2 步:配置转发目标

转发配置存储在发行包根目录下的 config/dev-forward.json 文件(与 application.yml 同级)。

方式 A — 直接编辑配置文件(需重启主实例生效)

在 dist 根目录的 config/dev-forward.json 中,将目标服务的 debug 设为 trueurl 填入本机卫星地址。文件不存在时视为空列表(不转发任何请求)。

json
[
  {
    "pdCode": "meta",
    "pdName": "元数据服务",
    "debug": true,
    "url": "http://localhost:8090"
  }
]

字段说明

字段 类型 说明
pdCode string,必填 服务编码,必须等于 urlRouter.xml 中对应路由的 microServiceName(如 metagateway
pdName string,可选 显示名称,仅用于标识,不参与路由匹配
debug boolean,必填 true = 转发到 urlfalse = 记录保留但不转发
url string,debug=true 时必填 本机卫星实例地址,含协议和端口,如 http://localhost:8090

方式 B — 调用 REST 接口(立即热加载,无需重启)

主实例启动后,可通过保存接口对单个服务的配置进行新增或更新,接口自动将变更写入 config/dev-forward.json立即重新加载转发缓存,无需重启主实例。

接口需要平台登录态(Bearer token),路径前缀为 /je/**,未登录返回 401。

查看当前配置:

bash
curl -H "Authorization: <token>" http://localhost:8080/je/dev-forward/list

新增或更新某服务的转发配置:

bash
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=trueurl 为空,返回 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 接口(立即生效,无需重启):

bash
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.jsondebug 改为 false,然后重启主实例生效。

配置项参考

standalone-boot/src/main/resources/application.yml 中可调整以下参数:

yaml
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 中为每个服务配置一条记录,各自指向对应端口:

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)不可用。

排查

  1. 确认主实例已启动且控制台出现启动完成标志。
  2. 检查主实例日志是否含 EmbeddedMariaDB startedEmbeddedRedis started
  3. 用 MySQL 客户端验证:mysql -h localhost -P 33306 -u root -pbt5

Q2:配置后请求仍然到主实例,没有转发

排查

  1. 主实例 VM options 是否包含 -Djecloud.standalone.dev-forward.enabled=true
  2. 检查 config/dev-forward.json 是否存在且内容正确:
    • pdCode 是否与 urlRouter.xml 中对应路由的 microServiceName 完全一致(区分大小写)。
    • debug 字段是否为 true(布尔值,非字符串)。
    • url 字段是否填写正确(含协议,如 http://localhost:8090)。
  3. 若直接编辑了文件,需重启主实例(或调用一次 POST /je/dev-forward/save 触发热加载)。
  4. 在主实例日志中搜索 [dev-forward] 关键字查看转发决策日志。

Q3:卫星启动报错 "port 7010 in use"

原因7010 端口已被主实例 Connector Netty 服务占用。

说明run-mode=app 下卫星会自动跳过 Connector 初始化,正常情况不会绑定 7010。若仍报错,检查是否有第三方进程占用:

powershell
netstat -ano | findstr :7010

找到占用进程 PID 后,在任务管理器中结束该进程,或修改主实例 connector 端口。


Q4:收到 502 Bad Gateway

原因:卫星未启动或端口不匹配。

排查

  1. 确认卫星已启动:curl http://localhost:8090/actuator/health(期望返回 {"status":"UP"})。
  2. 确认 config/dev-forward.json 中对应服务的 url 端口与卫星启动端口一致。
  3. 提升卫星日志级别辅助排查:
    yaml
    logging:
      level:
        com.je.standalone.dev.forward: DEBUG

Q5:修改了卫星源码,需要重启吗

需要。卫星不支持热重载。修改源码后:

  1. IDEA 自动编译(或 Build → Compile)。
  2. 在 Debug 面板点击 Restart(或 Ctrl+F5 / Shift+F10)。

继续阅读 业务插件开发与打包 了解如何开发业务插件;或回到 IDEA 配置与运行 查看卫星 Run Configuration 详情。

三、代码开发 › (4) 平台基础组件与工具类

平台基础组件与工具类

它在二次开发中的位置

本章属于代码开发板块,聚焦后端基础组件与工具类。在写业务插件或挂平台功能事件时,很多通用能力(CRUD、查询、字典、用户 / 组织、文件等)平台已经封装好,直接复用即可,不要重复造轮子。本章帮你建立「先找平台已有组件」的意识。

前端通用组件与请求封装不在本章——请看前端组件与工具

本章目标

读完本章,你应当能够:

  • 知道灵象在二次开发中可复用的后端基础组件与工具类有哪些大类。
  • 在动手写代码前,先判断「平台是否已经提供了对应能力」,避免重复实现。

要点提纲

后端基础组件与工具类

下面按能力大类列出常见的可复用方向(具体类名 / 方法签名以平台为准,见各小节「待补」):

能力大类 用途 备注
通用 CRUD 对资源表数据做增删改查,免写重复样板 通常基于平台元数据
查询封装 构造条件、分页、排序的查询对象 与通用查询接口配合
字典工具 读取 / 翻译数据字典项
用户 / 组织工具 取当前登录用户、所属组织、权限等
文件工具 上传 / 下载 / 读取附件 document 服务相关
其他通用工具 日期、字符串、JSON、ID 生成等

待补

上表每一类的具体类名、所在包、关键方法签名、最小用法示例均待补。请对照平台实际提供的工具类填写,严禁编造类名 / 方法名。补充时建议每类给:类全名 + 1~2 个常用方法 + 一段示例。

通用 CRUD

待补

平台通用 CRUD 入口(基类 / 服务 / Mapper 约定)待补,并给出「新增一条 / 按主键查询 / 更新 / 删除」的最小示例。

查询封装

待补

查询条件对象的构造方式、分页 / 排序参数、与前端通用查询接口的对应关系待补。

字典 / 用户 / 组织 / 文件工具

待补

分别补充字典工具、当前用户 / 组织工具、文件工具的类名与常用方法。其中文件工具涉及 document 服务,注意单机版文件存储位置(参见多节点集群中关于文件只存主节点的说明)。

使用建议

  • 先查后写:动手前先确认平台是否已有对应工具,优先复用。
  • 遵守红线:复用平台组件不等于可以改平台源码,二次开发约束见代码开发总览的「三条红线」。
  • 依赖范围:在业务插件里引用平台依赖时用 provided,原因见业务插件开发与打包

待补

  • [ ] 补充后端通用 CRUD 的入口与最小示例。
  • [ ] 补充查询封装对象的构造与分页 / 排序用法。
  • [ ] 补充字典工具类名与常用方法。
  • [ ] 补充用户 / 组织工具类名与常用方法(取当前用户、组织、权限)。
  • [ ] 补充文件工具类名与上传 / 下载 / 读取示例。
  • [ ] 补充其他通用工具(日期 / 字符串 / JSON / ID 生成等)清单。

前端内容请看这里

前端通用组件、统一请求封装(Ajax 与接口调用)等前端二次开发内容已统一收口到前端组件与工具

三、代码开发 › (5) 定时任务(XXL-Job)

定时任务(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)。脚本会自动完成以下顺序:

  1. 启动单体(Tomcat 8080 + 内嵌 MariaDB 33306 + 内嵌 Redis 61379)。
  2. 单体启动过程中,SqlBootstrapRunner 在内嵌 MariaDB 上建立 jecloud-job 库。
  3. 后台脚本每隔 5 秒轮询 http://localhost:8080/actuator/health,直到单体返回 "status":"UP"
  4. 单体就绪后,拉起调度中心 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 上的进程,调度中心随之停止。

详细的启停说明见 启停与健康检查


登录调度中心

  1. 浏览器访问 http://127.0.0.1:3060

  2. 使用默认账号登录:

    字段
    用户名 admin
    密码 123456

建议首次登录后修改密码

登录后进入右上角用户管理,将默认密码修改为强密码。


新增 / 启停任务

  1. 在调度中心左侧菜单,进入任务管理,选择执行器分组。

  2. 点击新增,填写以下关键字段:

    字段 说明
    执行器 选择 jecloud-standalone-executor
    JobHandler 填写单体内 @XxlJob("…") 注解括号里的名称,大小写须完全一致
    Cron 标准 cron 表达式,如 0 0 2 * * ? 表示每天凌晨 2 点
  3. 保存后点击任务右侧的启动按钮,任务即按计划触发。

内置的 4 个平台 Handler

Handler 名称 所属服务 默认 cron 默认状态
staffStatisticHandler rbac */5 * * * * ?(每 5 秒) 默认禁用,需手动启用
calendarServiceTask meta 0 * * * * ?(每分钟) 默认启用
cleanCodeGenerator meta 0 0 0 * * ?(每天零点) 默认启用
earlyWarningJobHandler workflow 按需配置 按需启用

迁移生产任务配置

如果已有生产 XXL-Job 任务配置(xxl_job_groupxxl_job_info 等),可以直接导入。

第一步:从生产数据库导出

bash
mysqldump -u <用户> -p <生产库> xxl_job_group xxl_job_info > exported-jobs.sql

第二步:导入单体内嵌 MariaDB

bash
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/

也可以直接更新数据库:

sql
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 中添加:

yaml
jecloud:
  standalone:
    xxl-job:
      enabled: false

关闭后,单体不再监听 9999 端口,调度中心的所有回调请求均会 Connection Refused。


常见问题

Q1:调度中心显示执行器"离线"

排查步骤:

  1. 确认单体已正常启动,日志中应出现 >>>>>>>>>>> xxl-job registry success
  2. 检查执行器端口 9999 是否被占用或被防火墙拦截:
    • Windows:netstat -ano | findstr :9999
    • Linux/macOS:lsof -i :9999
  3. 进入调度中心执行器管理,确认分组的在线机器地址为 127.0.0.1:9999(含结尾斜杠)。
  4. 检查 config/jecloud-job.properties 中的 xxl.job.accessTokenconfig/application.yml 中的 jecloud.standalone.xxl-job.access-token 是否一致(默认均为空,不配置即可)。

Q2:调度中心启动报 Unknown database 'jecloud-job'

原因:单体尚未完成启动,jecloud-job 数据库还未创建。

解决:使用 scripts\start.bat 统一启动,让脚本等待单体就绪后再拉起调度中心。

如果需要手动启动调度中心,先确认单体已完全就绪:

bash
mysql -h 127.0.0.1 -P 33306 -u root -pbt5 -e "SHOW DATABASES;"

确认 jecloud-job 出现在列表中后,再运行:

bash
java -Xms128m -Xmx512m -jar job/jecloud-job-admin.jar \
  --spring.config.additional-location=optional:file:./config/jecloud-job.properties

Q3:端口 3060 被占用,调度中心无法启动

Windows:

bat
netstat -ano | findstr :3060
taskkill /F /PID <pid>

Linux/macOS:

bash
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 中更换执行器端口:

yaml
jecloud:
  standalone:
    xxl-job:
      executor-port: 9998

同步在调度中心执行器管理页将分组地址改为 http://127.0.0.1:9998/

Q5:任务触发后无执行日志 / 无回调

排查步骤:

  1. 查看调度中心日志 logs/job-admin.out,确认是否有 Routing LocalFirst failed 等错误。
  2. 确认单体日志中有 >>>>>>>>>>> xxl-job registry success
  3. 在调度中心执行器管理 → 对应分组 → 在线机器列表应显示 127.0.0.1:9999,若为空则执行器未注册成功,参考 Q1 排查。

配置参考

执行器配置(config/application.yml

yaml
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

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,否则调度中心无法连接数据库。详见 配置说明


相关链接

三、代码开发 › (6) 数据库使用规则

数据库使用规则

本章说明灵象的物理数据库布局、业务表路由机制、建表约束和 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_managePRODUCT_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_IDSY_PRODUCT_CODESY_TENANT_IDSY_CREATEORGIDSY_CREATEUSERIDSY_CREATETIME 等审计列)。通过平台建表 UI 操作会自动补全;手写 SQL 时须手动添加。

字符集

所有表必须使用 utf8mb4

sql
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 表中。即使如此,升级文件本身也必须写成幂等的,以防历史记录丢失时重跑不出错:

sql
-- 不幂等(重跑报错)
ALTER TABLE CRM_ORDER ADD COLUMN STATUS VARCHAR(20);

-- 幂等写法
ALTER TABLE CRM_ORDER ADD COLUMN IF NOT EXISTS STATUS VARCHAR(20);
sql
-- 不幂等
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 TABLEDELETE。需要废弃一张表时,先重命名:

sql
RENAME TABLE old_table TO old_table_DEPRECATED_20260615;

等三个版本(约半年)确认无人使用再 DROP

禁止启用 jecloud-workflow-service 的 databaseSchemaUpdate=true

40-workflow.sql 已经完整建好了 Activiti 的 ACT_* 系列表。如果在 application.yml 或配置文件中将 jecloud-workflow-servicedatabaseSchemaUpdate 设为 true,Activiti 会在启动时尝试重建这些表,破坏已有的 ACT_* 数据结构,导致工作流功能不可用。这个配置项必须保持关闭(false 或不填)。

深度参考

三、代码开发 › (7) 业务插件开发与打包

业务插件开发与打包

本章面向需要在灵象底座上开发自定义 Java 业务逻辑的开发者,介绍插件目录结构、manifest 规范、安装方法和类加载顺序。

推荐先读

IDEA 配置与运行 — 建立好 IDEA 开发环境后,本章的"安装/更新"流程才能跑通。

插件目录

灵象发行包根目录下的 plugins/ 文件夹称为插件根目录,其中每个子目录是一个桶(bucket)

plugins/
├── system/      ← 平台 8 个服务 jar(出厂随包,不要手动改动)
├── business/    ← 客户二开 jar(出厂为空,你的插件放这里)
└── <其他>/      ← 自定义桶,字母序加载(高级用法)

加载顺序(固定):

  1. plugins/system/ — 平台 8 个微服务,最先加载
  2. plugins/business/ — 客户业务插件,次之
  3. 其余子目录,按目录名字母序依次加载

不支持热插拔

插件加载发生在 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 示例:

yaml
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 提供:

xml
<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

构建:

bash
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 的 LaunchedURLClassLoaderPluginLoader.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 复写失效。

深度参考

三、代码开发 › 3、微应用开发

微应用开发

入口

微应用 是基于 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 指向私服:

bash
npm config set registry http://verdaccio.jecloud.net/

工程结构:

├─.vscode   # vscode 配置
├─build     # webpack 与 git hooks
├─docs      # 文档
├─service   # 系统文件(不要修改)
├─public    # 静态资源
└─src       # 源码

service 目录请勿改动

service 是骨架的系统文件目录,由脚手架维护,手动修改会在升级骨架时被覆盖或导致构建异常。你的业务代码应只写在 src 下。

② 安装依赖

按是否需要调试基础库源码,分两种安装方式。

非源码用户(只用骨架,不改基础库):

bash
npm run setup:lib

源码 / 调试用户(需要本地联调 jecloud-pc-libs):

先在基础库工程里发布本地包,再回到微应用工程安装:

bash
# 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 dev 启动后的本地预览效果。

④ 挂载到平台

开发完成后,把 npm run build 的产物挂载到平台:在 开发 › 核心引擎 › 微应用管理 中添加该微应用并完成注册。

微应用管理 · 注册微应用

开发 › 核心引擎 › 微应用管理:注册并挂载自研微应用的入口界面。

待补

npm run build 产物挂载 / 注册到平台的精确字段与操作步骤(如应用编码、入口地址、上传方式等)骨架 README 未文档化,待对照平台实际界面补全。完整流程可参考主仓库:https://gitee.com/ketr/jecloud.git

三、代码开发 › 4、平台功能事件

平台功能事件

它在二次开发中的位置

在平台 开发 › 平台帮助 › 脚本模板 里,可以给平台组件(表格、表单、按钮、各类字段等)挂 JS 事件脚本,实现列表渲染、字段联动、保存前校验等自定义行为。功能事件介于纯低代码配置业务插件开发之间——很多定制需求不必新建插件,挂一个功能事件脚本即可。

脚本模板 · 事件列表

脚本模板按适用组件分组列出全部功能事件,左侧选组件、右侧看事件清单与脚本编辑区。

一、事件脚本写法(方法体)

事件脚本写的是方法体:从全局 EventOptions 解构出当前事件的上下文对象,按事件语义处理逻辑或 return 渲染内容。下面是平台真实示例(list-row-renderer 列表行渲染事件):

js
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 等的多为异步事件,其脚本可执行异步逻辑(如发请求后再决定后续行为)。可在系统 开发 › 平台帮助 › 脚本模板 按组件浏览并编辑脚本,请勿凭空编造事件名或上下文字段

三、代码开发 › 5、前端组件与工具

前端组件与工具

它在二次开发中的位置

前端二次开发用到的全局 API,都可在 开发 › 平台帮助 › 平台前台API 查阅——那是一棵树形目录,每个方法都附带说明与代码案例。这些方法在平台功能事件的事件脚本里可直接使用。

平台前台API 树分四个顶层类目:JE(全局静态类与 Vue 能力)、EventOptions(事件上下文对象)、实例对象常用案例。本页重点列出 JE 类目。

平台前台API · 全局方法树

平台前台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

平台还提供 onBeforeUpdateonBeforeUnmount 等其余 Vue 生命周期钩子,完整可在系统树中浏览。

ajax 数据请求

JE.ajax(options) 是统一的请求封装,参数:url / params / headers / method(默认 POST) / timeout(默认 300000) / token(默认 true) / baseURL;返回 Promise。下面是平台真实示例:

js
// 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$gridrow 等。它是功能事件脚本的入参,承载当前功能、表格、行数据等上下文,详见平台功能事件
  • 实例对象:表单、表格、按钮等运行时实例的可调用对象,提供取值、刷新、校验等实例级操作。
  • 常用案例:按场景整理的可复制代码案例,覆盖事件脚本中的高频写法。

TIP

以上为 JE 类目全部全局方法;各方法的完整参数与返回结构,以及 EventOptions / 实例对象 / 常用案例 的代码案例,可在系统 开发 › 平台帮助 › 平台前台API 逐项查看。

四、部署集成

四、部署集成 › (1) Windows 部署

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)或文件资源管理器中双击运行:

bat
scripts\start.bat

start.bat 做的事

  1. 端口预检 — 检查 8080 / 7010 / 33306 / 61379 是否空闲;任一占用则立即报错退出
  2. 清理残留端口 — 如有上次未正常退出的残留进程,强制清理
  3. 启动内嵌 MariaDB(端口 33306)及 SQL bootstrap(建库/建表/写初始数据)
  4. 启动内嵌 Redis(端口 61379)
  5. 启动 Spring 应用(Tomcat 8080 + Netty WebSocket 7010)
  6. 后台拉起 job-admin — 等待主程序 /actuator/health 返回 UP 后自动启动调度中心(3060)

Java 运行时选择顺序

脚本按以下优先级选择 JVM,无需手动安装 Java(-full 包已内置):

  1. jdk\bin\java.exe(发行包内置 JDK,优先)
  2. jre\bin\java.exe(发行包内置 JRE)
  3. 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/*

此顺序是架构约束,不能调整(见 产品内核 · 插件化架构)。

分量启动(按需)

开发或排查问题时,可单独启动各组件:

仅启动数据库

bat
scripts\start-mysql.bat
  • 运行模式:run-mode=mysql
  • 堆:-Xms64m -Xmx256m
  • 该窗口即是数据库进程,关闭窗口等同于停止 MariaDB

仅启动 Redis

bat
scripts\start-redis.bat
  • 运行模式:run-mode=redis
  • 堆:-Xms32m -Xmx128m

仅启动应用(需 DB / Redis 已运行)

bat
scripts\start-app.bat
  • 运行模式:run-mode=app
  • 堆:-Xms2048m -Xmx4096m
  • 适合只改了代码需重启应用的场景:DB/Redis 保持运行,仅重启应用进程,避免重新初始化数据库

调试模式(IDEA 远程调试)

bat
scripts\start-debug.bat

start.bat 相同,额外追加:

-agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=*:5005

默认调试端口 5005;可通过环境变量 DEBUG_PORT 覆盖:

bat
set DEBUG_PORT=5006
scripts\start-debug.bat

在 IDEA 中新建 Remote JVM Debug 配置,Host localhost,Port 5005(或自定义端口),连接后即可设置断点。

停止

bat
scripts\stop.bat

停止流程:

  1. POST /actuator/shutdown 优雅关闭应用
  2. 等待 5 秒
  3. 两轮端口清扫(pass2 使用 Stop-Process -Force

清扫端口范围:8080(应用)、7010(WebSocket)、33306(MariaDB)、61379(Redis)、3060(job-admin)。端口值优先级:命令行参数 → config/application.yml → 内置默认值。

首次启动提示与登录

首次启动时请参阅 安装与首次启动 · 总览 中的「首次启动若缺授权证书」和「启动完成后」两节,了解:

  • LicenseGate 证书检查面板及处理步骤
  • StartupBanner 启动完成信息框(访问地址、登录账号、数据库凭据)
  • 健康检查地址 http://localhost:8080/actuator/health

配置项说明请参阅 配置说明。遇到启动失败、端口冲突等问题,请查阅 常见问题与排错

四、部署集成 › (2) Linux 部署

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、无空格、无符号链接的目录,例如:

bash
tar -xzf jecloud-linxiang-3.1.1-linux-x86_64.tar.gz -C /opt
cd /opt/jecloud-linxiang

路径要求

  • 路径只能包含英文字母、数字和常见符号(- _ /
  • 路径各级目录名不能含中文、空格
  • 安装目录不能是符号链接

原因:内嵌 MariaDB 在初始化时会把路径传给 mysqld 子进程,路径含有非 ASCII 字符或空格时,InnoDB 无法正常启动。

第二步:赋予执行权限

bash
chmod +x scripts/*.sh

第三步:启动

bash
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 做的事

  1. 运行幂等前置 — install-jre-bundle / install-mariadb-bundle
  2. 端口预检 — 检查 8080 / 7010 / 33306 / 61379 是否空闲;任一占用则立即报错退出
  3. 启动内嵌 MariaDB(端口 33306)及 SQL bootstrap(建库/建表/写初始数据)
  4. 启动内嵌 Redis(端口 61379)
  5. 启动 Spring 应用(Tomcat 8080 + Netty WebSocket 7010)
  6. 后台拉起 job-admin — 等待主程序 /actuator/health 返回 UP 后自动启动调度中心(3060)

Java 运行时选择顺序

脚本按以下优先级选择 JVM:

  1. ./jdk/bin/java(发行包内置 JDK,优先)
  2. ./jre/bin/java(发行包内置 JRE)
  3. 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
bash scripts/stop.sh

停止流程:

  1. curl -X POST http://localhost:8080/actuator/shutdown 优雅关闭应用
  2. sleep 3 秒
  3. 杀主进程 + job-admin 进程
  4. lsof 清理残留端口(8080 / 7010 / 33306 / 61379 / 3060)

集群从节点(可选)

多节点部署时,从节点使用 start-node.sh 启动(仅运行应用,连接主节点的共享 DB/Redis):

bash
bash scripts/start-node.sh

默认主节点 IP 为 10.0.0.1MAIN_HOST 变量),根据实际情况修改:

bash
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

配置项说明请参阅 配置说明。遇到启动失败、端口冲突等问题,请查阅 常见问题与排错

四、部署集成 › (3) macOS 部署

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、无空格、无符号链接的目录,例如:

bash
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 等原生库无法启动。

首次启动前,须在终端执行一次清除操作:

bash
cd ~/work/jecloud-linxiang        # 进入解压目录
sudo xattr -cr .                  # 清除隔离标记(每份包仅需一次)
bash ./scripts/start.sh           # 或双击 start.command

清除后即可直接双击 start.command 启动,无需每次执行

进阶修复(清理后仍失败时)

若执行 sudo xattr -cr . 后仍然报"损坏"或 mysqld 无法启动,请尝试重签名原生库并重置数据目录:

bash
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

bash
find mariadb/macos-x86_64 -type f \( -perm -111 -o -name '*.dylib' \) -exec codesign --force --sign - {} \; 2>/dev/null

第三步:启动

bash
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 做的事

  1. 运行幂等前置 — install-jre-bundle / install-mariadb-bundle
  2. 端口预检 — 检查 8080 / 7010 / 33306 / 61379 是否空闲;任一占用则立即报错退出
  3. 启动内嵌 MariaDB(端口 33306)及 SQL bootstrap(建库/建表/写初始数据)
  4. 启动内嵌 Redis(端口 61379)
  5. 启动 Spring 应用(Tomcat 8080 + Netty WebSocket 7010)
  6. 后台拉起 job-admin — 等待主程序 /actuator/health 返回 UP 后自动启动调度中心(3060)

平台共 8 个启动阶段,控制台会依次打印 [1/8][8/8] 进度提示。首次约需 60–90 秒

Java 运行时选择顺序

脚本按以下优先级选择 JVM:

  1. ./jdk/bin/java(发行包内置 JDK,优先)
  2. ./jre/bin/java(发行包内置 JRE)
  3. 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
bash scripts/stop.sh

停止流程:

  1. curl -X POST http://localhost:8080/actuator/shutdown 优雅关闭应用
  2. sleep 3 秒
  3. 杀主进程 + job-admin 进程
  4. lsof 清理残留端口(8080 / 7010 / 33306 / 61379 / 3060)

首次启动提示与登录

首次启动时请参阅 安装与首次启动 · 总览 中的「首次启动若缺授权证书」和「启动完成后」两节,了解:

  • LicenseGate 证书检查面板及处理步骤
  • StartupBanner 启动完成信息框(访问地址、登录账号、数据库凭据)
  • 健康检查地址 http://localhost:8080/actuator/health

配置项说明请参阅 配置说明。遇到启动失败、端口冲突等问题,请查阅 常见问题与排错

四、部署集成 › (4) 配置说明

配置说明

配置在哪

所有运行时配置只需修改一个文件:

<发行包根>/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.ymlserver.port
7010 WebSocket(connector) jar 内 instant.conf(需提取覆盖)
33306 内嵌 MariaDB config/application.ymljecloud.standalone.embedded-db.port
61379 内嵌 Redis config/application.ymljecloud.standalone.embedded-redis.port
3060 调度中心(XXL-Job admin) config/jecloud-job.propertiesserver.port
9999 调度执行器(XXL-Job executor) config/application.ymljecloud.standalone.xxl-job.executor-port

改端口须同步三处(8080 / 7010 / 33306 / 61379)

StandaloneApplication 启动期、config/application.ymlinstant.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.propertiesserver.port)和 config/application.ymljecloud.standalone.xxl-job.admin-addresses)。
  • 9999(执行器):需同步修改 config/application.ymljecloud.standalone.xxl-job.executor-port)。

DB / Redis 凭据

所有数据库和缓存凭据统一在一处配置config/application.yml

默认值:

yaml
spring:
  datasource:
    username: root        # 内嵌 MariaDB 固定使用 root 账号
    password: bt5         # 数据库密码(默认 bt5)
  redis:
    password: 123456      # Redis 密码(默认 123456)
  • 主节点:首次启动时程序用这份凭据初始化内嵌 MariaDB(创建 localhost / 127.0.0.1 / % 三个 host 的 root 账号并设置密码),同时设置 Redis requirepass,并灌入全量基础数据。运行时平台服务也使用同一份凭据连接。
  • 从节点 / 外部库:在同一份 yml 设置 jecloud.standalone.shared-host 为主节点 IP,username / password 填目标库凭据,run-mode=app 不初始化库、直接连接。

改密码必须重新初始化数据库

密码在首次初始化时写入 data/mysql/(MariaDB 内部用户表)。直接修改 yml 后重启无效,旧密码仍生效。

正确的改密码流程:

  1. 停服:scripts\stop.bat
  2. 删除数据目录:del /S /Q data\mysql\(Windows)或 rm -rf data/mysql/(Linux/macOS)
  3. 修改 config/application.yml 中的密码
  4. 启动: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 层面完全独立。

相关文档


安全提示

使用非默认密码时,请注意以下几点:

  1. 凭据明文写入 Apollo 缓存:启动期程序会把 spring.datasource.*spring.redis.* 等凭据以明文写入 apollo-cache/jecloud-standalone/config-cache/*.properties(平台服务通过该文件读取连接信息)。该目录权限等同本机文件,请确保 dist 安装目录只有受信任的用户可访问,并将该目录排除出备份/同步范围,避免明文外泄。

  2. 灌库阶段密码短暂可见SqlBootstrapRunner 调用 mysql 命令行客户端时,密码以 --password= 参数传入。在子进程存活的短暂窗口内,密码可被本机 ps 命令或任务管理器看到。单机本地部署可接受;多用户共享主机请注意。

  3. 调度中心密码单独配置:调度中心(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。详见 多节点集群与负载均衡

相关链接

四、部署集成 › 2、负载均衡(多节点集群)

多节点集群与负载均衡

架构概述

JECloud AI 灵象支持横向扩展为"1 主节点 + N 从节点 + nginx 轮询"架构,分摊高并发请求。

多节点集群与负载均衡 · 轮询拓扑

角色 启动脚本 职责
主节点(×1) scripts\start.batrun-mode=all 起内嵌 MariaDB(33306) + 内嵌 Redis(61379) + 应用(8080) + WebSocket(7010) + 定时任务;存储文件
从节点(×N) scripts\start-node.batrun-mode=app 连接主节点共享 MariaDB / Redis;不起 DB / Redis,不存文件,不跑定时任务;本机起应用(8080) + WebSocket(7010)
nginx(×1) scripts\start-nginx.bat / start-nginx.sh 反向代理轮询全部节点;文件流量(document)固定转发主节点

登录态无需会话粘滞:身份验证基于 token + 共享 Redis,任意节点都能验证,nginx 轮询不需要 sticky session。


部署步骤

第一步:启动主节点

在主节点机器上正常执行:

bat
scripts\start.bat

主节点就绪后,放开防火墙,允许所有从节点访问:

  • 端口 33306(MariaDB)
  • 端口 61379(Redis)

内网隔离

33306 和 61379 仅应对从节点所在子网开放,切勿暴露到公网。详见下方已知限制中的安全说明。

第二步:配置并启动从节点

在每台从节点机器上:

  1. 解压同一份发行包。

  2. Windows:用文本编辑器打开 scripts\start-node.bat,将顶部的 MAIN_HOST 改为主节点 IP:

    bat
    set "MAIN_HOST=<主节点IP>"
  3. Linux/macOS:编辑 scripts/start-node.sh 顶部的 MAIN_HOST

    bash
    MAIN_HOST=<主节点IP>

    或以环境变量方式传入:

    bash
    MAIN_HOST=<主节点IP> bash scripts/start-node.sh
  4. 运行脚本:

    bat
    scripts\start-node.bat

    从节点不会初始化 data/mysql/,也不会监听 33306 / 61379。

第三步:配置并启动 nginx

准备 nginx 二进制:

  • Windows:发行包已内置 nginx/nginx.exe,无需安装。
  • Linux:sudo apt install nginxsudo yum install nginx
  • macOS:brew install nginx

脚本检测到 nginx/ 目录下有二进制时优先使用,否则使用系统 PATH 中的 nginx。

编辑 nginx/conf/nginx.conf,修改三个 upstream:

nginx
# 文件流量 —— 只填主节点
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:

bat
scripts\start-nginx.bat

Linux/macOS:

bash
bash scripts/start-nginx.sh

启动后,浏览器通过 nginx 80 端口访问平台。

停止 nginx:

bat
scripts\stop-nginx.bat

验证

部署完成后,执行以下检查确认集群正常工作:

  1. 轮询不掉线:反复刷新页面或在不同标签页操作,登录态始终稳定,不出现需要重新登录的情况。
  2. 跨节点推送:在一个节点发起操作(如审批、消息),目标用户无论连接到哪个节点都能收到实时推送(待办/通知)。
  3. 文件上传下载:从任意节点上传文件,通过任意节点均可正常下载/预览(document 服务流量恒落主节点)。
  4. 定时任务只跑一份:确认定时任务仅在主节点执行(从节点 jecloud.standalone.xxl-job.enabled=false),不重复触发。

已知限制

  1. 文件吞吐瓶颈:所有文件存储在主节点磁盘。文件上传下载量较大时,主节点磁盘 I/O 和带宽是瓶颈。如有需要,可后续接入共享存储或对象存储。

  2. 主节点负载偏重:主节点同时承担数据层(MariaDB / Redis)、文件存储和定时任务。通过 nginx 将大部分 HTTP 流量引到从节点(weight=3)可以减轻主节点的应用层压力。

  3. 从节点本地临时文件:少数导出/预览功能可能在处理请求的节点本地生成临时文件;若该节点不是主节点,跨节点拉取时可能找不到该文件(边缘场景)。

  4. 主节点单点:主节点宕机则整个集群不可用(本版本不提供主节点高可用,HA 列入后续路线图)。

  5. 安全:主节点的 33306 / 61379 端口需对从节点子网开放,务必置于可信内网并配合防火墙隔离,切勿暴露到公网。


相关链接

四、部署集成 › 3、备份与恢复

备份与恢复

定期备份可以在磁盘损坏、误操作或升级失败后快速恢复现场。本文说明需要备份哪些目录、如何执行冷备份与热备份,以及如何完整恢复。


要备份什么

目录 重要性 说明
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/ 这四个目录。


冷备份流程(推荐)

冷备份在停服状态下进行,数据一致性最强,是推荐方案。

步骤

  1. 停服(确保 MariaDB 数据文件完整落盘):

    bat
    scripts\stop.bat
  2. 复制关键目录到备份位置。

    Windows(xcopy):

    bat
    xcopy /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\config

    Linux / macOS(tar):

    bash
    tar czf backup-$(date +%Y%m%d%H%M%S).tgz data files license config
  3. 重新启动

    bat
    scripts\start.bat

建议频率

业务数据每天冷备份一次;重大操作(升级、大批量导入)前必须备份。


恢复流程

  1. 停服

    bat
    scripts\stop.bat
  2. 用备份覆盖对应目录(整体替换,不要合并):

    Windows:

    bat
    rmdir /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  config

    Linux / macOS:

    bash
    rm -rf data/mysql
    tar xzf backup-20240601120000.tgz
  3. 启动

    bat
    scripts\start.bat

恢复密码一致性

data/mysql/ 里存储的是 MariaDB 内部用户表,密码在首次初始化时写入数据库。如果备份时的 config/application.yml 与当前的 config/application.yml 数据库密码(spring.datasource.password,默认 bt5)不一致,恢复后应用将无法连接数据库。

解决方法:恢复 data/mysql/ 时,同步恢复对应的 config/application.yml,确保密码与数据库一致。

不建议跨密码恢复;如果必须切换密码,需停服后删除 data/mysql/ 让系统重新初始化(所有数据将丢失)。详见 配置说明


不停机热备(进阶)

如果业务不能中断,可以用 mysqldump 对运行中的内嵌 MariaDB 做逻辑热备。热备的一致性弱于冷备(备份期间仍有写入时,多表间可能存在短暂不一致),适合作为冷备的补充。

bash
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 与密码之间不加空格)。

恢复时:

bash
mysql -h 127.0.0.1 -P 33306 -u root -p<密码> jecloud < backup-jecloud-20240601.sql

热备局限

热备只备份数据库内容,不包含 files/license/config/ 等目录。生产环境建议配合冷备一起使用。


相关链接

四、部署集成 › 4、数据清理与方案整理

数据清理与方案整理

操作不可逆,务必二次确认

以下两个清理操作会永久删除数据,请一定在确认后再点击,并建议先备份(见 备份与恢复)。

清理方案有两种方式:直接在平台界面点按钮(界面操作,推荐日常使用),或调用本机 REST 端点(命令行方式,适合脚本化/批量)。两者最终落到同一套后端逻辑。

界面操作

入口

进入 开发 › 服务管理 › 方案类服务管理,点击 business(业务服务)这条数据进入其表单,表单顶部工具栏有两个红色按钮:

方案类服务管理 · 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 预览,确认清单无误后再去掉参数真正执行。

bash
# 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 端点:

bash
# 预览将清空的业务内容(保留骨架;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 参数解析规则:true1yeson(大小写不敏感)均视为仅预览;缺省或 false真执行;非法值(如 tureok)返回 HTTP 400 且不会执行任何操作。


返回结构

两个端点均返回统一 JSON 格式,data.steps[] 逐步列出统计与执行结果:

json
{
  "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 类型表追加 rootPreservedtrue = 已保留 ROOT 根节点),executedtrue执行过程的逐步进度通过控制台 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 == truedata.hasFailures == true 操作执行了但至少一步 failed,逐步看 data.steps[].statuserrors

推荐 bash + jq 判定写法(以真执行为例):

bash
# 真执行 = 缺省、不带 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 "清理完成"

完整调用示例

bash
# 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 物理数据表,执行后无法撤销

执行前务必完成以下步骤:

  1. 停止应用:scripts\stop.bat
  2. 冷拷贝 data/ 目录到安全位置(详见 备份与恢复
  3. 重启应用,再执行清理

常见问题

"仅允许清理方案类服务"
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/ 目录,重启后系统会从零重建全新数据库(包含基线数据)。注意:此操作同时清空所有方案及平台数据,不可恢复。


相关链接

四、部署集成 › (1) 增强组件总览(全部)

增强组件(增强套件)

增强组件是 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 的流程管理套件通过梳理和优化业务流程,减少冗余步骤,精确识别流程中的关键环节,确保每个环节都能高效运转。它包含七大核心功能

  1. 流程监控:实时跟踪流程执行情况,保障业务流程顺畅流转与持续优化。
  2. 运行时流程:含【流程调拨】和【前后跳转】,可灵活调整业务流程与步骤执行顺序,实现资源高效配置与任务动态分配。
  3. 运行时规划:已发起的流程不满足当前业务需求时,可在不影响其他规划的前提下,单独对该流程做出规划调整。
  4. 历史流程:记录与分析过去操作为优化决策提供依据,并可将已结束流程重新启动。
  5. 异常流程:流程提交或执行发生异常时,管理员能清晰定位异常数据并调整。
  6. 运行时流程交接:人员工作变动时,可将其待办一键交给他人,实现责任动态转移。
  7. 未来处理人交接:人员变动时统一调整流程规划中的处理人,避免手动逐条修改的遗漏。

业务全流程套件

业务流是一个公司的流程链——一项业务的几个流程的顺序,用于描述各部门、各人员之间的业务关系、作业顺序,以及整个业务的流程与走向。通过业务流,公司可对整体业务的推进进度、处理过程、时间节点及时把控,并及时发现并调整不合理的流向,保证效率。业务流图形样式支持自定义,可通过左侧元素库拖拽组合快速搭建流程,并对图形进行样式、状态、颜色等编辑。

手机套件

作为专业的企业级移动应用开发平台,JEAPP 提供各种在线的 App 开发工具,可快速开发出适配多平台(iOS、Android、H5、微信小程序)的移动应用,服务领域覆盖互联网、能源、电商、教育、金融、医疗、旅游等行业。典型场景:移动审批方便快捷、外出办公随时查看工作数据。

官方特殊说明:手机套件提供 2 次免费打包服务(支持安卓、iOS 打包);超过 2 次后按 1500 元/次收取打包服务费用。

运维套件

用于自动化运维基于 JECloud 平台开发出的软件项目,一键发布前后端代码包。

装载方式概述

增强组件通常有两种装法(具体以各组件交付说明为准):

  • 插件桶装载:把组件 jar 放到发行包 plugins/ 下对应的桶目录,再按 stop → 放入 → start 重启加载。插件桶的概念、加载顺序与「不支持热插拔」的约束见 业务插件开发与打包
  • 随升级包下发:部分组件(如升级套件)作为版本升级的一部分下发,配合 版本升级 流程一并安装。

以实际交付为准

各组件确切的装载目录、是否需要数据库 / 配置变更、验证方式以官方交付物为准。拿不准时一律按「待补」处理,不要臆测目录或步骤。

四、部署集成 › (2) 展示套件

展示套件

它属于哪里

本页属于增强套件。展示套件是可选装的能力包,不装也不影响平台核心使用。

官方定价:¥14000(标价仅供参考,以官方报价为准)。一句话:支持图表配置开发与综合门户设计

套件介绍(官方)

JECloud 的展示套件包含三个关键引擎

  1. 图表引擎——软件运行中产生的业务数据常需图形化分析展示,工程师可通过点选配置的方式开发出柱形图、条形图、饼图、线图、面积图、雷达图等常用图表。
  2. 报表引擎——可完成普通报表、交叉报表、查询报表等常见报表功能。
  3. 门户引擎——图表与报表开发完毕后,用门户引擎进行页面排版规划;门户除了可引入图表,还可嵌入功能数据、标准日历、超级链接、图片轮播等常用组件。当现有组件不足以支撑业务需求时,门户还提供插件机制,充分发挥工程师的创造力。

本章目标

读完本章,你应当能够:

  • 了解展示套件提供的能力——图表引擎 / 报表引擎 / 门户引擎三大展示类能力。
  • 知道如何获取、部署和验证展示套件。

待补

上述为官方能力概述。展示套件在单机版中的确切配置入口(图表 / 报表 / 门户的设计器在哪个菜单进入)以平台实际交付为准,请勿编造功能项。补充时建议逐条列:能力名 + 一句话说明 + 配置入口。

安装与部署步骤(提纲)

以下为通用流程提纲,确切目录与验证方式以套件实际交付物为准

  1. 获取套件:从平台 / 官方渠道获取展示套件交付物(通常为一个或多个 jar)。
  2. 放入插件桶:将套件 jar 放到发行包 plugins/ 下对应的桶目录。插件桶概念与加载顺序见业务插件开发与打包
  3. 重启加载:按 stop → 放入 → start 重启灵象(插件加载发生在启动期,不支持热插拔)。
  4. 验证:启动完成后,确认展示相关入口 / 菜单已出现并可正常使用。

待补

  • 套件确切的桶目录名(如 plugins/system / plugins/business / 自定义桶)待确认,拿不准就留待补。
  • 是否需要数据库变更 / 额外配置待补。
  • 验证清单(启动后看哪个菜单、访问哪个地址确认生效)待补。

待补

  • [ ] 补充展示套件的具体能力清单与配置入口。
  • [ ] 确认套件交付物形态(jar 数量 / 是否含前端资源)。
  • [ ] 确认安装目录(具体插件桶)与是否需数据库 / 配置变更。
  • [ ] 补充验证步骤(启动后如何确认生效)。
四、部署集成 › (3) 升级套件

升级套件

它属于哪里

本页属于增强套件。升级套件配合版本升级使用,与运维板块的版本升级流程紧密关联。

官方定价:¥4000(标价仅供参考,以官方报价为准)。一句话:支持各个项目之间的功能级迁移与升级

套件介绍(官方)

在软件项目开发过程中,研发团队通常需要建立多个环境(开发、测试、生产等)。功能模块在开发环境完成后,需要打包升级到测试环境,验证无误后再升级到生产环境。JECloud 的升级套件正是为简化这一流程而设计——它能自动化打包软件中的各种资源:

  • 物理表结构数据、功能配置数据、工作流配置数据
  • 菜单数据、字典数据、角色数据
  • 甚至业务数据

这些打包后的升级包可以轻松地在各个环境中安装和使用。

官方提示:如果项目只需要单一环境且要求不高,那么升级套件可能并不会带来太大的帮助。

与单机版内置升级的关系

单机版(灵象)已内置一套版本升级能力(保库升级、离线/在线、目标版本选择、自动/手动)。商业「升级套件」侧重跨环境、功能级的打包迁移,与内置升级互为补充,二者关系以实际交付为准。

本章目标

读完本章,你应当能够:

  • 了解升级套件的定位——跨环境、功能级的打包迁移升级能力包,通常随升级包下发
  • 知道如何获取、部署升级套件,以及它与版本升级流程的关系。

待补

上述为官方能力概述。升级套件在单机版中的确切交付与放置方式以平台实际交付为准,请勿编造

与版本升级的关系

升级套件不是独立运行的功能模块,而是版本升级流程的一部分。它一般随升级包一同下发,在执行升级时被一并应用。完整的升级操作(保库升级、离线 / 在线、目标版本选择、自动 / 手动)见版本升级

安装与部署步骤(提纲)

以下为通用流程提纲,确切步骤以升级包说明为准

  1. 获取套件:随版本升级包一同获取升级套件交付物。
  2. 随升级流程应用:按版本升级的步骤执行升级,套件在升级过程中被应用。
  3. 验证:升级完成、重启后确认目标版本生效、新增能力可用。

待补

  • 升级套件是否需要单独放置(如某个目录),还是完全内含于升级包,待确认。
  • 是否伴随数据库升级 / 配置变更待补(参考版本升级中的数据升级说明)。
  • 验证清单(升级后如何确认套件生效、版本号何时 stamp)待补。

待补

  • [ ] 补充升级套件的具体能力与定位(相对标准升级的增量)。
  • [ ] 确认套件交付与放置方式(内含于升级包 / 需单独放置)。
  • [ ] 补充是否伴随数据库 / 配置变更
  • [ ] 补充升级后的验证步骤
四、部署集成 › 6、启停与健康检查

启停与健康检查

启动脚本

发行包根目录下的 scripts/ 提供全量启停脚本。

Windows:start.bat

双击或在命令提示符中执行:

bat
scripts\start.bat

start.bat 按顺序完成以下动作:

  1. 端口预检:检查 8080 / 7010 / 33306 / 61379 是否被占用,任一端口冲突立即报错退出(避免启动到一半失败)。
  2. 启动内嵌 MariaDB(端口 33306):初始化数据目录 data/mysql/,首次启动自动建库。
  3. 建库 / 升级SqlBootstrapRunner):按顺序执行 sql/schema/sql/data/sql/upgrade/ 下的 SQL 文件,已执行过的脚本自动跳过(幂等)。必须在 Spring 启动前完成,因为平台服务的 @PostConstruct 会查询数据库。
  4. 启动内嵌 Redis(端口 61379)。
  5. 启动 Tomcat / Spring 应用(端口 8080,WebSocket 7010):加载 plugins/ 下全部平台服务 jar,初始化所有业务模块。
  6. 等待应用就绪后拉起调度中心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

bash
chmod +x scripts/start.sh
bash scripts/start.sh

start.shstart.bat 行为一致(全量启动 MariaDB + Redis + 应用 + 调度中心)。

内置 JRE(full 包)

full 发行包在 jre/ 目录内置了 OpenJDK 8,脚本会优先使用 jre/bin/java,无需本机预装 Java。


停止脚本

Windows:stop.bat

bat
scripts\stop.bat

stop.bat 依次执行:

  1. http://localhost:8080/actuator/shutdown 发送优雅关闭请求,等待约 8 秒。
  2. jps 找到 jeapp-standalone.jar<pid> 并执行 taskkill /F /T /PID <pid>(杀进程树)。
  3. 按进程名兜底扫描并终止残留的 mysqld.exe / redis-server.exe
  4. 检查 8080 / 7010 / 33306 / 61379 / 3060 各端口是否已释放,未释放则打印警告。

为什么要强杀?

MariaDB4j 启动的 mysqld 子进程和嵌入式 Redis 子进程与父 JVM 是分离的(detached),父 JVM 退出后它们仍然存活。残留的 mysqld 进程会持有 data/mysql/ibdata1 的文件锁,导致下次启动时 InnoDB 初始化失败;残留的 Redis 进程会占用 61379 端口,导致下次启动的端口预检失败。因此脚本必须主动扫描并终止这些子进程。

Linux / macOS:stop.sh

bash
bash scripts/stop.sh

同样会清理 8080 / 7010 / 33306 / 61379 / 3060 各端口上的进程。


健康检查

应用完全就绪后,可通过以下方式确认状态:

Actuator 接口

http://localhost:8080/actuator/health

返回示例(正常):

json
{"status":"UP"}

调度中心就绪后还可访问:

http://localhost:3060/xxl-job-admin/

默认账号 admin / 123456

端口自检命令

确认各端口是否已监听:

Windows(命令提示符):

bat
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:

bash
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 不可乱):

bat
java -cp "jeapp-standalone.jar;plugins/*;lib/*" com.je.standalone.StandaloneApplication
bash
java -cp "jeapp-standalone.jar:plugins/*:lib/*" com.je.standalone.StandaloneApplication

如需自定义 JVM 参数(堆大小、GC 策略等),修改 scripts/start.batscripts/start.sh 里的 JAVA_OPTS 变量即可,无需手写完整启动命令。

-Duser.home 不可省略

无论通过脚本还是手动调整 JVM 参数,-Duser.home 必须指向发行包根目录,license 加载器会从 ${user.home}/license/jecloud.license 读取证书。省略后 license 将从 OS 用户目录(C:\Users\<用户名>\)查找,导致证书缺失报错。详见 证书 / License 替换


相关链接

四、部署集成 › 7、常见问题与排错

常见问题与排错

本文汇总运维过程中最常见的问题,每条给出现象 → 原因 → 解决三段说明。遇到问题先翻本页,大多数情况可以在 10 分钟内定位。


端口被占用(启动 preflight 报错)

现象

启动时控制台打印类似:

[FATAL] 端口 8080 已被占用,请先释放该端口后再启动

或启动后访问页面无响应,netstat 看不到对应端口监听。

原因

灵象启动前会检查四个端口(8080 / 7010 / 33306 / 61379)是否被其他进程占用,任何一个被占就会拒绝启动(fail-fast 预检)。

解决

查找占用进程:

bat
:: Windows
netstat -ano | findstr :8080
:: 输出示例:TCP 0.0.0.0:8080 ... LISTENING 12345
:: 12345 即为 PID
bash
# Linux / macOS
lsof -i :8080

找到 PID 后终止进程:

bat
:: Windows
taskkill /F /PID `<pid>`
bash
# 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,脚本会尝试清理所有子进程:

bat
scripts\stop.bat

若仍有残留,手动强杀:

Windows(cmd):

bat
taskkill /F /IM mysqld.exe
taskkill /F /IM redis-server.exe

Windows(PowerShell):

powershell
Get-Process mysqld      | Stop-Process -Force
Get-Process redis-server | Stop-Process -Force

Linux / macOS:

bash
pkill -f mysqld
pkill -f redis-server

清理完毕后重新启动。


改密码后应用连不上数据库

现象

修改 config/application.yml 中的 spring.datasource.password 后重启,启动日志出现 Access denied for user 'root'@'...',应用无法启动。

原因

数据库密码在首次初始化时写入 MariaDB 内部用户表(data/mysql/)。修改配置文件中的密码不会同步修改数据库中已存储的密码,导致两者不一致。

解决

以下操作会丢失所有业务数据

必须先做好 备份 再继续。

  1. 停服:scripts\stop.bat
  2. 删除数据目录:rmdir /S /Q data\mysql(Windows)或 rm -rf data/mysql(Linux/macOS)
  3. 修改 config/application.yml 中的密码为新密码
  4. 启动: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 可访问)后,再单独重启调度中心:

bat
scripts\start-job-admin.bat

详细操作见 定时任务(XXL-Job)


前端白屏 / WebSocket 连不上

现象

  • 登录后页面白屏或一直转圈
  • 浏览器 F12 → 网络 → WS 选项卡,看到 /jesocket 连接失败((failed) 或一直 pending

原因

前端启动时从 JE_CORE_WEBSOCKETURL 读取 WebSocket 地址。若该值为空或指向错误地址(如 ws://localhost:7010 但从局域网内其他机器访问),连接必然失败,导致功能初始化卡住、页面白屏。

解决

第一步:确认 WebSocket 服务正常监听

bat
netstat -ano | findstr :7010
:: 应该看到 LISTENING 状态

第二步:检查 JE_CORE_WEBSOCKETURL 配置

sql
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,不存在乱码风险。

若控制台仍有乱码,可执行:

bat
chcp 65001

切换 cmd 为 UTF-8 编码页(可能导致部分旧工具显示异常,仅建议调试时使用)。


Redis health 指标显示 DOWN

现象

访问 http://localhost:8080/actuator/health 或健康检查端点,redis 状态显示 DOWN

json
{
  "redis": {
    "status": "DOWN",
    "details": {
      "error": "Cannot read Redis info; ...Malformed \\uxxxx encoding."
    }
  }
}

原因

这是已知的误报(假阳性)。内嵌 Redis(codemonstur fork)的 INFO 命令返回的字节串包含特殊字符,Spring Boot Redis 健康指标解析失败,误报 DOWN。实际 Redis 工作完全正常,业务不受影响。

解决

业务无影响时忽略即可。如需消除误报,在 config/application.yml 中添加:

yaml
management:
  health:
    redis:
      enabled: false

重启后健康端点不再检查 Redis 状态。


SQL 日志(排障用)

灵象默认不输出 SQL(零开销);报错的 SQL 始终输出logs/error.log,无需任何配置。需要查看成功 SQL 时,编辑部署包根目录的 config/logback.xml(注意:不是 config/application.yml),改完 60 秒内热生效,不用重启

打开全部 SQL 输出

找到以下行,将 OFF 改为 INFO,保存即可:

xml
<!-- 默认关闭 -->
<logger name="com.je.standalone.sql" level="OFF"/>

<!-- 改为打开 -->
<logger name="com.je.standalone.sql" level="INFO"/>

成功 SQL 会打印到控制台 + logs/standalone.log,含展开参数后的完整 SQL、影响行数、耗时。排障完记得改回 OFF

全开,但排除某些高频服务(如推送、连接器)

xml
<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)

xml
<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/             调度任务执行日志

搜索关键字:ExceptionERRORCaused byFailed

五、授权证书

五、授权证书 › 授权证书(申请 / 安装)

授权证书

灵象采用证书授权:首次启动会校验 license/jecloud.license。本页讲证书申请证书安装两件事。

证书申请

首次启动若 license/jecloud.license 缺失,平台会在启动早期(MariaDB 启动之前)打印引导面板并以 exit code 2 退出:

╔════════════════════════════════════════════════════════════════════╗
║ [!] 未检测到授权证书,系统无法启动                              ║
║ license\jecloud.license 不存在。                                   ║
║ 首次使用请到官网在线申请授权证书:                              ║
║     https://jecloud.net/download                                   ║
║ 申请后将 jecloud.license 放入 license\ 目录,重新运行 start.bat 即可。
╚════════════════════════════════════════════════════════════════════╝

申请步骤:

  1. 访问 https://jecloud.net/download 在线申请授权证书(按提示提供客户单位、账号上限等信息)
  2. 拿到官方签发的 license 文件包(通常是 zip,含 jecloud.license + 插件 key)
  3. 按下文 证书安装 将文件放入发行包根的 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)后,按以下步骤替换:

bat
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.jarjecloud-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 未正确指向发行包根目录。

排查步骤:

  1. 确认 license/jecloud.license 文件存在:
    bat
    dir license\jecloud.license
  2. 确认 start.bat(或直接运行时的命令)中含有 -Duser.home="%CD%"(Windows)或 -Duser.home="$(pwd)"(Linux/macOS)。
  3. 确认从发行包根目录启动%CD% 必须是发行包根,不能从子目录运行 start.bat)。
  4. 重启后查看 logs/spring.log,搜索 license 关键字确认加载结果。

更多证书错误的排查,请参见 常见问题与排错

其他常见错误

错误信息 原因 处理
您的授权证书已过期!请联系我们! jecloud.license 过期 联系 JECloud 商务申请续期
您的账号数已超过证书授权限制! 数据库账号数超过 license 上限 清理冗余账号或扩容 license
解密异常! license 文件损坏或版本不匹配 重新下载 license 文件
授权证书文件或文件夹不存在! 插件 key 文件不全 重新完整解压 license 文件包

相关链接

六、规则规范

六、规则规范 › 1、规范总览

规则规范总览

这套规范写给谁

本栏目面向使用 JECloud 灵象做二次开发的客户。如果你正在用低代码引擎搭建资源表、功能、字典、菜单,或者要让多人协作交付一套业务方案,这里的命名与配置约定能让你的产物可维护、可协作、可复用

为什么需要这套规范

灵象平台是配置驱动的:业务能力不是写死在代码里,而是落在四类元数据上——

  • 资源表(数据底座:表、字段、键、索引)
  • 功能(业务页面:列表、表单、按钮、子功能、数据权限)
  • 字典(可复用的枚举 / 编码)
  • 菜单(前端导航入口与授权)

平台前端按这些元数据实时渲染界面、按命名约定自动联动(如字段配了字典就自动出下拉框、双字段自动回填)。因此元数据的命名是否规范、结构是否一致,直接决定了:

  1. 产物能不能被别人接手维护(命名混乱 = 没人敢动);
  2. 跨表 / 跨功能能不能正确引用(命名不对齐 = 前端绑不上数据);
  3. 同一套方案能不能多人分工同时交付(约定不统一 = 合并冲突 / 引用断裂)。

本栏目讲的是约定与规范(怎么命名、怎么取类型、怎么组织层级);具体的界面操作步骤(在哪点哪个按钮)见 低代码总览。两者配合使用。

本栏目导航

篇目 讲什么
编码与命名通用约定 三段式编码骨架、跨模块核心表省前缀、常用英文保留清单、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, 300100, 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

怎么用这套规范

  • 建表 / 建功能 / 建字典 / 建菜单前,先读对应篇目,按规则推断命名与配置,再在界面里落地。
  • 遇到对照例子(标注 ✅ 正确 / ❌ 错误)时,重点看错误例子——那些都是真实踩过的坑。
  • 规范没覆盖的边角,按业务常识处理;本栏目标注 待补 的位置是平台细节尚未沉淀的部分,可先按现有约定走。
六、规则规范 › 2、命名与编码约定

编码与命名通用约定

本篇是命名规范的"地基"——资源表、功能、字典、菜单的编码都从这套约定派生。先读这篇,再读各专项篇目。

编码字符集(机器约束)

所有元数据编码(表编码、字段编码、字典编码、功能编码等)统一遵循:

  • 只能用 大写字母、数字、下划线
  • 必须以字母开头(正则 ^[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_REASONYDYY),但下列常用通用词保留英文,不硬改简拼:

类别 保留词
标识 / 编码 _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, 300100, 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…),便于后期插入——这是菜单导航的传统步长,与上面表格里"元数据对象集连续整数"是两套场景。详见 菜单设计规范 · 排序

六、规则规范 › 3、资源表设计规范

资源表设计规范

资源表是整个应用的数据底座。本篇规定表编码、表类型、字段命名与类型、系统字段、键与索引、字典关联字段的约定。操作步骤见 资源表

一、表编码命名

遵循 编码与命名通用约定 的三段式骨架 <系统前缀>_<模块前缀>_<业务名>,跨模块核心表省模块前缀(两段式 OM_KH)。本节只补充表特有的命名场景。

子表命名

场景 规则
多子表(不同业务面) 用业务含义命名 OM_XM(项目)→ OM_XM_USER(成员)/ OM_XM_PLAN(计划)
单子表 + 明细行语义 MX 拼主表末段(无下划线 OM_LEAVEOM_LEAVEMXDEMO_CGGL_CGDDDEMO_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 ✅。
  • 是否型字段:中文含"是否/启用/禁用/发布/有效/可用"→ 一律走系统字典 YESORNO1=是 / 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(二进制)

不允许的写法

  • 自创 typeCodeVARCHAR20 / FLOAT3 等不在清单内(用 form B 或升档)。
  • 整数变体INT / INTEGER / LONG / BIGINT → 一律 NUMBER
  • 布尔变体BOOLEAN / BOOL / BITYESORNO
  • 不定长自由文本走 VARCHAR + 大 LENGTH:备注 / 描述 / 公式应该用 CLOB

可空性与唯一性都不在表层硬约束

业务字段一律 ISNULL=1、UNIQUE=0

除系统主键 <TABLE>_ID 外,所有业务字段的可空标记一律设"可空"、唯一标记一律设"不唯一",与字段的中文"必填 / 唯一"语义无关。

  • 真正的"必填"放在功能表单层(字段的 RESOURCEFIELD_REQUIRE),见 功能设计规范 · 表单字段
  • 真正的"唯一"唯一索引uk_ 索引,见本篇第七节)。

原因:表层 DDL 硬约束会让数据迁移被拦、让同一字段在不同功能里无法分场景表达必填、让多功能复用失效。

五、系统字段组

系统字段(SY_ 开头)由平台自动派生,建表时不要手动声明,业务侧只消费、不修改。按需添加这几组:

何时加 关键字段
基础组(所有表必加) 自动 <TABLECODE>_ID(主键)、SY_STATUSSY_ORDERINDEXSY_CREATEUSERID/NAMESY_CREATETIME、登记部门
修改信息组(建议加) 业务单据 / 主数据表 SY_MODIFYUSERID/NAMESY_MODIFYTIME、修改人部门
公司 / 集团 / 机构 / 租户组 多租户 / 多公司架构 SY_COMPANY_ID/NAMESY_GROUP_COMPANY_*SY_ORG_IDSY_TENANT_*
树形组(仅 TREE 表) 自动 SY_PARENTSY_NODETYPESY_LAYERSY_PATHSY_TREEORDERINDEX 等 + 派生的 <前缀>_TEXT / <前缀>_CODE
扩展组(按需) 用户明示"预留扩展位" SY_EXTEND01 ~ SY_EXTEND10
工作流组(勾选审核时) 自动 SY_ACKFLAGSY_AUDFLAGSY_PIIDSY_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 字段写字典关联配置。任一处不对齐,前端就绑不上字典。详见 字典设计规范

表层配好字典关联后,建功能时平台会自动派生到表单字段(设为下拉框 + 填好关联配置),功能层无需重复传。

六、规则规范 › 4、功能设计规范

功能设计规范

功能把资源表包装成可访问的业务页面(列表 + 表单 + 按钮 + 子功能)。本篇规定功能命名、功能树层级、本体配置、列字段、表单字段、按钮、子功能、数据权限的约定。操作步骤见 功能配置

一、功能命名

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 条硬约束

  1. 字典双字段:列上显示 _CODE(居中),隐藏 _NAME(与表单相反——列表常需 grep / 排序编码)。
  2. 人员 / 部门 / 外键双字段:列上显示 _NAME,隐藏 _ID(用户看人名 / 单据名)。
  3. SY_ORDERINDEX 连续 1, 2, 3, 4,跨多表头 + 普通列统一全局序号,不留间隔。
  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 复杂权限

待补

平台数据权限的具体配置字段名、各业务场景的默认推断、跨功能继承(主子表 / 关联功能)规则尚未在规则源中沉淀完整。当前实践:创建功能阶段默认"公开",后续在界面上单独配置数据权限。待补内容:真实数据权限字段名与样例、各场景默认推断、与流程审批的协调。

六、规则规范 › 5、字典设计规范

字典设计规范

字典集中维护可复用的枚举 / 编码,供多个字段引用,改一处全局生效。本篇规定字典编码、字典类型、字典项、联建与复用、所属模块的约定。操作步骤见 数据字典

一、字典编码

字典编码三段式,第一段必须是产品 / 系统服务编码大写

<系统服务名>_<业务领域>_<语义>
示例字典 解析
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 / FMALE / FEMALE;是 / 否 → 复用 YESORNO 字典;中文专有名词(如民族)→ 拼音首字母(HZ 汉族 / HUIZ 回族)。

字典项排序

SY_ORDERINDEX1 开始的自然顺序,不留间隔(不要用 100 / 200 / 300)。高频选项排前,状态按生命周期顺序(草稿 → 提交 → 审批中 → 通过 / 驳回)。

树形字典按 DFS 全局连续编号

LIST 字典直接按数组顺序 1, 2, 3 … NTREE 字典按深度优先遍历从 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 决定数据落库位置。

六、规则规范 › 6、菜单设计规范

菜单设计规范

菜单把功能挂到前端导航树,是用户可见的入口。本篇规定菜单命名、节点类型、图标默认值、层级、_MODULE 后缀、排序的约定。操作步骤见 菜单配置

一、菜单命名

叶子菜单

字段 默认值
MENU_MENUNAME 与功能名一致(功能名)
MENU_CODE 可省;若填则 = funcCode_MENU(如 OM_RSGL_LEAVE_MENU
MENU_NODEINFO 绑定实体的 code(功能 → funcCode;字典 → 字典编码)
MENU_NODEINFOTYPE 节点类型(见第二节)

文件夹 / 模块菜单

字段 默认值
MENU_MENUNAME 中文模块名(如"人事管理")
MENU_CODE 中文拼音简拼大写(如 RSGL
MENU_NODEINFOTYPE MENU

二、节点类型与层级

菜单树用节点类型区分用途,用父节点区分位置:

树形位置 父节点 节点类型 说明
L1 根模块 ROOT MENU 业务大模块容器,同时需挂顶部菜单
L2…N-1 中间菜单 父节点 MENU 中间分组文件夹,可嵌套多层
L 叶子 父菜单 9 种之一(见下) 末端节点,绑功能 / 字典 / 图表等

L1 与 L2 都用 MENU

L1 根模块和 L2+ 中间菜单的节点类型都是 MENU;区分 L1 / L2 靠父节点ROOT vs 父节点 PK),不是靠类型。平台菜单类型字典里没有 MOUDLE / MODULE 这个值——历史文档曾写 MOUDLE,是错的。

9 种节点类型(叶子用):

typeCode 用途 必填 MENU_NODEINFO
MENU 模块层(L1 + 中间文件夹) 否(容器不绑实体)
MT 功能(绝大多数业务用这个) 是(功能 funcCode)
DIC 字典维护页 是(字典编码)
IDDT 插件页 是(插件 code)
CHART 图表页 是(图表 code)
REPORT 报表页 是(报表 code)
PORTAL 门户首页 是(门户 code)
URL 外部链接 是(http(s)😕/ URL)
IFRAME iframe 嵌入 是(iframe src)

不要自创节点类型

节点类型只认这 9 个。自创 FOLDER / GROUP / PAGE / MODULE 都是错的。叶子是 MT 时必须同时填 MENU_NODEINFO(绑的功能 code),字典维护页用专门的 DIC 类型 + 字典编码(不是用 MT)。

三、菜单图标默认值

图标默认 fal fa-poll-h,严禁臆造

所有 9 种节点类型的菜单图标一律默认 fal fa-poll-h严禁自由发挥jeicon jeicon-grid / fal fa-book / jeicon jeicon-report / fal fa-link 等其他图标。平台前端图标库对未注册的 class 渲染异常——自由发挥的图标实际显示不出来(空白 / 404)。fal fa-poll-h 是平台内部兜底图标,渲染正常。用户明示要换才覆盖。

对象 默认图标
菜单模块 / 叶子菜单 fal fa-poll-h
功能模块 / 叶子功能 fal fa-poll-h
顶部菜单 jeicon jeicon-work1
资源表 jeicon jeicon-table

四、默认 3 层结构

用户口语只给业务实体(如"采购订单")时,默认按 3 层结构推,不要机械只建 2 层:

ROOT
└── <业务大类> (L1, MENU, SY_PARENT=ROOT, 关联顶部菜单)
    └── <业务子模块> (L2, MENU)
        └── <实体菜单> (L 叶子, MT/DIC/..., 绑功能/字典)
层级 取名 code 命名风格
L1 业务大类 采购业务 / 党建管理 <MOD>_MM<MOD>_MODULE
L2 业务子模块 订单管理 / 党员事务 <MOD>_<SUB>_MM
L 叶子 实体菜单 采购订单 / 党员档案 <SYS>_<MOD>_<ENTITY>_MENU

为什么默认 3 层:L2 子模块是"业务功能分组容器",预留未来扩展叶子的空间(采购业务 → 订单管理 → 未来可加销售订单 / 退货订单),比一级菜单展开十几个叶子更直观。

何时降级 2 层

只有用户明示"扁平挂 L1 下 / 不要 L2 / 菜单尽量简单",或业务确实单叶子且明确无扩展规划时,才直接 L1 → 叶子(仍保留 L1 大类容器)。默认严禁省 L2——只看到一个"采购订单"就推 采购管理 → 采购订单 两层是反例,应推三层 采购业务 → 订单管理 → 采购订单,即使本次只建 1 个叶子。

五、模块菜单与 _MODULE 后缀

模块根菜单(挂顶部菜单的顶层文件夹)可用 _MODULE 结尾命名:

模块 MENU_CODE
人事管理 OM_RSGL_MODULE
统计报表 OM_TJBB_MODULE
系统管理 OM_XTGL_MODULE

菜单树最深 5 层(含顶部菜单),叶子必须是绑实体的类型(MT / DIC 等)。

注:_MM(如 CGGL_MM)和 _MODULE 都是模块菜单的命名风格,按项目历史习惯沿用其一即可。

六、L1 模块的两步收尾

L1 根模块(父节点 = ROOT)建完后,必须做两件事才"建完整",否则用户在导航里看不到:

  1. 挂接顶部菜单——L1 模块要关联到某个顶部菜单(提供 TOPMENU_NAME 即可,反查不到会自动新建),否则顶部导航栏看不到入口。
  2. 授权——新建的菜单 / 菜单模块默认无任何角色权限,必须一键授权给默认开发者角色,否则登录用户在左侧导航看不到(即便菜单树里能查到)。

大函数自动收尾

用标准建模块 / 建菜单流程时,挂接顶部菜单 + 授权会自动级联完成,配置者无需手动操作。只有走非标准路径(直接拼底层接口 / 数据导入)才需要手动补关联 + 授权。

七、排序

叶子菜单 / 文件夹菜单的 SY_ORDERINDEX10 递增(10、20、30…),便于后期插入。

这是菜单导航的传统步长。注意与其他元数据对象集(字段 / 列 / 字典项等)的"连续整数 1, 2, 3"不同——那些场景见 编码与命名通用约定。同一顶部菜单下多个 L1 模块的相对顺序也用排序号控制。

八、父菜单定位

父菜单 ID 必须从平台真实菜单树取

父菜单的 ID 必须从平台真实菜单树查取,不能臆造。给定中文路径(如"运维管理 / 人事管理")时,沿层级在菜单树里逐级查找拿到节点 ID 作为父节点。路径分隔符支持 />

找不到父菜单时:顶层找不到 → 询问是否建模块菜单;二级找不到 → 询问是否在已有顶层下建文件夹菜单;多个同名 → 让用户选具体一个。

六、规则规范 › 7、测试数据规范

测试数据生成规范

建好资源表与功能后,常需要生成一批测试 / 演示数据来验证页面。本篇规定字段值生成策略、行内一致性、占位符、平台主数据只读的约定。

一、字段值 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=ANNUALLV_TYPE_NAME=病假 的错配——这会让前端下拉框显示错乱。

落盘前对每行自检:JSON 合法、双字段配对、数值范围合理、必填字段非空。自检失败重产那一行(最多 3 次),不要让错误行进库。

四、占位符与拓扑序

同一批同时建主子表时,子表数据引用主表 PK 用占位符:

{parent_pk.<主表TABLECODE>.<行索引>}

例(子表数据引用主表第 0、1、2 行):

jsonl
{"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 到浅度(用户可能不知道数据点不开)。

六、规则规范 › 8、文档产出规范

文档产出规范

建表 / 建功能时同步产出说明文档(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 模板的字段表列定义与示例
  • [ ] 小贴士 / 业务说明段的产出策略
六、规则规范 › 9、交付与协作规范

交付与协作规范

一套业务方案往往由多人分工、分批次交付。本篇规定落盘组织、跨对象引用、清单文件、失败恢复、提交署名的约定,保证产物可追溯、可协作。

一、整项目落盘归一(单 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 的约定,按各团队的工程规范执行。本篇只给与方案落盘交付直接相关的约定。

自包含原则

本栏目所有规范篇目自包含——使用灵象做二次开发时,只需读本栏目相关篇目即可完整工作,不依赖外部规范文档。

七、版本发布

七、版本发布 › 1、版本升级

版本升级

分工说明

脚本 职责
scripts\start.bat 只保证三库存在:首次启动时初始化合并基线,正常重启不触发任何升级逻辑
scripts\upgrade.bat 对运行中应用触发升级:SQL 增量 + 附件同步 + 平台升级包装载 + 程序文件覆盖;完成后提示重启

升级前应用必须已启动并通过健康检查;程序文件覆盖(阶段 1.5)是在线完成,被 JVM 锁定的 jar 会列入手动清单,需停服后手动替换再重启。

版本升级流程


操作步骤

第一步:备份

停止应用前,整目录冷拷贝以下三个目录:

  • data/ — 内嵌 MariaDB 数据文件与版本记录
  • files/ — 平台附件文件
  • config/ — 本机定制配置

备份建议

将整个发行包目录打包一份存到其他磁盘。升级失败时可直接恢复(见末尾 回滚)。
详细备份流程见 备份与恢复


第二步:覆盖程序文件与脚本(三条红线)

将新版发行包内容覆盖到当前目录时,必须遵守以下三条红线:

三条绝不可违反的红线

  1. 绝不覆盖 data/mysql/ — 直接覆盖会损坏正在使用的 InnoDB 数据文件,导致数据库无法启动。
  2. files/ 只做合并拷贝(只增/同名覆盖,不先删后拷) — 现有附件文件不能被删除。
  3. 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/ 层,否则依赖升级落空。


第四步:启动应用并等待就绪

bat
scripts\start.bat

等待控制台输出 [OK] 或通过健康检查:

bat
curl http://127.0.0.1:8080/actuator/health

返回 "status":"UP" 后再执行下一步。


第五步:运行 upgrade.bat

bat
upgrade.bat

脚本会弹出三段交互式选择:


三段交互式选择

选择一:来源

[1] 离线(资源已在 upgrade/<版本>/ 目录下)
[2] 在线(本期未实现)

在线升级本期未开放

[2] 会提示"在线升级本期未实现,请使用离线方式"。请选 [1] 并确保升级资源已放到对应目录。


选择二:目标版本

留空 = 应用所有高于当前已安装版本的版本(按版本号升序逐个应用)
指定版本号 = 只应用到该版本为止(含该版本)

例:当前已安装 3.1.0upgrade/ 下有 3.1.13.1.2

  • 留空 → 依次应用 3.1.13.1.2
  • 3.1.1 → 只应用 3.1.13.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/*.jarplugins/business/*.jar 等 — 已加载的插件 jar
  • job/jecloud-job-admin.jar — 调度中心进程(端口 3060)正在占用

这些文件会出现在返回 JSON 的 manual 清单中(字段 needManual: true),格式示例:

json
{
  "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"
    }
  ]
}

处理流程:

  1. 停止应用:

    bat
    scripts\stop.bat
  2. manual 里每一项,将 from 拷贝到 to

    bat
    copy /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.jar

    Linux/macOS:

    bash
    cp 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
  3. 重启应用:

    bat
    scripts\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 访问。

回滚
阶段一未内置自动回滚。使用第一步冷拷贝的备份手动恢复:

  1. 停止应用:scripts\stop.bat
  2. 删除或覆盖 data/files/config/(从备份目录还原)
  3. 还原程序文件(jeapp-standalone.jarlib/plugins/web/job/ 等)
  4. 重启:scripts\start.bat

相关链接

七、版本发布 › 2、发布记录

发布记录

灵象的版本升级方式见 版本升级upgrade.bat 三段式离线升级 + 程序文件覆盖)。

版本历史

持续维护

完整版本变更日志陆续补充;当前发行版本号见发行包根目录 VERSION 文件,已安装版本见 data/INSTALLED_VERSION

版本 说明
3.1.x 平台 8 服务合并单进程、内嵌 MariaDB/Redis、薄启动器分层 dist、增量升级、多节点集群等

升级前请先 备份;升级流程与被锁 jar 手动替换详见 版本升级

八、场景案例

八、场景案例 › 1、场景案例总览

场景案例

本栏目用「按场景看一个真实模块」的方式,带你理解灵象能搭出什么、以及它是怎么搭出来的。

平台内置了一套完整的业务样板(销售、项目管理、合同、产品、客户成功等),可直接作为二次开发的参考。登录后从顶部 工作 进入即可体验。

案例清单

序号 案例 包含模块 入口
1 销售CRM 网站运营 / 产品管理 / 销售管理 / 合同管理 销售CRM
2 项目PM 效率工具 / 项目管理 / 客户成功 项目PM
3 待定 进销存 / OA / MES 等行业场景陆续补充

怎么"搭"出来

想了解这些模块的搭建方法,对照 平台配置 › 低代码总览 的八步主线:资源表 → 数据字典 → 功能 → 功能列表 → 表单 → 子功能 → 菜单 → 授权。

计划中的行业场景

案例陆续补充

以下典型场景案例正在整理(含截图与分步):

  • 进销存(库存 / 出入库 / 供应商)
  • OA 审批(请假 / 报销 / 用印)
  • 生产报工 MES(工单 / 报工 / 质检)
八、场景案例 › 2、销售CRM

销售CRM

平台内置的「销售 CRM」是一套完整的客户关系管理业务样板,由 网站运营、产品管理、销售管理、合同管理 四个业务模块组成,可作为二次开发的参考。登录后从顶部 工作 进入对应模块。

业务架构

销售 CRM · 业务架构

销售 CRM 的四个模块与全部功能(菜单):客户管理为核心主功能(含子功能),其余为列表型功能。

工作展板

「工作展板」聚合了销售相关的统计看板(借款分布、招待费分布等,支持本周/本月/本季度切换):

工作展板 · 销售看板

一、网站运营

站点索引

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

网站运营 · 站点索引

页面热点

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

网站运营 · 页面热点

来源索引

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

网站运营 · 来源索引

站点访客

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

网站运营 · 站点访客

二、产品管理

产品管理

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

产品管理 · 产品列表

产品文档维护

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

产品管理 · 产品文档维护

产品文档查询

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

产品管理 · 产品文档查询

三、销售管理

「销售管理」是 CRM 的核心模块,客户管理为主功能。

客户管理(主功能)

客户管理维护客户主档,是销售业务的核心。列表视图——顶部检索 + 操作按钮(新建客户等),表体按列展示客户数据:

客户管理 · 列表

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

客户管理 · 详情表单与子功能页签

客户联系人

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

销售管理 · 客户联系人

销售商机

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

销售管理 · 销售商机

追踪计划

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

销售管理 · 追踪计划

重点工作

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

销售管理 · 重点工作

商机变更

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

销售管理 · 商机变更

四、合同管理

合同审核

提交合同走审批流程,审核通过后方可执行。

合同管理 · 合同审核

合同执行

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

合同管理 · 合同执行

开票申请

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

合同管理 · 开票申请

回款计划执行

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

合同管理 · 回款计划执行

回款登记

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

合同管理 · 回款登记

对照低代码主线

这套 CRM 的每个功能都是按 低代码总览 的八步搭出来的:资源表 → 数据字典 → 功能配置(列表+表单+子功能)→ 菜单配置 → 授权。

八、场景案例 › 3、项目PM

项目PM

平台内置的「项目 PM」覆盖从立项到执行、验收的全流程,由 效率工具、项目管理、客户成功 三个业务模块组成,可作为项目型业务二次开发的参考。登录后从顶部 工作 进入对应模块。

业务架构

项目 PM · 业务架构

项目 PM 的三个模块与全部功能(菜单):项目立项为核心主功能(含收益分配子表),其余为列表型功能。

一、效率工具

霁月清单

个人 / 团队的待办清单工具,集中管理日常工作事项。

效率工具 · 霁月清单

二、项目管理

「项目管理」是 PM 的核心模块,项目立项为主功能。

项目立项(主功能)

项目立项是 PM 的核心入口。列表视图——按列展示项目名称、项目编号、收益分配等信息,顶部提供检索与「项目立项」操作按钮:

项目立项 · 列表

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

项目立项 · 详情表单与收益分配子表

项目执行

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

项目管理 · 项目执行

收益分配执行

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

项目管理 · 收益分配执行

项目执行模板

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

项目管理 · 项目执行模板

需求收集

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

项目管理 · 需求收集

需求规格

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

项目管理 · 需求规格

任务单

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

项目管理 · 任务单

缺陷单

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

项目管理 · 缺陷单

项目验收申请

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

项目管理 · 项目验收申请

项目终止申请

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

项目管理 · 项目终止申请

收益分配数据

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

项目管理 · 收益分配数据

三、客户成功

客户团队

维护服务该客户的团队成员构成。

客户成功 · 客户团队

服务清单(客服)

从客服视角记录与跟踪客户服务事项。

客户成功 · 服务清单(客服)

服务清单(监控)

从监控视角跟踪服务 / 系统运行状况。

客户成功 · 服务清单(监控)

客户投诉

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

客户成功 · 客户投诉

对照低代码主线

PM 的每个功能同样按 低代码总览 的八步搭出:资源表(含主子表)→ 数据字典 → 功能配置(列表+表单+子功能)→ 菜单配置 → 授权。