4.1.6 模型之元数据详解

介绍Model相关元数据,以及对应代码注解方式。大家还是可以通读并练习每种不同的使用方式,这个是oinone的设计精华所在。当您不知道如何配置模型、字段、模型间的关系、以及枚举都可以到这里找到。

一、模型元数据

安装与更新

使用@Model.model来配置模型的不可变更编码。模型一旦安装,无法在对该模型编码值进行修改,之后的模型配置更新会依据该编码进行查找并更新;如果仍然修改该注解的配置值,则系统会将该模型识别为新模型,存储模型会创建新的数据库表,而原表将会rename为废弃表。

如果模型配置了@Base注解,表明在studio中该模型配置不可变更;如果字段配置了@Base注解,表明在studio中该字段配置不可变更。

注解配置

模型类必需使用@Model注解来标识当前类为模型类。

可以使用@Model.model、@Fun注解模型的模型编码(也表示命名空间),先取@Model.model注解值,若为空则取@Fun注解值,若皆为空则取全限定类名。

模型元信息

模型的priority,当展示模型定义列表时,使用priority配置来对模型进行排序。

模型的ordering,使用ordering属性来配置该模型的数据列表的默认排序。

模型元信息继承形式:

  • 不继承(N)
  • 同编码以子模型为准(C)
  • 同编码以父模型为准(P)
  • 父子需保持一致,子模型可缺省(P=C)

注意:模型上配置的索引和唯一索引不会继承,所以需要在子模型重新定义。数据表的表名、表备注和表编码最终以父模型配置为准;扩展继承父子模型字段编码一致时,数据表字段定义以父模型配置为准。

名称 描述 抽象继承 同表继承 代理继承 多表继承
基本信息
displayName 显示名称 N N N N
summary 描述摘要 N N N N
label 数据标题 N N N N
check 模型校验方法 N N N N
rule 模型校验表达式 N N N N
模型编码
model 模型编码 N N N N
高级特性
name 技术名称 N N N N
table 逻辑数据表名 N P=C P=C N
type 模型类型 N N N N
chain 是否是链式模型 N N N N
index 索引 N N N N
unique 唯一索引 N N N N
managed 需要数据管理器 N N N N
priority 优先级,默认100 N N N N
ordering 模型查询数据排序 N N N N
relationship 是否是多对多关系模型 N N N N
inherited 多重继承 N N N N
unInheritedFields 不从父类继承的字段 N N N N
unInheritedFunctions 不从父类继承的函数 N N N N
高级特性-数据源
dsKey 数据源 N P=C P=C N
高级特性-持久化
logicDelete 是否逻辑删除 P P P N
logicDeleteColumn 逻辑删除字段 P P P N
logicDeleteValue 逻辑删除状态值 P P P N
logicNotDeleteValue 非逻辑删除状态值 P P P N
underCamel 字段是否驼峰下划线映射 P P P N
capitalMode 字段是否大小写映射 P P P N
高级特性-序列生成配置
sequence 配置编码 C C C N
prefix 前缀 C C C N
suffix 后缀 C C C N
separator 分隔符 C C C N
size 序列长度 C C C N
step 序列步长 C C C N
initial 初始值 C C C N
format 序列格式化 C C C N
高级特性-关联关系(或逻辑外键)
unique 外键值是否唯一 C C C N
foreignKey 外键名称 C C C N
relationFields 关系字段列表 C C C N
references 关联模型 C C C N
referenceFields 关联字段列表 C C C N
limit 关系数量限制 C C C N
pageSize 查询每页个数 C C C N
domainSize 模型筛选可选项每页个数 C C C N
domain 模型筛选,前端可选项 C C C N
onUpdate 更新关联操作 C C C N
onDelete 删除关联操作 C C C N
静态配置
Static 静态元数据模型 N N N N

表4-1-6-1 模型元信息

字段定义继承形式

名称 描述 抽象继承 同表继承 代理继承 多表继承
字段定义 字段定义 C C C C

表4-1-6-2 字段定义继承形式

模型约束

主键约束

每个模型都可以配置自身的主键列表,也可以不配置主键。主键值不可缺省,可以索引到模型所对应数据表中唯一的一条记录。

外键约束

模型与模型之间的关联关系可以配置外键约束来约束关联关系之间数据的变更行为。

校验约束

模型可以配置校验函数对该模型的数据进行校验,存储数据时,校验数据是否合法合规。

二、字段元数据

模型字段描述的是实体的特征属性。模型与字段之间的关联关系由Model的model与Field的model进行关联。ModelField继承关系抽象类Relation。

使用@Field注解来描述模型的字段。如果未配置字段类型,系统会根据Java代码的字段声明类型来自动获取业务类型。建议配置displayName属性来描述字段在前端的显示名称。可以使用defaultValue配置字段的默认值。

元数据注解说明

4.1.6 模型之元数据详解

图4-1-6-1 元数据注解说明

安装与更新

