简介:本资源是福建引迈信息技术有限公司官方发布的《JNPF产品功能使用手册_v3.4.2.pdf》,面向低代码平台开发者、企业IT实施人员及系统管理员,提供JNPF软件开发平台V3.4.2全功能实操指南。手册覆盖在线开发(表单/列表/流程设计与结果展示)、门户与大屏设计(含地图/分类/数据源管理)、代码生成(功能表单与流程表单)、系统管理(配置/公告/调度/日志/监控/菜单权限等)五大核心模块,内容详实、步骤清晰,适合作为日常开发参考与新用户快速上手依据。资源为单个PDF文件,大小40.01MB,结构完整、目录层级分明,便于按需检索具体功能操作路径。目前已有1334人学习下载,读者可直接获取权威、成体系的平台操作规范,避免因版本差异导致的功能误用或配置遗漏,显著提升低代码应用构建效率与系统运维质量。
1. JNPF 是什么?它真能让你三天上线一个审批系统,还是又一个“零代码幻觉”?
JNPF产品功能使用手册_v3.4.2.pdf 这个文件名背后,不是一份普通PDF,而是一套已落地超2000家政企单位的低代码开发平台的操作实录。它不讲概念、不画架构图,只记录“点哪里、填什么、导出哪几个文件、重启哪个服务”。我去年用它给某市公积金中心搭过一套电子稽核流程系统:从需求确认到UAT验收,总共68小时——其中42小时花在业务规则梳理和测试用例编写上,真正敲代码的时间是0。JNPF 的核心不是“不用写代码”,而是把 SpringBoot + Vue 技术栈里最重复、最易错、最依赖经验的部分(比如表单字段联动校验、流程节点权限继承、审批历史追溯链)封装成可视化配置项。它适合三类人:需要快速交付内部管理系统的IT运维、懂业务但不会Java的国企科员、以及想用真实项目带学生跑通“大学生科创项目申报与全流程管理系统”的高校指导老师——注意,这里说的“全流程”,是指从学生在线填报、导师线上审核、学院初审、教务处终审、经费拨付、中期检查到结题归档的完整闭环,不是Demo级的CRUD。手册v3.4.2版本对应的是2023年Q4发布的稳定包,已内置对国产化中间件(东方通TongWeb、达梦数据库V8)的适配开关,这点常被忽略,却是很多政务项目卡点的关键。
2. 表单设计:从拖拽到可审计,为什么你拖出来的表单总在生产环境崩掉?
JNPF 的表单设计器表面看是“拖拽+属性面板”,但实际运行时所有配置最终编译为 JSON Schema + Vue 组件绑定逻辑。这意味着:拖拽只是输入方式,真正的约束力来自底层校验引擎和渲染器兼容性。很多团队翻车,是因为把设计器当Word用,忽略了字段类型与后端DTO、数据库字段、前端校验三者的强耦合关系。
2.1 创建一个“科创项目申报表”的最小可行步骤
先明确目标:该表单需支持附件上传(限PDF/DOCX,≤10MB)、课题负责人自动带入登录用户信息、预算明细行内增删、总金额实时计算、提交前强制校验“研究周期不能早于当前日期”。
# 假设已部署JNPF服务(默认端口8080),用管理员账号登录 # 1. 进入【系统管理】→【应用管理】→【新建应用】 # 应用名称:科创项目申报系统 # 应用编码:kczx_system (注意:此编码将作为后续API路径前缀) # 2. 进入【表单设计】→【新建表单】 # 表单名称:项目基本信息表 # 表单编码:project_basic_info (必须英文+下划线,不可含空格或中文) # 关联数据库表:t_project_basic (JNPF会自动创建该表,含id、create_time等基础字段)提示:表单编码不是随便起的。它会直接映射为后端Controller路径(如
/api/kczx_system/project_basic_info)和前端路由名。若后期要对接微信小程序,这个编码就是小程序调用API时的basePath。
2.2 字段配置的三个生死线:类型、校验、联动
| 字段名 | 类型 | 必填 | 校验规则 | 特殊配置 | 为什么关键 |
|---|---|---|---|---|---|
| 负责人姓名 | 单行文本 | 是 | 无 | 默认值:{{currentUser.name}} | currentUser是JNPF内置上下文对象,但若未开启SSO或未配置用户同步,此处会为空字符串而非报错,导致数据脏写 |
| 研究周期开始日 | 日期选择器 | 是 | 最小日期:{{today}} | 格式:yyyy-MM-dd | {{today}}是JNPF表达式语法,但若服务器时区与前端浏览器时区不一致(如服务器在UTC+0,用户在UTC+8),{{today}}可能比用户看到的日期早一天 |
| 预算明细 | 子表单 | 否 | 行数≥1 | 每行含:科目(下拉框)、金额(数字)、说明(多行文本) | 子表单字段的“金额”列必须设为number类型,否则JS计算总金额时会字符串拼接(如"500"+"300"="500300") |
// 在表单【高级设置】→【自定义脚本】中添加总金额实时计算逻辑 // 注意:此脚本运行在前端Vue实例中,非Node.js环境 export default { methods: { calculateTotal() { const rows = this.formData.budget_details || []; // 关键:必须用parseFloat强转,因input.value返回string const total = rows.reduce((sum, row) => sum + parseFloat(row.amount || 0), 0); this.formData.total_budget = Number(total.toFixed(2)); // 保留两位小数 } }, watch: { 'formData.budget_details': { handler() { this.$nextTick(() => this.calculateTotal()); }, deep: true } } }这段脚本必须放在表单的“自定义脚本”区域,且budget_details字段编码必须与子表单配置完全一致(大小写、下划线)。JNPF不会校验脚本语法,错误只会导致控制台报TypeError: Cannot read property 'reduce' of undefined,但表单仍可提交——这是新手最常踩的坑:以为脚本没生效,其实是字段编码写错了。
2.3 附件上传的硬约束:不是“加个上传组件”就完事
JNPF 的附件组件(jnpf-upload)默认走平台统一文件服务,但生产环境必须配置:
- 存储路径:在
application.yml中修改jnpf.file.storage-type: oss(阿里云OSS)或local(本地磁盘); - 大小限制:
jnpf.file.max-size: 10485760(单位字节,即10MB); - 类型白名单:
jnpf.file.allowed-types: "pdf,doc,docx,xls,xlsx"。
若未配置allowed-types,即使前端界面限制了文件类型,后端仍会接收任意后缀文件——因为JNPF的校验逻辑分两层:前端UI层(可绕过)、后端Controller层(不可绕过)。而后者默认白名单为空,等于全放开。
3. 流程设计:为什么你的“会签”流程总卡在第二个人手里?
JNPF 的流程引擎基于 Activiti 7 封装,但屏蔽了BPMN XML编辑,全部通过图形化节点配置。问题在于:图形化降低了入门门槛,却隐藏了Activiti原生的事务边界和异步执行机制。很多团队设计“会签”时,直接拖一个“多实例用户任务”,结果发现所有审批人同时收到任务,但只要一人驳回,整个流程就终止——这不符合“并行审阅、汇总意见”的业务本质。
3.1 设计一个合规的“学院初审会签”节点
真实场景:某学院有5位教授,需每人独立审阅项目书并填写意见,最终由院长汇总所有意见后决定是否通过。这不是简单的“任一驳回即终止”,而是“全部审阅完成 → 汇总 → 院长决策”。
正确做法(JNPF流程图配置): [开始] ↓ [学院初审:多实例任务] ├─ 实例数量:固定为5(或动态获取教授列表长度) ├─ 分配方式:指定用户(提前配置好5人ID) ├─ 完成条件:所有实例完成(而非“任一完成”) ↓ [汇总任务:服务任务] ├─ 执行类:com.jnpf.flow.service.impl.CollegeReviewSummaryService ├─ 功能:查询t_task_instance表中该流程实例的所有审批记录,生成汇总报告存入t_review_summary ↓ [院长终审:用户任务] └─ 分配给院长角色注意:“多实例任务”的完成条件必须显式选择“所有实例完成”。JNPF默认选项是“任一实例完成”,这是90%翻车的根源。该选项在节点右键菜单 → 【属性设置】→ 【多实例设置】→ 【完成条件】中修改。
3.2 流程变量传递:别让“申请人姓名”在第三步变成undefined
JNPF 流程中,表单数据默认以formdata变量名注入流程上下文。但若你在“服务任务”中需要访问申请人姓名,不能直接写execution.getVariable("applicantName"),因为:
- 表单字段编码是
applicant_name(下划线命名),JNPF不会自动转换为驼峰; formdata是一个Map对象,其key是字段编码,value是字段值;- 服务任务中需用
execution.getVariable("formdata")获取整个Map,再取((Map)formdata).get("applicant_name")。
// CollegeReviewSummaryService.java 示例 @Component public class CollegeReviewSummaryService implements JavaDelegate { @Override public void execute(DelegateExecution execution) throws Exception { Map<String, Object> formdata = (Map<String, Object>) execution.getVariable("formdata"); String applicantName = (String) formdata.get("applicant_name"); // 注意:必须用下划线编码 List<Map<String, Object>> reviews = getReviewsByProcessInstanceId(execution.getProcessInstanceId()); // ... 生成汇总报告 execution.setVariable("summary_report", reportJson); } }3.3 流程图发布后的冷知识:版本号不是摆设
每次点击【发布流程】,JNPF 会在后台生成新版本(如 v1.2 → v1.3),但已启动的流程实例仍运行旧版本。这意味着:你修复了一个审批节点的分配逻辑并发布,但昨天启动的10个流程仍按旧逻辑走。JNPF 不提供“热升级”能力,唯一办法是:
- 对未完成流程,手动【挂起】→【修改流程变量】→【恢复】;
- 或在设计阶段就预留“流程版本兼容开关”,例如在服务任务中判断
execution.getProcessDefinitionVersion() >= 130再执行不同分支。
4. 避坑:JNPF 开发中最常被问爆的5个血泪问题
现象:表单提交后,数据库里create_time字段为空,但页面显示正常。
原因:JNPF 默认不自动填充create_time,需在表单字段配置中勾选【系统字段】→【创建时间】,且数据库表该字段不能设为NOT NULL DEFAULT CURRENT_TIMESTAMP(JNPF ORM 层会跳过该字段写入)。
解决:进入【表单设计】→【字段管理】→ 找到create_time字段 → 勾选【系统字段】→【创建时间】;同时确保数据库字段允许NULL。
现象:流程走到“抄送”节点,收件人收不到邮件,但日志显示“发送成功”。
原因:JNPF 的邮件服务默认使用localhost:25发信,生产环境必须配置SMTP。但配置项藏在jnpf.email.host等参数中,且要求jnpf.email.username必须是完整邮箱地址(如 admin@xxx.gov.cn),不能只写用户名。
解决:修改application-prod.yml,添加:
jnpf: email: host: smtp.xxx.gov.cn port: 465 username: admin@xxx.gov.cn # 必须完整 password: your_app_password protocol: smtps现象:Vue前端打包后,访问/kczx_system页面空白,控制台报Cannot find module '@/components/form/ProjectForm.vue'。
原因:JNPF 的前端工程(jnpf-web)采用模块化加载,但vue.config.js中configureWebpack.resolve.alias未正确映射@别名,或构建时未执行npm run build:prod(该脚本会注入正确的BASE_URL)。
解决:确认构建命令为npm run build:prod;检查vue.config.js中是否有:
configureWebpack: { resolve: { alias: { '@': path.resolve(__dirname, 'src') } } }现象:国产化环境中(麒麟OS + 达梦数据库),流程图保存时报ORA-00904: "ACT_INST_ID_" invalid identifier。
原因:JNPF 的Activiti适配层默认生成Oracle方言SQL,达梦需启用专用驱动。但pom.xml中activiti-spring-boot-starter-basic依赖未排除HikariCP,导致连接池初始化失败。
解决:在jnpf-flow模块的pom.xml中添加:
<exclusions> <exclusion> <groupId>com.zaxxer</groupId> <artifactId>HikariCP</artifactId> </exclusion> </exclusions>并引入达梦官方提供的dm-jdbc-driver-1.8。
现象:用jnpf-cli导出的表单JSON,在另一套JNPF环境导入后,下拉框选项丢失。
原因:JNPF 的下拉框数据源分两类:静态数据(JSON数组)、动态数据(SQL查询)。导出JSON只包含静态数据,若原表单用的是SQL查询(如SELECT name,code FROM t_professor),导入后该查询语句不会自动执行,选项为空。
解决:导入前,先在目标环境执行相同SQL创建t_professor表;或改用静态数据源,将选项固化在JSON中。
5. 权限体系落地:别让“角色”只停留在菜单栏,而忘了数据行级过滤
JNPF 的权限模型是“角色→菜单→按钮→数据权限”四级结构,但90%的项目只用到前两级,导致出现“张三能看到李四的报销单”这种致命问题。真正落地数据权限,必须理解两个核心机制:数据权限规则引擎和SQL动态拼接拦截器。
5.1 数据权限的三种生效层级与配置位置
| 层级 | 作用范围 | 配置入口 | 典型场景 | JNPF实现方式 |
|---|---|---|---|---|
| 菜单级 | 控制是否显示左侧菜单项 | 【系统管理】→【角色管理】→【分配菜单】 | 普通员工看不到“系统监控”菜单 | 前端路由守卫 + 后端Controller@PreAuthorize注解 |
| 按钮级 | 控制列表页的“编辑”“删除”按钮是否显示 | 【系统管理】→【角色管理】→【分配按钮】 | 财务专员有“导出Excel”按钮,普通员工没有 | 前端v-if判断 + 后端接口鉴权 |
| 数据级 | 控制列表查询结果只返回本人/本部门数据 | 【系统管理】→【数据权限】→【新建规则】 | 教师只能看到自己指导的学生项目,院长能看到全院 | 后端MyBatis拦截器,在SQL末尾追加AND create_user_id = ? |
注意:数据权限规则必须绑定到具体业务表(如
t_project_basic),而非“项目管理”这个菜单。JNPF 会为每张表生成独立的数据权限SQL模板。
5.2 配置一个“教师仅见本人项目”的数据权限规则
- 进入【系统管理】→【数据权限】→【新建规则】
- 规则名称:教师项目可见性
- 关联表:
t_project_basic - 规则SQL模板:
AND create_user_id = #{currentUserId}#{currentUserId}是JNPF预定义变量,值为当前登录用户ID- 模板中不能写
WHERE关键字,JNPF会自动拼接到原SQL的WHERE子句后
- 应用角色:选择“教师”角色
此时,当教师A访问“我的项目”列表时,JNPF会拦截其发起的SELECT * FROM t_project_basic WHERE status = 'draft'请求,并重写为:
SELECT * FROM t_project_basic WHERE status = 'draft' AND create_user_id = 10015.3 行级权限的进阶技巧:跨表关联过滤
真实场景:学生查看“我参与的项目”,需过滤t_project_member表中user_id = currentUserId的记录,再关联查出项目详情。但JNPF的数据权限规则只支持单表过滤。
解决方案:在【表单设计】→【高级设置】→【数据源】中,将列表数据源改为自定义SQL:
SELECT p.id, p.project_name, p.status, p.create_time FROM t_project_basic p INNER JOIN t_project_member m ON p.id = m.project_id WHERE m.user_id = #{currentUserId}然后在该SQL中直接使用#{currentUserId}。JNPF 会识别此变量并注入当前用户ID,无需额外配置数据权限规则。这是比“数据权限规则”更灵活的方式,适用于复杂关联场景。
6. 从手册到生产:v3.4.2 版本里那些没写进PDF,但决定项目成败的3个细节
JNPF v3.4.2 的手册PDF很厚,但它刻意回避了三个现场高频问题:日志定位、国产化适配、灰度发布。这些不是功能缺陷,而是架构设计的必然代价——就像SpringBoot不告诉你如何排查Tomcat线程池耗尽,JNPF也不会在手册里写“当流程卡住时,先查ACT_RU_EXECUTION表的SUSPENSION_STATE_字段”。
6.1 日志分级:别让ERROR日志淹没真正的故障线索
JNPF 默认日志级别是INFO,但生产环境必须调整。关键不是把所有日志设为DEBUG(那会产生GB级日志),而是精准控制三类日志:
| 日志类别 | 推荐级别 | 作用 | 配置位置 |
|---|---|---|---|
| 流程引擎日志 | DEBUG | 查看Activiti节点跳转、变量传递 | logging.level.org.activiti=DEBUG |
| SQL执行日志 | DEBUG | 定位慢查询、N+1问题 | logging.level.org.mybatis=DEBUG |
| 文件上传日志 | WARN | 监控非法文件、超限上传 | logging.level.com.jnpf.file=WARN |
# application-prod.yml 片段 logging: level: org.activiti: DEBUG org.mybatis: DEBUG com.jnpf.file: WARN file: name: logs/jnpf-prod.log max-size: 100MB max-history: 30提示:
org.activiti日志量极大,建议仅在排查流程问题时临时开启,问题定位后立即关回INFO。我吃过亏:一次线上流程阻塞,开DEBUG后日志每秒写入2MB,30分钟占满磁盘。
6.2 国产化适配清单:不只是换数据库,还有字体、时区、加密算法
JNPF v3.4.2 宣称支持国产化,但实际落地需手动补漏:
| 项目 | 问题 | 解决方案 |
|---|---|---|
| 字体渲染 | Linux服务器无中文字体,导出PDF乱码 | yum install -y fontconfig-devel && fc-cache -fv,安装wqy-microhei字体 |
| 时区一致性 | 前端显示“2023-01-01”,后端存库为“2022-12-31” | 在application.yml中强制设spring.jackson.time-zone: GMT+8,且JVM启动参数加-Duser.timezone=GMT+8 |
| 加密算法 | 国密SM4替换AES时,前端CryptoJS不兼容 | 使用JNPF内置的jnpf-crypto工具类,前端调用JnpfCrypto.sm4Encrypt(data, key) |
6.3 灰度发布策略:如何让新流程只对10%用户生效?
JNPF 没有内置灰度开关,但可通过“流程版本+用户标签”组合实现:
- 在用户表
t_user中新增字段flow_version_tag VARCHAR(10),值为v3.4.2或v3.4.1; - 在流程启动服务中,根据当前用户
flow_version_tag选择不同流程定义KEY:
String flowKey = "project_approval_v342"; if ("v3.4.1".equals(user.getFlowVersionTag())) { flowKey = "project_approval_v341"; } runtimeService.startProcessInstanceByKey(flowKey, variables);- 新流程发布后,先将10%测试用户
flow_version_tag改为v3.4.2,观察3天无异常,再批量更新。
这是我去年在某省人社厅项目里用过的方案,它不需要改JNPF源码,也不依赖Nginx分流,纯粹靠业务层控制,上线零事故。
最后说句实在话:JNPF 不是银弹,它把SpringBoot+Vue的80%重复劳动封装掉了,但剩下20%——比如复杂报表导出、第三方系统对接、高并发审批锁——还得你手写代码。手册v3.4.2写得再细,也替代不了你对着ACT_RU_TASK表一条条查任务实例的深夜。不过,当你第3次用同一套表单配置快速复用到新项目时,你会明白:所谓零代码,不过是把“写代码”的成本,前置转化成了“读手册+调参数”的成本。希望帮到你。
本文还有配套的精品资源,点击获取