9 changed files with 561 additions and 52 deletions
-
2gold-system/src/router/index.js
-
31gold-system/src/views/goldBeen/goldenBeenConsum.vue
-
53gold-system/src/views/goldBeen/goldenBeenDetail.vue
-
494gold-system/src/views/goldBeen/onLineDetail.vue
-
1gold-system/src/views/index.vue
-
2gold-system/src/views/login.vue
-
4gold-system/src/views/recharge/adminRecharge.vue
-
24gold-system/src/views/recharge/allRecharge.vue
-
2gold-system/stats.html
@ -0,0 +1,494 @@ |
|||||
|
<template> |
||||
|
<div class="filter-box"> |
||||
|
<el-form :model="detailY" ref="ruleFormRef"> |
||||
|
<el-form-item prop="jwcode" label="精网号"> |
||||
|
<el-input |
||||
|
v-model="detailY.jwcode" |
||||
|
placeholder="请输入精网号" |
||||
|
style="width: 220px" |
||||
|
/> |
||||
|
</el-form-item> |
||||
|
<el-form-item prop="deptName" label="地区"> |
||||
|
<el-select |
||||
|
v-model="detailY.deptName" |
||||
|
placeholder="请选择所属地区" |
||||
|
style="width: 240px" |
||||
|
clearable |
||||
|
> |
||||
|
<el-option |
||||
|
v-for="item in areaList" |
||||
|
:key="item" |
||||
|
:label="item" |
||||
|
:value="item" |
||||
|
/> |
||||
|
</el-select> |
||||
|
</el-form-item> |
||||
|
<el-form-item prop="orderNo" label="订单号"> |
||||
|
<el-input |
||||
|
v-model="detailY.orderNo" |
||||
|
placeholder="请输入订单号" |
||||
|
style="width: 220px" |
||||
|
/> |
||||
|
</el-form-item> |
||||
|
<!-- <el-form-item prop="type" label="充值类型"> |
||||
|
<el-input |
||||
|
v-model="detailY.type" |
||||
|
placeholder="请输入充值类型" |
||||
|
style="width: 220px" |
||||
|
/> |
||||
|
</el-form-item> --> |
||||
|
<el-form-item prop="payStyle" label="充值平台"> |
||||
|
<el-select |
||||
|
v-model="detailY.payStyle" |
||||
|
placeholder="请选择充值平台" |
||||
|
style="width: 240px" |
||||
|
clearable |
||||
|
> |
||||
|
<el-option |
||||
|
v-for="item in platformList" |
||||
|
:key="item" |
||||
|
:label="item" |
||||
|
:value="item" |
||||
|
/> |
||||
|
</el-select> |
||||
|
</el-form-item> |
||||
|
<el-form-item prop="createTime" label="充值时间"> |
||||
|
<el-date-picker |
||||
|
v-model="detailY.createTime" |
||||
|
type="daterange" |
||||
|
start-placeholder="开始日期" |
||||
|
end-placeholder="结束日期" |
||||
|
style="width: 240px" |
||||
|
format="YYYY-MM-DD HH:mm:ss" |
||||
|
value-format="YYYY-MM-DD HH:mm:ss" |
||||
|
:unlinkPanels="true" |
||||
|
/> |
||||
|
</el-form-item> |
||||
|
<el-form-item> |
||||
|
<el-button type="primary" @click="search">查询</el-button> |
||||
|
<el-button type="success" @click="reset(ruleFormRef)">重置</el-button> |
||||
|
<el-button type="primary" @click="exportExcel">导出excel</el-button> |
||||
|
</el-form-item> |
||||
|
</el-form> |
||||
|
</div> |
||||
|
<div class="table-box"> |
||||
|
<p>金豆总数:充值金豆总数:{{ countValue }}合计金额数:{{ priceValue }}</p> |
||||
|
<el-table :data="tableData" style="width: 100%" height="584px"> |
||||
|
<el-table-column type="index" label="序号" width="100px" fixed="left"> |
||||
|
<template #default="scope"> |
||||
|
<span>{{ |
||||
|
scope.$index + 1 + (getObj.pageNum - 1) * getObj.pageSize |
||||
|
}}</span> |
||||
|
</template> |
||||
|
</el-table-column> |
||||
|
<el-table-column fixed="left" prop="name" label="姓名" width="150" /> |
||||
|
<el-table-column fixed="left" prop="jwcode" label="精网号" width="120" /> |
||||
|
<el-table-column prop="deptName" label="地区" width="120" /> |
||||
|
<el-table-column prop="orderNo" label="订单号" width="120" /> |
||||
|
<el-table-column prop="count" label="金豆数量" width="120"> |
||||
|
</el-table-column> |
||||
|
<!-- <el-table-column prop="moneyBuy" label="付费金豆" width="120"> |
||||
|
</el-table-column> |
||||
|
<el-table-column prop="moneyFree" label="免费金豆" width="120"> |
||||
|
</el-table-column> --> |
||||
|
<el-table-column prop="price" label="金额"></el-table-column> |
||||
|
<!-- <el-table-column prop="type" label="类型"></el-table-column> --> |
||||
|
<el-table-column prop="payStyle" label="充值平台" width="140"> |
||||
|
</el-table-column> |
||||
|
<!-- <el-table-column prop="notes" label="备注" width="210"></el-table-column> --> |
||||
|
<el-table-column |
||||
|
prop="successTime" |
||||
|
label="充值时间" |
||||
|
width="210" |
||||
|
show-overflow-tooltip |
||||
|
> |
||||
|
<template #default="scope"> |
||||
|
<span>{{ |
||||
|
!!scope.row.successTime |
||||
|
? moment.unix(scope.row.time).format('YYYY-MM-DD HH:mm:ss') |
||||
|
: '-' |
||||
|
}}</span> |
||||
|
</template> |
||||
|
</el-table-column> |
||||
|
</el-table> |
||||
|
<!-- 分页 --> |
||||
|
<div class="pagination"> |
||||
|
<el-pagination |
||||
|
background |
||||
|
:page-size="getObj.pageSize" |
||||
|
:page-sizes="[5, 10, 20, 50, 100]" |
||||
|
layout="total, sizes, prev, pager, next, jumper" |
||||
|
:total="total" |
||||
|
@size-change="handlePageSizeChange" |
||||
|
@current-change="handleCurrentChange" |
||||
|
> |
||||
|
</el-pagination> |
||||
|
</div> |
||||
|
</div> |
||||
|
<!-- 这是导出excel的弹窗 --> |
||||
|
<el-dialog |
||||
|
v-model="dialogVisible" |
||||
|
title="请选择导出条件" |
||||
|
width="500" |
||||
|
:close-on-click-modal="false" |
||||
|
@close=" |
||||
|
() => { |
||||
|
dialogVisible = false |
||||
|
isExport = false |
||||
|
} |
||||
|
" |
||||
|
> |
||||
|
<template #footer> |
||||
|
<el-form |
||||
|
ref="ruleFormRef" |
||||
|
style="max-width: 600px" |
||||
|
:model="excelData" |
||||
|
:rules="rules" |
||||
|
label-width="auto" |
||||
|
class="demo-ruleForm" |
||||
|
status-icon |
||||
|
> |
||||
|
<el-form-item prop="activityName" label="精网号:"> |
||||
|
<el-input |
||||
|
v-model="excelData.jwcode" |
||||
|
placeholder="请输入精网号" |
||||
|
style="width: 220px" |
||||
|
/> |
||||
|
</el-form-item> |
||||
|
<el-form-item label="所属地区:" |
||||
|
><el-select |
||||
|
v-model="excelData.area" |
||||
|
placeholder="请选择所属地区" |
||||
|
style="width: 240px" |
||||
|
clearable |
||||
|
> |
||||
|
<el-option |
||||
|
v-for="item in areaList" |
||||
|
:key="item" |
||||
|
:label="item" |
||||
|
:value="item" |
||||
|
/> |
||||
|
</el-select> |
||||
|
</el-form-item> |
||||
|
|
||||
|
<el-form-item label="更新时间:"> |
||||
|
<el-radio-group v-model="excelData.timegap"> |
||||
|
<el-radio value="1">今天</el-radio> |
||||
|
<el-radio value="3">近三天</el-radio> |
||||
|
<el-radio value="7">近一周</el-radio> |
||||
|
<el-radio value="30">近一个月</el-radio> |
||||
|
</el-radio-group> |
||||
|
</el-form-item> |
||||
|
<el-button |
||||
|
type="primary" |
||||
|
size="small" |
||||
|
style="margin-left: 10px" |
||||
|
@click="exportConfirm()" |
||||
|
>确定</el-button |
||||
|
> |
||||
|
</el-form> |
||||
|
</template> |
||||
|
</el-dialog> |
||||
|
</template> |
||||
|
<script setup lang="ts"> |
||||
|
import { reactive, ref } from 'vue' |
||||
|
import { FormInstance } from 'element-plus' |
||||
|
import { ElMessage } from 'element-plus' |
||||
|
import moment from 'moment' |
||||
|
import API from '@/util/http' |
||||
|
import { utils, write } from 'xlsx' |
||||
|
import { saveAs } from 'file-saver' |
||||
|
// 充值明细表格 |
||||
|
const tableData = ref([]) |
||||
|
//分页总条目 |
||||
|
const total = ref(100) |
||||
|
const dialogVisible = ref(false) |
||||
|
const excelData = reactive({ |
||||
|
jwcode: '', |
||||
|
area: '', |
||||
|
timegap: '', |
||||
|
startTime: '', |
||||
|
endTime: '' |
||||
|
}) |
||||
|
const priceValue = ref(0) |
||||
|
const countValue = ref(0) |
||||
|
const areaList = ref<string[]>([]) |
||||
|
const isExport = ref<boolean>(false) |
||||
|
const rules = ref({ |
||||
|
jwcode: [{ required: true, message: '请输入精网号', trigger: 'blur' }], |
||||
|
area: [{ required: true, message: '请选择所属地区', trigger: 'change' }] |
||||
|
}) |
||||
|
const handlePageSizeChange = (val) => { |
||||
|
getObj.value.pageSize = val |
||||
|
getObj.value.pageNum = 1 |
||||
|
getInit({}) |
||||
|
} |
||||
|
const handleCurrentChange = function (val) { |
||||
|
getObj.value.pageNum = val |
||||
|
getInit({}) |
||||
|
} |
||||
|
const platformList = ref<string[]>([ |
||||
|
// 'stripe', |
||||
|
// 'ios', |
||||
|
// 'FirstData', |
||||
|
// 'paymentasia', |
||||
|
// 'system', |
||||
|
// '金币系统' |
||||
|
]) |
||||
|
const typeList = ref<string[]>([ |
||||
|
'金币换金豆', |
||||
|
'金币换免费金豆', |
||||
|
'赠送金豆', |
||||
|
'购买金豆', |
||||
|
'客服操作' |
||||
|
]) |
||||
|
//搜索表单数据 |
||||
|
const detailY = ref({ |
||||
|
jwcode: '', |
||||
|
deptName: '', |
||||
|
orderNo: '', |
||||
|
payStyle: '', |
||||
|
type: '', |
||||
|
createTime: '' |
||||
|
}) |
||||
|
const getObj = ref({ |
||||
|
pageNum: 1, |
||||
|
pageSize: 50 |
||||
|
}) |
||||
|
const exportExcel = function () { |
||||
|
dialogVisible.value = true |
||||
|
isExport.value = true |
||||
|
} |
||||
|
const exportConfirm = function () { |
||||
|
if (excelData.timegap == '1') { |
||||
|
excelData.startTime = moment().startOf('day').format('YYYY-MM-DD HH:mm:ss') |
||||
|
excelData.endTime = moment().endOf('day').format('YYYY-MM-DD HH:mm:ss') |
||||
|
} else if (excelData.timegap == '3') { |
||||
|
excelData.startTime = moment() |
||||
|
.subtract(3, 'days') |
||||
|
.startOf('day') |
||||
|
.format('YYYY-MM-DD HH:mm:ss') |
||||
|
excelData.endTime = moment().endOf('day').format('YYYY-MM-DD HH:mm:ss') |
||||
|
} else if (excelData.timegap == '7') { |
||||
|
excelData.startTime = moment() |
||||
|
.subtract(7, 'days') |
||||
|
.startOf('day') |
||||
|
.format('YYYY-MM-DD') |
||||
|
excelData.endTime = moment().endOf('day').format('YYYY-MM-DD HH:mm:ss') |
||||
|
} else if (excelData.timegap == '30') { |
||||
|
excelData.startTime = moment() |
||||
|
.subtract(30, 'days') |
||||
|
.startOf('day') |
||||
|
.format('YYYY-MM-DD HH:mm:ss') |
||||
|
excelData.endTime = moment().endOf('day').format('YYYY-MM-DD HH:mm:ss') |
||||
|
} |
||||
|
getInit( |
||||
|
{ |
||||
|
sortField: '', |
||||
|
sortOrder: '' |
||||
|
}, |
||||
|
(data) => { |
||||
|
console.log('导出数据', data) |
||||
|
//导出的数据将字段映射 |
||||
|
data = data.map((item) => { |
||||
|
return { |
||||
|
姓名: item.name, |
||||
|
精网号: item.jwcode, |
||||
|
地区: item.deptName, |
||||
|
订单号: item.orderNo, |
||||
|
充值平台: item.payStyle, |
||||
|
金豆数量: item.count, |
||||
|
充值时间: moment(item.successTime).format('YYYY-MM-DD'), |
||||
|
金额: item.price |
||||
|
} |
||||
|
}) |
||||
|
if (data.length == 0) { |
||||
|
ElMessage.error('没有数据') |
||||
|
isExport.value = false |
||||
|
dialogVisible.value = false |
||||
|
return |
||||
|
} |
||||
|
console.log('导出数据', data) |
||||
|
excelExport(data) |
||||
|
} |
||||
|
) |
||||
|
} |
||||
|
//数据导出excel |
||||
|
const excelExport = async function (data) { |
||||
|
const worksheet = utils.json_to_sheet(data) |
||||
|
const workbook = utils.book_new() |
||||
|
utils.book_append_sheet(workbook, worksheet, 'Sheet1') |
||||
|
|
||||
|
const wbout = write(workbook, { bookType: 'xlsx', type: 'array' }) |
||||
|
saveAs( |
||||
|
new Blob([wbout], { type: 'application/octet-stream' }), |
||||
|
'数据导出.xlsx' |
||||
|
) |
||||
|
isExport.value = false |
||||
|
dialogVisible.value = false |
||||
|
} |
||||
|
const ruleFormRef = ref<FormInstance>() |
||||
|
//初始化 |
||||
|
const getInit = async function ( |
||||
|
{ |
||||
|
sortField = '', |
||||
|
sortOrder = '' |
||||
|
}: { |
||||
|
sortField?: string |
||||
|
sortOrder?: string |
||||
|
}, |
||||
|
callback?: Function |
||||
|
) { |
||||
|
try { |
||||
|
console.log('搜索参数', getObj.value) |
||||
|
const [startTime, endTime] = detailY.value.createTime |
||||
|
console.log(startTime, endTime) |
||||
|
// 发送POST请求 |
||||
|
const result = await API({ |
||||
|
url: '/dou/SearchPay', |
||||
|
data: { |
||||
|
pay: { |
||||
|
jwcode: isExport.value ? excelData.jwcode : detailY.value.jwcode, |
||||
|
deptName: isExport.value ? excelData.area : detailY.value.deptName, |
||||
|
startTime: isExport.value ? excelData.startTime : startTime || '', |
||||
|
endTime: isExport.value ? excelData.endTime : endTime || '', |
||||
|
payStyle: isExport.value ? '' : detailY.value.payStyle, |
||||
|
// type: isExport.value ? '' : detailY.value.type, |
||||
|
orderNo: isExport.value ? '' : detailY.value.orderNo, |
||||
|
sortField, |
||||
|
sortOrder |
||||
|
}, |
||||
|
pageNum: isExport.value ? '' : getObj.value.pageNum, |
||||
|
pageSize: isExport.value ? '' : getObj.value.pageSize |
||||
|
} |
||||
|
}) |
||||
|
|
||||
|
if (isExport.value) { |
||||
|
!!callback && callback(result.data) |
||||
|
} else { |
||||
|
tableData.value = result.data.list |
||||
|
total.value = result.data.total |
||||
|
} |
||||
|
} catch (error) { |
||||
|
console.log('请求失败', error) |
||||
|
// 在这里可以处理错误逻辑,比如显示错误提示等 |
||||
|
} |
||||
|
} |
||||
|
// const handleSortChange = (column) => { |
||||
|
// const { prop, order } = column |
||||
|
// if (order === 'ascending') { |
||||
|
// getInit({ sortField: prop, sortOrder: 'ASC' }) |
||||
|
// } else if (order === 'descending') { |
||||
|
// getInit({ sortField: prop, sortOrder: 'DESC' }) |
||||
|
// } |
||||
|
// } |
||||
|
// 搜索 |
||||
|
const search = function () { |
||||
|
getObj.value.pageNum = 1 |
||||
|
getInit({}) |
||||
|
getCount() |
||||
|
} |
||||
|
// 重置 |
||||
|
const reset = function (formEl) { |
||||
|
formEl.resetFields() |
||||
|
} |
||||
|
//充值平台接口 |
||||
|
const getPayPlatform = async () => { |
||||
|
try { |
||||
|
const result = await API({ |
||||
|
url: '/dou/SearchStyle' |
||||
|
}) |
||||
|
platformList.value = result.data |
||||
|
} catch (error) { |
||||
|
console.log('请求失败', error) |
||||
|
} |
||||
|
} |
||||
|
//获取地区接口 |
||||
|
const getArea = async () => { |
||||
|
try { |
||||
|
const result = await API({ |
||||
|
url: '/dou/SearchPayIp' |
||||
|
}) |
||||
|
areaList.value = result.data |
||||
|
} catch (error) { |
||||
|
console.log('请求失败', error) |
||||
|
} |
||||
|
} |
||||
|
//获取支付方式接口 |
||||
|
const getPayType = async () => { |
||||
|
try { |
||||
|
const result = await API({ |
||||
|
url: '/dou/getStyle' |
||||
|
}) |
||||
|
platformList.value = result.data |
||||
|
// typeList.value = result.data |
||||
|
} catch (error) { |
||||
|
console.log('请求失败', error) |
||||
|
} |
||||
|
} |
||||
|
//获取金豆数接口 |
||||
|
const getCount = async () => { |
||||
|
try { |
||||
|
const result = await API({ |
||||
|
url: '/dou/getRechargeTotal', |
||||
|
data: { |
||||
|
jwcode: detailY.value.jwcode, |
||||
|
deptName: detailY.value.deptName, |
||||
|
startTime: detailY.value.createTime[0], |
||||
|
endTime: detailY.value.createTime[1], |
||||
|
orderNo: detailY.value.orderNo, |
||||
|
payStyle: detailY.value.payStyle |
||||
|
} |
||||
|
}) |
||||
|
if (!!result.data) { |
||||
|
console.log('合计数', result.data) |
||||
|
const { priceTotal, countTotal } = result.data |
||||
|
console.log('金豆总数', priceTotal, countTotal) |
||||
|
priceValue.value = priceTotal |
||||
|
countValue.value = countTotal |
||||
|
} else { |
||||
|
priceValue.value = 0 |
||||
|
countValue.value = 0 |
||||
|
} |
||||
|
} catch (error) { |
||||
|
console.log('请求失败', error) |
||||
|
} |
||||
|
} |
||||
|
getInit({}) |
||||
|
getArea() |
||||
|
getPayType() |
||||
|
getCount() |
||||
|
getPayPlatform() |
||||
|
</script> |
||||
|
<style scoped lang="scss"> |
||||
|
.filter-box { |
||||
|
width: 100%; |
||||
|
display: flex; |
||||
|
justify-content: space-between; |
||||
|
align-items: center; |
||||
|
padding: 20px; |
||||
|
padding-bottom: 0px; |
||||
|
box-sizing: border-box; |
||||
|
box-shadow: 0 2px 10px rgba(0, 0, 0, 0.1); |
||||
|
margin-bottom: 20px; |
||||
|
border-radius: 5px; |
||||
|
.el-form { |
||||
|
display: flex; |
||||
|
flex-wrap: wrap; |
||||
|
row-gap: 20px; |
||||
|
column-gap: 20px; |
||||
|
} |
||||
|
} |
||||
|
.table-box { |
||||
|
width: 100%; |
||||
|
padding: 20px; |
||||
|
box-sizing: border-box; |
||||
|
box-shadow: 0 2px 10px rgba(0, 0, 0, 0.1); |
||||
|
border-radius: 5px; |
||||
|
} |
||||
|
.pagination { |
||||
|
display: flex; |
||||
|
align-items: center; |
||||
|
margin-top: 10px; |
||||
|
} |
||||
|
</style> |
2
gold-system/stats.html
File diff suppressed because it is too large
View File
File diff suppressed because it is too large
View File
Write
Preview
Loading…
Cancel
Save
Reference in new issue