Browse Source

人员接口

master
白凤吉 6 months ago
parent
commit
5b17d101c0
  1. 8
      sql/demo.sql
  2. 2
      src/main/java/com/qyft/gd/system/common/base/BaseEntity.java
  3. 24
      src/main/java/com/qyft/gd/system/common/enums/DeletedEnum.java
  4. 42
      src/main/java/com/qyft/gd/system/config/CorsConfig.java
  5. 16
      src/main/java/com/qyft/gd/system/config/MybatisPlusConfig.java
  6. 53
      src/main/java/com/qyft/gd/system/config/SwaggerConfig.java
  7. 61
      src/main/java/com/qyft/gd/system/controller/UserController.java
  8. 36
      src/main/java/com/qyft/gd/system/core/MyMetaObjectHandler.java
  9. 52
      src/main/java/com/qyft/gd/system/model/bo/UserBO.java
  10. 43
      src/main/java/com/qyft/gd/system/model/dto/UserAuthInfo.java
  11. 27
      src/main/java/com/qyft/gd/system/model/entity/User.java
  12. 19
      src/main/java/com/qyft/gd/system/model/form/RoleForm.java
  13. 34
      src/main/java/com/qyft/gd/system/model/form/UserForm.java
  14. 27
      src/main/java/com/qyft/gd/system/model/query/UserPageQuery.java
  15. 33
      src/main/java/com/qyft/gd/system/model/vo/UserInfoVO.java
  16. 38
      src/main/java/com/qyft/gd/system/model/vo/UserPageVO.java
  17. 9
      src/main/java/com/qyft/gd/system/service/UserService.java
  18. 20
      src/main/java/com/qyft/gd/system/service/impl/UserServiceImpl.java
  19. 2
      src/main/resources/application.yml

8
sql/demo.sql

