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: { 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; package org.dromara.im.controller;
import cn.dev33.satoken.annotation.SaCheckPermission; import cn.dev33.satoken.annotation.SaCheckPermission;
import cn.hutool.core.util.StrUtil;
import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.Operation;
import jakarta.servlet.http.HttpServletResponse; import jakarta.servlet.http.HttpServletResponse;
import jakarta.validation.Valid; 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.PageQuery;
import org.dromara.common.mybatis.core.page.TableDataInfo; import org.dromara.common.mybatis.core.page.TableDataInfo;
import org.dromara.common.web.core.BaseController; 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.bo.ImUserBo;
import org.dromara.im.domain.dto.ImUserBanDto; import org.dromara.im.domain.dto.ImUserBanDto;
import org.dromara.im.domain.dto.ImUserUnbanDto; import org.dromara.im.domain.dto.ImUserUnbanDto;
import org.dromara.im.domain.vo.ImUserVo; import org.dromara.im.domain.vo.ImUserVo;
import org.dromara.im.service.IImUserService; import org.dromara.im.service.IImUserService;
import org.dromara.im.util.CommaTextUtils; import org.dromara.im.util.CommaTextUtils;
import org.springframework.security.crypto.password.PasswordEncoder;
import org.springframework.validation.annotation.Validated; import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*; import org.springframework.web.bind.annotation.*;
import java.util.HashMap; import java.util.HashMap;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Map;
import java.util.Objects;
import java.util.stream.Collectors; import java.util.stream.Collectors;
/** /**
@ -41,6 +46,8 @@ public class ImUserController extends BaseController {
private final IImUserService userService; private final IImUserService userService;
private final PasswordEncoder passwordEncoder;
/** /**
* 查询用户列表 * 查询用户列表
*/ */
@ -136,4 +143,103 @@ public class ImUserController extends BaseController {
stats.put("monthlyActive", userService.getMonthlyActiveUserCount()); stats.put("monthlyActive", userService.getMonthlyActiveUserCount());
return R.ok(stats); 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; 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; 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.PageQuery;
import org.dromara.common.mybatis.core.page.TableDataInfo; 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.bo.ImUserBo;
import org.dromara.im.domain.dto.ImUserBanDto; import org.dromara.im.domain.dto.ImUserBanDto;
import org.dromara.im.domain.dto.ImUserUnbanDto; import org.dromara.im.domain.dto.ImUserUnbanDto;
@ -103,4 +104,36 @@ public interface IImUserService {
*/ */
Long getMonthlyActiveUserCount(); 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.dromara.im.service.IImUserService;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import java.util.Arrays;
import java.util.Date; import java.util.Date;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Map;
@ -62,6 +63,7 @@ public class ImUserServiceImpl implements IImUserService {
*/ */
@Override @Override
public TableDataInfo<ImUserVo> queryPageList(ImUserBo bo, PageQuery pageQuery) { public TableDataInfo<ImUserVo> queryPageList(ImUserBo bo, PageQuery pageQuery) {
bo.setIsCustomer(1);
LambdaQueryWrapper<ImUser> wrapper = buildQueryWrapper(bo); LambdaQueryWrapper<ImUser> wrapper = buildQueryWrapper(bo);
Page<ImUserVo> result = baseMapper.selectVoPage(pageQuery.build(), wrapper); Page<ImUserVo> result = baseMapper.selectVoPage(pageQuery.build(), wrapper);
return TableDataInfo.build(result); return TableDataInfo.build(result);
@ -102,6 +104,7 @@ public class ImUserServiceImpl implements IImUserService {
private LambdaQueryWrapper<ImUser> buildQueryWrapper(ImUserBo bo) { private LambdaQueryWrapper<ImUser> buildQueryWrapper(ImUserBo bo) {
LambdaQueryWrapper<ImUser> wrapper = Wrappers.lambdaQuery(); 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.getUserName()), ImUser::getUserName, bo.getUserName());
wrapper.like(StringUtils.isNotBlank(bo.getNickName()), ImUser::getNickName, bo.getNickName()); wrapper.like(StringUtils.isNotBlank(bo.getNickName()), ImUser::getNickName, bo.getNickName());
wrapper.orderByDesc(ImUser::getId); wrapper.orderByDesc(ImUser::getId);
@ -189,4 +192,34 @@ public class ImUserServiceImpl implements IImUserService {
wrapper.ge(ImUser::getLastLoginTime, DateUtils.addDays(new Date(), -30)); wrapper.ge(ImUser::getLastLoginTime, DateUtils.addDays(new Date(), -30));
return baseMapper.selectCount(wrapper); 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