市北党建引领小程序初始化
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 

734 lines
20 KiB

const QQMapWX = require("../../utils/qqmap-wx-jssdk")
import { $wuxActionSheet } from "../../../../dist/index"
const config = require("../../../../utils/config")
import { addIssue } from "../../utils/api"
Page({
data: {
issueContent: "",
addressContent: "",
latitude: "",
longitude: "",
qqMapWX: "",
uploadImageList: [],
imageId: 1,
dialogVisible: false,
publishIssuePrevious: 0,
placeholderShow:true,
submitEvent:false,
isFirstNum:0,//0:初始状态,1:提交一次审核违规不通过
isConReview:false,//true 强制发送
audioManager: "", // 音频播放器
recorderManager: "", //
recorderData: {}, // 录音文件数据
recorderTimeMax: "", // 00:00
recorderTimeCur: "", // 00:00
showRecord: false, // 是否显示录音sheet
isRecord: 0, // 是否开始录音 0-未开始 1-正在录音 2-录音完成
recordingTime: 0, // 计时器
isPlayAudio: false, // 上传的音频播放状态
audioTimeline: 0, // 当前播放值
uploadRecord: {
uploaded: true,
url: ""
},
recorderDuration: "", // 录音时长
time: 5,
isCreateCity: "0", // 有奖举报的传1 默认传1
isShowTip: true
},
onLoad (e) {
console.log(e)
this.data.qqMapWX = new QQMapWX({
key: "CMJBZ-4DECI-JXGGN-5B4WU-QLV2H-B5BEJ"
})
this.getLocation().then(() => {
this.reverseLocation()
})
this.initRecordManager()
if (e && e.isCreateCity && e.isCreateCity == "1") {
wx.setNavigationBarTitle({
title: "有奖举报"
})
this.setData({
isCreateCity: e.isCreateCity
})
let timer = setInterval(() => {
this.setData({
time: this.data.time - 1
})
if (this.data.time == 1) {
clearTimeout(timer)
}
},1000)
} else {
wx.setNavigationBarTitle({
title: "随时讲"
})
this.setData({
isShowTip: false,
isCreateCity: "0"
})
}
},
closeTip() {
if (this.data.time == 1) {
this.setData({
isShowTip: false
})
}
},
onUnload () {
this.data.audioManager.destroy()
},
// 重新定位
getPosition(){
this.getLocation().then(() => {
this.reverseLocation()
})
},
// 解决ios占位符遮挡问题
bindTextareaFocus(){
this.setData({
placeholderShow:false,
})
},
// 解决ios占位符遮挡问题
bindTextareaBlur(e){
this.setData({
issueContent: e.detail.value
})
if(this.data.issueContent.length==0){
this.setData({
placeholderShow:true
})
}
},
// 双向绑定 内容输入框
bindTextareaInput (e) {
this.setData({
issueContent: e.detail.value
})
},
// 双向绑定 地址输入框
bindAddressInput (e) {
this.setData({
addressContent: e.detail.value
})
},
// 获取经纬度
getLocation () {
return new Promise((resolve, reject) => {
const _this = this
wx.getLocation({
success (res) {
if (res.latitude && res.longitude) {
_this.setData({
latitude: res.latitude,
longitude: res.longitude
})
resolve(true)
}
},
fail (err) {
reject(err)
}
})
})
},
// 逆地址解析
reverseLocation () {
const _this = this
this.data.qqMapWX.reverseGeocoder({
location: {
latitude: _this.data.latitude,
longitude: _this.data.longitude
},
success (res) {
_this.setData({
addressContent: res.result.address
})
},
fail (err) {
console.debug(err)
}
})
},
// 选择图片 上传弹窗 - 上传图片方式 - 选择图片 - 上传图片 - 回调赋值
chooseImage () {
if (this.data.uploadImageList.length > 2) {
wx.showToast({
title: "最多上传3张照片",
icon: "none"
})
return
}
const _this = this
$wuxActionSheet().showSheet({
buttons: [
{ text: "拍照" },
{ text: "从相册中获取" },
],
className: "dialog-class",
buttonClicked(index) {
if (index === 0) {
wx.chooseImage({
count: 1,
sizeType: ["original", "compressed"],
sourceType: ["camera"],
success (res) {
let deleteLength = _this.data.uploadImageList.length
const uploadImageList = [..._this.data.uploadImageList]
if (res.tempFiles[0].size <= 5 * 1024 * 1024) {
uploadImageList.push({
uploaded: false,
ossUrl: "",
imgUrl: res.tempFiles[0].path,
imageId: ++_this.data.imageId
})
} else {
wx.showToast({
title: "图片上限5M,请压缩后重试~",
icon: "none",
duration: 1500
})
return false
}
_this.setData({
uploadImageList
})
wx.uploadFile({
url: `${config.BASEURL()}group/topic/upload`,
filePath: res.tempFilePaths[0],
name: "file",
header: {
"Content-type": "multipart/form-data"
},
success (fileRes){
if(!JSON.parse(fileRes.data).data){
wx.showToast({
title: "图片上传失败,请重试~",
icon: "none",
duration: 1500
})
// 删除
const index = _this.data.uploadImageList.findIndex(item => item.imageId === _this.data.imageId)
if (index > -1) {
_this.data.uploadImageList.splice(index, 1)
_this.setData({
uploadImageList: _this.data.uploadImageList
})
}
}else {
uploadImageList[uploadImageList.length - 1].uploaded = true
uploadImageList[uploadImageList.length - 1].ossUrl = JSON.parse(fileRes.data).data
_this.setData({
uploadImageList
})
}
},
fail (fileRes) {
_this.setData({
uploadImageList: []
})
wx.showToast({
title: "图片上传失败,请重试~",
icon: "none",
duration: 1500
})
}
})
}
})
} else if (index === 1) {
wx.chooseImage({
count: 3 - _this.data.uploadImageList.length,
sizeType: ["original", "compressed"],
sourceType: ["album"],
success (res) {
let deleteLength = _this.data.uploadImageList.length
const uploadImageList = []
const endIndex = _this.data.uploadImageList.length
res.tempFiles.forEach(item => {
if (item.size <= 5 * 1024 * 1024) {
uploadImageList.push({
uploaded: false,
ossUrl: "",
imgUrl: item.path,
imageId: ++_this.data.imageId
})
} else {
wx.showToast({
title: "图片上限5M,请压缩后重试~",
icon: "none",
duration: 1500
})
}
})
_this.setData({
uploadImageList: [..._this.data.uploadImageList,...uploadImageList]
})
uploadImageList.forEach((item, index) => {
return (function (index) {
wx.uploadFile({
url: `${config.BASEURL()}group/topic/upload`,
filePath: res.tempFilePaths[index],
name: "file",
header: {
"Content-type": "multipart/form-data"
},
success (fileRes){
if(!JSON.parse(fileRes.data).data){
wx.showToast({
title: "图片上传失败,请重试~",
icon: "none",
duration: 1500
})
_this.data.uploadImageList.splice(deleteLength, _this.data.uploadImageList.length - deleteLength)
_this.setData({
uploadImageList: _this.data.uploadImageList
})
}else{
uploadImageList[index].uploaded = true
uploadImageList[index].ossUrl = JSON.parse(fileRes.data).data
_this.data.uploadImageList = _this.data.uploadImageList.slice(0, endIndex)
_this.setData({
uploadImageList: [..._this.data.uploadImageList, ...uploadImageList]
})
}
},
fail (fileRes) {
_this.setData({
uploadImageList: []
})
wx.showToast({
title: "图片上传失败,请重试~",
icon: "none",
duration: 1500
})
}
})
})(index)
})
}
})
}
return true
},
cancelText: "取消",
cancel() {},
destructiveButtonClicked() {},
})
},
// 删除选中的图片
deleteImage (e) {
const index = this.data.uploadImageList.findIndex(item => item.imageId === e.currentTarget.dataset.imageid)
if (index > -1) {
this.data.uploadImageList.splice(index, 1)
this.setData({
uploadImageList: this.data.uploadImageList
})
}
},
throttlePublisgIssue() {
let now = new Date()
if (now - this.data.publishIssuePrevious > 2000) {
this.publishIssue()
this.data.publishIssuePrevious = now
}
},
// 发布议题
publishIssue () {
if (!this.data.issueContent) {
wx.showToast({
title: this.data.isCreateCity == "1" ? "请填写内容" : "请填写议题内容",
icon: "none",
duration: 1500
})
return false
} else if (!this.data.addressContent) {
wx.showToast({
title: "请填写地址",
icon: "none",
duration: 1500
})
return false
}
const imagesList = []
if (this.data.uploadImageList.length > 0) {
const isUploadDown = this.data.uploadImageList.some(item => !item.uploaded)
if (isUploadDown) {
wx.showToast({
title: "请等待图片上传完成",
icon: "none",
duration: 1000
})
return false
}
}
if (this.data.uploadImageList.length > 0) {
this.data.uploadImageList.forEach(item => {
imagesList.push(item.ossUrl)
})
}
if (!this.data.uploadRecord.uploaded) {
wx.showToast({
title: "请等待录音上传完成",
icon: "none",
duration: 1000
})
return false
}
const para = {
eventContent: this.data.issueContent,
issueAddress: this.data.addressContent,
issueLongitude: this.data.longitude,
issueLatitude: this.data.latitude,
images: imagesList,
isConReview:this.data.isConReview,
voice: this.data.uploadRecord.url,
duration: this.data.recorderDuration,
isCreateCity: this.data.isCreateCity
}
wx.showLoading({
title: "加载中...",
mask:true
})
addIssue(para).then(res => {
console.log("发布议题", res)
this.setData({
dialogVisible: !this.data.dialogVisible,
isConReview:false
})
wx.hideLoading()
}).catch(err => {
let {code} =err
if(code==533){
this.checkTitle()
}else{
wx.showToast({
title: err,
icon: "none",
duration: 6000,
mask:true,
complete: () => {
setTimeout(() => {
wx.hideLoading()
}, 2000)
}
})
}
})
},
checkTitle(){
let that = this
if(this.data.isFirstNum==0){
this.setData({
isFirstNum:++this.data.isFirstNum
})
// wx.hideLoading()
// wx.showToast({
// title:'内容存在违规信息,请修改后重新提交!',
// icon:'none',
// duration: 3000,
// mask:true
// })
}else if(this.data.isFirstNum==1){
wx.hideLoading()
wx.showToast({
title:"",
icon:"none",
duration: 100,
mask:true
})
wx.showModal({
title: "提示",
content: "您提交的内容再次被判定为违规,您确定是否要提交?",
success (res) {
if (res.confirm) {
that.setData({
isConReview:true
})
that.publishIssue ()
} else if (res.cancel) {
}
}
})
}
},
// 知道了 确认按钮
confirmDialog () {
wx.switchTab({
url: "/pages/discussion/discussion"
})
},
// 点击空白,隐藏sheet
onHideSheet () {
this.setData({
showRecord: false
})
},
// 弹出录音
showRecordSheet () {
this.setData({
showRecord: true,
recorderData: {},
recorderTimeMax: "00:00",
recorderTimeCur: "00:00",
isRecord: 0,
recordingTime: 0,
uploadRecord: {
uploaded: true,
url: ""
}
})
},
// 删除录音
deleteRecord () {
this.setData({
recorderData: {},
uploadRecord: {
uploaded: true,
url: ""
}
})
},
// 取消录音
onCancelRecord () {
this.setData({
showRecord: false,
recorderData: {},
uploadRecord: {
uploaded: true,
url: ""
}
})
},
// 确定录音
onConfirmRecord () {
this.setRecordTimeline()
this.setData({
showRecord: false,
"uploadRecord.uploaded": false,
"uploadRecord.url": ""
})
wx.uploadFile({
url: `${config.BASEURL()}group/topic/upload`,
filePath: this.data.recorderData.tempFilePath,
name: "file",
header: {
"Content-type": "multipart/form-data"
},
success: (fileRes) => {
if (!JSON.parse(fileRes.data).data) {
wx.showToast({
title: "录音上传失败,请重试~",
icon: "none",
duration: 1500
})
this.setData({
"uploadRecord.uploaded": true,
"uploadRecord.url": "",
recorderDuration: "",
recorderData: {}
})
} else {
this.setData({
"uploadRecord.uploaded": true,
"uploadRecord.url": JSON.parse(fileRes.data).data
})
}
},
fail: (fileRes) => {
wx.showToast({
title: "录音上传失败,请重试~",
icon: "none",
duration: 1500
})
this.setData({
"uploadRecord.uploaded": true,
"uploadRecord.url": "",
recorderDuration: "",
recorderData: {}
})
}
})
},
initRecordManager () {
this.data.recorderManager = wx.getRecorderManager()
this.data.recorderManager.onStop(res => {
if (res.duration < 1000) {
wx.showToast({
title: "录音时间太短",
icon: "none"
})
this.setData({
isRecord: 0,
recordingTime: 0
})
} else {
clearInterval(this.data.setInter)
this.setData({
isRecord: 2,
recordingTime: 0,
recorderData: res
}, () => {
this.setRecordTimeline()
})
}
})
// 音频播放
this.data.audioManager = wx.createInnerAudioContext()
this.data.audioManager.onPlay(() => {
})
this.data.audioManager.onStop(() => {
clearInterval(this.data.setInter)
this.setData({
isPlayAudio: false,
recordingTime: 0,
recorderTimeCur: "00:00",
audioTimeline: 0
})
})
this.data.audioManager.onEnded(() => {
clearInterval(this.data.setInter)
this.setData({
isPlayAudio: false,
recordingTime: 0,
recorderTimeCur: "00:00",
audioTimeline: 0
})
})
this.data.audioManager.onError(() => {
console.log("音频播放错误", this.data.audioManager.src)
clearInterval(this.data.setInter)
this.setData({
recordingTime: 0,
recorderTimeCur: "00:00"
})
})
},
//
setRecordTimeline () {
let sec = Math.ceil(this.data.recorderData.duration / 1000)
this.data.recorderDuration = sec
if (sec < 10) {
this.setData({
recorderTimeMax: "00:0" + sec,
recorderTimeCur: "00:00"
})
} else if (sec > 59) {
this.setData({
recorderTimeMax: "01:00", // 目前最长60秒
recorderTimeCur: "00:00"
})
} else {
this.setData({
recorderTimeMax: "00:" + sec,
recorderTimeCur: "00:00"
})
}
},
//
countRecordTimeline () {
clearInterval(this.data.setInter)
this.data.setInter = setInterval(() => {
this.setData({
recordingTime: this.data.recordingTime + 1
}, () => {
if (this.data.recordingTime < 10) {
this.setData({
recorderTimeCur: "00:0" + this.data.recordingTime
})
} else {
this.setData({
recorderTimeCur: "00:" + this.data.recordingTime
})
}
if (!this.data.showRecord) {
let max = Math.ceil(this.data.recorderData.duration / 1000)
let value = parseFloat(this.data.recordingTime / max).toFixed(2)
this.setData({
audioTimeline: value * 100
})
}
})
}, 1000)
},
//录音计时器
recordingTimer () {
clearInterval(this.data.setInter)
this.data.setInter = setInterval(() => {
this.setData({
recordingTime: this.data.recordingTime + 1
})
}, 1000)
},
// 长按录音 longpress时触发
recordStart () {
console.log("开始录音")
const options = {
duration: 60000, //指定录音的时长,单位 ms,最大为10分钟(600000),默认为1分钟(60000)
sampleRate: 16000, //采样率
numberOfChannels: 1, //录音通道数
encodeBitRate: 96000, //编码码率
format: "mp3", //音频格式,有效值 aac/mp3
frameSize: 50, //指定帧大小,单位 KB
}
this.data.recorderManager.start(options) // 开始录音
this.recordingTimer()
this.setData({
isRecord: 1
})
},
// 松开发送 touchend (手指松开时)触发
recordStop () {
console.log("停止录音")
if (this.data.isRecord == 0) {
return
}
this.data.recorderManager.stop() // 结束录音
clearInterval(this.data.setInter)
this.setData({
isRecord: 2,
recordingTime: 0
})
},
// 播放录音
onPlayRecord () {
this.data.audioManager.src = this.data.recorderData.tempFilePath
this.data.audioManager.play()
this.countRecordTimeline()
},
// 播放音频
onPlayAudio () {
if (this.data.recorderData.tempFilePath) {
this.setData({
isPlayAudio: true
})
this.data.audioManager.src = this.data.recorderData.tempFilePath
this.data.audioManager.play()
this.countRecordTimeline()
}
},
// 暂停播放音频
onStopAudio () {
this.setData({
isPlayAudio: false
})
this.data.audioManager.stop()
},
//
sliderchange () {
let max = Math.ceil(this.data.recorderData.duration / 1000)
let value = parseFloat(this.data.recordingTime / max).toFixed(2)
this.setData({
audioTimeline: value * 100
})
}
})