Skip to content
GitLab
Menu
Projects
Groups
Snippets
Help
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
Menu
Open sidebar
jinli gu
RuoYi Vue
Commits
12ab8b03
Commit
12ab8b03
authored
Sep 17, 2021
by
RuoYi
Browse files
使用vue-data-dict,简化数据字典使用
parent
23270c60
Changes
28
Hide whitespace changes
Inline
Side-by-side
ruoyi-generator/src/main/java/com/ruoyi/generator/util/VelocityUtils.java
View file @
12ab8b03
...
...
@@ -58,6 +58,7 @@ public class VelocityUtils
velocityContext
.
put
(
"permissionPrefix"
,
getPermissionPrefix
(
moduleName
,
businessName
));
velocityContext
.
put
(
"columns"
,
genTable
.
getColumns
());
velocityContext
.
put
(
"table"
,
genTable
);
velocityContext
.
put
(
"dicts"
,
getDicts
(
genTable
));
setMenuVelocityContext
(
velocityContext
,
genTable
);
if
(
GenConstants
.
TPL_TREE
.
equals
(
tplCategory
))
{
...
...
@@ -260,6 +261,27 @@ public class VelocityUtils
return
importList
;
}
/**
* 根据列类型获取字典组
*
* @param genTable 业务表对象
* @return 返回字典组
*/
public
static
String
getDicts
(
GenTable
genTable
)
{
List
<
GenTableColumn
>
columns
=
genTable
.
getColumns
();
List
<
String
>
dicts
=
new
ArrayList
<
String
>();
for
(
GenTableColumn
column
:
columns
)
{
if
(!
column
.
isSuperColumn
()
&&
StringUtils
.
isNotEmpty
(
column
.
getDictType
())
&&
StringUtils
.
equalsAny
(
column
.
getHtmlType
(),
new
String
[]
{
GenConstants
.
HTML_SELECT
,
GenConstants
.
HTML_RADIO
}))
{
dicts
.
add
(
"'"
+
column
.
getDictType
()
+
"'"
);
}
}
return
StringUtils
.
join
(
dicts
,
", "
);
}
/**
* 获取权限前缀
*
...
...
ruoyi-generator/src/main/resources/vm/vue/index-tree.vue.vm
View file @
12ab8b03
...
...
@@ -25,10 +25,10 @@
<el-form-item
label=
"
${
comment
}
"
prop=
"
${
column
.
javaField
}
"
>
<el-select
v-model=
"queryParams.
${
column
.
javaField
}
"
placeholder=
"请选择
${
comment
}
"
clearable
size=
"small"
>
<el-option
v-for=
"dict in
${
column
.
javaField
}
Options
"
:key=
"dict.
dictV
alue"
:label=
"dict.
dictL
abel"
:value=
"dict.
dictV
alue"
v-for=
"dict in
dict.type.
${
dictType
}
"
:key=
"dict.
v
alue"
:label=
"dict.
l
abel"
:value=
"dict.
v
alue"
/>
</el-select>
</el-form-item>
...
...
@@ -108,7 +108,7 @@
#
elseif
($
column
.
list
&&
""
!=
$
column
.
dictType
)
<el-table-column
label=
"
${
comment
}
"
align=
"center"
prop=
"
${
javaField
}
"
>
<template
slot-scope=
"scope"
>
<dict-tag
:options=
"
${
javaField
}
Options
"
:value=
"scope.row.
${
javaField
}
"
/>
<dict-tag
:options=
"
dict.type.
${
column
.
dictType
}
"
:value=
"scope.row.
${
javaField
}
"
/>
</template>
</el-table-column>
#
elseif
($
column
.
list
&&
""
!=
$
javaField
)
...
...
@@ -184,10 +184,10 @@
<el-form-item
label=
"
${
comment
}
"
prop=
"
${
field
}
"
>
<el-select
v-model=
"form.
${
field
}
"
placeholder=
"请选择
${
comment
}
"
>
<el-option
v-for=
"dict in
${
field
}
Options
"
:key=
"dict.
dictV
alue"
:label=
"dict.
dictL
abel"
#
if
($
column
.
javaType
==
"Integer"
||
$
column
.
javaType
==
"Long"
)
:value=
"parseInt(dict.
dictV
alue)"
#
else
:value=
"dict.
dictV
alue"
#
end
v-for=
"dict in
dict.type.
${
dictType
}
"
:key=
"dict.
v
alue"
:label=
"dict.
l
abel"
#
if
($
column
.
javaType
==
"Integer"
||
$
column
.
javaType
==
"Long"
)
:value=
"parseInt(dict.
v
alue)"
#
else
:value=
"dict.
v
alue"
#
end
></el-option>
</el-select>
...
...
@@ -202,10 +202,10 @@
<el-form-item
label=
"
${
comment
}
"
>
<el-checkbox-group
v-model=
"form.
${
field
}
"
>
<el-checkbox
v-for=
"dict in
${
field
}
Options
"
:key=
"dict.
dictV
alue"
:label=
"dict.
dictV
alue"
>
{{
dict.
dictL
abel}}
v-for=
"dict in
dict.type.
${
dictType
}
"
:key=
"dict.
v
alue"
:label=
"dict.
v
alue"
>
{{
dict.
l
abel}}
</el-checkbox>
</el-checkbox-group>
</el-form-item>
...
...
@@ -219,11 +219,11 @@
<el-form-item
label=
"
${
comment
}
"
>
<el-radio-group
v-model=
"form.
${
field
}
"
>
<el-radio
v-for=
"dict in
${
field
}
Options
"
:key=
"dict.
dictV
alue"
#
if
($
column
.
javaType
==
"Integer"
||
$
column
.
javaType
==
"Long"
)
:label=
"parseInt(dict.
dictV
alue)"
#
else
:label=
"dict.
dictV
alue"
#
end
v-for=
"dict in
dict.type.
${
dictType
}
"
:key=
"dict.
v
alue"
#
if
($
column
.
javaType
==
"Integer"
||
$
column
.
javaType
==
"Long"
)
:label=
"parseInt(dict.
v
alue)"
#
else
:label=
"dict.
v
alue"
#
end
>
{{
dict.
dictL
abel}}
</el-radio>
>
{{
dict.
l
abel}}
</el-radio>
</el-radio-group>
</el-form-item>
#
elseif
($
column
.
htmlType
==
"radio"
&&
$
dictType
)
...
...
@@ -265,6 +265,9 @@ import "@riophae/vue-treeselect/dist/vue-treeselect.css";
export
default
{
name
:
"
${
BusinessName
}
"
,
#
if
(${
dicts
}
!=
''
)
dicts
:
[${
dicts
}],
#
end
components
:
{
Treeselect
},
...
...
@@ -283,16 +286,7 @@ export default {
// 是否显示弹出层
open
:
false
,
#
foreach
($
column
in
$
columns
)
#
set
($
parentheseIndex
=
$
column
.
columnComment
.
indexOf
(
"("
))
#
if
($
parentheseIndex
!=
-
1
)
#
set
($
comment
=
$
column
.
columnComment
.
substring
(
0
,
$
parentheseIndex
))
#
else
#
set
($
comment
=
$
column
.
columnComment
)
#
end
#
if
(${
column
.
dictType
}
!=
''
)
//
$
comment
字典
${
column
.
javaField
}
Options
:
[],
#
elseif
($
column
.
htmlType
==
"datetime"
&&
$
column
.
queryType
==
"BETWEEN"
)
#
if
($
column
.
htmlType
==
"datetime"
&&
$
column
.
queryType
==
"BETWEEN"
)
#
set
($
AttrName
=
$
column
.
javaField
.
substring
(
0
,
1
).
toUpperCase
()
+
${
column
.
javaField
.
substring
(
1
)})
//
$
comment
时间范围
daterange
${
AttrName
}:
[],
...
...
@@ -330,13 +324,6 @@ export default {
},
created
()
{
this
.
getList
();
#
foreach
($
column
in
$
columns
)
#
if
(${
column
.
dictType
}
!=
''
)
this
.
getDicts
(
"
${
column
.
dictType
}
"
).
then
(
response
=>
{
this
.${
column
.
javaField
}
Options
=
response
.
data
;
});
#
end
#
end
},
methods
:
{
/** 查询
${
functionName
}
列表 */
...
...
ruoyi-generator/src/main/resources/vm/vue/index.vue.vm
View file @
12ab8b03
...
...
@@ -25,10 +25,10 @@
<el-form-item
label=
"
${
comment
}
"
prop=
"
${
column
.
javaField
}
"
>
<el-select
v-model=
"queryParams.
${
column
.
javaField
}
"
placeholder=
"请选择
${
comment
}
"
clearable
size=
"small"
>
<el-option
v-for=
"dict in
${
column
.
javaField
}
Options
"
:key=
"dict.
dictV
alue"
:label=
"dict.
dictL
abel"
:value=
"dict.
dictV
alue"
v-for=
"dict in
dict.type.
${
dictType
}
"
:key=
"dict.
v
alue"
:label=
"dict.
l
abel"
:value=
"dict.
v
alue"
/>
</el-select>
</el-form-item>
...
...
@@ -137,7 +137,7 @@
#
elseif
($
column
.
list
&&
""
!=
$
column
.
dictType
)
<el-table-column
label=
"
${
comment
}
"
align=
"center"
prop=
"
${
javaField
}
"
>
<template
slot-scope=
"scope"
>
<dict-tag
:options=
"
${
javaField
}
Options
"
:value=
"scope.row.
${
javaField
}
"
/>
<dict-tag
:options=
"
dict.type.
${
column
.
dictType
}
"
:value=
"scope.row.
${
javaField
}
"
/>
</template>
</el-table-column>
#
elseif
($
column
.
list
&&
""
!=
$
javaField
)
...
...
@@ -206,10 +206,10 @@
<el-form-item
label=
"
${
comment
}
"
prop=
"
${
field
}
"
>
<el-select
v-model=
"form.
${
field
}
"
placeholder=
"请选择
${
comment
}
"
>
<el-option
v-for=
"dict in
${
field
}
Options
"
:key=
"dict.
dictV
alue"
:label=
"dict.
dictL
abel"
#
if
($
column
.
javaType
==
"Integer"
||
$
column
.
javaType
==
"Long"
)
:value=
"parseInt(dict.
dictV
alue)"
#
else
:value=
"dict.
dictV
alue"
#
end
v-for=
"dict in
dict.type.
${
dictType
}
"
:key=
"dict.
v
alue"
:label=
"dict.
l
abel"
#
if
($
column
.
javaType
==
"Integer"
||
$
column
.
javaType
==
"Long"
)
:value=
"parseInt(dict.
v
alue)"
#
else
:value=
"dict.
v
alue"
#
end
></el-option>
</el-select>
...
...
@@ -224,10 +224,10 @@
<el-form-item
label=
"
${
comment
}
"
>
<el-checkbox-group
v-model=
"form.
${
field
}
"
>
<el-checkbox
v-for=
"dict in
${
field
}
Options
"
:key=
"dict.
dictV
alue"
:label=
"dict.
dictV
alue"
>
{{
dict.
dictL
abel}}
v-for=
"dict in
dict.type.
${
dictType
}
"
:key=
"dict.
v
alue"
:label=
"dict.
v
alue"
>
{{
dict.
l
abel}}
</el-checkbox>
</el-checkbox-group>
</el-form-item>
...
...
@@ -241,11 +241,11 @@
<el-form-item
label=
"
${
comment
}
"
>
<el-radio-group
v-model=
"form.
${
field
}
"
>
<el-radio
v-for=
"dict in
${
field
}
Options
"
:key=
"dict.
dictV
alue"
#
if
($
column
.
javaType
==
"Integer"
||
$
column
.
javaType
==
"Long"
)
:label=
"parseInt(dict.
dictV
alue)"
#
else
:label=
"dict.
dictV
alue"
#
end
v-for=
"dict in
dict.type.
${
dictType
}
"
:key=
"dict.
v
alue"
#
if
($
column
.
javaType
==
"Integer"
||
$
column
.
javaType
==
"Long"
)
:label=
"parseInt(dict.
v
alue)"
#
else
:label=
"dict.
v
alue"
#
end
>
{{
dict.
dictL
abel}}
</el-radio>
>
{{
dict.
l
abel}}
</el-radio>
</el-radio-group>
</el-form-item>
#
elseif
($
column
.
htmlType
==
"radio"
&&
$
dictType
)
...
...
@@ -317,6 +317,9 @@ import { list${BusinessName}, get${BusinessName}, del${BusinessName}, add${Busin
export
default
{
name
:
"
${
BusinessName
}
"
,
#
if
(${
dicts
}
!=
''
)
dicts
:
[${
dicts
}],
#
end
data
()
{
return
{
// 遮罩层
...
...
@@ -348,16 +351,7 @@ export default {
// 是否显示弹出层
open
:
false
,
#
foreach
($
column
in
$
columns
)
#
set
($
parentheseIndex
=
$
column
.
columnComment
.
indexOf
(
"("
))
#
if
($
parentheseIndex
!=
-
1
)
#
set
($
comment
=
$
column
.
columnComment
.
substring
(
0
,
$
parentheseIndex
))
#
else
#
set
($
comment
=
$
column
.
columnComment
)
#
end
#
if
(${
column
.
dictType
}
!=
''
)
//
$
comment
字典
${
column
.
javaField
}
Options
:
[],
#
elseif
($
column
.
htmlType
==
"datetime"
&&
$
column
.
queryType
==
"BETWEEN"
)
#
if
($
column
.
htmlType
==
"datetime"
&&
$
column
.
queryType
==
"BETWEEN"
)
#
set
($
AttrName
=
$
column
.
javaField
.
substring
(
0
,
1
).
toUpperCase
()
+
${
column
.
javaField
.
substring
(
1
)})
//
$
comment
时间范围
daterange
${
AttrName
}:
[],
...
...
@@ -397,13 +391,6 @@ export default {
},
created
()
{
this
.
getList
();
#
foreach
($
column
in
$
columns
)
#
if
(${
column
.
dictType
}
!=
''
)
this
.
getDicts
(
"
${
column
.
dictType
}
"
).
then
(
response
=>
{
this
.${
column
.
javaField
}
Options
=
response
.
data
;
});
#
end
#
end
},
methods
:
{
/** 查询
${
functionName
}
列表 */
...
...
ruoyi-ui/src/components/DictData/index.js
0 → 100644
View file @
12ab8b03
import
Vue
from
'
vue
'
import
DataDict
from
'
@/utils/dict
'
import
{
getDicts
as
getDicts
}
from
'
@/api/system/dict/data
'
function
install
()
{
Vue
.
use
(
DataDict
,
{
metas
:
{
'
*
'
:
{
labelField
:
'
dictLabel
'
,
valueField
:
'
dictValue
'
,
request
(
dictMeta
)
{
return
getDicts
(
dictMeta
.
type
).
then
(
res
=>
res
.
data
)
},
},
},
})
}
export
default
{
install
,
}
\ No newline at end of file
ruoyi-ui/src/components/DictTag/index.vue
View file @
12ab8b03
<
template
>
<div>
<template
v-for=
"(item, index) in options"
>
<template
v-if=
"values.includes(item.
dictV
alue)"
>
<template
v-if=
"values.includes(item.
v
alue)"
>
<span
v-if=
"item.listClass == 'default' || item.listClass == ''"
:key=
"item.
dictV
alue"
v-if=
"item.
raw.
listClass == 'default' || item.
raw.
listClass == ''"
:key=
"item.
v
alue"
:index=
"index"
:class=
"item.cssClass"
>
{{
item
.
dictL
abel
}}
</span
:class=
"item.
raw.
cssClass"
>
{{
item
.
l
abel
}}
</span
>
<el-tag
v-else
:disable-transitions=
"true"
:key=
"item.
dictV
alue"
:key=
"item.
v
alue"
:index=
"index"
:type=
"item.listClass == 'primary' ? '' : item.listClass"
:class=
"item.cssClass"
:type=
"item.
raw.
listClass == 'primary' ? '' : item.
raw.
listClass"
:class=
"item.
raw.
cssClass"
>
{{
item
.
dictL
abel
}}
{{
item
.
l
abel
}}
</el-tag>
</
template
>
</template>
...
...
@@ -49,4 +49,4 @@ export default {
.el-tag
+
.el-tag
{
margin-left
:
10px
;
}
</
style
>
</
style
>
\ No newline at end of file
ruoyi-ui/src/main.js
View file @
12ab8b03
...
...
@@ -30,6 +30,8 @@ import ImageUpload from "@/components/ImageUpload"
import
DictTag
from
'
@/components/DictTag
'
// 头部标签组件
import
VueMeta
from
'
vue-meta
'
// 字典数据组件
import
DictData
from
'
@/components/DictData
'
// 全局方法挂载
Vue
.
prototype
.
getDicts
=
getDicts
...
...
@@ -64,6 +66,7 @@ Vue.component('ImageUpload', ImageUpload)
Vue
.
use
(
directive
)
Vue
.
use
(
VueMeta
)
DictData
.
install
()
/**
* If you don't want to use mock-server
...
...
ruoyi-ui/src/utils/dict/Dict.js
0 → 100644
View file @
12ab8b03
import
Vue
from
'
vue
'
import
{
mergeRecursive
}
from
"
@/utils/ruoyi
"
;
import
DictMeta
from
'
./DictMeta
'
import
DictData
from
'
./DictData
'
const
DEFAULT_DICT_OPTIONS
=
{
types
:
[],
}
/**
* @classdesc 字典
* @property {Object} label 标签对象,内部属性名为字典类型名称
* @property {Object} dict 字段数组,内部属性名为字典类型名称
* @property {Array.<DictMeta>} _dictMetas 字典元数据数组
*/
export
default
class
Dict
{
constructor
()
{
this
.
owner
=
null
this
.
label
=
{}
this
.
type
=
{}
}
init
(
options
)
{
if
(
options
instanceof
Array
)
{
options
=
{
types
:
options
}
}
const
opts
=
mergeRecursive
(
DEFAULT_DICT_OPTIONS
,
options
)
if
(
opts
.
types
===
undefined
)
{
throw
new
Error
(
'
need dict types
'
)
}
const
ps
=
[]
this
.
_dictMetas
=
opts
.
types
.
map
(
t
=>
DictMeta
.
parse
(
t
))
this
.
_dictMetas
.
forEach
(
dictMeta
=>
{
const
type
=
dictMeta
.
type
Vue
.
set
(
this
.
label
,
type
,
{})
Vue
.
set
(
this
.
type
,
type
,
[])
if
(
dictMeta
.
lazy
)
{
return
}
ps
.
push
(
loadDict
(
this
,
dictMeta
))
})
return
Promise
.
all
(
ps
)
}
/**
* 重新加载字典
* @param {String} type 字典类型
*/
reloadDict
(
type
)
{
const
dictMeta
=
this
.
_dictMetas
.
find
(
e
=>
e
.
type
===
type
)
if
(
dictMeta
===
undefined
)
{
return
Promise
.
reject
(
`the dict meta of
${
type
}
was not found`
)
}
return
loadDict
(
this
,
dictMeta
)
}
}
/**
* 加载字典
* @param {Dict} dict 字典
* @param {DictMeta} dictMeta 字典元数据
* @returns {Promise}
*/
function
loadDict
(
dict
,
dictMeta
)
{
return
dictMeta
.
request
(
dictMeta
)
.
then
(
response
=>
{
const
type
=
dictMeta
.
type
let
dicts
=
dictMeta
.
responseConverter
(
response
,
dictMeta
)
if
(
!
(
dicts
instanceof
Array
))
{
console
.
error
(
'
the return of responseConverter must be Array.<DictData>
'
)
dicts
=
[]
}
else
if
(
dicts
.
filter
(
d
=>
d
instanceof
DictData
).
length
!==
dicts
.
length
)
{
console
.
error
(
'
the type of elements in dicts must be DictData
'
)
dicts
=
[]
}
dict
.
type
[
type
].
splice
(
0
,
Number
.
MAX_SAFE_INTEGER
,
...
dicts
)
dicts
.
forEach
(
d
=>
{
Vue
.
set
(
dict
.
label
[
type
],
d
.
value
,
d
.
label
)
})
return
dicts
})
}
ruoyi-ui/src/utils/dict/DictConverter.js
0 → 100644
View file @
12ab8b03
import
DictOptions
from
'
./DictOptions
'
import
DictData
from
'
./DictData
'
export
default
function
(
dict
,
dictMeta
)
{
const
label
=
determineDictField
(
dict
,
dictMeta
.
labelField
,
...
DictOptions
.
DEFAULT_LABEL_FIELDS
)
const
value
=
determineDictField
(
dict
,
dictMeta
.
valueField
,
...
DictOptions
.
DEFAULT_VALUE_FIELDS
)
return
new
DictData
(
dict
[
label
],
dict
[
value
],
dict
)
}
/**
* 确定字典字段
* @param {DictData} dict
* @param {...String} fields
*/
function
determineDictField
(
dict
,
...
fields
)
{
return
fields
.
find
(
f
=>
Object
.
prototype
.
hasOwnProperty
.
call
(
dict
,
f
))
}
ruoyi-ui/src/utils/dict/DictData.js
0 → 100644
View file @
12ab8b03
/**
* @classdesc 字典数据
* @property {String} label 标签
* @property {*} value 标签
* @property {Object} raw 原始数据
*/
export
default
class
DictData
{
constructor
(
label
,
value
,
raw
)
{
this
.
label
=
label
this
.
value
=
value
this
.
raw
=
raw
}
}
ruoyi-ui/src/utils/dict/DictMeta.js
0 → 100644
View file @
12ab8b03
import
{
mergeRecursive
}
from
"
@/utils/ruoyi
"
;
import
DictOptions
from
'
./DictOptions
'
/**
* @classdesc 字典元数据
* @property {String} type 类型
* @property {Function} request 请求
* @property {String} label 标签字段
* @property {String} value 值字段
*/
export
default
class
DictMeta
{
constructor
(
options
)
{
this
.
type
=
options
.
type
this
.
request
=
options
.
request
,
this
.
responseConverter
=
options
.
responseConverter
this
.
labelField
=
options
.
labelField
this
.
valueField
=
options
.
valueField
this
.
lazy
=
options
.
lazy
===
true
}
}
/**
* 解析字典元数据
* @param {Object} options
* @returns {DictMeta}
*/
DictMeta
.
parse
=
function
(
options
)
{
let
opts
=
null
if
(
typeof
options
===
'
string
'
)
{
opts
=
DictOptions
.
metas
[
options
]
||
{}
opts
.
type
=
options
}
else
if
(
typeof
options
===
'
object
'
)
{
opts
=
options
}
opts
=
mergeRecursive
(
DictOptions
.
metas
[
'
*
'
],
opts
)
return
new
DictMeta
(
opts
)
}
ruoyi-ui/src/utils/dict/DictOptions.js
0 → 100644
View file @
12ab8b03
import
{
mergeRecursive
}
from
"
@/utils/ruoyi
"
;
import
dictConverter
from
'
./DictConverter
'
export
const
options
=
{
metas
:
{
'
*
'
:
{
/**
* 字典请求,方法签名为function(dictMeta: DictMeta): Promise
*/
request
:
(
dictMeta
)
=>
{
console
.
log
(
`load dict
${
dictMeta
.
type
}
`
)
return
Promise
.
resolve
([])
},
/**
* 字典响应数据转换器,方法签名为function(response: Object, dictMeta: DictMeta): DictData
*/
responseConverter
,
labelField
:
'
label
'
,
valueField
:
'
value
'
,
},
},
/**
* 默认标签字段
*/
DEFAULT_LABEL_FIELDS
:
[
'
label
'
,
'
name
'
,
'
title
'
],
/**
* 默认值字段
*/
DEFAULT_VALUE_FIELDS
:
[
'
value
'
,
'
id
'
,
'
uid
'
,
'
key
'
],
}
/**
* 映射字典
* @param {Object} response 字典数据
* @param {DictMeta} dictMeta 字典元数据
* @returns {DictData}
*/
function
responseConverter
(
response
,
dictMeta
)
{
const
dicts
=
response
.
content
instanceof
Array
?
response
.
content
:
response
if
(
dicts
===
undefined
)
{
console
.
warn
(
`no dict data of "
${
dictMeta
.
type
}
" found in the response`
)
return
[]
}
return
dicts
.
map
(
d
=>
dictConverter
(
d
,
dictMeta
))
}
export
function
mergeOptions
(
src
)
{
mergeRecursive
(
options
,
src
)
}
export
default
options
ruoyi-ui/src/utils/dict/index.js
0 → 100644
View file @
12ab8b03
import
Dict
from
'
./Dict
'
import
{
mergeOptions
}
from
'
./DictOptions
'
export
default
function
(
Vue
,
options
)
{
mergeOptions
(
options
)
Vue
.
mixin
({
data
()
{
if
(
this
.
$options
.
dicts
===
undefined
||
this
.
$options
.
dicts
===
null
)
{
return
{}
}
const
dict
=
new
Dict
()
dict
.
owner
=
this
return
{
dict
}
},
created
()
{
if
(
!
(
this
.
dict
instanceof
Dict
))
{
return
}
options
.
onCreated
&&
options
.
onCreated
(
this
.
dict
)
this
.
dict
.
init
(
this
.
$options
.
dicts
).
then
(()
=>
{
options
.
onReady
&&
options
.
onReady
(
this
.
dict
)
this
.
$nextTick
(()
=>
{
this
.
$emit
(
'
dictReady
'
,
this
.
dict
)
if
(
this
.
$options
.
methods
&&
this
.
$options
.
methods
.
onDictReady
instanceof
Function
)
{
this
.
$options
.
methods
.
onDictReady
.
call
(
this
,
this
.
dict
)
}
})
})
},
})
}
ruoyi-ui/src/utils/ruoyi.js
View file @
12ab8b03
...
...
@@ -72,8 +72,8 @@ export function addDateRange(params, dateRange, propName) {
export
function
selectDictLabel
(
datas
,
value
)
{
var
actions
=
[];
Object
.
keys
(
datas
).
some
((
key
)
=>
{
if
(
datas
[
key
].
dictV
alue
==
(
''
+
value
))
{
actions
.
push
(
datas
[
key
].
dictL
abel
);
if
(
datas
[
key
].
v
alue
==
(
''
+
value
))
{
actions
.
push
(
datas
[
key
].
l
abel
);
return
true
;
}
})
...
...
@@ -122,6 +122,22 @@ export function praseStrEmpty(str) {
return
str
;
}
// 数据合并
export
function
mergeRecursive
(
source
,
target
)
{
for
(
var
p
in
target
)
{
try
{
if
(
target
[
p
].
constructor
==
Object
)
{
source
[
p
]
=
mergeRecursive
(
source
[
p
],
target
[
p
]);
}
else
{
source
[
p
]
=
target
[
p
];
}
}
catch
(
e
)
{
source
[
p
]
=
target
[
p
];
}
}
return
source
;
};
/**
* 构造树型结构数据
* @param {*} data 数据源
...
...
ruoyi-ui/src/views/monitor/job/index.vue
View file @
12ab8b03
...
...
@@ -13,20 +13,20 @@
<el-form-item
label=
"任务组名"
prop=
"jobGroup"
>
<el-select
v-model=
"queryParams.jobGroup"
placeholder=
"请选择任务组名"
clearable
size=
"small"
>
<el-option
v-for=
"dict in job
G
roup
Options
"
:key=
"dict.
dictV
alue"
:label=
"dict.
dictL
abel"
:value=
"dict.
dictV
alue"
v-for=
"dict in
dict.type.sys_
job
_g
roup"
:key=
"dict.
v
alue"
:label=
"dict.
l
abel"
:value=
"dict.
v
alue"
/>
</el-select>
</el-form-item>
<el-form-item
label=
"任务状态"
prop=
"status"
>
<el-select
v-model=
"queryParams.status"
placeholder=
"请选择任务状态"
clearable
size=
"small"
>
<el-option
v-for=
"dict in
statusOption
s"
:key=
"dict.
dictV
alue"
:label=
"dict.
dictL
abel"
:value=
"dict.
dictV
alue"
v-for=
"dict in
dict.type.sys_job_statu
s"
:key=
"dict.
v
alue"
:label=
"dict.
l
abel"
:value=
"dict.
v
alue"
/>
</el-select>
</el-form-item>
...
...
@@ -99,7 +99,7 @@
<el-table-column
label=
"任务名称"
align=
"center"
prop=
"jobName"
:show-overflow-tooltip=
"true"
/>
<el-table-column
label=
"任务组名"
align=
"center"
prop=
"jobGroup"
>
<template
slot-scope=
"scope"
>
<dict-tag
:options=
"job
G
roup
Options
"
:value=
"scope.row.jobGroup"
/>
<dict-tag
:options=
"
dict.type.sys_
job
_g
roup"
:value=
"scope.row.jobGroup"
/>
</
template
>
</el-table-column>
<el-table-column
label=
"调用目标字符串"
align=
"center"
prop=
"invokeTarget"
:show-overflow-tooltip=
"true"
/>
...
...
@@ -168,10 +168,10 @@
<el-form-item
label=
"任务分组"
prop=
"jobGroup"
>
<el-select
v-model=
"form.jobGroup"
placeholder=
"请选择"
>
<el-option
v-for=
"dict in job
G
roup
Options
"
:key=
"dict.
dictV
alue"
:label=
"dict.
dictL
abel"
:value=
"dict.
dictV
alue"
v-for=
"dict in
dict.type.sys_
job
_g
roup"
:key=
"dict.
v
alue"
:label=
"dict.
l
abel"
:value=
"dict.
v
alue"
></el-option>
</el-select>
</el-form-item>
...
...
@@ -225,10 +225,10 @@
<el-form-item
label=
"状态"
>
<el-radio-group
v-model=
"form.status"
>
<el-radio
v-for=
"dict in
statusOption
s"
:key=
"dict.
dictV
alue"
:label=
"dict.
dictV
alue"
>
{{dict.
dictL
abel}}
</el-radio>
v-for=
"dict in
dict.type.sys_job_statu
s"
:key=
"dict.
v
alue"
:label=
"dict.
v
alue"
>
{{dict.
l
abel}}
</el-radio>
</el-radio-group>
</el-form-item>
</el-col>
...
...
@@ -301,6 +301,7 @@ import Crontab from '@/components/Crontab'
export
default
{
components
:
{
Crontab
},
name
:
"
Job
"
,
dicts
:
[
'
sys_job_group
'
,
'
sys_job_status
'
],
data
()
{
return
{
// 遮罩层
...
...
@@ -329,10 +330,6 @@ export default {
openCron
:
false
,
// 传入的表达式
expression
:
""
,
// 任务组名字典
jobGroupOptions
:
[],
// 状态字典
statusOptions
:
[],
// 查询参数
queryParams
:
{
pageNum
:
1
,
...
...
@@ -359,12 +356,6 @@ export default {
},
created
()
{
this
.
getList
();
this
.
getDicts
(
"
sys_job_group
"
).
then
(
response
=>
{
this
.
jobGroupOptions
=
response
.
data
;
});
this
.
getDicts
(
"
sys_job_status
"
).
then
(
response
=>
{
this
.
statusOptions
=
response
.
data
;
});
},
methods
:
{
/** 查询定时任务列表 */
...
...
@@ -378,7 +369,7 @@ export default {
},
// 任务组名字典翻译
jobGroupFormat
(
row
,
column
)
{
return
this
.
selectDictLabel
(
this
.
job
G
roup
Options
,
row
.
jobGroup
);
return
this
.
selectDictLabel
(
this
.
dict
.
type
.
sys_
job
_g
roup
,
row
.
jobGroup
);
},
// 取消按钮
cancel
()
{
...
...
ruoyi-ui/src/views/monitor/job/log.vue
View file @
12ab8b03
...
...
@@ -20,10 +20,10 @@
style=
"width: 240px"
>
<el-option
v-for=
"dict in job
G
roup
Options
"
:key=
"dict.
dictV
alue"
:label=
"dict.
dictL
abel"
:value=
"dict.
dictV
alue"
v-for=
"dict in
dict.type.sys_
job
_g
roup"
:key=
"dict.
v
alue"
:label=
"dict.
l
abel"
:value=
"dict.
v
alue"
/>
</el-select>
</el-form-item>
...
...
@@ -36,10 +36,10 @@
style=
"width: 240px"
>
<el-option
v-for=
"dict in
statusOption
s"
:key=
"dict.
dictV
alue"
:label=
"dict.
dictL
abel"
:value=
"dict.
dictV
alue"
v-for=
"dict in
dict.type.sys_common_statu
s"
:key=
"dict.
v
alue"
:label=
"dict.
l
abel"
:value=
"dict.
v
alue"
/>
</el-select>
</el-form-item>
...
...
@@ -112,14 +112,14 @@
<el-table-column
label=
"任务名称"
align=
"center"
prop=
"jobName"
:show-overflow-tooltip=
"true"
/>
<el-table-column
label=
"任务组名"
align=
"center"
prop=
"jobGroup"
:show-overflow-tooltip=
"true"
>
<template
slot-scope=
"scope"
>
<dict-tag
:options=
"job
G
roup
Options
"
:value=
"scope.row.jobGroup"
/>
<dict-tag
:options=
"
dict.type.sys_
job
_g
roup"
:value=
"scope.row.jobGroup"
/>
</
template
>
</el-table-column>
<el-table-column
label=
"调用目标字符串"
align=
"center"
prop=
"invokeTarget"
:show-overflow-tooltip=
"true"
/>
<el-table-column
label=
"日志信息"
align=
"center"
prop=
"jobMessage"
:show-overflow-tooltip=
"true"
/>
<el-table-column
label=
"执行状态"
align=
"center"
prop=
"status"
>
<
template
slot-scope=
"scope"
>
<dict-tag
:options=
"
statusOption
s"
:value=
"scope.row.status"
/>
<dict-tag
:options=
"
dict.type.sys_common_statu
s"
:value=
"scope.row.status"
/>
</
template
>
</el-table-column>
<el-table-column
label=
"执行时间"
align=
"center"
prop=
"createTime"
width=
"180"
>
...
...
@@ -190,6 +190,7 @@ import { listJobLog, delJobLog, exportJobLog, cleanJobLog } from "@/api/monitor/
export
default
{
name
:
"
JobLog
"
,
dicts
:
[
'
sys_common_status
'
,
'
sys_job_group
'
],
data
()
{
return
{
// 遮罩层
...
...
@@ -212,10 +213,6 @@ export default {
dateRange
:
[],
// 表单参数
form
:
{},
// 执行状态字典
statusOptions
:
[],
// 任务组名字典
jobGroupOptions
:
[],
// 查询参数
queryParams
:
{
pageNum
:
1
,
...
...
@@ -237,12 +234,6 @@ export default {
}
else
{
this
.
getList
();
}
this
.
getDicts
(
"
sys_common_status
"
).
then
(
response
=>
{
this
.
statusOptions
=
response
.
data
;
});
this
.
getDicts
(
"
sys_job_group
"
).
then
(
response
=>
{
this
.
jobGroupOptions
=
response
.
data
;
});
},
methods
:
{
/** 查询调度日志列表 */
...
...
ruoyi-ui/src/views/monitor/logininfor/index.vue
View file @
12ab8b03
...
...
@@ -30,10 +30,10 @@
style=
"width: 240px"
>
<el-option
v-for=
"dict in
statusOption
s"
:key=
"dict.
dictV
alue"
:label=
"dict.
dictL
abel"
:value=
"dict.
dictV
alue"
v-for=
"dict in
dict.type.sys_common_statu
s"
:key=
"dict.
v
alue"
:label=
"dict.
l
abel"
:value=
"dict.
v
alue"
/>
</el-select>
</el-form-item>
...
...
@@ -101,7 +101,7 @@
<el-table-column
label=
"操作系统"
align=
"center"
prop=
"os"
/>
<el-table-column
label=
"登录状态"
align=
"center"
prop=
"status"
>
<template
slot-scope=
"scope"
>
<dict-tag
:options=
"
statusOption
s"
:value=
"scope.row.status"
/>
<dict-tag
:options=
"
dict.type.sys_common_statu
s"
:value=
"scope.row.status"
/>
</
template
>
</el-table-column>
<el-table-column
label=
"操作信息"
align=
"center"
prop=
"msg"
/>
...
...
@@ -127,6 +127,7 @@ import { list, delLogininfor, cleanLogininfor, exportLogininfor } from "@/api/mo
export
default
{
name
:
"
Logininfor
"
,
dicts
:
[
'
sys_common_status
'
],
data
()
{
return
{
// 遮罩层
...
...
@@ -143,8 +144,6 @@ export default {
total
:
0
,
// 表格数据
list
:
[],
// 状态数据字典
statusOptions
:
[],
// 日期范围
dateRange
:
[],
// 默认排序
...
...
@@ -161,9 +160,6 @@ export default {
},
created
()
{
this
.
getList
();
this
.
getDicts
(
"
sys_common_status
"
).
then
(
response
=>
{
this
.
statusOptions
=
response
.
data
;
});
},
methods
:
{
/** 查询登录日志列表 */
...
...
ruoyi-ui/src/views/monitor/operlog/index.vue
View file @
12ab8b03
...
...
@@ -30,10 +30,10 @@
style=
"width: 240px"
>
<el-option
v-for=
"dict in
typeOptions
"
:key=
"dict.
dictV
alue"
:label=
"dict.
dictL
abel"
:value=
"dict.
dictV
alue"
v-for=
"dict in
dict.type.sys_oper_type
"
:key=
"dict.
v
alue"
:label=
"dict.
l
abel"
:value=
"dict.
v
alue"
/>
</el-select>
</el-form-item>
...
...
@@ -46,10 +46,10 @@
style=
"width: 240px"
>
<el-option
v-for=
"dict in
statusOption
s"
:key=
"dict.
dictV
alue"
:label=
"dict.
dictL
abel"
:value=
"dict.
dictV
alue"
v-for=
"dict in
dict.type.sys_common_statu
s"
:key=
"dict.
v
alue"
:label=
"dict.
l
abel"
:value=
"dict.
v
alue"
/>
</el-select>
</el-form-item>
...
...
@@ -113,7 +113,7 @@
<el-table-column
label=
"系统模块"
align=
"center"
prop=
"title"
/>
<el-table-column
label=
"操作类型"
align=
"center"
prop=
"businessType"
>
<template
slot-scope=
"scope"
>
<dict-tag
:options=
"
typeOptions
"
:value=
"scope.row.businessType"
/>
<dict-tag
:options=
"
dict.type.sys_oper_type
"
:value=
"scope.row.businessType"
/>
</
template
>
</el-table-column>
<el-table-column
label=
"请求方式"
align=
"center"
prop=
"requestMethod"
/>
...
...
@@ -122,7 +122,7 @@
<el-table-column
label=
"操作地点"
align=
"center"
prop=
"operLocation"
:show-overflow-tooltip=
"true"
/>
<el-table-column
label=
"操作状态"
align=
"center"
prop=
"status"
>
<
template
slot-scope=
"scope"
>
<dict-tag
:options=
"
statusOption
s"
:value=
"scope.row.status"
/>
<dict-tag
:options=
"
dict.type.sys_common_statu
s"
:value=
"scope.row.status"
/>
</
template
>
</el-table-column>
<el-table-column
label=
"操作日期"
align=
"center"
prop=
"operTime"
sortable=
"custom"
:sort-orders=
"['descending', 'ascending']"
width=
"180"
>
...
...
@@ -200,6 +200,7 @@ import { list, delOperlog, cleanOperlog, exportOperlog } from "@/api/monitor/ope
export
default
{
name
:
"
Operlog
"
,
dicts
:
[
'
sys_oper_type
'
,
'
sys_common_status
'
],
data
()
{
return
{
// 遮罩层
...
...
@@ -218,10 +219,6 @@ export default {
list
:
[],
// 是否显示弹出层
open
:
false
,
// 类型数据字典
typeOptions
:
[],
// 类型数据字典
statusOptions
:
[],
// 日期范围
dateRange
:
[],
// 默认排序
...
...
@@ -241,12 +238,6 @@ export default {
},
created
()
{
this
.
getList
();
this
.
getDicts
(
"
sys_oper_type
"
).
then
(
response
=>
{
this
.
typeOptions
=
response
.
data
;
});
this
.
getDicts
(
"
sys_common_status
"
).
then
(
response
=>
{
this
.
statusOptions
=
response
.
data
;
});
},
methods
:
{
/** 查询登录日志 */
...
...
@@ -261,7 +252,7 @@ export default {
},
// 操作日志类型字典翻译
typeFormat
(
row
,
column
)
{
return
this
.
selectDictLabel
(
this
.
typeOptions
,
row
.
businessType
);
return
this
.
selectDictLabel
(
this
.
dict
.
type
.
sys_oper_type
,
row
.
businessType
);
},
/** 搜索按钮操作 */
handleQuery
()
{
...
...
ruoyi-ui/src/views/system/config/index.vue
View file @
12ab8b03
...
...
@@ -24,10 +24,10 @@
<el-form-item
label=
"系统内置"
prop=
"configType"
>
<el-select
v-model=
"queryParams.configType"
placeholder=
"系统内置"
clearable
size=
"small"
>
<el-option
v-for=
"dict in
typeOptions
"
:key=
"dict.
dictV
alue"
:label=
"dict.
dictL
abel"
:value=
"dict.
dictV
alue"
v-for=
"dict in
dict.type.sys_yes_no
"
:key=
"dict.
v
alue"
:label=
"dict.
l
abel"
:value=
"dict.
v
alue"
/>
</el-select>
</el-form-item>
...
...
@@ -114,7 +114,7 @@
<el-table-column
label=
"参数键值"
align=
"center"
prop=
"configValue"
/>
<el-table-column
label=
"系统内置"
align=
"center"
prop=
"configType"
>
<template
slot-scope=
"scope"
>
<dict-tag
:options=
"
typeOptions
"
:value=
"scope.row.configType"
/>
<dict-tag
:options=
"
dict.type.sys_yes_no
"
:value=
"scope.row.configType"
/>
</
template
>
</el-table-column>
<el-table-column
label=
"备注"
align=
"center"
prop=
"remark"
:show-overflow-tooltip=
"true"
/>
...
...
@@ -166,10 +166,10 @@
<el-form-item
label=
"系统内置"
prop=
"configType"
>
<el-radio-group
v-model=
"form.configType"
>
<el-radio
v-for=
"dict in
typeOptions
"
:key=
"dict.
dictV
alue"
:label=
"dict.
dictV
alue"
>
{{dict.
dictL
abel}}
</el-radio>
v-for=
"dict in
dict.type.sys_yes_no
"
:key=
"dict.
v
alue"
:label=
"dict.
v
alue"
>
{{dict.
l
abel}}
</el-radio>
</el-radio-group>
</el-form-item>
<el-form-item
label=
"备注"
prop=
"remark"
>
...
...
@@ -189,6 +189,7 @@ import { listConfig, getConfig, delConfig, addConfig, updateConfig, exportConfig
export
default
{
name
:
"
Config
"
,
dicts
:
[
'
sys_yes_no
'
],
data
()
{
return
{
// 遮罩层
...
...
@@ -211,8 +212,6 @@ export default {
title
:
""
,
// 是否显示弹出层
open
:
false
,
// 类型数据字典
typeOptions
:
[],
// 日期范围
dateRange
:
[],
// 查询参数
...
...
@@ -241,9 +240,6 @@ export default {
},
created
()
{
this
.
getList
();
this
.
getDicts
(
"
sys_yes_no
"
).
then
(
response
=>
{
this
.
typeOptions
=
response
.
data
;
});
},
methods
:
{
/** 查询参数列表 */
...
...
ruoyi-ui/src/views/system/dept/index.vue
View file @
12ab8b03
...
...
@@ -13,10 +13,10 @@
<el-form-item
label=
"状态"
prop=
"status"
>
<el-select
v-model=
"queryParams.status"
placeholder=
"部门状态"
clearable
size=
"small"
>
<el-option
v-for=
"dict in
statusOptions
"
:key=
"dict.
dictV
alue"
:label=
"dict.
dictL
abel"
:value=
"dict.
dictV
alue"
v-for=
"dict in
dict.type.sys_normal_disable
"
:key=
"dict.
v
alue"
:label=
"dict.
l
abel"
:value=
"dict.
v
alue"
/>
</el-select>
</el-form-item>
...
...
@@ -61,7 +61,7 @@
<el-table-column
prop=
"orderNum"
label=
"排序"
width=
"200"
></el-table-column>
<el-table-column
prop=
"status"
label=
"状态"
width=
"100"
>
<template
slot-scope=
"scope"
>
<dict-tag
:options=
"
statusOptions
"
:value=
"scope.row.status"
/>
<dict-tag
:options=
"
dict.type.sys_normal_disable
"
:value=
"scope.row.status"
/>
</
template
>
</el-table-column>
<el-table-column
label=
"创建时间"
align=
"center"
prop=
"createTime"
width=
"200"
>
...
...
@@ -135,10 +135,10 @@
<el-form-item
label=
"部门状态"
>
<el-radio-group
v-model=
"form.status"
>
<el-radio
v-for=
"dict in
statusOptions
"
:key=
"dict.
dictV
alue"
:label=
"dict.
dictV
alue"
>
{{dict.
dictL
abel}}
</el-radio>
v-for=
"dict in
dict.type.sys_normal_disable
"
:key=
"dict.
v
alue"
:label=
"dict.
v
alue"
>
{{dict.
l
abel}}
</el-radio>
</el-radio-group>
</el-form-item>
</el-col>
...
...
@@ -159,6 +159,7 @@ import "@riophae/vue-treeselect/dist/vue-treeselect.css";
export
default
{
name
:
"
Dept
"
,
dicts
:
[
'
sys_normal_disable
'
],
components
:
{
Treeselect
},
data
()
{
return
{
...
...
@@ -180,8 +181,6 @@ export default {
refreshTable
:
true
,
// 是否展开
expand
:
false
,
// 状态数据字典
statusOptions
:
[],
// 查询参数
queryParams
:
{
deptName
:
undefined
,
...
...
@@ -219,9 +218,6 @@ export default {
},
created
()
{
this
.
getList
();
this
.
getDicts
(
"
sys_normal_disable
"
).
then
(
response
=>
{
this
.
statusOptions
=
response
.
data
;
});
},
methods
:
{
/** 查询部门列表 */
...
...
ruoyi-ui/src/views/system/dict/data.vue
View file @
12ab8b03
...
...
@@ -23,10 +23,10 @@
<el-form-item
label=
"状态"
prop=
"status"
>
<el-select
v-model=
"queryParams.status"
placeholder=
"数据状态"
clearable
size=
"small"
>
<el-option
v-for=
"dict in
statusOptions
"
:key=
"dict.
dictV
alue"
:label=
"dict.
dictL
abel"
:value=
"dict.
dictV
alue"
v-for=
"dict in
dict.type.sys_normal_disable
"
:key=
"dict.
v
alue"
:label=
"dict.
l
abel"
:value=
"dict.
v
alue"
/>
</el-select>
</el-form-item>
...
...
@@ -96,7 +96,7 @@
<el-table-column
label=
"字典排序"
align=
"center"
prop=
"dictSort"
/>
<el-table-column
label=
"状态"
align=
"center"
prop=
"status"
>
<
template
slot-scope=
"scope"
>
<dict-tag
:options=
"
statusOptions
"
:value=
"scope.row.status"
/>
<dict-tag
:options=
"
dict.type.sys_normal_disable
"
:value=
"scope.row.status"
/>
</
template
>
</el-table-column>
<el-table-column
label=
"备注"
align=
"center"
prop=
"remark"
:show-overflow-tooltip=
"true"
/>
...
...
@@ -164,10 +164,10 @@
<el-form-item
label=
"状态"
prop=
"status"
>
<el-radio-group
v-model=
"form.status"
>
<el-radio
v-for=
"dict in
statusOptions
"
:key=
"dict.
dictV
alue"
:label=
"dict.
dictV
alue"
>
{{dict.
dictL
abel}}
</el-radio>
v-for=
"dict in
dict.type.sys_normal_disable
"
:key=
"dict.
v
alue"
:label=
"dict.
v
alue"
>
{{dict.
l
abel}}
</el-radio>
</el-radio-group>
</el-form-item>
<el-form-item
label=
"备注"
prop=
"remark"
>
...
...
@@ -188,6 +188,7 @@ import { listType, getType } from "@/api/system/dict/type";
export
default
{
name
:
"
Data
"
,
dicts
:
[
'
sys_normal_disable
'
],
data
()
{
return
{
// 遮罩层
...
...
@@ -239,8 +240,6 @@ export default {
label
:
"
危险
"
}
],
// 状态数据字典
statusOptions
:
[],
// 类型数据字典
typeOptions
:
[],
// 查询参数
...
...
@@ -271,9 +270,6 @@ export default {
const
dictId
=
this
.
$route
.
params
&&
this
.
$route
.
params
.
dictId
;
this
.
getType
(
dictId
);
this
.
getTypeList
();
this
.
getDicts
(
"
sys_normal_disable
"
).
then
(
response
=>
{
this
.
statusOptions
=
response
.
data
;
});
},
methods
:
{
/** 查询字典类型详细 */
...
...
Prev
1
2
Next
Write
Preview
Supports
Markdown
0%
Try again
or
attach a new file
.
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment