功能号配置说明
功能号接口配置在functions
文件夹中,默认搜索当前文件夹下所有的子目录中的xml
文件
[warning] 功能说明:
- 通过配置功能号暴露接口服务,外部接口可以调用
- 通过配置验证参数信息(包含非空验证、长度验证、格式验证等)
- 通过配置获取系统变量信息
- 通过配置设置参数绝对值或默认值
- 通过配置设置参数转换类型(例如:前端传入
String
格式日期参数,转换为日期对象)- 可以对接口进行限流控制
- 可以在新增或修改前进行数据验证,重复数据错误提示
- 接口转发
- 复杂查询(模糊查询,区间查询等)
function
├── id -- 功能号
├── type -- 调用类型 c:执行class,s:执行service,m:执行mapper,f:执行接口转发
├── version -- 版本号
├── isPage -- 是否启用分页 1:是,(只有type为m时有效)
├── qps -- 限流(每秒qps最大数量)
├── resource -- 资源信息(实现类)
├── description -- 功能号描述
├── params -- 参数处理集合
| ├── param -- 某个参数处理
| | ├── id -- 参数属性
| | ├── name -- 参数中文名称
| | ├── required -- 是否非空验证 1:验证,建议使用此项验证非空,2.3.0新增
| | ├── verifyType -- 验证类型
| | ├── convertType -- 转换类型
| | ├── maxLength -- 最大长度限制
| | ├── minLength -- 最小长度限制
| | ├── value -- 参数赋值
| | ├── defaultValue -- 参数默认值,当前端值为空,获取默认值
| | ├── emptyMsg -- 自定义为空提示
| | ├── verifyMsg -- 定义格式验证错误提示
| | ├── maxValue -- 最大值
| | ├── minValue -- 最小值
| | ├── operateType -- 操作类型(通用mapper。selectByExample 方法使用),2.3.9新增
| | ├── orderSort -- 排序方式(通用mapper。selectByExample 方法使用),2.3.9新增
| | ├── dbField -- 数据库对应的字段(通用mapper。selectByExample 方法使用),2.3.9新增
| | ├── dateRangeSeparator -- 日期区间分隔符,默认` - `,2.3.1新增
| | ├── dateFormat -- 日期格式化,日期默认`yyyy-MM-dd`,日期时间默认`yyyy-MM-dd HH:mm:ss` ,2.3.1新增
| | ├── description -- 参数描述
├── checks -- 检查资源信息(一般在新增前验证数据库中是否存储)
| ├── check -- 某个检查资源
| | ├── type -- 调用类型 s:执行service,m:执行mapper,默认m
| | ├── isEmpty -- 是否为空
| | ├── primaryKey -- 主键id
| | ├── msg -- 提示信息
| | ├── resource -- 资源信息
配置提示和验证
功能号配置文件新增了xml标签提示支持,可以通过定义DOCTYPE实现
<!DOCTYPE functions PUBLIC "-//wueasy.com//DTD wueasy 1.0 Transitional//EN" "https://www.wueasy.com/dtd/wueasy.dtd">
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE functions PUBLIC "-//wueasy.com//DTD wueasy 1.0 Transitional//EN" "https://www.wueasy.com/dtd/wueasy.dtd">
<functions>
</functions>
配置说明
[warning] 调用类型说明:
m
:调用mapper
接口(使用场景:对于简单的业务,例如:只有普通的增删改查
功能,没有什么业务逻辑,可以直接调用Mybatis
执行。),接口参数只能有一个DataMap
s
:调用service
接口(使用场景:对于复杂的业务(简单业务满足不了),可以使用此模式,例如:新增需要判断某个字段在数据库中是否存在,如果存在则弹出提示;或者需要同时操作多个表等。),接口参数只能有一个DataMap
c
:继承function
接口,实现execute
方法(使用场景:对于特别复杂的业务,需要区分场景或者需要调用多个service
的场景。)
验证类型列表
Date
(日期)DateTime
(日期+时间)Time
(时间)AlphaNumeric
(字母数字)Email
(电子邮箱)Numeric
(数字)NumberFloat
(浮点数)Mobile
(手机)PostalCode
(邮编)URL
(url地址)CardID
(身份证)BankCode
(银行卡号)其他值
(正则表达式验证,优先匹配自定义规则)
系统变量
$id()
:获取唯一主键id$date()
:获取当前日期对象$dateStr()
:获取当前日期字符串 yyyy-MM-dd,2.3.1开始支持dateFormat
格式化$datetimeStr()
获取当前日期字符串,格式为yyyy-MM-dd HH:mm:ss,2.3.1开始支持dateFormat
格式化$timestamp()
:当时时间的毫秒数$uuid()
:随机生成唯一的UUID$funcNo()
:获取当前调用的功能号2.2.2
开始支持$language()
:获取语言#id
直接取参数值,#+参数属性
[warning]
#
系统参数获取,配合前端使用
$userId()
用户id$userName()
用户名称$loginNo()
获取登录名$ip()
获取ip
转换类型
目前支持以下几种方式转换
Date
(日期) 示例:2019-01-01
转换为Data
对象DateTime
(日期+时间)示例:2019-01-01 11:11:11
转换为Data
对象Long
Double
Integer
Float
DateToDateTimeStart
(把日期转换为当天日期时间的开始时间) 示例:2019-01-01
转换为2019-01-01 00:00:00
格式的Data
对象DateToDateTimeEnd
(把日期转换为当天日期时间的结束时间) 示例:2019-01-01
转换为2019-01-01 23:59:59
格式的Data
对象DateRangeToDateTimeStart
(把日期区间转换为日期时间的开始时间) 示例:2019-01-01 - 2019-01-30
转换为2019-01-01 00:00:00
格式的Data
对象DateRangeToDateTimeEnd
(把日期区间转换为日期时间的结束时间) 示例:2019-01-01 - 2019-01-30
转换为2019-01-30 23:59:59
格式的Data
对象DateTimeRangeToDateTimeStart
(把日期时间区间转换为日期时间的开始时间) 示例:2019-01-01 00:00:00 - 2019-01-30 00:00:00
转换为2019-01-01 00:00:00
格式的Data
对象DateTimeRangeToDateTimeEnd
(把日期时间区间转换为日期时间的结束时间) 示例:2019-01-01 00:00:00 - 2019-01-30 00:00:00
转换为2019-01-30 00:00:00
格式的Data
对象
<function id="S1006" type="m">
<params>
<param id="date" name="时间" convertType="DateTime"/>
</params>
</function>
操作类型
2.3.9
开始支持
只能使用在通用mapper接口中的selectByExample
方法。为了简化单表查询的复杂条件操作。
EqualTo
(匹配相等,默认)NotEqualTo
(不相等)Like
(模糊)NotLike
(非模糊数据)GreaterThan
(大于)GreaterThanOrEqualTo
(大于等于)LessThan
(小于)LessThanOrEqualTo
(小于等于)In
(in)NotIn
(not in )
自定义验证规则
1.3.0
开始支持
可以自定义正则验证规则,规则复用,统一修改等。
- 在
functions
文件夹中新增一个验证文件validate.xml
,文件名称可以随意命名。 - 新增一个正则表达式的规则,如下代码
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE validates PUBLIC "-//wueasy.com//DTD wueasy 1.0 Transitional//EN" "https://www.wueasy.com/dtd/wueasy.dtd">
<validates>
<validate name="atype" regex="1" description="测试"/>
</validates>
validate
├── name -- 规则名称,唯一
├── regex -- 正则表达式
├── description -- 描述
功能号中配置
在参数配置中
verifyType
指定配置的规则名称name
<param id="name" name="名称" required="1" maxLength="50" verifyType="atype"/>
配置demo
调用service
接口demo
[warning]
resource
资源内容为:server名称+方法名
<function id="S1001" type="s">
<params>
<param id="loginNo" name="用户名" required="1" verifyType="" maxLength="20" minLength="0" value="" defaultValue=""/>
<param id="password" name="密码" required="1" verifyType="" maxLength="0" minLength="0"/>
<param id="ip" name="ip" value="$ip()"/>
</params>
<resource>SysUserService.login</resource>
<description>用户登录</description>
</function>
调用mapper
接口demo
[warning]
resource
资源内容为:Mapper实现类路径+方法名
<function id="S1006" type="m">
<params>
<param id="userId" name="userId" required="1"/>
</params>
<resource>com.wueasy.admin.mapper.SysUserMapper.findByUserId</resource>
<description>查询用户详细信息</description>
</function>
调用接口转发接口demo
2.3.8新增
[warning]
resource
资源内容为:客户端id+接口编号
,直接转发接口请求,可以用于不同的功能号服务调用。
客户端id
:默认为base
,参考bus客户端的配置
<function id="DEMO002" type="f">
<resource>DEMO002</resource>
<description>测试</description>
</function>
<function id="DEMO002" type="f">
<resource>clientId.DEMO002</resource>
<description>测试</description>
</function>
调用function
接口demo
[warning]
resource
资源内容为:function实现类路径
<function id="DEMO1001" type="c">
<resource>com.wueasy.admin.bus.function.DemoFunction</resource>
<description>查询分页信息</description>
</function>
新增前检测是否存在
名称
唯一,新增前,检测名称
是否存在,存在则提示。
使用方式:在原有的基础上配置checks
,checks
里面可以配置多个验证。
属性说明:
isEmpty
:是否为空,默认为1
。1是,0否,配置后,当为调用resource
后,返回的对象为空或者不为空的时候提示信息。msg
:错误提示内容resource
:资源信息
如下demo,检测名称存在的时候,提示名称已存在
。
<function id="D1002" type="m">
<params>
<param id="name" name="名称" required="1" maxLength="50"/>
</params>
<checks><!-- 检查资源信息 -->
<check isEmpty="0">
<msg>名称已存在</msg>
<resource>com.wueasy.demo.mapper.DemoMapper.selectByName</resource>
</check>
</checks>
<resource>com.wueasy.demo.mapper.DemoMapper.insert</resource>
<description>新增</description>
</function>
修改前检测是否存在
名称
唯一,新增前,检测名称
是否存在,存在则提示。
修改和新增类型,只不过修改比较特殊,需要判断主键记录是否相等。
属性说明:
primaryKey
:主键id,需要和实体bean名称一致(判断查询出的数据记录,主键内容和传入的参数是否相等,不相等提示)。msg
:错误提示内容resource
:资源信息
如下demo,检测名称存在的时候,提示名称已存在
。
<function id="D1003" type="m">
<params>
<param id="id" name="id" required="1"/>
<param id="name" name="名称" required="1" maxLength="50" />
</params>
<checks><!-- 检查资源信息 -->
<check primaryKey="id">
<msg>名称已存在</msg>
<resource>com.wueasy.demo.mapper.DemoMapper.selectByName</resource>
</check>
</checks>
<resource>com.wueasy.demo.mapper.DemoMapper.update</resource>
<description>修改</description>
</function>
调用service接口检测
对于复杂或者通用的验证,可以定义一个通用的service接口,进行验证处理。
使用方式:在原有的基础上配置checks
,checks
里面可以配置多个验证。
属性说明:
type
:默认为m
。s
调用service接口,n
调用mapper接口resource
:资源信息
如下demo,所有的业务逻辑都在service
接口中处理,如果判断不满足,直接抛出异常InvokeException
即可。
<function id="D1002" type="m">
<params>
<param id="name" name="名称" required="1" maxLength="50"/>
</params>
<checks><!-- 检查资源信息 -->
<check type="s">
<resource>DemoService.check</resource>
</check>
</checks>
<resource>com.wueasy.demo.mapper.DemoMapper.insert</resource>
<description>新增</description>
</function>
@Override
public void check(DataMap paramMap) {
// TODO Auto-generated method stub
throw new InvokeException(-1,"名称已存在");
}
分页查询
如果需要实现分页功能,
mapper
只需要实现查询全部数据的接口,然后配置isPage="1"
即可(框架会自动实现物理分页),此种实现方式只支持调用mapper
接口。
<function id="D1001" type="m" isPage="1">
<resource>com.wueasy.demo.mapper.DemoMapper.query</resource>
<description>查询分页</description>
</function>
列表查询
直接配置
mapper
的实现。
<function id="D1001" type="m">
<resource>com.wueasy.demo.mapper.DemoMapper.query</resource>
<description>查询分页</description>
</function>
非空验证或格式验证
如果需要对参数进行验证可以通过配置参数来实现。
- 非空验证:可以通过配置
required="1"
来验证参数必输,默认会提示[name]不能为空
- 格式验证:可以通过配置
verifyType=""
来验证参数格式,系统支持常见的验证,可以参数格式验证配置,也可以支持正则表达式验证。
如下配置,verifyType="Mobile"
验证必须是手机号码格式。
<function id="D1006" type="s">
<params>
<param id="name" name="名称" required="1"/>
<param id="mobile" name="手机号码" required="1" verifyType="Mobile"/>
</params>
<resource>DemoService.add</resource>
<description>新增测试</description>
</function>
长度验证
如果需要对参数的长度大小进行验证,可以参考此配置,支持最大/最小长度验证。
- 最小长度:可以通过配置
minLength="5"
来验证参数最小长度(字节) - 最大长度:可以通过配置
maxLength="50"
来验证参数最大长度(字节)
<function id="D1006" type="s">
<params>
<param id="name" name="名称" required="1" minLength="5" maxLength="50"/>
</params>
<resource>DemoService.add</resource>
<description>新增测试</description>
</function>
转换类型
前端传入的参数都是
String
类型的,但是在我们数据库中,通常是其他的类型,这种就需要用到此功能,通过此功能可以实现参数转换。
例如:前端传入日期,需要转换为Date
类型。
- 转换类型:可以通过配置
convertType
来转换类型,支持时间和日期的转换。
<function id="D1006" type="s">
<params>
<param id="time" name="日期" convertType="DATETIME" />
</params>
<resource>DemoService.add</resource>
<description>新增测试</description>
</function>
指定值或默认值设置
如果需要在参数中指定某个参数值,或者默认值(为空时默认值),那么可以通过此项配置。
- 默认值:可以通过配置
defaultValue="0"
设置当前属性默认值为0
。 - 指定值:可以通过配置
value="$date()"
设置当前属性值为当前系统时间
,$date()
为系统参数,调用接口不管是否传入,都会覆盖参数。
<function id="D1006" type="s">
<params>
<param id="type" name="类型" defaultValue="0" />
<param id="time" name="日期" value="$date()" />
</params>
<resource>DemoService.add</resource>
<description>新增测试</description>
</function>
自定义错误提示内容
当默认提示消息不满足需要时(或者提示不友好),可以通过此规则配置。
- 自定义为空提示:可以通过配置
emptyMsg=""
设置参数为空时的提示消息。 - 自定义格式验证错误提示:可以通过配置
verifyMsg=""
设置当前参数验证失败后的提示。
<function id="D1006" type="s">
<params>
<param id="type" name="类型" defaultValue="0" emptyMsg="" verifyMsg=""/>
</params>
<resource>DemoService.add</resource>
<description>新增测试</description>
</function>
接口限流控制
如果相对某个接口进行限流控制,可以通过此方式进行配置。
例如:某个接口最大每秒处理量为10个,那么只需要配置qps="10"
即可。
特殊说明:接口限流是单机的,目前不支持分布式限流。
<function id="D1006" type="s" qps="10">
<params>
<param id="type" name="类型"/>
</params>
<resource>DemoService.add</resource>
<description>新增测试</description>
</function>
通用复杂查询
2.3.9
版本支持,为了解决复杂查询操作(模糊查询,区间查询等)
- 必须使用通用mapper,继承
tk.mybatis.mapper.common.Mapper
- 必须使用
selectByExample
方式,只有此方法才能支持复杂查询 - 定义操作类型
operateType
,如果不配置默认EqualTo
匹配查询 - 排序方式
orderSort
,可以指定某些字段排序方式 dbField
:指定数据库属性,对应实体bean的属性,为了解决前端传入参数和数据库不匹配的问题
public interface DemoMapper extends tk.mybatis.mapper.common.Mapper<Demo> {
}
<function id="DEMO0013" type="m" >
<params>
<param name="名称" id="name" operateType="LIKE"/>
<param name="名称" id="id" operateType="GREATERTHAN" orderSort="desc"/>
<param name="名称" id="id2" operateType="LessThan" dbField="id"/>
</params>
<resource>com.wueasy.demo.mapper.DemoMapper.selectByExample</resource>
<description>查询测试</description>
</function>