Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
G
gavel-erp-vue
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
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
李苏
gavel-erp-vue
Commits
1193ac74
Commit
1193ac74
authored
Aug 22, 2023
by
李苏
💬
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
ERP 定制图标 layout调整
parent
12237578
Changes
7
Hide whitespace changes
Inline
Side-by-side
Showing
7 changed files
with
355 additions
and
272 deletions
+355
-272
favicon.png
public/favicon.png
+0
-0
logo.jpg
src/assets/logo/logo.jpg
+0
-0
logo.png
src/assets/logo/logo.png
+0
-0
logo1.png
src/assets/logo/logo1.png
+0
-0
Navbar.vue
src/layout/components/Navbar.vue
+3
-3
Logo.vue
src/layout/components/Sidebar/Logo.vue
+1
-1
index.vue
src/layout/components/TagsView/index.vue
+351
-268
No files found.
public/favicon.png
View replaced file @
12237578
View file @
1193ac74
442 KB
|
W:
|
H:
177 KB
|
W:
|
H:
2-up
Swipe
Onion skin
src/assets/logo/logo.jpg
0 → 100644
View file @
1193ac74
33.8 KB
src/assets/logo/logo.png
View replaced file @
12237578
View file @
1193ac74
442 KB
|
W:
|
H:
177 KB
|
W:
|
H:
2-up
Swipe
Onion skin
src/assets/logo/logo1.png
0 → 100644
View file @
1193ac74
442 KB
src/layout/components/Navbar.vue
View file @
1193ac74
...
...
@@ -53,9 +53,9 @@
<i
class=
"el-icon-caret-bottom"
/>
</div>
<el-dropdown-menu
slot=
"dropdown"
>
<
router-link
to=
"/user/profile"
>
<
el-dropdown-item>
个人中心
</el-dropdown-item
>
<
/router-link
>
<
!--<router-link to="/user/profile">--
>
<
!--<el-dropdown-item>个人中心</el-dropdown-item>--
>
<
!--</router-link>--
>
<span
@
click=
"showItem"
>
<el-dropdown-item>
修改密码
</el-dropdown-item>
</span>
...
...
src/layout/components/Sidebar/Logo.vue
View file @
1193ac74
...
...
@@ -27,7 +27,7 @@ export default {
},
watch
:{
title
(){
}
},
...
...
src/layout/components/TagsView/index.vue
View file @
1193ac74
<
template
>
<div
id=
"tags-view-container"
class=
"tags-view-container"
>
<scroll-pane
ref=
"scrollPane"
class=
"tags-view-wrapper"
@
scroll=
"handleScroll"
>
<router-link
v-for=
"tag in visitedViews"
ref=
"tag"
:key=
"tag.path"
:class=
"isActive(tag)?'active':''"
:to=
"
{ path: tag.path, query: tag.query, fullPath: tag.fullPath }"
tag="span"
class="tags-view-item"
:style="activeStyle(tag)"
@click.middle.native="!isAffix(tag)?closeSelectedTag(tag):''"
@contextmenu.prevent.native="openMenu(tag,$event)"
>
<div
id=
"tags-view-container"
class=
"tags-view-container"
style=
"position: relative;"
>
<!-- 过长切换-->
<div
v-show=
"moveShow"
class=
"moveLeft"
>
<i
@
click=
"moveLeft"
class=
"fa fa-chevron-circle-left"
aria-hidden=
"true"
/></i>
</div>
<div
v-show=
"moveShow"
class=
"moveRight"
>
<i
@
click=
"moveRight"
class=
"fa fa-chevron-circle-right"
aria-hidden=
"true"
/></i>
</div>
<scroll-pane
id=
'scrollPane'
ref=
"scrollPane"
class=
"tags-view-wrapper"
@
scroll=
"handleScroll"
>
<router-link
v-for=
"tag in visitedViews"
ref=
"tag"
:key=
"tag.path"
:class=
"isActive(tag)?'active':''"
:to=
"
{ path: tag.path, query: tag.query, fullPath: tag.fullPath }" tag="span" class="tags-view-item"
:style="activeStyle(tag)" @click.middle.native="!isAffix(tag)?closeSelectedTag(tag):''"
@contextmenu.prevent.native="openMenu(tag,$event)">
{{
tag
.
title
}}
<span
v-if=
"!isAffix(tag)"
class=
"el-icon-close"
@
click
.
prevent
.
stop=
"closeSelectedTag(tag)"
/>
</router-link>
...
...
@@ -29,298 +28,382 @@
</
template
>
<
script
>
import
ScrollPane
from
'./ScrollPane'
import
path
from
'path'
import
ScrollPane
from
'./ScrollPane'
import
path
from
'path'
export
default
{
components
:
{
ScrollPane
},
data
()
{
return
{
visible
:
false
,
top
:
0
,
left
:
0
,
selectedTag
:
{},
affixTags
:
[]
}
},
computed
:
{
visitedViews
()
{
return
this
.
$store
.
state
.
tagsView
.
visitedViews
},
routes
()
{
return
this
.
$store
.
state
.
permission
.
routes
export
default
{
components
:
{
ScrollPane
},
theme
()
{
return
this
.
$store
.
state
.
settings
.
theme
;
}
},
watch
:
{
$route
()
{
this
.
addTags
()
this
.
moveToCurrentTag
()
},
visible
(
value
)
{
if
(
value
)
{
document
.
body
.
addEventListener
(
'click'
,
this
.
closeMenu
)
}
else
{
document
.
body
.
removeEventListener
(
'click'
,
this
.
closeMenu
)
}
}
},
mounted
()
{
this
.
initTags
()
this
.
addTags
()
},
methods
:
{
isActive
(
route
)
{
return
route
.
path
===
this
.
$route
.
path
},
activeStyle
(
tag
)
{
if
(
!
this
.
isActive
(
tag
))
return
{};
data
()
{
return
{
"background-color"
:
this
.
theme
,
"border-color"
:
this
.
theme
};
},
isAffix
(
tag
)
{
return
tag
.
meta
&&
tag
.
meta
.
affix
},
isFirstView
()
{
try
{
return
this
.
selectedTag
.
fullPath
===
this
.
visitedViews
[
1
].
fullPath
||
this
.
selectedTag
.
fullPath
===
'/index'
}
catch
(
err
)
{
return
false
moveShow
:
false
,
visible
:
false
,
top
:
0
,
left
:
0
,
selectedTag
:
{},
affixTags
:
[]
}
},
isLastView
()
{
try
{
return
this
.
selectedTag
.
fullPath
===
this
.
visitedViews
[
this
.
visitedViews
.
length
-
1
].
fullPath
}
catch
(
err
)
{
return
false
computed
:
{
/* 宽度*/
visitedViews
()
{
return
this
.
$store
.
state
.
tagsView
.
visitedViews
},
routes
()
{
return
this
.
$store
.
state
.
permission
.
routes
},
theme
()
{
return
this
.
$store
.
state
.
settings
.
theme
;
}
},
filterAffixTags
(
routes
,
basePath
=
'/'
)
{
let
tags
=
[]
routes
.
forEach
(
route
=>
{
if
(
route
.
meta
&&
route
.
meta
.
affix
)
{
const
tagPath
=
path
.
resolve
(
basePath
,
route
.
path
)
tags
.
push
({
fullPath
:
tagPath
,
path
:
tagPath
,
name
:
route
.
name
,
meta
:
{
...
route
.
meta
}
})
}
if
(
route
.
children
)
{
const
tempTags
=
this
.
filterAffixTags
(
route
.
children
,
route
.
path
)
if
(
tempTags
.
length
>=
1
)
{
tags
=
[...
tags
,
...
tempTags
]
}
}
})
return
tags
},
initTags
()
{
const
affixTags
=
this
.
affixTags
=
this
.
filterAffixTags
(
this
.
routes
)
for
(
const
tag
of
affixTags
)
{
// Must have tag name
if
(
tag
.
name
)
{
this
.
$store
.
dispatch
(
'tagsView/addVisitedView'
,
tag
)
watch
:
{
$route
()
{
this
.
addTags
()
this
.
moveToCurrentTag
()
},
visible
(
value
)
{
if
(
value
)
{
document
.
body
.
addEventListener
(
'click'
,
this
.
closeMenu
)
}
else
{
document
.
body
.
removeEventListener
(
'click'
,
this
.
closeMenu
)
}
}
},
addTags
()
{
const
{
name
}
=
this
.
$route
if
(
name
)
{
this
.
$store
.
dispatch
(
'tagsView/addView'
,
this
.
$route
)
}
return
false
mounted
()
{
this
.
initTags
()
this
.
addTags
()
/* 监听*/
},
moveToCurrentTag
()
{
const
tags
=
this
.
$refs
.
tag
this
.
$nextTick
(()
=>
{
for
(
const
tag
of
tags
)
{
if
(
tag
.
to
.
path
===
this
.
$route
.
path
)
{
this
.
$refs
.
scrollPane
.
moveToTarget
(
tag
)
// when query is different then update
if
(
tag
.
to
.
fullPath
!==
this
.
$route
.
fullPath
)
{
this
.
$store
.
dispatch
(
'tagsView/updateVisitedView'
,
this
.
$route
)
}
break
}
}
updated
()
{
let
spans
=
$
(
'#scrollPane'
).
find
(
'.el-scrollbar__view>span'
)
let
allWidth
=
$
(
'.navbar'
).
width
()
let
width
=
0
spans
.
each
((
inex
,
item
)
=>
{
width
=
width
+
$
(
item
).
width
()
+
5
+
16
})
if
(
width
>
allWidth
){
this
.
moveShow
=
true
}
else
{
this
.
moveShow
=
false
}
},
refreshSelectedTag
(
view
)
{
this
.
$tab
.
refreshPage
(
view
);
},
closeSelectedTag
(
view
)
{
this
.
$tab
.
closePage
(
view
).
then
(({
visitedViews
})
=>
{
if
(
this
.
isActive
(
view
))
{
this
.
toLastView
(
visitedViews
,
view
)
methods
:
{
moveLeft
(){
const
element
=
this
.
$refs
.
scrollPane
.
$el
const
event
=
new
WheelEvent
(
'wheel'
,
{
deltaY
:
-
200
,
// 设置滚动值
bubbles
:
true
,
cancelable
:
true
});
element
.
dispatchEvent
(
event
);
},
moveRight
(){
const
element
=
this
.
$refs
.
scrollPane
.
$el
const
event
=
new
WheelEvent
(
'wheel'
,
{
deltaY
:
200
,
// 设置滚动值
bubbles
:
true
,
cancelable
:
true
});
element
.
dispatchEvent
(
event
);
},
isActive
(
route
)
{
return
route
.
path
===
this
.
$route
.
path
},
activeStyle
(
tag
)
{
if
(
!
this
.
isActive
(
tag
))
return
{};
return
{
"background-color"
:
this
.
theme
,
"border-color"
:
this
.
theme
};
},
isAffix
(
tag
)
{
return
tag
.
meta
&&
tag
.
meta
.
affix
},
isFirstView
()
{
try
{
return
this
.
selectedTag
.
fullPath
===
this
.
visitedViews
[
1
].
fullPath
||
this
.
selectedTag
.
fullPath
===
'/index'
}
catch
(
err
)
{
return
false
}
}
)
},
closeRightTags
()
{
this
.
$tab
.
closeRightPage
(
this
.
selectedTag
).
then
(
visitedViews
=>
{
if
(
!
visitedViews
.
find
(
i
=>
i
.
fullPath
===
this
.
$route
.
fullPath
)
)
{
this
.
toLastView
(
visitedViews
)
}
,
isLastView
()
{
try
{
return
this
.
selectedTag
.
fullPath
===
this
.
visitedViews
[
this
.
visitedViews
.
length
-
1
].
fullPath
}
catch
(
err
)
{
return
false
}
})
},
closeLeftTags
()
{
this
.
$tab
.
closeLeftPage
(
this
.
selectedTag
).
then
(
visitedViews
=>
{
if
(
!
visitedViews
.
find
(
i
=>
i
.
fullPath
===
this
.
$route
.
fullPath
))
{
this
.
toLastView
(
visitedViews
)
},
filterAffixTags
(
routes
,
basePath
=
'/'
)
{
let
tags
=
[]
routes
.
forEach
(
route
=>
{
if
(
route
.
meta
&&
route
.
meta
.
affix
)
{
const
tagPath
=
path
.
resolve
(
basePath
,
route
.
path
)
tags
.
push
({
fullPath
:
tagPath
,
path
:
tagPath
,
name
:
route
.
name
,
meta
:
{
...
route
.
meta
}
})
}
if
(
route
.
children
)
{
const
tempTags
=
this
.
filterAffixTags
(
route
.
children
,
route
.
path
)
if
(
tempTags
.
length
>=
1
)
{
tags
=
[...
tags
,
...
tempTags
]
}
}
})
return
tags
},
initTags
()
{
const
affixTags
=
this
.
affixTags
=
this
.
filterAffixTags
(
this
.
routes
)
for
(
const
tag
of
affixTags
)
{
// Must have tag name
if
(
tag
.
name
)
{
this
.
$store
.
dispatch
(
'tagsView/addVisitedView'
,
tag
)
}
}
})
},
closeOthersTags
()
{
this
.
$router
.
push
(
this
.
selectedTag
).
catch
(()
=>
{});
this
.
$tab
.
closeOtherPage
(
this
.
selectedTag
).
then
(()
=>
{
this
.
moveToCurrentTag
()
})
},
closeAllTags
(
view
)
{
this
.
$tab
.
closeAllPage
().
then
(({
visitedViews
})
=>
{
if
(
this
.
affixTags
.
some
(
tag
=>
tag
.
path
===
this
.
$route
.
path
))
{
return
},
addTags
()
{
const
{
name
}
=
this
.
$route
if
(
name
)
{
this
.
$store
.
dispatch
(
'tagsView/addView'
,
this
.
$route
)
}
this
.
toLastView
(
visitedViews
,
view
)
})
},
toLastView
(
visitedViews
,
view
)
{
const
latestView
=
visitedViews
.
slice
(
-
1
)[
0
]
if
(
latestView
)
{
this
.
$router
.
push
(
latestView
.
fullPath
)
}
else
{
// now the default is to redirect to the home page if there is no tags-view,
// you can adjust it according to your needs.
if
(
view
.
name
===
'Dashboard'
)
{
// to reload home page
this
.
$router
.
replace
({
path
:
'/redirect'
+
view
.
fullPath
})
return
false
},
moveToCurrentTag
()
{
const
tags
=
this
.
$refs
.
tag
this
.
$nextTick
(()
=>
{
for
(
const
tag
of
tags
)
{
if
(
tag
.
to
.
path
===
this
.
$route
.
path
)
{
this
.
$refs
.
scrollPane
.
moveToTarget
(
tag
)
// when query is different then update
if
(
tag
.
to
.
fullPath
!==
this
.
$route
.
fullPath
)
{
this
.
$store
.
dispatch
(
'tagsView/updateVisitedView'
,
this
.
$route
)
}
break
}
}
})
},
refreshSelectedTag
(
view
)
{
this
.
$tab
.
refreshPage
(
view
);
},
closeSelectedTag
(
view
)
{
this
.
$tab
.
closePage
(
view
).
then
(({
visitedViews
})
=>
{
if
(
this
.
isActive
(
view
))
{
this
.
toLastView
(
visitedViews
,
view
)
}
})
},
closeRightTags
()
{
this
.
$tab
.
closeRightPage
(
this
.
selectedTag
).
then
(
visitedViews
=>
{
if
(
!
visitedViews
.
find
(
i
=>
i
.
fullPath
===
this
.
$route
.
fullPath
))
{
this
.
toLastView
(
visitedViews
)
}
})
},
closeLeftTags
()
{
this
.
$tab
.
closeLeftPage
(
this
.
selectedTag
).
then
(
visitedViews
=>
{
if
(
!
visitedViews
.
find
(
i
=>
i
.
fullPath
===
this
.
$route
.
fullPath
))
{
this
.
toLastView
(
visitedViews
)
}
})
},
closeOthersTags
()
{
this
.
$router
.
push
(
this
.
selectedTag
).
catch
(()
=>
{});
this
.
$tab
.
closeOtherPage
(
this
.
selectedTag
).
then
(()
=>
{
this
.
moveToCurrentTag
()
})
},
closeAllTags
(
view
)
{
this
.
$tab
.
closeAllPage
().
then
(({
visitedViews
})
=>
{
if
(
this
.
affixTags
.
some
(
tag
=>
tag
.
path
===
this
.
$route
.
path
))
{
return
}
this
.
toLastView
(
visitedViews
,
view
)
})
},
toLastView
(
visitedViews
,
view
)
{
const
latestView
=
visitedViews
.
slice
(
-
1
)[
0
]
if
(
latestView
)
{
this
.
$router
.
push
(
latestView
.
fullPath
)
}
else
{
this
.
$router
.
push
(
'/'
)
// now the default is to redirect to the home page if there is no tags-view,
// you can adjust it according to your needs.
if
(
view
.
name
===
'Dashboard'
)
{
// to reload home page
this
.
$router
.
replace
({
path
:
'/redirect'
+
view
.
fullPath
})
}
else
{
this
.
$router
.
push
(
'/'
)
}
}
}
},
openMenu
(
tag
,
e
)
{
const
menuMinWidth
=
105
const
offsetLeft
=
this
.
$el
.
getBoundingClientRect
().
left
// container margin left
const
offsetWidth
=
this
.
$el
.
offsetWidth
// container width
const
maxLeft
=
offsetWidth
-
menuMinWidth
// left boundary
const
left
=
e
.
clientX
-
offsetLeft
+
15
// 15: margin right
},
openMenu
(
tag
,
e
)
{
const
menuMinWidth
=
105
const
offsetLeft
=
this
.
$el
.
getBoundingClientRect
().
left
// container margin left
const
offsetWidth
=
this
.
$el
.
offsetWidth
// container width
const
maxLeft
=
offsetWidth
-
menuMinWidth
// left boundary
const
left
=
e
.
clientX
-
offsetLeft
+
15
// 15: margin right
if
(
left
>
maxLeft
)
{
this
.
left
=
maxLeft
}
else
{
this
.
left
=
left
}
if
(
left
>
maxLeft
)
{
this
.
left
=
maxLeft
}
else
{
this
.
left
=
left
}
this
.
top
=
e
.
clientY
this
.
visible
=
true
this
.
selectedTag
=
tag
},
closeMenu
()
{
this
.
visible
=
false
},
handleScroll
()
{
this
.
closeMenu
()
this
.
top
=
e
.
clientY
this
.
visible
=
true
this
.
selectedTag
=
tag
},
closeMenu
()
{
this
.
visible
=
false
},
handleScroll
()
{
this
.
closeMenu
()
}
}
}
}
</
script
>
<
style
lang=
"scss"
scoped
>
.tags-view-container
{
height
:
34px
;
width
:
100%
;
background
:
#fff
;
border-bottom
:
1px
solid
#d8dce5
;
box-shadow
:
0
1px
3px
0
rgba
(
0
,
0
,
0
,
.12
)
,
0
0
3px
0
rgba
(
0
,
0
,
0
,
.04
);
.tags-view-wrapper
{
.tags-view-item
{
display
:
inline-block
;
position
:
relative
;
.moveLeft
{
display
:
none
;
}
.moveRight
{
display
:
none
;
}
.tags-view-container
:hover
{
.moveLeft
{
display
:
block
;
line-height
:
34px
;
color
:
#666
;
position
:
absolute
;
left
:
0
;
cursor
:
pointer
;
height
:
26px
;
line-height
:
26px
;
border
:
1px
solid
#d8dce5
;
color
:
#495060
;
background
:
#fff
;
padding
:
0
8px
;
font-size
:
12px
;
margin-left
:
5px
;
margin-top
:
4px
;
&
:first-of-type
{
margin-left
:
15px
;
}
&
:last-of-type
{
margin-right
:
15px
;
}
&
.active
{
background-color
:
#42b983
;
color
:
#fff
;
border-color
:
#42b983
;
&
:
:
before
{
content
:
''
;
background
:
#fff
;
display
:
inline-block
;
width
:
8px
;
height
:
8px
;
border-radius
:
50%
;
position
:
relative
;
margin-right
:
2px
;
}
}
z-index
:
9999
;
}
.moveRight
{
display
:
block
;
line-height
:
34px
;
color
:
#666
;
position
:
absolute
;
right
:
0
;
cursor
:
pointer
;
z-index
:
9999
;
}
}
.contextmenu
{
margin
:
0
;
.tags-view-container
{
height
:
34px
;
width
:
100%
;
background
:
#fff
;
z-index
:
3000
;
position
:
absolute
;
list-style-type
:
none
;
padding
:
5px
0
;
border-radius
:
4px
;
font-size
:
12px
;
font-weight
:
400
;
color
:
#333
;
box-shadow
:
2px
2px
3px
0
rgba
(
0
,
0
,
0
,
.3
);
li
{
border-bottom
:
1px
solid
#d8dce5
;
box-shadow
:
0
1px
3px
0
rgba
(
0
,
0
,
0
,
.12
)
,
0
0
3px
0
rgba
(
0
,
0
,
0
,
.04
);
.tags-view-wrapper
{
.tags-view-item
{
display
:
inline-block
;
position
:
relative
;
cursor
:
pointer
;
height
:
26px
;
line-height
:
26px
;
border
:
1px
solid
#d8dce5
;
color
:
#495060
;
background
:
#fff
;
padding
:
0
8px
;
font-size
:
12px
;
margin-left
:
5px
;
margin-top
:
4px
;
&
:first-of-type
{
margin-left
:
15px
;
}
&
:last-of-type
{
margin-right
:
15px
;
}
&
.active
{
background-color
:
#42b983
;
color
:
#fff
;
border-color
:
#42b983
;
&
:
:
before
{
content
:
''
;
background
:
#fff
;
display
:
inline-block
;
width
:
8px
;
height
:
8px
;
border-radius
:
50%
;
position
:
relative
;
margin-right
:
2px
;
}
}
}
}
.contextmenu
{
margin
:
0
;
padding
:
7px
16px
;
cursor
:
pointer
;
&
:hover
{
background
:
#eee
;
background
:
#fff
;
z-index
:
3000
;
position
:
absolute
;
list-style-type
:
none
;
padding
:
5px
0
;
border-radius
:
4px
;
font-size
:
12px
;
font-weight
:
400
;
color
:
#333
;
box-shadow
:
2px
2px
3px
0
rgba
(
0
,
0
,
0
,
.3
);
li
{
margin
:
0
;
padding
:
7px
16px
;
cursor
:
pointer
;
&
:hover
{
background
:
#eee
;
}
}
}
}
}
</
style
>
<
style
lang=
"scss"
>
//reset element css of el-icon-close
.tags-view-wrapper
{
.tags-view-item
{
.el-icon-close
{
width
:
16px
;
height
:
16px
;
vertical-align
:
2px
;
border-radius
:
50%
;
text-align
:
center
;
transition
:
all
.3s
cubic-bezier
(
.645
,
.045
,
.355
,
1
);
transform-origin
:
100%
50%
;
&
:before
{
transform
:
scale
(
.6
);
display
:
inline-block
;
vertical-align
:
-3px
;
}
&
:hover
{
background-color
:
#b4bccc
;
color
:
#fff
;
//reset element css of el-icon-close
.tags-view-wrapper
{
.tags-view-item
{
.el-icon-close
{
width
:
16px
;
height
:
16px
;
vertical-align
:
2px
;
border-radius
:
50%
;
text-align
:
center
;
transition
:
all
.3s
cubic-bezier
(
.645
,
.045
,
.355
,
1
);
transform-origin
:
100%
50%
;
&
:before
{
transform
:
scale
(
.6
);
display
:
inline-block
;
vertical-align
:
-3px
;
}
&
:hover
{
background-color
:
#b4bccc
;
color
:
#fff
;
}
}
}
}
}
</
style
>
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