Browse Source

修改系统内部线程创建方式

lwx_dev
erdanergou 3 years ago
parent
commit
ede707d761
  1. 14
      src/main/java/com/dreamchaser/depository_manage/controller/DepositoryController.java
  2. 26
      src/main/java/com/dreamchaser/depository_manage/controller/MaterialTypeController.java
  3. 1
      src/main/java/com/dreamchaser/depository_manage/controller/NoticeController.java
  4. 16
      src/main/java/com/dreamchaser/depository_manage/controller/QyWxOperationController.java
  5. 143
      src/main/java/com/dreamchaser/depository_manage/controller/UserController.java
  6. 68
      src/main/java/com/dreamchaser/depository_manage/security/bean/LoginRealms.java
  7. 66
      src/main/java/com/dreamchaser/depository_manage/security/bean/LoginType.java
  8. 88
      src/main/java/com/dreamchaser/depository_manage/security/bean/UserToken.java
  9. 74
      src/main/java/com/dreamchaser/depository_manage/security/bean/VerificationCode.java
  10. 1
      src/main/java/com/dreamchaser/depository_manage/security/pool/AuthenticationTokenPool.java
  11. 4
      src/main/java/com/dreamchaser/depository_manage/security/pool/HandlesOtherFunctionalThreadPool.java
  12. 3
      src/main/java/com/dreamchaser/depository_manage/security/pool/UserKeyAndTokenPool.java
  13. 54
      src/main/java/com/dreamchaser/depository_manage/security/pool/VerificationCodePool.java
  14. 16
      src/main/java/com/dreamchaser/depository_manage/service/impl/DepositoryRecordServiceImpl.java
  15. 53
      src/test/java/com/dreamchaser/depository_manage/OtherTest.java

14
src/main/java/com/dreamchaser/depository_manage/controller/DepositoryController.java

