Skip to content

Commit a1b071e

Browse files
authored
Merge pull request 78#518 from xinnan-tech/manager-api-admin
管理员功能重置密码,删除用户接口完成,分页和查询设备需等设备管理完成后调用实现
2 parents 571622a + f30cb6b commit a1b071e

File tree

5 files changed

+222
-2
lines changed

5 files changed

+222
-2
lines changed
Lines changed: 84 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,84 @@
1+
package xiaozhi.modules.admin.contrloler;
2+
3+
4+
import io.swagger.v3.oas.annotations.Operation;
5+
import io.swagger.v3.oas.annotations.Parameter;
6+
import io.swagger.v3.oas.annotations.Parameters;
7+
import io.swagger.v3.oas.annotations.tags.Tag;
8+
import lombok.AllArgsConstructor;
9+
import org.apache.shiro.authz.annotation.RequiresPermissions;
10+
import org.springframework.web.bind.annotation.*;
11+
import xiaozhi.common.constant.Constant;
12+
import xiaozhi.common.page.PageData;
13+
import xiaozhi.common.utils.Result;
14+
import xiaozhi.common.validator.ValidatorUtils;
15+
import xiaozhi.modules.sys.dto.AdminPageUserDTO;
16+
import xiaozhi.modules.sys.service.SysUserService;
17+
import xiaozhi.modules.sys.vo.AdminPageUserVO;
18+
19+
import java.util.Map;
20+
21+
/**
22+
* 管理员控制层
23+
*
24+
* @author zjy
25+
* @since 2025-3-25
26+
*/
27+
@AllArgsConstructor
28+
@RestController
29+
@RequestMapping("/admin")
30+
@Tag(name = "管理员管理")
31+
public class AdminController {
32+
private final SysUserService sysUserService;
33+
34+
@GetMapping("/users")
35+
@Operation(summary = "分页查找用户")
36+
@RequiresPermissions("sys:role:superAdmin")
37+
@Parameters({
38+
@Parameter(name = "mobile", description = "用户手机号码", required = true),
39+
@Parameter(name = Constant.PAGE, description = "当前页码,从1开始", required = true),
40+
@Parameter(name = Constant.LIMIT, description = "每页显示记录数", required = true),
41+
})
42+
public Result<PageData<AdminPageUserVO>> pageUser(
43+
@Parameter(hidden = true) @RequestParam Map<String, Object> params) {
44+
AdminPageUserDTO dto = new AdminPageUserDTO();
45+
dto.setMobile((String) params.get("mobile"));
46+
dto.setLimit((String) params.get(Constant.LIMIT));
47+
dto.setPage((String) params.get("pages"));
48+
49+
ValidatorUtils.validateEntity(dto);
50+
PageData<AdminPageUserVO> page = sysUserService.page(dto);
51+
return new Result<PageData<AdminPageUserVO>>().ok(page);
52+
}
53+
54+
@PutMapping("/users/{id}")
55+
@Operation(summary = "重置密码")
56+
@RequiresPermissions("sys:role:superAdmin")
57+
public Result<String> update(
58+
@PathVariable Long id) {
59+
String password = sysUserService.resetPassword(id);
60+
return new Result<String>().ok(password);
61+
}
62+
63+
@DeleteMapping("/users/{id}")
64+
@Operation(summary = "用户删除")
65+
@RequiresPermissions("sys:role:superAdmin")
66+
public Result<Void> delete(@PathVariable Long id) {
67+
sysUserService.delete(new Long[]{id});
68+
return new Result<>();
69+
}
70+
71+
@GetMapping("/device/all")
72+
@Operation(summary = "分页查找设备")
73+
@RequiresPermissions("sys:role:superAdmin")
74+
@Parameters({
75+
@Parameter(name = "keywords", description = "用户手机号码", required = true),
76+
@Parameter(name = Constant.PAGE, description = "当前页码,从1开始", required = true),
77+
@Parameter(name = Constant.LIMIT, description = "每页显示记录数", required = true),
78+
})
79+
public Result<Void> pageDevice(
80+
@Parameter(hidden = true) @RequestParam Map<String, Object> params) {
81+
//TODO 等设备功能模块写好
82+
return new Result<Void>().error(600,"等设备功能模块写好");
83+
}
84+
}
Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
package xiaozhi.modules.sys.dto;
2+
3+
import io.swagger.v3.oas.annotations.media.Schema;
4+
import jakarta.validation.constraints.NotBlank;
5+
import lombok.Data;
6+
7+
/**
8+
* 管理员分页用户的参数DTO
9+
* @author zjy
10+
* @since 2025-3-21
11+
*/
12+
@Data
13+
@Schema(description = "音色分页参数")
14+
public class AdminPageUserDTO {
15+
16+
17+
@Schema(description = "手机号码")
18+
private String mobile;
19+
20+
@Schema(description = "页数")
21+
private String page;
22+
23+
@Schema(description = "显示列数")
24+
private String limit;
25+
}

