YingXingAI/pages/message/dialogBox/dialogBox.vue

1352 lines
36 KiB
Vue
Raw Normal View History

2025-06-30 14:43:02 +08:00
<template>
<view>
<u-navbar :border-bottom="false" back-text="" title="">
<view slot="" class="navbar-center">
<view class="info">
<text class="name">{{ userInfo.name }}</text>
</view>
</view>
<!-- <view class="navbar-right" slot="right">
<u-button v-if='userInfo.carewState && userInfo.carewState != "admin"' @click='InsertOrDelFollow()'
size="mini" class='btn' :plain="userInfo.carewState.indexOf('未关注') < 0" type="primary">{{
userInfo.carewState }}</u-button>
</view> -->
</u-navbar>
<view v-if="userInfo.carewState.indexOf('未关注') && showAttention" style="width: 100%;background-color: #fff;">
<view class="attention-box">
<view>关注方便以后常联系</view>
<view class="attention-right">
<view class="attention-btn" @click='InsertOrDelFollow()'>关注</view>
<image src="/static/common/img/close.png" @click="() => showAttention = false"></image>
</view>
</view>
</view>
<!-- 认证用户 -->
<view id="messagesList"></view>
<view v-if="false" class="quick Tips">
<view class="justify-center section_2">
<text>关注他方便以后常聊</text>
<image class="image_2" src="/static/common/img/msgclose.png"/>
</view>
</view>
<!-- 未认证yonghu -->
<view :style="{ height: errShow ? '0.16rem' : '0' }" class="errTips">
<view class="flex-row group_3">
<image class="image_2" src="/static/common/img/16462770928974838161.png"/>
<text class="text_5">该用户尚未进行认证请注意信息的甄别保护个人信息</text>
</view>
</view>
<view :class="[{ emoji: emoji }, { msg: CommonWords }, { text: inputShow }]" class="msgList" @mousedown="close">
<scroll-view :scroll-top="scrollTop" :scroll-with-animation="true" class="scroll" scroll-y="true"
@refresherrefresh=''>
<!-- <scroll-view scroll-y="true" class="scroll" @refresherrefresh='' :scroll-top="scrollTop"
:scroll-with-animation="true" :refresher-enabled='true' refresher-background='#f6f7fa'
refresher-default-style="black"> -->
<template v-for="(v, i) in MsgList">
<view style='display:none'>{{ v.sendDate ? v.sendDate = v.sendDate.replace(/-/g, "/") : '' }}</view>
<!-- 提示消息时间 -->
<view v-if='new Date(v.sendDate) - new Date(MsgList[i > 1 ? i - 1 : 0].sendDate) > 30000'
class="tis">
<text
v-if='new Date(v.sendDate) - 0 + (3600000 * 24) > new Date() && new Date(v.sendDate).getDate() == new Date().getDate()'
class="text">{{ v.sendDate.slice(10, 16) }}
</text>
<text v-else class="text">{{ v.sendDate }}</text>
</view>
<!-- 系统提示对方基本信息 -->
<view v-if='v.istips && v.type == 0' class="systis">
<view>
<view class="flex-col section_2">
<view class="flex-row group_2">
<text>姓名{{ v.Name }}</text>
</view>
<view class="flex-row group_2">
<text>年龄{{ v.Age }}</text>
</view>
<view class="flex-row group_2">
<text>班级{{ v.School }}</text>
</view>
<view class="flex-row group_2">
<text>现居地{{ v.Address }}</text>
</view>
<view class="flex-row group_2">
<text>手机号码:{{ v.Phone }}</text>
</view>
</view>
</view>
</view>
<view v-if='v.istips && v.type == 1' class="tis">
<text class="text">{{ v.title }}</text>
</view>
<template v-if='!v.mymsg && !v.hemsg && !v.istips'>
<!-- 我方的消息 -->
<view v-if='v.fromUserId == vuex_user.id' class="mymsg">
<view class="justify-end group_5">
<view class="flex-col items-center text-wrapper">
<text>{{ v.message }}</text>
</view>
<!-- <image :src="$u.http.config.imgUrl+vuex_user.head" class="image_3" /> -->
<u-avatar :src="$u.http.config.imgUrl + vuex_user.head" class="image_1"></u-avatar>
</view>
</view>
<!-- 对方消息 -->
<view v-else class="hemsg">
<view class="flex-row group">
<u-avatar :src="$u.http.config.imgUrl + userInfo.head" class="image_3 image_11"
@click='toDeatil'></u-avatar>
<view class="right-text-wrapper_1 flex-col items-center">
<text>{{ v.message }}</text>
</view>
</view>
</view>
</template>
<!-- 我方交换信息 -->
<template v-else>
<view v-if='v.mymsg' class="mymsg">
<view class="justify-end group_5">
<view class="exchange">
<view class="top-group justify-center">
<view class="flex-col section_3">
<text class="text_11 text_12">请求交换信息</text>
<!-- <view class="bottom-group flex-row view_1">
<view @click='InfoExchange(v.type,false)' class="left-text-wrapper flex-col items-center">
<text>拒绝</text>
</view>
<view @click='InfoExchange(v.type,true)' class="right-text-wrapper flex-col items-center">
<text>同意</text>
</view>
</view> -->
</view>
</view>
</view>
<!-- <image :src="$u.http.config.imgUrl+vuex_user.head" class="image_3" /> -->
<u-avatar :src="$u.http.config.imgUrl + vuex_user.head" class="image_3"></u-avatar>
</view>
</view>
<!-- 对方交换信息 -->
<view v-if='v.hemsg' class="hemsg">
<view class="flex-row group">
<!-- <image @click='toDeatil' :src="$u.http.config.imgUrl+userInfo.head" class="image_3 image_11" /> -->
<u-avatar :src="$u.http.config.imgUrl + userInfo.head" class="image_1"
@click='toDeatil'></u-avatar>
<view class="exchange">
<view class="top-group justify-center">
<view class="flex-col section_3">
<text class="text_11 text_12">请求交换信息</text>
<view class="bottom-group flex-row view_1" style='justify-content: center;'>
<view v-if='v.type == 0' class="left-text-wrapper flex-col items-center"
@click='InfoExchange(false, i)'>
<text>拒绝</text>
</view>
<view v-if='v.type == 0' class="right-text-wrapper flex-col items-center"
@click='InfoExchange(true, i)'>
<text>同意</text>
</view>
<view v-if='v.type == 1'
class="left-text-wrapper flex-col items-center">
<text>已同意</text>
</view>
<view v-if='v.type == 2'
class="left-text-wrapper flex-col items-center">
<text>已拒绝</text>
</view>
</view>
</view>
</view>
</view>
</view>
</view>
</template>
</template>
</scroll-view>
</view>
<view class="msgbox">
<view v-if='chatType != 1' :style="[{ background: quick ? '#fff' : 'none' }]" class="quick">
<view v-if="quick" class="justify-between section_7">
<view class="flex-row" style='transform: translateX(-50%);'>
<view class="flex-col items-center text-wrapper_2" @click='exchangeInfo(1)'>
<text class="text">交换信息</text>
</view>
<!-- <view @click='exchangeInfo(0)' class="flex-col items-end text-wrapper_3">
<text class="text">交换联系方式</text>
</view> -->
</view>
<image class="image_13" src="/static/common/img/msgclose.png" @click="quick = false"/>
</view>
<!-- <view style="display: flex; justify-content: flex-end" v-else>
<image style="margin: 0.08rem; width: 0.2rem; height: 0.2rem" @click="quick = true"
src="/static/common/img/msgopen.png" class="image_13" />
</view> -->
</view>
<view class="flex-row section_1">
<view class="input-box">
<!-- <text class="text" @click="CommonWords = !CommonWords; emoji = false;">常用语</text> -->
<u-input v-model="message" :auto-height="true" :type="'textarea'" class="input" @blur="inputBlur"
@click="shuru" @focus="inputFocus"/>
<view class="icon" @click="emoji = !emoji; CommonWords = false; emojicurrent = 0;">
<image class="image" src="/static/common/img/icon-happy-face.png"/>
</view>
<view v-if="message != ''" class="btn">
<u-button class="sendOut" size="mini" @click="SendMessage">发送</u-button>
</view>
<view v-else class="icon" @click="expandBox = !expandBox">
<image class="image" src="/static/common/img/add-circle.png"/>
</view>
</view>
</view>
<!-- 常用语 -->
<view class="CommonWords">
<scroll-view :class="CommonWords ? 'open' : ''" scroll-y="true"
style="transition: all 0.3s; height: 0rem">
<text v-for="(v, i) in CommonlyMsg" :key="i" @click="choice(v)">{{ v }}</text>
</scroll-view>
</view>
<!-- emoji 表情 -->
<swiper :class="emoji ? 'emojishow' : ''" :current="emojicurrent" class="slider">
<swiper-item v-for="(item, key) in emojiData" :key="key" :class="[key == emojiData.length - 1 ? 'lastbox' : '']"
class="slider-emoji">
<text v-for="(emoji, index) in item" :key="index" class="slider-emoji-icon"
@click="selemoji(emoji)">{{
emoji
}}
</text>
</swiper-item>
</swiper>
<!-- 点击加号 -->
<view class="expandBox">
<view :class="expandBox ? 'open' : ''" style="transition: all 0.3s; height: 0rem">
<view class="expand-content">
<view v-for="i in expandList" class="expand-item" @click="expandFn(i.type)">
<image :src="i.img"></image>
<text class="expand-text">{{ i.text }}</text>
</view>
</view>
</view>
</view>
</view>
<u-toast ref="uToast"/>
<u-top-tips ref="uTips" :navbar-height="0"></u-top-tips>
</view>
</template>
<script>
import emoji from "../../../static/common/js/emoji";
export default {
data() {
return {
// 常用语
CommonlyMsg: ['您好,很高兴认识你!', '您好,有空聊一聊吗?', '嗨,你好呀!', '好的,我知道了。', '我们下次再聊,拜拜。'],
CommonWords: false, // 常用语 显示隐藏
quick: false, // 交换信息 显示隐藏
message: "", // 交换信息 显示隐藏
emojiData: [],
emoji: false,
inputShow: false,
scrollTop: 999999999999,
emojicurrent: 0,
userId: '',
userInfo: '',
MsgList: [],
errShow: false,
chatType: -1,
id: '',
type: 0,
connectionId: '',
state: false,
role: 0,
showAttention: true,
expandBox: false, // 点击加号展开
expandList: [
/* {
text: '拍照',
img: '/static/common/img/changeCard.png',
type:0
}, {
text: '相册',
img: '/static/common/img/changePhone.png',
type:1
}, {
text: '位置',
img: '/static/common/img/changeAddress.png',
type:2
}, */
{
text: '交换名片',
img: '/static/common/img/changeCard.png',
type: 3
}]
};
},
onLoad(e) {
// 管理员对用户
if (e.id == 'admin') {
this.type = 2;
this.chatType = 1;
this.userId = e.fromid;
this.role = 1,
this.getList()
this.emojiInit();
this.LinkChar();
this.goBottom()
this.toBind()
return
}
// 判断聊天类型
if (e.chatType == undefined) {
uni.switchTab({
url: "../../message/msgList/msgList",
});
return;
}
this.type = e.type
this.id = e.id
this.chatType = e.chatType
// 用户对管理员
if (e.chatType == 1) {
this.userInfo = {
name: '管理员',
head: e.head,
carewState: 'admin'
}
this.getList()
}
// 用户和用户
if (e.chatType == 0) {
if (!e.id) {
uni.switchTab({
url: "../../main/index/index",
});
return;
}
this.userId = e.id;
this.getList()
this.getDetail();
}
if (this.errShow) {
setTimeout(() => {
this.errShow = false
}, 3000)
}
this.goBottom()
this.emojiInit();
this.LinkChar();
},
onShow() {
if (this.vuex_msgList) {
var msgList = this.vuex_msgList;
if (this.chatType == 1) {
if (this.type = 2) {
msgList = msgList.replace((this.userId + 'user,'), '')
} else {
msgList = msgList.replace('admin,', '')
}
} else {
msgList = msgList.replace((this.userId + ','), '')
}
this.$u.vuex('vuex_msgList', msgList)
if (!msgList || msgList.indexOf(',') < 0) {
this.$u.vuex('vuex_msgList', '')
var tab = this.vuex_tabbar;
tab[1].isDot = false;
this.$u.vuex('vuex_tabbar', tab);
}
}
this.goBottom()
this.getDetail();
},
onHide() {
if (this.chatType == 1) {
this.colseBind()
}
},
onUnload() {
if (this.chatType == 1) {
this.colseBind()
}
},
methods: {
expandFn(type) {
switch (type) {
case 3:
this.exchangeInfo()
break;
}
},
//管理员聊天绑定
toBind() {
let data = {
manageUser: this.vuex_user.id,
lockUser: this.userId
}
this.$u.api.toBind(data).then(res => {
})
},
//管理员聊天取消绑定
colseBind() {
let data = {
lockUser: this.userId
}
this.$u.api.colseBind(data).then(res => {
})
},
// 回应交换信息
InfoExchange(bool, index) {
this.$connection
.invoke("whetherAgreeExchange", this.vuex_user.id, this.userId, bool)
.then((res) => {
this.MsgList[index].type = bool ? 1 : 2;
this.goBottom()
})
},
//请求交换信息
exchangeInfo() {
this.$connection
.invoke("exchangeInfo", this.vuex_user.id, this.userId)
.then((res) => {
this.MsgList.push({
fromUserId: this.vuex_user.id,
mymsg: true,
type: 0,
sendDate: this.getIsTime()
})
this.goBottom()
this.quick = false
})
},
// 获取当前时间
getIsTime() {
const year = new Date().getFullYear();
const Month = new Date().getMonth() + 1;
const day = new Date().getDate();
const Hours = new Date().getHours();
const Minut = new Date().getMinutes();
const second = new Date().getSeconds();
//小于10的拼接上0字符串
function addZero(s) {
return s < 10 ? ('0' + s) : s;
}
return year + '-' + addZero(Month) + '-' + addZero(day) + ' ' + addZero(Hours) + ':' + addZero(Minut) +
':' + addZero(second)
},
// 获取聊天记录
getList(id) {
const data = {
getUserId: this.vuex_user.id,
userId: this.userId,
chatType: this.chatType
}
if (id) {
data.getUserId = id;
}
this.$u.api.getChatRecord(data).then(res => {
this.MsgList = res
})
},
// 查看用户主页
toDeatil() {
if (this.chatType == 0) {
this.$u.route({
url: '/pages/AlumniCircle/userDetail/userDetail?id=' + this.userId + '&type=1'
})
}
},
// 关注
InsertOrDelFollow() {
const data = {
userId: this.vuex_user.id,
carewId: this.userId,
}
this.$u.apiList.InsertOrDelFollow(data).then(res => {
console.log(res, '关注成功');
if (res.succeed) {
// this.$tips('关注成功!', 'success')
this.$refs.uToast.show({
title: '关注成功',
type: 'success',
})
this.showAttention = false
}
// this.getDetail()
})
},
//获取用户信息
getDetail() {
this.$u.api.getUserInfo({
userId: this.userId
}).then((res) => {
this.userInfo = {
name: res.baseData.userName,
head: res.baseData.head,
carewState: res.carewState
}
if (res.carewState.includes('未关注')) {
this.showAttention = true
} else {
this.showAttention = false
}
});
},
//链接聊天
LinkChar() {
// 聊天限制提示3条后不能发送消息
this.$connection.on("FailInSend", (user, msg) => {
if (type == false) {
this.MsgList.push({
title: msg,
sendDate: this.getIsTime(),
istips: true,
type: 1,
})
this.goBottom()
}
})
//交换信息对方选择
this.$connection.on("whetherAgreeExchange", (user, type) => {
if (type == false) {
this.MsgList.push({
title: '对方已拒绝您的交换请求',
sendDate: this.getIsTime(),
istips: true,
type: 1,
})
this.goBottom()
}
})
//交换信息
this.$connection.on("ExchangeInfo", (user, type) => {
this.MsgList.push({
fromUserId: user,
hemsg: true,
type: 0,
sendDate: this.getIsTime()
})
this.goBottom()
})
// 显示
this.$connection.on("ShowUserInfo", (user, message) => {
// console.log(user, message);
const data = JSON.parse(message)
this.MsgList.push({
Name: data.Name,
sendDate: this.getIsTime(),
istips: true,
type: 0,
Phone: data.Phone,
Age: data.Age,
Address: data.Address,
School: data.School
})
this.goBottom()
});
//接收数据
this.$connection.on("ReceiveMessage", (user, message, type) => {
// console.log(user, message, type, this.chatType)
if (this.route.indexOf('dialogBox') >= 0) {
if (type <= 2 && this.chatType == 0 || type >= 3 && this.chatType == 1) {
if (user == this.userId || (this.userId == '' && type == 4)) {
this.MsgList.push({
fromUserId: user,
message: message,
sendDate: this.getIsTime(),
toUserId: this.vuex_user.id,
})
this.goBottom()
} else {
this.AddTisp(user, type)
}
} else {
this.AddTisp(user, type)
}
}
});
},
// 添加提示
AddTisp(user, type) {
var tab = this.vuex_tabbar;
tab[1].isDot = true;
this.$u.vuex('vuex_tabbar', tab);
var msgList = this.vuex_tabbar
var msgList = this.vuex_msgList
// 管理员对普通用户
if (type == 4) {
user = 'admin'
}
if (type == 3) {
user += 'user'
}
if (msgList.indexOf(user) < 0) {
msgList += (user + ',');
}
this.$u.vuex('vuex_msgList', msgList)
},
charLink() {
var that = this;
(function start(ms, that) {
setTimeout(() => {
try {
that.$connection
.start()
.then(() => {
that.connectionId = that.$connection.connection.transport.url.split(
"=")[1]
that.CharLogin()
if (that.state) {
this.SendMessage()
that.state = false
}
})
.catch((e) => {
//重试
// console.log("websocket连接失败", e);
return start(500, that);
});
} catch (e) {
//重试
// console.log("websocket连接失败", e);
return start(500, that);
}
}, ms);
})(0, that)
},
CharLogin() {
//绑定用户账号和connectionId
if (this.vuex_user.id) {
this.$connection
.invoke("login", this.connectionId, this.vuex_user.id)
.then((res) => {
// console.log("登录成功", res);
})
.catch((err) => {
// console.log("登录失败", err);;
});
} else {
setTimeout(() => {
this.CharLogin()
}, 1000)
}
},
// 发送消息
async SendMessage() {
// 判断当前学校是否认证,未认证不可聊天
const req = {
userId: this.vuex_user.id,
}
const res = await this.$u.apiList.MyPage(req)
console.log(JSON.parse(JSON.stringify(res)), 'res')
const edcationList = res.edcationList
if (!edcationList.length) {
return this.$refs.uToast.show({
title: '认证后可进行聊天操作',
type: 'warning',
})
}
const findRow = edcationList.find(x => x.isSelected === true);
if ([0, 2].includes(findRow.certifyStatus)) {
return this.$refs.uToast.show({
title: '认证后可进行聊天操作',
type: 'warning',
})
}
this.$connection
.invoke("sendMessage", this.vuex_user.id, this.userId, this.message, parseInt(this.chatType), this
.role)
.then((res) => {
this.MsgList.push({
fromUserId: this.vuex_user.id,
message: this.message,
sendDate: this.getIsTime(),
toUserId: this.userId,
})
this.state = true
this.close()
this.goBottom()
this.message = ''
}).catch((err) => {
this.charLink()
});
},
// 退出连接
closeChar() {
this.$connection.invoke("signOut", this.vuex_user.id).then((res) => {
;
});
// this.$connection.onclose(function (data) { //去掉斜杠
// console.log("websocket连接断开");
// //重试
// this.LinkChar()
// })
},
// 表情
emojiInit() {
var number = 60;
var page = Math.ceil(emoji.length / number);
for (let i = 0; i < page; i++) {
this.emojiData[i] = [];
for (let k = 0; k < number; k++) {
emoji[i * number + k] ?
this.emojiData[i].push(emoji[i * number + k]) : "";
}
}
},
inputFocus() {
this.CommonWords = false;
this.emoji = false;
this.goBottom();
},
inputBlur() {
;
},
shuru() {
this.goBottom()
},
choice(txt) {
this.message = txt;
},
close() {
this.CommonWords = false;
this.emoji = false;
},
sendOut() {
this.close();
},
selemoji(m) {
this.message += m;
},
goBottom() {
setTimeout(() => {
this.scrollTop += 1;
}, 200);
},
//返回上一级
router() {
if (this.type == 2) {
this.$u.route({
url: '/pages/message/adminList/adminList'
});
return
}
if (this.type == 0) {
uni.switchTab({
url: '../../message/msgList/msgList'
})
} else {
this.$u.route({
url: 'pages/AlumniCircle/userDetail/userDetail?id=' + this.id + '&type=3'
});
}
},
},
};
</script>
<style lang="scss" scoped>
.msgList.emoji,
.msgList.msg {
position: relative;
bottom: 3rem;
}
.errTips {
position: absolute;
z-index: 9999;
width: 100%;
background: #fff;
height: 0.16rem;
overflow: hidden;
transition: all 1s;
.group_3 {
color: rgb(255, 117, 134);
font-size: 0.11rem;
line-height: 0.12rem;
letter-spacing: 0.011rem;
white-space: nowrap;
justify-content: center;
}
.image_2 {
width: 0.16rem;
height: 0.14rem;
}
.text_5 {
margin-left: 0.085rem;
line-height: 1.4;
}
}
.emojishow {
height: 3rem !important;
}
.slider {
background: #fff;
width: 7.75rem;
height: 0rem;
transition: all 0.3s;
.slider-emoji {
overflow-y: scroll;
width: 100vw !important;
}
&-emoji {
width: 6.75rem;
flex-direction: row;
flex-wrap: wrap;
justify-content: center;
&-icon {
font-size: 0.265rem;
display: inline-block;
width: 10%;
text-align: center;
padding: 0.05rem 0;
border-radius: 0.1rem;
// border-bottom: 1px solid #ccc;
}
&-icon:active {
background: #ccc;
}
}
}
.lastbox {
justify-content: flex-start;
}
.msgList {
.scroll {
height: calc(100vh - 1rem);
background: #fff;
padding: 0 0.17rem;
box-sizing: border-box;
::v-deep .uni-scroll-view-content {
height: auto;
padding-bottom: 0.2rem;
}
}
> view {
margin-top: 0;
}
.systis {
width: 80%;
background-color: #f1f1f5;
margin: 0.15rem auto;
margin-top: 0.2rem;
border-radius: 0.1rem;
.section_2 {
margin-right: 0.02rem;
margin-top: 0.15rem;
padding: 0.13rem 0.075rem 0.13rem 0.18rem;
border-radius: 0.087rem 0.087rem 0.087rem 0.087rem;
background-size: 100% 100%;
background-repeat: no-repeat;
}
.group_2 {
color: rgb(160, 162, 172);
font-size: 0.12rem;
line-height: 0.2rem;
letter-spacing: 0.012rem;
text {
width: 100%;
}
}
.text_6 {
margin-top: 0.08rem;
color: rgb(160, 162, 172);
font-size: 0.12rem;
line-height: 0.16rem;
letter-spacing: 0.012rem;
white-space: nowrap;
}
.group_3 {
margin-top: 0.095rem;
color: rgb(160, 162, 172);
font-size: 0.12rem;
line-height: 0.12rem;
letter-spacing: 0.012rem;
white-space: nowrap;
}
.group_4 {
margin-top: 0.095rem;
padding-left: 0.005rem;
}
.text_5 {
margin-top: 0.07rem;
}
.text_8 {
margin-left: 0.04rem;
}
.text_9 {
align-self: center;
color: rgb(160, 162, 172);
font-size: 0.12rem;
line-height: 0.12rem;
letter-spacing: 0.012rem;
white-space: nowrap;
}
.text_10 {
color: rgb(46, 155, 255);
font-size: 0.12rem;
line-height: 0.16rem;
white-space: nowrap;
}
}
.exchange {
.top-group {
margin-left: 0.15rem;
margin-top: 0.085rem;
margin-right: 0.15rem;
}
.left-text-wrapper {
padding: 0.065rem 0 0.055rem;
background-color: rgb(255, 255, 255);
border-radius: 0.03rem;
width: 0.65rem;
height: 0.25rem;
border: solid 0.01rem rgb(255, 255, 255);
}
.right-text-wrapper {
margin-left: 0.24rem;
padding: 0.06rem 0;
background-color: rgb(255, 255, 255);
border-radius: 0.03rem;
width: 0.65rem;
height: 0.25rem;
border: solid 0.01rem rgb(255, 255, 255);
}
.text_11 {
color: rgb(255, 255, 255);
font-size: 0.15rem;
line-height: 0.14rem;
letter-spacing: 0.015rem;
white-space: nowrap;
text-align: center;
}
.bottom-group {
color: rgb(115, 129, 255);
font-size: 0.12rem;
line-height: 0.12rem;
letter-spacing: 0.012rem;
white-space: nowrap;
}
.right {
margin-left: 0.14rem;
}
.section_3 {
margin-top: 0.06rem;
padding: 0.15rem 0.33rem;
border-radius: 0.075rem 0.075rem 0.075rem 0.075rem;
background-image: url("~@/static/common/img/exchangeBjImg.png");
background-size: 100% 100%;
background-repeat: no-repeat;
}
.text_12 {
}
.view_1 {
margin-top: 0.21rem;
}
}
.hemsg {
margin-top: 0.15rem;
.image_3 {
width: 0.4rem !important;
height: 0.4rem !important;
border-radius: 50%;
overflow: hidden;
flex: 0 0 0.4rem !important;
}
.right-text-wrapper_1 {
margin-left: 0.15rem;
margin-top: 0.085rem;
padding: 0.1rem;
background-color: #f6f8fa;
border-radius: 0.1rem;
// border-top-left-radius: 0;
max-width: 65%;
word-break: break-all;
}
.group {
color: rgb(0, 0, 0);
font-size: 0.15rem;
line-height: 0.16rem;
letter-spacing: 0.015rem;
// white-space: nowrap;
}
.image_11 {
margin-bottom: 0.035rem;
}
}
.tis {
margin-top: 0.15rem;
.text {
display: block;
text-align: center;
color: rgb(180, 182, 189);
font-size: 0.11rem;
line-height: 0.12rem;
letter-spacing: 0.011rem;
white-space: nowrap;
}
}
.mymsg {
margin-top: 0.1rem;
.image_3 {
width: 0.4rem;
height: 0.4rem;
border-radius: 50%;
}
.text-wrapper {
margin-right: 0.14rem;
margin-top: 0.085rem;
padding: 0.1rem 0.1rem 0.09rem;
border-radius: 0.1rem;
// border-top-right-radius: 0;
background: #3CB5FB;
background-size: 100% 100%;
background-repeat: no-repeat;
max-width: 65%;
word-break: break-all;
}
.group_5 {
margin-top: 0.025rem;
color: rgb(255, 255, 255);
font-size: 0.15rem;
line-height: 0.16rem;
letter-spacing: 0.015rem;
white-space: wrap;
}
}
}
.Tips {
position: absolute;
z-index: 9;
top: 0.44rem;
left: 0;
right: 0;
background: #fff;
}
.navbar-center {
text-align: center;
width: 100%;
text {
display: block;
}
.info {
position: absolute;
left: 50%;
top: 50%;
transform: translate(-50%, -50%);
}
.name {
line-height: 0.15rem;
font-weight: 800;
font-size: 32rpx;
color: rgba(0, 0, 0, 0.9);
}
.shool {
font-size: 0.11rem;
color: #cacaca;
}
}
.navbar-right {
.btn {
// height: 0.3rem;
background-color: #2e9bff;
border-radius: 0.05rem;
font-size: 0.15rem;
line-height: 0.15rem;
color: #ffffff;
margin-right: 0.22rem;
}
}
.quick {
.section_2 {
padding: 0.08rem 0.095rem 0.06rem;
color: rgb(46, 155, 255);
font-size: 0.11rem;
line-height: 0.12rem;
letter-spacing: 0.011rem;
white-space: nowrap;
position: relative;
}
.image_2 {
position: absolute;
right: 0.095rem;
top: 50%;
transform: translateY(-50%);
width: 0.18rem;
height: 0.18rem;
}
.info {
font-size: 0.11rem;
line-height: 0.18rem;
letter-spacing: 0.01rem;
color: #2e9bff;
}
.text {
text-transform: uppercase;
color: #fff !important;
line-height: 0.25rem !important;
}
.section_7 {
padding: 0.055rem 0.095rem 0.045rem 50%;
color: rgb(255, 255, 255);
font-size: 0.12rem;
line-height: 0.12rem;
white-space: nowrap;
background-color: rgba(46, 155, 255, 0.1);
}
.image_13 {
margin: 0.04rem 0 0.025rem;
width: 0.18rem;
height: 0.18rem;
}
.text-wrapper_2 {
background-color: rgb(115, 129, 255);
border-radius: 0.05rem;
width: 0.97rem;
height: 0.25rem;
color: #fff;
}
.text-wrapper_3 {
margin-left: 0.14rem;
background-color: rgb(115, 129, 255);
border-radius: 0.05rem;
height: 0.25rem;
}
}
.msgbox {
position: fixed;
bottom: 0;
width: 100%;
.section_1 {
// height: 0.52rem;
background-color: #fff;
border: solid 0.01rem #eeeeee;
padding: 0.11rem 0.1rem 0.11rem 0.1rem;
.input-box {
display: flex;
width: 100%;
background: #f6f8f9;
padding: 6rpx;
border-radius: 20rpx;
align-items: center;
}
}
.text {
font-size: 0.14rem;
line-height: 0.15rem;
color: #505051;
margin: 0 0.1rem;
line-height: 0.36rem;
}
.input {
width: 80%;
min-height: 0.36rem !important;
line-height: 0.36rem;
// background-color: #f7f7f7;
border-radius: 0.1rem;
font-size: 0.14rem;
padding-right: 0.1rem !important;
::v-deep .u-input__input {
padding: 0.05rem;
min-height: 0.16rem !important;
transform: translateY(0.03rem);
}
}
.icon {
margin-left: 0.05rem;
// padding: 0.03rem 0;
margin-top: 10rpx;
}
.btn {
padding: 0.03rem 0;
.sendOut {
height: 60rpx;
line-height: 60rpx;
width: 90rpx;
margin-left: 0.05rem;
background: linear-gradient(178deg, #3CB5FB 0%, #06E1FA 100%);;
color: #ffffff;
}
}
.image {
width: 0.26rem;
height: 0.26rem;
}
.CommonWords {
width: 100%;
background-color: #f6f7fa;
text {
transition: all 0.3s;
display: block;
padding: 0.1rem 0 0.1rem 0.2rem;
font-size: 0.14rem;
line-height: 0.2rem;
height: 0.4rem;
overflow: hidden;
color: #505051;
}
text:active {
background: #ccc;
}
}
.open {
height: 3rem !important;
transition: all 0.3s;
}
.expandBox {
width: 100%;
background-color: #fff;
.expand-content {
width: 100%;
padding: 20rpx 30rpx;
display: flex;
flex-wrap: wrap;
justify-content: space-between;
.expand-item {
width: 140rpx;
text-align: center;
color: #999999;
}
image {
width: 140rpx;
height: 140rpx;
margin-bottom: 10rpx;
}
}
}
.open {
width: 100%;
height: 1.5rem !important;
transition: all 0.3s;
}
}
.attention-box {
width: 686rpx;
height: 100rpx;
background: #F6F8F9;
box-shadow: 0rpx 2rpx 10rpx -2rpx rgba(0, 0, 0, 0.06), 0rpx 4rpx 4rpx 0rpx rgba(0, 0, 0, 0.04), 0rpx 2rpx 12rpx 0rpx rgba(0, 0, 0, 0.02);
border-radius: 24rpx;
margin: 0 auto;
padding: 0 40rpx;
display: flex;
justify-content: space-between;
align-items: center;
}
.attention-right {
display: flex;
align-items: center;
image {
width: 44rpx;
height: 44rpx;
}
}
.attention-btn {
width: 120rpx;
height: 48rpx;
text-align: center;
line-height: 48rpx;
background: linear-gradient(178deg, #3CB5FB 0%, #06E1FA 100%);
border-radius: 64rpx;
font-size: 24rpx;
color: #fff;
margin-right: 20rpx;
}
</style>