Skip to content
Projects
Groups
Snippets
Help
Loading...
Sign in / Register
Toggle navigation
W
web-monitor
Project
Project
Details
Activity
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
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
Administrator
web-monitor
Commits
40a5977d
Commit
40a5977d
authored
Jun 26, 2017
by
Pan
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
🍊
parent
472cbb6d
Show whitespace changes
Inline
Side-by-side
Showing
22 changed files
with
53 additions
and
769 deletions
+53
-769
webpack.prod.conf.js
build/webpack.prod.conf.js
+5
-0
favicon.ico
favicon.ico
+0
-0
index.vue
src/components/Hamburger/index.vue
+1
-1
index.js
src/components/Icon-svg/index.js
+0
-11
index.vue
src/components/Icon-svg/index.vue
+2
-6
wscn-icon-stack.vue
src/components/Icon-svg/wscn-icon-stack.vue
+0
-52
main.js
src/main.js
+16
-15
getters.js
src/store/getters.js
+0
-4
btn.scss
src/styles/btn.scss
+0
-103
element-ui.scss
src/styles/element-ui.scss
+1
-55
index.scss
src/styles/index.scss
+14
-209
mixin.scss
src/styles/mixin.scss
+0
-33
createUniqueString.js
src/utils/createUniqueString.js
+0
-8
index.js
src/utils/index.js
+0
-144
openWindow.js
src/utils/openWindow.js
+0
-27
validate.js
src/utils/validate.js
+0
-6
AppMain.vue
src/views/layout/AppMain.vue
+1
-1
Layout.vue
src/views/layout/Layout.vue
+3
-3
Navbar.vue
src/views/layout/Navbar.vue
+0
-5
SidebarItem.vue
src/views/layout/SidebarItem.vue
+3
-3
TabsView.vue
src/views/layout/TabsView.vue
+0
-45
index.vue
src/views/login/index.vue
+7
-38
No files found.
build/webpack.prod.conf.js
View file @
40a5977d
...
@@ -11,6 +11,10 @@ var OptimizeCSSPlugin = require('optimize-css-assets-webpack-plugin')
...
@@ -11,6 +11,10 @@ var OptimizeCSSPlugin = require('optimize-css-assets-webpack-plugin')
var
env
=
config
.
build
.
env
var
env
=
config
.
build
.
env
function
resolveApp
(
relativePath
)
{
return
path
.
resolve
(
relativePath
);
}
var
webpackConfig
=
merge
(
baseWebpackConfig
,
{
var
webpackConfig
=
merge
(
baseWebpackConfig
,
{
module
:
{
module
:
{
rules
:
utils
.
styleLoaders
({
rules
:
utils
.
styleLoaders
({
...
@@ -53,6 +57,7 @@ var webpackConfig = merge(baseWebpackConfig, {
...
@@ -53,6 +57,7 @@ var webpackConfig = merge(baseWebpackConfig, {
filename
:
config
.
build
.
index
,
filename
:
config
.
build
.
index
,
template
:
'index.html'
,
template
:
'index.html'
,
inject
:
true
,
inject
:
true
,
favicon
:
resolveApp
(
'favicon.ico'
),
minify
:
{
minify
:
{
removeComments
:
true
,
removeComments
:
true
,
collapseWhitespace
:
true
,
collapseWhitespace
:
true
,
...
...
favicon.ico
0 → 100644
View file @
40a5977d
66.1 KB
src/components/Hamburger/index.vue
View file @
40a5977d
<
template
>
<
template
>
<div>
<div>
<svg
t=
"1492500959545"
@
click=
"toggleClick"
class=
"
wscn
-icon hamburger"
:class=
"
{'is-active':isActive}" style="" viewBox="0 0 1024 1024" 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">
<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><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><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"
></path></svg>
<svg
t=
"1492500959545"
@
click=
"toggleClick"
class=
"
svg
-icon hamburger"
:class=
"
{'is-active':isActive}" style="" viewBox="0 0 1024 1024" 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">
<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><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><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"
></path></svg>
</div>
</div>
</
template
>
</
template
>
...
...
src/components/Icon-svg/index.js
deleted
100644 → 0
View file @
472cbb6d
import
Vue
from
'vue'
function
registerAllComponents
(
requireContext
)
{
return
requireContext
.
keys
().
forEach
(
comp
=>
{
const
vueComp
=
requireContext
(
comp
)
const
compName
=
vueComp
.
name
?
vueComp
.
name
.
toLowerCase
()
:
/
\/([\w
-
]
+
)\.
vue$/
.
exec
(
comp
)[
1
]
Vue
.
component
(
compName
,
vueComp
)
})
}
registerAllComponents
(
require
.
context
(
'./'
,
false
,
/
\.
vue$/
))
src/components/Icon-svg/
wscn-icon-svg
.vue
→
src/components/Icon-svg/
index
.vue
View file @
40a5977d
<
template
>
<
template
>
<svg
class=
"
wscn
-icon"
aria-hidden=
"true"
>
<svg
class=
"
svg
-icon"
aria-hidden=
"true"
>
<use
:xlink:href=
"iconName"
></use>
<use
:xlink:href=
"iconName"
></use>
</svg>
</svg>
</
template
>
</
template
>
<
script
>
<
script
>
export
default
{
export
default
{
name
:
'
wscn-
icon-svg'
,
name
:
'icon-svg'
,
props
:
{
props
:
{
iconClass
:
{
iconClass
:
{
type
:
String
,
type
:
String
,
...
@@ -20,7 +20,3 @@
...
@@ -20,7 +20,3 @@
}
}
}
}
</
script
>
</
script
>
<
style
lang=
"scss"
scoped
>
</
style
>
src/components/Icon-svg/wscn-icon-stack.vue
deleted
100644 → 0
View file @
472cbb6d
<
template
>
<div
class=
"icon-container"
:style=
"containerStyle"
>
<slot
class=
"icon"
></slot>
</div>
</
template
>
<
script
>
export
default
{
name
:
'wscn-icon-stack'
,
props
:
{
width
:
{
type
:
Number
,
default
:
20
},
shape
:
{
type
:
String
,
default
:
'circle'
,
validator
:
val
=>
{
const
validShapes
=
[
'circle'
,
'square'
]
return
validShapes
.
indexOf
(
val
)
>
-
1
}
}
},
computed
:
{
containerStyle
()
{
return
{
width
:
`
${
this
.
width
}
px`
,
height
:
`
${
this
.
width
}
px`
,
fontSize
:
`
${
this
.
width
*
0.6
}
px`
,
borderRadius
:
`
${
this
.
shape
===
'circle'
&&
'50%'
}
`
}
}
}
}
</
script
>
<
style
lang=
"scss"
scoped
>
.icon-container
{
display
:
inline-block
;
position
:
relative
;
overflow
:
hidden
;
background
:
#1482F0
;
.icon
{
position
:
absolute
;
color
:
#ffffff
;
top
:
50%
;
left
:
50%
;
transform
:
translate
(
-50%
,
-50%
);
}
}
</
style
>
src/main.js
View file @
40a5977d
...
@@ -4,31 +4,32 @@ import Vue from 'vue'
...
@@ -4,31 +4,32 @@ import Vue from 'vue'
import
App
from
'./App'
import
App
from
'./App'
import
router
from
'./router'
import
router
from
'./router'
import
store
from
'./store'
import
store
from
'./store'
import
ElementUI
from
'element-ui'
;
import
ElementUI
from
'element-ui'
import
'element-ui/lib/theme-default/index.css'
import
'element-ui/lib/theme-default/index.css'
import
NProgress
from
'nprogress'
import
NProgress
from
'nprogress'
import
'normalize.css/normalize.css'
;
// normalize.css 样式格式化
import
'normalize.css/normalize.css'
import
'@/styles/index.scss'
;
// 全局自定义的css样式
import
'@/styles/index.scss'
// 全局自定义的css样式
import
'@/components/Icon-svg/index'
;
// 封装的svg组件
import
'@/assets/iconfont/iconfont'
import
IconSvg
from
'@/components/Icon-svg/index.vue'
Vue
.
config
.
productionTip
=
false
Vue
.
config
.
productionTip
=
false
Vue
.
use
(
ElementUI
);
Vue
.
use
(
ElementUI
);
Vue
.
component
(
'icon-svg'
,
IconSvg
)
const
whiteList
=
[
'/login'
];
const
whiteList
=
[
'/login'
];
// 不重定向白名单
router
.
beforeEach
((
to
,
from
,
next
)
=>
{
router
.
beforeEach
((
to
,
from
,
next
)
=>
{
NProgress
.
start
();
// 开启Progress
NProgress
.
start
();
if
(
store
.
getters
.
token
)
{
// 判断是否有token
if
(
store
.
getters
.
token
)
{
if
(
to
.
path
===
'/login'
)
{
if
(
to
.
path
===
'/login'
)
{
next
({
path
:
'/'
});
next
({
path
:
'/'
});
}
else
{
}
else
{
if
(
store
.
getters
.
roles
.
length
===
0
)
{
// 判断当前用户是否已拉取完user_info信息
if
(
store
.
getters
.
roles
.
length
===
0
)
{
store
.
dispatch
(
'GetInfo'
).
then
(
res
=>
{
// 拉取user_info
store
.
dispatch
(
'GetInfo'
).
then
(
res
=>
{
const
roles
=
res
.
data
.
role
;
const
roles
=
res
.
data
.
role
;
store
.
dispatch
(
'GenerateRoutes'
,
{
roles
}).
then
(()
=>
{
// 生成可访问的路由表
store
.
dispatch
(
'GenerateRoutes'
,
{
roles
}).
then
(()
=>
{
router
.
addRoutes
(
store
.
getters
.
addRouters
)
// 动态添加可访问路由表
router
.
addRoutes
(
store
.
getters
.
addRouters
)
next
(
to
.
path
);
// hack方法 确保addRoutes已完成
next
(
to
.
path
);
})
})
}).
catch
(
err
=>
{
}).
catch
(
err
=>
{
console
.
log
(
err
);
console
.
log
(
err
);
...
@@ -38,10 +39,10 @@ router.beforeEach((to, from, next) => {
...
@@ -38,10 +39,10 @@ router.beforeEach((to, from, next) => {
}
}
}
}
}
else
{
}
else
{
if
(
whiteList
.
indexOf
(
to
.
path
)
!==
-
1
)
{
// 在免登录白名单,直接进入
if
(
whiteList
.
indexOf
(
to
.
path
)
!==
-
1
)
{
next
()
next
()
}
else
{
}
else
{
next
(
'/login'
);
// 否则全部重定向到登录页
next
(
'/login'
);
NProgress
.
done
();
NProgress
.
done
();
}
}
}
}
...
...
src/store/getters.js
View file @
40a5977d
const
getters
=
{
const
getters
=
{
sidebar
:
state
=>
state
.
app
.
sidebar
,
sidebar
:
state
=>
state
.
app
.
sidebar
,
visitedViews
:
state
=>
state
.
app
.
visitedViews
,
token
:
state
=>
state
.
user
.
token
,
token
:
state
=>
state
.
user
.
token
,
avatar
:
state
=>
state
.
user
.
avatar
,
avatar
:
state
=>
state
.
user
.
avatar
,
name
:
state
=>
state
.
user
.
name
,
name
:
state
=>
state
.
user
.
name
,
uid
:
state
=>
state
.
user
.
uid
,
email
:
state
=>
state
.
user
.
email
,
introduction
:
state
=>
state
.
user
.
introduction
,
roles
:
state
=>
state
.
user
.
roles
,
roles
:
state
=>
state
.
user
.
roles
,
permission_routers
:
state
=>
state
.
permission
.
routers
,
permission_routers
:
state
=>
state
.
permission
.
routers
,
addRouters
:
state
=>
state
.
permission
.
addRouters
addRouters
:
state
=>
state
.
permission
.
addRouters
...
...
src/styles/btn.scss
deleted
100644 → 0
View file @
472cbb6d
$blue
:
#324157
;
$light-blue
:
#3A71A8
;
$red
:
#C03639
;
$pink
:
#E65D6E
;
$green
:
#30B08F
;
$tiffany
:
#4AB7BD
;
$yellow
:
#FEC171
;
$panGreen
:
#30B08F
;
@mixin
colorBtn
(
$color
)
{
background
:
$color
;
&
:hover
{
color
:
$color
;
&
:before
,
&
:after
{
background
:
$color
;
}
}
}
.blue-btn
{
@include
colorBtn
(
$blue
)
}
.light-blue-btn
{
@include
colorBtn
(
$light-blue
)
}
.red-btn
{
@include
colorBtn
(
$red
)
}
.pink-btn
{
@include
colorBtn
(
$pink
)
}
.green-btn
{
@include
colorBtn
(
$green
)
}
.tiffany-btn
{
@include
colorBtn
(
$tiffany
)
}
.yellow-btn
{
@include
colorBtn
(
$yellow
)
}
.pan-btn
{
font-size
:
14px
;
color
:
#fff
;
padding
:
14px
36px
;
border-radius
:
8px
;
border
:
none
;
outline
:
none
;
margin-right
:
25px
;
transition
:
600ms
ease
all
;
position
:
relative
;
display
:
inline-block
;
&
:hover
{
background
:
#fff
;
&
:before
,
&
:after
{
width
:
100%
;
transition
:
600ms
ease
all
;
}
}
&
:before
,
&
:after
{
content
:
''
;
position
:
absolute
;
top
:
0
;
right
:
0
;
height
:
2px
;
width
:
0
;
transition
:
400ms
ease
all
;
}
&
:
:
after
{
right
:
inherit
;
top
:
inherit
;
left
:
0
;
bottom
:
0
;
}
}
.custom-button
{
display
:
inline-block
;
line-height
:
1
;
white-space
:
nowrap
;
cursor
:
pointer
;
background
:
#fff
;
color
:
#fff
;
-webkit-appearance
:
none
;
text-align
:
center
;
box-sizing
:
border-box
;
outline
:
0
;
margin
:
0
;
padding
:
10px
15px
;
font-size
:
14px
;
border-radius
:
4px
;
}
src/styles/element-ui.scss
View file @
40a5977d
//覆盖一些element-ui样式
//覆盖一些element-ui样式 覆盖css样式可在这里添加
.block-checkbox
{
display
:
block
;
}
.operation-container
{
.cell
{
padding
:
10px
!
important
;
}
.el-button
{
&
:nth-child
(
3
)
{
margin-top
:
10px
;
margin-left
:
0px
;
}
&
:nth-child
(
4
)
{
margin-top
:
10px
;
}
}
}
.el-upload
{
.el-upload
{
input
[
type
=
"file"
]
{
input
[
type
=
"file"
]
{
display
:
none
!
important
;
display
:
none
!
important
;
...
@@ -28,29 +9,6 @@
...
@@ -28,29 +9,6 @@
display
:
none
;
display
:
none
;
}
}
.cell
{
.el-tag
{
margin-right
:
8px
;
}
}
.small-padding
{
.cell
{
padding-left
:
8px
;
padding-right
:
8px
;
}
}
.status-col
{
.cell
{
padding
:
0
10px
;
text-align
:
center
;
.el-tag
{
margin-right
:
0px
;
}
}
}
//暂时性解决diolag 问题 https://github.com/ElemeFE/element/issues/2461
//暂时性解决diolag 问题 https://github.com/ElemeFE/element/issues/2461
.el-dialog
{
.el-dialog
{
transform
:
none
;
transform
:
none
;
...
@@ -59,18 +17,6 @@
...
@@ -59,18 +17,6 @@
margin
:
0
auto
;
margin
:
0
auto
;
}
}
//文章页textarea修改样式
.article-textarea
{
textarea
{
padding-right
:
40px
;
resize
:
none
;
border
:
none
;
border-radius
:
0px
;
border-bottom
:
1px
solid
#bfcbd9
;
}
}
//element ui upload
//element ui upload
.upload-container
{
.upload-container
{
.el-upload
{
.el-upload
{
...
...
src/styles/index.scss
View file @
40a5977d
@import
'./btn.scss'
;
@import
'./element-ui.scss'
;
@import
'./element-ui.scss'
;
@import
"./mixin.scss"
;
@import
"./mixin.scss"
;
body
{
body
{
...
@@ -8,10 +7,6 @@ body {
...
@@ -8,10 +7,6 @@ body {
font-family
:
Helvetica
Neue
,
Helvetica
,
PingFang
SC
,
Hiragino
Sans
GB
,
Microsoft
YaHei
,
Arial
,
sans-serif
;
font-family
:
Helvetica
Neue
,
Helvetica
,
PingFang
SC
,
Hiragino
Sans
GB
,
Microsoft
YaHei
,
Arial
,
sans-serif
;
}
}
label
{
font-weight
:
700
;
}
html
{
html
{
box-sizing
:
border-box
;
box-sizing
:
border-box
;
}
}
...
@@ -22,14 +17,6 @@ html {
...
@@ -22,14 +17,6 @@ html {
box-sizing
:
inherit
;
box-sizing
:
inherit
;
}
}
.no-padding
{
padding
:
0px
!
important
;
}
.padding-content
{
padding
:
4px
0
;
}
a
:focus
,
a
:focus
,
a
:active
{
a
:active
{
outline
:
none
;
outline
:
none
;
...
@@ -43,49 +30,18 @@ a:hover {
...
@@ -43,49 +30,18 @@ a:hover {
text-decoration
:
none
;
text-decoration
:
none
;
}
}
.fr
{
.clearfix
{
float
:
right
;
&
:after
{
}
visibility
:
hidden
;
.fl
{
float
:
left
;
}
.pr-5
{
padding-right
:
5px
;
}
.pl-5
{
padding-left
:
5px
;
}
.block
{
display
:
block
;
}
.pointer
{
cursor
:
pointer
;
}
.inlineBlock
{
display
:
block
;
}
code
{
background
:
#eef1f6
;
padding
:
15px
10px
;
margin-bottom
:
20px
;
display
:
block
;
display
:
block
;
line-height
:
36px
;
font-size
:
0
;
a
{
content
:
" "
;
color
:
#337ab7
;
clear
:
both
;
cursor
:
pointer
;
height
:
0
;
&
:hover
{
color
:
rgb
(
32
,
160
,
255
);
}
}
}
}
}
//vue router transition css
.fade-enter-active
,
.fade-enter-active
,
.fade-leave-active
{
.fade-leave-active
{
transition
:
all
.2s
ease
transition
:
all
.2s
ease
...
@@ -97,23 +53,15 @@ code {
...
@@ -97,23 +53,15 @@ code {
}
}
//main-container全局样式
//main-container全局样式
.app-container
{
.app-main
{
padding
:
20px
;
min-height
:
100%
}
.components-container
{
margin
:
30px
50px
;
position
:
relative
;
}
.pagination-container
{
margin-top
:
30px
;
}
}
.app-container
{
.editor-container
.CodeMirror
{
padding
:
20px
;
height
:
100%
!
important
;
}
}
.
wscn
-icon
{
.
svg
-icon
{
width
:
1em
;
width
:
1em
;
height
:
1em
;
height
:
1em
;
vertical-align
:
-0
.15em
;
vertical-align
:
-0
.15em
;
...
@@ -121,146 +69,3 @@ code {
...
@@ -121,146 +69,3 @@ code {
overflow
:
hidden
;
overflow
:
hidden
;
}
}
.sub-navbar
{
height
:
50px
;
line-height
:
50px
;
position
:
relative
;
width
:
100%
;
text-align
:
right
;
padding-right
:
20px
;
transition
:
600ms
ease
position
;
background
:
linear-gradient
(
90deg
,
rgba
(
32
,
182
,
249
,
1
)
0%
,
rgba
(
32
,
182
,
249
,
1
)
0%
,
rgba
(
33
,
120
,
241
,
1
)
100%
,
rgba
(
33
,
120
,
241
,
1
)
100%
);
.subtitle
{
font-size
:
20px
;
color
:
#fff
;
}
&
.draft
{
background
:
#d0d0d0
;
}
&
.deleted
{
background
:
#d0d0d0
;
}
}
.link-type
,
.link-type
:focus
{
color
:
#337ab7
;
cursor
:
pointer
;
&
:hover
{
color
:
rgb
(
32
,
160
,
255
);
}
}
.publishedTag
,
.draftTag
,
.deletedTag
{
color
:
#fff
;
background-color
:
$panGreen
;
line-height
:
1
;
text-align
:
center
;
margin
:
0
;
padding
:
8px
12px
;
font-size
:
14px
;
border-radius
:
4px
;
position
:
absolute
;
left
:
20px
;
top
:
10px
;
}
.draftTag
{
background-color
:
$yellow
;
}
.deletedTag
{
background-color
:
$red
;
}
.input-label
{
font-size
:
14px
;
color
:
#48576a
;
line-height
:
1
;
padding
:
11px
5px
11px
0
;
}
.clearfix
{
&
:after
{
visibility
:
hidden
;
display
:
block
;
font-size
:
0
;
content
:
" "
;
clear
:
both
;
height
:
0
;
}
}
.no-marginLeft
{
.el-checkbox
{
margin
:
0
20px
15px
0
;
}
.el-checkbox
+
.el-checkbox
{
margin-left
:
0px
;
}
}
.filter-container
{
padding-bottom
:
10px
;
.filter-item
{
display
:
inline-block
;
vertical-align
:
middle
;
margin-bottom
:
10px
;
}
}
//refine vue-multiselect plugin
.multiselect
{
line-height
:
16px
;
}
.multiselect--active
{
z-index
:
1000
!
important
;
}
//refine simplemde
.simplemde-container
{
.editor-toolbar.fullscreen
,
.CodeMirror-fullscreen
{
z-index
:
1003
;
}
}
//暂时性解决diolag 问题 https://github.com/ElemeFE/element/issues/2461
.el-dialog
{
transform
:
none
;
left
:
0
;
position
:
relative
;
margin
:
0
auto
;
}
//github-corner
.github-corner
:hover
.octo-arm
{
animation
:
octocat-wave
560ms
ease-in-out
}
@keyframes
octocat-wave
{
0
%
,
100
%
{
transform
:
rotate
(
0
)
}
20
%
,
60
%
{
transform
:
rotate
(
-25deg
)
}
40
%
,
80
%
{
transform
:
rotate
(
10deg
)
}
}
@media
(
max-width
:
500px
)
{
.github-corner
:hover
.octo-arm
{
animation
:
none
}
.github-corner
.octo-arm
{
animation
:
octocat-wave
560ms
ease-in-out
}
}
src/styles/mixin.scss
View file @
40a5977d
...
@@ -25,36 +25,3 @@
...
@@ -25,36 +25,3 @@
height
:
100%
;
height
:
100%
;
}
}
@mixin
pct
(
$pct
)
{
width
:
#{
$pct
}
;
position
:
relative
;
margin
:
0
auto
;
}
@mixin
triangle
(
$width
,
$height
,
$color
,
$direction
)
{
$width
:
$width
/
2
;
$color-border-style
:
$height
solid
$color
;
$transparent-border-style
:
$width
solid
transparent
;
height
:
0
;
width
:
0
;
@if
$direction
==
up
{
border-bottom
:
$color-border-style
;
border-left
:
$transparent-border-style
;
border-right
:
$transparent-border-style
;
}
@else
if
$direction
==
right
{
border-left
:
$color-border-style
;
border-top
:
$transparent-border-style
;
border-bottom
:
$transparent-border-style
;
}
@else
if
$direction
==
down
{
border-top
:
$color-border-style
;
border-left
:
$transparent-border-style
;
border-right
:
$transparent-border-style
;
}
@else
if
$direction
==
left
{
border-right
:
$color-border-style
;
border-top
:
$transparent-border-style
;
border-bottom
:
$transparent-border-style
;
}
}
src/utils/createUniqueString.js
deleted
100644 → 0
View file @
472cbb6d
/**
* Created by jiachenpan on 17/3/8.
*/
export
default
function
createUniqueString
()
{
const
timestamp
=
+
new
Date
()
+
''
;
const
randomNum
=
parseInt
((
1
+
Math
.
random
())
*
65536
)
+
''
;
return
(
+
(
randomNum
+
timestamp
)).
toString
(
32
);
}
src/utils/index.js
View file @
40a5977d
...
@@ -57,92 +57,6 @@
...
@@ -57,92 +57,6 @@
}
}
}
}
// 格式化时间
export
function
getQueryObject
(
url
)
{
url
=
url
==
null
?
window
.
location
.
href
:
url
;
const
search
=
url
.
substring
(
url
.
lastIndexOf
(
'?'
)
+
1
);
const
obj
=
{};
const
reg
=
/
([^
?&=
]
+
)
=
([^
?&=
]
*
)
/g
;
search
.
replace
(
reg
,
(
rs
,
$1
,
$2
)
=>
{
const
name
=
decodeURIComponent
(
$1
);
let
val
=
decodeURIComponent
(
$2
);
val
=
String
(
val
);
obj
[
name
]
=
val
;
return
rs
;
});
return
obj
;
}
/**
*get getByteLen
* @param {Sting} val input value
* @returns {number} output value
*/
export
function
getByteLen
(
val
)
{
let
len
=
0
;
for
(
let
i
=
0
;
i
<
val
.
length
;
i
++
)
{
if
(
val
[
i
].
match
(
/
[^\x
00-
\x
ff
]
/ig
)
!=
null
)
{
len
+=
1
;
}
else
{
len
+=
0.5
;
}
}
return
Math
.
floor
(
len
);
}
export
function
cleanArray
(
actual
)
{
const
newArray
=
[];
for
(
let
i
=
0
;
i
<
actual
.
length
;
i
++
)
{
if
(
actual
[
i
])
{
newArray
.
push
(
actual
[
i
]);
}
}
return
newArray
;
}
export
function
param
(
json
)
{
if
(
!
json
)
return
''
;
return
cleanArray
(
Object
.
keys
(
json
).
map
(
key
=>
{
if
(
json
[
key
]
===
undefined
)
return
''
;
return
encodeURIComponent
(
key
)
+
'='
+
encodeURIComponent
(
json
[
key
]);
})).
join
(
'&'
);
}
export
function
param2Obj
(
url
)
{
const
search
=
url
.
split
(
'?'
)[
1
];
return
JSON
.
parse
(
'{"'
+
decodeURIComponent
(
search
).
replace
(
/"/g
,
'
\\
"'
).
replace
(
/&/g
,
'","'
).
replace
(
/=/g
,
'":"'
)
+
'"}'
)
}
export
function
html2Text
(
val
)
{
const
div
=
document
.
createElement
(
'div'
);
div
.
innerHTML
=
val
;
return
div
.
textContent
||
div
.
innerText
;
}
export
function
objectMerge
(
target
,
source
)
{
/* Merges two objects,
giving the last one precedence */
if
(
typeof
target
!==
'object'
)
{
target
=
{};
}
if
(
Array
.
isArray
(
source
))
{
return
source
.
slice
();
}
for
(
const
property
in
source
)
{
if
(
source
.
hasOwnProperty
(
property
))
{
const
sourceProperty
=
source
[
property
];
if
(
typeof
sourceProperty
===
'object'
)
{
target
[
property
]
=
objectMerge
(
target
[
property
],
sourceProperty
);
continue
;
}
target
[
property
]
=
sourceProperty
;
}
}
return
target
;
}
export
function
scrollTo
(
element
,
to
,
duration
)
{
export
function
scrollTo
(
element
,
to
,
duration
)
{
if
(
duration
<=
0
)
return
;
if
(
duration
<=
0
)
return
;
const
difference
=
to
-
element
.
scrollTop
;
const
difference
=
to
-
element
.
scrollTop
;
...
@@ -154,61 +68,3 @@
...
@@ -154,61 +68,3 @@
scrollTo
(
element
,
to
,
duration
-
10
);
scrollTo
(
element
,
to
,
duration
-
10
);
},
10
);
},
10
);
}
}
export
function
toggleClass
(
element
,
className
)
{
if
(
!
element
||
!
className
)
{
return
;
}
let
classString
=
element
.
className
;
const
nameIndex
=
classString
.
indexOf
(
className
);
if
(
nameIndex
===
-
1
)
{
classString
+=
''
+
className
;
}
else
{
classString
=
classString
.
substr
(
0
,
nameIndex
)
+
classString
.
substr
(
nameIndex
+
className
.
length
);
}
element
.
className
=
classString
;
}
export
const
pickerOptions
=
[
{
text
:
'今天'
,
onClick
(
picker
)
{
const
end
=
new
Date
();
const
start
=
new
Date
(
new
Date
().
toDateString
());
end
.
setTime
(
start
.
getTime
());
picker
.
$emit
(
'pick'
,
[
start
,
end
]);
}
},
{
text
:
'最近一周'
,
onClick
(
picker
)
{
const
end
=
new
Date
(
new
Date
().
toDateString
());
const
start
=
new
Date
();
start
.
setTime
(
end
.
getTime
()
-
3600
*
1000
*
24
*
7
);
picker
.
$emit
(
'pick'
,
[
start
,
end
]);
}
},
{
text
:
'最近一个月'
,
onClick
(
picker
)
{
const
end
=
new
Date
(
new
Date
().
toDateString
());
const
start
=
new
Date
();
start
.
setTime
(
start
.
getTime
()
-
3600
*
1000
*
24
*
30
);
picker
.
$emit
(
'pick'
,
[
start
,
end
]);
}
},
{
text
:
'最近三个月'
,
onClick
(
picker
)
{
const
end
=
new
Date
(
new
Date
().
toDateString
());
const
start
=
new
Date
();
start
.
setTime
(
start
.
getTime
()
-
3600
*
1000
*
24
*
90
);
picker
.
$emit
(
'pick'
,
[
start
,
end
]);
}
}]
export
function
getTime
(
type
)
{
if
(
type
===
'start'
)
{
return
new
Date
().
getTime
()
-
3600
*
1000
*
24
*
90
}
else
{
return
new
Date
(
new
Date
().
toDateString
())
}
}
src/utils/openWindow.js
deleted
100644 → 0
View file @
472cbb6d
/**
*Created by jiachenpan on 16/11/29.
* @param {Sting} url
* @param {Sting} title
* @param {Number} w
* @param {Number} h
*/
export
default
function
openWindow
(
url
,
title
,
w
,
h
)
{
// Fixes dual-screen position Most browsers Firefox
const
dualScreenLeft
=
window
.
screenLeft
!==
undefined
?
window
.
screenLeft
:
screen
.
left
;
const
dualScreenTop
=
window
.
screenTop
!==
undefined
?
window
.
screenTop
:
screen
.
top
;
const
width
=
window
.
innerWidth
?
window
.
innerWidth
:
document
.
documentElement
.
clientWidth
?
document
.
documentElement
.
clientWidth
:
screen
.
width
;
const
height
=
window
.
innerHeight
?
window
.
innerHeight
:
document
.
documentElement
.
clientHeight
?
document
.
documentElement
.
clientHeight
:
screen
.
height
;
const
left
=
((
width
/
2
)
-
(
w
/
2
))
+
dualScreenLeft
;
const
top
=
((
height
/
2
)
-
(
h
/
2
))
+
dualScreenTop
;
const
newWindow
=
window
.
open
(
url
,
title
,
'toolbar=no, location=no, directories=no, status=no, menubar=no, scrollbars=no, resizable=yes, copyhistory=no, width='
+
w
+
', height='
+
h
+
', top='
+
top
+
', left='
+
left
);
// Puts focus on the newWindow
if
(
window
.
focus
)
{
newWindow
.
focus
();
}
}
src/utils/validate.js
View file @
40a5977d
...
@@ -20,12 +20,6 @@ export function validateLowerCase(str) {
...
@@ -20,12 +20,6 @@ export function validateLowerCase(str) {
return
reg
.
test
(
str
);
return
reg
.
test
(
str
);
}
}
/* 验证key*/
// export function validateKey(str) {
// var reg = /^[a-z_\-:]+$/;
// return reg.test(str);
// }
/* 大写字母*/
/* 大写字母*/
export
function
validateUpperCase
(
str
)
{
export
function
validateUpperCase
(
str
)
{
const
reg
=
/^
[
A-Z
]
+$/
;
const
reg
=
/^
[
A-Z
]
+$/
;
...
...
src/views/layout/AppMain.vue
View file @
40a5977d
<
template
>
<
template
>
<section
class=
"app-main"
style=
"min-height: 100%"
>
<section
class=
"app-main"
>
<transition
name=
"fade"
mode=
"out-in"
>
<transition
name=
"fade"
mode=
"out-in"
>
<router-view
:key=
"key"
></router-view>
<router-view
:key=
"key"
></router-view>
</transition>
</transition>
...
...
src/views/layout/Layout.vue
View file @
40a5977d
<
template
>
<
template
>
<div
class=
"app-wrapper"
:class=
"
{hideSidebar:!sidebar.opened}">
<div
class=
"app-wrapper"
:class=
"
{hideSidebar:!sidebar.opened}">
<div
class=
"sidebar-wrapper"
>
<div
class=
"sidebar-wrapper"
>
<
Sidebar
class=
"sidebar-container"
/
>
<
sidebar
class=
"sidebar-container"
></sidebar
>
</div>
</div>
<div
class=
"main-container"
>
<div
class=
"main-container"
>
<
Navbar/
>
<
navbar></navbar
>
<
App-main/
>
<
app-main></app-main
>
</div>
</div>
</div>
</div>
</
template
>
</
template
>
...
...
src/views/layout/Navbar.vue
View file @
40a5977d
...
@@ -13,11 +13,6 @@
...
@@ -13,11 +13,6 @@
首页
首页
</el-dropdown-item>
</el-dropdown-item>
</router-link>
</router-link>
<router-link
class=
'inlineBlock'
to=
"/admin/profile"
>
<el-dropdown-item>
设置
</el-dropdown-item>
</router-link>
<el-dropdown-item
divided
><span
@
click=
"logout"
style=
"display:block;"
>
退出登录
</span></el-dropdown-item>
<el-dropdown-item
divided
><span
@
click=
"logout"
style=
"display:block;"
>
退出登录
</span></el-dropdown-item>
</el-dropdown-menu>
</el-dropdown-menu>
</el-dropdown>
</el-dropdown>
...
...
src/views/layout/SidebarItem.vue
View file @
40a5977d
...
@@ -3,12 +3,12 @@
...
@@ -3,12 +3,12 @@
<template
v-for=
"item in routes"
>
<template
v-for=
"item in routes"
>
<router-link
v-if=
"!item.hidden&&item.noDropdown&&item.children.length>0"
:to=
"item.path+'/'+item.children[0].path"
>
<router-link
v-if=
"!item.hidden&&item.noDropdown&&item.children.length>0"
:to=
"item.path+'/'+item.children[0].path"
>
<el-menu-item
:index=
"item.path+'/'+item.children[0].path"
>
<el-menu-item
:index=
"item.path+'/'+item.children[0].path"
>
<
wscn-
icon-svg
v-if=
'item.icon'
:icon-class=
"item.icon"
/>
{{
item
.
children
[
0
].
name
}}
<icon-svg
v-if=
'item.icon'
:icon-class=
"item.icon"
/>
{{
item
.
children
[
0
].
name
}}
</el-menu-item>
</el-menu-item>
</router-link>
</router-link>
<el-submenu
:index=
"item.name"
v-if=
"!item.noDropdown&&!item.hidden"
>
<el-submenu
:index=
"item.name"
v-if=
"!item.noDropdown&&!item.hidden"
>
<template
slot=
"title"
>
<template
slot=
"title"
>
<
wscn-
icon-svg
v-if=
'item.icon'
:icon-class=
"item.icon"
/>
{{
item
.
name
}}
<icon-svg
v-if=
'item.icon'
:icon-class=
"item.icon"
/>
{{
item
.
name
}}
</
template
>
</
template
>
<
template
v-for=
"child in item.children"
v-if=
'!child.hidden'
>
<
template
v-for=
"child in item.children"
v-if=
'!child.hidden'
>
<sidebar-item
class=
'menu-indent'
v-if=
'child.children&&child.children.length>0'
:routes=
'[child]'
>
</sidebar-item>
<sidebar-item
class=
'menu-indent'
v-if=
'child.children&&child.children.length>0'
:routes=
'[child]'
>
</sidebar-item>
...
@@ -36,7 +36,7 @@
...
@@ -36,7 +36,7 @@
</
script
>
</
script
>
<
style
rel=
"stylesheet/scss"
lang=
"scss"
scoped
>
<
style
rel=
"stylesheet/scss"
lang=
"scss"
scoped
>
.
wscn
-icon
{
.
svg
-icon
{
margin-right
:
10px
;
margin-right
:
10px
;
}
}
.hideSidebar
.menu-indent
{
.hideSidebar
.menu-indent
{
...
...
src/views/layout/TabsView.vue
deleted
100644 → 0
View file @
472cbb6d
<
template
>
<div
class=
'tabs-view-container'
>
<router-link
class=
"tabs-view"
v-for=
"tag in Array.from(visitedViews)"
:to=
"tag.path"
:key=
"tag.path"
>
<el-tag
:closable=
"true"
@
close=
'closeViewTabs(tag,$event)'
>
{{
tag
.
name
}}
</el-tag>
</router-link>
</div>
</
template
>
<
script
>
export
default
{
computed
:
{
visitedViews
()
{
return
this
.
$store
.
state
.
app
.
visitedViews
.
slice
(
-
6
)
}
},
methods
:
{
closeViewTabs
(
view
,
$event
)
{
this
.
$store
.
dispatch
(
'delVisitedViews'
,
view
)
$event
.
preventDefault
()
},
addViewTabs
()
{
this
.
$store
.
dispatch
(
'addVisitedViews'
,
this
.
$route
.
matched
[
this
.
$route
.
matched
.
length
-
1
])
}
},
watch
:
{
$route
()
{
this
.
addViewTabs
()
}
}
}
</
script
>
<
style
rel=
"stylesheet/scss"
lang=
"scss"
scoped
>
.tabs-view-container
{
display
:
inline-block
;
vertical-align
:
top
;
margin-left
:
10px
;
.tabs-view
{
margin-left
:
10px
;
}
}
</
style
>
src/views/login/index.vue
View file @
40a5977d
...
@@ -5,12 +5,16 @@
...
@@ -5,12 +5,16 @@
class=
"card-box login-form"
>
class=
"card-box login-form"
>
<h3
class=
"title"
>
系统登录
</h3>
<h3
class=
"title"
>
系统登录
</h3>
<el-form-item
prop=
"email"
>
<el-form-item
prop=
"email"
>
<span
class=
"svg-container"
><wscn-icon-svg
icon-class=
"jiedianyoujian"
/></span>
<span
class=
"svg-container"
>
<icon-svg
icon-class=
"jiedianyoujian"
></icon-svg>
</span>
<el-input
name=
"email"
type=
"text"
v-model=
"loginForm.email"
autoComplete=
"on"
<el-input
name=
"email"
type=
"text"
v-model=
"loginForm.email"
autoComplete=
"on"
placeholder=
"邮箱"
></el-input>
placeholder=
"邮箱"
></el-input>
</el-form-item>
</el-form-item>
<el-form-item
prop=
"password"
>
<el-form-item
prop=
"password"
>
<span
class=
"svg-container"
><wscn-icon-svg
icon-class=
"mima"
/></span>
<span
class=
"svg-container"
>
<icon-svg
icon-class=
"mima"
></icon-svg>
</span>
<el-input
name=
"password"
type=
"password"
@
keyup
.
enter
.
native=
"handleLogin"
v-model=
"loginForm.password"
<el-input
name=
"password"
type=
"password"
@
keyup
.
enter
.
native=
"handleLogin"
v-model=
"loginForm.password"
autoComplete=
"on"
placeholder=
"密码"
></el-input>
autoComplete=
"on"
placeholder=
"密码"
></el-input>
</el-form-item>
</el-form-item>
...
@@ -21,15 +25,11 @@
...
@@ -21,15 +25,11 @@
</el-form-item>
</el-form-item>
<div
class=
'tips'
>
admin账号为:admin@wallstreetcn.com 密码随便填
</div>
<div
class=
'tips'
>
admin账号为:admin@wallstreetcn.com 密码随便填
</div>
<div
class=
'tips'
>
editor账号:editor@wallstreetcn.com 密码随便填
</div>
<div
class=
'tips'
>
editor账号:editor@wallstreetcn.com 密码随便填
</div>
<router-link
to=
"/sendpwd"
class=
"forget-pwd"
>
忘记密码?(或首次登录)
</router-link>
</el-form>
</el-form>
</div>
</div>
</
template
>
</
template
>
<
script
>
<
script
>
import
{
mapGetters
}
from
'vuex'
;
import
{
isWscnEmail
}
from
'@/utils/validate'
;
import
{
isWscnEmail
}
from
'@/utils/validate'
;
export
default
{
export
default
{
...
@@ -62,15 +62,9 @@
...
@@ -62,15 +62,9 @@
{
required
:
true
,
trigger
:
'blur'
,
validator
:
validatePass
}
{
required
:
true
,
trigger
:
'blur'
,
validator
:
validatePass
}
]
]
},
},
loading
:
false
,
loading
:
false
showDialog
:
false
}
}
},
},
computed
:
{
...
mapGetters
([
'auth_type'
])
},
methods
:
{
methods
:
{
handleLogin
()
{
handleLogin
()
{
this
.
$refs
.
loginForm
.
validate
(
valid
=>
{
this
.
$refs
.
loginForm
.
validate
(
valid
=>
{
...
@@ -79,7 +73,6 @@
...
@@ -79,7 +73,6 @@
this
.
$store
.
dispatch
(
'Login'
,
this
.
loginForm
).
then
(()
=>
{
this
.
$store
.
dispatch
(
'Login'
,
this
.
loginForm
).
then
(()
=>
{
this
.
loading
=
false
;
this
.
loading
=
false
;
this
.
$router
.
push
({
path
:
'/'
});
this
.
$router
.
push
({
path
:
'/'
});
// this.showDialog = true;
}).
catch
(()
=>
{
}).
catch
(()
=>
{
this
.
loading
=
false
;
this
.
loading
=
false
;
});
});
...
@@ -88,31 +81,7 @@
...
@@ -88,31 +81,7 @@
return
false
;
return
false
;
}
}
});
});
},
afterQRScan
()
{
// const hash = window.location.hash.slice(1);
// const hashObj = getQueryObject(hash);
// const originUrl = window.location.origin;
// history.replaceState({}, '', originUrl);
// const codeMap = {
// wechat: 'code',
// tencent: 'code'
// };
// const codeName = hashObj[codeMap[this.auth_type]];
// if (!codeName) {
// alert('第三方登录失败');
// } else {
// this.$store.dispatch('LoginByThirdparty', codeName).then(() => {
// this.$router.push({ path: '/' });
// });
// }
}
}
},
created
()
{
// window.addEventListener('hashchange', this.afterQRScan);
},
destroyed
()
{
// window.removeEventListener('hashchange', this.afterQRScan);
}
}
}
}
</
script
>
</
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