adweb3Home.vue 23 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719
  1. <template>
  2. <div class="home">
  3. <!--网站概况-->
  4. <a-row class="top-title">
  5. <a-col :span="24">
  6. <div style="display: flex; margin-top: 20px">
  7. <span class="t1"> 站点: </span>
  8. <select-site @set-site-info="changeUser" selectWidth="300px" />
  9. <a :href="siteDomain" class="web-link" target="_blank">{{ siteDomain }}</a>
  10. </div>
  11. </a-col>
  12. </a-row>
  13. <!--基础信息-->
  14. <a-card title="网站概况">
  15. <a-row>
  16. <a-col class="border-right" :span="12">
  17. <a-spin :spinning="baseInfoLoading">
  18. <a-row class="web-info">
  19. <a-col :span="8">
  20. <div class="web-content">
  21. <p class="title">交付状态</p>
  22. <p class="content">
  23. <span>{{ filter_Null_format(baseInfo.deliveryProgress) }}</span>
  24. </p>
  25. </div>
  26. </a-col>
  27. <a-col :span="8">
  28. <div class="web-content">
  29. <p class="title">运行状态</p>
  30. <p class="content">
  31. <span v-if="baseInfo.runStatus == 0">创建失败</span><span v-if="baseInfo.runStatus == 1">正常运行</span
  32. ><span v-if="baseInfo.runStatus == 2">运行异常</span>
  33. <span v-if="baseInfo.runStatus == 3">站点停止</span>
  34. </p>
  35. </div>
  36. </a-col>
  37. <a-col :span="8">
  38. <div class="web-content">
  39. <p class="title">网站运行</p>
  40. <p class="content">
  41. <span> {{ filter_Null_format(baseInfo.runDays) }}天 </span>
  42. </p>
  43. </div>
  44. </a-col>
  45. </a-row>
  46. </a-spin>
  47. <a-steps style="margin-top: 30px; cursor: pointer" label-placement="vertical" v-model:current="current">
  48. <a-step disabled v-for="(item, index) in stepData" :key="index" style="cursor: pointer">
  49. <template #icon>
  50. <a-popover :title="item.title">
  51. <template v-if="index < current">
  52. <CheckCircle-Outlined :style="{ fontSize: '26px', color: 'green' }" />
  53. </template>
  54. <template v-else-if="index == current">
  55. <ClockCircle-Outlined :style="{ fontSize: '26px', color: '#9b9696' }" />
  56. </template>
  57. <template v-else>
  58. <Lock-Outlined :style="{ fontSize: '26px', color: '#e5e7eb' }" />
  59. </template>
  60. </a-popover>
  61. </template>
  62. </a-step>
  63. </a-steps>
  64. </a-col>
  65. <a-col :span="12">
  66. <a-spin :spinning="baseInfoLoading">
  67. <a-row class="web-info">
  68. <a-col :span="8">
  69. <div class="web-content">
  70. <p class="title">套餐类型</p>
  71. <p class="content">
  72. <span>{{ filter_Null_format(baseInfo.planName) }}</span>
  73. </p>
  74. </div>
  75. </a-col>
  76. <a-col :span="8">
  77. <div class="web-content">
  78. <p class="title">创建时间</p>
  79. <p class="content">
  80. <span>{{ filter_Null_format(baseInfo.createTime) }}</span>
  81. </p>
  82. </div>
  83. </a-col>
  84. <a-col :span="8">
  85. <div class="web-content">
  86. <p class="title">预计服务到期时间</p>
  87. <p class="content">
  88. <span>{{ filter_Null_format(baseInfo.endTime) }}</span>
  89. </p>
  90. </div>
  91. </a-col>
  92. </a-row>
  93. </a-spin>
  94. </a-col>
  95. </a-row>
  96. </a-card>
  97. <a-row class="r3">
  98. <a-col :span="24">
  99. <a-card title="核心数据">
  100. <a-row class="r5" :gutter="[20, 20]">
  101. <a-col :span="4" class="border-right">
  102. <div class="wrap effect">
  103. <a-spin :spinning="coreInfoLoading">
  104. <!-- <router-link :to="{ path: '/inquiry/list', query: { timeType: 'thisWeek' } }">-->
  105. <div class="fr">
  106. <p class="title">本周询盘数</p>
  107. <p class="theme-color">{{ formatNumber(currentWeekEnquiryCount) }}</p>
  108. </div>
  109. <!-- </router-link>-->
  110. </a-spin>
  111. </div>
  112. </a-col>
  113. <a-col :span="4" class="border-right">
  114. <div class="wrap effect">
  115. <a-spin :spinning="coreInfoLoading">
  116. <!-- <router-link :to="{ path: '/inquiry/list', query: { timeType: 'thisMonth' } }">-->
  117. <div class="fr">
  118. <p class="title">本月询盘数</p>
  119. <p class="theme-color">{{ formatNumber(currentMonthEnquiryCount) }}</p>
  120. </div>
  121. <!-- </router-link>-->
  122. </a-spin>
  123. </div>
  124. </a-col>
  125. <a-col :span="4" class="border-right">
  126. <!-- <router-link :to="{ path: '/inquiry/list' }">-->
  127. <div class="wrap effect">
  128. <a-spin :spinning="coreInfoLoading">
  129. <div class="fr">
  130. <p class="title">累计询盘数</p>
  131. <p class="theme-color">{{ formatNumber(totalEnquiryCount) }}</p>
  132. </div>
  133. </a-spin>
  134. </div>
  135. <!-- </router-link>-->
  136. </a-col>
  137. <a-col :span="4" class="border-right">
  138. <div class="wrap blue">
  139. <a-spin :spinning="coreInfoLoading">
  140. <div class="fr">
  141. <p class="title">本周流量</p>
  142. <p>{{ formatNumber(thisWeekData.totalUsers) }}</p>
  143. </div>
  144. </a-spin>
  145. </div>
  146. </a-col>
  147. <a-col :span="4" class="border-right">
  148. <div class="wrap blue">
  149. <a-spin :spinning="coreInfoLoading">
  150. <div class="fr">
  151. <p class="title">本月流量</p>
  152. <p>{{ formatNumber(thisMonthData.totalUsers) }}</p>
  153. </div>
  154. </a-spin>
  155. </div>
  156. </a-col>
  157. <a-col :span="4">
  158. <div class="wrap blue">
  159. <a-spin :spinning="coreInfoLoading">
  160. <div class="fr">
  161. <p class="title">累计流量</p>
  162. <p>{{ formatNumber(allTimeData.totalUsers) }}</p>
  163. </div>
  164. </a-spin>
  165. </div>
  166. </a-col>
  167. <a-col :span="24" style="margin-top: 10px">
  168. <a-table
  169. class="ant-table-striped"
  170. :loading="coreDetailLoading"
  171. :columns="columns"
  172. :pagination="false"
  173. :data-source="coreDataTable"
  174. :row-class-name="(_record, index) => (index % 2 === 1 ? 'table-striped' : null)"
  175. bordered
  176. />
  177. <p style="color: #999; font-size: 13px">注:今日数据每小时更新一次。</p>
  178. </a-col>
  179. <a-row class="r5-1">
  180. <div class="fl">
  181. <a-button-group>
  182. <a-button :type="timeChooseIndex == 7 ? 'primary' : 'default'" class="time-btn" @click="changeTime(7)">最近7天</a-button>
  183. <a-button :type="timeChooseIndex == 30 ? 'primary' : 'default'" class="time-btn" @click="changeTime(30)">最近30天</a-button>
  184. <a-button :type="timeChooseIndex == 180 ? 'primary' : 'default'" class="time-btn" @click="changeTime(180)">最近六个月</a-button>
  185. </a-button-group>
  186. </div>
  187. <a-col :span="24">
  188. <a-spin :spinning="chartsLoading" style="float: left; width: 100%">
  189. <area-chart v-if="coreDataChart.x.length > 0" :dataSource="coreDataChart" />
  190. <a-empty v-else style="float: right; width: 100%; margin-top: 110px" />
  191. </a-spin>
  192. </a-col>
  193. </a-row>
  194. <a-row class="r5-1" :gutter="[20, 20]">
  195. <a-col style="width: 20%" class="border-right">
  196. <div class="wrap">
  197. <div class="fr">
  198. <p class="title">日均访问量</p>
  199. <p style="font-size: 25px">{{ formatNumber(averageVisit) }}</p>
  200. </div>
  201. </div>
  202. </a-col>
  203. <a-col style="width: 20%" class="border-right">
  204. <div class="wrap">
  205. <div class="fr">
  206. <p class="title">平均访问时长</p>
  207. <p style="font-size: 25px">{{ averageVisitDuration }}</p>
  208. </div>
  209. </div>
  210. </a-col>
  211. <a-col style="width: 20%" class="border-right">
  212. <div class="wrap">
  213. <div class="fr">
  214. <p class="title">访客平均访问页面数</p>
  215. <p style="font-size: 25px">{{ formatNumber(averageVisitPage) }}</p>
  216. </div>
  217. </div>
  218. </a-col>
  219. <a-col style="width: 20%" class="border-right">
  220. <div class="wrap">
  221. <div class="fr">
  222. <p class="title">跳出率</p>
  223. <p style="font-size: 25px">{{ bounceRate }}</p>
  224. </div>
  225. </div>
  226. </a-col>
  227. <a-col style="width: 20%">
  228. <div class="wrap">
  229. <div class="fr">
  230. <p class="title">UV到询盘转化率</p>
  231. <p style="font-size: 25px">{{ conversionRate }}</p>
  232. </div>
  233. </div>
  234. </a-col>
  235. </a-row>
  236. </a-row>
  237. </a-card>
  238. </a-col>
  239. </a-row>
  240. </div>
  241. </template>
  242. <script lang="ts" setup name="Adweb3Home">
  243. import areaChart from '/@/views/adweb/data/chart/areaChart.vue';
  244. import { getAction } from '/@/api/manage/manage';
  245. import { useUserStore } from '/@/store/modules/user';
  246. import selectSite from '/@/components/Adweb/selectSite.vue';
  247. import '/@/assets/less/home.less';
  248. import { useMessage } from '/@/hooks/web/useMessage';
  249. import { onMounted, reactive, ref, h } from 'vue';
  250. import { LockOutlined, CheckCircleOutlined, LoadingOutlined, ClockCircleOutlined } from '@ant-design/icons-vue';
  251. const { createMessage } = useMessage();
  252. const current = ref(0);
  253. let stepData = ref([{ value: '', title: '', color: '', description: '', status: 0 }]);
  254. const columns = [
  255. {
  256. title: '指标',
  257. dataIndex: 'targetName',
  258. },
  259. {
  260. title: '今日',
  261. dataIndex: 'todayCount',
  262. },
  263. {
  264. title: '昨日',
  265. dataIndex: 'yesterdayCount',
  266. scopedSlots: { customRender: 'yesterdayCount' },
  267. },
  268. {
  269. title: '本周',
  270. dataIndex: 'currentWeekCount',
  271. scopedSlots: { customRender: 'currentWeekCount' },
  272. },
  273. {
  274. title: '上周',
  275. dataIndex: 'lastWeekCount',
  276. },
  277. {
  278. title: '本月',
  279. dataIndex: 'currentMonthCount',
  280. },
  281. {
  282. title: '上月',
  283. dataIndex: 'lastMonthCount',
  284. },
  285. {
  286. title: '全部',
  287. dataIndex: 'totalCount',
  288. },
  289. ];
  290. const userRole = ref('');
  291. const timeChooseIndex = ref(7);
  292. //网站概况
  293. const siteDomain = ref('');
  294. const siteCode = ref('');
  295. const siteStatus = ref(0);
  296. let baseInfo = reactive<any>({});
  297. const baseInfoLoading = ref(false);
  298. //物料完成情况
  299. // TODO
  300. //核心数据
  301. const coreInfoLoading = ref(false);
  302. const coreDetailLoading = ref(false);
  303. const chartsLoading = ref(false);
  304. const achievePercent = ref(0);
  305. const appointWordCount = ref(0);
  306. const currentAchieveCount = ref(0);
  307. const currentMonthEnquiryCount = ref(0);
  308. const currentWeekEnquiryCount = ref(0);
  309. const totalEnquiryCount = ref(0);
  310. let flowIndicator = ref({});
  311. let coreDataTable = ref([]);
  312. const coreDataChart = ref({
  313. x: [],
  314. uv: [],
  315. pv: [],
  316. enquiry: [],
  317. });
  318. const averageVisit = ref(0);
  319. const averageVisitDuration = ref(0);
  320. const averageVisitPage = ref(0);
  321. const bounceRate = ref(0);
  322. const conversionRate = ref(0);
  323. const isShow = ref(false);
  324. onMounted(() => {
  325. userRole.value = useUserStore().roleList;
  326. showStep();
  327. });
  328. //改变站点
  329. function changeUser(selectedParamSiteInfo: any) {
  330. siteCode.value = selectedParamSiteInfo.code;
  331. siteDomain.value = selectedParamSiteInfo.domain;
  332. siteStatus.value = selectedParamSiteInfo.status;
  333. getAllInfo();
  334. }
  335. function filter_Null_format(value) {
  336. if (value === '' || value === null || value === undefined) {
  337. return '--';
  338. } else {
  339. return value;
  340. }
  341. }
  342. //保证先获取到站点列表,获取到siteCode及siteId后再进行此方法
  343. function getAllInfo() {
  344. getBaseInfo();
  345. getCoreData();
  346. getCoreDataChart();
  347. }
  348. //获取基础信息
  349. function getBaseInfo() {
  350. let d = {
  351. siteCode: siteCode.value,
  352. };
  353. baseInfoLoading.value = true;
  354. getAction('/adweb/adwebSiteManage/siteBasicInfo', d).then(function (res) {
  355. baseInfoLoading.value = false;
  356. if (res.code == 200) {
  357. baseInfo = res.result;
  358. current.value = baseInfo.siteStatus;
  359. isShow.value = true;
  360. } else {
  361. createMessage.error('获取站点基础信息失败,请刷新重试');
  362. }
  363. });
  364. }
  365. const yesterdayData = ref({});
  366. const todayData = ref({});
  367. const thisWeekData = ref({});
  368. const lastWeekData = ref({});
  369. const thisMonthData = ref({});
  370. const lastMonthData = ref({});
  371. const allTimeData = ref({});
  372. //获取核心数据
  373. function getCoreData() {
  374. let d = {
  375. siteCode: siteCode.value,
  376. };
  377. coreInfoLoading.value = true;
  378. getAction('/dmp-data/site-periodic/stats', d).then(function (res) {
  379. coreInfoLoading.value = false;
  380. if (res.code == 200) {
  381. yesterdayData.value = res.result.yesterday;
  382. todayData.value = res.result.today;
  383. thisWeekData.value = res.result.thisWeek;
  384. lastWeekData.value = res.result.lastWeek;
  385. thisMonthData.value = res.result.thisMonth;
  386. lastMonthData.value = res.result.lastMonth;
  387. allTimeData.value = res.result.allTime;
  388. // achievePercent.value = res.data.achievePercent;
  389. // appointWordCount.value = res.data.appointWordCount;
  390. // currentAchieveCount.value = res.data.currentAchieveCount;
  391. // currentMonthEnquiryCount.value = res.data.currentMonthEnquiryCount;
  392. // currentWeekEnquiryCount.value = res.data.currentWeekEnquiryCount;
  393. // totalEnquiryCount.value = res.data.totalEnquiryCount;
  394. // flowIndicator = res.data.flowIndicator;
  395. currentWeekEnquiryCount.value = thisWeekData.value.enquires;
  396. currentMonthEnquiryCount.value = thisMonthData.value.enquires;
  397. totalEnquiryCount.value = allTimeData.value.enquires;
  398. coreDataTable.value = [];
  399. coreDataTable.value.push(
  400. {
  401. targetName: '访客数(UV)',
  402. todayCount: todayData.value.totalUsers,
  403. yesterdayCount: yesterdayData.value.totalUsers,
  404. currentWeekCount: thisWeekData.value.totalUsers,
  405. lastWeekCount: lastWeekData.value.totalUsers,
  406. currentMonthCount: thisMonthData.value.totalUsers,
  407. lastMonthCount: lastMonthData.value.totalUsers,
  408. totalCount: allTimeData.value.totalUsers,
  409. },
  410. {
  411. targetName: '访问量(PV)',
  412. todayCount: todayData.value.pageViews,
  413. yesterdayCount: yesterdayData.value.pageViews,
  414. currentWeekCount: thisWeekData.value.pageViews,
  415. lastWeekCount: lastWeekData.value.pageViews,
  416. currentMonthCount: thisMonthData.value.pageViews,
  417. lastMonthCount: lastMonthData.value.pageViews,
  418. totalCount: allTimeData.value.pageViews,
  419. },
  420. {
  421. targetName: '询盘数',
  422. todayCount: todayData.value.enquires,
  423. yesterdayCount: yesterdayData.value.enquires,
  424. currentWeekCount: thisWeekData.value.enquires,
  425. lastWeekCount: lastWeekData.value.enquires,
  426. currentMonthCount: thisMonthData.value.enquires,
  427. lastMonthCount: lastMonthData.value.enquires,
  428. totalCount: allTimeData.value.enquires,
  429. },
  430. {
  431. targetName: '询盘转化率',
  432. todayCount: todayData.value.enquiryConversionRate,
  433. yesterdayCount: yesterdayData.value.enquiryConversionRate,
  434. currentWeekCount: thisWeekData.value.enquiryConversionRate,
  435. lastWeekCount: lastWeekData.value.enquiryConversionRate,
  436. currentMonthCount: thisMonthData.value.enquiryConversionRate,
  437. lastMonthCount: lastMonthData.value.enquiryConversionRate,
  438. totalCount: allTimeData.value.enquiryConversionRate,
  439. }
  440. );
  441. } else {
  442. createMessage.error('获取核心数据信息失败,请刷新重试');
  443. }
  444. });
  445. }
  446. //改变图表的时间维度
  447. function changeTime(time) {
  448. console.log(time);
  449. timeChooseIndex.value = time;
  450. getCoreDataChart();
  451. }
  452. //核心数据的面积图
  453. const getCoreDataChart = async () => {
  454. let d = {
  455. siteCode: siteCode.value,
  456. dateType: timeChooseIndex.value,
  457. };
  458. chartsLoading.value = true;
  459. const res = await getAction('/dmp-data/site-overview/stats', d);
  460. if (res.code == 200) {
  461. let r = res.result == null ? {} : res.result;
  462. averageVisit.value = r.dailyTotalUsers == null ? '0' : r.dailyTotalUsers;
  463. averageVisitDuration.value = r.avgTimeOnPage == null ? '0' : r.avgTimeOnPage;
  464. averageVisitPage.value = r.pageViewsPerSession == null ? '0' : r.pageViewsPerSession;
  465. bounceRate.value = r.bounceRate == null ? '0' : r.bounceRate;
  466. conversionRate.value = r.enquiryConversionRate == null ? '0' : r.enquiryConversionRate;
  467. let x = [],
  468. pv = [],
  469. uv = [],
  470. enquiry = [];
  471. if (r.dailyStats != null && r.dailyStats.length > 0) {
  472. for (let i in r.dailyStats) {
  473. x.push(r.dailyStats[i].date);
  474. pv.push(r.dailyStats[i].pageViews);
  475. uv.push(r.dailyStats[i].totalUsers);
  476. enquiry.push(r.dailyStats[i].enquires);
  477. }
  478. }
  479. coreDataChart.value.x = x;
  480. coreDataChart.value.pv = pv;
  481. coreDataChart.value.uv = uv;
  482. coreDataChart.value.enquiry = enquiry;
  483. } else {
  484. averageVisit.value = 0;
  485. averageVisitDuration.value = 0;
  486. averageVisitPage.value = 0;
  487. bounceRate.value = 0;
  488. coreDataChart.value.x = [];
  489. coreDataChart.value.pv = [];
  490. coreDataChart.value.uv = [];
  491. coreDataChart.value.enquiry = [];
  492. createMessage.error('获取核心数据图表信息失败,请刷新重试');
  493. }
  494. chartsLoading.value = false;
  495. };
  496. // 添加格式化数字的函数
  497. function formatNumber(num) {
  498. if (num === '' || num === null || num === undefined) {
  499. return '--';
  500. }
  501. return num.toString().replace(/\B(?=(\d{3})+(?!\d))/g, ',');
  502. }
  503. function showStep() {
  504. stepData.value = [];
  505. getAction('/sys/dict/getDictItems/build_website_status', null)
  506. .then((res) => {
  507. if (res.code === 0) {
  508. stepData.value = res.result;
  509. }
  510. })
  511. .catch((e) => {
  512. createMessage.warning('获取数据失败!' + e.message());
  513. });
  514. }
  515. </script>
  516. <style lang="less">
  517. .home {
  518. .ant-select {
  519. color: #fff;
  520. .ant-select-selection {
  521. background-color: transparent;
  522. }
  523. .ant-select-arrow {
  524. color: #fff;
  525. }
  526. }
  527. }
  528. </style>
  529. <style scoped lang="less">
  530. p,
  531. span {
  532. color: #000;
  533. margin: 0;
  534. }
  535. .theme-color {
  536. color: @primary-color;
  537. }
  538. .title {
  539. font-size: 18px;
  540. color: #000;
  541. }
  542. </style>
  543. <style lang="less">
  544. .pop-wrap {
  545. .ant-popover-inner-content {
  546. padding: 0;
  547. }
  548. .wrap {
  549. width: 400px;
  550. padding: 20px 20px;
  551. background-position: bottom right;
  552. p {
  553. line-height: 1.8;
  554. i {
  555. color: @primary-color;
  556. margin-right: 10px;
  557. }
  558. }
  559. .name {
  560. font-size: 18px;
  561. margin-bottom: 20px;
  562. }
  563. .job {
  564. font-size: 15px;
  565. color: #9f9f9f;
  566. }
  567. .ant-col-8 {
  568. text-align: right;
  569. }
  570. }
  571. }
  572. .faban {
  573. .ant-modal {
  574. .ant-modal-content {
  575. background-color: transparent;
  576. box-shadow: none;
  577. .ant-modal-close {
  578. top: 70px;
  579. right: -10px;
  580. .ant-modal-close-x {
  581. width: auto;
  582. height: auto;
  583. }
  584. }
  585. .self-close {
  586. i {
  587. color: #fff;
  588. border: 1px solid #fff;
  589. width: 25px;
  590. height: 25px;
  591. display: block;
  592. line-height: 25px;
  593. }
  594. }
  595. .ant-modal-body {
  596. .top-bg {
  597. background: url('../../../../assets/home/faban/topbg.png') no-repeat;
  598. min-height: 242px;
  599. background-size: 100% 100%;
  600. display: flex;
  601. justify-content: center;
  602. align-items: flex-end;
  603. font-size: 38px;
  604. padding-bottom: 60px;
  605. p {
  606. color: #fff;
  607. }
  608. }
  609. .info-wrap {
  610. background: #fff;
  611. padding: 0 40px;
  612. overflow: hidden;
  613. border-bottom-left-radius: 15px;
  614. border-bottom-right-radius: 15px;
  615. margin-top: -1px;
  616. p {
  617. position: relative;
  618. padding-left: 30px;
  619. margin-bottom: 5px;
  620. letter-spacing: 1px;
  621. &:before {
  622. content: '';
  623. position: absolute;
  624. left: 0;
  625. width: 15px;
  626. height: 15px;
  627. background: url('../../../../assets/home/faban/dot.svg');
  628. background-repeat: no-repeat;
  629. top: 3px;
  630. }
  631. }
  632. img {
  633. width: 70px;
  634. float: right;
  635. padding: 40px 0;
  636. }
  637. }
  638. }
  639. }
  640. }
  641. }
  642. </style>
  643. <style lang="less" scoped>
  644. .time-btn {
  645. &.ant-btn-default {
  646. color: #666;
  647. background: #f5f5f5;
  648. border-color: #d9d9d9;
  649. &:hover {
  650. color: @primary-color;
  651. border-color: @primary-color;
  652. }
  653. }
  654. }
  655. // 添加表格头部样式
  656. :deep(.ant-table-thead > tr > th) {
  657. background: #e6f7ff !important;
  658. font-weight: 700; // 字重改为700
  659. color: rgba(13, 62, 122, 1) !important; // 字体颜色调整
  660. }
  661. // 添加斑马线样式
  662. :deep(.table-striped) {
  663. background-color: #fafafa;
  664. }
  665. </style>