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.

668 lines
22 KiB

4 months ago
4 months ago
4 months ago
4 months ago
4 months ago
4 months ago
4 months ago
4 months ago
3 months ago
4 months ago
4 months ago
4 months ago
4 months ago
4 months ago
4 months ago
4 months ago
4 months ago
4 months ago
4 months ago
4 months ago
3 months ago
4 months ago
2 months ago
4 months ago
3 months ago
4 months ago
4 months ago
4 months ago
4 months ago
4 months ago
4 months ago
3 months ago
3 months ago
4 months ago
3 months ago
3 months ago
3 months ago
3 months ago
3 months ago
3 months ago
3 months ago
4 months ago
3 months ago
3 months ago
3 months ago
3 months ago
3 months ago
3 months ago
3 months ago
2 months ago
3 months ago
4 months ago
3 months ago
3 months ago
3 months ago
3 months ago
3 months ago
2 months ago
3 months ago
2 months ago
2 months ago
3 months ago
3 months ago
3 months ago
3 months ago
3 months ago
3 months ago
4 months ago
  1. <script setup>
  2. import {onMounted, ref} from 'vue'
  3. import {ElMessage} from 'element-plus'
  4. import moment from 'moment'
  5. import API from '@/util/http.js'
  6. import {reverseMarketMapping} from "../../../utils/marketMap.js";
  7. import dayjs from "dayjs";
  8. //新增复选框员工数据
  9. const showEmployeeData = ref(false)
  10. // 标记当前激活的时间范围按钮
  11. const activeTimeRange = ref('')
  12. const defaultTime = [
  13. new Date(2000, 1, 1, 0, 0, 0),
  14. new Date(2000, 2, 1, 23, 59, 59),
  15. ]
  16. // 日期选择器变化时清除按钮激活状态
  17. const handleDatePickerChange = () => {
  18. activeTimeRange.value = ''
  19. }
  20. // 定义ref 变量来存储合计数据
  21. const totalPermanentGold = ref(0)
  22. const totalFreeGold = ref(0)
  23. const totalTaskGold = ref(0)
  24. const totalGoldTotal = ref(0)
  25. // 变量
  26. const adminData = ref({})
  27. const getAdminData = async function () {
  28. try {
  29. const result = await API({url: '/admin/userinfo', data: {}})
  30. adminData.value = result
  31. console.log('请求成功', result)
  32. console.log('管理员用户信息', adminData.value)
  33. } catch (error) {
  34. console.log('请求失败', error)
  35. }
  36. }
  37. // 精网号去空格,处理 goldDetail 中的 jwcode
  38. const trimJwCode = () => {
  39. if (goldDetail.value.jwcode) {
  40. goldDetail.value.jwcode = goldDetail.value.jwcode.replace(/\s/g, '');
  41. }
  42. }
  43. //定义平台信息的加载状态
  44. const isLoadingPlatform = ref(false)
  45. // 平台信息
  46. const platform = ref([])
  47. //获取平台信息的函数
  48. const getPlatform = async () => {
  49. isLoadingPlatform.value = true;
  50. try {
  51. const result = await API({
  52. url: '/general/platform',
  53. method: 'post',
  54. data: {}// 这里添加参数
  55. })
  56. platform.value = result.data
  57. } catch (error) {
  58. console.error('获取平台信息失败:', error);
  59. ElMessage.error('获取平台信息失败,请稍后重试');
  60. } finally {
  61. isLoadingPlatform.value = false
  62. }
  63. }
  64. // 数量更新类型选项
  65. const type = [
  66. {
  67. value: '0',
  68. label: '充值'
  69. },
  70. {
  71. value: '1',
  72. label: '消耗'
  73. },
  74. {
  75. value: '2',
  76. label: '退款'
  77. }
  78. ]
  79. // 定义加载状态,获取地区数据
  80. // 定义加载状态,获取地区数据
  81. const isLoadingmarket = ref(false);
  82. const markets = ref([])
  83. // 充值明细表格
  84. const tableData = ref([])
  85. // 各金币字段变量
  86. // const sumGoldTotal = ref(0)
  87. const permanentGold = ref(0)
  88. //const freeGold = ref(0)
  89. const taskGold = ref(0)
  90. // 搜索===========================================
  91. //分页总条目
  92. const total = ref(100)
  93. // 搜索对象时间
  94. const getTime = ref([])
  95. // 搜索goldDetail
  96. const goldDetail = ref({
  97. markets: [],
  98. })
  99. // 搜索对象
  100. const getObj = ref({
  101. pageNum: 1,
  102. pageSize: 50
  103. })
  104. // 开启条件筛选导出excel
  105. // const getPutEX = ref(false)
  106. // 方法
  107. // 搜索===========================================================================
  108. // 搜索方法
  109. const get = async function (val) {
  110. try {
  111. // 搜索参数页码赋值
  112. if (typeof val === 'number') {
  113. getObj.value.pageNum = val
  114. }
  115. if (getTime.value.length === 2) {//检查是否同时选择了开始时间和结束时间,如果不是则置空
  116. goldDetail.value.startTime = moment(getTime.value[0]).format('YYYY-MM-DD HH:mm:ss');
  117. goldDetail.value.endTime = moment(getTime.value[1]).format('YYYY-MM-DD HH:mm:ss');
  118. } else {
  119. goldDetail.value.startTime = ''
  120. goldDetail.value.endTime = ''
  121. }
  122. // 添加排序字段和排序方式到请求参数
  123. goldDetail.value.sortField = sortField.value
  124. goldDetail.value.sortOrder = sortOrder.value
  125. console.log('搜索参数', getObj.value)
  126. console.log('jwcode 类型:', typeof goldDetail.value.jwcode);
  127. console.log('jwcode 值:', goldDetail.value.jwcode);
  128. const requestData = {...getObj.value, goldDetail: {...goldDetail.value}};
  129. console.log('最终请求参数', JSON.stringify(requestData, null, 2)); // 打印格式化后的请求参数
  130. // 检查markets数组中是否包含'总部'或'研发部'
  131. console.log('goldDetail.value.markets:', goldDetail.value.markets)
  132. // if (goldDetail.value.markets.includes('9') || goldDetail.value.markets.includes('9999')) {
  133. // goldDetail.value.markets = [];
  134. // }
  135. if (goldDetail.value.jwcode) {
  136. // 纯数字
  137. const numberRegex = /^\d{1,9}$/;
  138. // 检查是否不是数字
  139. if (!numberRegex.test(goldDetail.value.jwcode)) {
  140. ElMessage.error('请检查精网号格式')
  141. // 上面提示过了
  142. return
  143. }
  144. }
  145. const result = await API({
  146. url: '/goldDetail/getGoldDetail',
  147. method: 'post',
  148. data: {...getObj.value, goldDetail: {...goldDetail.value, flag: showEmployeeData.value? 0 : 1}}
  149. })
  150. console.log('响应数据', result)
  151. tableData.value = result.data.list
  152. total.value = result.data.total
  153. // 更新永久金币、任务金币
  154. // permanentGold.value = tableData.value.reduce((total, row) => {
  155. // return total + (Number(row.permanentGold) || 0);
  156. // }, 0);
  157. // taskGold.value = tableData.value.reduce((total, row) => {
  158. // return total + (Number(row.taskGold) || 0);
  159. // }, 0);
  160. //由于免费金币的计算方式是6月免费+12月免费,所以需要单独处理,以及计算总的免费金币和总的金币数放在一块
  161. const totalResult = await API({
  162. url: '/goldDetail/getTotal',
  163. method: 'post',
  164. data: {
  165. goldDetail: {...goldDetail.value, flag: showEmployeeData.value? 0 : 1},
  166. /* jwcode: goldDetail.value.jwcode || '',
  167. payPlatform: goldDetail.value.payPlatform || '',
  168. type: goldDetail.value.type || '',
  169. market: goldDetail.value.market || '',
  170. startTime: goldDetail.value.startTime || '',
  171. endTime: goldDetail.value.endTime || ''*/
  172. }
  173. })
  174. if (totalResult.code === 200) {
  175. const data = totalResult.data
  176. totalPermanentGold.value = data.permanentGolds
  177. totalFreeGold.value = data.freeGolds
  178. totalTaskGold.value = data.taskGolds
  179. totalGoldTotal.value = data.sumGolds
  180. } else if (totalResult.code === 0) {
  181. // 将表格数据设置为空数组
  182. tableData.value = []
  183. totalPermanentGold.value = 0
  184. totalFreeGold.value = 0
  185. totalTaskGold.value = 0
  186. totalGoldTotal.value = 0
  187. } else {
  188. ElMessage.error('获取合计数据失败')
  189. }
  190. } catch (error) {
  191. console.log('请求失败', error)
  192. }
  193. }
  194. // 重置
  195. const reset = function () {
  196. goldDetail.value = {}
  197. goldDetail.value.markets = []
  198. selectedMarketPath.value = []
  199. delete sortField.value
  200. delete sortOrder.value
  201. getTime.value = []
  202. activeTimeRange.value = '' // 清除激活状态
  203. search()
  204. }
  205. // 搜索,点击查询按钮后触发
  206. const search = function () {
  207. trimJwCode();
  208. getObj.value.pageNum = 1
  209. get()
  210. }
  211. // 今天
  212. const getToday = function () {
  213. const today = dayjs()
  214. const startTime = today.startOf('day').format('YYYY-MM-DD HH:mm:ss')
  215. const endTime = today.endOf('day').format('YYYY-MM-DD HH:mm:ss')
  216. getTime.value = [startTime, endTime]
  217. activeTimeRange.value = 'today' // 标记当前激活状态
  218. search()
  219. }
  220. // 昨天
  221. const getYesterday = function () {
  222. const today = dayjs()
  223. const startTime = today.subtract(1, 'day').startOf('day').format('YYYY-MM-DD HH:mm:ss')
  224. const endTime = today.subtract(1, 'day').endOf('day').format('YYYY-MM-DD HH:mm:ss')
  225. getTime.value = [startTime, endTime]
  226. activeTimeRange.value = 'yesterday' // 标记当前激活状态
  227. search()
  228. }
  229. // 近7天
  230. const get7Days = function () {
  231. const today = dayjs()
  232. const startTime = today.subtract(6, 'day').startOf('day').format('YYYY-MM-DD HH:mm:ss')
  233. const endTime = today.endOf('day').format('YYYY-MM-DD HH:mm:ss')
  234. getTime.value = [startTime, endTime]
  235. activeTimeRange.value = '7days' // 标记当前激活状态
  236. search()
  237. }
  238. // // 计算所有记录的金币总数
  239. // const sumGoldTotal = computed(() => {
  240. // return tableData.value.reduce((total, row) => {
  241. // return total + (Number(row.sumGold) || 0);
  242. // }, 0);
  243. // });
  244. // 计算每行免费金币6月+12月的方法
  245. const calculateFreeGold = (row) => {
  246. const freeJune = row.freeJune || 0;
  247. const freeDecember = row.freeDecember || 0;
  248. return (freeJune + freeDecember);
  249. };
  250. // 计算总免费金币的计算属性
  251. // const totalFreeGold = computed(() => {
  252. // return tableData.value.reduce((total, row) => {
  253. // return total + calculateFreeGold(row);
  254. // }, 0);
  255. // });
  256. // 新增排序字段和排序方式
  257. const sortField = ref('')
  258. const sortOrder = ref('')
  259. // 处理排序事件
  260. const handleSortChange = (column) => {
  261. if (column.prop === 'sumGold') {//新增金币总数字段排序
  262. sortField.value = 'sum_gold'
  263. } else if (column.prop === 'permanentGold') {
  264. sortField.value = 'permanent_gold'
  265. } else if (column.prop === 'taskGold') {
  266. sortField.value = 'task_gold'
  267. } else if (column.prop === 'freeGold') {
  268. sortField.value = 'free_gold'
  269. } else if (column.prop === 'auditTime') {//删除了更新时间的creatTime
  270. sortField.value = 'audit_time'
  271. }
  272. sortOrder.value = column.order === 'ascending' ? 'ASC' : 'DESC'
  273. //get()要写在handleSortChange方法里面,不然会导致排序失效
  274. get()
  275. }
  276. const exportExcel = async function () {
  277. const params = {
  278. goldDetail: {
  279. jwcode: goldDetail.value.jwcode || '',
  280. payPlatform: goldDetail.value.payPlatform || '',
  281. type: goldDetail.value.type || '',
  282. markets: goldDetail.value.markets || [],
  283. startTime: goldDetail.value.startTime || '',
  284. endTime: goldDetail.value.endTime || '',
  285. sortField: goldDetail.value.sortField || '',
  286. sortOrder: goldDetail.value.sortOrder || '',
  287. flag: showEmployeeData.value ? 0 : 1 // 新增 flag 参数
  288. },
  289. }
  290. const res = await API({url: '/goldDetail/export', data: params})
  291. if (res.code === 200) {
  292. ElMessage.success('导出成功')
  293. }
  294. }
  295. const handlePageSizeChange = function (val) {
  296. getObj.value.pageSize = val
  297. get()
  298. }
  299. const handleCurrentChange = function (val) {
  300. getObj.value.pageNum = val
  301. get()
  302. }
  303. // 挂载
  304. onMounted(async function () {
  305. await getAdminData()
  306. await get()
  307. await getMarket()
  308. await getPlatform() // 调用获取平台信息的函数
  309. })
  310. const exportListVisible = ref(false)
  311. // 打开导出列表弹窗
  312. const openExportList = () => {
  313. getExportList()
  314. exportListVisible.value = true
  315. }
  316. // 导出列表数据
  317. const exportList = ref([])
  318. // 导出列表加载状态
  319. const exportListLoading = ref(false)
  320. // 获取导出列表
  321. const getExportList = async () => {
  322. exportListLoading.value = true
  323. try {
  324. const result = await API({url: '/export/export'})
  325. if (result.code === 200) {
  326. const filteredData = result.data.filter(item => {
  327. return item.type === 0; //0表示客户明细
  328. });
  329. exportList.value = filteredData
  330. } else {
  331. ElMessage.error(result.msg || '获取导出列表失败')
  332. }
  333. } catch (error) {
  334. console.error('获取导出列表出错:', error)
  335. ElMessage.error('获取导出列表失败,请稍后重试')
  336. } finally {
  337. exportListLoading.value = false
  338. }
  339. }
  340. // 下载导出文件
  341. const downloadExportFile = (item) => {
  342. if (item.state === 2) {
  343. const link = document.createElement('a')
  344. link.href = item.url
  345. link.download = item.fileName
  346. link.click()
  347. } else {
  348. ElMessage.warning('文件还在导出中,请稍后再试')
  349. }
  350. }
  351. //根据状态返回对应的标签类型
  352. const getTagType = (state) => {
  353. switch (state) {
  354. case 0:
  355. return 'info';
  356. case 1:
  357. return 'primary';
  358. case 2:
  359. return 'success';
  360. case 3:
  361. return 'danger';
  362. default:
  363. return 'info';
  364. }
  365. }
  366. //根据状态返回对应的标签文案
  367. const getTagText = (state) => {
  368. switch (state) {
  369. case 0:
  370. return '待执行';
  371. case 1:
  372. return '执行中';
  373. case 2:
  374. return '执行完成';
  375. case 3:
  376. return '执行出错';
  377. default:
  378. return '未知状态';
  379. }
  380. }
  381. // 存储地区选择变化
  382. const selectedMarketPath = ref([])
  383. const handleMarketChange = (value) => {
  384. if (value && value.length > 0) {
  385. const lastValue = value[value.length - 1];
  386. // 确保返回值是数组,如果不是则包装成数组
  387. const marketValue = reverseMarketMapping[lastValue];
  388. goldDetail.value.markets = Array.isArray(marketValue) ? marketValue : [marketValue];
  389. } else {
  390. // 保持[""]格式
  391. goldDetail.value.markets = [];
  392. }
  393. };
  394. // 获取地区,修改为级联下拉框
  395. const getMarket = async function () {
  396. try {
  397. // 发送POST请求
  398. const result = await API({
  399. url: '/market/selectMarket',
  400. });
  401. // 将响应结果存储到响应式数据中
  402. console.log('请求成功', result)
  403. // 递归转换树形结构为级联选择器需要的格式(跳过第一级节点)
  404. const transformTree = (nodes) => {
  405. // 直接处理第一级节点的子节点
  406. const allChildren = nodes.flatMap(node => node.children || []);
  407. return allChildren.map(child => {
  408. const grandchildren = child.children && child.children.length
  409. ? transformTree([child]) // 递归处理子节点
  410. : null;
  411. return {
  412. value: child.name,
  413. label: child.name,
  414. children: grandchildren
  415. };
  416. });
  417. };
  418. // 存储地区信息
  419. markets.value = transformTree(result.data)
  420. console.log('转换后的地区树==============', markets.value)
  421. } catch (error) {
  422. console.log('请求失败', error)
  423. }
  424. }
  425. const format3 = (num) => {
  426. // 每三位添加逗号
  427. return num.toLocaleString('en-US')
  428. }
  429. </script>
  430. <template>
  431. <div>
  432. <el-card style="margin-bottom: 20px;margin-top: 10px;">
  433. <el-row style="margin-bottom: 10px">
  434. <el-col :span="5">
  435. <div class="head-card-element">
  436. <el-text class="mx-1" size="large">精网号</el-text>
  437. <el-input v-model="goldDetail.jwcode" style="width: 150px" placeholder="请输入精网号" clearable/>
  438. </div>
  439. </el-col>
  440. <el-col :span="5">
  441. <div class="head-card-element">
  442. <el-text class="mx-1" size="large">平台信息</el-text>
  443. <el-select v-model="goldDetail.payPlatform" placeholder="请选择平台信息" style="width: 160px" clearable
  444. :loading="isLoadingPlatform">
  445. <el-option v-for="item in platform" :key="item.id" :label="item.platform" :value="item.platform"/>
  446. </el-select>
  447. </div>
  448. </el-col>
  449. <el-col :span="5">
  450. <div class="head-card-element">
  451. <el-text class="mx-1" size="large">数量更新类型</el-text>
  452. <el-select v-model="goldDetail.type" placeholder="请选择更新类型" style="width: 160px" clearable>
  453. <el-option v-for="item in type" :key="item.value" :label="item.label" :value="item.value"/>
  454. </el-select>
  455. </div>
  456. </el-col>
  457. <el-col :span="5">
  458. <div class="head-card-element">
  459. <el-text class="mx-1" size="large">所属地区</el-text>
  460. <el-cascader
  461. v-model="selectedMarketPath"
  462. :options="markets"
  463. placeholder="请选择所属地区"
  464. clearable
  465. style="width:180px"
  466. @change="handleMarketChange"
  467. />
  468. </div>
  469. </el-col>
  470. <el-col :span="3">
  471. <div class="head-card-element">
  472. <el-checkbox v-model="showEmployeeData" @change="search()">员工数据</el-checkbox>
  473. </div>
  474. </el-col>
  475. </el-row>
  476. <div class="head-card-element">
  477. <el-text class="mx-1" size="large">更新时间</el-text>
  478. <el-date-picker v-model="getTime" type="datetimerange" range-separator="" start-placeholder="起始时间"
  479. end-placeholder="结束时间" style="width: 400px" @change="handleDatePickerChange"
  480. :default-time="defaultTime"/>
  481. <el-button @click="getToday()" style="margin-left: 10px"
  482. :type="activeTimeRange === 'today' ? 'primary' : ''">
  483. </el-button>
  484. <el-button @click="getYesterday()" style="margin-left: 10px"
  485. :type="activeTimeRange === 'yesterday' ? 'primary' : ''">
  486. </el-button>
  487. <el-button @click="get7Days()" style="margin-left: 10px"
  488. :type="activeTimeRange === '7days' ? 'primary' : ''"> 近7天
  489. </el-button>
  490. <el-button type="success" @click="reset()">重置</el-button>
  491. <el-button type="primary" @click="search()">查询</el-button>
  492. <el-button type="primary" @click="exportExcel">导出Excel表格</el-button>
  493. <el-button type="primary" @click="openExportList">查看导出列表</el-button>
  494. </div>
  495. </el-card>
  496. <el-card>
  497. <div>
  498. 金币变动总数{{ format3(totalGoldTotal || 0) }}&nbsp;&nbsp;&nbsp;&nbsp;
  499. 永久金币{{ format3(totalPermanentGold || 0) }}&nbsp;&nbsp;&nbsp;&nbsp;
  500. 免费金币{{ format3(totalFreeGold || 0) }}&nbsp;&nbsp;&nbsp;&nbsp;
  501. 任务金币{{ format3(totalTaskGold || 0) }}
  502. </div>
  503. <div style="height: 584px; overflow-y: auto">
  504. <el-table :data="tableData" style="width: 100%" @sort-change="handleSortChange" height="584px">
  505. <el-table-column type="index" label="序号" width="100px" fixed="left">
  506. <template #default="scope">
  507. <span>{{
  508. scope.$index + 1 + (getObj.pageNum - 1) * getObj.pageSize
  509. }}</span>
  510. </template>
  511. </el-table-column>
  512. <el-table-column fixed="left" prop="name" label="姓名" width="150" show-overflow-tooltip />
  513. <el-table-column fixed="left" prop="jwcode" label="精网号" width="120"/>
  514. <el-table-column prop="market" label="所属地区" width="120"/>
  515. <el-table-column prop="payPlatform" label="平台信息" width="140" />
  516. <el-table-column prop="type" label="更新类型" width="110">
  517. <template #default="scope">
  518. <span v-if="scope.row.type === 0">充值</span>
  519. <span v-if="scope.row.type === 1">消耗</span>
  520. <span v-if="scope.row.type === 2">退款</span>
  521. <span v-if="scope.row.type === 3">其他</span>
  522. </template>
  523. </el-table-column>
  524. <el-table-column prop="sumGold" sortable="custom" label="金币数量" width="110">
  525. <template #default="scope">
  526. <span>{{ (scope.row.sumGold || 0) }}</span>
  527. </template>
  528. </el-table-column>
  529. <el-table-column prop="permanentGold" sortable="custom" label="永久金币" width="110">
  530. <template #default="scope">
  531. <span>{{ (scope.row.permanentGold || 0) }}</span>
  532. </template>
  533. </el-table-column>
  534. <el-table-column prop="freeGold" sortable="custom" label="免费金币" width="110">
  535. <template #default="scope">
  536. <span>{{ (calculateFreeGold(scope.row) || 0) }}</span>
  537. </template>
  538. </el-table-column>
  539. <el-table-column prop="taskGold" sortable="custom" label="任务金币" width="110">
  540. <template #default="scope">
  541. <span>{{ (scope.row.taskGold || 0) }}</span>
  542. </template>
  543. </el-table-column>
  544. <el-table-column prop="adminName" label="提交人" width="110"/>
  545. <el-table-column prop="auditTime" sortable="custom" label="更新时间" width="210" show-overflow-tooltip>
  546. <template #default="scope">
  547. <span>{{
  548. moment(scope.row.auditTime).format('YYYY-MM-DD HH:mm:ss')
  549. }}</span>
  550. </template>
  551. </el-table-column>
  552. </el-table>
  553. </div>
  554. <!-- 此处分页 -->
  555. <div class="pagination" style="margin-top: 20px;display: flex;">
  556. <el-pagination background :page-size="getObj.pageSize" :page-sizes="[5, 10, 20, 50, 100]"
  557. layout="total, sizes, prev, pager, next, jumper" :total="total"
  558. @size-change="handlePageSizeChange"
  559. @current-change="handleCurrentChange"></el-pagination>
  560. </div>
  561. </el-card>
  562. <!-- 导出列表弹窗 -->
  563. <el-dialog v-model="exportListVisible" title="导出列表" width="80%">
  564. <el-table :data="exportList" style="width: 100% ;height: 60vh;" :loading="exportListLoading">
  565. <el-table-column prop="fileName" label="文件名"/>
  566. <el-table-column prop="state" label="状态">
  567. <template #default="scope">
  568. <el-tag :type="getTagType(scope.row.state)" :effect="scope.row.state === 3 ? 'light' : 'plain'">
  569. {{ getTagText(scope.row.state) }}
  570. </el-tag>
  571. </template>
  572. </el-table-column>
  573. <el-table-column prop="createTime" label="创建时间">
  574. <template #default="scope">
  575. {{ moment(scope.row.createTime).format('YYYY-MM-DD HH:mm:ss') }}
  576. </template>
  577. </el-table-column>
  578. <el-table-column label="操作">
  579. <template #default="scope">
  580. <el-button type="primary" size="small" @click="downloadExportFile(scope.row)"
  581. :disabled="scope.row.state !== 2">
  582. 下载
  583. </el-button>
  584. </template>
  585. </el-table-column>
  586. </el-table>
  587. <template #footer>
  588. <div class="dialog-footer">
  589. <el-button text @click="exportListVisible = false">关闭</el-button>
  590. </div>
  591. </template>
  592. </el-dialog>
  593. </div>
  594. </template>
  595. <style scoped>
  596. .dialog-footer {
  597. display: flex;
  598. justify-content: flex-end;
  599. }
  600. </style>