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日

相关推荐

  • 第2章 Oinone的技术独特性

    本章的主要目的是通过分析企业商业支撑软件的项目特性和关注点,找到企业软件发展的另一个本质变化——新技术流派的产生。在对“互联网架构做为最佳实践为何失效”的思考基础上,我们分析互联网中台架构的发展历史以及企业实际现状,找出其水土不服的原因。进而引出Oinone的低代码开发平台如何结合互联网架构并完成创新,以满足企业数字化转型的需求。 具体而言,本章包括以下内容: 企业软件发展的另一个本质变化:新技术流派的产生; 最佳实践为何失效?Oinone如何打造具有企业特色的互联网架构; Oinone独特性之源:元数据与设计原则; Oinone独特性之单体与分布式的灵活切换; Oinone独特性之每一个需求都是一个模块; Oinone独特性之低无一体。

    Oinone 7天入门到精通 2024年5月23日
    1.8K00
  • 报表

    1. 业务场景 报表不局限于表格的样式,还能以各式各样的图表形式展现各项汇总数据 这有利于管理者更为直观地了解公司的经营情况,便于后续进行分析,提高对公司的管理水平。 2. 操作流程 1)进入数据可视化,进入报表tab,维护分组信息; 2)在二级分组名称后点击“+”【添加报表】,对报表进行编辑设计; 3)创建完成后可以【编辑】报表标题、备注; 4)需要通过【选择图表、创建图表】完善报表内容; 5)完善后可以点击【发布】报表,则报表此时可以被引用; 6)如果报表有更新,则可以点击【更新发布】,使业务系统引用对报表变为最新的报表信息; 7)如果报表数据不再可以公开使用,则需要通过【隐藏】功能将报表的引用权限收起,此时数据大屏、前端业务系统均不可再引用该报表,但不影响已被引用的报表; 8)隐藏后可以【取消隐藏】,报表恢复隐藏前的状态和功能,可以被引用。 3. 操作流程图解 3.1 创建分组 1)操作流程:创建分组 2)操作路径:数据可视化-报表-创建分组 3)点击搜索框后的「+」创建一级分组,输入一级分组名称后,点击一级分组后的「+」创建二级分组,输入二级分组名称后,此时分组创建完成,可以在二级分组下创建报表 3.2 编辑分组名称 1)操作流程:选择分组-编辑分组名称 2)操作路径:数据可视化-报表-编辑分组名称 3)鼠标移动至需要修改的分组上,点击出现的「编辑图标」,可以修改分组名称,修改后分组名称实时更新 3.3 删除分组 1)操作流程:选择分组-删除分组 2)操作路径:数据可视化-报表-删除分组 3)鼠标移动至需要删除的分组上,当分组下无报表时出现「删除图标」,可以点击图标后删除分组,删除一级分组时对应所有的二级分组也会被删除,删除后消失,只要分组下没有报表的分组才能直接删除成功 3.4 创建报表 1)操作流程:选择二级分组-创建报表 2)操作路径:数据可视化-报表-二级分组-创建报表 3)鼠标移动至需要创建报表的二级分组上,出现「+」,点击图标后=需要填写报表标题; a. 报表标题:最大支持20个字,支持汉字、数字、大小写字母、-;同个一级分组下不允许重复; 4)创建后可以选择报表需要展示的图表 3.5 删除报表 1)操作流程:选择报表-删除报表 2)操作路径:数据可视化-报表-二级分组-报表名称-删除图表 3)未发布或者已发布但没有被隐藏的报表,并且没被前端或者数据大屏引用,才展示报表菜单名称后的删除图标 4)删除报表后报表消失 3.6 选择图表 1)操作流程:选择报表-为报表选择图表 2)操作路径:数据可视化-报表-二级分组-报表名称-选择图表 3)选择单个未发布或者已发布但没有被隐藏的报表,点击【选择图表】,弹出“选择图表”弹窗,对该报表需要展示的图表进行选择 a. 需要选择图表的一级分组后才能选择图表; b. 可以多选图表,选择的图表只能是已选一级分组下的未隐藏的未被选择的图表;选择一个二级分组时,默认该二级分组下的图表会全部被选中,图表会按照选中的顺序展示在报表列表; 4)选择图表后,报表信息保持展示图表的最新效果;如果图表更新了,但是报表没有发布最新,则报表在前端展示的仍为最近发布的版本; 5)如果图表中存在超过一行的图内筛选项,则在报表处原始的图表尺寸只能查看一行图内筛选项,需要根据图表在报表处的等比拖动效果展示更多的图内筛选项 3.7 创建图表 1)操作流程:选择报表-创建图表 2)操作路径:数据可视化-报表-二级分组-创建图表 3)选择单个未发布或者已发布但没有被隐藏的报表,点击【创建图表】,弹出“创建图表”弹窗,需要填写图表标题、模型、方法; a. 图表标题:最大支持20个字,支持汉字、数字、大小写字母、-;同个一级分组下不允许重复; b. 模型:需要选择来源数据对应的模型; c. 方法:选择模型后需要选择方法,方法是用来提取模型数据的逻辑; 4)选择成功后进入图表设计页面,创建图表保存后返回,返回到当前报表页面,新创建的图表展示在报表的第一个位置 3.8 拖拽图表 1)操作流程:选择报表-拖拽图表 2) 操作路径:数据可视化-报表-二级分组-报表名称-拖拽图表 3)所有的报表均可拖拽图表,拖拽时需要选择图表,可以上下左右等比拖动,图表的内容也会根据拖动的比例进行缩放,展示全部的被遮挡图表内容 4)拖拽后实时生效,报表信息保持展示最新效果 3.9 移除图表 1)操作流程:选择报表-移除图表 2)操作路径:数据可视化-报表-二级分组-报表名称-移除图表 3)未发布或者已发布但没有被隐藏的报表,并且没被前端或者数据大屏引用,此时可以针对不需要的图表进行移除 4)选择移除后不展示在报表中,不影响原图表 5)报表移除图表后实时更新,更新发布后,前端可以展示最新的报表信息,如果未发布,则仅数据大屏可展示最新的报表信息,前端仍为最近发布的报表 3.10 设置报表筛选项 1)操作流程:选择报表-设置报表筛选项 2)操作路径:数据可视化-报表-二级分组-报表名称-更多-报表筛选项-添加 3)添加时选择筛选项字段的类型,关联每个图表对应的字段,一个图表只能关联一个 4)关联后可以按关联字段查询图表数据 3.11 发布 1)操作流程:选择报表-发布报表 2)操作路径:数据可视化-图表-二级分组-报表-发布 3)选择单个未发布且没有被隐藏的报表,点击【发布】按钮,报表发布后可以被前端引用,报表状态变为已发布,展示最近发布时间; 4)如果报表发布后有更新内容,会展示的更新类型:更新报表信息/更新图表内容/选择图表/移除图表 3.12 查看最近一次发布的版本 1)操作流程:选择报表-查看最近一次发布的版本 2)操作路径:数据可视化-报表-二级分组-报表名称-查看最近一次发布的版本 3)当报表发布后有更新,在最近发布时间左侧展示【查看】,在最近发布时间下展示更新的类型,点击查看可以查看最近发布的版 3.13 更新发布 1)操作流程:选择报表-更新发布报表 2)操作路径:数据可视化-报表-二级分组-报表名称-更新发布报表 3)选择单个已发布且没有被隐藏的报表,并且该报表在上次发布后有所更新,可以点击【更新发布】按钮,将最新的报表内容发布至业务系统,业务系统引用的报表为最新内容; 4)如果更新了内容,但未点击更新发布,则前端业务系统查看的报表仍为最近发布的报表 3.14 隐藏 1)操作流程:选择报表-隐藏报表 2)操作路径:数据可视化-报表-二级分组-报表名称-隐藏报表 3)报表默认不隐藏,可以切换是否隐藏=是 a. 未发布的报表,较隐藏前,不可以操作【发布】,可以【取消隐藏】; b. 已发布的图表,较隐藏前,只能操作【导出图片、导出excel、取消隐藏】; c. 隐藏后的报表不可以被引用,但不影响已经被引用的数据 3.15 取消隐藏 1) 操作流程:选择报表-取消隐藏报表 2) 操作路径:数据可视化-报表-二级分组-报表名称-取消隐藏报表 3) 隐藏后的报表可以取消隐藏,切换是否隐藏=否,取消隐藏后,报表恢复隐藏前的状态和功能,可以被引用 3.16 查看引用 1)流程:选择报表-查看被哪些页面引用 2)操作路径:数据可视化-报表-二级分组-报表-更多-查看引用 3)选择具体的报表,查看当前报表被引用的所有信息 3.17 不允许别人编辑 1)流程:选择报表-不允许别人编辑 2)操作路径:数据可视化-报表-二级分组-报表-更多-不允许别人编辑 3)选择自己创建的报表,对报表是否允许其他人编辑进行设置;如果设置为不允许,则其他人无法编辑报表 3.18 不允许别人引用 1)流程:选择图表-更多-不允许别人引用 2)操作路径:数据可视化-报表-二级分组-报表-更多-不允许别人引用 3)选择自己创建的报表,对报表是否允许他人引用进行设置;如果设置为不允许,则其他人无法引用到该报表 3.19 导出图片 1) 操作流程:选择报表-导出图片 2) 操作路径:数据可视化-报表-二级分组-报表名称-导出图片 3) 选择报表后,点击【导出图片】按钮可以将当前报表导出为图片 3.20 导出EXCEL 1)操作流程:选择报表-导出EXCEL 2)操作路径:数据可视化-报表-二级分组-报表名称-报表导出EXCEL 3)选择报表后,点击【导出EXCEL】按钮可以将当前报表导出为EXCEL

    2024年6月20日
    1.9K00
  • 流程类

    1.流程类 1.1 审批 审批节点配置步骤: 添加审批节点 选择审批的模型和视图 设置审批人和通过方式 设置审批人在审批时的操作权限和数据权限 1.1.1 审批节点 审批节点只能放置在有数据可审批的流程链路上,审批分支只能放置在审批节点后。 1.1.2 审批模型和视图 可选的审批模型包含添加的审批节点之前的所有能获取到数据的模型。可选视图为该选择的数据模型关联的界面设计器中视图类型为表单的页面。 1.1.3 审批人和通过方式 审批人可在个人、部门、角色和模型中的字段里复选。当某人在不同类型人员选择中被重复选中,只会收到一次审批的代办。若为多人审批,审批是同步进行的。 单人审批: 通过方式:唯一通过方式,同意通过,拒绝否决 多人审批: 通过方式:或签/会签(默认或签) a. 或签(一名审批人同意或拒绝即可) 任意一位审批人操作通过或否决后流程就结束,其他审批人无法进入审批操作,但是会弹出消息提示审批结果。 场景:紧急且影响不大的审批可以由任意一位领导层或签。 b. 会签(需所有审批人同意才为同意,一名审批人拒绝即为拒绝) 场景:影响比较重大的审批,一票否决的形式决定是否通过。 c. 会签(一名审批人同意即为同意,需所有审批人拒绝才为拒绝) 场景:需要评估项目可操作性时,若有领导觉得有意义就通过,进入下一步评估,全员否决就否决项目。 1.1.4 操作&数据权限 操作权限 可设置是否必填拒绝原因、是否允许转交、是否允许加签、是否允许退回。 选择允许转交或允许加签之后,可选择添加人员的候选名单,不填默认所有人都可选。 选择允许退回后,可以选择退回到该审批节点之前的任意审批节点。ps:需所有审批人拒绝才为拒绝的会签不允许退回。 数据权限 选择视图后自动显示该视图下的数据字段,可选择的权限为查看、编辑、隐藏数据字段,默认可查看全部字段。 1.1.5 参与人重复 勾选参与人重复的场景时,满足场景的审批流程会由系统自动审批通过。 1.2 填写 当流程需要某些人提交数据才能继续时,可以使用填写这个动作。区别于数据类中的操作,填写这个动作只能修改当前触发模型中关联的视图表单,而数据类中的更新数据可以修改其他模型中的数据。 和审批动作相似,填写动作需要选择填写的模型和视图表单,需要选择填写人,可以选择添加转交权限。另外,填写动作必须包含一个及以上的可编辑的数据权限供操作人填写。

    2024年5月23日
    2.1K00
  • 业务域

    1. 业务域介绍 业务域是根据业务域对集成应用、开放接口进行归类管理。在创建集成应用、开发接口时,可选择归属的业务域。 操作入口:集成设计器——业务域。 2. 业务域管理 业务域管理提供新增、删除、搜索操作。 2.1 业务域列表 支持按照编码、名称、描述搜索业务域。 2.2 新增业务域 新增业务域:输入业务域名称、描述新增。 2.3 删除业务域 当前业务域未被其他数据记录引用时,可删除成功,反之如果被引用了,不允许删除。

    2024年6月20日
    2.1K00
  • 5.3 基础支撑之用户与客户域

    一、三户概念 三户由来 介绍下经典的三户模型,它是电信运营支持系统的基础。三户模型即客户、用户和帐户,来源于etom的模型。这三者之间的关系应该是一个相互关联但又是独立的三个实体,这种关联只是一个归属和映射的关系,而三个实体本身是相互独立的,分别是体现完全不同的几个域的信息,客户是体现了社会域的信息,用户体现了业务域的信息,帐户体现的是资金域的信息。 客户:它是个社会化的概念,一个自然人或一个法人 用户:它是客户使用运营商开发的一个产品以及基于该产品之上的增值业务时,产生的一个实体。如果说一个客户使用了多个产品,那么一个客户就会对应好几个用户(即产品) 账户:它的概念起源于金融业,只是一个客户在运营商存放资金的实体,目的是为选择的产品付费 Oinone的三户 在原三户模型中【用户】是购买关系产生的产品与客户关系的服务实例,在互联网发展中用户的概念发生了非常大的变化,【用户】概念变成了:使用者,是指使用电脑或网络服务的人,通常拥有一个用户账号,并以用户名识别。而且新概念在互联网强调用户数的大背景下已经被普遍介绍,再去强调电信行业的用户概念就会吃力不讨好。而且不管是企业应用领域和互联网领域,原用户概念都显得过于复杂和没有必要。也就有了特色的oinone的三户模型: 客户:它是个社会化的概念,一个自然人或一个法人 用户:使用者,是指使用电脑或网络服务的人,通常拥有一个用户账号,并以用户名识别 账户:它的概念起源于金融业,只是一个客户在运营商存放资金的实体,目的是为选择的产品付费 二、Oinone的客户与用户 三户模型是构建上层应用的基础支撑能力,任何业务行为都跟这里两个实体脱不了干系。以客户为中心建立商业关系与商业行为主体,以用户为中心构建一致体验与操作行为主体。在底层设计上二者相互独立并无关联,由上层应用自行作关联绑定,往往在登陆时在Session的处理逻辑中会根据【用户】去找到对应一个或多个【商业(主体)客户】,Session的实现可以参考4.1.20【框架之Session】一文。 图5-3-1 Oinone的客户与用户 客户设计说明 PamirsPartner作为商业关系与商业行为的主体,派生了两个子类PamirsCompany与PamirsPerson分别对应:公司(法人)客户、自然人客户 公司(法人)客户PamirsCompany对应多个组织部门PamirsDepartment,公司(法人)客户PamirsCompany对应多个员工PamirsEmployee 部门PamirsDepartment对应一个公司(法人)客户PamirsCompany,对应多个员工PamirsEmployee 员工PamirsEmployee对应多个部门PamirsDepartment,对应一个或多个公司(法人)客户PamirsCompany,其中有一个主的 用户设计说明 PamirsUser作为一致体验与操作行为主体,本身绑定登陆账号,并且可以关联多个三方登陆账户PamirsUserThirdParty 客户与用户如何关联(举例) 例子设计: 新建demo系统的PetComany和PetEmployee,用PetEmployee去关联用户。 当用户登陆时,根据用户Id找到PetEmployee,在根据PetEmployee找到PetComany,把PetComany放到Session中去 修改PetShop模型关联一个PamirsPartner,PamirsPartner的信息从Session取。 Step1 pamirs-demo-api工程增加依赖,并且DemoModule增加对BusinessModule的依赖 <dependency> <groupId>pro.shushi.pamirs.core</groupId> <artifactId>pamirs-business-api</artifactId> </dependency> 图5-3-2 pamirs-demo-api工程增加依赖 在DemoModule类中通过@Module.dependencies中增加BusinessModule.MODULE_MODULE @Module( dependencies = { BusinessModule.MODULE_MODULE} ) 图5-3-3 声明对BusinessModule的依赖 Step2 新建PetComany和PetEmployee,以及对应的服务 package pro.shushi.pamirs.demo.api.model; import pro.shushi.pamirs.business.api.model.PamirsEmployee; import pro.shushi.pamirs.meta.annotation.Field; import pro.shushi.pamirs.meta.annotation.Model; import pro.shushi.pamirs.user.api.model.PamirsUser; @Model.model(PetEmployee.MODEL_MODEL) @Model(displayName = "宠物公司员工",labelFields = "name") public class PetEmployee extends PamirsEmployee { public static final String MODEL_MODEL="demo.PetEmployee"; @Field(displayName = "用户") private PamirsUser user; } 图5-3-4 新建PetEmployee package pro.shushi.pamirs.demo.api.model; import pro.shushi.pamirs.business.api.entity.PamirsCompany; import pro.shushi.pamirs.meta.annotation.Field; import pro.shushi.pamirs.meta.annotation.Model; @Model.model(PetCompany.MODEL_MODEL) @Model(displayName = "宠物公司",labelFields = "name") public class PetCompany extends PamirsCompany { public static final String MODEL_MODEL="demo.PetCompany"; @Field.Text @Field(displayName = "简介") private String introductoin; } 图5-3-5 新建PetComany package pro.shushi.pamirs.demo.api.service; import pro.shushi.pamirs.demo.api.model.PetEmployee; import pro.shushi.pamirs.meta.annotation.Fun; import pro.shushi.pamirs.meta.annotation.Function; @Fun(PetEmployeeQueryService.FUN_NAMESPACE) public interface PetEmployeeQueryService { String FUN_NAMESPACE ="demo.PetEmployeeQueryService"; @Function PetEmployee queryByUserId(Long userId); } 图5-3-6 新建PetEmployee对应服务 package pro.shushi.pamirs.demo.core.service; import org.springframework.stereotype.Component; import pro.shushi.pamirs.demo.api.model.PetEmployee; import pro.shushi.pamirs.demo.api.service.PetEmployeeQueryService; import pro.shushi.pamirs.framework.connectors.data.sql.query.QueryWrapper; import pro.shushi.pamirs.meta.annotation.Fun; import pro.shushi.pamirs.meta.annotation.Function; @Fun(PetEmployeeQueryService.FUN_NAMESPACE) @Component public class PetEmployeeQueryServiceImpl implements PetEmployeeQueryService { @Override @Function public PetEmployee queryByUserId(Long userId) { if(userId==null){ return null; } QueryWrapper<PetEmployee> queryWrapper = new QueryWrapper<PetEmployee>().from(PetEmployee.MODEL_MODEL).eq("user_id", userId); return…

    2024年5月23日
    1.3K00

Leave a Reply

Please Login to Comment