Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in
Toggle navigation
F
finance-manage
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Issues
0
Issues
0
List
Boards
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Analytics
Analytics
CI / CD
Repository
Value Stream
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
finance-oa
finance-manage
Commits
cb0a4b78
Commit
cb0a4b78
authored
Feb 24, 2020
by
RuoYi
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
若依 2.1
parent
46a16952
Changes
61
Hide whitespace changes
Inline
Side-by-side
Showing
61 changed files
with
4143 additions
and
59 deletions
+4143
-59
ruoyi-ui/package.json
ruoyi-ui/package.json
+8
-3
ruoyi-ui/src/assets/icons/svg/cascader.svg
ruoyi-ui/src/assets/icons/svg/cascader.svg
+1
-0
ruoyi-ui/src/assets/icons/svg/checkbox.svg
ruoyi-ui/src/assets/icons/svg/checkbox.svg
+1
-0
ruoyi-ui/src/assets/icons/svg/color.svg
ruoyi-ui/src/assets/icons/svg/color.svg
+1
-0
ruoyi-ui/src/assets/icons/svg/component.svg
ruoyi-ui/src/assets/icons/svg/component.svg
+1
-1
ruoyi-ui/src/assets/icons/svg/date-range.svg
ruoyi-ui/src/assets/icons/svg/date-range.svg
+1
-0
ruoyi-ui/src/assets/icons/svg/date.svg
ruoyi-ui/src/assets/icons/svg/date.svg
+1
-1
ruoyi-ui/src/assets/icons/svg/github.svg
ruoyi-ui/src/assets/icons/svg/github.svg
+1
-0
ruoyi-ui/src/assets/icons/svg/input.svg
ruoyi-ui/src/assets/icons/svg/input.svg
+1
-0
ruoyi-ui/src/assets/icons/svg/number.svg
ruoyi-ui/src/assets/icons/svg/number.svg
+1
-0
ruoyi-ui/src/assets/icons/svg/password.svg
ruoyi-ui/src/assets/icons/svg/password.svg
+1
-1
ruoyi-ui/src/assets/icons/svg/question.svg
ruoyi-ui/src/assets/icons/svg/question.svg
+1
-0
ruoyi-ui/src/assets/icons/svg/radio.svg
ruoyi-ui/src/assets/icons/svg/radio.svg
+1
-0
ruoyi-ui/src/assets/icons/svg/rate.svg
ruoyi-ui/src/assets/icons/svg/rate.svg
+1
-0
ruoyi-ui/src/assets/icons/svg/row.svg
ruoyi-ui/src/assets/icons/svg/row.svg
+1
-0
ruoyi-ui/src/assets/icons/svg/select.svg
ruoyi-ui/src/assets/icons/svg/select.svg
+1
-0
ruoyi-ui/src/assets/icons/svg/slider.svg
ruoyi-ui/src/assets/icons/svg/slider.svg
+1
-0
ruoyi-ui/src/assets/icons/svg/switch.svg
ruoyi-ui/src/assets/icons/svg/switch.svg
+1
-0
ruoyi-ui/src/assets/icons/svg/textarea.svg
ruoyi-ui/src/assets/icons/svg/textarea.svg
+1
-0
ruoyi-ui/src/assets/icons/svg/time-range.svg
ruoyi-ui/src/assets/icons/svg/time-range.svg
+1
-0
ruoyi-ui/src/assets/icons/svg/time.svg
ruoyi-ui/src/assets/icons/svg/time.svg
+1
-0
ruoyi-ui/src/assets/icons/svg/upload.svg
ruoyi-ui/src/assets/icons/svg/upload.svg
+1
-0
ruoyi-ui/src/components/RuoYi/Doc/index.vue
ruoyi-ui/src/components/RuoYi/Doc/index.vue
+21
-0
ruoyi-ui/src/components/RuoYi/Git/index.vue
ruoyi-ui/src/components/RuoYi/Git/index.vue
+3
-3
ruoyi-ui/src/layout/components/Navbar.vue
ruoyi-ui/src/layout/components/Navbar.vue
+10
-4
ruoyi-ui/src/main.js
ruoyi-ui/src/main.js
+2
-1
ruoyi-ui/src/utils/generator/config.js
ruoyi-ui/src/utils/generator/config.js
+423
-0
ruoyi-ui/src/utils/generator/css.js
ruoyi-ui/src/utils/generator/css.js
+18
-0
ruoyi-ui/src/utils/generator/drawingDefalut.js
ruoyi-ui/src/utils/generator/drawingDefalut.js
+29
-0
ruoyi-ui/src/utils/generator/html.js
ruoyi-ui/src/utils/generator/html.js
+338
-0
ruoyi-ui/src/utils/generator/icon.json
ruoyi-ui/src/utils/generator/icon.json
+1
-0
ruoyi-ui/src/utils/generator/js.js
ruoyi-ui/src/utils/generator/js.js
+236
-0
ruoyi-ui/src/utils/generator/render.js
ruoyi-ui/src/utils/generator/render.js
+121
-0
ruoyi-ui/src/utils/index.js
ruoyi-ui/src/utils/index.js
+69
-0
ruoyi-ui/src/utils/permission.js
ruoyi-ui/src/utils/permission.js
+31
-6
ruoyi-ui/src/utils/ruoyi.js
ruoyi-ui/src/utils/ruoyi.js
+30
-1
ruoyi-ui/src/views/system/dept/index.vue
ruoyi-ui/src/views/system/dept/index.vue
+16
-5
ruoyi-ui/src/views/system/menu/index.vue
ruoyi-ui/src/views/system/menu/index.vue
+17
-5
ruoyi-ui/src/views/tool/build/CodeTypeDialog.vue
ruoyi-ui/src/views/tool/build/CodeTypeDialog.vue
+106
-0
ruoyi-ui/src/views/tool/build/DraggableItem.vue
ruoyi-ui/src/views/tool/build/DraggableItem.vue
+100
-0
ruoyi-ui/src/views/tool/build/IconsDialog.vue
ruoyi-ui/src/views/tool/build/IconsDialog.vue
+123
-0
ruoyi-ui/src/views/tool/build/RightPanel.vue
ruoyi-ui/src/views/tool/build/RightPanel.vue
+944
-0
ruoyi-ui/src/views/tool/build/TreeNodeDialog.vue
ruoyi-ui/src/views/tool/build/TreeNodeDialog.vue
+149
-0
ruoyi-ui/src/views/tool/build/index.vue
ruoyi-ui/src/views/tool/build/index.vue
+787
-3
ruoyi-ui/src/views/tool/gen/genInfoForm.vue
ruoyi-ui/src/views/tool/gen/genInfoForm.vue
+1
-1
ruoyi/pom.xml
ruoyi/pom.xml
+1
-9
ruoyi/src/main/java/com/ruoyi/common/constant/GenConstants.java
...src/main/java/com/ruoyi/common/constant/GenConstants.java
+1
-1
ruoyi/src/main/java/com/ruoyi/common/utils/html/EscapeUtil.java
...src/main/java/com/ruoyi/common/utils/html/EscapeUtil.java
+1
-1
ruoyi/src/main/java/com/ruoyi/framework/web/domain/TreeEntity.java
.../main/java/com/ruoyi/framework/web/domain/TreeEntity.java
+79
-0
ruoyi/src/main/java/com/ruoyi/project/system/controller/SysDeptController.java
...om/ruoyi/project/system/controller/SysDeptController.java
+1
-1
ruoyi/src/main/java/com/ruoyi/project/system/controller/SysMenuController.java
...om/ruoyi/project/system/controller/SysMenuController.java
+1
-1
ruoyi/src/main/java/com/ruoyi/project/tool/gen/controller/GenController.java
.../com/ruoyi/project/tool/gen/controller/GenController.java
+0
-1
ruoyi/src/main/java/com/ruoyi/project/tool/gen/domain/GenTable.java
...main/java/com/ruoyi/project/tool/gen/domain/GenTable.java
+3
-1
ruoyi/src/main/java/com/ruoyi/project/tool/gen/util/VelocityUtils.java
...n/java/com/ruoyi/project/tool/gen/util/VelocityUtils.java
+14
-3
ruoyi/src/main/resources/application.yml
ruoyi/src/main/resources/application.yml
+1
-1
ruoyi/src/main/resources/mybatis/monitor/SysLogininforMapper.xml
...rc/main/resources/mybatis/monitor/SysLogininforMapper.xml
+1
-0
ruoyi/src/main/resources/mybatis/monitor/SysOperLogMapper.xml
...i/src/main/resources/mybatis/monitor/SysOperLogMapper.xml
+1
-1
ruoyi/src/main/resources/vm/java/controller.java.vm
ruoyi/src/main/resources/vm/java/controller.java.vm
+11
-0
ruoyi/src/main/resources/vm/java/domain.java.vm
ruoyi/src/main/resources/vm/java/domain.java.vm
+10
-2
ruoyi/src/main/resources/vm/vue/index-tree.vue.vm
ruoyi/src/main/resources/vm/vue/index-tree.vue.vm
+410
-0
ruoyi/src/main/resources/vm/vue/index.vue.vm
ruoyi/src/main/resources/vm/vue/index.vue.vm
+4
-2
No files found.
ruoyi-ui/package.json
View file @
cb0a4b78
{
{
"name"
:
"ruoyi"
,
"name"
:
"ruoyi"
,
"version"
:
"2.
0
.0"
,
"version"
:
"2.
1
.0"
,
"description"
:
"若依管理系统"
,
"description"
:
"若依管理系统"
,
"author"
:
"若依"
,
"author"
:
"若依"
,
"license"
:
"MIT"
,
"license"
:
"MIT"
,
...
@@ -41,11 +41,12 @@
...
@@ -41,11 +41,12 @@
},
},
"dependencies"
:
{
"dependencies"
:
{
"@riophae/vue-treeselect"
:
"0.4.0"
,
"@riophae/vue-treeselect"
:
"0.4.0"
,
"vue-quill-editor"
:
"3.0.6"
,
"vue-cropper"
:
"0.4.9"
,
"axios"
:
"0.18.1"
,
"axios"
:
"0.18.1"
,
"clipboard"
:
"2.0.4"
,
"echarts"
:
"4.2.1"
,
"echarts"
:
"4.2.1"
,
"element-ui"
:
"2.11.1"
,
"element-ui"
:
"2.11.1"
,
"file-saver"
:
"2.0.1"
,
"js-beautify"
:
"^1.10.2"
,
"fuse.js"
:
"3.4.4"
,
"fuse.js"
:
"3.4.4"
,
"js-cookie"
:
"2.2.0"
,
"js-cookie"
:
"2.2.0"
,
"jsencrypt"
:
"3.0.0-rc.1"
,
"jsencrypt"
:
"3.0.0-rc.1"
,
...
@@ -55,13 +56,17 @@
...
@@ -55,13 +56,17 @@
"screenfull"
:
"4.2.0"
,
"screenfull"
:
"4.2.0"
,
"vue"
:
"2.6.10"
,
"vue"
:
"2.6.10"
,
"vue-count-to"
:
"1.0.13"
,
"vue-count-to"
:
"1.0.13"
,
"vue-quill-editor"
:
"3.0.6"
,
"vue-cropper"
:
"0.4.9"
,
"vue-router"
:
"3.0.2"
,
"vue-router"
:
"3.0.2"
,
"vue-splitpane"
:
"1.0.4"
,
"vue-splitpane"
:
"1.0.4"
,
"vuedraggable"
:
"2.20.0"
,
"vuex"
:
"3.1.0"
"vuex"
:
"3.1.0"
},
},
"devDependencies"
:
{
"devDependencies"
:
{
"@babel/core"
:
"7.0.0"
,
"@babel/core"
:
"7.0.0"
,
"@babel/register"
:
"7.0.0"
,
"@babel/register"
:
"7.0.0"
,
"@babel/parser"
:
"^7.7.4"
,
"@vue/cli-plugin-babel"
:
"3.5.3"
,
"@vue/cli-plugin-babel"
:
"3.5.3"
,
"@vue/cli-plugin-eslint"
:
"^3.9.1"
,
"@vue/cli-plugin-eslint"
:
"^3.9.1"
,
"@vue/cli-plugin-unit-jest"
:
"3.5.3"
,
"@vue/cli-plugin-unit-jest"
:
"3.5.3"
,
...
...
ruoyi-ui/src/assets/icons/svg/cascader.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=
"1576153230908"
class=
"icon"
viewBox=
"0 0 1024 1024"
version=
"1.1"
xmlns=
"http://www.w3.org/2000/svg"
p-id=
"971"
xmlns:xlink=
"http://www.w3.org/1999/xlink"
width=
"81"
height=
"81"
><defs><style
type=
"text/css"
></style></defs><path
d=
"M772.87036133 734.06115723c-43.34106445 0-80.00793458 27.93273926-93.76831055 66.57714843H475.90991211c-56.60705567 0-102.66723633-46.06018067-102.66723633-102.66723633V600.82446289h305.859375c13.76037598 38.64440918 50.42724609 66.57714844 93.76831055 66.57714844 55.12390137 0 99.94812012-44.82421875 99.94812012-99.94812012S827.9942627 467.50537109 772.87036133 467.50537109c-43.34106445 0-80.00793458 27.93273926-93.76831055 66.57714844H373.24267578V401.01062011h321.92687989c55.12390137 0 99.94812012-44.82421875 99.94812011-99.94812011V190.07312011C795.11767578 134.94921875 750.29345703 90.125 695.16955567 90.125H251.12963867C196.0057373 90.125 151.18151855 134.94921875 151.18151855 190.07312011V301.0625c0 55.12390137 44.82421875 99.94812012 99.94812012 99.94812012h55.53588867v296.96044921c0 93.35632325 75.97045898 169.32678223 169.32678224 169.32678223h203.19213866c13.76037598 38.64440918 50.42724609 66.57714844 93.76831055 66.57714844 55.12390137 0 99.94812012-44.82421875 99.94812012-99.94812012s-44.90661622-99.86572266-100.03051758-99.86572265z m0-199.89624024c18.37463379 0 33.28857422 14.91394043 33.28857422 33.28857423s-14.91394043 33.28857422-33.28857422 33.28857421-33.28857422-14.91394043-33.28857422-33.28857421 14.91394043-33.28857422 33.28857422-33.28857422zM217.75866699 301.0625V190.07312011c0-18.37463379 14.91394043-33.28857422 33.28857423-33.28857421h444.03991698c18.37463379 0 33.28857422 14.91394043 33.28857422 33.28857422V301.0625c0 18.37463379-14.91394043 33.28857422-33.28857422 33.28857422H251.12963867c-18.37463379 0-33.37097168-14.91394043-33.37097168-33.28857422z m555.11169434 566.23535156c-18.37463379 0-33.28857422-14.91394043-33.28857422-33.28857422 0-18.37463379 14.91394043-33.28857422 33.28857422-33.28857422s33.28857422 14.91394043 33.28857422 33.28857422c0.08239747 18.29223633-14.91394043 33.28857422-33.28857422 33.28857422z"
p-id=
"972"
></path></svg>
\ No newline at end of file
ruoyi-ui/src/assets/icons/svg/checkbox.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=
"1575982282951"
class=
"icon"
viewBox=
"0 0 1024 1024"
version=
"1.1"
xmlns=
"http://www.w3.org/2000/svg"
p-id=
"902"
xmlns:xlink=
"http://www.w3.org/1999/xlink"
width=
"200"
height=
"200"
><defs><style
type=
"text/css"
></style></defs><path
d=
"M828.40625 90.125H195.59375C137.375 90.125 90.125 137.375 90.125 195.59375v632.8125c0 58.21875 47.25 105.46875 105.46875 105.46875h632.8125c58.21875 0 105.46875-47.25 105.46875-105.46875V195.59375c0-58.21875-47.25-105.46875-105.46875-105.46875z m52.734375 738.28125c0 29.16-23.57015625 52.734375-52.734375 52.734375H195.59375c-29.109375 0-52.734375-23.574375-52.734375-52.734375V195.59375c0-29.109375 23.625-52.734375 52.734375-52.734375h632.8125c29.16 0 52.734375 23.625 52.734375 52.734375v632.8125z"
p-id=
"903"
></path><path
d=
"M421.52890625 709.55984375a36.28125 36.28125 0 0 1-27.55265625-12.66890625L205.17453125 476.613125a36.28546875 36.28546875 0 0 1 55.10109375-47.22890625l164.986875 192.4846875 342.16171875-298.48078125a36.2896875 36.2896875 0 0 1 47.70984375 54.68765625L445.3859375 700.6203125a36.3234375 36.3234375 0 0 1-23.85703125 8.93953125z"
p-id=
"904"
></path></svg>
\ No newline at end of file
ruoyi-ui/src/assets/icons/svg/color.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=
"1577252187056"
class=
"icon"
viewBox=
"0 0 1024 1024"
version=
"1.1"
xmlns=
"http://www.w3.org/2000/svg"
p-id=
"2508"
xmlns:xlink=
"http://www.w3.org/1999/xlink"
width=
"81"
height=
"81"
><defs><style
type=
"text/css"
></style></defs><path
d=
"M747.59340925 691.12859384c11.51396329 0.25305413 22.43746719-0.21087818 40.74171707-1.51832482 29.35428085-2.10878421 35.84933734-2.36183835 46.47761114-0.8856895 24.71495444 3.37405491 41.12129828 21.76265671 32.47528161 47.95376084-85.57447632 258.19957947-442.00123984 249.76444099-628.67084683 50.73735554-153.47733892-159.33976008-153.09775772-414.41833795 0.92786545-573.42069196 159.71934128-162.67163983 424.03439521-166.59397897 565.78689185 0.63263534 80.38686649 94.81095318 108.34934958 169.16669549 89.11723508 230.57450162-15.01454608 47.99593598-50.61082928 77.68762207-119.77896259 114.63352789-4.89237973 2.65706845-29.35428085 15.52065436-35.84933652 19.02123633-46.94154346 25.30541465-63.51659033 41.20565021-62.20914449 58.45550757 2.95229856 39.13904114 24.16667102 52.7196135 70.98168823 53.81618115z m44.41100207 50.10472101c-19.82257471 1.43397372-32.05352527 1.940082-45.63409763 1.6448519-70.34905207-1.60267593-115.98314969-30.91478165-121.38163769-101.64341492-3.45840683-46.05585397 24.7571304-73.13264758 89.24376132-107.96976837 6.7902866-3.66928501 31.37871396-16.57504688 36.06021551-19.06341229 57.69634516-30.83042972 85.15271997-53.73183005 94.76877722-84.47790866 12.77923398-40.78389304-9.10994898-98.94417051-79.24812286-181.6507002-121.17075953-142.97559219-350.14258521-139.60153647-489.2380134 2.06660824-134.49827774 138.84237405-134.79350784 362.12048163-0.42175717 501.637667 158.53842169 168.99799328 451.9968783 181.18676788 534.57688175-11.80919339-4.68150156 0.2952301-10.71262573 0.67481131-18.72600705 1.26527069z"
p-id=
"2509"
></path><path
d=
"M346.03865637 637.18588562a78.82636652 78.82636652 0 0 0 78.32025825-79.29029883c0-43.69401562-35.005823-79.29029883-78.32025825-79.29029882a78.82636652 78.82636652 0 0 0-78.36243338 79.29029882c0 43.69401562 35.005823 79.29029883 78.36243338 79.29029883z m0-51.7495729a27.07679361 27.07679361 0 0 1-26.5706845-27.54072593c0-15.30977536 11.97789643-27.54072593 26.5706845-27.54072592 14.55061295 0 26.57068533 12.23095057 26.57068533 27.54072592a27.07679361 27.07679361 0 0 1-26.57068533 27.54072593zM475.7289063 807.11174353a78.82636652 78.82636652 0 0 0 78.3624334-79.29029882c0-43.69401562-34.96364785-79.29029883-78.32025825-79.29029883a78.82636652 78.82636652 0 0 0-78.32025742 79.29029883c0 43.69401562 34.96364785 79.29029883 78.32025742 79.29029882z m0-51.74957208a27.07679361 27.07679361 0 0 1-26.57068532-27.54072674c0-15.30977536 12.06224753-27.54072593 26.57068532-27.54072593 14.59278892 0 26.57068533 12.23095057 26.57068453 27.54072593a27.07679361 27.07679361 0 0 1-26.57068453 27.54072674zM601.24376214 377.21492718a78.82636652 78.82636652 0 0 0 78.32025742-79.29029883c0-43.69401562-34.96364785-79.29029883-78.32025742-79.29029882a78.82636652 78.82636652 0 0 0-78.32025823 79.29029883c0 43.69401562 34.96364785 79.29029883 78.32025824 79.29029883z m1e-8-51.74957208a27.07679361 27.07679361 0 0 1-26.57068534-27.54072675c0-15.30977536 11.97789643-27.54072593 26.57068534-27.54072591 14.55061295 0 26.57068533 12.23095057 26.57068451 27.54072592a27.07679361 27.07679361 0 0 1-26.57068451 27.54072674zM378.80916809 433.85687983a78.82636652 78.82636652 0 0 0 78.32025824-79.29029883c0-43.69401562-34.96364785-79.29029883-78.32025824-79.29029802a78.82636652 78.82636652 0 0 0-78.32025742 79.29029802c0 43.69401562 34.96364785 79.29029883 78.32025742 79.29029883z m0-51.74957209a27.07679361 27.07679361 0 0 1-26.57068451-27.54072674c0-15.30977536 11.97789643-27.54072593 26.57068451-27.54072593 14.55061295 0 26.57068533 12.23095057 26.57068533 27.54072593a27.07679361 27.07679361 0 0 1-26.57068533 27.54072674z"
p-id=
"2510"
></path></svg>
\ No newline at end of file
ruoyi-ui/src/assets/icons/svg/component.svg
View file @
cb0a4b78
<svg
width=
"128"
height=
"128"
xmlns=
"http://www.w3.org/2000/svg"
><path
d=
"M0 0h54.857v54.857H0V0zm0 73.143h54.857V128H0V73.143zm73.143 0H128V128H73.143V73.143zm27.428-18.286C115.72 54.857 128 42.577 128 27.43 128 12.28 115.72 0 100.571 0 85.423 0 73.143 12.28 73.143 27.429c0 15.148 12.28 27.428 27.428 27.428z"
/></svg>
<?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=
"1575804206892"
class=
"icon"
viewBox=
"0 0 1024 1024"
version=
"1.1"
xmlns=
"http://www.w3.org/2000/svg"
p-id=
"3145"
xmlns:xlink=
"http://www.w3.org/1999/xlink"
width=
"200"
height=
"200"
><defs><style
type=
"text/css"
></style></defs><path
d=
"M826.56 470.016c-32.896 0-64.384 12.288-89.984 35.52l0-104.96c0-62.208-50.496-112.832-112.64-113.088L623.936 287.04 519.552 287.104C541.824 262.72 554.56 230.72 554.56 197.12c0-73.536-59.904-133.44-133.504-133.44-73.472 0-133.376 59.904-133.376 133.44 0 32.896 12.224 64.256 35.52 89.984L175.232 287.104l0 0.576C113.728 288.704 64 338.88 64 400.576l0.32 0 0.32 116.48C60.864 544.896 70.592 577.728 100.8 588.48c12.736 4.608 37.632 7.488 60.864-25.28 12.992-18.368 34.24-29.248 56.64-29.248 38.336 0 69.504 31.104 69.504 69.312 0 38.4-31.168 69.504-69.504 69.504-22.656 0-44.032-11.264-57.344-30.4C138.688 610.112 112.576 615.36 102.464 619.136c-29.824 10.752-39.104 43.776-38.144 67.392l0 160.384L64 846.912C64 909.248 114.752 960 177.216 960l446.272 0c62.4 0 113.152-50.752 113.152-113.152l0-145.024c24.384 22.272 56.384 35.008 89.984 35.008 73.536 0 133.44-59.904 133.44-133.504C960 529.92 900.096 470.016 826.56 470.016zM826.56 672.896c-22.72 0-44.032-11.264-57.344-30.4-22.272-32.384-48.448-27.136-58.56-23.36-29.824 10.752-39.04 43.776-38.08 67.392l0 160.384c0 27.136-22.016 49.152-49.152 49.152L177.216 896.064C150.08 896 128 873.984 128 846.848l0.32 0 0-145.024c24.384 22.272 56.384 35.008 89.984 35.008 73.6 0 133.504-59.904 133.504-133.504 0-73.472-59.904-133.376-133.504-133.376-32.896 0-64.32 12.288-89.984 35.52l0-104.96L128 400.512c0-27.072 22.08-49.152 49.216-49.152L177.216 351.04 334.656 350.72c3.776 0.512 7.616 0.832 11.52 0.832 24.896 0 50.752-10.816 60.032-37.056 4.544-12.736 7.424-37.568-25.344-60.736C362.624 240.768 351.68 219.52 351.68 197.12c0-38.272 31.104-69.44 69.376-69.44 38.336 0 69.504 31.168 69.504 69.44 0 22.72-11.264 44.032-30.528 57.472C427.968 276.736 433.088 302.784 436.8 313.024c10.752 29.888 43.072 39.232 67.392 38.08l119.232 0 0 0.384c27.136 0 49.152 22.08 49.152 49.152l0.256 116.48c-3.776 27.84 6.016 60.736 36.224 71.488 12.736 4.608 37.632 7.488 60.8-25.28 13.056-18.368 34.24-29.248 56.704-29.248C864.832 534.016 896 565.12 896 603.392 896 641.728 864.832 672.896 826.56 672.896z"
p-id=
"3146"
></path></svg>
\ No newline at end of file
\ No newline at end of file
ruoyi-ui/src/assets/icons/svg/date-range.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=
"1579774833889"
class=
"icon"
viewBox=
"0 0 1024 1024"
version=
"1.1"
xmlns=
"http://www.w3.org/2000/svg"
p-id=
"1376"
xmlns:xlink=
"http://www.w3.org/1999/xlink"
width=
"200"
height=
"200"
><defs><style
type=
"text/css"
></style></defs><path
d=
"M887.466667 192.853333h-100.693334V119.466667c0-10.24-6.826667-17.066667-17.066666-17.066667s-17.066667 6.826667-17.066667 17.066667v73.386666H303.786667V119.466667c0-10.24-6.826667-17.066667-17.066667-17.066667s-17.066667 6.826667-17.066667 17.066667v73.386666H168.96c-46.08 0-85.333333 37.546667-85.333333 85.333334V836.266667c0 46.08 37.546667 85.333333 85.333333 85.333333H887.466667c46.08 0 85.333333-37.546667 85.333333-85.333333V278.186667c0-47.786667-37.546667-85.333333-85.333333-85.333334z m-718.506667 34.133334h100.693333v66.56c0 10.24 6.826667 17.066667 17.066667 17.066666s17.066667-6.826667 17.066667-17.066666v-66.56h450.56v66.56c0 10.24 6.826667 17.066667 17.066666 17.066666s17.066667-6.826667 17.066667-17.066666v-66.56H887.466667c27.306667 0 51.2 22.186667 51.2 51.2v88.746666H117.76v-88.746666c0-29.013333 22.186667-51.2 51.2-51.2zM887.466667 887.466667H168.96c-27.306667 0-51.2-22.186667-51.2-51.2V401.066667H938.666667V836.266667c0 27.306667-22.186667 51.2-51.2 51.2z"
p-id=
"1377"
></path><path
d=
"M858.453333 493.226667H327.68c-10.24 0-17.066667 6.826667-17.066667 17.066666v114.346667h-116.053333c-10.24 0-17.066667 6.826667-17.066667 17.066667v133.12c0 10.24 6.826667 17.066667 17.066667 17.066666H460.8c10.24 0 17.066667-6.826667 17.066667-17.066666v-114.346667h380.586666c10.24 0 17.066667-6.826667 17.066667-17.066667v-133.12c0-10.24-6.826667-17.066667-17.066667-17.066666z m-413.013333 34.133333v97.28h-98.986667v-97.28h98.986667z m-230.4 131.413333h98.986667v98.986667h-98.986667v-98.986667z m131.413333 97.28v-97.28h98.986667v97.28h-98.986667z m133.12-228.693333h97.28v98.986667h-97.28v-98.986667z m131.413334 0h98.986666v98.986667h-98.986666v-98.986667z m230.4 97.28h-98.986667v-98.986667h98.986667v98.986667z"
p-id=
"1378"
></path></svg>
\ No newline at end of file
ruoyi-ui/src/assets/icons/svg/date.svg
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=
"1567417179372"
class=
"icon"
viewBox=
"0 0 1024 1024"
version=
"1.1"
xmlns=
"http://www.w3.org/2000/svg"
p-id=
"1155"
xmlns:xlink=
"http://www.w3.org/1999/xlink"
width=
"200"
height=
"200"
><defs><style
type=
"text/css"
></style></defs><path
d=
"M947.2 1024 76.8 1024C38.4 1024 0 992 0 953.6L0 172.8c0-38.4 38.4-70.4 76.8-70.4l38.4 0 0 102.4c0 38.4 38.4 70.4 76.8 70.4l76.8 0c44.8 0 76.8-32 76.8-70.4L345.6 102.4l313.6 0 0 102.4c0 38.4 38.4 70.4 76.8 70.4l76.8 0c44.8 0 76.8-32 76.8-70.4L889.6 102.4l38.4 0c44.8 0 76.8 32 76.8 70.4l0 787.2C1024 992 985.6 1024 947.2 1024zM352 339.2 115.2 339.2 115.2 512l236.8 0L352 339.2zM352 544 115.2 544l0 172.8 236.8 0L352 544zM352 748.8 115.2 748.8l0 172.8 236.8 0L352 748.8zM627.2 339.2 396.8 339.2 396.8 512l236.8 0L633.6 339.2zM627.2 544 396.8 544l0 172.8 236.8 0L633.6 544zM627.2 748.8 396.8 748.8l0 172.8 236.8 0L633.6 748.8zM908.8 339.2l-236.8 0L672 512l236.8 0L908.8 339.2zM908.8 544l-236.8 0 0 172.8 236.8 0L908.8 544zM908.8 748.8l-236.8 0 0 172.8 236.8 0L908.8 748.8zM787.2 236.8c-44.8 0-76.8-32-76.8-70.4L710.4 70.4c0-38.4 38.4-70.4 76.8-70.4s76.8 32 76.8 70.4l0 102.4C864 211.2 832 236.8 787.2 236.8zM236.8 236.8C192 236.8 160 211.2 160 172.8L160 70.4C160 32 192 0 236.8 0s76.8 32 76.8 70.4l0 102.4C313.6 211.2 281.6 236.8 236.8 236.8z"
p-id=
"1156"
></path></svg>
<?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=
"1577186573535"
class=
"icon"
viewBox=
"0 0 1024 1024"
version=
"1.1"
xmlns=
"http://www.w3.org/2000/svg"
p-id=
"1068"
xmlns:xlink=
"http://www.w3.org/1999/xlink"
width=
"81"
height=
"81"
><defs><style
type=
"text/css"
></style></defs><path
d=
"M479.85714249 608.42857168h64.28571502c19.28571417 0 32.14285751-12.85714249 32.14285664-32.14285751s-12.85714249-32.14285751-32.14285664-32.14285664h-64.28571504c-19.28571417 0-32.14285751 12.85714249-32.14285664 32.14285662s12.85714249 32.14285751 32.14285664 32.14285753z m-2e-8 122.14285665h64.28571504c19.28571417 0 32.14285751-12.85714249 32.14285664-32.14285665s-12.85714249-32.14285751-32.14285664-32.14285751h-64.28571504c-19.28571417 0-32.14285751 12.85714249-32.14285664 32.14285751s12.85714249 32.14285751 32.14285664 32.14285664z m353.57142921-559.28571416h-128.57142921v-32.14285664c0-19.28571417-12.85714249-32.14285751-32.14285664-32.14285753s-32.14285751 12.85714249-32.14285751 32.14285753v32.14285664h-257.14285665v-32.14285664c0-19.28571417-12.85714249-32.14285751-32.14285752-32.14285753s-32.14285751 12.85714249-32.14285664 32.14285753v32.14285664h-128.57142919c-70.71428585 0-128.57142832 57.85714249-128.57142832 122.14285751v501.42857081c0 70.71428585 57.85714249 128.57142832 128.57142832 122.14285751h642.85714335c70.71428585 0 128.57142832-57.85714249 128.57142833-122.14285751v-501.42857081c0-70.71428585-57.85714249-122.14285753-128.57142833-122.14285751z m64.28571415 623.57142832c0 32.14285751-32.14285751 64.28571415-64.28571416 64.28571504h-642.85714335c-32.14285751 0-64.28571415-25.71428583-64.28571417-64.28571504v-372.85714249h771.42857168v372.85714249z m0-437.14285664h-771.42857168v-64.28571417c0-32.14285751 32.14285751-64.28571415 64.28571417-64.28571415h128.57142919v32.14285664c0 19.28571417 12.85714249 32.14285751 32.14285664 32.14285751s32.14285751-12.85714249 32.14285753-32.14285751v-32.14285664h257.14285665v32.14285664c0 19.28571417 12.85714249 32.14285751 32.1428575 32.14285751s32.14285751-12.85714249 32.14285664-32.14285751v-32.14285664h128.57142921c32.14285751 0 64.28571415 25.71428583 64.28571415 64.28571415v64.28571417z m-610.71428583 372.85714247h64.28571415c19.28571417 0 32.14285751-12.85714249 32.14285753-32.14285664s-12.85714249-32.14285751-32.14285753-32.14285751h-64.28571415c-19.28571417 0-32.14285751 12.85714249-32.14285751 32.14285751s12.85714249 32.14285751 32.14285751 32.14285665z m385.71428583-122.14285664h64.28571417c19.28571417 0 32.14285751-12.85714249 32.14285751-32.14285751s-12.85714249-32.14285751-32.14285751-32.14285664h-64.28571415c-19.28571417 0-32.14285751 12.85714249-32.14285753 32.14285664s12.85714249 32.14285751 32.14285753 32.14285751z m-385.71428583 0h64.28571415c19.28571417 0 32.14285751-12.85714249 32.14285753-32.14285751s-12.85714249-32.14285751-32.14285753-32.14285664h-64.28571415c-19.28571417 0-32.14285751 12.85714249-32.14285751 32.14285664s12.85714249 32.14285751 32.14285751 32.14285751z m385.71428583 122.14285665h64.28571417c19.28571417 0 32.14285751-12.85714249 32.14285751-32.14285665s-12.85714249-32.14285751-32.14285751-32.14285751h-64.28571415c-19.28571417 0-32.14285751 12.85714249-32.14285753 32.14285751s12.85714249 32.14285751 32.14285753 32.14285665z"
p-id=
"1069"
></path></svg>
\ No newline at end of file
\ No newline at end of file
ruoyi-ui/src/assets/icons/svg/github.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=
"1581238998885"
class=
"icon"
viewBox=
"0 0 1024 1024"
version=
"1.1"
xmlns=
"http://www.w3.org/2000/svg"
p-id=
"4187"
xmlns:xlink=
"http://www.w3.org/1999/xlink"
width=
"200"
height=
"200"
><defs><style
type=
"text/css"
></style></defs><path
d=
"M511.542857 14.057143C228.914286 13.942857 0 242.742857 0 525.142857 0 748.457143 143.2 938.285714 342.628571 1008c26.857143 6.742857 22.742857-12.342857 22.742858-25.371429v-88.571428c-155.085714 18.171429-161.371429-84.457143-171.771429-101.6C172.571429 756.571429 122.857143 747.428571 137.714286 730.285714c35.314286-18.171429 71.314286 4.571429 113.028571 66.171429 30.171429 44.685714 89.028571 37.142857 118.857143 29.714286 6.514286-26.857143 20.457143-50.857143 39.657143-69.485715-160.685714-28.8-227.657143-126.857143-227.657143-243.428571 0-56.571429 18.628571-108.571429 55.2-150.514286-23.314286-69.142857 2.171429-128.342857 5.6-137.142857 66.4-5.942857 135.428571 47.542857 140.8 51.771429 37.714286-10.171429 80.8-15.542857 129.028571-15.542858 48.457143 0 91.657143 5.6 129.714286 15.885715 12.914286-9.828571 76.914286-55.771429 138.628572-50.171429 3.314286 8.8 28.228571 66.628571 6.285714 134.857143 37.028571 42.057143 55.885714 94.514286 55.885714 151.2 0 116.8-67.428571 214.971429-228.571428 243.314286a145.714286 145.714286 0 0 1 43.542857 104v128.571428c0.914286 10.285714 0 20.457143 17.142857 20.457143 202.4-68.228571 348.114286-259.428571 348.114286-484.685714 0-282.514286-229.028571-511.2-511.428572-511.2z"
p-id=
"4188"
></path></svg>
\ No newline at end of file
ruoyi-ui/src/assets/icons/svg/input.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=
"1575802859706"
class=
"icon"
viewBox=
"0 0 1024 1024"
version=
"1.1"
xmlns=
"http://www.w3.org/2000/svg"
p-id=
"3102"
xmlns:xlink=
"http://www.w3.org/1999/xlink"
width=
"200"
height=
"200"
><defs><style
type=
"text/css"
></style></defs><path
d=
"M896 224H128c-35.2 0-64 28.8-64 64v448c0 35.2 28.8 64 64 64h768c35.2 0 64-28.8 64-64V288c0-35.2-28.8-64-64-64z m0 480c0 19.2-12.8 32-32 32H160c-19.2 0-32-12.8-32-32V320c0-19.2 12.8-32 32-32h704c19.2 0 32 12.8 32 32v384z"
p-id=
"3103"
></path><path
d=
"M224 352c-19.2 0-32 12.8-32 32v256c0 16 12.8 32 32 32s32-12.8 32-32V384c0-16-12.8-32-32-32z"
p-id=
"3104"
></path></svg>
\ No newline at end of file
ruoyi-ui/src/assets/icons/svg/number.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=
"1575802851180"
class=
"icon"
viewBox=
"0 0 1024 1024"
version=
"1.1"
xmlns=
"http://www.w3.org/2000/svg"
p-id=
"2867"
xmlns:xlink=
"http://www.w3.org/1999/xlink"
width=
"200"
height=
"200"
><defs><style
type=
"text/css"
></style></defs><path
d=
"M279.272727 791.272727h512a46.545455 46.545455 0 0 1 0 93.090909H279.272727a46.545455 46.545455 0 0 1 0-93.090909z m33.838546-617.984V651.636364H193.722182V395.170909c0-37.003636-0.884364-59.298909-2.653091-66.746182a24.948364 24.948364 0 0 0-14.615273-16.989091c-8.005818-3.863273-25.786182-5.771636-53.341091-5.771636h-11.822545v-55.854545c57.716364-12.381091 101.562182-37.888 131.490909-76.520728h70.283636z m303.709091 396.8V651.636364H354.164364v-68.235637c77.777455-127.255273 124.043636-206.010182 138.705454-236.218182 14.661818-30.254545 22.016-53.853091 22.016-70.74909 0-13.032727-2.234182-22.714182-6.656-29.137455-4.421818-6.376727-11.170909-9.588364-20.247273-9.588364a22.248727 22.248727 0 0 0-20.200727 10.612364c-4.468364 7.121455-6.656 21.178182-6.656 42.263273v45.521454H354.164364v-17.454545c0-26.763636 1.396364-47.941818 4.142545-63.348364 2.746182-15.499636 9.541818-30.72 20.386909-45.661091 10.798545-14.987636 24.901818-26.298182 42.216727-33.978182 17.361455-7.68 38.167273-11.543273 62.37091-11.543272 47.476364 0 83.316364 11.776 107.706181 35.328 24.296727 23.552 36.445091 53.341091 36.445091 89.367272 0 27.368727-6.842182 56.32-20.48 86.853819-13.730909 30.533818-54.039273 95.325091-121.018182 194.420363h130.885819z m270.615272-189.393454c18.152727 6.097455 31.650909 16.104727 40.494546 29.975272 8.843636 13.917091 13.312 46.452364 13.312 97.652364 0 38.027636-4.328727 67.490909-13.032727 88.529455-8.657455 20.945455-23.598545 36.910545-44.869819 47.848727-21.271273 10.938182-48.593455 16.384-81.873454 16.384-37.794909 0-67.490909-6.330182-89.088-19.083636-21.550545-12.660364-35.746909-28.253091-42.542546-46.638546-6.795636-18.432-10.193455-50.362182-10.193454-95.883636v-37.841455h119.389091v77.730909c0 20.666182 1.210182 33.838545 3.723636 39.424 2.420364 5.585455 7.912727 8.424727 16.337455 8.424728 9.309091 0 15.36-3.537455 18.338909-10.612364 2.932364-7.121455 4.421818-25.6 4.421818-55.575273v-33.047273c0-18.338909-2.048-31.744-6.190546-40.215272a30.72 30.72 0 0 0-18.338909-16.709818c-8.052364-2.653091-23.738182-4.189091-46.964363-4.561455V357.050182c28.392727 0 45.893818-1.070545 52.596363-3.258182a22.946909 22.946909 0 0 0 14.475637-14.149818c2.932364-7.307636 4.421818-18.711273 4.421818-34.257455v-26.624c0-16.756364-1.722182-27.741091-5.12-33.047272-3.490909-5.352727-8.843636-8.005818-16.151273-8.005819-8.285091 0-13.963636 2.792727-16.989091 8.378182-3.025455 5.632-4.561455 17.640727-4.561454 35.933091v39.284364h-119.389091v-40.773818c0-45.661091 10.472727-76.567273 31.325091-92.625455 20.898909-16.058182 54.085818-24.064 99.607272-24.064 56.878545 0 95.511273 11.170909 115.805091 33.373091 20.293818 22.248727 30.394182 53.201455 30.394182 92.765091 0 26.810182-3.630545 46.173091-10.891636 58.088727-7.307636 11.915636-20.107636 22.807273-38.446546 32.628364z"
p-id=
"2868"
></path></svg>
\ No newline at end of file
ruoyi-ui/src/assets/icons/svg/password.svg
View file @
cb0a4b78
<svg
width=
"128"
height=
"128"
xmlns=
"http://www.w3.org/2000/svg"
><path
d=
"M108.8 44.322H89.6v-5.36c0-9.04-3.308-24.163-25.6-24.163-23.145 0-25.6 16.881-25.6 24.162v5.361H19.2v-5.36C19.2 15.281 36.798 0 64 0c27.202 0 44.8 15.281 44.8 38.961v5.361zm-32 39.356c0-5.44-5.763-9.832-12.8-9.832-7.037 0-12.8 4.392-12.8 9.832 0 3.682 2.567 6.808 6.407 8.477v11.205c0 2.718 2.875 4.962 6.4 4.962 3.524 0 6.4-2.244 6.4-4.962V92.155c3.833-1.669 6.393-4.795 6.393-8.477zM128 64v49.201c0 8.158-8.645 14.799-19.2 14.799H19.2C8.651 128 0 121.359 0 113.201V64c0-8.153 8.645-14.799 19.2-14.799h89.6c10.555 0 19.2 6.646 19.2 14.799z"
/></svg>
<?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=
"1575802846045"
class=
"icon"
viewBox=
"0 0 1024 1024"
version=
"1.1"
xmlns=
"http://www.w3.org/2000/svg"
p-id=
"2750"
xmlns:xlink=
"http://www.w3.org/1999/xlink"
width=
"200"
height=
"200"
><defs><style
type=
"text/css"
></style></defs><path
d=
"M868.593046 403.832442c-30.081109-28.844955-70.037123-44.753273-112.624057-44.753273L265.949606 359.079168c-42.554188 0-82.510202 15.908318-112.469538 44.690852-30.236652 28.782533-46.857191 67.222007-46.857191 108.198258l0 294.079782c0 40.977273 16.619516 79.414701 46.702672 108.136859 29.959336 28.844955 70.069869 44.814672 112.624057 44.814672l490.019383 0c42.585911 0 82.696444-15.969717 112.624057-44.814672 30.082132-28.844955 46.579875-67.222007 46.579875-108.136859L915.172921 511.968278C915.171897 471.053426 898.675178 432.677397 868.593046 403.832442zM841.821309 806.049083c0 22.098297-8.882298 42.772152-25.099654 58.306964-16.154935 15.661701-37.81935 24.203238-60.752666 24.203238L265.949606 888.559285c-22.934339 0-44.567032-8.54256-60.877509-24.264637-16.186657-15.474436-25.067932-36.148291-25.067932-58.246589L180.004165 511.968278c0-22.035876 8.881274-42.772152 25.192775-58.307987 16.186657-15.536858 37.81935-24.139793 60.753689-24.139793l490.019383 0c22.933315 0 44.597731 8.602935 60.752666 24.139793 16.21838 15.535835 25.099654 36.272112 25.099654 58.307987L841.822332 806.049083zM510.974136 135.440715c114.914216 0 208.318536 89.75214 208.318536 200.055338l73.350588 0c0-149.113109-126.366036-270.496667-281.669124-270.496667-155.333788 0-281.699824 121.383558-281.699824 270.496667l73.350588 0C302.623877 225.193879 396.059919 135.440715 510.974136 135.440715zM474.299865 747.244792l73.350588 0L547.650453 629.576859l-73.350588 0L474.299865 747.244792z"
p-id=
"2751"
></path></svg>
\ No newline at end of file
\ No newline at end of file
ruoyi-ui/src/assets/icons/svg/question.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=
"1581238842264"
class=
"icon"
viewBox=
"0 0 1024 1024"
version=
"1.1"
xmlns=
"http://www.w3.org/2000/svg"
p-id=
"1409"
xmlns:xlink=
"http://www.w3.org/1999/xlink"
width=
"200"
height=
"200"
><defs><style
type=
"text/css"
></style></defs><path
d=
"M512 0C229.233778 0 0 229.233778 0 512s229.233778 512 512 512 512-229.233778 512-512A512 512 0 0 0 512 0z m0 938.666667C276.366222 938.666667 85.333333 747.633778 85.333333 512 85.333333 276.366222 276.366222 85.333333 512 85.333333c235.633778 0 426.666667 191.032889 426.666667 426.666667a426.666667 426.666667 0 0 1-426.666667 426.666667z m0-717.653334a170.666667 170.666667 0 0 0-170.666667 170.666667 42.666667 42.666667 0 0 0 85.333334 0 85.333333 85.333333 0 1 1 85.333333 85.333333 42.666667 42.666667 0 0 0-42.666667 42.666667v111.36a42.666667 42.666667 0 0 0 85.333334 0v-74.24A170.666667 170.666667 0 0 0 512 221.013333z m-42.666667 542.293334a42.666667 42.666667 0 1 0 85.333334 0 42.666667 42.666667 0 0 0-85.333334 0z"
p-id=
"1410"
></path></svg>
\ No newline at end of file
ruoyi-ui/src/assets/icons/svg/radio.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=
"1575966775973"
class=
"icon"
viewBox=
"0 0 1024 1024"
version=
"1.1"
xmlns=
"http://www.w3.org/2000/svg"
p-id=
"879"
xmlns:xlink=
"http://www.w3.org/1999/xlink"
width=
"81"
height=
"81"
><defs><style
type=
"text/css"
></style></defs><path
d=
"M507.39346659 71.84873358c241.53533667 0 437.39770766 195.85422109 437.39770767 437.37442191 0 241.53766571-195.86237099 437.38955776-437.39770767 437.38955776-241.50040803 0-437.34997219-195.85189205-437.34997219-437.38955776C70.0434944 267.70295467 265.89189347 71.84873358 507.39346659 71.84873358L507.39346659 71.84873358zM507.39346659 282.81899805c-125.00686734 0-226.37039389 101.38914133-226.37039388 226.41813048 0 125.01268821 101.36352768 226.39717262 226.37039388 226.39717262 125.04295993 0 226.42395136-101.38448441 226.42395136-226.39717262C733.81625401 384.20813938 632.43642653 282.81899805 507.39346659 282.81899805L507.39346659 282.81899805zM507.39346659 120.78172615c-214.46664192 0-388.42047261 173.95150279-388.4204726 388.44026539 0 214.51204949 173.95499463 388.46122325 388.4204726 388.46122325 214.52369237 0 388.46005817-173.94800981 388.46005818-388.46122325C895.85236082 294.73322894 721.91715897 120.78172615 507.39346659 120.78172615z"
p-id=
"880"
></path></svg>
\ No newline at end of file
ruoyi-ui/src/assets/icons/svg/rate.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=
"1577246781606"
class=
"icon"
viewBox=
"0 0 1069 1024"
version=
"1.1"
xmlns=
"http://www.w3.org/2000/svg"
p-id=
"1098"
xmlns:xlink=
"http://www.w3.org/1999/xlink"
width=
"84.5595703125"
height=
"81"
><defs><style
type=
"text/css"
></style></defs><path
d=
"M633.72929961 378.02038203l9.49872568 18.68789795 20.78025469 2.79745225 206.61592412 27.33248408a11.46496817 11.46496817 0 0 1 6.6095543 19.47324902l-147.2675168 147.35350284-14.89299345 14.89299345 3.8006376 20.68280244 37.84585956 204.89044571a11.46496817 11.46496817 0 0 1-16.4808914 12.2961788L554.68980898 751.84713388l-18.68789794-9.49299345-18.48726123 9.99171915-183.23885392 99.34968163a11.46496817 11.46496817 0 0 1-16.78471347-11.8662416l32.5433127-205.79617881 3.29617793-20.78598692-15.19108243-14.49172002-151.03375839-143.48407587a11.46496817 11.46496817 0 0 1 6.09936328-19.63949062l205.79617881-32.63503185 20.78598691-3.2961788L428.87898125 380.72038203 518.59235674 192.64331182a11.46496817 11.46496817 0 0 1 20.56815264-0.26369385l94.56879023 185.63503183zM496.64840732 85.52038203l-121.75796162 254.98089229L95.76433145 384.76178369A34.3949045 34.3949045 0 0 0 77.46050938 443.66879023l204.87324901 194.66369385-44.16879023 279.1146498a34.3949045 34.3949045 0 0 0 50.36560489 35.61592325l248.4-134.67898038 251.84522285 128.27579591a34.3949045 34.3949045 0 0 0 49.43694287-36.89426777l-51.30573223-277.85350284 199.73120977-199.90891758a34.3949045 34.3949045 0 0 0-19.82866201-58.40827998l-280.11783428-37.03184736L558.32993633 84.71210205a34.3949045 34.3949045 0 0 0-61.68152901 0.80254775z"
p-id=
"1099"
></path></svg>
\ No newline at end of file
ruoyi-ui/src/assets/icons/svg/row.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=
"1579339929870"
class=
"icon"
viewBox=
"0 0 1024 1024"
version=
"1.1"
xmlns=
"http://www.w3.org/2000/svg"
p-id=
"1182"
xmlns:xlink=
"http://www.w3.org/1999/xlink"
width=
"200"
height=
"200"
><defs><style
type=
"text/css"
></style></defs><path
d=
"M152 854.856875h325.7146875V237.715625H134.856875v600q0 6.99375 5.0746875 12.0684375T152 854.856875z m737.143125-17.1421875v-600H546.284375v617.1421875H872q6.99375 0 12.0684375-5.07375t5.0746875-12.0684375z m68.5715625-651.429375V837.715625q0 35.3821875-25.16625 60.5484375T872 923.4284375H152q-35.383125 0-60.5484375-25.1653125T66.284375 837.7146875V186.284375q0-35.3821875 25.16625-60.5484375T152 100.5715625h720q35.383125 0 60.5484375 25.1653125t25.16625 60.5484375z"
p-id=
"1183"
></path></svg>
\ No newline at end of file
ruoyi-ui/src/assets/icons/svg/select.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=
"1575803481213"
class=
"icon"
viewBox=
"0 0 1024 1024"
version=
"1.1"
xmlns=
"http://www.w3.org/2000/svg"
p-id=
"804"
xmlns:xlink=
"http://www.w3.org/1999/xlink"
width=
"200"
height=
"200"
><defs><style
type=
"text/css"
></style></defs><path
d=
"M62 511.97954521C62 263.86590869 263.90681826 62 511.97954521 62s449.97954521 201.825 449.97954521 449.97954521c0 248.19545479-201.90681826 449.97954521-449.97954521 449.97954521C263.90681826 962 62 760.175 62 511.97954521M901.98636348 511.97954521c0-215.24318174-175.00909131-390.41590869-390.00681827-390.41590869-215.03863652 0-389.96590869 175.17272695-389.96590868 390.41590869 0 215.28409131 175.00909131 390.45681826 389.96590868 390.45681826C727.01818174 902.47727305 901.98636348 727.30454521 901.98636348 511.97954521M264.17272695 430.28409131c0-5.76818174 2.12727305-11.51590869 6.64772696-15.87272696 8.71363652-8.75454521 22.88863652-8.75454521 31.725 0l209.4340913 208.22727305L721.45454521 414.53409131c8.75454521-8.71363652 22.97045479-8.71363652 31.90909132 0 8.71363652 8.75454521 8.71363652 22.88863652 0 31.60227304L511.97954521 685.74090869 270.71818174 446.01363653C266.27954521 441.77954521 264.17272695 436.05227305 264.17272695 430.28409131"
p-id=
"805"
></path></svg>
\ No newline at end of file
ruoyi-ui/src/assets/icons/svg/slider.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=
"1577185310368"
class=
"icon"
viewBox=
"0 0 1024 1024"
version=
"1.1"
xmlns=
"http://www.w3.org/2000/svg"
p-id=
"1238"
xmlns:xlink=
"http://www.w3.org/1999/xlink"
width=
"81"
height=
"81"
><defs><style
type=
"text/css"
></style></defs><path
d=
"M951.453125 476.84375H523.671875a131.8359375 131.8359375 0 0 0-254.1796875 0H72.546875v70.3125h196.9453125a131.8359375 131.8359375 0 0 0 254.1796875 0H951.453125z"
p-id=
"1239"
></path></svg>
\ No newline at end of file
ruoyi-ui/src/assets/icons/svg/switch.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=
"1576042673958"
class=
"icon"
viewBox=
"0 0 1024 1024"
version=
"1.1"
xmlns=
"http://www.w3.org/2000/svg"
p-id=
"1110"
xmlns:xlink=
"http://www.w3.org/1999/xlink"
width=
"81"
height=
"81"
><defs><style
type=
"text/css"
></style></defs><path
d=
"M692 792H332c-150 0-270-120-270-270s120-270 270-270h360c150 0 270 120 270 270 0 147-120 270-270 270zM332 312c-117 0-210 93-210 210s93 210 210 210h360c117 0 210-93 210-210s-93-210-210-210H332z"
p-id=
"1111"
></path><path
d=
"M341 522m-150 0a150 150 0 1 0 300 0 150 150 0 1 0-300 0Z"
p-id=
"1112"
></path></svg>
\ No newline at end of file
ruoyi-ui/src/assets/icons/svg/textarea.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=
"1575802855098"
class=
"icon"
viewBox=
"0 0 1024 1024"
version=
"1.1"
xmlns=
"http://www.w3.org/2000/svg"
p-id=
"2984"
xmlns:xlink=
"http://www.w3.org/1999/xlink"
width=
"200"
height=
"200"
><defs><style
type=
"text/css"
></style></defs><path
d=
"M896 160H128c-35.2 0-64 28.8-64 64v576c0 35.2 28.8 64 64 64h768c35.2 0 64-28.8 64-64V224c0-35.2-28.8-64-64-64z m0 608c0 16-12.8 32-32 32H160c-19.2 0-32-12.8-32-32V256c0-16 12.8-32 32-32h704c19.2 0 32 12.8 32 32v512z"
p-id=
"2985"
></path><path
d=
"M224 288c-19.2 0-32 12.8-32 32v256c0 16 12.8 32 32 32s32-12.8 32-32V320c0-16-12.8-32-32-32z m608 480c19.2 0 32-12.8 32-32V608L704 768h128z"
p-id=
"2986"
></path></svg>
\ No newline at end of file
ruoyi-ui/src/assets/icons/svg/time-range.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=
"1579774825624"
class=
"icon"
viewBox=
"0 0 1024 1024"
version=
"1.1"
xmlns=
"http://www.w3.org/2000/svg"
p-id=
"1248"
xmlns:xlink=
"http://www.w3.org/1999/xlink"
width=
"200"
height=
"200"
><defs><style
type=
"text/css"
></style></defs><path
d=
"M498.595712 482.290351 345.420077 482.290351l0 57.307194 210.477712 0L555.897789 274.196942l-57.301054 0L498.596735 482.290351zM498.595712 482.290351"
p-id=
"1249"
></path><path
d=
"M577.685002 644.98478l379.879913 0 0 57.302077L577.685002 702.286858 577.685002 644.98478 577.685002 644.98478zM577.685002 644.98478"
p-id=
"1250"
></path><path
d=
"M577.685002 773.764795l379.879913 0 0 57.307194L577.685002 831.071989 577.685002 773.764795 577.685002 773.764795zM577.685002 773.764795"
p-id=
"1251"
></path><path
d=
"M577.685002 902.549927l379.879913 0 0 57.307194L577.685002 959.857121 577.685002 902.549927 577.685002 902.549927zM577.685002 902.549927"
p-id=
"1252"
></path><path
d=
"M102.523001 382.290823c4.450359 2.615571 9.470699 3.954055 14.530948 3.954055 2.969635 0 5.952572-0.461511 8.836249-1.394766l190.809767-61.886489c15.052834-4.882194 23.297612-21.040199 18.415418-36.08894-4.882194-15.052834-21.040199-23.297612-36.093033-18.415418L175.676092 308.458257c15.994276-26.115797 35.170011-50.537 57.370639-72.743768 73.767074-73.767074 171.845857-114.388237 276.16783-114.388237 104.32095 0 202.39564 40.622186 276.16169 114.388237s114.393353 171.845857 114.393353 276.16783c0 26.427906-2.615571 52.449559-7.709589 77.780481l58.302871 0c4.464685-25.499767 6.708795-51.470255 6.708795-77.780481 0-60.449767-11.845793-119.102608-35.204803-174.336584-22.559808-53.334719-54.850236-101.226472-95.968725-142.349055-41.122583-41.122583-89.017406-73.408917-142.348032-95.968725C628.317169 75.866898 569.659211 64.021106 509.215584 64.021106c-60.448744 0-119.106702 11.845793-174.336584 35.207873-53.334719 22.559808-101.230566 54.846142-142.349055 95.968725-23.980157 23.980157-44.934398 50.278103-62.727647 78.601172l-20.738323-105.655342c-3.043313-15.527648-18.105357-25.642007-33.631982-22.599717-15.527648 3.048429-25.64303 18.105357-22.599717 33.637098l36.102243 183.932126C90.51348 371.153158 95.460142 378.13313 102.523001 382.290823L102.523001 382.290823zM102.523001 382.290823"
p-id=
"1253"
></path><path
d=
"M126.020158 587.9416 67.768453 587.9416c5.759167 33.679054 15.368012 66.544579 28.789697 98.278327 22.559808 53.333696 54.850236 101.225449 95.971795 142.348032 41.122583 41.122583 89.014336 73.408917 142.349055 95.968725 54.112432 22.88829 111.517863 34.71157 170.668031 35.18229L505.547031 902.395408c-102.94972-0.941442-199.594851-41.445948-272.499277-114.349351C177.545672 732.543975 140.810003 663.275355 126.020158 587.9416L126.020158 587.9416zM126.020158 587.9416"
p-id=
"1254"
></path></svg>
\ No newline at end of file
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
>
<
template
>
<div>
<div>
<svg-icon
icon-class=
"
download"
@
click=
"handleDownload
"
/>
<svg-icon
icon-class=
"
github"
@
click=
"goto
"
/>
</div>
</div>
</
template
>
</
template
>
<
script
>
<
script
>
export
default
{
export
default
{
name
:
'
RuoYi
'
,
name
:
'
RuoYi
Git
'
,
data
()
{
data
()
{
return
{
return
{
url
:
'
https://gitee.com/y_project/RuoYi-Vue
'
url
:
'
https://gitee.com/y_project/RuoYi-Vue
'
}
}
},
},
methods
:
{
methods
:
{
handleDownload
()
{
goto
()
{
window
.
open
(
this
.
url
)
window
.
open
(
this
.
url
)
}
}
}
}
...
...
ruoyi-ui/src/layout/components/Navbar.vue
View file @
cb0a4b78
...
@@ -8,8 +8,12 @@
...
@@ -8,8 +8,12 @@
<template
v-if=
"device!=='mobile'"
>
<template
v-if=
"device!=='mobile'"
>
<search
id=
"header-search"
class=
"right-menu-item"
/>
<search
id=
"header-search"
class=
"right-menu-item"
/>
<el-tooltip
content=
"下载源码"
effect=
"dark"
placement=
"bottom"
>
<el-tooltip
content=
"源码地址"
effect=
"dark"
placement=
"bottom"
>
<ruo-yi
id=
"ruoyi"
class=
"right-menu-item hover-effect"
/>
<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>
</el-tooltip>
<screenfull
id=
"screenfull"
class=
"right-menu-item hover-effect"
/>
<screenfull
id=
"screenfull"
class=
"right-menu-item hover-effect"
/>
...
@@ -48,7 +52,8 @@ import Hamburger from '@/components/Hamburger'
...
@@ -48,7 +52,8 @@ import Hamburger from '@/components/Hamburger'
import
Screenfull
from
'
@/components/Screenfull
'
import
Screenfull
from
'
@/components/Screenfull
'
import
SizeSelect
from
'
@/components/SizeSelect
'
import
SizeSelect
from
'
@/components/SizeSelect
'
import
Search
from
'
@/components/HeaderSearch
'
import
Search
from
'
@/components/HeaderSearch
'
import
RuoYi
from
'
@/components/RuoYi
'
import
RuoYiGit
from
'
@/components/RuoYi/Git
'
import
RuoYiDoc
from
'
@/components/RuoYi/Doc
'
export
default
{
export
default
{
components
:
{
components
:
{
...
@@ -57,7 +62,8 @@ export default {
...
@@ -57,7 +62,8 @@ export default {
Screenfull
,
Screenfull
,
SizeSelect
,
SizeSelect
,
Search
,
Search
,
RuoYi
RuoYiGit
,
RuoYiDoc
},
},
computed
:
{
computed
:
{
...
mapGetters
([
...
mapGetters
([
...
...
ruoyi-ui/src/main.js
View file @
cb0a4b78
...
@@ -18,7 +18,7 @@ import './assets/icons' // icon
...
@@ -18,7 +18,7 @@ import './assets/icons' // icon
import
'
./permission
'
// permission control
import
'
./permission
'
// permission control
import
{
getDicts
}
from
"
@/api/system/dict/data
"
;
import
{
getDicts
}
from
"
@/api/system/dict/data
"
;
import
{
getConfigKey
}
from
"
@/api/system/config
"
;
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
"
;
import
Pagination
from
"
@/components/Pagination
"
;
// 全局方法挂载
// 全局方法挂载
...
@@ -29,6 +29,7 @@ Vue.prototype.resetForm = resetForm
...
@@ -29,6 +29,7 @@ Vue.prototype.resetForm = resetForm
Vue
.
prototype
.
addDateRange
=
addDateRange
Vue
.
prototype
.
addDateRange
=
addDateRange
Vue
.
prototype
.
selectDictLabel
=
selectDictLabel
Vue
.
prototype
.
selectDictLabel
=
selectDictLabel
Vue
.
prototype
.
download
=
download
Vue
.
prototype
.
download
=
download
Vue
.
prototype
.
handleTree
=
handleTree
Vue
.
prototype
.
msgSuccess
=
function
(
msg
)
{
Vue
.
prototype
.
msgSuccess
=
function
(
msg
)
{
this
.
$message
({
showClose
:
true
,
message
:
msg
,
type
:
"
success
"
});
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) {
...
@@ -315,3 +315,72 @@ export function removeClass(ele, cls) {
ele
.
className
=
ele
.
className
.
replace
(
reg
,
'
'
)
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
'
import
store
from
'
@/store
'
/**
/**
* @param {Array} value
* 字符权限校验
* @param {Array} value 校验值
* @returns {Boolean}
* @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
)
{
if
(
value
&&
value
instanceof
Array
&&
value
.
length
>
0
)
{
const
roles
=
store
.
getters
&&
store
.
getters
.
roles
const
roles
=
store
.
getters
&&
store
.
getters
.
roles
const
permissionRoles
=
value
const
permissionRoles
=
value
const
has
Permission
=
roles
.
some
(
role
=>
{
const
has
Role
=
roles
.
some
(
role
=>
{
return
permissionRoles
.
includes
(
role
)
return
permissionRoles
.
includes
(
role
)
})
})
if
(
!
has
Permission
)
{
if
(
!
has
Role
)
{
return
false
return
false
}
}
return
true
return
true
}
else
{
}
else
{
console
.
error
(
`need roles! Like
v-permission
="['admin','editor']"`
)
console
.
error
(
`need roles! Like
checkRole
="['admin','editor']"`
)
return
false
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) {
...
@@ -100,4 +100,33 @@ export function praseStrEmpty(str) {
return
""
;
return
""
;
}
}
return
str
;
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 @@
...
@@ -88,7 +88,7 @@
<el-row>
<el-row>
<el-col
:span=
"24"
v-if=
"form.parentId !== 0"
>
<el-col
:span=
"24"
v-if=
"form.parentId !== 0"
>
<el-form-item
label=
"上级部门"
prop=
"parentId"
>
<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-form-item>
</el-col>
</el-col>
<el-col
:span=
"12"
>
<el-col
:span=
"12"
>
...
@@ -138,7 +138,7 @@
...
@@ -138,7 +138,7 @@
</template>
</template>
<
script
>
<
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
Treeselect
from
"
@riophae/vue-treeselect
"
;
import
"
@riophae/vue-treeselect/dist/vue-treeselect.css
"
;
import
"
@riophae/vue-treeselect/dist/vue-treeselect.css
"
;
...
@@ -205,14 +205,25 @@ export default {
...
@@ -205,14 +205,25 @@ export default {
getList
()
{
getList
()
{
this
.
loading
=
true
;
this
.
loading
=
true
;
listDept
(
this
.
queryParams
).
then
(
response
=>
{
listDept
(
this
.
queryParams
).
then
(
response
=>
{
this
.
deptList
=
response
.
data
;
this
.
deptList
=
this
.
handleTree
(
response
.
data
,
"
deptId
"
)
;
this
.
loading
=
false
;
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
()
{
getTreeselect
()
{
treeselec
t
().
then
(
response
=>
{
listDep
t
().
then
(
response
=>
{
this
.
deptOptions
=
response
.
data
;
this
.
deptOptions
=
this
.
handleTree
(
response
.
data
,
"
deptId
"
)
;
});
});
},
},
// 字典状态字典翻译
// 字典状态字典翻译
...
...
ruoyi-ui/src/views/system/menu/index.vue
View file @
cb0a4b78
...
@@ -82,6 +82,7 @@
...
@@ -82,6 +82,7 @@
<treeselect
<treeselect
v-model=
"form.parentId"
v-model=
"form.parentId"
:options=
"menuOptions"
:options=
"menuOptions"
:normalizer=
"normalizer"
:show-count=
"true"
:show-count=
"true"
placeholder=
"选择上级菜单"
placeholder=
"选择上级菜单"
/>
/>
...
@@ -173,7 +174,7 @@
...
@@ -173,7 +174,7 @@
</template>
</template>
<
script
>
<
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
Treeselect
from
"
@riophae/vue-treeselect
"
;
import
"
@riophae/vue-treeselect/dist/vue-treeselect.css
"
;
import
"
@riophae/vue-treeselect/dist/vue-treeselect.css
"
;
import
IconSelect
from
"
@/components/IconSelect
"
;
import
IconSelect
from
"
@/components/IconSelect
"
;
...
@@ -228,16 +229,27 @@ export default {
...
@@ -228,16 +229,27 @@ export default {
getList
()
{
getList
()
{
this
.
loading
=
true
;
this
.
loading
=
true
;
listMenu
(
this
.
queryParams
).
then
(
response
=>
{
listMenu
(
this
.
queryParams
).
then
(
response
=>
{
this
.
menuList
=
response
.
data
;
this
.
menuList
=
this
.
handleTree
(
response
.
data
,
"
menuId
"
)
;
this
.
loading
=
false
;
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
()
{
getTreeselect
()
{
treeselect
().
then
(
response
=>
{
listMenu
().
then
(
response
=>
{
this
.
menuOptions
=
[];
this
.
menuOptions
=
[];
const
menu
=
{
id
:
0
,
label
:
'
主类目
'
,
children
:
[]
};
const
menu
=
{
menuId
:
0
,
menuName
:
'
主类目
'
,
children
:
[]
};
menu
.
children
=
response
.
data
;
menu
.
children
=
this
.
handleTree
(
response
.
data
,
"
menuId
"
)
;
this
.
menuOptions
.
push
(
menu
);
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
>
ruoyi-ui/src/views/tool/build/IconsDialog.vue
0 → 100644
View file @
cb0a4b78
<
template
>
<div
class=
"icon-dialog"
>
<el-dialog
v-bind=
"$attrs"
width=
"980px"
:modal-append-to-body=
"false"
v-on=
"$listeners"
@
open=
"onOpen"
@
close=
"onClose"
>
<div
slot=
"title"
>
选择图标
<el-input
v-model=
"key"
size=
"mini"
:style=
"
{width: '260px'}"
placeholder="请输入图标名称"
prefix-icon="el-icon-search"
clearable
/>
</div>
<ul
class=
"icon-ul"
>
<li
v-for=
"icon in iconList"
:key=
"icon"
:class=
"active===icon?'active-item':''"
@
click=
"onSelect(icon)"
>
<i
:class=
"icon"
/>
<div>
{{
icon
}}
</div>
</li>
</ul>
</el-dialog>
</div>
</
template
>
<
script
>
import
iconList
from
'
@/utils/generator/icon.json
'
const
originList
=
iconList
.
map
(
name
=>
`el-icon-
${
name
}
`
)
export
default
{
inheritAttrs
:
false
,
props
:
[
'
current
'
],
data
()
{
return
{
iconList
:
originList
,
active
:
null
,
key
:
''
}
},
watch
:
{
key
(
val
)
{
if
(
val
)
{
this
.
iconList
=
originList
.
filter
(
name
=>
name
.
indexOf
(
val
)
>
-
1
)
}
else
{
this
.
iconList
=
originList
}
}
},
methods
:
{
onOpen
()
{
this
.
active
=
this
.
current
this
.
key
=
''
},
onClose
()
{},
onSelect
(
icon
)
{
this
.
active
=
icon
this
.
$emit
(
'
select
'
,
icon
)
this
.
$emit
(
'
update:visible
'
,
false
)
}
}
}
</
script
>
<
style
lang=
"scss"
scoped
>
.icon-ul
{
margin
:
0
;
padding
:
0
;
font-size
:
0
;
li
{
list-style-type
:
none
;
text-align
:
center
;
font-size
:
14px
;
display
:
inline-block
;
width
:
16
.66%
;
box-sizing
:
border-box
;
height
:
108px
;
padding
:
15px
6px
6px
6px
;
cursor
:
pointer
;
overflow
:
hidden
;
&
:hover
{
background
:
#f2f2f2
;
}
&
.active-item
{
background
:
#e1f3fb
;
color
:
#7a6df0
}
>
i
{
font-size
:
30px
;
line-height
:
50px
;
}
}
}
.icon-dialog
{
::v-deep
.el-dialog
{
border-radius
:
8px
;
margin-bottom
:
0
;
margin-top
:
4vh
!
important
;
display
:
flex
;
flex-direction
:
column
;
max-height
:
92vh
;
overflow
:
hidden
;
box-sizing
:
border-box
;
.el-dialog__header
{
padding-top
:
14px
;
}
.el-dialog__body
{
margin
:
0
20px
20px
20px
;
padding
:
0
;
overflow
:
auto
;
}
}
}
</
style
>
ruoyi-ui/src/views/tool/build/RightPanel.vue
0 → 100644
View file @
cb0a4b78
<
template
>
<div
class=
"right-board"
>
<el-tabs
v-model=
"currentTab"
class=
"center-tabs"
>
<el-tab-pane
label=
"组件属性"
name=
"field"
/>
<el-tab-pane
label=
"表单属性"
name=
"form"
/>
</el-tabs>
<div
class=
"field-box"
>
<a
class=
"document-link"
target=
"_blank"
:href=
"documentLink"
title=
"查看组件文档"
>
<i
class=
"el-icon-link"
/>
</a>
<el-scrollbar
class=
"right-scrollbar"
>
<!-- 组件属性 -->
<el-form
v-show=
"currentTab==='field' && showField"
size=
"small"
label-width=
"90px"
>
<el-form-item
v-if=
"activeData.changeTag"
label=
"组件类型"
>
<el-select
v-model=
"activeData.tagIcon"
placeholder=
"请选择组件类型"
:style=
"
{width: '100%'}"
@change="tagChange"
>
<el-option-group
v-for=
"group in tagList"
:key=
"group.label"
:label=
"group.label"
>
<el-option
v-for=
"item in group.options"
:key=
"item.label"
:label=
"item.label"
:value=
"item.tagIcon"
>
<svg-icon
class=
"node-icon"
:icon-class=
"item.tagIcon"
/>
<span>
{{
item
.
label
}}
</span>
</el-option>
</el-option-group>
</el-select>
</el-form-item>
<el-form-item
v-if=
"activeData.vModel!==undefined"
label=
"字段名"
>
<el-input
v-model=
"activeData.vModel"
placeholder=
"请输入字段名(v-model)"
/>
</el-form-item>
<el-form-item
v-if=
"activeData.componentName!==undefined"
label=
"组件名"
>
{{
activeData
.
componentName
}}
</el-form-item>
<el-form-item
v-if=
"activeData.label!==undefined"
label=
"标题"
>
<el-input
v-model=
"activeData.label"
placeholder=
"请输入标题"
/>
</el-form-item>
<el-form-item
v-if=
"activeData.placeholder!==undefined"
label=
"占位提示"
>
<el-input
v-model=
"activeData.placeholder"
placeholder=
"请输入占位提示"
/>
</el-form-item>
<el-form-item
v-if=
"activeData['start-placeholder']!==undefined"
label=
"开始占位"
>
<el-input
v-model=
"activeData['start-placeholder']"
placeholder=
"请输入占位提示"
/>
</el-form-item>
<el-form-item
v-if=
"activeData['end-placeholder']!==undefined"
label=
"结束占位"
>
<el-input
v-model=
"activeData['end-placeholder']"
placeholder=
"请输入占位提示"
/>
</el-form-item>
<el-form-item
v-if=
"activeData.span!==undefined"
label=
"表单栅格"
>
<el-slider
v-model=
"activeData.span"
:max=
"24"
:min=
"1"
:marks=
"
{12:''}" @change="spanChange" />
</el-form-item>
<el-form-item
v-if=
"activeData.layout==='rowFormItem'"
label=
"栅格间隔"
>
<el-input-number
v-model=
"activeData.gutter"
:min=
"0"
placeholder=
"栅格间隔"
/>
</el-form-item>
<el-form-item
v-if=
"activeData.layout==='rowFormItem'"
label=
"布局模式"
>
<el-radio-group
v-model=
"activeData.type"
>
<el-radio-button
label=
"default"
/>
<el-radio-button
label=
"flex"
/>
</el-radio-group>
</el-form-item>
<el-form-item
v-if=
"activeData.justify!==undefined&&activeData.type==='flex'"
label=
"水平排列"
>
<el-select
v-model=
"activeData.justify"
placeholder=
"请选择水平排列"
:style=
"
{width: '100%'}">
<el-option
v-for=
"(item, index) in justifyOptions"
:key=
"index"
:label=
"item.label"
:value=
"item.value"
/>
</el-select>
</el-form-item>
<el-form-item
v-if=
"activeData.align!==undefined&&activeData.type==='flex'"
label=
"垂直排列"
>
<el-radio-group
v-model=
"activeData.align"
>
<el-radio-button
label=
"top"
/>
<el-radio-button
label=
"middle"
/>
<el-radio-button
label=
"bottom"
/>
</el-radio-group>
</el-form-item>
<el-form-item
v-if=
"activeData.labelWidth!==undefined"
label=
"标签宽度"
>
<el-input
v-model.number=
"activeData.labelWidth"
type=
"number"
placeholder=
"请输入标签宽度"
/>
</el-form-item>
<el-form-item
v-if=
"activeData.style&&activeData.style.width!==undefined"
label=
"组件宽度"
>
<el-input
v-model=
"activeData.style.width"
placeholder=
"请输入组件宽度"
clearable
/>
</el-form-item>
<el-form-item
v-if=
"activeData.vModel!==undefined"
label=
"默认值"
>
<el-input
:value=
"setDefaultValue(activeData.defaultValue)"
placeholder=
"请输入默认值"
@
input=
"onDefaultValueInput"
/>
</el-form-item>
<el-form-item
v-if=
"activeData.tag==='el-checkbox-group'"
label=
"至少应选"
>
<el-input-number
:value=
"activeData.min"
:min=
"0"
placeholder=
"至少应选"
@
input=
"$set(activeData, 'min', $event?$event:undefined)"
/>
</el-form-item>
<el-form-item
v-if=
"activeData.tag==='el-checkbox-group'"
label=
"最多可选"
>
<el-input-number
:value=
"activeData.max"
:min=
"0"
placeholder=
"最多可选"
@
input=
"$set(activeData, 'max', $event?$event:undefined)"
/>
</el-form-item>
<el-form-item
v-if=
"activeData.prepend!==undefined"
label=
"前缀"
>
<el-input
v-model=
"activeData.prepend"
placeholder=
"请输入前缀"
/>
</el-form-item>
<el-form-item
v-if=
"activeData.append!==undefined"
label=
"后缀"
>
<el-input
v-model=
"activeData.append"
placeholder=
"请输入后缀"
/>
</el-form-item>
<el-form-item
v-if=
"activeData['prefix-icon']!==undefined"
label=
"前图标"
>
<el-input
v-model=
"activeData['prefix-icon']"
placeholder=
"请输入前图标名称"
>
<el-button
slot=
"append"
icon=
"el-icon-thumb"
@
click=
"openIconsDialog('prefix-icon')"
>
选择
</el-button>
</el-input>
</el-form-item>
<el-form-item
v-if=
"activeData['suffix-icon'] !== undefined"
label=
"后图标"
>
<el-input
v-model=
"activeData['suffix-icon']"
placeholder=
"请输入后图标名称"
>
<el-button
slot=
"append"
icon=
"el-icon-thumb"
@
click=
"openIconsDialog('suffix-icon')"
>
选择
</el-button>
</el-input>
</el-form-item>
<el-form-item
v-if=
"activeData.tag === 'el-cascader'"
label=
"选项分隔符"
>
<el-input
v-model=
"activeData.separator"
placeholder=
"请输入选项分隔符"
/>
</el-form-item>
<el-form-item
v-if=
"activeData.autosize !== undefined"
label=
"最小行数"
>
<el-input-number
v-model=
"activeData.autosize.minRows"
:min=
"1"
placeholder=
"最小行数"
/>
</el-form-item>
<el-form-item
v-if=
"activeData.autosize !== undefined"
label=
"最大行数"
>
<el-input-number
v-model=
"activeData.autosize.maxRows"
:min=
"1"
placeholder=
"最大行数"
/>
</el-form-item>
<el-form-item
v-if=
"activeData.min !== undefined"
label=
"最小值"
>
<el-input-number
v-model=
"activeData.min"
placeholder=
"最小值"
/>
</el-form-item>
<el-form-item
v-if=
"activeData.max !== undefined"
label=
"最大值"
>
<el-input-number
v-model=
"activeData.max"
placeholder=
"最大值"
/>
</el-form-item>
<el-form-item
v-if=
"activeData.step !== undefined"
label=
"步长"
>
<el-input-number
v-model=
"activeData.step"
placeholder=
"步数"
/>
</el-form-item>
<el-form-item
v-if=
"activeData.tag === 'el-input-number'"
label=
"精度"
>
<el-input-number
v-model=
"activeData.precision"
:min=
"0"
placeholder=
"精度"
/>
</el-form-item>
<el-form-item
v-if=
"activeData.tag === 'el-input-number'"
label=
"按钮位置"
>
<el-radio-group
v-model=
"activeData['controls-position']"
>
<el-radio-button
label=
""
>
默认
</el-radio-button>
<el-radio-button
label=
"right"
>
右侧
</el-radio-button>
</el-radio-group>
</el-form-item>
<el-form-item
v-if=
"activeData.maxlength !== undefined"
label=
"最多输入"
>
<el-input
v-model=
"activeData.maxlength"
placeholder=
"请输入字符长度"
>
<template
slot=
"append"
>
个字符
</
template
>
</el-input>
</el-form-item>
<el-form-item
v-if=
"activeData['active-text'] !== undefined"
label=
"开启提示"
>
<el-input
v-model=
"activeData['active-text']"
placeholder=
"请输入开启提示"
/>
</el-form-item>
<el-form-item
v-if=
"activeData['inactive-text'] !== undefined"
label=
"关闭提示"
>
<el-input
v-model=
"activeData['inactive-text']"
placeholder=
"请输入关闭提示"
/>
</el-form-item>
<el-form-item
v-if=
"activeData['active-value'] !== undefined"
label=
"开启值"
>
<el-input
:value=
"setDefaultValue(activeData['active-value'])"
placeholder=
"请输入开启值"
@
input=
"onSwitchValueInput($event, 'active-value')"
/>
</el-form-item>
<el-form-item
v-if=
"activeData['inactive-value'] !== undefined"
label=
"关闭值"
>
<el-input
:value=
"setDefaultValue(activeData['inactive-value'])"
placeholder=
"请输入关闭值"
@
input=
"onSwitchValueInput($event, 'inactive-value')"
/>
</el-form-item>
<el-form-item
v-if=
"activeData.type !== undefined && 'el-date-picker' === activeData.tag"
label=
"时间类型"
>
<el-select
v-model=
"activeData.type"
placeholder=
"请选择时间类型"
:style=
"{ width: '100%' }"
@
change=
"dateTypeChange"
>
<el-option
v-for=
"(item, index) in dateOptions"
:key=
"index"
:label=
"item.label"
:value=
"item.value"
/>
</el-select>
</el-form-item>
<el-form-item
v-if=
"activeData.name !== undefined"
label=
"文件字段名"
>
<el-input
v-model=
"activeData.name"
placeholder=
"请输入上传文件字段名"
/>
</el-form-item>
<el-form-item
v-if=
"activeData.accept !== undefined"
label=
"文件类型"
>
<el-select
v-model=
"activeData.accept"
placeholder=
"请选择文件类型"
:style=
"{ width: '100%' }"
clearable
>
<el-option
label=
"图片"
value=
"image/*"
/>
<el-option
label=
"视频"
value=
"video/*"
/>
<el-option
label=
"音频"
value=
"audio/*"
/>
<el-option
label=
"excel"
value=
".xls,.xlsx"
/>
<el-option
label=
"word"
value=
".doc,.docx"
/>
<el-option
label=
"pdf"
value=
".pdf"
/>
<el-option
label=
"txt"
value=
".txt"
/>
</el-select>
</el-form-item>
<el-form-item
v-if=
"activeData.fileSize !== undefined"
label=
"文件大小"
>
<el-input
v-model.number=
"activeData.fileSize"
placeholder=
"请输入文件大小"
>
<el-select
slot=
"append"
v-model=
"activeData.sizeUnit"
:style=
"{ width: '66px' }"
>
<el-option
label=
"KB"
value=
"KB"
/>
<el-option
label=
"MB"
value=
"MB"
/>
<el-option
label=
"GB"
value=
"GB"
/>
</el-select>
</el-input>
</el-form-item>
<el-form-item
v-if=
"activeData.action !== undefined"
label=
"上传地址"
>
<el-input
v-model=
"activeData.action"
placeholder=
"请输入上传地址"
clearable
/>
</el-form-item>
<el-form-item
v-if=
"activeData['list-type'] !== undefined"
label=
"列表类型"
>
<el-radio-group
v-model=
"activeData['list-type']"
size=
"small"
>
<el-radio-button
label=
"text"
>
text
</el-radio-button>
<el-radio-button
label=
"picture"
>
picture
</el-radio-button>
<el-radio-button
label=
"picture-card"
>
picture-card
</el-radio-button>
</el-radio-group>
</el-form-item>
<el-form-item
v-if=
"activeData.buttonText !== undefined"
v-show=
"'picture-card' !== activeData['list-type']"
label=
"按钮文字"
>
<el-input
v-model=
"activeData.buttonText"
placeholder=
"请输入按钮文字"
/>
</el-form-item>
<el-form-item
v-if=
"activeData['range-separator'] !== undefined"
label=
"分隔符"
>
<el-input
v-model=
"activeData['range-separator']"
placeholder=
"请输入分隔符"
/>
</el-form-item>
<el-form-item
v-if=
"activeData['picker-options'] !== undefined"
label=
"时间段"
>
<el-input
v-model=
"activeData['picker-options'].selectableRange"
placeholder=
"请输入时间段"
/>
</el-form-item>
<el-form-item
v-if=
"activeData.format !== undefined"
label=
"时间格式"
>
<el-input
:value=
"activeData.format"
placeholder=
"请输入时间格式"
@
input=
"setTimeValue($event)"
/>
</el-form-item>
<
template
v-if=
"['el-checkbox-group', 'el-radio-group', 'el-select'].indexOf(activeData.tag) > -1"
>
<el-divider>
选项
</el-divider>
<draggable
:list=
"activeData.options"
:animation=
"340"
group=
"selectItem"
handle=
".option-drag"
>
<div
v-for=
"(item, index) in activeData.options"
:key=
"index"
class=
"select-item"
>
<div
class=
"select-line-icon option-drag"
>
<i
class=
"el-icon-s-operation"
/>
</div>
<el-input
v-model=
"item.label"
placeholder=
"选项名"
size=
"small"
/>
<el-input
placeholder=
"选项值"
size=
"small"
:value=
"item.value"
@
input=
"setOptionValue(item, $event)"
/>
<div
class=
"close-btn select-line-icon"
@
click=
"activeData.options.splice(index, 1)"
>
<i
class=
"el-icon-remove-outline"
/>
</div>
</div>
</draggable>
<div
style=
"margin-left: 20px;"
>
<el-button
style=
"padding-bottom: 0"
icon=
"el-icon-circle-plus-outline"
type=
"text"
@
click=
"addSelectItem"
>
添加选项
</el-button>
</div>
<el-divider
/>
</
template
>
<
template
v-if=
"['el-cascader'].indexOf(activeData.tag) > -1"
>
<el-divider>
选项
</el-divider>
<el-form-item
label=
"数据类型"
>
<el-radio-group
v-model=
"activeData.dataType"
size=
"small"
>
<el-radio-button
label=
"dynamic"
>
动态数据
</el-radio-button>
<el-radio-button
label=
"static"
>
静态数据
</el-radio-button>
</el-radio-group>
</el-form-item>
<template
v-if=
"activeData.dataType === 'dynamic'"
>
<el-form-item
label=
"标签键名"
>
<el-input
v-model=
"activeData.labelKey"
placeholder=
"请输入标签键名"
/>
</el-form-item>
<el-form-item
label=
"值键名"
>
<el-input
v-model=
"activeData.valueKey"
placeholder=
"请输入值键名"
/>
</el-form-item>
<el-form-item
label=
"子级键名"
>
<el-input
v-model=
"activeData.childrenKey"
placeholder=
"请输入子级键名"
/>
</el-form-item>
</
template
>
<el-tree
v-if=
"activeData.dataType === 'static'"
draggable
:data=
"activeData.options"
node-key=
"id"
:expand-on-click-node=
"false"
:render-content=
"renderContent"
/>
<div
v-if=
"activeData.dataType === 'static'"
style=
"margin-left: 20px"
>
<el-button
style=
"padding-bottom: 0"
icon=
"el-icon-circle-plus-outline"
type=
"text"
@
click=
"addTreeItem"
>
添加父级
</el-button>
</div>
<el-divider
/>
</template>
<el-form-item
v-if=
"activeData.optionType !== undefined"
label=
"选项样式"
>
<el-radio-group
v-model=
"activeData.optionType"
>
<el-radio-button
label=
"default"
>
默认
</el-radio-button>
<el-radio-button
label=
"button"
>
按钮
</el-radio-button>
</el-radio-group>
</el-form-item>
<el-form-item
v-if=
"activeData['active-color'] !== undefined"
label=
"开启颜色"
>
<el-color-picker
v-model=
"activeData['active-color']"
/>
</el-form-item>
<el-form-item
v-if=
"activeData['inactive-color'] !== undefined"
label=
"关闭颜色"
>
<el-color-picker
v-model=
"activeData['inactive-color']"
/>
</el-form-item>
<el-form-item
v-if=
"activeData['allow-half'] !== undefined"
label=
"允许半选"
>
<el-switch
v-model=
"activeData['allow-half']"
/>
</el-form-item>
<el-form-item
v-if=
"activeData['show-text'] !== undefined"
label=
"辅助文字"
>
<el-switch
v-model=
"activeData['show-text']"
@
change=
"rateTextChange"
/>
</el-form-item>
<el-form-item
v-if=
"activeData['show-score'] !== undefined"
label=
"显示分数"
>
<el-switch
v-model=
"activeData['show-score']"
@
change=
"rateScoreChange"
/>
</el-form-item>
<el-form-item
v-if=
"activeData['show-stops'] !== undefined"
label=
"显示间断点"
>
<el-switch
v-model=
"activeData['show-stops']"
/>
</el-form-item>
<el-form-item
v-if=
"activeData.range !== undefined"
label=
"范围选择"
>
<el-switch
v-model=
"activeData.range"
@
change=
"rangeChange"
/>
</el-form-item>
<el-form-item
v-if=
"activeData.border !== undefined && activeData.optionType === 'default'"
label=
"是否带边框"
>
<el-switch
v-model=
"activeData.border"
/>
</el-form-item>
<el-form-item
v-if=
"activeData.tag === 'el-color-picker'"
label=
"颜色格式"
>
<el-select
v-model=
"activeData['color-format']"
placeholder=
"请选择颜色格式"
:style=
"{ width: '100%' }"
@
change=
"colorFormatChange"
>
<el-option
v-for=
"(item, index) in colorFormatOptions"
:key=
"index"
:label=
"item.label"
:value=
"item.value"
/>
</el-select>
</el-form-item>
<el-form-item
v-if=
"activeData.size !== undefined &&
(activeData.optionType === 'button' ||
activeData.border ||
activeData.tag === 'el-color-picker')"
label=
"选项尺寸"
>
<el-radio-group
v-model=
"activeData.size"
>
<el-radio-button
label=
"medium"
>
中等
</el-radio-button>
<el-radio-button
label=
"small"
>
较小
</el-radio-button>
<el-radio-button
label=
"mini"
>
迷你
</el-radio-button>
</el-radio-group>
</el-form-item>
<el-form-item
v-if=
"activeData['show-word-limit'] !== undefined"
label=
"输入统计"
>
<el-switch
v-model=
"activeData['show-word-limit']"
/>
</el-form-item>
<el-form-item
v-if=
"activeData.tag === 'el-input-number'"
label=
"严格步数"
>
<el-switch
v-model=
"activeData['step-strictly']"
/>
</el-form-item>
<el-form-item
v-if=
"activeData.tag === 'el-cascader'"
label=
"是否多选"
>
<el-switch
v-model=
"activeData.props.props.multiple"
/>
</el-form-item>
<el-form-item
v-if=
"activeData.tag === 'el-cascader'"
label=
"展示全路径"
>
<el-switch
v-model=
"activeData['show-all-levels']"
/>
</el-form-item>
<el-form-item
v-if=
"activeData.tag === 'el-cascader'"
label=
"可否筛选"
>
<el-switch
v-model=
"activeData.filterable"
/>
</el-form-item>
<el-form-item
v-if=
"activeData.clearable !== undefined"
label=
"能否清空"
>
<el-switch
v-model=
"activeData.clearable"
/>
</el-form-item>
<el-form-item
v-if=
"activeData.showTip !== undefined"
label=
"显示提示"
>
<el-switch
v-model=
"activeData.showTip"
/>
</el-form-item>
<el-form-item
v-if=
"activeData.multiple !== undefined"
label=
"多选文件"
>
<el-switch
v-model=
"activeData.multiple"
/>
</el-form-item>
<el-form-item
v-if=
"activeData['auto-upload'] !== undefined"
label=
"自动上传"
>
<el-switch
v-model=
"activeData['auto-upload']"
/>
</el-form-item>
<el-form-item
v-if=
"activeData.readonly !== undefined"
label=
"是否只读"
>
<el-switch
v-model=
"activeData.readonly"
/>
</el-form-item>
<el-form-item
v-if=
"activeData.disabled !== undefined"
label=
"是否禁用"
>
<el-switch
v-model=
"activeData.disabled"
/>
</el-form-item>
<el-form-item
v-if=
"activeData.tag === 'el-select'"
label=
"是否可搜索"
>
<el-switch
v-model=
"activeData.filterable"
/>
</el-form-item>
<el-form-item
v-if=
"activeData.tag === 'el-select'"
label=
"是否多选"
>
<el-switch
v-model=
"activeData.multiple"
@
change=
"multipleChange"
/>
</el-form-item>
<el-form-item
v-if=
"activeData.required !== undefined"
label=
"是否必填"
>
<el-switch
v-model=
"activeData.required"
/>
</el-form-item>
<
template
v-if=
"activeData.layoutTree"
>
<el-divider>
布局结构树
</el-divider>
<el-tree
:data=
"[activeData]"
:props=
"layoutTreeProps"
node-key=
"renderKey"
default-expand-all
draggable
>
<span
slot-scope=
"
{ node, data }">
<span
class=
"node-label"
>
<svg-icon
class=
"node-icon"
:icon-class=
"data.tagIcon"
/>
{{
node
.
label
}}
</span>
</span>
</el-tree>
</
template
>
<
template
v-if=
"activeData.layout === 'colFormItem'"
>
<el-divider>
正则校验
</el-divider>
<div
v-for=
"(item, index) in activeData.regList"
:key=
"index"
class=
"reg-item"
>
<span
class=
"close-btn"
@
click=
"activeData.regList.splice(index, 1)"
>
<i
class=
"el-icon-close"
/>
</span>
<el-form-item
label=
"表达式"
>
<el-input
v-model=
"item.pattern"
placeholder=
"请输入正则"
/>
</el-form-item>
<el-form-item
label=
"错误提示"
style=
"margin-bottom:0"
>
<el-input
v-model=
"item.message"
placeholder=
"请输入错误提示"
/>
</el-form-item>
</div>
<div
style=
"margin-left: 20px"
>
<el-button
icon=
"el-icon-circle-plus-outline"
type=
"text"
@
click=
"addReg"
>
添加规则
</el-button>
</div>
</
template
>
</el-form>
<!-- 表单属性 -->
<el-form
v-show=
"currentTab === 'form'"
size=
"small"
label-width=
"90px"
>
<el-form-item
label=
"表单名"
>
<el-input
v-model=
"formConf.formRef"
placeholder=
"请输入表单名(ref)"
/>
</el-form-item>
<el-form-item
label=
"表单模型"
>
<el-input
v-model=
"formConf.formModel"
placeholder=
"请输入数据模型"
/>
</el-form-item>
<el-form-item
label=
"校验模型"
>
<el-input
v-model=
"formConf.formRules"
placeholder=
"请输入校验模型"
/>
</el-form-item>
<el-form-item
label=
"表单尺寸"
>
<el-radio-group
v-model=
"formConf.size"
>
<el-radio-button
label=
"medium"
>
中等
</el-radio-button>
<el-radio-button
label=
"small"
>
较小
</el-radio-button>
<el-radio-button
label=
"mini"
>
迷你
</el-radio-button>
</el-radio-group>
</el-form-item>
<el-form-item
label=
"标签对齐"
>
<el-radio-group
v-model=
"formConf.labelPosition"
>
<el-radio-button
label=
"left"
>
左对齐
</el-radio-button>
<el-radio-button
label=
"right"
>
右对齐
</el-radio-button>
<el-radio-button
label=
"top"
>
顶部对齐
</el-radio-button>
</el-radio-group>
</el-form-item>
<el-form-item
label=
"标签宽度"
>
<el-input-number
v-model=
"formConf.labelWidth"
placeholder=
"标签宽度"
/>
</el-form-item>
<el-form-item
label=
"栅格间隔"
>
<el-input-number
v-model=
"formConf.gutter"
:min=
"0"
placeholder=
"栅格间隔"
/>
</el-form-item>
<el-form-item
label=
"禁用表单"
>
<el-switch
v-model=
"formConf.disabled"
/>
</el-form-item>
<el-form-item
label=
"表单按钮"
>
<el-switch
v-model=
"formConf.formBtns"
/>
</el-form-item>
<el-form-item
label=
"显示未选中组件边框"
>
<el-switch
v-model=
"formConf.unFocusedComponentBorder"
/>
</el-form-item>
</el-form>
</el-scrollbar>
</div>
<treeNode-dialog
:visible.sync=
"dialogVisible"
title=
"添加选项"
@
commit=
"addNode"
/>
<icons-dialog
:visible.sync=
"iconsVisible"
:current=
"activeData[currentIconModel]"
@
select=
"setIcon"
/>
</div>
</template>
<
script
>
import
{
isArray
}
from
'
util
'
import
TreeNodeDialog
from
'
./TreeNodeDialog
'
import
{
isNumberStr
}
from
'
@/utils/index
'
import
IconsDialog
from
'
./IconsDialog
'
import
{
inputComponents
,
selectComponents
,
layoutComponents
}
from
'
@/utils/generator/config
'
const
dateTimeFormat
=
{
date
:
'
yyyy-MM-dd
'
,
week
:
'
yyyy 第 WW 周
'
,
month
:
'
yyyy-MM
'
,
year
:
'
yyyy
'
,
datetime
:
'
yyyy-MM-dd HH:mm:ss
'
,
daterange
:
'
yyyy-MM-dd
'
,
monthrange
:
'
yyyy-MM
'
,
datetimerange
:
'
yyyy-MM-dd HH:mm:ss
'
}
export
default
{
components
:
{
TreeNodeDialog
,
IconsDialog
},
props
:
[
'
showField
'
,
'
activeData
'
,
'
formConf
'
],
data
()
{
return
{
currentTab
:
'
field
'
,
currentNode
:
null
,
dialogVisible
:
false
,
iconsVisible
:
false
,
currentIconModel
:
null
,
dateTypeOptions
:
[
{
label
:
'
日(date)
'
,
value
:
'
date
'
},
{
label
:
'
周(week)
'
,
value
:
'
week
'
},
{
label
:
'
月(month)
'
,
value
:
'
month
'
},
{
label
:
'
年(year)
'
,
value
:
'
year
'
},
{
label
:
'
日期时间(datetime)
'
,
value
:
'
datetime
'
}
],
dateRangeTypeOptions
:
[
{
label
:
'
日期范围(daterange)
'
,
value
:
'
daterange
'
},
{
label
:
'
月范围(monthrange)
'
,
value
:
'
monthrange
'
},
{
label
:
'
日期时间范围(datetimerange)
'
,
value
:
'
datetimerange
'
}
],
colorFormatOptions
:
[
{
label
:
'
hex
'
,
value
:
'
hex
'
},
{
label
:
'
rgb
'
,
value
:
'
rgb
'
},
{
label
:
'
rgba
'
,
value
:
'
rgba
'
},
{
label
:
'
hsv
'
,
value
:
'
hsv
'
},
{
label
:
'
hsl
'
,
value
:
'
hsl
'
}
],
justifyOptions
:
[
{
label
:
'
start
'
,
value
:
'
start
'
},
{
label
:
'
end
'
,
value
:
'
end
'
},
{
label
:
'
center
'
,
value
:
'
center
'
},
{
label
:
'
space-around
'
,
value
:
'
space-around
'
},
{
label
:
'
space-between
'
,
value
:
'
space-between
'
}
],
layoutTreeProps
:
{
label
(
data
,
node
)
{
return
data
.
componentName
||
`
${
data
.
label
}
:
${
data
.
vModel
}
`
}
}
}
},
computed
:
{
documentLink
()
{
return
(
this
.
activeData
.
document
||
'
https://element.eleme.cn/#/zh-CN/component/installation
'
)
},
dateOptions
()
{
if
(
this
.
activeData
.
type
!==
undefined
&&
this
.
activeData
.
tag
===
'
el-date-picker
'
)
{
if
(
this
.
activeData
[
'
start-placeholder
'
]
===
undefined
)
{
return
this
.
dateTypeOptions
}
return
this
.
dateRangeTypeOptions
}
return
[]
},
tagList
()
{
return
[
{
label
:
'
输入型组件
'
,
options
:
inputComponents
},
{
label
:
'
选择型组件
'
,
options
:
selectComponents
}
]
}
},
methods
:
{
addReg
()
{
this
.
activeData
.
regList
.
push
({
pattern
:
''
,
message
:
''
})
},
addSelectItem
()
{
this
.
activeData
.
options
.
push
({
label
:
''
,
value
:
''
})
},
addTreeItem
()
{
++
this
.
idGlobal
this
.
dialogVisible
=
true
this
.
currentNode
=
this
.
activeData
.
options
},
renderContent
(
h
,
{
node
,
data
,
store
})
{
return
(
<
div
class
=
"
custom-tree-node
"
>
<
span
>
{
node
.
label
}
<
/span>
<
span
class
=
"
node-operation
"
>
<
i
on
-
click
=
{()
=>
this
.
append
(
data
)}
class
=
"
el-icon-plus
"
title
=
"
添加
"
><
/i>
<
i
on
-
click
=
{()
=>
this
.
remove
(
node
,
data
)}
class
=
"
el-icon-delete
"
title
=
"
删除
"
><
/i>
<
/span>
<
/div>
)
},
append
(
data
)
{
if
(
!
data
.
children
)
{
this
.
$set
(
data
,
'
children
'
,
[])
}
this
.
dialogVisible
=
true
this
.
currentNode
=
data
.
children
},
remove
(
node
,
data
)
{
const
{
parent
}
=
node
const
children
=
parent
.
data
.
children
||
parent
.
data
const
index
=
children
.
findIndex
(
d
=>
d
.
id
===
data
.
id
)
children
.
splice
(
index
,
1
)
},
addNode
(
data
)
{
this
.
currentNode
.
push
(
data
)
},
setOptionValue
(
item
,
val
)
{
item
.
value
=
isNumberStr
(
val
)
?
+
val
:
val
},
setDefaultValue
(
val
)
{
if
(
Array
.
isArray
(
val
))
{
return
val
.
join
(
'
,
'
)
}
if
([
'
string
'
,
'
number
'
].
indexOf
(
val
)
>
-
1
)
{
return
val
}
if
(
typeof
val
===
'
boolean
'
)
{
return
`
${
val
}
`
}
return
val
},
onDefaultValueInput
(
str
)
{
if
(
isArray
(
this
.
activeData
.
defaultValue
))
{
// 数组
this
.
$set
(
this
.
activeData
,
'
defaultValue
'
,
str
.
split
(
'
,
'
).
map
(
val
=>
(
isNumberStr
(
val
)
?
+
val
:
val
))
)
}
else
if
([
'
true
'
,
'
false
'
].
indexOf
(
str
)
>
-
1
)
{
// 布尔
this
.
$set
(
this
.
activeData
,
'
defaultValue
'
,
JSON
.
parse
(
str
))
}
else
{
// 字符串和数字
this
.
$set
(
this
.
activeData
,
'
defaultValue
'
,
isNumberStr
(
str
)
?
+
str
:
str
)
}
},
onSwitchValueInput
(
val
,
name
)
{
if
([
'
true
'
,
'
false
'
].
indexOf
(
val
)
>
-
1
)
{
this
.
$set
(
this
.
activeData
,
name
,
JSON
.
parse
(
val
))
}
else
{
this
.
$set
(
this
.
activeData
,
name
,
isNumberStr
(
val
)
?
+
val
:
val
)
}
},
setTimeValue
(
val
,
type
)
{
const
valueFormat
=
type
===
'
week
'
?
dateTimeFormat
.
date
:
val
this
.
$set
(
this
.
activeData
,
'
defaultValue
'
,
null
)
this
.
$set
(
this
.
activeData
,
'
value-format
'
,
valueFormat
)
this
.
$set
(
this
.
activeData
,
'
format
'
,
val
)
},
spanChange
(
val
)
{
this
.
formConf
.
span
=
val
},
multipleChange
(
val
)
{
this
.
$set
(
this
.
activeData
,
'
defaultValue
'
,
val
?
[]
:
''
)
},
dateTypeChange
(
val
)
{
this
.
setTimeValue
(
dateTimeFormat
[
val
],
val
)
},
rangeChange
(
val
)
{
this
.
$set
(
this
.
activeData
,
'
defaultValue
'
,
val
?
[
this
.
activeData
.
min
,
this
.
activeData
.
max
]
:
this
.
activeData
.
min
)
},
rateTextChange
(
val
)
{
if
(
val
)
this
.
activeData
[
'
show-score
'
]
=
false
},
rateScoreChange
(
val
)
{
if
(
val
)
this
.
activeData
[
'
show-text
'
]
=
false
},
colorFormatChange
(
val
)
{
this
.
activeData
.
defaultValue
=
null
this
.
activeData
[
'
show-alpha
'
]
=
val
.
indexOf
(
'
a
'
)
>
-
1
this
.
activeData
.
renderKey
=
+
new
Date
()
// 更新renderKey,重新渲染该组件
},
openIconsDialog
(
model
)
{
this
.
iconsVisible
=
true
this
.
currentIconModel
=
model
},
setIcon
(
val
)
{
this
.
activeData
[
this
.
currentIconModel
]
=
val
},
tagChange
(
tagIcon
)
{
let
target
=
inputComponents
.
find
(
item
=>
item
.
tagIcon
===
tagIcon
)
if
(
!
target
)
target
=
selectComponents
.
find
(
item
=>
item
.
tagIcon
===
tagIcon
)
this
.
$emit
(
'
tag-change
'
,
target
)
}
}
}
</
script
>
<
style
lang=
"scss"
scoped
>
.right-board
{
width
:
350px
;
position
:
absolute
;
right
:
0
;
top
:
0
;
padding-top
:
3px
;
.field-box
{
position
:
relative
;
height
:
calc
(
100vh
-
42px
);
box-sizing
:
border-box
;
overflow
:
hidden
;
}
.el-scrollbar
{
height
:
100%
;
}
}
.select-item
{
display
:
flex
;
border
:
1px
dashed
#fff
;
box-sizing
:
border-box
;
&
.close-btn
{
cursor
:
pointer
;
color
:
#f56c6c
;
}
&
.el-input
+
.el-input
{
margin-left
:
4px
;
}
}
.select-item
+
.select-item
{
margin-top
:
4px
;
}
.select-item.sortable-chosen
{
border
:
1px
dashed
#409eff
;
}
.select-line-icon
{
line-height
:
32px
;
font-size
:
22px
;
padding
:
0
4px
;
color
:
#777
;
}
.option-drag
{
cursor
:
move
;
}
.time-range
{
.el-date-editor
{
width
:
227px
;
}
::v-deep
.el-icon-time
{
display
:
none
;
}
}
.document-link
{
position
:
absolute
;
display
:
block
;
width
:
26px
;
height
:
26px
;
top
:
0
;
left
:
0
;
cursor
:
pointer
;
background
:
#409eff
;
z-index
:
1
;
border-radius
:
0
0
6px
0
;
text-align
:
center
;
line-height
:
26px
;
color
:
#fff
;
font-size
:
18px
;
}
.node-label
{
font-size
:
14px
;
}
.node-icon
{
color
:
#bebfc3
;
}
</
style
>
ruoyi-ui/src/views/tool/build/TreeNodeDialog.vue
0 → 100644
View file @
cb0a4b78
<
template
>
<div>
<el-dialog
v-bind=
"$attrs"
:close-on-click-modal=
"false"
:modal-append-to-body=
"false"
v-on=
"$listeners"
@
open=
"onOpen"
@
close=
"onClose"
>
<el-row
:gutter=
"0"
>
<el-form
ref=
"elForm"
:model=
"formData"
:rules=
"rules"
size=
"small"
label-width=
"100px"
>
<el-col
:span=
"24"
>
<el-form-item
label=
"选项名"
prop=
"label"
>
<el-input
v-model=
"formData.label"
placeholder=
"请输入选项名"
clearable
/>
</el-form-item>
</el-col>
<el-col
:span=
"24"
>
<el-form-item
label=
"选项值"
prop=
"value"
>
<el-input
v-model=
"formData.value"
placeholder=
"请输入选项值"
clearable
>
<el-select
slot=
"append"
v-model=
"dataType"
:style=
"
{width: '100px'}"
>
<el-option
v-for=
"(item, index) in dataTypeOptions"
:key=
"index"
:label=
"item.label"
:value=
"item.value"
:disabled=
"item.disabled"
/>
</el-select>
</el-input>
</el-form-item>
</el-col>
</el-form>
</el-row>
<div
slot=
"footer"
>
<el-button
type=
"primary"
@
click=
"handelConfirm"
>
确定
</el-button>
<el-button
@
click=
"close"
>
取消
</el-button>
</div>
</el-dialog>
</div>
</
template
>
<
script
>
import
{
isNumberStr
}
from
'
@/utils/index
'
export
default
{
components
:
{},
inheritAttrs
:
false
,
props
:
[],
data
()
{
return
{
id
:
100
,
formData
:
{
label
:
undefined
,
value
:
undefined
},
rules
:
{
label
:
[
{
required
:
true
,
message
:
'
请输入选项名
'
,
trigger
:
'
blur
'
}
],
value
:
[
{
required
:
true
,
message
:
'
请输入选项值
'
,
trigger
:
'
blur
'
}
]
},
dataType
:
'
string
'
,
dataTypeOptions
:
[
{
label
:
'
字符串
'
,
value
:
'
string
'
},
{
label
:
'
数字
'
,
value
:
'
number
'
}
]
}
},
computed
:
{},
watch
:
{
// eslint-disable-next-line func-names
'
formData.value
'
:
function
(
val
)
{
this
.
dataType
=
isNumberStr
(
val
)
?
'
number
'
:
'
string
'
}
},
created
()
{},
mounted
()
{},
methods
:
{
onOpen
()
{
this
.
formData
=
{
label
:
undefined
,
value
:
undefined
}
},
onClose
()
{},
close
()
{
this
.
$emit
(
'
update:visible
'
,
false
)
},
handelConfirm
()
{
this
.
$refs
.
elForm
.
validate
(
valid
=>
{
if
(
!
valid
)
return
if
(
this
.
dataType
===
'
number
'
)
{
this
.
formData
.
value
=
parseFloat
(
this
.
formData
.
value
)
}
this
.
formData
.
id
=
this
.
id
++
this
.
$emit
(
'
commit
'
,
this
.
formData
)
this
.
close
()
})
}
}
}
</
script
>
ruoyi-ui/src/views/tool/build/index.vue
View file @
cb0a4b78
<
template
>
<
template
>
<div
class=
"app-container"
>
<div
class=
"container"
>
构建工具
<div
class=
"left-board"
>
<div
class=
"logo-wrapper"
>
<div
class=
"logo"
>
<img
:src=
"logo"
alt=
"logo"
>
Form Generator
</div>
</div>
<el-scrollbar
class=
"left-scrollbar"
>
<div
class=
"components-list"
>
<div
class=
"components-title"
>
<svg-icon
icon-class=
"component"
/>
输入型组件
</div>
<draggable
class=
"components-draggable"
:list=
"inputComponents"
:group=
"
{ name: 'componentsGroup', pull: 'clone', put: false }"
:clone="cloneComponent"
draggable=".components-item"
:sort="false"
@end="onEnd"
>
<div
v-for=
"(element, index) in inputComponents"
:key=
"index"
class=
"components-item"
@
click=
"addComponent(element)"
>
<div
class=
"components-body"
>
<svg-icon
:icon-class=
"element.tagIcon"
/>
{{
element
.
label
}}
</div>
</div>
</draggable>
<div
class=
"components-title"
>
<svg-icon
icon-class=
"component"
/>
选择型组件
</div>
<draggable
class=
"components-draggable"
:list=
"selectComponents"
:group=
"
{ name: 'componentsGroup', pull: 'clone', put: false }"
:clone="cloneComponent"
draggable=".components-item"
:sort="false"
@end="onEnd"
>
<div
v-for=
"(element, index) in selectComponents"
:key=
"index"
class=
"components-item"
@
click=
"addComponent(element)"
>
<div
class=
"components-body"
>
<svg-icon
:icon-class=
"element.tagIcon"
/>
{{
element
.
label
}}
</div>
</div>
</draggable>
<div
class=
"components-title"
>
<svg-icon
icon-class=
"component"
/>
布局型组件
</div>
<draggable
class=
"components-draggable"
:list=
"layoutComponents"
:group=
"
{ name: 'componentsGroup', pull: 'clone', put: false }" :clone="cloneComponent"
draggable=".components-item" :sort="false" @end="onEnd"
>
<div
v-for=
"(element, index) in layoutComponents"
:key=
"index"
class=
"components-item"
@
click=
"addComponent(element)"
>
<div
class=
"components-body"
>
<svg-icon
:icon-class=
"element.tagIcon"
/>
{{
element
.
label
}}
</div>
</div>
</draggable>
</div>
</el-scrollbar>
</div>
<div
class=
"center-board"
>
<div
class=
"action-bar"
>
<el-button
icon=
"el-icon-download"
type=
"text"
@
click=
"download"
>
导出vue文件
</el-button>
<el-button
class=
"copy-btn-main"
icon=
"el-icon-document-copy"
type=
"text"
@
click=
"copy"
>
复制代码
</el-button>
<el-button
class=
"delete-btn"
icon=
"el-icon-delete"
type=
"text"
@
click=
"empty"
>
清空
</el-button>
</div>
<el-scrollbar
class=
"center-scrollbar"
>
<el-row
class=
"center-board-row"
:gutter=
"formConf.gutter"
>
<el-form
:size=
"formConf.size"
:label-position=
"formConf.labelPosition"
:disabled=
"formConf.disabled"
:label-width=
"formConf.labelWidth + 'px'"
>
<draggable
class=
"drawing-board"
:list=
"drawingList"
:animation=
"340"
group=
"componentsGroup"
>
<draggable-item
v-for=
"(element, index) in drawingList"
:key=
"element.renderKey"
:drawing-list=
"drawingList"
:element=
"element"
:index=
"index"
:active-id=
"activeId"
:form-conf=
"formConf"
@
activeItem=
"activeFormItem"
@
copyItem=
"drawingItemCopy"
@
deleteItem=
"drawingItemDelete"
/>
</draggable>
<div
v-show=
"!drawingList.length"
class=
"empty-info"
>
从左侧拖入或点选组件进行表单设计
</div>
</el-form>
</el-row>
</el-scrollbar>
</div>
<right-panel
:active-data=
"activeData"
:form-conf=
"formConf"
:show-field=
"!!drawingList.length"
@
tag-change=
"tagChange"
/>
<code-type-dialog
:visible.sync=
"dialogVisible"
title=
"选择生成类型"
:show-file-name=
"showFileName"
@
confirm=
"generate"
/>
<input
id=
"copyNode"
type=
"hidden"
>
</div>
</div>
</
template
>
</
template
>
\ No newline at end of file
<
script
>
import
draggable
from
'
vuedraggable
'
import
{
saveAs
}
from
'
file-saver
'
import
beautifier
from
'
js-beautify
'
import
ClipboardJS
from
'
clipboard
'
import
render
from
'
@/utils/generator/render
'
import
RightPanel
from
'
./RightPanel
'
import
{
inputComponents
,
selectComponents
,
layoutComponents
,
formConf
}
from
'
@/utils/generator/config
'
import
{
exportDefault
,
beautifierConf
,
isNumberStr
,
titleCase
}
from
'
@/utils/index
'
import
{
makeUpHtml
,
vueTemplate
,
vueScript
,
cssStyle
}
from
'
@/utils/generator/html
'
import
{
makeUpJs
}
from
'
@/utils/generator/js
'
import
{
makeUpCss
}
from
'
@/utils/generator/css
'
import
drawingDefalut
from
'
@/utils/generator/drawingDefalut
'
import
logo
from
'
@/assets/logo/logo.png
'
import
CodeTypeDialog
from
'
./CodeTypeDialog
'
import
DraggableItem
from
'
./DraggableItem
'
const
emptyActiveData
=
{
style
:
{},
autosize
:
{}
}
let
oldActiveId
let
tempActiveData
export
default
{
components
:
{
draggable
,
render
,
RightPanel
,
CodeTypeDialog
,
DraggableItem
},
data
()
{
return
{
logo
,
idGlobal
:
100
,
formConf
,
inputComponents
,
selectComponents
,
layoutComponents
,
labelWidth
:
100
,
drawingList
:
drawingDefalut
,
drawingData
:
{},
activeId
:
drawingDefalut
[
0
].
formId
,
drawerVisible
:
false
,
formData
:
{},
dialogVisible
:
false
,
generateConf
:
null
,
showFileName
:
false
,
activeData
:
drawingDefalut
[
0
]
}
},
computed
:
{
},
watch
:
{
// eslint-disable-next-line func-names
'
activeData.label
'
:
function
(
val
,
oldVal
)
{
if
(
this
.
activeData
.
placeholder
===
undefined
||
!
this
.
activeData
.
tag
||
oldActiveId
!==
this
.
activeId
)
{
return
}
this
.
activeData
.
placeholder
=
this
.
activeData
.
placeholder
.
replace
(
oldVal
,
''
)
+
val
},
activeId
:
{
handler
(
val
)
{
oldActiveId
=
val
},
immediate
:
true
}
},
mounted
()
{
const
clipboard
=
new
ClipboardJS
(
'
#copyNode
'
,
{
text
:
trigger
=>
{
const
codeStr
=
this
.
generateCode
()
this
.
$notify
({
title
:
'
成功
'
,
message
:
'
代码已复制到剪切板,可粘贴。
'
,
type
:
'
success
'
})
return
codeStr
}
})
clipboard
.
on
(
'
error
'
,
e
=>
{
this
.
$message
.
error
(
'
代码复制失败
'
)
})
},
methods
:
{
activeFormItem
(
element
)
{
this
.
activeData
=
element
this
.
activeId
=
element
.
formId
},
onEnd
(
obj
,
a
)
{
if
(
obj
.
from
!==
obj
.
to
)
{
this
.
activeData
=
tempActiveData
this
.
activeId
=
this
.
idGlobal
}
},
addComponent
(
item
)
{
const
clone
=
this
.
cloneComponent
(
item
)
this
.
drawingList
.
push
(
clone
)
this
.
activeFormItem
(
clone
)
},
cloneComponent
(
origin
)
{
const
clone
=
JSON
.
parse
(
JSON
.
stringify
(
origin
))
clone
.
formId
=
++
this
.
idGlobal
clone
.
span
=
formConf
.
span
clone
.
renderKey
=
+
new
Date
()
// 改变renderKey后可以实现强制更新组件
if
(
!
clone
.
layout
)
clone
.
layout
=
'
colFormItem
'
if
(
clone
.
layout
===
'
colFormItem
'
)
{
clone
.
vModel
=
`field
${
this
.
idGlobal
}
`
clone
.
placeholder
!==
undefined
&&
(
clone
.
placeholder
+=
clone
.
label
)
tempActiveData
=
clone
}
else
if
(
clone
.
layout
===
'
rowFormItem
'
)
{
delete
clone
.
label
clone
.
componentName
=
`row
${
this
.
idGlobal
}
`
clone
.
gutter
=
this
.
formConf
.
gutter
tempActiveData
=
clone
}
return
tempActiveData
},
AssembleFormData
()
{
this
.
formData
=
{
fields
:
JSON
.
parse
(
JSON
.
stringify
(
this
.
drawingList
)),
...
this
.
formConf
}
},
generate
(
data
)
{
const
func
=
this
[
`exec
${
titleCase
(
this
.
operationType
)}
`
]
this
.
generateConf
=
data
func
&&
func
(
data
)
},
execRun
(
data
)
{
this
.
AssembleFormData
()
this
.
drawerVisible
=
true
},
execDownload
(
data
)
{
const
codeStr
=
this
.
generateCode
()
const
blob
=
new
Blob
([
codeStr
],
{
type
:
'
text/plain;charset=utf-8
'
})
saveAs
(
blob
,
data
.
fileName
)
},
execCopy
(
data
)
{
document
.
getElementById
(
'
copyNode
'
).
click
()
},
empty
()
{
this
.
$confirm
(
'
确定要清空所有组件吗?
'
,
'
提示
'
,
{
type
:
'
warning
'
}).
then
(
()
=>
{
this
.
drawingList
=
[]
}
)
},
drawingItemCopy
(
item
,
parent
)
{
let
clone
=
JSON
.
parse
(
JSON
.
stringify
(
item
))
clone
=
this
.
createIdAndKey
(
clone
)
parent
.
push
(
clone
)
this
.
activeFormItem
(
clone
)
},
createIdAndKey
(
item
)
{
item
.
formId
=
++
this
.
idGlobal
item
.
renderKey
=
+
new
Date
()
if
(
item
.
layout
===
'
colFormItem
'
)
{
item
.
vModel
=
`field
${
this
.
idGlobal
}
`
}
else
if
(
item
.
layout
===
'
rowFormItem
'
)
{
item
.
componentName
=
`row
${
this
.
idGlobal
}
`
}
if
(
Array
.
isArray
(
item
.
children
))
{
item
.
children
=
item
.
children
.
map
(
childItem
=>
this
.
createIdAndKey
(
childItem
))
}
return
item
},
drawingItemDelete
(
index
,
parent
)
{
parent
.
splice
(
index
,
1
)
this
.
$nextTick
(()
=>
{
const
len
=
this
.
drawingList
.
length
if
(
len
)
{
this
.
activeFormItem
(
this
.
drawingList
[
len
-
1
])
}
})
},
generateCode
()
{
const
{
type
}
=
this
.
generateConf
this
.
AssembleFormData
()
const
script
=
vueScript
(
makeUpJs
(
this
.
formData
,
type
))
const
html
=
vueTemplate
(
makeUpHtml
(
this
.
formData
,
type
))
const
css
=
cssStyle
(
makeUpCss
(
this
.
formData
))
return
beautifier
.
html
(
html
+
script
+
css
,
beautifierConf
.
html
)
},
download
()
{
this
.
dialogVisible
=
true
this
.
showFileName
=
true
this
.
operationType
=
'
download
'
},
run
()
{
this
.
dialogVisible
=
true
this
.
showFileName
=
false
this
.
operationType
=
'
run
'
},
copy
()
{
this
.
dialogVisible
=
true
this
.
showFileName
=
false
this
.
operationType
=
'
copy
'
},
tagChange
(
newTag
)
{
newTag
=
this
.
cloneComponent
(
newTag
)
newTag
.
vModel
=
this
.
activeData
.
vModel
newTag
.
formId
=
this
.
activeId
newTag
.
span
=
this
.
activeData
.
span
delete
this
.
activeData
.
tag
delete
this
.
activeData
.
tagIcon
delete
this
.
activeData
.
document
Object
.
keys
(
newTag
).
forEach
(
key
=>
{
if
(
this
.
activeData
[
key
]
!==
undefined
&&
typeof
this
.
activeData
[
key
]
===
typeof
newTag
[
key
])
{
newTag
[
key
]
=
this
.
activeData
[
key
]
}
})
this
.
activeData
=
newTag
this
.
updateDrawingList
(
newTag
,
this
.
drawingList
)
},
updateDrawingList
(
newTag
,
list
)
{
const
index
=
list
.
findIndex
(
item
=>
item
.
formId
===
this
.
activeId
)
if
(
index
>
-
1
)
{
list
.
splice
(
index
,
1
,
newTag
)
}
else
{
list
.
forEach
(
item
=>
{
if
(
Array
.
isArray
(
item
.
children
))
this
.
updateDrawingList
(
newTag
,
item
.
children
)
})
}
}
}
}
</
script
>
<
style
lang=
'scss'
>
body
,
html
{
margin
:
0
;
padding
:
0
;
background
:
#fff
;
-moz-osx-font-smoothing
:
grayscale
;
-webkit-font-smoothing
:
antialiased
;
text-rendering
:
optimizeLegibility
;
font-family
:
-
apple-system
,
BlinkMacSystemFont
,
Segoe
UI
,
Helvetica
,
Arial
,
sans-serif
,
Apple
Color
Emoji
,
Segoe
UI
Emoji
;
}
input
,
textarea
{
font-family
:
-
apple-system
,
BlinkMacSystemFont
,
Segoe
UI
,
Helvetica
,
Arial
,
sans-serif
,
Apple
Color
Emoji
,
Segoe
UI
Emoji
;
}
.editor-tabs
{
background
:
#121315
;
.el-tabs__header
{
margin
:
0
;
border-bottom-color
:
#121315
;
.el-tabs__nav
{
border-color
:
#121315
;
}
}
.el-tabs__item
{
height
:
32px
;
line-height
:
32px
;
color
:
#888a8e
;
border-left
:
1px
solid
#121315
!
important
;
background
:
#363636
;
margin-right
:
5px
;
user-select
:
none
;
}
.el-tabs__item.is-active
{
background
:
#1e1e1e
;
border-bottom-color
:
#1e1e1e
!
important
;
color
:
#fff
;
}
.el-icon-edit
{
color
:
#f1fa8c
;
}
.el-icon-document
{
color
:
#a95812
;
}
}
// home
.right-scrollbar
{
.el-scrollbar__view
{
padding
:
12px
18px
15px
15px
;
}
}
.el-scrollbar__wrap
{
box-sizing
:
border-box
;
overflow-x
:
hidden
!
important
;
margin-bottom
:
0
!
important
;
}
.center-tabs
{
.el-tabs__header
{
margin-bottom
:
0
!
important
;
}
.el-tabs__item
{
width
:
50%
;
text-align
:
center
;
}
.el-tabs__nav
{
width
:
100%
;
}
}
.reg-item
{
padding
:
12px
6px
;
background
:
#f8f8f8
;
position
:
relative
;
border-radius
:
4px
;
.close-btn
{
position
:
absolute
;
right
:
-6px
;
top
:
-6px
;
display
:
block
;
width
:
16px
;
height
:
16px
;
line-height
:
16px
;
background
:
rgba
(
0
,
0
,
0
,
0
.2
);
border-radius
:
50%
;
color
:
#fff
;
text-align
:
center
;
z-index
:
1
;
cursor
:
pointer
;
font-size
:
12px
;
&
:hover
{
background
:
rgba
(
210
,
23
,
23
,
0
.5
)
}
}
&
+
.reg-item
{
margin-top
:
18px
;
}
}
.action-bar
{
&
.el-button
+
.el-button
{
margin-left
:
15px
;
}
&
i
{
font-size
:
20px
;
vertical-align
:
middle
;
position
:
relative
;
top
:
-1px
;
}
}
.custom-tree-node
{
width
:
100%
;
font-size
:
14px
;
.node-operation
{
float
:
right
;
}
i
[
class
*=
"el-icon"
]
+
i
[
class
*=
"el-icon"
]
{
margin-left
:
6px
;
}
.el-icon-plus
{
color
:
#409EFF
;
}
.el-icon-delete
{
color
:
#157a0c
;
}
}
.el-scrollbar__view
{
overflow-x
:
hidden
;
}
.el-rate
{
display
:
inline-block
;
vertical-align
:
text-top
;
}
.el-upload__tip
{
line-height
:
1
.2
;
}
$selectedColor
:
#f6f7ff
;
$lighterBlue
:
#409EFF
;
.container
{
position
:
relative
;
width
:
100%
;
height
:
100%
;
}
.components-list
{
padding
:
8px
;
box-sizing
:
border-box
;
height
:
100%
;
.components-item
{
display
:
inline-block
;
width
:
48%
;
margin
:
1%
;
transition
:
transform
0ms
!
important
;
}
}
.components-draggable
{
padding-bottom
:
20px
;
}
.components-title
{
font-size
:
14px
;
color
:
#222
;
margin
:
6px
2px
;
.svg-icon
{
color
:
#666
;
font-size
:
18px
;
}
}
.components-body
{
padding
:
8px
10px
;
background
:
$selectedColor
;
font-size
:
12px
;
cursor
:
move
;
border
:
1px
dashed
$selectedColor
;
border-radius
:
3px
;
.svg-icon
{
color
:
#777
;
font-size
:
15px
;
}
&
:hover
{
border
:
1px
dashed
#787be8
;
color
:
#787be8
;
.svg-icon
{
color
:
#787be8
;
}
}
}
.left-board
{
width
:
260px
;
position
:
absolute
;
left
:
0
;
top
:
0
;
height
:
100vh
;
}
.left-scrollbar
{
height
:
calc
(
100vh
-
42px
);
overflow
:
hidden
;
}
.center-scrollbar
{
height
:
calc
(
100vh
-
42px
);
overflow
:
hidden
;
border-left
:
1px
solid
#f1e8e8
;
border-right
:
1px
solid
#f1e8e8
;
box-sizing
:
border-box
;
}
.center-board
{
height
:
100vh
;
width
:
auto
;
margin
:
0
350px
0
260px
;
box-sizing
:
border-box
;
}
.empty-info
{
position
:
absolute
;
top
:
46%
;
left
:
0
;
right
:
0
;
text-align
:
center
;
font-size
:
18px
;
color
:
#ccb1ea
;
letter-spacing
:
4px
;
}
.action-bar
{
position
:
relative
;
height
:
42px
;
text-align
:
right
;
padding
:
0
15px
;
box-sizing
:
border-box
;;
border
:
1px
solid
#f1e8e8
;
border-top
:
none
;
border-left
:
none
;
.delete-btn
{
color
:
#F56C6C
;
}
}
.logo-wrapper
{
position
:
relative
;
height
:
42px
;
background
:
#fff
;
border-bottom
:
1px
solid
#f1e8e8
;
box-sizing
:
border-box
;
}
.logo
{
position
:
absolute
;
left
:
12px
;
top
:
6px
;
line-height
:
30px
;
color
:
#00afff
;
font-weight
:
600
;
font-size
:
17px
;
white-space
:
nowrap
;
>
img
{
width
:
30px
;
height
:
30px
;
vertical-align
:
top
;
}
.github
{
display
:
inline-block
;
vertical-align
:
sub
;
margin-left
:
15px
;
>
img
{
height
:
22px
;
}
}
}
.center-board-row
{
padding
:
12px
12px
15px
12px
;
box-sizing
:
border-box
;
&
>
.el-form
{
// 69 = 12+15+42
height
:
calc
(
100vh
-
69px
);
}
}
.drawing-board
{
height
:
100%
;
position
:
relative
;
.components-body
{
padding
:
0
;
margin
:
0
;
font-size
:
0
;
}
.sortable-ghost
{
position
:
relative
;
display
:
block
;
overflow
:
hidden
;
&
:
:
before
{
content
:
" "
;
position
:
absolute
;
left
:
0
;
right
:
0
;
top
:
0
;
height
:
3px
;
background
:
rgb
(
89
,
89
,
223
);
z-index
:
2
;
}
}
.components-item.sortable-ghost
{
width
:
100%
;
height
:
60px
;
background-color
:
$selectedColor
;
}
.active-from-item
{
&
>
.el-form-item
{
background
:
$selectedColor
;
border-radius
:
6px
;
}
&
>
.drawing-item-copy
,
&
>
.drawing-item-delete
{
display
:
initial
;
}
&
>
.component-name
{
color
:
$lighterBlue
;
}
}
.el-form-item
{
margin-bottom
:
15px
;
}
}
.drawing-item
{
position
:
relative
;
cursor
:
move
;
&
.unfocus-bordered
:not
(
.activeFromItem
)
>
div
:first-child
{
border
:
1px
dashed
#ccc
;
}
.el-form-item
{
padding
:
12px
10px
;
}
}
.drawing-row-item
{
position
:
relative
;
cursor
:
move
;
box-sizing
:
border-box
;
border
:
1px
dashed
#ccc
;
border-radius
:
3px
;
padding
:
0
2px
;
margin-bottom
:
15px
;
.drawing-row-item
{
margin-bottom
:
2px
;
}
.el-col
{
margin-top
:
22px
;
}
.el-form-item
{
margin-bottom
:
0
;
}
.drag-wrapper
{
min-height
:
80px
;
}
&
.active-from-item
{
border
:
1px
dashed
$lighterBlue
;
}
.component-name
{
position
:
absolute
;
top
:
0
;
left
:
0
;
font-size
:
12px
;
color
:
#bbb
;
display
:
inline-block
;
padding
:
0
6px
;
}
}
.drawing-item
,
.drawing-row-item
{
&
:hover
{
&
>
.el-form-item
{
background
:
$selectedColor
;
border-radius
:
6px
;
}
&
>
.drawing-item-copy
,
&
>
.drawing-item-delete
{
display
:
initial
;
}
}
&
>
.drawing-item-copy
,
&
>
.drawing-item-delete
{
display
:
none
;
position
:
absolute
;
top
:
-10px
;
width
:
22px
;
height
:
22px
;
line-height
:
22px
;
text-align
:
center
;
border-radius
:
50%
;
font-size
:
12px
;
border
:
1px
solid
;
cursor
:
pointer
;
z-index
:
1
;
}
&
>
.drawing-item-copy
{
right
:
56px
;
border-color
:
$lighterBlue
;
color
:
$lighterBlue
;
background
:
#fff
;
&
:hover
{
background
:
$lighterBlue
;
color
:
#fff
;
}
}
&
>
.drawing-item-delete
{
right
:
24px
;
border-color
:
#F56C6C
;
color
:
#F56C6C
;
background
:
#fff
;
&
:hover
{
background
:
#F56C6C
;
color
:
#fff
;
}
}
}
</
style
>
ruoyi-ui/src/views/tool/gen/genInfoForm.vue
View file @
cb0a4b78
...
@@ -6,7 +6,7 @@
...
@@ -6,7 +6,7 @@
<span
slot=
"label"
>
生成模板
</span>
<span
slot=
"label"
>
生成模板
</span>
<el-select
v-model=
"info.tplCategory"
>
<el-select
v-model=
"info.tplCategory"
>
<el-option
label=
"单表(增删改查)"
value=
"crud"
/>
<el-option
label=
"单表(增删改查)"
value=
"crud"
/>
<el-option
label=
"树表(增删改查)"
value=
"tree"
disabled
/>
<el-option
label=
"树表(增删改查)"
value=
"tree"
/>
</el-select>
</el-select>
</el-form-item>
</el-form-item>
</el-col>
</el-col>
...
...
ruoyi/pom.xml
View file @
cb0a4b78
...
@@ -5,7 +5,7 @@
...
@@ -5,7 +5,7 @@
<groupId>
com.ruoyi
</groupId>
<groupId>
com.ruoyi
</groupId>
<artifactId>
ruoyi
</artifactId>
<artifactId>
ruoyi
</artifactId>
<version>
2.
0
.0
</version>
<version>
2.
1
.0
</version>
<packaging>
jar
</packaging>
<packaging>
jar
</packaging>
<name>
ruoyi
</name>
<name>
ruoyi
</name>
...
@@ -43,14 +43,6 @@
...
@@ -43,14 +43,6 @@
<dependency>
<dependency>
<groupId>
org.springframework.boot
</groupId>
<groupId>
org.springframework.boot
</groupId>
<artifactId>
spring-boot-starter
</artifactId>
<artifactId>
spring-boot-starter
</artifactId>
<!--
<exclusions>
<exclusion>
<artifactId>spring-boot-starter-tomcat</artifactId>
<groupId>org.springframework.boot</groupId>
</exclusion>
</exclusions>
-->
</dependency>
</dependency>
<!-- SpringBoot 测试 -->
<!-- SpringBoot 测试 -->
...
...
ruoyi/src/main/java/com/ruoyi/common/constant/GenConstants.java
View file @
cb0a4b78
...
@@ -48,7 +48,7 @@ public class GenConstants
...
@@ -48,7 +48,7 @@ public class GenConstants
public
static
final
String
[]
BASE_ENTITY
=
{
"createBy"
,
"createTime"
,
"updateBy"
,
"updateTime"
,
"remark"
};
public
static
final
String
[]
BASE_ENTITY
=
{
"createBy"
,
"createTime"
,
"updateBy"
,
"updateTime"
,
"remark"
};
/** Tree基类字段 */
/** Tree基类字段 */
public
static
final
String
[]
TREE_ENTITY
=
{
"parentName"
,
"parentId"
,
"orderNum"
,
"ancestors"
};
public
static
final
String
[]
TREE_ENTITY
=
{
"parentName"
,
"parentId"
,
"orderNum"
,
"ancestors"
,
"children"
};
/** 文本框 */
/** 文本框 */
public
static
final
String
HTML_INPUT
=
"input"
;
public
static
final
String
HTML_INPUT
=
"input"
;
...
...
ruoyi/src/main/java/com/ruoyi/common/utils/html/EscapeUtil.java
View file @
cb0a4b78
...
@@ -144,7 +144,7 @@ public class EscapeUtil
...
@@ -144,7 +144,7 @@ public class EscapeUtil
public
static
void
main
(
String
[]
args
)
public
static
void
main
(
String
[]
args
)
{
{
String
html
=
"
<script>alert(1);</script>
"
;
String
html
=
"
alert('11111');
"
;
System
.
out
.
println
(
EscapeUtil
.
clean
(
html
));
System
.
out
.
println
(
EscapeUtil
.
clean
(
html
));
System
.
out
.
println
(
EscapeUtil
.
escape
(
html
));
System
.
out
.
println
(
EscapeUtil
.
escape
(
html
));
System
.
out
.
println
(
EscapeUtil
.
unescape
(
html
));
System
.
out
.
println
(
EscapeUtil
.
unescape
(
html
));
...
...
ruoyi/src/main/java/com/ruoyi/framework/web/domain/TreeEntity.java
0 → 100644
View file @
cb0a4b78
package
com.ruoyi.framework.web.domain
;
import
java.util.ArrayList
;
import
java.util.List
;
/**
* Tree基类
*
* @author ruoyi
*/
public
class
TreeEntity
extends
BaseEntity
{
private
static
final
long
serialVersionUID
=
1L
;
/** 父菜单名称 */
private
String
parentName
;
/** 父菜单ID */
private
Long
parentId
;
/** 显示顺序 */
private
Integer
orderNum
;
/** 祖级列表 */
private
String
ancestors
;
/** 子部门 */
private
List
<?>
children
=
new
ArrayList
<>();
public
String
getParentName
()
{
return
parentName
;
}
public
void
setParentName
(
String
parentName
)
{
this
.
parentName
=
parentName
;
}
public
Long
getParentId
()
{
return
parentId
;
}
public
void
setParentId
(
Long
parentId
)
{
this
.
parentId
=
parentId
;
}
public
Integer
getOrderNum
()
{
return
orderNum
;
}
public
void
setOrderNum
(
Integer
orderNum
)
{
this
.
orderNum
=
orderNum
;
}
public
String
getAncestors
()
{
return
ancestors
;
}
public
void
setAncestors
(
String
ancestors
)
{
this
.
ancestors
=
ancestors
;
}
public
List
<?>
getChildren
()
{
return
children
;
}
public
void
setChildren
(
List
<?>
children
)
{
this
.
children
=
children
;
}
}
ruoyi/src/main/java/com/ruoyi/project/system/controller/SysDeptController.java
View file @
cb0a4b78
...
@@ -41,7 +41,7 @@ public class SysDeptController extends BaseController
...
@@ -41,7 +41,7 @@ public class SysDeptController extends BaseController
public
AjaxResult
list
(
SysDept
dept
)
public
AjaxResult
list
(
SysDept
dept
)
{
{
List
<
SysDept
>
depts
=
deptService
.
selectDeptList
(
dept
);
List
<
SysDept
>
depts
=
deptService
.
selectDeptList
(
dept
);
return
AjaxResult
.
success
(
dept
Service
.
buildDeptTree
(
depts
)
);
return
AjaxResult
.
success
(
dept
s
);
}
}
/**
/**
...
...
ruoyi/src/main/java/com/ruoyi/project/system/controller/SysMenuController.java
View file @
cb0a4b78
...
@@ -49,7 +49,7 @@ public class SysMenuController extends BaseController
...
@@ -49,7 +49,7 @@ public class SysMenuController extends BaseController
LoginUser
loginUser
=
tokenService
.
getLoginUser
(
ServletUtils
.
getRequest
());
LoginUser
loginUser
=
tokenService
.
getLoginUser
(
ServletUtils
.
getRequest
());
Long
userId
=
loginUser
.
getUser
().
getUserId
();
Long
userId
=
loginUser
.
getUser
().
getUserId
();
List
<
SysMenu
>
menus
=
menuService
.
selectMenuList
(
menu
,
userId
);
List
<
SysMenu
>
menus
=
menuService
.
selectMenuList
(
menu
,
userId
);
return
AjaxResult
.
success
(
menu
Service
.
buildMenuTree
(
menus
)
);
return
AjaxResult
.
success
(
menu
s
);
}
}
/**
/**
...
...
ruoyi/src/main/java/com/ruoyi/project/tool/gen/controller/GenController.java
View file @
cb0a4b78
...
@@ -37,7 +37,6 @@ import com.ruoyi.project.tool.gen.service.IGenTableService;
...
@@ -37,7 +37,6 @@ import com.ruoyi.project.tool.gen.service.IGenTableService;
@RequestMapping
(
"/tool/gen"
)
@RequestMapping
(
"/tool/gen"
)
public
class
GenController
extends
BaseController
public
class
GenController
extends
BaseController
{
{
@Autowired
@Autowired
private
IGenTableService
genTableService
;
private
IGenTableService
genTableService
;
...
...
ruoyi/src/main/java/com/ruoyi/project/tool/gen/domain/GenTable.java
View file @
cb0a4b78
...
@@ -3,6 +3,7 @@ package com.ruoyi.project.tool.gen.domain;
...
@@ -3,6 +3,7 @@ package com.ruoyi.project.tool.gen.domain;
import
java.util.List
;
import
java.util.List
;
import
javax.validation.Valid
;
import
javax.validation.Valid
;
import
javax.validation.constraints.NotBlank
;
import
javax.validation.constraints.NotBlank
;
import
org.apache.commons.lang3.ArrayUtils
;
import
com.ruoyi.common.constant.GenConstants
;
import
com.ruoyi.common.constant.GenConstants
;
import
com.ruoyi.common.utils.StringUtils
;
import
com.ruoyi.common.utils.StringUtils
;
import
com.ruoyi.framework.web.domain.BaseEntity
;
import
com.ruoyi.framework.web.domain.BaseEntity
;
...
@@ -262,7 +263,8 @@ public class GenTable extends BaseEntity
...
@@ -262,7 +263,8 @@ public class GenTable extends BaseEntity
{
{
if
(
isTree
(
tplCategory
))
if
(
isTree
(
tplCategory
))
{
{
StringUtils
.
equalsAnyIgnoreCase
(
javaField
,
GenConstants
.
TREE_ENTITY
);
return
StringUtils
.
equalsAnyIgnoreCase
(
javaField
,
ArrayUtils
.
addAll
(
GenConstants
.
TREE_ENTITY
,
GenConstants
.
BASE_ENTITY
));
}
}
return
StringUtils
.
equalsAnyIgnoreCase
(
javaField
,
GenConstants
.
BASE_ENTITY
);
return
StringUtils
.
equalsAnyIgnoreCase
(
javaField
,
GenConstants
.
BASE_ENTITY
);
}
}
...
...
ruoyi/src/main/java/com/ruoyi/project/tool/gen/util/VelocityUtils.java
View file @
cb0a4b78
...
@@ -95,7 +95,14 @@ public class VelocityUtils
...
@@ -95,7 +95,14 @@ public class VelocityUtils
templates
.
add
(
"vm/xml/mapper.xml.vm"
);
templates
.
add
(
"vm/xml/mapper.xml.vm"
);
templates
.
add
(
"vm/sql/sql.vm"
);
templates
.
add
(
"vm/sql/sql.vm"
);
templates
.
add
(
"vm/js/api.js.vm"
);
templates
.
add
(
"vm/js/api.js.vm"
);
templates
.
add
(
"vm/vue/index.vue.vm"
);
if
(
GenConstants
.
TPL_CRUD
.
equals
(
tplCategory
))
{
templates
.
add
(
"vm/vue/index.vue.vm"
);
}
else
if
(
GenConstants
.
TPL_TREE
.
equals
(
tplCategory
))
{
templates
.
add
(
"vm/vue/index-tree.vue.vm"
);
}
return
templates
;
return
templates
;
}
}
...
@@ -147,11 +154,15 @@ public class VelocityUtils
...
@@ -147,11 +154,15 @@ public class VelocityUtils
{
{
fileName
=
businessName
+
"Menu.sql"
;
fileName
=
businessName
+
"Menu.sql"
;
}
}
else
if
(
template
.
contains
(
"js.vm"
))
else
if
(
template
.
contains
(
"
api.
js.vm"
))
{
{
fileName
=
StringUtils
.
format
(
"{}/api/{}/{}.js"
,
vuePath
,
moduleName
,
businessName
);
fileName
=
StringUtils
.
format
(
"{}/api/{}/{}.js"
,
vuePath
,
moduleName
,
businessName
);
}
}
else
if
(
template
.
contains
(
"vue.vm"
))
else
if
(
template
.
contains
(
"index.vue.vm"
))
{
fileName
=
StringUtils
.
format
(
"{}/views/{}/{}/index.vue"
,
vuePath
,
moduleName
,
businessName
);
}
else
if
(
template
.
contains
(
"index-tree.vue.vm"
))
{
{
fileName
=
StringUtils
.
format
(
"{}/views/{}/{}/index.vue"
,
vuePath
,
moduleName
,
businessName
);
fileName
=
StringUtils
.
format
(
"{}/views/{}/{}/index.vue"
,
vuePath
,
moduleName
,
businessName
);
}
}
...
...
ruoyi/src/main/resources/application.yml
View file @
cb0a4b78
...
@@ -3,7 +3,7 @@ ruoyi:
...
@@ -3,7 +3,7 @@ ruoyi:
# 名称
# 名称
name
:
RuoYi
name
:
RuoYi
# 版本
# 版本
version
:
2.
0
.0
version
:
2.
1
.0
# 版权年份
# 版权年份
copyrightYear
:
2019
copyrightYear
:
2019
# 实例演示开关
# 实例演示开关
...
...
ruoyi/src/main/resources/mybatis/monitor/SysLogininforMapper.xml
View file @
cb0a4b78
...
@@ -40,6 +40,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
...
@@ -40,6 +40,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
and date_format(login_time,'%y%m%d')
<
= date_format(#{endTime},'%y%m%d')
and date_format(login_time,'%y%m%d')
<
= date_format(#{endTime},'%y%m%d')
</if>
</if>
</where>
</where>
order by info_id desc
</select>
</select>
<delete
id=
"deleteLogininforByIds"
parameterType=
"Long"
>
<delete
id=
"deleteLogininforByIds"
parameterType=
"Long"
>
...
...
ruoyi/src/main/resources/mybatis/monitor/SysOperLogMapper.xml
View file @
cb0a4b78
...
@@ -25,7 +25,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
...
@@ -25,7 +25,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
<sql
id=
"selectOperLogVo"
>
<sql
id=
"selectOperLogVo"
>
select oper_id, title, business_type, method, request_method, operator_type, oper_name, dept_name, oper_url, oper_ip, oper_location, oper_param, json_result, status, error_msg, oper_time
select oper_id, title, business_type, method, request_method, operator_type, oper_name, dept_name, oper_url, oper_ip, oper_location, oper_param, json_result, status, error_msg, oper_time
from sys_oper_log
from sys_oper_log
order by oper_id desc
</sql>
</sql>
<insert
id=
"insertOperlog"
parameterType=
"SysOperLog"
>
<insert
id=
"insertOperlog"
parameterType=
"SysOperLog"
>
...
...
ruoyi/src/main/resources/vm/java/controller.java.vm
View file @
cb0a4b78
...
@@ -18,7 +18,10 @@ import ${packageName}.service.I${ClassName}Service;
...
@@ -18,7 +18,10 @@ import ${packageName}.service.I${ClassName}Service;
import
com
.
ruoyi
.
framework
.
web
.
controller
.
BaseController
;
import
com
.
ruoyi
.
framework
.
web
.
controller
.
BaseController
;
import
com
.
ruoyi
.
framework
.
web
.
domain
.
AjaxResult
;
import
com
.
ruoyi
.
framework
.
web
.
domain
.
AjaxResult
;
import
com
.
ruoyi
.
common
.
utils
.
poi
.
ExcelUtil
;
import
com
.
ruoyi
.
common
.
utils
.
poi
.
ExcelUtil
;
#
if
($
table
.
crud
)
import
com
.
ruoyi
.
framework
.
web
.
page
.
TableDataInfo
;
import
com
.
ruoyi
.
framework
.
web
.
page
.
TableDataInfo
;
#
elseif
($
table
.
tree
)
#
end
/**
/**
*
${
functionName
}
Controller
*
${
functionName
}
Controller
...
@@ -38,12 +41,20 @@ public class ${ClassName}Controller extends BaseController
...
@@ -38,12 +41,20 @@ public class ${ClassName}Controller extends BaseController
*/
*/
@
PreAuthorize
(
"@ss.hasPermi('${permissionPrefix}:list')"
)
@
PreAuthorize
(
"@ss.hasPermi('${permissionPrefix}:list')"
)
@
GetMapping
(
"/list"
)
@
GetMapping
(
"/list"
)
#
if
($
table
.
crud
)
public
TableDataInfo
list
(${
ClassName
}
${
className
})
public
TableDataInfo
list
(${
ClassName
}
${
className
})
{
{
startPage
();
startPage
();
List
<${
ClassName
}>
list
=
${
className
}
Service
.
select
${
ClassName
}
List
(${
className
});
List
<${
ClassName
}>
list
=
${
className
}
Service
.
select
${
ClassName
}
List
(${
className
});
return
getDataTable
(
list
);
return
getDataTable
(
list
);
}
}
#
elseif
($
table
.
tree
)
public
AjaxResult
list
(${
ClassName
}
${
className
})
{
List
<${
ClassName
}>
list
=
${
className
}
Service
.
select
${
ClassName
}
List
(${
className
});
return
AjaxResult
.
success
(
list
);
}
#
end
/**
/**
*
导出
${
functionName
}
列表
*
导出
${
functionName
}
列表
...
...
ruoyi/src/main/resources/vm/java/domain.java.vm
View file @
cb0a4b78
...
@@ -3,7 +3,11 @@ package ${packageName}.domain;
...
@@ -3,7 +3,11 @@ package ${packageName}.domain;
import
org
.
apache
.
commons
.
lang3
.
builder
.
ToStringBuilder
;
import
org
.
apache
.
commons
.
lang3
.
builder
.
ToStringBuilder
;
import
org
.
apache
.
commons
.
lang3
.
builder
.
ToStringStyle
;
import
org
.
apache
.
commons
.
lang3
.
builder
.
ToStringStyle
;
import
com
.
ruoyi
.
framework
.
aspectj
.
lang
.
annotation
.
Excel
;
import
com
.
ruoyi
.
framework
.
aspectj
.
lang
.
annotation
.
Excel
;
#
if
($
table
.
crud
)
import
com
.
ruoyi
.
framework
.
web
.
domain
.
BaseEntity
;
import
com
.
ruoyi
.
framework
.
web
.
domain
.
BaseEntity
;
#
elseif
($
table
.
tree
)
import
com
.
ruoyi
.
framework
.
web
.
domain
.
TreeEntity
;
#
end
#
foreach
($
import
in
$
importList
)
#
foreach
($
import
in
$
importList
)
import
${
import
};
import
${
import
};
#
end
#
end
...
@@ -14,7 +18,11 @@ import ${import};
...
@@ -14,7 +18,11 @@ import ${import};
*
@
author
${
author
}
*
@
author
${
author
}
*
@
date
${
datetime
}
*
@
date
${
datetime
}
*/
*/
#
if
($
table
.
crud
)
#
set
($
Entity
=
"BaseEntity"
)
#
set
($
Entity
=
"BaseEntity"
)
#
elseif
($
table
.
tree
)
#
set
($
Entity
=
"TreeEntity"
)
#
end
public
class
${
ClassName
}
extends
${
Entity
}
public
class
${
ClassName
}
extends
${
Entity
}
{
{
private
static
final
long
serialVersionUID
=
1L
;
private
static
final
long
serialVersionUID
=
1L
;
...
@@ -43,7 +51,7 @@ public class ${ClassName} extends ${Entity}
...
@@ -43,7 +51,7 @@ public class ${ClassName} extends ${Entity}
#
end
#
end
#
foreach
($
column
in
$
columns
)
#
foreach
($
column
in
$
columns
)
#
if
(
!$table.isSuperColumn($column.javaField))
#
if
(
!$table.isSuperColumn($column.javaField))
#
if
($
column
.
javaField
>
2
&&
$
column
.
javaField
.
substring
(
1
,
2
).
matches
(
"[A-Z]"
))
#
if
($
column
.
javaField
.
length
()
>
2
&&
$
column
.
javaField
.
substring
(
1
,
2
).
matches
(
"[A-Z]"
))
#
set
($
AttrName
=$
column
.
javaField
)
#
set
($
AttrName
=$
column
.
javaField
)
#
else
#
else
#
set
($
AttrName
=$
column
.
javaField
.
substring
(
0
,
1
).
toUpperCase
()
+
${
column
.
javaField
.
substring
(
1
)})
#
set
($
AttrName
=$
column
.
javaField
.
substring
(
0
,
1
).
toUpperCase
()
+
${
column
.
javaField
.
substring
(
1
)})
...
@@ -64,7 +72,7 @@ public class ${ClassName} extends ${Entity}
...
@@ -64,7 +72,7 @@ public class ${ClassName} extends ${Entity}
public
String
toString
()
{
public
String
toString
()
{
return
new
ToStringBuilder
(
this
,
ToStringStyle
.
MULTI_LINE_STYLE
)
return
new
ToStringBuilder
(
this
,
ToStringStyle
.
MULTI_LINE_STYLE
)
#
foreach
($
column
in
$
columns
)
#
foreach
($
column
in
$
columns
)
#
if
($
column
.
javaField
>
2
&&
$
column
.
javaField
.
substring
(
1
,
2
).
matches
(
"[A-Z]"
))
#
if
($
column
.
javaField
.
length
()
>
2
&&
$
column
.
javaField
.
substring
(
1
,
2
).
matches
(
"[A-Z]"
))
#
set
($
AttrName
=$
column
.
javaField
)
#
set
($
AttrName
=$
column
.
javaField
)
#
else
#
else
#
set
($
AttrName
=$
column
.
javaField
.
substring
(
0
,
1
).
toUpperCase
()
+
${
column
.
javaField
.
substring
(
1
)})
#
set
($
AttrName
=$
column
.
javaField
.
substring
(
0
,
1
).
toUpperCase
()
+
${
column
.
javaField
.
substring
(
1
)})
...
...
ruoyi/src/main/resources/vm/vue/index-tree.vue.vm
0 → 100644
View file @
cb0a4b78
<template>
<div class="app-container">
<el-form :model="queryParams" ref="queryForm" :inline="true" label-width="68px">
#foreach($column in $columns)
#if($column.query)
#set($dictType=$column.dictType)
#set($AttrName=$column.javaField.substring(0,1).toUpperCase() + ${column.javaField.substring(1)})
#set($parentheseIndex=$column.columnComment.indexOf("("))
#if($parentheseIndex != -1)
#set($comment=$column.columnComment.substring(0, $parentheseIndex))
#else
#set($comment=$column.columnComment)
#end
#if($column.htmlType == "input")
<el-form-item label="${comment}" prop="${column.javaField}">
<el-input
v-model="queryParams.${column.javaField}"
placeholder="请输入${comment}"
clearable
size="small"
@keyup.enter.native="handleQuery"
/>
</el-form-item>
#elseif(($column.htmlType == "select" || $column.htmlType == "radio") && "" != $dictType)
<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.dictValue"
:label="dict.dictLabel"
:value="dict.dictValue"
/>
</el-select>
</el-form-item>
#elseif(($column.htmlType == "select" || $column.htmlType == "radio") && $dictType)
<el-form-item label="${comment}" prop="${column.javaField}">
<el-select v-model="queryParams.${column.javaField}" placeholder="请选择${comment}" clearable size="small">
<el-option label="请选择字典生成" value="" />
</el-select>
</el-form-item>
#elseif($column.htmlType == "datetime")
<el-form-item label="${comment}" prop="${column.javaField}">
<el-date-picker clearable size="small" style="width: 200px"
v-model="queryParams.${column.javaField}"
type="date"
value-format="yyyy-MM-dd"
placeholder="选择${comment}">
</el-date-picker>
</el-form-item>
#end
#end
#end
<el-form-item>
<el-button
class="filter-item"
type="primary"
icon="el-icon-search"
size="mini"
@click="handleQuery"
>搜索</el-button>
<el-button
class="filter-item"
type="primary"
icon="el-icon-plus"
size="mini"
@click="handleAdd"
v-hasPermi="['${moduleName}:${businessName}:add']"
>新增</el-button>
</el-form-item>
</el-form>
<el-table
v-loading="loading"
:data="${businessName}List"
row-key="${treeCode}"
default-expand-all
:tree-props="{children: 'children', hasChildren: 'hasChildren'}"
>
#foreach($column in $columns)
#set($javaField=$column.javaField)
#set($parentheseIndex=$column.columnComment.indexOf("("))
#if($parentheseIndex != -1)
#set($comment=$column.columnComment.substring(0, $parentheseIndex))
#else
#set($comment=$column.columnComment)
#end
#if($column.pk)
#elseif($column.list && $column.htmlType == "datetime")
<el-table-column label="${comment}" align="center" prop="${javaField}" width="180">
<template slot-scope="scope">
<span>{{ parseTime(scope.row.${javaField}) }}</span>
</template>
</el-table-column>
#elseif($column.list && "" != $column.dictType)
<el-table-column label="${comment}" align="center" prop="${javaField}" :formatter="${javaField}Format" />
#elseif($column.list && "" != $javaField)
<el-table-column label="${comment}" align="center" prop="${javaField}" />
#end
#end
<el-table-column label="操作" align="center" class-name="small-padding fixed-width">
<template slot-scope="scope">
<el-button
size="mini"
type="text"
icon="el-icon-edit"
@click="handleUpdate(scope.row)"
v-hasPermi="['${moduleName}:${businessName}:edit']"
>修改</el-button>
<el-button
size="mini"
type="text"
icon="el-icon-delete"
@click="handleDelete(scope.row)"
v-hasPermi="['${moduleName}:${businessName}:remove']"
>删除</el-button>
</template>
</el-table-column>
</el-table>
<!-- 添加或修改${functionName}对话框 -->
<el-dialog :title="title" :visible.sync="open" width="500px">
<el-form ref="form" :model="form" :rules="rules" label-width="80px">
#foreach($column in $columns)
#set($field=$column.javaField)
#if($column.insert && !$column.pk)
#if(($column.usableColumn) || (!$column.superColumn))
#set($parentheseIndex=$column.columnComment.indexOf("("))
#if($parentheseIndex != -1)
#set($comment=$column.columnComment.substring(0, $parentheseIndex))
#else
#set($comment=$column.columnComment)
#end
#set($dictType=$column.dictType)
#if("" != $treeParentCode && $column.javaField == $treeParentCode)
<el-form-item label="${comment}" prop="${treeParentCode}">
<treeselect v-model="form.${treeParentCode}" :options="${businessName}Options" :normalizer="normalizer" placeholder="请选择${comment}" />
</el-form-item>
#elseif($column.htmlType == "input")
<el-form-item label="${comment}" prop="${field}">
<el-input v-model="form.${field}" placeholder="请输入${comment}" />
</el-form-item>
#elseif($column.htmlType == "select" && "" != $dictType)
<el-form-item label="${comment}">
<el-select v-model="form.${field}" placeholder="请选择${comment}">
<el-option
v-for="dict in ${field}Options"
:key="dict.dictValue"
:label="dict.dictLabel"
:value="dict.dictValue"
></el-option>
</el-select>
</el-form-item>
#elseif($column.htmlType == "select" && $dictType)
<el-form-item label="${comment}">
<el-select v-model="form.${field}" placeholder="请选择${comment}">
<el-option label="请选择字典生成" value="" />
</el-select>
</el-form-item>
#elseif($column.htmlType == "radio" && "" != $dictType)
<el-form-item label="${comment}">
<el-radio-group v-model="form.${field}">
<el-radio
v-for="dict in ${field}Options"
:key="dict.dictValue"
:label="dict.dictValue"
>{{dict.dictLabel}}</el-radio>
</el-radio-group>
</el-form-item>
#elseif($column.htmlType == "radio" && $dictType)
<el-form-item label="${comment}">
<el-radio-group v-model="form.${field}">
<el-radio label="1">请选择字典生成</el-radio>
</el-radio-group>
</el-form-item>
#elseif($column.htmlType == "datetime")
<el-form-item label="${comment}" prop="${field}">
<el-date-picker clearable size="small" style="width: 200px"
v-model="form.${field}"
type="date"
value-format="yyyy-MM-dd"
placeholder="选择${comment}">
</el-date-picker>
</el-form-item>
#elseif($column.htmlType == "textarea")
<el-form-item label="${comment}" prop="${field}">
<el-input v-model="form.${field}" type="textarea" placeholder="请输入内容" />
</el-form-item>
#end
#end
#end
#end
</el-form>
<div slot="footer" class="dialog-footer">
<el-button type="primary" @click="submitForm">确 定</el-button>
<el-button @click="cancel">取 消</el-button>
</div>
</el-dialog>
</div>
</template>
<script>
import { list${BusinessName}, get${BusinessName}, del${BusinessName}, add${BusinessName}, update${BusinessName}, export${BusinessName} } from "@/api/${moduleName}/${businessName}";
import Treeselect from "@riophae/vue-treeselect";
import "@riophae/vue-treeselect/dist/vue-treeselect.css";
export default {
name: "${BusinessName}",
components: { Treeselect },
data() {
return {
// 遮罩层
loading: true,
// ${functionName}表格数据
${businessName}List: [],
// ${functionName}树选项
${businessName}Options: [],
// 弹出层标题
title: "",
// 是否显示弹出层
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: []#if($velocityCount != $columns.size()),#end
#end
#end
// 查询参数
queryParams: {
#foreach ($column in $columns)
#if($column.query)
$column.javaField: undefined#if($velocityCount != $columns.size()),#end
#end
#end
},
// 表单参数
form: {},
// 表单校验
rules: {
#foreach ($column in $columns)
#if($column.required)
#set($parentheseIndex=$column.columnComment.indexOf("("))
#if($parentheseIndex != -1)
#set($comment=$column.columnComment.substring(0, $parentheseIndex))
#else
#set($comment=$column.columnComment)
#end
#set($comment=$column.columnComment)
$column.javaField: [
{ required: true, message: "$comment不能为空", trigger: "blur" }
]#if($velocityCount != $columns.size()),#end
#end
#end
}
};
},
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}列表 */
getList() {
this.loading = true;
list${BusinessName}(this.queryParams).then(response => {
this.${businessName}List = this.handleTree(response.data, "${treeCode}", "${treeParentCode}");
this.loading = false;
});
},
/** 转换${functionName}数据结构 */
normalizer(node) {
if (node.children && !node.children.length) {
delete node.children;
}
return {
id: node.${treeCode},
label: node.${treeName},
children: node.children
};
},
/** 查询部门下拉树结构 */
getTreeselect() {
list${BusinessName}().then(response => {
this.${businessName}Options = [];
const data = { ${treeCode}: 0, ${treeName}: '顶级节点', children: [] };
data.children = this.handleTree(response.data, "${treeCode}", "${treeParentCode}");
this.${businessName}Options.push(data);
});
},
#foreach ($column in $columns)
#if(${column.dictType} != '')
#set($parentheseIndex=$column.columnComment.indexOf("("))
#if($parentheseIndex != -1)
#set($comment=$column.columnComment.substring(0, $parentheseIndex))
#else
#set($comment=$column.columnComment)
#end
// $comment字典翻译
${column.javaField}Format(row, column) {
return this.selectDictLabel(this.${column.javaField}Options, row.${column.javaField});
},
#end
#end
// 取消按钮
cancel() {
this.open = false;
this.reset();
},
// 表单重置
reset() {
this.form = {
#foreach ($column in $columns)
#if($column.htmlType == "radio")
$column.javaField: "0"#if($velocityCount != $columns.size()),#end
#else
$column.javaField: undefined#if($velocityCount != $columns.size()),#end
#end
#end
};
this.resetForm("form");
},
/** 搜索按钮操作 */
handleQuery() {
this.getList();
},
/** 重置按钮操作 */
resetQuery() {
this.resetForm("queryForm");
this.handleQuery();
},
/** 新增按钮操作 */
handleAdd() {
this.reset();
this.getTreeselect();
this.open = true;
this.title = "添加${functionName}";
},
/** 修改按钮操作 */
handleUpdate(row) {
this.reset();
this.getTreeselect();
if (row != undefined) {
this.form.${treeParentCode} = row.${treeCode};
}
get${BusinessName}(row.${pkColumn.javaField}).then(response => {
this.form = response.data;
this.open = true;
this.title = "修改${functionName}";
});
},
/** 提交按钮 */
submitForm: function() {
this.#[[$]]#refs["form"].validate(valid => {
if (valid) {
if (this.form.${pkColumn.javaField} != undefined) {
update${BusinessName}(this.form).then(response => {
if (response.code === 200) {
this.msgSuccess("修改成功");
this.open = false;
this.getList();
} else {
this.msgError(response.msg);
}
});
} else {
add${BusinessName}(this.form).then(response => {
if (response.code === 200) {
this.msgSuccess("新增成功");
this.open = false;
this.getList();
} else {
this.msgError(response.msg);
}
});
}
}
});
},
/** 删除按钮操作 */
handleDelete(row) {
this.$confirm('是否确认删除${functionName}编号为"' + row.${pkColumn.javaField} + '"的数据项?', "警告", {
confirmButtonText: "确定",
cancelButtonText: "取消",
type: "warning"
}).then(function() {
return del${BusinessName}(row.${pkColumn.javaField});
}).then(() => {
this.getList();
this.msgSuccess("删除成功");
}).catch(function() {});
}
}
};
</script>
\ No newline at end of file
ruoyi/src/main/resources/vm/vue/index.vue.vm
View file @
cb0a4b78
...
@@ -22,7 +22,7 @@
...
@@ -22,7 +22,7 @@
/>
/>
</el-form-item>
</el-form-item>
#elseif(($column.htmlType == "select" || $column.htmlType == "radio") && "" != $dictType)
#elseif(($column.htmlType == "select" || $column.htmlType == "radio") && "" != $dictType)
<el-form-item label="${comment}" prop="${column.javaField}">
<el-form-item label="${comment}" prop="${column.javaField}">
<el-select v-model="queryParams.${column.javaField}" placeholder="请选择${comment}" clearable size="small">
<el-select v-model="queryParams.${column.javaField}" placeholder="请选择${comment}" clearable size="small">
<el-option
<el-option
v-for="dict in ${column.javaField}Options"
v-for="dict in ${column.javaField}Options"
...
@@ -33,7 +33,7 @@
...
@@ -33,7 +33,7 @@
</el-select>
</el-select>
</el-form-item>
</el-form-item>
#elseif(($column.htmlType == "select" || $column.htmlType == "radio") && $dictType)
#elseif(($column.htmlType == "select" || $column.htmlType == "radio") && $dictType)
<el-form-item label="${comment}" prop="${column.javaField}">
<el-form-item label="${comment}" prop="${column.javaField}">
<el-select v-model="queryParams.${column.javaField}" placeholder="请选择${comment}" clearable size="small">
<el-select v-model="queryParams.${column.javaField}" placeholder="请选择${comment}" clearable size="small">
<el-option label="请选择字典生成" value="" />
<el-option label="请选择字典生成" value="" />
</el-select>
</el-select>
...
@@ -230,6 +230,7 @@
...
@@ -230,6 +230,7 @@
import { list${BusinessName}, get${BusinessName}, del${BusinessName}, add${BusinessName}, update${BusinessName}, export${BusinessName} } from "@/api/${moduleName}/${businessName}";
import { list${BusinessName}, get${BusinessName}, del${BusinessName}, add${BusinessName}, update${BusinessName}, export${BusinessName} } from "@/api/${moduleName}/${businessName}";
export default {
export default {
name: "${BusinessName}",
data() {
data() {
return {
return {
// 遮罩层
// 遮罩层
...
@@ -288,6 +289,7 @@ export default {
...
@@ -288,6 +289,7 @@ export default {
$column.javaField: [
$column.javaField: [
{ required: true, message: "$comment不能为空", trigger: "blur" }
{ required: true, message: "$comment不能为空", trigger: "blur" }
]#if($velocityCount != $columns.size()),#end
]#if($velocityCount != $columns.size()),#end
#end
#end
#end
#end
}
}
...
...
Write
Preview
Markdown
is supported
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