2025.03.15 工作代码提交

This commit is contained in:
sx 2025-03-15 18:11:53 +08:00
parent fdee18b7f8
commit cc9578f3eb
10 changed files with 594 additions and 581 deletions

View File

@ -130,6 +130,7 @@ export const news = {
method: 'POST', method: 'POST',
data: param.data, data: param.data,
query: param.query, query: param.query,
load: true,
}) })
}, },
@ -139,7 +140,7 @@ export const news = {
url: `/user/getRedPacketInfo`, url: `/user/getRedPacketInfo`,
method: 'GET', method: 'GET',
query: param.query, query: param.query,
load: 1, load: true,
}) })
}, },
@ -150,6 +151,7 @@ export const news = {
method: 'POST', method: 'POST',
data: param.data, data: param.data,
query: param.query, query: param.query,
load: true,
}) })
}, },
@ -219,7 +221,7 @@ export const news = {
}) })
}, },
// 客服发消息 // 客服发消息
sendCusomterService(param) { sendCusomterService(param) {
return util.request({ return util.request({

View File

@ -7,7 +7,6 @@ const config = {
// #endif // #endif
// #ifndef H5 // #ifndef H5
host: 'http://91f.xyz:8080', host: 'http://91f.xyz:8080',
// host: 'http://762c9b48.r24.cpolar.top',
// #endif // #endif
// 是否vivo显示 // 是否vivo显示
showVivo: true, showVivo: true,

View File

@ -134,7 +134,7 @@ const util = {
reject(res) reject(res)
}, },
complete(rs) { complete(rs) {
console.log('upload complete', rs) // console.log('upload complete', rs)
} }
}) })
}) })
@ -213,7 +213,7 @@ const util = {
responseType: params.responseType || 'text', responseType: params.responseType || 'text',
// 请求成功返回 // 请求成功返回
success: res => { success: res => {
// console.log('request success', url, res, params.data ? params.data : '') console.log('request success', url, res, params.data ? params.data : '')
// 关闭加载效果 // 关闭加载效果
if (params.load) { if (params.load) {
uni.hideLoading() uni.hideLoading()
@ -602,6 +602,7 @@ const util = {
count: obj.type == 1 ? 1 : count - obj.value.length, count: obj.type == 1 ? 1 : count - obj.value.length,
sourceType: obj.sourceType || ['album', 'camera'], sourceType: obj.sourceType || ['album', 'camera'],
success: (rs) => { success: (rs) => {
console.log('rs', rs)
// 遍历图片返回列表 // 遍历图片返回列表
rs.tempFiles.forEach(item => { rs.tempFiles.forEach(item => {
// 限制大小 // 限制大小
@ -615,6 +616,7 @@ const util = {
file: item.path, file: item.path,
mode: 'img', mode: 'img',
success(res) { success(res) {
console.log('upload res', res)
if (res.code === 200) { if (res.code === 200) {
uni.getImageInfo({ uni.getImageInfo({
src: item.path, src: item.path,
@ -625,6 +627,7 @@ const util = {
width: imageInfo.width, width: imageInfo.width,
height: imageInfo height: imageInfo
.height, .height,
size: item.size,
}); });
}, },
}) })

View File

@ -114,8 +114,11 @@
res.forEach(item => { res.forEach(item => {
let obj = {} let obj = {}
obj.type = item.type; obj.type = item.type;
obj.chatText = item.lastMessage.messageForShow; //
obj.chatText = item.lastMessage.messageForShow
if (obj.chatText == "[自定义消息]") obj.chatText = item.lastMessage.payload.description || '[自定义消息]'
obj.MsgTime = handleDate(item.lastMessage.lastTime); obj.MsgTime = handleDate(item.lastMessage.lastTime);
//
obj.unreadCount = item.unreadCount; obj.unreadCount = item.unreadCount;
if (item.type == 'C2C') { if (item.type == 'C2C') {

View File

@ -149,24 +149,28 @@
uni.offKeyboardHeightChange(() => {}) uni.offKeyboardHeightChange(() => {})
// #endif // #endif
videoContext.value.stop() videoContext.value.stop()
//
removeListener()
}) })
// //
function addListener() { function addListener() {
let onMessageReceived = function(event) { let onMessageReceived = function(event) {
console.log('TencentCloudChat.EVENT.MESSAGE_RECEIVED', event) console.log('TencentCloudChat.EVENT.MESSAGE_RECEIVED', event)
setTimeout(() => { //
// list.messageList.push(...event.data)
getHistory({
msgId: '',
limit: 1,
})
}, 200)
} }
uni.$chat.on(TencentCloudChat.EVENT.MESSAGE_RECEIVED, onMessageReceived); uni.$chat.on(TencentCloudChat.EVENT.MESSAGE_RECEIVED, onMessageReceived);
} }
//
function removeListener() {
let onMessageReceived = function(event) {}
uni.$chat.off(TencentCloudChat.EVENT.MESSAGE_RECEIVED, onMessageReceived);
}
// //
function onContentScroll(ev) { function onContentScroll(ev) {
if (ev.scrollTop == 50) getMoreHistroy() if (ev.scrollTop == 50) getMoreHistroy()
@ -177,18 +181,26 @@
// //
function handleSend() { function handleSend() {
//
if (!content.value) {
util.alert('消息不能为空')
return
}
//
inputFocus.value = false inputFocus.value = false
//
let message = uni.$chat.createTextMessage({
to: msg.id,
conversationType: msg.type,
payload: {
text: content.value
},
})
// //
sendMsg({ sendMsg({
query: { message,
formId: userinfo.value.id,
toUserId: msg.id,
msgType: TencentCloudChat.TYPES.MSG_TEXT,
},
data: {
text: content.value
},
success: () => { success: () => {
// //
content.value = '' content.value = ''
@ -202,7 +214,9 @@
* @param {Object} message 消息对象 * @param {Object} message 消息对象
*/ */
function handlePlusSend(message) { function handlePlusSend(message) {
sendMsg(message) sendMsg({
message
})
} }
/** /**
@ -210,22 +224,13 @@
* @param {Object} param * @param {Object} param
*/ */
function sendMsg(param) { function sendMsg(param) {
// console.log('sendMsg', param.message)
let request = api.news.sendUserMsg
//
if (msg.type == 'GROUP') request = api.news.sendGroupMsg
// if (msg.isCustomer) request = api.news.sendCusomterService
// //
request({ uni.$chat.sendMessage(param.message).then((rs) => {
query: param.query, console.log('send success', rs)
data: param.data, if (rs.code == 0) {
}).then((rs) => { //
if (rs.code == 200) { list.messageList.push(rs.data.message)
// getHistory({
// msgId: '',
// limit: 1,
// })
param.success ? param.success() : '' param.success ? param.success() : ''
return return
} }
@ -240,14 +245,14 @@
/** /**
* 打开红包详情 * 打开红包详情
* @param {Object} ev * @param {Object} event 默认事件
*/ */
function handleRedPacket(ev) { function handleRedPacket(event) {
messageItem.value = ev console.log('event', event)
api.news.getRedPacketInfo({ api.news.getRedPacketInfo({
query: { query: {
// id // id
redPacketId: ev.callbackData.callback_json[0].businessId redPacketId: event.formatData.id,
} }
}).then(rs => { }).then(rs => {
if (rs.code == 200) { if (rs.code == 200) {
@ -310,10 +315,9 @@
// //
function getMoreHistroy() { function getMoreHistroy() {
// // if(list.isCompleted) return
if (list.total <= list.data.length) return
getHistory({ getHistory({
msgId: list.data[0].id msgId: list.messageList[0].ID
}) })
} }
@ -558,15 +562,15 @@
<view class="tool bfff" id="tool"> <view class="tool bfff" id="tool">
<view class="tool-group"> <view class="tool-group">
<!-- 摁住说话 -->
<!-- 语音 --> <!-- 语音 -->
<image src="/static/news-voice.png" mode="widthFix" class="thumb" @click="handleTool('voice')"></image> <image src="/static/news-voice.png" mode="widthFix" class="thumb" @click="handleTool('voice')"></image>
<!-- 摁住说话 -->
<template v-if="toolStatus == 'voice'"> <template v-if="toolStatus == 'voice'">
<JyVoice @send="voiceSend" :msg="msg" /> <JyVoice @send="voiceSend" :msg="msg" />
</template> </template>
<!-- 输入框 --> <!-- 输入框 -->
<template v-if="toolStatus != 'voice'"> <template v-if="toolStatus != 'voice'">
<uni-easyinput @focus="onFocus" type="text" v-model="content" :clearable="false" class="input" <uni-easyinput @focus="onFocus" type="text" v-model.trim="content" :clearable="false" class="input"
:adjust-position="false" @keyboardheightchange="keyboardheightchange" placeholder="请输入你的问题" :adjust-position="false" @keyboardheightchange="keyboardheightchange" placeholder="请输入你的问题"
confirmType="发送" :focus="inputFocus" /> confirmType="发送" :focus="inputFocus" />
</template> </template>

View File

@ -11,6 +11,9 @@
computed, computed,
defineEmits, defineEmits,
} from 'vue' } from 'vue'
//
import util from '@/common/js/util';
import NewsAudio from '@/static/audio.png' import NewsAudio from '@/static/audio.png'
import JyCommodityInformation from '@/components/public/jy-commodity-information' import JyCommodityInformation from '@/components/public/jy-commodity-information'
const props = defineProps({ const props = defineProps({
@ -30,7 +33,11 @@
const store = useStore() const store = useStore()
const emit = defineEmits(['openRedBag', 'viewVideo']) const emit = defineEmits(['openRedBag', 'viewVideo'])
// //
const formatData = computed(() => props.item) const formatData = computed(() => {
let result = props.item.payload.data || ''
if (result) result = JSON.parse(result)
return result
})
// //
const innerAudioContext = uni.createInnerAudioContext(); const innerAudioContext = uni.createInnerAudioContext();
// //
@ -41,10 +48,7 @@
}) })
} }
// //
const userinfo = computed(() => { const userinfo = computed(() => store.state.userinfo)
let result = store.state.userinfo
return result
})
// //
function handleCall() { function handleCall() {
@ -58,20 +62,34 @@
// //
function handleOpenRedBag() { function handleOpenRedBag() {
emit('openRedBag', props.item) emit('openRedBag', {
item: props.item,
formatData: formatData.value,
})
} }
// //
function handleViewVideo(item) { function handleViewVideo(item) {
emit('viewVideo', item) emit('viewVideo', item)
} }
/**
* 看图片
* @param {Object} urls 图片路径数组
*/
function handleViewImage(urls) {
uni.previewImage({
urls,
})
}
</script> </script>
<template> <template>
<view class="content pr"> <view class="content pr">
<!-- 图片 --> <!-- 图片 -->
<template v-if="item.type === TencentCloudChat.TYPES.MSG_IMAGE"> <template v-if="item.type === TencentCloudChat.TYPES.MSG_IMAGE">
<image class="br10" :src="formatData.MsgContent.ImageInfoArray[0].URL" mode="widthFix" /> <image class="br10" :src="item.payload.imageInfoArray[0].imageUrl" mode="widthFix"
@click="util.view_imgs([item.payload.imageInfoArray[0].imageUrl],0)" />
</template> </template>
<!-- 文字 --> <!-- 文字 -->
<template v-else-if="item.type === TencentCloudChat.TYPES.MSG_TEXT"> <template v-else-if="item.type === TencentCloudChat.TYPES.MSG_TEXT">
@ -140,12 +158,12 @@
<!-- 红包 --> <!-- 红包 -->
<view class="redPacket br10" :class="{'disabled': 0}" @click="handleOpenRedBag"> <view class="redPacket br10" :class="{'disabled': 0}" @click="handleOpenRedBag">
<view class="df aic"> <view class="df aic">
<image class="img fs0 mr10" src="/static/image/pages/news/group/create.png" /> <image class="img fs0 mr10" src="/static/image/red-envelope.png" />
<view class="red-packet-text cfff">{{ formatData.data.blessing }}</view> <view class="red-packet-text cfff">{{ formatData.blessing }}</view>
</view> </view>
<!-- 分割线 --> <!-- 分割线 -->
<view class="line"></view> <view class="line"></view>
<view class="f20" style="color:#FBD3A4">{{ formatData.data.payType == 1 ? '余额红包' : '积分红包' }} <view class="f20" style="color:#FBD3A4">{{ formatData.redPacketType == 1 ? '余额红包' : '积分红包' }}
</view> </view>
</view> </view>
</template> </template>

View File

@ -18,7 +18,7 @@ export const getHistoryMsg = async (option) => {
nextReqMessageID: option.nextReqMessageID, nextReqMessageID: option.nextReqMessageID,
} }
console.log('options', options); console.log('getHistoryMsg', options);
return new Promise((resolve, reject) => { return new Promise((resolve, reject) => {
uni.$chat.getMessageList(options).then((res) => { uni.$chat.getMessageList(options).then((res) => {
resolve(res) resolve(res)

View File

@ -1,37 +1,40 @@
<script setup> <script setup>
// + // +
// //
import TencentCloudChat from '@tencentcloud/chat'; import TencentCloudChat from '@tencentcloud/chat';
import { import {
ref, ref,
reactive, reactive,
nextTick, nextTick,
computed, computed,
} from 'vue' } from 'vue'
import { import {
screenHeight screenHeight
} from '@/components/public/Mixins' } from '@/components/public/Mixins'
import JyCommodityInformation from '@/components/public/jy-commodity-information' import JyCommodityInformation from '@/components/public/jy-commodity-information'
// api // api
import api from '@/api/index.js' import api from '@/api/index.js'
// //
import util from '@/common/js/util.js' import util from '@/common/js/util.js'
import { inject } from 'vue' import {
inject
} from 'vue'
const { checkLink } = inject('util'); const {
// checkLink
const props = defineProps({ } = inject('util');
msg: { //
type: Object, const props = defineProps({
}, msg: {
}) type: Object,
},
})
// //
const emit = defineEmits(['plusClick', 'send']) const emit = defineEmits(['plusClick', 'send'])
// //
const plusList = computed(() => { const plusList = computed(() => {
let result = [ let result = [{
{
type: 'picture.png', type: 'picture.png',
label: '照片', label: '照片',
value: 'chooseImage', value: 'chooseImage',
@ -43,202 +46,184 @@ const plusList = computed(() => {
type: 'pages/news/group/create.png', type: 'pages/news/group/create.png',
label: '红包', label: '红包',
value: 'redEnvelope', value: 'redEnvelope',
} }]
]
const isCustomer = props.msg.isCustomer; const isCustomer = props.msg.isCustomer;
// //
if (props.msg.type == 'C2C' && !isCustomer) result.push({ if (props.msg.type == 'C2C' && !isCustomer) result.push({
type: 'news-voice.png', type: 'news-voice.png',
label: '音视频', label: '音视频',
value: 'voice' value: 'voice'
})
//
if (isCustomer) result.unshift({
type: 'order.png',
label: '订单',
value: 'chooseOrder',
}, {
type: 'shop.png',
label: '商品',
value: 'chooseShop',
})
return result
}) })
//
if (isCustomer) result.unshift({ const popupRef = ref(null)
type: 'order.png', const popupRE = ref(null)
label: '订单', const formData = reactive({
value: 'chooseOrder', name: ''
}, {
type: 'shop.png',
label: '商品',
value: 'chooseShop',
}) })
return result const popupData = reactive({
}) show: false,
title: '选择订单'
const popupRef = ref(null)
const popupRE = ref(null)
const formData = reactive({
name: ''
})
const popupData = reactive({
show: false,
title: '选择订单'
})
//
const list = reactive([])
//
const plusClickObj = {
voice: () => {
//
const menu = [{
name: '语音通话',
type: 1,
},
{
nanme: '视频通话',
type: 2,
}
]
uni.showActionSheet({
itemList: ['语音通话', '视频通话'],
success: rs => {
uni.$TUICallKit.call({
userID: props.msg.id,
callMediaType: menu[rs.tapIndex].type,
// callParams: {
// roomID: 234,
// strRoomID: '2323423',
// timeout: 30
// },
}, res => {
console.log('[TUICallKit] call params: ', JSON.stringify(res));
});
}
})
},
//
chooseOrder: () => {
let param = {
pageSize: 10,
pageNum: 1,
merId: props.msg.id,
}
api.shop.getShopOrderList(param).then(rs => {
if (rs.code == 200) {
list.length = 0
list.push(...rs.rows.map(item => {
//
item.status = Number(item.status)
//
item.status_text = {
'0': '待支付',
'1': '待发货',
'4': '待收货',
'5': '已收货',
'6': '已完成',
'9': '已取消',
}[item.status]
return item
}))
nextTick().then(() => {
popupRef.value.open()
});
return
}
util.alert({
content: rs.msg,
showCancel: false,
})
})
},
//
chooseShop: () => {
uni.navigateTo({
url: `/pages/news/goodsList/index?merId=${props.msg.id}`
});
},
//
redEnvelope() {
uni.navigateTo({
url: util.setUrl('/pages/news/redPacket', {
//
msgId: props.msg.id,
//
sendType: {
'C2C': 1,
'GROUP': 2,
}[props.msg.type],
num: props.msg.num,
})
})
// popupRE.value.open()
},
//
takePhoto: () => {
console.log('takePhoto')
sendMsgImg({
sourceType: ['album'],
})
},
//
chooseImage: () => {
console.log('chooseImage')
sendMsgImg({
sourceType: ['album'],
})
}
}
//
function sendMsgImg(option) {
util.upload_image({
count: 1,
type: 1,
success: rs => {
emit('send', {
query: {
toUserId: props.msg.id,
msgType: TencentCloudChat.TYPES.MSG_IMAGE,
},
data: {
imgUrl: rs.value
},
})
}
}) })
return
// //
uni.chooseImage({ const list = reactive([])
count: 1,
sourceType: option.sourceType, // //
success: (res) => { const plusClickObj = {
let message = uni.$chat.createImageMessage({ voice: () => {
to: props.msg.id, //
conversationType: props.msg.type, const menu = [{
payload: { name: '语音通话',
file: res type: 1,
}, },
onProgress: function (event) { {
console.log('file uploading:', event) nanme: '视频通话',
type: 2,
}
]
uni.showActionSheet({
itemList: ['语音通话', '视频通话'],
success: rs => {
uni.$TUICallKit.call({
userID: props.msg.id,
callMediaType: menu[rs.tapIndex].type,
// callParams: {
// roomID: 234,
// strRoomID: '2323423',
// timeout: 30
// },
}, res => {
console.log('[TUICallKit] call params: ', JSON.stringify(res));
});
} }
}) })
return },
}
});
}
// //
const consult = (content) => { chooseOrder: () => {
let obj = { let param = {
content, pageSize: 10,
type: 'order' pageNum: 1,
merId: props.msg.id,
}
api.shop.getShopOrderList(param).then(rs => {
if (rs.code == 200) {
list.length = 0
list.push(...rs.rows.map(item => {
//
item.status = Number(item.status)
//
item.status_text = {
'0': '待支付',
'1': '待发货',
'4': '待收货',
'5': '已收货',
'6': '已完成',
'9': '已取消',
} [item.status]
return item
}))
nextTick().then(() => {
popupRef.value.open()
});
return
}
util.alert({
content: rs.msg,
showCancel: false,
})
})
},
//
chooseShop: () => {
uni.navigateTo({
url: `/pages/news/goodsList/index?merId=${props.msg.id}`
});
},
//
redEnvelope() {
uni.navigateTo({
url: util.setUrl('/pages/news/redPacket', {
//
msgId: props.msg.id,
//
sendType: {
'C2C': 1,
'GROUP': 2,
} [props.msg.type],
num: props.msg.num,
})
})
// popupRE.value.open()
},
//
takePhoto: () => {
console.log('takePhoto')
sendMsgImg({
sourceType: ['camera'],
})
},
//
chooseImage: () => {
console.log('chooseImage')
sendMsgImg({
sourceType: ['album'],
})
}
}
//
function sendMsgImg(option) {
uni.chooseImage({
count: 8,
sourceType: option.sourceType,
success: res => {
console.log('res', res)
//
let message = uni.$chat.createImageMessage({
to: props.msg.id,
conversationType: props.msg.type,
payload: {
file: res,
},
})
emit('send', message)
return
}
})
}
//
const consult = (content) => {
let obj = {
content,
type: 'order'
}
popupRef.value.close()
} }
popupRef.value.close()
}
</script> </script>
<template> <template>
@ -280,65 +265,65 @@ const consult = (content) => {
</template> </template>
<style scoped lang="scss"> <style scoped lang="scss">
.NewsPlus { .NewsPlus {
// //
display: grid; display: grid;
grid-template-columns: repeat(4, 1fr); grid-template-columns: repeat(4, 1fr);
grid-gap: 20rpx; grid-gap: 20rpx;
.imageBox { .imageBox {
background-color: #fff; background-color: #fff;
border-radius: 20rpx; border-radius: 20rpx;
}
} }
}
.jy-popup { .jy-popup {
width: 100%;
border-radius: 20px 20px 0px 0px;
.title {
width: 100%; width: 100%;
display: flex; border-radius: 20px 20px 0px 0px;
justify-content: center;
align-items: center;
padding: 20rpx 0;
//
color: #3D3D3D;
font-size: 32rpx;
}
.close-btn { .title {
position: absolute; width: 100%;
top: 40rpx; display: flex;
right: 40rpx; justify-content: center;
height: 52rpx; align-items: center;
line-height: 52rpx; padding: 20rpx 0;
width: 52rpx; //
background: #D8D8D8; color: #3D3D3D;
color: #999999; font-size: 32rpx;
font-size: 30rpx; }
border-radius: 50%;
display: flex;
justify-content: center;
align-items: center;
transform: translate(50%, -50%);
}
.input-view { .close-btn {
// position: absolute;
border-top: 1px solid #E5E5E5; top: 40rpx;
border-bottom: 1px solid #E5E5E5; right: 40rpx;
padding: 20rpx; height: 52rpx;
} line-height: 52rpx;
width: 52rpx;
background: #D8D8D8;
color: #999999;
font-size: 30rpx;
border-radius: 50%;
display: flex;
justify-content: center;
align-items: center;
transform: translate(50%, -50%);
}
.easyinput { .input-view {
flex: 1; //
} border-top: 1px solid #E5E5E5;
border-bottom: 1px solid #E5E5E5;
padding: 20rpx;
}
.time { .easyinput {
padding: 24rpx 20rpx 0 20rpx; flex: 1;
font-size: 22rpx; }
color: #3D3D3D;
.time {
padding: 24rpx 20rpx 0 20rpx;
font-size: 22rpx;
color: #3D3D3D;
}
} }
}
</style> </style>

View File

@ -16,274 +16,274 @@
</template> </template>
<script setup> <script setup>
import { import {
ref, ref,
defineEmits defineEmits
} from 'vue' } from 'vue'
// //
import TencentCloudChat from '@tencentcloud/chat'; import TencentCloudChat from '@tencentcloud/chat';
const props = defineProps({ const props = defineProps({
msg: { msg: {
type: Object type: Object
}, },
}) })
const emit = defineEmits(['send']) const emit = defineEmits(['send'])
// //
// #ifdef APP-PLUS // #ifdef APP-PLUS
const recorderManager = uni.getRecorderManager(); const recorderManager = uni.getRecorderManager();
// #endif // #endif
// //
const voiceLength = ref(0); const voiceLength = ref(0);
// //
const voiceTimer = ref(null); const voiceTimer = ref(null);
// //
const voiceText = ref('按住 说话'); const voiceText = ref('按住 说话');
// //
const voiceTis = ref('手指上滑 取消发送'); const voiceTis = ref('手指上滑 取消发送');
// //
const voiceFlg = ref(false); const voiceFlg = ref(false);
// Y // Y
const voicePageY = ref(0); const voicePageY = ref(0);
// //
const voiceStop = ref(false); const voiceStop = ref(false);
const str = ''; const str = '';
// //
const sv = { const sv = {
// //
touchstartVoice: (e) => { touchstartVoice: (e) => {
voicePageY.value = (e.changedTouches[0].pageY).toFixed(2); voicePageY.value = (e.changedTouches[0].pageY).toFixed(2);
recorderManager.start({ recorderManager.start({
duration: 60000, // ms 60000010 duration: 60000, // ms 60000010
sampleRate: 44100, // sampleRate: 44100, //
numberOfChannels: 1, // numberOfChannels: 1, //
encodeBitRate: 192000, // encodeBitRate: 192000, //
format: "mp3" format: "mp3"
}); });
voiceLength.value = 0; voiceLength.value = 0;
voiceFlg.value = true voiceFlg.value = true
console.log('recorder start success'); console.log('recorder start success');
//, //,
voiceTimer.value = setInterval(() => { voiceTimer.value = setInterval(() => {
voiceLength.value += 0.1; voiceLength.value += 0.1;
}, 100); }, 100);
console.log('touchstartVoice', voicePageY.value); console.log('touchstartVoice', voicePageY.value);
}, },
// //
touchmoveVoice: (e) => { touchmoveVoice: (e) => {
// UI // UI
if (!voiceFlg.value) { if (!voiceFlg.value) {
return; return;
}
let numTemp = voicePageY.value - ((e.changedTouches[0].pageY).toFixed(2));
if (numTemp >= 60) {
console.log('取消发送');
voiceStop.value = true
voiceTis.value = '松开手指 取消发送'
} else {
console.log('继续发送');
voiceStop.value = false
voiceTis.value = '手指上滑 取消发送'
}
},
//
touchendVoice: () => {
// UI
if (!voiceFlg.value) {
return;
}
clearInterval(voiceTimer.value);
voiceText.value = '按住 说话'
voiceTis.value = "手指上滑 取消发送"
console.log('touchendVoice');
sv.stop();
},
//
touchcancelVoice: () => {
clearInterval(voiceTimer.value);
// UI
voiceText.value = '按住 说话'
voiceTis.value = "手指上滑 取消发送"
//
voiceStop.value = true
console.log('touchcancelVoice');
sv.stop();
},
stop: () => {
voiceTimer.value = null;
voiceFlg.value = false
recorderManager.stop(); //
console.log('录音结束');
}
};
// #ifdef APP-PLUS
//
recorderManager.onStop((res) => {
//
if (voiceStop.value) {
return
}
//
if (voiceStop.value) {
uni.showToast({
icon: "none",
title: "取消发送",
duration: 2000
})
return
}
if (voiceLength.value < 1) {
uni.showToast({
icon: "none",
title: "语音时长过短",
duration: 2000
})
return
}
if (voiceLength.value > 60) {
uni.showToast({
icon: "none",
title: "语音时长过长",
duration: 2000
})
return
}
console.log('file', res)
try {
let message = uni.$chat.createAudioMessage({
to: props.msg.id,
conversationType: props.msg.type,
payload: {
file: res
},
//
onProgress: function (event) {
console.log('file uploading:', event)
} }
}) let numTemp = voicePageY.value - ((e.changedTouches[0].pageY).toFixed(2));
if (numTemp >= 60) {
let obj = { console.log('取消发送');
query: { voiceStop.value = true
toUserId: message.to, voiceTis.value = '松开手指 取消发送'
formId: message.from, } else {
msgType: message.type, console.log('继续发送');
}, voiceStop.value = false
data: message voiceTis.value = '手指上滑 取消发送'
}
},
//
touchendVoice: () => {
// UI
if (!voiceFlg.value) {
return;
}
clearInterval(voiceTimer.value);
voiceText.value = '按住 说话'
voiceTis.value = "手指上滑 取消发送"
console.log('touchendVoice');
sv.stop();
},
//
touchcancelVoice: () => {
clearInterval(voiceTimer.value);
// UI
voiceText.value = '按住 说话'
voiceTis.value = "手指上滑 取消发送"
//
voiceStop.value = true
console.log('touchcancelVoice');
sv.stop();
},
stop: () => {
voiceTimer.value = null;
voiceFlg.value = false
recorderManager.stop(); //
console.log('录音结束');
} }
emit('send', obj) };
} catch (e) { // #ifdef APP-PLUS
console.log('message catch', e) //
} recorderManager.onStop((res) => {
// //
if (voiceStop.value) {
return
}
//
if (voiceStop.value) {
uni.showToast({
icon: "none",
title: "取消发送",
duration: 2000
})
return
}
if (voiceLength.value < 1) {
uni.showToast({
icon: "none",
title: "语音时长过短",
duration: 2000
})
return
}
if (voiceLength.value > 60) {
uni.showToast({
icon: "none",
title: "语音时长过长",
duration: 2000
})
return
}
console.log('file', res)
}) try {
// #endif let message = uni.$chat.createAudioMessage({
to: props.msg.id,
conversationType: props.msg.type,
payload: {
file: res
},
//
onProgress: function(event) {
console.log('file uploading:', event)
}
})
let obj = {
query: {
toUserId: message.to,
formId: message.from,
msgType: message.type,
},
data: message
}
emit('send', obj)
} catch (e) {
console.log('message catch', e)
}
//
})
// #endif
</script> </script>
<style scoped lang="scss"> <style scoped lang="scss">
.voice_box { .voice_box {
padding: 20rpx 0; padding: 20rpx 0;
margin: 0 20rpx; margin: 0 20rpx;
border-radius: 50rpx; border-radius: 50rpx;
background: #fff; background: #fff;
flex: 1; flex: 1;
display: flex;
align-items: center;
justify-content: center;
}
.hidden {
display: none !important;
}
.record {
width: 40vw;
height: 40vw;
position: fixed;
top: 55%;
left: 30%;
background-color: rgba(0, 0, 0, .6);
border-radius: 20rpx;
.ing {
width: 100%;
height: 30vw;
display: flex; display: flex;
justify-content: center;
align-items: center; align-items: center;
justify-content: center;
//
@keyframes volatility {
0% {
background-position: 0% 130%;
}
20% {
background-position: 0% 150%;
}
30% {
background-position: 0% 155%;
}
40% {
background-position: 0% 150%;
}
50% {
background-position: 0% 145%;
}
70% {
background-position: 0% 150%;
}
80% {
background-position: 0% 155%;
}
90% {
background-position: 0% 140%;
}
100% {
background-position: 0% 135%;
}
}
background-image: linear-gradient(to bottom, #f09b37, #fff 50%);
background-size: 100% 200%;
animation: volatility 1.5s ease-in-out -1.5s infinite alternate;
-webkit-background-clip: text;
-webkit-text-fill-color: transparent;
font-size: 150rpx;
color: #f09b37;
} }
.cancel { .hidden {
width: 100%; display: none !important;
height: 30vw;
display: flex;
justify-content: center;
align-items: center;
color: #fff;
font-size: 150rpx;
} }
.tis { .record {
width: 100%; width: 40vw;
height: 10vw; height: 40vw;
display: flex; position: fixed;
justify-content: center; top: 55%;
font-size: 28rpx; left: 30%;
color: #fff; background-color: rgba(0, 0, 0, .6);
border-radius: 20rpx;
&.change { .ing {
width: 100%;
height: 30vw;
display: flex;
justify-content: center;
align-items: center;
//
@keyframes volatility {
0% {
background-position: 0% 130%;
}
20% {
background-position: 0% 150%;
}
30% {
background-position: 0% 155%;
}
40% {
background-position: 0% 150%;
}
50% {
background-position: 0% 145%;
}
70% {
background-position: 0% 150%;
}
80% {
background-position: 0% 155%;
}
90% {
background-position: 0% 140%;
}
100% {
background-position: 0% 135%;
}
}
background-image: linear-gradient(to bottom, #f09b37, #fff 50%);
background-size: 100% 200%;
animation: volatility 1.5s ease-in-out -1.5s infinite alternate;
-webkit-background-clip: text;
-webkit-text-fill-color: transparent;
font-size: 150rpx;
color: #f09b37; color: #f09b37;
}
.cancel {
width: 100%;
height: 30vw;
display: flex;
justify-content: center;
align-items: center;
color: #fff;
font-size: 150rpx;
}
.tis {
width: 100%;
height: 10vw;
display: flex;
justify-content: center;
font-size: 28rpx;
color: #fff;
&.change {
color: #f09b37;
}
} }
} }
}
</style> </style>

View File

@ -4,7 +4,6 @@ import {
import uni from '@dcloudio/vite-plugin-uni'; import uni from '@dcloudio/vite-plugin-uni';
let target = 'http://91f.xyz:8080' let target = 'http://91f.xyz:8080'
// let target = 'http://762c9b48.r24.cpolar.top'
export default defineConfig({ export default defineConfig({
plugins: [uni()], plugins: [uni()],