Browse Source

样式修改,表单精简

zhangrenyuan/feature-20250728113353-金币前端三期
lihuilin 6 days ago
parent
commit
9888be00af
  1. 4
      .env.development
  2. 148
      src/views/audit/beanAudit.vue
  3. 337
      src/views/audit/gold/rechargeAudit.vue
  4. 255
      src/views/audit/gold/refundAudit.vue
  5. 215
      src/views/consume/gold/addCoinConsume.vue
  6. 236
      src/views/managerecharge/rate.vue
  7. 2
      src/views/permissions/rolePermission.vue
  8. 8
      src/views/permissions/userPermission.vue
  9. 168
      src/views/refund/gold/addCoinRefund.vue
  10. 132
      src/views/workspace/index.vue
  11. 2
      stats.html

4
.env.development

@ -1,4 +1,4 @@
VITE_API_BASE='https://hwjb.homilychart.com/dev/admin'
# VITE_API_BASE='https://hwjb.homilychart.com/dev/admin'
# 测试环境
# VITE_API_BASE='http://54.255.212.181:10704/'
# 正式环境
@ -11,6 +11,6 @@ VITE_UPLOAD_URL=http://39.101.133.168:8828/hljw/api/aws/upload
# zhangyong
# VITE_API_BASE='http://192.168.3.83:8081/'
# 本地
# VITE_API_BASE='http://localhost:8081/'
VITE_API_BASE='http://localhost:8081/'
# sunjiabei
# VITE_API_BASE='http://192.168.0.113:8081/'

148
src/views/audit/beanAudit.vue

