This commit is contained in:
kk
2026-07-08 18:00:33 +08:00
commit e66b4a3680
312 changed files with 54718 additions and 0 deletions

View File

@@ -0,0 +1,111 @@
export const LOCK_TYPE_DIC = [
{ label: '系统锁定', value: 'SYSTEM' },
{ label: '手动锁定', value: 'MANUAL' },
];
export const LOCK_STATUS_DIC = [
{ label: '待锁定', value: 'PRE_LOCKED' },
{ label: '锁定中', value: 'LOCKED' },
{ label: '已解锁', value: 'UN_LOCKED' },
];
export const authLockOption = {
tip: false,
searchShow: true,
searchMenuSpan: 6,
border: true,
index: true,
addBtn: false,
viewBtn: false,
editBtn: false,
delBtn: false,
menuWidth: 160,
dialogType: 'drawer',
dialogWidth: 800,
dialogClickModal: false,
column: [
{
label: '锁定目标',
prop: 'lockTarget',
slot: true,
search: true,
span: 24,
searchPlaceholder: '请输入账号或IP',
},
{
label: '用户姓名',
prop: 'userName',
slot: true,
width: 100,
},
{
label: '请求IP',
prop: 'remoteIp',
slot: true,
search: true,
searchPlaceholder: '请输入IP地址',
width: 160,
},
{
label: '失败次数',
prop: 'failCount',
width: 80,
align: 'center',
hide: true,
},
{
label: '用户代理',
prop: 'userAgent',
hide: true,
overHidden: true,
},
{
label: '锁定类型',
prop: 'lockType',
slot: true,
type: 'select',
dicData: LOCK_TYPE_DIC,
width: 90,
align: 'center',
},
{
label: '锁定状态',
prop: 'lockStatus',
slot: true,
type: 'select',
search: true,
dicData: LOCK_STATUS_DIC,
width: 90,
align: 'center',
},
{
label: '锁定开始',
prop: 'lockBeginTime',
slot: true,
width: 120,
},
{
label: '锁定结束',
prop: 'lockEndTime',
slot: true,
width: 120,
},
{
label: '锁定原因',
prop: 'lockReason',
type: 'textarea',
hide: true,
overHidden: true,
minWidth: 160,
span: 24,
},
{
label: '解锁原因',
prop: 'unlockReason',
type: 'textarea',
hide: true,
overHidden: true,
span: 24,
},
],
};

View File

@@ -0,0 +1,94 @@
export const GRANT_TYPE_DIC = [
{ label: '密码登录', value: 'password' },
{ label: '验证码登录', value: 'captcha' },
{ label: '短信登录', value: 'sms' },
{ label: '社交登录', value: 'social' },
{ label: '客户端凭证', value: 'client_credentials' },
{ label: '刷新令牌', value: 'refresh_token' },
];
export const authLogOption = {
tip: false,
searchShow: true,
searchMenuSpan: 6,
border: true,
index: true,
addBtn: false,
viewBtn: false,
editBtn: false,
delBtn: false,
menu: true,
menuWidth: 100,
dialogType: 'drawer',
dialogWidth: 800,
dialogClickModal: false,
column: [
{
label: '授权账号',
prop: 'account',
slot: true,
search: true,
searchPlaceholder: '请输入账号',
},
{
label: '用户姓名',
prop: 'realName',
},
{
label: '授权类型',
prop: 'grantType',
type: 'select',
search: true,
dicData: GRANT_TYPE_DIC,
width: 110,
align: 'center',
},
{
label: '请求IP',
prop: 'remoteIp',
slot: true,
search: true,
searchPlaceholder: '请输入IP地址',
width: 160,
},
{
label: '服务ID',
prop: 'serviceId',
hide: true,
width: 120,
},
{
label: '服务器IP',
prop: 'serverIp',
hide: true,
width: 160,
},
{
label: '环境',
prop: 'env',
slot: true,
width: 80,
align: 'center',
},
{
label: '服务器名',
prop: 'serverHost',
hide: true,
width: 120,
},
{
label: '登录时间',
prop: 'loginTime',
span: 24,
width: 180,
},
{
label: '用户代理',
prop: 'userAgent',
type: 'textarea',
span: 24,
hide: true,
overHidden: true,
},
],
};

