diff --git a/package-lock.json b/package-lock.json index b68ad5c..b00b0eb 100644 --- a/package-lock.json +++ b/package-lock.json @@ -10,7 +10,7 @@ "dependencies": { "@element-plus/icons-vue": "^2.3.1", "axios": "^1.7.8", - "echarts": "^5.6.0", + "echarts": "^5.5.1", "element-plus": "^2.8.8", "lodash": "^4.17.21", "mathjs": "^14.0.1", @@ -3499,13 +3499,13 @@ "license": "MIT" }, "node_modules/echarts": { - "version": "5.6.0", - "resolved": "https://registry.npmjs.org/echarts/-/echarts-5.6.0.tgz", - "integrity": "sha512-oTbVTsXfKuEhxftHqL5xprgLoc0k7uScAwtryCgWF6hPYFLRwOUHiFmHGCBKP5NPFNkDVopOieyUqYGH8Fa3kA==", + "version": "5.5.1", + "resolved": "https://mirrors.huaweicloud.com/repository/npm/echarts/-/echarts-5.5.1.tgz", + "integrity": "sha512-Fce8upazaAXUVUVsjgV6mBnGuqgO+JNDlcgF79Dksy4+wgGpQB2lmYoO4TSweFg/mZITdpGHomw/cNBJZj1icA==", "license": "Apache-2.0", "dependencies": { "tslib": "2.3.0", - "zrender": "5.6.1" + "zrender": "5.6.0" } }, "node_modules/electron-to-chromium": { @@ -4662,7 +4662,7 @@ }, "node_modules/tslib": { "version": "2.3.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.3.0.tgz", + "resolved": "https://mirrors.huaweicloud.com/repository/npm/tslib/-/tslib-2.3.0.tgz", "integrity": "sha512-N82ooyxVNm6h1riLCoyS9e3fuJ3AMG2zIZs2Gd1ATcSFjSA23Q0fzjjZeh0jbJvWVDZ0cJT8yaNNaaXHzueNjg==", "license": "0BSD" }, @@ -5053,9 +5053,9 @@ } }, "node_modules/zrender": { - "version": "5.6.1", - "resolved": "https://registry.npmjs.org/zrender/-/zrender-5.6.1.tgz", - "integrity": "sha512-OFXkDJKcrlx5su2XbzJvj/34Q3m6PvyCZkVPHGYpcCJ52ek4U/ymZyfuV1nKE23AyBJ51E/6Yr0mhZ7xGTO4ag==", + "version": "5.6.0", + "resolved": "https://mirrors.huaweicloud.com/repository/npm/zrender/-/zrender-5.6.0.tgz", + "integrity": "sha512-uzgraf4njmmHAbEUxMJ8Oxg+P3fT04O+9p7gY+wJRVxo8Ge+KmYv0WJev945EH4wFuc4OY2NLXz46FZrWS9xJg==", "license": "BSD-3-Clause", "dependencies": { "tslib": "2.3.0" diff --git a/package.json b/package.json index 7f0b144..34155ed 100644 --- a/package.json +++ b/package.json @@ -14,7 +14,7 @@ "dependencies": { "@element-plus/icons-vue": "^2.3.1", "axios": "^1.7.8", - "echarts": "^5.6.0", + "echarts": "^5.5.1", "element-plus": "^2.8.8", "lodash": "^4.17.21", "mathjs": "^14.0.1", diff --git a/src/assets/blue.png b/src/assets/blue.png new file mode 100644 index 0000000..87a1ed1 Binary files /dev/null and b/src/assets/blue.png differ diff --git a/src/router/index.js b/src/router/index.js index 5fbbb9b..8716011 100644 --- a/src/router/index.js +++ b/src/router/index.js @@ -18,7 +18,14 @@ const router = createRouter({ // 退款审核 { path: '/refundAudit', name: "refundAudit", component: () => import("../views/audit/refundAudit.vue") }, // 金币消耗 - { path: '/coinConsume', name: "coinConsume", component: () => import("../views/consume/coinConsume.vue") }, + { path: '/coinConsume', name: "coinConsume", component: () => import("../views/consume/coinConsume.vue"), + children: [ + // 金币新增消耗 + { path: 'add', name: "addCoinConsume", component: () => import("../views/consume/addCoinConsume.vue") }, + // 金币消耗明细详情 + { path: 'detail', name: "coinConsumeDetail", component: () => import("../views/consume/coinConsumeDetail.vue") } + ] + }, // 金豆消耗 { path: '/beanConsume', name: "beanConsume", component: () => import("../views/consume/beanConsume.vue") }, // 汇率管理 @@ -32,7 +39,14 @@ const router = createRouter({ // 金豆退款 { path: '/beanRefund', name: "beanRefund", component: () => import("../views/refund/beanRefund.vue") }, // 客户账户明细 - { path: '/usergold', name: "usergold", component: () => import("../views/usergold/index.vue") }, + { path: '/usergold', name: "usergold", component: () => import("../views/usergold/clientCount.vue"), + children: [ + // 金币明细 + { path: 'detail', name: "clientCountDetail", component: () => import("../views/usergold/clientCountDetail.vue") }, + // 金币余额 + { path: 'balance', name: "clientCountBalance", component: () => import("../views/usergold/clientCountBalance.vue") }, + ] + }, // 权限管理 { path: '/permissions', name: "permissions", component: () => import("../views/permissions/index.vue") }, // 没有权限 diff --git a/src/views/audit/rechargeAudit.vue b/src/views/audit/rechargeAudit.vue index 553cfb8..f8914cf 100644 --- a/src/views/audit/rechargeAudit.vue +++ b/src/views/audit/rechargeAudit.vue @@ -7,6 +7,32 @@ import axios from 'axios' import request from '@/util/http' import moment from 'moment' +// 变量 +// 这是动态表头, +const columnOptions = ref([ + { prop: 'username', label: '姓名', width: 125 }, + { prop: 'jwcode', label: '精网号', width: 125 }, + { prop: 'area', label: '所属地区', width: 125 }, + { prop: 'activityName', label: '活动名称', width: 150 }, + { prop: 'rechargeGold', label: '充值金额', width: 125, sortable: true }, + { prop: 'rechargeWay', label: '充值方式', width: 125 }, + { prop: 'paidGold', label: '永久金币', width: 125, sortable: true }, + { prop: 'freeGold', label: '免费金币', width: 125, sortable: true }, + { prop: 'remark', label: '备注', width: 200, showOverflowTooltip: true }, + { prop: 'payWay', label: '支付方式', width: 125 }, + { prop: 'rechargeVoucher', label: '支付凭证', width: 125 }, + { prop: 'name', label: '提交人', width: 125 }, + { prop: 'status', label: '审核状态', width: 125 }, + { prop: 'reson', label: '驳回理由', width: 200 }, + { prop: 'rechargeTime', label: '交款时间', width: 200, sortable: true }, + { prop: 'createTime', label: '提交时间', width: 200, sortable: true }, + { prop: 'auditTime', label:'审核时间', width:200, sortable:true} +]) + +// 默认显示 +const defaultColumns = ['username', 'jwcode', 'area', 'activityName', 'rechargeGold', 'rechargeWay', 'paidGold', 'freeGold', + 'remark', 'payWay', 'rechargeVoucher', 'name', 'status', 'reson', 'rechargeTime', 'createTime', 'auditTime'] +const selectedColumns = ref([...defaultColumns]) //这是获取用户信息的接口 const adminData = ref({}) const getAdminData = async function () { @@ -16,6 +42,7 @@ const getAdminData = async function () { data: {} }) adminData.value = result + console.log('请求成功', result) console.log('用户信息', adminData.value) } catch (error) { console.log('请求失败', error) @@ -25,6 +52,7 @@ const getAdminData = async function () { // 充值明细表格 const tableData = ref([]) // 搜索====================================== +// 搜索rechargeVo const rechargeVo = ref({ rechargeWay: '客服充值' }) @@ -39,16 +67,22 @@ const total = ref(100) const getTime = ref([]) // 搜索活动列表 const activity = ref([]) +// 所有信息 +const allData = ref([]) // 搜索地区列表 const area = ref([]) + +// 编辑====================================== // 驳回弹出框 const rejectVisible = ref(false) // 驳回对象 const rejectObj = ref({}) // 通过对象 const passObj = ref({}) -//标签页默认是待审批 -const activeName = ref('wait') + +//标签页默认高亮选项 +const activeName = ref('all') + // 支付方式选项 const payWay = [ { @@ -72,16 +106,23 @@ const payWay = [ label: '借记卡' } ] + +// //表格高度 +// const tableHeight = computed(function () { +// return (getObj.value.pageSize + 2) * 60 + "px"; +// }); + // 表单验证ref const Ref = ref(null) // 方法 +// 合计数存储 // 统计合计数 const trueGold = ref(0) const trueCount = ref(0) const trueRGold = ref(0) const trueFGold = ref(0) -// 保留两位小数 +// 转化一下,保留两位小数,展示时填充转化后的变量名 const formattedTrueGold = computed(() => trueGold.value.toFixed(2)) const formattedTrueRGold = computed(() => trueRGold.value.toFixed(2)) const formattedTrueFGold = computed(() => trueFGold.value.toFixed(2)) @@ -103,12 +144,15 @@ const rejectedCount = ref(0) const rejectedGold = ref(0) const rejectedRGold = ref(0) const rejectedFGold = ref(0) +// 搜索============================================================== // 搜索方法 const get = async function (val) { try { // 地区赋值 if (adminData.value.area === '泰国') { rechargeVo.value.areas = ['泰国', '越南'] + } else if (adminData.value.area !== '总部') { + rechargeVo.value.area = adminData.value.area } // 搜索参数页码赋值 if (typeof val === 'number') { @@ -127,6 +171,7 @@ const get = async function (val) { rechargeVo.value.sortField = sortField.value rechargeVo.value.sortOrder = sortOrder.value console.log('搜索参数', getObj.value) + // 发送POST请求 const result = await request({ url: '/recharge/recharge', data: { @@ -136,15 +181,16 @@ const get = async function (val) { } }) // 合计数的接口 - // 复制一份rechargeVo.value,去掉排序和状态 - const rechargeVo1 = { ...rechargeVo.value } - delete rechargeVo1.sortField - delete rechargeVo1.sortOrder - delete rechargeVo1.status + // 复制一份 rechargeVo.value 并移除排序字段和排序方式 + const detailWithoutSort = { ...rechargeVo.value } + delete detailWithoutSort.sortField + delete detailWithoutSort.sortOrder + delete detailWithoutSort.status const result2 = await request({ url: '/recharge/recharge/RechargeA', - data: rechargeVo1 + data: detailWithoutSort }) + // 做一个判断,如果result2.data[i].flag="待审核",那么 totalData.value = result2.data[i],否则就赋值为0 // 统计合计数 if (result2.data) { result2.data.forEach((item) => { @@ -174,11 +220,16 @@ const get = async function (val) { } trueGold.value = pendingGold.value + approvedGold.value + rejectedGold.value - trueCount.value = pendingCount.value + approvedCount.value + rejectedCount.value - trueRGold.value = pendingRGold.value + approvedRGold.value + rejectedRGold.value - trueFGold.value = pendingFGold.value + approvedFGold.value + rejectedFGold.value + trueCount.value = + pendingCount.value + approvedCount.value + rejectedCount.value + trueRGold.value = + pendingRGold.value + approvedRGold.value + rejectedRGold.value + trueFGold.value = + pendingFGold.value + approvedFGold.value + rejectedFGold.value - console.log('搜索对象', getObj.value) + // 将响应结果存储到响应式数据中 + console.log('请求成功', result) + console.log('这是分页', getObj.value) // 存储表格数据 tableData.value = result.data.list console.log('tableData', tableData.value) @@ -187,6 +238,7 @@ const get = async function (val) { console.log('total', total.value) } catch (error) { console.log('请求失败', error) + // 在这里可以处理错误逻辑,比如显示错误提示等 } } // 搜索 @@ -257,6 +309,13 @@ const get7Days = function () { console.log('getTime', getTime.value) get() } +//全部充值明细 +const adminAll = function () { + console.log('adminAll') + rechargeVo.value.status = '' + getObj.value.pageNum = 1 + get() +} //待审核充值明细 const adminWait = async function () { rechargeVo.value.status = 0 @@ -290,9 +349,11 @@ const adminReject = async function () { trueRGold.value = rejectedRGold.value trueFGold.value = rejectedFGold.value } - +//点击标签页 const handleClick = function (tab, event) { - if (tab.props.name === 'wait') { + if (tab.props.name === 'all') { + adminAll() + } else if (tab.props.name === 'wait') { adminWait() } else if (tab.props.name === 'pass') { adminPass() @@ -300,30 +361,67 @@ const handleClick = function (tab, event) { adminReject() } } - +// 获取活动名称 const getActivity = async function () { try { + // 发送POST请求 const result = await request({ url: '/recharge/activity/select', data: {} }) + + // 将响应结果存储到响应式数据中 + console.log('请求成功', result) + // 存储表格数据 activity.value = result.data console.log('activity', activity.value) } catch (error) { console.log('请求失败', error) + // 在这里可以处理错误逻辑,比如显示错误提示等 } } -// 地区下拉框 +// 获取地区 const getArea = async function () { try { + // 发送POST请求 const result = await request({ url: '/recharge/user/search', data: {} }) + // 将响应结果存储到响应式数据中 + console.log('请求成功', result) + // 存储地区信息 area.value = result.data console.log('地区', area.value) } catch (error) { console.log('请求失败', error) + // 在这里可以处理错误逻辑,比如显示错误提示等 + } +} +// 验证跳转输入框的数字是否合法 +const checkNumber = function () { + if (typeof parseInt(getObj.value.pageNum) === 'number') { + console.log('总共有多少页' + Math.ceil(total.value / getObj.value.pageSize)) + if ( + getObj.value.pageNum > 0 && + getObj.value.pageNum <= Math.ceil(total.value / getObj.value.pageSize) + ) { + console.log('输入的数字合法') + getObj.value.pageNum = parseInt(getObj.value.pageNum) + get() + } else { + //提示 + ElMessage({ + type: 'error', + message: '请检查输入内容' + }) + } + } else { + //提示 + ElMessage({ + type: 'error', + message: '请检查输入内容' + }) } } const handlePageSizeChange = function (val) { @@ -364,7 +462,10 @@ const passConfirm = async function () { url: '/audit/audit/goldedit', data: passObj.value }) + + // 将响应结果存储到响应式数据中 console.log('请求成功', result) + // 刷新表格数据 get() //提示 ElMessage({ @@ -411,17 +512,24 @@ const rejectConfirm = async function () { url: '/audit/audit/goldedit', data: rejectObj.value }) + + // 将响应结果存储到响应式数据中 console.log('请求成功', result) + // 刷新表格数据 get() - closeRejectVisible()// 关闭弹出框 + // 关闭弹出框 + closeRejectVisible() + //提示 ElMessage({ type: 'success', message: '驳回成功!' }) } catch (error) { console.log('请求失败', error) + // 在这里可以处理错误逻辑,比如显示错误提示等 } } else { + //提示 ElMessage({ type: 'error', message: '请检查输入内容' @@ -431,6 +539,7 @@ const rejectConfirm = async function () { } // 表单验证 + const rules = reactive({ reson: [{ required: true, message: '请输入驳回理由', trigger: 'blur' }] }) @@ -459,7 +568,7 @@ const handleSortChange = (column) => { sortField.value = 'create_time' } else if (column.prop === 'paidGold') { sortField.value = 'paid_gold' - } else if (column.prop === 'auditTime') { + }else if (column.prop === 'auditTime') { sortField.value = 'audit_time' } sortOrder.value = column.order === 'ascending' ? 'ASC' : 'DESC' @@ -477,27 +586,35 @@ const trimJwCode = () => {