index.vue 26 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900
  1. <template>
  2. <div class="page">
  3. <div class="top">
  4. <img src="@/assets/images/newsCategories/img1.png" alt="">
  5. <div>
  6. <div class="top_title">Reports</div>
  7. <div class="top_location">
  8. <span class="iconfont icon-weizhi"></span>
  9. Current Location : Home <span class="iconfont icon-dkw_guanbi-"></span> <span>Reports</span>
  10. </div>
  11. </div>
  12. </div>
  13. <div class="box">
  14. <div class="box_l">
  15. <div class="box_l_title">
  16. <div>Industry Segment</div>
  17. <div>
  18. <span class="iconfont icon-shouqi1"></span>
  19. </div>
  20. </div>
  21. <div class="box_l_list">
  22. <template v-for="item in categories" :key="item">
  23. <a class="box_l_list_item" :href="'/report-industries' +(item.marketType ? '/' + item.marketType: '')" :class="{active:item.marketType === record.marketType}" @click.prevent=" handleCategory(
  24. item,
  25. item.marketType,
  26. item.marketTypeName
  27. )">
  28. <div class="box_l_list_item_l">{{ item.marketTypeName }}</div>
  29. <div class="box_l_list_item_r ">
  30. <div></div>
  31. <span class="iconfont icon-duigou"></span>
  32. </div>
  33. </a>
  34. </template>
  35. </div>
  36. <div class="box_l_title">
  37. <div>Published</div>
  38. <div>
  39. <span class="iconfont icon-shouqi1"></span>
  40. </div>
  41. </div>
  42. <div class="box_l_list">
  43. <div>
  44. <template v-for="(item,i) in publishDates" :key="'a'+i">
  45. <div class="box_l_list_item" :class="{active:item.publishDateValue === record.queryPublishDate}" @click=" handlePublishDate(
  46. item,
  47. item.publishDateValue,
  48. item.marketTypeName
  49. )">
  50. <div class="box_l_list_item_l">{{ item.marketTypeName }}</div>
  51. <div class="box_l_list_item_r ">
  52. <div></div>
  53. <span class="iconfont icon-duigou"></span>
  54. </div>
  55. </div>
  56. </template>
  57. </div>
  58. <div class="selBox">
  59. <n-date-picker v-model:value="publishDateStr" clearable placeholder="Select Date" type="date" />
  60. <span> - </span>
  61. <n-date-picker v-model:value="publishDateEnd" clearable placeholder="Select Date" type="date" />
  62. <div class="selBox_btn" @click="queryPublishDate">OK</div>
  63. </div>
  64. </div>
  65. </div>
  66. <div class="box_r">
  67. <view class="box_r_list">
  68. <template v-for="(item,i) in pageList?.list" :key="i">
  69. <a class="box_r_list_item " :href="'/reports/' +item.webTitle +'-' +item.id">
  70. <img :src="BaseUrl + '/report/' + item.fileName" alt="">
  71. <div class="box_r_list_item_content">
  72. <h2 class="box_r_list_title">{{ item.title }}</h2>
  73. <div class="box_r_list_time">
  74. <span class="iconfont icon-suoshuhangye-01"></span>
  75. Industry:{{dealTypeShow(item.marketType)}}{{item.marketType}}
  76. </div>
  77. <div class="box_r_list_time">
  78. <span class="iconfont icon-top_"></span>
  79. Report Format:
  80. <span class="desc-icon">
  81. <img src="@/assets/images/doc.png" />
  82. <img src="@/assets/images/pdf.png" />
  83. <img src="@/assets/images/xlsx.png" />
  84. </span>
  85. </div>
  86. <div class="box_r_list_time">
  87. <span class="iconfont icon-normal"></span>
  88. {{ item.publishDate }}
  89. </div>
  90. </div>
  91. <div class="box_r_list_item_btn">
  92. <div class="box_r_list_item_btn_l" @click.prevent="handleDemand(item, '1')">Request</div>
  93. <div class="box_r_list_item_btn_r" @click.prevent="handleDemand(item, '2')">Buy Now</div>
  94. </div>
  95. </a>
  96. </template>
  97. </view>
  98. <div class="pageBox" v-if="pageList?.list.length>0">
  99. <n-pagination show-quick-jumper :page-count="pageList?.count" :on-update:page="changePage" :page-slot="6">
  100. <template #prev>
  101. <div class="pageBox_btn">Previous</div>
  102. </template>
  103. <template #next>
  104. <div class="pageBox_btn">Next</div>
  105. </template>
  106. <template #goto>
  107. <div class="pageBox_inp">Go To</div>
  108. </template>
  109. </n-pagination>
  110. </div>
  111. <div class="box-empty" v-if="pageList?.count === 0">
  112. <n-empty description="The specified report was not found">
  113. <template #extra>
  114. <!-- <n-button @click="handleDemand({ id: '', price: 0 }, '0')" round type="primary">{{ t("report.detail.custom") }}</n-button> -->
  115. </template>
  116. </n-empty>
  117. </div>
  118. <div class="load">
  119. <n-spin size="large">
  120. <template #description>Loading...</template>
  121. </n-spin>
  122. </div>
  123. </div>
  124. </div>
  125. </div>
  126. <n-modal :show="demandShow" @close="demandShow = false" @esc="demandShow = false" @mask-click="demandShow = false" :style="'width: 720px'">
  127. <demand :rowId="rowId" :rowPrice="rowPrice" :rowType="rowType" :rowRegion="rowRegion" @closeDialog="handleCloseDiag" />
  128. </n-modal>
  129. </template>
  130. <script lang="ts" setup>
  131. import { ref, onMounted, watch, onServerPrefetch, nextTick } from "vue";
  132. import { MdSearch, MdHome, IosFiling, MdTime } from "@vicons/ionicons4";
  133. import {
  134. useRouter,
  135. useRoute,
  136. onBeforeRouteLeave,
  137. onBeforeRouteUpdate,
  138. } from "vue-router";
  139. import { useI18n } from "#imports";
  140. import { useUserStore } from "@/store/user";
  141. const record = ref({ pageSize: pageSize, pageNo: 1, queryKeyword: "" } as any); // 参数
  142. const router = useRouter(); // 传递参数
  143. const route = useRoute(); // 接收参数
  144. const demandShow = ref(false); // 需求页面
  145. const categoryTag = ref<string>(); // 类型tag
  146. const priceTag = ref<string>(); // 价格tag
  147. const publishDateTag = ref<string>(); // 发布日期tag
  148. const regionTag = ref<string>(); // 地区
  149. const pageList = ref(); // 列表数据
  150. const publishDateStr = ref<number>(); // 发布日期
  151. const publishDateEnd = ref<number>();
  152. const rowId = ref<string>(); // id
  153. const rowPrice = ref<string>(); // 单价
  154. const rowType = ref<string>(); // 类型
  155. const rowRegion = ref<string>(); //版本
  156. const { t } = useI18n();
  157. const pcShow = ref<boolean>(true);
  158. const userStore = useUserStore();
  159. const lang = userStore.getLang;
  160. const config = useRuntimeConfig();
  161. const BaseUrl = ref(config.public.baseUrl);
  162. const pageSize = 9;
  163. const websiteToken = computed(() => userStore.getToken);
  164. const userInfo = computed(() => userStore.getUserInfo);
  165. function viewDetail(item: any) {
  166. const language = lang === "zh-CN" ? "" : "en";
  167. router.push({
  168. name: "reportDetail",
  169. params: {
  170. webTitle: item.webTitle + "-" + item.id,
  171. lang: language,
  172. keyword: record.value.queryKeyword,
  173. },
  174. });
  175. }
  176. const spinShow = ref("none");
  177. const categories = ref();
  178. //const prices = ref<ResearchReport[]>();
  179. const publishDates = ref();
  180. // onBeforeRouteUpdate((to) => {
  181. // const keyword = to.params.keyword;
  182. // console.log(keyword);
  183. // if(keyword && keyword != 'undefined'){
  184. // record.value.queryKeyword = keyword;
  185. // setTimeout(async() => {
  186. // await getData()
  187. // }, 1000);
  188. // }
  189. // })
  190. const dealTypeShow = (type: string) => {
  191. if (categories.value) {
  192. let arr = categories.value;
  193. for (let i = 0; i < arr.length; i++) {
  194. if (arr[i].marketType == type) {
  195. return arr[i].marketTypeName;
  196. }
  197. }
  198. }
  199. };
  200. // 联系我们
  201. function handleContact() {
  202. demandShow.value = true;
  203. }
  204. onMounted(async () => {
  205. if (typeof window !== "undefined") {
  206. window.scrollTo(0, 1);
  207. }
  208. // 接收参数,导航栏进入
  209. const marketType = route.params.category;
  210. record.value.marketType = marketType;
  211. const keyword = route.params.keyword;
  212. if (keyword) {
  213. record.value.queryKeyword = keyword;
  214. }
  215. // 列表
  216. await getData();
  217. // 此段代码解决无法监听home页面跳转显示tag问题
  218. const item = containsType(categories.value, marketType);
  219. categoryTag.value = item?.marketTypeName;
  220. pcShow.value = !isMobile();
  221. });
  222. watch(
  223. () => [route.params.category, route.params.keyword],
  224. async ([newCate, newKeyword], [oldCate, oldKeyword]) => {
  225. record.value.marketType = newCate;
  226. record.value.queryKeyword = newKeyword;
  227. await getData();
  228. const item = containsType(categories.value, newCate);
  229. categoryTag.value = item?.marketTypeName;
  230. }
  231. );
  232. async function getData() {
  233. spinShow.value = "block";
  234. record.value.lang = lang;
  235. const ret = await researchReportListData(record.value);
  236. pageList.value = ret;
  237. spinShow.value = "none";
  238. const ret2 = await researchReportCategoryList(record.value);
  239. categories.value = ret2;
  240. const ret3 = await researchReportPublishDateList(record.value);
  241. // prices.value = ret2.data.prices;
  242. publishDates.value = ret3;
  243. }
  244. // 选择/取消类别
  245. function handleCategory(
  246. item: boolean,
  247. value: string | undefined,
  248. label: string | undefined
  249. ) {
  250. //const lang = useLocaleStore().getLocale;
  251. const language = lang === "zh-CN" ? "" : "en";
  252. // item.checked = !Boolean(item.checked);
  253. record.value.marketType =
  254. record.value.marketType != item.marketType ? item.marketType : "";
  255. if (record.value.marketType) {
  256. router.push({
  257. name: "reports",
  258. params: { category: value, lang: language },
  259. });
  260. } else {
  261. router.push({ name: "reports", params: { lang: language } });
  262. }
  263. }
  264. // 关闭tag
  265. function handleCloseTag(_e: MouseEvent, type: string) {
  266. if ("marketType" === type) {
  267. record.value.marketType = "";
  268. categoryTag.value = "";
  269. //const lang = useLocaleStore().getLocale;
  270. const language = lang === "zh-CN" ? "" : "en";
  271. router.push({ name: "reports", params: { lang: language } });
  272. } else {
  273. if ("price" === type) {
  274. record.value.queryPrice = "";
  275. priceTag.value = "";
  276. }
  277. if ("publishDate" === type) {
  278. record.value.queryPublishDate = "";
  279. publishDateTag.value = "";
  280. }
  281. if ("region" === type) {
  282. record.value.reportRegion = "";
  283. regionTag.value = "";
  284. }
  285. getData();
  286. }
  287. }
  288. // 价格
  289. function handlePrice(checked: boolean, price: number | undefined) {
  290. if (checked) {
  291. if (price === 5001) {
  292. priceTag.value = ">¥5000";
  293. } else {
  294. priceTag.value = "<¥" + price;
  295. }
  296. record.value.queryPrice = price;
  297. record.value.priceEnd = "";
  298. record.value.priceStr = "";
  299. } else {
  300. record.value.queryPrice = "";
  301. priceTag.value = "";
  302. }
  303. getData();
  304. }
  305. // 发布日期
  306. function handlePublishDate(
  307. item: boolean,
  308. day: number | undefined,
  309. dayStr: string | undefined
  310. ) {
  311. if (record.value.queryPublishDate != day) {
  312. record.value.queryPublishDate = day;
  313. publishDateTag.value = dayStr;
  314. } else {
  315. record.value.queryPublishDate = "";
  316. publishDateTag.value = "";
  317. }
  318. record.value.publishDateStr = "";
  319. record.value.publishDateEnd = "";
  320. getData();
  321. }
  322. // 地区
  323. function handleRegion(checked: boolean, region: string) {
  324. if (checked) {
  325. record.value.reportRegion = region;
  326. if ("1" === region) {
  327. regionTag.value = lang == "zh-CN" ? "全球与中国" : "Global";
  328. } else {
  329. regionTag.value = lang == "zh-CN" ? "中国" : "China";
  330. }
  331. } else {
  332. record.value.reportRegion = "";
  333. regionTag.value = "";
  334. }
  335. getData();
  336. }
  337. // 价格区间查询
  338. function queryPrice() {
  339. const price01 = record.value.priceStr,
  340. price02 = record.value.priceEnd;
  341. if (price01) {
  342. // 价格end不存在或者小于价格str,则只计算大于价格str
  343. let priceDesc = "";
  344. if (price02) {
  345. if (price02 > price01) {
  346. priceDesc = "¥" + price01 + "~" + price02;
  347. } else {
  348. priceDesc = ">¥" + price01;
  349. }
  350. } else {
  351. priceDesc = ">¥" + price01;
  352. }
  353. priceTag.value = priceDesc;
  354. } else {
  355. if (price02 && price02 > 0) {
  356. priceTag.value = "<¥" + price02;
  357. } else {
  358. priceTag.value = "";
  359. }
  360. }
  361. record.value.queryPrice = ""; //去掉价格
  362. getData();
  363. }
  364. // 发布日期区间查询
  365. function queryPublishDate() {
  366. const dateStr = publishDateStr.value,
  367. dateEnd = publishDateEnd.value;
  368. if (dateStr) {
  369. const date01 = formatDate(dateStr, "yyyy-MM-dd");
  370. let dateTag = "",
  371. date02;
  372. if (dateEnd) {
  373. date02 = formatDate(dateEnd, "yyyy-MM-dd");
  374. if (dateEnd > dateStr) {
  375. dateTag = date01 + "~" + date02;
  376. } else {
  377. dateTag = ">" + date01;
  378. }
  379. } else {
  380. dateTag = ">" + date01;
  381. }
  382. publishDateTag.value = dateTag;
  383. record.value.publishDateStr = date01;
  384. record.value.publishDateEnd = date02;
  385. } else {
  386. if (dateEnd) {
  387. const date02 = formatDate(dateEnd, "yyyy-MM-dd");
  388. publishDateTag.value = "<" + date02;
  389. record.value.publishDateEnd = date02;
  390. } else {
  391. record.value.publishDateStr = undefined;
  392. record.value.publishDateEnd = undefined;
  393. }
  394. }
  395. record.value.queryPublishDate = "";
  396. getData();
  397. }
  398. // 关键字查询
  399. // function handleSearch(){
  400. // getData();
  401. // }
  402. // 提交需求
  403. function handleDemand(item: any, type: string) {
  404. rowId.value = item.id;
  405. rowPrice.value = item.price?.toString();
  406. rowType.value = type;
  407. rowRegion.value = item.reportRegion;
  408. demandShow.value = true;
  409. }
  410. const tocontentBuy = (item: any) => {
  411. if (userInfo.value?.id && websiteToken.value) {
  412. let param = {
  413. researchReportId: item.id,
  414. payMethod: "paypal",
  415. payPrice: item.price,
  416. payResearchKey: item.priceKey,
  417. payResearchType:
  418. item.priceName.split("-")[2] == "企业数据"
  419. ? t("report.detail.EnterpriseMarketShare")
  420. : t("report.detail.integrity"),
  421. payResearchVersion: "",
  422. };
  423. param.payResearchVersion =
  424. item.priceName.split("-")[3] == "单用户版单价"
  425. ? t("report.detail.singlePrice")
  426. : item.priceName.split("-")[3] == "多用户版单价"
  427. ? t("report.detail.multiPrice")
  428. : t("report.detail.enterprisePrice02");
  429. item.btnLoading = true;
  430. createOrder_Api(param)
  431. .then((res) => {
  432. window.open(res.data.orderPayUrl);
  433. })
  434. .finally(() => {
  435. item.btnLoading = false;
  436. });
  437. } else {
  438. userStore.setShowLoginDialog(true);
  439. // errorMsg("请先登录");
  440. }
  441. };
  442. // 关闭diag
  443. function handleCloseDiag() {
  444. demandShow.value = false;
  445. }
  446. // 改变页数
  447. function changePage(page: number) {
  448. document.documentElement.scrollTop = 0;
  449. record.value.pageNo = page;
  450. getData();
  451. }
  452. onServerPrefetch(async () => {
  453. try {
  454. const marketType = route.params.category;
  455. record.value.marketType = marketType;
  456. const keyword = route.params.keyword;
  457. if (keyword) {
  458. record.value.queryKeyword = keyword;
  459. }
  460. // 列表
  461. await getData();
  462. // 此段代码解决无法监听home页面跳转显示tag问题
  463. const item = containsType(categories.value, marketType);
  464. categoryTag.value = item?.marketTypeName;
  465. } catch (error) {
  466. console.log(error);
  467. }
  468. });
  469. useHead({
  470. title: t("common.navigate.report") + "-" + t("defaultSettings.title"),
  471. viewport: "width=device-width,initial-scale=1,maximum-scale=1 ",
  472. charset: "utf-8",
  473. meta: [
  474. {
  475. hid: "keywords",
  476. name: "keywords",
  477. content: t("defaultSettings.keyword"),
  478. },
  479. {
  480. hid: "description",
  481. name: "description",
  482. content: t("defaultSettings.desc"),
  483. },
  484. ],
  485. });
  486. </script>
  487. <style lang="scss" scoped>
  488. @import "~/assets/css/tool.scss";
  489. .page {
  490. .top {
  491. width: 100%;
  492. position: relative;
  493. margin-top: var(--size-130);
  494. img {
  495. width: 100%;
  496. }
  497. > div {
  498. width: 100%;
  499. padding: var(--size-60) var(--size-176) 0;
  500. position: absolute;
  501. top: 0;
  502. left: 0;
  503. .top_title {
  504. font-size: var(--size-48);
  505. font-family: Arial, Arial-Bold;
  506. font-weight: 700;
  507. text-align: left;
  508. color: #ffffff;
  509. }
  510. .top_location {
  511. font-size: var(--size-14);
  512. font-family: Arial, Arial-Regular;
  513. font-weight: 400;
  514. color: #ffffff;
  515. .icon-dkw_guanbi- {
  516. color: #ffffff;
  517. font-size: var(--size-12);
  518. }
  519. span {
  520. color: #72ff56;
  521. }
  522. }
  523. }
  524. }
  525. .box {
  526. background: #f6f7fa;
  527. padding: var(--size-30) var(--size-147) var(--size-70);
  528. display: flex;
  529. .box_l {
  530. background: #ffffff;
  531. width: var(--size-493);
  532. flex-shrink: 0;
  533. .box_l_title {
  534. width: 100%;
  535. padding: var(--size-20) var(--size-30);
  536. background: #6aaa87;
  537. font-size: var(--size-22);
  538. font-family: Arial, Arial-Bold;
  539. font-weight: 700;
  540. text-align: left;
  541. color: #ffffff;
  542. line-height: var(--size-22);
  543. display: flex;
  544. justify-content: space-between;
  545. span {
  546. font-size: var(--size-13);
  547. }
  548. }
  549. .box_l_list {
  550. padding: var(--size-12) 0;
  551. border: 1px solid #ffffff;
  552. border-bottom: var(--size-20) solid #ffffff;
  553. background: #f4f7f9;
  554. min-height: var(--size-282);
  555. .box_l_list_item {
  556. padding: var(--size-6) var(--size-30);
  557. display: flex;
  558. justify-content: space-between;
  559. background: #f4f7f9;
  560. cursor: pointer;
  561. .box_l_list_item_l {
  562. font-size: var(--size-18);
  563. font-family: Arial, Arial-Regular;
  564. color: #639e57;
  565. line-height: var(--size-22);
  566. }
  567. .box_l_list_item_r {
  568. width: var(--size-27);
  569. height: var(--size-27);
  570. border: 1px solid #639e57;
  571. border-radius: 50%;
  572. display: flex;
  573. align-items: center;
  574. justify-content: center;
  575. > div {
  576. width: var(--size-17);
  577. height: var(--size-17);
  578. background: #639e57;
  579. border-radius: 50%;
  580. display: block;
  581. }
  582. span {
  583. display: none;
  584. }
  585. }
  586. }
  587. .active {
  588. .box_l_list_item_l {
  589. font-weight: 700;
  590. }
  591. .box_l_list_item_r {
  592. background: #639e57;
  593. span {
  594. color: #ffffff;
  595. font-size: var(--size-25);
  596. }
  597. > div {
  598. display: none;
  599. }
  600. span {
  601. display: block;
  602. }
  603. }
  604. }
  605. .selBox {
  606. display: flex;
  607. align-items: center;
  608. padding: var(--size-8) var(--size-30);
  609. > span {
  610. display: inline-block;
  611. }
  612. .selBox_btn {
  613. width: var(--size-68);
  614. height: var(--size-44);
  615. background: linear-gradient(90deg, #719d58 4%, #43a086 99%);
  616. border-radius: var(--size-4);
  617. font-size: var(--size-16);
  618. font-family: Microsoft YaHei, Microsoft YaHei-Regular;
  619. color: #ffffff;
  620. cursor: pointer;
  621. text-align: center;
  622. line-height: var(--size-44);
  623. flex-shrink: 0;
  624. }
  625. }
  626. }
  627. }
  628. .box_r {
  629. margin-left: var(--size-46);
  630. flex-grow: 1;
  631. .box_r_list {
  632. display: flex;
  633. flex-wrap: wrap;
  634. // justify-content: space-between;
  635. .box_r_list_item {
  636. background: #ffffff;
  637. width: var(--size-338);
  638. border-radius: var(--size-10);
  639. margin-right: var(--size-26);
  640. margin-bottom: var(--size-27);
  641. overflow: hidden;
  642. &:nth-child(3n) {
  643. margin-right: 0;
  644. }
  645. > img {
  646. width: var(--size-338);
  647. height: var(--size-394);
  648. display: block;
  649. }
  650. .box_r_list_item_content {
  651. padding: var(--size-15) var(--size-18);
  652. .box_r_list_title {
  653. font-size: var(--size-18);
  654. font-family: Arial, Arial-Regular;
  655. color: #1a1a1a;
  656. line-height: var(--size-28);
  657. overflow: hidden;
  658. text-overflow: ellipsis;
  659. display: -webkit-box;
  660. -webkit-line-clamp: 2;
  661. -webkit-box-orient: vertical;
  662. }
  663. .box_r_list_time {
  664. font-size: var(--size-14);
  665. font-family: Microsoft YaHei, Microsoft YaHei-Regular;
  666. color: #999999;
  667. line-height: var(--size-26);
  668. display: flex;
  669. align-items: center;
  670. .desc-icon {
  671. display: flex !important;
  672. align-items: center;
  673. img {
  674. width: var(--size-18);
  675. height: var(--size-18);
  676. margin-left: var(--size-4);
  677. }
  678. }
  679. &:nth-child(2) {
  680. span {
  681. font-size: var(--size-22);
  682. position: relative;
  683. left: var(--size--2);
  684. }
  685. }
  686. &:nth-child(3),
  687. &:nth-child(4) {
  688. span {
  689. font-size: var(--size-18);
  690. display: inline-block;
  691. margin-right: var(--size-3);
  692. }
  693. }
  694. }
  695. }
  696. .box_r_list_item_btn {
  697. display: flex;
  698. justify-content: space-between;
  699. padding: var(--size-20) var(--size-18);
  700. border-top: 1px solid rgba(230, 230, 230, 0.5);
  701. > div {
  702. width: var(--size-145);
  703. height: var(--size-48);
  704. border-radius: var(--size-8);
  705. font-size: var(--size-14);
  706. font-family: Arial, Arial-Regular;
  707. text-align: center;
  708. color: #ffffff;
  709. line-height: var(--size-48);
  710. cursor: pointer;
  711. }
  712. .box_r_list_item_btn_l {
  713. background: #60ac92;
  714. }
  715. .box_r_list_item_btn_r {
  716. background: #84a86c;
  717. }
  718. }
  719. }
  720. .box_r_list_item:hover {
  721. box-shadow: 0px var(--size-9) var(--size-16) 0px #d1d1d1;
  722. }
  723. }
  724. .pageBox {
  725. display: flex;
  726. justify-content: center;
  727. ::v-deep .n-pagination-item {
  728. min-width: var(--size-42);
  729. height: var(--size-42);
  730. background: #f2f2f2;
  731. border: 1px solid #cccccc;
  732. border-radius: var(--size-4);
  733. font-size: var(--size-14);
  734. color: #808080;
  735. text-align: center;
  736. line-height: var(--size-40);
  737. }
  738. ::v-deep .n-pagination-item--active {
  739. background: rgba(57, 154, 192, 1);
  740. color: #ffffff;
  741. &:hover {
  742. background: rgba(57, 154, 192, 1);
  743. color: #ffffff;
  744. }
  745. }
  746. .pageBox_btn {
  747. width: var(--size-70);
  748. color: #333333;
  749. }
  750. ::v-deep(.n-input__input) {
  751. height: var(--size-40);
  752. line-height: var(--size-40);
  753. }
  754. ::v-deep(.n-pagination .n-pagination-quick-jumper .n-input) {
  755. border: 1px solid #cccccc;
  756. }
  757. .pageBox_inp {
  758. font-size: var(--size-16);
  759. }
  760. }
  761. }
  762. }
  763. }
  764. ::v-deep .n-date-picker > div {
  765. --n-height: var(--size-45) !important;
  766. margin-top: var(--size-1);
  767. }
  768. .load {
  769. display: v-bind("spinShow");
  770. }
  771. @include responseTo("phone") {
  772. .page {
  773. .top {
  774. img {
  775. height: 100px;
  776. object-fit: cover;
  777. }
  778. > div {
  779. padding: 15px;
  780. .top_title {
  781. font-size: 28px;
  782. }
  783. }
  784. }
  785. .box {
  786. padding: 15px;
  787. width: 100%;
  788. display: block;
  789. .box_l {
  790. width: 100%;
  791. .box_l_list {
  792. .box_l_list_item {
  793. padding: var(--size-6) var(--size-20);
  794. .box_l_list_item_l {
  795. font-size: 16px;
  796. }
  797. .box_l_list_item_r {
  798. width: var(--size-20);
  799. height: var(--size-20);
  800. > div {
  801. width: var(--size-12);
  802. height: var(--size-12);
  803. }
  804. }
  805. }
  806. .active .box_l_list_item_r span {
  807. font-size: var(--size-18);
  808. }
  809. .selBox {
  810. padding: var(--size-6) var(--size-20);
  811. .selBox_btn {
  812. width: var(--size-52);
  813. height: var(--size-34);
  814. border-radius: var(--size-4);
  815. font-size: var(--size-16);
  816. line-height: var(--size-34);
  817. }
  818. }
  819. }
  820. }
  821. .box_r {
  822. margin: 0;
  823. .box_r_list {
  824. .box_r_list_item {
  825. width: 100%;
  826. margin-right: 0;
  827. > img {
  828. width: 100%;
  829. }
  830. }
  831. }
  832. .pageBox {
  833. ::v-deep .n-pagination-item {
  834. min-width: var(--size-21);
  835. height: var(--size-21);
  836. border-radius: var(--size-2);
  837. font-size: var(--size-8);
  838. line-height: var(--size-20);
  839. }
  840. .pageBox_btn {
  841. width: var(--size-35);
  842. }
  843. ::v-deep(.n-input__input) {
  844. height: var(--size-20);
  845. line-height: var(--size-20);
  846. font-size: var(--size-9);
  847. }
  848. .pageBox_inp {
  849. font-size: var(--size-8);
  850. }
  851. ::v-deep(.n-pagination .n-pagination-quick-jumper .n-input) {
  852. width: var(--size-35);
  853. }
  854. ::v-deep(.n-input .n-input__input-el) {
  855. height: var(--size-20);
  856. line-height: var(--size-20);
  857. }
  858. }
  859. }
  860. }
  861. }
  862. ::v-deep(.n-input__input) {
  863. height: var(--size-34);
  864. line-height: var(--size-34);
  865. font-size: 14px;
  866. }
  867. }
  868. h2 {
  869. margin: 0;
  870. }
  871. </style>