Hanye官网
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

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