Commit c138889a by tangyi

调整ID生成方式、管理员权限优化

parent 9f6d0ba5
...@@ -88,6 +88,8 @@ ...@@ -88,6 +88,8 @@
### 前台 ### 前台
![image](doc/images/image_web_login.png)
![image](doc/images/image_web_exam.png) ![image](doc/images/image_web_exam.png)
![image](doc/images/image_web_exam_card.png) ![image](doc/images/image_web_exam_card.png)
......
package com.github.tangyi.common.core.config;
import com.github.tangyi.common.core.properties.SnowflakeProperties;
import com.github.tangyi.common.core.utils.SnowflakeIdWorker;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
/**
* ID生成配置
*
* @author tangyi
* @date 2019/4/26 11:17
*/
@Configuration
public class SnowFlake {
@Autowired
private SnowflakeProperties snowflakeProperties;
@Bean
public SnowflakeIdWorker initTokenWorker() {
return new SnowflakeIdWorker(Integer.parseInt(snowflakeProperties.getWorkId()), Integer.parseInt(snowflakeProperties.getDataCenterId()));
}
}
...@@ -64,7 +64,7 @@ public class BaseEntity<T> implements Serializable { ...@@ -64,7 +64,7 @@ public class BaseEntity<T> implements Serializable {
*/ */
public void setCommonValue(String userCode, String applicationCode) { public void setCommonValue(String userCode, String applicationCode) {
if (this.isNewRecord()) { if (this.isNewRecord()) {
this.setId(IdGen.uuid()); this.setId(IdGen.snowflakeId());
this.setNewRecord(true); this.setNewRecord(true);
this.creator = userCode; this.creator = userCode;
this.createDate = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date()); this.createDate = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date());
......
package com.github.tangyi.common.core.properties;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.Configuration;
/**
* ID生成配置
*
* @author tangyi
* @date 2019/4/26 10:47
*/
@Configuration
@ConfigurationProperties(prefix = "cluster")
public class SnowflakeProperties {
/**
* 工作节点ID
*/
private String workId;
/**
* 数据中心ID
*/
private String dataCenterId;
public String getWorkId() {
return workId;
}
public void setWorkId(String workId) {
this.workId = workId;
}
public String getDataCenterId() {
return dataCenterId;
}
public void setDataCenterId(String dataCenterId) {
this.dataCenterId = dataCenterId;
}
}
...@@ -8,6 +8,7 @@ import com.github.tangyi.common.core.utils.ReflectionUtil; ...@@ -8,6 +8,7 @@ import com.github.tangyi.common.core.utils.ReflectionUtil;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.transaction.annotation.Transactional; import org.springframework.transaction.annotation.Transactional;
import java.util.ArrayList;
import java.util.List; import java.util.List;
/** /**
...@@ -71,6 +72,8 @@ public abstract class CrudService<D extends CrudMapper<T>, T extends BaseEntity< ...@@ -71,6 +72,8 @@ public abstract class CrudService<D extends CrudMapper<T>, T extends BaseEntity<
* @return List * @return List
*/ */
public List<T> findListById(T entity) { public List<T> findListById(T entity) {
if (entity.getIds() == null || entity.getIds().length == 0)
return new ArrayList<>();
return dao.findListById(entity); return dao.findListById(entity);
} }
......
...@@ -14,7 +14,7 @@ public class FileUtil { ...@@ -14,7 +14,7 @@ public class FileUtil {
* @param fileName fileName * @param fileName fileName
* @return String * @return String
* @author tangyi * @author tangyi
* @date 2018/10/30 0030 下午 10:05 * @date 2018/10/30 22:05
*/ */
public static String getFileNameEx(String fileName) { public static String getFileNameEx(String fileName) {
if ((fileName != null) && (fileName.length() > 0)) { if ((fileName != null) && (fileName.length() > 0)) {
......
...@@ -16,4 +16,15 @@ public class IdGen { ...@@ -16,4 +16,15 @@ public class IdGen {
public static String uuid() { public static String uuid() {
return UUID.randomUUID().toString().replaceAll("-", ""); return UUID.randomUUID().toString().replaceAll("-", "");
} }
/**
* 基于snowflake算法生成ID
*
* @return String
* @author tangyi
* @date 2019/04/26 11:24
*/
public static String snowflakeId() {
return Long.toString(SpringContextHolder.getApplicationContext().getBean(SnowflakeIdWorker.class).nextId());
}
} }
\ No newline at end of file
package com.github.tangyi.common.core.utils;
import cn.hutool.core.date.SystemClock;
/**
* Twitter_Snowflake<br>
* SnowFlake的结构如下(每部分用-分开):<br>
* 0 - 0000000000 0000000000 0000000000 0000000000 0 - 00000 - 00000 - 000000000000 <br>
* 1位标识,由于long基本类型在Java中是带符号的,最高位是符号位,正数是0,负数是1,所以id一般是正数,最高位是0<br>
* 41位时间截(毫秒级),注意,41位时间截不是存储当前时间的时间截,而是存储时间截的差值(当前时间截 - 开始时间截)
* 得到的值),这里的的开始时间截,一般是我们的id生成器开始使用的时间,由我们程序来指定的(如下下面程序IdWorker类的startTime属性)。41位的时间截,可以使用69年,年T = (1L << 41) / (1000L * 60 * 60 * 24 * 365) = 69<br>
* 10位的数据机器位,可以部署在1024个节点,包括5位datacenterId和5位workerId<br>
* 12位序列,毫秒内的计数,12位的计数顺序号支持每个节点每毫秒(同一机器,同一时间截)产生4096个ID序号<br>
* 加起来刚好64位,为一个Long型。<br>
* SnowFlake的优点是,整体上按照时间自增排序,并且整个分布式系统内不会产生ID碰撞(由数据中心ID和机器ID作区分),并且效率较高,经测试,SnowFlake每秒能够产生26万ID左右。
*/
public class SnowflakeIdWorker {
/**
* 机器id所占的位数
*/
private final long workerIdBits = 5L;
/**
* 数据标识id所占的位数
*/
private final long datacenterIdBits = 5L;
/**
* 工作机器ID(0~31)
*/
private long workerId;
/**
* 数据中心ID(0~31)
*/
private long datacenterId;
/**
* 毫秒内序列(0~4095)
*/
private long sequence = 0L;
/**
* 上次生成ID的时间截
*/
private long lastTimestamp = -1L;
/**
* 构造函数
*
* @param workerId 工作ID (0~31)
* @param datacenterId 数据中心ID (0~31)
*/
public SnowflakeIdWorker(long workerId, long datacenterId) {
// 支持的最大机器id,结果是31 (这个移位算法可以很快的计算出几位二进制数所能表示的最大十进制数)
long maxWorkerId = ~(-1L << workerIdBits);
if (workerId > maxWorkerId || workerId < 0) {
throw new IllegalArgumentException(String.format("worker Id can't be greater than %d or less than 0", maxWorkerId));
}
// 支持的最大数据标识id,结果是31
long maxDatacenterId = ~(-1L << datacenterIdBits);
if (datacenterId > maxDatacenterId || datacenterId < 0) {
throw new IllegalArgumentException(String.format("datacenter Id can't be greater than %d or less than 0", maxDatacenterId));
}
this.workerId = workerId;
this.datacenterId = datacenterId;
}
/**
* 获得下一个ID (该方法是线程安全的)
*
* @return SnowflakeId
*/
public synchronized long nextId() {
long timestamp = timeGen();
// 如果当前时间小于上一次ID生成的时间戳,说明系统时钟回退过这个时候应当抛出异常
if (timestamp < lastTimestamp) {
throw new RuntimeException(
String.format("Clock moved backwards. Refusing to generate id for %d milliseconds", lastTimestamp - timestamp));
}
// 如果是同一时间生成的,则进行毫秒内序列
// 序列在id中占的位数
long sequenceBits = 12L;
if (lastTimestamp == timestamp) {
// 生成序列的掩码,这里为4095 (0b111111111111=0xfff=4095)
long sequenceMask = ~(-1L << sequenceBits);
sequence = (sequence + 1) & sequenceMask;
// 毫秒内序列溢出
if (sequence == 0) {
// 阻塞到下一个毫秒,获得新的时间戳
timestamp = tilNextMillis(lastTimestamp);
}
}
// 时间戳改变,毫秒内序列重置
else {
sequence = 0L;
}
// 上次生成ID的时间截
lastTimestamp = timestamp;
long datacenterIdShift = sequenceBits + workerIdBits;
// 时间截向左移22位(5+5+12)
long timestampLeftShift = sequenceBits + workerIdBits + datacenterIdBits;
// 开始时间截 (2015-01-01)
long twepoch = 1420041600000L;
return ((timestamp - twepoch) << timestampLeftShift)
| (datacenterId << datacenterIdShift)
| (workerId << sequenceBits)
| sequence;
}
/**
* 阻塞到下一个毫秒,直到获得新的时间戳
*
* @param lastTimestamp 上次生成ID的时间截
* @return 当前时间戳
*/
private long tilNextMillis(long lastTimestamp) {
long timestamp = timeGen();
while (timestamp <= lastTimestamp) {
timestamp = timeGen();
}
return timestamp;
}
/**
* 返回以毫秒为单位的当前时间
*
* @return 当前时间(毫秒)
*/
private long timeGen() {
return SystemClock.now();
}
}
Config Service
=============
### 手动刷新配置
1. 修改`config-service`服务的`/resources/conf`下对应服务的配置文件
2. 访问对应服务的`/actuator/refresh`,如:`localhost:8000/actuator/refresh`
\ No newline at end of file
...@@ -85,6 +85,7 @@ ignore: ...@@ -85,6 +85,7 @@ ignore:
- /v1/user/findUserByUsername/** - /v1/user/findUserByUsername/**
- /v1/user/checkExist/** - /v1/user/checkExist/**
- /v1/menu/findMenuByRole/** - /v1/menu/findMenuByRole/**
- /v1/menu/findAllMenu
- /v1/code/** - /v1/code/**
- /v1/attachment/download - /v1/attachment/download
- /v1/log/** - /v1/log/**
...@@ -100,8 +101,15 @@ ignore: ...@@ -100,8 +101,15 @@ ignore:
- /loggers/** - /loggers/**
- /mobile/token - /mobile/token
mobile: # 集群ID生成配置
token: test cluster:
workId: ${CLUSTER_WORKID:1}
dataCenterId: ${CLUSTER_DATA_CENTER_ID:1}
# 系统配置
sys:
adminUser: ${ADMIN_USER:admin} # 管理员账号,默认是admin
logging: logging:
level: level:
root: info root: info
......
...@@ -98,6 +98,7 @@ ignore: ...@@ -98,6 +98,7 @@ ignore:
- /hystrix.sender - /hystrix.sender
- /v1/user/findUserByUsername/** - /v1/user/findUserByUsername/**
- /v1/menu/findMenuByRole/** - /v1/menu/findMenuByRole/**
- /v1/menu/findAllMenu
- /v1/user/checkExist/** - /v1/user/checkExist/**
- /v1/code/** - /v1/code/**
- /v1/attachment/download - /v1/attachment/download
...@@ -114,6 +115,11 @@ ignore: ...@@ -114,6 +115,11 @@ ignore:
- /loggers/** - /loggers/**
- /mobile/token - /mobile/token
# 集群ID生成配置
cluster:
workId: ${CLUSTER_WORKID:1}
dataCenterId: ${CLUSTER_DATA_CENTER_ID:1}
logging: logging:
level: level:
root: info root: info
......
...@@ -66,7 +66,7 @@ swagger: ...@@ -66,7 +66,7 @@ swagger:
# 演示环境 # 演示环境
preview: preview:
enabled: ${PREVIEW_ENABLED:false} enabled: ${PREVIEW_ENABLED:false}
ignoreUrls: ignores:
- token - token
- examRecord - examRecord
- saveOrUpdate - saveOrUpdate
...@@ -76,6 +76,11 @@ preview: ...@@ -76,6 +76,11 @@ preview:
- updateInfo - updateInfo
- attachment - attachment
# 集群ID生成配置
cluster:
workId: ${CLUSTER_WORKID:1}
dataCenterId: ${CLUSTER_DATA_CENTER_ID:1}
logging: logging:
level: level:
root: info root: info
......
...@@ -36,3 +36,8 @@ spring: ...@@ -36,3 +36,8 @@ spring:
# zipkin 配置 # zipkin 配置
zipkin: zipkin:
base-url: http://${ZIPKIN_HOST:localhost}:${ZIPKIN_PORT:9411} # 指定了Zipkin服务器的地址 base-url: http://${ZIPKIN_HOST:localhost}:${ZIPKIN_PORT:9411} # 指定了Zipkin服务器的地址
# 集群ID生成配置
cluster:
workId: ${CLUSTER_WORKID:1}
dataCenterId: ${CLUSTER_DATA_CENTER_ID:1}
\ No newline at end of file
...@@ -122,6 +122,7 @@ ignore: ...@@ -122,6 +122,7 @@ ignore:
- /hystrix.sender - /hystrix.sender
- /v1/user/findUserByUsername/** - /v1/user/findUserByUsername/**
- /v1/menu/findMenuByRole/** - /v1/menu/findMenuByRole/**
- /v1/menu/findAllMenu
- /v1/user/register - /v1/user/register
- /v1/user/checkExist/** - /v1/user/checkExist/**
- /v1/code/** - /v1/code/**
...@@ -140,6 +141,11 @@ ignore: ...@@ -140,6 +141,11 @@ ignore:
- /mobile/token - /mobile/token
- /bus/refresh - /bus/refresh
# 集群ID生成配置
cluster:
workId: ${CLUSTER_WORKID:1}
dataCenterId: ${CLUSTER_DATA_CENTER_ID:1}
logging: logging:
level: level:
root: info root: info
......
...@@ -11,7 +11,7 @@ ...@@ -11,7 +11,7 @@
Target Server Version : 50710 Target Server Version : 50710
File Encoding : 65001 File Encoding : 65001
Date: 23/04/2019 20:03:29 Date: 26/04/2019 23:22:30
*/ */
SET NAMES utf8mb4; SET NAMES utf8mb4;
......
doc/images/image_ui.png

120 KB | W: | H:

doc/images/image_ui.png

105 KB | W: | H:

doc/images/image_ui.png
doc/images/image_ui.png
doc/images/image_ui.png
doc/images/image_ui.png
  • 2-up
  • Swipe
  • Onion skin
doc/images/image_ui_attachment.png

51.1 KB | W: | H:

doc/images/image_ui_attachment.png

43 KB | W: | H:

doc/images/image_ui_attachment.png
doc/images/image_ui_attachment.png
doc/images/image_ui_attachment.png
doc/images/image_ui_attachment.png
  • 2-up
  • Swipe
  • Onion skin
doc/images/image_ui_exam.png

69.2 KB | W: | H:

doc/images/image_ui_exam.png

61.8 KB | W: | H:

doc/images/image_ui_exam.png
doc/images/image_ui_exam.png
doc/images/image_ui_exam.png
doc/images/image_ui_exam.png
  • 2-up
  • Swipe
  • Onion skin
doc/images/image_ui_exam_subject.png

73.2 KB | W: | H:

doc/images/image_ui_exam_subject.png

157 KB | W: | H:

doc/images/image_ui_exam_subject.png
doc/images/image_ui_exam_subject.png
doc/images/image_ui_exam_subject.png
doc/images/image_ui_exam_subject.png
  • 2-up
  • Swipe
  • Onion skin
doc/images/image_ui_menu.png

53.2 KB | W: | H:

doc/images/image_ui_menu.png

123 KB | W: | H:

doc/images/image_ui_menu.png
doc/images/image_ui_menu.png
doc/images/image_ui_menu.png
doc/images/image_ui_menu.png
  • 2-up
  • Swipe
  • Onion skin
doc/images/image_ui_msg.png

93.4 KB | W: | H:

doc/images/image_ui_msg.png

101 KB | W: | H:

doc/images/image_ui_msg.png
doc/images/image_ui_msg.png
doc/images/image_ui_msg.png
doc/images/image_ui_msg.png
  • 2-up
  • Swipe
  • Onion skin
doc/images/image_ui_subject.png

64.4 KB | W: | H:

doc/images/image_ui_subject.png

101 KB | W: | H:

doc/images/image_ui_subject.png
doc/images/image_ui_subject.png
doc/images/image_ui_subject.png
doc/images/image_ui_subject.png
  • 2-up
  • Swipe
  • Onion skin
doc/images/image_web_exam.png

46.2 KB | W: | H:

doc/images/image_web_exam.png

59 KB | W: | H:

doc/images/image_web_exam.png
doc/images/image_web_exam.png
doc/images/image_web_exam.png
doc/images/image_web_exam.png
  • 2-up
  • Swipe
  • Onion skin
doc/images/image_web_exam_all.png

433 KB | W: | H:

doc/images/image_web_exam_all.png

58.8 KB | W: | H:

doc/images/image_web_exam_all.png
doc/images/image_web_exam_all.png
doc/images/image_web_exam_all.png
doc/images/image_web_exam_all.png
  • 2-up
  • Swipe
  • Onion skin
doc/images/image_web_exam_card.png

38.7 KB | W: | H:

doc/images/image_web_exam_card.png

63.7 KB | W: | H:

doc/images/image_web_exam_card.png
doc/images/image_web_exam_card.png
doc/images/image_web_exam_card.png
doc/images/image_web_exam_card.png
  • 2-up
  • Swipe
  • Onion skin
doc/images/image_web_exam_score.png

20.5 KB | W: | H:

doc/images/image_web_exam_score.png

26.7 KB | W: | H:

doc/images/image_web_exam_score.png
doc/images/image_web_exam_score.png
doc/images/image_web_exam_score.png
doc/images/image_web_exam_score.png
  • 2-up
  • Swipe
  • Onion skin
...@@ -49,3 +49,10 @@ ZIPKIN_PORT=9411 ...@@ -49,3 +49,10 @@ ZIPKIN_PORT=9411
// 演示环境 // 演示环境
PREVIEW_ENABLED=false PREVIEW_ENABLED=false
// ID生成配置
CLUSTER_WORK_ID=1
CLUSTER_DATA_CENTER_ID=1
// 时区设置,否则容器里的时间和主机时间差8小时
TZ=Asia/Shanghai
\ No newline at end of file
...@@ -10,6 +10,7 @@ import java.util.List; ...@@ -10,6 +10,7 @@ import java.util.List;
/** /**
* 演示环境配置 * 演示环境配置
*
* @author tangyi * @author tangyi
* @date 2019/4/23 13:38 * @date 2019/4/23 13:38
*/ */
...@@ -19,13 +20,23 @@ import java.util.List; ...@@ -19,13 +20,23 @@ import java.util.List;
@ConfigurationProperties(prefix = "preview") @ConfigurationProperties(prefix = "preview")
public class PreviewConfig { public class PreviewConfig {
private List<String> ignoreUrls = new ArrayList<>(); private boolean enabled;
public List<String> getIgnoreUrls() { private List<String> ignores = new ArrayList<>();
return ignoreUrls;
public boolean isEnabled() {
return enabled;
}
public void setEnabled(boolean enabled) {
this.enabled = enabled;
}
public List<String> getIgnores() {
return ignores;
} }
public void setIgnoreUrls(List<String> ignoreUrls) { public void setIgnores(List<String> ignores) {
this.ignoreUrls = ignoreUrls; this.ignores = ignores;
} }
} }
...@@ -39,8 +39,9 @@ public class PreviewFilter implements GlobalFilter, Ordered { ...@@ -39,8 +39,9 @@ public class PreviewFilter implements GlobalFilter, Ordered {
public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) { public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
// 当前请求 // 当前请求
ServerHttpRequest request = exchange.getRequest(); ServerHttpRequest request = exchange.getRequest();
// GET或者忽略的URL,直接向下执行 // enabled为false、GET请求、忽略的URL,直接向下执行
if (StrUtil.equalsIgnoreCase(request.getMethodValue(), HttpMethod.GET.name()) || isIgnore(request.getURI().getPath())) logger.debug("preview.enabled:{}", previewConfig.isEnabled());
if (!previewConfig.isEnabled() || StrUtil.equalsIgnoreCase(request.getMethodValue(), HttpMethod.GET.name()) || isIgnore(request.getURI().getPath()))
return chain.filter(exchange); return chain.filter(exchange);
logger.warn("演示环境不能操作,{},{}", request.getMethodValue(), request.getURI().getPath()); logger.warn("演示环境不能操作,{},{}", request.getMethodValue(), request.getURI().getPath());
ServerHttpResponse response = exchange.getResponse(); ServerHttpResponse response = exchange.getResponse();
...@@ -57,7 +58,7 @@ public class PreviewFilter implements GlobalFilter, Ordered { ...@@ -57,7 +58,7 @@ public class PreviewFilter implements GlobalFilter, Ordered {
* @date 2019/04/23 13:44 * @date 2019/04/23 13:44
*/ */
private boolean isIgnore(String uri) { private boolean isIgnore(String uri) {
List<String> ignoreUrls = previewConfig.getIgnoreUrls(); List<String> ignoreUrls = previewConfig.getIgnores();
if (ignoreUrls != null && !ignoreUrls.isEmpty()) { if (ignoreUrls != null && !ignoreUrls.isEmpty()) {
for (String ignoreUrl : ignoreUrls) { for (String ignoreUrl : ignoreUrls) {
if (StrUtil.containsIgnoreCase(uri, ignoreUrl)) if (StrUtil.containsIgnoreCase(uri, ignoreUrl))
......
package com.github.tangyi.auth.controller;
import com.github.tangyi.common.core.model.ResponseBean;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.cloud.context.config.annotation.RefreshScope;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
/**
* @author tangyi
* @date 2019/3/30 14:40
*/
@RestController
// 动态刷新,修改配置后post请求/actuator/refresh
@RefreshScope
public class TestController {
@Value("${mobile.token}")
private String mobileToken;
@RequestMapping("/mobile/token")
public ResponseBean<String> mobileToken() {
return new ResponseBean<>(mobileToken);
}
}
package com.github.tangyi.auth.properties;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.Configuration;
/**
* @author tangyi
* @date 2019/4/26 11:54
*/
@Configuration
@ConfigurationProperties(prefix = "sys")
public class SysProperties {
/**
* 管理员账号
*/
private String adminUser;
public String getAdminUser() {
return adminUser;
}
public void setAdminUser(String adminUser) {
this.adminUser = adminUser;
}
}
package com.github.tangyi.auth.service; package com.github.tangyi.auth.service;
import com.github.tangyi.auth.properties.SysProperties;
import com.github.tangyi.common.core.vo.Role; import com.github.tangyi.common.core.vo.Role;
import com.github.tangyi.common.core.vo.UserVo; import com.github.tangyi.common.core.vo.UserVo;
import com.github.tangyi.common.security.core.GrantedAuthorityImpl; import com.github.tangyi.common.security.core.GrantedAuthorityImpl;
...@@ -33,6 +34,9 @@ public class UserDetailsServiceImpl implements UserDetailsService { ...@@ -33,6 +34,9 @@ public class UserDetailsServiceImpl implements UserDetailsService {
@Autowired @Autowired
private UserServiceClient userServiceClient; private UserServiceClient userServiceClient;
@Autowired
private SysProperties sysProperties;
/** /**
* 加载用户信息 * 加载用户信息
* *
...@@ -72,7 +76,15 @@ public class UserDetailsServiceImpl implements UserDetailsService { ...@@ -72,7 +76,15 @@ public class UserDetailsServiceImpl implements UserDetailsService {
// 权限如果前缀是ROLE_,security就会认为这是个角色信息,而不是权限,例如ROLE_ADMIN就是ADMIN角色,MENU:ADD就是MENU:ADD权限 // 权限如果前缀是ROLE_,security就会认为这是个角色信息,而不是权限,例如ROLE_ADMIN就是ADMIN角色,MENU:ADD就是MENU:ADD权限
authorities.add(new GrantedAuthorityImpl(role.getRoleCode())); authorities.add(new GrantedAuthorityImpl(role.getRoleCode()));
// 根据角色查找菜单权限 // 根据角色查找菜单权限
Stream<Menu> menuStream = userServiceClient.findMenuByRole(role.getRoleCode()).stream(); Stream<Menu> menuStream;
// 判断是否是管理员,是则查找所有菜单权限
if (userVo.getUsername().equals(sysProperties.getAdminUser())) {
// 查找所有菜单权限,因为角色一般是一个,这里只会执行一次
menuStream = userServiceClient.findAllMenu().stream();
} else {
// 根据角色查找菜单权限
menuStream = userServiceClient.findMenuByRole(role.getRoleCode()).stream();
}
if (Optional.ofNullable(menuStream).isPresent()) { if (Optional.ofNullable(menuStream).isPresent()) {
menuStream menuStream
// 菜单权限 // 菜单权限
......
...@@ -49,7 +49,7 @@ public class SubjectService extends CrudService<SubjectMapper, Subject> { ...@@ -49,7 +49,7 @@ public class SubjectService extends CrudService<SubjectMapper, Subject> {
* @param subject subject * @param subject subject
* @return int * @return int
* @author tangyi * @author tangyi
* @date 2019/01/23 下午 8:19 * @date 2019/01/23 20:19
*/ */
int getExaminationTotalSubject(Subject subject) { int getExaminationTotalSubject(Subject subject) {
return this.dao.getExaminationTotalSubject(subject); return this.dao.getExaminationTotalSubject(subject);
......
...@@ -63,7 +63,7 @@ public class LogController extends BaseController { ...@@ -63,7 +63,7 @@ public class LogController extends BaseController {
* @param log log * @param log log
* @return PageInfo * @return PageInfo
* @author tangyi * @author tangyi
* @date 2018/10/24 0024 下午 10:13 * @date 2018/10/24 0024 22:13
*/ */
@RequestMapping("logList") @RequestMapping("logList")
@ApiOperation(value = "获取日志列表") @ApiOperation(value = "获取日志列表")
......
...@@ -215,6 +215,21 @@ public class MenuController extends BaseController { ...@@ -215,6 +215,21 @@ public class MenuController extends BaseController {
} }
/** /**
* 查询所有菜单
*
* @return List
* @author tangyi
* @date 2019/04/26 11:50
*/
@GetMapping("findAllMenu")
@ApiOperation(value = "查询所有菜单", notes = "查询所有菜单")
public List<Menu> findAllMenu() {
Menu menu = new Menu();
menu.setApplicationCode(SysUtil.getSysCode());
return menuService.findAllList(menu);
}
/**
* 根据角色查找菜单 * 根据角色查找菜单
* *
* @param roleCode 角色code * @param roleCode 角色code
......
...@@ -84,7 +84,7 @@ public class RoleController extends BaseController { ...@@ -84,7 +84,7 @@ public class RoleController extends BaseController {
* @param role role * @param role role
* @return PageInfo * @return PageInfo
* @author tangyi * @author tangyi
* @date 2018/10/24 0024 下午 10:13 * @date 2018/10/24 22:13
*/ */
@RequestMapping("roleList") @RequestMapping("roleList")
@ApiOperation(value = "获取角色列表") @ApiOperation(value = "获取角色列表")
...@@ -175,7 +175,7 @@ public class RoleController extends BaseController { ...@@ -175,7 +175,7 @@ public class RoleController extends BaseController {
* @param role role * @param role role
* @return ResponseBean * @return ResponseBean
* @author tangyi * @author tangyi
* @date 2018/10/28 下午 2:20 * @date 2018/10/28 14:20
*/ */
@PutMapping("roleMenuUpdate") @PutMapping("roleMenuUpdate")
@ApiOperation(value = "更新角色菜单信息", notes = "更新角色菜单信息") @ApiOperation(value = "更新角色菜单信息", notes = "更新角色菜单信息")
......
...@@ -59,7 +59,7 @@ public class MenuService extends CrudService<MenuMapper, Menu> { ...@@ -59,7 +59,7 @@ public class MenuService extends CrudService<MenuMapper, Menu> {
* @param menu menu * @param menu menu
* @return int * @return int
* @author tangyi * @author tangyi
* @date 2018/10/28 0028 下午 3:56 * @date 2018/10/28 15:56
*/ */
@Transactional @Transactional
@Override @Override
...@@ -73,7 +73,7 @@ public class MenuService extends CrudService<MenuMapper, Menu> { ...@@ -73,7 +73,7 @@ public class MenuService extends CrudService<MenuMapper, Menu> {
* @param menu menu * @param menu menu
* @return int * @return int
* @author tangyi * @author tangyi
* @date 2018/10/30 0030 下午 8:19 * @date 2018/10/30 20:19
*/ */
@Transactional @Transactional
@Override @Override
......
...@@ -28,7 +28,7 @@ public class RoleMenuService extends CrudService<RoleMenuMapper, RoleMenu> { ...@@ -28,7 +28,7 @@ public class RoleMenuService extends CrudService<RoleMenuMapper, RoleMenu> {
* @param menus 菜单ID集合 * @param menus 菜单ID集合
* @return int * @return int
* @author tangyi * @author tangyi
* @date 2018/10/28 0028 下午 2:29 * @date 2018/10/28 14:29
*/ */
@Transactional @Transactional
@CacheEvict(value = "menu", allEntries = true) @CacheEvict(value = "menu", allEntries = true)
...@@ -40,7 +40,7 @@ public class RoleMenuService extends CrudService<RoleMenuMapper, RoleMenu> { ...@@ -40,7 +40,7 @@ public class RoleMenuService extends CrudService<RoleMenuMapper, RoleMenu> {
List<RoleMenu> roleMenus = new ArrayList<>(); List<RoleMenu> roleMenus = new ArrayList<>();
for (String menuId : menus) { for (String menuId : menus) {
RoleMenu roleMenu = new RoleMenu(); RoleMenu roleMenu = new RoleMenu();
roleMenu.setId(IdGen.uuid()); roleMenu.setId(IdGen.snowflakeId());
roleMenu.setRoleId(role); roleMenu.setRoleId(role);
roleMenu.setMenuId(menuId); roleMenu.setMenuId(menuId);
roleMenus.add(roleMenu); roleMenus.add(roleMenu);
...@@ -56,7 +56,7 @@ public class RoleMenuService extends CrudService<RoleMenuMapper, RoleMenu> { ...@@ -56,7 +56,7 @@ public class RoleMenuService extends CrudService<RoleMenuMapper, RoleMenu> {
* @param roleMenus roleMenus * @param roleMenus roleMenus
* @return int * @return int
* @author tangyi * @author tangyi
* @date 2018/10/30 0030 下午 7:59 * @date 2018/10/30 19:59
*/ */
@Transactional @Transactional
public int insertBatch(List<RoleMenu> roleMenus) { public int insertBatch(List<RoleMenu> roleMenus) {
......
...@@ -44,7 +44,7 @@ public class RoleService extends CrudService<RoleMapper, Role> { ...@@ -44,7 +44,7 @@ public class RoleService extends CrudService<RoleMapper, Role> {
if (StringUtils.isNotBlank(role.getDeptId())) { if (StringUtils.isNotBlank(role.getDeptId())) {
RoleDept roleDept = new RoleDept(); RoleDept roleDept = new RoleDept();
roleDept.setRoleId(role.getId()); roleDept.setRoleId(role.getId());
roleDept.setId(IdGen.uuid()); roleDept.setId(IdGen.snowflakeId());
roleDept.setDeptId(role.getDeptId()); roleDept.setDeptId(role.getDeptId());
roleDeptMapper.insert(roleDept); roleDeptMapper.insert(roleDept);
} }
...@@ -65,7 +65,7 @@ public class RoleService extends CrudService<RoleMapper, Role> { ...@@ -65,7 +65,7 @@ public class RoleService extends CrudService<RoleMapper, Role> {
RoleDept roleDept = new RoleDept(); RoleDept roleDept = new RoleDept();
roleDept.setRoleId(role.getId()); roleDept.setRoleId(role.getId());
roleDeptMapper.deleteByRoleId(role.getId()); roleDeptMapper.deleteByRoleId(role.getId());
roleDept.setId(IdGen.uuid()); roleDept.setId(IdGen.snowflakeId());
roleDept.setDeptId(role.getDeptId()); roleDept.setDeptId(role.getDeptId());
roleDeptMapper.insert(roleDept); roleDeptMapper.insert(roleDept);
} }
......
...@@ -142,7 +142,7 @@ public class UserService extends CrudService<UserMapper, User> { ...@@ -142,7 +142,7 @@ public class UserService extends CrudService<UserMapper, User> {
if (CollectionUtils.isNotEmpty(userDto.getRole())) { if (CollectionUtils.isNotEmpty(userDto.getRole())) {
userDto.getRole().forEach(roleId -> { userDto.getRole().forEach(roleId -> {
UserRole role = new UserRole(); UserRole role = new UserRole();
role.setId(IdGen.uuid()); role.setId(IdGen.snowflakeId());
role.setUserId(user.getId()); role.setUserId(user.getId());
role.setRoleId(roleId); role.setRoleId(roleId);
// 保存角色信息 // 保存角色信息
......
...@@ -24,7 +24,7 @@ public class MenuUtil { ...@@ -24,7 +24,7 @@ public class MenuUtil {
* @param menu menu * @param menu menu
* @return List * @return List
* @author tangyi * @author tangyi
* @date 2018/10/28 0028 下午 3:59 * @date 2018/10/28 15:59
*/ */
public static List<Menu> initMenuPermission(Menu menu) { public static List<Menu> initMenuPermission(Menu menu) {
List<Menu> menus = new ArrayList<>(); List<Menu> menus = new ArrayList<>();
......
...@@ -104,4 +104,14 @@ public interface UserServiceClient { ...@@ -104,4 +104,14 @@ public interface UserServiceClient {
*/ */
@GetMapping("/v1/menu/findMenuByRole/{role}") @GetMapping("/v1/menu/findMenuByRole/{role}")
List<Menu> findMenuByRole(@PathVariable("role") String role); List<Menu> findMenuByRole(@PathVariable("role") String role);
/**
* 查询所有菜单
*
* @return List
* @author tangyi
* @date 2019/04/26 11:48
*/
@GetMapping("/v1/menu/findAllMenu")
List<Menu> findAllMenu();
} }
...@@ -124,6 +124,17 @@ public class UserServiceClientFallbackImpl implements UserServiceClient { ...@@ -124,6 +124,17 @@ public class UserServiceClientFallbackImpl implements UserServiceClient {
return new ArrayList<>(); return new ArrayList<>();
} }
/**
* 查询所有菜单
*
* @return List
*/
@Override
public List<Menu> findAllMenu() {
logger.error("feign 获取所有菜单失败,{}", throwable);
return new ArrayList<>();
}
public Throwable getThrowable() { public Throwable getThrowable() {
return throwable; return throwable;
} }
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment