菜单的类型:为什么「菜单」需要分类——结合驰骋 GPN_Menu 的设计驰骋BPM驰骋低代码低代码工作流引擎

本文围绕驰骋GPN_Menu的菜单类型体系,阐述为何需对菜单进行显式分类。重点解析流程类、单据类、实体类、视图类、大屏/报表类、高代码类及OA类七种类型,及其在解析方式、权限控制、移动端适配、低高代码融合和功能收窄等方面的核心价值。强调类型作为功能约定载体,支撑低代码平台的可配置性、可扩展性与工程化治理。

菜单的类型:为什么「菜单」需要分类——结合驰骋 GPN_Menu 的设计


一、问题的起点:如果菜单只存「URL + 标题」会怎样

上一篇文章说到,菜单是「功能页面与操作者的交互面」。那么一个很自然的问题:菜单表里到底要存什么?

最朴素的做法是存两个字段:

菜单 = { 标题: "待办工作", URL: "/WF/GL/TodoList" }

这么做能跑,但很快会遇到几个绕不开的问题:

  1. 打开哪个页面、怎么解析? 待办列表和一张表单,长得完全不一样,光靠 URL 前端不知道拉哪套渲染逻辑。
  2. 权限怎么配? 「待办」和「薪资查询」的授权方式可能完全不同。
  3. 移动端怎么办? PC 页面和移动端页面是两套入口。
  4. 参数从哪来? 同一类列表,绑不同实体就是不同菜单,参数不能写死。

根本原因在于:菜单承载的不只是一个跳转,而是一类功能的行为约定。 这些约定需要一个显式的字段来表达——这就是「菜单类型」(MenuModel)。


二、驰骋的答案:MenuModel 菜单类型

在 Menu.ts 的实体定义里,MenuModel 是菜单的必填字段之一:

map.AddTBString('MenuModel', null, '菜单模式', true, true, 0, 50, 200);

而所有合法的类型值,集中定义在 MenuModel.ts 里。把这份常量表读一遍,会发现它不是随便堆的——它是按「功能形态」分组的。

下面结合 GPN_Menu 向导的分组,把菜单类型分类说明。


三、菜单类型的分类

MenuModel.ts 里有一个 menuCategory,把类型粗分为三档:

const menuCategory = {
  highCode: '高代码',
  lowCode: '低代码',
  oa: 'OA类菜单',
};

按这个骨架,再结合 GPN_Menu 的向导分组,菜单类型可以这样归类:

3.1 流程类

类型说明
Start / StartSpecFlow发起流程(全部 / 指定流程)
Todolist / TodolistSpecFlow待办(全部 / 指定流程)
Runing / RuningSpecNo在途
CC / CCSpecFlow抄送
SearchFlow / SearchSpecFlow流程查询

特点:带 SpecFlow / SpecNo 后缀的,是把「全部流程」收窄为「指定流程」。这就是为什么流程类要正反两种类型——避免所有流程挤在同一个待办入口里。

3.2 单据类(流水,偏「叙事」)

类型说明
Bill / BillRef / BillRptWhite单据及其关联
SearchBill / FrmBill单据查询 / 单据表单

单据的定义在向导帮助里写得很直白:有单号、标题字段,记录事情的经过,具有时间、地点、任务,叙事文性质——报销单、出库单、出门单。

3.3 实体类(主数据,偏「说明」)

类型说明
EntityNoName编号名称实体(资产、学生、车辆)
Dict / DictTable / DictTableTree字典(键值对、树)
EntityRptWhite / EnRptWhite基于实体的报表
FrmDtlView从表视图

实体的定义与单据相对:有编号、名称字段,描述事物的属性,说明文性质。

单据 vs 实体,是菜单类型里最容易被实施人员搞混的一对。向导的帮助文案(GPN_Menu.ts 的 AddGroup 描述)其实就是在教这件事:叙事文 vs 说明文。

3.4 视图类(不建表,只看数)

类型说明
DBList分页视图
GenerList不分页视图
GanttDBView甘特图视图
FrmDtlView / FlowDtlView从表明细视图

视图的共同点是:用数据源配置「怎么看数据」,不新建业务表。

