Browse Source

!63 同步代码

Merge pull request !63 from blue/v_2.0.0
master
blue 2 years ago
committed by Gitee
parent
commit
7bdd4011e8
No known key found for this signature in database GPG Key ID: 173E9B9CA92EEF8F
  1. 7
      .gitignore
  2. 2
      README.md
  3. 7
      im-platform/src/main/java/com/bx/implatform/controller/GroupMessageController.java
  4. 7
      im-platform/src/main/java/com/bx/implatform/controller/PrivateMessageController.java
  5. 8
      im-platform/src/main/java/com/bx/implatform/service/IGroupMessageService.java
  6. 8
      im-platform/src/main/java/com/bx/implatform/service/IPrivateMessageService.java
  7. 53
      im-platform/src/main/java/com/bx/implatform/service/impl/GroupMessageServiceImpl.java
  8. 40
      im-platform/src/main/java/com/bx/implatform/service/impl/PrivateMessageServiceImpl.java
  9. 17
      im-uniapp/App.vue
  10. 118
      im-uniapp/components/user-search/user-search.vue
  11. 2
      im-uniapp/pages.json
  12. 6
      im-uniapp/pages/chat/chat-box.vue
  13. 6
      im-uniapp/pages/group/group.vue

7
.gitignore

@ -2,11 +2,14 @@
/box-im.iml
/im-server/im-server.iml
/im-platform/im-platform.iml
/im-client/im-client.iml
/im-platform/src/main/resources/application-prod.yml
/im-platform/src/main/resources/logback-prod.xml
/im-server/src/main/resources/application-prod.yml
/im-server/src/main/resources/logback-prod.xml
/im-commom/im-commom.iml
/im-uniapp/node_modules/
/im-ui/jsconfig.json
/package-lock.json
/im-ui/package-lock.json
/im-uniapp/unpackage/
/im-uniapp/hybrid/
/im-uniapp/package-lock.json

2
README.md

@ -41,8 +41,6 @@
![输入图片说明](%E6%88%AA%E5%9B%BE/wx%E5%B0%8F%E7%A8%8B%E5%BA%8F%E4%BA%8C%E7%BB%B4%E7%A0%81.jpg)
注:由于每次发布小程序都需要经过严格且繁琐的审核,当前线上微信小程序并非最新版本,最后一次更新时间是2023年12月
#### 相关项目

7
im-platform/src/main/java/com/bx/implatform/controller/GroupMessageController.java

