4.1.12 函数之内置函数与表达式

本文意在列全所有内置函数与表达式,方便大家查阅。

一、内置函数

内置函数是系统预先定义好的函数,并且提供表达式调用支持。

通用函数

数学函数

表达式 名称 说明
ABS 绝对值 函数场景: 表达式函数示例: ABS(number)函数说明: 获取number的绝对值
FLOOR 向下取整 函数场景: 表达式函数示例: FLOOR(number)函数说明: 对number向下取整
CEIL 向上取整 函数场景: 表达式函数示例: CEIL(number)函数说明: 对number向上取整
ROUND 四舍五入 函数场景: 表达式函数示例: ROUND(number)函数说明: 对number四舍五入
MOD 取余 函数场景: 表达式函数示例: MOD(A,B)函数说明: A对B取余
SQRT 平方根 函数场景: 表达式函数示例: SQRT(number) 函数说明: 对number平方根
SIN 正弦 函数场景: 表达式函数示例: SIN(number)函数说明: 对number取正弦
COS 余弦 函数场景: 表达式函数示例: COS(number)函数说明: 对number取余弦
PI 圆周率 函数场景: 表达式函数示例: PI() 函数说明: 圆周率
ADD 相加 函数场景: 表达式函数示例: ADD(A,B)函数说明: A与B相加
SUBTRACT 相减 函数场景: 表达式函数示例: SUBTRACT(A,B)函数说明: A与B相减
MULTIPLY 乘积 函数场景: 表达式函数示例: MULTIPLY(A,B)函数说明: A与B相乘
DIVIDE 相除 函数场景: 表达式函数示例: DIVIDE(A,B)函数说明: A与B相除
MAX 取最大值 函数场景: 表达式函数示例: MAX(collection) 函数说明: 返回集合中的最大值,参数collection为集合或数组
MIN 取最小值 函数场景: 表达式函数示例: MIN(collection) 函数说明: 返回集合中的最小值,参数collection为集合或数组
SUM 求和 函数场景: 表达式函数示例: SUM(collection)函数说明: 返回对集合的求和,参数collection为集合或数组
AVG 取平均值 函数场景: 表达式函数示例: AVG(collection)函数说明: 返回集合的平均值,参数collection为集合或数组
COUNT 计数 函数场景: 表达式函数示例: COUNT(collection)函数说明: 返回集合的总数,参数collection为集合或数组
UPPER_MONEY 大写金额 函数场景: 表达式函数示例: UPPER_MONEY(number)函数说明: 返回金额的大写,参数number为数值或数值类型的字符串

表4-1-12-1 数学函数

文本函数

表达式 名称 说明
TRIM 空字符串过滤 函数场景: 表达式函数示例: TRIM(text)函数说明: 去掉文本字符串text中的首尾空格,文本为空时,返回空字符串
IS_BLANK 是否为空字符串 函数场景: 表达式函数示例: IS_BLANK(text)函数说明: 判断文本字符串text是否为空
STARTS_WITH 是否以指定字符串开始 函数场景: 表达式函数示例: STARTS_WITH(text,start)函数说明: 判断文本字符串text是否以文本字符串start开始,文本为空时,按照空字符串处理
ENDS_WITH 是否以指定字符串结束 函数场景: 表达式函数示例: ENDS_WITH(text,start)函数说明: 判断文本字符串text是否以文本字符串end结束,文本为空时,按照空字符串处理
CONTAINS 包含 函数场景: 表达式函数示例: CONTAINS(text,subtext)函数说明: 判断文本字符串text是否包含文本字符串subtext,文本text为空时,按照空字符串处理
LOWER 小写 函数场景: 表达式函数示例: LOWER(text)函数说明: 小写文本字符串text,文本为空时,按照空字符串处理
UPPER 大写 函数场景: 表达式函数示例: UPPER(text)函数说明: 大写文本字符串text,文本为空时,按照空字符串处理
REPLACE 替换字符串 函数场景: 表达式函数示例: REPLACE(text,oldtext,newtext)函数说明: 使用文本字符串newtext替换文本字符串text中的文本字符串oldtext
LEN 获取字符串长度 函数场景: 表达式函数示例: LEN(text)函数说明: 获取文本字符串text的长度,文本为空时,按照空字符串处理
JOIN 连接字符串 函数场景: 表达式函数示例: JOIN(text,join)函数说明: 将文本字符串text连接文本字符串join,文本为空时,按照空字符串处理
PARSE 反序列化JSON字符串 函数场景: 表达式函数示例: PARSE(text)函数说明: 将JSON文本字符串text反序列化为集合或者map
JSON 序列化为JSON字符串 函数场景: 表达式函数示例: JSON(object)函数说明: 将记录object序列化为JSON字符串