3.5 大屏 / 报表类

类型说明
RptWhite白色大屏
RptBlue / RptBluePage蓝色大屏
Rpt2DLowCode / Rpt3DLowCode二维 / 三维报表
FlowRptWhite / BillRptWhite / EnRptWhite / EntityRptWhite分别基于流程 / 单据 / 实体 / 高代码的大屏

这里也能看到「基础形态 + 数据来源」的组合思路:白色大屏是通用形态,再按数据来源分化成四种。

3.6 高代码类

类型说明
Search / Group / Tree查询 / 分组 / 树
TreeEns左树右表
GL通用列表
Tabs标签页容器
GPN / Ens / En / EnOnly新建 / 批量编辑 / 属性卡片
Data_V大屏
Self自定义 URL

这些类型对应上一系列的「面向模式的编程」——每个类型背后是一个基类 + 解析页面。选 GL,前端就走 GenerList.vue 解析;选 TreeEns,就走 TreeEns.vue。

3.7 OA 类

类型说明
Calendar / Notepad / WorkRec日历 / 记事本 / 工作日志
KnowledgeManagement知识管理
Info / Message信息发布 / 消息
NetDisk网盘
Task任务

OA 类的特点是:功能已开发好,配上菜单即可使用,不需要再设计。


四、类型背后的三种「承载方式」

MenuModel.ts 只是类型清单,真正有意思的是 readme.md 里对功能页面属性如何存储的说明。它把菜单按「属性复杂程度」分成三类,称之为 A / B / C:

类别适用场景存储方式
A 类:菜单承载通用方式属性简单或没有属性(日志、日历)用 MenuGenerPage 类,属性存菜单表
B 类:菜单承载个性方式属性相对复杂,但不想单独建表属性写进 GPM_Menu,与菜单属性共表
C 类:独立实体方式属性复杂,需要独立表创建菜单时生成独立记录,如 Frm_XXXXX

对应的代码写法(readme 原文):

A类: Menu.SetPara('EnName', 'TS.GPM.MenunGenerPage')
B类: Menu.SetPara('EnName', 'TS.XXX.MenuXX')
C类: Menu.SetPara('EnName', 'TS.XXX.XXXX'), Menu.SetPKVal('EnPKVal', 'Frm_XXXXX')

这是一个很务实的分级设计:不是所有菜单都值得建一张表。日历这种「打开即用」的,共表就够了;表单这种属性复杂的,才给独立实体。复杂度按需分配,避免为简单功能制造冗余表。


五、为什么需要这样设计:优点

5.1 类型决定解析方式,前端不做 if-else 地狱

菜单存了 MenuModel,前端就能「按类型路由」:GL → GenerList.vue,TreeEns → TreeEns.vue。这和「面向模式编程」是同一套哲学——用类型分发,而不是用条件判断。

如果没有类型,前端就得根据 URL 猜、根据实体名猜,最终变成一堆 if...else。

5.2 类型是「工具箱的分类」,降低选错成本

GPN_Menu 向导不是让人从空白路由开始填,而是先选类型、再配置。类型本身就是一份「这类功能是什么、适合什么场景」的说明书:

  • 单据:叙事文,有单号标题
  • 实体:说明文,有编号名称
  • 视图:不建表,只看数

实施人员选类型的过程,就是一次需求归类。选对了类型,后面的配置就是顺理成章。

5.3 类型是权限与移动端的挂载点

有了类型,才能做到:

  • 权限按类型初始化:不同功能的默认按钮、数据范围不同;
  • 移动端单独配置:Menu.MobileUrlExt 字段让 PC 与移动端各走各的入口;
  • 参数化复用:UrlExt 携带参数(如 x?EnName=TS.Demo.Student),同一类型可生成 N 个菜单。

5.4 类型让「低代码」与「高代码」在同一棵树上共存

menuCategory 里明确区分了高代码与低代码。这不是文字游戏——它意味着:

  • 低代码菜单:配置元数据即可用;
  • 高代码菜单:挂一个 TS 子类,走解析页面。

