feat:
- 添加分页对象 - 添加用户服务 - 添加用户服务测试 - 添加UserVO - 修改统一异常处理ApiResponse内容
This commit is contained in:
parent
45bda6c962
commit
3e3eded4ab
@ -4,8 +4,12 @@ import asia.yulinling.workflow.constant.Status;
|
|||||||
import asia.yulinling.workflow.exception.JsonException;
|
import asia.yulinling.workflow.exception.JsonException;
|
||||||
import asia.yulinling.workflow.exception.PageException;
|
import asia.yulinling.workflow.exception.PageException;
|
||||||
import asia.yulinling.workflow.model.ApiResponse;
|
import asia.yulinling.workflow.model.ApiResponse;
|
||||||
|
import asia.yulinling.workflow.model.PageResult;
|
||||||
|
import asia.yulinling.workflow.model.vo.user.UserVO;
|
||||||
|
import asia.yulinling.workflow.service.UserService;
|
||||||
import cn.hutool.core.lang.Dict;
|
import cn.hutool.core.lang.Dict;
|
||||||
import cn.hutool.json.JSONUtil;
|
import cn.hutool.json.JSONUtil;
|
||||||
|
import lombok.RequiredArgsConstructor;
|
||||||
import lombok.extern.slf4j.Slf4j;
|
import lombok.extern.slf4j.Slf4j;
|
||||||
import org.springframework.web.bind.annotation.GetMapping;
|
import org.springframework.web.bind.annotation.GetMapping;
|
||||||
import org.springframework.web.bind.annotation.PostMapping;
|
import org.springframework.web.bind.annotation.PostMapping;
|
||||||
@ -24,7 +28,9 @@ import java.util.Map;
|
|||||||
*/
|
*/
|
||||||
@Slf4j
|
@Slf4j
|
||||||
@RestController
|
@RestController
|
||||||
|
@RequiredArgsConstructor
|
||||||
public class TestController {
|
public class TestController {
|
||||||
|
private final UserService userService;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 测试方法 GET
|
* 测试方法 GET
|
||||||
@ -49,13 +55,23 @@ public class TestController {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@GetMapping("/json")
|
@GetMapping("/json")
|
||||||
public ApiResponse jsonException() {
|
public ApiResponse<?> jsonException() {
|
||||||
throw new JsonException(Status.UNKNOWN_ERROR);
|
throw new JsonException(Status.UNKNOWN_ERROR);
|
||||||
}
|
}
|
||||||
|
|
||||||
@GetMapping("/page")
|
@GetMapping("/page")
|
||||||
public ApiResponse PageException() {
|
public ApiResponse<?> PageException() {
|
||||||
throw new PageException(Status.UNKNOWN_ERROR);
|
throw new PageException(Status.UNKNOWN_ERROR);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@GetMapping("/testPage")
|
||||||
|
public ApiResponse<PageResult<?>> testPage() {
|
||||||
|
PageResult<?> pageResult = new PageResult<>(1, 1, 10, null);
|
||||||
|
return ApiResponse.ofSuccess(pageResult);
|
||||||
|
}
|
||||||
|
|
||||||
|
@GetMapping("/users")
|
||||||
|
public ApiResponse<PageResult<UserVO>> usersPage() {
|
||||||
|
return userService.getUserList();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -30,7 +30,7 @@ public class GlobalExceptionHandler {
|
|||||||
*/
|
*/
|
||||||
@ExceptionHandler(Exception.class)
|
@ExceptionHandler(Exception.class)
|
||||||
@ResponseBody
|
@ResponseBody
|
||||||
public ApiResponse jsonErrorHandler(JsonException e) {
|
public ApiResponse<?> jsonErrorHandler(JsonException e) {
|
||||||
log.error(e.getMessage());
|
log.error(e.getMessage());
|
||||||
return ApiResponse.ofException(e);
|
return ApiResponse.ofException(e);
|
||||||
}
|
}
|
||||||
|
|||||||
@ -13,7 +13,7 @@ import lombok.Data;
|
|||||||
* @since 2025/6/5
|
* @since 2025/6/5
|
||||||
*/
|
*/
|
||||||
@Data
|
@Data
|
||||||
public class ApiResponse {
|
public class ApiResponse<T> {
|
||||||
/**
|
/**
|
||||||
* 状态码
|
* 状态码
|
||||||
*/
|
*/
|
||||||
@ -55,8 +55,8 @@ public class ApiResponse {
|
|||||||
* @param data 返回数据
|
* @param data 返回数据
|
||||||
* @return ApiResponse
|
* @return ApiResponse
|
||||||
*/
|
*/
|
||||||
public static ApiResponse of(Integer code, String message, Object data) {
|
public static <T> ApiResponse<T> of(Integer code, String message, T data) {
|
||||||
return new ApiResponse(code, message, data);
|
return new ApiResponse<>(code, message, data);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -65,7 +65,7 @@ public class ApiResponse {
|
|||||||
* @param data 返回数据
|
* @param data 返回数据
|
||||||
* @return ApiResponse
|
* @return ApiResponse
|
||||||
*/
|
*/
|
||||||
public static ApiResponse ofSuccess(Object data) {
|
public static <T> ApiResponse<T> ofSuccess(T data) {
|
||||||
return ofStatus(Status.OK, data);
|
return ofStatus(Status.OK, data);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -75,8 +75,8 @@ public class ApiResponse {
|
|||||||
* @param message 返回内容
|
* @param message 返回内容
|
||||||
* @return ApiResponse
|
* @return ApiResponse
|
||||||
*/
|
*/
|
||||||
public static ApiResponse ofMessage(String message) {
|
public static ApiResponse<Void> ofMessage(String message) {
|
||||||
return ofStatus(Status.OK, message);
|
return of(Status.OK.getCode(), message, null);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -85,10 +85,9 @@ public class ApiResponse {
|
|||||||
* @param status 状态{@link Status}
|
* @param status 状态{@link Status}
|
||||||
* @return ApiResponse
|
* @return ApiResponse
|
||||||
*/
|
*/
|
||||||
public static ApiResponse ofStatus(Status status) {
|
public static <T> ApiResponse<T> ofStatus(Status status) {
|
||||||
return ofStatus(status, null);
|
return ofStatus(status, null);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 构造一个有状态且带数据的Api返回
|
* 构造一个有状态且带数据的Api返回
|
||||||
*
|
*
|
||||||
@ -96,11 +95,10 @@ public class ApiResponse {
|
|||||||
* @param data 返回数据
|
* @param data 返回数据
|
||||||
* @return ApiResponse
|
* @return ApiResponse
|
||||||
*/
|
*/
|
||||||
public static ApiResponse ofStatus(Status status, Object data) {
|
public static <T> ApiResponse<T> ofStatus(Status status, T data) {
|
||||||
return of(status.getCode(), status.getMessage(), data);
|
return of(status.getCode(), status.getMessage(), data);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 构造一个异常且带数据的Api返回
|
* 构造一个异常且带数据的Api返回
|
||||||
*
|
*
|
||||||
@ -109,7 +107,7 @@ public class ApiResponse {
|
|||||||
* @return ApiResponse
|
* @return ApiResponse
|
||||||
* @param <T> {@link BaseException} 子类
|
* @param <T> {@link BaseException} 子类
|
||||||
*/
|
*/
|
||||||
public static <T extends BaseException> ApiResponse ofException(T t, Object data) {
|
public static <T extends BaseException> ApiResponse<T> ofException(T t, T data) {
|
||||||
return of(t.getCode(), t.getMessage(), data);
|
return of(t.getCode(), t.getMessage(), data);
|
||||||
}
|
}
|
||||||
/**
|
/**
|
||||||
@ -119,7 +117,7 @@ public class ApiResponse {
|
|||||||
* @return ApiResponse
|
* @return ApiResponse
|
||||||
* @param <T> {@link BaseException} 子类
|
* @param <T> {@link BaseException} 子类
|
||||||
*/
|
*/
|
||||||
public static <T extends BaseException> ApiResponse ofException(T t) {
|
public static <T extends BaseException> ApiResponse<T> ofException(T t) {
|
||||||
return ofException(t, null);
|
return ofException(t, null);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
80
src/main/java/asia/yulinling/workflow/model/PageResult.java
Normal file
80
src/main/java/asia/yulinling/workflow/model/PageResult.java
Normal file
@ -0,0 +1,80 @@
|
|||||||
|
package asia.yulinling.workflow.model;
|
||||||
|
|
||||||
|
import lombok.Data;
|
||||||
|
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 分页返回结果
|
||||||
|
*
|
||||||
|
* @author YLL
|
||||||
|
* @since 2025/6/8
|
||||||
|
*/
|
||||||
|
@Data
|
||||||
|
public class PageResult<T> {
|
||||||
|
private long total; // 总记录数
|
||||||
|
private int totalPage; // 总页数
|
||||||
|
private int currentPage; // 当前页码
|
||||||
|
private int pageSize; // 每页数量
|
||||||
|
private List<T> list; // 当前页数据
|
||||||
|
|
||||||
|
private boolean hasNext; // 是否有下一页
|
||||||
|
private boolean hasPrev; // 是否有上一页
|
||||||
|
private boolean firstPage; // 是否是首页
|
||||||
|
private boolean lastPage; // 是否是尾页
|
||||||
|
private int navigatePages; // 导航页码数,如:显示5个页码 [1,2,3,4,5]
|
||||||
|
private int[] navigatePageNums; // 导航页码数组
|
||||||
|
private int from; // 当前页第一条数据在总数据中的位置(从1开始)
|
||||||
|
private int to; // 当前页最后一条数据在总数据中的位置
|
||||||
|
|
||||||
|
// 构造方法(可选传参)
|
||||||
|
public PageResult(long total, int currentPage, int pageSize, List<T> list) {
|
||||||
|
this.total = total;
|
||||||
|
this.currentPage = currentPage;
|
||||||
|
this.pageSize = pageSize;
|
||||||
|
this.list = list;
|
||||||
|
|
||||||
|
// 自动计算
|
||||||
|
this.totalPage = (int) Math.ceil((double) total / pageSize);
|
||||||
|
this.hasNext = currentPage < totalPage;
|
||||||
|
this.hasPrev = currentPage > 1;
|
||||||
|
this.firstPage = currentPage == 1;
|
||||||
|
this.lastPage = currentPage == totalPage;
|
||||||
|
this.from = (currentPage - 1) * pageSize + 1;
|
||||||
|
this.to = Math.min(currentPage * pageSize, (int) total);
|
||||||
|
|
||||||
|
// 可选:导航页码生成逻辑(需要时可扩展)
|
||||||
|
navigatePageNums = calculateNavigatePageNumbers(currentPage, totalPage, navigatePages);
|
||||||
|
}
|
||||||
|
|
||||||
|
private int[] calculateNavigatePageNumbers(int currentPage, int totalPage, int navigatePages) {
|
||||||
|
int[] navigatePageNums;
|
||||||
|
int startPage = 1;
|
||||||
|
int endPage = totalPage;
|
||||||
|
|
||||||
|
// 中间页码计算逻辑
|
||||||
|
if (totalPage > navigatePages) {
|
||||||
|
int half = navigatePages / 2;
|
||||||
|
startPage = currentPage - half;
|
||||||
|
endPage = currentPage + half;
|
||||||
|
|
||||||
|
if (startPage < 1) {
|
||||||
|
startPage = 1;
|
||||||
|
endPage = navigatePages;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (endPage > totalPage) {
|
||||||
|
endPage = totalPage;
|
||||||
|
startPage = endPage - navigatePages + 1;
|
||||||
|
if (startPage < 1) startPage = 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
navigatePageNums = new int[endPage - startPage + 1];
|
||||||
|
for (int i = 0; i < navigatePageNums.length; i++) {
|
||||||
|
navigatePageNums[i] = startPage + i;
|
||||||
|
}
|
||||||
|
|
||||||
|
return navigatePageNums;
|
||||||
|
}
|
||||||
|
}
|
||||||
@ -0,0 +1,34 @@
|
|||||||
|
package asia.yulinling.workflow.model.vo.user;
|
||||||
|
|
||||||
|
import lombok.Data;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* <p>
|
||||||
|
* 用户信息VO
|
||||||
|
* </p>
|
||||||
|
*
|
||||||
|
* @author YLL
|
||||||
|
* @since 2025/6/8
|
||||||
|
*/
|
||||||
|
@Data
|
||||||
|
public class UserVO {
|
||||||
|
/**
|
||||||
|
* 用户名
|
||||||
|
*/
|
||||||
|
private String name;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 邮箱
|
||||||
|
*/
|
||||||
|
private String email;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 手机号
|
||||||
|
*/
|
||||||
|
private String phone;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 状态 -1:删除 0:警用 1:启用
|
||||||
|
*/
|
||||||
|
private Integer status;
|
||||||
|
}
|
||||||
@ -0,0 +1,23 @@
|
|||||||
|
package asia.yulinling.workflow.service;
|
||||||
|
|
||||||
|
import asia.yulinling.workflow.model.ApiResponse;
|
||||||
|
import asia.yulinling.workflow.model.PageResult;
|
||||||
|
import asia.yulinling.workflow.model.entity.User;
|
||||||
|
import asia.yulinling.workflow.model.vo.user.UserVO;
|
||||||
|
import org.springframework.transaction.annotation.Transactional;
|
||||||
|
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* <p>
|
||||||
|
* 用户接口
|
||||||
|
* </p>
|
||||||
|
*
|
||||||
|
* @author YLL
|
||||||
|
* @since 2025/6/8
|
||||||
|
*/
|
||||||
|
@Transactional
|
||||||
|
public interface UserService {
|
||||||
|
|
||||||
|
ApiResponse<PageResult<UserVO>> getUserList();
|
||||||
|
}
|
||||||
@ -0,0 +1,58 @@
|
|||||||
|
package asia.yulinling.workflow.service.impl;
|
||||||
|
|
||||||
|
import asia.yulinling.workflow.mapper.UserMapper;
|
||||||
|
import asia.yulinling.workflow.model.ApiResponse;
|
||||||
|
import asia.yulinling.workflow.model.PageResult;
|
||||||
|
import asia.yulinling.workflow.model.entity.User;
|
||||||
|
import asia.yulinling.workflow.model.vo.user.UserVO;
|
||||||
|
import asia.yulinling.workflow.service.UserService;
|
||||||
|
import cn.hutool.core.util.ArrayUtil;
|
||||||
|
import lombok.RequiredArgsConstructor;
|
||||||
|
import org.springframework.beans.BeanUtils;
|
||||||
|
import org.springframework.stereotype.Service;
|
||||||
|
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.Collections;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* <p>
|
||||||
|
* 用户接口
|
||||||
|
* </p>
|
||||||
|
*
|
||||||
|
* @author YLL
|
||||||
|
* @since 2025/6/8
|
||||||
|
*/
|
||||||
|
@Service
|
||||||
|
@RequiredArgsConstructor
|
||||||
|
public class UserServiceImpl implements UserService {
|
||||||
|
|
||||||
|
/** 注入用户Mapper */
|
||||||
|
private final UserMapper userMapper;
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public ApiResponse<PageResult<UserVO>> getUserList() {
|
||||||
|
|
||||||
|
List<UserVO> userVOList = new ArrayList<>();
|
||||||
|
|
||||||
|
List<User> users = userMapper.selectList(null);
|
||||||
|
|
||||||
|
if (ArrayUtil.isNotEmpty(users)) {
|
||||||
|
for (User user : users) {
|
||||||
|
UserVO userVO = new UserVO();
|
||||||
|
userVO.setName(user.getName());
|
||||||
|
userVO.setEmail(user.getEmail());
|
||||||
|
userVO.setPhone(user.getPhone());
|
||||||
|
userVO.setStatus(user.getStatus());
|
||||||
|
userVOList.add(userVO);
|
||||||
|
}
|
||||||
|
PageResult<UserVO> pageResult = new PageResult<>(
|
||||||
|
users.toArray().length, 1, users.toArray().length / 10, userVOList
|
||||||
|
);
|
||||||
|
|
||||||
|
return ApiResponse.ofSuccess(pageResult);
|
||||||
|
}
|
||||||
|
|
||||||
|
return ApiResponse.ofSuccess(null);
|
||||||
|
}
|
||||||
|
}
|
||||||
@ -0,0 +1,32 @@
|
|||||||
|
package asia.yulinling.workflow.service;
|
||||||
|
|
||||||
|
import asia.yulinling.workflow.WorkFlowMainTests;
|
||||||
|
import asia.yulinling.workflow.model.ApiResponse;
|
||||||
|
import asia.yulinling.workflow.model.PageResult;
|
||||||
|
import asia.yulinling.workflow.model.entity.User;
|
||||||
|
import asia.yulinling.workflow.model.vo.user.UserVO;
|
||||||
|
import org.junit.Assert;
|
||||||
|
import org.junit.Test;
|
||||||
|
import org.springframework.beans.factory.annotation.Autowired;
|
||||||
|
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* <p>
|
||||||
|
* 用户测试类
|
||||||
|
* </p>
|
||||||
|
*
|
||||||
|
* @author YLL
|
||||||
|
* @since 2025/6/8
|
||||||
|
*/
|
||||||
|
public class UserServiceTest extends WorkFlowMainTests {
|
||||||
|
@Autowired
|
||||||
|
private UserService userService;
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void getUserList() {
|
||||||
|
ApiResponse<PageResult<UserVO>> users =userService.getUserList();
|
||||||
|
|
||||||
|
Assert.assertEquals(200,users.getCode().intValue());
|
||||||
|
}
|
||||||
|
}
|
||||||
Loading…
Reference in New Issue
Block a user