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.

about.vue 39KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002
  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-xs 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-2xl 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-xl font-bold mb-6 tracking-wide">
  107. {{ t('about.full.page.profile.mainTitle') }}
  108. </h3>
  109. <p
  110. class="text-zinc-300/80 text-sm 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-16">
  116. <div class="space-y-16">
  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-base font-bold mb-4 tracking-wide">
  121. {{ t('about.full.page.profile.item1.title') }}
  122. </h4>
  123. <p class="text-zinc-300/80 text-xs 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-16">
  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 class="flex items-start">
  491. <span class="text-[#35F1FF] w-32 flex-shrink-0 tracking-wide text-sm">{{ t('about.full.page.info.emailLabel') }}</span>
  492. <span class="text-zinc-300">{{ companyInfoData.email }}</span>
  493. </div>
  494. </div>
  495. <div class="space-y-10">
  496. <div class="flex items-start">
  497. <span class="text-[#35F1FF] w-32 flex-shrink-0 tracking-wide text-sm">{{ t('about.full.page.info.locationLabel') }}</span>
  498. <div class="text-zinc-300">
  499. <div>{{ t('about.full.page.info.locationValue1') }}</div>
  500. <div class="text-xs text-zinc-400" v-html="t('about.companyInfo.location').replace(/\n/g, '<br />')"></div>
  501. </div>
  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.businessLabel') }}</span>
  505. <span class="text-zinc-300">{{ t('about.full.page.info.businessValue') }}</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.telLabel') }}</span>
  509. <span class="text-zinc-300">{{ companyInfoData.tel }}</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. }
  817. #business-content {
  818. background: linear-gradient(to bottom, rgba(99, 102, 241, 0.1), transparent);
  819. }
  820. #philosophy {
  821. background: linear-gradient(to bottom, rgba(52, 211, 153, 0.1), transparent);
  822. }
  823. #company-info {
  824. background: linear-gradient(to bottom, rgba(251, 113, 133, 0.1), transparent);
  825. }
  826. #contact {
  827. background: linear-gradient(to bottom, rgba(251, 191, 36, 0.1), transparent);
  828. }
  829. /* 优化滚动条样式 */
  830. ::-webkit-scrollbar {
  831. width: 6px;
  832. }
  833. ::-webkit-scrollbar-track {
  834. background: rgba(0, 0, 0, 0.1);
  835. }
  836. ::-webkit-scrollbar-thumb {
  837. background: rgba(53, 241, 255, 0.3);
  838. border-radius: 3px;
  839. transition: background 0.3s ease;
  840. }
  841. ::-webkit-scrollbar-thumb:hover {
  842. background: rgba(53, 241, 255, 0.5);
  843. }
  844. /* 优化背景装饰 */
  845. .bg-decoration {
  846. position: absolute;
  847. inset: 0;
  848. opacity: 0.05;
  849. pointer-events: none;
  850. }
  851. .bg-decoration-circle {
  852. position: absolute;
  853. border-radius: 50%;
  854. filter: blur(80px);
  855. transition: all 0.5s ease;
  856. }
  857. /* 优化标题颜色 */
  858. #company-profile h2 {
  859. color: #35f1ff;
  860. }
  861. #business-content h2 {
  862. color: #818cf8;
  863. }
  864. #philosophy h2 {
  865. color: #34d399;
  866. }
  867. #company-info h2 {
  868. color: #fb7185;
  869. }
  870. #contact h2 {
  871. color: #fbbf24;
  872. }
  873. /* 优化装饰线颜色 */
  874. #company-profile .animate-line-expand {
  875. background: rgba(53, 241, 255, 0.6);
  876. }
  877. #business-content .animate-line-expand {
  878. background: rgba(99, 102, 241, 0.6);
  879. }
  880. #philosophy .animate-line-expand {
  881. background: rgba(52, 211, 153, 0.6);
  882. }
  883. #company-info .animate-line-expand {
  884. background: rgba(251, 113, 133, 0.6);
  885. }
  886. #contact .animate-line-expand {
  887. background: rgba(251, 191, 36, 0.6);
  888. }
  889. /* 响应式优化 */
  890. @media (max-width: 1024px) {
  891. .anchor-nav {
  892. display: none;
  893. }
  894. }
  895. @media (max-width: 768px) {
  896. .max-w-2xl,
  897. .max-w-3xl,
  898. .max-w-4xl {
  899. max-width: 100%;
  900. }
  901. .grid-cols-2, .grid-cols-3 {
  902. grid-template-columns: 1fr;
  903. }
  904. .grid-cols-4 {
  905. grid-template-columns: 1fr 1fr;
  906. }
  907. .gap-32 {
  908. gap: 3rem;
  909. }
  910. }
  911. @media (max-width: 640px) {
  912. .py-48 { padding-top: 5rem; padding-bottom: 5rem; }
  913. .py-40 { padding-top: 4rem; padding-bottom: 4rem; }
  914. .mb-40 { margin-bottom: 6rem; }
  915. .mb-32 { margin-bottom: 5rem; }
  916. .space-y-48 { gap: 6rem; }
  917. .text-3xl { font-size: 1.875rem; }
  918. .text-2xl { font-size: 1.5rem; }
  919. .pl-12 { padding-left: 2rem; }
  920. .pl-8 { padding-left: 1.5rem; }
  921. }
  922. </style>