同一个 GPM_Menu 体系,既能挂配置出来的功能,也能挂写代码出来的功能,而不是两套导航。这就是「标准能力配置化,例外能力代码化」在菜单层的体现。

5.5 类型让功能可以「按需收窄」

流程类里 Todolist(全部)与 TodolistSpecFlow(指定流程)并存,是很好的例子。它承认了一个现实:大系统里,不同部门关心的待办范围不一样。 用类型把「全部」和「指定」分开,就避免了「一个待办入口所有人共用」的混乱。


六、一张总表

类型分组代表类型解决的问题解析去向
流程Start / Todolist / Runing / CC按节点推进的事务流程列表解析页
单据Bill / SearchBill流水、事件、过程单据解析页
实体EntityNoName / Dict主数据、属性说明实体解析页
视图DBList / GenerList / GanttDBView不建表的展现视图解析页
大屏报表RptWhite / RptBlue / Rpt2D/3D分析与可视化大屏解析页
高代码GL / TreeEns / GPN / Self定制功能模式解析页(GL_* 等)
OACalendar / Notepad / Task办公配套已开发页面

七、结论

菜单需要分类,本质上是因为**「菜单」这个词承载了太多不同性质的功能**。把类型显式化,能同时解决四件事:

  1. 怎么打开(解析方式)
  2. 谁能用(权限初始化)
  3. 在哪用(PC / 移动端)
  4. 用什么参数(路由复用)

驰骋的做法是:用 MenuModel 定义类型、用 menuCategory 粗分高/低代码、用 A/B/C 三种承载方式控制属性复杂度,最后用 GPN_Menu 向导把「选类型」这一步变成「需求归类」。

回过头看,MenuModel.ts 那一长串常量并不只是枚举——它是这套低代码平台对「一个业务系统由哪些功能组成」的一份分类学。 分类清晰,堆积才不会乱。


附录:本文涉及的代码索引

主题路径
菜单类型常量Vue3/src/CCFast/GPM/CCMenu/MenuModel.ts
新建菜单向导Vue3/src/CCFast/GPM/CCMenu/GPN_Menu.ts
菜单实体(MenuModel 字段)Vue3/src/CCFast/GPM/CCMenu/Menu.ts
A/B/C 承载方式说明Vue3/src/CCFast/GPM/CCMenu/readme.md
菜单类型 → 解析页面映射Vue3/src/CCFast/GPM/CCMenu/GPN_Menu.ts(ClassFactory 映射表)
页面模式框架doc/低代码部分/面向模式编程思想-的高代码开发.md

本文基于当前仓库源码静态分析整理,类型清单随版本迭代变化,具体以你所使用的版本为准。

