Browse Source

!8 版本更新:v3.5.0

Merge pull request !8 from blue/v_3.0.0
master
blue 11 months ago
committed by Gitee
parent
commit
2e832bae14
No known key found for this signature in database GPG Key ID: 173E9B9CA92EEF8F
  1. 2
      README.md
  2. 9
      im-admin-ui/src/views/im/group/index.vue
  3. 12
      im-admin-ui/src/views/im/message/group/index.vue
  4. 12
      im-admin-ui/src/views/im/message/private/index.vue
  5. 9
      im-admin-ui/src/views/im/user/index.vue
  6. 20
      im-admin/pom.xml
  7. 2
      im-admin/ruoyi-common/ruoyi-common-mybatis/src/main/java/org/dromara/common/mybatis/config/MybatisPlusConfig.java
  8. 21
      im-admin/ruoyi-im/src/main/java/org/dromara/im/service/impl/ImPrivateMessageServiceImpl.java

2
README.md

@ -47,7 +47,7 @@ java -jar ./ruoyi-admin/target/im-admin.jar
npm install npm install
npm run dev npm run dev
``` ```
访问 http://localhost:3000 访问 http://localhost:3000, 默认管理员账号: admin/admin123
#### 界面截图: #### 界面截图:
![输入图片说明](%E6%88%AA%E5%9B%BE/1.jpg) ![输入图片说明](%E6%88%AA%E5%9B%BE/1.jpg)

9
im-admin-ui/src/views/im/group/index.vue

@ -32,7 +32,8 @@
<el-table-column label="群名" align="center" prop="name" /> <el-table-column label="群名" align="center" prop="name" />
<el-table-column label="群头像" align="center" prop="headImage" width="100"> <el-table-column label="群头像" align="center" prop="headImage" width="100">
<template #default="scope"> <template #default="scope">
<image-preview :src="scope.row.headImageThumb" :full-src="scope.row.headImage" :width="40" :height="40" /> <image-preview v-if="scope.row.headImageThumb" :src="scope.row.headImageThumb"
:full-src="scope.row.headImage" :width="40" :height="40" />
</template> </template>
</el-table-column> </el-table-column>
<el-table-column label="群主" align="center" prop="ownerUserName" /> <el-table-column label="群主" align="center" prop="ownerUserName" />
@ -56,8 +57,10 @@
<template #default="scope"> <template #default="scope">
<el-button link type="primary" v-hasPermi="['im:group:query']" <el-button link type="primary" v-hasPermi="['im:group:query']"
@click="handleDetail(scope.row)">详情</el-button> @click="handleDetail(scope.row)">详情</el-button>
<el-button v-if="scope.row.isBanned" link type="danger" v-hasPermi="['im:group:ban']" @click="handleUnban(scope.row)">解封</el-button> <el-button v-if="scope.row.isBanned" link type="danger" v-hasPermi="['im:group:ban']"
<el-button v-else link type="danger" v-hasPermi="['im:group:ban']" @click="handleBan(scope.row)">封禁</el-button> @click="handleUnban(scope.row)">解封</el-button>
<el-button v-else link type="danger" v-hasPermi="['im:group:ban']"
@click="handleBan(scope.row)">封禁</el-button>
<el-button link type="primary" @click="handleShowMember(scope.row.id)">查看成员</el-button> <el-button link type="primary" @click="handleShowMember(scope.row.id)">查看成员</el-button>
</template> </template>
</el-table-column> </el-table-column>

12
im-admin-ui/src/views/im/message/group/index.vue

@ -4,6 +4,12 @@
<div v-show="showSearch" class="mb-[10px]"> <div v-show="showSearch" class="mb-[10px]">
<el-card shadow="hover"> <el-card shadow="hover">
<el-form ref="queryFormRef" :model="queryParams" :inline="true"> <el-form ref="queryFormRef" :model="queryParams" :inline="true">
<el-form-item label="群聊" prop="groupId">
<im-group-select v-model="queryParams.groupId"></im-group-select>
</el-form-item>
<el-form-item label="发送用户" prop="sendId">
<im-user-select v-model="queryParams.sendId"></im-user-select>
</el-form-item>
<el-form-item label="发送时间" prop="createdTime"> <el-form-item label="发送时间" prop="createdTime">
<el-date-picker <el-date-picker
v-model="dateRange" v-model="dateRange"
@ -15,12 +21,6 @@
:default-time="[new Date(2000, 1, 1, 0, 0, 0), new Date(2000, 1, 1, 23, 59, 59)]" :default-time="[new Date(2000, 1, 1, 0, 0, 0), new Date(2000, 1, 1, 23, 59, 59)]"
></el-date-picker> ></el-date-picker>
</el-form-item> </el-form-item>
<el-form-item label="群聊" prop="groupId">
<im-group-select v-model="queryParams.groupId"></im-group-select>
</el-form-item>
<el-form-item label="发送用户" prop="sendId">
<im-user-select v-model="queryParams.sendId"></im-user-select>
</el-form-item>
<el-form-item label="内容" prop="content"> <el-form-item label="内容" prop="content">
<el-input v-model="queryParams.content"></el-input> <el-input v-model="queryParams.content"></el-input>
</el-form-item> </el-form-item>

12
im-admin-ui/src/views/im/message/private/index.vue

@ -4,6 +4,12 @@
<div v-show="showSearch" class="mb-[10px]"> <div v-show="showSearch" class="mb-[10px]">
<el-card shadow="hover"> <el-card shadow="hover">
<el-form ref="queryFormRef" :model="queryParams" :inline="true"> <el-form ref="queryFormRef" :model="queryParams" :inline="true">
<el-form-item label="用户1" prop="sendId">
<im-user-select v-model="queryParams.sendId"></im-user-select>
</el-form-item>
<el-form-item label="用户2" prop="recvId">
<im-user-select v-model="queryParams.recvId"></im-user-select>
</el-form-item>
<el-form-item label="发送时间" prop="createdTime"> <el-form-item label="发送时间" prop="createdTime">
<el-date-picker <el-date-picker
v-model="dateRange" v-model="dateRange"
@ -15,12 +21,6 @@
:default-time="[new Date(2000, 1, 1, 0, 0, 0), new Date(2000, 1, 1, 23, 59, 59)]" :default-time="[new Date(2000, 1, 1, 0, 0, 0), new Date(2000, 1, 1, 23, 59, 59)]"
></el-date-picker> ></el-date-picker>
</el-form-item> </el-form-item>
<el-form-item label="发送用户" prop="sendId">
<im-user-select v-model="queryParams.sendId"></im-user-select>
</el-form-item>
<el-form-item label="接收用户" prop="recvId">
<im-user-select v-model="queryParams.recvId"></im-user-select>
</el-form-item>
<el-form-item label="内容" prop="content"> <el-form-item label="内容" prop="content">
<el-input v-model="queryParams.content"></el-input> <el-input v-model="queryParams.content"></el-input>
</el-form-item> </el-form-item>

9
im-admin-ui/src/views/im/user/index.vue

@ -55,8 +55,10 @@
<template #default="scope"> <template #default="scope">
<el-button link type="primary" v-hasPermi="['im:user:query']" <el-button link type="primary" v-hasPermi="['im:user:query']"
@click="handleDetail(scope.row)">详情</el-button> @click="handleDetail(scope.row)">详情</el-button>
<el-button v-if="scope.row.isBanned" link type="danger" v-hasPermi="['im:user:ban']" @click="unbanHandle(scope.row)">解封</el-button> <el-button v-if="scope.row.isBanned" link type="danger" v-hasPermi="['im:user:ban']"
<el-button v-else link type="danger" v-hasPermi="['im:user:ban']" @click="banHandle(scope.row)">封禁</el-button> @click="unbanHandle(scope.row)">解封</el-button>
<el-button v-else link type="danger" v-hasPermi="['im:user:ban']"
@click="banHandle(scope.row)">封禁</el-button>
</template> </template>
</el-table-column> </el-table-column>
</el-table> </el-table>
@ -68,7 +70,8 @@
<el-dialog :title="dialog.title" v-model="dialog.visible" width="800px" append-to-body> <el-dialog :title="dialog.title" v-model="dialog.visible" width="800px" append-to-body>
<el-form ref="userFormRef" :model="form" :rules="rules" label-width="100px" disabled> <el-form ref="userFormRef" :model="form" :rules="rules" label-width="100px" disabled>
<el-form-item label="用户头像" prop="headImage"> <el-form-item label="用户头像" prop="headImage">
<image-preview :src="form.headImageThumb" :full-src="form.headImage" :width="100" :height="100" /> <image-preview v-if="scope.row.headImageThumb" :src="form.headImageThumb" :full-src="form.headImage"
:width="100" :height="100" />
</el-form-item> </el-form-item>
<el-form-item label="用户名" prop="userName"> <el-form-item label="用户名" prop="userName">
<el-input v-model="form.userName" placeholder="请输入用户名" /> <el-input v-model="form.userName" placeholder="请输入用户名" />

20
im-admin/pom.xml

@ -29,7 +29,6 @@
<redisson.version>3.37.0</redisson.version> <redisson.version>3.37.0</redisson.version>
<lock4j.version>2.2.7</lock4j.version> <lock4j.version>2.2.7</lock4j.version>
<dynamic-ds.version>4.3.1</dynamic-ds.version> <dynamic-ds.version>4.3.1</dynamic-ds.version>
<snailjob.version>1.1.2</snailjob.version>
<mapstruct-plus.version>1.4.5</mapstruct-plus.version> <mapstruct-plus.version>1.4.5</mapstruct-plus.version>
<mapstruct-plus.lombok.version>0.2.0</mapstruct-plus.lombok.version> <mapstruct-plus.lombok.version>0.2.0</mapstruct-plus.lombok.version>
<lombok.version>1.18.34</lombok.version> <lombok.version>1.18.34</lombok.version>
@ -53,13 +52,6 @@
</properties> </properties>
<profiles> <profiles>
<profile>
<id>local</id>
<properties>
<!-- 环境标识,需要与配置文件的名称相对应 -->
<profiles.active>local</profiles.active>
</properties>
</profile>
<profile> <profile>
<id>dev</id> <id>dev</id>
<properties> <properties>
@ -236,18 +228,6 @@
<version>${lock4j.version}</version> <version>${lock4j.version}</version>
</dependency> </dependency>
<!-- SnailJob Client -->
<dependency>
<groupId>com.aizuda</groupId>
<artifactId>snail-job-client-starter</artifactId>
<version>${snailjob.version}</version>
</dependency>
<dependency>
<groupId>com.aizuda</groupId>
<artifactId>snail-job-client-job-core</artifactId>
<version>${snailjob.version}</version>
</dependency>
<!-- 加密包引入 --> <!-- 加密包引入 -->
<dependency> <dependency>
<groupId>org.bouncycastle</groupId> <groupId>org.bouncycastle</groupId>

