diff --git a/sop-admin/sop-admin-backend/backend-boot/src/test/java/com/gitee/sop/adminbackend/service/PasswordTest.java b/sop-admin/sop-admin-backend/backend-boot/src/test/java/com/gitee/sop/adminbackend/service/PasswordTest.java index cede3601..775e89b5 100644 --- a/sop-admin/sop-admin-backend/backend-boot/src/test/java/com/gitee/sop/adminbackend/service/PasswordTest.java +++ b/sop-admin/sop-admin-backend/backend-boot/src/test/java/com/gitee/sop/adminbackend/service/PasswordTest.java @@ -2,7 +2,7 @@ package com.gitee.sop.adminbackend.service; import com.gitee.sop.adminbackend.BaseTest; import com.gitee.sop.adminbackend.dao.entity.SysAdminUser; -import com.gitee.sop.adminbackend.service.sys.SysAdminUserService; +import com.gitee.sop.adminbackend.service.sys.SysUserService; import org.apache.commons.codec.digest.DigestUtils; import org.junit.jupiter.api.Test; import org.springframework.security.crypto.bcrypt.BCrypt; @@ -16,7 +16,7 @@ import org.springframework.beans.factory.annotation.Autowired; public class PasswordTest extends BaseTest { @Autowired - SysAdminUserService sysAdminUserService; + SysUserService sysAdminUserService; /** * 重置admin密码 diff --git a/sop-admin/sop-admin-backend/backend-common/src/main/java/com/gitee/sop/adminbackend/common/dto/IdsDTO.java b/sop-admin/sop-admin-backend/backend-common/src/main/java/com/gitee/sop/adminbackend/common/dto/IdsDTO.java new file mode 100644 index 00000000..487b3a07 --- /dev/null +++ b/sop-admin/sop-admin-backend/backend-common/src/main/java/com/gitee/sop/adminbackend/common/dto/IdsDTO.java @@ -0,0 +1,13 @@ +package com.gitee.sop.adminbackend.common.dto; + +import lombok.Data; + +import java.util.List; + +/** + * @author 六如 + */ +@Data +public class IdsDTO { + private List ids; +} diff --git a/sop-admin/sop-admin-backend/backend-common/src/main/java/com/gitee/sop/adminbackend/common/dto/StatusUpdateBatchDTO.java b/sop-admin/sop-admin-backend/backend-common/src/main/java/com/gitee/sop/adminbackend/common/dto/StatusUpdateBatchDTO.java new file mode 100644 index 00000000..15406099 --- /dev/null +++ b/sop-admin/sop-admin-backend/backend-common/src/main/java/com/gitee/sop/adminbackend/common/dto/StatusUpdateBatchDTO.java @@ -0,0 +1,16 @@ +package com.gitee.sop.adminbackend.common.dto; + +import lombok.Data; + +import javax.validation.constraints.NotNull; + +/** + * @author 六如 + */ +@Data +public class StatusUpdateBatchDTO extends IdsDTO { + + @NotNull(message = "状态不能为空") + private Integer status; + +} diff --git a/sop-admin/sop-admin-backend/backend-common/src/main/java/com/gitee/sop/adminbackend/common/jackson/convert/annotation/Bool.java b/sop-admin/sop-admin-backend/backend-common/src/main/java/com/gitee/sop/adminbackend/common/jackson/convert/annotation/Bool.java new file mode 100644 index 00000000..a2b3d545 --- /dev/null +++ b/sop-admin/sop-admin-backend/backend-common/src/main/java/com/gitee/sop/adminbackend/common/jackson/convert/annotation/Bool.java @@ -0,0 +1,25 @@ +package com.gitee.sop.adminbackend.common.jackson.convert.annotation; + + +import com.fasterxml.jackson.annotation.JacksonAnnotationsInside; +import com.fasterxml.jackson.databind.annotation.JsonDeserialize; +import com.fasterxml.jackson.databind.annotation.JsonSerialize; +import com.gitee.sop.adminbackend.common.jackson.convert.serde.BoolDeserializer; +import com.gitee.sop.adminbackend.common.jackson.convert.serde.BoolSerializer; + +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; + +/** + * 序列化自动转换成boolean值,反序列化转换成数字 + * @author 六如 + */ +@Retention(RetentionPolicy.RUNTIME) +@Target(ElementType.FIELD) +@JacksonAnnotationsInside +@JsonSerialize(using = BoolSerializer.class) +@JsonDeserialize(using = BoolDeserializer.class) +public @interface Bool { +} diff --git a/sop-admin/sop-admin-backend/backend-common/src/main/java/com/gitee/sop/adminbackend/common/jackson/convert/serde/BoolDeserializer.java b/sop-admin/sop-admin-backend/backend-common/src/main/java/com/gitee/sop/adminbackend/common/jackson/convert/serde/BoolDeserializer.java new file mode 100644 index 00000000..b80bf62d --- /dev/null +++ b/sop-admin/sop-admin-backend/backend-common/src/main/java/com/gitee/sop/adminbackend/common/jackson/convert/serde/BoolDeserializer.java @@ -0,0 +1,44 @@ +package com.gitee.sop.adminbackend.common.jackson.convert.serde; + +import com.fasterxml.jackson.core.JsonParser; +import com.fasterxml.jackson.databind.DeserializationContext; +import com.fasterxml.jackson.databind.deser.std.StdDeserializer; +import lombok.extern.slf4j.Slf4j; + +import java.io.IOException; +import java.util.Objects; + +/** + *
+ * {@literal
+ * 将布尔值类型转换成数字
+ *
+ * @IntBool
+ * private Integer isLoading;
+ * }
+ * 
+ * + * @author 六如 + */ +@Slf4j +public class BoolDeserializer extends StdDeserializer { + private static final long serialVersionUID = -4993230470571124275L; + + private static final String TRUE = "true"; + + + public BoolDeserializer() { + this(null); + } + + protected BoolDeserializer(final Class vc) { + super(vc); + } + + + @Override + public Object deserialize(final JsonParser p, final DeserializationContext ctxt) throws IOException { + String text = p.getText(); + return Objects.equals(TRUE, text) ? 1 : 0; + } +} diff --git a/sop-admin/sop-admin-backend/backend-common/src/main/java/com/gitee/sop/adminbackend/common/jackson/convert/serde/BoolSerializer.java b/sop-admin/sop-admin-backend/backend-common/src/main/java/com/gitee/sop/adminbackend/common/jackson/convert/serde/BoolSerializer.java new file mode 100644 index 00000000..c1b96dc3 --- /dev/null +++ b/sop-admin/sop-admin-backend/backend-common/src/main/java/com/gitee/sop/adminbackend/common/jackson/convert/serde/BoolSerializer.java @@ -0,0 +1,38 @@ +package com.gitee.sop.adminbackend.common.jackson.convert.serde; + +import com.fasterxml.jackson.core.JsonGenerator; +import com.fasterxml.jackson.databind.JsonSerializer; +import com.fasterxml.jackson.databind.SerializerProvider; +import lombok.extern.slf4j.Slf4j; + +import java.io.IOException; +import java.util.Objects; + +/** + *
+ * {@literal
+ * 将数字类型转换成布尔
+ *
+ * @Bool
+ * private Integer isLoading; // 返回给前端: "isLoading": true/false
+ *
+ * }
+ * 
+ * + * @author 六如 + */ +@Slf4j +public class BoolSerializer extends JsonSerializer { + + private static final String TRUE_VALUE = "1"; + + @Override + public void serialize(Object value, JsonGenerator jsonGenerator, SerializerProvider serializerProvider) throws IOException { + if (value == null) { + jsonGenerator.writeNull(); + return; + } + jsonGenerator.writeBoolean(Objects.equals(TRUE_VALUE, String.valueOf(value))); + } + +} diff --git a/sop-admin/sop-admin-backend/backend-common/src/main/java/com/gitee/sop/adminbackend/common/req/IdsParam.java b/sop-admin/sop-admin-backend/backend-common/src/main/java/com/gitee/sop/adminbackend/common/req/IdsParam.java new file mode 100644 index 00000000..7a6ca87e --- /dev/null +++ b/sop-admin/sop-admin-backend/backend-common/src/main/java/com/gitee/sop/adminbackend/common/req/IdsParam.java @@ -0,0 +1,15 @@ +package com.gitee.sop.adminbackend.common.req; + +import lombok.Data; + +import javax.validation.constraints.NotEmpty; +import java.util.List; + +/** + * @author 六如 + */ +@Data +public class IdsParam { + @NotEmpty(message = "id不能为空") + private List ids; +} diff --git a/sop-admin/sop-admin-backend/backend-common/src/main/java/com/gitee/sop/adminbackend/common/req/StatusUpdateBatchParam.java b/sop-admin/sop-admin-backend/backend-common/src/main/java/com/gitee/sop/adminbackend/common/req/StatusUpdateBatchParam.java new file mode 100644 index 00000000..32d19411 --- /dev/null +++ b/sop-admin/sop-admin-backend/backend-common/src/main/java/com/gitee/sop/adminbackend/common/req/StatusUpdateBatchParam.java @@ -0,0 +1,18 @@ +package com.gitee.sop.adminbackend.common.req; + +import lombok.Data; +import lombok.EqualsAndHashCode; + +import javax.validation.constraints.NotNull; + +/** + * @author 六如 + */ +@EqualsAndHashCode(callSuper = true) +@Data +public class StatusUpdateBatchParam extends IdsParam { + + @NotNull(message = "状态不能为空") + private Integer status; + +} diff --git a/sop-admin/sop-admin-backend/backend-common/src/main/java/com/gitee/sop/adminbackend/common/req/StatusUpdateParam.java b/sop-admin/sop-admin-backend/backend-common/src/main/java/com/gitee/sop/adminbackend/common/req/StatusUpdateParam.java index 3ff967fd..ce16e32f 100644 --- a/sop-admin/sop-admin-backend/backend-common/src/main/java/com/gitee/sop/adminbackend/common/req/StatusUpdateParam.java +++ b/sop-admin/sop-admin-backend/backend-common/src/main/java/com/gitee/sop/adminbackend/common/req/StatusUpdateParam.java @@ -1,12 +1,14 @@ package com.gitee.sop.adminbackend.common.req; import lombok.Data; +import lombok.EqualsAndHashCode; import javax.validation.constraints.NotNull; /** * @author 六如 */ +@EqualsAndHashCode(callSuper = true) @Data public class StatusUpdateParam extends IdParam { diff --git a/sop-admin/sop-admin-backend/backend-common/src/main/java/com/gitee/sop/adminbackend/common/util/CopyUtil.java b/sop-admin/sop-admin-backend/backend-common/src/main/java/com/gitee/sop/adminbackend/common/util/CopyUtil.java index 4ec61f90..edd1dce8 100644 --- a/sop-admin/sop-admin-backend/backend-common/src/main/java/com/gitee/sop/adminbackend/common/util/CopyUtil.java +++ b/sop-admin/sop-admin-backend/backend-common/src/main/java/com/gitee/sop/adminbackend/common/util/CopyUtil.java @@ -1,6 +1,7 @@ package com.gitee.sop.adminbackend.common.util; import com.alibaba.fastjson2.JSON; +import com.gitee.fastmybatis.core.PageInfo; import org.springframework.beans.BeanUtils; import org.springframework.beans.BeansException; import org.springframework.beans.FatalBeanException; @@ -337,6 +338,21 @@ public class CopyUtil extends BeanUtils { return ret; } + public static PageInfo copyPageInfo(PageInfo srcPageInfo, Function, List> function) { + PageInfo pageInfo = new PageInfo<>(); + List list = srcPageInfo.getList(); + if (list != null && !list.isEmpty()) { + pageInfo.setList(function.apply(list)); + } else { + pageInfo.setList(new ArrayList<>(0)); + } + pageInfo.setPageCount(srcPageInfo.getPageCount()); + pageInfo.setPageIndex(srcPageInfo.getPageIndex()); + pageInfo.setPageSize(srcPageInfo.getPageSize()); + pageInfo.setTotal(srcPageInfo.getTotal()); + return pageInfo; + } + public interface CopyConsumer { void apply(F from, T to); } diff --git a/sop-admin/sop-admin-backend/backend-dao/src/main/java/com/gitee/sop/adminbackend/dao/entity/SysDept.java b/sop-admin/sop-admin-backend/backend-dao/src/main/java/com/gitee/sop/adminbackend/dao/entity/SysDept.java new file mode 100644 index 00000000..13db74cd --- /dev/null +++ b/sop-admin/sop-admin-backend/backend-dao/src/main/java/com/gitee/sop/adminbackend/dao/entity/SysDept.java @@ -0,0 +1,73 @@ +package com.gitee.sop.adminbackend.dao.entity; + +import java.time.LocalDateTime; + +import com.gitee.fastmybatis.annotation.Pk; +import com.gitee.fastmybatis.annotation.PkStrategy; +import com.gitee.fastmybatis.annotation.Table; + +import lombok.Data; + + +/** + * 表名:sys_dept + * 备注:部门表 + * + * @author 六如 + */ +@Table(name = "sys_dept", pk = @Pk(name = "id", strategy = PkStrategy.INCREMENT)) +@Data +public class SysDept { + + /** + * id + */ + private Long id; + + /** + * 部门名称 + */ + private String name; + + /** + * 排序 + */ + private Integer sort; + + /** + * 状态,1:启用,2:禁用 + */ + private Integer status; + + /** + * 备注 + */ + private String remark; + + /** + * 父级id + */ + private Long parentId; + + /** + * 添加时间 + */ + private LocalDateTime addTime; + + /** + * 修改时间 + */ + private LocalDateTime updateTime; + + /** + * 创建人id + */ + private Long addBy; + + /** + * 修改人id + */ + private Long updateBy; + + +} diff --git a/sop-admin/sop-admin-backend/backend-dao/src/main/java/com/gitee/sop/adminbackend/dao/entity/SysResource.java b/sop-admin/sop-admin-backend/backend-dao/src/main/java/com/gitee/sop/adminbackend/dao/entity/SysResource.java new file mode 100644 index 00000000..f34fb4fa --- /dev/null +++ b/sop-admin/sop-admin-backend/backend-dao/src/main/java/com/gitee/sop/adminbackend/dao/entity/SysResource.java @@ -0,0 +1,159 @@ +package com.gitee.sop.adminbackend.dao.entity; + +import java.time.LocalDateTime; + +import com.gitee.fastmybatis.annotation.Pk; +import com.gitee.fastmybatis.annotation.PkStrategy; +import com.gitee.fastmybatis.annotation.Table; + +import lombok.Data; + + +/** + * 表名:sys_resource + * 备注:菜单资源表 + * + * @author 六如 + */ +@Table(name = "sys_resource", pk = @Pk(name = "id", strategy = PkStrategy.INCREMENT)) +@Data +public class SysResource { + + /** + * id + */ + private Long id; + + /** + * 菜单类型(0代表菜单、1代表iframe、2代表外链、3代表按钮) + */ + private Integer menuType; + + /** + * 菜单名称 + */ + private String title; + + /** + * 路由名称 + */ + private String name; + + /** + * 路由路径 + */ + private String path; + + /** + * 路由路径 + */ + private String component; + + /** + * 排序 + */ + private Integer rank; + + /** + * 路由重定向 + */ + private String redirect; + + /** + * 路由重定向 + */ + private String icon; + + /** + * 右侧图标 + */ + private String extraIcon; + + /** + * 进场动画(页面加载动画) + */ + private String enterTransition; + + /** + * 离场动画(页面加载动画) + */ + private String leaveTransition; + + /** + * 菜单激活 + */ + private String activePath; + + /** + * 权限标识 + */ + private String auths; + + /** + * 链接地址(需要内嵌的`iframe`链接地址) + */ + private String frameSrc; + + /** + * 加载动画(内嵌的`iframe`页面是否开启首次加载动画) + */ + private Integer frameLoading; + + /** + * 缓存页面 + */ + private Integer keepAlive; + + /** + * 标签页(当前菜单名称或自定义信息禁止添加到标签页) + */ + private Integer hiddenTag; + + /** + * 固定标签页(当前菜单名称是否固定显示在标签页且不可关闭) + */ + private Integer fixedTag; + + /** + * 菜单(是否显示该菜单) + */ + private Integer showLink; + + /** + * 父级菜单(是否显示父级菜单 + */ + private Integer showParent; + + /** + * 父级id + */ + private Long parentId; + + /** + * 是否删除 + */ + @com.gitee.fastmybatis.annotation.Column(logicDelete = true) + private Integer isDeleted; + + /** + * 添加时间 + */ + private LocalDateTime addTime; + + /** + * 修改时间 + */ + private LocalDateTime updateTime; + + /** + * 创建人id + */ + private Long addBy; + + /** + * 修改人id + */ + private Long updateBy; + + +} diff --git a/sop-admin/sop-admin-backend/backend-dao/src/main/java/com/gitee/sop/adminbackend/dao/entity/SysRoleResource.java b/sop-admin/sop-admin-backend/backend-dao/src/main/java/com/gitee/sop/adminbackend/dao/entity/SysRoleResource.java new file mode 100644 index 00000000..fff9d13d --- /dev/null +++ b/sop-admin/sop-admin-backend/backend-dao/src/main/java/com/gitee/sop/adminbackend/dao/entity/SysRoleResource.java @@ -0,0 +1,58 @@ +package com.gitee.sop.adminbackend.dao.entity; + +import java.time.LocalDateTime; + +import com.gitee.fastmybatis.annotation.Pk; +import com.gitee.fastmybatis.annotation.PkStrategy; +import com.gitee.fastmybatis.annotation.Table; + +import lombok.Data; + + +/** + * 表名:sys_role_resource + * 备注:角色资源关联表 + * + * @author 六如 + */ +@Table(name = "sys_role_resource", pk = @Pk(name = "id", strategy = PkStrategy.INCREMENT)) +@Data +public class SysRoleResource { + + /** + * id + */ + private Long id; + + /** + * sys_role.id + */ + private Long roleId; + + /** + * sys_resource.id + */ + private Long resourceId; + + /** + * 添加时间 + */ + private LocalDateTime addTime; + + /** + * 修改时间 + */ + private LocalDateTime updateTime; + + /** + * 创建人id + */ + private Long addBy; + + /** + * 修改人id + */ + private Long updateBy; + + +} diff --git a/sop-admin/sop-admin-backend/backend-dao/src/main/java/com/gitee/sop/adminbackend/dao/entity/SysUser.java b/sop-admin/sop-admin-backend/backend-dao/src/main/java/com/gitee/sop/adminbackend/dao/entity/SysUser.java new file mode 100644 index 00000000..ec7e3ebc --- /dev/null +++ b/sop-admin/sop-admin-backend/backend-dao/src/main/java/com/gitee/sop/adminbackend/dao/entity/SysUser.java @@ -0,0 +1,98 @@ +package com.gitee.sop.adminbackend.dao.entity; + +import java.time.LocalDateTime; + +import com.gitee.fastmybatis.annotation.Pk; +import com.gitee.fastmybatis.annotation.PkStrategy; +import com.gitee.fastmybatis.annotation.Table; + +import lombok.Data; + + +/** + * 表名:sys_user + * 备注:系统用户表 + * + * @author 六如 + */ +@Table(name = "sys_user", pk = @Pk(name = "id", strategy = PkStrategy.INCREMENT)) +@Data +public class SysUser { + + /** + * id + */ + private Long id; + + /** + * 用户名 + */ + private String username; + + /** + * 密码 + */ + private String password; + + /** + * 昵称 + */ + private String nickname; + + /** + * 邮箱 + */ + private String phone; + + /** + * 邮箱 + */ + private String email; + + /** + * 头像 + */ + private String avatar; + + /** + * 性别,0-未知,1-男,2-女 + */ + private Integer gender; + + /** + * 状态,1:启用,2:禁用 + */ + private Integer status; + + /** + * 注册类型,1-系统,2-手动 + */ + private String regType; + + /** + * 备注 + */ + private String remark; + + /** + * 添加时间 + */ + private LocalDateTime addTime; + + /** + * 修改时间 + */ + private LocalDateTime updateTime; + + /** + * 创建人id + */ + private Long addBy; + + /** + * 修改人id + */ + private Long updateBy; + + +} diff --git a/sop-admin/sop-admin-backend/backend-dao/src/main/java/com/gitee/sop/adminbackend/dao/entity/SysUserDept.java b/sop-admin/sop-admin-backend/backend-dao/src/main/java/com/gitee/sop/adminbackend/dao/entity/SysUserDept.java new file mode 100644 index 00000000..56721dae --- /dev/null +++ b/sop-admin/sop-admin-backend/backend-dao/src/main/java/com/gitee/sop/adminbackend/dao/entity/SysUserDept.java @@ -0,0 +1,58 @@ +package com.gitee.sop.adminbackend.dao.entity; + +import java.time.LocalDateTime; + +import com.gitee.fastmybatis.annotation.Pk; +import com.gitee.fastmybatis.annotation.PkStrategy; +import com.gitee.fastmybatis.annotation.Table; + +import lombok.Data; + + +/** + * 表名:sys_user_dept + * 备注:用户部门关联表 + * + * @author 六如 + */ +@Table(name = "sys_user_dept", pk = @Pk(name = "id", strategy = PkStrategy.INCREMENT)) +@Data +public class SysUserDept { + + /** + * id + */ + private Long id; + + /** + * sys_user.id + */ + private Long userId; + + /** + * sys_dept.id + */ + private Long deptId; + + /** + * 添加时间 + */ + private LocalDateTime addTime; + + /** + * 修改时间 + */ + private LocalDateTime updateTime; + + /** + * 创建人id + */ + private Long addBy; + + /** + * 修改人id + */ + private Long updateBy; + + +} diff --git a/sop-admin/sop-admin-backend/backend-dao/src/main/java/com/gitee/sop/adminbackend/dao/entity/SysUserRole.java b/sop-admin/sop-admin-backend/backend-dao/src/main/java/com/gitee/sop/adminbackend/dao/entity/SysUserRole.java new file mode 100644 index 00000000..cdeeebf3 --- /dev/null +++ b/sop-admin/sop-admin-backend/backend-dao/src/main/java/com/gitee/sop/adminbackend/dao/entity/SysUserRole.java @@ -0,0 +1,58 @@ +package com.gitee.sop.adminbackend.dao.entity; + +import java.time.LocalDateTime; + +import com.gitee.fastmybatis.annotation.Pk; +import com.gitee.fastmybatis.annotation.PkStrategy; +import com.gitee.fastmybatis.annotation.Table; + +import lombok.Data; + + +/** + * 表名:sys_user_role + * 备注:用户角色关联表 + * + * @author 六如 + */ +@Table(name = "sys_user_role", pk = @Pk(name = "id", strategy = PkStrategy.INCREMENT)) +@Data +public class SysUserRole { + + /** + * id + */ + private Long id; + + /** + * sys_role.id + */ + private Long roleId; + + /** + * sys_user.id + */ + private Long userId; + + /** + * 添加时间 + */ + private LocalDateTime addTime; + + /** + * 修改时间 + */ + private LocalDateTime updateTime; + + /** + * 创建人id + */ + private Long addBy; + + /** + * 修改人id + */ + private Long updateBy; + + +} diff --git a/sop-admin/sop-admin-backend/backend-dao/src/main/java/com/gitee/sop/adminbackend/dao/mapper/SysDeptMapper.java b/sop-admin/sop-admin-backend/backend-dao/src/main/java/com/gitee/sop/adminbackend/dao/mapper/SysDeptMapper.java new file mode 100644 index 00000000..54d57680 --- /dev/null +++ b/sop-admin/sop-admin-backend/backend-dao/src/main/java/com/gitee/sop/adminbackend/dao/mapper/SysDeptMapper.java @@ -0,0 +1,13 @@ +package com.gitee.sop.adminbackend.dao.mapper; + +import com.gitee.fastmybatis.core.mapper.BaseMapper; +import com.gitee.sop.adminbackend.dao.entity.SysDept; +import org.apache.ibatis.annotations.Mapper; + +/** + * @author 六如 + */ +@Mapper +public interface SysDeptMapper extends BaseMapper { + +} diff --git a/sop-admin/sop-admin-backend/backend-dao/src/main/java/com/gitee/sop/adminbackend/dao/mapper/SysResourceMapper.java b/sop-admin/sop-admin-backend/backend-dao/src/main/java/com/gitee/sop/adminbackend/dao/mapper/SysResourceMapper.java new file mode 100644 index 00000000..ffb560b6 --- /dev/null +++ b/sop-admin/sop-admin-backend/backend-dao/src/main/java/com/gitee/sop/adminbackend/dao/mapper/SysResourceMapper.java @@ -0,0 +1,13 @@ +package com.gitee.sop.adminbackend.dao.mapper; + +import com.gitee.fastmybatis.core.mapper.BaseMapper; +import com.gitee.sop.adminbackend.dao.entity.SysResource; +import org.apache.ibatis.annotations.Mapper; + +/** + * @author 六如 + */ +@Mapper +public interface SysResourceMapper extends BaseMapper { + +} diff --git a/sop-admin/sop-admin-backend/backend-dao/src/main/java/com/gitee/sop/adminbackend/dao/mapper/SysRoleResourceMapper.java b/sop-admin/sop-admin-backend/backend-dao/src/main/java/com/gitee/sop/adminbackend/dao/mapper/SysRoleResourceMapper.java new file mode 100644 index 00000000..83193d61 --- /dev/null +++ b/sop-admin/sop-admin-backend/backend-dao/src/main/java/com/gitee/sop/adminbackend/dao/mapper/SysRoleResourceMapper.java @@ -0,0 +1,13 @@ +package com.gitee.sop.adminbackend.dao.mapper; + +import com.gitee.fastmybatis.core.mapper.BaseMapper; +import com.gitee.sop.adminbackend.dao.entity.SysRoleResource; +import org.apache.ibatis.annotations.Mapper; + +/** + * @author 六如 + */ +@Mapper +public interface SysRoleResourceMapper extends BaseMapper { + +} diff --git a/sop-admin/sop-admin-backend/backend-dao/src/main/java/com/gitee/sop/adminbackend/dao/mapper/SysUserDeptMapper.java b/sop-admin/sop-admin-backend/backend-dao/src/main/java/com/gitee/sop/adminbackend/dao/mapper/SysUserDeptMapper.java new file mode 100644 index 00000000..41ef5a5b --- /dev/null +++ b/sop-admin/sop-admin-backend/backend-dao/src/main/java/com/gitee/sop/adminbackend/dao/mapper/SysUserDeptMapper.java @@ -0,0 +1,13 @@ +package com.gitee.sop.adminbackend.dao.mapper; + +import com.gitee.fastmybatis.core.mapper.BaseMapper; +import com.gitee.sop.adminbackend.dao.entity.SysUserDept; +import org.apache.ibatis.annotations.Mapper; + +/** + * @author 六如 + */ +@Mapper +public interface SysUserDeptMapper extends BaseMapper { + +} diff --git a/sop-admin/sop-admin-backend/backend-dao/src/main/java/com/gitee/sop/adminbackend/dao/mapper/SysUserMapper.java b/sop-admin/sop-admin-backend/backend-dao/src/main/java/com/gitee/sop/adminbackend/dao/mapper/SysUserMapper.java new file mode 100644 index 00000000..46fc459a --- /dev/null +++ b/sop-admin/sop-admin-backend/backend-dao/src/main/java/com/gitee/sop/adminbackend/dao/mapper/SysUserMapper.java @@ -0,0 +1,13 @@ +package com.gitee.sop.adminbackend.dao.mapper; + +import com.gitee.fastmybatis.core.mapper.BaseMapper; +import com.gitee.sop.adminbackend.dao.entity.SysUser; +import org.apache.ibatis.annotations.Mapper; + +/** + * @author 六如 + */ +@Mapper +public interface SysUserMapper extends BaseMapper { + +} diff --git a/sop-admin/sop-admin-backend/backend-dao/src/main/java/com/gitee/sop/adminbackend/dao/mapper/SysUserRoleMapper.java b/sop-admin/sop-admin-backend/backend-dao/src/main/java/com/gitee/sop/adminbackend/dao/mapper/SysUserRoleMapper.java new file mode 100644 index 00000000..115614d8 --- /dev/null +++ b/sop-admin/sop-admin-backend/backend-dao/src/main/java/com/gitee/sop/adminbackend/dao/mapper/SysUserRoleMapper.java @@ -0,0 +1,13 @@ +package com.gitee.sop.adminbackend.dao.mapper; + +import com.gitee.fastmybatis.core.mapper.BaseMapper; +import com.gitee.sop.adminbackend.dao.entity.SysUserRole; +import org.apache.ibatis.annotations.Mapper; + +/** + * @author 六如 + */ +@Mapper +public interface SysUserRoleMapper extends BaseMapper { + +} diff --git a/sop-admin/sop-admin-backend/backend-service/src/main/java/com/gitee/sop/adminbackend/service/sys/SysAdminUserService.java b/sop-admin/sop-admin-backend/backend-service/src/main/java/com/gitee/sop/adminbackend/service/sys/SysAdminUserService.java deleted file mode 100644 index e9a3e21c..00000000 --- a/sop-admin/sop-admin-backend/backend-service/src/main/java/com/gitee/sop/adminbackend/service/sys/SysAdminUserService.java +++ /dev/null @@ -1,39 +0,0 @@ -package com.gitee.sop.adminbackend.service.sys; - -import com.gitee.fastmybatis.core.support.LambdaService; -import com.gitee.sop.adminbackend.common.enums.ConfigKeyEnum; -import com.gitee.sop.adminbackend.common.config.Configs; -import com.gitee.sop.adminbackend.dao.entity.SysAdminUser; -import com.gitee.sop.adminbackend.dao.mapper.SysAdminUserMapper; -import com.gitee.sop.adminbackend.common.util.GenerateUtil; -import org.springframework.stereotype.Service; - - -/** - * @author 六如 - */ -@Service -public class SysAdminUserService implements LambdaService { - - - public SysAdminUser getByUsername(String username) { - return this.get(SysAdminUser::getUsername, username); - } - - public String getDbPassword(String username, String password) { - return getDbPassword(username, password, getPasswordSalt()); - } - - public String getDbPassword(String username) { - return this.query().eq(SysAdminUser::getUsername, username).getValue(SysAdminUser::getPassword); - } - - public String getDbPassword(String username, String password, String salt) { - return GenerateUtil.getUserPassword(username, password, salt); - } - - private String getPasswordSalt() { - return Configs.getValue(ConfigKeyEnum.PASSWORD_SALT); - } - -} diff --git a/sop-admin/sop-admin-backend/backend-service/src/main/java/com/gitee/sop/adminbackend/service/sys/SysDeptService.java b/sop-admin/sop-admin-backend/backend-service/src/main/java/com/gitee/sop/adminbackend/service/sys/SysDeptService.java new file mode 100644 index 00000000..9ba734f8 --- /dev/null +++ b/sop-admin/sop-admin-backend/backend-service/src/main/java/com/gitee/sop/adminbackend/service/sys/SysDeptService.java @@ -0,0 +1,55 @@ +package com.gitee.sop.adminbackend.service.sys; + +import com.gitee.fastmybatis.core.PageInfo; +import com.gitee.fastmybatis.core.query.LambdaQuery; +import com.gitee.fastmybatis.core.support.LambdaService; +import com.gitee.fastmybatis.core.util.TreeUtil; +import com.gitee.sop.adminbackend.common.dto.StatusUpdateDTO; +import com.gitee.sop.adminbackend.common.exception.BizException; +import com.gitee.sop.adminbackend.common.util.CopyUtil; +import com.gitee.sop.adminbackend.dao.entity.SysDept; +import com.gitee.sop.adminbackend.dao.mapper.SysDeptMapper; +import com.gitee.sop.adminbackend.service.sys.dto.SysDeptDTO; +import org.springframework.stereotype.Service; + +import java.util.List; +import java.util.Objects; + + +/** + * @author 六如 + */ +@Service +public class SysDeptService implements LambdaService { + + public Long addDept(SysDept sysDept) { + long count = this.query() + .eq(SysDept::getParentId, 0) + .getCount(); + if (count > 0 && Objects.equals(sysDept.getParentId(), 0L)) { + throw new BizException("只能有一个根节点"); + } + this.save(sysDept); + return sysDept.getId(); + } + + public List listTree(LambdaQuery query) { + List list = this.list(query); + List sysDeptList = CopyUtil.copyList(list, SysDeptDTO::new); + return TreeUtil.convertTree(sysDeptList, 0L); + } + + + /** + * 修改状态 + * + * @param statusUpdateDTO 修改值 + * @return 返回影响行数 + */ + public int updateStatus(StatusUpdateDTO statusUpdateDTO) { + return this.query() + .eq(SysDept::getId, statusUpdateDTO.getId()) + .set(SysDept::getStatus, statusUpdateDTO.getStatus()) + .update(); + } +} diff --git a/sop-admin/sop-admin-backend/backend-service/src/main/java/com/gitee/sop/adminbackend/service/sys/SysResourceService.java b/sop-admin/sop-admin-backend/backend-service/src/main/java/com/gitee/sop/adminbackend/service/sys/SysResourceService.java new file mode 100644 index 00000000..7065a0a1 --- /dev/null +++ b/sop-admin/sop-admin-backend/backend-service/src/main/java/com/gitee/sop/adminbackend/service/sys/SysResourceService.java @@ -0,0 +1,16 @@ +package com.gitee.sop.adminbackend.service.sys; + +import com.gitee.fastmybatis.core.support.LambdaService; +import com.gitee.sop.adminbackend.dao.entity.SysResource; +import com.gitee.sop.adminbackend.dao.mapper.SysResourceMapper; +import org.springframework.stereotype.Service; + + +/** + * @author 六如 + */ +@Service +public class SysResourceService implements LambdaService { + + +} diff --git a/sop-admin/sop-admin-backend/backend-service/src/main/java/com/gitee/sop/adminbackend/service/sys/SysRoleResourceService.java b/sop-admin/sop-admin-backend/backend-service/src/main/java/com/gitee/sop/adminbackend/service/sys/SysRoleResourceService.java new file mode 100644 index 00000000..fc373dee --- /dev/null +++ b/sop-admin/sop-admin-backend/backend-service/src/main/java/com/gitee/sop/adminbackend/service/sys/SysRoleResourceService.java @@ -0,0 +1,53 @@ +package com.gitee.sop.adminbackend.service.sys; + +import com.gitee.fastmybatis.core.support.LambdaService; +import com.gitee.sop.adminbackend.dao.entity.SysRoleResource; +import com.gitee.sop.adminbackend.dao.mapper.SysRoleResourceMapper; +import com.gitee.sop.adminbackend.service.sys.dto.SysRoleResourceDTO; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.util.List; +import java.util.stream.Collectors; + + +/** + * @author 六如 + */ +@Service +public class SysRoleResourceService implements LambdaService { + + + /** + * 保存角色菜单配置 + * + * @param sysRoleResourceDTO 入参 + * @return 返回影响行数 + */ + @Transactional(rollbackFor = Exception.class) + public int saveRoleResource(SysRoleResourceDTO sysRoleResourceDTO) { + Long roleId = sysRoleResourceDTO.getRoleId(); + // 删除之前的 + this.deleteByColumn(SysRoleResource::getRoleId, roleId); + + List saveList = sysRoleResourceDTO.getResourceIds().stream() + .map(resourceId -> { + SysRoleResource sysRoleResource = new SysRoleResource(); + sysRoleResource.setRoleId(roleId); + sysRoleResource.setResourceId(resourceId); + sysRoleResource.setAddBy(sysRoleResourceDTO.getAddBy()); + sysRoleResource.setUpdateBy(sysRoleResourceDTO.getAddBy()); + return sysRoleResource; + }) + .collect(Collectors.toList()); + + return this.saveBatch(saveList); + } + + public List listRoleResource(Long roleId) { + return this.query() + .eq(SysRoleResource::getRoleId, roleId) + .listUniqueValue(SysRoleResource::getResourceId); + } + +} diff --git a/sop-admin/sop-admin-backend/backend-service/src/main/java/com/gitee/sop/adminbackend/service/sys/SysRoleService.java b/sop-admin/sop-admin-backend/backend-service/src/main/java/com/gitee/sop/adminbackend/service/sys/SysRoleService.java index df85416a..ca97342f 100644 --- a/sop-admin/sop-admin-backend/backend-service/src/main/java/com/gitee/sop/adminbackend/service/sys/SysRoleService.java +++ b/sop-admin/sop-admin-backend/backend-service/src/main/java/com/gitee/sop/adminbackend/service/sys/SysRoleService.java @@ -1,7 +1,5 @@ package com.gitee.sop.adminbackend.service.sys; -import com.gitee.fastmybatis.core.PageInfo; -import com.gitee.fastmybatis.core.query.LambdaQuery; import com.gitee.fastmybatis.core.support.LambdaService; import com.gitee.sop.adminbackend.common.dto.StatusUpdateDTO; import com.gitee.sop.adminbackend.dao.entity.SysRole; @@ -15,16 +13,6 @@ import org.springframework.stereotype.Service; @Service public class SysRoleService implements LambdaService { - public PageInfo doPage(LambdaQuery query) { - query.orderByDesc(SysRole::getId); - PageInfo page = this.page(query); - - // 格式转换 - return page.convert(isvInfo -> { - - return isvInfo; - }); - } /** * 修改状态 @@ -40,4 +28,5 @@ public class SysRoleService implements LambdaService { } + } diff --git a/sop-admin/sop-admin-backend/backend-service/src/main/java/com/gitee/sop/adminbackend/service/sys/SysUserDeptService.java b/sop-admin/sop-admin-backend/backend-service/src/main/java/com/gitee/sop/adminbackend/service/sys/SysUserDeptService.java new file mode 100644 index 00000000..bb453634 --- /dev/null +++ b/sop-admin/sop-admin-backend/backend-service/src/main/java/com/gitee/sop/adminbackend/service/sys/SysUserDeptService.java @@ -0,0 +1,116 @@ +package com.gitee.sop.adminbackend.service.sys; + +import com.gitee.fastmybatis.core.support.LambdaService; +import com.gitee.sop.adminbackend.common.util.CopyUtil; +import com.gitee.sop.adminbackend.dao.entity.SysDept; +import com.gitee.sop.adminbackend.dao.entity.SysUserDept; +import com.gitee.sop.adminbackend.dao.mapper.SysDeptMapper; +import com.gitee.sop.adminbackend.dao.mapper.SysUserDeptMapper; +import com.gitee.sop.adminbackend.service.sys.dto.DeptUserResultDTO; +import com.gitee.sop.adminbackend.service.sys.dto.SysDeptDTO; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import org.springframework.util.CollectionUtils; + +import java.util.ArrayList; +import java.util.Collection; +import java.util.List; +import java.util.Map; +import java.util.Objects; +import java.util.function.Function; +import java.util.stream.Collectors; + + +/** + * @author 六如 + */ +@Service +public class SysUserDeptService implements LambdaService { + + @Autowired + SysDeptMapper sysDeptMapper; + + public Map getUserDeptId(Collection userIds) { + Map deptIdMap = sysDeptMapper.query() + .map(SysDept::getId, Function.identity()); + return this.query() + .in(SysUserDept::getUserId, userIds) + .map(SysUserDept::getUserId, sysUserDept -> { + SysDept sysDept = deptIdMap.get(sysUserDept.getDeptId()); + return CopyUtil.copyBean(sysDept, SysDeptDTO::new); + }, (v1, v2) -> v2); + } + + /** + * 查找部门及子部门下所有用户 + * + * @param deptId 部门 + * @return 返回空表示选中了根节点或没有选 + */ + public DeptUserResultDTO listDeptUserIdsDeep(Long deptId) { + if (deptId == null) { + return new DeptUserResultDTO(false, null); + } + SysDept sysDept = sysDeptMapper.getById(deptId); + // 选中了根节点或没有选 + if (sysDept == null || Objects.equals(sysDept.getParentId(), 0L)) { + return new DeptUserResultDTO(false, null); + } + List userIdsAll = new ArrayList<>(); + List userIds = this.query() + .eq(SysUserDept::getDeptId, deptId) + .listUniqueValue(SysUserDept::getUserId); + + appendChildren(userIdsAll, deptId); + + userIdsAll.addAll(userIds); + return new DeptUserResultDTO(true, userIdsAll); + } + + private void appendChildren(List userIdsAll, Long deptId) { + List deptIds = sysDeptMapper.query() + .eq(SysDept::getParentId, deptId) + .listUniqueValue(SysDept::getId); + if (deptIds.isEmpty()) { + return; + } + List userIds = this.query() + .in(SysUserDept::getDeptId, deptIds) + .listUniqueValue(SysUserDept::getUserId); + userIdsAll.addAll(userIds); + + for (Long childDeptId : deptIds) { + appendChildren(userIdsAll, childDeptId); + } + } + + /** + * 保存用户部门 + * + * @param userId 用户id + * @param deptIds 部门id + * @return 返回影响行数 + */ + public int saveUserDept(Long userId, List deptIds) { + this.query() + .eq(SysUserDept::getUserId, userId) + .delete(); + + if (CollectionUtils.isEmpty(deptIds)) { + return 0; + } + + List saveList = deptIds.stream() + .map(deptId -> { + SysUserDept sysUserDept = new SysUserDept(); + sysUserDept.setUserId(userId); + sysUserDept.setDeptId(deptId); + return sysUserDept; + }) + .collect(Collectors.toList()); + + return this.saveBatch(saveList); + } + + +} diff --git a/sop-admin/sop-admin-backend/backend-service/src/main/java/com/gitee/sop/adminbackend/service/sys/SysUserRoleService.java b/sop-admin/sop-admin-backend/backend-service/src/main/java/com/gitee/sop/adminbackend/service/sys/SysUserRoleService.java new file mode 100644 index 00000000..dbdfa4a2 --- /dev/null +++ b/sop-admin/sop-admin-backend/backend-service/src/main/java/com/gitee/sop/adminbackend/service/sys/SysUserRoleService.java @@ -0,0 +1,55 @@ +package com.gitee.sop.adminbackend.service.sys; + +import com.gitee.fastmybatis.core.support.LambdaService; +import com.gitee.sop.adminbackend.common.user.User; +import com.gitee.sop.adminbackend.dao.entity.SysUserRole; +import com.gitee.sop.adminbackend.dao.mapper.SysUserRoleMapper; +import org.springframework.stereotype.Service; +import org.springframework.util.CollectionUtils; + +import java.util.LinkedHashSet; +import java.util.List; +import java.util.stream.Collectors; + + +/** + * @author 六如 + */ +@Service +public class SysUserRoleService implements LambdaService { + + /** + * 设置用户角色 + * + * @param userId 用户id + * @param roleIds 角色id + * @param operator 操作人 + */ + public void setUserRole(Long userId, List roleIds, User operator) { + this.query() + .eq(SysUserRole::getUserId, userId) + .delete(); + + if (CollectionUtils.isEmpty(roleIds)) { + return; + } + List saveList = new LinkedHashSet<>(roleIds).stream() + .map(roleId -> { + SysUserRole sysUserRole = new SysUserRole(); + sysUserRole.setRoleId(roleId); + sysUserRole.setUserId(userId); + sysUserRole.setAddBy(operator.getUserId()); + return sysUserRole; + }) + .collect(Collectors.toList()); + + this.saveBatch(saveList); + } + + public List listUserRoleIds(Long userId) { + return this.query() + .eq(SysUserRole::getUserId, userId) + .listUniqueValue(SysUserRole::getRoleId); + } + +} diff --git a/sop-admin/sop-admin-backend/backend-service/src/main/java/com/gitee/sop/adminbackend/service/sys/SysUserService.java b/sop-admin/sop-admin-backend/backend-service/src/main/java/com/gitee/sop/adminbackend/service/sys/SysUserService.java new file mode 100644 index 00000000..c9f02dab --- /dev/null +++ b/sop-admin/sop-admin-backend/backend-service/src/main/java/com/gitee/sop/adminbackend/service/sys/SysUserService.java @@ -0,0 +1,149 @@ +package com.gitee.sop.adminbackend.service.sys; + +import com.gitee.fastmybatis.core.PageInfo; +import com.gitee.fastmybatis.core.query.LambdaQuery; +import com.gitee.fastmybatis.core.support.LambdaService; +import com.gitee.sop.adminbackend.common.config.Configs; +import com.gitee.sop.adminbackend.common.dto.StatusUpdateBatchDTO; +import com.gitee.sop.adminbackend.common.dto.StatusUpdateDTO; +import com.gitee.sop.adminbackend.common.enums.ConfigKeyEnum; +import com.gitee.sop.adminbackend.common.util.CopyUtil; +import com.gitee.sop.adminbackend.common.util.GenerateUtil; +import com.gitee.sop.adminbackend.dao.entity.SysUser; +import com.gitee.sop.adminbackend.dao.mapper.SysUserMapper; +import com.gitee.sop.adminbackend.service.sys.dto.DeptUserResultDTO; +import com.gitee.sop.adminbackend.service.sys.dto.SysDeptDTO; +import com.gitee.sop.adminbackend.service.sys.dto.SysUserAddDTO; +import com.gitee.sop.adminbackend.service.sys.dto.SysUserDTO; +import com.gitee.sop.adminbackend.service.sys.dto.SysUserSearchDTO; +import com.gitee.sop.adminbackend.service.sys.dto.SysUserUpdateDTO; +import com.gitee.sop.adminbackend.service.sys.login.enums.RegTypeEnum; +import com.google.common.collect.Lists; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.security.crypto.bcrypt.BCrypt; +import org.springframework.stereotype.Service; +import org.springframework.util.CollectionUtils; + +import java.util.Collections; +import java.util.List; +import java.util.Map; +import java.util.Set; +import java.util.stream.Collectors; + + +/** + * @author 六如 + */ +@Service +public class SysUserService implements LambdaService { + + @Autowired + SysUserDeptService sysUserDeptService; + + public PageInfo doPage(SysUserSearchDTO sysUserSearchDTO) { + LambdaQuery query = sysUserSearchDTO.toLambdaQuery(SysUser.class); + Long deptId = sysUserSearchDTO.getDeptId(); + DeptUserResultDTO deptUserResultDTO = sysUserDeptService.listDeptUserIdsDeep(deptId); + if (deptUserResultDTO.getSelect()) { + List userIds = deptUserResultDTO.getUserIds(); + // 查不到返回空 + if (CollectionUtils.isEmpty(userIds)) { + return new PageInfo<>(); + } + query.in(SysUser::getId, userIds); + } + + query.orderByDesc(SysUser::getId); + + // 格式转换 + return this.pageAndConvert(query, records -> { + if (records.isEmpty()) { + return Collections.emptyList(); + } + Set userIds = records.stream().map(SysUser::getId).collect(Collectors.toSet()); + Map userIdDeptMap = sysUserDeptService.getUserDeptId(userIds); + + return CopyUtil.copyList(records, SysUserDTO::new, after -> { + SysDeptDTO sysDeptDTO = userIdDeptMap.get(after.getId()); + after.setDept(sysDeptDTO); + }); + }); + } + + public Long addUser(SysUserAddDTO sysUserAddDTO) { + SysUser sysUser = CopyUtil.copyBean(sysUserAddDTO, SysUser::new); + String encodedPassword = BCrypt.hashpw(sysUserAddDTO.getPassword(), BCrypt.gensalt()); + sysUser.setPassword(encodedPassword); + sysUser.setRegType(RegTypeEnum.BACKEND.getValue()); + this.save(sysUser); + + // 添加部门 + Long deptId = sysUserAddDTO.getParentId(); + if (deptId != null && deptId > 0) { + sysUserDeptService.saveUserDept(sysUser.getId(), Lists.newArrayList(deptId)); + } + + return sysUser.getId(); + } + + public int updateUser(SysUserUpdateDTO sysUserUpdateDTO) { + SysUser sysUser = CopyUtil.copyBean(sysUserUpdateDTO, SysUser::new); + int cnt = this.update(sysUser); + + // 添加部门 + Long deptId = sysUserUpdateDTO.getParentId(); + if (deptId != null && deptId > 0) { + sysUserDeptService.saveUserDept(sysUser.getId(), Lists.newArrayList(deptId)); + } + return cnt; + } + + /** + * 修改状态 + * + * @param statusUpdateDTO 修改值 + * @return 返回影响行数 + */ + public int updateStatus(StatusUpdateDTO statusUpdateDTO) { + return this.query() + .eq(SysUser::getId, statusUpdateDTO.getId()) + .set(SysUser::getStatus, statusUpdateDTO.getStatus()) + .update(); + } + + public int updateStatus(StatusUpdateBatchDTO statusUpdateDTO) { + return this.query() + .in(SysUser::getId, statusUpdateDTO.getIds()) + .set(SysUser::getStatus, statusUpdateDTO.getStatus()) + .update(); + } + + public void resetUserPassword(Long userId, String passwordHash) { + String encodedPassword = BCrypt.hashpw(passwordHash, BCrypt.gensalt()); + this.query() + .eq(SysUser::getId, userId) + .set(SysUser::getPassword, encodedPassword) + .update(); + } + + public SysUser getByUsername(String username) { + return this.get(SysUser::getUsername, username); + } + + public String getDbPassword(String username, String password) { + return getDbPassword(username, password, getPasswordSalt()); + } + + public String getDbPassword(String username) { + return this.query().eq(SysUser::getUsername, username).getValue(SysUser::getPassword); + } + + public String getDbPassword(String username, String password, String salt) { + return GenerateUtil.getUserPassword(username, password, salt); + } + + private String getPasswordSalt() { + return Configs.getValue(ConfigKeyEnum.PASSWORD_SALT); + } + +} diff --git a/sop-admin/sop-admin-backend/backend-service/src/main/java/com/gitee/sop/adminbackend/service/sys/UpgradeService.java b/sop-admin/sop-admin-backend/backend-service/src/main/java/com/gitee/sop/adminbackend/service/sys/UpgradeService.java index 8cdc10c6..33fac0a6 100644 --- a/sop-admin/sop-admin-backend/backend-service/src/main/java/com/gitee/sop/adminbackend/service/sys/UpgradeService.java +++ b/sop-admin/sop-admin-backend/backend-service/src/main/java/com/gitee/sop/adminbackend/service/sys/UpgradeService.java @@ -1,7 +1,7 @@ package com.gitee.sop.adminbackend.service.sys; import com.gitee.sop.adminbackend.common.enums.ConfigKeyEnum; -import com.gitee.sop.adminbackend.dao.entity.SysAdminUser; +import com.gitee.sop.adminbackend.dao.entity.SysUser; import com.gitee.sop.adminbackend.dao.mapper.UpgradeMapper; import com.gitee.sop.adminbackend.service.sys.login.enums.RegTypeEnum; import com.gitee.sop.adminbackend.common.util.PasswordUtil; @@ -23,7 +23,7 @@ public class UpgradeService { private SysConfigService sysConfigService; @Autowired - private SysAdminUserService sysAdminUserService; + private SysUserService sysUserService; @Autowired private UpgradeMapper upgradeMapper; @@ -45,12 +45,12 @@ public class UpgradeService { public void insertAdmin() { - SysAdminUser userInfo = sysAdminUserService.getByUsername("admin"); + SysUser userInfo = sysUserService.getByUsername("admin"); if (userInfo != null) { return; } String username = "admin"; - String tpl = "INSERT INTO `sys_admin_user` ( `username`, `password`, `nickname`, `reg_type`) VALUES \n" + + String tpl = "INSERT INTO `sys_user` ( `username`, `password`, `nickname`, `reg_type`) VALUES \n" + "\t('%s','%s','%s','%s');"; // 初始密码 String defPassword = "123456"; diff --git a/sop-admin/sop-admin-backend/backend-service/src/main/java/com/gitee/sop/adminbackend/service/sys/dto/DeptUserResultDTO.java b/sop-admin/sop-admin-backend/backend-service/src/main/java/com/gitee/sop/adminbackend/service/sys/dto/DeptUserResultDTO.java new file mode 100644 index 00000000..999a92d9 --- /dev/null +++ b/sop-admin/sop-admin-backend/backend-service/src/main/java/com/gitee/sop/adminbackend/service/sys/dto/DeptUserResultDTO.java @@ -0,0 +1,19 @@ +package com.gitee.sop.adminbackend.service.sys.dto; + +import lombok.AllArgsConstructor; +import lombok.Data; + +import java.util.List; + +/** + * @author 六如 + */ +@Data +@AllArgsConstructor +public class DeptUserResultDTO { + + private Boolean select = true; + + private List userIds; + +} diff --git a/sop-admin/sop-admin-backend/backend-service/src/main/java/com/gitee/sop/adminbackend/service/sys/dto/SysDeptDTO.java b/sop-admin/sop-admin-backend/backend-service/src/main/java/com/gitee/sop/adminbackend/service/sys/dto/SysDeptDTO.java new file mode 100644 index 00000000..220c2280 --- /dev/null +++ b/sop-admin/sop-admin-backend/backend-service/src/main/java/com/gitee/sop/adminbackend/service/sys/dto/SysDeptDTO.java @@ -0,0 +1,81 @@ +package com.gitee.sop.adminbackend.service.sys.dto; + +import com.gitee.fastmybatis.core.support.TreeNode; +import lombok.Data; + +import java.time.LocalDateTime; +import java.util.List; + + +/** + * 备注:部门表 + * + * @author 六如 + */ +@Data +public class SysDeptDTO implements TreeNode { + + /** + * id + */ + private Long id; + + /** + * 部门名称 + */ + private String name; + + /** + * 排序 + */ + private Integer sort; + + /** + * 状态,1:启用,2:禁用 + */ + private Integer status; + + /** + * 备注 + */ + private String remark; + + /** + * 父级id + */ + private Long parentId; + + /** + * 添加时间 + */ + private LocalDateTime addTime; + + /** + * 修改时间 + */ + private LocalDateTime updateTime; + + /** + * 创建人id + */ + private Long addBy; + + /** + * 修改人id + */ + private Long updateBy; + + private List children; + + + @Override + public Long takeId() { + return id; + } + + @Override + public Long takeParentId() { + return parentId; + } + +} diff --git a/sop-admin/sop-admin-backend/backend-service/src/main/java/com/gitee/sop/adminbackend/service/sys/dto/SysRoleResourceDTO.java b/sop-admin/sop-admin-backend/backend-service/src/main/java/com/gitee/sop/adminbackend/service/sys/dto/SysRoleResourceDTO.java new file mode 100644 index 00000000..47d35441 --- /dev/null +++ b/sop-admin/sop-admin-backend/backend-service/src/main/java/com/gitee/sop/adminbackend/service/sys/dto/SysRoleResourceDTO.java @@ -0,0 +1,28 @@ +package com.gitee.sop.adminbackend.service.sys.dto; + +import lombok.Data; + +import java.util.List; + +/** + * @author 六如 + */ +@Data +public class SysRoleResourceDTO { + + /** + * 角色id + */ + private Long roleId; + + /** + * 资源id + */ + private List resourceIds; + + /** + * 添加人 + */ + private Long addBy; + +} diff --git a/sop-admin/sop-admin-backend/backend-service/src/main/java/com/gitee/sop/adminbackend/service/sys/dto/SysUserAddDTO.java b/sop-admin/sop-admin-backend/backend-service/src/main/java/com/gitee/sop/adminbackend/service/sys/dto/SysUserAddDTO.java new file mode 100644 index 00000000..dc5cef66 --- /dev/null +++ b/sop-admin/sop-admin-backend/backend-service/src/main/java/com/gitee/sop/adminbackend/service/sys/dto/SysUserAddDTO.java @@ -0,0 +1,88 @@ +package com.gitee.sop.adminbackend.service.sys.dto; + +import lombok.Data; + +import java.time.LocalDateTime; + +/** + * @author 六如 + */ +@Data +public class SysUserAddDTO { + + /** + * 用户名 + */ + private String username; + + /** + * 密码 + */ + private String password; + + /** + * 昵称 + */ + private String nickname; + + /** + * 邮箱 + */ + private String phone; + + /** + * 邮箱 + */ + private String email; + + /** + * 头像 + */ + private String avatar; + + /** + * 性别,0-未知,1-男,2-女 + */ + private Integer gender; + + /** + * 状态,1:启用,2:禁用 + */ + private Integer status; + + /** + * 注册类型,1-系统,2-手动 + */ + private String regType; + + /** + * 备注 + */ + private String remark; + + /** + * 添加时间 + */ + private LocalDateTime addTime; + + /** + * 修改时间 + */ + private LocalDateTime updateTime; + + /** + * 创建人id + */ + private Long addBy; + + /** + * 修改人id + */ + private Long updateBy; + + /** + * 部门id + */ + private Long parentId; + +} diff --git a/sop-admin/sop-admin-backend/backend-service/src/main/java/com/gitee/sop/adminbackend/service/sys/dto/SysUserDTO.java b/sop-admin/sop-admin-backend/backend-service/src/main/java/com/gitee/sop/adminbackend/service/sys/dto/SysUserDTO.java new file mode 100644 index 00000000..243f9ee4 --- /dev/null +++ b/sop-admin/sop-admin-backend/backend-service/src/main/java/com/gitee/sop/adminbackend/service/sys/dto/SysUserDTO.java @@ -0,0 +1,98 @@ +package com.gitee.sop.adminbackend.service.sys.dto; + +import lombok.Data; + +import javax.validation.constraints.Min; +import javax.validation.constraints.NotNull; +import java.time.LocalDateTime; + + +/** + * + * @author 六如 + */ +@Data +public class SysUserDTO { + + /** + * id + */ + private Long id; + + /** + * 用户名 + */ + private String username; + + /** + * 密码 + */ + private String password; + + /** + * 昵称 + */ + private String nickname; + + /** + * 邮箱 + */ + private String phone; + + /** + * 邮箱 + */ + private String email; + + /** + * 头像 + */ + private String avatar; + + /** + * 性别,0-未知,1-男,2-女 + */ + private Integer gender; + + /** + * 状态,1:启用,2:禁用 + */ + private Integer status; + + /** + * 注册类型,1-系统,2-手动 + */ + private String regType; + + /** + * 备注 + */ + private String remark; + + /** + * 添加时间 + */ + private LocalDateTime addTime; + + /** + * 修改时间 + */ + private LocalDateTime updateTime; + + /** + * 创建人id + */ + private Long addBy; + + /** + * 修改人id + */ + private Long updateBy; + + /** + * 部门 + */ + private SysDeptDTO dept; + + +} diff --git a/sop-admin/sop-admin-backend/backend-service/src/main/java/com/gitee/sop/adminbackend/service/sys/dto/SysUserSearchDTO.java b/sop-admin/sop-admin-backend/backend-service/src/main/java/com/gitee/sop/adminbackend/service/sys/dto/SysUserSearchDTO.java new file mode 100644 index 00000000..590be97b --- /dev/null +++ b/sop-admin/sop-admin-backend/backend-service/src/main/java/com/gitee/sop/adminbackend/service/sys/dto/SysUserSearchDTO.java @@ -0,0 +1,42 @@ +package com.gitee.sop.adminbackend.service.sys.dto; + +import com.gitee.fastmybatis.core.query.Operator; +import com.gitee.fastmybatis.core.query.annotation.Condition; +import com.gitee.fastmybatis.core.query.param.PageParam; +import lombok.Data; +import lombok.EqualsAndHashCode; + +/** + * 备注:角色表 + * + * @author 六如 + */ +@EqualsAndHashCode(callSuper = true) +@Data +public class SysUserSearchDTO extends PageParam { + private static final long serialVersionUID = 7794265174728302379L; + + /** + * 用户名 + */ + @Condition(operator = Operator.like) + private String username; + + /** + * 邮箱 + */ + @Condition(operator = Operator.like) + private String phone; + + + /** + * 状态,1:启用,2:禁用 + */ + @Condition + private Integer status; + + @Condition(ignore = true) + private Long deptId; + + +} diff --git a/sop-admin/sop-admin-backend/backend-service/src/main/java/com/gitee/sop/adminbackend/service/sys/dto/SysUserUpdateDTO.java b/sop-admin/sop-admin-backend/backend-service/src/main/java/com/gitee/sop/adminbackend/service/sys/dto/SysUserUpdateDTO.java new file mode 100644 index 00000000..cb154f20 --- /dev/null +++ b/sop-admin/sop-admin-backend/backend-service/src/main/java/com/gitee/sop/adminbackend/service/sys/dto/SysUserUpdateDTO.java @@ -0,0 +1,75 @@ +package com.gitee.sop.adminbackend.service.sys.dto; + +import lombok.Data; + +import javax.validation.constraints.NotNull; + + +/** + * @author 六如 + */ +@Data +public class SysUserUpdateDTO { + + /** + * id + */ + @NotNull(message = "id必填") + private Long id; + + /** + * 用户名 + */ + private String username; + + /** + * 昵称 + */ + private String nickname; + + /** + * 邮箱 + */ + private String phone; + + /** + * 邮箱 + */ + private String email; + + /** + * 头像 + */ + private String avatar; + + /** + * 性别,0-未知,1-男,2-女 + */ + private Integer gender; + + /** + * 状态,1:启用,2:禁用 + */ + private Integer status; + + /** + * 注册类型,1-系统,2-手动 + */ + private String regType; + + /** + * 备注 + */ + private String remark; + + /** + * 修改人id + */ + private Long updateBy; + + /** + * 部门id + */ + private Long parentId; + +} diff --git a/sop-admin/sop-admin-backend/backend-service/src/main/java/com/gitee/sop/adminbackend/service/sys/login/LoginService.java b/sop-admin/sop-admin-backend/backend-service/src/main/java/com/gitee/sop/adminbackend/service/sys/login/LoginService.java index 735a423d..a183de0f 100644 --- a/sop-admin/sop-admin-backend/backend-service/src/main/java/com/gitee/sop/adminbackend/service/sys/login/LoginService.java +++ b/sop-admin/sop-admin-backend/backend-service/src/main/java/com/gitee/sop/adminbackend/service/sys/login/LoginService.java @@ -1,20 +1,20 @@ package com.gitee.sop.adminbackend.service.sys.login; +import com.gitee.sop.adminbackend.common.config.Configs; import com.gitee.sop.adminbackend.common.enums.ConfigKeyEnum; import com.gitee.sop.adminbackend.common.enums.StatusEnum; import com.gitee.sop.adminbackend.common.exception.BizException; -import com.gitee.sop.adminbackend.common.config.Configs; import com.gitee.sop.adminbackend.common.manager.UserCacheManager; -import com.gitee.sop.adminbackend.dao.entity.SysAdminUser; -import com.gitee.sop.adminbackend.service.sys.SysAdminUserService; +import com.gitee.sop.adminbackend.common.util.CopyUtil; +import com.gitee.sop.adminbackend.common.util.GenerateUtil; +import com.gitee.sop.adminbackend.common.util.JwtUtil; +import com.gitee.sop.adminbackend.dao.entity.SysUser; +import com.gitee.sop.adminbackend.service.sys.SysUserService; import com.gitee.sop.adminbackend.service.sys.login.dto.LoginDTO; import com.gitee.sop.adminbackend.service.sys.login.dto.LoginForm; import com.gitee.sop.adminbackend.service.sys.login.dto.LoginResult; import com.gitee.sop.adminbackend.service.sys.login.dto.LoginUser; import com.gitee.sop.adminbackend.service.sys.login.enums.RegTypeEnum; -import com.gitee.sop.adminbackend.common.util.CopyUtil; -import com.gitee.sop.adminbackend.common.util.GenerateUtil; -import com.gitee.sop.adminbackend.common.util.JwtUtil; import com.google.common.collect.Sets; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.math.NumberUtils; @@ -38,7 +38,7 @@ import java.util.Objects; public class LoginService { @Autowired - private SysAdminUserService sysAdminUserService; + private SysUserService sysUserService; @Autowired private UserCacheManager userCacheManager; @@ -48,7 +48,7 @@ public class LoginService { String username = loginDTO.getUsername(); String password = loginDTO.getPassword(); RegTypeEnum regType = loginDTO.getRegType(); - SysAdminUser userInfo; + SysUser userInfo; switch (regType) { case FORM: throw new UnsupportedOperationException("第三方登录暂未支持"); @@ -65,16 +65,16 @@ public class LoginService { return loginUser; } - private LoginUser buildLoginUser(SysAdminUser userInfo) { - if (StatusEnum.of(userInfo.getStatus()) == StatusEnum.DISABLED) { + private LoginUser buildLoginUser(SysUser sysUser) { + if (StatusEnum.of(sysUser.getStatus()) == StatusEnum.DISABLED) { throw new BizException("账号已禁用,请联系管理员"); } // 登录成功 - LoginUser loginUser = CopyUtil.copyBean(userInfo, LoginUser::new); + LoginUser loginUser = CopyUtil.copyBean(sysUser, LoginUser::new); // 创建token - String token = this.createToken(userInfo.getId()); + String token = this.createToken(sysUser.getId()); loginUser.setAccessToken(token); - if ("admin".equals(userInfo.getUsername())) { + if ("admin".equals(sysUser.getUsername())) { // ROLE loginUser.setRoles(Sets.newHashSet("admin")); // *:*:* 表示所有权限 @@ -102,7 +102,7 @@ public class LoginService { return Configs.getValue(ConfigKeyEnum.JWT_SECRET); } - private SysAdminUser doThirdPartyLogin(ThirdPartyLoginManager thirdPartyLoginManager, String username, String password) { + private SysUser doThirdPartyLogin(ThirdPartyLoginManager thirdPartyLoginManager, String username, String password) { LoginForm loginForm = new LoginForm(); loginForm.setUsername(username); loginForm.setPassword(password); @@ -114,11 +114,11 @@ public class LoginService { throw new BizException(e.getMessage()); } - SysAdminUser userInfo = sysAdminUserService.getByUsername(username); + SysUser userInfo = sysUserService.getByUsername(username); // 用户第一次登录则插入到user_info表 if (userInfo == null) { - userInfo = new SysAdminUser(); + userInfo = new SysUser(); userInfo.setUsername(username); userInfo.setPassword(GenerateUtil.getUUID()); userInfo.setNickname(loginResult.getNickname()); @@ -126,26 +126,27 @@ public class LoginService { userInfo.setStatus(StatusEnum.ENABLE.getValue()); userInfo.setRegType(loginResult.getRegTypeEnum().getValue()); userInfo.setEmail(loginResult.getEmail()); - sysAdminUserService.save(userInfo); + sysUserService.save(userInfo); } else { String email = loginResult.getEmail(); // 如果更改了邮箱 if (StringUtils.hasText(email) && !Objects.equals(email, userInfo.getEmail())) { userInfo.setEmail(email); - sysAdminUserService.update(userInfo); + sysUserService.update(userInfo); } } return userInfo; } - private SysAdminUser doDatabaseLogin(String username, String password) { - SysAdminUser sysAdminUser = sysAdminUserService.getByUsername(username); - Assert.notNull(sysAdminUser, () -> "用户名密码不正确"); - String encodedPasswordDb = sysAdminUser.getPassword(); + private SysUser doDatabaseLogin(String username, String password) { + SysUser sysUser = sysUserService.getByUsername(username); + Assert.notNull(sysUser, () -> "用户名密码不正确"); + String encodedPasswordDb = sysUser.getPassword(); // 校验 boolean flag = BCrypt.checkpw(password, encodedPasswordDb); Assert.isTrue(flag, () -> "用户名密码不正确"); - return sysAdminUser; + Assert.isTrue(Objects.equals(sysUser.getStatus(), StatusEnum.ENABLE.getValue()), () -> "用户已禁用"); + return sysUser; } } diff --git a/sop-admin/sop-admin-backend/backend-service/src/main/java/com/gitee/sop/adminbackend/service/sys/login/impl/DefaultUserCacheManager.java b/sop-admin/sop-admin-backend/backend-service/src/main/java/com/gitee/sop/adminbackend/service/sys/login/impl/DefaultUserCacheManager.java index 6b111e73..b3fbb0cf 100644 --- a/sop-admin/sop-admin-backend/backend-service/src/main/java/com/gitee/sop/adminbackend/service/sys/login/impl/DefaultUserCacheManager.java +++ b/sop-admin/sop-admin-backend/backend-service/src/main/java/com/gitee/sop/adminbackend/service/sys/login/impl/DefaultUserCacheManager.java @@ -2,8 +2,8 @@ package com.gitee.sop.adminbackend.service.sys.login.impl; import com.gitee.sop.adminbackend.common.user.User; import com.gitee.sop.adminbackend.common.enums.StatusEnum; -import com.gitee.sop.adminbackend.dao.entity.SysAdminUser; -import com.gitee.sop.adminbackend.service.sys.SysAdminUserService; +import com.gitee.sop.adminbackend.dao.entity.SysUser; +import com.gitee.sop.adminbackend.service.sys.SysUserService; import com.gitee.sop.adminbackend.common.manager.UserCacheManager; import com.gitee.sop.adminbackend.service.sys.login.dto.LoginUser; import com.gitee.sop.adminbackend.common.util.CopyUtil; @@ -27,7 +27,7 @@ import java.util.concurrent.TimeUnit; public class DefaultUserCacheManager implements UserCacheManager, InitializingBean { @Autowired - private SysAdminUserService sysAdminUserService; + private SysUserService sysUserService; @Value("${admin.user-cache-timeout-minutes:15}") private int timeoutMinutes; @@ -70,7 +70,7 @@ public class DefaultUserCacheManager implements UserCacheManager, InitializingBe * @return */ private User getLoginUser(long id) { - SysAdminUser userInfo = sysAdminUserService.getById(id); + SysUser userInfo = sysUserService.getById(id); if (userInfo == null) { log.warn("登录用户不存在,userId:{}", id); return null; diff --git a/sop-admin/sop-admin-backend/backend-web/src/main/java/com/gitee/sop/adminbackend/controller/ExceptionHandlerController.java b/sop-admin/sop-admin-backend/backend-web/src/main/java/com/gitee/sop/adminbackend/controller/ExceptionHandlerController.java index 49553c1e..62a71308 100644 --- a/sop-admin/sop-admin-backend/backend-web/src/main/java/com/gitee/sop/adminbackend/controller/ExceptionHandlerController.java +++ b/sop-admin/sop-admin-backend/backend-web/src/main/java/com/gitee/sop/adminbackend/controller/ExceptionHandlerController.java @@ -32,9 +32,8 @@ public class ExceptionHandlerController { log.error("报错,code:{}, msg:{}", errorCode.getCode(), errorCode.getMsg(), e); return Result.err(errorCode.getCode(), errorCode.getMsg()); } - if (e instanceof BizException) { - RuntimeException bizException = (RuntimeException) e; - return Result.err(bizException.getMessage()); + if (e instanceof BizException || e instanceof IllegalArgumentException) { + return Result.err(e.getMessage()); } // 处理JSR-303错误 if (e instanceof MethodArgumentNotValidException) { diff --git a/sop-admin/sop-admin-backend/backend-web/src/main/java/com/gitee/sop/adminbackend/controller/sys/SysAdminUserController.java b/sop-admin/sop-admin-backend/backend-web/src/main/java/com/gitee/sop/adminbackend/controller/sys/SysAdminUserController.java deleted file mode 100644 index c73861e3..00000000 --- a/sop-admin/sop-admin-backend/backend-web/src/main/java/com/gitee/sop/adminbackend/controller/sys/SysAdminUserController.java +++ /dev/null @@ -1,66 +0,0 @@ -package com.gitee.sop.adminbackend.controller.sys; - -import com.gitee.fastmybatis.core.PageInfo; -import com.gitee.fastmybatis.core.query.Query; -import com.gitee.fastmybatis.core.query.param.PageParam; -import com.gitee.sop.adminbackend.common.resp.Result; -import com.gitee.sop.adminbackend.dao.entity.SysAdminUser; -import com.gitee.sop.adminbackend.service.sys.SysAdminUserService; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.validation.annotation.Validated; -import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.PostMapping; -import org.springframework.web.bind.annotation.RequestBody; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RestController; - - -/** - * @author 六如 - */ -@RestController -@RequestMapping("sys/adminuser") -public class SysAdminUserController { - - @Autowired - private SysAdminUserService sysAdminUserService; - - /** - * 分页查询 - * - * @param param 查询参数 - * @return 返回分页结果 - */ - @GetMapping("/page") - public Result> page(PageParam param) { - Query query = param.toQuery(); - PageInfo pageInfo = sysAdminUserService.page(query); - return Result.ok(pageInfo); - } - - /** - * 新增记录 - * - * @param sysAdminUser 表单参数 - * @return 返回添加后的主键值 - */ - @PostMapping("/add") - public Result add(@Validated @RequestBody SysAdminUser sysAdminUser) { - sysAdminUserService.save(sysAdminUser); - // 返回添加后的主键值 - return Result.ok(sysAdminUser.getId()); - } - - /** - * 修改记录 - * - * @param sysAdminUser 表单数据 - * @return 返回影响行数 - */ - @PostMapping("/update") - public Result update(@Validated @RequestBody SysAdminUser sysAdminUser) { - return Result.ok(sysAdminUserService.update(sysAdminUser)); - } - - -} diff --git a/sop-admin/sop-admin-backend/backend-web/src/main/java/com/gitee/sop/adminbackend/controller/sys/SysDeptController.java b/sop-admin/sop-admin-backend/backend-web/src/main/java/com/gitee/sop/adminbackend/controller/sys/SysDeptController.java new file mode 100644 index 00000000..743bf91b --- /dev/null +++ b/sop-admin/sop-admin-backend/backend-web/src/main/java/com/gitee/sop/adminbackend/controller/sys/SysDeptController.java @@ -0,0 +1,82 @@ +package com.gitee.sop.adminbackend.controller.sys; + +import com.gitee.sop.adminbackend.common.dto.StatusUpdateDTO; +import com.gitee.sop.adminbackend.common.exception.BizException; +import com.gitee.sop.adminbackend.common.req.StatusUpdateParam; +import com.gitee.sop.adminbackend.common.resp.Result; +import com.gitee.sop.adminbackend.common.util.CopyUtil; +import com.gitee.sop.adminbackend.dao.entity.SysDept; +import com.gitee.sop.adminbackend.service.sys.SysDeptService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import java.util.List; +import java.util.Objects; + +/** + * @author 六如 + */ +@RestController +@RequestMapping("sys/dept") +public class SysDeptController { + + @Autowired + private SysDeptService sysDeptService; + + /** + * listAll + * + * @return 返回分页结果 + */ + @GetMapping("/listAll") + public Result> listAll() { + List sysDepts = sysDeptService.listAll(); + return Result.ok(sysDepts); + } + + /** + * 新增记录 + * + * @param sysDept 表单参数 + * @return 返回添加后的主键值 + */ + @PostMapping("/add") + public Result add(@Validated @RequestBody SysDept sysDept) { + Long id = sysDeptService.addDept(sysDept); + // 返回添加后的主键值 + return Result.ok(id); + } + + /** + * 修改记录 + * + * @param sysDept 表单数据 + * @return 返回影响行数 + */ + @PostMapping("/update") + public Result update(@Validated @RequestBody SysDept sysDept) { + if (Objects.equals(sysDept.getParentId(), sysDept.getId())) { + throw new BizException("父级不能选自己"); + } + return Result.ok(sysDeptService.update(sysDept)); + } + + + /** + * 修改状态 + * + * @param param 表单数据 + * @return 返回影响行数 + */ + @PostMapping("/updateStatus") + public Result updateStatus(@Validated @RequestBody StatusUpdateParam param) { + StatusUpdateDTO statusUpdateDTO = CopyUtil.copyBean(param, StatusUpdateDTO::new); + return Result.ok(sysDeptService.updateStatus(statusUpdateDTO)); + } + +} diff --git a/sop-admin/sop-admin-backend/backend-web/src/main/java/com/gitee/sop/adminbackend/controller/sys/SysResourceController.java b/sop-admin/sop-admin-backend/backend-web/src/main/java/com/gitee/sop/adminbackend/controller/sys/SysResourceController.java new file mode 100644 index 00000000..7633f929 --- /dev/null +++ b/sop-admin/sop-admin-backend/backend-web/src/main/java/com/gitee/sop/adminbackend/controller/sys/SysResourceController.java @@ -0,0 +1,116 @@ +package com.gitee.sop.adminbackend.controller.sys; + +import com.gitee.sop.adminbackend.common.context.UserContext; +import com.gitee.sop.adminbackend.common.req.IdParam; +import com.gitee.sop.adminbackend.common.resp.Result; +import com.gitee.sop.adminbackend.common.util.CopyUtil; +import com.gitee.sop.adminbackend.controller.sys.param.SysResourceAddParam; +import com.gitee.sop.adminbackend.controller.sys.param.SysResourceUpdateParam; +import com.gitee.sop.adminbackend.controller.sys.param.SysRoleResourceSaveParam; +import com.gitee.sop.adminbackend.controller.sys.vo.SysResourceVO; +import com.gitee.sop.adminbackend.dao.entity.SysResource; +import com.gitee.sop.adminbackend.service.sys.SysResourceService; +import com.gitee.sop.adminbackend.service.sys.SysRoleResourceService; +import com.gitee.sop.adminbackend.service.sys.dto.SysRoleResourceDTO; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import java.util.List; + +/** + * 资源菜单 + * + * @author 六如 + */ +@RestController +@RequestMapping("sys/resource") +public class SysResourceController { + + @Autowired + private SysResourceService sysResourceService; + @Autowired + private SysRoleResourceService sysRoleResourceService; + + /** + * 查询全部资源 + * + * @return 返回分页结果 + */ + @GetMapping("/listAll") + public Result> tree() { + List list = sysResourceService.listAll(); + List retList = CopyUtil.copyList(list, SysResourceVO::new); + return Result.ok(retList); + } + + + /** + * 新增记录 + * + * @param param 表单参数 + * @return 返回添加后的主键值 + */ + @PostMapping("/add") + public Result add(@Validated @RequestBody SysResourceAddParam param) { + SysResource sysResource = CopyUtil.copyBean(param, SysResource::new); + sysResourceService.save(sysResource); + // 返回添加后的主键值 + return Result.ok(sysResource.getId()); + } + + /** + * 修改记录 + * + * @param param 表单数据 + * @return 返回影响行数 + */ + @PostMapping("/update") + public Result update(@Validated @RequestBody SysResourceUpdateParam param) { + SysResource sysResource = CopyUtil.copyBean(param, SysResource::new); + return Result.ok(sysResourceService.update(sysResource)); + } + + /** + * 删除记录 + * + * @param param 参数 + * @return 返回影响行数 + */ + @PostMapping("/delete") + public Result delete(@Validated @RequestBody IdParam param) { + return Result.ok(sysResourceService.deleteById(param.getId())); + } + + /** + * 保存角色资源 + * + * @param param 参数 + * @return 返回影响行数 + */ + @PostMapping("/saveRoleResource") + public Result saveRoleResource(@Validated @RequestBody SysRoleResourceSaveParam param) { + SysRoleResourceDTO sysRoleResourceDTO = CopyUtil.copyBean(param, SysRoleResourceDTO::new); + sysRoleResourceDTO.setAddBy(UserContext.getUser().getUserId()); + int cnt = sysRoleResourceService.saveRoleResource(sysRoleResourceDTO); + return Result.ok(cnt); + } + + /** + * 获取角色资源 + * + * @param param 参数 + * @return 返回影响行数 + */ + @GetMapping("/listRoleResource") + public Result> listRoleResource(@Validated IdParam param) { + List resourceIds = sysRoleResourceService.listRoleResource(param.getId()); + return Result.ok(resourceIds); + } + + +} diff --git a/sop-admin/sop-admin-backend/backend-web/src/main/java/com/gitee/sop/adminbackend/controller/sys/SysRoleController.java b/sop-admin/sop-admin-backend/backend-web/src/main/java/com/gitee/sop/adminbackend/controller/sys/SysRoleController.java index 9d3035a7..ff0470c1 100644 --- a/sop-admin/sop-admin-backend/backend-web/src/main/java/com/gitee/sop/adminbackend/controller/sys/SysRoleController.java +++ b/sop-admin/sop-admin-backend/backend-web/src/main/java/com/gitee/sop/adminbackend/controller/sys/SysRoleController.java @@ -10,6 +10,7 @@ import com.gitee.sop.adminbackend.common.util.CopyUtil; import com.gitee.sop.adminbackend.controller.sys.param.SysRoleParam; import com.gitee.sop.adminbackend.dao.entity.SysRole; import com.gitee.sop.adminbackend.service.sys.SysRoleService; +import org.springframework.beans.factory.annotation.Autowired; import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PostMapping; @@ -17,7 +18,7 @@ import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; -import javax.annotation.Resource; +import java.util.List; /** * @author 六如 @@ -26,7 +27,7 @@ import javax.annotation.Resource; @RequestMapping("sys/role") public class SysRoleController { - @Resource + @Autowired private SysRoleService sysRoleService; /** @@ -38,10 +39,21 @@ public class SysRoleController { @GetMapping("/page") public Result> page(SysRoleParam param) { LambdaQuery query = param.toLambdaQuery(SysRole.class); - PageInfo pageInfo = sysRoleService.doPage(query); + PageInfo pageInfo = sysRoleService.page(query); return Result.ok(pageInfo); } + /** + * 所有角色 + * + * @return 返回分页结果 + */ + @GetMapping("/all") + public Result> all() { + List list = sysRoleService.listAll(); + return Result.ok(list); + } + /** * 新增记录 * diff --git a/sop-admin/sop-admin-backend/backend-web/src/main/java/com/gitee/sop/adminbackend/controller/sys/SysUserController.java b/sop-admin/sop-admin-backend/backend-web/src/main/java/com/gitee/sop/adminbackend/controller/sys/SysUserController.java new file mode 100644 index 00000000..f45b9995 --- /dev/null +++ b/sop-admin/sop-admin-backend/backend-web/src/main/java/com/gitee/sop/adminbackend/controller/sys/SysUserController.java @@ -0,0 +1,120 @@ +package com.gitee.sop.adminbackend.controller.sys; + +import com.gitee.fastmybatis.core.PageInfo; +import com.gitee.sop.adminbackend.common.context.UserContext; +import com.gitee.sop.adminbackend.common.dto.StatusUpdateBatchDTO; +import com.gitee.sop.adminbackend.common.dto.StatusUpdateDTO; +import com.gitee.sop.adminbackend.common.req.StatusUpdateBatchParam; +import com.gitee.sop.adminbackend.common.req.StatusUpdateParam; +import com.gitee.sop.adminbackend.common.resp.Result; +import com.gitee.sop.adminbackend.common.util.CopyUtil; +import com.gitee.sop.adminbackend.controller.sys.param.RestPasswordParam; +import com.gitee.sop.adminbackend.controller.sys.param.SysUserAddParam; +import com.gitee.sop.adminbackend.controller.sys.param.SysUserParam; +import com.gitee.sop.adminbackend.controller.sys.param.SysUserUpdateParam; +import com.gitee.sop.adminbackend.controller.sys.vo.SysUserVO; +import com.gitee.sop.adminbackend.service.sys.SysUserService; +import com.gitee.sop.adminbackend.service.sys.dto.SysUserAddDTO; +import com.gitee.sop.adminbackend.service.sys.dto.SysUserDTO; +import com.gitee.sop.adminbackend.service.sys.dto.SysUserSearchDTO; +import com.gitee.sop.adminbackend.service.sys.dto.SysUserUpdateDTO; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + + +/** + * @author 六如 + */ +@RestController +@RequestMapping("sys/user") +public class SysUserController { + + @Autowired + private SysUserService sysUserService; + + /** + * 分页查询 + * + * @param param 查询参数 + * @return 返回分页结果 + */ + @GetMapping("/page") + public Result> page(SysUserParam param) { + SysUserSearchDTO sysUserSearchDTO = CopyUtil.copyBean(param, SysUserSearchDTO::new); + PageInfo pageInfo = sysUserService.doPage(sysUserSearchDTO); + PageInfo ret = CopyUtil.copyPageInfo(pageInfo, records -> CopyUtil.deepCopyList(records, SysUserVO.class)); + return Result.ok(ret); + } + + /** + * 新增记录 + * + * @param param 表单参数 + * @return 返回添加后的主键值 + */ + @PostMapping("/add") + public Result add(@Validated @RequestBody SysUserAddParam param) { + SysUserAddDTO sysUser = CopyUtil.copyBean(param, SysUserAddDTO::new); + sysUser.setUpdateBy(UserContext.getUser().getUserId()); + Long id = sysUserService.addUser(sysUser); + // 返回添加后的主键值 + return Result.ok(id); + } + + /** + * 修改记录 + * + * @param param 表单数据 + * @return 返回影响行数 + */ + @PostMapping("/update") + public Result update(@Validated @RequestBody SysUserUpdateParam param) { + SysUserUpdateDTO sysUser = CopyUtil.copyBean(param, SysUserUpdateDTO::new); + sysUser.setUpdateBy(UserContext.getUser().getUserId()); + int cnt = sysUserService.updateUser(sysUser); + return Result.ok(cnt); + } + + /** + * 修改状态 + * + * @param param 表单数据 + * @return 返回影响行数 + */ + @PostMapping("/updateStatus") + public Result updateStatus(@Validated @RequestBody StatusUpdateParam param) { + StatusUpdateDTO statusUpdateDTO = CopyUtil.copyBean(param, StatusUpdateDTO::new); + return Result.ok(sysUserService.updateStatus(statusUpdateDTO)); + } + + /** + * 修改状态批量 + * + * @param param 表单数据 + * @return 返回影响行数 + */ + @PostMapping("/updateStatusBatch") + public Result updateStatus(@Validated @RequestBody StatusUpdateBatchParam param) { + StatusUpdateBatchDTO statusUpdateBatchDTO = CopyUtil.copyBean(param, StatusUpdateBatchDTO::new); + return Result.ok(sysUserService.updateStatus(statusUpdateBatchDTO)); + } + + /** + * 重置用户密码 + * + * @param param 表单数据 + * @return 返回影响行数 + */ + @PostMapping("/resetPassword") + public Result resetPassword(@Validated @RequestBody RestPasswordParam param) { + sysUserService.resetUserPassword(param.getUserId(), param.getPasswordHash()); + return Result.ok(1); + } + + +} diff --git a/sop-admin/sop-admin-backend/backend-web/src/main/java/com/gitee/sop/adminbackend/controller/sys/SysUserRoleController.java b/sop-admin/sop-admin-backend/backend-web/src/main/java/com/gitee/sop/adminbackend/controller/sys/SysUserRoleController.java new file mode 100644 index 00000000..0cd9c8e3 --- /dev/null +++ b/sop-admin/sop-admin-backend/backend-web/src/main/java/com/gitee/sop/adminbackend/controller/sys/SysUserRoleController.java @@ -0,0 +1,51 @@ +package com.gitee.sop.adminbackend.controller.sys; + +import com.gitee.sop.adminbackend.common.context.UserContext; +import com.gitee.sop.adminbackend.common.resp.Result; +import com.gitee.sop.adminbackend.controller.sys.param.SysUserRoleSettingParam; +import com.gitee.sop.adminbackend.service.sys.SysUserRoleService; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import javax.annotation.Resource; +import java.util.List; + +/** + * @author 六如 + */ +@RestController +@RequestMapping("sys/userrole") +public class SysUserRoleController { + + @Resource + private SysUserRoleService sysUserRoleService; + + /** + * 获取用户角色id + * + * @return 返回角色id + */ + @GetMapping("/getUserRoleIds") + public Result> getUserRoleIds(Long userId) { + List roleIds = sysUserRoleService.listUserRoleIds(userId); + return Result.ok(roleIds); + } + + /** + * 设置用户角色 + * + * @param param 表单数据 + * @return 返回影响行数 + */ + @PostMapping("/setUserRole") + public Result setUserRole(@Validated @RequestBody SysUserRoleSettingParam param) { + sysUserRoleService.setUserRole(param.getUserId(), param.getRoleIds(), UserContext.getUser()); + return Result.ok(1); + } + + +} diff --git a/sop-admin/sop-admin-backend/backend-web/src/main/java/com/gitee/sop/adminbackend/controller/sys/param/RestPasswordParam.java b/sop-admin/sop-admin-backend/backend-web/src/main/java/com/gitee/sop/adminbackend/controller/sys/param/RestPasswordParam.java new file mode 100644 index 00000000..3b39c7d0 --- /dev/null +++ b/sop-admin/sop-admin-backend/backend-web/src/main/java/com/gitee/sop/adminbackend/controller/sys/param/RestPasswordParam.java @@ -0,0 +1,19 @@ +package com.gitee.sop.adminbackend.controller.sys.param; + +import lombok.Data; + +import javax.validation.constraints.NotBlank; +import javax.validation.constraints.NotNull; + +/** + * @author 六如 + */ +@Data +public class RestPasswordParam { + + @NotNull + private Long userId; + + @NotBlank + private String passwordHash; +} diff --git a/sop-admin/sop-admin-backend/backend-web/src/main/java/com/gitee/sop/adminbackend/controller/sys/param/SysDeptParam.java b/sop-admin/sop-admin-backend/backend-web/src/main/java/com/gitee/sop/adminbackend/controller/sys/param/SysDeptParam.java new file mode 100644 index 00000000..28834f75 --- /dev/null +++ b/sop-admin/sop-admin-backend/backend-web/src/main/java/com/gitee/sop/adminbackend/controller/sys/param/SysDeptParam.java @@ -0,0 +1,31 @@ +package com.gitee.sop.adminbackend.controller.sys.param; + +import com.gitee.fastmybatis.core.query.Operator; +import com.gitee.fastmybatis.core.query.annotation.Condition; +import com.gitee.fastmybatis.core.query.param.PageParam; +import lombok.Data; +import lombok.EqualsAndHashCode; + +/** + * 备注:部门表 + * + * @author 六如 + */ +@EqualsAndHashCode(callSuper = true) +@Data +public class SysDeptParam extends PageParam { + private static final long serialVersionUID = 7104037961585738100L; + + /** + * 部门名称 + */ + @Condition(operator = Operator.like) + private String name; + + /** + * 状态,1:启用,2:禁用 + */ + @Condition + private Integer status; + +} diff --git a/sop-admin/sop-admin-backend/backend-web/src/main/java/com/gitee/sop/adminbackend/controller/sys/param/SysResourceAddParam.java b/sop-admin/sop-admin-backend/backend-web/src/main/java/com/gitee/sop/adminbackend/controller/sys/param/SysResourceAddParam.java new file mode 100644 index 00000000..af886dd8 --- /dev/null +++ b/sop-admin/sop-admin-backend/backend-web/src/main/java/com/gitee/sop/adminbackend/controller/sys/param/SysResourceAddParam.java @@ -0,0 +1,160 @@ +package com.gitee.sop.adminbackend.controller.sys.param; + +import java.time.LocalDateTime; + +import com.gitee.sop.adminbackend.common.jackson.convert.annotation.Bool; +import lombok.Data; + +import javax.validation.constraints.NotBlank; +import javax.validation.constraints.NotNull; + + +/** + * + * @author 六如 + */ +@Data +public class SysResourceAddParam { + + /** + * 菜单类型(0代表菜单、1代表iframe、2代表外链、3代表按钮) + */ + @NotNull + private Integer menuType; + + /** + * 菜单名称 + */ + @NotBlank + private String title; + + /** + * 路由名称 + */ + @NotBlank + private String name; + + /** + * 路由路径 + */ + @NotBlank + private String path; + + /** + * 路由路径 + */ + private String component; + + /** + * 排序 + */ + private Integer rank; + + /** + * 路由重定向 + */ + private String redirect; + + /** + * 路由重定向 + */ + private String icon; + + /** + * 右侧图标 + */ + private String extraIcon; + + /** + * 进场动画(页面加载动画) + */ + private String enterTransition; + + /** + * 离场动画(页面加载动画) + */ + private String leaveTransition; + + /** + * 菜单激活 + */ + private String activePath; + + /** + * 权限标识 + */ + private String auths; + + /** + * 链接地址(需要内嵌的`iframe`链接地址) + */ + private String frameSrc; + + /** + * 加载动画(内嵌的`iframe`页面是否开启首次加载动画) + */ + @Bool + private Integer frameLoading; + + /** + * 缓存页面 + */ + @Bool + private Integer keepAlive; + + /** + * 标签页(当前菜单名称或自定义信息禁止添加到标签页) + */ + @Bool + private Integer hiddenTag; + + /** + * 固定标签页(当前菜单名称是否固定显示在标签页且不可关闭) + */ + @Bool + private Integer fixedTag; + + /** + * 菜单(是否显示该菜单) + */ + @Bool + private Integer showLink; + + /** + * 父级菜单(是否显示父级菜单 + */ + @Bool + private Integer showParent; + + /** + * 父级id + */ + private Long parentId; + + /** + * 是否删除 + */ + private Integer isDeleted; + + /** + * 添加时间 + */ + private LocalDateTime addTime; + + /** + * 修改时间 + */ + private LocalDateTime updateTime; + + /** + * 创建人id + */ + private Long addBy; + + /** + * 修改人id + */ + private Long updateBy; + + +} diff --git a/sop-admin/sop-admin-backend/backend-web/src/main/java/com/gitee/sop/adminbackend/controller/sys/param/SysResourceUpdateParam.java b/sop-admin/sop-admin-backend/backend-web/src/main/java/com/gitee/sop/adminbackend/controller/sys/param/SysResourceUpdateParam.java new file mode 100644 index 00000000..860f4f4f --- /dev/null +++ b/sop-admin/sop-admin-backend/backend-web/src/main/java/com/gitee/sop/adminbackend/controller/sys/param/SysResourceUpdateParam.java @@ -0,0 +1,19 @@ +package com.gitee.sop.adminbackend.controller.sys.param; + +import lombok.Data; +import lombok.EqualsAndHashCode; + +import javax.validation.constraints.NotNull; + +/** + * @author 六如 + */ +@EqualsAndHashCode(callSuper = true) +@Data +public class SysResourceUpdateParam extends SysResourceAddParam { + /** + * id + */ + @NotNull(message = "id必填") + private Long id; +} diff --git a/sop-admin/sop-admin-backend/backend-web/src/main/java/com/gitee/sop/adminbackend/controller/sys/param/SysRoleResourceSaveParam.java b/sop-admin/sop-admin-backend/backend-web/src/main/java/com/gitee/sop/adminbackend/controller/sys/param/SysRoleResourceSaveParam.java new file mode 100644 index 00000000..1a27e7b7 --- /dev/null +++ b/sop-admin/sop-admin-backend/backend-web/src/main/java/com/gitee/sop/adminbackend/controller/sys/param/SysRoleResourceSaveParam.java @@ -0,0 +1,27 @@ +package com.gitee.sop.adminbackend.controller.sys.param; + +import lombok.Data; + +import javax.validation.constraints.NotEmpty; +import javax.validation.constraints.NotNull; +import java.util.List; + +/** + * @author 六如 + */ +@Data +public class SysRoleResourceSaveParam { + + /** + * 角色id + */ + @NotNull + private Long roleId; + + /** + * 资源id + */ + @NotEmpty + private List resourceIds; + +} diff --git a/sop-admin/sop-admin-backend/backend-web/src/main/java/com/gitee/sop/adminbackend/controller/sys/param/SysUserAddParam.java b/sop-admin/sop-admin-backend/backend-web/src/main/java/com/gitee/sop/adminbackend/controller/sys/param/SysUserAddParam.java new file mode 100644 index 00000000..90f27234 --- /dev/null +++ b/sop-admin/sop-admin-backend/backend-web/src/main/java/com/gitee/sop/adminbackend/controller/sys/param/SysUserAddParam.java @@ -0,0 +1,96 @@ +package com.gitee.sop.adminbackend.controller.sys.param; + +import java.time.LocalDateTime; + +import lombok.Data; + +import javax.validation.constraints.Min; +import javax.validation.constraints.NotNull; + + +/** + * + * @author 六如 + */ +@Data +public class SysUserAddParam { + + /** + * 用户名 + */ + private String username; + + /** + * 密码 + */ + private String password; + + /** + * 昵称 + */ + private String nickname; + + /** + * 邮箱 + */ + private String phone; + + /** + * 邮箱 + */ + private String email; + + /** + * 头像 + */ + private String avatar; + + /** + * 性别,0-未知,1-男,2-女 + */ + private Integer gender; + + /** + * 状态,1:启用,2:禁用 + */ + private Integer status; + + /** + * 注册类型,1-系统,2-手动 + */ + private String regType; + + /** + * 备注 + */ + private String remark; + + /** + * 添加时间 + */ + private LocalDateTime addTime; + + /** + * 修改时间 + */ + private LocalDateTime updateTime; + + /** + * 创建人id + */ + private Long addBy; + + /** + * 修改人id + */ + private Long updateBy; + + /** + * 部门id + */ + @NotNull(message = "请选择部门") + @Min(value = 1, message = "请选择部门") + private Long parentId; + + +} diff --git a/sop-admin/sop-admin-backend/backend-web/src/main/java/com/gitee/sop/adminbackend/controller/sys/param/SysUserParam.java b/sop-admin/sop-admin-backend/backend-web/src/main/java/com/gitee/sop/adminbackend/controller/sys/param/SysUserParam.java new file mode 100644 index 00000000..37c54a23 --- /dev/null +++ b/sop-admin/sop-admin-backend/backend-web/src/main/java/com/gitee/sop/adminbackend/controller/sys/param/SysUserParam.java @@ -0,0 +1,41 @@ +package com.gitee.sop.adminbackend.controller.sys.param; + +import com.gitee.fastmybatis.core.query.Operator; +import com.gitee.fastmybatis.core.query.annotation.Condition; +import com.gitee.fastmybatis.core.query.param.PageParam; +import lombok.Data; +import lombok.EqualsAndHashCode; + +/** + * 备注:系统用户表 + * + * @author 六如 + */ +@EqualsAndHashCode(callSuper = true) +@Data +public class SysUserParam extends PageParam { + private static final long serialVersionUID = 1L; + + /** + * 用户名 + */ + @Condition(operator = Operator.like) + private String username; + + /** + * 邮箱 + */ + @Condition(operator = Operator.like) + private String phone; + + + /** + * 状态,1:启用,2:禁用 + */ + @Condition + private Integer status; + + @Condition(ignore = true) + private Long deptId; + +} diff --git a/sop-admin/sop-admin-backend/backend-web/src/main/java/com/gitee/sop/adminbackend/controller/sys/param/SysUserRoleSettingParam.java b/sop-admin/sop-admin-backend/backend-web/src/main/java/com/gitee/sop/adminbackend/controller/sys/param/SysUserRoleSettingParam.java new file mode 100644 index 00000000..b22e9061 --- /dev/null +++ b/sop-admin/sop-admin-backend/backend-web/src/main/java/com/gitee/sop/adminbackend/controller/sys/param/SysUserRoleSettingParam.java @@ -0,0 +1,28 @@ +package com.gitee.sop.adminbackend.controller.sys.param; + +import lombok.Data; + +import javax.validation.constraints.NotNull; +import java.util.List; + + +/** + * + * @author 六如 + */ +@Data +public class SysUserRoleSettingParam { + + /** + * sys_role.id + */ + private List roleIds; + + /** + * sys_user.id + */ + @NotNull + private Long userId; + + +} diff --git a/sop-admin/sop-admin-backend/backend-web/src/main/java/com/gitee/sop/adminbackend/controller/sys/param/SysUserUpdateParam.java b/sop-admin/sop-admin-backend/backend-web/src/main/java/com/gitee/sop/adminbackend/controller/sys/param/SysUserUpdateParam.java new file mode 100644 index 00000000..1da0ba57 --- /dev/null +++ b/sop-admin/sop-admin-backend/backend-web/src/main/java/com/gitee/sop/adminbackend/controller/sys/param/SysUserUpdateParam.java @@ -0,0 +1,23 @@ +package com.gitee.sop.adminbackend.controller.sys.param; + +import lombok.Data; +import lombok.EqualsAndHashCode; + +import javax.validation.constraints.NotNull; + + +/** + * + * @author 六如 + */ +@EqualsAndHashCode(callSuper = true) +@Data +public class SysUserUpdateParam extends SysUserAddParam { + + /** + * id + */ + @NotNull(message = "id必填") + private Long id; + +} diff --git a/sop-admin/sop-admin-backend/backend-web/src/main/java/com/gitee/sop/adminbackend/controller/sys/vo/SysDeptVO.java b/sop-admin/sop-admin-backend/backend-web/src/main/java/com/gitee/sop/adminbackend/controller/sys/vo/SysDeptVO.java new file mode 100644 index 00000000..678cf9f9 --- /dev/null +++ b/sop-admin/sop-admin-backend/backend-web/src/main/java/com/gitee/sop/adminbackend/controller/sys/vo/SysDeptVO.java @@ -0,0 +1,71 @@ +package com.gitee.sop.adminbackend.controller.sys.vo; + +import lombok.Data; + +import java.time.LocalDateTime; +import java.util.List; + + +/** + * 表名:sys_dept + * 备注:部门表 + * + * @author 六如 + */ +@Data +public class SysDeptVO { + + /** + * id + */ + private Long id; + + /** + * 部门名称 + */ + private String name; + + /** + * 排序 + */ + private Integer sort; + + /** + * 状态,1:启用,2:禁用 + */ + private Integer status; + + /** + * 备注 + */ + private String remark; + + /** + * 父级id + */ + private Long parentId; + + /** + * 添加时间 + */ + private LocalDateTime addTime; + + /** + * 修改时间 + */ + private LocalDateTime updateTime; + + /** + * 创建人id + */ + private Long addBy; + + /** + * 修改人id + */ + private Long updateBy; + + private List children; + + +} diff --git a/sop-admin/sop-admin-backend/backend-web/src/main/java/com/gitee/sop/adminbackend/controller/sys/vo/SysResourceVO.java b/sop-admin/sop-admin-backend/backend-web/src/main/java/com/gitee/sop/adminbackend/controller/sys/vo/SysResourceVO.java new file mode 100644 index 00000000..02b71002 --- /dev/null +++ b/sop-admin/sop-admin-backend/backend-web/src/main/java/com/gitee/sop/adminbackend/controller/sys/vo/SysResourceVO.java @@ -0,0 +1,163 @@ +package com.gitee.sop.adminbackend.controller.sys.vo; + +import com.gitee.sop.adminbackend.common.jackson.convert.annotation.Bool; +import lombok.Data; + +import javax.validation.constraints.NotBlank; +import javax.validation.constraints.NotNull; +import java.time.LocalDateTime; + + +/** + * @author 六如 + */ +@Data +public class SysResourceVO { + + /** + * id + */ + private Long id; + + /** + * 菜单类型(0代表菜单、1代表iframe、2代表外链、3代表按钮) + */ + @NotNull + private Integer menuType; + + /** + * 菜单名称 + */ + @NotBlank + private String title; + + /** + * 路由名称 + */ + @NotBlank + private String name; + + /** + * 路由路径 + */ + @NotBlank + private String path; + + /** + * 路由路径 + */ + private String component; + + /** + * 排序 + */ + private Integer rank; + + /** + * 路由重定向 + */ + private String redirect; + + /** + * 路由重定向 + */ + private String icon; + + /** + * 右侧图标 + */ + private String extraIcon; + + /** + * 进场动画(页面加载动画) + */ + private String enterTransition; + + /** + * 离场动画(页面加载动画) + */ + private String leaveTransition; + + /** + * 菜单激活 + */ + private String activePath; + + /** + * 权限标识 + */ + private String auths; + + /** + * 链接地址(需要内嵌的`iframe`链接地址) + */ + private String frameSrc; + + /** + * 加载动画(内嵌的`iframe`页面是否开启首次加载动画) + */ + @Bool + private Integer frameLoading; + + /** + * 缓存页面 + */ + @Bool + private Integer keepAlive; + + /** + * 标签页(当前菜单名称或自定义信息禁止添加到标签页) + */ + @Bool + private Integer hiddenTag; + + /** + * 固定标签页(当前菜单名称是否固定显示在标签页且不可关闭) + */ + @Bool + private Integer fixedTag; + + /** + * 菜单(是否显示该菜单) + */ + @Bool + private Integer showLink; + + /** + * 父级菜单(是否显示父级菜单 + */ + @Bool + private Integer showParent; + + /** + * 父级id + */ + private Long parentId; + + /** + * 是否删除 + */ + private Integer isDeleted; + + /** + * 添加时间 + */ + private LocalDateTime addTime; + + /** + * 修改时间 + */ + private LocalDateTime updateTime; + + /** + * 创建人id + */ + private Long addBy; + + /** + * 修改人id + */ + private Long updateBy; + + +} diff --git a/sop-admin/sop-admin-backend/backend-web/src/main/java/com/gitee/sop/adminbackend/controller/sys/vo/SysUserVO.java b/sop-admin/sop-admin-backend/backend-web/src/main/java/com/gitee/sop/adminbackend/controller/sys/vo/SysUserVO.java new file mode 100644 index 00000000..1b858348 --- /dev/null +++ b/sop-admin/sop-admin-backend/backend-web/src/main/java/com/gitee/sop/adminbackend/controller/sys/vo/SysUserVO.java @@ -0,0 +1,93 @@ +package com.gitee.sop.adminbackend.controller.sys.vo; + +import lombok.Data; + +import javax.validation.constraints.Min; +import javax.validation.constraints.NotNull; +import java.time.LocalDateTime; + + +/** + * + * @author 六如 + */ +@Data +public class SysUserVO { + + /** + * id + */ + private Long id; + + /** + * 用户名 + */ + private String username; + + /** + * 昵称 + */ + private String nickname; + + /** + * 邮箱 + */ + private String phone; + + /** + * 邮箱 + */ + private String email; + + /** + * 头像 + */ + private String avatar; + + /** + * 性别,0-未知,1-男,2-女 + */ + private Integer gender; + + /** + * 状态,1:启用,2:禁用 + */ + private Integer status; + + /** + * 注册类型,1-系统,2-手动 + */ + private String regType; + + /** + * 备注 + */ + private String remark; + + /** + * 添加时间 + */ + private LocalDateTime addTime; + + /** + * 修改时间 + */ + private LocalDateTime updateTime; + + /** + * 创建人id + */ + private Long addBy; + + /** + * 修改人id + */ + private Long updateBy; + + /** + * 部门 + */ + private SysDeptVO dept; + + +} diff --git a/sop-admin/sop-admin-frontend/mock/asyncRoutes.ts b/sop-admin/sop-admin-frontend/mock/asyncRoutes.ts index 40a3accc..37f5622a 100644 --- a/sop-admin/sop-admin-frontend/mock/asyncRoutes.ts +++ b/sop-admin/sop-admin-frontend/mock/asyncRoutes.ts @@ -12,8 +12,8 @@ const apiRouters = [ }, children: [ { - path: "/serve/api/index", - name: "ApiManage", + path: "/serve/api", + name: "ServeApi", meta: { title: "接口管理", roles: ["admin"] @@ -56,8 +56,8 @@ const apiRouters = [ }, children: [ { - path: "/isv/list/index", - name: "IsvManage", + path: "/isv/list", + name: "IsvList", meta: { title: "ISV列表", roles: ["admin"] @@ -65,7 +65,7 @@ const apiRouters = [ }, { path: "/isv/perm/permGroup", - name: "PermGroup", + name: "IsvPermPermGroup", meta: { title: "分组管理", roles: ["admin"] diff --git a/sop-admin/sop-admin-frontend/src/api/sysAdminUser.ts b/sop-admin/sop-admin-frontend/src/api/sysAdminUser.ts index 9b22c1c4..533d9b0e 100644 --- a/sop-admin/sop-admin-frontend/src/api/sysAdminUser.ts +++ b/sop-admin/sop-admin-frontend/src/api/sysAdminUser.ts @@ -3,10 +3,10 @@ import type { PageResult, Result } from "@/model"; // 后端请求接口 const apiUrl: any = createUrl({ - page: "/sys/adminuser/page", - add: "/sys/adminuser/add", - update: "/sys/adminuser/update", - del: "/sys/adminuser/delete" + page: "/sys/user/page", + add: "/sys/user/add", + update: "/sys/user/update", + del: "/sys/user/delete" }); /** diff --git a/sop-admin/sop-admin-frontend/src/api/system.ts b/sop-admin/sop-admin-frontend/src/api/system.ts index ca654548..acb119eb 100644 --- a/sop-admin/sop-admin-frontend/src/api/system.ts +++ b/sop-admin/sop-admin-frontend/src/api/system.ts @@ -20,18 +20,66 @@ type ResultTable = { }; /** 获取系统管理-用户管理列表 */ -export const getUserList = (data?: object) => { - return http.request("post", "/user", { data }); +export const getUserList = (params?: object) => { + return http.request("get", baseUrl("sys/user/page"), { params }); +}; + +/** 获取系统管理-用户管理-添加 */ +export const addUser = (data?: object) => { + return http.request("post", baseUrl("sys/user/add"), { + data + }); +}; + +/** 获取系统管理-用户管理-修改 */ +export const updateUser = (data?: object) => { + return http.request("post", baseUrl("sys/user/update"), { + data + }); +}; + +/** 获取系统管理-用户管理-修改状态 */ +export const updateUserStatus = (data?: object) => { + return http.request("post", baseUrl("sys/user/updateStatus"), { + data + }); +}; + +/** 获取系统管理-用户管理-重置密码 */ +export const resetPassword = (data?: object) => { + return http.request("post", baseUrl("sys/user/resetPassword"), { + data + }); +}; + +/** 获取系统管理-用户管理-批量修改状态 */ +export const updateStatusBatch = (data?: object) => { + return http.request( + "post", + baseUrl("sys/user/updateStatusBatch"), + { data } + ); +}; + +/** 系统管理-用户管理-根据userId,获取对应角色id列表(userId:用户id) */ +export const getRoleIds = (params?: object) => { + return http.request("get", baseUrl("sys/userrole/getUserRoleIds"), { + params + }); +}; + +/** 获取系统管理-用户管理-设置用户角色 */ +export const setUserRole = (data?: object) => { + return http.request( + "post", + baseUrl("sys/userrole/setUserRole"), + { data } + ); }; /** 系统管理-用户管理-获取所有角色列表 */ export const getAllRoleList = () => { - return http.request("get", "/list-all-role"); -}; - -/** 系统管理-用户管理-根据userId,获取对应角色id列表(userId:用户id) */ -export const getRoleIds = (data?: object) => { - return http.request("post", "/list-role-ids", { data }); + return http.request("get", baseUrl("sys/role/all")); }; /** 获取系统管理-角色管理列表 */ @@ -39,22 +87,26 @@ export const getRoleList = (params?: object) => { return http.request("get", baseUrl("sys/role/page"), { params }); }; +/** 添加角色 */ export const addRole = (data?: object) => { return http.request("post", baseUrl("sys/role/add"), { data }); }; +/** 删除角色状态 */ export const updateRoleStatus = (data?: object) => { return http.request("post", baseUrl("sys/role/updateStatus"), { data }); }; +/** 修改角色 */ export const updateRole = (data?: object) => { return http.request("post", baseUrl("sys/role/update"), { data }); }; +/** 删除角色 */ export const delRole = (data?: object) => { return http.request("post", baseUrl("sys/role/delete"), { data @@ -63,12 +115,48 @@ export const delRole = (data?: object) => { /** 获取系统管理-菜单管理列表 */ export const getMenuList = (data?: object) => { - return http.request("post", "/menu", { data }); + return http.request("get", baseUrl("sys/resource/listAll"), { + data + }); +}; + +/** 获取系统管理-菜单管理-添加 */ +export const addMenu = (data?: object) => { + return http.request("post", baseUrl("sys/resource/add"), { data }); +}; + +/** 获取系统管理-菜单管理-修改 */ +export const updateMenu = (data?: object) => { + return http.request("post", baseUrl("sys/resource/update"), { data }); +}; + +/** 获取系统管理-菜单管理-删除 */ +export const deleteMenu = (data?: object) => { + return http.request("post", baseUrl("sys/resource/delete"), { data }); +}; + +/** 系统管理-角色管理-保存角色菜单 */ +export const saveRoleMenu = (data?: object) => { + return http.request( + "post", + baseUrl("sys/resource/saveRoleResource"), + { data } + ); }; /** 获取系统管理-部门管理列表 */ -export const getDeptList = (data?: object) => { - return http.request("post", "/dept", { data }); +export const getDeptList = (params?: object) => { + return http.request("get", baseUrl("sys/dept/listAll"), { params }); +}; + +/** 获取系统管理-添加部门 */ +export const addDept = (data?: object) => { + return http.request("post", baseUrl("sys/dept/add"), { data }); +}; + +/** 获取系统管理-修改部门 */ +export const updateDept = (data?: object) => { + return http.request("post", baseUrl("sys/dept/update"), { data }); }; /** 获取系统监控-在线用户列表 */ @@ -97,11 +185,13 @@ export const getSystemLogsDetail = (data?: object) => { }; /** 获取角色管理-权限-菜单权限 */ -export const getRoleMenu = (data?: object) => { - return http.request("post", "/role-menu", { data }); +export const getRoleMenu = () => { + return http.request("get", baseUrl("sys/resource/listAll"), {}); }; /** 获取角色管理-权限-菜单权限-根据角色 id 查对应菜单 */ -export const getRoleMenuIds = (data?: object) => { - return http.request("post", "/role-menu-ids", { data }); +export const getRoleMenuIds = (params?: object) => { + return http.request("get", baseUrl("sys/resource/listRoleResource"), { + params + }); }; diff --git a/sop-admin/sop-admin-frontend/src/utils/http/index.ts b/sop-admin/sop-admin-frontend/src/utils/http/index.ts index 3c8aa0f9..21e59925 100644 --- a/sop-admin/sop-admin-frontend/src/utils/http/index.ts +++ b/sop-admin/sop-admin-frontend/src/utils/http/index.ts @@ -186,11 +186,17 @@ class PureHttp { if (response.code && response.code !== "0") { const msg = response.msg || "后台出错,请查看日志"; ElMessage.error(msg); + reject(response); } else { resolve(response); } }) .catch(error => { + console.error(error); + if (error) { + const msg = error?.message || "后台出错,请查看日志"; + ElMessage.error(msg); + } reject(error); }); }); diff --git a/sop-admin/sop-admin-frontend/src/views/doc/list/index.ts b/sop-admin/sop-admin-frontend/src/views/doc/list/index.ts index a3555ddc..23fae348 100644 --- a/sop-admin/sop-admin-frontend/src/views/doc/list/index.ts +++ b/sop-admin/sop-admin-frontend/src/views/doc/list/index.ts @@ -1,4 +1,4 @@ -import { computed, ref } from "vue"; +import { computed, onMounted, ref } from "vue"; import { ElMessage, ElMessageBox } from "element-plus"; import { api } from "@/api/doc"; import { @@ -8,336 +8,354 @@ import { } from "plus-pro-components"; import { YesOrNoEnum } from "@/model/enums"; -export const tabsData = ref>([ - { - id: "", - appName: "" - } -]); - -export const activeName = ref(0); -const docAppId = ref(0); -export const loading = ref(false); - -// 表格对象 -export const { tableData, buttons: actionButtons } = useTable(); - -export const filterText = ref(""); - -export const tableRows = computed(() => { - let search = filterText.value; - if (!search) { - return tableData.value; - } - search = search.toLowerCase(); - return searchRow(search, tableData.value, searchContent, isFolder); -}); - -const isFolder = row => { - return row.isFolder === 1; -}; - -const searchContent = (searchText, row) => { - return ( - (row.docName && row.docName.toLowerCase().indexOf(searchText) > -1) || - (row.docTitle && row.docTitle.toLowerCase().indexOf(searchText) > -1) - ); -}; - -// 表格字段定义 -export const tableColumns: PlusColumn[] = [ - { - label: "文档标题", - prop: "docTitle" - }, - { - label: "接口名", - prop: "docName" - }, - { - label: "版本号", - prop: "docVersion", - width: 80 - }, - { - label: "描述", - prop: "description", - tableColumnProps: { - showOverflowTooltip: true +export function useDocList() { + const tabsData = ref>([ + { + id: "", + appName: "" } - }, - { - label: "发布状态", - prop: "isPublish", - valueType: "select", - width: 100, - options: [ - { - label: "已发布", - value: YesOrNoEnum.YES, - color: "green" - }, - { - label: "未发布", - value: YesOrNoEnum.NO, - color: "red" - } - ], - renderHTML: (value, { row }) => { - if (row.isFolder) { - return ""; - } - return value - ? `
已发布
` - : `
未发布
`; - } - }, - { - width: 160, - label: "添加时间", - prop: "addTime" - }, - { - width: 160, - label: "修改时间", - prop: "updateTime" - } -]; -// 表格按钮定义 -actionButtons.value = [ - { - text: "发布", - confirm: { - options: { draggable: false }, - popconfirmProps: { width: 300 }, - message: params => { - const row = params.row; - return `确定要发布[${row.docTitle}]下所有接口吗?`; - } - }, - props: (_: any) => ({ - type: "success" - }), - onConfirm(params: ButtonsCallBackParams) { - const data = { - id: params.row.id, - isPublish: params.row.isPublish === 1 ? 0 : 1 - }; - api.publish(data).then(() => { - ElMessage.success("保存成功"); - search(); - }); - }, - show: (row: any) => row.isFolder === 1 - }, - { - text: "下线", - confirm: { - options: { draggable: false }, - popconfirmProps: { width: 300 }, - message: params => { - const row = params.row; - const opt = "下线"; - return `确定要${opt}[${row.docTitle}]下所有接口吗?`; - } - }, - props: { - type: "danger" - }, - onConfirm(params: ButtonsCallBackParams) { - const data = { - id: params.row.id, - isPublish: 0 - }; - api.publish(data).then(() => { - ElMessage.success("下线成功"); - search(); - }); - }, - show: (row: any) => row.isFolder === 1 - }, - { - text: row => (row.isPublish ? "下线" : "发布"), - confirm: { - options: { draggable: false }, - popconfirmProps: { width: 300 }, - message: params => { - const row = params.row; - const opt = row.isPublish ? "下线" : "发布"; - return `确定要${opt}[${row.docTitle}]吗?`; - } - }, - props: (row: any) => ({ - type: row.isPublish === 1 ? "danger" : "success" - }), - onConfirm(params: ButtonsCallBackParams) { - const data = { - id: params.row.id, - isPublish: params.row.isPublish === 1 ? 0 : 1 - }; - api.publish(data).then(() => { - ElMessage.success("保存成功"); - search(); - }); - }, - show: (row: any) => row.isFolder === 0 - }, - { - text: "同步", - confirm: { - options: { draggable: false }, - popconfirmProps: { width: 300 }, - message: params => { - const row = params.row; - return row.isFolder - ? `确定要同步[${row.docTitle}]下所有接口吗?` - : `确定要同步[${row.docTitle}]吗?`; - } - }, - props: (_: any) => ({ - type: "primary" - }), - onConfirm(params: ButtonsCallBackParams) { - loading.value = true; - api - .syncDoc(params.row.id) - .then(() => { - loading.value = false; - ElMessage.success("同步成功"); - search(); - }) - .catch(() => { - loading.value = false; - }); - } - } -]; - -// 点击查询按钮 -export const handleSearch = () => { - search(); -}; - -// 查询 -const search = async () => { - loadContent(docAppId.value); -}; - -export function handleSyncApi() { - ElMessageBox.confirm("确定要同步远程接口吗?", "提示", { - confirmButtonText: "确定", - cancelButtonText: "取消", - type: "warning" - }) - .then(() => { - loading.value = true; - api - .syncAppDoc(docAppId.value) - .then(() => { - loading.value = false; - ElMessage.success("同步成功"); - search(); - }) - .catch(() => { - loading.value = false; - }); - }) - .catch(() => {}); -} - -export const handleClick = data => { - const id = data.props.name; - activeTab(id); -}; - -const activeTab = id => { - docAppId.value = id; - loadContent(id); -}; - -export const handleAddApp = () => { - ElMessageBox.prompt("请输入Torna应用token", "添加应用", { - confirmButtonText: "确定", - cancelButtonText: "取消", - inputPattern: /\w+/, - inputErrorMessage: "请输入Torna应用token" - }) - .then(({ value }) => { - const data = { - tornaToken: value - }; - api.addApp(data).then(resp => { - ElMessage.success("添加成功"); - loadTabs(resp.data); - }); - }) - .catch(() => {}); -}; - -const loadTabs = docAppId => { - api.listApp().then(resp => { - tabsData.value = resp.data; - const length = tabsData.value.length; - if (length > 0) { - let targetId; - for (const id of tabsData.value) { - if (id === docAppId) { - targetId = id; - break; - } - } - if (!targetId) { - targetId = tabsData.value[0].id; - } - activeName.value = targetId; - activeTab(targetId); + ]); + + const activeName = ref(0); + const docAppId = ref(0); + const loading = ref(false); + + // 表格对象 + const { tableData, buttons: actionButtons } = useTable(); + + const filterText = ref(""); + + const tableRows = computed(() => { + let search = filterText.value; + if (!search) { + return tableData.value; } + search = search.toLowerCase(); + return searchRow(search, tableData.value, searchContent, isFolder); }); -}; -const searchRow = (search, rows, searchHandler, folderHandler) => { - if (!folderHandler) { - folderHandler = isFolder; - } - const ret = []; - for (const row of rows) { - // 找到分类 - if (folderHandler(row)) { - if (searchHandler(search, row)) { - ret.push(row); - } else { - // 分类名字没找到,需要从子文档中找 - const children = row.children || []; - const searchedChildren = searchRow( - search, - children, - searchHandler, - folderHandler - ); - // 如果子文档中有 - if (searchedChildren && searchedChildren.length > 0) { - const rowCopy = Object.assign({}, row); - rowCopy.children = searchedChildren; - ret.push(rowCopy); - } - } - } else { - // 不是分类且被找到 - if (searchHandler(search, row)) { - ret.push(row); - } - } - } - return ret; -}; - -const loadContent = id => { - const data = { - docAppId: id + const isFolder = row => { + return row.isFolder === 1; }; - api.listDocTree(data).then(resp => { - tableData.value = resp.data; - }); -}; -loadTabs(0); + const searchContent = (searchText, row) => { + return ( + (row.docName && row.docName.toLowerCase().indexOf(searchText) > -1) || + (row.docTitle && row.docTitle.toLowerCase().indexOf(searchText) > -1) + ); + }; + + // 表格字段定义 + const tableColumns: PlusColumn[] = [ + { + label: "文档标题", + prop: "docTitle" + }, + { + label: "接口名", + prop: "docName" + }, + { + label: "版本号", + prop: "docVersion", + width: 80 + }, + { + label: "描述", + prop: "description", + tableColumnProps: { + showOverflowTooltip: true + } + }, + { + label: "发布状态", + prop: "isPublish", + valueType: "select", + width: 100, + options: [ + { + label: "已发布", + value: YesOrNoEnum.YES, + color: "green" + }, + { + label: "未发布", + value: YesOrNoEnum.NO, + color: "red" + } + ], + renderHTML: (value, { row }) => { + if (row.isFolder) { + return ""; + } + return value + ? `
已发布
` + : `
未发布
`; + } + }, + { + width: 160, + label: "添加时间", + prop: "addTime" + }, + { + width: 160, + label: "修改时间", + prop: "updateTime" + } + ]; + // 表格按钮定义 + actionButtons.value = [ + { + text: "发布", + confirm: { + options: { draggable: false }, + popconfirmProps: { width: 300 }, + message: params => { + const row = params.row; + return `确定要发布[${row.docTitle}]下所有接口吗?`; + } + }, + props: (_: any) => ({ + type: "success" + }), + onConfirm(params: ButtonsCallBackParams) { + const data = { + id: params.row.id, + isPublish: params.row.isPublish === 1 ? 0 : 1 + }; + api.publish(data).then(() => { + ElMessage.success("保存成功"); + search(); + }); + }, + show: (row: any) => row.isFolder === 1 + }, + { + text: "下线", + confirm: { + options: { draggable: false }, + popconfirmProps: { width: 300 }, + message: params => { + const row = params.row; + const opt = "下线"; + return `确定要${opt}[${row.docTitle}]下所有接口吗?`; + } + }, + props: { + type: "danger" + }, + onConfirm(params: ButtonsCallBackParams) { + const data = { + id: params.row.id, + isPublish: 0 + }; + api.publish(data).then(() => { + ElMessage.success("下线成功"); + search(); + }); + }, + show: (row: any) => row.isFolder === 1 + }, + { + text: row => (row.isPublish ? "下线" : "发布"), + confirm: { + options: { draggable: false }, + popconfirmProps: { width: 300 }, + message: params => { + const row = params.row; + const opt = row.isPublish ? "下线" : "发布"; + return `确定要${opt}[${row.docTitle}]吗?`; + } + }, + props: (row: any) => ({ + type: row.isPublish === 1 ? "danger" : "success" + }), + onConfirm(params: ButtonsCallBackParams) { + const data = { + id: params.row.id, + isPublish: params.row.isPublish === 1 ? 0 : 1 + }; + api.publish(data).then(() => { + ElMessage.success("保存成功"); + search(); + }); + }, + show: (row: any) => row.isFolder === 0 + }, + { + text: "同步", + confirm: { + options: { draggable: false }, + popconfirmProps: { width: 300 }, + message: params => { + const row = params.row; + return row.isFolder + ? `确定要同步[${row.docTitle}]下所有接口吗?` + : `确定要同步[${row.docTitle}]吗?`; + } + }, + props: (_: any) => ({ + type: "primary" + }), + onConfirm(params: ButtonsCallBackParams) { + loading.value = true; + api + .syncDoc(params.row.id) + .then(() => { + loading.value = false; + ElMessage.success("同步成功"); + search(); + }) + .catch(() => { + loading.value = false; + }); + } + } + ]; + + // 点击查询按钮 + const handleSearch = () => { + search(); + }; + + // 查询 + const search = async () => { + loadContent(docAppId.value); + }; + + function handleSyncApi() { + ElMessageBox.confirm("确定要同步远程接口吗?", "提示", { + confirmButtonText: "确定", + cancelButtonText: "取消", + type: "warning" + }) + .then(() => { + loading.value = true; + api + .syncAppDoc(docAppId.value) + .then(() => { + loading.value = false; + ElMessage.success("同步成功"); + search(); + }) + .catch(() => { + loading.value = false; + }); + }) + .catch(() => {}); + } + + const handleClick = data => { + const id = data.props.name; + activeTab(id); + }; + + const activeTab = id => { + docAppId.value = id; + loadContent(id); + }; + + const handleAddApp = () => { + ElMessageBox.prompt("请输入Torna应用token", "添加应用", { + confirmButtonText: "确定", + cancelButtonText: "取消", + inputPattern: /\w+/, + inputErrorMessage: "请输入Torna应用token" + }) + .then(({ value }) => { + const data = { + tornaToken: value + }; + api.addApp(data).then(resp => { + ElMessage.success("添加成功"); + loadTabs(resp.data); + }); + }) + .catch(() => {}); + }; + + const loadTabs = docAppId => { + api.listApp().then(resp => { + tabsData.value = resp.data; + const length = tabsData.value.length; + if (length > 0) { + let targetId; + for (const id of tabsData.value) { + if (id === docAppId) { + targetId = id; + break; + } + } + if (!targetId) { + targetId = tabsData.value[0].id; + } + activeName.value = targetId; + activeTab(targetId); + } + }); + }; + + const searchRow = (search, rows, searchHandler, folderHandler) => { + if (!folderHandler) { + folderHandler = isFolder; + } + const ret = []; + for (const row of rows) { + // 找到分类 + if (folderHandler(row)) { + if (searchHandler(search, row)) { + ret.push(row); + } else { + // 分类名字没找到,需要从子文档中找 + const children = row.children || []; + const searchedChildren = searchRow( + search, + children, + searchHandler, + folderHandler + ); + // 如果子文档中有 + if (searchedChildren && searchedChildren.length > 0) { + const rowCopy = Object.assign({}, row); + rowCopy.children = searchedChildren; + ret.push(rowCopy); + } + } + } else { + // 不是分类且被找到 + if (searchHandler(search, row)) { + ret.push(row); + } + } + } + return ret; + }; + + const loadContent = id => { + const data = { + docAppId: id + }; + api.listDocTree(data).then(resp => { + tableData.value = resp.data; + }); + }; + + onMounted(() => { + loadTabs(0); + }); + + return { + activeName, + handleClick, + handleAddApp, + handleSyncApi, + tabsData, + actionButtons, + tableColumns, + tableRows, + filterText, + loading, + handleSearch + }; +} diff --git a/sop-admin/sop-admin-frontend/src/views/doc/list/index.vue b/sop-admin/sop-admin-frontend/src/views/doc/list/index.vue index fdd5ea3d..7a3afe55 100644 --- a/sop-admin/sop-admin-frontend/src/views/doc/list/index.vue +++ b/sop-admin/sop-admin-frontend/src/views/doc/list/index.vue @@ -1,5 +1,11 @@