Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >springboot第28集:springboot一些概念

springboot第28集:springboot一些概念

作者头像
达达前端
发布于 2023-10-08 10:39:50
发布于 2023-10-08 10:39:50
23200
代码可运行
举报
文章被收录于专栏:达达前端达达前端
运行总次数:0
代码可运行
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
DataScopeAspect 
数据过滤处理

此切面在执行带有@ControllerDataScope注解的方法之前进行数据权限过滤。首先获取当前登录用户,然后判断当前用户是否为超级管理员。如果不是超级管理员,则获取权限字符,默认使用上下文中的权限字符。接下来,根据用户的角色和数据范围类型进行数据权限过滤。根据不同的数据范围类型,生成相应的SQL条件,并将其加入到参数中。最后,在拼接权限SQL之前,先清空参数中的params.dataScope参数,以防止注入。

注意:以上代码中涉及的StringUtilsSysUserSysRoleSysDept等类和方法是示例中的自定义类和方法,实际使用时需要根据项目的具体情况进行替换或实现。

  • @RestController: 表示这是一个控制器类,并且处理的请求返回的是 JSON 数据。
  • @Resource(name = "captchaProducer")@Resource(name = "captchaProducerMath"): 注入名为 "captchaProducer" 和 "captchaProducerMath" 的 Producer 对象。这里使用了 @Resource 注解,表示通过名称来注入对应的 Bean。
  • @Autowired: 注入 RedisCacheISysConfigService 对象。
  • @GetMapping("/captchaImage"): 处理 GET 请求路径为 "/captchaImage" 的请求。
  • AjaxResult: 一个自定义的结果封装类,用于返回响应结果。

