diff --git a/pom.xml b/pom.xml index 764155c..13721f2 100644 --- a/pom.xml +++ b/pom.xml @@ -127,6 +127,11 @@ fastjson 1.2.83 + + cn.hutool + hutool-all + 5.8.21 + diff --git a/src/main/java/com/example/admin_server/common/query/IPageRequest.java b/src/main/java/com/example/admin_server/common/query/IPageRequest.java new file mode 100644 index 0000000..215ce74 --- /dev/null +++ b/src/main/java/com/example/admin_server/common/query/IPageRequest.java @@ -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 Page toPage() { + Page 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; + } +} diff --git a/src/main/java/com/example/admin_server/common/query/QueryField.java b/src/main/java/com/example/admin_server/common/query/QueryField.java new file mode 100644 index 0000000..00b7616 --- /dev/null +++ b/src/main/java/com/example/admin_server/common/query/QueryField.java @@ -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 ""; +} diff --git a/src/main/java/com/example/admin_server/common/query/QueryType.java b/src/main/java/com/example/admin_server/common/query/QueryType.java new file mode 100644 index 0000000..5a0c5e2 --- /dev/null +++ b/src/main/java/com/example/admin_server/common/query/QueryType.java @@ -0,0 +1,5 @@ +package com.example.admin_server.common.query; + +public enum QueryType { + EQ, LIKE, GT, LT, GE, LE +} diff --git a/src/main/java/com/example/admin_server/common/query/QueryWrapperBuilder.java b/src/main/java/com/example/admin_server/common/query/QueryWrapperBuilder.java new file mode 100644 index 0000000..259e014 --- /dev/null +++ b/src/main/java/com/example/admin_server/common/query/QueryWrapperBuilder.java @@ -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 QueryWrapper build(Object queryObj, Class entityClass) { + QueryWrapper 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; + } +} diff --git a/src/main/java/com/example/admin_server/controller/admin/SystemController.java b/src/main/java/com/example/admin_server/controller/admin/SystemController.java new file mode 100644 index 0000000..1d992ab --- /dev/null +++ b/src/main/java/com/example/admin_server/controller/admin/SystemController.java @@ -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)); + } +} diff --git a/src/main/java/com/example/admin_server/model/query/AdminQuery.java b/src/main/java/com/example/admin_server/model/query/AdminQuery.java new file mode 100644 index 0000000..9371b21 --- /dev/null +++ b/src/main/java/com/example/admin_server/model/query/AdminQuery.java @@ -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; +} diff --git a/src/main/java/com/example/admin_server/model/vo/AdminVO.java b/src/main/java/com/example/admin_server/model/vo/AdminVO.java new file mode 100644 index 0000000..9c2e79d --- /dev/null +++ b/src/main/java/com/example/admin_server/model/vo/AdminVO.java @@ -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; + +/** + *

+ * 后台管理员表 + *

+ * + * @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; +} diff --git a/src/main/java/com/example/admin_server/service/IAdminService.java b/src/main/java/com/example/admin_server/service/IAdminService.java index 1db91a8..580461b 100644 --- a/src/main/java/com/example/admin_server/service/IAdminService.java +++ b/src/main/java/com/example/admin_server/service/IAdminService.java @@ -1,7 +1,10 @@ package com.example.admin_server.service; +import com.baomidou.mybatisplus.core.metadata.IPage; 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.query.AdminQuery; /** *

@@ -12,5 +15,5 @@ import com.example.admin_server.model.entity.Admin; * @since 2025-05-24 */ public interface IAdminService extends IService { - + IPage pageList(IPageRequest pageRequest, AdminQuery query); } diff --git a/src/main/java/com/example/admin_server/service/impl/AdminServiceImpl.java b/src/main/java/com/example/admin_server/service/impl/AdminServiceImpl.java index e3c0440..29cc22a 100644 --- a/src/main/java/com/example/admin_server/service/impl/AdminServiceImpl.java +++ b/src/main/java/com/example/admin_server/service/impl/AdminServiceImpl.java @@ -1,8 +1,14 @@ 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.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.model.entity.Admin; +import com.example.admin_server.model.query.AdminQuery; import com.example.admin_server.service.IAdminService; import org.springframework.stereotype.Service; @@ -18,4 +24,10 @@ import org.springframework.stereotype.Service; public class AdminServiceImpl extends ServiceImpl implements IAdminService { + @Override + public IPage pageList(IPageRequest pageRequest, AdminQuery query) { + Page page = pageRequest.toPage(); + QueryWrapper wrapper = QueryWrapperBuilder.build(query, Admin.class); + return this.page(page, wrapper); + } }