附训练好的 YOLO 权重与 PyQt 可视化检测界面,页面底部含可视化效果预览,毕设/课设开箱即用。 【数据集概况】 · 检测类别(中文):[未获取()] 【训练曲线与评估图】 【模型训练配置】 参数 | 值 模型 | yolo26n 训练轮数 | 100 epochs 输入尺寸 | 640x640 批次大小 | 24 优化器 | auto 初始学习率 | 0.01 训练设备 【关键指标汇总】 训练了 55 个 epoch,最终轮指标: 指标 | 数值 mAP50 | **0.9512** mAP50-95 | 0.6746 Precision | 0.8796 Recall | 0.8825 train/box_loss | 0.8608 train/cls_loss | 0.7232 val/box_loss | 0.9955 val/cls_loss | 0.5511 【训练过程分析】 这轮训练我经历了从初始到稳定的曲折过程。前 20 个epoch,loss 曲线呈现了陡峭的下降趋势,mAP50 指标从 0.8 开始逐步攀升,仿佛在寻找一个合适的平衡点。然而,从第 21 个epoch 开始,mAP50 的提升速率显著放缓,整体曲线显得有些曲折,有时甚至停滞不前,让我一度以为训练出现了问题。直到第 35 个epoch,loss 开始逐渐趋于平稳,这标志着模型已经找到了一个较好的收敛区间。到了最后的 20 个 epoch,尽管 mAP50 依旧在稳步上升,但提升幅度已经不大,这意味着模型已经接近其性能天花板。 在这个过程中,我重点关注了 box_loss 和 cls_loss 的变化。初期阶段,box_loss 快速下降,从 0.9 逐渐降至 0.86,而 cls_loss 则从 0.75 逐步下降至... 使用场景:毕业设计、课程设计、深度学习入门、工业场景落地验证。
内容概要:本文以“月哨兵”科幻角色数字雕刻工程为实例,系统构建了从程序化粗模到高精度雕刻的完整数学模型。研究涵盖重拓扑、Catmul-Clark细分、笔刷位移场建模、多部件组装及精细度上限分析等核心环节。通过ZRemesher将304,050顶点粗模重拓扑为28,600顶点的全四边形网格,并逐级细分至732万面,实测面数递推F(k)=F₀·4ᵏ完全符合理论。利用ZBrush Python接口注入Standard笔刷操作,首次通过同拓扑OBJ逐顶点差分获得真实位移场数据,实测最大位移0.454873,8.756%顶点发生显著位移。提出“理论-内存-拓扑-视觉”四层精细度上限模型,指出在24GB内存条件下工程合理上限为10⁷~10⁸面,视觉收益受渲染分辨率制约趋于饱和。最终完成755万面的组装网格并经工程文件回读验证一致性。; 适合人群:具备三维建模与数字雕刻基础,熟悉ZBrush工作流,从事角色资产开发或程序化内容生成的技术美术、图形学研究人员及高阶数字艺术家。; 使用场景及目标:①理解Catmul-Clark细分曲面在工业级雕刻流程中的数学机制;②掌握基于脚本驱动的可复核雕刻工程构建方法;③评估高面数模型的内存代价与视觉收益平衡;④学习重拓扑、位移场量化、多部件合并等关键技术的工程实现。; 阅读建议:本文强调数学建模与实证闭环,建议结合附录中的脚本与数据文件进行复现实践,重点关注逐顶点差分、细分递推验证与四层上限模型的构建逻辑,以深入掌握高精度数字雕刻的系统性工程方法。
内容概要:本文围绕PUMA(Propagator Method-based DOA Estimation)算法在波达方向(DOA)估计中的改进实现展开,重点在于通过Matlab编程对算法进行仿真与性能验证。作为阵列信号处理领域的高分辨率DOA估计算法,PUMA在传统方法基础上提升了估计精度与鲁棒性,尤其在低信噪比、小样本等恶劣条件下仍能保持优异性能。文中系统阐述了PUMA算法的理论基础、数学模型及其相较于MUSIC、ESPRIT等经典算法的优势,并通过仿真实验进行对比分析,展示其在分辨力、稳定性和计算效率方面的综合优势,适用于实际雷达、无线通信与电子侦察等应用场景。; 适合人群:具备信号处理、通信工程、电子信息或雷达系统等相关专业背景的研究生、科研人员及工程技术人员,熟悉阵列信号处理理论与Matlab编程环境者尤佳; 使用场景及目标:①用于学术研究中DOA估计算法的性能优化与新方法对比验证;②应用于雷达系统、5G/6G通信、智能天线、电子对抗等领域的高精度空间谱估计任务;③作为Matlab仿真实践资源,支持课程设计、学位论文复现与科研项目开发; 阅读建议:建议结合阵列信号处理基础知识体系学习本资源,重点关注PUMA算法的改进机制与核心代码实现逻辑,建议动手运行并调整仿真参数以深入理解不同因素(如阵元数、信噪比、快拍数)对估计性能的影响。
内容概要:本文围绕“双碳”战略背景,系统阐述了基于Simulink的汽车碳排放建模与仿真技术,重点引入模糊PID控制优化动力系统性能,以实现节能减排目标。文档整合了多个Matlab/Simulink科研仿真案例,涵盖无刷直流电机(BLDC)控制、三相PWM整流器、电池管理系统、路径规划、信号处理、智能优化算法及图像处理等领域,全面展示Matlab在智能控制与绿色能源系统中的应用价值。同时强调科研应兼具严谨逻辑、创新思维与工具赋能,并提供完整的仿真资源链接与学习路径支持实践落地。; 适合人群:具备Matlab/Simulink基础,从事自动化、电气工程、车辆工程、控制科学、电力电子及智能制造等相关领域的科研人员或高年级本科生、研究生;适用于开展节能减排、新能源系统优化、智能控制算法研究等课题的研究者。; 使用场景及目标:①学习在Simulink中构建汽车能耗与排放仿真模型并应用模糊PID进行动态优化;②掌握BLDC、PWM整流器等关键部件的建模与控制策略设计;③借鉴丰富案例提升科研效率,拓展在智能控制、路径规划、信号处理等方向的应用能力;④通过提供的网盘资源获取完整代码与资料,支撑论文写作与项目开发。; 阅读建议:建议按照资源目录顺序系统学习,结合百度网盘提供的Matlab/Simulink代码动手实践,重点关注控制策略的设计、仿真结果的分析与优化过程,同时注重培养科研思维与工程实际问题的结合能力。
内容概要:本文系统整理了一套面向科研仿真的Matlab/Simulink资源合集,涵盖电力电子、控制理论、信号处理、电力系统、智能优化算法、机器学习、图像处理、路径规划、通信技术、雷达追踪、车间调度等多个前沿科研领域。重点资源包括三相PWM整流器双闭环控制、磁流变阻尼器非线性特性建模、双有源桥(DAB)DC-DC变换器优化控制、电网不平衡下的功率平衡策略、卡尔曼滤波状态估计、多类型路径规划与调度算法等,多数为顶级EI期刊成果复现,配套仿真模型、原理说明、参考文献及代码,具备较强的学术参考价值与工程实践意义。; 适合人群:适用于从事电气工程、自动化、控制科学与工程、信号与信息处理、计算机、机械电子等方向的硕士/博士研究生及科研人员,要求具备Matlab/Simulink基础操作能力及相关专业背景;也适合高校教师指导课程设计、毕业设计或科研项目开发。; 使用场景及目标:①辅助高水平论文研究与期刊成果复现;②支撑课程设计、毕业设计与科研项目开发;③深入理解先进控制策略(如VOC、SVPWM、模糊PID、滑模控制)与系统建模方法;④结合YALMIP等优化工具开展算法设计与验证;⑤拓展智能优化、机器学习、路径规划等跨学科研究能力。; 阅读建议:建议按照资源目录顺序系统浏览,优先关注标注“顶级EI复现”的高价值模型,结合公众号“荔枝科研社”提供的网盘资料与技术文档进行仿真实践,通过动手调试加深对算法逻辑与系统动态特性的理解,提升科研建模与创新能力。
内容概要:本文详细介绍了一种基于变分贝叶斯近似的递归噪声自适应卡尔曼滤波方法,并配套提供了完整的Matlab代码实现。该方法旨在解决传统卡尔曼滤波在面对过程噪声和观测噪声统计特性未知或时变情况下性能退化的问题,通过引入变分贝叶斯推断技术,实现对噪声协方差的在线联合估计与动态更新,从而提升滤波器在非平稳环境中的状态估计精度与鲁棒性。文中系统阐述了算法的理论基础、数学推导流程、递归计算结构及关键实现步骤,涵盖了概率图模型构建、似然函数近似、变分迭代优化等核心技术环节,适用于复杂动态系统中的自适应信号处理与状态估计任务。; 适合人群:具备良好线性系统理论、概率统计与贝叶斯估计基础,并熟悉Matlab编程的研究生、科研人员及从事导航、控制、传感融合等相关领域的工程技术人员; 使用场景及目标:①应对实际工程中因噪声先验信息缺失或环境变化导致的标准卡尔曼滤波失效问题;②应用于无人机导航、智能驾驶、工业状态监测、传感器融合等高精度自适应估计场景,提升系统在不确定环境下的稳定性和准确性; 阅读建议:建议读者结合所提供的Matlab代码逐模块研读,重点理解变分贝叶斯迭代过程中噪声协方差矩阵的后验更新机制,并通过仿真实验对比所提方法与标准KF/EKF/UKF的估计性能差异,深入掌握噪声自适应滤波的设计思想与实现技巧。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

驰骋低代码、工作流、表单引擎

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值