用于表示路由的元数据。包括路由的标题(title)、图标(icon)、是否缓存(noCache)和内链地址(link)。

  1. @Service: 将类声明为一个服务类,由Spring进行管理。
  2. @Autowired: 自动装配依赖关系,将SysConfigMapperRedisCache注入到当前类中。
  3. @PostConstruct: 在构造函数执行完成后,执行init方法。用于在项目启动时初始化参数到缓存。
  4. @Override: 表示重写或实现了父类或接口的方法。
  5. @DataSource(DataSourceType.MASTER): 指定数据源为主数据源,用于数据库访问。
  6. config.setConfigId(configId): 设置SysConfig对象的configId属性值为configId
  7. return configMapper.selectConfig(config): 调用configMapperselectConfig方法查询参数配置信息并返回。
  8. String configValue = Convert.toStr(redisCache.getCacheObject(getCacheKey(configKey))): 从缓存中获取参数键对应的参数值。
  9. if (StringUtils.isNotEmpty(configValue)) { return configValue; }: 如果参数值不为空,则直接返回参数值。
  10. config.setConfigKey(configKey): 设置SysConfig对象的configKey属性值为configKey
  11. SysConfig retConfig = configMapper.selectConfig(config): 调用configMapperselectConfig方法查询参数配置信息并赋值给retConfig
  12. if (StringUtils.isNotNull(retConfig)) { redisCache.setCacheObject(getCacheKey(configKey), retConfig.getConfigValue()); return retConfig.getConfigValue(); }: 如果查询到参数配置信息,将其存入缓存,并返回参数值。
  13. return StringUtils.EMPTY;: 返回空字符串。
  14. String captchaEnabled = selectConfigByKey("sys.account.captchaEnabled"): 调用selectConfigByKey方法获取验证码开关的参数值。
  15. if (StringUtils.isEmpty(captchaEnabled)) { return true; }: 如果参数值为空,则返回true,表示开启验证码。
  16. return Convert.toBool(captchaEnabled): 将参数值转为布尔型并返回。
  17. return configMapper.selectConfigList(config): 调用configMapperselectConfigList方法查询参数配置列表并返回。
  18. int row = configMapper.insertConfig(config): 调用configMapperinsertConfig方法插入参数配置信息并将受影响的行数赋值给row
  19. if (row > 0) { redisCache.setCacheObject(getCacheKey(config.getConfigKey()), config.getConfigValue()); }: 如果插入成功,则将参数配置信息存入缓存。
  20. SysConfig temp = configMapper.selectConfigById(config.getConfigId()): 调用configMapperselectConfigById方法查询旧的参数配置信息并赋值给temp
  21. if (!StringUtils.equals(temp.getConfigKey(), config.getConfigKey())) { redisCache.deleteObject(getCacheKey(temp.getConfigKey())); }: 如果参数键发生变化,则从缓存中删除旧的参数配置信息。
  22. int row = configMapper.updateConfig(config): 调用configMapperupdateConfig方法更新参数配置信息并将受影响的行数赋值给row
  23. if (row > 0) { redisCache.setCacheObject(getCacheKey(config.getConfigKey()), config.getConfigValue()); }: 如果更新成功,则将新的参数配置信息存入缓存。
  24. for (Long configId : configIds) { SysConfig config = selectConfigById(configId); ... }: 遍历要删除的参数ID,调用selectConfigById方法查询参数配置信息并判断是否允许删除内置参数,然后调用deleteConfigById方法删除参数配置信息,并从缓存中删除。
  25. List<SysConfig> configsList = configMapper.selectConfigList(new SysConfig()): 调用configMapperselectConfigList方法查询参数配置列表并赋值给configsList
  26. redisCache.setCacheObject(getCacheKey(config.getConfigKey()), config.getConfigValue()): 将参数配置信息存入缓存。
  27. Collection<String> keys = redisCache.keys(CacheConstants.SYS_CONFIG_KEY + "*"): 获取所有参数配置的缓存键。
  28. redisCache.deleteObject(keys): 清空缓存。
  29. clearConfigCache(): 清空参数缓存数据。
  30. loadingConfigCache(): 加载参数缓存数据。
  31. Long configId = StringUtils.isNull(config.getConfigId()) ? -1L : config.getConfigId(): 获取参数配置ID,如果为空则设置为-1。
  32. SysConfig info = configMapper.checkConfigKeyUnique(config.getConfigKey()): 调用configMappercheckConfigKeyUnique方法查询是否存在相同的参数键名。
  33. if (StringUtils.isNotNull(info) && info.getConfigId().longValue() != configId.longValue()) { return UserConstants.NOT_UNIQUE; }: 如果存在相同的参数键名且不是当前配置的参数键名,则返回false
  34. return UserConstants.UNIQUE;: 参数键名唯一,返回true
  35. return CacheConstants.SYS_CONFIG_KEY + configKey: 返回缓存键。
  36. private String getCacheKey(String configKey): 私有方法,用于获取缓存键。

roleMapper.selectRolePermissionByUserId(userId)查询角色权限列表。然后,创建一个空的权限集合permsSet。接下来,遍历角色权限列表,对每个角色进行处理。如果角色对象perm不为空,则将其角色权限的roleKey字段按逗号分隔后转换为列表,并将列表中的权限添加到permsSet集合中。最后,返回权限集合permsSet,该集合包含了用户拥有的所有角色权限。

image.png

image.png

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
ISysConfigService
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
ISysMenuService

定义完ISysDictDataService接口后,您需要创建一个实现类来继承该接口。在Java中,接口定义了一组方法的契约或规范,但它们并不提供这些方法的实际实现。实现类负责为接口中声明的每个方法提供具体的实现。

如果不编写实现类,那么ISysDictDataService接口将仅仅是一个接口的定义,没有具体的实现逻辑。在这种情况下,其他部分的代码将无法直接调用接口中定义的方法,因为没有实现提供实际的方法实现。

接口本身是一种规范或契约,它定义了一组方法的签名,用于指导实现类的开发。实现类负责提供方法的实际逻辑和功能。

如果您不编写实现类,那么接口只是一个接口声明,它可能会在代码中的其他地方作为类型或约定使用,但不能直接调用其方法。

通常情况下,我们会编写实现类来实现接口中定义的方法,以便在需要时可以实际调用这些方法并执行相应的逻辑。如果没有实现类,接口的定义将没有具体的实际用途。

