upload project
This commit is contained in:
commit
06961cae04
422 changed files with 110626 additions and 0 deletions
402
subpackages/social/friend-detail/friend-detail.js
Normal file
402
subpackages/social/friend-detail/friend-detail.js
Normal file
|
|
@ -0,0 +1,402 @@
|
|||
// 好友详情页面
|
||||
const app = getApp();
|
||||
const friendAPI = require('../../../utils/friend-api.js');
|
||||
|
||||
Page({
|
||||
data: {
|
||||
// 好友信息
|
||||
friendInfo: null,
|
||||
loading: true,
|
||||
|
||||
// 操作状态
|
||||
isDeleting: false,
|
||||
|
||||
// UI 预计算字段
|
||||
friendInitial: '?'
|
||||
},
|
||||
|
||||
onLoad(options) {
|
||||
// 获取好友ID
|
||||
const customId = options.customId;
|
||||
if (customId) {
|
||||
this.loadFriendDetail(customId);
|
||||
} else {
|
||||
wx.showToast({
|
||||
title: '参数错误',
|
||||
icon: 'none'
|
||||
});
|
||||
setTimeout(() => {
|
||||
wx.navigateBack();
|
||||
}, 1500);
|
||||
}
|
||||
},
|
||||
|
||||
// 加载好友详情
|
||||
async loadFriendDetail(customId) {
|
||||
try {
|
||||
this.setData({ loading: true });
|
||||
|
||||
const response = await friendAPI.getFriendDetail(customId);
|
||||
if (response && (response.code === 0 || response.code === 200 || response.code === '0' || response.code === '200')) {
|
||||
const friendInfo = response.data;
|
||||
const initial = this._computeInitial(friendInfo);
|
||||
|
||||
// 计算年龄(根据生日)
|
||||
const calculatedAge = this.calculateAge(friendInfo?.birthday);
|
||||
|
||||
// 将家乡数组转换为字符串
|
||||
let hometownText = '';
|
||||
if (friendInfo?.hometown) {
|
||||
if (Array.isArray(friendInfo.hometown)) {
|
||||
hometownText = friendInfo.hometown.filter(item => item).join(' ');
|
||||
} else if (typeof friendInfo.hometown === 'string') {
|
||||
hometownText = friendInfo.hometown;
|
||||
}
|
||||
}else if(friendInfo.locationInfo){
|
||||
hometownText = friendInfo.locationInfo.district + friendInfo.locationInfo.city
|
||||
}
|
||||
|
||||
this.setData({
|
||||
friendInfo: friendInfo,
|
||||
loading: false,
|
||||
friendInitial: initial,
|
||||
calculatedAge: calculatedAge,
|
||||
hometownText: hometownText
|
||||
});
|
||||
} else {
|
||||
throw new Error(response?.message || '获取好友详情失败');
|
||||
}
|
||||
|
||||
} catch (error) {
|
||||
console.error('❌ 加载好友详情失败:', error);
|
||||
this.setData({ loading: false });
|
||||
|
||||
wx.showToast({
|
||||
title: error.message || '加载失败',
|
||||
icon: 'none'
|
||||
});
|
||||
|
||||
// 延迟返回上一页
|
||||
setTimeout(() => {
|
||||
wx.navigateBack();
|
||||
}, 1500);
|
||||
}
|
||||
},
|
||||
|
||||
// 根据生日计算年龄
|
||||
calculateAge(birthday) {
|
||||
if (!birthday) {
|
||||
return null;
|
||||
}
|
||||
|
||||
try {
|
||||
// 处理 YYYY-MM-DD 格式的日期
|
||||
let birthDate;
|
||||
if (typeof birthday === 'string' && birthday.includes('-')) {
|
||||
const dateParts = birthday.split('-');
|
||||
if (dateParts.length === 3) {
|
||||
birthDate = new Date(parseInt(dateParts[0]), parseInt(dateParts[1]) - 1, parseInt(dateParts[2]));
|
||||
} else {
|
||||
birthDate = new Date(birthday);
|
||||
}
|
||||
} else {
|
||||
birthDate = new Date(birthday);
|
||||
}
|
||||
|
||||
if (isNaN(birthDate.getTime())) {
|
||||
return null;
|
||||
}
|
||||
|
||||
const today = new Date();
|
||||
let age = today.getFullYear() - birthDate.getFullYear();
|
||||
const monthDiff = today.getMonth() - birthDate.getMonth();
|
||||
|
||||
// 如果还没过生日,年龄减1
|
||||
if (monthDiff < 0 || (monthDiff === 0 && today.getDate() < birthDate.getDate())) {
|
||||
age--;
|
||||
}
|
||||
|
||||
// 年龄应该大于等于0
|
||||
return age >= 0 ? age : null;
|
||||
} catch (error) {
|
||||
console.error('计算年龄失败:', error, birthday);
|
||||
return null;
|
||||
}
|
||||
},
|
||||
|
||||
// 发送消息
|
||||
sendMessage() {
|
||||
const { friendInfo } = this.data;
|
||||
if (!friendInfo) return;
|
||||
|
||||
wx.navigateTo({
|
||||
url: `/pages/message/chat/chat?targetId=${friendInfo.customId}&name=${encodeURIComponent(friendInfo.nickname)}&chatType=0`
|
||||
});
|
||||
},
|
||||
|
||||
|
||||
|
||||
previewImage(e) {
|
||||
try {
|
||||
// 获取当前点击的图片索引和动态索引
|
||||
const avatar = e.currentTarget.dataset.avatar;
|
||||
// 🔥 设置标志,防止预览关闭后触发页面刷新
|
||||
this._skipNextOnShowReload = true;
|
||||
const imageUrls=[avatar];
|
||||
// 调用微信小程序的图片预览API
|
||||
wx.previewImage({
|
||||
current: avatar,
|
||||
urls: imageUrls,
|
||||
success: () => {
|
||||
// 预览打开成功,标志已设置,关闭时会触发 onShow
|
||||
},
|
||||
fail: (err) => {
|
||||
console.error('图片预览失败:', err);
|
||||
// 预览失败,清除标志
|
||||
this._skipNextOnShowReload = false;
|
||||
wx.showToast({
|
||||
title: '预览图片失败',
|
||||
icon: 'none'
|
||||
});
|
||||
}
|
||||
});
|
||||
} catch (error) {
|
||||
console.error('图片预览过程中出错:', error);
|
||||
// 出错时清除标志
|
||||
this._skipNextOnShowReload = false;
|
||||
wx.showToast({
|
||||
title: '预览图片失败',
|
||||
icon: 'none'
|
||||
});
|
||||
}
|
||||
},
|
||||
|
||||
// 视频通话
|
||||
videoCall() {
|
||||
const { friendInfo } = this.data;
|
||||
if (!friendInfo) return;
|
||||
|
||||
wx.showToast({
|
||||
title: '视频通话功能开发中',
|
||||
icon: 'none'
|
||||
});
|
||||
},
|
||||
|
||||
// 设置备注
|
||||
setRemark() {
|
||||
const { friendInfo } = this.data;
|
||||
if (!friendInfo) {
|
||||
wx.showToast({
|
||||
title: '好友信息不存在',
|
||||
icon: 'none'
|
||||
});
|
||||
return;
|
||||
}
|
||||
|
||||
console.log('🔍 准备跳转到备注页面,好友信息:', friendInfo);
|
||||
|
||||
const nickname = friendInfo.nickname || friendInfo.remark || '好友';
|
||||
const customId = friendInfo.customId || '';
|
||||
const friendId = friendInfo.id || friendInfo.friendId || customId;
|
||||
const remark = friendInfo.remark || '';
|
||||
|
||||
wx.navigateTo({
|
||||
url: `/subpackages/social-remark/friend-remark?friendId=${encodeURIComponent(friendId)}&customId=${encodeURIComponent(customId)}&remark=${encodeURIComponent(remark)}&nickname=${encodeURIComponent(nickname)}`,
|
||||
success: () => {
|
||||
console.log('✅ 跳转成功');
|
||||
},
|
||||
fail: (err) => {
|
||||
console.error('❌ 跳转失败:', err);
|
||||
wx.showToast({
|
||||
title: '跳转失败: ' + (err.errMsg || '未知错误'),
|
||||
icon: 'none',
|
||||
duration: 2000
|
||||
});
|
||||
}
|
||||
});
|
||||
},
|
||||
|
||||
// 删除好友
|
||||
deleteFriend() {
|
||||
const { friendInfo } = this.data;
|
||||
if (!friendInfo) return;
|
||||
|
||||
wx.showModal({
|
||||
title: '删除好友',
|
||||
content: `确定要删除好友"${friendInfo.nickname}"吗?删除后将同时清理聊天记录。`,
|
||||
confirmText: '删除',
|
||||
confirmColor: '#ff4757',
|
||||
success: async (res) => {
|
||||
if (res.confirm) {
|
||||
try {
|
||||
this.setData({ isDeleting: true });
|
||||
wx.showLoading({ title: '正在删除...' });
|
||||
|
||||
// 后端删除好友关系
|
||||
await friendAPI.deleteFriend(friendInfo.customId);
|
||||
|
||||
// 🔥 删除对应的会话记录
|
||||
try {
|
||||
const nimConversationManager = require('../../../utils/nim-conversation-manager.js');
|
||||
const app = getApp();
|
||||
|
||||
// 获取当前用户的 NIM accountId
|
||||
const userInfo = app.globalData.userInfo;
|
||||
const myAccountId = userInfo?.neteaseIMAccid || userInfo?.user?.neteaseIMAccid;
|
||||
|
||||
console.log('删除会话 - 用户信息:', {
|
||||
myAccountId,
|
||||
friendId: friendInfo.customId
|
||||
});
|
||||
|
||||
if (myAccountId && friendInfo.customId) {
|
||||
const conversationId = `${myAccountId}|1|${friendInfo.customId}`;
|
||||
console.log('🗑️ 准备删除会话:', conversationId);
|
||||
|
||||
await nimConversationManager.deleteConversation(conversationId);
|
||||
console.log('✅ 已删除好友会话:', conversationId);
|
||||
} else {
|
||||
console.warn('⚠️ 缺少必要信息,无法删除会话', {
|
||||
hasMyAccountId: !!myAccountId,
|
||||
hasFriendId: !!friendInfo.customId
|
||||
});
|
||||
}
|
||||
} catch (convError) {
|
||||
console.error('⚠️ 删除会话失败(不影响主流程):', convError);
|
||||
}
|
||||
|
||||
wx.hideLoading();
|
||||
wx.showToast({
|
||||
title: '已删除好友',
|
||||
icon: 'success'
|
||||
});
|
||||
|
||||
// 延迟返回并刷新好友列表
|
||||
setTimeout(() => {
|
||||
// 通知好友页面刷新
|
||||
const pages = getCurrentPages();
|
||||
const friendsPage = pages.find(page => page.route === 'pages/social/friends/friends');
|
||||
if (friendsPage && friendsPage.loadFriends) {
|
||||
friendsPage.loadFriends();
|
||||
}
|
||||
|
||||
wx.navigateBack();
|
||||
}, 1000);
|
||||
|
||||
} catch (error) {
|
||||
console.error('❌ 删除好友失败:', error);
|
||||
wx.hideLoading();
|
||||
this.setData({ isDeleting: false });
|
||||
|
||||
wx.showToast({
|
||||
title: error.message || '删除失败',
|
||||
icon: 'none'
|
||||
});
|
||||
}
|
||||
}
|
||||
}
|
||||
});
|
||||
},
|
||||
|
||||
// 查看位置
|
||||
viewLocation() {
|
||||
const { friendInfo } = this.data;
|
||||
if (!friendInfo || !friendInfo.locationInfo) {
|
||||
wx.showToast({
|
||||
title: '暂无位置信息',
|
||||
icon: 'none'
|
||||
});
|
||||
return;
|
||||
}
|
||||
|
||||
const { locationInfo } = friendInfo;
|
||||
wx.openLocation({
|
||||
latitude: locationInfo.latitude,
|
||||
longitude: locationInfo.longitude,
|
||||
name: friendInfo.nickname,
|
||||
address: locationInfo.address || '未知位置'
|
||||
});
|
||||
},
|
||||
|
||||
// ===== 置顶/免打扰开关 =====
|
||||
async onTogglePin(e) {
|
||||
wx.showToast({
|
||||
title: '请使用消息页面管理会话',
|
||||
icon: 'none'
|
||||
});
|
||||
},
|
||||
|
||||
async onToggleMute(e) {
|
||||
wx.showToast({
|
||||
title: '请使用消息页面管理会话',
|
||||
icon: 'none'
|
||||
});
|
||||
},
|
||||
|
||||
// 计算头像首字母
|
||||
_computeInitial(friendInfo) {
|
||||
try {
|
||||
const name = String(friendInfo?.remark || friendInfo?.nickname || '').trim();
|
||||
if (!name) return '?';
|
||||
return name.charAt(0);
|
||||
} catch (_) {
|
||||
return '?';
|
||||
}
|
||||
},
|
||||
|
||||
// 复制ID
|
||||
copyId() {
|
||||
const { friendInfo } = this.data;
|
||||
const id = friendInfo?.customId || (friendInfo?.id ? 'findme_' + friendInfo.id : '未设置');
|
||||
if (!id || id === '未设置') {
|
||||
wx.showToast({
|
||||
title: 'ID不存在',
|
||||
icon: 'none'
|
||||
});
|
||||
return;
|
||||
}
|
||||
wx.setClipboardData({
|
||||
data: id,
|
||||
success: () => {
|
||||
wx.showToast({
|
||||
title: '复制成功',
|
||||
icon: 'success',
|
||||
duration: 2000
|
||||
});
|
||||
},
|
||||
fail: () => {
|
||||
wx.showToast({
|
||||
title: '复制失败',
|
||||
icon: 'none'
|
||||
});
|
||||
}
|
||||
});
|
||||
},
|
||||
|
||||
// 查看二维码
|
||||
viewQRCode() {
|
||||
const { friendInfo } = this.data;
|
||||
if (!friendInfo || !friendInfo.customId) {
|
||||
wx.showToast({
|
||||
title: '好友信息不存在',
|
||||
icon: 'none'
|
||||
});
|
||||
return;
|
||||
}
|
||||
|
||||
// 传递好友的 customId 参数,用于生成好友的二维码
|
||||
wx.navigateTo({
|
||||
url: `/subpackages/qr/qr-code/qr-code?customId=${friendInfo.customId}`,
|
||||
success: (res) => {
|
||||
console.log('跳转二维码页面成功', res);
|
||||
},
|
||||
fail: (err) => {
|
||||
console.error('跳转二维码页面失败', err);
|
||||
wx.showToast({
|
||||
title: '跳转失败',
|
||||
icon: 'none'
|
||||
});
|
||||
}
|
||||
});
|
||||
},
|
||||
});
|
||||
7
subpackages/social/friend-detail/friend-detail.json
Normal file
7
subpackages/social/friend-detail/friend-detail.json
Normal file
|
|
@ -0,0 +1,7 @@
|
|||
{
|
||||
"navigationStyle": "default",
|
||||
"navigationBarTitleText": "好友详情",
|
||||
"navigationBarBackgroundColor": "#000000",
|
||||
"navigationBarTextStyle": "white",
|
||||
"backgroundColor": "#f5f5f5"
|
||||
}
|
||||
150
subpackages/social/friend-detail/friend-detail.wxml
Normal file
150
subpackages/social/friend-detail/friend-detail.wxml
Normal file
|
|
@ -0,0 +1,150 @@
|
|||
<!-- 好友详情页面 -->
|
||||
<view class="friend-detail-container">
|
||||
|
||||
<!-- 加载中 -->
|
||||
<view class="loading-container" wx:if="{{loading}}">
|
||||
<view class="loading-spinner"></view>
|
||||
<text class="loading-text">加载中...</text>
|
||||
</view>
|
||||
|
||||
<!-- 好友详情内容 -->
|
||||
<scroll-view class="detail-content" scroll-y="true" wx:if="{{!loading && friendInfo}}">
|
||||
|
||||
<!-- 基本信息卡片 -->
|
||||
<view class="info-card">
|
||||
<!-- 头像和基本信息 -->
|
||||
<view class="basic-info">
|
||||
<view class="profile-top flex-row">
|
||||
<view class="avatar-container">
|
||||
<image class="avatar-image" data-avatar="{{friendInfo.avatar}}" bindtap="previewImage" src="{{friendInfo.avatar || '/images/default-avatar.svg'}}" mode="aspectFill" />
|
||||
<view class="avatar-decoration" wx:if="{{friendInfo.isMember}}">👑</view>
|
||||
<view class="online-status online"></view>
|
||||
</view>
|
||||
<view class="profile-info flex-col">
|
||||
<view class="profile-name-row flex-row">
|
||||
<view class="profile-name">{{friendInfo.remark || friendInfo.nickname || 'FindMe用户'}}</view>
|
||||
<view class="vip-crown" wx:if="{{friendInfo.isMember}}">👑</view>
|
||||
</view>
|
||||
<view class="profile-id">
|
||||
<text class="id-label">ID: </text>
|
||||
<view class="id-value-wrapper" bindtap="copyId">
|
||||
<text class="id-value">{{friendInfo.customId}}</text>
|
||||
</view>
|
||||
<!-- 新增:去认证按钮 -->
|
||||
<view class="verify-btn" wx:if="{{!friendInfo.verified}}">
|
||||
<image class="verify-btn-p" bindtap="copyId" src="../../../images/btn.png" mode="widthFix" />
|
||||
<text class="verify-text">未认证</text>
|
||||
</view>
|
||||
<view class="verified-tag" wx:if="{{friendInfo.verified}}">
|
||||
<image class="verified-tag-p" bindtap="copyId" src="../../../images/tag.png" mode="widthFix" />
|
||||
<text class="verified-text">已认证</text>
|
||||
</view>
|
||||
</view>
|
||||
</view>
|
||||
</view>
|
||||
</view>
|
||||
</view>
|
||||
|
||||
<!-- 底部信息区:位置、二维码、编辑按钮、设置、简介、个人标签 -->
|
||||
<view class="profile-bottom">
|
||||
<!-- 操作按钮区 -->
|
||||
<view class="action-buttons">
|
||||
<view class="qr-code-btn" bindtap="viewQRCode">
|
||||
<image src="/images/qr-code.png" class="qr-code-icon"/>
|
||||
</view>
|
||||
</view>
|
||||
|
||||
<!-- 位置信息 -->
|
||||
<view class="profile-location" bindtap="viewLocation">
|
||||
<image src="/images/location.png" class="location-icon"/>
|
||||
<text class="location-text-qr">{{hometownText}}</text>
|
||||
<text class="location-arrow">›</text>
|
||||
</view>
|
||||
|
||||
<!-- 个人简介 -->
|
||||
<view class="profile-signature">
|
||||
<text class="signature-text">{{friendInfo.bio || '暂无简介'}}</text>
|
||||
</view>
|
||||
|
||||
<!-- 个人标签区域 -->
|
||||
<view class="profile-tabs">
|
||||
<scroll-view scroll-x="true" class="tab-scroll" enable-flex="true">
|
||||
<view class="tab-item" wx:if="{{friendInfo.gender !== null && friendInfo.gender !== undefined && friendInfo.gender !== ''}}">
|
||||
<image wx:if="{{friendInfo.gender === 1 || friendInfo.gender === '1' || friendInfo.gender === 2 || friendInfo.gender === '2'}}" class="gender-icon" src="{{friendInfo.gender === 1 || friendInfo.gender === '1' ? '/images/self/male.svg' : '/images/self/fmale.svg'}}" mode="aspectFit" />
|
||||
<text wx:else>?</text>
|
||||
</view>
|
||||
|
||||
<view class="tab-item" wx:if="{{calculatedAge !== null && calculatedAge !== undefined || friendInfo.age}}">
|
||||
<text> {{calculatedAge !== null && calculatedAge !== undefined ? calculatedAge : ((friendInfo.age + "岁") || '')}}</text>
|
||||
</view>
|
||||
|
||||
<view class="tab-item" wx:if="{{friendInfo.mood && friendInfo.mood !== ''}}">
|
||||
<text> {{friendInfo.mood}}</text>
|
||||
</view>
|
||||
|
||||
<view class="tab-item" wx:if="{{friendInfo.mbtiType && friendInfo.mbtiType !== ''}}">
|
||||
<text> {{friendInfo.mbtiType}}</text>
|
||||
</view>
|
||||
|
||||
<view class="tab-item" wx:if="{{friendInfo.identity && friendInfo.identity !== ''}}">
|
||||
<text> {{friendInfo.identity}}</text>
|
||||
</view>
|
||||
|
||||
<view class="tab-item" wx:if="{{friendInfo.zodiacSign && friendInfo.zodiacSign !== ''}}">
|
||||
<text> {{friendInfo.zodiacSign}}</text>
|
||||
</view>
|
||||
|
||||
<view class="tab-item" wx:if="{{friendInfo.school && friendInfo.school !== ''}}">
|
||||
<text> {{friendInfo.school}}</text>
|
||||
</view>
|
||||
|
||||
<view class="tab-item" wx:if="{{friendInfo.occupation && friendInfo.occupation !== ''}}">
|
||||
<text> {{friendInfo.occupation}}</text>
|
||||
</view>
|
||||
</scroll-view>
|
||||
</view>
|
||||
</view>
|
||||
|
||||
<!-- 好友足迹(完全仿 profile.wxml 的 myfootprint 模块) -->
|
||||
<!-- <view class="myfootprint">
|
||||
<view class="footprint-title">{{friendInfo.remark || friendInfo.nickname}}的足迹</view>
|
||||
<image class="footprint-earth" src="/images/self/earth.png" mode="aspectFit"/>
|
||||
<view class="footprint-badge">
|
||||
<text>{{footprints && footprints.length ? footprints.length + '个足迹' : '暂无足迹'}}</text>
|
||||
</view>
|
||||
</view> -->
|
||||
|
||||
<!-- 新增两个渐变圆角容器 -->
|
||||
<!-- <view class="footprint-gradient-row">
|
||||
<view class="footprint-gradient-box footprint-gradient-yellow"></view>
|
||||
<view class="footprint-gradient-box footprint-gradient-blue"></view>
|
||||
</view> -->
|
||||
|
||||
<!-- 操作按钮区 -->
|
||||
<view class="detail-action-buttons">
|
||||
<view class="detail-action-btn-wrapper" bindtap="sendMessage">
|
||||
<view class="detail-action-btn">
|
||||
<text>消息</text>
|
||||
</view>
|
||||
</view>
|
||||
<view class="detail-action-btn-wrapper" bindtap="setRemark">
|
||||
<view class="detail-action-btn">
|
||||
<text>备注</text>
|
||||
</view>
|
||||
</view>
|
||||
</view>
|
||||
|
||||
<!-- 详细信息 -->
|
||||
<view class="detail-sections">
|
||||
<!-- 危险操作 -->
|
||||
<view class="detail-section danger-section">
|
||||
<view class="danger-item" bindtap="deleteFriend">
|
||||
<text class="danger-text">删除好友</text>
|
||||
</view>
|
||||
</view>
|
||||
</view>
|
||||
|
||||
<!-- 底部安全区域 -->
|
||||
<view class="safe-area-bottom"></view>
|
||||
</scroll-view>
|
||||
</view>
|
||||
915
subpackages/social/friend-detail/friend-detail.wxss
Normal file
915
subpackages/social/friend-detail/friend-detail.wxss
Normal file
|
|
@ -0,0 +1,915 @@
|
|||
/* 足迹下方两个容器并排平分整行 */
|
||||
.footprint-gradient-row {
|
||||
display: grid;
|
||||
grid-template-columns: 1fr 1fr;
|
||||
gap: 32rpx;
|
||||
width: 100%;
|
||||
margin: 32rpx auto;
|
||||
}
|
||||
.footprint-gradient-row .footprint-gradient-box {
|
||||
width: 100%;
|
||||
height: 332rpx;
|
||||
border-radius: 40rpx;
|
||||
margin: 0;
|
||||
}
|
||||
/* 足迹下方两个渐变圆角容器样式 */
|
||||
.footprint-gradient-box {
|
||||
width: 100%;
|
||||
height: 332rpx;
|
||||
border-radius: 40rpx;
|
||||
margin: 0;
|
||||
}
|
||||
|
||||
.footprint-gradient-yellow {
|
||||
background: linear-gradient(180deg, rgba(255, 255, 255, 0.31) 60%,#fff600 160%);
|
||||
}
|
||||
|
||||
.footprint-gradient-blue {
|
||||
background: linear-gradient(110deg, #139dff 10%, #3137ea 50%, #3bc493 100%);
|
||||
}
|
||||
/* 足迹模块样式(完全复制 profile.wxss) */
|
||||
.myfootprint{
|
||||
margin: 30rpx 0;
|
||||
padding: 20rpx;
|
||||
border-radius: 20rpx;
|
||||
background: linear-gradient(135deg, #34a853 0%, #7b4397 50%, #4285f4 100%);
|
||||
position: relative;
|
||||
height: 200rpx;
|
||||
display: flex;
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
margin-top: 0;
|
||||
}
|
||||
|
||||
/* 左上角:足迹标题 */
|
||||
.footprint-title {
|
||||
position: absolute;
|
||||
top: 20rpx;
|
||||
left: 20rpx;
|
||||
font-size: 32rpx;
|
||||
font-weight: 600;
|
||||
color: #fff;
|
||||
z-index: 2;
|
||||
}
|
||||
|
||||
/* 中间:地球图标 */
|
||||
.footprint-earth {
|
||||
width: 560rpx;
|
||||
height: 120rpx;
|
||||
position: relative;
|
||||
top: 61%;
|
||||
left: 40%;
|
||||
transform: translate(-50%, -50%);
|
||||
z-index: 1;
|
||||
}
|
||||
|
||||
/* 右下角:足迹信息白色 pill */
|
||||
.footprint-badge {
|
||||
position: absolute;
|
||||
bottom: 20rpx;
|
||||
right: 20rpx;
|
||||
background: #fff;
|
||||
padding: 0 20rpx;
|
||||
border-radius: 10rpx;
|
||||
font-size: 24rpx;
|
||||
height:56rpx;
|
||||
line-height: 56rpx;
|
||||
z-index: 3;
|
||||
}
|
||||
|
||||
.footprint-badge text {
|
||||
font-size: 24rpx;
|
||||
font-weight: bold;
|
||||
color: #000;
|
||||
}
|
||||
/* 好友详情页面样式 */
|
||||
.friend-detail-container {
|
||||
min-height: 100vh;
|
||||
/* 渐变页面背景 - 从右下角往上,深变浅 */
|
||||
background: radial-gradient(ellipse at right bottom, #1c3954 0%, #1d3c7c 40%, #193170 70%, rgba(25, 49, 112, 0.8) 100%);
|
||||
}
|
||||
|
||||
/* 自定义导航栏已移除,使用系统导航栏 */
|
||||
.profile-info{
|
||||
margin-left: 20rpx;
|
||||
}
|
||||
/* 加载状态 */
|
||||
.loading-container {
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
height: 200px;
|
||||
}
|
||||
|
||||
.loading-spinner {
|
||||
width: 30px;
|
||||
height: 30px;
|
||||
border: 3px solid #f3f3f3;
|
||||
border-top: 3px solid #007aff;
|
||||
border-radius: 50%;
|
||||
animation: spin 1s linear infinite;
|
||||
}
|
||||
|
||||
@keyframes spin {
|
||||
0% { transform: rotate(0deg); }
|
||||
100% { transform: rotate(360deg); }
|
||||
}
|
||||
|
||||
.loading-text {
|
||||
margin-top: 12px;
|
||||
font-size: 14px;
|
||||
color: #999;
|
||||
}
|
||||
|
||||
/* 详情内容 */
|
||||
.detail-content {
|
||||
height: 100vh; /* 系统导航下全屏滚动 */
|
||||
padding: 12px 14px 24px 14px;
|
||||
box-sizing: border-box;
|
||||
/* 与页面保持一致的渐变背景 - 从右下角往上,深变浅 */
|
||||
background: radial-gradient(ellipse at right bottom, #1c3954 0%, #1d3c7c 40%, #193170 70%, rgba(25, 49, 112, 0.8) 100%);
|
||||
}
|
||||
|
||||
/* 统一头像区域为 profile 页的布局与尺寸 */
|
||||
.profile-top {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
position: relative;
|
||||
z-index: 1;
|
||||
}
|
||||
|
||||
.avatar-container {
|
||||
width: 186rpx;
|
||||
height: 186rpx;
|
||||
position: relative;
|
||||
background-color: #fff;
|
||||
border-radius: 50%;
|
||||
border: 10rpx solid #193170;
|
||||
transition: all 0.3s ease;
|
||||
backdrop-filter: blur(20rpx);
|
||||
-webkit-backdrop-filter: blur(20rpx);
|
||||
margin-left: 46rpx;
|
||||
}
|
||||
|
||||
.avatar-container:active {
|
||||
transform: scale(0.95);
|
||||
box-shadow: 0 8rpx 32rpx rgba(102, 126, 234, 0.4);
|
||||
}
|
||||
|
||||
.avatar-image {
|
||||
width: 166rpx;
|
||||
height: 166rpx;
|
||||
object-fit: cover;
|
||||
border-radius: 50%;
|
||||
position: absolute;
|
||||
z-index: 1;
|
||||
}
|
||||
|
||||
.avatar-decoration {
|
||||
position: absolute;
|
||||
top: 0;
|
||||
left: 15rpx;
|
||||
transform: translateX(-50%) rotate(-15deg);
|
||||
width: 70rpx;
|
||||
height: 70rpx;
|
||||
font-size: 56rpx;
|
||||
line-height: 70rpx;
|
||||
text-align: center;
|
||||
z-index: 3;
|
||||
display: flex;
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
text-shadow: 0 0 10rpx rgba(255, 215, 0, 0.8);
|
||||
filter: drop-shadow(0 2rpx 4rpx rgba(0, 0, 0, 0.3));
|
||||
}
|
||||
|
||||
.online-status.online {
|
||||
position: absolute;
|
||||
top: 20rpx;
|
||||
right: 5rpx;
|
||||
width: 32rpx;
|
||||
z-index: 2;
|
||||
height: 32rpx;
|
||||
background: #4CAF50;
|
||||
border: 3rpx solid #ffffff;
|
||||
border-radius: 50%;
|
||||
box-shadow: 0 0 0 4rpx rgba(76, 175, 80, 0.3);
|
||||
animation: pulse 2s infinite;
|
||||
}
|
||||
|
||||
@keyframes pulse {
|
||||
0% { box-shadow: 0 0 0 0 rgba(76,175,80,0.4); }
|
||||
70% { box-shadow: 0 0 0 10rpx rgba(76,175,80,0); }
|
||||
100% { box-shadow: 0 0 0 0 rgba(76,175,80,0); }
|
||||
}
|
||||
|
||||
/* 信息卡片 */
|
||||
.info-card {
|
||||
border-radius: 14px;
|
||||
}
|
||||
|
||||
.basic-info {
|
||||
display: flex;
|
||||
margin-bottom: 14px;
|
||||
gap: 12px;
|
||||
}
|
||||
|
||||
.avatar-section {
|
||||
position: relative;
|
||||
margin-right: 16px;
|
||||
}
|
||||
|
||||
.friend-avatar {
|
||||
width: 74px;
|
||||
height: 74px;
|
||||
/* 改为圆形头像 */
|
||||
border-radius: 50%;
|
||||
overflow: hidden;
|
||||
box-shadow: 0 2px 6px rgba(0,0,0,0.08);
|
||||
}
|
||||
|
||||
.avatar-image {
|
||||
width: 100%;
|
||||
height: 100%;
|
||||
}
|
||||
|
||||
.avatar-placeholder {
|
||||
width: 100%;
|
||||
height: 100%;
|
||||
background: linear-gradient(135deg,#dadfe4,#cfd5db);
|
||||
display: flex;
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
border-radius: 50%;
|
||||
}
|
||||
|
||||
.avatar-text {
|
||||
font-size: 32px;
|
||||
color: #999;
|
||||
font-weight: 500;
|
||||
}
|
||||
|
||||
.member-badge {
|
||||
position: absolute;
|
||||
bottom: -4px;
|
||||
right: -4px;
|
||||
background: linear-gradient(45deg, #ff6b6b, #ffa500);
|
||||
border-radius: 8px;
|
||||
padding: 2px 6px;
|
||||
}
|
||||
|
||||
.member-text {
|
||||
font-size: 10px;
|
||||
color: #fff;
|
||||
font-weight: 600;
|
||||
}
|
||||
|
||||
.info-section {
|
||||
flex: 1;
|
||||
}
|
||||
|
||||
.name-row {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
margin-bottom: 8px;
|
||||
}
|
||||
|
||||
.friend-name {
|
||||
font-size: 19px;
|
||||
font-weight: 600;
|
||||
color: #222;
|
||||
margin-right: 8px;
|
||||
}
|
||||
|
||||
.gender-icon {
|
||||
width: 20px;
|
||||
height: 20px;
|
||||
border-radius: 50%;
|
||||
display: flex;
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
}
|
||||
|
||||
.gender-text {
|
||||
font-size: 12px;
|
||||
color: #fff;
|
||||
}
|
||||
|
||||
.friend-id {
|
||||
font-size: 14px;
|
||||
color: #999;
|
||||
margin-bottom: 4px; /* 与简介垂直间距更紧凑 */
|
||||
display: block; /* 独占一行,避免与简介挤在同一行 */
|
||||
line-height: 1.3;
|
||||
}
|
||||
|
||||
.friend-bio {
|
||||
font-size: 13px;
|
||||
color: #555;
|
||||
line-height: 1.45;
|
||||
margin-bottom: 10px;
|
||||
display: block; /* 独占一行 */
|
||||
white-space: normal; /* 确保可换行 */
|
||||
}
|
||||
|
||||
.friendship-info {
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
}
|
||||
|
||||
.friendship-text {
|
||||
font-size: 13px;
|
||||
color: #007aff;
|
||||
margin-bottom: 4px;
|
||||
}
|
||||
|
||||
.friendship-days {
|
||||
font-size: 12px;
|
||||
color: #007aff;
|
||||
}
|
||||
|
||||
/* 操作按钮 */
|
||||
.action-buttons {
|
||||
display: flex;
|
||||
gap: 10px;
|
||||
margin-top: 4px;
|
||||
}
|
||||
|
||||
.action-btn {
|
||||
flex: 1;
|
||||
height: 42px;
|
||||
border-radius: 10px;
|
||||
display: flex;
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
gap: 6px;
|
||||
font-size: 14px;
|
||||
}
|
||||
|
||||
.action-btn.primary {
|
||||
background: linear-gradient(135deg,#4d7dff,#246bff);
|
||||
box-shadow: 0 4px 10px rgba(36,107,255,0.25);
|
||||
}
|
||||
|
||||
.action-btn.secondary {
|
||||
background: #f0f3f7;
|
||||
}
|
||||
|
||||
.btn-icon {
|
||||
width: 20px;
|
||||
height: 20px;
|
||||
/* font-size: 15px; */
|
||||
}
|
||||
|
||||
.btn-text {
|
||||
font-size: 14px;
|
||||
font-weight: 600;
|
||||
margin-top: 30rpx;
|
||||
}
|
||||
|
||||
.action-btn.primary .btn-text {
|
||||
color: #fff;
|
||||
}
|
||||
|
||||
.action-btn.secondary .btn-text {
|
||||
color: #333;
|
||||
}
|
||||
|
||||
/* 详细信息区域 */
|
||||
.detail-sections {
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
gap: 12px;
|
||||
}
|
||||
|
||||
.detail-section {
|
||||
background-color: #fff;
|
||||
border-radius: 14px;
|
||||
overflow: hidden;
|
||||
border: 1px solid #f1f2f5;
|
||||
box-shadow: 0 2px 8px rgba(0,0,0,0.04);
|
||||
}
|
||||
|
||||
.section-header {
|
||||
padding: 14px 16px 6px 16px;
|
||||
}
|
||||
|
||||
.section-title {
|
||||
font-size: 15px;
|
||||
font-weight: 600;
|
||||
color: #222;
|
||||
letter-spacing: .5px;
|
||||
}
|
||||
|
||||
/* 信息项 */
|
||||
.info-items {
|
||||
padding: 0 16px 14px 16px;
|
||||
}
|
||||
|
||||
.info-item {
|
||||
display: flex;
|
||||
justify-content: space-between;
|
||||
align-items: center;
|
||||
padding: 10px 0;
|
||||
border-bottom: 1px solid #f1f2f5;
|
||||
}
|
||||
|
||||
.info-item:last-child {
|
||||
border-bottom: none;
|
||||
}
|
||||
|
||||
.item-label {
|
||||
font-size: 14px;
|
||||
color: #666;
|
||||
}
|
||||
|
||||
.item-value {
|
||||
font-size: 14px;
|
||||
color: #222;
|
||||
text-align: right;
|
||||
}
|
||||
|
||||
/* 位置信息 */
|
||||
.location-item {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
justify-content: space-between;
|
||||
padding: 14px 16px 14px 16px;
|
||||
}
|
||||
|
||||
.location-info {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
flex: 1;
|
||||
}
|
||||
|
||||
.location-icon {
|
||||
font-size: 16px;
|
||||
margin-right: 12px;
|
||||
}
|
||||
|
||||
.location-details {
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
}
|
||||
|
||||
.location-address {
|
||||
font-size: 14px;
|
||||
color: #222;
|
||||
margin-bottom: 4px;
|
||||
}
|
||||
|
||||
.location-time {
|
||||
margin-left: 20px;
|
||||
font-size: 11px;
|
||||
color: #777;
|
||||
}
|
||||
|
||||
.location-arrow {
|
||||
font-size: 16px;
|
||||
color: #c7c7cc;
|
||||
}
|
||||
|
||||
/* 设置项 */
|
||||
.setting-items {
|
||||
padding: 0 16px 12px 16px;
|
||||
}
|
||||
|
||||
.setting-item {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
justify-content: space-between;
|
||||
padding: 14px 0;
|
||||
border-bottom: 1px solid #f1f2f5;
|
||||
}
|
||||
|
||||
.setting-item:last-child {
|
||||
border-bottom: none;
|
||||
}
|
||||
|
||||
.setting-info {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
flex: 1;
|
||||
}
|
||||
|
||||
.setting-icon {
|
||||
font-size: 16px;
|
||||
margin-right: 12px;
|
||||
}
|
||||
|
||||
.setting-label {
|
||||
font-size: 14px;
|
||||
color: #222;
|
||||
}
|
||||
|
||||
.setting-arrow {
|
||||
font-size: 16px;
|
||||
color: #c7c7cc;
|
||||
}
|
||||
|
||||
/* .setting-switch 已移除(消息免打扰/置顶聊天功能暂不提供) */
|
||||
|
||||
|
||||
.detail-section.danger-section {
|
||||
background-color: #5c8bff;
|
||||
border-radius: 44rpx;
|
||||
height: 88rpx;
|
||||
display: flex;
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
overflow: hidden;
|
||||
border: none;
|
||||
box-shadow: none;
|
||||
}
|
||||
|
||||
.danger-item {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
width: 100%;
|
||||
height: 100%;
|
||||
gap: 6px;
|
||||
}
|
||||
|
||||
|
||||
.danger-text {
|
||||
font-size: 14px;
|
||||
color: #ffffff;
|
||||
font-weight: 600;
|
||||
letter-spacing: .5px;
|
||||
}
|
||||
|
||||
/* 底部安全区域 */
|
||||
.safe-area-bottom {
|
||||
height: 34px;
|
||||
}
|
||||
|
||||
.verified-tag-p {
|
||||
width: 32rpx;
|
||||
height: 40rpx;
|
||||
display: block;
|
||||
object-fit: contain;
|
||||
}
|
||||
.verify-btn-p {
|
||||
width: 32rpx;
|
||||
height: 40rpx;
|
||||
display: block;
|
||||
object-fit: contain;
|
||||
}
|
||||
|
||||
/* profile-name-row 样式(仿照 profile.wxml) */
|
||||
.profile-name-row {
|
||||
height: 100%;
|
||||
}
|
||||
|
||||
.profile-name {
|
||||
font-size: 36rpx;
|
||||
white-space: normal;
|
||||
word-wrap: break-word;
|
||||
font-weight: 500;
|
||||
color: #ffffff;
|
||||
line-height: 1.2;
|
||||
}
|
||||
|
||||
.gender-badge {
|
||||
font-size: 24rpx;
|
||||
margin-left: 8rpx;
|
||||
color: #ffffff;
|
||||
display: flex;
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
}
|
||||
|
||||
.gender-badge .gender-icon {
|
||||
width: 32rpx;
|
||||
height: 32rpx;
|
||||
}
|
||||
|
||||
.vip-crown {
|
||||
font-size: 24rpx;
|
||||
margin-left: 8rpx;
|
||||
color: #ffd700;
|
||||
}
|
||||
|
||||
/* profile-id 样式(仿照 profile.wxml) */
|
||||
.profile-id {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
width: fit-content;
|
||||
}
|
||||
|
||||
.id-label {
|
||||
font-size: 28rpx;
|
||||
color: #f3f3f3;
|
||||
font-weight: 400;
|
||||
margin-right: 12rpx;
|
||||
}
|
||||
|
||||
.id-value-wrapper {
|
||||
display: inline-flex;
|
||||
align-items: center;
|
||||
padding: 10rpx 8rpx;
|
||||
margin-right: 12rpx;
|
||||
border-radius: 8rpx;
|
||||
transition: background-color 0.2s ease;
|
||||
}
|
||||
|
||||
.id-value-wrapper:active {
|
||||
background-color: rgba(255, 255, 255, 0.1);
|
||||
}
|
||||
|
||||
.id-value {
|
||||
font-size: 28rpx;
|
||||
color: #ffffff;
|
||||
font-weight: 400;
|
||||
font-family: 'SF Mono', 'Monaco', 'Consolas', monospace;
|
||||
}
|
||||
|
||||
.verify-btn {
|
||||
color: white;
|
||||
font-size: 24rpx;
|
||||
font-weight: 400;
|
||||
padding: 6rpx 20rpx;
|
||||
margin-left: 16rpx;
|
||||
display: flex;
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
gap: 12rpx;
|
||||
line-height: 1;
|
||||
}
|
||||
|
||||
.verified-tag {
|
||||
color: #fa6294;
|
||||
font-size: 28rpx;
|
||||
font-weight: 400;
|
||||
padding: 6rpx 20rpx;
|
||||
border-radius: 24rpx;
|
||||
margin-left: 16rpx;
|
||||
border: 1rpx solid #50a853;
|
||||
display: flex;
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
gap: 12rpx;
|
||||
line-height: 1;
|
||||
}
|
||||
|
||||
.verify-text,
|
||||
.verified-text {
|
||||
font-size: 24rpx;
|
||||
color: inherit;
|
||||
}
|
||||
|
||||
/* profile-bottom 样式(仿照 profile.wxml) */
|
||||
.profile-bottom {
|
||||
background: linear-gradient(123deg, #8361FB 15.54%, #70AAFC 39.58%, #F0F8FB 62.43%, #F07BFF 90.28%);
|
||||
border-radius: 28rpx;
|
||||
gap: 32rpx;
|
||||
position: relative;
|
||||
z-index: 0;
|
||||
margin-top: -60rpx;
|
||||
}
|
||||
|
||||
.action-buttons {
|
||||
display: flex;
|
||||
width: fit-content;
|
||||
margin-left: auto;
|
||||
justify-content: flex-end;
|
||||
gap: 4rpx;
|
||||
padding-top: 20rpx;
|
||||
padding-right: 20rpx;
|
||||
}
|
||||
|
||||
.qr-code-btn {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
gap: 12rpx;
|
||||
transition: all 0.2s ease;
|
||||
}
|
||||
|
||||
.qr-code-icon {
|
||||
width: 40rpx;
|
||||
height: 40rpx;
|
||||
}
|
||||
|
||||
.edit-btn {
|
||||
background: linear-gradient(124deg, #FF6460 1.58%, #EC42C8 34.28%, #435CFF 54%, #00D5FF 84.05%);
|
||||
border-radius: 30rpx;
|
||||
padding: 0 20rpx;
|
||||
display: flex;
|
||||
align-items: center;
|
||||
margin-left: 20rpx;
|
||||
transition: all 0.2s ease;
|
||||
height: 40rpx;
|
||||
}
|
||||
|
||||
.edit-icon {
|
||||
width: 32rpx;
|
||||
height: 32rpx;
|
||||
margin-right: 12rpx;
|
||||
}
|
||||
|
||||
.edit-text {
|
||||
font-size: 24rpx;
|
||||
font-weight: 400;
|
||||
color: black;
|
||||
}
|
||||
|
||||
.setting-btn {
|
||||
padding: 0 20rpx;
|
||||
display: flex;
|
||||
align-items: center;
|
||||
transition: all 0.2s ease;
|
||||
margin-left: 20rpx;
|
||||
}
|
||||
|
||||
.setting-icon {
|
||||
width: 40rpx;
|
||||
height: 40rpx;
|
||||
}
|
||||
|
||||
.profile-location {
|
||||
background: rgba(43, 43, 43, 1);
|
||||
max-width: 80%;
|
||||
width: fit-content;
|
||||
display: flex;
|
||||
align-items: center;
|
||||
background-color: #36393e;
|
||||
border-radius: 24rpx;
|
||||
min-height: 48rpx;
|
||||
padding: 0 20rpx;
|
||||
margin-left: 32rpx;
|
||||
margin-top: -10rpx;
|
||||
overflow-x: auto;
|
||||
overflow-y: hidden;
|
||||
}
|
||||
|
||||
.location-icon {
|
||||
width: 24rpx;
|
||||
height: 24rpx;
|
||||
margin-right: 12rpx;
|
||||
}
|
||||
|
||||
.location-text-qr {
|
||||
color: #ffffff;
|
||||
font-size: 24rpx;
|
||||
white-space: nowrap;
|
||||
margin-right: 20rpx;
|
||||
overflow: hidden;
|
||||
text-overflow: ellipsis;
|
||||
max-width: 100%;
|
||||
}
|
||||
|
||||
.location-arrow {
|
||||
font-size: 36rpx;
|
||||
color: #ffffff;
|
||||
margin-left: auto;
|
||||
font-weight: 300;
|
||||
}
|
||||
|
||||
.profile-signature {
|
||||
height: 240rpx;
|
||||
max-height: 240rpx;
|
||||
display: flex;
|
||||
align-items: flex-start;
|
||||
padding: 24rpx;
|
||||
background: rgba(90, 90, 90, 0.548);
|
||||
border-radius: 24rpx;
|
||||
backdrop-filter: blur(20rpx);
|
||||
-webkit-backdrop-filter: blur(20rpx);
|
||||
border: 1rpx solid rgba(255, 255, 255, 0.2);
|
||||
box-shadow: 0 8rpx 12rpx rgba(0, 0, 0, 0.1), inset 0 0 20rpx rgba(255, 255, 255, 0.1);
|
||||
overflow-y: auto;
|
||||
overflow-x: hidden;
|
||||
margin: 22rpx 32rpx;
|
||||
}
|
||||
|
||||
.signature-text {
|
||||
font-size: 30rpx;
|
||||
color: #000000;
|
||||
margin: auto;
|
||||
font-weight: 400;
|
||||
word-wrap: break-word;
|
||||
word-break: break-all;
|
||||
white-space: pre-wrap;
|
||||
width: 100%;
|
||||
}
|
||||
|
||||
.profile-tabs {
|
||||
width: 100%;
|
||||
margin-bottom: 1rem;
|
||||
padding: 0 40rpx;
|
||||
}
|
||||
|
||||
.tab-scroll {
|
||||
display: flex;
|
||||
flex-direction: row;
|
||||
white-space: nowrap;
|
||||
}
|
||||
|
||||
.tab-item {
|
||||
margin-top: .5rem;
|
||||
font-size: 24rpx;
|
||||
line-height: 36rpx;
|
||||
height: 36rpx;
|
||||
display: flex;
|
||||
align-items: center;
|
||||
color: white;
|
||||
padding: 0 20rpx;
|
||||
border-radius: 20rpx;
|
||||
background: rgba(90, 90, 90, 0.548);
|
||||
transition: all 0.2s;
|
||||
margin-left: .3rem;
|
||||
margin-right: .3rem;
|
||||
}
|
||||
|
||||
/* 详细信息上方操作按钮 */
|
||||
.detail-action-buttons {
|
||||
display: flex;
|
||||
flex-direction: row;
|
||||
justify-content: space-between;
|
||||
align-items: center;
|
||||
margin: 32rpx 0;
|
||||
padding: 0 30rpx;
|
||||
gap: 30rpx;
|
||||
}
|
||||
|
||||
.detail-action-btn-wrapper {
|
||||
flex: 1;
|
||||
height: 64rpx;
|
||||
border-radius: 32rpx;
|
||||
padding: 2rpx;
|
||||
background: linear-gradient(180deg, #4e4e4e 0%, #404040 100%);
|
||||
}
|
||||
|
||||
.detail-action-btn {
|
||||
width: 100%;
|
||||
height: 100%;
|
||||
display: flex;
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
border-radius: 30rpx;
|
||||
background: linear-gradient(180deg, #000 0%, #232323 100%);
|
||||
}
|
||||
|
||||
.detail-action-btn text {
|
||||
font-size: 28rpx;
|
||||
color: #ffffff;
|
||||
font-weight: 400;
|
||||
}
|
||||
|
||||
/* ================== 暗色主题覆盖(社交-好友详情) ================== */
|
||||
/* 说明:仅在已将页面背景设为深色后,统一卡片/文字暗化;若未来引入全局切换可抽离为公共 .theme-dark */
|
||||
.friend-detail-container .detail-section {
|
||||
background-color: #1e1e1e;
|
||||
border: 1px solid #2a2a2a;
|
||||
box-shadow: 0 2px 8px rgba(0,0,0,0.6);
|
||||
}
|
||||
|
||||
/* 渐变背景已改成深色,如需更低明度可再调:#1a1a1a → #121212 */
|
||||
|
||||
/* 次级浅色按钮背景 */
|
||||
.friend-detail-container .action-btn.secondary {
|
||||
background: #2a2a2a;
|
||||
}
|
||||
.friend-detail-container .action-btn.secondary .btn-text { color: #e0e0e0; }
|
||||
|
||||
/* 信息分区的分隔线颜色调整 */
|
||||
.friend-detail-container .info-item,
|
||||
.friend-detail-container .setting-item {
|
||||
border-bottom: 1px solid #2a2a2a;
|
||||
}
|
||||
.friend-detail-container .info-item:last-child,
|
||||
.friend-detail-container .setting-item:last-child { border-bottom: none; }
|
||||
|
||||
/* 文字颜色层级:主文案 #f5f5f5;次级 #b0b0b0;弱化 #777 → #6b6b6b */
|
||||
.friend-detail-container .friend-name,
|
||||
.friend-detail-container .section-title,
|
||||
.friend-detail-container .item-value,
|
||||
.friend-detail-container .location-address,
|
||||
.friend-detail-container .setting-label,
|
||||
.friend-detail-container .danger-text { color: #ffffff; }
|
||||
|
||||
.friend-detail-container .friend-bio,
|
||||
.friend-detail-container .item-label,
|
||||
.friend-detail-container .friendship-text,
|
||||
.friend-detail-container .friendship-days,
|
||||
.friend-detail-container .friend-id,
|
||||
.friend-detail-container .location-time { color: #b0b0b0; }
|
||||
|
||||
|
||||
/* 危险区背景保持融合 */
|
||||
.friend-detail-container .detail-section.danger-section {
|
||||
background-color: #5c8bff;
|
||||
border-radius: 44rpx;
|
||||
height: 88rpx;
|
||||
border: none;
|
||||
box-shadow: none;
|
||||
}
|
||||
|
||||
/* 占位/淡色背景统一 */
|
||||
.friend-detail-container .avatar-placeholder { background: #fff; }
|
||||
|
||||
/* 提示、加载文字 */
|
||||
.friend-detail-container .loading-text { color: #888; }
|
||||
Loading…
Add table
Add a link
Reference in a new issue