3 changed files with 307 additions and 0 deletions
-
19src/api/weixin/index.js
-
12src/views/weChatMiniProgram/baseSetting.vue
-
276src/views/weChatMiniProgram/feedback.vue
@ -0,0 +1,19 @@ |
|||||
|
import request from '@/utils/request' |
||||
|
// import qs from 'qs'
|
||||
|
|
||||
|
// 回复读者留言
|
||||
|
// {
|
||||
|
// "id": 0,
|
||||
|
// "reply": "回复"
|
||||
|
// }
|
||||
|
export function FetchReplyReaderMessage(parameter) { |
||||
|
return request({ |
||||
|
url: 'api/weixin/replyReaderMessage', |
||||
|
method: 'post', |
||||
|
data: parameter |
||||
|
}) |
||||
|
} |
||||
|
|
||||
|
export default { |
||||
|
FetchReplyReaderMessage |
||||
|
} |
||||
@ -0,0 +1,276 @@ |
|||||
|
<template> |
||||
|
<div class="app-container row-container"> |
||||
|
<!--工具栏--> |
||||
|
<div class="head-container"> |
||||
|
<div class="head-search" style="align-items: center;"> |
||||
|
<el-input |
||||
|
v-model="keyWord" |
||||
|
size="small" |
||||
|
clearable |
||||
|
placeholder="请输入关键词" |
||||
|
style="width: 280px;" |
||||
|
class="input-prepend filter-item" |
||||
|
@clear="crud.toQuery" |
||||
|
@keyup.enter.native="crud.toQuery" |
||||
|
> |
||||
|
<el-select slot="prepend" v-model="optionVal" style="width: 100px" @change="searchChange"> |
||||
|
<el-option |
||||
|
v-for="item in options" |
||||
|
:key="item.value" |
||||
|
:label="item.label" |
||||
|
:value="item.value" |
||||
|
/> |
||||
|
</el-select> |
||||
|
</el-input> |
||||
|
<el-select v-model="query.isReply" clearable size="small" placeholder="状态" class="filter-item" style="width: 100px" @change="crud.toQuery"> |
||||
|
<i slot="prefix" class="iconfont icon-zhuangtai" /> |
||||
|
<el-option v-for="item in enabledTypeOptions" :key="item.key" :label="item.display_name" :value="item.key" /> |
||||
|
</el-select> |
||||
|
<rrOperation> |
||||
|
<template v-slot:right> |
||||
|
<el-button class="filter-item filter-refresh" size="mini" type="warning" icon="el-icon-refresh-left" @click="resetQuery()">重置</el-button> |
||||
|
</template> |
||||
|
</rrOperation> |
||||
|
</div> |
||||
|
<crudOperation :permission="permission" /> |
||||
|
</div> |
||||
|
<div class="container-wrap"> |
||||
|
<span class="right-top-line" /> |
||||
|
<span class="left-bottom-line" /> |
||||
|
|
||||
|
<el-dialog |
||||
|
title="读者留言" |
||||
|
:visible.sync="replyVisible" |
||||
|
width="800px" |
||||
|
append-to-body |
||||
|
:close-on-click-modal="false" |
||||
|
:before-close="clearReplyFormValidate" |
||||
|
> |
||||
|
<ul class="message-info-box" style="margin-bottom: 20px; padding: 15px; background: #f7f8fa; border-radius: 4px; line-height: 30px;"> |
||||
|
<li> |
||||
|
<span style="color: #0c0e1e; width: 80px; display: inline-block;">读者证号:</span> |
||||
|
<span>{{ replyForm.readCardNo }}</span> |
||||
|
</li> |
||||
|
<li> |
||||
|
<span style="color: #0c0e1e; width: 80px; display: inline-block;">读者昵称:</span> |
||||
|
<span>{{ replyForm.readName }}</span> |
||||
|
</li> |
||||
|
<li> |
||||
|
<span style="color: #0c0e1e; width: 80px; display: inline-block;">联系方式:</span> |
||||
|
<span>{{ replyForm.phone }}</span> |
||||
|
</li> |
||||
|
<li> |
||||
|
<span style="color: #0c0e1e; width: 80px; display: inline-block;">留言主题:</span> |
||||
|
<span>{{ replyForm.title }}</span> |
||||
|
</li> |
||||
|
<li> |
||||
|
<span style="color: #0c0e1e; width: 80px; display: inline-block;">留言时间:</span> |
||||
|
<span>{{ replyForm.suggestionTime | parseTime }}</span> |
||||
|
</li> |
||||
|
<li style="border-top: 1px dashed #e4e7ed;"> |
||||
|
<span style="color: #0c0e1e; width: 80px; display: inline-block; vertical-align: top;">留言内容:</span> |
||||
|
<span style="width: calc(100% - 85px); display: inline-block;"> |
||||
|
{{ replyForm.suggestion }} |
||||
|
</span> |
||||
|
</li> |
||||
|
<li v-if="replyForm.reply" style="border-top: 1px dashed #e4e7ed; margin-top: 15px; padding-top: 10px;"> |
||||
|
<span style="color: #0c0e1e; width: 80px; display: inline-block; vertical-align: top;">回复内容:</span> |
||||
|
<span style="width: calc(100% - 85px); display: inline-block;"> |
||||
|
{{ replyForm.reply }} |
||||
|
</span> |
||||
|
</li> |
||||
|
</ul> |
||||
|
|
||||
|
<el-form v-if="!replyForm.reply" ref="replyForm" :model="replyForm" :rules="replyRules" size="small"> |
||||
|
<el-form-item label="回复内容" prop="reply"> |
||||
|
<el-input |
||||
|
v-model="replyForm.reply" |
||||
|
type="textarea" |
||||
|
rows="5" |
||||
|
placeholder="请输入回复内容" |
||||
|
style="width: 762px;" |
||||
|
:readonly="!!replyForm.reply" |
||||
|
:style="{ backgroundColor: replyForm.reply ? '#f5f7fa' : '#fff' }" |
||||
|
/> |
||||
|
</el-form-item> |
||||
|
</el-form> |
||||
|
|
||||
|
<div slot="footer" class="dialog-footer"> |
||||
|
<el-button @click="clearReplyFormValidate">关 闭</el-button> |
||||
|
<el-button |
||||
|
v-if="!replyForm.reply" |
||||
|
type="primary" |
||||
|
:loading="replyLoading" |
||||
|
@click="submitReply" |
||||
|
> |
||||
|
提 交 |
||||
|
</el-button> |
||||
|
</div> |
||||
|
</el-dialog> |
||||
|
|
||||
|
<!-- 表格 --> |
||||
|
<el-table ref="table" v-loading="crud.loading" highlight-current-row style="width: 100%;" height="calc(100vh - 330px)" :data="crud.data" @row-dblclick="onRowDblclick" @selection-change="crud.selectionChangeHandler"> |
||||
|
<el-table-column prop="readCardNo" label="读者证号" /> |
||||
|
<el-table-column prop="readName" label="读者昵称" /> |
||||
|
<el-table-column prop="phone" label="联系方式" /> |
||||
|
<el-table-column prop="title" label="留言主题" /> |
||||
|
<el-table-column :show-overflow-tooltip="true" prop="suggestionTime" label="留言日期"> |
||||
|
<template slot-scope="scope"> |
||||
|
<div>{{ scope.row.suggestionTime | parseTime }}</div> |
||||
|
</template> |
||||
|
</el-table-column> |
||||
|
<el-table-column label="操作" width="100" align="center"> |
||||
|
<template slot-scope="scope"> |
||||
|
<el-button |
||||
|
v-if="!scope.row.reply" |
||||
|
type="text" |
||||
|
@click="handleReply(scope.row)" |
||||
|
> |
||||
|
回复 |
||||
|
</el-button> |
||||
|
</template> |
||||
|
</el-table-column> |
||||
|
</el-table> |
||||
|
<pagination v-if="crud.data.length !== 0" /> |
||||
|
</div> |
||||
|
</div> |
||||
|
</template> |
||||
|
|
||||
|
<script> |
||||
|
import crudWeixin, { FetchReplyReaderMessage } from '@/api/weixin/index' |
||||
|
import CRUD, { presenter, header, form, crud } from '@crud/crud' |
||||
|
import rrOperation from '@crud/RR.operation' |
||||
|
import crudOperation from '@crud/CRUD.operation' |
||||
|
import pagination from '@crud/Pagination' |
||||
|
import { mapGetters } from 'vuex' |
||||
|
|
||||
|
export default { |
||||
|
name: 'Column', |
||||
|
components: { pagination, crudOperation, rrOperation }, |
||||
|
cruds() { |
||||
|
return CRUD({ |
||||
|
title: '留言', |
||||
|
url: 'api/weixin/initReaderMessage', |
||||
|
crudMethod: { ...crudWeixin }, |
||||
|
optShow: { |
||||
|
add: false, |
||||
|
edit: false, |
||||
|
del: false, |
||||
|
reset: false, |
||||
|
download: false, |
||||
|
group: false |
||||
|
} |
||||
|
}) |
||||
|
}, |
||||
|
mixins: [presenter(), header(), form(function() { |
||||
|
return Object.assign({ libcode: this.user.fonds.fondsNo }) |
||||
|
}), crud()], |
||||
|
data() { |
||||
|
return { |
||||
|
keyWord: '', |
||||
|
optionVal: 'readCardNo', |
||||
|
options: [ |
||||
|
{ value: 'readCardNo', label: '读者证号' }, |
||||
|
{ value: 'readName', label: '读者昵称' }, |
||||
|
{ value: 'title', label: '留言主题' } |
||||
|
], |
||||
|
replyVisible: false, |
||||
|
replyLoading: false, |
||||
|
replyForm: { |
||||
|
id: null, |
||||
|
reply: '' |
||||
|
}, |
||||
|
replyRules: { |
||||
|
reply: [{ required: true, message: '请输入回复内容', trigger: 'blur' }] |
||||
|
}, |
||||
|
permission: { |
||||
|
add: [], |
||||
|
edit: [], |
||||
|
del: [] |
||||
|
}, |
||||
|
enabledTypeOptions: [ |
||||
|
{ key: '1', display_name: '已回复' }, |
||||
|
{ key: '0', display_name: '未回复' } |
||||
|
] |
||||
|
} |
||||
|
}, |
||||
|
computed: { |
||||
|
...mapGetters([ |
||||
|
'baseApi', |
||||
|
'user' |
||||
|
]) |
||||
|
}, |
||||
|
methods: { |
||||
|
[CRUD.HOOK.beforeRefresh]() { |
||||
|
this.crud.query.libcode = this.user.fonds.fondsNo |
||||
|
if (this.keyWord && this.optionVal) { |
||||
|
this.crud.query[this.optionVal] = this.keyWord |
||||
|
} else { |
||||
|
delete this.crud.query[this.optionVal] |
||||
|
} |
||||
|
}, |
||||
|
resetQuery() { |
||||
|
this.keyWord = '' |
||||
|
this.crud.query[this.optionVal] = this.keyWord |
||||
|
this.crud.query.isReply = null |
||||
|
this.crud.toQuery() |
||||
|
}, |
||||
|
searchChange(val) { |
||||
|
if (val) { |
||||
|
this.keyWord = '' |
||||
|
this.options.forEach(option => { |
||||
|
if (option.value !== val) { |
||||
|
this.crud.query[option.value] = null |
||||
|
} |
||||
|
}) |
||||
|
} |
||||
|
}, |
||||
|
handleReply(row) { |
||||
|
this.replyForm = { ...row } |
||||
|
this.replyVisible = true |
||||
|
}, |
||||
|
onRowDblclick(row) { |
||||
|
this.replyForm = { ...row } |
||||
|
this.replyVisible = true |
||||
|
}, |
||||
|
async submitReply() { |
||||
|
if (this.replyForm.reply) return |
||||
|
await this.$refs.replyForm.validate() |
||||
|
this.replyLoading = true |
||||
|
try { |
||||
|
const params = { |
||||
|
id: this.replyForm.id, |
||||
|
reply: this.replyForm.reply |
||||
|
} |
||||
|
await FetchReplyReaderMessage(params) |
||||
|
this.$message.success('回复成功') |
||||
|
this.replyVisible = false |
||||
|
this.crud.refresh() |
||||
|
} catch (error) { |
||||
|
this.$message.error('回复失败') |
||||
|
console.error(error) |
||||
|
} finally { |
||||
|
this.replyLoading = false |
||||
|
} |
||||
|
}, |
||||
|
// 清空回复表单验证 |
||||
|
clearReplyFormValidate() { |
||||
|
this.$nextTick(() => { |
||||
|
if (this.$refs.replyForm) { |
||||
|
this.$refs.replyForm.clearValidate() |
||||
|
} |
||||
|
this.replyVisible = false |
||||
|
}) |
||||
|
} |
||||
|
} |
||||
|
} |
||||
|
</script> |
||||
|
|
||||
|
<style lang="scss" scoped> |
||||
|
::v-deep .input-prepend .el-input__inner{ |
||||
|
padding-left: 110px; |
||||
|
} |
||||
|
::v-deep .el-dialog__footer{ |
||||
|
padding: 0 0 20px 0 !important; |
||||
|
} |
||||
|
</style> |
||||
Write
Preview
Loading…
Cancel
Save
Reference in new issue