因此,为了能够使用接口中定义的方法,您需要编写一个实现类来提供具体的方法实现。这样,其他部分的代码可以通过实例化实现类并调用接口中的方法来使用这些功能

在Java中,接口(interface)是一种抽象类型,它定义了一组方法的签名但没有具体的实现。当您编写完ISysDictDataService接口后,并不需要强制编写一个实现类去继承它。

编写实现类的目的是为了提供接口中定义的方法的具体实现逻辑。如果不编写实现类,编译过程不会报错,因为接口本身不需要被实例化或直接调用。

然而,如果其他部分的代码(如其他类或方法)试图调用ISysDictDataService接口中的方法,而没有相应的实现类提供具体实现,那么在运行时会抛出java.lang.UnsupportedOperationException异常。

因此,虽然不是强制要求编写实现类,但通常情况下,为了能够使用接口中定义的方法

  • @Override:注解表示该方法是对父类或接口的重写。
  • public boolean checkRoleNameUnique(SysRole role):方法签名,指定了该方法的访问修饰符、返回类型和参数。
  • Long roleId = StringUtils.isNull(role.getRoleId()) ? -1L : role.getRoleId();:使用三元运算符判断角色ID是否为空,如果为空,则将roleId赋值为-1,否则为角色的实际ID。
  • SysRole info = roleMapper.checkRoleNameUnique(role.getRoleName());:调用roleMapper对象的checkRoleNameUnique方法,根据角色名查找角色信息,并将结果赋值给info变量。
  • if (StringUtils.isNotNull(info) && info.getRoleId().longValue() != roleId.longValue()):判断info对象不为空且角色ID与roleId不相等。
    • StringUtils.isNotNull(info):调用StringUtils类的isNotNull方法判断info是否不为空。
    • info.getRoleId().longValue() != roleId.longValue():将info对象的角色ID与roleId进行比较,判断是否相等。
  • return UserConstants.NOT_UNIQUE;:如果角色名不唯一,则返回UserConstants.NOT_UNIQUE,表示角色名不唯一。
  • return UserConstants.UNIQUE;:如果角色名唯一,则返回UserConstants.UNIQUE,表示角色名唯一。

