index.vue 26 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904
  1. <template>
  2. <div class="page">
  3. <div class="top">
  4. <img src="@/assets/images/report/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 language = lang === "zh-CN" ? "" : "en";
  251. record.value.marketType =
  252. record.value.marketType != item.marketType ? item.marketType : "";
  253. if (record.value.marketType) {
  254. router.push({
  255. name: "reports",
  256. params: { category: value },
  257. });
  258. } else {
  259. router.push({ name: "reports", params: { lang: language } });
  260. }
  261. }
  262. // 关闭tag
  263. function handleCloseTag(_e: MouseEvent, type: string) {
  264. if ("marketType" === type) {
  265. record.value.marketType = "";
  266. categoryTag.value = "";
  267. const language = lang === "zh-CN" ? "" : "en";
  268. router.push({ name: "reports", params: { lang: language } });
  269. } else {
  270. if ("price" === type) {
  271. record.value.queryPrice = "";
  272. priceTag.value = "";
  273. }
  274. if ("publishDate" === type) {
  275. record.value.queryPublishDate = "";
  276. publishDateTag.value = "";
  277. }
  278. if ("region" === type) {
  279. record.value.reportRegion = "";
  280. regionTag.value = "";
  281. }
  282. getData();
  283. }
  284. }
  285. // 价格
  286. function handlePrice(checked: boolean, price: number | undefined) {
  287. if (checked) {
  288. if (price === 5001) {
  289. priceTag.value = ">¥5000";
  290. } else {
  291. priceTag.value = "<¥" + price;
  292. }
  293. record.value.queryPrice = price;
  294. record.value.priceEnd = "";
  295. record.value.priceStr = "";
  296. } else {
  297. record.value.queryPrice = "";
  298. priceTag.value = "";
  299. }
  300. getData();
  301. }
  302. // 发布日期
  303. function handlePublishDate(
  304. item: boolean,
  305. day: number | undefined,
  306. dayStr: string | undefined
  307. ) {
  308. if (record.value.queryPublishDate != day) {
  309. record.value.queryPublishDate = day;
  310. publishDateTag.value = dayStr;
  311. } else {
  312. record.value.queryPublishDate = "";
  313. publishDateTag.value = "";
  314. }
  315. record.value.publishDateStr = "";
  316. record.value.publishDateEnd = "";
  317. getData();
  318. }
  319. // 地区
  320. function handleRegion(checked: boolean, region: string) {
  321. if (checked) {
  322. record.value.reportRegion = region;
  323. if ("1" === region) {
  324. regionTag.value = lang == "zh-CN" ? "全球与中国" : "Global";
  325. } else {
  326. regionTag.value = lang == "zh-CN" ? "中国" : "China";
  327. }
  328. } else {
  329. record.value.reportRegion = "";
  330. regionTag.value = "";
  331. }
  332. getData();
  333. }
  334. // 价格区间查询
  335. function queryPrice() {
  336. const price01 = record.value.priceStr,
  337. price02 = record.value.priceEnd;
  338. if (price01) {
  339. // 价格end不存在或者小于价格str,则只计算大于价格str
  340. let priceDesc = "";
  341. if (price02) {
  342. if (price02 > price01) {
  343. priceDesc = "¥" + price01 + "~" + price02;
  344. } else {
  345. priceDesc = ">¥" + price01;
  346. }
  347. } else {
  348. priceDesc = ">¥" + price01;
  349. }
  350. priceTag.value = priceDesc;
  351. } else {
  352. if (price02 && price02 > 0) {
  353. priceTag.value = "<¥" + price02;
  354. } else {
  355. priceTag.value = "";
  356. }
  357. }
  358. record.value.queryPrice = ""; //去掉价格
  359. getData();
  360. }
  361. // 发布日期区间查询
  362. function queryPublishDate() {
  363. const dateStr = publishDateStr.value,
  364. dateEnd = publishDateEnd.value;
  365. if (dateStr) {
  366. const date01 = formatDate(dateStr, "yyyy-MM-dd");
  367. let dateTag = "",
  368. date02;
  369. if (dateEnd) {
  370. date02 = formatDate(dateEnd, "yyyy-MM-dd");
  371. if (dateEnd > dateStr) {
  372. dateTag = date01 + "~" + date02;
  373. } else {
  374. dateTag = ">" + date01;
  375. }
  376. } else {
  377. dateTag = ">" + date01;
  378. }
  379. publishDateTag.value = dateTag;
  380. record.value.publishDateStr = date01;
  381. record.value.publishDateEnd = date02;
  382. } else {
  383. if (dateEnd) {
  384. const date02 = formatDate(dateEnd, "yyyy-MM-dd");
  385. publishDateTag.value = "<" + date02;
  386. record.value.publishDateEnd = date02;
  387. } else {
  388. record.value.publishDateStr = undefined;
  389. record.value.publishDateEnd = undefined;
  390. }
  391. }
  392. record.value.queryPublishDate = "";
  393. getData();
  394. }
  395. // 关键字查询
  396. // function handleSearch(){
  397. // getData();
  398. // }
  399. // 提交需求
  400. function handleDemand(item: any, type: string) {
  401. rowId.value = item.id;
  402. rowPrice.value = item.price?.toString();
  403. rowType.value = type;
  404. rowRegion.value = item.reportRegion;
  405. demandShow.value = true;
  406. }
  407. const tocontentBuy = (item: any) => {
  408. if (userInfo.value?.id && websiteToken.value) {
  409. let param = {
  410. researchReportId: item.id,
  411. payMethod: "paypal",
  412. payPrice: item.price,
  413. payResearchKey: item.priceKey,
  414. payResearchType:
  415. item.priceName.split("-")[2] == "企业数据"
  416. ? t("report.detail.EnterpriseMarketShare")
  417. : t("report.detail.integrity"),
  418. payResearchVersion: "",
  419. };
  420. param.payResearchVersion =
  421. item.priceName.split("-")[3] == "单用户版单价"
  422. ? t("report.detail.singlePrice")
  423. : item.priceName.split("-")[3] == "多用户版单价"
  424. ? t("report.detail.multiPrice")
  425. : t("report.detail.enterprisePrice02");
  426. item.btnLoading = true;
  427. createOrder_Api(param)
  428. .then((res) => {
  429. window.open(res.data.orderPayUrl);
  430. })
  431. .finally(() => {
  432. item.btnLoading = false;
  433. });
  434. } else {
  435. userStore.setShowLoginDialog(true);
  436. // errorMsg("请先登录");
  437. }
  438. };
  439. // 关闭diag
  440. function handleCloseDiag() {
  441. demandShow.value = false;
  442. }
  443. // 改变页数
  444. function changePage(page: number) {
  445. document.documentElement.scrollTop = 0;
  446. record.value.pageNo = page;
  447. getData();
  448. }
  449. // onServerPrefetch(async () => {
  450. try {
  451. const marketType = route.params.category;
  452. record.value.marketType = marketType;
  453. const keyword = route.params.keyword;
  454. if (keyword) {
  455. record.value.queryKeyword = keyword;
  456. }
  457. // 列表
  458. await getData();
  459. // 此段代码解决无法监听home页面跳转显示tag问题
  460. const item = containsType(categories.value, marketType);
  461. categoryTag.value = item?.marketTypeName;
  462. } catch (error) {
  463. console.log(error);
  464. }
  465. // });
  466. useHead({
  467. title: t("common.navigate.report") + "-" + t("defaultSettings.title"),
  468. viewport: "width=device-width,initial-scale=1,maximum-scale=1 ",
  469. charset: "utf-8",
  470. link: [
  471. {
  472. rel: "alternate",
  473. hreflang: userStore.getLang,
  474. href: config.public.domainName + route.path,
  475. },
  476. ],
  477. meta: [
  478. {
  479. hid: "keywords",
  480. name: "keywords",
  481. content: t("defaultSettings.keyword"),
  482. },
  483. {
  484. hid: "description",
  485. name: "description",
  486. content: t("defaultSettings.desc"),
  487. },
  488. ],
  489. });
  490. </script>
  491. <style lang="scss" scoped>
  492. @import "~/assets/css/tool.scss";
  493. .page {
  494. .top {
  495. width: 100%;
  496. position: relative;
  497. margin-top: var(--size-130);
  498. img {
  499. width: 100%;
  500. }
  501. > div {
  502. width: 100%;
  503. padding: var(--size-60) var(--size-176) 0;
  504. position: absolute;
  505. top: 0;
  506. left: 0;
  507. .top_title {
  508. font-size: var(--size-48);
  509. font-family: Arial, Arial-Bold;
  510. font-weight: 700;
  511. text-align: left;
  512. color: #ffffff;
  513. }
  514. .top_location {
  515. font-size: var(--size-14);
  516. font-family: Arial, Arial-Regular;
  517. font-weight: 400;
  518. color: #ffffff;
  519. .icon-dkw_guanbi- {
  520. color: #ffffff;
  521. font-size: var(--size-12);
  522. }
  523. span {
  524. color: #72ff56;
  525. }
  526. }
  527. }
  528. }
  529. .box {
  530. background: #f6f7fa;
  531. padding: var(--size-30) var(--size-147) var(--size-70);
  532. display: flex;
  533. .box_l {
  534. background: #ffffff;
  535. width: var(--size-493);
  536. flex-shrink: 0;
  537. .box_l_title {
  538. width: 100%;
  539. padding: var(--size-20) var(--size-30);
  540. background: #6aaa87;
  541. font-size: var(--size-22);
  542. font-family: Arial, Arial-Bold;
  543. font-weight: 700;
  544. text-align: left;
  545. color: #ffffff;
  546. line-height: var(--size-22);
  547. display: flex;
  548. justify-content: space-between;
  549. span {
  550. font-size: var(--size-13);
  551. }
  552. }
  553. .box_l_list {
  554. padding: var(--size-12) 0;
  555. border: 1px solid #ffffff;
  556. border-bottom: var(--size-20) solid #ffffff;
  557. background: #f4f7f9;
  558. min-height: var(--size-282);
  559. .box_l_list_item {
  560. padding: var(--size-6) var(--size-30);
  561. display: flex;
  562. justify-content: space-between;
  563. background: #f4f7f9;
  564. cursor: pointer;
  565. .box_l_list_item_l {
  566. font-size: var(--size-18);
  567. font-family: Arial, Arial-Regular;
  568. color: #639e57;
  569. line-height: var(--size-22);
  570. }
  571. .box_l_list_item_r {
  572. width: var(--size-27);
  573. height: var(--size-27);
  574. border: 1px solid #639e57;
  575. border-radius: 50%;
  576. display: flex;
  577. align-items: center;
  578. justify-content: center;
  579. > div {
  580. width: var(--size-17);
  581. height: var(--size-17);
  582. background: #639e57;
  583. border-radius: 50%;
  584. display: block;
  585. }
  586. span {
  587. display: none;
  588. }
  589. }
  590. }
  591. .active {
  592. .box_l_list_item_l {
  593. font-weight: 700;
  594. }
  595. .box_l_list_item_r {
  596. background: #639e57;
  597. span {
  598. color: #ffffff;
  599. font-size: var(--size-25);
  600. }
  601. > div {
  602. display: none;
  603. }
  604. span {
  605. display: block;
  606. }
  607. }
  608. }
  609. .selBox {
  610. display: flex;
  611. align-items: center;
  612. padding: var(--size-8) var(--size-30);
  613. > span {
  614. display: inline-block;
  615. }
  616. .selBox_btn {
  617. width: var(--size-68);
  618. height: var(--size-44);
  619. background: linear-gradient(90deg, #719d58 4%, #43a086 99%);
  620. border-radius: var(--size-4);
  621. font-size: var(--size-16);
  622. font-family: Microsoft YaHei, Microsoft YaHei-Regular;
  623. color: #ffffff;
  624. cursor: pointer;
  625. text-align: center;
  626. line-height: var(--size-44);
  627. flex-shrink: 0;
  628. }
  629. }
  630. }
  631. }
  632. .box_r {
  633. margin-left: var(--size-46);
  634. flex-grow: 1;
  635. .box_r_list {
  636. display: flex;
  637. flex-wrap: wrap;
  638. // justify-content: space-between;
  639. .box_r_list_item {
  640. background: #ffffff;
  641. width: var(--size-338);
  642. border-radius: var(--size-10);
  643. margin-right: var(--size-26);
  644. margin-bottom: var(--size-27);
  645. overflow: hidden;
  646. &:nth-child(3n) {
  647. margin-right: 0;
  648. }
  649. > img {
  650. width: var(--size-338);
  651. height: var(--size-394);
  652. display: block;
  653. }
  654. .box_r_list_item_content {
  655. padding: var(--size-15) var(--size-18);
  656. .box_r_list_title {
  657. font-size: var(--size-18);
  658. font-family: Arial, Arial-Regular;
  659. color: #1a1a1a;
  660. line-height: var(--size-28);
  661. overflow: hidden;
  662. text-overflow: ellipsis;
  663. display: -webkit-box;
  664. -webkit-line-clamp: 2;
  665. -webkit-box-orient: vertical;
  666. }
  667. .box_r_list_time {
  668. font-size: var(--size-14);
  669. font-family: Microsoft YaHei, Microsoft YaHei-Regular;
  670. color: #999999;
  671. line-height: var(--size-26);
  672. display: flex;
  673. // align-items: center;
  674. .desc-icon {
  675. display: flex !important;
  676. align-items: center;
  677. img {
  678. width: var(--size-18);
  679. height: var(--size-18);
  680. margin-left: var(--size-4);
  681. }
  682. }
  683. &:nth-child(2) {
  684. span {
  685. font-size: var(--size-22);
  686. position: relative;
  687. left: var(--size--2);
  688. }
  689. }
  690. &:nth-child(3),
  691. &:nth-child(4) {
  692. span {
  693. font-size: var(--size-18);
  694. display: inline-block;
  695. margin-right: var(--size-3);
  696. }
  697. }
  698. }
  699. }
  700. .box_r_list_item_btn {
  701. display: flex;
  702. justify-content: space-between;
  703. padding: var(--size-20) var(--size-18);
  704. border-top: 1px solid rgba(230, 230, 230, 0.5);
  705. > div {
  706. width: var(--size-145);
  707. height: var(--size-48);
  708. border-radius: var(--size-8);
  709. font-size: var(--size-14);
  710. font-family: Arial, Arial-Regular;
  711. text-align: center;
  712. color: #ffffff;
  713. line-height: var(--size-48);
  714. cursor: pointer;
  715. }
  716. .box_r_list_item_btn_l {
  717. background: #60ac92;
  718. }
  719. .box_r_list_item_btn_r {
  720. background: #84a86c;
  721. }
  722. }
  723. }
  724. .box_r_list_item:hover {
  725. box-shadow: 0px var(--size-9) var(--size-16) 0px #d1d1d1;
  726. }
  727. }
  728. .pageBox {
  729. display: flex;
  730. justify-content: center;
  731. ::v-deep .n-pagination-item {
  732. min-width: var(--size-42);
  733. height: var(--size-42);
  734. background: #f2f2f2;
  735. border: 1px solid #cccccc;
  736. border-radius: var(--size-4);
  737. font-size: var(--size-14);
  738. color: #808080;
  739. text-align: center;
  740. line-height: var(--size-40);
  741. }
  742. ::v-deep .n-pagination-item--active {
  743. background: rgba(57, 154, 192, 1);
  744. color: #ffffff;
  745. &:hover {
  746. background: rgba(57, 154, 192, 1);
  747. color: #ffffff;
  748. }
  749. }
  750. .pageBox_btn {
  751. width: var(--size-70);
  752. color: #333333;
  753. }
  754. ::v-deep(.n-input__input) {
  755. height: var(--size-40);
  756. line-height: var(--size-40);
  757. }
  758. ::v-deep(.n-pagination .n-pagination-quick-jumper .n-input) {
  759. border: 1px solid #cccccc;
  760. }
  761. .pageBox_inp {
  762. font-size: var(--size-16);
  763. }
  764. }
  765. }
  766. }
  767. }
  768. ::v-deep .n-date-picker > div {
  769. --n-height: var(--size-45) !important;
  770. margin-top: var(--size-1);
  771. }
  772. .load {
  773. display: v-bind("spinShow");
  774. }
  775. @include responseTo("phone") {
  776. .page {
  777. .top {
  778. img {
  779. height: var(--size-100);
  780. object-fit: cover;
  781. }
  782. > div {
  783. padding: var(--size-15);
  784. .top_title {
  785. font-size: var(--size-28);
  786. }
  787. }
  788. }
  789. .box {
  790. padding: var(--size-15);
  791. width: 100%;
  792. display: block;
  793. .box_l {
  794. width: 100%;
  795. .box_l_list {
  796. .box_l_list_item {
  797. padding: var(--size-6) var(--size-20);
  798. .box_l_list_item_l {
  799. font-size: 16px;
  800. }
  801. .box_l_list_item_r {
  802. width: var(--size-20);
  803. height: var(--size-20);
  804. > div {
  805. width: var(--size-12);
  806. height: var(--size-12);
  807. }
  808. }
  809. }
  810. .active .box_l_list_item_r span {
  811. font-size: var(--size-18);
  812. }
  813. .selBox {
  814. padding: var(--size-6) var(--size-20);
  815. .selBox_btn {
  816. width: var(--size-52);
  817. height: var(--size-34);
  818. border-radius: var(--size-4);
  819. font-size: var(--size-16);
  820. line-height: var(--size-34);
  821. }
  822. }
  823. }
  824. }
  825. .box_r {
  826. margin: 0;
  827. .box_r_list {
  828. .box_r_list_item {
  829. width: 100%;
  830. margin-right: 0;
  831. > img {
  832. width: 100%;
  833. }
  834. }
  835. }
  836. .pageBox {
  837. ::v-deep .n-pagination-item {
  838. min-width: var(--size-21);
  839. height: var(--size-21);
  840. border-radius: var(--size-2);
  841. font-size: var(--size-8);
  842. line-height: var(--size-20);
  843. }
  844. .pageBox_btn {
  845. width: var(--size-35);
  846. }
  847. ::v-deep(.n-input__input) {
  848. height: var(--size-20);
  849. line-height: var(--size-20);
  850. font-size: var(--size-9);
  851. }
  852. .pageBox_inp {
  853. font-size: var(--size-8);
  854. }
  855. ::v-deep(.n-pagination .n-pagination-quick-jumper .n-input) {
  856. width: var(--size-35);
  857. }
  858. ::v-deep(.n-input .n-input__input-el) {
  859. height: var(--size-20);
  860. line-height: var(--size-20);
  861. }
  862. }
  863. }
  864. }
  865. }
  866. ::v-deep(.n-input__input) {
  867. height: var(--size-34);
  868. line-height: var(--size-34);
  869. font-size: 14px;
  870. }
  871. }
  872. h2 {
  873. margin: 0;
  874. }
  875. </style>