MoQingYu 4 months ago
parent
commit
cc6738a9eb
  1. 18
      backmanage/src/api/module/common_params.ts
  2. 5
      backmanage/src/views/person/configs/GameRooms.vue
  3. 2
      backmanage/src/views/person/records/Email.vue
  4. 166
      backmanage/src/views/person/risk/GameControllerConfig.vue
  5. 182
      backmanage/src/views/person/risk/GameControllerList.vue
  6. 189
      backmanage/src/views/person/risk/GameControllerLog.vue
  7. 36
      backmanage/src/views/person/risk/GameControllerRecord.vue
  8. 332
      backmanage/src/views/userSearch/changeEmail.vue
  9. 28
      backmanage/src/views/userSearch/changeGameController.vue
  10. 2
      backmanage/src/views/userSearch/details.vue
  11. 2
      backmanage/stats.html

18
backmanage/src/api/module/common_params.ts

@ -7,12 +7,12 @@ export const initPage = {
//点控类型
export const optionsPointControl: any[] = [
{ value: "1000", label: "1000 (系统赢)" },
{ value: "2000", label: "2000 (系统赢)" },
{ value: "3000", label: "3000 (系统赢)" },
{ value: "-1000", label: "-1000 (系统输)" },
{ value: "-2000", label: "-2000 (系统输)" },
{ value: "-3000", label: "-3000 (系统输)" },
{ value: 1000, label: "1000 (系统赢)" },
{ value: 2000, label: "2000 (系统赢)" },
{ value: 3000, label: "3000 (系统赢)" },
{ value: -1000, label: "-1000 (系统输)" },
{ value: -2000, label: "-2000 (系统输)" },
{ value: -3000, label: "-3000 (系统输)" },
]
//邮件模板
@ -91,6 +91,12 @@ export const options7Up7DownBetArea: any = {
10: "10",
11: "11",
12: "12",
21: "1-1",
22: "2_2",
23: "3_3",
24: "4_4",
25: "5_5",
26: "6_6",
}
//3Patii 下注区域

5
backmanage/src/views/person/configs/GameRooms.vue

@ -40,6 +40,7 @@ const data = reactive({
hostLimit: 0,
minTableTake: '',
maxTableTake: '',
alwaysBet: '',
},
options: {
games: [] as any,
@ -147,6 +148,7 @@ const submitData = async () => {
hostLimit: parseInt(data.form.hostLimit),
minTableTake: parseInt(data.form.minTableTake),
maxTableTake: parseInt(data.form.maxTableTake),
alwaysBet: parseInt(data.form.alwaysBet),
}
//
@ -314,6 +316,9 @@ onMounted(async () => {
<template #append>%</template>
</el-input>
</el-form-item>
<el-form-item label="强制底注" label-width="100">
<el-input v-model="data.form.alwaysBet" />
</el-form-item>
<!-- 对战 -->
<template v-if="data.form.gameType == 1">

2
backmanage/src/views/person/records/Email.vue

@ -184,7 +184,7 @@ onMounted(() => {
<!-- 添加邮件 -->
<el-dialog v-model="data.dialog">
<ChangeEmail :send-mode="1" @close-box="closeBox" />
<ChangeEmail :send-mode="0" @close-box="closeBox" />
</el-dialog>
<!-- 删除 -->

166
backmanage/src/views/person/risk/GameControllerConfig.vue

@ -41,12 +41,13 @@ interface FormData {
vip_status: number
vip_values: number | string
channel_status: number
channel_values: number
point_gear: string
channel_values: Array<string>
point_gear: number | string
point_coin: number | string
lower_rate: number | string
upper_rate: number | string
loop_times: number | string
refresh_status: number
refresh_times: number | string
remark: string
}
@ -62,6 +63,7 @@ const data = reactive({
remark: [{ required: true, message: '数值不能为空', trigger: 'blur' }],
point_coin: [{ required: true, message: '数值不能为空', trigger: 'blur' }],
lower_rate: [{ required: true, message: '数值不能为空', trigger: 'blur' }],
refresh_times: [{ required: true, message: '数值不能为空', trigger: 'blur' }],
},
options: {
new_register: [
@ -76,6 +78,7 @@ const data = reactive({
{ label: '小于等于', value: 4 },
],
point: optionsPointControl,
channel: [] as any,
},
})
@ -96,6 +99,20 @@ const getRecord = async (page: number = 1) => {
data.result = respond.data
}
const getChannelList = async () => {
const respond: any = await request.post('/person/channelList')
if (respond.code != 0) {
ElMessage.error(respond.msg)
return
}
data.options.channel = []
for (const item of respond.data) {
data.options.channel.push({ label: item.name, value: item.p_token + '|' + item.ad_token })
}
}
const addBox = (action: number, item: any) => {
data.form = {
id: 0,
@ -134,12 +151,13 @@ const addBox = (action: number, item: any) => {
vip_status: 0,
vip_values: 0,
channel_status: 0,
channel_values: 0,
point_gear: '1000',
channel_values: [],
point_gear: 1000,
point_coin: '',
lower_rate: '',
upper_rate: '',
loop_times: 0,
refresh_status: 0,
refresh_times: '',
remark: '',
} as FormData
@ -149,7 +167,54 @@ const addBox = (action: number, item: any) => {
}
const editBox = (action: number, item: any) => {
data.form = item
const current = JSON.parse(JSON.stringify(item))
data.form = {
id: current.id,
new_register_status: decodeStatus(current.new_register_status).status,
new_register_type: decodeStatus(current.new_register_status).type,
today_winlose_status: decodeStatus(current.today_winlose_status).status,
today_winlose_type: decodeStatus(current.today_winlose_status).type,
today_winlose_values: current.today_winlose_values,
total_winlose_status: decodeStatus(current.total_winlose_status).status,
total_winlose_type: decodeStatus(current.total_winlose_status).type,
total_winlose_values: current.total_winlose_values,
today_deposit_status: decodeStatus(current.today_deposit_status).status,
today_deposit_type: decodeStatus(current.today_deposit_status).type,
today_deposit_values: current.today_deposit_values,
total_deposit_status: decodeStatus(current.total_deposit_status).status,
total_deposit_type: decodeStatus(current.total_deposit_status).type,
total_deposit_values: current.total_deposit_values,
today_withdraw_status: decodeStatus(current.today_withdraw_status).status,
today_withdraw_type: decodeStatus(current.today_withdraw_status).type,
today_withdraw_values: current.today_withdraw_values,
total_withdraw_status: decodeStatus(current.total_withdraw_status).status,
total_withdraw_type: decodeStatus(current.total_withdraw_status).type,
total_withdraw_values: current.total_withdraw_values,
today_surplus_status: decodeStatus(current.today_surplus_status).status,
today_surplus_type: decodeStatus(current.today_surplus_status).type,
today_surplus_values: current.today_surplus_values,
total_surplus_status: decodeStatus(current.total_surplus_status).status,
total_surplus_type: decodeStatus(current.total_surplus_status).type,
total_surplus_values: current.total_surplus_values,
device_num_status: decodeStatus(current.device_num_status).status,
device_num_type: decodeStatus(current.device_num_status).type,
device_num_values: current.device_num_values,
ip_num_status: decodeStatus(current.ip_num_status).status,
ip_num_type: decodeStatus(current.ip_num_status).type,
ip_num_values: current.ip_num_values,
vip_status: current.vip_status,
vip_values: current.vip_values,
channel_status: current.channel_status,
channel_values: JSON.parse(current.channel_values),
point_gear: current.point_gear,
point_coin: current.point_coin,
lower_rate: current.lower_rate,
upper_rate: current.upper_rate,
refresh_status: current.refresh_status,
refresh_times: current.refresh_times,
remark: current.remark,
} as FormData
data.dialog = true
data.request.action = action
@ -174,14 +239,27 @@ const submitData = async () => {
return
}
//4
if ((data.form.point_gear as number) > 0 && parseInt(data.form.point_coin as string) > 0) {
ElMessage.error('点控输作弊值必须小于0')
return
}
//4
if ((data.form.point_gear as number) < 0 && parseInt(data.form.point_coin as string) < 0) {
ElMessage.error('点控赢作弊值必须大于0')
return
}
const params = {
id: data.form.id,
remark: data.form.remark,
point_gear: data.form.point_gear,
point_gear: parseInt(data.form.point_gear as string),
point_coin: parseInt(data.form.point_coin as string),
lower_rate: parseInt(data.form.lower_rate as string),
upper_rate: parseInt(data.form.upper_rate as string),
loop_times: parseInt(data.form.loop_times as string),
refresh_status: data.form.refresh_status,
refresh_times: parseInt(data.form.refresh_times as string),
new_register_status: encodeStatus(data.form.new_register_status, data.form.new_register_type),
today_winlose_status: encodeStatus(data.form.today_winlose_status, data.form.today_winlose_type),
today_winlose_values: parseInt(data.form.today_winlose_values as string),
@ -205,7 +283,23 @@ const submitData = async () => {
ip_num_values: parseInt(data.form.ip_num_values as string),
vip_status: data.form.vip_status,
vip_values: parseInt(data.form.vip_values as string),
channel_status: encodeStatus(data.form.channel_status, data.form.channel_values),
channel_status: data.form.channel_status,
channel_values: JSON.stringify(data.form.channel_values),
} as any
//0
let isTrue = true
Object.keys(params).forEach((key) => {
if (key.includes('values') && key != 'vip_values' && key != 'channel_values') {
if (params[key] < 0) {
isTrue = false
return
}
}
})
if (!isTrue || params.refresh_times < 0) {
ElMessage.error('数值不能小于0')
return
}
const respond = await request.post(data.request.url, params)
@ -233,6 +327,7 @@ const decodeStatus = (combinedValue: number) => {
onMounted(async () => {
getRecord()
getChannelList()
})
</script>
@ -250,14 +345,13 @@ onMounted(async () => {
<el-table-column align="center" prop="remark" label="策略名称" />
<el-table-column align="center" prop="point_gear" label="控制挡位" />
<el-table-column align="center" prop="point_coin" label="控制金额" />
<el-table-column align="center" prop="lower_rate" label="浮动区间" >
<template #default="item">
{{ item.row.lower_rate }}% - {{ item.row.upper_rate }}%
</template>
<el-table-column align="center" prop="lower_rate" label="浮动区间">
<template #default="item"> {{ item.row.lower_rate }}% - {{ item.row.upper_rate }}% </template>
</el-table-column>
<el-table-column align="center" prop="loop_times" label="循环次数">
<template #default="item">{{ item.row.loop_times == -1 ? '∞' : item.row.loop_times }}</template>
<el-table-column align="center" prop="refresh_status" label="每天刷新">
<template #default="item">{{ item.row.refresh_status == 1 ? '是' : '否' }}</template>
</el-table-column>
<el-table-column align="center" prop="refresh_times" label="生效次数" />
<el-table-column align="center" prop="option" label="操作">
<template #default="item">
<el-button type="warning" size="small" @click="editBox(1, item.row)">编辑</el-button>
@ -297,11 +391,18 @@ onMounted(async () => {
</el-col>
</el-row>
</el-form-item>
<el-form-item label="循环次数" label-width="130" prop="loop_times">
<el-input v-model="data.form.loop_times" type="number"></el-input>
<p style="color: red; font-size: 12px">-1:不限; 0:不循环; >0循环次数</p>
<el-form-item label="每天刷新" label-width="130" prop="refresh_times">
<el-row class="full-select" justify="space-between">
<el-col :span="3">
<el-switch v-model="data.form.refresh_status" :active-value="1" :inactive-value="0"></el-switch>
</el-col>
<el-col :span="10">
<el-input v-model="data.form.refresh_times" type="number" placeholder="生效次数,0: 不生效"></el-input>
</el-col>
</el-row>
</el-form-item>
<el-form-item label="是否新用户" label-width="130" prop="">
<el-form-item label="新注册用户" label-width="130" prop="">
<el-row class="full-select" justify="space-between">
<el-col :span="3">
<el-switch v-model="data.form.new_register_status" :active-value="1" :inactive-value="0"></el-switch>
@ -316,10 +417,9 @@ onMounted(async () => {
/>
</el-select>
</el-col>
<el-col :span="10"></el-col>
</el-row>
</el-form-item>
<el-form-item label="用户今日输赢" label-width="130" prop="">
<el-form-item label="今日输赢" label-width="130" prop="">
<el-row class="full-select" justify="space-between">
<el-col :span="3">
<el-switch v-model="data.form.today_winlose_status" :active-value="1" :inactive-value="0"></el-switch>
@ -342,7 +442,7 @@ onMounted(async () => {
</template>
</el-row>
</el-form-item>
<el-form-item label="用户总输赢" label-width="130" prop="">
<el-form-item label="总输赢" label-width="130" prop="">
<el-row class="full-select" justify="space-between">
<el-col :span="3">
<el-switch v-model="data.form.total_winlose_status" :active-value="1" :inactive-value="0"></el-switch>
@ -364,7 +464,7 @@ onMounted(async () => {
</template>
</el-row>
</el-form-item>
<el-form-item label="用户今日充值" label-width="130" prop="">
<el-form-item label="今日充值" label-width="130" prop="">
<el-row class="full-select" justify="space-between">
<el-col :span="3">
<el-switch v-model="data.form.today_deposit_status" :active-value="1" :inactive-value="0"></el-switch>
@ -386,7 +486,7 @@ onMounted(async () => {
</template>
</el-row>
</el-form-item>
<el-form-item label="用户总充值" label-width="130" prop="">
<el-form-item label="总充值" label-width="130" prop="">
<el-row class="full-select" justify="space-between">
<el-col :span="3">
<el-switch v-model="data.form.total_deposit_status" :active-value="1" :inactive-value="0"></el-switch>
@ -408,7 +508,7 @@ onMounted(async () => {
</template>
</el-row>
</el-form-item>
<el-form-item label="用户今日提现" label-width="130" prop="">
<el-form-item label="今日提现" label-width="130" prop="">
<el-row class="full-select" justify="space-between">
<el-col :span="3">
<el-switch v-model="data.form.today_withdraw_status" :active-value="1" :inactive-value="0"></el-switch>
@ -430,7 +530,7 @@ onMounted(async () => {
</template>
</el-row>
</el-form-item>
<el-form-item label="用户总提现" label-width="130" prop="">
<el-form-item label="总提现" label-width="130" prop="">
<el-row class="full-select" justify="space-between">
<el-col :span="3">
<el-switch v-model="data.form.total_withdraw_status" :active-value="1" :inactive-value="0"></el-switch>
@ -452,7 +552,7 @@ onMounted(async () => {
</template>
</el-row>
</el-form-item>
<el-form-item label="今日中冲提差" label-width="130" prop="">
<el-form-item label="今日提差" label-width="130" prop="">
<el-row class="full-select" justify="space-between">
<el-col :span="3">
<el-switch v-model="data.form.today_surplus_status" :active-value="1" :inactive-value="0"></el-switch>
@ -474,7 +574,7 @@ onMounted(async () => {
</template>
</el-row>
</el-form-item>
<el-form-item label="用户提差" label-width="130" prop="">
<el-form-item label="总提差" label-width="130" prop="">
<el-row class="full-select" justify="space-between">
<el-col :span="3">
<el-switch v-model="data.form.total_surplus_status" :active-value="1" :inactive-value="0"></el-switch>
@ -541,7 +641,7 @@ onMounted(async () => {
</template>
</el-row>
</el-form-item>
<el-form-item label="用户VIP等级" label-width="130" prop="">
<el-form-item label="VIP等级" label-width="130" prop="">
<el-row class="full-select" justify="space-between">
<el-col :span="3">
<el-switch v-model="data.form.vip_status" :active-value="1" :inactive-value="0"></el-switch>
@ -554,16 +654,16 @@ onMounted(async () => {
</el-col>
</el-row>
</el-form-item>
<el-form-item label="用户进入渠道" label-width="130" prop="">
<el-form-item label="来源渠道" label-width="130" prop="">
<el-row class="full-select" justify="space-between">
<el-col :span="3">
<el-switch v-model="data.form.channel_status" :active-value="1" :inactive-value="0"></el-switch>
</el-col>
<template v-if="data.form.channel_status == 1">
<el-col :span="10">
<el-select v-model="data.form.channel_values" class="full-select">
<el-select v-model="data.form.channel_values" class="full-select" multiple clearable>
<el-option
v-for="item in data.options.section"
v-for="item in data.options.channel"
:key="item.value"
:label="item.label"
:value="item.value"

182
backmanage/src/views/person/risk/GameControllerList.vue

@ -11,125 +11,115 @@ import CustomPaginate from '@/components/common/CustomPaginate.vue'
const route = useRoute()
const data = reactive({
search: {
user_no: '',
cheat_type: 0,
channel_id: 0,
} as any,
options: {
control: optionsPointControl,
},
page: initPage,
result: {} as any,
dialog: false,
destroy: { show: false, nickname: '' },
form: {} as any,
loading: false,
search: {
user_no: '',
cheat_type: 0,
channel_id: 0,
} as any,
page: initPage,
result: {} as any,
dialog: false,
destroy: { show: false, nickname: '' },
form: {} as any,
loading: false,
})
const getRecord = async (page: number = 1) => {
data.loading = true
const params = {
user_no: data.search.user_no,
start_time: data.search.start_time,
end_time: data.search.end_time,
cheat_type: data.search.cheat_type,
channel_id: data.search.channel_id,
page: page,
limit: data.page.size,
}
const respond = await request.post('/person/gameControllerList', params)
data.loading = false
if (respond.code != 0) {
ElMessage.error(respond.msg)
return
}
data.loading = true
const params = {
user_no: data.search.user_no,
start_time: data.search.start_time,
end_time: data.search.end_time,
cheat_type: data.search.cheat_type,
channel_id: data.search.channel_id,
page: page,
limit: data.page.size,
}
const respond = await request.post('/person/gameControllerList', params)
data.loading = false
if (respond.code != 0) {
ElMessage.error(respond.msg)
return
}
data.result = respond.data
data.result = respond.data
}
const handleSearch = () => {
getRecord()
getRecord()
}
onMounted(() => {
if (route.query.user_no != undefined) {
data.search.user_no = route.query.user_no
}
if (route.query.user_no != undefined) {
data.search.user_no = route.query.user_no
}
getRecord()
getRecord()
})
</script>
<template>
<div class="full-page p-20 page-content" style="position: relative">
<el-row>
<el-col :span="21">
<el-form :inline="true">
<el-form-item label="玩家ID">
<el-input v-model="data.search.user_no"></el-input>
</el-form-item>
<el-form-item label="时间">
<el-date-picker
v-model="data.search.time_range"
style="width: 360px"
type="datetimerange"
format="YYYY-MM-DD HH:mm:ss"
value-format="YYYY-MM-DD HH:mm:ss"
></el-date-picker>
</el-form-item>
</el-form>
</el-col>
<el-col :span="3" class="text-right">
<el-button type="primary" @click="handleSearch" :icon="Search">查询</el-button>
</el-col>
</el-row>
<div class="full-page p-20 page-content" style="position: relative">
<el-row>
<el-col :span="21">
<el-form :inline="true">
<el-form-item label="玩家ID">
<el-input v-model="data.search.user_no"></el-input>
</el-form-item>
<el-form-item label="时间">
<el-date-picker
v-model="data.search.time_range"
style="width: 360px"
type="datetimerange"
format="YYYY-MM-DD HH:mm:ss"
value-format="YYYY-MM-DD HH:mm:ss"
></el-date-picker>
</el-form-item>
</el-form>
</el-col>
<el-col :span="3" class="text-right">
<el-button type="primary" @click="handleSearch" :icon="Search">查询</el-button>
</el-col>
</el-row>
<el-card class="mx-n10">
<el-table height="600" :data="data.result.data" v-loading="data.loading">
<el-table-column align="center" prop="id" label="ID" width="100">
<el-table-column align="center" prop="id" width="100"></el-table-column>
</el-table-column>
<el-table-column align="center" prop="user_no" label="玩家ID" width="100">
<template #default="item">
<router-link :to="`/person/details/${item.row.user_no}`">{{ item.row.user_no }}</router-link>
</template>
</el-table-column>
<el-table-column align="center" prop="nickname" label="昵称" />
<el-table-column align="center" prop="created_at" label="最后更新时间" />
<el-table-column align="center" prop="cheat_type" label="作弊率">
<template #default="item">
<template v-for="v in data.options.control">
<span v-if="v.value == item.row.cheat_type">{{ v.label }}</span>
</template>
</template>
</el-table-column>
<el-table-column align="center" prop="cheat_value" label="作弊值" >
<template #default="item">
<span :class="item.row.cheat_value <= 0 ? `lose-font` : 'win-font'">{{ item.row.cheat_value }}</span>
</template>
</el-table-column>
<el-table-column align="center" prop="cheat_value" label="点控状态">
<template #default="item">
<span v-if="item.row.cheat_value <= 0">已完成</span>
<span v-else>生效中</span>
</template>
</el-table-column>
<el-table-column align="center" prop="manager_name" label="操作人"/>
<el-table-column align="center" prop="remark" label="操作理由" width="300" />
</el-table>
</el-card>
<el-card class="mx-n10">
<el-table height="600" :data="data.result.data" v-loading="data.loading">
<el-table-column align="center" prop="id" label="ID" />
<el-table-column align="center" prop="user_no" label="玩家ID">
<template #default="item">
<router-link :to="`/person/details/${item.row.user_no}`">{{ item.row.user_no }}</router-link>
</template>
</el-table-column>
<el-table-column align="center" prop="nickname" label="昵称" />
<el-table-column align="center" prop="config_id" label="配置ID">
<template #default="item">
{{ item.row.config_id == 0 ? '-' : item.row.config_id }}
</template>
</el-table-column>
<el-table-column align="center" prop="remark" label="备注" />
<el-table-column align="center" prop="cheat_type" label="点控挡位" />
<el-table-column align="center" prop="cheat_value" label="点控数值" />
<el-table-column align="center" prop="run_times" label="运行次数" />
<el-table-column align="center" prop="finish_config_id" label="完成配置" />
<el-table-column align="center" prop="manager_name" label="操作人">
<template #default="item">
{{ item.row.manager_name == '' ? '系统' : item.row.manager_name }}
</template>
</el-table-column>
<el-table-column align="center" prop="created_at" label="最后更新时间" width="170" />
</el-table>
</el-card>
<CustomPaginate :size="data.page.size" :total="data.result.total" @new-page="(v) => getRecord(v)" />
</div>
<CustomPaginate :size="data.page.size" :total="data.result.total" @new-page="(v) => getRecord(v)" />
</div>
</template>
<style scoped>
::v-deep .el-scrollbar__bar.is-horizontal {
height: 15px !important;
height: 15px !important;
}
::v-deep .el-scrollbar__bar.is-vertical {
width: 15px !important;
width: 15px !important;
}
</style>

189
backmanage/src/views/person/risk/GameControllerLog.vue

@ -1,5 +1,4 @@
<script setup lang="ts">
import moment from 'moment'
import { onMounted, reactive } from 'vue'
import request from '@/api/config'
import { ElMessage } from 'element-plus'
@ -11,125 +10,121 @@ import CustomPaginate from '@/components/common/CustomPaginate.vue'
const route = useRoute()
const data = reactive({
search: {
user_no: '',
cheat_type: 0,
channel_id: 0,
} as any,
options: {
control: optionsPointControl,
},
page: initPage,
result: {} as any,
dialog: false,
destroy: { show: false, nickname: '' },
form: {} as any,
loading: false,
search: {
user_no: '',
cheat_type: 0,
channel_id: 0,
} as any,
options: {
control: optionsPointControl,
},
page: initPage,
result: {} as any,
dialog: false,
destroy: { show: false, nickname: '' },
form: {} as any,
loading: false,
})
const getRecord = async (page: number = 1) => {
data.loading = true
const params = {
user_no: data.search.user_no,
start_time: data.search.start_time,
end_time: data.search.end_time,
cheat_type: data.search.cheat_type,
channel_id: data.search.channel_id,
page: page,
limit: data.page.size,
}
const respond = await request.post('/person/gameControllerLog', params)
data.loading = false
if (respond.code != 0) {
ElMessage.error(respond.msg)
return
}
data.loading = true
const params = {
user_no: data.search.user_no,
start_time: data.search.start_time,
end_time: data.search.end_time,
cheat_type: data.search.cheat_type,
channel_id: data.search.channel_id,
page: page,
limit: data.page.size,
}
const respond = await request.post('/person/gameControllerLog', params)
data.loading = false
if (respond.code != 0) {
ElMessage.error(respond.msg)
return
}
data.result = respond.data
data.result = respond.data
}
const handleSearch = () => {
getRecord()
getRecord()
}
onMounted(() => {
if (route.query.user_no != undefined) {
data.search.user_no = route.query.user_no
}
if (route.query.user_no != undefined) {
data.search.user_no = route.query.user_no
}
getRecord()
getRecord()
})
</script>
<template>
<div class="full-page p-20 page-content" style="position: relative">
<el-row>
<el-col :span="21">
<el-form :inline="true">
<el-form-item label="玩家ID">
<el-input v-model="data.search.user_no"></el-input>
</el-form-item>
<el-form-item label="时间">
<el-date-picker
v-model="data.search.time_range"
style="width: 360px"
type="datetimerange"
format="YYYY-MM-DD HH:mm:ss"
value-format="YYYY-MM-DD HH:mm:ss"
></el-date-picker>
</el-form-item>
</el-form>
</el-col>
<el-col :span="3" class="text-right">
<el-button type="primary" @click="handleSearch" :icon="Search">查询</el-button>
</el-col>
</el-row>
<div class="full-page p-20 page-content" style="position: relative">
<el-row>
<el-col :span="21">
<el-form :inline="true">
<el-form-item label="玩家ID">
<el-input v-model="data.search.user_no"></el-input>
</el-form-item>
<el-form-item label="时间">
<el-date-picker
v-model="data.search.time_range"
style="width: 360px"
type="datetimerange"
format="YYYY-MM-DD HH:mm:ss"
value-format="YYYY-MM-DD HH:mm:ss"
></el-date-picker>
</el-form-item>
</el-form>
</el-col>
<el-col :span="3" class="text-right">
<el-button type="primary" @click="handleSearch" :icon="Search">查询</el-button>
</el-col>
</el-row>
<el-card class="mx-n10">
<el-table height="600" :data="data.result.data" v-loading="data.loading">
<el-table-column align="center" prop="id" label="ID" width="100">
<el-table-column align="center" prop="id" width="100"></el-table-column>
</el-table-column>
<el-table-column align="center" prop="user_no" label="玩家ID" width="100">
<template #default="item">
<router-link :to="`/person/details/${item.row.user_no}`">{{ item.row.user_no }}</router-link>
</template>
</el-table-column>
<el-table-column align="center" prop="nickname" label="昵称" />
<el-table-column align="center" prop="created_at" label="添加时间" />
<el-table-column align="center" prop="cheat_type" label="作弊率">
<template #default="item">
<template v-for="v in data.options.control">
<span v-if="v.value == item.row.cheat_type">{{ v.label }}</span>
</template>
</template>
</el-table-column>
<el-table-column align="center" prop="cheat_value" label="作弊值" >
<template #default="item">
<span :class="item.row.cheat_value <= 0 ? `lose-font` : 'win-font'">{{ item.row.cheat_value }}</span>
</template>
</el-table-column>
<el-table-column align="center" prop="cheat_value" label="点控状态">
<template #default="item">
<span v-if="item.row.status == 1">生效中</span>
<span v-if="item.row.status == 2">已失效</span>
</template>
</el-table-column>
<el-table-column align="center" prop="manager_name" label="操作人"/>
<el-table-column align="center" prop="remark" label="操作理由" width="300" />
</el-table>
</el-card>
<el-card class="mx-n10">
<el-table height="600" :data="data.result.data" v-loading="data.loading">
<el-table-column align="center" prop="id" label="ID"></el-table-column>
<el-table-column align="center" prop="user_no" label="玩家ID">
<template #default="item">
<router-link :to="`/person/details/${item.row.user_no}`">{{ item.row.user_no }}</router-link>
</template>
</el-table-column>
<el-table-column align="center" prop="nickname" label="昵称" />
<el-table-column align="center" prop="cheat_type" label="作弊率" />
<el-table-column align="center" prop="cheat_value" label="作弊值">
<template #default="item">
<span :class="item.row.cheat_value <= 0 ? `lose-font` : 'win-font'">{{ item.row.cheat_value }}</span>
</template>
</el-table-column>
<el-table-column align="center" prop="cheat_value" label="点控状态">
<template #default="item">
<span v-if="item.row.status == 1">生效中</span>
<span v-if="item.row.status == 2">已失效</span>
</template>
</el-table-column>
<el-table-column align="center" prop="manager_name" label="操作人">
<template #default="item">
{{ item.row.manager_name == '' ? '系统' : item.row.manager_name }}
</template>
</el-table-column>
<el-table-column align="center" prop="remark" label="操作理由" />
<el-table-column align="center" prop="created_at" label="时间" width="170" />
</el-table>
</el-card>
<CustomPaginate :size="data.page.size" :total="data.result.total" @new-page="(v) => getRecord(v)" />
</div>
<CustomPaginate :size="data.page.size" :total="data.result.total" @new-page="(v) => getRecord(v)" />
</div>
</template>
<style scoped>
::v-deep .el-scrollbar__bar.is-horizontal {
height: 15px !important;
height: 15px !important;
}
::v-deep .el-scrollbar__bar.is-vertical {
width: 15px !important;
width: 15px !important;
}
</style>

36
backmanage/src/views/person/risk/GameControllerRecord.vue

@ -30,17 +30,6 @@ const data = reactive({
loading: false,
})
//
const getChannelList = async () => {
const respond = await request.post('/person/channelList')
if (respond.code != 0) {
ElMessage.error(respond.msg)
return
}
data.options.channel = respond.data
}
const getRecord = async (page: number = 1) => {
data.loading = true
const params = {
@ -73,7 +62,6 @@ onMounted(async () => {
;[data.options.games, data.options.rooms] = await GamesRoomsInfo()
getChannelList()
getRecord()
})
</script>
@ -101,12 +89,6 @@ onMounted(async () => {
<el-option v-for="item in data.options.control" :label="item.label" :value="item.value"></el-option>
</el-select>
</el-form-item>
<el-form-item label="玩家来源">
<el-select v-model="data.search.channel_id">
<el-option label="全部" :value="0"></el-option>
<el-option v-for="item in data.options.channel" :label="item.Name" :value="item.Id"></el-option>
</el-select>
</el-form-item>
</el-form>
</el-col>
<el-col :span="3" class="text-right">
@ -117,15 +99,14 @@ onMounted(async () => {
<el-card class="mx-n10">
<el-table height="600" :data="data.result.data" v-loading="data.loading">
<el-table-column align="center" prop="id" label="ID" width="100" />
<el-table-column align="center" prop="created_at" label="时间" />
<el-table-column align="center" prop="user_no" label="玩家ID" width="100">
<template #default="item">
<router-link :to="`/person/details/${item.row.user_no}`">{{ item.row.user_no }}</router-link>
</template>
</el-table-column>
<el-table-column align="center" prop="nickname" label="昵称" />
<el-table-column align="center" prop="game_id" label="游戏名称" width="160">
<el-table-column align="center" prop="game_id" label="游戏场次" width="160">
<el-table-column align="center" prop="game_id" label="游戏名称">
<el-table-column align="center" prop="game_id" label="游戏场次">
<template #default="item">
<p v-for="v in data.options.games">
<span v-if="item.row.game_id == v.game_id" class="game-info">{{ v.game_name }}</span>
@ -136,8 +117,8 @@ onMounted(async () => {
</template>
</el-table-column>
</el-table-column>
<el-table-column align="center" prop="bet_amount" label="房间下注" width="100">
<el-table-column align="center" prop="bet_amount" label="玩家下注" width="100">
<el-table-column align="center" prop="bet_amount" label="房间下注">
<el-table-column align="center" prop="bet_amount" label="玩家下注">
<template #default="item">
<p>{{ item.row.bet_amount }}</p>
<p>{{ item.row.user_amount }}</p>
@ -150,16 +131,13 @@ onMounted(async () => {
<span v-else="item.row.win_amount > 0" class="win-font">{{ item.row.win_amount }}</span>
</template>
</el-table-column>
<el-table-column align="center" prop="cheat_type" label="作弊率" width="100">
<template #default="item">
<span>{{ item.row.cheat_type == 0 ? `-` : item.row.cheat_type }}</span>
</template>
</el-table-column>
<el-table-column align="center" prop="cheat_value" label="作弊值" width="165">
<el-table-column align="center" prop="cheat_type" label="作弊率" />
<el-table-column align="center" prop="cheat_value" label="作弊值">
<template #default="item">
<span :class="item.row.cheat_value <= 0 ? `lose-font` : 'win-font'">{{ item.row.cheat_value }}</span>
</template>
</el-table-column>
<el-table-column align="center" prop="created_at" label="时间" width="170" />
</el-table>
</el-card>

332
backmanage/src/views/userSearch/changeEmail.vue

@ -7,182 +7,172 @@ import CustomEditor from '@/components/common/CustomEditor.vue'
const emits = defineEmits(['closeBox'])
const props = defineProps(['user_no', 'gold', 'sendMode'])
const data = reactive({
options: [
{ label: '请选择', value: 0 },
{ label: '金币', value: 1 },
// { label: '', value: 2 },
// { label: '', value: 3 },
// { label: '', value: 4 },
] as any[],
form: {
user_no: props.user_no,
recipient: '[]',
append: [{ type: 0, num: '', rake: '' }] as any[], //[{num:2,type:1}]
title: [''],
content: [''],
timing: '',
send_mode: props.sendMode, // 0: 1
expire_num: '',
expire_type: 1,
},
emailNum: 1,
options: [
{ label: '请选择', value: 0 },
{ label: '金币', value: 1 },
] as any[],
form: {
user_no: props.user_no,
recipient: '[]',
append: [{ type: 0, num: '', rake: '' }] as any[], //[{num:2,type:1}]
title: [''],
content: [''],
timing: '',
send_mode: props.sendMode, // 0: 1
expire_num: '',
expire_type: 1,
},
emailNum: 1,
})
// const addProp = () => {
// data.form.append.push({ type: '', num: '' })
// }
// const delProp = () => {
// if (data.form.append.length == 0) return
// data.form.append.pop()
// }
const addEmail = () => {
data.form.title.push('')
data.form.content.push('')
data.form.title.push('')
data.form.content.push('')
}
const delEmail = () => {
if (data.form.title.length == 0) return
if (data.form.title.length == 0) return
data.form.title.pop()
data.form.content.pop()
data.form.title.pop()
data.form.content.pop()
}
//
const getExpireTime = () => {
let timestamp = 0
if (data.form.expire_type == 1) timestamp = 86400
if (data.form.expire_type == 2) timestamp = 3600
if (data.form.expire_type == 3) timestamp = 60
let timestamp = 0
if (data.form.expire_type == 1) timestamp = 86400
if (data.form.expire_type == 2) timestamp = 3600
if (data.form.expire_type == 3) timestamp = 60
return parseInt(data.form.expire_num) * timestamp
return parseInt(data.form.expire_num) * timestamp
}
const onSubmit = async () => {
if (data.form.expire_num <= '0') {
ElMessage.error('过期时间不能为空')
return
}
let appendProps = []
for (const index in data.form.append) {
if (data.form.append[index].type == 0) {
continue
} else {
if (data.form.append[index].num == '' || data.form.append[index].num < 1000) {
ElMessage.error('道具数量不能小于1000')
if (data.form.expire_num <= '0') {
ElMessage.error('过期时间不能为空')
return
}
}
if (props.sendMode == 1 && data.form.user_no != '') {
ElMessage.error('玩家ID不能为空')
return
}
if (data.form.append[index].rake == '' || data.form.append[index].rake < 0) {
ElMessage.error('打码数量不能小于0')
let appendProps = []
for (const index in data.form.append) {
if (data.form.append[index].type == 0) {
continue
} else {
if (data.form.append[index].num == '' || data.form.append[index].num < 1000) {
ElMessage.error('道具数量不能小于1000')
return
}
if (data.form.append[index].rake == '' || data.form.append[index].rake < 0) {
ElMessage.error('打码数量不能小于0')
return
}
}
appendProps.push({
type: data.form.append[index].type,
num: parseInt(data.form.append[index].num),
rake: parseInt(data.form.append[index].rake),
})
}
let params = {
type: data.form.send_mode,
title: data.form.title,
content: data.form.content,
timing: '',
append: JSON.stringify(appendProps),
recipient: '[]',
expire: getExpireTime(),
}
if (props.sendMode == 1) params.recipient = JSON.stringify([parseInt(data.form.user_no)])
const respond = await request.post('/person/sendEmail', params)
if (respond.code != 0) {
ElMessage.error(respond.msg)
return
}
}
appendProps.push({ type: data.form.append[index].type, num: parseInt(data.form.append[index].num), rake: parseInt(data.form.append[index].rake) })
}
let params = {
type: data.form.send_mode,
title: data.form.title,
content: data.form.content,
timing: '',
append: JSON.stringify(appendProps),
recipient: '[]',
expire: getExpireTime(),
}
//
if (data.form.send_mode == 2) {
console.log(data.form.user_no)
if (data.form.user_no == null || data.form.user_no == '') {
ElMessage.error('玩家ID不能为空')
return
ElMessage.success('操作成功')
data.form = {
user_no: props.user_no,
recipient: '[]',
append: [{ type: 0, num: '', rake: '' }] as any[], //[{num:2,type:1}]
title: [''],
content: [''],
timing: '',
send_mode: props.sendMode, // 0: 1
expire_num: '',
expire_type: 1,
}
params.recipient = JSON.stringify([parseInt(data.form.user_no)])
}
const respond = await request.post('/person/sendEmail', params)
if (respond.code != 0) {
ElMessage.error(respond.msg)
return
}
ElMessage.success('操作成功')
data.form = {
user_no: props.user_no,
recipient: '[]',
append: [{ type: 0, num: '', rake: '' }] as any[], //[{num:2,type:1}]
title: [''],
content: [''],
timing: '',
send_mode: props.sendMode, // 0: 1
expire_num: '',
expire_type: 1,
}
emits('closeBox', false)
emits('closeBox', false)
}
watch(() => props.user_no, (v) => {
data.form.user_no = v
})
watch(
() => props.user_no,
(v) => {
data.form.user_no = v
}
)
</script>
<template>
<el-form>
<el-form-item label="收件人" label-width="100">
<el-select v-model="data.form.send_mode" :disabled="props.user_no != undefined ? true : false"
style="width: 100%">
<el-option label="所有玩家" :value="1"></el-option>
<el-option label="指定玩家" :value="2"></el-option>
</el-select>
</el-form-item>
<el-form-item v-if="data.form.send_mode == 2" label="玩家ID" label-width="100">
<el-input v-model="data.form.user_no"></el-input>
</el-form-item>
<div v-for="(item, index) in data.form.title">
<el-form-item :label="`邮件标题${index + 1}`" label-width="100">
<el-input v-model="data.form.title[index]"></el-input>
</el-form-item>
<el-form-item :label="`邮件内容${index + 1}`" label-width="100">
<CustomEditor :content="data.form.content[index]" @update-content="(v) => (data.form.content[index] = v)" />
</el-form-item>
</div>
<el-form-item label="" label-width="100">
<el-row justify="space-between" style="width: 100%">
<el-col>
<el-button type="primary" @click="addEmail">添加多语言</el-button>
</el-col>
<el-col>
<el-button v-if="data.form.title.length > 1" type="danger" @click="delEmail">删除多语言</el-button>
</el-col>
</el-row>
</el-form-item>
<el-form-item label="发送道具" label-width="100">
<el-card shadow="never" style="width: 100%">
<el-form v-for="(item, index) in data.form.append" :key="index">
<p class="tip-font">客户端金币比例为 1: 1000</p>
<el-form-item>
<el-select v-model="item.type" style="width: 100%" class="mb-10">
<el-option v-for="item in data.options" :label="item.label" :value="item.value"></el-option>
<el-form>
<el-form-item label="收件人" label-width="100">
<el-select v-model="data.form.send_mode" :disabled="props.user_no != undefined ? true : false" style="width: 100%">
<el-option label="所有玩家" :value="1"></el-option>
<el-option label="指定玩家" :value="2"></el-option>
</el-select>
</el-form-item>
<el-form-item>
<el-input v-model="item.num" style="width: 100%" class="mb-10" type="number" placeholder="道具数量"></el-input>
</el-form-item>
<el-form-item>
<el-input v-model="item.rake" style="width: 100%" class="mb-10" type="number" placeholder="打码数量"></el-input>
</el-form-item>
</el-form>
<!-- <el-row justify="space-between">
</el-form-item>
<el-form-item v-if="data.form.send_mode == 2" label="玩家ID" label-width="100">
<el-input v-model="data.form.user_no"></el-input>
</el-form-item>
<div v-for="(item, index) in data.form.title">
<el-form-item :label="`邮件标题${index + 1}`" label-width="100">
<el-input v-model="data.form.title[index]"></el-input>
</el-form-item>
<el-form-item :label="`邮件内容${index + 1}`" label-width="100">
<CustomEditor :content="data.form.content[index]" @update-content="(v) => (data.form.content[index] = v)" />
</el-form-item>
</div>
<el-form-item label="" label-width="100">
<el-row justify="space-between" style="width: 100%">
<el-col>
<el-button type="primary" @click="addEmail">添加多语言</el-button>
</el-col>
<el-col>
<el-button v-if="data.form.title.length > 1" type="danger" @click="delEmail">删除多语言</el-button>
</el-col>
</el-row>
</el-form-item>
<el-form-item label="发送道具" label-width="100">
<el-card shadow="never" style="width: 100%">
<el-form v-for="(item, index) in data.form.append" :key="index">
<p class="tip-font">客户端金币比例为 1: 1000</p>
<el-form-item>
<el-select v-model="item.type" style="width: 100%" class="mb-10">
<el-option v-for="item in data.options" :label="item.label" :value="item.value"></el-option>
</el-select>
</el-form-item>
<el-form-item>
<el-input v-model="item.num" style="width: 100%" class="mb-10" type="number" placeholder="道具数量"></el-input>
</el-form-item>
<el-form-item>
<el-input v-model="item.rake" style="width: 100%" class="mb-10" type="number" placeholder="打码数量"></el-input>
</el-form-item>
</el-form>
<!-- <el-row justify="space-between">
<el-col :span="2">
<el-button :icon="Plus" type="primary" circle @click="addProp"></el-button>
</el-col>
@ -190,23 +180,23 @@ watch(() => props.user_no, (v) => {
<el-button :icon="Minus" type="danger" circle @click="delProp"></el-button>
</el-col>
</el-row> -->
</el-card>
</el-form-item>
<el-form-item label="过期时间" label-width="100">
<el-row>
<el-col :span="18" style="margin-right: 5px">
<el-input v-model="data.form.expire_num" type="number"></el-input>
</el-col>
<el-col :span="5">
<el-select v-model="data.form.expire_type" style="width: 100%" class="mb-10">
<el-option label="天" :value="1"></el-option>
<el-option label="时" :value="2"></el-option>
<el-option label="分" :value="3"></el-option>
</el-select>
</el-col>
</el-row>
</el-form-item>
<!-- <el-form-item label="发送时间" label-width="100">
</el-card>
</el-form-item>
<el-form-item label="过期时间" label-width="100">
<el-row>
<el-col :span="18" style="margin-right: 5px">
<el-input v-model="data.form.expire_num" type="number"></el-input>
</el-col>
<el-col :span="5">
<el-select v-model="data.form.expire_type" style="width: 100%" class="mb-10">
<el-option label="天" :value="1"></el-option>
<el-option label="时" :value="2"></el-option>
<el-option label="分" :value="3"></el-option>
</el-select>
</el-col>
</el-row>
</el-form-item>
<!-- <el-form-item label="发送时间" label-width="100">
<el-date-picker
v-model="data.form.timing"
type="datetime"
@ -215,9 +205,9 @@ watch(() => props.user_no, (v) => {
style="width: 100%"
></el-date-picker>
</el-form-item> -->
<div class="paginate-center">
<el-button type="primary" @click="$emit('closeBox', false)">取消</el-button>
<el-button type="danger" @click="onSubmit">确定</el-button>
</div>
</el-form>
<div class="paginate-center">
<el-button type="primary" @click="$emit('closeBox', false)">取消</el-button>
<el-button type="danger" @click="onSubmit">确定</el-button>
</div>
</el-form>
</template>

28
backmanage/src/views/userSearch/changeGameController.vue

@ -10,20 +10,14 @@ const data = reactive({
form: {
uid: props.uid,
user_no: props.user_no,
cheat_type: 0,
cheat_type: 1000,
cheat_value: "",
remark: "",
cheat_name: "",
},
options: {
cheat_type: optionsPointControl,
games: [] as any,
room: [
{ value: 0, label: "初级场" },
{ value: 1, label: "中级场" },
{ value: 2, label: "高级场" },
],
},
currentCheatValue: 0,
})
@ -35,20 +29,15 @@ const getPointControl = async () => {
return
}
for (const item of data.options.cheat_type) {
if (item.value == respond.data.cheat_type) {
data.form.cheat_name = item.label
break
}
}
data.form.cheat_type = respond.data.cheat_type
data.form.cheat_value = respond.data.cheat_value
data.form.remark = respond.data.remark
data.currentCheatValue = respond.data.cheat_value
}
const clearPointControl = () => {
data.form.cheat_name = ""
data.form.cheat_type = 1000
data.form.cheat_value = ""
data.form.remark = ""
}
@ -60,13 +49,13 @@ const onSubmit = async () => {
}
//4
if (data.form.cheat_type <= 4 && parseInt(data.form.cheat_value) > 0) {
if (data.form.cheat_type > 0 && parseInt(data.form.cheat_value) > 0) {
ElMessage.error("点控输作弊值必须小于0")
return
}
//4
if (data.form.cheat_type > 4 && parseInt(data.form.cheat_value) < 0) {
if (data.form.cheat_type < 0 && parseInt(data.form.cheat_value) < 0) {
ElMessage.error("点控赢作弊值必须大于0")
return
}
@ -112,7 +101,8 @@ onMounted(() => {
<el-input :value="data.form.user_no" disabled></el-input>
</el-form-item>
<el-form-item label="当前作弊情况" label-width="100">
<el-input :value="`挡位 ${data.form.cheat_name} 剩余值 ${data.form.cheat_value}`" disabled></el-input>
<el-input v-if="data.currentCheatValue == 0" :value="`-`" disabled></el-input>
<el-input v-else :value="`挡位 ${data.form.cheat_type} 剩余值 ${data.form.cheat_value}`" disabled></el-input>
</el-form-item>
<el-form-item label="新赠作弊率" label-width="100">
<el-select v-model="data.form.cheat_type" style="width: 100%;">

2
backmanage/src/views/userSearch/details.vue

@ -378,7 +378,7 @@ onMounted(() => {
</template>
<template v-if="data.dialog.action == 5">
<ChangeEmail :user_no="data.result.user_no" :gold="data.result.gold" :send-mode="2"
<ChangeEmail :user_no="data.result.user_no" :gold="data.result.gold" :send-mode="1"
@close-box="closeBox" />
</template>

2
backmanage/stats.html

File diff suppressed because one or more lines are too long
Loading…
Cancel
Save