@ -1,39 +1,24 @@
<template>
<el-card style="margin-bottom: 5px">
<el-row style="margin-bottom: 10px">
<el-col :span="6">
<el-card style="margin-bottom: 0.5vh;width:82.5vw">
<el-col style="margin-bottom: 1vh">
<el-text size="large">精网号</el-text>
<el-input v-model="searchForm.jwcode" placeholder="请输入精网号" style="width: 240px" clearable />
</el-col>
<el-col :span="6">
<el-input v-model="searchForm.jwcode" placeholder="请输入精网号" style="width: 12vw;margin-right:1vw" clearable />
<el-text class="mx-1" size="large">所属地区</el-text>
<el-cascader v-model="selectedMarketPath" :options="marketOptions" placeholder="请选择所属地区" clearable
style="width:180px" @change="handleMarketChange" />
<el-cascader v-model="selectedMarkets" :options="marketOptions" placeholder="请选择所属地区" clearable
style="width: 12vw" @change="handleMarketChange" />
</el-col>
</el-row>
<el-row>
<el-col :span="15">
<div class="time-controls">
<div class="time-group">
<el-col>
<el-text size="large" style="width: 80px">充值时间</el-text>
<el-date-picker v-model="dateRange" type="datetimerange" range-separator="" start-placeholder="开始时间"
end-placeholder="结束时间" style="width: 400px" @change="handleDatePickerChange"
end-placeholder="结束时间" style="width: 25vw;margin-right:1vw" @change="handleDatePickerChange"
:default-time="defaultTime" />
<el-button @click="getToday()" style="margin-left: 10px"
:type="activeTimeRange === 'today' ? 'primary' : ''">
</el-button>
<el-button @click="getYesterday()" style="margin-left: 10px"
:type="activeTimeRange === 'yesterday' ? 'primary' : ''">
</el-button>
<el-button @click="get7Days()" style="margin-left: 10px"
:type="activeTimeRange === '7days' ? 'primary' : ''"> 近7天
</el-button>
<el-button @click="getToday()" :type="activeTimeRange === 'today' ? 'primary' : ''"></el-button>
<el-button @click="getYesterday()" :type="activeTimeRange === 'yesterday' ? 'primary' : ''"></el-button>
<el-button @click="get7Days()" :type="activeTimeRange === '7days' ? 'primary' : ''">近7天</el-button>
<el-button type="success" @click="resetSearch">重置</el-button>
<el-button type="primary" @click="handleSearch">查询</el-button>
</div>
</div>
</el-col>
</el-row>
</el-card>
<el-card>
@ -94,7 +79,7 @@
@size-change="handlePageSizeChange" @current-change="handleCurrentChange"></el-pagination>
</el-card>
<el-dialog v-model="rejectDialogVisible" title="驳回理由" width="500px">
<el-dialog v-model="rejectVisible" title="驳回理由" width="500px">
<el-form>
<el-form-item label="驳回理由" required>
<el-input v-model="reason" type="textarea" :rows="4" placeholder="请输入驳回理由" maxlength="200" show-word-limit />
@ -102,7 +87,7 @@
</el-form>
<template #footer>
<span class="dialog-footer">
<el-button @click="rejectDialogVisible = false">取消</el-button>
<el-button @click="rejectVisible = false">取消</el-button>
<el-button type="primary" @click="handleReject()">确定</el-button>
</span>
</template>
@ -133,7 +118,7 @@ const activeName = ref('wait')
const sortField = ref('')
const sortOrder = ref('')
const checkTab = ref('pending')
const rejectDialogVisible = ref(false)
const rejectVisible = ref(false)
const reason = ref('')
const rejectRow = ref({
id: null
@ -165,47 +150,7 @@ const stats = ref({
freeBean: 0
})
//
const selectedMarketPath = ref("")
const showRejectDialog = (row) => {
rejectRow.value.id = row.id
reason.value = ''
rejectDialogVisible.value = true
}
//
const getmarkets = async function () {
try {
// POST
const result = await API({
url: '/market/selectMarket',
});
//
console.log('请求成功', result)
//
const transformTree = (nodes) => {
//
const allChildren = nodes.flatMap(node => node.children || []);
return allChildren.map(child => {
const grandchildren = child.children && child.children.length
? transformTree([child]) //
: null;
return {
value: child.name,
label: child.name,
children: grandchildren
};
});
};
//
marketOptions.value = transformTree(result.data)
console.log('转换后的地区树==============', marketOptions.value)
} catch (error) {
console.log('请求失败', error)
}
}
const selectedMarkets = ref("")
const handleSortChange = (column) => {
if (column.prop === 'permanentBean') {
sortField.value = 'permanentBean'
@ -224,6 +169,7 @@ const handleSortChange = (column) => {
get()
}
const handleSearch = function () {
trimJwCode()
if (searchForm.value.jwcode) {
const numRef = /^\d{1,9}$/;
if (!numRef.test(searchForm.value.jwcode)) {
@ -284,7 +230,6 @@ const getStats = async () => {
auditStartTime: searchForm.value.auditStartTime,
auditEndTime: searchForm.value.auditEndTime
}
const res = await API({
url: '/beanAudit/statsBean',
data: params
@ -322,7 +267,6 @@ const handleApprove = async (row) => {
ElMessage.error('无此权限')
}
}
//
const handleReject = async () => {
if (findMenuById(menuTree.value, permissionMapping.Golden_Bean_Recharge_Approval)) {
@ -338,7 +282,7 @@ const handleReject = async () => {
}
await API({ url: '/beanAudit/status2', data: params })
ElMessage.success('驳回成功')
rejectDialogVisible.value = false
rejectVisible.value = false
get()
getStats()
} catch (error) {
@ -356,7 +300,6 @@ const getToday = function () {
dateRange.value = [startTime, endTime]
console.log('dateRange', dateRange.value)
activeTimeRange.value = 'today'
get()
getStats()
}
@ -367,7 +310,6 @@ const getYesterday = function () {
dateRange.value = [startTime, endTime]
console.log('dateRange', dateRange.value)
activeTimeRange.value = 'yesterday'
get()
getStats()
}
@ -378,7 +320,6 @@ const get7Days = function () {
dateRange.value = [startTime, endTime]
console.log('dateRange', dateRange.value)
activeTimeRange.value = '7days'
get()
getStats()
}
@ -393,14 +334,13 @@ const resetSearch = function () {
auditStartTime: '',
auditEndTime: ''
}
selectedMarketPath.value = []
selectedMarkets.value = []
dateRange.value = []
activeTimeRange.value = '' //
activeTimeRange.value = ''
get()
getStats()
}
const handleClick = function (tab) {
resetSearch()
activeName.value = tab.props.name
@ -412,7 +352,7 @@ const handleClick = function (tab) {
adminReject()
}
}
//
//
const adminWait = async function () {
checkTab.value = 'pending'
sortField.value = ''
@ -420,10 +360,10 @@ const adminWait = async function () {
searchForm.value.status = STATUS.PENDING
await get()
await getStats()
console.log('切换页面后:', checkTab.value,sortField.value, sortOrder.value)
console.log('切换页面后:', checkTab.value, sortField.value, sortOrder.value)
}
//
//
const adminPass = async function () {
checkTab.value = 'pass'
sortField.value = ''
@ -431,10 +371,10 @@ const adminPass = async function () {
searchForm.value.status = STATUS.APPROVED
await get()
await getStats()
console.log('切换页面后:', checkTab.value,sortField.value, sortOrder.value)
console.log('切换页面后:', checkTab.value, sortField.value, sortOrder.value)
}
//
//
const adminReject = async function () {
checkTab.value = 'reject'
sortField.value = ''
@ -442,7 +382,7 @@ const adminReject = async function () {
searchForm.value.status = STATUS.REJECTED
await get()
await getStats()
console.log('切换页面后:', checkTab.value,sortField.value, sortOrder.value)
console.log('切换页面后:', checkTab.value, sortField.value, sortOrder.value)
}
const handleMarketChange = (value) => {
if (value && value.length > 0) {
@ -469,6 +409,44 @@ const format3 = (num) => {
const throttledHandleApprove = _.throttle(handleApprove, 5000, {
trailing: false
})
const showRejectDialog = (row) => {
rejectRow.value.id = row.id
reason.value = ''
rejectVisible.value = true
}
//
const getmarkets = async function () {
try {
const result = await API({
url: '/market/selectMarket',
});
console.log('请求成功', result)
//
const transformTree = (nodes) => {
//
const allChildren = nodes.flatMap(node => node.children || []);
return allChildren.map(child => {
const grandchildren = child.children && child.children.length
? transformTree([child]) //
: null;
return {
value: child.name,
label: child.name,
children: grandchildren
}
})
}
marketOptions.value = transformTree(result.data)
console.log('转换后的地区树==============', marketOptions.value)
} catch (error) {
console.log('请求失败', error)
}
}
const trimJwCode = () => {
if (searchForm.value.jwcode) {
searchForm.value.jwcode = searchForm.value.jwcode.replace(/\s/g, '');
}
}
onMounted(async () => {
getmarkets()
get()

337
src/views/audit/gold/rechargeAudit.vue

@ -1,98 +1,58 @@
<!-- 支付凭证 -->
<template>
<el-row>
<el-col>
<el-card style="margin-bottom: 20px;margin-top:10px">
<el-row style="margin-bottom: 5px">
<el-col :span="6">
<el-card style="margin-bottom: 0.5vh;margin-top: 0.5vh">
<el-col style="margin-bottom: 0.5vh">
<el-text size="large">精网号</el-text>
<el-input v-model="rechargeAudit.jwcode" placeholder="请输入精网号" style="width: 240px" clearable/>
</el-col>
<el-col :span="6">
<el-input v-model="rechargeAudit.jwcode" placeholder="请输入精网号" style="width: 12vw;margin-right:1vw" clearable />
<el-text size="large">活动名称</el-text>
<el-select v-model="rechargeAudit.activity" placeholder="请选择活动名称" style="width: 240px" clearable>
<el-option v-for="item in activity" :key="item" :label="item" :value="item"/>
<el-select v-model="rechargeAudit.activity" placeholder="请选择活动名称" style="width: 12vw;margin-right:1vw" clearable>
<el-option v-for="item in activity" :key="item" :label="item" :value="item" />
</el-select>
</el-col>
<el-col :span="6">
<el-text size="large">支付方式</el-text>
<el-select v-model="rechargeAudit.payModel" placeholder="请选择支付方式" style="width: 240px" clearable>
<el-option v-for="item in payModel" :key="item.value" :label="item.label" :value="item.value"/>
<el-select v-model="rechargeAudit.payModel" placeholder="请选择支付方式" style="width: 12vw;margin-right:1vw" clearable>
<el-option v-for="item in payModel" :key="item.value" :label="item.label" :value="item.value" />
</el-select>
<el-text size="large">所属地区</el-text>
<el-cascader v-model="selectedMarketPath" :options="market" placeholder="请选择所属地区" clearable style="width:12vw"
@change="handleMarketChange" />
</el-col>
<el-col :span="6">
<el-text class="mx-1" size="large">所属地区</el-text>
<el-cascader
v-model="selectedMarketPath"
:options="market"
placeholder="请选择所属地区"
clearable
style="width:180px"
@change="handleMarketChange"
/>
</el-col>
</el-row>
<el-row>
<el-col :span="12">
<div class="time-controls">
<div class="time-group">
<el-text size="large" style="width: 80px">充值时间</el-text>
<el-col>
<el-text size="large">充值时间</el-text>
<el-date-picker v-model="getTime" type="datetimerange" range-separator="" start-placeholder="起始时间"
end-placeholder="结束时间" style="width: 400px" @change="handleDatePickerChange"
:default-time="defaultTime"
/>
<el-button @click="getToday()" style="margin-left: 10px"
:type="activeTimeRange === 'today' ? 'primary' : ''">
</el-button>
<el-button @click="getYesterday()" style="margin-left: 10px"
:type="activeTimeRange === 'yesterday' ? 'primary' : ''">
</el-button>
<el-button @click="get7Days()" style="margin-left: 10px"
:type="activeTimeRange === '7days' ? 'primary' : ''"> 近7天
</el-button>
end-placeholder="结束时间" class="time-controls" style="margin-right:1vw;width:25vw"
@change="handleDatePickerChange" />
<el-button @click="getToday()" :type="activeTimeRange === 'today' ? 'primary' : ''"></el-button>
<el-button @click="getYesterday()" :type="activeTimeRange === 'yesterday' ? 'primary' : ''"></el-button>
<el-button @click="get7Days()" :type="activeTimeRange === '7days' ? 'primary' : ''">近7天</el-button>
<el-button @click="resetSearch" type="success">重置</el-button>
<el-button type="primary" @click="handleSearch">查询</el-button>
</div>
</div>
<el-button @click="handleSearch"type="primary" >查询</el-button>
</el-col>
</el-row>
</el-card>
</el-col>
</el-row>
<el-row>
<el-col>
<el-card>
<el-tabs v-model="activeName" type="card" @tab-click="handleClick">
<el-tab-pane label="待审核" name="wait"></el-tab-pane>
<el-tab-pane label="已通过" name="pass"></el-tab-pane>
<el-tab-pane label="已驳回" name="reject"></el-tab-pane>
<div>
总条数{{ format3(stats.totalNum) }}&nbsp;&nbsp;&nbsp;&nbsp;
总金币数{{ format3(stats.permanentGolds + stats.freeGolds + stats.taskGolds) }}金币&nbsp;&nbsp;&nbsp;&nbsp;
永久金币{{ format3(stats.permanentGolds) }}金币&nbsp;&nbsp;&nbsp;&nbsp;
免费金币{{ format3(stats.freeGolds) }}金币&nbsp;&nbsp;&nbsp;&nbsp;
<!-- 任务金币{{ stats.taskGolds.toFixed(2) }}金币-->
</div>
</el-tabs>
<!--表格-->
<div style="height: 540px; overflow-y: auto">
<el-table :data="tableData" style="width: 100%" height="540px" @sort-change="handleSortChange"
<el-table :data="tableData" style="width: 100vw;height:55vh" @sort-change="handleSortChange"
:row-style="{ height: '50px' }">
<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="150px"/>
<el-table-column fixed="left" prop="jwcode" label="精网号" width="110px"/>
<el-table-column prop="market" label="所属地区" width="100px"/>
<el-table-column prop="activity" label="活动名称" width="100px" show-overflow-tooltip/>
<el-table-column fixed="left" prop="name" label="姓名" width="150px" />
<el-table-column fixed="left" prop="jwcode" label="精网号" width="110px" />
<el-table-column prop="market" label="所属地区" width="100px" />
<el-table-column prop="activity" label="活动名称" width="100px" show-overflow-tooltip />
<el-table-column prop="money" label="充值金额" sortable="custom" width="110px">
<template #default="scope">{{ scope.row.permanentGold / 100 }}</template>
</el-table-column>
@ -102,9 +62,8 @@
<el-table-column prop="freeGold" label="免费金币" sortable="custom" width="110px">
<template #default="scope">{{ (scope.row.freeGold) / 100 }}</template>
</el-table-column>
<el-table-column prop="remark" label="备注" width="200px" show-overflow-tooltip/>
<el-table-column prop="payModel" label="支付方式" width="110px"/>
<el-table-column prop="remark" label="备注" width="200px" show-overflow-tooltip />
<el-table-column prop="payModel" label="支付方式" width="110px" />
<el-table-column prop="voucher" label="支付凭证" width="110px">
<template #default="scope">
<div v-if="scope.row.voucher"
@ -115,10 +74,10 @@
<div v-else style="display: flex; justify-content: center; align-items: center; height: 40px;">--</div>
</template>
</el-table-column>
<el-table-column prop="adminName" label="提交人" width="100px"/>
<el-table-column prop="adminName" label="提交人" width="100px" />
<el-table-column prop="rejectReason" v-if="activeName === 'reject'" label="驳回理由" width="200px"
show-overflow-tooltip/>
<el-table-column v-if="activeName !== 'wait'" prop="auditName" label="审核人" width="100px"/>
show-overflow-tooltip />
<el-table-column v-if="activeName !== 'wait'" prop="auditName" label="审核人" width="100px" />
<el-table-column prop="payTime" sortable="custom" label="付款时间" width="200px">
<template #default="scope">
{{ moment(scope.row.payTime).format('YYYY-MM-DD HH:mm:ss') }}
@ -139,37 +98,30 @@
<div class="operation">
<el-popconfirm title="确定要通过此条记录吗?" @confirm="handleApprove(scope.row)">
<template #reference>
<el-button :disabled="scope.row.auditStatus === 1 || scope.row.auditStatus === 2" type="primary"
text>
<el-button :disabled="scope.row.auditStatus === 1 || scope.row.auditStatus === 2" type="primary" text>
通过
</el-button>
</template>
</el-popconfirm>
<el-button :disabled="scope.row.auditStatus === 1 || scope.row.auditStatus === 2" type="primary" text
@click="showRejectDialog(scope.row)">
<el-button :disabled="scope.row.auditStatus === 1 || scope.row.auditStatus === 2" type="primary" text @click="showRejectDialog(scope.row)">
驳回
</el-button>
</div>
</template>
</el-table-column>
</el-table>
</div>
<div class="pagination">
<el-pagination background :page-size="getObj.pageSize" :page-sizes="[5, 10, 20, 50, 100]"
<el-pagination :page-size="getObj.pageSize" :page-sizes="[5, 10, 20, 50, 100]"
layout="total, sizes, prev, pager, next, jumper" :total="total"
@size-change="handlePagination('size', $event)"
@current-change="handlePagination('page', $event)"></el-pagination>
</div>
</el-card>
</el-col>
</el-row>
<el-dialog v-model="rejectDialogVisible" title="驳回理由" width="500px">
<el-form>
<el-form-item label="驳回理由" required>
<el-input v-model="rejectReason" type="textarea" :rows="4" placeholder="请输入驳回理由" maxlength="200"
show-word-limit/>
<el-input v-model="rejectReason" type="textarea" :rows="4" placeholder="请输入驳回理由" maxlength="200" show-word-limit />
</el-form-item>
</el-form>
<template #footer>
@ -182,41 +134,37 @@
</template>
<script setup>
import {onMounted, reactive, ref} from 'vue'
import {ElMessage} from 'element-plus'
import { onMounted, reactive, ref } from 'vue'
import { ElMessage } from 'element-plus'
import request from '@/util/http.js'
import API from '@/util/http.js'
import moment from 'moment'
import {useAdminStore} from "@/store/index.js";
import {storeToRefs} from "pinia";
import {findMenuById, permissionMapping} from "@/utils/menuTreePermission.js"
import { useAdminStore } from "@/store/index.js";
import { storeToRefs } from "pinia";
const adminStore = useAdminStore();
const { adminData, menuTree } = storeToRefs(adminStore);
import { findMenuById, permissionMapping } from "@/utils/menuTreePermission.js"
import dayjs from "dayjs";
//
const trimJwCode = () => {
if (rechargeAudit.value.jwcode) {
rechargeAudit.value.jwcode = rechargeAudit.value.jwcode.replace(/\s/g, '');
}
}
const formatTime = (val) => val ? moment(val).format('YYYY-MM-DD HH:mm:ss') : ''
const defaultTime = [
new Date(2000, 1, 1, 0, 0, 0),
new Date(2000, 2, 1, 23, 59, 59),
]
//
const adminData = ref({})
//
const tableData = ref([])
//
//
const activeTimeRange = ref('')
//
const handleDatePickerChange = () => {
activeTimeRange.value = ''
}
//
const total = ref(50)
//
const getTime = ref([])
const activity = ref([])
const market = ref("")
const rejectDialogVisible = ref(false)
const rejectReason = ref('')
//
const currentRecord = ref(null)
//
const activeName = ref('wait')
const sortField = ref('')
const sortOrder = ref('')
//
const selectedMarketPath = ref("")
//
const rechargeAudit = ref({
jwcode: "", //
activity: "", //
@ -226,31 +174,13 @@ const rechargeAudit = ref({
market: "", //
auditStatus: "0",
})
//
const getObj = ref({
pageNum: 1,
pageSize: 50
})
//
const total = ref(50)
//
const getTime = ref([])
const activity = ref([])
//
const market = ref("")
//
const rejectDialogVisible = ref(false)
//
const rejectReason = ref('')
//
const currentRecord = ref(null)
//
const activeName = ref('wait')
//
const payModel = [
//
{
value: '现金',
label: '现金'
@ -268,8 +198,6 @@ const payModel = [
label: '其他(各地区电子支付)'
},
]
// ref
const Ref = ref(null)
//
const stats = ref({
totalNum: 0,
@ -278,38 +206,13 @@ const stats = ref({
freeGolds: 0,
taskGolds: 0
})
//
const sortField = ref('')
const sortOrder = ref('')
//
const rules = reactive({
rejectReason: [{required: true, message: '请输入驳回理由', trigger: 'blur'}]
rejectReason: [{ required: true, message: '请输入驳回理由', trigger: 'blur' }]
})
const getAdminData = async function () {
try {
const result = await request({
url: '/admin/userinfo',
data: {}
})
adminData.value = result
console.log('用户信息', adminData.value)
} catch (error) {
console.log('请求失败', error)
}
}
//
const getRecharge = async function (val) {
try {
//
if (typeof val === 'number') {
getObj.value.pageNum = val
}
//
if (getTime.value && getTime.value.length === 2) {
rechargeAudit.value.startTime = formatTime(getTime.value[0])
rechargeAudit.value.endTime = formatTime(getTime.value[1])
@ -317,8 +220,6 @@ const getRecharge = async function (val) {
rechargeAudit.value.startTime = ''
rechargeAudit.value.endTime = ''
}
console.log('搜索参数', getObj.value)
if (rechargeAudit.value.market === '总部' || rechargeAudit.value.market === '研发部') {
rechargeAudit.value.market = '';
}
@ -326,11 +227,9 @@ const getRecharge = async function (val) {
if (rechargeAudit.value.jwcode) {
//
const numberRegex = /^\d{1,9}$/;
//
if (!numberRegex.test(rechargeAudit.value.jwcode)) {
ElMessage.error('请检查精网号格式')
return
}
}
@ -346,9 +245,7 @@ const getRecharge = async function (val) {
}
}
})
//
tableData.value = result.list
//
total.value = result.total
} catch (error) {
console.log('请求失败', error)
@ -366,7 +263,6 @@ const getStats = async () => {
if (rechargeAudit.value.jwcode) {
//
const numberRegex = /^\d{1,9}$/;
//
if (!numberRegex.test(rechargeAudit.value.jwcode)) {
// ElMessage.error('')
@ -405,8 +301,7 @@ const resetSearch = function () {
startTime: "",
endTime: "",
market: "",
auditStatus: rechargeAudit.value.auditStatus,
auditStatus: rechargeAudit.value.auditStatus
}
selectedMarketPath.value = []
getTime.value = []
@ -420,7 +315,6 @@ const getToday = function () {
const today = dayjs()
const startTime = today.startOf('day').format('YYYY-MM-DD HH:mm:ss')
const endTime = today.endOf('day').format('YYYY-MM-DD HH:mm:ss')
getTime.value = [startTime, endTime]
console.log('getTime', getTime.value)
activeTimeRange.value = 'today' //
@ -430,11 +324,9 @@ const getToday = function () {
//
const getYesterday = function () {
const today = dayjs()
const startTime = today.subtract(1, 'day').startOf('day').format('YYYY-MM-DD HH:mm:ss')
const endTime = today.subtract(1, 'day').endOf('day').format('YYYY-MM-DD HH:mm:ss')
getTime.value = [startTime, endTime]
console.log('getTime', getTime.value)
activeTimeRange.value = 'yesterday' //
@ -444,7 +336,6 @@ const getYesterday = function () {
// 7
const get7Days = function () {
const today = dayjs()
const startTime = today.subtract(6, 'day').startOf('day').format('YYYY-MM-DD HH:mm:ss')
const endTime = today.endOf('day').format('YYYY-MM-DD HH:mm:ss')
@ -492,7 +383,6 @@ const handleClick = function (tab, event) {
adminReject()
}
}
const getActivity = async function () {
try {
const result = await request({
@ -505,8 +395,6 @@ const getActivity = async function () {
console.log('请求失败', error)
}
}
const handlePagination = (type, val) => {
if (type === 'size') {
getObj.value.pageSize = val
@ -516,11 +404,6 @@ const handlePagination = (type, val) => {
getRecharge()
getStats()
}
const adminStore = useAdminStore();
const {menuTree} = storeToRefs(adminStore);
//
const handleApprove = async (row) => {
if (findMenuById(menuTree.value, permissionMapping.Recharge_Approval)) {
@ -531,7 +414,7 @@ const handleApprove = async (row) => {
action: 1,
rejectReason: ''
}
await request({url: '/audit/audit', data: params})
await request({ url: '/audit/audit', data: params })
ElMessage.success('审核通过成功')
await getRecharge()
await getStats()
@ -544,19 +427,15 @@ const handleApprove = async (row) => {
}
}
//
const showRejectDialog = (row) => {
currentRecord.value = row
rejectReason.value = '' //
rejectReason.value = ''
if (findMenuById(menuTree.value, permissionMapping.Recharge_Approval)) {
rejectDialogVisible.value = true
} else {
ElMessage.error('无权限')
}
}
//
const handleReject = async () => {
if (findMenuById(menuTree.value, permissionMapping.Recharge_Approval)) {
@ -573,8 +452,7 @@ const handleReject = async () => {
rejectReason: rejectReason.value
}
await request({url: '/audit/audit', data: params})
await request({ url: '/audit/audit', data: params })
ElMessage.success('驳回操作成功')
rejectDialogVisible.value = false
await getRecharge()
@ -587,7 +465,6 @@ const handleReject = async () => {
ElMessage.error('无权限')
}
}
//
const handleSortChange = (column) => {
console.log('排序字段:', column.prop)
@ -638,9 +515,6 @@ const previewImage = (imageUrl) => {
document.body.removeChild(viewer);
});
};
//
const selectedMarketPath = ref("")
const handleMarketChange = (value) => {
if (value && value.length > 0) {
rechargeAudit.value.market = value[value.length - 1]
@ -649,28 +523,22 @@ const handleMarketChange = (value) => {
}
}
const props = {multiple: true}
const props = { multiple: true }
//
const getMarket = async function () {
try {
// POST
const result = await API({
url: '/market/selectMarket',
});
//
console.log('请求成功', result)
//
const transformTree = (nodes) => {
//
const allChildren = nodes.flatMap(node => node.children || []);
return allChildren.map(child => {
const grandchildren = child.children && child.children.length
? transformTree([child]) //
: null;
return {
value: child.name,
label: child.name,
@ -678,24 +546,33 @@ const getMarket = async function () {
};
});
};
//
market.value = transformTree(result.data)
console.log('转换后的地区树==============', market.value)
} catch (error) {
console.log('请求失败', error)
}
}
//
const format3 = (num) => {
//
return num.toLocaleString('en-US')
}
//
const handleDatePickerChange = () => {
activeTimeRange.value = ''
}
//
const trimJwCode = () => {
if (rechargeAudit.value.jwcode) {
rechargeAudit.value.jwcode = rechargeAudit.value.jwcode.replace(/\s/g, '');
}
}
const formatTime = (val) => val ? moment(val).format('YYYY-MM-DD HH:mm:ss') : ''
//
onMounted(async function () {
await getAdminData()
await getActivity()
await getMarket()
await getRecharge()
console.log('111')
console.log("看看通信来的用户身份", adminData.value)
await getStats()
})
</script>
@ -703,74 +580,18 @@ onMounted(async function () {
<style scoped>
.pagination {
display: flex;
margin-top: 0.5vh;
}
.operation {
display: flex;
}
.green-dot {
background-color: #67C23A;
}
.grey-dot {
background-color: #909399;
}
.red-dot {
background-color: #F56C6C;
}
.time-controls {
display: flex;
align-items: center;
}
.time-group {
display: flex;
align-items: center;
gap: 10px;
}
.quick-buttons {
display: flex;
align-items: center;
}
.status {
display: flex;
align-items: center;
/* 确保子元素垂直居中对齐 */
gap: 6px;
/* 设置圆点和文字之间的间距 */
}
.green-dot,
.grey-dot,
.red-dot {
display: inline-block;
width: 8px;
height: 8px;
border-radius: 50%;
flex-shrink: 0;
/* 防止圆点在空间不足时缩小 */
margin: 0;
/* 移除原有的 margin-right */
}
/* 备注列样式 */
.remark-cell {
display: block;
width: 100%;
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
}
/* 设置单元格内容溢出隐藏 */
.el-table .el-table__cell {
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
}
</style>

255
src/views/audit/gold/refundAudit.vue

@ -1,65 +1,35 @@
<template>
<el-row>
<el-col>
<div>
<el-card style="margin-bottom: 20px;margin-top:10px">
<el-row style="margin-bottom: 5px">
<el-col :span="6">
<el-card style="margin-bottom: 0.5vh;margin-top:0.5vh;width:82.5vw">
<el-col style="margin-bottom: 0.5vh">
<el-text size="large">精网号</el-text>
<el-input v-model="searchForm.jwcode" placeholder="请输入精网号" style="width: 240px" clearable/>
</el-col>
<el-col :span="6">
<el-input v-model="searchForm.jwcode" placeholder="请输入精网号" style="width: 12vw;margin-right:1vw" clearable />
<el-text size="large">商品名</el-text>
<el-select v-model="searchForm.goodsName" placeholder="请输入商品名" style="width: 240px" clearable>
<el-select v-model="searchForm.goodsName" placeholder="请输入商品名" style="width: 12vw;margin-right:1vw" clearable>
<el-option v-for="item in refundGoodsOptions" :key="item" :label="item" :value="item"></el-option>
</el-select>
</el-col>
<el-col :span="6">
<el-text size="large">退款方式</el-text>
<el-select v-model="searchForm.refundModel" placeholder="请选择" style="width: 240px" clearable>
<el-option label="全部退款" value="0"/>
<el-option label="部分退款" value="1"/>
<el-select v-model="searchForm.refundModel" placeholder="请选择" style="width: 12vw;margin-right:1vw" clearable>
<el-option label="全部退款" value="0" />
<el-option label="部分退款" value="1" />
</el-select>
<el-text size="large">所属地区</el-text>
<el-cascader v-model="selectedMarketPath" :options="market" placeholder="请选择所属地区" clearable style="width:12vw"
@change="handleMarketChange" />
</el-col>
<el-col :span="6">
<el-text class="mx-1" size="large">所属地区</el-text>
<el-cascader
v-model="selectedMarketPath"
:options="market"
placeholder="请选择所属地区"
clearable
style="width:180px"
@change="handleMarketChange"
/>
</el-col>
</el-row>
<el-row>
<el-col :span="15">
<div class="time-controls">
<div class="time-group">
<el-text size="large" style="width: 80px">提交时间</el-text>
<el-date-picker v-model="dateRange" type="datetimerange" range-separator=""
start-placeholder="开始时间"
end-placeholder="结束时间" style="width: 400px" @change="handleDatePickerChange" :default-time="defaultTime"/>
<el-button @click="getToday()" style="margin-left: 10px"
:type="activeTimeRange === 'today' ? 'primary' : ''">
</el-button>
<el-button @click="getYesterday()" style="margin-left: 10px"
:type="activeTimeRange === 'yesterday' ? 'primary' : ''">
</el-button>
<el-button @click="get7Days()" style="margin-left: 10px"
:type="activeTimeRange === '7days' ? 'primary' : ''"> 近7天
</el-button>
<el-col>
<el-text size="large">提交时间</el-text>
<el-date-picker v-model="dateRange" type="datetimerange" range-separator="" start-placeholder="开始时间" class="time-controls"
end-placeholder="结束时间" style="margin-right:1vw;width:25vw" @change="handleDatePickerChange" />
<el-button @click="getToday()" :type="activeTimeRange === 'today' ? 'primary' : ''"></el-button>
<el-button @click="getYesterday()" :type="activeTimeRange === 'yesterday' ? 'primary' : ''"></el-button>
<el-button @click="get7Days()" :type="activeTimeRange === '7days' ? 'primary' : ''">近7天</el-button>
<el-button type="success" @click="resetSearch">重置</el-button>
<el-button type="primary" @click="handleSearch">查询</el-button>
</div>
</div>
</el-col>
</el-row>
</el-card>
</div>
</el-col>
</el-row>
<el-card>
<el-tabs v-model="activeName" type="card" @tab-click="handleClick">
@ -76,19 +46,19 @@
任务金币{{ format3(stats.taskGolds.toFixed(2)) }}金币
</div>
<el-table :data="tableData" height="540px" @sort-change="handleSortChange">
<el-table-column type="index" label="序号" width="60"/>
<el-table-column prop="name" label="姓名" width="120"/>
<el-table-column prop="jwcode" label="精网号" width="120"/>
<el-table-column prop="market" label="所属地区" width="120"/>
<el-table :data="tableData" style="height:55vh" @sort-change="handleSortChange">
<el-table-column type="index" label="序号" width="60" />
<el-table-column prop="name" label="姓名" width="120" />
<el-table-column prop="jwcode" label="精网号" width="120" />
<el-table-column prop="market" label="所属地区" width="120" />
<el-table-column prop="refundType" label="退款类型" width="120"/>
<el-table-column prop="refundType" label="退款类型" width="120" />
<el-table-column prop="refundModel" label="退款方式" width="120">
<template #default="{ row }">
{{ row.refundModel === 0 ? '全部退款' : '部分退款' }}
</template>
</el-table-column>
<el-table-column prop="goodsName" label="退款商品" width="120" show-overflow-tooltip/>
<el-table-column prop="goodsName" label="退款商品" width="120" show-overflow-tooltip />
<el-table-column prop="sumGold" label="退款金额" width="120" sortable="custom">
<template #default="{ row }">
{{ row.sumGold / 100 }}
@ -109,11 +79,11 @@
{{ row.taskGold / 100 }}
</template>
</el-table-column>
<el-table-column prop="remark" label="备注" width="150" show-overflow-tooltip/><!-- 当内容过长被隐藏时显示 tooltip -->
<el-table-column prop="adminName" label="提交人" width="120"/>
<el-table-column prop="remark" label="备注" width="150" show-overflow-tooltip />
<el-table-column prop="adminName" label="提交人" width="120" />
<el-table-column v-if="checkTab === 'reject'" prop="rejectReason" label="驳回理由" width="150"
show-overflow-tooltip/>
<el-table-column v-if="checkTab !== 'pending'" prop="auditName" label="审核人" width="120"/>
show-overflow-tooltip />
<el-table-column v-if="checkTab !== 'pending'" prop="auditName" label="审核人" width="120" />
<el-table-column prop="createTime" label="提交时间" width="180" sortable="custom">
<template #default="{ row }">
{{ moment(row.createTime).format('YYYY-MM-DD HH:mm:ss') }}
@ -143,8 +113,7 @@
</el-table-column>
</el-table>
<el-pagination class="pagination" v-model:current-page="pagination.pageNum" v-model:page-size="pagination.pageSize"
layout="total, sizes, prev, pager, next, jumper" :total="pagination.total"
@size-change="handlePageSizeChange"
layout="total, sizes, prev, pager, next, jumper" :total="pagination.total" @size-change="handlePageSizeChange"
@current-change="handleCurrentChange"></el-pagination>
</el-card>
@ -152,7 +121,7 @@
<el-form>
<el-form-item label="驳回理由" required>
<el-input v-model="rejectReason" type="textarea" :rows="4" placeholder="请输入驳回理由" maxlength="200"
show-word-limit/>
show-word-limit />
</el-form-item>
</el-form>
<template #footer>
@ -165,33 +134,22 @@
</template>
<script setup>
import {onMounted, reactive, ref} from 'vue'
import {ElMessage} from 'element-plus'
import { onMounted, reactive, ref } from 'vue'
import { ElMessage } from 'element-plus'
import API from '@/util/http.js'
import moment from 'moment'
import {useAdminStore} from "@/store/index.js";
import {storeToRefs} from "pinia";
import {findMenuById, permissionMapping} from "@/utils/menuTreePermission.js"
import { useAdminStore } from "@/store/index.js";
import { storeToRefs } from "pinia";
import { findMenuById, permissionMapping } from "@/utils/menuTreePermission.js"
import dayjs from "dayjs";
const trimJwCode = () => {
if (searchForm.value.jwcode) {
searchForm.value.jwcode = searchForm.value.jwcode.replace(/\s/g, '');
}
}
const defaultTime = [
new Date(2000, 1, 1, 0, 0, 0),
new Date(2000, 2, 1,23 , 59, 59),
]
//
const activeTimeRange = ref('')
//
const handleDatePickerChange = () => {
activeTimeRange.value = ''
}
const adminStore = useAdminStore();
const { adminData, menuTree } = storeToRefs(adminStore);
//
const activeTimeRange = ref('')
const scopeValue = ref(null) //
const rejectDialogVisible = ref(false) //
const rejectReason = ref('') //
const rejectDialogVisible = ref(false)
const rejectReason = ref('')
//
const STATUS = {
PENDING: 0, //
@ -209,7 +167,6 @@ const searchForm = ref({
auditStatus: '0'
})
const checkTab = ref('pending') // STATUS012statusInteger
//
const dateRange = ref([])
const pagination = ref({
pageNum: 1,
@ -228,43 +185,14 @@ const stats = ref({
freeGolds: 0,
taskGolds: 0
})
//
const rejectVisible = ref(false)
//
const rejectObj = ref({})
//
const passObj = ref({})
//
const activeName = ref('wait')
// ref
const Ref = ref(null)
//
const sortField = ref('')
const sortOrder = ref('')
//
const rules = reactive({
reason: [{required: true, message: '请输入驳回理由', trigger: 'blur'}]
})
const getAdminData = async function () {
try {
const result = await API({url: '/admin/userinfo', data: {}})
adminInfo.value = result
console.log('请求成功', result)
console.log('用户信息', adminInfo.value)
} catch (error) {
console.log('请求失败', error)
}
}
const handlePageSizeChange = function (val) {
pagination.value.pageSize = val
get()
console.log('aaaaaaaaaaaaaaaaaa这是pageSize改变调用')
}
const handleCurrentChange = function (val) {
pagination.value.pageNum = val
get()
console.log('aaaaaaaaaaaaaaa这是pageNum改变调用')
}
const market = ref("")
//
const handleSortChange = (column) => {
if (column.prop === 'sumGold') {
@ -293,13 +221,10 @@ const showRejectDialog = (row) => {
rejectReason.value = ''
rejectDialogVisible.value = true
}
//
const market = ref("")
//
const getRefundGoods = async () => {
try {
const res = await API({url: '/general/goods'})
const res = await API({ url: '/general/goods' })
refundGoodsOptions.value = res.data || []
} catch (error) {
console.error('获取商品列表失败', error)
@ -344,7 +269,7 @@ const get = async function (val) {
return
}
}
const res = await API({url: '/audit/selectRefund', data: params})
const res = await API({ url: '/audit/selectRefund', data: params })
tableData.value = res.list || []
pagination.value.total = res.total || 0
console.log('查全部的total', pagination.value.total, res.total)
@ -352,10 +277,6 @@ const get = async function (val) {
console.error('获取数据失败', error)
}
}
const adminStore = useAdminStore();
const {menuTree} = storeToRefs(adminStore);
//
const handleApprove = async (row) => {
if (findMenuById(menuTree.value, permissionMapping.Refund_Approval)) {
@ -367,11 +288,10 @@ const handleApprove = async (row) => {
action: 1,// action1,2
rejectReason: ''
}
await API({url: '/audit/audit', data: params})//
await API({ url: '/audit/audit', data: params })
ElMessage.success('审核通过成功')
get()
getStats()
console.log('aaaaaaaaaa这是通过调用')
} catch (error) {
console.error('审核通过失败', error)
ElMessage.error('操作失败')
@ -396,12 +316,12 @@ const handleReject = async () => {
action: 2,
rejectReason: rejectReason.value
}
await API({url: '/audit/audit', data: params})
await API({ url: '/audit/audit', data: params })
ElMessage.success('驳回成功')
rejectDialogVisible.value = false
get()
getStats()
console.log('aaaaaaaaaa这是驳回调用', params)
console.log('看看驳回参数', params)
} catch (error) {
console.error('驳回失败', error)
ElMessage.error('操作失败')
@ -445,17 +365,12 @@ const getStats = async () => {
console.log('请求失败', error)
}
}
//
const handleSearch = function () {
// pagination.value.pageNum = 1
trimJwCode()
get()
getStats()
console.log('aaaaaaaaaa这是搜索按钮调用')
}
//
const resetSearch = function () {
const auditStatus = searchForm.value.auditStatus;
@ -476,22 +391,17 @@ const resetSearch = function () {
get()
getStats()
}
//
const getToday = function () {
const today = dayjs()
const startTime = today.startOf('day').format('YYYY-MM-DD HH:mm:ss')
const endTime =today.endOf('day').format('YYYY-MM-DD HH:mm:ss')
const endTime = today.endOf('day').format('YYYY-MM-DD HH:mm:ss')
dateRange.value = [startTime, endTime]
console.log('dateRange', dateRange.value)
activeTimeRange.value = 'today' //
activeTimeRange.value = 'today'
get()
getStats()
console.log('aaaaaaaaaa这是今天调用')
}
//
const getYesterday = function () {
const today = dayjs()
@ -499,13 +409,10 @@ const getYesterday = function () {
const endTime = today.subtract(1, 'day').endOf('day').format('YYYY-MM-DD HH:mm:ss')
dateRange.value = [startTime, endTime]
console.log('dateRange', dateRange.value)
activeTimeRange.value = 'yesterday' //
activeTimeRange.value = 'yesterday'
get()
getStats()
console.log('aaaaaaaaaa这是昨天调用')
}
// 7
const get7Days = function () {
const today = dayjs()
@ -513,14 +420,10 @@ const get7Days = function () {
const endTime = today.endOf('day').format('YYYY-MM-DD HH:mm:ss')
dateRange.value = [startTime, endTime]
console.log('dateRange', dateRange.value)
activeTimeRange.value = '7days' //
activeTimeRange.value = '7days'
get()
getStats()
console.log('aaaaaaaaaa这是近七天调用')
}
//
const handleClick = function (tab, event) {
activeName.value = tab.props.name
if (tab.props.name === 'wait') {
@ -531,7 +434,6 @@ const handleClick = function (tab, event) {
adminReject()
}
}
//
const getCurrentStatus = () => {
switch (activeName.value) {
@ -545,38 +447,27 @@ const getCurrentStatus = () => {
return ''
}
}
//
//
const adminWait = async function () {
checkTab.value = 'pending'
searchForm.value.auditStatus = STATUS.PENDING
// pagination.value.pageNum = 1
await get()
await getStats()
console.log('aaaaaaaaaaaaaaaaa看看checkTab,这是点击待审核调用', checkTab.value)
}
//
//
const adminPass = async function () {
checkTab.value = 'pass'
searchForm.value.auditStatus = STATUS.APPROVED
// pagination.value.pageNum = 1
await get()
await getStats()
console.log('aaaaaaaaaaaaaaaaaaaaa看看checkTab,这是点击已通过调用', checkTab.value)
}
//
//
const adminReject = async function () {
checkTab.value = 'reject'
searchForm.value.auditStatus = STATUS.REJECTED
// pagination.value.pageNum = 1
await get()
await getStats()
console.log('aaaaaaaaaaaaaaaaaa看看checkTab,这是点击已驳回调用', checkTab.value)
}
//
const selectedMarketPath = ref("")
const handleMarketChange = (value) => {
if (value && value.length > 0) {
@ -588,12 +479,10 @@ const handleMarketChange = (value) => {
//
const getMarket = async function () {
try {
// POST
const result = await API({
url: '/market/selectMarket',
});
//
})
console.log('请求成功', result)
//
@ -613,30 +502,49 @@ const getMarket = async function () {
};
});
};
//
market.value = transformTree(result.data)
console.log('转换后的地区树==============', market.value)
} catch (error) {
console.log('请求失败', error)
}
}
const trimJwCode = () => {
if (searchForm.value.jwcode) {
searchForm.value.jwcode = searchForm.value.jwcode.replace(/\s/g, '');
}
}
//
const handleDatePickerChange = () => {
activeTimeRange.value = ''
}
const format3 = (num) => {
//
return num.toLocaleString('en-US')
}
//
const rules = reactive({
reason: [{ required: true, message: '请输入驳回理由', trigger: 'blur' }]
})
const handlePageSizeChange = function (val) {
pagination.value.pageSize = val
get()
}
const handleCurrentChange = function (val) {
pagination.value.pageNum = val
get()
}
onMounted(async () => {
await getAdminData()
getRefundGoods()
await getMarket()
await get()
await getStats()
console.log('aaaaaaaaaa这是挂载后调用')
})
</script>
<style scoped>
.pagination {
display: flex;
margin-top:0.5vh;
}
.operation {
@ -646,9 +554,6 @@ onMounted(async () => {
.time-controls {
display: flex;
align-items: center;
}
.time-group {
display: flex;
align-items: center;
gap: 10px;

215
src/views/consume/gold/addCoinConsume.vue

@ -1,12 +1,8 @@
<script setup>
import {onMounted, reactive, ref, watch} from "vue";
import {ElMessage, ElMessageBox} from "element-plus";
import { onMounted, reactive, ref, watch } from "vue";
import { ElMessage, ElMessageBox } from "element-plus";
import moment from "moment";
import request from "@/util/http.js";
/*
====================工具方法==============================
*/
import request from "@/util/http.js"
//
const trimJwCode = () => {
if (addConsume.value.jwcode) {
@ -65,10 +61,10 @@ const Ref = ref(null);
//
const rules = reactive({
jwcode: [
{required: true, message: "请输入精网号", trigger: "blur"},
{ required: true, message: "请输入精网号", trigger: "blur" },
// { type: 'number', message: "", trigger: "blur" }
],
goodsName: [{required: true, message: "请选择商品", trigger: "blur"}],
goodsName: [{ required: true, message: "请选择商品", trigger: "blur" }],
sumGold: [
{ required: true, message: "消耗金币总数不能为空", trigger: "blur" },
{
@ -144,7 +140,7 @@ function validateInput() {
return false;
}
// 2 6
// 2 6
if (addConsume.value.sumGold) {
const sumGoldStr = addConsume.value.sumGold.toString();
@ -198,10 +194,10 @@ function calculateCoins(sumGold) {
console.log("消耗金币计算函数:计算金币", sumGold);
const parsedSumGold = parseFloat(sumGold);
if (isNaN(parsedSumGold) || parsedSumGold <= 0 || !user.value.jwcode) {
return {free: 0, permanent: 0, task: 0};
return { free: 0, permanent: 0, task: 0 };
}
const {nowFreeGold, nowPermanentGold, nowTaskGold} = user.value;
const { nowFreeGold, nowPermanentGold, nowTaskGold } = user.value;
let remaining = parsedSumGold;
let freeUsed = 0, permanentUsed = 0, taskUsed = 0;
@ -227,7 +223,7 @@ function calculateCoins(sumGold) {
addConsume.value.permanentGold = permanentUsed;
addConsume.value.taskGold = taskUsed;
return {free: freeUsed, permanent: permanentUsed, task: taskUsed};
return { free: freeUsed, permanent: permanentUsed, task: taskUsed };
}
//
@ -387,7 +383,7 @@ const getUser = async function (jwcode) {
if (addConsume.value.sumGold) {
const parsedSumGold = parseFloat(addConsume.value.sumGold);
if (!isNaN(parsedSumGold) && parsedSumGold > 0) {
const {free, permanent, task} = calculateCoins(parsedSumGold);
const { free, permanent, task } = calculateCoins(parsedSumGold);
addConsume.value.freeGold = free;
addConsume.value.permanentGold = permanent;
addConsume.value.taskGold = task;
@ -443,7 +439,7 @@ watch(
(newValue) => {
const parsedNewValue = parseFloat(newValue);
if (!isNaN(parsedNewValue) && parsedNewValue > 0) {
const {free, permanent, task} = calculateCoins(parsedNewValue);
const { free, permanent, task } = calculateCoins(parsedNewValue);
addConsume.value.freeGold = free;
addConsume.value.permanentGold = permanent;
addConsume.value.taskGold = task;
@ -467,128 +463,64 @@ onMounted(async function () {
</script>
<template>
<div>
<!-- 根据activeTab切换显示内容 -->
<!-- 新增消耗的布局---------------------------------------------------------- -->
<!-- <div v-if="activeTab === 'addConsume'"> -->
<!-- <div style="margin-bottom: 20px; font-weight: bolder">新增消费</div> -->
<el-form
:model="addConsume"
ref="Ref"
:rules="rules"
label-width="auto"
style="max-width: 750px;"
class="form-style"
>
<el-form-item prop="jwcode" label="精网号">
<el-input
v-model="addConsume.jwcode"
style="width: 220px"
/>
<el-button
type="primary"
@click="getUser(addConsume.jwcode)"
style="margin-left: 20px"
>查询
</el-button
>
<el-form :model="addConsume" ref="Ref" :rules="rules" style="max-width: 750px;">
<div style="width:25vw">
<el-form-item prop="jwcode" label="精网号" style="margin-top: 50px">
<el-input v-model="addConsume.jwcode" style="width: 10vw;margin-left:45px" />
<el-button type="primary" @click="getUser(addConsume.jwcode)" style="margin-left: 10px">查询
</el-button>
</el-form-item>
<div style="display: flex; align-items: center; gap: 20px;">
</div>
<div style="width:25vw">
<el-form-item prop="goodsName" label="商品名称" style="flex: 1; margin-right: 0px">
<el-select
v-model="addConsume.goodsName"
placeholder="请选择商品"
style="width: 450px"
>
<el-option
v-for="item in goods"
:key="item.value"
:label="item.label"
:value="item.value"
/>
<el-select v-model="addConsume.goodsName" placeholder="请选择商品" style="width: 10vw;margin-left:30px">
<el-option v-for="item in goods" :key="item.value" :label="item.label" :value="item.value" />
</el-select>
</el-form-item>
</div>
<div style="width:25vw">
<el-form-item prop="sumGold" label="消耗金币总数">
<el-input
v-model="addConsume.sumGold"
style="width: 100px"
@input="validateInput()"
@change="calculateCoins(addConsume.sumGold)"
/>
<el-input v-model="addConsume.sumGold" style="width: 10vw;margin-left:2px" @input="validateInput()"
@change="calculateCoins(addConsume.sumGold)" />
</el-form-item>
</div>
<!-- 三类金币自动计算禁用状态不可编辑 -->
<div style="display: flex; align-items: center">
<el-form-item prop="permanentGold" label="永久金币" style="float: left">
<el-input
v-model="addConsume.permanentGold"
disabled
style="width: 100px; margin-left: -5px"
>
<div style="width:25vw">
<el-form-item prop="permanentGold" label="永久金币">
<el-input v-model="addConsume.permanentGold" disabled style="width: 10vw;margin-left:40px">
<template #default="scope">{{ scope.row.permanentGold }}</template>
</el-input>
<p style="margin-right: 0px"></p>
<p style="margin-right: 0px">&nbsp;&nbsp;</p>
</el-form-item>
<el-form-item
prop="freeCoin"
label="免费金币"
style="float: left; margin-left: -20px"
>
<el-input
disabled
v-model="addConsume.freeGold"
style="width: 100px; margin-left: -5px"
/>
<p style="margin-right: 0px"></p>
</div>
<div style="width:25vw">
<el-form-item prop="freeCoin" label="免费金币">
<el-input disabled v-model="addConsume.freeGold" style="width: 10vw;margin-left:40px" />
<p style="margin-right: 0px">&nbsp;&nbsp;</p>
</el-form-item>
<el-form-item prop="taskGold" label="任务金币" style="margin-left: -20px">
<el-input
disabled
v-model="addConsume.taskGold"
style="width: 100px; margin-left: -5px"
/>
<p style="margin-right: 20px"></p>
</div>
<div style="width:25vw">
<el-form-item prop="taskGold" label="任务金币">
<el-input disabled v-model="addConsume.taskGold" style="width: 10vw;margin-left:40px" />
<p style="margin-right: 20px">&nbsp;&nbsp;</p>
</el-form-item>
</div>
<div style="width:25vw">
<el-form-item prop="remark" label="备注">
<el-input
v-model="addConsume.remark"
style="width: 300px"
:rows="2"
maxlength="100"
show-word-limit
type="textarea"
/>
<el-input v-model="addConsume.remark" style="width: 13.5vw;margin-left:70px" :rows="4" maxlength="100" show-word-limit
type="textarea" />
</el-form-item>
<el-button type="success" @click="resetForm()" style="margin-left: 280px">重置</el-button>
<el-button type="primary" @click="addBefore"> 提交</el-button>
</div>
<el-button type="success" @click="resetForm()" style="margin-left: 200px;margin-top:10px">重置</el-button>
<el-button type="primary" @click="addBefore" style="margin-top:10px"> 提交</el-button>
</el-form>
<!-- 客户信息栏 -->
<el-card v-if="user.jwcode" style="width: 800px; float: right" class="customer-info">
<el-form
:model="user"
label-width="auto"
style="max-width: 1000px"
label-position="left"
>
<el-form :model="user" label-width="auto" style="max-width: 1000px" label-position="left">
<el-text size="large" style="margin-left: 20px">客户信息</el-text>
<!-- 第一行姓名 + 历史金币 -->
@ -602,17 +534,15 @@ onMounted(async function () {
<el-form-item label="历史金币总数">
<!-- 检查 user.historySumGold 是否为有效的数字 -->
<p style="color: #2fa1ff; margin-right: 5px" v-if="!isNaN(Number(user.historySumGold))">
{{ Number(user.historySumGold ) }}
{{ Number(user.historySumGold) }}
</p>
<!-- 如果不是有效的数字显示默认值 -->
<p v-else></p>
</el-form-item>
<el-form-item style="margin-top: -23px">
<span
style="display: inline; white-space: nowrap; color: #b1b1b1"
v-if="user.historyPermanentGold !== undefined"
>(永久金币:{{ user.historyPermanentGold }};免费金币:{{
<span style="display: inline; white-space: nowrap; color: #b1b1b1"
v-if="user.historyPermanentGold !== undefined">(永久金币:{{ user.historyPermanentGold }};免费金币:{{
(user.historyFreeGold)
}};任务金币:{{ user.historyTaskGold }})</span>
</el-form-item>
@ -628,17 +558,13 @@ onMounted(async function () {
</el-col>
<el-col :span="14">
<el-form-item label="当前金币总数" style="width: 500px">
<span
style="color: #2fa1ff; margin-right: 5px"
v-if="user.nowSumGold !== undefined"
>{{ user.nowSumGold }}</span>
<span style="color: #2fa1ff; margin-right: 5px" v-if="user.nowSumGold !== undefined">{{ user.nowSumGold
}}</span>
</el-form-item>
<!-- 金币详情独立显示 -->
<el-form-item style="margin-top: -23px"> <!-- 负边距减少间距 -->
<span
style="color: #b1b1b1; margin-left: 0px"
v-if="user.nowPermanentGold !== undefined"
>(永久金币:{{ user.nowPermanentGold }};
<span style="color: #b1b1b1; margin-left: 0px" v-if="user.nowPermanentGold !== undefined">(永久金币:{{
user.nowPermanentGold }};
免费金币:{{ user.nowFreeGold }};
任务金币:{{ user.nowTaskGold }})</span>
</el-form-item>
@ -706,39 +632,4 @@ p {
</style>
<style>
.avatar-uploader .el-upload {
border: 1px dashed var(--el-border-color);
border-radius: 6px;
cursor: pointer;
position: relative;
overflow: hidden;
transition: var(--el-transition-duration-fast);
}
.avatar-uploader .el-upload:hover {
border-color: var(--el-color-primary);
}
.el-icon.avatar-uploader-icon {
font-size: 28px;
color: #8c939d;
width: 50px;
height: 50px;
text-align: center;
}
.form-style {
margin-top: 50px;
max-width: 50%;
float: left;
}
.form-style2 {
max-width: 60%;
}
p {
font-size: 13px;
transform: scale(1);
}
</style>

236
src/views/managerecharge/rate.vue

@ -1,43 +1,22 @@
<script setup>
import {onMounted, reactive, ref} from 'vue'
import {ElMessage, ElMessageBox} from 'element-plus'
import { onMounted, reactive, ref } from 'vue'
import { ElMessage, ElMessageBox } from 'element-plus'
import request from '@/util/http'
import {useAdminStore} from "@/store/index.js";
import {storeToRefs} from "pinia";
import {findMenuById, permissionMapping} from "@/utils/menuTreePermission.js"
/*
====================工具方法=========================
*/
import { useAdminStore } from "@/store/index.js";
import { storeToRefs } from "pinia";
import { findMenuById, permissionMapping } from "@/utils/menuTreePermission.js"
const adminStore = useAdminStore()
const { adminData, menuTree } = storeToRefs(adminStore)
/*
====================数据===================================
*/
//
const adminData = ref({
id: '',
adminName: ''
})
//
const regeEdit = ref(false)
// (id )
const editFormRef = ref(null)
//
const tableData = ref([])
//
const getObj = ref({
pageNum: 1,
pageSize: 10
})
const total = ref(0)
//
const rateEdit = ref({
id: null,
rateName: '',
@ -96,41 +75,12 @@ const checkFreeGoldRadio = function (rule, value, callback) {
}
//
const rules = reactive({
// rateName: [{required: true, message: '', trigger: 'blur'}],
num: [{validator: checkFreeGoldRadio, trigger: 'blur'}],
num: [{ validator: checkFreeGoldRadio, trigger: 'blur' }],
})
//
const formSize = ref('default')
/*
====================方法=========================
*/
//
const getAdminData = async function () {
try {
const result = await request({
url: '/admin/userinfo',
data: {}
})
adminData.value = result
rateEdit.value.adminId = adminData.value.id
console.log('请求成功', result)
} catch (error) {
console.log('请求失败', error)
}
}
//
const getAllRate = async function (val) {
try {
//
if (typeof val === 'number') {
getObj.value.pageNum = val;
}
// POST
const result = await request({
url: '/rate/selectAll',
method: 'POST',
@ -138,87 +88,60 @@ const getAllRate = async function (val) {
pageNum: getObj.value.pageNum,
pageSize: getObj.value.pageSize,
}
});
//
console.log('这是汇率列表 请求成功', result);
//
tableData.value = result.data.list;
//
total.value = result.data.total;
})
console.log('这是汇率列表 请求成功', result)
tableData.value = result.data.list
total.value = result.data.total
} catch (error) {
console.log('请求失败', error);
ElMessage.error('请求失败');
}
}
//
const handlePageSizeChange = function (val) {
getObj.value.pageSize = val
getAllRate()
}
//
const handleCurrentChange = function (val) {
getObj.value.pageNum = val
getAllRate()
}
//id
const getEditData = async function (row) {
try {
console.log('搜索参数', getObj.value)
// POST
const result = await request({
url: '/rate/selectById',
data: {id: row.id}
data: { id: row.id }
})
//
console.log('根据id查 请求成功', result)
//
// rateEdit.value = result.data
//
rateEdit.value.id = row.id
rateEdit.value.rateName = row.rateName
rateEdit.value.num = row.num
console.log('根据id获取的数据', rateEdit.value)
rateEdit.value.adminId = adminData.value.id
} catch (error) {
console.log('请求失败', error)
}
}
const adminStore = useAdminStore();
const {menuTree} = storeToRefs(adminStore);
//
const editRate = async function () {
if (findMenuById(menuTree.value, permissionMapping.Exchange_Rate_Modification)) {
//
rateEdit.value.num = parseFloat(rateEdit.value.num);
try {
console.log('搜索参数', rateEdit.value)
// POST
const result = await request({
url: '/rate/update',
data: rateEdit.value
})
//
console.log('请求成功', result)
await getAllRate()
} catch (error) {
console.log('请求失败', error)
}
}else {
} else {
ElMessage.error('没有权限')
}
}
//
const edit = () => {
editFormRef.value.validate(async (valid) => {
@ -236,24 +159,18 @@ const edit = () => {
ElMessage({
type: "error",
message: "请检查输入内容",
});
})
}
});
};
//
})
}
const cancelEdit = () => {
regeEdit.value = false
}
//
const handleEditDialogClose = () => {
if (editFormRef.value) {
getAllRate()
}
}
//
function formatDate(value) {
if (!value) return ''
@ -266,8 +183,6 @@ function formatDate(value) {
const seconds = date.getSeconds().toString().padStart(2, '0')
return `${year}-${month}-${day} ${hours}:${minutes}:${seconds}`
}
//
function handleInput(value) {
// 使
@ -275,22 +190,18 @@ function handleInput(value) {
ElMessage.warning('请输入正确的符号');
// value = value.replace('', '.');
}
//
const parts = value.split('.');
if (parts.length > 2) {
value = parts[0] + '.' + parts.slice(1).join('');
ElMessage.warning('只能包含一个小数点');
}
//
if (value.startsWith('-')) {
ElMessage.warning('不允许输入负数');
value = value.substring(1);
}
//
//
if (value.includes('.')) {
const parts = value.split('.')
//
@ -313,7 +224,6 @@ function handleInput(value) {
ElMessage.info('整数部分最多允许六位')
}
}
// 0
if (value.startsWith('.')) {
value = '0' + value;
@ -321,53 +231,29 @@ function handleInput(value) {
// ElMessage.info('0');
}
//
rateEdit.value.num = value;
rateEdit.value.num = value
return value;
return value
}
/*
====================监听=========================
*/
/*
====================挂载=========================
*/
//
onMounted(async function () {
await getAllRate()
await getAdminData()
})
</script>
<template>
<!-- 这是主页面 -->
<el-row>
<el-col>
<el-card class="box-card" style="max-width: 100%">
<!-- 表格 -->
<div>
<el-table
:data="tableData"
v-if="(tableData.flag = 1)"
>
<el-table-column
type="index"
label="序号"
width="100px"
fixed="left"
>
<el-table :data="tableData" v-if="(tableData.flag = 1)">
<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 prop="rateName" label="货币名称" :span="2"/>
<el-table-column prop="rateName" label="货币名称" :span="2" />
<el-table-column prop="num" label="汇率" :span="2">
<template #default="scope">
<p>
@ -383,17 +269,12 @@ onMounted(async function () {
</el-table-column>
<el-table-column label="操作" :span="3">
<template #default="scope">
<el-button
type="text"
@click="
() => {
<el-button type="text" @click=" () => {
regeEdit = true
getEditData(scope.row)
}
"
>编辑
</el-button
>
">编辑
</el-button>
</template>
</el-table-column>
</el-table>
@ -401,54 +282,25 @@ onMounted(async function () {
<!-- 分页 -->
<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>
<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>
</el-card>
</el-col>
</el-row>
<!-- 这是编辑弹窗 -->
<el-dialog
v-model="regeEdit"
title="修改汇率"
width="500"
:close-on-click-modal="false"
@close="handleEditDialogClose"
>
<el-dialog v-model="regeEdit" title="修改汇率" width="500" :close-on-click-modal="false" @close="handleEditDialogClose">
<template #footer>
<el-form
ref="editFormRef"
style="max-width: 600px"
:model="rateEdit"
:rules="rules"
label-width="auto"
class="demo-ruleForm"
:size="formSize"
status-icon
>
<el-form ref="editFormRef" style="max-width: 600px" :model="rateEdit" :rules="rules" label-width="auto"
class="demo-ruleForm" :size="formSize" status-icon>
<el-form-item prop="rateName" label="货币名称:">
<el-input
v-model="rateEdit.rateName"
disabled
style="width: 240px"
/>
<el-input v-model="rateEdit.rateName" disabled style="width: 240px" />
</el-form-item>
<el-form-item prop="num" label="汇率:">
<el-input
v-model="rateEdit.num"
@update:modelValue="handleInput"
style="width: 120px"
/>
<el-input v-model="rateEdit.num" @update:modelValue="handleInput" style="width: 120px" />
<span class="unit">:1</span>
<span class="rate-tip">
(提示当前规则每
@ -479,30 +331,10 @@ onMounted(async function () {
margin-top: 20px;
}
.button-item {
margin-left: 10px;
}
.add-item {
margin-bottom: 10px;
}
.unit {
margin-left: 10px;
}
.el-card {
padding: 0px;
}
.pagination {
display: flex;
}
.status {
display: flex;
}
.rate-tip {
hyphens: auto;
}

2
src/views/permissions/rolePermission.vue

@ -774,7 +774,7 @@ onMounted(async function () {
</el-select>
</el-form-item>
<el-form-item prop="market" label="所属地区:" required>
<el-select v-model="addRole.market" placeholder="请选择所属地区" style="width: 240px" clearable @change="handleMarketChange" >
<el-select v-model="addRole.market" placeholder="请选择所属地区" style="width: 220px" clearable @change="handleMarketChange" >
<el-option v-for="item in addRoleMarket" :key="item" :label="item" :value="item"/>
</el-select>
</el-form-item>

8
src/views/permissions/userPermission.vue

@ -1050,9 +1050,9 @@ onMounted(async function () {
<el-form-item prop="machineIds" label="机器码:" required>
<div style="display: flex; align-items: center; flex-wrap: wrap; gap: 10px;">
<!-- 动态添加的机器码输入框 -->
<div v-for="(item, index) in addAdmin.machineIds" :key="index" style="margin-left: 10px;">
<div v-for="(item, index) in addAdmin.machineIds" :key="index">
<el-input v-model="addAdmin.machineIds[index]" placeholder="请输入机器码"
style="width: 180px; margin-right: 10px;"/>
style="width: 220px; margin-right: 10px;"/>
</div>
<el-button type="primary" @click="addMachineIdInput">添加</el-button>
</div>
@ -1127,9 +1127,9 @@ onMounted(async function () {
<el-form-item prop="machineIds" label="机器码:">
<div style="display: flex; align-items: center; flex-wrap: wrap; gap: 10px;">
<!-- 动态添加的机器码输入框 -->
<div v-for="(item, index) in permissionEditObj.machineIds" :key="index" style="margin-left: 10px;">
<div v-for="(item, index) in permissionEditObj.machineIds" :key="index">
<el-input v-model="permissionEditObj.machineIds[index]" placeholder=""
style="width: 180px; margin-right: 10px;"/>
style="width: 220px; margin-right: 10px;"/>
</div>
<el-button type="primary" @click="UseraddMachineIdInput">添加</el-button>
</div>

168
src/views/refund/gold/addCoinRefund.vue

@ -1,11 +1,10 @@
<script setup>
import {onMounted, reactive} from 'vue'
import {ref, computed, watch} from 'vue'
import {ElMessage} from 'element-plus'
import {Plus} from '@element-plus/icons-vue'
import { onMounted, reactive } from 'vue'
import { ref, computed, watch } from 'vue'
import { ElMessage } from 'element-plus'
import { Plus } from '@element-plus/icons-vue'
import axios from 'axios'
import {ElMessageBox} from 'element-plus'
import { ElMessageBox } from 'element-plus'
import API from '@/util/http.js'
import moment from 'moment'
// import _ from 'lodash'
@ -19,7 +18,7 @@ const addRe = ref({
const adminData = ref({})
const getAdminData = async function () {
try {
const result = await API({url: '/admin/userinfo', data: {}})
const result = await API({ url: '/admin/userinfo', data: {} })
adminData.value = result
addRefund.value.adminId = adminData.value.id
console.log('请求成功', result)
@ -153,16 +152,16 @@ const validateJwCode = (rule, value, callback) => {
callback();
};
const rules = reactive({
jwcode: [{required: true, validator: validateJwCode, trigger: 'blur'}],
refundType: [{required: true, message: '请选择退款类型', trigger: 'blur'}],
goodsName: [{required: true, message: '请选择退款商品', trigger: 'blur'}],
taskGold: [{required: true, message: '请输入任务金币', trigger: 'blur'}],
freeGold: [{required: true, message: '请输入免费金币', trigger: 'blur'}],
jwcode: [{ required: true, validator: validateJwCode, trigger: 'blur' }],
refundType: [{ required: true, message: '请选择退款类型', trigger: 'blur' }],
goodsName: [{ required: true, message: '请选择退款商品', trigger: 'blur' }],
taskGold: [{ required: true, message: '请输入任务金币', trigger: 'blur' }],
freeGold: [{ required: true, message: '请输入免费金币', trigger: 'blur' }],
permanentGold: [
{required: true, message: '请输入永久金币', trigger: 'blur'}
{ required: true, message: '请输入永久金币', trigger: 'blur' }
],
sumGold: [
{required: true, message: '请选择付款方式', trigger: 'blur'},
{ required: true, message: '请选择付款方式', trigger: 'blur' },
{
validator: (rule, value) => {
if (value === 0) {
@ -249,7 +248,7 @@ const getUser = async function (jwcode) {
// 退退
const refundType = ref([{value: '商品退款', label: '商品退款'}]);
const refundType = ref([{ value: '商品退款', label: '商品退款' }]);
// 退
// const getRefundTypes = async function () {
@ -441,56 +440,20 @@ onMounted(async function () {
<template>
<div>
<el-form
:model="addRefund"
ref="Ref"
:rules="rules"
label-width="auto"
style="max-width: 750px"
class="form-style"
>
<el-form :model="addRefund" ref="Ref" :rules="rules" label-width="auto" style="max-width: 750px" class="form-style">
<el-form-item prop="jwcode" label="精网号">
<el-input
v-model="addRefund.jwcode"
style="width: 220px"
@change="getGoods(addRefund.jwcode)"
/>
<el-button
type="primary"
@click="getUser(addRefund.jwcode)"
style="margin-left: 20px"
>查询
</el-button
>
<el-input v-model="addRefund.jwcode" style="width: 220px" @change="getGoods(addRefund.jwcode)" />
<el-button type="primary" @click="getUser(addRefund.jwcode)" style="margin-left: 20px">查询
</el-button>
</el-form-item>
<el-form-item prop="refundType" label="退款类型">
<el-select
v-model="addRefund.refundType"
placeholder="请选择"
style="width: 300px"
>
<el-option
v-for="item in refundType"
:key="item.value"
:label="item.label"
:value="item.value"
/>
<el-select v-model="addRefund.refundType" placeholder="请选择" style="width: 220px">
<el-option v-for="item in refundType" :key="item.value" :label="item.label" :value="item.value" />
</el-select>
</el-form-item>
<el-form-item prop="goodsName" label="商品名">
<el-select
v-model="addRefund.goodsName"
placeholder="请选择"
style="width: 300px"
@change="handleSelectionChange"
>
<el-option
v-for="item in goodsName"
:key="item.key"
:label="item.label"
:value="item"
/>
<el-select v-model="addRefund.goodsName" placeholder="请选择" style="width: 220px" @change="handleSelectionChange">
<el-option v-for="item in goodsName" :key="item.key" :label="item.label" :value="item" />
</el-select>
</el-form-item>
@ -501,70 +464,47 @@ onMounted(async function () {
</el-radio-group>
</el-form-item>
<div style="display: flex; align-items: center">
<el-form-item prop="permanentGold" label="永久金币" style="float: left">
<el-input
v-model="addRefund.permanentGold"
style="width: 100px"
:disabled="addRe.typeR === '0' ? true : false"
@input="handlePermanentGoldInput($event)"
type="number"
>
</el-input>
<p></p>
<el-form-item prop="permanentGold" label="永久金币">
<el-input v-model="addRefund.permanentGold" style="width: 220px"
:disabled="addRe.typeR === '0' ? true : false" @input="handlePermanentGoldInput($event)" type="number">
</el-input>&nbsp;&nbsp;
</el-form-item>
<el-form-item
prop="freeGold"
label="免费金币"
style="margin-left: -20px; float: left"
>
<el-input
v-model="addRefund.freeGold"
style="float: left; width: 100px"
:disabled="addRe.typeR === '0' ? true : false"
@input="handleFreeGoldInput($event)"
type="number"
/>
<p></p>
<el-form-item prop="freeGold" label="免费金币">
<el-input v-model="addRefund.freeGold" style="float: left; width: 220px"
:disabled="addRe.typeR === '0' ? true : false" @input="handleFreeGoldInput($event)" type="number" />
&nbsp;&nbsp;
</el-form-item>
<el-form-item prop="taskGold" label="任务金币" style="margin-left: -20px">
<el-input
v-model="addRefund.taskGold"
style="float: left; width: 100px"
:disabled="addRe.typeR === '0' ? true : false"
@input="handleTaskGoldInput($event)"
type="number"
/>
<p></p>
<div>
<el-form-item prop="taskGold" label="任务金币">
<el-input v-model="addRefund.taskGold" style="float: left; width: 220px"
:disabled="addRe.typeR === '0' ? true : false" @input="handleTaskGoldInput($event)" type="number" />
&nbsp;&nbsp;
</el-form-item>
</div>
<div>
<el-form-item prop="sumGold" label="退款金币总数">
<el-input disabled v-model="addRefund.sumGold" style="width: 100px">
<el-input disabled v-model="addRefund.sumGold" style="width: 220px">
</el-input>
</el-form-item>
</div>
<div>
<el-form-item prop="remark" label="备注">
<el-input
v-model="addRefund.remark"
style="width: 300px"
:rows="2"
maxlength="100"
show-word-limit
type="textarea"
/>
<el-input v-model="addRefund.remark" style="width: 220px" :rows="3" maxlength="100" show-word-limit
type="textarea" />
</el-form-item>
</div>
<el-button type="success" @click="cancel()" style="margin-left: 280px">重置</el-button>
<el-button type="success" @click="cancel()" style="margin-left: 200px">重置</el-button>
<el-button type="primary" @click="addBefore"> 提交</el-button>
</el-form>
<!-- 客户信息栏 -->
<el-card v-if="user.jwcode" style="width: 800px; float: right" class="customer-info">
<el-form
:model="user"
label-width="auto"
style="max-width: 1000px"
label-position="left"
>
<el-form :model="user" label-width="auto" style="max-width: 1000px" label-position="left">
<el-text size="large" style="margin-left: 20px">客户信息</el-text>
<!-- 第一行姓名 + 历史金币 -->
@ -592,17 +532,13 @@ onMounted(async function () {
</el-col>
<el-col :span="14">
<el-form-item label="当前金币总数" style="width: 500px">
<span
style="color: #2fa1ff; margin-right: 5px"
v-if="user.nowSumGold !== undefined"
>{{ user.nowSumGold }}</span>
<span style="color: #2fa1ff; margin-right: 5px" v-if="user.nowSumGold !== undefined">{{ user.nowSumGold
}}</span>
</el-form-item>
<!-- 金币详情独立显示 -->
<el-form-item style="margin-top: -23px"> <!-- 负边距减少间距 -->
<span
style="color: #b1b1b1; margin-left: 0px"
v-if="user.nowPermanentGold !== undefined"
>(永久金币:{{ user.nowPermanentGold }};
<span style="color: #b1b1b1; margin-left: 0px" v-if="user.nowPermanentGold !== undefined">(永久金币:{{
user.nowPermanentGold }};
免费金币:{{ user.nowFreeGold }};
任务金币:{{ user.nowTaskGold }})</span>
</el-form-item>

132
src/views/workspace/index.vue

@ -1,7 +1,7 @@
<template>
<el-row>
<!-- 数据总览卡片 -->
<el-col :span="4" style="padding-right: 10px;"> <!-- 适当留白避免拥挤 -->
<el-col :span="4" style="padding-right: 10px;">
<el-card class="center-card margin-bottom">数据总览</el-card>
</el-col>
<!-- 最后更新时间 -->
@ -10,10 +10,6 @@
workDataUpdateTime && workDataUpdateTime !== '1970-01-01 08:00:00' ? workDataUpdateTime : '该地区暂无数据'
}}
</el-col>
<!-- 剩余栅格空间可选用于占满一行 -->
<el-col :span="18"></el-col>
</el-row>
<el-row :gutter="10">
@ -24,22 +20,20 @@
<div class="card-header">
<div class="card-title">当前金币余量</div>
<div>{{ currentGold / 100 }}&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;较前一日
{{
dailyChange / 100
}}
{{ dailyChange / 100 }}
<template v-if="dailyChange > 0">
<el-icon style="color:red">
<ArrowUpBold/>
<ArrowUpBold />
</el-icon>
</template>
<template v-else-if="dailyChange < 0">
<el-icon style="color:forestgreen">
<ArrowDownBold/>
<ArrowDownBold />
</el-icon>
</template>
<template v-else>
<el-icon style="color:grey">
<SemiSelect/>
<SemiSelect />
</el-icon>
</template>
</div>
@ -48,10 +42,8 @@
<div>
<div class="margin-bottom">永久金币{{ currentPermanent / 100 }}</div>
<div class="margin-bottom">免费金币{{ currentFree / 100 }}</div>
<div class="margin-bottom">[六月到期|{{ currentFreeJune / 100 }}]&nbsp;&nbsp;&nbsp;&nbsp;[十二月到期|{{
currentFreeDecember /
100
}}]
<div class="margin-bottom">[六月到期|{{ currentFreeJune / 100 }}]&nbsp;&nbsp;&nbsp;&nbsp;
[十二月到期|{{ currentFreeDecember / 100 }}]
</div>
<div>任务金币{{ currentTask / 100 }}</div>
</div>
@ -97,34 +89,34 @@
<el-col class="center-card">周同比:{{ sumWow }}%&nbsp;&nbsp;&nbsp;&nbsp;
<template v-if="sumWow > 0">
<el-icon style="color:red">
<ArrowUpBold/>
<ArrowUpBold />
</el-icon>
</template>
<template v-else-if="sumWow < 0">
<el-icon style="color:forestgreen">
<ArrowDownBold/>
<ArrowDownBold />
</el-icon>
</template>
<template v-else>
<el-icon style="color:grey">
<SemiSelect/>
<SemiSelect />
</el-icon>
</template>
</el-col>
<el-col class="center-card">日环比:{{ sumDaily }}%&nbsp;&nbsp;&nbsp;&nbsp;
<template v-if="sumDaily > 0">
<el-icon style="color:red">
<ArrowUpBold/>
<ArrowUpBold />
</el-icon>
</template>
<template v-else-if="sumDaily < 0">
<el-icon style="color:forestgreen">
<ArrowDownBold/>
<ArrowDownBold />
</el-icon>
</template>
<template v-else>
<el-icon style="color:grey">
<SemiSelect/>
<SemiSelect />
</el-icon>
</template>
</el-col>
@ -136,56 +128,42 @@
</el-col>
</el-row>
<el-row :gutter="10" style="margin-top: 20px">
<el-col :span="24">
<el-card style="width: 100%">
<el-row style="margin-top: 20px">
<el-card>
<el-row>
<el-col :span="21">
<el-col>
<el-tabs v-model="activeTab" @tab-change="handleTabChange">
<el-tab-pane label="金币充值" name="recharge"></el-tab-pane>
<el-tab-pane label="金币消费" name="consume"></el-tab-pane>
</el-tabs>
</el-col>
<el-col :span="24">
<el-row>
<div style="margin-top:5px">合计&nbsp;
永久金币 {{
activeTab === 'recharge' ? sumRechargePermanent / 100 : sumConsumePermanent / 100
}}
免费金币 {{
activeTab === 'recharge' ? sumRechargeFree / 100 : sumConsumeFree / 100
}}
任务金币 {{
activeTab === 'recharge' ? sumRechargeTask / 100 : sumConsumeTask / 100
}}
<div style="margin-top:5px;width:40vw">合计&nbsp;
永久金币 {{ activeTab === 'recharge' ? sumRechargePermanent / 100 : sumConsumePermanent / 100 }}&nbsp;&nbsp;
免费金币 {{ activeTab === 'recharge' ? sumRechargeFree / 100 : sumConsumeFree / 100 }}&nbsp;&nbsp;
任务金币 {{ activeTab === 'recharge' ? sumRechargeTask / 100 : sumConsumeTask / 100 }}
</div>
<div @change="handleDatePickerChange">
<el-button @click="getToday()" label="day" style="margin-left:250px"
:type="activeTimeRange === 'today' ? 'primary' : ''">今日
<div @change="handleDatePickerChange" style="width:15vw">
<el-button @click="getToday()" :type="activeTimeRange === 'today' ? 'primary' : ''">今日
</el-button>
<el-button @click="getWeek()" label="week" :type="activeTimeRange === 'week' ? 'primary' : ''">本周
<el-button @click="getWeek()" :type="activeTimeRange === 'week' ? 'primary' : ''">本周
</el-button>
<el-button @click="getMonth()" label="month" :type="activeTimeRange === 'month' ? 'primary' : ''">本月
<el-button @click="getMonth()" :type="activeTimeRange === 'month' ? 'primary' : ''">本月
</el-button>
<el-button @click="getYear()" label="year" :type="activeTimeRange === 'year' ? 'primary' : ''">本年
<el-button @click="getYear()" :type="activeTimeRange === 'year' ? 'primary' : ''">本年
</el-button>
</div>
<div style="width:25vw">
<el-date-picker v-model="dateRange" type="datetimerange" range-separator="" start-placeholder="开始时间"
end-placeholder="结束时间" style="margin-left:10px" format="YYYY-MM-DD HH:mm:ss"
value-format="YYYY-MM-DD HH:mm:ss"/>
end-placeholder="结束时间" format="YYYY-MM-DD HH:mm:ss" style="width:20vw"
value-format="YYYY-MM-DD HH:mm:ss" />
<el-button type="primary" style="margin-left: 5px" @click="getChartData">查询</el-button>
</div>
</el-row>
</el-col>
</el-row>
<el-row :gutter="20" style="margin-top: 20px">
<el-col :span="18">
<div class="bar">
<!-- <div v-if="chartLoading" class="loading-overlay">-->
<!-- <div class="loading-spinner"></div>-->
<!-- </div>-->
<div ref="chartRef" style="width: 100%; height: 400px"></div>
</div>
</el-col>
@ -215,21 +193,20 @@
</el-col>
</el-row>
</el-card>
</el-col>
</el-row>
</template>
<script setup>
import * as echarts from 'echarts'
import {ref, onMounted, nextTick, watch, onUnmounted} from 'vue'
import { ref, onMounted, nextTick, watch, onUnmounted } from 'vue'
import API from '@/util/http'
import {ElMessage} from 'element-plus'
import { ElMessage } from 'element-plus'
import dayjs from 'dayjs';
import utc from 'dayjs-plugin-utc'
dayjs.extend(utc)
import {ArrowUpBold, ArrowDownBold, SemiSelect} from '@element-plus/icons-vue'
import {marketMapping} from "@/utils/marketMap.js";
import { ArrowUpBold, ArrowDownBold, SemiSelect } from '@element-plus/icons-vue'
import { marketMapping } from "@/utils/marketMap.js";
//
@ -320,7 +297,7 @@ const formatDate = function (date) {
const getToday = function () {
const today = dayjs()
const startTime = today.startOf('day').format('YYYY-MM-DD HH:mm:ss')
const endTime =today.endOf('day').format('YYYY-MM-DD HH:mm:ss')
const endTime = today.endOf('day').format('YYYY-MM-DD HH:mm:ss')
// const endTime = today.add(1, 'day').startOf('day').format('YYYY-MM-DD HH:mm:ss')
dateRange.value = [startTime, endTime]
console.log('看看dateRange', dateRange.value)
@ -628,7 +605,7 @@ const updateChart = (chartData) => {
type: 'bar',
stack: 'recharge',
data: chartData.rechargePermanent,
itemStyle: {color: '#5470c6'},
itemStyle: { color: '#5470c6' },
barWidth: 30
},
{
@ -636,7 +613,7 @@ const updateChart = (chartData) => {
type: 'bar',
stack: 'recharge',
data: chartData.rechargeFree,
itemStyle: {color: '#91cc75'},
itemStyle: { color: '#91cc75' },
barWidth: 30
},
{
@ -644,7 +621,7 @@ const updateChart = (chartData) => {
type: 'bar',
stack: 'recharge',
data: chartData.rechargeTask,
itemStyle: {color: '#fac858'},
itemStyle: { color: '#fac858' },
barWidth: 30
}
]
@ -656,7 +633,7 @@ const updateChart = (chartData) => {
type: 'bar',
stack: 'consume',
data: chartData.consumePermanent,
itemStyle: {color: '#5470c6'},
itemStyle: { color: '#5470c6' },
barWidth: 30
},
{
@ -664,7 +641,7 @@ const updateChart = (chartData) => {
type: 'bar',
stack: 'consume',
data: chartData.consumeFree,
itemStyle: {color: '#91cc75'},
itemStyle: { color: '#91cc75' },
barWidth: 30
},
{
@ -672,7 +649,7 @@ const updateChart = (chartData) => {
type: 'bar',
stack: 'consume',
data: chartData.consumeTask,
itemStyle: {color: '#fac858'},
itemStyle: { color: '#fac858' },
barWidth: 30
}
]
@ -753,7 +730,7 @@ const handleTabChange = () => {
const getAdminData = async function () {
try {
const result = await API({url: '/admin/userinfo', data: {}})
const result = await API({ url: '/admin/userinfo', data: {} })
adminData.value = result
console.log('用户信息', adminData.value)
} catch (error) {
@ -763,7 +740,7 @@ const getAdminData = async function () {
//
const getCardData = async () => {
try {
const response = await API({url: '/workbench/getCard', data: {}})
const response = await API({ url: '/workbench/getCard', data: {} })
workDataUpdateTime.value = response.updateTime
//
sumWow.value = response.sumWow.toFixed(2)
@ -848,29 +825,6 @@ onUnmounted(() => {
box-shadow: 0 2px 8px rgba(0, 0, 0, 0.1);
}
/* 添加加载动画 */
.loading-overlay {
position: absolute;
top: 0;
left: 0;
right: 0;
bottom: 0;
background: rgba(255, 255, 255, 0.8);
display: flex;
justify-content: center;
align-items: center;
z-index: 10;
}
.loading-spinner {
width: 40px;
height: 40px;
border: 4px solid #f3f3f3;
border-top: 4px solid #3498db;
border-radius: 50%;
animation: spin 1s linear infinite;
}
@keyframes spin {
0% {
transform: rotate(0deg);

2
stats.html
File diff suppressed because it is too large
View File

Loading…
Cancel
Save