From 2a60121f326edc0fc1903bc4422c0fb1c4d8db31 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=A1=BE=E6=8C=BD?= Date: Wed, 13 Nov 2024 18:16:11 +0800 Subject: [PATCH] =?UTF-8?q?=E9=A1=BE=E6=8C=BD11.13?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- login/pom.xml | 18 +- .../guwan/Interceptor/TokenInterceptor.java | 7 +- .../main/java/com/guwan/LoginApplication.java | 1 + .../main/java/com/guwan/RBAC/RouterMeta.java | 25 ++ .../main/java/com/guwan/RBAC/SystemMenu.java | 223 +++++++++++++++++ .../main/java/com/guwan/RBAC/SystemRole.java | 187 ++++++++++++++ .../java/com/guwan/RBAC/SystemRoleMenu.java | 133 ++++++++++ .../java/com/guwan/RBAC/SystemUserRole.java | 133 ++++++++++ .../main/java/com/guwan/RBAC/SystemUsers.java | 232 ++++++++++++++++++ .../src/main/java/com/guwan/RBAC/TempVo.java | 32 +++ .../com/guwan/config/WebSocketConfig.java | 17 ++ .../controller/login/DemoController.java | 24 ++ .../controller/login/UserController.java | 32 ++- .../controller/login/vo/LoginSuccessInfo.java | 44 ++++ .../com/guwan/mapdemo/SimpleDestination.java | 10 - .../java/com/guwan/mapdemo/SimpleSource.java | 16 -- .../com/guwan/mapper/SystemMenuMapper.java | 21 ++ .../com/guwan/mapper/SystemRoleMapper.java | 21 ++ .../guwan/mapper/SystemRoleMenuMapper.java | 21 ++ .../guwan/mapper/SystemUserRoleMapper.java | 21 ++ .../com/guwan/mapper/SystemUsersMapper.java | 21 ++ .../java/com/guwan/mapstruct/Employee.java | 17 ++ .../java/com/guwan/mapstruct/EmployeeDTO.java | 25 ++ .../com/guwan/mapstruct/EmployeeMapper.java | 16 ++ .../guwan/mapstruct/SimpleDestination.java | 13 + .../com/guwan/mapstruct/SimpleSource.java | 32 +++ .../SimpleSourceDestinationMapper.java | 6 +- .../com/guwan/service/SystemMenuService.java | 13 + .../guwan/service/SystemRoleMenuService.java | 13 + .../com/guwan/service/SystemRoleService.java | 13 + .../guwan/service/SystemUserRoleService.java | 13 + .../com/guwan/service/SystemUsersService.java | 16 ++ .../service/impl/SystemMenuServiceImpl.java | 23 ++ .../impl/SystemRoleMenuServiceImpl.java | 26 ++ .../service/impl/SystemRoleServiceImpl.java | 23 ++ .../impl/SystemUserRoleServiceImpl.java | 23 ++ .../service/impl/SystemUsersServiceImpl.java | 105 ++++++++ .../java/com/guwan/util/ToTextExample.java | 8 +- .../com/guwan/ws/VoiceWebSocketServer.java | 50 ++++ pom.xml | 6 + qrcode.png | Bin 5002 -> 13819 bytes .../com/guwan/generator/RBAC/SystemMenu.java | 0 .../com/guwan/generator/RBAC/SystemRole.java | 0 .../guwan/generator/RBAC/SystemRoleMenu.java | 0 .../guwan/generator/RBAC/SystemUserRole.java | 0 .../com/guwan/generator/RBAC/SystemUsers.java | 0 .../generator/mapper/SystemMenuMapper.java | 0 .../generator/mapper/SystemRoleMapper.java | 0 .../mapper/SystemRoleMenuMapper.java | 0 .../mapper/SystemUserRoleMapper.java | 0 .../generator/mapper/SystemUsersMapper.java | 0 .../generator/service/SystemMenuService.java | 0 .../service/SystemRoleMenuService.java | 0 .../generator/service/SystemRoleService.java | 0 .../service/SystemUserRoleService.java | 0 .../generator/service/SystemUsersService.java | 0 .../service/impl/SystemMenuServiceImpl.java | 0 .../impl/SystemRoleMenuServiceImpl.java | 0 .../service/impl/SystemRoleServiceImpl.java | 0 .../impl/SystemUserRoleServiceImpl.java | 0 .../service/impl/SystemUsersServiceImpl.java | 0 .../resources/mapper/SystemMenuMapper.xml | 38 +++ .../resources/mapper/SystemRoleMapper.xml | 32 +++ .../resources/mapper/SystemRoleMenuMapper.xml | 24 ++ .../resources/mapper/SystemUserRoleMapper.xml | 24 ++ .../resources/mapper/SystemUsersMapper.xml | 39 +++ 66 files changed, 1791 insertions(+), 46 deletions(-) create mode 100644 login/src/main/java/com/guwan/RBAC/RouterMeta.java create mode 100644 login/src/main/java/com/guwan/RBAC/SystemMenu.java create mode 100644 login/src/main/java/com/guwan/RBAC/SystemRole.java create mode 100644 login/src/main/java/com/guwan/RBAC/SystemRoleMenu.java create mode 100644 login/src/main/java/com/guwan/RBAC/SystemUserRole.java create mode 100644 login/src/main/java/com/guwan/RBAC/SystemUsers.java create mode 100644 login/src/main/java/com/guwan/RBAC/TempVo.java create mode 100644 login/src/main/java/com/guwan/config/WebSocketConfig.java create mode 100644 login/src/main/java/com/guwan/controller/login/DemoController.java create mode 100644 login/src/main/java/com/guwan/controller/login/vo/LoginSuccessInfo.java delete mode 100644 login/src/main/java/com/guwan/mapdemo/SimpleDestination.java delete mode 100644 login/src/main/java/com/guwan/mapdemo/SimpleSource.java create mode 100644 login/src/main/java/com/guwan/mapper/SystemMenuMapper.java create mode 100644 login/src/main/java/com/guwan/mapper/SystemRoleMapper.java create mode 100644 login/src/main/java/com/guwan/mapper/SystemRoleMenuMapper.java create mode 100644 login/src/main/java/com/guwan/mapper/SystemUserRoleMapper.java create mode 100644 login/src/main/java/com/guwan/mapper/SystemUsersMapper.java create mode 100644 login/src/main/java/com/guwan/mapstruct/Employee.java create mode 100644 login/src/main/java/com/guwan/mapstruct/EmployeeDTO.java create mode 100644 login/src/main/java/com/guwan/mapstruct/EmployeeMapper.java create mode 100644 login/src/main/java/com/guwan/mapstruct/SimpleDestination.java create mode 100644 login/src/main/java/com/guwan/mapstruct/SimpleSource.java rename login/src/main/java/com/guwan/{mapdemo => mapstruct}/SimpleSourceDestinationMapper.java (58%) create mode 100644 login/src/main/java/com/guwan/service/SystemMenuService.java create mode 100644 login/src/main/java/com/guwan/service/SystemRoleMenuService.java create mode 100644 login/src/main/java/com/guwan/service/SystemRoleService.java create mode 100644 login/src/main/java/com/guwan/service/SystemUserRoleService.java create mode 100644 login/src/main/java/com/guwan/service/SystemUsersService.java create mode 100644 login/src/main/java/com/guwan/service/impl/SystemMenuServiceImpl.java create mode 100644 login/src/main/java/com/guwan/service/impl/SystemRoleMenuServiceImpl.java create mode 100644 login/src/main/java/com/guwan/service/impl/SystemRoleServiceImpl.java create mode 100644 login/src/main/java/com/guwan/service/impl/SystemUserRoleServiceImpl.java create mode 100644 login/src/main/java/com/guwan/service/impl/SystemUsersServiceImpl.java create mode 100644 login/src/main/java/com/guwan/ws/VoiceWebSocketServer.java create mode 100644 src/main/java/com/guwan/generator/RBAC/SystemMenu.java create mode 100644 src/main/java/com/guwan/generator/RBAC/SystemRole.java create mode 100644 src/main/java/com/guwan/generator/RBAC/SystemRoleMenu.java create mode 100644 src/main/java/com/guwan/generator/RBAC/SystemUserRole.java create mode 100644 src/main/java/com/guwan/generator/RBAC/SystemUsers.java create mode 100644 src/main/java/com/guwan/generator/mapper/SystemMenuMapper.java create mode 100644 src/main/java/com/guwan/generator/mapper/SystemRoleMapper.java create mode 100644 src/main/java/com/guwan/generator/mapper/SystemRoleMenuMapper.java create mode 100644 src/main/java/com/guwan/generator/mapper/SystemUserRoleMapper.java create mode 100644 src/main/java/com/guwan/generator/mapper/SystemUsersMapper.java create mode 100644 src/main/java/com/guwan/generator/service/SystemMenuService.java create mode 100644 src/main/java/com/guwan/generator/service/SystemRoleMenuService.java create mode 100644 src/main/java/com/guwan/generator/service/SystemRoleService.java create mode 100644 src/main/java/com/guwan/generator/service/SystemUserRoleService.java create mode 100644 src/main/java/com/guwan/generator/service/SystemUsersService.java create mode 100644 src/main/java/com/guwan/generator/service/impl/SystemMenuServiceImpl.java create mode 100644 src/main/java/com/guwan/generator/service/impl/SystemRoleMenuServiceImpl.java create mode 100644 src/main/java/com/guwan/generator/service/impl/SystemRoleServiceImpl.java create mode 100644 src/main/java/com/guwan/generator/service/impl/SystemUserRoleServiceImpl.java create mode 100644 src/main/java/com/guwan/generator/service/impl/SystemUsersServiceImpl.java create mode 100644 src/main/resources/mapper/SystemMenuMapper.xml create mode 100644 src/main/resources/mapper/SystemRoleMapper.xml create mode 100644 src/main/resources/mapper/SystemRoleMenuMapper.xml create mode 100644 src/main/resources/mapper/SystemUserRoleMapper.xml create mode 100644 src/main/resources/mapper/SystemUsersMapper.xml diff --git a/login/pom.xml b/login/pom.xml index c83be31..95d6af7 100644 --- a/login/pom.xml +++ b/login/pom.xml @@ -131,6 +131,13 @@ + + org.springframework.boot + spring-boot-starter-websocket + + + + @@ -144,16 +151,17 @@ 3.11.0 - - org.mapstruct - mapstruct-processor - 1.6.0.Beta1 - + org.projectlombok lombok 1.18.34 + + org.mapstruct + mapstruct-processor + 1.6.0.Beta1 + diff --git a/login/src/main/java/com/guwan/Interceptor/TokenInterceptor.java b/login/src/main/java/com/guwan/Interceptor/TokenInterceptor.java index de4721d..6caefde 100644 --- a/login/src/main/java/com/guwan/Interceptor/TokenInterceptor.java +++ b/login/src/main/java/com/guwan/Interceptor/TokenInterceptor.java @@ -26,11 +26,7 @@ public class TokenInterceptor implements HandlerInterceptor { // 验证 Token 的有效性 boolean isValid = tokenService.checkToken(token); if (isValid) { - // 如果 Token 有效,可能需要更新 Token 并将新的 Token 添加到响应头中 - /* String newToken = tokenService.refreshToken(token); - if (newToken != null) { - response.setHeader("Authorization", newToken); - }*/ + tokenService.validateAndExtendToken(token); return true; // Token 有效,继续处理请求 } else { // 如果 Token 无效,返回未授权状态码 @@ -38,7 +34,6 @@ public class TokenInterceptor implements HandlerInterceptor { return false; // 拦截请求 } } - // 如果没有 Token,返回未授权状态码 response.setStatus(HttpServletResponse.SC_UNAUTHORIZED); return false; // 拦截请求 diff --git a/login/src/main/java/com/guwan/LoginApplication.java b/login/src/main/java/com/guwan/LoginApplication.java index 252b7ce..911e3f5 100644 --- a/login/src/main/java/com/guwan/LoginApplication.java +++ b/login/src/main/java/com/guwan/LoginApplication.java @@ -1,6 +1,7 @@ package com.guwan; import cn.dev33.satoken.SaManager; +import org.mybatis.spring.annotation.MapperScan; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; diff --git a/login/src/main/java/com/guwan/RBAC/RouterMeta.java b/login/src/main/java/com/guwan/RBAC/RouterMeta.java new file mode 100644 index 0000000..77aed81 --- /dev/null +++ b/login/src/main/java/com/guwan/RBAC/RouterMeta.java @@ -0,0 +1,25 @@ +package com.guwan.RBAC; + +import com.fasterxml.jackson.annotation.JsonInclude; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.util.List; + +@Data +@JsonInclude(JsonInclude.Include.NON_NULL) +public class RouterMeta { + + /*@ApiModelProperty(value = "标题")*/ + private String title; + + /*@ApiModelProperty(value = "排序权重")*/ + private List auths; + + /*@ApiModelProperty(value = "角色列表")*/ + private List roles; + + +} diff --git a/login/src/main/java/com/guwan/RBAC/SystemMenu.java b/login/src/main/java/com/guwan/RBAC/SystemMenu.java new file mode 100644 index 0000000..4bf9f07 --- /dev/null +++ b/login/src/main/java/com/guwan/RBAC/SystemMenu.java @@ -0,0 +1,223 @@ +package com.guwan.RBAC; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import java.io.Serializable; +import java.time.LocalDateTime; +import lombok.Data; + +/** + * 菜单权限表 + * @TableName system_menu + */ +@TableName(value ="system_menu") +@Data +public class SystemMenu implements Serializable { + /** + * 菜单ID + */ + @TableId(value = "id", type = IdType.AUTO) + private Long id; + + /** + * 菜单名称 + */ + @TableField(value = "name") + private String name; + + /** + * 权限标识 + */ + @TableField(value = "permission") + private String permission; + + /** + * 菜单类型 + */ + @TableField(value = "type") + private Integer type; + + /** + * 显示顺序 + */ + @TableField(value = "sort") + private Integer sort; + + /** + * 父菜单ID + */ + @TableField(value = "parent_id") + private Long parentId; + + /** + * 路由地址 + */ + @TableField(value = "path") + private String path; + + /** + * 菜单图标 + */ + @TableField(value = "icon") + private String icon; + + /** + * 组件路径 + */ + @TableField(value = "component") + private String component; + + /** + * 组件名 + */ + @TableField(value = "component_name") + private String componentName; + + /** + * 菜单状态 + */ + @TableField(value = "status") + private Integer status; + + /** + * 是否可见 + */ + @TableField(value = "visible") + private Boolean visible; + + /** + * 是否缓存 + */ + @TableField(value = "keep_alive") + private Boolean keepAlive; + + /** + * 是否总是显示 + */ + @TableField(value = "always_show") + private Boolean alwaysShow; + + /** + * 创建者 + */ + @TableField(value = "creator") + private String creator; + + /** + * 创建时间 + */ + @TableField(value = "create_time") + private LocalDateTime createTime; + + /** + * 更新者 + */ + @TableField(value = "updater") + private String updater; + + /** + * 更新时间 + */ + @TableField(value = "update_time") + private LocalDateTime updateTime; + + /** + * 是否删除 + */ + @TableField(value = "deleted") + private Boolean deleted; + + @TableField(exist = false) + private static final long serialVersionUID = 1L; + + @Override + public boolean equals(Object that) { + if (this == that) { + return true; + } + if (that == null) { + return false; + } + if (getClass() != that.getClass()) { + return false; + } + SystemMenu other = (SystemMenu) that; + return (this.getId() == null ? other.getId() == null : this.getId().equals(other.getId())) + && (this.getName() == null ? other.getName() == null : this.getName().equals(other.getName())) + && (this.getPermission() == null ? other.getPermission() == null : this.getPermission().equals(other.getPermission())) + && (this.getType() == null ? other.getType() == null : this.getType().equals(other.getType())) + && (this.getSort() == null ? other.getSort() == null : this.getSort().equals(other.getSort())) + && (this.getParentId() == null ? other.getParentId() == null : this.getParentId().equals(other.getParentId())) + && (this.getPath() == null ? other.getPath() == null : this.getPath().equals(other.getPath())) + && (this.getIcon() == null ? other.getIcon() == null : this.getIcon().equals(other.getIcon())) + && (this.getComponent() == null ? other.getComponent() == null : this.getComponent().equals(other.getComponent())) + && (this.getComponentName() == null ? other.getComponentName() == null : this.getComponentName().equals(other.getComponentName())) + && (this.getStatus() == null ? other.getStatus() == null : this.getStatus().equals(other.getStatus())) + && (this.getVisible() == null ? other.getVisible() == null : this.getVisible().equals(other.getVisible())) + && (this.getKeepAlive() == null ? other.getKeepAlive() == null : this.getKeepAlive().equals(other.getKeepAlive())) + && (this.getAlwaysShow() == null ? other.getAlwaysShow() == null : this.getAlwaysShow().equals(other.getAlwaysShow())) + && (this.getCreator() == null ? other.getCreator() == null : this.getCreator().equals(other.getCreator())) + && (this.getCreateTime() == null ? other.getCreateTime() == null : this.getCreateTime().equals(other.getCreateTime())) + && (this.getUpdater() == null ? other.getUpdater() == null : this.getUpdater().equals(other.getUpdater())) + && (this.getUpdateTime() == null ? other.getUpdateTime() == null : this.getUpdateTime().equals(other.getUpdateTime())) + && (this.getDeleted() == null ? other.getDeleted() == null : this.getDeleted().equals(other.getDeleted())); + } + + @Override + public int hashCode() { + final int prime = 31; + int result = 1; + result = prime * result + ((getId() == null) ? 0 : getId().hashCode()); + result = prime * result + ((getName() == null) ? 0 : getName().hashCode()); + result = prime * result + ((getPermission() == null) ? 0 : getPermission().hashCode()); + result = prime * result + ((getType() == null) ? 0 : getType().hashCode()); + result = prime * result + ((getSort() == null) ? 0 : getSort().hashCode()); + result = prime * result + ((getParentId() == null) ? 0 : getParentId().hashCode()); + result = prime * result + ((getPath() == null) ? 0 : getPath().hashCode()); + result = prime * result + ((getIcon() == null) ? 0 : getIcon().hashCode()); + result = prime * result + ((getComponent() == null) ? 0 : getComponent().hashCode()); + result = prime * result + ((getComponentName() == null) ? 0 : getComponentName().hashCode()); + result = prime * result + ((getStatus() == null) ? 0 : getStatus().hashCode()); + result = prime * result + ((getVisible() == null) ? 0 : getVisible().hashCode()); + result = prime * result + ((getKeepAlive() == null) ? 0 : getKeepAlive().hashCode()); + result = prime * result + ((getAlwaysShow() == null) ? 0 : getAlwaysShow().hashCode()); + result = prime * result + ((getCreator() == null) ? 0 : getCreator().hashCode()); + result = prime * result + ((getCreateTime() == null) ? 0 : getCreateTime().hashCode()); + result = prime * result + ((getUpdater() == null) ? 0 : getUpdater().hashCode()); + result = prime * result + ((getUpdateTime() == null) ? 0 : getUpdateTime().hashCode()); + result = prime * result + ((getDeleted() == null) ? 0 : getDeleted().hashCode()); + return result; + } + + @Override + public String toString() { + StringBuilder sb = new StringBuilder(); + sb.append(getClass().getSimpleName()); + sb.append(" ["); + sb.append("Hash = ").append(hashCode()); + sb.append(", id=").append(id); + sb.append(", name=").append(name); + sb.append(", permission=").append(permission); + sb.append(", type=").append(type); + sb.append(", sort=").append(sort); + sb.append(", parentId=").append(parentId); + sb.append(", path=").append(path); + sb.append(", icon=").append(icon); + sb.append(", component=").append(component); + sb.append(", componentName=").append(componentName); + sb.append(", status=").append(status); + sb.append(", visible=").append(visible); + sb.append(", keepAlive=").append(keepAlive); + sb.append(", alwaysShow=").append(alwaysShow); + sb.append(", creator=").append(creator); + sb.append(", createTime=").append(createTime); + sb.append(", updater=").append(updater); + sb.append(", updateTime=").append(updateTime); + sb.append(", deleted=").append(deleted); + sb.append(", serialVersionUID=").append(serialVersionUID); + sb.append("]"); + return sb.toString(); + } +} \ No newline at end of file diff --git a/login/src/main/java/com/guwan/RBAC/SystemRole.java b/login/src/main/java/com/guwan/RBAC/SystemRole.java new file mode 100644 index 0000000..202c95d --- /dev/null +++ b/login/src/main/java/com/guwan/RBAC/SystemRole.java @@ -0,0 +1,187 @@ +package com.guwan.RBAC; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import java.io.Serializable; +import java.time.LocalDateTime; +import lombok.Data; + +/** + * 角色信息表 + * @TableName system_role + */ +@TableName(value ="system_role") +@Data +public class SystemRole implements Serializable { + /** + * 角色ID + */ + @TableId(value = "id", type = IdType.AUTO) + private Long id; + + /** + * 角色名称 + */ + @TableField(value = "name") + private String name; + + /** + * 角色权限字符串 + */ + @TableField(value = "code") + private String code; + + /** + * 显示顺序 + */ + @TableField(value = "sort") + private Integer sort; + + /** + * 数据范围(1:全部数据权限 2:自定数据权限 3:本部门数据权限 4:本部门及以下数据权限) + */ + @TableField(value = "data_scope") + private Integer dataScope; + + /** + * 数据范围(指定部门数组) + */ + @TableField(value = "data_scope_dept_ids") + private String dataScopeDeptIds; + + /** + * 角色状态(0正常 1停用) + */ + @TableField(value = "status") + private Integer status; + + /** + * 角色类型 + */ + @TableField(value = "type") + private Integer type; + + /** + * 备注 + */ + @TableField(value = "remark") + private String remark; + + /** + * 创建者 + */ + @TableField(value = "creator") + private String creator; + + /** + * 创建时间 + */ + @TableField(value = "create_time") + private LocalDateTime createTime; + + /** + * 更新者 + */ + @TableField(value = "updater") + private String updater; + + /** + * 更新时间 + */ + @TableField(value = "update_time") + private LocalDateTime updateTime; + + /** + * 是否删除 + */ + @TableField(value = "deleted") + private Boolean deleted; + + /** + * 租户编号 + */ + @TableField(value = "tenant_id") + private Long tenantId; + + @TableField(exist = false) + private static final long serialVersionUID = 1L; + + @Override + public boolean equals(Object that) { + if (this == that) { + return true; + } + if (that == null) { + return false; + } + if (getClass() != that.getClass()) { + return false; + } + SystemRole other = (SystemRole) that; + return (this.getId() == null ? other.getId() == null : this.getId().equals(other.getId())) + && (this.getName() == null ? other.getName() == null : this.getName().equals(other.getName())) + && (this.getCode() == null ? other.getCode() == null : this.getCode().equals(other.getCode())) + && (this.getSort() == null ? other.getSort() == null : this.getSort().equals(other.getSort())) + && (this.getDataScope() == null ? other.getDataScope() == null : this.getDataScope().equals(other.getDataScope())) + && (this.getDataScopeDeptIds() == null ? other.getDataScopeDeptIds() == null : this.getDataScopeDeptIds().equals(other.getDataScopeDeptIds())) + && (this.getStatus() == null ? other.getStatus() == null : this.getStatus().equals(other.getStatus())) + && (this.getType() == null ? other.getType() == null : this.getType().equals(other.getType())) + && (this.getRemark() == null ? other.getRemark() == null : this.getRemark().equals(other.getRemark())) + && (this.getCreator() == null ? other.getCreator() == null : this.getCreator().equals(other.getCreator())) + && (this.getCreateTime() == null ? other.getCreateTime() == null : this.getCreateTime().equals(other.getCreateTime())) + && (this.getUpdater() == null ? other.getUpdater() == null : this.getUpdater().equals(other.getUpdater())) + && (this.getUpdateTime() == null ? other.getUpdateTime() == null : this.getUpdateTime().equals(other.getUpdateTime())) + && (this.getDeleted() == null ? other.getDeleted() == null : this.getDeleted().equals(other.getDeleted())) + && (this.getTenantId() == null ? other.getTenantId() == null : this.getTenantId().equals(other.getTenantId())); + } + + @Override + public int hashCode() { + final int prime = 31; + int result = 1; + result = prime * result + ((getId() == null) ? 0 : getId().hashCode()); + result = prime * result + ((getName() == null) ? 0 : getName().hashCode()); + result = prime * result + ((getCode() == null) ? 0 : getCode().hashCode()); + result = prime * result + ((getSort() == null) ? 0 : getSort().hashCode()); + result = prime * result + ((getDataScope() == null) ? 0 : getDataScope().hashCode()); + result = prime * result + ((getDataScopeDeptIds() == null) ? 0 : getDataScopeDeptIds().hashCode()); + result = prime * result + ((getStatus() == null) ? 0 : getStatus().hashCode()); + result = prime * result + ((getType() == null) ? 0 : getType().hashCode()); + result = prime * result + ((getRemark() == null) ? 0 : getRemark().hashCode()); + result = prime * result + ((getCreator() == null) ? 0 : getCreator().hashCode()); + result = prime * result + ((getCreateTime() == null) ? 0 : getCreateTime().hashCode()); + result = prime * result + ((getUpdater() == null) ? 0 : getUpdater().hashCode()); + result = prime * result + ((getUpdateTime() == null) ? 0 : getUpdateTime().hashCode()); + result = prime * result + ((getDeleted() == null) ? 0 : getDeleted().hashCode()); + result = prime * result + ((getTenantId() == null) ? 0 : getTenantId().hashCode()); + return result; + } + + @Override + public String toString() { + StringBuilder sb = new StringBuilder(); + sb.append(getClass().getSimpleName()); + sb.append(" ["); + sb.append("Hash = ").append(hashCode()); + sb.append(", id=").append(id); + sb.append(", name=").append(name); + sb.append(", code=").append(code); + sb.append(", sort=").append(sort); + sb.append(", dataScope=").append(dataScope); + sb.append(", dataScopeDeptIds=").append(dataScopeDeptIds); + sb.append(", status=").append(status); + sb.append(", type=").append(type); + sb.append(", remark=").append(remark); + sb.append(", creator=").append(creator); + sb.append(", createTime=").append(createTime); + sb.append(", updater=").append(updater); + sb.append(", updateTime=").append(updateTime); + sb.append(", deleted=").append(deleted); + sb.append(", tenantId=").append(tenantId); + sb.append(", serialVersionUID=").append(serialVersionUID); + sb.append("]"); + return sb.toString(); + } +} \ No newline at end of file diff --git a/login/src/main/java/com/guwan/RBAC/SystemRoleMenu.java b/login/src/main/java/com/guwan/RBAC/SystemRoleMenu.java new file mode 100644 index 0000000..c882989 --- /dev/null +++ b/login/src/main/java/com/guwan/RBAC/SystemRoleMenu.java @@ -0,0 +1,133 @@ +package com.guwan.RBAC; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import java.io.Serializable; +import java.time.LocalDateTime; +import lombok.Data; + +/** + * 角色和菜单关联表 + * @TableName system_role_menu + */ +@TableName(value ="system_role_menu") +@Data +public class SystemRoleMenu implements Serializable { + /** + * 自增编号 + */ + @TableId(value = "id", type = IdType.AUTO) + private Long id; + + /** + * 角色ID + */ + @TableField(value = "role_id") + private Long roleId; + + /** + * 菜单ID + */ + @TableField(value = "menu_id") + private Long menuId; + + /** + * 创建者 + */ + @TableField(value = "creator") + private String creator; + + /** + * 创建时间 + */ + @TableField(value = "create_time") + private LocalDateTime createTime; + + /** + * 更新者 + */ + @TableField(value = "updater") + private String updater; + + /** + * 更新时间 + */ + @TableField(value = "update_time") + private LocalDateTime updateTime; + + /** + * 是否删除 + */ + @TableField(value = "deleted") + private Boolean deleted; + + /** + * 租户编号 + */ + @TableField(value = "tenant_id") + private Long tenantId; + + @TableField(exist = false) + private static final long serialVersionUID = 1L; + + @Override + public boolean equals(Object that) { + if (this == that) { + return true; + } + if (that == null) { + return false; + } + if (getClass() != that.getClass()) { + return false; + } + SystemRoleMenu other = (SystemRoleMenu) that; + return (this.getId() == null ? other.getId() == null : this.getId().equals(other.getId())) + && (this.getRoleId() == null ? other.getRoleId() == null : this.getRoleId().equals(other.getRoleId())) + && (this.getMenuId() == null ? other.getMenuId() == null : this.getMenuId().equals(other.getMenuId())) + && (this.getCreator() == null ? other.getCreator() == null : this.getCreator().equals(other.getCreator())) + && (this.getCreateTime() == null ? other.getCreateTime() == null : this.getCreateTime().equals(other.getCreateTime())) + && (this.getUpdater() == null ? other.getUpdater() == null : this.getUpdater().equals(other.getUpdater())) + && (this.getUpdateTime() == null ? other.getUpdateTime() == null : this.getUpdateTime().equals(other.getUpdateTime())) + && (this.getDeleted() == null ? other.getDeleted() == null : this.getDeleted().equals(other.getDeleted())) + && (this.getTenantId() == null ? other.getTenantId() == null : this.getTenantId().equals(other.getTenantId())); + } + + @Override + public int hashCode() { + final int prime = 31; + int result = 1; + result = prime * result + ((getId() == null) ? 0 : getId().hashCode()); + result = prime * result + ((getRoleId() == null) ? 0 : getRoleId().hashCode()); + result = prime * result + ((getMenuId() == null) ? 0 : getMenuId().hashCode()); + result = prime * result + ((getCreator() == null) ? 0 : getCreator().hashCode()); + result = prime * result + ((getCreateTime() == null) ? 0 : getCreateTime().hashCode()); + result = prime * result + ((getUpdater() == null) ? 0 : getUpdater().hashCode()); + result = prime * result + ((getUpdateTime() == null) ? 0 : getUpdateTime().hashCode()); + result = prime * result + ((getDeleted() == null) ? 0 : getDeleted().hashCode()); + result = prime * result + ((getTenantId() == null) ? 0 : getTenantId().hashCode()); + return result; + } + + @Override + public String toString() { + StringBuilder sb = new StringBuilder(); + sb.append(getClass().getSimpleName()); + sb.append(" ["); + sb.append("Hash = ").append(hashCode()); + sb.append(", id=").append(id); + sb.append(", roleId=").append(roleId); + sb.append(", menuId=").append(menuId); + sb.append(", creator=").append(creator); + sb.append(", createTime=").append(createTime); + sb.append(", updater=").append(updater); + sb.append(", updateTime=").append(updateTime); + sb.append(", deleted=").append(deleted); + sb.append(", tenantId=").append(tenantId); + sb.append(", serialVersionUID=").append(serialVersionUID); + sb.append("]"); + return sb.toString(); + } +} \ No newline at end of file diff --git a/login/src/main/java/com/guwan/RBAC/SystemUserRole.java b/login/src/main/java/com/guwan/RBAC/SystemUserRole.java new file mode 100644 index 0000000..988b209 --- /dev/null +++ b/login/src/main/java/com/guwan/RBAC/SystemUserRole.java @@ -0,0 +1,133 @@ +package com.guwan.RBAC; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import java.io.Serializable; +import java.time.LocalDateTime; +import lombok.Data; + +/** + * 用户和角色关联表 + * @TableName system_user_role + */ +@TableName(value ="system_user_role") +@Data +public class SystemUserRole implements Serializable { + /** + * 自增编号 + */ + @TableId(value = "id", type = IdType.AUTO) + private Long id; + + /** + * 用户ID + */ + @TableField(value = "user_id") + private Long userId; + + /** + * 角色ID + */ + @TableField(value = "role_id") + private Long roleId; + + /** + * 创建者 + */ + @TableField(value = "creator") + private String creator; + + /** + * 创建时间 + */ + @TableField(value = "create_time") + private LocalDateTime createTime; + + /** + * 更新者 + */ + @TableField(value = "updater") + private String updater; + + /** + * 更新时间 + */ + @TableField(value = "update_time") + private LocalDateTime updateTime; + + /** + * 是否删除 + */ + @TableField(value = "deleted") + private Boolean deleted; + + /** + * 租户编号 + */ + @TableField(value = "tenant_id") + private Long tenantId; + + @TableField(exist = false) + private static final long serialVersionUID = 1L; + + @Override + public boolean equals(Object that) { + if (this == that) { + return true; + } + if (that == null) { + return false; + } + if (getClass() != that.getClass()) { + return false; + } + SystemUserRole other = (SystemUserRole) that; + return (this.getId() == null ? other.getId() == null : this.getId().equals(other.getId())) + && (this.getUserId() == null ? other.getUserId() == null : this.getUserId().equals(other.getUserId())) + && (this.getRoleId() == null ? other.getRoleId() == null : this.getRoleId().equals(other.getRoleId())) + && (this.getCreator() == null ? other.getCreator() == null : this.getCreator().equals(other.getCreator())) + && (this.getCreateTime() == null ? other.getCreateTime() == null : this.getCreateTime().equals(other.getCreateTime())) + && (this.getUpdater() == null ? other.getUpdater() == null : this.getUpdater().equals(other.getUpdater())) + && (this.getUpdateTime() == null ? other.getUpdateTime() == null : this.getUpdateTime().equals(other.getUpdateTime())) + && (this.getDeleted() == null ? other.getDeleted() == null : this.getDeleted().equals(other.getDeleted())) + && (this.getTenantId() == null ? other.getTenantId() == null : this.getTenantId().equals(other.getTenantId())); + } + + @Override + public int hashCode() { + final int prime = 31; + int result = 1; + result = prime * result + ((getId() == null) ? 0 : getId().hashCode()); + result = prime * result + ((getUserId() == null) ? 0 : getUserId().hashCode()); + result = prime * result + ((getRoleId() == null) ? 0 : getRoleId().hashCode()); + result = prime * result + ((getCreator() == null) ? 0 : getCreator().hashCode()); + result = prime * result + ((getCreateTime() == null) ? 0 : getCreateTime().hashCode()); + result = prime * result + ((getUpdater() == null) ? 0 : getUpdater().hashCode()); + result = prime * result + ((getUpdateTime() == null) ? 0 : getUpdateTime().hashCode()); + result = prime * result + ((getDeleted() == null) ? 0 : getDeleted().hashCode()); + result = prime * result + ((getTenantId() == null) ? 0 : getTenantId().hashCode()); + return result; + } + + @Override + public String toString() { + StringBuilder sb = new StringBuilder(); + sb.append(getClass().getSimpleName()); + sb.append(" ["); + sb.append("Hash = ").append(hashCode()); + sb.append(", id=").append(id); + sb.append(", userId=").append(userId); + sb.append(", roleId=").append(roleId); + sb.append(", creator=").append(creator); + sb.append(", createTime=").append(createTime); + sb.append(", updater=").append(updater); + sb.append(", updateTime=").append(updateTime); + sb.append(", deleted=").append(deleted); + sb.append(", tenantId=").append(tenantId); + sb.append(", serialVersionUID=").append(serialVersionUID); + sb.append("]"); + return sb.toString(); + } +} \ No newline at end of file diff --git a/login/src/main/java/com/guwan/RBAC/SystemUsers.java b/login/src/main/java/com/guwan/RBAC/SystemUsers.java new file mode 100644 index 0000000..1871de6 --- /dev/null +++ b/login/src/main/java/com/guwan/RBAC/SystemUsers.java @@ -0,0 +1,232 @@ +package com.guwan.RBAC; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import java.io.Serializable; +import java.time.LocalDateTime; +import lombok.Data; + +/** + * 用户信息表 + * @TableName system_users + */ +@TableName(value ="system_users") +@Data +public class SystemUsers implements Serializable { + /** + * 用户ID + */ + @TableId(value = "id", type = IdType.AUTO) + private Long id; + + /** + * 用户账号 + */ + @TableField(value = "username") + private String username; + + /** + * 密码 + */ + @TableField(value = "password") + private String password; + + /** + * 用户昵称 + */ + @TableField(value = "nickname") + private String nickname; + + /** + * 备注 + */ + @TableField(value = "remark") + private String remark; + + /** + * 部门ID + */ + @TableField(value = "dept_id") + private Long deptId; + + /** + * 岗位编号数组 + */ + @TableField(value = "post_ids") + private String postIds; + + /** + * 用户邮箱 + */ + @TableField(value = "email") + private String email; + + /** + * 手机号码 + */ + @TableField(value = "mobile") + private String mobile; + + /** + * 用户性别 + */ + @TableField(value = "sex") + private Integer sex; + + /** + * 头像地址 + */ + @TableField(value = "avatar") + private String avatar; + + /** + * 帐号状态(0正常 1停用) + */ + @TableField(value = "status") + private Integer status; + + /** + * 最后登录IP + */ + @TableField(value = "login_ip") + private String loginIp; + + /** + * 最后登录时间 + */ + @TableField(value = "login_date") + private LocalDateTime loginDate; + + /** + * 创建者 + */ + @TableField(value = "creator") + private String creator; + + /** + * 创建时间 + */ + @TableField(value = "create_time") + private LocalDateTime createTime; + + /** + * 更新者 + */ + @TableField(value = "updater") + private String updater; + + /** + * 更新时间 + */ + @TableField(value = "update_time") + private LocalDateTime updateTime; + + /** + * 是否删除 + */ + @TableField(value = "deleted") + private Boolean deleted; + + /** + * 租户编号 + */ + @TableField(value = "tenant_id") + private Long tenantId; + + @TableField(exist = false) + private static final long serialVersionUID = 1L; + + @Override + public boolean equals(Object that) { + if (this == that) { + return true; + } + if (that == null) { + return false; + } + if (getClass() != that.getClass()) { + return false; + } + SystemUsers other = (SystemUsers) that; + return (this.getId() == null ? other.getId() == null : this.getId().equals(other.getId())) + && (this.getUsername() == null ? other.getUsername() == null : this.getUsername().equals(other.getUsername())) + && (this.getPassword() == null ? other.getPassword() == null : this.getPassword().equals(other.getPassword())) + && (this.getNickname() == null ? other.getNickname() == null : this.getNickname().equals(other.getNickname())) + && (this.getRemark() == null ? other.getRemark() == null : this.getRemark().equals(other.getRemark())) + && (this.getDeptId() == null ? other.getDeptId() == null : this.getDeptId().equals(other.getDeptId())) + && (this.getPostIds() == null ? other.getPostIds() == null : this.getPostIds().equals(other.getPostIds())) + && (this.getEmail() == null ? other.getEmail() == null : this.getEmail().equals(other.getEmail())) + && (this.getMobile() == null ? other.getMobile() == null : this.getMobile().equals(other.getMobile())) + && (this.getSex() == null ? other.getSex() == null : this.getSex().equals(other.getSex())) + && (this.getAvatar() == null ? other.getAvatar() == null : this.getAvatar().equals(other.getAvatar())) + && (this.getStatus() == null ? other.getStatus() == null : this.getStatus().equals(other.getStatus())) + && (this.getLoginIp() == null ? other.getLoginIp() == null : this.getLoginIp().equals(other.getLoginIp())) + && (this.getLoginDate() == null ? other.getLoginDate() == null : this.getLoginDate().equals(other.getLoginDate())) + && (this.getCreator() == null ? other.getCreator() == null : this.getCreator().equals(other.getCreator())) + && (this.getCreateTime() == null ? other.getCreateTime() == null : this.getCreateTime().equals(other.getCreateTime())) + && (this.getUpdater() == null ? other.getUpdater() == null : this.getUpdater().equals(other.getUpdater())) + && (this.getUpdateTime() == null ? other.getUpdateTime() == null : this.getUpdateTime().equals(other.getUpdateTime())) + && (this.getDeleted() == null ? other.getDeleted() == null : this.getDeleted().equals(other.getDeleted())) + && (this.getTenantId() == null ? other.getTenantId() == null : this.getTenantId().equals(other.getTenantId())); + } + + @Override + public int hashCode() { + final int prime = 31; + int result = 1; + result = prime * result + ((getId() == null) ? 0 : getId().hashCode()); + result = prime * result + ((getUsername() == null) ? 0 : getUsername().hashCode()); + result = prime * result + ((getPassword() == null) ? 0 : getPassword().hashCode()); + result = prime * result + ((getNickname() == null) ? 0 : getNickname().hashCode()); + result = prime * result + ((getRemark() == null) ? 0 : getRemark().hashCode()); + result = prime * result + ((getDeptId() == null) ? 0 : getDeptId().hashCode()); + result = prime * result + ((getPostIds() == null) ? 0 : getPostIds().hashCode()); + result = prime * result + ((getEmail() == null) ? 0 : getEmail().hashCode()); + result = prime * result + ((getMobile() == null) ? 0 : getMobile().hashCode()); + result = prime * result + ((getSex() == null) ? 0 : getSex().hashCode()); + result = prime * result + ((getAvatar() == null) ? 0 : getAvatar().hashCode()); + result = prime * result + ((getStatus() == null) ? 0 : getStatus().hashCode()); + result = prime * result + ((getLoginIp() == null) ? 0 : getLoginIp().hashCode()); + result = prime * result + ((getLoginDate() == null) ? 0 : getLoginDate().hashCode()); + result = prime * result + ((getCreator() == null) ? 0 : getCreator().hashCode()); + result = prime * result + ((getCreateTime() == null) ? 0 : getCreateTime().hashCode()); + result = prime * result + ((getUpdater() == null) ? 0 : getUpdater().hashCode()); + result = prime * result + ((getUpdateTime() == null) ? 0 : getUpdateTime().hashCode()); + result = prime * result + ((getDeleted() == null) ? 0 : getDeleted().hashCode()); + result = prime * result + ((getTenantId() == null) ? 0 : getTenantId().hashCode()); + return result; + } + + @Override + public String toString() { + StringBuilder sb = new StringBuilder(); + sb.append(getClass().getSimpleName()); + sb.append(" ["); + sb.append("Hash = ").append(hashCode()); + sb.append(", id=").append(id); + sb.append(", username=").append(username); + sb.append(", password=").append(password); + sb.append(", nickname=").append(nickname); + sb.append(", remark=").append(remark); + sb.append(", deptId=").append(deptId); + sb.append(", postIds=").append(postIds); + sb.append(", email=").append(email); + sb.append(", mobile=").append(mobile); + sb.append(", sex=").append(sex); + sb.append(", avatar=").append(avatar); + sb.append(", status=").append(status); + sb.append(", loginIp=").append(loginIp); + sb.append(", loginDate=").append(loginDate); + sb.append(", creator=").append(creator); + sb.append(", createTime=").append(createTime); + sb.append(", updater=").append(updater); + sb.append(", updateTime=").append(updateTime); + sb.append(", deleted=").append(deleted); + sb.append(", tenantId=").append(tenantId); + sb.append(", serialVersionUID=").append(serialVersionUID); + sb.append("]"); + return sb.toString(); + } +} \ No newline at end of file diff --git a/login/src/main/java/com/guwan/RBAC/TempVo.java b/login/src/main/java/com/guwan/RBAC/TempVo.java new file mode 100644 index 0000000..8e4dd42 --- /dev/null +++ b/login/src/main/java/com/guwan/RBAC/TempVo.java @@ -0,0 +1,32 @@ +package com.guwan.RBAC; + +import com.fasterxml.jackson.annotation.JsonInclude; +import com.fasterxml.jackson.databind.annotation.JsonDeserialize; +import lombok.Builder; +import lombok.Data; +import lombok.experimental.Accessors; + +import java.util.List; + +@JsonInclude(JsonInclude.Include.NON_NULL) +@Data +@Accessors(chain = true) +public class TempVo { + /** + * 路径 + */ + private String path; + /** + * 名称 + */ + private String name; + /** + * 元数据 + */ + private RouterMeta meta; + /** + * 子路由 + */ + private List children; + +} diff --git a/login/src/main/java/com/guwan/config/WebSocketConfig.java b/login/src/main/java/com/guwan/config/WebSocketConfig.java new file mode 100644 index 0000000..c1f5c65 --- /dev/null +++ b/login/src/main/java/com/guwan/config/WebSocketConfig.java @@ -0,0 +1,17 @@ + +package com.guwan.config; + +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.web.socket.server.standard.ServerEndpointExporter; + +@Configuration +public class WebSocketConfig { + + +// 注入一个ServerEndpointExporter,该Bean会自动注册使用@ServerEndpoint注解声明的websocket endpoint + @Bean + public ServerEndpointExporter serverEndpointExporter() { + return new ServerEndpointExporter(); + } +} diff --git a/login/src/main/java/com/guwan/controller/login/DemoController.java b/login/src/main/java/com/guwan/controller/login/DemoController.java new file mode 100644 index 0000000..257263e --- /dev/null +++ b/login/src/main/java/com/guwan/controller/login/DemoController.java @@ -0,0 +1,24 @@ +package com.guwan.controller.login; + +import com.guwan.RBAC.TempVo; +import com.guwan.common.R; +import jakarta.annotation.Resource; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +@RestController +@RequestMapping("/demo") +public class DemoController { + + @Resource + private service.SystemUsersService systemUsersService; + + @GetMapping("1") + public R test(){ + systemUsersService.getRouterAsync(); + + return R.ok().put("data", new TempVo().setName("1111")); + } + +} diff --git a/login/src/main/java/com/guwan/controller/login/UserController.java b/login/src/main/java/com/guwan/controller/login/UserController.java index 1a2e9cc..8657d03 100644 --- a/login/src/main/java/com/guwan/controller/login/UserController.java +++ b/login/src/main/java/com/guwan/controller/login/UserController.java @@ -4,16 +4,15 @@ import cn.hutool.json.JSONObject; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.guwan.common.R; import com.guwan.config.GlobalValue; -import com.guwan.mapdemo.SimpleDestination; -import com.guwan.mapdemo.SimpleSource; -import com.guwan.mapdemo.SimpleSourceDestinationMapper; -import com.guwan.mapdemo.SimpleSourceDestinationMapperImpl; +import com.guwan.controller.login.vo.LoginSuccessInfo; +import com.guwan.mapstruct.SimpleDestination; +import com.guwan.mapstruct.SimpleSource; +import com.guwan.mapstruct.SimpleSourceDestinationMapper; import com.guwan.service.TokenService; import com.guwan.util.*; import io.swagger.v3.oas.annotations.Operation; import jakarta.annotation.security.PermitAll; import jakarta.servlet.http.HttpServletRequest; -import org.checkerframework.checker.units.qual.A; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PostMapping; @@ -23,7 +22,7 @@ import org.springframework.web.multipart.MultipartFile; import java.io.File; import java.io.IOException; -import java.nio.file.Path; +import java.util.ArrayList; import java.util.List; @RestController @@ -138,6 +137,27 @@ public class UserController { return voiceServiceClient.voiceToText(file, model); } + @GetMapping("/demoLogin") + public R demo888() { + System.out.println("tokenService = " + tokenService); + LoginSuccessInfo loginSuccessInfo = new LoginSuccessInfo(); + loginSuccessInfo.setAvatar("www.baidu.com"); + loginSuccessInfo.setUsername("zhangsan"); + loginSuccessInfo.setNickname("zhangsan"); + ArrayList roles = new ArrayList<>(); + roles.add("Admin"); + loginSuccessInfo.setRoles(roles); + ArrayList permissions = new ArrayList<>(); + permissions.add("*:*:*"); + loginSuccessInfo.setPermissions(permissions); + loginSuccessInfo.setAccessToken("123456"); + loginSuccessInfo.setRefreshToken("123456"); + loginSuccessInfo.setExpires("2024-08-09 12:55:32"); + return R.ok().put("data", loginSuccessInfo); + + + } + } diff --git a/login/src/main/java/com/guwan/controller/login/vo/LoginSuccessInfo.java b/login/src/main/java/com/guwan/controller/login/vo/LoginSuccessInfo.java new file mode 100644 index 0000000..dd8a82c --- /dev/null +++ b/login/src/main/java/com/guwan/controller/login/vo/LoginSuccessInfo.java @@ -0,0 +1,44 @@ +package com.guwan.controller.login.vo; + +import lombok.Data; +import lombok.experimental.Accessors; + +import java.util.List; + +@Data +@Accessors(chain = true) +public class LoginSuccessInfo { + /** + * 头像 + */ + private String avatar; + /** + * 用户名 + */ + private String username; + /** + * 昵称 + */ + private String nickname; + /** + * 用户角色权限 + */ + private List roles; + /** + * 操作权限 + */ + private List permissions; + /** + * 登录token + */ + private String accessToken; + /** + * 刷新token + */ + private String refreshToken; + /** + * token过期时间 + */ + private String expires; + +} diff --git a/login/src/main/java/com/guwan/mapdemo/SimpleDestination.java b/login/src/main/java/com/guwan/mapdemo/SimpleDestination.java deleted file mode 100644 index 9438e1b..0000000 --- a/login/src/main/java/com/guwan/mapdemo/SimpleDestination.java +++ /dev/null @@ -1,10 +0,0 @@ -package com.guwan.mapdemo; - -import lombok.Data; - -@Data -public class SimpleDestination { - private String name; - private String description; - // getters and setters -} \ No newline at end of file diff --git a/login/src/main/java/com/guwan/mapdemo/SimpleSource.java b/login/src/main/java/com/guwan/mapdemo/SimpleSource.java deleted file mode 100644 index fc4222a..0000000 --- a/login/src/main/java/com/guwan/mapdemo/SimpleSource.java +++ /dev/null @@ -1,16 +0,0 @@ -package com.guwan.mapdemo; - -import lombok.AllArgsConstructor; -import lombok.Data; -import lombok.NoArgsConstructor; - -@Data -@AllArgsConstructor -@NoArgsConstructor -public class SimpleSource { - private String name; - private String description; - - - // getters and setters -} \ No newline at end of file diff --git a/login/src/main/java/com/guwan/mapper/SystemMenuMapper.java b/login/src/main/java/com/guwan/mapper/SystemMenuMapper.java new file mode 100644 index 0000000..feaa0db --- /dev/null +++ b/login/src/main/java/com/guwan/mapper/SystemMenuMapper.java @@ -0,0 +1,21 @@ +package com.guwan.mapper; + +import com.github.yulichang.base.MPJBaseMapper; +import com.guwan.RBAC.SystemMenu; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import org.apache.ibatis.annotations.Mapper; + +/** +* @author 12455 +* @description 针对表【system_menu(菜单权限表)】的数据库操作Mapper +* @createDate 2024-11-13 15:58:26 +* @Entity generator.RBAC.SystemMenu +*/ +@Mapper +public interface SystemMenuMapper extends MPJBaseMapper { + +} + + + + diff --git a/login/src/main/java/com/guwan/mapper/SystemRoleMapper.java b/login/src/main/java/com/guwan/mapper/SystemRoleMapper.java new file mode 100644 index 0000000..cbe5c07 --- /dev/null +++ b/login/src/main/java/com/guwan/mapper/SystemRoleMapper.java @@ -0,0 +1,21 @@ +package com.guwan.mapper; + +import com.github.yulichang.base.MPJBaseMapper; +import com.guwan.RBAC.SystemRole; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import org.apache.ibatis.annotations.Mapper; + +/** +* @author 12455 +* @description 针对表【system_role(角色信息表)】的数据库操作Mapper +* @createDate 2024-11-13 15:58:26 +* @Entity generator.RBAC.SystemRole +*/ +@Mapper +public interface SystemRoleMapper extends MPJBaseMapper { + +} + + + + diff --git a/login/src/main/java/com/guwan/mapper/SystemRoleMenuMapper.java b/login/src/main/java/com/guwan/mapper/SystemRoleMenuMapper.java new file mode 100644 index 0000000..6141914 --- /dev/null +++ b/login/src/main/java/com/guwan/mapper/SystemRoleMenuMapper.java @@ -0,0 +1,21 @@ +package com.guwan.mapper; + +import com.github.yulichang.base.MPJBaseMapper; +import com.guwan.RBAC.SystemRoleMenu; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import org.apache.ibatis.annotations.Mapper; + +/** +* @author 12455 +* @description 针对表【system_role_menu(角色和菜单关联表)】的数据库操作Mapper +* @createDate 2024-11-13 15:58:26 +* @Entity generator.RBAC.SystemRoleMenu +*/ +@Mapper +public interface SystemRoleMenuMapper extends MPJBaseMapper { + +} + + + + diff --git a/login/src/main/java/com/guwan/mapper/SystemUserRoleMapper.java b/login/src/main/java/com/guwan/mapper/SystemUserRoleMapper.java new file mode 100644 index 0000000..f287770 --- /dev/null +++ b/login/src/main/java/com/guwan/mapper/SystemUserRoleMapper.java @@ -0,0 +1,21 @@ +package com.guwan.mapper; + +import com.github.yulichang.base.MPJBaseMapper; +import com.guwan.RBAC.SystemUserRole; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import org.apache.ibatis.annotations.Mapper; + +/** +* @author 12455 +* @description 针对表【system_user_role(用户和角色关联表)】的数据库操作Mapper +* @createDate 2024-11-13 15:58:26 +* @Entity generator.RBAC.SystemUserRole +*/ +@Mapper +public interface SystemUserRoleMapper extends MPJBaseMapper { + +} + + + + diff --git a/login/src/main/java/com/guwan/mapper/SystemUsersMapper.java b/login/src/main/java/com/guwan/mapper/SystemUsersMapper.java new file mode 100644 index 0000000..87a83df --- /dev/null +++ b/login/src/main/java/com/guwan/mapper/SystemUsersMapper.java @@ -0,0 +1,21 @@ +package com.guwan.mapper; + +import com.github.yulichang.base.MPJBaseMapper; +import com.guwan.RBAC.SystemUsers; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import org.apache.ibatis.annotations.Mapper; + +/** +* @author 12455 +* @description 针对表【system_users(用户信息表)】的数据库操作Mapper +* @createDate 2024-11-13 15:58:26 +* @Entity generator.RBAC.SystemUsers +*/ +@Mapper +public interface SystemUsersMapper extends MPJBaseMapper { + +} + + + + diff --git a/login/src/main/java/com/guwan/mapstruct/Employee.java b/login/src/main/java/com/guwan/mapstruct/Employee.java new file mode 100644 index 0000000..e86a157 --- /dev/null +++ b/login/src/main/java/com/guwan/mapstruct/Employee.java @@ -0,0 +1,17 @@ +package com.guwan.mapstruct; + +import lombok.Getter; +import lombok.Setter; +import org.springframework.web.bind.annotation.GetMapping; + + +@Setter +@Getter +public class Employee { + + private int id; + private String name; + // getters and setters + + +} diff --git a/login/src/main/java/com/guwan/mapstruct/EmployeeDTO.java b/login/src/main/java/com/guwan/mapstruct/EmployeeDTO.java new file mode 100644 index 0000000..b4f1bdf --- /dev/null +++ b/login/src/main/java/com/guwan/mapstruct/EmployeeDTO.java @@ -0,0 +1,25 @@ +package com.guwan.mapstruct; + +public class EmployeeDTO { + + private int employeeId; + private String employeeName; + // getters and setters + + + public int getEmployeeId() { + return employeeId; + } + + public void setEmployeeId(int employeeId) { + this.employeeId = employeeId; + } + + public String getEmployeeName() { + return employeeName; + } + + public void setEmployeeName(String employeeName) { + this.employeeName = employeeName; + } +} diff --git a/login/src/main/java/com/guwan/mapstruct/EmployeeMapper.java b/login/src/main/java/com/guwan/mapstruct/EmployeeMapper.java new file mode 100644 index 0000000..868454d --- /dev/null +++ b/login/src/main/java/com/guwan/mapstruct/EmployeeMapper.java @@ -0,0 +1,16 @@ +package com.guwan.mapstruct; + +import org.mapstruct.Mapper; +import org.mapstruct.Mapping; + +@Mapper +public interface EmployeeMapper { + + @Mapping(target = "employeeId", source = "id") + @Mapping(target = "employeeName", source = "name") + EmployeeDTO employeeToEmployeeDTO(Employee entity); + + @Mapping(target = "id", source = "employeeId") + @Mapping(target = "name", source = "employeeName") + Employee employeeDTOtoEmployee(EmployeeDTO dto); +} diff --git a/login/src/main/java/com/guwan/mapstruct/SimpleDestination.java b/login/src/main/java/com/guwan/mapstruct/SimpleDestination.java new file mode 100644 index 0000000..23dc8c7 --- /dev/null +++ b/login/src/main/java/com/guwan/mapstruct/SimpleDestination.java @@ -0,0 +1,13 @@ +package com.guwan.mapstruct; + +import lombok.Data; +import lombok.Getter; +import lombok.Setter; + +@Getter +@Setter +public class SimpleDestination { + private String nameGu; + private String description; + // getters and setters +} \ No newline at end of file diff --git a/login/src/main/java/com/guwan/mapstruct/SimpleSource.java b/login/src/main/java/com/guwan/mapstruct/SimpleSource.java new file mode 100644 index 0000000..c771a09 --- /dev/null +++ b/login/src/main/java/com/guwan/mapstruct/SimpleSource.java @@ -0,0 +1,32 @@ +package com.guwan.mapstruct; + +import lombok.*; + +@Getter +@Setter +@AllArgsConstructor +@NoArgsConstructor +public class SimpleSource { + private String nameHu; + private String description; + + + // getters and setters + + + public String getNameHu() { + return nameHu; + } + + public void setNameHu(String nameHu) { + this.nameHu = nameHu; + } + + public String getDescription() { + return description; + } + + public void setDescription(String description) { + this.description = description; + } +} \ No newline at end of file diff --git a/login/src/main/java/com/guwan/mapdemo/SimpleSourceDestinationMapper.java b/login/src/main/java/com/guwan/mapstruct/SimpleSourceDestinationMapper.java similarity index 58% rename from login/src/main/java/com/guwan/mapdemo/SimpleSourceDestinationMapper.java rename to login/src/main/java/com/guwan/mapstruct/SimpleSourceDestinationMapper.java index b8d952f..c64b8fa 100644 --- a/login/src/main/java/com/guwan/mapdemo/SimpleSourceDestinationMapper.java +++ b/login/src/main/java/com/guwan/mapstruct/SimpleSourceDestinationMapper.java @@ -1,10 +1,14 @@ -package com.guwan.mapdemo; +package com.guwan.mapstruct; import org.mapstruct.Mapper; +import org.mapstruct.Mapping; @Mapper(componentModel = "spring") public interface SimpleSourceDestinationMapper { + + @Mapping(target = "nameGu", source = "source.nameHu") SimpleDestination sourceToDestination(SimpleSource source); + @Mapping(target = "nameHu", source = "destination.nameGu") SimpleSource destinationToSource(SimpleDestination destination); } diff --git a/login/src/main/java/com/guwan/service/SystemMenuService.java b/login/src/main/java/com/guwan/service/SystemMenuService.java new file mode 100644 index 0000000..ff2507a --- /dev/null +++ b/login/src/main/java/com/guwan/service/SystemMenuService.java @@ -0,0 +1,13 @@ +package service; + +import com.guwan.RBAC.SystemMenu; +import com.baomidou.mybatisplus.extension.service.IService; + +/** +* @author 12455 +* @description 针对表【system_menu(菜单权限表)】的数据库操作Service +* @createDate 2024-11-13 15:58:26 +*/ +public interface SystemMenuService extends IService { + +} diff --git a/login/src/main/java/com/guwan/service/SystemRoleMenuService.java b/login/src/main/java/com/guwan/service/SystemRoleMenuService.java new file mode 100644 index 0000000..aa2e528 --- /dev/null +++ b/login/src/main/java/com/guwan/service/SystemRoleMenuService.java @@ -0,0 +1,13 @@ +package service; + +import com.guwan.RBAC.SystemRoleMenu; +import com.baomidou.mybatisplus.extension.service.IService; + +/** +* @author 12455 +* @description 针对表【system_role_menu(角色和菜单关联表)】的数据库操作Service +* @createDate 2024-11-13 15:58:26 +*/ +public interface SystemRoleMenuService extends IService { + +} diff --git a/login/src/main/java/com/guwan/service/SystemRoleService.java b/login/src/main/java/com/guwan/service/SystemRoleService.java new file mode 100644 index 0000000..f0e5ad1 --- /dev/null +++ b/login/src/main/java/com/guwan/service/SystemRoleService.java @@ -0,0 +1,13 @@ +package service; + +import com.guwan.RBAC.SystemRole; +import com.baomidou.mybatisplus.extension.service.IService; + +/** +* @author 12455 +* @description 针对表【system_role(角色信息表)】的数据库操作Service +* @createDate 2024-11-13 15:58:26 +*/ +public interface SystemRoleService extends IService { + +} diff --git a/login/src/main/java/com/guwan/service/SystemUserRoleService.java b/login/src/main/java/com/guwan/service/SystemUserRoleService.java new file mode 100644 index 0000000..643951a --- /dev/null +++ b/login/src/main/java/com/guwan/service/SystemUserRoleService.java @@ -0,0 +1,13 @@ +package service; + +import com.guwan.RBAC.SystemUserRole; +import com.baomidou.mybatisplus.extension.service.IService; + +/** +* @author 12455 +* @description 针对表【system_user_role(用户和角色关联表)】的数据库操作Service +* @createDate 2024-11-13 15:58:26 +*/ +public interface SystemUserRoleService extends IService { + +} diff --git a/login/src/main/java/com/guwan/service/SystemUsersService.java b/login/src/main/java/com/guwan/service/SystemUsersService.java new file mode 100644 index 0000000..e11105a --- /dev/null +++ b/login/src/main/java/com/guwan/service/SystemUsersService.java @@ -0,0 +1,16 @@ +package service; + +import com.guwan.RBAC.SystemUsers; +import com.baomidou.mybatisplus.extension.service.IService; + +/** +* @author 12455 +* @description 针对表【system_users(用户信息表)】的数据库操作Service +* @createDate 2024-11-13 15:58:26 +*/ +public interface SystemUsersService extends IService { + + + public void getRouterAsync(); + +} diff --git a/login/src/main/java/com/guwan/service/impl/SystemMenuServiceImpl.java b/login/src/main/java/com/guwan/service/impl/SystemMenuServiceImpl.java new file mode 100644 index 0000000..22ce038 --- /dev/null +++ b/login/src/main/java/com/guwan/service/impl/SystemMenuServiceImpl.java @@ -0,0 +1,23 @@ +package service.impl; + +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.guwan.RBAC.SystemMenu; +import com.guwan.mapper.SystemMenuMapper; +import service.SystemMenuService; + +import org.springframework.stereotype.Service; + +/** +* @author 12455 +* @description 针对表【system_menu(菜单权限表)】的数据库操作Service实现 +* @createDate 2024-11-13 15:58:26 +*/ +@Service +public class SystemMenuServiceImpl extends ServiceImpl + implements SystemMenuService{ + +} + + + + diff --git a/login/src/main/java/com/guwan/service/impl/SystemRoleMenuServiceImpl.java b/login/src/main/java/com/guwan/service/impl/SystemRoleMenuServiceImpl.java new file mode 100644 index 0000000..65a92d6 --- /dev/null +++ b/login/src/main/java/com/guwan/service/impl/SystemRoleMenuServiceImpl.java @@ -0,0 +1,26 @@ +package com.guwan.service.impl; + + +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.guwan.RBAC.SystemRoleMenu; +import com.guwan.mapper.SystemRoleMenuMapper; +import service.SystemRoleMenuService; + +import org.springframework.stereotype.Service; + +/** +* @author 12455 +* @description 针对表【system_role_menu(角色和菜单关联表)】的数据库操作Service实现 +* @createDate 2024-11-13 15:58:26 +*/ +@Service +public class SystemRoleMenuServiceImpl extends ServiceImpl + implements SystemRoleMenuService{ + + + +} + + + + diff --git a/login/src/main/java/com/guwan/service/impl/SystemRoleServiceImpl.java b/login/src/main/java/com/guwan/service/impl/SystemRoleServiceImpl.java new file mode 100644 index 0000000..0a30a3e --- /dev/null +++ b/login/src/main/java/com/guwan/service/impl/SystemRoleServiceImpl.java @@ -0,0 +1,23 @@ +package com.guwan.service.impl; + +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.guwan.RBAC.SystemRole; +import com.guwan.mapper.SystemRoleMapper; +import service.SystemRoleService; + +import org.springframework.stereotype.Service; + +/** +* @author 12455 +* @description 针对表【system_role(角色信息表)】的数据库操作Service实现 +* @createDate 2024-11-13 15:58:26 +*/ +@Service +public class SystemRoleServiceImpl extends ServiceImpl + implements SystemRoleService{ + +} + + + + diff --git a/login/src/main/java/com/guwan/service/impl/SystemUserRoleServiceImpl.java b/login/src/main/java/com/guwan/service/impl/SystemUserRoleServiceImpl.java new file mode 100644 index 0000000..1d027fd --- /dev/null +++ b/login/src/main/java/com/guwan/service/impl/SystemUserRoleServiceImpl.java @@ -0,0 +1,23 @@ +package com.guwan.service.impl; + +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.guwan.RBAC.SystemUserRole; +import com.guwan.mapper.SystemUserRoleMapper; +import service.SystemUserRoleService; + +import org.springframework.stereotype.Service; + +/** +* @author 12455 +* @description 针对表【system_user_role(用户和角色关联表)】的数据库操作Service实现 +* @createDate 2024-11-13 15:58:26 +*/ +@Service +public class SystemUserRoleServiceImpl extends ServiceImpl + implements SystemUserRoleService{ + +} + + + + diff --git a/login/src/main/java/com/guwan/service/impl/SystemUsersServiceImpl.java b/login/src/main/java/com/guwan/service/impl/SystemUsersServiceImpl.java new file mode 100644 index 0000000..2105a17 --- /dev/null +++ b/login/src/main/java/com/guwan/service/impl/SystemUsersServiceImpl.java @@ -0,0 +1,105 @@ +package com.guwan.service.impl; + +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.guwan.RBAC.*; +import com.guwan.mapper.*; +import lombok.RequiredArgsConstructor; + +import org.springframework.stereotype.Service; +import service.SystemUsersService; + +import java.util.List; + +/** +* @author 12455 +* @description 针对表【system_users(用户信息表)】的数据库操作Service实现 +* @createDate 2024-11-13 15:58:26 +*/ +@Service +@RequiredArgsConstructor +public class SystemUsersServiceImpl extends ServiceImpl + implements SystemUsersService{ + + + private final SystemUsersMapper systemUsersMapper; + + private final SystemUserRoleMapper systemUserRoleMapper; + //system_role_menu + private final SystemRoleMenuMapper systemRoleMenuMapper; + private final SystemMenuMapper systemMenuMapper; + private final SystemRoleMapper systemRoleMapper; + + + @Override + public void getRouterAsync() { + + + /* List roleList = ; + + + System.out.println("角色list = " + roleList); + + //SELECT * FROM system_menu WHERE id in (SELECT menu_id FROM system_role_menu where role_id in (101, 1 ,2)) + + List menuList = ; + + System.out.println("menuList = " + menuList);*/ + + + List roleList = systemUserRoleMapper + .selectObjs(new LambdaQueryWrapper() + .eq(SystemUserRole::getUserId, + systemUsersMapper.selectOne(new LambdaQueryWrapper() + .eq(SystemUsers::getUsername, "yudao")) + .getId()).select(SystemUserRole::getRoleId)); + + System.out.println("roleList = " + roleList); + + + List roleName = systemRoleMapper.selectObjs(new LambdaQueryWrapper() + .in(SystemRole::getId, roleList).select(SystemRole::getCode)); + + System.out.println("roleName = " + roleName); + + + List systemMenus = systemMenuMapper + .selectList(new LambdaQueryWrapper() + .in(SystemMenu::getId, systemRoleMenuMapper + .selectObjs(new LambdaQueryWrapper() + .in(SystemRoleMenu::getRoleId, systemUserRoleMapper + .selectObjs(new LambdaQueryWrapper() + .eq(SystemUserRole::getUserId, + systemUsersMapper.selectOne(new LambdaQueryWrapper() + .eq(SystemUsers::getUsername, "yudao")) + .getId()).select(SystemUserRole::getRoleId))) + .select(SystemRoleMenu::getMenuId)))); + + // System.out.println("systemMenus = " + systemMenus); + + systemMenus.stream().filter(systemMenu -> !systemMenu.getDeleted() && systemMenu.getVisible()) + .map(systemMenu -> { + + // 角色码列表 + List roleCodeList; + roleCodeList = roleName; + + // 权限码列表 + List powerCodeList; + + + RouterMeta meta = new RouterMeta(); + + + return null; + + }).distinct().toList(); + + + + } +} + + + + diff --git a/login/src/main/java/com/guwan/util/ToTextExample.java b/login/src/main/java/com/guwan/util/ToTextExample.java index d053b22..c75ebbf 100644 --- a/login/src/main/java/com/guwan/util/ToTextExample.java +++ b/login/src/main/java/com/guwan/util/ToTextExample.java @@ -18,6 +18,10 @@ import org.springframework.web.client.RestTemplate; import java.io.InputStream; + +/** + * 语音转文本1 + */ @Component public class ToTextExample { @@ -55,10 +59,10 @@ public class ToTextExample { System.out.println(text); return text; } else { - System.out.println("1111"); + System.out.println("识别发生错误"); } } catch (Exception e) { - System.out.println("2222"); + System.out.println("识别发生错误"); } return "识别发生错误!"; } diff --git a/login/src/main/java/com/guwan/ws/VoiceWebSocketServer.java b/login/src/main/java/com/guwan/ws/VoiceWebSocketServer.java new file mode 100644 index 0000000..df9c0ef --- /dev/null +++ b/login/src/main/java/com/guwan/ws/VoiceWebSocketServer.java @@ -0,0 +1,50 @@ +package com.guwan.ws; + +import jakarta.websocket.*; +import jakarta.websocket.server.PathParam; +import jakarta.websocket.server.ServerEndpoint; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Component; + +import java.nio.ByteBuffer; + +@Slf4j +@Component +@ServerEndpoint(value = "/ws/voice") +public class VoiceWebSocketServer { + + @OnOpen + public void onOpen(Session session) { + log.info("WebSocket 连接已建立,session ID: {}", session.getId()); + } + + @OnMessage + public void onMessage(Session session, String audioData) { + System.out.println("WebSocket 连接已处理 = " + session); + sendMessage(session, audioData); + } + + @OnClose + public void onClose(Session session) { + log.info("WebSocket 连接已关闭,session ID: {}", session.getId()); + } + + @OnError + public void onError(Throwable error) { + log.error("onError", error); + } + + private void sendMessage(Session session, String text) { + try { + session.getBasicRemote().sendText(text); + } catch (Exception e) { + log.error("Error sending message", e); + } + } + + // 语音识别服务方法(示例) + private String transcribeAudio() { + // 模拟的语音识别 + return "识别到的文本内容"; + } +} diff --git a/pom.xml b/pom.xml index fbd9414..c9120b0 100644 --- a/pom.xml +++ b/pom.xml @@ -119,6 +119,12 @@ 6.1.0 + + com.github.yulichang + mybatis-plus-join-boot-starter + 1.5.0 + + diff --git a/qrcode.png b/qrcode.png index 970739f08acc5faffbf9b7350c0cb17de95c9b9f..cccf5b753b9f05691e7051ec5d6c1118596805d9 100644 GIT binary patch literal 13819 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 F{{RoCl~Diy literal 5002 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 diff --git a/src/main/java/com/guwan/generator/RBAC/SystemMenu.java b/src/main/java/com/guwan/generator/RBAC/SystemMenu.java new file mode 100644 index 0000000..e69de29 diff --git a/src/main/java/com/guwan/generator/RBAC/SystemRole.java b/src/main/java/com/guwan/generator/RBAC/SystemRole.java new file mode 100644 index 0000000..e69de29 diff --git a/src/main/java/com/guwan/generator/RBAC/SystemRoleMenu.java b/src/main/java/com/guwan/generator/RBAC/SystemRoleMenu.java new file mode 100644 index 0000000..e69de29 diff --git a/src/main/java/com/guwan/generator/RBAC/SystemUserRole.java b/src/main/java/com/guwan/generator/RBAC/SystemUserRole.java new file mode 100644 index 0000000..e69de29 diff --git a/src/main/java/com/guwan/generator/RBAC/SystemUsers.java b/src/main/java/com/guwan/generator/RBAC/SystemUsers.java new file mode 100644 index 0000000..e69de29 diff --git a/src/main/java/com/guwan/generator/mapper/SystemMenuMapper.java b/src/main/java/com/guwan/generator/mapper/SystemMenuMapper.java new file mode 100644 index 0000000..e69de29 diff --git a/src/main/java/com/guwan/generator/mapper/SystemRoleMapper.java b/src/main/java/com/guwan/generator/mapper/SystemRoleMapper.java new file mode 100644 index 0000000..e69de29 diff --git a/src/main/java/com/guwan/generator/mapper/SystemRoleMenuMapper.java b/src/main/java/com/guwan/generator/mapper/SystemRoleMenuMapper.java new file mode 100644 index 0000000..e69de29 diff --git a/src/main/java/com/guwan/generator/mapper/SystemUserRoleMapper.java b/src/main/java/com/guwan/generator/mapper/SystemUserRoleMapper.java new file mode 100644 index 0000000..e69de29 diff --git a/src/main/java/com/guwan/generator/mapper/SystemUsersMapper.java b/src/main/java/com/guwan/generator/mapper/SystemUsersMapper.java new file mode 100644 index 0000000..e69de29 diff --git a/src/main/java/com/guwan/generator/service/SystemMenuService.java b/src/main/java/com/guwan/generator/service/SystemMenuService.java new file mode 100644 index 0000000..e69de29 diff --git a/src/main/java/com/guwan/generator/service/SystemRoleMenuService.java b/src/main/java/com/guwan/generator/service/SystemRoleMenuService.java new file mode 100644 index 0000000..e69de29 diff --git a/src/main/java/com/guwan/generator/service/SystemRoleService.java b/src/main/java/com/guwan/generator/service/SystemRoleService.java new file mode 100644 index 0000000..e69de29 diff --git a/src/main/java/com/guwan/generator/service/SystemUserRoleService.java b/src/main/java/com/guwan/generator/service/SystemUserRoleService.java new file mode 100644 index 0000000..e69de29 diff --git a/src/main/java/com/guwan/generator/service/SystemUsersService.java b/src/main/java/com/guwan/generator/service/SystemUsersService.java new file mode 100644 index 0000000..e69de29 diff --git a/src/main/java/com/guwan/generator/service/impl/SystemMenuServiceImpl.java b/src/main/java/com/guwan/generator/service/impl/SystemMenuServiceImpl.java new file mode 100644 index 0000000..e69de29 diff --git a/src/main/java/com/guwan/generator/service/impl/SystemRoleMenuServiceImpl.java b/src/main/java/com/guwan/generator/service/impl/SystemRoleMenuServiceImpl.java new file mode 100644 index 0000000..e69de29 diff --git a/src/main/java/com/guwan/generator/service/impl/SystemRoleServiceImpl.java b/src/main/java/com/guwan/generator/service/impl/SystemRoleServiceImpl.java new file mode 100644 index 0000000..e69de29 diff --git a/src/main/java/com/guwan/generator/service/impl/SystemUserRoleServiceImpl.java b/src/main/java/com/guwan/generator/service/impl/SystemUserRoleServiceImpl.java new file mode 100644 index 0000000..e69de29 diff --git a/src/main/java/com/guwan/generator/service/impl/SystemUsersServiceImpl.java b/src/main/java/com/guwan/generator/service/impl/SystemUsersServiceImpl.java new file mode 100644 index 0000000..e69de29 diff --git a/src/main/resources/mapper/SystemMenuMapper.xml b/src/main/resources/mapper/SystemMenuMapper.xml new file mode 100644 index 0000000..6eeb134 --- /dev/null +++ b/src/main/resources/mapper/SystemMenuMapper.xml @@ -0,0 +1,38 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + id,name,permission, + type,sort,parent_id, + path,icon,component, + component_name,status,visible, + keep_alive,always_show,creator, + create_time,updater,update_time, + deleted + + diff --git a/src/main/resources/mapper/SystemRoleMapper.xml b/src/main/resources/mapper/SystemRoleMapper.xml new file mode 100644 index 0000000..9d9fbd3 --- /dev/null +++ b/src/main/resources/mapper/SystemRoleMapper.xml @@ -0,0 +1,32 @@ + + + + + + + + + + + + + + + + + + + + + + + + id,name,code, + sort,data_scope,data_scope_dept_ids, + status,type,remark, + creator,create_time,updater, + update_time,deleted,tenant_id + + diff --git a/src/main/resources/mapper/SystemRoleMenuMapper.xml b/src/main/resources/mapper/SystemRoleMenuMapper.xml new file mode 100644 index 0000000..baed255 --- /dev/null +++ b/src/main/resources/mapper/SystemRoleMenuMapper.xml @@ -0,0 +1,24 @@ + + + + + + + + + + + + + + + + + + id,role_id,menu_id, + creator,create_time,updater, + update_time,deleted,tenant_id + + diff --git a/src/main/resources/mapper/SystemUserRoleMapper.xml b/src/main/resources/mapper/SystemUserRoleMapper.xml new file mode 100644 index 0000000..ba87ad1 --- /dev/null +++ b/src/main/resources/mapper/SystemUserRoleMapper.xml @@ -0,0 +1,24 @@ + + + + + + + + + + + + + + + + + + id,user_id,role_id, + creator,create_time,updater, + update_time,deleted,tenant_id + + diff --git a/src/main/resources/mapper/SystemUsersMapper.xml b/src/main/resources/mapper/SystemUsersMapper.xml new file mode 100644 index 0000000..faf3e38 --- /dev/null +++ b/src/main/resources/mapper/SystemUsersMapper.xml @@ -0,0 +1,39 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + id,username,password, + nickname,remark,dept_id, + post_ids,email,mobile, + sex,avatar,status, + login_ip,login_date,creator, + create_time,updater,update_time, + deleted,tenant_id + +