sprint 8 months ago
parent
commit
0dd88915de
  1. 14
      backmanage/custom-types.d.ts
  2. 17
      backmanage/package-lock.json
  3. 1
      backmanage/package.json
  4. 2
      backmanage/src/api/module/common_params.ts
  5. 47
      backmanage/src/components/common/CustomEditor.vue
  6. 69
      backmanage/src/views/betRecord/index.vue
  7. 231
      backmanage/src/views/userSearch/changeEmail.vue
  8. 3
      backmanage/src/views/userSearch/details.vue
  9. 2
      backmanage/stats.html

14
backmanage/custom-types.d.ts

@ -0,0 +1,14 @@
import { SlateDescendant, SlateElement, SlateText } from '@wangeditor/editor'
declare module '@wangeditor/editor' {
// 扩展 Text
interface SlateText {
text: string
}
// 扩展 Element
interface SlateElement {
type: string
children: SlateDescendant[]
}
}

17
backmanage/package-lock.json

@ -11,6 +11,7 @@
"@vueuse/components": "^10.2.1",
"@vueuse/core": "^10.1.2",
"@wangeditor/editor": "^5.1.23",
"@wangeditor/editor-for-vue": "^5.1.12",
"axios": "^1.4.0",
"decimal.js": "^10.4.3",
"echarts": "^5.4.2",
@ -1953,6 +1954,16 @@
"snabbdom": "^3.1.0"
}
},
"node_modules/@wangeditor/editor-for-vue": {
"version": "5.1.12",
"resolved": "https://registry.npmjs.org/@wangeditor/editor-for-vue/-/editor-for-vue-5.1.12.tgz",
"integrity": "sha512-0Ds3D8I+xnpNWezAeO7HmPRgTfUxHLMd9JKcIw+QzvSmhC5xUHbpCcLU+KLmeBKTR/zffnS5GQo6qi3GhTMJWQ==",
"license": "MIT",
"peerDependencies": {
"@wangeditor/editor": ">=5.1.0",
"vue": "^3.0.5"
}
},
"node_modules/@wangeditor/list-module": {
"version": "1.0.5",
"resolved": "https://registry.npmjs.org/@wangeditor/list-module/-/list-module-1.0.5.tgz",
@ -7077,6 +7088,12 @@
"snabbdom": "^3.1.0"
}
},
"@wangeditor/editor-for-vue": {
"version": "5.1.12",
"resolved": "https://registry.npmjs.org/@wangeditor/editor-for-vue/-/editor-for-vue-5.1.12.tgz",
"integrity": "sha512-0Ds3D8I+xnpNWezAeO7HmPRgTfUxHLMd9JKcIw+QzvSmhC5xUHbpCcLU+KLmeBKTR/zffnS5GQo6qi3GhTMJWQ==",
"requires": {}
},
"@wangeditor/list-module": {
"version": "1.0.5",
"resolved": "https://registry.npmjs.org/@wangeditor/list-module/-/list-module-1.0.5.tgz",

1
backmanage/package.json

@ -15,6 +15,7 @@
"@vueuse/components": "^10.2.1",
"@vueuse/core": "^10.1.2",
"@wangeditor/editor": "^5.1.23",
"@wangeditor/editor-for-vue": "^5.1.12",
"axios": "^1.4.0",
"decimal.js": "^10.4.3",
"echarts": "^5.4.2",

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

@ -2,7 +2,7 @@ import { GameList } from './common'
export const initPage = {
current: 1,
size: 20,
size: 100,
}
//点控类型

47
backmanage/src/components/common/CustomEditor.vue

@ -0,0 +1,47 @@
<script setup lang="ts">
import { onMounted, reactive, onBeforeUnmount, ref, shallowRef } from 'vue'
import '@wangeditor/editor/dist/css/style.css' // css
import { Editor, Toolbar } from '@wangeditor/editor-for-vue'
const emits = defineEmits(["updateContent"])
const data = reactive({
content: '',
})
//
const toolbarConfig = {}
const editorConfig = {}
const editorRef = shallowRef()
//
onBeforeUnmount(() => {
const editor = editorRef.value
if (editor == null) return
editor.destroy()
})
const handleCreated = (editor) => {
editorRef.value = editor // editor
}
const handleChange = () => {
emits("updateContent", data.content)
}
</script>
<template>
<div style="border: 1px solid #ccc">
<Toolbar style="border-bottom: 1px solid #ccc" :editor="editorRef" :defaultConfig="toolbarConfig" mode="simple" />
<Editor
style="height: 300px; overflow-y: hidden"
v-model="data.content"
:defaultConfig="editorConfig"
mode="simple"
@onCreated="handleCreated"
@onChange="handleChange"
/>
</div>
</template>

69
backmanage/src/views/betRecord/index.vue

@ -29,13 +29,7 @@ const data = reactive({
{ id: 24, title: '月卡', value: 0 },
{ id: 13, title: '邮件', value: 0 },
{ id: 18, title: 'GM充值', value: 0 },
{ id: 100, title: '3Partti-初级场', value: 0 },
{ id: 200, title: '龙虎-初级场', value: 0 },
{ id: 101, title: '3Partti-中级场', value: 0 },
{ id: 201, title: '龙虎-中级场', value: 0 },
{ id: 102, title: '3Partti-高级场', value: 0 },
{ id: 202, title: '龙虎-高级场', value: 0 },
{ id: 1000, title: '总变化', value: 0 },
//{ id: 1000, title: '', value: 0 },
] as any[],
recordResult: {
data: [],
@ -105,10 +99,11 @@ const getBetRecord = async (page: number = 1) => {
item.area_info = `<p>龙: ${areaArr.dragon}</p> <p>虎: ${areaArr.tiger}</p> <p>和: ${areaArr.tie}</p>`
}
}
console.log(data.recordResult.data)
}
const handleSearch = () => {
if (data.search.user_no != '') {
getBetReview()
}
@ -123,6 +118,16 @@ onMounted(async () => {
;[data.options.games, data.options.rooms] = await GamesRoomsInfo()
console.log(data.options.games)
//
for (const game of data.options.games) {
for (const room of game.rooms_info) {
const label = game.game_id.toString() + room.room_id.toString()
data.reviewResult.push({ id: parseInt(label), title: game.game_name+ '-' + room.room_name, value: 0 })
}
}
console.log(data.reviewResult)
getBetRecord()
})
</script>
@ -135,24 +140,28 @@ onMounted(async () => {
<el-form-item label="玩家ID">
<el-input v-model="data.search.user_no"></el-input>
</el-form-item>
<el-form-item label="游戏类型">
<el-select v-model="data.search.game_id" @change="() => (data.search.room_id = '')">
<el-option label="全部" :value="0"></el-option>
<el-option v-for="item in data.options.games" :label="item.game_name" :value="item.game_id"></el-option>
</el-select>
</el-form-item>
<el-form-item label="房间类型">
<el-select v-model="data.search.room_id">
<el-option label="全部" value=""></el-option>
<template v-if="data.options.rooms[data.search.game_id] != undefined">
<el-option
v-for="item in data.options.rooms[data.search.game_id]"
:label="item.room_name"
:value="item.room_id"
></el-option>
</template>
</el-select>
</el-form-item>
<template v-if="data.tabs == '1'">
<el-form-item label="游戏类型">
<el-select v-model="data.search.game_id" @change="() => (data.search.room_id = '')">
<el-option label="全部" :value="0"></el-option>
<el-option v-for="item in data.options.games" :label="item.game_name" :value="item.game_id"></el-option>
</el-select>
</el-form-item>
<el-form-item label="房间类型">
<el-select v-model="data.search.room_id">
<el-option label="全部" value=""></el-option>
<template v-if="data.options.rooms[data.search.game_id] != undefined">
<el-option
v-for="item in data.options.rooms[data.search.game_id]"
:label="item.room_name"
:value="item.room_id"
></el-option>
</template>
</el-select>
</el-form-item>
</template>
<el-form-item label="时间">
<el-date-picker
v-model="data.search.time_range"
@ -175,10 +184,10 @@ onMounted(async () => {
<el-table height="600" :data="data.recordResult.data">
<el-table-column align="center" prop="id" label="ID" width="60" />
<el-table-column align="center" prop="user_no" label="玩家ID" width="100">
<template #default="item">
<router-link :to="`/person/details/${item.row.user_id}`">{{ item.row.user_no }}</router-link>
</template>
</el-table-column>
<template #default="item">
<router-link :to="`/person/details/${item.row.user_id}`">{{ item.row.user_no }}</router-link>
</template>
</el-table-column>
<el-table-column align="center" prop="game_id" label="游戏名称" width="150">
<el-table-column align="center" prop="game_id" label="游戏场次" width="160">
<template #default="item">

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

@ -1,122 +1,151 @@
<script setup lang="ts">
import { onMounted, reactive } from 'vue';
import request from "@/api/config";
import { ElMessage } from "element-plus";
import { onMounted, reactive, onBeforeUnmount, ref } from 'vue'
import request from '@/api/config'
import { ElMessage } from 'element-plus'
import { Plus, Minus } from '@element-plus/icons-vue'
import CustomEditor from '@/components/common/CustomEditor.vue'
const emits = defineEmits(["closeBox"])
const props = defineProps(["uid", "user_no", "gold", "diamonds", "pid", "channel_name"])
const emits = defineEmits(['closeBox'])
const props = defineProps(['uid', 'user_no', 'gold', 'diamonds', 'pid', 'channel_name'])
const data = reactive({
options: [
{ label: "金币", value: 1 },
{ label: "钻石", value: 2 },
{ label: "点券", value: 3 },
{ label: "道具", value: 4 },
] as any[],
form: {
recipient: [parseInt(props.user_no)],
append: [] as any[], //[{num:2,type:1}]
title: "",
content: "",
timing: "",
},
options: [
{ label: '金币', value: 1 },
{ label: '钻石', value: 2 },
{ label: '点券', value: 3 },
{ label: '道具', value: 4 },
] as any[],
form: {
recipient: [parseInt(props.user_no)],
append: [] as any[], //[{num:2,type:1}]
title: [''],
content: [''],
timing: '',
},
emailNum: 1,
})
const addProp = () => {
data.form.append.push({ type: "", num: "" })
data.form.append.push({ type: '', num: '' })
}
const delProp = () => {
if (data.form.append.length == 0) return
if (data.form.append.length == 0) return
data.form.append.pop()
data.form.append.pop()
}
const onSubmit = async () => {
for (const index in data.form.append) {
if (data.form.append[index].type == "" || data.form.append[index].num == "") {
ElMessage.error("道具不能为空")
return
}
if (data.form.append[index].type == 1 && data.form.append[index].num < 1) {
ElMessage.error("金币不能小于1000")
return
}
data.form.append[index].num = parseInt(data.form.append[index].num)
}
const addEmail = () => {
data.form.title.push('')
data.form.content.push('')
}
const params = {
id: props.uid,
recipient: JSON.stringify(data.form.recipient),
title: data.form.title,
content: data.form.content,
timing: data.form.timing,
type: 2,
append: JSON.stringify(data.form.append)
}
const respond = await request.post("/person/sendEmail", params)
if (respond.code != 0) {
ElMessage.error(respond.msg)
return
}
const delEmail = () => {
if (data.form.title.length == 0) return
ElMessage.success("操作成功")
emits("closeBox", false)
data.form.title.pop()
data.form.content.pop()
}
const onSubmit = async () => {
for (const index in data.form.append) {
if (data.form.append[index].type == '' || data.form.append[index].num == '') {
ElMessage.error('道具不能为空')
return
}
if (data.form.append[index].type == 1 && data.form.append[index].num < 1) {
ElMessage.error('金币不能小于1000')
return
}
data.form.append[index].num = parseInt(data.form.append[index].num)
}
const params = {
user_id: props.uid,
recipient: JSON.stringify(data.form.recipient),
title: data.form.title,
content: data.form.content,
timing: data.form.timing,
type: 2,
append: JSON.stringify(data.form.append),
}
const respond = await request.post('/person/sendEmail', params)
if (respond.code != 0) {
ElMessage.error(respond.msg)
return
}
ElMessage.success('操作成功')
emits('closeBox', false)
}
</script>
<template>
<el-form>
<el-form-item label="玩家ID" label-width="100">
<el-input :value="props.user_no" disabled></el-input>
</el-form-item>
<el-form-item label="玩家拥有资产" label-width="100">
<el-input :value="`金币 ${props.gold}`" disabled></el-input>
</el-form-item>
<el-form-item label="邮件标题" label-width="100">
<el-input v-model="data.form.title"></el-input>
</el-form-item>
<el-form-item label="邮件内容" label-width="100">
<el-input v-model="data.form.content" type="textarea" :rows="5" />
</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"></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>
<el-col :span="2">
<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-date-picker v-model="data.form.timing" type="datetime" format="YYYY-MM-DD HH:mm:ss"
value-format="YYYY-MM-DD HH:mm:ss" 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>
</template>
<el-form>
<el-form-item label="玩家ID" label-width="100">
<el-input :value="props.user_no" disabled></el-input>
</el-form-item>
<el-form-item label="玩家拥有资产" label-width="100">
<el-input :value="`金币 ${props.gold}`" disabled></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">
<!-- <el-input v-model="data.form.content" type="textarea" :rows="5" /> -->
<CustomEditor @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 :span="2">
<el-button :icon="Plus" type="primary" circle @click="addEmail"></el-button>
</el-col>
<el-col :span="2">
<el-button :icon="Minus" type="danger" circle @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"></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>
<el-col :span="2">
<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-date-picker
v-model="data.form.timing"
type="datetime"
format="YYYY-MM-DD HH:mm:ss"
value-format="YYYY-MM-DD HH:mm:ss"
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>
</template>

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

@ -200,7 +200,7 @@ onMounted(() => {
<el-col>
<el-row justify="space-between">
<el-col :span="4" class="text-left">
<el-button type="success" size="large" @click="() => router.push(`/person/loginLog?user_no=${data.result.user_no}`)"
<el-button class="btn-info" type="success" size="large" @click="() => router.push(`/person/loginLog?user_no=${data.result.user_no}`)"
>登录查询</el-button
>
</el-col>
@ -424,5 +424,6 @@ onMounted(() => {
.alert-box >>> button {
width: 138px;
font-size: 20px;
}
</style>

2
backmanage/stats.html

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