Hanye官网
Ви не можете вибрати більше 25 тем Теми мають розпочинатися з літери або цифри, можуть містити дефіси (-) і не повинні перевищувати 35 символів.

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027
  1. <template>
  2. <div>
  3. <div class="w-full h-[55px] sm:h-[72px]"></div>
  4. <ErrorBoundary :error="error">
  5. <div v-if="isLoading" class="flex justify-center py-12">
  6. <!-- 加载中 -->
  7. <div
  8. class="animate-spin h-8 w-8 border-4 border-cyan-400 rounded-full border-t-transparent"
  9. ></div>
  10. </div>
  11. <div v-else class="scroll-smooth">
  12. <!-- 右侧锚点导航 -->
  13. <div
  14. class="fixed right-8 top-1/2 transform -translate-y-1/2 z-50 hidden lg:block"
  15. >
  16. <nav class="flex flex-col space-y-4">
  17. <button
  18. v-for="section in sections"
  19. :key="section.id"
  20. @click="scrollToSection(section.id)"
  21. class="group relative flex items-center"
  22. :class="{
  23. 'opacity-100': currentSection === section.id,
  24. 'opacity-50 hover:opacity-100': currentSection !== section.id,
  25. }"
  26. >
  27. <span
  28. class="w-2 h-2 rounded-full bg-[#35F1FF] transition-all duration-300"
  29. :class="{ 'scale-150': currentSection === section.id }"
  30. ></span>
  31. <span
  32. class="ml-3 text-sm text-white transition-all duration-300 transform translate-x-0 opacity-0 group-hover:translate-x-0 group-hover:opacity-100"
  33. :class="{
  34. 'translate-x-0 opacity-100': currentSection === section.id,
  35. }"
  36. >{{ section.name }}</span
  37. >
  38. </button>
  39. </nav>
  40. </div>
  41. <!-- 顶部横幅 (v-if="false" 保持原样, 但内容已准备好国际化) -->
  42. <div v-if="false" class="w-full select-none">
  43. <div
  44. class="max-w-screen-2xl mx-auto h-[70vh] relative overflow-hidden"
  45. >
  46. <div
  47. class="w-full h-full relative z-30 flex flex-col text-center justify-center items-center transform transition-transform duration-1000"
  48. :style="{ transform: `translateY(${scrollY * 0.5}px)` }"
  49. >
  50. <h1
  51. class="text-white text-5xl font-bold mb-6 tracking-wider animate-title-in"
  52. >
  53. {{ t('about.full.page.banner.title') }}
  54. </h1>
  55. <div
  56. class="w-24 h-px bg-[#35F1FF]/60 mx-auto mb-8 animate-line-expand"
  57. ></div>
  58. <p
  59. class="text-zinc-300/80 text-lg max-w-2xl mx-auto leading-relaxed animate-fade-in-delay"
  60. >
  61. {{ t('about.full.page.banner.subtitle') }}
  62. </p>
  63. </div>
  64. <div
  65. class="absolute inset-0 bg-gradient-to-b from-black/60 via-black/40 to-black/60 z-20"
  66. ></div>
  67. <video
  68. autoplay
  69. muted
  70. loop
  71. poster="/assets/videos/about.webp"
  72. class="w-full h-full object-cover absolute z-10 left-0 right-0 top-0 bottom-0"
  73. src="/assets/videos/about.mp4"
  74. ></video>
  75. </div>
  76. </div>
  77. <!-- 关于我们 (公司简介) -->
  78. <div
  79. id="company-profile"
  80. class="section-block w-full bg-gradient-to-b from-zinc-900 via-zinc-800/80 to-zinc-900 py-40 relative overflow-hidden"
  81. ref="companyProfileRef"
  82. >
  83. <!-- 商务风格背景图 -->
  84. <div class="absolute inset-0 bg-business-overlay"></div>
  85. <!-- 添加pattern遮罩层 -->
  86. <div class="absolute inset-0 bg-[url('~/assets/images/pattern.png')] bg-[100px_100px] bg-repeat"></div>
  87. <div class="absolute inset-0 bg-gradient-to-b from-black/70 via-black/50 to-black/70"></div>
  88. <div class="max-w-screen-2xl mx-auto px-4 sm:px-6 lg:px-8 relative z-10">
  89. <div class="text-center mb-32 animate-fade-in">
  90. <h2
  91. class="section-title text-[#35F1FF] text-sm font-bold mb-4 tracking-[0.2em] animate-slide-in-left"
  92. >
  93. {{ t('about.full.page.profile.sectionTitle') }}
  94. </h2>
  95. <h1
  96. class="text-zinc-300 text-3xl font-bold mb-6 tracking-wider animate-slide-in-right"
  97. >
  98. {{ t('about.full.page.profile.titleEn') }}
  99. </h1>
  100. <div
  101. class="w-16 h-px bg-[#35F1FF]/60 mx-auto animate-line-expand"
  102. ></div>
  103. </div>
  104. <div class="max-w-4xl mx-auto">
  105. <div class="mb-32 text-center">
  106. <h3 class="text-white text-2xl font-bold mb-8 tracking-wide">
  107. {{ t('about.full.page.profile.mainTitle') }}
  108. </h3>
  109. <p
  110. class="text-zinc-300/80 text-base leading-relaxed max-w-2xl mx-auto"
  111. >
  112. {{ t('about.full.page.profile.mainDescription') }}
  113. </p>
  114. </div>
  115. <div class="grid grid-cols-1 md:grid-cols-2 gap-32">
  116. <div class="space-y-24">
  117. <div class="relative">
  118. <div class="absolute -left-6 top-0 w-px h-full bg-[#35F1FF]/60"></div>
  119. <div class="pl-8">
  120. <h4 class="text-[#35F1FF] text-lg font-bold mb-6 tracking-wide">
  121. {{ t('about.full.page.profile.item1.title') }}
  122. </h4>
  123. <p class="text-zinc-300/80 text-sm leading-relaxed">
  124. {{ t('about.full.page.profile.item1.description') }}
  125. </p>
  126. </div>
  127. </div>
  128. <div class="relative">
  129. <div class="absolute -left-6 top-0 w-px h-full bg-[#35F1FF]/60"></div>
  130. <div class="pl-8">
  131. <h4 class="text-[#35F1FF] text-lg font-bold mb-6 tracking-wide">
  132. {{ t('about.full.page.profile.item2.title') }}
  133. </h4>
  134. <p class="text-zinc-300/80 text-sm leading-relaxed">
  135. {{ t('about.full.page.profile.item2.description') }}
  136. </p>
  137. </div>
  138. </div>
  139. </div>
  140. <div class="space-y-24">
  141. <div class="relative">
  142. <div class="absolute -left-6 top-0 w-px h-full bg-[#35F1FF]/60"></div>
  143. <div class="pl-8">
  144. <h4 class="text-[#35F1FF] text-lg font-bold mb-6 tracking-wide">
  145. {{ t('about.full.page.profile.item3.title') }}
  146. </h4>
  147. <p class="text-zinc-300/80 text-sm leading-relaxed">
  148. {{ t('about.full.page.profile.item3.description') }}
  149. </p>
  150. </div>
  151. </div>
  152. <div class="relative">
  153. <div class="absolute -left-6 top-0 w-px h-full bg-[#35F1FF]/60"></div>
  154. <div class="pl-8">
  155. <h4 class="text-[#35F1FF] text-lg font-bold mb-6 tracking-wide">
  156. {{ t('about.full.page.profile.item4.title') }}
  157. </h4>
  158. <p class="text-zinc-300/80 text-sm leading-relaxed">
  159. {{ t('about.full.page.profile.item4.description') }}
  160. </p>
  161. </div>
  162. </div>
  163. </div>
  164. </div>
  165. </div>
  166. </div>
  167. </div>
  168. <!-- 业务内容 -->
  169. <div
  170. id="business-content"
  171. class="section-block w-full bg-gradient-to-b from-indigo-900/60 via-indigo-800/40 to-indigo-900/60 py-48 relative overflow-hidden"
  172. ref="businessContentRef"
  173. >
  174. <div class="bg-decoration">
  175. <div class="bg-decoration-circle top-0 left-0 w-96 h-96 bg-indigo-500 transform -translate-x-1/2 -translate-y-1/2 animate-float"></div>
  176. <div class="bg-decoration-circle bottom-0 right-0 w-96 h-96 bg-indigo-500 transform translate-x-1/2 translate-y-1/2 animate-float-delay"></div>
  177. <div class="bg-decoration-circle top-1/2 left-1/2 w-64 h-64 bg-indigo-500 transform -translate-x-1/2 -translate-y-1/2 animate-pulse-slow"></div>
  178. </div>
  179. <div class="max-w-screen-2xl mx-auto px-4 sm:px-6 lg:px-8 relative">
  180. <div class="text-center mb-40">
  181. <h2 class="text-indigo-400 text-sm font-bold mb-4 tracking-[0.2em]">
  182. {{ t('about.full.page.business.sectionTitle') }}
  183. </h2>
  184. <h1 class="text-zinc-300 text-3xl font-bold mb-6 tracking-wider">
  185. {{ t('about.full.page.business.titleEn') }}
  186. </h1>
  187. <div class="w-16 h-px bg-indigo-400/60 mx-auto mb-8"></div>
  188. <p
  189. class="text-zinc-300/80 text-base max-w-2xl mx-auto leading-relaxed"
  190. v-html="t('about.full.page.business.description').replace(/\n/g, '<br class=\'hidden sm:block\' />')"
  191. ></p>
  192. </div>
  193. <div class="space-y-48">
  194. <!-- 存储产品的研发 -->
  195. <div class="relative group">
  196. <div class="absolute -left-8 top-0 w-px h-full bg-[#35F1FF]/60 transition-all duration-300 group-hover:h-[calc(100%+2rem)] group-hover:-top-4"></div>
  197. <div class="pl-12">
  198. <div class="flex items-center space-x-6 mb-12">
  199. <div class="text-[#35F1FF] text-3xl font-bold tracking-tight">01</div>
  200. <h3 class="text-white text-2xl font-bold tracking-wide">
  201. {{ t('about.full.page.business.item1.title') }}
  202. </h3>
  203. </div>
  204. <p class="text-zinc-300/80 text-sm leading-relaxed mb-16 max-w-2xl">
  205. {{ t('about.full.page.business.item1.description') }}
  206. </p>
  207. <div class="grid grid-cols-2 md:grid-cols-4 gap-12">
  208. <div class="group/item">
  209. <div class="text-[#35F1FF] text-xl font-bold mb-4 group-hover/item:scale-105 transition-all duration-300">
  210. {{ t('about.full.page.business.item1.subItem1.title') }}
  211. </div>
  212. <div class="text-zinc-300/80 text-sm relative">
  213. {{ t('about.full.page.business.item1.subItem1.description') }}
  214. <div class="absolute -bottom-2 left-0 w-0 h-px bg-[#35F1FF]/60 transition-all duration-300 group-hover/item:w-full"></div>
  215. </div>
  216. </div>
  217. <div class="group/item">
  218. <div class="text-[#35F1FF] text-xl font-bold mb-4 group-hover/item:scale-105 transition-all duration-300">
  219. {{ t('about.full.page.business.item1.subItem2.title') }}
  220. </div>
  221. <div class="text-zinc-300/80 text-sm relative">
  222. {{ t('about.full.page.business.item1.subItem2.description') }}
  223. <div class="absolute -bottom-2 left-0 w-0 h-px bg-[#35F1FF]/60 transition-all duration-300 group-hover/item:w-full"></div>
  224. </div>
  225. </div>
  226. <div class="group/item">
  227. <div class="text-[#35F1FF] text-xl font-bold mb-4 group-hover/item:scale-105 transition-all duration-300">
  228. {{ t('about.full.page.business.item1.subItem3.title') }}
  229. </div>
  230. <div class="text-zinc-300/80 text-sm relative">
  231. {{ t('about.full.page.business.item1.subItem3.description') }}
  232. <div class="absolute -bottom-2 left-0 w-0 h-px bg-[#35F1FF]/60 transition-all duration-300 group-hover/item:w-full"></div>
  233. </div>
  234. </div>
  235. <div class="group/item">
  236. <div class="text-[#35F1FF] text-xl font-bold mb-4 group-hover/item:scale-105 transition-all duration-300">
  237. {{ t('about.full.page.business.item1.subItem4.title') }}
  238. </div>
  239. <div class="text-zinc-300/80 text-sm relative">
  240. {{ t('about.full.page.business.item1.subItem4.description') }}
  241. <div class="absolute -bottom-2 left-0 w-0 h-px bg-[#35F1FF]/60 transition-all duration-300 group-hover/item:w-full"></div>
  242. </div>
  243. </div>
  244. </div>
  245. </div>
  246. </div>
  247. <!-- 提供存储解决方案 -->
  248. <div class="relative group">
  249. <div class="absolute -left-8 top-0 w-px h-full bg-[#35F1FF]/60 transition-all duration-300 group-hover:h-[calc(100%+2rem)] group-hover:-top-4"></div>
  250. <div class="pl-12">
  251. <div class="flex items-center space-x-6 mb-12">
  252. <div class="text-[#35F1FF] text-3xl font-bold tracking-tight">02</div>
  253. <h3 class="text-white text-2xl font-bold tracking-wide">
  254. {{ t('about.full.page.business.item2.title') }}
  255. </h3>
  256. </div>
  257. <p class="text-zinc-300/80 text-sm leading-relaxed mb-16 max-w-2xl">
  258. {{ t('about.full.page.business.item2.description') }}
  259. </p>
  260. <div class="grid grid-cols-1 md:grid-cols-2 gap-16">
  261. <div class="group/item">
  262. <h4 class="text-[#35F1FF] text-lg font-bold mb-8 relative inline-block tracking-wide">
  263. {{ t('about.full.page.business.item2.consumer.title') }}
  264. <div class="absolute -bottom-2 left-0 w-0 h-px bg-[#35F1FF]/60 transition-all duration-300 group-hover/item:w-full"></div>
  265. </h4>
  266. <div class="space-y-8">
  267. <div class="flex items-center space-x-4 group/list">
  268. <div class="w-1.5 h-1.5 bg-[#35F1FF]/60 rounded-full transition-transform duration-300 group-hover/list:scale-125"></div>
  269. <span class="text-zinc-300/80 text-sm">{{ t('about.full.page.business.item2.consumer.item1') }}</span>
  270. </div>
  271. <div class="flex items-center space-x-4 group/list">
  272. <div class="w-1.5 h-1.5 bg-[#35F1FF]/60 rounded-full transition-transform duration-300 group-hover/list:scale-125"></div>
  273. <span class="text-zinc-300/80 text-sm">{{ t('about.full.page.business.item2.consumer.item2') }}</span>
  274. </div>
  275. <div class="flex items-center space-x-4 group/list">
  276. <div class="w-1.5 h-1.5 bg-[#35F1FF]/60 rounded-full transition-transform duration-300 group-hover/list:scale-125"></div>
  277. <span class="text-zinc-300/80 text-sm">{{ t('about.full.page.business.item2.consumer.item3') }}</span>
  278. </div>
  279. </div>
  280. </div>
  281. <div class="group/item">
  282. <h4 class="text-[#35F1FF] text-lg font-bold mb-8 relative inline-block tracking-wide">
  283. {{ t('about.full.page.business.item2.industrial.title') }}
  284. <div class="absolute -bottom-2 left-0 w-0 h-px bg-[#35F1FF]/60 transition-all duration-300 group-hover/item:w-full"></div>
  285. </h4>
  286. <div class="space-y-8">
  287. <div class="flex items-center space-x-4 group/list">
  288. <div class="w-1.5 h-1.5 bg-[#35F1FF]/60 rounded-full transition-transform duration-300 group-hover/list:scale-125"></div>
  289. <span class="text-zinc-300/80 text-sm">{{ t('about.full.page.business.item2.industrial.item1') }}</span>
  290. </div>
  291. <div class="flex items-center space-x-4 group/list">
  292. <div class="w-1.5 h-1.5 bg-[#35F1FF]/60 rounded-full transition-transform duration-300 group-hover/list:scale-125"></div>
  293. <span class="text-zinc-300/80 text-sm">{{ t('about.full.page.business.item2.industrial.item2') }}</span>
  294. </div>
  295. <div class="flex items-center space-x-4 group/list">
  296. <div class="w-1.5 h-1.5 bg-[#35F1FF]/60 rounded-full transition-transform duration-300 group-hover/list:scale-125"></div>
  297. <span class="text-zinc-300/80 text-sm">{{ t('about.full.page.business.item2.industrial.item3') }}</span>
  298. </div>
  299. </div>
  300. </div>
  301. </div>
  302. </div>
  303. </div>
  304. <!-- 技术支持与品质管理 -->
  305. <div class="relative group">
  306. <div class="absolute -left-8 top-0 w-px h-full bg-[#35F1FF]/60 transition-all duration-300 group-hover:h-[calc(100%+2rem)] group-hover:-top-4"></div>
  307. <div class="pl-12">
  308. <div class="flex items-center space-x-6 mb-12">
  309. <div class="text-[#35F1FF] text-3xl font-bold tracking-tight">03</div>
  310. <h3 class="text-white text-2xl font-bold tracking-wide">
  311. {{ t('about.full.page.business.item3.title') }}
  312. </h3>
  313. </div>
  314. <p class="text-zinc-300/80 text-sm leading-relaxed mb-16 max-w-2xl">
  315. {{ t('about.full.page.business.item3.description') }}
  316. </p>
  317. <div class="grid grid-cols-1 md:grid-cols-2 gap-16">
  318. <div class="group/item">
  319. <h4 class="text-[#35F1FF] text-xl font-bold mb-8 relative inline-block tracking-wide">
  320. {{ t('about.full.page.business.item3.support.title') }}
  321. <div class="absolute -bottom-2 left-0 w-0 h-px bg-[#35F1FF]/60 transition-all duration-300 group-hover/item:w-full"></div>
  322. </h4>
  323. <div class="space-y-8">
  324. <div class="flex items-center space-x-4 group/list">
  325. <div class="w-1.5 h-1.5 bg-[#35F1FF]/60 rounded-full transition-transform duration-300 group-hover/list:scale-125"></div>
  326. <span class="text-zinc-300/80 text-sm">{{ t('about.full.page.business.item3.support.item1') }}</span>
  327. </div>
  328. <div class="flex items-center space-x-4 group/list">
  329. <div class="w-1.5 h-1.5 bg-[#35F1FF]/60 rounded-full transition-transform duration-300 group-hover/list:scale-125"></div>
  330. <span class="text-zinc-300/80 text-sm">{{ t('about.full.page.business.item3.support.item2') }}</span>
  331. </div>
  332. <div class="flex items-center space-x-4 group/list">
  333. <div class="w-1.5 h-1.5 bg-[#35F1FF]/60 rounded-full transition-transform duration-300 group-hover/list:scale-125"></div>
  334. <span class="text-zinc-300/80 text-sm">{{ t('about.full.page.business.item3.support.item3') }}</span>
  335. </div>
  336. </div>
  337. </div>
  338. <div class="group/item">
  339. <h4 class="text-[#35F1FF] text-xl font-bold mb-8 relative inline-block tracking-wide">
  340. {{ t('about.full.page.business.item3.quality.title') }}
  341. <div class="absolute -bottom-2 left-0 w-0 h-px bg-[#35F1FF]/60 transition-all duration-300 group-hover/item:w-full"></div>
  342. </h4>
  343. <div class="space-y-8">
  344. <div class="flex items-center space-x-4 group/list">
  345. <div class="w-1.5 h-1.5 bg-[#35F1FF]/60 rounded-full transition-transform duration-300 group-hover/list:scale-125"></div>
  346. <span class="text-zinc-300/80 text-sm">{{ t('about.full.page.business.item3.quality.item1') }}</span>
  347. </div>
  348. <div class="flex items-center space-x-4 group/list">
  349. <div class="w-1.5 h-1.5 bg-[#35F1FF]/60 rounded-full transition-transform duration-300 group-hover/list:scale-125"></div>
  350. <span class="text-zinc-300/80 text-sm">{{ t('about.full.page.business.item3.quality.item2') }}</span>
  351. </div>
  352. <div class="flex items-center space-x-4 group/list">
  353. <div class="w-1.5 h-1.5 bg-[#35F1FF]/60 rounded-full transition-transform duration-300 group-hover/list:scale-125"></div>
  354. <span class="text-zinc-300/80 text-sm">{{ t('about.full.page.business.item3.quality.item3') }}</span>
  355. </div>
  356. </div>
  357. </div>
  358. </div>
  359. </div>
  360. </div>
  361. <!-- 创新的研发与品质管理 -->
  362. <div class="relative group">
  363. <div class="absolute -left-8 top-0 w-px h-full bg-[#35F1FF]/60 transition-all duration-300 group-hover:h-[calc(100%+2rem)] group-hover:-top-4"></div>
  364. <div class="pl-12">
  365. <div class="flex items-center space-x-6 mb-12">
  366. <div class="text-[#35F1FF] text-3xl font-bold tracking-tight">04</div>
  367. <h3 class="text-white text-2xl font-bold tracking-wide">
  368. {{ t('about.full.page.business.item4.title') }}
  369. </h3>
  370. </div>
  371. <p class="text-zinc-300/80 text-sm leading-relaxed max-w-2xl">
  372. {{ t('about.full.page.business.item4.description') }}
  373. </p>
  374. </div>
  375. </div>
  376. </div>
  377. </div>
  378. </div>
  379. <!-- 经营理念 -->
  380. <div
  381. id="philosophy"
  382. class="section-block w-full bg-gradient-to-b from-emerald-900/60 via-emerald-800/40 to-emerald-900/60 py-40"
  383. ref="philosophyRef"
  384. >
  385. <div class="max-w-screen-2xl mx-auto px-4 sm:px-6 lg:px-8">
  386. <div class="text-center mb-32 animate-fade-in">
  387. <h2
  388. class="section-title text-emerald-400 text-sm font-bold mb-4 tracking-[0.2em] animate-slide-in-left"
  389. >
  390. {{ t('about.full.page.philosophy.sectionTitle') }}
  391. </h2>
  392. <h1
  393. class="text-zinc-300 text-3xl font-bold mb-6 tracking-wider animate-slide-in-right"
  394. >
  395. {{ t('about.full.page.philosophy.titleEn') }}
  396. </h1>
  397. <div
  398. class="w-16 h-px bg-emerald-400/60 mx-auto animate-line-expand"
  399. ></div>
  400. </div>
  401. <div class="grid grid-cols-1 md:grid-cols-3 gap-24">
  402. <div class="relative">
  403. <div class="absolute -left-4 top-0 w-px h-full bg-[#35F1FF]/60"></div>
  404. <div class="pl-8">
  405. <h3 class="text-white text-xl font-bold mb-6 tracking-wide">
  406. {{ t('about.full.page.philosophy.item1.title') }}
  407. </h3>
  408. <p class="text-zinc-300/80 text-sm leading-relaxed">
  409. {{ t('about.full.page.philosophy.item1.description') }}
  410. </p>
  411. </div>
  412. </div>
  413. <div class="relative">
  414. <div class="absolute -left-4 top-0 w-px h-full bg-[#35F1FF]/60"></div>
  415. <div class="pl-8">
  416. <h3 class="text-white text-xl font-bold mb-6 tracking-wide">
  417. {{ t('about.full.page.philosophy.item2.title') }}
  418. </h3>
  419. <p class="text-zinc-300/80 text-sm leading-relaxed">
  420. {{ t('about.full.page.philosophy.item2.description') }}
  421. </p>
  422. </div>
  423. </div>
  424. <div class="relative">
  425. <div class="absolute -left-4 top-0 w-px h-full bg-[#35F1FF]/60"></div>
  426. <div class="pl-8">
  427. <h3 class="text-white text-xl font-bold mb-6 tracking-wide">
  428. {{ t('about.full.page.philosophy.item3.title') }}
  429. </h3>
  430. <p class="text-zinc-300/80 text-sm leading-relaxed">
  431. {{ t('about.full.page.philosophy.item3.description') }}
  432. </p>
  433. </div>
  434. </div>
  435. </div>
  436. <div class="mt-32 text-center">
  437. <p class="text-zinc-300/80 text-sm leading-relaxed max-w-3xl mx-auto">
  438. {{ t('about.full.page.philosophy.summary1') }}
  439. </p>
  440. <p class="text-zinc-300/80 text-sm leading-relaxed max-w-3xl mx-auto mt-8">
  441. {{ t('about.full.page.philosophy.summary2') }}
  442. </p>
  443. </div>
  444. </div>
  445. </div>
  446. <!-- 公司信息 -->
  447. <div
  448. id="company-info"
  449. class="section-block w-full bg-gradient-to-b from-rose-900/60 via-rose-800/40 to-rose-900/60 py-48"
  450. ref="companyInfoRef"
  451. >
  452. <div class="max-w-screen-2xl mx-auto px-4 sm:px-6 lg:px-8">
  453. <div class="text-center mb-24 animate-fade-in">
  454. <h2
  455. class="section-title text-rose-400 text-sm font-bold mb-4 tracking-[0.2em] animate-slide-in-left"
  456. >
  457. {{ t('about.full.page.info.sectionTitle') }}
  458. </h2>
  459. <h1
  460. class="text-zinc-300 text-3xl font-bold mb-6 tracking-wider animate-slide-in-right"
  461. >
  462. {{ t('about.full.page.info.titleEn') }}
  463. </h1>
  464. <div
  465. class="w-16 h-px bg-rose-400/60 mx-auto animate-line-expand"
  466. ></div>
  467. </div>
  468. <div class="max-w-3xl mx-auto">
  469. <div class="grid grid-cols-1 md:grid-cols-2 gap-16">
  470. <div class="space-y-10">
  471. <div class="flex items-start">
  472. <span class="text-[#35F1FF] w-32 flex-shrink-0 tracking-wide text-sm">{{ t('about.full.page.info.nameLabel') }}</span>
  473. <div class="text-zinc-300">
  474. <div>{{ t('about.companyInfo.companyName') }}</div>
  475. <div class="text-xs text-zinc-400">{{ t('about.companyInfo.englishName') }}</div>
  476. </div>
  477. </div>
  478. <div class="flex items-start">
  479. <span class="text-[#35F1FF] w-32 flex-shrink-0 tracking-wide text-sm">{{ t('about.full.page.info.establishedLabel') }}</span>
  480. <span class="text-zinc-300">{{ t('about.companyInfo.established') }}</span>
  481. </div>
  482. <div class="flex items-start">
  483. <span class="text-[#35F1FF] w-32 flex-shrink-0 tracking-wide text-sm">{{ t('about.full.page.info.ceoLabel') }}</span>
  484. <span class="text-zinc-300">{{ t('about.companyInfo.ceo') }}</span>
  485. </div>
  486. <div class="flex items-start">
  487. <span class="text-[#35F1FF] w-32 flex-shrink-0 tracking-wide text-sm">{{ t('about.full.page.info.employeesLabel') }}</span>
  488. <span class="text-zinc-300">{{ t('about.companyInfo.employees') }}</span>
  489. </div>
  490. </div>
  491. <div class="space-y-10">
  492. <div class="flex items-start">
  493. <span class="text-[#35F1FF] w-32 flex-shrink-0 tracking-wide text-sm">{{ t('about.full.page.info.locationLabel') }}</span>
  494. <div class="text-zinc-300">
  495. <div>{{ t('about.full.page.info.locationValue1') }}</div>
  496. <div class="text-xs text-zinc-400" v-html="t('about.companyInfo.location').replace(/\n/g, '<br />')"></div>
  497. </div>
  498. </div>
  499. <div class="flex items-start">
  500. <span class="text-[#35F1FF] w-32 flex-shrink-0 tracking-wide text-sm">{{ t('about.full.page.info.businessLabel') }}</span>
  501. <span class="text-zinc-300">{{ t('about.full.page.info.businessValue') }}</span>
  502. </div>
  503. <div class="flex items-start">
  504. <span class="text-[#35F1FF] w-32 flex-shrink-0 tracking-wide text-sm">{{ t('about.full.page.info.telLabel') }}</span>
  505. <span class="text-zinc-300">{{ companyInfoData.tel }}</span>
  506. </div>
  507. <div class="flex items-start">
  508. <span class="text-[#35F1FF] w-32 flex-shrink-0 tracking-wide text-sm">{{ t('about.full.page.info.emailLabel') }}</span>
  509. <span class="text-zinc-300">{{ companyInfoData.email }}</span>
  510. </div>
  511. </div>
  512. </div>
  513. </div>
  514. </div>
  515. </div>
  516. <!-- 产品咨询 -->
  517. <div id="contact" ref="contactRef" class="max-w-full h-[240px] md:h-[480px] bg-black/80 md:block">
  518. <div class="h-full relative">
  519. <div
  520. class="absolute top-0 left-0 w-full h-full flex flex-col gap-4 md:gap-6 items-center justify-center z-10 px-4"
  521. >
  522. <h1
  523. class="text-center text-white font-normal text-lg sm:text-xl md:text-3xl"
  524. >
  525. {{ t("products.consultation") }}
  526. </h1>
  527. <nuxt-link
  528. :to="`${homepagePath}/contact`"
  529. class="w-28 h-9 md:w-40 md:h-11 bg-zinc-300/10 rounded-lg outline outline-1 flex items-center justify-center gap-2 outline-white/20 backdrop-blur-[10px] cursor-pointer hover:bg-zinc-300/20 transition-colors duration-200"
  530. >
  531. <span class="text-sm md:text-base font-normal">{{
  532. t("products.consultation_button")
  533. }}</span>
  534. <i class="icon-arrow-right text-xs md:text-sm font-normal"></i>
  535. </nuxt-link>
  536. </div>
  537. <img
  538. v-if="isMobile"
  539. :src="videoWebp"
  540. alt="video"
  541. class="w-full h-full object-cover opacity-20"
  542. />
  543. <video
  544. v-else
  545. :src="videoSrc"
  546. autoplay
  547. muted
  548. loop
  549. :poster="videoWebp"
  550. class="w-full h-full object-cover opacity-20"
  551. ></video>
  552. </div>
  553. </div>
  554. </div>
  555. </ErrorBoundary>
  556. </div>
  557. </template>
  558. <script setup lang="ts">
  559. /**
  560. * 公司简介页面
  561. * 展示公司基本信息、理念等
  562. */
  563. import { useBreakpoints, breakpointsTailwind } from "@vueuse/core";
  564. import { useErrorHandler } from "~/composables/useErrorHandler";
  565. import { useI18n } from "vue-i18n";
  566. const { t, locale } = useI18n();
  567. // 是否移动端
  568. const breakpoints = useBreakpoints(breakpointsTailwind);
  569. const isMobile = breakpoints.smaller("md");
  570. import video from "@/assets/videos/video.mp4";
  571. import videoWebp from "@/assets/videos/video.webp";
  572. const videoSrc = ref(video);
  573. // 公司信息接口定义
  574. interface CompanyInfo {
  575. email: string;
  576. tel: string;
  577. fax: string;
  578. }
  579. const homepagePath = computed(() => {
  580. return locale.value === "zh" ? "" : `/${locale.value}`;
  581. });
  582. const { error, isLoading, wrapAsync } = useErrorHandler();
  583. const companyInfoData = ref<CompanyInfo>({
  584. email: "hanye@hanye.cn",
  585. tel: "+86-024-83990696",
  586. fax: "+86-024-83990696",
  587. });
  588. // 滚动相关
  589. const scrollY = ref(0);
  590. const companyProfileRef = ref<HTMLElement | null>(null);
  591. const businessContentRef = ref<HTMLElement | null>(null);
  592. const philosophyRef = ref<HTMLElement | null>(null);
  593. const companyInfoRef = ref<HTMLElement | null>(null);
  594. const contactRef = ref<HTMLElement | null>(null);
  595. // 定义区块信息 (使用 computed 确保 t 函数能响应语言切换)
  596. const sections = computed(() => [
  597. { id: "company-profile", name: t('about.full.nav.companyProfile') },
  598. { id: "business-content", name: t('about.full.nav.businessContent') },
  599. { id: "philosophy", name: t('about.full.nav.philosophy') },
  600. { id: "company-info", name: t('about.full.nav.companyInfo') },
  601. { id: "contact", name: t('about.full.nav.contact') },
  602. ]);
  603. // 当前激活的区块
  604. const currentSection = ref("company-profile"); // 默认激活第一个
  605. // 滚动到指定区块
  606. const scrollToSection = (id: string) => {
  607. const element = document.getElementById(id);
  608. if (element) {
  609. element.scrollIntoView({ behavior: "smooth" });
  610. }
  611. };
  612. // 监听滚动
  613. onMounted(() => {
  614. // 使用 Intersection Observer 优化性能和准确性
  615. const observerOptions = {
  616. root: null, // 视口
  617. rootMargin: '-20% 0px -20% 0px', // 提前触发动画
  618. threshold: [0, 0.1, 0.2, 0.3] // 多个阈值,更灵敏
  619. };
  620. const observerCallback = (entries: IntersectionObserverEntry[]) => {
  621. entries.forEach(entry => {
  622. if (entry.isIntersecting && entry.intersectionRatio > 0.1) {
  623. currentSection.value = entry.target.id;
  624. entry.target.classList.add('animate-in');
  625. }
  626. });
  627. };
  628. const observer = new IntersectionObserver(observerCallback, observerOptions);
  629. // 延迟确保 ref 已被正确赋值
  630. nextTick(() => {
  631. const sectionElements = [
  632. companyProfileRef.value,
  633. businessContentRef.value,
  634. philosophyRef.value,
  635. companyInfoRef.value,
  636. contactRef.value
  637. ];
  638. sectionElements.forEach(el => {
  639. if (el) {
  640. observer.observe(el);
  641. // 检查是否已经在视口中,如果是则立即显示
  642. const rect = el.getBoundingClientRect();
  643. const windowHeight = window.innerHeight;
  644. if (rect.top < windowHeight * 0.8 && rect.bottom > 0) {
  645. el.classList.add('animate-in');
  646. }
  647. }
  648. });
  649. });
  650. window.addEventListener("scroll", handleLegacyScroll);
  651. onUnmounted(() => {
  652. window.removeEventListener("scroll", handleLegacyScroll);
  653. observer.disconnect();
  654. });
  655. });
  656. // 处理滚动 (保留用于横幅视差效果和备用动画触发)
  657. const handleLegacyScroll = () => {
  658. scrollY.value = window.scrollY;
  659. // 备用动画触发机制
  660. const sections = [
  661. companyProfileRef.value,
  662. businessContentRef.value,
  663. philosophyRef.value,
  664. companyInfoRef.value,
  665. contactRef.value
  666. ];
  667. sections.forEach(section => {
  668. if (section && !section.classList.contains('animate-in')) {
  669. const rect = section.getBoundingClientRect();
  670. const windowHeight = window.innerHeight;
  671. // 当元素进入视口的80%时触发动画
  672. if (rect.top < windowHeight * 0.8 && rect.bottom > 0) {
  673. section.classList.add('animate-in');
  674. }
  675. }
  676. });
  677. };
  678. // SEO优化
  679. useHead({
  680. title: `${t("about.title")} - Hanye`,
  681. meta: [
  682. {
  683. name: "description",
  684. content: t("about.description"),
  685. },
  686. {
  687. name: "keywords",
  688. content: t("about.keywords"),
  689. },
  690. ],
  691. });
  692. </script>
  693. <style scoped>
  694. /* 商务风格背景图样式 */
  695. .bg-business-overlay {
  696. background-image: url('/assets/images/about.webp');
  697. background-size: cover;
  698. background-position: center;
  699. background-repeat: no-repeat;
  700. background-attachment: fixed;
  701. opacity: 0.3;
  702. transition: all 0.5s ease;
  703. }
  704. @media (max-width: 768px) {
  705. .bg-business-overlay {
  706. background-attachment: scroll; /* 移动端不支持 fixed */
  707. opacity: 0.2;
  708. }
  709. }
  710. /* 悬停效果 */
  711. #company-profile:hover .bg-business-overlay {
  712. opacity: 0.4;
  713. transform: scale(1.02);
  714. }
  715. #company-profile:hover {
  716. background: linear-gradient(to bottom, rgba(53, 241, 255, 0.08), rgba(53, 241, 255, 0.04));
  717. }
  718. /* 基础动画类 */
  719. .section-block {
  720. opacity: 0;
  721. transform: translateY(30px);
  722. transition: all 1s cubic-bezier(0.4, 0, 0.2, 1);
  723. position: relative;
  724. }
  725. .animate-in {
  726. opacity: 1 !important;
  727. transform: translateY(0) !important;
  728. }
  729. /* 优化动画效果 */
  730. @keyframes fadeInUp {
  731. from {
  732. opacity: 0;
  733. transform: translateY(30px);
  734. }
  735. to {
  736. opacity: 1;
  737. transform: translateY(0);
  738. }
  739. }
  740. .animate-fade-in {
  741. opacity: 0;
  742. animation: fadeInUp 1s cubic-bezier(0.4, 0, 0.2, 1) forwards;
  743. }
  744. .animate-fade-in-delay {
  745. opacity: 0;
  746. animation: fadeInUp 1s cubic-bezier(0.4, 0, 0.2, 1) 0.3s forwards;
  747. }
  748. @keyframes lineExpand {
  749. from {
  750. width: 0;
  751. opacity: 0;
  752. }
  753. to {
  754. width: 4rem;
  755. opacity: 1;
  756. }
  757. }
  758. .animate-line-expand {
  759. width: 0;
  760. opacity: 0;
  761. animation: lineExpand 1.2s cubic-bezier(0.4, 0, 0.2, 1) forwards;
  762. }
  763. @keyframes slideInLeft {
  764. from {
  765. opacity: 0;
  766. transform: translateX(-30px);
  767. }
  768. to {
  769. opacity: 1;
  770. transform: translateX(0);
  771. }
  772. }
  773. @keyframes slideInRight {
  774. from {
  775. opacity: 0;
  776. transform: translateX(30px);
  777. }
  778. to {
  779. opacity: 1;
  780. transform: translateX(0);
  781. }
  782. }
  783. .animate-slide-in-left {
  784. opacity: 0;
  785. animation: slideInLeft 1s cubic-bezier(0.4, 0, 0.2, 1) forwards;
  786. }
  787. .animate-slide-in-right {
  788. opacity: 0;
  789. animation: slideInRight 1s cubic-bezier(0.4, 0, 0.2, 1) forwards;
  790. }
  791. /* 模块特定的样式 */
  792. .section-block {
  793. position: relative;
  794. transition: all 0.5s ease;
  795. }
  796. .section-block::before {
  797. content: "";
  798. position: absolute;
  799. inset: 0;
  800. background: linear-gradient(
  801. 45deg,
  802. transparent,
  803. rgba(255, 255, 255, 0.03),
  804. transparent
  805. );
  806. opacity: 0;
  807. transition: opacity 0.5s ease;
  808. pointer-events: none;
  809. }
  810. .section-block:hover::before {
  811. opacity: 1;
  812. }
  813. /* 为每个模块添加特定的样式 */
  814. #company-profile {
  815. background: linear-gradient(to bottom, rgba(53, 241, 255, 0.1), transparent);
  816. border-top: 1px solid rgba(53, 241, 255, 0.2);
  817. border-bottom: 1px solid rgba(53, 241, 255, 0.2);
  818. }
  819. #business-content {
  820. background: linear-gradient(to bottom, rgba(99, 102, 241, 0.1), transparent);
  821. border-top: 1px solid rgba(99, 102, 241, 0.1);
  822. border-bottom: 1px solid rgba(99, 102, 241, 0.1);
  823. }
  824. #philosophy {
  825. background: linear-gradient(to bottom, rgba(52, 211, 153, 0.1), transparent);
  826. border-top: 1px solid rgba(52, 211, 153, 0.1);
  827. border-bottom: 1px solid rgba(52, 211, 153, 0.1);
  828. }
  829. #company-info {
  830. background: linear-gradient(to bottom, rgba(251, 113, 133, 0.1), transparent);
  831. border-top: 1px solid rgba(251, 113, 133, 0.1);
  832. border-bottom: 1px solid rgba(251, 113, 133, 0.1);
  833. }
  834. #contact {
  835. background: linear-gradient(to bottom, rgba(251, 191, 36, 0.1), transparent);
  836. border-top: 1px solid rgba(251, 191, 36, 0.1);
  837. border-bottom: 1px solid rgba(251, 191, 36, 0.1);
  838. }
  839. /* 优化滚动条样式 */
  840. ::-webkit-scrollbar {
  841. width: 6px;
  842. }
  843. ::-webkit-scrollbar-track {
  844. background: rgba(0, 0, 0, 0.1);
  845. }
  846. ::-webkit-scrollbar-thumb {
  847. background: rgba(53, 241, 255, 0.3);
  848. border-radius: 3px;
  849. transition: background 0.3s ease;
  850. }
  851. ::-webkit-scrollbar-thumb:hover {
  852. background: rgba(53, 241, 255, 0.5);
  853. }
  854. /* 优化背景装饰 */
  855. .bg-decoration {
  856. position: absolute;
  857. inset: 0;
  858. opacity: 0.05;
  859. pointer-events: none;
  860. }
  861. .bg-decoration-circle {
  862. position: absolute;
  863. border-radius: 50%;
  864. filter: blur(80px);
  865. transition: all 0.5s ease;
  866. }
  867. /* 添加模块分隔线 */
  868. .section-block::after {
  869. content: "";
  870. position: absolute;
  871. left: 0;
  872. right: 0;
  873. height: 1px;
  874. background: linear-gradient(
  875. to right,
  876. transparent,
  877. rgba(255, 255, 255, 0.1),
  878. transparent
  879. );
  880. opacity: 0.5;
  881. }
  882. /* 优化标题颜色 */
  883. #company-profile h2 {
  884. color: #35f1ff;
  885. }
  886. #business-content h2 {
  887. color: #818cf8;
  888. }
  889. #philosophy h2 {
  890. color: #34d399;
  891. }
  892. #company-info h2 {
  893. color: #fb7185;
  894. }
  895. #contact h2 {
  896. color: #fbbf24;
  897. }
  898. /* 优化装饰线颜色 */
  899. #company-profile .animate-line-expand {
  900. background: rgba(53, 241, 255, 0.6);
  901. }
  902. #business-content .animate-line-expand {
  903. background: rgba(99, 102, 241, 0.6);
  904. }
  905. #philosophy .animate-line-expand {
  906. background: rgba(52, 211, 153, 0.6);
  907. }
  908. #company-info .animate-line-expand {
  909. background: rgba(251, 113, 133, 0.6);
  910. }
  911. #contact .animate-line-expand {
  912. background: rgba(251, 191, 36, 0.6);
  913. }
  914. /* 响应式优化 */
  915. @media (max-width: 1024px) {
  916. .anchor-nav {
  917. display: none;
  918. }
  919. }
  920. @media (max-width: 768px) {
  921. .max-w-2xl,
  922. .max-w-3xl,
  923. .max-w-4xl {
  924. max-width: 100%;
  925. }
  926. .grid-cols-2, .grid-cols-3 {
  927. grid-template-columns: 1fr;
  928. }
  929. .grid-cols-4 {
  930. grid-template-columns: 1fr 1fr;
  931. }
  932. .gap-32 {
  933. gap: 3rem;
  934. }
  935. }
  936. @media (max-width: 640px) {
  937. .py-48 { padding-top: 5rem; padding-bottom: 5rem; }
  938. .py-40 { padding-top: 4rem; padding-bottom: 4rem; }
  939. .mb-40 { margin-bottom: 6rem; }
  940. .mb-32 { margin-bottom: 5rem; }
  941. .space-y-48 { gap: 6rem; }
  942. .text-3xl { font-size: 1.875rem; }
  943. .text-2xl { font-size: 1.5rem; }
  944. .pl-12 { padding-left: 2rem; }
  945. .pl-8 { padding-left: 1.5rem; }
  946. }
  947. </style>