Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Submit feedback
Contribute to GitLab
Sign in
Toggle navigation
V
VueElementTemplate
Project
Project
Details
Activity
Releases
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
JIRA
JIRA
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
黄瑜
VueElementTemplate
Commits
b73b0d5f
Commit
b73b0d5f
authored
Feb 05, 2018
by
胡小根
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
add table demo
parent
2e3f9871
Changes
2
Hide whitespace changes
Inline
Side-by-side
Showing
2 changed files
with
385 additions
and
339 deletions
+385
-339
HmComplexTable.vue
src/views/haomo/components/tables/HmComplexTable.vue
+374
-0
index.vue
src/views/haomo/components/tables/index.vue
+11
-339
No files found.
src/views/haomo/components/tables/HmComplexTable.vue
0 → 100644
View file @
b73b0d5f
<
template
>
<div
class=
"app-container calendar-list-container"
>
<!-- 过滤 -->
<div
class=
"filter-container"
>
<el-input
@
keyup
.
enter
.
native=
"handleFilter"
style=
"width: 200px;"
class=
"filter-item"
:placeholder=
"$t('table.title')"
v-model=
"listQuery.title"
>
</el-input>
<el-select
clearable
style=
"width: 90px"
class=
"filter-item"
v-model=
"listQuery.importance"
:placeholder=
"$t('table.importance')"
>
<el-option
v-for=
"item in importanceOptions"
:key=
"item"
:label=
"item"
:value=
"item"
>
</el-option>
</el-select>
<el-select
clearable
class=
"filter-item"
style=
"width: 130px"
v-model=
"listQuery.type"
:placeholder=
"$t('table.type')"
>
<el-option
v-for=
"item in calendarTypeOptions"
:key=
"item.key"
:label=
"item.display_name+'('+item.key+')'"
:value=
"item.key"
>
</el-option>
</el-select>
<el-select
@
change=
'handleFilter'
style=
"width: 140px"
class=
"filter-item"
v-model=
"listQuery.sort"
>
<el-option
v-for=
"item in sortOptions"
:key=
"item.key"
:label=
"item.label"
:value=
"item.key"
>
</el-option>
</el-select>
<el-button
class=
"filter-item"
type=
"primary"
v-waves
icon=
"el-icon-search"
@
click=
"handleFilter"
>
{{
$t
(
'table.search'
)
}}
</el-button>
<el-button
class=
"filter-item"
style=
"margin-left: 10px;"
@
click=
"handleCreate"
type=
"primary"
icon=
"el-icon-edit"
>
{{
$t
(
'table.add'
)
}}
</el-button>
<el-button
class=
"filter-item"
type=
"primary"
:loading=
"downloadLoading"
v-waves
icon=
"el-icon-download"
@
click=
"handleDownload"
>
{{
$t
(
'table.export'
)
}}
</el-button>
<el-checkbox
class=
"filter-item"
style=
'margin-left:15px;'
@
change=
'tableKey=tableKey+1'
v-model=
"showReviewer"
>
{{
$t
(
'table.reviewer'
)
}}
</el-checkbox>
</div>
<!-- end 过滤 -->
<!-- 表格 -->
<el-table
:key=
'tableKey'
:data=
"list"
v-loading=
"listLoading"
element-loading-text=
"给我一点时间"
border
fit
highlight-current-row
style=
"width: 100%"
>
<el-table-column
align=
"center"
:label=
"$t('table.id')"
width=
"65"
>
<template
slot-scope=
"scope"
>
<span>
{{
scope
.
row
.
id
}}
</span>
</
template
>
</el-table-column>
<el-table-column
width=
"150px"
align=
"center"
:label=
"$t('table.date')"
>
<
template
slot-scope=
"scope"
>
<span>
{{
scope
.
row
.
timestamp
|
parseTime
(
'{y
}
-{m
}
-{d
}
{h
}
:{i
}
'
)
}}
<
/span
>
<
/template
>
<
/el-table-column
>
<
el
-
table
-
column
min
-
width
=
"150px"
:
label
=
"$t('table.title')"
>
<
template
slot
-
scope
=
"scope"
>
<
span
class
=
"link-type"
@
click
=
"handleUpdate(scope.row)"
>
{{
scope
.
row
.
title
}}
<
/span
>
<
el
-
tag
>
{{
scope
.
row
.
type
|
typeFilter
}}
<
/el-tag
>
<
/template
>
<
/el-table-column
>
<
el
-
table
-
column
width
=
"110px"
align
=
"center"
:
label
=
"$t('table.author')"
>
<
template
slot
-
scope
=
"scope"
>
<
span
>
{{
scope
.
row
.
author
}}
<
/span
>
<
/template
>
<
/el-table-column
>
<
el
-
table
-
column
width
=
"110px"
v
-
if
=
'showReviewer'
align
=
"center"
:
label
=
"$t('table.reviewer')"
>
<
template
slot
-
scope
=
"scope"
>
<
span
style
=
'color:red;'
>
{{
scope
.
row
.
reviewer
}}
<
/span
>
<
/template
>
<
/el-table-column
>
<
el
-
table
-
column
width
=
"80px"
:
label
=
"$t('table.importance')"
>
<
template
slot
-
scope
=
"scope"
>
<
svg
-
icon
v
-
for
=
"n in +scope.row.importance"
icon
-
class
=
"star"
class
=
"meta-item__icon"
:
key
=
"n"
><
/svg-icon
>
<
/template
>
<
/el-table-column
>
<
el
-
table
-
column
align
=
"center"
:
label
=
"$t('table.readings')"
width
=
"95"
>
<
template
slot
-
scope
=
"scope"
>
<
span
v
-
if
=
"scope.row.pageviews"
class
=
"link-type"
@
click
=
'handleFetchPv(scope.row.pageviews)'
>
{{
scope
.
row
.
pageviews
}}
<
/span
>
<
span
v
-
else
>
0
<
/span
>
<
/template
>
<
/el-table-column
>
<
el
-
table
-
column
class
-
name
=
"status-col"
:
label
=
"$t('table.status')"
width
=
"100"
>
<
template
slot
-
scope
=
"scope"
>
<
el
-
tag
:
type
=
"scope.row.status | statusFilter"
>
{{
scope
.
row
.
status
}}
<
/el-tag
>
<
/template
>
<
/el-table-column
>
<
el
-
table
-
column
align
=
"center"
:
label
=
"$t('table.actions')"
width
=
"230"
class
-
name
=
"small-padding fixed-width"
>
<
template
slot
-
scope
=
"scope"
>
<
el
-
button
type
=
"primary"
size
=
"mini"
@
click
=
"handleUpdate(scope.row)"
>
{{
$t
(
'table.edit'
)
}}
<
/el-button
>
<
el
-
button
v
-
if
=
"scope.row.status!='published'"
size
=
"mini"
type
=
"success"
@
click
=
"handleModifyStatus(scope.row,'published')"
>
{{
$t
(
'table.publish'
)
}}
<
/el-button
>
<
el
-
button
v
-
if
=
"scope.row.status!='draft'"
size
=
"mini"
@
click
=
"handleModifyStatus(scope.row,'draft')"
>
{{
$t
(
'table.draft'
)
}}
<
/el-button
>
<
el
-
button
v
-
if
=
"scope.row.status!='deleted'"
size
=
"mini"
type
=
"danger"
@
click
=
"handleModifyStatus(scope.row,'deleted')"
>
{{
$t
(
'table.delete'
)
}}
<
/el-button
>
<
/template
>
<
/el-table-column
>
<
/el-table
>
<!--
end
表格
-->
<!--
翻页
-->
<
div
class
=
"pagination-container"
>
<
el
-
pagination
background
@
size
-
change
=
"handleSizeChange"
@
current
-
change
=
"handleCurrentChange"
:
current
-
page
.
sync
=
"listQuery.page"
:
page
-
sizes
=
"[10,20,30, 50]"
:
page
-
size
=
"listQuery.limit"
layout
=
"total, sizes, prev, pager, next, jumper"
:
total
=
"total"
>
<
/el-pagination
>
<
/div
>
<!--
end
翻页
-->
<!--
弹窗
-->
<
el
-
dialog
:
title
=
"textMap[dialogStatus]"
:
visible
.
sync
=
"dialogFormVisible"
>
<
el
-
form
:
rules
=
"rules"
ref
=
"dataForm"
:
model
=
"temp"
label
-
position
=
"left"
label
-
width
=
"70px"
style
=
'width: 400px; margin-left:50px;'
>
<
el
-
form
-
item
:
label
=
"$t('table.type')"
prop
=
"type"
>
<
el
-
select
class
=
"filter-item"
v
-
model
=
"temp.type"
placeholder
=
"Please select"
>
<
el
-
option
v
-
for
=
"item in calendarTypeOptions"
:
key
=
"item.key"
:
label
=
"item.display_name"
:
value
=
"item.key"
>
<
/el-option
>
<
/el-select
>
<
/el-form-item
>
<
el
-
form
-
item
:
label
=
"$t('table.date')"
prop
=
"timestamp"
>
<
el
-
date
-
picker
v
-
model
=
"temp.timestamp"
type
=
"datetime"
placeholder
=
"Please pick a date"
>
<
/el-date-picker
>
<
/el-form-item
>
<
el
-
form
-
item
:
label
=
"$t('table.title')"
prop
=
"title"
>
<
el
-
input
v
-
model
=
"temp.title"
><
/el-input
>
<
/el-form-item
>
<
el
-
form
-
item
:
label
=
"$t('table.status')"
>
<
el
-
select
class
=
"filter-item"
v
-
model
=
"temp.status"
placeholder
=
"Please select"
>
<
el
-
option
v
-
for
=
"item in statusOptions"
:
key
=
"item"
:
label
=
"item"
:
value
=
"item"
>
<
/el-option
>
<
/el-select
>
<
/el-form-item
>
<
el
-
form
-
item
:
label
=
"$t('table.importance')"
>
<
el
-
rate
style
=
"margin-top:8px;"
v
-
model
=
"temp.importance"
:
colors
=
"['#99A9BF', '#F7BA2A', '#FF9900']"
:
max
=
'3'
><
/el-rate
>
<
/el-form-item
>
<
el
-
form
-
item
:
label
=
"$t('table.remark')"
>
<
el
-
input
type
=
"textarea"
:
autosize
=
"{ minRows: 2, maxRows: 4
}
"
placeholder
=
"Please input"
v
-
model
=
"temp.remark"
>
<
/el-input
>
<
/el-form-item
>
<
/el-form
>
<
div
slot
=
"footer"
class
=
"dialog-footer"
>
<
el
-
button
@
click
=
"dialogFormVisible = false"
>
{{
$t
(
'table.cancel'
)
}}
<
/el-button
>
<
el
-
button
v
-
if
=
"dialogStatus=='create'"
type
=
"primary"
@
click
=
"createData"
>
{{
$t
(
'table.confirm'
)
}}
<
/el-button
>
<
el
-
button
v
-
else
type
=
"primary"
@
click
=
"updateData"
>
{{
$t
(
'table.confirm'
)
}}
<
/el-button
>
<
/div
>
<
/el-dialog
>
<!--
end
弹窗
-->
<
el
-
dialog
title
=
"Reading statistics"
:
visible
.
sync
=
"dialogPvVisible"
>
<
el
-
table
:
data
=
"pvData"
border
fit
highlight
-
current
-
row
style
=
"width: 100%"
>
<
el
-
table
-
column
prop
=
"key"
label
=
"Channel"
>
<
/el-table-column
>
<
el
-
table
-
column
prop
=
"pv"
label
=
"Pv"
>
<
/el-table-column
>
<
/el-table
>
<
span
slot
=
"footer"
class
=
"dialog-footer"
>
<
el
-
button
type
=
"primary"
@
click
=
"dialogPvVisible = false"
>
{{
$t
(
'table.confirm'
)
}}
<
/el-button
>
<
/span
>
<
/el-dialog
>
<
/div
>
<
/template
>
<
script
>
import
{
fetchList
,
fetchPv
,
createArticle
,
updateArticle
}
from
'@/api/article'
import
waves
from
'@/directive/waves'
// 水波纹指令
import
{
parseTime
}
from
'@/utils'
const
calendarTypeOptions
=
[
{
key
:
'CN'
,
display_name
:
'China'
}
,
{
key
:
'US'
,
display_name
:
'USA'
}
,
{
key
:
'JP'
,
display_name
:
'Japan'
}
,
{
key
:
'EU'
,
display_name
:
'Eurozone'
}
]
// arr to obj ,such as
{
CN
:
"China"
,
US
:
"USA"
}
const
calendarTypeKeyValue
=
calendarTypeOptions
.
reduce
((
acc
,
cur
)
=>
{
acc
[
cur
.
key
]
=
cur
.
display_name
return
acc
}
,
{
}
)
export
default
{
name
:
'HmComplexTable'
,
// 集成其他组件
extends
:
{
}
,
// 使用其它组件
components
:
{
}
,
// 混入公共对象
mixins
:
[],
props
:
{
schema
:
{
type
:
Object
,
required
:
false
}
}
,
directives
:
{
waves
}
,
data
()
{
return
{
tableKey
:
0
,
list
:
null
,
total
:
null
,
listLoading
:
true
,
listQuery
:
{
page
:
1
,
limit
:
20
,
importance
:
undefined
,
title
:
undefined
,
type
:
undefined
,
sort
:
'+id'
}
,
importanceOptions
:
[
1
,
2
,
3
],
calendarTypeOptions
,
sortOptions
:
[{
label
:
'ID Ascending'
,
key
:
'+id'
}
,
{
label
:
'ID Descending'
,
key
:
'-id'
}
],
statusOptions
:
[
'published'
,
'draft'
,
'deleted'
],
showReviewer
:
false
,
temp
:
{
id
:
undefined
,
importance
:
1
,
remark
:
''
,
timestamp
:
new
Date
(),
title
:
''
,
type
:
''
,
status
:
'published'
}
,
dialogFormVisible
:
false
,
dialogStatus
:
''
,
textMap
:
{
update
:
'Edit'
,
create
:
'Create'
}
,
dialogPvVisible
:
false
,
pvData
:
[],
rules
:
{
type
:
[{
required
:
true
,
message
:
'type is required'
,
trigger
:
'change'
}
],
timestamp
:
[{
type
:
'date'
,
required
:
true
,
message
:
'timestamp is required'
,
trigger
:
'change'
}
],
title
:
[{
required
:
true
,
message
:
'title is required'
,
trigger
:
'blur'
}
]
}
,
downloadLoading
:
false
}
}
,
filters
:
{
statusFilter
(
status
)
{
const
statusMap
=
{
published
:
'success'
,
draft
:
'info'
,
deleted
:
'danger'
}
return
statusMap
[
status
]
}
,
typeFilter
(
type
)
{
return
calendarTypeKeyValue
[
type
]
}
}
,
created
()
{
this
.
getList
()
}
,
methods
:
{
getList
()
{
this
.
listLoading
=
true
fetchList
(
this
.
listQuery
).
then
(
response
=>
{
this
.
list
=
response
.
data
.
items
this
.
total
=
response
.
data
.
total
this
.
listLoading
=
false
}
)
}
,
handleFilter
()
{
this
.
listQuery
.
page
=
1
this
.
getList
()
}
,
handleSizeChange
(
val
)
{
this
.
listQuery
.
limit
=
val
this
.
getList
()
}
,
handleCurrentChange
(
val
)
{
this
.
listQuery
.
page
=
val
this
.
getList
()
}
,
handleModifyStatus
(
row
,
status
)
{
this
.
$message
({
message
:
'操作成功'
,
type
:
'success'
}
)
row
.
status
=
status
}
,
resetTemp
()
{
this
.
temp
=
{
id
:
undefined
,
importance
:
1
,
remark
:
''
,
timestamp
:
new
Date
(),
title
:
''
,
status
:
'published'
,
type
:
''
}
}
,
handleCreate
()
{
this
.
resetTemp
()
this
.
dialogStatus
=
'create'
this
.
dialogFormVisible
=
true
this
.
$nextTick
(()
=>
{
this
.
$refs
[
'dataForm'
].
clearValidate
()
}
)
}
,
createData
()
{
this
.
$refs
[
'dataForm'
].
validate
((
valid
)
=>
{
if
(
valid
)
{
this
.
temp
.
id
=
parseInt
(
Math
.
random
()
*
100
)
+
1024
// mock a id
this
.
temp
.
author
=
'vue-element-admin'
createArticle
(
this
.
temp
).
then
(()
=>
{
this
.
list
.
unshift
(
this
.
temp
)
this
.
dialogFormVisible
=
false
this
.
$notify
({
title
:
'成功'
,
message
:
'创建成功'
,
type
:
'success'
,
duration
:
2000
}
)
}
)
}
}
)
}
,
handleUpdate
(
row
)
{
this
.
temp
=
Object
.
assign
({
}
,
row
)
// copy obj
this
.
temp
.
timestamp
=
new
Date
(
this
.
temp
.
timestamp
)
this
.
dialogStatus
=
'update'
this
.
dialogFormVisible
=
true
this
.
$nextTick
(()
=>
{
this
.
$refs
[
'dataForm'
].
clearValidate
()
}
)
}
,
updateData
()
{
this
.
$refs
[
'dataForm'
].
validate
((
valid
)
=>
{
if
(
valid
)
{
const
tempData
=
Object
.
assign
({
}
,
this
.
temp
)
tempData
.
timestamp
=
+
new
Date
(
tempData
.
timestamp
)
// change Thu Nov 30 2017 16:41:05 GMT+0800 (CST) to 1512031311464
updateArticle
(
tempData
).
then
(()
=>
{
for
(
const
v
of
this
.
list
)
{
if
(
v
.
id
===
this
.
temp
.
id
)
{
const
index
=
this
.
list
.
indexOf
(
v
)
this
.
list
.
splice
(
index
,
1
,
this
.
temp
)
break
}
}
this
.
dialogFormVisible
=
false
this
.
$notify
({
title
:
'成功'
,
message
:
'更新成功'
,
type
:
'success'
,
duration
:
2000
}
)
}
)
}
}
)
}
,
handleDelete
(
row
)
{
this
.
$notify
({
title
:
'成功'
,
message
:
'删除成功'
,
type
:
'success'
,
duration
:
2000
}
)
const
index
=
this
.
list
.
indexOf
(
row
)
this
.
list
.
splice
(
index
,
1
)
}
,
handleFetchPv
(
pv
)
{
fetchPv
(
pv
).
then
(
response
=>
{
this
.
pvData
=
response
.
data
.
pvData
this
.
dialogPvVisible
=
true
}
)
}
,
handleDownload
()
{
this
.
downloadLoading
=
true
import
(
'@/vendor/Export2Excel'
).
then
(
excel
=>
{
const
tHeader
=
[
'timestamp'
,
'title'
,
'type'
,
'importance'
,
'status'
]
const
filterVal
=
[
'timestamp'
,
'title'
,
'type'
,
'importance'
,
'status'
]
const
data
=
this
.
formatJson
(
filterVal
,
this
.
list
)
excel
.
export_json_to_excel
(
tHeader
,
data
,
'table-list'
)
this
.
downloadLoading
=
false
}
)
}
,
formatJson
(
filterVal
,
jsonData
)
{
return
jsonData
.
map
(
v
=>
filterVal
.
map
(
j
=>
{
if
(
j
===
'timestamp'
)
{
return
parseTime
(
v
[
j
])
}
else
{
return
v
[
j
]
}
}
))
}
}
}
<
/script
>
src/views/haomo/components/tables/index.vue
View file @
b73b0d5f
<
template
>
<div
class=
"app-container calendar-list-container"
>
<div
class=
"filter-container"
>
<el-input
@
keyup
.
enter
.
native=
"handleFilter"
style=
"width: 200px;"
class=
"filter-item"
:placeholder=
"$t('table.title')"
v-model=
"listQuery.title"
>
</el-input>
<el-select
clearable
style=
"width: 90px"
class=
"filter-item"
v-model=
"listQuery.importance"
:placeholder=
"$t('table.importance')"
>
<el-option
v-for=
"item in importanceOptions"
:key=
"item"
:label=
"item"
:value=
"item"
>
</el-option>
</el-select>
<el-select
clearable
class=
"filter-item"
style=
"width: 130px"
v-model=
"listQuery.type"
:placeholder=
"$t('table.type')"
>
<el-option
v-for=
"item in calendarTypeOptions"
:key=
"item.key"
:label=
"item.display_name+'('+item.key+')'"
:value=
"item.key"
>
</el-option>
</el-select>
<el-select
@
change=
'handleFilter'
style=
"width: 140px"
class=
"filter-item"
v-model=
"listQuery.sort"
>
<el-option
v-for=
"item in sortOptions"
:key=
"item.key"
:label=
"item.label"
:value=
"item.key"
>
</el-option>
</el-select>
<el-button
class=
"filter-item"
type=
"primary"
v-waves
icon=
"el-icon-search"
@
click=
"handleFilter"
>
{{
$t
(
'table.search'
)
}}
</el-button>
<el-button
class=
"filter-item"
style=
"margin-left: 10px;"
@
click=
"handleCreate"
type=
"primary"
icon=
"el-icon-edit"
>
{{
$t
(
'table.add'
)
}}
</el-button>
<el-button
class=
"filter-item"
type=
"primary"
:loading=
"downloadLoading"
v-waves
icon=
"el-icon-download"
@
click=
"handleDownload"
>
{{
$t
(
'table.export'
)
}}
</el-button>
<el-checkbox
class=
"filter-item"
style=
'margin-left:15px;'
@
change=
'tableKey=tableKey+1'
v-model=
"showReviewer"
>
{{
$t
(
'table.reviewer'
)
}}
</el-checkbox>
</div>
<el-table
:key=
'tableKey'
:data=
"list"
v-loading=
"listLoading"
element-loading-text=
"给我一点时间"
border
fit
highlight-current-row
style=
"width: 100%"
>
<el-table-column
align=
"center"
:label=
"$t('table.id')"
width=
"65"
>
<template
slot-scope=
"scope"
>
<span>
{{
scope
.
row
.
id
}}
</span>
</
template
>
</el-table-column>
<el-table-column
width=
"150px"
align=
"center"
:label=
"$t('table.date')"
>
<
template
slot-scope=
"scope"
>
<span>
{{
scope
.
row
.
timestamp
|
parseTime
(
'{y
}
-{m
}
-{d
}
{h
}
:{i
}
'
)
}}
<
/span
>
<
/template
>
<
/el-table-column
>
<
el
-
table
-
column
min
-
width
=
"150px"
:
label
=
"$t('table.title')"
>
<
template
slot
-
scope
=
"scope"
>
<
span
class
=
"link-type"
@
click
=
"handleUpdate(scope.row)"
>
{{
scope
.
row
.
title
}}
<
/span
>
<
el
-
tag
>
{{
scope
.
row
.
type
|
typeFilter
}}
<
/el-tag
>
<
/template
>
<
/el-table-column
>
<
el
-
table
-
column
width
=
"110px"
align
=
"center"
:
label
=
"$t('table.author')"
>
<
template
slot
-
scope
=
"scope"
>
<
span
>
{{
scope
.
row
.
author
}}
<
/span
>
<
/template
>
<
/el-table-column
>
<
el
-
table
-
column
width
=
"110px"
v
-
if
=
'showReviewer'
align
=
"center"
:
label
=
"$t('table.reviewer')"
>
<
template
slot
-
scope
=
"scope"
>
<
span
style
=
'color:red;'
>
{{
scope
.
row
.
reviewer
}}
<
/span
>
<
/template
>
<
/el-table-column
>
<
el
-
table
-
column
width
=
"80px"
:
label
=
"$t('table.importance')"
>
<
template
slot
-
scope
=
"scope"
>
<
svg
-
icon
v
-
for
=
"n in +scope.row.importance"
icon
-
class
=
"star"
class
=
"meta-item__icon"
:
key
=
"n"
><
/svg-icon
>
<
/template
>
<
/el-table-column
>
<
el
-
table
-
column
align
=
"center"
:
label
=
"$t('table.readings')"
width
=
"95"
>
<
template
slot
-
scope
=
"scope"
>
<
span
v
-
if
=
"scope.row.pageviews"
class
=
"link-type"
@
click
=
'handleFetchPv(scope.row.pageviews)'
>
{{
scope
.
row
.
pageviews
}}
<
/span
>
<
span
v
-
else
>
0
<
/span
>
<
/template
>
<
/el-table-column
>
<
el
-
table
-
column
class
-
name
=
"status-col"
:
label
=
"$t('table.status')"
width
=
"100"
>
<
template
slot
-
scope
=
"scope"
>
<
el
-
tag
:
type
=
"scope.row.status | statusFilter"
>
{{
scope
.
row
.
status
}}
<
/el-tag
>
<
/template
>
<
/el-table-column
>
<
el
-
table
-
column
align
=
"center"
:
label
=
"$t('table.actions')"
width
=
"230"
class
-
name
=
"small-padding fixed-width"
>
<
template
slot
-
scope
=
"scope"
>
<
el
-
button
type
=
"primary"
size
=
"mini"
@
click
=
"handleUpdate(scope.row)"
>
{{
$t
(
'table.edit'
)
}}
<
/el-button
>
<
el
-
button
v
-
if
=
"scope.row.status!='published'"
size
=
"mini"
type
=
"success"
@
click
=
"handleModifyStatus(scope.row,'published')"
>
{{
$t
(
'table.publish'
)
}}
<
/el-button
>
<
el
-
button
v
-
if
=
"scope.row.status!='draft'"
size
=
"mini"
@
click
=
"handleModifyStatus(scope.row,'draft')"
>
{{
$t
(
'table.draft'
)
}}
<
/el-button
>
<
el
-
button
v
-
if
=
"scope.row.status!='deleted'"
size
=
"mini"
type
=
"danger"
@
click
=
"handleModifyStatus(scope.row,'deleted')"
>
{{
$t
(
'table.delete'
)
}}
<
/el-button
>
<
/template
>
<
/el-table-column
>
<
/el-table
>
<
div
class
=
"pagination-container"
>
<
el
-
pagination
background
@
size
-
change
=
"handleSizeChange"
@
current
-
change
=
"handleCurrentChange"
:
current
-
page
.
sync
=
"listQuery.page"
:
page
-
sizes
=
"[10,20,30, 50]"
:
page
-
size
=
"listQuery.limit"
layout
=
"total, sizes, prev, pager, next, jumper"
:
total
=
"total"
>
<
/el-pagination
>
<
/div
>
<
el
-
dialog
:
title
=
"textMap[dialogStatus]"
:
visible
.
sync
=
"dialogFormVisible"
>
<
el
-
form
:
rules
=
"rules"
ref
=
"dataForm"
:
model
=
"temp"
label
-
position
=
"left"
label
-
width
=
"70px"
style
=
'width: 400px; margin-left:50px;'
>
<
el
-
form
-
item
:
label
=
"$t('table.type')"
prop
=
"type"
>
<
el
-
select
class
=
"filter-item"
v
-
model
=
"temp.type"
placeholder
=
"Please select"
>
<
el
-
option
v
-
for
=
"item in calendarTypeOptions"
:
key
=
"item.key"
:
label
=
"item.display_name"
:
value
=
"item.key"
>
<
/el-option
>
<
/el-select
>
<
/el-form-item
>
<
el
-
form
-
item
:
label
=
"$t('table.date')"
prop
=
"timestamp"
>
<
el
-
date
-
picker
v
-
model
=
"temp.timestamp"
type
=
"datetime"
placeholder
=
"Please pick a date"
>
<
/el-date-picker
>
<
/el-form-item
>
<
el
-
form
-
item
:
label
=
"$t('table.title')"
prop
=
"title"
>
<
el
-
input
v
-
model
=
"temp.title"
><
/el-input
>
<
/el-form-item
>
<
el
-
form
-
item
:
label
=
"$t('table.status')"
>
<
el
-
select
class
=
"filter-item"
v
-
model
=
"temp.status"
placeholder
=
"Please select"
>
<
el
-
option
v
-
for
=
"item in statusOptions"
:
key
=
"item"
:
label
=
"item"
:
value
=
"item"
>
<
/el-option
>
<
/el-select
>
<
/el-form-item
>
<
el
-
form
-
item
:
label
=
"$t('table.importance')"
>
<
el
-
rate
style
=
"margin-top:8px;"
v
-
model
=
"temp.importance"
:
colors
=
"['#99A9BF', '#F7BA2A', '#FF9900']"
:
max
=
'3'
><
/el-rate
>
<
/el-form-item
>
<
el
-
form
-
item
:
label
=
"$t('table.remark')"
>
<
el
-
input
type
=
"textarea"
:
autosize
=
"{ minRows: 2, maxRows: 4
}
"
placeholder
=
"Please input"
v
-
model
=
"temp.remark"
>
<
/el-input
>
<
/el-form-item
>
<
/el-form
>
<
div
slot
=
"footer"
class
=
"dialog-footer"
>
<
el
-
button
@
click
=
"dialogFormVisible = false"
>
{{
$t
(
'table.cancel'
)
}}
<
/el-button
>
<
el
-
button
v
-
if
=
"dialogStatus=='create'"
type
=
"primary"
@
click
=
"createData"
>
{{
$t
(
'table.confirm'
)
}}
<
/el-button
>
<
el
-
button
v
-
else
type
=
"primary"
@
click
=
"updateData"
>
{{
$t
(
'table.confirm'
)
}}
<
/el-button
>
<
/div
>
<
/el-dialog
>
<
el
-
dialog
title
=
"Reading statistics"
:
visible
.
sync
=
"dialogPvVisible"
>
<
el
-
table
:
data
=
"pvData"
border
fit
highlight
-
current
-
row
style
=
"width: 100%"
>
<
el
-
table
-
column
prop
=
"key"
label
=
"Channel"
>
<
/el-table-column
>
<
el
-
table
-
column
prop
=
"pv"
label
=
"Pv"
>
<
/el-table-column
>
<
/el-table
>
<
span
slot
=
"footer"
class
=
"dialog-footer"
>
<
el
-
button
type
=
"primary"
@
click
=
"dialogPvVisible = false"
>
{{
$t
(
'table.confirm'
)
}}
<
/el-button
>
<
/span
>
<
/el-dialog
>
<hm-complex-table></hm-complex-table>
</div>
</
template
>
<
script
>
import
{
fetchList
,
fetchPv
,
createArticle
,
updateArticle
}
from
'@/api/article'
import
waves
from
'@/directive/waves'
// 水波纹指令
import
{
parseTime
}
from
'@/utils'
const
calendarTypeOptions
=
[
{
key
:
'CN'
,
display_name
:
'China'
}
,
{
key
:
'US'
,
display_name
:
'USA'
}
,
{
key
:
'JP'
,
display_name
:
'Japan'
}
,
{
key
:
'EU'
,
display_name
:
'Eurozone'
}
]
// arr to obj ,such as
{
CN
:
"China"
,
US
:
"USA"
}
const
calendarTypeKeyValue
=
calendarTypeOptions
.
reduce
((
acc
,
cur
)
=>
{
acc
[
cur
.
key
]
=
cur
.
display_name
return
acc
}
,
{
}
)
import
HmComplexTable
from
'./HmComplexTable.vue'
export
default
{
name
:
'complexTable'
,
directives
:
{
waves
name
:
'HmComplexTable'
,
// 继承其他组件
extends
:
{},
// 使用其它组件
components
:
{
'hm-complex-table'
:
HmComplexTable
},
data
()
{
return
{
tableKey
:
0
,
list
:
null
,
total
:
null
,
listLoading
:
true
,
listQuery
:
{
page
:
1
,
limit
:
20
,
importance
:
undefined
,
title
:
undefined
,
type
:
undefined
,
sort
:
'+id'
}
,
importanceOptions
:
[
1
,
2
,
3
],
calendarTypeOptions
,
sortOptions
:
[{
label
:
'ID Ascending'
,
key
:
'+id'
}
,
{
label
:
'ID Descending'
,
key
:
'-id'
}
],
statusOptions
:
[
'published'
,
'draft'
,
'deleted'
],
showReviewer
:
false
,
temp
:
{
id
:
undefined
,
importance
:
1
,
remark
:
''
,
timestamp
:
new
Date
(),
title
:
''
,
type
:
''
,
status
:
'published'
}
,
dialogFormVisible
:
false
,
dialogStatus
:
''
,
textMap
:
{
update
:
'Edit'
,
create
:
'Create'
}
,
dialogPvVisible
:
false
,
pvData
:
[],
rules
:
{
type
:
[{
required
:
true
,
message
:
'type is required'
,
trigger
:
'change'
}
],
timestamp
:
[{
type
:
'date'
,
required
:
true
,
message
:
'timestamp is required'
,
trigger
:
'change'
}
],
title
:
[{
required
:
true
,
message
:
'title is required'
,
trigger
:
'blur'
}
]
}
,
downloadLoading
:
false
}
return
{}
},
filters
:
{
statusFilter
(
status
)
{
const
statusMap
=
{
published
:
'success'
,
draft
:
'info'
,
deleted
:
'danger'
}
return
statusMap
[
status
]
}
,
typeFilter
(
type
)
{
return
calendarTypeKeyValue
[
type
]
}
}
,
created
()
{
this
.
getList
()
},
methods
:
{
getList
()
{
this
.
listLoading
=
true
fetchList
(
this
.
listQuery
).
then
(
response
=>
{
this
.
list
=
response
.
data
.
items
this
.
total
=
response
.
data
.
total
this
.
listLoading
=
false
}
)
}
,
handleFilter
()
{
this
.
listQuery
.
page
=
1
this
.
getList
()
}
,
handleSizeChange
(
val
)
{
this
.
listQuery
.
limit
=
val
this
.
getList
()
}
,
handleCurrentChange
(
val
)
{
this
.
listQuery
.
page
=
val
this
.
getList
()
}
,
handleModifyStatus
(
row
,
status
)
{
this
.
$message
({
message
:
'操作成功'
,
type
:
'success'
}
)
row
.
status
=
status
}
,
resetTemp
()
{
this
.
temp
=
{
id
:
undefined
,
importance
:
1
,
remark
:
''
,
timestamp
:
new
Date
(),
title
:
''
,
status
:
'published'
,
type
:
''
}
}
,
handleCreate
()
{
this
.
resetTemp
()
this
.
dialogStatus
=
'create'
this
.
dialogFormVisible
=
true
this
.
$nextTick
(()
=>
{
this
.
$refs
[
'dataForm'
].
clearValidate
()
}
)
}
,
createData
()
{
this
.
$refs
[
'dataForm'
].
validate
((
valid
)
=>
{
if
(
valid
)
{
this
.
temp
.
id
=
parseInt
(
Math
.
random
()
*
100
)
+
1024
// mock a id
this
.
temp
.
author
=
'vue-element-admin'
createArticle
(
this
.
temp
).
then
(()
=>
{
this
.
list
.
unshift
(
this
.
temp
)
this
.
dialogFormVisible
=
false
this
.
$notify
({
title
:
'成功'
,
message
:
'创建成功'
,
type
:
'success'
,
duration
:
2000
}
)
}
)
}
}
)
}
,
handleUpdate
(
row
)
{
this
.
temp
=
Object
.
assign
({
}
,
row
)
// copy obj
this
.
temp
.
timestamp
=
new
Date
(
this
.
temp
.
timestamp
)
this
.
dialogStatus
=
'update'
this
.
dialogFormVisible
=
true
this
.
$nextTick
(()
=>
{
this
.
$refs
[
'dataForm'
].
clearValidate
()
}
)
}
,
updateData
()
{
this
.
$refs
[
'dataForm'
].
validate
((
valid
)
=>
{
if
(
valid
)
{
const
tempData
=
Object
.
assign
({
}
,
this
.
temp
)
tempData
.
timestamp
=
+
new
Date
(
tempData
.
timestamp
)
// change Thu Nov 30 2017 16:41:05 GMT+0800 (CST) to 1512031311464
updateArticle
(
tempData
).
then
(()
=>
{
for
(
const
v
of
this
.
list
)
{
if
(
v
.
id
===
this
.
temp
.
id
)
{
const
index
=
this
.
list
.
indexOf
(
v
)
this
.
list
.
splice
(
index
,
1
,
this
.
temp
)
break
}
}
this
.
dialogFormVisible
=
false
this
.
$notify
({
title
:
'成功'
,
message
:
'更新成功'
,
type
:
'success'
,
duration
:
2000
}
)
}
)
}
}
)
}
,
handleDelete
(
row
)
{
this
.
$notify
({
title
:
'成功'
,
message
:
'删除成功'
,
type
:
'success'
,
duration
:
2000
}
)
const
index
=
this
.
list
.
indexOf
(
row
)
this
.
list
.
splice
(
index
,
1
)
}
,
handleFetchPv
(
pv
)
{
fetchPv
(
pv
).
then
(
response
=>
{
this
.
pvData
=
response
.
data
.
pvData
this
.
dialogPvVisible
=
true
}
)
}
,
handleDownload
()
{
this
.
downloadLoading
=
true
import
(
'@/vendor/Export2Excel'
).
then
(
excel
=>
{
const
tHeader
=
[
'timestamp'
,
'title'
,
'type'
,
'importance'
,
'status'
]
const
filterVal
=
[
'timestamp'
,
'title'
,
'type'
,
'importance'
,
'status'
]
const
data
=
this
.
formatJson
(
filterVal
,
this
.
list
)
excel
.
export_json_to_excel
(
tHeader
,
data
,
'table-list'
)
this
.
downloadLoading
=
false
}
)
}
,
formatJson
(
filterVal
,
jsonData
)
{
return
jsonData
.
map
(
v
=>
filterVal
.
map
(
j
=>
{
if
(
j
===
'timestamp'
)
{
return
parseTime
(
v
[
j
])
}
else
{
return
v
[
j
]
}
}
))
}
}
created
()
{},
methods
:
{}
}
</
script
>
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