index.vue 29 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122
  1. <template>
  2. <div class="page" id="page">
  3. <div class="top-title wow fadeInUp" data-wow-duration="2s" data-wow-delay="0s" data-wow-offset="0">
  4. <div class="top-container">
  5. <n-icon :component="IosFiling" size="40" style="vertical-align: middle" />
  6. <span>简报智库</span>
  7. </div>
  8. </div>
  9. <div class="page-nav-container wow fadeInLeft" data-wow-duration="2s" data-wow-delay="0s" data-wow-offset="0">
  10. <div class="nav-txt">
  11. <n-breadcrumb separator=">">
  12. <n-breadcrumb-item> <n-icon :component="MdHome" /><router-link to="/home">首页</router-link> </n-breadcrumb-item>
  13. <n-breadcrumb-item> <n-icon :component="IosFiling" />简报智库 </n-breadcrumb-item>
  14. </n-breadcrumb>
  15. </div>
  16. </div>
  17. <div class="search wow fadeInRight" :class="{ 'mobile-search': !pcShow }">
  18. <div class="search-box">
  19. <n-input v-model:value="params.title" clearable placeholder="请输入关键字进入搜索">
  20. <template #prefix>
  21. <span class="bqfl-iconfont icon-sousuo color80"></span>
  22. </template>
  23. </n-input>
  24. <n-button class="btn" type="primary" color="#18A058" @click="getList"> 搜索 </n-button>
  25. </div>
  26. </div>
  27. <div class="bulletin" :class="{ 'mobile-body': !pcShow }">
  28. <div class="container">
  29. <div class="classify wow fadeInLeft">
  30. <div class="row-classify">
  31. <div class="sub-label">
  32. <span class="bqfl-iconfont icon-hangyefenlei"></span>
  33. <span class="sub-label-txt">行业分类</span>
  34. </div>
  35. <div class="classify-items">
  36. <template v-if="categoryList && categoryList.length > 0">
  37. <div class="item" :class="{ 'active-item': categoryID == item.id }" v-for="item in categoryList" :key="item.id" @click="handleCategory(item, 'Category')">
  38. {{ item.name }}
  39. </div>
  40. </template>
  41. <template v-else> 暂无行业分类数据 </template>
  42. </div>
  43. </div>
  44. <div class="row-classify">
  45. <div class="sub-label">
  46. <span class="bqfl-iconfont icon-tags"></span>
  47. <span class="sub-label-txt">产品标签</span>
  48. </div>
  49. <div id="classify-tag" class="classify-items classify-tag">
  50. <div class="up-off" @click="isOff = !isOff" v-if="isShowUpOff">{{ isOff ? '全部展开' : '收起' }}</div>
  51. <div id="tags-box" class="tags-box" :class="{ 'up-off-tags': isOff }" v-if="categoryTagList && categoryTagList.length > 0">
  52. <div class="item" :class="{ 'active-item': categoryTagID == item.id }" v-for="item in categoryTagList" :key="item.id" @click="handleCategory(item, 'CategoryTag')">
  53. {{ item.name }}
  54. </div>
  55. </div>
  56. <template v-else> 暂无产品标签数据 </template>
  57. </div>
  58. </div>
  59. </div>
  60. <div class="bulletin-main">
  61. <div class="sub wow fadeInLeft">
  62. <span class="bqfl-iconfont icon-zhinengjianbao mr10"></span>
  63. <span>{{ routeTitle }}</span>
  64. </div>
  65. <div class="main-body">
  66. <div class="left wow fadeInLeft" data-wow-duration="3s" data-wow-delay="0s" data-wow-offset="0">
  67. <div class="list" v-if="pageData.count">
  68. <ul class="items">
  69. <li class="item" v-for="item in pageData.list" :key="item.id">
  70. <div class="img">
  71. <img :src="BaseUrl + '/fileupload/' + item.filePath + item.imageFileName" style="object-fit:contain;" />
  72. </div>
  73. <div class="report-info">
  74. <a :href="`/bulletin/bulletin-detail/${item.webTitle}-${item.id}`">
  75. <h2 class="report-title">{{ item.title }}</h2>
  76. </a>
  77. <!-- <div class="report-title" @click="toDetail(item)">
  78. {{ item.title }}
  79. </div> -->
  80. <p class="report-des">{{ item.outline }}</p>
  81. <div class="tags">
  82. <span class="tag" v-for="(tag, t) in item.secondLabelName.split(',')" :key="t">{{ tag }}</span>
  83. </div>
  84. <p>
  85. <span class="publisth-time">{{ formatDate(item.publishDate) }}</span> 页数:{{ item.pdfNum || 0 }}
  86. </p>
  87. </div>
  88. </li>
  89. </ul>
  90. <div class="pagination">
  91. <n-pagination :page="params?.pageNo" :page-count="pageData?.count" :page-size="params?.pageSize" size="large" :on-update-page="changePage" :page-slot="7" />
  92. </div>
  93. </div>
  94. <div class="empty" v-else>
  95. <n-empty description="暂无数据" size="huge"> </n-empty>
  96. </div>
  97. </div>
  98. <div class="right wow fadeInRight" data-wow-duration="3s" data-wow-delay="0s" data-wow-offset="0">
  99. <div class="winnow">
  100. <h3>精选简报</h3>
  101. <ul v-if="winnowList && winnowList.length > 0">
  102. <li v-for="item in winnowList" :key="item.id">
  103. <div class="img">
  104. <img :src="BaseUrl + '/fileupload/' + item.filePath + item.imageFileName" />
  105. </div>
  106. <a :href="`/bulletin/bulletin-detail/${item.webTitle}-${item.id}`">
  107. <h4 class="report-title">{{ item.title }}</h4>
  108. </a>
  109. <!-- <p @click="toDetail(item)">{{ item.title }}</p> -->
  110. </li>
  111. </ul>
  112. <div class="empty" v-else>
  113. <n-empty description="暂无数据" size="huge"> </n-empty>
  114. </div>
  115. </div>
  116. <div class="hots">
  117. <h3>热门报告</h3>
  118. <ul v-if="hotsList && hotsList.length > 0">
  119. <li v-for="item in hotsList" :key="item.id">
  120. <div class="img">
  121. <img :src="BaseUrl + '/report/' + item.fileName" />
  122. </div>
  123. <div>
  124. <a :href="`/reports/${item.webTitle}-${item.id}`">
  125. <h4>{{ item.title }}</h4>
  126. </a>
  127. <!-- <p @click="toDetail(item)">{{ item.title }}</p> -->
  128. <span class="tags" v-if="item.secondLabelName">
  129. <span class="tag">{{ item.secondLabelName.split(',')[0] }}</span>
  130. </span>
  131. </div>
  132. </li>
  133. </ul>
  134. <div class="empty" v-else>
  135. <n-empty description="暂无数据" size="huge"> </n-empty>
  136. </div>
  137. </div>
  138. <div class="service">
  139. <h3>咨询服务</h3>
  140. <ul>
  141. <li v-for="item in serviceList" :key="item.id + item.icon" @click="jump(item)">
  142. <div class="img">
  143. <span class="bqfl-iconfont service-icon-img color18A058" :class="item.icon"></span>
  144. </div>
  145. <div>{{ item.label }}</div>
  146. </li>
  147. </ul>
  148. </div>
  149. </div>
  150. </div>
  151. </div>
  152. </div>
  153. </div>
  154. <n-spin class="load" description="数据加载中" :show="spinShow" :delay="1000">
  155. <div style="width: 150px"></div>
  156. </n-spin>
  157. </div>
  158. </template>
  159. <script lang="ts" setup>
  160. import {
  161. ref,
  162. reactive,
  163. onMounted,
  164. watch,
  165. onServerPrefetch,
  166. nextTick,
  167. } from "vue";
  168. // import {
  169. // NIcon,
  170. // NBreadcrumb,
  171. // NBreadcrumbItem,
  172. // NButton,
  173. // NInput,
  174. // NPagination,
  175. // NEmpty,
  176. // NSpin,
  177. // } from "naive-ui";
  178. import { IosFiling, MdHome } from "@vicons/ionicons4";
  179. import { useRouter, useRoute } from "vue-router";
  180. import { useI18n } from "#imports";
  181. const router = useRouter(); // 传递参数
  182. const route = useRoute(); // 接收参数
  183. const routeTitle = ref<string>("行业简报");
  184. const pcShow = ref<boolean>(true);
  185. const config = useRuntimeConfig();
  186. const BaseUrl = ref(config.public.baseUrl);
  187. const pageSize = 10;
  188. const { t } = useI18n();
  189. const params = reactive({
  190. pageSize: pageSize,
  191. pageNo: 1,
  192. marketType: "",
  193. title: "",
  194. topLabelId: "",
  195. secondLabelId: "",
  196. });
  197. const initialize = ref([
  198. {
  199. id: "",
  200. name: "全部",
  201. },
  202. ]);
  203. const allClassfiy = ref([]);
  204. const categoryList = ref([]);
  205. const categoryTagList = ref([]);
  206. const pageData = ref({});
  207. const hotsList = ref([]);
  208. const winnowList = ref([]);
  209. const categoryID = ref("");
  210. const categoryTagID = ref("");
  211. const spinShow = ref(false);
  212. const serviceList = [
  213. {
  214. label: "研究报告",
  215. icon: "icon-iconyanjiubaogao01",
  216. id: 0,
  217. path: "contactUsIndex",
  218. },
  219. {
  220. label: "商业计划书",
  221. icon: "icon-shangyeqihuashu",
  222. id: 1,
  223. path: "contactUsIndex",
  224. },
  225. {
  226. label: "可研报告",
  227. icon: "icon-yanjiubaogao",
  228. id: 2,
  229. path: "contactUsIndex",
  230. },
  231. {
  232. label: "定制服务",
  233. icon: "icon-dingzhifuwu",
  234. id: 3,
  235. path: "contactUsIndex",
  236. },
  237. {
  238. label: "市场调查",
  239. icon: "icon-shichangtiaochabiao",
  240. id: 4,
  241. path: "contactUsIndex",
  242. },
  243. {
  244. label: "IPO咨询",
  245. icon: "icon-IPO",
  246. id: 5,
  247. path: "contactUsIndex",
  248. },
  249. ];
  250. const isOff = ref(false);
  251. const upOffHeight = ref(16 * 2 * 5);
  252. const isShowUpOff = ref(false);
  253. watch(
  254. () => [
  255. route.params.marketType,
  256. route.params.categoryID,
  257. route.params.categoryTagID,
  258. route.params.title,
  259. ],
  260. async (
  261. [newval, newCategoryID, newCategoryTagID, newTitle],
  262. [oldval, oldCategoryID, oldCategoryTagID, oldTitle]
  263. ) => {
  264. params.marketType = newval;
  265. params.title = newTitle;
  266. params.topLabelId = "";
  267. categoryID.value = "";
  268. params.secondLabelId = "";
  269. categoryTagID.value = "";
  270. getTitle(newval);
  271. getHots(newval);
  272. getWinnow(newval);
  273. // 列表
  274. getList();
  275. await getCategory(newval);
  276. if (categoryID.value) {
  277. getCategoryTags(categoryID.value);
  278. } else {
  279. getAllClassfiy(newval);
  280. }
  281. }
  282. );
  283. watch(
  284. () => categoryTagList.value,
  285. (val) => {
  286. if (val && val.length > 0) {
  287. nextTick(() => {
  288. const tagsLabel = document.getElementById("tags-box");
  289. if (tagsLabel) {
  290. if (tagsLabel.clientHeight > upOffHeight.value) {
  291. isShowUpOff.value = true;
  292. isOff.value = true;
  293. } else {
  294. isShowUpOff.value = false;
  295. isOff.value = false;
  296. }
  297. } else {
  298. isShowUpOff.value = false;
  299. isOff.value = false;
  300. }
  301. });
  302. } else {
  303. isShowUpOff.value = false;
  304. isOff.value = false;
  305. }
  306. }
  307. );
  308. // watch(
  309. // () => categoryID,
  310. // (val) => {
  311. // if (!val)
  312. // categoryTagList.value = [...initialize.value, ...allClassfiy.value];
  313. // }
  314. // );
  315. const getAllClassfiy = async (marketType: string) => {
  316. const { code, data } = await allClassfiy_Api({
  317. marketType: marketType,
  318. });
  319. if (code === 200) {
  320. allClassfiy.value = data || [];
  321. categoryTagList.value = [...initialize.value, ...allClassfiy.value];
  322. } else {
  323. allClassfiy.value = [];
  324. }
  325. };
  326. const getTitle = (marketType: string) => {
  327. let title = "";
  328. switch (marketType) {
  329. case "industry-brief":
  330. title = "行业简报";
  331. break;
  332. case "enterprise-hole-analysis":
  333. title = "企业洞察";
  334. break;
  335. default:
  336. title = "行业简报";
  337. break;
  338. }
  339. routeTitle.value = title;
  340. };
  341. const getCategory = async (marketType: string) => {
  342. const { code, data } = await bulletinCategory_Api({
  343. marketType: marketType,
  344. });
  345. if (code === 200) {
  346. categoryList.value = [...initialize.value, ...data];
  347. categoryTagList.value = [...initialize.value, ...allClassfiy.value];
  348. }
  349. };
  350. const getHots = async () => {
  351. const data = await hotResearchList({
  352. lang: "zh-CN",
  353. });
  354. hotsList.value = data || [];
  355. };
  356. const getWinnow = async (marketType: string | any) => {
  357. const { code, data } = await bulletinWinnow_Api({
  358. marketType: marketType,
  359. });
  360. if (code === 200) {
  361. winnowList.value = data;
  362. }
  363. };
  364. const handleCategory = (item: object, type: string) => {
  365. const id = item.id;
  366. if (type == "Category") {
  367. if (categoryID.value == id) {
  368. return false;
  369. }
  370. categoryID.value = id;
  371. params.topLabelId = id;
  372. categoryTagID.value = "";
  373. params.secondLabelId = "";
  374. params.pageNo = 1;
  375. if (id) getCategoryTags(id);
  376. if (!id) getAllClassfiy(params.marketType);
  377. // router.push({
  378. // name: "bulletinThinkTank",
  379. // params: {
  380. // marketType: params.marketType,
  381. // categoryID: id,
  382. // },
  383. // });
  384. } else {
  385. if (categoryTagID.value == id) {
  386. return false;
  387. }
  388. params.pageNo = 1;
  389. categoryTagID.value = id;
  390. params.secondLabelId = id;
  391. // router.push({
  392. // name: "bulletinThinkTank",
  393. // params: {
  394. // marketType: params.marketType,
  395. // categoryID: categoryID.value || "all",
  396. // },
  397. // });
  398. }
  399. getList();
  400. };
  401. const getCategoryTags = async (parentId: string | any) => {
  402. categoryTagList.value = [...initialize.value];
  403. const { code, data } = await bulletinCategory_Api({
  404. parentId: parentId,
  405. marketType: params.marketType,
  406. });
  407. if (code === 200) {
  408. categoryTagList.value = [...categoryTagList.value, ...data];
  409. }
  410. };
  411. const getList = async () => {
  412. spinShow.value = true;
  413. const { code, data } = await bulletinPage_Api(params);
  414. if (code === 200) {
  415. pageData.value = data;
  416. }
  417. // setTimeout(() => {
  418. spinShow.value = false;
  419. // }, 500);
  420. };
  421. // 改变页数
  422. const changePage = (page: number) => {
  423. document.documentElement.scrollTop = 0;
  424. params.pageNo = page;
  425. getList();
  426. };
  427. const toDetail = (item: object) => {
  428. router.push({
  429. name: "bulletinDetail",
  430. params: {
  431. id: item.id,
  432. },
  433. });
  434. };
  435. const jump = (item) => {
  436. router.push({
  437. name: item.path,
  438. });
  439. };
  440. // onServerPrefetch(async () => {
  441. // try {
  442. // params.title = route.params?.title || "";
  443. // params.marketType = route.params?.marketType || "industry-brief";
  444. // params.topLabelId = "";
  445. // categoryID.value = "";
  446. // params.secondLabelId = "";
  447. // categoryTagID.value = "";
  448. // getTitle(params.marketType);
  449. // const res = await hotResearchList({
  450. // lang: "zh-CN",
  451. // });
  452. // hotsList.value = res.data || [];
  453. // const res1 = await bulletinWinnow_Api({
  454. // marketType: params.marketType,
  455. // });
  456. // if (res1.code === 200) {
  457. // winnowList.value = res1.data;
  458. // }
  459. // spinShow.value = true;
  460. // const res2 = await bulletinPage_Api(params);
  461. // if (res2.code === 200) {
  462. // pageData.value = res2.data;
  463. // }
  464. // await getCategory(params.marketType);
  465. // if (categoryID.value) {
  466. // getCategoryTags(categoryID.value);
  467. // } else {
  468. // getAllClassfiy(params.marketType);
  469. // }
  470. // spinShow.value = false;
  471. // } catch (error) {
  472. // console.log("error===>", error);
  473. // }
  474. // });
  475. onMounted(async () => {
  476. pcShow.value = !isMobile();
  477. });
  478. const marketType = route.params?.marketType || "industry-brief";
  479. const keyword = route.params?.title || "";
  480. params.title = keyword;
  481. params.marketType = marketType;
  482. categoryID.value = "";
  483. params.topLabelId = categoryID.value;
  484. categoryTagID.value = "";
  485. params.secondLabelId = "";
  486. getTitle(marketType);
  487. getHots();
  488. getWinnow(marketType);
  489. // 列表
  490. getList();
  491. getCategory(marketType);
  492. if (categoryID.value) {
  493. getCategoryTags(categoryID.value);
  494. } else {
  495. getAllClassfiy(marketType);
  496. }
  497. useHead({
  498. title: t("common.navigate.bulletin") + "-" + t("defaultSettings.title"),
  499. viewport: "width=device-width,initial-scale=1,maximum-scale=1 ",
  500. charset: "utf-8",
  501. meta: [
  502. {
  503. hid: "keywords",
  504. name: "keywords",
  505. content: t("defaultSettings.keyword"),
  506. },
  507. {
  508. hid: "description",
  509. name: "description",
  510. content: t("defaultSettings.desc"),
  511. },
  512. ],
  513. });
  514. </script>
  515. <style lang="scss" scoped>
  516. .page {
  517. .search {
  518. width: 100%;
  519. height: 152px;
  520. overflow: hidden;
  521. background: url("@/assets/images/bulletin-search-bg.png") no-repeat;
  522. background-size: 100% 100%;
  523. .search-box {
  524. display: flex;
  525. justify-content: center;
  526. align-items: center;
  527. width: 100%;
  528. height: 100%;
  529. }
  530. :deep(.n-input) {
  531. // width: 60%;
  532. width: 57.6875rem;
  533. height: 60px;
  534. border-radius: 8px 0 0 8px;
  535. .n-input__input-el {
  536. height: 100%;
  537. }
  538. }
  539. .btn {
  540. width: 80px;
  541. height: 60px;
  542. border-radius: 0 8px 8px 0;
  543. }
  544. }
  545. .bulletin {
  546. // padding: 50px 200px 0;
  547. background-color: #fff;
  548. .container {
  549. padding-top: 50px;
  550. }
  551. .classify {
  552. margin-bottom: 20px;
  553. .row-classify {
  554. display: flex;
  555. border: 1px solid #f2f2f2;
  556. &:last-child {
  557. border-top: none;
  558. }
  559. .sub-label {
  560. display: flex;
  561. justify-content: center;
  562. align-items: center;
  563. text-align: center;
  564. font-size: 18px;
  565. width: 120px;
  566. // padding: 20px;
  567. font-weight: bold;
  568. color: #1a1a1a;
  569. background: #f3f8ff;
  570. flex-shrink: 0;
  571. .icon-tags {
  572. transform: rotateY(180deg);
  573. }
  574. .sub-label-txt {
  575. margin-left: 10px;
  576. }
  577. }
  578. .classify-items {
  579. // flex-wrap: wrap;
  580. padding: 20px;
  581. font-size: 16px;
  582. color: #666666;
  583. line-height: 2;
  584. .item {
  585. display: inline-block;
  586. margin-right: 20px;
  587. cursor: pointer;
  588. }
  589. .active-item {
  590. color: #18a058;
  591. font-weight: bold;
  592. }
  593. }
  594. .classify-tag {
  595. position: relative;
  596. width: 100%;
  597. .up-off {
  598. position: absolute;
  599. right: 10px;
  600. bottom: 0;
  601. color: #18a058;
  602. cursor: pointer;
  603. }
  604. .tags-box {
  605. width: 100%;
  606. height: auto;
  607. }
  608. .up-off-tags {
  609. height: calc(16px * 2 * 5);
  610. overflow: hidden;
  611. text-overflow: ellipsis;
  612. display: -webkit-box;
  613. -webkit-line-clamp: 5;
  614. -webkit-box-orient: vertical;
  615. word-wrap: break-word;
  616. word-break: break-all;
  617. white-space: normal;
  618. }
  619. }
  620. }
  621. }
  622. ul {
  623. padding: 0;
  624. li {
  625. margin: 0;
  626. list-style: none;
  627. padding: 0;
  628. p {
  629. padding: 0;
  630. margin: 0;
  631. }
  632. .img {
  633. // width: 100%;
  634. // height: 100%;
  635. img {
  636. width: 100%;
  637. height: 100%;
  638. vertical-align: middle;
  639. // object-fit: cover;
  640. transition: all 0.4s ease;
  641. }
  642. }
  643. }
  644. }
  645. .bulletin-main {
  646. .sub {
  647. padding: 9px 0;
  648. font-size: 24px;
  649. color: #1a1a1a;
  650. }
  651. .main-body {
  652. display: flex;
  653. justify-content: space-between;
  654. .left {
  655. // flex: 1;
  656. width: 63%;
  657. // margin-right: 60px;
  658. // width: 62.875rem;
  659. // margin-right: 3.75rem;
  660. border-top: 2px solid #18a058;
  661. .list {
  662. width: 100%;
  663. .items {
  664. width: 100%;
  665. .item {
  666. display: flex;
  667. padding: 30px 0;
  668. width: 100%;
  669. border-bottom: 1px solid #cccccc;
  670. .img {
  671. width: 155px;
  672. max-width: 155px;
  673. max-height: 190px;
  674. margin-right: 25px;
  675. background: rgba(0, 0, 0, 0);
  676. flex-shrink: 0;
  677. // overflow: hidden;
  678. img {
  679. box-shadow: 5px 2px 12px 0px #94bed9;
  680. }
  681. }
  682. .report-info {
  683. flex: 1;
  684. width: 0;
  685. }
  686. .report-title {
  687. margin-top: 0;
  688. margin-bottom: 24px;
  689. font-size: 22px;
  690. color: #1a1a1a;
  691. line-height: 32px;
  692. cursor: pointer;
  693. }
  694. .report-des {
  695. padding: 0;
  696. margin: 0;
  697. margin-bottom: 15px;
  698. font-size: 14px;
  699. color: #808080;
  700. line-height: 26px;
  701. overflow: hidden;
  702. text-overflow: ellipsis;
  703. display: -webkit-box;
  704. -webkit-line-clamp: 3;
  705. -webkit-box-orient: vertical;
  706. }
  707. .tags {
  708. margin-bottom: 10px;
  709. .tag {
  710. display: inline-block;
  711. padding: 5px 17px 3px;
  712. text-align: center;
  713. margin-right: 10px;
  714. margin-bottom: 5px;
  715. background: #cbffe3;
  716. font-size: 12px;
  717. color: #18a058;
  718. &:last-child {
  719. margin-bottom: 0;
  720. }
  721. }
  722. }
  723. .publisth-time {
  724. margin-right: 10px;
  725. }
  726. }
  727. }
  728. }
  729. }
  730. .right {
  731. // flex: 1;
  732. // width: 29.625rem;
  733. width: 33%;
  734. & > div {
  735. margin-bottom: 30px;
  736. padding: 0 30px;
  737. border: 1px solid #e6e6e6;
  738. border-top-color: #18a058;
  739. border-top-width: 2px;
  740. h3 {
  741. margin: 0;
  742. padding: 15px 0 20px;
  743. font-size: 24px;
  744. color: #1a1a1a;
  745. font-weight: normal;
  746. }
  747. }
  748. .winnow {
  749. ul {
  750. display: flex;
  751. flex-wrap: wrap;
  752. li {
  753. width: calc((100% - 24px) / 2);
  754. // width: calc((100% - 24px) / 2);
  755. margin-right: 24px;
  756. margin-bottom: 25px;
  757. &:nth-child(2n) {
  758. margin-right: 0;
  759. }
  760. .img {
  761. width: 100%;
  762. height: 235px;
  763. margin-bottom: 8px;
  764. img {
  765. object-fit: contain;
  766. }
  767. }
  768. h4 {
  769. padding: 0;
  770. margin: 0;
  771. font-weight: normal;
  772. font-size: 18px;
  773. color: #1a1a1a;
  774. line-height: 25px;
  775. cursor: pointer;
  776. overflow: hidden;
  777. text-overflow: ellipsis;
  778. display: -webkit-box;
  779. -webkit-line-clamp: 3;
  780. -webkit-box-orient: vertical;
  781. }
  782. }
  783. }
  784. }
  785. .hots {
  786. ul {
  787. li {
  788. display: flex;
  789. padding: 20px 0;
  790. border-bottom: 1px solid #e6e6e6;
  791. &:first-child {
  792. padding-top: 0;
  793. }
  794. &:last-child {
  795. border: none;
  796. }
  797. .img {
  798. width: 92px;
  799. max-width: 92px;
  800. max-height: 92px;
  801. margin-right: 20px;
  802. flex-shrink: 0;
  803. }
  804. h4 {
  805. padding: 0;
  806. margin: 0;
  807. margin-bottom: 20px;
  808. font-size: 18px;
  809. color: #1a1a1a;
  810. line-height: 25px;
  811. font-weight: normal;
  812. cursor: pointer;
  813. overflow: hidden;
  814. text-overflow: ellipsis;
  815. display: -webkit-box;
  816. -webkit-line-clamp: 2;
  817. -webkit-box-orient: vertical;
  818. }
  819. .tags {
  820. .tag {
  821. display: inline-block;
  822. font-size: 12px;
  823. padding: 5px 19px 3px;
  824. margin-right: 5px;
  825. margin-bottom: 5px;
  826. background: #cbffe3;
  827. &:last-child {
  828. margin-bottom: 0;
  829. }
  830. }
  831. }
  832. }
  833. }
  834. }
  835. .service {
  836. padding-bottom: 30px;
  837. ul {
  838. display: flex;
  839. flex-wrap: wrap;
  840. li {
  841. width: 50%;
  842. padding: 35px 0 25px;
  843. text-align: center;
  844. border: 1px solid #e6e6e6;
  845. border-top: none;
  846. border-left: none;
  847. cursor: pointer;
  848. &:nth-child(2n) {
  849. position: relative;
  850. border-right: none;
  851. &::after {
  852. position: absolute;
  853. left: -10px;
  854. bottom: -10px;
  855. content: "";
  856. width: 20px;
  857. height: 20px;
  858. background-color: #fff;
  859. }
  860. }
  861. &:nth-child(5),
  862. &:nth-child(6) {
  863. border-bottom: none;
  864. }
  865. .img {
  866. display: flex;
  867. justify-content: center;
  868. align-items: center;
  869. width: 93px;
  870. height: 93px;
  871. margin: 0 auto 10px;
  872. background: #e2ffef;
  873. border-radius: 50%;
  874. overflow: hidden;
  875. .service-icon-img {
  876. font-size: 40px;
  877. }
  878. }
  879. }
  880. }
  881. }
  882. }
  883. }
  884. }
  885. }
  886. .pagination {
  887. display: flex;
  888. justify-content: center;
  889. align-items: center;
  890. height: 50px;
  891. }
  892. .empty {
  893. padding: 50px 0;
  894. }
  895. .mobile-search {
  896. width: 100%;
  897. height: 100px;
  898. :deep(.n-input) {
  899. height: 40px;
  900. }
  901. .btn {
  902. width: 50px;
  903. height: 40px;
  904. }
  905. }
  906. .mobile-body {
  907. .container {
  908. padding: 30px 0;
  909. }
  910. .classify {
  911. margin-bottom: 20px;
  912. .row-classify {
  913. .sub-label {
  914. font-size: 14px;
  915. padding: 10px;
  916. .icon-hangyefenlei {
  917. font-size: 15px;
  918. }
  919. }
  920. .classify-items {
  921. padding: 20px 10px;
  922. font-size: 12px;
  923. .item {
  924. margin-right: 10px;
  925. }
  926. }
  927. }
  928. }
  929. .bulletin-main {
  930. .sub {
  931. font-size: 18px;
  932. }
  933. .main-body {
  934. flex-wrap: wrap;
  935. .left {
  936. width: 100%;
  937. margin-right: 0;
  938. .list > .items > .item {
  939. padding: 15px 0;
  940. .img {
  941. max-width: 100px;
  942. max-height: 125px;
  943. margin-right: 15px;
  944. }
  945. .report-title {
  946. margin-bottom: 10px;
  947. font-size: 18px;
  948. overflow: hidden;
  949. text-overflow: ellipsis;
  950. white-space: nowrap;
  951. }
  952. .report-des {
  953. margin-bottom: 5px;
  954. font-size: 12px;
  955. display: -webkit-box;
  956. -webkit-box-orient: vertical;
  957. -webkit-line-clamp: 3;
  958. overflow: hidden;
  959. text-overflow: ellipsis;
  960. }
  961. }
  962. }
  963. .right {
  964. width: 100%;
  965. & > div {
  966. margin-bottom: 15px;
  967. padding: 0 15px;
  968. h3 {
  969. font-size: 18px;
  970. }
  971. }
  972. .winnow {
  973. ul li {
  974. width: calc((100% - 10px) / 2);
  975. margin-right: 10px;
  976. margin-bottom: 10px;
  977. p {
  978. font-size: 14px;
  979. display: -webkit-box;
  980. -webkit-box-orient: vertical;
  981. -webkit-line-clamp: 3;
  982. overflow: hidden;
  983. text-overflow: ellipsis;
  984. }
  985. }
  986. }
  987. .hots {
  988. ul li {
  989. .img {
  990. margin-right: 10px;
  991. }
  992. p {
  993. margin-bottom: 10px;
  994. font-size: 14px;
  995. display: -webkit-box;
  996. -webkit-box-orient: vertical;
  997. -webkit-line-clamp: 3;
  998. overflow: hidden;
  999. text-overflow: ellipsis;
  1000. }
  1001. }
  1002. }
  1003. }
  1004. }
  1005. }
  1006. }
  1007. }
  1008. .load {
  1009. :deep(.n-spin-body) {
  1010. left: auto;
  1011. }
  1012. }
  1013. </style>