diff --git a/im-platform/src/main/java/com/bx/implatform/controller/GroupController.java b/im-platform/src/main/java/com/bx/implatform/controller/GroupController.java index 98d3dc8..a3c84c5 100644 --- a/im-platform/src/main/java/com/bx/implatform/controller/GroupController.java +++ b/im-platform/src/main/java/com/bx/implatform/controller/GroupController.java @@ -1,10 +1,11 @@ package com.bx.implatform.controller; import com.bx.implatform.annotation.RepeatSubmit; +import com.bx.implatform.dto.GroupMemberRemoveDTO; import com.bx.implatform.result.Result; import com.bx.implatform.result.ResultUtils; import com.bx.implatform.service.GroupService; -import com.bx.implatform.vo.GroupInviteVO; +import com.bx.implatform.dto.GroupInviteDTO; import com.bx.implatform.vo.GroupMemberVO; import com.bx.implatform.vo.GroupVO; import io.swagger.v3.oas.annotations.Operation; @@ -62,8 +63,8 @@ public class GroupController { @RepeatSubmit @Operation(summary = "邀请进群", description = "邀请好友进群") @PostMapping("/invite") - public Result invite(@Valid @RequestBody GroupInviteVO vo) { - groupService.invite(vo); + public Result invite(@Valid @RequestBody GroupInviteDTO dto) { + groupService.invite(dto); return ResultUtils.success(); } @@ -74,6 +75,15 @@ public class GroupController { return ResultUtils.success(groupService.findGroupMembers(groupId)); } + @RepeatSubmit + @Operation(summary = "将成员移出群聊", description = "将成员移出群聊") + @DeleteMapping("/members/remove") + public Result removeMembers(@Valid @RequestBody GroupMemberRemoveDTO dto) { + groupService.removeGroupMembers(dto); + return ResultUtils.success(); + } + + @RepeatSubmit @Operation(summary = "退出群聊", description = "退出群聊") @DeleteMapping("/quit/{groupId}") @@ -83,7 +93,7 @@ public class GroupController { } @RepeatSubmit - @Operation(summary = "踢出群聊", description = "将用户踢出群聊") + @Operation(summary = "踢出群聊(已废弃)", description = "将用户踢出群聊") @DeleteMapping("/kick/{groupId}") public Result kickGroup(@NotNull(message = "群聊id不能为空") @PathVariable Long groupId, @NotNull(message = "用户id不能为空") @RequestParam Long userId) { diff --git a/im-platform/src/main/java/com/bx/implatform/vo/GroupInviteVO.java b/im-platform/src/main/java/com/bx/implatform/dto/GroupInviteDTO.java similarity index 82% rename from im-platform/src/main/java/com/bx/implatform/vo/GroupInviteVO.java rename to im-platform/src/main/java/com/bx/implatform/dto/GroupInviteDTO.java index b78f43f..efeb5fb 100644 --- a/im-platform/src/main/java/com/bx/implatform/vo/GroupInviteVO.java +++ b/im-platform/src/main/java/com/bx/implatform/dto/GroupInviteDTO.java @@ -1,4 +1,4 @@ -package com.bx.implatform.vo; +package com.bx.implatform.dto; import io.swagger.v3.oas.annotations.media.Schema; import jakarta.validation.constraints.NotEmpty; @@ -9,8 +9,8 @@ import lombok.Data; import java.util.List; @Data -@Schema(description = "邀请好友进群请求VO") -public class GroupInviteVO { +@Schema(description = "邀请好友进群请求DTO") +public class GroupInviteDTO { @NotNull(message = "群id不可为空") @Schema(description = "群id") diff --git a/im-platform/src/main/java/com/bx/implatform/dto/GroupMemberRemoveDTO.java b/im-platform/src/main/java/com/bx/implatform/dto/GroupMemberRemoveDTO.java new file mode 100644 index 0000000..5d98e71 --- /dev/null +++ b/im-platform/src/main/java/com/bx/implatform/dto/GroupMemberRemoveDTO.java @@ -0,0 +1,28 @@ +package com.bx.implatform.dto; + +import io.swagger.v3.oas.annotations.media.Schema; +import jakarta.validation.constraints.NotEmpty; +import jakarta.validation.constraints.NotNull; +import jakarta.validation.constraints.Size; +import lombok.Data; + +import java.util.List; + +/** + * @author Blue + * @version 1.0 + * @date 2025-02-23 + */ +@Data +@Schema(description = "移除群聊成员") +public class GroupMemberRemoveDTO { + + @NotNull(message = "群id不可为空") + @Schema(description = "群组id") + private Long groupId; + + @Size(max = 50, message = "一次最多只能选择50位用户") + @NotEmpty(message = "成员用户id不可为空") + @Schema(description = "成员用户id") + private List userIds; +} diff --git a/im-platform/src/main/java/com/bx/implatform/service/GroupMemberService.java b/im-platform/src/main/java/com/bx/implatform/service/GroupMemberService.java index 87ced17..dd0ae42 100644 --- a/im-platform/src/main/java/com/bx/implatform/service/GroupMemberService.java +++ b/im-platform/src/main/java/com/bx/implatform/service/GroupMemberService.java @@ -16,6 +16,7 @@ public interface GroupMemberService extends IService { */ GroupMember findByGroupAndUserId(Long groupId, Long userId); + /** * 根据用户id查询群聊成员 * @@ -74,6 +75,14 @@ public interface GroupMemberService extends IService { */ void removeByGroupAndUserId(Long groupId, Long userId); + /** + * 根据群聊id和用户id移除成员 + * + * @param groupId 群聊id + * @param userIds 用户id + */ + void removeByGroupAndUserIds(Long groupId, List userIds); + /** * 用户用户是否在群中 * diff --git a/im-platform/src/main/java/com/bx/implatform/service/GroupService.java b/im-platform/src/main/java/com/bx/implatform/service/GroupService.java index fe2f6fa..3e0bead 100644 --- a/im-platform/src/main/java/com/bx/implatform/service/GroupService.java +++ b/im-platform/src/main/java/com/bx/implatform/service/GroupService.java @@ -1,8 +1,9 @@ package com.bx.implatform.service; import com.baomidou.mybatisplus.extension.service.IService; +import com.bx.implatform.dto.GroupMemberRemoveDTO; import com.bx.implatform.entity.Group; -import com.bx.implatform.vo.GroupInviteVO; +import com.bx.implatform.dto.GroupInviteDTO; import com.bx.implatform.vo.GroupMemberVO; import com.bx.implatform.vo.GroupVO; @@ -48,6 +49,12 @@ public interface GroupService extends IService { */ void kickGroup(Long groupId, Long userId); + /** + * 将用户移出群聊 + * @param dto dto + */ + void removeGroupMembers(GroupMemberRemoveDTO dto); + /** * 查询当前用户的所有群聊 * @@ -58,9 +65,9 @@ public interface GroupService extends IService { /** * 邀请好友进群 * - * @param vo 群id、好友id列表 + * @param dto 群id、好友id列表 **/ - void invite(GroupInviteVO vo); + void invite(GroupInviteDTO dto); /** * 根据id查找群聊,并进行缓存 diff --git a/im-platform/src/main/java/com/bx/implatform/service/impl/GroupMemberServiceImpl.java b/im-platform/src/main/java/com/bx/implatform/service/impl/GroupMemberServiceImpl.java index caf4b37..7f6d5f6 100644 --- a/im-platform/src/main/java/com/bx/implatform/service/impl/GroupMemberServiceImpl.java +++ b/im-platform/src/main/java/com/bx/implatform/service/impl/GroupMemberServiceImpl.java @@ -37,11 +37,13 @@ public class GroupMemberServiceImpl extends ServiceImpl wrapper = new QueryWrapper<>(); - wrapper.lambda().eq(GroupMember::getGroupId, groupId).eq(GroupMember::getUserId, userId); + LambdaQueryWrapper wrapper = Wrappers.lambdaQuery(); + wrapper.eq(GroupMember::getGroupId, groupId); + wrapper.eq(GroupMember::getUserId, userId); return this.getOne(wrapper); } + @Override public List findByUserId(Long userId) { LambdaQueryWrapper memberWrapper = Wrappers.lambdaQuery(); @@ -88,19 +90,35 @@ public class GroupMemberServiceImpl extends ServiceImpl wrapper = Wrappers.lambdaUpdate(); - wrapper.eq(GroupMember::getGroupId, groupId).eq(GroupMember::getUserId, userId).set(GroupMember::getQuit, true) - .set(GroupMember::getQuitTime, new Date()); + wrapper.eq(GroupMember::getGroupId, groupId); + wrapper.eq(GroupMember::getUserId, userId); + wrapper.set(GroupMember::getQuit, true); + wrapper.set(GroupMember::getQuitTime, new Date()); this.update(wrapper); } + @CacheEvict(key = "#groupId") + @Override + public void removeByGroupAndUserIds(Long groupId, List userId) { + LambdaUpdateWrapper wrapper = Wrappers.lambdaUpdate(); + wrapper.eq(GroupMember::getGroupId, groupId); + wrapper.in(GroupMember::getUserId, userId); + wrapper.set(GroupMember::getQuit, true); + wrapper.set(GroupMember::getQuitTime, new Date()); + this.update(wrapper); + } + + @Override public Boolean isInGroup(Long groupId, List userIds) { if (CollectionUtils.isEmpty(userIds)) { return true; } LambdaQueryWrapper wrapper = Wrappers.lambdaQuery(); - wrapper.eq(GroupMember::getGroupId, groupId).eq(GroupMember::getQuit, false) - .in(GroupMember::getUserId, userIds); + wrapper.eq(GroupMember::getGroupId, groupId); + wrapper.eq(GroupMember::getQuit, false); + wrapper.in(GroupMember::getUserId, userIds); return userIds.size() == this.count(wrapper); } + } diff --git a/im-platform/src/main/java/com/bx/implatform/service/impl/GroupServiceImpl.java b/im-platform/src/main/java/com/bx/implatform/service/impl/GroupServiceImpl.java index 809b9ac..fd243c2 100644 --- a/im-platform/src/main/java/com/bx/implatform/service/impl/GroupServiceImpl.java +++ b/im-platform/src/main/java/com/bx/implatform/service/impl/GroupServiceImpl.java @@ -12,6 +12,7 @@ import com.bx.imcommon.model.IMUserInfo; import com.bx.imcommon.util.CommaTextUtils; import com.bx.implatform.contant.Constant; import com.bx.implatform.contant.RedisKey; +import com.bx.implatform.dto.GroupMemberRemoveDTO; import com.bx.implatform.entity.*; import com.bx.implatform.enums.MessageStatus; import com.bx.implatform.enums.MessageType; @@ -25,7 +26,7 @@ import com.bx.implatform.service.UserService; import com.bx.implatform.session.SessionContext; import com.bx.implatform.session.UserSession; import com.bx.implatform.util.BeanUtils; -import com.bx.implatform.vo.GroupInviteVO; +import com.bx.implatform.dto.GroupInviteDTO; import com.bx.implatform.vo.GroupMemberVO; import com.bx.implatform.vo.GroupMessageVO; import com.bx.implatform.vo.GroupVO; @@ -126,7 +127,7 @@ public class GroupServiceImpl extends ServiceImpl implements String content = String.format("'%s'解散了群聊", session.getNickName()); this.sendTipMessage(groupId, userIds, content, true); // 推送同步消息 - this.sendDelGroupMessage(groupId, userIds, false); + this.sendDelGroupMessage(groupId, userIds); log.info("删除群聊,群聊id:{},群聊名称:{}", group.getId(), group.getName()); } @@ -145,7 +146,7 @@ public class GroupServiceImpl extends ServiceImpl implements // 推送退出群聊提示 this.sendTipMessage(groupId, List.of(userId), "您已退出群聊", false); // 推送同步消息 - this.sendDelGroupMessage(groupId, Lists.newArrayList(), true); + this.sendDelGroupMessage(groupId, List.of(userId)); log.info("退出群聊,群聊id:{},群聊名称:{},用户id:{}", group.getId(), group.getName(), userId); } @@ -167,10 +168,35 @@ public class GroupServiceImpl extends ServiceImpl implements // 推送踢出群聊提示 this.sendTipMessage(groupId, List.of(userId), "您已被移出群聊", false); // 推送同步消息 - this.sendDelGroupMessage(groupId, List.of(userId), false); + this.sendDelGroupMessage(groupId, List.of(userId)); log.info("踢出群聊,群聊id:{},群聊名称:{},用户id:{}", group.getId(), group.getName(), userId); } + @Override + public void removeGroupMembers(GroupMemberRemoveDTO dto) { + UserSession session = SessionContext.getSession(); + Group group = this.getAndCheckById(dto.getGroupId()); + if (!group.getOwnerId().equals(session.getUserId())) { + throw new GlobalException("您没有权限"); + } + if (dto.getUserIds().contains(group.getOwnerId())) { + throw new GlobalException("不允许移除群主"); + } + if (dto.getUserIds().contains(session.getUserId())) { + throw new GlobalException("不允许移除自己"); + } + // 删除群聊成员 + groupMemberService.removeByGroupAndUserIds(dto.getGroupId(), dto.getUserIds()); + // 清理已读缓存 + String key = StrUtil.join(":", RedisKey.IM_GROUP_READED_POSITION, dto.getGroupId()); + dto.getUserIds().forEach(id -> redisTemplate.opsForHash().delete(key, id.toString())); + // 推送踢出群聊提示 + this.sendTipMessage(dto.getGroupId(), dto.getUserIds(), "您已被移出群聊", false); + // 推送同步消息 + this.sendDelGroupMessage(dto.getGroupId(), dto.getUserIds()); + log.info("踢出群聊,群聊id:{},群聊名称:{},用户id:{}", group.getId(), group.getName(), dto.getUserIds()); + } + @Override public GroupVO findById(Long groupId) { UserSession session = SessionContext.getSession(); @@ -225,22 +251,22 @@ public class GroupServiceImpl extends ServiceImpl implements } @Override - public void invite(GroupInviteVO vo) { + public void invite(GroupInviteDTO dto) { UserSession session = SessionContext.getSession(); - Group group = this.getAndCheckById(vo.getGroupId()); - GroupMember member = groupMemberService.findByGroupAndUserId(vo.getGroupId(), session.getUserId()); + Group group = this.getAndCheckById(dto.getGroupId()); + GroupMember member = groupMemberService.findByGroupAndUserId(dto.getGroupId(), session.getUserId()); if (Objects.isNull(group) || member.getQuit()) { throw new GlobalException("您不在群聊中,邀请失败"); } // 群聊人数校验 - List members = groupMemberService.findByGroupId(vo.getGroupId()); + List members = groupMemberService.findByGroupId(dto.getGroupId()); long size = members.stream().filter(m -> !m.getQuit()).count(); - if (vo.getFriendIds().size() + size > Constant.MAX_LARGE_GROUP_MEMBER) { + if (dto.getFriendIds().size() + size > Constant.MAX_LARGE_GROUP_MEMBER) { throw new GlobalException("群聊人数不能大于" + Constant.MAX_LARGE_GROUP_MEMBER + "人"); } // 找出好友信息 - List friends = friendsService.findByFriendIds(vo.getFriendIds()); - if (vo.getFriendIds().size() != friends.size()) { + List friends = friendsService.findByFriendIds(dto.getFriendIds()); + if (dto.getFriendIds().size() != friends.size()) { throw new GlobalException("部分用户不是您的好友,邀请失败"); } // 批量保存成员数据 @@ -248,7 +274,7 @@ public class GroupServiceImpl extends ServiceImpl implements Optional optional = members.stream().filter(m -> m.getUserId().equals(f.getFriendId())).findFirst(); GroupMember groupMember = optional.orElseGet(GroupMember::new); - groupMember.setGroupId(vo.getGroupId()); + groupMember.setGroupId(dto.getGroupId()); groupMember.setUserId(f.getFriendId()); groupMember.setUserNickName(f.getFriendNickName()); groupMember.setHeadImage(f.getFriendHeadImage()); @@ -265,12 +291,12 @@ public class GroupServiceImpl extends ServiceImpl implements sendAddGroupMessage(groupVo, List.of(m.getUserId()), false); } // 推送进入群聊消息 - List userIds = groupMemberService.findUserIdsByGroupId(vo.getGroupId()); + List userIds = groupMemberService.findUserIdsByGroupId(dto.getGroupId()); String memberNames = groupMembers.stream().map(GroupMember::getShowNickName).collect(Collectors.joining(",")); String content = String.format("'%s'邀请'%s'加入了群聊", session.getNickName(), memberNames); - this.sendTipMessage(vo.getGroupId(), userIds, content, true); + this.sendTipMessage(dto.getGroupId(), userIds, content, true); log.info("邀请进入群聊,群聊id:{},群聊名称:{},被邀请用户id:{}", group.getId(), group.getName(), - vo.getFriendIds()); + dto.getFriendIds()); } @Override @@ -345,7 +371,7 @@ public class GroupServiceImpl extends ServiceImpl implements imClient.sendGroupMessage(sendMessage); } - private void sendDelGroupMessage(Long groupId, List recvIds, Boolean sendToSelf) { + private void sendDelGroupMessage(Long groupId, List recvIds) { UserSession session = SessionContext.getSession(); GroupMessageVO msgInfo = new GroupMessageVO(); msgInfo.setType(MessageType.GROUP_DEL.code()); @@ -357,7 +383,7 @@ public class GroupServiceImpl extends ServiceImpl implements sendMessage.setRecvIds(recvIds); sendMessage.setData(msgInfo); sendMessage.setSendResult(false); - sendMessage.setSendToSelf(sendToSelf); + sendMessage.setSendToSelf(false); imClient.sendGroupMessage(sendMessage); } } diff --git a/im-uniapp/App.vue b/im-uniapp/App.vue index c5dec44..9910879 100644 --- a/im-uniapp/App.vue +++ b/im-uniapp/App.vue @@ -407,7 +407,6 @@ export default { // #ifdef APP-PLUS // 关闭开机动画 setTimeout(() => { - console.log("plus.navigator.closeSplashscreen()") plus.navigator.closeSplashscreen() }, delay) // #endif diff --git a/im-uniapp/common/recorder-h5.js b/im-uniapp/common/recorder-h5.js index ddb4112..3855942 100644 --- a/im-uniapp/common/recorder-h5.js +++ b/im-uniapp/common/recorder-h5.js @@ -26,7 +26,6 @@ let checkIsEnable = () => { let start = () => { return navigator.mediaDevices.getUserMedia({ audio: true }).then(audioStream => { - console.log("start record") startTime = new Date().getTime(); chunks = []; stream = audioStream; @@ -36,7 +35,6 @@ let start = () => { } let close = () => { - console.log("stream:", stream) stream.getTracks().forEach((track) => { track.stop() }) @@ -47,9 +45,6 @@ let close = () => { let upload = () => { return new Promise((resolve, reject) => { rc.ondataavailable = (e) => { - console.log("ondataavailable:",e.data) - console.log("size:",e.data.size) - console.log("type:",e.data.type) chunks.push(e.data) } rc.onstop = () => { @@ -58,8 +53,6 @@ let upload = () => { return; } duration = (new Date().getTime() - startTime) / 1000; - console.log("时长:", duration) - console.log("上传,chunks:", chunks.length) const newbolb = new Blob(chunks, { 'type': 'audio/mpeg' }); const name = new Date().getDate() + '.mp3'; const file = new File([newbolb], name) diff --git a/im-uniapp/components/group-member-selector/group-member-selector.vue b/im-uniapp/components/group-member-selector/group-member-selector.vue index 273b3cc..018d4ee 100644 --- a/im-uniapp/components/group-member-selector/group-member-selector.vue +++ b/im-uniapp/components/group-member-selector/group-member-selector.vue @@ -42,12 +42,15 @@ export default { name: "chat-group-member-choose", props: { + group: { + type: Object + }, members: { type: Array }, maxSize: { type: Number, - default: -1 + default: 50 } }, data() { @@ -56,10 +59,11 @@ export default { }; }, methods: { - init(checkedIds, lockedIds) { + init(checkedIds, lockedIds, hideIds) { this.members.forEach((m) => { m.checked = checkedIds.indexOf(m.userId) >= 0; m.locked = lockedIds.indexOf(m.userId) >= 0; + m.hide = hideIds.indexOf(m.userId) >= 0; }); }, open() { @@ -80,7 +84,7 @@ export default { }, onClean() { this.members.forEach((m) => { - if (!m.locked) { + if (!m.locked && m.checked) { m.checked = false; } }) @@ -88,20 +92,17 @@ export default { onOk() { this.$refs.popup.close(); this.$emit("complete", this.checkedIds) - }, - isChecked(m) { - return this.checkedIds.indexOf(m.userId) >= 0; } }, computed: { checkedIds() { - return this.members.filter((m) => m.checked).map(m => m.userId) + return this.checkedMembers.map(m => m.userId) }, checkedMembers() { - return this.members.filter((m) => m.checked); + return this.members.filter((m) => !m.quit && !m.hide && m.checked); }, showMembers() { - return this.members.filter(m => !m.quit && m.showNickName.includes(this.searchText)) + return this.members.filter(m => !m.quit && !m.hide && m.showNickName.includes(this.searchText)) } } } @@ -115,7 +116,8 @@ export default { flex-direction: column; background-color: white; padding: 10rpx; - border-radius: 15rpx; + border-radius: 15rpx 15rpx 0 0; + overflow: hidden; .top-bar { display: flex; @@ -158,6 +160,8 @@ export default { white-space: nowrap; .member-name { + display: flex; + align-items: center; flex: 1; padding-left: 20rpx; font-size: 30rpx; @@ -165,11 +169,15 @@ export default { line-height: 60rpx; white-space: nowrap; overflow: hidden; + + .uni-tag { + margin-left: 5rpx; + } } } .scroll-bar { - height: 800rpx; + height: 65vh; } } } diff --git a/im-uniapp/components/image-upload/image-upload.vue b/im-uniapp/components/image-upload/image-upload.vue index 7346bf0..22ca4ef 100644 --- a/im-uniapp/components/image-upload/image-upload.vue +++ b/im-uniapp/components/image-upload/image-upload.vue @@ -54,7 +54,6 @@ export default { sizeType: ['original'], //original 原图,compressed 压缩图,默认二者都有 success: (res) => { res.tempFiles.forEach((file) => { - console.log("文件:", file) if (!this.onBefore || this.onBefore(file)) { // 调用上传图片的接口 this.uploadImage(file); diff --git a/im-uniapp/components/virtual-scroller/virtual-scroller.vue b/im-uniapp/components/virtual-scroller/virtual-scroller.vue index 049eb3f..ab99096 100644 --- a/im-uniapp/components/virtual-scroller/virtual-scroller.vue +++ b/im-uniapp/components/virtual-scroller/virtual-scroller.vue @@ -28,7 +28,6 @@ export default { }, methods: { onScrollToBottom(e) { - console.log("onScrollToBottom") if (this.showMaxIdx >= this.items.length) { this.showTip(); } else { diff --git a/im-uniapp/pages/chat/chat-box.vue b/im-uniapp/pages/chat/chat-box.vue index 3626bf7..2af4b66 100644 --- a/im-uniapp/pages/chat/chat-box.vue +++ b/im-uniapp/pages/chat/chat-box.vue @@ -733,7 +733,6 @@ export default { h -= 50; // 减去键盘高度 if (this.isShowKeyBoard || this.chatTabBox != 'none') { - console.log("减去键盘高度:", this.keyboardHeight) h -= this.keyboardHeight; this.scrollToBottom(); } @@ -742,7 +741,6 @@ export default { h -= uni.getSystemInfoSync().statusBarHeight; // #endif this.chatMainHeight = h; - console.log("窗口高度:", this.chatMainHeight) if (this.isShowKeyBoard || this.chatTabBox != 'none') { this.scrollToBottom(); } @@ -806,7 +804,6 @@ export default { this.reCalChatMainHeight(); }, resizeListener() { - console.log("resize") let keyboardHeight = this.initHeight - window.innerHeight; this.isShowKeyBoard = keyboardHeight > 150; if (this.isShowKeyBoard) { @@ -815,12 +812,10 @@ export default { this.reCalChatMainHeight(); }, focusInListener() { - console.log("focusInListener") this.isShowKeyBoard = true; this.reCalChatMainHeight(); }, focusOutListener() { - console.log("focusOutListener") this.isShowKeyBoard = false; this.reCalChatMainHeight(); }, diff --git a/im-uniapp/pages/chat/chat-group-video.vue b/im-uniapp/pages/chat/chat-group-video.vue index 7bb7314..434771f 100644 --- a/im-uniapp/pages/chat/chat-group-video.vue +++ b/im-uniapp/pages/chat/chat-group-video.vue @@ -76,7 +76,6 @@ export default { }, }, onBackPress() { - console.log("onBackPress") this.sendMessageToWebView("NAV_BACK", {}) }, onLoad(options) { diff --git a/im-uniapp/pages/group/group-info.vue b/im-uniapp/pages/group/group-info.vue index 961a787..6191a92 100644 --- a/im-uniapp/pages/group/group-info.vue +++ b/im-uniapp/pages/group/group-info.vue @@ -4,7 +4,7 @@ - + @@ -12,8 +12,17 @@ - - + + + + + 邀请 + + + + + + 移除 {{ `查看全部群成员${groupMembers.length}人` }}> @@ -41,15 +50,15 @@ - 修改群聊资料 > - + @@ -69,6 +78,29 @@ export default { url: `/pages/group/group-invite?id=${this.groupId}` }) }, + onRemoveMember() { + // 群主不显示 + let hideIds = [this.group.ownerId]; + this.$refs.removeSelector.init([], [], hideIds); + this.$refs.removeSelector.open(); + }, + onRemoveComplete(userIds) { + let data = { + groupId: this.group.id, + userIds: userIds + } + this.$http({ + url: "/group/members/remove", + method: 'DELETE', + data: data + }).then(() => { + this.loadGroupMembers(); + uni.showToast({ + title: `您移除了${userIds.length}位成员`, + icon: 'none' + }) + }) + }, onShowMoreMmeber() { uni.navigateTo({ url: `/pages/group/group-member?id=${this.groupId}` @@ -160,7 +192,6 @@ export default { }); }, loadGroupMembers() { - console.log("loadGroupMembers") this.$http({ url: `/group/members/${this.groupId}`, method: "GET" @@ -176,6 +207,9 @@ export default { }, isOwner() { return this.group.ownerId == this.userStore.userInfo.id; + }, + showMaxIdx() { + return this.isOwner ? 8 : 9; } }, onLoad(options) { @@ -218,17 +252,21 @@ export default { padding-top: 8rpx; font-size: $im-font-size-smaller; } - } - .invite-btn { - display: flex; - justify-content: center; - align-items: center; - width: 86rpx; - height: 86rpx; - margin: 10rpx; - border: $im-border solid 2rpx; - border-radius: 10%; + .tools-btn { + display: flex; + justify-content: center; + align-items: center; + border: $im-border solid 1rpx; + border-radius: 10%; + width: 80rpx; + height: 80rpx; + + .icon { + font-size: 40rpx !important; + color: $im-text-color-lighter !important; + } + } } } diff --git a/im-uniapp/pages/group/group-member.vue b/im-uniapp/pages/group/group-member.vue index 860ab5a..434f085 100644 --- a/im-uniapp/pages/group/group-member.vue +++ b/im-uniapp/pages/group/group-member.vue @@ -13,14 +13,9 @@ {{ item.showNickName }} - - + - - - @@ -44,27 +39,6 @@ export default { url: "/pages/common/user-info?id=" + userId }) }, - onKickOut(member) { - uni.showModal({ - title: '确认移出?', - content: `确定将成员'${member.showNickName}'移出群聊吗?`, - success: (res) => { - if (res.cancel) - return; - this.$http({ - url: `/group/kick/${this.group.id}?userId=${member.userId}`, - method: 'DELETE' - }).then(() => { - uni.showToast({ - title: `已将${member.showNickName}移出群聊`, - icon: 'none' - }) - member.quit = true; - this.isModify = true; - }); - } - }) - }, loadGroupInfo(id) { this.$http({ url: `/group/find/${id}`, @@ -141,12 +115,6 @@ export default { .uni-tag { margin-left: 5rpx; - width: 40rpx; - border: 0; - height: 30rpx; - line-height: 30rpx; - font-size: 20rpx; - text-align: center; } } } diff --git a/im-uniapp/pages/mine/mine.vue b/im-uniapp/pages/mine/mine.vue index 266e73a..ecc8654 100644 --- a/im-uniapp/pages/mine/mine.vue +++ b/im-uniapp/pages/mine/mine.vue @@ -56,7 +56,6 @@ export default { title: '确认退出?', success: (res) => { if (res.confirm) { - console.log(getApp()) getApp().$vm.exit() } } diff --git a/im-uniapp/pages/register/register.vue b/im-uniapp/pages/register/register.vue index a2cbe23..553c340 100644 --- a/im-uniapp/pages/register/register.vue +++ b/im-uniapp/pages/register/register.vue @@ -59,7 +59,6 @@ export default { errorMessage: '请输入确认密码', }, { validateFunction: (rule, value, data, callback) => { - console.log("validateFunction") if (data.password != value) { callback('两次密码输入不一致') } diff --git a/im-uniapp/static/icon/iconfont.css b/im-uniapp/static/icon/iconfont.css index 71a64f4..8cda2a4 100644 --- a/im-uniapp/static/icon/iconfont.css +++ b/im-uniapp/static/icon/iconfont.css @@ -1,6 +1,6 @@ @font-face { font-family: "iconfont"; /* Project id 4272106 */ - src: url('iconfont.ttf?t=1739084401359') format('truetype'); + src: url('iconfont.ttf?t=1746119818070') format('truetype'); } .iconfont { @@ -11,6 +11,46 @@ -moz-osx-font-smoothing: grayscale; } +.icon-remove:before { + content: "\e603"; +} + +.icon-doc:before { + content: "\e61c"; +} + +.icon-image:before { + content: "\e7f7"; +} + +.icon-top-message:before { + content: "\e6ff"; +} + +.icon-setting:before { + content: "\e851"; +} + +.icon-phone:before { + content: "\e692"; +} + +.icon-email:before { + content: "\e611"; +} + +.icon-username:before { + content: "\e60f"; +} + +.icon-chat-muted:before { + content: "\e634"; +} + +.icon-chat-unmuted:before { + content: "\ec44"; +} + .icon-privacy-protocol:before { content: "\e70a"; } diff --git a/im-uniapp/static/icon/iconfont.ttf b/im-uniapp/static/icon/iconfont.ttf index 5d29d8e..c2fee58 100644 Binary files a/im-uniapp/static/icon/iconfont.ttf and b/im-uniapp/static/icon/iconfont.ttf differ diff --git a/im-uniapp/store/userStore.js b/im-uniapp/store/userStore.js index 168fc1b..7543bd0 100644 --- a/im-uniapp/store/userStore.js +++ b/im-uniapp/store/userStore.js @@ -20,7 +20,6 @@ export default defineStore('userStore', { url: '/user/self', method: 'GET' }).then((userInfo) => { - console.log(userInfo) this.setUserInfo(userInfo); resolve(); }).catch((res) => { diff --git a/im-web/src/api/camera.js b/im-web/src/api/camera.js index dc75a78..6801381 100644 --- a/im-web/src/api/camera.js +++ b/im-web/src/api/camera.js @@ -21,7 +21,6 @@ ImCamera.prototype.openVideo = function () { noiseSuppression: true // 开启降噪 } } - console.log("getUserMedia") navigator.mediaDevices.getUserMedia(constraints).then((stream) => { console.log("摄像头打开") this.stream = stream; diff --git a/im-web/src/assets/iconfont/iconfont.css b/im-web/src/assets/iconfont/iconfont.css index 8c5b819..f435d95 100644 --- a/im-web/src/assets/iconfont/iconfont.css +++ b/im-web/src/assets/iconfont/iconfont.css @@ -1,6 +1,6 @@ @font-face { font-family: "iconfont"; /* Project id 3791506 */ - src: url('iconfont.ttf?t=1718373714629') format('truetype'); + src: url('iconfont.ttf?t=1745933248800') format('truetype'); } .iconfont { @@ -11,6 +11,42 @@ -moz-osx-font-smoothing: grayscale; } +.icon-man:before { + content: "\e615"; +} + +.icon-girl:before { + content: "\e602"; +} + +.icon-no-data:before { + content: "\e61b"; +} + +.icon-phone:before { + content: "\e692"; +} + +.icon-email:before { + content: "\e610"; +} + +.icon-username:before { + content: "\e60f"; +} + +.icon-chat-unmuted:before { + content: "\ec44"; +} + +.icon-chat-muted:before { + content: "\e634"; +} + +.icon-modify:before { + content: "\e60d"; +} + .icon-invite-rtc:before { content: "\e65f"; } diff --git a/im-web/src/assets/iconfont/iconfont.ttf b/im-web/src/assets/iconfont/iconfont.ttf index 1697727..e6c7a35 100644 Binary files a/im-web/src/assets/iconfont/iconfont.ttf and b/im-web/src/assets/iconfont/iconfont.ttf differ diff --git a/im-web/src/components/chat/ChatGroupSide.vue b/im-web/src/components/chat/ChatGroupSide.vue index 09a4594..0140128 100644 --- a/im-web/src/components/chat/ChatGroupSide.vue +++ b/im-web/src/components/chat/ChatGroupSide.vue @@ -5,66 +5,71 @@ -
- -
-
-
- -
-
邀请
- + +
+
+
+
-
- +
邀请
+ +
+
+
+
+
移除
+
- - - - - - - - - - - - - - - - - - -
- 保存 - 编辑 - 退出群聊 +
+
- -
- +
+ + + + + + + + + + + + + + + + + + +
+ 保存 + 编辑 + 退出群聊 +
+
diff --git a/im-web/src/components/group/GroupMember.vue b/im-web/src/components/group/GroupMember.vue index 5ce63f8..7d1dec9 100644 --- a/im-web/src/components/group/GroupMember.vue +++ b/im-web/src/components/group/GroupMember.vue @@ -2,7 +2,6 @@
-
{{ member.showNickName }}
@@ -20,16 +19,9 @@ export default { member: { type: Object, required: true - }, - showDel: { - type: Boolean, - default: false } }, methods: { - onDelete() { - this.$emit("del", this.member); - } } } diff --git a/im-web/src/components/group/GroupMemberSelector.vue b/im-web/src/components/group/GroupMemberSelector.vue index dc2f941..e3da675 100644 --- a/im-web/src/components/group/GroupMemberSelector.vue +++ b/im-web/src/components/group/GroupMemberSelector.vue @@ -1,5 +1,5 @@