该方法用于检查角色键值是否唯一。

  • @Override:注解表示该方法是对父类或接口的重写。
  • public boolean checkRoleKeyUnique(SysRole role):方法签名,指定了该方法的访问修饰符、返回类型和参数。
  • Long roleId = StringUtils.isNull(role.getRoleId()) ? -1L : role.getRoleId();:使用三元运算符判断角色ID是否为空,如果为空,则将roleId赋值为-1,否则为角色的实际ID。
  • SysRole info = roleMapper.checkRoleKeyUnique(role.getRoleKey());:调用roleMapper对象的checkRoleKeyUnique方法,根据角色键值查找角色信息,并将结果赋值给info变量。
  • if (StringUtils.isNotNull(info) && info.getRoleId().longValue() != roleId.longValue()):判断info对象不为空且角色ID与roleId不相等。
    • StringUtils.isNotNull(info):调用StringUtils类的isNotNull方法判断info是否不为空。
    • info.getRoleId().longValue() != roleId.longValue():将info对象的角色ID与roleId进行比较,判断是否相等。
  • return UserConstants.NOT_UNIQUE;:如果角色键值不唯一,则返回UserConstants.NOT_UNIQUE,表示角色键值不唯一。
  • return UserConstants.UNIQUE;:如果角色键值唯一,则返回UserConstants.UNIQUE,表示角色键值唯一。
  • @Override:注解表示该方法是对父类或接口的重写。
  • public void checkRoleAllowed(SysRole role):方法签名,指定了该方法的访问修饰符、返回类型和参数。
  • if (StringUtils.isNotNull(role.getRoleId()) && role.isAdmin()):判断角色的ID不为空且角色为超级管理员。
    • StringUtils.isNotNull(role.getRoleId()):调用StringUtils类的isNotNull方法判断角色的ID是否不为空。
    • role.isAdmin():调用role对象的isAdmin方法判断角色是否为超级管理员。
  • throw new ServiceException("不允许操作超级管理员角色");:抛出ServiceException异常,提示不允许操作超级管理员角色。
  • @Service: 标识这是一个服务类,用于处理业务逻辑。
  • public class SysMenuServiceImpl implements ISysMenuService: 定义了一个名为 SysMenuServiceImpl 的类,该类实现了 ISysMenuService 接口。
  • public static final String PREMISSION_STRING = "perms["{0}"]";: 声明了一个名为 PREMISSION_STRING 的常量,用于定义权限字符串的格式。
  • @Autowired: 自动注入依赖对象。
  • private SysMenuMapper menuMapper;: 声明了一个私有字段 menuMapper,用于访问菜单数据的对象。
  • private SysRoleMapper roleMapper;: 声明了一个私有字段 roleMapper,用于访问角色数据的对象。
  • private SysRoleMenuMapper roleMenuMapper;: 声明了一个私有字段 roleMenuMapper,用于访问角色菜单关系数据的对象。
  • @Override: 表示该方法是对父类或接口中同名方法的重写。
  • public List<SysMenu> selectMenuList(Long userId): 声明了一个公共方法 selectMenuList,接受一个 Long 类型的参数 userId,返回一个 SysMenu 类型的列表。
  • return selectMenuList(new SysMenu(), userId);: 调用另一个名为 selectMenuList 的方法,并传递一个新创建的 SysMenu 对象和 userId 参数作为参数。
  • @Override: 表示该方法是对父类或接口中同名方法的重写。
  • public List<SysMenu> selectMenuList(SysMenu menu, Long userId): 声明了一个公共方法 selectMenuList,接受一个 SysMenu 类型的参数 menu 和一个 Long 类型的参数 userId,返回一个 SysMenu 类型的列表。
  • List<SysMenu> menuList = null;: 声明了一个名为 menuList 的变量,类型为 List<SysMenu>,初始值为 null
  • if (SysUser.isAdmin(userId)): 判断当前用户是否是管理员。
  • menuList = menuMapper.selectMenuList(menu);: 如果当前用户是管理员,则调用 menuMapper 对象的 selectMenuList 方法来获取所有菜单信息。
  • menu.getParams().put("userId", userId);: 如果当前用户不是管理员,则将用户ID存储到 menu 对象的参数中。
  • menuList = menuMapper.selectMenuListByUserId(menu);: 调用 menuMapper 对象的 selectMenuListByUserId 方法来根据用户ID获取菜单列表。
  • return menuList;: 返回菜单列表。
  • @Override: 表示该方法是对父类或接口中同名方法的重写。
  • public List<Long> selectMenuListByRoleId(Long roleId): 声明了一个公共方法 selectMenuListByRoleId,接受一个 Long 类型的参数 roleId,返回一个 List<Long> 类型的结果。
  • SysRole role = roleMapper.selectRoleById(roleId);: 调用 roleMapper 对象的 selectRoleById 方法,根据角色ID获取对应的角色信息,并将结果存储在 role 变量中。
  • return menuMapper.selectMenuListByRoleId(roleId, role.isMenuCheckStrictly());: 调用 menuMapper 对象的 selectMenuListByRoleId 方法,根据角色ID和角色的菜单严格检查属性获取对应的菜单列表,并作为方法的返回值。
  • @Override: 表示该方法是对父类或接口中同名方法的重写。
  • public List<RouterVo> buildMenus(List<SysMenu> menus): 声明了一个公共方法 buildMenus,接受一个 List<SysMenu> 类型的参数 menus,返回一个 List<RouterVo> 类型的结果。
  • List<RouterVo> routers = new LinkedList<RouterVo>();: 声明了一个名为 routers 的变量,类型为 List<RouterVo>,使用 LinkedList 初始化。
  • for (SysMenu menu : menus) { ... }: 遍历 menus 列表中的每个 SysMenu 对象,使用变量 menu 进行迭代。
  • RouterVo router = new RouterVo();: 创建一个新的 RouterVo 对象,用于存储路由信息。
  • router.setHidden("1".equals(menu.getVisible()));: 根据 menu 对象的 visible 属性设置路由是否隐藏。
  • router.setName(getRouteName(menu));: 调用 getRouteName 方法获取路由名称,并设置到 router 对象中。
  • router.setPath(getRouterPath(menu));: 调用 getRouterPath 方法获取路由路径,并设置到 router 对象中。
  • router.setComponent(getComponent(menu));: 调用 getComponent 方法获取路由组件,并设置到 router 对象中。
  • router.setQuery(menu.getQuery());: 设置路由的查询参数为 menu 对象的 query 属性。
  • router.setMeta(new MetaVo(menu.getMenuName(), menu.getIcon(), StringUtils.equals("1", menu.getIsCache()), menu.getPath()));: 创建一个新的 MetaVo 对象,设置其属性值为 menu 对象的相关属性,并将其设置为 router 对象的元数据。
  • List<SysMenu> cMenus = menu.getChildren();: 获取当前菜单的子菜单列表。
  • if (StringUtils.isNotEmpty(cMenus) && UserConstants.TYPE_DIR.equals(menu.getMenuType())) { ... }: 如果子菜单列表不为空且当前菜单类型为目录类型。
  • router.setAlwaysShow(true);: 设置路由是否总是显示为 true
  • router.setRedirect("noRedirect");: 设置路由的重定向为 "noRedirect"
  • router.setChildren(buildMenus(cMenus));: 递归调用 buildMenus 方法构建子菜单的路由,并将结果设置为当前路由的子路由。
  • else if (isMenuFrame(menu)) { ... }: 否则,如果当前菜单为菜单框架。
  • router.setMeta(null);: 清空路由的元数据。
  • List<RouterVo> childrenList = new ArrayList<RouterVo>();: 声明一个新的 ArrayList<RouterVo> 对象,用于存储子路由列表。
  • RouterVo children = new RouterVo();: 创建一个新的 RouterVo 对象,用于存储子路由信息。
  • children.setPath(menu.getPath());: 设置子路由的路径为当前菜单的路径。
  • children.setComponent(menu.getComponent());: 设置子路由的组件为当前菜单的组件。
  • children.setName(StringUtils.capitalize(menu.getPath()));: 设置子路由的名称为当前菜单路径的首字母大写形式。
  • children.setMeta(new MetaVo(menu.getMenuName(), menu.getIcon(), StringUtils.equals("1", menu.getIsCache()), menu.getPath()));: 创建一个新的 MetaVo 对象,设置其属性值为当前菜单的相关属性,并将其设置为子路由的元数据。
  • children.setQuery(menu.getQuery());: 设置子路由的查询参数为当前菜单的查询参数。
  • childrenList.add(children);: 将子路由添加到子路由列表中。
  • router.setChildren(childrenList);: 设置子路由列表为当前路由的子路由列表。
  • else if (menu.getParentId().intValue() == 0 && isInnerLink(menu)) { ... }: 否则,如果当前菜单的父菜单ID为0且是内部链接。
  • router.setMeta(new MetaVo(menu.getMenuName(), menu.getIcon()));: 创建一个新的 MetaVo 对象,设置其属性值为当前菜单的名称和图标,并将其设置为当前路由的元数据。
  • router.setPath("/");: 设置当前路由的路径为根路径。
  • List<RouterVo> childrenList = new ArrayList<RouterVo>();: 声明一个新的 ArrayList<RouterVo> 对象,用于存储子路由列表。
  • RouterVo children = new RouterVo();: 创建一个新的 RouterVo 对象,用于存储子路由信息。
  • String routerPath = innerLinkReplaceEach(menu.getPath());: 调用 innerLinkReplaceEach 方法替换内部链接的路径。
  • children.setPath(routerPath);: 设置子路由的路径为替换后的路径。
  • children.setComponent(UserConstants.INNER_LINK);: 设置子路由的组件为内部链接组件。
  • children.setName(StringUtils.capitalize(routerPath));: 设置子路由的名称为替换后的路径的首字母大写形式。
  • children.setMeta(new MetaVo(menu.getMenuName(), menu.getIcon(), menu.getPath()));: 创建一个新的 MetaVo 对象,设置其属性值为当前菜单的相关属性,并将其设置为子路由的元数据。
  • childrenList.add(children);: 将子路由添加到子路由列表中。
  • router.setChildren(childrenList);: 设置子路由列表为当前路由的子路由列表。
  • routers.add(router);: 将当前路由添加到路由列表中。
  • return routers;: 返回路由列表作为方法的结果。
  • Long menuId = StringUtils.isNull(menu.getMenuId()) ? -1L : menu.getMenuId();:获取菜单ID,若菜单ID为空,则将其设为-1。
  • SysMenu info = menuMapper.checkMenuNameUnique(menu.getMenuName(), menu.getParentId());:调用菜单Mapper的checkMenuNameUnique方法,查询具有相同菜单名称和父菜单ID的菜单信息。
    • menu.getMenuName():获取菜单的名称。
    • menu.getParentId():获取菜单的父菜单ID。
  • if (StringUtils.isNotNull(info) && info.getMenuId().longValue() != menuId.longValue()) {...}:判断查询到的菜单信息是否存在且菜单ID与当前菜单ID不相同。
    • StringUtils.isNotNull(info):判断菜单信息是否不为空。
    • info.getMenuId().longValue() != menuId.longValue():判断查询到的菜单ID与当前菜单ID是否不相同。
  • return UserConstants.NOT_UNIQUE;:菜单名称不唯一,返回不唯一标识。
  • return UserConstants.UNIQUE;:菜单名称唯一,返回唯一标识。
  • @Service:用于标识该类为服务类,由Spring进行管理和注入。
  • public class SysConfigServiceImpl implements ISysConfigService:定义了类SysConfigServiceImpl,实现了接口ISysConfigService
  • @Autowired:自动注入依赖的对象。
  • private SysConfigMapper configMapper;:声明一个私有成员变量configMapper,用于访问SysConfigMapper对象。
  • private RedisCache redisCache;:声明一个私有成员变量redisCache,用于访问RedisCache对象。
  • @PostConstruct:在对象创建后,调用init方法进行初始化操作。
  • public void init():初始化方法,用于在项目启动时将参数加载到缓存中。
  • loadingConfigCache():自定义的方法,用于加载参数到缓存中。
  • @Override:表示该方法覆盖了父类或接口的同名方法。
  • @DataSource(DataSourceType.MASTER):指定数据源为主数据库,用于读取配置信息。
  • public SysConfig selectConfigById(Long configId):方法签名,指定了该方法的访问修饰符、返回类型和参数。
  • SysConfig config = new SysConfig();:创建一个SysConfig对象,用于设置查询条件。
  • config.setConfigId(configId);:将传入的configId设置为config对象的configId属性值。
  • return configMapper.selectConfig(config);:调用configMapperselectConfig方法,传入config对象作为参数,查询并返回匹配的配置信息对象。

