Files
2024-10-31 14:34:57 +08:00

473 lines
13 KiB
Vue
Raw Permalink 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>
<section class="AppMessageNotification">
<div class="header">
<p>注意</p>
<p>每个用户每天可以接受10条群发消息不限企业发布的群发还是个人发布的群发</p>
<p>个人群发每天可以给用户发送10条群发消息</p>
</div>
<div class="select-user">
<div class="label color-666">用户选择</div>
<div class="right" @click="toSelect">
<span>
<span v-if="!areaIdList.length && !tagIdList.length && !deptList.length && !userList.length">全部</span>
<span v-else>已选择<!-- <span class="color-1365DD">10</span> --></span>
</span>
<img src="./components/img/right-icon.png" alt="">
</div>
</div>
<div class="content">
<p class="title fw500 mar-b32">群发消息设置</p>
<div class="select-user pad-lr0">
<div class="label color-666"><span class="tips">*</span>群发方式</div>
<div class="right">
<u-radio-group v-model="form.sendType">
<u-radio v-for="(item, index) in sendTypeList" :key="index" :label="item.name" :name="item.type">{{item.name}}</u-radio>
</u-radio-group>
</div>
<u-picker mode="time" v-model="timeShow" :params="timeParams" @confirm="timeSelect"></u-picker>
</div>
<div class="select-user pad-lr0" v-if="form.sendType == 1">
<div class="label color-666"><span class="tips">*</span>群发时间</div>
<div class="right" @click="timeShow=true">
<span v-if="form.sendTime">{{form.sendTime}}</span>
<span class="color-999" v-else>请选择</span>
</div>
<u-picker mode="time" v-model="timeShow" :params="timeParams" @confirm="timeSelect"></u-picker>
</div>
<div class="mini-title color-666"><span class="tips">*</span>文本内容</div>
<div class="textarea">
<u-input v-model="form.content" type="textarea" :height="400" auto-height maxlength="1000" placeholder="请输入文本内容" />
<div class="hint">{{ form.content.length }}/1000</div>
</div>
<!-- <div class="type">
<p class="color-666">其它类型</p>
<u-radio-group v-model="form.contentType">
<u-radio v-for="(item, index) in typeList" :key="index" :name="item.type" @change="radioChange" > {{item.name}}</u-radio>
</u-radio-group>
</div> -->
<div class="type-content">
<div class="flex">
<p class="label" style="width:40px;">图片</p>
<AiUploader type="image" :limit="9" multiple :def.sync="fileListImg" @data="changeImg"></AiUploader>
</div>
<div class="flex" >
<p class="label" style="width:40px;">视频</p>
<AiUploader type="video" :limit="9" multiple placeholder="上传视频" :def.sync="fileListVideo" @data="changeVideo"></AiUploader>
</div>
<div class="flex">
<p class="label" style="width:40px;">附件</p>
<AiUploader type="file" :limit="9" multiple placeholder="上传附件" :def.sync="fileListFile" @data="changeFile"></AiUploader>
</div>
<div v-if="form.contentType == 'link'">
<div class="flex border-b">
<p class="label">链接地址</p>
<div class="value">
<u-input v-model="formData.accessUrl" type="text" input-align="right" placeholder="请输入链接地址" height="44" />
</div>
</div>
<div class="flex border-b">
<p class="label">链接图片</p>
<AiUploader multiple :def.sync="formData.imgList" :limit="1" action="/admin/file/add2"></AiUploader>
</div>
<div class="flex">
<p class="label">链接标题</p>
<div class="value">
<u-input v-model="formData.accessTitle" type="text" input-align="right" placeholder="请输入链接标题" height="44" />
</div>
</div>
</div>
<div v-if="form.contentType == 'miniapp'" class="flex-label">
<div class="flex border-b">
<p class="label">小程序标题</p>
<div class="value">
<u-input v-model="formData.accessTitle" type="text" input-align="right" placeholder="请输入小程序标题" height="44" />
</div>
</div>
<div class="flex border-b">
<p class="label">小程序APPID</p>
<div class="value">
<u-input v-model="formData.accessAppid" type="text" input-align="right" placeholder="请输入小程序APPID" height="44" />
</div>
</div>
<div class="flex border-b">
<p class="label">小程序跳转页面</p>
<div class="value">
<u-input v-model="formData.accessUrl" type="text" input-align="right" placeholder="如pages/home/home" height="44" />
</div>
</div>
<div class="flex">
<p class="label" style="width:80px;">小程序图片</p>
<AiUploader multiple :def.sync="formData.imgList" :limit="1" action="/admin/file/add2"></AiUploader>
</div>
</div>
</div>
<!-- <div class="upload"><u-icon name="plus-circle-fill" color="#1365DD" size="32"></u-icon>添加附件</div> -->
</div>
<div class="bg-144"></div>
<div class="footer">
<div @click="back">取消</div>
<div class="confirm" @click="confirm">确认发送</div>
</div>
<!-- <u-popup v-model="show" mode="bottom">
<div class="popup">
<div class="item" v-for="(item, index) in popupList" :key="index">
<div class="icon-bg">
<u-icon :name="item.icon" size="56" color="#333"></u-icon>
</div>
<p>{{item.text}}</p>
</div>
</div>
</u-popup> -->
</section>
</template>
<script>
import {mapState} from 'vuex'
export default {
name: "AppMessageNotification",
appName: "消息通知",
data() {
return {
typeList: [
{name: '图片', type: 'image'},
{name: '视频', type: 'video'},
{name: '文件', type: 'file'}
],
sendTypeList: [
{name: '立即发送', type: '0'},
{name: '定时发送', type: '1'}
],
form: {
content: '',
sendType: '0',
sendTime: ''
},
formData: {},
fileList: [],
fileListImg: [],
fileListVideo: [],
fileListFile: [],
areaIdList: [],
tagIdList: [],
deptList: [],
userList: [],
timeShow: false,
timeParams: {
year: true,
month: true,
day: true,
hour: true,
minute: true,
second: true
},
}
},
computed: {...mapState(['user'])},
methods: {
changeImg(e) {
this.$nextTick(() => {
this.fileListImg.map((item) => {
if(item.id == e.file.id) {
item.mediaId = e.media.mediaId
item.contentType = 'image'
}
})
})
},
changeVideo(e) {
this.$nextTick(() => {
this.fileListVideo.map((item) => {
if(item.id == e.file.id) {
item.mediaId = e.media.mediaId
item.contentType = 'video'
}
})
})
},
changeFile(e) {
this.$nextTick(() => {
this.fileListFile.map((item) => {
if(item.id == e.file.id) {
item.mediaId = e.media.mediaId
item.contentType = 'file'
}
})
})
},
toSelect() {
uni.navigateTo({url: `./chooseUser?tagIdList=${this.tagIdList}&areaList=${this.areaIdList}&deptList=${this.deptList}&userList=${this.userList}`})
},
timeSelect(e) {
var nowTime = new Date().getTime() * 1
var beginTimes = new Date(e.year + '/' + e.month + '/' + e.day + ' ' + e.hour + ':' + e.minute + ':' + e.second).getTime() * 1
if (nowTime > beginTimes) {
// this.form.sendTime = ''
return this.$u.toast('群发时间应大于当前时间')
} else {
this.form.sendTime = `${e.year}-${e.month}-${e.day} ${e.hour}:${e.minute}:${e.second}`
}
},
confirm() {
this.$loading()
if(this.form.sendType == 1 && !this.form.sendTime) {
return this.$u.toast('请选择群发时间')
}
if(!this.form.content) {
return this.$u.toast('请输入文本内容')
}
this.fileList = []
var contentFile = {
content: this.form.content,
contentType: 'text'
}
this.fileList = [...this.fileListImg, ...this.fileListVideo, ...this.fileListFile]
this.fileList.unshift(contentFile)
var params = {
...this.form,
areaId: this.areaIdList.join(','),
tag: this.tagIdList.join(','),
deptList: this.deptList,
userList: this.userList,
fileList: this.fileList
}
this.$http.post("/app/pushmessage/addOrUpdate", params).then(res => {
if (res?.code == 0) {
this.$u.toast('发送成功')
setTimeout(() => {
this.back()
}, 500)
// this.form = {
// content: '',
// contentType: 'text',
// sendType: '0',
// sendTime: ''
// }
// this.areaIdList = []
// this.tagIdList = []
// this.formDataInit()
}else {
this.$u.toast(res.msg)
}
}).catch((err) => {
this.$u.toast(err)
})
},
formDataInit() {
for(let key in this.form) {
this.form[key] = ''
}
this.form.sendType = '0'
this.fileListImg = []
this.fileListVideo = []
this.fileListFile = []
this.areaIdList = []
this.tagIdList = []
this.deptList = []
this.userList = []
},
back() {
uni.navigateBack()
}
},
created() {
this.areaId = this.user.areaId
this.areaName = this.user.areaName
uni.$on('selectTag', res => {
this.tagIdList = res.tagIdList
this.areaIdList = res.areaIdList
this.deptList = res.deptList
this.userList = res.userList
})
},
}
</script>
<style lang="scss" scoped>
.AppMessageNotification {
height: 100%;
background-color: #f3f6f9;
.fw500{
font-weight: 500;
font-size: 32px!important;
}
.color-666{
color: #666;
font-size: 30px;
}
.tips{
font-size: 34px;
color: #f46!important;
vertical-align: middle;
}
.mar-b32{
margin-bottom: 32px;
}
.header{
// background-color: #fff;
padding: 32px 32px 20px 32px;
box-sizing: border-box;
margin-bottom: 16px;
p{
line-height: 44px;
margin-bottom: 8px;
word-break: break-all;
font-size: 28px;
color: #666;
}
}
.select-user{
background-color: #fff;
padding: 34px 32px;
display: flex;
justify-content: space-between;
margin-bottom: 16px;
font-size: 30px;
img{
width: 44px;
height: 44px;
vertical-align: middle;
}
.color-999{
color: #999;
}
.color-1365DD{
color: #1365DD;
}
.label{
width: 160px;
}
.right{
width: calc(100% - 160px);
text-align: right;
}
}
.pad-lr0{
padding: 0;
margin-bottom: 32px;
}
.content{
padding: 32px;
box-sizing: border-box;
background-color: #fff;
.title{
line-height: 44px;
margin-bottom: 24px;
}
.mini-title{
line-height: 44px;
margin-bottom: 24px;
}
.textarea{
padding: 16px 32px;
box-sizing: border-box;
border: 1px solid #ddd;
.hint {
padding: 4px 0 8px 0;
text-align: right;
color: #999;
}
}
// .upload{
// padding: 16px 32px;
// line-height: 44px;
// border: 1px solid #ddd;
// border-top: 0;
// .u-icon{
// margin-right: 8px;
// }
// }
.type{
margin-top: 32px;
p{
display: inline-block;
margin-right: 16px;
}
}
.type-content{
margin-top: 32px;
.label{
display: inline-block;
margin-right: 16px;
vertical-align: top;
font-size: 30px;
color: #666;
width: 130px;
}
.value{
width: calc(100% - 130px);
}
.ai-uploader{
display: inline-block;
width: calc(100% - 130px);
}
.flex{
padding: 34px 0;
line-height: 44px;
display: flex;
}
.border-b{
border-bottom: 1px solid #ddd;
}
.flex-label{
.label{
width: 260px;
}
}
}
}
.bg-144{
height: 144px;
}
.footer {
position: fixed;
bottom: 0;
left: 0;
width: 100%;
height: 112px;
line-height: 112px;
background: #fff;
display: flex;
font-size: 36px;
font-family: PingFangSC-Regular, PingFang SC;
.confirm {
color: #fff;
background: #1365dd;
}
div {
flex: 1;
text-align: center;
color: #333;
}
}
.popup{
padding-top: 32px;
background-color: #f3f6f9;
.item{
display: inline-block;
width: 25%;
text-align: center;
padding: 32px 0;
.icon-bg{
width: 100px;
height: 100px;
line-height: 100px;
text-align: center;
background-color: #fff;
margin: 0 auto;
border-radius: 8px;
margin-bottom: 16px;
.u-icon{
margin-top: 20px;
}
}
p{
line-height: 44px;
font-size: 30px;
font-weight: 500;
color: #333;
}
}
}
}
</style>