Skip to content
项目
群组
代码片段
帮助
正在加载...
帮助
提交反馈
为 GitLab 提交贡献
登录
切换导航
I
ibzwf
项目
项目
详情
动态
版本
周期分析
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
统计图
议题
0
议题
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
CI / CD
CI / CD
流水线
作业
计划
统计图
Wiki
Wiki
代码片段
代码片段
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
统计图
创建新议题
作业
提交
议题看板
打开侧边栏
ibiz4jteam
ibzwf
提交
5b3f15f7
提交
5b3f15f7
编写于
6月 02, 2020
作者:
ibizdev
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
ibiz4j 发布系统代码
上级
4d7559a1
变更
56
隐藏空白字符变更
内嵌
并排
正在显示
56 个修改的文件
包含
1970 行增加
和
569 行删除
+1970
-569
ibiz-group-picker.vue
...eb/src/components/ibiz-group-picker/ibiz-group-picker.vue
+25
-24
en-US.ts
app_web/src/locale/lang/en-US.ts
+6
-6
zh-CN.ts
app_web/src/locale/lang/zh-CN.ts
+6
-6
wfgroup_en_US.ts
app_web/src/locale/lanres/entities/wfgroup/wfgroup_en_US.ts
+190
-0
wfgroup_zh_CN.ts
app_web/src/locale/lanres/entities/wfgroup/wfgroup_zh_CN.ts
+189
-0
wfmember_en_US.ts
...web/src/locale/lanres/entities/wfmember/wfmember_en_US.ts
+180
-0
wfmember_zh_CN.ts
...web/src/locale/lanres/entities/wfmember/wfmember_zh_CN.ts
+179
-0
wfprocess-definition_en_US.ts
...tities/wfprocess-definition/wfprocess-definition_en_US.ts
+191
-0
wfprocess-definition_zh_CN.ts
...tities/wfprocess-definition/wfprocess-definition_zh_CN.ts
+190
-0
wfremodel_en_US.ts
...b/src/locale/lanres/entities/wfremodel/wfremodel_en_US.ts
+37
-0
wfremodel_zh_CN.ts
...b/src/locale/lanres/entities/wfremodel/wfremodel_zh_CN.ts
+36
-0
wfsystem_en_US.ts
...web/src/locale/lanres/entities/wfsystem/wfsystem_en_US.ts
+7
-0
wfsystem_zh_CN.ts
...web/src/locale/lanres/entities/wfsystem/wfsystem_zh_CN.ts
+6
-0
wfuser_en_US.ts
app_web/src/locale/lanres/entities/wfuser/wfuser_en_US.ts
+189
-0
wfuser_zh_CN.ts
app_web/src/locale/lanres/entities/wfuser/wfuser_zh_CN.ts
+188
-0
wfgroup-edit-view-base.vue
...ges/workflow/wfgroup-edit-view/wfgroup-edit-view-base.vue
+5
-3
wfgroup-grid-view-base.vue
...ges/workflow/wfgroup-grid-view/wfgroup-grid-view-base.vue
+5
-3
wfgroup-mpickup-view-base.vue
...rkflow/wfgroup-mpickup-view/wfgroup-mpickup-view-base.vue
+5
-3
wfgroup-pickup-grid-view-base.vue
...fgroup-pickup-grid-view/wfgroup-pickup-grid-view-base.vue
+5
-3
wfgroup-pickup-view-base.vue
...workflow/wfgroup-pickup-view/wfgroup-pickup-view-base.vue
+5
-3
wfindex-view-base.vue
...web/src/pages/workflow/wfindex-view/wfindex-view-base.vue
+5
-3
wfmember-edit-view-base.vue
...s/workflow/wfmember-edit-view/wfmember-edit-view-base.vue
+5
-3
wfmember-grid-view-base.vue
...s/workflow/wfmember-grid-view/wfmember-grid-view-base.vue
+5
-3
wfprocess-definition-edit-view-base.vue
...inition-edit-view/wfprocess-definition-edit-view-base.vue
+5
-3
wfprocess-definition-grid-view-base.vue
...inition-grid-view/wfprocess-definition-grid-view-base.vue
+5
-3
wfremodel-edit-view-base.vue
...workflow/wfremodel-edit-view/wfremodel-edit-view-base.vue
+5
-3
wfuser-edit-view-base.vue
...pages/workflow/wfuser-edit-view/wfuser-edit-view-base.vue
+5
-3
wfuser-grid-view-base.vue
...pages/workflow/wfuser-grid-view/wfuser-grid-view-base.vue
+5
-3
wfuser-mpickup-view-base.vue
...workflow/wfuser-mpickup-view/wfuser-mpickup-view-base.vue
+5
-3
wfuser-pickup-grid-view-base.vue
.../wfuser-pickup-grid-view/wfuser-pickup-grid-view-base.vue
+5
-3
wfuser-pickup-view-base.vue
...s/workflow/wfuser-pickup-view/wfuser-pickup-view-base.vue
+5
-3
uiaction-tool.ts
app_web/src/utils/uiaction-tool/uiaction-tool.ts
+1
-1
main-grid-base.vue
app_web/src/widgets/wfgroup/main-grid/main-grid-base.vue
+0
-4
main-grid-base.vue
app_web/src/widgets/wfmember/main-grid/main-grid-base.vue
+0
-4
main-grid-base.vue
...widgets/wfprocess-definition/main-grid/main-grid-base.vue
+0
-4
main-grid-base.vue
app_web/src/widgets/wfuser/main-grid/main-grid-base.vue
+0
-4
config.xml
config.xml
+0
-5
ibzwf-app-web.yaml
ibzwf-app/ibzwf-app-web/src/main/docker/ibzwf-app-web.yaml
+5
-0
20200601200530_init_ibzcfg.xml
...ources/liquibase/changelog/20200601200530_init_ibzcfg.xml
+16
-0
Dockerfile
ibzwf-provider/ibzwf-provider-api/src/main/docker/Dockerfile
+1
-1
ibzwf-provider-api.yaml
...bzwf-provider-api/src/main/docker/ibzwf-provider-api.yaml
+6
-13
CaffeineCacheConfig.java
.../main/java/cn/ibizlab/util/cache/CaffeineCacheConfig.java
+11
-12
RedisCacheConfig.java
...src/main/java/cn/ibizlab/util/cache/RedisCacheConfig.java
+65
-57
CusRedisCache.java
.../main/java/cn/ibizlab/util/cache/cache/CusRedisCache.java
+0
-1
LayeringCache.java
.../main/java/cn/ibizlab/util/cache/cache/LayeringCache.java
+44
-46
CaffeineCacheManager.java
...ibizlab/util/cache/cacheManager/CaffeineCacheManager.java
+25
-44
LayeringCacheManager.java
...ibizlab/util/cache/cacheManager/LayeringCacheManager.java
+42
-42
RedisMessageListener.java
.../cn/ibizlab/util/cache/listener/RedisMessageListener.java
+18
-22
CustomJacksonSerializer.java
.../cn/ibizlab/util/cache/redis/CustomJacksonSerializer.java
+25
-0
CustomizedRedisCache.java
...ava/cn/ibizlab/util/cache/redis/CustomizedRedisCache.java
+1
-12
FastJsonRedisSerializer.java
.../cn/ibizlab/util/cache/redis/FastJsonRedisSerializer.java
+1
-39
KryoRedisSerializer.java
...java/cn/ibizlab/util/cache/redis/KryoRedisSerializer.java
+1
-67
RedisConfig.java
...rc/main/java/cn/ibizlab/util/cache/redis/RedisConfig.java
+1
-61
StringRedisSerializer.java
...va/cn/ibizlab/util/cache/redis/StringRedisSerializer.java
+1
-39
RedisChannelTopic.java
...rc/main/java/cn/ibizlab/util/enums/RedisChannelTopic.java
+2
-2
AuthenticationUser.java
...ain/java/cn/ibizlab/util/security/AuthenticationUser.java
+5
-5
未找到文件。
app_web/src/components/ibiz-group-picker/ibiz-group-picker.vue
浏览文件 @
5b3f15f7
...
...
@@ -4,7 +4,7 @@
<div
v-if=
"showTree"
class=
"ibiz-group-tree"
>
<ibiz-select-tree
:NodesData=
"treeItems"
v-model=
"treeSelectVal"
:treeOnly=
"true"
:defaultChecked=
"true"
@
select=
"treeSelect"
></ibiz-select-tree>
</div>
<div
class=
"ibiz-group-content"
:style=
"
{width:showTree?'calc(100% - 400px)':'100%'}"
>
<div
class=
"ibiz-group-content"
>
<ibiz-group-card
:data=
"cardItems"
text=
"label"
value=
"id"
groupName=
"group"
:multiple=
"multiple"
:defaultSelect=
"cardSelctVal"
@
select=
"groupSelect"
></ibiz-group-card>
</div>
</div>
...
...
@@ -276,28 +276,29 @@ export default class IBizGroupPicker extends Vue {
<
style
lang=
"less"
>
.ibiz-group-picker{
height:100%;
.ibiz-group-container {
display: flex;
height: calc(100% - 65px);
.ibiz-group-tree {
width: 400px;
border-right: 1px solid #ddd;
padding: 0 10px;
overflow: auto;
height: 100%;
}
.ibiz-group-content {
flex-grow: 1;
padding: 0 10px;
overflow: auto;
height: 100%;
}
}
.ibiz-group-footer {
padding: 16px;
text-align: right;
border-top: 1px solid #ddd;
}
width: 100%;
height: 100%;
.ibiz-group-container {
display: flex;
height: calc(100% - 65px);
.ibiz-group-tree {
min-width: 200px;
border-right: 1px solid #ddd;
padding: 0 34px 0 10px;
overflow: auto;
height: 100%;
}
.ibiz-group-content {
flex-grow: 1;
padding: 0 10px;
overflow: auto;
height: 100%;
}
}
.ibiz-group-footer {
padding: 16px;
text-align: right;
border-top: 1px solid #ddd;
}
}
</
style
>
\ No newline at end of file
app_web/src/locale/lang/en-US.ts
浏览文件 @
5b3f15f7
import
wfremodel_en_US
from
'@locale/lanres/wfremodel/wfremodel_en_US'
;
import
wfmember_en_US
from
'@locale/lanres/wfmember/wfmember_en_US'
;
import
wfgroup_en_US
from
'@locale/lanres/wfgroup/wfgroup_en_US'
;
import
wfuser_en_US
from
'@locale/lanres/wfuser/wfuser_en_US'
;
import
wfprocessdefinition_en_US
from
'@locale/lanres/wfprocess-definition/wfprocess-definition_en_US'
;
import
wfsystem_en_US
from
'@locale/lanres/wfsystem/wfsystem_en_US'
;
import
wfremodel_en_US
from
'@locale/lanres/
entities/
wfremodel/wfremodel_en_US'
;
import
wfmember_en_US
from
'@locale/lanres/
entities/
wfmember/wfmember_en_US'
;
import
wfgroup_en_US
from
'@locale/lanres/
entities/
wfgroup/wfgroup_en_US'
;
import
wfuser_en_US
from
'@locale/lanres/
entities/
wfuser/wfuser_en_US'
;
import
wfprocessdefinition_en_US
from
'@locale/lanres/
entities/
wfprocess-definition/wfprocess-definition_en_US'
;
import
wfsystem_en_US
from
'@locale/lanres/
entities/
wfsystem/wfsystem_en_US'
;
import
components_en_US
from
'@locale/lanres/components/components_en_US'
;
import
codelist_en_US
from
'@locale/lanres/codelist/codelist_en_US'
;
import
userCustom_en_US
from
'@locale/lanres/userCustom/userCustom_en_US'
;
...
...
app_web/src/locale/lang/zh-CN.ts
浏览文件 @
5b3f15f7
import
wfremodel_zh_CN
from
'@locale/lanres/wfremodel/wfremodel_zh_CN'
;
import
wfmember_zh_CN
from
'@locale/lanres/wfmember/wfmember_zh_CN'
;
import
wfgroup_zh_CN
from
'@locale/lanres/wfgroup/wfgroup_zh_CN'
;
import
wfuser_zh_CN
from
'@locale/lanres/wfuser/wfuser_zh_CN'
;
import
wfprocessdefinition_zh_CN
from
'@locale/lanres/wfprocess-definition/wfprocess-definition_zh_CN'
;
import
wfsystem_zh_CN
from
'@locale/lanres/wfsystem/wfsystem_zh_CN'
;
import
wfremodel_zh_CN
from
'@locale/lanres/
entities/
wfremodel/wfremodel_zh_CN'
;
import
wfmember_zh_CN
from
'@locale/lanres/
entities/
wfmember/wfmember_zh_CN'
;
import
wfgroup_zh_CN
from
'@locale/lanres/
entities/
wfgroup/wfgroup_zh_CN'
;
import
wfuser_zh_CN
from
'@locale/lanres/
entities/
wfuser/wfuser_zh_CN'
;
import
wfprocessdefinition_zh_CN
from
'@locale/lanres/
entities/
wfprocess-definition/wfprocess-definition_zh_CN'
;
import
wfsystem_zh_CN
from
'@locale/lanres/
entities/
wfsystem/wfsystem_zh_CN'
;
import
components_zh_CN
from
'@locale/lanres/components/components_zh_CN'
;
import
codelist_zh_CN
from
'@locale/lanres/codelist/codelist_zh_CN'
;
import
userCustom_zh_CN
from
'@locale/lanres/userCustom/userCustom_zh_CN'
;
...
...
app_web/src/locale/lanres/entities/wfgroup/wfgroup_en_US.ts
0 → 100644
浏览文件 @
5b3f15f7
export
default
{
fields
:
{
id
:
'组标识'
,
name
:
'组名称'
,
groupscope
:
'范围'
,
},
views
:
{
mpickupview
:
{
caption
:
"角色/用户组"
,
title
:
'角色/用户组'
,
},
editview
:
{
caption
:
"角色/用户组"
,
title
:
'角色/用户组'
,
},
pickupview
:
{
caption
:
"角色/用户组"
,
title
:
'角色/用户组'
,
},
pickupgridview
:
{
caption
:
"角色/用户组"
,
title
:
'角色/用户组'
,
},
gridview
:
{
caption
:
"角色/用户组"
,
title
:
'角色/用户组'
,
},
},
main_form
:
{
details
:
{
druipart1
:
"成员"
,
group1
:
"角色/用户组基本信息"
,
formpage1
:
"基本信息"
,
srforikey
:
""
,
srfkey
:
"组标识"
,
srfmajortext
:
"组名称"
,
srftempmode
:
""
,
srfuf
:
""
,
srfdeid
:
""
,
srfsourcekey
:
""
,
groupname
:
"组名称"
,
groupscope
:
"范围"
,
groupid
:
"组标识"
,
},
uiactions
:
{
},
},
main_grid
:
{
columns
:
{
groupid
:
"组标识"
,
groupname
:
"组名称"
,
groupscope
:
"范围"
,
},
uiactions
:
{
},
},
default_searchform
:
{
details
:
{
formpage1
:
"常规条件"
,
n_groupname_like
:
"组名称(文本包含(%))"
,
},
uiactions
:
{
},
},
gridviewtoolbar_toolbar
:
{
tbitem3
:
{
caption
:
"New"
,
tip
:
"New"
,
},
tbitem4
:
{
caption
:
"Edit"
,
tip
:
"Edit {0}"
,
},
tbitem6
:
{
caption
:
"Copy"
,
tip
:
"Copy {0}"
,
},
tbitem7
:
{
caption
:
"-"
,
tip
:
""
,
},
tbitem8
:
{
caption
:
"Remove"
,
tip
:
"Remove {0}"
,
},
tbitem9
:
{
caption
:
"-"
,
tip
:
""
,
},
tbitem13
:
{
caption
:
"Export"
,
tip
:
"Export {0} Data To Excel"
,
},
tbitem10
:
{
caption
:
"-"
,
tip
:
""
,
},
tbitem16
:
{
caption
:
"其它"
,
tip
:
"其它"
,
},
tbitem21
:
{
caption
:
"Export Data Model"
,
tip
:
"导出数据模型"
,
},
tbitem23
:
{
caption
:
"数据导入"
,
tip
:
"数据导入"
,
},
tbitem17
:
{
caption
:
"-"
,
tip
:
""
,
},
tbitem19
:
{
caption
:
"Filter"
,
tip
:
"Filter"
,
},
tbitem18
:
{
caption
:
"Help"
,
tip
:
"Help"
,
},
},
editviewtoolbar_toolbar
:
{
tbitem3
:
{
caption
:
"Save"
,
tip
:
"Save"
,
},
tbitem4
:
{
caption
:
"Save And New"
,
tip
:
"Save And New"
,
},
tbitem5
:
{
caption
:
"Save And Close"
,
tip
:
"Save And Close Window"
,
},
tbitem6
:
{
caption
:
"-"
,
tip
:
""
,
},
tbitem7
:
{
caption
:
"Remove And Close"
,
tip
:
"Remove And Close Window"
,
},
tbitem8
:
{
caption
:
"-"
,
tip
:
""
,
},
tbitem12
:
{
caption
:
"New"
,
tip
:
"New"
,
},
tbitem13
:
{
caption
:
"-"
,
tip
:
""
,
},
tbitem14
:
{
caption
:
"Copy"
,
tip
:
"Copy {0}"
,
},
tbitem16
:
{
caption
:
"-"
,
tip
:
""
,
},
tbitem23
:
{
caption
:
"第一个记录"
,
tip
:
"第一个记录"
,
},
tbitem24
:
{
caption
:
"上一个记录"
,
tip
:
"上一个记录"
,
},
tbitem25
:
{
caption
:
"下一个记录"
,
tip
:
"下一个记录"
,
},
tbitem26
:
{
caption
:
"最后一个记录"
,
tip
:
"最后一个记录"
,
},
tbitem21
:
{
caption
:
"-"
,
tip
:
""
,
},
tbitem22
:
{
caption
:
"Help"
,
tip
:
"Help"
,
},
},
};
\ No newline at end of file
app_web/src/locale/lanres/entities/wfgroup/wfgroup_zh_CN.ts
0 → 100644
浏览文件 @
5b3f15f7
export
default
{
fields
:
{
id
:
'组标识'
,
name
:
'组名称'
,
groupscope
:
'范围'
,
},
views
:
{
mpickupview
:
{
caption
:
'角色/用户组'
,
title
:
'角色/用户组'
,
},
editview
:
{
caption
:
'角色/用户组'
,
title
:
'角色/用户组'
,
},
pickupview
:
{
caption
:
'角色/用户组'
,
title
:
'角色/用户组'
,
},
pickupgridview
:
{
caption
:
'角色/用户组'
,
title
:
'角色/用户组'
,
},
gridview
:
{
caption
:
'角色/用户组'
,
title
:
'角色/用户组'
,
},
},
main_form
:
{
details
:
{
druipart1
:
'成员'
,
group1
:
'角色/用户组基本信息'
,
formpage1
:
'基本信息'
,
srforikey
:
''
,
srfkey
:
'组标识'
,
srfmajortext
:
'组名称'
,
srftempmode
:
''
,
srfuf
:
''
,
srfdeid
:
''
,
srfsourcekey
:
''
,
groupname
:
'组名称'
,
groupscope
:
'范围'
,
groupid
:
'组标识'
,
},
uiactions
:
{
},
},
main_grid
:
{
columns
:
{
groupid
:
'组标识'
,
groupname
:
'组名称'
,
groupscope
:
'范围'
,
},
uiactions
:
{
},
},
default_searchform
:
{
details
:
{
formpage1
:
'常规条件'
,
n_groupname_like
:
'组名称(文本包含(%))'
,
},
uiactions
:
{
},
},
gridviewtoolbar_toolbar
:
{
tbitem3
:
{
caption
:
'新建'
,
tip
:
'新建'
,
},
tbitem4
:
{
caption
:
'编辑'
,
tip
:
'编辑'
,
},
tbitem6
:
{
caption
:
'拷贝'
,
tip
:
'拷贝'
,
},
tbitem7
:
{
caption
:
'-'
,
tip
:
''
,
},
tbitem8
:
{
caption
:
'删除'
,
tip
:
'删除'
,
},
tbitem9
:
{
caption
:
'-'
,
tip
:
''
,
},
tbitem13
:
{
caption
:
'导出'
,
tip
:
'导出'
,
},
tbitem10
:
{
caption
:
'-'
,
tip
:
''
,
},
tbitem16
:
{
caption
:
'其它'
,
tip
:
'其它'
,
},
tbitem21
:
{
caption
:
'导出数据模型'
,
tip
:
'导出数据模型'
,
},
tbitem23
:
{
caption
:
'数据导入'
,
tip
:
'数据导入'
,
},
tbitem17
:
{
caption
:
'-'
,
tip
:
''
,
},
tbitem19
:
{
caption
:
'过滤'
,
tip
:
'过滤'
,
},
tbitem18
:
{
caption
:
'帮助'
,
tip
:
'帮助'
,
},
},
editviewtoolbar_toolbar
:
{
tbitem3
:
{
caption
:
'保存'
,
tip
:
'保存'
,
},
tbitem4
:
{
caption
:
'保存并新建'
,
tip
:
'保存并新建'
,
},
tbitem5
:
{
caption
:
'保存并关闭'
,
tip
:
'保存并关闭'
,
},
tbitem6
:
{
caption
:
'-'
,
tip
:
''
,
},
tbitem7
:
{
caption
:
'删除并关闭'
,
tip
:
'删除并关闭'
,
},
tbitem8
:
{
caption
:
'-'
,
tip
:
''
,
},
tbitem12
:
{
caption
:
'新建'
,
tip
:
'新建'
,
},
tbitem13
:
{
caption
:
'-'
,
tip
:
''
,
},
tbitem14
:
{
caption
:
'拷贝'
,
tip
:
'拷贝'
,
},
tbitem16
:
{
caption
:
'-'
,
tip
:
''
,
},
tbitem23
:
{
caption
:
'第一个记录'
,
tip
:
'第一个记录'
,
},
tbitem24
:
{
caption
:
'上一个记录'
,
tip
:
'上一个记录'
,
},
tbitem25
:
{
caption
:
'下一个记录'
,
tip
:
'下一个记录'
,
},
tbitem26
:
{
caption
:
'最后一个记录'
,
tip
:
'最后一个记录'
,
},
tbitem21
:
{
caption
:
'-'
,
tip
:
''
,
},
tbitem22
:
{
caption
:
'帮助'
,
tip
:
'帮助'
,
},
},
};
\ No newline at end of file
app_web/src/locale/lanres/entities/wfmember/wfmember_en_US.ts
0 → 100644
浏览文件 @
5b3f15f7
export
default
{
fields
:
{
memberid
:
'组成员标识'
,
membername
:
'组成员名称'
,
groupid
:
'组标识'
,
groupname
:
'用户组'
,
userid
:
'用户标识'
,
personname
:
'用户'
,
},
views
:
{
gridview
:
{
caption
:
"成员"
,
title
:
'成员'
,
},
editview
:
{
caption
:
"成员"
,
title
:
'成员'
,
},
},
main_form
:
{
details
:
{
group1
:
"成员基本信息"
,
formpage1
:
"基本信息"
,
srforikey
:
""
,
srfkey
:
"组成员标识"
,
srfmajortext
:
"组成员名称"
,
srftempmode
:
""
,
srfuf
:
""
,
srfdeid
:
""
,
srfsourcekey
:
""
,
groupid
:
"组标识"
,
userid
:
"用户标识"
,
personname
:
"用户"
,
memberid
:
"组成员标识"
,
},
uiactions
:
{
},
},
main_grid
:
{
columns
:
{
personname
:
"用户"
,
groupname
:
"用户组"
,
},
uiactions
:
{
},
},
default_searchform
:
{
details
:
{
formpage1
:
"常规条件"
,
n_personname_like
:
"用户(文本包含(%))"
,
},
uiactions
:
{
},
},
gridviewtoolbar_toolbar
:
{
tbitem3
:
{
caption
:
"New"
,
tip
:
"New"
,
},
tbitem4
:
{
caption
:
"Edit"
,
tip
:
"Edit {0}"
,
},
tbitem6
:
{
caption
:
"Copy"
,
tip
:
"Copy {0}"
,
},
tbitem7
:
{
caption
:
"-"
,
tip
:
""
,
},
tbitem8
:
{
caption
:
"Remove"
,
tip
:
"Remove {0}"
,
},
tbitem9
:
{
caption
:
"-"
,
tip
:
""
,
},
tbitem13
:
{
caption
:
"Export"
,
tip
:
"Export {0} Data To Excel"
,
},
tbitem10
:
{
caption
:
"-"
,
tip
:
""
,
},
tbitem16
:
{
caption
:
"其它"
,
tip
:
"其它"
,
},
tbitem21
:
{
caption
:
"Export Data Model"
,
tip
:
"导出数据模型"
,
},
tbitem23
:
{
caption
:
"数据导入"
,
tip
:
"数据导入"
,
},
tbitem17
:
{
caption
:
"-"
,
tip
:
""
,
},
tbitem19
:
{
caption
:
"Filter"
,
tip
:
"Filter"
,
},
tbitem18
:
{
caption
:
"Help"
,
tip
:
"Help"
,
},
},
editviewtoolbar_toolbar
:
{
tbitem3
:
{
caption
:
"Save"
,
tip
:
"Save"
,
},
tbitem4
:
{
caption
:
"Save And New"
,
tip
:
"Save And New"
,
},
tbitem5
:
{
caption
:
"Save And Close"
,
tip
:
"Save And Close Window"
,
},
tbitem6
:
{
caption
:
"-"
,
tip
:
""
,
},
tbitem7
:
{
caption
:
"Remove And Close"
,
tip
:
"Remove And Close Window"
,
},
tbitem8
:
{
caption
:
"-"
,
tip
:
""
,
},
tbitem12
:
{
caption
:
"New"
,
tip
:
"New"
,
},
tbitem13
:
{
caption
:
"-"
,
tip
:
""
,
},
tbitem14
:
{
caption
:
"Copy"
,
tip
:
"Copy {0}"
,
},
tbitem16
:
{
caption
:
"-"
,
tip
:
""
,
},
tbitem23
:
{
caption
:
"第一个记录"
,
tip
:
"第一个记录"
,
},
tbitem24
:
{
caption
:
"上一个记录"
,
tip
:
"上一个记录"
,
},
tbitem25
:
{
caption
:
"下一个记录"
,
tip
:
"下一个记录"
,
},
tbitem26
:
{
caption
:
"最后一个记录"
,
tip
:
"最后一个记录"
,
},
tbitem21
:
{
caption
:
"-"
,
tip
:
""
,
},
tbitem22
:
{
caption
:
"Help"
,
tip
:
"Help"
,
},
},
};
\ No newline at end of file
app_web/src/locale/lanres/entities/wfmember/wfmember_zh_CN.ts
0 → 100644
浏览文件 @
5b3f15f7
export
default
{
fields
:
{
memberid
:
'组成员标识'
,
membername
:
'组成员名称'
,
groupid
:
'组标识'
,
groupname
:
'用户组'
,
userid
:
'用户标识'
,
personname
:
'用户'
,
},
views
:
{
gridview
:
{
caption
:
'成员'
,
title
:
'成员'
,
},
editview
:
{
caption
:
'成员'
,
title
:
'成员'
,
},
},
main_form
:
{
details
:
{
group1
:
'成员基本信息'
,
formpage1
:
'基本信息'
,
srforikey
:
''
,
srfkey
:
'组成员标识'
,
srfmajortext
:
'组成员名称'
,
srftempmode
:
''
,
srfuf
:
''
,
srfdeid
:
''
,
srfsourcekey
:
''
,
groupid
:
'组标识'
,
userid
:
'用户标识'
,
personname
:
'用户'
,
memberid
:
'组成员标识'
,
},
uiactions
:
{
},
},
main_grid
:
{
columns
:
{
personname
:
'用户'
,
groupname
:
'用户组'
,
},
uiactions
:
{
},
},
default_searchform
:
{
details
:
{
formpage1
:
'常规条件'
,
n_personname_like
:
'用户(文本包含(%))'
,
},
uiactions
:
{
},
},
gridviewtoolbar_toolbar
:
{
tbitem3
:
{
caption
:
'新建'
,
tip
:
'新建'
,
},
tbitem4
:
{
caption
:
'编辑'
,
tip
:
'编辑'
,
},
tbitem6
:
{
caption
:
'拷贝'
,
tip
:
'拷贝'
,
},
tbitem7
:
{
caption
:
'-'
,
tip
:
''
,
},
tbitem8
:
{
caption
:
'删除'
,
tip
:
'删除'
,
},
tbitem9
:
{
caption
:
'-'
,
tip
:
''
,
},
tbitem13
:
{
caption
:
'导出'
,
tip
:
'导出'
,
},
tbitem10
:
{
caption
:
'-'
,
tip
:
''
,
},
tbitem16
:
{
caption
:
'其它'
,
tip
:
'其它'
,
},
tbitem21
:
{
caption
:
'导出数据模型'
,
tip
:
'导出数据模型'
,
},
tbitem23
:
{
caption
:
'数据导入'
,
tip
:
'数据导入'
,
},
tbitem17
:
{
caption
:
'-'
,
tip
:
''
,
},
tbitem19
:
{
caption
:
'过滤'
,
tip
:
'过滤'
,
},
tbitem18
:
{
caption
:
'帮助'
,
tip
:
'帮助'
,
},
},
editviewtoolbar_toolbar
:
{
tbitem3
:
{
caption
:
'保存'
,
tip
:
'保存'
,
},
tbitem4
:
{
caption
:
'保存并新建'
,
tip
:
'保存并新建'
,
},
tbitem5
:
{
caption
:
'保存并关闭'
,
tip
:
'保存并关闭'
,
},
tbitem6
:
{
caption
:
'-'
,
tip
:
''
,
},
tbitem7
:
{
caption
:
'删除并关闭'
,
tip
:
'删除并关闭'
,
},
tbitem8
:
{
caption
:
'-'
,
tip
:
''
,
},
tbitem12
:
{
caption
:
'新建'
,
tip
:
'新建'
,
},
tbitem13
:
{
caption
:
'-'
,
tip
:
''
,
},
tbitem14
:
{
caption
:
'拷贝'
,
tip
:
'拷贝'
,
},
tbitem16
:
{
caption
:
'-'
,
tip
:
''
,
},
tbitem23
:
{
caption
:
'第一个记录'
,
tip
:
'第一个记录'
,
},
tbitem24
:
{
caption
:
'上一个记录'
,
tip
:
'上一个记录'
,
},
tbitem25
:
{
caption
:
'下一个记录'
,
tip
:
'下一个记录'
,
},
tbitem26
:
{
caption
:
'最后一个记录'
,
tip
:
'最后一个记录'
,
},
tbitem21
:
{
caption
:
'-'
,
tip
:
''
,
},
tbitem22
:
{
caption
:
'帮助'
,
tip
:
'帮助'
,
},
},
};
\ No newline at end of file
app_web/src/locale/lanres/entities/wfprocess-definition/wfprocess-definition_en_US.ts
0 → 100644
浏览文件 @
5b3f15f7
export
default
{
fields
:
{
definitionkey
:
'DefinitionKey'
,
definitionname
:
'流程定义名称'
,
modelversion
:
'模型版本'
,
modelenable
:
'模型是否启用'
,
pssystemid
:
'系统标识'
,
taskprocessdefinitionkey
:
'TaskDefinitionKey'
,
md5check
:
'校验'
,
bpmnfile
:
'BPMN'
,
deploykey
:
'DeployKey'
,
},
views
:
{
editview
:
{
caption
:
"流程定义"
,
title
:
'流程定义'
,
},
gridview
:
{
caption
:
"流程定义"
,
title
:
'流程定义'
,
},
},
main_form
:
{
details
:
{
group1
:
"模型基本信息"
,
formpage1
:
"基本信息"
,
srforikey
:
""
,
srfkey
:
"DefinitionKey"
,
srfmajortext
:
"流程定义名称"
,
srftempmode
:
""
,
srfuf
:
""
,
srfdeid
:
""
,
srfsourcekey
:
""
,
definitionkey
:
"DefinitionKey"
,
deploykey
:
"DefinitionKey"
,
definitionname
:
"流程定义名称"
,
pssystemid
:
"系统标识"
,
modelversion
:
"模型版本"
,
modelenable
:
"模型是否启用"
,
bpmnfile
:
"BPMN"
,
md5check
:
"校验"
,
},
uiactions
:
{
},
},
main_grid
:
{
columns
:
{
definitionkey
:
"DefinitionKey"
,
definitionname
:
"流程定义名称"
,
pssystemid
:
"系统标识"
,
modelversion
:
"模型版本"
,
modelenable
:
"模型是否启用"
,
},
uiactions
:
{
},
},
default_searchform
:
{
details
:
{
formpage1
:
"常规条件"
,
n_deploykey_like
:
"DefinitionKey"
,
n_definitionname_like
:
"流程定义名称"
,
},
uiactions
:
{
},
},
gridviewtoolbar_toolbar
:
{
tbitem3
:
{
caption
:
"New"
,
tip
:
"New"
,
},
tbitem4
:
{
caption
:
"Edit"
,
tip
:
"Edit {0}"
,
},
tbitem6
:
{
caption
:
"Copy"
,
tip
:
"Copy {0}"
,
},
tbitem7
:
{
caption
:
"-"
,
tip
:
""
,
},
tbitem8
:
{
caption
:
"Remove"
,
tip
:
"Remove {0}"
,
},
tbitem9
:
{
caption
:
"-"
,
tip
:
""
,
},
tbitem13
:
{
caption
:
"Export"
,
tip
:
"Export {0} Data To Excel"
,
},
tbitem10
:
{
caption
:
"-"
,
tip
:
""
,
},
tbitem16
:
{
caption
:
"其它"
,
tip
:
"其它"
,
},
tbitem21
:
{
caption
:
"Export Data Model"
,
tip
:
"导出数据模型"
,
},
tbitem23
:
{
caption
:
"数据导入"
,
tip
:
"数据导入"
,
},
tbitem17
:
{
caption
:
"-"
,
tip
:
""
,
},
tbitem19
:
{
caption
:
"Filter"
,
tip
:
"Filter"
,
},
tbitem18
:
{
caption
:
"Help"
,
tip
:
"Help"
,
},
},
editviewtoolbar_toolbar
:
{
tbitem3
:
{
caption
:
"Save"
,
tip
:
"Save"
,
},
tbitem4
:
{
caption
:
"Save And New"
,
tip
:
"Save And New"
,
},
tbitem5
:
{
caption
:
"Save And Close"
,
tip
:
"Save And Close Window"
,
},
tbitem6
:
{
caption
:
"-"
,
tip
:
""
,
},
tbitem7
:
{
caption
:
"Remove And Close"
,
tip
:
"Remove And Close Window"
,
},
tbitem8
:
{
caption
:
"-"
,
tip
:
""
,
},
tbitem12
:
{
caption
:
"New"
,
tip
:
"New"
,
},
tbitem13
:
{
caption
:
"-"
,
tip
:
""
,
},
tbitem14
:
{
caption
:
"Copy"
,
tip
:
"Copy {0}"
,
},
tbitem16
:
{
caption
:
"-"
,
tip
:
""
,
},
tbitem23
:
{
caption
:
"第一个记录"
,
tip
:
"第一个记录"
,
},
tbitem24
:
{
caption
:
"上一个记录"
,
tip
:
"上一个记录"
,
},
tbitem25
:
{
caption
:
"下一个记录"
,
tip
:
"下一个记录"
,
},
tbitem26
:
{
caption
:
"最后一个记录"
,
tip
:
"最后一个记录"
,
},
tbitem21
:
{
caption
:
"-"
,
tip
:
""
,
},
tbitem22
:
{
caption
:
"Help"
,
tip
:
"Help"
,
},
},
};
\ No newline at end of file
app_web/src/locale/lanres/entities/wfprocess-definition/wfprocess-definition_zh_CN.ts
0 → 100644
浏览文件 @
5b3f15f7
export
default
{
fields
:
{
definitionkey
:
'DefinitionKey'
,
definitionname
:
'流程定义名称'
,
modelversion
:
'模型版本'
,
modelenable
:
'模型是否启用'
,
pssystemid
:
'系统标识'
,
taskprocessdefinitionkey
:
'TaskDefinitionKey'
,
md5check
:
'校验'
,
bpmnfile
:
'BPMN'
,
deploykey
:
'DeployKey'
,
},
views
:
{
editview
:
{
caption
:
'流程定义'
,
title
:
'流程定义'
,
},
gridview
:
{
caption
:
'流程定义'
,
title
:
'流程定义'
,
},
},
main_form
:
{
details
:
{
group1
:
'模型基本信息'
,
formpage1
:
'基本信息'
,
srforikey
:
''
,
srfkey
:
'DefinitionKey'
,
srfmajortext
:
'流程定义名称'
,
srftempmode
:
''
,
srfuf
:
''
,
srfdeid
:
''
,
srfsourcekey
:
''
,
definitionkey
:
'DefinitionKey'
,
deploykey
:
'DefinitionKey'
,
definitionname
:
'流程定义名称'
,
pssystemid
:
'系统标识'
,
modelversion
:
'模型版本'
,
modelenable
:
'模型是否启用'
,
bpmnfile
:
'BPMN'
,
md5check
:
'校验'
,
},
uiactions
:
{
},
},
main_grid
:
{
columns
:
{
definitionkey
:
'DefinitionKey'
,
definitionname
:
'流程定义名称'
,
pssystemid
:
'系统标识'
,
modelversion
:
'模型版本'
,
modelenable
:
'模型是否启用'
,
},
uiactions
:
{
},
},
default_searchform
:
{
details
:
{
formpage1
:
'常规条件'
,
n_deploykey_like
:
'DefinitionKey'
,
n_definitionname_like
:
'流程定义名称'
,
},
uiactions
:
{
},
},
gridviewtoolbar_toolbar
:
{
tbitem3
:
{
caption
:
'新建'
,
tip
:
'新建'
,
},
tbitem4
:
{
caption
:
'编辑'
,
tip
:
'编辑'
,
},
tbitem6
:
{
caption
:
'拷贝'
,
tip
:
'拷贝'
,
},
tbitem7
:
{
caption
:
'-'
,
tip
:
''
,
},
tbitem8
:
{
caption
:
'删除'
,
tip
:
'删除'
,
},
tbitem9
:
{
caption
:
'-'
,
tip
:
''
,
},
tbitem13
:
{
caption
:
'导出'
,
tip
:
'导出'
,
},
tbitem10
:
{
caption
:
'-'
,
tip
:
''
,
},
tbitem16
:
{
caption
:
'其它'
,
tip
:
'其它'
,
},
tbitem21
:
{
caption
:
'导出数据模型'
,
tip
:
'导出数据模型'
,
},
tbitem23
:
{
caption
:
'数据导入'
,
tip
:
'数据导入'
,
},
tbitem17
:
{
caption
:
'-'
,
tip
:
''
,
},
tbitem19
:
{
caption
:
'过滤'
,
tip
:
'过滤'
,
},
tbitem18
:
{
caption
:
'帮助'
,
tip
:
'帮助'
,
},
},
editviewtoolbar_toolbar
:
{
tbitem3
:
{
caption
:
'保存'
,
tip
:
'保存'
,
},
tbitem4
:
{
caption
:
'保存并新建'
,
tip
:
'保存并新建'
,
},
tbitem5
:
{
caption
:
'保存并关闭'
,
tip
:
'保存并关闭'
,
},
tbitem6
:
{
caption
:
'-'
,
tip
:
''
,
},
tbitem7
:
{
caption
:
'删除并关闭'
,
tip
:
'删除并关闭'
,
},
tbitem8
:
{
caption
:
'-'
,
tip
:
''
,
},
tbitem12
:
{
caption
:
'新建'
,
tip
:
'新建'
,
},
tbitem13
:
{
caption
:
'-'
,
tip
:
''
,
},
tbitem14
:
{
caption
:
'拷贝'
,
tip
:
'拷贝'
,
},
tbitem16
:
{
caption
:
'-'
,
tip
:
''
,
},
tbitem23
:
{
caption
:
'第一个记录'
,
tip
:
'第一个记录'
,
},
tbitem24
:
{
caption
:
'上一个记录'
,
tip
:
'上一个记录'
,
},
tbitem25
:
{
caption
:
'下一个记录'
,
tip
:
'下一个记录'
,
},
tbitem26
:
{
caption
:
'最后一个记录'
,
tip
:
'最后一个记录'
,
},
tbitem21
:
{
caption
:
'-'
,
tip
:
''
,
},
tbitem22
:
{
caption
:
'帮助'
,
tip
:
'帮助'
,
},
},
};
\ No newline at end of file
app_web/src/locale/lanres/entities/wfremodel/wfremodel_en_US.ts
0 → 100644
浏览文件 @
5b3f15f7
export
default
{
fields
:
{
id
:
'ID'
,
name
:
'名称'
,
bpmnfile
:
'BPMN'
,
},
views
:
{
editview
:
{
caption
:
"流程模型"
,
title
:
'流程模型'
,
},
},
main_form
:
{
details
:
{
group1
:
"流程模型"
,
formpage1
:
"基本信息"
,
srforikey
:
""
,
srfkey
:
"ID"
,
srfmajortext
:
"名称"
,
srftempmode
:
""
,
srfuf
:
""
,
srfdeid
:
""
,
srfsourcekey
:
""
,
bpmnfile
:
"BPMN"
,
modelid
:
"ID"
,
},
uiactions
:
{
},
},
editviewtoolbar_toolbar
:
{
tbitem1
:
{
caption
:
"Save"
,
tip
:
"Save"
,
},
},
};
\ No newline at end of file
app_web/src/locale/lanres/entities/wfremodel/wfremodel_zh_CN.ts
0 → 100644
浏览文件 @
5b3f15f7
export
default
{
fields
:
{
id
:
'ID'
,
name
:
'名称'
,
bpmnfile
:
'BPMN'
,
},
views
:
{
editview
:
{
caption
:
'流程模型'
,
title
:
'流程模型'
,
},
},
main_form
:
{
details
:
{
group1
:
'流程模型'
,
formpage1
:
'基本信息'
,
srforikey
:
''
,
srfkey
:
'ID'
,
srfmajortext
:
'名称'
,
srftempmode
:
''
,
srfuf
:
''
,
srfdeid
:
''
,
srfsourcekey
:
''
,
bpmnfile
:
'BPMN'
,
modelid
:
'ID'
,
},
uiactions
:
{
},
},
editviewtoolbar_toolbar
:
{
tbitem1
:
{
caption
:
'保存'
,
tip
:
'保存'
,
},
},
};
\ No newline at end of file
app_web/src/locale/lanres/entities/wfsystem/wfsystem_en_US.ts
0 → 100644
浏览文件 @
5b3f15f7
export
default
{
fields
:
{
pssystemid
:
'系统标识'
,
pssystemname
:
'系统名称'
,
},
};
\ No newline at end of file
app_web/src/locale/lanres/entities/wfsystem/wfsystem_zh_CN.ts
0 → 100644
浏览文件 @
5b3f15f7
export
default
{
fields
:
{
pssystemid
:
'系统标识'
,
pssystemname
:
'系统名称'
,
},
};
\ No newline at end of file
app_web/src/locale/lanres/entities/wfuser/wfuser_en_US.ts
0 → 100644
浏览文件 @
5b3f15f7
export
default
{
fields
:
{
id
:
'用户标识'
,
firstname
:
'用户全局名'
,
displayname
:
'用户名称'
,
},
views
:
{
mpickupview
:
{
caption
:
"用户"
,
title
:
'用户'
,
},
pickupview
:
{
caption
:
"用户"
,
title
:
'用户'
,
},
editview
:
{
caption
:
"用户"
,
title
:
'用户'
,
},
pickupgridview
:
{
caption
:
"用户"
,
title
:
'用户'
,
},
gridview
:
{
caption
:
"用户"
,
title
:
'用户'
,
},
},
main_form
:
{
details
:
{
group1
:
"用户基本信息"
,
formpage1
:
"基本信息"
,
srforikey
:
""
,
srfkey
:
"用户标识"
,
srfmajortext
:
"用户名称"
,
srftempmode
:
""
,
srfuf
:
""
,
srfdeid
:
""
,
srfsourcekey
:
""
,
personname
:
"用户名称"
,
username
:
"用户全局名"
,
userid
:
"用户标识"
,
},
uiactions
:
{
},
},
main_grid
:
{
columns
:
{
userid
:
"用户标识"
,
personname
:
"用户名称"
,
username
:
"用户全局名"
,
},
uiactions
:
{
},
},
default_searchform
:
{
details
:
{
formpage1
:
"常规条件"
,
n_personname_like
:
"用户名称(文本包含(%))"
,
},
uiactions
:
{
},
},
editviewtoolbar_toolbar
:
{
tbitem3
:
{
caption
:
"Save"
,
tip
:
"Save"
,
},
tbitem4
:
{
caption
:
"Save And New"
,
tip
:
"Save And New"
,
},
tbitem5
:
{
caption
:
"Save And Close"
,
tip
:
"Save And Close Window"
,
},
tbitem6
:
{
caption
:
"-"
,
tip
:
""
,
},
tbitem7
:
{
caption
:
"Remove And Close"
,
tip
:
"Remove And Close Window"
,
},
tbitem8
:
{
caption
:
"-"
,
tip
:
""
,
},
tbitem12
:
{
caption
:
"New"
,
tip
:
"New"
,
},
tbitem13
:
{
caption
:
"-"
,
tip
:
""
,
},
tbitem14
:
{
caption
:
"Copy"
,
tip
:
"Copy {0}"
,
},
tbitem16
:
{
caption
:
"-"
,
tip
:
""
,
},
tbitem23
:
{
caption
:
"第一个记录"
,
tip
:
"第一个记录"
,
},
tbitem24
:
{
caption
:
"上一个记录"
,
tip
:
"上一个记录"
,
},
tbitem25
:
{
caption
:
"下一个记录"
,
tip
:
"下一个记录"
,
},
tbitem26
:
{
caption
:
"最后一个记录"
,
tip
:
"最后一个记录"
,
},
tbitem21
:
{
caption
:
"-"
,
tip
:
""
,
},
tbitem22
:
{
caption
:
"Help"
,
tip
:
"Help"
,
},
},
gridviewtoolbar_toolbar
:
{
tbitem3
:
{
caption
:
"New"
,
tip
:
"New"
,
},
tbitem4
:
{
caption
:
"Edit"
,
tip
:
"Edit {0}"
,
},
tbitem6
:
{
caption
:
"Copy"
,
tip
:
"Copy {0}"
,
},
tbitem7
:
{
caption
:
"-"
,
tip
:
""
,
},
tbitem8
:
{
caption
:
"Remove"
,
tip
:
"Remove {0}"
,
},
tbitem9
:
{
caption
:
"-"
,
tip
:
""
,
},
tbitem13
:
{
caption
:
"Export"
,
tip
:
"Export {0} Data To Excel"
,
},
tbitem10
:
{
caption
:
"-"
,
tip
:
""
,
},
tbitem16
:
{
caption
:
"其它"
,
tip
:
"其它"
,
},
tbitem21
:
{
caption
:
"Export Data Model"
,
tip
:
"导出数据模型"
,
},
tbitem23
:
{
caption
:
"数据导入"
,
tip
:
"数据导入"
,
},
tbitem17
:
{
caption
:
"-"
,
tip
:
""
,
},
tbitem19
:
{
caption
:
"Filter"
,
tip
:
"Filter"
,
},
tbitem18
:
{
caption
:
"Help"
,
tip
:
"Help"
,
},
},
};
\ No newline at end of file
app_web/src/locale/lanres/entities/wfuser/wfuser_zh_CN.ts
0 → 100644
浏览文件 @
5b3f15f7
export
default
{
fields
:
{
id
:
'用户标识'
,
firstname
:
'用户全局名'
,
displayname
:
'用户名称'
,
},
views
:
{
mpickupview
:
{
caption
:
'用户'
,
title
:
'用户'
,
},
pickupview
:
{
caption
:
'用户'
,
title
:
'用户'
,
},
editview
:
{
caption
:
'用户'
,
title
:
'用户'
,
},
pickupgridview
:
{
caption
:
'用户'
,
title
:
'用户'
,
},
gridview
:
{
caption
:
'用户'
,
title
:
'用户'
,
},
},
main_form
:
{
details
:
{
group1
:
'用户基本信息'
,
formpage1
:
'基本信息'
,
srforikey
:
''
,
srfkey
:
'用户标识'
,
srfmajortext
:
'用户名称'
,
srftempmode
:
''
,
srfuf
:
''
,
srfdeid
:
''
,
srfsourcekey
:
''
,
personname
:
'用户名称'
,
username
:
'用户全局名'
,
userid
:
'用户标识'
,
},
uiactions
:
{
},
},
main_grid
:
{
columns
:
{
userid
:
'用户标识'
,
personname
:
'用户名称'
,
username
:
'用户全局名'
,
},
uiactions
:
{
},
},
default_searchform
:
{
details
:
{
formpage1
:
'常规条件'
,
n_personname_like
:
'用户名称(文本包含(%))'
,
},
uiactions
:
{
},
},
editviewtoolbar_toolbar
:
{
tbitem3
:
{
caption
:
'保存'
,
tip
:
'保存'
,
},
tbitem4
:
{
caption
:
'保存并新建'
,
tip
:
'保存并新建'
,
},
tbitem5
:
{
caption
:
'保存并关闭'
,
tip
:
'保存并关闭'
,
},
tbitem6
:
{
caption
:
'-'
,
tip
:
''
,
},
tbitem7
:
{
caption
:
'删除并关闭'
,
tip
:
'删除并关闭'
,
},
tbitem8
:
{
caption
:
'-'
,
tip
:
''
,
},
tbitem12
:
{
caption
:
'新建'
,
tip
:
'新建'
,
},
tbitem13
:
{
caption
:
'-'
,
tip
:
''
,
},
tbitem14
:
{
caption
:
'拷贝'
,
tip
:
'拷贝'
,
},
tbitem16
:
{
caption
:
'-'
,
tip
:
''
,
},
tbitem23
:
{
caption
:
'第一个记录'
,
tip
:
'第一个记录'
,
},
tbitem24
:
{
caption
:
'上一个记录'
,
tip
:
'上一个记录'
,
},
tbitem25
:
{
caption
:
'下一个记录'
,
tip
:
'下一个记录'
,
},
tbitem26
:
{
caption
:
'最后一个记录'
,
tip
:
'最后一个记录'
,
},
tbitem21
:
{
caption
:
'-'
,
tip
:
''
,
},
tbitem22
:
{
caption
:
'帮助'
,
tip
:
'帮助'
,
},
},
gridviewtoolbar_toolbar
:
{
tbitem3
:
{
caption
:
'新建'
,
tip
:
'新建'
,
},
tbitem4
:
{
caption
:
'编辑'
,
tip
:
'编辑'
,
},
tbitem6
:
{
caption
:
'拷贝'
,
tip
:
'拷贝'
,
},
tbitem7
:
{
caption
:
'-'
,
tip
:
''
,
},
tbitem8
:
{
caption
:
'删除'
,
tip
:
'删除'
,
},
tbitem9
:
{
caption
:
'-'
,
tip
:
''
,
},
tbitem13
:
{
caption
:
'导出'
,
tip
:
'导出'
,
},
tbitem10
:
{
caption
:
'-'
,
tip
:
''
,
},
tbitem16
:
{
caption
:
'其它'
,
tip
:
'其它'
,
},
tbitem21
:
{
caption
:
'导出数据模型'
,
tip
:
'导出数据模型'
,
},
tbitem23
:
{
caption
:
'数据导入'
,
tip
:
'数据导入'
,
},
tbitem17
:
{
caption
:
'-'
,
tip
:
''
,
},
tbitem19
:
{
caption
:
'过滤'
,
tip
:
'过滤'
,
},
tbitem18
:
{
caption
:
'帮助'
,
tip
:
'帮助'
,
},
},
};
\ No newline at end of file
app_web/src/pages/workflow/wfgroup-edit-view/wfgroup-edit-view-base.vue
浏览文件 @
5b3f15f7
...
...
@@ -258,10 +258,12 @@ export default class WFGroupEditViewBase extends Vue {
onViewData
(
newVal
:
any
,
oldVal
:
any
)
{
const
_this
:
any
=
this
;
if
(
!
Object
.
is
(
newVal
,
oldVal
)
&&
_this
.
engine
)
{
_this
.
parseViewParam
();
_this
.
engine
.
load
();
this
.
$nextTick
(()
=>
{
_this
.
parseViewParam
();
_this
.
engine
.
load
();
});
}
}
/**
...
...
app_web/src/pages/workflow/wfgroup-grid-view/wfgroup-grid-view-base.vue
浏览文件 @
5b3f15f7
...
...
@@ -284,10 +284,12 @@ export default class WFGroupGridViewBase extends Vue {
onViewData
(
newVal
:
any
,
oldVal
:
any
)
{
const
_this
:
any
=
this
;
if
(
!
Object
.
is
(
newVal
,
oldVal
)
&&
_this
.
engine
)
{
_this
.
parseViewParam
();
_this
.
engine
.
load
();
this
.
$nextTick
(()
=>
{
_this
.
parseViewParam
();
_this
.
engine
.
load
();
});
}
}
/**
...
...
app_web/src/pages/workflow/wfgroup-mpickup-view/wfgroup-mpickup-view-base.vue
浏览文件 @
5b3f15f7
...
...
@@ -203,10 +203,12 @@ export default class WFGroupMPickupViewBase extends Vue {
onViewData
(
newVal
:
any
,
oldVal
:
any
)
{
const
_this
:
any
=
this
;
if
(
!
Object
.
is
(
newVal
,
oldVal
)
&&
_this
.
engine
)
{
_this
.
parseViewParam
();
_this
.
engine
.
load
();
this
.
$nextTick
(()
=>
{
_this
.
parseViewParam
();
_this
.
engine
.
load
();
});
}
}
/**
...
...
app_web/src/pages/workflow/wfgroup-pickup-grid-view/wfgroup-pickup-grid-view-base.vue
浏览文件 @
5b3f15f7
...
...
@@ -182,10 +182,12 @@ export default class WFGroupPickupGridViewBase extends Vue {
onViewData
(
newVal
:
any
,
oldVal
:
any
)
{
const
_this
:
any
=
this
;
if
(
!
Object
.
is
(
newVal
,
oldVal
)
&&
_this
.
engine
)
{
_this
.
parseViewParam
();
_this
.
engine
.
load
();
this
.
$nextTick
(()
=>
{
_this
.
parseViewParam
();
_this
.
engine
.
load
();
});
}
}
/**
...
...
app_web/src/pages/workflow/wfgroup-pickup-view/wfgroup-pickup-view-base.vue
浏览文件 @
5b3f15f7
...
...
@@ -170,10 +170,12 @@ export default class WFGroupPickupViewBase extends Vue {
onViewData
(
newVal
:
any
,
oldVal
:
any
)
{
const
_this
:
any
=
this
;
if
(
!
Object
.
is
(
newVal
,
oldVal
)
&&
_this
.
engine
)
{
_this
.
parseViewParam
();
_this
.
engine
.
load
();
this
.
$nextTick
(()
=>
{
_this
.
parseViewParam
();
_this
.
engine
.
load
();
});
}
}
/**
...
...
app_web/src/pages/workflow/wfindex-view/wfindex-view-base.vue
浏览文件 @
5b3f15f7
...
...
@@ -176,10 +176,12 @@ export default class WFIndexViewBase extends Vue {
onViewData
(
newVal
:
any
,
oldVal
:
any
)
{
const
_this
:
any
=
this
;
if
(
!
Object
.
is
(
newVal
,
oldVal
)
&&
_this
.
engine
)
{
_this
.
parseViewParam
();
_this
.
engine
.
load
();
this
.
$nextTick
(()
=>
{
_this
.
parseViewParam
();
_this
.
engine
.
load
();
});
}
}
/**
...
...
app_web/src/pages/workflow/wfmember-edit-view/wfmember-edit-view-base.vue
浏览文件 @
5b3f15f7
...
...
@@ -258,10 +258,12 @@ export default class WFMemberEditViewBase extends Vue {
onViewData
(
newVal
:
any
,
oldVal
:
any
)
{
const
_this
:
any
=
this
;
if
(
!
Object
.
is
(
newVal
,
oldVal
)
&&
_this
.
engine
)
{
_this
.
parseViewParam
();
_this
.
engine
.
load
();
this
.
$nextTick
(()
=>
{
_this
.
parseViewParam
();
_this
.
engine
.
load
();
});
}
}
/**
...
...
app_web/src/pages/workflow/wfmember-grid-view/wfmember-grid-view-base.vue
浏览文件 @
5b3f15f7
...
...
@@ -284,10 +284,12 @@ export default class WFMemberGridViewBase extends Vue {
onViewData
(
newVal
:
any
,
oldVal
:
any
)
{
const
_this
:
any
=
this
;
if
(
!
Object
.
is
(
newVal
,
oldVal
)
&&
_this
.
engine
)
{
_this
.
parseViewParam
();
_this
.
engine
.
load
();
this
.
$nextTick
(()
=>
{
_this
.
parseViewParam
();
_this
.
engine
.
load
();
});
}
}
/**
...
...
app_web/src/pages/workflow/wfprocess-definition-edit-view/wfprocess-definition-edit-view-base.vue
浏览文件 @
5b3f15f7
...
...
@@ -258,10 +258,12 @@ export default class WFProcessDefinitionEditViewBase extends Vue {
onViewData
(
newVal
:
any
,
oldVal
:
any
)
{
const
_this
:
any
=
this
;
if
(
!
Object
.
is
(
newVal
,
oldVal
)
&&
_this
.
engine
)
{
_this
.
parseViewParam
();
_this
.
engine
.
load
();
this
.
$nextTick
(()
=>
{
_this
.
parseViewParam
();
_this
.
engine
.
load
();
});
}
}
/**
...
...
app_web/src/pages/workflow/wfprocess-definition-grid-view/wfprocess-definition-grid-view-base.vue
浏览文件 @
5b3f15f7
...
...
@@ -284,10 +284,12 @@ export default class WFProcessDefinitionGridViewBase extends Vue {
onViewData
(
newVal
:
any
,
oldVal
:
any
)
{
const
_this
:
any
=
this
;
if
(
!
Object
.
is
(
newVal
,
oldVal
)
&&
_this
.
engine
)
{
_this
.
parseViewParam
();
_this
.
engine
.
load
();
this
.
$nextTick
(()
=>
{
_this
.
parseViewParam
();
_this
.
engine
.
load
();
});
}
}
/**
...
...
app_web/src/pages/workflow/wfremodel-edit-view/wfremodel-edit-view-base.vue
浏览文件 @
5b3f15f7
...
...
@@ -188,10 +188,12 @@ export default class WFREModelEditViewBase extends Vue {
onViewData
(
newVal
:
any
,
oldVal
:
any
)
{
const
_this
:
any
=
this
;
if
(
!
Object
.
is
(
newVal
,
oldVal
)
&&
_this
.
engine
)
{
_this
.
parseViewParam
();
_this
.
engine
.
load
();
this
.
$nextTick
(()
=>
{
_this
.
parseViewParam
();
_this
.
engine
.
load
();
});
}
}
/**
...
...
app_web/src/pages/workflow/wfuser-edit-view/wfuser-edit-view-base.vue
浏览文件 @
5b3f15f7
...
...
@@ -258,10 +258,12 @@ export default class WFUserEditViewBase extends Vue {
onViewData
(
newVal
:
any
,
oldVal
:
any
)
{
const
_this
:
any
=
this
;
if
(
!
Object
.
is
(
newVal
,
oldVal
)
&&
_this
.
engine
)
{
_this
.
parseViewParam
();
_this
.
engine
.
load
();
this
.
$nextTick
(()
=>
{
_this
.
parseViewParam
();
_this
.
engine
.
load
();
});
}
}
/**
...
...
app_web/src/pages/workflow/wfuser-grid-view/wfuser-grid-view-base.vue
浏览文件 @
5b3f15f7
...
...
@@ -284,10 +284,12 @@ export default class WFUserGridViewBase extends Vue {
onViewData
(
newVal
:
any
,
oldVal
:
any
)
{
const
_this
:
any
=
this
;
if
(
!
Object
.
is
(
newVal
,
oldVal
)
&&
_this
.
engine
)
{
_this
.
parseViewParam
();
_this
.
engine
.
load
();
this
.
$nextTick
(()
=>
{
_this
.
parseViewParam
();
_this
.
engine
.
load
();
});
}
}
/**
...
...
app_web/src/pages/workflow/wfuser-mpickup-view/wfuser-mpickup-view-base.vue
浏览文件 @
5b3f15f7
...
...
@@ -203,10 +203,12 @@ export default class WFUserMPickupViewBase extends Vue {
onViewData
(
newVal
:
any
,
oldVal
:
any
)
{
const
_this
:
any
=
this
;
if
(
!
Object
.
is
(
newVal
,
oldVal
)
&&
_this
.
engine
)
{
_this
.
parseViewParam
();
_this
.
engine
.
load
();
this
.
$nextTick
(()
=>
{
_this
.
parseViewParam
();
_this
.
engine
.
load
();
});
}
}
/**
...
...
app_web/src/pages/workflow/wfuser-pickup-grid-view/wfuser-pickup-grid-view-base.vue
浏览文件 @
5b3f15f7
...
...
@@ -182,10 +182,12 @@ export default class WFUserPickupGridViewBase extends Vue {
onViewData
(
newVal
:
any
,
oldVal
:
any
)
{
const
_this
:
any
=
this
;
if
(
!
Object
.
is
(
newVal
,
oldVal
)
&&
_this
.
engine
)
{
_this
.
parseViewParam
();
_this
.
engine
.
load
();
this
.
$nextTick
(()
=>
{
_this
.
parseViewParam
();
_this
.
engine
.
load
();
});
}
}
/**
...
...
app_web/src/pages/workflow/wfuser-pickup-view/wfuser-pickup-view-base.vue
浏览文件 @
5b3f15f7
...
...
@@ -170,10 +170,12 @@ export default class WFUserPickupViewBase extends Vue {
onViewData
(
newVal
:
any
,
oldVal
:
any
)
{
const
_this
:
any
=
this
;
if
(
!
Object
.
is
(
newVal
,
oldVal
)
&&
_this
.
engine
)
{
_this
.
parseViewParam
();
_this
.
engine
.
load
();
this
.
$nextTick
(()
=>
{
_this
.
parseViewParam
();
_this
.
engine
.
load
();
});
}
}
/**
...
...
app_web/src/utils/uiaction-tool/uiaction-tool.ts
浏览文件 @
5b3f15f7
...
...
@@ -79,7 +79,7 @@ export class UIActionTool {
});
}
if
(
values
.
length
!==
noPropertyNum
){
Object
.
assign
(
_data
,
{
[
name
]:
values
.
length
>
0
?
values
.
join
(
'
;
'
)
:
value
});
Object
.
assign
(
_data
,
{
[
name
]:
values
.
length
>
0
?
values
.
join
(
'
,
'
)
:
value
});
}
});
}
...
...
app_web/src/widgets/wfgroup/main-grid/main-grid-base.vue
浏览文件 @
5b3f15f7
...
...
@@ -16,8 +16,6 @@
ref='multipleTable' :data="items" :show-header="!isHideHeader">
<template
slot=
"empty"
>
无数据
<span
class=
"quick-toolbar"
>
</span>
</
template
>
<
template
v-if=
"!isSingleSelect"
>
<el-table-column
align=
"center"
type=
'selection'
:width=
"checkboxColWidth"
></el-table-column>
...
...
@@ -80,8 +78,6 @@
</div>
</poptip>
</span>
<span
v-if=
"selections.length > 0"
class=
"batch-toolbar"
>
</span>
<span
class=
"page-button"
><i-button
icon=
"md-refresh"
:title=
"$t('app.gridpage.refresh')"
@
click=
"pageRefresh()"
></i-button></span>
<span>
{{$t('app.gridpage.show')}}
...
...
app_web/src/widgets/wfmember/main-grid/main-grid-base.vue
浏览文件 @
5b3f15f7
...
...
@@ -16,8 +16,6 @@
ref='multipleTable' :data="items" :show-header="!isHideHeader">
<template
slot=
"empty"
>
无数据
<span
class=
"quick-toolbar"
>
</span>
</
template
>
<
template
v-if=
"!isSingleSelect"
>
<el-table-column
align=
"center"
type=
'selection'
:width=
"checkboxColWidth"
></el-table-column>
...
...
@@ -68,8 +66,6 @@
</div>
</poptip>
</span>
<span
v-if=
"selections.length > 0"
class=
"batch-toolbar"
>
</span>
<span
class=
"page-button"
><i-button
icon=
"md-refresh"
:title=
"$t('app.gridpage.refresh')"
@
click=
"pageRefresh()"
></i-button></span>
<span>
{{$t('app.gridpage.show')}}
...
...
app_web/src/widgets/wfprocess-definition/main-grid/main-grid-base.vue
浏览文件 @
5b3f15f7
...
...
@@ -16,8 +16,6 @@
ref='multipleTable' :data="items" :show-header="!isHideHeader">
<template
slot=
"empty"
>
无数据
<span
class=
"quick-toolbar"
>
</span>
</
template
>
<
template
v-if=
"!isSingleSelect"
>
<el-table-column
align=
"center"
type=
'selection'
:width=
"checkboxColWidth"
></el-table-column>
...
...
@@ -106,8 +104,6 @@
</div>
</poptip>
</span>
<span
v-if=
"selections.length > 0"
class=
"batch-toolbar"
>
</span>
<span
class=
"page-button"
><i-button
icon=
"md-refresh"
:title=
"$t('app.gridpage.refresh')"
@
click=
"pageRefresh()"
></i-button></span>
<span>
{{$t('app.gridpage.show')}}
...
...
app_web/src/widgets/wfuser/main-grid/main-grid-base.vue
浏览文件 @
5b3f15f7
...
...
@@ -16,8 +16,6 @@
ref='multipleTable' :data="items" :show-header="!isHideHeader">
<template
slot=
"empty"
>
无数据
<span
class=
"quick-toolbar"
>
</span>
</
template
>
<
template
v-if=
"!isSingleSelect"
>
<el-table-column
align=
"center"
type=
'selection'
:width=
"checkboxColWidth"
></el-table-column>
...
...
@@ -80,8 +78,6 @@
</div>
</poptip>
</span>
<span
v-if=
"selections.length > 0"
class=
"batch-toolbar"
>
</span>
<span
class=
"page-button"
><i-button
icon=
"md-refresh"
:title=
"$t('app.gridpage.refresh')"
@
click=
"pageRefresh()"
></i-button></span>
<span>
{{$t('app.gridpage.show')}}
...
...
config.xml
浏览文件 @
5b3f15f7
...
...
@@ -37,11 +37,6 @@
git clone -b master $para2 ibzwf/
export NODE_OPTIONS=--max-old-space-size=4096
cd ibzwf/
mvn clean package -Papi
cd ibzwf-provider/ibzwf-provider-api
mvn -Papi docker:build
mvn -Papi docker:push
docker -H $para1 stack deploy --compose-file=src/main/docker/ibzwf-provider-api.yaml ibzlab-rt --with-registry-auth
</command>
</hudson.tasks.Shell>
</builders>
...
...
ibzwf-app/ibzwf-app-web/src/main/docker/ibzwf-app-web.yaml
浏览文件 @
5b3f15f7
...
...
@@ -7,6 +7,11 @@ services:
networks
:
-
agent_network
deploy
:
resources
:
limits
:
memory
:
800M
reservations
:
memory
:
400M
mode
:
replicated
replicas
:
1
...
...
ibzwf-core/src/main/resources/liquibase/changelog/20200601200530_init_ibzcfg.xml
0 → 100644
浏览文件 @
5b3f15f7
<?xml version="1.1" encoding="UTF-8" standalone="no"?>
<databaseChangeLog
xmlns=
"http://www.liquibase.org/xml/ns/dbchangelog"
xmlns:ext=
"http://www.liquibase.org/xml/ns/dbchangelog-ext"
xmlns:xsi=
"http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation=
"http://www.liquibase.org/xml/ns/dbchangelog-ext http://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-ext.xsd http://www.liquibase.org/xml/ns/dbchangelog http://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-3.9.xsd"
>
<changeSet
author=
"Think (generated)"
id=
"1591012776347-1"
>
<createTable
remarks=
"配置"
tableName=
"IBZCFG"
>
<column
name=
"CFGID"
remarks=
"配置标识"
type=
"VARCHAR(100)"
>
<constraints
primaryKey=
"true"
/>
</column>
<column
name=
"SYSTEMID"
remarks=
"系统标识"
type=
"VARCHAR(100)"
/>
<column
name=
"CFGTYPE"
remarks=
"配置类型"
type=
"VARCHAR(100)"
/>
<column
name=
"TARGETTYPE"
remarks=
"引用对象"
type=
"VARCHAR(100)"
/>
<column
name=
"USERID"
remarks=
"用户标识"
type=
"VARCHAR(100)"
/>
<column
name=
"CFG"
remarks=
"配置"
type=
"MEDIUMTEXT"
/>
<column
name=
"UPDATEDATE"
remarks=
"更新时间"
type=
"datetime"
/>
</createTable>
</changeSet>
</databaseChangeLog>
ibzwf-provider/ibzwf-provider-api/src/main/docker/Dockerfile
浏览文件 @
5b3f15f7
...
...
@@ -9,6 +9,6 @@ CMD echo "The application will start in ${IBIZ_SLEEP}s..." && \
sleep ${IBIZ_SLEEP} && \
java ${JAVA_OPTS} -Djava.security.egd=file:/dev/./urandom -jar /ibzwf-provider-api.jar
EXPOSE
40003
EXPOSE
8081
ADD
ibzwf-provider-api.jar /ibzwf-provider-api.jar
ibzwf-provider/ibzwf-provider-api/src/main/docker/ibzwf-provider-api.yaml
浏览文件 @
5b3f15f7
...
...
@@ -3,22 +3,15 @@ services:
ibzwf-provider-api
:
image
:
registry.cn-shanghai.aliyuncs.com/ibizsys/ibzwf-provider-api:latest
ports
:
-
"
40003:40003
"
-
"
8081:8081
"
networks
:
-
agent_network
environment
:
-
SPRING_CLOUD_NACOS_DISCOVERY_IP=172.16.180.237
-
SERVER_PORT=40003
-
SPRING_CLOUD_NACOS_DISCOVERY_SERVER-ADDR=172.16.102.211:8848
-
SPRING_REDIS_HOST=172.16.100.243
-
SPRING_REDIS_PORT=6379
-
SPRING_REDIS_DATABASE=0
-
SPRING_DATASOURCE_USERNAME=a_A_5d9d78509
-
SPRING_DATASOURCE_PASSWORD=@6dEfb3@
-
SPRING_DATASOURCE_URL=jdbc:mysql://172.16.180.232:3306/a_A_5d9d78509?autoReconnect=true&useUnicode=true&characterEncoding=UTF-8&useOldAliasMetadataBehavior=true
-
SPRING_DATASOURCE_DRIVER-CLASS-NAME=com.mysql.jdbc.Driver
-
SPRING_DATASOURCE_DEFAULTSCHEMA=a_A_5d9d78509
deploy
:
resources
:
limits
:
memory
:
800M
reservations
:
memory
:
400M
mode
:
replicated
replicas
:
1
...
...
ibzwf-util/src/main/java/cn/ibizlab/util/cache/CaffeineCacheConfig.java
浏览文件 @
5b3f15f7
package
cn
.
ibizlab
.
util
.
cache
;
import
com.github.benmanes.caffeine.cache.CaffeineSpec
;
import
cn.ibizlab.util.cache.cacheManager.CaffeineCacheManager
;
import
org.springframework.beans.factory.annotation.Autowired
;
import
org.springframework.boot.autoconfigure.cache.CacheProperties
;
import
org.springframework.boot.autoconfigure.condition.ConditionalOnExpression
;
import
org.springframework.boot.context.properties.EnableConfigurationProperties
;
...
...
@@ -12,6 +10,7 @@ import org.springframework.context.annotation.Bean;
import
org.springframework.context.annotation.Configuration
;
import
org.springframework.context.annotation.Primary
;
import
org.springframework.util.StringUtils
;
import
cn.ibizlab.util.cache.cacheManager.CaffeineCacheManager
;
/**
* Caffeine缓存配置类
...
...
@@ -22,19 +21,19 @@ import org.springframework.util.StringUtils;
@ConditionalOnExpression
(
"'${ibiz.cacheLevel:None}'.equals('L1')"
)
public
class
CaffeineCacheConfig
{
@Autowired
private
CacheProperties
cacheProperties
;
@Autowired
private
CaffeineCacheManager
caffeineCacheManager
;
/**
* Caffeine配置:设置过期时间
* @return
*/
@Bean
@Primary
public
CacheManager
cacheManager
()
{
String
specification
=
cacheProperties
.
getCaffeine
().
getSpec
();
if
(
StringUtils
.
hasText
(
specification
))
{
caffeineCacheManager
.
setCaffeineSpec
(
CaffeineSpec
.
parse
(
specification
));
public
CacheManager
cacheManager
(
CacheProperties
cacheProperties
)
{
CaffeineCacheManager
caffeineCacheManager
=
new
CaffeineCacheManager
();
String
strCacheConfig
=
cacheProperties
.
getCaffeine
().
getSpec
();
if
(
StringUtils
.
hasText
(
strCacheConfig
))
{
caffeineCacheManager
.
setCaffeineCacheConfig
(
CaffeineSpec
.
parse
(
strCacheConfig
));
}
return
caffeineCacheManager
;
}
}
\ No newline at end of file
ibzwf-util/src/main/java/cn/ibizlab/util/cache/RedisCacheConfig.java
浏览文件 @
5b3f15f7
package
cn
.
ibizlab
.
util
.
cache
;
import
com.alibaba.fastjson.parser.ParserConfig
;
import
com.fasterxml.jackson.annotation.JsonAutoDetect
;
import
com.fasterxml.jackson.annotation.PropertyAccessor
;
import
com.fasterxml.jackson.databind.ObjectMapper
;
import
com.github.benmanes.caffeine.cache.CaffeineSpec
;
import
cn.ibizlab.util.cache.cacheManager.LayeringCacheManager
;
import
cn.ibizlab.util.cache.redis.KryoRedisSerializer
;
import
cn.ibizlab.util.cache.redis.StringRedisSerializer
;
import
cn.ibizlab.util.enums.RedisChannelTopic
;
import
org.springframework.beans.factory.annotation.Autowired
;
import
org.springframework.beans.factory.annotation.Value
;
import
org.springframework.boot.autoconfigure.cache.CacheProperties
;
import
org.springframework.boot.autoconfigure.condition.ConditionalOnExpression
;
import
org.springframework.boot.context.properties.EnableConfigurationProperties
;
...
...
@@ -19,14 +14,19 @@ import org.springframework.context.annotation.Bean;
import
org.springframework.context.annotation.Configuration
;
import
org.springframework.context.annotation.Primary
;
import
org.springframework.data.redis.cache.RedisCacheConfiguration
;
import
org.springframework.data.redis.cache.RedisCacheManager
;
import
org.springframework.data.redis.cache.RedisCacheWriter
;
import
org.springframework.data.redis.connection.RedisConnectionFactory
;
import
org.springframework.data.redis.core.RedisTemplate
;
import
org.springframework.data.redis.listener.RedisMessageListenerContainer
;
import
org.springframework.data.redis.listener.adapter.MessageListenerAdapter
;
import
org.springframework.data.redis.serializer.Jackson2JsonRedisSerializer
;
import
org.springframework.data.redis.serializer.RedisSerializationContext
;
import
org.springframework.data.redis.serializer.StringRedisSerializer
;
import
org.springframework.util.StringUtils
;
import
java.time.Duration
;
import
cn.ibizlab.util.cache.cacheManager.LayeringCacheManager
;
import
cn.ibizlab.util.cache.listener.RedisMessageListener
;
import
cn.ibizlab.util.cache.redis.CustomJacksonSerializer
;
import
cn.ibizlab.util.enums.RedisChannelTopic
;
/**
* 缓存配置类
...
...
@@ -39,83 +39,91 @@ import org.springframework.util.StringUtils;
@ConditionalOnExpression
(
"'${ibiz.cacheLevel:None}'.equals('L2')"
)
public
class
RedisCacheConfig
{
@Autowired
private
RedisCacheWriter
redisCacheWriter
;
@Autowired
private
RedisCacheConfiguration
configuration
;
@Autowired
LayeringCacheManager
layeringCacheManager
;
@Autowired
private
CacheProperties
cacheProperties
;
@Bean
public
RedisCacheManager
redisCacheManager
(
RedisConnectionFactory
connectionFactory
)
{
return
RedisCacheManager
.
create
(
connectionFactory
);
}
@Value
(
"${spring.cache.redis.time-to-live:3600}"
)
private
long
timeToLive
;
/**
* 分层缓存管理器
* @param redisConnectionFactory
* @param cacheProperties
* @return
*/
@Bean
public
RedisCacheWriter
redisCacheWriter
(
RedisConnectionFactory
connectionFactory
){
RedisCacheWriter
redisCacheWriter
=
RedisCacheWriter
.
nonLockingRedisCacheWriter
(
connectionFactory
);
return
redisCacheWriter
;
@Primary
public
CacheManager
cacheManager
(
RedisConnectionFactory
redisConnectionFactory
,
CacheProperties
cacheProperties
){
LayeringCacheManager
layeringCacheManager
=
new
LayeringCacheManager
(
redisCacheWriter
(
redisConnectionFactory
),
redisCacheConfiguration
(),
redisTemplate
(
redisConnectionFactory
));
String
strCacheConfig
=
cacheProperties
.
getCaffeine
().
getSpec
();
if
(
StringUtils
.
hasText
(
strCacheConfig
))
{
layeringCacheManager
.
setCaffeineCacheConfig
(
CaffeineSpec
.
parse
(
strCacheConfig
));
}
return
layeringCacheManager
;
}
/**
* 重写Redis序列化方式,使用Json方式:
* 当我们的数据存储到Redis的时候,我们的键(key)和值(value)都是通过Spring提供的Serializer序列化到数据库的。RedisTemplate默认使用的是JdkSerializationRedisSerializer,StringRedisTemplate默认使用的是StringRedisSerializer。
* Spring Data JPA为我们提供了下面的Serializer:
* GenericToStringSerializer、Jackson2JsonRedisSerializer、JacksonJsonRedisSerializer、JdkSerializationRedisSerializer、OxmSerializer、StringRedisSerializer。
* 在此我们将自己配置RedisTemplate并定义Serializer。
*
* @param redisConnectionFactory
* redis配置:设置过期时间及序列化方式
* @return
*/
@Bean
public
RedisTemplate
<
String
,
Object
>
redisTemplate
(
RedisConnectionFactory
redisConnectionFactory
)
{
RedisTemplate
<
String
,
Object
>
redisTemplate
=
new
RedisTemplate
<>();
redisTemplate
.
setConnectionFactory
(
redisConnectionFactory
);
Jackson2JsonRedisSerializer
<
Object
>
jackson2JsonRedisSerializer
=
new
Jackson2JsonRedisSerializer
<
Object
>(
Object
.
class
);
public
RedisCacheConfiguration
redisCacheConfiguration
(){
CustomJacksonSerializer
jackson2JsonRedisSerializer
=
new
CustomJacksonSerializer
(
Object
.
class
);
ObjectMapper
om
=
new
ObjectMapper
();
om
.
setVisibility
(
PropertyAccessor
.
ALL
,
JsonAutoDetect
.
Visibility
.
ANY
);
om
.
enableDefaultTyping
(
ObjectMapper
.
DefaultTyping
.
NON_FINAL
);
jackson2JsonRedisSerializer
.
setObjectMapper
(
om
);
ParserConfig
.
getGlobalInstance
().
setAutoTypeSupport
(
true
);
KryoRedisSerializer
<
Object
>
kryoRedisSerializer
=
new
KryoRedisSerializer
<>(
Object
.
class
);
redisTemplate
.
setValueSerializer
(
kryoRedisSerializer
);
// 设置值(value)的序列化采用KryoRedisSerializer。
redisTemplate
.
setHashValueSerializer
(
kryoRedisSerializer
);
redisTemplate
.
setKeySerializer
(
new
StringRedisSerializer
());
// 设置键(key)的序列化采用StringRedisSerializer。
redisTemplate
.
setHashKeySerializer
(
new
StringRedisSerializer
());
redisTemplate
.
afterPropertiesSet
();
return
redisTemplate
;
RedisCacheConfiguration
configuration
=
RedisCacheConfiguration
.
defaultCacheConfig
()
.
entryTtl
(
Duration
.
ofSeconds
(
timeToLive
))
.
serializeKeysWith
(
RedisSerializationContext
.
SerializationPair
.
fromSerializer
(
new
StringRedisSerializer
()))
.
serializeValuesWith
(
RedisSerializationContext
.
SerializationPair
.
fromSerializer
(
jackson2JsonRedisSerializer
))
.
disableCachingNullValues
();
return
configuration
;
}
/**
* 创建redis缓存
* @param connectionFactory
* @return
*/
@Bean
@Primary
public
CacheManager
cacheManager
()
{
setCaffeineCacheConfig
(
layeringCacheManager
);
//Caffeine缓存设置
layeringCacheManager
.
setRedisCacheWriter
(
redisCacheWriter
);
layeringCacheManager
.
setRedisConfiguration
(
configuration
);
return
layeringCacheManager
;
public
RedisCacheWriter
redisCacheWriter
(
RedisConnectionFactory
connectionFactory
){
RedisCacheWriter
redisCacheWriter
=
RedisCacheWriter
.
nonLockingRedisCacheWriter
(
connectionFactory
);
return
redisCacheWriter
;
}
private
void
setCaffeineCacheConfig
(
LayeringCacheManager
layeringCacheManager
)
{
String
specification
=
cacheProperties
.
getCaffeine
().
getSpec
();
if
(
StringUtils
.
hasText
(
specification
))
{
layeringCacheManager
.
setCaffeineSpec
(
CaffeineSpec
.
parse
(
specification
));
}
/**
* 发送redis广播
* @param factory
* @return
*/
@Bean
public
RedisTemplate
<
String
,
Object
>
redisTemplate
(
RedisConnectionFactory
factory
)
{
RedisTemplate
<
String
,
Object
>
template
=
new
RedisTemplate
<>();
template
.
setConnectionFactory
(
factory
);
CustomJacksonSerializer
jacksonSerial
=
new
CustomJacksonSerializer
(
Object
.
class
);
ObjectMapper
om
=
new
ObjectMapper
();
om
.
setVisibility
(
PropertyAccessor
.
ALL
,
JsonAutoDetect
.
Visibility
.
ANY
);
jacksonSerial
.
setObjectMapper
(
om
);
template
.
setValueSerializer
(
jacksonSerial
);
template
.
setKeySerializer
(
new
StringRedisSerializer
());
template
.
setHashKeySerializer
(
new
StringRedisSerializer
());
template
.
setHashValueSerializer
(
jacksonSerial
);
template
.
afterPropertiesSet
();
return
template
;
}
/**
* 监听redis指定频道
* @param redisConnectionFactory
* @param messageListener
* @param cacheManager
* @param redisTemplate
* @return
*/
@Bean
RedisMessageListenerContainer
redisContainer
(
RedisConnectionFactory
redisConnectionFactory
,
MessageListenerAdapter
messageListener
)
{
final
RedisMessageListenerContainer
container
=
new
RedisMessageListenerContainer
();
RedisMessageListenerContainer
redisContainer
(
RedisConnectionFactory
redisConnectionFactory
,
CacheManager
cacheManager
,
RedisTemplate
redisTemplate
)
{
RedisMessageListenerContainer
container
=
new
RedisMessageListenerContainer
();
MessageListenerAdapter
messageListener
=
new
RedisMessageListener
(
cacheManager
,
redisTemplate
);
container
.
setConnectionFactory
(
redisConnectionFactory
);
container
.
addMessageListener
(
messageListener
,
RedisChannelTopic
.
REDIS_CACHE_DELETE_TOPIC
.
getChannelTopic
());
container
.
addMessageListener
(
messageListener
,
RedisChannelTopic
.
REDIS_CACHE_CLEAR_TOPIC
.
getChannelTopic
());
return
container
;
}
}
\ No newline at end of file
ibzwf-util/src/main/java/cn/ibizlab/util/cache/cache/CusRedisCache.java
浏览文件 @
5b3f15f7
...
...
@@ -12,5 +12,4 @@ public class CusRedisCache extends RedisCache {
public
CusRedisCache
(
String
name
,
RedisCacheWriter
redisCacheWriter
,
RedisCacheConfiguration
configuration
)
{
super
(
name
,
redisCacheWriter
,
configuration
);
}
}
ibzwf-util/src/main/java/cn/ibizlab/util/cache/cache/LayeringCache.java
浏览文件 @
5b3f15f7
package
cn
.
ibizlab
.
util
.
cache
.
cache
;
import
cn.ibizlab.util.cache.listener.RedisPublisher
;
import
cn.ibizlab.util.enums.RedisChannelTopic
;
import
org.slf4j.Logger
;
import
org.slf4j.LoggerFactory
;
import
lombok.extern.slf4j.Slf4j
;
import
org.springframework.cache.caffeine.CaffeineCache
;
import
org.springframework.cache.support.AbstractValueAdaptingCache
;
import
org.springframework.cache.support.NullValue
;
import
org.springframework.data.redis.cache.RedisCache
;
import
org.springframework.data.redis.cache.RedisCacheConfiguration
;
import
org.springframework.data.redis.cache.RedisCacheWriter
;
import
org.springframework.data.redis.core.RedisOperations
;
import
java.util.HashMap
;
import
java.util.Map
;
import
java.util.concurrent.Callable
;
import
cn.ibizlab.util.cache.listener.RedisPublisher
;
import
cn.ibizlab.util.enums.RedisChannelTopic
;
/**
* 缓存分层类
* 1级缓存为caffeine
* 2级缓存为redis
*/
@Slf4j
public
class
LayeringCache
extends
AbstractValueAdaptingCache
{
Logger
logger
=
LoggerFactory
.
getLogger
(
LayeringCache
.
class
);
/**
* 缓存的名称
*/
private
final
String
n
ame
;
private
String
cacheN
ame
;
/**
*
redis
缓存
*
Caffeine
缓存
*/
private
RedisCache
redis
Cache
;
private
CaffeineCache
caffeine
Cache
;
/**
*
Caffeine
缓存
*
redis
缓存
*/
private
final
CaffeineCache
caffeine
Cache
;
private
RedisCache
redis
Cache
;
/**
* redis消息发布
*/
RedisOperations
<?
extends
Object
,
?
extends
Object
>
redisOperations
;
public
LayeringCache
(
String
name
,
RedisOperations
redisOperations
,
com
.
github
.
benmanes
.
caffeine
.
cache
.
Cache
<
Object
,
Object
>
caffeineCache
,
RedisCacheWriter
redisCacheWriter
,
RedisCacheConfiguration
configuration
)
{
public
LayeringCache
(
String
cacheName
,
CaffeineCache
caffeineCache
,
RedisCache
redisCache
,
RedisOperations
redisOperations
)
{
super
(
true
);
this
.
name
=
n
ame
;
this
.
redisCache
=
new
CusRedisCache
(
name
,
redisCacheWriter
,
configuration
)
;
this
.
caffeineCache
=
new
CaffeineCache
(
name
,
caffeineCache
,
true
)
;
this
.
cacheName
=
cacheN
ame
;
this
.
caffeineCache
=
caffeineCache
;
this
.
redisCache
=
redisCache
;
this
.
redisOperations
=
redisOperations
;
}
@Override
public
String
getName
()
{
return
this
.
n
ame
;
return
this
.
cacheN
ame
;
}
@Override
...
...
@@ -61,40 +57,34 @@ public class LayeringCache extends AbstractValueAdaptingCache {
@Override
public
ValueWrapper
get
(
Object
key
)
{
// 查询一级缓存
ValueWrapper
wrapper
=
caffeineCache
.
get
(
key
);
log
ger
.
debug
(
"查询一级缓存 key:{},value:{}"
,
key
,
wrapper
);
log
.
debug
(
"查询一级缓存 key:{},value:{}"
,
key
,
wrapper
);
if
(
wrapper
==
null
)
{
// 查询二级缓存
wrapper
=
redisCache
.
get
(
key
);
caffeineCache
.
put
(
key
,
wrapper
==
null
?
null
:
wrapper
.
get
());
log
ger
.
debug
(
"查询二级缓存,并将数据放到一级缓存。 key:{}"
,
key
);
log
.
debug
(
"查询二级缓存,并将数据放到一级缓存。 key:{}"
,
key
);
}
return
wrapper
;
}
@Override
public
<
T
>
T
get
(
Object
key
,
Class
<
T
>
type
)
{
// 查询一级缓存
T
value
=
caffeineCache
.
get
(
key
,
type
);
log
ger
.
debug
(
"查询一级缓存 key:{}"
,
key
);
log
.
debug
(
"查询一级缓存 key:{}"
,
key
);
if
(
value
==
null
)
{
// 查询二级缓存
value
=
redisCache
.
get
(
key
,
type
);
caffeineCache
.
put
(
key
,
value
);
log
ger
.
debug
(
"查询二级缓存,并将数据放到一级缓存。 key:{}"
,
key
);
log
.
debug
(
"查询二级缓存,并将数据放到一级缓存。 key:{}"
,
key
);
}
return
value
;
}
@SuppressWarnings
(
"unchecked"
)
@Override
@Override
public
<
T
>
T
get
(
Object
key
,
Callable
<
T
>
valueLoader
)
{
// 查询一级缓存,如果一级缓存没有值则调用getForSecondaryCache(k, valueLoader)查询二级缓存
T
value
=
(
T
)
caffeineCache
.
getNativeCache
().
get
(
key
,
k
->
getSecondCache
(
k
,
valueLoader
));
T
value
=
(
T
)
caffeineCache
.
getNativeCache
().
get
(
key
,
k
->
getSecondCacheValue
(
k
,
valueLoader
));
if
(
value
==
null
)
{
// 直接查询二级缓存
value
=
(
T
)
getSecondCache
(
key
,
valueLoader
);
value
=
(
T
)
getSecondCacheValue
(
key
,
valueLoader
);
}
if
(
value
instanceof
NullValue
)
{
return
null
;
...
...
@@ -119,11 +109,11 @@ public class LayeringCache extends AbstractValueAdaptingCache {
redisCache
.
evict
(
key
);
//清除redis中的二级缓存
caffeineCache
.
evict
(
key
);
//清除本机一级缓存
Map
<
String
,
Object
>
message
=
new
HashMap
<>();
message
.
put
(
"cacheName"
,
n
ame
);
message
.
put
(
"cacheName"
,
cacheN
ame
);
message
.
put
(
"key"
,
key
);
RedisPublisher
redisPublisher
=
new
RedisPublisher
(
redisOperations
,
RedisChannelTopic
.
REDIS_CACHE_DELETE_TOPIC
.
getChannelTopic
());
// 创建redis发布者
redisPublisher
.
publisher
(
message
);
//发布消息,清除其它集群机器中的一级缓存
log
ger
.
debug
(
String
.
format
(
"清除二级缓存数据[%s]"
,
key
));
log
.
debug
(
String
.
format
(
"清除二级缓存数据[%s]"
,
key
));
}
@Override
...
...
@@ -131,7 +121,7 @@ public class LayeringCache extends AbstractValueAdaptingCache {
redisCache
.
clear
();
//清除redis中的二级缓存
caffeineCache
.
clear
();
//清除本机一级缓存
Map
<
String
,
Object
>
message
=
new
HashMap
<>();
message
.
put
(
"cacheName"
,
n
ame
);
message
.
put
(
"cacheName"
,
cacheN
ame
);
RedisPublisher
redisPublisher
=
new
RedisPublisher
(
redisOperations
,
RedisChannelTopic
.
REDIS_CACHE_CLEAR_TOPIC
.
getChannelTopic
());
// 创建redis发布者
redisPublisher
.
publisher
(
message
);
//发布消息,清除其它集群机器中的一级缓存
}
...
...
@@ -139,31 +129,39 @@ public class LayeringCache extends AbstractValueAdaptingCache {
@Override
protected
Object
lookup
(
Object
key
)
{
Object
value
=
caffeineCache
.
get
(
key
);
log
ger
.
debug
(
"查询一级缓存 key:{}"
,
key
);
log
.
debug
(
"查询一级缓存 key:{}"
,
key
);
if
(
value
==
null
)
{
value
=
redisCache
.
get
(
key
);
log
ger
.
debug
(
"查询二级缓存 key:{}"
,
key
);
log
.
debug
(
"查询二级缓存 key:{}"
,
key
);
}
return
value
;
}
/**
* 查询二级缓存
* @param key
* @param valueLoader
* 获取caffeine缓存
* @return
*/
private
<
T
>
Object
getSecondCache
(
Object
key
,
Callable
<
T
>
valueLoader
)
{
T
value
=
redisCache
.
get
(
key
,
valueLoader
);
logger
.
debug
(
"查询二级缓存 key:{}"
,
key
);
return
toStoreValue
(
value
);
public
CaffeineCache
getFirstCache
()
{
return
this
.
caffeineCache
;
}
/**
* 获取
caffeine
缓存
* 获取
redis
缓存
* @return
*/
public
CaffeineCache
getFirstCache
()
{
return
this
.
caffeineCache
;
public
RedisCache
getSecondCache
()
{
return
this
.
redisCache
;
}
/**
* 查询二级缓存
* @param key
* @param valueLoader
* @return
*/
private
<
T
>
Object
getSecondCacheValue
(
Object
key
,
Callable
<
T
>
valueLoader
)
{
T
value
=
redisCache
.
get
(
key
,
valueLoader
);
log
.
debug
(
"查询二级缓存 key:{}"
,
key
);
return
toStoreValue
(
value
);
}
}
ibzwf-util/src/main/java/cn/ibizlab/util/cache/cacheManager/CaffeineCacheManager.java
浏览文件 @
5b3f15f7
package
cn
.
ibizlab
.
util
.
cache
.
cacheManager
;
import
lombok.Data
;
import
com.github.benmanes.caffeine.cache.Caffeine
;
import
com.github.benmanes.caffeine.cache.CaffeineSpec
;
import
lombok.Data
;
import
org.springframework.boot.autoconfigure.condition.ConditionalOnExpression
;
import
org.springframework.cache.Cache
;
import
org.springframework.cache.CacheManager
;
import
org.springframework.cache.caffeine.CaffeineCache
;
import
org.springframework.stereotype.Component
;
import
org.springframework.util.ObjectUtils
;
import
java.util.Collection
;
import
java.util.Collections
;
import
java.util.Map
;
import
java.util.concurrent.ConcurrentHashMap
;
import
java.util.concurrent.ConcurrentMap
;
import
java.util.concurrent.TimeUnit
;
...
...
@@ -21,37 +17,31 @@ import java.util.concurrent.TimeUnit;
* Caffeine本地缓存
*/
@Data
@Component
@ConditionalOnExpression
(
"'${ibiz.cacheLevel:None}'.equals('L1')"
)
public
class
CaffeineCacheManager
implements
CacheManager
{
private
static
final
int
DEFAULT_EXPIRE_AFTER_WRITE
=
1
;
private
static
final
int
DEFAULT_INITIAL_CAPACITY
=
5
;
private
static
final
int
DEFAULT_MAXIMUM_SIZE
=
1_000
;
private
final
ConcurrentMap
<
String
,
Cache
>
cacheMap
=
new
ConcurrentHashMap
<
String
,
Cache
>(
16
);
/**
* 缓存默认设置
*/
private
static
final
int
default_expire_after_write
=
1
;
private
static
final
int
default_initial_capacity
=
5
;
private
static
final
int
default_maximum_size
=
1_000
;
private
Caffeine
<
Object
,
Object
>
cacheBuilder
=
Caffeine
.
newBuilder
()
.
expireAfterAccess
(
DEFAULT_EXPIRE_AFTER_WRITE
,
TimeUnit
.
HOURS
)
.
initialCapacity
(
DEFAULT_INITIAL_CAPACITY
)
.
maximumSize
(
DEFAULT_MAXIMUM_SIZE
);
.
expireAfterAccess
(
default_expire_after_write
,
TimeUnit
.
HOURS
)
.
initialCapacity
(
default_initial_capacity
)
.
maximumSize
(
default_maximum_size
);
/**
* 获取缓存对象
* @param
n
ame
* @param
cacheN
ame
* @return
*/
@Override
public
Cache
getCache
(
String
n
ame
)
{
Cache
cache
=
this
.
cacheMap
.
get
(
n
ame
);
public
Cache
getCache
(
String
cacheN
ame
)
{
Cache
cache
=
this
.
cacheMap
.
get
(
cacheN
ame
);
if
(
cache
==
null
)
{
synchronized
(
this
.
cacheMap
)
{
cache
=
this
.
cacheMap
.
get
(
n
ame
);
cache
=
this
.
cacheMap
.
get
(
cacheN
ame
);
if
(
cache
==
null
)
{
cache
=
createCache
(
n
ame
);
this
.
cacheMap
.
put
(
n
ame
,
cache
);
cache
=
createCache
(
cacheN
ame
);
this
.
cacheMap
.
put
(
cacheN
ame
,
cache
);
}
}
}
...
...
@@ -59,41 +49,32 @@ public class CaffeineCacheManager implements CacheManager {
}
/**
* 获取缓存名
* 创建缓存
* @param cacheName
* @return
*/
@Override
public
Collection
<
String
>
getCacheNames
()
{
return
Collections
.
unmodifiableSet
(
this
.
cacheMap
.
keySet
());
protected
Cache
createCache
(
String
cacheName
)
{
return
new
CaffeineCache
(
cacheName
,
this
.
cacheBuilder
.
build
(),
true
);
}
/**
* 创建缓存
* @param name
* 获取缓存名
* @return
*/
protected
Cache
createCache
(
String
name
)
{
return
new
CaffeineCache
(
name
,
this
.
cacheBuilder
.
build
(),
true
);
@Override
public
Collection
<
String
>
getCacheNames
()
{
return
Collections
.
unmodifiableSet
(
this
.
cacheMap
.
keySet
());
}
/**
* 缓存配置[缓存容量大小、时长等]
* @param caffeine
Spec
* @param caffeine
CacheConfig
*/
public
void
setCaffeine
Spec
(
CaffeineSpec
caffeineSpec
)
{
Caffeine
<
Object
,
Object
>
cacheBuilder
=
Caffeine
.
from
(
caffeine
Spec
);
public
void
setCaffeine
CacheConfig
(
CaffeineSpec
caffeineCacheConfig
)
{
Caffeine
<
Object
,
Object
>
cacheBuilder
=
Caffeine
.
from
(
caffeine
CacheConfig
);
if
(!
ObjectUtils
.
nullSafeEquals
(
this
.
cacheBuilder
,
cacheBuilder
))
{
this
.
cacheBuilder
=
cacheBuilder
;
refreshKnownCaches
();
}
}
/**
* 使用该CacheManager的当前状态重新创建已知的缓存。
*/
private
void
refreshKnownCaches
()
{
for
(
Map
.
Entry
<
String
,
Cache
>
entry
:
this
.
cacheMap
.
entrySet
())
{
entry
.
setValue
(
createCache
(
entry
.
getKey
()));
}
}
}
ibzwf-util/src/main/java/cn/ibizlab/util/cache/cacheManager/LayeringCacheManager.java
浏览文件 @
5b3f15f7
package
cn
.
ibizlab
.
util
.
cache
.
cacheManager
;
import
lombok.Data
;
import
com.github.benmanes.caffeine.cache.Caffeine
;
import
com.github.benmanes.caffeine.cache.CaffeineSpec
;
import
lombok.Data
;
import
cn.ibizlab.util.cache.cache.LayeringCache
;
import
org.springframework.beans.factory.annotation.Autowired
;
import
org.springframework.boot.autoconfigure.condition.ConditionalOnExpression
;
import
org.springframework.cache.Cache
;
import
org.springframework.cache.CacheManager
;
import
org.springframework.cache.caffeine.CaffeineCache
;
import
org.springframework.data.redis.cache.RedisCacheConfiguration
;
import
org.springframework.data.redis.cache.RedisCacheWriter
;
import
org.springframework.data.redis.core.RedisTemplate
;
import
org.springframework.stereotype.Component
;
import
org.springframework.util.ObjectUtils
;
import
java.util.Collection
;
import
java.util.Collections
;
import
java.util.Map
;
import
java.util.concurrent.ConcurrentHashMap
;
import
java.util.concurrent.ConcurrentMap
;
import
java.util.concurrent.TimeUnit
;
import
cn.ibizlab.util.cache.cache.CusRedisCache
;
import
cn.ibizlab.util.cache.cache.LayeringCache
;
/**
* 缓存分层
类
* 缓存分层
* 1级缓存为caffeine
* 2级缓存为redis
*/
@Data
@Component
@ConditionalOnExpression
(
"'${ibiz.cacheLevel:None}'.equals('L2')"
)
public
class
LayeringCacheManager
implements
CacheManager
{
private
static
final
int
DEFAULT_EXPIRE_AFTER_WRITE
=
1
;
private
static
final
int
DEFAULT_INITIAL_CAPACITY
=
5
;
private
static
final
int
DEFAULT_MAXIMUM_SIZE
=
1_000
;
private
final
ConcurrentMap
<
String
,
Cache
>
cacheMap
=
new
ConcurrentHashMap
<
String
,
Cache
>(
16
);
public
RedisCacheWriter
redisCacheWriter
;
public
RedisCacheConfiguration
redisConfiguration
;
@Autowired
public
RedisTemplate
<
String
,
Object
>
redisTemplate
;
/**
* 缓存默认设置
*/
private
static
final
int
default_expire_after_write
=
1
;
private
static
final
int
default_initial_capacity
=
5
;
private
static
final
int
default_maximum_size
=
1_000
;
private
Caffeine
<
Object
,
Object
>
cacheBuilder
=
Caffeine
.
newBuilder
()
.
expireAfterAccess
(
DEFAULT_EXPIRE_AFTER_WRITE
,
TimeUnit
.
HOURS
)
.
initialCapacity
(
DEFAULT_INITIAL_CAPACITY
)
.
maximumSize
(
DEFAULT_MAXIMUM_SIZE
);
.
expireAfterAccess
(
default_expire_after_write
,
TimeUnit
.
HOURS
)
.
initialCapacity
(
default_initial_capacity
)
.
maximumSize
(
default_maximum_size
);
private
RedisCacheWriter
redisCacheWriter
;
private
RedisCacheConfiguration
redisConfiguration
;
private
RedisTemplate
<
String
,
Object
>
redisTemplate
;
public
LayeringCacheManager
(
RedisCacheWriter
redisCacheWriter
,
RedisCacheConfiguration
redisConfiguration
,
RedisTemplate
<
String
,
Object
>
redisTemplate
){
this
.
redisCacheWriter
=
redisCacheWriter
;
this
.
redisConfiguration
=
redisConfiguration
;
this
.
redisTemplate
=
redisTemplate
;
}
/**
* 获取缓存对象
* @param
n
ame
* @param
cacheN
ame
* @return
*/
@Override
public
Cache
getCache
(
String
n
ame
)
{
Cache
cache
=
this
.
cacheMap
.
get
(
n
ame
);
public
Cache
getCache
(
String
cacheN
ame
)
{
Cache
cache
=
this
.
cacheMap
.
get
(
cacheN
ame
);
if
(
cache
==
null
)
{
synchronized
(
this
.
cacheMap
)
{
cache
=
this
.
cacheMap
.
get
(
n
ame
);
cache
=
this
.
cacheMap
.
get
(
cacheN
ame
);
if
(
cache
==
null
)
{
cache
=
createCache
(
n
ame
);
this
.
cacheMap
.
put
(
n
ame
,
cache
);
cache
=
createCache
(
cacheN
ame
);
this
.
cacheMap
.
put
(
cacheN
ame
,
cache
);
}
}
}
return
cache
;
}
/**
* 获取集合中的缓存
* @return
*/
@Override
public
Collection
<
String
>
getCacheNames
()
{
return
Collections
.
unmodifiableSet
(
this
.
cacheMap
.
keySet
());
}
protected
Cache
createCache
(
String
name
)
{
return
new
LayeringCache
(
name
,
redisTemplate
,
this
.
cacheBuilder
.
build
(),
redisCacheWriter
,
redisConfiguration
);
}
/**
* 使用该CacheManager的当前状态重新创建已知的缓存
* 创建缓存
* @param cacheName
* @return
*/
private
void
refreshKnownCaches
()
{
for
(
Map
.
Entry
<
String
,
Cache
>
entry
:
this
.
cacheMap
.
entrySet
())
{
entry
.
setValue
(
createCache
(
entry
.
getKey
()));
}
protected
Cache
createCache
(
String
cacheName
)
{
return
new
LayeringCache
(
cacheName
,
new
CaffeineCache
(
cacheName
,
this
.
cacheBuilder
.
build
(),
true
),
new
CusRedisCache
(
cacheName
,
redisCacheWriter
,
redisConfiguration
),
redisTemplate
);
}
public
void
setCaffeineSpec
(
CaffeineSpec
caffeineSpec
)
{
Caffeine
<
Object
,
Object
>
cacheBuilder
=
Caffeine
.
from
(
caffeineSpec
);
/**
* 缓存配置[缓存容量大小、时长等]
* @param caffeineCacheConfig
*/
public
void
setCaffeineCacheConfig
(
CaffeineSpec
caffeineCacheConfig
)
{
Caffeine
<
Object
,
Object
>
cacheBuilder
=
Caffeine
.
from
(
caffeineCacheConfig
);
if
(!
ObjectUtils
.
nullSafeEquals
(
this
.
cacheBuilder
,
cacheBuilder
))
{
this
.
cacheBuilder
=
cacheBuilder
;
refreshKnownCaches
();
}
}
}
ibzwf-util/src/main/java/cn/ibizlab/util/cache/listener/RedisMessageListener.java
浏览文件 @
5b3f15f7
package
cn
.
ibizlab
.
util
.
cache
.
listener
;
import
cn.ibizlab.util.cache.cache.LayeringCache
;
import
cn.ibizlab.util.enums.RedisChannelTopic
;
import
org.slf4j.Logger
;
import
org.slf4j.LoggerFactory
;
import
org.springframework.beans.factory.annotation.Autowired
;
import
org.springframework.boot.autoconfigure.condition.ConditionalOnExpression
;
import
lombok.extern.slf4j.Slf4j
;
import
org.springframework.cache.Cache
;
import
org.springframework.cache.CacheManager
;
import
org.springframework.data.redis.connection.Message
;
import
org.springframework.data.redis.core.RedisTemplate
;
import
org.springframework.data.redis.listener.adapter.MessageListenerAdapter
;
import
org.springframework.data.redis.serializer.RedisSerializer
;
import
org.springframework.stereotype.Component
;
import
org.springframework.util.StringUtils
;
import
java.util.Map
;
import
cn.ibizlab.util.cache.cache.LayeringCache
;
import
cn.ibizlab.util.enums.RedisChannelTopic
;
/**
* redis消息的订阅者
*/
@Component
@ConditionalOnExpression
(
"'${ibiz.cacheLevel:None}'.equals('L2')"
)
@Slf4j
public
class
RedisMessageListener
extends
MessageListenerAdapter
{
private
static
final
Logger
logger
=
LoggerFactory
.
getLogger
(
RedisPublisher
.
class
);
@Autowired
CacheManager
cacheManager
;
@Autowired
RedisTemplate
redisTemplate
;
private
CacheManager
cacheManager
;
private
RedisTemplate
redisTemplate
;
public
RedisMessageListener
(
CacheManager
cacheManager
,
RedisTemplate
redisTemplate
){
this
.
cacheManager
=
cacheManager
;
this
.
redisTemplate
=
redisTemplate
;
}
@Override
public
void
onMessage
(
Message
message
,
byte
[]
pattern
)
{
super
.
onMessage
(
message
,
pattern
);
RedisChannelTopic
channelTopic
=
RedisChannelTopic
.
getChannelTopicEnum
(
new
String
(
message
.
getChannel
()));
Map
<
String
,
Object
>
map
=
null
;
RedisSerializer
serializer
=
redisTemplate
.
getValueSerializer
();
...
...
@@ -41,10 +35,10 @@ public class RedisMessageListener extends MessageListenerAdapter {
map
=
(
Map
<
String
,
Object
>)
result
;
}
if
(
StringUtils
.
isEmpty
(
map
)||
(!
map
.
containsKey
(
"cacheName"
))||
(!
map
.
containsKey
(
"key"
))){
log
ger
.
debug
(
"解析缓存数据失败,无法获取指定值!"
);
log
.
debug
(
"解析缓存数据失败,无法获取指定值!"
);
return
;
}
log
ger
.
debug
(
"redis消息订阅者接收到频道【{}】发布的消息。消息内容:{}"
,
channelTopic
.
getChannelTopicStr
(),
result
.
toString
());
log
.
debug
(
"redis消息订阅者接收到频道【{}】发布的消息。消息内容:{}"
,
channelTopic
.
getChannelTopicStr
(),
result
.
toString
());
String
cacheName
=
(
String
)
map
.
get
(
"cacheName"
);
Object
key
=
map
.
get
(
"key"
);
Cache
cache
=
cacheManager
.
getCache
(
cacheName
);
// 根据缓存名称获取多级缓存
...
...
@@ -52,14 +46,16 @@ public class RedisMessageListener extends MessageListenerAdapter {
switch
(
channelTopic
)
{
case
REDIS_CACHE_DELETE_TOPIC:
// 获取一级缓存,并删除一级缓存数据
((
LayeringCache
)
cache
).
getFirstCache
().
evict
(
key
);
logger
.
debug
(
"删除一级缓存{}数据,key:{},"
,
cacheName
,
key
.
toString
());
((
LayeringCache
)
cache
).
getSecondCache
().
evict
(
key
);
log
.
debug
(
"同步删除缓存{}数据,key:{},"
,
cacheName
,
key
.
toString
());
break
;
case
REDIS_CACHE_CLEAR_TOPIC:
// 获取一级缓存,并删除一级缓存数据
((
LayeringCache
)
cache
).
getFirstCache
().
clear
();
logger
.
debug
(
"清除一级缓存{}数据"
,
cacheName
);
((
LayeringCache
)
cache
).
getSecondCache
().
clear
();
log
.
debug
(
"同步清除缓存{}数据"
,
cacheName
);
break
;
default
:
log
ger
.
debug
(
"接收到没有定义的订阅消息频道数据"
);
log
.
debug
(
"接收到没有定义的订阅消息频道数据"
);
break
;
}
}
...
...
ibzwf-util/src/main/java/cn/ibizlab/util/cache/redis/CustomJacksonSerializer.java
0 → 100644
浏览文件 @
5b3f15f7
package
cn
.
ibizlab
.
util
.
cache
.
redis
;
import
cn.ibizlab.util.security.AuthenticationUser
;
import
org.springframework.data.redis.serializer.Jackson2JsonRedisSerializer
;
import
org.springframework.data.redis.serializer.SerializationException
;
import
java.util.regex.Matcher
;
import
java.util.regex.Pattern
;
public
class
CustomJacksonSerializer
<
T
>
extends
Jackson2JsonRedisSerializer
<
T
>
{
public
static
final
String
DEFAULT_PACKAGE
=
"[\\w+\\.]+\\.AuthenticationUser"
;
public
static
final
String
USER_PACKAGE
=
AuthenticationUser
.
class
.
getName
();
public
CustomJacksonSerializer
(
Class
type
)
{
super
(
type
);
}
@Override
public
T
deserialize
(
byte
[]
bytes
)
throws
SerializationException
{
String
serializerContent
=
new
String
(
bytes
,
DEFAULT_CHARSET
);
Matcher
matcher
=
Pattern
.
compile
(
DEFAULT_PACKAGE
).
matcher
(
serializerContent
);
return
matcher
.
find
()?
super
.
deserialize
(
serializerContent
.
replaceAll
(
DEFAULT_PACKAGE
,
USER_PACKAGE
).
getBytes
()):
super
.
deserialize
(
bytes
);
}
}
ibzwf-util/src/main/java/cn/ibizlab/util/cache/redis/CustomizedRedisCache.java
浏览文件 @
5b3f15f7
package
cn
.
ibizlab
.
util
.
cache
.
redis
;
import
org.springframework.data.redis.cache.RedisCache
;
import
org.springframework.data.redis.cache.RedisCacheConfiguration
;
import
org.springframework.data.redis.cache.RedisCacheWriter
;
/**
* 自定义的redis缓存
*/
public
class
CustomizedRedisCache
extends
RedisCache
{
public
CustomizedRedisCache
(
String
name
,
RedisCacheWriter
redisCacheWriter
,
RedisCacheConfiguration
configuration
)
{
super
(
name
,
redisCacheWriter
,
configuration
);
}
public
class
CustomizedRedisCache
{
}
ibzwf-util/src/main/java/cn/ibizlab/util/cache/redis/FastJsonRedisSerializer.java
浏览文件 @
5b3f15f7
package
cn
.
ibizlab
.
util
.
cache
.
redis
;
import
com.alibaba.fastjson.JSON
;
import
com.alibaba.fastjson.serializer.SerializerFeature
;
import
org.springframework.data.redis.serializer.RedisSerializer
;
import
org.springframework.data.redis.serializer.SerializationException
;
import
java.nio.charset.Charset
;
/**
* Value 序列化
*
* @author /
* @param <T>
*/
public
class
FastJsonRedisSerializer
<
T
>
implements
RedisSerializer
<
T
>
public
class
FastJsonRedisSerializer
{
public
static
final
Charset
DEFAULT_CHARSET
=
Charset
.
forName
(
"UTF-8"
);
private
Class
<
T
>
clazz
;
public
FastJsonRedisSerializer
(
Class
<
T
>
clazz
)
{
super
();
this
.
clazz
=
clazz
;
}
@Override
public
byte
[]
serialize
(
T
t
)
throws
SerializationException
{
if
(
t
==
null
)
{
return
new
byte
[
0
];
}
return
JSON
.
toJSONString
(
t
,
SerializerFeature
.
WriteClassName
).
getBytes
(
DEFAULT_CHARSET
);
}
@Override
public
T
deserialize
(
byte
[]
bytes
)
throws
SerializationException
{
if
(
bytes
==
null
||
bytes
.
length
<=
0
)
{
return
null
;
}
String
str
=
new
String
(
bytes
,
DEFAULT_CHARSET
);
return
(
T
)
JSON
.
parseObject
(
str
,
clazz
);
}
}
ibzwf-util/src/main/java/cn/ibizlab/util/cache/redis/KryoRedisSerializer.java
浏览文件 @
5b3f15f7
package
cn
.
ibizlab
.
util
.
cache
.
redis
;
import
com.esotericsoftware.kryo.Kryo
;
import
com.esotericsoftware.kryo.io.Input
;
import
com.esotericsoftware.kryo.io.Output
;
import
org.slf4j.Logger
;
import
org.slf4j.LoggerFactory
;
import
org.springframework.data.redis.serializer.RedisSerializer
;
import
org.springframework.data.redis.serializer.SerializationException
;
public
class
KryoRedisSerializer
{
import
java.io.ByteArrayOutputStream
;
/**
* @param <T>
* 序列化/反序列化工具类
*/
public
class
KryoRedisSerializer
<
T
>
implements
RedisSerializer
<
T
>
{
Logger
logger
=
LoggerFactory
.
getLogger
(
KryoRedisSerializer
.
class
);
public
static
final
byte
[]
EMPTY_BYTE_ARRAY
=
new
byte
[
0
];
private
static
final
ThreadLocal
<
Kryo
>
kryos
=
ThreadLocal
.
withInitial
(
Kryo:
:
new
);
private
Class
<
T
>
clazz
;
public
KryoRedisSerializer
(
Class
<
T
>
clazz
)
{
super
();
this
.
clazz
=
clazz
;
}
@Override
public
byte
[]
serialize
(
T
t
)
throws
SerializationException
{
if
(
t
==
null
)
{
return
EMPTY_BYTE_ARRAY
;
}
Kryo
kryo
=
kryos
.
get
();
kryo
.
setReferences
(
false
);
kryo
.
register
(
clazz
);
try
(
ByteArrayOutputStream
baos
=
new
ByteArrayOutputStream
();
Output
output
=
new
Output
(
baos
))
{
kryo
.
writeClassAndObject
(
output
,
t
);
output
.
flush
();
return
baos
.
toByteArray
();
}
catch
(
Exception
e
)
{
logger
.
error
(
e
.
getMessage
(),
e
);
}
return
EMPTY_BYTE_ARRAY
;
}
@Override
public
T
deserialize
(
byte
[]
bytes
)
throws
SerializationException
{
if
(
bytes
==
null
||
bytes
.
length
<=
0
)
{
return
null
;
}
Kryo
kryo
=
kryos
.
get
();
kryo
.
setReferences
(
false
);
kryo
.
register
(
clazz
);
try
(
Input
input
=
new
Input
(
bytes
))
{
return
(
T
)
kryo
.
readClassAndObject
(
input
);
}
catch
(
Exception
e
)
{
logger
.
error
(
e
.
getMessage
(),
e
);
}
return
null
;
}
}
\ No newline at end of file
ibzwf-util/src/main/java/cn/ibizlab/util/cache/redis/RedisConfig.java
浏览文件 @
5b3f15f7
package
cn
.
ibizlab
.
util
.
cache
.
redis
;
import
com.alibaba.fastjson.JSON
;
import
com.alibaba.fastjson.parser.ParserConfig
;
import
lombok.extern.slf4j.Slf4j
;
import
org.springframework.beans.factory.annotation.Value
;
import
org.springframework.boot.autoconfigure.condition.ConditionalOnClass
;
import
org.springframework.boot.autoconfigure.data.redis.RedisProperties
;
import
org.springframework.boot.context.properties.EnableConfigurationProperties
;
import
org.springframework.cache.annotation.CachingConfigurerSupport
;
import
org.springframework.cache.annotation.EnableCaching
;
import
org.springframework.cache.interceptor.KeyGenerator
;
import
org.springframework.context.annotation.Bean
;
import
org.springframework.context.annotation.Configuration
;
import
org.springframework.data.redis.cache.RedisCacheConfiguration
;
import
org.springframework.data.redis.core.RedisOperations
;
import
org.springframework.data.redis.serializer.RedisSerializationContext
;
import
java.time.Duration
;
public
class
RedisConfig
{
@Slf4j
@Configuration
@ConditionalOnClass
(
RedisOperations
.
class
)
@EnableConfigurationProperties
(
RedisProperties
.
class
)
public
class
RedisConfig
extends
CachingConfigurerSupport
{
@Value
(
"${spring.cache.redis.time-to-live:3600}"
)
private
long
timetolive
;
/**
* 设置 redis 数据默认过期时间,默认1天
* 设置@cacheable 序列化方式
* @return
*/
@Bean
public
RedisCacheConfiguration
redisCacheConfiguration
(){
FastJsonRedisSerializer
<
Object
>
fastJsonRedisSerializer
=
new
FastJsonRedisSerializer
<>(
Object
.
class
);
RedisCacheConfiguration
configuration
=
RedisCacheConfiguration
.
defaultCacheConfig
();
ParserConfig
.
getGlobalInstance
().
setAutoTypeSupport
(
true
);
configuration
=
configuration
.
serializeValuesWith
(
RedisSerializationContext
.
SerializationPair
.
fromSerializer
(
fastJsonRedisSerializer
)).
entryTtl
(
Duration
.
ofSeconds
(
timetolive
));
return
configuration
;
}
/**
* 自定义缓存key生成策略
* 使用方法 @Cacheable(keyGenerator="keyGenerator")
* @return
*/
@Bean
@Override
public
KeyGenerator
keyGenerator
()
{
return
(
target
,
method
,
params
)
->
{
StringBuilder
sb
=
new
StringBuilder
();
sb
.
append
(
target
.
getClass
().
getName
());
sb
.
append
(
method
.
getName
());
for
(
Object
obj
:
params
)
{
// 由于参数可能不同, hashCode肯定不一样, 缓存的key也需要不一样
sb
.
append
(
JSON
.
toJSONString
(
obj
).
hashCode
());
}
return
sb
.
toString
();
};
}
}
\ No newline at end of file
ibzwf-util/src/main/java/cn/ibizlab/util/cache/redis/StringRedisSerializer.java
浏览文件 @
5b3f15f7
package
cn
.
ibizlab
.
util
.
cache
.
redis
;
import
com.alibaba.fastjson.JSON
;
import
org.springframework.data.redis.serializer.RedisSerializer
;
import
org.springframework.util.Assert
;
public
class
StringRedisSerializer
{
import
java.nio.charset.Charset
;
/**
* 必须重写序列化器,否则@Cacheable注解的key会报类型转换错误
*/
public
class
StringRedisSerializer
implements
RedisSerializer
<
Object
>
{
private
final
Charset
charset
;
private
final
String
target
=
"\""
;
private
final
String
replacement
=
""
;
public
StringRedisSerializer
()
{
this
(
Charset
.
forName
(
"UTF8"
));
}
public
StringRedisSerializer
(
Charset
charset
)
{
Assert
.
notNull
(
charset
,
"Charset must not be null!"
);
this
.
charset
=
charset
;
}
@Override
public
String
deserialize
(
byte
[]
bytes
)
{
return
(
bytes
==
null
?
null
:
new
String
(
bytes
,
charset
));
}
@Override
public
byte
[]
serialize
(
Object
object
)
{
String
string
=
JSON
.
toJSONString
(
object
);
if
(
string
==
null
)
{
return
null
;
}
string
=
string
.
replace
(
target
,
replacement
);
return
string
.
getBytes
(
charset
);
}
}
ibzwf-util/src/main/java/cn/ibizlab/util/enums/RedisChannelTopic.java
浏览文件 @
5b3f15f7
...
...
@@ -5,8 +5,8 @@ import org.springframework.data.redis.listener.ChannelTopic;
* redis频道
*/
public
enum
RedisChannelTopic
{
REDIS_CACHE_DELETE_TOPIC
(
"redis:cache:delete:topic"
,
"删除redis缓存消息频道"
),
REDIS_CACHE_CLEAR_TOPIC
(
"redis:cache:clear:topic"
,
"清空redis缓存消息频道"
);
REDIS_CACHE_DELETE_TOPIC
(
"redis:cache:delete:topic
1
"
,
"删除redis缓存消息频道"
),
REDIS_CACHE_CLEAR_TOPIC
(
"redis:cache:clear:topic
2
"
,
"清空redis缓存消息频道"
);
String
channelTopic
;
String
label
;
...
...
ibzwf-util/src/main/java/cn/ibizlab/util/security/AuthenticationUser.java
浏览文件 @
5b3f15f7
...
...
@@ -143,14 +143,14 @@ public class AuthenticationUser implements UserDetails
return
new
HashMap
<>();
}
public
Collection
<
GrantedAuthority
>
getAuthorities
()
{
public
void
setPermissionList
(
JSONObject
permissionList
)
{
this
.
permissionList
=
permissionList
;
if
(
authorities
==
null
&&
permissionList
!=
null
){
if
(
permissionList
.
getJSONArray
(
"authorities"
)!=
null
){
authorities
=
new
ArrayList
<>();
permissionList
.
getJSONArray
(
"authorities"
).
if
(
permissionList
.
getJSONArray
(
"authorities"
)!=
null
){
authorities
=
new
ArrayList
<>();
permissionList
.
getJSONArray
(
"authorities"
).
forEach
(
item
->
authorities
.
add
(
new
SimpleGrantedAuthority
(
String
.
valueOf
(
item
))));
}
}
return
authorities
;
}
}
编辑
预览
Markdown
格式
0%
请重试
or
添加新附件
添加附件
取消
您添加了
0
人
到此讨论。请谨慎行事。
先完成此消息的编辑!
取消
想要评论请
注册
或
登录