常见问题

如何新增系统图标

如果你没有在本项目 Icon 中找到需要的图标,可以到 iconfont.cn 上选择并生成自己的业务图标库,再进行使用。或者其它 svg 图标网站,下载 svg 并放到文件夹之中就可以了。

下载完成之后将下载好的 .svg 文件放入 @/icons/svg 文件夹下之后就会自动导入。

使用方式

<svg-icon icon-class="password" /> // icon-class 为 icon 的名字
1

提示

菜单图标会自动引入@/icons/svg,放入此文件夹中图标就可以选择了

如何不登录直接访问

在 SecurityConfig 中设置httpSecurity 配置匿名访问

.antMatchers("/admins/**").permitAll()
1

提示

匿名访问方法@PreAuthorize权限注解也需要去掉。

前端不登录如何直接访问

如果是前端页面可以在src/permission.js配置whiteList属性白名单即可。

如何获取用户登录信息

  1. 第一种方法
// 获取当前的用户信息
LoginUser currentUser = SecurityUtils.getLoginUser();
// 获取当前的用户名称
String userName = currentUser.getUsername();
1
2
3
4

2、缓存获取当前用户信息

@Autowired
private TokenService tokenService;
	
LoginUser loginUser = tokenService.getLoginUser(ServletUtils.getRequest());
// 获取当前的用户名称
String userName = loginUser.getUsername();
1
2
3
4
5
6

3、vue中获取当前用户信息

var userName = this.$store.state.user.name;
1

提示您没有数据的权限

这种情况都属于权限标识配置不对在菜单管理配置好权限标识(菜单&按钮)

  1. 确认此用户是否已经配置角色
  2. 确认此角色是否已经配置菜单权限
  3. 确认此菜单权限标识是否和后台代码一致

如参数管理
后台配置@PreAuthorize("@ss.hasPermi('system:config:query')")对应参数管理权限标识为system:config:query

注:如需要角色权限,配置角色权限字符 使用@PreAuthorize("@ss.hasRole('admin')")

如何防止请求重复提交

后端可以通过@RepeatSubmit注解控制

/**
 * 在对应方法添加注解 @RepeatSubmit
 */
@RepeatSubmit
public AjaxResult edit()
1
2
3
4
5

异步处理获取用户信息

项目中可以通过SecurityContextHolder.getContext().getAuthentication()获取用户信息,例如

LoginUser loginUser = SecurityUtils.getLoginUser()
1

绝大多数情况下都是通过同步的方式来获取用户信息,如果通过异步获取还需要添加AsyncConfigurerSupport处理。

// 启动类上面添加,开启异步调用
@EnableAsync
// 方法上面添加,异步执行
@Async
1
2
3
4
package com.ruoyi.framework.config;

import java.util.concurrent.Executor;
import java.util.concurrent.Executors;
import org.springframework.context.annotation.Configuration;
import org.springframework.scheduling.annotation.AsyncConfigurerSupport;
import org.springframework.security.concurrent.DelegatingSecurityContextExecutorService;

@Configuration
public class AsyncConfig extends AsyncConfigurerSupport
{
    /**
     * 异步执行需要使用权限框架自带的包装线程池 保证权限信息的传递
     */
    @Override
    public Executor getAsyncExecutor()
    {
        return new DelegatingSecurityContextExecutorService(Executors.newFixedThreadPool(5));
    }
}

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21