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低代码应用平台体验

(0)
史, 昂的头像史, 昂数式管理员
上一篇 2024年5月23日
下一篇 2024年5月23日

相关推荐

  • 业务审计

    整体介绍 业务审计是指通过跟踪用户在平台业务应用中的各类行为操作以及关联的数据变化,支撑企业业务审计所需。平台提供可视化审计规则配置,根据审计规则记录行为日志,其中日志包括登录日志、应用日志; 登录日志:记录平台用户登录行为。 应用日志:针对已订阅的审计规则记录用户操作信息,是用户在各应用中操作行为留痕记录。 审计规则:业务审计中,数据变化订阅记录的规则,是记录应用日志的规则。 操作入口:应用中心——业务审计应用。

    Oinone 7天入门到精通 2024年6月20日
    1.0K00
  • 7.3.2 原业务加审批流程

    场景说明 场景描述:全员营销标准产品的功能并未有任务发放的审批流,在实际执行中,当营销专员配置好任务后,需部门领导对整个活动如该任务内容、形式、参与人员进行审批。 业务需求:在发布任务这个流程中增加审批节点。 实战训练 Step1 原业务分析 点击菜单【任务中心】通过URL上的model参数找到对应模型编码为【gemini.biz.GeminiTaskProxy】 进入模型设计器主页面,应用选择【全员营销】、选择【系统模型】、通过搜索关键字【任务】选择【Gemini任务代理】,展示方式从图模式切换到表单模式,对比【模型编码】 但目前模型为代理模型,代理模型是用于代理存储模型的数据管理器能力,同时又可以扩展出非存储数据信息的交互功能的模型。因为在代理模型中新增的字段都是非存储字段,所以如果要增加【审核状态】的字段一定以要在存储模型增加。其父模型的查看有两种方式 表单模式下可以直接看父模型 在图模式和表单模式下点击继承关系 点击【Gemini任务】,进入【Gemini任务】的模型设计界面,可以看出该模型所在模块为【全员营销核心业务】,从【系统字段】中找到【任务状态】字段,点击查看字段详情,我们可以看到【业务类型】为数据字典,字典类型为【任务状态】。 在模型设计器的管理页面上方点击【数字字典】选项卡,模块选择为【全员营销核心业务】,选择【系统字典】就可以查看到【任务状态】数字字典 总结如下: 给【Gemini任务】模型增加一个【任务审批状态】,记录审批状态 在任务创建的时候,修改【任务状态】为【关闭】确保任务未审批通过的时,用户无法操作该任务。 审批通过后,恢复【任务状态】为【初始化】 我们先来整理下核心流程即:任务审批流程。 Step2 利用模型设计器设计模型 在模型设计器的管理页面上方点击【数字字典】选项卡,模块选择为【全员营销核心业务】,点击添加【数据字典】按钮,设置对应数据项 设置【字典名称】为【审批状态】 设置【字典项类型】为【文本】 通过【添加数据字典项】按钮增加对应数据字典项,如审核中、审核失败、审核成功 在模型设计器的管理页面上方点击【模型】选项卡,模块选择为【全员营销核心业务】,选择【系统模型】、搜索任务选择【Gemini任务】,点击添加字段 为模型【Gemini任务】添加字段 设置【字段名称】为【任务审批状态】 设置【字段业务类型】为数据字典,并选择关联数据字典为【任务审批状态】 最后点击【创建】按钮完成操作 回到【Gemini任务】设计区,我们可以看到在模型的【自定义字段】选项卡下方多了一个【任务审批状态】字段 Step3 利用界面设计器,设计出必要的审核页面 进入界面设计器,应用选择全员营销,模型选择【Gemini任务】,点击添加页面下的直接创建 设置页面标题、模型(自动带上可切换)、业务类型(运营管理后续会扩展其他类型)、视图类型(表单)后点击确认按钮进入【Gemini任务】表单设计页面 进入页面设计器,对【Gemini任务】表单页面进行设计(更多细节介绍,请参考界面设计产品使用手册) 左侧为物料区:分为组件、模型。 【组件】选项卡下为通用物料区,我们可以为页面增加对应布局、字段(如同在模型设计器增加字段)、动作、数据、多媒体等等 【模型】选项卡下为页面对应模型的自定义字段、系统字段、以及模型已有动作 中间是设计区域 右侧为属性面板,在设计区域选择中组件会显示对应组件的可配置参数 在左侧【组件】选项卡下,拖入布局组件【分组】,并设置组件【标题属性】为基础信息 在左侧【模型】选项卡下,分别系统字段中的【任务标题】、【任务开始时间】、【任务结束时间】、【视频标题】、【视频风格】、【任务描述】拖入【基础信息】分组,并点击【任务描述】,在右侧属性面板的【交互】分组中设置宽度为1。最后别忘了点击【发布】按钮完成页面的发布 Step4 通过流程设计器,设计对应业务流程 进入流程设计器,点击【创建】按钮 注意:流程中需要获取【关系字段】的除关联字段(一般为ID)以外的字段需要通过【数据获取】节点单独获取【关系字段】的对象数据。所以在流程设计中经常会用到【数据获取】节点 左上角编辑流程名称为【任务审批流程】,点击第一个【触发】节点,触发方式选择模型触发,模型选择【Gemini任务】,触发场景选择【新增或更新数据时】,【筛选条件】设置为【任务审批状态】为空或【任务审批状态】等于【审核中】,点击该节点的【保存】按钮 点击流程图节点间的【+】图标选择增加【获取数据】节点,或者拖动左侧物料区【获取数据】到特定的【+】图标 点击【获取数据】,在右侧属性面板中设置【获取数据条数】为多条,选择模型为【Gemini用户任务实例】,点击【筛选条件】的【{X}】图标,进行数据获取的条件设置 选择条件字段为【任务ID】条件操作符为【等于】,条件为变量的导购字段的ID。当上下文只有一个变量时默认不需要选择,这里默认的是【模型触发:[Gemini任务]】,设置好以后点击确认,回到属性面板设置【未获取到数据时执行方式】为【终止流程】,并点击节点【保持】按钮 增加【更新数据】节点,在右侧属性面板中 【更新模型】选择【模型触发:[Gemini任务]】 【字段列表】点击【创建】按钮 字段选择 更新【任务状态】字段 表达式设置为:【已关闭】。 【字段列表】点击【创建】按钮 字段选择 更新【任务审核状态】字段 表达式设置为:【审核中】。 最终完成的【模型触发:[Gemini任务]】更新设置 a. 【模型触发:[Gemini任务]】的【任务状态】字段等于数字字典的【已关闭】,任务审核状态为【审核中】 b. 最后点击节点【保持】按钮。 再增加【更新数据】节点,在右侧属性面板中 【更新模型】选择【获取数据[Gemini用户任务实例]】 【字段列表】点击【创建】按钮 字段选择 更新【任务状态】字段 表达式设置为:【已关闭】。 最终完成的【获取数据[Gemini用户任务实例]】更新设置 a. 【获取数据[Gemini用户任务实例]】的【任务状态】字段等于数字字典的【已关闭】 b. 最后点击节点【保持】按钮。 增加【审批】节点,在右侧属性面板中 【审批模型】选择模型为【模型触发:[Gemini任务]】 【选择视图】选择前面新建的页面【流程中的任务编辑页】 【审批人】选择角色为【超级管理员】 【数据】权限全部设置为【查看】 其他配置项默认,需要了解更多请查看产品使用手册 最后点击节点【保持】按钮。 新增【审核分支】,在【通过】分支中增加两个数据更新节点,跟审核前的两个数据更新节点对应 【模型触发:[Gemini任务]】的【任务状态】字段等于数字字典的【初始化】,任务审核状态为【审核通过】 【获取数据[Gemini用户任务实例]】的【任务状态】字段等于数字字典的【初始化】 流程确保保持并发布过,点击右上角【发布流程】完成流程的保存与发布 Step5 检验效果 创建任务后,任务状态为【关闭】状态,任务列表中的任务状态为多个状态的计算值 审核通过后,任务状态为【进行中】状态,任务列表中的任务状态为多个状态的计算值

    2024年5月23日
    89100
  • 3.3.9 字段类型之关系与引用

    有关系与引用类型才让oinone具备完整的描述模型与模型间关系的能力 在PetShop以及其代理模型中已经上用到了O2M、M2O字段,分别如petItems(PetItem)和create(PamrisUser)字段,但是没有过多的讲解。本文重点举例RELATED、M2M、O2M,至于M2O留给大家自行尝试。 一、引用类型(举例) 业务类型 Java类型 数据库类型 规则说明 RELATED 基本类型或关系类型 不存储或varchar、text 引用字段【数据库规则】:点表达式最后一级对应的字段类型;数据库字段值默认为Java字段的序列化值,默认使用JSON序列化【前端交互规则】:点表达式最后一级对应的字段控件类型 表3-3-9-1 字段引用类型 Step1 修改PetShopProxy类 为PetShopProxy类新增一个引用字段relatedShopName,并加上@Field.Related("shopName")注解 为PetShopProxy类新增一个引用字段createrId,并加上@Field.Related({"creater","id"})注解 package pro.shushi.pamirs.demo.api.proxy; import pro.shushi.pamirs.demo.api.model.PetShop; import pro.shushi.pamirs.meta.annotation.Field; import pro.shushi.pamirs.meta.annotation.Model; import pro.shushi.pamirs.meta.enmu.ModelTypeEnum; import pro.shushi.pamirs.user.api.model.PamirsUser; @Model.model(PetShopProxy.MODEL_MODEL) @Model.Advanced(type = ModelTypeEnum.PROXY) @Model(displayName = "宠物店铺代理模型",summary="宠物店铺代理模型") public class PetShopProxy extends PetShop { public static final String MODEL_MODEL="demo.PetShopProxy"; @Field.many2one @Field(displayName = "创建者",required = true) @Field.Relation(relationFields = {"createUid"},referenceFields = {"id"}) private PamirsUser creater; @Field.Related("shopName") @Field(displayName = "引用字段shopName") private String relatedShopName; @Field.Related({"creater","id"}) @Field(displayName = "引用创建者Id") private String createrId; } 图3-3-9-1 修改PetShopProxy类 Step2 重启系统查看效果 我们发现商店管理-列表页面多出了两个有值字段:引用字段shopName和引用创建者Id 图3-3-9-2 商店管理-列表页面新增两个有值字段 二、关系类型 业务类型 Java类型 数据库类型 规则说明 O2O 模型/DataMap 不存储或varchar、text 一对一关系 M2O 模型/DataMap 不存储或varchar、text 多对一关系 O2M List<模型/DataMap> 不存储或varchar、text 一对多关系 M2M List<模型/DataMap> 不存储或varchar、text 多对多关系 表3-3-9-2 字段关系类型 多值字段或者关系字段需要存储,默认使用JSON格式序列化。多值字段数据库字段类型默认为varchar(1024);关系字段数据库字段类型默认为text。 关系字段 关联关系用于描述模型间的关联方式: 多对一关系,主要用于明确从属关系 一对多关系,主要用于明确从属关系 多对多关系,主要用于弱依赖关系的处理,提供中间模型进行关联关系的操作 一对一关系,主要用于多表继承和行内合并数据 图3-3-9-3 字段关联关系 名词解释 关联关系比较重要的名词解释如下: 关联关系:使用relation表示,模型间的关联方式的一种描述,包括关联关系类型、关联关系双边的模型和关联关系的读写 关联关系字段:业务类型ttype为O2O、O2M、M2O或M2M的字段 关联模型:使用references表示,自身模型关联的模型 关联字段:使用referenceFields表示,关联模型的字段,表示关联模型的哪些字段与自身模型的哪些字段建立关系 关系模型:自身模型 关系字段:使用relationFields表示,自身模型的字段,表示自身模型的哪些字段与关联模型的哪些字段建立关系 中间模型,使用through表示,只有多对多存在中间模型,模型的relationship=true 举例M2M关系类型 多对多关系,主要用于弱依赖关系的处理,提供中间模型进行关联关系的操作。这也是在业务开发中很常见用于描述单据间关系,该例子会举例两种方式描述多对多关系中间表,一是中间表没有在系统显示定义模型,二种是中间表显示定义模型。第一种往往仅是维护多对多关系,第二种往往用于多对多关系中间表自身也需要管理有业务含义,中间表模型还经常额外增加其他字段。 一是中间表没有在系统显示定义模型:如果出现跨模块的场景,在分布式环境下两个模块独立启动,有可能会导致系统关系表被删除的情况发生,因为没有显示定义中间表模型,中间表的模型所属模块会根据两边模型的名称计算,如果刚好被计算到非关系字段所属模型的模块。那么单独启动非关系字段所属模型的模块,则会导致删除关系表。 为什么不直接把中间表的模型所属模块设置为关系字段所属模型的模块?因为如果这样做,当模型两边都定义了多对多关系字段则会导致M2M关系表的所属模块出现混乱。 所以这里建议大家都选用:第二种中间表显示定义模型,不论扩展性还是适应性都会好很多。请用:through=XXXRelationModel.MODEL_MODEL 或者 throughClass=XXXRelationModel.class Step1 新建宠物达人模型,并分别为宠物商品和宠物商店增加 到宠物达人模型的字段 新建宠物达人模型PetTalent package pro.shushi.pamirs.demo.api.model; import pro.shushi.pamirs.meta.annotation.Field; import pro.shushi.pamirs.meta.annotation.Model; @Model.model(PetTalent.MODEL_MODEL) @Model(displayName = "宠物达人",summary="宠物达人",labelFields ={"name"}) public class PetTalent extends AbstractDemoIdModel{ public static final String MODEL_MODEL="demo.PetTalent"; @Field(displayName = "达人") private String name; } 图3-3-9-4 新建宠物达人模型PetTalent 修改宠物商品模型,新增many2many字段petTalents,类型为List ,并加上注解@Field.many2many(relationFields = {"petItemId"},referenceFields = {"petTalentId"},through = PetItemRelPetTalent.MODEL_MODEL),through为指定关联中间表。 package pro.shushi.pamirs.demo.api.model; import pro.shushi.pamirs.demo.api.tmodel.PetItemDetail; import pro.shushi.pamirs.meta.annotation.Field; import…

    2024年5月23日
    1.2K00
  • 4.2.5 框架之网络请求-Request

    在中后台业务场景中,大部分的请求时候是可以被枚举的,比如创建、删除、更新、查询。在上文中,我们讲了httpClient如何自定义请求,来实现自己的业务诉求。本文中讲到的Request是离业务更近一步的封装,他提供了开箱即用的API,比如insertOne、updateOne,它是基于HttpClient做的二次封装,当你熟悉Request时,在中后台的业务场景中,所有的业务接口自定义将事半功倍。 一、Request详细介绍 元数据-model 获取模型实例 import { getModel } from '@kunlun/dependencies' getModel('modelName'); 图4-2-5-1 获取模型实例 清除所有缓存的模型 import { cleanModelCache } from '@kunlun/dependencies' cleanModelCache(); 图4-2-5-2 清除所有缓存的模型 元数据-module 获取应用实例,包含应用入口和菜单 import { queryModuleByName } from '@kunlun/dependencies' queryModuleByName('moduleName') 图4-2-5-3 获取应用实例 查询当前用户所有的应用 import { loadModules } from '@kunlun/dependencies' loadModules() 图4-2-5-4 查询当前用户所有的应用 query 分页查询 import { queryPage } from '@kunlun/dependencies' queryPage(modelName, { pageSize: 15, // 一次查询几条 currentPage, 1, // 当前页码 condition?: '' // 查询条件 maxDepth?: 1, // 查几层模型出来,如果有2,会把所有查询字段的关系字段都查出来 sort?: []; // 排序规则 }, fields, variables, context) 图4-2-5-5 分页查询 自定义分页查询-可自定义后端接口查询数据 import { customQueryPage } from '@kunlun/dependencies' customQueryPage(modelName, methodName, { pageSize: 15, // 一次查询几条 currentPage, 1, // 当前页码 condition?: '' // 查询条件 maxDepth?: 1, // 查几层模型出来,如果有2,会把所有查询字段的关系字段都查出来 sort?: []; // 排序规则 }, fields, variables, context) 图4-2-5-6 自定义分页查询 查询一条-根据params匹配出一条数据 import { queryOne } from '@kunlun/dependencies' customQueryPage(modelName, params, fields, variables, context) 图4-2-5-7 根据params匹配出一条数据 自定义查询 import { customQuery } from '@kunlun/dependencies' customQuery(methodName, modelName, record, fields, variables, context) 图4-2-5-8 自定义查询 update import { updateOne } from '@kunlun/dependencies' updateOne(modelName, record, fields, variables, context) 图4-2-5-9 update insert import { insertOne } from '@kunlun/dependencies' insertOne(modelName, record, fields, variables, context) 图4-2-5-10 insert delete import { deleteOne } from '@kunlun/dependencies'…

    2024年5月23日
    1.0K00

Leave a Reply

登录后才能评论