newsDetail.vue 23 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618
  1. <script setup>
  2. import { onMounted, ref } from 'vue';
  3. import Layout from '../components/common/Layout.vue';
  4. import { useRouter, useRoute } from 'vue-router';
  5. const router = useRouter();
  6. const route = useRoute();
  7. const goBack = () => {
  8. // 返回到上一页
  9. if (window.history.length > 1) {
  10. router.go(-1); // 使用浏览器历史记录返回上一页
  11. } else {
  12. router.push({ path: '/news' }); // 如果没有历史记录,跳转到新闻列表页
  13. }
  14. };
  15. const id = ref('');
  16. // 字体大小切换
  17. const fontSizeLevel = ref(0); // 0-小 1-中 2-大
  18. const fontSizeMap = ['1.2rem', '1.56rem', '2.04rem'];
  19. const lineHeightMap = ['2.1rem', '2.7rem', '3.5rem'];
  20. const setFontSize = (level) => {
  21. fontSizeLevel.value = level;
  22. };
  23. onMounted(() => {
  24. // 从路由参数获取公司ID
  25. console.log('当前路由参数:', route.params);
  26. id.value = route.params.id || route.query.id;
  27. console.log('接收到的路由参数 ID:', id.value);
  28. })
  29. function openLowRes(src, maxWidth = 1200) {
  30. if (!src) return;
  31. const img = new Image();
  32. img.crossOrigin = 'anonymous';
  33. img.onload = () => {
  34. const ratio = Math.min(1, maxWidth / img.width);
  35. const w = Math.max(1, Math.round(img.width * ratio));
  36. const h = Math.max(1, Math.round(img.height * ratio));
  37. const canvas = document.createElement('canvas');
  38. canvas.width = w;
  39. canvas.height = h;
  40. const ctx = canvas.getContext('2d');
  41. ctx.drawImage(img, 0, 0, w, h);
  42. // 输出为 jpeg,质量 0.85,可根据需要调低以进一步减小文件大小
  43. canvas.toBlob((blob) => {
  44. if (!blob) return;
  45. const url = URL.createObjectURL(blob);
  46. window.open(url, '_blank');
  47. // 延迟 revoke,确保新窗口加载完成
  48. setTimeout(() => URL.revokeObjectURL(url), 10000);
  49. }, 'image/jpeg', 0.85);
  50. };
  51. img.onerror = () => {
  52. // 失败时直接打开原图(备用)
  53. window.open(src, '_blank');
  54. };
  55. img.src = src;
  56. }
  57. </script>
  58. <template>
  59. <div>
  60. <Layout>
  61. <div class="detailBox">
  62. <div class="back">
  63. <img src="../assets/images/back.png" alt="" @click="goBack">
  64. <div class="font-size-control">
  65. <span class="font-size-label">字体大小:</span>
  66. <div class="font-size-switch">
  67. <button
  68. class="font-a-btn" :class="{ active: fontSizeLevel === 0 }"
  69. @click="setFontSize(0)">A</button>
  70. <button
  71. class="font-a-btn font-a-middle" :class="{ active: fontSizeLevel === 1 }"
  72. @click="setFontSize(1)">A</button>
  73. <button
  74. class="font-a-btn font-a-large" :class="{ active: fontSizeLevel === 2 }"
  75. @click="setFontSize(2)">A</button>
  76. </div>
  77. </div>
  78. </div>
  79. <div class="detailContainer">
  80. <div class="detailTitle">
  81. <slot name="title">
  82. <span>
  83. <template v-if="id == 1">
  84. {{ $t('message.newsTitle') }}
  85. <br />{{ $t('message.newsTitle1') }}
  86. </template>
  87. <template v-else-if="id == 2">
  88. {{ $t('message.newsTitle2') }}
  89. </template>
  90. <template v-else-if="id == 3">
  91. {{ $t('message.newsTitle3') }}
  92. </template>
  93. <!-- <template v-else-if="id == 4">
  94. 国际集团举办《哪吒2》主题观影活动
  95. </template> -->
  96. <template v-else-if="id == 9">
  97. {{ $t('message.newsTitle4') }}
  98. </template>
  99. <template v-else-if="id == 10">
  100. {{ $t('message.newsTitle5') }}
  101. </template>
  102. <template v-else-if="id == 6">
  103. {{ $t('message.newsTitle6') }}
  104. </template>
  105. <template v-else-if="id == 7">
  106. {{ $t('message.newsTitle7') }}
  107. <br />
  108. {{ $t('message.newsTitle8') }}
  109. <br />
  110. {{ $t('message.newsTitle9') }}
  111. </template>
  112. <template v-else-if="id == 11">
  113. {{ $t('message.newsTitle10') }}
  114. </template>
  115. <template v-else-if="id == 12">
  116. {{ $t('message.newsTitle11') }}
  117. </template>
  118. <template v-else-if="id == 13">
  119. {{ $t('message.newsTitle12') }}
  120. </template>
  121. </span>
  122. </slot>
  123. </div>
  124. <div class="detailDate">
  125. <template v-if="id == 1">2025-06-27</template>
  126. <template v-else-if="id == 2">2025-08-27</template>
  127. <template v-else-if="id == 3">2025-04-01</template>
  128. <template v-else-if="id == 4">2025-03-10</template>
  129. <template v-else-if="id == 5">2025-02-13</template>
  130. <template v-else-if="id == 6">2025-01-23</template>
  131. <template v-else-if="id == 7">2025-01-20</template>
  132. <template v-else-if="id == 9">2025-08-18</template>
  133. <template v-else-if="id == 10">2025-07-18</template>
  134. <template v-else-if="id == 11">2025-07-10</template>
  135. <template v-else-if="id == 12">2025-06-05</template>
  136. <template v-else-if="id == 13">2025-01-07</template>
  137. </div>
  138. <div v-if="id == 1">
  139. <div class="newspic">
  140. <img
  141. src="../assets/images/newsPic/jnt.png" alt=""
  142. oncontextmenu="return false" @dblclick="openLowRes($event.target.src, 900)">
  143. </div>
  144. <div
  145. class="detailContent"
  146. :style="{ fontSize: fontSizeMap[fontSizeLevel], lineHeight: lineHeightMap[fontSizeLevel] }">
  147. <div>
  148. {{ $t('message.newsContent') }}
  149. </div>
  150. </div>
  151. </div>
  152. <div v-if="id == 2">
  153. <div class="newspic">
  154. <img
  155. src="../assets/images/newIndex/80zhounian.jpg" oncontextmenu="return false" alt=""
  156. style="cursor:pointer;" @dblclick="openLowRes($event.target.src, 900)">
  157. </div>
  158. <div
  159. class="detailContent"
  160. :style="{ fontSize: fontSizeMap[fontSizeLevel], lineHeight: lineHeightMap[fontSizeLevel] }">
  161. <div>
  162. {{ $t('message.newsContent1') }}
  163. </div>
  164. <div>
  165. {{ $t('message.newsContent2') }}
  166. </div>
  167. <div>
  168. {{ $t('message.newsContent3') }}
  169. </div>
  170. <div>
  171. {{ $t('message.newsContent4') }}
  172. </div>
  173. </div>
  174. </div>
  175. <div v-if="id == 3">
  176. <div class="newspic">
  177. <img
  178. src="../assets/images/newsPic/ball1.png" alt="" oncontextmenu="return false"
  179. style="cursor:pointer;" @dblclick="openLowRes($event.target.src, 900)">
  180. <img
  181. src="../assets/images/newsPic/ball2.png" alt="" oncontextmenu="return false"
  182. style="cursor:pointer;" @dblclick="openLowRes($event.target.src, 900)">
  183. </div>
  184. <div
  185. class="detailContent"
  186. :style="{ fontSize: fontSizeMap[fontSizeLevel], lineHeight: lineHeightMap[fontSizeLevel] }">
  187. <div>
  188. {{ $t('message.newsContent5') }}
  189. </div>
  190. </div>
  191. </div>
  192. <!-- <div v-if="id == 4">
  193. <div class="detailImg">
  194. <img src="../assets/images/newsPic/ez.png" alt="" oncontextmenu="return false" style="cursor:pointer;"
  195. @dblclick="openLowRes($event.target.src, 900)">
  196. <img src="../assets/images/newsPic/ez1.png" alt="" oncontextmenu="return false" style="cursor:pointer;"
  197. @dblclick="openLowRes($event.target.src, 900)">
  198. </div>
  199. <div class="detailContent"
  200. :style="{ fontSize: fontSizeMap[fontSizeLevel], lineHeight: lineHeightMap[fontSizeLevel] }">
  201. <div>
  202. 2025年2月26日,国际集团组织员工及家属集体观看国产动画《哪吒2》。影片以传统神话为根基,通过前沿数字技术与东方美学叙事的深度融合,以哪吒"逆天改命"的成长史诗,生动诠释了中华文明"自强不息"的精神内核。
  203. </div>
  204. <div>
  205. 多名员工表示,这场视听盛宴不仅让传统文化"活起来",更让文化自信"强起来"——既为中华文明"守正创新"的基因所震撼,也为身为文化传承者深感自豪。
  206. </div>
  207. <div>
  208. 此次活动是国际集团深化企业文化建设的重要实践。通过将传统文化精髓与企业精神相融合,让员工在文化浸润中形成共鸣与价值共识,并转化为推动企业发展的精神动能,为企业高质量发展注入可持续动能。
  209. </div>
  210. </div>
  211. </div> -->
  212. <div v-if="id == 5">
  213. <div class="newspic">
  214. <img
  215. src="../assets/images/newsPic/kaigong.png" alt="" oncontextmenu="return false"
  216. style="cursor:pointer;" @dblclick="openLowRes($event.target.src, 900)">
  217. </div>
  218. <div
  219. class="detailContent"
  220. :style="{ fontSize: fontSizeMap[fontSizeLevel], lineHeight: lineHeightMap[fontSizeLevel] }">
  221. <div>
  222. {{ $t('message.newsContent6') }}
  223. </div>
  224. <div>
  225. {{ $t('message.newsContent7') }}
  226. </div>
  227. <div>
  228. {{ $t('message.newsContent8') }}
  229. </div>
  230. </div>
  231. </div>
  232. <div v-if="id == 6">
  233. <div class="newspic">
  234. <img
  235. src="../assets/images/newsPic/yigong.png" alt="" oncontextmenu="return false"
  236. style="cursor:pointer;" @dblclick="openLowRes($event.target.src, 900)">
  237. </div>
  238. <div
  239. class="detailContent"
  240. :style="{ fontSize: fontSizeMap[fontSizeLevel], lineHeight: lineHeightMap[fontSizeLevel] }">
  241. <div>
  242. {{ $t('message.newsContent9') }}
  243. </div>
  244. </div>
  245. <div class="newspic1">
  246. <img
  247. src="../assets/images/newsPic/yigong1.png" alt="" oncontextmenu="return false"
  248. style="cursor:pointer;" @dblclick="openLowRes($event.target.src, 900)">
  249. </div>
  250. <div
  251. class="detailContent"
  252. :style="{ fontSize: fontSizeMap[fontSizeLevel], lineHeight: lineHeightMap[fontSizeLevel] }">
  253. <div>
  254. {{ $t('message.newsContent10') }}
  255. </div>
  256. </div>
  257. </div>
  258. <div v-if="id == 7">
  259. <div class="newspic">
  260. <img
  261. src="../assets/images/newsPic/jingshen.png" alt="" oncontextmenu="return false"
  262. style="cursor:pointer;" @dblclick="openLowRes($event.target.src, 900)">
  263. </div>
  264. <div
  265. class="detailContent"
  266. :style="{ fontSize: fontSizeMap[fontSizeLevel], lineHeight: lineHeightMap[fontSizeLevel] }">
  267. <div>
  268. {{ $t('message.newsContent11') }}
  269. </div>
  270. <div>
  271. {{ $t('message.newsContent12') }}
  272. </div>
  273. <div>
  274. {{ $t('message.newsContent13') }}
  275. </div>
  276. <div>
  277. {{ $t('message.newsContent14') }}
  278. </div>
  279. <div>
  280. {{ $t('message.newsContent15') }}
  281. </div>
  282. <div>
  283. {{ $t('message.newsContent16') }}
  284. </div>
  285. <div>
  286. {{ $t('message.newsContent17') }}
  287. </div>
  288. </div>
  289. </div>
  290. <div v-if="id == 9">
  291. <div
  292. class="detailContent"
  293. :style="{ fontSize: fontSizeMap[fontSizeLevel], lineHeight: lineHeightMap[fontSizeLevel] }">
  294. <div>
  295. {{ $t('message.newsContent18') }}
  296. </div>
  297. <div class="newspic">
  298. <img
  299. src="../assets/images/newsPic/guanaishequ.png" alt="" oncontextmenu="return false"
  300. style="cursor:pointer;" @dblclick="openLowRes($event.target.src, 900)">
  301. </div>
  302. <div
  303. class="detailContent"
  304. :style="{ fontSize: fontSizeMap[fontSizeLevel], lineHeight: lineHeightMap[fontSizeLevel] }">
  305. <div>
  306. {{ $t('message.newsContent19') }}
  307. </div>
  308. </div>
  309. <div class="newspic1">
  310. <img
  311. src="../assets/images/newsPic/guanaishequ1.png" alt="" oncontextmenu="return false"
  312. style="cursor:pointer;" @dblclick="openLowRes($event.target.src, 900)">
  313. </div>
  314. <div
  315. class="detailContent"
  316. :style="{ fontSize: fontSizeMap[fontSizeLevel], lineHeight: lineHeightMap[fontSizeLevel] }">
  317. <div>
  318. {{ $t('message.newsContent20') }}
  319. </div>
  320. </div>
  321. </div>
  322. </div>
  323. <div v-if="id == 10">
  324. <div class="newspic">
  325. <img
  326. src="../assets/images/newsPic/lifa.png" alt="" oncontextmenu="return false"
  327. style="cursor:pointer;" @dblclick="openLowRes($event.target.src, 900)">
  328. </div>
  329. <div
  330. class="detailContent"
  331. :style="{ fontSize: fontSizeMap[fontSizeLevel], lineHeight: lineHeightMap[fontSizeLevel] }">
  332. <div>
  333. {{ $t('message.newsContent21') }}
  334. </div>
  335. <div>
  336. {{ $t('message.newsContent22') }}
  337. </div>
  338. </div>
  339. </div>
  340. <div v-if="id == 11">
  341. <div class="newspic" style="margin-bottom: 0.5rem;">
  342. <img
  343. src="../assets/images/newsPic/jiang.png" alt="" oncontextmenu="return false"
  344. style="cursor:pointer;" @dblclick="openLowRes($event.target.src, 900)">
  345. </div>
  346. <div style="font-size: 0.9rem; text-align: center; ">
  347. {{ $t('message.newsContent23') }}
  348. </div>
  349. <div class="newspic">
  350. <img
  351. src="../assets/images/newsPic/jiang1.png" alt="" oncontextmenu="return false"
  352. style="cursor:pointer;" @dblclick="openLowRes($event.target.src, 900)">
  353. </div>
  354. <div
  355. class="detailContent"
  356. :style="{ fontSize: fontSizeMap[fontSizeLevel], lineHeight: lineHeightMap[fontSizeLevel] }">
  357. <div>
  358. {{ $t('message.newsContent24') }}
  359. </div>
  360. <div>
  361. {{ $t('message.newsContent25') }}
  362. </div>
  363. </div>
  364. </div>
  365. <div v-if="id == 12">
  366. <div class="newspic">
  367. <img
  368. src="../assets/images/newsPic/fadian.png" alt="" oncontextmenu="return false"
  369. style="cursor:pointer;" @dblclick="openLowRes($event.target.src, 900)">
  370. </div>
  371. <div
  372. class="detailContent"
  373. :style="{ fontSize: fontSizeMap[fontSizeLevel], lineHeight: lineHeightMap[fontSizeLevel] }">
  374. <div>
  375. {{ $t('message.newsContent26') }}
  376. </div>
  377. <div>
  378. {{ $t('message.newsContent27') }}
  379. </div>
  380. <div>
  381. {{ $t('message.newsContent28') }}
  382. </div>
  383. </div>
  384. </div>
  385. <div v-if="id == 13">
  386. <div
  387. class="detailContent"
  388. :style="{ fontSize: fontSizeMap[fontSizeLevel], lineHeight: lineHeightMap[fontSizeLevel] }">
  389. <div>
  390. {{ $t('message.newsContent29') }}
  391. </div>
  392. <div>
  393. {{ $t('message.newsContent30') }}
  394. </div>
  395. </div>
  396. <div class="newspic">
  397. <img
  398. src="../assets/images/newsPic/yundonghui.png" alt="" oncontextmenu="return false"
  399. style="cursor:pointer;" @dblclick="openLowRes($event.target.src, 900)">
  400. </div>
  401. </div>
  402. </div>
  403. </div>
  404. </Layout>
  405. </div>
  406. </template>
  407. <style scoped>
  408. .detailBox {
  409. width: 100%;
  410. /* border-top: 2px solid #E5E5E5; */
  411. margin-top: 10rem;
  412. }
  413. .detailTitle {
  414. margin: 0 auto;
  415. font-size: 1.8rem;
  416. font-weight: 550;
  417. margin-top: 2rem;
  418. text-align: center;
  419. display: flex;
  420. align-items: center;
  421. justify-content: center;
  422. gap: 1.2rem;
  423. }
  424. .font-size-control {
  425. display: flex;
  426. align-items: center;
  427. gap: 0.8rem;
  428. }
  429. .font-size-label {
  430. font-size: 1rem;
  431. color: #333;
  432. white-space: nowrap;
  433. }
  434. .font-size-switch {
  435. display: flex;
  436. gap: 0.3rem;
  437. }
  438. .font-a-btn {
  439. width: 2.2rem;
  440. height: 2.2rem;
  441. border: 1px solid #ddd;
  442. background: white;
  443. color: #333;
  444. font-weight: bold;
  445. cursor: pointer;
  446. display: flex;
  447. align-items: center;
  448. justify-content: center;
  449. transition: all 0.2s;
  450. border-radius: 2px;
  451. font-size: 1rem;
  452. }
  453. .font-a-btn.font-a-middle {
  454. font-size: 1.1rem;
  455. }
  456. .font-a-btn.font-a-large {
  457. font-size: 1.25rem;
  458. }
  459. .font-a-btn.active {
  460. background: #409eff;
  461. border-color: #409eff;
  462. color: white;
  463. }
  464. .font-a-btn:hover:not(.active) {
  465. border-color: #409eff;
  466. color: #409eff;
  467. }
  468. .detailDate {
  469. position: relative;
  470. font-size: 1.2rem;
  471. color: #888;
  472. text-align: center;
  473. margin: 1rem auto 0;
  474. padding-bottom: 1rem;
  475. border-bottom: 1px solid #eee;
  476. }
  477. .detailContainer {
  478. width: 65%;
  479. margin: 0 auto;
  480. margin-top: 7rem;
  481. }
  482. .detailImg {
  483. width: 80%;
  484. height: 25rem;
  485. margin: 2rem auto;
  486. display: flex;
  487. justify-content: center;
  488. >img {
  489. height: 100%;
  490. width: 65%;
  491. }
  492. @media screen and (max-width: 767px) {
  493. width: 80%;
  494. height: 12rem;
  495. }
  496. >img:nth-child(1) {
  497. width: 23%;
  498. }
  499. }
  500. .newspic {
  501. width: 80%;
  502. margin: 2rem auto;
  503. >img {
  504. width: 100%;
  505. height: 100%;
  506. margin-top: 1rem;
  507. }
  508. }
  509. .newspic1 {
  510. width: 50%;
  511. margin: 1rem auto;
  512. >img {
  513. width: 100%;
  514. height: 100%;
  515. margin-top: 1rem;
  516. }
  517. }
  518. .detailContent {
  519. /* 字体大小由内联style控制 */
  520. line-height: 2.1rem;
  521. color: #333;
  522. margin-top: 2rem;
  523. >div {
  524. text-indent: 2em;
  525. }
  526. }
  527. .back {
  528. position: fixed;
  529. left: 16.5%;
  530. top: 9.1rem;
  531. display: flex;
  532. justify-content: space-between;
  533. align-items: center;
  534. cursor: pointer;
  535. /* margin: 1rem auto 1rem; */
  536. font-size: 1.5rem;
  537. width: 65%;
  538. height: 2rem;
  539. z-index: 9999;
  540. padding: 1rem 2rem;
  541. background-color: #f8f9fa;
  542. border-radius: 4px;
  543. >img {
  544. width: 2rem;
  545. height: 2rem;
  546. cursor: pointer;
  547. }
  548. @media screen and (min-width: 768px) and (max-width: 1024px) {
  549. top: 8.3rem;
  550. }
  551. @media screen and (max-width: 767px) {
  552. top: 8rem;
  553. }
  554. }
  555. </style>