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'
|
||||
});
|
||||
}
|
||||
});
|
||||
},
|
||||
});
|
||||
Loading…
Add table
Add a link
Reference in a new issue