General.vue 34 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296
  1. <template>
  2. <div class="general">
  3. <img
  4. class="map-mask"
  5. src="@/assets/images/mask-general-map.png"
  6. alt=""
  7. draggable="false"
  8. >
  9. <h1 :title="activeCorpInfo?.name || '上海市工业博物馆'">
  10. {{ activeCorpInfo?.name || '上海市工业博物馆' }}
  11. </h1>
  12. <form @submit.prevent="onSearch">
  13. <input
  14. v-model="filterKeyword"
  15. type="text"
  16. placeholder="请输入企业名称"
  17. >
  18. <button type="submit">
  19. <img
  20. class=""
  21. src="@/assets/images/icon_search.png"
  22. alt=""
  23. draggable="false"
  24. >
  25. </button>
  26. </form>
  27. <ul>
  28. <li
  29. v-for="(decade) in corpListMap.keys()"
  30. :key="decade"
  31. >
  32. <h2>
  33. <img
  34. class=""
  35. src="@/assets/images/decade-decorator-left.png"
  36. alt=""
  37. draggable="false"
  38. >
  39. <span>{{ decade }}</span>
  40. <img
  41. class=""
  42. src="@/assets/images/decade-decorator-right.png"
  43. alt=""
  44. draggable="false"
  45. >
  46. </h2>
  47. <div
  48. v-for="(corpItem) in corpListMap.get(decade)"
  49. :id="`corp-item-${corpItem.id}`"
  50. :key="corpItem.id"
  51. class="corp-item"
  52. :class="{
  53. active: activeCorpId === corpItem.id
  54. }"
  55. @click="onClickCorpItem(corpItem.id)"
  56. >
  57. <div class="item-icon" />
  58. <div class="verticle-line" />
  59. <span
  60. class="corp-name"
  61. :title="corpItem.name"
  62. >
  63. {{ corpItem.name }}
  64. </span>
  65. <span class="corp-time">
  66. {{ corpItem.createDay }}
  67. </span>
  68. </div>
  69. </li>
  70. </ul>
  71. <article v-if="activeCorpInfo && isShowDesc">
  72. <button
  73. class="close"
  74. @click="isShowDesc = false"
  75. />
  76. <h2 :title="activeCorpInfo.name">
  77. {{ activeCorpInfo.name + '111' }}
  78. </h2>
  79. <img
  80. class="splitter"
  81. src="@/assets/images/splitter.png"
  82. alt=""
  83. draggable="false"
  84. >
  85. <!-- 邵根修改1-大盒子包裹起来 -->
  86. <div class="G1MainBox">
  87. <!-- 类型 -->
  88. <div
  89. v-if="G4ResList.length"
  90. class="G1MainBox1"
  91. >
  92. <div class="G1MainBoxTit">
  93. 类型
  94. </div>
  95. <div class="G1MainBoxTabBox">
  96. <div
  97. v-for="item in G4ResList"
  98. :key="item.id"
  99. class="G1MainBoxTab"
  100. @click="$router.push(`/metaverse?id=${item.id}`)"
  101. >
  102. {{ item.name }}
  103. </div>
  104. </div>
  105. </div>
  106. <!-- 简介 -->
  107. <div class="G1MainBox2">
  108. <div class="G1MainBoxTit">
  109. 简介
  110. </div>
  111. <div
  112. v-if="bannerImgList.value.length"
  113. class="swiper-root"
  114. >
  115. <div class="swiper-button-prev" />
  116. <div class="swiper-button-next" />
  117. <div class="swiper-wrapper">
  118. <img
  119. v-for="(item, index) in bannerImgList.value"
  120. :key="index"
  121. class="banner swiper-slide"
  122. :src="`${prefix}/${item.filePath}`"
  123. alt=""
  124. draggable="false"
  125. >
  126. </div>
  127. </div>
  128. <div
  129. class="txt"
  130. v-html="activeCorpInfo?.description ? activeCorpInfo.description.replace(/\x20\x20/g, '&emsp;&emsp;') : ''"
  131. />
  132. </div>
  133. <!-- 人物 -->
  134. <div
  135. v-if="G4RenList.length"
  136. class="G1MainBox3"
  137. >
  138. <div class="G1MainBoxTit">
  139. 人物
  140. </div>
  141. <!-- G4RenList -->
  142. <div
  143. v-for="item in G4RenList"
  144. :key="item.id"
  145. class="G1RenBox"
  146. >
  147. <img
  148. v-if="item.thumb"
  149. :src="`${prefix}/${item.thumb}`"
  150. alt=""
  151. >
  152. <img
  153. v-else
  154. :src="require('@/assets/images/imgErr.jpg')"
  155. alt=""
  156. >
  157. <div class="G1RenBoxTxt">
  158. <h3>{{ item.name }}</h3>
  159. <p>&emsp;&emsp;{{ item.description }}</p>
  160. </div>
  161. </div>
  162. </div>
  163. </div>
  164. </article>
  165. <!-- element-ui的loading效果从调用到出现有延时,这期间要遮盖住组件 -->
  166. <div
  167. v-show="isShowLoadingMask"
  168. class="loading-mask"
  169. />
  170. </div>
  171. </template>
  172. <script>
  173. import {
  174. computed,
  175. onMounted,
  176. onUnmounted,
  177. watch,
  178. reactive,
  179. ref,
  180. nextTick,
  181. } from 'vue'
  182. import Swiper from 'swiper/bundle'
  183. import 'swiper/css/bundle'
  184. export default {
  185. name: 'GeneralView',
  186. components: {
  187. },
  188. setup() {
  189. const prefix = ref(process.env.VUE_APP_API_ORIGIN)
  190. const filterKeyword = ref('')
  191. // 初始化数据列表
  192. const corpListRaw = reactive({ value: null })
  193. const corpListMap = reactive(new Map())
  194. onMounted(async () => {
  195. corpListRaw.value = await api.getGeneralList()
  196. corpListRaw.value.forEach(element => {
  197. let decade = ''
  198. if (element.createDay.substring(0, 2) === '18') {
  199. decade = `十九世纪`
  200. } else if (element.createDay.substring(0, 2) === '19') {
  201. const decadeValue = element.createDay[2]
  202. decade = `上世纪${decadeValue}0年代`
  203. } else {
  204. const decadeValue = element.createDay[2]
  205. decade = `本世纪${decadeValue}0年代`
  206. }
  207. if (!corpListMap.get(decade)) {
  208. corpListMap.set(decade, [])
  209. }
  210. corpListMap.get(decade).push(element)
  211. })
  212. })
  213. // 自动选中第一个条目
  214. function selectFirstItemAuto() {
  215. onClickCorpItem(corpListRaw.value[0].id)
  216. }
  217. window.gMitt.on('RequestApiSuccess-general', selectFirstItemAuto)
  218. onUnmounted(() => {
  219. window.gMitt.off('RequestApiSuccess-general', selectFirstItemAuto)
  220. })
  221. // 搜索框功能
  222. watch(filterKeyword, utils.debounce(async (vNew) => {
  223. // 可能此前已经选中了某个企业,所以在更新列表前先清空选中状态
  224. for (let index = 0; index < corpListRaw.value.length; index++) {
  225. const element = corpListRaw.value[index]
  226. window.gUnityInst.SendMessage('Panel1', 'HideEnterprise', element.id) //隐藏某个企业
  227. window.gUnityInst.SendMessage('Panel1', 'HideEnterpriseName', element.id) //隐藏某个企业名称
  228. }
  229. isShowDesc.value = false
  230. activeCorpId.value = null
  231. corpListRaw.value = await api.getGeneralList({
  232. searchKey: vNew,
  233. })
  234. corpListMap.clear()
  235. corpListRaw.value.forEach(element => {
  236. let decade = ''
  237. if (element.createDay.substring(0, 2) === '18') {
  238. decade = `十九世纪`
  239. } else if (element.createDay.substring(0, 2) === '19') {
  240. const decadeValue = element.createDay[2]
  241. decade = `上世纪${decadeValue}0年代`
  242. } else {
  243. const decadeValue = element.createDay[2]
  244. decade = `本世纪${decadeValue}0年代`
  245. }
  246. if (!corpListMap.get(decade)) {
  247. corpListMap.set(decade, [])
  248. }
  249. corpListMap.get(decade).push(element)
  250. })
  251. }, 500, false), {
  252. immediate: true,
  253. })
  254. /**
  255. * swiper 相关
  256. */
  257. let swiper = null
  258. const activeSwiperItemIndex = ref(0)
  259. function initSwiper() {
  260. swiper = new Swiper('.swiper-root', {
  261. // pagination: {
  262. // el: '.swiper-pagination',
  263. // },
  264. // Navigation arrows
  265. navigation: {
  266. nextEl: '.swiper-button-next',
  267. prevEl: '.swiper-button-prev',
  268. },
  269. on: {
  270. afterInit: function (e) {
  271. activeSwiperItemIndex.value = e.activeIndex
  272. },
  273. slideChange: function (e) {
  274. activeSwiperItemIndex.value = e.activeIndex
  275. }
  276. }
  277. })
  278. }
  279. // 被选中的数据
  280. const activeCorpId = ref(null)
  281. const isShowDesc = ref(true)
  282. const activeCorpInfo = computed(() => {
  283. if (corpListRaw.value) {
  284. return corpListRaw.value.find((item) => {
  285. return item.id === activeCorpId.value
  286. })
  287. } else {
  288. return {}
  289. }
  290. })
  291. const bannerImgList = reactive({ value: [] })
  292. const G4ResList = ref([])
  293. // 人物列表
  294. const G4RenList = ref([])
  295. // 无论是网页里还是unity内部点击了企业,都调用这个
  296. function onClickCorpItem(id) {
  297. console.log('pppppppppp', id)
  298. // 被选中的,既显示位置又显示名字,还要有选中特效。在它之前的,只显示位置。
  299. let isFound = false
  300. for (let index = 0; index < corpListRaw.value.length; index++) {
  301. const element = corpListRaw.value[index]
  302. window.gUnityInst.SendMessage('Panel1', 'HideEnterprise', element.id) //隐藏某个企业
  303. window.gUnityInst.SendMessage('Panel1', 'HideEnterpriseName', element.id) //隐藏某个企业名称
  304. if (element.id === id) {
  305. isFound = true
  306. window.gUnityInst.SendMessage('Panel1', 'ShowEnterprise', element.id) //显示某个企业
  307. window.gUnityInst.SendMessage('Panel1', 'ShowEnterpriseName', element.id) //显示某个企业名称
  308. window.gUnityInst.SendMessage('Panel1', 'SetEnterpriseSelected', element.id) //高亮某个企业
  309. } else if (!isFound) {
  310. window.gUnityInst.SendMessage('Panel1', 'ShowEnterprise', element.id) //显示某个企业
  311. } else {
  312. }
  313. }
  314. // scroll into view
  315. const clickedElement = document.querySelector(`#corp-item-${id}`)
  316. if (clickedElement) {
  317. clickedElement.scrollIntoView()
  318. }
  319. // 显示详情界面
  320. activeCorpId.value = id
  321. isShowDesc.value = true
  322. // 详情界面图片
  323. if (activeCorpId.value) {
  324. api.getGeneralDetail(activeCorpId.value).then((res) => {
  325. // 回到顶部
  326. const scroolDom = document.querySelector('.G1MainBox')
  327. if (scroolDom) scroolDom.scrollTop = 0
  328. // 获取类型相关列表
  329. G4RenList.value = res.person
  330. // 获取 类型相关id
  331. let acIds = res.entity.mateIds
  332. if (acIds) {
  333. acIds = acIds.split(',')
  334. //[2,7,8]
  335. G4ResList.value = window.G4AllList.filter(v => acIds.includes(v.id + ''))
  336. } else G4ResList.value = []
  337. bannerImgList.value = res.file
  338. if (swiper) {
  339. swiper.destroy()
  340. }
  341. if (bannerImgList.value.length) {
  342. nextTick(() => {
  343. initSwiper()
  344. })
  345. }
  346. })
  347. } else {
  348. bannerImgList.value = []
  349. }
  350. }
  351. window.handleClickEnterprise = onClickCorpItem
  352. // loading mask相关
  353. const isShowLoadingMask = ref(true)
  354. onMounted(() => {
  355. setTimeout(() => {
  356. isShowLoadingMask.value = false
  357. }, 200)
  358. })
  359. // 从源宇宙跳到 总览
  360. onMounted(async () => {
  361. const url = window.location.href
  362. if (url.includes('id=')) {
  363. const id = url.split('id=')[1]
  364. // console.log('ppppppppppppppppp', id)
  365. setTimeout(() => {
  366. onClickCorpItem(Number(id))
  367. }, 1000)
  368. }
  369. })
  370. return {
  371. activeCorpId,
  372. activeCorpInfo,
  373. bannerImgList,
  374. corpListMap,
  375. filterKeyword,
  376. isShowDesc,
  377. isShowLoadingMask,
  378. onClickCorpItem,
  379. prefix,
  380. G4ResList,
  381. G4RenList
  382. }
  383. },
  384. data() {
  385. return {
  386. }
  387. },
  388. computed: {
  389. ...mapState([
  390. ]),
  391. },
  392. mounted() {
  393. },
  394. beforeUnmount() {
  395. },
  396. unmounted() {
  397. },
  398. methods: {
  399. ...mapMutations([
  400. ]),
  401. onSearch() {
  402. console.log('search!')
  403. }
  404. },
  405. }
  406. </script>
  407. <style lang="less" scoped>
  408. .general {
  409. height: 100%;
  410. >.map-mask {
  411. position: absolute;
  412. left: 0;
  413. top: 0;
  414. width: 100%;
  415. height: 100%;
  416. pointer-events: none;
  417. }
  418. >h1 {
  419. position: absolute;
  420. top: 51px;
  421. left: 81px;
  422. max-width: 50%;
  423. overflow: hidden;
  424. white-space: pre;
  425. text-overflow: ellipsis;
  426. font-size: 48px;
  427. font-family: Source Han Sans CN-Heavy, Source Han Sans CN;
  428. font-weight: 800;
  429. color: #FFFFFF;
  430. padding-top: 20px;
  431. padding-bottom: 20px;
  432. border-top: 1px solid rgba(217, 217, 217, 0.2);
  433. border-bottom: 1px solid rgba(217, 217, 217, 0.2);
  434. }
  435. >form {
  436. position: absolute;
  437. top: 196px;
  438. left: 81px;
  439. display: flex;
  440. align-items: center;
  441. >input {
  442. background: rgba(255, 255, 255, 0.1);
  443. border-radius: 3px 3px 3px 3px;
  444. border: 1px solid rgba(255, 255, 255, 0.5);
  445. width: 220px;
  446. height: 40px;
  447. padding-left: 13px;
  448. padding-right: 13px;
  449. font-size: 16px;
  450. font-family: Source Han Sans CN-Light, Source Han Sans CN;
  451. font-weight: 400;
  452. color: #FFFFFF;
  453. &:focus {
  454. border: 1px solid rgba(255, 255, 255, 1);
  455. }
  456. &::placeholder {
  457. font-size: 16px;
  458. font-family: Source Han Sans CN-Light, Source Han Sans CN;
  459. font-weight: 400;
  460. color: rgba(255, 255, 255, 0.5);
  461. }
  462. }
  463. >button {
  464. margin-left: 8px;
  465. width: 40px;
  466. height: 40px;
  467. background: rgba(255, 255, 255, 0.3);
  468. border-radius: 3px 3px 3px 3px;
  469. opacity: 1;
  470. border: 1px solid #FFFFFF;
  471. &:hover {
  472. background: rgba(255, 255, 255, 0.5);
  473. }
  474. >img {
  475. width: 100%;
  476. height: 100%;
  477. }
  478. }
  479. }
  480. >ul {
  481. position: absolute;
  482. top: 272px;
  483. left: 81px;
  484. max-height: calc(100% - 305px);
  485. overflow: auto;
  486. user-select: none;
  487. >li {
  488. display: block;
  489. color: #fff;
  490. >h2 {
  491. width: 323px;
  492. height: 47px;
  493. background: linear-gradient(92deg, rgba(176, 161, 121, 0) 0%, rgba(176, 161, 121, 0.3) 50%, rgba(176, 161, 121, 0) 100%);
  494. // border-radius: 3px;
  495. font-size: 16px;
  496. font-family: Source Han Sans CN-Bold, Source Han Sans CN;
  497. font-weight: bold;
  498. color: #FFFFFF;
  499. text-shadow: 0px 0px 5px #FFD15B;
  500. display: flex;
  501. justify-content: center;
  502. align-items: center;
  503. margin-bottom: 17px;
  504. >span {
  505. margin-left: 13px;
  506. margin-right: 13px;
  507. }
  508. >img {
  509. width: 60px;
  510. height: 15px;
  511. }
  512. }
  513. >.corp-item {
  514. position: relative;
  515. width: 363px;
  516. height: 50px;
  517. background: linear-gradient(90deg, rgba(58, 69, 79, 0.5) 0%, rgba(22, 28, 33, 0) 100%);
  518. // background: linear-gradient(90deg, #3A454F 0%, rgba(22,28,33,0) 100%);
  519. backdrop-filter: blur(3px);
  520. border-radius: 3px 3px 3px 3px;
  521. opacity: 1;
  522. border: 1px solid;
  523. border-right: none;
  524. border-image: linear-gradient(98deg, rgba(78, 96, 112, 1), rgba(78, 96, 112, 0)) 1 1;
  525. padding-left: 72px;
  526. display: flex;
  527. flex-direction: column;
  528. justify-content: space-around;
  529. align-items: flex-start;
  530. margin-bottom: 24px;
  531. cursor: pointer;
  532. >.item-icon {
  533. position: absolute;
  534. border-radius: 50%;
  535. left: 35px;
  536. top: 50%;
  537. transform: translateY(-50%);
  538. width: 8px;
  539. height: 8px;
  540. background: #9AA4AB;
  541. z-index: 2;
  542. box-shadow: 0px 0px 12px 0px #6D9DC6, 0px 0px 8px 0px #6D9DC6;
  543. }
  544. >.verticle-line {
  545. position: absolute;
  546. top: -1px;
  547. left: 38px;
  548. width: 2px;
  549. height: 75px;
  550. background: #B0A179 50%;
  551. z-index: 1;
  552. }
  553. &:first-of-type {
  554. >.verticle-line {
  555. top: 50%;
  556. }
  557. }
  558. &:last-of-type {
  559. >.verticle-line {
  560. height: 25px;
  561. }
  562. }
  563. &:first-of-type:last-of-type {
  564. >.verticle-line {
  565. display: none;
  566. }
  567. }
  568. >span.corp-name {
  569. display: block;
  570. font-size: 16px;
  571. font-family: Source Han Sans CN-Bold, Source Han Sans CN;
  572. font-weight: bold;
  573. color: #FFFFFF;
  574. overflow: hidden;
  575. white-space: pre;
  576. text-overflow: ellipsis;
  577. opacity: 0.6;
  578. padding-right: 4px;
  579. width: 100%;
  580. }
  581. &.active {
  582. >span.corp-name {
  583. font-size: 20px;
  584. font-family: Source Han Sans CN-Bold, Source Han Sans CN;
  585. text-shadow: 0px 0px 16px #BD9D48;
  586. opacity: initial;
  587. }
  588. }
  589. >span.corp-time {
  590. display: block;
  591. font-size: 16px;
  592. font-family: Source Han Sans CN-Light, Source Han Sans CN;
  593. font-weight: 400;
  594. color: #FFFFFF;
  595. opacity: 0.5;
  596. }
  597. &:hover {
  598. background: linear-gradient(90deg, #B0A179 0%, rgba(255, 209, 91, 0) 100%);
  599. border-image: linear-gradient(98deg, rgba(176, 161, 121, 1), rgba(176, 161, 121, 0)) 1 1;
  600. }
  601. &.active {
  602. background: linear-gradient(90deg, #B0A179 0%, rgba(255, 209, 91, 0) 100%);
  603. border-image: linear-gradient(98deg, rgba(176, 161, 121, 1), rgba(176, 161, 121, 0)) 1 1;
  604. >.item-icon {
  605. background: #FFFFFF;
  606. box-shadow: 0px 0px 12px 0px #FFD15B, 0px 0px 8px 0px #FFD15B, 0px 0px 10px 0px #FFD15B, 0px 0px 5px 0px #FFD15B;
  607. }
  608. }
  609. }
  610. }
  611. &::-webkit-scrollbar {
  612. background: transparent;
  613. width: 4px;
  614. height: 0;
  615. }
  616. /*宽度是对垂直滚动条而言,高度是对水平滚动条而言*/
  617. &::-webkit-scrollbar-thumb {
  618. background: transparent;
  619. border-radius: 2px;
  620. }
  621. &:hover {
  622. &::-webkit-scrollbar-thumb {
  623. background: rgba(220, 231, 240, 0.2);
  624. }
  625. }
  626. }
  627. >article {
  628. position: absolute;
  629. top: 74px;
  630. right: 102px;
  631. width: 653px;
  632. height: calc(100% - 74px - 50px);
  633. max-height: 740px;
  634. backdrop-filter: blur(10px);
  635. background-image: url(@/assets/images/general-article-bg.png);
  636. background-size: 100% auto;
  637. background-repeat: no-repeat;
  638. background-position: left top;
  639. padding: 32px 50px 50px 50px;
  640. display: flex;
  641. flex-direction: column;
  642. @media only screen and (max-width: 1700px) {
  643. right: 0;
  644. }
  645. >button.close {
  646. position: absolute;
  647. top: 30px;
  648. right: 50px;
  649. width: 32px;
  650. height: 32px;
  651. background-image: url(@/assets/images/icon-close.png);
  652. background-size: cover;
  653. background-repeat: no-repeat;
  654. background-position: center center;
  655. }
  656. >h2 {
  657. flex: 0 0 auto;
  658. font-size: 24px;
  659. font-family: Source Han Sans CN-Bold, Source Han Sans CN;
  660. font-weight: bold;
  661. color: #FFFFFF;
  662. margin-bottom: 21px;
  663. display: -webkit-box;
  664. -webkit-box-orient: vertical;
  665. -webkit-line-clamp: 10;
  666. overflow: hidden;
  667. margin-right: calc(50 / 1080 * 83vh);
  668. }
  669. >img.splitter {
  670. flex: 0 0 auto;
  671. width: 100%;
  672. margin-bottom: 37px;
  673. }
  674. // 邵根-样式1
  675. .G1MainBox {
  676. width: 100%;
  677. height: 100%;
  678. padding-right: 10px;
  679. overflow-y: auto;
  680. overflow-x: hidden;
  681. &::-webkit-scrollbar {
  682. background: transparent;
  683. width: 4px;
  684. }
  685. /*宽度是对垂直滚动条而言,高度是对水平滚动条而言*/
  686. &::-webkit-scrollbar-thumb {
  687. background: rgba(220, 231, 240, 0.2);
  688. border-radius: 2px;
  689. }
  690. &>div {
  691. width: 100%;
  692. .G1MainBoxTabBox {
  693. display: flex;
  694. flex-wrap: wrap;
  695. margin-top: 14px 0;
  696. .G1MainBoxTab {
  697. font-size: 14px;
  698. margin-right: 10px;
  699. border: 1px solid #F3CB60;
  700. padding: 6px 8px;
  701. border-radius: 2px;
  702. color: #F3CB60;
  703. cursor: pointer;
  704. margin-bottom: 10px;
  705. }
  706. }
  707. .G1MainBoxTit {
  708. margin-top: 10px;
  709. height: 46px;
  710. line-height: 46px;
  711. color: #fff;
  712. font-size: 22px;
  713. font-weight: 700;
  714. }
  715. }
  716. .G1MainBox2 {
  717. .swiper-root {
  718. flex: 0 0 auto;
  719. width: 100%;
  720. height: 34.8%;
  721. margin-bottom: 20px;
  722. overflow: hidden;
  723. position: relative;
  724. .swiper-button-prev {
  725. left: 0;
  726. width: 40px;
  727. height: 40px;
  728. background-image: url(@/assets/images/arrow-left-2.png);
  729. background-repeat: no-repeat;
  730. background-size: contain;
  731. &::after {
  732. content: '';
  733. }
  734. }
  735. .swiper-button-next {
  736. right: 0;
  737. width: 40px;
  738. height: 40px;
  739. background-image: url(@/assets/images/arrow-right-2.png);
  740. background-repeat: no-repeat;
  741. background-size: contain;
  742. &::after {
  743. content: '';
  744. }
  745. }
  746. .swiper-wrapper {
  747. width: 100%;
  748. height: 100%;
  749. img.banner {
  750. width: calc(100% - 40px * 2 - 5px * 2);
  751. height: 100%;
  752. max-height: 220px;
  753. object-fit: contain;
  754. }
  755. }
  756. }
  757. >.txt {
  758. flex: 1 0 1px;
  759. font-size: 20px;
  760. font-family: Source Han Sans CN-Light, Source Han Sans CN;
  761. font-weight: 400;
  762. color: rgba(255, 255, 255, 0.8);
  763. line-height: 1.5;
  764. overflow: auto;
  765. padding-right: 10px;
  766. margin-right: -10px;
  767. white-space: pre-wrap;
  768. // text-indent: 2em;
  769. }
  770. }
  771. .G1MainBox3 {
  772. .G1RenBox {
  773. margin-top: 20px;
  774. align-items: flex-start;
  775. display: flex;
  776. &>img {
  777. width: 105px;
  778. object-fit: contain;
  779. }
  780. .G1RenBoxTxt {
  781. width: calc(100% - 125px);
  782. margin-left: 20px;
  783. color: #fff;
  784. &>h3 {
  785. font-size: 20px;
  786. font-weight: 700;
  787. margin-bottom: 15px;
  788. }
  789. &>p {
  790. font-size: 20px;
  791. font-family: Source Han Sans CN-Light, Source Han Sans CN;
  792. font-weight: 400;
  793. color: rgba(255, 255, 255, 0.8);
  794. line-height: 1.5;
  795. white-space: pre-wrap;
  796. }
  797. }
  798. }
  799. }
  800. }
  801. }
  802. .loading-mask {
  803. position: absolute;
  804. left: 0;
  805. top: 0;
  806. width: 100%;
  807. height: 100%;
  808. background: black;
  809. }
  810. }
  811. .mobile {
  812. .general {
  813. height: 100%;
  814. >.map-mask {
  815. position: absolute;
  816. left: 0;
  817. top: 0;
  818. width: 100%;
  819. height: 100%;
  820. pointer-events: none;
  821. }
  822. >h1 {
  823. position: absolute;
  824. top: calc(51 / 1080 * 83vh);
  825. left: calc(81 / 1080 * 83vh);
  826. max-width: 50%;
  827. overflow: hidden;
  828. white-space: pre;
  829. text-overflow: ellipsis;
  830. font-size: calc(48 / 1080 * 83vh);
  831. font-family: Source Han Sans CN-Heavy, Source Han Sans CN;
  832. font-weight: 800;
  833. color: #FFFFFF;
  834. padding-top: calc(20 / 1080 * 83vh);
  835. padding-bottom: calc(20 / 1080 * 83vh);
  836. border-top: 1px solid rgba(217, 217, 217, 0.2);
  837. border-bottom: 1px solid rgba(217, 217, 217, 0.2);
  838. }
  839. >form {
  840. position: absolute;
  841. top: calc(196 / 1080 * 110vh);
  842. left: calc(81 / 1080 * 110vh);
  843. display: flex;
  844. align-items: center;
  845. >input {
  846. background: rgba(255, 255, 255, 0.1);
  847. border-radius: calc(3 / 1080 * 110vh);
  848. border: 1px solid rgba(255, 255, 255, 0.5);
  849. width: calc(220 / 1080 * 110vh);
  850. height: calc(40 / 1080 * 110vh);
  851. padding-left: calc(13 / 1080 * 110vh);
  852. padding-right: calc(13 / 1080 * 110vh);
  853. font-size: calc(16 / 1080 * 110vh);
  854. font-family: Source Han Sans CN-Light, Source Han Sans CN;
  855. font-weight: 400;
  856. color: #FFFFFF;
  857. &:focus {
  858. border: 1px solid rgba(255, 255, 255, 1);
  859. }
  860. &::placeholder {
  861. font-size: calc(16 / 1080 * 110vh);
  862. font-family: Source Han Sans CN-Light, Source Han Sans CN;
  863. font-weight: 400;
  864. color: rgba(255, 255, 255, 0.5);
  865. }
  866. }
  867. >button {
  868. margin-left: calc(8 / 1080 * 110vh);
  869. width: calc(40 / 1080 * 110vh);
  870. height: calc(40 / 1080 * 110vh);
  871. background: rgba(255, 255, 255, 0.3);
  872. border-radius: 3px 3px 3px 3px;
  873. opacity: 1;
  874. border: 1px solid #FFFFFF;
  875. &:hover {
  876. background: rgba(255, 255, 255, 0.5);
  877. }
  878. >img {
  879. width: 100%;
  880. height: 100%;
  881. }
  882. }
  883. }
  884. >ul {
  885. position: absolute;
  886. top: calc(272 / 1080 * 110vh);
  887. left: calc(81 / 1080 * 110vh);
  888. max-height: 50vh;
  889. overflow: auto;
  890. user-select: none;
  891. >li {
  892. display: block;
  893. color: #fff;
  894. >h2 {
  895. width: calc(323 / 1080 * 110vh);
  896. height: calc(47 / 1080 * 110vh);
  897. background: linear-gradient(92deg, rgba(176, 161, 121, 0) 0%, rgba(176, 161, 121, 0.3) 50%, rgba(176, 161, 121, 0) 100%);
  898. // border-radius: 3px;
  899. font-size: calc(16 / 1080 * 110vh);
  900. font-family: Source Han Sans CN-Bold, Source Han Sans CN;
  901. font-weight: bold;
  902. color: #FFFFFF;
  903. text-shadow: 0px 0px 5px #FFD15B;
  904. display: flex;
  905. justify-content: center;
  906. align-items: center;
  907. margin-bottom: calc(17 / 1080 * 110vh);
  908. >span {
  909. margin-left: calc(13 / 1080 * 110vh);
  910. margin-right: calc(13 / 1080 * 110vh);
  911. }
  912. >img {
  913. width: calc(60 / 1080 * 110vh);
  914. height: calc(15 / 1080 * 110vh);
  915. }
  916. }
  917. >.corp-item {
  918. position: relative;
  919. width: calc(363 / 1080 * 110vh);
  920. height: calc(50 / 1080 * 110vh);
  921. background: linear-gradient(90deg, rgba(58, 69, 79, 0.5) 0%, rgba(22, 28, 33, 0) 100%);
  922. // background: linear-gradient(90deg, #3A454F 0%, rgba(22,28,33,0) 100%);
  923. backdrop-filter: blur(3px);
  924. border-radius: 3px 3px 3px 3px;
  925. opacity: 1;
  926. border: 1px solid;
  927. border-right: none;
  928. border-image: linear-gradient(98deg, rgba(78, 96, 112, 1), rgba(78, 96, 112, 0)) 1 1;
  929. padding-left: calc(72 / 1080 * 110vh);
  930. display: flex;
  931. flex-direction: column;
  932. justify-content: space-around;
  933. align-items: flex-start;
  934. margin-bottom: calc(24 / 1080 * 110vh);
  935. cursor: pointer;
  936. >.item-icon {
  937. position: absolute;
  938. border-radius: 50%;
  939. left: calc(35 / 1080 * 110vh);
  940. top: 50%;
  941. transform: translateY(-50%);
  942. width: calc(8 / 1080 * 110vh);
  943. height: calc(8 / 1080 * 110vh);
  944. background: #9AA4AB;
  945. z-index: 2;
  946. box-shadow: 0px 0px 12px 0px #6D9DC6, 0px 0px 8px 0px #6D9DC6;
  947. }
  948. >.verticle-line {
  949. position: absolute;
  950. top: -1px;
  951. left: calc(38 / 1080 * 110vh);
  952. width: calc(2 / 1080 * 110vh);
  953. height: calc(75 / 1080 * 110vh);
  954. background: #B0A179 50%;
  955. z-index: 1;
  956. }
  957. &:first-of-type {
  958. >.verticle-line {
  959. top: 50%;
  960. }
  961. }
  962. &:last-of-type {
  963. >.verticle-line {
  964. height: calc(25 / 1080 * 110vh);
  965. }
  966. }
  967. &:first-of-type:last-of-type {
  968. >.verticle-line {
  969. display: none;
  970. }
  971. }
  972. >span.corp-name {
  973. display: block;
  974. font-size: calc(16 / 1080 * 110vh);
  975. font-family: Source Han Sans CN-Bold, Source Han Sans CN;
  976. font-weight: bold;
  977. color: #FFFFFF;
  978. overflow: hidden;
  979. white-space: pre;
  980. text-overflow: ellipsis;
  981. opacity: 0.6;
  982. padding-right: 4px;
  983. width: 100%;
  984. }
  985. &.active {
  986. >span.corp-name {
  987. font-size: calc(20 / 1080 * 110vh);
  988. font-family: Source Han Sans CN-Bold, Source Han Sans CN;
  989. text-shadow: 0px 0px calc(16 / 1080 * 110vh) #BD9D48;
  990. opacity: initial;
  991. }
  992. }
  993. >span.corp-time {
  994. display: block;
  995. font-size: calc(16 / 1080 * 110vh);
  996. font-family: Source Han Sans CN-Light, Source Han Sans CN;
  997. font-weight: 400;
  998. color: #FFFFFF;
  999. opacity: 0.5;
  1000. }
  1001. &:hover {
  1002. background: linear-gradient(90deg, #B0A179 0%, rgba(255, 209, 91, 0) 100%);
  1003. border-image: linear-gradient(98deg, rgba(176, 161, 121, 1), rgba(176, 161, 121, 0)) 1 1;
  1004. }
  1005. &.active {
  1006. background: linear-gradient(90deg, #B0A179 0%, rgba(255, 209, 91, 0) 100%);
  1007. border-image: linear-gradient(98deg, rgba(176, 161, 121, 1), rgba(176, 161, 121, 0)) 1 1;
  1008. >.item-icon {
  1009. background: #FFFFFF;
  1010. box-shadow: 0px 0px calc(12 / 1080 * 110vh) 0px #FFD15B, 0px 0px calc(8 / 1080 * 110vh) 0px #FFD15B, 0px 0px calc(10 / 1080 * 83vh) 0px #FFD15B, 0px 0px calc(5 / 1080 * 83vh) 0px #FFD15B;
  1011. }
  1012. }
  1013. }
  1014. }
  1015. &::-webkit-scrollbar {
  1016. background: transparent;
  1017. width: calc(4 / 1080 * 110vh);
  1018. height: 0;
  1019. }
  1020. /*宽度是对垂直滚动条而言,高度是对水平滚动条而言*/
  1021. &::-webkit-scrollbar-thumb {
  1022. background: transparent;
  1023. border-radius: 2px;
  1024. }
  1025. &:hover {
  1026. &::-webkit-scrollbar-thumb {
  1027. background: rgba(220, 231, 240, 0.2);
  1028. }
  1029. }
  1030. }
  1031. >article {
  1032. position: absolute;
  1033. top: calc(74 / 1080 * 83vh);
  1034. right: calc(102 / 1080 * 83vh);
  1035. width: calc(653 / 1080 * 83vh);
  1036. height: 55vh;
  1037. backdrop-filter: blur(10px);
  1038. background-image: url(@/assets/images/general-article-bg.png);
  1039. background-size: 100% auto;
  1040. background-repeat: no-repeat;
  1041. background-position: left top;
  1042. padding: calc(32 / 1080 * 83vh) calc(50 / 1080 * 83vh) calc(50 / 1080 * 83vh) calc(50 / 1080 * 83vh);
  1043. display: flex;
  1044. flex-direction: column;
  1045. @media only screen and (max-width: 1700px) {
  1046. right: 0;
  1047. }
  1048. >button.close {
  1049. position: absolute;
  1050. top: calc(30 / 1080 * 83vh);
  1051. right: calc(50 / 1080 * 83vh);
  1052. width: calc(32 / 1080 * 83vh);
  1053. height: calc(32 / 1080 * 83vh);
  1054. background-image: url(@/assets/images/icon-close.png);
  1055. background-size: cover;
  1056. background-repeat: no-repeat;
  1057. background-position: center center;
  1058. }
  1059. >h2 {
  1060. flex: 0 0 auto;
  1061. font-size: calc(24 / 1080 * 83vh);
  1062. font-family: Source Han Sans CN-Bold, Source Han Sans CN;
  1063. font-weight: bold;
  1064. color: #FFFFFF;
  1065. margin-bottom: calc(21 / 1080 * 83vh);
  1066. display: -webkit-box;
  1067. -webkit-box-orient: vertical;
  1068. -webkit-line-clamp: 10;
  1069. overflow: hidden;
  1070. margin-right: calc(50 / 1080 * 83vh);
  1071. }
  1072. >img.splitter {
  1073. flex: 0 0 auto;
  1074. width: 100%;
  1075. margin-bottom: calc(37 / 1080 * 83vh);
  1076. }
  1077. >.swiper-root {
  1078. flex: 0 0 auto;
  1079. width: 100%;
  1080. height: 34.8%;
  1081. margin-bottom: calc(20 / 1080 * 83vh);
  1082. overflow: hidden;
  1083. position: relative;
  1084. >.swiper-button-prev {
  1085. left: 0;
  1086. width: 20px;
  1087. height: 20px;
  1088. background-image: url(@/assets/images/arrow-left-2.png);
  1089. background-repeat: no-repeat;
  1090. background-size: contain;
  1091. &::after {
  1092. content: '';
  1093. }
  1094. }
  1095. >.swiper-button-next {
  1096. right: 0;
  1097. width: 20px;
  1098. height: 20px;
  1099. background-image: url(@/assets/images/arrow-right-2.png);
  1100. background-repeat: no-repeat;
  1101. background-size: contain;
  1102. &::after {
  1103. content: '';
  1104. }
  1105. }
  1106. >.swiper-wrapper {
  1107. width: 100%;
  1108. height: 100%;
  1109. >img.banner {
  1110. width: calc(100% - 20px * 2 - 5px * 2);
  1111. height: 100%;
  1112. object-fit: contain;
  1113. }
  1114. }
  1115. }
  1116. >.txt {
  1117. flex: 1 0 1px;
  1118. font-size: calc(20 / 1080 * 83vh);
  1119. font-family: Source Han Sans CN-Light, Source Han Sans CN;
  1120. font-weight: 400;
  1121. color: rgba(255, 255, 255, 0.8);
  1122. line-height: 1.5;
  1123. overflow: auto;
  1124. padding-right: calc(10 / 1080 * 83vh);
  1125. margin-right: -calc(10 / 1080 * 83vh);
  1126. white-space: pre-wrap;
  1127. // text-indent: 2em;
  1128. &::-webkit-scrollbar {
  1129. background: transparent;
  1130. width: calc(4 / 1080 * 83vh);
  1131. }
  1132. /*宽度是对垂直滚动条而言,高度是对水平滚动条而言*/
  1133. &::-webkit-scrollbar-thumb {
  1134. background: rgba(220, 231, 240, 0.2);
  1135. border-radius: 2px;
  1136. }
  1137. }
  1138. }
  1139. .loading-mask {
  1140. position: absolute;
  1141. left: 0;
  1142. top: 0;
  1143. width: 100%;
  1144. height: 100%;
  1145. background: black;
  1146. }
  1147. }
  1148. }
  1149. </style>