Files
crmeb_java/admin/src/views/appSetting/wxAccount/reply/follow/index.vue
stivepeim 0d32da772d 圣诞快乐
# v1.3 更新列表
    1. 【新增】砍价
	2. 【新增】拼团
	3. 【新增】一号通
	4. 【修复】商品sku 编辑时出现商品属性对应错误的问题
	5. 【修复】商品推广海报生成二维码可能会出错的问题【小程序调试中】
	6. 【修复】微信公众号和小程序头像可能获取不到的问题
	7. 【修复】下单时可能会出错的问题
	8. 【修复】pc管理端用户访问量
	9. 【修复】微信退款
	10. 【修复】管理端订单状态可能出现不正确的情况
	11. 【修复】WEB管理端-菜单色调,短信API更新,首页用户访问量,系统设置tab是自动选择下一及表单
	12. 【修复】系统设置出现更新不正确的问题
2020-12-23 15:56:45 +08:00

627 lines
18 KiB
Vue
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
<template>
<div class="divBox">
<el-card class="box-card">
<router-link v-show="$route.path.indexOf('keyword') !== -1" :to="{path: '/appSetting/publicAccount/wxReply/keyword'}">
<el-button size="mini" class="mr20 mb20" icon="el-icon-back">返回</el-button>
</router-link>
<el-row :gutter="30" v-loading="loading">
<el-col v-bind="grid" class="acea-row">
<div class="left mb15 ml40">
<img class="top" src="@/assets/imgs/mobilehead.png">
<img class="bottom" src="@/assets/imgs/mobilefoot.png">
<div class="centent">
<div class="time-wrapper"><span class="time">9:36</span></div>
<div v-if="formValidate.type !== 'news'" class="view-item text-box clearfix">
<div class="avatar fl"><img src="@/assets/imgs/head.gif"></div>
<div class="box-content fl">
<span
v-if="formValidate.type === 'text'"
v-text="formValidate.contents.content"
/>
<div v-if="formValidate.contents.mediaId" class="box-content_pic">
<img v-if="formValidate.type === 'image'" :src="formValidate.contents.srcUrl">
<i class="el-icon-service" v-else></i>
</div>
</div>
</div>
<div v-if="formValidate.type === 'news'">
<div class="newsBox">
<!--<div class="news_pic mb15" style="backgroundImage: url('@/assets/imgs/mobilefoot.png');backgroundSize:'100% 100%'}" />-->
<div class="news_pic mb15" :style="{backgroundImage: 'url(' + (formValidate.contents.articleData.imageInput?formValidate.contents.articleData.imageInput[0]:'') + ')',backgroundSize:'100% 100%'}" />
<span class="news_sp">{{ formValidate.contents.articleData.title }}</span>
</div>
<!--<div v-for="(j, i) in formValidate.contents.list" :key="i">-->
<!--<div v-if="i === 0">-->
<!--<div class="news_pic mb15" :style="{backgroundImage: 'url(' + (j.image_input) + ')',backgroundSize:'100% 100%'}" />-->
<!--<span class="news_sp">{{ j.title }}</span>-->
<!--</div>-->
<!--<div v-else class="news_cent">-->
<!--<span v-if="j.synopsis" class="news_sp1">{{ j.title }}</span>-->
<!--<div v-if="j.image_input.length!==0" class="news_cent_img"><img :src="j.image_input"></div>-->
<!--</div>-->
<!--</div>-->
</div>
</div>
</div>
</el-col>
<el-col :xl="11" :lg="12" :md="14" :sm="22" :xs="22">
<div class="box-card right ml50">
<el-form
ref="formValidate"
:model="formValidate"
:rules="ruleValidate"
label-width="100px"
class="mt20"
@submit.native.prevent
>
<el-form-item v-if="$route.path.indexOf('keyword') !== -1" label="关键字:" prop="val">
<div class="arrbox">
<el-tag
v-for="(item, index) in labelarr"
:key="index"
type="success"
closable
class="mr5"
:disable-transitions="false"
@close="handleClose(item)"
>{{ item }}
</el-tag>
<el-input
v-model="val"
size="mini"
class="arrbox_ip"
placeholder="输入后回车"
style="width: 90%;"
@change="addlabel"
/>
</div>
</el-form-item>
<el-form-item label="规则状态:">
<el-radio-group v-model="formValidate.status">
<el-radio :label="true">启用</el-radio>
<el-radio :label="false">禁用</el-radio>
</el-radio-group>
</el-form-item>
<el-form-item label="消息类型:" prop="type">
<el-select
v-model="formValidate.type"
placeholder="请选择规则状态"
style="width: 90%;"
@change="RuleFactor(formValidate.type)"
>
<el-option label="文字消息" value="text">文字消息</el-option>
<el-option label="图片消息" value="image">图片消息</el-option>
<el-option label="图文消息" value="news">图文消息</el-option>
<el-option label="声音消息" value="voice">声音消息</el-option>
</el-select>
</el-form-item>
<el-form-item v-if="formValidate.type === 'text'" label="规则内容:" prop="content">
<el-input
v-model="formValidate.contents.content"
placeholder="请填写规则内容"
style="width: 90%;"
@input="change($event)"
/>
</el-form-item>
<el-form-item v-if="formValidate.type === 'news'" label="选取图文:">
<el-button size="mini" type="primary" @click="changePic">选择图文消息</el-button>
</el-form-item>
<el-form-item
v-if="formValidate.type === 'image' || formValidate.type === 'voice'"
:label="formValidate.type === 'image'?'图片地址:':'语音地址:'"
prop="mediaId"
>
<div class="acea-row row-middle">
<el-input
v-model="formValidate.contents.mediaId"
readonly="readonly"
placeholder="default size"
style="width: 75%;"
class="mr10"
/>
<el-upload
class="upload-demo mr10"
action
:http-request="handleUploadForm"
:headers="myHeaders"
:show-file-list="false"
multiple
>
<el-button size="mini" type="primary">点击上传</el-button>
</el-upload>
</div>
<span v-show="formValidate.type === 'image'">文件最大2Mb支持bmp/png/jpeg/jpg/gif格式</span>
<span v-show="formValidate.type === 'voice'">文件最大2Mb支持mp3/wma/wav/amr格式,播放长度不超过60s</span>
</el-form-item>
</el-form>
</div>
<el-col :span="24">
<div class="acea-row row-center">
<el-button
type="primary"
class="ml50"
@click="submenus('formValidate')"
>保存并发布
</el-button>
</div>
</el-col>
</el-col>
</el-row>
</el-card>
</div>
</template>
<script>
import { getToken } from '@/utils/auth'
import { replySaveApi, replyEditApi, replyInfoApi, replyListApi, keywordsInfoApi, replyUpdateApi } from '@/api/wxApi'
import { wechatUploadApi } from '@/api/systemSetting'
export default {
name: 'Index',
components: { },
data() {
const validateContent = (rule, value, callback) => {
if (this.formValidate.type === 'text') {
if (this.formValidate.contents.content === '') {
callback(new Error('请填写规则内容'))
} else {
callback()
}
}
}
const validateSrc = (rule, value, callback) => {
if (this.formValidate.type === 'image' && this.formValidate.contents.mediaId === '') {
callback(new Error('请上传'))
} else {
callback()
}
}
const validateVal = (rule, value, callback) => {
if (this.labelarr.length === 0) {
callback(new Error('请输入后回车'))
} else {
callback()
}
}
return {
loading: false,
visible: false,
grid: {
xl: 7,
lg: 12,
md: 10,
sm: 24,
xs: 24
},
delfromData: {},
isShow: false,
maxCols: 3,
scrollerHeight: '600',
contentTop: '130',
contentWidth: '98%',
modals: false,
val: '',
formatImg: ['jpg', 'jpeg', 'png', 'bmp', 'gif'],
formatVoice: ['mp3', 'wma', 'wav', 'amr'],
header: {},
formValidate: {
status: true,
type: '',
keywords: '',
contents: {
content: '',
articleData:{},
mediaId: '',
srcUrl: '',
articleId: null
},
id: null
},
ruleValidate: {
val: [
{ required: true, validator: validateVal, trigger: 'blur' }
],
type: [
{ required: true, message: '请选择消息类型', trigger: 'change' }
],
content: [
{ required: true, validator: validateContent, trigger: 'blur' }
],
mediaId: [
{ required: true, validator: validateSrc, trigger: 'change' }
]
},
labelarr: [],
myHeaders: { 'X-Token': getToken() }
}
},
computed: {
fileUrl() {
return https + `/wechat/reply/upload/image`
},
voiceUrl() {
return https + `/wechat/reply/upload/voice`
},
httpsURL() {
return process.env.VUE_APP_BASE_API.replace('api/', '')
}
},
watch: {
$route(to, from) {
if (this.$route.params.id) {
// this.formValidate.keywords = this.$route.params.key
this.details()
} else {
// this.labelarr = []
// this.$refs['formValidate'].resetFields()
}
}
},
mounted() {
if (this.$route.params.id) {
this.details()
}
if (this.$route.path.indexOf('keyword') === -1) {
this.followDetails()
}
},
methods: {
change (e) {
this.$forceUpdate()
},
// 上传
handleUploadForm(param){
const formData = new FormData()
formData.append('media', param.file)
let loading = this.$loading({
lock: true,
text: '上传中,请稍候...',
spinner: 'el-icon-loading',
background: 'rgba(0, 0, 0, 0.7)'
})
wechatUploadApi(formData, {type: this.formValidate.type === 'image'?'image':'voice'}).then(res => {
loading.close()
this.formValidate.contents.mediaId = res.mediaId
this.formValidate.contents.srcUrl = res.url
this.$message.success('上传成功')
}).catch(() => {
loading.close()
})
},
changePic() {
const _this = this
this.$modalArticle(function(row) {
_this.formValidate.contents.articleData ={
title: row.title,
imageInput : row.imageInput
}
_this.formValidate.contents.articleId = row.id
})
},
handleClosePic() {
this.visible = false
},
// 详情
details() {
this.loading = true
replyInfoApi({id:this.$route.params.id}).then(async res => {
const info = res || null
this.formValidate = {
status: info.status,
type: info.type,
keywords: info.keywords,
id: info.id,
contents: {
content: JSON.parse(info.data).content,
mediaId: JSON.parse(info.data).mediaId,
srcUrl: JSON.parse(info.data).srcUrl
}
}
this.labelarr = info.keywords.split(',') || []
this.loading = false
}).catch(() => {
this.loading = false
})
},
// 关注回复,无效关键词详情
followDetails() {
this.loading = true
keywordsInfoApi({ keywords: this.$route.path.indexOf('follow') !== -1 ? 'subscribe' : 'default'}).then(async res => {
const info = res || null
this.formValidate = {
status: info.status,
type: info.type,
keywords: info.keywords,
data: '',
id: info.id,
contents: {
content: JSON.parse(info.data).content || '',
mediaId: JSON.parse(info.data).mediaId || '',
srcUrl: JSON.parse(info.data).srcUrl || '',
articleData: JSON.parse(info.data).articleData || {},
}
}
this.loading = false
}).catch(() => {
this.loading = false
// if (res.message === '数据不存在') return
// this.$message.error(res.message)
})
},
// 下拉选择
RuleFactor(type) {
switch (type) {
case 'text':
this.formValidate.contents.mediaId = ''
this.formValidate.contents.srcUrl = ''
this.formValidate.contents.articleData = {}
break
case 'news':
this.formValidate.contents.mediaId = ''
this.formValidate.contents.content = ''
this.formValidate.contents.srcUrl = ''
this.formValidate.contents.articleData = {}
break
default:
this.formValidate.contents.content = ''
this.formValidate.contents.mediaId = ''
this.formValidate.contents.articleData = {}
}
// this.$refs['formValidate'].resetFields();
},
handleClose(tag) {
const index = this.labelarr.indexOf(tag)
this.labelarr.splice(index, 1)
},
addlabel() {
const count = this.labelarr.indexOf(this.val)
if (count === -1) {
this.labelarr.push(this.val)
}
this.val = ''
},
// 保存
submenus(name) {
this.$refs[name].validate((valid) => {
if (valid) {
this.formValidate.keywords = this.labelarr.join(',')
this.formValidate.data = JSON.stringify(this.formValidate.contents)
if (this.$route.path.indexOf('keyword') !== -1) {
this.$route.params.id ? replyUpdateApi({id:this.$route.params.id}, this.formValidate).then(async res => {
this.operation()
}).catch(res => {
this.$message.error(res.message)
}) : replySaveApi(this.formValidate).then(async res => {
this.operation()
}).catch(res => {
this.$message.error(res.message)
})
} else {
this.$route.path.indexOf('follow') !== -1 ? this.formValidate.keywords = 'subscribe' : this.formValidate.keywords ='default'
replyUpdateApi({id:this.formValidate.id}, this.formValidate).then(async res => {
this.$message.success('操作成功')
})
}
} else {
return false
}
})
},
// 保存成功操作
operation() {
this.$modalSure('继续添加').then(() => {
setTimeout(() => {
this.labelarr = []
this.val = ''
this.$refs['formValidate'].resetFields()
this.formValidate.contents.mediaId = ''
}, 1000)
}).catch(() => {
setTimeout(() => {
this.$router.push({ path: `/publicAccount/wxReply/keyword` })
}, 500)
})
}
}
}
</script>
<style scoped lang="scss">
.newsBox{
background: #fff;
}
.arrbox {
background-color: white;
font-size: 12px;
border: 1px solid #dcdee2;
border-radius: 6px;
margin-bottom: 0px;
padding:0 5px;
text-align: left;
box-sizing: border-box;
width: 90%;
}
.news_sp{
font-size: 12px;
color: #000000;
background: #fff;
width: 100%;
height: 38px;
line-height: 38px;
padding: 0 12px;
box-sizing: border-box;
display: block;
}
.arrbox_ip {
font-size: 12px;
border: none;
box-shadow: none;
outline: none;
background-color: transparent;
padding: 0;
margin: 0;
width: auto !important;
max-width: inherit;
min-width: 80px;
vertical-align: top;
color: #34495e;
margin: 2px;
}
.left {
min-width: 390px;
min-height: 550px;
position: relative;
padding-left: 40px;
}
.top {
position: absolute;
top: 0px;
}
.bottom {
position: absolute;
bottom: 0px;
}
.centent {
background: #F4F5F9;
min-height: 545px;
width: 320px;
padding: 15px;
box-sizing: border-box;
}
.right {
background: #fff;
min-height: 300px;
}
.box-content {
position: relative;
max-width: 60%;
min-height: 40px;
margin-left: 15px;
padding: 10px;
box-sizing: border-box;
border: 1px solid #ccc;
word-break: break-all;
word-wrap: break-word;
line-height: 1.5;
border-radius: 5px;
}
.box-content_pic {
width: 100%;
}
.box-content_pic img {
width: 100%;
height: auto;
}
.box-content:before {
content: '';
position: absolute;
left: -13px;
top: 11px;
display: block;
width: 0;
height: 0;
border-left: 8px solid transparent;
border-right: 8px solid transparent;
border-top: 10px solid #ccc;
-webkit-transform: rotate(90deg);
transform: rotate(90deg);
}
.box-content:after {
content: '';
content: '';
position: absolute;
left: -12px;
top: 11px;
display: block;
width: 0;
height: 0;
border-left: 8px solid transparent;
border-right: 8px solid transparent;
border-top: 10px solid #f5f5f5;
-webkit-transform: rotate(90deg);
transform: rotate(90deg);
}
.time-wrapper {
margin-bottom: 10px;
text-align: center;
margin-top: 62px;
}
.time {
display: inline-block;
color: #f5f5f5;
background: rgba(0, 0, 0, .3);
padding: 3px 8px;
border-radius: 3px;
font-size: 12px;
}
.text-box {
display: flex;
}
.avatar {
width: 40px;
height: 40px;
}
.avatar img {
width: 100%;
height: 100%;
}
.modelBox{
.ivu-modal-body{
padding: 0 16px 16px 16px !important;
}
}
.news_pic{
width: 100%;
height: 150px;
overflow: hidden;
position: relative;
background-size: 100%;
background-position: center center;
border-radius: 5px 5px 0 0;
padding: 10px;
box-sizing: border-box;
display: flex;
flex-direction: column;
align-items: flex-end;
}
.news_cent{
width: 100%;
height: auto;
background: #fff;
border-top: 1px dashed #eee;
display: flex;
padding: 10px;
box-sizing: border-box;
justify-content: space-between;
.news_sp1{
font-size: 12px;
color: #000000;
width: 71%;
}
.news_cent_img{
width: 81px;
height: 46px;
border-radius: 6px;
overflow: hidden;
img{
width: 100%;
height: 100%;
}
}
}
</style>