Browse Source

email

master
sprint 8 months ago
parent
commit
b0cbf726ce
  1. 2
      .gitignore
  2. 36
      backmanage/src/components/common/CustomEditor.vue
  3. 4
      backmanage/src/views/betRecord/index.vue
  4. 219
      backmanage/src/views/person/records/Email.vue
  5. 55
      backmanage/src/views/userSearch/changeEmail.vue
  6. 14
      backmanage/src/views/userSearch/details.vue
  7. 2
      backmanage/stats.html

2
.gitignore

@ -11,3 +11,5 @@ test/
dist/
backmanage/dist.zip
backmanage/stats.html

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

@ -1,10 +1,14 @@
<script setup lang="ts">
import { onMounted, reactive, onBeforeUnmount, ref, shallowRef } from 'vue'
import { useGlobalStore } from '@/store/modules/global'
const { token, language } = useGlobalStore()
import '@wangeditor/editor/dist/css/style.css' // css
import { Editor, Toolbar } from '@wangeditor/editor-for-vue'
import { ElMessage } from 'element-plus'
const emits = defineEmits(["updateContent"])
const emits = defineEmits(['updateContent'])
const data = reactive({
content: '',
@ -12,7 +16,31 @@ const data = reactive({
//
const toolbarConfig = {}
const editorConfig = {}
const editorConfig = {
MENU_CONF: {
uploadImage: {
server: import.meta.env.VITE_API + '/person/uploadFile',
fieldName: 'file',
headers: {
Authorization: 'Bearer ' + token,
'Accept-Language': language,
},
maxFileSize: 1 * 1024 * 1024, // 1M
onSuccess(file: File, res: any) {
console.log(`${file.name} 上传成功`, res)
},
onFailed(file: File, res: any) {
console.log(res)
ElMessage.error('上传文件失败:' + res)
},
onError(file: File, err: any, res: any) {
console.log(err)
ElMessage.error('上传文件失败:' + err)
},
},
},
}
const editorRef = shallowRef()
@ -23,12 +51,12 @@ onBeforeUnmount(() => {
editor.destroy()
})
const handleCreated = (editor) => {
const handleCreated = (editor: any) => {
editorRef.value = editor // editor
}
const handleChange = () => {
emits("updateContent", data.content)
emits('updateContent', data.content)
}
</script>

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

@ -70,7 +70,6 @@ const getBetReview = async () => {
}
}
data.reviewResult.at(-1).value = sum
}
//
@ -118,7 +117,6 @@ 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) {
@ -127,7 +125,7 @@ onMounted(async () => {
data.reviewResult.push({ id: parseInt(label), title: game.game_name+ '-' + room.room_name, value: 0 })
}
}
console.log(data.reviewResult)
getBetRecord()
})
</script>

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

@ -1,133 +1,150 @@
<script setup lang="ts">
import moment from 'moment';
import { onMounted, reactive } from 'vue';
import request from "@/api/config";
import { ElMessage } from 'element-plus';
import moment from 'moment'
import { onMounted, reactive } from 'vue'
import request from '@/api/config'
import { ElMessage } from 'element-plus'
import { Search } from '@element-plus/icons-vue'
import { useRoute } from 'vue-router'
import { initPage } from '@/api/module/common_params';
import CustomPaginate from "@/components/common/CustomPaginate.vue"
import { initPage } from '@/api/module/common_params'
import CustomPaginate from '@/components/common/CustomPaginate.vue'
import ChangeEmail from '@/views/userSearch/changeEmail.vue'
const route = useRoute()
const data = reactive({
search: {
user_no: "",
time_range: [],
} as any,
page: initPage,
result: {} as any
search: {
user_no: '',
time_range: [],
} as any,
page: initPage,
result: {} as any,
form: {},
dialog: false,
})
const getRecord = async (page: number = 1) => {
const params = {
user_no: data.search.user_no,
start_time: data.search.time_range[0],
end_time: data.search.time_range[1],
page: page,
limit: data.page.size
}
const respond = await request.post("/person/emailList", params)
if (respond.code != 0) {
ElMessage.error(respond.msg)
return
}
data.result = respond.data
for (const index in data.result.data) data.result.data[index].append_data = JSON.parse(data.result.data[index].append)
const params = {
user_no: data.search.user_no,
start_time: data.search.time_range[0],
end_time: data.search.time_range[1],
page: page,
limit: data.page.size,
}
const respond = await request.post('/person/emailList', params)
if (respond.code != 0) {
ElMessage.error(respond.msg)
return
}
data.result = respond.data
for (const index in data.result.data) data.result.data[index].append_data = JSON.parse(data.result.data[index].append)
}
const showBox = (action: number, item: any) => {
if (action == 0) {
data.form = {}
}
data.dialog = true
}
const handleCurrentChange = (val: number) => {
getRecord(val)
const closeBox = (v: boolean) => {
data.dialog = v
getRecord()
}
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>
<el-card class="mx-n10">
<el-table height="630" :data="data.result.data">
<el-table-column align="center" prop="id" label="ID" width="100" />
<el-table-column align="center" prop="mail_type" label="邮件类型" width="100">
<template #default="item">
<p v-if="item.row.mail_type == 1">群发</p>
<p v-if="item.row.mail_type == 2">单发</p>
</template>
</el-table-column>
<el-table-column align="center" prop="recipient" label="收件人" width="150">
<template #default="item">
<p v-if="item.row.mail_type == 2">
{{ JSON.parse(item.row.recipient).join(",") }}
</p>
<p v-else>-</p>
</template>
</el-table-column>
<el-table-column align="center" prop="title" label="标题" width="150" />
<el-table-column align="center" prop="content" label="内容" />
<el-table-column align="center" prop="append_data" label="附件" width="200">
<template #default="item">
<p v-for="v in item.row.append_data">
<span v-if="v.type == 1">{{ `金币(${v.num})` }}</span>
</p>
</template>
</el-table-column>
<el-table-column align="center" prop="send_time" label="定发时间" width="200">
<template #default="item">
<p v-if="item.row.send_time == ''">即时</p>
<p v-else>{{ item.row.send_time }}</p>
</template>
</el-table-column>
<el-table-column align="center" prop="create_time" label="创建时间" width="200" />
</el-table>
</el-card>
<CustomPaginate :size="data.page.size" :total="data.result.total" @new-page="(v) => getRecord(v)" />
</div>
<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-col class="mb-10">
<el-button type="success" size="small" @click="showBox(0, null)">添加</el-button>
</el-col>
</el-row>
<el-card class="mx-n10">
<el-table height="600" :data="data.result.data">
<el-table-column align="center" prop="id" label="ID" width="100" />
<el-table-column align="center" prop="mail_type" label="邮件类型" width="100">
<template #default="item">
<p v-if="item.row.mail_type == 1">群发</p>
<p v-if="item.row.mail_type == 2">单发</p>
</template>
</el-table-column>
<el-table-column align="center" prop="recipient" label="收件人" width="150">
<template #default="item">
<p v-if="item.row.mail_type == 2">
{{ JSON.parse(item.row.recipient).join(',') }}
</p>
<p v-else>-</p>
</template>
</el-table-column>
<el-table-column align="center" prop="title" label="标题" width="150" />
<el-table-column align="center" prop="content" label="内容" />
<el-table-column align="center" prop="append_data" label="附件" width="200">
<template #default="item">
<p v-for="v in item.row.append_data">
<span v-if="v.type == 1">{{ `金币(${v.num})` }}</span>
</p>
</template>
</el-table-column>
<el-table-column align="center" prop="send_time" label="定发时间" width="200">
<template #default="item">
<p v-if="item.row.send_time == ''">即时</p>
<p v-else>{{ item.row.send_time }}</p>
</template>
</el-table-column>
<el-table-column align="center" prop="create_time" label="创建时间" width="200" />
</el-table>
</el-card>
<CustomPaginate :size="data.page.size" :total="data.result.total" @new-page="(v) => getRecord(v)" />
<!-- 添加邮件 -->
<el-dialog v-model="data.dialog">
<ChangeEmail :send-mode="1" @close-box="closeBox" />
</el-dialog>
</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>

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

@ -6,20 +6,22 @@ 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 props = defineProps(['user_no', 'gold', 'sendMode'])
const data = reactive({
options: [
{ label: '金币', value: 1 },
{ label: '钻石', value: 2 },
{ label: '点券', value: 3 },
{ label: '道具', value: 4 },
// { label: '', value: 2 },
// { label: '', value: 3 },
// { label: '', value: 4 },
] as any[],
form: {
recipient: [parseInt(props.user_no)],
user_no: props.user_no,
recipient: '[]',
append: [] as any[], //[{num:2,type:1}]
title: [''],
content: [''],
timing: '',
send_mode: props.sendMode, // 0: 1
},
emailNum: 1,
})
@ -60,15 +62,20 @@ const onSubmit = async () => {
data.form.append[index].num = parseInt(data.form.append[index].num)
}
const params = {
user_id: props.uid,
recipient: JSON.stringify(data.form.recipient),
let params = {
type: data.form.send_mode,
title: data.form.title,
content: data.form.content,
timing: data.form.timing,
type: 2,
timing: '',
append: JSON.stringify(data.form.append),
recipient: '[]',
}
//
if (data.form.send_mode == 2) {
params.recipient = JSON.stringify([parseInt(props.user_no)])
}
const respond = await request.post('/person/sendEmail', params)
if (respond.code != 0) {
ElMessage.error(respond.msg)
@ -82,20 +89,28 @@ const onSubmit = async () => {
<template>
<el-form>
<el-form-item label="玩家ID" label-width="100">
<el-input :value="props.user_no" disabled></el-input>
<el-form-item label="收件人" label-width="100">
<el-select v-model="data.form.send_mode" :disabled="props.user_no != undefined ? true : false">
<el-option label="所有玩家" :value="1"></el-option>
<el-option label="指定玩家" :value="2"></el-option>
</el-select>
</el-form-item>
<el-form-item label="玩家拥有资产" label-width="100">
<el-input :value="`金币 ${props.gold}`" disabled></el-input>
<el-form-item v-if="data.form.send_mode == 2" label="玩家ID" label-width="100">
<el-input :value="props.user_no"></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-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-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" />
<CustomEditor @update-content="(v) => (data.form.content[index] = v)" />
</el-form-item>
</div>
@ -120,7 +135,7 @@ const onSubmit = async () => {
</el-select>
</el-form-item>
<el-form-item>
<el-input v-model="item.num" style="width: 100%" class="mb-10"></el-input>
<el-input v-model="item.num" style="width: 100%" class="mb-10" type="number"></el-input>
</el-form-item>
</el-form>
@ -134,7 +149,7 @@ const onSubmit = async () => {
</el-row>
</el-card>
</el-form-item>
<el-form-item label="发送时间" label-width="100">
<!-- <el-form-item label="发送时间" label-width="100">
<el-date-picker
v-model="data.form.timing"
type="datetime"
@ -142,7 +157,7 @@ const onSubmit = async () => {
value-format="YYYY-MM-DD HH:mm:ss"
style="width: 100%"
></el-date-picker>
</el-form-item>
</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>

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

@ -200,7 +200,11 @@ onMounted(() => {
<el-col>
<el-row justify="space-between">
<el-col :span="4" class="text-left">
<el-button class="btn-info" 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>
@ -358,13 +362,7 @@ onMounted(() => {
</template>
<template v-if="data.dialog.action == 5">
<ChangeEmail
:uid="data.result.id"
:user_no="data.result.user_no"
:gold="data.result.gold"
:diamonds="data.result.diamond"
@close-box="closeBox"
/>
<ChangeEmail :user_no="data.result.user_no" :gold="data.result.gold" :send-mode="2" @close-box="closeBox" />
</template>
<template v-if="data.dialog.action == 6">

2
backmanage/stats.html

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