使用@Field.field来配置字段的不可变更编码。字段一旦安装,无法在对该字段编码值进行修改,之后的字段配置更新会依据该编码进行查找并更新;如果仍然修改该注解的配置值,则系统会将该字段识别为新字段,存储模型会创建新的数据库表字段,而原字段将会rename为废弃字段。

基础配置

不可变更字段

使用immutable属性来描述该字段前后端都无法进行更新操作,系统会忽略不可变更字段的更新操作。

自动生成编码的字段

可以使用@Field.Sequence注解在字段上配置编码生成规则,为编码为空的字段自动生成编码。

详见3.3.5【模型编码生成器

字段的序列化与反序列化

使用@Field注解的serialize属性来配置非字符串类型属性的序列化与反序列化方式,最终会以序列化后的字符串持久化到存储中。

详见3.3.7【字段之序列化方式

前端默认配置

可以使用@Field注解中的以下属性来配置前端的默认视觉与交互规则,也可以在前端设置覆盖以下配置。

  • required,是否必填
  • invisible,是否不可见
  • priority,字段优先级,列表的列使用该属性进行排序

字段类型

类型系统由基本类型、复合(组件)类型、引用类型和关系类型四种类型系统构成。通过类型系统来决定应用程序、数据库和前端视觉视图是如何进行交互,数据及数据间关系如何处理的。

基本类型

表4-1-6-3 基本类型

#### 复合类型

业务类型 Java类型 数据库类型 规则说明
BINARY Byte Byte[] TINYINT BLOB 二进制类型,不推荐使用
INTEGER INTEGER
Short
Integer
Long
BigInteger
smallint
int
bigint
decimal(size,0)
整数, 包括整数(10-11位有效数字)、长整数(19-20位有效数字)和大整数(超过19位)。
【数据库规则】:默认使用int;如果size小于6则使用smallint;如果size超过6则使用int;如果size超过10位数字,即大于11(包含符号位),则使用长整数bigint;如果size超过19位数字,即大于20(包含符号位),则使用大数decimal。若未配置size,则按Java类型推测。
【前端交互规则】:整数使用Number类型,长整数和大整数前后端协议使用字符串类型。
二进制类型,不推荐使用
FLOAT Float
Double
BigDecimal
float(M,D)
double(M,D)
decimal(M,D)
浮点数, 包括单精度浮点数(7-8位有效数字)、双精度浮点数(15-16位有效数字)和大数(超过15位)。
【数据库规则】:默认使用单精度浮点数float;
如果size超过7位数字,即大于等于8,则使用双精度浮点数double;如果size超过15位数字,即大于等于16,则使用大数decimal。若未配置size,则按Java类型推测。
【前端交互规则】:单精度浮点数float和双精度浮点数double使用Number类型(因为都使用IEEE754协议64位进行存储),大数前后端协议使用字符串类型。
BOOLEAN Boolean tinyint(1) 布尔类型,值为1,true(真)或0,false(假)
ENUM Enum varchar(size) 【前端交互规则】:可选项从ModelField的options字段获取,options字段值为字段指定数据字典子集的JSON序列化字符串。前后端传递的是可选项的name,数据库存储使用可选项的value。multi属性为true,则使用多选控件;multi属性为false,则使用单元控件
STRING String varchar(size) 字符串,size为长度限制默认值参考,前端可以view中覆盖该配置
TEXT String text 多行文本,编辑态组件为多行文本框,长度限制为配置项size值
HTML String text 富文本编辑器
DATETIME java.util.Date
java.sql.Timestamp
datetime(fraction)
timestamp(fraction)
日期时间类型
【数据库规则】:日期和时间的组合,
时间格式为 YYYY-MM-DD HH:MM:SS[.fraction],默认精确到秒,在默认的秒精确度上,可以带小数,最多带6位小数,即可以精确到 microseconds (6 digits) precision。可以通过设置fraction来设置精确小数位数,最终存储在字段的decimal属性上。
【前端交互规则】:前端默认使用日期时间控件,根据日期时间类型格式化格式format格式化日期时间
YEAR java.util.Date year 日期时间类型
年份类型
日期类型
【数据库规则】:默认“YYYY”格式表示的日期值
【前端交互规则】:前端默认使用年份控件,根据日期类型格式化格式format格式化日期
DATE java.util.Date
java.sql.Date
date
date
date
date 日期类型
【数据库规则】:默认“YYYY-MM-DD”格式表示的日期值
【前端交互规则】:前端默认使用日期控件,根据日期类型格式化格式format格式化日期
TIME java.util.Date
java.sql.Time
time(fraction)
time(fraction)
time(fraction)
time(fraction) 时间类型
【数据库规则】:默认“HH:MM:SS”格式表示的时间值
【前端交互规则】:前端默认使用时间控件,根据日期类型格式化格式format格式化日期
业务类型 Java类型 数据库类型 规则说明
BINARY ByteByte[] TINYINTBLOB 二进制类型,不推荐使用
INTEGER ShortIntegerLongBigInteger smallintintbigintdecimal(size,0) 整数, 包括整数(10-11位有效数字)、长整数(19-20位有效数字)和大整数(超过19位)。【数据库规则】:默认使用int;如果size小于6则使用smallint;如果size超过6则使用int;如果size超过10位数字,即大于11(包含符号位),则使用长整数bigint;如果size超过19位数字,即大于20(包含符号位),则使用大数decimal。若未配置size,则按Java类型推测。【前端交互规则】:整数使用Number类型,长整数和大整数前后端协议使用字符串类型。
FLOAT FloatDoubleBigDecimal float(M,D)double(M,D)decimal(M,D) 浮点数,?包括单精度浮点数(7-8位有效数字)、双精度浮点数(15-16位有效数字)和大数(超过15位)。【数据库规则】:默认使用单精度浮点数float;如果size超过7位数字,即大于等于8,则使用双精度浮点数double;如果size超过15位数字,即大于等于16,则使用大数decimal。若未配置size,则按Java类型推测。【前端交互规则】:单精度浮点数float和双精度浮点数double使用Number类型(因为都使用IEEE754协议64位进行存储),大数前后端协议使用字符串类型。
BOOLEAN Boolean tinyint(1) 布尔类型,值为1,true(真)或0,false(假)
ENUM Enum 与数据字典指定基本类型一致 【前端交互规则】:可选项从ModelField的options字段获取,options字段值为字段指定数据字典子集的JSON序列化字符串。前后端传递的是可选项的name,数据库存储使用可选项的value。multi属性为true,则使用多选控件;multi属性为false,则使用单元控件
STRING String varchar(size) 字符串,size为长度限制默认值参考,前端可以view中覆盖该配置
TEXT String text 多行文本,编辑态组件为多行文本框,长度限制为配置项size值
HTML String text 富文本编辑器
DATETIME java.util.Datejava.sql.Timestamp datetime(fraction)timestamp(fraction) 日期时间类型【数据库规则】:日期和时间的组合,时间格式为?YYYY-MM-DD HH:MM:SS[.fraction],默认精确到秒,在默认的秒精确度上,可以带小数,最多带6位小数,即可以精确到?microseconds (6 digits) precision。可以通过设置fraction来设置精确小数位数,最终存储在字段的decimal属性上。【前端交互规则】:前端默认使用日期时间控件,根据日期时间类型格式化格式format格式化日期时间
YEAR java.util.Date year 年份类型日期类型【数据库规则】:默认“YYYY”格式表示的日期值【前端交互规则】:前端默认使用年份控件,根据日期类型格式化格式format格式化日期
DATE java.util.Datejava.sql.Date datedate 日期类型【数据库规则】:默认“YYYY-MM-DD”格式表示的日期值【前端交互规则】:前端默认使用日期控件,根据日期类型格式化格式format格式化日期
TIME java.util.Datejava.sql.Time time(fraction)time(fraction) 时间类型【数据库规则】:默认“HH:MM:SS”格式表示的时间值【前端交互规则】:前端默认使用时间控件,根据日期类型格式化格式format格式化日期

