Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Submit feedback
Contribute to GitLab
Sign in
Toggle navigation
B
boyueCEnd
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
游洁
boyueCEnd
Commits
d6fc4e78
Commit
d6fc4e78
authored
Dec 04, 2025
by
罗超
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
样式调整
parent
d49e03f5
Hide whitespace changes
Inline
Side-by-side
Showing
5 changed files
with
86 additions
and
97 deletions
+86
-97
SearchBox.vue
src/components/page-builder/SearchBox.vue
+1
-1
Footer.vue
src/layouts/components/Footer.vue
+77
-92
HeaderTopBar.vue
src/layouts/components/HeaderTopBar.vue
+1
-1
Headers.vue
src/layouts/components/Headers.vue
+4
-2
systemConfig.ts
src/stores/systemConfig.ts
+3
-1
No files found.
src/components/page-builder/SearchBox.vue
View file @
d6fc4e78
...
@@ -259,7 +259,7 @@ const buttonStyleComputed = computed(() => {
...
@@ -259,7 +259,7 @@ const buttonStyleComputed = computed(() => {
// 下拉面板样式
// 下拉面板样式
const
dropdownStyleComputed
=
computed
(()
=>
({
const
dropdownStyleComputed
=
computed
(()
=>
({
maxHeight
:
`
${
props
.
dropdownStyle
.
maxHeight
}
px`
,
maxHeight
:
props
.
dropdownStyle
.
maxHeight
==
0
?
"unset"
:
`
${
props
.
dropdownStyle
.
maxHeight
}
px`
,
borderRadius
:
`
${
props
.
dropdownStyle
.
borderRadius
}
px`
,
borderRadius
:
`
${
props
.
dropdownStyle
.
borderRadius
}
px`
,
backgroundColor
:
props
.
dropdownStyle
.
backgroundColor
,
backgroundColor
:
props
.
dropdownStyle
.
backgroundColor
,
boxShadow
:
props
.
dropdownStyle
.
boxShadow
,
boxShadow
:
props
.
dropdownStyle
.
boxShadow
,
...
...
src/layouts/components/Footer.vue
View file @
d6fc4e78
...
@@ -15,7 +15,13 @@
...
@@ -15,7 +15,13 @@
class=
"social-icon hover:opacity-80 transition-opacity"
class=
"social-icon hover:opacity-80 transition-opacity"
:title=
"t(`footer.social.$
{key}`)"
:title=
"t(`footer.social.$
{key}`)"
>
>
<span
class=
"text-lg"
>
{{
getSocialIcon
(
key
)
}}
</span>
<VIcon
v-if=
"getSocialIconName(key)"
:name=
"getSocialIconName(key)!"
fill=
"outline"
class=
"text-[24px]"
/>
<span
v-else
class=
"text-sm"
>
{{
key
}}
</span>
</a>
</a>
</div>
</div>
...
@@ -51,47 +57,14 @@
...
@@ -51,47 +57,14 @@
<!-- 中间区域:链接列 -->
<!-- 中间区域:链接列 -->
<div
class=
"footer-middle border-b border-gray-700 py-8"
>
<div
class=
"footer-middle border-b border-gray-700 py-8"
>
<div
class=
"footer-container"
>
<div
class=
"footer-container"
>
<div
class=
"grid grid-cols-1 md:grid-cols-4 gap-8"
>
<div
class=
"grid grid-cols-1 gap-8"
:class=
"[`md:grid-cols-$
{bottomNavs.length+1}`]">
<!-- 关于我们 -->
<div>
<h3
class=
"font-semibold mb-4"
>
{{
t
(
'footer.about.title'
)
}}
</h3>
<ul
class=
"space-y-2"
>
<li
v-for=
"link in aboutLinks"
:key=
"link.key"
>
<a
:href=
"link.url"
class=
"text-sm text-gray-300 hover:text-white transition-colors"
>
{{
t
(
`footer.about.${link.key
}
`
)
}}
<
/a
>
<
/li
>
<
/ul
>
<
/div
>
<!--
给旅人
-->
<
div
>
<
h3
class
=
"font-semibold mb-4"
>
{{
t
(
'footer.travelers.title'
)
}}
<
/h3
>
<
ul
class
=
"space-y-2"
>
<
li
v
-
for
=
"link in travelerLinks"
:
key
=
"link.key"
>
<
a
:
href
=
"link.url"
class
=
"text-sm text-gray-300 hover:text-white transition-colors"
>
{{
t
(
`footer.travelers.${link.key
}
`
)
}}
<
/a
>
<
/li
>
<
/ul
>
<
/div
>
<!--
合作伙伴
-->
<div
v-for=
"item in bottomNavs"
:key=
"item.id"
>
<
div
>
<h3
class=
"font-semibold mb-4"
>
{{
t
(
item
.
navTitle
)
}}
</h3>
<
h3
class
=
"font-semibold mb-4"
>
{{
t
(
'footer.partners.title'
)
}}
<
/h3
>
<ul
class=
"space-y-2"
>
<ul
class=
"space-y-2"
>
<
li
v
-
for
=
"link in partnerLinks"
:
key
=
"link.key"
>
<li
v-for=
"child in item.childList"
:key=
"child.id"
>
<
a
<a
:href=
"child.navUrl??'javascript:void(0);'"
class=
"text-sm text-gray-300 hover:text-white transition-colors"
>
:
href
=
"link.url"
{{
t
(
child
.
navTitle
)
}}
class
=
"text-sm text-gray-300 hover:text-white transition-colors"
>
{{
t
(
`footer.partners.${link.key
}
`
)
}}
</a>
</a>
</li>
</li>
</ul>
</ul>
...
@@ -110,10 +83,9 @@
...
@@ -110,10 +83,9 @@
:name=
"method.icon"
:name=
"method.icon"
fill=
"outline"
fill=
"outline"
class=
"text-[20px]"
class=
"text-[20px]"
v-if=
"method.icon && method.icon!=''"
/>
/>
<
span
class
=
"text-xs text-gray-200"
>
<img
:src=
"method.url"
:alt=
"method.label"
class=
"w-[42px] h-[auto]"
v-if=
"method.url && method.url!=''"
/>
{{
method
.
label
}}
<
/span
>
</div>
</div>
</div>
</div>
</div>
</div>
...
@@ -155,84 +127,97 @@ import { useI18n } from 'vue-i18n'
...
@@ -155,84 +127,97 @@ import { useI18n } from 'vue-i18n'
import
{
useSystemConfigStore
}
from
'@/stores/systemConfig'
import
{
useSystemConfigStore
}
from
'@/stores/systemConfig'
import
{
IconUp
}
from
'@arco-design/web-vue/es/icon'
import
{
IconUp
}
from
'@arco-design/web-vue/es/icon'
import
{
Message
}
from
'@arco-design/web-vue'
import
{
Message
}
from
'@arco-design/web-vue'
import
VIcon
from
'@/components/global/VIcon.vue'
const
{
t
}
=
useI18n
()
const
{
t
}
=
useI18n
()
const
systemConfigStore
=
useSystemConfigStore
()
const
systemConfigStore
=
useSystemConfigStore
()
const
email
=
ref
(
''
)
const
email
=
ref
(
''
)
const
bottomNavs
=
computed
(()
=>
systemConfigStore
.
getBottomNavs
)
// 社交媒体字段到 VIcon 图标名称的映射
const
socialIconMap
:
Record
<
string
,
string
>
=
{
facebook
:
'facebook'
,
instagram
:
'instagram'
,
snapchat
:
'snapchat'
,
whatsapp
:
'whatsapp'
,
youtube
:
'youtube'
,
twitter
:
'twitter'
,
tiktok
:
'tiktok'
,
}
// 社交媒体链接
// 所有支持的社交媒体字段
const
allSocialFields
=
[
'facebook'
,
'instagram'
,
'kakaotalk'
,
'line'
,
'linkedin'
,
'messenger'
,
'naver'
,
'signal'
,
'snapchat'
,
'telegram'
,
'tiktok'
,
'twitter'
,
'viber'
,
'wechat'
,
'weibo'
,
'whatsapp'
,
'xiaohongshu'
,
'youtube'
,
'zalo'
]
// 社交媒体链接(自动过滤空值)
const
socialMediaLinks
=
computed
(()
=>
{
const
socialMediaLinks
=
computed
(()
=>
{
const
config
=
systemConfigStore
.
config
const
config
=
systemConfigStore
.
config
if
(
!
config
)
return
{}
if
(
!
config
)
return
{}
const
links
:
Record
<
string
,
string
>
=
{}
const
links
:
Record
<
string
,
string
>
=
{}
const
socialFields
=
[
'facebook'
,
'youtube'
,
'instagram'
,
'weibo'
,
'twitter'
,
'pinterest'
]
s
ocialFields
.
forEach
(
field
=>
{
allS
ocialFields
.
forEach
(
field
=>
{
const
value
=
(
config
as
any
)[
field
]
const
value
=
(
config
as
any
)[
field
]
if
(
value
&&
typeof
value
===
'string'
)
{
// 只添加非空字符串链接
links
[
field
]
=
value
if
(
value
&&
typeof
value
===
'string'
&&
value
.
trim
()
!==
''
)
{
links
[
field
]
=
value
.
trim
()
}
}
})
})
return
links
return
links
})
})
// 获取社交媒体图标组件
// 获取社交媒体图标名称(如果支持)
const
getSocialIcon
=
(
key
:
string
)
=>
{
const
getSocialIconName
=
(
key
:
string
):
string
|
null
=>
{
// 使用简单的文本图标,实际项目中可以使用图标库
return
socialIconMap
[
key
]
||
null
const
iconMap
:
Record
<
string
,
string
>
=
{
facebook
:
'f'
,
youtube
:
'▶'
,
instagram
:
'📷'
,
weibo
:
'微博'
,
twitter
:
'X'
,
pinterest
:
'P'
}
return
iconMap
[
key
]
||
key
}
}
// 关于我们链接
// 汇总没有图标的媒体(用于调试,可在控制台查看)
const
aboutLinks
=
[
// 使用 console.log 输出,避免未使用变量的警告
{
key
:
'about'
,
url
:
'/about'
}
,
if
(
import
.
meta
.
env
.
DEV
)
{
{
key
:
'terms'
,
url
:
'/terms'
}
,
const
checkSocialMediaWithoutIcons
=
()
=>
{
{
key
:
'privacy'
,
url
:
'/privacy'
}
,
const
config
=
systemConfigStore
.
config
{
key
:
'help'
,
url
:
'/help'
}
,
if
(
!
config
)
return
{
key
:
'media'
,
url
:
'/media'
}
]
const
withoutIcons
:
string
[]
=
[]
// 给旅人链接
allSocialFields
.
forEach
(
field
=>
{
const
travelerLinks
=
[
const
value
=
(
config
as
any
)[
field
]
{
key
:
'guarantee'
,
url
:
'/guarantee'
}
,
// 如果有值但没有对应的图标
{
key
:
'blog'
,
url
:
'/blog'
}
,
if
(
value
&&
typeof
value
===
'string'
&&
value
.
trim
()
!==
''
&&
!
socialIconMap
[
field
])
{
{
key
:
'points'
,
url
:
'/points'
}
,
withoutIcons
.
push
(
field
)
{
key
:
'redeem'
,
url
:
'/redeem'
}
,
}
{
key
:
'pointsCard'
,
url
:
'/points-card'
}
})
]
if
(
withoutIcons
.
length
>
0
)
{
console
.
log
(
'[Footer] 没有图标的社交媒体:'
,
withoutIcons
)
}
}
// 延迟检查,确保 config 已加载
setTimeout
(
checkSocialMediaWithoutIcons
,
1000
)
}
// 合作伙伴链接
const
partnerLinks
=
[
{
key
:
'becomeSupplier'
,
url
:
'/become-supplier'
}
,
{
key
:
'supplierLogin'
,
url
:
'/supplier-login'
}
,
{
key
:
'rezio'
,
url
:
'/rezio'
}
,
{
key
:
'cooperation'
,
url
:
'/cooperation'
}
,
{
key
:
'affiliate'
,
url
:
'/affiliate'
}
]
// 支付方式图标(使用 Keenicons,通过全局组件 VIcon 渲染)
// 支付方式图标(使用 Keenicons,通过全局组件 VIcon 渲染)
const
paymentIcons
=
[
const
paymentIcons
=
[
{
key
:
'card'
,
icon
:
'two-credit-cart'
,
label
:
'Credit Card'
}
,
{
key
:
'visa'
,
icon
:
''
,
label
:
'Visa'
,
url
:
'https://cdn.kkday.com/pc-web/assets/img/footer/payment/visa.svg'
},
{
key
:
'paypal'
,
icon
:
'paypal'
,
label
:
'PayPal'
}
,
{
key
:
'mastercard'
,
icon
:
''
,
label
:
'MasterCard'
,
url
:
'https://cdn.kkday.com/pc-web/assets/img/footer/payment/mastercard.svg'
},
{
key
:
'apple'
,
icon
:
'apple'
,
label
:
'Apple Pay'
}
,
{
key
:
'jcb'
,
icon
:
''
,
label
:
'JCB'
,
url
:
'https://cdn.kkday.com/pc-web/assets/img/footer/payment/jcb.svg'
},
{
key
:
'google'
,
icon
:
'google-play'
,
label
:
'Google Pay'
}
,
{
key
:
'jko_pay'
,
icon
:
''
,
label
:
'JKO Pay'
,
url
:
'https://cdn.kkday.com/pc-web/assets/img/footer/payment/jko_pay.svg'
},
{
key
:
'apple_pay'
,
icon
:
''
,
label
:
'Apple Pay'
,
url
:
'https://cdn.kkday.com/pc-web/assets/img/footer/payment/apple_pay.svg'
},
{
key
:
'google_pay'
,
icon
:
''
,
label
:
'Google Pay'
,
url
:
'https://cdn.kkday.com/pc-web/assets/img/footer/payment/google_pay.svg'
},
{
key
:
'line_pay'
,
icon
:
''
,
label
:
'Line Pay'
,
url
:
'https://cdn.kkday.com/pc-web/assets/img/footer/payment/line_pay.svg'
},
]
]
// 版权信息
// 版权信息
const
copyright
=
computed
(()
=>
{
const
copyright
=
computed
(()
=>
{
return
systemConfigStore
.
copyright
||
`COPYRIGHT © ${new Date().getFullYear()
}
All rights reserved.`
return
systemConfigStore
.
platformConfig
?.
copyright
||
`COPYRIGHT ©
${
new
Date
().
getFullYear
()}
All rights reserved.`
})
})
// 订阅 Newsletter
// 订阅 Newsletter
...
...
src/layouts/components/HeaderTopBar.vue
View file @
d6fc4e78
<
template
>
<
template
>
<div
class=
"w-[1200px] py-2 flex items-center justify-between h-[60px] text-xs text-gray-700"
>
<div
class=
"w-[1200px]
mx-2
py-2 flex items-center justify-between h-[60px] text-xs text-gray-700"
>
<div
class=
"flex items-center gap-4"
>
<div
class=
"flex items-center gap-4"
>
<img
<img
v-if=
"logo"
v-if=
"logo"
...
...
src/layouts/components/Headers.vue
View file @
d6fc4e78
<
template
>
<
template
>
<header
class=
"app-header shadow-sm customPrimary-bg-7 flex flex-col items-center"
>
<header
class=
"app-header flex flex-col items-center pt-[60px]"
>
<HeaderTopBar
/>
<div
class=
"fixed top-0 left-0 right-[14px] z-10 shadow-sm customPrimary-bg-7 flex justify-center"
>
<HeaderTopBar
/>
</div>
<div
class=
"h-[1px] w-full bg-gray-700/5"
></div>
<div
class=
"h-[1px] w-full bg-gray-700/5"
></div>
<HeaderNavBar
/>
<HeaderNavBar
/>
</header>
</header>
...
...
src/stores/systemConfig.ts
View file @
d6fc4e78
...
@@ -152,7 +152,9 @@ export const useSystemConfigStore = defineStore('systemConfig', {
...
@@ -152,7 +152,9 @@ export const useSystemConfigStore = defineStore('systemConfig', {
getTopNavs
:
(
state
):
NavItemDto
[]
=>
{
getTopNavs
:
(
state
):
NavItemDto
[]
=>
{
return
state
.
navs
?.
filter
(
item
=>
item
.
type
===
1
)
||
[]
return
state
.
navs
?.
filter
(
item
=>
item
.
type
===
1
)
||
[]
},
},
getBottomNavs
:
(
state
):
NavItemDto
[]
=>
{
return
state
.
navs
?.
filter
(
item
=>
item
.
type
===
2
)
||
[]
},
},
},
actions
:
{
actions
:
{
async
getTenantAsync
(
tenantId
:
string
)
{
async
getTenantAsync
(
tenantId
:
string
)
{
...
...
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