From bbcebc44210eb303e9049971a5c84078a382725c Mon Sep 17 00:00:00 2001 From: zry <18990852002@163.com> Date: Sat, 5 Jul 2025 14:17:55 +0800 Subject: [PATCH] phase 1 bugs have been resolved --- .env.development | 7 +- .env.production | 2 +- src/util/request.js | 12 ++ src/views/recharge/addCoinRecharge.vue | 329 ++++++++++++++++++------------ src/views/recharge/coinRechargeDetail.vue | 16 +- src/views/refund/addCoinRefund.vue | 162 +++++++-------- src/views/usergold/clientCountDetail.vue | 77 ++++--- 7 files changed, 358 insertions(+), 247 deletions(-) diff --git a/.env.development b/.env.development index aa3603f..23ae9e8 100644 --- a/.env.development +++ b/.env.development @@ -1,5 +1,8 @@ -# VITE_API_BASE='https://hwjb.homilychart.com/admin/' +VITE_API_BASE='https://hwjb.homilychart.com/admin/' # VITE_API_BASE='https://hwjb.homilychart.com/gold_htms_dev' -VITE_API_BASE='http://192.168.8.242:8081/' +# VITE_API_BASE='http://192.168.8.242:8081/' # VITE_API_BASE='http://18.143.76.3:10704/' +# VITE_API_BASE='http://192.168.9.28:8081/' +# VITE_API_BASE='http://192.168.8.94:8081/' +VITE_UPLOAD_URL=http://39.101.133.168:8828/hljw/api/aws/upload diff --git a/.env.production b/.env.production index 1d9a9dc..b117e97 100644 --- a/.env.production +++ b/.env.production @@ -2,4 +2,4 @@ VITE_API_BASE='https://hwjb.homilychart.com/admin/' # VITE_API_BASE='https://hwjb.homilychart.com/gold_htms_dev' # VITE_API_BASE='http://192.168.8.232:8080/' - +VITE_UPLOAD_URL=https://api.homilychart.com/hljw/api/aws/upload diff --git a/src/util/request.js b/src/util/request.js index ed1eebf..cc206eb 100644 --- a/src/util/request.js +++ b/src/util/request.js @@ -10,6 +10,18 @@ const service = axios.create({ // 设置默认请求方法为 POST 这行对应的代码搁哪呢? util/http.js自己看 }) +// 添加上传方法 +export const uploadFile = (file) => { + const formData = new FormData(); + formData.append('file', file); + + return service.post(import.meta.env.VITE_UPLOAD_URL, formData, { + headers: { + 'Content-Type': 'multipart/form-data' + } + }); +}; + // 请求拦截器 service.interceptors.request.use(config => { const token = localStorage.getItem('token') diff --git a/src/views/recharge/addCoinRecharge.vue b/src/views/recharge/addCoinRecharge.vue index 1650c80..519bb8d 100644 --- a/src/views/recharge/addCoinRecharge.vue +++ b/src/views/recharge/addCoinRecharge.vue @@ -5,6 +5,7 @@ import { Plus } from '@element-plus/icons-vue' import axios from 'axios' import { ElMessageBox } from 'element-plus' import API from '@/util/http' +import { uploadFile } from '@/util/request'; import moment from 'moment' import { range, re } from 'mathjs' import { utils, read } from 'xlsx' @@ -22,20 +23,20 @@ const trimJwCode = () => { const beforeAvatarUpload = (file) => { const isJPG = file.type === 'image/jpeg' const isPNG = file.type === 'image/png' - const isLt2M = file.size / 1024 / 1024 < 2 + const isLt2M = file.size / 1024 / 1024 < 1 if (!isJPG && !isPNG) { ElMessage.error('上传头像图片只能是 JPG 或 PNG 格式!') } if (!isLt2M) { - ElMessage.error('上传头像图片大小不能超过 2MB!') + ElMessage.error('上传头像图片大小不能超过 1MB!') } return (isJPG || isPNG) && isLt2M } // 这是添加上传图片的接口 const imageUrl = ref('') const voucher = ref('') -const Rate = ref() +// const rateName = ref() const adminData = ref({}) // 获取管理员信息 const getAdminData = async function () { @@ -63,7 +64,7 @@ const recharge = ref({ freeGold: '', money: null, permanentGold: '', - Rate: null, + rateName: null, rateId: null, payModel: '', // payModel 字段 payTime: null, // payTime 字段 @@ -117,7 +118,7 @@ const add = async function () { recharge.value.permanentGold = '' recharge.value.rateId = null imageUrl.value = '' - Rate.value = null + recharge.value.rateName = null user.value = {} } catch (error) { console.log('请求失败', error) @@ -129,7 +130,7 @@ const add = async function () { const addBefore = () => { Ref.value.validate(async (valid) => { if (valid) { - if (Rate.value == null || Rate.value == '' || Rate.value == undefined) { + if (recharge.value.rateName == null || recharge.value.rateName == '' || recharge.value.rateName == undefined) { ElMessage({ type: 'error', message: '请选择币种' @@ -144,7 +145,7 @@ const addBefore = () => { return } // 根据选择的货币名称找到对应的 rateId - const selectedRate = rateName.find(item => item.value === Rate.value) + const selectedRate = rateName.find(item => item.value === recharge.value.rateName) if (selectedRate) { recharge.value.rateId = selectedRate.rateId } @@ -174,48 +175,73 @@ const Ref = ref(null) const rules = reactive({ jwcode: [{ required: true, message: '请输入精网号', trigger: 'blur' }], activity: [{ required: true, message: '请选择活动名称', trigger: 'blur' }], - permanentGold: [{ required: true, message: '请输入永久金币数', trigger: 'blur' }, - {validator: (rule, value, callback) => { - if (value >= 0) { - callback() - } else { - callback(new Error('输入金额至少为0')) - }}}], - freeGold: [{required: true, message: '请输入免费金币数', trigger: 'blur' }, + permanentGold: [ + { required: true, message: '请输入永久金币数', trigger: 'blur' }, { validator: (rule, value, callback) => { - // 将值转换为数字(可行吗??) - // 好的不可行 + // 检查是否包含特殊符号 + if (/[^0-9.]/.test(value)) { + callback(new Error('不能包含特殊符号或负数')); + return; + } const numValue = Number(value); if (isNaN(numValue)) { callback(new Error('请输入有效的数字')); - } else if (numValue >= 0) { - callback(); + } else if (numValue < 0) { + callback(new Error('输入金额不能小于0')); } else { - callback(new Error('输入金额至少为 0')); + callback(); } }, trigger: 'blur' } ], - money: [ - { - required: true, - message: '请选择货币名称', - trigger: 'blur' - } - ], - 'recharge.money': [ + freeGold: [ + { required: true, message: '请输入免费金币数', trigger: 'blur' }, { - required: true, - message: '请输入充值金额', + validator: (rule, value, callback) => { + // 检查是否包含特殊符号 + if (/[^0-9.]/.test(value)) { + callback(new Error('不能包含特殊符号或负数')); + return; + } + const numValue = Number(value); + if (isNaN(numValue)) { + callback(new Error('请输入有效的数字')); + } else if (numValue < 0) { + callback(new Error('输入金额必须大于0')); + } else { + callback(); + } + }, trigger: 'blur' } - ], + rateName: [{ + required: true, + message: '请选择货币名称', + trigger: 'blur' + }], + + money: [{ + required: true, + message: '请输入充值金额', + trigger: 'blur' + }, { + validator: (rule, value, callback) => { + if (!value) { + callback(new Error('请输入充值金额')); + } else if (value < 0) { + callback(new Error('金额不能小于0')); + } else { + callback(); + } + }, + trigger: 'blur' + }], payModel: [{ required: true, message: '请选择付款方式', trigger: 'blur' }], payTime: [{ required: true, message: '请选择交款时间', trigger: 'blur' }] -}) +}); // 查找客户信息的方法 const user = ref({}) @@ -322,12 +348,22 @@ const rateName = [ } ] - +// 修改上传处理 +const customUpload = async (options) => { + try { + const response = await uploadFile(options.file); + handleAvatarSuccess(response.data, { raw: options.file }); + } catch (error) { + ElMessage.error('上传失败'); + } +}; +// 获取环境变量 +// const uploadUrl = import.meta.env.VITE_UPLOAD_URL; // 上传图片成功的回调函数 const handleAvatarSuccess = (response, uploadFile) => { - imageUrl.value = URL.createObjectURL(uploadFile.raw) + imageUrl.value = URL.createObjectURL(uploadFile.raw) ; console.log('图片上传成功', response, uploadFile) - recharge.value.voucher = `http://39.101.133.168:8828/hljw/api/aws/upload` + recharge.value.voucher = import.meta.env.VITE_UPLOAD_URL; console.log('图片名称', recharge.value.voucher) } @@ -374,7 +410,7 @@ const deleteRecharge = function () { rateId: null } imageUrl.value = '' - Rate.value = '' + recharge.value.rateName = '' } @@ -430,16 +466,19 @@ onMounted(async function () { /> - -