main/manager-api/src/main/java/xiaozhi/modules/sys/service/SysUserService.java

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,12 @@
11
package xiaozhi.modules.sys.service;
22

3+
import xiaozhi.common.page.PageData;
34
import xiaozhi.common.service.BaseService;
5+
import xiaozhi.modules.sys.dto.AdminPageUserDTO;
46
import xiaozhi.modules.sys.dto.PasswordDTO;
57
import xiaozhi.modules.sys.dto.SysUserDTO;
68
import xiaozhi.modules.sys.entity.SysUserEntity;
9+
import xiaozhi.modules.sys.vo.AdminPageUserVO;
710

811

912
/**
@@ -19,5 +22,30 @@ public interface SysUserService extends BaseService<SysUserEntity> {
1922

2023
void delete(Long[] ids);
2124

25+
/**
26+
* 验证是否允许修改密码更改
27+
* @param userId 用户id
28+
* @param passwordDTO 验证密码的参数
29+
*/
2230
void changePassword(Long userId, PasswordDTO passwordDTO);
31+
32+
/**
33+
* 直接修改密码,不需要验证
34+
* @param userId 用户id
35+
* @param password 密码
36+
*/
37+
void changePasswordDirectly(Long userId, String password);
38+
39+
/**
40+
* 重置密码
41+
* @param userId 用户id
42+
* @return 随机生成符合规范的密码
43+
*/
44+
String resetPassword(Long userId);
45+
/**
46+
* 管理员分页用户信息
47+
* @param dto 分页查找参数
48+
* @return 用户列表分页数据
49+
*/
50+
PageData<AdminPageUserVO> page(AdminPageUserDTO dto);
2351
}

main/manager-api/src/main/java/xiaozhi/modules/sys/service/impl/SysUserServiceImpl.java

Lines changed: 63 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,23 +1,28 @@
11
package xiaozhi.modules.sys.service.impl;
22

33
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
4+
import com.baomidou.mybatisplus.core.metadata.IPage;
45
import lombok.AllArgsConstructor;
6+
import org.apache.commons.lang3.StringUtils;
57
import org.springframework.stereotype.Service;
68
import org.springframework.transaction.annotation.Transactional;
9+
import xiaozhi.common.constant.Constant;
710
import xiaozhi.common.exception.ErrorCode;
811
import xiaozhi.common.exception.RenException;
12+
import xiaozhi.common.page.PageData;
913
import xiaozhi.common.service.impl.BaseServiceImpl;
1014
import xiaozhi.common.utils.ConvertUtils;
1115
import xiaozhi.modules.security.password.PasswordUtils;
1216
import xiaozhi.modules.sys.dao.SysUserDao;
17+
import xiaozhi.modules.sys.dto.AdminPageUserDTO;
1318
import xiaozhi.modules.sys.dto.PasswordDTO;
1419
import xiaozhi.modules.sys.dto.SysUserDTO;
1520
import xiaozhi.modules.sys.entity.SysUserEntity;
1621
import xiaozhi.modules.sys.enums.SuperAdminEnum;
1722
import xiaozhi.modules.sys.service.SysUserService;
23+
import xiaozhi.modules.sys.vo.AdminPageUserVO;
1824

19-
import java.util.Arrays;
20-
import java.util.List;
25+
import java.util.*;
2126
import java.util.regex.Matcher;
2227
import java.util.regex.Pattern;
2328

