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/ dist/
backmanage/dist.zip
backmanage/stats.html

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

@ -1,10 +1,14 @@
<script setup lang="ts"> <script setup lang="ts">
import { onMounted, reactive, onBeforeUnmount, ref, shallowRef } from 'vue' 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 '@wangeditor/editor/dist/css/style.css' // css
import { Editor, Toolbar } from '@wangeditor/editor-for-vue' import { Editor, Toolbar } from '@wangeditor/editor-for-vue'
import { ElMessage } from 'element-plus'
const emits = defineEmits(["updateContent"]) const emits = defineEmits(['updateContent'])
const data = reactive({ const data = reactive({
content: '', content: '',
@ -12,7 +16,31 @@ const data = reactive({
// //
const toolbarConfig = {} 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() const editorRef = shallowRef()
@ -23,12 +51,12 @@ onBeforeUnmount(() => {
editor.destroy() editor.destroy()
}) })
const handleCreated = (editor) => { const handleCreated = (editor: any) => {
editorRef.value = editor // editor editorRef.value = editor // editor
} }
const handleChange = () => { const handleChange = () => {
emits("updateContent", data.content) emits('updateContent', data.content)
} }
</script> </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() ;[data.options.games, data.options.rooms] = await GamesRoomsInfo()
console.log(data.options.games)
// //
for (const game of data.options.games) { for (const game of data.options.games) {
for (const room of game.rooms_info) { 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 }) data.reviewResult.push({ id: parseInt(label), title: game.game_name+ '-' + room.room_name, value: 0 })
} }
} }
console.log(data.reviewResult)
getBetRecord() getBetRecord()
}) })
</script> </script>

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

