Merge pull request #518 from xinnan-tech/manager-api-admin

管理员功能重置密码,删除用户接口完成,分页和查询设备需等设备管理完成后调用实现
This commit is contained in:
hrz
2025-03-26 23:12:56 +08:00
committed by GitHub
5 changed files with 222 additions and 2 deletions
@@ -0,0 +1,84 @@
package xiaozhi.modules.admin.contrloler;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.Parameter;
import io.swagger.v3.oas.annotations.Parameters;
import io.swagger.v3.oas.annotations.tags.Tag;
import lombok.AllArgsConstructor;
import org.apache.shiro.authz.annotation.RequiresPermissions;
import org.springframework.web.bind.annotation.*;
import xiaozhi.common.constant.Constant;
import xiaozhi.common.page.PageData;
import xiaozhi.common.utils.Result;
import xiaozhi.common.validator.ValidatorUtils;
import xiaozhi.modules.sys.dto.AdminPageUserDTO;
import xiaozhi.modules.sys.service.SysUserService;
import xiaozhi.modules.sys.vo.AdminPageUserVO;
import java.util.Map;
/**
* 管理员控制层
*
* @author zjy
* @since 2025-3-25
*/
@AllArgsConstructor
@RestController
@RequestMapping("/admin")
@Tag(name = "管理员管理")
public class AdminController {
private final SysUserService sysUserService;
@GetMapping("/users")
@Operation(summary = "分页查找用户")
@RequiresPermissions("sys:role:superAdmin")
@Parameters({
@Parameter(name = "mobile", description = "用户手机号码", required = true),
@Parameter(name = Constant.PAGE, description = "当前页码,从1开始", required = true),
@Parameter(name = Constant.LIMIT, description = "每页显示记录数", required = true),
})
public Result<PageData<AdminPageUserVO>> pageUser(
@Parameter(hidden = true) @RequestParam Map<String, Object> params) {
AdminPageUserDTO dto = new AdminPageUserDTO();
dto.setMobile((String) params.get("mobile"));
dto.setLimit((String) params.get(Constant.LIMIT));
dto.setPage((String) params.get("pages"));
ValidatorUtils.validateEntity(dto);
PageData<AdminPageUserVO> page = sysUserService.page(dto);
return new Result<PageData<AdminPageUserVO>>().ok(page);
}
@PutMapping("/users/{id}")
@Operation(summary = "重置密码")
@RequiresPermissions("sys:role:superAdmin")
public Result<String> update(
@PathVariable Long id) {
String password = sysUserService.resetPassword(id);
return new Result<String>().ok(password);
}
@DeleteMapping("/users/{id}")
@Operation(summary = "用户删除")
@RequiresPermissions("sys:role:superAdmin")
public Result<Void> delete(@PathVariable Long id) {
sysUserService.delete(new Long[]{id});
return new Result<>();
}
@GetMapping("/device/all")
@Operation(summary = "分页查找设备")
@RequiresPermissions("sys:role:superAdmin")
@Parameters({
@Parameter(name = "keywords", description = "用户手机号码", required = true),
@Parameter(name = Constant.PAGE, description = "当前页码,从1开始", required = true),
@Parameter(name = Constant.LIMIT, description = "每页显示记录数", required = true),
})
public Result<Void> pageDevice(
@Parameter(hidden = true) @RequestParam Map<String, Object> params) {
//TODO 等设备功能模块写好
return new Result<Void>().error(600,"等设备功能模块写好");
}
}
@@ -0,0 +1,25 @@
package xiaozhi.modules.sys.dto;
import io.swagger.v3.oas.annotations.media.Schema;
import jakarta.validation.constraints.NotBlank;
import lombok.Data;
/**
* 管理员分页用户的参数DTO
* @author zjy
* @since 2025-3-21
*/
@Data
@Schema(description = "音色分页参数")
public class AdminPageUserDTO {
@Schema(description = "手机号码")
private String mobile;
@Schema(description = "页数")
private String page;
@Schema(description = "显示列数")
private String limit;
}
@@ -1,9 +1,12 @@
package xiaozhi.modules.sys.service;
import xiaozhi.common.page.PageData;
import xiaozhi.common.service.BaseService;
import xiaozhi.modules.sys.dto.AdminPageUserDTO;
import xiaozhi.modules.sys.dto.PasswordDTO;
import xiaozhi.modules.sys.dto.SysUserDTO;
import xiaozhi.modules.sys.entity.SysUserEntity;
import xiaozhi.modules.sys.vo.AdminPageUserVO;
/**
@@ -19,5 +22,30 @@ public interface SysUserService extends BaseService<SysUserEntity> {
void delete(Long[] ids);
/**
* 验证是否允许修改密码更改
* @param userId 用户id
* @param passwordDTO 验证密码的参数
*/
void changePassword(Long userId, PasswordDTO passwordDTO);
/**
* 直接修改密码,不需要验证
* @param userId 用户id
* @param password 密码
*/
void changePasswordDirectly(Long userId, String password);
/**
* 重置密码
* @param userId 用户id
* @return 随机生成符合规范的密码
*/
String resetPassword(Long userId);
/**
* 管理员分页用户信息
* @param dto 分页查找参数
* @return 用户列表分页数据
*/
PageData<AdminPageUserVO> page(AdminPageUserDTO dto);
}
@@ -1,23 +1,28 @@
package xiaozhi.modules.sys.service.impl;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import lombok.AllArgsConstructor;
import org.apache.commons.lang3.StringUtils;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import xiaozhi.common.constant.Constant;
import xiaozhi.common.exception.ErrorCode;
import xiaozhi.common.exception.RenException;
import xiaozhi.common.page.PageData;
import xiaozhi.common.service.impl.BaseServiceImpl;
import xiaozhi.common.utils.ConvertUtils;
import xiaozhi.modules.security.password.PasswordUtils;
import xiaozhi.modules.sys.dao.SysUserDao;
import xiaozhi.modules.sys.dto.AdminPageUserDTO;
import xiaozhi.modules.sys.dto.PasswordDTO;
import xiaozhi.modules.sys.dto.SysUserDTO;
import xiaozhi.modules.sys.entity.SysUserEntity;
import xiaozhi.modules.sys.enums.SuperAdminEnum;
import xiaozhi.modules.sys.service.SysUserService;
import xiaozhi.modules.sys.vo.AdminPageUserVO;
import java.util.Arrays;
import java.util.List;
import java.util.*;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
@@ -80,9 +85,11 @@ public class SysUserServiceImpl extends BaseServiceImpl<SysUserDao, SysUserEntit
public void delete(Long[] ids) {
//删除用户
baseDao.deleteBatchIds(Arrays.asList(ids));
//TODO 除了要删除用户还要删除用户关联的设备,对话,智能体。等此3个功能完善在添加
}
@Override
@Transactional(rollbackFor = Exception.class)
public void changePassword(Long userId, PasswordDTO passwordDTO) {
SysUserEntity sysUserEntity = sysUserDao.selectById(userId);
@@ -107,11 +114,50 @@ public class SysUserServiceImpl extends BaseServiceImpl<SysUserDao, SysUserEntit
updateById(sysUserEntity);
}
@Override
@Transactional(rollbackFor = Exception.class)
public void changePasswordDirectly(Long userId, String password) {
SysUserEntity sysUserEntity = new SysUserEntity();
sysUserEntity.setId(userId);
sysUserEntity.setPassword(PasswordUtils.encode(password));
updateById(sysUserEntity);
}
@Override
@Transactional(rollbackFor = Exception.class)
public String resetPassword(Long userId) {
String password = generatePassword();
changePasswordDirectly(userId,password);
return password;
}
private Long getUserCount() {
QueryWrapper<SysUserEntity> queryWrapper = new QueryWrapper<>();
return baseDao.selectCount(queryWrapper);
}
@Override
public PageData<AdminPageUserVO> page(AdminPageUserDTO dto) {
Map<String, Object> params = new HashMap<String, Object>();
params.put(Constant.PAGE, dto.getPage());
params.put(Constant.LIMIT,dto.getLimit());
IPage<SysUserEntity> page = baseDao.selectPage(
getPage(params, "id", true),
//定义查询条件
new QueryWrapper<SysUserEntity>()
//必须按照手机号码查找
.eq(StringUtils.isNotBlank(dto.getMobile()),"username",dto.getMobile()));
List<AdminPageUserVO> list = page.getRecords().stream().map(user -> {
AdminPageUserVO adminPageUserVO = new AdminPageUserVO();
adminPageUserVO.setUserid(user.getId().toString());
adminPageUserVO.setMobile(user.getUsername());
//TODO 2. 等设备功能写好,获取对应数据
adminPageUserVO.setDeviceCount("0");
return adminPageUserVO;
}).toList();
return new PageData<>(list, page.getTotal());
}
private boolean isStrongPassword(String password) {
// 弱密码的正则表达式
@@ -120,4 +166,19 @@ public class SysUserServiceImpl extends BaseServiceImpl<SysUserDao, SysUserEntit
Matcher matcher = pattern.matcher(password);
return matcher.matches();
}
private static final String CHARACTERS = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789!@#$%^&*()";
private static final Random random = new Random();
/**
* 生成随机密码
* @return 随机生成的密码
*/
private String generatePassword(){
StringBuilder password = new StringBuilder();
for (int i = 0; i < 10; i++) {
int randomIndex = random.nextInt(CHARACTERS.length());
password.append(CHARACTERS.charAt(randomIndex));
}
return password.toString();
}
}
@@ -0,0 +1,22 @@
package xiaozhi.modules.sys.vo;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
/**
* 管理员分页展示用户的VO
* @ zjy
* @since 2025-3-25
*/
@Data
public class AdminPageUserVO {
@Schema(description = "设备数量")
private String deviceCount;
@Schema(description = "手机号码")
private String mobile;
@Schema(description = "用户id")
private String userid;
}