权限前2个阶段代码提交!

This commit is contained in:
2026-03-19 21:23:35 +08:00
parent 072d10d29e
commit 50aa5e2d5d
31 changed files with 1715 additions and 244 deletions

View File

@@ -1,21 +1,21 @@
package com.njcn.rdms.module.system.controller.admin.auth.vo;
import io.swagger.v3.oas.annotations.media.Schema;
import jakarta.validation.constraints.NotBlank;
import jakarta.validation.constraints.NotEmpty;
import jakarta.validation.constraints.NotNull;
import jakarta.validation.constraints.Pattern;
import jakarta.validation.constraints.Size;
import lombok.Data;
import org.hibernate.validator.constraints.Length;
@Schema(description = "管理后台 - Register Request VO")
@Schema(description = "管理后台 - 注册 Request VO")
@Data
public class AuthRegisterReqVO extends CaptchaVerificationReqVO {
@Schema(description = "用户账号", requiredMode = Schema.RequiredMode.REQUIRED, example = "rdms")
@NotBlank(message = "用户账号不能为空")
@Pattern(regexp = "^[a-zA-Z0-9]{4,30}$", message = "用户账号由 数字、字母 组成")
@Pattern(regexp = "^[a-zA-Z0-9]{4,30}$", message = "用户账号由数字、字母组成")
@Size(min = 4, max = 30, message = "用户账号长度为 4-30 个字符")
private String username;
@@ -24,8 +24,16 @@ public class AuthRegisterReqVO extends CaptchaVerificationReqVO {
@Size(max = 30, message = "用户昵称长度不能超过 30 个字符")
private String nickname;
@Schema(description = "所属部门编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1")
@NotNull(message = "所属部门不能为空")
private Long deptId;
@Schema(description = "主岗位编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1")
@NotNull(message = "主岗位不能为空")
private Long positionId;
@Schema(description = "密码", requiredMode = Schema.RequiredMode.REQUIRED, example = "123456")
@NotEmpty(message = "密码不能为空")
@Length(min = 4, max = 16, message = "密码长度为 4-16 位")
private String password;
}
}

View File