@ -35,13 +35,6 @@ public class GroupMessageController {
return ResultUtils.success();
}
@GetMapping("/loadMessage")
@ApiOperation(value = "拉取消息(已废弃)", notes = "拉取消息,一次最多拉取100条")
public Result<List<GroupMessageVO>> loadMessage(@RequestParam Long minId) {
return ResultUtils.success(groupMessageService.loadMessage(minId));
}
@GetMapping("/pullOfflineMessage")
@ApiOperation(value = "拉取离线消息", notes = "拉取离线消息,消息将通过webscoket异步推送")
public Result pullOfflineMessage(@RequestParam Long minId) {

7
im-platform/src/main/java/com/bx/implatform/controller/PrivateMessageController.java

@ -36,13 +36,6 @@ public class PrivateMessageController {
return ResultUtils.success();
}
@GetMapping("/loadMessage")
@ApiOperation(value = "拉取消息(已废弃)", notes = "拉取消息,一次最多拉取100条")
public Result<List<PrivateMessageVO>> loadMessage(@RequestParam Long minId) {
return ResultUtils.success(privateMessageService.loadMessage(minId));
}
@GetMapping("/pullOfflineMessage")
@ApiOperation(value = "拉取离线消息", notes = "拉取离线消息,消息将通过webscoket异步推送")
public Result pullOfflineMessage(@RequestParam Long minId) {

8
im-platform/src/main/java/com/bx/implatform/service/IGroupMessageService.java

@ -24,14 +24,6 @@ public interface IGroupMessageService extends IService<GroupMessage> {
*/
void recallMessage(Long id);
/**
* 拉取消息只能拉取最近1个月的消息一次拉取100条
*
* @param minId 消息起始id
* @return 聊天消息列表
*/
List<GroupMessageVO> loadMessage(Long minId);
/**
* 拉取离线消息只能拉取最近1个月的消息最多拉取1000条
*

8
im-platform/src/main/java/com/bx/implatform/service/IPrivateMessageService.java

@ -36,14 +36,6 @@ public interface IPrivateMessageService extends IService<PrivateMessage> {
List<PrivateMessageVO> findHistoryMessage(Long friendId, Long page, Long size);
/**
* 拉取消息只能拉取最近1个月的消息一次拉取100条
*
* @param minId 消息起始id
* @return 聊天消息列表
*/
List<PrivateMessageVO> loadMessage(Long minId);
/**
* 拉取离线消息只能拉取最近1个月的消息最多拉取1000条
*

53
im-platform/src/main/java/com/bx/implatform/service/impl/GroupMessageServiceImpl.java

@ -147,59 +147,6 @@ public class GroupMessageServiceImpl extends ServiceImpl<GroupMessageMapper, Gro
}
@Override
public List<GroupMessageVO> loadMessage(Long minId) {
UserSession session = SessionContext.getSession();
List<GroupMember> members = groupMemberService.findByUserId(session.getUserId());
if (CollectionUtil.isEmpty(members)) {
return new ArrayList<>();
}
Map<Long, GroupMember> groupMemberMap = CollStreamUtil.toIdentityMap(members, GroupMember::getGroupId);
Set<Long> groupIds = groupMemberMap.keySet();
// 只能拉取最近1个月的
Date minDate = DateUtils.addMonths(new Date(), -1);
LambdaQueryWrapper<GroupMessage> wrapper = Wrappers.lambdaQuery();
wrapper.gt(GroupMessage::getId, minId).gt(GroupMessage::getSendTime, minDate).in(GroupMessage::getGroupId, groupIds)
.ne(GroupMessage::getStatus, MessageStatus.RECALL.code()).orderByAsc(GroupMessage::getId).last("limit 100");
List<GroupMessage> messages = this.list(wrapper);
// 转成vo
List<GroupMessageVO> vos = messages.stream()
.filter(m -> {
//排除加群之前的消息
GroupMember member = groupMemberMap.get(m.getGroupId());
return Objects.nonNull(member) && DateUtil.compare(member.getCreatedTime(), m.getSendTime()) <= 0;
})
.map(m -> {
GroupMessageVO vo = BeanUtils.copyProperties(m, GroupMessageVO.class);
// 被@用户列表
if (StringUtils.isNotBlank(m.getAtUserIds()) && Objects.nonNull(vo)) {
List<String> atIds = Splitter.on(",").trimResults().splitToList(m.getAtUserIds());
vo.setAtUserIds(atIds.stream().map(Long::parseLong).collect(Collectors.toList()));
}
return vo;
}).collect(Collectors.toList());
// 通过群聊对消息进行分组
Map<Long, List<GroupMessageVO>> messageGroupMap = vos.stream().collect(Collectors.groupingBy(GroupMessageVO::getGroupId));
messageGroupMap.forEach((groupId, messageVos) -> {
// 填充消息状态
String key = StrUtil.join(":", RedisKey.IM_GROUP_READED_POSITION, groupId);
Object o = redisTemplate.opsForHash().get(key, session.getUserId().toString());
long readedMaxId = Objects.isNull(o) ? -1 : Long.parseLong(o.toString());
messageVos.forEach(messageVo -> messageVo.setStatus(readedMaxId >= messageVo.getId() ? MessageStatus.READED.code() : MessageStatus.UNSEND.code()));
// 针对回执消息填充已读人数
List<GroupMessageVO> receiptMessageVos = messageVos.stream().filter(GroupMessageVO::getReceipt).collect(Collectors.toList());
if (!receiptMessageVos.isEmpty()) {
Map<Object, Object> maxIdMap = redisTemplate.opsForHash().entries(key);
receiptMessageVos.forEach(receiptMessageVo -> {
int count = getReadedUserIds(maxIdMap, receiptMessageVo.getId(),receiptMessageVo.getSendId()).size();
receiptMessageVo.setReadedCount(count);
});
}
});
return vos;
}
@Override
public void pullOfflineMessage(Long minId) {
UserSession session = SessionContext.getSession();

40
im-platform/src/main/java/com/bx/implatform/service/impl/PrivateMessageServiceImpl.java

@ -136,46 +136,6 @@ public class PrivateMessageServiceImpl extends ServiceImpl<PrivateMessageMapper,
return messageInfos;
}
@Override
public List<PrivateMessageVO> loadMessage(Long minId) {
UserSession session = SessionContext.getSession();
List<Friend> friends = friendService.findFriendByUserId(session.getUserId());
if (friends.isEmpty()) {
return new ArrayList<>();
}
List<Long> friendIds = friends.stream().map(Friend::getFriendId).collect(Collectors.toList());
// 获取当前用户的消息
LambdaQueryWrapper<PrivateMessage> queryWrapper = Wrappers.lambdaQuery();
// 只能拉取最近1个月的
Date minDate = DateUtils.addMonths(new Date(), -1);
queryWrapper.gt(PrivateMessage::getId, minId)
.ge(PrivateMessage::getSendTime, minDate)
.ne(PrivateMessage::getStatus, MessageStatus.RECALL.code())
.and(wrap -> wrap.and(
wp -> wp.eq(PrivateMessage::getSendId, session.getUserId())
.in(PrivateMessage::getRecvId, friendIds))
.or(wp -> wp.eq(PrivateMessage::getRecvId, session.getUserId())
.in(PrivateMessage::getSendId, friendIds)))
.orderByAsc(PrivateMessage::getId)
.last("limit 100");
List<PrivateMessage> messages = this.list(queryWrapper);
// 更新发送状态
List<Long> ids = messages.stream()
.filter(m -> !m.getSendId().equals(session.getUserId()) && m.getStatus().equals(MessageStatus.UNSEND.code()))
.map(PrivateMessage::getId)
.collect(Collectors.toList());
if (!ids.isEmpty()) {
LambdaUpdateWrapper<PrivateMessage> updateWrapper = Wrappers.lambdaUpdate();
updateWrapper.in(PrivateMessage::getId, ids)
.set(PrivateMessage::getStatus, MessageStatus.SENDED.code());
this.update(updateWrapper);
}
log.info("拉取消息,用户id:{},数量:{}", session.getUserId(), messages.size());
return messages.stream().map(m -> BeanUtils.copyProperties(m, PrivateMessageVO.class)).collect(Collectors.toList());
}
@Override
public void pullOfflineMessage(Long minId) {
UserSession session = SessionContext.getSession();

17
im-uniapp/App.vue

@ -15,6 +15,8 @@
init() {
//
store.dispatch("load").then(() => {
//
this.initAudit();
// websocket
this.initWebSocket();
}).catch((e) => {
@ -250,6 +252,21 @@
}
return loginInfo.expireTime < new Date().getTime();
},
initAudit() {
if (store.state.userStore.userInfo.type == 1) {
//
uni.setTabBarItem({
index: 2,
text: "群聊"
})
} else {
//
uni.setTabBarItem({
index: 2,
text: "搜索"
})
}
}
},
onLaunch() {
//

118
im-uniapp/components/user-search/user-search.vue

@ -0,0 +1,118 @@
<template>
<!-- for wx audit -->
<view class="page user-search">
<view class="search-bar">
<uni-search-bar v-model="searchText" :focus="true" @confirm="onSearch()" can
cancelButton="none" ceholder="用户名/昵称"></uni-search-bar>
</view>
<view class="user-items">
<scroll-view class="scroll-bar" scroll-with-animation="true" scroll-y="true">
<view v-for="(user) in users" :key="user.id" v-show="user.id != $store.state.userStore.userInfo.id">
<view class="user-item">
<head-image :id="user.id" :name="user.nickName"
:online="user.online" :url="user.headImage"
:size="100"></head-image>
<view class="user-name">{{ user.nickName}}</view>
<view class="user-btns">
<button type="primary" v-show="!isFriend(user.id)" size="mini"
@click.stop="onAddFriend(user)">加为好友</button>
<button type="default" v-show="isFriend(user.id)" size="mini" disabled>已添加</button>
</view>
</view>
</view>
</scroll-view>
</view>
</view>
</template>
<script>
export default {
data() {
return {
searchText: "",
users: []
}
},
methods: {
onSearch() {
this.$http({
url: "/user/findByName?name=" + this.searchText,
method: "GET"
}).then((data) => {
this.users = data;
})
},
onAddFriend(user) {
this.$http({
url: "/friend/add?friendId=" + user.id,
method: "POST"
}).then((data) => {
let friend = {
id: user.id,
nickName: user.nickName,
headImage: user.headImage,
online: user.online
}
this.$store.commit("addFriend", friend);
uni.showToast({
title: "添加成功,对方已成为您的好友",
icon: "none"
})
})
},
onShowUserInfo(user) {
uni.navigateTo({
url: "/pages/common/user-info?id=" + user.id
})
},
isFriend(userId) {
let friends = this.$store.state.friendStore.friends;
let friend = friends.find((f) => f.id == userId);
return friend&&!friend.delete;
}
}
}
</script>
<style scoped lang="scss">
.user-search {
position: relative;
border: #dddddd solid 1px;
display: flex;
flex-direction: column;
.search-bar {
background: white;
}
.user-items{
position: relative;
flex: 1;
overflow: hidden;
.user-item {
height: 120rpx;
display: flex;
margin-bottom: 1rpx;
position: relative;
padding: 0 30rpx ;
align-items: center;
background-color: white;
white-space: nowrap;
.user-name {
flex:1;
padding-left: 20rpx;
font-size: 30rpx;
font-weight: 600;
line-height: 60rpx;
white-space: nowrap;
overflow: hidden;
}
}
.scroll-bar {
height: 100%;
}
}
}
</style>

2
im-uniapp/pages.json

@ -61,7 +61,7 @@
"pagePath": "pages/group/group",
"iconPath": "static/tarbar/group.png",
"selectedIconPath": "static/tarbar/group_active.png",
"text": "群聊"
"text": "搜索"
},
{
"pagePath": "pages/mine/mine",

6
im-uniapp/pages/chat/chat-box.vue

@ -72,7 +72,7 @@
<view class="tool-name">文件</view>
</view>
<!-- #endif -->
<view class="chat-tools-item" @click="onVoiceInput()">
<view class="chat-tools-item" @click="onRecorderInput()">
<view class="tool-icon iconfont icon-microphone"></view>
<view class="tool-name">语音消息</view>
</view>
@ -542,8 +542,6 @@
},
readedMessage() {
if(this.unreadCount == 0){
console.log("0000000000")
return;
}
let url = ""
@ -675,8 +673,6 @@
this.$store.commit("activeChat", options.chatIdx);
//
this.isReceipt = false;
},
onShow() {
//
this.scrollToBottom();
},

6
im-uniapp/pages/group/group.vue

@ -1,5 +1,5 @@
<template>
<view class="tab-page group">
<view v-if="$store.state.userStore.userInfo.type == 1" class="tab-page group">
<view class="nav-bar">
<view class="nav-search">
<uni-search-bar @focus="onFocusSearch" cancelButton="none" placeholder="点击搜索群聊"></uni-search-bar>
@ -19,6 +19,10 @@
</scroll-view>
</view>
</view>
<!-- wx audit -->
<view v-else>
<user-search></user-search>
</view>
</template>
<script>

Loading…
Cancel
Save