一、管理员页面分页展示用户
1.定义页面PageParam
包括当前页面以及页面大小 分别设置默认值1和15。
@Data
public class PageParam {
private int currentPage = 1;
private int pageSize = 15;
}
2.配置User服务的分页的插件
config.UserConfiguration
@Configuration
public class UserConfiguration {
@Bean
public MybatisPlusInterceptor mybatisPlusInterceptor() {
MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
interceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.MYSQL));
return interceptor;
}
}
为了方便把当前页的内容返回给前端,我们需要把当前页的内容封装成一个PageBean对象,该对象应该有两个属性:一个是当前页的内容,即当前页的对象集合;一个是该记录的总条数,方便前端计算总页数并显示。
3.AdminUserController定义接口
定义post方法ListPage /admin/user
@RestController
@RequestMapping("user")
public class UserAdminController {
@Autowired
private UserService userService;
@PostMapping("admin/list")
public R listPage(@RequestBody PageParam pageParam){
return userService.listPage(pageParam);
}
}
4.定义userService接口定义方法
public interface UserService {
R listPage(PageParam pageParam);
}
5.定义Mapper
@Mapper
public interface UserMapper extends BaseMapper<User> {
}
6.定义实现类UserServiceImpl
根据传入的PageParam参数,定义Page对象接收参数,调用UserMapper分页查询,返回分页数据,返回分页数据和总数量。
@Service
@Slf4j
public class UserServiceImpl implements UserService {
@Override
public R listPage(PageParam pageParam) {
IPage<User> page=new Page<>(pageParam.getCurrentPage(), pageParam.getPageSize());
userMapper.selectPage(page,null);
List<User> records=page.getRecords();
long total = page.getTotal();
return R.ok("用户管理查询成功",records,total);
}
}
以上完成接口实现
二、定义UserClient用于admin调用进行分页查询
@FeignClient("user-service")
public interface UserClient {
@PostMapping("/user/admin/list")
R adminListPage(@RequestBody PageParam pageParam);
}
三、admin服务调用Client实现功能
1.Application 添加@EnableFeignClients注解
@EnableFeignClients(clients = {UserClient.class})
2.UserController定义接口,Service定义方法
@RestController
@RequestMapping("user")
public class UserController {
@Autowired
private UserService userService;
@GetMapping("list")
public R userList(PageParam pageParam){
return userService.list(pageParam);
}
}
public interface UserService {
R list(PageParam pageParam);
}
3.实现类实现,添加Redis缓存,注意配置文件和启动类开启缓存。
@Service
@Slf4j
public class UserServiceImpl implements UserService {
@Autowired
private UserClient userClient;
@Override
@Cacheable(value = "list.user",key = "#pageParam.currentPage+'-'+#pageParam.pageSize")
public R list(PageParam pageParam) {
log.info("UserServiceImpl list parameters:{}",pageParam);
R r = userClient.adminListPage(pageParam);
return r;
}
}
二、类似的可以实现用户删除、修改以及添加业务,都是管理员服务通过Feign客户端调用User服务。
1.管理员服务实现用户删除:
用户服务中实现接口 /user/admin/delete
Param:user_id
业务实现层逻辑如下:
直接用UserMapper中的deleteById方法删除相应id的用户数据,,具体实现代码如下:
@Override
public R remove(Integer userId) {
userMapper.deleteById(userId);
log.info("UserServiceImpl remove parameters:{}",userId);
return R.ok("用户数据删除成功!");
}
之后在Client中添加接口,然后就是Admin服务中实现该业务接口
/admin/user/delete
然后实现类中调用client中的方法,实现删除功能,注意,由于用户信息发生变化,需要及时清除Redis缓存,这里使用@CacheEvit注解删除名字为list.user的缓存:
@CacheEvict(value = "list.user",allEntries = true)
@Override
public R remove(CartListParam cartListParam) {
R r=userClient.adminRemove(cartListParam);
log.info("UserServiceImpl remove parameters:{}",cartListParam);
return r;
}
2.管理员服务实现修改用户信息
用户服务接口,流程与以上的服务类似,具体说明业务实现逻辑:
这里设定修改不能修改id和名称,只能修改电话和密码,这里密码修改需要注意,如果密码为发生修改则无需进行加密处理,只有发生修改再进行加密,所以在User服务中实现的update方法,需要先查数据库中UserId对应的密码是否与于数据库中的一致,这里用到QuerryWapper判断,调用userMapper的selecrCount查询是否存在,如果等于0,就是用MD5Utils进行加密,更新密码,如果不等于就无需加密,直接更新就可,具体实现代码如下:
@Override
public R update(User user) {
QueryWrapper queryWrapper=new QueryWrapper<>();
queryWrapper.eq("user_id",user.getUserId());
queryWrapper.eq("password",user.getPassword());
Long aLong = userMapper.selectCount(queryWrapper);
if(aLong==0){
user.setPassword(MD5Util.encode(user.getPassword()+UserConstants.USER_SALT));
}
int i = userMapper.updateById(user);
log.info("UserServiceImpl update parameters:{}",user);
return R.ok("用户信息修改成功");
}
3.管理员添加用户接口
这个业务实现逻辑与注册类似,可以复用代码。
这里说明实现逻辑:
首先判断querry.eq是否存在用户名,如果已经存在提示无法添加,不存在就继续添加,然后设置密码,对输入的密码进行加盐处理,然后调用UserMapper的insert进行添加,如果为空说明添加失败,否则视为成功。
@Override
public R save(User user) {
//检查账号 查询数据库
QueryWrapper queryWrapper=new QueryWrapper();
queryWrapper.eq("user_name",user.getUserName());
Long total=userMapper.selectCount(queryWrapper);
if(total>0){
log.info("UserServiceImpl.register业务结束,结果:{}","账号存在,注册失败");
return R.fail("账号已经存在,请重新添加");
}
//密码加密,加盐 不可逆转加密 固定铭文加密后密文是固定的 注册失加密以后存储密文
// 登录是加密以后,用密文进行数据库对比,但能被暴力破解,穷举法
//加盐处理 +一段字符串
String newPwd=MD5Util.encode(user.getPassword()+ UserConstants.USER_SALT);
user.setPassword(newPwd);
//插入数据库数据
int rows=userMapper.insert(user);
//判断 结果处理
if(rows==0){
log.info("添加失败");
return R.fail("添加失败");
}
return R.ok("添加成功");
}