feat(admin-server): 添加系统用户管理功能
- 新增 AdminQuery 查询类和 AdminVO 视图类 - 实现管理员分页查询接口和相关服务 - 添加系统用户列表控制器 - 引入 Hutool 工具库
This commit is contained in:
parent
81d412ad72
commit
821c7a3695
5
pom.xml
5
pom.xml
|
|
@ -127,6 +127,11 @@
|
||||||
<artifactId>fastjson</artifactId>
|
<artifactId>fastjson</artifactId>
|
||||||
<version>1.2.83</version>
|
<version>1.2.83</version>
|
||||||
</dependency>
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>cn.hutool</groupId>
|
||||||
|
<artifactId>hutool-all</artifactId>
|
||||||
|
<version>5.8.21</version> <!-- 推荐使用 5.8.0+ -->
|
||||||
|
</dependency>
|
||||||
</dependencies>
|
</dependencies>
|
||||||
|
|
||||||
<dependencyManagement>
|
<dependencyManagement>
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,39 @@
|
||||||
|
package com.example.admin_server.common.query;
|
||||||
|
|
||||||
|
import cn.hutool.core.text.CharSequenceUtil;
|
||||||
|
import com.baomidou.mybatisplus.core.metadata.OrderItem;
|
||||||
|
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
|
||||||
|
import io.swagger.annotations.ApiModelProperty;
|
||||||
|
import lombok.Data;
|
||||||
|
|
||||||
|
import java.io.Serializable;
|
||||||
|
import java.util.Collections;
|
||||||
|
|
||||||
|
@Data
|
||||||
|
public class IPageRequest implements Serializable {
|
||||||
|
|
||||||
|
@ApiModelProperty(value = "当前页")
|
||||||
|
private Long current = 1L;
|
||||||
|
|
||||||
|
@ApiModelProperty(value = "每页条数")
|
||||||
|
private Long size = 10L;
|
||||||
|
|
||||||
|
@ApiModelProperty(value = "排序字段")
|
||||||
|
private String sortColumn;
|
||||||
|
|
||||||
|
@ApiModelProperty(value = "是否升序", example = "true")
|
||||||
|
private Boolean sortAsc = true;
|
||||||
|
|
||||||
|
|
||||||
|
public <T> Page<T> toPage() {
|
||||||
|
Page<T> page = new Page<>(current, size);
|
||||||
|
if (CharSequenceUtil.isNotBlank(sortColumn)) {
|
||||||
|
String column = CharSequenceUtil.toUnderlineCase(sortColumn);
|
||||||
|
OrderItem orderItem = Boolean.TRUE.equals(sortAsc)
|
||||||
|
? OrderItem.asc(column)
|
||||||
|
: OrderItem.desc(column);
|
||||||
|
page.setOrders(Collections.singletonList(orderItem));
|
||||||
|
}
|
||||||
|
return page;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,11 @@
|
||||||
|
package com.example.admin_server.common.query;
|
||||||
|
|
||||||
|
import java.lang.annotation.*;
|
||||||
|
|
||||||
|
@Documented
|
||||||
|
@Target(ElementType.FIELD)
|
||||||
|
@Retention(RetentionPolicy.RUNTIME)
|
||||||
|
public @interface QueryField {
|
||||||
|
QueryType type() default QueryType.EQ;
|
||||||
|
String column() default "";
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,5 @@
|
||||||
|
package com.example.admin_server.common.query;
|
||||||
|
|
||||||
|
public enum QueryType {
|
||||||
|
EQ, LIKE, GT, LT, GE, LE
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,49 @@
|
||||||
|
package com.example.admin_server.common.query;
|
||||||
|
|
||||||
|
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
|
||||||
|
import org.springframework.util.StringUtils;
|
||||||
|
|
||||||
|
import java.lang.reflect.Field;
|
||||||
|
|
||||||
|
public class QueryWrapperBuilder {
|
||||||
|
|
||||||
|
public static <T> QueryWrapper<T> build(Object queryObj, Class<T> entityClass) {
|
||||||
|
QueryWrapper<T> wrapper = new QueryWrapper<>();
|
||||||
|
if (queryObj == null) return wrapper;
|
||||||
|
|
||||||
|
Class<?> clazz = queryObj.getClass();
|
||||||
|
for (Field field : clazz.getDeclaredFields()) {
|
||||||
|
field.setAccessible(true);
|
||||||
|
QueryField annotation = field.getAnnotation(QueryField.class);
|
||||||
|
if (annotation == null) continue;
|
||||||
|
|
||||||
|
try {
|
||||||
|
Object value = field.get(queryObj);
|
||||||
|
if (value == null || (value instanceof String && !StringUtils.hasText((String) value))) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
String column = StringUtils.hasText(annotation.column()) ? annotation.column() : field.getName();
|
||||||
|
|
||||||
|
switch (annotation.type()) {
|
||||||
|
case EQ:
|
||||||
|
wrapper.eq(column, value); break;
|
||||||
|
case LIKE:
|
||||||
|
wrapper.like(column, value); break;
|
||||||
|
case GT:
|
||||||
|
wrapper.gt(column, value); break;
|
||||||
|
case LT:
|
||||||
|
wrapper.lt(column, value); break;
|
||||||
|
case GE:
|
||||||
|
wrapper.ge(column, value); break;
|
||||||
|
case LE:
|
||||||
|
wrapper.le(column, value); break;
|
||||||
|
}
|
||||||
|
} catch (IllegalAccessException e) {
|
||||||
|
throw new RuntimeException(e);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return wrapper;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,28 @@
|
||||||
|
package com.example.admin_server.controller.admin;
|
||||||
|
|
||||||
|
import com.example.admin_server.common.Result;
|
||||||
|
import com.example.admin_server.common.query.IPageRequest;
|
||||||
|
import com.example.admin_server.model.query.AdminQuery;
|
||||||
|
import com.example.admin_server.service.IAdminService;
|
||||||
|
import io.swagger.annotations.Api;
|
||||||
|
import io.swagger.annotations.ApiOperation;
|
||||||
|
import lombok.RequiredArgsConstructor;
|
||||||
|
import org.springframework.web.bind.annotation.GetMapping;
|
||||||
|
import org.springframework.web.bind.annotation.RequestMapping;
|
||||||
|
import org.springframework.web.bind.annotation.RestController;
|
||||||
|
|
||||||
|
|
||||||
|
@RestController
|
||||||
|
@RequestMapping("/api/admin/system")
|
||||||
|
@RequiredArgsConstructor
|
||||||
|
@Api(tags = {"系统管理"})
|
||||||
|
public class SystemController {
|
||||||
|
|
||||||
|
private final IAdminService iAdminService;
|
||||||
|
|
||||||
|
@GetMapping("/user/list")
|
||||||
|
@ApiOperation("系统用户列表")
|
||||||
|
public Result<?> getAdminUserList(AdminQuery query, IPageRequest pageRequest) {
|
||||||
|
return Result.ok(iAdminService.pageList(pageRequest, query));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,18 @@
|
||||||
|
package com.example.admin_server.model.query;
|
||||||
|
|
||||||
|
import com.example.admin_server.common.query.QueryField;
|
||||||
|
import com.example.admin_server.common.query.QueryType;
|
||||||
|
import io.swagger.annotations.ApiModelProperty;
|
||||||
|
import lombok.Data;
|
||||||
|
|
||||||
|
@Data
|
||||||
|
public class AdminQuery {
|
||||||
|
|
||||||
|
@QueryField(type = QueryType.LIKE)
|
||||||
|
@ApiModelProperty("用户名")
|
||||||
|
private String username;
|
||||||
|
|
||||||
|
@QueryField(type = QueryType.EQ)
|
||||||
|
@ApiModelProperty("状态")
|
||||||
|
private Integer status;
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,68 @@
|
||||||
|
package com.example.admin_server.model.vo;
|
||||||
|
|
||||||
|
import com.baomidou.mybatisplus.annotation.TableField;
|
||||||
|
import io.swagger.annotations.ApiModel;
|
||||||
|
import io.swagger.annotations.ApiModelProperty;
|
||||||
|
import lombok.Data;
|
||||||
|
|
||||||
|
import java.io.Serializable;
|
||||||
|
import java.time.LocalDateTime;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* <p>
|
||||||
|
* 后台管理员表
|
||||||
|
* </p>
|
||||||
|
*
|
||||||
|
* @author FallingCliff
|
||||||
|
* @since 2025-05-24
|
||||||
|
*/
|
||||||
|
@Data
|
||||||
|
@ApiModel(value="Admin对象")
|
||||||
|
public class AdminVO implements Serializable {
|
||||||
|
|
||||||
|
@ApiModelProperty(value = "主键ID")
|
||||||
|
private Long id;
|
||||||
|
|
||||||
|
@ApiModelProperty(value = "用户名")
|
||||||
|
private String username;
|
||||||
|
|
||||||
|
@ApiModelProperty(value = "姓名")
|
||||||
|
@TableField("real_name")
|
||||||
|
private String realName;
|
||||||
|
|
||||||
|
@ApiModelProperty(value = "邮箱")
|
||||||
|
@TableField("email")
|
||||||
|
private String email;
|
||||||
|
|
||||||
|
@ApiModelProperty(value = "手机号")
|
||||||
|
@TableField("phone")
|
||||||
|
private String phone;
|
||||||
|
|
||||||
|
@ApiModelProperty(value = "头像")
|
||||||
|
@TableField("avatar")
|
||||||
|
private String avatar;
|
||||||
|
|
||||||
|
@ApiModelProperty(value = "状态:0禁用,1正常")
|
||||||
|
@TableField("status")
|
||||||
|
private Integer status;
|
||||||
|
|
||||||
|
@ApiModelProperty(value = "是否为超级管理员:1是,0否")
|
||||||
|
@TableField("is_super")
|
||||||
|
private Integer isSuper;
|
||||||
|
|
||||||
|
@ApiModelProperty(value = "上次登录IP")
|
||||||
|
@TableField("last_login_ip")
|
||||||
|
private String lastLoginIp;
|
||||||
|
|
||||||
|
@ApiModelProperty(value = "上次登录时间")
|
||||||
|
@TableField("last_login_time")
|
||||||
|
private LocalDateTime lastLoginTime;
|
||||||
|
|
||||||
|
@ApiModelProperty(value = "创建时间")
|
||||||
|
@TableField("create_time")
|
||||||
|
private LocalDateTime createTime;
|
||||||
|
|
||||||
|
@ApiModelProperty(value = "更新时间")
|
||||||
|
@TableField("update_time")
|
||||||
|
private LocalDateTime updateTime;
|
||||||
|
}
|
||||||
|
|
@ -1,7 +1,10 @@
|
||||||
package com.example.admin_server.service;
|
package com.example.admin_server.service;
|
||||||
|
|
||||||
|
import com.baomidou.mybatisplus.core.metadata.IPage;
|
||||||
import com.baomidou.mybatisplus.extension.service.IService;
|
import com.baomidou.mybatisplus.extension.service.IService;
|
||||||
|
import com.example.admin_server.common.query.IPageRequest;
|
||||||
import com.example.admin_server.model.entity.Admin;
|
import com.example.admin_server.model.entity.Admin;
|
||||||
|
import com.example.admin_server.model.query.AdminQuery;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* <p>
|
* <p>
|
||||||
|
|
@ -12,5 +15,5 @@ import com.example.admin_server.model.entity.Admin;
|
||||||
* @since 2025-05-24
|
* @since 2025-05-24
|
||||||
*/
|
*/
|
||||||
public interface IAdminService extends IService<Admin> {
|
public interface IAdminService extends IService<Admin> {
|
||||||
|
IPage<Admin> pageList(IPageRequest pageRequest, AdminQuery query);
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -1,8 +1,14 @@
|
||||||
package com.example.admin_server.service.impl;
|
package com.example.admin_server.service.impl;
|
||||||
|
|
||||||
|
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
|
||||||
|
import com.baomidou.mybatisplus.core.metadata.IPage;
|
||||||
|
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
|
||||||
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
|
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
|
||||||
|
import com.example.admin_server.common.query.IPageRequest;
|
||||||
|
import com.example.admin_server.common.query.QueryWrapperBuilder;
|
||||||
import com.example.admin_server.mapper.AdminMapper;
|
import com.example.admin_server.mapper.AdminMapper;
|
||||||
import com.example.admin_server.model.entity.Admin;
|
import com.example.admin_server.model.entity.Admin;
|
||||||
|
import com.example.admin_server.model.query.AdminQuery;
|
||||||
import com.example.admin_server.service.IAdminService;
|
import com.example.admin_server.service.IAdminService;
|
||||||
import org.springframework.stereotype.Service;
|
import org.springframework.stereotype.Service;
|
||||||
|
|
||||||
|
|
@ -18,4 +24,10 @@ import org.springframework.stereotype.Service;
|
||||||
public class AdminServiceImpl extends ServiceImpl<AdminMapper, Admin> implements IAdminService {
|
public class AdminServiceImpl extends ServiceImpl<AdminMapper, Admin> implements IAdminService {
|
||||||
|
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public IPage<Admin> pageList(IPageRequest pageRequest, AdminQuery query) {
|
||||||
|
Page<Admin> page = pageRequest.toPage();
|
||||||
|
QueryWrapper<Admin> wrapper = QueryWrapperBuilder.build(query, Admin.class);
|
||||||
|
return this.page(page, wrapper);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue