Initial Commit
This commit is contained in:
commit
1d71a02738
237 changed files with 64293 additions and 0 deletions
433
pages/group/group-members/group-members.js
Normal file
433
pages/group/group-members/group-members.js
Normal file
|
|
@ -0,0 +1,433 @@
|
|||
// 👥 群成员管理页面逻辑
|
||||
const app = getApp();
|
||||
const groupChatManager = require('../../../utils/group-chat-manager.js');
|
||||
const apiClient = require('../../../utils/api-client.js');
|
||||
|
||||
Page({
|
||||
data: {
|
||||
// 系统信息
|
||||
statusBarHeight: 44,
|
||||
navBarHeight: 88,
|
||||
|
||||
// 群信息
|
||||
groupId: '',
|
||||
groupInfo: {},
|
||||
|
||||
// 成员数据
|
||||
allMembers: [],
|
||||
groupOwner: null,
|
||||
admins: [],
|
||||
members: [],
|
||||
|
||||
// 筛选后的数据
|
||||
filteredAdmins: [],
|
||||
filteredMembers: [],
|
||||
|
||||
// 统计数据
|
||||
memberCount: 0,
|
||||
adminCount: 0,
|
||||
normalMemberCount: 0,
|
||||
|
||||
// 用户权限
|
||||
currentUserId: '',
|
||||
userRole: 'member',
|
||||
isOwner: false,
|
||||
isOwnerOrAdmin: false,
|
||||
canInviteMembers: false,
|
||||
|
||||
// 搜索和筛选
|
||||
searchKeyword: '',
|
||||
currentFilter: 'all', // all, admin, member
|
||||
|
||||
// 成员操作
|
||||
showMemberActionModal: false,
|
||||
selectedMember: {},
|
||||
canRemoveMember: false,
|
||||
|
||||
// 加载状态
|
||||
loading: false,
|
||||
loadingText: '加载中...'
|
||||
},
|
||||
|
||||
onLoad(options) {
|
||||
console.log('👥 群成员管理页面加载:', options);
|
||||
|
||||
// 获取系统信息
|
||||
this.getSystemInfo();
|
||||
|
||||
// 获取群ID
|
||||
if (options.groupId) {
|
||||
this.setData({
|
||||
groupId: options.groupId
|
||||
});
|
||||
|
||||
// 加载群成员
|
||||
this.loadGroupMembers();
|
||||
} else {
|
||||
wx.showToast({
|
||||
title: '群聊ID不能为空',
|
||||
icon: 'none'
|
||||
});
|
||||
setTimeout(() => {
|
||||
wx.navigateBack();
|
||||
}, 1500);
|
||||
}
|
||||
},
|
||||
|
||||
onShow() {
|
||||
console.log('👥 群成员管理页面显示');
|
||||
|
||||
// 刷新成员列表
|
||||
if (this.data.groupId) {
|
||||
this.loadGroupMembers();
|
||||
}
|
||||
},
|
||||
|
||||
// 获取系统信息
|
||||
getSystemInfo() {
|
||||
const systemInfo = wx.getSystemInfoSync();
|
||||
this.setData({
|
||||
statusBarHeight: systemInfo.statusBarHeight || 44,
|
||||
navBarHeight: 88,
|
||||
currentUserId: wx.getStorageSync('userId')
|
||||
});
|
||||
},
|
||||
|
||||
// 加载群成员
|
||||
async loadGroupMembers() {
|
||||
try {
|
||||
this.setData({
|
||||
loading: true,
|
||||
loadingText: '加载成员列表中...'
|
||||
});
|
||||
|
||||
// 获取群基本信息
|
||||
const groupResponse = await apiClient.request({
|
||||
url: `/api/v1/groups/${this.data.groupId}`,
|
||||
method: 'GET'
|
||||
});
|
||||
|
||||
if (!groupResponse.success) {
|
||||
throw new Error(groupResponse.error || '获取群信息失败');
|
||||
}
|
||||
|
||||
// 获取群成员列表
|
||||
const membersResult = await groupChatManager.getGroupMembers(this.data.groupId, false);
|
||||
|
||||
if (!membersResult.success) {
|
||||
throw new Error(membersResult.error || '获取群成员失败');
|
||||
}
|
||||
|
||||
const allMembers = membersResult.data;
|
||||
|
||||
// 分类成员
|
||||
const groupOwner = allMembers.find(member => member.role === 'owner');
|
||||
const admins = allMembers.filter(member => member.role === 'admin');
|
||||
const members = allMembers.filter(member => member.role === 'member');
|
||||
|
||||
// 获取当前用户角色
|
||||
const currentUser = allMembers.find(member => member.userId === this.data.currentUserId);
|
||||
const userRole = currentUser ? currentUser.role : 'member';
|
||||
|
||||
// 计算权限
|
||||
const isOwner = userRole === 'owner';
|
||||
const isOwnerOrAdmin = userRole === 'owner' || userRole === 'admin';
|
||||
const canInviteMembers = isOwnerOrAdmin || groupResponse.data.settings?.allowMemberInvite;
|
||||
|
||||
this.setData({
|
||||
groupInfo: groupResponse.data,
|
||||
allMembers: allMembers,
|
||||
groupOwner: groupOwner,
|
||||
admins: admins,
|
||||
members: members,
|
||||
memberCount: allMembers.length,
|
||||
adminCount: admins.length + (groupOwner ? 1 : 0),
|
||||
normalMemberCount: members.length,
|
||||
userRole: userRole,
|
||||
isOwner: isOwner,
|
||||
isOwnerOrAdmin: isOwnerOrAdmin,
|
||||
canInviteMembers: canInviteMembers,
|
||||
loading: false
|
||||
});
|
||||
|
||||
// 应用当前筛选
|
||||
this.applyFilter();
|
||||
|
||||
console.log('✅ 群成员加载完成');
|
||||
|
||||
} catch (error) {
|
||||
this.setData({
|
||||
loading: false
|
||||
});
|
||||
|
||||
console.error('❌ 加载群成员失败:', error);
|
||||
wx.showToast({
|
||||
title: error.message || '加载群成员失败',
|
||||
icon: 'none'
|
||||
});
|
||||
}
|
||||
},
|
||||
|
||||
// 🔍 ===== 搜索和筛选 =====
|
||||
|
||||
// 搜索输入
|
||||
onSearchInput(e) {
|
||||
const keyword = e.detail.value;
|
||||
this.setData({
|
||||
searchKeyword: keyword
|
||||
});
|
||||
this.applyFilter();
|
||||
},
|
||||
|
||||
// 清除搜索
|
||||
clearSearch() {
|
||||
this.setData({
|
||||
searchKeyword: ''
|
||||
});
|
||||
this.applyFilter();
|
||||
},
|
||||
|
||||
// 切换筛选
|
||||
switchFilter(e) {
|
||||
const filter = e.currentTarget.dataset.filter;
|
||||
console.log('🔍 切换筛选:', filter);
|
||||
|
||||
this.setData({
|
||||
currentFilter: filter
|
||||
});
|
||||
this.applyFilter();
|
||||
},
|
||||
|
||||
// 应用筛选
|
||||
applyFilter() {
|
||||
const keyword = this.data.searchKeyword.toLowerCase();
|
||||
|
||||
// 筛选管理员
|
||||
let filteredAdmins = this.data.admins;
|
||||
if (keyword) {
|
||||
filteredAdmins = this.data.admins.filter(member => {
|
||||
const name = (member.nickname || member.username || '').toLowerCase();
|
||||
return name.includes(keyword);
|
||||
});
|
||||
}
|
||||
|
||||
// 筛选普通成员
|
||||
let filteredMembers = this.data.members;
|
||||
if (keyword) {
|
||||
filteredMembers = this.data.members.filter(member => {
|
||||
const name = (member.nickname || member.username || '').toLowerCase();
|
||||
return name.includes(keyword);
|
||||
});
|
||||
}
|
||||
|
||||
this.setData({
|
||||
filteredAdmins: filteredAdmins,
|
||||
filteredMembers: filteredMembers
|
||||
});
|
||||
},
|
||||
|
||||
// 👤 ===== 成员操作 =====
|
||||
|
||||
// 邀请成员
|
||||
inviteMembers() {
|
||||
if (!this.data.canInviteMembers) {
|
||||
wx.showToast({
|
||||
title: '没有邀请权限',
|
||||
icon: 'none'
|
||||
});
|
||||
return;
|
||||
}
|
||||
|
||||
console.log('👤 邀请成员');
|
||||
|
||||
// 跳转到邀请成员页面
|
||||
wx.navigateTo({
|
||||
url: `/pages/group/invite-members/invite-members?groupId=${this.data.groupId}`
|
||||
});
|
||||
},
|
||||
|
||||
// 查看成员资料
|
||||
viewMemberProfile(e) {
|
||||
const userId = e.currentTarget.dataset.userId;
|
||||
console.log('👤 查看成员资料:', userId);
|
||||
|
||||
// 关闭操作弹窗
|
||||
this.closeMemberActionModal();
|
||||
|
||||
if (userId === this.data.currentUserId) {
|
||||
// 查看自己的资料
|
||||
wx.navigateTo({
|
||||
url: '/pages/profile/profile'
|
||||
});
|
||||
} else {
|
||||
// 查看其他成员资料
|
||||
wx.navigateTo({
|
||||
url: `/pages/social/user-profile/user-profile?userId=${userId}`
|
||||
});
|
||||
}
|
||||
},
|
||||
|
||||
// 显示成员操作菜单
|
||||
showMemberActions(e) {
|
||||
const member = e.currentTarget.dataset.member;
|
||||
|
||||
if (!member || member.userId === this.data.currentUserId) {
|
||||
return;
|
||||
}
|
||||
|
||||
console.log('👤 显示成员操作菜单:', member);
|
||||
|
||||
// 计算是否可以移除成员
|
||||
const canRemoveMember = this.data.isOwnerOrAdmin &&
|
||||
member.role !== 'owner' &&
|
||||
(this.data.isOwner || member.role !== 'admin');
|
||||
|
||||
this.setData({
|
||||
selectedMember: member,
|
||||
canRemoveMember: canRemoveMember,
|
||||
showMemberActionModal: true
|
||||
});
|
||||
},
|
||||
|
||||
// 关闭成员操作弹窗
|
||||
closeMemberActionModal() {
|
||||
this.setData({
|
||||
showMemberActionModal: false,
|
||||
selectedMember: {},
|
||||
canRemoveMember: false
|
||||
});
|
||||
},
|
||||
|
||||
// 发送消息给成员
|
||||
sendMessageToMember() {
|
||||
const member = this.data.selectedMember;
|
||||
console.log('💬 发送消息给成员:', member);
|
||||
|
||||
// 关闭弹窗
|
||||
this.closeMemberActionModal();
|
||||
|
||||
// 跳转到私聊页面
|
||||
wx.navigateTo({
|
||||
url: `/pages/message/chat/chat?chatType=0&targetId=${member.userId}&chatName=${encodeURIComponent(member.nickname || member.username)}`
|
||||
});
|
||||
},
|
||||
|
||||
// 切换成员管理员状态
|
||||
async toggleMemberAdmin() {
|
||||
const member = this.data.selectedMember;
|
||||
const isAdmin = member.role === 'admin';
|
||||
|
||||
console.log('👑 切换成员管理员状态:', member, !isAdmin);
|
||||
|
||||
try {
|
||||
this.setData({
|
||||
loading: true,
|
||||
loadingText: isAdmin ? '取消管理员中...' : '设置管理员中...'
|
||||
});
|
||||
|
||||
const result = await groupChatManager.setAdmin(this.data.groupId, member.userId, !isAdmin);
|
||||
|
||||
this.setData({
|
||||
loading: false
|
||||
});
|
||||
|
||||
if (result.success) {
|
||||
wx.showToast({
|
||||
title: isAdmin ? '已取消管理员' : '已设为管理员',
|
||||
icon: 'success'
|
||||
});
|
||||
|
||||
// 关闭弹窗
|
||||
this.closeMemberActionModal();
|
||||
|
||||
// 刷新成员列表
|
||||
this.loadGroupMembers();
|
||||
} else {
|
||||
throw new Error(result.error || '操作失败');
|
||||
}
|
||||
|
||||
} catch (error) {
|
||||
this.setData({
|
||||
loading: false
|
||||
});
|
||||
|
||||
console.error('❌ 切换管理员状态失败:', error);
|
||||
wx.showToast({
|
||||
title: error.message || '操作失败',
|
||||
icon: 'none'
|
||||
});
|
||||
}
|
||||
},
|
||||
|
||||
// 移出群聊
|
||||
removeMemberFromGroup() {
|
||||
const member = this.data.selectedMember;
|
||||
console.log('🚫 移出群聊:', member);
|
||||
|
||||
wx.showModal({
|
||||
title: '移出群聊',
|
||||
content: `确定要将"${member.nickname || member.username}"移出群聊吗?`,
|
||||
confirmText: '移出',
|
||||
confirmColor: '#FF3B30',
|
||||
success: (res) => {
|
||||
if (res.confirm) {
|
||||
this.performRemoveMember(member);
|
||||
}
|
||||
}
|
||||
});
|
||||
},
|
||||
|
||||
// 执行移出成员
|
||||
async performRemoveMember(member) {
|
||||
try {
|
||||
this.setData({
|
||||
loading: true,
|
||||
loadingText: '移出成员中...'
|
||||
});
|
||||
|
||||
const result = await groupChatManager.removeMember(this.data.groupId, member.userId);
|
||||
|
||||
this.setData({
|
||||
loading: false
|
||||
});
|
||||
|
||||
if (result.success) {
|
||||
wx.showToast({
|
||||
title: '成员已移出',
|
||||
icon: 'success'
|
||||
});
|
||||
|
||||
// 关闭弹窗
|
||||
this.closeMemberActionModal();
|
||||
|
||||
// 刷新成员列表
|
||||
this.loadGroupMembers();
|
||||
} else {
|
||||
throw new Error(result.error || '移出成员失败');
|
||||
}
|
||||
|
||||
} catch (error) {
|
||||
this.setData({
|
||||
loading: false
|
||||
});
|
||||
|
||||
console.error('❌ 移出成员失败:', error);
|
||||
wx.showToast({
|
||||
title: error.message || '移出成员失败',
|
||||
icon: 'none'
|
||||
});
|
||||
}
|
||||
},
|
||||
|
||||
// 阻止事件冒泡
|
||||
stopPropagation() {
|
||||
// 阻止点击事件冒泡
|
||||
},
|
||||
|
||||
// 🧭 ===== 页面导航 =====
|
||||
|
||||
// 返回上一页
|
||||
goBack() {
|
||||
wx.navigateBack();
|
||||
}
|
||||
});
|
||||
Loading…
Add table
Add a link
Reference in a new issue