7 Commits

  1. 37
      src/main.ts
  2. 17
      src/router/index.js
  3. 14
      src/util/request.js
  4. 14
      src/views/consume/bean/addBeanConsume.vue
  5. 14
      src/views/recharge/addBeanRecharge.vue
  6. 34
      src/views/recharge/gold/addCoinRecharge.vue
  7. 8
      src/views/usergold/gold/clientCountBalance.vue
  8. 8
      src/views/usergold/gold/clientCountDetail.vue
  9. 17
      src/views/usergold/userbean.vue
  10. 3
      stats.html

37
src/main.ts

@ -12,27 +12,32 @@ import VxeUI from 'vxe-pc-ui'
import 'vxe-pc-ui/lib/style.css' import 'vxe-pc-ui/lib/style.css'
import VxeUITable from 'vxe-table' import VxeUITable from 'vxe-table'
import 'vxe-table/lib/style.css' import 'vxe-table/lib/style.css'
const a = createApp(App)
import { useAdminStore } from '../src/store'
// 修正导入路径
import { useAdminStore } from './store'
import request from "@/util/request";
const app = createApp(App)
const pinia = createPinia()
// 全局注册 ElementPlus 图标 // 全局注册 ElementPlus 图标
for (const [key, component] of Object.entries(ElementPlusIconsVue)) { for (const [key, component] of Object.entries(ElementPlusIconsVue)) {
a.component(key, component)
app.component(key, component)
} }
const pinia = createPinia()
// 使用 ElementPlus 和路由器
a.use(ElementPlus, {
locale: zhCn
// 先注册组件再挂载
app.component('downloadExcel', JsonExcel)
app.config.globalProperties.$http = request
// 使用各种插件
app.use(ElementPlus, {
locale: zhCn
}) })
.use(router)
.use(VxeUI)
.use(VxeUITable)
.use(pinia)
.mount('#app')
.use(router)
.use(VxeUI)
.use(VxeUITable)
.use(pinia)
.mount('#app')
// 恢复localStorage数据
// 在 app 挂载之后再使用 store
const adminStore = useAdminStore() const adminStore = useAdminStore()
adminStore.initFromLocalStorage() adminStore.initFromLocalStorage()
// 注册 JsonExcel 组件
a.component('downloadExcel', JsonExcel)

17
src/router/index.js

@ -287,23 +287,6 @@ const router = createRouter({
routes routes
}); });
// 全局拦截器:token过期处理
axios.interceptors.response.use(
response => response,
error => {
if (error.response && error.response.status === 401) {
localStorage.removeItem('token');
router.push({
name: 'login',
query: {
machineId: localStorage.getItem('machineId'),
expired: true
}
});
}
return Promise.reject(error);
}
);
// 工具函数:从菜单树提取所有权限ID // 工具函数:从菜单树提取所有权限ID
const getAllPermissionIds = (menuTree) => { const getAllPermissionIds = (menuTree) => {

14
src/util/request.js

@ -44,13 +44,13 @@ service.interceptors.response.use(
return response return response
}, },
error => { error => {
// const { response } = error
// if (response && response.status === 401) {
// const machineId = localStorage.getItem('machineId')
// localStorage.removeItem('token')
// window.location.href = `/login?machineId=${machineId}`
// return Promise.resolve({ needsLogin: true })
// }
const { response } = error
if (response && response.status === 401) {
const machineId = localStorage.getItem('machineId')
localStorage.removeItem('token')
window.location.href = `#/login?machineId=${machineId}`
return Promise.resolve({ needsLogin: true })
}
return Promise.reject(error) return Promise.reject(error)
} }
) )

14
src/views/consume/bean/addBeanConsume.vue