210
src/option/system/dict.js Normal file
View File

@@ -0,0 +1,210 @@
export const optionParent = {
height: 'auto',
calcHeight: 32,
tip: false,
searchShow: true,
searchMenuSpan: 10,
border: true,
index: true,
selection: true,
viewBtn: true,
menuWidth: 250,
dialogWidth: 880,
dialogClickModal: false,
column: [
{
label: '字典编号',
prop: 'code',
search: true,
slot: true,
span: 24,
rules: [
{
required: true,
message: '请输入字典编号',
trigger: 'blur',
},
],
},
{
label: '字典名称',
prop: 'dictValue',
search: true,
align: 'center',
rules: [
{
required: true,
message: '请输入字典名称',
trigger: 'blur',
},
],
},
{
label: '字典排序',
prop: 'sort',
type: 'number',
align: 'right',
width: 100,
rules: [
{
required: true,
message: '请输入字典排序',
trigger: 'blur',
},
],
},
{
label: '封存',
prop: 'isSealed',
type: 'switch',
align: 'center',
width: 100,
dicData: [
{
label: '否',
value: 0,
},
{
label: '是',
value: 1,
},
],
value: 0,
slot: true,
rules: [
{
required: true,
message: '请选择封存',
trigger: 'blur',
},
],
},
{
label: '字典备注',
prop: 'remark',
hide: true,
},
],
};
export const optionChild = {
height: 'auto',
calcHeight: 95,
tip: false,
searchShow: true,
searchMenuSpan: 10,
tree: true,
border: true,
index: true,
selection: true,
viewBtn: true,
menuWidth: 300,
dialogWidth: 880,
dialogClickModal: false,
column: [
{
label: '字典编号',
prop: 'code',
addDisabled: true,
editDisabled: true,
search: true,
span: 24,
rules: [
{
required: true,
message: '请输入字典编号',
trigger: 'blur',
},
],
},
{
label: '字典名称',
prop: 'dictValue',
search: true,
align: 'center',
rules: [
{
required: true,
message: '请输入字典名称',
trigger: 'blur',
},
],
},
{
label: '上级字典',
prop: 'parentId',
type: 'tree',
dicData: [],
hide: true,
props: {
label: 'title',
},
addDisabled: true,
editDisabled: true,
rules: [
{
required: false,
message: '请选择上级字典',
trigger: 'click',
},
],
},
{
label: '字典键值',
prop: 'dictKey',
width: 85,
rules: [
{
required: true,
message: '请输入字典键值',
trigger: 'blur',
},
],
},
{
label: '字典排序',
prop: 'sort',
type: 'number',
align: 'right',
hide: true,
rules: [
{
required: true,
message: '请输入字典排序',
trigger: 'blur',
},
],
},
{
label: '封存',
prop: 'isSealed',
type: 'switch',
align: 'center',
width: 80,
dicData: [
{
label: '否',
value: 0,
},
{
label: '是',
value: 1,
},
],
value: 0,
slot: true,
rules: [
{
required: true,
message: '请选择封存',
trigger: 'blur',
},
],
},
{
label: '字典备注',
prop: 'remark',
hide: true,
},
],
};

View File

