Skip to content
GitLab
Menu
Projects
Groups
Snippets
Help
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
Menu
Open sidebar
jinli gu
Springboot Plus
Commits
34c9ce81
Commit
34c9ce81
authored
Feb 07, 2020
by
trumansdo
Browse files
暂存,重新处理结果集映射
parent
404d2016
Changes
54
Hide whitespace changes
Inline
Side-by-side
ve-admin/admin-web/src/api/dict.js
View file @
34c9ce81
/*
/*
* @Author: 一日看尽长安花
* @Author: 一日看尽长安花
* @since: 2019-09-04 20:55:14
* @since: 2019-09-04 20:55:14
* @LastEditTime : 2020-0
1-11 20:47:10
* @LastEditTime : 2020-0
2-04 14:50:26
* @LastEditors : 一日看尽长安花
* @LastEditors : 一日看尽长安花
* @Description:
* @Description:
*/
*/
...
@@ -9,7 +9,7 @@ import request from '@/utils/request';
...
@@ -9,7 +9,7 @@ import request from '@/utils/request';
export
function
getDictsByParent
(
params
)
{
export
function
getDictsByParent
(
params
)
{
return
request
({
return
request
({
url
:
'
/core/dicts
'
,
url
:
'
/core/dicts
/tree
'
,
method
:
'
get
'
,
method
:
'
get
'
,
params
:
params
params
:
params
});
});
...
...
ve-admin/admin-web/src/api/org.js
0 → 100644
View file @
34c9ce81
/*
* @Author: 一日看尽长安花
* @since: 2019-09-04 20:55:14
* @LastEditTime : 2020-01-11 20:47:10
* @LastEditors : 一日看尽长安花
* @Description:
*/
import
request
from
'
@/utils/request
'
;
export
function
getOrgsByParent
(
params
)
{
return
request
({
url
:
'
/core/orgs/tree
'
,
method
:
'
get
'
,
params
:
params
});
}
ve-admin/admin-web/src/api/user.js
View file @
34c9ce81
/*
/*
* @Author: 一日看尽长安花
* @Author: 一日看尽长安花
* @since: 2019-09-04 20:55:14
* @since: 2019-09-04 20:55:14
* @LastEditTime: 20
19-10-27 23:13:10
* @LastEditTime
: 20
20-02-04 13:20:29
* @LastEditors: 一日看尽长安花
* @LastEditors
: 一日看尽长安花
* @Description:
* @Description:
*/
*/
import
request
from
'
@/utils/request
'
;
import
request
from
'
@/utils/request
'
;
...
@@ -34,7 +34,7 @@ export function users(params) {
...
@@ -34,7 +34,7 @@ export function users(params) {
return
request
({
return
request
({
url
:
'
/users
'
,
url
:
'
/users
'
,
method
:
'
get
'
,
method
:
'
get
'
,
params
:
params
params
});
});
}
}
...
...
ve-admin/admin-web/src/components/
TableViews
/DataTable.vue
→
ve-admin/admin-web/src/components/
GeneralPage
/DataTable.vue
View file @
34c9ce81
<!--
<!--
* @Author: 一日看尽长安花
* @Author: 一日看尽长安花
* @since: 2019-10-12 16:14:37
* @since: 2019-10-12 16:14:37
* @LastEditTime: 20
19-12-17 14:07:33
* @LastEditTime
: 20
20-02-06 11:32:07
* @LastEditors: 一日看尽长安花
* @LastEditors
: 一日看尽长安花
* @Description:
* @Description:
-->
-->
<
template
>
<
template
>
...
@@ -23,13 +23,16 @@
...
@@ -23,13 +23,16 @@
<el-table-column
:key=
"Math.random()"
type=
"index"
></el-table-column>
<el-table-column
:key=
"Math.random()"
type=
"index"
></el-table-column>
<el-table-column
<el-table-column
v-for=
"(val, key) in
m
etadata"
v-for=
"(val, key) in
visibleM
etadata"
:key=
"key"
:key=
"key"
:prop=
"val.
type === 'dict' ? key + '.name' : key
"
:prop=
"val.
json_path
"
:label=
"val.name"
:label=
"val.name"
:sortable=
"val.sortable"
:sortable=
"val.sortable"
:show-overflow-tooltip=
"true"
:show-overflow-tooltip=
"true"
>
>
<template
v-slot=
"scope"
>
{{
handleTableSlot
(
scope
)
}}
</
template
>
</el-table-column>
</el-table-column>
<el-table-column
:key=
"Math.random()"
width=
"170"
align=
"right"
>
<el-table-column
:key=
"Math.random()"
width=
"170"
align=
"right"
>
...
@@ -70,6 +73,7 @@
...
@@ -70,6 +73,7 @@
<
script
>
<
script
>
import
Pagination
from
'
./Pagination
'
;
import
Pagination
from
'
./Pagination
'
;
import
{
parseTime
,
formatTime
}
from
'
@/utils
'
;
export
default
{
export
default
{
name
:
'
DataTable
'
,
name
:
'
DataTable
'
,
...
@@ -114,12 +118,35 @@ export default {
...
@@ -114,12 +118,35 @@ export default {
cloneTableData
:
null
cloneTableData
:
null
};
};
},
},
computed
:
{
// 计算属性的 getter
visibleMetadata
:
function
()
{
// `this` 指向 vm 实例
let
_metadata
=
{};
for
(
let
dict
in
this
.
metadata
)
{
const
t
=
this
.
metadata
[
dict
];
if
(
t
.
is_show_table_panel
)
{
_metadata
[
dict
]
=
t
;
}
}
return
_metadata
;
}
},
updated
()
{
updated
()
{
console
.
log
(
'
以下是元数据和结果数据
'
);
//
console.log('以下是元数据和结果数据');
console
.
log
(
this
.
metadata
);
//
console.log(this.metadata);
console
.
log
(
this
.
tabledata
);
//
console.log(this.tabledata);
},
},
methods
:
{
methods
:
{
handleTableSlot
(
scope
)
{
let
val
=
this
.
$lodash
.
get
(
scope
.
row
,
scope
.
column
.
property
);
const
isTimestamp
=
scope
.
column
.
property
.
endsWith
(
'
_time
'
)
&&
typeof
val
===
'
number
'
;
if
(
isTimestamp
)
{
val
=
parseTime
(
val
/
1000
,
'
{y}-{m}-{d} {h}:{i}:{s}
'
);
}
return
val
;
},
searchTable
()
{
searchTable
()
{
/*
/*
要用一个临时数据将当前页面的数据保存下来。
要用一个临时数据将当前页面的数据保存下来。
...
...
ve-admin/admin-web/src/components/
TableViews
/Pagination.vue
→
ve-admin/admin-web/src/components/
GeneralPage
/Pagination.vue
View file @
34c9ce81
File moved
ve-admin/admin-web/src/components/
TableViews
/SearchPane.vue
→
ve-admin/admin-web/src/components/
GeneralPage
/SearchPane.vue
View file @
34c9ce81
<!--
<!--
* @Author: 一日看尽长安花
* @Author: 一日看尽长安花
* @since: 2019-10-12 16:14:37
* @since: 2019-10-12 16:14:37
* @LastEditTime : 2020-0
1
-0
9 23:16:28
* @LastEditTime : 2020-0
2
-0
3 16:21:23
* @LastEditors : 一日看尽长安花
* @LastEditors : 一日看尽长安花
* @Description:
* @Description:
-->
-->
...
@@ -16,7 +16,7 @@
...
@@ -16,7 +16,7 @@
>
>
<!-- 循环元数据构建搜索面板:除了下拉框 -->
<!-- 循环元数据构建搜索面板:除了下拉框 -->
<div
<div
v-for=
"(val, key) in
m
etadata"
v-for=
"(val, key) in
visibleM
etadata"
:key=
"key"
:key=
"key"
class=
"filter-item-container"
class=
"filter-item-container"
>
>
...
@@ -34,15 +34,17 @@
...
@@ -34,15 +34,17 @@
style=
"display: inline-block;position: relative;top: -0.3rem;"
style=
"display: inline-block;position: relative;top: -0.3rem;"
>
>
<el-date-picker
<el-date-picker
v-model=
"filterData[key + '
S
tart']"
v-model=
"filterData[key + '
_s
tart']"
type=
"datetime"
type=
"datetime"
value-format=
"timestamp"
:placeholder=
"val.name + '开始时间'"
:placeholder=
"val.name + '开始时间'"
>
>
</el-date-picker>
</el-date-picker>
<el-date-picker
<el-date-picker
v-model=
"filterData[key + '
E
nd']"
v-model=
"filterData[key + '
_e
nd']"
type=
"datetime"
type=
"datetime"
value-format=
"timestamp"
:placeholder=
"val.name + '结束时间'"
:placeholder=
"val.name + '结束时间'"
>
>
</el-date-picker>
</el-date-picker>
...
@@ -100,6 +102,21 @@ export default {
...
@@ -100,6 +102,21 @@ export default {
filterData
:
{}
filterData
:
{}
};
};
},
},
computed
:
{
// 计算属性的 getter
visibleMetadata
:
function
()
{
// `this` 指向 vm 实例
let
_metadata
=
{};
let
allowTypes
=
[
'
string
'
,
'
date
'
];
for
(
let
dict
in
this
.
metadata
)
{
const
t
=
this
.
metadata
[
dict
];
if
(
t
.
is_show_search_panel
&&
allowTypes
.
includes
(
t
.
type
))
{
_metadata
[
dict
]
=
t
;
}
}
return
_metadata
;
}
},
methods
:
{
methods
:
{
judgeType
(
str1
,
type
)
{
judgeType
(
str1
,
type
)
{
return
equalsIgnoreCase
(
str1
,
type
);
return
equalsIgnoreCase
(
str1
,
type
);
...
...
ve-admin/admin-web/src/components/
TableViews/EditDialog
.vue
→
ve-admin/admin-web/src/components/
GeneralPage/components/DetailPage
.vue
View file @
34c9ce81
<!--
<!--
* @Author: 一日看尽长安花
* @Author: 一日看尽长安花
* @since: 2019-10-12 16:14:37
* @since: 2019-10-12 16:14:37
* @LastEditTime: 20
19-12-17 14:41
:21
* @LastEditTime
: 20
20-02-05 17:00
:21
* @LastEditors: 一日看尽长安花
* @LastEditors
: 一日看尽长安花
* @Description:
* @Description:
-->
-->
<
template
>
<
template
>
<div
class=
"dialog-container"
>
<!--
<!--
对话框:通过$emit 继续提交open和close事件改变对话框的显示和隐藏
对话框:通过$emit 继续提交open和close事件改变对话框的显示和隐藏
-->
-->
<el-dialog
<el-dialog
:title=
"dialogTitle"
:fullscreen=
"true"
:visible=
"dialogVisible"
:center=
"true"
:close-on-click-modal=
"false"
:destroy-on-close=
"true"
@
open=
"openDialog"
:title=
"dialogTitle"
@
close=
"closeDialog"
:visible=
"dialogVisible"
>
:close-on-click-modal=
"false"
@
open=
"openDialog"
@
close=
"closeDialog"
>
<div
class=
"dialog-container"
>
<el-form
<el-form
ref=
"editForm"
ref=
"editForm"
:rules=
"rules"
:rules=
"rules"
:model=
"dialogData"
:model=
"dialogData"
label-position=
"
lef
t"
label-position=
"
righ
t"
label-width=
"
70px
"
label-width=
"
10vw
"
style=
"width: 400px; margin-left:50px;
"
class=
"sp-form
"
>
>
<el-form-item
<el-form-item
v-for=
"(val, key) in
m
etadata"
v-for=
"(val, key) in
visibleM
etadata"
:key=
"key"
:key=
"key"
:label=
"val.name"
:label=
"val.name"
:prop=
"key"
:prop=
"key"
...
@@ -36,36 +39,37 @@
...
@@ -36,36 +39,37 @@
v-model=
"dialogData[key]"
v-model=
"dialogData[key]"
:placeholder=
"val.name"
:placeholder=
"val.name"
:clearable=
"true"
:clearable=
"true"
style=
"width: 200px;"
class=
"sp-form-item"
class=
"filter-item"
/>
/>
<el-date-picker
<el-date-picker
v-else-if=
"judgeType(val.type, 'date')"
v-else-if=
"judgeType(val.type, 'date')"
v-model=
"dialogData[key]"
v-model=
"dialogData[key]"
type=
"datetime"
type=
"datetime"
value-format=
"timestamp"
:placeholder=
"val.name + '时间'"
:placeholder=
"val.name + '时间'"
class=
"sp-form-item"
>
>
</el-date-picker>
</el-date-picker>
</el-form-item>
</el-form-item>
<!-- 用于面板中的自定义表单元素,例如级联选择器,并通过作用域插槽的方式将数据传递给自定义表单 -->
<!-- 用于面板中的自定义表单元素,例如级联选择器,并通过作用域插槽的方式将数据传递给自定义表单 -->
<slot
:dialog-data=
"dialogData"
name=
"dialog-form-item"
></slot>
<slot
:dialog-data=
"dialogData"
name=
"dialog-form-item"
></slot>
</el-form>
</el-form>
<template
v-slot:footer
>
</div
>
<
div
class=
"dialog-
footer
"
>
<
template
v-slot:
footer
>
<el-button
@
click=
"closeDialog
"
>
<div
class=
"dialog-footer
"
>
取消
<el-button
@
click=
"closeDialog"
>
</el-button>
取消
<el-button
<
/
el-button
>
type=
"primary"
<el-button
@
click=
"operationType === 'create' ? createData() : updateData()
"
type=
"primary
"
>
@
click=
"operationType === 'create' ? createData() : updateData()"
确定
>
</el-button>
确定
</
div
>
</
el-button
>
</
template
>
</
div
>
</
el-dialog
>
</
template
>
</
div
>
</
el-dialog
>
</template>
</template>
<
script
>
<
script
>
...
@@ -108,6 +112,20 @@ export default {
...
@@ -108,6 +112,20 @@ export default {
data
()
{
data
()
{
return
{};
return
{};
},
},
computed
:
{
// 计算属性的 getter
visibleMetadata
:
function
()
{
// `this` 指向 vm 实例
let
_metadata
=
{};
for
(
let
dict
in
this
.
metadata
)
{
const
t
=
this
.
metadata
[
dict
];
if
(
t
.
is_show_editor_panel
)
{
_metadata
[
dict
]
=
t
;
}
}
return
_metadata
;
}
},
methods
:
{
methods
:
{
judgeType
(
str1
,
type
)
{
judgeType
(
str1
,
type
)
{
return
equalsIgnoreCase
(
str1
,
type
);
return
equalsIgnoreCase
(
str1
,
type
);
...
@@ -170,4 +188,15 @@ export default {
...
@@ -170,4 +188,15 @@ export default {
}
}
};
};
</
script
>
</
script
>
<
style
></
style
>
<
style
scope
>
.sp-form
{
width
:
50vw
;
margin
:
0
auto
;
}
.sp-form-item
{
width
:
100%
;
}
.el-date-editor.sp-form-item
{
width
:
100%
;
}
</
style
>
ve-admin/admin-web/src/components/
TableViews
/index.vue
→
ve-admin/admin-web/src/components/
GeneralPage
/index.vue
View file @
34c9ce81
...
@@ -31,7 +31,7 @@
...
@@ -31,7 +31,7 @@
@
handle-edit=
"handleEdit"
@
handle-edit=
"handleEdit"
@
delete-data=
"$emit('delete-data')"
@
delete-data=
"$emit('delete-data')"
></data-table>
></data-table>
<
edit-dialog
<
detail-page
:metadata=
"metadata"
:metadata=
"metadata"
:dialog-visible.sync=
"dialogVisible"
:dialog-visible.sync=
"dialogVisible"
:dialog-title=
"dialogTitle"
:dialog-title=
"dialogTitle"
...
@@ -45,18 +45,18 @@
...
@@ -45,18 +45,18 @@
<
template
#dialog-form-item=
"{dialogData:dialogData}"
>
<
template
#dialog-form-item=
"{dialogData:dialogData}"
>
<slot
:dialog-data=
"dialogData"
name=
"dialog-form-item"
></slot>
<slot
:dialog-data=
"dialogData"
name=
"dialog-form-item"
></slot>
</
template
>
</
template
>
</
edit-dialog
>
</
detail-page
>
</div>
</div>
</template>
</template>
<
script
>
<
script
>
import
SearchPane
from
'
./SearchPane
'
;
import
SearchPane
from
'
./SearchPane
'
;
import
DataTable
from
'
./DataTable
'
;
import
DataTable
from
'
./DataTable
'
;
import
EditDialog
from
'
./EditDialog
'
;
import
DetailPage
from
'
./components/DetailPage
'
;
export
default
{
export
default
{
name
:
'
TableViews
'
,
name
:
'
GeneralPage
'
,
components
:
{
SearchPane
,
DataTable
,
EditDialog
},
components
:
{
SearchPane
,
DataTable
,
DetailPage
},
props
:
{
props
:
{
// 表格元数据
// 表格元数据
metadata
:
{
metadata
:
{
...
...
ve-admin/admin-web/src/filters/index.js
View file @
34c9ce81
/*
* @Author: 一日看尽长安花
* @since: 2019-12-01 11:03:53
* @LastEditTime : 2020-01-28 14:20:30
* @LastEditors : 一日看尽长安花
* @Description:
*/
// import parseTime, formatTime and set to filter
// import parseTime, formatTime and set to filter
export
{
parseTime
,
formatTime
}
from
'
@/utils
'
export
{
parseTime
,
formatTime
}
from
'
@/utils
'
;
import
{
parseTime
,
formatTime
}
from
'
@/utils
'
;
/**
* Show plural label if time is plural number
* @param {number} timestamp 时间戳
* @return {string}
*/
export
function
symbolFormat
(
timestamp
)
{
timestamp
=
Number
(
timestamp
);
return
parseTime
(
timestamp
,
'
{y}-{m}-{d} {h}:{i}:{s}
'
);
}
/**
/**
* Show plural label if time is plural number
* Show plural label if time is plural number
...
@@ -7,24 +25,24 @@ export { parseTime, formatTime } from '@/utils'
...
@@ -7,24 +25,24 @@ export { parseTime, formatTime } from '@/utils'
* @param {string} label
* @param {string} label
* @return {string}
* @return {string}
*/
*/
function
pluralize
(
time
,
label
)
{
export
function
pluralize
(
time
,
label
)
{
if
(
time
===
1
)
{
if
(
time
===
1
)
{
return
time
+
label
return
time
+
label
;
}
}
return
time
+
label
+
'
s
'
return
time
+
label
+
'
s
'
;
}
}
/**
/**
* @param {number} time
* @param {number} time
*/
*/
export
function
timeAgo
(
time
)
{
export
function
timeAgo
(
time
)
{
const
between
=
Date
.
now
()
/
1000
-
Number
(
time
)
const
between
=
Date
.
now
()
/
1000
-
Number
(
time
)
;
if
(
between
<
3600
)
{
if
(
between
<
3600
)
{
return
pluralize
(
~~
(
between
/
60
),
'
minute
'
)
return
pluralize
(
~~
(
between
/
60
),
'
minute
'
)
;
}
else
if
(
between
<
86400
)
{
}
else
if
(
between
<
86400
)
{
return
pluralize
(
~~
(
between
/
3600
),
'
hour
'
)
return
pluralize
(
~~
(
between
/
3600
),
'
hour
'
)
;
}
else
{
}
else
{
return
pluralize
(
~~
(
between
/
86400
),
'
day
'
)
return
pluralize
(
~~
(
between
/
86400
),
'
day
'
)
;
}
}
}
}
...
@@ -36,19 +54,23 @@ export function timeAgo(time) {
...
@@ -36,19 +54,23 @@ export function timeAgo(time) {
*/
*/
export
function
numberFormatter
(
num
,
digits
)
{
export
function
numberFormatter
(
num
,
digits
)
{
const
si
=
[
const
si
=
[
{
value
:
1
E
18
,
symbol
:
'
E
'
},
{
value
:
1
e
18
,
symbol
:
'
E
'
},
{
value
:
1
E
15
,
symbol
:
'
P
'
},
{
value
:
1
e
15
,
symbol
:
'
P
'
},
{
value
:
1
E
12
,
symbol
:
'
T
'
},
{
value
:
1
e
12
,
symbol
:
'
T
'
},
{
value
:
1
E
9
,
symbol
:
'
G
'
},
{
value
:
1
e
9
,
symbol
:
'
G
'
},
{
value
:
1
E
6
,
symbol
:
'
M
'
},
{
value
:
1
e
6
,
symbol
:
'
M
'
},
{
value
:
1
E
3
,
symbol
:
'
k
'
}
{
value
:
1
e
3
,
symbol
:
'
k
'
}
]
]
;
for
(
let
i
=
0
;
i
<
si
.
length
;
i
++
)
{
for
(
let
i
=
0
;
i
<
si
.
length
;
i
++
)
{
if
(
num
>=
si
[
i
].
value
)
{
if
(
num
>=
si
[
i
].
value
)
{
return
(
num
/
si
[
i
].
value
+
0.1
).
toFixed
(
digits
).
replace
(
/
\.
0+$|
(\.[
0-9
]
*
[
1-9
])
0+$/
,
'
$1
'
)
+
si
[
i
].
symbol
return
(
(
num
/
si
[
i
].
value
+
0.1
)
.
toFixed
(
digits
)
.
replace
(
/
\.
0+$|
(\.[
0-9
]
*
[
1-9
])
0+$/
,
'
$1
'
)
+
si
[
i
].
symbol
);
}
}
}
}
return
num
.
toString
()
return
num
.
toString
()
;
}
}
/**
/**
...
@@ -56,7 +78,9 @@ export function numberFormatter(num, digits) {
...
@@ -56,7 +78,9 @@ export function numberFormatter(num, digits) {
* @param {number} num
* @param {number} num
*/
*/
export
function
toThousandFilter
(
num
)
{
export
function
toThousandFilter
(
num
)
{
return
(
+
num
||
0
).
toString
().
replace
(
/^-
?\d
+/g
,
m
=>
m
.
replace
(
/
(?=(?!\b)(\d{3})
+$
)
/g
,
'
,
'
))
return
(
+
num
||
0
)
.
toString
()
.
replace
(
/^-
?\d
+/g
,
m
=>
m
.
replace
(
/
(?=(?!\b)(\d{3})
+$
)
/g
,
'
,
'
));
}
}
/**
/**
...
@@ -64,5 +88,5 @@ export function toThousandFilter(num) {
...
@@ -64,5 +88,5 @@ export function toThousandFilter(num) {
* @param {String} string
* @param {String} string
*/
*/
export
function
uppercaseFirst
(
string
)
{
export
function
uppercaseFirst
(
string
)
{
return
string
.
charAt
(
0
).
toUpperCase
()
+
string
.
slice
(
1
)
return
string
.
charAt
(
0
).
toUpperCase
()
+
string
.
slice
(
1
)
;
}
}
ve-admin/admin-web/src/services/dict.js
0 → 100644
View file @
34c9ce81
/*
* @Author: 一日看尽长安花
* @since: 2020-01-13 23:12:07
* @LastEditTime : 2020-02-05 17:03:34
* @LastEditors : 一日看尽长安花
* @Description: 与业务有关的非纯api的js
*/
import
{
getDictsByParent
}
from
'
@/api/dict
'
;
/**
* @description: 异步载入级联器的数据
* @param {node} 参照cascader的lazyLoad同名参数
* @param {resolve} 同上
* @param {type} 第一级字典类型
*/
export
function
loadDictCascaderData
(
node
,
resolve
,
type
)
{
const
{
root
,
data
}
=
node
;
const
{
id
}
=
data
||
{};
let
datas
=
[];
if
(
!
root
)
{
type
=
null
;
}
let
reqParam
=
{
parentId
:
id
,
type
:
type
};
getDictsByParent
(
reqParam
)
.
then
(
result
=>
{
const
{
code
,
data
}
=
{
...
result
};
// 通过调用resolve将子节点数据返回,通知组件数据加载完成
datas
=
data
;
})
.
finally
(()
=>
{
resolve
(
datas
);
});
}
/**
* @description: 处理级联器的选中值,级联器选中值是个数组,需要处理为指定key-value
* @param {obj} 包含选中值的对象
* @param {modelKey} 级联器 cascader 的 v-model 选中值的key名称
* @param {keyNames} 转换后的 key 名称级,必须按照级联器选中值的顺序
* @returns {Object} 包含转换后的 key-value 值
*/
export
function
handleDictCascaderValue
(
obj
,
modelKey
,
keyNames
)
{
let
selValArray
=
obj
[
modelKey
]
||
[];
let
resObj
=
{};
for
(
var
i
in
selValArray
)
{
resObj
[
keyNames
[
i
]]
=
selValArray
[
i
];
}
delete
obj
[
modelKey
];
return
Object
.
assign
({},
obj
,
resObj
);
}
ve-admin/admin-web/src/services/org.js
0 → 100644
View file @
34c9ce81
/*
* @Author: 一日看尽长安花
* @since: 2020-01-13 23:12:07
* @LastEditTime : 2020-02-05 17:04:59
* @LastEditors : 一日看尽长安花
* @Description: 与业务有关的非纯api的js
*/
import
{
getOrgsByParent
}
from
'
@/api/org
'
;
/**
* @description: 异步载入级联器的数据
* @param {node} 参照cascader的lazyLoad同名参数
* @param {resolve} 同上
* @param {type} 第一级字典类型
*/
export
function
loadOrgCascaderData
(
node
,
resolve
)
{
const
{
root
,
data
}
=
node
;
const
{
id
}
=
data
||
{};
let
datas
=
[];
getOrgsByParent
({
parentId
:
id
})
.
then
(
result
=>
{
const
{
code
,
data
}
=
{
...
result
};
// 通过调用resolve将子节点数据返回,通知组件数据加载完成
datas
=
data
;
})
.
finally
(()
=>
{
resolve
(
datas
);
});
}
/**
* @description: 组织机构是唯一级别的,只取最后一级的value。所以不像字典多个级别
* @param {obj} 包含选中值的对象
* @param {modelKey} 级联器 cascader 的 v-model 选中值的key名称
* @param {keyName} 转换后的 key 名称,必须按照级联器选中值的顺序
* @returns {Object} 包含转换后的 key-value 值
*/
export
function
handleOrgCascaderValue
(
obj
,
modelKey
,
keyName
)
{
let
selValArray
=
obj
[
modelKey
]
||
[];
obj
[
keyName
]
=
selValArray
[
selValArray
.
length
-
1
];
delete
obj
[
modelKey
];
return
obj
;
}
ve-admin/admin-web/src/utils/object-util.js
View file @
34c9ce81
/*
/*
* @Author: 一日看尽长安花
* @Author: 一日看尽长安花
* @since: 2019-10-11 17:40:57
* @since: 2019-10-11 17:40:57
* @LastEditTime: 20
19-10-16 10:46:40
* @LastEditTime
: 20
20-02-04 13:10:03
* @LastEditors: 一日看尽长安花
* @LastEditors
: 一日看尽长安花
* @Description:
* @Description:
*/
*/
import
lodash
from
'
lodash
'
;
/**
/**
* @description: obj存在为true。由于js存在undefined 和 null两种特殊的数据类型,认为从空间和引用指向上,只要有一个不存在则判断为不存在。
* @description: obj存在为true。由于js存在undefined 和 null两种特殊的数据类型,认为从空间和引用指向上,只要有一个不存在则判断为不存在。
...
@@ -23,3 +24,53 @@ export function isExists(obj) {
...
@@ -23,3 +24,53 @@ export function isExists(obj) {
export
function
isNotExists
(
obj
)
{
export
function
isNotExists
(
obj
)
{
return
obj
===
void
0
||
obj
===
null
;
return
obj
===
void
0
||
obj
===
null
;
}
}
/**
* 深度遍历object,改变key为驼峰式命名
* @param {object} obj
*/
export
function
toCamelCaseObjectDeep
(
obj
)
{
for
(
let
_key
in
obj
)
{
if
(
obj
.
hasOwnProperty
(
_key
))
{
let
_val
=
obj
[
_key
];
let
_valType
=
Object
.
prototype
.
toString
.
call
(
_val
);
if
(
_valType
===
'
[object Array]
'
)
{
_val
=
toCamelCaseArrayDeep
(
_val
);
}
else
if
(
_valType
===
'
[object Object]
'
)
{
_val
=
toCamelCaseObjectDeep
(
_val
);
}
delete
obj
[
_key
];
obj
[
lodash
.
camelCase
(
_key
)]
=
_val
;
}
}
return
obj
;
}
/**
* 深度遍历数组,改变其中object元素的key为驼峰式命名
* @param {object} obj
*/
export
function
toCamelCaseArrayDeep
(
list
)
{
for
(
let
i
in
list
)
{
const
_valType
=
Object
.
prototype
.
toString
.
call
(
list
[
i
]);
if
(
_valType
===
'
[object Object]
'
)
{
list
[
i
]
=
toCamelCaseObjectDeep
(
list
[
i
]);
}
else
if
(
_valType
===
'
[object Array]
'
)
{
list
[
i
]
=
toCamelCaseArrayDeep
(
list
[
i
]);
}
}
return
list
;
}
/**
* 深度遍历改变data中object 的key的命名为驼峰式命名
* @param {Object/Array} data
*/
export
function
toCamelCaseDeep
(
data
)
{
const
_dataType
=
Object
.
prototype
.
toString
.
call
(
data
);
let
changedKeyParams
;
if
(
_dataType
===
'
[object Object]
'
)
{
changedKeyParams
=
toCamelCaseObjectDeep
(
data
);
}
else
if
(
_dataType
===
'
[object Array]
'
)
{
changedKeyParams
=
toCamelCaseArrayDeep
(
data
);
}
return
changedKeyParams
;
}
ve-admin/admin-web/src/utils/request.js
View file @
34c9ce81
...
@@ -2,24 +2,35 @@
...
@@ -2,24 +2,35 @@
* @Description: In User Settings Edit
* @Description: In User Settings Edit
* @Author: your name
* @Author: your name
* @Date: 2019-09-09 12:16:28
* @Date: 2019-09-09 12:16:28
* @LastEditTime : 2020-0
1-11 23:24:40
* @LastEditTime : 2020-0
2-04 13:19:39
* @LastEditors : 一日看尽长安花
* @LastEditors : 一日看尽长安花
*/
*/
import
axios
from
'
axios
'
;
import
axios
from
'
axios
'
;
import
{
MessageBox
,
Message
}
from
'
element-ui
'
;
import
{
MessageBox
,
Message
}
from
'
element-ui
'
;
import
store
from
'
@/store
'
;
import
store
from
'
@/store
'
;
import
{
getToken
,
setToken
}
from
'
@/utils/auth
'
;
import
{
getToken
,
setToken
}
from
'
@/utils/auth
'
;
import
{
toCamelCaseDeep
}
from
'
@/utils/object-util
'
;
// create an axios instance
// create an axios instance
const
service
=
axios
.
create
({
const
service
=
axios
.
create
({
baseURL
:
process
.
env
.
VUE_APP_BASE_API
,
// url = base url + request url
baseURL
:
process
.
env
.
VUE_APP_BASE_API
,
// url = base url + request url
// withCredentials: true, // send cookies when cross-domain requests
// withCredentials: true, // send cookies when cross-domain requests
timeout
:
5000
// request timeout
timeout
:
5000
0
// request timeout
});
});
// request interceptor
// request interceptor
service
.
interceptors
.
request
.
use
(
service
.
interceptors
.
request
.
use
(
config
=>
{
config
=>
{
const
method
=
config
.
method
;
const
params
=
config
.
params
||
config
.
data
||
null
;
if
(
params
)
{
const
changedKeyParams
=
toCamelCaseDeep
(
params
);
if
(
method
===
'
get
'
)
{
config
.
params
=
changedKeyParams
;
}
else
{
config
.
data
=
changedKeyParams
;
}
}
// do something before request is sent
// do something before request is sent
if
(
store
.
getters
.
token
)
{
if
(
store
.
getters
.
token
)
{
// let each request carry token
// let each request carry token
...
...
ve-admin/admin-web/src/views/users/index.vue
View file @
34c9ce81
<!--
<!--
* @Author: 一日看尽长安花
* @Author: 一日看尽长安花
* @since: 2019-10-12 15:43:18
* @since: 2019-10-12 15:43:18
* @LastEditTime : 2020-0
1-11 21
:15:
32
* @LastEditTime : 2020-0
2-04 16
:15:
14
* @LastEditors : 一日看尽长安花
* @LastEditors : 一日看尽长安花
* @Description:
* @Description:
-->
-->
<
template
>
<
template
>
<div>
<div>
<
table-views
<
general-page
:metadata=
"metadata"
:metadata=
"metadata"
:tabledata.sync=
"tabledata"
:tabledata.sync=
"tabledata"
:loading=
"loading"
:loading=
"loading"
...
@@ -20,10 +20,29 @@
...
@@ -20,10 +20,29 @@
>
>
<!-- 往搜索栏中添加搜索条件 -->
<!-- 往搜索栏中添加搜索条件 -->
<template
#filter-condition
="
{filterData:filterData}">
<template
#filter-condition
="
{filterData:filterData}">
<div
class=
"filter-item-container"
>
<el-cascader
v-model=
"filterData['orgId']"
:props=
"orgIdCascaderProps"
:show-all-levels=
"false"
clearable
placeholder=
"部门"
></el-cascader>
</div>
<div
class=
"filter-item-container"
>
<div
class=
"filter-item-container"
>
<el-cascader
<el-cascader
v-model=
"filterData['jobType']"
v-model=
"filterData['jobType']"
:props=
"jobTypeCascaderProps"
:props=
"jobTypeCascaderProps"
clearable
placeholder=
"岗位/职务"
></el-cascader>
</div>
<div
class=
"filter-item-container"
>
<el-cascader
v-model=
"filterData['state']"
:props=
"stateCascaderProps"
clearable
placeholder=
"状态"
></el-cascader>
></el-cascader>
</div>
</div>
</
template
>
</
template
>
...
@@ -50,18 +69,19 @@
...
@@ -50,18 +69,19 @@
/>
/>
</el-form-item>
</el-form-item>
</
template
>
</
template
>
</
table-views
>
</
general-page
>
</div>
</div>
</template>
</template>
<
script
>
<
script
>
import
TableViews
from
'
@/components/
TableViews
'
;
import
GeneralPage
from
'
@/components/
GeneralPage
'
;
import
{
users
,
usersMetadata
}
from
'
@/api/user
'
;
import
{
users
,
usersMetadata
}
from
'
@/api/user
'
;
import
{
getDictsByParent
}
from
'
@/api/dict
'
;
import
{
loadDictCascaderData
,
handleDictCascaderValue
}
from
'
@/services/dict
'
;
import
{
loadOrgCascaderData
,
handleOrgCascaderValue
}
from
'
@/services/org
'
;
export
default
{
export
default
{
name
:
'
CoreUsersView
'
,
name
:
'
CoreUsersView
'
,
components
:
{
TableViews
},
components
:
{
GeneralPage
},
props
:
{},
props
:
{},
data
()
{
data
()
{
return
{
return
{
...
@@ -72,26 +92,25 @@ export default {
...
@@ -72,26 +92,25 @@ export default {
total
:
0
total
:
0
},
},
loading
:
true
,
loading
:
true
,
orgIdCascaderProps
:
{
checkStrictly
:
true
,
lazy
:
true
,
lazyLoad
(
node
,
resolve
)
{
loadOrgCascaderData
(
node
,
resolve
);
}
},
jobTypeCascaderProps
:
{
jobTypeCascaderProps
:
{
checkStrictly
:
true
,
checkStrictly
:
true
,
lazy
:
true
,
lazy
:
true
,
lazyLoad
(
node
,
resolve
)
{
lazyLoad
(
node
,
resolve
)
{
const
{
root
,
data
}
=
node
;
loadDictCascaderData
(
node
,
resolve
,
'
job_type
'
);
const
{
id
}
=
data
||
{};
}
let
datas
=
[],
},
type
;
stateCascaderProps
:
{
if
(
root
)
{
checkStrictly
:
true
,
type
=
'
job_type
'
;
lazy
:
true
,
}
lazyLoad
(
node
,
resolve
)
{
let
reqParam
=
{
loadDictCascaderData
(
node
,
resolve
,
'
user_state
'
);
parentId
:
id
,
type
:
type
};
getDictsByParent
(
reqParam
).
then
(
result
=>
{
const
{
code
,
data
}
=
{
...
result
};
// 通过调用resolve将子节点数据返回,通知组件数据加载完成
resolve
(
data
);
});
}
}
}
}
};
};
...
@@ -116,6 +135,12 @@ export default {
...
@@ -116,6 +135,12 @@ export default {
},
},
obtainData
(
queryParams
)
{
obtainData
(
queryParams
)
{
this
.
loading
=
true
;
this
.
loading
=
true
;
queryParams
=
handleOrgCascaderValue
(
queryParams
,
'
orgId
'
,
'
org_id
'
);
queryParams
=
handleDictCascaderValue
(
queryParams
,
'
jobType
'
,
[
'
jobType0
'
,
'
jobType1
'
]);
queryParams
=
handleDictCascaderValue
(
queryParams
,
'
state
'
,
[
'
state
'
]);
users
(
queryParams
)
users
(
queryParams
)
.
then
(
result
=>
{
.
then
(
result
=>
{
const
{
code
,
data
}
=
{
...
result
};
const
{
code
,
data
}
=
{
...
result
};
...
...
Prev
1
2
3
Next
Write
Preview
Supports
Markdown
0%
Try again
or
attach a new file
.
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment