29 changed files with 2254 additions and 1373 deletions
@ -1,112 +0,0 @@
|
||||
<template> |
||||
<div> |
||||
<el-dialog title="修改" v-model="isShowDialog"> |
||||
<el-form label-width="100px" label-position="right"> |
||||
<el-form-item label="渠道:"> |
||||
<el-select v-model="tableData.param.channel" class="m-2"> |
||||
<el-option v-for="item in channels" :key="item.id+''" :label="item.label" :value="item.value+''"/> |
||||
</el-select> |
||||
</el-form-item> |
||||
<el-form-item label="版本号:"> |
||||
<el-input v-model="tableData.param.version" class="m-2"></el-input> |
||||
</el-form-item> |
||||
<el-form-item label="审核模式:"> |
||||
<el-radio-group v-model="tableData.param.auditMode"> |
||||
<el-radio label="1">是</el-radio> |
||||
<el-radio label="0">否</el-radio> |
||||
</el-radio-group> |
||||
</el-form-item> |
||||
</el-form> |
||||
<template #footer> |
||||
<span class="dialog-footer"> |
||||
<el-button @click="onCancel" size="default">取 消</el-button> |
||||
<el-button size="default" type="primary" class="ml10" @click="addVersion"> |
||||
<el-icon> |
||||
<ele-Promotion/> |
||||
</el-icon> |
||||
发送 |
||||
</el-button> |
||||
</span> |
||||
</template> |
||||
</el-dialog> |
||||
</div> |
||||
</template> |
||||
|
||||
<script lang="ts"> |
||||
import {reactive, toRefs, defineComponent} from 'vue'; |
||||
import {allChannelList} from "/src/utils/game"; |
||||
import {ElMessage, ElMessageBox} from "element-plus"; |
||||
import {gameSetAuditMode} from "/@/api/game/set"; |
||||
|
||||
interface TableData { |
||||
channel: string, |
||||
version: string, |
||||
auditMode: number |
||||
} |
||||
|
||||
interface TableDataState { |
||||
channels: Array<{ label: string, value: string }> |
||||
isShowDialog: boolean, |
||||
tableData: { |
||||
param: TableData; |
||||
}; |
||||
} |
||||
|
||||
export default defineComponent({ |
||||
name: 'gameEditClientBug', |
||||
setup(prop, {emit}) { |
||||
const state = reactive<TableDataState>({ |
||||
channels: [], |
||||
isShowDialog: false, |
||||
tableData: { |
||||
param: { |
||||
channel: "", |
||||
version: "", |
||||
auditMode: "1", |
||||
} |
||||
} |
||||
}); |
||||
|
||||
// 打开弹窗 |
||||
const openDialog = (row: TableData) => { |
||||
console.log(row); |
||||
|
||||
allChannelList().then(value => { |
||||
state.channels = value; |
||||
state.tableData.param = row; |
||||
state.isShowDialog = true; |
||||
}) |
||||
}; |
||||
// 关闭弹窗 |
||||
const closeDialog = () => { |
||||
state.isShowDialog = false; |
||||
}; |
||||
// 取消 |
||||
const onCancel = () => { |
||||
closeDialog(); |
||||
}; |
||||
// 新增 |
||||
const addVersion = () => { |
||||
closeDialog(); |
||||
ElMessageBox.confirm(`此操作将修改审核模式,是否继续?`, '提示', { |
||||
confirmButtonText: '确认', |
||||
cancelButtonText: '取消', |
||||
type: 'warning', |
||||
}).then(() => { |
||||
gameSetAuditMode(state.tableData.param).then(() => { |
||||
ElMessage.success('修改成功'); |
||||
emit('mailList'); |
||||
}) |
||||
}).catch(() => { |
||||
}); |
||||
}; |
||||
return { |
||||
openDialog, |
||||
closeDialog, |
||||
onCancel, |
||||
addVersion, |
||||
...toRefs(state), |
||||
}; |
||||
}, |
||||
}); |
||||
</script> |
@ -0,0 +1,622 @@
|
||||
<template> |
||||
<div class="game-maintenance-container"> |
||||
<el-card shadow="hover" header="客服页面"> |
||||
<div class="game-order-search mb15"> |
||||
<el-form label-width="70px" label-position="right"> |
||||
<el-form-item label="渠道" prop="channel"> |
||||
<el-select v-model="tableData.param.channel" class="m-2" placeholder="选择渠道"> |
||||
<el-option v-for="item in channels" :key="item.value" :label="item.label" :value="item.value" /> |
||||
</el-select> |
||||
</el-form-item> |
||||
<el-form-item label="页面模板" prop="model"> |
||||
<el-select v-model="model" @change="useModel(1)" placeholder="请选择模板"> |
||||
<el-option v-for="item in dbs" :key="item.id" :label="item.title" :value="item.id"></el-option> |
||||
</el-select> |
||||
<el-button type="primary" @click="makeModel(1)" style="margin-left: 20px">编辑模板</el-button> |
||||
</el-form-item> |
||||
<el-form-item> |
||||
<el-button size="small" @click="inputBig" style="margin-bottom: -15px"> |
||||
<span style="font-weight: bold">B</span> |
||||
</el-button> |
||||
<el-button size="small" @click="inputItalic" style="margin-bottom: -15px"> |
||||
<span style="font-style: italic">I</span> |
||||
</el-button> |
||||
<el-button size="small" @click="inputUnderline" style="margin-bottom: -15px"> |
||||
<span style="text-decoration: underline">U</span> |
||||
</el-button> |
||||
<el-button size="small" @click="inputLink" style="margin-bottom: -15px; padding: 0; padding-left: 5px"> |
||||
<el-icon type="text"> |
||||
<ele-Link /> |
||||
</el-icon> |
||||
</el-button> |
||||
<el-button size="small" class="color-picker font-color-picker" style="margin-bottom: -15px; padding: 0"> |
||||
<el-color-picker size="default" v-model="color" @change="inputColor"></el-color-picker> |
||||
</el-button> |
||||
<el-form-item style="margin-bottom: -15px; margin-left: 20px"> |
||||
<el-button type="primary" @click="showContent" style="margin-left: 20px">内容预览</el-button> |
||||
</el-form-item> |
||||
</el-form-item> |
||||
<el-form-item label="页面内容"> |
||||
<el-input v-model="tableData.param.content" type="textarea" rows="25" @mouseup="inputSelect" @blur="inputSelect" clearable /> |
||||
</el-form-item> |
||||
<el-form-item> |
||||
<el-button size="large" type="primary" class="ml10" @click="noticeLogin"> 客服页面发送</el-button> |
||||
</el-form-item> |
||||
</el-form> |
||||
</div> |
||||
</el-card> |
||||
|
||||
<el-dialog v-model="listModelVisible" :before-close="handleClose" :close-on-click-modal="false" center> |
||||
<div class="my-header"> |
||||
<el-button type="" @click="saveModel(2)">保存</el-button> |
||||
<el-button type="primary" @click="setModel(1)">添加</el-button> |
||||
</div> |
||||
<el-table :data="dbs" :inline="true" :cell-style="{ padding: '0' }"> |
||||
<el-table-column> |
||||
<template #default="scope"> |
||||
<div class="flex-warp"> |
||||
{{ scope.row.title }} |
||||
</div> |
||||
</template> |
||||
</el-table-column> |
||||
<el-table-column width="150"> |
||||
<template #default="scope"> |
||||
<el-button size="small" type="danger" @click="setModel(3, scope.row.id)" inline="true">删</el-button> |
||||
<el-button size="small" type="primary" @click="setModel(2, scope.row.id)" inline="true">改</el-button> |
||||
</template> |
||||
</el-table-column> |
||||
</el-table> |
||||
</el-dialog> |
||||
|
||||
<el-dialog v-model="editModelVisible" :close-on-click-modal="false" center> |
||||
<el-form label-width="90px"> |
||||
<el-form-item label="模板名称" prop="title"> |
||||
<el-input v-model="editModel.title" placeholder="请输入模板名称" /> |
||||
</el-form-item> |
||||
<el-form-item label="模板内容" prop="content"> |
||||
<el-input v-model="editModel.content" type="textarea" placeholder="请输入内容" rows="25" /> |
||||
</el-form-item> |
||||
</el-form> |
||||
<template #footer> |
||||
<div class="dialog-footer"> |
||||
<el-button type="primary" @click="saveModel(1)"> 保存</el-button> |
||||
</div> |
||||
</template> |
||||
</el-dialog> |
||||
|
||||
<el-dialog v-model="editCronVisible" :close-on-click-modal="false" center> |
||||
<el-form label-width="90px"> |
||||
<el-form-item label="页面模板" prop="model"> |
||||
<el-select v-model="model" @change="useModel(2)" placeholder="请选择模板"> |
||||
<el-option v-for="item in dbs" :key="item.id" :label="item.title" :value="item.id"></el-option> |
||||
</el-select> |
||||
<el-button type="primary" @click="makeModel(1)" style="margin-left: 20px">编辑模板</el-button> |
||||
</el-form-item> |
||||
<el-form-item> |
||||
<el-button size="small" @click="inputBig(2)" style="margin-bottom: -15px"> |
||||
<span style="font-weight: bold">B</span> |
||||
</el-button> |
||||
<el-button size="small" @click="inputItalic(2)" style="margin-bottom: -15px"> |
||||
<span style="font-style: italic">I</span> |
||||
</el-button> |
||||
<el-button size="small" @click="inputUnderline(2)" style="margin-bottom: -15px"> |
||||
<span style="text-decoration: underline">U</span> |
||||
</el-button> |
||||
<el-button size="small" @click="inputLink(2)" style="margin-bottom: -15px; padding: 0; padding-left: 5px"> |
||||
<el-icon type="text"> |
||||
<ele-Link /> |
||||
</el-icon> |
||||
</el-button> |
||||
<el-button size="small" class="color-picker font-color-picker" style="margin-bottom: -15px; padding: 0"> |
||||
<el-color-picker size="default" v-model="color" @change="inputColor(2)"></el-color-picker> |
||||
</el-button> |
||||
</el-form-item> |
||||
<el-form-item label="页面内容"> |
||||
<el-input v-model="cron.content" type="textarea" rows="25" @mouseup="inputSelect" @blur="inputSelect" clearable /> |
||||
</el-form-item> |
||||
</el-form> |
||||
<template #footer> |
||||
<div class="dialog-footer"> |
||||
<el-button type="primary" @click="saveCron"> 保存修改</el-button> |
||||
</div> |
||||
</template> |
||||
</el-dialog> |
||||
|
||||
<el-dialog v-model="contentVisible" :close-on-click-modal="false" center> |
||||
<p v-html="tableData.content"></p> |
||||
</el-dialog> |
||||
</div> |
||||
</template> |
||||
<script lang="ts"> |
||||
import { toRefs, reactive, onMounted, defineComponent } from 'vue'; |
||||
import { |
||||
gameGetNotice, |
||||
gameGMNoticeModelAdd, |
||||
gameGMNoticeModelDel, |
||||
gameGMNoticeModelGet, |
||||
gameNotice, |
||||
gameGMNoticeGetCron, |
||||
gameNoticeDel, |
||||
} from '/@/api/game'; |
||||
import { ElMessage, ElMessageBox } from 'element-plus/es'; |
||||
import { allChannelList } from '/@/utils/game'; |
||||
import { contentReplace, zeroFill } from '/@/utils/utils'; |
||||
|
||||
interface Data { |
||||
title: string; |
||||
send: number; |
||||
sendTime: number; |
||||
channel: string; |
||||
content: string; |
||||
noticeType: number; |
||||
id: number; |
||||
noticeId: number; |
||||
} |
||||
|
||||
interface TableDataState { |
||||
unselsected: string[]; |
||||
colorPicker: boolean; |
||||
color: string; |
||||
selected: string; |
||||
urlLink: string; |
||||
dbs: Array<Data>; |
||||
model: number; |
||||
editModel: Data; |
||||
tableData: { |
||||
content: string; |
||||
crons: Array<Data>; |
||||
param: Data; |
||||
}; |
||||
editModelVisible: boolean; |
||||
listModelVisible: boolean; |
||||
listCronVisible: boolean; |
||||
editCronVisible: boolean; |
||||
contentVisible: boolean; |
||||
cron: Data; |
||||
channels: object; |
||||
noticeTypes: object[]; |
||||
} |
||||
|
||||
export default defineComponent({ |
||||
name: 'apiV1GameNoticeCustomerService', |
||||
setup() { |
||||
// const {proxy} = getCurrentInstance() as any; |
||||
const state = reactive<TableDataState>({ |
||||
unselsected: ['', ''], |
||||
colorPicker: false, |
||||
editModelVisible: false, |
||||
listModelVisible: false, |
||||
listCronVisible: false, |
||||
editCronVisible: false, |
||||
contentVisible: false, |
||||
cron: { |
||||
title: '', |
||||
send: 1, |
||||
sendTime: Date.now(), |
||||
content: '', |
||||
noticeType: 4, |
||||
channel: '', |
||||
id: 0, |
||||
noticeId: 0, |
||||
}, |
||||
color: '#000000', |
||||
selected: '替换显示内容', |
||||
urlLink: '', |
||||
tableData: { |
||||
content: '', |
||||
crons: [], |
||||
param: { |
||||
title: '', |
||||
send: 1, |
||||
sendTime: Date.now(), |
||||
content: '', |
||||
noticeType: 4, |
||||
channel: '', |
||||
id: 0, |
||||
noticeId: 0, |
||||
}, |
||||
}, |
||||
dbs: [], |
||||
model: '', |
||||
editModel: {}, |
||||
channels: [], |
||||
noticeTypes: [ |
||||
{ Name: '所有公告', Id: 0 }, |
||||
{ Name: '弹窗公告', Id: 1 }, |
||||
{ Name: '登录公告', Id: 2 }, |
||||
{ |
||||
Name: '维护公告', |
||||
Id: 3, |
||||
}, |
||||
{ Name: '客服页面', Id: 4 }, |
||||
], |
||||
}); |
||||
const noticeLogin = () => { |
||||
if (state.tableData.param.send == 1) { |
||||
state.tableData.param.sendTime = 0; |
||||
} |
||||
|
||||
console.log('Notice: ', state.tableData.param); |
||||
gameNotice(state.tableData.param) |
||||
.then(() => { |
||||
ElMessage.success('发送成功'); |
||||
}) |
||||
.finally(() => { |
||||
// state.loading = false; |
||||
}); |
||||
}; |
||||
const saveCron = () => { |
||||
if (state.cron.send == 1) { |
||||
state.cron.sendTime = 0; |
||||
} |
||||
|
||||
console.log('Notice: ', state.cron); |
||||
gameNotice(state.cron) |
||||
.then(() => { |
||||
ElMessage.success('发送成功'); |
||||
}) |
||||
.finally(() => { |
||||
// state.loading = false; |
||||
}); |
||||
}; |
||||
const noticeLog = () => { |
||||
gameGMNoticeGetCron({}) |
||||
.then((res) => { |
||||
console.log('Notice: ', res); |
||||
state.tableData.crons = res.data.noticeLogs; |
||||
state.listCronVisible = true; |
||||
}) |
||||
.finally(() => { |
||||
// state.loading = false; |
||||
}); |
||||
}; |
||||
|
||||
// 初始化表格数据 |
||||
const initTableData = () => { |
||||
getNotice(); |
||||
}; |
||||
|
||||
const getNotice = () => { |
||||
gameGetNotice(state.tableData.param).then((res: any) => { |
||||
state.tableData.param.content = res.data.content; |
||||
state.tableData.param.noticeId = res.data.id; |
||||
}); |
||||
}; |
||||
// 页面加载时 |
||||
onMounted(() => { |
||||
allChannelList().then((res) => { |
||||
state.channels = res; |
||||
}); |
||||
initTableData(); |
||||
getModel(); |
||||
|
||||
console.log('onMounted', document.getElementsByClassName('w-e-droplist')); |
||||
if (document.getElementsByClassName('w-e-droplist')[0]) { |
||||
document.getElementsByClassName('w-e-droplist')[0].style['width'] = '260px'; |
||||
} |
||||
}); |
||||
|
||||
var getDate = (time: string) => { |
||||
let date = new Date(time); |
||||
return ( |
||||
date.getFullYear() + |
||||
'-' + |
||||
zeroFill(date.getMonth() + 1) + |
||||
'-' + |
||||
zeroFill(date.getDate()) + |
||||
' ' + |
||||
zeroFill(date.getHours()) + |
||||
':' + |
||||
zeroFill(date.getMinutes()) + |
||||
':' + |
||||
zeroFill(date.getSeconds()) |
||||
); |
||||
}; |
||||
var inputSelect = (res: any) => { |
||||
console.log(res, res.target.selectionStart, res.target.selectionEnd); |
||||
let selectionStart = res.target.selectionStart; |
||||
let selectionEnd = res.target.selectionEnd; |
||||
state.unselsected = [res.target.value.slice(0, selectionStart), res.target.value.slice(selectionEnd)]; |
||||
if (selectionStart == selectionEnd) { |
||||
// console.log("same"); |
||||
state.selected = '替换显示内容'; |
||||
return; |
||||
} |
||||
state.selected = res.target.value.slice(selectionStart, selectionEnd); |
||||
console.log(state.selected); |
||||
}; |
||||
var changeContent = (type: number) => { |
||||
switch (type) { |
||||
case 2: |
||||
state.cron.content = state.unselsected[0] + state.selected + state.unselsected[1]; |
||||
break; |
||||
default: |
||||
state.tableData.param.content = state.unselsected[0] + state.selected + state.unselsected[1]; |
||||
break; |
||||
} |
||||
}; |
||||
var inputBig = (type: number) => { |
||||
if (state.unselsected[1].indexOf('[/b]') == 0) { |
||||
return; |
||||
} |
||||
|
||||
if (state.selected.indexOf('[b]') > -1) { |
||||
state.selected = state.selected.replace(/\[b]|\[\/b]/gi, ''); |
||||
changeContent(type); |
||||
return; |
||||
} |
||||
state.selected = '[b]' + state.selected + '[/b]'; |
||||
changeContent(type); |
||||
// console.log(state.unselsected, state.selected.indexOf("[b]"), state.selected, state.tableData.param.content); |
||||
}; |
||||
var inputItalic = (type: number) => { |
||||
if (state.unselsected[1].indexOf('[/i]') == 0) { |
||||
return; |
||||
} |
||||
if (state.selected.indexOf('[i]') > -1 || (state.unselsected[1].indexOf('[i]') == 0 && state.unselsected[1].indexOf('[/i]') > -1)) { |
||||
state.selected = state.selected.replace(/\[i]|\[\/i]/gi, ''); |
||||
changeContent(type); |
||||
return; |
||||
} |
||||
state.selected = '[i]' + state.selected + '[/i]'; |
||||
changeContent(type); |
||||
// console.log(state.unselsected, state.selected, state.tableData.param.content); |
||||
}; |
||||
var inputUnderline = (type: number) => { |
||||
if (state.unselsected[1].indexOf('[/u]') == 0) { |
||||
return; |
||||
} |
||||
if (state.selected.indexOf('[u]') > -1) { |
||||
state.selected = state.selected.replace(/\[u]|\[\/u]/gi, ''); |
||||
changeContent(type); |
||||
return; |
||||
} |
||||
state.selected = '[u]' + state.selected + '[/u]'; |
||||
changeContent(type); |
||||
// console.log(state.unselsected, state.selected, state.tableData.param.content); |
||||
}; |
||||
var inputLink = (type: number) => { |
||||
if (state.selected.indexOf('[/url]') > -1) { |
||||
state.selected = state.selected.replace(/\[url=.*?]|\[\/url]/gi, ''); |
||||
changeContent(type); |
||||
return; |
||||
} |
||||
ElMessageBox.prompt('请输入Url', '提示', { |
||||
confirmButtonText: '确认', |
||||
cancelButtonText: '取消', |
||||
// inputPattern: |
||||
// /[\w!#$%&'*+/=?^_`{|}~-]+(?:\.[\w!#$%&'*+/=?^_`{|}~-]+)*@(?:[\w](?:[\w-]*[\w])?\.)+[\w](?:[\w-]*[\w])?/, |
||||
inputErrorMessage: 'Invalid http request', |
||||
}).then(({ value }) => { |
||||
state.urlLink = value; |
||||
if (state.unselsected[1].indexOf('[/url]') == 0) { |
||||
return; |
||||
} |
||||
state.selected = '[url=' + state.urlLink + ']' + state.selected + '[/url]'; |
||||
changeContent(type); |
||||
state.urlLink = ''; |
||||
// console.log(state.unselsected, state.selected, state.tableData.param.content); |
||||
}); |
||||
}; |
||||
var buttonColor = (type: number) => { |
||||
// if(state.selected.indexOf("[/color]") > -1){ |
||||
// state.selected = state.selected.replace(/\[color=#.+?]|\[\/color]/gi, ""); |
||||
// changeContent(); |
||||
// } |
||||
}; |
||||
var inputColor = (type: number) => { |
||||
if (!state.color) { |
||||
if (state.selected.indexOf('[/color]') > -1) { |
||||
state.selected = state.selected.replace(/\[color=#.+?]|\[\/color]/gi, ''); |
||||
changeContent(type); |
||||
return; |
||||
} |
||||
return; |
||||
} |
||||
if (state.unselsected[1].indexOf('[/color]') == 0) { |
||||
return; |
||||
} |
||||
if (state.selected.indexOf('[/color]') > -1) { |
||||
state.selected = state.selected.replace(/\[color=#.+?]|\[\/color]/gi, ''); |
||||
// changeContent(); |
||||
// return; |
||||
} |
||||
state.selected = '[color=' + state.color + ']' + state.selected + '[/color]'; |
||||
changeContent(type); |
||||
// console.log(state.unselsected, state.selected, state.tableData.param.content); |
||||
}; |
||||
// 模板 |
||||
const getModel = () => { |
||||
gameGMNoticeModelGet({ noticeType: 4 }).then((res) => { |
||||
if (res.data.noticeModel) { |
||||
state.dbs = res.data.noticeModel; |
||||
} |
||||
console.log(res, state.dbs); |
||||
}); |
||||
}; |
||||
const useModel = (id: number) => { |
||||
switch (id) { |
||||
case 1: |
||||
let model = state.dbs.find((r) => r.id == state.model); |
||||
if (model) { |
||||
state.tableData.param.content = model.content; |
||||
} |
||||
break; |
||||
case 2: |
||||
let model1 = state.dbs.find((r) => r.id == state.model); |
||||
if (model1) { |
||||
state.cron.content = model1.content; |
||||
} |
||||
break; |
||||
} |
||||
}; |
||||
const makeModel = () => { |
||||
state.listModelVisible = true; |
||||
console.log(state); |
||||
}; |
||||
const setModel = (type: number, id: number) => { |
||||
switch (type) { |
||||
case 1: |
||||
state.editModel = {}; |
||||
state.editModelVisible = true; |
||||
break; |
||||
case 2: |
||||
state.editModel = state.dbs.find((model) => model.id == id); |
||||
if (!state.editModel) { |
||||
return; |
||||
} |
||||
state.editModelVisible = true; |
||||
break; |
||||
case 3: |
||||
gameGMNoticeModelDel({ |
||||
id: id, |
||||
}) |
||||
.then(function () { |
||||
getModel(); |
||||
}) |
||||
.finally(function () {}); |
||||
break; |
||||
} |
||||
}; |
||||
const saveModel = (type: number) => { |
||||
console.log(type, state.editModel); |
||||
switch (type) { |
||||
case 1: |
||||
gameGMNoticeModelAdd({ |
||||
title: state.editModel.title, |
||||
content: state.editModel.content, |
||||
noticeType: 4, |
||||
id: state.editModel.id, |
||||
}) |
||||
.then(function () { |
||||
getModel(); |
||||
}) |
||||
.finally(function () { |
||||
state.editModelVisible = false; |
||||
}); |
||||
break; |
||||
case 2: |
||||
state.listModelVisible = false; |
||||
break; |
||||
} |
||||
}; |
||||
const handleClose = (done: () => void) => { |
||||
// ElMessageBox.confirm('确定退出编辑模板页面?').then(() => { |
||||
done(); |
||||
// }).catch(() => { |
||||
// // catch error |
||||
// }) |
||||
}; |
||||
const setCron = (type: number, id: number) => { |
||||
switch (type) { |
||||
case 1: // 修改 |
||||
state.cron = state.tableData.crons.find((r) => r.id == id); |
||||
console.log(state.cron); |
||||
state.editCronVisible = true; |
||||
break; |
||||
case 2: // 删除 |
||||
ElMessageBox.confirm('是否确认删除本条待发送公告?,点击确认后删除本条待发送公告。').then(() => { |
||||
gameNoticeDel({ id: id }) |
||||
.then(() => { |
||||
ElMessage.success('删除成功'); |
||||
noticeLog(); |
||||
}) |
||||
.finally(() => { |
||||
// state.loading = false; |
||||
}); |
||||
}); |
||||
break; |
||||
} |
||||
}; |
||||
|
||||
const alertContent = (val) => { |
||||
console.log(`current page: ${val}`); |
||||
ElMessageBox.alert(val, '', { confirmButtonText: 'OK' }); |
||||
}; |
||||
|
||||
const showContent = () => { |
||||
state.contentVisible = true; |
||||
state.tableData.content = contentReplace(state.tableData.param.content); |
||||
console.log(state.tableData.content); |
||||
}; |
||||
return { |
||||
showContent, |
||||
getNotice, |
||||
noticeLog, |
||||
noticeLogin, |
||||
inputSelect, |
||||
inputBig, |
||||
inputItalic, |
||||
inputUnderline, |
||||
inputLink, |
||||
inputColor, |
||||
buttonColor, |
||||
getModel, |
||||
useModel, |
||||
makeModel, |
||||
setModel, |
||||
saveModel, |
||||
handleClose, |
||||
setCron, |
||||
getDate, |
||||
alertContent, |
||||
saveCron, |
||||
...toRefs(state), |
||||
}; |
||||
}, |
||||
}); |
||||
</script> |
||||
<style scoped lang="scss" src="../../../theme/add.scss"></style> |
||||
<style scoped lang="scss"> |
||||
.my-header { |
||||
display: flex; |
||||
flex-direction: row; |
||||
justify-content: space-between; |
||||
gap: 16px; |
||||
} |
||||
|
||||
.tree-border { |
||||
margin-top: 5px; |
||||
border: 1px solid #e5e6e7 !important; |
||||
background: #fff none !important; |
||||
border-radius: 4px; |
||||
} |
||||
|
||||
.system-edit-post-container { |
||||
.menu-data-tree { |
||||
border: var(--el-input-border, var(--el-border-base)); |
||||
border-radius: var(--el-input-border-radius, var(--el-border-radius-base)); |
||||
padding: 5px; |
||||
} |
||||
} |
||||
|
||||
.el-form-item { |
||||
display: -moz-flex; |
||||
vertical-align: middle; |
||||
margin-right: 32px; |
||||
} |
||||
|
||||
::v-deep .el-table .cell { |
||||
height: 25px; |
||||
} |
||||
|
||||
::v-deep .el-table--striped .el-table__body tr.el-table__row--striped td { |
||||
background: #ffffd5; |
||||
} |
||||
|
||||
::v-deep .el-table .el-table--enable-row-hover .el-table__body tr:hover > td { |
||||
background: inherit; |
||||
} |
||||
|
||||
::v-deep(.el-form-item--large .el-form-item__content) { |
||||
line-height: 20px; |
||||
} |
||||
|
||||
::v-deep(.el-form-item__content) { |
||||
line-height: 20px; |
||||
} |
||||
|
||||
::v-deep .w-e-droplist { |
||||
width: 260px !important; |
||||
} |
||||
</style> |
@ -0,0 +1,223 @@
|
||||
<template> |
||||
<div class="game-order-container"> |
||||
<el-card shadow="hover"> |
||||
<div class="game-order-search mb15"> |
||||
<el-form :inline="true"> |
||||
<el-form-item label="渠道" prop="channel"> |
||||
<el-select v-model="tableData.param.channel" class="m-2" placeholder="选择渠道"> |
||||
<el-option v-for="item in channels" :key="item.value" :label="item.label" :value="item.value" /> |
||||
</el-select> |
||||
</el-form-item> |
||||
<el-form-item label="选择区服" prop="server"> |
||||
<el-select v-model="serverSwitch" class="m-2" placeholder="选择服务器" size="large" style="width: 80px"> |
||||
<el-option v-for="item in serverCategorize" :key="item.value" :label="item.label" :value="item.value" /> |
||||
</el-select> |
||||
<el-select v-model="tableData.param.server" class="m-2" placeholder="选择区服" clearable filterable> |
||||
<el-option v-for="item in switchServer()" :key="item.id + ''" :label="item.name" :value="item.id + ''" /> |
||||
</el-select> |
||||
</el-form-item> |
||||
<el-form-item label="uid"> |
||||
<el-input size="default" v-model="tableData.param.uid" placeholder="请输入uid" class="w-50 m-2" clearable /> |
||||
</el-form-item> |
||||
<el-form-item label="起始时间" prop="lowTime"> |
||||
<el-date-picker |
||||
type="datetime" |
||||
size="large" |
||||
v-model="tableData.param.cTime" |
||||
format="YYYY-MM-DD HH:mm:ss" |
||||
value-format="YYYY-MM-DD HH:mm:ss" |
||||
/> |
||||
</el-form-item> |
||||
<el-form-item label="终止时间" prop="time"> |
||||
<el-date-picker type="datetime" v-model="tableData.param.eTime" format="YYYY-MM-DD HH:mm:ss" value-format="YYYY-MM-DD HH:mm:ss" /> |
||||
</el-form-item> |
||||
<el-form-item label="订单id"> |
||||
<el-input size="default" v-model="tableData.param.tradeNo" placeholder="请输入渠道订单id" class="w-50 m-2" clearable /> |
||||
</el-form-item> |
||||
<el-form-item label="操作人员"> |
||||
<el-input size="default" v-model="tableData.param.config" placeholder="请输入操作人员" class="w-50 m-2" clearable /> |
||||
</el-form-item> |
||||
<el-form-item label="操作人员"> |
||||
<el-input size="default" v-model="tableData.param.user" placeholder="请输入操作人员" class="w-50 m-2" clearable /> |
||||
</el-form-item> |
||||
<el-form-item> |
||||
<el-button size="default" type="primary" class="ml10" @click="orderList"> |
||||
<el-icon> |
||||
<ele-Search /> |
||||
</el-icon> |
||||
查询 |
||||
</el-button> |
||||
</el-form-item> |
||||
</el-form> |
||||
</div> |
||||
<el-table :data="tableData.data" style="width: 100%" border> |
||||
<el-table-column prop="tradeNo" label="订单id" show-overflow-tooltip></el-table-column> |
||||
<el-table-column prop="unitId" label="id" show-overflow-tooltip></el-table-column> |
||||
<el-table-column prop="amount" label="金额(元)" show-overflow-tooltip width="120"></el-table-column> |
||||
<el-table-column prop="createTime" label="充值时间" show-overflow-tooltip width="180"></el-table-column> |
||||
<el-table-column prop="remark" label="状态" show-overflow-tooltip width="120"> |
||||
<template #default="scope"> |
||||
<div v-if="scope.row.remark == ''" style="color: #e60000">充值失败</div> |
||||
<div v-else-if="scope.row.remark == 'SUCCESS'">充值成功</div> |
||||
<div v-else>{{ scope.row.remark }}</div> |
||||
</template> |
||||
</el-table-column> |
||||
<el-table-column prop="channel" label="渠道" show-overflow-tooltip width="120"> |
||||
<template #default="scope"> |
||||
<span>{{ channels.find((r) => r.value == scope.row.channel)?.label }}</span> |
||||
</template> |
||||
</el-table-column> |
||||
<el-table-column prop="server" label="区服" show-overflow-tooltip width="120"> |
||||
<template #default="scope"> |
||||
<span>{{ servers.find((r) => r.id == scope.row.server).name }}</span> |
||||
</template> |
||||
</el-table-column> |
||||
</el-table> |
||||
<el-row justify="space-evenly"> |
||||
<el-pagination |
||||
:hide-on-single-page="true" |
||||
v-model:page-size="tableData.param.pageSize" |
||||
v-model:current-page="tableData.param.pageNum" |
||||
:pager-count="5" |
||||
@current-change="orderList" |
||||
layout="total, prev, pager, next" |
||||
:total="tableData.total" |
||||
/> |
||||
</el-row> |
||||
</el-card> |
||||
</div> |
||||
</template> |
||||
|
||||
<script lang="ts"> |
||||
import { toRefs, reactive, onMounted, defineComponent } from 'vue'; |
||||
import { gameRechargeChangeStateDelete, gmOrderList } from '/@/api/game'; |
||||
import { allChannelList, ServerCategorize, serverList, ServerList } from '/@/utils/game'; |
||||
import RechargeConfigCategory from '/@/api/config/RechargeConfigCategory.json'; |
||||
import { ElMessage, ElMessageBox } from 'element-plus/es'; |
||||
import { gSwitchServer } from '/@/utils/utils'; |
||||
|
||||
// 定义接口来定义对象的类型 |
||||
interface TableData { |
||||
id: string; |
||||
CreateTime: string; |
||||
CfgId: number; |
||||
Rmb: number; |
||||
SilverPiece: number; |
||||
Identity: string; |
||||
timeStr: string; |
||||
uid: string; |
||||
RealName: string; |
||||
StringId: string; |
||||
} |
||||
|
||||
interface TableDataState { |
||||
serverSwitch: number; |
||||
serverCategorize: object; |
||||
tableData: { |
||||
data: Array<TableData>; |
||||
total: number; |
||||
param: { |
||||
uid: number; |
||||
channel: string; |
||||
tradeNo: string; |
||||
cTime: string; |
||||
eTime: string; |
||||
server: string; |
||||
config: string; |
||||
user: string; |
||||
pageNum: number; |
||||
pageSize: number; |
||||
}; |
||||
}; |
||||
servers: object; |
||||
channels: object; |
||||
rechargeInfo: object[]; |
||||
} |
||||
|
||||
export default defineComponent({ |
||||
name: 'apiV1GameOrderOrderList', |
||||
setup() { |
||||
// const {proxy} = getCurrentInstance() as any; |
||||
|
||||
const state = reactive<TableDataState>({ |
||||
serverSwitch: 0, |
||||
serverCategorize: ServerCategorize, |
||||
tableData: { |
||||
data: [], |
||||
total: 0, |
||||
param: { |
||||
uid: '', |
||||
channel: '', |
||||
tradeNo: '', |
||||
cTime: '', |
||||
eTime: '', |
||||
server: '', |
||||
config: '', |
||||
user: '', |
||||
pageSize: 10, |
||||
pageNum: 1, |
||||
}, |
||||
}, |
||||
servers: ServerList, |
||||
channels: [], |
||||
rechargeInfo: RechargeConfigCategory, |
||||
}); |
||||
|
||||
const orderList = () => { |
||||
gmOrderList(state.tableData.param).then((res) => { |
||||
console.log(res); |
||||
state.tableData.total = Number(res.data.total) || 0; |
||||
state.tableData.data = res.data.list || []; |
||||
}); |
||||
}; |
||||
// 页面加载时 |
||||
onMounted(() => { |
||||
serverList().then((res) => { |
||||
state.servers = res; |
||||
}); |
||||
allChannelList().then((res) => { |
||||
state.channels = res; |
||||
}); |
||||
}); |
||||
|
||||
const switchServer = () => { |
||||
return gSwitchServer(state.serverSwitch, state.servers); |
||||
}; |
||||
const changeState = (order: string, state: number, remark: string) => { |
||||
if (state != 3 && state != 2) { |
||||
return; |
||||
} |
||||
if (state == 3) { |
||||
let mess = '是否确认订单失效?,点击确认后本条订单失效。'; |
||||
ElMessageBox.confirm(mess).then(() => { |
||||
gameRechargeChangeStateDelete({ order: order, state: state }).then((res) => { |
||||
if (res.data.data == 1) { |
||||
ElMessage.success('发送成功'); |
||||
} |
||||
orderList(); |
||||
}); |
||||
}); |
||||
} else if (state == 2) { |
||||
ElMessageBox.prompt('请输入修改成功理由', '提示', { |
||||
confirmButtonText: '确认', |
||||
cancelButtonText: '取消', |
||||
inputErrorMessage: 'Invalid http request', |
||||
}).then(({ value }) => { |
||||
gameRechargeChangeStateDelete({ order: order, state: state, remark: remark + ', ' + value }).then((res) => { |
||||
if (res.data.data == 1) { |
||||
ElMessage.success('发送成功'); |
||||
} |
||||
orderList(); |
||||
}); |
||||
}); |
||||
} |
||||
}; |
||||
return { |
||||
switchServer, |
||||
orderList, |
||||
changeState, |
||||
...toRefs(state), |
||||
}; |
||||
}, |
||||
}); |
||||
</script> |
@ -0,0 +1,120 @@
|
||||
<template> |
||||
<div> |
||||
<el-dialog :title="(isNew ? '新增' : '修改') + setName.label + '模式:'" v-model="isShowDialog"> |
||||
<el-form label-width="130px" label-position="right"> |
||||
<el-form-item label="渠道:"> |
||||
<el-select v-model="tableData.param.channel" class="m-2"> |
||||
<el-option v-for="item in channels" :key="item.id + ''" :label="item.label" :value="item.value + ''" /> |
||||
</el-select> |
||||
</el-form-item> |
||||
<el-form-item label="版本号:"> |
||||
<el-input v-model="tableData.param.version" class="m-2"></el-input> |
||||
</el-form-item> |
||||
<el-form-item :label="setName.label + '模式:'"> |
||||
<el-radio-group v-model="tableData.param.auditMode"> |
||||
<el-radio label="1">是</el-radio> |
||||
<el-radio label="0">否</el-radio> |
||||
</el-radio-group> |
||||
</el-form-item> |
||||
</el-form> |
||||
<template #footer> |
||||
<span class="dialog-footer"> |
||||
<el-button @click="onCancel" size="default">取 消</el-button> |
||||
<el-button size="default" type="primary" class="ml10" @click="addVersion"> |
||||
<el-icon> |
||||
<ele-Promotion /> |
||||
</el-icon> |
||||
发送 |
||||
</el-button> |
||||
</span> |
||||
</template> |
||||
</el-dialog> |
||||
</div> |
||||
</template> |
||||
|
||||
<script lang="ts"> |
||||
import { reactive, toRefs, defineComponent } from 'vue'; |
||||
import { allChannelList } from '/src/utils/game'; |
||||
import { ElMessage, ElMessageBox } from 'element-plus'; |
||||
import { gameSetAuditMode } from '/src/api/game/set'; |
||||
|
||||
interface TableData { |
||||
name: string; |
||||
channel: string; |
||||
version: string; |
||||
auditMode: number; |
||||
} |
||||
|
||||
interface TableDataState { |
||||
channels: Array<{ label: string; value: string }>; |
||||
isShowDialog: boolean; |
||||
tableData: { |
||||
param: TableData; |
||||
}; |
||||
setName: object; |
||||
isNew: boolean; |
||||
} |
||||
|
||||
export default defineComponent({ |
||||
name: 'gameEditClientBug', |
||||
setup(prop, { emit }) { |
||||
const state = reactive<TableDataState>({ |
||||
channels: [], |
||||
isShowDialog: false, |
||||
tableData: { |
||||
param: { |
||||
name: '', |
||||
channel: '', |
||||
version: '', |
||||
auditMode: '1', |
||||
}, |
||||
}, |
||||
setName: {}, |
||||
isNew: false, |
||||
}); |
||||
|
||||
// 打开弹窗 |
||||
const openDialog = (row: TableData, setName, isNew) => { |
||||
console.log(row); |
||||
state.setName = setName; |
||||
state.isNew = isNew; |
||||
allChannelList().then((value) => { |
||||
state.channels = value; |
||||
state.tableData.param = row; |
||||
state.isShowDialog = true; |
||||
}); |
||||
}; |
||||
// 关闭弹窗 |
||||
const closeDialog = () => { |
||||
state.isShowDialog = false; |
||||
}; |
||||
// 取消 |
||||
const onCancel = () => { |
||||
closeDialog(); |
||||
}; |
||||
// 新增 |
||||
const addVersion = () => { |
||||
closeDialog(); |
||||
ElMessageBox.confirm(`此操作将修改审核模式,是否继续?`, '提示', { |
||||
confirmButtonText: '确认', |
||||
cancelButtonText: '取消', |
||||
type: 'warning', |
||||
}) |
||||
.then(() => { |
||||
gameSetAuditMode(state.tableData.param).then(() => { |
||||
ElMessage.success('修改成功'); |
||||
emit('mailList'); |
||||
}); |
||||
}) |
||||
.catch(() => {}); |
||||
}; |
||||
return { |
||||
openDialog, |
||||
closeDialog, |
||||
onCancel, |
||||
addVersion, |
||||
...toRefs(state), |
||||
}; |
||||
}, |
||||
}); |
||||
</script> |
Loading…
Reference in new issue