表4-1-6-3 基本类型

复合类型

业务类型 Java类型 数据库类型 规则说明
MONEY BigDecimal decimal(M,D) 金额,前端使用金额控件,可以使用currency设置币种字段

表4-1-6-4 复合类型

#### 引用类型

业务类型 Java类型 数据库类型 规则说明
RELATED 基本类型或关系类型 不存储或varchar、text 引用字段【数据库规则】:点表达式最后一级对应的字段类型;数据库字段值默认为Java字段的序列化值,默认使用JSON序列化【前端交互规则】:点表达式最后一级对应的字段控件类型

表4-1-6-5 引用类型

#### 关系类型

业务类型 Java类型 数据库类型 规则说明
O2O 模型/DataMap 不存储或varchar、text 一对一关系
M2O 模型/DataMap 不存储或varchar、text 多对一关系
O2M List<模型/DataMap> 不存储或varchar、text 一对多关系
M2M List<模型/DataMap> 不存储或varchar、text 多对多关系

表4-1-6-6 关系类型

多值字段或者关系字段需要存储,默认使用JSON格式序列化。多值字段数据库字段类型默认为varchar(1024);关系字段数据库字段类型默认为text。

#### 类型默认推断

M代表精度,即有效长度(总位数), D代表标度,即小数点后的位数,fraction为时间秒以下精度。multi表示该字段为多值字段。

