feat(admin-server): 添加系统用户管理功能

- 新增 AdminQuery 查询类和 AdminVO 视图类
- 实现管理员分页查询接口和相关服务
- 添加系统用户列表控制器
- 引入 Hutool 工具库
This commit is contained in:
FalingCliff 2025-05-25 23:17:43 +08:00
parent 81d412ad72
commit 821c7a3695
10 changed files with 239 additions and 1 deletions

View File

@ -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>

View File

@ -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;
}
}

View File

@ -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 "";
}

View File

@ -0,0 +1,5 @@
package com.example.admin_server.common.query;
public enum QueryType {
EQ, LIKE, GT, LT, GE, LE
}

View File

@ -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;
}
}

View File

@ -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));
}
}

View File

@ -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;
}

View File

@ -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;
}

View File

@ -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);
} }

View File

@ -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);
}
} }