You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

726 lines
23 KiB

  1. <script setup>
  2. import {computed, onMounted, ref, watch} from 'vue'
  3. import {dayjs, ElMessage} from 'element-plus'
  4. import request from '@/util/http.js'
  5. import API from '@/util/http.js'
  6. import moment from 'moment'
  7. import {useAdminStore} from "@/store/index.js";
  8. import {storeToRefs} from "pinia";
  9. // 国际化
  10. import { useI18n } from 'vue-i18n';
  11. const { t } = useI18n();
  12. const adminStore = useAdminStore();
  13. const {flag} = storeToRefs(adminStore);
  14. // 监听全局flag状态变化
  15. watch(flag, (newFlag, oldFlag) => {
  16. // 当flag状态改变时,重新发送请求
  17. if (newFlag !== oldFlag) {
  18. selectLiveBy()
  19. }
  20. })
  21. // 之后整理一下
  22. /*
  23. ====================工具方法==============================
  24. */
  25. const defaultTime = [
  26. new Date(2000, 1, 1, 0, 0, 0),
  27. new Date(2000, 2, 1, 23, 59, 59),
  28. ]
  29. const format3 = (num) => {
  30. // 每三位添加逗号
  31. return num.toLocaleString('en-US')
  32. }
  33. // 时间格式化
  34. const formatTime = (val) => val ? dayjs(val).format('YYYY-MM-DD HH:mm:ss') : ''
  35. /*
  36. ====================数据=================================
  37. */
  38. //这是获取用户信息的接口
  39. const adminData = ref({})
  40. // 充值明细表格
  41. const tableData = ref([])
  42. // 搜索beanConsumeLive 表单
  43. const beanConsumeLive = ref({
  44. jwcode: null,
  45. dept: "",
  46. type: "",
  47. gift: "",
  48. liveChannel: "",
  49. liveName: "",
  50. startTime: '',
  51. endTime: '',
  52. sortField: '',
  53. sortOrder: ''
  54. })
  55. // 礼物列表
  56. const gifts = ref([])
  57. // 获取礼物列表的方法
  58. const getGift = async function () {
  59. try {
  60. const result = await request({
  61. url: '/beanConsume/getLiveGift', // todo 换成实际接口地址
  62. data: {account: adminData.value.account}
  63. })
  64. console.log('请求礼物列表成功', result)
  65. // 存储礼物数据
  66. gifts.value = result.data
  67. console.log('礼物数据', gifts.value)
  68. } catch (error) {
  69. console.log('请求礼物列表失败', error)
  70. ElMessage({
  71. type: 'error',
  72. message: t('elmessage.getGiftListFailed')
  73. })
  74. }
  75. }
  76. // 频道列表
  77. const channels = ref([])
  78. // 获取频道列表的方法
  79. const getChannel = async function () {
  80. try {
  81. const result = await request({
  82. url: '/beanConsume/getLiveChannel', // todo 换成实际接口地址
  83. data: {account: adminData.value.account}
  84. })
  85. console.log('请求频道列表成功', result)
  86. // 存储频道数据
  87. channels.value = result.data
  88. console.log('频道数据', channels.value)
  89. } catch (error) {
  90. console.log('请求频道列表失败', error)
  91. ElMessage({
  92. type: 'error',
  93. message: t('elmessage.getChannelListFailed')
  94. })
  95. }
  96. }
  97. // 抽离类型选项到响应式数组
  98. const consumeTypes = ref([
  99. {label: t('consume.consumeTypes.1'), value: 1},
  100. {label: t('consume.consumeTypes.2'), value: 2},
  101. {label: t('consume.consumeTypes.3'), value: 3},
  102. {label: t('consume.consumeTypes.4'), value: 4},
  103. {label: t('consume.consumeTypes.5'), value: 5},
  104. {label: t('consume.consumeTypes.6'), value: 6}
  105. ])
  106. // 处理类型选择变化
  107. const handleTypeChange = (value) => {
  108. if (value !== 1) {
  109. beanConsumeLive.value.gift = ''
  110. }
  111. }
  112. //------------------------
  113. // 标记当前激活的时间范围按钮
  114. const activeTimeRange = ref('')
  115. // 日期选择器变化时清除按钮激活状态
  116. const handleDatePickerChange = () => {
  117. activeTimeRange.value = ''
  118. }
  119. // 搜索对象
  120. const getObj = ref({
  121. pageNum: 1,
  122. pageSize: 50
  123. })
  124. //分页总条目
  125. const total = ref(100)
  126. // 搜索对象时间
  127. const getTime = ref({
  128. startTime: '',
  129. endTime: ''
  130. })
  131. // 搜索地区列表
  132. const dept = ref([])
  133. // 获取地区列表的方法
  134. const getDept = async function () {
  135. try {
  136. // 发送请求获取地区列表
  137. const result = await request({
  138. // url: '/general/dept',
  139. url: '/beanConsume/getDept', // todo 换成实际接口地址
  140. data: {account: adminData.value.account}
  141. })
  142. console.log('请求地区列表成功', result)
  143. // 存储地区数据
  144. dept.value = result.data
  145. console.log('地区数据', dept.value)
  146. } catch (error) {
  147. console.log('请求地区列表失败', error)
  148. ElMessage({
  149. type: 'error',
  150. message: t('elmessage.getRegionListFailed')
  151. })
  152. }
  153. }
  154. // 新增排序字段和排序方式
  155. const sortField = ref('')
  156. const sortOrder = ref('')
  157. // 合计数
  158. const permanentBean = ref(0)
  159. const freeBean = ref(0)
  160. const totalNum = ref(0)
  161. /*
  162. ====================方法=================================
  163. */
  164. // 获取登录用户信息
  165. const getAdminData = async function () {
  166. try {
  167. const result = await request({
  168. url: '/admin/userinfo',
  169. data: {}
  170. })
  171. adminData.value = result
  172. console.log('请求成功', result)
  173. console.log('用户信息', adminData.value)
  174. } catch (error) {
  175. console.log('请求失败', error)
  176. }
  177. }
  178. const selectLiveBy = async function (val) {
  179. try {
  180. // 搜索参数页码赋值
  181. if (typeof val === 'number') {
  182. getObj.value.pageNum = val
  183. }
  184. // 搜索参数时间赋值
  185. // 修复时间范围处理
  186. if (Array.isArray(getTime.value) && getTime.value.length === 2) {
  187. beanConsumeLive.value.startTime = formatTime(getTime.value[0])
  188. beanConsumeLive.value.endTime = formatTime(getTime.value[1])
  189. } else {
  190. beanConsumeLive.value.startTime = ''
  191. beanConsumeLive.value.endTime = ''
  192. }
  193. // 设置排序参数
  194. beanConsumeLive.value.sortField = sortField.value
  195. beanConsumeLive.value.sortOrder = sortOrder.value
  196. console.log('搜索参数_时间', beanConsumeLive.value.startTime)
  197. console.log('搜索参数1', getObj.value)
  198. console.log('搜索参数2', beanConsumeLive.value)
  199. // 发送POST请求
  200. const result = await request({
  201. url: '/beanConsume/selectLiveBy',
  202. data: {
  203. pageNum: getObj.value.pageNum,
  204. pageSize: getObj.value.pageSize,
  205. beanConsumeLive: {
  206. ...beanConsumeLive.value,
  207. jwcode: beanConsumeLive.value.jwcode ? String(beanConsumeLive.value.jwcode) : '',
  208. dept: beanConsumeLive.value.dept || '',
  209. type: beanConsumeLive.value.type || '',
  210. gift: beanConsumeLive.value.gift || '',
  211. beanNum: beanConsumeLive.value.beanNum || '',
  212. isBackpack: beanConsumeLive.value.isBackpack || '',
  213. liveChannel: beanConsumeLive.value.liveChannel || '',
  214. liveName: beanConsumeLive.value.liveName || '',
  215. startTime: beanConsumeLive.value.startTime || '',
  216. endTime: beanConsumeLive.value.endTime || '',
  217. sortField: beanConsumeLive.value.sortField || 'consumeTime',
  218. sortOrder: beanConsumeLive.value.sortOrder || 'desc',
  219. flag: flag.value,
  220. roleId: adminData.value.roleId
  221. }
  222. }
  223. })
  224. console.log('请求成功2', sortField)
  225. console.log('接口响应结果', result); // 打印接口响应结果
  226. if (result.code === 200 && result.data && result.data.list) {
  227. tableData.value = result.data.list;
  228. total.value = result.data.total;
  229. }
  230. // 复制一份 beanConsumeLive.value 并设置固定的 payType 值 1是直播
  231. const sumConsumeParams = {
  232. payType: 1, // 固定传入 payType 值 1 是直播
  233. beanConsumeLive: {
  234. ...beanConsumeLive.value,
  235. flag: flag.value
  236. }
  237. };
  238. // 发送 POST 请求获取合计数
  239. const resultTotalGold = await request({
  240. url: '/beanConsume/sumConsumeGold',
  241. data: sumConsumeParams
  242. });
  243. console.log("总计", resultTotalGold);
  244. const data = resultTotalGold.data || resultTotalGold;
  245. console.log('请求成功1', resultTotalGold.data) //undifined
  246. console.log('permanentBean1', data.permanentBean)
  247. // 返回字段为 permanentBean、freeBean、totalNum
  248. permanentBean.value = Number(data.permanentBean) || 0;
  249. freeBean.value = Number(data.freeBean) || 0;
  250. totalNum.value = Number(data.totalNum) || 0;
  251. // 存储分页总数
  252. total.value = result.data.total
  253. console.log('total', total.value)
  254. } catch (error) {
  255. console.log('请求失败', error)
  256. }
  257. }
  258. // 搜索
  259. const search = function () {
  260. getObj.value.pageNum = 1
  261. if (beanConsumeLive.value.jwcode) {
  262. const numRef = /^\d{1,9}$/;
  263. if (!numRef.test(beanConsumeLive.value.jwcode)) {
  264. ElMessage.error(t('elmessage.checkJwcodeFormat'))
  265. return
  266. }
  267. }
  268. selectLiveBy()
  269. }
  270. // 重置
  271. const reset = function () {
  272. console.log('直播的重置')
  273. beanConsumeLive.value.jwcode = null
  274. beanConsumeLive.value.type = ''
  275. beanConsumeLive.value.gift = ''
  276. beanConsumeLive.value.liveChannel = ''
  277. beanConsumeLive.value.liveName = ''
  278. beanConsumeLive.value.dept = ''
  279. beanConsumeLive.value.startTime = ''
  280. beanConsumeLive.value.endTime = ''
  281. sortField.value = ''
  282. sortOrder.value = ''
  283. getTime.value = {}
  284. activeTimeRange.value = '' // 清除激活状态
  285. // 重置页码
  286. getObj.value.pageNum = 1
  287. // 点完重置后,重新请求数据
  288. selectLiveBy()
  289. console.log(' beanConsumeLive', beanConsumeLive.value)
  290. }
  291. // 今天
  292. const getToday = function () {
  293. const today = dayjs()
  294. const startTime = today.startOf('day').format('YYYY-MM-DD HH:mm:ss')
  295. const endTime = today.endOf('day').format('YYYY-MM-DD HH:mm:ss')
  296. getTime.value = [startTime, endTime]
  297. console.log('getTime', getTime.value)
  298. activeTimeRange.value = 'today' // 标记当前激活状态
  299. selectLiveBy()
  300. }
  301. // 昨天
  302. const getYesterday = function () {
  303. const today = dayjs()
  304. const startTime = today.subtract(1, 'day').startOf('day').format('YYYY-MM-DD HH:mm:ss')
  305. const endTime = today.subtract(1, 'day').endOf('day').format('YYYY-MM-DD HH:mm:ss')
  306. getTime.value = [startTime, endTime]
  307. console.log('getTime', getTime.value)
  308. activeTimeRange.value = 'yesterday' // 标记当前激活状态
  309. selectLiveBy()
  310. }
  311. // 近7天
  312. const get7Days = function () {
  313. const today = dayjs()
  314. const startTime = today.subtract(6, 'day').startOf('day').format('YYYY-MM-DD HH:mm:ss')
  315. const endTime = today.endOf('day').format('YYYY-MM-DD HH:mm:ss')
  316. getTime.value = [startTime, endTime]
  317. console.log('getTime', getTime.value)
  318. activeTimeRange.value = '7days' // 标记当前激活状态
  319. selectLiveBy()
  320. }
  321. // 处理排序事件
  322. const handleSortChange = (column) => {
  323. console.log('排序字段:', column.prop)
  324. console.log('排序方式:', column.order)
  325. if (column.prop === 'beanNum') {
  326. sortField.value = 'beanNum'
  327. } else if (column.prop === 'consumeTime') {
  328. sortField.value = 'consumeTime'
  329. } else if (column.prop === 'buyBean') {
  330. sortField.value = 'buyBean'
  331. } else if (column.prop === 'freeBean') {
  332. sortField.value = 'freeBean'
  333. }
  334. sortOrder.value = column.order === 'ascending' ? 'DESC' : 'ASC'
  335. selectLiveBy()
  336. }
  337. const handlePageSizeChange = function (val) {
  338. getObj.value.pageSize = val
  339. selectLiveBy()
  340. }
  341. const handleCurrentChange = function (val) {
  342. getObj.value.pageNum = val
  343. selectLiveBy()
  344. }
  345. /*
  346. ====================计算属性=================================
  347. */
  348. // 计算总金币数
  349. // const totalBean = computed(() => permanentBean.value + freeBean.value)
  350. /*
  351. ====================监听=================================
  352. */
  353. /*
  354. ====================挂载=================================
  355. */
  356. onMounted(async function () {
  357. await getAdminData()
  358. await selectLiveBy()
  359. await getDept()
  360. await getGift()
  361. await getChannel()
  362. })
  363. const exportExcel = async function () {
  364. console.log('1')
  365. const params = {
  366. ...getObj.value,
  367. "beanConsumeLive": {
  368. ...beanConsumeLive.value,
  369. jwcode: beanConsumeLive.value.jwcode ? String(beanConsumeLive.value.jwcode) : '',
  370. dept: beanConsumeLive.value.dept || '',
  371. type: beanConsumeLive.value.type || '',
  372. gift: beanConsumeLive.value.gift || '',
  373. liveChannel: beanConsumeLive.value.liveChannel || '',
  374. liveName: beanConsumeLive.value.liveName || '',
  375. startTime: beanConsumeLive.value.startTime || '',
  376. endTime: beanConsumeLive.value.endTime || '',
  377. sortField: sortField.value || 'consumeTime',
  378. sortOrder: sortOrder.value || 'desc',
  379. roleId: adminData.value.roleId,
  380. flag: flag.value,
  381. }
  382. }
  383. // 打印请求参数,方便调试
  384. console.log('导出请求参数:', params);
  385. try {
  386. console.log('2')
  387. const res = await API({url: '/export/exportLive', data: params});
  388. console.log('导出请求响应:', res);
  389. if (res.code === 200) {
  390. ElMessage.success(t('elmessage.exportSuccess'));
  391. } else {
  392. ElMessage.error(res.message || t('elmessage.exportFailed'));
  393. }
  394. } catch (error) {
  395. console.error('导出请求出错:', error);
  396. ElMessage.error(t('elmessage.exportFailed'));
  397. }
  398. }
  399. const exportListVisible = ref(false)
  400. // 打开导出列表弹窗
  401. const openExportList = () => {
  402. getExportList()
  403. exportListVisible.value = true
  404. }
  405. // 导出列表数据
  406. const exportList = ref([])
  407. // 导出列表加载状态
  408. const exportListLoading = ref(false)
  409. // 获取导出列表
  410. const getExportList = async () => {
  411. exportListLoading.value = true
  412. try {
  413. const result = await API({url: '/export/export'})
  414. if (result.code === 200) {
  415. const filteredData = result.data.filter(item => {
  416. return item.type === 6; //6是直播
  417. });
  418. exportList.value = filteredData
  419. } else {
  420. ElMessage.error(result.msg || t('elmessage.getExportListError'))
  421. }
  422. } catch (error) {
  423. console.error('获取导出列表出错:', error)
  424. ElMessage.error(t('elmessage.getExportListError'))
  425. } finally {
  426. exportListLoading.value = false
  427. }
  428. }
  429. // 下载导出文件
  430. const downloadExportFile = (item) => {
  431. if (item.state === 2) {
  432. const link = document.createElement('a')
  433. link.href = item.url
  434. link.download = item.fileName
  435. link.click()
  436. } else {
  437. ElMessage.warning(t('elmessage.exportingInProgress'))
  438. }
  439. }
  440. //根据状态返回对应的标签类型
  441. const getTagType = (state) => {
  442. switch (state) {
  443. case 0:
  444. return 'info';
  445. case 1:
  446. return 'primary';
  447. case 2:
  448. return 'success';
  449. case 3:
  450. return 'danger';
  451. default:
  452. return 'info';
  453. }
  454. }
  455. //根据状态返回对应的标签文案
  456. const getTagText = (state) => {
  457. switch (state) {
  458. case 0:
  459. return t('elmessage.pendingExecution');
  460. case 1:
  461. return t('elmessage.executing');
  462. case 2:
  463. return t('elmessage.executed');
  464. case 3:
  465. return t('elmessage.errorExecution');
  466. default:
  467. return t('elmessage.unknownStatus');
  468. }
  469. }
  470. </script>
  471. <template>
  472. <el-card class="card1" style="margin-bottom: 0.5vh;">
  473. <el-col style="margin-bottom: 1vh">
  474. <div class="select">
  475. <div class="selectRow">
  476. <el-text class="text">{{ t('common.jwcode') }}</el-text>
  477. <el-input class="selectContent" v-model="beanConsumeLive.jwcode" :placeholder="t('common.jwcodePlaceholder')" clearable/>
  478. </div>
  479. <div class="selectRow">
  480. <el-text class="text">{{ t('common.market') }}</el-text>
  481. <el-select class="selectContent" v-model="beanConsumeLive.dept" :placeholder="t('common.marketPlaceholder')" clearable>
  482. <el-option v-for="(item, index) in dept" :key="index" :label="item" :value="item"/>
  483. </el-select>
  484. </div>
  485. <div class="selectRow" style="width: 14vw;">
  486. <el-text class="text">{{ t('common.giftName') }}</el-text>
  487. <el-select class="selectContent" v-model="beanConsumeLive.gift" :placeholder="t('common.giftNamePlaceholder')" clearable
  488. filterable
  489. allow-create default-first-option>
  490. <el-option v-for="(item, index) in gifts" :key="index" :label="item" :value="item"/>
  491. </el-select>
  492. </div>
  493. <div class="selectRow" style="min-width: 12vw;">
  494. <el-text class="textB" size="large">{{ t('common.channel') }}</el-text>
  495. <el-select class="selectContent" v-model="beanConsumeLive.liveChannel" :placeholder="t('common.channelPlaceholder')" clearable
  496. filterable allow-create default-first-option>
  497. <el-option v-for="(item, index) in channels" :key="index" :label="item" :value="item"/>
  498. </el-select>
  499. </div>
  500. <div class="selectRow" style="min-width: 12vw;">
  501. <el-text class="textB" size="large">{{ t('common.liveRoom') }}</el-text>
  502. <el-input class="selectContent" v-model="beanConsumeLive.liveName" :placeholder="t('common.liveRoomPlaceholder')" clearable/>
  503. </div>
  504. </div>
  505. </el-col>
  506. <el-col>
  507. <div class="select">
  508. <div class="selectRow" style="width: 31.4vw;">
  509. <el-text class="text">{{ t('common.consumetime') }}</el-text>
  510. <el-date-picker class="selectContent" v-model="getTime" type="datetimerange" :range-separator="t('common.to')"
  511. :start-placeholder="t('common.startTime')" :end-placeholder="t('common.endTime')" style="margin-right:1vw;width:480px"
  512. @change="handleDatePickerChange" :default-time="defaultTime"/>
  513. <div v-if="false">
  514. <el-button @click="getToday()" :type="activeTimeRange === 'today' ? 'primary' : ''"> </el-button>
  515. <el-button @click="getYesterday()" :type="activeTimeRange === 'yesterday' ? 'primary' : ''"> </el-button>
  516. <el-button @click="get7Days()" :type="activeTimeRange === '7days' ? 'primary' : ''"> 近7天</el-button>
  517. </div>
  518. </div>
  519. <div class="selectRow" style="justify-content: flex-start;">
  520. <el-button type="primary" @click="search()">{{ t('common.search') }}</el-button>
  521. <el-button type="primary" @click="exportExcel()">{{ t('common.exportExcel') }}</el-button>
  522. <el-button type="primary" @click="openExportList">{{ t('common.viewExportList') }}</el-button>
  523. <el-button type="success" @click="reset()">{{ t('common.reset') }}</el-button>
  524. </div>
  525. </div>
  526. </el-col>
  527. </el-card>
  528. <el-card class="card2">
  529. <div class="goldStatistics">
  530. {{ t('common.totalGoldBean') }}{{ format3(Math.abs(permanentBean + freeBean)) }}&nbsp;&nbsp;&nbsp;&nbsp;
  531. {{ t('common.payGoldBean') }}{{ format3(Math.abs(permanentBean)) }}&nbsp;&nbsp;&nbsp;&nbsp;
  532. {{ t('common.freeGoldBean') }}{{ format3(Math.abs(freeBean)) }}
  533. </div>
  534. <div style="overflow-y: auto">
  535. <el-table :data="tableData" style="width: 82vw" height="65vh" @sort-change="handleSortChange"
  536. :row-style="{ height: '50px' }">
  537. <el-table-column type="index" :label="t('common_list.id')" width="80px" fixed="left">
  538. <template #default="scope">
  539. <span>{{
  540. scope.$index + 1 + (getObj.pageNum - 1) * getObj.pageSize
  541. }}</span>
  542. </template>
  543. </el-table-column>
  544. <!-- 固定姓名列 -->
  545. <el-table-column prop="name" :label="t('common_list.name')" width="150px" fixed="left" show-overflow-tooltip/>
  546. <!-- 固定精网号列 -->
  547. <el-table-column prop="jwcode" :label="t('common_list.jwcode')" width="110px" fixed="left"/>
  548. <el-table-column prop="dept" :label="t('common_list.market')" width="110px"/>
  549. <el-table-column prop="gift" :label="t('common_list.gift')" width="150px">
  550. </el-table-column>
  551. <el-table-column prop="beanNum" :label="t('common_list.beanNum')" sortable="custom" width="120px"/>
  552. <el-table-column prop="isBackpack" :label="t('common_list.isBackpack')" width="120px">
  553. <template #default="scope">
  554. {{ scope.row.isBackpack == 1 ? t('common_list.yes') : t('common_list.no') }}
  555. </template>
  556. </el-table-column>
  557. <el-table-column prop="buyBean" :label="t('common_list.permanentBean')" sortable="custom" width="120px"/>
  558. <el-table-column prop="freeBean" :label="t('common_list.freeBean')" sortable="custom" width="120px"/>
  559. <el-table-column prop="liveChannel" :label="t('common_list.channel')" width="120px" show-overflow-tooltip/>
  560. <el-table-column prop="liveName" :label="t('common_list.liveRoomName')" width="160px" show-overflow-tooltip/>
  561. <el-table-column prop="consumeTime" :label="t('common_list.consumetime')" sortable="custom" width="190px"/>
  562. </el-table>
  563. </div>
  564. <el-pagination background :current-page="getObj.pageNum" :page-size="getObj.pageSize"
  565. :page-sizes="[5, 10, 20, 50, 100]" style="margin-top: 20px;"
  566. layout="total, sizes, prev, pager, next, jumper" :total="total" @size-change="handlePageSizeChange"
  567. @current-change="handleCurrentChange"></el-pagination>
  568. </el-card>
  569. <!-- 导出弹窗 -->
  570. <el-dialog v-model="exportListVisible" :title="t('common_export.exportList')" width="80%">
  571. <el-table :data="exportList" style="width: 100% ;height: 60vh;" :loading="exportListLoading">
  572. <el-table-column prop="fileName" :label="t('common_export.fileName')"/>
  573. <el-table-column prop="state" :label="t('common_export.status')">
  574. <template #default="scope">
  575. <el-tag :type="getTagType(scope.row.state)" :effect="scope.row.state === 3 ? 'light' : 'plain'">
  576. {{ getTagText(scope.row.state) }}
  577. </el-tag>
  578. </template>
  579. </el-table-column>
  580. <el-table-column prop="createTime" :label="t('common_export.createTime')">
  581. <template #default="scope">
  582. {{ moment(scope.row.createTime).format('YYYY-MM-DD HH:mm:ss') }}
  583. </template>
  584. </el-table-column>
  585. <el-table-column :label="t('common_export.operation')">
  586. <template #default="scope">
  587. <el-button type="primary" size="small" @click="downloadExportFile(scope.row)"
  588. :disabled="scope.row.state !== 2">
  589. {{ t('common_export.download') }}
  590. </el-button>
  591. </template>
  592. </el-table-column>
  593. </el-table>
  594. <template #footer>
  595. <div class="dialog-footer">
  596. <el-button text @click="exportListVisible = false">{{ t('common_export.close') }}</el-button>
  597. </div>
  598. </template>
  599. </el-dialog>
  600. </template>
  601. <style scoped lang="scss">
  602. // 搜索的卡片样式
  603. .card1 {
  604. background: #F3FAFE;
  605. }
  606. // 表单的卡片样式
  607. .card2 {
  608. background: #E7F4FD;
  609. }
  610. // 新币总数等等
  611. .goldStatistics {
  612. margin-left: 1vw;
  613. margin-bottom: 1vh;
  614. color: #000000;
  615. font-family: "PingFang SC";
  616. font-size: 16px;
  617. font-style: normal;
  618. font-weight: 700;
  619. line-height: 20px;
  620. }
  621. // 表头背景等
  622. :deep(.el-table__header-wrapper),
  623. :deep(.el-table__body-wrapper),
  624. :deep(.el-table__cell),
  625. /* 表格 */
  626. :deep(.el-table__body td) {
  627. background-color: #F3FAFE !important;
  628. }
  629. /* 表头 */
  630. :deep(.el-table__header th) {
  631. background-color: #F3FAFE !important;
  632. }
  633. /* 鼠标悬停 */
  634. :deep(.el-table__row:hover > .el-table__cell) {
  635. background-color: #E5EBFE !important;
  636. }
  637. .pagination {
  638. display: flex;
  639. margin-top: 20px;
  640. }
  641. /** 搜索的样式 */
  642. .select {
  643. display: flex;
  644. .selectRow {
  645. width: 14.7vw;
  646. display: flex;
  647. align-items: center;
  648. justify-content: center;
  649. padding: 0 0.5vw;
  650. .text {
  651. width: 5.3vw;
  652. font-size: 15px;
  653. }
  654. .selectContent {
  655. flex: 1;
  656. }
  657. }
  658. }
  659. </style>