修复已知问题

This commit is contained in:
bobobobo
2026-02-06 01:12:04 +08:00
parent 2d503bab83
commit 3389a8eaa9
15 changed files with 2516 additions and 1824 deletions

View File

@@ -33,6 +33,13 @@
},
fail: (code, msg) => {
console.error(`sendTextMessage failed, code: ${code}, msg: ${msg}`);
if (code == 10017) {
uni.showModal({
title: '提示',
content: '你被禁止发言',
showCancel: false
})
}
},
})
inputValue.value = ""

View File

@@ -1,313 +1,396 @@
<template>
<view class="bottom-drawer-container" v-if="modelValue">
<view class="drawer-overlay" @tap="close"></view>
<view class="bottom-drawer" :class="{ 'drawer-open': modelValue }">
<view class="drawer-header">
<view class="user-info">
<image class="user-avatar" :src="userInfo?.avatarURL || defaultAvatarURL" mode="aspectFill" />
<view class="user-details">
<view class="name-badge-row">
<text class="user-name">{{ userInfo?.userName || userInfo?.userID || '' }}</text>
<!-- <view class="badge">
<view class="bottom-drawer-container" v-if="modelValue">
<view class="drawer-overlay" @tap="close"></view>
<view class="bottom-drawer" :class="{ 'drawer-open': modelValue }">
<view class="drawer-header">
<view class="user-info">
<image
class="user-avatar"
:src="userInfo?.avatarURL || defaultAvatarURL"
mode="aspectFill"
/>
<view class="user-details">
<view class="name-badge-row">
<text class="user-name">
{{ userInfo?.userName || userInfo?.userID || '' }}
</text>
<!-- <view class="badge">
<image class="badge-icon" src="/static/images/heart.png" mode="aspectFit" />
<text class="badge-text">65</text>
</view> -->
</view>
<text class="user-id">ID: {{ userInfo?.userID || '' }}</text>
</view>
</view>
<!-- <view class="follow-button" @tap="followUser">
</view>
<text class="user-id">ID: {{ userInfo?.userID || '' }}</text>
</view>
</view>
<!-- <view class="follow-button" @tap="followUser">
<text class="follow-text">Follow</text>
</view> -->
</view>
</view>
<view class="drawer-content">
<view class="drawer-actions">
<!-- <view class="action-btn" @tap="muteSpeak">
<view class="action-btn-image-container">
<image class="action-btn-image" v-if="userInfo?.isMessageDisabled" src="/static/images/unmute-speak.png"
mode="aspectFit" />
<image class="action-btn-image" v-else src="/static/images/mute-speak.png" mode="aspectFit" />
</view>
<text class="action-btn-content" v-if="userInfo?.isMessageDisabled">解除禁言</text>
<text class="action-btn-content" v-else>禁言</text>
</view> -->
<view class="action-btn" @tap="kickOut">
<view class="action-btn-image-container">
<image class="action-btn-image" src="/static/images/kick-out-room.png" mode="aspectFit" />
</view>
<text class="action-btn-content">踢出房间</text>
</view>
</view>
<!-- <view class="divider-line-container">
<view class="drawer-content">
<view class="drawer-actions">
<view class="action-btn" @tap="muteSpeak">
<view class="action-btn-image-container">
<image
class="action-btn-image"
v-if="userInfo?.isMessageDisabled"
src="/static/images/unmute-speak.png"
mode="aspectFit"
/>
<image
class="action-btn-image"
v-else
src="/static/images/mute-speak.png"
mode="aspectFit"
/>
</view>
<text
class="action-btn-content"
v-if="userInfo?.isMessageDisabled"
>
解除禁言
</text>
<text class="action-btn-content" v-else>禁言</text>
</view>
<view class="action-btn" @tap="kickOut">
<view class="action-btn-image-container">
<image
class="action-btn-image"
src="/static/images/kick-out-room.png"
mode="aspectFit"
/>
</view>
<text class="action-btn-content">踢出房间</text>
</view>
<view class="action-btn" @tap="onDdmini">
<view class="action-btn-image-container">
<image
class="action-btn-image"
src="/static/images/administrator.png"
mode="aspectFit"
/>
</view>
<text class="action-btn-content">设置管理员</text>
</view>
</view>
<!-- <view class="divider-line-container">
<view class="divider-line"></view>
</view> -->
</view>
</view>
</view>
</view>
</view>
</view>
</template>
<script setup>
import {
ref
} from 'vue';
import {
useLiveListState
} from "@/uni_modules/tuikit-atomic-x/state/LiveListState";
import {
useLiveAudienceState
} from "@/uni_modules/tuikit-atomic-x/state/LiveAudienceState";
const {
currentLive
} = useLiveListState();
const {
setAdministrator,
revokeAdministrator,
kickUserOutOfRoom,
disableSendMessage
} = useLiveAudienceState(uni?.$liveID);
import { ref, computed } from 'vue'
import { useLiveListState } from '@/uni_modules/tuikit-atomic-x/state/LiveListState'
import { useLiveAudienceState } from '@/uni_modules/tuikit-atomic-x/state/LiveAudienceState'
const { currentLive } = useLiveListState()
const {
setAdministrator,
revokeAdministrator,
kickUserOutOfRoom,
disableSendMessage
} = useLiveAudienceState(uni?.$liveID)
const defaultAvatarURL = 'https://web.sdk.qcloud.com/component/TUIKit/assets/avatar_01.png';
const props = defineProps({
modelValue: {
type: Boolean,
default: false
},
userInfo: {
type: Object,
},
liveID: {
type: String,
}
});
const defaultAvatarURL =
'https://web.sdk.qcloud.com/component/TUIKit/assets/avatar_01.png'
const props = defineProps({
modelValue: {
type: Boolean,
default: false
},
userInfo: {
type: Object
},
liveID: {
type: String
}
})
const emit = defineEmits(['update:modelValue']);
const close = () => {
emit('update:modelValue', false);
};
const emit = defineEmits(['update:modelValue', 'update:userInfo'])
const muteSpeak = () => {
console.log(
`mute or unMute speak, liveID: ${props.liveID}, isMessageDisabled: ${props?.userInfo?.isMessageDisabled}`);
const params = {
liveID: uni?.$liveID,
userID: props?.userInfo?.userID,
isDisable: !props?.userInfo?.isMessageDisabled,
};
const userData = computed({
get() {
return props.userInfo
},
set(value) {
emit('update:userInfo', value)
}
})
if (props?.userInfo?.isMessageDisabled) {
disableSendMessage(params);
} else {
disableSendMessage(params);
}
const close = () => {
emit('update:modelValue', false)
}
close();
};
/** 设置为管理员 */
const onDdmini = () => {
console.log('====', userData.value)
uni.showModal({
title: `提示`,
content: `确认设置该用户为管理员?`,
success: c => {
if (c.confirm) {
uni.showLoading({
title: '加载中...',
mask: true // 防止穿透点击
})
setAdministrator({
liveID: uni?.$liveID,
userID: props?.userInfo?.userID,
success: () => {
uni.hideLoading()
uni.showToast({
title: '设置成功',
icon: 'success',
mask: true
})
close()
},
fail: () => {
uni.hideLoading()
}
})
}
}
})
}
const kickOut = () => {
console.log('kick out from room', props?.userInfo?.userID);
const muteSpeak = () => {
console.log(
`mute or unMute speak, liveID: ${props.liveID}, isMessageDisabled: ${props?.userInfo?.isMessageDisabled}`
)
const isShow = props?.userInfo?.isMessageDisabled
uni.showModal({
title: `提示`,
content: isShow ? `确认禁止用户发言?` : `确认恢复用户发言?`,
success: c => {
if (c.confirm) {
const params = {
liveID: uni?.$liveID,
userID: props?.userInfo?.userID,
isDisable: !props?.userInfo?.isMessageDisabled
}
if (isShow) {
disableSendMessage(params)
} else {
disableSendMessage(params)
}
uni.showModal({
content: `确认踢出${props?.userInfo?.userName || props?.userInfo?.userID}吗?`,
success: (res) => {
if (res.confirm) {
kickUserOutOfRoom({
liveID: uni?.$liveID,
userID: props?.userInfo?.userID,
success: () => {
close()
console.log(`kickUserOutOfRoom success`);
},
fail: (errCode, errMsg) => {
console.log(`kickUserOutOfRoom fail errCode: ${errCode}, errMsg: ${errMsg}`);
},
});
}
}
});
};
close()
}
}
})
}
const followUser = () => {
console.warn('== 关注用户 ', userInfo?.userName);
// 这里可以添加关注用户的逻辑
uni.showToast({
title: '关注成功',
icon: 'success'
});
}
const kickOut = () => {
console.log('kick out from room', props?.userInfo?.userID)
uni.showModal({
content: `确认踢出${
props?.userInfo?.userName || props?.userInfo?.userID
}吗?`,
success: res => {
if (res.confirm) {
kickUserOutOfRoom({
liveID: uni?.$liveID,
userID: props?.userInfo?.userID,
success: () => {
close()
console.log(`kickUserOutOfRoom success`)
},
fail: (errCode, errMsg) => {
console.log(
`kickUserOutOfRoom fail errCode: ${errCode}, errMsg: ${errMsg}`
)
}
})
}
}
})
}
const followUser = () => {
console.warn('== 关注用户 ', userInfo?.userName)
// 这里可以添加关注用户的逻辑
uni.showToast({
title: '关注成功',
icon: 'success'
})
}
</script>
<style>
.bottom-drawer-container {
position: fixed;
bottom: 0;
left: 0;
right: 0;
top: 0;
z-index: 1000;
}
.bottom-drawer-container {
position: fixed;
bottom: 0;
left: 0;
right: 0;
top: 0;
z-index: 1000;
}
.drawer-overlay {
position: absolute;
top: 0;
left: 0;
right: 0;
bottom: 0;
background-color: rgba(0, 0, 0, 0.4);
}
.drawer-overlay {
position: absolute;
top: 0;
left: 0;
right: 0;
bottom: 0;
background-color: rgba(0, 0, 0, 0.4);
}
.bottom-drawer {
position: absolute;
bottom: 0;
left: 0;
right: 0;
background: rgba(34, 38, 46, 1);
border-top-left-radius: 32rpx;
border-top-right-radius: 32rpx;
transform: translateY(100%);
transition-property: transform;
transition-duration: 0.3s;
transition-timing-function: ease;
height: 400rpx;
flex-direction: column;
}
.bottom-drawer {
position: absolute;
bottom: 0;
left: 0;
right: 0;
background: rgba(34, 38, 46, 1);
border-top-left-radius: 32rpx;
border-top-right-radius: 32rpx;
transform: translateY(100%);
transition-property: transform;
transition-duration: 0.3s;
transition-timing-function: ease;
height: 400rpx;
flex-direction: column;
}
.drawer-open {
transform: translateY(0);
}
.drawer-open {
transform: translateY(0);
}
.drawer-header {
padding: 40rpx 48rpx;
flex-direction: row;
justify-content: space-between;
align-items: center;
}
.drawer-header {
padding: 40rpx 48rpx;
flex-direction: row;
justify-content: space-between;
align-items: center;
}
.user-info {
display: flex;
flex-direction: row;
align-items: center;
}
.user-info {
display: flex;
flex-direction: row;
align-items: center;
}
.user-avatar {
width: 80rpx;
height: 80rpx;
border-radius: 40rpx;
border-width: 2rpx;
border-color: #ffffff;
margin-right: 20rpx;
}
.user-avatar {
width: 80rpx;
height: 80rpx;
border-radius: 40rpx;
border-width: 2rpx;
border-color: #ffffff;
margin-right: 20rpx;
}
.user-details {
display: flex;
flex-direction: column;
}
.user-details {
display: flex;
flex-direction: column;
}
.name-badge-row {
display: flex;
flex-direction: row;
align-items: center;
margin-bottom: 8rpx;
}
.name-badge-row {
display: flex;
flex-direction: row;
align-items: center;
margin-bottom: 8rpx;
}
.user-name {
color: #ffffff;
font-size: 32rpx;
font-weight: 500;
margin-right: 16rpx;
}
.user-name {
color: #ffffff;
font-size: 32rpx;
font-weight: 500;
margin-right: 16rpx;
}
.badge {
display: flex;
flex-direction: row;
align-items: center;
background-color: #8B5CF6;
padding: 4rpx 12rpx;
border-radius: 16rpx;
}
.badge {
display: flex;
flex-direction: row;
align-items: center;
background-color: #8b5cf6;
padding: 4rpx 12rpx;
border-radius: 16rpx;
}
.badge-icon {
width: 24rpx;
height: 24rpx;
margin-right: 8rpx;
}
.badge-icon {
width: 24rpx;
height: 24rpx;
margin-right: 8rpx;
}
.badge-text {
color: #ffffff;
font-size: 24rpx;
font-weight: 500;
}
.badge-text {
color: #ffffff;
font-size: 24rpx;
font-weight: 500;
}
.user-id {
color: rgba(255, 255, 255, 0.7);
font-size: 24rpx;
}
.user-id {
color: rgba(255, 255, 255, 0.7);
font-size: 24rpx;
}
.follow-button {
background-color: #007AFF;
padding: 12rpx 32rpx;
border-radius: 32rpx;
/* height: 64rpx; */
}
.follow-button {
background-color: #007aff;
padding: 12rpx 32rpx;
border-radius: 32rpx;
/* height: 64rpx; */
}
.follow-text {
color: #ffffff;
font-size: 28rpx;
font-weight: 500;
}
.follow-text {
color: #ffffff;
font-size: 28rpx;
font-weight: 500;
}
.drawer-content {
height: 400rpx;
justify-content: flex-start;
padding: 0 48rpx;
}
.drawer-content {
height: 400rpx;
justify-content: flex-start;
padding: 0 48rpx;
}
.drawer-actions {
display: flex;
flex-direction: row;
}
.drawer-actions {
display: flex;
flex-direction: row;
}
.action-btn {
flex-direction: column;
align-items: center;
margin-left: 10rpx;
height: 160rpx;
width: 120rpx
}
.action-btn {
flex-direction: column;
align-items: center;
margin-left: 10rpx;
height: 160rpx;
width: 120rpx;
}
.action-btn-image-container {
width: 100rpx;
height: 100rpx;
background-color: rgba(43, 44, 48, 1);
margin-bottom: 16rpx;
border-radius: 20rpx;
justify-content: center;
align-items: center;
}
.action-btn-image-container {
width: 100rpx;
height: 100rpx;
background-color: rgba(43, 44, 48, 1);
margin-bottom: 16rpx;
border-radius: 20rpx;
justify-content: center;
align-items: center;
}
.action-btn-image {
width: 50rpx;
height: 50rpx;
}
.action-btn-image {
width: 50rpx;
height: 50rpx;
}
.action-btn-content {
font-size: 24rpx;
color: rgba(255, 255, 255, 0.9);
}
.action-btn-content {
font-size: 24rpx;
color: rgba(255, 255, 255, 0.9);
}
.divider-line-container {
height: 68rpx;
justify-content: center;
position: relative;
}
.divider-line-container {
height: 68rpx;
justify-content: center;
position: relative;
}
.divider-line {
width: 268rpx;
height: 10rpx;
border-radius: 200rpx;
background-color: #ffffff;
position: absolute;
bottom: 16rpx;
}
</style>
.divider-line {
width: 268rpx;
height: 10rpx;
border-radius: 200rpx;
background-color: #ffffff;
position: absolute;
bottom: 16rpx;
}
</style>