提交 f4705820 编写于 作者: ibizdev's avatar ibizdev

ibiz4j 发布系统代码

上级 9302eadb
......@@ -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
import ibzdeptmember_en_US from '@locale/lanres/ibzdept-member/ibzdept-member_en_US';
import ibzteammember_en_US from '@locale/lanres/ibzteam-member/ibzteam-member_en_US';
import ibzdepartment_en_US from '@locale/lanres/ibzdepartment/ibzdepartment_en_US';
import ibzemployee_en_US from '@locale/lanres/ibzemployee/ibzemployee_en_US';
import ibzorganization_en_US from '@locale/lanres/ibzorganization/ibzorganization_en_US';
import ibzteam_en_US from '@locale/lanres/ibzteam/ibzteam_en_US';
import ibzdeptmember_en_US from '@locale/lanres/entities/ibzdept-member/ibzdept-member_en_US';
import ibzteammember_en_US from '@locale/lanres/entities/ibzteam-member/ibzteam-member_en_US';
import ibzdepartment_en_US from '@locale/lanres/entities/ibzdepartment/ibzdepartment_en_US';
import ibzemployee_en_US from '@locale/lanres/entities/ibzemployee/ibzemployee_en_US';
import ibzorganization_en_US from '@locale/lanres/entities/ibzorganization/ibzorganization_en_US';
import ibzteam_en_US from '@locale/lanres/entities/ibzteam/ibzteam_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';
......
import ibzdeptmember_zh_CN from '@locale/lanres/ibzdept-member/ibzdept-member_zh_CN';
import ibzteammember_zh_CN from '@locale/lanres/ibzteam-member/ibzteam-member_zh_CN';
import ibzdepartment_zh_CN from '@locale/lanres/ibzdepartment/ibzdepartment_zh_CN';
import ibzemployee_zh_CN from '@locale/lanres/ibzemployee/ibzemployee_zh_CN';
import ibzorganization_zh_CN from '@locale/lanres/ibzorganization/ibzorganization_zh_CN';
import ibzteam_zh_CN from '@locale/lanres/ibzteam/ibzteam_zh_CN';
import ibzdeptmember_zh_CN from '@locale/lanres/entities/ibzdept-member/ibzdept-member_zh_CN';
import ibzteammember_zh_CN from '@locale/lanres/entities/ibzteam-member/ibzteam-member_zh_CN';
import ibzdepartment_zh_CN from '@locale/lanres/entities/ibzdepartment/ibzdepartment_zh_CN';
import ibzemployee_zh_CN from '@locale/lanres/entities/ibzemployee/ibzemployee_zh_CN';
import ibzorganization_zh_CN from '@locale/lanres/entities/ibzorganization/ibzorganization_zh_CN';
import ibzteam_zh_CN from '@locale/lanres/entities/ibzteam/ibzteam_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';
......
export default {
fields: {
deptid: '部门标识',
deptcode: '部门代码',
deptname: '部门名称',
orgid: '单位',
parentdeptid: '上级部门',
shortname: '部门简称',
deptlevel: '部门级别',
showorder: '排序',
bcode: '业务编码',
leaderid: '分管领导标识',
leadername: '分管领导',
enable: '逻辑有效',
orgname: '单位',
parentdeptname: '上级部门',
createdate: '创建时间',
updatedate: '最后修改时间',
},
views: {
optionview: {
caption: "部门",
title: '部门',
},
editview: {
caption: "部门",
title: '部门',
},
editgridview: {
caption: "部门",
title: '部门',
},
pickupgridview: {
caption: "部门",
title: '部门',
},
mpickupview: {
caption: "部门",
title: '部门',
},
pickupview: {
caption: "部门",
title: '部门',
},
treeexpview: {
caption: "人员管理",
title: '人员管理',
},
gridview: {
caption: "部门",
title: '部门',
},
},
newform_form: {
details: {
group1: "部门基本信息",
formpage1: "基本信息",
srfupdatedate: "最后修改时间",
srforikey: "",
srfkey: "部门标识",
srfmajortext: "部门名称",
srftempmode: "",
srfuf: "",
srfdeid: "",
srfsourcekey: "",
deptcode: "部门代码",
deptname: "部门名称",
orgid: "单位",
orgname: "单位",
pdeptid: "上级部门",
pdeptname: "上级部门",
enable: "逻辑有效",
deptid: "部门标识",
},
uiactions: {
},
},
main_form: {
details: {
formpage1: "基本信息",
srfupdatedate: "最后修改时间",
srforikey: "",
srfkey: "部门标识",
srfmajortext: "部门名称",
srftempmode: "",
srfuf: "",
srfdeid: "",
srfsourcekey: "",
deptid: "部门标识",
deptcode: "部门代码",
deptname: "部门名称",
orgname: "单位",
pdeptname: "上级部门",
orgid: "单位",
pdeptid: "上级部门",
shortname: "部门简称",
bcode: "业务编码",
deptlevel: "部门级别",
leaderid: "分管领导标识",
leadername: "分管领导",
showorder: "排序",
createdate: "创建时间",
updatedate: "最后修改时间",
},
uiactions: {
},
},
main_grid: {
columns: {
deptcode: "部门代码",
deptname: "部门名称",
orgname: "单位",
pdeptname: "上级部门",
deptlevel: "部门级别",
shortname: "部门简称",
bcode: "业务编码",
leadername: "分管领导",
showorder: "排序",
createdate: "创建时间",
updatedate: "最后修改时间",
orgid: "单位",
pdeptid: "上级部门",
leaderid: "分管领导标识",
},
uiactions: {
},
},
editgrid_grid: {
columns: {
deptcode: "部门代码",
deptname: "部门名称",
orgname: "单位",
pdeptname: "上级部门",
shortname: "部门简称",
deptlevel: "部门级别",
bcode: "业务编码",
leadername: "分管领导",
showorder: "排序",
createdate: "创建时间",
updatedate: "最后修改时间",
leaderid: "分管领导标识",
orgid: "单位",
pdeptid: "上级部门",
},
uiactions: {
},
},
default_searchform: {
details: {
formpage1: "常规条件",
n_deptcode_like: "部门代码(%)",
n_deptname_like: "部门名称(%)",
n_orgid_eq: "单位(=)",
n_pdeptid_eq: "上级部门(=)",
n_bcode_like: "业务编码(%)",
},
uiactions: {
},
},
editviewtoolbar_toolbar: {
tbitem3: {
caption: "Save",
tip: "Save",
},
tbitem6: {
caption: "-",
tip: "",
},
tbitem7: {
caption: "Remove And Close",
tip: "Remove And Close Window",
},
tbitem8: {
caption: "-",
tip: "",
},
tbitem14: {
caption: "Copy",
tip: "Copy {0}",
},
},
editgridviewtoolbar_toolbar: {
tbitem24: {
caption: "行编辑",
tip: "行编辑",
},
tbitem25: {
caption: "新建行",
tip: "新建行",
},
tbitem26: {
caption: "-",
tip: "",
},
tbitem8: {
caption: "Remove",
tip: "Remove {0}",
},
tbitem9: {
caption: "-",
tip: "",
},
tbitem19: {
caption: "Filter",
tip: "Filter",
},
},
gridviewtoolbar_toolbar: {
tbitem1_opennewcreateview: {
caption: "新建",
tip: "新建",
},
tbitem2: {
caption: "-",
tip: "",
},
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: "",
},
tbitem19: {
caption: "Filter",
tip: "Filter",
},
},
depttree_treeview: {
nodes: {
root: '默认根节点',
},
uiactions: {
},
},
};
\ No newline at end of file
export default {
fields: {
deptid: '部门标识',
deptcode: '部门代码',
deptname: '部门名称',
orgid: '单位',
parentdeptid: '上级部门',
shortname: '部门简称',
deptlevel: '部门级别',
showorder: '排序',
bcode: '业务编码',
leaderid: '分管领导标识',
leadername: '分管领导',
enable: '逻辑有效',
orgname: '单位',
parentdeptname: '上级部门',
createdate: '创建时间',
updatedate: '最后修改时间',
},
views: {
optionview: {
caption: '部门',
title: '部门',
},
editview: {
caption: '部门',
title: '部门',
},
editgridview: {
caption: '部门',
title: '部门',
},
pickupgridview: {
caption: '部门',
title: '部门',
},
mpickupview: {
caption: '部门',
title: '部门',
},
pickupview: {
caption: '部门',
title: '部门',
},
treeexpview: {
caption: '人员管理',
title: '人员管理',
},
gridview: {
caption: '部门',
title: '部门',
},
},
newform_form: {
details: {
group1: '部门基本信息',
formpage1: '基本信息',
srfupdatedate: '最后修改时间',
srforikey: '',
srfkey: '部门标识',
srfmajortext: '部门名称',
srftempmode: '',
srfuf: '',
srfdeid: '',
srfsourcekey: '',
deptcode: '部门代码',
deptname: '部门名称',
orgid: '单位',
orgname: '单位',
pdeptid: '上级部门',
pdeptname: '上级部门',
enable: '逻辑有效',
deptid: '部门标识',
},
uiactions: {
},
},
main_form: {
details: {
formpage1: '基本信息',
srfupdatedate: '最后修改时间',
srforikey: '',
srfkey: '部门标识',
srfmajortext: '部门名称',
srftempmode: '',
srfuf: '',
srfdeid: '',
srfsourcekey: '',
deptid: '部门标识',
deptcode: '部门代码',
deptname: '部门名称',
orgname: '单位',
pdeptname: '上级部门',
orgid: '单位',
pdeptid: '上级部门',
shortname: '部门简称',
bcode: '业务编码',
deptlevel: '部门级别',
leaderid: '分管领导标识',
leadername: '分管领导',
showorder: '排序',
createdate: '创建时间',
updatedate: '最后修改时间',
},
uiactions: {
},
},
main_grid: {
columns: {
deptcode: '部门代码',
deptname: '部门名称',
orgname: '单位',
pdeptname: '上级部门',
deptlevel: '部门级别',
shortname: '部门简称',
bcode: '业务编码',
leadername: '分管领导',
showorder: '排序',
createdate: '创建时间',
updatedate: '最后修改时间',
orgid: '单位',
pdeptid: '上级部门',
leaderid: '分管领导标识',
},
uiactions: {
},
},
editgrid_grid: {
columns: {
deptcode: '部门代码',
deptname: '部门名称',
orgname: '单位',
pdeptname: '上级部门',
shortname: '部门简称',
deptlevel: '部门级别',
bcode: '业务编码',
leadername: '分管领导',
showorder: '排序',
createdate: '创建时间',
updatedate: '最后修改时间',
leaderid: '分管领导标识',
orgid: '单位',
pdeptid: '上级部门',
},
uiactions: {
},
},
default_searchform: {
details: {
formpage1: '常规条件',
n_deptcode_like: '部门代码(%)',
n_deptname_like: '部门名称(%)',
n_orgid_eq: '单位(=)',
n_pdeptid_eq: '上级部门(=)',
n_bcode_like: '业务编码(%)',
},
uiactions: {
},
},
editviewtoolbar_toolbar: {
tbitem3: {
caption: '保存',
tip: '保存',
},
tbitem6: {
caption: '-',
tip: '',
},
tbitem7: {
caption: '删除',
tip: '删除',
},
tbitem8: {
caption: '-',
tip: '',
},
tbitem14: {
caption: '拷贝',
tip: '拷贝',
},
},
editgridviewtoolbar_toolbar: {
tbitem24: {
caption: '行编辑',
tip: '行编辑',
},
tbitem25: {
caption: '新建行',
tip: '新建行',
},
tbitem26: {
caption: '-',
tip: '',
},
tbitem8: {
caption: '删除',
tip: '删除',
},
tbitem9: {
caption: '-',
tip: '',
},
tbitem19: {
caption: '过滤',
tip: '过滤',
},
},
gridviewtoolbar_toolbar: {
tbitem1_opennewcreateview: {
caption: '新建',
tip: '新建',
},
tbitem2: {
caption: '-',
tip: '',
},
tbitem4: {
caption: '编辑',
tip: '编辑',
},
tbitem6: {
caption: '拷贝',
tip: '拷贝',
},
tbitem7: {
caption: '-',
tip: '',
},
tbitem8: {
caption: '删除',
tip: '删除',
},
tbitem9: {
caption: '-',
tip: '',
},
tbitem13: {
caption: '导出',
tip: '导出',
},
tbitem10: {
caption: '-',
tip: '',
},
tbitem19: {
caption: '过滤',
tip: '过滤',
},
},
depttree_treeview: {
nodes: {
root: '默认根节点',
},
uiactions: {
},
},
};
\ No newline at end of file
export default {
fields: {
memberid: '标识',
deptid: '部门标识',
deptname: '部门名称',
userid: '用户标识',
personname: '成员',
},
views: {
editview: {
caption: "部门成员",
title: '部门成员',
},
gridview: {
caption: "部门成员",
title: '部门成员',
},
},
main_form: {
details: {
group1: "部门成员基本信息",
formpage1: "基本信息",
srforikey: "",
srfkey: "标识",
srfmajortext: "成员",
srftempmode: "",
srfuf: "",
srfdeid: "",
srfsourcekey: "",
deptname: "部门名称",
deptid: "部门标识",
personname: "成员",
userid: "用户标识",
memberid: "标识",
},
uiactions: {
},
},
main_grid: {
columns: {
deptname: "部门",
personname: "成员",
deptid: "部门标识",
},
uiactions: {
},
},
gridviewtoolbar_toolbar: {
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",
},
},
editviewtoolbar_toolbar: {
tbitem3: {
caption: "Save",
tip: "Save",
},
tbitem6: {
caption: "-",
tip: "",
},
tbitem7: {
caption: "Remove And Close",
tip: "Remove And Close Window",
},
tbitem8: {
caption: "-",
tip: "",
},
tbitem14: {
caption: "Copy",
tip: "Copy {0}",
},
},
};
\ No newline at end of file
export default {
fields: {
memberid: '标识',
deptid: '部门标识',
deptname: '部门名称',
userid: '用户标识',
personname: '成员',
},
views: {
editview: {
caption: '部门成员',
title: '部门成员',
},
gridview: {
caption: '部门成员',
title: '部门成员',
},
},
main_form: {
details: {
group1: '部门成员基本信息',
formpage1: '基本信息',
srforikey: '',
srfkey: '标识',
srfmajortext: '成员',
srftempmode: '',
srfuf: '',
srfdeid: '',
srfsourcekey: '',
deptname: '部门名称',
deptid: '部门标识',
personname: '成员',
userid: '用户标识',
memberid: '标识',
},
uiactions: {
},
},
main_grid: {
columns: {
deptname: '部门',
personname: '成员',
deptid: '部门标识',
},
uiactions: {
},
},
gridviewtoolbar_toolbar: {
tbitem4: {
caption: '编辑',
tip: '编辑',
},
tbitem6: {
caption: '拷贝',
tip: '拷贝',
},
tbitem7: {
caption: '-',
tip: '',
},
tbitem8: {
caption: '删除',
tip: '删除',
},
tbitem9: {
caption: '-',
tip: '',
},
tbitem13: {
caption: '导出',
tip: '导出',
},
},
editviewtoolbar_toolbar: {
tbitem3: {
caption: '保存',
tip: '保存',
},
tbitem6: {
caption: '-',
tip: '',
},
tbitem7: {
caption: '删除',
tip: '删除',
},
tbitem8: {
caption: '-',
tip: '',
},
tbitem14: {
caption: '拷贝',
tip: '拷贝',
},
},
};
\ No newline at end of file
export default {
fields: {
userid: '用户标识',
username: '用户全局名',
personname: '姓名',
usercode: '用户工号',
loginname: '登录名',
password: '密码',
domains: '区属',
mdeptid: '主部门',
mdeptcode: '主部门代码',
mdeptname: '主部门名称',
bcode: '业务编码',
postid: '岗位标识',
postcode: '岗位代码',
postname: '岗位名称',
orgid: '单位',
orgcode: '单位代码',
orgname: '单位名称',
nickname: '昵称别名',
sex: '性别',
certcode: '证件号码',
phone: '联系方式',
birthday: '出生日期',
email: '邮件',
avatar: '社交账号',
addr: '地址',
usericon: '照片',
ipaddr: 'ip地址',
theme: '样式',
lang: '语言',
fontsize: '字号',
memo: '备注',
reserver: '保留',
showorder: '排序',
enable: '逻辑有效',
createdate: '创建时间',
updatedate: '最后修改时间',
},
views: {
editgridview: {
caption: "人员",
title: '人员',
},
editview: {
caption: "人员",
title: '人员',
},
gridview: {
caption: "人员",
title: '人员',
},
mpickupview: {
caption: "人员",
title: '人员',
},
optionview: {
caption: "人员",
title: '人员',
},
changepwdview: {
caption: "人员",
title: '人员',
},
pickupview: {
caption: "人员",
title: '人员',
},
pickupgridview: {
caption: "人员",
title: '人员',
},
},
main_form: {
details: {
grouppanel1: "分组面板",
grouppanel2: "分组面板",
druipart1: "部门",
group1: "人员基本信息",
formpage1: "基本信息",
srfupdatedate: "最后修改时间",
srforikey: "",
srfkey: "用户标识",
srfmajortext: "姓名",
srftempmode: "",
srfuf: "",
srfdeid: "",
srfsourcekey: "",
usercode: "用户工号",
personname: "姓名",
loginname: "登录名",
orgid: "单位",
orgname: "单位",
mdeptid: "主部门",
mdeptname: "部门",
mdeptcode: "主部门代码",
orgcode: "单位代码",
bcode: "业务编码",
nickname: "昵称别名",
sex: "性别",
birthday: "出生日期",
certcode: "证件号码",
phone: "联系方式",
avatar: "社交账号",
email: "邮件",
ipaddr: "ip地址",
showorder: "排序",
addr: "地址",
memo: "备注",
theme: "样式",
lang: "语言",
fontsize: "字号",
reserver: "保留",
usericon: "照片",
userid: "用户标识",
},
uiactions: {
},
},
newform_form: {
details: {
group1: "人员基本信息",
formpage1: "基本信息",
srfupdatedate: "最后修改时间",
srforikey: "",
srfkey: "用户标识",
srfmajortext: "姓名",
srftempmode: "",
srfuf: "",
srfdeid: "",
srfsourcekey: "",
usercode: "用户工号",
personname: "姓名",
loginname: "登录名",
orgname: "单位",
orgid: "单位",
orgcode: "单位代码",
mdeptname: "部门",
mdeptcode: "主部门代码",
mdeptid: "主部门",
enable: "逻辑有效",
bcode: "业务编码",
userid: "用户标识",
},
uiactions: {
},
},
changepw_form: {
details: {
group1: "密码信息",
formpage1: "基本信息",
srfupdatedate: "最后修改时间",
srforikey: "",
srfkey: "用户标识",
srfmajortext: "姓名",
srftempmode: "",
srfuf: "",
srfdeid: "",
srfsourcekey: "",
oldpasswd: "原始密码",
newpasswd: "新密码",
cfmpasswd: "新密码确认",
userid: "用户标识",
},
uiactions: {
},
},
editgrid_grid: {
columns: {
usercode: "用户工号",
personname: "姓名",
loginname: "登录名",
orgcode: "单位代码",
orgname: "单位名称",
mdeptcode: "主部门代码",
mdeptname: "主部门名称",
sex: "性别",
phone: "联系方式",
ipaddr: "ip地址",
showorder: "排序",
},
uiactions: {
},
},
main_grid: {
columns: {
usercode: "用户工号",
personname: "姓名",
loginname: "登录名",
orgcode: "单位代码",
orgname: "单位名称",
mdeptcode: "主部门代码",
mdeptname: "主部门名称",
sex: "性别",
phone: "联系方式",
ipaddr: "ip地址",
showorder: "排序",
},
uiactions: {
},
},
default_searchform: {
details: {
formpage1: "常规条件",
n_usercode_like: "工号",
n_personname_like: "姓名",
n_mdeptname_like: "部门",
},
uiactions: {
},
},
editgridviewtoolbar_toolbar: {
tbitem24: {
caption: "行编辑",
tip: "行编辑",
},
tbitem25: {
caption: "新建行",
tip: "新建行",
},
tbitem26: {
caption: "-",
tip: "",
},
tbitem8: {
caption: "Remove",
tip: "Remove {0}",
},
tbitem9: {
caption: "-",
tip: "",
},
tbitem19: {
caption: "Filter",
tip: "Filter",
},
},
editviewtoolbar_toolbar: {
tbitem3: {
caption: "Save",
tip: "Save",
},
tbitem6: {
caption: "-",
tip: "",
},
tbitem7: {
caption: "Remove And Close",
tip: "Remove And Close Window",
},
tbitem8: {
caption: "-",
tip: "",
},
tbitem14: {
caption: "Copy",
tip: "Copy {0}",
},
},
gridviewtoolbar_toolbar: {
tbitem1_opennewcreateview: {
caption: "新建",
tip: "新建",
},
tbitem2: {
caption: "-",
tip: "",
},
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: "",
},
tbitem14_initpwd: {
caption: "初始化密码",
tip: "初始化密码",
},
tbitem15: {
caption: "-",
tip: "",
},
tbitem19: {
caption: "Filter",
tip: "Filter",
},
},
changepwdviewtoolbar_toolbar: {
tbitem1: {
caption: "Save",
tip: "Save",
},
},
};
\ No newline at end of file
export default {
fields: {
userid: '用户标识',
username: '用户全局名',
personname: '姓名',
usercode: '用户工号',
loginname: '登录名',
password: '密码',
domains: '区属',
mdeptid: '主部门',
mdeptcode: '主部门代码',
mdeptname: '主部门名称',
bcode: '业务编码',
postid: '岗位标识',
postcode: '岗位代码',
postname: '岗位名称',
orgid: '单位',
orgcode: '单位代码',
orgname: '单位名称',
nickname: '昵称别名',
sex: '性别',
certcode: '证件号码',
phone: '联系方式',
birthday: '出生日期',
email: '邮件',
avatar: '社交账号',
addr: '地址',
usericon: '照片',
ipaddr: 'ip地址',
theme: '样式',
lang: '语言',
fontsize: '字号',
memo: '备注',
reserver: '保留',
showorder: '排序',
enable: '逻辑有效',
createdate: '创建时间',
updatedate: '最后修改时间',
},
views: {
editgridview: {
caption: '人员',
title: '人员',
},
editview: {
caption: '人员',
title: '人员',
},
gridview: {
caption: '人员',
title: '人员',
},
mpickupview: {
caption: '人员',
title: '人员',
},
optionview: {
caption: '人员',
title: '人员',
},
changepwdview: {
caption: '人员',
title: '人员',
},
pickupview: {
caption: '人员',
title: '人员',
},
pickupgridview: {
caption: '人员',
title: '人员',
},
},
main_form: {
details: {
grouppanel1: '分组面板',
grouppanel2: '分组面板',
druipart1: '部门',
group1: '人员基本信息',
formpage1: '基本信息',
srfupdatedate: '最后修改时间',
srforikey: '',
srfkey: '用户标识',
srfmajortext: '姓名',
srftempmode: '',
srfuf: '',
srfdeid: '',
srfsourcekey: '',
usercode: '用户工号',
personname: '姓名',
loginname: '登录名',
orgid: '单位',
orgname: '单位',
mdeptid: '主部门',
mdeptname: '部门',
mdeptcode: '主部门代码',
orgcode: '单位代码',
bcode: '业务编码',
nickname: '昵称别名',
sex: '性别',
birthday: '出生日期',
certcode: '证件号码',
phone: '联系方式',
avatar: '社交账号',
email: '邮件',
ipaddr: 'ip地址',
showorder: '排序',
addr: '地址',
memo: '备注',
theme: '样式',
lang: '语言',
fontsize: '字号',
reserver: '保留',
usericon: '照片',
userid: '用户标识',
},
uiactions: {
},
},
newform_form: {
details: {
group1: '人员基本信息',
formpage1: '基本信息',
srfupdatedate: '最后修改时间',
srforikey: '',
srfkey: '用户标识',
srfmajortext: '姓名',
srftempmode: '',
srfuf: '',
srfdeid: '',
srfsourcekey: '',
usercode: '用户工号',
personname: '姓名',
loginname: '登录名',
orgname: '单位',
orgid: '单位',
orgcode: '单位代码',
mdeptname: '部门',
mdeptcode: '主部门代码',
mdeptid: '主部门',
enable: '逻辑有效',
bcode: '业务编码',
userid: '用户标识',
},
uiactions: {
},
},
changepw_form: {
details: {
group1: '密码信息',
formpage1: '基本信息',
srfupdatedate: '最后修改时间',
srforikey: '',
srfkey: '用户标识',
srfmajortext: '姓名',
srftempmode: '',
srfuf: '',
srfdeid: '',
srfsourcekey: '',
oldpasswd: '原始密码',
newpasswd: '新密码',
cfmpasswd: '新密码确认',
userid: '用户标识',
},
uiactions: {
},
},
editgrid_grid: {
columns: {
usercode: '用户工号',
personname: '姓名',
loginname: '登录名',
orgcode: '单位代码',
orgname: '单位名称',
mdeptcode: '主部门代码',
mdeptname: '主部门名称',
sex: '性别',
phone: '联系方式',
ipaddr: 'ip地址',
showorder: '排序',
},
uiactions: {
},
},
main_grid: {
columns: {
usercode: '用户工号',
personname: '姓名',
loginname: '登录名',
orgcode: '单位代码',
orgname: '单位名称',
mdeptcode: '主部门代码',
mdeptname: '主部门名称',
sex: '性别',
phone: '联系方式',
ipaddr: 'ip地址',
showorder: '排序',
},
uiactions: {
},
},
default_searchform: {
details: {
formpage1: '常规条件',
n_usercode_like: '工号',
n_personname_like: '姓名',
n_mdeptname_like: '部门',
},
uiactions: {
},
},
editgridviewtoolbar_toolbar: {
tbitem24: {
caption: '行编辑',
tip: '行编辑',
},
tbitem25: {
caption: '新建行',
tip: '新建行',
},
tbitem26: {
caption: '-',
tip: '',
},
tbitem8: {
caption: '删除',
tip: '删除',
},
tbitem9: {
caption: '-',
tip: '',
},
tbitem19: {
caption: '过滤',
tip: '过滤',
},
},
editviewtoolbar_toolbar: {
tbitem3: {
caption: '保存',
tip: '保存',
},
tbitem6: {
caption: '-',
tip: '',
},
tbitem7: {
caption: '删除',
tip: '删除',
},
tbitem8: {
caption: '-',
tip: '',
},
tbitem14: {
caption: '拷贝',
tip: '拷贝',
},
},
gridviewtoolbar_toolbar: {
tbitem1_opennewcreateview: {
caption: '新建',
tip: '新建',
},
tbitem2: {
caption: '-',
tip: '',
},
tbitem4: {
caption: '编辑',
tip: '编辑',
},
tbitem6: {
caption: '拷贝',
tip: '拷贝',
},
tbitem7: {
caption: '-',
tip: '',
},
tbitem8: {
caption: '删除',
tip: '删除',
},
tbitem9: {
caption: '-',
tip: '',
},
tbitem13: {
caption: '导出',
tip: '导出',
},
tbitem10: {
caption: '-',
tip: '',
},
tbitem14_initpwd: {
caption: '初始化密码',
tip: '初始化密码',
},
tbitem15: {
caption: '-',
tip: '',
},
tbitem19: {
caption: '过滤',
tip: '过滤',
},
},
changepwdviewtoolbar_toolbar: {
tbitem1: {
caption: '保存',
tip: '保存',
},
},
};
\ No newline at end of file
export default {
fields: {
orgid: '单位标识',
orgcode: '单位代码',
orgname: '名称',
parentorgid: '上级单位',
shortname: '单位简称',
orglevel: '单位级别',
showorder: '排序',
parentorgname: '上级单位',
enable: '逻辑有效',
createdate: '创建时间',
updatedate: '最后修改时间',
},
views: {
editview: {
caption: "单位机构",
title: '单位机构',
},
treeexpview: {
caption: "部门管理",
title: '部门管理',
},
pickupgridview: {
caption: "单位机构",
title: '单位机构',
},
optionview: {
caption: "单位机构",
title: '单位机构',
},
pickupview: {
caption: "单位机构",
title: '单位机构',
},
gridview: {
caption: "单位机构",
title: '单位机构',
},
},
main_form: {
details: {
formpage1: "基本信息",
srfupdatedate: "最后修改时间",
srforikey: "",
srfkey: "单位标识",
srfmajortext: "名称",
srftempmode: "",
srfuf: "",
srfdeid: "",
srfsourcekey: "",
orgid: "单位标识",
orgcode: "单位代码",
orgname: "名称",
porgname: "上级单位",
orglevel: "单位级别",
shortname: "单位简称",
showorder: "排序",
porgid: "上级单位",
createdate: "创建时间",
updatedate: "最后修改时间",
},
uiactions: {
},
},
newform_form: {
details: {
group1: "单位机构基本信息",
formpage1: "基本信息",
srfupdatedate: "最后修改时间",
srforikey: "",
srfkey: "单位标识",
srfmajortext: "名称",
srftempmode: "",
srfuf: "",
srfdeid: "",
srfsourcekey: "",
orgcode: "单位代码",
orgname: "名称",
porgname: "上级单位",
porgid: "上级单位",
enable: "逻辑有效",
orgid: "单位标识",
},
uiactions: {
},
},
main_grid: {
columns: {
orgid: "单位标识",
orgcode: "单位代码",
orgname: "名称",
orglevel: "单位级别",
shortname: "单位简称",
porgname: "上级单位",
porgid: "上级单位",
showorder: "排序",
createdate: "创建时间",
updatedate: "最后修改时间",
},
uiactions: {
},
},
default_searchform: {
details: {
formpage1: "常规条件",
orgcode: "单位代码(文本左包含(%#))",
n_orgname_like: "名称(%)",
n_porgid_eq: "上级单位(=)",
porgname: "上级单位(等于(=))",
},
uiactions: {
},
},
editviewtoolbar_toolbar: {
tbitem3: {
caption: "Save",
tip: "Save",
},
tbitem6: {
caption: "-",
tip: "",
},
tbitem7: {
caption: "Remove And Close",
tip: "Remove And Close Window",
},
tbitem8: {
caption: "-",
tip: "",
},
tbitem14: {
caption: "Copy",
tip: "Copy {0}",
},
},
gridviewtoolbar_toolbar: {
tbitem1_opennewcreateview: {
caption: "新建",
tip: "新建",
},
tbitem2: {
caption: "-",
tip: "",
},
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: "",
},
tbitem19: {
caption: "Filter",
tip: "Filter",
},
},
orgtree_treeview: {
nodes: {
root: '默认根节点',
},
uiactions: {
},
},
};
\ No newline at end of file
export default {
fields: {
orgid: '单位标识',
orgcode: '单位代码',
orgname: '名称',
parentorgid: '上级单位',
shortname: '单位简称',
orglevel: '单位级别',
showorder: '排序',
parentorgname: '上级单位',
enable: '逻辑有效',
createdate: '创建时间',
updatedate: '最后修改时间',
},
views: {
editview: {
caption: '单位机构',
title: '单位机构',
},
treeexpview: {
caption: '部门管理',
title: '部门管理',
},
pickupgridview: {
caption: '单位机构',
title: '单位机构',
},
optionview: {
caption: '单位机构',
title: '单位机构',
},
pickupview: {
caption: '单位机构',
title: '单位机构',
},
gridview: {
caption: '单位机构',
title: '单位机构',
},
},
main_form: {
details: {
formpage1: '基本信息',
srfupdatedate: '最后修改时间',
srforikey: '',
srfkey: '单位标识',
srfmajortext: '名称',
srftempmode: '',
srfuf: '',
srfdeid: '',
srfsourcekey: '',
orgid: '单位标识',
orgcode: '单位代码',
orgname: '名称',
porgname: '上级单位',
orglevel: '单位级别',
shortname: '单位简称',
showorder: '排序',
porgid: '上级单位',
createdate: '创建时间',
updatedate: '最后修改时间',
},
uiactions: {
},
},
newform_form: {
details: {
group1: '单位机构基本信息',
formpage1: '基本信息',
srfupdatedate: '最后修改时间',
srforikey: '',
srfkey: '单位标识',
srfmajortext: '名称',
srftempmode: '',
srfuf: '',
srfdeid: '',
srfsourcekey: '',
orgcode: '单位代码',
orgname: '名称',
porgname: '上级单位',
porgid: '上级单位',
enable: '逻辑有效',
orgid: '单位标识',
},
uiactions: {
},
},
main_grid: {
columns: {
orgid: '单位标识',
orgcode: '单位代码',
orgname: '名称',
orglevel: '单位级别',
shortname: '单位简称',
porgname: '上级单位',
porgid: '上级单位',
showorder: '排序',
createdate: '创建时间',
updatedate: '最后修改时间',
},
uiactions: {
},
},
default_searchform: {
details: {
formpage1: '常规条件',
orgcode: '单位代码(文本左包含(%#))',
n_orgname_like: '名称(%)',
n_porgid_eq: '上级单位(=)',
porgname: '上级单位(等于(=))',
},
uiactions: {
},
},
editviewtoolbar_toolbar: {
tbitem3: {
caption: '保存',
tip: '保存',
},
tbitem6: {
caption: '-',
tip: '',
},
tbitem7: {
caption: '删除',
tip: '删除',
},
tbitem8: {
caption: '-',
tip: '',
},
tbitem14: {
caption: '拷贝',
tip: '拷贝',
},
},
gridviewtoolbar_toolbar: {
tbitem1_opennewcreateview: {
caption: '新建',
tip: '新建',
},
tbitem2: {
caption: '-',
tip: '',
},
tbitem4: {
caption: '编辑',
tip: '编辑',
},
tbitem6: {
caption: '拷贝',
tip: '拷贝',
},
tbitem7: {
caption: '-',
tip: '',
},
tbitem8: {
caption: '删除',
tip: '删除',
},
tbitem9: {
caption: '-',
tip: '',
},
tbitem13: {
caption: '导出',
tip: '导出',
},
tbitem10: {
caption: '-',
tip: '',
},
tbitem19: {
caption: '过滤',
tip: '过滤',
},
},
orgtree_treeview: {
nodes: {
root: '默认根节点',
},
uiactions: {
},
},
};
\ No newline at end of file
export default {
fields: {
teammemberid: '组成员标识',
teamid: '组标识',
teamname: '组名称',
userid: '用户标识',
personname: '姓名',
},
};
\ No newline at end of file
export default {
fields: {
teammemberid: '组成员标识',
teamid: '组标识',
teamname: '组名称',
userid: '用户标识',
personname: '姓名',
},
};
\ No newline at end of file
export default {
fields: {
teamid: '组标识',
teamname: '组名称',
},
};
\ No newline at end of file
export default {
fields: {
teamid: '组标识',
teamname: '组名称',
},
};
\ No newline at end of file
......@@ -229,10 +229,12 @@ export default class IBZDepartmentEditGridViewBase 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();
});
}
}
/**
......
......@@ -202,10 +202,12 @@ export default class IBZDepartmentEditViewBase 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();
});
}
}
/**
......
......@@ -241,10 +241,12 @@ export default class IBZDepartmentGridViewBase 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();
});
}
}
/**
......
......@@ -203,10 +203,12 @@ export default class IBZDepartmentMPickupViewBase 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();
});
}
}
/**
......
......@@ -174,10 +174,12 @@ export default class IBZDepartmentOptionViewBase 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();
});
}
}
/**
......
......@@ -182,10 +182,12 @@ export default class IBZDepartmentPickupGridViewBase 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();
});
}
}
/**
......
......@@ -170,10 +170,12 @@ export default class IBZDepartmentPickupViewBase 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();
});
}
}
/**
......
......@@ -164,10 +164,12 @@ export default class IBZDepartmentTreeExpViewBase 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();
});
}
}
/**
......
......@@ -202,10 +202,12 @@ export default class IBZDeptMemberEditViewBase 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();
});
}
}
/**
......
......@@ -209,10 +209,12 @@ export default class IBZDeptMemberGridViewBase 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();
});
}
}
/**
......
......@@ -188,10 +188,12 @@ export default class IBZEmployeeChangePwdViewBase 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();
});
}
}
/**
......
......@@ -232,10 +232,12 @@ export default class IBZEmployeeEditGridViewBase 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();
});
}
}
/**
......
......@@ -202,10 +202,12 @@ export default class IBZEmployeeEditViewBase 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();
});
}
}
/**
......
......@@ -248,10 +248,12 @@ export default class IBZEmployeeGridViewBase 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();
});
}
}
/**
......
......@@ -203,10 +203,12 @@ export default class IBZEmployeeMPickupViewBase 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();
});
}
}
/**
......
......@@ -174,10 +174,12 @@ export default class IBZEmployeeOptionViewBase 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();
});
}
}
/**
......
......@@ -182,10 +182,12 @@ export default class IBZEmployeePickupGridViewBase 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();
});
}
}
/**
......
......@@ -170,10 +170,12 @@ export default class IBZEmployeePickupViewBase 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();
});
}
}
/**
......
......@@ -202,10 +202,12 @@ export default class IBZOrganizationEditViewBase 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();
});
}
}
/**
......
......@@ -244,10 +244,12 @@ export default class IBZOrganizationGridViewBase 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();
});
}
}
/**
......
......@@ -174,10 +174,12 @@ export default class IBZOrganizationOptionViewBase 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();
});
}
}
/**
......
......@@ -182,10 +182,12 @@ export default class IBZOrganizationPickupGridViewBase 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();
});
}
}
/**
......
......@@ -170,10 +170,12 @@ export default class IBZOrganizationPickupViewBase 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();
});
}
}
/**
......
......@@ -164,10 +164,12 @@ export default class IBZOrganizationTreeExpViewBase 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();
});
}
}
/**
......
......@@ -176,10 +176,12 @@ export default class OUIndexViewBase 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();
});
}
}
/**
......
......@@ -31,6 +31,13 @@ export default class SaveDeptMemberLogicBase {
*/
private defaultParamName:string = "Default";
/**
* 参数集合
*
* @memberof SaveDeptMemberLogicBase
*/
private paramsMap:Map<string,any> = new Map();
/**
* Creates an instance of SaveDeptMemberLogicBase.
*
......@@ -38,7 +45,18 @@ export default class SaveDeptMemberLogicBase {
* @memberof SaveDeptMemberLogicBase
*/
constructor(opts: any = {}) {
this.initParams(opts);
}
/**
* 初始化参数集合
*
* @param {*} [opts={}]
* @memberof SaveDeptMemberLogicBase
*/
public initParams(opts:any){
this.paramsMap.set('Default',opts);
this.paramsMap.set('member',{});
}
......@@ -98,10 +116,20 @@ export default class SaveDeptMemberLogicBase {
*/
private async executePrepareparam1(context:any,params:any,isloading:boolean){
// 准备参数节点
Object.assign(params,{deptid:params.mdeptid});
Object.assign(context,{ibzdeptmember:params.mdeptid ? params.mdeptid : null});
Object.assign(params,{userid:params.userid});
Object.assign(context,{ibzdeptmember:params.userid ? params.userid : null});
console.log(this.paramsMap);
let tempSrcParam0:any = this.paramsMap.get('Default');
let tempDstParam0Context:any = this.paramsMap.get('member').context;
let tempDstParam0Data:any = this.paramsMap.get('member').data;
Object.assign(tempDstParam0Data,{DEPTID:tempSrcParam0Data['MDEPTID']});
this.paramsMap.set('member',{data:tempDstParam0Data,context:tempDstParam0Context});
console.log(this.paramsMap);
console.log(this.paramsMap);
let tempSrcParam1:any = this.paramsMap.get('Default');
let tempDstParam1Context:any = this.paramsMap.get('member').context;
let tempDstParam1Data:any = this.paramsMap.get('member').data;
Object.assign(tempDstParam1Data,{USERID:tempSrcParam1Data['USERID']});
this.paramsMap.set('member',{data:tempDstParam1Data,context:tempDstParam1Context});
console.log(this.paramsMap);
if(this.compute1Cond(params)){
return this.executeDeaction1(context,params,isloading);
}
......
......@@ -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 });
}
});
}
......
......@@ -37,11 +37,6 @@
git clone -b master $para2 ibzou/
export NODE_OPTIONS=--max-old-space-size=4096
cd ibzou/
mvn clean package -Pweb
cd ibzou-app/ibzou-app-web
mvn -Pweb docker:build
mvn -Pweb docker:push
docker -H $para1 stack deploy --compose-file=src/main/docker/ibzou-app-web.yaml ibzlab-rt --with-registry-auth
</command>
</hudson.tasks.Shell>
</builders>
......
......@@ -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 /ibzou-app-web.jar
EXPOSE 30001
EXPOSE 8080
ADD ibzou-app-web.jar /ibzou-app-web.jar
......@@ -3,22 +3,15 @@ services:
ibzou-app-web:
image: registry.cn-shanghai.aliyuncs.com/ibizsys/ibzou-app-web:latest
ports:
- "30001:30001"
- "8080:8080"
networks:
- agent_network
environment:
- SPRING_CLOUD_NACOS_DISCOVERY_IP=172.16.180.237
- SERVER_PORT=30001
- 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
......
<?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>
......@@ -7,6 +7,11 @@ services:
networks:
- agent_network
deploy:
resources:
limits:
memory: 800M
reservations:
memory: 400M
mode: replicated
replicas: 1
......
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
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
......@@ -12,5 +12,4 @@ public class CusRedisCache extends RedisCache {
public CusRedisCache(String name, RedisCacheWriter redisCacheWriter, RedisCacheConfiguration configuration) {
super(name, redisCacheWriter, configuration);
}
}
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 name;
private String cacheName;
/**
* redis缓存
* Caffeine缓存
*/
private RedisCache redisCache;
private CaffeineCache caffeineCache;
/**
* Caffeine缓存
* redis缓存
*/
private final CaffeineCache caffeineCache;
private RedisCache redisCache;
/**
* 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 = name;
this.redisCache = new CusRedisCache(name, redisCacheWriter, configuration);
this.caffeineCache = new CaffeineCache(name, caffeineCache, true);
this.cacheName = cacheName;
this.caffeineCache = caffeineCache;
this.redisCache = redisCache;
this.redisOperations=redisOperations;
}
@Override
public String getName() {
return this.name;
return this.cacheName;
}
@Override
......@@ -61,40 +57,34 @@ public class LayeringCache extends AbstractValueAdaptingCache {
@Override
public ValueWrapper get(Object key) {
// 查询一级缓存
ValueWrapper wrapper = caffeineCache.get(key);
logger.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());
logger.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);
logger.debug("查询一级缓存 key:{}", key);
log.debug("查询一级缓存 key:{}", key);
if (value == null) {
// 查询二级缓存
value = redisCache.get(key, type);
caffeineCache.put(key, value);
logger.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", name);
message.put("cacheName", cacheName);
message.put("key", key);
RedisPublisher redisPublisher = new RedisPublisher(redisOperations, RedisChannelTopic.REDIS_CACHE_DELETE_TOPIC.getChannelTopic());// 创建redis发布者
redisPublisher.publisher(message);//发布消息,清除其它集群机器中的一级缓存
logger.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", name);
message.put("cacheName", cacheName);
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);
logger.debug("查询一级缓存 key:{}", key);
log.debug("查询一级缓存 key:{}", key);
if (value == null) {
value = redisCache.get(key);
logger.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);
}
}
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 name
* @param cacheName
* @return
*/
@Override
public Cache getCache(String name) {
Cache cache = this.cacheMap.get(name);
public Cache getCache(String cacheName) {
Cache cache = this.cacheMap.get(cacheName);
if (cache == null) {
synchronized (this.cacheMap) {
cache = this.cacheMap.get(name);
cache = this.cacheMap.get(cacheName);
if (cache == null) {
cache = createCache(name);
this.cacheMap.put(name, cache);
cache = createCache(cacheName);
this.cacheMap.put(cacheName, 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 caffeineSpec
* @param caffeineCacheConfig
*/
public void setCaffeineSpec(CaffeineSpec caffeineSpec) {
Caffeine<Object, Object> cacheBuilder = Caffeine.from(caffeineSpec);
public void setCaffeineCacheConfig(CaffeineSpec caffeineCacheConfig) {
Caffeine<Object, Object> cacheBuilder = Caffeine.from(caffeineCacheConfig);
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()));
}
}
}
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 name
* @param cacheName
* @return
*/
@Override
public Cache getCache(String name) {
Cache cache = this.cacheMap.get(name);
public Cache getCache(String cacheName) {
Cache cache = this.cacheMap.get(cacheName);
if (cache == null) {
synchronized (this.cacheMap) {
cache = this.cacheMap.get(name);
cache = this.cacheMap.get(cacheName);
if (cache == null) {
cache = createCache(name);
this.cacheMap.put(name, cache);
cache = createCache(cacheName);
this.cacheMap.put(cacheName, 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();
}
}
}
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"))){
logger.debug("解析缓存数据失败,无法获取指定值!");
log.debug("解析缓存数据失败,无法获取指定值!");
return ;
}
logger.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:
logger.debug("接收到没有定义的订阅消息频道数据");
log.debug("接收到没有定义的订阅消息频道数据");
break;
}
}
......
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);
}
}
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 {
}
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);
}
}
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
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
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);
}
}
......@@ -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:topic1", "删除redis缓存消息频道"),
REDIS_CACHE_CLEAR_TOPIC("redis:cache:clear:topic2", "清空redis缓存消息频道");
String channelTopic;
String label;
......
......@@ -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 到此讨论。请谨慎行事。
先完成此消息的编辑!
想要评论请 注册