Java类型 Field注解 推断ttype 推断配置 推断数据库配置
Byte @Field BINARY blob
String @Field STRING size=128 varchar(128)
List @Field STRING size=1024,multi=true varchar(1024)
Map @Field STRING size=1024 varchar(1024)
Short @Field INTEGER M=5 smallint(6)
Integer @Field INTEGER M=10 integer(11)
Long @Field INTEGER M=19 bigint(20)
BigInteger @Field INTEGER M=64 decimal(64,0)
Float @Field FLOAT M=7,D=2 float(7,2)
Double @Field FLOAT M=15,D=4 double(15, 4)
BigDecimal @Field FLOAT M=64,D=6 decimal(64,6)
Boolean @Field BOOLEAN tinyint(1)
java.util.Date @Field DATETIME fraction=0 datetime
java.util.Date @Field.Date(type=DateTypeEnum.YEAR) YEAR year
java.util.Date @Field.Date(type=DateTypeEnum.DATE) DATE date
java.util.Date @Field.Date(type=DateTypeEnum.TIME) TIME fraction=0 time
java.sql.Timestamp @Field DATETIME fraction=0 timestamp
java.sql.Date @Field DATE date
java.sql.Time @Field TIME fraction=0 time
Long @Field.Date DATETIME fraction=0 datetime
enum implementsIEnum @Field ENUM 根据枚举value类型
primitive type @Field.Enum(dictionary=数据字典编码) ENUM 根据枚举value类型
List @Field.Enum(dictionary=数据字典编码) ENUM multi=true varchar(512)
模型类 @Field.Relation M2O text
DataMap @Field.Relation M2O text
List<模型类> @Field.Relation O2M multi=true text
List @Field.Relation O2M multi=true text

表4-1-6-7 类型默认推断

### 字段约束

#### 主键

可以使用Yaml或者@Model.Advanced的keyGenerator属性来配置模型主键的自动生成规则,AUTO_INCREMENT或者分布式ID。如果不配置,将不会自动生成主键值。

#### 逻辑外键约束

在创建关联关系字段的时候,可以使用@Field.Relation注解的onUpdate和onDelete属性指定在删除模型或更新模型关系字段值时,对关联模型进行的相应操作。操作包括RESTRICT、NO ACTION、SET NULL和CASCADE,默认值为RESTRICT。

- RESTRICT是指模型与关联模型有关联记录的情况下,引擎会阻止模型关系字段的更新或删除模型记录;
- NO ACTION是指不作约束(这里与数据库约束的定义不相同);
- CASCADE表示在更新模型关系字段或者删除模型时,级联更新关联模型对应记录的关联字段值或者级联删除关联模型对应记录;
- SET NULL则是表示在更新模型关系字段或者删除模型的时候,关联模型的对应关联字段将被SET NULL(该字段值允许为null的情况下,若不允许为null,则引擎阻止对模型的操作)。

#### 通用校验约束

字段业务类型 size limit decimal mime min max
BINARY 文件类型 最小比特位 最大比特位
INTEGER 有效数字 最小值 最大值
FLOAT 有效数字 小数位数 最小值 最大值
BOOLEAN
ENUM 存储字符数 多选最多数量
STRING 存储字符数 字符数 字符数
TEXT 字符数 字符数
HTML 字符数 字符数
MONEY 有效数字 小数位数 最小值 最大值
RELATED

表4-1-6-8 通用校验约束(表一)

字段业务类型 fraction format min max
DATETIME 时间精度 时间格式 最早日期时间 最晚日期时间
YEAR 时间格式 最早年份 最晚年份
DATE 时间格式 最早日期 最晚日期
TIME 时间精度 时间格式 最早时间 最晚时间

表4-1-6-9 通用校验约束(表二)

字段业务类型 size domainSize limit pageSize
RELATED 存储字符数(若序列化存储)
O2O 存储字符数(若序列化存储) 可选项每页个数
M2O 存储字符数(若序列化存储) 可选项每页个数
O2M 存储字符数(若序列化存储) 可选项每页个数 关系数量限制 查询每页个数
M2M 存储字符数(若序列化存储) 可选项每页个数 关系数量限制 查询每页个数

表4-1-6-10 通用校验约束(表三)

在模型或字段上配置check函数,则处理前端请求时会进行校验约束。也可以调用模型上的check函数进行编程式校验。

#### 默认值约束

字段默认值defaultValue可以是基本类型或者关系类型的序列化值。时间类型可以使用format来格式化时间表达式或者使用长整数来设置默认值。枚举类型使用枚举项值value来设置默认值。如果需要进行复杂的计算请使用模型的construct构造函数来配置解决。

#### 唯一约束

将字段或者模型上配置unique唯一索引,可以为模型或字段添加唯一约束。

#### 可选项约束

使用枚举定义字段的可选项值,可以为字段提供可选项约束功能。

### 关系字段

关联关系用于描述模型间的关联方式:

- 多对一关系,主要用于明确从属关系
- 一对多关系,主要用于明确从属关系
- 多对多关系,主要用于弱依赖关系的处理,提供中间模型进行关联关系的操作
- 一对一关系,主要用于多表继承和行内合并数据

