mirror of https://gitee.com/stylefeng/roses
Merge branch '7.0.2-develop' of https://gitee.com/18idc/roses into 7.0.2-develop-encryption
commit
961ace3f2c
|
@ -32,7 +32,7 @@ import java.util.List;
|
|||
* @author fengshuonan
|
||||
* @date 2020/10/15 14:31
|
||||
*/
|
||||
public interface AbstractTreeNode {
|
||||
public interface AbstractTreeNode<T> {
|
||||
|
||||
/**
|
||||
* 获取节点id
|
||||
|
@ -59,6 +59,6 @@ public interface AbstractTreeNode {
|
|||
* @author fengshuonan
|
||||
* @date 2020/10/15 15:28
|
||||
*/
|
||||
void setChildrenNodes(List childrenNodes);
|
||||
void setChildrenNodes(List<T> childrenNodes);
|
||||
|
||||
}
|
||||
|
|
|
@ -39,7 +39,7 @@ import java.util.List;
|
|||
* @date 2020/10/15 14:39
|
||||
*/
|
||||
@Data
|
||||
public class DefaultTreeNode implements AbstractTreeNode {
|
||||
public class DefaultTreeNode implements AbstractTreeNode<DefaultTreeNode> {
|
||||
|
||||
/**
|
||||
* 节点id
|
||||
|
@ -87,7 +87,7 @@ public class DefaultTreeNode implements AbstractTreeNode {
|
|||
}
|
||||
|
||||
@Override
|
||||
public void setChildrenNodes(List childrenNodes) {
|
||||
public void setChildrenNodes(List<DefaultTreeNode> childrenNodes) {
|
||||
this.children = childrenNodes;
|
||||
}
|
||||
|
||||
|
|
|
@ -41,7 +41,7 @@ import java.util.List;
|
|||
*/
|
||||
@ToString
|
||||
@EqualsAndHashCode
|
||||
public class ZTreeNode implements AbstractTreeNode {
|
||||
public class ZTreeNode implements AbstractTreeNode<ZTreeNode> {
|
||||
|
||||
/**
|
||||
* 节点id
|
||||
|
@ -88,7 +88,7 @@ public class ZTreeNode implements AbstractTreeNode {
|
|||
*/
|
||||
@Getter
|
||||
@Setter
|
||||
private List children;
|
||||
private List<ZTreeNode> children;
|
||||
|
||||
/**
|
||||
* 创建ztree的父级节点
|
||||
|
@ -118,7 +118,7 @@ public class ZTreeNode implements AbstractTreeNode {
|
|||
}
|
||||
|
||||
@Override
|
||||
public void setChildrenNodes(List childrenNodes) {
|
||||
public void setChildrenNodes(List<ZTreeNode> childrenNodes) {
|
||||
this.children = childrenNodes;
|
||||
}
|
||||
|
||||
|
|
|
@ -45,10 +45,11 @@ public interface SessionManagerApi {
|
|||
*
|
||||
* @param token 用户登录的token
|
||||
* @param loginUser 登录的用户
|
||||
* @param loginUser 登录的用户
|
||||
* @author fengshuonan
|
||||
* @date 2020/10/19 16:47
|
||||
*/
|
||||
void createSession(String token, LoginUser loginUser);
|
||||
void createSession(String token, LoginUser loginUser, Boolean createCookie);
|
||||
|
||||
/**
|
||||
* 更新当前会话的loginUser对象的内容
|
||||
|
|
|
@ -134,24 +134,6 @@ public class AuthConfigExpander {
|
|||
return ConfigContext.me().getSysConfigValueWithDefault("SYS_AUTH_PARAM_NAME", String.class, DEFAULT_AUTH_PARAM_NAME);
|
||||
}
|
||||
|
||||
/**
|
||||
* 会话信息是否增加保存在 cookie 中
|
||||
* <p>
|
||||
* 如果开启此开关,会发生两件事:
|
||||
* <p>
|
||||
* 1.则登录过程中创建会话时,会HttpServletResponse对象进行addCookie()操作
|
||||
* <p>
|
||||
* 2.获取当前用户token会多一个从cookie中获取token这个方式
|
||||
* <p>
|
||||
* 一般这个开关的开启,用在单体不分离的版本中
|
||||
*
|
||||
* @author fengshuonan
|
||||
* @date 2020/12/27 13:15
|
||||
*/
|
||||
public static Boolean getSessionAddToCookie() {
|
||||
return ConfigContext.me().getSysConfigValueWithDefault("SYS_SESSION_ADD_TO_COOKIE", Boolean.class, Boolean.FALSE);
|
||||
}
|
||||
|
||||
/**
|
||||
* 会话保存在cookie中时,cooke的name
|
||||
*
|
||||
|
|
|
@ -67,4 +67,9 @@ public class LoginRequest extends BaseRequest {
|
|||
*/
|
||||
private String verCode;
|
||||
|
||||
/**
|
||||
* 是否写入cookie会话信息
|
||||
*/
|
||||
private Boolean createCookie = false;
|
||||
|
||||
}
|
||||
|
|
|
@ -155,24 +155,6 @@ public class AuthServiceImpl implements AuthServiceApi {
|
|||
// 2. 校验用户token是否正确,校验失败会抛出异常
|
||||
this.validateToken(token);
|
||||
|
||||
// 3. 如果token校验通过,获取token的payload,以及是否开启了记住我功能
|
||||
DefaultJwtPayload defaultPayload = JwtContext.me().getDefaultPayload(token);
|
||||
Boolean rememberMe = defaultPayload.getRememberMe();
|
||||
|
||||
// 4. 获取用户的当前会话信息
|
||||
LoginUser loginUser = sessionManagerApi.getSession(token);
|
||||
|
||||
// 5. 如果开了记住我,但是会话为空,则创建一次会话信息
|
||||
if (rememberMe && loginUser == null) {
|
||||
UserLoginInfoDTO userLoginInfo = userServiceApi.getUserLoginInfo(defaultPayload.getAccount());
|
||||
sessionManagerApi.createSession(token, userLoginInfo.getLoginUser());
|
||||
}
|
||||
|
||||
// 6. 如果会话信息为空,则判定此次校验失败
|
||||
if (loginUser == null) {
|
||||
throw new AuthException(AUTH_EXPIRED_ERROR);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -234,6 +216,7 @@ public class AuthServiceImpl implements AuthServiceApi {
|
|||
// 8. 生成用户的token
|
||||
DefaultJwtPayload defaultJwtPayload = new DefaultJwtPayload(loginUser.getUserId(), loginUser.getAccount(), loginRequest.getRememberMe());
|
||||
String jwtToken = JwtContext.me().generateTokenDefaultPayload(defaultJwtPayload);
|
||||
loginUser.setToken(jwtToken);
|
||||
|
||||
synchronized (SESSION_OPERATE_LOCK) {
|
||||
|
||||
|
@ -241,7 +224,7 @@ public class AuthServiceImpl implements AuthServiceApi {
|
|||
loginUser.setWsUrl(WebSocketConfigExpander.getWebSocketWsUrl());
|
||||
|
||||
// 9. 缓存用户信息,创建会话
|
||||
sessionManagerApi.createSession(jwtToken, loginUser);
|
||||
sessionManagerApi.createSession(jwtToken, loginUser, loginRequest.getCreateCookie());
|
||||
|
||||
// 10. 如果开启了单账号单端在线,则踢掉已经上线的该用户
|
||||
if (AuthConfigExpander.getSingleAccountLoginFlag()) {
|
||||
|
|
|
@ -72,17 +72,15 @@ public class LoginUserImpl implements LoginUserApi {
|
|||
}
|
||||
|
||||
// 3. 从cookie中获取token
|
||||
if (AuthConfigExpander.getSessionAddToCookie()) {
|
||||
String sessionCookieName = AuthConfigExpander.getSessionCookieName();
|
||||
Cookie[] cookies = request.getCookies();
|
||||
if (cookies != null && cookies.length > 0) {
|
||||
for (Cookie cookie : cookies) {
|
||||
String sessionCookieName = AuthConfigExpander.getSessionCookieName();
|
||||
Cookie[] cookies = request.getCookies();
|
||||
if (cookies != null && cookies.length > 0) {
|
||||
for (Cookie cookie : cookies) {
|
||||
|
||||
// 如果cookie有对应的值,并且不为空
|
||||
if (sessionCookieName.equals(cookie.getName())
|
||||
&& StrUtil.isNotBlank(cookie.getValue())) {
|
||||
return cookie.getValue();
|
||||
}
|
||||
// 如果cookie有对应的值,并且不为空
|
||||
if (sessionCookieName.equals(cookie.getName())
|
||||
&& StrUtil.isNotBlank(cookie.getValue())) {
|
||||
return cookie.getValue();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -83,7 +83,7 @@ public class DefaultSessionManager implements SessionManagerApi {
|
|||
}
|
||||
|
||||
@Override
|
||||
public void createSession(String token, LoginUser loginUser) {
|
||||
public void createSession(String token, LoginUser loginUser, Boolean createCookie) {
|
||||
|
||||
// 装配用户信息的缓存
|
||||
loginUserCache.put(token, loginUser, sessionExpiredSeconds);
|
||||
|
@ -97,7 +97,7 @@ public class DefaultSessionManager implements SessionManagerApi {
|
|||
allPlaceLoginTokenCache.put(loginUser.getUserId().toString(), theUserTokens);
|
||||
|
||||
// 如果开启了cookie存储会话信息,则需要给HttpServletResponse添加一个cookie
|
||||
if (AuthConfigExpander.getSessionAddToCookie()) {
|
||||
if (createCookie) {
|
||||
String sessionCookieName = AuthConfigExpander.getSessionCookieName();
|
||||
Cookie cookie = sessionCookieCreator.createCookie(sessionCookieName, token, Convert.toInt(AuthConfigExpander.getAuthJwtTimeoutSeconds()));
|
||||
HttpServletResponse response = HttpServletUtil.getResponse();
|
||||
|
@ -193,12 +193,10 @@ public class DefaultSessionManager implements SessionManagerApi {
|
|||
@Override
|
||||
public void destroySessionCookie() {
|
||||
// 如果开启了cookie存储会话信息,则需要给HttpServletResponse添加一个cookie
|
||||
if (AuthConfigExpander.getSessionAddToCookie()) {
|
||||
String sessionCookieName = AuthConfigExpander.getSessionCookieName();
|
||||
Cookie cookie = sessionCookieCreator.createCookie(sessionCookieName, null, 0);
|
||||
HttpServletResponse response = HttpServletUtil.getResponse();
|
||||
response.addCookie(cookie);
|
||||
}
|
||||
String sessionCookieName = AuthConfigExpander.getSessionCookieName();
|
||||
Cookie cookie = sessionCookieCreator.createCookie(sessionCookieName, null, 0);
|
||||
HttpServletResponse response = HttpServletUtil.getResponse();
|
||||
response.addCookie(cookie);
|
||||
}
|
||||
|
||||
@Override
|
||||
|
|
|
@ -38,7 +38,7 @@ import java.util.List;
|
|||
* @date 2020/10/30 11:05
|
||||
*/
|
||||
@Data
|
||||
public class TreeDictInfo implements AbstractTreeNode {
|
||||
public class TreeDictInfo implements AbstractTreeNode<TreeDictInfo> {
|
||||
|
||||
/**
|
||||
* 字典id
|
||||
|
@ -84,7 +84,7 @@ public class TreeDictInfo implements AbstractTreeNode {
|
|||
}
|
||||
|
||||
@Override
|
||||
public void setChildrenNodes(List linkedList) {
|
||||
public void setChildrenNodes(List<TreeDictInfo> linkedList) {
|
||||
this.children = linkedList;
|
||||
}
|
||||
|
||||
|
|
File diff suppressed because one or more lines are too long
|
@ -1,15 +0,0 @@
|
|||
-- 分离版本唯一区别是这个配置的值是false
|
||||
UPDATE `sys_config`
|
||||
SET `config_name` = '会话信息是否增加保存在cookie中',
|
||||
`config_code` = 'SYS_SESSION_ADD_TO_COOKIE',
|
||||
`config_value` = 'false',
|
||||
`sys_flag` = 'Y',
|
||||
`remark` = NULL,
|
||||
`status_flag` = 1,
|
||||
`group_code` = 'auth_config',
|
||||
`del_flag` = 'N',
|
||||
`create_time` = NULL,
|
||||
`create_user` = NULL,
|
||||
`update_time` = NULL,
|
||||
`update_user` = NULL
|
||||
WHERE `config_id` = 13;
|
|
@ -37,7 +37,7 @@ import java.util.List;
|
|||
* @date 2020/4/5 12:03
|
||||
*/
|
||||
@Data
|
||||
public class AntdMenuSelectTreeNode implements AbstractTreeNode {
|
||||
public class AntdMenuSelectTreeNode implements AbstractTreeNode<AntdMenuSelectTreeNode> {
|
||||
|
||||
/**
|
||||
* 主键
|
||||
|
@ -67,7 +67,7 @@ public class AntdMenuSelectTreeNode implements AbstractTreeNode {
|
|||
/**
|
||||
* 子节点
|
||||
*/
|
||||
private List children;
|
||||
private List<AntdMenuSelectTreeNode> children;
|
||||
|
||||
@Override
|
||||
public String getNodeId() {
|
||||
|
@ -80,7 +80,7 @@ public class AntdMenuSelectTreeNode implements AbstractTreeNode {
|
|||
}
|
||||
|
||||
@Override
|
||||
public void setChildrenNodes(List childrenNodes) {
|
||||
public void setChildrenNodes(List<AntdMenuSelectTreeNode> childrenNodes) {
|
||||
this.children = childrenNodes;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -24,58 +24,52 @@
|
|||
*/
|
||||
package cn.stylefeng.roses.kernel.system.api.pojo.menu.antd;
|
||||
|
||||
import cn.stylefeng.roses.kernel.auth.api.pojo.login.basic.SimpleRoleInfo;
|
||||
import lombok.Data;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
* 封装antd vue需要的菜单信息,service对外输出的对象
|
||||
* 封装antd vue需要的dto
|
||||
*
|
||||
* @author majianguo
|
||||
* @date 2021/1/7 15:18
|
||||
* @author fengshuonan
|
||||
* @date 2021/3/23 21:26
|
||||
*/
|
||||
@Data
|
||||
public class AntdSysMenuDTO {
|
||||
|
||||
/**
|
||||
* 主键
|
||||
*/
|
||||
private Long menuId;
|
||||
|
||||
/**
|
||||
* 父id,顶级节点的父id是-1
|
||||
*/
|
||||
private Long menuParentId;
|
||||
|
||||
/**
|
||||
* 菜单的名称
|
||||
*/
|
||||
private String menuName;
|
||||
private String title;
|
||||
|
||||
/**
|
||||
* 路由地址,浏览器显示的URL,例如/menu,适用于antd vue版本
|
||||
* 菜单的图标
|
||||
*/
|
||||
private String antdvRouter;
|
||||
private String icon;
|
||||
|
||||
/**
|
||||
* 图标,适用于antd vue版本
|
||||
* 路由地址(要以/开头),必填
|
||||
*/
|
||||
private String antdvIcon;
|
||||
private String path;
|
||||
|
||||
/**
|
||||
* 是否显示,Y-显示,N-不显示
|
||||
* 组件地址(组件要放在view目录下),父级可以省略
|
||||
*/
|
||||
private String visible;
|
||||
private String component;
|
||||
|
||||
/**
|
||||
* 子节点(表中不存在,用于构造树)
|
||||
* 为true只注册路由不显示在左侧菜单(比如独立的添加页面)
|
||||
*/
|
||||
private List children;
|
||||
private Boolean hide;
|
||||
|
||||
/**
|
||||
* 菜单可以被那些角色访问
|
||||
* 比如修改页面不在侧边栏,打开后侧边栏就没有选中了,这个可以配置选中地址
|
||||
*/
|
||||
private List<SimpleRoleInfo> roles;
|
||||
private String uid;
|
||||
|
||||
/**
|
||||
* 子级
|
||||
*/
|
||||
private List<AntdSysMenuDTO> children;
|
||||
|
||||
}
|
||||
|
|
|
@ -36,7 +36,7 @@ import java.util.List;
|
|||
* @date 2021/1/7 18:09
|
||||
*/
|
||||
@Data
|
||||
public class AntdvMenuItem implements AbstractTreeNode {
|
||||
public class AntdvMenuItem implements AbstractTreeNode<AntdvMenuItem> {
|
||||
|
||||
/**
|
||||
* 主键
|
||||
|
@ -89,7 +89,7 @@ public class AntdvMenuItem implements AbstractTreeNode {
|
|||
}
|
||||
|
||||
@Override
|
||||
public void setChildrenNodes(List childrenNodes) {
|
||||
public void setChildrenNodes(List<AntdvMenuItem> childrenNodes) {
|
||||
this.children = childrenNodes;
|
||||
}
|
||||
|
||||
|
|
|
@ -36,7 +36,7 @@ import java.util.List;
|
|||
* @date 2020/12/27 18:36
|
||||
*/
|
||||
@Data
|
||||
public class LayuiIndexMenuTreeNode implements AbstractTreeNode {
|
||||
public class LayuiIndexMenuTreeNode implements AbstractTreeNode<LayuiIndexMenuTreeNode> {
|
||||
|
||||
/**
|
||||
* 应用编码
|
||||
|
@ -84,7 +84,7 @@ public class LayuiIndexMenuTreeNode implements AbstractTreeNode {
|
|||
}
|
||||
|
||||
@Override
|
||||
public void setChildrenNodes(List childrenNodes) {
|
||||
public void setChildrenNodes(List<LayuiIndexMenuTreeNode> childrenNodes) {
|
||||
this.children = childrenNodes;
|
||||
}
|
||||
|
||||
|
|
|
@ -36,7 +36,7 @@ import java.util.List;
|
|||
* @date 2021/1/9 16:59
|
||||
*/
|
||||
@Data
|
||||
public class LayuiMenuAndButtonTreeResponse implements AbstractTreeNode {
|
||||
public class LayuiMenuAndButtonTreeResponse implements AbstractTreeNode<LayuiMenuAndButtonTreeResponse> {
|
||||
|
||||
/**
|
||||
* 节点ID
|
||||
|
@ -71,7 +71,7 @@ public class LayuiMenuAndButtonTreeResponse implements AbstractTreeNode {
|
|||
/**
|
||||
* 子节点集合
|
||||
*/
|
||||
private List children;
|
||||
private List<LayuiMenuAndButtonTreeResponse> children;
|
||||
|
||||
@Override
|
||||
public String getNodeId() {
|
||||
|
@ -84,7 +84,7 @@ public class LayuiMenuAndButtonTreeResponse implements AbstractTreeNode {
|
|||
}
|
||||
|
||||
@Override
|
||||
public void setChildrenNodes(List childrenNodes) {
|
||||
public void setChildrenNodes(List<LayuiMenuAndButtonTreeResponse> childrenNodes) {
|
||||
this.children = childrenNodes;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -37,7 +37,7 @@ import java.util.List;
|
|||
* @date 2020/12/27 18:36
|
||||
*/
|
||||
@Data
|
||||
public class OrganizationTreeNode implements AbstractTreeNode, AbstractXmSelectNode {
|
||||
public class OrganizationTreeNode implements AbstractTreeNode<OrganizationTreeNode>, AbstractXmSelectNode {
|
||||
|
||||
/**
|
||||
* 父id,一级节点父id是0
|
||||
|
@ -80,7 +80,7 @@ public class OrganizationTreeNode implements AbstractTreeNode, AbstractXmSelectN
|
|||
}
|
||||
|
||||
@Override
|
||||
public void setChildrenNodes(List childrenNodes) {
|
||||
public void setChildrenNodes(List<OrganizationTreeNode> childrenNodes) {
|
||||
this.children = childrenNodes;
|
||||
}
|
||||
|
||||
|
|
|
@ -36,7 +36,7 @@ import java.util.List;
|
|||
* @date 2021/1/14 21:51
|
||||
*/
|
||||
@Data
|
||||
public class LayuiApiResourceTreeNode implements AbstractTreeNode {
|
||||
public class LayuiApiResourceTreeNode implements AbstractTreeNode<LayuiApiResourceTreeNode> {
|
||||
|
||||
/**
|
||||
* 资源的上级编码
|
||||
|
@ -82,7 +82,7 @@ public class LayuiApiResourceTreeNode implements AbstractTreeNode {
|
|||
}
|
||||
|
||||
@Override
|
||||
public void setChildrenNodes(List childrenNodes) {
|
||||
public void setChildrenNodes(List<LayuiApiResourceTreeNode> childrenNodes) {
|
||||
this.children = childrenNodes;
|
||||
}
|
||||
|
||||
|
|
|
@ -32,10 +32,8 @@ import cn.stylefeng.roses.kernel.scanner.api.annotation.GetResource;
|
|||
import cn.stylefeng.roses.kernel.scanner.api.annotation.PostResource;
|
||||
import cn.stylefeng.roses.kernel.system.api.pojo.menu.SysMenuRequest;
|
||||
import cn.stylefeng.roses.kernel.system.api.pojo.menu.antd.AntdSysMenuDTO;
|
||||
import cn.stylefeng.roses.kernel.system.api.pojo.menu.antd.AntdvMenuItem;
|
||||
import cn.stylefeng.roses.kernel.system.api.pojo.menu.layui.LayuiMenuAndButtonTreeResponse;
|
||||
import cn.stylefeng.roses.kernel.system.api.pojo.role.request.SysRoleRequest;
|
||||
import cn.stylefeng.roses.kernel.system.modular.menu.factory.AntdMenusFactory;
|
||||
import cn.stylefeng.roses.kernel.system.modular.menu.service.SysMenuService;
|
||||
import org.springframework.validation.annotation.Validated;
|
||||
import org.springframework.web.bind.annotation.RequestBody;
|
||||
|
@ -146,8 +144,7 @@ public class SysMenuController {
|
|||
@GetResource(name = "获取系统所有菜单(适用于登录后获取左侧菜单)(适配antd vue版本)", path = "/sysMenu/getLeftMenusAntdv", requiredPermission = false)
|
||||
public ResponseData getLeftMenusAntdv() {
|
||||
List<AntdSysMenuDTO> sysMenuResponses = sysMenuService.getLeftMenusAntdv();
|
||||
List<AntdvMenuItem> totalMenus = AntdMenusFactory.createTotalMenus(sysMenuResponses);
|
||||
return new SuccessResponseData(totalMenus);
|
||||
return new SuccessResponseData(sysMenuResponses);
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
|
@ -45,7 +45,7 @@ import java.util.List;
|
|||
@Data
|
||||
@EqualsAndHashCode(callSuper = true)
|
||||
@TableName("sys_menu")
|
||||
public class SysMenu extends BaseEntity implements AbstractTreeNode {
|
||||
public class SysMenu extends BaseEntity implements AbstractTreeNode<SysMenu> {
|
||||
|
||||
/**
|
||||
* 主键
|
||||
|
@ -149,6 +149,12 @@ public class SysMenu extends BaseEntity implements AbstractTreeNode {
|
|||
@TableField("antdv_link_url")
|
||||
private String antdvLinkUrl;
|
||||
|
||||
/**
|
||||
* 用于非菜单显示页面的重定向url设置
|
||||
*/
|
||||
@TableField("antdv_uid_url")
|
||||
private String antdvUidUrl;
|
||||
|
||||
/**
|
||||
* 是否删除:Y-被删除,N-未删除
|
||||
*/
|
||||
|
@ -159,7 +165,7 @@ public class SysMenu extends BaseEntity implements AbstractTreeNode {
|
|||
* 子节点(表中不存在,用于构造树)
|
||||
*/
|
||||
@TableField(exist = false)
|
||||
private List children;
|
||||
private List<SysMenu> children;
|
||||
|
||||
/**
|
||||
* 应用名称
|
||||
|
@ -184,7 +190,7 @@ public class SysMenu extends BaseEntity implements AbstractTreeNode {
|
|||
}
|
||||
|
||||
@Override
|
||||
public void setChildrenNodes(List childrenNodes) {
|
||||
public void setChildrenNodes(List<SysMenu> childrenNodes) {
|
||||
this.children = childrenNodes;
|
||||
}
|
||||
|
||||
|
|
|
@ -24,15 +24,13 @@
|
|||
*/
|
||||
package cn.stylefeng.roses.kernel.system.modular.menu.factory;
|
||||
|
||||
import cn.stylefeng.roses.kernel.auth.api.pojo.login.basic.SimpleRoleInfo;
|
||||
import cn.hutool.core.util.ObjectUtil;
|
||||
import cn.stylefeng.roses.kernel.rule.constants.TreeConstants;
|
||||
import cn.stylefeng.roses.kernel.rule.enums.YesOrNotEnum;
|
||||
import cn.stylefeng.roses.kernel.rule.tree.factory.DefaultTreeBuildFactory;
|
||||
import cn.stylefeng.roses.kernel.system.modular.menu.entity.SysMenu;
|
||||
import cn.stylefeng.roses.kernel.system.api.pojo.menu.antd.AntdMenuSelectTreeNode;
|
||||
import cn.stylefeng.roses.kernel.system.api.pojo.menu.antd.AntdSysMenuDTO;
|
||||
import cn.stylefeng.roses.kernel.system.api.pojo.menu.antd.AntdvMenuAuthorityItem;
|
||||
import cn.stylefeng.roses.kernel.system.api.pojo.menu.antd.AntdvMenuItem;
|
||||
import cn.stylefeng.roses.kernel.system.modular.menu.entity.SysMenu;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
|
@ -51,66 +49,13 @@ public class AntdMenusFactory {
|
|||
* @author fengshuonan
|
||||
* @date 2021/1/7 18:17
|
||||
*/
|
||||
public static List<AntdvMenuItem> createTotalMenus(List<AntdSysMenuDTO> sysMenuRespons) {
|
||||
|
||||
ArrayList<AntdvMenuItem> antdvMenuItems = new ArrayList<>(sysMenuRespons.size());
|
||||
|
||||
// 实体转化
|
||||
for (AntdSysMenuDTO antdSysMenuDTO : sysMenuRespons) {
|
||||
AntdvMenuItem antdvMenuItem = new AntdvMenuItem();
|
||||
|
||||
// 填充id pid name用于构建树
|
||||
antdvMenuItem.setMenuId(antdSysMenuDTO.getMenuId());
|
||||
antdvMenuItem.setMenuParentId(antdSysMenuDTO.getMenuParentId());
|
||||
antdvMenuItem.setName(antdSysMenuDTO.getMenuName());
|
||||
|
||||
// 填充路由等信息
|
||||
antdvMenuItem.setRouter(antdSysMenuDTO.getAntdvRouter());
|
||||
antdvMenuItem.setIcon(antdSysMenuDTO.getAntdvIcon());
|
||||
|
||||
// 填充是否隐藏
|
||||
antdvMenuItem.setInvisible(YesOrNotEnum.N.getCode().equals(antdSysMenuDTO.getVisible()));
|
||||
|
||||
// 填充哪个角色绑定了这个菜单
|
||||
List<SimpleRoleInfo> roles = antdSysMenuDTO.getRoles();
|
||||
AntdvMenuAuthorityItem antdvAuthorityItem = new AntdvMenuAuthorityItem();
|
||||
if (roles != null && roles.size() > 0) {
|
||||
ArrayList<String> auths = new ArrayList<>();
|
||||
for (SimpleRoleInfo role : roles) {
|
||||
auths.add(role.getRoleCode());
|
||||
}
|
||||
antdvAuthorityItem.setPermission(auths);
|
||||
antdvAuthorityItem.setRole(auths);
|
||||
antdvMenuItem.setAuthority(antdvAuthorityItem);
|
||||
}
|
||||
|
||||
antdvMenuItems.add(antdvMenuItem);
|
||||
}
|
||||
|
||||
// 加入根节点
|
||||
antdvMenuItems.add(createAntdVMenuRoot());
|
||||
public static List<AntdSysMenuDTO> createTotalMenus(List<SysMenu> sysMenuList) {
|
||||
|
||||
// 构造菜单树
|
||||
return new DefaultTreeBuildFactory<AntdvMenuItem>(TreeConstants.VIRTUAL_ROOT_PARENT_ID.toString()).doTreeBuild(antdvMenuItems);
|
||||
}
|
||||
List<SysMenu> treeStructMenu = new DefaultTreeBuildFactory<SysMenu>(TreeConstants.DEFAULT_PARENT_ID.toString()).doTreeBuild(sysMenuList);
|
||||
|
||||
/**
|
||||
* 创建虚拟根节点
|
||||
*
|
||||
* @author fengshuonan
|
||||
* @date 2020/12/30 20:38
|
||||
*/
|
||||
private static AntdvMenuItem createAntdVMenuRoot() {
|
||||
AntdvMenuItem antdvMenuItem = new AntdvMenuItem();
|
||||
antdvMenuItem.setRouter("root");
|
||||
antdvMenuItem.setName("根节点");
|
||||
antdvMenuItem.setMenuId(TreeConstants.DEFAULT_PARENT_ID);
|
||||
antdvMenuItem.setMenuParentId(TreeConstants.VIRTUAL_ROOT_PARENT_ID);
|
||||
antdvMenuItem.setInvisible(false);
|
||||
|
||||
antdvMenuItem.setAuthority(null);
|
||||
|
||||
return antdvMenuItem;
|
||||
// 模型转化
|
||||
return doModelTransfer(treeStructMenu);
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -129,4 +74,34 @@ public class AntdMenusFactory {
|
|||
return menuTreeNode;
|
||||
}
|
||||
|
||||
/**
|
||||
* 模型转化
|
||||
*
|
||||
* @author fengshuonan
|
||||
* @date 2021/3/23 21:40
|
||||
*/
|
||||
private static List<AntdSysMenuDTO> doModelTransfer(List<SysMenu> sysMenuList) {
|
||||
if (ObjectUtil.isEmpty(sysMenuList)) {
|
||||
return null;
|
||||
} else {
|
||||
ArrayList<AntdSysMenuDTO> resultMenus = new ArrayList<>();
|
||||
|
||||
for (SysMenu sysMenu : sysMenuList) {
|
||||
AntdSysMenuDTO antdvMenuItem = new AntdSysMenuDTO();
|
||||
antdvMenuItem.setTitle(sysMenu.getMenuName());
|
||||
antdvMenuItem.setIcon(sysMenu.getAntdvIcon());
|
||||
antdvMenuItem.setPath(sysMenu.getAntdvRouter());
|
||||
antdvMenuItem.setComponent(sysMenu.getAntdvComponent());
|
||||
antdvMenuItem.setHide(YesOrNotEnum.N.getCode().equals(sysMenu.getVisible()));
|
||||
antdvMenuItem.setUid(sysMenu.getAntdvUidUrl());
|
||||
if (ObjectUtil.isNotEmpty(sysMenu.getChildren())) {
|
||||
antdvMenuItem.setChildren(doModelTransfer(sysMenu.getChildren()));
|
||||
}
|
||||
resultMenus.add(antdvMenuItem);
|
||||
}
|
||||
|
||||
return resultMenus;
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
@ -24,12 +24,8 @@
|
|||
*/
|
||||
package cn.stylefeng.roses.kernel.system.modular.menu.mapper;
|
||||
|
||||
import cn.stylefeng.roses.kernel.system.api.pojo.menu.antd.AntdSysMenuDTO;
|
||||
import cn.stylefeng.roses.kernel.system.modular.menu.entity.SysMenu;
|
||||
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
|
||||
import org.apache.ibatis.annotations.Param;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
* 系统菜单mapper接口
|
||||
|
@ -39,15 +35,4 @@ import java.util.List;
|
|||
*/
|
||||
public interface SysMenuMapper extends BaseMapper<SysMenu> {
|
||||
|
||||
/**
|
||||
* 获取系统所有菜单(适用于登录后获取左侧菜单)(适配antd vue版本)
|
||||
* <p>
|
||||
* 返回信息携带:菜单可以被那些角色访问
|
||||
*
|
||||
* @return 系统所有菜单
|
||||
* @author majianguo
|
||||
* @date 2021/1/7 15:27
|
||||
*/
|
||||
List<AntdSysMenuDTO> getSystemAllMenus(@Param("menuIdList") List<Long> menuIdList);
|
||||
|
||||
}
|
||||
|
|
|
@ -2,41 +2,5 @@
|
|||
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
|
||||
<mapper namespace="cn.stylefeng.roses.kernel.system.modular.menu.mapper.SysMenuMapper">
|
||||
|
||||
<resultMap id="systemMenuAndRole" type="cn.stylefeng.roses.kernel.system.api.pojo.menu.antd.AntdSysMenuDTO">
|
||||
<id column="menu_id" property="menuId"/>
|
||||
<result column="menu_parent_id" property="menuParentId"/>
|
||||
<result column="menu_name" property="menuName"/>
|
||||
<result column="antdv_router" property="antdvRouter"/>
|
||||
<result column="antdv_icon" property="antdvIcon"/>
|
||||
<result column="visible" property="visible"/>
|
||||
<collection property="roles" ofType="cn.stylefeng.roses.kernel.auth.api.pojo.login.basic.SimpleRoleInfo">
|
||||
<id column="role_id" property="roleId"/>
|
||||
<result column="role_name" property="roleName"/>
|
||||
<result column="role_code" property="roleCode"/>
|
||||
</collection>
|
||||
</resultMap>
|
||||
|
||||
<select id="getSystemAllMenus" resultMap="systemMenuAndRole">
|
||||
SELECT sm.menu_id,
|
||||
sm.menu_parent_id,
|
||||
sm.menu_name,
|
||||
sm.antdv_router,
|
||||
sm.antdv_icon,
|
||||
sm.visible,
|
||||
sr.role_id,
|
||||
sr.role_name,
|
||||
sr.role_code
|
||||
FROM sys_menu sm
|
||||
LEFT JOIN sys_role_menu srm ON sm.menu_id = srm.menu_id
|
||||
LEFT JOIN sys_role sr ON srm.role_id = sr.role_id
|
||||
WHERE sm.del_flag = 'N'
|
||||
AND sm.status_flag = 1
|
||||
<if test="menuIdList != null and menuIdList.size() > 0">
|
||||
and sm.menu_id in
|
||||
<foreach collection="menuIdList" index="index" item="item" open="(" separator="," close=")">
|
||||
#{item}
|
||||
</foreach>
|
||||
</if>
|
||||
</select>
|
||||
|
||||
</mapper>
|
||||
|
|
|
@ -275,14 +275,28 @@ public class SysMenuServiceImpl extends ServiceImpl<SysMenuMapper, SysMenu> impl
|
|||
@Override
|
||||
public List<AntdSysMenuDTO> getLeftMenusAntdv() {
|
||||
|
||||
LambdaQueryWrapper<SysMenu> wrapper = this.createWrapper(new SysMenuRequest());
|
||||
wrapper.select(SysMenu::getMenuName,
|
||||
SysMenu::getAntdvIcon,
|
||||
SysMenu::getAntdvRouter,
|
||||
SysMenu::getAntdvComponent,
|
||||
SysMenu::getVisible,
|
||||
SysMenu::getAntdvUidUrl,
|
||||
SysMenu::getMenuId,
|
||||
SysMenu::getMenuParentId);
|
||||
wrapper.eq(SysMenu::getStatusFlag, StatusEnum.ENABLE.getCode());
|
||||
|
||||
// 如果是超级管理员,则获取所有的菜单
|
||||
if (LoginContext.me().getSuperAdminFlag()) {
|
||||
return this.baseMapper.getSystemAllMenus(null);
|
||||
List<SysMenu> totalList = this.list(wrapper);
|
||||
return AntdMenusFactory.createTotalMenus(totalList);
|
||||
}
|
||||
|
||||
// 获取当前用户的所有菜单
|
||||
List<Long> menuIdList = getCurrentUserMenuIds();
|
||||
return this.baseMapper.getSystemAllMenus(menuIdList);
|
||||
wrapper.in(SysMenu::getMenuId, menuIdList);
|
||||
List<SysMenu> customList = this.list(wrapper);
|
||||
return AntdMenusFactory.createTotalMenus(customList);
|
||||
}
|
||||
|
||||
@Override
|
||||
|
|
|
@ -36,7 +36,7 @@ import java.util.List;
|
|||
* @date 2020/3/26 14:29
|
||||
*/
|
||||
@Data
|
||||
public class ResourceTreeNode implements AbstractTreeNode {
|
||||
public class ResourceTreeNode implements AbstractTreeNode<ResourceTreeNode> {
|
||||
|
||||
/**
|
||||
* 资源id
|
||||
|
@ -69,7 +69,7 @@ public class ResourceTreeNode implements AbstractTreeNode {
|
|||
/**
|
||||
* 子节点集合
|
||||
*/
|
||||
private List children;
|
||||
private List<ResourceTreeNode> children;
|
||||
|
||||
@Override
|
||||
public String getNodeId() {
|
||||
|
@ -82,7 +82,7 @@ public class ResourceTreeNode implements AbstractTreeNode {
|
|||
}
|
||||
|
||||
@Override
|
||||
public void setChildrenNodes(List childrenNodes) {
|
||||
public void setChildrenNodes(List<ResourceTreeNode> childrenNodes) {
|
||||
this.children = childrenNodes;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -39,6 +39,7 @@ import cn.stylefeng.roses.kernel.wrapper.api.annotation.Wrapper;
|
|||
import lombok.extern.slf4j.Slf4j;
|
||||
import org.springframework.validation.annotation.Validated;
|
||||
import org.springframework.web.bind.annotation.RequestBody;
|
||||
import org.springframework.web.bind.annotation.RequestMethod;
|
||||
import org.springframework.web.bind.annotation.RestController;
|
||||
|
||||
import javax.annotation.Resource;
|
||||
|
@ -64,7 +65,21 @@ public class LoginController {
|
|||
* @date 2021/3/17 17:23
|
||||
*/
|
||||
@PostResource(name = "登陆", path = "/login", requiredLogin = false, requiredPermission = false)
|
||||
public ResponseData doAuth(@RequestBody @Validated LoginRequest loginRequest) {
|
||||
public ResponseData login(@RequestBody @Validated LoginRequest loginRequest) {
|
||||
loginRequest.setCreateCookie(true);
|
||||
LoginResponse loginResponse = authServiceApi.login(loginRequest);
|
||||
return new SuccessResponseData(loginResponse.getToken());
|
||||
}
|
||||
|
||||
/**
|
||||
* 用户登陆(提供给分离版用的接口,不会写cookie)
|
||||
*
|
||||
* @author fengshuonan
|
||||
* @date 2021/3/17 17:23
|
||||
*/
|
||||
@PostResource(name = "登陆(分离版)", path = "/loginApi", requiredLogin = false, requiredPermission = false)
|
||||
public ResponseData loginApi(@RequestBody @Validated LoginRequest loginRequest) {
|
||||
loginRequest.setCreateCookie(false);
|
||||
LoginResponse loginResponse = authServiceApi.login(loginRequest);
|
||||
return new SuccessResponseData(loginResponse.getToken());
|
||||
}
|
||||
|
@ -75,7 +90,7 @@ public class LoginController {
|
|||
* @author fengshuonan
|
||||
* @date 2021/3/17 17:24
|
||||
*/
|
||||
@GetResource(name = "登出", path = "/logout", requiredPermission = false)
|
||||
@ApiResource(name = "登出", path = "/logout", requiredPermission = false, method = {RequestMethod.GET, RequestMethod.POST})
|
||||
public ResponseData logoutPage() {
|
||||
authServiceApi.logout();
|
||||
return new SuccessResponseData();
|
||||
|
|
|
@ -26,7 +26,6 @@ package cn.stylefeng.roses.kernel.system.modular.user.factory;
|
|||
|
||||
import cn.hutool.core.bean.BeanUtil;
|
||||
import cn.hutool.extra.spring.SpringUtil;
|
||||
import cn.stylefeng.roses.kernel.auth.api.context.LoginContext;
|
||||
import cn.stylefeng.roses.kernel.auth.api.pojo.login.LoginUser;
|
||||
import cn.stylefeng.roses.kernel.auth.api.pojo.login.basic.SimpleRoleInfo;
|
||||
import cn.stylefeng.roses.kernel.auth.api.pojo.login.basic.SimpleUserInfo;
|
||||
|
@ -127,9 +126,6 @@ public class UserLoginInfoFactory {
|
|||
// 设置用户的登录时间
|
||||
loginUser.setLoginTime(new Date());
|
||||
|
||||
// 设置登录用户token
|
||||
loginUser.setToken(LoginContext.me().getToken());
|
||||
|
||||
// 响应dto
|
||||
userLoginInfoDTO.setLoginUser(loginUser);
|
||||
return userLoginInfoDTO;
|
||||
|
|
Loading…
Reference in New Issue