From e2f3a5b3bb4599fffe007c5e6349ef4cece69006 Mon Sep 17 00:00:00 2001 From: La123123 <617330105@qq.com> Date: Tue, 31 Mar 2026 17:45:30 +0800 Subject: [PATCH] =?UTF-8?q?=E5=AE=A2=E6=9C=8D=E7=AE=A1=E7=90=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- im-admin-ui/vite.config.ts | 2 +- .../java/org/dromara/im/config/MvcConfig.java | 21 ++++ .../im/controller/ImUserController.java | 106 ++++++++++++++++++ .../java/org/dromara/im/domain/ImUser.java | 10 ++ .../org/dromara/im/domain/bo/ImUserBo.java | 5 + .../dromara/im/service/IImUserService.java | 33 ++++++ .../im/service/impl/ImUserServiceImpl.java | 33 ++++++ 7 files changed, 209 insertions(+), 1 deletion(-) create mode 100644 im-admin/ruoyi-im/src/main/java/org/dromara/im/config/MvcConfig.java diff --git a/im-admin-ui/vite.config.ts b/im-admin-ui/vite.config.ts index 8eeed26..4f5d57f 100644 --- a/im-admin-ui/vite.config.ts +++ b/im-admin-ui/vite.config.ts @@ -73,7 +73,7 @@ export default defineConfig(({ mode, command }: ConfigEnv): UserConfig => { ] }, build: { - chunkSizeWarningLimit: 2048, + chunkSizeWarningLimit: 2048 } }; }); diff --git a/im-admin/ruoyi-im/src/main/java/org/dromara/im/config/MvcConfig.java b/im-admin/ruoyi-im/src/main/java/org/dromara/im/config/MvcConfig.java new file mode 100644 index 0000000..ce5b77a --- /dev/null +++ b/im-admin/ruoyi-im/src/main/java/org/dromara/im/config/MvcConfig.java @@ -0,0 +1,21 @@ +package org.dromara.im.config; + + +import lombok.AllArgsConstructor; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder; +import org.springframework.security.crypto.password.PasswordEncoder; +import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; + +@Configuration +@AllArgsConstructor +public class MvcConfig implements WebMvcConfigurer { + + @Bean + public PasswordEncoder passwordEncoder() { + // 使用BCrypt加密密码 + return new BCryptPasswordEncoder(); + } + +} diff --git a/im-admin/ruoyi-im/src/main/java/org/dromara/im/controller/ImUserController.java b/im-admin/ruoyi-im/src/main/java/org/dromara/im/controller/ImUserController.java index cde45aa..571fca1 100644 --- a/im-admin/ruoyi-im/src/main/java/org/dromara/im/controller/ImUserController.java +++ b/im-admin/ruoyi-im/src/main/java/org/dromara/im/controller/ImUserController.java @@ -1,6 +1,7 @@ package org.dromara.im.controller; import cn.dev33.satoken.annotation.SaCheckPermission; +import cn.hutool.core.util.StrUtil; import io.swagger.v3.oas.annotations.Operation; import jakarta.servlet.http.HttpServletResponse; import jakarta.validation.Valid; @@ -13,18 +14,22 @@ import org.dromara.common.log.enums.BusinessType; import org.dromara.common.mybatis.core.page.PageQuery; import org.dromara.common.mybatis.core.page.TableDataInfo; import org.dromara.common.web.core.BaseController; +import org.dromara.im.domain.ImUser; +import org.dromara.im.domain.bo.ImSensitiveWordBo; import org.dromara.im.domain.bo.ImUserBo; import org.dromara.im.domain.dto.ImUserBanDto; import org.dromara.im.domain.dto.ImUserUnbanDto; import org.dromara.im.domain.vo.ImUserVo; import org.dromara.im.service.IImUserService; import org.dromara.im.util.CommaTextUtils; +import org.springframework.security.crypto.password.PasswordEncoder; import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.*; import java.util.HashMap; import java.util.List; import java.util.Map; +import java.util.Objects; import java.util.stream.Collectors; /** @@ -41,6 +46,8 @@ public class ImUserController extends BaseController { private final IImUserService userService; + private final PasswordEncoder passwordEncoder; + /** * 查询用户列表 */ @@ -136,4 +143,103 @@ public class ImUserController extends BaseController { stats.put("monthlyActive", userService.getMonthlyActiveUserCount()); return R.ok(stats); } + + /** + * 查询客服列表 + */ + @SaCheckPermission("im:user:list") + @GetMapping("/listCustomer") + public TableDataInfo listCustomer(ImUserBo bo, PageQuery pageQuery) { + System.out.println("ImUserBo" + bo); + System.out.println("PageQuery" + pageQuery); + return userService.queryPageListCustomer(bo, pageQuery); + } + + /** + * 新增客服(isCustomer-2) + */ + @SaCheckPermission("im:user:list") + @PostMapping("/addCustomer") + public R addCustomer(@RequestBody ImUser user) { + // 昵称默认跟用户名保持一致 + if(StrUtil.isEmpty(user.getNickName())){ + user.setNickName(user.getUserName()); + } + + // 检查用户名是否已存在 + ImUser temp = userService.findUserByUserName(user.getUserName()); + if (!Objects.isNull(temp)) { + return R.fail("用户名已存在"); + } + + // 设置默认值 + String username = user.getUserName(); + String nickname = user.getNickName(); + user.setPassword(passwordEncoder.encode(user.getPassword())); + user.setIsCustomer(2); + user.setUserName(username); + user.setNickName(nickname); + user.setHeadImage(user.getHeadImage()); + user.setHeadImageThumb(user.getHeadImage()); + user.setSex(user.getSex()); + user.setIsBanned(false); + user.setType(1L); + + // 保存 + userService.save(user); + + return R.ok(); + } + + /** + * 删除客服 + */ + @SaCheckPermission("im:user:list") + @PostMapping("/removeCustomer") + public R removeCustomer(@RequestBody List ids) { + + userService.removeCustomer(ids); + + return R.ok(); + } + + /** + * 修改客服 + */ + @SaCheckPermission("im:user:list") + @PostMapping("/editCustomer") + public R editCustomer(@RequestBody ImUser user) { + + String headImage = user.getHeadImage(); + if(!StrUtil.isEmpty(headImage)){ + user.setHeadImage(user.getHeadImageThumb()); + user.setHeadImageThumb(headImage); + } + + userService.updateCustomerById(user); + + return R.ok(); + } + + /** + * 修改客服 + */ + @SaCheckPermission("im:user:list") + @PostMapping("/resetPwdCustomer") + public R resetPwdCustomer(@RequestBody ImUser user) { + Long id = user.getId(); + String password = user.getPassword(); + + if(StrUtil.isEmpty(password) || id == null ){ + return R.fail("参数错误"); + } + + ImUser temp = new ImUser(); + temp.setId(id); + temp.setPassword(passwordEncoder.encode(password)); + + userService.updateCustomerById(temp); + + return R.ok(); + } } diff --git a/im-admin/ruoyi-im/src/main/java/org/dromara/im/domain/ImUser.java b/im-admin/ruoyi-im/src/main/java/org/dromara/im/domain/ImUser.java index 0df36a6..e9c0270 100644 --- a/im-admin/ruoyi-im/src/main/java/org/dromara/im/domain/ImUser.java +++ b/im-admin/ruoyi-im/src/main/java/org/dromara/im/domain/ImUser.java @@ -83,6 +83,16 @@ public class ImUser implements TransPojo { */ private String reason; + /** + * uuid + */ + private String uuid; + + /** + * 用户类型 1:普通用户 2:客服 + */ + private Integer isCustomer; + } diff --git a/im-admin/ruoyi-im/src/main/java/org/dromara/im/domain/bo/ImUserBo.java b/im-admin/ruoyi-im/src/main/java/org/dromara/im/domain/bo/ImUserBo.java index 0e43ea9..df3ddee 100644 --- a/im-admin/ruoyi-im/src/main/java/org/dromara/im/domain/bo/ImUserBo.java +++ b/im-admin/ruoyi-im/src/main/java/org/dromara/im/domain/bo/ImUserBo.java @@ -81,4 +81,9 @@ public class ImUserBo { */ private String reason; + /** + * 用户类型 1:普通用户 2:客服 + */ + private Integer isCustomer; + } diff --git a/im-admin/ruoyi-im/src/main/java/org/dromara/im/service/IImUserService.java b/im-admin/ruoyi-im/src/main/java/org/dromara/im/service/IImUserService.java index 84c22fc..565b35f 100644 --- a/im-admin/ruoyi-im/src/main/java/org/dromara/im/service/IImUserService.java +++ b/im-admin/ruoyi-im/src/main/java/org/dromara/im/service/IImUserService.java @@ -2,6 +2,7 @@ package org.dromara.im.service; import org.dromara.common.mybatis.core.page.PageQuery; import org.dromara.common.mybatis.core.page.TableDataInfo; +import org.dromara.im.domain.ImUser; import org.dromara.im.domain.bo.ImUserBo; import org.dromara.im.domain.dto.ImUserBanDto; import org.dromara.im.domain.dto.ImUserUnbanDto; @@ -103,4 +104,36 @@ public interface IImUserService { */ Long getMonthlyActiveUserCount(); + /** + * 新增客服 + * + */ + void save(ImUser user); + + /** + * 根据用户名查找 + * @param userName 用户名 + * @return 用户 + */ + ImUser findUserByUserName(String userName); + + /** + * 分页查询用户列表 + * + * @param bo 查询条件 + * @param pageQuery 分页参数 + * @return 用户分页列表 + */ + TableDataInfo queryPageListCustomer(ImUserBo bo, PageQuery pageQuery); + + /** + * 删除客服 + */ + void removeCustomer(List userIds); + + /** + * 修改客服 + */ + void updateCustomerById(ImUser bo); + } diff --git a/im-admin/ruoyi-im/src/main/java/org/dromara/im/service/impl/ImUserServiceImpl.java b/im-admin/ruoyi-im/src/main/java/org/dromara/im/service/impl/ImUserServiceImpl.java index 215f14a..84abbf4 100644 --- a/im-admin/ruoyi-im/src/main/java/org/dromara/im/service/impl/ImUserServiceImpl.java +++ b/im-admin/ruoyi-im/src/main/java/org/dromara/im/service/impl/ImUserServiceImpl.java @@ -24,6 +24,7 @@ import org.dromara.im.mq.ImRedisMQTemplate; import org.dromara.im.service.IImUserService; import org.springframework.stereotype.Service; +import java.util.Arrays; import java.util.Date; import java.util.List; import java.util.Map; @@ -62,6 +63,7 @@ public class ImUserServiceImpl implements IImUserService { */ @Override public TableDataInfo queryPageList(ImUserBo bo, PageQuery pageQuery) { + bo.setIsCustomer(1); LambdaQueryWrapper wrapper = buildQueryWrapper(bo); Page result = baseMapper.selectVoPage(pageQuery.build(), wrapper); return TableDataInfo.build(result); @@ -102,6 +104,7 @@ public class ImUserServiceImpl implements IImUserService { private LambdaQueryWrapper buildQueryWrapper(ImUserBo bo) { LambdaQueryWrapper wrapper = Wrappers.lambdaQuery(); + wrapper.eq(ImUser::getIsCustomer, bo.getIsCustomer()); wrapper.like(StringUtils.isNotBlank(bo.getUserName()), ImUser::getUserName, bo.getUserName()); wrapper.like(StringUtils.isNotBlank(bo.getNickName()), ImUser::getNickName, bo.getNickName()); wrapper.orderByDesc(ImUser::getId); @@ -189,4 +192,34 @@ public class ImUserServiceImpl implements IImUserService { wrapper.ge(ImUser::getLastLoginTime, DateUtils.addDays(new Date(), -30)); return baseMapper.selectCount(wrapper); } + + @Override + public void save(ImUser user) { + baseMapper.insert(user); + } + + @Override + public ImUser findUserByUserName(String userName) { + LambdaQueryWrapper wrapper = Wrappers.lambdaQuery(); + wrapper.eq(ImUser::getUserName, userName); + return baseMapper.selectOne(wrapper); + } + + @Override + public TableDataInfo queryPageListCustomer(ImUserBo bo, PageQuery pageQuery) { + bo.setIsCustomer(2); + LambdaQueryWrapper wrapper = buildQueryWrapper(bo); + Page result = baseMapper.selectVoPage(pageQuery.build(), wrapper); + return TableDataInfo.build(result); + } + + @Override + public void removeCustomer(List ids) { + baseMapper.deleteByIds(ids); + } + + @Override + public void updateCustomerById(ImUser bo) { + baseMapper.updateById(bo); + } }