表4-1-12-2 文本函数

正则函数

表达式 名称 说明
MATCHES 正则匹配 函数场景: 表达式函数示例: MATCHES(text,regex)函数说明: 校验字符串是否满足正则匹配,例如regex为[a-zA-Z][a-zA-Z0-9]*$,来校验text是否匹配
CHECK_PHONE 手机号校验 函数场景: 表达式函数示例: CHECK_PHONE(text)函数说明: 校验手机号是否正确
CHECK_EMAIL 邮箱校验 函数场景: 表达式函数示例: CHECK_EMAIL(text)函数说明:?校验邮箱是否正确
CHECK_USER_NAME 用户名校验 函数场景: 表达式函数示例: CHECK_USER_NAME(text)函数说明:?校验用户名是否正确
CHECK_PWD 密码强弱校验 函数场景: 表达式函数示例: CHECK_PWD(text)函数说明: 判断密码是否满足强弱校验
CHECK_INTEGER 整数校验 函数场景: 表达式函数示例: CHECK_INTEGER(text)函数说明:?校验是否为整数
CHECK_ID_CARD 身份证校验 函数场景: 表达式函数示例: CHECK_ID_CARD(text)函数说明:?校验身份证是否正确
CHECK_URL 合法URL校验 函数场景: 表达式函数示例: CHECK_URL(text)函数说明:?校验URL是否正确
CHECK_CHINESE 中文校验 函数场景: 表达式函数示例: CHECK_CHINESE(text)函数说明:?校验是否为中文文本
CHECK_NUMBER 纯数字校验 函数场景: 表达式函数示例: CHECK_NUMBER(text)函数说明:?校验是否为纯数字
CHECK_TWO_DIG 验证是否两位小数 函数场景: 表达式函数示例: CHECK_TWO_DIG(text)函数说明:?校验是否两位小数
CHECK_IP IP地址校验 函数场景: 表达式函数示例: CHECK_IP(text)函数说明:?校验IP地址是否正确
CHECK_CONTAINS_CHINESE 包含中文校验 函数场景: 表达式函数示例: CHECK_CONTAINS_CHINESE(text)函数说明:?校验是否包含中文
CHECK_SIZE_MAX 只能输入n个字符 函数场景: 表达式函数示例: CHECK_SIZE_MAX(text,n)函数说明:?只能输入n个字符
CHECK_SIZE_MIN 至少输入n个字符 函数场景: 表达式函数示例: CHECK_SIZE_MIN(text,n)函数说明:?至少输入n个字符
CHECK_SIZE 输入m-n个字符 函数场景: 表达式函数示例: CHECK_SIZE(text,m,n)函数说明:?输入m-n个字符
CHECK_CODE 只能由英文、数字、下划线组成 函数场景: 表达式函数示例: CHECK_CODE(text)函数说明:?只能由英文、数字、下划线组成
CHECK_ENG_NUM 只能包含英文和数字 函数场景: 表达式函数示例: CHECK_ENG_NUM(text)函数说明:?只能包含英文和数字

表4-1-12-3 正则函数

时间函数

表达式 名称 说明
NOW 返回当前时间 函数场景: 表达式函数示例: NOW()函数说明: 返回当前时间
NOW_STR 返回当前时间字符串 函数场景: 表达式函数示例: NOW_STR()函数说明: 返回当前时间字符串,精确到时分秒,格式为yyyy-MM-dd hh:mm:ss
TODAY_STR 返回今天的日期字符串 函数场景: 表达式函数示例: TODAY_STR()函数说明: 返回今天的日期字符串,精确到天,格式为yyyy-MM-dd
ADD_DAY 加减指定天数 函数场景: 表达式函数示例: ADD_DAY(date,days)函数说明: 将指定日期加/减指定天数,date为指定日期,days为指定天数,当为负数时在date上减去此天数
ADD_MONTH 加减指定月数 函数场景: 表达式函数示例: ADD_MONTH(date,months)函数说明: 将指定日期加/减指定月数,date为指定日期,months为指定月数,当为负数时在此date上减去此月数
ADD_YEAR 加减指定年数 函数场景: 表达式函数示例: ADD_YEAR(date,years)函数说明: 将指定日期加/减指定年数,date为指定日期,years为指定年数,当为负数时在此date上减去此年数
TO_DATE 转换为时间 函数示例: TO_DATE(date,pattern)函数说明: 将date字符串按格式转换为时间
ADD_WORK_DAY 工作日加减天数(跳过周末) 函数示例: ADD_WORK_DAY(date,days) 函数说明: 将指定工作日加/减指定天数(跳过周末),date为指定日期,days为指定天数,当为负数时在date上减去此天数