@ -1,133 +1,150 @@
<script setup lang="ts"> <script setup lang="ts">
import moment from 'moment'; import moment from 'moment'
import { onMounted, reactive } from 'vue'; import { onMounted, reactive } from 'vue'
import request from "@/api/config"; import request from '@/api/config'
import { ElMessage } from 'element-plus'; import { ElMessage } from 'element-plus'
import { Search } from '@element-plus/icons-vue' import { Search } from '@element-plus/icons-vue'
import { useRoute } from 'vue-router' import { useRoute } from 'vue-router'
import { initPage } from '@/api/module/common_params'; import { initPage } from '@/api/module/common_params'
import CustomPaginate from "@/components/common/CustomPaginate.vue" import CustomPaginate from '@/components/common/CustomPaginate.vue'
import ChangeEmail from '@/views/userSearch/changeEmail.vue'
const route = useRoute() const route = useRoute()
const data = reactive({ const data = reactive({
search: { search: {
user_no: "", user_no: '',
time_range: [], time_range: [],
} as any, } as any,
page: initPage, page: initPage,
result: {} as any result: {} as any,
form: {},
dialog: false,
}) })
const getRecord = async (page: number = 1) => { const getRecord = async (page: number = 1) => {
const params = { const params = {
user_no: data.search.user_no, user_no: data.search.user_no,
start_time: data.search.time_range[0], start_time: data.search.time_range[0],
end_time: data.search.time_range[1], end_time: data.search.time_range[1],
page: page, page: page,
limit: data.page.size limit: data.page.size,
} }
const respond = await request.post("/person/emailList", params) const respond = await request.post('/person/emailList', params)
if (respond.code != 0) { if (respond.code != 0) {
ElMessage.error(respond.msg) ElMessage.error(respond.msg)
return return
} }
data.result = respond.data data.result = respond.data
for (const index in data.result.data) data.result.data[index].append_data = JSON.parse(data.result.data[index].append) 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) => { const closeBox = (v: boolean) => {
getRecord(val) data.dialog = v
getRecord()
} }
const handleSearch = () => { const handleSearch = () => {
getRecord() getRecord()
} }
onMounted(() => { onMounted(() => {
if (route.query.user_no != undefined) { if (route.query.user_no != undefined) {
data.search.user_no = route.query.user_no data.search.user_no = route.query.user_no
} }
getRecord() getRecord()
}) })
</script> </script>
<template> <template>
<div class="full-page p-20 page-content" style="position: relative"> <div class="full-page p-20 page-content" style="position: relative">
<el-row>
<el-col :span="21">
<el-row> <el-form :inline="true">
<el-col :span="21"> <el-form-item label="玩家ID">
<el-form :inline="true"> <el-input v-model="data.search.user_no"></el-input>
<el-form-item label="玩家ID"> </el-form-item>
<el-input v-model="data.search.user_no"></el-input> <el-form-item label="时间">
</el-form-item> <el-date-picker
<el-form-item label="时间"> v-model="data.search.time_range"
<el-date-picker v-model="data.search.time_range" style="width: 360px;" type="datetimerange" style="width: 360px"
format="YYYY-MM-DD HH:mm:ss" value-format="YYYY-MM-DD HH:mm:ss"></el-date-picker> type="datetimerange"
</el-form-item> format="YYYY-MM-DD HH:mm:ss"
</el-form> value-format="YYYY-MM-DD HH:mm:ss"
</el-col> ></el-date-picker>
<el-col :span="3" class="text-right"> </el-form-item>
<el-button type="primary" @click="handleSearch" :icon="Search">查询</el-button> </el-form>
</el-col> </el-col>
</el-row> <el-col :span="3" class="text-right">
<el-button type="primary" @click="handleSearch" :icon="Search">查询</el-button>
<el-card class="mx-n10"> </el-col>
<el-table height="630" :data="data.result.data"> <el-col class="mb-10">
<el-table-column align="center" prop="id" label="ID" width="100" /> <el-button type="success" size="small" @click="showBox(0, null)">添加</el-button>
<el-table-column align="center" prop="mail_type" label="邮件类型" width="100"> </el-col>
<template #default="item"> </el-row>
<p v-if="item.row.mail_type == 1">群发</p>
<p v-if="item.row.mail_type == 2">单发</p> <el-card class="mx-n10">
</template> <el-table height="600" :data="data.result.data">
</el-table-column> <el-table-column align="center" prop="id" label="ID" width="100" />
<el-table-column align="center" prop="recipient" label="收件人" width="150"> <el-table-column align="center" prop="mail_type" label="邮件类型" width="100">
<template #default="item"> <template #default="item">
<p v-if="item.row.mail_type == 2"> <p v-if="item.row.mail_type == 1">群发</p>
{{ JSON.parse(item.row.recipient).join(",") }} <p v-if="item.row.mail_type == 2">单发</p>
</p> </template>
<p v-else>-</p> </el-table-column>
</template> <el-table-column align="center" prop="recipient" label="收件人" width="150">
</el-table-column> <template #default="item">
<el-table-column align="center" prop="title" label="标题" width="150" /> <p v-if="item.row.mail_type == 2">
<el-table-column align="center" prop="content" label="内容" /> {{ JSON.parse(item.row.recipient).join(',') }}
<el-table-column align="center" prop="append_data" label="附件" width="200"> </p>
<template #default="item"> <p v-else>-</p>
<p v-for="v in item.row.append_data"> </template>
<span v-if="v.type == 1">{{ `金币(${v.num})` }}</span> </el-table-column>
</p> <el-table-column align="center" prop="title" label="标题" width="150" />
<el-table-column align="center" prop="content" label="内容" />
</template> <el-table-column align="center" prop="append_data" label="附件" width="200">
</el-table-column> <template #default="item">
<el-table-column align="center" prop="send_time" label="定发时间" width="200"> <p v-for="v in item.row.append_data">
<template #default="item"> <span v-if="v.type == 1">{{ `金币(${v.num})` }}</span>
<p v-if="item.row.send_time == ''">即时</p> </p>
<p v-else>{{ item.row.send_time }}</p> </template>
</template> </el-table-column>
</el-table-column> <el-table-column align="center" prop="send_time" label="定发时间" width="200">
<el-table-column align="center" prop="create_time" label="创建时间" width="200" /> <template #default="item">
</el-table> <p v-if="item.row.send_time == ''">即时</p>
</el-card> <p v-else>{{ item.row.send_time }}</p>
</template>
<CustomPaginate :size="data.page.size" :total="data.result.total" @new-page="(v) => getRecord(v)" /> </el-table-column>
<el-table-column align="center" prop="create_time" label="创建时间" width="200" />
</div> </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> </template>
<style scoped> <style scoped>
::v-deep .el-scrollbar__bar.is-horizontal { ::v-deep .el-scrollbar__bar.is-horizontal {
height: 15px !important; height: 15px !important;
} }
::v-deep .el-scrollbar__bar.is-vertical { ::v-deep .el-scrollbar__bar.is-vertical {
width: 15px !important; width: 15px !important;
} }
</style> </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' import CustomEditor from '@/components/common/CustomEditor.vue'
const emits = defineEmits(['closeBox']) 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({ const data = reactive({
options: [ options: [
{ label: '金币', value: 1 }, { label: '金币', value: 1 },
{ label: '钻石', value: 2 }, // { label: '', value: 2 },
{ label: '点券', value: 3 }, // { label: '', value: 3 },
{ label: '道具', value: 4 }, // { label: '', value: 4 },
] as any[], ] as any[],
form: { form: {
recipient: [parseInt(props.user_no)], user_no: props.user_no,
recipient: '[]',
append: [] as any[], //[{num:2,type:1}] append: [] as any[], //[{num:2,type:1}]
title: [''], title: [''],
content: [''], content: [''],
timing: '', timing: '',
send_mode: props.sendMode, // 0: 1
}, },
emailNum: 1, emailNum: 1,
}) })
@ -60,15 +62,20 @@ const onSubmit = async () => {
data.form.append[index].num = parseInt(data.form.append[index].num) data.form.append[index].num = parseInt(data.form.append[index].num)
} }
const params = { let params = {
user_id: props.uid, type: data.form.send_mode,
recipient: JSON.stringify(data.form.recipient),
title: data.form.title, title: data.form.title,
content: data.form.content, content: data.form.content,
timing: data.form.timing, timing: '',
type: 2,
append: JSON.stringify(data.form.append), 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) const respond = await request.post('/person/sendEmail', params)
if (respond.code != 0) { if (respond.code != 0) {
ElMessage.error(respond.msg) ElMessage.error(respond.msg)
@ -82,20 +89,28 @@ const onSubmit = async () => {
<template> <template>
<el-form> <el-form>
<el-form-item label="玩家ID" label-width="100"> <el-form-item label="收件人" label-width="100">
<el-input :value="props.user_no" disabled></el-input> <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>
<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>
<!-- <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"> <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-input v-model="data.form.title[index]"></el-input>
</el-form-item> </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" /> --> <!-- <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> </el-form-item>
</div> </div>
@ -120,7 +135,7 @@ const onSubmit = async () => {
</el-select> </el-select>
</el-form-item> </el-form-item>
<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-item>
</el-form> </el-form>
@ -134,7 +149,7 @@ const onSubmit = async () => {
</el-row> </el-row>
</el-card> </el-card>
</el-form-item> </el-form-item>
<el-form-item label="发送时间" label-width="100"> <!-- <el-form-item label="发送时间" label-width="100">
<el-date-picker <el-date-picker
v-model="data.form.timing" v-model="data.form.timing"
type="datetime" type="datetime"
@ -142,7 +157,7 @@ const onSubmit = async () => {
value-format="YYYY-MM-DD HH:mm:ss" value-format="YYYY-MM-DD HH:mm:ss"
style="width: 100%" style="width: 100%"
></el-date-picker> ></el-date-picker>
</el-form-item> </el-form-item> -->
<div class="paginate-center"> <div class="paginate-center">
<el-button type="primary" @click="$emit('closeBox', false)">取消</el-button> <el-button type="primary" @click="$emit('closeBox', false)">取消</el-button>
<el-button type="danger" @click="onSubmit">确定</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-col>
<el-row justify="space-between"> <el-row justify="space-between">
<el-col :span="4" class="text-left"> <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-button
> >
</el-col> </el-col>
@ -358,13 +362,7 @@ onMounted(() => {
</template> </template>
<template v-if="data.dialog.action == 5"> <template v-if="data.dialog.action == 5">
<ChangeEmail <ChangeEmail :user_no="data.result.user_no" :gold="data.result.gold" :send-mode="2" @close-box="closeBox" />
:uid="data.result.id"
:user_no="data.result.user_no"
:gold="data.result.gold"
:diamonds="data.result.diamond"
@close-box="closeBox"
/>
</template> </template>
<template v-if="data.dialog.action == 6"> <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