Commit 4acc8dbe by 慕容若冰 Committed by Gitee

!1 dev->master

Merge pull request !1 from 慕容若冰/dev
parents 131f4c8e 85e38885
Version v3.0.0 (2019-7-4)
--------------------------
改进:
* 重构账号模块,将账号表拆分成用户基本信息表,用户授权表
* 基本字段create_date、modify_date改为timestamp类型
Version v3.0.0 (2019-7-2)
--------------------------
......@@ -6,7 +14,6 @@ Version v3.0.0 (2019-7-2)
* 优化swagger ui配置,增加租户标识请求头
* 完善手机号登录
Version v3.0.0 (2019-6-23)
--------------------------
......
......@@ -11,7 +11,7 @@ public class CommonConstant {
/**
* 正常
*/
public static final String STATUS_NORMAL = "0";
public static final Integer STATUS_NORMAL = 0;
/**
* 异常
......
......@@ -17,8 +17,7 @@ public class Log extends BaseEntity<Log> {
/**
* 日志类型
*/
@NotBlank(message = "日志类型不能为空")
private String type;
private Integer type;
/**
* 日志标题
......
......@@ -10,6 +10,7 @@ import org.apache.commons.lang.StringUtils;
import java.io.Serializable;
import java.time.LocalDateTime;
import java.util.Date;
/**
* Entity基类
......@@ -33,7 +34,7 @@ public class BaseEntity<T> implements Serializable {
/**
* 创建日期
*/
protected String createDate;
protected Date createDate;
/**
* 更新者
......@@ -43,7 +44,7 @@ public class BaseEntity<T> implements Serializable {
/**
* 更新日期
*/
protected String modifyDate;
protected Date modifyDate;
/**
* 删除标记 0:正常,1-删除
......@@ -107,7 +108,7 @@ public class BaseEntity<T> implements Serializable {
* @param tenantCode 租户编号
*/
public void setCommonValue(String userCode, String applicationCode, String tenantCode) {
String currentDate = DateUtils.localDateToString(LocalDateTime.now());
Date currentDate = DateUtils.asDate(LocalDateTime.now());
if (this.isNewRecord()) {
this.setId(IdGen.snowflakeId());
this.setNewRecord(true);
......
package com.github.tangyi.common.core.utils;
import java.time.Instant;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.ZoneId;
import java.time.format.DateTimeFormatter;
import java.util.Date;
/**
* 日期工具类
......@@ -34,4 +38,44 @@ public class DateUtils {
public static String localDateMillisToString(LocalDateTime date) {
return date != null ? date.format(FORMATTER_MILLIS) : "";
}
/**
* LocalDate转Date
*
* @param localDate localDate
* @return Date
*/
public static Date asDate(LocalDate localDate) {
return Date.from(localDate.atStartOfDay().atZone(ZoneId.systemDefault()).toInstant());
}
/**
* LocalDateTime转Date
*
* @param localDateTime localDateTime
* @return Date
*/
public static Date asDate(LocalDateTime localDateTime) {
return Date.from(localDateTime.atZone(ZoneId.systemDefault()).toInstant());
}
/**
* Date转LocalDate
*
* @param date date
* @return LocalDate
*/
public static LocalDate asLocalDate(Date date) {
return Instant.ofEpochMilli(date.getTime()).atZone(ZoneId.systemDefault()).toLocalDate();
}
/**
* Date转LocalDateTime
*
* @param date date
* @return LocalDateTime
*/
public static LocalDateTime asLocalDateTime(Date date) {
return Instant.ofEpochMilli(date.getTime()).atZone(ZoneId.systemDefault()).toLocalDateTime();
}
}
......@@ -57,4 +57,18 @@ public class PageUtil {
PageHelper.orderBy(orderBy(sort, order));
return page;
}
/**
* 复制属性
*
* @param source source
* @param target target
* @author tangyi
* @date 2019/07/03 22:26:18
*/
public static void copyProperties(PageInfo<?> source, PageInfo<?> target) {
target.setTotal(source.getTotal());
target.setPageSize(source.getPageSize());
target.setPageNum(source.getPageNum());
}
}
......@@ -10,7 +10,7 @@ import lombok.Data;
* @date 2018-08-25 13:58
*/
@Data
public class Role extends BaseEntity<Role> {
public class RoleVo extends BaseEntity<RoleVo> {
private String roleName;
......
......@@ -3,6 +3,7 @@ package com.github.tangyi.common.core.vo;
import com.github.tangyi.common.core.persistence.BaseEntity;
import lombok.Data;
import java.util.Date;
import java.util.List;
/**
......@@ -15,24 +16,24 @@ import java.util.List;
public class UserVo extends BaseEntity<UserVo> {
/**
* 姓名
* 授权类型,1:用户名密码,2:手机号,3:邮箱,4:微信,5:QQ
*/
private String name;
private Integer identityType;
/**
* 用户名
* 唯一标识,如用户名、手机号
*/
private String username;
private String identifier;
/**
* 密码
* 密码凭证,跟授权类型有关,如密码、第三方系统的token等
*/
private String password;
private String credential;
/**
* 随机盐
* 姓名
*/
private String salt;
private String name;
/**
* 电话号码
......@@ -52,12 +53,12 @@ public class UserVo extends BaseEntity<UserVo> {
/**
* 性别
*/
private String sex;
private Integer sex;
/**
* 生日
*/
private String born;
private Date born;
/**
* 部门名称
......@@ -72,17 +73,17 @@ public class UserVo extends BaseEntity<UserVo> {
/**
* 角色列表
*/
private List<Role> roleList;
private List<RoleVo> roleList;
/**
* 备注
* 详细描述
*/
private String remark;
private String userDesc;
/**
* 状态,0-启用,1-禁用
*/
private String status;
private Integer status;
}
package com.github.tangyi.common.feign.config;
import feign.Feign;
import okhttp3.ConnectionPool;
import okhttp3.OkHttpClient;
import org.springframework.boot.autoconfigure.AutoConfigureBefore;
import org.springframework.boot.autoconfigure.condition.ConditionalOnClass;
import org.springframework.cloud.openfeign.FeignAutoConfiguration;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import java.util.concurrent.TimeUnit;
/**
* okHttp配置
*
* @author tangyi
* @date 2019/07/02 22:31
*/
@Configuration
@ConditionalOnClass(Feign.class)
@AutoConfigureBefore(FeignAutoConfiguration.class)
public class FeignOkHttpConfig {
@Bean
public OkHttpClient okHttpClient() {
return new OkHttpClient.Builder()
// 连接超时
.connectTimeout(60, TimeUnit.SECONDS)
// 读超时
.readTimeout(60, TimeUnit.SECONDS)
// 写超时
.writeTimeout(60, TimeUnit.SECONDS)
// 是否自动重连
.retryOnConnectionFailure(true)
.connectionPool(new ConnectionPool())
// 日志拦截器
//.addInterceptor(new LogInterceptor())
.build();
}
}
package com.github.tangyi.common.feign.interceptor;
import okhttp3.Interceptor;
import okhttp3.Request;
import okhttp3.Response;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.io.IOException;
/**
* 日志拦截器
*
* @author tangyi
* @date 2019/07/02 23:00
*/
public class LogInterceptor implements Interceptor {
private static Logger logger = LoggerFactory.getLogger(LogInterceptor.class);
@Override
public Response intercept(Chain chain) throws IOException {
long t1 = System.nanoTime();
Request request = chain.request();
logger.debug(String.format("sending %s request %s%n%s", request.method(),
request.url(), request.headers()));
Response response = chain.proceed(request);
long t2 = System.nanoTime();
logger.debug(String.format("received response for %s in %.1fms%n%s", response.request().url(),
(t2 - t1) / 1e6d, response.headers()));
return response;
}
}
......@@ -2,7 +2,7 @@ server:
port: 8090
spring:
datasource:
url: jdbc:mysql://${MYSQL_HOST:localhost}:${MYSQL_PORT:3306}/microservice-auth?useUnicode=true&useJDBCCompliantTimezoneShift=true&useLegacyDatetimeCode=false&serverTimezone=UTC&characterEncoding=UTF-8
url: jdbc:mysql://${MYSQL_HOST:localhost}:${MYSQL_PORT:3306}/microservice-auth?useUnicode=true&useJDBCCompliantTimezoneShift=true&useLegacyDatetimeCode=false&serverTimezone=CTT&characterEncoding=UTF-8
username: ${MYSQL_USERNAME:root}
password: ${MYSQL_PASSWORD:11}
type: com.zaxxer.hikari.HikariDataSource
......@@ -34,7 +34,12 @@ spring:
zipkin:
base-url: http://${ZIPKIN_HOST:localhost}:${ZIPKIN_PORT:9411} # 指定了Zipkin服务器的地址
# feign相关配置
feign:
httpclient:
enabled: false
okhttp:
enabled: true
hystrix:
enabled: true
......@@ -83,8 +88,7 @@ ignore:
- /actuator/**
- /hystrix.sender
- /v1/sms/**
- /v1/user/findUserBySocial/**
- /v1/user/findUserByUsername/**
- /v1/user/findUserByIdentifier/**
- /v1/tenant/findTenantByTenantCode/**
- /v1/user/checkExist/**
- /v1/user/updatePassword
......
......@@ -2,7 +2,7 @@ server:
port: 8098
spring:
datasource:
url: jdbc:mysql://${MYSQL_HOST:localhost}:${MYSQL_PORT:3306}/microservice-exam?useUnicode=true&useJDBCCompliantTimezoneShift=true&useLegacyDatetimeCode=false&serverTimezone=UTC&characterEncoding=UTF-8
url: jdbc:mysql://${MYSQL_HOST:localhost}:${MYSQL_PORT:3306}/microservice-exam?useUnicode=true&useJDBCCompliantTimezoneShift=true&useLegacyDatetimeCode=false&serverTimezone=CTT&characterEncoding=UTF-8
username: ${MYSQL_USERNAME:root}
password: ${MYSQL_PASSWORD:11}
type: com.zaxxer.hikari.HikariDataSource
......@@ -73,7 +73,12 @@ pagehelper:
supportMethodsArguments: true
params: count=countSql
# feign相关配置
feign:
httpclient:
enabled: false
okhttp:
enabled: true
hystrix:
enabled: true
......@@ -107,8 +112,7 @@ ignore:
- /actuator/**
- /hystrix.sender
- /v1/sms/**
- /v1/user/findUserByUsername/**
- /v1/user/findUserBySocial/**
- /v1/user/findUserByIdentifier/**
- /v1/tenant/findTenantByTenantCode/**
- /v1/menu/findMenuByRole/**
- /v1/menu/findAllMenu
......
......@@ -32,7 +32,12 @@ security:
encode:
key: '1234567887654321'
# feign相关配置
feign:
httpclient:
enabled: false
okhttp:
enabled: true
hystrix:
enabled: true
......
......@@ -8,7 +8,7 @@ spring:
# 单次请求的文件的总大小
max-request-size: 100MB
datasource:
url: jdbc:mysql://${MYSQL_HOST:localhost}:${MYSQL_PORT:3306}/microservice-user?useUnicode=true&useJDBCCompliantTimezoneShift=true&useLegacyDatetimeCode=false&serverTimezone=UTC&characterEncoding=UTF-8
url: jdbc:mysql://${MYSQL_HOST:localhost}:${MYSQL_PORT:3306}/microservice-user?useUnicode=true&useJDBCCompliantTimezoneShift=true&useLegacyDatetimeCode=false&serverTimezone=CTT&characterEncoding=UTF-8
username: ${MYSQL_USERNAME:root}
password: ${MYSQL_PASSWORD:11}
type: com.zaxxer.hikari.HikariDataSource
......@@ -89,15 +89,21 @@ fdfs:
width: 150
height: 150
tracker-list: #TrackerList参数,支持多个
- ${FDFS_HOST:118.25.138.130}:${FDFS_PORT:22122}
- ${FDFS_HOST:192.168.0.95}:${FDFS_PORT:22122}
# 系统配置
sys:
fdfsHttpHost: ${ATTACHMENT_HOST:http://118.25.138.130}:${ATTACHMENT_PORT:8080} # fastDfs的HTTP配置
adminUser: ${ADMIN_USER:admin} # 管理员账号,默认是admin
fdfsHttpHost: ${ATTACHMENT_HOST:http://192.168.0.95}:${ATTACHMENT_PORT:8080} # fastDfs的HTTP配置
uploadUrl: api/user/v1/attachment/upload
defaultAvatar: https://wpimg.wallstcn.com/f778738c-e4f8-4870-b634-56703b4acafe.gif?imageView2/1/w/80/h/80
# feign相关配置
feign:
httpclient:
enabled: false
okhttp:
enabled: true
hystrix:
enabled: true
......@@ -132,8 +138,7 @@ ignore:
- /hystrix.sender
- /v1/sms/**
- /v1/mobile/**
- /v1/user/findUserByUsername/**
- /v1/user/findUserBySocial/**
- /v1/user/findUserByIdentifier/**
- /v1/tenant/findTenantByTenantCode/**
- /v1/menu/findMenuByRole/**
- /v1/menu/findAllMenu
......
......@@ -53,6 +53,19 @@ services:
- net
# ---------------------------
# 消息服务
# ---------------------------
msc-service:
image: registry.cn-hangzhou.aliyuncs.com/spring-microservice-exam/msc-service:3.0.0
container_name: msc-service
env_file: docker-compose.env # 从文件中获取配置
restart: always
ports:
- "9000:9000"
networks:
- net
# ---------------------------
# 监控服务
# ---------------------------
monitor-service:
......
......@@ -11,7 +11,7 @@
Target Server Version : 50617
File Encoding : 65001
Date: 09/06/2019 16:45:45
Date: 04/07/2019 14:36:21
*/
SET NAMES utf8mb4;
......@@ -36,10 +36,10 @@ CREATE TABLE `oauth_client_details` (
`additional_information` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,
`autoapprove` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,
`creator` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '创建人',
`create_date` varchar(64) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '创建时间',
`create_date` timestamp(0) NULL DEFAULT NULL COMMENT '创建时间',
`modifier` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '修改人',
`modify_date` varchar(64) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '修改时间',
`del_flag` varchar(20) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '删除标记',
`modify_date` timestamp(0) NULL DEFAULT NULL COMMENT '修改时间',
`del_flag` int(20) NULL DEFAULT NULL COMMENT '删除标记',
`application_code` varchar(64) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '系统编号',
`tenant_code` varchar(64) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '租户编号',
PRIMARY KEY (`id`) USING BTREE
......@@ -48,6 +48,6 @@ CREATE TABLE `oauth_client_details` (
-- ----------------------------
-- Records of oauth_client_details
-- ----------------------------
INSERT INTO `oauth_client_details` VALUES ('471037a0c1be4df99b40e3f84141cc56', 'web_app', NULL, 'spring-microservice-exam-secret', '$2a$10$IWLD8r7e0rKMW.ZhGsGCUO./MZUNDKudIswSToa9puXJwty.h59.u', 'read,write', 'password,authorization_code,refresh_token,implicit', NULL, NULL, '3600', '21600', NULL, NULL, 'admin', '2019-03-30 23:43:07', 'admin', '2019-06-07 21:48:31', '0', 'EXAM', NULL);
INSERT INTO `oauth_client_details` VALUES ('471037a0c1be4df99b40e3f84141cc56', 'web_app', NULL, 'spring-microservice-exam-secret', '$2a$10$IWLD8r7e0rKMW.ZhGsGCUO./MZUNDKudIswSToa9puXJwty.h59.u', 'read,write', 'password,authorization_code,refresh_token,implicit', NULL, NULL, '3600', '21600', NULL, NULL, 'admin', '2019-03-30 23:43:07', 'admin', '2019-07-04 10:52:15', 0, 'EXAM', NULL);
SET FOREIGN_KEY_CHECKS = 1;
......@@ -13,6 +13,7 @@ AUTH_SERVICE=$BASE_IMAGE_NAME/auth-service:$BSEE_IMAGE_TAG
USER_SERVICE=$BASE_IMAGE_NAME/user-service:$BSEE_IMAGE_TAG
EXAM_SERVICE=$BASE_IMAGE_NAME/exam-service:$BSEE_IMAGE_TAG
GATEWAY_SERVICE=$BASE_IMAGE_NAME/gateway-service:$BSEE_IMAGE_TAG
MSC_SERVICE=$BASE_IMAGE_NAME/msc-service:$BSEE_IMAGE_TAG
MONITOR_SERVICE=$BASE_IMAGE_NAME/monitor-service:$BSEE_IMAGE_TAG
UI_SERVICE=$BASE_IMAGE_NAME/spring-microservice-exam-ui:$BSEE_IMAGE_TAG
WEB_SERVICE=$BASE_IMAGE_NAME/spring-microservice-exam-web:$BSEE_IMAGE_TAG
......@@ -33,6 +34,7 @@ case "$1" in
time docker pull $USER_SERVICE
time docker pull $EXAM_SERVICE
time docker pull $GATEWAY_SERVICE
time docker pull $MSC_SERVICE
time docker pull $MONITOR_SERVICE
echo "* 开始拉取前端镜像..."
time docker pull $UI_SERVICE
......@@ -61,6 +63,7 @@ case "$1" in
time docker pull $USER_SERVICE
time docker pull $EXAM_SERVICE
time docker pull $GATEWAY_SERVICE
time docker pull $MSC_SERVICE
time docker pull $MONITOR_SERVICE
echo "* 开始拉取前端镜像..."
time docker pull $UI_SERVICE
......
......@@ -5,6 +5,14 @@
#### 考试服务数据库PDM
![image](产品设计/数据库PDM.jpg)
![image](产品设计/数据库PDM-考试服务.png)
#### 用户服务数据库PDM
![image](产品设计/数据库PDM-用户服务.png)
#### 授权服务数据库PDM
![image](产品设计/数据库PDM-授权服务.png)
如有问题欢迎指出!
\ No newline at end of file
......@@ -26,6 +26,7 @@ import java.nio.charset.StandardCharsets;
/**
* 解密过滤器
* 对外密码字段的名称是credential,在这里解密,转换成password
*
* @author tangyi
* @date 2019/3/18 11:30
......@@ -39,6 +40,10 @@ public class DecodePasswordFilter implements GlobalFilter, Ordered {
private static final String DEFAULT_CIPHER_ALGORITHM = "AES/CBC/NOPadding";
private static final String CREDENTIAL = "credential";
private static final String PASSWORD = "password";
/**
* 约定的key
*/
......@@ -57,21 +62,26 @@ public class DecodePasswordFilter implements GlobalFilter, Ordered {
String grantType = request.getQueryParams().getFirst(GatewayConstant.GRANT_TYPE);
// 授权类型为密码模式则解密
if (CommonConstant.GRANT_TYPE_PASSWORD.equals(grantType) || StrUtil.containsAnyIgnoreCase(uri.getPath(), GatewayConstant.REGISTER)) {
String password = request.getQueryParams().getFirst(CommonConstant.GRANT_TYPE_PASSWORD);
if (password == null || password.isEmpty()) {
log.info("password is empty...");
String credential = request.getQueryParams().getFirst(CREDENTIAL);
if (credential == null || credential.isEmpty()) {
log.info("credential is empty...");
exchange.getResponse().setStatusCode(HttpStatus.UNAUTHORIZED);
return exchange.getResponse().setComplete();
}
try {
// 开始解密
password = decryptAES(password, key);
password = password.trim();
log.debug("password decrypt success:{}", password);
credential = decryptAES(credential, key);
credential = credential.trim();
log.debug("credential decrypt success:{}", credential);
} catch (Exception e) {
log.error("password decrypt fail:{}", password);
log.error("credential decrypt fail:{}", credential);
}
URI newUri = UriComponentsBuilder.fromUri(uri).replaceQueryParam(CommonConstant.GRANT_TYPE_PASSWORD, password).build(true).toUri();
URI newUri = UriComponentsBuilder.fromUri(uri)
// 替换password字段
.replaceQueryParam(PASSWORD, credential)
// 替换credential字段
.replaceQueryParam(CREDENTIAL, credential)
.build(true).toUri();
request = request.mutate().uri(newUri).build();
return chain.filter(exchange.mutate().request(request).build());
}
......
......@@ -48,7 +48,7 @@ public class CustomAuthenticationSuccessHandler {
Log logInfo = new Log();
logInfo.setCommonValue(username, SysUtil.getSysCode(), tenantCode);
logInfo.setTitle("用户登录");
logInfo.setType(CommonConstant.STATUS_NORMAL);
//logInfo.setType(CommonConstant.STATUS_NORMAL);
// 获取ip、浏览器信息
this.initLogInfo(logInfo, event.getSource());
logInfo.setServiceId(ServiceConstant.AUTH_SERVICE);
......
......@@ -4,7 +4,7 @@ import com.github.tangyi.auth.model.CustomUserDetails;
import com.github.tangyi.auth.properties.SysProperties;
import com.github.tangyi.common.core.constant.CommonConstant;
import com.github.tangyi.common.core.exceptions.TenantNotFoundException;
import com.github.tangyi.common.core.vo.Role;
import com.github.tangyi.common.core.vo.RoleVo;
import com.github.tangyi.common.core.vo.UserVo;
import com.github.tangyi.common.security.core.CustomUserDetailsService;
import com.github.tangyi.common.security.core.GrantedAuthorityImpl;
......@@ -12,6 +12,7 @@ import com.github.tangyi.user.api.constant.MenuConstant;
import com.github.tangyi.user.api.feign.UserServiceClient;
import com.github.tangyi.user.api.module.Menu;
import com.github.tangyi.user.api.module.Tenant;
import com.google.common.collect.Lists;
import lombok.AllArgsConstructor;
import org.apache.commons.collections4.CollectionUtils;
import org.apache.commons.lang.StringUtils;
......@@ -24,7 +25,6 @@ import java.util.HashSet;
import java.util.List;
import java.util.Set;
import java.util.stream.Collectors;
import java.util.stream.Stream;
/**
* 从数据库获取用户信息
......@@ -50,10 +50,10 @@ public class CustomUserDetailsServiceImpl implements CustomUserDetailsService {
@Override
public UserDetails loadUserByUsernameAndTenantCode(String username, String tenantCode) throws UsernameNotFoundException, TenantNotFoundException {
Tenant tenant = this.validateTenantCode(tenantCode);
UserVo userVo = userServiceClient.findUserByUsername(username, tenantCode);
UserVo userVo = userServiceClient.findUserByIdentifier(username, tenantCode);
if (userVo == null)
throw new UsernameNotFoundException("用户名不存在.");
return new CustomUserDetails(username, userVo.getPassword(), CommonConstant.STATUS_NORMAL.equals(userVo.getStatus()), getAuthority(userVo), userVo.getTenantCode());
return new CustomUserDetails(username, userVo.getCredential(), CommonConstant.STATUS_NORMAL.equals(userVo.getStatus()), getAuthority(userVo), userVo.getTenantCode());
}
/**
......@@ -71,7 +71,7 @@ public class CustomUserDetailsServiceImpl implements CustomUserDetailsService {
UserVo userVo = userServiceClient.findUserBySocial(social, tenantCode);
if (userVo == null)
throw new UsernameNotFoundException("用户手机号未注册.");
return new CustomUserDetails(social, userVo.getPassword(), CommonConstant.STATUS_NORMAL.equals(userVo.getStatus()), getAuthority(userVo), userVo.getTenantCode());
return new CustomUserDetails(social, userVo.getCredential(), CommonConstant.STATUS_NORMAL.equals(userVo.getStatus()), getAuthority(userVo), userVo.getTenantCode());
}
/**
......@@ -101,28 +101,32 @@ public class CustomUserDetailsServiceImpl implements CustomUserDetailsService {
private Set<GrantedAuthority> getAuthority(UserVo userVo) {
// 权限集合
Set<GrantedAuthority> authorities = new HashSet<>();
// 角色
List<Role> roleList = userVo.getRoleList();
if (CollectionUtils.isNotEmpty(roleList)) {
roleList.forEach(role -> {
// 权限如果前缀是ROLE_,security就会认为这是个角色信息,而不是权限,例如ROLE_ADMIN就是ADMIN角色,MENU:ADD就是MENU:ADD权限
authorities.add(new GrantedAuthorityImpl(role.getRoleCode()));
// 根据角色查找菜单权限
Stream<Menu> menuStream;
// 判断是否是管理员,是则查找所有菜单权限
if (userVo.getUsername().equals(sysProperties.getAdminUser())) {
// 查找所有菜单权限,因为角色一般是一个,这里只会执行一次
menuStream = userServiceClient.findAllMenu(userVo.getTenantCode()).stream();
} else {
// 根据角色查找菜单权限
List<Menu> menus = Lists.newArrayList();
// 判断是否是管理员,是则查找所有菜单权限
if (userVo.getIdentifier().equals(sysProperties.getAdminUser())) {
// 查找所有菜单权限,因为角色一般是一个,这里只会执行一次
menus = userServiceClient.findAllMenu(userVo.getTenantCode());
} else {
// 根据角色查询菜单权限
List<RoleVo> roleList = userVo.getRoleList();
if (CollectionUtils.isNotEmpty(roleList)) {
for (RoleVo role : roleList) {
// 根据角色查找菜单权限
menuStream = userServiceClient.findMenuByRole(role.getRoleCode(), userVo.getTenantCode()).stream();
List<Menu> roleMenus = userServiceClient.findMenuByRole(role.getRoleCode(), userVo.getTenantCode());
if (CollectionUtils.isNotEmpty(roleMenus))
menus.addAll(roleMenus);
// 权限如果前缀是ROLE_,security就会认为这是个角色信息,而不是权限,例如ROLE_ADMIN就是ADMIN角色,MENU:ADD就是MENU:ADD权限
authorities.add(new GrantedAuthorityImpl(role.getRoleCode()));
}
// 菜单权限
List<GrantedAuthority> menus = menuStream
.filter(menu -> MenuConstant.MENU_TYPE_PERMISSION.equals(menu.getType()))
.map(menu -> new GrantedAuthorityImpl(menu.getPermission())).collect(Collectors.toList());
authorities.addAll(menus);
});
}
}
if (CollectionUtils.isNotEmpty(menus)) {
// 菜单权限
List<GrantedAuthority> authorityList = menus.stream()
.filter(menu -> MenuConstant.MENU_TYPE_PERMISSION.equals(menu.getType()))
.map(menu -> new GrantedAuthorityImpl(menu.getPermission())).collect(Collectors.toList());
authorities.addAll(authorityList);
}
return authorities;
}
......
......@@ -33,7 +33,7 @@ public class ExaminationInitConfig {
log.info("开始加载考试信息.");
// 查询已发布的考试
Examination examination = new Examination();
examination.setStatus(CommonConstant.STATUS_NORMAL);
//examination.setStatus(CommonConstant.STATUS_NORMAL);
Stream<Examination> examinationStream = examinationService.findList(examination).stream();
if (Optional.ofNullable(examinationStream).isPresent())
examinationStream.forEach(tempExamination -> redisTemplate.opsForValue().set("examination::" + tempExamination.getId(), tempExamination));
......
......@@ -293,7 +293,7 @@ public class ExamRecordController extends BaseController {
ExaminationRecordDto recordDto = new ExaminationRecordDto();
recordDto.setId(tempExamRecord.getId());
recordDto.setExaminationName(examRecordExamination.getExaminationName());
recordDto.setExamTime(tempExamRecord.getCreateDate());
//recordDto.setExamTime(tempExamRecord.getCreateDate());
recordDto.setScore(tempExamRecord.getScore());
recordDto.setUserId(tempExamRecord.getUserId());
recordDto.setCorrectNumber(tempExamRecord.getCorrectNumber());
......
......@@ -466,12 +466,12 @@ public class AnswerService extends CrudService<AnswerMapper, Answer> {
answer.setExamRecordId(examRecord.getId());
List<Answer> answers = this.findList(answer);
if (CollectionUtils.isNotEmpty(answers)) {
Long correctNumber = answers.stream().filter(tempAnswer -> tempAnswer.getAnswerType().equals(AnswerConstant.RIGHT)).count();
long correctNumber = answers.stream().filter(tempAnswer -> tempAnswer.getAnswerType().equals(AnswerConstant.RIGHT)).count();
// 总分
Integer score = answers.stream().mapToInt(Answer::getScore).sum();
examRecord.setScore(score);
examRecord.setSubmitStatus(ExamExaminationRecordConstant.STATUS_CALCULATED);
examRecord.setCorrectNumber(correctNumber.intValue());
examRecord.setCorrectNumber((int) correctNumber);
examRecord.setInCorrectNumber(answers.size() - examRecord.getCorrectNumber());
examRecordService.update(examRecord);
log.debug("批改完成,用户名:{},考试ID:{},总分:{},耗时:{}ms", examRecord.getCreator(), examRecord.getExaminationId(), score, System.currentTimeMillis() - start);
......
......@@ -11,9 +11,9 @@
<result column="score" property="score"/>
<result column="mark_status" property="markStatus"/>
<result column="creator" property="creator"/>
<result column="create_date" property="createDate"/>
<result column="create_date" property="createDate" javaType="java.util.Date" jdbcType="TIMESTAMP"/>
<result column="modifier" property="modifier"/>
<result column="modify_date" property="modifyDate"/>
<result column="modify_date" property="modifyDate" javaType="java.util.Date" jdbcType="TIMESTAMP"/>
<result column="del_flag" property="delFlag"/>
<result column="application_code" property="applicationCode"/>
<result column="tenant_code" property="tenantCode"/>
......@@ -109,9 +109,9 @@
#{score},
#{markStatus},
#{creator},
#{createDate},
#{createDate, jdbcType=TIMESTAMP, javaType=java.util.Date},
#{modifier},
#{modifyDate},
#{modifyDate, jdbcType=TIMESTAMP, javaType=java.util.Date},
#{delFlag},
#{applicationCode},
#{tenantCode}
......@@ -145,7 +145,7 @@
del_flag = #{delFlag},
</if>
modifier = #{modifier},
modify_date = #{modifyDate}
modify_date = #{modifyDate, jdbcType=TIMESTAMP, javaType=java.util.Date}
WHERE id = #{id}
</update>
......
......@@ -9,9 +9,9 @@
<result column="teacher" property="teacher"/>
<result column="course_description" property="courseDescription"/>
<result column="creator" property="creator"/>
<result column="create_date" property="createDate"/>
<result column="create_date" property="createDate" javaType="java.util.Date" jdbcType="TIMESTAMP"/>
<result column="modifier" property="modifier"/>
<result column="modify_date" property="modifyDate"/>
<result column="modify_date" property="modifyDate" javaType="java.util.Date" jdbcType="TIMESTAMP"/>
<result column="del_flag" property="delFlag"/>
<result column="application_code" property="applicationCode"/>
<result column="tenant_code" property="tenantCode"/>
......@@ -91,9 +91,9 @@
#{teacher},
#{courseDescription},
#{creator},
#{createDate},
#{createDate, jdbcType=TIMESTAMP, javaType=java.util.Date},
#{modifier},
#{modifyDate},
#{modifyDate, jdbcType=TIMESTAMP, javaType=java.util.Date},
#{delFlag},
#{applicationCode},
#{tenantCode}
......@@ -121,7 +121,7 @@
del_flag = #{delFlag},
</if>
modifier = #{modifier},
modify_date = #{modifyDate}
modify_date = #{modifyDate, jdbcType=TIMESTAMP, javaType=java.util.Date}
WHERE id = #{id}
</update>
......
......@@ -5,16 +5,16 @@
<id column="id" property="id"/>
<result column="user_id" property="userId"/>
<result column="examination_id" property="examinationId"/>
<result column="start_time" property="startTime"/>
<result column="end_time" property="endTime"/>
<result column="start_time" property="startTime" javaType="java.util.Date" jdbcType="TIMESTAMP"/>
<result column="end_time" property="endTime" javaType="java.util.Date" jdbcType="TIMESTAMP"/>
<result column="score" property="score"/>
<result column="correct_number" property="correctNumber"/>
<result column="incorrect_number" property="inCorrectNumber"/>
<result column="submit_status" property="submitStatus"/>
<result column="creator" property="creator"/>
<result column="create_date" property="createDate"/>
<result column="create_date" property="createDate" javaType="java.util.Date" jdbcType="TIMESTAMP"/>
<result column="modifier" property="modifier"/>
<result column="modify_date" property="modifyDate"/>
<result column="modify_date" property="modifyDate" javaType="java.util.Date" jdbcType="TIMESTAMP"/>
<result column="del_flag" property="delFlag"/>
<result column="application_code" property="applicationCode"/>
<result column="tenant_code" property="tenantCode"/>
......@@ -107,16 +107,16 @@
#{id},
#{userId},
#{examinationId},
#{startTime},
#{endTime},
#{startTime, jdbcType=TIMESTAMP, javaType=java.util.Date},
#{endTime, jdbcType=TIMESTAMP, javaType=java.util.Date},
#{score},
#{correctNumber},
#{inCorrectNumber},
#{submitStatus},
#{creator},
#{createDate},
#{createDate, jdbcType=TIMESTAMP, javaType=java.util.Date},
#{modifier},
#{modifyDate},
#{modifyDate, jdbcType=TIMESTAMP, javaType=java.util.Date},
#{delFlag},
#{applicationCode},
#{tenantCode}
......@@ -132,10 +132,10 @@
examination_id = #{examinationId},
</if>
<if test="startTime != null">
start_time = #{startTime},
start_time = #{startTime, jdbcType=TIMESTAMP, javaType=java.util.Date},
</if>
<if test="endTime != null">
end_time = #{endTime},
end_time = #{endTime, jdbcType=TIMESTAMP, javaType=java.util.Date},
</if>
<if test="score != null">
score = #{score},
......@@ -153,7 +153,7 @@
del_flag = #{delFlag},
</if>
modifier = #{modifier},
modify_date = #{modifyDate}
modify_date = #{modifyDate, jdbcType=TIMESTAMP, javaType=java.util.Date}
WHERE id = #{id}
</update>
......
......@@ -6,17 +6,17 @@
<result column="examination_name" property="examinationName"/>
<result column="type" property="type"/>
<result column="attention" property="attention"/>
<result column="start_time" property="startTime"/>
<result column="end_time" property="endTime"/>
<result column="start_time" property="startTime" javaType="java.util.Date" jdbcType="TIMESTAMP"/>
<result column="end_time" property="endTime" javaType="java.util.Date" jdbcType="TIMESTAMP"/>
<result column="total_score" property="totalScore"/>
<result column="status" property="status"/>
<result column="avatar_id" property="avatarId"/>
<result column="course_id" property="courseId"/>
<result column="remark" property="remark"/>
<result column="creator" property="creator"/>
<result column="create_date" property="createDate"/>
<result column="create_date" property="createDate" javaType="java.util.Date" jdbcType="TIMESTAMP"/>
<result column="modifier" property="modifier"/>
<result column="modify_date" property="modifyDate"/>
<result column="modify_date" property="modifyDate" javaType="java.util.Date" jdbcType="TIMESTAMP"/>
<result column="del_flag" property="delFlag"/>
<result column="application_code" property="applicationCode"/>
<result column="tenant_code" property="tenantCode"/>
......@@ -114,17 +114,17 @@
#{examinationName},
#{type},
#{attention},
#{startTime},
#{endTime},
#{startTime, jdbcType=TIMESTAMP, javaType=java.util.Date},
#{endTime, jdbcType=TIMESTAMP, javaType=java.util.Date},
#{totalScore},
#{status},
#{avatarId},
#{courseId},
#{remark},
#{creator},
#{createDate},
#{createDate, jdbcType=TIMESTAMP, javaType=java.util.Date},
#{modifier},
#{modifyDate},
#{modifyDate, jdbcType=TIMESTAMP, javaType=java.util.Date},
#{delFlag},
#{applicationCode},
#{tenantCode}
......@@ -143,10 +143,10 @@
attention = #{attention},
</if>
<if test="startTime != null">
start_time = #{startTime},
start_time = #{startTime, jdbcType=TIMESTAMP, javaType=java.util.Date},
</if>
<if test="endTime != null">
end_time = #{endTime},
end_time = #{endTime, jdbcType=TIMESTAMP, javaType=java.util.Date},
</if>
<if test="totalScore != null">
total_score = #{totalScore},
......@@ -167,7 +167,7 @@
del_flag = #{delFlag},
</if>
modifier = #{modifier},
modify_date = #{modifyDate}
modify_date = #{modifyDate, jdbcType=TIMESTAMP, javaType=java.util.Date}
WHERE id = #{id}
</update>
......
......@@ -8,9 +8,9 @@
<result column="attachment_id" property="attachmentId"/>
<result column="status" property="status"/>
<result column="creator" property="creator"/>
<result column="create_date" property="createDate"/>
<result column="create_date" property="createDate" javaType="java.util.Date" jdbcType="TIMESTAMP"/>
<result column="modifier" property="modifier"/>
<result column="modify_date" property="modifyDate"/>
<result column="modify_date" property="modifyDate" javaType="java.util.Date" jdbcType="TIMESTAMP"/>
<result column="del_flag" property="delFlag"/>
<result column="application_code" property="applicationCode"/>
<result column="tenant_code" property="tenantCode"/>
......@@ -87,9 +87,9 @@
#{attachmentId},
#{status},
#{creator},
#{createDate},
#{createDate, jdbcType=TIMESTAMP, javaType=java.util.Date},
#{modifier},
#{modifyDate},
#{modifyDate, jdbcType=TIMESTAMP, javaType=java.util.Date},
#{delFlag},
#{applicationCode},
#{tenantCode}
......@@ -114,7 +114,7 @@
del_flag = #{delFlag},
</if>
modifier = #{modifier},
modify_date = #{modifyDate}
modify_date = #{modifyDate, jdbcType=TIMESTAMP, javaType=java.util.Date}
WHERE id = #{id}
</update>
......
......@@ -6,9 +6,9 @@
<result column="picture_address" property="examRecordId"/>
<result column="attachment_id" property="subjectId"/>
<result column="creator" property="creator"/>
<result column="create_date" property="createDate"/>
<result column="create_date" property="createDate" javaType="java.util.Date" jdbcType="TIMESTAMP"/>
<result column="modifier" property="modifier"/>
<result column="modify_date" property="modifyDate"/>
<result column="modify_date" property="modifyDate" javaType="java.util.Date" jdbcType="TIMESTAMP"/>
<result column="del_flag" property="delFlag"/>
<result column="application_code" property="applicationCode"/>
<result column="tenant_code" property="tenantCode"/>
......@@ -64,9 +64,9 @@
#{pictureAddress},
#{attachmentId},
#{creator},
#{createDate},
#{createDate, jdbcType=TIMESTAMP, javaType=java.util.Date},
#{modifier},
#{modifyDate},
#{modifyDate, jdbcType=TIMESTAMP, javaType=java.util.Date},
#{delFlag},
#{applicationCode},
#{tenantCode}
......@@ -85,7 +85,7 @@
del_flag = #{delFlag},
</if>
modifier = #{modifier},
modify_date = #{modifyDate}
modify_date = #{modifyDate, jdbcType=TIMESTAMP, javaType=java.util.Date}
WHERE id = #{id}
</update>
......
......@@ -9,9 +9,9 @@
<result column="sort" property="sort"/>
<result column="type" property="type"/>
<result column="creator" property="creator"/>
<result column="create_date" property="createDate"/>
<result column="create_date" property="createDate" javaType="java.util.Date" jdbcType="TIMESTAMP"/>
<result column="modifier" property="modifier"/>
<result column="modify_date" property="modifyDate"/>
<result column="modify_date" property="modifyDate" javaType="java.util.Date" jdbcType="TIMESTAMP"/>
<result column="del_flag" property="delFlag"/>
<result column="application_code" property="applicationCode"/>
<result column="tenant_code" property="tenantCode"/>
......@@ -72,9 +72,9 @@
#{sort},
#{type},
#{creator},
#{createDate},
#{createDate, jdbcType=TIMESTAMP, javaType=java.util.Date},
#{modifier},
#{modifyDate},
#{modifyDate, jdbcType=TIMESTAMP, javaType=java.util.Date},
#{delFlag},
#{applicationCode},
#{tenantCode}
......@@ -118,7 +118,7 @@
del_flag = #{delFlag},
</if>
modifier = #{modifier},
modify_date = #{modifyDate}
modify_date = #{modifyDate, jdbcType=TIMESTAMP, javaType=java.util.Date}
WHERE id = #{id}
</update>
......
......@@ -12,9 +12,9 @@
<result column="analysis" property="analysis"/>
<result column="level" property="level"/>
<result column="creator" property="creator"/>
<result column="create_date" property="createDate"/>
<result column="create_date" property="createDate" javaType="java.util.Date" jdbcType="TIMESTAMP"/>
<result column="modifier" property="modifier"/>
<result column="modify_date" property="modifyDate"/>
<result column="modify_date" property="modifyDate" javaType="java.util.Date" jdbcType="TIMESTAMP"/>
<result column="del_flag" property="delFlag"/>
<result column="application_code" property="applicationCode"/>
<result column="tenant_code" property="tenantCode"/>
......@@ -120,9 +120,9 @@
#{analysis},
#{level},
#{creator},
#{createDate},
#{createDate, jdbcType=TIMESTAMP, javaType=java.util.Date},
#{modifier},
#{modifyDate},
#{modifyDate, jdbcType=TIMESTAMP, javaType=java.util.Date},
#{delFlag},
#{applicationCode},
#{tenantCode}
......@@ -159,7 +159,7 @@
del_flag = #{delFlag},
</if>
modifier = #{modifier},
modify_date = #{modifyDate}
modify_date = #{modifyDate, jdbcType=TIMESTAMP, javaType=java.util.Date}
WHERE id = #{id}
</update>
......
......@@ -7,9 +7,9 @@
<result column="option_name" property="optionName"/>
<result column="option_content" property="optionContent"/>
<result column="creator" property="creator"/>
<result column="create_date" property="createDate"/>
<result column="create_date" property="createDate" javaType="java.util.Date" jdbcType="TIMESTAMP"/>
<result column="modifier" property="modifier"/>
<result column="modify_date" property="modifyDate"/>
<result column="modify_date" property="modifyDate" javaType="java.util.Date" jdbcType="TIMESTAMP"/>
<result column="del_flag" property="delFlag"/>
<result column="application_code" property="applicationCode"/>
<result column="tenant_code" property="tenantCode"/>
......@@ -84,9 +84,9 @@
#{optionName},
#{optionContent},
#{creator},
#{createDate},
#{createDate, jdbcType=TIMESTAMP, javaType=java.util.Date},
#{modifier},
#{modifyDate},
#{modifyDate, jdbcType=TIMESTAMP, javaType=java.util.Date},
#{delFlag},
#{applicationCode},
#{tenantCode}
......@@ -115,9 +115,9 @@
#{item.optionName},
#{item.optionContent},
#{item.creator},
#{item.createDate},
#{item.createDate, jdbcType=TIMESTAMP, javaType=java.util.Date},
#{item.modifier},
#{item.modifyDate},
#{item.modifyDate, jdbcType=TIMESTAMP, javaType=java.util.Date},
#{item.delFlag},
#{item.applicationCode},
#{item.tenantCode}
......@@ -140,7 +140,7 @@
del_flag = #{delFlag},
</if>
modifier = #{modifier},
modify_date = #{modifyDate}
modify_date = #{modifyDate, jdbcType=TIMESTAMP, javaType=java.util.Date}
WHERE id = #{id}
</update>
......
......@@ -11,9 +11,9 @@
<result column="analysis" property="analysis"/>
<result column="level" property="level"/>
<result column="creator" property="creator"/>
<result column="create_date" property="createDate"/>
<result column="create_date" property="createDate" javaType="java.util.Date" jdbcType="TIMESTAMP"/>
<result column="modifier" property="modifier"/>
<result column="modify_date" property="modifyDate"/>
<result column="modify_date" property="modifyDate" javaType="java.util.Date" jdbcType="TIMESTAMP"/>
<result column="del_flag" property="delFlag"/>
<result column="application_code" property="applicationCode"/>
<result column="tenant_code" property="tenantCode"/>
......@@ -111,9 +111,9 @@
#{analysis},
#{level},
#{creator},
#{createDate},
#{createDate, jdbcType=TIMESTAMP, javaType=java.util.Date},
#{modifier},
#{modifyDate},
#{modifyDate, jdbcType=TIMESTAMP, javaType=java.util.Date},
#{delFlag},
#{applicationCode},
#{tenantCode}
......@@ -147,7 +147,7 @@
del_flag = #{delFlag},
</if>
modifier = #{modifier},
modify_date = #{modifyDate}
modify_date = #{modifyDate, jdbcType=TIMESTAMP, javaType=java.util.Date}
WHERE id = #{id}
</update>
......
......@@ -29,4 +29,9 @@ public class SysConfig {
* 默认头像
*/
private String defaultAvatar;
/**
* 管理员账号
*/
private String adminUser;
}
......@@ -13,12 +13,16 @@ import com.github.tangyi.common.security.utils.SecurityUtil;
import com.github.tangyi.user.api.constant.MenuConstant;
import com.github.tangyi.user.api.dto.MenuDto;
import com.github.tangyi.user.api.module.Menu;
import com.github.tangyi.user.api.module.Role;
import com.github.tangyi.user.config.SysConfig;
import com.github.tangyi.user.service.MenuService;
import com.github.tangyi.user.utils.MenuUtil;
import com.google.common.collect.Lists;
import com.google.common.net.HttpHeaders;
import io.swagger.annotations.*;
import lombok.AllArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.collections4.CollectionUtils;
import org.apache.commons.lang3.StringUtils;
import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.web.bind.annotation.*;
......@@ -51,6 +55,8 @@ public class MenuController extends BaseController {
private final MenuService menuService;
private final SysConfig sysConfig;
/**
* 返回当前用户的树形菜单集合
*
......@@ -60,29 +66,41 @@ public class MenuController extends BaseController {
@ApiOperation(value = "获取当前用户的菜单列表")
public List<MenuDto> userMenu() {
List<MenuDto> menuDtoList = new ArrayList<>();
String tenantCode = SysUtil.getTenantCode();
// 根据角色code查找菜单
SecurityUtil.getCurrentAuthentication().getAuthorities().stream()
// 按角色过滤
.filter(authority -> authority.getAuthority() != null && authority.getAuthority().startsWith("role_"))
// 查找菜单
.forEach(roleName -> {
// 获取角色的菜单
Stream<Menu> menuStream = menuService.findMenuByRole(roleName.getAuthority(), tenantCode).stream();
if (Optional.ofNullable(menuStream).isPresent()) {
// 筛选出类型为菜单的菜单,放进menuMap,防止重复,用菜单的ID作为key
menuStream
// 菜单类型
.filter(menu -> MenuConstant.MENU_TYPE_MENU.equals(menu.getType()))
// dto封装
.map(MenuDto::new)
// 去重
.distinct()
.forEach(menuDtoList::add);
}
});
// 排序、构建树形关系
return TreeUtil.buildTree(CollUtil.sort(menuDtoList, Comparator.comparingInt(MenuDto::getSort)), "-1");
String tenantCode = SysUtil.getTenantCode(), identifier = SysUtil.getUser();
List<Menu> userMenus;
// 超级管理员
if (identifier.equals(sysConfig.getAdminUser())) {
// 获取角色的菜单
Menu menu = new Menu();
menu.setTenantCode(tenantCode);
menu.setApplicationCode(SysUtil.getSysCode());
menu.setType(MenuConstant.MENU_TYPE_MENU);
userMenus = menuService.findAllList(menu);
} else {
List<Role> roleList = SecurityUtil.getCurrentAuthentication().getAuthorities().stream()
// 按角色过滤
.filter(authority -> authority.getAuthority() != null && authority.getAuthority().startsWith("role_"))
.map(authority -> {
Role role = new Role();
role.setRoleCode(authority.getAuthority());
return role;
}).collect(Collectors.toList());
// 根据角色code批量查找菜单
userMenus = menuService.finMenuByRoleList(roleList, tenantCode);
}
if (CollectionUtils.isNotEmpty(userMenus)) {
userMenus.stream()
// 菜单类型
.filter(menu -> MenuConstant.MENU_TYPE_MENU.equals(menu.getType()))
// dto封装
.map(MenuDto::new)
// 去重
.distinct()
.forEach(menuDtoList::add);
// 排序、构建树形关系
return TreeUtil.buildTree(CollUtil.sort(menuDtoList, Comparator.comparingInt(MenuDto::getSort)), "-1");
}
return Lists.newArrayList();
}
/**
......
......@@ -47,7 +47,7 @@ public class RoleController extends BaseController {
* 根据id获取角色
*
* @param id id
* @return Role
* @return RoleVo
* @author tangyi
* @date 2018/9/14 18:20
*/
......@@ -82,7 +82,7 @@ public class RoleController extends BaseController {
@ApiImplicitParam(name = CommonConstant.PAGE_SIZE, value = "分页大小", defaultValue = CommonConstant.PAGE_SIZE_DEFAULT, dataType = "String"),
@ApiImplicitParam(name = CommonConstant.SORT, value = "排序字段", defaultValue = CommonConstant.PAGE_SORT_DEFAULT, dataType = "String"),
@ApiImplicitParam(name = CommonConstant.ORDER, value = "排序方向", defaultValue = CommonConstant.PAGE_ORDER_DEFAULT, dataType = "String"),
@ApiImplicitParam(name = "role", value = "角色信息", dataType = "Role")
@ApiImplicitParam(name = "role", value = "角色信息", dataType = "RoleVo")
})
public PageInfo<Role> roleList(@RequestParam(value = CommonConstant.PAGE_NUM, required = false, defaultValue = CommonConstant.PAGE_NUM_DEFAULT) String pageNum,
@RequestParam(value = CommonConstant.PAGE_SIZE, required = false, defaultValue = CommonConstant.PAGE_SIZE_DEFAULT) String pageSize,
......@@ -103,7 +103,7 @@ public class RoleController extends BaseController {
*/
@RequestMapping("allRoles")
@ApiOperation(value = "获取全部角色列表")
@ApiImplicitParam(name = "role", value = "角色信息", dataType = "Role")
@ApiImplicitParam(name = "role", value = "角色信息", dataType = "RoleVo")
public ResponseBean<List<Role>> allRoles(Role role) {
role.setApplicationCode(SysUtil.getSysCode());
role.setTenantCode(SysUtil.getTenantCode());
......@@ -121,7 +121,7 @@ public class RoleController extends BaseController {
@PutMapping
@PreAuthorize("hasAuthority('sys:role:edit') or hasAnyRole('" + SecurityConstant.ROLE_ADMIN + "')")
@ApiOperation(value = "更新角色信息", notes = "根据角色id更新角色的基本信息")
@ApiImplicitParam(name = "role", value = "角色实体role", required = true, dataType = "Role")
@ApiImplicitParam(name = "role", value = "角色实体role", required = true, dataType = "RoleVo")
@Log("修改角色")
public ResponseBean<Boolean> updateRole(@RequestBody @Valid Role role) {
role.setCommonValue(SysUtil.getUser(), SysUtil.getSysCode(), SysUtil.getTenantCode());
......@@ -138,7 +138,7 @@ public class RoleController extends BaseController {
*/
@PutMapping("roleMenuUpdate")
@ApiOperation(value = "更新角色菜单信息", notes = "更新角色菜单信息")
@ApiImplicitParam(name = "role", value = "角色实体role", required = true, dataType = "Role")
@ApiImplicitParam(name = "role", value = "角色实体role", required = true, dataType = "RoleVo")
@Log("更新角色菜单")
public ResponseBean<Boolean> updateRoleMenu(@RequestBody Role role) {
boolean success = false;
......@@ -163,7 +163,7 @@ public class RoleController extends BaseController {
@PostMapping
@PreAuthorize("hasAuthority('sys:role:add') or hasAnyRole('" + SecurityConstant.ROLE_ADMIN + "')")
@ApiOperation(value = "创建角色", notes = "创建角色")
@ApiImplicitParam(name = "role", value = "角色实体role", required = true, dataType = "Role")
@ApiImplicitParam(name = "role", value = "角色实体role", required = true, dataType = "RoleVo")
@Log("新增角色")
public ResponseBean<Boolean> role(@RequestBody @Valid Role role) {
role.setCommonValue(SysUtil.getUser(), SysUtil.getSysCode(), SysUtil.getTenantCode());
......@@ -174,7 +174,7 @@ public class RoleController extends BaseController {
* 根据id删除角色
*
* @param id id
* @return Role
* @return RoleVo
* @author tangyi
* @date 2018/9/14 18:24
*/
......@@ -202,7 +202,7 @@ public class RoleController extends BaseController {
@PostMapping("deleteAll")
@PreAuthorize("hasAuthority('sys:role:del') or hasAnyRole('" + SecurityConstant.ROLE_ADMIN + "')")
@ApiOperation(value = "批量删除角色", notes = "根据角色id批量删除角色")
@ApiImplicitParam(name = "role", value = "角色信息", dataType = "Role")
@ApiImplicitParam(name = "role", value = "角色信息", dataType = "RoleVo")
@Log("批量删除角色")
public ResponseBean<Boolean> deleteAllRoles(@RequestBody Role role) {
boolean success = false;
......
package com.github.tangyi.user.controller;
import com.github.tangyi.common.core.web.BaseController;
import com.github.tangyi.common.security.constant.SecurityConstant;
import com.github.tangyi.user.service.UserService;
import com.google.code.kaptcha.Producer;
import io.swagger.annotations.Api;
......@@ -45,7 +46,7 @@ public class ValidateCodeController extends BaseController {
@ApiImplicitParam(name = "tenantCode", value = "租户标识", required = true, dataType = "String")
})
@GetMapping("/{random}")
public void produceCode(@PathVariable String random, @RequestParam String tenantCode, HttpServletResponse response) throws Exception {
public void produceCode(@PathVariable String random, @RequestParam(required = false, defaultValue = SecurityConstant.DEFAULT_TENANT_CODE) String tenantCode, HttpServletResponse response) throws Exception {
response.setHeader("Cache-Control", "no-store, no-cache");
response.setContentType("image/jpeg");
// 生成文字验证码
......
package com.github.tangyi.user.mapper;
import com.github.tangyi.common.core.persistence.CrudMapper;
import com.github.tangyi.user.api.module.UserAuths;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
import java.util.List;
/**
* UserAuthsMapper
*
* @author tangyi
* @date 2019/07/03 11:44
*/
@Mapper
public interface UserAuthsMapper extends CrudMapper<UserAuths> {
/**
* 根据唯一标识查询
*
* @param userAuths userAuths
* @return UserAuths
* @author tangyi
* @date 2019/07/03 11:52:27
*/
UserAuths getByIdentifier(UserAuths userAuths);
/**
* 根据用户id批量查询
*
* @param userIds userIds
* @return List
* @author tangyi
* @date 2019/07/03 22:02:13
*/
List<UserAuths> getListByUserIds(@Param("userIds") String[] userIds);
/**
* 根据唯一标识删除
*
* @param userAuths userAuths
* @return int
* @author tangyi
* @date 2019/07/04 11:39:50
*/
int deleteByIdentifier(UserAuths userAuths);
/**
* 根据用户ID删除
*
* @param userAuths userAuths
* @return int
* @author tangyi
* @date 2019/07/04 11:43:50
*/
int deleteByUserId(UserAuths userAuths);
}
......@@ -4,7 +4,6 @@ import com.github.tangyi.common.core.persistence.CrudMapper;
import com.github.tangyi.common.core.vo.UserVo;
import com.github.tangyi.user.api.module.User;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
/**
* 用户mapper接口
......@@ -15,26 +14,6 @@ import org.apache.ibatis.annotations.Param;
@Mapper
public interface UserMapper extends CrudMapper<User> {
UserVo selectUserVo();
/**
* 通过用户名查询用户信息(含有角色信息)
*
* @param username 用户名
* @param tenantCode 租户标识
* @return userVo
*/
UserVo selectUserVoByUsername(@Param("username") String username, @Param("tenantCode") String tenantCode);
/**
* 通过用户手机号查询用户信息(含有角色信息)
*
* @param social 用户手机号
* @param tenantCode 租户标识
* @return userVo
*/
UserVo selectUserVoBySocial(@Param("social") String social, @Param("tenantCode") String tenantCode);
/**
* 查询用户数量
*
......
......@@ -2,10 +2,13 @@ package com.github.tangyi.user.service;
import com.github.tangyi.common.core.service.CrudService;
import com.github.tangyi.user.api.module.Dept;
import com.github.tangyi.user.api.module.User;
import com.github.tangyi.user.mapper.DeptMapper;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import java.util.List;
/**
* 部门service
*
......@@ -27,4 +30,18 @@ public class DeptService extends CrudService<DeptMapper, Dept> {
// 删除部门
return super.delete(dept);
}
/**
* 根据用户批量查询
*
* @param userList userList
* @return List
* @author tangyi
* @date 2019/07/03 22:06:50
*/
public List<Dept> getListByUsers(List<User> userList) {
Dept dept = new Dept();
dept.setIds(userList.stream().filter(tempUser -> tempUser.getDeptId() != null).map(User::getDeptId).distinct().toArray(String[]::new));
return this.findListById(dept);
}
}
......@@ -4,8 +4,11 @@ import com.github.tangyi.common.core.constant.CommonConstant;
import com.github.tangyi.common.core.service.CrudService;
import com.github.tangyi.common.core.utils.SysUtil;
import com.github.tangyi.user.api.module.Menu;
import com.github.tangyi.user.api.module.Role;
import com.github.tangyi.user.mapper.MenuMapper;
import com.google.common.collect.Lists;
import lombok.AllArgsConstructor;
import org.apache.commons.collections4.CollectionUtils;
import org.springframework.cache.annotation.CacheEvict;
import org.springframework.cache.annotation.Cacheable;
import org.springframework.stereotype.Service;
......@@ -40,6 +43,25 @@ public class MenuService extends CrudService<MenuMapper, Menu> {
}
/**
* 批量查询菜单
*
* @param roleList roleList
* @param tenantCode tenantCode
* @return List
* @author tangyi
* @date 2019/07/03 23:50:35
*/
public List<Menu> finMenuByRoleList(List<Role> roleList, String tenantCode) {
List<Menu> menus = Lists.newArrayList();
for (Role role : roleList) {
List<Menu> roleMenus = this.findMenuByRole(role.getRoleCode(), tenantCode);
if (CollectionUtils.isNotEmpty(roleMenus))
menus.addAll(roleMenus);
}
return menus;
}
/**
* 查询全部菜单
*
* @param menu menu
......
......@@ -9,6 +9,7 @@ import com.github.tangyi.common.security.constant.SecurityConstant;
import com.github.tangyi.msc.api.constant.SmsConstant;
import com.github.tangyi.msc.api.dto.SmsDto;
import com.github.tangyi.msc.api.feign.MscServiceClient;
import com.github.tangyi.user.api.enums.IdentityType;
import lombok.AllArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.data.redis.core.RedisTemplate;
......@@ -43,7 +44,7 @@ public class MobileService {
* @date 2019/07/02 09:36:52
*/
public ResponseBean<Boolean> sendSms(String mobile, String tenantCode) {
UserVo userVo = userService.selectUserVoBySocial(mobile, tenantCode);
UserVo userVo = userService.findUserByIdentifier(IdentityType.PHONE_NUMBER.getValue(), mobile, tenantCode);
if (userVo == null) {
log.info("手机号未注册:{}", mobile);
return new ResponseBean<>(Boolean.FALSE, "手机号未注册.");
......
package com.github.tangyi.user.service;
import com.github.tangyi.common.core.service.CrudService;
import com.github.tangyi.user.api.module.User;
import com.github.tangyi.user.api.module.UserAuths;
import com.github.tangyi.user.mapper.UserAuthsMapper;
import lombok.AllArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import java.util.List;
/**
* 用户授权Service
*
* @author tangyi
* @date 2019/07/03 11:45
*/
@AllArgsConstructor
@Slf4j
@Service
public class UserAuthsService extends CrudService<UserAuthsMapper, UserAuths> {
/**
* 根据唯一标识查询
*
* @param userAuths userAuths
* @return UserAuths
* @author tangyi
* @date 2019/07/03 11:52:27
*/
public UserAuths getByIdentifier(UserAuths userAuths) {
return this.dao.getByIdentifier(userAuths);
}
/**
* 根据用户批量查询用户权限
*
* @param userList userList
* @return List
* @author tangyi
* @date 2019/07/03 21:58:31
*/
public List<UserAuths> getListByUsers(List<User> userList) {
return this.dao.getListByUserIds(userList.stream().map(User::getId).distinct().toArray(String[]::new));
}
/**
* 根据唯一标识删除
*
* @param userAuths userAuths
* @return int
* @author tangyi
* @date 2019/07/04 11:39:50
*/
@Transactional
public int deleteByIdentifier(UserAuths userAuths) {
return this.dao.deleteByIdentifier(userAuths);
}
/**
* 根据用户ID删除
*
* @param userAuths userAuths
* @return int
* @author tangyi
* @date 2019/07/04 11:42:50
*/
@Transactional
public int deleteByUserId(UserAuths userAuths) {
return this.dao.deleteByUserId(userAuths);
}
}
package com.github.tangyi.user.utils;
import com.github.tangyi.common.core.utils.SpringContextHolder;
import com.github.tangyi.common.core.utils.SysUtil;
import com.github.tangyi.common.core.vo.RoleVo;
import com.github.tangyi.user.api.dto.UserInfoDto;
import com.github.tangyi.user.api.module.Role;
import com.github.tangyi.user.api.module.User;
import com.github.tangyi.user.api.module.UserAuths;
import com.github.tangyi.user.config.SysConfig;
import org.springframework.beans.BeanUtils;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.stream.Collectors;
/**
* 用户工具类
......@@ -20,21 +32,75 @@ public class UserUtils {
public static LinkedHashMap<String, String> getUserMap() {
LinkedHashMap<String, String> map = new LinkedHashMap<>();
map.put("id", "用户id");
map.put("name", "账号");
map.put("username", "姓名");
map.put("identifier", "账号");
map.put("identityType", "账号类型");
map.put("credential", "密码");
map.put("name", "姓名");
map.put("phone", "联系电话");
map.put("email", "邮箱");
map.put("born", "出生日期");
//map.put("born", "出生日期");
map.put("remark", "备注");
map.put("status", "状态");
map.put("deptId", "部门ID");
map.put("creator", "创建人");
map.put("createDate", "创建时间");
map.put("modifier", "修改人");
map.put("modifyDate", "修改时间");
map.put("delFlag", "删除标记");
map.put("applicationCode", "系统编码");
map.put("tenantCode", "租户标识");
return map;
}
/**
* Role 转 RoleVo
*
* @param roles roles
* @return List
* @author tangyi
* @date 2019/07/03 13:11:05
*/
public static List<RoleVo> rolesToVo(List<Role> roles) {
return roles.stream().map(role -> {
RoleVo roleVo = new RoleVo();
roleVo.setRoleCode(role.getRoleCode());
roleVo.setRoleName(role.getRoleName());
roleVo.setRoleDesc(role.getRoleDesc());
return roleVo;
}).collect(Collectors.toList());
}
/**
* 转DTO
*
* @param userInfoDto userInfoDto
* @param user user
* @param userAuths userAuths
* @return UserInfoDto
* @author tangyi
* @date 2019/07/03 20:23:15
*/
public static void toUserInfoDto(UserInfoDto userInfoDto, User user, UserAuths userAuths) {
BeanUtils.copyProperties(userAuths, userInfoDto);
BeanUtils.copyProperties(user, userInfoDto);
}
/**
* 是否为管理员
*
* @param identifier identifier
* @return boolean
* @author tangyi
* @date 2019/07/04 00:25:11
*/
public static boolean isAdmin(String identifier) {
SysConfig sysConfig = SpringContextHolder.getApplicationContext().getBean(SysConfig.class);
return identifier.equals(sysConfig.getAdminUser());
}
/**
* 是否为管理员
*
* @return boolean
* @author tangyi
* @date 2019/07/04 00:25:11
*/
public static boolean isAdmin() {
return isAdmin(SysUtil.getUser());
}
}
......@@ -12,9 +12,9 @@
<result column="busi_type" property="busiType"/>
<result column="preview_url" property="previewUrl"/>
<result column="creator" property="creator"/>
<result column="create_date" property="createDate"/>
<result column="create_date" property="createDate" javaType="java.util.Date" jdbcType="TIMESTAMP"/>
<result column="modifier" property="modifier"/>
<result column="modify_date" property="modifyDate"/>
<result column="modify_date" property="modifyDate" javaType="java.util.Date" jdbcType="TIMESTAMP"/>
<result column="del_flag" property="delFlag"/>
<result column="application_code" property="applicationCode"/>
<result column="tenant_code" property="tenantCode"/>
......@@ -110,9 +110,9 @@
#{busiType},
#{previewUrl},
#{creator},
#{createDate},
#{createDate, jdbcType=TIMESTAMP, javaType=java.util.Date},
#{modifier},
#{modifyDate},
#{modifyDate, jdbcType=TIMESTAMP, javaType=java.util.Date},
#{delFlag},
#{applicationCode},
#{tenantCode}
......@@ -149,13 +149,15 @@
del_flag = #{delFlag},
</if>
modifier = #{modifier},
modify_date = #{modifyDate}
modify_date = #{modifyDate, jdbcType=TIMESTAMP, javaType=java.util.Date}
WHERE id = #{id}
</update>
<delete id="delete">
UPDATE sys_attachment SET
DEL_FLAG = 1
del_flag = 1,
modifier = #{modifier} ,
modify_date = #{modifyDate, jdbcType=TIMESTAMP, javaType=java.util.Date}
WHERE ID = #{id}
</delete>
......
......@@ -8,11 +8,10 @@
<result column="dept_leader" property="deptLeader"/>
<result column="parent_id" property="parentId"/>
<result column="sort" property="sort"/>
<result column="status" property="status"/>
<result column="creator" property="creator"/>
<result column="create_date" property="createDate"/>
<result column="create_date" property="createDate" javaType="java.util.Date" jdbcType="TIMESTAMP"/>
<result column="modifier" property="modifier"/>
<result column="modify_date" property="modifyDate"/>
<result column="modify_date" property="modifyDate" javaType="java.util.Date" jdbcType="TIMESTAMP"/>
<result column="del_flag" property="delFlag"/>
<result column="application_code" property="applicationCode"/>
<result column="tenant_code" property="tenantCode"/>
......@@ -25,7 +24,6 @@
a.dept_leader,
a.parent_id,
a.sort,
a.status,
a.creator,
a.create_date,
a.modifier,
......@@ -71,14 +69,13 @@
</select>
<insert id="insert">
INSERT INTO sys_dept (
INSERT INTO sys_dept (
id,
dept_name,
dept_desc,
dept_leader,
parent_id,
sort,
status,
creator,
create_date,
modifier,
......@@ -93,11 +90,10 @@
#{deptLeader},
#{parentId},
#{sort},
#{status},
#{creator},
#{createDate},
#{createDate, jdbcType=TIMESTAMP, javaType=java.util.Date},
#{modifier},
#{modifyDate},
#{modifyDate, jdbcType=TIMESTAMP, javaType=java.util.Date},
#{delFlag},
#{applicationCode},
#{tenantCode}
......@@ -118,14 +114,11 @@
<if test="sort != null">
sort = #{sort},
</if>
<if test="status != null">
status = #{status},
</if>
<if test="delFlag != null">
del_flag = #{delFlag},
</if>
modifier = #{modifier},
modify_date = #{modifyDate}
modify_date = #{modifyDate, jdbcType=TIMESTAMP, javaType=java.util.Date}
WHERE
<if test="id != null">
id = #{id}
......@@ -137,7 +130,9 @@
<delete id="delete">
UPDATE sys_dept SET
DEL_FLAG = 1
del_flag = 1,
modifier = #{modifier} ,
modify_date = #{modifyDate, jdbcType=TIMESTAMP, javaType=java.util.Date}
WHERE ID = #{id}
</delete>
</mapper>
......@@ -14,9 +14,9 @@
<result column="service_id" property="serviceId"/>
<result column="time" property="time"/>
<result column="creator" property="creator"/>
<result column="create_date" property="createDate"/>
<result column="create_date" property="createDate" javaType="java.util.Date" jdbcType="TIMESTAMP"/>
<result column="modifier" property="modifier"/>
<result column="modify_date" property="modifyDate"/>
<result column="modify_date" property="modifyDate" javaType="java.util.Date" jdbcType="TIMESTAMP"/>
<result column="del_flag" property="delFlag"/>
<result column="application_code" property="applicationCode"/>
<result column="tenant_code" property="tenantCode"/>
......@@ -90,9 +90,9 @@
#{serviceId},
#{time},
#{creator},
#{createDate},
#{createDate, jdbcType=TIMESTAMP, javaType=java.util.Date},
#{modifier},
#{modifyDate},
#{modifyDate, jdbcType=TIMESTAMP, javaType=java.util.Date},
#{delFlag},
#{applicationCode},
#{tenantCode}
......
......@@ -15,9 +15,9 @@
<result column="path" property="path"/>
<result column="remark" property="remark"/>
<result column="creator" property="creator"/>
<result column="create_date" property="createDate"/>
<result column="create_date" property="createDate" javaType="java.util.Date" jdbcType="TIMESTAMP"/>
<result column="modifier" property="modifier"/>
<result column="modify_date" property="modifyDate"/>
<result column="modify_date" property="modifyDate" javaType="java.util.Date" jdbcType="TIMESTAMP"/>
<result column="del_flag" property="delFlag"/>
<result column="application_code" property="applicationCode"/>
<result column="tenant_code" property="tenantCode"/>
......@@ -103,9 +103,9 @@
#{path},
#{remark},
#{creator},
#{createDate},
#{createDate, jdbcType=TIMESTAMP, javaType=java.util.Date},
#{modifier},
#{modifyDate},
#{modifyDate, jdbcType=TIMESTAMP, javaType=java.util.Date},
#{delFlag},
#{applicationCode},
#{tenantCode}
......@@ -189,7 +189,7 @@
del_flag = #{delFlag},
</if>
modifier = #{modifier},
modify_date = #{modifyDate}
modify_date = #{modifyDate, jdbcType=TIMESTAMP, javaType=java.util.Date}
WHERE
<if test="id != null">
id = #{id}
......@@ -201,7 +201,9 @@
<delete id="delete">
UPDATE sys_menu SET
del_flag = 1
del_flag = 1,
modifier = #{modifier} ,
modify_date = #{modifyDate, jdbcType=TIMESTAMP, javaType=java.util.Date}
WHERE id = #{id}
</delete>
</mapper>
......@@ -9,9 +9,9 @@
<result column="status" property="status"/>
<result column="is_default" property="isDefault"/>
<result column="creator" property="creator"/>
<result column="create_date" property="createDate"/>
<result column="create_date" property="createDate" javaType="java.util.Date" jdbcType="TIMESTAMP"/>
<result column="modifier" property="modifier"/>
<result column="modify_date" property="modifyDate"/>
<result column="modify_date" property="modifyDate" javaType="java.util.Date" jdbcType="TIMESTAMP"/>
<result column="del_flag" property="delFlag"/>
<result column="application_code" property="applicationCode"/>
<result column="tenant_code" property="tenantCode"/>
......@@ -105,9 +105,9 @@
#{status},
#{isDefault},
#{creator},
#{createDate},
#{createDate, jdbcType=TIMESTAMP, javaType=java.util.Date},
#{modifier},
#{modifyDate},
#{modifyDate, jdbcType=TIMESTAMP, javaType=java.util.Date},
#{delFlag},
#{applicationCode},
#{tenantCode}
......@@ -135,7 +135,7 @@
del_flag = #{delFlag},
</if>
modifier = #{modifier},
modify_date = #{modifyDate}
modify_date = #{modifyDate, jdbcType=TIMESTAMP, javaType=java.util.Date}
WHERE
<if test="id != null">
id = #{id}
......@@ -144,7 +144,9 @@
<delete id="delete">
UPDATE sys_role SET
del_flag = 1
del_flag = 1,
modifier = #{modifier} ,
modify_date = #{modifyDate, jdbcType=TIMESTAMP, javaType=java.util.Date}
WHERE id = #{id}
</delete>
......
......@@ -11,9 +11,9 @@
<result column="sort" property="sort"/>
<result column="status" property="status"/>
<result column="creator" property="creator"/>
<result column="create_date" property="createDate"/>
<result column="create_date" property="createDate" javaType="java.util.Date" jdbcType="TIMESTAMP"/>
<result column="modifier" property="modifier"/>
<result column="modify_date" property="modifyDate"/>
<result column="modify_date" property="modifyDate" javaType="java.util.Date" jdbcType="TIMESTAMP"/>
<result column="del_flag" property="delFlag"/>
<result column="application_code" property="applicationCode"/>
</resultMap>
......@@ -99,9 +99,9 @@
#{sort},
#{status},
#{creator},
#{createDate},
#{createDate, jdbcType=TIMESTAMP, javaType=java.util.Date},
#{modifier},
#{modifyDate},
#{modifyDate, jdbcType=TIMESTAMP, javaType=java.util.Date},
#{delFlag},
#{applicationCode}
)
......@@ -131,7 +131,7 @@
status = #{status},
</if>
modifier = #{modifier},
modify_date = #{modifyDate}
modify_date = #{modifyDate, jdbcType=TIMESTAMP, javaType=java.util.Date}
WHERE
<if test="id != null">
id = #{id}
......@@ -140,7 +140,9 @@
<delete id="delete">
UPDATE sys_route SET
del_flag = 1
del_flag = 1,
modifier = #{modifier} ,
modify_date = #{modifyDate, jdbcType=TIMESTAMP, javaType=java.util.Date}
WHERE id = #{id}
</delete>
......
......@@ -8,9 +8,9 @@
<result column="tenant_desc" property="tenantDesc"/>
<result column="status" property="status"/>
<result column="creator" property="creator"/>
<result column="create_date" property="createDate"/>
<result column="create_date" property="createDate" javaType="java.util.Date" jdbcType="TIMESTAMP"/>
<result column="modifier" property="modifier"/>
<result column="modify_date" property="modifyDate"/>
<result column="modify_date" property="modifyDate" javaType="java.util.Date" jdbcType="TIMESTAMP"/>
<result column="del_flag" property="delFlag"/>
</resultMap>
......@@ -77,9 +77,9 @@
#{tenantDesc},
#{status},
#{creator},
#{createDate},
#{createDate, jdbcType=TIMESTAMP, javaType=java.util.Date},
#{modifier},
#{modifyDate},
#{modifyDate, jdbcType=TIMESTAMP, javaType=java.util.Date},
#{delFlag}
)
</insert>
......@@ -99,13 +99,15 @@
del_flag = #{delFlag},
</if>
modifier = #{modifier},
modify_date = #{modifyDate}
modify_date = #{modifyDate, jdbcType=TIMESTAMP, javaType=java.util.Date}
WHERE id = #{id}
</update>
<delete id="delete">
UPDATE sys_tenant SET
DEL_FLAG = 1
del_flag = 1,
modifier = #{modifier} ,
modify_date = #{modifyDate, jdbcType=TIMESTAMP, javaType=java.util.Date}
WHERE ID = #{id}
</delete>
......
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.github.tangyi.user.mapper.UserAuthsMapper">
<resultMap id="userAuthResultMap" type="com.github.tangyi.user.api.module.UserAuths">
<id column="id" property="id"/>
<result column="user_id" property="userId"/>
<result column="identity_type" property="identityType"/>
<result column="identifier" property="identifier"/>
<result column="credential" property="credential"/>
<result column="creator" property="creator"/>
<result column="create_date" property="createDate" javaType="java.util.Date" jdbcType="TIMESTAMP"/>
<result column="modifier" property="modifier"/>
<result column="modify_date" property="modifyDate" javaType="java.util.Date" jdbcType="TIMESTAMP"/>
<result column="del_flag" property="delFlag"/>
<result column="application_code" property="applicationCode"/>
<result column="tenant_code" property="tenantCode"/>
</resultMap>
<sql id="userAuthColumns">
a.id,
a.user_id,
a.identity_type,
a.identifier,
a.credential,
a.creator,
a.create_date,
a.modifier,
a.modify_date,
a.del_flag,
a.application_code,
a.tenant_code
</sql>
<!-- where 条件 -->
<sql id="whereColumnList">
<if test="identityType != null and identityType != ''">
and a.identity_type = #{identityType}
</if>
<if test="tenantCode != null and tenantCode != ''">
and a.tenant_code = #{tenantCode}
</if>
</sql>
<select id="get" resultMap="userAuthResultMap">
SELECT
<include refid="userAuthColumns"/>
FROM sys_user_auths a
WHERE a.id = #{id}
</select>
<select id="getByIdentifier" resultMap="userAuthResultMap">
SELECT
<include refid="userAuthColumns"/>
FROM sys_user_auths a
WHERE a.identifier = #{identifier} and a.del_flag = 0
<include refid="whereColumnList"/>
</select>
<select id="getListByUserIds" resultMap="userAuthResultMap">
SELECT
<include refid="userAuthColumns"/>
FROM sys_user_auths a
WHERE a.user_id IN
<foreach collection="userIds" index="index" item="item" open="(" separator="," close=")">
#{item}
</foreach>
</select>
<select id="findList" resultMap="userAuthResultMap">
SELECT
<include refid="userAuthColumns"/>
FROM sys_user_auths a
WHERE a.del_flag = 0
<include refid="whereColumnList"/>
</select>
<select id="findListById" resultMap="userAuthResultMap">
SELECT
<include refid="userAuthColumns"/>
FROM sys_user_auths a
WHERE a.id IN
<foreach collection="ids" index="index" item="item" open="(" separator="," close=")">
#{item}
</foreach>
</select>
<!-- 新增用户 -->
<insert id="insert">
insert into sys_user_auths (
id,
user_id,
identity_type,
identifier,
credential,
creator,
create_date,
modifier,
modify_date,
del_flag,
application_code,
tenant_code
) values (
#{id},
#{userId},
#{identityType},
#{identifier},
#{credential},
#{creator},
#{createDate, jdbcType=TIMESTAMP, javaType=java.util.Date},
#{modifier},
#{modifyDate, jdbcType=TIMESTAMP, javaType=java.util.Date},
#{delFlag},
#{applicationCode},
#{tenantCode}
);
</insert>
<!-- 更新用户 -->
<update id="update">
update sys_user_auths set
<if test="userId != null">
user_id = #{userId} ,
</if>
<if test="identityType != null">
identity_type = #{identityType} ,
</if>
<if test="identifier != null">
identifier = #{identifier} ,
</if>
<if test="credential != null">
credential = #{credential} ,
</if>
<if test="creator != null">
creator = #{creator} ,
</if>
<if test="createDate != null">
create_date = #{createDate} ,
</if>
<if test="delFlag != null">
del_flag = #{delFlag} ,
</if>
<if test="applicationCode != null">
application_code = #{applicationCode} ,
</if>
modifier = #{modifier} ,
modify_date = #{modifyDate, jdbcType=TIMESTAMP, javaType=java.util.Date}
where id = #{id}
</update>
<update id="delete">
DELETE FROM sys_user_auths WHERE id = #{id}
</update>
<update id="deleteByIdentifier">
DELETE FROM sys_user_auths WHERE identifier = #{identifier}
</update>
<update id="deleteByUserId">
DELETE FROM sys_user_auths WHERE user_id = #{userId}
</update>
<delete id="deleteAll">
DELETE FROM sys_user_auths WHERE id in
<foreach item="item" index="index" collection="array" open="("
separator="," close=")">#{item}
</foreach>
</delete>
</mapper>
......@@ -4,74 +4,32 @@
<resultMap id="userResultMap" type="com.github.tangyi.user.api.module.User">
<id column="id" property="id"/>
<result column="name" property="name"/>
<result column="username" property="username"/>
<result column="password" property="password"/>
<result column="salt" property="salt"/>
<result column="phone" property="phone"/>
<result column="avatar_id" property="avatarId"/>
<result column="email" property="email"/>
<result column="sex" property="sex"/>
<result column="born" property="born"/>
<result column="remark" property="remark"/>
<result column="born" property="born" jdbcType="DATE" javaType="java.util.Date"/>
<result column="user_desc" property="userDesc"/>
<result column="dept_id" property="deptId"/>
<result column="status" property="status"/>
<result column="creator" property="creator"/>
<result column="create_date" property="createDate"/>
<result column="create_date" property="createDate" javaType="java.util.Date" jdbcType="TIMESTAMP"/>
<result column="modifier" property="modifier"/>
<result column="modify_date" property="modifyDate"/>
<result column="modify_date" property="modifyDate" javaType="java.util.Date" jdbcType="TIMESTAMP"/>
<result column="del_flag" property="delFlag"/>
<result column="application_code" property="applicationCode"/>
<result column="tenant_code" property="tenantCode"/>
</resultMap>
<resultMap id="userVoResultMap" type="com.github.tangyi.common.core.vo.UserVo">
<id column="id" property="id"/>
<result column="name" property="name"/>
<result column="username" property="username"/>
<result column="password" property="password"/>
<result column="salt" property="salt"/>
<result column="phone" property="phone"/>
<result column="avatar_id" property="avatarId"/>
<result column="email" property="email"/>
<result column="sex" property="sex"/>
<result column="born" property="born"/>
<result column="remark" property="remark"/>
<result column="dept_id" property="deptId"/>
<result column="status" property="status"/>
<result column="ucreator" property="creator"/>
<result column="ucreate_date" property="createDate"/>
<result column="umodifier" property="modifier"/>
<result column="umodify_date" property="modifyDate"/>
<result column="udel_flag" property="delFlag"/>
<result column="uapplication_code" property="applicationCode"/>
<result column="utenant_code" property="tenantCode"/>
<collection property="roleList" ofType="com.github.tangyi.common.core.vo.Role">
<id column="roleId" property="id"/>
<result column="role_name" property="roleName"/>
<result column="role_code" property="roleCode"/>
<result column="role_desc" property="roleDesc"/>
<result column="rcreator" property="creator"/>
<result column="rcreate_date" property="createDate"/>
<result column="rmodifier" property="modifier"/>
<result column="rmodify_date" property="modifyDate"/>
<result column="rdel_flag" property="delFlag"/>
<result column="rapplication_code" property="applicationCode"/>
<result column="rtenant_code" property="tenantCode"/>
</collection>
</resultMap>
<sql id="userColumns">
a.id,
a.name,
a.username,
a.password,
a.salt,
a.phone,
a.avatar_id,
a.email,
a.sex,
a.born,
a.remark,
a.user_desc,
a.dept_id,
a.status,
a.creator,
......@@ -86,10 +44,7 @@
<!-- where 条件 -->
<sql id="whereColumnList">
<if test="name != null and name != ''">
and a.name like CONCAT('%', #{username},'%')
</if>
<if test="username != null and username != ''">
and a.username like #{username}
and a.name like CONCAT('%', #{name},'%')
</if>
<if test="born != null and born != '' ">
and a.born like #{born}
......@@ -108,55 +63,6 @@
</if>
</sql>
<sql id="selectUserVo">
SELECT
`user`.id,
`user`.name,
`user`.username,
`user`.password,
`user`.salt,
`user`.phone,
`user`.avatar_id,
`user`.email,
`user`.sex,
`user`.born,
`user`.remark,
`user`.dept_id,
`user`.status,
`user`.creator as "ucreator",
`user`.create_date as "ucreate_date",
`user`.modifier as "umodifier",
`user`.modify_date as "umodify_date",
`user`.del_flag as "udel_flag",
`user`.application_code as "uapplication_code",
`user`.tenant_code as "utenant_code",
r.id as "roleId",
r.role_name,
r.role_code,
r.role_desc,
r.creator as "rcreator",
r.create_date as "rcreate_date",
r.modifier as "rmodifier",
r.modify_date as "rmodify_date",
r.del_flag as "rdel_flag",
r.application_code as "rapplication_code",
r.tenant_code as "rtenant_code"
FROM
sys_user as `user`
LEFT JOIN sys_user_role ur ON ur.user_id = `user`.id
LEFT JOIN sys_role r ON r.id = ur.role_id
</sql>
<select id="selectUserVoByUsername" resultMap="userVoResultMap">
<include refid="selectUserVo"/>
WHERE `user`.username = #{username} and `user`.tenant_code = #{tenantCode} and `user`.del_flag = 0
</select>
<select id="selectUserVoBySocial" resultMap="userVoResultMap">
<include refid="selectUserVo"/>
WHERE `user`.phone = #{social} and `user`.tenant_code = #{tenantCode} and `user`.del_flag = 0
</select>
<select id="get" resultMap="userResultMap">
SELECT
<include refid="userColumns"/>
......@@ -189,18 +95,15 @@
<!-- 新增用户 -->
<insert id="insert">
insert into sys_user (
insert into sys_user (
id,
name,
username,
password,
salt,
phone,
avatar_id,
email,
sex,
born,
remark,
user_desc,
dept_id,
status,
creator,
......@@ -213,21 +116,18 @@
) values (
#{id},
#{name},
#{username},
#{password},
#{salt},
#{phone},
#{avatarId},
#{email},
#{sex},
#{born},
#{remark},
#{born, jdbcType=DATE, javaType=java.util.Date},
#{userDesc},
#{deptId},
#{status},
#{creator},
#{createDate},
#{createDate, jdbcType=TIMESTAMP, javaType=java.util.Date},
#{modifier},
#{modifyDate},
#{modifyDate, jdbcType=TIMESTAMP, javaType=java.util.Date},
#{delFlag},
#{applicationCode},
#{tenantCode}
......@@ -240,15 +140,6 @@
<if test="name != null">
name = #{name} ,
</if>
<if test="username != null">
username = #{username} ,
</if>
<if test="password != null">
password = #{password} ,
</if>
<if test="salt != null">
salt = #{salt} ,
</if>
<if test="phone != null">
phone = #{phone} ,
</if>
......@@ -264,8 +155,8 @@
<if test="born != null">
born = #{born} ,
</if>
<if test="remark != null">
remark = #{remark} ,
<if test="userDesc != null">
user_desc = #{userDesc} ,
</if>
<if test="deptId != null">
dept_id = #{deptId} ,
......@@ -286,7 +177,7 @@
application_code = #{applicationCode} ,
</if>
modifier = #{modifier} ,
modify_date = #{modifyDate}
modify_date = #{modifyDate, jdbcType=TIMESTAMP, javaType=java.util.Date}
where id = #{id}
</update>
......@@ -294,7 +185,7 @@
update sys_user set
del_flag = 1,
modifier = #{modifier} ,
modify_date = #{modifyDate}
modify_date = #{modifyDate, jdbcType=TIMESTAMP, javaType=java.util.Date}
where id = #{id}
</update>
......
......@@ -3,6 +3,8 @@ package com.github.tangyi.exam.api.dto;
import com.github.tangyi.common.core.persistence.BaseEntity;
import lombok.Data;
import java.util.Date;
/**
* 考试记录DTO
*
......@@ -40,17 +42,17 @@ public class ExaminationRecordDto extends BaseEntity<ExaminationRecordDto> {
/**
* 当前时间
*/
private String currentTime;
private Date currentTime;
/**
* 考试开始时间
*/
private String startTime;
private Date startTime;
/**
* 考试结束时间
*/
private String endTime;
private Date endTime;
/**
* 考试持续时间
......
......@@ -4,6 +4,7 @@ import com.github.tangyi.common.core.persistence.BaseEntity;
import lombok.Data;
import javax.validation.constraints.NotBlank;
import java.util.Date;
/**
* 考试
......@@ -34,12 +35,12 @@ public class Examination extends BaseEntity<Examination> {
/**
* 考试开始时间
*/
private String startTime;
private Date startTime;
/**
* 考试结束时间
*/
private String endTime;
private Date endTime;
/**
* 总分
......
......@@ -4,6 +4,7 @@ import com.github.tangyi.common.core.persistence.BaseEntity;
import lombok.Data;
import javax.validation.constraints.NotBlank;
import java.util.Date;
/**
* 考试记录
......@@ -29,12 +30,12 @@ public class ExaminationRecord extends BaseEntity<ExaminationRecord> {
/**
* 开始时间
*/
private String startTime;
private Date startTime;
/**
* 结束时间
*/
private String endTime;
private Date endTime;
/**
* 成绩
......
......@@ -8,8 +8,8 @@ package com.github.tangyi.user.api.constant;
*/
public class RoleConstant {
public static final String IS_DEFAULT_ROLE = "1";
public static final Integer IS_DEFAULT_ROLE = 1;
public static final String NORMAL_ROLE = "0";
public static final Integer NORMAL_ROLE = 0;
}
......@@ -33,18 +33,12 @@ public class DeptDto extends TreeEntity<DeptDto> {
*/
private String parentId;
/**
* 状态, 0-启用,1-禁用
*/
private String status;
public DeptDto(Dept dept) {
this.id = dept.getId();
this.deptName = dept.getDeptName();
this.deptDesc = dept.getDeptDesc();
this.deptLeader = dept.getDeptLeader();
this.parentId = dept.getParentId();
this.status = dept.getStatus();
this.sort = Integer.parseInt(dept.getSort());
this.creator = dept.getCreator();
this.createDate = dept.getCreateDate();
......
package com.github.tangyi.user.api.dto;
import com.github.tangyi.user.api.module.User;
import com.github.tangyi.common.core.persistence.BaseEntity;
import com.github.tangyi.user.api.module.Role;
import lombok.Data;
import javax.validation.constraints.Email;
import javax.validation.constraints.Pattern;
import java.util.Date;
import java.util.List;
/**
......@@ -13,7 +17,22 @@ import java.util.List;
* @date 2018/8/26 14:36
*/
@Data
public class UserDto extends User {
public class UserDto extends BaseEntity<UserDto> {
/**
* 授权类型,1:用户名密码,2:手机号,3:邮箱,4:微信,5:QQ
*/
private Integer identityType;
/**
* 唯一标识,如用户名、手机号
*/
private String identifier;
/**
* 密码凭证,跟授权类型有关,如密码、第三方系统的token等
*/
private String credential;
/**
* 角色
......@@ -26,6 +45,11 @@ public class UserDto extends User {
private String deptId;
/**
* 部门名称
*/
private String deptName;
/**
* 旧密码
*/
private String oldPassword;
......@@ -34,4 +58,51 @@ public class UserDto extends User {
* 新密码
*/
private String newPassword;
/**
* 姓名
*/
private String name;
/**
* 电话
*/
@Pattern(regexp = "^\\d{11}$", message = "请输入11位手机号")
private String phone;
/**
* 头像id
*/
private String avatarId;
/**
* 邮箱
*/
@Email(message = "邮箱格式不正确")
private String email;
/**
* 性别
*/
private Integer sex;
/**
* 出生日期
*/
private Date born;
/**
* 描述
*/
private String userDesc;
/**
* 状态
*/
private Integer status;
/**
* 角色列表
*/
private List<Role> roleList;
}
package com.github.tangyi.user.api.dto;
import com.fasterxml.jackson.annotation.JsonIgnore;
import lombok.Data;
import java.io.Serializable;
import java.util.Date;
/**
* @author tangyi
......@@ -16,14 +18,25 @@ public class UserInfoDto implements Serializable {
private String id;
/**
* 姓名
* 授权类型,1:用户名密码,2:手机号,3:邮箱,4:微信,5:QQ
*/
private String name;
private Integer identityType;
/**
* 唯一标识,如用户名、手机号
*/
private String identifier;
/**
* 密码
*/
@JsonIgnore
private String credential;
/**
* 用户
*
*/
private String username;
private String name;
/**
* 电话号码
......@@ -48,12 +61,12 @@ public class UserInfoDto implements Serializable {
/**
* 性别
*/
private String sex;
private Integer sex;
/**
* 生日
*/
private String born;
private Date born;
/**
* 部门名称
......@@ -73,7 +86,7 @@ public class UserInfoDto implements Serializable {
/**
* 状态,0-启用,1-禁用
*/
private String status;
private Integer status;
/**
* 权限信息
......@@ -84,4 +97,14 @@ public class UserInfoDto implements Serializable {
* 角色信息
*/
private String[] roles;
/**
* 系统编号
*/
private String applicationCode;
/**
* 租户标识
*/
private String tenantCode;
}
package com.github.tangyi.user.api.enums;
/**
* 用户授权类型
*
* @author tangyi
* @date 2019/07/03 13:35
*/
public enum IdentityType {
PASSWORD(1, "密码"),
PHONE_NUMBER(2, "手机号"),
EMAIL(3, "邮箱"),
WE_CHAT(4, "微信"),
QQ(5, "QQ");
IdentityType(Integer value, String desc) {
this.value = value;
this.desc = desc;
}
private Integer value;
private String desc;
/**
* 根据类型返回具体的IdentityType
*
* @param type type
* @return IdentityType
*/
public static IdentityType match(Integer type) {
for (IdentityType item : IdentityType.values()) {
if (item.value.equals(type)) {
return item;
}
}
return IdentityType.PASSWORD;
}
public Integer getValue() {
return value;
}
public void setValue(Integer value) {
this.value = value;
}
public String getDesc() {
return desc;
}
public void setDesc(String desc) {
this.desc = desc;
}
}
......@@ -28,14 +28,14 @@ public interface UserServiceClient {
/**
* 根据用户名获取用户详细信息
*
* @param username username
* @param identifier identifier
* @param tenantCode 租户标识
* @return UserVo
* @author tangyi
* @date 2019/03/17 12:14
*/
@GetMapping("/v1/user/findUserByUsername/{username}")
UserVo findUserByUsername(@PathVariable("username") String username, @RequestParam("tenantCode") String tenantCode);
@GetMapping("/v1/user/findUserByIdentifier/{identifier}")
UserVo findUserByIdentifier(@PathVariable("identifier") String identifier, @RequestParam("tenantCode") String tenantCode);
/**
* 获取当前用户的信息
......
......@@ -31,14 +31,14 @@ public class UserServiceClientFallbackImpl implements UserServiceClient {
/**
* 根据用户名查询用户信息
*
* @param username username
* @param identifier identifier
* @param tenantCode 租户标识
* @param tenantCode 租户标识
* @return UserVo
*/
@Override
public UserVo findUserByUsername(String username, String tenantCode) {
log.error("feign 查询用户信息失败:{}, {}, {}", tenantCode, username, throwable);
public UserVo findUserByIdentifier(String identifier, String tenantCode) {
log.error("feign 查询用户信息失败:{}, {}, {}", tenantCode, identifier, throwable);
return null;
}
......
......@@ -39,10 +39,4 @@ public class Dept extends BaseEntity<Dept> {
* 排序
*/
private String sort;
/**
* 状态, 0-启用,1-禁用
*/
@NotBlank(message = "部门状态不能为空")
private String status;
}
......@@ -22,7 +22,7 @@ public class Role extends BaseEntity<Role> {
private String roleDesc;
private String status;
private Integer status;
private String deptName;
......@@ -31,5 +31,5 @@ public class Role extends BaseEntity<Role> {
/**
* 是否默认 0-否,1-是
*/
private String isDefault;
private Integer isDefault;
}
......@@ -4,12 +4,12 @@ import com.github.tangyi.common.core.persistence.BaseEntity;
import lombok.Data;
import javax.validation.constraints.Email;
import javax.validation.constraints.NotBlank;
import javax.validation.constraints.Pattern;
import java.util.Date;
import java.util.List;
/**
* 用户实体
* 用户基本信息
*
* @author tangyi
* @date 2018-08-25 15:30
......@@ -17,34 +17,51 @@ import java.util.List;
@Data
public class User extends BaseEntity<User> {
/**
* 姓名
*/
private String name;
@NotBlank(message = "用户名不能为空")
private String username;
@NotBlank(message = "密码不能为空")
private String password;
private String salt;
/**
* 电话
*/
@Pattern(regexp = "^\\d{11}$", message = "请输入11位手机号")
private String phone;
/**
* 头像id
*/
private String avatarId;
/**
* 邮箱
*/
@Email(message = "邮箱格式不正确")
private String email;
private String sex;
private String born;
/**
* 性别
*/
private Integer sex;
private String remark;
/**
* 出生日期
*/
private Date born;
private String status;
/**
* 描述
*/
private String userDesc;
private String deptName;
/**
* 状态
*/
private Integer status;
/**
* 部门id
*/
private String deptId;
/**
......
package com.github.tangyi.user.api.module;
import com.github.tangyi.common.core.persistence.BaseEntity;
import com.github.tangyi.user.api.enums.IdentityType;
import lombok.Data;
/**
* 用户授权信息
*
* @author tangyi
* @date 2019/07/03 11:10
*/
@Data
public class UserAuths extends BaseEntity<UserAuths> {
/**
* 用户id
*/
private String userId;
/**
* 授权类型,1:用户名密码,2:手机号,3:邮箱,4:微信,5:QQ
*/
private Integer identityType = IdentityType.PASSWORD.getValue();
/**
* 唯一标识,如用户名、手机号
*/
private String identifier;
/**
* 密码凭证,跟授权类型有关,如密码、第三方系统的token等
*/
private String credential;
}
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