表4-1-12-4 时间函数

集合函数

表达式 名称 说明
LIST_GET 获取集合(或数组)中的元素 函数场景: 表达式函数示例: LIST_GET(list,index)函数说明: 获取集合list中索引为数字index的元素
LIST_IS_EMPTY 判断集合(或数组)是否为空 函数场景: 表达式函数示例: LIST_IS_EMPTY(list)函数说明: 传入一个对象集合,判断是否为空
LIST_CONTAINS 判断集合(或数组)是否包含元素 函数场景: 表达式函数示例: LIST_CONTAINS(list,item)函数说明: 判断集合list是否包含元素item
LIST_ADD 将元素添加到集合(或数组) 函数场景: 表达式函数示例: LIST_ADD(list,item)函数说明: 将元素item添加到集合list
LIST_ADD_BY_INDEX 将元素添加到集合(或数组)的指定位置 函数场景: 表达式函数示例: LIST_ADD_BY_INDEX(list,index,item)函数说明: 将元素item添加到集合list的索引index处
LIST_REMOVE 移除集合(或数组)中的元素 函数场景: 表达式函数示例: LIST_REMOVE(list,item)函数说明: 从集合list中移除元素item
LIST_COUNT 获取集合(或数组)元素数量 函数场景: 表达式函数示例: LIST_COUNT(list)函数说明: 传入一个对象集合,获取集合元素数量
LIST_IDS 获取集合(或数组)中的所有id 函数场景: 表达式函数示例: LIST_IDS(list)函数说明: 传入一个对象集合,获取集合中的所有id组成的列表
LIST_FIELD_VALUES 将对象集合(或数组)转化为属性集合 函数场景: 表达式函数示例: LIST_FIELD_VALUES(list,model,field)函数说明: 传入一个对象集合,该对象的模型和属性字段,返回属性值集合
LIST_FIELD_EQUALS 判断对象集合(或数组)中属性值匹配情况 函数场景: 表达式函数示例: LIST_FIELD_EQUALS(list,model,field,value)函数说明: 判断对象集合(或数组)中属性值匹配情况,返回布尔集合
LIST_FIELD_NOT_EQUALS 判断对象集合(或数组)中属性值不匹配情况 函数场景: 表达式函数示例: LIST_FIELD_NOT_EQUALS(list,model,field,value)函数说明: 判断对象集合(或数组)中属性值不匹配情况,返回布尔集合
LIST_FIELD_IN 判断对象集合(或数组)中属性值是否在指定集合(或数组)中 函数场景: 表达式函数示例: LIST_FIELD_IN(list,model,field,list)函数说明: 判断对象集合(或数组)中属性值是否在指定集合(或数组)中,返回布尔集合
LIST_FIELD_NOT_IN 判断对象集合(或数组)中属性值是否不在指定集合(或数组)中 函数场景: 表达式函数示例: LIST_FIELD_NOT_IN(list,model,field,list)函数说明: 判断对象集合(或数组)中属性值是否不在指定集合(或数组)中,返回布尔集合
LIST_AND 将一个布尔集合进行逻辑与运算 函数场景: 表达式函数示例: LIST_AND(list)函数说明: 将一个布尔集合进行逻辑与运算,返回布尔值
LIST_OR 将一个布尔集合进行逻辑或运算 函数场景: 表达式函数示例: LIST_OR(list)函数说明: 将一个布尔集合进行逻辑或运算,返回布尔值
STRING_LIST_TO_NUMBER_LIST 将一个字符集合转换为数值集合 函数场景: 表达式函数示例: STRING_LIST_TO_NUMBER_LIST(list)函数说明: 将一个字符集合转换为数值集合,如果转换成功,返回一个数值集合;转换失败,返回集合本身
COMMA 将集合里面的值用逗号拼接 函数场景: 表达式函数示例: COMMA(list)函数说明: 将集合里面的值用逗号拼接「集合里面的值只能是Number或者String类型」,返回一个字符串
CONCAT 将集合里面的值用指定的符号拼接 函数场景: 表达式函数示例: CONCAT(list, split)函数说明: 将集合里面的值用split拼接「集合里面的值只能是Number或者String类型」,返回一个字符串

表4-1-12-5 集合函数

键值对函数