@ -4,7 +4,7 @@ import com.dreamchaser.depository_manage.entity.*;
import com.dreamchaser.depository_manage.exception.MyException;
import com.dreamchaser.depository_manage.pojo.*;
import com.dreamchaser.depository_manage.security.pool.AuthenticationTokenPool;
import com.dreamchaser.depository_manage.security.pool.HandlesOtherfunctionalThreadPool;
import com.dreamchaser.depository_manage.security.pool.HandlesOtherFunctionalThreadPool;
import com.dreamchaser.depository_manage.service.*;
import com.dreamchaser.depository_manage.utils.*;
import lombok.Data;
@ -142,13 +142,13 @@ public class DepositoryController {
UserByPort userToken = AuthenticationTokenPool.getUserToken(token);
if (map.containsKey("id")) {
Integer id = ObjectFormatUtil.toInteger(map.get("id"));
HandlesOtherfunctionalThreadPool.execute(() -> RealDeleteSonDepository(id.toString(), userToken));
HandlesOtherFunctionalThreadPool.execute(() -> RealDeleteSonDepository(id.toString(), userToken));
return CrudUtil.deleteHandle(depositoryService.deleteDepositoryRecordById(id), 1);
} else if (map.containsKey("ids")) {
List<Integer> ids = (List<Integer>) map.get("ids");
for (Integer integer : ids) {
String id = integer.toString();
HandlesOtherfunctionalThreadPool.execute(() -> RealDeleteSonDepository(id, userToken));
HandlesOtherFunctionalThreadPool.execute(() -> RealDeleteSonDepository(id, userToken));
}
return CrudUtil.deleteHandle(depositoryService.deleteDepositoryRecordByIds(ids), ids.size());
} else {
@ -225,14 +225,14 @@ public class DepositoryController {
UserByPort userToken = AuthenticationTokenPool.getUserToken(token);
if (map.containsKey("id")) {
Integer id = ObjectFormatUtil.toInteger(map.get("id"));
HandlesOtherfunctionalThreadPool.execute(() -> UpdateSonState(id.toString(), 3, true, userToken));
HandlesOtherFunctionalThreadPool.execute(() -> UpdateSonState(id.toString(), 3, true, userToken));
return CrudUtil.deleteHandle(depositoryService.changeStateToDeletedById(id), 1);
} else if (map.containsKey("ids")) {
List<Integer> ids = (List<Integer>) map.get("ids");
for (Integer integer : ids) {
String id = integer.toString();
HandlesOtherfunctionalThreadPool.execute(() -> UpdateSonState(id, 3, true, userToken));
HandlesOtherFunctionalThreadPool.execute(() -> UpdateSonState(id, 3, true, userToken));
}
return CrudUtil.deleteHandle(depositoryService.changeStateToDeletedByIds(ids), ids.size());
} else {
@ -279,10 +279,10 @@ public class DepositoryController {
if (state == 2) {
if (map.containsKey("envelop")) {
// 封库
HandlesOtherfunctionalThreadPool.execute(() -> UpdateSonState(id, state, true, userToken));
HandlesOtherFunctionalThreadPool.execute(() -> UpdateSonState(id, state, true, userToken));
} else {
// 禁用仓库
HandlesOtherfunctionalThreadPool.execute(() -> UpdateSonState(id, state, false, userToken));
HandlesOtherFunctionalThreadPool.execute(() -> UpdateSonState(id, state, false, userToken));
}
}
return CrudUtil.insertHandle(depositoryService.updateDepository(map), 1);

26
src/main/java/com/dreamchaser/depository_manage/controller/MaterialTypeController.java

@ -4,7 +4,7 @@ import com.dreamchaser.depository_manage.entity.MaterialType;
import com.dreamchaser.depository_manage.exception.MyException;
import com.dreamchaser.depository_manage.pojo.MaterialP;
import com.dreamchaser.depository_manage.pojo.RestResponse;
import com.dreamchaser.depository_manage.security.pool.HandlesOtherfunctionalThreadPool;
import com.dreamchaser.depository_manage.security.pool.HandlesOtherFunctionalThreadPool;
import com.dreamchaser.depository_manage.service.MaterialService;
import com.dreamchaser.depository_manage.service.MaterialTypeService;
import com.dreamchaser.depository_manage.utils.CrudUtil;
@ -34,7 +34,7 @@ public class MaterialTypeController {
public RestResponse insertMaterialType(@RequestBody Map<String,Object> map){
Integer integer = materialTypeService.insertMaterialType(map);
// 更新树结构
HandlesOtherfunctionalThreadPool.execute(() -> {
HandlesOtherFunctionalThreadPool.execute(() -> {
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
@ -84,11 +84,11 @@ public class MaterialTypeController {
if (map.containsKey("id")){
Integer id= ObjectFormatUtil.toInteger(map.get("id"));
MaterialType materialTypeById = materialTypeService.findMaterialTypeById(id);
HandlesOtherfunctionalThreadPool.execute(() -> RealDeleteSonDepository(materialTypeById.getOldId().toString()));
HandlesOtherFunctionalThreadPool.execute(() -> RealDeleteSonDepository(materialTypeById.getOldId().toString()));
Integer integer = materialTypeService.deleteMaterialTypeById(id);
HandlesOtherfunctionalThreadPool.execute(() -> {
HandlesOtherFunctionalThreadPool.execute(() -> {
try {
Thread.sleep(3000);
} catch (InterruptedException e) {
@ -102,14 +102,14 @@ public class MaterialTypeController {
List<Integer> ids=(List<Integer>) map.get("ids");
for (Integer id : ids) {
MaterialType materialTypeById = materialTypeService.findMaterialTypeById(id);
HandlesOtherfunctionalThreadPool.execute(() -> RealDeleteSonDepository(materialTypeById.getOldId().toString()));
HandlesOtherFunctionalThreadPool.execute(() -> RealDeleteSonDepository(materialTypeById.getOldId().toString()));
}
Integer integer = materialTypeService.deleteMaterialTypeByIds(ids);
HandlesOtherfunctionalThreadPool.execute(() -> {
HandlesOtherFunctionalThreadPool.execute(() -> {
try {
Thread.sleep(3000);
} catch (InterruptedException e) {
@ -149,12 +149,12 @@ public class MaterialTypeController {
if (map.containsKey("id")){
Integer id= ObjectFormatUtil.toInteger(map.get("id"));
MaterialType materialTypeById = materialTypeService.findMaterialTypeById(id);
HandlesOtherfunctionalThreadPool.execute(() -> UpdateSonState(materialTypeById.getOldId().toString(),3));
HandlesOtherFunctionalThreadPool.execute(() -> UpdateSonState(materialTypeById.getOldId().toString(),3));
Integer integer = materialTypeService.changeStateToDeletedById(id);
HandlesOtherfunctionalThreadPool.execute(() -> {
HandlesOtherFunctionalThreadPool.execute(() -> {
try {
Thread.sleep(3000);
} catch (InterruptedException e) {
@ -168,13 +168,13 @@ public class MaterialTypeController {
List<Integer> ids=(List<Integer>) map.get("ids");
for (Integer id : ids) {
MaterialType materialTypeById = materialTypeService.findMaterialTypeById(id);
HandlesOtherfunctionalThreadPool.execute(() -> UpdateSonState(materialTypeById.getOldId().toString(), 3));
HandlesOtherFunctionalThreadPool.execute(() -> UpdateSonState(materialTypeById.getOldId().toString(), 3));
}
Integer integer = materialTypeService.changeStateToDeletedByIds(ids);
HandlesOtherfunctionalThreadPool.execute(() -> {
HandlesOtherFunctionalThreadPool.execute(() -> {
try {
Thread.sleep(3000);
} catch (InterruptedException e) {
@ -204,7 +204,7 @@ public class MaterialTypeController {
Integer integer = materialTypeService.updateMaterialType(map);
HandlesOtherfunctionalThreadPool.execute(() -> {
HandlesOtherFunctionalThreadPool.execute(() -> {
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
@ -305,12 +305,12 @@ public class MaterialTypeController {
int state = ((int)map.get("state"));
String id = (String) map.get("id");
MaterialType materialTypeById = materialTypeService.findMaterialTypeById(ObjectFormatUtil.toInteger(id));
HandlesOtherfunctionalThreadPool.execute(() -> UpdateSonState(materialTypeById.getOldId().toString(), state));
HandlesOtherFunctionalThreadPool.execute(() -> UpdateSonState(materialTypeById.getOldId().toString(), state));
Integer integer = materialTypeService.updateMaterialType(map);
HandlesOtherfunctionalThreadPool.execute(() -> {
HandlesOtherFunctionalThreadPool.execute(() -> {
try {
Thread.sleep(3000);
} catch (InterruptedException e) {

1
src/main/java/com/dreamchaser/depository_manage/controller/NoticeController.java

@ -5,7 +5,6 @@ import com.dreamchaser.depository_manage.exception.MyException;
import com.dreamchaser.depository_manage.pojo.NoticeP;
import com.dreamchaser.depository_manage.pojo.RestResponse;
import com.dreamchaser.depository_manage.security.pool.AuthenticationTokenPool;
import com.dreamchaser.depository_manage.security.pool.HandlesOtherfunctionalThreadPool;
import com.dreamchaser.depository_manage.service.NoticeService;
import com.dreamchaser.depository_manage.service.impl.QyWxOperationService;
import com.dreamchaser.depository_manage.utils.CrudUtil;

16
src/main/java/com/dreamchaser/depository_manage/controller/QyWxOperationController.java

@ -12,7 +12,7 @@ import com.dreamchaser.depository_manage.pojo.RestResponse;
import com.dreamchaser.depository_manage.pojo.callBackXml.approvalCallBackXml.*;
import com.dreamchaser.depository_manage.pojo.callBackXml.callBackXml_button_templatecard.TemplateCard;
import com.dreamchaser.depository_manage.security.pool.AuthenticationTokenPool;
import com.dreamchaser.depository_manage.security.pool.HandlesOtherfunctionalThreadPool;
import com.dreamchaser.depository_manage.security.pool.HandlesOtherFunctionalThreadPool;
import com.dreamchaser.depository_manage.security.pool.RedisPool;
import com.dreamchaser.depository_manage.security.pool.UserKeyAndTokenPool;
import com.dreamchaser.depository_manage.service.CallBackLogService;
@ -198,7 +198,7 @@ public class QyWxOperationController {
if (stockTakingType.contains("review")) {
// 开启线程处理审批
HandlesOtherfunctionalThreadPool.execute(() -> {
HandlesOtherFunctionalThreadPool.execute(() -> {
Map<String, Object> reviewByQyWx = stockTakingService.reviewByQyWx(templateCard, crypt);
if (reviewByQyWx.containsKey("errMsg")) {
@ -206,18 +206,18 @@ public class QyWxOperationController {
});
} else if (stockTakingType.contains("complete")) {
// 开启线程
HandlesOtherfunctionalThreadPool.execute(() -> stockTakingService.completeStockTakingByQyWx(templateCard, crypt));
HandlesOtherFunctionalThreadPool.execute(() -> stockTakingService.completeStockTakingByQyWx(templateCard, crypt));
}
} else if (templateCardType.contains("out")) {
// 如果点击的是出库审核
// 开启线程处理审批
HandlesOtherfunctionalThreadPool.execute(() -> depositoryRecordService.reviewByQyWx(templateCard, crypt));
HandlesOtherFunctionalThreadPool.execute(() -> depositoryRecordService.reviewByQyWx(templateCard, crypt));
}
// 开启线程更改其他用户卡片模板样式
String finalResult = result;
HandlesOtherfunctionalThreadPool.execute(
HandlesOtherFunctionalThreadPool.execute(
() ->
qyWxOperationService.updateButtonTemplateCardToUnEnable(templateCard.getResponseCode(), userByPort.getName(), finalResult, crypt));
@ -679,18 +679,18 @@ public class QyWxOperationController {
ApprovalInfo_Details finalApprovalInfo_details = approvalInfo_details;
boolean finalFlagForFirst = flagForFirst;
int finalFlagForDepository = flagForDepository;
HandlesOtherfunctionalThreadPool.execute(() -> depositoryRecordService.reviewByQyWxApprovalOut(mainId, finalApprovalInfo_details, crypt, spStatus, approvalInfo.getSpNo(), finalFlagForFirst, finalFlagForDepository));
HandlesOtherFunctionalThreadPool.execute(() -> depositoryRecordService.reviewByQyWxApprovalOut(mainId, finalApprovalInfo_details, crypt, spStatus, approvalInfo.getSpNo(), finalFlagForFirst, finalFlagForDepository));
} else if (QyWxConfig.stockTaking_approval_template_id.equals(approvalInfo.getTemplateId())) {
// 如果是库存盘点审批
// 开启一个线程用于进行处理
ApprovalInfo_Details finalApprovalInfo_details = approvalInfo_details;
HandlesOtherfunctionalThreadPool.execute(() -> stockTakingService.reviewByQyWxApproval(mainId, finalApprovalInfo_details, crypt, spStatus, approvalInfo.getSpNo()));
HandlesOtherFunctionalThreadPool.execute(() -> stockTakingService.reviewByQyWxApproval(mainId, finalApprovalInfo_details, crypt, spStatus, approvalInfo.getSpNo()));
} else if (QyWxConfig.in_approval_template_id.equals(approvalInfo.getTemplateId())) {
// 如果是入库审批
// 开启一个线程用于进行处理
ApprovalInfo_Details finalApprovalInfo_details = approvalInfo_details;
HandlesOtherfunctionalThreadPool.execute(() -> depositoryRecordService.reviewByQyWxApprovalIn(mainId, finalApprovalInfo_details, crypt, spStatus, spNo));
HandlesOtherFunctionalThreadPool.execute(() -> depositoryRecordService.reviewByQyWxApprovalIn(mainId, finalApprovalInfo_details, crypt, spStatus, spNo));
}
// 开启一个线程用于进行下步操作
}

143
src/main/java/com/dreamchaser/depository_manage/controller/UserController.java

@ -9,14 +9,9 @@ import com.dreamchaser.depository_manage.entity.User;
import com.dreamchaser.depository_manage.entity.UserByPort;
import com.dreamchaser.depository_manage.exception.MyException;
import com.dreamchaser.depository_manage.pojo.*;
import com.dreamchaser.depository_manage.security.bean.LoginRealms;
import com.dreamchaser.depository_manage.security.bean.LoginType;
import com.dreamchaser.depository_manage.security.bean.UserToken;
import com.dreamchaser.depository_manage.security.bean.VerificationCode;
import com.dreamchaser.depository_manage.security.pool.AuthenticationTokenPool;
import com.dreamchaser.depository_manage.security.pool.RedisPool;
import com.dreamchaser.depository_manage.security.pool.UserKeyAndTokenPool;
import com.dreamchaser.depository_manage.security.pool.VerificationCodePool;
import com.dreamchaser.depository_manage.service.AccessAddressService;
import com.dreamchaser.depository_manage.service.DepositoryService;
import com.dreamchaser.depository_manage.service.RoleService;
@ -43,8 +38,6 @@ import static com.dreamchaser.depository_manage.utils.CrudUtil.deleteHandle;
*/
@RestController
public class UserController {
@Autowired
private LoginRealms loginRealms;
@Autowired
private UserService userService;
@SuppressWarnings("SpringJavaInjectionPointsAutowiringInspection")
@ -62,74 +55,7 @@ public class UserController {
@Autowired
private AccessAddressService accessAddressService;
/**
* 注册用户通常为手机或者邮箱注册
*
* @param map 参数列表包括账号手机注册就是phone邮箱就是email密码
* @return 成功则返回凭证否则返回验证失败
*/
@PostMapping("/register")
public RestResponse register(@RequestBody Map<String, Object> map) {
String principal;
Object password = map.get("pwd");
Object code = map.get("code");
UserToken userToken;
//判断必要参数是否满足
if (password == null || code == null) {
return CrudUtil.ID_MISS_RESPONSE;
}
//从map中获取对应参数
if (map.get("email") != null) {
principal = String.valueOf(map.get("email"));
userToken = new UserToken(LoginType.EMAIl_PASSWORD, principal, String.valueOf(password));
} else {
return CrudUtil.ID_MISS_RESPONSE;
}
//验证码正确且成功插入数据
if (checkCode(principal, String.valueOf(code))) {
//对密码进行加密然后存储用户信息
map.put("pwd", Md5.crypt(String.valueOf(map.get("pwd"))));
//如果用户记录插入成功
if (userService.insertUser(map) == 1) {
String token = Md5.crypt(userToken.getPrincipal() + userToken.getInstant());
//返回凭证
return new RestResponse().setData(token);
}
} else {
//验证码错误
return CrudUtil.CODE_ERROR;
}
return new RestResponse().setStatus(450).setStatusInfo(new StatusInfo("注册失败,系统繁忙,请稍后再试!", "注册失败"));
}
/**
* 验证是否有此账号然后发送验证码
*
* @param map 主要认证主体如账号邮箱qq的openIDwechat的code等
* @return restResponse附带凭证token
*/
@PostMapping("/sendCode")
public RestResponse sendCode(@RequestBody Map<String, Object> map) {
if (userService.findUserByCondition(map) == null) {
String principal;
if (map.containsKey("phone")) {
principal = String.valueOf(map.get("phone"));
} else if (map.containsKey("email")) {
principal = String.valueOf(map.get("email"));
} else {
return CrudUtil.ID_MISS_RESPONSE;
}
//创建一个验证码
VerificationCode v = new VerificationCode();
//将验证码存入验证码等待池
VerificationCodePool.addCode(principal, v);
return new RestResponse();
}
return new RestResponse("", 304, new StatusInfo("发送验证码失败,该账户已存在!", "发送验证码失败,该账户已存在!"));
}
/**
* 登录接口
@ -192,20 +118,6 @@ public class UserController {
}
/**
* 将生成的令牌拿去认证如果认证成功则返回带有token凭证响应否则返回用户密码错误的响应
*
* @param userToken 未认证的令牌
* @return restResponse 如果认证成功则返回带有token凭证响应否则返回用户密码错误的响应
*/
private RestResponse login(UserToken userToken) {
String token = loginRealms.authenticate(userToken);
if (token != null) {
return new RestResponse(token);
} else {
return CrudUtil.NOT_EXIST_USER_OR_ERROR_PWD_RESPONSE;
}
}
@GetMapping("/loginOut")
public RestResponse loginOut(HttpServletRequest request) {
@ -444,63 +356,8 @@ public class UserController {
}
}
@PutMapping("/user")
public RestResponse updateSelf(@RequestBody Map<String, Object> map, HttpServletRequest request) {
UserToken userToken = (UserToken) request.getAttribute("userToken");
map.put("id", userToken.getUser().getId());
return CrudUtil.insertHandle(userService.updateUserNoSensitive(map), 1);
}
@PutMapping("/checkOldEmail")
public RestResponse checkOldEmail(@RequestBody Map<String, Object> map, HttpServletRequest request) {
if (!map.containsKey("oldCode")) {
return CrudUtil.ID_MISS_RESPONSE;
}
UserToken userToken = (UserToken) request.getAttribute("userToken");
if (checkCode(userToken.getPrincipal(), map.get("oldCode").toString())) {
return new RestResponse("验证成功!");
} else {
//验证码错误
return CrudUtil.CODE_ERROR;
}
}
@PutMapping("/updateEmail")
public RestResponse updateEmail(@RequestBody Map<String, Object> map, HttpServletRequest request) {
//参数检测
if (!map.containsKey("email") || !map.containsKey("oldCode") || !map.containsKey("newCode")) {
return CrudUtil.ID_MISS_RESPONSE;
}
UserToken userToken = (UserToken) request.getAttribute("userToken");
//必须同时检测,否则会出现漏洞
if (checkCode(userToken.getPrincipal(), map.get("oldCode").toString())
&& checkCode(map.get("email").toString(), map.get("code").toString())) {
map.put("id", userToken.getUser().getId());
return CrudUtil.updateHandle(userService.updateUser(map), 1);
} else {
//验证码错误
return CrudUtil.CODE_ERROR;
}
}
/**
* 用于注册用户的方法主要为号码验证和邮箱验证提供验证码核对的服务
*
* @param principal 认证主体
* @param code 验证码
* @return 是否验证通过
*/
private boolean checkCode(String principal, String code) {
if (code != null) {
VerificationCode verificationCode = VerificationCodePool.getCode(principal);
if (verificationCode != null) {
return code.equals(verificationCode.getCode());
}
}
return false;
}
/**

68
src/main/java/com/dreamchaser/depository_manage/security/bean/LoginRealms.java

@ -1,68 +0,0 @@
package com.dreamchaser.depository_manage.security.bean;
import com.dreamchaser.depository_manage.entity.User;
import com.dreamchaser.depository_manage.exception.MyException;
import com.dreamchaser.depository_manage.security.pool.AuthenticationTokenPool;
import com.dreamchaser.depository_manage.service.UserService;
import com.dreamchaser.depository_manage.utils.Md5;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
/**
* 内置多种登录方式和shiro中的realm类似
*/
@Component
public class LoginRealms {
@Autowired
private UserService userService;
/**
* 认证如果认证成功则返回凭证否则返回null
* @param userToken 未认证的令牌
* @return 如果认证成功则返回凭证否则返回null
*/
public String authenticate(UserToken userToken){
if (userToken.getCredentials()!=null){
//对密码加密
userToken.setCredentials(Md5.crypt(userToken.getCredentials()));
}
if (userToken.getLoginType().equals(LoginType.EMAIl_PASSWORD)){
return handle(userToken,emailLogin(userToken));
}
//else if (其他登录方式...)
//如果无匹配的认证方式则视为验证失败
return null;
}
/**
* 邮箱登录方式
* @param userToken 令牌
* @return 认证成功返回SimpleUser
*/
private User emailLogin(UserToken userToken){
return userService.findUserById(userToken.getPrincipal());
}
/**
* 根据传入的user是否为null是否认证通过来对令牌做剩下的操作将user刻入令牌并将该令牌放入令牌池中
* @param userToken 经过验证后的令牌
* @return token 根据令牌生成的凭证 如果认证未成功则返回null
*/
private String handle(UserToken userToken,User user){
if (user==null){
//说明账户不存在
throw new MyException(409,"该用户不存在,请注册后再登录!");
}
//判断密码是否正确
if (user.getPwd().equals(userToken.getCredentials())){
//将UserP信息刻入令牌
userToken.setUser(userService.singlePack(user));
//获取token凭证
String token=Md5.crypt(userToken.getPrincipal()+userToken.getInstant());
//将令牌放入认证令牌池
// AuthenticationTokenPool.addToken(token,userToken);
return token;
}
return null;
}
}

66
src/main/java/com/dreamchaser/depository_manage/security/bean/LoginType.java

@ -1,66 +0,0 @@
package com.dreamchaser.depository_manage.security.bean;
/**
* 登录方式枚举类
* @author 金昊霖
*/
public enum LoginType {
/**
* 通用
*/
COMMON("common_realm"),
/**
* 用户密码登录
*/
EMAIl_PASSWORD("user_password_realm"),
/**
* 手机验证码登录
*/
USER_PHONE("user_phone_realm"),
/**
* 第三方登录(微信登录)
*/
WECHAT_LOGIN("wechat_login_realm"),
/**
* 第三方登录(qq登录)
*/
QQ_LOGIN("qq_login_realm");
private String type;
LoginType(String type) {
this.type = type;
}
public String getType() {
return type;
}
/**
* 根据简单的字符串返回对应的LoginType
* @param s 简单的字符串
* @return 对应的LoginType
*/
public static LoginType getType(String s){
switch (s) {
case "email":
return EMAIl_PASSWORD;
case "qq":
return QQ_LOGIN;
case "wechat":
return WECHAT_LOGIN;
case "phone":
return USER_PHONE;
default:
return null;
}
}
@Override
public String toString() {
return this.type;
}
}

88
src/main/java/com/dreamchaser/depository_manage/security/bean/UserToken.java

@ -1,88 +0,0 @@
package com.dreamchaser.depository_manage.security.bean;
import com.dreamchaser.depository_manage.entity.User;
import com.dreamchaser.depository_manage.pojo.UserP;
import lombok.Data;
import java.time.Instant;
/**
* 登录令牌默认有效期为7天
* @author 金昊霖
*/
@Data
public class UserToken{
final long DEFAULT_TERM=60*60*24*7;
/**
* 登录方式
*/
private LoginType loginType;
/**
* 微信qq的code邮箱或者用户名之类的
*/
private String principal;
/**
* 相当于密码一般是加密过的
*/
private String credentials;
/**
* 放入的时间
*/
private Instant instant;
/**
* 有效期(单位)
*/
private long term;
/**
* 可以放一些不敏感的信息,以便下次访问时可以直接取出如果user属性太多可以另外写个类比如SimpleUser
* 存放一些经常需要用到的信息
*/
private UserP User;
/**
* 根据时间判断是否有效
* @return 有效则返回true否则返回false
*/
public boolean isValid(){
return Instant.now().getEpochSecond()-instant.getEpochSecond()<=term;
}
public UserToken(LoginType loginType, String principal, String credentials, Instant instant, long term, UserP user) {
this.loginType = loginType;
this.principal = principal;
this.credentials = credentials;
this.instant = instant;
this.term = term;
this.User = user;
}
public UserToken(LoginType loginType, String principal, String credentials, Instant instant, long term) {
this.loginType = loginType;
this.principal = principal;
this.credentials = credentials;
this.instant = instant;
this.term = term;
}
public UserToken(LoginType loginType, String principal, String credentials) {
this.loginType = loginType;
this.principal = principal;
this.credentials = credentials;
this.instant = Instant.now();
this.term=DEFAULT_TERM;
}
public UserToken(LoginType loginType, String principal) {
this.loginType = loginType;
this.principal = principal;
this.instant=Instant.now();
this.term=DEFAULT_TERM;
}
}

74
src/main/java/com/dreamchaser/depository_manage/security/bean/VerificationCode.java

@ -1,74 +0,0 @@
package com.dreamchaser.depository_manage.security.bean;
import lombok.Data;
import java.time.Instant;
import java.util.Random;
/**
* 验证码默认有效期为五分钟
* @author 金昊霖
*/
@Data
public class VerificationCode {
/**
* 默认持续时间
*/
private final long DEFAULT_TERM=60*5;
/**
* 验证码
*/
private String code;
/**
* 创建时刻
*/
private Instant instant;
/**
* 有效期
*/
private long term;
/**
* 根据时间判断是否有效
* @return boolean值
*/
public boolean isValid(){
return Instant.now().getEpochSecond()-instant.getEpochSecond()<=term;
}
public VerificationCode(Instant instant, long term) {
//生成随机验证码code
generateCode();
this.instant = instant;
this.term = term;
}
public VerificationCode(Instant instant) {
//生成随机验证码code
generateCode();
this.instant = instant;
this.term=DEFAULT_TERM;
}
public VerificationCode() {
//生成随机验证码code
generateCode();
this.instant=Instant.now();
this.term=DEFAULT_TERM;
}
private void generateCode(){
StringBuilder codeNum = new StringBuilder();
int [] numbers = {0,1,2,3,4,5,6,7,8,9};
Random random = new Random();
for (int i = 0; i < 5; i++) {
//目的是产生足够随机的数,避免产生的数字重复率高的问题
int next = random.nextInt(10000);
codeNum.append(numbers[next % 10]);
}
this.code= codeNum.toString();
}
}

1
src/main/java/com/dreamchaser/depository_manage/security/pool/AuthenticationTokenPool.java

@ -2,7 +2,6 @@ package com.dreamchaser.depository_manage.security.pool;
import com.dreamchaser.depository_manage.entity.UserByPort;
import com.dreamchaser.depository_manage.security.bean.UserToken;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;

4
src/main/java/com/dreamchaser/depository_manage/security/pool/HandlesOtherfunctionalThreadPool.java → src/main/java/com/dreamchaser/depository_manage/security/pool/HandlesOtherFunctionalThreadPool.java

@ -6,9 +6,9 @@ import java.util.concurrent.ThreadPoolExecutor;
import java.util.concurrent.TimeUnit;
/**
* 定义用于发送企业微信相关信息的线程池
* 定义用于处理其他需要开启线程功能的线程池
*/
public class HandlesOtherfunctionalThreadPool {
public class HandlesOtherFunctionalThreadPool {
public static ExecutorService exs = new ThreadPoolExecutor(20, 10, 100, TimeUnit.SECONDS, new LinkedBlockingQueue<>(10));
// 用于执行对应的方法

3
src/main/java/com/dreamchaser/depository_manage/security/pool/UserKeyAndTokenPool.java

@ -23,8 +23,7 @@ public class UserKeyAndTokenPool {
}
public static String getKeyAndToken(String key){
String keyAndToken = pool.get(key);
return keyAndToken;
return pool.get(key);
}
public static void removeKeyAndToken(String key){

54
src/main/java/com/dreamchaser/depository_manage/security/pool/VerificationCodePool.java

@ -1,54 +0,0 @@
package com.dreamchaser.depository_manage.security.pool;
import com.dreamchaser.depository_manage.security.bean.VerificationCode;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
/**
* 验证码等待池
* @author 金昊霖
*/
public class VerificationCodePool {
private static Map<String, VerificationCode> pool=new ConcurrentHashMap<>(10);
/**
* 增加一条验证码
* @param principal 主要内容如邮箱电话号码等
* @param verificationCode 验证码
*/
public static void addCode(String principal,VerificationCode verificationCode){
pool.put(principal, verificationCode);
}
/**
* 根据principal主要信息获取未过期的验证码如果没有未过期的令牌则返回null
* @param principal 主要内容如邮箱电话号码等
* @return verificationCode 未过期的验证码或者null
*/
public static VerificationCode getCode(String principal){
VerificationCode verificationCode=pool.get(principal);
//如果没有相应验证码则直接返回null
if (verificationCode==null){
return null;
}
//判断令牌是否过期
if (verificationCode.isValid()){
return verificationCode;
}else{
//清除过期验证码
pool.remove(principal);
return null;
}
}
/**
* 根据主要信息principal删除对应的验证码
* @param principal 主要信息
*/
public static void removeCode(String principal){
pool.remove(principal);
}
}

16
src/main/java/com/dreamchaser/depository_manage/service/impl/DepositoryRecordServiceImpl.java

@ -10,7 +10,7 @@ import com.dreamchaser.depository_manage.pojo.*;
import com.dreamchaser.depository_manage.pojo.callBackXml.approvalCallBackXml.ApprovalInfo_Details;
import com.dreamchaser.depository_manage.pojo.callBackXml.approvalCallBackXml.ApprovalInfo_Details_Approver;
import com.dreamchaser.depository_manage.pojo.callBackXml.callBackXml_button_templatecard.TemplateCard;
import com.dreamchaser.depository_manage.security.pool.HandlesOtherfunctionalThreadPool;
import com.dreamchaser.depository_manage.security.pool.HandlesOtherFunctionalThreadPool;
import com.dreamchaser.depository_manage.security.pool.RedisPool;
import com.dreamchaser.depository_manage.security.pool.SendQyWxMessageThreadPool;
import com.dreamchaser.depository_manage.service.DepositoryRecordService;
@ -290,7 +290,7 @@ public class DepositoryRecordServiceImpl implements DepositoryRecordService {
List<ApplicationOutRecordMin> applicationOutRecordMinByParent = depositoryRecordMapper.findApplicationOutRecordMinByParent(id);
// 开启一个线程去删除redis中的数据
HandlesOtherfunctionalThreadPool.execute(() -> {
HandlesOtherFunctionalThreadPool.execute(() -> {
// 获取该用户在redis中的订单记录
String key = "user:" + recordP.getApplicantId();
// 获取当前用户所有处理单
@ -318,7 +318,7 @@ public class DepositoryRecordServiceImpl implements DepositoryRecordService {
});
// 开启一个线程去删除子订单
HandlesOtherfunctionalThreadPool.execute(() -> depositoryRecordMapper.deleteApplicationOutRecordMinById(id));
HandlesOtherFunctionalThreadPool.execute(() -> depositoryRecordMapper.deleteApplicationOutRecordMinById(id));
return integer;
}
@ -332,7 +332,7 @@ public class DepositoryRecordServiceImpl implements DepositoryRecordService {
Integer integer = depositoryRecordMapper.deleteApplicationOutRecordByIds(list);
// 开启一个线程去删除redis中的数据
HandlesOtherfunctionalThreadPool.execute(() -> {
HandlesOtherFunctionalThreadPool.execute(() -> {
for (ApplicationOutRecord recordP : recordPList
) {
// 获取该用户在redis中的订单记录
@ -361,7 +361,7 @@ public class DepositoryRecordServiceImpl implements DepositoryRecordService {
});
// 开启一个线程用于删除
HandlesOtherfunctionalThreadPool.execute(() -> depositoryRecordMapper.deleteApplicationOutRecordMinByIds(list));
HandlesOtherFunctionalThreadPool.execute(() -> depositoryRecordMapper.deleteApplicationOutRecordMinByIds(list));
return integer;
}
@ -1099,7 +1099,7 @@ public class DepositoryRecordServiceImpl implements DepositoryRecordService {
updateApplicationMinOutInfo(id, applicationOutMinById, record, trueOut, userByPort, placeId, userAgent);
// 更新入库批次中的物料数量
HandlesOtherfunctionalThreadPool.execute(() -> {
HandlesOtherFunctionalThreadPool.execute(() -> {
// 获取出库物料id
Integer mid1 = inventory.getId();
// 获取当前物料对应的生产日期
@ -4664,7 +4664,7 @@ public class DepositoryRecordServiceImpl implements DepositoryRecordService {
@Override
public Integer deleteApplicationInRecordById(Integer id, UserByPort userToken, String userAgent) {
ApplicationInRecord record = depositoryRecordMapper.findApplicationInRecordPById(id);
HandlesOtherfunctionalThreadPool.execute(() -> {
HandlesOtherFunctionalThreadPool.execute(() -> {
if (Integer.compare(record.getAirapproverPass(), 4) == 0 || Integer.compare(record.getAirapproverPass(), 1) == 0) {
// 如果已经入库
updateInventoryForErrorInRecord(record.getMid(), record.getQuantity(), record.getAirUnit(), record.getPlaceId(), record.getDepositoryId());
@ -4682,7 +4682,7 @@ public class DepositoryRecordServiceImpl implements DepositoryRecordService {
@Override
public Integer deleteApplicationInRecordByIds(List<Integer> list, UserByPort userToken, String userAgent) {
List<ApplicationInRecord> applicationInRecordsByIds = depositoryRecordMapper.findApplicationInRecordsByIds(list);
HandlesOtherfunctionalThreadPool.execute(() -> {
HandlesOtherFunctionalThreadPool.execute(() -> {
for (ApplicationInRecord record : applicationInRecordsByIds
) {
if (Integer.compare(record.getAirapproverPass(), 4) == 0 || Integer.compare(record.getAirapproverPass(), 1) == 0) {

53
src/test/java/com/dreamchaser/depository_manage/OtherTest.java

@ -48,39 +48,37 @@ public class OtherTest {
@Autowired
RedisPool redisPool;
@Test
public void main() {
// UserByPort userByPort = LinkInterfaceUtil.FindUserById(6235, null);
// Map<String, String> stringObjectMap = objectToMap(userByPort);
// redisPool.getRedisTemplateByDb(5).opsForHash().putAll(PublicConfig.userInfoRedisPrefix+"300450",stringObjectMap);
// System.out.println(stringObjectMap);
String key = PublicConfig.userInfoRedisPrefix + "300450";
Iterator<Object> iterator = redisPool.getRedisTemplateByDb(5).opsForHash().keys(key).iterator();
Map<String,Object> map = new HashMap<>();
public UserByPort getLoginUserInformation(String userKey) {
// 拼接存储key
String userLoginkey = PublicConfig.LoginRedisPrefix + userKey;
// 获取当前登录用户的工号
String usernumber = (String) redisPool.getRedisTemplateByDb(5).opsForHash().get(userLoginkey, "usernumber");
String userInfoKey = PublicConfig.userInfoRedisPrefix+usernumber;
// 获取当前存储的所有key值
Iterator<Object> iterator = redisPool.getRedisTemplateByDb(5).opsForHash().keys(userInfoKey).iterator();
// 定义map
Map<String, Object> map = new HashMap<>();
// 遍历获取存储的redis中的值
while (iterator.hasNext()) {
Object next = iterator.next();
Object o = redisPool.getRedisTemplateByDb(5).opsForHash().get(key, next);
map.put((String) next,o);
Object o = redisPool.getRedisTemplateByDb(5).opsForHash().get(userInfoKey, next);
map.put((String) next, o);
}
UserByPort userByPort = JSONObject.parseObject(JSONObject.toJSONString(map), UserByPort.class);
System.out.println(userByPort);
return JSONObject.parseObject(JSONObject.toJSONString(map), UserByPort.class);
}
public static Map<String, String> objectToMap(Object object){
Map<String,String> dataMap = new HashMap<>();
public static Map<String, String> objectToMap(Object object) {
Map<String, String> dataMap = new HashMap<>();
Class<?> clazz = object.getClass();
for (Field field : clazz.getDeclaredFields()) {
try {
field.setAccessible(true);
Object o = field.get(object);
if(o != null){
if (o != null) {
dataMap.put(field.getName(), o.toString());
}else{
dataMap.put(field.getName(),"");
dataMap.put(field.getName(), o.toString());
} else {
dataMap.put(field.getName(), "");
}
} catch (IllegalAccessException e) {
@ -90,9 +88,16 @@ public class OtherTest {
return dataMap;
}
@Test
public void main() {
// UserByPort userByPort = LinkInterfaceUtil.FindUserById(6235, null);
// Map<String, String> stringObjectMap = objectToMap(userByPort);
// redisPool.getRedisTemplateByDb(5).opsForHash().putAll(PublicConfig.userInfoRedisPrefix+"300450",stringObjectMap);
// System.out.println(stringObjectMap);
UserByPort userByPort = getLoginUserInformation("e3bfa398fe9d0e1ab78a00ff59eff788");
System.out.println(userByPort);
}
}

Loading…
Cancel
Save