Browse Source

客服管理

master
La123123 2 days ago
parent
commit
e2f3a5b3bb
  1. 2
      im-admin-ui/vite.config.ts
  2. 21
      im-admin/ruoyi-im/src/main/java/org/dromara/im/config/MvcConfig.java
  3. 106
      im-admin/ruoyi-im/src/main/java/org/dromara/im/controller/ImUserController.java
  4. 10
      im-admin/ruoyi-im/src/main/java/org/dromara/im/domain/ImUser.java
  5. 5
      im-admin/ruoyi-im/src/main/java/org/dromara/im/domain/bo/ImUserBo.java
  6. 33
      im-admin/ruoyi-im/src/main/java/org/dromara/im/service/IImUserService.java
  7. 33
      im-admin/ruoyi-im/src/main/java/org/dromara/im/service/impl/ImUserServiceImpl.java

2
im-admin-ui/vite.config.ts

@ -73,7 +73,7 @@ export default defineConfig(({ mode, command }: ConfigEnv): UserConfig => {
]
},
build: {
chunkSizeWarningLimit: 2048,
chunkSizeWarningLimit: 2048
}
};
});

21
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();
}
}

106
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<ImUserVo> 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<Long> 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();
}
}

10
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;
}

5
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;
}

33
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<ImUserVo> queryPageListCustomer(ImUserBo bo, PageQuery pageQuery);
/**
* 删除客服
*/
void removeCustomer(List<Long> userIds);
/**
* 修改客服
*/
void updateCustomerById(ImUser bo);
}

33
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<ImUserVo> queryPageList(ImUserBo bo, PageQuery pageQuery) {
bo.setIsCustomer(1);
LambdaQueryWrapper<ImUser> wrapper = buildQueryWrapper(bo);
Page<ImUserVo> result = baseMapper.selectVoPage(pageQuery.build(), wrapper);
return TableDataInfo.build(result);
@ -102,6 +104,7 @@ public class ImUserServiceImpl implements IImUserService {
private LambdaQueryWrapper<ImUser> buildQueryWrapper(ImUserBo bo) {
LambdaQueryWrapper<ImUser> 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<ImUser> wrapper = Wrappers.lambdaQuery();
wrapper.eq(ImUser::getUserName, userName);
return baseMapper.selectOne(wrapper);
}
@Override
public TableDataInfo<ImUserVo> queryPageListCustomer(ImUserBo bo, PageQuery pageQuery) {
bo.setIsCustomer(2);
LambdaQueryWrapper<ImUser> wrapper = buildQueryWrapper(bo);
Page<ImUserVo> result = baseMapper.selectVoPage(pageQuery.build(), wrapper);
return TableDataInfo.build(result);
}
@Override
public void removeCustomer(List<Long> ids) {
baseMapper.deleteByIds(ids);
}
@Override
public void updateCustomerById(ImUser bo) {
baseMapper.updateById(bo);
}
}

Loading…
Cancel
Save