@ -71,9 +71,12 @@ const rules = reactive({
}, trigger: 'blur' }, trigger: 'blur'
}], }],
permanentBean: [ permanentBean: [
{ required: true, message: '请输入付费金豆数', trigger: 'blur' },
{ required: true, message: '请输入付费金豆数', trigger: 'change' },
{ {
validator: (rule, value, callback) => { validator: (rule, value, callback) => {
if(!value){
value = 0
}
// //
if (!/^\d+$/.test(value)) { if (!/^\d+$/.test(value)) {
callback(new Error('请输入非负整数')); callback(new Error('请输入非负整数'));
@ -92,9 +95,12 @@ const rules = reactive({
} }
], ],
freeBean: [ freeBean: [
{ required: true, message: '请输入免费金豆数', trigger: 'blur' },
{ required: true, message: '请输入免费金豆数', trigger: 'change' },
{ {
validator: (rule, value, callback) => { validator: (rule, value, callback) => {
if(!value){
value = 0
}
// //
if (!/^\d+$/.test(value)) { if (!/^\d+$/.test(value)) {
callback(new Error('请输入非负整数')); callback(new Error('请输入非负整数'));
@ -211,10 +217,10 @@ const throttledHandleConsumeFormt = _.throttle(handleConsumeForm, 5000, {
<el-button type="primary" @click="getUser(consumeForm.jwcode)" style="margin-left: 20px">查询</el-button> <el-button type="primary" @click="getUser(consumeForm.jwcode)" style="margin-left: 20px">查询</el-button>
</el-form-item> </el-form-item>
<el-form-item prop="permanentBean" label="付费金豆" label-position="left"> <el-form-item prop="permanentBean" label="付费金豆" label-position="left">
<el-input v-model="consumeForm.permanentBean" placeholder="不填默认为0" style="width: 100px" />
<el-input v-model="consumeForm.permanentBean" placeholder="0" style="width: 100px" />
</el-form-item> </el-form-item>
<el-form-item prop="freeBean" label="免费金豆" label-position="left"> <el-form-item prop="freeBean" label="免费金豆" label-position="left">
<el-input v-model="consumeForm.freeBean" placeholder="不填默认为0" style="width: 100px" />
<el-input v-model="consumeForm.freeBean" placeholder="0" style="width: 100px" />
</el-form-item> </el-form-item>
<el-form-item prop="remark" label="备注" label-position="left"> <el-form-item prop="remark" label="备注" label-position="left">
<el-input v-model="consumeForm.remark" style="width: 300px" :rows="5" maxlength="100" show-word-limit <el-input v-model="consumeForm.remark" style="width: 300px" :rows="5" maxlength="100" show-word-limit

14
src/views/recharge/addBeanRecharge.vue

@ -70,9 +70,12 @@ const rules = reactive({
}, trigger: 'blur' }, trigger: 'blur'
}], }],
permanentBean: [ permanentBean: [
{ required: true, message: '请输入付费金豆数', trigger: 'blur' },
{ required: true, message: '请输入付费金豆数', trigger: 'change' },
{ {
validator: (rule, value, callback) => { validator: (rule, value, callback) => {
if(!value){
value = 0
}
// //
if (!/^\d+$/.test(value)) { if (!/^\d+$/.test(value)) {
callback(new Error('请输入非负整数')); callback(new Error('请输入非负整数'));
@ -91,9 +94,12 @@ const rules = reactive({
} }
], ],
freeBean: [ freeBean: [
{ required: true, message: '请输入免费金豆数', trigger: 'blur' },
{ required: true, message: '请输入免费金豆数', trigger: 'change' },
{ {
validator: (rule, value, callback) => { validator: (rule, value, callback) => {
if(!value){
value = 0
}
// //
if (!/^\d+$/.test(value)) { if (!/^\d+$/.test(value)) {
callback(new Error('请输入非负整数')); callback(new Error('请输入非负整数'));
@ -197,10 +203,10 @@ const throttledHandleAddFormt = _.throttle(handleAddForm, 5000, {
<el-button type="primary" @click="getUser(addForm.jwcode)" style="margin-left: 20px">查询</el-button> <el-button type="primary" @click="getUser(addForm.jwcode)" style="margin-left: 20px">查询</el-button>
</el-form-item> </el-form-item>
<el-form-item prop="permanentBean" label="付费金豆" label-position="left"> <el-form-item prop="permanentBean" label="付费金豆" label-position="left">
<el-input v-model="addForm.permanentBean" placeholder="不填默认为0" style="width: 100px" />
<el-input v-model="addForm.permanentBean" placeholder="0" style="width: 100px" />
</el-form-item> </el-form-item>
<el-form-item prop="freeBean" label="免费金豆" label-position="left"> <el-form-item prop="freeBean" label="免费金豆" label-position="left">
<el-input v-model="addForm.freeBean" placeholder="不填默认为0" style="width: 100px" />
<el-input v-model="addForm.freeBean" placeholder="0" style="width: 100px" />
</el-form-item> </el-form-item>
<el-form-item prop="remark" label="备注" label-position="left"> <el-form-item prop="remark" label="备注" label-position="left">
<el-input v-model="addForm.remark" style="width: 300px" :rows="5" maxlength="100" show-word-limit <el-input v-model="addForm.remark" style="width: 300px" :rows="5" maxlength="100" show-word-limit

34
src/views/recharge/gold/addCoinRecharge.vue

@ -63,9 +63,9 @@ const recharge = ref({
activity: '', // activity activity: '', // activity
voucher: '', voucher: '',
rechargeWay: '客服充值', rechargeWay: '客服充值',
freeGold: "0",
freeGold: "",
money: null, money: null,
permanentGold: "0",
permanentGold: "",
rateName: null, rateName: null,
rateId: null, rateId: null,
payModel: '', // payModel payModel: '', // payModel
@ -83,6 +83,7 @@ const add = async function () {
if (formattedRecharge.permanentGold) { if (formattedRecharge.permanentGold) {
formattedRecharge.permanentGold = Number(formattedRecharge.permanentGold) * 100; formattedRecharge.permanentGold = Number(formattedRecharge.permanentGold) * 100;
} }
if (formattedRecharge.freeGold) { if (formattedRecharge.freeGold) {
formattedRecharge.freeGold = Number(formattedRecharge.freeGold) * 100; formattedRecharge.freeGold = Number(formattedRecharge.freeGold) * 100;
} }
@ -115,9 +116,9 @@ const add = async function () {
recharge.value.market = adminData.value.market recharge.value.market = adminData.value.market
recharge.value.voucher = '' recharge.value.voucher = ''
recharge.value.rechargeWay = '客服充值' recharge.value.rechargeWay = '客服充值'
recharge.value.freeGold = '0'
recharge.value.freeGold = ''
recharge.value.money = null recharge.value.money = null
recharge.value.permanentGold = '0'
recharge.value.permanentGold = ''
recharge.value.rateId = null recharge.value.rateId = null
imageUrl.value = '' imageUrl.value = ''
recharge.value.rateName = null recharge.value.rateName = null
@ -130,9 +131,14 @@ const add = async function () {
// //
const addBefore = () => { const addBefore = () => {
if(!recharge.value.permanentGold){
recharge.value.permanentGold ='0'
}
if(!recharge.value.freeGold){
recharge.value.freeGold ='0'
}
Ref.value.validate(async (valid) => { Ref.value.validate(async (valid) => {
if (valid) { if (valid) {
if (Number(recharge.value.permanentGold) === 0 && Number(recharge.value.freeGold) === 0) { if (Number(recharge.value.permanentGold) === 0 && Number(recharge.value.freeGold) === 0) {
ElMessage({ ElMessage({
type: 'error', type: 'error',
@ -197,9 +203,12 @@ const rules = reactive({
}], }],
activity: [{ required: true, message: '请选择活动名称', trigger: 'blur' }], activity: [{ required: true, message: '请选择活动名称', trigger: 'blur' }],
permanentGold: [ permanentGold: [
{ required: true, message: '请输入永久金币数', trigger: 'blur' },
{ required: true, message: '请输入永久金币数', trigger: 'change' },
{ {
validator: (rule, value, callback) => { validator: (rule, value, callback) => {
if(!value){
value = '0'
}
// //
if (/[^0-9.]/.test(value)) { if (/[^0-9.]/.test(value)) {
callback(new Error('不能包含特殊符号或负数')); callback(new Error('不能包含特殊符号或负数'));
@ -235,9 +244,12 @@ const rules = reactive({
} }
], ],
freeGold: [ freeGold: [
{ required: true, message: '请输入免费金币数', trigger: 'blur' },
{ required: true, message: '请输入免费金币数', trigger: 'change' },
{ {
validator: (rule, value, callback) => { validator: (rule, value, callback) => {
if(!value){
value = '0'
}
// //
if (/[^0-9.]/.test(value)) { if (/[^0-9.]/.test(value)) {
callback(new Error('不能包含特殊符号或负数')); callback(new Error('不能包含特殊符号或负数'));
@ -520,9 +532,9 @@ const deleteRecharge = function () {
market: adminData.value.market, market: adminData.value.market,
voucher: '', voucher: '',
rechargeWay: '客服充值', rechargeWay: '客服充值',
freeGold: Number(),
freeGold: '',
money: null, money: null,
permanentGold: Number(),
permanentGold: '',
rateId: null rateId: null
} }
imageUrl.value = '' imageUrl.value = ''
@ -568,13 +580,13 @@ onMounted(() => {
<el-input v-model="recharge.activity" placeholder="请输入活动名称" style="width: 300px" /> <el-input v-model="recharge.activity" placeholder="请输入活动名称" style="width: 300px" />
</el-form-item> </el-form-item>
<el-form-item prop="permanentGold" label="永久金币"> <el-form-item prop="permanentGold" label="永久金币">
<el-input v-model="recharge.permanentGold" style="width: 100px" />
<el-input v-model="recharge.permanentGold" placeholder="0" style="width: 100px" />
<p></p> <p></p>
</el-form-item> </el-form-item>
<el-form-item prop="freeGold" label="免费金币"> <el-form-item prop="freeGold" label="免费金币">
<el-input v-model="recharge.freeGold" style="width: 100px" />
<el-input v-model="recharge.freeGold" placeholder="0" style="width: 100px" />
<p></p> <p></p>
</el-form-item> </el-form-item>
<!-- <el-form-item label="充值金额"> <!-- <el-form-item label="充值金额">

8
src/views/usergold/gold/clientCountBalance.vue

@ -403,10 +403,10 @@ const format3 = (num) => {
<el-col> <el-col>
<el-card> <el-card>
<div> <div>
金币总数{{ format3(goldtotal || 0) }}&nbsp;&nbsp;&nbsp;&nbsp;
永久金币{{ format3(permanentGold || 0) }}&nbsp;&nbsp;&nbsp;&nbsp;
免费金币{{ format3(freeGold || 0) }}&nbsp;&nbsp;&nbsp;&nbsp;
任务金币{{ format3(taskGold || 0) }}
金币总数{{ format3(goldtotal/100 || 0) }}&nbsp;&nbsp;&nbsp;&nbsp;
永久金币{{ format3(permanentGold/100 || 0) }}&nbsp;&nbsp;&nbsp;&nbsp;
免费金币{{ format3(freeGold/100 || 0) }}&nbsp;&nbsp;&nbsp;&nbsp;
任务金币{{ format3(taskGold /100 || 0) }}
</div> </div>
<!-- 设置表格容器的高度和滚动样式 --> <!-- 设置表格容器的高度和滚动样式 -->
<div style="height: 626px; overflow-y: auto"> <div style="height: 626px; overflow-y: auto">

8
src/views/usergold/gold/clientCountDetail.vue

@ -554,10 +554,10 @@ const format3 = (num) => {
<el-col> <el-col>
<el-card> <el-card>
<div> <div>
金币总数{{ format3(totalGoldTotal || 0) }}&nbsp;&nbsp;&nbsp;&nbsp;
永久金币{{ format3(totalPermanentGold || 0) }}&nbsp;&nbsp;&nbsp;&nbsp;
免费金币{{ format3(totalFreeGold || 0) }}&nbsp;&nbsp;&nbsp;&nbsp;
任务金币{{ format3(totalTaskGold || 0) }}
金币总数{{ format3(totalGoldTotal/100 || 0) }}&nbsp;&nbsp;&nbsp;&nbsp;
永久金币{{ format3(totalPermanentGold/100 || 0) }}&nbsp;&nbsp;&nbsp;&nbsp;
免费金币{{ format3(totalFreeGold/100 || 0) }}&nbsp;&nbsp;&nbsp;&nbsp;
任务金币{{ format3(totalTaskGold /100|| 0) }}
</div> </div>
<div style="height: 584px; overflow-y: auto"> <div style="height: 584px; overflow-y: auto">
<el-table :data="tableData" style="width: 100%" @sort-change="handleSortChange" height="584px"> <el-table :data="tableData" style="width: 100%" @sort-change="handleSortChange" height="584px">

17
src/views/usergold/userbean.vue

@ -9,7 +9,8 @@
<div style="float: right;"> <div style="float: right;">
<el-button type="success" @click="reset">重置</el-button> <el-button type="success" @click="reset">重置</el-button>
<el-button type="primary" @click="get">查询</el-button>
<el-button type="primary" @click="search">查询</el-button>
</div> </div>
</el-card> </el-card>
@ -149,7 +150,7 @@ const handleSortChange = (column) => {
} }
searchObj.value.sortOrder = column.order === 'ascending' ? 'asc' : 'desc' searchObj.value.sortOrder = column.order === 'ascending' ? 'asc' : 'desc'
console.log('排序字段:', searchObj.value.sortField,'排序方式:', searchObj.value.sortOrder) console.log('排序字段:', searchObj.value.sortField,'排序方式:', searchObj.value.sortOrder)
get()
search()
} }
const getmarkets = async () => { const getmarkets = async () => {
try { try {
@ -168,23 +169,27 @@ const trim = () => {
const reset = function () { const reset = function () {
searchObj.value.jwcode = '' searchObj.value.jwcode = ''
searchObj.value.dept = '' searchObj.value.dept = ''
get()
search()
} }
const handlePageSizeChange = function (val) { const handlePageSizeChange = function (val) {
pagination.value.pageSize = val pagination.value.pageSize = val
get()
search()
} }
const handleCurrentChange = function (val) { const handleCurrentChange = function (val) {
pagination.value.pageNum = val pagination.value.pageNum = val
get()
search()
} }
const format3 = (num) => { const format3 = (num) => {
// //
return num.toLocaleString('en-US') return num.toLocaleString('en-US')
} }
const search = () => {
get()
getStats()
}
onMounted(() => { onMounted(() => {
get()
search()
getmarkets() getmarkets()
getStats() getStats()
console.log('页面接收到的adminData:', adminData.value) console.log('页面接收到的adminData:', adminData.value)

3
stats.html

@ -4925,7 +4925,6 @@ var drawChart = (function (exports) {
})({}); })({});
/*-->*/
</script> </script>
<script> <script>
/*<!--*/ /*<!--*/
@ -4942,7 +4941,7 @@ var drawChart = (function (exports) {
window.addEventListener('resize', run); window.addEventListener('resize', run);
document.addEventListener('DOMContentLoaded', run); document.addEventListener('DOMContentLoaded', run);
/*-->*/
</script> </script>
</body> </body>
</html> </html>

Loading…
Cancel
Save