@ -59,8 +59,8 @@ CREATE TABLE IF NOT EXISTS sys_user (
avatar TEXT,
role INTEGER,
is_deleted INTEGER DEFAULT 0,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
create_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
update_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
-- 插入测试数据
@ -76,8 +76,8 @@ CREATE TABLE IF NOT EXISTS sys_role (
id INTEGER PRIMARY KEY AUTOINCREMENT,
name TEXT NOT NULL,
code TEXT NOT NULL,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
create_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
update_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
-- 插入角色数据

2
src/main/java/com/qyft/gd/system/common/base/BaseEntity.java

@ -32,7 +32,6 @@ public class BaseEntity implements Serializable {
* 创建时间
*/
@TableField(fill = FieldFill.INSERT)
@JsonInclude(value = JsonInclude.Include.NON_NULL)
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
private LocalDateTime createTime;
@ -40,7 +39,6 @@ public class BaseEntity implements Serializable {
* 更新时间
*/
@TableField(fill = FieldFill.INSERT_UPDATE)
@JsonInclude(value = JsonInclude.Include.NON_NULL)
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
private LocalDateTime updateTime;

24
src/main/java/com/qyft/gd/system/common/enums/DeletedEnum.java

@ -0,0 +1,24 @@
package com.qyft.gd.system.common.enums;
import com.qyft.gd.system.common.base.IBaseEnum;
import lombok.Getter;
/**
* 删除状态枚举
*/
@Getter
public enum DeletedEnum implements IBaseEnum<Integer> {
ENABLE(1, "删除"),
DISABLE(0, "未删除");
private final Integer value;
private final String label;
DeletedEnum(Integer value, String label) {
this.value = value;
this.label = label;
}
}

42
src/main/java/com/qyft/gd/system/config/CorsConfig.java

@ -0,0 +1,42 @@
package com.qyft.gd.system.config;
import org.springframework.boot.web.servlet.FilterRegistrationBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.cors.CorsConfiguration;
import org.springframework.web.cors.UrlBasedCorsConfigurationSource;
import org.springframework.web.filter.CorsFilter;
import java.util.Collections;
/**
* CORS 资源共享配置
*
* @author haoxr
* @since 2023/4/17
*/
@Configuration
public class CorsConfig {
@Bean
public FilterRegistrationBean filterRegistrationBean() {
CorsConfiguration corsConfiguration = new CorsConfiguration();
//1.允许任何来源
corsConfiguration.setAllowedOriginPatterns(Collections.singletonList("*"));
//2.允许任何请求头
corsConfiguration.addAllowedHeader(CorsConfiguration.ALL);
//3.允许任何方法
corsConfiguration.addAllowedMethod(CorsConfiguration.ALL);
//4.允许凭证
corsConfiguration.setAllowCredentials(true);
UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();
source.registerCorsConfiguration("/**", corsConfiguration);
CorsFilter corsFilter = new CorsFilter(source);
FilterRegistrationBean<CorsFilter> filterRegistrationBean=new FilterRegistrationBean<>(corsFilter);
filterRegistrationBean.setOrder(-101);
return filterRegistrationBean;
}
}

16
src/main/java/com/qyft/gd/system/config/MybatisPlusConfig.java

@ -1,9 +1,11 @@
package com.qyft.gd.system.config;
import com.baomidou.mybatisplus.annotation.DbType;
import com.baomidou.mybatisplus.core.config.GlobalConfig;
import com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor;
import com.baomidou.mybatisplus.extension.plugins.inner.OptimisticLockerInnerInterceptor;
import com.baomidou.mybatisplus.extension.plugins.inner.PaginationInnerInterceptor;
import com.qyft.gd.system.core.MyMetaObjectHandler;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.transaction.annotation.EnableTransactionManagement;
@ -32,8 +34,8 @@ public class MybatisPlusConfig {
*/
public PaginationInnerInterceptor paginationInnerInterceptor() {
PaginationInnerInterceptor paginationInnerInterceptor = new PaginationInnerInterceptor();
// 设置数据库类型为mysql
paginationInnerInterceptor.setDbType(DbType.POSTGRE_SQL);
// 设置数据库类型
paginationInnerInterceptor.setDbType(DbType.SQLITE);
// 设置最大单页限制数量默认 500 -1 不受限制
paginationInnerInterceptor.setMaxLimit(-1L);
return paginationInnerInterceptor;
@ -46,4 +48,14 @@ public class MybatisPlusConfig {
public OptimisticLockerInnerInterceptor optimisticLockerInnerInterceptor() {
return new OptimisticLockerInnerInterceptor();
}
/**
* 自动填充数据库创建人创建时间更新人更新时间
*/
@Bean
public GlobalConfig globalConfig() {
GlobalConfig globalConfig = new GlobalConfig();
globalConfig.setMetaObjectHandler(new MyMetaObjectHandler());
return globalConfig;
}
}

53
src/main/java/com/qyft/gd/system/config/SwaggerConfig.java

@ -1,39 +1,52 @@
package com.qyft.gd.system.config;
import cn.hutool.core.util.ArrayUtil;
import cn.hutool.core.util.RandomUtil;
import io.swagger.v3.oas.models.Components;
import io.swagger.v3.oas.models.OpenAPI;
import io.swagger.v3.oas.models.info.Info;
import io.swagger.v3.oas.models.security.SecurityRequirement;
import io.swagger.v3.oas.models.security.SecurityScheme;
import org.springdoc.core.customizers.GlobalOpenApiCustomizer;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.http.HttpHeaders;
import org.springframework.util.AntPathMatcher;
import java.util.HashMap;
import java.util.Map;
import java.util.stream.Stream;
/***
* 创建Swagger配置
*/
@Configuration
public class SwaggerConfig {
/**
* 根据@Tag 上的排序写入x-order
* @return the global open api customizer
*/
@Bean
public GlobalOpenApiCustomizer orderGlobalOpenApiCustomizer() {
return openApi -> {
if (openApi.getTags()!=null){
openApi.getTags().forEach(tag -> {
Map<String,Object> map=new HashMap<>();
map.put("x-order", RandomUtil.randomInt(0,100));
tag.setExtensions(map);
// 全局添加Authorization
if (openApi.getPaths() != null) {
openApi.getPaths().forEach((path, pathItem) -> {
// 忽略认证的请求无需携带 Authorization
String[] ignoreUrls = {"/api/auth/login"};
if (ArrayUtil.isNotEmpty(ignoreUrls)) {
// Ant 匹配忽略的路径不添加Authorization
AntPathMatcher antPathMatcher = new AntPathMatcher();
if (Stream.of(ignoreUrls).anyMatch(ignoreUrl -> antPathMatcher.match(ignoreUrl, path))) {
return;
}
}
// 其他接口统一添加Authorization
pathItem.readOperations()
.forEach(operation ->
operation.addSecurityItem(new SecurityRequirement().addList(HttpHeaders.AUTHORIZATION))
);
});
}
if(openApi.getPaths()!=null){
openApi.addExtension("x-test123","333");
openApi.getPaths().addExtension("x-abb",RandomUtil.randomInt(1,100));
}
};
}
@ -42,7 +55,17 @@ public class SwaggerConfig {
return new OpenAPI()
.info(new Info()
.title("系统API")
.version("1.0"));
.version("1.0")) // 配置全局鉴权参数-Authorize
.components(new Components()
.addSecuritySchemes(HttpHeaders.AUTHORIZATION,
new SecurityScheme()
.name(HttpHeaders.AUTHORIZATION)
.type(SecurityScheme.Type.APIKEY)
.in(SecurityScheme.In.HEADER)
.scheme("Bearer")
.bearerFormat("JWT")
)
);
}

61
src/main/java/com/qyft/gd/system/controller/UserController.java

@ -0,0 +1,61 @@
package com.qyft.gd.system.controller;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.qyft.gd.system.common.base.BasePageQuery;
import com.qyft.gd.system.common.result.PageResult;
import com.qyft.gd.system.common.result.Result;
import com.qyft.gd.system.model.entity.User;
import com.qyft.gd.system.service.UserService;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.tags.Tag;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.*;
@Tag(name = "用户接口")
@RestController
@RequestMapping("/api/user")
@RequiredArgsConstructor
@Slf4j
public class UserController {
private final UserService userService;
@Operation(summary = "用户列表")
@GetMapping("/list")
public PageResult<User> getAllUsers(BasePageQuery pageQuery) {
IPage<User> result = userService.page(new Page<>(pageQuery.getPageNum(), pageQuery.getPageSize()), null);
return PageResult.success(result);
}
@Operation(summary = "添加新用户")
@PostMapping("/")
public Result<String> addUser(@RequestBody User user) {
boolean isSuccess = userService.addUser(user);
if (isSuccess) {
return Result.success();
}
return Result.failed();
}
@Operation(summary = "更新用户信息")
@PutMapping("/{id}")
public Result<String> updateUser(@PathVariable Long id, @RequestBody User user) {
user.setId(id);
boolean isSuccess = userService.updateUser(user);
if (isSuccess) {
return Result.success();
}
return Result.failed();
}
@Operation(summary = "删除用户")
@DeleteMapping("/{id}")
public Result<String> deleteUser(@PathVariable Long id) {
boolean isSuccess = userService.deleteUser(id);
if (isSuccess) {
return Result.success();
}
return Result.failed();
}
}

36
src/main/java/com/qyft/gd/system/core/MyMetaObjectHandler.java

@ -0,0 +1,36 @@
package com.qyft.gd.system.core;
import com.baomidou.mybatisplus.core.handlers.MetaObjectHandler;
import org.apache.ibatis.reflection.MetaObject;
import org.springframework.stereotype.Component;
import java.time.LocalDateTime;
/**
* mybatis-plus 字段自动填充
*/
@Component
public class MyMetaObjectHandler implements MetaObjectHandler {
/**
* 新增填充创建时间
*
* @param metaObject 元数据
*/
@Override
public void insertFill(MetaObject metaObject) {
this.strictInsertFill(metaObject, "createTime", LocalDateTime::now, LocalDateTime.class);
this.strictUpdateFill(metaObject, "updateTime", LocalDateTime::now, LocalDateTime.class);
}
/**
* 更新填充更新时间
*
* @param metaObject 元数据
*/
@Override
public void updateFill(MetaObject metaObject) {
this.strictUpdateFill(metaObject, "updateTime", LocalDateTime::now, LocalDateTime.class);
}
}

52
src/main/java/com/qyft/gd/system/model/bo/UserBO.java

@ -1,52 +0,0 @@
package com.qyft.gd.system.model.bo;
import lombok.Data;
import java.time.LocalDateTime;
/**
* 用户持久化对象
*/
@Data
public class UserBO {
/**
* 用户ID
*/
private Long id;
/**
* 账户名
*/
private String username;
/**
* 昵称
*/
private String nickname;
/**
* 性别(1->2->)
*/
private Integer gender;
/**
* 头像URL
*/
private String avatar;
/**
* 状态: 1->启用;0->禁用
*/
private Integer status;
/**
* 角色名称多个使用英文逗号(,)分割
*/
private String roleNames;
/**
* 创建时间
*/
private LocalDateTime createTime;
}

43
src/main/java/com/qyft/gd/system/model/dto/UserAuthInfo.java

@ -1,43 +0,0 @@
package com.qyft.gd.system.model.dto;
import lombok.Data;
import java.util.Set;
/**
* 用户认证信息
*/
@Data
public class UserAuthInfo {
/**
* 用户ID
*/
private Long userId;
/**
* 用户名
*/
private String username;
/**
* 昵称
*/
private String nickname;
/**
* 用户密码
*/
private String password;
/**
* 状态1:启用0:禁用
*/
private Integer status;
/**
* 用户所属的角色集合
*/
private Set<String> roles;
}

27
src/main/java/com/qyft/gd/system/model/entity/User.java

@ -2,44 +2,35 @@ package com.qyft.gd.system.model.entity;
import com.baomidou.mybatisplus.annotation.TableName;
import com.qyft.gd.system.common.base.BaseEntity;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Getter;
import lombok.Setter;
/**
* 用户实体
*/
@Schema(description = "用户基础信息")
@TableName("sys_user")
@Getter
@Setter
public class User extends BaseEntity {
/**
* 用户名
*/
@Schema(description = "用户名")
private String username;
/**
* 昵称
*/
@Schema(description = "昵称")
private String nickname;
/**
* 密码
*/
@Schema(description = "密码")
private String password;
/**
* 用户头像
*/
@Schema(description = "用户头像")
private String avatar;
/**
* 人员角色
*/
@Schema(description = "人员角色")
private Long role;
/**
* 是否删除(0- 1-)
*/
@Schema(description = "是否删除(0-否 1-是)")
private Integer isDeleted;
}

19
src/main/java/com/qyft/gd/system/model/form/RoleForm.java

@ -1,19 +0,0 @@
package com.qyft.gd.system.model.form;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
@Schema(description = "角色表单对象")
@Data
public class RoleForm {
@Schema(description = "角色ID")
private Long id;
@Schema(description = "角色名称")
private String name;
@Schema(description = "角色编码")
private String code;
}

34
src/main/java/com/qyft/gd/system/model/form/UserForm.java

@ -1,34 +0,0 @@
package com.qyft.gd.system.model.form;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
/**
* 用户表单对象
*/
@Schema(description = "用户表单对象")
@Data
public class UserForm {
@Schema(description = "用户ID")
private Long id;
@Schema(description = "用户名")
private String username;
@Schema(description = "昵称")
private String nickname;
@Schema(description = "性别")
private Integer gender;
@Schema(description = "用户头像")
private String avatar;
@Schema(description = "用户状态(1:正常;0:禁用)")
private Integer status;
@Schema(description = "角色ID")
private Long roleIds;
}

27
src/main/java/com/qyft/gd/system/model/query/UserPageQuery.java

@ -1,27 +0,0 @@
package com.qyft.gd.system.model.query;
import com.qyft.gd.system.common.base.BasePageQuery;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
import lombok.EqualsAndHashCode;
import java.util.List;
/**
* 用户分页查询对象
*/
@Data
@EqualsAndHashCode(callSuper = false)
@Schema(description = "用户分页查询对象")
public class UserPageQuery extends BasePageQuery {
@Schema(description = "关键字(用户名/昵称/手机号)")
private String keywords;
@Schema(description = "用户状态")
private Integer status;
@Schema(description = "角色ID")
private List<Long> roleIds;
}

33
src/main/java/com/qyft/gd/system/model/vo/UserInfoVO.java

@ -1,33 +0,0 @@
package com.qyft.gd.system.model.vo;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
import java.util.Set;
/**
* 用户登录视图对象
*/
@Schema(description ="当前登录用户视图对象")
@Data
public class UserInfoVO {
@Schema(description="用户ID")
private Long userId;
@Schema(description="用户名")
private String username;
@Schema(description="用户昵称")
private String nickname;
@Schema(description="头像地址")
private String avatar;
@Schema(description="用户角色编码集合")
private Set<String> roles;
@Schema(description="用户权限标识集合")
private Set<String> perms;
}

38
src/main/java/com/qyft/gd/system/model/vo/UserPageVO.java

@ -1,38 +0,0 @@
package com.qyft.gd.system.model.vo;
import com.fasterxml.jackson.annotation.JsonFormat;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
import java.time.LocalDateTime;
/**
* 用户分页视图对象
*/
@Schema(description = "用户分页对象")
@Data
public class UserPageVO {
@Schema(description = "用户ID")
private Long id;
@Schema(description = "用户名")
private String username;
@Schema(description = "用户昵称")
private String nickname;
@Schema(description = "性别")
private Integer gender;
@Schema(description = "用户状态(1:启用;0:禁用)")
private Integer status;
@Schema(description = "角色名称,多个使用英文逗号(,)分割")
private String roleNames;
@Schema(description = "创建时间")
@JsonFormat(pattern = "yyyy/MM/dd HH:mm")
private LocalDateTime createTime;
}

9
src/main/java/com/qyft/gd/system/service/UserService.java

@ -3,6 +3,8 @@ package com.qyft.gd.system.service;
import com.baomidou.mybatisplus.extension.service.IService;
import com.qyft.gd.system.model.entity.User;
import java.util.List;
/**
* 用户业务接口
*/
@ -10,4 +12,11 @@ public interface UserService extends IService<User> {
User findByUsername(String username);
boolean addUser(User user);
boolean updateUser(User user);
boolean deleteUser(Long userId);
}

20
src/main/java/com/qyft/gd/system/service/impl/UserServiceImpl.java

@ -1,6 +1,7 @@
package com.qyft.gd.system.service.impl;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.qyft.gd.system.common.enums.DeletedEnum;
import com.qyft.gd.system.mapper.UserMapper;
import com.qyft.gd.system.model.entity.User;
import com.qyft.gd.system.service.UserService;
@ -18,4 +19,23 @@ public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements Us
public User findByUsername(String username) {
return this.baseMapper.findByUsername(username);
}
@Override
public boolean addUser(User user) {
return this.baseMapper.insert(user) > 0;
}
@Override
public boolean updateUser(User user) {
return this.baseMapper.updateById(user) > 0;
}
@Override
public boolean deleteUser(Long userId) {
User user = new User();
user.setId(userId);
user.setIsDeleted(DeletedEnum.ENABLE.getValue());
return this.baseMapper.updateById(user) > 0;
}
}

2
src/main/resources/application.yml

@ -26,6 +26,8 @@ logging:
root: INFO
org.mybatis: DEBUG
springdoc:
default-flat-param-object: true
jwt:
enabled: false # 是否启用权限认证,设置为 true 启用,false 禁用
Loading…
Cancel
Save