![image.png](https://doc.oinone.top/wp-content/uploads/2024/05/1603789648327-67e982a3-3094-4a52-a9db-12a9b59cd642.png)

图4-1-6-2 关系字段

#### 名词解释

关联关系比较重要的名词解释如下:

- 关联关系:使用relation表示,模型间的关联方式的一种描述,包括关联关系类型、关联关系双边的模型和关联关系的读写
- 关联关系字段:业务类型ttype为O2O、O2M、M2O或M2M的字段
- 关联模型:使用references表示,自身模型关联的模型
- 关联字段:使用referenceFields表示,关联模型的字段,表示关联模型的哪些字段与自身模型的哪些字段建立关系
- 关系模型:自身模型
- 关系字段:使用relationFields表示,自身模型的字段,表示自身模型的哪些字段与关联模型的哪些字段建立关系
- 中间模型,使用through表示,只有多对多存在中间模型,模型的relationship=true

#### 关联关系的默认视图

- 一对多默认视图,编辑态在行内是下拉多选,在详情是选项卡表格;展示态在行内是折叠面板表格,在详情是选项卡表格
- 多对一默认视图,编辑态在行内是下拉单选,在详情是下拉单选;展示态在行内是文字,在详情是文字
- 多对多默认视图,编辑态在行内是下拉多选,在详情是选项卡表格;展示态在行内是折叠面板表格,在详情是选项卡表格
- 一对一默认视图,编辑态在行内是平铺,在详情是分组;展示态在行内是平铺,在详情是分组

在后端研发的使用上所有关联关系和引用的处理都限制在本模型,即平台至多处理到当前模型的字段,不再继续依据关联关系和引用处理关联模型。但是可以手动调用模型上的链式方法fieldQuery、fieldCreate和fieldUpdate来完成关联关系的查询与更新操作。

使用O2M或者M2M关联关系关联的临时模型没有分页查询操作。

#### 关联关系的配置

可以使用@Field.Relation注解的relationFields、referenceFields、references和through来配置关联关系。

relationFields与referenceFields为存储关联关系的一一映射字段列表。

如果relationFields缺省,一对多或者多对多关系的relationFields默认为模型主键;一对一或者多对一关系的relationFields默认为关联关系字段名加上首字母大写的主键名拼接而成的字符串。如果有多个主键,则relationFields和referenceFields也对应有多个字段。

如果配置了relationFields,但referenceFields缺省,则referenceFields与relationFields字段名一致。

一对多关系的referenceFields必填。如果referenceFields缺省,多对多,多对一或者一对一关系的referenceFields默认为主键。

关系类型 缺省关系字段默认值 缺省关联字段默认值
一对多 默认为关系模型的pk 默认为关系模型名+关系模型的pk;如果关系另一端的多对一字段名不是关系模型名,则需明确指定,使两端关系字段与关联字段对应
一对一 默认为关联关系字段名+关系模型的pk 默认为关联模型的pk
多对一 默认为关联关系字段名+关系模型的pk 默认为关联模型的pk
多对多 默认为关系模型的pk 默认为关联模型的pk

表4-1-6-11 关联关系的配置

多对多使用through来指定中间模型的模型编码,如果指定模型编码的中间模型不存在,系统会根据through自动生成中间模型,中间模型的默认字段为与两端模型关联的关系字段。与关系模型关联的关系字段名称为关系模型名称加上关系模型的主键拼接而成的字符串;与关联模型关联的多对一字段名称为关联模型名称加上关联模型主键拼接而成的字段串。如果与关系模型关联的关系字段名称和与关联模型关联的多对一字段名称冲突,需要使用throughRelationFields和throughReferenceFields明确配置指定字段名称解决冲突。

系统根据模块的依赖关系,自动生成的中间模型将生成在先加载的建立多对多关系的关系模型所在模块。

#### 读写关联关系字段

默认关联关系字段的store属性为false,relationStore为true。若设置关联关系字段relationStore属性为true,则会为关联关系字段生成关系字段用于存储关联关系。若设置关联关系字段store属性为true,则存储时序列化字段值存储到数据库中,查询时从数据库中反序列化得到字段值。字段类型为varchar且长度为128,如果需要改变字段长度,可以使用@Field.Advanced的columnDefinition设置。当store属性为false时,则字段值为关联关系查询得到的结果。如果store为false且relationStore为false,则只能对字段进行赋值来设置字段值。

#### 关联操作

调用数据管理器的API不会触发关联操作,需要调用fieldQuery和fieldSave方法进行关联模型的关联操作。

前端的查询接口会根据GraphQL协议进行关联查询。

前端的新增和更新接口默认会存储当前模型的关联关系字段和递归新增和更新一对多关系的关联关系字段。更新接口会检查当前模型的逻辑外键约束。可以调用模型的ignore方法或设置模型数据的ignore属性来改变递归深度,避免循环操作。

前端的删除接口会默认删除当前模型数据和根据级联配置进行当前模型的关联关系字段的关联操作。删除接口会检查当前模型的逻辑外键约束。可以调用模型的ignore方法或设置模型数据的ignore属性来改变递归深度,避免循环操作。

#### 关联数据分页

可以使用关系字段配置中分页数量pageSize来限定关联查询的返回结果数量。可选项可以使用domainSize来限定可选项返回结果数量,由前端从字段元数据中获取并设置为可选项查询分页数量限制。

#### 反转关系

一对多关联关系可以设置inverse为true反转关系,反转关系后关联关系存储在一对多关系中“一”这一端。

#### 引用字段

引用字段可以通过与其他字段建立引用关系来获取数据。

当引用字段的store属性为true时,则字段值为存储的字段值,数据存储时将被引用字段值存储到数据存储中(unset掉被引用字段,则直接存储引用字段值);当store属性为false时,则数据为被引用字段的字段值且不会存储。

Oinone社区 作者:史, 昂原创文章,如若转载,请注明出处:https://doc.oinone.top/oio4/9281.html

访问Oinone官网:https://www.oinone.top获取数式Oinone低代码应用平台体验

Like (0)
史, 昂's avatar史, 昂数式管理员
Previous 2024年5月23日
Next 2024年5月23日

相关推荐

  • 流程设计

    1.流程设计 进入流程设计页之后可以进行流程名称、流程说明的编辑,可以进行流程设计,流程参数配置,保存和发布。 1.1 流程配置 点击进入流程配置页面,若需要配置一些参数供流程使用,可在此添加和删除。删除流程参数时,若该参数已在流程中被使用则无法删除。参数支持文本、数值、日期、布尔四种类型。 1.2 保存 点击后流程设计进行存档,流程设计不完整也支持保存,下次进入流程设计回到保存的页面。 1.3 发布 第一次发布时右上角发布显示文字为发布流程,后续发布按钮显示文字为更新发布。发布后流程才会按照设计触发,首次发布和更新发布的逻辑一致,若流程中有未解决的错误则无法发布不成功,发布成功后页面跳转到显示全部流程的页面,流程状态为已启用、已更新。

    2024年6月20日
    1.3K00
  • 3.3.4 模型的继承

    在我们的很多项目中,客户都是有个性化需求的,就像我们不能找到两件一模一样的东西,何况是企业的经营与管理思路,多少都会有差异。常规的方式只能去修改标准产品的逻辑来适配客户的需求。导致后续标品维护非常困难。而在介绍完这节以后是不是让你更加清晰认知到我们2.4.2【oinone独特性之每一个需求都可以是一个模块】一文中所表达的特性带来的好处呢? 一、继承方式 继承方式可以分为五种: 抽象基类ABSTRACT,只保存不希望为每个子模型重复键入的信息的模型,抽象基类模型不生成数据表存储数据,只供其他模型继承模型可继承域使用,抽象基类可以继承抽象基类。 扩展继承EXTENDS,子模型与父模型的数据表相同,子模型继承父模型的字段与函数。存储模型之间的继承默认为扩展继承。 多表继承MULTI_TABLE,父模型不变,子模型获得父模型的可继承域生成新的模型;父子模型不同表,子模型会建立与父模型的一对一关联关系字段(而不是交叉表),使用主键关联,同时子模型会通过一对一关联关系引用父模型的所有字段。多表继承父模型需要使用@Model.MultiTable来标识,子模型需要使用@Model.MultiTableInherited来标识。 代理继承PROXY,为原始模型创建代理,可以增删改查代理模型的实体数据,就像使用原始(非代理)模型一样。不同之处在于代理继承并不关注更改字段,可以更改代理中的元信息、函数和动作,而无需更改原始内容。一个代理模型必须仅能继承一个非抽象模型类。一个代理模型可以继承任意数量的没有定义任何模型字段的抽象模型类。一个代理模型也可以继承任意数量继承相同父类的代理模型。 临时继承TRANSIENT,将父模型作为传输模型使用,并可以添加传输字段。 二、继承约束 通用约束 对于扩展继承,查询的时候,父模型只能查询到父模型字段的数据,子模型可以查询出父模型及子模型的字段数据(因为派生关系所以子模型复刻了一份父模型的字段到子模型中)。 系统不会为抽象基类创建实际的数据库表,它们也没有默认的数据管理器,不能被实例化也无法直接保存,它们就是用来被继承的。抽象基类完全就是用来保存子模型们共有的内容部分,达到重用的目的。当它们被继承时,它们的字段会全部复制到子模型中。 系统不支持非jar包依赖模型的继承。 多表继承具有阻断效应,子模型无法继承多表继承父模型的存储父模型的字段,需要使用@Model.Advanced注解的inherited属性显示声明继承父模型的父模型。但是可以继承多表继承父模型的抽象父模型的字段。 可以使用@Model.Advanced的unInheritedFields和unInheritedFunctions属性设置不从父类继承的字段和函数。 跨模块继承约束 如果模型间的继承是跨模块继承,应该与模型所属模块建立依赖关系;如果模块间有互斥关系,则不允许建立模块依赖关系,同理模型间也不允许存在继承关系。 跨模块代理继承,对代理模型的非inJvm函数调用将使用远程调用方式;跨模块扩展(同表)继承将使用本地调用方式,如果是数据管理器函数,将直连数据源。 模型类型与继承约束 抽象模型可继承:抽象模型(Abstract) 临时模型可继承:抽象模型(Abstract)、传输模型(Transient) 存储模型可继承:抽象模型(Abstract)、存储模型(Store)、存储模型(多表,Multi-table Store),不可继承多个Store或Multi-table Store 多表存储模型(父)可继承:同扩展继承 多表存储模型(子)在继承单个Multi-table Store后可继承:抽象模型(Abstract)、存储模型(Store),不可继承多个Store 代理模型可继承: 抽象模型(Abstract),须搭配继承Store、Multi-table Store或Proxy 存储模型(Store),不可继承多个Store或Multi-table Store 存储模型(多表,Multi-table Store),不可继承多个Store或Multi-table Store 代理模型(Proxy),可继承多个Proxy,但多个父Proxy须继承自同一个Store或Multi-table Store,且不能再继承其他Store或Multi-table Store 同名字段以模型自身字段为有效配置,若模型自身不存在该字段,继承字段以第一个加载的字段为有效配置,所以在多重继承的情况下,未避免继承同名父模型字段的不确定性,在自身模型配置同名字段来确定生效配置。 三、继承的使用场景 模型的继承可以继承父模型的元信息、字段、数据管理器和函数 抽象基类 解决公用字段问题 扩展继承 解决开放封闭原则、跨模块扩展等问题 多表继承 解决多型派生类字段差异问题和前端多存储模型组合外观问题 代理继承 解决同一模型在不同场景下的多态问题(一表多态) 临时继承 解决使用现有模型进行数据传输问题 举例,前端多存储模型组合外观问题可通过多表继承的子模型,并一对一关联到关联模型,同时使用排除继承字段去掉不需要继承的字段。子模型通过默认模型管理器提供查询功能给前端,默认查询会查询子模型数据列表并在列表行内根据一对一关系查出关联模型数据合并,关联模型数据展现形态在行内是平铺还是折叠,在详情是分组还是选项卡可以自定义view进行配置 扩展继承 父子同表,模型在所有场景都有一致化的表现,意味着原模型被扩展成了新模型,父子模型的表名一致,模型编码不同,可覆盖父模型的模型管理器、数据排序规则、函数 多表继承 父子多表,父子间有隐式一对一关系,即父子模型都增加了一对一关联关系字段,同时父模型的字段被引用到子模型,且引用字段为只读字段,意味着子模型不可以直接更改父模型的字段值,子模型不继承父模型的模型管理器、数据排序规则、函数,子模型拥有自己的默认模型管理器、数据排序规则、函数。多表继承具有阻断效应,子模型无法自动多表继承父模型的存储父模型,需要显式声明多表继承父模型的存储父模型。 代理继承 代理模型继承并可覆盖父模型的模型管理器、数据排序规则、函数,同时可以使用排除继承字段和函数来达到不同场景不同视觉交互的效果。 图3-3-4-1 继承的使用场景 四、抽象基类(举例) 参考前文中3.3.2【模型的类型】一文中关于抽象模型的介绍 五、多表继承(举例) 场景设计如下 图3-3-4-2 多表继承设计场景 Step1 新建宠物品种、宠狗品种和萌猫品种模型 新建宠物品种模型,用@Model.MultiTable(typeField = "kind"),申明为可多表继承父类,typeField指定为kind字段 package pro.shushi.pamirs.demo.api.model; import pro.shushi.pamirs.meta.annotation.Field; import pro.shushi.pamirs.meta.annotation.Model; import pro.shushi.pamirs.meta.base.IdModel; @Model.MultiTable(typeField = "kind") @Model.model(PetType.MODEL_MODEL) @Model(displayName="品种",labelFields = {"name"}) public class PetType extends IdModel { public static final String MODEL_MODEL="demo.PetType"; @Field(displayName = "品种名") private String name; @Field(displayName = "宠物分类") private String kind; } 图3-3-4-3 多表继承示例代码 新建宠狗品种模型,用@Model.MultiTableInherited(type = PetDogType.KIND_DOG),申明以多表继承模式继承PetType,覆盖kind字段(用defaultValue设置默认值,用invisible = true设置为前端不展示),更多模块元数据以及模型字段元数据配置详见4.1.6【模型之元数据详解】一文 package pro.shushi.pamirs.demo.api.model; import pro.shushi.pamirs.meta.annotation.Field; import pro.shushi.pamirs.meta.annotation.Model; @Model.MultiTableInherited(type = PetDogType.KIND_DOG) @Model.model(PetDogType.MODEL_MODEL) @Model(displayName="宠狗品种",labelFields = {"name"}) public class PetDogType extends PetType { public static final String MODEL_MODEL="demo.PetDogType"; public static final String KIND_DOG="DOG"; @Field(displayName = "宠物分类",defaultValue = PetDogType.KIND_DOG,invisible = true) private String kind; } 图3-3-4-4 多表继承示例代码 新建萌猫品种模型,用@Model.MultiTableInherited(type = PetCatType.KIND_CAT),申明以多表继承模式继承PetType,覆盖kind字段(用defaultValue设置默认值,用invisible = true设置为前端不展示),并新增一个CatShapeEnum枚举类型的字段shape package pro.shushi.pamirs.demo.api.enumeration; import pro.shushi.pamirs.meta.annotation.Dict; import pro.shushi.pamirs.meta.common.enmu.BaseEnum; @Dict(dictionary = CatShapeEnum.DICTIONARY,displayName = "萌猫体型") public class CatShapeEnum extends BaseEnum<CatShapeEnum,Integer>…

    2024年5月23日
    1.7K00
  • 3.5 Oinone以交互为外在

    交互组件(UI Componment): 用组件化的方式统一管理:菜单、布局、视图 用Action做衔接,来勾绘出模块的前端交互拓扑,描述所有可操作行为 oinone的页面路由串联规则是以菜单为导航,用Action做衔接,用View做展示,详见3.5.2.1View的【整体介绍】。 本章节会重点介绍: 如何定义菜单、视图、行为以及其初始化 xml配置:视图配置(包括字段联动)、字段配置、布局配置、动作配置 前端组件自定义

    Oinone 7天入门到精通 2024年5月23日
    1.2K00
  • 6.1 文件与导入导出(改)

    导入导出在一定程度上是企业级软件和效率工具(office工具)的桥梁 文件的上传下载以及业务数据的导入导出是企业级软件一个比较常规的需求,甚至是巨量的需求。业务有管理需要一般都伴随有导入导出需求,导入导出在一定程度上是企业级软件和效率工具(office工具)的桥梁。oinone的文件模块就提供了通用的导入导出实现方案,以简单、一致、可扩展为目标,简单是快速入门,一致是用户操作感知一致、可扩展是满足用户最大化的自定义需求。 下图为文件导入导出的实现示意图,大家可以做一个整体了解 图6-1-1 文件导入导出实现示意图 一、基础能力 准备工作 pamirs-demo-api的pom文件中引入pamirs-file2-api包依赖 <dependency> <groupId>pro.shushi.pamirs.core</groupId> <artifactId>pamirs-file2-api</artifactId> </dependency> 图6-1-2 引入pamirs-file2-api包依赖 DemoModule增加对FileModule的依赖 @Module(dependencies = {FileModule.MODULE_MODULE}) 图6-1-3 DemoModule增加对FileModule的依赖 pamirs-demo-boot的pom文件中引入pamirs-file2-core包依赖 <dependency> <groupId>pro.shushi.pamirs.core</groupId> <artifactId>pamirs-file2-core</artifactId> </dependency> 图6-1-4 启动工程引入pamirs-file2-core包依赖 pamirs-demo-boot的application-dev.yml文件中增加配置pamirs.boot.modules增加file,即在启动模块中增加file模块 pamirs: boot: modules: – file 图6-1-5 pamirs-demo-boot的application-dev.yml文件中增加配置 pamirs-demo-boot的application-dev.yml文件中增加oss的配置。更多有关文件相关配置详见4.1.1【模块之yml文件结构详解】一文 cdn: oss: name: 阿里云 type: OSS bucket: demo uploadUrl: #换成自己的oss上传服务地址 downUrl: #换成自己的oss下载服务地址 accessKeyId: #阿里云oss的accessKeyId accessKeySecret: #阿里云oss的accessKeySecret mairDir: upload/demo #换成自己的目录 validTime: 360000 timeout: 60000 active: true referer: www.shushi.pro 图6-1-6 application-dev.yml文件中增加oss的配置 其他文件系统支持 a. 文件系统类型 类型 服务 OSS 阿里云 UPYUN 又拍云 MINIO Minio HUAWEI_OBS 华为云 LOCAL 本地文件存储 表6-1-1 支持的文件系统类型 b. OSS配置示例 ⅰ. 华为云OBS cdn: oss: name: 华为云 type: HUAWEI_OBS bucket: pamirs #(根据实际情况修改) uploadUrl: obs.cn-east-2.myhuaweicloud.com downloadUrl: obs.cn-east-2.myhuaweicloud.com accessKeyId: 你的accessKeyId accessKeySecret: 你的accessKeySecret # 根据实际情况修改 mainDir: upload/ validTime: 3600000 timeout: 600000 active: true allowedOrigin: http://192.168.95.31:8888,https://xxxx.xxxxx.com referer: 图6-1-7 OBS的配置说明 ⅱ. MINIO cdn: oss: name: minio type: MINIO bucket: pamirs #(根据实际情况修改) uploadUrl: http://192.168.243.6:32190 #(根据实际情况修改) downloadUrl: http://192.168.243.6:9000 #(根据实际情况修改) accessKeyId: 你的accessKeyId accessKeySecret: 你的accessKeySecret # 根据实际情况修改 mainDir: upload/ validTime: 3600000 timeout: 600000 active: true referer: localFolderUrl: 图6-1-8 MINIO的配置说明 ⅲ. 又拍云 cdn: oss: name: 又拍云 type: UPYUN bucket: pamirs #(根据实际情况修改) uploadUrl: v0.api.upyun.com downloadUrl: v0.api.upyun.com accessKeyId: 你的accessKeyId accessKeySecret: 你的accessKeySecret # 根据实际情况修改 mainDir: upload/ validTime: 3600000 timeout: 600000…

    2024年5月23日
    1.4K00

Leave a Reply

Please Login to Comment