Hanye官网
您最多选择25个主题 主题必须以字母或数字开头,可以包含连字符 (-),并且长度不得超过35个字符

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