表达式 名称 说明
MAP_GET 从键值对中获取指定键的值 函数场景: 表达式函数示例: MAP_GET(map,key)函数说明: 从键值对中获取键为key的值
MAP_IS_EMPTY 判断键值对是否为空 函数场景: 表达式函数示例: MAP_IS_EMPTY(map)函数说明: 判断键值对map是否为空
MAP_PUT 向键值对中添加键值 函数场景: 表达式函数示例: MAP_PUT(map,key,value)函数说明: 将键为key的值为value添加到键值对map中
MAP_REMOVE 移除键值对中的元素 函数场景: 表达式函数示例: MAP_REMOVE(map,key)函数说明: 从键值对map中移除键key
MAP_COUNT 获取键值数量 函数场景: 表达式函数示例: MAP_COUNT(map)函数说明: 获取键值对map的键值数量

表4-1-12-6 键值对函数

上下文函数

表达式 名称 说明
CURRENT_UID 获取当前用户id 函数场景: 表达式函数示例: CURRENT_UID()函数说明: 获取当前用户id
CURRENT_USER_NAME 获取当前用户名 函数场景: 表达式函数示例: CURRENT_USER_NAME()函数说明: 获取当前用户的用户名
CURRENT_USER 获取当前用户 函数场景: 表达式函数示例: CURRENT_USER()函数说明: 获取当前用户
CURRENT_ROLE_IDS 获取当前用户的角色id列表 函数场景: 表达式函数示例: CURRENT_ROLE_IDS()函数说明: 获取当前用户的角色id列表
CURRENT_ROLES 获取当前用户的角色列表 函数场景: 表达式函数示例: CURRENT_ROLES()函数说明: 获取当前用户的角色列表
CURRENT_PARTNER_ID 获取当前用户的合作伙伴id 函数场景: 表达式函数示例: CURRENT_PARTNER_ID()函数说明: 获取当前用户的合作伙伴id
CURRENT_PARTNER 获取当前用户的合作伙伴 函数场景: 表达式函数示例: CURRENT_PARTNER()函数说明: 获取当前用户的合作伙伴

表4-1-12-7 上下文函数

对象函数

表达式 名称 说明
IS_NULL 判断是否为空 函数场景: 表达式函数示例: IS_NULL(文本或控件)函数说明: 判断对象是否为空,为空则返回true,不为空则返回false,可用于判断具体值或者控件
EQUALS 判断是否相等 函数场景: 表达式函数示例: EQUALS(A,B)函数说明: 判断A和B是否相等
FIELD_GET 获取对象属性值 函数场景: 表达式函数示例: GET(obj,dotExpression)函数说明: 从对象中根据点表达式获取属性值

表4-1-12-8 对象函数

逻辑函数

表达式 名称 说明
IF 条件表达式 函数场景: 表达式函数示例: IF(A,B,C)函数说明: 如果F满足条件A,则返回B,否则返回C,支持多层嵌套IF函数
AND 逻辑与 函数场景: 表达式函数示例: AND(A,B)函数说明: 返回 条件A 逻辑与 条件B 的值
OR 逻辑或 函数场景: 表达式函数示例: OR(A,B)函数说明: 返回 条件A 逻辑或 条件B 的值
NOT 逻辑非 函数场景: 表达式函数示例: NOT(A)函数说明: 返回 逻辑非 条件A 的值

表4-1-12-9 逻辑函数

特定场景函数

商业函数

表达式 名称 说明
CURRENT_CORP_ID 获取当前用户的公司id 函数场景: 商业公司函数示例: CURRENT_CORP_ID()函数说明: 获取当前用户的公司id
CURRENT_CORP 获取当前用户的公司 函数场景: 商业公司函数示例: CURRENT_CORP()函数说明: 获取当前用户的公司
CURRENT_SHOP_ID 获取当前用户的店铺id 函数场景: 商业店铺函数示例: CURRENT_SHOP_ID()函数说明: 获取当前用户的店铺id
CURRENT_SHOP 获取当前用户的店铺 函数场景: 商业店铺函数示例: CURRENT_SHOP()函数说明: 获取当前用户的店铺

表4-1-12-10 商业函数

逻辑DSL函数

表达式 名称 说明
FOR_INDEX 获取循环的index 函数场景: 逻辑DSL函数示例: FOR_INDEX(context)函数说明: 获取循环的index

表

4-1-12-11 逻辑DSL函数

二、表达式

表达式,是由数字、算符、函数、数字分组符号(括号)、自由变量和约束变量等以能求得数值的有意义排列方法所得的组合。约束变量在表达式中已被指定数值,而自由变量则可以在表达式之外另行指定数值。

表达式可以使用运算符(+、-、*、/、&&、||、!、==、!=)、点表达式(例如:模型A.字段C.关联模型字段A)和内置函数。表达式格式如:IF(ISNULL(模型A.字段x),模型A.字段y.关联模型字段z,模型A.字段m)

表达式中模型字段的前端展现使用展示名称displayName,表达式原始内容使用技术名称name。

