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
Litemall
Commits
6f0ebe3e
Commit
6f0ebe3e
authored
Nov 17, 2018
by
Junling Bu
Browse files
chore[litemall-admin]: 管理后台基于的vue-element-admin框架更新至3.9.3
parent
cffdc561
Changes
156
Hide whitespace changes
Inline
Side-by-side
litemall-admin/src/components/Charts/keyboard.vue
deleted
100644 → 0
View file @
cffdc561
<
template
>
<div
:class=
"className"
:id=
"id"
:style=
"
{height:height,width:width}">
</div>
</
template
>
<
script
>
import
echarts
from
'
echarts
'
export
default
{
props
:
{
className
:
{
type
:
String
,
default
:
'
chart
'
},
id
:
{
type
:
String
,
default
:
'
chart
'
},
width
:
{
type
:
String
,
default
:
'
200px
'
},
height
:
{
type
:
String
,
default
:
'
200px
'
}
},
data
()
{
return
{
chart
:
null
}
},
mounted
()
{
this
.
initChart
()
},
beforeDestroy
()
{
if
(
!
this
.
chart
)
{
return
}
this
.
chart
.
dispose
()
this
.
chart
=
null
},
methods
:
{
initChart
()
{
this
.
chart
=
echarts
.
init
(
document
.
getElementById
(
this
.
id
))
const
xAxisData
=
[]
const
data
=
[]
const
data2
=
[]
for
(
let
i
=
0
;
i
<
50
;
i
++
)
{
xAxisData
.
push
(
i
)
data
.
push
((
Math
.
sin
(
i
/
5
)
*
(
i
/
5
-
10
)
+
i
/
6
)
*
5
)
data2
.
push
((
Math
.
sin
(
i
/
5
)
*
(
i
/
5
+
10
)
+
i
/
6
)
*
3
)
}
this
.
chart
.
setOption
(
{
backgroundColor
:
'
#08263a
'
,
xAxis
:
[{
show
:
false
,
data
:
xAxisData
},
{
show
:
false
,
data
:
xAxisData
}],
visualMap
:
{
show
:
false
,
min
:
0
,
max
:
50
,
dimension
:
0
,
inRange
:
{
color
:
[
'
#4a657a
'
,
'
#308e92
'
,
'
#b1cfa5
'
,
'
#f5d69f
'
,
'
#f5898b
'
,
'
#ef5055
'
]
}
},
yAxis
:
{
axisLine
:
{
show
:
false
},
axisLabel
:
{
textStyle
:
{
color
:
'
#4a657a
'
}
},
splitLine
:
{
show
:
true
,
lineStyle
:
{
color
:
'
#08263f
'
}
},
axisTick
:
{
show
:
false
}
},
series
:
[{
name
:
'
back
'
,
type
:
'
bar
'
,
data
:
data2
,
z
:
1
,
itemStyle
:
{
normal
:
{
opacity
:
0.4
,
barBorderRadius
:
5
,
shadowBlur
:
3
,
shadowColor
:
'
#111
'
}
}
},
{
name
:
'
Simulate Shadow
'
,
type
:
'
line
'
,
data
,
z
:
2
,
showSymbol
:
false
,
animationDelay
:
0
,
animationEasing
:
'
linear
'
,
animationDuration
:
1200
,
lineStyle
:
{
normal
:
{
color
:
'
transparent
'
}
},
areaStyle
:
{
normal
:
{
color
:
'
#08263a
'
,
shadowBlur
:
50
,
shadowColor
:
'
#000
'
}
}
},
{
name
:
'
front
'
,
type
:
'
bar
'
,
data
,
xAxisIndex
:
1
,
z
:
3
,
itemStyle
:
{
normal
:
{
barBorderRadius
:
5
}
}
}],
animationEasing
:
'
elasticOut
'
,
animationEasingUpdate
:
'
elasticOut
'
,
animationDelay
(
idx
)
{
return
idx
*
20
},
animationDelayUpdate
(
idx
)
{
return
idx
*
20
}
})
}
}
}
</
script
>
litemall-admin/src/components/Charts/lineMarker.vue
deleted
100644 → 0
View file @
cffdc561
<
template
>
<div
:class=
"className"
:id=
"id"
:style=
"
{height:height,width:width}">
</div>
</
template
>
<
script
>
import
echarts
from
'
echarts
'
export
default
{
props
:
{
className
:
{
type
:
String
,
default
:
'
chart
'
},
id
:
{
type
:
String
,
default
:
'
chart
'
},
width
:
{
type
:
String
,
default
:
'
200px
'
},
height
:
{
type
:
String
,
default
:
'
200px
'
}
},
data
()
{
return
{
chart
:
null
}
},
mounted
()
{
this
.
initChart
()
},
beforeDestroy
()
{
if
(
!
this
.
chart
)
{
return
}
this
.
chart
.
dispose
()
this
.
chart
=
null
},
methods
:
{
initChart
()
{
this
.
chart
=
echarts
.
init
(
document
.
getElementById
(
this
.
id
))
this
.
chart
.
setOption
({
backgroundColor
:
'
#394056
'
,
title
:
{
top
:
20
,
text
:
'
Requests
'
,
textStyle
:
{
fontWeight
:
'
normal
'
,
fontSize
:
16
,
color
:
'
#F1F1F3
'
},
left
:
'
1%
'
},
tooltip
:
{
trigger
:
'
axis
'
,
axisPointer
:
{
lineStyle
:
{
color
:
'
#57617B
'
}
}
},
legend
:
{
top
:
20
,
icon
:
'
rect
'
,
itemWidth
:
14
,
itemHeight
:
5
,
itemGap
:
13
,
data
:
[
'
CMCC
'
,
'
CTCC
'
,
'
CUCC
'
],
right
:
'
4%
'
,
textStyle
:
{
fontSize
:
12
,
color
:
'
#F1F1F3
'
}
},
grid
:
{
top
:
100
,
left
:
'
3%
'
,
right
:
'
4%
'
,
bottom
:
'
2%
'
,
containLabel
:
true
},
xAxis
:
[{
type
:
'
category
'
,
boundaryGap
:
false
,
axisLine
:
{
lineStyle
:
{
color
:
'
#57617B
'
}
},
data
:
[
'
13:00
'
,
'
13:05
'
,
'
13:10
'
,
'
13:15
'
,
'
13:20
'
,
'
13:25
'
,
'
13:30
'
,
'
13:35
'
,
'
13:40
'
,
'
13:45
'
,
'
13:50
'
,
'
13:55
'
]
}],
yAxis
:
[{
type
:
'
value
'
,
name
:
'
(%)
'
,
axisTick
:
{
show
:
false
},
axisLine
:
{
lineStyle
:
{
color
:
'
#57617B
'
}
},
axisLabel
:
{
margin
:
10
,
textStyle
:
{
fontSize
:
14
}
},
splitLine
:
{
lineStyle
:
{
color
:
'
#57617B
'
}
}
}],
series
:
[{
name
:
'
CMCC
'
,
type
:
'
line
'
,
smooth
:
true
,
symbol
:
'
circle
'
,
symbolSize
:
5
,
showSymbol
:
false
,
lineStyle
:
{
normal
:
{
width
:
1
}
},
areaStyle
:
{
normal
:
{
color
:
new
echarts
.
graphic
.
LinearGradient
(
0
,
0
,
0
,
1
,
[{
offset
:
0
,
color
:
'
rgba(137, 189, 27, 0.3)
'
},
{
offset
:
0.8
,
color
:
'
rgba(137, 189, 27, 0)
'
}],
false
),
shadowColor
:
'
rgba(0, 0, 0, 0.1)
'
,
shadowBlur
:
10
}
},
itemStyle
:
{
normal
:
{
color
:
'
rgb(137,189,27)
'
,
borderColor
:
'
rgba(137,189,2,0.27)
'
,
borderWidth
:
12
}
},
data
:
[
220
,
182
,
191
,
134
,
150
,
120
,
110
,
125
,
145
,
122
,
165
,
122
]
},
{
name
:
'
CTCC
'
,
type
:
'
line
'
,
smooth
:
true
,
symbol
:
'
circle
'
,
symbolSize
:
5
,
showSymbol
:
false
,
lineStyle
:
{
normal
:
{
width
:
1
}
},
areaStyle
:
{
normal
:
{
color
:
new
echarts
.
graphic
.
LinearGradient
(
0
,
0
,
0
,
1
,
[{
offset
:
0
,
color
:
'
rgba(0, 136, 212, 0.3)
'
},
{
offset
:
0.8
,
color
:
'
rgba(0, 136, 212, 0)
'
}],
false
),
shadowColor
:
'
rgba(0, 0, 0, 0.1)
'
,
shadowBlur
:
10
}
},
itemStyle
:
{
normal
:
{
color
:
'
rgb(0,136,212)
'
,
borderColor
:
'
rgba(0,136,212,0.2)
'
,
borderWidth
:
12
}
},
data
:
[
120
,
110
,
125
,
145
,
122
,
165
,
122
,
220
,
182
,
191
,
134
,
150
]
},
{
name
:
'
CUCC
'
,
type
:
'
line
'
,
smooth
:
true
,
symbol
:
'
circle
'
,
symbolSize
:
5
,
showSymbol
:
false
,
lineStyle
:
{
normal
:
{
width
:
1
}
},
areaStyle
:
{
normal
:
{
color
:
new
echarts
.
graphic
.
LinearGradient
(
0
,
0
,
0
,
1
,
[{
offset
:
0
,
color
:
'
rgba(219, 50, 51, 0.3)
'
},
{
offset
:
0.8
,
color
:
'
rgba(219, 50, 51, 0)
'
}],
false
),
shadowColor
:
'
rgba(0, 0, 0, 0.1)
'
,
shadowBlur
:
10
}
},
itemStyle
:
{
normal
:
{
color
:
'
rgb(219,50,51)
'
,
borderColor
:
'
rgba(219,50,51,0.2)
'
,
borderWidth
:
12
}
},
data
:
[
220
,
182
,
125
,
145
,
122
,
191
,
134
,
150
,
120
,
110
,
165
,
122
]
}]
})
}
}
}
</
script
>
litemall-admin/src/components/Charts/mixChart.vue
deleted
100644 → 0
View file @
cffdc561
<
template
>
<div
:class=
"className"
:id=
"id"
:style=
"
{height:height,width:width}">
</div>
</
template
>
<
script
>
import
echarts
from
'
echarts
'
export
default
{
props
:
{
className
:
{
type
:
String
,
default
:
'
chart
'
},
id
:
{
type
:
String
,
default
:
'
chart
'
},
width
:
{
type
:
String
,
default
:
'
200px
'
},
height
:
{
type
:
String
,
default
:
'
200px
'
}
},
data
()
{
return
{
chart
:
null
}
},
mounted
()
{
this
.
initChart
()
this
.
chart
=
null
},
beforeDestroy
()
{
if
(
!
this
.
chart
)
{
return
}
this
.
chart
.
dispose
()
this
.
chart
=
null
},
methods
:
{
initChart
()
{
this
.
chart
=
echarts
.
init
(
document
.
getElementById
(
this
.
id
))
const
xData
=
(
function
()
{
const
data
=
[]
for
(
let
i
=
1
;
i
<
13
;
i
++
)
{
data
.
push
(
i
+
'
month
'
)
}
return
data
}())
this
.
chart
.
setOption
({
backgroundColor
:
'
#344b58
'
,
title
:
{
text
:
'
statistics
'
,
x
:
'
20
'
,
top
:
'
20
'
,
textStyle
:
{
color
:
'
#fff
'
,
fontSize
:
'
22
'
},
subtextStyle
:
{
color
:
'
#90979c
'
,
fontSize
:
'
16
'
}
},
tooltip
:
{
trigger
:
'
axis
'
,
axisPointer
:
{
textStyle
:
{
color
:
'
#fff
'
}
}
},
grid
:
{
borderWidth
:
0
,
top
:
110
,
bottom
:
95
,
textStyle
:
{
color
:
'
#fff
'
}
},
legend
:
{
x
:
'
5%
'
,
top
:
'
10%
'
,
textStyle
:
{
color
:
'
#90979c
'
},
data
:
[
'
female
'
,
'
male
'
,
'
average
'
]
},
calculable
:
true
,
xAxis
:
[{
type
:
'
category
'
,
axisLine
:
{
lineStyle
:
{
color
:
'
#90979c
'
}
},
splitLine
:
{
show
:
false
},
axisTick
:
{
show
:
false
},
splitArea
:
{
show
:
false
},
axisLabel
:
{
interval
:
0
},
data
:
xData
}],
yAxis
:
[{
type
:
'
value
'
,
splitLine
:
{
show
:
false
},
axisLine
:
{
lineStyle
:
{
color
:
'
#90979c
'
}
},
axisTick
:
{
show
:
false
},
axisLabel
:
{
interval
:
0
},
splitArea
:
{
show
:
false
}
}],
dataZoom
:
[{
show
:
true
,
height
:
30
,
xAxisIndex
:
[
0
],
bottom
:
30
,
start
:
10
,
end
:
80
,
handleIcon
:
'
path://M306.1,413c0,2.2-1.8,4-4,4h-59.8c-2.2,0-4-1.8-4-4V200.8c0-2.2,1.8-4,4-4h59.8c2.2,0,4,1.8,4,4V413z
'
,
handleSize
:
'
110%
'
,
handleStyle
:
{
color
:
'
#d3dee5
'
},
textStyle
:
{
color
:
'
#fff
'
},
borderColor
:
'
#90979c
'
},
{
type
:
'
inside
'
,
show
:
true
,
height
:
15
,
start
:
1
,
end
:
35
}],
series
:
[{
name
:
'
female
'
,
type
:
'
bar
'
,
stack
:
'
total
'
,
barMaxWidth
:
35
,
barGap
:
'
10%
'
,
itemStyle
:
{
normal
:
{
color
:
'
rgba(255,144,128,1)
'
,
label
:
{
show
:
true
,
textStyle
:
{
color
:
'
#fff
'
},
position
:
'
insideTop
'
,
formatter
(
p
)
{
return
p
.
value
>
0
?
p
.
value
:
''
}
}
}
},
data
:
[
709
,
1917
,
2455
,
2610
,
1719
,
1433
,
1544
,
3285
,
5208
,
3372
,
2484
,
4078
]
},
{
name
:
'
male
'
,
type
:
'
bar
'
,
stack
:
'
total
'
,
itemStyle
:
{
normal
:
{
color
:
'
rgba(0,191,183,1)
'
,
barBorderRadius
:
0
,
label
:
{
show
:
true
,
position
:
'
top
'
,
formatter
(
p
)
{
return
p
.
value
>
0
?
p
.
value
:
''
}
}
}
},
data
:
[
327
,
1776
,
507
,
1200
,
800
,
482
,
204
,
1390
,
1001
,
951
,
381
,
220
]
},
{
name
:
'
average
'
,
type
:
'
line
'
,
stack
:
'
total
'
,
symbolSize
:
10
,
symbol
:
'
circle
'
,
itemStyle
:
{
normal
:
{
color
:
'
rgba(252,230,48,1)
'
,
barBorderRadius
:
0
,
label
:
{
show
:
true
,
position
:
'
top
'
,
formatter
(
p
)
{
return
p
.
value
>
0
?
p
.
value
:
''
}
}
}
},
data
:
[
1036
,
3693
,
2962
,
3810
,
2519
,
1915
,
1748
,
4675
,
6209
,
4323
,
2865
,
4298
]
}
]
})
}
}
}
</
script
>
litemall-admin/src/components/Hamburger/index.vue
View file @
6f0ebe3e
<
template
>
<
template
>
<div>
<div>
<svg
t=
"1492500959545"
@
click=
"toggleClick"
class=
"wscn-icon hamburger"
:class=
"
{'is-active':isActive}" style="" viewBox="0 0 1024 1024"
<svg
version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="1691" xmlns:xlink="http://www.w3.org/1999/xlink" width="64" height="64">
:class=
"
{'is-active':isActive}"
<path
d=
"M966.8023 568.849776 57.196677 568.849776c-31.397081 0-56.850799-25.452695-56.850799-56.850799l0 0c0-31.397081 25.452695-56.849776 56.850799-56.849776l909.605623 0c31.397081 0 56.849776 25.452695 56.849776 56.849776l0 0C1023.653099 543.397081 998.200404 568.849776 966.8023 568.849776z"
t="1492500959545"
p-id=
"1692"
></path>
class="hamburger"
<path
d=
"M966.8023 881.527125 57.196677 881.527125c-31.397081 0-56.850799-25.452695-56.850799-56.849776l0 0c0-31.397081 25.452695-56.849776 56.850799-56.849776l909.605623 0c31.397081 0 56.849776 25.452695 56.849776 56.849776l0 0C1023.653099 856.07443 998.200404 881.527125 966.8023 881.527125z"
style=""
p-id=
"1693"
></path>
viewBox="0 0 1024 1024"
<path
d=
"M966.8023 256.17345 57.196677 256.17345c-31.397081 0-56.850799-25.452695-56.850799-56.849776l0 0c0-31.397081 25.452695-56.850799 56.850799-56.850799l909.605623 0c31.397081 0 56.849776 25.452695 56.849776 56.850799l0 0C1023.653099 230.720755 998.200404 256.17345 966.8023 256.17345z"
version="1.1"
p-id=
"1694"
></path>
xmlns="http://www.w3.org/2000/svg"
p-id="1691"
xmlns:xlink="http://www.w3.org/1999/xlink"
width="64"
height="64"
@click="toggleClick">
<path
d=
"M966.8023 568.849776 57.196677 568.849776c-31.397081 0-56.850799-25.452695-56.850799-56.850799l0 0c0-31.397081 25.452695-56.849776 56.850799-56.849776l909.605623 0c31.397081 0 56.849776 25.452695 56.849776 56.849776l0 0C1023.653099 543.397081 998.200404 568.849776 966.8023 568.849776z"
p-id=
"1692"
/>
<path
d=
"M966.8023 881.527125 57.196677 881.527125c-31.397081 0-56.850799-25.452695-56.850799-56.849776l0 0c0-31.397081 25.452695-56.849776 56.850799-56.849776l909.605623 0c31.397081 0 56.849776 25.452695 56.849776 56.849776l0 0C1023.653099 856.07443 998.200404 881.527125 966.8023 881.527125z"
p-id=
"1693"
/>
<path
d=
"M966.8023 256.17345 57.196677 256.17345c-31.397081 0-56.850799-25.452695-56.850799-56.849776l0 0c0-31.397081 25.452695-56.850799 56.850799-56.850799l909.605623 0c31.397081 0 56.849776 25.452695 56.849776 56.850799l0 0C1023.653099 230.720755 998.200404 256.17345 966.8023 256.17345z"
p-id=
"1694"
/>
</svg>
</svg>
</div>
</div>
</
template
>
</
template
>
<
script
>
<
script
>
export
default
{
export
default
{
name
:
'
h
amburger
'
,
name
:
'
H
amburger
'
,
props
:
{
props
:
{
isActive
:
{
isActive
:
{
type
:
Boolean
,
type
:
Boolean
,
...
@@ -30,16 +44,16 @@ export default {
...
@@ -30,16 +44,16 @@ export default {
<
style
scoped
>
<
style
scoped
>
.hamburger
{
.hamburger
{
display
:
inline-block
;
display
:
inline-block
;
cursor
:
pointer
;
cursor
:
pointer
;
width
:
20px
;
width
:
20px
;
height
:
20px
;
height
:
20px
;
transform
:
rotate
(
90deg
);
transform
:
rotate
(
90deg
);
transition
:
.38s
;
transition
:
.38s
;
transform-origin
:
50%
50%
;
transform-origin
:
50%
50%
;
}
}
.hamburger.is-active
{
.hamburger.is-active
{
transform
:
rotate
(
0deg
);
transform
:
rotate
(
0deg
);
}
}
</
style
>
</
style
>
litemall-admin/src/components/LangSelect/index.vue
0 → 100644
View file @
6f0ebe3e
<
template
>
<el-dropdown
trigger=
"click"
class=
"international"
@
command=
"handleSetLanguage"
>
<div>
<svg-icon
class-name=
"international-icon"
icon-class=
"language"
/>
</div>
<el-dropdown-menu
slot=
"dropdown"
>
<el-dropdown-item
:disabled=
"language==='zh'"
command=
"zh"
>
中文
</el-dropdown-item>
<el-dropdown-item
:disabled=
"language==='en'"
command=
"en"
>
English
</el-dropdown-item>
</el-dropdown-menu>
</el-dropdown>
</
template
>
<
script
>
export
default
{
computed
:
{
language
()
{
return
this
.
$store
.
getters
.
language
}
},
methods
:
{
handleSetLanguage
(
lang
)
{
this
.
$i18n
.
locale
=
lang
this
.
$store
.
dispatch
(
'
setLanguage
'
,
lang
)
this
.
$message
({
message
:
'
Switch Language Success
'
,
type
:
'
success
'
})
}
}
}
</
script
>
<
style
scoped
>
.international-icon
{
font-size
:
20px
;
cursor
:
pointer
;
vertical-align
:
-5px
!important
;
}
</
style
>
litemall-admin/src/components/Pagination/index.vue
0 → 100644
View file @
6f0ebe3e
<
template
>
<div
:class=
"
{'hidden':hidden}" class="pagination-container">
<el-pagination
:background=
"background"
:current-page.sync=
"currentPage"
:page-size.sync=
"pageSize"
:layout=
"layout"
:total=
"total"
v-bind=
"$attrs"
@
size-change=
"handleSizeChange"
@
current-change=
"handleCurrentChange"
/>
</div>
</
template
>
<
script
>
import
{
scrollTo
}
from
'
@/utils/scrollTo
'
export
default
{
name
:
'
Pagination
'
,
props
:
{
total
:
{
required
:
true
,
type
:
Number
},
page
:
{
type
:
Number
,
default
:
1
},
limit
:
{
type
:
Number
,
default
:
20
},
pageSizes
:
{
type
:
Array
,
default
()
{
return
[
10
,
20
,
30
,
50
]
}
},
layout
:
{
type
:
String
,
default
:
'
total, sizes, prev, pager, next, jumper
'
},
background
:
{
type
:
Boolean
,
default
:
true
},
autoScroll
:
{
type
:
Boolean
,
default
:
true
},
hidden
:
{
type
:
Boolean
,
default
:
false
}
},
computed
:
{
currentPage
:
{
get
()
{
return
this
.
page
},
set
(
val
)
{
this
.
$emit
(
'
update:page
'
,
val
)
}
},
pageSize
:
{
get
()
{
return
this
.
limit
},
set
(
val
)
{
this
.
$emit
(
'
update:limit
'
,
val
)
}
}
},
methods
:
{
handleSizeChange
(
val
)
{
this
.
$emit
(
'
pagination
'
,
{
page
:
this
.
currentPage
,
limit
:
val
})
if
(
this
.
autoScroll
)
{
scrollTo
(
0
,
800
)
}
},
handleCurrentChange
(
val
)
{
this
.
$emit
(
'
pagination
'
,
{
page
:
val
,
limit
:
this
.
pageSize
})
if
(
this
.
autoScroll
)
{
scrollTo
(
0
,
800
)
}
}
}
}
</
script
>
<
style
scoped
>
.pagination-container
{
background
:
#fff
;
padding
:
32px
16px
;
}
.pagination-container.hidden
{
display
:
none
;
}
</
style
>
litemall-admin/src/components/Screenfull/index.vue
View file @
6f0ebe3e
<
template
>
<
template
>
<div>
<div>
<svg
t=
"1508738709248"
@
click=
'click'
class=
"screenfull-svg"
viewBox=
"0 0 1024 1024"
version=
"1.1"
xmlns=
"http://www.w3.org/2000/svg"
<svg
p-id=
"2069"
xmlns:xlink=
"http://www.w3.org/1999/xlink"
width=
"32"
height=
"32"
>
t=
"1508738709248"
<path
d=
"M333.493443 428.647617 428.322206 333.832158 262.572184 168.045297 366.707916 64.444754 64.09683 64.444754 63.853283 366.570793 167.283957 262.460644Z"
class=
"screenfull-svg"
p-id=
"2070"
></path>
viewBox=
"0 0 1024 1024"
<path
d=
"M854.845439 760.133334 688.61037 593.95864 593.805144 688.764889 759.554142 854.56096 655.44604 958.161503 958.055079 958.161503 958.274066 656.035464Z"
version=
"1.1"
p-id=
"2071"
></path>
xmlns=
"http://www.w3.org/2000/svg"
<path
d=
"M688.535669 428.550403 854.31025 262.801405 957.935352 366.921787 957.935352 64.34754 655.809313 64.081481 759.919463 167.535691 593.70793 333.731874Z"
p-id=
"2069"
p-id=
"2072"
></path>
xmlns:xlink=
"http://www.w3.org/1999/xlink"
<path
d=
"M333.590658 594.033341 167.8171 759.804852 64.218604 655.67219 64.218604 958.270996 366.342596 958.502263 262.234493 855.071589 428.421466 688.86108Z"
width=
"32"
p-id=
"2073"
></path>
height=
"32"
@
click=
"click"
>
<path
d=
"M333.493443 428.647617 428.322206 333.832158 262.572184 168.045297 366.707916 64.444754 64.09683 64.444754 63.853283 366.570793 167.283957 262.460644Z"
p-id=
"2070"
/>
<path
d=
"M854.845439 760.133334 688.61037 593.95864 593.805144 688.764889 759.554142 854.56096 655.44604 958.161503 958.055079 958.161503 958.274066 656.035464Z"
p-id=
"2071"
/>
<path
d=
"M688.535669 428.550403 854.31025 262.801405 957.935352 366.921787 957.935352 64.34754 655.809313 64.081481 759.919463 167.535691 593.70793 333.731874Z"
p-id=
"2072"
/>
<path
d=
"M333.590658 594.033341 167.8171 759.804852 64.218604 655.67219 64.218604 958.270996 366.342596 958.502263 262.234493 855.071589 428.421466 688.86108Z"
p-id=
"2073"
/>
</svg>
</svg>
</div>
</div>
</
template
>
</
template
>
...
@@ -18,7 +31,7 @@
...
@@ -18,7 +31,7 @@
import
screenfull
from
'
screenfull
'
import
screenfull
from
'
screenfull
'
export
default
{
export
default
{
name
:
'
s
creenfull
'
,
name
:
'
S
creenfull
'
,
props
:
{
props
:
{
width
:
{
width
:
{
type
:
Number
,
type
:
Number
,
...
...
litemall-admin/src/components/ScrollBar/index.vue
deleted
100644 → 0
View file @
cffdc561
<
template
>
<div
class=
"scroll-container"
ref=
"scrollContainer"
@
wheel.prevent=
"handleScroll"
>
<div
class=
"scroll-wrapper"
ref=
"scrollWrapper"
:style=
"
{top: top + 'px'}">
<slot></slot>
</div>
</div>
</
template
>
<
script
>
const
delta
=
15
export
default
{
name
:
'
scrollBar
'
,
data
()
{
return
{
top
:
0
}
},
methods
:
{
handleScroll
(
e
)
{
const
eventDelta
=
e
.
wheelDelta
||
-
e
.
deltaY
*
3
const
$container
=
this
.
$refs
.
scrollContainer
const
$containerHeight
=
$container
.
offsetHeight
const
$wrapper
=
this
.
$refs
.
scrollWrapper
const
$wrapperHeight
=
$wrapper
.
offsetHeight
if
(
eventDelta
>
0
)
{
this
.
top
=
Math
.
min
(
0
,
this
.
top
+
eventDelta
)
}
else
{
if
(
$containerHeight
-
delta
<
$wrapperHeight
)
{
if
(
this
.
top
<
-
(
$wrapperHeight
-
$containerHeight
+
delta
))
{
this
.
top
=
this
.
top
}
else
{
this
.
top
=
Math
.
max
(
this
.
top
+
eventDelta
,
$containerHeight
-
$wrapperHeight
-
delta
)
}
}
else
{
this
.
top
=
0
}
}
}
}
}
</
script
>
<
style
rel=
"stylesheet/scss"
lang=
"scss"
scoped
>
@import
'../../styles/variables.scss'
;
.scroll-container
{
position
:
relative
;
width
:
100%
;
height
:
100%
;
background-color
:
$menuBg
;
.scroll-wrapper
{
position
:
absolute
;
width
:
100%
!
important
;
}
}
</
style
>
litemall-admin/src/components/ScrollPane/index.vue
View file @
6f0ebe3e
<
template
>
<
template
>
<div
class=
"scroll-container"
ref=
"scrollContainer"
@
wheel.prevent=
"handleScroll"
>
<el-scrollbar
ref=
"scrollContainer"
:vertical=
"false"
class=
"scroll-container"
@
wheel.native.prevent=
"handleScroll"
>
<div
class=
"scroll-wrapper"
ref=
"scrollWrapper"
:style=
"
{left: left + 'px'}">
<slot/>
<slot></slot>
</el-scrollbar>
</div>
</div>
</
template
>
</
template
>
<
script
>
<
script
>
const
padd
ing
=
15
// tag
's padd
ing
const
tagAndTagSpac
ing
=
4
// tag
AndTagSpac
ing
export
default
{
export
default
{
name
:
'
s
crollPane
'
,
name
:
'
S
crollPane
'
,
data
()
{
data
()
{
return
{
return
{
left
:
0
left
:
0
...
@@ -18,41 +16,58 @@ export default {
...
@@ -18,41 +16,58 @@ export default {
},
},
methods
:
{
methods
:
{
handleScroll
(
e
)
{
handleScroll
(
e
)
{
const
eventDelta
=
e
.
wheelDelta
||
-
e
.
deltaY
*
3
const
eventDelta
=
e
.
wheelDelta
||
-
e
.
deltaY
*
40
const
$container
=
this
.
$refs
.
scrollContainer
const
$scrollWrapper
=
this
.
$refs
.
scrollContainer
.
$refs
.
wrap
$scrollWrapper
.
scrollLeft
=
$scrollWrapper
.
scrollLeft
+
eventDelta
/
4
},
moveToTarget
(
currentTag
)
{
const
$container
=
this
.
$refs
.
scrollContainer
.
$el
const
$containerWidth
=
$container
.
offsetWidth
const
$containerWidth
=
$container
.
offsetWidth
const
$
w
rapper
=
this
.
$refs
.
scroll
Wrapper
const
$
scrollW
rapper
=
this
.
$refs
.
scroll
Container
.
$refs
.
wrap
const
$wrapperWidth
=
$wrapper
.
offsetWidth
const
tagList
=
this
.
$parent
.
$refs
.
tag
if
(
eventDelta
>
0
)
{
let
firstTag
=
null
this
.
left
=
Math
.
min
(
0
,
this
.
left
+
eventDelta
)
let
lastTag
=
null
}
else
{
let
prevTag
=
null
if
(
$containerWidth
-
padding
<
$wrapperWidth
)
{
let
nextTag
=
null
if
(
this
.
left
<
-
(
$wrapperWidth
-
$containerWidth
+
padding
))
{
this
.
left
=
this
.
left
// find first tag and last tag
if
(
tagList
.
length
>
0
)
{
firstTag
=
tagList
[
0
]
lastTag
=
tagList
[
tagList
.
length
-
1
]
}
// find preTag and nextTag
for
(
let
i
=
0
;
i
<
tagList
.
length
;
i
++
)
{
if
(
tagList
[
i
]
===
currentTag
)
{
if
(
i
===
0
)
{
nextTag
=
tagList
[
i
].
length
>
1
&&
tagList
[
i
+
1
]
}
else
if
(
i
===
tagList
.
length
-
1
)
{
prevTag
=
tagList
[
i
].
length
>
1
&&
tagList
[
i
-
1
]
}
else
{
}
else
{
this
.
left
=
Math
.
max
(
this
.
left
+
eventDelta
,
$containerWidth
-
$wrapperWidth
-
padding
)
prevTag
=
tagList
[
i
-
1
]
nextTag
=
tagList
[
i
+
1
]
}
}
}
else
{
break
this
.
left
=
0
}
}
}
}
},
moveToTarget
(
$target
)
{
const
$container
=
this
.
$refs
.
scrollContainer
const
$containerWidth
=
$container
.
offsetWidth
const
$targetLeft
=
$target
.
offsetLeft
const
$targetWidth
=
$target
.
offsetWidth
if
(
$targetLeft
<
-
this
.
left
)
{
if
(
firstTag
===
currentTag
)
{
// tag in the left
$scrollWrapper
.
scrollLeft
=
0
this
.
left
=
-
$targetLeft
+
padding
}
else
if
(
lastTag
===
currentTag
)
{
}
else
if
(
$targetLeft
+
padding
>
-
this
.
left
&&
$targetLeft
+
$targetWidth
<
-
this
.
left
+
$containerWidth
-
padding
)
{
$scrollWrapper
.
scrollLeft
=
$scrollWrapper
.
scrollWidth
-
$containerWidth
// tag in the current view
// eslint-disable-line
}
else
{
}
else
{
// tag in the right
// the tag's offsetLeft after of nextTag
this
.
left
=
-
(
$targetLeft
-
(
$containerWidth
-
$targetWidth
)
+
padding
)
const
afterNextTagOffsetLeft
=
nextTag
.
$el
.
offsetLeft
+
nextTag
.
$el
.
offsetWidth
+
tagAndTagSpacing
// the tag's offsetLeft before of prevTag
const
beforePrevTagOffsetLeft
=
prevTag
.
$el
.
offsetLeft
-
tagAndTagSpacing
if
(
afterNextTagOffsetLeft
>
$scrollWrapper
.
scrollLeft
+
$containerWidth
)
{
$scrollWrapper
.
scrollLeft
=
afterNextTagOffsetLeft
-
$containerWidth
}
else
if
(
beforePrevTagOffsetLeft
<
$scrollWrapper
.
scrollLeft
)
{
$scrollWrapper
.
scrollLeft
=
beforePrevTagOffsetLeft
}
}
}
}
}
}
}
...
@@ -65,8 +80,13 @@ export default {
...
@@ -65,8 +80,13 @@ export default {
position
:
relative
;
position
:
relative
;
overflow
:
hidden
;
overflow
:
hidden
;
width
:
100%
;
width
:
100%
;
.scroll-wrapper
{
/
deep
/
{
position
:
absolute
;
.el-scrollbar__bar
{
bottom
:
0px
;
}
.el-scrollbar__wrap
{
height
:
49px
;
}
}
}
}
}
</
style
>
</
style
>
litemall-admin/src/components/SizeSelect/index.vue
0 → 100644
View file @
6f0ebe3e
<
template
>
<el-dropdown
trigger=
"click"
@
command=
"handleSetSize"
>
<div>
<svg-icon
class-name=
"size-icon"
icon-class=
"size"
/>
</div>
<el-dropdown-menu
slot=
"dropdown"
>
<el-dropdown-item
:disabled=
"size==='medium'"
command=
"medium"
>
Medium
</el-dropdown-item>
<el-dropdown-item
:disabled=
"size==='small'"
command=
"small"
>
Small
</el-dropdown-item>
<el-dropdown-item
:disabled=
"size==='mini'"
command=
"mini"
>
Mini
</el-dropdown-item>
</el-dropdown-menu>
</el-dropdown>
</
template
>
<
script
>
export
default
{
computed
:
{
size
()
{
return
this
.
$store
.
getters
.
size
}
},
methods
:
{
handleSetSize
(
size
)
{
this
.
$ELEMENT
.
size
=
size
this
.
$store
.
dispatch
(
'
setSize
'
,
size
)
this
.
refreshView
()
this
.
$message
({
message
:
'
Switch Size Success
'
,
type
:
'
success
'
})
},
refreshView
()
{
// In order to make the cached page re-rendered
this
.
$store
.
dispatch
(
'
delAllCachedViews
'
,
this
.
$route
)
const
{
fullPath
}
=
this
.
$route
this
.
$nextTick
(()
=>
{
this
.
$router
.
replace
({
path
:
'
/redirect
'
+
fullPath
})
})
}
}
}
</
script
>
<
style
scoped
>
.size-icon
{
font-size
:
20px
;
cursor
:
pointer
;
vertical-align
:
-4px
!important
;
}
</
style
>
litemall-admin/src/components/Sticky/index.vue
deleted
100644 → 0
View file @
cffdc561
<
template
>
<div
:style=
"
{height:height+'px',zIndex:zIndex}">
<div
:class=
"className"
:style=
"
{top:stickyTop+'px',zIndex:zIndex,position:position,width:width,height:height+'px'}">
<slot>
<div>
sticky
</div>
</slot>
</div>
</div>
</
template
>
<
script
>
export
default
{
name
:
'
Sticky
'
,
props
:
{
stickyTop
:
{
type
:
Number
,
default
:
0
},
zIndex
:
{
type
:
Number
,
default
:
1
},
className
:
{
type
:
String
}
},
data
()
{
return
{
active
:
false
,
position
:
''
,
currentTop
:
''
,
width
:
undefined
,
height
:
undefined
,
child
:
null
,
stickyHeight
:
0
}
},
mounted
()
{
this
.
height
=
this
.
$el
.
getBoundingClientRect
().
height
window
.
addEventListener
(
'
scroll
'
,
this
.
handleScroll
)
},
activated
()
{
this
.
handleScroll
()
},
destroyed
()
{
window
.
removeEventListener
(
'
scroll
'
,
this
.
handleScroll
)
},
methods
:
{
sticky
()
{
if
(
this
.
active
)
{
return
}
this
.
position
=
'
fixed
'
this
.
active
=
true
this
.
width
=
this
.
width
+
'
px
'
},
reset
()
{
if
(
!
this
.
active
)
{
return
}
this
.
position
=
''
this
.
width
=
'
auto
'
this
.
active
=
false
},
handleScroll
()
{
this
.
width
=
this
.
$el
.
getBoundingClientRect
().
width
const
offsetTop
=
this
.
$el
.
getBoundingClientRect
().
top
if
(
offsetTop
<=
this
.
stickyTop
)
{
this
.
sticky
()
return
}
this
.
reset
()
}
}
}
</
script
>
litemall-admin/src/components/SvgIcon/index.vue
View file @
6f0ebe3e
<
template
>
<
template
>
<svg
:class=
"svgClass"
aria-hidden=
"true"
>
<svg
:class=
"svgClass"
aria-hidden=
"true"
>
<use
:xlink:href=
"iconName"
></use
>
<use
:xlink:href=
"iconName"
/
>
</svg>
</svg>
</
template
>
</
template
>
<
script
>
<
script
>
export
default
{
export
default
{
name
:
'
s
vg
-i
con
'
,
name
:
'
S
vg
I
con
'
,
props
:
{
props
:
{
iconClass
:
{
iconClass
:
{
type
:
String
,
type
:
String
,
required
:
true
required
:
true
},
},
className
:
{
className
:
{
type
:
String
type
:
String
,
default
:
''
}
}
},
},
computed
:
{
computed
:
{
...
...
litemall-admin/src/components/ThemePicker/index.vue
0 → 100644
View file @
6f0ebe3e
<
template
>
<el-color-picker
v-model=
"theme"
class=
"theme-picker"
popper-class=
"theme-picker-dropdown"
/>
</
template
>
<
script
>
const
version
=
require
(
'
element-ui/package.json
'
).
version
// element-ui version from node_modules
const
ORIGINAL_THEME
=
'
#409EFF
'
// default color
export
default
{
data
()
{
return
{
chalk
:
''
,
// content of theme-chalk css
theme
:
ORIGINAL_THEME
}
},
watch
:
{
theme
(
val
,
oldVal
)
{
if
(
typeof
val
!==
'
string
'
)
return
const
themeCluster
=
this
.
getThemeCluster
(
val
.
replace
(
'
#
'
,
''
))
const
originalCluster
=
this
.
getThemeCluster
(
oldVal
.
replace
(
'
#
'
,
''
))
console
.
log
(
themeCluster
,
originalCluster
)
const
getHandler
=
(
variable
,
id
)
=>
{
return
()
=>
{
const
originalCluster
=
this
.
getThemeCluster
(
ORIGINAL_THEME
.
replace
(
'
#
'
,
''
))
const
newStyle
=
this
.
updateStyle
(
this
[
variable
],
originalCluster
,
themeCluster
)
let
styleTag
=
document
.
getElementById
(
id
)
if
(
!
styleTag
)
{
styleTag
=
document
.
createElement
(
'
style
'
)
styleTag
.
setAttribute
(
'
id
'
,
id
)
document
.
head
.
appendChild
(
styleTag
)
}
styleTag
.
innerText
=
newStyle
}
}
const
chalkHandler
=
getHandler
(
'
chalk
'
,
'
chalk-style
'
)
if
(
!
this
.
chalk
)
{
const
url
=
`https://unpkg.com/element-ui@
${
version
}
/lib/theme-chalk/index.css`
this
.
getCSSString
(
url
,
chalkHandler
,
'
chalk
'
)
}
else
{
chalkHandler
()
}
const
styles
=
[].
slice
.
call
(
document
.
querySelectorAll
(
'
style
'
))
.
filter
(
style
=>
{
const
text
=
style
.
innerText
return
new
RegExp
(
oldVal
,
'
i
'
).
test
(
text
)
&&
!
/Chalk Variables/
.
test
(
text
)
})
styles
.
forEach
(
style
=>
{
const
{
innerText
}
=
style
if
(
typeof
innerText
!==
'
string
'
)
return
style
.
innerText
=
this
.
updateStyle
(
innerText
,
originalCluster
,
themeCluster
)
})
this
.
$message
({
message
:
'
换肤成功
'
,
type
:
'
success
'
})
}
},
methods
:
{
updateStyle
(
style
,
oldCluster
,
newCluster
)
{
let
newStyle
=
style
oldCluster
.
forEach
((
color
,
index
)
=>
{
newStyle
=
newStyle
.
replace
(
new
RegExp
(
color
,
'
ig
'
),
newCluster
[
index
])
})
return
newStyle
},
getCSSString
(
url
,
callback
,
variable
)
{
const
xhr
=
new
XMLHttpRequest
()
xhr
.
onreadystatechange
=
()
=>
{
if
(
xhr
.
readyState
===
4
&&
xhr
.
status
===
200
)
{
this
[
variable
]
=
xhr
.
responseText
.
replace
(
/@font-face{
[^
}
]
+}/
,
''
)
callback
()
}
}
xhr
.
open
(
'
GET
'
,
url
)
xhr
.
send
()
},
getThemeCluster
(
theme
)
{
const
tintColor
=
(
color
,
tint
)
=>
{
let
red
=
parseInt
(
color
.
slice
(
0
,
2
),
16
)
let
green
=
parseInt
(
color
.
slice
(
2
,
4
),
16
)
let
blue
=
parseInt
(
color
.
slice
(
4
,
6
),
16
)
if
(
tint
===
0
)
{
// when primary color is in its rgb space
return
[
red
,
green
,
blue
].
join
(
'
,
'
)
}
else
{
red
+=
Math
.
round
(
tint
*
(
255
-
red
))
green
+=
Math
.
round
(
tint
*
(
255
-
green
))
blue
+=
Math
.
round
(
tint
*
(
255
-
blue
))
red
=
red
.
toString
(
16
)
green
=
green
.
toString
(
16
)
blue
=
blue
.
toString
(
16
)
return
`#
${
red
}${
green
}${
blue
}
`
}
}
const
shadeColor
=
(
color
,
shade
)
=>
{
let
red
=
parseInt
(
color
.
slice
(
0
,
2
),
16
)
let
green
=
parseInt
(
color
.
slice
(
2
,
4
),
16
)
let
blue
=
parseInt
(
color
.
slice
(
4
,
6
),
16
)
red
=
Math
.
round
((
1
-
shade
)
*
red
)
green
=
Math
.
round
((
1
-
shade
)
*
green
)
blue
=
Math
.
round
((
1
-
shade
)
*
blue
)
red
=
red
.
toString
(
16
)
green
=
green
.
toString
(
16
)
blue
=
blue
.
toString
(
16
)
return
`#
${
red
}${
green
}${
blue
}
`
}
const
clusters
=
[
theme
]
for
(
let
i
=
0
;
i
<=
9
;
i
++
)
{
clusters
.
push
(
tintColor
(
theme
,
Number
((
i
/
10
).
toFixed
(
2
))))
}
clusters
.
push
(
shadeColor
(
theme
,
0.1
))
return
clusters
}
}
}
</
script
>
<
style
>
.theme-picker
.el-color-picker__trigger
{
vertical-align
:
middle
;
}
.theme-picker-dropdown
.el-color-dropdown__link-btn
{
display
:
none
;
}
</
style
>
litemall-admin/src/components/Upload/singleImage.vue
deleted
100644 → 0
View file @
cffdc561
<
template
>
<div
class=
"upload-container"
>
<el-upload
class=
"image-uploader"
:data=
"dataObj"
:headers=
"headers"
drag
:multiple=
"false"
:show-file-list=
"false"
action=
"https://httpbin.org/post"
:on-success=
"handleImageScucess"
>
<i
class=
"el-icon-upload"
></i>
<div
class=
"el-upload__text"
>
将文件拖到此处,或
<em>
点击上传
</em></div>
</el-upload>
<div
class=
"image-preview"
>
<div
class=
"image-preview-wrapper"
v-show=
"imageUrl.length>1"
>
<img
:src=
"imageUrl+'?imageView2/1/w/200/h/200'"
>
<div
class=
"image-preview-action"
>
<i
@
click=
"rmImage"
class=
"el-icon-delete"
></i>
</div>
</div>
</div>
</div>
</
template
>
<
script
>
// 预览效果见付费文章
import
{
getToken
}
from
'
@/api/qiniu
'
export
default
{
name
:
'
singleImageUpload
'
,
props
:
{
value
:
String
},
computed
:
{
imageUrl
()
{
return
this
.
value
},
headers
()
{
return
{
'
Admin-Token
'
:
getToken
()
}
}
},
data
()
{
return
{
tempUrl
:
''
,
dataObj
:
{
token
:
''
,
key
:
''
}
}
},
methods
:
{
rmImage
()
{
this
.
emitInput
(
''
)
},
emitInput
(
val
)
{
this
.
$emit
(
'
input
'
,
val
)
},
handleImageScucess
()
{
this
.
emitInput
(
this
.
tempUrl
)
},
beforeUpload
()
{
const
_self
=
this
return
new
Promise
((
resolve
,
reject
)
=>
{
getToken
().
then
(
response
=>
{
const
key
=
response
.
data
.
qiniu_key
const
token
=
response
.
data
.
qiniu_token
_self
.
_data
.
dataObj
.
token
=
token
_self
.
_data
.
dataObj
.
key
=
key
this
.
tempUrl
=
response
.
data
.
qiniu_url
resolve
(
true
)
}).
catch
(
err
=>
{
console
.
log
(
err
)
reject
(
false
)
})
})
}
}
}
</
script
>
<
style
rel=
"stylesheet/scss"
lang=
"scss"
scoped
>
@import
"src/styles/mixin.scss"
;
.upload-container
{
width
:
100%
;
position
:
relative
;
@include
clearfix
;
.image-uploader
{
width
:
60%
;
float
:
left
;
}
.image-preview
{
width
:
200px
;
height
:
200px
;
position
:
relative
;
border
:
1px
dashed
#d9d9d9
;
float
:
left
;
margin-left
:
50px
;
.image-preview-wrapper
{
position
:
relative
;
width
:
100%
;
height
:
100%
;
img
{
width
:
100%
;
height
:
100%
;
}
}
.image-preview-action
{
position
:
absolute
;
width
:
100%
;
height
:
100%
;
left
:
0
;
top
:
0
;
cursor
:
default
;
text-align
:
center
;
color
:
#fff
;
opacity
:
0
;
font-size
:
20px
;
background-color
:
rgba
(
0
,
0
,
0
,
.5
);
transition
:
opacity
.3s
;
cursor
:
pointer
;
text-align
:
center
;
line-height
:
200px
;
.el-icon-delete
{
font-size
:
36px
;
}
}
&
:hover
{
.image-preview-action
{
opacity
:
1
;
}
}
}
}
</
style
>
litemall-admin/src/components/Upload/singleImage2.vue
deleted
100644 → 0
View file @
cffdc561
<
template
>
<div
class=
"singleImageUpload2 upload-container"
>
<el-upload
class=
"image-uploader"
:data=
"dataObj"
:headers=
"headers"
drag
:multiple=
"false"
:show-file-list=
"false"
action=
"https://httpbin.org/post"
:on-success=
"handleImageScucess"
>
<i
class=
"el-icon-upload"
></i>
<div
class=
"el-upload__text"
>
Drag或
<em>
点击上传
</em></div>
</el-upload>
<div
v-show=
"imageUrl.length>0"
class=
"image-preview"
>
<div
class=
"image-preview-wrapper"
v-show=
"imageUrl.length>1"
>
<img
:src=
"imageUrl"
>
<div
class=
"image-preview-action"
>
<i
@
click=
"rmImage"
class=
"el-icon-delete"
></i>
</div>
</div>
</div>
</div>
</
template
>
<
script
>
import
{
getToken
}
from
'
@/api/qiniu
'
export
default
{
name
:
'
singleImageUpload2
'
,
props
:
{
value
:
String
},
computed
:
{
imageUrl
()
{
return
this
.
value
},
headers
()
{
return
{
'
Admin-Token
'
:
getToken
()
}
}
},
data
()
{
return
{
tempUrl
:
''
,
dataObj
:
{
token
:
''
,
key
:
''
}
}
},
methods
:
{
rmImage
()
{
this
.
emitInput
(
''
)
},
emitInput
(
val
)
{
this
.
$emit
(
'
input
'
,
val
)
},
handleImageScucess
()
{
this
.
emitInput
(
this
.
tempUrl
)
},
beforeUpload
()
{
const
_self
=
this
return
new
Promise
((
resolve
,
reject
)
=>
{
getToken
().
then
(
response
=>
{
const
key
=
response
.
data
.
qiniu_key
const
token
=
response
.
data
.
qiniu_token
_self
.
_data
.
dataObj
.
token
=
token
_self
.
_data
.
dataObj
.
key
=
key
this
.
tempUrl
=
response
.
data
.
qiniu_url
resolve
(
true
)
}).
catch
(()
=>
{
reject
(
false
)
})
})
}
}
}
</
script
>
<
style
rel=
"stylesheet/scss"
lang=
"scss"
scoped
>
.upload-container
{
width
:
100%
;
height
:
100%
;
position
:
relative
;
.image-uploader
{
height
:
100%
;
}
.image-preview
{
width
:
100%
;
height
:
100%
;
position
:
absolute
;
left
:
0px
;
top
:
0px
;
border
:
1px
dashed
#d9d9d9
;
.image-preview-wrapper
{
position
:
relative
;
width
:
100%
;
height
:
100%
;
img
{
width
:
100%
;
height
:
100%
;
}
}
.image-preview-action
{
position
:
absolute
;
width
:
100%
;
height
:
100%
;
left
:
0
;
top
:
0
;
cursor
:
default
;
text-align
:
center
;
color
:
#fff
;
opacity
:
0
;
font-size
:
20px
;
background-color
:
rgba
(
0
,
0
,
0
,
.5
);
transition
:
opacity
.3s
;
cursor
:
pointer
;
text-align
:
center
;
line-height
:
200px
;
.el-icon-delete
{
font-size
:
36px
;
}
}
&
:hover
{
.image-preview-action
{
opacity
:
1
;
}
}
}
}
</
style
>
litemall-admin/src/components/Upload/singleImage3.vue
deleted
100644 → 0
View file @
cffdc561
<
template
>
<div
class=
"upload-container"
>
<el-upload
class=
"image-uploader"
:data=
"dataObj"
:headers=
"headers"
drag
:multiple=
"false"
:show-file-list=
"false"
action=
"https://httpbin.org/post"
:on-success=
"handleImageScucess"
>
<i
class=
"el-icon-upload"
></i>
<div
class=
"el-upload__text"
>
将文件拖到此处,或
<em>
点击上传
</em></div>
</el-upload>
<div
class=
"image-preview image-app-preview"
>
<div
class=
"image-preview-wrapper"
v-show=
"imageUrl.length>1"
>
<img
:src=
"imageUrl"
>
<div
class=
"image-preview-action"
>
<i
@
click=
"rmImage"
class=
"el-icon-delete"
></i>
</div>
</div>
</div>
<div
class=
"image-preview"
>
<div
class=
"image-preview-wrapper"
v-show=
"imageUrl.length>1"
>
<img
:src=
"imageUrl"
>
<div
class=
"image-preview-action"
>
<i
@
click=
"rmImage"
class=
"el-icon-delete"
></i>
</div>
</div>
</div>
</div>
</
template
>
<
script
>
import
{
getToken
}
from
'
@/api/qiniu
'
export
default
{
name
:
'
singleImageUpload3
'
,
props
:
{
value
:
String
},
computed
:
{
imageUrl
()
{
return
this
.
value
},
headers
()
{
return
{
'
Admin-Token
'
:
getToken
()
}
}
},
data
()
{
return
{
tempUrl
:
''
,
dataObj
:
{
token
:
''
,
key
:
''
}
}
},
methods
:
{
rmImage
()
{
this
.
emitInput
(
''
)
},
emitInput
(
val
)
{
this
.
$emit
(
'
input
'
,
val
)
},
handleImageScucess
(
file
)
{
this
.
emitInput
(
file
.
files
.
file
)
},
beforeUpload
()
{
const
_self
=
this
return
new
Promise
((
resolve
,
reject
)
=>
{
getToken
().
then
(
response
=>
{
const
key
=
response
.
data
.
qiniu_key
const
token
=
response
.
data
.
qiniu_token
_self
.
_data
.
dataObj
.
token
=
token
_self
.
_data
.
dataObj
.
key
=
key
this
.
tempUrl
=
response
.
data
.
qiniu_url
resolve
(
true
)
}).
catch
(
err
=>
{
console
.
log
(
err
)
reject
(
false
)
})
})
}
}
}
</
script
>
<
style
rel=
"stylesheet/scss"
lang=
"scss"
scoped
>
@import
"src/styles/mixin.scss"
;
.upload-container
{
width
:
100%
;
position
:
relative
;
@include
clearfix
;
.image-uploader
{
width
:
35%
;
float
:
left
;
}
.image-preview
{
width
:
200px
;
height
:
200px
;
position
:
relative
;
border
:
1px
dashed
#d9d9d9
;
float
:
left
;
margin-left
:
50px
;
.image-preview-wrapper
{
position
:
relative
;
width
:
100%
;
height
:
100%
;
img
{
width
:
100%
;
height
:
100%
;
}
}
.image-preview-action
{
position
:
absolute
;
width
:
100%
;
height
:
100%
;
left
:
0
;
top
:
0
;
cursor
:
default
;
text-align
:
center
;
color
:
#fff
;
opacity
:
0
;
font-size
:
20px
;
background-color
:
rgba
(
0
,
0
,
0
,
.5
);
transition
:
opacity
.3s
;
cursor
:
pointer
;
text-align
:
center
;
line-height
:
200px
;
.el-icon-delete
{
font-size
:
36px
;
}
}
&
:hover
{
.image-preview-action
{
opacity
:
1
;
}
}
}
.image-app-preview
{
width
:
320px
;
height
:
180px
;
position
:
relative
;
border
:
1px
dashed
#d9d9d9
;
float
:
left
;
margin-left
:
50px
;
.app-fake-conver
{
height
:
44px
;
position
:
absolute
;
width
:
100%
;
// background: rgba(0, 0, 0, .1);
text-align
:
center
;
line-height
:
64px
;
color
:
#fff
;
}
}
}
</
style
>
litemall-admin/src/directive/clipboard/clipboard.js
0 → 100644
View file @
6f0ebe3e
// Inspired by https://github.com/Inndy/vue-clipboard2
const
Clipboard
=
require
(
'
clipboard
'
)
if
(
!
Clipboard
)
{
throw
new
Error
(
'
you should npm install `clipboard` --save at first
'
)
}
export
default
{
bind
(
el
,
binding
)
{
if
(
binding
.
arg
===
'
success
'
)
{
el
.
_v_clipboard_success
=
binding
.
value
}
else
if
(
binding
.
arg
===
'
error
'
)
{
el
.
_v_clipboard_error
=
binding
.
value
}
else
{
const
clipboard
=
new
Clipboard
(
el
,
{
text
()
{
return
binding
.
value
},
action
()
{
return
binding
.
arg
===
'
cut
'
?
'
cut
'
:
'
copy
'
}
})
clipboard
.
on
(
'
success
'
,
e
=>
{
const
callback
=
el
.
_v_clipboard_success
callback
&&
callback
(
e
)
// eslint-disable-line
})
clipboard
.
on
(
'
error
'
,
e
=>
{
const
callback
=
el
.
_v_clipboard_error
callback
&&
callback
(
e
)
// eslint-disable-line
})
el
.
_v_clipboard
=
clipboard
}
},
update
(
el
,
binding
)
{
if
(
binding
.
arg
===
'
success
'
)
{
el
.
_v_clipboard_success
=
binding
.
value
}
else
if
(
binding
.
arg
===
'
error
'
)
{
el
.
_v_clipboard_error
=
binding
.
value
}
else
{
el
.
_v_clipboard
.
text
=
function
()
{
return
binding
.
value
}
el
.
_v_clipboard
.
action
=
function
()
{
return
binding
.
arg
===
'
cut
'
?
'
cut
'
:
'
copy
'
}
}
},
unbind
(
el
,
binding
)
{
if
(
binding
.
arg
===
'
success
'
)
{
delete
el
.
_v_clipboard_success
}
else
if
(
binding
.
arg
===
'
error
'
)
{
delete
el
.
_v_clipboard_error
}
else
{
el
.
_v_clipboard
.
destroy
()
delete
el
.
_v_clipboard
}
}
}
litemall-admin/src/directive/clipboard/index.js
0 → 100644
View file @
6f0ebe3e
import
Clipboard
from
'
./clipboard
'
const
install
=
function
(
Vue
)
{
Vue
.
directive
(
'
Clipboard
'
,
Clipboard
)
}
if
(
window
.
Vue
)
{
window
.
clipboard
=
Clipboard
Vue
.
use
(
install
);
// eslint-disable-line
}
Clipboard
.
install
=
install
export
default
Clipboard
litemall-admin/src/directive/permission/index.js
0 → 100644
View file @
6f0ebe3e
import
permission
from
'
./permission
'
const
install
=
function
(
Vue
)
{
Vue
.
directive
(
'
permission
'
,
permission
)
}
if
(
window
.
Vue
)
{
window
[
'
permission
'
]
=
permission
Vue
.
use
(
install
);
// eslint-disable-line
}
permission
.
install
=
install
export
default
permission
litemall-admin/src/directive/permission/permission.js
0 → 100644
View file @
6f0ebe3e
import
store
from
'
@/store
'
export
default
{
inserted
(
el
,
binding
,
vnode
)
{
const
{
value
}
=
binding
const
roles
=
store
.
getters
&&
store
.
getters
.
roles
if
(
value
&&
value
instanceof
Array
&&
value
.
length
>
0
)
{
const
permissionRoles
=
value
const
hasPermission
=
roles
.
some
(
role
=>
{
return
permissionRoles
.
includes
(
role
)
})
if
(
!
hasPermission
)
{
el
.
parentNode
&&
el
.
parentNode
.
removeChild
(
el
)
}
}
else
{
throw
new
Error
(
`need roles! Like v-permission="['admin','editor']"`
)
}
}
}
Prev
1
2
3
4
5
6
…
8
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