This commit is contained in:
chy
2025-07-07 09:35:40 +08:00
parent 261a62da33
commit 8fc34daa35
8 changed files with 100 additions and 43 deletions

View File

@ -2,6 +2,7 @@
ENV = 'development' ENV = 'development'
# base api # base api
VUE_APP_BASE_API = 'http://localhost:9000' VUE_APP_BASE_API = 'http://127.0.0.1:9000'
# VUE_APP_BASE_API = 'http://47.108.136.226:9000'
#VUE_APP_BASE_API = 'http://47.108.139.184:8001' #VUE_APP_BASE_API = 'http://47.108.139.184:8001'

View File

@ -10,7 +10,8 @@ export function getRewardTypeList(params) {
size: params.size || 10, size: params.size || 10,
name: params.name, name: params.name,
status: params.status, status: params.status,
storeId: params.storeId storeId: params.storeId,
source: params.source
} }
}) })
} }

View File

@ -12,7 +12,7 @@ export function getMerchantAndStoreList() {
// 获取任务列表 // 获取任务列表
export function getTaskList({ netbarAccount, gid, num = 10, pageidx }) { export function getTaskList({ netbarAccount, gid, num = 10, pageidx }) {
return request({ return request({
url: '/x/task/getNonLoginTaskList', url: '/x/task/list',
method: 'get', method: 'get',
params: { params: {
netbarAccount, netbarAccount,

View File

@ -0,0 +1,15 @@
<template>
<div class="aliyun-slider">
<!-- 这里是阿里云滑块组件的内容 -->
</div>
</template>
<script setup>
// 这里可以添加你的组件逻辑
</script>
<style scoped>
.aliyun-slider {
/* 这里可以添加样式 */
}
</style>

View File

@ -14,11 +14,14 @@
@click.native="handleCascaderClick" @click.native="handleCascaderClick"
/> />
<el-button @click="handleReset" style="margin-left: 10px;">重置</el-button> <el-button @click="handleReset" style="margin-left: 10px;">重置</el-button>
<el-button class="refresh-btn" @click="handleRefresh" style="margin-left: auto;"> <div style="margin-left: auto; display: flex; gap: 10px;">
<el-button class="refresh-btn" @click="handleSyncTask">任务同步</el-button>
<el-button class="refresh-btn" @click="handleRefresh">
<i class="el-icon-refresh"></i> <i class="el-icon-refresh"></i>
<span>刷新</span> <span>刷新</span>
</el-button> </el-button>
</div> </div>
</div>
<el-tabs v-model="activeGame" @tab-click="handleGameChange"> <el-tabs v-model="activeGame" @tab-click="handleGameChange">
<el-tab-pane <el-tab-pane
@ -32,20 +35,32 @@
<!-- 任务列表表格 --> <!-- 任务列表表格 -->
<div class="task-table-container"> <div class="task-table-container">
<el-table v-loading="loading" :data="taskList" style="width: 100%; max-width: 100%; table-layout: fixed; overflow-x: hidden;" border> <el-table v-loading="loading" :data="taskList" style="width: 100%; max-width: 100%; table-layout: fixed; overflow-x: hidden;" border>
<el-table-column prop="qqNetbarTaskRules" label="任务规则" :resizable="false" align="center" header-align="center" min-width="16%" /> <el-table-column label="任务名称" align="center" min-width="16%" :resizable="false">
<el-table-column prop="qqNetbarTaskMemo" label="任务描述" :resizable="false" align="center" header-align="center" min-width="16%" />
<el-table-column prop="qqNetbarTaskName" label="任务名称" :resizable="false" align="center" header-align="center" min-width="16%" />
<el-table-column prop="qqNetbarReward" label="奖励名称" :resizable="false" align="center" header-align="center" min-width="16%">
<template slot-scope="scope"> <template slot-scope="scope">
<span> {{ scope.row.title || '-' }}
{{
(scope.row.rewards && scope.row.rewards.filter(r => r.rewardTypeSource === 1).map(r => r.name).join('、')) || '-'
}}
</span>
</template> </template>
</el-table-column> </el-table-column>
<el-table-column prop="qqNetbarTargetTime" label="目标次数" :resizable="false" align="center" header-align="center" min-width="16%" /> <el-table-column label="任务描述" align="center" min-width="16%" :resizable="false">
<el-table-column label="操作" align="center" min-width="16%"> <template slot-scope="scope">
{{ scope.row.task_desc || '-' }}
</template>
</el-table-column>
<el-table-column label="规则描述" align="center" min-width="16%" :resizable="false">
<template slot-scope="scope">
{{ scope.row.rule_desc || '-' }}
</template>
</el-table-column>
<el-table-column label="目标名称" align="center" min-width="16%" :resizable="false">
<template slot-scope="scope">
{{ scope.row.target_name || '-' }}
</template>
</el-table-column>
<el-table-column label="目标次数" align="center" min-width="16%" :resizable="false">
<template slot-scope="scope">
{{ scope.row.target_times || '-' }}
</template>
</el-table-column>
<el-table-column label="操作" align="center" min-width="16%" :resizable="false">
<template slot-scope="scope"> <template slot-scope="scope">
<el-button type="primary" size="mini" @click="configureReward(scope.row)">配置奖励</el-button> <el-button type="primary" size="mini" @click="configureReward(scope.row)">配置奖励</el-button>
</template> </template>
@ -72,7 +87,7 @@
<el-form label-width="100px"> <el-form label-width="100px">
<el-form-item label="奖励类型"> <el-form-item label="奖励类型">
<el-select v-model="selectedRewardTypeId" placeholder="请选择奖励类型" filterable :loading="rewardTypeLoading" style="width: 100%" @change="handleRewardTypeChange"> <el-select v-model="selectedRewardTypeId" placeholder="请选择奖励类型" filterable :loading="rewardTypeLoading" style="width: 100%" @change="handleRewardTypeChange">
<el-option v-for="item in rewardTypeList" :key="item.id" :label="item.name" :value="item.id" /> <el-option v-for="item in rewardTypeList" :key="item.id" :label="item.name" :value="item.tencentTypeId" />
</el-select> </el-select>
</el-form-item> </el-form-item>
<el-form-item label="奖励"> <el-form-item label="奖励">
@ -95,6 +110,7 @@ import { getGameList } from '@/api/game'
import { getTaskList, getMerchantAndStoreList, setTaskReward, operateTaskReward } from '@/api/task' import { getTaskList, getMerchantAndStoreList, setTaskReward, operateTaskReward } from '@/api/task'
import { getRewardTypeList } from '@/api/reward-type' import { getRewardTypeList } from '@/api/reward-type'
import { getRewardSystemList } from '@/api/reward' import { getRewardSystemList } from '@/api/reward'
import request from '@/utils/request'
export default { export default {
name: 'GameTask', name: 'GameTask',
@ -248,7 +264,7 @@ export default {
const res = await getTaskList({ netbarAccount, gid, num: 10, pageidx: '' }) const res = await getTaskList({ netbarAccount, gid, num: 10, pageidx: '' })
console.log('getTaskList result', res) console.log('getTaskList result', res)
if (res.code === 0) { if (res.code === 0) {
this.taskList = res.data.taskList || [] this.taskList = res.data.list?.taskList || []
} else { } else {
this.$message.error(res.message || '获取任务列表失败') this.$message.error(res.message || '获取任务列表失败')
this.taskList = [] this.taskList = []
@ -269,7 +285,7 @@ export default {
this.rewardList = [] this.rewardList = []
this.rewardListLoading = false this.rewardListLoading = false
// 获取奖励类型 // 获取奖励类型
getRewardTypeList({ page: 1, size: 1000 }).then(res => { getRewardTypeList({ page: 1, size: 1000, source: 1 }).then(res => {
if (res.code === 0) { if (res.code === 0) {
this.rewardTypeList = res.data.list || [] this.rewardTypeList = res.data.list || []
} else { } else {
@ -305,7 +321,7 @@ export default {
this.$message.error('请选择奖励类型和奖励') this.$message.error('请选择奖励类型和奖励')
return return
} }
const taskId = this.currentTask.qqNetbarTaskId || this.currentTask.id const taskId = this.currentTask.task_id || this.currentTask.qqNetbarTaskId || this.currentTask.id
operateTaskReward({ operateTaskReward({
type: 1, type: 1,
taskId, taskId,
@ -348,6 +364,25 @@ export default {
this.$message.error('请求失败') this.$message.error('请求失败')
}) })
}, },
formatTimestamp(ts) {
if (!ts) return '-'
const date = new Date(ts * 1000)
return date.getFullYear() + '-' + (date.getMonth() + 1).toString().padStart(2, '0') + '-' + date.getDate().toString().padStart(2, '0') + ' ' + date.getHours().toString().padStart(2, '0') + ':' + date.getMinutes().toString().padStart(2, '0') + ':' + date.getSeconds().toString().padStart(2, '0')
},
async handleSyncTask() {
try {
const res = await request({ url: '/x/task/sync', method: 'post' })
if (res.code === 0) {
const msg = (res.data && res.data.message) ? res.data.message : (res.message || '任务同步成功')
this.$message.success(msg)
this.handleRefresh()
} else {
this.$message.error(res.message || '任务同步失败')
}
} catch (e) {
this.$message.error('任务同步失败')
}
},
} }
} }
</script> </script>
@ -438,4 +473,8 @@ export default {
overflow-x: hidden !important; overflow-x: hidden !important;
max-width: 100% !important; max-width: 100% !important;
} }
::v-deep .el-table__column-resize {
display: none !important;
}
</style> </style>

View File

@ -113,9 +113,9 @@
<el-form-item label="奖励名称" prop="name" label-width="120px"> <el-form-item label="奖励名称" prop="name" label-width="120px">
<el-input v-model="addRewardForm.name" placeholder="请输入奖励名称" /> <el-input v-model="addRewardForm.name" placeholder="请输入奖励名称" />
</el-form-item> </el-form-item>
<el-form-item label="奖励类型" prop="rewardTypeId" label-width="120px"> <el-form-item label="奖励类型" prop="tencentTypeId" label-width="120px">
<el-select v-model="addRewardForm.rewardTypeId" placeholder="请选择奖励类型" filterable style="width: 100%"> <el-select v-model="addRewardForm.tencentTypeId" placeholder="请选择奖励类型" filterable style="width: 100%">
<el-option v-for="item in rewardTypeList" :key="item.id" :label="item.name" :value="item.id" /> <el-option v-for="item in rewardTypeList" :key="item.id" :label="item.name" :value="item.tencentTypeId" />
</el-select> </el-select>
</el-form-item> </el-form-item>
<el-form-item label="游戏ID" prop="gameId" label-width="120px"> <el-form-item label="游戏ID" prop="gameId" label-width="120px">
@ -212,7 +212,7 @@
addRewardForm: { addRewardForm: {
id: undefined, id: undefined,
name: '', name: '',
rewardTypeId: undefined, tencentTypeId: undefined,
gameId: undefined, gameId: undefined,
rewardImg: '', rewardImg: '',
qqGoodsId: '', qqGoodsId: '',
@ -229,11 +229,9 @@
source: 1 source: 1
}, },
addRewardRules: { addRewardRules: {
rewardTypeId: [{ required: true, message: '请选择奖励类型', trigger: 'change' }], tencentTypeId: [{ required: true, message: '请选择奖励类型', trigger: 'change' }],
name: [{ required: true, message: '请输入奖励名称', trigger: 'blur' }], name: [{ required: true, message: '请输入奖励名称', trigger: 'blur' }],
description: [{ required: true, message: '请输入奖励描述', trigger: 'blur' }],
status: [{ required: true, message: '请选择状态', trigger: 'change' }], status: [{ required: true, message: '请选择状态', trigger: 'change' }],
value: [{ required: true, message: '请输入奖励值', trigger: 'blur' }],
expireType: [{ required: true, message: '请选择过期类型', trigger: 'change' }], expireType: [{ required: true, message: '请选择过期类型', trigger: 'change' }],
validFrom: [ validFrom: [
{ required: true, message: '请选择有效开始时间', trigger: 'change', { required: true, message: '请选择有效开始时间', trigger: 'change',
@ -352,7 +350,7 @@
this.addRewardForm = { this.addRewardForm = {
id: row.id, id: row.id,
name: row.name, name: row.name,
rewardTypeId: row.rewardTypeId, tencentTypeId: row.tencentTypeId || row.rewardTypeId,
gameId: row.gameId, gameId: row.gameId,
rewardImg: row.rewardImg || row.imageUrl || '', rewardImg: row.rewardImg || row.imageUrl || '',
qqGoodsId: row.qqGoodsId, qqGoodsId: row.qqGoodsId,
@ -381,7 +379,11 @@
try { try {
await this.$refs.addRewardForm.validate() await this.$refs.addRewardForm.validate()
const api = this.dialogType === 'add' ? addReward : updateReward const api = this.dialogType === 'add' ? addReward : updateReward
const formData = { ...this.addRewardForm, source: 1 } const formData = {
...this.addRewardForm,
rewardTypeId: this.addRewardForm.tencentTypeId,
source: 1
}
const res = await api(formData) const res = await api(formData)
if (res.code === 0) { if (res.code === 0) {
this.$message.success(this.dialogType === 'add' ? '添加奖励成功' : '编辑奖励成功') this.$message.success(this.dialogType === 'add' ? '添加奖励成功' : '编辑奖励成功')
@ -402,7 +404,7 @@
this.addRewardForm = { this.addRewardForm = {
id: undefined, id: undefined,
name: '', name: '',
rewardTypeId: undefined, tencentTypeId: undefined,
gameId: undefined, gameId: undefined,
rewardImg: '', rewardImg: '',
qqGoodsId: '', qqGoodsId: '',

View File

@ -139,9 +139,6 @@ export default {
], ],
code: [ code: [
{ required: true, message: '请输入编码', trigger: 'blur' } { required: true, message: '请输入编码', trigger: 'blur' }
],
iconUrl: [
{ required: true, message: '请输入图标URL', trigger: 'blur' }
] ]
} }
} }
@ -153,7 +150,7 @@ export default {
async getList() { async getList() {
this.loading = true this.loading = true
try { try {
const res = await getRewardTypeList(this.query) const res = await getRewardTypeList({ ...this.query, source: 1 })
if (res.code === 0) { if (res.code === 0) {
this.list = res.data.list this.list = res.data.list
this.total = res.data.total this.total = res.data.total
@ -213,7 +210,7 @@ export default {
if (valid) { if (valid) {
try { try {
const api = this.dialogType === 'add' ? addRewardType : updateRewardType const api = this.dialogType === 'add' ? addRewardType : updateRewardType
const submitData = { ...this.form } const submitData = { ...this.form, source: 1 }
const res = await api(submitData) const res = await api(submitData)
if (res.code === 0) { if (res.code === 0) {
this.$message.success(this.dialogType === 'add' ? '新增成功' : '编辑成功') this.$message.success(this.dialogType === 'add' ? '新增成功' : '编辑成功')

View File

@ -24,8 +24,10 @@
class="custom-table" class="custom-table"
header-row-class-name="custom-header" header-row-class-name="custom-header"
row-class-name="custom-row" row-class-name="custom-row"
:header-cell-style="{ textAlign: 'center' }"
:cell-style="{ textAlign: 'center' }"
> >
<el-table-column label="用户信息" min-width="300"> <el-table-column label="用户信息" min-width="16%" align="center">
<template slot-scope="scope"> <template slot-scope="scope">
<div class="user-info-cell"> <div class="user-info-cell">
<el-avatar :size="48" :src="scope.row.avatar"> <el-avatar :size="48" :src="scope.row.avatar">
@ -38,25 +40,25 @@
</div> </div>
</template> </template>
</el-table-column> </el-table-column>
<el-table-column prop="phone" label="手机号" width="300" align="center"> <el-table-column prop="phone" label="手机号" min-width="16%" align="center">
<template slot-scope="scope"> <template slot-scope="scope">
{{ scope.row.phone || '-' }} {{ scope.row.phone || '-' }}
</template> </template>
</el-table-column> </el-table-column>
<el-table-column prop="status" label="状态" width="100" align="center"> <el-table-column prop="status" label="状态" min-width="16%" align="center">
<template slot-scope="scope"> <template slot-scope="scope">
<span :class="['status-tag', scope.row.status === 0 ? 'status-normal' : 'status-block']"> <span :class="['status-tag', scope.row.status === 0 ? 'status-normal' : 'status-block']">
{{ scope.row.status === 0 ? '正常' : '禁用' }} {{ scope.row.status === 0 ? '正常' : '禁用' }}
</span> </span>
</template> </template>
</el-table-column> </el-table-column>
<el-table-column prop="birthday" label="注册时间" width="200" align="center"> <el-table-column prop="birthday" label="注册时间" min-width="16%" align="center">
<template slot-scope="scope"> <template slot-scope="scope">
{{ scope.row.firstVisitAt ? scope.row.firstVisitAt : '-' }} {{ scope.row.firstVisitAt ? scope.row.firstVisitAt : '-' }}
</template> </template>
</el-table-column> </el-table-column>
<el-table-column prop="lastLoginStoreName" label="最近登录门店" width="200" align="center" /> <el-table-column prop="lastLoginStoreName" label="最近登录门店" min-width="16%" align="center" />
<el-table-column label="操作" width="160" align="center"> <el-table-column label="操作" min-width="16%" align="center">
<template slot-scope="scope"> <template slot-scope="scope">
<div class="action-buttons"> <div class="action-buttons">
<el-button type="primary" size="mini" class="action-btn edit-btn" @click="onEdit(scope.row)"> <el-button type="primary" size="mini" class="action-btn edit-btn" @click="onEdit(scope.row)">