Pārlūkot izejas kodu

# feat:用户模块的增删改查

yang yi 1 nedēļu atpakaļ
vecāks
revīzija
5e5a98d4fb

+ 4 - 2
build.gradle.kts

@@ -26,8 +26,10 @@ repositories {
 
 dependencies {
     implementation("org.springframework.boot:spring-boot-starter-actuator")
-    implementation("org.springframework.boot:spring-boot-starter-data-jpa")
-    implementation("org.springframework.boot:spring-boot-starter-security")
+    // Source: https://mvnrepository.com/artifact/com.baomidou/mybatis-plus-boot-starter
+    implementation ("com.baomidou:mybatis-plus-spring-boot3-starter:3.5.15")
+//    implementation("org.springframework.boot:spring-boot-starter-data-jpa")
+//    implementation("org.springframework.boot:spring-boot-starter-security")
     implementation("org.springframework.boot:spring-boot-starter-validation")
     implementation("org.springframework.boot:spring-boot-starter-web")
     implementation("org.springdoc:springdoc-openapi-starter-webmvc-ui:2.8.16")

+ 95 - 0
src/main/java/space/anyi/serve/controller/UserController.java

@@ -0,0 +1,95 @@
+package space.anyi.serve.controller;
+
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import jakarta.annotation.Resource;
+import org.springframework.beans.BeanUtils;
+import org.springframework.web.bind.annotation.*;
+import space.anyi.serve.entity.PageDto;
+import space.anyi.serve.entity.PageVo;
+import space.anyi.serve.entity.Response;
+import space.anyi.serve.entity.user.User;
+import space.anyi.serve.entity.user.UserDto;
+import space.anyi.serve.entity.user.UserQueryCondition;
+import space.anyi.serve.service.UserService;
+
+
+/**
+ * (User)表控制层
+ *
+ * @author 杨逸
+ * @since 2026-03-31 13:17:55
+ */
+@RestController
+@RequestMapping("user")
+public class UserController {
+    /**
+     * 服务对象
+     */
+    @Resource
+    private UserService userService;
+
+    /**
+     * 分页查询
+     *
+     * @param pageDto 条件分页
+     * @return 查询结果
+     */
+    @GetMapping
+    public Response<PageVo<User>> queryByPage(UserQueryCondition userQueryCondition,PageDto pageDto) {
+        User user = new User();
+        BeanUtils.copyProperties(userQueryCondition,user);
+        //PageRequest pageRequest = PageRequest.of(pageDto.getPageNum(), pageDto.getPageSize());
+        Page<User> page = this.userService.queryByPage(user, Page.of(pageDto.getPageNum(), pageDto.getPageSize()));
+        return Response.ok(PageVo.of(page));
+    }
+
+    /**
+     * 通过主键查询单条数据
+     *
+     * @param id 主键
+     * @return 单条数据
+     */
+    @GetMapping("{id}")
+    public Response<User> queryById(@PathVariable Long id) {
+        return Response.ok(this.userService.queryById(id));
+    }
+
+    /**
+     * 新增数据
+     *
+     * @param userDto 实体
+     * @return 新增结果
+     */
+    @PostMapping
+    public Response<User> add(@RequestBody UserDto userDto) {
+        User user = new User();
+        BeanUtils.copyProperties(userDto,user);
+        return Response.ok(this.userService.insert(user));
+    }
+
+    /**
+     * 编辑数据
+     *
+     * @param userDto 实体
+     * @return 编辑结果
+     */
+    @PutMapping
+    public Response<User> edit(UserDto userDto) {
+        User user = new User();
+        BeanUtils.copyProperties(userDto,user);
+        return Response.ok(this.userService.update(user));
+    }
+
+    /**
+     * 删除数据
+     *
+     * @param id 主键
+     * @return 删除是否成功
+     */
+    @DeleteMapping
+    public Response<Boolean> deleteById(Long id) {
+        return Response.ok(this.userService.deleteById(id));
+    }
+
+}
+

+ 31 - 0
src/main/java/space/anyi/serve/entity/PageDto.java

@@ -0,0 +1,31 @@
+package space.anyi.serve.entity;
+
+/**
+ * @fileName: PageDto
+ * @projectName: serve
+ * @package: space.anyi.serve.entity
+ * @author: 杨逸
+ * @date:2026/3/31 22:16
+ * @description:
+ */
+public final class PageDto {
+    private int pageNum = 1;
+    private int pageSize = 0;
+
+
+    public int getPageNum() {
+        return pageNum;
+    }
+
+    public void setPageNum(int pageNum) {
+        this.pageNum = pageNum;
+    }
+
+    public int getPageSize() {
+        return pageSize;
+    }
+
+    public void setPageSize(int pageSize) {
+        this.pageSize = pageSize;
+    }
+}

+ 36 - 0
src/main/java/space/anyi/serve/entity/PageVo.java

@@ -0,0 +1,36 @@
+package space.anyi.serve.entity;
+
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+
+/**
+ * @fileName: PageVo
+ * @projectName: serve
+ * @package: space.anyi.serve.entity
+ * @author: 杨逸
+ * @date:2026/3/31 22:35
+ * @description:
+ */
+public final class PageVo<T> {
+    private final Long total;
+    private final T data;
+
+    public PageVo(Long total, T data) {
+        this.total = total;
+        this.data = data;
+    }
+
+    public static <T> PageVo<T> of(Page<T> page) {
+        return new PageVo(page.getTotal(), page.getRecords());
+    }
+
+
+    public Long getTotal() {
+        return total;
+    }
+
+
+    public T getData() {
+        return data;
+    }
+
+}

+ 94 - 0
src/main/java/space/anyi/serve/entity/Response.java

@@ -0,0 +1,94 @@
+package space.anyi.serve.entity;
+
+/**
+ * @fileName: Response
+ * @projectName: serve
+ * @package: space.anyi.serve.entity
+ * @author: 杨逸
+ * @date:2026/4/1 9:03
+ * @description:
+ */
+public final class Response<T> {
+    public static final Integer SUCCESS_CODE = 200;
+    public static final Integer ERROR_CODE = 200;
+
+    private Integer code;
+    private String message;
+    private T data;
+
+    public Integer getCode() {
+        return code;
+    }
+
+    public void setCode(Integer code) {
+        this.code = code;
+    }
+
+    public String getMessage() {
+        return message;
+    }
+
+    public void setMessage(String message) {
+        this.message = message;
+    }
+
+    public T getData() {
+        return data;
+    }
+
+    public void setData(T data) {
+        this.data = data;
+    }
+
+    /**
+     * 成功的封装
+     * @param data 数据
+     * @return {@code Response<T> }
+     * @description:
+     * @author: 杨逸
+     * @data:2026/04/01 09:09:45
+     * @since 1.0.0
+     */
+    public static <T> Response<T> ok(T data){
+        Response<T> response = new Response<>();
+        response.setCode(SUCCESS_CODE);
+        response.setMessage("success");
+        response.setData(data);
+        return response;
+    }
+
+    /**
+     * 失败的封装
+     * @param message 错误信息
+     * @return {@code Response<T> }
+     * @description:
+     * @author: 杨逸
+     * @data:2026/04/01 09:09:51
+     * @since 1.0.0
+     */
+    public static <T> Response<T> error(String message){
+        Response<T> response = new Response<>();
+        response.setCode(ERROR_CODE);
+        response.setMessage(message);
+        return response;
+    }
+
+    /**
+     * 自定义封装
+     * @param code 状态码
+     * @param message 信息
+     * @param data 数据
+     * @return {@code Response<T> }
+     * @description:
+     * @author: 杨逸
+     * @data:2026/04/01 09:12:31
+     * @since 1.0.0
+     */
+    public static <T> Response<T> of(Integer code,String message,T data){
+        Response<T> response = new Response<>();
+        response.setCode(code);
+        response.setMessage(message);
+        response.setData(data);
+        return response;
+    }
+}

+ 99 - 0
src/main/java/space/anyi/serve/entity/user/User.java

@@ -0,0 +1,99 @@
+package space.anyi.serve.entity.user;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+
+/**
+ * @fileName: User
+ * @projectName: serve
+ * @package: space.anyi.serve.entity.user
+ * @author: 杨逸
+ * @date:2026/3/31 12:50
+ * @description:
+ */
+//指定表名
+@TableName("dev.user")
+public class User {
+    //声明主键
+    @TableId(type = IdType.AUTO)
+    private Long id;
+    private String account;
+    @TableField(value = "password")
+    private String password;
+    @TableField(value = "username")
+    private String username;
+    @TableField(value = "role")
+    private String role;
+    @TableField(value = "avatar")
+    private String avatar;
+    @TableField(value = "enable")
+    private Integer enable = 1;
+    @TableField(value = "delete_flag")
+    private Integer deleteFlag = 0;
+
+    public Long getId() {
+        return id;
+    }
+
+    public void setId(Long id) {
+        this.id = id;
+    }
+
+    public String getAccount() {
+        return account;
+    }
+
+    public void setAccount(String account) {
+        this.account = account;
+    }
+
+    public String getPassword() {
+        return password;
+    }
+
+    public void setPassword(String password) {
+        this.password = password;
+    }
+
+    public String getUsername() {
+        return username;
+    }
+
+    public void setUsername(String username) {
+        this.username = username;
+    }
+
+    public String getRole() {
+        return role;
+    }
+
+    public void setRole(String role) {
+        this.role = role;
+    }
+
+    public String getAvatar() {
+        return avatar;
+    }
+
+    public void setAvatar(String avatar) {
+        this.avatar = avatar;
+    }
+
+    public Integer getEnable() {
+        return enable;
+    }
+
+    public void setEnable(Integer enable) {
+        this.enable = enable;
+    }
+
+    public Integer getDeleteFlag() {
+        return deleteFlag;
+    }
+
+    public void setDeleteFlag(Integer deleteFlag) {
+        this.deleteFlag = deleteFlag;
+    }
+}

+ 48 - 0
src/main/java/space/anyi/serve/entity/user/UserDto.java

@@ -0,0 +1,48 @@
+package space.anyi.serve.entity.user;
+
+/**
+ * @fileName: UserDto
+ * @projectName: serve
+ * @package: space.anyi.serve.entity.user
+ * @author: 杨逸
+ * @date:2026/3/31 20:42
+ * @description:
+ */
+public class UserDto {
+    private Long id;
+    private String account;
+    private String password;
+    private String username;
+
+    public Long getId() {
+        return id;
+    }
+
+    public void setId(Long id) {
+        this.id = id;
+    }
+
+    public String getAccount() {
+        return account;
+    }
+
+    public void setAccount(String account) {
+        this.account = account;
+    }
+
+    public String getPassword() {
+        return password;
+    }
+
+    public void setPassword(String password) {
+        this.password = password;
+    }
+
+    public String getUsername() {
+        return username;
+    }
+
+    public void setUsername(String username) {
+        this.username = username;
+    }
+}

+ 48 - 0
src/main/java/space/anyi/serve/entity/user/UserQueryCondition.java

@@ -0,0 +1,48 @@
+package space.anyi.serve.entity.user;
+
+/**
+ * @fileName: UserQueryCondition
+ * @projectName: serve
+ * @package: space.anyi.serve.entity.user
+ * @author: 杨逸
+ * @date:2026/4/1 8:56
+ * @description:
+ */
+public class UserQueryCondition {
+    private String account;
+    private String username;
+    private String role = "user";
+    private Boolean enable = true;
+
+    public String getAccount() {
+        return account;
+    }
+
+    public void setAccount(String account) {
+        this.account = account;
+    }
+
+    public String getUsername() {
+        return username;
+    }
+
+    public void setUsername(String username) {
+        this.username = username;
+    }
+
+    public String getRole() {
+        return role;
+    }
+
+    public void setRole(String role) {
+        this.role = role;
+    }
+
+    public Boolean getEnable() {
+        return enable;
+    }
+
+    public void setEnable(Boolean enable) {
+        this.enable = enable;
+    }
+}

+ 58 - 0
src/main/java/space/anyi/serve/entity/user/UserVo.java

@@ -0,0 +1,58 @@
+package space.anyi.serve.entity.user;
+
+
+/**
+ * @fileName: UserVo
+ * @projectName: serve
+ * @package: space.anyi.serve.entity.user
+ * @author: 杨逸
+ * @date:2026/4/1 8:54
+ * @description:
+ */
+public class UserVo {
+    private Long id;
+    private String account;
+    private String username;
+    private String role;
+    private String avatar;
+
+    public Long getId() {
+        return id;
+    }
+
+    public void setId(Long id) {
+        this.id = id;
+    }
+
+    public String getAccount() {
+        return account;
+    }
+
+    public void setAccount(String account) {
+        this.account = account;
+    }
+
+    public String getUsername() {
+        return username;
+    }
+
+    public void setUsername(String username) {
+        this.username = username;
+    }
+
+    public String getRole() {
+        return role;
+    }
+
+    public void setRole(String role) {
+        this.role = role;
+    }
+
+    public String getAvatar() {
+        return avatar;
+    }
+
+    public void setAvatar(String avatar) {
+        this.avatar = avatar;
+    }
+}

+ 9 - 0
src/main/java/space/anyi/serve/mapper/UserMapper.java

@@ -0,0 +1,9 @@
+package space.anyi.serve.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import org.apache.ibatis.annotations.Mapper;
+import space.anyi.serve.entity.user.User;
+
+@Mapper
+public interface UserMapper extends BaseMapper<User> {
+}

+ 56 - 0
src/main/java/space/anyi/serve/service/UserService.java

@@ -0,0 +1,56 @@
+package space.anyi.serve.service;
+
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.baomidou.mybatisplus.extension.service.IService;
+import space.anyi.serve.entity.user.User;
+
+/**
+ * (User)表服务接口
+ *
+ * @author 杨逸
+ * @since 2026-03-31 13:17:55
+ */
+public interface UserService extends IService<User> {
+
+    /**
+     * 通过ID查询单条数据
+     *
+     * @param id 主键
+     * @return 实例对象
+     */
+    User queryById(Long id);
+
+    /**
+     * 分页查询
+     *
+     * @param user 筛选条件
+     * @param page      分页对象
+     * @return 查询结果
+     */
+    Page<User> queryByPage(User user,Page<User> page);
+
+    /**
+     * 新增数据
+     *
+     * @param user 实例对象
+     * @return 实例对象
+     */
+    User insert(User user);
+
+    /**
+     * 修改数据
+     *
+     * @param user 实例对象
+     * @return 实例对象
+     */
+    User update(User user);
+
+    /**
+     * 通过主键删除数据
+     *
+     * @param id 主键
+     * @return 是否成功
+     */
+    boolean deleteById(Long id);
+
+}

+ 86 - 0
src/main/java/space/anyi/serve/service/impl/UserServiceImpl.java

@@ -0,0 +1,86 @@
+package space.anyi.serve.service.impl;
+
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import org.springframework.stereotype.Service;
+import space.anyi.serve.entity.user.User;
+import space.anyi.serve.mapper.UserMapper;
+import space.anyi.serve.service.UserService;
+
+import java.util.Objects;
+
+
+/**
+ * (User)表服务实现类
+ *
+ * @author 杨逸
+ * @since 2026-03-31 13:17:55
+ */
+@Service("userService")
+public class UserServiceImpl extends ServiceImpl<UserMapper,User> implements UserService {
+
+    /**
+     * 通过ID查询单条数据
+     *
+     * @param id 主键
+     * @return 实例对象
+     */
+    @Override
+    public User queryById(Long id) {
+        return getById(id);
+    }
+
+    /**
+     * 分页查询
+     *
+     * @param user 筛选条件
+     * @param page      分页对象
+     * @return 查询结果
+     */
+    @Override
+    public Page<User> queryByPage(User user,Page<User> page) {
+        LambdaQueryWrapper<User> lambdaQueryWrapper = new LambdaQueryWrapper<User>()
+                .eq(Objects.nonNull(user.getRole()),User::getRole,user.getRole())
+                .eq(Objects.nonNull(user.getAccount()),User::getAccount,user.getAccount())
+                .eq(Objects.nonNull(user.getEnable()),User::getEnable,user.getEnable())
+                .like(Objects.nonNull(user.getUsername()), User::getUsername, user.getUsername());
+        page(page, lambdaQueryWrapper);
+        return page;
+    }
+
+    /**
+     * 新增数据
+     *
+     * @param user 实例对象
+     * @return 实例对象
+     */
+    @Override
+    public User insert(User user) {
+        save(user);
+        return user;
+    }
+
+    /**
+     * 修改数据
+     *
+     * @param user 实例对象
+     * @return 实例对象
+     */
+    @Override
+    public User update(User user) {
+        update(user);
+        return user;
+    }
+
+    /**
+     * 通过主键删除数据
+     *
+     * @param id 主键
+     * @return 是否成功
+     */
+    @Override
+    public boolean deleteById(Long id) {
+        return deleteById(id);
+    }
+}

+ 23 - 1
src/main/resources/application.yaml

@@ -4,11 +4,33 @@ server:
 spring:
   application:
     name: serve
+    admin:
+      enabled: true
   datasource:
     type: com.alibaba.druid.pool.DruidDataSource
-    url: jdbc:postgresql://${databaseHost}:5432/postgres?useUnicode=true&characterEncoding=utf-8&useSSL=false&serverTimezone=UTC+8
+    url: jdbc:postgresql://${databaseHost}:5432/serve?currentSchema=dev&useUnicode=true&characterEncoding=utf-8&useSSL=false&serverTimezone=UTC+8
     driver-class-name: org.postgresql.Driver
     username: ${databaseUsername}
     password: ${databasePassword}
     druid:
       enable: true
+  jmx:
+    enabled: true
+#配置全局loglevel 为debug
+logging:
+  level:
+    root: info
+mybatis-plus:
+  configuration:
+    log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
+  global-config:
+    db-config:
+      logic-delete-field: deleteFlag
+management:
+  endpoints:
+    web:
+      exposure:
+        include: "*"
+  endpoint:
+    health:
+      show-details: always

+ 4 - 0
src/main/resources/mapper/UserMapper.xml

@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd" >
+<mapper namespace="space.anyi.serve.mapper.UserMapper">
+</mapper>