2
im-admin/ruoyi-common/ruoyi-common-mybatis/src/main/java/org/dromara/common/mybatis/config/MybatisPlusConfig.java

@ -25,7 +25,7 @@ import org.springframework.transaction.annotation.EnableTransactionManagement;
* @author Lion Li * @author Lion Li
*/ */
@EnableTransactionManagement(proxyTargetClass = true) @EnableTransactionManagement(proxyTargetClass = true)
@MapperScan("${mybatis-plus.mapperPackage}") @MapperScan("org.dromara.**.mapper")
@PropertySource(value = "classpath:common-mybatis.yml", factory = YmlPropertySourceFactory.class) @PropertySource(value = "classpath:common-mybatis.yml", factory = YmlPropertySourceFactory.class)
public class MybatisPlusConfig { public class MybatisPlusConfig {

21
im-admin/ruoyi-im/src/main/java/org/dromara/im/service/impl/ImPrivateMessageServiceImpl.java

@ -17,6 +17,7 @@ import org.dromara.im.service.IImPrivateMessageService;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import java.util.Map; import java.util.Map;
import java.util.Objects;
/** /**
* 私聊消息Service业务层处理 * 私聊消息Service业务层处理
@ -60,11 +61,23 @@ public class ImPrivateMessageServiceImpl implements IImPrivateMessageService {
private LambdaQueryWrapper<ImPrivateMessage> buildQueryWrapper(ImPrivateMessageBo bo) { private LambdaQueryWrapper<ImPrivateMessage> buildQueryWrapper(ImPrivateMessageBo bo) {
Map<String, Object> params = bo.getParams(); Map<String, Object> params = bo.getParams();
LambdaQueryWrapper<ImPrivateMessage> wrapper = Wrappers.lambdaQuery(); LambdaQueryWrapper<ImPrivateMessage> wrapper = Wrappers.lambdaQuery();
wrapper.eq(bo.getSendId() != null, ImPrivateMessage::getSendId, bo.getSendId()); if (!Objects.isNull(bo.getSendId()) && !Objects.isNull(bo.getRecvId())) {
wrapper.eq(bo.getRecvId() != null, ImPrivateMessage::getRecvId, bo.getRecvId()); // 指定了两个用户,返回这两个用户之间的聊天记录
wrapper.and(wrap -> wrap.and(wp -> wp.eq(ImPrivateMessage::getSendId, bo.getSendId())
.eq(ImPrivateMessage::getRecvId, bo.getRecvId()))
.or(wp -> wp.eq(ImPrivateMessage::getSendId, bo.getRecvId())
.eq(ImPrivateMessage::getRecvId, bo.getSendId())));
} else if (!Objects.isNull(bo.getSendId())) {
wrapper.and(wp -> wp.eq(ImPrivateMessage::getSendId, bo.getSendId()).or()
.eq(ImPrivateMessage::getRecvId, bo.getSendId()));
} else if (!Objects.isNull(bo.getRecvId())) {
wrapper.and(wp -> wp.eq(ImPrivateMessage::getSendId, bo.getRecvId()).or()
.eq(ImPrivateMessage::getRecvId, bo.getRecvId()));
}
wrapper.like(StringUtils.isNotBlank(bo.getContent()), ImPrivateMessage::getContent, bo.getContent()); wrapper.like(StringUtils.isNotBlank(bo.getContent()), ImPrivateMessage::getContent, bo.getContent());
wrapper.eq(bo.getType() != null, ImPrivateMessage::getType, bo.getType()); wrapper.eq(!Objects.isNull(bo.getType()), ImPrivateMessage::getType, bo.getType());
wrapper.eq(bo.getStatus() != null, ImPrivateMessage::getStatus, bo.getStatus()); wrapper.eq(!Objects.isNull(bo.getStatus()), ImPrivateMessage::getStatus, bo.getStatus());
wrapper.between(params.get("beginTime") != null && params.get("endTime") != null, ImPrivateMessage::getSendTime, wrapper.between(params.get("beginTime") != null && params.get("endTime") != null, ImPrivateMessage::getSendTime,
params.get("beginTime"), params.get("endTime")); params.get("beginTime"), params.get("endTime"));
wrapper.orderByDesc(ImPrivateMessage::getId); wrapper.orderByDesc(ImPrivateMessage::getId);

Loading…
Cancel
Save