@@ -10,6 +10,9 @@ public class DeptListReqVO {
@Schema(description = "部门名称,模糊匹配", example = "灿能")
private String name;
@Schema(description = "组织节点类型", example = "dept")
private String orgType;
@Schema(description = "展示状态,参见 CommonStatusEnum 枚举类", example = "1")
private Integer status;

View File

@@ -18,6 +18,18 @@ public class DeptRespVO {
@Schema(description = "父部门 ID", example = "1024")
private Long parentId;
@Schema(description = "组织节点类型", example = "dept")
private String orgType;
@Schema(description = "组织物化路径", example = "/100/101/103/")
private String path;
@Schema(description = "组织层级", example = "3")
private Integer level;
@Schema(description = "组织编码", example = "RD_CENTER")
private String code;
@Schema(description = "显示顺序", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024")
private Integer sort;

View File

@@ -24,6 +24,14 @@ public class DeptSaveReqVO {
@Schema(description = "父部门 ID", example = "1024")
private Long parentId;
@Schema(description = "组织节点类型", example = "dept")
@Size(max = 20, message = "组织节点类型长度不能超过 20 个字符")
private String orgType;
@Schema(description = "组织编码", example = "RD_CENTER")
@Size(max = 64, message = "组织编码长度不能超过 64 个字符")
private String code;
@Schema(description = "显示顺序", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024")
@NotNull(message = "显示顺序不能为空")
private Integer sort;

View File

@@ -20,4 +20,7 @@ public class DeptSimpleRespVO {
@Schema(description = "父部门 ID", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024")
private Long parentId;
@Schema(description = "组织节点类型", example = "dept")
private String orgType;
}

View File

@@ -1,10 +1,10 @@
package com.njcn.rdms.module.system.controller.admin.dept.vo.post;
import cn.idev.excel.annotation.ExcelIgnoreUnannotated;
import cn.idev.excel.annotation.ExcelProperty;
import com.njcn.rdms.framework.excel.core.annotations.DictFormat;
import com.njcn.rdms.framework.excel.core.convert.DictConvert;
import com.njcn.rdms.module.system.enums.DictTypeConstants;
import cn.idev.excel.annotation.ExcelIgnoreUnannotated;
import cn.idev.excel.annotation.ExcelProperty;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
@@ -19,15 +19,23 @@ public class PostRespVO {
@ExcelProperty("岗位序号")
private Long id;
@Schema(description = "岗位名称", requiredMode = Schema.RequiredMode.REQUIRED, example = "小土豆")
@Schema(description = "岗位名称", requiredMode = Schema.RequiredMode.REQUIRED, example = "后端开发工程师")
@ExcelProperty("岗位名称")
private String name;
@Schema(description = "岗位编码", requiredMode = Schema.RequiredMode.REQUIRED, example = "rdms")
@Schema(description = "岗位编码", requiredMode = Schema.RequiredMode.REQUIRED, example = "backend")
@ExcelProperty("岗位编码")
private String code;
@Schema(description = "显示顺序", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024")
@Schema(description = "岗位类型", example = "technical")
@ExcelProperty("岗位类型")
private String postType;
@Schema(description = "岗位级别", example = "8")
@ExcelProperty("岗位级别")
private Integer levelRank;
@Schema(description = "显示顺序", requiredMode = Schema.RequiredMode.REQUIRED, example = "1")
@ExcelProperty("岗位排序")
private Integer sort;
@@ -36,7 +44,7 @@ public class PostRespVO {
@DictFormat(DictTypeConstants.COMMON_STATUS)
private Integer status;
@Schema(description = "备注", example = "快乐的备注")
@Schema(description = "备注", example = "技术序列岗位")
private String remark;
@Schema(description = "创建时间", requiredMode = Schema.RequiredMode.REQUIRED)

View File

@@ -15,17 +15,24 @@ public class PostSaveReqVO {
@Schema(description = "岗位编号", example = "1024")
private Long id;
@Schema(description = "岗位名称", requiredMode = Schema.RequiredMode.REQUIRED, example = "小土豆")
@Schema(description = "岗位名称", requiredMode = Schema.RequiredMode.REQUIRED, example = "后端开发工程师")
@NotBlank(message = "岗位名称不能为空")
@Size(max = 50, message = "岗位名称长度不能超过 50 个字符")
private String name;
@Schema(description = "岗位编码", requiredMode = Schema.RequiredMode.REQUIRED, example = "rdms")
@Schema(description = "岗位编码", requiredMode = Schema.RequiredMode.REQUIRED, example = "backend")
@NotBlank(message = "岗位编码不能为空")
@Size(max = 64, message = "岗位编码长度不能超过64个字符")
@Size(max = 64, message = "岗位编码长度不能超过 64 个字符")
private String code;
@Schema(description = "显示顺序", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024")
@Schema(description = "岗位类型", example = "technical")
@Size(max = 20, message = "岗位类型长度不能超过 20 个字符")
private String postType;
@Schema(description = "岗位级别", example = "8")
private Integer levelRank;
@Schema(description = "显示顺序", requiredMode = Schema.RequiredMode.REQUIRED, example = "1")
@NotNull(message = "显示顺序不能为空")
private Integer sort;
@@ -33,7 +40,7 @@ public class PostSaveReqVO {
@InEnum(CommonStatusEnum.class)
private Integer status;
@Schema(description = "备注", example = "快乐的备注")
@Schema(description = "备注", example = "技术序列岗位")
private String remark;
}
}

View File

@@ -1,6 +1,5 @@
package com.njcn.rdms.module.system.controller.admin.oauth2;
import cn.hutool.core.collection.CollUtil;
import com.njcn.rdms.framework.common.pojo.CommonResult;
import com.njcn.rdms.framework.common.util.object.BeanUtils;
import com.njcn.rdms.module.system.controller.admin.oauth2.vo.user.OAuth2UserInfoRespVO;
@@ -14,14 +13,16 @@ import com.njcn.rdms.module.system.service.dept.PostService;
import com.njcn.rdms.module.system.service.user.AdminUserService;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.tags.Tag;
import jakarta.annotation.Resource;
import jakarta.validation.Valid;
import lombok.extern.slf4j.Slf4j;
import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;
import jakarta.annotation.Resource;
import jakarta.validation.Valid;
import java.util.List;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PutMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import static com.njcn.rdms.framework.common.pojo.CommonResult.success;
import static com.njcn.rdms.framework.security.core.util.SecurityFrameworkUtils.getLoginUserId;
@@ -50,7 +51,7 @@ public class OAuth2UserController {
@GetMapping("/get")
@Operation(summary = "获得用户基本信息")
@PreAuthorize("@ss.hasScope('user.read')") //
@PreAuthorize("@ss.hasScope('user.read')")
public CommonResult<OAuth2UserInfoRespVO> getUserInfo() {
// 获得用户基本信息
AdminUserDO user = userService.getUser(getLoginUserId());
@@ -60,10 +61,10 @@ public class OAuth2UserController {
DeptDO dept = deptService.getDept(user.getDeptId());
resp.setDept(BeanUtils.toBean(dept, OAuth2UserInfoRespVO.Dept.class));
}
// 获得岗位信息
if (CollUtil.isNotEmpty(user.getPostIds())) {
List<PostDO> posts = postService.getPostList(user.getPostIds());
resp.setPosts(BeanUtils.toBean(posts, OAuth2UserInfoRespVO.Post.class));
// 获得岗位信息
if (user.getPositionId() != null) {
PostDO position = postService.getPost(user.getPositionId());
resp.setPosition(BeanUtils.toBean(position, OAuth2UserInfoRespVO.Post.class));
}
return success(resp);
}
@@ -72,8 +73,7 @@ public class OAuth2UserController {
@Operation(summary = "更新用户基本信息")
@PreAuthorize("@ss.hasScope('user.write')")
public CommonResult<Boolean> updateUserInfo(@Valid @RequestBody OAuth2UserUpdateReqVO reqVO) {
// 这里将 UserProfileUpdateReqVO =》UserProfileUpdateReqVO 对象,实现接口复用
// 主要是AdminUserService 没有自己的 BO 对象,所以复用只能这么做
// 这里将 OAuth2UserUpdateReqVO 转成 UserProfileUpdateReqVO实现接口复用
userService.updateUserProfile(getLoginUserId(), BeanUtils.toBean(reqVO, UserProfileUpdateReqVO.class));
return success(true);
}

View File

@@ -5,8 +5,6 @@ import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.util.List;
@Schema(description = "管理后台 - OAuth2 获得用户基本信息 Response VO")
@Data
@NoArgsConstructor
@@ -24,6 +22,7 @@ public class OAuth2UserInfoRespVO {
@Schema(description = "用户邮箱", example = "rdms@iocoder.cn")
private String email;
@Schema(description = "手机号码", example = "15601691300")
private String mobile;
@@ -39,9 +38,9 @@ public class OAuth2UserInfoRespVO {
private Dept dept;
/**
* 所属岗位数组
* 主岗位
*/
private List<Post> posts;
private Post position;
@Schema(description = "部门")
@Data

View File

@@ -7,12 +7,21 @@ import com.njcn.rdms.framework.common.pojo.CommonResult;
import com.njcn.rdms.framework.common.pojo.PageParam;
import com.njcn.rdms.framework.common.pojo.PageResult;
import com.njcn.rdms.framework.excel.core.util.ExcelUtils;
import com.njcn.rdms.module.system.controller.admin.user.vo.user.*;
import com.njcn.rdms.module.system.controller.admin.user.vo.user.UserImportExcelVO;
import com.njcn.rdms.module.system.controller.admin.user.vo.user.UserImportRespVO;
import com.njcn.rdms.module.system.controller.admin.user.vo.user.UserPageReqVO;
import com.njcn.rdms.module.system.controller.admin.user.vo.user.UserRespVO;
import com.njcn.rdms.module.system.controller.admin.user.vo.user.UserSaveReqVO;
import com.njcn.rdms.module.system.controller.admin.user.vo.user.UserSimpleRespVO;
import com.njcn.rdms.module.system.controller.admin.user.vo.user.UserUpdatePasswordReqVO;
import com.njcn.rdms.module.system.controller.admin.user.vo.user.UserUpdateStatusReqVO;
import com.njcn.rdms.module.system.convert.user.UserConvert;
import com.njcn.rdms.module.system.dal.dataobject.dept.DeptDO;
import com.njcn.rdms.module.system.dal.dataobject.dept.PostDO;
import com.njcn.rdms.module.system.dal.dataobject.user.AdminUserDO;
import com.njcn.rdms.module.system.enums.common.SexEnum;
import com.njcn.rdms.module.system.service.dept.DeptService;
import com.njcn.rdms.module.system.service.dept.PostService;
import com.njcn.rdms.module.system.service.user.AdminUserService;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.Parameter;
@@ -23,7 +32,14 @@ import jakarta.servlet.http.HttpServletResponse;
import jakarta.validation.Valid;
import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.bind.annotation.DeleteMapping;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.PutMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.multipart.MultipartFile;
import java.io.IOException;
@@ -45,6 +61,8 @@ public class UserController {
private AdminUserService userService;
@Resource
private DeptService deptService;
@Resource
private PostService postService;
@PostMapping("/create")
@Operation(summary = "新增用户")
@@ -105,11 +123,10 @@ public class UserController {
if (CollUtil.isEmpty(pageResult.getList())) {
return success(new PageResult<>(pageResult.getTotal()));
}
// 拼接数据
Map<Long, DeptDO> deptMap = deptService.getDeptMap(
convertList(pageResult.getList(), AdminUserDO::getDeptId));
return success(new PageResult<>(UserConvert.INSTANCE.convertList(pageResult.getList(), deptMap),
pageResult.getTotal()));
// 拼接部门、主岗位信息
Map<Long, DeptDO> deptMap = deptService.getDeptMap(convertList(pageResult.getList(), AdminUserDO::getDeptId));
Map<Long, PostDO> postMap = postService.getPostMap(convertList(pageResult.getList(), AdminUserDO::getPositionId));
return success(new PageResult<>(UserConvert.INSTANCE.convertList(pageResult.getList(), deptMap, postMap), pageResult.getTotal()));
}
@GetMapping({"/list-all-simple", "/simple-list"})
@@ -117,8 +134,7 @@ public class UserController {
public CommonResult<List<UserSimpleRespVO>> getSimpleUserList() {
List<AdminUserDO> list = userService.getUserListByStatus(CommonStatusEnum.ENABLE.getStatus());
// 拼接数据
Map<Long, DeptDO> deptMap = deptService.getDeptMap(
convertList(list, AdminUserDO::getDeptId));
Map<Long, DeptDO> deptMap = deptService.getDeptMap(convertList(list, AdminUserDO::getDeptId));
return success(UserConvert.INSTANCE.convertSimpleList(list, deptMap));
}
@@ -133,22 +149,22 @@ public class UserController {
}
// 拼接数据
DeptDO dept = deptService.getDept(user.getDeptId());
return success(UserConvert.INSTANCE.convert(user, dept));
PostDO position = user.getPositionId() != null ? postService.getPost(user.getPositionId()) : null;
return success(UserConvert.INSTANCE.convert(user, dept, position));
}
@GetMapping("/export-excel")
@Operation(summary = "导出用户")
@PreAuthorize("@ss.hasPermission('system:user:export')")
@ApiAccessLog(operateType = EXPORT)
public void exportUserList(@Validated UserPageReqVO exportReqVO,
HttpServletResponse response) throws IOException {
public void exportUserList(@Validated UserPageReqVO exportReqVO, HttpServletResponse response) throws IOException {
exportReqVO.setPageSize(PageParam.PAGE_SIZE_NONE);
List<AdminUserDO> list = userService.getUserPage(exportReqVO).getList();
// 输出 Excel
Map<Long, DeptDO> deptMap = deptService.getDeptMap(
convertList(list, AdminUserDO::getDeptId));
Map<Long, DeptDO> deptMap = deptService.getDeptMap(convertList(list, AdminUserDO::getDeptId));
Map<Long, PostDO> postMap = postService.getPostMap(convertList(list, AdminUserDO::getPositionId));
ExcelUtils.write(response, "用户数据.xls", "数据", UserRespVO.class,
UserConvert.INSTANCE.convertList(list, deptMap));
UserConvert.INSTANCE.convertList(list, deptMap, postMap));
}
@GetMapping("/get-import-template")
@@ -156,9 +172,9 @@ public class UserController {
public void importTemplate(HttpServletResponse response) throws IOException {
// 手动创建导出 demo
List<UserImportExcelVO> list = Arrays.asList(
UserImportExcelVO.builder().username("yunai").deptId(1L).email("yunai@iocoder.cn").mobile("15601691300")
UserImportExcelVO.builder().username("yunai").deptId(1L).positionId(1L).email("yunai@iocoder.cn").mobile("15601691300")
.nickname("灿能").status(CommonStatusEnum.ENABLE.getStatus()).sex(SexEnum.MALE.getSex()).build(),
UserImportExcelVO.builder().username("yuanma").deptId(2L).email("yuanma@iocoder.cn").mobile("15601701300")
UserImportExcelVO.builder().username("yuanma").deptId(2L).positionId(2L).email("yuanma@iocoder.cn").mobile("15601701300")
.nickname("源码").status(CommonStatusEnum.DISABLE.getStatus()).sex(SexEnum.FEMALE.getSex()).build()
);
// 输出
@@ -168,7 +184,7 @@ public class UserController {
@PostMapping("/import")
@Operation(summary = "导入用户")
@Parameters({
@Parameter(name = "file", description = "Excel 文件", required = true),
@Parameter(name = "file", description = "导入文件", required = true),
@Parameter(name = "updateSupport", description = "是否支持更新,默认为 false", example = "true")
})
@PreAuthorize("@ss.hasPermission('system:user:import')")

View File

@@ -1,6 +1,5 @@
package com.njcn.rdms.module.system.controller.admin.user;
import cn.hutool.core.collection.CollUtil;
import com.njcn.rdms.framework.common.pojo.CommonResult;
import com.njcn.rdms.module.system.controller.admin.user.vo.profile.UserProfileRespVO;
import com.njcn.rdms.module.system.controller.admin.user.vo.profile.UserProfileUpdatePasswordReqVO;
@@ -21,7 +20,11 @@ import jakarta.annotation.Resource;
import jakarta.validation.Valid;
import lombok.extern.slf4j.Slf4j;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PutMapping;
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;
@@ -55,9 +58,9 @@ public class UserProfileController {
List<RoleDO> userRoles = roleService.getRoleListFromCache(permissionService.getUserRoleIdListByUserId(user.getId()));
// 获得部门信息
DeptDO dept = user.getDeptId() != null ? deptService.getDept(user.getDeptId()) : null;
// 获得岗位信息
List<PostDO> posts = CollUtil.isNotEmpty(user.getPostIds()) ? postService.getPostList(user.getPostIds()) : null;
return success(UserConvert.INSTANCE.convert(user, userRoles, dept, posts));
// 获得岗位信息
PostDO position = user.getPositionId() != null ? postService.getPost(user.getPositionId()) : null;
return success(UserConvert.INSTANCE.convert(user, userRoles, dept, position));
}
@PutMapping("/update")

View File

@@ -47,13 +47,15 @@ public class UserProfileRespVO {
* 所属角色
*/
private List<RoleSimpleRespVO> roles;
/**
* 所在部门
*/
private DeptSimpleRespVO dept;
/**
* 所属岗位数组
* 主岗位
*/
private List<PostSimpleRespVO> posts;
private PostSimpleRespVO position;
}

View File

@@ -1,9 +1,9 @@
package com.njcn.rdms.module.system.controller.admin.user.vo.user;
import cn.idev.excel.annotation.ExcelProperty;
import com.njcn.rdms.framework.excel.core.annotations.DictFormat;
import com.njcn.rdms.framework.excel.core.convert.DictConvert;
import com.njcn.rdms.module.system.enums.DictTypeConstants;
import cn.idev.excel.annotation.ExcelProperty;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
@@ -27,6 +27,9 @@ public class UserImportExcelVO {
@ExcelProperty("部门编号")
private Long deptId;
@ExcelProperty("主岗位编号")
private Long positionId;
@ExcelProperty("用户邮箱")
private String email;

View File

@@ -1,20 +1,19 @@
package com.njcn.rdms.module.system.controller.admin.user.vo.user;
import cn.idev.excel.annotation.ExcelIgnoreUnannotated;
import cn.idev.excel.annotation.ExcelProperty;
import com.njcn.rdms.framework.excel.core.annotations.DictFormat;
import com.njcn.rdms.framework.excel.core.convert.DictConvert;
import com.njcn.rdms.module.system.enums.DictTypeConstants;
import cn.idev.excel.annotation.ExcelIgnoreUnannotated;
import cn.idev.excel.annotation.ExcelProperty;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
import java.time.LocalDateTime;
import java.util.Set;
@Schema(description = "管理后台 - 用户信息 Response VO")
@Data
@ExcelIgnoreUnannotated
public class UserRespVO{
public class UserRespVO {
@Schema(description = "用户编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1")
@ExcelProperty("用户编号")
@@ -31,14 +30,19 @@ public class UserRespVO{
@Schema(description = "备注", example = "我是一个用户")
private String remark;
@Schema(description = "部门ID", example = "我是一个用户")
@Schema(description = "部门编号", example = "1")
private Long deptId;
@Schema(description = "部门名称", example = "IT 部")
@ExcelProperty("部门名称")
private String deptName;
@Schema(description = "岗位编号数组", example = "1")
private Set<Long> postIds;
@Schema(description = "岗位编号", example = "1")
private Long positionId;
@Schema(description = "主岗位名称", example = "后端开发工程师")
@ExcelProperty("主岗位")
private String positionName;
@Schema(description = "用户邮箱", example = "rdms@iocoder.cn")
@ExcelProperty("用户邮箱")
@@ -65,6 +69,9 @@ public class UserRespVO{
@ExcelProperty("最后登录IP")
private String loginIp;
@Schema(description = "离职时间", example = "2026-03-19 00:00:00")
private LocalDateTime resignedAt;
@Schema(description = "最后登录时间", requiredMode = Schema.RequiredMode.REQUIRED, example = "时间戳格式")
@ExcelProperty("最后登录时间")
private LocalDateTime loginDate;

View File

@@ -1,18 +1,23 @@
package com.njcn.rdms.module.system.controller.admin.user.vo.user;
import cn.hutool.core.util.ObjectUtil;
import com.fasterxml.jackson.annotation.JsonIgnore;
import com.mzt.logapi.starter.annotation.DiffLogField;
import com.njcn.rdms.framework.common.validation.Mobile;
import com.njcn.rdms.module.system.framework.operatelog.core.DeptParseFunction;
import com.njcn.rdms.module.system.framework.operatelog.core.PostParseFunction;
import com.njcn.rdms.module.system.framework.operatelog.core.SexParseFunction;
import com.fasterxml.jackson.annotation.JsonIgnore;
import com.mzt.logapi.starter.annotation.DiffLogField;
import io.swagger.v3.oas.annotations.media.Schema;
import jakarta.validation.constraints.*;
import jakarta.validation.constraints.AssertTrue;
import jakarta.validation.constraints.Email;
import jakarta.validation.constraints.NotBlank;
import jakarta.validation.constraints.NotNull;
import jakarta.validation.constraints.Pattern;
import jakarta.validation.constraints.Size;
import lombok.Data;
import org.hibernate.validator.constraints.Length;
import java.util.Set;
import java.time.LocalDateTime;
@Schema(description = "管理后台 - 用户创建/修改 Request VO")
@Data
@@ -23,13 +28,13 @@ public class UserSaveReqVO {
@Schema(description = "用户账号", requiredMode = Schema.RequiredMode.REQUIRED, example = "rdms")
@NotBlank(message = "用户账号不能为空")
@Pattern(regexp = "^[a-zA-Z0-9]{4,30}$", message = "用户账号由 数字、字母 组成")
@Pattern(regexp = "^[a-zA-Z0-9]{4,30}$", message = "用户账号由数字、字母组成")
@Size(min = 4, max = 30, message = "用户账号长度为 4-30 个字符")
@DiffLogField(name = "用户账号")
private String username;
@Schema(description = "用户昵称", requiredMode = Schema.RequiredMode.REQUIRED, example = "awen")
@Size(max = 30, message = "用户昵称长度不能超过30个字符")
@Size(max = 30, message = "用户昵称长度不能超过 30 个字符")
@DiffLogField(name = "用户昵称")
private String nickname;
@@ -37,13 +42,19 @@ public class UserSaveReqVO {
@DiffLogField(name = "备注")
private String remark;
@Schema(description = "部门编号", example = "我是一个用户")
@Schema(description = "部门编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1")
@NotNull(message = "部门不能为空")
@DiffLogField(name = "部门", function = DeptParseFunction.NAME)
private Long deptId;
@Schema(description = "岗位编号数组", example = "1")
@DiffLogField(name = "岗位", function = PostParseFunction.NAME)
private Set<Long> postIds;
@Schema(description = "岗位编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1")
@NotNull(message = "岗位不能为空")
@DiffLogField(name = "主岗位", function = PostParseFunction.NAME)
private Long positionId;
@Schema(description = "离职时间", example = "2026-03-19 00:00:00")
@DiffLogField(name = "离职时间")
private LocalDateTime resignedAt;
@Schema(description = "用户邮箱", example = "rdms@iocoder.cn")
@Email(message = "邮箱格式不正确")
@@ -74,7 +85,7 @@ public class UserSaveReqVO {
@JsonIgnore
public boolean isPasswordValid() {
return id != null // 修改时,不需要传递
|| (ObjectUtil.isAllNotEmpty(password)); // 新增时,必须传递 password
|| ObjectUtil.isAllNotEmpty(password); // 新增时,必须传递 password
}
}

View File

@@ -24,15 +24,18 @@ public interface UserConvert {
UserConvert INSTANCE = Mappers.getMapper(UserConvert.class);
default List<UserRespVO> convertList(List<AdminUserDO> list, Map<Long, DeptDO> deptMap) {
return CollectionUtils.convertList(list, user -> convert(user, deptMap.get(user.getDeptId())));
default List<UserRespVO> convertList(List<AdminUserDO> list, Map<Long, DeptDO> deptMap, Map<Long, PostDO> postMap) {
return CollectionUtils.convertList(list, user -> convert(user, deptMap.get(user.getDeptId()), postMap.get(user.getPositionId())));
}
default UserRespVO convert(AdminUserDO user, DeptDO dept) {
default UserRespVO convert(AdminUserDO user, DeptDO dept, PostDO position) {
UserRespVO userVO = BeanUtils.toBean(user, UserRespVO.class);
if (dept != null) {
userVO.setDeptName(dept.getName());
}
if (position != null) {
userVO.setPositionName(position.getName());
}
return userVO;
}
@@ -44,12 +47,11 @@ public interface UserConvert {
});
}
default UserProfileRespVO convert(AdminUserDO user, List<RoleDO> userRoles,
DeptDO dept, List<PostDO> posts) {
default UserProfileRespVO convert(AdminUserDO user, List<RoleDO> userRoles, DeptDO dept, PostDO position) {
UserProfileRespVO userVO = BeanUtils.toBean(user, UserProfileRespVO.class);
userVO.setRoles(BeanUtils.toBean(userRoles, RoleSimpleRespVO.class));
userVO.setDept(BeanUtils.toBean(dept, DeptSimpleRespVO.class));
userVO.setPosts(BeanUtils.toBean(posts, PostSimpleRespVO.class));
userVO.setPosition(BeanUtils.toBean(position, PostSimpleRespVO.class));
return userVO;
}

View File

@@ -36,6 +36,22 @@ public class DeptDO extends BaseDO {
* 关联 {@link #id}
*/
private Long parentId;
/**
* 组织节点类型
*/
private String orgType;
/**
* 组织物化路径
*/
private String path;
/**
* 组织层级
*/
private Integer level;
/**
* 组织编码
*/
private String code;
/**
* 显示顺序
*/

View File

@@ -1,9 +1,9 @@
package com.njcn.rdms.module.system.dal.dataobject.dept;
import com.njcn.rdms.framework.common.enums.CommonStatusEnum;
import com.njcn.rdms.framework.mybatis.core.dataobject.BaseDO;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import com.njcn.rdms.framework.common.enums.CommonStatusEnum;
import com.njcn.rdms.framework.mybatis.core.dataobject.BaseDO;
import lombok.Data;
import lombok.EqualsAndHashCode;
@@ -17,29 +17,41 @@ import lombok.EqualsAndHashCode;
@EqualsAndHashCode(callSuper = true)
public class PostDO extends BaseDO {
/**
* 岗位序号
*/
@TableId
private Long id;
/**
* 岗位名称
*/
private String name;
/**
* 岗位编码
*/
private String code;
/**
* 岗位类型
*/
private String postType;
/**
* 岗位级别
*/
private Integer levelRank;
/**
* 岗位排序
*/
private Integer sort;
/**
* 状态
*
* 枚举 {@link CommonStatusEnum}
*/
private Integer status;
/**
* 备注
*/

View File

@@ -1,17 +1,18 @@
package com.njcn.rdms.module.system.dal.dataobject.user;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import com.njcn.rdms.framework.common.enums.CommonStatusEnum;
import com.njcn.rdms.framework.mybatis.core.dataobject.BaseDO;
import com.njcn.rdms.module.system.enums.common.SexEnum;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import com.baomidou.mybatisplus.extension.handlers.JacksonTypeHandler;
import lombok.*;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.NoArgsConstructor;
import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
import java.time.LocalDateTime;
import java.util.Set;
/**
* 管理后台的用户 DO
@@ -27,65 +28,82 @@ import java.util.Set;
public class AdminUserDO extends BaseDO {
/**
* 用户ID
* 用户 ID
*/
@TableId
private Long id;
/**
* 用户账号
*/
private String username;
/**
* 加密后的密码
*
* 因为目前使用 {@link BCryptPasswordEncoder} 加密器,所以无需自己处理 salt 盐
*/
private String password;
/**
* 用户昵称
*/
private String nickname;
/**
* 备注
*/
private String remark;
/**
* 部门 ID
*/
private Long deptId;
/**
* 岗位编号数组
* 岗位编号
*/
@TableField(typeHandler = JacksonTypeHandler.class)
private Set<Long> postIds;
private Long positionId;
/**
* 离职时间
*/
private LocalDateTime resignedAt;
/**
* 用户邮箱
*/
private String email;
/**
* 手机号码
*/
private String mobile;
/**
* 用户性别
*
* 枚举类 {@link SexEnum}
*/
private Integer sex;
/**
* 用户头像
*/
private String avatar;
/**
* 帐号状态
*
* 枚举 {@link CommonStatusEnum}
*/
private Integer status;
/**
* 最后登录IP
* 最后登录 IP
*/
private String loginIp;
/**
* 最后登录时间
*/

View File

@@ -15,6 +15,7 @@ public interface DeptMapper extends BaseMapperX<DeptDO> {
default List<DeptDO> selectList(DeptListReqVO reqVO) {
return selectList(new LambdaQueryWrapperX<DeptDO>()
.likeIfPresent(DeptDO::getName, reqVO.getName())
.eqIfPresent(DeptDO::getOrgType, reqVO.getOrgType())
.eqIfPresent(DeptDO::getStatus, reqVO.getStatus()));
}
@@ -22,6 +23,10 @@ public interface DeptMapper extends BaseMapperX<DeptDO> {
return selectOne(DeptDO::getParentId, parentId, DeptDO::getName, name);
}
default DeptDO selectByCode(String code) {
return selectOne(DeptDO::getCode, code);
}
default Long selectCountByParentId(Long parentId) {
return selectCount(DeptDO::getParentId, parentId);
}
@@ -34,4 +39,8 @@ public interface DeptMapper extends BaseMapperX<DeptDO> {
return selectList(DeptDO::getLeaderUserId, id);
}
default List<DeptDO> selectListByPathPrefix(String pathPrefix) {
return selectList(new LambdaQueryWrapperX<DeptDO>().likeRight(DeptDO::getPath, pathPrefix));
}
}

View File

@@ -48,4 +48,8 @@ public interface AdminUserMapper extends BaseMapperX<AdminUserDO> {
return selectList(AdminUserDO::getDeptId, deptIds);
}
default List<AdminUserDO> selectListByPositionIds(Collection<Long> positionIds) {
return selectList(AdminUserDO::getPositionId, positionIds);
}
}

View File

@@ -2,6 +2,7 @@ package com.njcn.rdms.module.system.service.dept;
import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.util.ObjectUtil;
import cn.hutool.core.util.StrUtil;
import com.njcn.rdms.framework.common.enums.CommonStatusEnum;
import com.njcn.rdms.framework.common.util.object.BeanUtils;
import com.njcn.rdms.module.system.controller.admin.dept.vo.dept.DeptListReqVO;
@@ -9,15 +10,24 @@ import com.njcn.rdms.module.system.controller.admin.dept.vo.dept.DeptSaveReqVO;
import com.njcn.rdms.module.system.dal.dataobject.dept.DeptDO;
import com.njcn.rdms.module.system.dal.mysql.dept.DeptMapper;
import com.njcn.rdms.module.system.dal.redis.RedisKeyConstants;
import com.njcn.rdms.module.system.enums.dept.DeptOrgTypeEnum;
import com.google.common.annotations.VisibleForTesting;
import lombok.extern.slf4j.Slf4j;
import org.springframework.cache.annotation.CacheEvict;
import org.springframework.cache.annotation.Cacheable;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.validation.annotation.Validated;
import jakarta.annotation.Resource;
import java.util.*;
import java.util.Collection;
import java.util.Collections;
import java.util.Comparator;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;
import java.util.Objects;
import java.util.Set;
import static com.njcn.rdms.framework.common.exception.util.ServiceExceptionUtil.exception;
import static com.njcn.rdms.framework.common.util.collection.CollectionUtils.convertSet;
@@ -37,40 +47,50 @@ public class DeptServiceImpl implements DeptService {
private DeptMapper deptMapper;
@Override
@Transactional(rollbackFor = Exception.class)
@CacheEvict(cacheNames = RedisKeyConstants.DEPT_CHILDREN_ID_LIST,
allEntries = true) // allEntries 清空所有缓存,因为操作一个部门,涉及到多个缓存
public Long createDept(DeptSaveReqVO createReqVO) {
if (createReqVO.getParentId() == null) {
createReqVO.setParentId(DeptDO.PARENT_ID_ROOT);
}
normalizeDeptCreateReq(createReqVO);
// 校验父部门的有效性
validateParentDept(null, createReqVO.getParentId());
// 校验部门名的唯一性
validateDeptNameUnique(null, createReqVO.getParentId(), createReqVO.getName());
// 校验组织编码唯一性
validateDeptCodeUnique(null, createReqVO.getCode());
// 校验组织节点类型
validateDeptOrgType(createReqVO.getOrgType());
// 插入部门
DeptDO dept = BeanUtils.toBean(createReqVO, DeptDO.class);
deptMapper.insert(dept);
fillDeptTreeFields(dept, createReqVO.getParentId());
deptMapper.updateById(dept);
return dept.getId();
}
@Override
@Transactional(rollbackFor = Exception.class)
@CacheEvict(cacheNames = RedisKeyConstants.DEPT_CHILDREN_ID_LIST,
allEntries = true) // allEntries 清空所有缓存,因为操作一个部门,涉及到多个缓存
public void updateDept(DeptSaveReqVO updateReqVO) {
if (updateReqVO.getParentId() == null) {
updateReqVO.setParentId(DeptDO.PARENT_ID_ROOT);
}
// 校验自己存在
validateDeptExists(updateReqVO.getId());
DeptDO oldDept = validateDeptExists(updateReqVO.getId());
normalizeDeptUpdateReq(updateReqVO, oldDept);
// 校验父部门的有效性
validateParentDept(updateReqVO.getId(), updateReqVO.getParentId());
// 校验部门名的唯一性
validateDeptNameUnique(updateReqVO.getId(), updateReqVO.getParentId(), updateReqVO.getName());
// 校验组织编码唯一性
validateDeptCodeUnique(updateReqVO.getId(), updateReqVO.getCode());
// 校验组织节点类型
validateDeptOrgType(updateReqVO.getOrgType());
// 更新部门
DeptDO updateObj = BeanUtils.toBean(updateReqVO, DeptDO.class);
fillDeptTreeFields(updateObj, updateReqVO.getParentId());
deptMapper.updateById(updateObj);
updateChildDeptTree(updateObj.getId(), oldDept.getPath(), oldDept.getLevel(), updateObj.getPath(), updateObj.getLevel());
}
@Override
@@ -103,14 +123,15 @@ public class DeptServiceImpl implements DeptService {
}
@VisibleForTesting
void validateDeptExists(Long id) {
DeptDO validateDeptExists(Long id) {
if (id == null) {
return;
return null;
}
DeptDO dept = deptMapper.selectById(id);
if (dept == null) {
throw exception(DEPT_NOT_FOUND);
}
return dept;
}
@VisibleForTesting
@@ -163,6 +184,27 @@ public class DeptServiceImpl implements DeptService {
}
}
@VisibleForTesting
void validateDeptCodeUnique(Long id, String code) {
if (StrUtil.isBlank(code)) {
return;
}
DeptDO dept = deptMapper.selectByCode(code);
if (dept == null) {
return;
}
if (id == null || ObjectUtil.notEqual(dept.getId(), id)) {
throw exception(DEPT_CODE_DUPLICATE, code);
}
}
@VisibleForTesting
void validateDeptOrgType(String orgType) {
if (!DeptOrgTypeEnum.isValid(orgType)) {
throw exception(DEPT_ORG_TYPE_INVALID, orgType);
}
}
@Override
public DeptDO getDept(Long id) {
return deptMapper.selectById(id);
@@ -179,7 +221,7 @@ public class DeptServiceImpl implements DeptService {
@Override
public List<DeptDO> getDeptList(DeptListReqVO reqVO) {
List<DeptDO> list = deptMapper.selectList(reqVO);
list.sort(Comparator.comparing(DeptDO::getSort));
list.sort(Comparator.comparing(DeptDO::getSort).thenComparing(DeptDO::getId));
return list;
}
@@ -233,4 +275,59 @@ public class DeptServiceImpl implements DeptService {
});
}
private void normalizeDeptCreateReq(DeptSaveReqVO reqVO) {
if (reqVO.getParentId() == null) {
reqVO.setParentId(DeptDO.PARENT_ID_ROOT);
}
if (StrUtil.isBlank(reqVO.getOrgType())) {
reqVO.setOrgType(DeptOrgTypeEnum.defaultType());
}
if (StrUtil.isBlank(reqVO.getCode())) {
reqVO.setCode(null);
}
}
private void normalizeDeptUpdateReq(DeptSaveReqVO reqVO, DeptDO oldDept) {
if (reqVO.getParentId() == null) {
reqVO.setParentId(DeptDO.PARENT_ID_ROOT);
}
if (StrUtil.isBlank(reqVO.getOrgType())) {
reqVO.setOrgType(StrUtil.blankToDefault(oldDept.getOrgType(), DeptOrgTypeEnum.defaultType()));
}
if (StrUtil.isBlank(reqVO.getCode())) {
reqVO.setCode(oldDept.getCode());
}
}
private void fillDeptTreeFields(DeptDO dept, Long parentId) {
String parentPath = "/";
int parentLevel = 0;
if (!DeptDO.PARENT_ID_ROOT.equals(parentId)) {
DeptDO parentDept = deptMapper.selectById(parentId);
if (parentDept != null) {
parentPath = StrUtil.blankToDefault(parentDept.getPath(), "/" + parentDept.getId() + "/");
parentLevel = ObjectUtil.defaultIfNull(parentDept.getLevel(), 1);
}
}
dept.setPath(parentPath + dept.getId() + "/");
dept.setLevel(parentLevel + 1);
}
private void updateChildDeptTree(Long deptId, String oldPath, Integer oldLevel, String newPath, Integer newLevel) {
if (StrUtil.equals(oldPath, newPath) && Objects.equals(oldLevel, newLevel)) {
return;
}
List<DeptDO> children = deptMapper.selectListByPathPrefix(oldPath);
children.removeIf(dept -> Objects.equals(dept.getId(), deptId));
if (CollUtil.isEmpty(children)) {
return;
}
int levelDiff = ObjectUtil.defaultIfNull(newLevel, 1) - ObjectUtil.defaultIfNull(oldLevel, 1);
children.forEach(child -> {
child.setPath(newPath + StrUtil.removePrefix(child.getPath(), oldPath));
child.setLevel(ObjectUtil.defaultIfNull(child.getLevel(), 1) + levelDiff);
});
deptMapper.updateBatch(children);
}
}

View File

@@ -1,13 +1,17 @@
package com.njcn.rdms.module.system.service.dept;
import cn.hutool.core.collection.CollUtil;
import com.njcn.rdms.framework.common.pojo.PageResult;
import com.njcn.rdms.framework.common.util.collection.CollectionUtils;
import com.njcn.rdms.module.system.controller.admin.dept.vo.post.PostPageReqVO;
import com.njcn.rdms.module.system.controller.admin.dept.vo.post.PostSaveReqVO;
import com.njcn.rdms.module.system.dal.dataobject.dept.PostDO;
import org.springframework.lang.Nullable;
import java.util.Collection;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
/**
* 岗位 Service 接口
@@ -49,7 +53,7 @@ public interface PostService {
* 获得岗位列表
*
* @param ids 岗位编号数组
* @return 部门列表
* @return 岗位列表
*/
List<PostDO> getPostList(@Nullable Collection<Long> ids);
@@ -58,16 +62,15 @@ public interface PostService {
*
* @param ids 岗位编号数组。如果为空,不进行筛选
* @param statuses 状态数组。如果为空,不进行筛选
* @return 部门列表
* @return 岗位列表
*/
List<PostDO> getPostList(@Nullable Collection<Long> ids,
@Nullable Collection<Integer> statuses);
List<PostDO> getPostList(@Nullable Collection<Long> ids, @Nullable Collection<Integer> statuses);
/**
* 获得岗位分页列表
*
* @param reqVO 分页条件
* @return 部门分页列表
* @return 岗位分页列表
*/
PageResult<PostDO> getPostPage(PostPageReqVO reqVO);
@@ -79,6 +82,19 @@ public interface PostService {
*/
PostDO getPost(Long id);
/**
* 获得岗位 Map
*
* @param ids 岗位编号数组
* @return 岗位 Map
*/
default Map<Long, PostDO> getPostMap(Collection<Long> ids) {
if (CollUtil.isEmpty(ids)) {
return new HashMap<>();
}
return CollectionUtils.convertMap(getPostList(ids), PostDO::getId);
}
/**
* 校验岗位们是否有效。如下情况,视为无效:
* 1. 岗位编号不存在

View File

@@ -49,10 +49,10 @@ public interface AdminUserService {
void updateUser(@Valid UserSaveReqVO updateReqVO);
/**
* 更新用户的最后登信息
* 更新用户的最后登信息
*
* @param id 用户编号
* @param loginIp 登 IP
* @param loginIp 登 IP
*/
void updateUserLogin(Long id, String loginIp);
@@ -75,7 +75,7 @@ public interface AdminUserService {
/**
* 修改密码
*
* @param id 用户编号
* @param id 用户编号
* @param password 密码
*/
void updateUserPassword(Long id, String password);
@@ -83,7 +83,7 @@ public interface AdminUserService {
/**
* 修改状态
*
* @param id 用户编号
* @param id 用户编号
* @param status 状态
*/
void updateUserStatus(Long id, Integer status);
@@ -129,7 +129,7 @@ public interface AdminUserService {
/**
* 通过用户 ID 查询用户
*
* @param id 用户ID
* @param id 用户 ID
* @return 用户对象信息
*/
AdminUserDO getUser(Long id);
@@ -191,7 +191,7 @@ public interface AdminUserService {
/**
* 批量导入用户
*
* @param importUsers 导入用户列表
* @param importUsers 导入用户列表
* @param isUpdateSupport 是否支持更新
* @return 导入结果
*/

View File

@@ -1,9 +1,12 @@
package com.njcn.rdms.module.system.service.user;
import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.collection.CollectionUtil;
import cn.hutool.core.util.ObjUtil;
import cn.hutool.core.util.StrUtil;
import com.google.common.annotations.VisibleForTesting;
import com.mzt.logapi.context.LogRecordContext;
import com.mzt.logapi.service.impl.DiffParseFunction;
import com.mzt.logapi.starter.annotation.LogRecord;
import com.njcn.rdms.framework.common.enums.CommonStatusEnum;
import com.njcn.rdms.framework.common.enums.UserTypeEnum;
import com.njcn.rdms.framework.common.exception.ServiceException;
@@ -11,7 +14,6 @@ import com.njcn.rdms.framework.common.pojo.PageResult;
import com.njcn.rdms.framework.common.util.collection.CollectionUtils;
import com.njcn.rdms.framework.common.util.object.BeanUtils;
import com.njcn.rdms.framework.common.util.validation.ValidationUtils;
import com.njcn.rdms.module.system.api.config.ConfigApi;
import com.njcn.rdms.module.system.controller.admin.auth.vo.AuthRegisterReqVO;
import com.njcn.rdms.module.system.controller.admin.user.vo.profile.UserProfileUpdatePasswordReqVO;
import com.njcn.rdms.module.system.controller.admin.user.vo.profile.UserProfileUpdateReqVO;
@@ -19,20 +21,15 @@ import com.njcn.rdms.module.system.controller.admin.user.vo.user.UserImportExcel
import com.njcn.rdms.module.system.controller.admin.user.vo.user.UserImportRespVO;
import com.njcn.rdms.module.system.controller.admin.user.vo.user.UserPageReqVO;
import com.njcn.rdms.module.system.controller.admin.user.vo.user.UserSaveReqVO;
import com.njcn.rdms.module.system.dal.dataobject.config.ConfigDO;
import com.njcn.rdms.module.system.dal.dataobject.dept.DeptDO;
import com.njcn.rdms.module.system.dal.dataobject.dept.UserPostDO;
import com.njcn.rdms.module.system.dal.dataobject.user.AdminUserDO;
import com.njcn.rdms.module.system.dal.mysql.dept.UserPostMapper;
import com.njcn.rdms.module.system.dal.mysql.user.AdminUserMapper;
import com.njcn.rdms.module.system.service.config.ConfigService;
import com.njcn.rdms.module.system.service.dept.DeptService;
import com.njcn.rdms.module.system.service.dept.PostService;
import com.njcn.rdms.module.system.service.oauth2.OAuth2TokenService;
import com.njcn.rdms.module.system.service.permission.PermissionService;
import com.google.common.annotations.VisibleForTesting;
import com.mzt.logapi.context.LogRecordContext;
import com.mzt.logapi.service.impl.DiffParseFunction;
import com.mzt.logapi.starter.annotation.LogRecord;
import jakarta.annotation.Resource;
import jakarta.validation.ConstraintViolationException;
import lombok.extern.slf4j.Slf4j;
@@ -42,13 +39,35 @@ import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import java.time.LocalDateTime;
import java.util.*;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.concurrent.atomic.AtomicInteger;
import static com.njcn.rdms.framework.common.exception.util.ServiceExceptionUtil.exception;
import static com.njcn.rdms.framework.common.util.collection.CollectionUtils.*;
import static com.njcn.rdms.module.system.enums.ErrorCodeConstants.*;
import static com.njcn.rdms.module.system.enums.LogRecordConstants.*;
import static com.njcn.rdms.framework.common.util.collection.CollectionUtils.singleton;
import static com.njcn.rdms.module.system.enums.ErrorCodeConstants.USER_EMAIL_EXISTS;
import static com.njcn.rdms.module.system.enums.ErrorCodeConstants.USER_IMPORT_INIT_PASSWORD;
import static com.njcn.rdms.module.system.enums.ErrorCodeConstants.USER_IMPORT_LIST_IS_EMPTY;
import static com.njcn.rdms.module.system.enums.ErrorCodeConstants.USER_IS_DISABLE;
import static com.njcn.rdms.module.system.enums.ErrorCodeConstants.USER_MOBILE_EXISTS;
import static com.njcn.rdms.module.system.enums.ErrorCodeConstants.USER_NOT_EXISTS;
import static com.njcn.rdms.module.system.enums.ErrorCodeConstants.USER_PASSWORD_FAILED;
import static com.njcn.rdms.module.system.enums.ErrorCodeConstants.USER_REGISTER_DISABLED;
import static com.njcn.rdms.module.system.enums.ErrorCodeConstants.USER_USERNAME_EXISTS;
import static com.njcn.rdms.module.system.enums.LogRecordConstants.SYSTEM_USER_CREATE_SUB_TYPE;
import static com.njcn.rdms.module.system.enums.LogRecordConstants.SYSTEM_USER_CREATE_SUCCESS;
import static com.njcn.rdms.module.system.enums.LogRecordConstants.SYSTEM_USER_DELETE_SUB_TYPE;
import static com.njcn.rdms.module.system.enums.LogRecordConstants.SYSTEM_USER_DELETE_SUCCESS;
import static com.njcn.rdms.module.system.enums.LogRecordConstants.SYSTEM_USER_TYPE;
import static com.njcn.rdms.module.system.enums.LogRecordConstants.SYSTEM_USER_UPDATE_PASSWORD_SUB_TYPE;
import static com.njcn.rdms.module.system.enums.LogRecordConstants.SYSTEM_USER_UPDATE_PASSWORD_SUCCESS;
import static com.njcn.rdms.module.system.enums.LogRecordConstants.SYSTEM_USER_UPDATE_SUB_TYPE;
import static com.njcn.rdms.module.system.enums.LogRecordConstants.SYSTEM_USER_UPDATE_SUCCESS;
/**
* 后台用户 Service 实现类
@@ -60,12 +79,10 @@ import static com.njcn.rdms.module.system.enums.LogRecordConstants.*;
public class AdminUserServiceImpl implements AdminUserService {
static final String USER_INIT_PASSWORD_KEY = "system.user.init-password";
static final String USER_REGISTER_ENABLED_KEY = "system.user.register-enabled";
@Resource
private AdminUserMapper userMapper;
@Resource
private DeptService deptService;
@Resource
@@ -74,36 +91,25 @@ public class AdminUserServiceImpl implements AdminUserService {
private PermissionService permissionService;
@Resource
private PasswordEncoder passwordEncoder;
@Resource
@Lazy // 懒加载,避免循环依赖
@Lazy
private OAuth2TokenService oauth2TokenService;
@Resource
private UserPostMapper userPostMapper;
@Resource
private ConfigApi configApi;
private ConfigService configService;
@Override
@Transactional(rollbackFor = Exception.class)
@LogRecord(type = SYSTEM_USER_TYPE, subType = SYSTEM_USER_CREATE_SUB_TYPE, bizNo = "{{#user.id}}",
success = SYSTEM_USER_CREATE_SUCCESS)
public Long createUser(UserSaveReqVO createReqVO) {
// 1.1 校验正确性
validateUserForCreateOrUpdate(null, createReqVO.getUsername(),
createReqVO.getMobile(), createReqVO.getEmail(), createReqVO.getDeptId(), createReqVO.getPostIds());
// 2.1 插入用户
// 1. 校验正确性
validateUserForCreateOrUpdate(null, createReqVO.getUsername(), createReqVO.getMobile(),
createReqVO.getEmail(), createReqVO.getDeptId(), createReqVO.getPositionId());
// 2. 插入用户
AdminUserDO user = BeanUtils.toBean(createReqVO, AdminUserDO.class);
user.setStatus(CommonStatusEnum.ENABLE.getStatus()); // 默认开启
user.setPassword(encodePassword(createReqVO.getPassword())); // 加密密码
userMapper.insert(user);
// 2.2 插入关联岗位
if (CollectionUtil.isNotEmpty(user.getPostIds())) {
userPostMapper.insertBatch(convertList(user.getPostIds(),
postId -> new UserPostDO().setUserId(user.getId()).setPostId(postId)));
}
// 3. 记录操作日志上下文
LogRecordContext.putVariable("user", user);
return user.getId();
@@ -112,12 +118,12 @@ public class AdminUserServiceImpl implements AdminUserService {
@Override
public Long registerUser(AuthRegisterReqVO registerReqVO) {
// 1.1 校验是否开启注册
if (ObjUtil.notEqual(configApi.getConfigValueByKey(USER_REGISTER_ENABLED_KEY).getCheckedData(), "true")) {
if (ObjUtil.notEqual(getConfigValue(USER_REGISTER_ENABLED_KEY), "true")) {
throw exception(USER_REGISTER_DISABLED);
}
// 1.2 校验正确性
validateUserForCreateOrUpdate(null, registerReqVO.getUsername(), null, null, null, null);
validateUserForCreateOrUpdate(null, registerReqVO.getUsername(), null, null,
registerReqVO.getDeptId(), registerReqVO.getPositionId());
// 2. 插入用户
AdminUserDO user = BeanUtils.toBean(registerReqVO, AdminUserDO.class);
user.setStatus(CommonStatusEnum.ENABLE.getStatus()); // 默认开启
@@ -134,36 +140,15 @@ public class AdminUserServiceImpl implements AdminUserService {
updateReqVO.setPassword(null); // 特殊:此处不更新密码
// 1. 校验正确性
AdminUserDO oldUser = validateUserForCreateOrUpdate(updateReqVO.getId(), updateReqVO.getUsername(),
updateReqVO.getMobile(), updateReqVO.getEmail(), updateReqVO.getDeptId(), updateReqVO.getPostIds());
// 2.1 更新用户
updateReqVO.getMobile(), updateReqVO.getEmail(), updateReqVO.getDeptId(), updateReqVO.getPositionId());
// 2. 更新用户
AdminUserDO updateObj = BeanUtils.toBean(updateReqVO, AdminUserDO.class);
userMapper.updateById(updateObj);
// 2.2 更新岗位
updateUserPost(updateReqVO, updateObj);
// 3. 记录操作日志上下文
LogRecordContext.putVariable(DiffParseFunction.OLD_OBJECT, BeanUtils.toBean(oldUser, UserSaveReqVO.class));
LogRecordContext.putVariable("user", oldUser);
}
private void updateUserPost(UserSaveReqVO reqVO, AdminUserDO updateObj) {
Long userId = reqVO.getId();
Set<Long> dbPostIds = convertSet(userPostMapper.selectListByUserId(userId), UserPostDO::getPostId);
// 计算新增和删除的岗位编号
Set<Long> postIds = CollUtil.emptyIfNull(updateObj.getPostIds());
Collection<Long> createPostIds = CollUtil.subtract(postIds, dbPostIds);
Collection<Long> deletePostIds = CollUtil.subtract(dbPostIds, postIds);
// 执行新增和删除。对于已经授权的岗位,不用做任何处理
if (!CollectionUtil.isEmpty(createPostIds)) {
userPostMapper.insertBatch(convertList(createPostIds,
postId -> new UserPostDO().setUserId(userId).setPostId(postId)));
}
if (!CollectionUtil.isEmpty(deletePostIds)) {
userPostMapper.deleteByUserIdAndPostId(userId, deletePostIds);
}
}
@Override
public void updateUserLogin(Long id, String loginIp) {
userMapper.updateById(new AdminUserDO().setId(id).setLoginIp(loginIp).setLoginDate(LocalDateTime.now()));
@@ -181,7 +166,7 @@ public class AdminUserServiceImpl implements AdminUserService {
@Override
public void updateUserPassword(Long id, UserProfileUpdatePasswordReqVO reqVO) {
// 校验旧密码密码
// 校验旧密码
validateOldPassword(id, reqVO.getOldPassword());
// 执行更新
AdminUserDO updateObj = new AdminUserDO().setId(id);
@@ -195,13 +180,11 @@ public class AdminUserServiceImpl implements AdminUserService {
public void updateUserPassword(Long id, String password) {
// 1. 校验用户存在
AdminUserDO user = validateUserExists(id);
// 2. 更新密码
AdminUserDO updateObj = new AdminUserDO();
updateObj.setId(id);
updateObj.setPassword(encodePassword(password)); // 加密密码
userMapper.updateById(updateObj);
// 3. 记录操作日志上下文
LogRecordContext.putVariable("user", user);
LogRecordContext.putVariable("newPassword", updateObj.getPassword());
@@ -216,7 +199,6 @@ public class AdminUserServiceImpl implements AdminUserService {
updateObj.setId(id);
updateObj.setStatus(status);
userMapper.updateById(updateObj);
// 如果是禁用用户,则删除其 Token 信息
if (CommonStatusEnum.isDisable(status)) {
oauth2TokenService.removeAccessToken(id, UserTypeEnum.ADMIN.getValue());
@@ -230,14 +212,9 @@ public class AdminUserServiceImpl implements AdminUserService {
public void deleteUser(Long id) {
// 1. 校验用户存在
AdminUserDO user = validateUserExists(id);
// 2.1 删除用户
// 2. 删除用户及其关联数据
userMapper.deleteById(id);
// 2.2 删除用户关联数据
permissionService.processUserDeleted(id);
// 2.2 删除用户岗位
userPostMapper.deleteByUserId(id);
// 3. 记录操作日志上下文
LogRecordContext.putVariable("user", user);
}
@@ -247,12 +224,8 @@ public class AdminUserServiceImpl implements AdminUserService {
public void deleteUserList(List<Long> ids) {
// 1. 批量删除用户
userMapper.deleteByIds(ids);
// 2. 批量删除用户关联数据
ids.forEach(id -> {
permissionService.processUserDeleted(id);
userPostMapper.deleteByUserId(id);
});
ids.forEach(permissionService::processUserDeleted);
}
@Override
@@ -275,7 +248,6 @@ public class AdminUserServiceImpl implements AdminUserService {
return PageResult.empty();
}
}
// 分页查询
return userMapper.selectPage(reqVO, getDeptCondition(reqVO.getDeptId()), userIds);
}
@@ -298,11 +270,7 @@ public class AdminUserServiceImpl implements AdminUserService {
if (CollUtil.isEmpty(postIds)) {
return Collections.emptyList();
}
Set<Long> userIds = convertSet(userPostMapper.selectListByPostIds(postIds), UserPostDO::getUserId);
if (CollUtil.isEmpty(userIds)) {
return Collections.emptyList();
}
return userMapper.selectByIds(userIds);
return userMapper.selectListByPositionIds(postIds);
}
@Override
@@ -318,7 +286,7 @@ public class AdminUserServiceImpl implements AdminUserService {
if (CollUtil.isEmpty(ids)) {
return;
}
// 获得岗位信息
// 获得用户信息
List<AdminUserDO> users = userMapper.selectByIds(ids);
Map<Long, AdminUserDO> userMap = CollectionUtils.convertMap(users, AdminUserDO::getId);
// 校验
@@ -348,26 +316,26 @@ public class AdminUserServiceImpl implements AdminUserService {
if (deptId == null) {
return Collections.emptySet();
}
Set<Long> deptIds = convertSet(deptService.getChildDeptList(deptId), DeptDO::getId);
Set<Long> deptIds = CollectionUtils.convertSet(deptService.getChildDeptList(deptId), DeptDO::getId);
deptIds.add(deptId); // 包括自身
return deptIds;
}
private AdminUserDO validateUserForCreateOrUpdate(Long id, String username, String mobile, String email,
Long deptId, Set<Long> postIds) {
// 校验用户存在
AdminUserDO user = validateUserExists(id);
// 校验用户名唯一
validateUsernameUnique(id, username);
// 校验手机号唯一
validateMobileUnique(id, mobile);
// 校验邮箱唯一
validateEmailUnique(id, email);
// 校验部门处于开启状态
deptService.validateDeptList(CollectionUtils.singleton(deptId));
// 校验岗位处于开启状态
postService.validatePostList(postIds);
return user;
Long deptId, Long positionId) {
// 校验用户存在
AdminUserDO user = validateUserExists(id);
// 校验用户名唯一
validateUsernameUnique(id, username);
// 校验手机号唯一
validateMobileUnique(id, mobile);
// 校验邮箱唯一
validateEmailUnique(id, email);
// 校验部门处于开启状态
deptService.validateDeptList(singleton(deptId));
// 校验岗位处于开启状态
postService.validatePostList(singleton(positionId));
return user;
}
@VisibleForTesting
@@ -392,10 +360,7 @@ public class AdminUserServiceImpl implements AdminUserService {
return;
}
// 如果 id 为空,说明不用比较是否为相同 id 的用户
if (id == null) {
throw exception(USER_USERNAME_EXISTS);
}
if (!user.getId().equals(id)) {
if (id == null || !user.getId().equals(id)) {
throw exception(USER_USERNAME_EXISTS);
}
}
@@ -410,10 +375,7 @@ public class AdminUserServiceImpl implements AdminUserService {
return;
}
// 如果 id 为空,说明不用比较是否为相同 id 的用户
if (id == null) {
throw exception(USER_EMAIL_EXISTS);
}
if (!user.getId().equals(id)) {
if (id == null || !user.getId().equals(id)) {
throw exception(USER_EMAIL_EXISTS);
}
}
@@ -428,17 +390,15 @@ public class AdminUserServiceImpl implements AdminUserService {
return;
}
// 如果 id 为空,说明不用比较是否为相同 id 的用户
if (id == null) {
throw exception(USER_MOBILE_EXISTS);
}
if (!user.getId().equals(id)) {
if (id == null || !user.getId().equals(id)) {
throw exception(USER_MOBILE_EXISTS);
}
}
/**
* 校验旧密码
* @param id 用户 id
*
* @param id 用户 ID
* @param oldPassword 旧密码
*/
@VisibleForTesting
@@ -453,19 +413,18 @@ public class AdminUserServiceImpl implements AdminUserService {
}
@Override
@Transactional(rollbackFor = Exception.class) // 添加事务,异常则回滚所有导入
@Transactional(rollbackFor = Exception.class)
public UserImportRespVO importUserList(List<UserImportExcelVO> importUsers, boolean isUpdateSupport) {
// 1.1 参数校验
if (CollUtil.isEmpty(importUsers)) {
throw exception(USER_IMPORT_LIST_IS_EMPTY);
}
// 1.2 初始化密码不能为空
String initPassword = configApi.getConfigValueByKey(USER_INIT_PASSWORD_KEY).getCheckedData();
String initPassword = getConfigValue(USER_INIT_PASSWORD_KEY);
if (StrUtil.isEmpty(initPassword)) {
throw exception(USER_IMPORT_INIT_PASSWORD);
}
// 2. 遍历,逐个创建 or 更新
// 2. 遍历,逐个创建或更新
UserImportRespVO respVO = UserImportRespVO.builder().createUsernames(new ArrayList<>())
.updateUsernames(new ArrayList<>()).failureUsernames(new LinkedHashMap<>()).build();
AtomicInteger index = new AtomicInteger(1);
@@ -479,20 +438,19 @@ public class AdminUserServiceImpl implements AdminUserService {
respVO.getFailureUsernames().put(key, ex.getMessage());
return;
}
// 2.1.2 校验,判断是否有不符合的原因
// 2.1.2 校验业务约束
try {
validateUserForCreateOrUpdate(null, null, importUser.getMobile(), importUser.getEmail(),
importUser.getDeptId(), null);
importUser.getDeptId(), importUser.getPositionId());
} catch (ServiceException ex) {
respVO.getFailureUsernames().put(importUser.getUsername(), ex.getMessage());
return;
}
// 2.2.1 判断如果不存在,在进行插入
// 2.2.1 判断如果不存在,则插入
AdminUserDO existUser = userMapper.selectByUsername(importUser.getUsername());
if (existUser == null) {
userMapper.insert(BeanUtils.toBean(importUser, AdminUserDO.class)
.setPassword(encodePassword(initPassword)).setPostIds(new HashSet<>())); // 设置默认密码及空岗位编号数组
.setPassword(encodePassword(initPassword)));
respVO.getCreateUsernames().add(importUser.getUsername());
return;
}
@@ -529,4 +487,15 @@ public class AdminUserServiceImpl implements AdminUserService {
return passwordEncoder.encode(password);
}
/**
* 读取 system 模块内部参数配置,避免同服务自调用 Feign。
*
* @param key 配置键
* @return 配置值
*/
private String getConfigValue(String key) {
ConfigDO config = configService.getConfigByKey(key);
return config != null ? config.getValue() : null;
}
}

View File

@@ -0,0 +1,649 @@
/*
Navicat Premium Dump SQL
Source Server : localMysql
Source Server Type : MySQL
Source Server Version : 80043 (8.0.43)
Source Host : localhost:13306
Source Schema : rdms
Target Server Type : MySQL
Target Server Version : 80043 (8.0.43)
File Encoding : 65001
Date: 19/03/2026 14:23:55
*/
SET NAMES utf8mb4;
SET FOREIGN_KEY_CHECKS = 0;
-- ----------------------------
-- Table structure for system_dept
-- ----------------------------
DROP TABLE IF EXISTS `system_dept`;
CREATE TABLE `system_dept` (
`id` bigint NOT NULL COMMENT '部门id',
`name` varchar(30) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '' COMMENT '部门名称',
`parent_id` bigint NOT NULL DEFAULT 0 COMMENT '父部门id',
`org_type` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT 'dept' COMMENT '组织节点类型company/dept/direction/team',
`path` varchar(1024) CHARACTER SET ascii COLLATE ascii_general_ci NOT NULL DEFAULT '/' COMMENT '组织物化路径,格式如 /1/2/3/',
`level` int NOT NULL DEFAULT 1 COMMENT '组织层级,根节点为 1',
`code` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL COMMENT '组织编码',
`sort` int NOT NULL DEFAULT 0 COMMENT '显示顺序',
`leader_user_id` bigint NULL DEFAULT NULL COMMENT '负责人',
`phone` varchar(11) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL COMMENT '联系电话',
`email` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL COMMENT '邮箱',
`status` tinyint NOT NULL COMMENT '部门状态0正常 1停用',
`creator` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT '' COMMENT '创建者',
`create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
`updater` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT '' COMMENT '更新者',
`update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
`deleted` bit(1) NOT NULL DEFAULT b'0' COMMENT '是否删除',
PRIMARY KEY (`id`) USING BTREE,
UNIQUE INDEX `uk_system_dept_code`(`code` ASC) USING BTREE,
INDEX `idx_system_dept_parent_id`(`parent_id` ASC) USING BTREE,
INDEX `idx_system_dept_org_type`(`org_type` ASC) USING BTREE,
INDEX `idx_system_dept_path`(`path`(191) ASC) USING BTREE
) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci COMMENT = '部门表' ROW_FORMAT = Dynamic;
-- ----------------------------
-- Records of system_dept
-- ----------------------------
INSERT INTO `system_dept` VALUES (100, '灿能源码', 0, 'dept', '/100/', 1, NULL, 0, 1, '15888888888', 'ry@qq.com', 0, 'admin', '2021-01-05 17:03:47', '1', '2026-03-19 13:58:49', b'0');
INSERT INTO `system_dept` VALUES (101, '深圳总公司', 100, 'dept', '/100/101/', 2, NULL, 1, NULL, '15888888888', 'ry@qq.com', 0, 'admin', '2021-01-05 17:03:47', '1', '2026-03-19 14:22:19', b'0');
INSERT INTO `system_dept` VALUES (103, '研发部门', 101, 'dept', '/100/101/103/', 3, NULL, 1, 1, '15888888888', 'ry@qq.com', 0, 'admin', '2021-01-05 17:03:47', '1', '2026-03-19 13:58:49', b'0');
INSERT INTO `system_dept` VALUES (107, '运维部门', 101, 'dept', '/100/101/107/', 3, NULL, 5, 1, '15888888888', 'ry@qq.com', 0, 'admin', '2021-01-05 17:03:47', '1', '2026-03-19 13:58:49', b'0');
INSERT INTO `system_dept` VALUES (112, '产品部门', 101, 'dept', '/100/101/112/', 3, NULL, 100, 1, NULL, NULL, 1, '1', '2023-12-02 09:45:13', '1', '2026-03-19 13:58:49', b'0');
-- ----------------------------
-- Table structure for system_menu
-- ----------------------------
DROP TABLE IF EXISTS `system_menu`;
CREATE TABLE `system_menu` (
`id` bigint NOT NULL COMMENT '菜单ID',
`name` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '菜单名称',
`permission` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '' COMMENT '权限标识',
`type` tinyint NOT NULL COMMENT '菜单类型',
`sort` int NOT NULL DEFAULT 0 COMMENT '显示顺序',
`parent_id` bigint NOT NULL DEFAULT 0 COMMENT '父菜单ID',
`path` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT '' COMMENT '路由地址',
`icon` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT '#' COMMENT '菜单图标',
`component` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL COMMENT '组件路径',
`component_name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL COMMENT '组件名',
`status` tinyint NOT NULL DEFAULT 0 COMMENT '菜单状态',
`visible` bit(1) NOT NULL DEFAULT b'1' COMMENT '是否可见',
`keep_alive` bit(1) NOT NULL DEFAULT b'1' COMMENT '是否缓存',
`always_show` bit(1) NOT NULL DEFAULT b'1' COMMENT '是否总是显示',
`creator` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT '' COMMENT '创建者',
`create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
`updater` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT '' COMMENT '更新者',
`update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
`deleted` bit(1) NOT NULL DEFAULT b'0' COMMENT '是否删除',
PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci COMMENT = '菜单权限表' ROW_FORMAT = Dynamic;
-- ----------------------------
-- Records of system_menu
-- ----------------------------
INSERT INTO `system_menu` VALUES (1, '系统管理', '', 1, 10, 0, '/system', 'ep:tools', NULL, NULL, 0, b'1', b'1', b'1', 'admin', '2021-01-05 17:03:48', '1', '2025-03-15 21:30:27', b'0');
INSERT INTO `system_menu` VALUES (2, '基础设施', '', 1, 20, 0, '/infra', 'ep:monitor', NULL, NULL, 0, b'1', b'1', b'1', 'admin', '2021-01-05 17:03:48', '1', '2024-03-01 08:28:40', b'0');
INSERT INTO `system_menu` VALUES (5, 'OA 示例', '', 1, 40, 1185, 'oa', 'fa:road', NULL, NULL, 0, b'1', b'1', b'1', 'admin', '2021-09-20 16:26:19', '1', '2024-02-29 12:38:13', b'0');
INSERT INTO `system_menu` VALUES (100, '用户管理', 'system:user:list', 2, 1, 1, 'user', 'ep:avatar', 'system/user/index', 'SystemUser', 0, b'1', b'1', b'1', 'admin', '2021-01-05 17:03:48', '1', '2025-03-15 21:30:41', b'0');
INSERT INTO `system_menu` VALUES (101, '角色管理', '', 2, 2, 1, 'role', 'ep:user', 'system/role/index', 'SystemRole', 0, b'1', b'1', b'1', 'admin', '2021-01-05 17:03:48', '1', '2024-05-01 18:35:29', b'0');
INSERT INTO `system_menu` VALUES (102, '菜单管理', '', 2, 3, 1, 'menu', 'ep:menu', 'system/menu/index', 'SystemMenu', 0, b'1', b'1', b'1', 'admin', '2021-01-05 17:03:48', '1', '2024-02-29 01:03:50', b'0');
INSERT INTO `system_menu` VALUES (103, '部门管理', '', 2, 4, 1, 'dept', 'fa:address-card', 'system/dept/index', 'SystemDept', 0, b'1', b'1', b'1', 'admin', '2021-01-05 17:03:48', '1', '2024-02-29 01:06:28', b'0');
INSERT INTO `system_menu` VALUES (104, '岗位管理', '', 2, 5, 1, 'post', 'fa:address-book-o', 'system/post/index', 'SystemPost', 0, b'1', b'1', b'1', 'admin', '2021-01-05 17:03:48', '1', '2024-02-29 01:06:39', b'0');
INSERT INTO `system_menu` VALUES (105, '字典管理', '', 2, 6, 1, 'dict', 'ep:collection', 'system/dict/index', 'SystemDictType', 0, b'1', b'1', b'1', 'admin', '2021-01-05 17:03:48', '1', '2024-02-29 01:07:12', b'0');
INSERT INTO `system_menu` VALUES (106, '配置管理', '', 2, 8, 2, 'config', 'fa:connectdevelop', 'infra/config/index', 'InfraConfig', 0, b'1', b'1', b'1', 'admin', '2021-01-05 17:03:48', '1', '2024-04-23 00:02:45', b'0');
INSERT INTO `system_menu` VALUES (108, '审计日志', '', 1, 9, 1, 'log', 'ep:document-copy', '', NULL, 0, b'1', b'1', b'1', 'admin', '2021-01-05 17:03:48', '1', '2024-02-29 01:08:30', b'0');
INSERT INTO `system_menu` VALUES (109, '令牌管理', '', 2, 2, 1261, 'token', 'fa:key', 'system/oauth2/token/index', 'SystemTokenClient', 0, b'1', b'1', b'1', 'admin', '2021-01-05 17:03:48', '1', '2024-02-29 01:13:48', b'0');
INSERT INTO `system_menu` VALUES (111, 'MySQL 监控', '', 2, 1, 2740, 'druid', 'fa-solid:box', 'infra/druid/index', 'InfraDruid', 0, b'1', b'1', b'1', 'admin', '2021-01-05 17:03:48', '1', '2024-04-23 00:05:58', b'0');
INSERT INTO `system_menu` VALUES (112, 'Java 监控', '', 2, 3, 2740, 'admin-server', 'ep:coffee-cup', 'infra/server/index', 'InfraAdminServer', 0, b'1', b'1', b'1', 'admin', '2021-01-05 17:03:48', '1', '2024-04-23 00:06:57', b'0');
INSERT INTO `system_menu` VALUES (113, 'Redis 监控', '', 2, 2, 2740, 'redis', 'fa:reddit-square', 'infra/redis/index', 'InfraRedis', 0, b'1', b'1', b'1', 'admin', '2021-01-05 17:03:48', '1', '2024-04-23 00:06:09', b'0');
INSERT INTO `system_menu` VALUES (114, '表单构建', 'infra:build:list', 2, 2, 2, 'build', 'fa:wpforms', 'infra/build/index', 'InfraBuild', 0, b'1', b'1', b'1', 'admin', '2021-01-05 17:03:48', '1', '2024-02-29 08:51:35', b'0');
INSERT INTO `system_menu` VALUES (116, 'API 接口', 'infra:swagger:list', 2, 3, 2, 'swagger', 'fa:fighter-jet', 'infra/swagger/index', 'InfraSwagger', 0, b'1', b'1', b'1', 'admin', '2021-01-05 17:03:48', '1', '2024-04-23 00:01:24', b'0');
INSERT INTO `system_menu` VALUES (500, '操作日志', '', 2, 1, 108, 'operate-log', 'ep:position', 'system/operatelog/index', 'SystemOperateLog', 0, b'1', b'1', b'1', 'admin', '2021-01-05 17:03:48', '1', '2024-02-29 01:09:59', b'0');
INSERT INTO `system_menu` VALUES (501, '登录日志', '', 2, 2, 108, 'login-log', 'ep:promotion', 'system/loginlog/index', 'SystemLoginLog', 0, b'1', b'1', b'1', 'admin', '2021-01-05 17:03:48', '1', '2024-02-29 01:10:29', b'0');
INSERT INTO `system_menu` VALUES (1001, '用户查询', 'system:user:query', 3, 1, 100, '', '#', '', NULL, 0, b'1', b'1', b'1', 'admin', '2021-01-05 17:03:48', '', '2022-04-20 17:03:10', b'0');
INSERT INTO `system_menu` VALUES (1002, '用户新增', 'system:user:create', 3, 2, 100, '', '', '', NULL, 0, b'1', b'1', b'1', 'admin', '2021-01-05 17:03:48', '1', '2022-04-20 17:03:10', b'0');
INSERT INTO `system_menu` VALUES (1003, '用户修改', 'system:user:update', 3, 3, 100, '', '', '', NULL, 0, b'1', b'1', b'1', 'admin', '2021-01-05 17:03:48', '1', '2022-04-20 17:03:10', b'0');
INSERT INTO `system_menu` VALUES (1004, '用户删除', 'system:user:delete', 3, 4, 100, '', '', '', NULL, 0, b'1', b'1', b'1', 'admin', '2021-01-05 17:03:48', '1', '2022-04-20 17:03:10', b'0');
INSERT INTO `system_menu` VALUES (1005, '用户导出', 'system:user:export', 3, 5, 100, '', '#', '', NULL, 0, b'1', b'1', b'1', 'admin', '2021-01-05 17:03:48', '', '2022-04-20 17:03:10', b'0');
INSERT INTO `system_menu` VALUES (1006, '用户导入', 'system:user:import', 3, 6, 100, '', '#', '', NULL, 0, b'1', b'1', b'1', 'admin', '2021-01-05 17:03:48', '', '2022-04-20 17:03:10', b'0');
INSERT INTO `system_menu` VALUES (1007, '重置密码', 'system:user:update-password', 3, 7, 100, '', '', '', NULL, 0, b'1', b'1', b'1', 'admin', '2021-01-05 17:03:48', '1', '2022-04-20 17:03:10', b'0');
INSERT INTO `system_menu` VALUES (1008, '角色查询', 'system:role:query', 3, 1, 101, '', '#', '', NULL, 0, b'1', b'1', b'1', 'admin', '2021-01-05 17:03:48', '', '2022-04-20 17:03:10', b'0');
INSERT INTO `system_menu` VALUES (1009, '角色新增', 'system:role:create', 3, 2, 101, '', '', '', NULL, 0, b'1', b'1', b'1', 'admin', '2021-01-05 17:03:48', '1', '2022-04-20 17:03:10', b'0');
INSERT INTO `system_menu` VALUES (1010, '角色修改', 'system:role:update', 3, 3, 101, '', '', '', NULL, 0, b'1', b'1', b'1', 'admin', '2021-01-05 17:03:48', '1', '2022-04-20 17:03:10', b'0');
INSERT INTO `system_menu` VALUES (1011, '角色删除', 'system:role:delete', 3, 4, 101, '', '', '', NULL, 0, b'1', b'1', b'1', 'admin', '2021-01-05 17:03:48', '1', '2022-04-20 17:03:10', b'0');
INSERT INTO `system_menu` VALUES (1012, '角色导出', 'system:role:export', 3, 5, 101, '', '#', '', NULL, 0, b'1', b'1', b'1', 'admin', '2021-01-05 17:03:48', '', '2022-04-20 17:03:10', b'0');
INSERT INTO `system_menu` VALUES (1013, '菜单查询', 'system:menu:query', 3, 1, 102, '', '#', '', NULL, 0, b'1', b'1', b'1', 'admin', '2021-01-05 17:03:48', '', '2022-04-20 17:03:10', b'0');
INSERT INTO `system_menu` VALUES (1014, '菜单新增', 'system:menu:create', 3, 2, 102, '', '#', '', NULL, 0, b'1', b'1', b'1', 'admin', '2021-01-05 17:03:48', '', '2022-04-20 17:03:10', b'0');
INSERT INTO `system_menu` VALUES (1015, '菜单修改', 'system:menu:update', 3, 3, 102, '', '#', '', NULL, 0, b'1', b'1', b'1', 'admin', '2021-01-05 17:03:48', '', '2022-04-20 17:03:10', b'0');
INSERT INTO `system_menu` VALUES (1016, '菜单删除', 'system:menu:delete', 3, 4, 102, '', '#', '', NULL, 0, b'1', b'1', b'1', 'admin', '2021-01-05 17:03:48', '', '2022-04-20 17:03:10', b'0');
INSERT INTO `system_menu` VALUES (1017, '部门查询', 'system:dept:query', 3, 1, 103, '', '#', '', NULL, 0, b'1', b'1', b'1', 'admin', '2021-01-05 17:03:48', '', '2022-04-20 17:03:10', b'0');
INSERT INTO `system_menu` VALUES (1018, '部门新增', 'system:dept:create', 3, 2, 103, '', '', '', NULL, 0, b'1', b'1', b'1', 'admin', '2021-01-05 17:03:48', '1', '2022-04-20 17:03:10', b'0');
INSERT INTO `system_menu` VALUES (1019, '部门修改', 'system:dept:update', 3, 3, 103, '', '', '', NULL, 0, b'1', b'1', b'1', 'admin', '2021-01-05 17:03:48', '1', '2022-04-20 17:03:10', b'0');
INSERT INTO `system_menu` VALUES (1020, '部门删除', 'system:dept:delete', 3, 4, 103, '', '', '', NULL, 0, b'1', b'1', b'1', 'admin', '2021-01-05 17:03:48', '1', '2022-04-20 17:03:10', b'0');
INSERT INTO `system_menu` VALUES (1021, '岗位查询', 'system:post:query', 3, 1, 104, '', '#', '', NULL, 0, b'1', b'1', b'1', 'admin', '2021-01-05 17:03:48', '', '2022-04-20 17:03:10', b'0');
INSERT INTO `system_menu` VALUES (1022, '岗位新增', 'system:post:create', 3, 2, 104, '', '', '', NULL, 0, b'1', b'1', b'1', 'admin', '2021-01-05 17:03:48', '1', '2022-04-20 17:03:10', b'0');
INSERT INTO `system_menu` VALUES (1023, '岗位修改', 'system:post:update', 3, 3, 104, '', '', '', NULL, 0, b'1', b'1', b'1', 'admin', '2021-01-05 17:03:48', '1', '2022-04-20 17:03:10', b'0');
INSERT INTO `system_menu` VALUES (1024, '岗位删除', 'system:post:delete', 3, 4, 104, '', '', '', NULL, 0, b'1', b'1', b'1', 'admin', '2021-01-05 17:03:48', '1', '2022-04-20 17:03:10', b'0');
INSERT INTO `system_menu` VALUES (1025, '岗位导出', 'system:post:export', 3, 5, 104, '', '#', '', NULL, 0, b'1', b'1', b'1', 'admin', '2021-01-05 17:03:48', '', '2022-04-20 17:03:10', b'0');
INSERT INTO `system_menu` VALUES (1026, '字典查询', 'system:dict:query', 3, 1, 105, '#', '#', '', NULL, 0, b'1', b'1', b'1', 'admin', '2021-01-05 17:03:48', '', '2022-04-20 17:03:10', b'0');
INSERT INTO `system_menu` VALUES (1027, '字典新增', 'system:dict:create', 3, 2, 105, '', '', '', NULL, 0, b'1', b'1', b'1', 'admin', '2021-01-05 17:03:48', '1', '2022-04-20 17:03:10', b'0');
INSERT INTO `system_menu` VALUES (1028, '字典修改', 'system:dict:update', 3, 3, 105, '', '', '', NULL, 0, b'1', b'1', b'1', 'admin', '2021-01-05 17:03:48', '1', '2022-04-20 17:03:10', b'0');
INSERT INTO `system_menu` VALUES (1029, '字典删除', 'system:dict:delete', 3, 4, 105, '', '', '', NULL, 0, b'1', b'1', b'1', 'admin', '2021-01-05 17:03:48', '1', '2022-04-20 17:03:10', b'0');
INSERT INTO `system_menu` VALUES (1030, '字典导出', 'system:dict:export', 3, 5, 105, '#', '#', '', NULL, 0, b'1', b'1', b'1', 'admin', '2021-01-05 17:03:48', '', '2022-04-20 17:03:10', b'0');
INSERT INTO `system_menu` VALUES (1031, '配置查询', 'infra:config:query', 3, 1, 106, '', '', '', NULL, 0, b'1', b'1', b'1', 'admin', '2021-01-05 17:03:48', '', '2022-04-20 17:03:10', b'0');
INSERT INTO `system_menu` VALUES (1032, '配置新增', 'infra:config:create', 3, 2, 106, '', '', '', NULL, 0, b'1', b'1', b'1', 'admin', '2021-01-05 17:03:48', '1', '2022-04-20 17:03:10', b'0');
INSERT INTO `system_menu` VALUES (1033, '配置修改', 'infra:config:update', 3, 3, 106, '', '', '', NULL, 0, b'1', b'1', b'1', 'admin', '2021-01-05 17:03:48', '1', '2022-04-20 17:03:10', b'0');
INSERT INTO `system_menu` VALUES (1034, '配置删除', 'infra:config:delete', 3, 4, 106, '', '', '', NULL, 0, b'1', b'1', b'1', 'admin', '2021-01-05 17:03:48', '1', '2022-04-20 17:03:10', b'0');
INSERT INTO `system_menu` VALUES (1035, '配置导出', 'infra:config:export', 3, 5, 106, '', '', '', NULL, 0, b'1', b'1', b'1', 'admin', '2021-01-05 17:03:48', '', '2022-04-20 17:03:10', b'0');
INSERT INTO `system_menu` VALUES (1040, '操作查询', 'system:operate-log:query', 3, 1, 500, '', '', '', NULL, 0, b'1', b'1', b'1', 'admin', '2021-01-05 17:03:48', '', '2022-04-20 17:03:10', b'0');
INSERT INTO `system_menu` VALUES (1042, '日志导出', 'system:operate-log:export', 3, 2, 500, '', '', '', NULL, 0, b'1', b'1', b'1', 'admin', '2021-01-05 17:03:48', '', '2022-04-20 17:03:10', b'0');
INSERT INTO `system_menu` VALUES (1043, '登录查询', 'system:login-log:query', 3, 1, 501, '#', '#', '', NULL, 0, b'1', b'1', b'1', 'admin', '2021-01-05 17:03:48', '', '2022-04-20 17:03:10', b'0');
INSERT INTO `system_menu` VALUES (1045, '日志导出', 'system:login-log:export', 3, 3, 501, '#', '#', '', NULL, 0, b'1', b'1', b'1', 'admin', '2021-01-05 17:03:48', '', '2022-04-20 17:03:10', b'0');
INSERT INTO `system_menu` VALUES (1046, '令牌列表', 'system:oauth2-token:page', 3, 1, 109, '', '', '', NULL, 0, b'1', b'1', b'1', 'admin', '2021-01-05 17:03:48', '1', '2022-05-09 23:54:42', b'0');
INSERT INTO `system_menu` VALUES (1048, '令牌删除', 'system:oauth2-token:delete', 3, 2, 109, '', '', '', NULL, 0, b'1', b'1', b'1', 'admin', '2021-01-05 17:03:48', '1', '2022-05-09 23:54:53', b'0');
INSERT INTO `system_menu` VALUES (1063, '设置角色菜单权限', 'system:permission:assign-role-menu', 3, 6, 101, '', '', '', NULL, 0, b'1', b'1', b'1', '', '2021-01-06 17:53:44', '', '2022-04-20 17:03:10', b'0');
INSERT INTO `system_menu` VALUES (1064, '设置角色数据权限', 'system:permission:assign-role-data-scope', 3, 7, 101, '', '', '', NULL, 0, b'1', b'1', b'1', '', '2021-01-06 17:56:31', '', '2022-04-20 17:03:10', b'0');
INSERT INTO `system_menu` VALUES (1065, '设置用户角色', 'system:permission:assign-user-role', 3, 8, 101, '', '', '', NULL, 0, b'1', b'1', b'1', '', '2021-01-07 10:23:28', '', '2022-04-20 17:03:10', b'0');
INSERT INTO `system_menu` VALUES (1066, '获得 Redis 监控信息', 'infra:redis:get-monitor-info', 3, 1, 113, '', '', '', NULL, 0, b'1', b'1', b'1', '', '2021-01-26 01:02:31', '', '2022-04-20 17:03:10', b'0');
INSERT INTO `system_menu` VALUES (1067, '获得 Redis Key 列表', 'infra:redis:get-key-list', 3, 2, 113, '', '', '', NULL, 0, b'1', b'1', b'1', '', '2021-01-26 01:02:52', '', '2022-04-20 17:03:10', b'0');
INSERT INTO `system_menu` VALUES (1070, '代码生成案例', '', 1, 1, 2, 'demo', 'ep:aim', 'infra/testDemo/index', NULL, 0, b'1', b'1', b'1', '', '2021-02-06 12:42:49', '1', '2023-11-15 23:45:53', b'0');
INSERT INTO `system_menu` VALUES (1077, '链路追踪', '', 2, 4, 2740, 'skywalking', 'fa:eye', 'infra/skywalking/index', 'InfraSkyWalking', 0, b'1', b'1', b'1', '', '2021-02-08 20:41:31', '1', '2024-04-23 00:07:15', b'0');
INSERT INTO `system_menu` VALUES (1078, '访问日志', '', 2, 1, 1083, 'api-access-log', 'ep:place', 'infra/apiAccessLog/index', 'InfraApiAccessLog', 0, b'1', b'1', b'1', '', '2021-02-26 01:32:59', '1', '2024-02-29 08:54:57', b'0');
INSERT INTO `system_menu` VALUES (1082, '日志导出', 'infra:api-access-log:export', 3, 2, 1078, '', '', '', NULL, 0, b'1', b'1', b'1', '', '2021-02-26 01:32:59', '1', '2022-04-20 17:03:10', b'0');
INSERT INTO `system_menu` VALUES (1083, 'API 日志', '', 2, 4, 2, 'log', 'fa:tasks', NULL, NULL, 0, b'1', b'1', b'1', '', '2021-02-26 02:18:24', '1', '2024-04-22 23:58:36', b'0');
INSERT INTO `system_menu` VALUES (1084, '错误日志', 'infra:api-error-log:query', 2, 2, 1083, 'api-error-log', 'ep:warning-filled', 'infra/apiErrorLog/index', 'InfraApiErrorLog', 0, b'1', b'1', b'1', '', '2021-02-26 07:53:20', '1', '2024-02-29 08:55:17', b'0');
INSERT INTO `system_menu` VALUES (1085, '日志处理', 'infra:api-error-log:update-status', 3, 2, 1084, '', '', '', NULL, 0, b'1', b'1', b'1', '', '2021-02-26 07:53:20', '1', '2022-04-20 17:03:10', b'0');
INSERT INTO `system_menu` VALUES (1086, '日志导出', 'infra:api-error-log:export', 3, 3, 1084, '', '', '', NULL, 0, b'1', b'1', b'1', '', '2021-02-26 07:53:20', '1', '2022-04-20 17:03:10', b'0');
INSERT INTO `system_menu` VALUES (1088, '日志查询', 'infra:api-access-log:query', 3, 1, 1078, '', '', '', NULL, 0, b'1', b'1', b'1', '1', '2021-03-10 01:28:04', '1', '2022-04-20 17:03:10', b'0');
INSERT INTO `system_menu` VALUES (1089, '日志查询', 'infra:api-error-log:query', 3, 1, 1084, '', '', '', NULL, 0, b'1', b'1', b'1', '1', '2021-03-10 01:29:09', '1', '2022-04-20 17:03:10', b'0');
INSERT INTO `system_menu` VALUES (1090, '文件列表', '', 2, 5, 1243, 'file', 'ep:upload-filled', 'infra/file/index', 'InfraFile', 0, b'1', b'1', b'1', '', '2021-03-12 20:16:20', '1', '2024-02-29 08:53:02', b'0');
INSERT INTO `system_menu` VALUES (1091, '文件查询', 'infra:file:query', 3, 1, 1090, '', '', '', NULL, 0, b'1', b'1', b'1', '', '2021-03-12 20:16:20', '', '2022-04-20 17:03:10', b'0');
INSERT INTO `system_menu` VALUES (1092, '文件删除', 'infra:file:delete', 3, 4, 1090, '', '', '', NULL, 0, b'1', b'1', b'1', '', '2021-03-12 20:16:20', '', '2022-04-20 17:03:10', b'0');
INSERT INTO `system_menu` VALUES (1118, '请假查询', '', 2, 0, 5, 'leave', 'fa:leanpub', 'bpm/oa/leave/index', 'BpmOALeave', 0, b'1', b'1', b'1', '', '2021-09-20 08:51:03', '1', '2024-02-29 12:38:21', b'0');
INSERT INTO `system_menu` VALUES (1119, '请假申请查询', 'bpm:oa-leave:query', 3, 1, 1118, '', '', '', NULL, 0, b'1', b'1', b'1', '', '2021-09-20 08:51:03', '1', '2022-04-20 17:03:10', b'0');
INSERT INTO `system_menu` VALUES (1120, '请假申请创建', 'bpm:oa-leave:create', 3, 2, 1118, '', '', '', NULL, 0, b'1', b'1', b'1', '', '2021-09-20 08:51:03', '1', '2022-04-20 17:03:10', b'0');
INSERT INTO `system_menu` VALUES (1185, '工作流程', '', 1, 50, 0, '/bpm', 'fa:medium', NULL, NULL, 0, b'1', b'1', b'1', '1', '2021-12-30 20:26:36', '1', '2024-02-29 12:43:43', b'0');
INSERT INTO `system_menu` VALUES (1186, '流程管理', '', 1, 10, 1185, 'manager', 'fa:dedent', NULL, NULL, 0, b'1', b'1', b'1', '1', '2021-12-30 20:28:30', '1', '2024-02-29 12:36:02', b'0');
INSERT INTO `system_menu` VALUES (1187, '流程表单', '', 2, 2, 1186, 'form', 'fa:hdd-o', 'bpm/form/index', 'BpmForm', 0, b'1', b'1', b'1', '', '2021-12-30 12:38:22', '1', '2024-03-19 12:25:25', b'0');
INSERT INTO `system_menu` VALUES (1188, '表单查询', 'bpm:form:query', 3, 1, 1187, '', '', '', NULL, 0, b'1', b'1', b'1', '', '2021-12-30 12:38:22', '1', '2022-04-20 17:03:10', b'0');
INSERT INTO `system_menu` VALUES (1189, '表单创建', 'bpm:form:create', 3, 2, 1187, '', '', '', NULL, 0, b'1', b'1', b'1', '', '2021-12-30 12:38:22', '1', '2022-04-20 17:03:10', b'0');
INSERT INTO `system_menu` VALUES (1190, '表单更新', 'bpm:form:update', 3, 3, 1187, '', '', '', NULL, 0, b'1', b'1', b'1', '', '2021-12-30 12:38:22', '1', '2022-04-20 17:03:10', b'0');
INSERT INTO `system_menu` VALUES (1191, '表单删除', 'bpm:form:delete', 3, 4, 1187, '', '', '', NULL, 0, b'1', b'1', b'1', '', '2021-12-30 12:38:22', '1', '2022-04-20 17:03:10', b'0');
INSERT INTO `system_menu` VALUES (1192, '表单导出', 'bpm:form:export', 3, 5, 1187, '', '', '', NULL, 0, b'1', b'1', b'1', '', '2021-12-30 12:38:22', '1', '2022-04-20 17:03:10', b'0');
INSERT INTO `system_menu` VALUES (1193, '流程模型', '', 2, 1, 1186, 'model', 'fa-solid:project-diagram', 'bpm/model/index', 'BpmModel', 0, b'1', b'1', b'1', '1', '2021-12-31 23:24:58', '1', '2024-03-19 12:25:19', b'0');
INSERT INTO `system_menu` VALUES (1194, '模型查询', 'bpm:model:query', 3, 1, 1193, '', '', '', NULL, 0, b'1', b'1', b'1', '1', '2022-01-03 19:01:10', '1', '2022-04-20 17:03:10', b'0');
INSERT INTO `system_menu` VALUES (1195, '模型创建', 'bpm:model:create', 3, 2, 1193, '', '', '', NULL, 0, b'1', b'1', b'1', '1', '2022-01-03 19:01:24', '1', '2022-04-20 17:03:10', b'0');
INSERT INTO `system_menu` VALUES (1197, '模型更新', 'bpm:model:update', 3, 4, 1193, '', '', '', NULL, 0, b'1', b'1', b'1', '1', '2022-01-03 19:02:28', '1', '2022-04-20 17:03:10', b'0');
INSERT INTO `system_menu` VALUES (1198, '模型删除', 'bpm:model:delete', 3, 5, 1193, '', '', '', NULL, 0, b'1', b'1', b'1', '1', '2022-01-03 19:02:43', '1', '2022-04-20 17:03:10', b'0');
INSERT INTO `system_menu` VALUES (1199, '模型发布', 'bpm:model:deploy', 3, 6, 1193, '', '', '', NULL, 0, b'1', b'1', b'1', '1', '2022-01-03 19:03:24', '1', '2022-04-20 17:03:10', b'0');
INSERT INTO `system_menu` VALUES (1200, '审批中心', '', 2, 20, 1185, 'task', 'fa:tasks', NULL, NULL, 0, b'1', b'1', b'1', '1', '2022-01-07 23:51:48', '1', '2024-03-21 00:33:15', b'0');
INSERT INTO `system_menu` VALUES (1201, '我的流程', '', 2, 1, 1200, 'my', 'fa-solid:book', 'bpm/processInstance/index', 'BpmProcessInstanceMy', 0, b'1', b'1', b'1', '', '2022-01-07 15:53:44', '1', '2024-03-21 23:52:12', b'0');
INSERT INTO `system_menu` VALUES (1202, '流程实例的查询', 'bpm:process-instance:query', 3, 1, 1201, '', '', '', NULL, 0, b'1', b'1', b'1', '', '2022-01-07 15:53:44', '1', '2022-04-20 17:03:10', b'0');
INSERT INTO `system_menu` VALUES (1207, '待办任务', '', 2, 10, 1200, 'todo', 'fa:slack', 'bpm/task/todo/index', 'BpmTodoTask', 0, b'1', b'1', b'1', '1', '2022-01-08 10:33:37', '1', '2024-02-29 12:37:39', b'0');
INSERT INTO `system_menu` VALUES (1208, '已办任务', '', 2, 20, 1200, 'done', 'fa:delicious', 'bpm/task/done/index', 'BpmDoneTask', 0, b'1', b'1', b'1', '1', '2022-01-08 10:34:13', '1', '2024-02-29 12:37:54', b'0');
INSERT INTO `system_menu` VALUES (1209, '用户分组', '', 2, 4, 1186, 'user-group', 'fa:user-secret', 'bpm/group/index', 'BpmUserGroup', 0, b'1', b'1', b'1', '', '2022-01-14 02:14:20', '1', '2024-03-21 23:55:29', b'0');
INSERT INTO `system_menu` VALUES (1210, '用户组查询', 'bpm:user-group:query', 3, 1, 1209, '', '', '', NULL, 0, b'1', b'1', b'1', '', '2022-01-14 02:14:20', '', '2022-04-20 17:03:10', b'0');
INSERT INTO `system_menu` VALUES (1211, '用户组创建', 'bpm:user-group:create', 3, 2, 1209, '', '', '', NULL, 0, b'1', b'1', b'1', '', '2022-01-14 02:14:20', '', '2022-04-20 17:03:10', b'0');
INSERT INTO `system_menu` VALUES (1212, '用户组更新', 'bpm:user-group:update', 3, 3, 1209, '', '', '', NULL, 0, b'1', b'1', b'1', '', '2022-01-14 02:14:20', '', '2022-04-20 17:03:10', b'0');
INSERT INTO `system_menu` VALUES (1213, '用户组删除', 'bpm:user-group:delete', 3, 4, 1209, '', '', '', NULL, 0, b'1', b'1', b'1', '', '2022-01-14 02:14:20', '', '2022-04-20 17:03:10', b'0');
INSERT INTO `system_menu` VALUES (1215, '流程定义查询', 'bpm:process-definition:query', 3, 10, 1193, '', '', '', NULL, 0, b'1', b'1', b'1', '1', '2022-01-23 00:21:43', '1', '2022-04-20 17:03:10', b'0');
INSERT INTO `system_menu` VALUES (1216, '流程任务分配规则查询', 'bpm:task-assign-rule:query', 3, 20, 1193, '', '', '', NULL, 0, b'1', b'1', b'1', '1', '2022-01-23 00:26:53', '1', '2022-04-20 17:03:10', b'0');
INSERT INTO `system_menu` VALUES (1217, '流程任务分配规则创建', 'bpm:task-assign-rule:create', 3, 21, 1193, '', '', '', NULL, 0, b'1', b'1', b'1', '1', '2022-01-23 00:28:15', '1', '2022-04-20 17:03:10', b'0');
INSERT INTO `system_menu` VALUES (1218, '流程任务分配规则更新', 'bpm:task-assign-rule:update', 3, 22, 1193, '', '', '', NULL, 0, b'1', b'1', b'1', '1', '2022-01-23 00:28:41', '1', '2022-04-20 17:03:10', b'0');
INSERT INTO `system_menu` VALUES (1219, '流程实例的创建', 'bpm:process-instance:create', 3, 2, 1201, '', '', '', NULL, 0, b'1', b'1', b'1', '1', '2022-01-23 00:36:15', '1', '2022-04-20 17:03:10', b'0');
INSERT INTO `system_menu` VALUES (1220, '流程实例的取消', 'bpm:process-instance:cancel', 3, 3, 1201, '', '', '', NULL, 0, b'1', b'1', b'1', '1', '2022-01-23 00:36:33', '1', '2022-04-20 17:03:10', b'0');
INSERT INTO `system_menu` VALUES (1221, '流程任务的查询', 'bpm:task:query', 3, 1, 1207, '', '', '', NULL, 0, b'1', b'1', b'1', '1', '2022-01-23 00:38:52', '1', '2022-04-20 17:03:10', b'0');
INSERT INTO `system_menu` VALUES (1222, '流程任务的更新', 'bpm:task:update', 3, 2, 1207, '', '', '', NULL, 0, b'1', b'1', b'1', '1', '2022-01-23 00:39:24', '1', '2022-04-20 17:03:10', b'0');
INSERT INTO `system_menu` VALUES (1237, '文件配置', '', 2, 0, 1243, 'file-config', 'fa-solid:file-signature', 'infra/fileConfig/index', 'InfraFileConfig', 0, b'1', b'1', b'1', '', '2022-03-15 14:35:28', '1', '2024-02-29 08:52:54', b'0');
INSERT INTO `system_menu` VALUES (1238, '文件配置查询', 'infra:file-config:query', 3, 1, 1237, '', '', '', NULL, 0, b'1', b'1', b'1', '', '2022-03-15 14:35:28', '', '2022-04-20 17:03:10', b'0');
INSERT INTO `system_menu` VALUES (1239, '文件配置创建', 'infra:file-config:create', 3, 2, 1237, '', '', '', NULL, 0, b'1', b'1', b'1', '', '2022-03-15 14:35:28', '', '2022-04-20 17:03:10', b'0');
INSERT INTO `system_menu` VALUES (1240, '文件配置更新', 'infra:file-config:update', 3, 3, 1237, '', '', '', NULL, 0, b'1', b'1', b'1', '', '2022-03-15 14:35:28', '', '2022-04-20 17:03:10', b'0');
INSERT INTO `system_menu` VALUES (1241, '文件配置删除', 'infra:file-config:delete', 3, 4, 1237, '', '', '', NULL, 0, b'1', b'1', b'1', '', '2022-03-15 14:35:28', '', '2022-04-20 17:03:10', b'0');
INSERT INTO `system_menu` VALUES (1242, '文件配置导出', 'infra:file-config:export', 3, 5, 1237, '', '', '', NULL, 0, b'1', b'1', b'1', '', '2022-03-15 14:35:28', '', '2022-04-20 17:03:10', b'0');
INSERT INTO `system_menu` VALUES (1243, '文件管理', '', 2, 6, 2, 'file', 'ep:files', NULL, '', 0, b'1', b'1', b'1', '1', '2022-03-16 23:47:40', '1', '2024-04-23 00:02:11', b'0');
INSERT INTO `system_menu` VALUES (1261, 'OAuth 2.0', '', 2, 10, 1, 'oauth2', 'fa:dashcube', NULL, NULL, 0, b'1', b'1', b'1', '1', '2022-05-09 23:38:17', '1', '2024-02-29 01:12:08', b'0');
INSERT INTO `system_menu` VALUES (1263, '应用管理', '', 2, 0, 1261, 'oauth2/application', 'fa:hdd-o', 'system/oauth2/client/index', 'SystemOAuth2Client', 0, b'1', b'1', b'1', '', '2022-05-10 16:26:33', '1', '2024-02-29 01:13:14', b'0');
INSERT INTO `system_menu` VALUES (1264, '客户端查询', 'system:oauth2-client:query', 3, 1, 1263, '', '', '', NULL, 0, b'1', b'1', b'1', '', '2022-05-10 16:26:33', '1', '2022-05-11 00:31:06', b'0');
INSERT INTO `system_menu` VALUES (1265, '客户端创建', 'system:oauth2-client:create', 3, 2, 1263, '', '', '', NULL, 0, b'1', b'1', b'1', '', '2022-05-10 16:26:33', '1', '2022-05-11 00:31:23', b'0');
INSERT INTO `system_menu` VALUES (1266, '客户端更新', 'system:oauth2-client:update', 3, 3, 1263, '', '', '', NULL, 0, b'1', b'1', b'1', '', '2022-05-10 16:26:33', '1', '2022-05-11 00:31:28', b'0');
INSERT INTO `system_menu` VALUES (1267, '客户端删除', 'system:oauth2-client:delete', 3, 4, 1263, '', '', '', NULL, 0, b'1', b'1', b'1', '', '2022-05-10 16:26:33', '1', '2022-05-11 00:31:33', b'0');
INSERT INTO `system_menu` VALUES (2083, '地区管理', '', 2, 14, 1, 'area', 'fa:map-marker', 'system/area/index', 'SystemArea', 0, b'1', b'1', b'1', '1', '2022-12-23 17:35:05', '1', '2024-02-29 08:50:28', b'0');
INSERT INTO `system_menu` VALUES (2472, '主子表(内嵌)', '', 2, 12, 1070, 'demo03-inner', 'fa:power-off', 'infra/demo/demo03/inner/index', 'Demo03StudentInner', 0, b'1', b'1', b'1', '', '2023-11-13 04:39:51', '1', '2023-11-16 23:53:46', b'0');
INSERT INTO `system_menu` VALUES (2478, '单表(增删改查)', '', 2, 1, 1070, 'demo01-contact', 'ep:bicycle', 'infra/demo/demo01/index', 'Demo01Contact', 0, b'1', b'1', b'1', '', '2023-11-15 14:42:30', '1', '2023-11-16 20:34:40', b'0');
INSERT INTO `system_menu` VALUES (2479, '示例联系人查询', 'infra:demo01-contact:query', 3, 1, 2478, '', '', '', NULL, 0, b'1', b'1', b'1', '', '2023-11-15 14:42:30', '', '2023-11-15 14:42:30', b'0');
INSERT INTO `system_menu` VALUES (2480, '示例联系人创建', 'infra:demo01-contact:create', 3, 2, 2478, '', '', '', NULL, 0, b'1', b'1', b'1', '', '2023-11-15 14:42:30', '', '2023-11-15 14:42:30', b'0');
INSERT INTO `system_menu` VALUES (2481, '示例联系人更新', 'infra:demo01-contact:update', 3, 3, 2478, '', '', '', NULL, 0, b'1', b'1', b'1', '', '2023-11-15 14:42:30', '', '2023-11-15 14:42:30', b'0');
INSERT INTO `system_menu` VALUES (2482, '示例联系人删除', 'infra:demo01-contact:delete', 3, 4, 2478, '', '', '', NULL, 0, b'1', b'1', b'1', '', '2023-11-15 14:42:30', '', '2023-11-15 14:42:30', b'0');
INSERT INTO `system_menu` VALUES (2483, '示例联系人导出', 'infra:demo01-contact:export', 3, 5, 2478, '', '', '', NULL, 0, b'1', b'1', b'1', '', '2023-11-15 14:42:30', '', '2023-11-15 14:42:30', b'0');
INSERT INTO `system_menu` VALUES (2484, '树表(增删改查)', '', 2, 2, 1070, 'demo02-category', 'fa:tree', 'infra/demo/demo02/index', 'Demo02Category', 0, b'1', b'1', b'1', '', '2023-11-16 12:18:27', '1', '2023-11-16 20:35:01', b'0');
INSERT INTO `system_menu` VALUES (2485, '示例分类查询', 'infra:demo02-category:query', 3, 1, 2484, '', '', '', NULL, 0, b'1', b'1', b'1', '', '2023-11-16 12:18:27', '', '2023-11-16 12:18:27', b'0');
INSERT INTO `system_menu` VALUES (2486, '示例分类创建', 'infra:demo02-category:create', 3, 2, 2484, '', '', '', NULL, 0, b'1', b'1', b'1', '', '2023-11-16 12:18:27', '', '2023-11-16 12:18:27', b'0');
INSERT INTO `system_menu` VALUES (2487, '示例分类更新', 'infra:demo02-category:update', 3, 3, 2484, '', '', '', NULL, 0, b'1', b'1', b'1', '', '2023-11-16 12:18:27', '', '2023-11-16 12:18:27', b'0');
INSERT INTO `system_menu` VALUES (2488, '示例分类删除', 'infra:demo02-category:delete', 3, 4, 2484, '', '', '', NULL, 0, b'1', b'1', b'1', '', '2023-11-16 12:18:27', '', '2023-11-16 12:18:27', b'0');
INSERT INTO `system_menu` VALUES (2489, '示例分类导出', 'infra:demo02-category:export', 3, 5, 2484, '', '', '', NULL, 0, b'1', b'1', b'1', '', '2023-11-16 12:18:27', '', '2023-11-16 12:18:27', b'0');
INSERT INTO `system_menu` VALUES (2490, '主子表(标准)', '', 2, 10, 1070, 'demo03-normal', 'fa:battery-3', 'infra/demo/demo03/normal/index', 'Demo03StudentNormal', 0, b'1', b'1', b'1', '', '2023-11-16 12:53:37', '1', '2023-11-16 23:10:03', b'0');
INSERT INTO `system_menu` VALUES (2491, '学生查询', 'infra:demo03-student:query', 3, 1, 2490, '', '', '', NULL, 0, b'1', b'1', b'1', '', '2023-11-16 12:53:37', '', '2023-11-16 12:53:37', b'0');
INSERT INTO `system_menu` VALUES (2492, '学生创建', 'infra:demo03-student:create', 3, 2, 2490, '', '', '', NULL, 0, b'1', b'1', b'1', '', '2023-11-16 12:53:37', '', '2023-11-16 12:53:37', b'0');
INSERT INTO `system_menu` VALUES (2493, '学生更新', 'infra:demo03-student:update', 3, 3, 2490, '', '', '', NULL, 0, b'1', b'1', b'1', '', '2023-11-16 12:53:37', '', '2023-11-16 12:53:37', b'0');
INSERT INTO `system_menu` VALUES (2494, '学生删除', 'infra:demo03-student:delete', 3, 4, 2490, '', '', '', NULL, 0, b'1', b'1', b'1', '', '2023-11-16 12:53:37', '', '2023-11-16 12:53:37', b'0');
INSERT INTO `system_menu` VALUES (2495, '学生导出', 'infra:demo03-student:export', 3, 5, 2490, '', '', '', NULL, 0, b'1', b'1', b'1', '', '2023-11-16 12:53:37', '', '2023-11-16 12:53:37', b'0');
INSERT INTO `system_menu` VALUES (2497, '主子表ERP', '', 2, 11, 1070, 'demo03-erp', 'ep:calendar', 'infra/demo/demo03/erp/index', 'Demo03StudentERP', 0, b'1', b'1', b'1', '', '2023-11-16 15:50:59', '1', '2023-11-17 13:19:56', b'0');
INSERT INTO `system_menu` VALUES (2525, 'WebSocket', '', 2, 5, 2, 'websocket', 'ep:connection', 'infra/webSocket/index', 'InfraWebSocket', 0, b'1', b'1', b'1', '1', '2023-11-23 19:41:55', '1', '2024-04-23 00:02:00', b'0');
INSERT INTO `system_menu` VALUES (2713, '抄送我的', 'bpm:process-instance-cc:query', 2, 30, 1200, 'copy', 'ep:copy-document', 'bpm/task/copy/index', 'BpmProcessInstanceCopy', 0, b'1', b'1', b'1', '1', '2024-03-17 21:50:23', '1', '2024-04-24 19:55:12', b'0');
INSERT INTO `system_menu` VALUES (2714, '流程分类', '', 2, 3, 1186, 'category', 'fa:object-ungroup', 'bpm/category/index', 'BpmCategory', 0, b'1', b'1', b'1', '', '2024-03-08 02:00:51', '1', '2024-03-21 23:51:18', b'0');
INSERT INTO `system_menu` VALUES (2715, '分类查询', 'bpm:category:query', 3, 1, 2714, '', '', '', '', 0, b'1', b'1', b'1', '', '2024-03-08 02:00:51', '1', '2024-03-19 14:36:25', b'0');
INSERT INTO `system_menu` VALUES (2716, '分类创建', 'bpm:category:create', 3, 2, 2714, '', '', '', '', 0, b'1', b'1', b'1', '', '2024-03-08 02:00:51', '1', '2024-03-19 14:36:31', b'0');
INSERT INTO `system_menu` VALUES (2717, '分类更新', 'bpm:category:update', 3, 3, 2714, '', '', '', '', 0, b'1', b'1', b'1', '', '2024-03-08 02:00:51', '1', '2024-03-19 14:36:35', b'0');
INSERT INTO `system_menu` VALUES (2718, '分类删除', 'bpm:category:delete', 3, 4, 2714, '', '', '', '', 0, b'1', b'1', b'1', '', '2024-03-08 02:00:51', '1', '2024-03-19 14:36:41', b'0');
INSERT INTO `system_menu` VALUES (2720, '发起流程', '', 2, 0, 1200, 'create', 'fa-solid:grin-stars', 'bpm/processInstance/create/index', 'BpmProcessInstanceCreate', 0, b'1', b'0', b'1', '1', '2024-03-19 19:46:05', '1', '2024-03-23 19:03:42', b'0');
INSERT INTO `system_menu` VALUES (2721, '流程实例', '', 2, 10, 1186, 'process-instance/manager', 'fa:square', 'bpm/processInstance/manager/index', 'BpmProcessInstanceManager', 0, b'1', b'1', b'1', '1', '2024-03-21 23:57:30', '1', '2024-03-21 23:57:30', b'0');
INSERT INTO `system_menu` VALUES (2722, '流程实例的查询(管理员)', 'bpm:process-instance:manager-query', 3, 1, 2721, '', '', '', '', 0, b'1', b'1', b'1', '1', '2024-03-22 08:18:27', '1', '2024-03-22 08:19:05', b'0');
INSERT INTO `system_menu` VALUES (2723, '流程实例的取消(管理员)', 'bpm:process-instance:cancel-by-admin', 3, 2, 2721, '', '', '', '', 0, b'1', b'1', b'1', '1', '2024-03-22 08:19:25', '1', '2024-03-22 08:19:25', b'0');
INSERT INTO `system_menu` VALUES (2724, '流程任务', '', 2, 11, 1186, 'process-tasnk', 'ep:collection-tag', 'bpm/task/manager/index', 'BpmManagerTask', 0, b'1', b'1', b'1', '1', '2024-03-22 08:43:22', '1', '2024-03-22 08:43:27', b'0');
INSERT INTO `system_menu` VALUES (2725, '流程任务的查询(管理员)', 'bpm:task:mananger-query', 3, 1, 2724, '', '', '', '', 0, b'1', b'1', b'1', '1', '2024-03-22 08:43:49', '1', '2024-03-22 08:43:49', b'0');
INSERT INTO `system_menu` VALUES (2726, '流程监听器', '', 2, 5, 1186, 'process-listener', 'fa:assistive-listening-systems', 'bpm/processListener/index', 'BpmProcessListener', 0, b'1', b'1', b'1', '', '2024-03-09 16:05:34', '1', '2024-03-23 13:13:38', b'0');
INSERT INTO `system_menu` VALUES (2727, '流程监听器查询', 'bpm:process-listener:query', 3, 1, 2726, '', '', '', NULL, 0, b'1', b'1', b'1', '', '2024-03-09 16:05:34', '', '2024-03-09 16:05:34', b'0');
INSERT INTO `system_menu` VALUES (2728, '流程监听器创建', 'bpm:process-listener:create', 3, 2, 2726, '', '', '', NULL, 0, b'1', b'1', b'1', '', '2024-03-09 16:05:34', '', '2024-03-09 16:05:34', b'0');
INSERT INTO `system_menu` VALUES (2729, '流程监听器更新', 'bpm:process-listener:update', 3, 3, 2726, '', '', '', NULL, 0, b'1', b'1', b'1', '', '2024-03-09 16:05:34', '', '2024-03-09 16:05:34', b'0');
INSERT INTO `system_menu` VALUES (2730, '流程监听器删除', 'bpm:process-listener:delete', 3, 4, 2726, '', '', '', NULL, 0, b'1', b'1', b'1', '', '2024-03-09 16:05:34', '', '2024-03-09 16:05:34', b'0');
INSERT INTO `system_menu` VALUES (2731, '流程表达式', '', 2, 6, 1186, 'process-expression', 'fa:wpexplorer', 'bpm/processExpression/index', 'BpmProcessExpression', 0, b'1', b'1', b'1', '', '2024-03-09 22:35:08', '1', '2024-03-23 19:43:05', b'0');
INSERT INTO `system_menu` VALUES (2732, '流程表达式查询', 'bpm:process-expression:query', 3, 1, 2731, '', '', '', NULL, 0, b'1', b'1', b'1', '', '2024-03-09 22:35:08', '', '2024-03-09 22:35:08', b'0');
INSERT INTO `system_menu` VALUES (2733, '流程表达式创建', 'bpm:process-expression:create', 3, 2, 2731, '', '', '', NULL, 0, b'1', b'1', b'1', '', '2024-03-09 22:35:08', '', '2024-03-09 22:35:08', b'0');
INSERT INTO `system_menu` VALUES (2734, '流程表达式更新', 'bpm:process-expression:update', 3, 3, 2731, '', '', '', NULL, 0, b'1', b'1', b'1', '', '2024-03-09 22:35:08', '', '2024-03-09 22:35:08', b'0');
INSERT INTO `system_menu` VALUES (2735, '流程表达式删除', 'bpm:process-expression:delete', 3, 4, 2731, '', '', '', NULL, 0, b'1', b'1', b'1', '', '2024-03-09 22:35:08', '', '2024-03-09 22:35:08', b'0');
INSERT INTO `system_menu` VALUES (2740, '监控中心', '', 1, 10, 2, 'monitors', 'ep:monitor', '', '', 0, b'1', b'1', b'1', '1', '2024-04-23 00:04:44', '1', '2024-04-23 00:04:44', b'0');
INSERT INTO `system_menu` VALUES (2913, '流程清理', 'bpm:model:clean', 3, 7, 1193, '', '', '', '', 0, b'1', b'1', b'1', '1', '2025-01-17 19:32:06', '1', '2025-01-17 19:32:06', b'0');
INSERT INTO `system_menu` VALUES (900000, '系统管理', '', 1, 10, 0, '/system', 'ep:tools', NULL, NULL, 0, b'1', b'0', b'1', 'admin', '2026-03-18 13:42:02', 'admin', '2026-03-18 13:42:02', b'0');
INSERT INTO `system_menu` VALUES (900001, '用户管理', 'system:user:list', 2, 1, 900000, 'user', 'ep:avatar', 'system/user/index', 'SystemUser', 0, b'1', b'0', b'0', 'admin', '2026-03-18 13:42:02', 'admin', '2026-03-18 13:42:02', b'0');
INSERT INTO `system_menu` VALUES (900002, '角色管理', '', 2, 2, 900000, 'role', 'ep:user', 'system/role/index', 'SystemRole', 0, b'1', b'0', b'0', 'admin', '2026-03-18 13:42:02', 'admin', '2026-03-18 13:42:02', b'0');
INSERT INTO `system_menu` VALUES (900003, '菜单管理', '', 2, 3, 900000, 'menu', 'ep:menu', 'system/menu/index', 'SystemMenu', 0, b'1', b'1', b'0', 'admin', '2026-03-18 13:42:02', 'admin', '2026-03-18 13:42:02', b'0');
INSERT INTO `system_menu` VALUES (900004, '模板参考', '', 1, 900, 0, '/template-reference', 'mdi:file-document-multiple-outline', NULL, NULL, 0, b'1', b'0', b'1', 'admin', '2026-03-18 13:42:02', 'admin', '2026-03-18 13:42:02', b'0');
INSERT INTO `system_menu` VALUES (900005, '异常页', '', 1, 7, 900004, '/exception', 'mdi:file-document-multiple-outline', NULL, NULL, 0, b'1', b'0', b'1', 'admin', '2026-03-18 13:42:02', 'admin', '2026-03-18 13:42:02', b'0');
INSERT INTO `system_menu` VALUES (900006, '403', '', 2, 0, 900005, '/exception/403', 'mdi:file-document-multiple-outline', 'exception/403/index', 'Exception403', 0, b'1', b'0', b'0', 'admin', '2026-03-18 13:42:02', 'admin', '2026-03-18 13:42:02', b'0');
INSERT INTO `system_menu` VALUES (900007, '404', '', 2, 0, 900005, '/exception/404', 'mdi:file-document-multiple-outline', 'exception/404/index', 'Exception404', 0, b'1', b'0', b'0', 'admin', '2026-03-18 13:42:02', 'admin', '2026-03-18 13:42:02', b'0');
INSERT INTO `system_menu` VALUES (900008, '500', '', 2, 0, 900005, '/exception/500', 'mdi:file-document-multiple-outline', 'exception/500/index', 'Exception500', 0, b'1', b'0', b'0', 'admin', '2026-03-18 13:42:02', 'admin', '2026-03-18 13:42:02', b'0');
INSERT INTO `system_menu` VALUES (900009, '文档', '', 1, 2, 900004, '/document', 'mdi:file-document-multiple-outline', NULL, NULL, 0, b'1', b'0', b'1', 'admin', '2026-03-18 13:42:02', 'admin', '2026-03-18 13:42:02', b'0');
INSERT INTO `system_menu` VALUES (900010, 'Ant Design Vue文档', '', 2, 7, 900009, '/document/antd', 'mdi:file-document-multiple-outline', 'document/antd/index', 'DocumentAntd', 0, b'1', b'0', b'0', 'admin', '2026-03-18 13:42:02', 'admin', '2026-03-18 13:42:02', b'0');
INSERT INTO `system_menu` VALUES (900011, 'Naive UI文档', '', 2, 6, 900009, '/document/naive', 'mdi:file-document-multiple-outline', 'document/naive/index', 'DocumentNaive', 0, b'1', b'0', b'0', 'admin', '2026-03-18 13:42:02', 'admin', '2026-03-18 13:42:02', b'0');
INSERT INTO `system_menu` VALUES (900012, 'Element Plus文档', '', 2, 7, 900009, '/document/element-plus', 'mdi:file-document-multiple-outline', 'document/element-plus/index', 'DocumentElementPlus', 0, b'1', b'0', b'0', 'admin', '2026-03-18 13:42:02', 'admin', '2026-03-18 13:42:02', b'0');
INSERT INTO `system_menu` VALUES (900013, 'Alova文档', '', 2, 8, 900009, '/document/alova', 'mdi:file-document-multiple-outline', 'document/alova/index', 'DocumentAlova', 0, b'1', b'0', b'0', 'admin', '2026-03-18 13:42:02', 'admin', '2026-03-18 13:42:02', b'0');
INSERT INTO `system_menu` VALUES (900014, 'UnoCSS文档', '', 2, 5, 900009, '/document/unocss', 'mdi:file-document-multiple-outline', 'document/unocss/index', 'DocumentUnocss', 0, b'1', b'0', b'0', 'admin', '2026-03-18 13:42:02', 'admin', '2026-03-18 13:42:02', b'0');
INSERT INTO `system_menu` VALUES (900015, 'Vite文档', '', 2, 4, 900009, '/document/vite', 'mdi:file-document-multiple-outline', 'document/vite/index', 'DocumentVite', 0, b'1', b'0', b'0', 'admin', '2026-03-18 13:42:02', 'admin', '2026-03-18 13:42:02', b'0');
INSERT INTO `system_menu` VALUES (900016, 'Vue文档', '', 2, 3, 900009, '/document/vue', 'mdi:file-document-multiple-outline', 'document/vue/index', 'DocumentVue', 0, b'1', b'0', b'0', 'admin', '2026-03-18 13:42:02', 'admin', '2026-03-18 13:42:02', b'0');
INSERT INTO `system_menu` VALUES (900017, '关于', '', 2, 10, 900004, '/about', 'mdi:file-document-multiple-outline', 'about/index', 'About', 0, b'1', b'0', b'0', 'admin', '2026-03-18 13:42:02', 'admin', '2026-03-18 13:42:02', b'0');
INSERT INTO `system_menu` VALUES (900018, 'alova示例', '', 1, 7, 900004, '/alova', 'mdi:file-document-multiple-outline', NULL, NULL, 0, b'1', b'0', b'1', 'admin', '2026-03-18 13:42:02', 'admin', '2026-03-18 13:42:02', b'0');
INSERT INTO `system_menu` VALUES (900019, 'alova请求', '', 2, 1, 900018, '/alova/request', 'mdi:file-document-multiple-outline', 'alova/request/index', 'AlovaRequest', 0, b'1', b'0', b'0', 'admin', '2026-03-18 13:42:02', 'admin', '2026-03-18 13:42:02', b'0');
INSERT INTO `system_menu` VALUES (900020, '场景化请求', '', 2, 3, 900018, '/alova/scenes', 'mdi:file-document-multiple-outline', 'alova/scenes/index', 'AlovaScenes', 0, b'1', b'0', b'0', 'admin', '2026-03-18 13:42:02', 'admin', '2026-03-18 13:42:02', b'0');
INSERT INTO `system_menu` VALUES (900021, '用户列表', '', 2, 2, 900018, '/alova/user', 'mdi:file-document-multiple-outline', 'alova/user/index', 'AlovaUser', 0, b'1', b'0', b'0', 'admin', '2026-03-18 13:42:02', 'admin', '2026-03-18 13:42:02', b'0');
INSERT INTO `system_menu` VALUES (900022, '系统功能', '', 1, 6, 900004, '/function', 'mdi:file-document-multiple-outline', NULL, NULL, 0, b'1', b'0', b'1', 'admin', '2026-03-18 13:42:02', 'admin', '2026-03-18 13:42:02', b'0');
INSERT INTO `system_menu` VALUES (900023, '请求', '', 2, 3, 900022, '/function/request', 'mdi:file-document-multiple-outline', 'function/request/index', 'FunctionRequest', 0, b'1', b'0', b'0', 'admin', '2026-03-18 13:42:02', 'admin', '2026-03-18 13:42:02', b'0');
INSERT INTO `system_menu` VALUES (900024, '超级管理员可见', '', 2, 5, 900022, '/function/super-page', 'mdi:file-document-multiple-outline', 'function/super-page/index', 'FunctionSuperPage', 0, b'1', b'0', b'0', 'admin', '2026-03-18 13:42:02', 'admin', '2026-03-18 13:42:02', b'0');
INSERT INTO `system_menu` VALUES (900025, '标签页', '', 2, 1, 900022, '/function/tab', 'mdi:file-document-multiple-outline', 'function/tab/index', 'FunctionTab', 0, b'1', b'0', b'0', 'admin', '2026-03-18 13:42:02', 'admin', '2026-03-18 13:42:02', b'0');
INSERT INTO `system_menu` VALUES (900026, '切换权限', '', 2, 4, 900022, '/function/toggle-auth', 'mdi:file-document-multiple-outline', 'function/toggle-auth/index', 'FunctionToggleAuth', 0, b'1', b'0', b'0', 'admin', '2026-03-18 13:42:02', 'admin', '2026-03-18 13:42:02', b'0');
INSERT INTO `system_menu` VALUES (900027, '首页', '', 2, 1, 900004, '/home', 'mdi:file-document-multiple-outline', 'home/index', 'Home', 0, b'1', b'0', b'0', 'admin', '2026-03-18 13:42:02', 'admin', '2026-03-18 13:42:02', b'0');
INSERT INTO `system_menu` VALUES (900028, '多级菜单', '', 1, 8, 900004, '/multi-menu', 'mdi:file-document-multiple-outline', NULL, NULL, 0, b'1', b'0', b'1', 'admin', '2026-03-18 13:42:02', 'admin', '2026-03-18 13:42:02', b'0');
INSERT INTO `system_menu` VALUES (900029, '菜单一', '', 1, 1, 900028, '/multi-menu/first', 'mdi:file-document-multiple-outline', NULL, NULL, 0, b'1', b'0', b'1', 'admin', '2026-03-18 13:42:02', 'admin', '2026-03-18 13:42:02', b'0');
INSERT INTO `system_menu` VALUES (900030, '菜单一子菜单', '', 2, 0, 900029, '/multi-menu/first/child', 'mdi:file-document-multiple-outline', 'multi-menu/first/child/index', 'MultiMenuFirstChild', 0, b'1', b'0', b'0', 'admin', '2026-03-18 13:42:02', 'admin', '2026-03-18 13:42:02', b'0');
INSERT INTO `system_menu` VALUES (900031, '菜单二', '', 1, 2, 900028, '/multi-menu/second', 'mdi:file-document-multiple-outline', NULL, NULL, 0, b'1', b'0', b'1', 'admin', '2026-03-18 13:42:02', 'admin', '2026-03-18 13:42:02', b'0');
INSERT INTO `system_menu` VALUES (900032, '菜单二子菜单', '', 1, 0, 900031, '/multi-menu/second/child', 'mdi:file-document-multiple-outline', NULL, NULL, 0, b'1', b'0', b'1', 'admin', '2026-03-18 13:42:02', 'admin', '2026-03-18 13:42:02', b'0');
INSERT INTO `system_menu` VALUES (900033, '菜单二子菜单首页', '', 2, 0, 900032, '/multi-menu/second/child/home', 'mdi:file-document-multiple-outline', 'multi-menu/second/child/home/index', 'MultiMenuSecondChildHome', 0, b'1', b'0', b'0', 'admin', '2026-03-18 13:42:02', 'admin', '2026-03-18 13:42:02', b'0');
INSERT INTO `system_menu` VALUES (900034, '插件示例', '', 1, 7, 900004, '/plugin', 'mdi:file-document-multiple-outline', NULL, NULL, 0, b'1', b'0', b'1', 'admin', '2026-03-18 13:42:03', 'admin', '2026-03-18 13:42:03', b'0');
INSERT INTO `system_menu` VALUES (900035, '条形码', '', 2, 0, 900034, '/plugin/barcode', 'mdi:file-document-multiple-outline', 'plugin/barcode/index', 'PluginBarcode', 0, b'1', b'0', b'0', 'admin', '2026-03-18 13:42:03', 'admin', '2026-03-18 13:42:03', b'0');
INSERT INTO `system_menu` VALUES (900036, '图表', '', 1, 0, 900034, '/plugin/charts', 'mdi:file-document-multiple-outline', NULL, NULL, 0, b'1', b'0', b'1', 'admin', '2026-03-18 13:42:03', 'admin', '2026-03-18 13:42:03', b'0');
INSERT INTO `system_menu` VALUES (900037, 'AntV', '', 2, 0, 900036, '/plugin/charts/antv', 'mdi:file-document-multiple-outline', 'plugin/charts/antv/index', 'PluginChartsAntv', 0, b'1', b'0', b'0', 'admin', '2026-03-18 13:42:03', 'admin', '2026-03-18 13:42:03', b'0');
INSERT INTO `system_menu` VALUES (900038, 'ECharts', '', 2, 0, 900036, '/plugin/charts/echarts', 'mdi:file-document-multiple-outline', 'plugin/charts/echarts/index', 'PluginChartsEcharts', 0, b'1', b'0', b'0', 'admin', '2026-03-18 13:42:03', 'admin', '2026-03-18 13:42:03', b'0');
INSERT INTO `system_menu` VALUES (900039, 'VChart', '', 2, 0, 900036, '/plugin/charts/vchart', 'mdi:file-document-multiple-outline', 'plugin/charts/vchart/index', 'PluginChartsVchart', 0, b'1', b'0', b'0', 'admin', '2026-03-18 13:42:03', 'admin', '2026-03-18 13:42:03', b'0');
INSERT INTO `system_menu` VALUES (900040, '剪贴板', '', 2, 0, 900034, '/plugin/copy', 'mdi:file-document-multiple-outline', 'plugin/copy/index', 'PluginCopy', 0, b'1', b'0', b'0', 'admin', '2026-03-18 13:42:03', 'admin', '2026-03-18 13:42:03', b'0');
INSERT INTO `system_menu` VALUES (900041, '编辑器', '', 1, 0, 900034, '/plugin/editor', 'mdi:file-document-multiple-outline', NULL, NULL, 0, b'1', b'0', b'1', 'admin', '2026-03-18 13:42:03', 'admin', '2026-03-18 13:42:03', b'0');
INSERT INTO `system_menu` VALUES (900042, 'MD 编辑器', '', 2, 0, 900041, '/plugin/editor/markdown', 'mdi:file-document-multiple-outline', 'plugin/editor/markdown/index', 'PluginEditorMarkdown', 0, b'1', b'0', b'0', 'admin', '2026-03-18 13:42:03', 'admin', '2026-03-18 13:42:03', b'0');
INSERT INTO `system_menu` VALUES (900043, '富文本编辑器', '', 2, 0, 900041, '/plugin/editor/quill', 'mdi:file-document-multiple-outline', 'plugin/editor/quill/index', 'PluginEditorQuill', 0, b'1', b'0', b'0', 'admin', '2026-03-18 13:42:03', 'admin', '2026-03-18 13:42:03', b'0');
INSERT INTO `system_menu` VALUES (900044, 'Excel', '', 2, 0, 900034, '/plugin/excel', 'mdi:file-document-multiple-outline', 'plugin/excel/index', 'PluginExcel', 0, b'1', b'1', b'0', 'admin', '2026-03-18 13:42:03', 'admin', '2026-03-18 13:42:03', b'0');
INSERT INTO `system_menu` VALUES (900045, '甘特图', '', 1, 0, 900034, '/plugin/gantt', 'mdi:file-document-multiple-outline', NULL, NULL, 0, b'1', b'0', b'1', 'admin', '2026-03-18 13:42:03', 'admin', '2026-03-18 13:42:03', b'0');
INSERT INTO `system_menu` VALUES (900046, 'dhtmlxGantt', '', 2, 0, 900045, '/plugin/gantt/dhtmlx', 'mdi:file-document-multiple-outline', 'plugin/gantt/dhtmlx/index', 'PluginGanttDhtmlx', 0, b'1', b'0', b'0', 'admin', '2026-03-18 13:42:03', 'admin', '2026-03-18 13:42:03', b'0');
INSERT INTO `system_menu` VALUES (900047, 'VTableGantt', '', 2, 0, 900045, '/plugin/gantt/vtable', 'mdi:file-document-multiple-outline', 'plugin/gantt/vtable/index', 'PluginGanttVtable', 0, b'1', b'0', b'0', 'admin', '2026-03-18 13:42:03', 'admin', '2026-03-18 13:42:03', b'0');
INSERT INTO `system_menu` VALUES (900048, '图标', '', 2, 0, 900034, '/plugin/icon', 'mdi:file-document-multiple-outline', 'plugin/icon/index', 'PluginIcon', 0, b'1', b'0', b'0', 'admin', '2026-03-18 13:42:03', 'admin', '2026-03-18 13:42:03', b'0');
INSERT INTO `system_menu` VALUES (900049, '地图', '', 2, 0, 900034, '/plugin/map', 'mdi:file-document-multiple-outline', 'plugin/map/index', 'PluginMap', 0, b'1', b'0', b'0', 'admin', '2026-03-18 13:42:03', 'admin', '2026-03-18 13:42:03', b'0');
INSERT INTO `system_menu` VALUES (900050, 'PDF 预览', '', 2, 0, 900034, '/plugin/pdf', 'mdi:file-document-multiple-outline', 'plugin/pdf/index', 'PluginPdf', 0, b'1', b'0', b'0', 'admin', '2026-03-18 13:42:03', 'admin', '2026-03-18 13:42:03', b'0');
INSERT INTO `system_menu` VALUES (900051, '拼音', '', 2, 0, 900034, '/plugin/pinyin', 'mdi:file-document-multiple-outline', 'plugin/pinyin/index', 'PluginPinyin', 0, b'1', b'0', b'0', 'admin', '2026-03-18 13:42:03', 'admin', '2026-03-18 13:42:03', b'0');
INSERT INTO `system_menu` VALUES (900052, '打印', '', 2, 0, 900034, '/plugin/print', 'mdi:file-document-multiple-outline', 'plugin/print/index', 'PluginPrint', 0, b'1', b'0', b'0', 'admin', '2026-03-18 13:42:03', 'admin', '2026-03-18 13:42:03', b'0');
INSERT INTO `system_menu` VALUES (900053, 'Swiper', '', 2, 0, 900034, '/plugin/swiper', 'mdi:file-document-multiple-outline', 'plugin/swiper/index', 'PluginSwiper', 0, b'1', b'0', b'0', 'admin', '2026-03-18 13:42:03', 'admin', '2026-03-18 13:42:03', b'0');
INSERT INTO `system_menu` VALUES (900054, '表格', '', 1, 0, 900034, '/plugin/tables', 'mdi:file-document-multiple-outline', NULL, NULL, 0, b'1', b'0', b'1', 'admin', '2026-03-18 13:42:03', 'admin', '2026-03-18 13:42:03', b'0');
INSERT INTO `system_menu` VALUES (900055, 'VTable', '', 2, 0, 900054, '/plugin/tables/vtable', 'mdi:file-document-multiple-outline', 'plugin/tables/vtable/index', 'PluginTablesVtable', 0, b'1', b'0', b'0', 'admin', '2026-03-18 13:42:03', 'admin', '2026-03-18 13:42:03', b'0');
INSERT INTO `system_menu` VALUES (900056, '打字机', '', 2, 0, 900034, '/plugin/typeit', 'mdi:file-document-multiple-outline', 'plugin/typeit/index', 'PluginTypeit', 0, b'1', b'0', b'0', 'admin', '2026-03-18 13:42:03', 'admin', '2026-03-18 13:42:03', b'0');
INSERT INTO `system_menu` VALUES (900057, '视频', '', 2, 0, 900034, '/plugin/video', 'mdi:file-document-multiple-outline', 'plugin/video/index', 'PluginVideo', 0, b'1', b'0', b'0', 'admin', '2026-03-18 13:42:03', 'admin', '2026-03-18 13:42:03', b'0');
-- ----------------------------
-- Table structure for system_post
-- ----------------------------
DROP TABLE IF EXISTS `system_post`;
CREATE TABLE `system_post` (
`id` bigint NOT NULL COMMENT '岗位ID',
`code` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '岗位编码',
`post_type` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL COMMENT '岗位类型management/technical/business',
`level_rank` int NULL DEFAULT NULL COMMENT '岗位等级排序,越大级别越高',
`name` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '岗位名称',
`sort` int NOT NULL COMMENT '显示顺序',
`status` tinyint NOT NULL COMMENT '状态0正常 1停用',
`remark` varchar(500) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL COMMENT '备注',
`creator` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT '' COMMENT '创建者',
`create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
`updater` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT '' COMMENT '更新者',
`update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
`deleted` bit(1) NOT NULL DEFAULT b'0' COMMENT '是否删除',
PRIMARY KEY (`id`) USING BTREE,
INDEX `idx_system_post_type`(`post_type` ASC) USING BTREE,
INDEX `idx_system_post_level_rank`(`level_rank` ASC) USING BTREE
) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci COMMENT = '岗位信息表' ROW_FORMAT = Dynamic;
-- ----------------------------
-- Records of system_post
-- ----------------------------
INSERT INTO `system_post` VALUES (2, 'se', NULL, NULL, '项目经理', 2, 0, '', 'admin', '2021-01-05 17:03:48', '1', '2023-11-15 09:18:20', b'0');
-- ----------------------------
-- Table structure for system_role
-- ----------------------------
DROP TABLE IF EXISTS `system_role`;
CREATE TABLE `system_role` (
`id` bigint NOT NULL COMMENT '角色ID',
`name` varchar(30) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '角色名称',
`code` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '角色权限字符串',
`sort` int NOT NULL COMMENT '显示顺序',
`data_scope` tinyint NOT NULL DEFAULT 1 COMMENT '数据范围1全部数据权限 2自定数据权限 3本部门数据权限 4本部门及以下数据权限',
`data_scope_dept_ids` varchar(500) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '' COMMENT '数据范围(指定部门数组)',
`status` tinyint NOT NULL COMMENT '角色状态0正常 1停用',
`type` tinyint NOT NULL COMMENT '角色类型',
`remark` varchar(500) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL COMMENT '备注',
`creator` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT '' COMMENT '创建者',
`create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
`updater` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT '' COMMENT '更新者',
`update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
`deleted` bit(1) NOT NULL DEFAULT b'0' COMMENT '是否删除',
PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci COMMENT = '角色信息表' ROW_FORMAT = Dynamic;
-- ----------------------------
-- Records of system_role
-- ----------------------------
INSERT INTO `system_role` VALUES (1, '超级管理员', 'super_admin', 1, 1, '', 0, 1, '超级管理员', 'admin', '2021-01-05 17:03:48', '', '2022-02-22 05:08:21', b'0');
INSERT INTO `system_role` VALUES (2, '普通角色', 'common', 2, 2, '', 0, 1, '普通角色', 'admin', '2021-01-05 17:03:48', '', '2022-02-22 05:08:20', b'0');
-- ----------------------------
-- Table structure for system_role_menu
-- ----------------------------
DROP TABLE IF EXISTS `system_role_menu`;
CREATE TABLE `system_role_menu` (
`id` bigint NOT NULL COMMENT '自增编号',
`role_id` bigint NOT NULL COMMENT '角色ID',
`menu_id` bigint NOT NULL COMMENT '菜单ID',
`creator` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT '' COMMENT '创建者',
`create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
`updater` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT '' COMMENT '更新者',
`update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
`deleted` bit(1) NOT NULL DEFAULT b'0' COMMENT '是否删除',
PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci COMMENT = '角色和菜单关联表' ROW_FORMAT = Dynamic;
-- ----------------------------
-- Records of system_role_menu
-- ----------------------------
INSERT INTO `system_role_menu` VALUES (434, 2, 1, '1', '2022-02-22 13:09:12', '1', '2022-02-22 13:09:12', b'0');
INSERT INTO `system_role_menu` VALUES (477, 2, 100, '1', '2022-02-22 13:09:12', '1', '2022-02-22 13:09:12', b'0');
INSERT INTO `system_role_menu` VALUES (478, 2, 101, '1', '2022-02-22 13:09:12', '1', '2022-02-22 13:09:12', b'0');
INSERT INTO `system_role_menu` VALUES (479, 2, 102, '1', '2022-02-22 13:09:12', '1', '2022-02-22 13:09:12', b'0');
INSERT INTO `system_role_menu` VALUES (481, 2, 103, '1', '2022-02-22 13:09:12', '1', '2022-02-22 13:09:12', b'0');
INSERT INTO `system_role_menu` VALUES (483, 2, 104, '1', '2022-02-22 13:09:12', '1', '2022-02-22 13:09:12', b'0');
INSERT INTO `system_role_menu` VALUES (485, 2, 105, '1', '2022-02-22 13:09:12', '1', '2022-02-22 13:09:12', b'0');
INSERT INTO `system_role_menu` VALUES (490, 2, 108, '1', '2022-02-22 13:09:12', '1', '2022-02-22 13:09:12', b'0');
INSERT INTO `system_role_menu` VALUES (492, 2, 109, '1', '2022-02-22 13:09:12', '1', '2022-02-22 13:09:12', b'0');
INSERT INTO `system_role_menu` VALUES (541, 2, 500, '1', '2022-02-22 13:09:12', '1', '2022-02-22 13:09:12', b'0');
INSERT INTO `system_role_menu` VALUES (543, 2, 501, '1', '2022-02-22 13:09:12', '1', '2022-02-22 13:09:12', b'0');
INSERT INTO `system_role_menu` VALUES (675, 2, 2, '1', '2022-02-22 13:16:57', '1', '2022-02-22 13:16:57', b'0');
INSERT INTO `system_role_menu` VALUES (689, 2, 1077, '1', '2022-02-22 13:16:57', '1', '2022-02-22 13:16:57', b'0');
INSERT INTO `system_role_menu` VALUES (690, 2, 1078, '1', '2022-02-22 13:16:57', '1', '2022-02-22 13:16:57', b'0');
INSERT INTO `system_role_menu` VALUES (692, 2, 1083, '1', '2022-02-22 13:16:57', '1', '2022-02-22 13:16:57', b'0');
INSERT INTO `system_role_menu` VALUES (693, 2, 1084, '1', '2022-02-22 13:16:57', '1', '2022-02-22 13:16:57', b'0');
INSERT INTO `system_role_menu` VALUES (699, 2, 1090, '1', '2022-02-22 13:16:57', '1', '2022-02-22 13:16:57', b'0');
INSERT INTO `system_role_menu` VALUES (703, 2, 106, '1', '2022-02-22 13:16:57', '1', '2022-02-22 13:16:57', b'0');
INSERT INTO `system_role_menu` VALUES (705, 2, 111, '1', '2022-02-22 13:16:57', '1', '2022-02-22 13:16:57', b'0');
INSERT INTO `system_role_menu` VALUES (706, 2, 112, '1', '2022-02-22 13:16:57', '1', '2022-02-22 13:16:57', b'0');
INSERT INTO `system_role_menu` VALUES (707, 2, 113, '1', '2022-02-22 13:16:57', '1', '2022-02-22 13:16:57', b'0');
INSERT INTO `system_role_menu` VALUES (1991, 2, 1024, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', b'0');
INSERT INTO `system_role_menu` VALUES (1992, 2, 1025, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', b'0');
INSERT INTO `system_role_menu` VALUES (1993, 2, 1026, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', b'0');
INSERT INTO `system_role_menu` VALUES (1994, 2, 1027, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', b'0');
INSERT INTO `system_role_menu` VALUES (1995, 2, 1028, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', b'0');
INSERT INTO `system_role_menu` VALUES (1996, 2, 1029, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', b'0');
INSERT INTO `system_role_menu` VALUES (1997, 2, 1030, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', b'0');
INSERT INTO `system_role_menu` VALUES (1998, 2, 1031, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', b'0');
INSERT INTO `system_role_menu` VALUES (1999, 2, 1032, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', b'0');
INSERT INTO `system_role_menu` VALUES (2000, 2, 1033, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', b'0');
INSERT INTO `system_role_menu` VALUES (2001, 2, 1034, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', b'0');
INSERT INTO `system_role_menu` VALUES (2002, 2, 1035, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', b'0');
INSERT INTO `system_role_menu` VALUES (2007, 2, 1040, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', b'0');
INSERT INTO `system_role_menu` VALUES (2008, 2, 1042, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', b'0');
INSERT INTO `system_role_menu` VALUES (2009, 2, 1043, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', b'0');
INSERT INTO `system_role_menu` VALUES (2010, 2, 1045, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', b'0');
INSERT INTO `system_role_menu` VALUES (2011, 2, 1046, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', b'0');
INSERT INTO `system_role_menu` VALUES (2012, 2, 1048, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', b'0');
INSERT INTO `system_role_menu` VALUES (2021, 2, 2083, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', b'0');
INSERT INTO `system_role_menu` VALUES (2024, 2, 1063, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', b'0');
INSERT INTO `system_role_menu` VALUES (2025, 2, 1064, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', b'0');
INSERT INTO `system_role_menu` VALUES (2026, 2, 1065, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', b'0');
INSERT INTO `system_role_menu` VALUES (2027, 2, 1066, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', b'0');
INSERT INTO `system_role_menu` VALUES (2028, 2, 1067, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', b'0');
INSERT INTO `system_role_menu` VALUES (2029, 2, 1070, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', b'0');
INSERT INTO `system_role_menu` VALUES (2036, 2, 1082, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', b'0');
INSERT INTO `system_role_menu` VALUES (2037, 2, 1085, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', b'0');
INSERT INTO `system_role_menu` VALUES (2038, 2, 1086, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', b'0');
INSERT INTO `system_role_menu` VALUES (2040, 2, 1088, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', b'0');
INSERT INTO `system_role_menu` VALUES (2041, 2, 1089, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', b'0');
INSERT INTO `system_role_menu` VALUES (2042, 2, 1091, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', b'0');
INSERT INTO `system_role_menu` VALUES (2043, 2, 1092, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', b'0');
INSERT INTO `system_role_menu` VALUES (2072, 2, 114, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', b'0');
INSERT INTO `system_role_menu` VALUES (2076, 2, 116, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', b'0');
INSERT INTO `system_role_menu` VALUES (2103, 2, 1237, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', b'0');
INSERT INTO `system_role_menu` VALUES (2104, 2, 1238, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', b'0');
INSERT INTO `system_role_menu` VALUES (2105, 2, 1239, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', b'0');
INSERT INTO `system_role_menu` VALUES (2106, 2, 1240, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', b'0');
INSERT INTO `system_role_menu` VALUES (2107, 2, 1241, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', b'0');
INSERT INTO `system_role_menu` VALUES (2108, 2, 1242, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', b'0');
INSERT INTO `system_role_menu` VALUES (2109, 2, 1243, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', b'0');
INSERT INTO `system_role_menu` VALUES (2123, 2, 1261, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', b'0');
INSERT INTO `system_role_menu` VALUES (2124, 2, 1263, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', b'0');
INSERT INTO `system_role_menu` VALUES (2125, 2, 1264, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', b'0');
INSERT INTO `system_role_menu` VALUES (2126, 2, 1265, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', b'0');
INSERT INTO `system_role_menu` VALUES (2127, 2, 1266, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', b'0');
INSERT INTO `system_role_menu` VALUES (2128, 2, 1267, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', b'0');
INSERT INTO `system_role_menu` VALUES (2129, 2, 1001, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', b'0');
INSERT INTO `system_role_menu` VALUES (2130, 2, 1002, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', b'0');
INSERT INTO `system_role_menu` VALUES (2131, 2, 1003, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', b'0');
INSERT INTO `system_role_menu` VALUES (2132, 2, 1004, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', b'0');
INSERT INTO `system_role_menu` VALUES (2133, 2, 1005, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', b'0');
INSERT INTO `system_role_menu` VALUES (2134, 2, 1006, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', b'0');
INSERT INTO `system_role_menu` VALUES (2135, 2, 1007, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', b'0');
INSERT INTO `system_role_menu` VALUES (2136, 2, 1008, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', b'0');
INSERT INTO `system_role_menu` VALUES (2137, 2, 1009, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', b'0');
INSERT INTO `system_role_menu` VALUES (2138, 2, 1010, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', b'0');
INSERT INTO `system_role_menu` VALUES (2139, 2, 1011, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', b'0');
INSERT INTO `system_role_menu` VALUES (2140, 2, 1012, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', b'0');
INSERT INTO `system_role_menu` VALUES (2141, 2, 1013, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', b'0');
INSERT INTO `system_role_menu` VALUES (2143, 2, 1015, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', b'0');
INSERT INTO `system_role_menu` VALUES (2145, 2, 1017, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', b'0');
INSERT INTO `system_role_menu` VALUES (2146, 2, 1018, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', b'0');
INSERT INTO `system_role_menu` VALUES (2147, 2, 1019, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', b'0');
INSERT INTO `system_role_menu` VALUES (2148, 2, 1020, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', b'0');
INSERT INTO `system_role_menu` VALUES (2149, 2, 1021, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', b'0');
INSERT INTO `system_role_menu` VALUES (2150, 2, 1022, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', b'0');
INSERT INTO `system_role_menu` VALUES (2151, 2, 1023, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', b'0');
INSERT INTO `system_role_menu` VALUES (5780, 2, 2740, '1', '2024-07-07 20:39:38', '1', '2024-07-07 20:39:38', b'0');
INSERT INTO `system_role_menu` VALUES (990000, 1, 900000, 'admin', '2026-03-18 13:42:03', 'admin', '2026-03-18 13:42:03', b'0');
INSERT INTO `system_role_menu` VALUES (990001, 1, 900001, 'admin', '2026-03-18 13:42:03', 'admin', '2026-03-18 13:42:03', b'0');
INSERT INTO `system_role_menu` VALUES (990002, 1, 900002, 'admin', '2026-03-18 13:42:03', 'admin', '2026-03-18 13:42:03', b'0');
INSERT INTO `system_role_menu` VALUES (990003, 1, 900003, 'admin', '2026-03-18 13:42:03', 'admin', '2026-03-18 13:42:03', b'0');
INSERT INTO `system_role_menu` VALUES (990004, 1, 900004, 'admin', '2026-03-18 13:42:03', 'admin', '2026-03-18 13:42:03', b'0');
INSERT INTO `system_role_menu` VALUES (990005, 1, 900005, 'admin', '2026-03-18 13:42:03', 'admin', '2026-03-18 13:42:03', b'0');
INSERT INTO `system_role_menu` VALUES (990006, 1, 900006, 'admin', '2026-03-18 13:42:03', 'admin', '2026-03-18 13:42:03', b'0');
INSERT INTO `system_role_menu` VALUES (990007, 1, 900007, 'admin', '2026-03-18 13:42:03', 'admin', '2026-03-18 13:42:03', b'0');
INSERT INTO `system_role_menu` VALUES (990008, 1, 900008, 'admin', '2026-03-18 13:42:03', 'admin', '2026-03-18 13:42:03', b'0');
INSERT INTO `system_role_menu` VALUES (990009, 1, 900009, 'admin', '2026-03-18 13:42:03', 'admin', '2026-03-18 13:42:03', b'0');
INSERT INTO `system_role_menu` VALUES (990010, 1, 900010, 'admin', '2026-03-18 13:42:03', 'admin', '2026-03-18 13:42:03', b'0');
INSERT INTO `system_role_menu` VALUES (990011, 1, 900011, 'admin', '2026-03-18 13:42:03', 'admin', '2026-03-18 13:42:03', b'0');
INSERT INTO `system_role_menu` VALUES (990012, 1, 900012, 'admin', '2026-03-18 13:42:03', 'admin', '2026-03-18 13:42:03', b'0');
INSERT INTO `system_role_menu` VALUES (990013, 1, 900013, 'admin', '2026-03-18 13:42:03', 'admin', '2026-03-18 13:42:03', b'0');
INSERT INTO `system_role_menu` VALUES (990014, 1, 900014, 'admin', '2026-03-18 13:42:03', 'admin', '2026-03-18 13:42:03', b'0');
INSERT INTO `system_role_menu` VALUES (990015, 1, 900015, 'admin', '2026-03-18 13:42:03', 'admin', '2026-03-18 13:42:03', b'0');
INSERT INTO `system_role_menu` VALUES (990016, 1, 900016, 'admin', '2026-03-18 13:42:03', 'admin', '2026-03-18 13:42:03', b'0');
INSERT INTO `system_role_menu` VALUES (990017, 1, 900017, 'admin', '2026-03-18 13:42:03', 'admin', '2026-03-18 13:42:03', b'0');
INSERT INTO `system_role_menu` VALUES (990018, 1, 900018, 'admin', '2026-03-18 13:42:03', 'admin', '2026-03-18 13:42:03', b'0');
INSERT INTO `system_role_menu` VALUES (990019, 1, 900019, 'admin', '2026-03-18 13:42:03', 'admin', '2026-03-18 13:42:03', b'0');
INSERT INTO `system_role_menu` VALUES (990020, 1, 900020, 'admin', '2026-03-18 13:42:03', 'admin', '2026-03-18 13:42:03', b'0');
INSERT INTO `system_role_menu` VALUES (990021, 1, 900021, 'admin', '2026-03-18 13:42:03', 'admin', '2026-03-18 13:42:03', b'0');
INSERT INTO `system_role_menu` VALUES (990022, 1, 900022, 'admin', '2026-03-18 13:42:03', 'admin', '2026-03-18 13:42:03', b'0');
INSERT INTO `system_role_menu` VALUES (990023, 1, 900023, 'admin', '2026-03-18 13:42:03', 'admin', '2026-03-18 13:42:03', b'0');
INSERT INTO `system_role_menu` VALUES (990024, 1, 900024, 'admin', '2026-03-18 13:42:03', 'admin', '2026-03-18 13:42:03', b'0');
INSERT INTO `system_role_menu` VALUES (990025, 1, 900025, 'admin', '2026-03-18 13:42:03', 'admin', '2026-03-18 13:42:03', b'0');
INSERT INTO `system_role_menu` VALUES (990026, 1, 900026, 'admin', '2026-03-18 13:42:03', 'admin', '2026-03-18 13:42:03', b'0');
INSERT INTO `system_role_menu` VALUES (990027, 1, 900027, 'admin', '2026-03-18 13:42:03', 'admin', '2026-03-18 13:42:03', b'0');
INSERT INTO `system_role_menu` VALUES (990028, 1, 900028, 'admin', '2026-03-18 13:42:03', 'admin', '2026-03-18 13:42:03', b'0');
INSERT INTO `system_role_menu` VALUES (990029, 1, 900029, 'admin', '2026-03-18 13:42:03', 'admin', '2026-03-18 13:42:03', b'0');
INSERT INTO `system_role_menu` VALUES (990030, 1, 900030, 'admin', '2026-03-18 13:42:03', 'admin', '2026-03-18 13:42:03', b'0');
INSERT INTO `system_role_menu` VALUES (990031, 1, 900031, 'admin', '2026-03-18 13:42:03', 'admin', '2026-03-18 13:42:03', b'0');
INSERT INTO `system_role_menu` VALUES (990032, 1, 900032, 'admin', '2026-03-18 13:42:03', 'admin', '2026-03-18 13:42:03', b'0');
INSERT INTO `system_role_menu` VALUES (990033, 1, 900033, 'admin', '2026-03-18 13:42:03', 'admin', '2026-03-18 13:42:03', b'0');
INSERT INTO `system_role_menu` VALUES (990034, 1, 900034, 'admin', '2026-03-18 13:42:03', 'admin', '2026-03-18 13:42:03', b'0');
INSERT INTO `system_role_menu` VALUES (990035, 1, 900035, 'admin', '2026-03-18 13:42:03', 'admin', '2026-03-18 13:42:03', b'0');
INSERT INTO `system_role_menu` VALUES (990036, 1, 900036, 'admin', '2026-03-18 13:42:03', 'admin', '2026-03-18 13:42:03', b'0');
INSERT INTO `system_role_menu` VALUES (990037, 1, 900037, 'admin', '2026-03-18 13:42:03', 'admin', '2026-03-18 13:42:03', b'0');
INSERT INTO `system_role_menu` VALUES (990038, 1, 900038, 'admin', '2026-03-18 13:42:03', 'admin', '2026-03-18 13:42:03', b'0');
INSERT INTO `system_role_menu` VALUES (990039, 1, 900039, 'admin', '2026-03-18 13:42:03', 'admin', '2026-03-18 13:42:03', b'0');
INSERT INTO `system_role_menu` VALUES (990040, 1, 900040, 'admin', '2026-03-18 13:42:03', 'admin', '2026-03-18 13:42:03', b'0');
INSERT INTO `system_role_menu` VALUES (990041, 1, 900041, 'admin', '2026-03-18 13:42:03', 'admin', '2026-03-18 13:42:03', b'0');
INSERT INTO `system_role_menu` VALUES (990042, 1, 900042, 'admin', '2026-03-18 13:42:03', 'admin', '2026-03-18 13:42:03', b'0');
INSERT INTO `system_role_menu` VALUES (990043, 1, 900043, 'admin', '2026-03-18 13:42:03', 'admin', '2026-03-18 13:42:03', b'0');
INSERT INTO `system_role_menu` VALUES (990044, 1, 900044, 'admin', '2026-03-18 13:42:03', 'admin', '2026-03-18 13:42:03', b'0');
INSERT INTO `system_role_menu` VALUES (990045, 1, 900045, 'admin', '2026-03-18 13:42:04', 'admin', '2026-03-18 13:42:04', b'0');
INSERT INTO `system_role_menu` VALUES (990046, 1, 900046, 'admin', '2026-03-18 13:42:04', 'admin', '2026-03-18 13:42:04', b'0');
INSERT INTO `system_role_menu` VALUES (990047, 1, 900047, 'admin', '2026-03-18 13:42:04', 'admin', '2026-03-18 13:42:04', b'0');
INSERT INTO `system_role_menu` VALUES (990048, 1, 900048, 'admin', '2026-03-18 13:42:04', 'admin', '2026-03-18 13:42:04', b'0');
INSERT INTO `system_role_menu` VALUES (990049, 1, 900049, 'admin', '2026-03-18 13:42:04', 'admin', '2026-03-18 13:42:04', b'0');
INSERT INTO `system_role_menu` VALUES (990050, 1, 900050, 'admin', '2026-03-18 13:42:04', 'admin', '2026-03-18 13:42:04', b'0');
INSERT INTO `system_role_menu` VALUES (990051, 1, 900051, 'admin', '2026-03-18 13:42:04', 'admin', '2026-03-18 13:42:04', b'0');
INSERT INTO `system_role_menu` VALUES (990052, 1, 900052, 'admin', '2026-03-18 13:42:04', 'admin', '2026-03-18 13:42:04', b'0');
INSERT INTO `system_role_menu` VALUES (990053, 1, 900053, 'admin', '2026-03-18 13:42:04', 'admin', '2026-03-18 13:42:04', b'0');
INSERT INTO `system_role_menu` VALUES (990054, 1, 900054, 'admin', '2026-03-18 13:42:04', 'admin', '2026-03-18 13:42:04', b'0');
INSERT INTO `system_role_menu` VALUES (990055, 1, 900055, 'admin', '2026-03-18 13:42:04', 'admin', '2026-03-18 13:42:04', b'0');
INSERT INTO `system_role_menu` VALUES (990056, 1, 900056, 'admin', '2026-03-18 13:42:04', 'admin', '2026-03-18 13:42:04', b'0');
INSERT INTO `system_role_menu` VALUES (990057, 1, 900057, 'admin', '2026-03-18 13:42:04', 'admin', '2026-03-18 13:42:04', b'0');
-- ----------------------------
-- Table structure for system_user_post
-- ----------------------------
DROP TABLE IF EXISTS `system_user_post`;
CREATE TABLE `system_user_post` (
`id` bigint NOT NULL COMMENT 'id',
`user_id` bigint NOT NULL DEFAULT 0 COMMENT '用户ID',
`post_id` bigint NOT NULL DEFAULT 0 COMMENT '岗位ID',
`creator` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT '' COMMENT '创建者',
`create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
`updater` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT '' COMMENT '更新者',
`update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
`deleted` bit(1) NOT NULL DEFAULT b'0' COMMENT '是否删除',
PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci COMMENT = '用户岗位表' ROW_FORMAT = Dynamic;
-- ----------------------------
-- Records of system_user_post
-- ----------------------------
INSERT INTO `system_user_post` VALUES (112, 1, 1, 'admin', '2022-05-02 07:25:24', 'admin', '2022-05-02 07:25:24', b'0');
INSERT INTO `system_user_post` VALUES (125, 1, 2, '1', '2024-07-13 22:31:39', '1', '2024-07-13 22:31:39', b'0');
-- ----------------------------
-- Table structure for system_user_role
-- ----------------------------
DROP TABLE IF EXISTS `system_user_role`;
CREATE TABLE `system_user_role` (
`id` bigint NOT NULL COMMENT '自增编号',
`user_id` bigint NOT NULL COMMENT '用户ID',
`role_id` bigint NOT NULL COMMENT '角色ID',
`creator` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT '' COMMENT '创建者',
`create_time` datetime NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
`updater` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT '' COMMENT '更新者',
`update_time` datetime NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
`deleted` bit(1) NULL DEFAULT b'0' COMMENT '是否删除',
PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci COMMENT = '用户和角色关联表' ROW_FORMAT = Dynamic;
-- ----------------------------
-- Records of system_user_role
-- ----------------------------
INSERT INTO `system_user_role` VALUES (1, 1, 1, '', '2022-01-11 13:19:45', '', '2022-05-12 12:35:17', b'0');
INSERT INTO `system_user_role` VALUES (18, 1, 2, '1', '2022-05-12 20:39:29', '1', '2022-05-12 20:39:29', b'0');
-- ----------------------------
-- Table structure for system_user_visibility_config
-- ----------------------------
DROP TABLE IF EXISTS `system_user_visibility_config`;
CREATE TABLE `system_user_visibility_config` (
`id` bigint NOT NULL COMMENT '主键ID',
`user_id` bigint NOT NULL COMMENT '用户ID',
`visibility_type` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '可见范围类型all/directions/projects',
`visible_direction_ids` json NULL COMMENT '补充可见方向ID集合',
`visible_project_ids` json NULL COMMENT '补充可见项目ID集合',
`remark` varchar(500) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL COMMENT '备注',
`creator` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT '' COMMENT '创建者',
`create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
`updater` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT '' COMMENT '更新者',
`update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
`deleted` bit(1) NOT NULL DEFAULT b'0' COMMENT '是否删除',
PRIMARY KEY (`id`) USING BTREE,
UNIQUE INDEX `uk_visibility_user`(`user_id` ASC) USING BTREE,
INDEX `idx_visibility_type`(`visibility_type` ASC) USING BTREE,
CONSTRAINT `chk_visibility_type` CHECK (`visibility_type` in (_utf8mb4'all',_utf8mb4'directions',_utf8mb4'projects'))
) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci COMMENT = '用户补充可见范围配置表' ROW_FORMAT = Dynamic;
-- ----------------------------
-- Records of system_user_visibility_config
-- ----------------------------
-- ----------------------------
-- Table structure for system_users
-- ----------------------------
DROP TABLE IF EXISTS `system_users`;
CREATE TABLE `system_users` (
`id` bigint NOT NULL COMMENT '用户ID',
`username` varchar(30) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '用户账号',
`password` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '' COMMENT '密码',
`nickname` varchar(30) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '用户昵称',
`remark` varchar(500) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL COMMENT '备注',
`dept_id` bigint NULL DEFAULT NULL COMMENT '部门ID',
`position_id` bigint NULL DEFAULT NULL COMMENT '主岗位ID',
`resigned_at` datetime NULL DEFAULT NULL COMMENT '离职时间',
`post_ids` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL COMMENT '岗位编号数组',
`email` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT '' COMMENT '用户邮箱',
`mobile` varchar(11) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT '' COMMENT '手机号码',
`sex` tinyint NULL DEFAULT 0 COMMENT '用户性别',
`avatar` varchar(512) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT '' COMMENT '头像地址',
`status` tinyint NOT NULL DEFAULT 0 COMMENT '帐号状态0正常 1停用',
`login_ip` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT '' COMMENT '最后登录IP',
`login_date` datetime NULL DEFAULT NULL COMMENT '最后登录时间',
`creator` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT '' COMMENT '创建者',
`create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
`updater` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT '' COMMENT '更新者',
`update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
`deleted` bit(1) NOT NULL DEFAULT b'0' COMMENT '是否删除',
PRIMARY KEY (`id`) USING BTREE,
INDEX `idx_system_users_dept_id`(`dept_id` ASC) USING BTREE,
INDEX `idx_system_users_position_id`(`position_id` ASC) USING BTREE
) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci COMMENT = '用户信息表' ROW_FORMAT = Dynamic;
-- ----------------------------
-- Records of system_users
-- ----------------------------
INSERT INTO `system_users` VALUES (1, 'admin', '$2a$04$KljJDa/LK7QfDm0lF5OhuePhlPfjRH3tB2Wu351Uidz.oQGJXevPi', '灿能源码', '管理员', 103, 2, NULL, '[1,2]', '11aoteman@126.com', '18818260272', 2, 'http://test.rdms.iocoder.cn/20250921/avatar_1758423875594.png', 0, '192.168.2.125', '2026-03-18 16:18:02', 'admin', '2021-01-05 17:03:47', 'system', '2026-03-19 13:59:04', b'0');
SET FOREIGN_KEY_CHECKS = 1;