Ai_GirlFriend/xuniYou/pages/friends/chat.vue

499 lines
9.3 KiB
Vue
Raw Normal View History

2026-01-31 19:15:41 +08:00
<template>
<view>
<view class="body">
<view class="body_content">
<view class="back"></view>
<uni-nav-bar fixed statusBar background-color="transparent" :border="false" color="#ffffff"
right-icon="trash" @clickRight="setUp" :showMenuButtonWidth="true">
<!-- 左侧插槽 -->
<template v-slot:left>
<view class="custom_left">
<view class="left_content">
<image class="left_return" @click="back" src="/static/images/chat_return.png"
mode="widthFix">
</image>
<view class="left_module">
<image class="left_avatar" :src="state.avatar" mode="widthFix"></image>
<view class="left_count" @click="tocohesion">
<view class="left_dight faj">
<image src="/static/images/intimacy_logo.png" mode="widthFix"></image>
<text class="faj">{{ state.intimacy_level }}</text>
</view>
</view>
</view>
<view class="left_title">{{ state.nickname }}</view>
</view>
</view>
</template>
</uni-nav-bar>
<MessageList @closeAllModal="closeAllModal" />
<input-bar ref="inputRef" />
</view>
<!-- <view class="btn">
<view class="textbox fa">
<image class="textbox_voice" src="/static/images/chat_voiceA.png" mode="widthFix"></image>
<view class="textbox_content fa f1">
<input class="f1" placeholder="发消息Ta 会给你回复" placeholder-class="textbox_input" />
<image @click="sendGift" class="textbox_add" src="/static/images/chat_gift.png" mode="widthFix">
</image>
</view>
<image class="textbox_keyboard" src="/static/images/chat_keyboard.png" mode="widthFix"></image>
</view>
<view class="btn_body fa sb">
<view class="btn_content">
<view class="btn_module">
<image class="btn_image" src="/static/images/chat_a1.png" mode="widthFix"></image>
<image class="btn_lock" src="/static/images/chat_lock.png" mode="widthFix"></image>
</view>
<view class="btn_title">照片</view>
</view>
<view class="btn_content">
<view class="btn_module">
<image class="btn_image" src="/static/images/chat_a5.png" mode="widthFix"></image>
<image class="btn_lock" src="/static/images/chat_lock.png" mode="widthFix"></image>
</view>
<view class="btn_title">视频</view>
</view>
<view class="btn_content">
<view class="btn_module">
<image class="btn_image" src="/static/images/chat_a3.png" mode="widthFix"></image>
<image class="btn_lock" src="/static/images/chat_lock.png" mode="widthFix"></image>
</view>
<view class="btn_title">语音</view>
</view>
<view class="btn_content">
<view class="btn_module">
<image class="btn_image" src="/static/images/chat_a4.png" mode="widthFix"></image>
<image class="btn_lock" src="/static/images/chat_lock.png" mode="widthFix"></image>
</view>
<view class="btn_title">文件</view>
</view>
</view>
</view> -->
</view>
</view>
</template>
<script setup>
import {
ref,
reactive,
onUnmounted
} from 'vue';
import {
onLoad
} from '@dcloudio/uni-app';
import {
FriendDelete
} from '@/utils/api.js';
// import notHave from '@/components/not-have.vue';
// import topSafety from '@/components/top-safety.vue';
import MessageList from '@/components/emChat/components/messageList';
import InputBar from '@/components/emChat/components/inputBar';
import { useConversationStore } from '@/stores/conversation';
const inputRef = ref(null);
const closeAllModal = () => inputRef.value?.closeAllModal();
const state = reactive({
form: {
friend_id: ''
},
intimacy_level: 0,
avatar: '',
nickname: '',
friendData: {}
});
onLoad((options) => {
state.friendData = JSON.parse(decodeURIComponent(options.item))
state.form.friend_id = state.friendData.id
state.intimacy_level = state.friendData.intimacy_level
state.avatar = state.friendData.avatar
state.nickname = state.friendData.nickname
})
const friendDelete = () => {
FriendDelete(state.form).then(res => {
if (res.code == 1) {
uni.showToast({
title: res.msg,
icon: 'none',
position: 'top'
})
setTimeout(() => {
uni.navigateBack({
delta: 1
});
}, 500);
} else {
uni.showToast({
title: res.msg,
icon: 'none',
position: 'top'
})
}
})
};
const back = () => {
uni.redirectTo({
url: '/pages/friends/index'
});
};
const tocohesion = () => {
uni.navigateTo({
url: '/pages/friends/cohesion?friendData=' + encodeURIComponent(JSON.stringify(state.friendData))
});
};
const setUp = () => {
uni.showModal({
title: '删除聊天',
content: '确定要删除该好友吗?此操作不可恢复。',
confirmText: '确定删除',
cancelText: '取消',
confirmColor: '#ff4444',
success: (res) => {
if (res.confirm) {
console.log('用户确认删除');
console.log(state.form.friend_id);
friendDelete()
} else if (res.cancel) {
console.log('用户取消删除');
}
}
});
};
const conversationStore = useConversationStore();
onUnmounted(() => {
conversationStore.setChattingUserId('');
});
</script>
<style>
page {
height: 100%;
background: #F6F8FA;
}
.uni-navbar__header-btns-left{
width: 100% !important;
}
/* .uni-navbar__header-btns-right.data-v-26544265 {
padding-right: 200rpx !important;
} */
</style>
<style scoped>
.body {
position: relative;
height: 100vh;
display: flex;
flex-direction: column;
}
.back {
position: absolute;
left: 0;
top: 0;
width: 100%;
height: 436rpx;
background: linear-gradient(180deg, #EAD6FF 0%, rgba(255, 255, 255, 0) 100%);
}
.custom_left {
position: relative;
display: flex;
align-items: center;
height: 100%;
z-index: 10;
}
.left_content {
position: relative;
display: flex;
align-items: center;
}
.left_return {
width: 48rpx;
height: 48rpx;
margin-right: 20rpx;
}
.left_module {
position: relative;
display: flex;
align-items: center;
}
.left_avatar {
width: 68rpx;
height: 68rpx;
display: block;
border-radius: 100rpx;
}
.left_count {
position: absolute;
right: -20rpx;
bottom: 0;
}
.left_count image {
position: relative;
}
.left_dight {
position: relative;
width: 30rpx;
height: 30rpx;
}
.left_dight image {
position: absolute;
left: 0;
bottom: 0;
width: 100%;
height: 100%;
}
.left_dight text {
position: relative;
font-weight: 400;
font-size: 20rpx;
color: #FFFFFF;
line-height: 50rpx;
}
.left_title {
margin: 0 0 0 26rpx;
font-weight: 500;
font-size: 32rpx;
color: #000000;
line-height: 50rpx;
}
.body_content {
position: relative;
flex: 1;
display: flex;
flex-direction: column;
min-height: 0;
}
.list {
flex: 1;
position: relative;
z-index: 2;
padding: 20rpx 0;
overflow-y: auto;
}
.message-list {
padding: 20rpx;
}
.message-item {
display: flex;
margin-bottom: 30rpx;
}
.message-item.left {
justify-content: flex-start;
}
.message-item.right {
justify-content: flex-end;
}
.message-item .avatar {
width: 80rpx;
height: 80rpx;
border-radius: 100rpx;
flex-shrink: 0;
}
.message-item.left .avatar {
margin-right: 20rpx;
}
.message-item.right .avatar {
margin-left: 20rpx;
}
.message-content {
max-width: 70%;
}
.message-bubble {
padding: 20rpx;
border-radius: 10rpx;
position: relative;
}
.message-item.left .message-bubble {
background: #FFFFFF;
color: #000000;
}
.message-item.right .message-bubble {
background: #FFFFFF;
color: #000000;
}
.message-text {
font-size: 28rpx;
line-height: 40rpx;
word-break: break-all;
}
.grade {
position: relative;
margin: 35rpx 0 0 0;
}
.grade_content {
position: relative;
padding: 12rpx 0;
width: 410rpx;
background: linear-gradient(135deg, #BB93EB 0%, #CEA5FF 100%);
border-radius: 16rpx;
}
.grade_name {
font-weight: 500;
font-size: 30rpx;
color: #FFFFFF;
line-height: 50rpx;
}
.grade_iamgea {
position: absolute;
right: -10rpx;
top: 10rpx;
width: 25rpx;
height: 25rpx;
}
.grade_iamgeb {
position: absolute;
left: 0;
top: -10rpx;
width: 25rpx;
height: 25rpx;
}
.grade_iamgec {
position: absolute;
right: 0;
top: -20rpx;
width: 33rpx;
height: 33rpx;
}
.clear {
position: relative;
margin: 35rpx 0 0 0;
}
.clear_title {
padding: 12rpx 0;
width: 410rpx;
background: #EBEBEB;
border-radius: 16rpx;
font-weight: 500;
font-size: 30rpx;
color: #9E9E9E;
line-height: 50rpx;
}
.btn {
position: relative;
background: #FFFFFF;
}
.textbox {
position: relative;
padding: 18rpx 30rpx 48rpx 30rpx;
z-index: 2;
}
.textbox_voice {
margin: 0 30rpx 0 0;
width: 60rpx;
height: 60rpx;
display: block;
}
.textbox_content {
position: relative;
padding: 5rpx 25rpx;
border-radius: 64rpx;
background: #F6F6F6;
}
.textbox_content input {
font-weight: 400;
font-size: 28rpx;
color: #000000;
line-height: 36rpx;
}
.textbox_input {
color: #C4C4C4;
}
.textbox_add {
width: 74rpx;
height: 74rpx;
display: block;
}
.textbox_keyboard {
margin: 0 0 0 30rpx;
width: 60rpx;
height: 60rpx;
display: block;
}
.btn_body {
position: relative;
padding: 48rpx 50rpx 56rpx 50rpx;
border-top: 1px solid #f0f0f0;
}
.btn_content {
position: relative;
}
.btn_module {
position: relative;
}
.btn_image {
width: 88rpx;
height: 88rpx;
display: block;
}
.btn_lock {
position: absolute;
right: 0;
top: 0;
width: 32rpx;
height: 24rpx;
}
.btn_title {
margin: 5rpx 0 0 0;
font-weight: 400;
font-size: 28rpx;
color: #222222;
line-height: 50rpx;
text-align: center;
}
/* .uni-navbar__header-btns-right {
padding-right: var(--right-padding, 0);
} */
</style>