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

about.vue 9.8KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329
  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>
  12. <!-- 面包屑导航 -->
  13. <div class="max-w-full mb-6 xl:px-2 lg:px-2 md:px-4 px-4 mt-6">
  14. <div class="max-w-screen-2xl mx-auto">
  15. <nuxt-link
  16. :to="`${homepagePath}/`"
  17. class="justify-start text-white/60 text-base font-normal hover:text-white transition-colors duration-300"
  18. >{{ t("common.home") }}</nuxt-link
  19. >
  20. <span class="text-white/60 text-base font-normal px-2"> / </span>
  21. <span class="text-white text-base font-normal">{{
  22. t("about.overview.title")
  23. }}</span>
  24. </div>
  25. </div>
  26. <!-- 顶部大标题 -->
  27. <div class="flex flex-col items-center justify-center px-2 mb-10">
  28. <h1
  29. class="text-white text-5xl font-bold mb-4 tracking-tight text-center"
  30. >
  31. {{ t("about.companyInfo.name") }}
  32. </h1>
  33. <div
  34. class="text-[#71717A] text-xl leading-relaxed text-center max-w-2xl break-words whitespace-pre-wrap"
  35. >
  36. {{ t("about.companyInfo.description") }}
  37. </div>
  38. </div>
  39. <!-- 横向三栏分区卡片 -->
  40. <div
  41. class="w-full flex flex-col lg:flex-row gap-8 justify-center items-stretch max-w-screen-2xl mx-auto px-2 mb-20"
  42. >
  43. <!-- 公司信息卡片 -->
  44. <div
  45. class="flex-1 bg-zinc-900/95 backdrop-blur-sm rounded-xl p-8 border border-zinc-800/50 shadow-lg flex flex-col gap-6 min-w-[260px]"
  46. >
  47. <h2
  48. class="text-white text-2xl font-semibold mb-2 tracking-tight relative"
  49. >
  50. {{ t("about.overview.companyInfo") }}
  51. <span
  52. class="absolute -bottom-2 left-0 w-12 h-1 bg-cyan-400 rounded-full"
  53. ></span>
  54. </h2>
  55. <div class="flex flex-col gap-3">
  56. <div class="flex flex-col gap-1">
  57. <span class="text-[#71717A] text-base">{{
  58. t("about.overview.companyName")
  59. }}</span>
  60. <span class="text-white text-lg font-bold">{{
  61. t("about.companyInfo.name")
  62. }}</span>
  63. </div>
  64. <div class="flex flex-col gap-1">
  65. <span class="text-[#71717A] text-base">{{
  66. t("about.overview.englishName")
  67. }}</span>
  68. <span class="text-white text-lg font-bold">{{
  69. t("about.companyInfo.englishName")
  70. }}</span>
  71. </div>
  72. <div class="flex flex-col gap-1">
  73. <span class="text-[#71717A] text-base">{{
  74. t("about.overview.established")
  75. }}</span>
  76. <span class="text-white text-lg font-bold">{{
  77. t("about.companyInfo.established")
  78. }}</span>
  79. </div>
  80. <div class="flex flex-col gap-1">
  81. <span class="text-[#71717A] text-base">{{
  82. t("about.overview.ceo")
  83. }}</span>
  84. <span class="text-white text-lg font-bold">{{
  85. t("about.companyInfo.ceo")
  86. }}</span>
  87. </div>
  88. <div class="flex flex-col gap-1">
  89. <span class="text-[#71717A] text-base">{{
  90. t("about.overview.employees")
  91. }}</span>
  92. <span class="text-white text-lg font-bold">{{
  93. t("about.companyInfo.employees")
  94. }}</span>
  95. </div>
  96. <div class="flex flex-col gap-1">
  97. <span class="text-[#71717A] text-base">{{
  98. t("about.overview.location")
  99. }}</span>
  100. <span class="text-white text-lg font-bold">{{
  101. t("about.companyInfo.location")
  102. }}</span>
  103. </div>
  104. </div>
  105. </div>
  106. <!-- 经营理念卡片 -->
  107. <div
  108. class="flex-1 bg-zinc-900/95 backdrop-blur-sm rounded-xl p-8 border border-zinc-800/50 shadow-lg flex flex-col gap-6 min-w-[260px]"
  109. >
  110. <h2
  111. class="text-white text-2xl font-semibold mb-2 tracking-tight relative"
  112. >
  113. {{ t("about.overview.philosophy") }}
  114. <span
  115. class="absolute -bottom-2 left-0 w-12 h-1 bg-cyan-400 rounded-full"
  116. ></span>
  117. </h2>
  118. <div class="text-[#71717A] text-lg leading-relaxed">
  119. {{ t("about.companyInfo.philosophy") }}
  120. </div>
  121. </div>
  122. <!-- 联系方式卡片 -->
  123. <div
  124. class="flex-1 bg-zinc-900/95 backdrop-blur-sm rounded-xl p-8 border border-zinc-800/50 shadow-lg flex flex-col gap-6 min-w-[260px]"
  125. >
  126. <h2
  127. class="text-white text-2xl font-semibold mb-2 tracking-tight relative"
  128. >
  129. {{ t("about.overview.contact") }}
  130. <span
  131. class="absolute -bottom-2 left-0 w-12 h-1 bg-cyan-400 rounded-full"
  132. ></span>
  133. </h2>
  134. <div class="flex flex-col gap-3">
  135. <div class="flex flex-col gap-1">
  136. <span class="text-[#71717A] text-base">{{
  137. t("about.overview.email")
  138. }}</span>
  139. <a
  140. :href="'mailto:' + companyInfo.email"
  141. class="text-white text-lg font-bold hover:text-cyan-400 transition-colors"
  142. >{{ companyInfo.email }}</a
  143. >
  144. </div>
  145. <div class="flex flex-col gap-1">
  146. <span class="text-[#71717A] text-base">{{
  147. t("about.overview.tel")
  148. }}</span>
  149. <a
  150. :href="'tel:' + companyInfo.tel.replace(/[^0-9]/g, '')"
  151. class="text-white text-lg font-bold hover:text-cyan-400 transition-colors"
  152. >{{ companyInfo.tel }}</a
  153. >
  154. </div>
  155. <div class="flex flex-col gap-1">
  156. <span class="text-[#71717A] text-base">{{
  157. t("about.overview.fax")
  158. }}</span>
  159. <span class="text-white text-lg font-bold">{{
  160. companyInfo.fax
  161. }}</span>
  162. </div>
  163. <div class="flex flex-col gap-1">
  164. <span class="text-[#71717A] text-base">{{
  165. t("about.overview.businessHours")
  166. }}</span>
  167. <span class="text-white text-lg font-bold">{{
  168. t("about.companyInfo.businessHours")
  169. }}</span>
  170. </div>
  171. </div>
  172. <div class="flex flex-col gap-1 mt-2">
  173. <span class="text-[#71717A] text-base">{{
  174. t("about.overview.businessActivities")
  175. }}</span>
  176. <div class="text-white text-base font-bold space-y-1">
  177. <p>
  178. {{ t("about.companyInfo.businessActivities") }}
  179. </p>
  180. </div>
  181. </div>
  182. </div>
  183. </div>
  184. </div>
  185. </ErrorBoundary>
  186. </div>
  187. </template>
  188. <script setup lang="ts">
  189. /**
  190. * 公司简介页面
  191. * 展示公司基本信息、理念等
  192. */
  193. import { useErrorHandler } from "~/composables/useErrorHandler";
  194. import { useI18n } from "vue-i18n";
  195. const { t, locale } = useI18n();
  196. // 公司信息接口定义
  197. interface CompanyInfo {
  198. email: string;
  199. tel: string;
  200. fax: string;
  201. }
  202. const homepagePath = computed(() => {
  203. return locale.value === "zh" ? "" : `/${locale.value}`;
  204. });
  205. const { error, isLoading, wrapAsync } = useErrorHandler();
  206. const companyInfo = ref<CompanyInfo>({
  207. email: "hanye@hanye.cn",
  208. tel: "86)024-8399-0696",
  209. fax: "86)024-8399-0696",
  210. });
  211. // SEO优化
  212. useHead({
  213. title: `${t("about.title")} - Hanye`,
  214. meta: [
  215. {
  216. name: "description",
  217. content: t("about.description"),
  218. },
  219. {
  220. name: "keywords",
  221. content: t("about.keywords"),
  222. },
  223. ],
  224. });
  225. </script>
  226. <style scoped>
  227. /* 信息卡片效果 */
  228. .info-card {
  229. transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1);
  230. }
  231. .info-card:hover {
  232. transform: translateY(-2px);
  233. box-shadow: 0 4px 6px -1px rgba(0, 0, 0, 0.1),
  234. 0 2px 4px -1px rgba(0, 0, 0, 0.06);
  235. }
  236. /* 动画效果 */
  237. @keyframes float {
  238. 0%,
  239. 100% {
  240. transform: translateY(0) scale(1);
  241. opacity: 0.9;
  242. }
  243. 50% {
  244. transform: translateY(-5px) scale(1.2);
  245. opacity: 1;
  246. }
  247. }
  248. .animate-float {
  249. animation: float 3s ease-in-out infinite;
  250. }
  251. @keyframes spin-slow {
  252. from {
  253. transform: rotate(0deg);
  254. }
  255. to {
  256. transform: rotate(360deg);
  257. }
  258. }
  259. @keyframes spin-slow-reverse {
  260. from {
  261. transform: rotate(360deg);
  262. }
  263. to {
  264. transform: rotate(0deg);
  265. }
  266. }
  267. .animate-spin-slow {
  268. animation: spin-slow 120s linear infinite;
  269. transform-origin: center;
  270. }
  271. .animate-spin-slow-reverse {
  272. animation: spin-slow-reverse 100s linear infinite;
  273. transform-origin: center;
  274. }
  275. @keyframes dash {
  276. from {
  277. stroke-dashoffset: 500;
  278. }
  279. to {
  280. stroke-dashoffset: 0;
  281. }
  282. }
  283. .animate-dash {
  284. stroke-dasharray: 5, 5;
  285. animation: dash 10s linear infinite;
  286. }
  287. .animate-dash-delay {
  288. stroke-dasharray: 5, 5;
  289. animation: dash 10s linear infinite;
  290. animation-delay: 3s;
  291. }
  292. .animate-pulse {
  293. animation: pulse 2s ease-in-out infinite;
  294. }
  295. @keyframes pulse {
  296. 0%,
  297. 100% {
  298. opacity: 1;
  299. filter: drop-shadow(0 0 2px rgba(59, 130, 246, 0.6));
  300. }
  301. 50% {
  302. opacity: 0.7;
  303. filter: drop-shadow(0 0 5px rgba(59, 130, 246, 0.9));
  304. }
  305. }
  306. /* 其他样式保持不变 */
  307. </style>