feat: 迁移游戏商务绑定审核流程和列表

This commit is contained in:
Yvan
2026-11-03 18:26:26 +08:00
parent 43f0ec1b15
commit c0a3692068
31 changed files with 1304 additions and 30 deletions
+5
View File
@@ -7,3 +7,8 @@ export const listBusiness = (params) => service({ url: '/sw/business/list', meth
export const getBusiness = (id) => service({ url: `/sw/business/${id}`, method: 'get' })
export const createBusiness = (data) => service({ url: '/sw/business', method: 'post', data })
export const updateBusiness = (data) => service({ url: '/sw/business', method: 'put', data })
export const listBusinessBindings = (params) => service({ url: '/sw/business/bindPlatform', method: 'get', params })
export const listUserBindings = (id) => service({ url: `/sw/business/${id}/bindPlatform`, method: 'get' })
export const bindPlatform = (data) => service({ url: '/sw/business/bindPlatform', method: 'post', data })
export const unbindPlatform = (data) => service({ url: '/sw/business/bindPlatform', method: 'delete', data })
+1
View File
@@ -53,6 +53,7 @@
"/src/view/superAdmin/position/position.vue": "Position",
"/src/view/superAdmin/user/user.vue": "User",
"/src/view/sw/BusinessList.vue": "SwBusinessList",
"/src/view/sw/components/BusinessBindings.vue": "SwBusinessBindings",
"/src/view/system/security/forceChangePassword.vue": "ForceChangePassword",
"/src/view/system/security/index.vue": "SecurityConfig",
"/src/view/system/state.vue": "State",
+11 -3
View File
@@ -1,6 +1,8 @@
<template>
<div>
<div class="kra-search-box">
<el-tabs v-model="activeTab"><el-tab-pane label="商务列表" name="accounts" /><el-tab-pane label="游戏 SDK 绑定" name="bindings" /></el-tabs>
<business-bindings v-if="activeTab === 'bindings'" @changed="load" />
<div v-show="activeTab === 'accounts'" class="kra-search-box">
<el-form :inline="true" :model="query" @submit.prevent="search">
<el-form-item label="商务账号"><el-input v-model="query.userName" clearable placeholder="请输入账号" /></el-form-item>
<el-form-item label="姓名"><el-input v-model="query.realName" clearable placeholder="请输入姓名" /></el-form-item>
@@ -17,7 +19,7 @@
<el-form-item><el-button type="primary" icon="search" native-type="submit">查询</el-button><el-button icon="refresh" @click="reset">重置</el-button></el-form-item>
</el-form>
</div>
<div class="kra-table-box">
<div v-show="activeTab === 'accounts'" class="kra-table-box">
<div class="kra-btn-list">
<el-button v-if="canAdd" type="primary" icon="plus" @click="openCreate">添加子商务</el-button>
</div>
@@ -27,7 +29,7 @@
<el-table-column prop="parentUserName" label="上级商务" min-width="140" />
<el-table-column prop="realName" label="姓名" min-width="100" />
<el-table-column prop="phoneNumber" label="手机号" min-width="130" />
<el-table-column prop="bindCount" label="SDK 商务数" width="120" />
<el-table-column prop="bindCount" label="SDK 商务数" width="120"><template #default="{ row }"><el-button v-if="row.bindCount > 0" link type="primary" @click="showBindings(row)">{{ row.bindCount }}</el-button><span v-else>0</span></template></el-table-column>
<el-table-column prop="promoteCount" label="直属渠道数" width="120">
<template #default="{ row }">
<el-tooltip v-if="row.promoteCount === null" content="当前数据库尚未接入渠道数据,商务资料和绑定数仍可查看。"><span class="text-gray-400">未接入</span></el-tooltip>
@@ -42,6 +44,7 @@
<el-pagination v-model:current-page="query.pageNum" v-model:page-size="query.pageSize" :total="total" :page-sizes="[10, 20, 50, 100]" layout="total, sizes, prev, pager, next, jumper" @size-change="search" @current-change="load" />
</div>
</div>
<el-drawer v-model="bindingsDrawer" title="已通过的游戏 SDK 绑定" size="85%" destroy-on-close><business-bindings :user-id="bindingUserId" /></el-drawer>
<el-drawer v-model="drawer" :title="editing ? '编辑商务' : '添加子商务'" :size="480" destroy-on-close>
<el-form ref="formRef" :model="form" :rules="rules" label-position="top">
<el-form-item label="商务账号" prop="userName"><el-input v-model="form.userName" maxlength="30" /></el-form-item>
@@ -67,9 +70,14 @@ import { ElMessage } from 'element-plus'
import { useUserStore } from '@/pinia/modules/user'
import { useBtnAuth } from '@/utils/btnAuth'
import { listBusiness, getBusiness, createBusiness, updateBusiness } from '@/api/business'
import BusinessBindings from './components/BusinessBindings.vue'
defineOptions({ name: 'SwBusinessList' })
const user = useUserStore()
const activeTab = ref('accounts')
const bindingsDrawer = ref(false)
const bindingUserId = ref(0)
const showBindings = (row) => { bindingUserId.value = row.userId; bindingsDrawer.value = true }
const buttons = useBtnAuth()
const levels = { 1: '一级商务', 2: '二级商务', 3: '三级商务' }
const statuses = { 0: '正常', 1: '停用', 2: '已驳回', 3: '待审核' }
@@ -0,0 +1,91 @@
<template>
<div>
<div v-if="!userId" class="kra-search-box">
<el-form :inline="true" :model="query" @submit.prevent="search">
<el-form-item label="所属平台"><el-select v-model="query.sourceDb" multiple clearable placeholder="全部平台" style="width: 220px"><el-option v-for="(label, value) in platforms" :key="value" :value="value" :label="label" /></el-select></el-form-item>
<el-form-item label="游戏商务账号"><el-input v-model="query.platformBusierAccount" clearable /></el-form-item>
<el-form-item label="状态"><el-select v-model="query.status" clearable style="width: 130px"><el-option v-for="(label, value) in statuses" :key="value" :value="value" :label="label" /></el-select></el-form-item>
<el-form-item><el-button type="primary" icon="search" native-type="submit">查询</el-button><el-button icon="refresh" @click="reset">重置</el-button></el-form-item>
</el-form>
</div>
<div class="kra-table-box">
<div v-if="!userId && canBind" class="kra-btn-list"><el-button type="primary" icon="plus" @click="openBind">绑定游戏商务</el-button></div>
<el-table v-loading="loading" :data="rows" :row-key="rowKey">
<el-table-column prop="platformName" label="平台" min-width="80" />
<el-table-column prop="platformBusierAccount" label="游戏商务账号" min-width="140" />
<el-table-column prop="bindUserName" label="绑定商务" min-width="140" />
<el-table-column label="直属渠道数" min-width="110"><template #default="{ row }"><span :class="{ 'text-gray-400': row.promoteCount === null }">{{ row.promoteCount === null ? '未接入' : row.promoteCount }}</span></template></el-table-column>
<el-table-column label="状态" width="110"><template #default="{ row }"><el-tag :type="row.status === '0' ? 'success' : row.status === '2' ? 'danger' : 'warning'">{{ statuses[row.status] || row.status }}</el-tag></template></el-table-column>
<el-table-column prop="createTime" label="提交时间" min-width="180" />
<el-table-column prop="reviewTime" label="审核时间" min-width="180" />
<el-table-column prop="reviewAccount" label="审核人" min-width="100" />
<el-table-column prop="rejectReason" label="驳回原因" min-width="150" show-overflow-tooltip />
<el-table-column v-if="canBind" label="操作" width="90" fixed="right"><template #default="{ row }"><el-button v-if="row.userId === user.userInfo.ID" link type="danger" @click="remove(row)">解绑</el-button></template></el-table-column>
</el-table>
<div v-if="!userId" class="kra-pagination"><el-pagination v-model:current-page="query.pageNum" v-model:page-size="query.pageSize" :total="total" :page-sizes="[10, 20, 50, 100]" layout="total, sizes, prev, pager, next, jumper" @size-change="search" @current-change="load" /></div>
</div>
<el-dialog v-model="dialog" title="绑定游戏商务" width="460px" destroy-on-close>
<el-alert title="验证成功后提交 OA 审核,审核通过后可查看对应渠道数据。" type="info" :closable="false" class="mb-4" />
<el-form ref="formRef" :model="form" :rules="rules" label-position="top">
<el-form-item label="所属平台" prop="sourceDb"><el-select v-model="form.sourceDb"><el-option v-for="(label, value) in platforms" :key="value" :value="value" :label="label" /></el-select></el-form-item>
<el-form-item label="游戏商务账号" prop="account"><el-input v-model="form.account" maxlength="30" autocomplete="off" /></el-form-item>
<el-form-item label="游戏商务密码" prop="password"><el-input v-model="form.password" type="password" show-password autocomplete="new-password" /></el-form-item>
</el-form>
<template #footer><el-button @click="dialog = false">取消</el-button><el-button type="primary" :loading="saving" @click="submit">验证并提交</el-button></template>
</el-dialog>
</div>
</template>
<script setup>
import { computed, reactive, ref, watch } from 'vue'
import { ElMessage, ElMessageBox } from 'element-plus'
import { useUserStore } from '@/pinia/modules/user'
import { useBtnAuth } from '@/utils/btnAuth'
import { listBusinessBindings, listUserBindings, bindPlatform, unbindPlatform } from '@/api/business'
defineOptions({ name: 'SwBusinessBindings' })
const props = defineProps({ userId: { type: Number, default: 0 } })
const emit = defineEmits(['changed'])
const user = useUserStore()
const buttons = useBtnAuth()
const canBind = computed(() => Number(user.userInfo.level) === 3 && Boolean(buttons['sw:business:bind']))
const platforms = { lx: '龙翔', hw: '汇玩', yq: '游趣' }
const statuses = { 0: '已通过', 2: '已驳回', 3: '待审核' }
const query = reactive({ pageNum: 1, pageSize: 10, sourceDb: [], platformBusierAccount: '', status: '' })
const rows = ref([])
const total = ref(0)
const loading = ref(false)
const dialog = ref(false)
const saving = ref(false)
const formRef = ref()
const form = ref({})
const rules = Object.fromEntries(['sourceDb', 'account', 'password'].map((key) => [key, [{ required: true, message: '请填写完整信息', trigger: 'blur' }]]))
const rowKey = (row) => `${row.userId}:${row.sourceDb}:${row.platformBusierId}`
const load = async () => {
loading.value = true
try {
const res = props.userId ? await listUserBindings(props.userId) : await listBusinessBindings({ ...query, sourceDb: query.sourceDb.join(',') })
if (res.code === 0) {
rows.value = props.userId ? res.data : res.data.rows
total.value = props.userId ? rows.value.length : res.data.total
}
} finally { loading.value = false }
}
const search = () => { query.pageNum = 1; return load() }
const reset = () => { Object.assign(query, { sourceDb: [], platformBusierAccount: '', status: '' }); return search() }
const openBind = () => { form.value = { sourceDb: 'lx', account: '', password: '' }; dialog.value = true }
const submit = async () => {
if (!await formRef.value.validate().catch(() => false)) return
saving.value = true
try {
const res = await bindPlatform(form.value)
if (res.code === 0) { ElMessage.success('已提交,请等待 OA 审核'); dialog.value = false; form.value.password = ''; emit('changed'); await load() }
} finally { saving.value = false }
}
const remove = async (row) => {
if (!await ElMessageBox.confirm(`确认解绑 ${row.platformName} 的游戏商务 ${row.platformBusierAccount}?`, '解绑确认', { type: 'warning' }).then(() => true).catch(() => false)) return
const res = await unbindPlatform({ sourceDb: row.sourceDb, platformBusierId: row.platformBusierId })
if (res.code === 0) { ElMessage.success('解绑成功'); emit('changed'); await load() }
}
watch(() => props.userId, load, { immediate: true })
</script>