@@ -0,0 +1,211 @@
export const optionParent = {
height: 'auto',
calcHeight: 32,
tip: false,
searchShow: true,
searchMenuSpan: 10,
border: true,
index: true,
selection: true,
viewBtn: true,
menuWidth: 250,
dialogWidth: 880,
dialogClickModal: false,
column: [
{
label: '字典编号',
prop: 'code',
search: true,
slot: true,
span: 24,
rules: [
{
required: true,
message: '请输入字典编号',
trigger: 'blur',
},
],
},
{
label: '字典名称',
prop: 'dictValue',
search: true,
align: 'center',
rules: [
{
required: true,
message: '请输入字典名称',
trigger: 'blur',
},
],
},
{
label: '字典排序',
prop: 'sort',
type: 'number',
align: 'right',
width: 100,
hide: true,
rules: [
{
required: true,
message: '请输入字典排序',
trigger: 'blur',
},
],
},
{
label: '封存',
prop: 'isSealed',
type: 'switch',
align: 'center',
width: 100,
dicData: [
{
label: '否',
value: 0,
},
{
label: '是',
value: 1,
},
],
value: 0,
slot: true,
rules: [
{
required: true,
message: '请选择封存',
trigger: 'blur',
},
],
},
{
label: '字典备注',
prop: 'remark',
hide: true,
},
],
};
export const optionChild = {
height: 'auto',
calcHeight: 95,
tip: false,
searchShow: true,
searchMenuSpan: 10,
tree: true,
border: true,
index: true,
selection: true,
viewBtn: true,
menuWidth: 300,
dialogWidth: 880,
dialogClickModal: false,
column: [
{
label: '字典编号',
prop: 'code',
addDisabled: true,
editDisabled: true,
search: true,
span: 24,
rules: [
{
required: true,
message: '请输入字典编号',
trigger: 'blur',
},
],
},
{
label: '字典名称',
prop: 'dictValue',
search: true,
align: 'center',
rules: [
{
required: true,
message: '请输入字典名称',
trigger: 'blur',
},
],
},
{
label: '上级字典',
prop: 'parentId',
type: 'tree',
dicData: [],
hide: true,
props: {
label: 'title',
},
addDisabled: true,
editDisabled: true,
rules: [
{
required: false,
message: '请选择上级字典',
trigger: 'click',
},
],
},
{
label: '字典键值',
prop: 'dictKey',
width: 85,
rules: [
{
required: true,
message: '请输入字典键值',
trigger: 'blur',
},
],
},
{
label: '字典排序',
prop: 'sort',
type: 'number',
align: 'right',
hide: true,
rules: [
{
required: true,
message: '请输入字典排序',
trigger: 'blur',
},
],
},
{
label: '封存',
prop: 'isSealed',
type: 'switch',
align: 'center',
width: 80,
dicData: [
{
label: '否',
value: 0,
},
{
label: '是',
value: 1,
},
],
value: 0,
slot: true,
rules: [
{
required: true,
message: '请选择封存',
trigger: 'blur',
},
],
},
{
label: '字典备注',
prop: 'remark',
hide: true,
},
],
};

534
src/option/system/user.js Normal file
View File