-

免费金币

- +

+
- + + + +

+
+ + + + + + + + + + + + + + + + @@ -516,10 +578,10 @@ onMounted(async function () { type="textarea" /> - + @@ -531,100 +593,101 @@ onMounted(async function () { - + + - - 客户信息 - - - -

{{ user.name }}

-
-
- - + 客户信息 + + + + + +

{{ user.name }}

+
+
+ +

{{ Number(user.historySumGold ) /100 }}

- +

+
+ + (永久金币:{{ user.historyPermanentGold /100 }};免费金币:{{ (user.historyFreeGold) /100 }};任务金币:{{ user.historyTaskGold /100}}) - -

-
-
- - -

{{ user.jwcode }}

-
-
- - - {{ - (user.nowSumGold) /100 - }} - (永久金币:{{ user.nowPermanentGold /100}};免费金币:{{ - (user.nowFreeGold) /100 - }};任务金币:{{ user.nowTaskGold /100}}) - - - - -

- {{ moment(user.firstRecharge).format('YYYY-MM-DD HH:mm:ss') }} -

-
-
- - -

{{ user.rechargeNum }}

-
-
- - - -

{{ user.consumeNum }}

-
-
- - -

{{ user.market }}

-
-
- - - -
-
-
+
+ + + + + + + +

{{ user.jwcode }}

+
+
+ + + {{ user.nowSumGold }} + + + + (永久金币:{{ user.nowPermanentGold }}; + 免费金币:{{ user.nowFreeGold }}; + 任务金币:{{ user.nowTaskGold }}) + + +
+ + + + + +

+ {{ moment(user.firstRecharge).format('YYYY-MM-DD HH:mm:ss') }} +

+
+
+ + +

{{ user.rechargeNum }}

+
+
+
+ + + + + +

{{ user.consumeNum }}

+
+
+ + +

{{ user.market }}

+
+
+
+ + diff --git a/src/views/recharge/coinRechargeDetail.vue b/src/views/recharge/coinRechargeDetail.vue index ff1ddf5..1221c00 100644 --- a/src/views/recharge/coinRechargeDetail.vue +++ b/src/views/recharge/coinRechargeDetail.vue @@ -126,11 +126,11 @@ const getArea = async function () { } } -//定义充值类型的加载状态 +//定义充值方式的加载状态 const isLoadingPlatform = ref(false) -// 充值类型 +// 充值方式 const platform = ref([]) -//获取充值类型的函数 +//获取充值方式的函数 const getPlatform = async () => { isLoadingPlatform.value = true; try { @@ -143,12 +143,12 @@ const getPlatform = async () => { if (Array.isArray(result.data)) { platform.value = result.data.map(item => ({ value: item, label: item })); } else { - console.error('充值类型格式错误', result) - ElMessage.error('充值类型格式错误,请联系管理员') + console.error('充值方式格式错误', result) + ElMessage.error('充值方式格式错误,请联系管理员') } } catch (error) { - console.error('获取充值类型失败:', error); - ElMessage.error('获取充值类型失败,请稍后重试'); + console.error('获取充值方式失败:', error); + ElMessage.error('获取充值方式失败,请稍后重试'); } finally { isLoadingPlatform.value = false } @@ -388,7 +388,7 @@ const handleSortChange = (column) => {
- 充值类型: + 充值方式: diff --git a/src/views/refund/addCoinRefund.vue b/src/views/refund/addCoinRefund.vue index 7bf0614..a900aa4 100644 --- a/src/views/refund/addCoinRefund.vue +++ b/src/views/refund/addCoinRefund.vue @@ -474,86 +474,88 @@ onMounted(async function () { - - - 客户信息 - - - -

{{ user.name }}

-
-
- - - -

- {{ Number(user.historySumGold) }} -

- -

-
-
- - -

{{ user.jwcode }}

-
-
- - - {{ - (user.nowSumGold) - }} - (永久金币:{{ user.nowPermanentGold }};免费金币:{{ - (user.nowFreeGold) - }};任务金币:{{ user.nowTaskGold}}) - - - - -

- {{ moment(user.firstRecharge).format('YYYY-MM-DD HH:mm:ss') }} -

-
-
- - -

{{ user.rechargeNum }}

-
-
- - - -

{{ user.consumeNum }}

-
-
- - -

{{ user.market }}

-
-
- - - -
-
-
+ + + 客户信息 + + + + + +

{{ user.name }}

+
+
+ + +

+ {{ Number(user.historySumGold) }} +

+
+
+
+ + + + + +

{{ user.jwcode }}

+
+
+ + + {{ user.nowSumGold }} + + + + (永久金币:{{ user.nowPermanentGold }}; + 免费金币:{{ user.nowFreeGold }}; + 任务金币:{{ user.nowTaskGold }}) + + +
+ + + + + +

+ {{ moment(user.firstRecharge).format('YYYY-MM-DD HH:mm:ss') }} +

+
+
+ + +

{{ user.rechargeNum }}

+
+
+
+ + + + + +

{{ user.consumeNum }}

+
+
+ + +

{{ user.market }}

+
+
+
+
+
diff --git a/src/views/usergold/clientCountDetail.vue b/src/views/usergold/clientCountDetail.vue index b588ae3..6e058d5 100644 --- a/src/views/usergold/clientCountDetail.vue +++ b/src/views/usergold/clientCountDetail.vue @@ -7,6 +7,13 @@ import moment from 'moment' import API from '@/util/http' import { writeFile, utils } from 'xlsx' + +// 定义ref 变量来存储合计数据 +const totalPermanentGold = ref(0) +const totalFreeGold = ref(0) +const totalTaskGold = ref(0) +const totalGoldTotal = ref(0) + // 变量 const adminData = ref({}) const getAdminData = async function () { @@ -174,14 +181,40 @@ const get = async function (val) { total.value = result.data.total // 更新永久金币、任务金币 - permanentGold.value = tableData.value.reduce((total, row) => { - return total + (Number(row.permanentGold) || 0); - }, 0); + // permanentGold.value = tableData.value.reduce((total, row) => { + // return total + (Number(row.permanentGold) || 0); + // }, 0); - taskGold.value = tableData.value.reduce((total, row) => { - return total + (Number(row.taskGold) || 0); - }, 0); + // taskGold.value = tableData.value.reduce((total, row) => { + // return total + (Number(row.taskGold) || 0); + // }, 0); //由于免费金币的计算方式是6月免费+12月免费,所以需要单独处理,以及计算总的免费金币和总的金币数放在一块 + + + const totalResult = await API({ + url: '/goldDetail/getTotal', + method: 'post', + data: { + jwcode: goldDetail.value.jwcode || '', + payPlatform: goldDetail.value.payPlatform || '', + type: goldDetail.value.type || '', + market: goldDetail.value.market || '', + startTime: goldDetail.value.startTime || '', + endTime: goldDetail.value.endTime || '' + } + }) + + if (totalResult.code === 200) { + const data = totalResult.data + totalPermanentGold.value = data.permanentGolds + totalFreeGold.value = data.freeGolds + totalTaskGold.value = data.taskGolds + totalGoldTotal.value = data.sumGolds + } else { + ElMessage.error('获取合计数据失败') + } + + } catch (error) { console.log('请求失败', error) } @@ -237,12 +270,12 @@ const get7Days = function () { search() } -// 计算所有记录的金币总数 -const sumGoldTotal = computed(() => { - return tableData.value.reduce((total, row) => { - return total + (Number(row.sumGold) || 0); - }, 0); -}); +// // 计算所有记录的金币总数 +// const sumGoldTotal = computed(() => { +// return tableData.value.reduce((total, row) => { +// return total + (Number(row.sumGold) || 0); +// }, 0); +// }); // 计算每行免费金币6月+12月的方法 @@ -253,11 +286,11 @@ const calculateFreeGold = (row) => { }; // 计算总免费金币的计算属性 -const totalFreeGold = computed(() => { - return tableData.value.reduce((total, row) => { - return total + calculateFreeGold(row); - }, 0); -}); +// const totalFreeGold = computed(() => { +// return tableData.value.reduce((total, row) => { +// return total + calculateFreeGold(row); +// }, 0); +// }); // 验证页码跳转输入框的数字是否合法 const checkNumber = function () { @@ -301,9 +334,7 @@ const handleSortChange = (column) => { sortField.value = 'free_gold' } else if (column.prop === 'auditTime') {//删除了更新时间的creatTime sortField.value = 'audit_time' - } else if (column.prop === 'gold') { - sortField.value = 'gold' - } + } sortOrder.value = column.order === 'ascending' ? 'ASC' : 'DESC' //get()要写在handleSortChange方法里面,不然会导致排序失效 get() @@ -389,10 +420,10 @@ onMounted(async function () {
- 金币总数:{{ Math.abs(sumGoldTotal) / 100 }} - 永久金币:{{ Math.abs(permanentGold) / 100 }} + 金币总数:{{ Math.abs(totalGoldTotal) / 100 }} + 永久金币:{{ Math.abs(totalPermanentGold) / 100 }} 免费金币:{{ Math.abs(totalFreeGold) / 100 }} - 任务金币:{{ Math.abs(taskGold) / 100 }} + 任务金币:{{ Math.abs(totalTaskGold) / 100 }}