@@ -80,9 +85,11 @@ public void save(SysUserDTO dto) {
8085
public void delete(Long[] ids) {
8186
//删除用户
8287
baseDao.deleteBatchIds(Arrays.asList(ids));
88+
//TODO 除了要删除用户还要删除用户关联的设备,对话,智能体。等此3个功能完善在添加
8389
}
8490

8591
@Override
92+
@Transactional(rollbackFor = Exception.class)
8693
public void changePassword(Long userId, PasswordDTO passwordDTO) {
8794
SysUserEntity sysUserEntity = sysUserDao.selectById(userId);
8895

@@ -107,11 +114,50 @@ public void changePassword(Long userId, PasswordDTO passwordDTO) {
107114
updateById(sysUserEntity);
108115
}
109116

117+
118+
@Override
119+
@Transactional(rollbackFor = Exception.class)
120+
public void changePasswordDirectly(Long userId, String password) {
121+
SysUserEntity sysUserEntity = new SysUserEntity();
122+
sysUserEntity.setId(userId);
123+
sysUserEntity.setPassword(PasswordUtils.encode(password));
124+
updateById(sysUserEntity);
125+
}
126+
127+
@Override
128+
@Transactional(rollbackFor = Exception.class)
129+
public String resetPassword(Long userId) {
130+
String password = generatePassword();
131+
changePasswordDirectly(userId,password);
132+
return password;
133+
}
134+
110135
private Long getUserCount() {
111136
QueryWrapper<SysUserEntity> queryWrapper = new QueryWrapper<>();
112137
return baseDao.selectCount(queryWrapper);
113138
}
114139

140+
@Override
141+
public PageData<AdminPageUserVO> page(AdminPageUserDTO dto) {
142+
Map<String, Object> params = new HashMap<String, Object>();
143+
params.put(Constant.PAGE, dto.getPage());
144+
params.put(Constant.LIMIT,dto.getLimit());
145+
IPage<SysUserEntity> page = baseDao.selectPage(
146+
getPage(params, "id", true),
147+
//定义查询条件
148+
new QueryWrapper<SysUserEntity>()
149+
//必须按照手机号码查找
150+
.eq(StringUtils.isNotBlank(dto.getMobile()),"username",dto.getMobile()));
151+
List<AdminPageUserVO> list = page.getRecords().stream().map(user -> {
152+
AdminPageUserVO adminPageUserVO = new AdminPageUserVO();
153+
adminPageUserVO.setUserid(user.getId().toString());
154+
adminPageUserVO.setMobile(user.getUsername());
155+
//TODO 2. 等设备功能写好,获取对应数据
156+
adminPageUserVO.setDeviceCount("0");
157+
return adminPageUserVO;
158+
}).toList();
159+
return new PageData<>(list, page.getTotal());
160+
}
115161

116162
private boolean isStrongPassword(String password) {
117163
// 弱密码的正则表达式
@@ -120,4 +166,19 @@ private boolean isStrongPassword(String password) {
120166
Matcher matcher = pattern.matcher(password);
121167
return matcher.matches();
122168
}
169+
170+
private static final String CHARACTERS = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789!@#$%^&*()";
171+
private static final Random random = new Random();
172+
/**
173+
* 生成随机密码
174+
* @return 随机生成的密码
175+
*/
176+
private String generatePassword(){
177+
StringBuilder password = new StringBuilder();
178+
for (int i = 0; i < 10; i++) {
179+
int randomIndex = random.nextInt(CHARACTERS.length());
180+
password.append(CHARACTERS.charAt(randomIndex));
181+
}
182+
return password.toString();
183+
}
123184
}
Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
package xiaozhi.modules.sys.vo;
2+
3+
import io.swagger.v3.oas.annotations.media.Schema;
4+
import lombok.Data;
5+
6+
/**
7+
* 管理员分页展示用户的VO
8+
* @ zjy
9+
* @since 2025-3-25
10+
*/
11+
@Data
12+
public class AdminPageUserVO {
13+
14+
@Schema(description = "设备数量")
15+
private String deviceCount;
16+
17+
@Schema(description = "手机号码")
18+
private String mobile;
19+
20+
@Schema(description = "用户id")
21+
private String userid;
22+
}

0 commit comments

Comments
 (0)