点表达式

点表达式是表达式的子集,由变量名与点组成。点前的变量与点后的变量为从属关系,点后的变量从属于点前的变量。可以使用点表达式获取由全表达式确定的最后一个点后变量的值。

正则表达式

对应内置函数 说明 正则表达式
CHECK_PHONE 手机号校验 ^(1[3-9])\d{9}$
CHECK_EMAIL 邮箱校验 ^[a-z0-9A-Z]+[-
CHECK_USER_NAME 用户名校验 非空校验
CHECK_PWD 密码强弱校验(强密码校验) ^(?=.*[a-z])(?=.*[A-Z])[a-zA-Z0-9~!@&%#_(.)]{8,16}$
CHECK_INTEGER 整数校验 ^-{0,1}[1-9]\d*$
CHECK_ID_CARD 身份证校验 ^\d{15}$)
CHECK_URL 合法URL校验 ^(?:(?:https?)://)(?:(?:1\d{2}
CHECK_CHINESE 中文校验 ^[\u4e00-\u9fa5]{0,}$
CHECK_NUMBER 纯数字校验 ^[0-9]*$
CHECK_TWO_DIG 验证是否两位小数 ^[0-9]+(.[0-9]{2})?$
CHECK_IP IP地址校验 ^((2[0-4]\d
CHECK_CONTAINS_CHINESE 包含中文校验 ^.?[\u4e00-\u9fa5]{0,}.?$
CHECK_SIZE 只能输入n个字符 ^.{n}$
CHECK_SIZE_MIN 至少输入n个字符 ^.{n,}$
CHECK_SIZE_MAX 最多输入n个字符 ^.{0,n}$
CHECK_SIZE_RANGE 输入m-n个字符 ^.{m,n}$
CHECK_CODE 只能由英文、数字、下划线组成 ^[a-z0-9A-Z_]*$
CHECK_ENG_NUM 只能包含英文和数字 ^[a-z0-9A-Z]*$

表4-1-12-12 正则表达式

内置变量

在表达式中可以使用点表达式来获取内置变量的属性及子属性的属性。例如,使用activeRecord来获取当前记录。activeRecord.id来获取当前选中行记录的id。

数据变量

变量 名称 说明
activeRecord 当前选中值 选中单行记录跳转视图初始化时,值为单条当前选中记录;选中多行记录跳转视图初始化时,值为当前选中记录列表;整表单校验时,值为当前表单提交记录;单字段校验时,值为当前字段值。作为动作筛选条件时,值为动作模型定义数据。

表4-1-12-13 数据变量

上下文变量

变量 名称 说明
module 模块 使用示例: context.module示例说明:请求上下文中的模块
tenant 租户 使用示例: context.tenant示例说明:请求上下文中的租户
lang 语言 使用示例: context.lang示例说明:请求上下文中的语言
country 国家 使用示例: context.country示例说明:请求上下文中的国家
env 环境 使用示例: context.env示例说明:请求上下文中的环境
extend 扩展信息 使用示例: context.extend.扩展变量名示例说明:请求上下文中的扩展信息

表4-1-12-14 上下文变量

内置函数

内置函数章节介绍的内置函数可以在表达式中使用。例如,使用ABS(activeValue.amount)来获取当前选中记录金额的绝对值。

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

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

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

相关推荐

  • 4.2.2 框架之MessageHub

    一、MessageHub 请求出现异常时,提供”点对点“的通讯能力 二、何时使用 错误提示是用户体验中特别重要的组成部分,大部分的错误体现在整页级别,字段级别,按钮级别。友好的错误提示应该是怎么样的呢?我们假设他是这样的 与用户操作精密契合 当字段输入异常时,错误展示在错误框底部 按钮触发服务时异常,错误展示在按钮底部 区分不同的类型 错误 成功 警告 提示 调试 简洁易懂的错误信息 在oinone平台中,我们怎么做到友好的错误提示呢?接下来介绍我们的MessageHub,它为自定义错误提示提供无限的可能。 三、如何使用 订阅 import { useMessageHub, ILevel } from "@kunlun/dependencies" const messageHub = useMessageHub('当前视图的唯一标识'); /* 订阅错误信息 */ messageHub.subscribe((errorResult) => { console.log(errorResult) }) /* 订阅成功信息 */ messageHub.subscribe((errorResult) => { console.log(errorResult) }, ILevel.SUCCESS) 图4-2-2-1 订阅的示例代码 销毁 /** * 在适当的时机销毁它 * 如果页面逻辑运行时都不需要销毁,在页面destroyed是一定要销毁,重要!!! */ messageHub.unsubscribe() 图4-2-2-2 销毁的示例代码 四、实战 让我们把3.5.7.5【自定义视图-表单】一文中的自定义表单进行改造,加入我们的messageHub,模拟在表单提交时,后端报错信息在字段下方给予提示。 Step1 (后端)重写PetType的创建函数 重写PetType的创建函数,在创建逻辑中通过MessageHub返回错误信息,返回错误信息的同时要设置paths信息方便前端处理 @Action.Advanced(name = FunctionConstants.create, managed = true) @Action(displayName = "确定", summary = "创建", bindingType = ViewTypeEnum.FORM) @Function(name = FunctionConstants.create) @Function.fun(FunctionConstants.create) public PetType create(PetType data){ List<Object> paths = new ArrayList<>(); paths.add("demo.PetType"); paths.add("kind"); PamirsSession.getMessageHub().msg(new Message().msg("kind error").setPath(paths).setLevel(InformationLevelEnum.ERROR).setErrorType(ErrorTypeEnum.BIZ_ERROR)); List<Object> paths2 = new ArrayList<>(); paths2.add("demo.PetType"); paths2.add("name"); PamirsSession.getMessageHub().msg(new Message().msg("name error").setPath(paths2).setLevel(InformationLevelEnum.ERROR).setErrorType(ErrorTypeEnum.BIZ_ERROR)); // data.create(); return data; } 图4-2-2-3 (后端)重写PetType的创建函数 Step 2 修改PetForm.vue <template> <div class="petFormWrapper"> <form :model="formState" @finish="onFinish"> <a-form-item label="品种种类" id="name" name="kind" :rules="[{ required: true, message: '请输入品种种类!', trigger: 'focus' }]"> <a-input v-model:value="formState.kind" @input="(e) => onNameChange(e, 'kind')" /> <span style="color: red">{{ getServiceError('kind') }}</span> </a-form-item> <a-form-item label="品种名" id="name" name="name" :rules="[{ required: true, message: '请输入品种名!', trigger: 'focus' }]"> <a-input v-model:value="formState.name" @input="(e) => onNameChange(e, 'name')" /> <span style="color: red">{{ getServiceError('name') }}</span> </a-form-item> </form> </div> </template>- <script lang="ts"> import { defineComponent, reactive…

    2024年5月23日
    1.8K00
  • 接口日志

    记录每个PAPI接口执行日志,接口的响应结果、执行时间、执行时长等信息,可查看接口详情。 接口详情

    2023年5月23日
    1.5K00
  • 3.3.8 字段类型之基础与复合

    模型字段是描述实体的特征属性,本文介绍重点介绍字段的基础类型与复合类型 使用@Field注解来描述模型的字段。如果未配置字段类型,系统会根据Java代码的字段声明类型来自动获取业务类型。建议配置displayName属性来描述字段在前端的显示名称。可以使用defaultValue配置字段的默认值。 一、安装与更新 使用@Field.field来配置字段的不可变更编码。字段一旦安装,无法在对该字段编码值进行修改,之后的字段配置更新会依据该编码进行查找并更新;如果仍然修改该注解的配置值,则系统会将该字段识别为新字段,存储模型会创建新的数据库表字段,而原字段将会rename为废弃字段。 二、字段类型 类型系统由基本类型、复合(组件)类型、引用类型和关系类型四种类型系统构成。通过类型系统描述应用程序、数据库和前端视觉视图如何进行交互,数据及数据间关系如何处理的协议。其中引用类型和关系类型介绍详见3.3.9【字段类型之关系与引用】一文,字段命名规范参见3.3.1【构建第一个Model】一文,这里不再赘述。 基本类型 业务类型 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格式化日期 表3-3-8-1 字段基本类型 复合类型 业务类型 Java类型 数据库类型 规则说明 MONEY BigDecimal decimal(M,D) 金额,前端使用金额控件,可以使用currency设置币种字段 表3-3-8-2 字段复合类型 不可变更字段 使用immutable属性来描述该字段前后端都无法进行更新操作,系统会忽略不可变更字段的更新操作。 自动生成编码的字段 详见3.3.5【模型编码生成器】一文。 字段的序列化与反序列化 使用@Field注解的serialize属性来配置非字符串类型属性的序列化与反序列化方式,最终会以序列化后的字符串持久化到存储中。 详见3.3.7【字段之序列化方式】一文 前端默认配置 可以使用@Field注解中的以下属性来配置前端的默认视觉与交互规则,也可以在前端设置覆盖以下配置。 @Field(required),是否必填 @Field(invisible),是否不可见 @Field(priority),字段优先级,列表的列使用该属性进行排序 更多前端默认视图配置详见:3.5.4【Ux注解详解】一文,如:readonly是否只读等。 举例 回顾我们前面学习例子 现有PetShop代码如下 package pro.shushi.pamirs.demo.api.model; import pro.shushi.pamirs.core.common.enmu.DataStatusEnum; import pro.shushi.pamirs.demo.api.enumeration.PetShopOptionEnum; import pro.shushi.pamirs.meta.annotation.Field; import pro.shushi.pamirs.meta.annotation.Model; import java.sql.Time; import java.util.List; @Model.model(PetShop.MODEL_MODEL) @Model(displayName = 宠物店铺,summary=宠物店铺,labelFields ={shopName} ) @Model.Code(sequence = DATE_ORDERLY_SEQ,prefix = P,size=6,step=1,initial = 10000,format = yyyyMMdd) public class PetShop extends AbstractDemoIdModel { public static final String MODEL_MODEL=demo.PetShop; @Field(displayName = 店铺编码) private String code; @Field(displayName = 店铺编码2) @Field.Sequence(sequence = DATE_ORDERLY_SEQ,prefix = C,size=6,step=1,initial = 10000,format = yyyyMMdd) private String codeTwo; @Field(displayName = 店铺名称,required = true) private String shopName; @Field(displayName = 开店时间,required = true) private Time openTime; @Field(displayName = 闭店时间,required = true) private Time closeTime; @Field(displayName =…

    2024年5月23日
    1.8K00
  • 2.3 Oinone独特性之源,元数据与设计原则

    让我们来揭开Oinone元数据的神秘面纱,了解它的核心组成、获取方式、面向对象特性以及带来的好处。您或许会想,这些特性能否解决企业数字化转型中互联网架构遇到的挑战呢? 元数据是本文多次提到的重要概念。作为LCDP的基础,元数据支持企业所有研发范式。它数字化描述了软件本身,包括数据、行为和视图等方面。在描述数据时,元数据本身就是数据的数据;在描述行为时,它就是行为的数据;在描述视图时,它就是视图的数据。只有深入理解元数据,才能全面了解Oinone的其他特性。 本章节将介绍元数据的整体概览(如下图2-3所示),带领您了解其核心组成、面向对象特性以及组织方式。请注意,本章节将不会详细展开元数据的细节,这些细节将在后续的相关章程中深入介绍。 图2-3 元数据整体视图 一:以下是元数据的核心组成介绍: 模块(Module):它是将程序划分成若干个子功能,每个模块完成了一个子功能,再把这些模块总起来组成一个整体。它是按业务领域划分和管理的最小单元,是一组功能、界面的集合。 模型(Model):Oinone一切从模型出发,是数据及对行为的载体。它是对所需要描述的实体进行必要的简化,并用适当的变现形式或规则把它的主要特征描述出来所得到的系统模仿品。它包括元信息、字段、数据管理器和自定义函数。同时遵循面向对象设计原则,包括封装、继承和多态。 交互组件(UI Componment):它用菜单、视图和Action来勾绘出模块的前端交互拓扑,并且用组件化的方式统一管理、布局和视图。它用Action来描述所有可操作行为。 函数(Function):它是Oinone可执行逻辑单元,跟模型绑定则对应模型的方法。它描述满足数学领域函数定义,含有三个要素:定义域A、值域C{f(x),x属于A}和对应法则f。其中核心是对应法则f,它是函数关系的本质特征。它满足面向对象原则,可以设置不同开放级别,本地与远程智能切换。 元数据注册表:它以模块为单位的安装记录,在模块安装时,相关的元数据都会在元数据注册表中记录。 二:元数据的产生方式,既可以通过代码注解扫描获取,也可以通过可视化编辑器直接添加。 从代码注解中扫描获取,示例如下代码(如下图2-4所示)。 @Model.model(ResourceBank.MODEL_MODEL) @Model(displayName = "银行",labelFields = "name") public class ResourceBank extends IdModel { public static final String MODEL_MODEL = "resource.ResourceBank"; @Field.String @Field(required = true, displayName = "名称") private String name; @Field.String @Field(required = true, displayName = "银行识别号码", summary = "Bank Identifier Code, BIC 或者 Swift") private String bicCode; …… } 图2-4 从代码注解中扫描获取元数据 可视化的编辑器添加元数据,具体介绍详见7.1《Oinone的设计器》章节 三:Oinone是一种通用低代码开发平台,其元数据设计满足应用开发所需的所有元素,并支持所有研发范式。 它基于元数据的具体实现秉承以下原则: 部署与研发无关; 以模型驱动,符合面向对象设计原则; 代码与数据相互融合,编辑器产生的元数据以面向对象的方式继承扩展标准产品的元数据。 这些原则的集合使整个平台能够实现以下功能特性: 开发分布式应用与单体应用一样简单,部署方式由后期决定。如果要部署为分布式应用,则需要在boot工程中引入Oinone的rpc包。详见4.3《Oinone的分布式体验》一章节; 面向对象的特性使得每个需求都可以是独立模块,独立安装与卸载,让系统像乐高积木一样搭建; 支持两种元数据产生方式,融合的原则确保标准产品迭代与个性化保持独立,真正做到低无一体。 四:这些特性刚好也解决了2.2《互联网架构作为最佳实践为何失效》一章节中客户挑战的三个刺眼问题 互联网架构落地企业数字化转型面临的问题 Oinone应对的策略 不是说敏捷响应吗?为什么改个需求这么慢,不单时间更长,付出的成本也更高了? 特性1、特性2、特性3 不是说能力中心吗?当引入新供应商或有新场景开发的时候,为什么前期做的能力中心不能支撑了? 特性2、特性3 不是说性能好吗?为什么我投入的物理资源更多了? 特性1 表2-2互联网架构落地企业数字化转型面临的问题及Oinone应对策略

    2024年5月23日
    2.4K00
  • 3.5.6.3 布局的配置

    布局是将页面拆分成一个一个的小单元,按照上下中左右进行排列。 前沿 在前端领域中,布局可以分为三大块「Float、Flex、Grid 」,Float可以说的上是上古时期的布局了,如今市面还是很少见的,除了一些古老的网站。 目前,平台主要支持通过配置XML上面的cols和span来进行布局。平台也同样支持自由布局,合理的使用row、col、containers和container四个布局容器相关组件,将可以实现各种类型的布局样式,换句话说,平台实现的自由布局功能是Flex和Grid的结合体。 这里主要是讲解Flex和Grid布局,以及目前新的模板布局实现的思路。 Flex布局 Flex布局采用的是一维布局,那么什么是一维布局呢,所谓的一维布局就是只有一个方向、没有体积、面积,比如一条直线。它适合做局部布局,就像我们原来的顶部菜单、面包屑导航,以及现在的主视图字段配置。 图3-5-6-19 Flex布局示意 图3-5-6-20 Flex布局示意 图3-5-6-21 Flex布局示意 从上图可以看看出,Flex布局只能在X、Y轴进行转换,它无法对上下左右四个方向同时处理,因为它没“面积”的概念。所以它最适合做局部布局。 优点 图3-5-6-22 Flex兼容性 Flex的兼容性,可以看得出来,目前主流的浏览器都支持该属性。所以Flex兼容性强,如果你想对局部做布局处理,Flex是最好选择。 缺陷 刚刚也提到了,用户想要的布局是千奇百怪的,如果他想要的布局在现有的功能中无法实现怎么办?让用户放弃?还是说服他使用现在的布局。 Grid布局 Grid布局系统采用的是二维布局,二维布局有四个方向:上、下、左、右,它只有面积没有体积,比如一张纸、网格。 Grid布局 <div id="grid-container-one"> <div class="one-1">Grid Item 1</div> <div>Grid Item 2</div> <div>Grid Item 3</div> <div>Grid Item 4</div> <div>Grid Item 5</div> <div class="one-6">Grid Item 6</div> </div> <div id="grid-container-two"> <div class="tow-1">Grid Item 1</div> <div class="tow-2">Grid Item 2</div> <div>Grid Item 3</div> <div>Grid Item 4</div> <div>Grid Item 5</div> <div>Grid Item 6</div> </div> <div id="grid-container-three"> <div>Grid Item 1</div> <div>Grid Item 2</div> <div class="grid">Grid Item 3</div> <div class="grid-column">Grid Item 4</div> <div>Grid Item 5</div> <div>Grid Item 6</div> <div>Grid Item 7</div> <div class="grid-column">Grid Item 8</div> </div> HTML CSSResult Skip Results Iframe EDIT ON * { box-sizing: border-box; padding: 0; margin: 0; line-height: 1.5; font-weight: bold; text-align: center; } #grid-container-one{ background-color: black; display: grid; grid-template-columns: repeat(3, 1fr); grid-template-rows: repeat(2, 50px); gap: 10px; border: solid black 2px; margin-bottom: 20px; color: salmon; } #grid-container-one div { border: solid white 2px; padding: 10px; } #grid-container-one .one-1 { grid-area: span 1/span 3; text-aligin: center } #grid-container-one .one-6 { grid-column: 3 /4; } #grid-container-two{ background-color: CADETBLUE; display: grid; grid-template-columns: 15% repeat(2, 1fr);…

    2024年5月23日
    1.7K00

Leave a Reply

Please Login to Comment