该方法将给定的配置对象 config 插入到数据库中,使用 configMapperinsertConfig 方法执行插入操作,并返回受影响的行数。

如果插入成功(受影响的行数大于0),则将配置信息存储到 Redis 缓存中,使用 redisCachesetCacheObject 方法。

最后,返回插入结果(受影响的行数)。

注解中的 @param 表示方法的参数,@return 表示方法的返回值。

仓库地址:https://github.com/webVueBlog/JavaGuideInterview

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2023-06-21,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
Spring Boot+Vue3 动态菜单实现思路梳理
「松哥最近正在录制 TienChin 项目视频~采用 Spring Boot+Vue3 技术栈,里边会涉及到各种好玩的技术,小伙伴们来和松哥一起做一个完成率超 90% 的项目,戳戳戳这里-->TienChin 项目配套视频来啦。」 ---- 关于 Spring Boot + Vue3 的动态菜单,松哥之前已经写了两篇文章了,这两篇文章主要是从代码上和大家分析动态菜单最终的实现方式,但是还是有小伙伴觉得没太看明白,感觉缺乏一个提纲挈领的思路,所以,今天松哥再整一篇文章和大家再来捋一捋这个问题,希望这篇文章能让
江南一点雨
2022/07/18
1.3K0
Spring Boot+Vue3 动态菜单实现思路梳理
Daily-Blog项目后台日志
使用@ApiOperation(value = "友链评论列表",notes = "获取一页友链评论")来进行标注
用户11097514
2024/05/30
3450
Daily-Blog项目后台日志
TienChin 项目动态菜单接口分析
松哥最近正在录制 TienChin 项目视频~采用 Spring Boot+Vue3 技术栈,里边会涉及到各种好玩的技术,小伙伴们来和松哥一起做一个完成率超 90% 的项目,戳戳戳这里-->TienChin 项目配套视频来啦。 ---- 本文一定要结合Vue 里,多级菜单要如何设计才显得专业?一文一起食用效果良好,否则可能会看不懂。 做过 vhr 的小伙伴应该都知道动态菜单是咋回事,就是不同权限的用户登录成功之后,可以看到不同的菜单项,这在前后端不分的项目中,其实是很好实现的,然而在前后端分离项目中,实现起
江南一点雨
2022/07/12
1.3K0
TienChin 项目动态菜单接口分析
SSM 单体框架 - 教育平台后台管理系统:权限模块开发
其次不同登陆用户要有不同的权利,而且要有不同的菜单(例如财务经理针对系统中财务相关模块进行操作,人事经理针对系统中人事模块进行操作)
RendaZhang
2020/09/24
1.9K0
数据权限,一个注解搞定!
松哥最近正在录制 TienChin 项目视频~采用 Spring Boot+Vue3 技术栈,里边会涉及到各种好玩的技术,小伙伴们来和松哥一起做一个完成率超 90% 的项目,戳戳戳这里-->TienChin 项目配套视频来啦。 ---- 上篇文章松哥和大家介绍了 Spring Security 中常见的八个权限注解,每一个权限注解都有它自己的使用场景,在这些权限注解中,有两个是后置的权限注解:@PostAuthorize 和 @PostFilter,这两个都是在目标方法执行完毕之后进行权限处理,具体的用法小
江南一点雨
2022/05/27
2.6K1
数据权限,一个注解搞定!
手把手带你开发一套用户权限系统,精确到按钮级
在实际的软件项目开发过程中,用户权限控制可以说是所有运营系统中必不可少的一个重点功能,根据业务的复杂度,设计的时候可深可浅,但无论怎么变化,设计的思路基本都是围绕着用户、角色、菜单这三个部分展开。
潘志的技术笔记
2024/06/20
5230
手把手带你开发一套用户权限系统,精确到按钮级
SpringMVC+ZTree实现树形菜单权限配置
Team的Github开源项目链接:https://github.com/u014427391/jeeplatform 欢迎star(收藏)
SmileNicky
2019/01/17
2.8K0
第四章:角色和菜单管理功能【基于Servlet+JSP的图书管理系统】
RoleServlet需要继承前面定义的BaseServlet,然后重写定义的抽象方法。同时要重写list方法。具体如下:
用户4919348
2023/07/11
3860
第四章:角色和菜单管理功能【基于Servlet+JSP的图书管理系统】
vue-element-admin整合SpringBoot实现动态渲染基于角色的菜单资源踩坑录(前后端整合篇)
这篇文章自己准备了好几个周末,如果不是中间踩了太多的坑的话上上的周末就应该发表了,实在是因为踩坑太多而自己也比较执拗,坚持要写出一篇解决掉遇到的99%以上的Bug,能经得起读者实践验证的项目实战文章,拖到今天才发布。笔者一直坚持文章质量重于数量,内容足够好的文章才会让更多的读者传阅。
用户3587585
2021/09/08
1.2K0
vue-element-admin整合SpringBoot实现动态渲染基于角色的菜单资源踩坑录(前后端整合篇)
使用shiro安全管理
之前介绍了springboot使用security进行权限管理,这篇文件介绍一下springboot使用shiro进行安全管理。 简述本文的场景,本文使用springboot1.5.9+mysql+j
dalaoyang
2018/06/13
2.9K0
用Spring Boot+Vue做微人事项目第九天
用Spring Boot+Vue做微人事项目第九天
Java架构师必看
2021/05/14
3520
用Spring Boot+Vue做微人事项目第九天
SpringSecurity
Spring Security 是一个非常强大的身份验证和授权控制框架。为了满足企业项目的不同需求,它提供了很多定制化开发的解决方案,通过简单的调整配置,就能为我们的应用提供一套可靠的安全保障。
堆栈哲学
2022/11/24
5550
SpringSecurity
Spring Security 动态权限实现方案!
松哥最近正在录制 TienChin 项目视频~采用 Spring Boot+Vue3 技术栈,里边会涉及到各种好玩的技术,小伙伴们来和松哥一起做一个完成率超 90% 的项目,戳戳戳这里-->TienChin 项目配套视频来啦。 ---- 最近在做 TienChin 项目,用的是 RuoYi-Vue 脚手架,在这个脚手架中,访问某个接口需要什么权限,这个是在代码中硬编码的,具体怎么实现的,松哥下篇文章来和大家分析,有的小伙伴可能希望能让这个东西像 vhr 一样,可以在数据库中动态配置,因此这篇文章和小伙伴们简
江南一点雨
2022/06/16
1.1K0
Spring Security 动态权限实现方案!
SpringSecurity 授权
例如一个学校图书馆的管理系统,如果是普通学生登录就能看到借书还书相关的功能,不可能让他看到并且去使用添加书籍信息,删除书籍信息等功能。但是如果是一个图书馆管理员的账号登录了,应该就能看到并使用添加书籍信息,删除书籍信息等功能。
用户9615083
2022/12/30
1.5K0
SpringSecurity 授权
基于Java的疫情防控管理系统
☣项目介绍:通过对依社区为单位进行人群的管理,以及疫苗的情况,包括小区状况,通过RBAC进行角色与用户之间的权限管理。
路人甲Java
2021/12/01
9920
基于Java的疫情防控管理系统
SpringSecurity集成JWT实现后端认证授权保姆级教程-授权配置篇
上一篇:SpringSecurity集成JWT实现后端认证授权保姆级教程-认证配置篇 🤞上一节编写了对应的SpringSecurity的认证,本节开始进行SpringSecurity授权🤞
知识浅谈
2024/01/12
3610
SpringSecurity集成JWT实现后端认证授权保姆级教程-授权配置篇
4万字!Spring Security 从入门到精通!
Spring Security 是 Spring 家族中的一个安全管理框架。相比与另外一个安全框架Shiro,它提供了更丰富的功能,社区资源也比Shiro丰富。
一行Java
2023/02/23
7040
4万字!Spring Security 从入门到精通!
SpringBoot整合shiro从初恋到失恋
另外三个跳转页面就不贴出来了,panpan账号登录可以查看和删除,用xiaoli账号登录则只有查看而没有删除的权限,代码见下面,sql文件在resources包下
道可道非常道
2019/05/07
9800
SpringBoot整合shiro从初恋到失恋
SpringBoot集成SpringSecurity - 权限控制(五)
源码地址:https://github.com/springsecuritydemo/microservice-auth-center05
用户1212940
2022/04/13
3890
SpringBoot集成SpringSecurity - 权限控制(五)
jdbc java_SpringBoot打包
一、SpringBootData JPA介绍   SpringData:其实SpringData就是Spring提供了一个操作数据的框架。而SpringData JPA只是SpringData框架下的一个基于JPA标准操作数据的模块。   SpringData JPA:基于JPA的标准数据进行操作。简化操作持久层的代码。只需要编写接口就可以。 二、SpringBoot整合SpringData JPA 1、导入maven依赖  在原有的SprigBoot的maven依赖的基础下加上JPA的依赖
全栈程序员站长
2022/11/01
1.7K0
jdbc java_SpringBoot打包
相关推荐
Spring Boot+Vue3 动态菜单实现思路梳理
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验