Skip to content
Projects
Groups
Snippets
Help
This project
Loading...
Sign in / Register
Toggle navigation
O
offical_web
Overview
Overview
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
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
zhangjie
offical_web
Commits
53aec777
Commit
53aec777
authored
Nov 14, 2025
by
wusiyi
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
feat: 样式优化,关于我们页面完善
parent
b2847646
Hide whitespace changes
Inline
Side-by-side
Showing
7 changed files
with
318 additions
and
248 deletions
+318
-248
src/assets/css/common.css
+9
-1
src/components/headerNavMobile.vue
+4
-225
src/components/navMenu.vue
+241
-0
src/components/product-intro.vue
+6
-1
src/views/aboutus/aboutPage.vue
+1
-1
src/views/aboutus/timeline.vue
+22
-8
src/views/help/sideNav.vue
+35
-12
No files found.
src/assets/css/common.css
View file @
53aec777
...
@@ -1074,10 +1074,18 @@ ul li {
...
@@ -1074,10 +1074,18 @@ ul li {
}
}
.bg-colorBg
{
.bg-colorBg
{
--tw-bg-opacity
:
1
;
background-color
:
var
(
--background-color
);
background-color
:
var
(
--background-color
);
}
}
.bg-colorBg-gradient
{
background-image
:
linear-gradient
(
to
bottom
,
#ffffff00
1%
,
var
(
--background-color
),
#ffffff00
99%
);
}
.primary-color
{
.primary-color
{
color
:
var
(
--primary-color
);
color
:
var
(
--primary-color
);
}
}
...
...
src/components/headerNavMobile.vue
View file @
53aec777
...
@@ -41,70 +41,9 @@
...
@@ -41,70 +41,9 @@
<img
src=
"../assets/logo.png"
class=
"w-32"
/>
<img
src=
"../assets/logo.png"
class=
"w-32"
/>
<i
<i
class=
"el-icon-close text-xl font-bold cursor-pointer"
class=
"el-icon-close text-xl font-bold cursor-pointer"
@
click=
"toggleShow"
></i
>
@
click=
"toggleShow"
/
>
</div>
</div>
<ul
class=
"header-nav-mobile-items"
@
click
.
stop
>
<NavMenu
:nav=
"nav"
@
item-click=
"toggleShow"
/>
<li
v-for=
"(r, i) in nav"
:key=
"i"
class=
"header-nav-mobile-item"
:class=
"
{ active: isRouteActive(r) }">
<router-link
v-if=
"!r.children"
class=
"header-nav-mobile-link flex items-center justify-between"
:to=
"r.path"
@
click
.
native=
"toggleShow(r)"
>
{{
r
.
name
}}
</router-link>
<div
v-else
class=
"header-nav-mobile-link flex items-center justify-between"
>
<span>
{{
r
.
name
}}
</span>
<i
:class=
"r.expanding ? 'el-icon-arrow-up' : 'el-icon-arrow-down'"
@
click
.
stop=
"toggleExpand(r)"
></i>
</div>
<div
v-if=
"r.expanding"
class=
"header-nav-mobile-child"
>
<div
class=
"header-nav-mobile-child-item"
v-for=
"(c, index) in r.children"
:class=
"
{ active: isRouteActive(c) }"
:key="index">
<router-link
v-if=
"!c.children"
class=
"header-nav-mobile-link"
:to=
"c.path"
@
click
.
native=
"toggleShow(c)"
>
{{
c
.
name
}}
</router-link>
<div
v-else
class=
"header-nav-mobile-link flex items-center justify-between"
>
<span>
{{
c
.
name
}}
</span>
<i
:class=
"
c.expanding ? 'el-icon-arrow-up' : 'el-icon-arrow-down'
"
@
click
.
stop=
"toggleExpand(c)"
></i>
</div>
<div
v-if=
"c.expanding"
class=
"header-nav-mobile-sub-child"
>
<div
class=
"header-nav-mobile-child-item"
v-for=
"(s, index2) in c.children"
:class=
"
{ active: isRouteActive(s) }"
:key="index2">
<router-link
class=
"header-nav-mobile-link"
:to=
"s.path"
@
click
.
native=
"toggleShow(s)"
>
{{
s
.
name
}}
</router-link>
</div>
</div>
</div>
</div>
</li>
</ul>
</div>
</div>
</transition>
</transition>
</div>
</div>
...
@@ -112,6 +51,7 @@
...
@@ -112,6 +51,7 @@
<
script
>
<
script
>
import
{
mapMutations
}
from
'vuex'
import
{
mapMutations
}
from
'vuex'
import
{
Icon
}
from
'@iconify/vue2'
import
{
Icon
}
from
'@iconify/vue2'
import
NavMenu
from
'./navMenu.vue'
import
productionSvg
from
'../assets/images/home/production.svg'
import
productionSvg
from
'../assets/images/home/production.svg'
import
customSvg
from
'../assets/images/home/custom.svg'
import
customSvg
from
'../assets/images/home/custom.svg'
import
supplyChainSvg
from
'../assets/images/home/earth.svg'
import
supplyChainSvg
from
'../assets/images/home/earth.svg'
...
@@ -124,6 +64,7 @@ export default {
...
@@ -124,6 +64,7 @@ export default {
},
},
components
:
{
components
:
{
Icon
,
Icon
,
NavMenu
,
},
},
data
()
{
data
()
{
return
{
return
{
...
@@ -183,23 +124,6 @@ export default {
...
@@ -183,23 +124,6 @@ export default {
toggleShow
()
{
toggleShow
()
{
this
.
showing
=
!
this
.
showing
this
.
showing
=
!
this
.
showing
},
},
handleMenuClick
(
item
)
{
// 如果菜单项有子节点,不关闭菜单(由组件内部处理展开/收起)
if
(
item
.
children
&&
item
.
children
.
length
>
0
)
{
return
}
// 叶子节点点击后关闭菜单
this
.
toggleShow
()
},
isRouteActive
(
item
)
{
const
path
=
this
.
$route
.
path
if
(
item
.
path
===
path
)
return
true
// 检查子节点中是否有激活的路由
if
(
item
.
children
)
{
return
item
.
children
.
some
((
child
)
=>
this
.
isRouteActive
(
child
))
}
return
false
},
async
login
()
{
async
login
()
{
// 跳转到首页
// 跳转到首页
await
this
.
$router
.
push
(
'/home'
).
catch
(()
=>
{})
await
this
.
$router
.
push
(
'/home'
).
catch
(()
=>
{})
...
@@ -319,149 +243,4 @@ export default {
...
@@ -319,149 +243,4 @@ export default {
display
:
flex
;
display
:
flex
;
flex-direction
:
column
;
flex-direction
:
column
;
}
}
.header-nav-mobile-items
{
box-sizing
:
border-box
;
width
:
100%
;
height
:
100%
;
//
background-color
:
#fff
;
margin
:
0
;
padding
:
20px
20px
;
flex
:
1
;
overflow-y
:
auto
;
}
.header-nav-mobile-item
,
.header-nav-mobile-child
{
list-style-type
:
none
;
line-height
:
50px
;
letter-spacing
:
4px
;
&.active
>
.header-nav-mobile-link
{
color
:
var
(
--primary-color
);
}
}
.header-nav-mobile-child-item
{
&.active
>
.header-nav-mobile-link
{
color
:
var
(
--primary-color
);
}
}
.header-nav-mobile-item.active
{
.header-nav-mobile-link
{
position
:
relative
;
}
}
.header-nav-mobile-item
{
font-size
:
16px
;
}
.header-nav-mobile-child
{
font-size
:
14px
;
//
color
:
#999
;
background-color
:
#fffdf8
;
padding
:
0
20px
;
margin-top
:
10px
;
}
.header-nav-mobile-sub-child
{
margin-left
:
20px
;
&
>
.header-nav-mobile-child-item
{
border-bottom
:
1px
solid
var
(
--border-color
);
}
}
.header-nav-mobile-child-item
{
line-height
:
36px
;
}
.header-nav-mobile-children
{
margin
:
0
;
padding
:
0
;
}
.header-nav-mobile-item
>
.header-nav-mobile-link
{
display
:
block
;
width
:
100%
;
height
:
100%
;
color
:
inherit
;
text-decoration
:
none
;
cursor
:
pointer
;
border-bottom
:
solid
1px
var
(
--border-color
);
}
.header-nav-mobile-item
>
.header-nav-mobile-link
{
display
:
flex
;
.expand-icon
{
margin-left
:
auto
;
margin-right
:
20px
;
}
}
.header-nav-mobile-child
>
.header-nav-mobile-link
{
padding-left
:
10px
;
&::after
{
display
:
none
!important
;
}
}
//
递归菜单组件样式补充
.header-nav-mobile-items
{
.header-nav-mobile-item
{
list-style-type
:
none
;
line-height
:
50px
;
letter-spacing
:
4px
;
font-size
:
16px
;
&.active
>
.header-nav-mobile-link
{
color
:
var
(
--primary-color
);
}
>
.header-nav-mobile-link
{
display
:
block
;
width
:
100%
;
height
:
100%
;
color
:
inherit
;
text-decoration
:
none
;
cursor
:
pointer
;
border-bottom
:
solid
1px
var
(
--border-color
);
display
:
flex
;
align-items
:
center
;
justify-content
:
space-between
;
}
}
.header-nav-mobile-child
{
font-size
:
14px
;
background-color
:
#fffdf8
;
padding
:
0
20px
;
margin-top
:
10px
;
.header-nav-mobile-child-item
{
line-height
:
36px
;
border-bottom
:
1px
solid
var
(
--border-color
);
&.active
>
.header-nav-mobile-link
{
color
:
var
(
--primary-color
);
}
>
.header-nav-mobile-link
{
padding-left
:
10px
;
&::after
{
display
:
none
!important
;
}
}
}
}
.header-nav-mobile-sub-child
{
margin-left
:
20px
;
}
.recursive-menu-children
{
list-style-type
:
none
;
margin
:
0
;
padding
:
0
;
}
}
</
style
>
</
style
>
src/components/navMenu.vue
0 → 100644
View file @
53aec777
<
template
>
<div>
<ul
class=
"header-nav-mobile-items"
@
click
.
stop
>
<li
v-for=
"(r, i) in nav"
:key=
"i"
class=
"header-nav-mobile-item"
:class=
"
{ active: isRouteActive(r) }">
<router-link
v-if=
"!r.children"
class=
"header-nav-mobile-link flex items-center justify-between"
:to=
"r.path"
@
click
.
native=
"handleMenuClick(r)"
>
{{
r
.
name
}}
</router-link>
<div
v-else
class=
"header-nav-mobile-link flex items-center justify-between"
>
<span>
{{
r
.
name
}}
</span>
<i
:class=
"r.expanding ? 'el-icon-arrow-up' : 'el-icon-arrow-down'"
@
click
.
stop=
"handleMenuClick(r)"
></i>
</div>
<div
v-if=
"r.expanding"
class=
"header-nav-mobile-child"
>
<div
class=
"header-nav-mobile-child-item"
v-for=
"(c, index) in r.children"
:class=
"
{ active: isRouteActive(c) }"
:key="index">
<router-link
v-if=
"!c.children"
class=
"header-nav-mobile-link"
:to=
"c.path"
@
click
.
native=
"handleMenuClick(c)"
>
{{
c
.
name
}}
</router-link>
<div
v-else
class=
"header-nav-mobile-link flex items-center justify-between"
>
<span>
{{
c
.
name
}}
</span>
<i
:class=
"c.expanding ? 'el-icon-arrow-up' : 'el-icon-arrow-down'"
@
click
.
stop=
"handleMenuClick(c)"
></i>
</div>
<div
v-if=
"c.expanding"
class=
"header-nav-mobile-sub-child"
>
<div
class=
"header-nav-mobile-child-item"
v-for=
"(s, index2) in c.children"
:class=
"
{ active: isRouteActive(s) }"
:key="index2">
<router-link
class=
"header-nav-mobile-link"
:to=
"s.path"
@
click
.
native=
"handleMenuClick(s)"
>
{{
s
.
name
}}
</router-link>
</div>
</div>
</div>
</div>
</li>
</ul>
</div>
</
template
>
<
script
>
export
default
{
name
:
'NavMenu'
,
props
:
{
nav
:
{
type
:
Array
,
required
:
true
,
},
},
methods
:
{
handleMenuClick
(
item
)
{
// 如果菜单项有子节点,不关闭菜单(由组件内部处理展开/收起)
if
(
item
.
children
&&
item
.
children
.
length
>
0
)
{
return
}
// 叶子节点点击后关闭菜单
this
.
$emit
(
'item-click'
)
},
isRouteActive
(
item
)
{
const
path
=
this
.
$route
.
path
if
(
item
.
path
===
path
)
return
true
// 检查子节点中是否有激活的路由
if
(
item
.
children
)
{
return
item
.
children
.
some
((
child
)
=>
this
.
isRouteActive
(
child
))
}
return
false
},
},
}
</
script
>
<
style
scoped
lang=
"scss"
>
.header-nav-mobile-items
{
box-sizing
:
border-box
;
width
:
100%
;
height
:
100%
;
//
background-color
:
#fff
;
margin
:
0
;
padding
:
20px
20px
;
flex
:
1
;
overflow-y
:
auto
;
}
.header-nav-mobile-item
,
.header-nav-mobile-child
{
list-style-type
:
none
;
line-height
:
50px
;
letter-spacing
:
4px
;
&.active
>
.header-nav-mobile-link
{
color
:
var
(
--primary-color
);
}
}
.header-nav-mobile-child-item
{
&.active
>
.header-nav-mobile-link
{
color
:
var
(
--primary-color
);
}
}
.header-nav-mobile-item.active
{
.header-nav-mobile-link
{
position
:
relative
;
}
}
.header-nav-mobile-item
{
font-size
:
16px
;
}
.header-nav-mobile-child
{
font-size
:
14px
;
//
color
:
#999
;
background-color
:
#fffdf8
;
padding
:
0
20px
;
margin-top
:
10px
;
}
.header-nav-mobile-sub-child
{
margin-left
:
20px
;
&
>
.header-nav-mobile-child-item
{
border-bottom
:
1px
solid
var
(
--border-color
);
}
}
.header-nav-mobile-child-item
{
line-height
:
36px
;
}
.header-nav-mobile-children
{
margin
:
0
;
padding
:
0
;
}
.header-nav-mobile-item
>
.header-nav-mobile-link
{
display
:
block
;
width
:
100%
;
height
:
100%
;
color
:
inherit
;
text-decoration
:
none
;
cursor
:
pointer
;
border-bottom
:
solid
1px
var
(
--border-color
);
}
.header-nav-mobile-item
>
.header-nav-mobile-link
{
display
:
flex
;
.expand-icon
{
margin-left
:
auto
;
margin-right
:
20px
;
}
}
.header-nav-mobile-child
>
.header-nav-mobile-link
{
padding-left
:
10px
;
&::after
{
display
:
none
!important
;
}
}
//
递归菜单组件样式补充
.header-nav-mobile-items
{
.header-nav-mobile-item
{
list-style-type
:
none
;
line-height
:
50px
;
letter-spacing
:
4px
;
font-size
:
16px
;
&.active
>
.header-nav-mobile-link
{
color
:
var
(
--primary-color
);
}
>
.header-nav-mobile-link
{
display
:
block
;
width
:
100%
;
height
:
100%
;
color
:
inherit
;
text-decoration
:
none
;
cursor
:
pointer
;
border-bottom
:
solid
1px
var
(
--border-color
);
display
:
flex
;
align-items
:
center
;
justify-content
:
space-between
;
}
}
.header-nav-mobile-child
{
font-size
:
14px
;
background-color
:
#fffdf8
;
padding
:
0
20px
;
margin-top
:
10px
;
.header-nav-mobile-child-item
{
line-height
:
36px
;
border-bottom
:
1px
solid
var
(
--border-color
);
&.active
>
.header-nav-mobile-link
{
color
:
var
(
--primary-color
);
}
>
.header-nav-mobile-link
{
padding-left
:
10px
;
&::after
{
display
:
none
!important
;
}
}
}
}
.header-nav-mobile-sub-child
{
margin-left
:
20px
;
}
.recursive-menu-children
{
list-style-type
:
none
;
margin
:
0
;
padding
:
0
;
}
}
</
style
>
src/components/product-intro.vue
View file @
53aec777
...
@@ -615,7 +615,12 @@ export default {
...
@@ -615,7 +615,12 @@ export default {
flex-direction
:
row-reverse
;
flex-direction
:
row-reverse
;
}
}
.home-module-item
:nth-child
(
odd
)
{
.home-module-item
:nth-child
(
odd
)
{
background-color
:
var
(
--background-color
);
background-image
:
linear-gradient
(
to
bottom
,
#ffffff00
1%
,
var
(
--background-color
),
#ffffff00
99%
);
}
}
.home-module-item
:not
(
:last-child
)
{
.home-module-item
:not
(
:last-child
)
{
...
...
src/views/aboutus/aboutPage.vue
View file @
53aec777
...
@@ -85,7 +85,7 @@
...
@@ -85,7 +85,7 @@
</div>
</div>
</div>
</div>
</div>
</div>
<div
class=
"bg-colorBg w-full flex flex-col m-auto mt-20 py-10"
>
<div
class=
"bg-colorBg
-gradient
w-full flex flex-col m-auto mt-20 py-10"
>
<h2
class=
"text-center"
>
发展历程
</h2>
<h2
class=
"text-center"
>
发展历程
</h2>
<timeline
/>
<timeline
/>
</div>
</div>
...
...
src/views/aboutus/timeline.vue
View file @
53aec777
...
@@ -26,19 +26,21 @@
...
@@ -26,19 +26,21 @@
class=
"timeline-card-item"
class=
"timeline-card-item"
ref=
"cardItems"
>
ref=
"cardItems"
>
<div
<div
class=
"timeline-card lg:p-10 p-6
h-80 lg:w-104
w-80 shadow-xl rounded-lg cursor-pointer"
class=
"timeline-card lg:p-10 p-6
lg:h-80 h-64 lg:w-96
w-80 shadow-xl rounded-lg cursor-pointer"
:class=
"
{ 'timeline-card-current': currentIndex === index }"
:class=
"
{ 'timeline-card-current': currentIndex === index }"
@click="selectTime(index)">
@click="selectTime(index)">
<div
class=
"w-full text-gray-600 font-semibold lg:text-2xl text-lg"
>
<div
class=
"w-full text-gray-600 font-semibold lg:text-2xl text-lg"
>
{{
item
.
title
}}
{{
item
.
title
}}
:
{{
item
.
subtitle
}}
</div>
</div>
<div
class=
"bg-gray-200 mt-3 h-px"
/>
<div
class=
"bg-gray-200 mt-3 h-px"
/>
<el-timeline
class=
"mt-
5
"
>
<el-timeline
class=
"mt-
8
"
>
<el-timeline-item
<el-timeline-item
v-for=
"(content, index) in item.content"
v-for=
"(content, index) in item.content"
:key=
"index"
:key=
"index"
color=
"var(--el-color-primary-light-3)"
>
color=
"var(--el-color-primary-light-3)"
>
{{
content
}}
<div
class=
"text-gray-600 lg:text-base text-base"
>
{{
content
}}
</div>
</el-timeline-item>
</el-timeline-item>
</el-timeline>
</el-timeline>
</div>
</div>
...
@@ -54,19 +56,31 @@ export default {
...
@@ -54,19 +56,31 @@ export default {
timelineItems
:
[
timelineItems
:
[
{
{
title
:
'2022年'
,
title
:
'2022年'
,
content
:
[],
subtitle
:
'奠基与启航'
,
content
:
[
'公司于西安成立,以跨境电商与智能营销为核心,完成技术架构搭建,实现从0到1的突破。'
,
],
},
},
{
{
title
:
'2023年'
,
title
:
'2023年'
,
content
:
[],
subtitle
:
'拓展与深耕'
,
content
:
[
'业务规模快速扩大,通过优化供应链与丰富SaaS工具矩阵,提升了运营效率并获市场认可。'
,
],
},
},
{
{
title
:
'2024年'
,
title
:
'2024年'
,
content
:
[],
subtitle
:
'整合与赋能'
,
content
:
[
'战略转向生态整合,将核心能力产品化输出,成功从服务商转型为生态赋能者。'
,
],
},
},
{
{
title
:
'2025年'
,
title
:
'2025年'
,
content
:
[],
subtitle
:
'创新与跨越'
,
content
:
[
'建立美国柔性供应链积极拓展海外市场,推动品牌国际化,开启智能化与全球布局新阶段。'
,
],
},
},
],
],
currentIndex
:
0
,
currentIndex
:
0
,
...
...
src/views/help/sideNav.vue
View file @
53aec777
...
@@ -5,7 +5,6 @@
...
@@ -5,7 +5,6 @@
v-model=
"searchKeyword"
v-model=
"searchKeyword"
placeholder=
"在目录中搜索..."
></el-input>
placeholder=
"在目录中搜索..."
></el-input>
<el-menu
<el-menu
:key=
"menuKey"
router
router
:unique-opened=
"true"
:unique-opened=
"true"
:default-active=
"$route.path"
:default-active=
"$route.path"
...
@@ -27,22 +26,46 @@ export default {
...
@@ -27,22 +26,46 @@ export default {
return
{
return
{
searchKeyword
:
''
,
searchKeyword
:
''
,
menuList
,
menuList
,
menuKey
:
0
,
}
}
},
},
watch
:
{
'$route.path'
()
{
this
.
$nextTick
(()
=>
{
this
.
menuKey
+=
1
})
},
},
computed
:
{
computed
:
{
// 需要展开的父级菜单
// 需要展开的父级菜单
openedMenus
()
{
openedMenus
()
{
const
id
=
this
.
$route
.
path
.
split
(
'/'
).
pop
()
const
currentPath
=
this
.
$route
.
path
const
result
=
Array
.
from
(
id
).
map
((
_
,
i
)
=>
id
.
slice
(
0
,
i
+
1
))
// 递归查找匹配的菜单项及其父级菜单
return
result
const
findMenuItem
=
(
items
,
parentIds
=
[])
=>
{
for
(
const
item
of
items
)
{
// 构建菜单项的完整路径(与 MenuItem.vue 中的逻辑保持一致)
let
itemPath
=
''
if
(
item
.
url
)
{
// 如果有 url,路径格式为 /help/path/url
itemPath
=
item
.
path
?
`/help/
${
item
.
path
}
/
${
item
.
url
}
`
:
`/help/
${
item
.
url
}
`
}
else
if
(
item
.
path
)
{
// 如果只有 path,路径格式为 /help/path
itemPath
=
`/help/
${
item
.
path
}
`
}
// 如果当前路径完全匹配
if
(
itemPath
&&
itemPath
===
currentPath
)
{
return
parentIds
}
// 如果有子菜单,递归查找
if
(
item
.
children
&&
item
.
children
.
length
>
0
)
{
const
newParentIds
=
[...
parentIds
,
String
(
item
.
id
)]
const
result
=
findMenuItem
(
item
.
children
,
newParentIds
)
if
(
result
!==
null
)
{
return
result
}
}
}
return
null
}
const
result
=
findMenuItem
(
this
.
menuList
)
return
result
||
[]
},
},
},
},
}
}
...
...
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