@@ -0,0 +1,534 @@
import website from '@/config/website';
import { getDeptLazyTree } from '@/api/system/dept';
export const userOption = safe => {
const validatePass = (rule, value, callback) => {
if (value === '') {
callback(new Error('请输入密码'));
} else {
callback();
}
};
const validatePass2 = (rule, value, callback) => {
if (value === '') {
callback(new Error('请再次输入密码'));
} else if (value !== safe.form.password) {
callback(new Error('两次输入密码不一致!'));
} else {
callback();
}
};
return {
height: 'auto',
calcHeight: 150,
tip: false,
searchShow: true,
searchMenuSpan: 6,
border: true,
index: true,
selection: true,
addBtn: false,
viewBtn: true,
dialogType: 'drawer',
dialogWidth: 1000,
dialogClickModal: false,
column: [
{
label: '登录账号',
prop: 'account',
search: true,
display: false,
},
{
label: '所属租户',
prop: 'tenantName',
slot: true,
display: false,
},
{
label: '用户姓名',
prop: 'realName',
search: true,
display: false,
},
{
label: '所属角色',
prop: 'roleName',
slot: true,
overHidden: true,
display: false,
},
{
label: '所属部门',
prop: 'deptName',
slot: true,
overHidden: true,
display: false,
},
{
label: '用户平台',
prop: 'userTypeName',
width: 100,
slot: true,
display: false,
},
{
label: '用户平台',
type: 'select',
dicUrl: '/blade-system/dict/dictionary?code=user_type',
props: {
label: 'dictValue',
value: 'dictKey',
},
dataType: 'number',
search: true,
hide: true,
display: false,
prop: 'userType',
rules: [
{
required: true,
message: '请选择用户平台',
trigger: 'blur',
},
],
},
],
group: [
{
label: '基础信息',
prop: 'baseInfo',
icon: 'el-icon-user-solid',
column: [
{
label: '所属租户',
prop: 'tenantId',
type: 'tree',
dicUrl: '/blade-system/tenant/select',
props: {
label: 'tenantName',
value: 'tenantId',
},
hide: !website.tenantMode,
addDisplay: website.tenantMode,
editDisplay: website.tenantMode,
viewDisplay: website.tenantMode,
rules: [
{
required: true,
message: '请输入所属租户',
trigger: 'click',
},
],
span: 24,
},
{
label: '登录账号',
prop: 'account',
rules: [
{
required: true,
message: '请输入登录账号',
trigger: 'blur',
},
],
},
{
label: '用户平台',
type: 'select',
dicUrl: '/blade-system/dict/dictionary?code=user_type',
props: {
label: 'dictValue',
value: 'dictKey',
},
dataType: 'number',
slot: true,
prop: 'userType',
rules: [
{
required: true,
message: '请选择用户平台',
trigger: 'blur',
},
],
},
{
label: '密码',
prop: 'password',
hide: true,
editDisplay: false,
viewDisplay: false,
rules: [{ required: true, validator: validatePass, trigger: 'blur' }],
},
{
label: '确认密码',
prop: 'password2',
hide: true,
editDisplay: false,
viewDisplay: false,
rules: [{ required: true, validator: validatePass2, trigger: 'blur' }],
},
],
},
{
label: '详细信息',
prop: 'detailInfo',
icon: 'el-icon-s-order',
column: [
{
label: '用户昵称',
prop: 'name',
hide: true,
rules: [
{
required: true,
message: '请输入用户昵称',
trigger: 'blur',
},
],
},
{
label: '用户姓名',
prop: 'realName',
rules: [
{
required: true,
message: '请输入用户姓名',
trigger: 'blur',
},
{
min: 2,
max: 10,
message: '姓名长度在2到5个字符',
},
],
},
{
label: '手机号码',
prop: 'phone',
overHidden: true,
},
{
label: '电子邮箱',
prop: 'email',
hide: true,
overHidden: true,
},
{
label: '用户性别',
prop: 'sex',
type: 'select',
dicData: [
{
label: '男',
value: 1,
},
{
label: '女',
value: 2,
},
{
label: '未知',
value: 3,
},
],
hide: true,
},
{
label: '用户生日',
type: 'date',
prop: 'birthday',
format: 'YYYY-MM-DD HH:mm:ss',
valueFormat: 'YYYY-MM-DD HH:mm:ss',
hide: true,
},
{
label: '账号状态',
prop: 'statusName',
hide: true,
display: false,
},
],
},
{
label: '职责信息',
prop: 'dutyInfo',
icon: 'el-icon-s-custom',
column: [
{
label: '用户编号',
prop: 'code',
},
{
label: '所属角色',
prop: 'roleId',
multiple: true,
type: 'tree',
dicData: [],
props: {
label: 'title',
},
checkStrictly: true,
slot: true,
rules: [
{
required: true,
message: '请选择所属角色',
trigger: 'click',
},
],
},
{
label: '所属部门',
prop: 'deptId',
type: 'tree',
multiple: true,
dicData: [],
props: {
label: 'title',
},
checkStrictly: true,
slot: true,
rules: [
{
required: true,
message: '请选择所属部门',
trigger: 'click',
},
],
},
{
label: '所属岗位',
prop: 'postId',
type: 'tree',
multiple: true,
dicData: [],
props: {
label: 'postName',
value: 'id',
},
rules: [
{
required: true,
message: '请选择所属岗位',
trigger: 'click',
},
],
},
{
label: '直属主管',
prop: 'leaderId',
type: 'tree',
multiple: true,
filterable: true,
dicData: [],
props: {
label: 'realName',
value: 'id',
},
clearable: true,
},
{
label: '是否主管',
prop: 'isLeader',
type: 'switch',
dicData: [
{
label: '否',
value: 0,
},
{
label: '是',
value: 1,
},
],
value: 0,
},
],
},
],
};
};
export const platformOption = {
tip: false,
searchShow: true,
searchMenuSpan: 6,
border: true,
index: true,
selection: true,
viewBtn: true,
dialogClickModal: false,
menuWidth: 120,
editBtnText: '配置',
column: [
{
label: '登录账号',
prop: 'account',
search: true,
display: false,
},
{
label: '所属租户',
prop: 'tenantName',
slot: true,
display: false,
},
{
label: '用户姓名',
prop: 'realName',
search: true,
display: false,
},
{
label: '用户平台',
prop: 'userTypeName',
slot: true,
display: false,
},
{
label: '用户平台',
type: 'select',
dicUrl: '/blade-system/dict/dictionary?code=user_type',
props: {
label: 'dictValue',
value: 'dictKey',
},
dataType: 'number',
search: true,
hide: true,
display: false,
prop: 'userType',
rules: [
{
required: true,
message: '请选择用户平台',
trigger: 'blur',
},
],
},
{
label: '用户拓展',
prop: 'userExt',
type: 'textarea',
minRows: 8,
span: 24,
overHidden: true,
row: true,
hide: true,
},
],
};
export const excelOption = {
submitBtn: false,
emptyBtn: false,
column: [
{
label: '模板上传',
prop: 'excelFile',
type: 'upload',
drag: true,
loadText: '模板上传中,请稍等',
span: 24,
propsHttp: {
res: 'data',
},
tip: '请上传 .xls,.xlsx 标准格式文件',
action: '/blade-system/user/import-user',
},
{
label: '数据覆盖',
prop: 'isCovered',
type: 'switch',
align: 'center',
width: 80,
dicData: [
{
label: '否',
value: 0,
},
{
label: '是',
value: 1,
},
],
value: 0,
slot: true,
rules: [
{
required: true,
message: '请选择是否覆盖',
trigger: 'blur',
},
],
},
{
label: '模板下载',
prop: 'excelTemplate',
formslot: true,
span: 24,
},
],
};
export const platformFormOption = {
submitBtn: false,
emptyBtn: false,
labelWidth: 100,
column: [
{
label: '用户账号',
prop: 'account',
disabled: true,
span: 24,
},
{
label: '用户平台',
type: 'select',
prop: 'userType',
dicUrl: '/blade-system/dict/dictionary?code=user_type',
props: {
label: 'dictValue',
value: 'dictKey',
},
dataType: 'number',
span: 24,
rules: [{ required: true, message: '请选择用户平台', trigger: 'blur' }],
},
{
label: '用户拓展',
prop: 'userExt',
type: 'textarea',
minRows: 8,
span: 24,
},
],
};
export const treeOption = {
nodeKey: 'id',
lazy: true,
treeLoad: function (node, resolve) {
const parentId = node.level === 0 ? 0 : node.data.id;
getDeptLazyTree(parentId).then(res => {
resolve(
res.data.data.map(item => {
return {
...item,
leaf: !item.hasChildren,
};
})
);
});
},
addBtn: false,
menu: false,
size: 'small',
props: {
labelText: '标题',
label: 'title',
value: 'value',
children: 'children',
},
};