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
cb0a4b78
Commit
cb0a4b78
authored
Feb 24, 2020
by
RuoYi
Browse files
若依 2.1
parent
46a16952
Changes
61
Hide whitespace changes
Inline
Side-by-side
ruoyi-ui/src/assets/icons/svg/time.svg
0 → 100644
View file @
cb0a4b78
<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<svg
t=
"1577099827399"
class=
"icon"
viewBox=
"0 0 1024 1024"
version=
"1.1"
xmlns=
"http://www.w3.org/2000/svg"
p-id=
"1008"
xmlns:xlink=
"http://www.w3.org/1999/xlink"
width=
"81"
height=
"81"
><defs><style
type=
"text/css"
></style></defs><path
d=
"M520 559h204c17.673 0 32 14.327 32 32 0 17.673-14.327 32-32 32H488c-17.673 0-32-14.327-32-32 0-0.167 0.001-0.334 0.004-0.5a32.65 32.65 0 0 1-0.004-0.5V277c0-17.673 14.327-32 32-32 17.673 0 32 14.327 32 32v282z m-8 401C264.576 960 64 759.424 64 512S264.576 64 512 64s448 200.576 448 448-200.576 448-448 448z m0-64c212.077 0 384-171.923 384-384S724.077 128 512 128 128 299.923 128 512s171.923 384 384 384z"
p-id=
"1009"
></path></svg>
\ No newline at end of file
ruoyi-ui/src/assets/icons/svg/upload.svg
0 → 100644
View file @
cb0a4b78
<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<svg
t=
"1577540289643"
class=
"icon"
viewBox=
"0 0 1024 1024"
version=
"1.1"
xmlns=
"http://www.w3.org/2000/svg"
p-id=
"7922"
xmlns:xlink=
"http://www.w3.org/1999/xlink"
width=
"200"
height=
"200"
><defs><style
type=
"text/css"
></style></defs><path
d=
"M530.944 458.24l4.8 3.456 122.176 106.816a32 32 0 0 1-37.44 51.584l-4.672-3.392L546.56 556.16v280.704a32 32 0 0 1-26.24 31.488l-5.76 0.512a32 32 0 0 1-31.424-26.24l-0.512-5.76-0.064-280.704-69.12 60.48a32 32 0 0 1-40.96 0.896l-4.16-3.968a32 32 0 0 1-0.96-40.96l4.032-4.16 122.176-106.816a32 32 0 0 1 37.312-3.456zM497.92 128c128.128 0 239.168 82.304 275.52 199.04 123.968 11.264 221.312 113.088 221.312 237.44 0 128.128-103.68 232.96-234.88 238.272h-5.888l-35.52 0.192a32 32 0 0 1-0.192-64l35.264-0.128 4.672-0.064c96.384-3.84 172.544-80.896 172.544-174.272 0-96.128-80.512-174.464-179.584-174.464h-1.984a32 32 0 0 1-32-25.28C695.872 264.96 604.736 192 497.92 192 381.824 192 285.44 277.76 274.816 388.48a32 32 0 0 1-28.352 28.8c-83.968 9.152-147.84 78.208-147.84 159.552l0.192 7.936c3.84 85.76 77.056 154.112 166.592 154.112h45.632a32 32 0 0 1 0 64h-45.632C142.016 802.944 40.32 708.032 34.88 586.88l-0.192-9.28c0-106.88 76.352-197.184 179.968-219.904C239.488 226.112 357.76 128 497.856 128z"
p-id=
"7923"
></path></svg>
\ No newline at end of file
ruoyi-ui/src/components/RuoYi/Doc/index.vue
0 → 100644
View file @
cb0a4b78
<
template
>
<div>
<svg-icon
icon-class=
"question"
@
click=
"goto"
/>
</div>
</
template
>
<
script
>
export
default
{
name
:
'
RuoYiDoc
'
,
data
()
{
return
{
url
:
'
http://doc.ruoyi.vip/ruoyi-vue
'
}
},
methods
:
{
goto
()
{
window
.
open
(
this
.
url
)
}
}
}
</
script
>
\ No newline at end of file
ruoyi-ui/src/components/RuoYi/index.vue
→
ruoyi-ui/src/components/RuoYi/
Git/
index.vue
View file @
cb0a4b78
<
template
>
<div>
<svg-icon
icon-class=
"
download
"
@
click=
"
handleDownload
"
/>
<svg-icon
icon-class=
"
github
"
@
click=
"
goto
"
/>
</div>
</
template
>
<
script
>
export
default
{
name
:
'
RuoYi
'
,
name
:
'
RuoYi
Git
'
,
data
()
{
return
{
url
:
'
https://gitee.com/y_project/RuoYi-Vue
'
}
},
methods
:
{
handleDownload
()
{
goto
()
{
window
.
open
(
this
.
url
)
}
}
...
...
ruoyi-ui/src/layout/components/Navbar.vue
View file @
cb0a4b78
...
...
@@ -8,8 +8,12 @@
<template
v-if=
"device!=='mobile'"
>
<search
id=
"header-search"
class=
"right-menu-item"
/>
<el-tooltip
content=
"下载源码"
effect=
"dark"
placement=
"bottom"
>
<ruo-yi
id=
"ruoyi"
class=
"right-menu-item hover-effect"
/>
<el-tooltip
content=
"源码地址"
effect=
"dark"
placement=
"bottom"
>
<ruo-yi-git
id=
"ruoyi-git"
class=
"right-menu-item hover-effect"
/>
</el-tooltip>
<el-tooltip
content=
"文档地址"
effect=
"dark"
placement=
"bottom"
>
<ruo-yi-doc
id=
"ruoyi-doc"
class=
"right-menu-item hover-effect"
/>
</el-tooltip>
<screenfull
id=
"screenfull"
class=
"right-menu-item hover-effect"
/>
...
...
@@ -48,7 +52,8 @@ import Hamburger from '@/components/Hamburger'
import
Screenfull
from
'
@/components/Screenfull
'
import
SizeSelect
from
'
@/components/SizeSelect
'
import
Search
from
'
@/components/HeaderSearch
'
import
RuoYi
from
'
@/components/RuoYi
'
import
RuoYiGit
from
'
@/components/RuoYi/Git
'
import
RuoYiDoc
from
'
@/components/RuoYi/Doc
'
export
default
{
components
:
{
...
...
@@ -57,7 +62,8 @@ export default {
Screenfull
,
SizeSelect
,
Search
,
RuoYi
RuoYiGit
,
RuoYiDoc
},
computed
:
{
...
mapGetters
([
...
...
ruoyi-ui/src/main.js
View file @
cb0a4b78
...
...
@@ -18,7 +18,7 @@ import './assets/icons' // icon
import
'
./permission
'
// permission control
import
{
getDicts
}
from
"
@/api/system/dict/data
"
;
import
{
getConfigKey
}
from
"
@/api/system/config
"
;
import
{
parseTime
,
resetForm
,
addDateRange
,
selectDictLabel
,
download
}
from
"
@/utils/ruoyi
"
;
import
{
parseTime
,
resetForm
,
addDateRange
,
selectDictLabel
,
download
,
handleTree
}
from
"
@/utils/ruoyi
"
;
import
Pagination
from
"
@/components/Pagination
"
;
// 全局方法挂载
...
...
@@ -29,6 +29,7 @@ Vue.prototype.resetForm = resetForm
Vue
.
prototype
.
addDateRange
=
addDateRange
Vue
.
prototype
.
selectDictLabel
=
selectDictLabel
Vue
.
prototype
.
download
=
download
Vue
.
prototype
.
handleTree
=
handleTree
Vue
.
prototype
.
msgSuccess
=
function
(
msg
)
{
this
.
$message
({
showClose
:
true
,
message
:
msg
,
type
:
"
success
"
});
...
...
ruoyi-ui/src/utils/generator/config.js
0 → 100644
View file @
cb0a4b78
export
const
formConf
=
{
formRef
:
'
elForm
'
,
formModel
:
'
formData
'
,
size
:
'
medium
'
,
labelPosition
:
'
right
'
,
labelWidth
:
100
,
formRules
:
'
rules
'
,
gutter
:
15
,
disabled
:
false
,
span
:
24
,
formBtns
:
true
}
export
const
inputComponents
=
[
{
label
:
'
单行文本
'
,
tag
:
'
el-input
'
,
tagIcon
:
'
input
'
,
placeholder
:
'
请输入
'
,
defaultValue
:
undefined
,
span
:
24
,
labelWidth
:
null
,
style
:
{
width
:
'
100%
'
},
clearable
:
true
,
prepend
:
''
,
append
:
''
,
'
prefix-icon
'
:
''
,
'
suffix-icon
'
:
''
,
maxlength
:
null
,
'
show-word-limit
'
:
false
,
readonly
:
false
,
disabled
:
false
,
required
:
true
,
regList
:
[],
changeTag
:
true
,
document
:
'
https://element.eleme.cn/#/zh-CN/component/input
'
},
{
label
:
'
多行文本
'
,
tag
:
'
el-input
'
,
tagIcon
:
'
textarea
'
,
type
:
'
textarea
'
,
placeholder
:
'
请输入
'
,
defaultValue
:
undefined
,
span
:
24
,
labelWidth
:
null
,
autosize
:
{
minRows
:
4
,
maxRows
:
4
},
style
:
{
width
:
'
100%
'
},
maxlength
:
null
,
'
show-word-limit
'
:
false
,
readonly
:
false
,
disabled
:
false
,
required
:
true
,
regList
:
[],
changeTag
:
true
,
document
:
'
https://element.eleme.cn/#/zh-CN/component/input
'
},
{
label
:
'
密码
'
,
tag
:
'
el-input
'
,
tagIcon
:
'
password
'
,
placeholder
:
'
请输入
'
,
defaultValue
:
undefined
,
span
:
24
,
'
show-password
'
:
true
,
labelWidth
:
null
,
style
:
{
width
:
'
100%
'
},
clearable
:
true
,
prepend
:
''
,
append
:
''
,
'
prefix-icon
'
:
''
,
'
suffix-icon
'
:
''
,
maxlength
:
null
,
'
show-word-limit
'
:
false
,
readonly
:
false
,
disabled
:
false
,
required
:
true
,
regList
:
[],
changeTag
:
true
,
document
:
'
https://element.eleme.cn/#/zh-CN/component/input
'
},
{
label
:
'
计数器
'
,
tag
:
'
el-input-number
'
,
tagIcon
:
'
number
'
,
placeholder
:
''
,
defaultValue
:
undefined
,
span
:
24
,
labelWidth
:
null
,
min
:
undefined
,
max
:
undefined
,
step
:
undefined
,
'
step-strictly
'
:
false
,
precision
:
undefined
,
'
controls-position
'
:
''
,
disabled
:
false
,
required
:
true
,
regList
:
[],
changeTag
:
true
,
document
:
'
https://element.eleme.cn/#/zh-CN/component/input-number
'
}
]
export
const
selectComponents
=
[
{
label
:
'
下拉选择
'
,
tag
:
'
el-select
'
,
tagIcon
:
'
select
'
,
placeholder
:
'
请选择
'
,
defaultValue
:
undefined
,
span
:
24
,
labelWidth
:
null
,
style
:
{
width
:
'
100%
'
},
clearable
:
true
,
disabled
:
false
,
required
:
true
,
filterable
:
false
,
multiple
:
false
,
options
:
[{
label
:
'
选项一
'
,
value
:
1
},
{
label
:
'
选项二
'
,
value
:
2
}],
regList
:
[],
changeTag
:
true
,
document
:
'
https://element.eleme.cn/#/zh-CN/component/select
'
},
{
label
:
'
级联选择
'
,
tag
:
'
el-cascader
'
,
tagIcon
:
'
cascader
'
,
placeholder
:
'
请选择
'
,
defaultValue
:
[],
span
:
24
,
labelWidth
:
null
,
style
:
{
width
:
'
100%
'
},
props
:
{
props
:
{
multiple
:
false
}
},
'
show-all-levels
'
:
true
,
disabled
:
false
,
clearable
:
true
,
filterable
:
false
,
required
:
true
,
options
:
[{
id
:
1
,
value
:
1
,
label
:
'
选项1
'
,
children
:
[{
id
:
2
,
value
:
2
,
label
:
'
选项1-1
'
}]
}],
dataType
:
'
dynamic
'
,
labelKey
:
'
label
'
,
valueKey
:
'
value
'
,
childrenKey
:
'
children
'
,
separator
:
'
/
'
,
regList
:
[],
changeTag
:
true
,
document
:
'
https://element.eleme.cn/#/zh-CN/component/cascader
'
},
{
label
:
'
单选框组
'
,
tag
:
'
el-radio-group
'
,
tagIcon
:
'
radio
'
,
defaultValue
:
undefined
,
span
:
24
,
labelWidth
:
null
,
style
:
{},
optionType
:
'
default
'
,
border
:
false
,
size
:
'
medium
'
,
disabled
:
false
,
required
:
true
,
options
:
[{
label
:
'
选项一
'
,
value
:
1
},
{
label
:
'
选项二
'
,
value
:
2
}],
regList
:
[],
changeTag
:
true
,
document
:
'
https://element.eleme.cn/#/zh-CN/component/radio
'
},
{
label
:
'
多选框组
'
,
tag
:
'
el-checkbox-group
'
,
tagIcon
:
'
checkbox
'
,
defaultValue
:
[],
span
:
24
,
labelWidth
:
null
,
style
:
{},
optionType
:
'
default
'
,
border
:
false
,
size
:
'
medium
'
,
disabled
:
false
,
required
:
true
,
options
:
[{
label
:
'
选项一
'
,
value
:
1
},
{
label
:
'
选项二
'
,
value
:
2
}],
regList
:
[],
changeTag
:
true
,
document
:
'
https://element.eleme.cn/#/zh-CN/component/checkbox
'
},
{
label
:
'
开关
'
,
tag
:
'
el-switch
'
,
tagIcon
:
'
switch
'
,
defaultValue
:
false
,
span
:
24
,
labelWidth
:
null
,
style
:
{},
disabled
:
false
,
required
:
true
,
'
active-text
'
:
''
,
'
inactive-text
'
:
''
,
'
active-color
'
:
null
,
'
inactive-color
'
:
null
,
'
active-value
'
:
true
,
'
inactive-value
'
:
false
,
regList
:
[],
changeTag
:
true
,
document
:
'
https://element.eleme.cn/#/zh-CN/component/switch
'
},
{
label
:
'
滑块
'
,
tag
:
'
el-slider
'
,
tagIcon
:
'
slider
'
,
defaultValue
:
null
,
span
:
24
,
labelWidth
:
null
,
disabled
:
false
,
required
:
true
,
min
:
0
,
max
:
100
,
step
:
1
,
'
show-stops
'
:
false
,
range
:
false
,
regList
:
[],
changeTag
:
true
,
document
:
'
https://element.eleme.cn/#/zh-CN/component/slider
'
},
{
label
:
'
时间选择
'
,
tag
:
'
el-time-picker
'
,
tagIcon
:
'
time
'
,
placeholder
:
'
请选择
'
,
defaultValue
:
null
,
span
:
24
,
labelWidth
:
null
,
style
:
{
width
:
'
100%
'
},
disabled
:
false
,
clearable
:
true
,
required
:
true
,
'
picker-options
'
:
{
selectableRange
:
'
00:00:00-23:59:59
'
},
format
:
'
HH:mm:ss
'
,
'
value-format
'
:
'
HH:mm:ss
'
,
regList
:
[],
changeTag
:
true
,
document
:
'
https://element.eleme.cn/#/zh-CN/component/time-picker
'
},
{
label
:
'
时间范围
'
,
tag
:
'
el-time-picker
'
,
tagIcon
:
'
time-range
'
,
defaultValue
:
null
,
span
:
24
,
labelWidth
:
null
,
style
:
{
width
:
'
100%
'
},
disabled
:
false
,
clearable
:
true
,
required
:
true
,
'
is-range
'
:
true
,
'
range-separator
'
:
'
至
'
,
'
start-placeholder
'
:
'
开始时间
'
,
'
end-placeholder
'
:
'
结束时间
'
,
format
:
'
HH:mm:ss
'
,
'
value-format
'
:
'
HH:mm:ss
'
,
regList
:
[],
changeTag
:
true
,
document
:
'
https://element.eleme.cn/#/zh-CN/component/time-picker
'
},
{
label
:
'
日期选择
'
,
tag
:
'
el-date-picker
'
,
tagIcon
:
'
date
'
,
placeholder
:
'
请选择
'
,
defaultValue
:
null
,
type
:
'
date
'
,
span
:
24
,
labelWidth
:
null
,
style
:
{
width
:
'
100%
'
},
disabled
:
false
,
clearable
:
true
,
required
:
true
,
format
:
'
yyyy-MM-dd
'
,
'
value-format
'
:
'
yyyy-MM-dd
'
,
readonly
:
false
,
regList
:
[],
changeTag
:
true
,
document
:
'
https://element.eleme.cn/#/zh-CN/component/date-picker
'
},
{
label
:
'
日期范围
'
,
tag
:
'
el-date-picker
'
,
tagIcon
:
'
date-range
'
,
defaultValue
:
null
,
span
:
24
,
labelWidth
:
null
,
style
:
{
width
:
'
100%
'
},
type
:
'
daterange
'
,
'
range-separator
'
:
'
至
'
,
'
start-placeholder
'
:
'
开始日期
'
,
'
end-placeholder
'
:
'
结束日期
'
,
disabled
:
false
,
clearable
:
true
,
required
:
true
,
format
:
'
yyyy-MM-dd
'
,
'
value-format
'
:
'
yyyy-MM-dd
'
,
readonly
:
false
,
regList
:
[],
changeTag
:
true
,
document
:
'
https://element.eleme.cn/#/zh-CN/component/date-picker
'
},
{
label
:
'
评分
'
,
tag
:
'
el-rate
'
,
tagIcon
:
'
rate
'
,
defaultValue
:
0
,
span
:
24
,
labelWidth
:
null
,
style
:
{},
max
:
5
,
'
allow-half
'
:
false
,
'
show-text
'
:
false
,
'
show-score
'
:
false
,
disabled
:
false
,
required
:
true
,
regList
:
[],
changeTag
:
true
,
document
:
'
https://element.eleme.cn/#/zh-CN/component/rate
'
},
{
label
:
'
颜色选择
'
,
tag
:
'
el-color-picker
'
,
tagIcon
:
'
color
'
,
defaultValue
:
null
,
labelWidth
:
null
,
'
show-alpha
'
:
false
,
'
color-format
'
:
''
,
disabled
:
false
,
required
:
true
,
size
:
'
medium
'
,
regList
:
[],
changeTag
:
true
,
document
:
'
https://element.eleme.cn/#/zh-CN/component/color-picker
'
},
{
label
:
'
上传
'
,
tag
:
'
el-upload
'
,
tagIcon
:
'
upload
'
,
action
:
'
https://jsonplaceholder.typicode.com/posts/
'
,
defaultValue
:
null
,
labelWidth
:
null
,
disabled
:
false
,
required
:
true
,
accept
:
''
,
name
:
'
file
'
,
'
auto-upload
'
:
true
,
showTip
:
false
,
buttonText
:
'
点击上传
'
,
fileSize
:
2
,
sizeUnit
:
'
MB
'
,
'
list-type
'
:
'
text
'
,
multiple
:
false
,
regList
:
[],
changeTag
:
true
,
document
:
'
https://element.eleme.cn/#/zh-CN/component/upload
'
}
]
export
const
layoutComponents
=
[
{
layout
:
'
rowFormItem
'
,
tagIcon
:
'
row
'
,
type
:
'
default
'
,
justify
:
'
start
'
,
align
:
'
top
'
,
label
:
'
行容器
'
,
layoutTree
:
true
,
children
:
[],
document
:
'
https://element.eleme.cn/#/zh-CN/component/layout
'
}
]
// 组件rule的触发方式,无触发方式的组件不生成rule
export
const
trigger
=
{
'
el-input
'
:
'
blur
'
,
'
el-input-number
'
:
'
blur
'
,
'
el-select
'
:
'
change
'
,
'
el-radio-group
'
:
'
change
'
,
'
el-checkbox-group
'
:
'
change
'
,
'
el-cascader
'
:
'
change
'
,
'
el-time-picker
'
:
'
change
'
,
'
el-date-picker
'
:
'
change
'
,
'
el-rate
'
:
'
change
'
}
ruoyi-ui/src/utils/generator/css.js
0 → 100644
View file @
cb0a4b78
const
styles
=
{
'
el-rate
'
:
'
.el-rate{display: inline-block; vertical-align: text-top;}
'
,
'
el-upload
'
:
'
.el-upload__tip{line-height: 1.2;}
'
}
function
addCss
(
cssList
,
el
)
{
const
css
=
styles
[
el
.
tag
]
css
&&
cssList
.
indexOf
(
css
)
===
-
1
&&
cssList
.
push
(
css
)
if
(
el
.
children
)
{
el
.
children
.
forEach
(
el2
=>
addCss
(
cssList
,
el2
))
}
}
export
function
makeUpCss
(
conf
)
{
const
cssList
=
[]
conf
.
fields
.
forEach
(
el
=>
addCss
(
cssList
,
el
))
return
cssList
.
join
(
'
\n
'
)
}
ruoyi-ui/src/utils/generator/drawingDefalut.js
0 → 100644
View file @
cb0a4b78
export
default
[
{
layout
:
'
colFormItem
'
,
tagIcon
:
'
input
'
,
label
:
'
手机号
'
,
vModel
:
'
mobile
'
,
formId
:
6
,
tag
:
'
el-input
'
,
placeholder
:
'
请输入手机号
'
,
defaultValue
:
''
,
span
:
24
,
style
:
{
width
:
'
100%
'
},
clearable
:
true
,
prepend
:
''
,
append
:
''
,
'
prefix-icon
'
:
'
el-icon-mobile
'
,
'
suffix-icon
'
:
''
,
maxlength
:
11
,
'
show-word-limit
'
:
true
,
readonly
:
false
,
disabled
:
false
,
required
:
true
,
changeTag
:
true
,
regList
:
[{
pattern
:
'
/^1(3|4|5|7|8|9)
\\
d{9}$/
'
,
message
:
'
手机号格式错误
'
}]
}
]
ruoyi-ui/src/utils/generator/html.js
0 → 100644
View file @
cb0a4b78
/* eslint-disable max-len */
import
{
trigger
}
from
'
./config
'
let
confGlobal
let
someSpanIsNot24
export
function
dialogWrapper
(
str
)
{
return
`<el-dialog v-bind="$attrs" v-on="$listeners" @open="onOpen" @close="onClose" title="Dialog Titile">
${
str
}
<div slot="footer">
<el-button @click="close">取消</el-button>
<el-button type="primary" @click="handelConfirm">确定</el-button>
</div>
</el-dialog>`
}
export
function
vueTemplate
(
str
)
{
return
`<template>
<div>
${
str
}
</div>
</template>`
}
export
function
vueScript
(
str
)
{
return
`<script>
${
str
}
</script>`
}
export
function
cssStyle
(
cssStr
)
{
return
`<style>
${
cssStr
}
</style>`
}
function
buildFormTemplate
(
conf
,
child
,
type
)
{
let
labelPosition
=
''
if
(
conf
.
labelPosition
!==
'
right
'
)
{
labelPosition
=
`label-position="
${
conf
.
labelPosition
}
"`
}
const
disabled
=
conf
.
disabled
?
`:disabled="
${
conf
.
disabled
}
"`
:
''
let
str
=
`<el-form ref="
${
conf
.
formRef
}
" :model="
${
conf
.
formModel
}
" :rules="
${
conf
.
formRules
}
" size="
${
conf
.
size
}
"
${
disabled
}
label-width="
${
conf
.
labelWidth
}
px"
${
labelPosition
}
>
${
child
}
${
buildFromBtns
(
conf
,
type
)}
</el-form>`
if
(
someSpanIsNot24
)
{
str
=
`<el-row :gutter="
${
conf
.
gutter
}
">
${
str
}
</el-row>`
}
return
str
}
function
buildFromBtns
(
conf
,
type
)
{
let
str
=
''
if
(
conf
.
formBtns
&&
type
===
'
file
'
)
{
str
=
`<el-form-item size="large">
<el-button type="primary" @click="submitForm">提交</el-button>
<el-button @click="resetForm">重置</el-button>
</el-form-item>`
if
(
someSpanIsNot24
)
{
str
=
`<el-col :span="24">
${
str
}
</el-col>`
}
}
return
str
}
// span不为24的用el-col包裹
function
colWrapper
(
element
,
str
)
{
if
(
someSpanIsNot24
||
element
.
span
!==
24
)
{
return
`<el-col :span="
${
element
.
span
}
">
${
str
}
</el-col>`
}
return
str
}
const
layouts
=
{
colFormItem
(
element
)
{
let
labelWidth
=
''
if
(
element
.
labelWidth
&&
element
.
labelWidth
!==
confGlobal
.
labelWidth
)
{
labelWidth
=
`label-width="
${
element
.
labelWidth
}
px"`
}
const
required
=
!
trigger
[
element
.
tag
]
&&
element
.
required
?
'
required
'
:
''
const
tagDom
=
tags
[
element
.
tag
]
?
tags
[
element
.
tag
](
element
)
:
null
let
str
=
`<el-form-item
${
labelWidth
}
label="
${
element
.
label
}
" prop="
${
element
.
vModel
}
"
${
required
}
>
${
tagDom
}
</el-form-item>`
str
=
colWrapper
(
element
,
str
)
return
str
},
rowFormItem
(
element
)
{
const
type
=
element
.
type
===
'
default
'
?
''
:
`type="
${
element
.
type
}
"`
const
justify
=
element
.
type
===
'
default
'
?
''
:
`justify="
${
element
.
justify
}
"`
const
align
=
element
.
type
===
'
default
'
?
''
:
`align="
${
element
.
align
}
"`
const
gutter
=
element
.
gutter
?
`gutter="
${
element
.
gutter
}
"`
:
''
const
children
=
element
.
children
.
map
(
el
=>
layouts
[
el
.
layout
](
el
))
let
str
=
`<el-row
${
type
}
${
justify
}
${
align
}
${
gutter
}
>
${
children
.
join
(
'
\n
'
)}
</el-row>`
str
=
colWrapper
(
element
,
str
)
return
str
}
}
const
tags
=
{
'
el-input
'
:
el
=>
{
const
{
disabled
,
vModel
,
clearable
,
placeholder
,
width
}
=
attrBuilder
(
el
)
const
maxlength
=
el
.
maxlength
?
`:maxlength="
${
el
.
maxlength
}
"`
:
''
const
showWordLimit
=
el
[
'
show-word-limit
'
]
?
'
show-word-limit
'
:
''
const
readonly
=
el
.
readonly
?
'
readonly
'
:
''
const
prefixIcon
=
el
[
'
prefix-icon
'
]
?
`prefix-icon='
${
el
[
'
prefix-icon
'
]}
'`
:
''
const
suffixIcon
=
el
[
'
suffix-icon
'
]
?
`suffix-icon='
${
el
[
'
suffix-icon
'
]}
'`
:
''
const
showPassword
=
el
[
'
show-password
'
]
?
'
show-password
'
:
''
const
type
=
el
.
type
?
`type="
${
el
.
type
}
"`
:
''
const
autosize
=
el
.
autosize
&&
el
.
autosize
.
minRows
?
`:autosize="{minRows:
${
el
.
autosize
.
minRows
}
, maxRows:
${
el
.
autosize
.
maxRows
}
}"`
:
''
let
child
=
buildElInputChild
(
el
)
if
(
child
)
child
=
`\n
${
child
}
\n`
// 换行
return
`<
${
el
.
tag
}
${
vModel
}
${
type
}
${
placeholder
}
${
maxlength
}
${
showWordLimit
}
${
readonly
}
${
disabled
}
${
clearable
}
${
prefixIcon
}
${
suffixIcon
}
${
showPassword
}
${
autosize
}
${
width
}
>
${
child
}
</
${
el
.
tag
}
>`
},
'
el-input-number
'
:
el
=>
{
const
{
disabled
,
vModel
,
placeholder
}
=
attrBuilder
(
el
)
const
controlsPosition
=
el
[
'
controls-position
'
]
?
`controls-position=
${
el
[
'
controls-position
'
]}
`
:
''
const
min
=
el
.
min
?
`:min='
${
el
.
min
}
'`
:
''
const
max
=
el
.
max
?
`:max='
${
el
.
max
}
'`
:
''
const
step
=
el
.
step
?
`:step='
${
el
.
step
}
'`
:
''
const
stepStrictly
=
el
[
'
step-strictly
'
]
?
'
step-strictly
'
:
''
const
precision
=
el
.
precision
?
`:precision='
${
el
.
precision
}
'`
:
''
return
`<
${
el
.
tag
}
${
vModel
}
${
placeholder
}
${
step
}
${
stepStrictly
}
${
precision
}
${
controlsPosition
}
${
min
}
${
max
}
${
disabled
}
></
${
el
.
tag
}
>`
},
'
el-select
'
:
el
=>
{
const
{
disabled
,
vModel
,
clearable
,
placeholder
,
width
}
=
attrBuilder
(
el
)
const
filterable
=
el
.
filterable
?
'
filterable
'
:
''
const
multiple
=
el
.
multiple
?
'
multiple
'
:
''
let
child
=
buildElSelectChild
(
el
)
if
(
child
)
child
=
`\n
${
child
}
\n`
// 换行
return
`<
${
el
.
tag
}
${
vModel
}
${
placeholder
}
${
disabled
}
${
multiple
}
${
filterable
}
${
clearable
}
${
width
}
>
${
child
}
</
${
el
.
tag
}
>`
},
'
el-radio-group
'
:
el
=>
{
const
{
disabled
,
vModel
}
=
attrBuilder
(
el
)
const
size
=
`size="
${
el
.
size
}
"`
let
child
=
buildElRadioGroupChild
(
el
)
if
(
child
)
child
=
`\n
${
child
}
\n`
// 换行
return
`<
${
el
.
tag
}
${
vModel
}
${
size
}
${
disabled
}
>
${
child
}
</
${
el
.
tag
}
>`
},
'
el-checkbox-group
'
:
el
=>
{
const
{
disabled
,
vModel
}
=
attrBuilder
(
el
)
const
size
=
`size="
${
el
.
size
}
"`
const
min
=
el
.
min
?
`:min="
${
el
.
min
}
"`
:
''
const
max
=
el
.
max
?
`:max="
${
el
.
max
}
"`
:
''
let
child
=
buildElCheckboxGroupChild
(
el
)
if
(
child
)
child
=
`\n
${
child
}
\n`
// 换行
return
`<
${
el
.
tag
}
${
vModel
}
${
min
}
${
max
}
${
size
}
${
disabled
}
>
${
child
}
</
${
el
.
tag
}
>`
},
'
el-switch
'
:
el
=>
{
const
{
disabled
,
vModel
}
=
attrBuilder
(
el
)
const
activeText
=
el
[
'
active-text
'
]
?
`active-text="
${
el
[
'
active-text
'
]}
"`
:
''
const
inactiveText
=
el
[
'
inactive-text
'
]
?
`inactive-text="
${
el
[
'
inactive-text
'
]}
"`
:
''
const
activeColor
=
el
[
'
active-color
'
]
?
`active-color="
${
el
[
'
active-color
'
]}
"`
:
''
const
inactiveColor
=
el
[
'
inactive-color
'
]
?
`inactive-color="
${
el
[
'
inactive-color
'
]}
"`
:
''
const
activeValue
=
el
[
'
active-value
'
]
!==
true
?
`:active-value='
${
JSON
.
stringify
(
el
[
'
active-value
'
])}
'`
:
''
const
inactiveValue
=
el
[
'
inactive-value
'
]
!==
false
?
`:inactive-value='
${
JSON
.
stringify
(
el
[
'
inactive-value
'
])}
'`
:
''
return
`<
${
el
.
tag
}
${
vModel
}
${
activeText
}
${
inactiveText
}
${
activeColor
}
${
inactiveColor
}
${
activeValue
}
${
inactiveValue
}
${
disabled
}
></
${
el
.
tag
}
>`
},
'
el-cascader
'
:
el
=>
{
const
{
disabled
,
vModel
,
clearable
,
placeholder
,
width
}
=
attrBuilder
(
el
)
const
options
=
el
.
options
?
`:options="
${
el
.
vModel
}
Options"`
:
''
const
props
=
el
.
props
?
`:props="
${
el
.
vModel
}
Props"`
:
''
const
showAllLevels
=
el
[
'
show-all-levels
'
]
?
''
:
'
:show-all-levels="false"
'
const
filterable
=
el
.
filterable
?
'
filterable
'
:
''
const
separator
=
el
.
separator
===
'
/
'
?
''
:
`separator="
${
el
.
separator
}
"`
return
`<
${
el
.
tag
}
${
vModel
}
${
options
}
${
props
}
${
width
}
${
showAllLevels
}
${
placeholder
}
${
separator
}
${
filterable
}
${
clearable
}
${
disabled
}
></
${
el
.
tag
}
>`
},
'
el-slider
'
:
el
=>
{
const
{
disabled
,
vModel
}
=
attrBuilder
(
el
)
const
min
=
el
.
min
?
`:min='
${
el
.
min
}
'`
:
''
const
max
=
el
.
max
?
`:max='
${
el
.
max
}
'`
:
''
const
step
=
el
.
step
?
`:step='
${
el
.
step
}
'`
:
''
const
range
=
el
.
range
?
'
range
'
:
''
const
showStops
=
el
[
'
show-stops
'
]
?
`:show-stops="
${
el
[
'
show-stops
'
]}
"`
:
''
return
`<
${
el
.
tag
}
${
min
}
${
max
}
${
step
}
${
vModel
}
${
range
}
${
showStops
}
${
disabled
}
></
${
el
.
tag
}
>`
},
'
el-time-picker
'
:
el
=>
{
const
{
disabled
,
vModel
,
clearable
,
placeholder
,
width
}
=
attrBuilder
(
el
)
const
startPlaceholder
=
el
[
'
start-placeholder
'
]
?
`start-placeholder="
${
el
[
'
start-placeholder
'
]}
"`
:
''
const
endPlaceholder
=
el
[
'
end-placeholder
'
]
?
`end-placeholder="
${
el
[
'
end-placeholder
'
]}
"`
:
''
const
rangeSeparator
=
el
[
'
range-separator
'
]
?
`range-separator="
${
el
[
'
range-separator
'
]}
"`
:
''
const
isRange
=
el
[
'
is-range
'
]
?
'
is-range
'
:
''
const
format
=
el
.
format
?
`format="
${
el
.
format
}
"`
:
''
const
valueFormat
=
el
[
'
value-format
'
]
?
`value-format="
${
el
[
'
value-format
'
]}
"`
:
''
const
pickerOptions
=
el
[
'
picker-options
'
]
?
`:picker-options='
${
JSON
.
stringify
(
el
[
'
picker-options
'
])}
'`
:
''
return
`<
${
el
.
tag
}
${
vModel
}
${
isRange
}
${
format
}
${
valueFormat
}
${
pickerOptions
}
${
width
}
${
placeholder
}
${
startPlaceholder
}
${
endPlaceholder
}
${
rangeSeparator
}
${
clearable
}
${
disabled
}
></
${
el
.
tag
}
>`
},
'
el-date-picker
'
:
el
=>
{
const
{
disabled
,
vModel
,
clearable
,
placeholder
,
width
}
=
attrBuilder
(
el
)
const
startPlaceholder
=
el
[
'
start-placeholder
'
]
?
`start-placeholder="
${
el
[
'
start-placeholder
'
]}
"`
:
''
const
endPlaceholder
=
el
[
'
end-placeholder
'
]
?
`end-placeholder="
${
el
[
'
end-placeholder
'
]}
"`
:
''
const
rangeSeparator
=
el
[
'
range-separator
'
]
?
`range-separator="
${
el
[
'
range-separator
'
]}
"`
:
''
const
format
=
el
.
format
?
`format="
${
el
.
format
}
"`
:
''
const
valueFormat
=
el
[
'
value-format
'
]
?
`value-format="
${
el
[
'
value-format
'
]}
"`
:
''
const
type
=
el
.
type
===
'
date
'
?
''
:
`type="
${
el
.
type
}
"`
const
readonly
=
el
.
readonly
?
'
readonly
'
:
''
return
`<
${
el
.
tag
}
${
type
}
${
vModel
}
${
format
}
${
valueFormat
}
${
width
}
${
placeholder
}
${
startPlaceholder
}
${
endPlaceholder
}
${
rangeSeparator
}
${
clearable
}
${
readonly
}
${
disabled
}
></
${
el
.
tag
}
>`
},
'
el-rate
'
:
el
=>
{
const
{
disabled
,
vModel
}
=
attrBuilder
(
el
)
const
max
=
el
.
max
?
`:max='
${
el
.
max
}
'`
:
''
const
allowHalf
=
el
[
'
allow-half
'
]
?
'
allow-half
'
:
''
const
showText
=
el
[
'
show-text
'
]
?
'
show-text
'
:
''
const
showScore
=
el
[
'
show-score
'
]
?
'
show-score
'
:
''
return
`<
${
el
.
tag
}
${
vModel
}
${
allowHalf
}
${
showText
}
${
showScore
}
${
disabled
}
></
${
el
.
tag
}
>`
},
'
el-color-picker
'
:
el
=>
{
const
{
disabled
,
vModel
}
=
attrBuilder
(
el
)
const
size
=
`size="
${
el
.
size
}
"`
const
showAlpha
=
el
[
'
show-alpha
'
]
?
'
show-alpha
'
:
''
const
colorFormat
=
el
[
'
color-format
'
]
?
`color-format="
${
el
[
'
color-format
'
]}
"`
:
''
return
`<
${
el
.
tag
}
${
vModel
}
${
size
}
${
showAlpha
}
${
colorFormat
}
${
disabled
}
></
${
el
.
tag
}
>`
},
'
el-upload
'
:
el
=>
{
const
disabled
=
el
.
disabled
?
'
:disabled=
\'
true
\'
'
:
''
const
action
=
el
.
action
?
`:action="
${
el
.
vModel
}
Action"`
:
''
const
multiple
=
el
.
multiple
?
'
multiple
'
:
''
const
listType
=
el
[
'
list-type
'
]
!==
'
text
'
?
`list-type="
${
el
[
'
list-type
'
]}
"`
:
''
const
accept
=
el
.
accept
?
`accept="
${
el
.
accept
}
"`
:
''
const
name
=
el
.
name
!==
'
file
'
?
`name="
${
el
.
name
}
"`
:
''
const
autoUpload
=
el
[
'
auto-upload
'
]
===
false
?
'
:auto-upload="false"
'
:
''
const
beforeUpload
=
`:before-upload="
${
el
.
vModel
}
BeforeUpload"`
const
fileList
=
`:file-list="
${
el
.
vModel
}
fileList"`
const
ref
=
`ref="
${
el
.
vModel
}
"`
let
child
=
buildElUploadChild
(
el
)
if
(
child
)
child
=
`\n
${
child
}
\n`
// 换行
return
`<
${
el
.
tag
}
${
ref
}
${
fileList
}
${
action
}
${
autoUpload
}
${
multiple
}
${
beforeUpload
}
${
listType
}
${
accept
}
${
name
}
${
disabled
}
>
${
child
}
</
${
el
.
tag
}
>`
}
}
function
attrBuilder
(
el
)
{
return
{
vModel
:
`v-model="
${
confGlobal
.
formModel
}
.
${
el
.
vModel
}
"`
,
clearable
:
el
.
clearable
?
'
clearable
'
:
''
,
placeholder
:
el
.
placeholder
?
`placeholder="
${
el
.
placeholder
}
"`
:
''
,
width
:
el
.
style
&&
el
.
style
.
width
?
'
:style="{width:
\'
100%
\'
}"
'
:
''
,
disabled
:
el
.
disabled
?
'
:disabled=
\'
true
\'
'
:
''
}
}
// el-input innerHTML
function
buildElInputChild
(
conf
)
{
const
children
=
[]
if
(
conf
.
prepend
)
{
children
.
push
(
`<template slot="prepend">
${
conf
.
prepend
}
</template>`
)
}
if
(
conf
.
append
)
{
children
.
push
(
`<template slot="append">
${
conf
.
append
}
</template>`
)
}
return
children
.
join
(
'
\n
'
)
}
function
buildElSelectChild
(
conf
)
{
const
children
=
[]
if
(
conf
.
options
&&
conf
.
options
.
length
)
{
children
.
push
(
`<el-option v-for="(item, index) in
${
conf
.
vModel
}
Options" :key="index" :label="item.label" :value="item.value" :disabled="item.disabled"></el-option>`
)
}
return
children
.
join
(
'
\n
'
)
}
function
buildElRadioGroupChild
(
conf
)
{
const
children
=
[]
if
(
conf
.
options
&&
conf
.
options
.
length
)
{
const
tag
=
conf
.
optionType
===
'
button
'
?
'
el-radio-button
'
:
'
el-radio
'
const
border
=
conf
.
border
?
'
border
'
:
''
children
.
push
(
`<
${
tag
}
v-for="(item, index) in
${
conf
.
vModel
}
Options" :key="index" :label="item.value" :disabled="item.disabled"
${
border
}
>{{item.label}}</
${
tag
}
>`
)
}
return
children
.
join
(
'
\n
'
)
}
function
buildElCheckboxGroupChild
(
conf
)
{
const
children
=
[]
if
(
conf
.
options
&&
conf
.
options
.
length
)
{
const
tag
=
conf
.
optionType
===
'
button
'
?
'
el-checkbox-button
'
:
'
el-checkbox
'
const
border
=
conf
.
border
?
'
border
'
:
''
children
.
push
(
`<
${
tag
}
v-for="(item, index) in
${
conf
.
vModel
}
Options" :key="index" :label="item.value" :disabled="item.disabled"
${
border
}
>{{item.label}}</
${
tag
}
>`
)
}
return
children
.
join
(
'
\n
'
)
}
function
buildElUploadChild
(
conf
)
{
const
list
=
[]
if
(
conf
[
'
list-type
'
]
===
'
picture-card
'
)
list
.
push
(
'
<i class="el-icon-plus"></i>
'
)
else
list
.
push
(
`<el-button size="small" type="primary" icon="el-icon-upload">
${
conf
.
buttonText
}
</el-button>`
)
if
(
conf
.
showTip
)
list
.
push
(
`<div slot="tip" class="el-upload__tip">只能上传不超过
${
conf
.
fileSize
}${
conf
.
sizeUnit
}
的
${
conf
.
accept
}
文件</div>`
)
return
list
.
join
(
'
\n
'
)
}
export
function
makeUpHtml
(
conf
,
type
)
{
const
htmlList
=
[]
confGlobal
=
conf
someSpanIsNot24
=
conf
.
fields
.
some
(
item
=>
item
.
span
!==
24
)
conf
.
fields
.
forEach
(
el
=>
{
htmlList
.
push
(
layouts
[
el
.
layout
](
el
))
})
const
htmlStr
=
htmlList
.
join
(
'
\n
'
)
let
temp
=
buildFormTemplate
(
conf
,
htmlStr
,
type
)
if
(
type
===
'
dialog
'
)
{
temp
=
dialogWrapper
(
temp
)
}
confGlobal
=
null
return
temp
}
ruoyi-ui/src/utils/generator/icon.json
0 → 100644
View file @
cb0a4b78
[
"platform-eleme"
,
"eleme"
,
"delete-solid"
,
"delete"
,
"s-tools"
,
"setting"
,
"user-solid"
,
"user"
,
"phone"
,
"phone-outline"
,
"more"
,
"more-outline"
,
"star-on"
,
"star-off"
,
"s-goods"
,
"goods"
,
"warning"
,
"warning-outline"
,
"question"
,
"info"
,
"remove"
,
"circle-plus"
,
"success"
,
"error"
,
"zoom-in"
,
"zoom-out"
,
"remove-outline"
,
"circle-plus-outline"
,
"circle-check"
,
"circle-close"
,
"s-help"
,
"help"
,
"minus"
,
"plus"
,
"check"
,
"close"
,
"picture"
,
"picture-outline"
,
"picture-outline-round"
,
"upload"
,
"upload2"
,
"download"
,
"camera-solid"
,
"camera"
,
"video-camera-solid"
,
"video-camera"
,
"message-solid"
,
"bell"
,
"s-cooperation"
,
"s-order"
,
"s-platform"
,
"s-fold"
,
"s-unfold"
,
"s-operation"
,
"s-promotion"
,
"s-home"
,
"s-release"
,
"s-ticket"
,
"s-management"
,
"s-open"
,
"s-shop"
,
"s-marketing"
,
"s-flag"
,
"s-comment"
,
"s-finance"
,
"s-claim"
,
"s-custom"
,
"s-opportunity"
,
"s-data"
,
"s-check"
,
"s-grid"
,
"menu"
,
"share"
,
"d-caret"
,
"caret-left"
,
"caret-right"
,
"caret-bottom"
,
"caret-top"
,
"bottom-left"
,
"bottom-right"
,
"back"
,
"right"
,
"bottom"
,
"top"
,
"top-left"
,
"top-right"
,
"arrow-left"
,
"arrow-right"
,
"arrow-down"
,
"arrow-up"
,
"d-arrow-left"
,
"d-arrow-right"
,
"video-pause"
,
"video-play"
,
"refresh"
,
"refresh-right"
,
"refresh-left"
,
"finished"
,
"sort"
,
"sort-up"
,
"sort-down"
,
"rank"
,
"loading"
,
"view"
,
"c-scale-to-original"
,
"date"
,
"edit"
,
"edit-outline"
,
"folder"
,
"folder-opened"
,
"folder-add"
,
"folder-remove"
,
"folder-delete"
,
"folder-checked"
,
"tickets"
,
"document-remove"
,
"document-delete"
,
"document-copy"
,
"document-checked"
,
"document"
,
"document-add"
,
"printer"
,
"paperclip"
,
"takeaway-box"
,
"search"
,
"monitor"
,
"attract"
,
"mobile"
,
"scissors"
,
"umbrella"
,
"headset"
,
"brush"
,
"mouse"
,
"coordinate"
,
"magic-stick"
,
"reading"
,
"data-line"
,
"data-board"
,
"pie-chart"
,
"data-analysis"
,
"collection-tag"
,
"film"
,
"suitcase"
,
"suitcase-1"
,
"receiving"
,
"collection"
,
"files"
,
"notebook-1"
,
"notebook-2"
,
"toilet-paper"
,
"office-building"
,
"school"
,
"table-lamp"
,
"house"
,
"no-smoking"
,
"smoking"
,
"shopping-cart-full"
,
"shopping-cart-1"
,
"shopping-cart-2"
,
"shopping-bag-1"
,
"shopping-bag-2"
,
"sold-out"
,
"sell"
,
"present"
,
"box"
,
"bank-card"
,
"money"
,
"coin"
,
"wallet"
,
"discount"
,
"price-tag"
,
"news"
,
"guide"
,
"male"
,
"female"
,
"thumb"
,
"cpu"
,
"link"
,
"connection"
,
"open"
,
"turn-off"
,
"set-up"
,
"chat-round"
,
"chat-line-round"
,
"chat-square"
,
"chat-dot-round"
,
"chat-dot-square"
,
"chat-line-square"
,
"message"
,
"postcard"
,
"position"
,
"turn-off-microphone"
,
"microphone"
,
"close-notification"
,
"bangzhu"
,
"time"
,
"odometer"
,
"crop"
,
"aim"
,
"switch-button"
,
"full-screen"
,
"copy-document"
,
"mic"
,
"stopwatch"
,
"medal-1"
,
"medal"
,
"trophy"
,
"trophy-1"
,
"first-aid-kit"
,
"discover"
,
"place"
,
"location"
,
"location-outline"
,
"location-information"
,
"add-location"
,
"delete-location"
,
"map-location"
,
"alarm-clock"
,
"timer"
,
"watch-1"
,
"watch"
,
"lock"
,
"unlock"
,
"key"
,
"service"
,
"mobile-phone"
,
"bicycle"
,
"truck"
,
"ship"
,
"basketball"
,
"football"
,
"soccer"
,
"baseball"
,
"wind-power"
,
"light-rain"
,
"lightning"
,
"heavy-rain"
,
"sunrise"
,
"sunrise-1"
,
"sunset"
,
"sunny"
,
"cloudy"
,
"partly-cloudy"
,
"cloudy-and-sunny"
,
"moon"
,
"moon-night"
,
"dish"
,
"dish-1"
,
"food"
,
"chicken"
,
"fork-spoon"
,
"knife-fork"
,
"burger"
,
"tableware"
,
"sugar"
,
"dessert"
,
"ice-cream"
,
"hot-water"
,
"water-cup"
,
"coffee-cup"
,
"cold-drink"
,
"goblet"
,
"goblet-full"
,
"goblet-square"
,
"goblet-square-full"
,
"refrigerator"
,
"grape"
,
"watermelon"
,
"cherry"
,
"apple"
,
"pear"
,
"orange"
,
"coffee"
,
"ice-tea"
,
"ice-drink"
,
"milk-tea"
,
"potato-strips"
,
"lollipop"
,
"ice-cream-square"
,
"ice-cream-round"
]
\ No newline at end of file
ruoyi-ui/src/utils/generator/js.js
0 → 100644
View file @
cb0a4b78
import
{
isArray
}
from
'
util
'
import
{
exportDefault
,
titleCase
}
from
'
@/utils/index
'
import
{
trigger
}
from
'
./config
'
const
units
=
{
KB
:
'
1024
'
,
MB
:
'
1024 / 1024
'
,
GB
:
'
1024 / 1024 / 1024
'
}
let
confGlobal
const
inheritAttrs
=
{
file
:
''
,
dialog
:
'
inheritAttrs: false,
'
}
export
function
makeUpJs
(
conf
,
type
)
{
confGlobal
=
conf
=
JSON
.
parse
(
JSON
.
stringify
(
conf
))
const
dataList
=
[]
const
ruleList
=
[]
const
optionsList
=
[]
const
propsList
=
[]
const
methodList
=
mixinMethod
(
type
)
const
uploadVarList
=
[]
conf
.
fields
.
forEach
(
el
=>
{
buildAttributes
(
el
,
dataList
,
ruleList
,
optionsList
,
methodList
,
propsList
,
uploadVarList
)
})
const
script
=
buildexport
(
conf
,
type
,
dataList
.
join
(
'
\n
'
),
ruleList
.
join
(
'
\n
'
),
optionsList
.
join
(
'
\n
'
),
uploadVarList
.
join
(
'
\n
'
),
propsList
.
join
(
'
\n
'
),
methodList
.
join
(
'
\n
'
)
)
confGlobal
=
null
return
script
}
function
buildAttributes
(
el
,
dataList
,
ruleList
,
optionsList
,
methodList
,
propsList
,
uploadVarList
)
{
buildData
(
el
,
dataList
)
buildRules
(
el
,
ruleList
)
if
(
el
.
options
&&
el
.
options
.
length
)
{
buildOptions
(
el
,
optionsList
)
if
(
el
.
dataType
===
'
dynamic
'
)
{
const
model
=
`
${
el
.
vModel
}
Options`
const
options
=
titleCase
(
model
)
buildOptionMethod
(
`get
${
options
}
`
,
model
,
methodList
)
}
}
if
(
el
.
props
&&
el
.
props
.
props
)
{
buildProps
(
el
,
propsList
)
}
if
(
el
.
action
&&
el
.
tag
===
'
el-upload
'
)
{
uploadVarList
.
push
(
`
${
el
.
vModel
}
Action: '
${
el
.
action
}
',
${
el
.
vModel
}
fileList: [],`
)
methodList
.
push
(
buildBeforeUpload
(
el
))
if
(
!
el
[
'
auto-upload
'
])
{
methodList
.
push
(
buildSubmitUpload
(
el
))
}
}
if
(
el
.
children
)
{
el
.
children
.
forEach
(
el2
=>
{
buildAttributes
(
el2
,
dataList
,
ruleList
,
optionsList
,
methodList
,
propsList
,
uploadVarList
)
})
}
}
function
mixinMethod
(
type
)
{
const
list
=
[];
const
minxins
=
{
file
:
confGlobal
.
formBtns
?
{
submitForm
:
`submitForm() {
this.$refs['
${
confGlobal
.
formRef
}
'].validate(valid => {
if(!valid) return
// TODO 提交表单
})
},`
,
resetForm
:
`resetForm() {
this.$refs['
${
confGlobal
.
formRef
}
'].resetFields()
},`
}
:
null
,
dialog
:
{
onOpen
:
'
onOpen() {},
'
,
onClose
:
`onClose() {
this.$refs['
${
confGlobal
.
formRef
}
'].resetFields()
},`
,
close
:
`close() {
this.$emit('update:visible', false)
},`
,
handelConfirm
:
`handelConfirm() {
this.$refs['
${
confGlobal
.
formRef
}
'].validate(valid => {
if(!valid) return
this.close()
})
},`
}
}
const
methods
=
minxins
[
type
]
if
(
methods
)
{
Object
.
keys
(
methods
).
forEach
(
key
=>
{
list
.
push
(
methods
[
key
])
})
}
return
list
}
function
buildData
(
conf
,
dataList
)
{
if
(
conf
.
vModel
===
undefined
)
return
let
defaultValue
if
(
typeof
(
conf
.
defaultValue
)
===
'
string
'
&&
!
conf
.
multiple
)
{
defaultValue
=
`'
${
conf
.
defaultValue
}
'`
}
else
{
defaultValue
=
`
${
JSON
.
stringify
(
conf
.
defaultValue
)}
`
}
dataList
.
push
(
`
${
conf
.
vModel
}
:
${
defaultValue
}
,`
)
}
function
buildRules
(
conf
,
ruleList
)
{
if
(
conf
.
vModel
===
undefined
)
return
const
rules
=
[]
if
(
trigger
[
conf
.
tag
])
{
if
(
conf
.
required
)
{
const
type
=
isArray
(
conf
.
defaultValue
)
?
'
type:
\'
array
\'
,
'
:
''
let
message
=
isArray
(
conf
.
defaultValue
)
?
`请至少选择一个
${
conf
.
vModel
}
`
:
conf
.
placeholder
if
(
message
===
undefined
)
message
=
`
${
conf
.
label
}
不能为空`
rules
.
push
(
`{ required: true,
${
type
}
message: '
${
message
}
', trigger: '
${
trigger
[
conf
.
tag
]}
' }`
)
}
if
(
conf
.
regList
&&
isArray
(
conf
.
regList
))
{
conf
.
regList
.
forEach
(
item
=>
{
if
(
item
.
pattern
)
{
rules
.
push
(
`{ pattern:
${
eval
(
item
.
pattern
)}
, message: '
${
item
.
message
}
', trigger: '
${
trigger
[
conf
.
tag
]}
' }`
)
}
})
}
ruleList
.
push
(
`
${
conf
.
vModel
}
: [
${
rules
.
join
(
'
,
'
)}
],`
)
}
}
function
buildOptions
(
conf
,
optionsList
)
{
if
(
conf
.
vModel
===
undefined
)
return
if
(
conf
.
dataType
===
'
dynamic
'
)
{
conf
.
options
=
[]
}
const
str
=
`
${
conf
.
vModel
}
Options:
${
JSON
.
stringify
(
conf
.
options
)}
,`
optionsList
.
push
(
str
)
}
function
buildProps
(
conf
,
propsList
)
{
if
(
conf
.
dataType
===
'
dynamic
'
)
{
conf
.
valueKey
!==
'
value
'
&&
(
conf
.
props
.
props
.
value
=
conf
.
valueKey
)
conf
.
labelKey
!==
'
label
'
&&
(
conf
.
props
.
props
.
label
=
conf
.
labelKey
)
conf
.
childrenKey
!==
'
children
'
&&
(
conf
.
props
.
props
.
children
=
conf
.
childrenKey
)
}
const
str
=
`
${
conf
.
vModel
}
Props:
${
JSON
.
stringify
(
conf
.
props
.
props
)}
,`
propsList
.
push
(
str
)
}
function
buildBeforeUpload
(
conf
)
{
const
unitNum
=
units
[
conf
.
sizeUnit
];
let
rightSizeCode
=
''
;
let
acceptCode
=
''
;
const
returnList
=
[]
if
(
conf
.
fileSize
)
{
rightSizeCode
=
`let isRightSize = file.size /
${
unitNum
}
<
${
conf
.
fileSize
}
if(!isRightSize){
this.$message.error('文件大小超过
${
conf
.
fileSize
}${
conf
.
sizeUnit
}
')
}`
returnList
.
push
(
'
isRightSize
'
)
}
if
(
conf
.
accept
)
{
acceptCode
=
`let isAccept = new RegExp('
${
conf
.
accept
}
').test(file.type)
if(!isAccept){
this.$message.error('应该选择
${
conf
.
accept
}
类型的文件')
}`
returnList
.
push
(
'
isAccept
'
)
}
const
str
=
`
${
conf
.
vModel
}
BeforeUpload(file) {
${
rightSizeCode
}
${
acceptCode
}
return
${
returnList
.
join
(
'
&&
'
)}
},`
return
returnList
.
length
?
str
:
''
}
function
buildSubmitUpload
(
conf
)
{
const
str
=
`submitUpload() {
this.$refs['
${
conf
.
vModel
}
'].submit()
},`
return
str
}
function
buildOptionMethod
(
methodName
,
model
,
methodList
)
{
const
str
=
`
${
methodName
}
() {
// TODO 发起请求获取数据
this.
${
model
}
},`
methodList
.
push
(
str
)
}
function
buildexport
(
conf
,
type
,
data
,
rules
,
selectOptions
,
uploadVar
,
props
,
methods
)
{
const
str
=
`
${
exportDefault
}
{
${
inheritAttrs
[
type
]}
components: {},
props: [],
data () {
return {
${
conf
.
formModel
}
: {
${
data
}
},
${
conf
.
formRules
}
: {
${
rules
}
},
${
uploadVar
}
${
selectOptions
}
${
props
}
}
},
computed: {},
watch: {},
created () {},
mounted () {},
methods: {
${
methods
}
}
}`
return
str
}
ruoyi-ui/src/utils/generator/render.js
0 → 100644
View file @
cb0a4b78
import
{
makeMap
}
from
'
@/utils/index
'
// 参考https://github.com/vuejs/vue/blob/v2.6.10/src/platforms/web/server/util.js
const
isAttr
=
makeMap
(
'
accept,accept-charset,accesskey,action,align,alt,async,autocomplete,
'
+
'
autofocus,autoplay,autosave,bgcolor,border,buffered,challenge,charset,
'
+
'
checked,cite,class,code,codebase,color,cols,colspan,content,http-equiv,
'
+
'
name,contenteditable,contextmenu,controls,coords,data,datetime,default,
'
+
'
defer,dir,dirname,disabled,download,draggable,dropzone,enctype,method,for,
'
+
'
form,formaction,headers,height,hidden,high,href,hreflang,http-equiv,
'
+
'
icon,id,ismap,itemprop,keytype,kind,label,lang,language,list,loop,low,
'
+
'
manifest,max,maxlength,media,method,GET,POST,min,multiple,email,file,
'
+
'
muted,name,novalidate,open,optimum,pattern,ping,placeholder,poster,
'
+
'
preload,radiogroup,readonly,rel,required,reversed,rows,rowspan,sandbox,
'
+
'
scope,scoped,seamless,selected,shape,size,type,text,password,sizes,span,
'
+
'
spellcheck,src,srcdoc,srclang,srcset,start,step,style,summary,tabindex,
'
+
'
target,title,type,usemap,value,width,wrap
'
)
function
vModel
(
self
,
dataObject
,
defaultValue
)
{
dataObject
.
props
.
value
=
defaultValue
dataObject
.
on
.
input
=
val
=>
{
self
.
$emit
(
'
input
'
,
val
)
}
}
const
componentChild
=
{
'
el-input
'
:
{
prepend
(
h
,
conf
,
key
)
{
return
<
template
slot
=
"
prepend
"
>
{
conf
[
key
]}
<
/template>
},
append
(
h
,
conf
,
key
)
{
return
<
template
slot
=
"
append
"
>
{
conf
[
key
]}
<
/template>
}
},
'
el-select
'
:
{
options
(
h
,
conf
,
key
)
{
const
list
=
[]
conf
.
options
.
forEach
(
item
=>
{
list
.
push
(
<
el
-
option
label
=
{
item
.
label
}
value
=
{
item
.
value
}
disabled
=
{
item
.
disabled
}
><
/el-option>
)
})
return
list
}
},
'
el-radio-group
'
:
{
options
(
h
,
conf
,
key
)
{
const
list
=
[]
conf
.
options
.
forEach
(
item
=>
{
if
(
conf
.
optionType
===
'
button
'
)
list
.
push
(
<
el
-
radio
-
button
label
=
{
item
.
value
}
>
{
item
.
label
}
<
/el-radio-button>
)
else
list
.
push
(
<
el
-
radio
label
=
{
item
.
value
}
border
=
{
conf
.
border
}
>
{
item
.
label
}
<
/el-radio>
)
})
return
list
}
},
'
el-checkbox-group
'
:
{
options
(
h
,
conf
,
key
)
{
const
list
=
[]
conf
.
options
.
forEach
(
item
=>
{
if
(
conf
.
optionType
===
'
button
'
)
{
list
.
push
(
<
el
-
checkbox
-
button
label
=
{
item
.
value
}
>
{
item
.
label
}
<
/el-checkbox-button>
)
}
else
{
list
.
push
(
<
el
-
checkbox
label
=
{
item
.
value
}
border
=
{
conf
.
border
}
>
{
item
.
label
}
<
/el-checkbox>
)
}
})
return
list
}
},
'
el-upload
'
:
{
'
list-type
'
:
(
h
,
conf
,
key
)
=>
{
const
list
=
[]
if
(
conf
[
'
list-type
'
]
===
'
picture-card
'
)
{
list
.
push
(
<
i
class
=
"
el-icon-plus
"
><
/i>
)
}
else
{
list
.
push
(
<
el
-
button
size
=
"
small
"
type
=
"
primary
"
icon
=
"
el-icon-upload
"
>
{
conf
.
buttonText
}
<
/el-button>
)
}
if
(
conf
.
showTip
)
{
list
.
push
(
<
div
slot
=
"
tip
"
class
=
"
el-upload__tip
"
>
只能上传不超过
{
conf
.
fileSize
}{
conf
.
sizeUnit
}
的
{
conf
.
accept
}
文件
<
/div>
)
}
return
list
}
}
}
export
default
{
render
(
h
)
{
const
dataObject
=
{
attrs
:
{},
props
:
{},
on
:
{},
style
:
{}
}
const
confClone
=
JSON
.
parse
(
JSON
.
stringify
(
this
.
conf
))
const
children
=
[]
const
childObjs
=
componentChild
[
confClone
.
tag
]
if
(
childObjs
)
{
Object
.
keys
(
childObjs
).
forEach
(
key
=>
{
const
childFunc
=
childObjs
[
key
]
if
(
confClone
[
key
])
{
children
.
push
(
childFunc
(
h
,
confClone
,
key
))
}
})
}
Object
.
keys
(
confClone
).
forEach
(
key
=>
{
const
val
=
confClone
[
key
]
if
(
key
===
'
vModel
'
)
{
vModel
(
this
,
dataObject
,
confClone
.
defaultValue
)
}
else
if
(
dataObject
[
key
])
{
dataObject
[
key
]
=
val
}
else
if
(
!
isAttr
(
key
))
{
dataObject
.
props
[
key
]
=
val
}
else
{
dataObject
.
attrs
[
key
]
=
val
}
})
return
h
(
this
.
conf
.
tag
,
dataObject
,
children
)
},
props
:
[
'
conf
'
]
}
ruoyi-ui/src/utils/index.js
View file @
cb0a4b78
...
...
@@ -315,3 +315,72 @@ export function removeClass(ele, cls) {
ele
.
className
=
ele
.
className
.
replace
(
reg
,
'
'
)
}
}
export
function
makeMap
(
str
,
expectsLowerCase
)
{
const
map
=
Object
.
create
(
null
)
const
list
=
str
.
split
(
'
,
'
)
for
(
let
i
=
0
;
i
<
list
.
length
;
i
++
)
{
map
[
list
[
i
]]
=
true
}
return
expectsLowerCase
?
val
=>
map
[
val
.
toLowerCase
()]
:
val
=>
map
[
val
]
}
export
const
exportDefault
=
'
export default
'
export
const
beautifierConf
=
{
html
:
{
indent_size
:
'
2
'
,
indent_char
:
'
'
,
max_preserve_newlines
:
'
-1
'
,
preserve_newlines
:
false
,
keep_array_indentation
:
false
,
break_chained_methods
:
false
,
indent_scripts
:
'
separate
'
,
brace_style
:
'
end-expand
'
,
space_before_conditional
:
true
,
unescape_strings
:
false
,
jslint_happy
:
false
,
end_with_newline
:
true
,
wrap_line_length
:
'
110
'
,
indent_inner_html
:
true
,
comma_first
:
false
,
e4x
:
true
,
indent_empty_lines
:
true
},
js
:
{
indent_size
:
'
2
'
,
indent_char
:
'
'
,
max_preserve_newlines
:
'
-1
'
,
preserve_newlines
:
false
,
keep_array_indentation
:
false
,
break_chained_methods
:
false
,
indent_scripts
:
'
normal
'
,
brace_style
:
'
end-expand
'
,
space_before_conditional
:
true
,
unescape_strings
:
false
,
jslint_happy
:
true
,
end_with_newline
:
true
,
wrap_line_length
:
'
110
'
,
indent_inner_html
:
true
,
comma_first
:
false
,
e4x
:
true
,
indent_empty_lines
:
true
}
}
// 首字母大小
export
function
titleCase
(
str
)
{
return
str
.
replace
(
/
(
|^
)[
a-z
]
/g
,
L
=>
L
.
toUpperCase
())
}
// 下划转驼峰
export
function
camelCase
(
str
)
{
return
str
.
replace
(
/-
[
a-z
]
/g
,
str1
=>
str1
.
substr
(
-
1
).
toUpperCase
())
}
export
function
isNumberStr
(
str
)
{
return
/^
[
+-
]?(
0|
([
1-9
]\d
*
))(\.\d
+
)?
$/g
.
test
(
str
)
}
\ No newline at end of file
ruoyi-ui/src/utils/permission.js
View file @
cb0a4b78
import
store
from
'
@/store
'
/**
* @param {Array} value
* 字符权限校验
* @param {Array} value 校验值
* @returns {Boolean}
*/
export
default
function
checkPermission
(
value
)
{
export
function
checkPermi
(
value
)
{
if
(
value
&&
value
instanceof
Array
&&
value
.
length
>
0
)
{
const
permissions
=
store
.
getters
&&
store
.
getters
.
permissions
const
permissionDatas
=
value
const
hasPermission
=
permissions
.
some
(
permission
=>
{
return
permissionDatas
.
includes
(
permission
)
})
if
(
!
hasPermission
)
{
return
false
}
return
true
}
else
{
console
.
error
(
`need roles! Like checkPermi="['system:user:add','system:user:edit']"`
)
return
false
}
}
/**
* 角色权限校验
* @param {Array} value 校验值
* @returns {Boolean}
*/
export
function
checkRole
(
value
)
{
if
(
value
&&
value
instanceof
Array
&&
value
.
length
>
0
)
{
const
roles
=
store
.
getters
&&
store
.
getters
.
roles
const
permissionRoles
=
value
const
has
Permission
=
roles
.
some
(
role
=>
{
const
has
Role
=
roles
.
some
(
role
=>
{
return
permissionRoles
.
includes
(
role
)
})
if
(
!
has
Permission
)
{
if
(
!
has
Role
)
{
return
false
}
return
true
}
else
{
console
.
error
(
`need roles! Like
v-permission
="['admin','editor']"`
)
console
.
error
(
`need roles! Like
checkRole
="['admin','editor']"`
)
return
false
}
}
}
\ No newline at end of file
ruoyi-ui/src/utils/ruoyi.js
View file @
cb0a4b78
...
...
@@ -100,4 +100,33 @@ export function praseStrEmpty(str) {
return
""
;
}
return
str
;
}
\ No newline at end of file
}
/**
* 构造树型结构数据
* @param {*} data 数据源
* @param {*} id id字段 默认 'id'
* @param {*} parentId 父节点字段 默认 'parentId'
* @param {*} children 孩子节点字段 默认 'children'
* @param {*} rootId 根Id 默认 0
*/
export
function
handleTree
(
data
,
id
,
parentId
,
children
,
rootId
)
{
id
=
id
||
'
id
'
parentId
=
parentId
||
'
parentId
'
children
=
children
||
'
children
'
rootId
=
rootId
||
0
//对源数据深度克隆
const
cloneData
=
JSON
.
parse
(
JSON
.
stringify
(
data
))
//循环所有项
const
treeData
=
cloneData
.
filter
(
father
=>
{
let
branchArr
=
cloneData
.
filter
(
child
=>
{
//返回每一项的子级数组
return
father
[
id
]
===
child
[
parentId
]
});
branchArr
.
length
>
0
?
father
.
children
=
branchArr
:
''
;
//返回第一层
return
father
[
parentId
]
===
rootId
;
});
return
treeData
!=
''
?
treeData
:
data
;
}
\ No newline at end of file
ruoyi-ui/src/views/system/dept/index.vue
View file @
cb0a4b78
...
...
@@ -88,7 +88,7 @@
<el-row>
<el-col
:span=
"24"
v-if=
"form.parentId !== 0"
>
<el-form-item
label=
"上级部门"
prop=
"parentId"
>
<treeselect
v-model=
"form.parentId"
:options=
"deptOptions"
placeholder=
"选择上级部门"
/>
<treeselect
v-model=
"form.parentId"
:options=
"deptOptions"
:normalizer=
"normalizer"
placeholder=
"选择上级部门"
/>
</el-form-item>
</el-col>
<el-col
:span=
"12"
>
...
...
@@ -138,7 +138,7 @@
</template>
<
script
>
import
{
listDept
,
getDept
,
treeselect
,
delDept
,
addDept
,
updateDept
}
from
"
@/api/system/dept
"
;
import
{
listDept
,
getDept
,
delDept
,
addDept
,
updateDept
}
from
"
@/api/system/dept
"
;
import
Treeselect
from
"
@riophae/vue-treeselect
"
;
import
"
@riophae/vue-treeselect/dist/vue-treeselect.css
"
;
...
...
@@ -205,14 +205,25 @@ export default {
getList
()
{
this
.
loading
=
true
;
listDept
(
this
.
queryParams
).
then
(
response
=>
{
this
.
deptList
=
response
.
data
;
this
.
deptList
=
this
.
handleTree
(
response
.
data
,
"
deptId
"
)
;
this
.
loading
=
false
;
});
},
/** 转换部门数据结构 */
normalizer
(
node
)
{
if
(
node
.
children
&&
!
node
.
children
.
length
)
{
delete
node
.
children
;
}
return
{
id
:
node
.
deptId
,
label
:
node
.
deptName
,
children
:
node
.
children
};
},
/** 查询部门下拉树结构 */
getTreeselect
()
{
treeselec
t
().
then
(
response
=>
{
this
.
deptOptions
=
response
.
data
;
listDep
t
().
then
(
response
=>
{
this
.
deptOptions
=
this
.
handleTree
(
response
.
data
,
"
deptId
"
)
;
});
},
// 字典状态字典翻译
...
...
ruoyi-ui/src/views/system/menu/index.vue
View file @
cb0a4b78
...
...
@@ -82,6 +82,7 @@
<treeselect
v-model=
"form.parentId"
:options=
"menuOptions"
:normalizer=
"normalizer"
:show-count=
"true"
placeholder=
"选择上级菜单"
/>
...
...
@@ -173,7 +174,7 @@
</template>
<
script
>
import
{
listMenu
,
getMenu
,
treeselect
,
delMenu
,
addMenu
,
updateMenu
}
from
"
@/api/system/menu
"
;
import
{
listMenu
,
getMenu
,
delMenu
,
addMenu
,
updateMenu
}
from
"
@/api/system/menu
"
;
import
Treeselect
from
"
@riophae/vue-treeselect
"
;
import
"
@riophae/vue-treeselect/dist/vue-treeselect.css
"
;
import
IconSelect
from
"
@/components/IconSelect
"
;
...
...
@@ -228,16 +229,27 @@ export default {
getList
()
{
this
.
loading
=
true
;
listMenu
(
this
.
queryParams
).
then
(
response
=>
{
this
.
menuList
=
response
.
data
;
this
.
menuList
=
this
.
handleTree
(
response
.
data
,
"
menuId
"
)
;
this
.
loading
=
false
;
});
},
/** 转换菜单数据结构 */
normalizer
(
node
)
{
if
(
node
.
children
&&
!
node
.
children
.
length
)
{
delete
node
.
children
;
}
return
{
id
:
node
.
menuId
,
label
:
node
.
menuName
,
children
:
node
.
children
};
},
/** 查询菜单下拉树结构 */
getTreeselect
()
{
treeselect
().
then
(
response
=>
{
listMenu
().
then
(
response
=>
{
this
.
menuOptions
=
[];
const
menu
=
{
i
d
:
0
,
label
:
'
主类目
'
,
children
:
[]
};
menu
.
children
=
response
.
data
;
const
menu
=
{
menuI
d
:
0
,
menuName
:
'
主类目
'
,
children
:
[]
};
menu
.
children
=
this
.
handleTree
(
response
.
data
,
"
menuId
"
)
;
this
.
menuOptions
.
push
(
menu
);
});
},
...
...
ruoyi-ui/src/views/tool/build/CodeTypeDialog.vue
0 → 100644
View file @
cb0a4b78
<
template
>
<div>
<el-dialog
v-bind=
"$attrs"
width=
"500px"
:close-on-click-modal=
"false"
:modal-append-to-body=
"false"
v-on=
"$listeners"
@
open=
"onOpen"
@
close=
"onClose"
>
<el-row
:gutter=
"15"
>
<el-form
ref=
"elForm"
:model=
"formData"
:rules=
"rules"
size=
"medium"
label-width=
"100px"
>
<el-col
:span=
"24"
>
<el-form-item
label=
"生成类型"
prop=
"type"
>
<el-radio-group
v-model=
"formData.type"
>
<el-radio-button
v-for=
"(item, index) in typeOptions"
:key=
"index"
:label=
"item.value"
:disabled=
"item.disabled"
>
{{
item
.
label
}}
</el-radio-button>
</el-radio-group>
</el-form-item>
<el-form-item
v-if=
"showFileName"
label=
"文件名"
prop=
"fileName"
>
<el-input
v-model=
"formData.fileName"
placeholder=
"请输入文件名"
clearable
/>
</el-form-item>
</el-col>
</el-form>
</el-row>
<div
slot=
"footer"
>
<el-button
@
click=
"close"
>
取消
</el-button>
<el-button
type=
"primary"
@
click=
"handelConfirm"
>
确定
</el-button>
</div>
</el-dialog>
</div>
</
template
>
<
script
>
export
default
{
inheritAttrs
:
false
,
props
:
[
'
showFileName
'
],
data
()
{
return
{
formData
:
{
fileName
:
undefined
,
type
:
'
file
'
},
rules
:
{
fileName
:
[{
required
:
true
,
message
:
'
请输入文件名
'
,
trigger
:
'
blur
'
}],
type
:
[{
required
:
true
,
message
:
'
生成类型不能为空
'
,
trigger
:
'
change
'
}]
},
typeOptions
:
[{
label
:
'
页面
'
,
value
:
'
file
'
},
{
label
:
'
弹窗
'
,
value
:
'
dialog
'
}]
}
},
computed
:
{
},
watch
:
{},
mounted
()
{},
methods
:
{
onOpen
()
{
if
(
this
.
showFileName
)
{
this
.
formData
.
fileName
=
`
${
+
new
Date
()}
.vue`
}
},
onClose
()
{
},
close
(
e
)
{
this
.
$emit
(
'
update:visible
'
,
false
)
},
handelConfirm
()
{
this
.
$refs
.
elForm
.
validate
(
valid
=>
{
if
(
!
valid
)
return
this
.
$emit
(
'
confirm
'
,
{
...
this
.
formData
})
this
.
close
()
})
}
}
}
</
script
>
ruoyi-ui/src/views/tool/build/DraggableItem.vue
0 → 100644
View file @
cb0a4b78
<
script
>
import
draggable
from
'
vuedraggable
'
import
render
from
'
@/utils/generator/render
'
const
components
=
{
itemBtns
(
h
,
element
,
index
,
parent
)
{
const
{
copyItem
,
deleteItem
}
=
this
.
$listeners
return
[
<
span
class
=
"
drawing-item-copy
"
title
=
"
复制
"
onClick
=
{
event
=>
{
copyItem
(
element
,
parent
);
event
.
stopPropagation
()
}}
>
<
i
class
=
"
el-icon-copy-document
"
/>
<
/span>,
<
span
class
=
"
drawing-item-delete
"
title
=
"
删除
"
onClick
=
{
event
=>
{
deleteItem
(
index
,
parent
);
event
.
stopPropagation
()
}}
>
<
i
class
=
"
el-icon-delete
"
/>
<
/span>
]
}
}
const
layouts
=
{
colFormItem
(
h
,
element
,
index
,
parent
)
{
const
{
activeItem
}
=
this
.
$listeners
let
className
=
this
.
activeId
===
element
.
formId
?
'
drawing-item active-from-item
'
:
'
drawing-item
'
if
(
this
.
formConf
.
unFocusedComponentBorder
)
className
+=
'
unfocus-bordered
'
return
(
<
el
-
col
span
=
{
element
.
span
}
class
=
{
className
}
nativeOnClick
=
{
event
=>
{
activeItem
(
element
);
event
.
stopPropagation
()
}}
>
<
el
-
form
-
item
label
-
width
=
{
element
.
labelWidth
?
`
${
element
.
labelWidth
}
px`
:
null
}
label
=
{
element
.
label
}
required
=
{
element
.
required
}
>
<
render
key
=
{
element
.
renderKey
}
conf
=
{
element
}
onInput
=
{
event
=>
{
this
.
$set
(
element
,
'
defaultValue
'
,
event
)
}}
/>
<
/el-form-item>
{
components
.
itemBtns
.
apply
(
this
,
arguments
)}
<
/el-col>
)
},
rowFormItem
(
h
,
element
,
index
,
parent
)
{
const
{
activeItem
}
=
this
.
$listeners
const
className
=
this
.
activeId
===
element
.
formId
?
'
drawing-row-item active-from-item
'
:
'
drawing-row-item
'
let
child
=
renderChildren
.
apply
(
this
,
arguments
)
if
(
element
.
type
===
'
flex
'
)
{
child
=
<
el
-
row
type
=
{
element
.
type
}
justify
=
{
element
.
justify
}
align
=
{
element
.
align
}
>
{
child
}
<
/el-row>
}
return
(
<
el
-
col
span
=
{
element
.
span
}
>
<
el
-
row
gutter
=
{
element
.
gutter
}
class
=
{
className
}
nativeOnClick
=
{
event
=>
{
activeItem
(
element
);
event
.
stopPropagation
()
}}
>
<
span
class
=
"
component-name
"
>
{
element
.
componentName
}
<
/span>
<
draggable
list
=
{
element
.
children
}
animation
=
{
340
}
group
=
"
componentsGroup
"
class
=
"
drag-wrapper
"
>
{
child
}
<
/draggable>
{
components
.
itemBtns
.
apply
(
this
,
arguments
)}
<
/el-row>
<
/el-col>
)
}
}
function
renderChildren
(
h
,
element
,
index
,
parent
)
{
if
(
!
Array
.
isArray
(
element
.
children
))
return
null
return
element
.
children
.
map
((
el
,
i
)
=>
{
const
layout
=
layouts
[
el
.
layout
]
if
(
layout
)
{
return
layout
.
call
(
this
,
h
,
el
,
i
,
element
.
children
)
}
return
layoutIsNotFound
()
})
}
function
layoutIsNotFound
()
{
throw
new
Error
(
`没有与
${
this
.
element
.
layout
}
匹配的layout`
)
}
export
default
{
components
:
{
render
,
draggable
},
props
:
[
'
element
'
,
'
index
'
,
'
drawingList
'
,
'
activeId
'
,
'
formConf
'
],
render
(
h
)
{
const
layout
=
layouts
[
this
.
element
.
layout
]
if
(
layout
)
{
return
layout
.
call
(
this
,
h
,
this
.
element
,
this
.
index
,
this
.
drawingList
)
}
return
layoutIsNotFound
()
}
}
</
script
>
Prev
1
2
3
4
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