From 1e34b411566cce150bfba5f13c5d15ce589df0f7 Mon Sep 17 00:00:00 2001 From: houjishuang <46269784@qq.com> Date: Tue, 10 Jun 2025 11:35:38 +0800 Subject: [PATCH] =?UTF-8?q?=E7=99=BB=E9=99=86=E4=BB=A3=E7=A0=81=E8=BF=81?= =?UTF-8?q?=E7=A7=BB?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pom.xml | 6 + .../controller/FaceRecogController.java | 95 +++++ .../faceCompare/entity/AnnexAndStorageVO.java | 16 + .../faceCompare/entity/AnnexSysStorageVO.java | 71 ++++ .../faceCompare/entity/BizAssessRoom.java | 122 ++++++ .../ebtp/faceCompare/entity/CrypBean.java | 46 +++ .../faceCompare/entity/ExpeBaseInfoVO.java | 205 ++++++++++ .../faceCompare/entity/FaceCompareReq.java | 62 +++ .../entity/ResultOutSystemBaseInfo.java | 35 ++ .../mall/ebtp/faceCompare/entity/RgbReq.java | 17 + .../ebtp/faceCompare/entity/SysStorageVO.java | 80 ++++ .../faceCompare/entity/TockenRequestBody.java | 20 + .../faceCompare/feign/AssessjFeignClient.java | 28 ++ .../feign/CoreServiceDocumentFeignClient.java | 25 ++ .../faceCompare/feign/ExpertFeignClient.java | 32 ++ .../faceCompare/feign/ExtendFeignClient.java | 40 ++ .../faceCompare/feign/RsmsFeignClient.java | 24 ++ .../feign/SupplierbaseFeignClient.java | 25 ++ ...oreServiceDocumentFeignClientFallBack.java | 27 ++ .../fallBack/ExpertFeignClientFallback.java | 33 ++ .../fallBack/ExtendFeignClientFallback.java | 50 +++ .../fallBack/RsmsFeignFallbackFactory.java | 32 ++ .../faceCompare/service/FaceRecogService.java | 24 ++ .../service/impl/FaceRecogServiceImpl.java | 308 +++++++++++++++ .../mall/ebtp/faceCompare/util/BcecUtil.java | 295 ++++++++++++++ .../ebtp/faceCompare/util/GmBaseUtil.java | 23 ++ .../mall/ebtp/faceCompare/util/JSONUtil.java | 105 +++++ .../ebtp/faceCompare/util/QueryTokenUtil.java | 106 ++++++ .../ebtp/faceCompare/util/Sm2Encryptor.java | 84 ++++ .../mall/ebtp/faceCompare/util/Sm2Util.java | 359 ++++++++++++++++++ .../ebtp/login/common/CaptchaGenerator.java | 150 ++++++++ .../mall/ebtp/login/common/Constants.java | 186 +++++++++ .../mall/ebtp/login/common/MdConstants.java | 28 ++ .../mall/ebtp/login/common/RSA.java | 356 +++++++++++++++++ .../login/controller/EshopMenuController.java | 42 ++ .../login/controller/LoginController.java | 60 +++ .../mall/ebtp/login/dao/BaseUserMapper.java | 21 + .../ebtp/login/dao/BaseUserTokenMapper.java | 10 + .../mall/ebtp/login/dao/EshopMenuMapper.java | 15 + .../ebtp/login/dao/mapper/BaseUserMapper.xml | 153 ++++++++ .../login/dao/mapper/BaseUserTokenMapper.xml | 21 + .../ebtp/login/dao/mapper/EshopMenuMapper.xml | 59 +++ .../mall/ebtp/login/entity/BaseOrgn.java | 127 +++++++ .../mall/ebtp/login/entity/BaseOrgnR.java | 30 ++ .../mall/ebtp/login/entity/BaseRole.java | 47 +++ .../mall/ebtp/login/entity/BaseRoleOrgn.java | 36 ++ .../ebtp/login/entity/BaseRoleOrgnVo.java | 39 ++ .../mall/ebtp/login/entity/BaseSelf.java | 41 ++ .../mall/ebtp/login/entity/BaseTelIdcard.java | 49 +++ .../mall/ebtp/login/entity/BaseUser.java | 115 ++++++ .../ebtp/login/entity/BaseUserSelect.java | 41 ++ .../ebtp/login/entity/BaseUserSelectVo.java | 84 ++++ .../mall/ebtp/login/entity/BaseUserToken.java | 54 +++ .../ebtp/login/entity/BuffeedImageVo.java | 12 + .../ebtp/login/entity/EshopMenuConverter.java | 29 ++ .../entity/EshopMenuConverterChildren.java | 14 + .../mall/ebtp/login/entity/EshopMenuPO.java | 79 ++++ .../ebtp/login/entity/EshopMenuQuery.java | 61 +++ .../ebtp/login/service/BaseUserService.java | 28 ++ .../login/service/BaseUserTokenService.java | 17 + .../ebtp/login/service/EshopMenuService.java | 27 ++ .../service/impl/BaseUserServiceImpl.java | 307 +++++++++++++++ .../impl/BaseUserTokenServiceImpl.java | 45 +++ .../service/impl/EshopMenuServiceImpl.java | 41 ++ .../mall/ebtp/login/utils/HttpsUtils.java | 129 +++++++ .../mall/ebtp/login/vo/LoginUserVo.java | 14 + .../com/chinaunicom/mall/ebtp/test/RSA.java | 357 +++++++++++++++++ .../chinaunicom/mall/ebtp/test/RsaUtil.java | 132 +++++++ .../controller/AuthTokenController.java | 122 ++++++ .../controller/CheckTokenController.java | 43 +++ .../controller/ProviderForSerController.java | 205 ++++++++++ .../controller/UserInfoController.java | 239 ++++++++++++ .../controller/UserPasswordController.java | 31 ++ .../ebtp/userinfo/dao/BaseRoleMapper.java | 12 + .../ebtp/userinfo/dao/BaseUserMapper.java | 12 + .../ebtp/userinfo/dao/UserPasswordMapper.java | 13 + .../dao/mapper/UserPasswordMapper.xml | 16 + .../mall/ebtp/userinfo/entity/AuthCodeVo.java | 9 + .../userinfo/entity/AuthLogoutResponse.java | 38 ++ .../mall/ebtp/userinfo/entity/BaseCert.java | 39 ++ .../mall/ebtp/userinfo/entity/BaseRole.java | 47 +++ .../mall/ebtp/userinfo/entity/BaseUser.java | 64 ++++ .../ebtp/userinfo/entity/ExpertLoginUser.java | 64 ++++ .../userinfo/entity/ExpertUpdateUser.java | 43 +++ .../ebtp/userinfo/entity/SupplierUserVo.java | 48 +++ .../ebtp/userinfo/entity/UserPassword.java | 33 ++ .../mall/ebtp/userinfo/entity/vo/SsoVO.java | 32 ++ .../fallback/UnicomOAuthClientFallback.java | 15 + .../UnicomOAuthClientFallbackFactory.java | 18 + .../userinfo/service/AuthTokenService.java | 13 + .../userinfo/service/EbtpUserInfoService.java | 39 ++ .../service/IUserPasswordService.java | 15 + .../userinfo/service/UnicomOAuthClient.java | 19 + .../service/impl/AuthTokenServiceImpl.java | 43 +++ .../service/impl/EbtpUserInfoServiceImpl.java | 217 +++++++++++ .../service/impl/UserPasswordServiceImpl.java | 27 ++ .../ebtp/userinfo/utils/BaseCertService.java | 118 ++++++ .../mall/ebtp/userinfo/utils/HttpUtils.java | 139 +++++++ .../mall/ebtp/userinfo/utils/HttpsUtils.java | 135 +++++++ .../userinfo/utils/UserinfoConstants.java | 8 + .../zglt/controller/ExpertController.java | 75 ++++ .../ebtp/zglt/controller/ZgltController.java | 63 +++ .../mall/ebtp/zglt/utils/MdConstants.java | 28 ++ src/main/resources/application-master.yml | 88 +++++ 104 files changed, 7621 insertions(+) create mode 100644 src/main/java/com/chinaunicom/mall/ebtp/faceCompare/controller/FaceRecogController.java create mode 100644 src/main/java/com/chinaunicom/mall/ebtp/faceCompare/entity/AnnexAndStorageVO.java create mode 100644 src/main/java/com/chinaunicom/mall/ebtp/faceCompare/entity/AnnexSysStorageVO.java create mode 100644 src/main/java/com/chinaunicom/mall/ebtp/faceCompare/entity/BizAssessRoom.java create mode 100644 src/main/java/com/chinaunicom/mall/ebtp/faceCompare/entity/CrypBean.java create mode 100644 src/main/java/com/chinaunicom/mall/ebtp/faceCompare/entity/ExpeBaseInfoVO.java create mode 100644 src/main/java/com/chinaunicom/mall/ebtp/faceCompare/entity/FaceCompareReq.java create mode 100644 src/main/java/com/chinaunicom/mall/ebtp/faceCompare/entity/ResultOutSystemBaseInfo.java create mode 100644 src/main/java/com/chinaunicom/mall/ebtp/faceCompare/entity/RgbReq.java create mode 100644 src/main/java/com/chinaunicom/mall/ebtp/faceCompare/entity/SysStorageVO.java create mode 100644 src/main/java/com/chinaunicom/mall/ebtp/faceCompare/entity/TockenRequestBody.java create mode 100644 src/main/java/com/chinaunicom/mall/ebtp/faceCompare/feign/AssessjFeignClient.java create mode 100644 src/main/java/com/chinaunicom/mall/ebtp/faceCompare/feign/CoreServiceDocumentFeignClient.java create mode 100644 src/main/java/com/chinaunicom/mall/ebtp/faceCompare/feign/ExpertFeignClient.java create mode 100644 src/main/java/com/chinaunicom/mall/ebtp/faceCompare/feign/ExtendFeignClient.java create mode 100644 src/main/java/com/chinaunicom/mall/ebtp/faceCompare/feign/RsmsFeignClient.java create mode 100644 src/main/java/com/chinaunicom/mall/ebtp/faceCompare/feign/SupplierbaseFeignClient.java create mode 100644 src/main/java/com/chinaunicom/mall/ebtp/faceCompare/feign/fallBack/CoreServiceDocumentFeignClientFallBack.java create mode 100644 src/main/java/com/chinaunicom/mall/ebtp/faceCompare/feign/fallBack/ExpertFeignClientFallback.java create mode 100644 src/main/java/com/chinaunicom/mall/ebtp/faceCompare/feign/fallBack/ExtendFeignClientFallback.java create mode 100644 src/main/java/com/chinaunicom/mall/ebtp/faceCompare/feign/fallBack/RsmsFeignFallbackFactory.java create mode 100644 src/main/java/com/chinaunicom/mall/ebtp/faceCompare/service/FaceRecogService.java create mode 100644 src/main/java/com/chinaunicom/mall/ebtp/faceCompare/service/impl/FaceRecogServiceImpl.java create mode 100644 src/main/java/com/chinaunicom/mall/ebtp/faceCompare/util/BcecUtil.java create mode 100644 src/main/java/com/chinaunicom/mall/ebtp/faceCompare/util/GmBaseUtil.java create mode 100644 src/main/java/com/chinaunicom/mall/ebtp/faceCompare/util/JSONUtil.java create mode 100644 src/main/java/com/chinaunicom/mall/ebtp/faceCompare/util/QueryTokenUtil.java create mode 100644 src/main/java/com/chinaunicom/mall/ebtp/faceCompare/util/Sm2Encryptor.java create mode 100644 src/main/java/com/chinaunicom/mall/ebtp/faceCompare/util/Sm2Util.java create mode 100644 src/main/java/com/chinaunicom/mall/ebtp/login/common/CaptchaGenerator.java create mode 100644 src/main/java/com/chinaunicom/mall/ebtp/login/common/Constants.java create mode 100644 src/main/java/com/chinaunicom/mall/ebtp/login/common/MdConstants.java create mode 100644 src/main/java/com/chinaunicom/mall/ebtp/login/common/RSA.java create mode 100644 src/main/java/com/chinaunicom/mall/ebtp/login/controller/EshopMenuController.java create mode 100644 src/main/java/com/chinaunicom/mall/ebtp/login/controller/LoginController.java create mode 100644 src/main/java/com/chinaunicom/mall/ebtp/login/dao/BaseUserMapper.java create mode 100644 src/main/java/com/chinaunicom/mall/ebtp/login/dao/BaseUserTokenMapper.java create mode 100644 src/main/java/com/chinaunicom/mall/ebtp/login/dao/EshopMenuMapper.java create mode 100644 src/main/java/com/chinaunicom/mall/ebtp/login/dao/mapper/BaseUserMapper.xml create mode 100644 src/main/java/com/chinaunicom/mall/ebtp/login/dao/mapper/BaseUserTokenMapper.xml create mode 100644 src/main/java/com/chinaunicom/mall/ebtp/login/dao/mapper/EshopMenuMapper.xml create mode 100644 src/main/java/com/chinaunicom/mall/ebtp/login/entity/BaseOrgn.java create mode 100644 src/main/java/com/chinaunicom/mall/ebtp/login/entity/BaseOrgnR.java create mode 100644 src/main/java/com/chinaunicom/mall/ebtp/login/entity/BaseRole.java create mode 100644 src/main/java/com/chinaunicom/mall/ebtp/login/entity/BaseRoleOrgn.java create mode 100644 src/main/java/com/chinaunicom/mall/ebtp/login/entity/BaseRoleOrgnVo.java create mode 100644 src/main/java/com/chinaunicom/mall/ebtp/login/entity/BaseSelf.java create mode 100644 src/main/java/com/chinaunicom/mall/ebtp/login/entity/BaseTelIdcard.java create mode 100644 src/main/java/com/chinaunicom/mall/ebtp/login/entity/BaseUser.java create mode 100644 src/main/java/com/chinaunicom/mall/ebtp/login/entity/BaseUserSelect.java create mode 100644 src/main/java/com/chinaunicom/mall/ebtp/login/entity/BaseUserSelectVo.java create mode 100644 src/main/java/com/chinaunicom/mall/ebtp/login/entity/BaseUserToken.java create mode 100644 src/main/java/com/chinaunicom/mall/ebtp/login/entity/BuffeedImageVo.java create mode 100644 src/main/java/com/chinaunicom/mall/ebtp/login/entity/EshopMenuConverter.java create mode 100644 src/main/java/com/chinaunicom/mall/ebtp/login/entity/EshopMenuConverterChildren.java create mode 100644 src/main/java/com/chinaunicom/mall/ebtp/login/entity/EshopMenuPO.java create mode 100644 src/main/java/com/chinaunicom/mall/ebtp/login/entity/EshopMenuQuery.java create mode 100644 src/main/java/com/chinaunicom/mall/ebtp/login/service/BaseUserService.java create mode 100644 src/main/java/com/chinaunicom/mall/ebtp/login/service/BaseUserTokenService.java create mode 100644 src/main/java/com/chinaunicom/mall/ebtp/login/service/EshopMenuService.java create mode 100644 src/main/java/com/chinaunicom/mall/ebtp/login/service/impl/BaseUserServiceImpl.java create mode 100644 src/main/java/com/chinaunicom/mall/ebtp/login/service/impl/BaseUserTokenServiceImpl.java create mode 100644 src/main/java/com/chinaunicom/mall/ebtp/login/service/impl/EshopMenuServiceImpl.java create mode 100644 src/main/java/com/chinaunicom/mall/ebtp/login/utils/HttpsUtils.java create mode 100644 src/main/java/com/chinaunicom/mall/ebtp/login/vo/LoginUserVo.java create mode 100644 src/main/java/com/chinaunicom/mall/ebtp/test/RSA.java create mode 100644 src/main/java/com/chinaunicom/mall/ebtp/test/RsaUtil.java create mode 100644 src/main/java/com/chinaunicom/mall/ebtp/userinfo/controller/AuthTokenController.java create mode 100644 src/main/java/com/chinaunicom/mall/ebtp/userinfo/controller/CheckTokenController.java create mode 100644 src/main/java/com/chinaunicom/mall/ebtp/userinfo/controller/ProviderForSerController.java create mode 100644 src/main/java/com/chinaunicom/mall/ebtp/userinfo/controller/UserInfoController.java create mode 100644 src/main/java/com/chinaunicom/mall/ebtp/userinfo/controller/UserPasswordController.java create mode 100644 src/main/java/com/chinaunicom/mall/ebtp/userinfo/dao/BaseRoleMapper.java create mode 100644 src/main/java/com/chinaunicom/mall/ebtp/userinfo/dao/BaseUserMapper.java create mode 100644 src/main/java/com/chinaunicom/mall/ebtp/userinfo/dao/UserPasswordMapper.java create mode 100644 src/main/java/com/chinaunicom/mall/ebtp/userinfo/dao/mapper/UserPasswordMapper.xml create mode 100644 src/main/java/com/chinaunicom/mall/ebtp/userinfo/entity/AuthCodeVo.java create mode 100644 src/main/java/com/chinaunicom/mall/ebtp/userinfo/entity/AuthLogoutResponse.java create mode 100644 src/main/java/com/chinaunicom/mall/ebtp/userinfo/entity/BaseCert.java create mode 100644 src/main/java/com/chinaunicom/mall/ebtp/userinfo/entity/BaseRole.java create mode 100644 src/main/java/com/chinaunicom/mall/ebtp/userinfo/entity/BaseUser.java create mode 100644 src/main/java/com/chinaunicom/mall/ebtp/userinfo/entity/ExpertLoginUser.java create mode 100644 src/main/java/com/chinaunicom/mall/ebtp/userinfo/entity/ExpertUpdateUser.java create mode 100644 src/main/java/com/chinaunicom/mall/ebtp/userinfo/entity/SupplierUserVo.java create mode 100644 src/main/java/com/chinaunicom/mall/ebtp/userinfo/entity/UserPassword.java create mode 100644 src/main/java/com/chinaunicom/mall/ebtp/userinfo/entity/vo/SsoVO.java create mode 100644 src/main/java/com/chinaunicom/mall/ebtp/userinfo/fallback/UnicomOAuthClientFallback.java create mode 100644 src/main/java/com/chinaunicom/mall/ebtp/userinfo/fallback/UnicomOAuthClientFallbackFactory.java create mode 100644 src/main/java/com/chinaunicom/mall/ebtp/userinfo/service/AuthTokenService.java create mode 100644 src/main/java/com/chinaunicom/mall/ebtp/userinfo/service/EbtpUserInfoService.java create mode 100644 src/main/java/com/chinaunicom/mall/ebtp/userinfo/service/IUserPasswordService.java create mode 100644 src/main/java/com/chinaunicom/mall/ebtp/userinfo/service/UnicomOAuthClient.java create mode 100644 src/main/java/com/chinaunicom/mall/ebtp/userinfo/service/impl/AuthTokenServiceImpl.java create mode 100644 src/main/java/com/chinaunicom/mall/ebtp/userinfo/service/impl/EbtpUserInfoServiceImpl.java create mode 100644 src/main/java/com/chinaunicom/mall/ebtp/userinfo/service/impl/UserPasswordServiceImpl.java create mode 100644 src/main/java/com/chinaunicom/mall/ebtp/userinfo/utils/BaseCertService.java create mode 100644 src/main/java/com/chinaunicom/mall/ebtp/userinfo/utils/HttpUtils.java create mode 100644 src/main/java/com/chinaunicom/mall/ebtp/userinfo/utils/HttpsUtils.java create mode 100644 src/main/java/com/chinaunicom/mall/ebtp/userinfo/utils/UserinfoConstants.java create mode 100644 src/main/java/com/chinaunicom/mall/ebtp/zglt/controller/ExpertController.java create mode 100644 src/main/java/com/chinaunicom/mall/ebtp/zglt/controller/ZgltController.java create mode 100644 src/main/java/com/chinaunicom/mall/ebtp/zglt/utils/MdConstants.java diff --git a/pom.xml b/pom.xml index 9d0b94a..c0084f2 100644 --- a/pom.xml +++ b/pom.xml @@ -20,6 +20,12 @@ uboot-core 2.4.1-zyhy-SNAPSHOT + + net.sf.json-lib + json-lib + 2.4 + jdk15 + diff --git a/src/main/java/com/chinaunicom/mall/ebtp/faceCompare/controller/FaceRecogController.java b/src/main/java/com/chinaunicom/mall/ebtp/faceCompare/controller/FaceRecogController.java new file mode 100644 index 0000000..8628928 --- /dev/null +++ b/src/main/java/com/chinaunicom/mall/ebtp/faceCompare/controller/FaceRecogController.java @@ -0,0 +1,95 @@ +package com.chinaunicom.mall.ebtp.faceCompare.controller; + + +import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.JSONObject; +import com.chinaunicom.mall.ebtp.common.base.entity.BaseResponse; +import com.chinaunicom.mall.ebtp.faceCompare.entity.RgbReq; +import com.chinaunicom.mall.ebtp.faceCompare.service.FaceRecogService; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.*; +import org.springframework.web.multipart.MultipartFile; + +import javax.imageio.ImageIO; +import javax.servlet.http.HttpServletRequest; +import java.awt.image.BufferedImage; +import java.io.BufferedReader; +import java.io.ByteArrayOutputStream; +import java.io.IOException; +import java.util.Base64; + +/** + * 系统登当时人脸比对管理 + * + * @author: xudk + * @date: 2022/2/21 14:50 + * @version: V1.0 + */ +@Slf4j +@RestController +@Api(tags = "人脸比对管理") +@RequestMapping("/outer/v1/ebtp/face") +public class FaceRecogController {//extends BaseController + + @Autowired + private FaceRecogService faceRecogService; + + + @ApiOperation(value = "人脸比对方法", notes = "人脸比对方法") + @CrossOrigin + @PostMapping(value = "/faceCompare") + public BaseResponse faceCompare(@RequestPart("multipartFiles") MultipartFile file, @RequestParam String idNo) {//MultipartFile... + if (null == file || file.isEmpty()) { + return BaseResponse.fail("相片不能为空!","相片不能为空!"); + } + //String suffix = file.getOriginalFilename().substring(file.getOriginalFilename().lastIndexOf(".")); + BaseResponse result = faceRecogService.faceCompare(file,idNo); + return result; + } + + @CrossOrigin + @PostMapping(value = "/rgbArray2Base64") + public BaseResponse RgbArray2Base64(HttpServletRequest request) throws IOException { + // 使用字符流进行数据读取,request.getParameter 无法直接获取到数据 + BufferedReader reader = request.getReader(); + String data = reader.readLine(); + JSONObject jsonObject = JSON.parseObject(data); + return BaseResponse.success(rgb2Base64(jsonObject, 320, 240)); + } +/* + @ApiOperation(value = "人脸比对成功后获取tocken", notes = "人脸比对成功后获取tocken") + @CrossOrigin + @PostMapping(value = "/getTocken") + public BaseResponse getTocken(@RequestBody TockenRequestBody requestBody) {//MultipartFile... + if (StringUtil.isNullOrEmpty(requestBody.getIdCardNo())) { + return BaseResponse.fail("登录账号不能为空!", "登录账号不能为空!"); + } + BaseResponse tocken = faceRecogService.getTocken(requestBody); + return tocken; + }*/ + + + + public static String rgb2Base64(JSONObject params, int w, int h) throws IOException { + String image = JSONObject.toJavaObject(params, RgbReq.class).rgb; + BufferedImage bf = new BufferedImage(w, h, BufferedImage.TYPE_INT_RGB); + String[] rows = image.split("\\|"); + for (int i = 0; i < rows.length; i++) { + String[] col = rows[i].split(";"); + for (int j = 0; j < col.length; j++) { + int data = Integer.parseInt(col[j], 10); + bf.setRGB(j, i, data); + } + } + ByteArrayOutputStream baos = new ByteArrayOutputStream();// 字节流 + ImageIO.write(bf, "jpg", baos); + byte[] bytes= baos.toByteArray(); + // 编码成base64 + Base64.Encoder encoder = Base64.getEncoder(); + String jpg_base64 = encoder.encodeToString(bytes); + return jpg_base64; + } +} diff --git a/src/main/java/com/chinaunicom/mall/ebtp/faceCompare/entity/AnnexAndStorageVO.java b/src/main/java/com/chinaunicom/mall/ebtp/faceCompare/entity/AnnexAndStorageVO.java new file mode 100644 index 0000000..0bbd813 --- /dev/null +++ b/src/main/java/com/chinaunicom/mall/ebtp/faceCompare/entity/AnnexAndStorageVO.java @@ -0,0 +1,16 @@ +package com.chinaunicom.mall.ebtp.faceCompare.entity; + +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; + +import java.util.List; + +//封装AnnexSysStorageVO和SysStorageVO返回出去 +@Data +@EqualsAndHashCode(callSuper = false) +@Accessors(chain = true) +public class AnnexAndStorageVO { + private SysStorageVO sysStorageVO; + private List annexSysStorageVOList; +} diff --git a/src/main/java/com/chinaunicom/mall/ebtp/faceCompare/entity/AnnexSysStorageVO.java b/src/main/java/com/chinaunicom/mall/ebtp/faceCompare/entity/AnnexSysStorageVO.java new file mode 100644 index 0000000..81304e4 --- /dev/null +++ b/src/main/java/com/chinaunicom/mall/ebtp/faceCompare/entity/AnnexSysStorageVO.java @@ -0,0 +1,71 @@ +package com.chinaunicom.mall.ebtp.faceCompare.entity; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; + +import java.io.Serializable; + +/** + * @file cn.chinaunicom.sdsi.files.vo.FileVO + * @description 文件视图对象 + * @author: sunq + * @date: 2020/12/22 + * @version: V1.0 + * @update [序号][日期YYYY-MM-DD] [更改人姓名][变更描述] + */ +@Data +@EqualsAndHashCode(callSuper = false) +@Accessors(chain = true) +//@ApiModel(value = "文件管理视图", description = "展现时使用") +public class AnnexSysStorageVO implements Serializable { + + private static final long serialVersionUID = 2L; + + @ApiModelProperty(value = "配置ID") + private String id; + + @ApiModelProperty(value = "原图主键") + private String storageId; + + @ApiModelProperty(value = "业务标识") + private String appCode; + + @ApiModelProperty(value = "文件原始名") + private String originalName; + + @ApiModelProperty(value = "服务器上存储文件名") + private String fileName; + + @ApiModelProperty(value = "业务数据主键") + private String objectId; + + @ApiModelProperty(value = "附件大小") + private Long fileSize; + + @ApiModelProperty(value = "文件下载地址") + private String filePath; + + @ApiModelProperty(value = "文件流") + private byte[] fileStream; + + @ApiModelProperty(value = "规格大小") + private String annex; + + + @ApiModelProperty(value = "逻辑删除,normal表示正常,deleted表示删除") + private String deleteFlag; + + @ApiModelProperty(value = "业务拓展参数") + private String objectParam; + + @ApiModelProperty(value = "业务类型") + private String objectType; + + @ApiModelProperty(value = "2.0附件全路径") + //@TableField(value = "logo_file_path") + private String logoFilePath; + + +} diff --git a/src/main/java/com/chinaunicom/mall/ebtp/faceCompare/entity/BizAssessRoom.java b/src/main/java/com/chinaunicom/mall/ebtp/faceCompare/entity/BizAssessRoom.java new file mode 100644 index 0000000..2634c17 --- /dev/null +++ b/src/main/java/com/chinaunicom/mall/ebtp/faceCompare/entity/BizAssessRoom.java @@ -0,0 +1,122 @@ +package com.chinaunicom.mall.ebtp.faceCompare.entity; + +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableName; +import com.chinaunicom.mall.ebtp.common.base.entity.BaseEntity; +import com.chinaunicom.mall.ebtp.common.config.CustomLocalDateTimeTypeHandler; +import com.fasterxml.jackson.annotation.JsonFormat; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.experimental.Accessors; +import org.springframework.format.annotation.DateTimeFormat; + +import java.io.Serializable; +import java.time.LocalDateTime; + +/** + * 实体类 BizAssessRoom + * + * @auto.generated + */ +@Data +@Accessors(chain = true) +@ApiModel("实体类") +@TableName(autoResultMap = true) +public class BizAssessRoom extends BaseEntity implements Serializable { + + private static final long serialVersionUID = 1L; + + /** + * 主键 + */ + @ApiModelProperty(value = "主键") + private String id; + + /** + * 项目id + */ + @ApiModelProperty(value = "项目id") + private String tpId; + + /** + * 标包id + */ + @ApiModelProperty(value = "标包id") + private String sectionId; + + /** + * 评审室名称 + */ + @ApiModelProperty(value = "评审室名称") + private String roomName; + + /** + * 验证码 + */ + @ApiModelProperty(value = "验证码") + private Integer verificationCode; + + /** + * 评审室类型 + */ + @ApiModelProperty(value = "评审室类型") + private Integer roomType; + + /** + * 评审室排序 + */ + @ApiModelProperty(value = "评审室排序") + private Integer roomSort; + + /** + * 重新评审标识:0-正常评审(默认),1-重新评审 + */ + @ApiModelProperty(value = "重新评审标识:0-正常评审(默认),1-重新评审") + private Integer reviewMark; + + /** + * 重新评审排序 + */ + @ApiModelProperty(value = "重新评审排序") + private Integer reviewSort; + + /** + * 状态 + */ + @ApiModelProperty(value = "状态") + private Integer status; + + /** + * 开始评审时间 + */ + @ApiModelProperty(value = "开始评审时间") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss") + @TableField(typeHandler = CustomLocalDateTimeTypeHandler.class) + private LocalDateTime openTime; + + /** + * 评审地点 + */ + @ApiModelProperty(value = "评审地点") + private String openAddress; + + /** + * 关闭评审室原因 + */ + @ApiModelProperty(value = "关闭评审室原因") + private String closeReson; + + /** + * 本轮次评审应答截止时间 + */ + @ApiModelProperty(value = "本轮次评审应答截止时间") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss") + @TableField(typeHandler = CustomLocalDateTimeTypeHandler.class) + private LocalDateTime responseEndTime; + + + +} diff --git a/src/main/java/com/chinaunicom/mall/ebtp/faceCompare/entity/CrypBean.java b/src/main/java/com/chinaunicom/mall/ebtp/faceCompare/entity/CrypBean.java new file mode 100644 index 0000000..a322046 --- /dev/null +++ b/src/main/java/com/chinaunicom/mall/ebtp/faceCompare/entity/CrypBean.java @@ -0,0 +1,46 @@ +package com.chinaunicom.mall.ebtp.faceCompare.entity; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import org.springframework.beans.factory.annotation.Value; + +/** +* 实体类 CrypConfigure-区块链参数配置表 +* +* @author yss +*/ +@Data +public class CrypBean { + /** + * 能力req名称 + * BIDDING_PUBLISH_REQ 发标 + */ + @ApiModelProperty(value = "能力req名称") + @Value("BIDDING_PUBLISH_REQ") + public String reqName; + /** + * 签名 + */ + @ApiModelProperty(value = "签名") + public String sign; + /** + * 待签名参数 Map + */ + @ApiModelProperty(value = "待签名参数") + public Object object; + /** + * 天擎接口地址 + */ + @ApiModelProperty(value = "天擎接口地址") + public String url; + /** + * clientId + */ + @ApiModelProperty(value = "clientId") + public String clientId; + /** + * 中信支付使用operationCode + */ + @ApiModelProperty(value = "operationCode") + public String operationCode; +} diff --git a/src/main/java/com/chinaunicom/mall/ebtp/faceCompare/entity/ExpeBaseInfoVO.java b/src/main/java/com/chinaunicom/mall/ebtp/faceCompare/entity/ExpeBaseInfoVO.java new file mode 100644 index 0000000..c24fd4e --- /dev/null +++ b/src/main/java/com/chinaunicom/mall/ebtp/faceCompare/entity/ExpeBaseInfoVO.java @@ -0,0 +1,205 @@ +/* + * Copyright (c) 2020, SDCNCSI. All rights reserved. + */ +package com.chinaunicom.mall.ebtp.faceCompare.entity; + + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.experimental.Accessors; + +import java.time.LocalDateTime; + +/** + *

+ * 专家专业类别表 + *

+ * + * @author dusn + * @date 2020-12-01 + * @version: V1.0 + * @update [序号][日期YYYY-MM-DD] [更改人姓名][变更描述] + */ +@Data +@Accessors(chain = true) +@ApiModel(value="ExpeBaseInfoPO对象", description="专家专业类别表") +public class ExpeBaseInfoVO { + + + @ApiModelProperty(value = "专家ID") + //@JsonAdapter(LongAdapter.class) + private Long id; + + @ApiModelProperty(value = "专家姓名") + private String name; + + @ApiModelProperty(value = "专家密码") + private String password; + + @ApiModelProperty(value = "证件类型") + private String cardType; + + @ApiModelProperty(value = "专家身份证号") + private String identityCard; + + @ApiModelProperty(value = "性别") + private String sex; + + @ApiModelProperty(value = "手机号码") + private String tel; + + @ApiModelProperty(value = "电子邮箱") + private String email; + + @ApiModelProperty(value = "籍贯") + private String nativePlace; + + @ApiModelProperty(value = "出生日期") + //@JsonAdapter(DateTimeAdapter.class) + private LocalDateTime birthday; + + @ApiModelProperty(value = "民族") + private String nation; + + @ApiModelProperty(value = "专家类别") + private String expeType; + + @ApiModelProperty(value = "工作单位") + private String companyName; + + @ApiModelProperty(value = "工作单位OU") + private String companyOu; + + @ApiModelProperty(value = "部门") + private String departmentName; + + @ApiModelProperty(value = "部门OU") + private String departmentOu; + + @ApiModelProperty(value = "职务") + private String position; + + @ApiModelProperty(value = "职称") + private String title; + + @ApiModelProperty(value = "是否退休") + private String idRetire; + + @ApiModelProperty(value = "专家标识") + private String expeFlag; + + @ApiModelProperty(value = "专家状态") + private String expeStatus; + + @ApiModelProperty(value = "职称级别") + private String titleLevel; + + @ApiModelProperty(value = "住址") + private String address; + + @ApiModelProperty(value = "学历") + private String education; + + @ApiModelProperty(value = "毕业院校") + private String university; + + @ApiModelProperty(value = "所学专业") + private String major; + + @ApiModelProperty(value = "银行名称") + private String bankName; + + @ApiModelProperty(value = "银行卡号") + private String bankCardNumber; + + @ApiModelProperty(value = "专业特长") + private String specialty; + + @ApiModelProperty(value = "评标区域") + private String bidPlace; + + @ApiModelProperty(value = "资格证书名称") + private String certificateName; + + @ApiModelProperty(value = "颁发机构") + private String issuingAuthority; + + @ApiModelProperty(value = "是否评审专家") + private String isAuditExpe; + + @ApiModelProperty(value = "所属专家库主键") + //@JsonAdapter(LongAdapter.class) + private Long libraryId; + + @ApiModelProperty(value = "所属专家库名称") + private String libraryName; + + @ApiModelProperty(value = "所属专家库编号") + private String libraryNo; + + @ApiModelProperty(value = "证书编号") + private String certificateNo; + + @ApiModelProperty(value = "取得时间") + //@JsonAdapter(DateTimeAdapter.class) + private LocalDateTime certificateDate; + + @ApiModelProperty(value = "有效期") + private String effective; + + @ApiModelProperty(value = "最后更新时间戳") + //@JsonAdapter(DateTimeAdapter.class) + private LocalDateTime lastUpdateTime; + + @ApiModelProperty(value = "备用字段1") + private String attribute1; + + @ApiModelProperty(value = "备用字段2") + private String attribute2; + + @ApiModelProperty(value = "备用字段3") + private String attribute3; + + @ApiModelProperty(value = "备用字段4") + private String attribute4; + + @ApiModelProperty(value = "备用字段5") + private String attribute5; + + @ApiModelProperty(value = "文档中心照片id") + //@JsonAdapter(LongAdapter.class) + private Long expertPhotoId; + + @ApiModelProperty(value = "照片名称") + private String expertPhotoName; + + @ApiModelProperty(value = "专业列表") + private String profs; + + +// @ApiModelProperty(value = "专业列表") +// private List expeProfTypeVoList; +// +// public List getExpeProfTypeVoList() { +// return expeProfTypeVoList; +// } + + @ApiModelProperty(value = "员工编号") + private String expeNo; + +// private List drawProcessRecordPOList; +// +// private List baseFileNoPageVOList; +// +// public List getBaseFileNoPageVOList() { +// return baseFileNoPageVOList; +// } + +// public void setBaseFileNoPageVOList(List baseFileNoPageVOList) { +// this.baseFileNoPageVOList = baseFileNoPageVOList; +// } + + + +} diff --git a/src/main/java/com/chinaunicom/mall/ebtp/faceCompare/entity/FaceCompareReq.java b/src/main/java/com/chinaunicom/mall/ebtp/faceCompare/entity/FaceCompareReq.java new file mode 100644 index 0000000..e8bdbc7 --- /dev/null +++ b/src/main/java/com/chinaunicom/mall/ebtp/faceCompare/entity/FaceCompareReq.java @@ -0,0 +1,62 @@ +package com.chinaunicom.mall.ebtp.faceCompare.entity; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +/** +* 实体类 CrypConfigure-区块链参数配置表 +* +* @author yss +*/ +@Data +public class FaceCompareReq { + /** + * 能力req名称 + * BIDDING_PUBLISH_REQ 发标 + * "FACE_COMPARE_REQ\":缺少必填元素([\"COMPARE_TRANS_ID\",\"EPARCHY_CODE\",\"PROVINCE_CODE\",\"SCENE\",\"SYSTEM\",\"SYS_CODE\"])\n"}} + */ + @ApiModelProperty(value = "能力req名称") + //public String sysCode; + public String SYS_CODE; + + @ApiModelProperty(value = "能力req名称") + //public String sysCode; + public String SCENE; + /** + * 签名 + */ + @ApiModelProperty(value = "签名") + //public String provinceCode; + public String PROVINCE_CODE; + /** + * 待签名参数 Map + */ + /* @ApiModelProperty(value = "待签名参数") + public Object object;*/ + /** + * 天擎接口地址 + */ + @ApiModelProperty(value = "天擎接口地址") + //public String eparchyCode; + public String EPARCHY_CODE; + /** + * clientId + */ + @ApiModelProperty(value = "clientId") + //public String compareTransId; + public String COMPARE_TRANS_ID; + /** + * 中信支付使用operationCode + */ + @ApiModelProperty(value = "operationCode") + //public String system; + public String SYSTEM; + + @ApiModelProperty(value = "operationCode") + public String FACEIMG; + + + @ApiModelProperty(value = "operationCode") + public String BASEIMG; + +} diff --git a/src/main/java/com/chinaunicom/mall/ebtp/faceCompare/entity/ResultOutSystemBaseInfo.java b/src/main/java/com/chinaunicom/mall/ebtp/faceCompare/entity/ResultOutSystemBaseInfo.java new file mode 100644 index 0000000..d3bc7b6 --- /dev/null +++ b/src/main/java/com/chinaunicom/mall/ebtp/faceCompare/entity/ResultOutSystemBaseInfo.java @@ -0,0 +1,35 @@ +package com.chinaunicom.mall.ebtp.faceCompare.entity; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +/** + * 2 * @Author: xyy + * 3 * @Date: 2022/8/17 14:37 + * 4 + */ +@Data +public class ResultOutSystemBaseInfo { + + + @ApiModelProperty(value = "专家ID") + // @JsonAdapter(LongAdapter.class) + private Long id; + + @ApiModelProperty(value = "专家姓名") + private String name; + + @ApiModelProperty(value = "性别") + private String sex; + + @ApiModelProperty(value = "工作单位") + private String companyName; + + @ApiModelProperty(value = "工作单位OU") + private String companyOu; + + @ApiModelProperty(value = "文档中心照片id") + //@JsonAdapter(LongAdapter.class) + private Long expertPhotoId; + +} diff --git a/src/main/java/com/chinaunicom/mall/ebtp/faceCompare/entity/RgbReq.java b/src/main/java/com/chinaunicom/mall/ebtp/faceCompare/entity/RgbReq.java new file mode 100644 index 0000000..2a3fd90 --- /dev/null +++ b/src/main/java/com/chinaunicom/mall/ebtp/faceCompare/entity/RgbReq.java @@ -0,0 +1,17 @@ +package com.chinaunicom.mall.ebtp.faceCompare.entity; + + +import io.swagger.annotations.ApiModelProperty; + +public class RgbReq { + /** + * 类型 + */ + @ApiModelProperty(value = "类型") + public String type; + /** + * rgb + */ + @ApiModelProperty(value = "rgb") + public String rgb; +} diff --git a/src/main/java/com/chinaunicom/mall/ebtp/faceCompare/entity/SysStorageVO.java b/src/main/java/com/chinaunicom/mall/ebtp/faceCompare/entity/SysStorageVO.java new file mode 100644 index 0000000..20afb1d --- /dev/null +++ b/src/main/java/com/chinaunicom/mall/ebtp/faceCompare/entity/SysStorageVO.java @@ -0,0 +1,80 @@ +package com.chinaunicom.mall.ebtp.faceCompare.entity; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.NoArgsConstructor; +import lombok.experimental.Accessors; + +import java.io.Serializable; + +/** + * @file cn.chinaunicom.sdsi.files.vo.FileVO + * @description 文件视图对象 + * @author: sunq + * @date: 2019/11/11 + * @version: V1.0 + * @update [序号][日期YYYY-MM-DD] [更改人姓名][变更描述] + */ +@Data +@EqualsAndHashCode(callSuper = false) +@Accessors(chain = true) +@ApiModel(value = "文件管理视图", description = "展现时使用") +@NoArgsConstructor +@AllArgsConstructor +public class SysStorageVO implements Serializable { + + private static final long serialVersionUID = 2L; + + @ApiModelProperty(value = "配置ID") + private String fileId; + + @ApiModelProperty(value = "业务标识") + private String appCode; + + @ApiModelProperty(value = "文件原始名") + private String originalName; + + @ApiModelProperty(value = "服务器上存储文件名") + //@TableField("file_name") + private String fileName; + + @ApiModelProperty(value = "附件大小") + //@TableField("file_size") + private Long fileSize; + + @ApiModelProperty(value = "文件流") + private byte[] fileStream; + + @ApiModelProperty(value = "业务数据主键") + private String objectId; + + @ApiModelProperty(value = "业务表表名称") + private String objectTable; + + @ApiModelProperty(value = "物理删除,0表示正常") + private Integer onDisk; + + @ApiModelProperty(value = "文件下载地址") + private String filePath; + + @ApiModelProperty(value = "是否存在规格附件 0表示不存在,1表示存在") + private Integer annex; + //@TableField("delete_flag") + @ApiModelProperty(value = "逻辑删除,normal表示正常,deleted表示删除") + private String deleteFlag; + + @ApiModelProperty(value = "业务拓展参数") + private String objectParam; + + @ApiModelProperty(value = "业务类型") + private String objectType; + + @ApiModelProperty(value = "2.0附件全路径") + // @TableField(value = "logo_file_path") + private String logoFilePath; + + +} diff --git a/src/main/java/com/chinaunicom/mall/ebtp/faceCompare/entity/TockenRequestBody.java b/src/main/java/com/chinaunicom/mall/ebtp/faceCompare/entity/TockenRequestBody.java new file mode 100644 index 0000000..90649ef --- /dev/null +++ b/src/main/java/com/chinaunicom/mall/ebtp/faceCompare/entity/TockenRequestBody.java @@ -0,0 +1,20 @@ +package com.chinaunicom.mall.ebtp.faceCompare.entity; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +/** +* 实体类 +* +* @author yss +*/ +@Data +public class TockenRequestBody { + + /** + * 签名 + */ + @ApiModelProperty(value = "身份证号") + public String idCardNo; + +} diff --git a/src/main/java/com/chinaunicom/mall/ebtp/faceCompare/feign/AssessjFeignClient.java b/src/main/java/com/chinaunicom/mall/ebtp/faceCompare/feign/AssessjFeignClient.java new file mode 100644 index 0000000..169656a --- /dev/null +++ b/src/main/java/com/chinaunicom/mall/ebtp/faceCompare/feign/AssessjFeignClient.java @@ -0,0 +1,28 @@ +package com.chinaunicom.mall.ebtp.faceCompare.feign; + +import com.chinaunicom.mall.ebtp.common.base.entity.BaseResponse; +import com.chinaunicom.mall.ebtp.faceCompare.entity.BizAssessRoom; +import io.swagger.annotations.ApiOperation; +import io.swagger.annotations.ApiParam; +import org.springframework.cloud.openfeign.FeignClient; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestParam; + +import java.util.List; + +@FeignClient(value = "${mconfig.feign.name.assess}") +public interface AssessjFeignClient { + /** + * 通过主键ID查询评审室信息 + * + * @param ids + * + * @return + */ + @ApiOperation("通过主键ID查询评审室信息") + @GetMapping("/v1/bizassessroom/list") + public BaseResponse> getByIds(@ApiParam(value = "主键id", required = true) @RequestParam(name = "ids") List ids); + +} diff --git a/src/main/java/com/chinaunicom/mall/ebtp/faceCompare/feign/CoreServiceDocumentFeignClient.java b/src/main/java/com/chinaunicom/mall/ebtp/faceCompare/feign/CoreServiceDocumentFeignClient.java new file mode 100644 index 0000000..5054fd9 --- /dev/null +++ b/src/main/java/com/chinaunicom/mall/ebtp/faceCompare/feign/CoreServiceDocumentFeignClient.java @@ -0,0 +1,25 @@ +package com.chinaunicom.mall.ebtp.faceCompare.feign; + + +import com.chinaunicom.mall.ebtp.common.base.entity.BaseResponse; +import com.chinaunicom.mall.ebtp.faceCompare.feign.fallBack.CoreServiceDocumentFeignClientFallBack; +import com.chinaunicom.mall.ebtp.faceCompare.entity.AnnexAndStorageVO; +import org.springframework.cloud.openfeign.FeignClient; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestParam; + +/** + * 内部商城基础信息服务 + * + * @author wudy + * @version 1.0 + * @date 2022-03-17 10:58:37 + * @update [序号][日期YYYY-MM-DD] [更改人姓名][变更描述] + */ +//,url = "http://10.242.31.158:8100/doc" +@FeignClient(value = "${mall.core_service_document_center.serviceId}",fallback = CoreServiceDocumentFeignClientFallBack.class) +public interface CoreServiceDocumentFeignClient { + + @PostMapping("/v1.0/files/downloadFileAllStream") + public BaseResponse downloadFileAllStream(@RequestParam("fileId") String fileId); + } diff --git a/src/main/java/com/chinaunicom/mall/ebtp/faceCompare/feign/ExpertFeignClient.java b/src/main/java/com/chinaunicom/mall/ebtp/faceCompare/feign/ExpertFeignClient.java new file mode 100644 index 0000000..b83339c --- /dev/null +++ b/src/main/java/com/chinaunicom/mall/ebtp/faceCompare/feign/ExpertFeignClient.java @@ -0,0 +1,32 @@ +package com.chinaunicom.mall.ebtp.faceCompare.feign; + + +import com.chinaunicom.mall.ebtp.common.base.entity.BaseResponse; +import com.chinaunicom.mall.ebtp.faceCompare.entity.ExpeBaseInfoVO; +import com.chinaunicom.mall.ebtp.faceCompare.entity.ResultOutSystemBaseInfo; +import com.chinaunicom.mall.ebtp.faceCompare.feign.fallBack.ExpertFeignClientFallback; +import io.swagger.annotations.ApiOperation; +import org.springframework.cloud.openfeign.FeignClient; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; + +/** + * @Description 四号定位的在库物资情况Feign接口 + * @Author xudk url = "http://10.242.31.158:8100", + * @Date 2022/4/13 14:03 + */ +@FeignClient(value = "${mall.core_service_expert.serviceId}", fallback = ExpertFeignClientFallback.class) +public interface ExpertFeignClient { + + /** + * 修改专家照片 + * @param vo 调整信息 + * @return cn.chinaunicom.sdsi.framework.response.BaseResponse + * @Author lizz607 + * @Date 2022/4/13 14:15 + */ + @ApiOperation(value = "修改专家照片", notes = "修改专家照片") + @PostMapping("/api/mall-expe/v1/expebaseinfo/findExpert") + public BaseResponse findExpert(@RequestBody ExpeBaseInfoVO vo); + +} diff --git a/src/main/java/com/chinaunicom/mall/ebtp/faceCompare/feign/ExtendFeignClient.java b/src/main/java/com/chinaunicom/mall/ebtp/faceCompare/feign/ExtendFeignClient.java new file mode 100644 index 0000000..f49ed80 --- /dev/null +++ b/src/main/java/com/chinaunicom/mall/ebtp/faceCompare/feign/ExtendFeignClient.java @@ -0,0 +1,40 @@ +package com.chinaunicom.mall.ebtp.faceCompare.feign; + + +import com.chinaunicom.mall.ebtp.common.base.entity.BaseResponse; +import com.chinaunicom.mall.ebtp.faceCompare.entity.CrypBean; +import com.chinaunicom.mall.ebtp.faceCompare.feign.fallBack.ExtendFeignClientFallback; +import com.chinaunicom.mall.ebtp.userinfo.entity.AuthCodeVo; +import org.springframework.cloud.openfeign.FeignClient; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestParam; + +//,url="http://10.242.31.158:8100/biz-service-ebtp-extend") +@FeignClient(value = "${mconfig.feign.name.extend}",fallbackFactory = ExtendFeignClientFallback.class) +public interface ExtendFeignClient { + + /** + * 直接返回结果的天擎通用方法 + * @param bean 参数 + * @return + */ + @PostMapping(value = "/v1/crypconfigure/callUniInterfaceJson") + BaseResponse callUniInterfaceJson(CrypBean bean); + + /** + * 短信验证码发送接口 + * @param vo + * @return + */ + @PostMapping("/v1/bizshortmessage/send/authCode") + public BaseResponse authCodeSend(AuthCodeVo vo); + + /** + * 短信验证码验证接口 + * @param vo + * @return + */ + @PostMapping("/v1/bizshortmessage/check/authCode") + public BaseResponse authCodeCheck(AuthCodeVo vo); +} diff --git a/src/main/java/com/chinaunicom/mall/ebtp/faceCompare/feign/RsmsFeignClient.java b/src/main/java/com/chinaunicom/mall/ebtp/faceCompare/feign/RsmsFeignClient.java new file mode 100644 index 0000000..e1c62ac --- /dev/null +++ b/src/main/java/com/chinaunicom/mall/ebtp/faceCompare/feign/RsmsFeignClient.java @@ -0,0 +1,24 @@ +package com.chinaunicom.mall.ebtp.faceCompare.feign; + +import com.chinaunicom.mall.ebtp.common.base.entity.BaseResponse; +import com.chinaunicom.mall.ebtp.faceCompare.feign.fallBack.RsmsFeignFallbackFactory; +import io.swagger.annotations.ApiOperation; +import org.springframework.cloud.openfeign.FeignClient; +import org.springframework.web.bind.annotation.*; + +import java.util.List; + + +@FeignClient(value = "${mconfig.feign.name.rsms}" +// , url = "http://10.242.31.158:8100/biz-service-ebtp-rsms/" + ,fallbackFactory = RsmsFeignFallbackFactory.class) +public interface RsmsFeignClient { + + /** + * 查询当前评委所在的评审室信息 根据专家身份证 + * @return 返回结果 + */ + @ApiOperation("查询当前评委所在的评审室信息 根据专家身份证") + @GetMapping("/v1/jury/getRoomByCertificate") + BaseResponse> getRoomByCertificate(@RequestParam String certificate); +} diff --git a/src/main/java/com/chinaunicom/mall/ebtp/faceCompare/feign/SupplierbaseFeignClient.java b/src/main/java/com/chinaunicom/mall/ebtp/faceCompare/feign/SupplierbaseFeignClient.java new file mode 100644 index 0000000..8026bf0 --- /dev/null +++ b/src/main/java/com/chinaunicom/mall/ebtp/faceCompare/feign/SupplierbaseFeignClient.java @@ -0,0 +1,25 @@ +package com.chinaunicom.mall.ebtp.faceCompare.feign; + + +import com.chinaunicom.mall.ebtp.common.base.entity.BaseResponse; +import com.chinaunicom.mall.ebtp.faceCompare.entity.CrypBean; +import com.chinaunicom.mall.ebtp.faceCompare.feign.fallBack.ExtendFeignClientFallback; +import com.chinaunicom.mall.ebtp.userinfo.entity.SupplierUserVo; +import org.springframework.cloud.openfeign.FeignClient; +import org.springframework.web.bind.annotation.PostMapping; + +import java.util.Map; + +//mconfig.feign.name.supplier = core-service-supplierbase +@FeignClient(value = "${mconfig.feign.name.supplier}",fallbackFactory = ExtendFeignClientFallback.class) +public interface SupplierbaseFeignClient { + + /** + * 直接返回结果的天擎通用方法 + * @param 参数 + * @return + */ + @PostMapping(value = "/outer/v1.0/serviceEshopProviderEmpMdm/findUserCountListBySupplierCodePage") + BaseResponse findUserCountListBySupplierCodePage(SupplierUserVo vo); + +} diff --git a/src/main/java/com/chinaunicom/mall/ebtp/faceCompare/feign/fallBack/CoreServiceDocumentFeignClientFallBack.java b/src/main/java/com/chinaunicom/mall/ebtp/faceCompare/feign/fallBack/CoreServiceDocumentFeignClientFallBack.java new file mode 100644 index 0000000..7c86cc7 --- /dev/null +++ b/src/main/java/com/chinaunicom/mall/ebtp/faceCompare/feign/fallBack/CoreServiceDocumentFeignClientFallBack.java @@ -0,0 +1,27 @@ +package com.chinaunicom.mall.ebtp.faceCompare.feign.fallBack; + + +import com.chinaunicom.mall.ebtp.common.base.entity.BaseResponse; +import com.chinaunicom.mall.ebtp.faceCompare.entity.AnnexAndStorageVO; +import com.chinaunicom.mall.ebtp.faceCompare.feign.CoreServiceDocumentFeignClient; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Component; +import org.springframework.web.bind.annotation.RequestParam; + +/** + * 内部商城基础信息服务 + * + * @author wudy + * @version 1.0 + * @date 2022-03-17 10:58:37 + * @update [序号][日期YYYY-MM-DD] [更改人姓名][变更描述] + */ +@Component +@Slf4j +public class CoreServiceDocumentFeignClientFallBack implements CoreServiceDocumentFeignClient { + @Override + public BaseResponse downloadFileAllStream(@RequestParam("fileId") String fileId){ + log.info("调用下载附件feign出错!"); + return null; + } +} diff --git a/src/main/java/com/chinaunicom/mall/ebtp/faceCompare/feign/fallBack/ExpertFeignClientFallback.java b/src/main/java/com/chinaunicom/mall/ebtp/faceCompare/feign/fallBack/ExpertFeignClientFallback.java new file mode 100644 index 0000000..64ba4b7 --- /dev/null +++ b/src/main/java/com/chinaunicom/mall/ebtp/faceCompare/feign/fallBack/ExpertFeignClientFallback.java @@ -0,0 +1,33 @@ +package com.chinaunicom.mall.ebtp.faceCompare.feign.fallBack; + + +import com.chinaunicom.mall.ebtp.common.base.entity.BaseResponse; +import com.chinaunicom.mall.ebtp.faceCompare.entity.ExpeBaseInfoVO; +import com.chinaunicom.mall.ebtp.faceCompare.entity.ResultOutSystemBaseInfo; +import com.chinaunicom.mall.ebtp.faceCompare.feign.ExpertFeignClient; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Component; +import org.springframework.web.bind.annotation.RequestBody; + +/** + * @Description ForNumberMaterialInfoFallback + * @Author lizz607 + * @Date 2022/4/13 14:05 + */ +@Slf4j +@Component + +public class ExpertFeignClientFallback implements ExpertFeignClient { + /** + * 修改专家照片 + * @param vo 修改专家照片 + * @return cn.chinaunicom.sdsi.framework.response.BaseResponse + * @Author lizz607 + * @Date 2022/4/13 14:14 + */ + @Override + public BaseResponse findExpert(@RequestBody ExpeBaseInfoVO vo){ + log.error("调用专家库feign接口:findExpert失败"); + return null; + } +} diff --git a/src/main/java/com/chinaunicom/mall/ebtp/faceCompare/feign/fallBack/ExtendFeignClientFallback.java b/src/main/java/com/chinaunicom/mall/ebtp/faceCompare/feign/fallBack/ExtendFeignClientFallback.java new file mode 100644 index 0000000..bd37b27 --- /dev/null +++ b/src/main/java/com/chinaunicom/mall/ebtp/faceCompare/feign/fallBack/ExtendFeignClientFallback.java @@ -0,0 +1,50 @@ +package com.chinaunicom.mall.ebtp.faceCompare.feign.fallBack; + +import com.chinaunicom.mall.ebtp.common.base.entity.BaseResponse; +import com.chinaunicom.mall.ebtp.faceCompare.entity.CrypBean; +import com.chinaunicom.mall.ebtp.faceCompare.feign.ExtendFeignClient; +import com.chinaunicom.mall.ebtp.userinfo.entity.AuthCodeVo; +import feign.hystrix.FallbackFactory; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Component; + + +/** + * @Description ForNumberMaterialInfoFallback + * @Author lizz607 + * @Date 2022/4/13 14:05 + */ +@Slf4j +@Component +public class ExtendFeignClientFallback implements FallbackFactory { + /** + * 根据逻辑仓id和四号定位查询在库物资数量 + * @param + * @return cn.chinaunicom.sdsi.framework.response.BaseResponse + * @Author lizz607 + * @Date 2022/4/13 14:14 + */ + + @Override + public ExtendFeignClient create(Throwable throwable) { + throwable.printStackTrace(); + return new ExtendFeignClient() { + @Override + public BaseResponse callUniInterfaceJson(CrypBean bean) { + return null; + } + + @Override + public BaseResponse authCodeSend(AuthCodeVo vo) { + return null; + } + + @Override + public BaseResponse authCodeCheck(AuthCodeVo vo) { + return null; + } + + + }; + } +} diff --git a/src/main/java/com/chinaunicom/mall/ebtp/faceCompare/feign/fallBack/RsmsFeignFallbackFactory.java b/src/main/java/com/chinaunicom/mall/ebtp/faceCompare/feign/fallBack/RsmsFeignFallbackFactory.java new file mode 100644 index 0000000..3e6978d --- /dev/null +++ b/src/main/java/com/chinaunicom/mall/ebtp/faceCompare/feign/fallBack/RsmsFeignFallbackFactory.java @@ -0,0 +1,32 @@ +package com.chinaunicom.mall.ebtp.faceCompare.feign.fallBack; + + +import cn.hutool.core.exceptions.ExceptionUtil; +import com.chinaunicom.mall.ebtp.common.base.entity.BaseResponse; +import com.chinaunicom.mall.ebtp.faceCompare.feign.RsmsFeignClient; +import feign.hystrix.FallbackFactory; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Component; + +import java.util.ArrayList; +import java.util.List; + +@Component +@Slf4j +public class RsmsFeignFallbackFactory implements FallbackFactory { + + @Override + public RsmsFeignClient create(Throwable throwable) { + RsmsFeignClient back = new RsmsFeignClient() { + + @Override + public BaseResponse> getRoomByCertificate(String certificate) { + log.info("getRoomByCertificate异常数据:" + ExceptionUtil.stacktraceToString(throwable)); + return BaseResponse.fail(new ArrayList<>()); + } + + }; + log.info("异常数据:" + ExceptionUtil.stacktraceToString(throwable)); + return back; + } +} diff --git a/src/main/java/com/chinaunicom/mall/ebtp/faceCompare/service/FaceRecogService.java b/src/main/java/com/chinaunicom/mall/ebtp/faceCompare/service/FaceRecogService.java new file mode 100644 index 0000000..2128637 --- /dev/null +++ b/src/main/java/com/chinaunicom/mall/ebtp/faceCompare/service/FaceRecogService.java @@ -0,0 +1,24 @@ +package com.chinaunicom.mall.ebtp.faceCompare.service; + + +import com.chinaunicom.mall.ebtp.common.base.entity.BaseResponse; +import com.chinaunicom.mall.ebtp.faceCompare.entity.TockenRequestBody; +import org.springframework.web.bind.annotation.CrossOrigin; +import org.springframework.web.multipart.MultipartFile; + +/** + * @file: cn.chinaunicom.sdsi.business.stockmanage.logicstock.service.LogicStockService + * @description: + * @author: Admin + * @date: 2022-02-21 + * @version: V1.0 + * @update [序号][日期YYYY-MM-DD] [更改人姓名][变更描述] + */ +public interface FaceRecogService { + @CrossOrigin + BaseResponse faceCompare(MultipartFile file, String idNo); + + BaseResponse getTocken(TockenRequestBody requestBody); + +} + diff --git a/src/main/java/com/chinaunicom/mall/ebtp/faceCompare/service/impl/FaceRecogServiceImpl.java b/src/main/java/com/chinaunicom/mall/ebtp/faceCompare/service/impl/FaceRecogServiceImpl.java new file mode 100644 index 0000000..a80bd70 --- /dev/null +++ b/src/main/java/com/chinaunicom/mall/ebtp/faceCompare/service/impl/FaceRecogServiceImpl.java @@ -0,0 +1,308 @@ +package com.chinaunicom.mall.ebtp.faceCompare.service.impl; + + +import com.alibaba.fastjson.JSONObject; +import com.baomidou.mybatisplus.core.toolkit.IdWorker; +import com.chinaunicom.mall.ebtp.common.base.entity.BaseResponse; +import com.chinaunicom.mall.ebtp.common.exception.common.CommonExceptionEnum; +import com.chinaunicom.mall.ebtp.faceCompare.entity.*; +import com.chinaunicom.mall.ebtp.faceCompare.feign.CoreServiceDocumentFeignClient; +import com.chinaunicom.mall.ebtp.faceCompare.feign.ExpertFeignClient; +import com.chinaunicom.mall.ebtp.faceCompare.feign.ExtendFeignClient; +import com.chinaunicom.mall.ebtp.faceCompare.service.FaceRecogService; +import com.chinaunicom.mall.ebtp.faceCompare.util.JSONUtil; +import com.chinaunicom.mall.ebtp.faceCompare.util.QueryTokenUtil; +import com.google.common.base.Charsets; +import io.netty.util.internal.StringUtil; +import lombok.extern.slf4j.Slf4j; +import net.coobird.thumbnailator.Thumbnails; +import org.apache.commons.io.FileUtils; +import org.apache.commons.io.IOUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.stereotype.Service; +import org.springframework.web.bind.annotation.CrossOrigin; +import org.springframework.web.multipart.MultipartFile; + +import java.io.*; +import java.math.BigDecimal; +import java.util.Base64; +import java.util.Map; + +/** + * @description: + * @file: cn.chinaunicom.sdsi.business.stockmanage.logicstock.service.impl.LogicStockServiceImpl + * @author: xudk + * @date: 2022-02-21 + * @version: V1.0 + */ +@Service +@Slf4j +public class FaceRecogServiceImpl implements FaceRecogService { + + @Autowired + private ExtendFeignClient extendFeignClient; + + @Autowired + private QueryTokenUtil queryTokenUtil; + + @Autowired + private ExpertFeignClient expertFeignClient; + @Autowired + private CoreServiceDocumentFeignClient coreServiceDocumentFeignClient; + + @Value("${facecompare.url}") + private String faceCompareUrl; + + @Override + @CrossOrigin + public BaseResponse faceCompare(MultipartFile file, String idNo) { + + Boolean comparResult = false; + + //1,根据身份证号查询专家库得到相片的filedid + ExpeBaseInfoVO vo = new ExpeBaseInfoVO(); + vo.setIdentityCard(idNo); + log.info("FaceRecogServiceImpl.faceCompare.idNo:"+vo); + BaseResponse baseResponse = expertFeignClient.findExpert(vo); + log.info("FaceRecogServiceImpl.faceCompare.baseResponse:"+baseResponse); + if (baseResponse == null) { + return BaseResponse.fail("根据身份证号查询专家库信息异常", "根据身份证号查询专家库信息异常"); + } else if (!baseResponse.isSuccess()) { + return BaseResponse.fail(baseResponse.getMessage(), baseResponse.getMessage()); + } + ResultOutSystemBaseInfo expertInfo = baseResponse.getData(); + String expertPhotoId = String.valueOf(expertInfo.getExpertPhotoId()); + if (StringUtil.isNullOrEmpty(expertPhotoId)) { + return BaseResponse.fail("根据身份证号查询专家库未查询到专库相片", "根据身份证号查询专家库未查询到专库相片"); + } + + //2,去文档中心查询相片 + BaseResponse annexAndStorageVoBaseResponse = coreServiceDocumentFeignClient.downloadFileAllStream(expertPhotoId); + if (annexAndStorageVoBaseResponse == null) { + return BaseResponse.fail("文件下载失败,请稍后重试!", "文件下载失败,请稍后重试!"); + } + AnnexAndStorageVO data = annexAndStorageVoBaseResponse.getData(); + if (data == null || data.getSysStorageVO() == null) { + return BaseResponse.fail("文件下载失败,未查询到文件!", "文件下载失败,未查询到文件!"); + } + byte[] bytes = data.getSysStorageVO().getFileStream(); + // 3 得到压缩后数据 + String photoBase2 = getBase64FromPhoto(bytes); + FaceCompareReq req = new FaceCompareReq(); + req.setCOMPARE_TRANS_ID("facerecog" + IdWorker.getIdStr()); + req.setPROVINCE_CODE("90"); + req.setSYSTEM("02"); + req.setSCENE("02"); + req.setSYS_CODE("V000"); + req.setEPARCHY_CODE("901"); + String photoBase1 = getBase64FromPhoto(file); + req.setFACEIMG(photoBase1); + req.setBASEIMG(photoBase2); + String reqName = "FACE_COMPARE_REQ"; + String response = null; + try { + response = callUniInterface(req, faceCompareUrl, reqName, "", ""); + } catch (Exception e) { + log.error("调用比对接口失败-e:" + e); + return BaseResponse.fail("调用比对接口失败!" + e.getMessage(), "调用比对接口失败!" + e.getMessage()); + } + log.info("faceCompare.response:" + response); + + + Map docMap = JSONUtil.jsonToMap(response); + if(docMap != null){ + String headStr = JSONObject.toJSONString(docMap.get("UNI_BSS_HEAD")); + Map headMap = JSONUtil.jsonToMap(headStr); + if(headMap != null){ + String respCode = String.valueOf(headMap.get("RESP_CODE")); + if("00000".equals(respCode)){ + String bodyStr = JSONObject.toJSONString(docMap.get("UNI_BSS_BODY")); + Map bodyMap = JSONUtil.jsonToMap(bodyStr); + if(bodyMap != null){ + String rspStr = JSONObject.toJSONString(bodyMap.get("FACE_COMPARE_RSP")); + Map rspMap = JSONUtil.jsonToMap(rspStr); + if(rspMap != null){ + String similarity = String.valueOf(rspMap.get("SIMILARITY")); + BigDecimal similarityDecimal = new BigDecimal(similarity); + BigDecimal standardDecimal = new BigDecimal("66"); + if(standardDecimal.compareTo(similarityDecimal)<0){ + comparResult = true; + } + } + } + + } + } + } + if(!comparResult){ + return BaseResponse.fail("人脸比对未通过","人脸比对未通过"); + } + TockenRequestBody tockenRequestBody = new TockenRequestBody(); + tockenRequestBody.setIdCardNo(idNo); + BaseResponse tockenResponse = getTocken(tockenRequestBody); + return tockenResponse; + } + + + @Override + public BaseResponse getTocken(TockenRequestBody requestBody) { + BaseResponse tocken = queryTokenUtil.authDecide(requestBody.getIdCardNo()); + return tocken; + } + + + /* private MultipartFile getMultipartFile(File file){ + FileInputStream fileInputStream = null; + MultipartFile multipartFile = null; + try { + fileInputStream = new FileInputStream(file); + multipartFile = new MockMultipartFile(file.getName(),file.getName(), + ContentType.APPLICATION_OCTET_STREAM.toString(),fileInputStream); + } catch (Exception e) { + e.printStackTrace(); + } + return multipartFile; + }*/ + + public String callUniInterface(Object bean, String url, String reqName, String clientId, String operationCode) { + try { + CrypBean crypBean = new CrypBean(); + crypBean.setReqName(reqName); + crypBean.setObject(bean); + crypBean.setUrl(url); + crypBean.setClientId(clientId); + crypBean.setOperationCode(operationCode); + log.info("--------------调用天擎接口参数:" + JSONObject.toJSONString(crypBean)); + BaseResponse result = extendFeignClient.callUniInterfaceJson(crypBean); + log.info("--------------调用天擎接口参数:" + JSONObject.toJSONString(result)); + CommonExceptionEnum.FRAME_EXCEPTION_COMMON_DATA_OTHER_ERROR.customValidName(result.getMessage(), !result.isSuccess()); + return String.valueOf(result.getData()); + } catch (Exception e) { + log.error("--------------调用天擎接口:" + url + "调用失败----------------" + e); + } + return null; + } + + public String getBase64FromPhoto(byte[] bytes) { + log.info("原相片初始大小为{}kb", bytes.length / 1024); + if ((bytes.length / 1024) > 200) { + bytes = compressPicForScale(bytes, 200, "x");// 图片小于300kb + log.info("压缩后相片大小为{}kb", bytes.length / 1024); + } + + String base64 = new String(Base64.getEncoder().encode(bytes), Charsets.UTF_8); + return base64; + } + + // 1 MultipartFile 转file + // 2 file 转byte + // byte 压缩 + // byte转inputstream + //inputstream 转 base64 + public String getBase64FromPhoto(MultipartFile multipartFile) { + + //1文件上传前的名称 + String fileName = multipartFile.getOriginalFilename(); + File tempFile = new File(fileName); + OutputStream out = null; + try { + //获取文件流,以文件流的方式输出到新文件 + //InputStream in = multipartFile.getInputStream(); + out = new FileOutputStream(tempFile); + byte[] ss = multipartFile.getBytes(); + for (int i = 0; i < ss.length; i++) { + out.write(ss[i]); + } + } catch (IOException e) { + e.printStackTrace(); + } finally { + if (out != null) { + try { + out.close(); + } catch (IOException e) { + e.printStackTrace(); + } + } + } + + + // 2 + InputStream inputStream = null; + byte[] bytes = new byte[0]; + try { + bytes = FileUtils.readFileToByteArray(tempFile); + } catch (IOException e) { + throw new RuntimeException(e); + } + log.info("原相片初始大小为{}kb", bytes.length / 1024); + if ((bytes.length / 1024) > 200) { + // 3 + bytes = compressPicForScale(bytes, 200, "x");// 图片小于300kb + log.info("压缩后相片大小为{}kb", bytes.length / 1024); + } + inputStream = new ByteArrayInputStream(bytes); + String base64 = null; + try { + base64 = new String(Base64.getEncoder().encode(IOUtils.toByteArray(inputStream)), Charsets.UTF_8); + } catch (IOException e) { + throw new RuntimeException(e); + } + return base64; + } + + + /** + * 根据指定大小压缩图片 + * + * @param imageBytes 源图片字节数组 + * @param desFileSize 指定图片大小,单位kb + * @param imageId 影像编号 + * @return 压缩质量后的图片字节数组 + */ + public static byte[] compressPicForScale(byte[] imageBytes, long desFileSize, String imageId) { + if (imageBytes == null || imageBytes.length <= 0 || imageBytes.length < desFileSize * 1024) { + return imageBytes; + } + long srcSize = imageBytes.length; + double accuracy = getAccuracy(srcSize / 1024); + try { + while (imageBytes.length > desFileSize * 1024) { + ByteArrayInputStream inputStream = new ByteArrayInputStream(imageBytes); + ByteArrayOutputStream outputStream = new ByteArrayOutputStream(imageBytes.length); + Thumbnails.of(inputStream) + .scale(accuracy) + .outputQuality(accuracy) + .toOutputStream(outputStream); + imageBytes = outputStream.toByteArray(); + } + /* logger.info("【图片压缩】imageId={} | 图片原大小={}kb | 压缩后大小={}kb", + imageId, srcSize / 1024, imageBytes.length / 1024);*/ + log.info("【图片压缩】imageId=" + imageId + " | 图片原大小={" + (srcSize / 1024) + "}kb | 压缩后大小={" + (imageBytes.length / 1024) + "}kb"); + } catch (Exception e) { + log.info("【图片压缩】msg=图片压缩失败!" + e); + } + return imageBytes; + } + + /** + * 自动调节精度(经验数值) + * + * @param size 源图片大小 + * @return 图片压缩质量比 + */ + private static double getAccuracy(long size) { + double accuracy; + if (size < 900) { + accuracy = 0.85; + } else if (size < 2047) { + accuracy = 0.6; + } else if (size < 3275) { + accuracy = 0.44; + } else { + accuracy = 0.4; + } + return accuracy; + } + +} diff --git a/src/main/java/com/chinaunicom/mall/ebtp/faceCompare/util/BcecUtil.java b/src/main/java/com/chinaunicom/mall/ebtp/faceCompare/util/BcecUtil.java new file mode 100644 index 0000000..d97a829 --- /dev/null +++ b/src/main/java/com/chinaunicom/mall/ebtp/faceCompare/util/BcecUtil.java @@ -0,0 +1,295 @@ +// +// Source code recreated from a .class file by IntelliJ IDEA +// (powered by FernFlower decompiler) +// + +package com.chinaunicom.mall.ebtp.faceCompare.util; + +import org.bouncycastle.crypto.params.ECDomainParameters; +import org.bouncycastle.crypto.params.ECPublicKeyParameters; +import org.bouncycastle.jcajce.provider.asymmetric.ec.BCECPublicKey; +import org.bouncycastle.jce.spec.ECParameterSpec; +import org.bouncycastle.math.ec.ECCurve; +import org.bouncycastle.pqc.math.linearalgebra.ByteUtils; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +public final class BcecUtil { + private static final Logger log = LoggerFactory.getLogger(BcecUtil.class); + private static final String ALGO_NAME_EC = "EC"; + private static final String PEM_STRING_PUBLIC = "PUBLIC KEY"; + private static final String PEM_STRING_ECPRIVATEKEY = "EC PRIVATE KEY"; + + private BcecUtil() { + throw new IllegalStateException("Utility class"); + } + + public static ECPublicKeyParameters createEcPublicKeyParameters(String xHex, String yHex, ECCurve curve, ECDomainParameters domainParameters) { + return createEcPublicKeyParameters(ByteUtils.fromHexString(xHex), ByteUtils.fromHexString(yHex), curve, domainParameters); + } + + public static ECPublicKeyParameters createEcPublicKeyParameters(byte[] xBytes, byte[] yBytes, ECCurve curve, ECDomainParameters domainParameters) { + //byte UNCOMPRESSEDFLAG = true; + int curveLength = getCurveLength(domainParameters); + xBytes = fixToCurveLengthBytes(curveLength, xBytes); + yBytes = fixToCurveLengthBytes(curveLength, yBytes); + byte[] encodedPubKey = new byte[1 + xBytes.length + yBytes.length]; + encodedPubKey[0] = 4; + System.arraycopy(xBytes, 0, encodedPubKey, 1, xBytes.length); + System.arraycopy(yBytes, 0, encodedPubKey, 1 + xBytes.length, yBytes.length); + return new ECPublicKeyParameters(curve.decodePoint(encodedPubKey), domainParameters); + } + + public static int getCurveLength(ECDomainParameters domainParams) { + return (domainParams.getCurve().getFieldSize() + 7) / 8; + } + + public static byte[] fixToCurveLengthBytes(int curveLength, byte[] src) { + if (src.length == curveLength) { + return src; + } else { + byte[] result = new byte[curveLength]; + if (src.length > curveLength) { + System.arraycopy(src, src.length - result.length, result, 0, result.length); + } else { + System.arraycopy(src, 0, result, result.length - src.length, src.length); + } + + return result; + } + } + + public static ECPublicKeyParameters convertPublicKeyToParameters(BCECPublicKey ecPubKey) { + ECParameterSpec parameterSpec = ecPubKey.getParameters(); + ECDomainParameters domainParameters = new ECDomainParameters(parameterSpec.getCurve(), parameterSpec.getG(), parameterSpec.getN(), parameterSpec.getH()); + return new ECPublicKeyParameters(ecPubKey.getQ(), domainParameters); + } + + /* + + public static AsymmetricCipherKeyPair generateKeyPairParameter(ECDomainParameters domainParameters, SecureRandom random) { + ECKeyGenerationParameters keyGenerationParams = new ECKeyGenerationParameters(domainParameters, random); + ECKeyPairGenerator keyGen = new ECKeyPairGenerator(); + keyGen.init(keyGenerationParams); + return keyGen.generateKeyPair(); + } + + public static KeyPair generateKeyPair(ECDomainParameters domainParameters, SecureRandom random) { + try { + KeyPairGenerator kpg = KeyPairGenerator.getInstance("EC", "BC"); + ECParameterSpec parameterSpec = new ECParameterSpec(domainParameters.getCurve(), domainParameters.getG(), domainParameters.getN(), domainParameters.getH()); + kpg.initialize(parameterSpec, random); + return kpg.generateKeyPair(); + } catch (NoSuchProviderException | InvalidAlgorithmParameterException | NoSuchAlgorithmException var4) { + log.error(var4.getLocalizedMessage(), var4); + return null; + } + } + + public static int getCurveLength(ECKeyParameters ecKey) { + return getCurveLength(ecKey.getParameters()); + } + + + + + + public static ECPrivateKeyParameters createEcPrivateKeyParameters(BigInteger d, ECDomainParameters domainParameters) { + return new ECPrivateKeyParameters(d, domainParameters); + } + + public static ECPublicKeyParameters createEcPublicKeyParameters(BigInteger x, BigInteger y, ECCurve curve, ECDomainParameters domainParameters) { + return createEcPublicKeyParameters(x.toByteArray(), y.toByteArray(), curve, domainParameters); + } + + + + + + public static ECPrivateKeyParameters convertPrivateKeyToParameters(BCECPrivateKey ecPriKey) { + ECParameterSpec parameterSpec = ecPriKey.getParameters(); + ECDomainParameters domainParameters = new ECDomainParameters(parameterSpec.getCurve(), parameterSpec.getG(), parameterSpec.getN(), parameterSpec.getH()); + return new ECPrivateKeyParameters(ecPriKey.getD(), domainParameters); + } + + + + public static BCECPublicKey createPublicKeyFromSubjectPublicKeyInfo(SubjectPublicKeyInfo subPubInfo) { + try { + return convertX509ToEcPublicKey(subPubInfo.toASN1Primitive().getEncoded("DER")); + } catch (IOException var2) { + log.error(var2.getLocalizedMessage(), var2); + return null; + } + } + + public static byte[] convertEcPrivateKeyToPkcs8(ECPrivateKeyParameters priKey, ECPublicKeyParameters pubKey) { + ECDomainParameters domainParams = priKey.getParameters(); + ECParameterSpec spec = new ECParameterSpec(domainParams.getCurve(), domainParams.getG(), domainParams.getN(), domainParams.getH()); + BCECPublicKey publicKey = null; + if (pubKey != null) { + publicKey = new BCECPublicKey("EC", pubKey, spec, BouncyCastleProvider.CONFIGURATION); + } + + BCECPrivateKey privateKey = new BCECPrivateKey("EC", priKey, publicKey, spec, BouncyCastleProvider.CONFIGURATION); + return privateKey.getEncoded(); + } + + public static BCECPrivateKey convertPkcs8ToEcPrivateKey(byte[] pkcs8Key) { + PKCS8EncodedKeySpec peks = new PKCS8EncodedKeySpec(pkcs8Key); + + try { + KeyFactory kf = KeyFactory.getInstance("EC", "BC"); + return (BCECPrivateKey)kf.generatePrivate(peks); + } catch (NoSuchProviderException | InvalidKeySpecException | NoSuchAlgorithmException var3) { + log.error(var3.getLocalizedMessage(), var3); + return null; + } + } + + public static String convertEcPrivateKeyPkcs8ToPem(byte[] encodedKey) throws IOException { + return convertEncodedDataToPem("EC PRIVATE KEY", encodedKey); + } + + public static byte[] convertEcPrivateKeyPemToPkcs8(String pemString) throws IOException { + return convertPemToEncodedData(pemString); + } + + public static byte[] convertEcPrivateKeyToSec1(ECPrivateKeyParameters priKey, ECPublicKeyParameters pubKey) throws IOException { + byte[] pkcs8Bytes = convertEcPrivateKeyToPkcs8(priKey, pubKey); + PrivateKeyInfo pki = PrivateKeyInfo.getInstance(pkcs8Bytes); + ASN1Encodable encodable = pki.parsePrivateKey(); + ASN1Primitive primitive = encodable.toASN1Primitive(); + byte[] sec1Bytes = primitive.getEncoded(); + log.info(Arrays.toString(sec1Bytes)); + return sec1Bytes; + } + + public static byte[] convertEcPrivateKeySec1ToPkcs8(byte[] sec1Key) throws IOException { + X962Parameters params = getDomainParametersFromName(Sm2Util.JDK_EC_SPEC, false); + ASN1OctetString privKey = new DEROctetString(sec1Key); + ASN1EncodableVector v = new ASN1EncodableVector(); + v.add(new ASN1Integer(0L)); + v.add(new AlgorithmIdentifier(X9ObjectIdentifiers.id_ecPublicKey, params)); + v.add(privKey); + DERSequence ds = new DERSequence(v); + return ds.getEncoded("DER"); + } + + public static BCECPrivateKey convertSec1ToBcecPrivateKey(byte[] sec1Key) { + try { + PKCS8EncodedKeySpec peks = new PKCS8EncodedKeySpec(convertEcPrivateKeySec1ToPkcs8(sec1Key)); + KeyFactory kf = KeyFactory.getInstance("EC", "BC"); + return (BCECPrivateKey)kf.generatePrivate(peks); + } catch (IOException | NoSuchProviderException | InvalidKeySpecException | NoSuchAlgorithmException var3) { + log.error(var3.getLocalizedMessage(), var3); + return null; + } + } + + public static ECPrivateKeyParameters convertSec1ToEcPrivateKey(byte[] sec1Key) { + BCECPrivateKey privateKey = convertSec1ToBcecPrivateKey(sec1Key); + return privateKey == null ? null : convertPrivateKeyToParameters(privateKey); + } + + public static byte[] convertEcPublicKeyToX509(ECPublicKeyParameters pubKey) { + ECDomainParameters domainParams = pubKey.getParameters(); + ECParameterSpec spec = new ECParameterSpec(domainParams.getCurve(), domainParams.getG(), domainParams.getN(), domainParams.getH()); + BCECPublicKey publicKey = new BCECPublicKey("EC", pubKey, spec, BouncyCastleProvider.CONFIGURATION); + return publicKey.getEncoded(); + } + + public static BCECPublicKey convertX509ToEcPublicKey(byte[] x509Bytes) { + try { + X509EncodedKeySpec eks = new X509EncodedKeySpec(x509Bytes); + KeyFactory kf = KeyFactory.getInstance("EC", "BC"); + return (BCECPublicKey)kf.generatePublic(eks); + } catch (NoSuchProviderException | InvalidKeySpecException | NoSuchAlgorithmException var3) { + log.error(var3.getLocalizedMessage(), var3); + return null; + } + } + + public static String convertEcPublicKeyX509ToPem(byte[] encodedKey) throws IOException { + return convertEncodedDataToPem("PUBLIC KEY", encodedKey); + } + + public static byte[] convertEcPublicKeyPemToX509(String pemString) throws IOException { + return convertPemToEncodedData(pemString); + } + + public static X9ECParameters getDomainParametersFromGenSpec(ECGenParameterSpec genSpec) { + return getDomainParametersFromName(genSpec.getName()); + } + + public static X9ECParameters getDomainParametersFromName(String curveName) { + X9ECParameters domainParameters; + try { + char zero = 48; + char two = 50; + char nullStr = 32; + if (curveName.charAt(0) >= zero && curveName.charAt(0) <= two) { + ASN1ObjectIdentifier oidId = new ASN1ObjectIdentifier(curveName); + domainParameters = ECUtil.getNamedCurveByOid(oidId); + } else if (curveName.indexOf(nullStr) > -1) { + curveName = curveName.substring(curveName.indexOf(32) + 1); + domainParameters = ECUtil.getNamedCurveByName(curveName); + } else { + domainParameters = ECUtil.getNamedCurveByName(curveName); + } + } catch (IllegalArgumentException var6) { + domainParameters = ECUtil.getNamedCurveByName(curveName); + } + + return domainParameters; + } + + public static X962Parameters getDomainParametersFromName(java.security.spec.ECParameterSpec ecSpec, boolean withCompression) { + X962Parameters params; + if (ecSpec instanceof ECNamedCurveSpec) { + ASN1ObjectIdentifier curveOid = ECUtil.getNamedCurveOid(((ECNamedCurveSpec)ecSpec).getName()); + if (curveOid == null) { + curveOid = new ASN1ObjectIdentifier(((ECNamedCurveSpec)ecSpec).getName()); + } + + params = new X962Parameters(curveOid); + } else if (ecSpec == null) { + params = new X962Parameters(DERNull.INSTANCE); + } else { + ECCurve curve = EC5Util.convertCurve(ecSpec.getCurve()); + X9ECParameters ecP = new X9ECParameters(curve, new X9ECPoint(EC5Util.convertPoint(curve, ecSpec.getGenerator()), withCompression), ecSpec.getOrder(), BigInteger.valueOf((long)ecSpec.getCofactor()), ecSpec.getCurve().getSeed()); + params = new X962Parameters(ecP); + } + + return params; + } + + private static String convertEncodedDataToPem(String type, byte[] encodedData) throws IOException { + ByteArrayOutputStream bOut = new ByteArrayOutputStream(); + PemWriter pWrt = new PemWriter(new OutputStreamWriter(bOut)); + + try { + PemObject pemObj = new PemObject(type, encodedData); + pWrt.writeObject(pemObj); + } finally { + pWrt.close(); + } + + return new String(bOut.toByteArray()); + } + + private static byte[] convertPemToEncodedData(String pemString) throws IOException { + ByteArrayInputStream bIn = new ByteArrayInputStream(pemString.getBytes()); + PemReader pRdr = new PemReader(new InputStreamReader(bIn)); + + byte[] var4; + try { + PemObject pemObject = pRdr.readPemObject(); + var4 = pemObject.getContent(); + } finally { + pRdr.close(); + } + + return var4; + }*/ +} diff --git a/src/main/java/com/chinaunicom/mall/ebtp/faceCompare/util/GmBaseUtil.java b/src/main/java/com/chinaunicom/mall/ebtp/faceCompare/util/GmBaseUtil.java new file mode 100644 index 0000000..372da98 --- /dev/null +++ b/src/main/java/com/chinaunicom/mall/ebtp/faceCompare/util/GmBaseUtil.java @@ -0,0 +1,23 @@ +// +// Source code recreated from a .class file by IntelliJ IDEA +// (powered by FernFlower decompiler) +// + +package com.chinaunicom.mall.ebtp.faceCompare.util; + +import java.security.Security; +import org.bouncycastle.jce.provider.BouncyCastleProvider; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +public class GmBaseUtil { + private static final Logger log = LoggerFactory.getLogger(GmBaseUtil.class); + + protected GmBaseUtil() { + log.info("GmBaseUtil"); + } + + static { + Security.addProvider(new BouncyCastleProvider()); + } +} diff --git a/src/main/java/com/chinaunicom/mall/ebtp/faceCompare/util/JSONUtil.java b/src/main/java/com/chinaunicom/mall/ebtp/faceCompare/util/JSONUtil.java new file mode 100644 index 0000000..7ba72bc --- /dev/null +++ b/src/main/java/com/chinaunicom/mall/ebtp/faceCompare/util/JSONUtil.java @@ -0,0 +1,105 @@ +package com.chinaunicom.mall.ebtp.faceCompare.util; + +import cn.hutool.core.map.MapWrapper; +import cn.hutool.core.util.ArrayUtil; +import cn.hutool.core.util.ObjectUtil; +import cn.hutool.core.util.StrUtil; +import cn.hutool.json.JSON; +import cn.hutool.json.JSONArray; +import cn.hutool.json.JSONConfig; +import net.sf.json.JSONException; +import net.sf.json.JSONObject; + +import java.util.HashMap; +import java.util.Iterator; +import java.util.Map; + +/** + * @ClassName : JSONUtil + * @Author : WHW + * @Date: 2021/6/12 + * @Description : json工具类 + */ +public class JSONUtil { + private JSONUtil() { + } + + public static String toJsonStr(Object obj) { + return toJsonStr(obj, (JSONConfig)null); + } + + public static String toJsonStr(Object obj, JSONConfig jsonConfig) { + if (null == obj) { + return null; + } else { + return obj instanceof CharSequence ? StrUtil.str((CharSequence)obj) : toJsonStr(parse(obj, jsonConfig)); + } + } + + + public static JSON parse(Object obj, JSONConfig config) { + if (null == obj) { + return null; + } else { + Object json; + if (obj instanceof JSON) { + json = (JSON)obj; + } else if (obj instanceof CharSequence) { + String jsonStr = StrUtil.trim((CharSequence)obj); + json = isTypeJSONArray(jsonStr) ? parseArray(jsonStr, config) : parseObj(jsonStr, config); + } else if (obj instanceof MapWrapper) { + json = parseObj(obj, config); + } else if (!(obj instanceof Iterable) && !(obj instanceof Iterator) && !ArrayUtil.isArray(obj)) { + json = parseObj(obj, config); + } else { + json = parseArray(obj, config); + } + + return (JSON)json; + } + } + public static boolean isTypeJSONArray(String str) { + return StrUtil.isBlank(str) ? false : StrUtil.isWrap(StrUtil.trim(str), '[', ']'); + } + public static cn.hutool.json.JSONObject parseObj(Object obj, JSONConfig config) { + return new cn.hutool.json.JSONObject(obj, (JSONConfig) ObjectUtil.defaultIfNull(config, create())); + } + public static JSONConfig create() { + return new JSONConfig(); + } + public static JSONArray parseArray(Object arrayOrCollection, JSONConfig config) { + return new JSONArray(arrayOrCollection, config); + } + + public static Map jsonToMap(String data) { + JSONObject jsonObject = JSONObject.fromObject(data); + Map result = new HashMap(); + jsonToMap(jsonObject, result); + return result; + } + + public static Map jsonToMap(JSONObject jsonObject) { + Map result = new HashMap(); + jsonToMap(jsonObject, result); + return result; + } + + public static void jsonToMap(JSONObject o, Map result) throws JSONException { + Iterator it1 = o.keys(); + Object jsValue = null; + + while (it1.hasNext()) { + String jsonKey = (String) it1.next(); + jsValue = o.get(jsonKey); + if (jsValue instanceof JSONObject) { + Map sub = new HashMap(); + result.put(jsonKey, sub); + jsonToMap((JSONObject) jsValue, sub); + } else { + result.put(jsonKey, jsValue); + } + } + + } + +} diff --git a/src/main/java/com/chinaunicom/mall/ebtp/faceCompare/util/QueryTokenUtil.java b/src/main/java/com/chinaunicom/mall/ebtp/faceCompare/util/QueryTokenUtil.java new file mode 100644 index 0000000..7e8b695 --- /dev/null +++ b/src/main/java/com/chinaunicom/mall/ebtp/faceCompare/util/QueryTokenUtil.java @@ -0,0 +1,106 @@ +package com.chinaunicom.mall.ebtp.faceCompare.util; + +import com.chinaunicom.mall.ebtp.common.base.entity.BaseResponse; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.collections4.MapUtils; +import org.apache.commons.lang.StringUtils; +import org.bouncycastle.crypto.InvalidCipherTextException; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.context.annotation.Configuration; +import org.springframework.web.client.RestTemplate; + +import java.time.LocalDateTime; +import java.time.ZoneId; +import java.util.Map; + +/** + * token工具 + */ +@Slf4j +@Configuration +public class QueryTokenUtil { + + @Value("${job.system-id}") + private String systemId; + + @Value("${job.client-id}") + private String clientId; + + @Value("${job.public-key}") + private String publicKey; + + + //public static final String System_id="http://10.242.31.158:8100"; + + /** + * 3.0 认证clientId + */ + //public static final String CLIENT_ID = "bVS46ElU"; + /** + * 3.0 入参加密使用publicKey + */ + // public static final String PUBLIC_KEY = "0428D625CEEB71CE823BD7D78DFEE7B122F2DA5C4D21E32253AD684D0FE21810394A799639C0CDFBFEB535A1DFD6A366A637E582CE0B1466A5FE7858841135DE6B"; + + public BaseResponse authDecide(String uid) { + String encodeUrl=generateEncodeUrl(clientId,uid,systemId,null); + RestTemplate restTemplate = new RestTemplate(); + String jdResponse = restTemplate.postForObject(systemId+ + "/auth/expertDecide?"+encodeUrl, null, String.class); + log.info(systemId+ + "/auth/expertDecide"+encodeUrl); + if (StringUtils.isNotBlank(jdResponse)) + { + Map docMap = JSONUtil.jsonToMap(jdResponse); + if(MapUtils.getBooleanValue(docMap,"success")){ + if(docMap.get("data")==null){ + return BaseResponse.fail("调用颁发令牌接口返回结果为空","调用颁发令牌接口返回结果为空"); + }else{ + return BaseResponse.success(docMap.get("data")); + //token=MapUtils.getString((Map)docMap.get("data"),"laissez"); + } + }else{ + return BaseResponse.fail("调用颁发令牌接口返回异常:"+MapUtils.getBooleanValue(docMap,"message"),"调用颁发令牌接口返回异常:"+MapUtils.getBooleanValue(docMap,"message")); + } + } + return BaseResponse.fail("颁发令牌接口系统异常","颁发令牌接口系统异常"); + } + /** + * 根据clientId、用户标识、重定向地址和自定义参数,生成加密串 + * + * @param uid + * @param params + * @return + */ + public String generateEncodeUrl(String clientId, String uid, String redirectUrl, Map params) { + Sm2Encryptor sm2Encryptor = new Sm2Encryptor(); + LocalDateTime now = LocalDateTime.now(); + String splitChar = "@@"; + StringBuilder builder = new StringBuilder(100); + builder.append(clientId).append(splitChar); + builder.append(uid).append(splitChar); + if (params != null && !params.isEmpty()) { + builder.append(redirectUrl); + if (redirectUrl.contains("?")) { + builder.append("&"); + } else { + builder.append("?"); + } + for (Map.Entry entry : params.entrySet()) { + builder.append(entry.getKey()).append("=").append(entry.getValue()).append("&"); + } + builder.deleteCharAt(builder.length() - 1).append(splitChar); + } else { + builder.append(redirectUrl).append(splitChar); + } + builder.append(now.atZone(ZoneId.systemDefault()).toInstant().toEpochMilli()); + try { + return sm2Encryptor.encryptString(builder.toString(), + publicKey); + } catch (InvalidCipherTextException e) { + e.printStackTrace(); + } + return ""; + } + + +} diff --git a/src/main/java/com/chinaunicom/mall/ebtp/faceCompare/util/Sm2Encryptor.java b/src/main/java/com/chinaunicom/mall/ebtp/faceCompare/util/Sm2Encryptor.java new file mode 100644 index 0000000..ca07546 --- /dev/null +++ b/src/main/java/com/chinaunicom/mall/ebtp/faceCompare/util/Sm2Encryptor.java @@ -0,0 +1,84 @@ +// +// Source code recreated from a .class file by IntelliJ IDEA +// (powered by FernFlower decompiler) +// + +package com.chinaunicom.mall.ebtp.faceCompare.util; + + +import org.bouncycastle.crypto.InvalidCipherTextException; +import org.bouncycastle.crypto.params.ECPublicKeyParameters; +import org.bouncycastle.pqc.math.linearalgebra.ByteUtils; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +public class Sm2Encryptor { + private static final Logger log = LoggerFactory.getLogger(Sm2Encryptor.class); + + public Sm2Encryptor() { + } + + + public String encryptString(String data, String publicKeyStr) throws InvalidCipherTextException { + String publicXandY = publicKeyStr.substring(2, publicKeyStr.length()); + int selfLen = publicXandY.length() / 2; + int len = publicXandY.length(); + String xHex = publicXandY.substring(0, selfLen); + String yHex = publicXandY.substring(selfLen, len); + ECPublicKeyParameters pubKey = BcecUtil.createEcPublicKeyParameters(xHex, yHex, Sm2Util.CURVE, Sm2Util.DOMAIN_PARAMS); + byte[] encryptedData = Sm2Util.encrypt(pubKey, data.getBytes()); + return ByteUtils.toHexString(encryptedData); + } + /* + public String decryptString(String privateKeyStr, String encryptText) throws InvalidCipherTextException { + ECPrivateKeyParameters priKey = new ECPrivateKeyParameters(new BigInteger(ByteUtils.fromHexString(privateKeyStr)), Sm2Util.DOMAIN_PARAMS); + byte[] decryptedData = Sm2Util.decrypt(priKey, fromHexString(encryptText)); + return new String(decryptedData, StandardCharsets.UTF_8); + } + + public static String publicEncrypt(String data, String publicKeyStr) throws InvalidCipherTextException { + log.info("publicEncrypt"); + String publicXandY = publicKeyStr.substring(2, publicKeyStr.length()); + int selfLen = publicXandY.length() / 2; + int len = publicXandY.length(); + String xHex = publicXandY.substring(0, selfLen); + String yHex = publicXandY.substring(selfLen, len); + ECPublicKeyParameters pubKey = BcecUtil.createEcPublicKeyParameters(xHex, yHex, Sm2Util.CURVE, Sm2Util.DOMAIN_PARAMS); + byte[] encryptedData = Sm2Util.encrypt(pubKey, data.getBytes()); + return ByteUtils.toHexString(encryptedData); + } + + public static String privateDecrypt(String data, String privateKeyStr) throws InvalidCipherTextException { + ECPrivateKeyParameters priKey = new ECPrivateKeyParameters(new BigInteger(HexUtils.hexToByte(privateKeyStr)), Sm2Util.DOMAIN_PARAMS); + byte[] decryptedData = Sm2Util.decrypt(priKey, HexUtils.hexToByte(data)); + return new String(decryptedData, StandardCharsets.UTF_8); + } + + + + public void generateKey() { + AsymmetricCipherKeyPair keyPair = Sm2Util.generateKeyPairParameter(); + ECPrivateKeyParameters priKey = (ECPrivateKeyParameters)keyPair.getPrivate(); + ECPublicKeyParameters pubKey = (ECPublicKeyParameters)keyPair.getPublic(); + String privateKey = ByteUtils.toHexString(priKey.getD().toByteArray()).toUpperCase(); + String publicKey = ByteUtils.toHexString(pubKey.getQ().getEncoded(false)).toUpperCase(); + log.info("SM2公钥,请配置在unifast.security.public-key: {}", publicKey); + log.info("SM2私钥,请配置在unifast.security.private-key: : {}", privateKey); + } + + public static byte[] fromHexString(String hexString) { + if (null != hexString && !"".equals(hexString.trim())) { + byte[] bytes = new byte[hexString.length() / 2]; + int two = 2; + + for(int i = 0; i < hexString.length() / two; ++i) { + String hex = hexString.substring(i * 2, i * 2 + 2); + bytes[i] = (byte)Integer.parseInt(hex, 16); + } + + return bytes; + } else { + return new byte[0]; + } + }*/ +} diff --git a/src/main/java/com/chinaunicom/mall/ebtp/faceCompare/util/Sm2Util.java b/src/main/java/com/chinaunicom/mall/ebtp/faceCompare/util/Sm2Util.java new file mode 100644 index 0000000..bffd094 --- /dev/null +++ b/src/main/java/com/chinaunicom/mall/ebtp/faceCompare/util/Sm2Util.java @@ -0,0 +1,359 @@ +// +// Source code recreated from a .class file by IntelliJ IDEA +// (powered by FernFlower decompiler) +// + +package com.chinaunicom.mall.ebtp.faceCompare.util; + +import org.bouncycastle.crypto.InvalidCipherTextException; +import org.bouncycastle.crypto.engines.SM2Engine; +import org.bouncycastle.crypto.engines.SM2Engine.Mode; +import org.bouncycastle.crypto.params.ECDomainParameters; +import org.bouncycastle.crypto.params.ECPublicKeyParameters; +import org.bouncycastle.crypto.params.ParametersWithRandom; +import org.bouncycastle.jcajce.provider.asymmetric.ec.BCECPublicKey; +import org.bouncycastle.math.ec.ECPoint; +import org.bouncycastle.math.ec.custom.gm.SM2P256V1Curve; + +import java.math.BigInteger; +import java.security.SecureRandom; +import java.security.spec.ECFieldFp; +import java.security.spec.ECParameterSpec; +import java.security.spec.EllipticCurve; + +public class Sm2Util extends GmBaseUtil { + public static final SM2P256V1Curve CURVE = new SM2P256V1Curve(); + public static final BigInteger SM2_ECC_P; + public static final BigInteger SM2_ECC_A; + public static final BigInteger SM2_ECC_B; + public static final BigInteger SM2_ECC_N; + public static final BigInteger SM2_ECC_H; + public static final BigInteger SM2_ECC_GX; + public static final BigInteger SM2_ECC_GY; + public static final ECPoint G_POINT; + public static final ECDomainParameters DOMAIN_PARAMS; + public static final int CURVE_LEN; + public static final EllipticCurve JDK_CURVE; + public static final java.security.spec.ECPoint JDK_G_POINT; + public static final ECParameterSpec JDK_EC_SPEC; + public static final int SM3_DIGEST_LENGTH = 32; + private static final String UNSUPPORTEDMODE = "Unsupported mode:"; + + public Sm2Util() { + } + + public static byte[] encrypt(ECPublicKeyParameters pubKeyParameters, byte[] srcData) throws InvalidCipherTextException { + return encrypt(Mode.C1C3C2, pubKeyParameters, srcData); + } + + public static byte[] encrypt(BCECPublicKey pubKey, byte[] srcData) throws InvalidCipherTextException { + ECPublicKeyParameters pubKeyParameters = BcecUtil.convertPublicKeyToParameters(pubKey); + return encrypt(Mode.C1C3C2, pubKeyParameters, srcData); + } + + public static byte[] encrypt(SM2Engine.Mode mode, BCECPublicKey pubKey, byte[] srcData) throws InvalidCipherTextException { + ECPublicKeyParameters pubKeyParameters = BcecUtil.convertPublicKeyToParameters(pubKey); + return encrypt(mode, pubKeyParameters, srcData); + } + + + + public static byte[] encrypt(SM2Engine.Mode mode, ECPublicKeyParameters pubKeyParameters, byte[] srcData) throws InvalidCipherTextException { + SM2Engine engine = new SM2Engine(mode); + ParametersWithRandom pwr = new ParametersWithRandom(pubKeyParameters, new SecureRandom()); + engine.init(true, pwr); + return engine.processBlock(srcData, 0, srcData.length); + } +/* + public static AsymmetricCipherKeyPair generateKeyPairParameter() { + SecureRandom random = new SecureRandom(); + return BcecUtil.generateKeyPairParameter(DOMAIN_PARAMS, random); + } + + public static KeyPair generateKeyPair() { + SecureRandom random = new SecureRandom(); + return BcecUtil.generateKeyPair(DOMAIN_PARAMS, random); + } + + public static byte[] getRawPrivateKey(BCECPrivateKey privateKey) { + return fixToCurveLengthBytes(privateKey.getD().toByteArray()); + } + + public static byte[] getRawPublicKey(BCECPublicKey publicKey) { + byte[] src65 = publicKey.getQ().getEncoded(false); + byte[] rawXandY = new byte[CURVE_LEN * 2]; + System.arraycopy(src65, 1, rawXandY, 0, rawXandY.length); + return rawXandY; + } + + + + public static byte[] decrypt(BCECPrivateKey priKey, byte[] sm2Cipher) throws InvalidCipherTextException { + ECPrivateKeyParameters priKeyParameters = BcecUtil.convertPrivateKeyToParameters(priKey); + return decrypt(Mode.C1C3C2, priKeyParameters, sm2Cipher); + } + + public static byte[] decrypt(SM2Engine.Mode mode, BCECPrivateKey priKey, byte[] sm2Cipher) throws InvalidCipherTextException { + ECPrivateKeyParameters priKeyParameters = BcecUtil.convertPrivateKeyToParameters(priKey); + return decrypt(mode, priKeyParameters, sm2Cipher); + } + + public static byte[] decrypt(ECPrivateKeyParameters priKeyParameters, byte[] sm2Cipher) throws InvalidCipherTextException { + return decrypt(Mode.C1C3C2, priKeyParameters, sm2Cipher); + } + + public static byte[] decrypt(SM2Engine.Mode mode, ECPrivateKeyParameters priKeyParameters, byte[] sm2Cipher) throws InvalidCipherTextException { + SM2Engine engine = new SM2Engine(mode); + engine.init(false, priKeyParameters); + return engine.processBlock(sm2Cipher, 0, sm2Cipher.length); + } + + public static Sm2Cipher parseSm2Cipher(byte[] cipherText) { + int curveLength = BcecUtil.getCurveLength(DOMAIN_PARAMS); + return parseSm2Cipher(Mode.C1C3C2, curveLength, 32, cipherText); + } + + public static Sm2Cipher parseSm2Cipher(SM2Engine.Mode mode, byte[] cipherText) { + int curveLength = BcecUtil.getCurveLength(DOMAIN_PARAMS); + return parseSm2Cipher(mode, curveLength, 32, cipherText); + } + + public static Sm2Cipher parseSm2Cipher(int curveLength, int digestLength, byte[] cipherText) { + return parseSm2Cipher(Mode.C1C3C2, curveLength, digestLength, cipherText); + } + + public static Sm2Cipher parseSm2Cipher(SM2Engine.Mode mode, int curveLength, int digestLength, byte[] cipherText) { + byte[] c1 = new byte[curveLength * 2 + 1]; + byte[] c2 = new byte[cipherText.length - c1.length - digestLength]; + byte[] c3 = new byte[digestLength]; + System.arraycopy(cipherText, 0, c1, 0, c1.length); + if (mode == Mode.C1C2C3) { + System.arraycopy(cipherText, c1.length, c2, 0, c2.length); + System.arraycopy(cipherText, c1.length + c2.length, c3, 0, c3.length); + } else { + if (mode != Mode.C1C3C2) { + throw new ServiceErrorException("Unsupported mode:" + mode); + } + + System.arraycopy(cipherText, c1.length, c3, 0, c3.length); + System.arraycopy(cipherText, c1.length + c3.length, c2, 0, c2.length); + } + + Sm2Cipher result = new Sm2Cipher(); + result.setC1(c1); + result.setC2(c2); + result.setC3(c3); + result.setCipherText(cipherText); + return result; + } + + public static byte[] encodeSm2CipherToDer(byte[] cipher) throws IOException { + int curveLength = BcecUtil.getCurveLength(DOMAIN_PARAMS); + return encodeSm2CipherToDer(Mode.C1C3C2, curveLength, 32, cipher); + } + + public static byte[] encodeSm2CipherToDer(SM2Engine.Mode mode, byte[] cipher) throws IOException { + int curveLength = BcecUtil.getCurveLength(DOMAIN_PARAMS); + return encodeSm2CipherToDer(mode, curveLength, 32, cipher); + } + + public static byte[] encodeSm2CipherToDer(int curveLength, int digestLength, byte[] cipher) throws IOException { + return encodeSm2CipherToDer(Mode.C1C3C2, curveLength, digestLength, cipher); + } + + public static byte[] encodeSm2CipherToDer(SM2Engine.Mode mode, int curveLength, int digestLength, byte[] cipher) throws IOException { + byte[] c1x = new byte[curveLength]; + byte[] c1y = new byte[curveLength]; + byte[] c2 = new byte[cipher.length - c1x.length - c1y.length - 1 - digestLength]; + byte[] c3 = new byte[digestLength]; + int startPos = 1; + System.arraycopy(cipher, startPos, c1x, 0, c1x.length); + startPos += c1x.length; + System.arraycopy(cipher, startPos, c1y, 0, c1y.length); + startPos += c1y.length; + if (mode == Mode.C1C2C3) { + System.arraycopy(cipher, startPos, c2, 0, c2.length); + startPos += c2.length; + System.arraycopy(cipher, startPos, c3, 0, c3.length); + } else { + if (mode != Mode.C1C3C2) { + throw new ServiceErrorException("Unsupported mode:" + mode); + } + + System.arraycopy(cipher, startPos, c3, 0, c3.length); + startPos += c3.length; + System.arraycopy(cipher, startPos, c2, 0, c2.length); + } + + ASN1Encodable[] arr = new ASN1Encodable[]{new ASN1Integer(c1x), new ASN1Integer(c1y), null, null}; + if (mode == Mode.C1C2C3) { + arr[2] = new DEROctetString(c2); + arr[3] = new DEROctetString(c3); + } else if (mode == Mode.C1C3C2) { + arr[2] = new DEROctetString(c3); + arr[3] = new DEROctetString(c2); + } + + DERSequence ds = new DERSequence(arr); + return ds.getEncoded("DER"); + } + + public static byte[] decodeDerSm2Cipher(byte[] derCipher) { + return decodeDerSm2Cipher(Mode.C1C3C2, derCipher); + } + + public static byte[] decodeDerSm2Cipher(SM2Engine.Mode mode, byte[] derCipher) { + ASN1Sequence as = ASN1Sequence.getInstance(derCipher); + byte[] c3; + byte[] c2; + if (mode == Mode.C1C2C3) { + c2 = ((DEROctetString)as.getObjectAt(2)).getOctets(); + c3 = ((DEROctetString)as.getObjectAt(3)).getOctets(); + } else { + if (mode != Mode.C1C3C2) { + throw new ServiceErrorException("Unsupported mode:" + mode); + } + + c3 = ((DEROctetString)as.getObjectAt(2)).getOctets(); + c2 = ((DEROctetString)as.getObjectAt(3)).getOctets(); + } + + int pos = 0; + byte[] c1x = ((ASN1Integer)as.getObjectAt(0)).getValue().toByteArray(); + byte[] c1y = ((ASN1Integer)as.getObjectAt(1)).getValue().toByteArray(); + byte[] cipherText = new byte[1 + c1x.length + c1y.length + c2.length + c3.length]; + byte UNCOMPRESSEDFLAG = true; + cipherText[0] = 4; + ++pos; + System.arraycopy(c1x, 0, cipherText, pos, c1x.length); + pos += c1x.length; + System.arraycopy(c1y, 0, cipherText, pos, c1y.length); + pos += c1y.length; + if (mode == Mode.C1C2C3) { + System.arraycopy(c2, 0, cipherText, pos, c2.length); + pos += c2.length; + System.arraycopy(c3, 0, cipherText, pos, c3.length); + } else if (mode == Mode.C1C3C2) { + System.arraycopy(c3, 0, cipherText, pos, c3.length); + pos += c3.length; + System.arraycopy(c2, 0, cipherText, pos, c2.length); + } + + return cipherText; + } + + public static byte[] sign(BCECPrivateKey priKey, byte[] srcData) throws CryptoException { + ECPrivateKeyParameters priKeyParameters = BcecUtil.convertPrivateKeyToParameters(priKey); + return sign((ECPrivateKeyParameters)priKeyParameters, (byte[])null, srcData); + } + + public static byte[] sign(ECPrivateKeyParameters priKeyParameters, byte[] srcData) throws CryptoException { + return sign((ECPrivateKeyParameters)priKeyParameters, (byte[])null, srcData); + } + + public static byte[] sign(BCECPrivateKey priKey, byte[] withId, byte[] srcData) throws CryptoException { + ECPrivateKeyParameters priKeyParameters = BcecUtil.convertPrivateKeyToParameters(priKey); + return sign(priKeyParameters, withId, srcData); + } + + public static byte[] sign(ECPrivateKeyParameters priKeyParameters, byte[] withId, byte[] srcData) throws CryptoException { + SM2Signer signer = new SM2Signer(); + CipherParameters param = null; + ParametersWithRandom pwr = new ParametersWithRandom(priKeyParameters, new SecureRandom()); + if (withId != null) { + param = new ParametersWithID(pwr, withId); + } else { + param = pwr; + } + + signer.init(true, (CipherParameters)param); + signer.update(srcData, 0, srcData.length); + return signer.generateSignature(); + } + + public static byte[] decodeDerSm2Sign(byte[] derSign) { + ASN1Sequence as = ASN1Sequence.getInstance(derSign); + byte[] rBytes = ((ASN1Integer)as.getObjectAt(0)).getValue().toByteArray(); + byte[] sBytes = ((ASN1Integer)as.getObjectAt(1)).getValue().toByteArray(); + rBytes = fixToCurveLengthBytes(rBytes); + sBytes = fixToCurveLengthBytes(sBytes); + byte[] rawSign = new byte[rBytes.length + sBytes.length]; + System.arraycopy(rBytes, 0, rawSign, 0, rBytes.length); + System.arraycopy(sBytes, 0, rawSign, rBytes.length, sBytes.length); + return rawSign; + } + + public static byte[] encodeSm2SignToDer(byte[] rawSign) throws IOException { + BigInteger r = new BigInteger(1, extractBytes(rawSign, 0, 32)); + BigInteger s = new BigInteger(1, extractBytes(rawSign, 32, 32)); + ASN1EncodableVector v = new ASN1EncodableVector(); + v.add(new ASN1Integer(r)); + v.add(new ASN1Integer(s)); + return (new DERSequence(v)).getEncoded("DER"); + } + + public static boolean verify(BCECPublicKey pubKey, byte[] srcData, byte[] sign) { + ECPublicKeyParameters pubKeyParameters = BcecUtil.convertPublicKeyToParameters(pubKey); + return verify((ECPublicKeyParameters)pubKeyParameters, (byte[])null, srcData, sign); + } + + public static boolean verify(ECPublicKeyParameters pubKeyParameters, byte[] srcData, byte[] sign) { + return verify((ECPublicKeyParameters)pubKeyParameters, (byte[])null, srcData, sign); + } + + public static boolean verify(BCECPublicKey pubKey, byte[] withId, byte[] srcData, byte[] sign) { + ECPublicKeyParameters pubKeyParameters = BcecUtil.convertPublicKeyToParameters(pubKey); + return verify(pubKeyParameters, withId, srcData, sign); + } + + public static boolean verify(ECPublicKeyParameters pubKeyParameters, byte[] withId, byte[] srcData, byte[] sign) { + SM2Signer signer = new SM2Signer(); + Object param; + if (withId != null) { + param = new ParametersWithID(pubKeyParameters, withId); + } else { + param = pubKeyParameters; + } + + signer.init(false, (CipherParameters)param); + signer.update(srcData, 0, srcData.length); + return signer.verifySignature(sign); + } + + private static byte[] extractBytes(byte[] src, int offset, int length) { + byte[] result = new byte[length]; + System.arraycopy(src, offset, result, 0, result.length); + return result; + } + + private static byte[] fixToCurveLengthBytes(byte[] src) { + if (src.length == CURVE_LEN) { + return src; + } else { + byte[] result = new byte[CURVE_LEN]; + if (src.length > CURVE_LEN) { + System.arraycopy(src, src.length - result.length, result, 0, result.length); + } else { + System.arraycopy(src, 0, result, result.length - src.length, src.length); + } + + return result; + } + }*/ + + static { + SM2_ECC_P = CURVE.getQ(); + SM2_ECC_A = CURVE.getA().toBigInteger(); + SM2_ECC_B = CURVE.getB().toBigInteger(); + SM2_ECC_N = CURVE.getOrder(); + SM2_ECC_H = CURVE.getCofactor(); + SM2_ECC_GX = new BigInteger("32C4AE2C1F1981195F9904466A39C9948FE30BBFF2660BE1715A4589334C74C7", 16); + SM2_ECC_GY = new BigInteger("BC3736A2F4F6779C59BDCEE36B692153D0A9877CC62A474002DF32E52139F0A0", 16); + G_POINT = CURVE.createPoint(SM2_ECC_GX, SM2_ECC_GY); + DOMAIN_PARAMS = new ECDomainParameters(CURVE, G_POINT, SM2_ECC_N, SM2_ECC_H); + CURVE_LEN = BcecUtil.getCurveLength(DOMAIN_PARAMS); + JDK_CURVE = new EllipticCurve(new ECFieldFp(SM2_ECC_P), SM2_ECC_A, SM2_ECC_B); + JDK_G_POINT = new java.security.spec.ECPoint(G_POINT.getAffineXCoord().toBigInteger(), G_POINT.getAffineYCoord().toBigInteger()); + JDK_EC_SPEC = new ECParameterSpec(JDK_CURVE, JDK_G_POINT, SM2_ECC_N, SM2_ECC_H.intValue()); + } +} diff --git a/src/main/java/com/chinaunicom/mall/ebtp/login/common/CaptchaGenerator.java b/src/main/java/com/chinaunicom/mall/ebtp/login/common/CaptchaGenerator.java new file mode 100644 index 0000000..6a097a7 --- /dev/null +++ b/src/main/java/com/chinaunicom/mall/ebtp/login/common/CaptchaGenerator.java @@ -0,0 +1,150 @@ +package com.chinaunicom.mall.ebtp.login.common; + +import cn.hutool.core.date.LocalDateTimeUtil; +import com.chinaunicom.mall.ebtp.common.exception.common.CommonExceptionEnum; +import com.chinaunicom.mall.ebtp.login.entity.BuffeedImageVo; + +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.stereotype.Service; + +import javax.imageio.ImageIO; +import java.awt.*; +import java.awt.image.BufferedImage; +import java.io.ByteArrayOutputStream; +import java.io.IOException; +import java.time.LocalDateTime; +import java.util.Base64; +import java.util.Random; + +@Slf4j +@Service +public class CaptchaGenerator { + private int width = 120; // 验证码图片的宽度 + private int height = 40; // 验证码图片的高度 + private int length = 4; // 验证码的长度 + private String chars = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789"; // 可选的字符集合 + + @Value("${login.captcha.time_limit}") + private Integer timeLimit; + @Value("${login.captcha.publicKey}") + private String publicKey; + @Value("${login.captcha.privateKey}") + private String privateKey; + + public BuffeedImageVo generateCaptcha() { + BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB); + Graphics2D g = image.createGraphics(); + + // 设置背景颜色 + g.setColor(Color.WHITE); + Font font = new Font("Arial", Font.BOLD,32); + g.setFont(font); + g.fillRect(0, 0, width, height); + + // 生成随机验证码 + StringBuilder sb = new StringBuilder(); + Random random = new Random(); + int x = (width - 20) / length; + int y = height - 10; + for (int i = 0; i < length; i++) { + int index = random.nextInt(chars.length()); + String captchaChar = String.valueOf(chars.charAt(index)); + sb.append(captchaChar); + g.setColor(new Color(random.nextInt(255), random.nextInt(255), random.nextInt(255))); + g.drawString(captchaChar, x * i + 10, y); + } + + // 生成干扰线 + for (int i = 0; i < 40; i++) { + int x1 = random.nextInt(width); + int y1 = random.nextInt(height); + int x2 = random.nextInt(width); + int y2 = random.nextInt(height); + g.setColor(new Color(random.nextInt(255), random.nextInt(255), random.nextInt(255))); + g.drawLine(x1, y1, x2, y2); + } + + g.dispose(); + BuffeedImageVo vo = new BuffeedImageVo(); + + vo.setCode(sb.toString()); + vo.setImage(image); + return vo; + } + + /** + * 获取图形验证码 + * @return + */ + public BuffeedImageVo getCaptcha(){ + BuffeedImageVo vo = this.generateCaptcha(); + String creteTime = LocalDateTimeUtil.format(LocalDateTime.now().plusMinutes(timeLimit), "yyyy-MM-dd HH:mm:ss"); + String code = encoded(vo.getCode()+"_"+creteTime); + vo.setCode(code); + return vo; + } + + /** + * 校验验证码 + * @return + */ + public Boolean checkCaptcha(String value, String captch){ + + try{ + String cap = this.encoded(captch); + String[] caps = cap.split("_"); + String time = caps[1]; + LocalDateTime ltime = LocalDateTimeUtil.parse(time,"yyyy-MM-dd HH:mm:ss"); + CommonExceptionEnum.FRAME_EXCEPTION_COMMON_DATA_OTHER_ERROR.customValidName("验证码无效", LocalDateTime.now().isAfter(ltime)); + + CommonExceptionEnum.FRAME_EXCEPTION_COMMON_DATA_OTHER_ERROR.customValidName("验证码无效",!value.equals(caps[0])); + + }catch (Exception e){ + CommonExceptionEnum.FRAME_EXCEPTION_COMMON_DATA_OTHER_ERROR.customValidName("验证码无效",true); + } + return true; + } + + private String encoded(String value){ + String val = ""; + System.out.println("\r加密前文字:\r\n" + value); + try { + byte[] data = value.getBytes(); + byte[] encodedData = RSA.encryptByPublicKey(data, publicKey); + val = RSA.encryptBASE64(encodedData); + System.out.println("加密后文字:\r\n" + val); + }catch (Exception e){ + log.error("加密失败 异常!",e); + CommonExceptionEnum.FRAME_EXCEPTION_COMMON_DATA_OTHER_ERROR.customValidName("加密失败",true); + } + return val; + } + + private String decrypt(String value){ + String val = ""; + System.out.println("\r解密前文字:\r\n" + value); + try { + byte[] encodedData = RSA.decryptBASE64(value); + byte[] decodedData = RSA.decryptByPrivateKey(encodedData, privateKey); + val = new String(decodedData); + System.out.println("解密后文字:\r\n" + val); + }catch (Exception e){ + log.error("解密失败 异常!",e); + CommonExceptionEnum.FRAME_EXCEPTION_COMMON_DATA_OTHER_ERROR.customValidName("解密失败",true); + } + return val; + } + + public static void main(String[] args) throws IOException { + CaptchaGenerator captchaGenerator = new CaptchaGenerator(); + BuffeedImageVo vo = captchaGenerator.generateCaptcha(); + ByteArrayOutputStream baos = new ByteArrayOutputStream(); + ImageIO.write(vo.getImage(), "png", baos); + byte[] imageData = baos.toByteArray(); + + System.out.println("验证码图片:"+ Base64.getEncoder().encodeToString(imageData)); + // 展示验证码图像或保存为文件 + System.out.println("验证码:" + vo.getCode()); + } +} diff --git a/src/main/java/com/chinaunicom/mall/ebtp/login/common/Constants.java b/src/main/java/com/chinaunicom/mall/ebtp/login/common/Constants.java new file mode 100644 index 0000000..4d40001 --- /dev/null +++ b/src/main/java/com/chinaunicom/mall/ebtp/login/common/Constants.java @@ -0,0 +1,186 @@ +package com.chinaunicom.mall.ebtp.login.common; + + +import lombok.extern.slf4j.Slf4j; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; + +@Slf4j +public class Constants { + + public static final String ANNO_MODE_VO_B = "BizAnnoVoBtable"; + public static final String ANNO_MODE_VO_M = "BizAnnoVoMtable"; + + public static final String EBTP_TENANT_BY = "EBTP"; + + public static final String DELETE_FLAG_NORMAL = "normal"; + public static final String DELETE_FLAG_DELETED = "deleted"; + //有效 + public static final Integer TENANTS_STATE_VALID = 1; + //失效 + public static final Integer TENANTS_STATE_INVALID = 0; + //有效 + public static final Integer ANNO_STATE_VALID = 1; + //失效 + public static final Integer ANNO_STATE_INVALID = 0; + //发布 release + public static final Integer NOTICE_STATE_RELEASE = 1; + //未发布 revoke + public static final Integer NOTICE_STATE_NO_RELEASE = 0; + //年 + public static final Integer TENANTS_TERM = 2; + //分钟 + public static final Integer TOKEN_TIME_OUT = 2; + //公告 + public static final String DICT_TYPE_ANNO = "anno"; + //采购方式 + public static final String DICT_TYPE_MODE = "procurement_mode"; + //采购类型 + public static final String DICT_TYPE_TYPE = "procurement_type"; + //省分 + public static final String DICT_TYPE_PROVINCES = "provinces"; + + //省分 - 其他 + public static final String DICT_TYPE_PROVINCES_10000 = "10000"; + + //配置参数 + public static final String BIZ_CONFIG_TYPE_CONFIG = "1"; + //过滤配置参数 + public static final String BIZ_CONFIG_TYPE_CHECK_ANNO = "2"; + //登录信息禁止配置参数 + public static final String BIZ_CONFIG_TYPE_LOGIN_ANNO = "3"; + + //是否置顶 是 + public static final String TOP_STATE_Y = "1"; + //是否置顶 否 + public static final String TOP_STATE_N = "0"; + + //是否显示置顶 是 + public static final String SHOW_TOP_STATE_Y = "1"; + //是否显示置顶 否 + public static final String SHOW_TOP_STATE_N = "0"; + + public static Map> dictMap = new HashMap<>(); + + public static void setDict(Map> map) { + dictMap = map; + } + + public static String getDict(String id, String moduleType) { + Map map = dictMap.get(moduleType); + if(map!=null){ + return map.get(id); + } + return null; + } + + + //专家库管理员 + public static final String ROLE_CODE_E_D_ADMIN = "e_d_admin"; + //专家 + public static final String ROLE_CODE_EXPERT = "expert"; + //管理员 + public static final String ROLE_CODE_ADMIN = "sys_admin"; + + /** + * 通过文件名判断并获取OSS服务文件上传时文件的contentType + * @param fileName 文件名 + * @return 文件的contentType + */ + public static String getContentType(String fileExtension){ + //文件的后缀名 + if("bmp".equalsIgnoreCase(fileExtension)) { + return "image/bmp"; + } + if("gif".equalsIgnoreCase(fileExtension)) { + return "image/gif"; + } + if("jpeg".equalsIgnoreCase(fileExtension) || "jpg".equalsIgnoreCase(fileExtension) || "png".equalsIgnoreCase(fileExtension) ) { + return "image/jpeg"; + } + if("html".equalsIgnoreCase(fileExtension)) { + return "text/html"; + } + if("txt".equalsIgnoreCase(fileExtension)) { + return "text/plain"; + } + if("vsd".equalsIgnoreCase(fileExtension)) { + return "application/vnd.visio"; + } + if("ppt".equalsIgnoreCase(fileExtension) || "pptx".equalsIgnoreCase(fileExtension)) { + return "application/vnd.ms-powerpoint"; + } + if("doc".equalsIgnoreCase(fileExtension) || "docx".equalsIgnoreCase(fileExtension)) { + return "application/msword"; + } + if ("xls".equalsIgnoreCase(fileExtension) || "xlsx".equalsIgnoreCase(fileExtension)) { + return "application/msexcel"; + } + if ("csv".equalsIgnoreCase(fileExtension)) { + return "application/csv"; + } + if("xml".equalsIgnoreCase(fileExtension)) { + return "text/xml"; + } + if("mp4".equalsIgnoreCase(fileExtension)) { + return "video/mp4"; + } + if("avi".equalsIgnoreCase(fileExtension)) { + return "video/x-msvideo"; + } + if("mov".equalsIgnoreCase(fileExtension)) { + return "video/quicktime"; + } + if("mpeg".equalsIgnoreCase(fileExtension) || "mpg".equalsIgnoreCase(fileExtension)) { + return "video/mpeg"; + } + if("wm".equalsIgnoreCase(fileExtension)) { + return "video/x-ms-wmv"; + } + if("flv".equalsIgnoreCase(fileExtension)) { + return "video/x-flv"; + } + if("mkv".equalsIgnoreCase(fileExtension)) { + return "video/x-matroska"; + } + //默认返回类型 + return "video/x-msvideo"; + } + + + //账号类型 专家 + public static final String USER_TYPE_EXPERT = "3"; + //专家管理员 + public static final String USER_TYPE_EXPERT_ADMIN = "2"; + //业务经理 + public static final String USER_TYPE_BUSINESS_MANAGER = "4"; + //游客 + public static final String USER_TYPE_TOURIST = "99"; + + + //账号类型 专家 + public static final String ORGN_STAUTS_OK = "2";//审批通过 + public static final String ORGN_STAUTS_WAIT = "1";//待审批 + public static final String ORGN_STAUTS_NOT = "0";//未提交 + public static final String ORGN_STAUTS_NO = "-1";//审批未通过 + + public static final String ORGN_SUBMIT_TYPE_I = "1";//入库 + public static final String ORGN_SUBMIT_TYPE_U = "2";//变更 + + public static final String ORGN_UPDATE_TYPE_ING = "0";//变更中 + public static final String ORGN_UPDATE_TYPE_OVER = "1";//已变更 + + public static final String USER_STATUS_FREEZE = "0";//冻结 + public static final String USER_STATUS_LIVE = "1";//正常 + + public static final Integer USER_TOKEN_STATUS_E = 1;//正常 + + + public static final String ORGN_USER_TYPE_1 = "1";//招标人 + public static final String ORGN_USER_TYPE_2 = "2";//代理机构 + public static final String ORGN_USER_TYPE_3 = "3";//评标专家单位 +} diff --git a/src/main/java/com/chinaunicom/mall/ebtp/login/common/MdConstants.java b/src/main/java/com/chinaunicom/mall/ebtp/login/common/MdConstants.java new file mode 100644 index 0000000..52fcd45 --- /dev/null +++ b/src/main/java/com/chinaunicom/mall/ebtp/login/common/MdConstants.java @@ -0,0 +1,28 @@ +package com.chinaunicom.mall.ebtp.login.common; + +import java.math.BigInteger; +import java.security.MessageDigest; +import java.security.NoSuchAlgorithmException; + +public class MdConstants { + + + public static String getSha256(String str) { + try { + // 初始化MessageDigest并指定MD5算法 + MessageDigest md = MessageDigest.getInstance("SHA-256"); + md.update(str.getBytes()); + // 将字节转换为十六进制字符串 + return new BigInteger(1, md.digest()).toString(16); + } catch (NoSuchAlgorithmException e) { + throw new RuntimeException(e); + } + } + + public static void main(String[] args) { + + String originalString = "Hello, World!"; + System.out.println("Original String: " + originalString); + System.out.println("SHA-256 Hash: " + MdConstants.getSha256(originalString)); + } +} diff --git a/src/main/java/com/chinaunicom/mall/ebtp/login/common/RSA.java b/src/main/java/com/chinaunicom/mall/ebtp/login/common/RSA.java new file mode 100644 index 0000000..75becf7 --- /dev/null +++ b/src/main/java/com/chinaunicom/mall/ebtp/login/common/RSA.java @@ -0,0 +1,356 @@ +package com.chinaunicom.mall.ebtp.login.common; + +import com.chinaunicom.mall.ebtp.common.exception.common.CommonExceptionEnum; + +import javax.crypto.Cipher; +import java.security.*; +import java.security.interfaces.RSAPrivateKey; +import java.security.interfaces.RSAPublicKey; +import java.security.spec.PKCS8EncodedKeySpec; +import java.security.spec.X509EncodedKeySpec; +import java.util.Base64; +import java.util.HashMap; +import java.util.Map; + +public class RSA { + + public static final String KEY_ALGORITHM = "RSA"; + public static final String SIGNATURE_ALGORITHM = "MD5withRSA"; + + private static final String PUBLIC_KEY = "RSAPublicKey"; + private static final String PRIVATE_KEY = "RSAPrivateKey"; + + /** + * 初始化密钥 + * + * @return + * @throws Exception + */ + public static Map initKey() throws Exception { + KeyPairGenerator keyPairGen = KeyPairGenerator.getInstance(KEY_ALGORITHM); + keyPairGen.initialize(1024); + KeyPair keyPair = keyPairGen.generateKeyPair(); + + // 公钥 + RSAPublicKey publicKey = (RSAPublicKey) keyPair.getPublic(); +// logger.info("------" + publicKey); + // 私钥 + RSAPrivateKey privateKey = (RSAPrivateKey) keyPair.getPrivate(); +// logger.info("------" + publicKey); + + Map keyMap = new HashMap (2); + + keyMap.put(PUBLIC_KEY, publicKey); + keyMap.put(PRIVATE_KEY, privateKey); + return keyMap; + } + + /** + * 取得私钥 + * + * @param keyMap + * @return + * @throws Exception + */ + public static String getPrivateKey(Map keyMap) + throws Exception { + Key key = (Key) keyMap.get(PRIVATE_KEY); + return encryptBASE64(key.getEncoded()); + } + + /** + * 取得公钥 + * + * @param keyMap + * @return + * @throws Exception + */ + public static String getPublicKey(Map keyMap) + throws Exception { + Key key = (Key) keyMap.get(PUBLIC_KEY); + return encryptBASE64(key.getEncoded()); + } + + + /** + * 解密
+ * 用私钥解密 + * + * @param data + * @param key + * @return + * @throws Exception + */ + public static byte[] decryptByPrivateKey(byte[] data, String key) + throws Exception { + // 对密钥解密 + byte[] keyBytes = decryptBASE64(key); + + // 取得私钥 + PKCS8EncodedKeySpec pkcs8KeySpec = new PKCS8EncodedKeySpec(keyBytes); + KeyFactory keyFactory = KeyFactory.getInstance(KEY_ALGORITHM); + Key privateKey = keyFactory.generatePrivate(pkcs8KeySpec); + + // 对数据解密 + Cipher cipher = Cipher.getInstance(keyFactory.getAlgorithm()); + cipher.init(Cipher.DECRYPT_MODE, privateKey); + + return cipher.doFinal(data); + } + /** + * 解密
+ * 用私钥解密 + * + * @param data + * @param key + * @return + * @throws Exception + */ + public static String decryptByPrivateKeyString(byte[] data, String key) + throws Exception { + return new String(decryptByPrivateKey(data, key)); + } + + + /** + * 解密
+ * 用公钥解密 + * + * @param data + * @param key + * @return + * @throws Exception + */ + public static byte[] decryptByPublicKey(byte[] data, String key) + throws Exception { + // 对密钥解密 + byte[] keyBytes = decryptBASE64(key); + + // 取得公钥 + X509EncodedKeySpec x509KeySpec = new X509EncodedKeySpec(keyBytes); + KeyFactory keyFactory = KeyFactory.getInstance(KEY_ALGORITHM); + Key publicKey = keyFactory.generatePublic(x509KeySpec); + + // 对数据解密 + Cipher cipher = Cipher.getInstance(keyFactory.getAlgorithm()); + cipher.init(Cipher.DECRYPT_MODE, publicKey); + + return cipher.doFinal(data); + } + + /** + * 加密
+ * 用公钥加密 + * + * @param data + * @param key + * @return + * @throws Exception + */ + public static byte[] encryptByPublicKey(byte[] data, String key) + throws Exception { + // 对公钥解密 + byte[] keyBytes = decryptBASE64(key); + + // 取得公钥 + X509EncodedKeySpec x509KeySpec = new X509EncodedKeySpec(keyBytes); + KeyFactory keyFactory = KeyFactory.getInstance(KEY_ALGORITHM); + Key publicKey = keyFactory.generatePublic(x509KeySpec); + + // 对数据加密 + Cipher cipher = Cipher.getInstance(keyFactory.getAlgorithm()); + cipher.init(Cipher.ENCRYPT_MODE, publicKey); + + return cipher.doFinal(data); + } + + /** + * 加密
+ * 用私钥加密 + * + * @param data + * @param key + * @return + * @throws Exception + */ + public static byte[] encryptByPrivateKey(byte[] data, String key) + throws Exception { + // 对密钥解密 + byte[] keyBytes = decryptBASE64(key); + + // 取得私钥 + PKCS8EncodedKeySpec pkcs8KeySpec = new PKCS8EncodedKeySpec(keyBytes); + KeyFactory keyFactory = KeyFactory.getInstance(KEY_ALGORITHM); + Key privateKey = keyFactory.generatePrivate(pkcs8KeySpec); + + // 对数据加密 + Cipher cipher = Cipher.getInstance(keyFactory.getAlgorithm()); + cipher.init(Cipher.ENCRYPT_MODE, privateKey); + + return cipher.doFinal(data); + } + + /** + * 用私钥对信息生成数字签名 + * + * @param data + * 加密数据 + * @param privateKey + * 私钥 + * + * @return + * @throws Exception + */ + public static String sign(byte[] data, String privateKey) throws Exception { + // 解密由base64编码的私钥 + byte[] keyBytes = decryptBASE64(privateKey); + + // 构造PKCS8EncodedKeySpec对象 + PKCS8EncodedKeySpec pkcs8KeySpec = new PKCS8EncodedKeySpec(keyBytes); + + // KEY_ALGORITHM 指定的加密算法 + KeyFactory keyFactory = KeyFactory.getInstance(KEY_ALGORITHM); + + // 取私钥匙对象 + PrivateKey priKey = keyFactory.generatePrivate(pkcs8KeySpec); + + // 用私钥对信息生成数字签名 + Signature signature = Signature.getInstance(SIGNATURE_ALGORITHM); + signature.initSign(priKey); + signature.update(data); + + return encryptBASE64(signature.sign()); + } + + /** + * 校验数字签名 + * + * @param data + * 加密数据 + * @param publicKey + * 公钥 + * @param sign + * 数字签名 + * + * @return 校验成功返回true 失败返回false + * @throws Exception + * + */ + public static boolean verify(byte[] data, String publicKey, String sign) + throws Exception { + + // 解密由base64编码的公钥 + byte[] keyBytes = decryptBASE64(publicKey); + + // 构造X509EncodedKeySpec对象 + X509EncodedKeySpec keySpec = new X509EncodedKeySpec(keyBytes); + + // KEY_ALGORITHM 指定的加密算法 + KeyFactory keyFactory = KeyFactory.getInstance(KEY_ALGORITHM); + + // 取公钥匙对象 + PublicKey pubKey = keyFactory.generatePublic(keySpec); + + Signature signature = Signature.getInstance(SIGNATURE_ALGORITHM); + signature.initVerify(pubKey); + signature.update(data); + + // 验证签名是否正常 + return signature.verify(decryptBASE64(sign)); + } + + public static byte[] decryptBASE64(String key) throws Exception { + return Base64.getDecoder().decode(key); + } + + public static String encryptBASE64(byte[] key) throws Exception { + return Base64.getEncoder().encodeToString(key); + } + + public static String encrypt(String value,String publicKey){ + try { + String v = encryptBASE64(RSA.encryptByPublicKey(value.getBytes(), publicKey)); + return v; + }catch (Exception e){ + CommonExceptionEnum.FRAME_EXCEPTION_COMMON_DATA_OTHER_ERROR.customValidName("加密异常", true); + } + return ""; + } + public static String decrypt(String value,String privateKey){ + try { + byte[] decodedData = decryptByPrivateKey(decryptBASE64(value), privateKey); + String target = new String(decodedData); + return target; + }catch (Exception e){ + CommonExceptionEnum.FRAME_EXCEPTION_COMMON_DATA_OTHER_ERROR.customValidName("解密异常", true); + } + return ""; + } + public static void main(String[] args) { + Map keyMap; + try { + keyMap = initKey(); +// Map map = initKey(); +// System.out.println(map); + //取得公钥和么私钥 + //keyMap = initKey(); + //String publicKey = "MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCgkWYQFjlRrCsQQBNZj6uo8KEQamePmxaC6O4JI5SoELnXPlTCJIlQTG1Xzn/ajqjDV4/5ZmZAH+auST4j9L5qH8qnoxT1AN+yhUY6hMV9qxF00e1gBc81mYJO2nwwaQjRsGEoq86e9dP1zX5kOk8vMZN6/g508a1K2IWNwpGp0wIDAQAB"; + //String publicKey = getPublicKey(keyMap); + //#生产 + String publicKey ="MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCHzL+U09epkBAnn2V4HCADX9gQxpW4iQ3ckM0YMX5CRe9SSzbbRItYMnOsIjogj39gXm7cYJIgE91wQgNJINkD65D2Tm+7vYgLMyw87YBlTONxQ484RW7o5Ofqz72HEXMyfvdpLIJ5lTheeqHmpL20vNkq+CkuHxhVPlYoVl/1uwIDAQAB"; + System.out.println("字符类型公钥:" + publicKey); + + //String privateKey = "MIICdwIBADANBgkqhkiG9w0BAQEFAASCAmEwggJdAgEAAoGBAKCRZhAWOVGsKxBAE1mPq6jwoRBqZ4+bFoLo7gkjlKgQudc+VMIkiVBMbVfOf9qOqMNXj/lmZkAf5q5JPiP0vmofyqejFPUA37KFRjqExX2rEXTR7WAFzzWZgk7afDBpCNGwYSirzp710/XNfmQ6Ty8xk3r+DnTxrUrYhY3CkanTAgMBAAECgYA8WMkqLKAYUQPSVLKxC20xzlZKbCNF9rzMMK0d5DB/xeGCwxtp5/9vnXnO8X5d7xYAbM1gp5qwaQzy3fYr31UcxHiFTcZMgvN6z32FNBEkejCLaKIFZjaMBn36dStdzpAP+OOclwpXDGpGQO0UKLKshAfl5dsS+fq+nHpOugz52QJBAPUCG9Xzy5TrMiqL9n1TLe1qR+ALfELZHFheevIkyShJtcqlte8u640H0CHDXF9lniisMFn4xChqkxiTUsees58CQQCnxYDP+JfmqORO4Cx2DLCCqOpaOkuxdZo8eSh80s3zbmtdqoMpeYZglVNLuSYKNul8WWF3qeGqcnLULDE6P31NAkEAtSLt+WvYoyyPVi1L+rO4TMI6iUV0hOeGsT6InuTbY1G7eSqyKzcBJq8UDSIl9NFn8KH8zUfBni/MuGqS1Mpb+QJATiPTBwpF1Yy8KXCHxMPMQk7iN/wG3TRlDd1wWhLlEYhQQWP1iw+q4rkp/o7RhNhmjyAiIVXiYTzE9sVOeE6x0QJBAJYmBmOKfxw3rzpjDU+e9I6w0AbpiBzlnviEToZfnDwVH9mjF++H/wDRTDqozIiAE2aN/wqXwqhoWGgVWMlp9Xc="; + //String privateKey = getPrivateKey(keyMap); + //生产 + String privateKey="MIICdQIBADANBgkqhkiG9w0BAQEFAASCAl8wggJbAgEAAoGBAIfMv5TT16mQECefZXgcIANf2BDGlbiJDdyQzRgxfkJF71JLNttEi1gyc6wiOiCPf2BebtxgkiAT3XBCA0kg2QPrkPZOb7u9iAszLDztgGVM43FDjzhFbujk5+rPvYcRczJ+92ksgnmVOF56oeakvbS82Sr4KS4fGFU+VihWX/W7AgMBAAECgYAjblVR9E+havf8Dod/5f6oQrpx7g4kPoYCVTldpZQmoG6Hjx456VFd6pPphmiaFDaMozbTgtK9UdGFt4N58fsMvHG1vSZ5jH6jXW+xGsCpiHp24s6kXlRDPnX1AstezrIcXa+37CJua80/DUXMRysJcByW3HnGmwjKM21EqiyMUQJBAMCgZN/4I5bnUc/gsOwl0Vunp8jtXoMa/dDFyIE7SCNQlkjfTTkzTrQRaHXeDRKBlzLUB0TNMv6gbH4xxAuGY7kCQQC0ejrDRz2O17O+ETlqQ3jubxMLq2ZfhUGWwgJQ5gXT0PgM5Bauv7NygHaxKmmN0EAqk1NTDV0ao3VJOvuLUIcTAkBfJpvNurAx2aAjFHWwoNmy8bVC3mYiUxHvr9NkatkugJ9L7eoiiEKnVjYIiyBf9N2wQOY6STaYarxM9d5GZyMZAkBS8UWmT0xMJHe3pyTS4FVohuWi3E+9IHnHNjxoP354HTaSfhSqlPF8cuuZeltuUEHdDz4hEigywOJ7GD9YhFa/AkBjxKsb4qfJeaz+zxcFHekWaFhgdvpx2/bov9y/wP/HEZo8NRsa1I0wVBiWhSRltYrQU7jMHafnrhiqQUW3BKhm"; + System.out.println("字符类型私钥:" + privateKey); + String s = RSA.encrypt("331081198909263032",publicKey); + System.out.println(s); + + //String s = "nRpkxT2XTYQvQl/xIqgVuIg3d1ezs/QuKZGm2UxAVJiwHN8F3E6jKr6/Ujt1ZODdlt9mPh7+WUepm/7OdbkPiDzoDufFBcscfVzRKpgG7yj0VEhqv4HGTxc5PX3dFKWRGIW4+x02StDezlTRDbhRGn9qNRZhJXTMsHITekM1+YY="; + //s = URLDecoder.decode(s,"utf-8"); + String v = RSA.decrypt(s,privateKey); + System.out.println(v); +// System.out.println("公钥加密——私钥解密---------------"); +// System.out.println(""); +// String source = "9527001"; +// System.out.println("\r加密前文字:\r\n" + source); +// byte[] data = source.getBytes(); +// byte[] encodedData = encryptByPublicKey(data, publicKey); +// System.out.println("加密后文字:\r\n" + encryptBASE64(encodedData)); +// +// byte[] decodedData = decryptByPrivateKey(encodedData, privateKey); +// String target = new String(decodedData); +// System.out.println("解密后文字: \r\n" + target); + +// System.out.println(v); + +// String s1 = RSA.encrypt("Eshop@2022",publicKey); +// System.out.println(s1); +// String s2 = RSA.encrypt("Eshop@2021",publicKey); +// System.out.println(s2); + + + } catch (Exception e) { + e.printStackTrace(); + } + } + + + /** + * String转私钥PrivateKey + * + * @param key + * @return + * @throws Exception + */ + public static PrivateKey getPrivateKey(String key) throws Exception { + byte[] keyBytes; + keyBytes = org.apache.commons.codec.binary.Base64.decodeBase64(key); + PKCS8EncodedKeySpec keySpec = new PKCS8EncodedKeySpec(keyBytes); + KeyFactory keyFactory = KeyFactory.getInstance("RSA"); + PrivateKey privateKey = keyFactory.generatePrivate(keySpec); + return privateKey; + } +} diff --git a/src/main/java/com/chinaunicom/mall/ebtp/login/controller/EshopMenuController.java b/src/main/java/com/chinaunicom/mall/ebtp/login/controller/EshopMenuController.java new file mode 100644 index 0000000..3bd86b0 --- /dev/null +++ b/src/main/java/com/chinaunicom/mall/ebtp/login/controller/EshopMenuController.java @@ -0,0 +1,42 @@ +package com.chinaunicom.mall.ebtp.login.controller; + + +import com.chinaunicom.mall.ebtp.login.entity.EshopMenuConverter; +import com.chinaunicom.mall.ebtp.login.entity.EshopMenuQuery; +import com.chinaunicom.mall.ebtp.login.service.EshopMenuService; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.*; + +import java.util.List; + +/** + * 菜单权限表 前端控制器 + * + * @author wangwj + * @since 2020-12-08 + */ +@Api(tags = "菜单权限管理") +@RestController +@RequestMapping("/v1.0/menu") +public class EshopMenuController{ + + @Autowired + private EshopMenuService eshopMenuService; + + /** + * 根据角色查询顶级权限 + * @param body + * @return BasePageResponse + * @author chentao + * @date 2021-1-13 + * @update [序号][日期YYYY-MM-DD] [更改人姓名][变更描述] + */ + @ApiOperation(value = "根据角色查询顶级权限", notes = "根据角色查询顶级权限") + @PostMapping("/findTopMenuList") + public List findTopMenuList(@RequestBody EshopMenuQuery body) { + return this.eshopMenuService.findTopMenuList(body); + } + +} diff --git a/src/main/java/com/chinaunicom/mall/ebtp/login/controller/LoginController.java b/src/main/java/com/chinaunicom/mall/ebtp/login/controller/LoginController.java new file mode 100644 index 0000000..f8bc66d --- /dev/null +++ b/src/main/java/com/chinaunicom/mall/ebtp/login/controller/LoginController.java @@ -0,0 +1,60 @@ +package com.chinaunicom.mall.ebtp.login.controller; + + +import com.chinaunicom.mall.ebtp.common.base.entity.BaseCacheUser; +import com.chinaunicom.mall.ebtp.common.base.entity.BaseResponse; +import com.chinaunicom.mall.ebtp.common.exception.common.CommonExceptionEnum; +import com.chinaunicom.mall.ebtp.login.common.CaptchaGenerator; +import com.chinaunicom.mall.ebtp.login.entity.BaseSelf; +import com.chinaunicom.mall.ebtp.login.service.BaseUserService; + +import com.chinaunicom.mall.ebtp.login.vo.LoginUserVo; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import lombok.extern.slf4j.Slf4j; +import org.springframework.web.bind.annotation.*; + +import javax.annotation.Resource; +import javax.servlet.http.Cookie; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; + +@Slf4j +@RestController +@Api(tags = "登录") +@RequestMapping("/v1/login") +public class LoginController { + + @Resource + private BaseUserService iBaseUserService; + @Resource + private CaptchaGenerator captchaGenerator; + + /** + * 获取图形验证码 + * @return + */ + @ApiOperation("获取图形验证码") + @GetMapping("/getCaptcha") + public BaseResponse getCaptcha(){ + return BaseResponse.success(captchaGenerator.getCaptcha()); + } + /** + * 账号 密码 图形验证码 + * @param vo + * @return + */ + @ApiOperation("账号登录") + @PostMapping("/accountLogin") + public BaseResponse idcardLogin(HttpServletResponse response,@RequestBody LoginUserVo vo) { + if(true||captchaGenerator.checkCaptcha(vo.getIdentifying(),vo.getEncryptValue())){ + BaseSelf self = iBaseUserService.idcardLogin(vo.getAccount(), vo.getPassword()); + this.iBaseUserService.setCookie(response,"mall3_token",self.getToken()); + return BaseResponse.success(self); + }else{ + CommonExceptionEnum.FRAME_EXCEPTION_COMMON_DATA_OTHER_ERROR.customValidName("验证码无效",true); + return BaseResponse.success(null); + } + } + +} diff --git a/src/main/java/com/chinaunicom/mall/ebtp/login/dao/BaseUserMapper.java b/src/main/java/com/chinaunicom/mall/ebtp/login/dao/BaseUserMapper.java new file mode 100644 index 0000000..66156ff --- /dev/null +++ b/src/main/java/com/chinaunicom/mall/ebtp/login/dao/BaseUserMapper.java @@ -0,0 +1,21 @@ +package com.chinaunicom.mall.ebtp.login.dao; + + +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.chinaunicom.mall.ebtp.cloud.security.starter.entity.AuthorityEntity; +import com.chinaunicom.mall.ebtp.common.base.dao.IBaseMapper; +import com.chinaunicom.mall.ebtp.login.entity.*; +import org.apache.ibatis.annotations.Param; +import org.springframework.stereotype.Repository; + +import java.util.List; + +@Repository +public interface BaseUserMapper extends IBaseMapper { + public IPage selectOrgnUser(IPage page, @Param("vo") BaseUserSelect vo); + public BaseUserSelectVo getUserById(@Param("id") String id, @Param("orgnId") String orgnId); + public List getUserByObject(@Param("vo") BaseUserSelectVo vo); + + public List selectRoleByUserId(@Param("userId") String userId); + public List selectOrgnByUserId(@Param("userId") String userId); +} diff --git a/src/main/java/com/chinaunicom/mall/ebtp/login/dao/BaseUserTokenMapper.java b/src/main/java/com/chinaunicom/mall/ebtp/login/dao/BaseUserTokenMapper.java new file mode 100644 index 0000000..d2e1500 --- /dev/null +++ b/src/main/java/com/chinaunicom/mall/ebtp/login/dao/BaseUserTokenMapper.java @@ -0,0 +1,10 @@ +package com.chinaunicom.mall.ebtp.login.dao; + + +import com.chinaunicom.mall.ebtp.common.base.dao.IBaseMapper; +import com.chinaunicom.mall.ebtp.login.entity.BaseUserToken; +import org.springframework.stereotype.Repository; + +@Repository +public interface BaseUserTokenMapper extends IBaseMapper { +} diff --git a/src/main/java/com/chinaunicom/mall/ebtp/login/dao/EshopMenuMapper.java b/src/main/java/com/chinaunicom/mall/ebtp/login/dao/EshopMenuMapper.java new file mode 100644 index 0000000..00aef72 --- /dev/null +++ b/src/main/java/com/chinaunicom/mall/ebtp/login/dao/EshopMenuMapper.java @@ -0,0 +1,15 @@ +package com.chinaunicom.mall.ebtp.login.dao; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.chinaunicom.mall.ebtp.login.entity.EshopMenuConverter; +import com.chinaunicom.mall.ebtp.login.entity.EshopMenuPO; +import org.apache.ibatis.annotations.Param; +import org.mapstruct.Mapper; + +import java.util.List; + +@Mapper +public interface EshopMenuMapper extends BaseMapper { + + List findTopMenuList(@Param("roleId") String roleId); +} diff --git a/src/main/java/com/chinaunicom/mall/ebtp/login/dao/mapper/BaseUserMapper.xml b/src/main/java/com/chinaunicom/mall/ebtp/login/dao/mapper/BaseUserMapper.xml new file mode 100644 index 0000000..a805531 --- /dev/null +++ b/src/main/java/com/chinaunicom/mall/ebtp/login/dao/mapper/BaseUserMapper.xml @@ -0,0 +1,153 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/main/java/com/chinaunicom/mall/ebtp/login/dao/mapper/BaseUserTokenMapper.xml b/src/main/java/com/chinaunicom/mall/ebtp/login/dao/mapper/BaseUserTokenMapper.xml new file mode 100644 index 0000000..1bb5ae4 --- /dev/null +++ b/src/main/java/com/chinaunicom/mall/ebtp/login/dao/mapper/BaseUserTokenMapper.xml @@ -0,0 +1,21 @@ + + + + + + + + + + + + + + + + update base_user_token + set + delete_flag="1" + where ID=#{id } + + \ No newline at end of file diff --git a/src/main/java/com/chinaunicom/mall/ebtp/login/dao/mapper/EshopMenuMapper.xml b/src/main/java/com/chinaunicom/mall/ebtp/login/dao/mapper/EshopMenuMapper.xml new file mode 100644 index 0000000..32e88d4 --- /dev/null +++ b/src/main/java/com/chinaunicom/mall/ebtp/login/dao/mapper/EshopMenuMapper.xml @@ -0,0 +1,59 @@ + + + + + + + sp.menu_id, + sp.menu_name, + sp.parent_id, + sp.menu_, + sp.menu_order, + sp.menu_url, + sp.componet, + sp.menu_frame, + sp.menu_type, + sp.menu_visible, + sp.menu_status, + sp.menu_perms, + sp.menu_icon, + sp.menu_scope, + sp.menu_ou, + sp.menu_auth, + sp.tenant_id + + + + + + diff --git a/src/main/java/com/chinaunicom/mall/ebtp/login/entity/BaseOrgn.java b/src/main/java/com/chinaunicom/mall/ebtp/login/entity/BaseOrgn.java new file mode 100644 index 0000000..035a2e1 --- /dev/null +++ b/src/main/java/com/chinaunicom/mall/ebtp/login/entity/BaseOrgn.java @@ -0,0 +1,127 @@ +package com.chinaunicom.mall.ebtp.login.entity; + +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import com.fasterxml.jackson.annotation.JsonFormat; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.experimental.Accessors; +import org.springframework.format.annotation.DateTimeFormat; + +import java.io.Serializable; +import java.time.LocalDateTime; + +/** +* 实体类 BaseOrgn-组织机构信息 +* +* @author yss +*/ +@Data +@Accessors(chain = true) +@TableName(value = "base_orgn", autoResultMap = true) +@ApiModel(value = "BaseOrgn对象", description = "组织机构信息") +public class BaseOrgn implements Serializable { + + private static final long serialVersionUID = 1L; + + @TableId + @ApiModelProperty(value = "索引id") + private String id; + + @ApiModelProperty(value = "父id.表内关联") + private String pid; + + @ApiModelProperty(value = "系统编号") + private String code; + + @ApiModelProperty(value = "组织机构名称.如'软件研发部'.是组织树的节点名称") + private String name; + + @ApiModelProperty(value = "组织结构全程.如'产业互联网中心软件研发部'.是选项时的节点名称") + private String fullname; + + @ApiModelProperty(value = "注册地址-三级地址 -分割") + private String registerAddress; + + @ApiModelProperty(value = "详细地址") + private String registerAddress2; + + @ApiModelProperty(value = "企业地址-三级地址 -分割") + private String enterpriseAddress; + + @ApiModelProperty(value = "企业地址") + private String enterpriseAddress2; + + @ApiModelProperty(value = "用户类型 1、招标人,2、代理机构,3、评标专家单位") + private String userType; + + @ApiModelProperty(value = "企业类型 1、国有 2 私营 3合资 4独资 5全民所有制 6集体所有制 8股份制 9有限责任") + private String orgnType; + + @ApiModelProperty(value = "注册资金") + private String registeredCapital; + + @ApiModelProperty(value = "邮编") + private String zipCode; + + @ApiModelProperty(value = "成立时间") + private String foundingTime; + + @ApiModelProperty(value = "联系人") + private String contacts; + + @ApiModelProperty(value = "联系电话") + private String tel; + + @ApiModelProperty(value = "邮箱") + private String email; + + @ApiModelProperty(value = "传真") + private String fax; + + @ApiModelProperty(value = "统一社会信用代码") + private String uscc; + + @ApiModelProperty(value = "统一社会信用代码证") + private String usccFileId; + + @ApiModelProperty(value = "营业执照") + private String businessLicenseFileId; + + @ApiModelProperty(value = "其他资质证明") + private String otherFileId; + + @ApiModelProperty(value = "法人信息 json [{\"name\":\"张三\",“duty”:\"董事长\",\"title\":\"高级工程师\",\"idcard\":\"223323232\"}]") + private String legalRepresentative; + + @ApiModelProperty(value = "负责人信息 json [{\"name\":\"张三\",“duty”:\"董事长\",\"title\":\"高级工程师\",\"idcard\":\"223323232\"}]") + private String head; + + @ApiModelProperty(value = "审批状态 0 未提交 1 待审批 2审批通过 -1 审批未通过") + private String status; + + @ApiModelProperty(value = "申请类型 1、入库 2、变更") + private String submitType; + + @ApiModelProperty(value = "未通过原因") + private String reason; + + @ApiModelProperty(value = "版本号") + private String version; + + @ApiModelProperty(value = "创建人") + private String createby; + + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss") + @ApiModelProperty(value = "") + private LocalDateTime createtime; + + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss") + @ApiModelProperty(value = "") + private LocalDateTime updatetime; + + +} diff --git a/src/main/java/com/chinaunicom/mall/ebtp/login/entity/BaseOrgnR.java b/src/main/java/com/chinaunicom/mall/ebtp/login/entity/BaseOrgnR.java new file mode 100644 index 0000000..3b21ac7 --- /dev/null +++ b/src/main/java/com/chinaunicom/mall/ebtp/login/entity/BaseOrgnR.java @@ -0,0 +1,30 @@ +package com.chinaunicom.mall.ebtp.login.entity; + +import com.baomidou.mybatisplus.annotation.TableId; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.experimental.Accessors; + +import java.io.Serializable; + +/** +* 实体类 BaseOrgn-组织机构信息 +* +* @author yss +*/ +@Data +@Accessors(chain = true) +@ApiModel(value = "BaseOrgn对象", description = "机构列表") +public class BaseOrgnR implements Serializable { + + private static final long serialVersionUID = 1L; + + @TableId + @ApiModelProperty(value = "索引id") + private String orgnId; + + @ApiModelProperty(value = "组织机构名称.如'软件研发部'.是组织树的节点名称") + private String orgnName; + +} diff --git a/src/main/java/com/chinaunicom/mall/ebtp/login/entity/BaseRole.java b/src/main/java/com/chinaunicom/mall/ebtp/login/entity/BaseRole.java new file mode 100644 index 0000000..46901a5 --- /dev/null +++ b/src/main/java/com/chinaunicom/mall/ebtp/login/entity/BaseRole.java @@ -0,0 +1,47 @@ +package com.chinaunicom.mall.ebtp.login.entity; + +import com.baomidou.mybatisplus.annotation.TableName; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.experimental.Accessors; + +import java.io.Serializable; + +/** + * 功能模块bean + * + * @author zyx + */ +@Data +@Accessors(chain = true) +@ApiModel +@TableName(value = "maint_base_role", autoResultMap = true) +public class BaseRole implements Serializable { + + private static final Long serialVersionUID = 1L; + + /** + * 姓名 + */ + @ApiModelProperty(value = "角色") + private String role; + + /** + * 账号 + */ + @ApiModelProperty(value = "备注") + private String remarks; + + /** + * role_id + */ + @ApiModelProperty(value = "role_id") + private String roleId; + + /** + * 账号 + */ + @ApiModelProperty(value = "状态,0-默认") + private int status; +} diff --git a/src/main/java/com/chinaunicom/mall/ebtp/login/entity/BaseRoleOrgn.java b/src/main/java/com/chinaunicom/mall/ebtp/login/entity/BaseRoleOrgn.java new file mode 100644 index 0000000..7a0e5c7 --- /dev/null +++ b/src/main/java/com/chinaunicom/mall/ebtp/login/entity/BaseRoleOrgn.java @@ -0,0 +1,36 @@ +package com.chinaunicom.mall.ebtp.login.entity; + +import com.baomidou.mybatisplus.annotation.TableId; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.experimental.Accessors; + +import java.io.Serializable; +import java.util.List; + +/** +* 实体类 BaseRole-角色表 +* +* @author yss +*/ +@Data +@Accessors(chain = true) +@ApiModel(value = "BaseRole对象", description = "显示角色表") +public class BaseRoleOrgn implements Serializable { + + private static final long serialVersionUID = 1L; + + @TableId + @ApiModelProperty(value = "") + private String roleId; + + @ApiModelProperty(value = "") + private String roleName; + + @ApiModelProperty(value = "") + private String roleCode; + + @ApiModelProperty(value = "机构列表") + private List baseOrgnList; +} diff --git a/src/main/java/com/chinaunicom/mall/ebtp/login/entity/BaseRoleOrgnVo.java b/src/main/java/com/chinaunicom/mall/ebtp/login/entity/BaseRoleOrgnVo.java new file mode 100644 index 0000000..6c7af10 --- /dev/null +++ b/src/main/java/com/chinaunicom/mall/ebtp/login/entity/BaseRoleOrgnVo.java @@ -0,0 +1,39 @@ +package com.chinaunicom.mall.ebtp.login.entity; + +import com.baomidou.mybatisplus.annotation.TableId; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.experimental.Accessors; + +import java.io.Serializable; +import java.util.List; + +/** +* 实体类 BaseRole-角色表 +* +* @author yss +*/ +@Data +@Accessors(chain = true) +@ApiModel(value = "BaseRole对象", description = "显示角色表") +public class BaseRoleOrgnVo implements Serializable { + + private static final long serialVersionUID = 1L; + + @TableId + @ApiModelProperty(value = "") + private String roleId; + + @ApiModelProperty(value = "") + private String roleName; + + @ApiModelProperty(value = "") + private String roleCode; + + @ApiModelProperty(value = "") + private String orgnId; + + @ApiModelProperty(value = "") + private String orgnName; +} diff --git a/src/main/java/com/chinaunicom/mall/ebtp/login/entity/BaseSelf.java b/src/main/java/com/chinaunicom/mall/ebtp/login/entity/BaseSelf.java new file mode 100644 index 0000000..69d4d39 --- /dev/null +++ b/src/main/java/com/chinaunicom/mall/ebtp/login/entity/BaseSelf.java @@ -0,0 +1,41 @@ +package com.chinaunicom.mall.ebtp.login.entity; + + +import lombok.Data; + +import java.util.List; + +/** + * @author ligen + * + */ +@Data +public class BaseSelf { + + /** + * token + */ + private String token; + /** + * previoustoken + */ + private String previoustoken; + + /** + * 登陆ip + */ + private String ip; + + /** + * + */ + private BaseUser user; //user + /** + * 所属机构 + */ + private BaseOrgn orgn; + /** + * 所属机构 + */ + private List orgnList; +} diff --git a/src/main/java/com/chinaunicom/mall/ebtp/login/entity/BaseTelIdcard.java b/src/main/java/com/chinaunicom/mall/ebtp/login/entity/BaseTelIdcard.java new file mode 100644 index 0000000..0f2853e --- /dev/null +++ b/src/main/java/com/chinaunicom/mall/ebtp/login/entity/BaseTelIdcard.java @@ -0,0 +1,49 @@ +package com.chinaunicom.mall.ebtp.login.entity; + +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import com.fasterxml.jackson.annotation.JsonFormat; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.experimental.Accessors; +import org.springframework.format.annotation.DateTimeFormat; + +import java.io.Serializable; +import java.time.LocalDateTime; + +/** +* 实体类 BaseTelIdcard- +* +* @author yss +*/ +@Data +@Accessors(chain = true) +@TableName(value = "base_tel_idcard", autoResultMap = true) +@ApiModel(value = "BaseTelIdcard对象", description = "") +public class BaseTelIdcard implements Serializable { + + private static final long serialVersionUID = 1L; + + @TableId + @ApiModelProperty(value = "") + private String id; + + @ApiModelProperty(value = "手机号") + private String tel; + + @ApiModelProperty(value = "验证码") + private String idcard; + + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss") + @ApiModelProperty(value = "有效时间") + private LocalDateTime effectiveTime; + + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss") + @ApiModelProperty(value = "发送时间") + private LocalDateTime sendTime; + + +} diff --git a/src/main/java/com/chinaunicom/mall/ebtp/login/entity/BaseUser.java b/src/main/java/com/chinaunicom/mall/ebtp/login/entity/BaseUser.java new file mode 100644 index 0000000..d37289a --- /dev/null +++ b/src/main/java/com/chinaunicom/mall/ebtp/login/entity/BaseUser.java @@ -0,0 +1,115 @@ +package com.chinaunicom.mall.ebtp.login.entity; + +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import com.fasterxml.jackson.annotation.JsonFormat; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.experimental.Accessors; +import org.springframework.format.annotation.DateTimeFormat; + +import java.io.Serializable; +import java.time.LocalDateTime; +import java.util.List; + +/** +* 实体类 BaseUser-用户基本信息表 +* +* @author yss +*/ +@Data +@Accessors(chain = true) +@TableName(value = "base_user", autoResultMap = true) +@ApiModel(value = "BaseUser对象", description = "用户基本信息表") +public class BaseUser implements Serializable { + + private static final long serialVersionUID = 1L; + + @TableId + @ApiModelProperty(value = "") + private String id; + + @ApiModelProperty(value = "账号用户名") + private String account; + + @ApiModelProperty(value = "密码") + private String password; + + @ApiModelProperty(value = "RSA") + private String rsa; + + @ApiModelProperty(value = "HR编号") + private String code; + + @ApiModelProperty(value = "姓名") + private String name; + + @ApiModelProperty(value = "") + private String abbr; + + @ApiModelProperty(value = "性别") + private String sex; + + @ApiModelProperty(value = "证件类型") + private String idType; + + @ApiModelProperty(value = "身份证号") + private String idcard; + + @ApiModelProperty(value = "电话号码") + private String phone; + + @ApiModelProperty(value = "邮箱地址") + private String email; + + @ApiModelProperty(value = "地址") + private String address; + + @ApiModelProperty(value = "使能") + private String active; + + @ApiModelProperty(value = "备注") + private String remark; + + @ApiModelProperty(value = "来源:1联通内部员工 2合作方账号/招标代理") + private String sourceType; + @ApiModelProperty(value = "联通邮箱") + private String unicomEmail; + + @ApiModelProperty(value = "合作方账号") + private String cuecpAccount; + + @ApiModelProperty(value = "状态 0冻结 1在用") + private String status; + + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss") + @ApiModelProperty(value = "") + private LocalDateTime createtime; + + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss") + @ApiModelProperty(value = "") + private LocalDateTime updatetime; + /** + * 所属机构 + */ + @TableField(exist = false) + private BaseOrgn orgn; + + /** + * 角色 + */ + @TableField(exist = false) + private List roleOrgnList; + + /** + * 权限 + */ + @TableField(exist = false) + private String roleId; + @ApiModelProperty("割接状态;0-割接数据,1-新数据") + private Integer cutoverStatus; +} diff --git a/src/main/java/com/chinaunicom/mall/ebtp/login/entity/BaseUserSelect.java b/src/main/java/com/chinaunicom/mall/ebtp/login/entity/BaseUserSelect.java new file mode 100644 index 0000000..e90108b --- /dev/null +++ b/src/main/java/com/chinaunicom/mall/ebtp/login/entity/BaseUserSelect.java @@ -0,0 +1,41 @@ +package com.chinaunicom.mall.ebtp.login.entity; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.experimental.Accessors; + +import javax.validation.constraints.Min; +import javax.validation.constraints.NotNull; +import java.io.Serializable; + +/** +* 实体类 BaseUser-用户基本信息表 +* +* @author yss +*/ +@Data +@Accessors(chain = true) +public class BaseUserSelect implements Serializable { + + private static final long serialVersionUID = 1L; + + + @ApiModelProperty(value = "姓名") + private String name; + + @ApiModelProperty(value = "机构id") + private String orgnId; + + @ApiModelProperty(value = "角色 4、业务经理 3、专家 2、专家管理员") + private String type; + + @ApiModelProperty("当前页") + @NotNull + @Min(0) + private Integer pageNo; + + @ApiModelProperty("每页显示条数") + @NotNull + @Min(0) + private Integer pageSize; +} diff --git a/src/main/java/com/chinaunicom/mall/ebtp/login/entity/BaseUserSelectVo.java b/src/main/java/com/chinaunicom/mall/ebtp/login/entity/BaseUserSelectVo.java new file mode 100644 index 0000000..82d9475 --- /dev/null +++ b/src/main/java/com/chinaunicom/mall/ebtp/login/entity/BaseUserSelectVo.java @@ -0,0 +1,84 @@ +package com.chinaunicom.mall.ebtp.login.entity; + +import com.fasterxml.jackson.annotation.JsonFormat; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.experimental.Accessors; +import org.springframework.format.annotation.DateTimeFormat; + +import javax.validation.constraints.Min; +import javax.validation.constraints.NotNull; +import java.time.LocalDateTime; + +/** +* 实体类 BaseUser-用户基本信息表 +* +* @author yss +*/ +@Data +@Accessors(chain = true) +@ApiModel(value = "BaseUser对象", description = "用户基本信息表") +public class BaseUserSelectVo { + + @ApiModelProperty(value = "") + private String id; + + @ApiModelProperty(value = "姓名") + private String name; + + @ApiModelProperty(value = "证件类型") + private String idType; + + @ApiModelProperty(value = "身份证号") + private String idcard; + + @ApiModelProperty(value = "密码") + private String password; + + @ApiModelProperty(value = "RSA") + private String rsa; + + @ApiModelProperty(value = "电话号码") + private String phone; + + @ApiModelProperty(value = "角色") + private String roleId; + + @ApiModelProperty(value = "角色") + private String roleName; + + @ApiModelProperty(value = "所属机构名称") + private String orgnName; + + @ApiModelProperty(value = "角色类型") + private String type; + + @ApiModelProperty(value = "状态 0冻结 1在用") + private String status; + + @ApiModelProperty(value = "来源:1联通内部员工 2合作方账号/招标代理") + private String sourceType; + + @ApiModelProperty(value = "联通邮箱") + private String unicomEmail; + + @ApiModelProperty(value = "合作方账号") + private String cuecpAccount; + + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss") + @ApiModelProperty(value = "") + private LocalDateTime updatetime; + + + @ApiModelProperty("当前页") + @NotNull + @Min(0) + private Integer pageNo; + + @ApiModelProperty("每页显示条数") + @NotNull + @Min(0) + private Integer pageSize; +} diff --git a/src/main/java/com/chinaunicom/mall/ebtp/login/entity/BaseUserToken.java b/src/main/java/com/chinaunicom/mall/ebtp/login/entity/BaseUserToken.java new file mode 100644 index 0000000..d245310 --- /dev/null +++ b/src/main/java/com/chinaunicom/mall/ebtp/login/entity/BaseUserToken.java @@ -0,0 +1,54 @@ +package com.chinaunicom.mall.ebtp.login.entity; + +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import com.fasterxml.jackson.annotation.JsonFormat; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.experimental.Accessors; +import org.springframework.format.annotation.DateTimeFormat; + +import java.io.Serializable; +import java.time.LocalDateTime; + +/** +* 实体类 BaseUserToken- +* +* @author yss +*/ +@Data +@Accessors(chain = true) +@TableName(value = "base_user_token", autoResultMap = true) +@ApiModel(value = "BaseUserToken对象", description = "") +public class BaseUserToken implements Serializable { + + private static final long serialVersionUID = 1L; + + @TableId + @ApiModelProperty(value = "") + private String id; + + @ApiModelProperty(value = "") + private String userId; + + @ApiModelProperty(value = "") + private String token; + + @ApiModelProperty(value = "1 生效/0 失效") + private Integer state; + + private String userObject; + + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss") + @ApiModelProperty(value = "创建时间") + private LocalDateTime createTime; + + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss") + @ApiModelProperty(value = "有效时间") + private LocalDateTime validTime; + + +} diff --git a/src/main/java/com/chinaunicom/mall/ebtp/login/entity/BuffeedImageVo.java b/src/main/java/com/chinaunicom/mall/ebtp/login/entity/BuffeedImageVo.java new file mode 100644 index 0000000..95cd4ab --- /dev/null +++ b/src/main/java/com/chinaunicom/mall/ebtp/login/entity/BuffeedImageVo.java @@ -0,0 +1,12 @@ +package com.chinaunicom.mall.ebtp.login.entity; + +import lombok.Data; + +import java.awt.image.BufferedImage; + +@Data +public class BuffeedImageVo { + + private String code; + private BufferedImage image; +} diff --git a/src/main/java/com/chinaunicom/mall/ebtp/login/entity/EshopMenuConverter.java b/src/main/java/com/chinaunicom/mall/ebtp/login/entity/EshopMenuConverter.java new file mode 100644 index 0000000..0b82edf --- /dev/null +++ b/src/main/java/com/chinaunicom/mall/ebtp/login/entity/EshopMenuConverter.java @@ -0,0 +1,29 @@ +package com.chinaunicom.mall.ebtp.login.entity; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.util.List; + +@Data +public class EshopMenuConverter { + private static final long serialVersionUID = 1L; + @ApiModelProperty("主键") + private String menuId; + @ApiModelProperty("路由地址") + private String path; + @ApiModelProperty("菜单名称") + private String name; + @ApiModelProperty("菜单图标") + private String icon; + @ApiModelProperty("系统标识") + private String menuScope; + @ApiModelProperty("地市等级标识") + private String menuOu; + @ApiModelProperty("是否顶级标识:0 是,1 否") + private Integer isTop; + @ApiModelProperty("菜单图标") + private List children; + @ApiModelProperty("feign调用成功或失败的标识 true:为feign调用成功 down:feign调用失败") + private String feignFlag; +} diff --git a/src/main/java/com/chinaunicom/mall/ebtp/login/entity/EshopMenuConverterChildren.java b/src/main/java/com/chinaunicom/mall/ebtp/login/entity/EshopMenuConverterChildren.java new file mode 100644 index 0000000..1cdc4f1 --- /dev/null +++ b/src/main/java/com/chinaunicom/mall/ebtp/login/entity/EshopMenuConverterChildren.java @@ -0,0 +1,14 @@ +package com.chinaunicom.mall.ebtp.login.entity; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +@Data +public class EshopMenuConverterChildren { + @ApiModelProperty("路由地址") + private String path; + @ApiModelProperty("菜单名称") + private String name; + @ApiModelProperty("外链标识(N-非外链、Y-外链,S-3.0内部外链)") + private String frame; +} diff --git a/src/main/java/com/chinaunicom/mall/ebtp/login/entity/EshopMenuPO.java b/src/main/java/com/chinaunicom/mall/ebtp/login/entity/EshopMenuPO.java new file mode 100644 index 0000000..6d19806 --- /dev/null +++ b/src/main/java/com/chinaunicom/mall/ebtp/login/entity/EshopMenuPO.java @@ -0,0 +1,79 @@ +package com.chinaunicom.mall.ebtp.login.entity; + +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import com.chinaunicom.mall.ebtp.common.base.entity.BaseEntity; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; + +/** + *

+ * 菜单权限表 + *

+ * + * @author zhqbin + * @since 2025-04-10 + */ +@Data +@EqualsAndHashCode(callSuper = true) +@TableName("eshop_menu") +@ApiModel(value="EshopMenuPO对象", description="菜单权限表") +public class EshopMenuPO extends BaseEntity { + + private static final long serialVersionUID = 1L; + + @ApiModelProperty(value = "主键") + @TableId(value = "menu_id") + private String menuId; + + @ApiModelProperty(value = "菜单名称") + private String menuName; + + @ApiModelProperty(value = "父菜单ID") + private String parentId; + + @ApiModelProperty(value = "显示顺序") + private Integer menuOrder; + + @ApiModelProperty(value = "路由地址") + private String menuUrl; + + @ApiModelProperty(value = "组件地址") + private String componet; + + @ApiModelProperty(value = "是否为外链(Y-是 N-否)") + private String menuFrame; + + @ApiModelProperty(value = "菜单类型(menu-菜单 folder-目录 operation-操作)") + private String menuType; + + @ApiModelProperty(value = "显示状态(show-显示 hide-隐藏)") + private String menuVisible; + + @ApiModelProperty(value = "菜单状态(valid-正常 invalid-停用)") + private String menuStatus; + + @ApiModelProperty(value = "权限标识") + private String menuPerms; + + @ApiModelProperty(value = "菜单图标") + private String menuIcon; + + @ApiModelProperty(value = "系统标识") + private String menuScope; + + @ApiModelProperty(value = "地市等级标识") + private String menuOu; + + @ApiModelProperty(value = "是否可授权(Y-是 N-否)") + private String menuAuth; + + @ApiModelProperty(value = "是否悬浮(Y-是 N-否)") + private String menuSuspension; + + @ApiModelProperty(value = "是否默认展示标识 (Y-是 N-否)") + private String menuDefault; + +} diff --git a/src/main/java/com/chinaunicom/mall/ebtp/login/entity/EshopMenuQuery.java b/src/main/java/com/chinaunicom/mall/ebtp/login/entity/EshopMenuQuery.java new file mode 100644 index 0000000..7f2cd26 --- /dev/null +++ b/src/main/java/com/chinaunicom/mall/ebtp/login/entity/EshopMenuQuery.java @@ -0,0 +1,61 @@ +package com.chinaunicom.mall.ebtp.login.entity; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.util.List; +import java.util.Map; + +@Data +public class EshopMenuQuery { + @ApiModelProperty("角色ID") + private String roleId; + @ApiModelProperty("主键") + private String menuId; + @ApiModelProperty("菜单名称") + private String menuName; + @ApiModelProperty("父菜单ID") + private String parentId; + @ApiModelProperty("显示顺序") + private Integer menuOrder; + @ApiModelProperty("路由地址") + private String menuUrl; + @ApiModelProperty("组件地址") + private String componet; + @ApiModelProperty("是否为外链(Y-是 N-否)") + private String menuFrame; + @ApiModelProperty("菜单类型(menu-菜单 folder-目录 operation-操作)") + private String menuType; + @ApiModelProperty("显示状态(show-显示 hide-隐藏)") + private String menuVisible; + @ApiModelProperty("菜单状态(valid-正常 invalid-停用)") + private String menuStatus; + @ApiModelProperty("权限标识") + private String menuPerms; + @ApiModelProperty("菜单图标") + private String menuIcon; + @ApiModelProperty("菜单范围") + private String menuScope; + @ApiModelProperty("地市等级标识") + private String menuOu; + @ApiModelProperty("菜单id集合") + private List menuIdList; + @ApiModelProperty("角色ID集合") + private List roleIdList; + @ApiModelProperty("集团、省(市)角色标识 0 集团, 1 省(市)") + private String classFlag; + @ApiModelProperty("角色ID集合 key为角色id value为集团、省(市)标识") + private List> roleMap; + @ApiModelProperty("是否可授权(Y-是 N-否)") + private String menuAuth; + @ApiModelProperty("是否悬浮(Y-是 N-否)") + private String menuSuspension; + @ApiModelProperty("角色范围") + private String roleScope; + @ApiModelProperty("中心编码") + private String centerCode; + @ApiModelProperty("操作标识(add-新增 edit-修改)") + private String operationType; + @ApiModelProperty("是否默认展示标识 (Y-是 N-否)") + private String menuDefault; +} diff --git a/src/main/java/com/chinaunicom/mall/ebtp/login/service/BaseUserService.java b/src/main/java/com/chinaunicom/mall/ebtp/login/service/BaseUserService.java new file mode 100644 index 0000000..3ba711e --- /dev/null +++ b/src/main/java/com/chinaunicom/mall/ebtp/login/service/BaseUserService.java @@ -0,0 +1,28 @@ +package com.chinaunicom.mall.ebtp.login.service; + +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.chinaunicom.mall.ebtp.cloud.security.starter.entity.SecurityEntity; +import com.chinaunicom.mall.ebtp.common.base.entity.BaseCacheUser; +import com.chinaunicom.mall.ebtp.common.base.service.IBaseService; +import com.chinaunicom.mall.ebtp.login.entity.BaseSelf; +import com.chinaunicom.mall.ebtp.login.entity.BaseUser; +import com.chinaunicom.mall.ebtp.login.entity.BaseUserSelect; +import com.chinaunicom.mall.ebtp.login.entity.BaseUserSelectVo; + +import javax.servlet.http.HttpServletResponse; +import java.util.List; + +/** + * 对数据表 base_user 操作的 service + * @author yss + * + */ +public interface BaseUserService extends IBaseService { + + BaseSelf idcardLogin(String account, String password); + String getUserHost(); + BaseSelf getRequestUser(); + void setCookie(HttpServletResponse response, String name, String value); + + SecurityEntity bdCheckToken(String token); +} diff --git a/src/main/java/com/chinaunicom/mall/ebtp/login/service/BaseUserTokenService.java b/src/main/java/com/chinaunicom/mall/ebtp/login/service/BaseUserTokenService.java new file mode 100644 index 0000000..df1a0cb --- /dev/null +++ b/src/main/java/com/chinaunicom/mall/ebtp/login/service/BaseUserTokenService.java @@ -0,0 +1,17 @@ +package com.chinaunicom.mall.ebtp.login.service; + + +import com.chinaunicom.mall.ebtp.common.base.service.IBaseService; +import com.chinaunicom.mall.ebtp.login.entity.BaseUserToken; + +/** + * 对数据表 base_user_token 操作的 service + * @author yss + * + */ +public interface BaseUserTokenService extends IBaseService { + + + boolean refreshToken(BaseUserToken baseUserToken); + boolean saveToken(String id, String userId, String token); +} diff --git a/src/main/java/com/chinaunicom/mall/ebtp/login/service/EshopMenuService.java b/src/main/java/com/chinaunicom/mall/ebtp/login/service/EshopMenuService.java new file mode 100644 index 0000000..5a33d9e --- /dev/null +++ b/src/main/java/com/chinaunicom/mall/ebtp/login/service/EshopMenuService.java @@ -0,0 +1,27 @@ +package com.chinaunicom.mall.ebtp.login.service; + + +import com.chinaunicom.mall.ebtp.login.entity.EshopMenuConverter; +import com.chinaunicom.mall.ebtp.login.entity.EshopMenuQuery; + +import java.util.List; + +/** + *

+ * 菜单权限表 服务类 + *

+ * + * @author wangwj + * @since 2020-12-08 + */ +public interface EshopMenuService { + /** + * 根据角色查询顶级权限 + * @param body + * @return BasePageResponse + * @author chentao + * @date 2021-1-13 + * @update [序号][日期YYYY-MM-DD] [更改人姓名][变更描述] + */ + List findTopMenuList(EshopMenuQuery body); +} diff --git a/src/main/java/com/chinaunicom/mall/ebtp/login/service/impl/BaseUserServiceImpl.java b/src/main/java/com/chinaunicom/mall/ebtp/login/service/impl/BaseUserServiceImpl.java new file mode 100644 index 0000000..320fb47 --- /dev/null +++ b/src/main/java/com/chinaunicom/mall/ebtp/login/service/impl/BaseUserServiceImpl.java @@ -0,0 +1,307 @@ +package com.chinaunicom.mall.ebtp.login.service.impl; + + +import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.JSONObject; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.chinaunicom.mall.ebtp.cloud.security.starter.entity.AuthorityEntity; +import com.chinaunicom.mall.ebtp.cloud.security.starter.entity.SecurityEntity; +import com.chinaunicom.mall.ebtp.common.base.entity.BaseCacheUser; +import com.chinaunicom.mall.ebtp.common.base.service.IBaseCacheUserService; +import com.chinaunicom.mall.ebtp.common.base.service.impl.BaseServiceImpl; +import com.chinaunicom.mall.ebtp.common.exception.common.CommonExceptionEnum; +import com.chinaunicom.mall.ebtp.login.common.Constants; +import com.chinaunicom.mall.ebtp.login.common.RSA; +import com.chinaunicom.mall.ebtp.login.dao.BaseUserMapper; +import com.chinaunicom.mall.ebtp.login.entity.*; +import com.chinaunicom.mall.ebtp.login.service.BaseUserService; +import com.chinaunicom.mall.ebtp.login.service.BaseUserTokenService; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang.StringUtils; +import org.springframework.beans.BeanUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Qualifier; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.data.redis.core.RedisTemplate; +import org.springframework.stereotype.Service; +import org.springframework.web.context.request.RequestContextHolder; +import org.springframework.web.context.request.ServletRequestAttributes; + +import javax.annotation.Resource; +import javax.crypto.BadPaddingException; +import javax.servlet.http.Cookie; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import java.math.BigInteger; +import java.security.MessageDigest; +import java.security.NoSuchAlgorithmException; +import java.time.LocalDateTime; +import java.util.ArrayList; +import java.util.List; +import java.util.UUID; +import java.util.concurrent.TimeUnit; +import java.util.stream.Collectors; + +/** + * 对数据表 base_user 操作的 serviceImpl + * @author yss + * + */ +@Slf4j +@Service +public class BaseUserServiceImpl extends BaseServiceImpl implements BaseUserService { + + @Autowired + private BaseUserMapper baseUserMapper; + + @Value("${login.password.privateKey}") + private String privateKey; + @Value("${login.password.publickey}") + private String publickey; + @Value("${login.token.time_limit}") + private String valid_time_limit; + @Resource + private IBaseCacheUserService iBaseCacheUserService; + @Resource + private BaseUserTokenService baseUserTokenService; + + @Autowired(required = false) + @Qualifier("cacheRedisTemplate") + private RedisTemplate redisTemplate; + + + @Override + public BaseSelf idcardLogin(String account, String password) { + try { + + List userList = this.list(new LambdaQueryWrapper().eq(BaseUser::getAccount, account).eq(BaseUser::getStatus,Constants.USER_STATUS_LIVE)); + if (userList == null||userList.size()==0) { + throw new RuntimeException("无效用户!"); + } + BaseUser user = userList.get(0); + + if(Constants.USER_STATUS_FREEZE.equals(user.getStatus())){ + throw new RuntimeException("账号已冻结!"); + } + + byte[] decode = RSA.decryptByPrivateKey(RSA.decryptBASE64(password), privateKey); + + String pw = new String(decode); + System.out.println("公钥解密结果:" + pw); + + if (!this.encode(pw).equals(user.getPassword())) { + throw new RuntimeException("认证密码错误!"); + } + + return userLogin(user); + }catch (BadPaddingException e){ + log.error("RSA解密异常",e); + CommonExceptionEnum.FRAME_EXCEPTION_COMMON_DATA_OTHER_ERROR.customValidName("认证密码错误",true); + }catch (Exception e){ + log.error("登录异常",e); + CommonExceptionEnum.FRAME_EXCEPTION_COMMON_DATA_OTHER_ERROR.customValidName(e.getMessage(),true); + } + + return null; + } + + private BaseSelf userLogin(BaseUser user) { + BaseSelf self = new BaseSelf(); + String token = getToken(user.getId()); + user.setPassword("****************************"); + self.setUser(user); + String ip = getUserHost(); + self.setIp(ip); + self.setToken(token); + + return self; + } + + private String getToken(String userId){ + + List tokenList = baseUserTokenService.list((new LambdaQueryWrapper().eq(BaseUserToken::getUserId,userId) + .gt(BaseUserToken::getValidTime, LocalDateTime.now()).eq(BaseUserToken::getState,Constants.USER_TOKEN_STATUS_E).orderByDesc(BaseUserToken::getValidTime))); + String token = UUID.randomUUID().toString(); + BaseUserToken tokenObj = new BaseUserToken(); + if(tokenList!=null&&tokenList.size()>0){ + tokenObj = tokenList.get(0); + token = tokenObj.getToken(); + }else{ + tokenObj.setUserId(userId); + tokenObj.setToken(token); + tokenObj.setState(Constants.USER_TOKEN_STATUS_E); + tokenObj.setCreateTime(LocalDateTime.now()); + } + SecurityEntity securityEntity = getUserObjectByUserId(userId); + + tokenObj.setUserObject(JSONObject.toJSONString(securityEntity)); + baseUserTokenService.refreshToken(tokenObj); + return token; + } + + @Override + public void setCookie(HttpServletResponse response,String name, String value) { + Cookie cookie = new Cookie(name, value); + cookie.setPath("/"); + cookie.setMaxAge(-1); + response.addCookie(cookie); + } + + public String encode(String str) { + // 生成一个MD5加密计算摘要 + try { + MessageDigest md = MessageDigest.getInstance("MD5"); + // 计算md5函数 + md.update(str.getBytes()); + // digest()最后确定返回md5 hash值,返回值为8为字符串。因为md5 hash值是16位的hex值,实际上就是8位的字符 + // BigInteger函数则将8位的字符串转换成16位hex值,用字符串来表示;得到字符串形式的hash值 + return new BigInteger(1, md.digest()).toString(16); + } catch (NoSuchAlgorithmException e) { + + } + return ""; + } + + @Override + public String getUserHost() { + HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()) + .getRequest(); + String ip = request.getHeader("x-forwarded-for"); + if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) { + ip = request.getHeader("Proxy-Client-IP"); + } + if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) { + ip = request.getHeader("WL-Proxy-Client-IP"); + } + if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) { + ip = request.getRemoteAddr(); + } + return "0:0:0:0:0:0:0:1".equals(ip) ? "127.0.0.1" : ip; + } + + @Override + public BaseSelf getRequestUser() { + HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest(); + + BaseSelf self = new BaseSelf(); + try { + String token = request.getHeader("Authorization-exper"); + token = token.replaceAll("Bearer ", ""); + + CommonExceptionEnum.LOGIN_EXPIRATION.customValidName("无认证信息","".equals(token)); + if(redisTemplate.hasKey(token)){ + self=(BaseSelf)redisTemplate.opsForValue().get(token); + redisTemplate.expire(token,15, TimeUnit.MINUTES); + }else{ + BaseCacheUser user=iBaseCacheUserService.getCacheUser(); + CommonExceptionEnum.LOGIN_EXPIRATION.customValidName("账号不存在",user==null || StringUtils.isBlank(user.getUserId())); + List baseUserList = this.list((new LambdaQueryWrapper().eq(BaseUser::getAccount,user.getUserId()))); + if(baseUserList!=null&&baseUserList.size()>0){ + self = userLogin(baseUserList.get(0)); + self.setToken(token); + redisTemplate.opsForValue().getAndSet(token,self); + redisTemplate.expire(token,15, TimeUnit.MINUTES); + } + } + }catch (Exception e){ + log.error("用户账号异常:{}",e); + CommonExceptionEnum.LOGIN_EXPIRATION.customValidName("用户账号异常:请重新登陆!",true); + } + return self; + } + + public SecurityEntity getUserObjectByUserId(String userId){ + + SecurityEntity securityEntity = new SecurityEntity(); + + BaseUser baseUser = this.baseUserMapper.selectById(userId); + securityEntity.setUserid(baseUser.getAccount()); + securityEntity.setStaffId(baseUser.getAccount()); + securityEntity.setUsername(baseUser.getName()); + securityEntity.setStaffName(baseUser.getName()); + + List roleOrgnList = new ArrayList<>(); + List roleOrgnVoList = this.baseUserMapper.selectOrgnByUserId(baseUser.getId()); + roleOrgnVoList.forEach(ro->{ + BaseRoleOrgn baseRoleOrgn = new BaseRoleOrgn(); + BeanUtils.copyProperties(ro,baseRoleOrgn); + roleOrgnList.add(baseRoleOrgn); + }); + + List droleOrgnList = roleOrgnList.stream().distinct().collect(Collectors.toList()); + + List list = new ArrayList<>(); + List authorityList = new ArrayList<>(); + + droleOrgnList.forEach(droleOrgn->{ + List ro2List = roleOrgnVoList.stream().filter(ro2->ro2.getRoleId().equals(droleOrgn.getRoleId())).distinct().collect(Collectors.toList()); + List baseOrgnRList = new ArrayList<>(); + BaseRoleOrgnVo orgnVo = ro2List.get(0); + securityEntity.setOu(orgnVo.getOrgnId()); + securityEntity.setOuName(orgnVo.getOrgnName()); + securityEntity.setPartnerId(orgnVo.getOrgnId()); + securityEntity.setPartnerName(orgnVo.getOrgnName()); + + ro2List.forEach(ro3->{ + BaseOrgnR baseOrgnR = new BaseOrgnR(); + BeanUtils.copyProperties(ro3,baseOrgnR); + baseOrgnRList.add(baseOrgnR); + }); + droleOrgn.setBaseOrgnList(baseOrgnRList); + list.add(droleOrgn); + + AuthorityEntity authorityEntity = new AuthorityEntity(); + BeanUtils.copyProperties(droleOrgn,authorityEntity); + authorityEntity.setRoleScope("EBTP"); + authorityList.add(authorityEntity); + }); + + securityEntity.setAuthorityList(authorityList); + // securityEntity.setRoleOrgnList(list); + return securityEntity; + } + + /** + * 本地token换取用户信息 + * @param token + * @return + */ + @Override + public SecurityEntity bdCheckToken(String token){ + List tokenList = baseUserTokenService.list((new LambdaQueryWrapper().eq(BaseUserToken::getToken,token) + .gt(BaseUserToken::getValidTime, LocalDateTime.now()).eq(BaseUserToken::getState,Constants.USER_TOKEN_STATUS_E).orderByDesc(BaseUserToken::getValidTime))); + CommonExceptionEnum.LOGIN_EXPIRATION.assertListNotNullByName("",tokenList); + BaseUserToken userToken = tokenList.get(0); + CommonExceptionEnum.LOGIN_EXPIRATION.assertStringNotNullByKey("",tokenList.get(0).getUserObject()); + SecurityEntity securityEntity = JSON.parseObject(userToken.getUserObject(), SecurityEntity.class); + userToken.setValidTime(LocalDateTime.now().plusMinutes(Long.valueOf(valid_time_limit))); + + this.baseUserTokenService.saveOrUpdate(userToken); + + return securityEntity; + } + + public static void main(String args[]) throws Exception { +// String rsa = "ObMojRm4G31O91lJDyV7rT7fmkJ0x/tMz+t2gZa1M5RtZm6cTiaAT6eblAQzjuMbNNU6DoD/YloITzn2jnQH4g2nMj1Y8TXdSEK/q8QSoLb8QVb26SuMt1xuv1hklU0yzkqCtGW7GnRArMMlgQjh04GwAcj6TikEFjKvEGGETm4="; + String publicKey = "MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCThndxa2d5wd1XgZw/OoRHyqqhEKn2Vj8esINcPHRDKz/eDxrHT874ssYfRdkQPU4d13yLhywu30D0J/IusB1Aay0Kl7fszYztP1Yg7Y8Gmiwynj4bFooIFZk5l0wJdxciXA4FgjK+oD4Un/LhP20k5OSQ+QLMDBHBJTD/uk9cxQIDAQAB"; + String privateKey = "MIICdgIBADANBgkqhkiG9w0BAQEFAASCAmAwggJcAgEAAoGBAJOGd3FrZ3nB3VeBnD86hEfKqqEQqfZWPx6wg1w8dEMrP94PGsdPzviyxh9F2RA9Th3XfIuHLC7fQPQn8i6wHUBrLQqXt+zNjO0/ViDtjwaaLDKePhsWiggVmTmXTAl3FyJcDgWCMr6gPhSf8uE/bSTk5JD5AswMEcElMP+6T1zFAgMBAAECgYAk2fsuTukbRi03db4FIWX31Q2IjHQYf/TmgqtduBBG0x/yJY3H6gzGnUnWeAlAAEBqPfDzncGQt94u32ek+ANmN161r22eBqoihHJQsCD3n3uFw8fdCRzpP9fiJVUFf3Yf/Di2G6cHKJ1Bs8H2GtmajeUUgjNNvJdQXLsTU2DBoQJBAPV9Luzcb62BO9GsL/C6nrxOEPnfTOvpQpBDjb4JnnS8G4CRoEERB8y0p/npD7wrhwG1aEpOj/6XUUz8yAqrA50CQQCZ139/lX0W6TGxZF5RQu9PlKW5/K74Ysd6tvuom93bwLG4zpCgfIoH3mSkWtKENvob7CV07T/irYppa/bIpRlJAkARnsqfdbMOYRhKFHHcdYivO2s8hCqhRDzi3fZujYIyHs5ajBlUkkRdDRqBdZkLiJRIKx0xODJds77CJ+Kz4VKBAkAUf14Bhc1w7Aku9YyLjzuLgubB7STy+1ZQx2iognwA95+2W+9xMqbBfaQzMdayvxB7/+7NsX69mRnEChqLiVPhAkEA6W9YOoZQlL6yCYE4GE3W38g0m7lq68XuVFgCpULEfR3s5bsPcqxC4xM29Ry80cEv6fAE+jht7JUq0ar/tRqfNA=="; + + // String p = "jxsnmqYTsskthlKdpffZ/q/gKfPp9kQpmiNaLg2LqNvyoTnsm+cu7q1ZhmcuK/QH6BKV38dXFgqw3kmEu4X/CKoMHP83vwBSxZhF/uk0SQixRBtpvIIJ/M7XFzyZnUD1u3beEiwbuoWjhtjqq/ImWn7nB54ldc3T/S/lyMS4+Jc="; +// String p2 ="jxsnmqYTsskthlKdpffZ/q/gKfPp9kQpmiNaLg2LqNvyoTnsm+cu7q1ZhmcuK/QH6BKV38dXFgqw3kmEu4X/CKoMHP83vwBSxZhF/uk0SQixRBtpvIIJ/M7XFzyZnUD1u3beEiwbuoWjhtjqq/ImWn7nB54ldc3T/S/lyMS4+Jc="; +// System.out.println(URLEncoder.encode(p,"utf-8")); +// System.out.println(RSA.decrypt(p2,privateKey)); + + BaseUserServiceImpl baseUserService = new BaseUserServiceImpl(); + String mm = baseUserService.encode("Eshop2022"); + System.out.println(mm); + + String mm2 = RSA.encrypt("Eshop2022",publicKey); + + System.out.println(mm2); + + byte[] decode = RSA.decryptByPrivateKey(RSA.decryptBASE64(mm2), privateKey); + + String pw = new String(decode); + System.out.println(pw); + } +} diff --git a/src/main/java/com/chinaunicom/mall/ebtp/login/service/impl/BaseUserTokenServiceImpl.java b/src/main/java/com/chinaunicom/mall/ebtp/login/service/impl/BaseUserTokenServiceImpl.java new file mode 100644 index 0000000..9d51b32 --- /dev/null +++ b/src/main/java/com/chinaunicom/mall/ebtp/login/service/impl/BaseUserTokenServiceImpl.java @@ -0,0 +1,45 @@ +package com.chinaunicom.mall.ebtp.login.service.impl; + + +import com.chinaunicom.mall.ebtp.common.base.service.impl.BaseServiceImpl; +import com.chinaunicom.mall.ebtp.login.common.Constants; +import com.chinaunicom.mall.ebtp.login.dao.BaseUserTokenMapper; +import com.chinaunicom.mall.ebtp.login.entity.BaseUserToken; +import com.chinaunicom.mall.ebtp.login.service.BaseUserTokenService; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.stereotype.Service; + +import java.time.LocalDateTime; + +/** + * 对数据表 base_user_token 操作的 serviceImpl + * @author yss + * + */ +@Service +public class BaseUserTokenServiceImpl extends BaseServiceImpl implements BaseUserTokenService { + + @Value("${login.token.time_limit}") + private String valid_time_limit; + + @Override + public boolean refreshToken(BaseUserToken baseUserToken){ + + baseUserToken.setValidTime(LocalDateTime.now().plusMinutes(Long.valueOf(valid_time_limit))); + return this.saveOrUpdate(baseUserToken); + } + + @Override + public boolean saveToken(String id, String userId, String token){ + BaseUserToken userToken = new BaseUserToken(); + userToken.setId(id); + userToken.setUserId(userId); + userToken.setToken(token); + userToken.setState(Constants.USER_TOKEN_STATUS_E); + if(id==null||"".equals(id)) { + userToken.setCreateTime(LocalDateTime.now()); + } + userToken.setValidTime(LocalDateTime.now().plusMinutes(Long.valueOf(valid_time_limit))); + return this.saveOrUpdate(userToken); + } +} diff --git a/src/main/java/com/chinaunicom/mall/ebtp/login/service/impl/EshopMenuServiceImpl.java b/src/main/java/com/chinaunicom/mall/ebtp/login/service/impl/EshopMenuServiceImpl.java new file mode 100644 index 0000000..5675ee0 --- /dev/null +++ b/src/main/java/com/chinaunicom/mall/ebtp/login/service/impl/EshopMenuServiceImpl.java @@ -0,0 +1,41 @@ +package com.chinaunicom.mall.ebtp.login.service.impl; + +import com.chinaunicom.mall.ebtp.login.dao.EshopMenuMapper; +import com.chinaunicom.mall.ebtp.login.entity.EshopMenuConverter; +import com.chinaunicom.mall.ebtp.login.entity.EshopMenuQuery; +import com.chinaunicom.mall.ebtp.login.service.EshopMenuService; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import java.util.List; + +/** + *

+ * 菜单权限表 服务实现类 + *

+ * + * @author wangwj + * @since 2020-12-08 + */ +@Slf4j +@Service +public class EshopMenuServiceImpl implements EshopMenuService { + + @Autowired + private EshopMenuMapper eshopMenuMapper; + + /** + * 根据角色查询顶级权限 + * + * @param body + * @return BasePageResponse + * @author chentao + * @date 2021-1-13 + * @update [序号][日期YYYY-MM-DD] [更改人姓名][变更描述] + */ + @Override + public List findTopMenuList(EshopMenuQuery body) { + return this.eshopMenuMapper.findTopMenuList(body.getRoleId()); + } +} diff --git a/src/main/java/com/chinaunicom/mall/ebtp/login/utils/HttpsUtils.java b/src/main/java/com/chinaunicom/mall/ebtp/login/utils/HttpsUtils.java new file mode 100644 index 0000000..694a39c --- /dev/null +++ b/src/main/java/com/chinaunicom/mall/ebtp/login/utils/HttpsUtils.java @@ -0,0 +1,129 @@ +package com.chinaunicom.mall.ebtp.login.utils; + +import com.chinaunicom.mall.ebtp.common.exception.common.CommonExceptionEnum; +import lombok.extern.slf4j.Slf4j; + +import java.io.*; +import java.net.HttpURLConnection; +import java.net.URL; +import java.util.HashMap; +import java.util.Map; + +@Slf4j +public class HttpsUtils { + public static String refreshHttpPost(String path, String data,String clientId){ + String str = ""; + try { + log.info("-------path:"+path); + log.info("-------data:"+data); + URL url = new URL(path); + HttpURLConnection conn = (HttpURLConnection)url.openConnection(); + conn.setRequestProperty("Content-Type", "application/x-www-form-urlencoded"); + conn.setRequestProperty("clientId", clientId); + conn.setDoOutput(true); + conn.setDoInput(true); + conn.setRequestMethod("POST"); + OutputStream out = conn.getOutputStream(); + out.write(data.getBytes()); + out.flush(); + out.close(); + InputStream is = conn.getInputStream(); + BufferedReader br = new BufferedReader(new InputStreamReader(is)); + + for(String line = br.readLine(); line != null; line = br.readLine()) { + str = new String(line.getBytes(), "UTF-8"); + System.out.println(str); + } + + is.close(); + conn.disconnect(); + } catch (Exception var9) { + CommonExceptionEnum.FRAME_EXCEPTION_COMMON_DATA_OTHER_ERROR.customValidName("请求code换token接口异常"+var9.getMessage(),true); + log.error("请求code换token接口异常",var9); + } + + return str; + } + public static String authorizationCodeHttpPost(String path){ + String str = ""; + try { + URL url = new URL(path); + HttpURLConnection conn = (HttpURLConnection)url.openConnection(); + PrintWriter out = null; + conn.setRequestProperty("Content-Type", "application/json; charset=UTF-8"); + conn.setDoOutput(true); + conn.setDoInput(true); + conn.setRequestMethod("POST"); + out = new PrintWriter(conn.getOutputStream()); + out.flush(); + InputStream is = conn.getInputStream(); + BufferedReader br = new BufferedReader(new InputStreamReader(is)); + for(String line = br.readLine(); line != null; line = br.readLine()) { + str = new String(line.getBytes(), "UTF-8"); + System.out.println(str); + } + + is.close(); + conn.disconnect(); + } catch (Exception var9) { + CommonExceptionEnum.FRAME_EXCEPTION_COMMON_DATA_OTHER_ERROR.customValidName("请求code换token接口异常"+var9.getMessage(),true); + log.error("请求code换token接口异常",var9); + } + + return str; + } + + public static void main(String args[]){ + Map map = new HashMap(); + map.put("identityCard","331081198909263032"); + map.put("password","041461f3e0621be23917ab9c74294083adb9571b82537bc46a2c553938445870e99905a3bf5507e5be462b403954ea4205c5578e3431dec8e3dd8c71ef3b3f615363fe269dea415186188458bb17e6e0d2a6a2f97c58883fb68839748f465df48fc5d5a1961f68"); + map.put("captcha","WRZN"); + map.put("token","toxc5izzhjnjmgc3"); + + map.put("clientId","KgPEkttG"); + + String url = "http://10.242.31.158:8100/auth/expertLogin";//请求地址 + String json = ""; + for(String key :map.keySet()){ + if(!"".equals(json)){ + json+="&"; + } + json+=key+"="+map.get(key); + } + refreshHttpPost(url,json,"KgPEkttG"); + } + + public static String expertHttpPost(String path, String data,String clientId){ + String str = ""; + try { + log.info("-------path:"+path); + log.info("-------data:"+data); + URL url = new URL(path); + HttpURLConnection conn = (HttpURLConnection)url.openConnection(); + conn.setRequestProperty("Content-Type", "application/x-www-form-urlencoded;charset=UTF-8"); + conn.setRequestProperty("clientId", clientId); + conn.setDoOutput(true); + conn.setDoInput(true); + conn.setRequestMethod("POST"); + OutputStream out = conn.getOutputStream(); + out.write(data.getBytes("utf-8")); + out.flush(); + out.close(); + InputStream is = conn.getInputStream(); + BufferedReader br = new BufferedReader(new InputStreamReader(is)); + + for(String line = br.readLine(); line != null; line = br.readLine()) { + str = new String(line.getBytes(), "UTF-8"); + System.out.println(str); + } + + is.close(); + conn.disconnect(); + } catch (Exception var9) { + CommonExceptionEnum.FRAME_EXCEPTION_COMMON_DATA_OTHER_ERROR.customValidName("专家登录异常"+var9.getMessage(),true); + log.error("专家登录异常",var9); + } + + return str; + } +} diff --git a/src/main/java/com/chinaunicom/mall/ebtp/login/vo/LoginUserVo.java b/src/main/java/com/chinaunicom/mall/ebtp/login/vo/LoginUserVo.java new file mode 100644 index 0000000..8a57a5f --- /dev/null +++ b/src/main/java/com/chinaunicom/mall/ebtp/login/vo/LoginUserVo.java @@ -0,0 +1,14 @@ +package com.chinaunicom.mall.ebtp.login.vo; + +import io.swagger.annotations.ApiModel; +import lombok.Data; + +@Data +@ApiModel("登录用户信息") +public class LoginUserVo { + + private String password; + private String account; + private String identifying; + private String encryptValue; +} diff --git a/src/main/java/com/chinaunicom/mall/ebtp/test/RSA.java b/src/main/java/com/chinaunicom/mall/ebtp/test/RSA.java new file mode 100644 index 0000000..d94ece1 --- /dev/null +++ b/src/main/java/com/chinaunicom/mall/ebtp/test/RSA.java @@ -0,0 +1,357 @@ +package com.chinaunicom.mall.ebtp.test; + +import com.chinaunicom.mall.ebtp.common.exception.common.CommonExceptionEnum; + +import javax.crypto.Cipher; +import java.net.URLDecoder; +import java.security.*; +import java.security.interfaces.RSAPrivateKey; +import java.security.interfaces.RSAPublicKey; +import java.security.spec.PKCS8EncodedKeySpec; +import java.security.spec.X509EncodedKeySpec; +import java.util.Base64; +import java.util.HashMap; +import java.util.Map; + +public class RSA { + + public static final String KEY_ALGORITHM = "RSA"; + public static final String SIGNATURE_ALGORITHM = "MD5withRSA"; + + private static final String PUBLIC_KEY = "RSAPublicKey"; + private static final String PRIVATE_KEY = "RSAPrivateKey"; + + /** + * 初始化密钥 + * + * @return + * @throws Exception + */ + public static Map initKey() throws Exception { + KeyPairGenerator keyPairGen = KeyPairGenerator.getInstance(KEY_ALGORITHM); + keyPairGen.initialize(1024); + KeyPair keyPair = keyPairGen.generateKeyPair(); + + // 公钥 + RSAPublicKey publicKey = (RSAPublicKey) keyPair.getPublic(); +// logger.info("------" + publicKey); + // 私钥 + RSAPrivateKey privateKey = (RSAPrivateKey) keyPair.getPrivate(); +// logger.info("------" + publicKey); + + Map keyMap = new HashMap (2); + + keyMap.put(PUBLIC_KEY, publicKey); + keyMap.put(PRIVATE_KEY, privateKey); + return keyMap; + } + + /** + * 取得私钥 + * + * @param keyMap + * @return + * @throws Exception + */ + public static String getPrivateKey(Map keyMap) + throws Exception { + Key key = (Key) keyMap.get(PRIVATE_KEY); + return encryptBASE64(key.getEncoded()); + } + + /** + * 取得公钥 + * + * @param keyMap + * @return + * @throws Exception + */ + public static String getPublicKey(Map keyMap) + throws Exception { + Key key = (Key) keyMap.get(PUBLIC_KEY); + return encryptBASE64(key.getEncoded()); + } + + + /** + * 解密
+ * 用私钥解密 + * + * @param data + * @param key + * @return + * @throws Exception + */ + public static byte[] decryptByPrivateKey(byte[] data, String key) + throws Exception { + // 对密钥解密 + byte[] keyBytes = decryptBASE64(key); + + // 取得私钥 + PKCS8EncodedKeySpec pkcs8KeySpec = new PKCS8EncodedKeySpec(keyBytes); + KeyFactory keyFactory = KeyFactory.getInstance(KEY_ALGORITHM); + Key privateKey = keyFactory.generatePrivate(pkcs8KeySpec); + + // 对数据解密 + Cipher cipher = Cipher.getInstance(keyFactory.getAlgorithm()); + cipher.init(Cipher.DECRYPT_MODE, privateKey); + + return cipher.doFinal(data); + } + /** + * 解密
+ * 用私钥解密 + * + * @param data + * @param key + * @return + * @throws Exception + */ + public static String decryptByPrivateKeyString(byte[] data, String key) + throws Exception { + return new String(decryptByPrivateKey(data, key)); + } + + + /** + * 解密
+ * 用公钥解密 + * + * @param data + * @param key + * @return + * @throws Exception + */ + public static byte[] decryptByPublicKey(byte[] data, String key) + throws Exception { + // 对密钥解密 + byte[] keyBytes = decryptBASE64(key); + + // 取得公钥 + X509EncodedKeySpec x509KeySpec = new X509EncodedKeySpec(keyBytes); + KeyFactory keyFactory = KeyFactory.getInstance(KEY_ALGORITHM); + Key publicKey = keyFactory.generatePublic(x509KeySpec); + + // 对数据解密 + Cipher cipher = Cipher.getInstance(keyFactory.getAlgorithm()); + cipher.init(Cipher.DECRYPT_MODE, publicKey); + + return cipher.doFinal(data); + } + + /** + * 加密
+ * 用公钥加密 + * + * @param data + * @param key + * @return + * @throws Exception + */ + public static byte[] encryptByPublicKey(byte[] data, String key) + throws Exception { + // 对公钥解密 + byte[] keyBytes = decryptBASE64(key); + + // 取得公钥 + X509EncodedKeySpec x509KeySpec = new X509EncodedKeySpec(keyBytes); + KeyFactory keyFactory = KeyFactory.getInstance(KEY_ALGORITHM); + Key publicKey = keyFactory.generatePublic(x509KeySpec); + + // 对数据加密 + Cipher cipher = Cipher.getInstance(keyFactory.getAlgorithm()); + cipher.init(Cipher.ENCRYPT_MODE, publicKey); + + return cipher.doFinal(data); + } + + /** + * 加密
+ * 用私钥加密 + * + * @param data + * @param key + * @return + * @throws Exception + */ + public static byte[] encryptByPrivateKey(byte[] data, String key) + throws Exception { + // 对密钥解密 + byte[] keyBytes = decryptBASE64(key); + + // 取得私钥 + PKCS8EncodedKeySpec pkcs8KeySpec = new PKCS8EncodedKeySpec(keyBytes); + KeyFactory keyFactory = KeyFactory.getInstance(KEY_ALGORITHM); + Key privateKey = keyFactory.generatePrivate(pkcs8KeySpec); + + // 对数据加密 + Cipher cipher = Cipher.getInstance(keyFactory.getAlgorithm()); + cipher.init(Cipher.ENCRYPT_MODE, privateKey); + + return cipher.doFinal(data); + } + + /** + * 用私钥对信息生成数字签名 + * + * @param data + * 加密数据 + * @param privateKey + * 私钥 + * + * @return + * @throws Exception + */ + public static String sign(byte[] data, String privateKey) throws Exception { + // 解密由base64编码的私钥 + byte[] keyBytes = decryptBASE64(privateKey); + + // 构造PKCS8EncodedKeySpec对象 + PKCS8EncodedKeySpec pkcs8KeySpec = new PKCS8EncodedKeySpec(keyBytes); + + // KEY_ALGORITHM 指定的加密算法 + KeyFactory keyFactory = KeyFactory.getInstance(KEY_ALGORITHM); + + // 取私钥匙对象 + PrivateKey priKey = keyFactory.generatePrivate(pkcs8KeySpec); + + // 用私钥对信息生成数字签名 + Signature signature = Signature.getInstance(SIGNATURE_ALGORITHM); + signature.initSign(priKey); + signature.update(data); + + return encryptBASE64(signature.sign()); + } + + /** + * 校验数字签名 + * + * @param data + * 加密数据 + * @param publicKey + * 公钥 + * @param sign + * 数字签名 + * + * @return 校验成功返回true 失败返回false + * @throws Exception + * + */ + public static boolean verify(byte[] data, String publicKey, String sign) + throws Exception { + + // 解密由base64编码的公钥 + byte[] keyBytes = decryptBASE64(publicKey); + + // 构造X509EncodedKeySpec对象 + X509EncodedKeySpec keySpec = new X509EncodedKeySpec(keyBytes); + + // KEY_ALGORITHM 指定的加密算法 + KeyFactory keyFactory = KeyFactory.getInstance(KEY_ALGORITHM); + + // 取公钥匙对象 + PublicKey pubKey = keyFactory.generatePublic(keySpec); + + Signature signature = Signature.getInstance(SIGNATURE_ALGORITHM); + signature.initVerify(pubKey); + signature.update(data); + + // 验证签名是否正常 + return signature.verify(decryptBASE64(sign)); + } + + public static byte[] decryptBASE64(String key) throws Exception { + return Base64.getDecoder().decode(key); + } + + public static String encryptBASE64(byte[] key) throws Exception { + return Base64.getEncoder().encodeToString(key); + } + + public static String encrypt(String value,String publicKey){ + try { + String v = encryptBASE64(RSA.encryptByPublicKey(value.getBytes(), publicKey)); + return v; + }catch (Exception e){ + CommonExceptionEnum.FRAME_EXCEPTION_COMMON_DATA_OTHER_ERROR.customValidName("加密异常", true); + } + return ""; + } + public static String decrypt(String value,String privateKey){ + try { + byte[] decodedData = decryptByPrivateKey(decryptBASE64(value), privateKey); + String target = new String(decodedData); + return target; + }catch (Exception e){ + CommonExceptionEnum.FRAME_EXCEPTION_COMMON_DATA_OTHER_ERROR.customValidName("解密异常", true); + } + return ""; + } + public static void main(String[] args) { + Map keyMap; + try { + keyMap = initKey(); +// Map map = initKey(); +// System.out.println(map); + //取得公钥和么私钥 + //keyMap = initKey(); + //String publicKey = "MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCgkWYQFjlRrCsQQBNZj6uo8KEQamePmxaC6O4JI5SoELnXPlTCJIlQTG1Xzn/ajqjDV4/5ZmZAH+auST4j9L5qH8qnoxT1AN+yhUY6hMV9qxF00e1gBc81mYJO2nwwaQjRsGEoq86e9dP1zX5kOk8vMZN6/g508a1K2IWNwpGp0wIDAQAB"; + //String publicKey = getPublicKey(keyMap); + //#生产 + String publicKey ="MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCHzL+U09epkBAnn2V4HCADX9gQxpW4iQ3ckM0YMX5CRe9SSzbbRItYMnOsIjogj39gXm7cYJIgE91wQgNJINkD65D2Tm+7vYgLMyw87YBlTONxQ484RW7o5Ofqz72HEXMyfvdpLIJ5lTheeqHmpL20vNkq+CkuHxhVPlYoVl/1uwIDAQAB"; + System.out.println("字符类型公钥:" + publicKey); + + //String privateKey = "MIICdwIBADANBgkqhkiG9w0BAQEFAASCAmEwggJdAgEAAoGBAKCRZhAWOVGsKxBAE1mPq6jwoRBqZ4+bFoLo7gkjlKgQudc+VMIkiVBMbVfOf9qOqMNXj/lmZkAf5q5JPiP0vmofyqejFPUA37KFRjqExX2rEXTR7WAFzzWZgk7afDBpCNGwYSirzp710/XNfmQ6Ty8xk3r+DnTxrUrYhY3CkanTAgMBAAECgYA8WMkqLKAYUQPSVLKxC20xzlZKbCNF9rzMMK0d5DB/xeGCwxtp5/9vnXnO8X5d7xYAbM1gp5qwaQzy3fYr31UcxHiFTcZMgvN6z32FNBEkejCLaKIFZjaMBn36dStdzpAP+OOclwpXDGpGQO0UKLKshAfl5dsS+fq+nHpOugz52QJBAPUCG9Xzy5TrMiqL9n1TLe1qR+ALfELZHFheevIkyShJtcqlte8u640H0CHDXF9lniisMFn4xChqkxiTUsees58CQQCnxYDP+JfmqORO4Cx2DLCCqOpaOkuxdZo8eSh80s3zbmtdqoMpeYZglVNLuSYKNul8WWF3qeGqcnLULDE6P31NAkEAtSLt+WvYoyyPVi1L+rO4TMI6iUV0hOeGsT6InuTbY1G7eSqyKzcBJq8UDSIl9NFn8KH8zUfBni/MuGqS1Mpb+QJATiPTBwpF1Yy8KXCHxMPMQk7iN/wG3TRlDd1wWhLlEYhQQWP1iw+q4rkp/o7RhNhmjyAiIVXiYTzE9sVOeE6x0QJBAJYmBmOKfxw3rzpjDU+e9I6w0AbpiBzlnviEToZfnDwVH9mjF++H/wDRTDqozIiAE2aN/wqXwqhoWGgVWMlp9Xc="; + //String privateKey = getPrivateKey(keyMap); + //生产 + String privateKey="MIICdQIBADANBgkqhkiG9w0BAQEFAASCAl8wggJbAgEAAoGBAIfMv5TT16mQECefZXgcIANf2BDGlbiJDdyQzRgxfkJF71JLNttEi1gyc6wiOiCPf2BebtxgkiAT3XBCA0kg2QPrkPZOb7u9iAszLDztgGVM43FDjzhFbujk5+rPvYcRczJ+92ksgnmVOF56oeakvbS82Sr4KS4fGFU+VihWX/W7AgMBAAECgYAjblVR9E+havf8Dod/5f6oQrpx7g4kPoYCVTldpZQmoG6Hjx456VFd6pPphmiaFDaMozbTgtK9UdGFt4N58fsMvHG1vSZ5jH6jXW+xGsCpiHp24s6kXlRDPnX1AstezrIcXa+37CJua80/DUXMRysJcByW3HnGmwjKM21EqiyMUQJBAMCgZN/4I5bnUc/gsOwl0Vunp8jtXoMa/dDFyIE7SCNQlkjfTTkzTrQRaHXeDRKBlzLUB0TNMv6gbH4xxAuGY7kCQQC0ejrDRz2O17O+ETlqQ3jubxMLq2ZfhUGWwgJQ5gXT0PgM5Bauv7NygHaxKmmN0EAqk1NTDV0ao3VJOvuLUIcTAkBfJpvNurAx2aAjFHWwoNmy8bVC3mYiUxHvr9NkatkugJ9L7eoiiEKnVjYIiyBf9N2wQOY6STaYarxM9d5GZyMZAkBS8UWmT0xMJHe3pyTS4FVohuWi3E+9IHnHNjxoP354HTaSfhSqlPF8cuuZeltuUEHdDz4hEigywOJ7GD9YhFa/AkBjxKsb4qfJeaz+zxcFHekWaFhgdvpx2/bov9y/wP/HEZo8NRsa1I0wVBiWhSRltYrQU7jMHafnrhiqQUW3BKhm"; + System.out.println("字符类型私钥:" + privateKey); + String s = RSA.encrypt("331081198909263032",publicKey); + System.out.println(s); + + //String s = "nRpkxT2XTYQvQl/xIqgVuIg3d1ezs/QuKZGm2UxAVJiwHN8F3E6jKr6/Ujt1ZODdlt9mPh7+WUepm/7OdbkPiDzoDufFBcscfVzRKpgG7yj0VEhqv4HGTxc5PX3dFKWRGIW4+x02StDezlTRDbhRGn9qNRZhJXTMsHITekM1+YY="; + //s = URLDecoder.decode(s,"utf-8"); + String v = RSA.decrypt(s,privateKey); + System.out.println(v); +// System.out.println("公钥加密——私钥解密---------------"); +// System.out.println(""); +// String source = "9527001"; +// System.out.println("\r加密前文字:\r\n" + source); +// byte[] data = source.getBytes(); +// byte[] encodedData = encryptByPublicKey(data, publicKey); +// System.out.println("加密后文字:\r\n" + encryptBASE64(encodedData)); +// +// byte[] decodedData = decryptByPrivateKey(encodedData, privateKey); +// String target = new String(decodedData); +// System.out.println("解密后文字: \r\n" + target); + +// System.out.println(v); + +// String s1 = RSA.encrypt("Eshop@2022",publicKey); +// System.out.println(s1); +// String s2 = RSA.encrypt("Eshop@2021",publicKey); +// System.out.println(s2); + + + } catch (Exception e) { + e.printStackTrace(); + } + } + + + /** + * String转私钥PrivateKey + * + * @param key + * @return + * @throws Exception + */ + public static PrivateKey getPrivateKey(String key) throws Exception { + byte[] keyBytes; + keyBytes = org.apache.commons.codec.binary.Base64.decodeBase64(key); + PKCS8EncodedKeySpec keySpec = new PKCS8EncodedKeySpec(keyBytes); + KeyFactory keyFactory = KeyFactory.getInstance("RSA"); + PrivateKey privateKey = keyFactory.generatePrivate(keySpec); + return privateKey; + } +} diff --git a/src/main/java/com/chinaunicom/mall/ebtp/test/RsaUtil.java b/src/main/java/com/chinaunicom/mall/ebtp/test/RsaUtil.java new file mode 100644 index 0000000..79995dd --- /dev/null +++ b/src/main/java/com/chinaunicom/mall/ebtp/test/RsaUtil.java @@ -0,0 +1,132 @@ +package com.chinaunicom.mall.ebtp.test; + +import org.apache.commons.codec.binary.Base64; + +import javax.crypto.Cipher; +import java.security.KeyFactory; +import java.security.PrivateKey; +import java.security.PublicKey; +import java.security.spec.PKCS8EncodedKeySpec; +import java.security.spec.X509EncodedKeySpec; + +public class RsaUtil { + + /** + * RSA 公钥和私钥 + * 通过RSA密钥处理器获得 + */ + private final static String pubKey = "AAAAB3NzaC1yc2EAAAADAQABAAAAgQDhIfpjURfhdducVHFun1vAz36QmSqXcrp6V20HqL8allfpXKNQ386KKUWlWcrbBD6MWn1NI3q6XS6q7BqvMRyE1mZxGO3LdGYOY0SM15t+ezC1vUyE2FaWugaUPJO3eeHxx1FwbMCXzzW3j2cLL+kJWG3o38SrFQ/ENg3izJvvEw=="; + + private final static String priKey = "MIICXQIBAAKBgQDhIfpjURfhdducVHFun1vAz36QmSqXcrp6V20HqL8allfpXKNQ" + + "386KKUWlWcrbBD6MWn1NI3q6XS6q7BqvMRyE1mZxGO3LdGYOY0SM15t+ezC1vUyE" + + "2FaWugaUPJO3eeHxx1FwbMCXzzW3j2cLL+kJWG3o38SrFQ/ENg3izJvvEwIDAQAB" + + "AoGAak1h7j1fOk0tOh7BRMuoRl1zVJGOA97fYF8hk0lBmys8LWtZjhlva9tbEF1a" + + "pJnXcuxTV/YVwCO5omlDnE9jOA9DXi0aJnvbuPjMb1He9pkODlbvrEPXljHWdUT/" + + "REkqgtGtlwdB8pD9okWLBKzRweOeEqaK4lrrsuAqawcVzqECQQD1aRI2nF65QLXv" + + "rVuOiCGlqarULArubLs3DsojR9IHGbrh1r/u9w3DtK8ZmCW6VhiBsAw64pWg8eL2" + + "Qcawx3xRAkEA6tjotlqgoDmED6TsnoGCo+9u3sksHNM/bR9baf4dFlX8CuS7Ws9w" + + "bL188nv6EWmN/jYSJab3tvXEXKZzX6rwIwJAE916fPMxc7t6PrmAtMvuNVPDoUMj" + + "a2Nf0DghQrPYm3yItSlGBhj3g0UH+4FmZGv9tdnDU6ztwcZywc5XQA4V0QJBAIk2" + + "kMkyrFTRJhLJ5qI5wy2rUFkEqyxwVMeaIZwNJ8uME4X93GWTe/lcwSsgOpx/0sGr" + + "r/Cl3Gfesor7ib9krYcCQQDDRhyrbP737KWyIjGJGQjGiirImp8aFTpRKT1nEgYb" + + "22pKBMbhGMbESdoCHV/qNXhE5PrX8q1tgDQoFy1LW2jD"; + + public static void main(String[] args) throws Exception { + + String str = "9527001"; // 需要操作加解密的字符串 + + String encryptionBase64Str = encrypt(str); // 加密 + System.out.println("--加密: " + encryptionBase64Str); // RSA加密再base64编码后的字符串 + + String decryptionStr = decrypt(encryptionBase64Str); // 解密 + System.out.println("--解密: " + decryptionStr); + } + + /** + * 公钥加密 + * + * @param str 需要加密操作的字符串 + * @return 结果再Base64加密后的字符串 + * @throws Exception + */ + public static String encrypt(String str) throws Exception { + // String 转 公钥 + PublicKey rsaPublicKey = getPublicKey(pubKey); + //公钥加密 + X509EncodedKeySpec x509EncodedKeySpec = new X509EncodedKeySpec(rsaPublicKey.getEncoded()); + KeyFactory keyFactory = KeyFactory.getInstance("RSA"); + PublicKey publicKey = keyFactory.generatePublic(x509EncodedKeySpec); + Cipher cipher = Cipher.getInstance("RSA"); + cipher.init(Cipher.ENCRYPT_MODE, publicKey); + byte[] result = cipher.doFinal(str.getBytes()); + return Base64.encodeBase64String(result); + } + + + /** + * 用私钥 解密 + * + * @param encryptionBase64Str RSA加密后又base64编码后的字符串 + * @return 解密结果 + * @throws Exception + */ + public static String decrypt(String encryptionBase64Str) throws Exception { + // base64 解码 + byte[] base64 = Base64.decodeBase64(encryptionBase64Str); + // String 转 私钥 + PrivateKey rsaPrivateKey = getPrivateKey(priKey); + //私钥解密 + PKCS8EncodedKeySpec pkcs8EncodedKeySpec = new PKCS8EncodedKeySpec(rsaPrivateKey.getEncoded()); + KeyFactory keyFactory = KeyFactory.getInstance("RSA"); + PrivateKey privateKey = keyFactory.generatePrivate(pkcs8EncodedKeySpec); + Cipher cipher = Cipher.getInstance("RSA"); + cipher.init(Cipher.DECRYPT_MODE, privateKey); + byte[] result = cipher.doFinal(base64); + return new String(result); + } + + + /** + * String转公钥PublicKey + * + * @param key + * @return + * @throws Exception + */ + public static PublicKey getPublicKey(String key) throws Exception { + byte[] keyBytes; + keyBytes = Base64.decodeBase64(key);//.(new BASE64Decoder()).decodeBuffer(key); + X509EncodedKeySpec keySpec = new X509EncodedKeySpec(keyBytes); + KeyFactory keyFactory = KeyFactory.getInstance("RSA"); + PublicKey publicKey = keyFactory.generatePublic(keySpec); + return publicKey; + } + + /** + * String转公钥PublicKey + * + * @return + * @throws Exception + */ + public static String getPublicKeyStr() { + return pubKey; + } + + + /** + * String转私钥PrivateKey + * + * @param key + * @return + * @throws Exception + */ + public static PrivateKey getPrivateKey(String key) throws Exception { + byte[] keyBytes; + keyBytes = Base64.decodeBase64(key);//new BASE64Decoder()).decodeBuffer(key); + PKCS8EncodedKeySpec keySpec = new PKCS8EncodedKeySpec(keyBytes); + KeyFactory keyFactory = KeyFactory.getInstance("RSA"); + PrivateKey privateKey = keyFactory.generatePrivate(keySpec); + return privateKey; + } + +} diff --git a/src/main/java/com/chinaunicom/mall/ebtp/userinfo/controller/AuthTokenController.java b/src/main/java/com/chinaunicom/mall/ebtp/userinfo/controller/AuthTokenController.java new file mode 100644 index 0000000..c5856cc --- /dev/null +++ b/src/main/java/com/chinaunicom/mall/ebtp/userinfo/controller/AuthTokenController.java @@ -0,0 +1,122 @@ +package com.chinaunicom.mall.ebtp.userinfo.controller; + +import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.JSONObject; +import com.chinaunicom.mall.ebtp.common.base.entity.BaseCacheUser; +import com.chinaunicom.mall.ebtp.common.base.service.IBaseCacheUserService; +import com.chinaunicom.mall.ebtp.common.exception.common.CommonExceptionEnum; +import com.chinaunicom.mall.ebtp.faceCompare.feign.SupplierbaseFeignClient; +import com.chinaunicom.mall.ebtp.userinfo.entity.AuthLogoutResponse; +import com.chinaunicom.mall.ebtp.userinfo.entity.BaseCert; +import com.chinaunicom.mall.ebtp.userinfo.entity.SupplierUserVo; +import com.chinaunicom.mall.ebtp.userinfo.service.AuthTokenService; +import com.chinaunicom.mall.ebtp.userinfo.service.EbtpUserInfoService; +import com.chinaunicom.mall.ebtp.userinfo.utils.BaseCertService; +import com.chinaunicom.mall.ebtp.userinfo.utils.HttpsUtils; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang.StringUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Qualifier; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.data.redis.core.RedisTemplate; +import org.springframework.http.HttpStatus; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.*; + +import javax.servlet.http.Cookie; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import java.util.HashMap; +import java.util.Map; +import java.util.Optional; +import java.util.concurrent.TimeUnit; + +import static com.chinaunicom.mall.ebtp.cloud.security.starter.common.Constants.*; + +@Slf4j +@RestController +@RequestMapping("/v1/auth/oauth/") +public class AuthTokenController { + + + @Value("${auth.oauth.client_id}") + private String client_id; + + @Value("${auth.oauth.client_secret}") + private String client_secret; + + @Value("${auth.oauth.client_Url}") + private String client_Url; + + @Qualifier("userinfoRedisTemplate") + private RedisTemplate redisTemplate; + + @Autowired + private AuthTokenService authTokenService; + + + /** + * 刷新redis缓存的信息 + * + * @return + */ + @PostMapping("token") + public ResponseEntity> token(HttpServletRequest request, + HttpServletResponse response, + @RequestParam(required = false) String grant_type, + @RequestParam(required = false) String redirect_uri, + @RequestParam(required = false) String code, + @RequestBody(required = false) String json) { + log.info("json:{}",json); + log.info("grant_type:{}",grant_type); + Map jsonMap = new HashMap(); + Map rmap = new HashMap<>(); + if(json!=null&&!"".equals(json)){ + String[] jsons = json.split("&"); + for(String val : jsons){ + log.info("json[]:"+val); + String[] s = val.split("="); + jsonMap.put(s[0],s[1]); + } + log.info("jsonMap:"+jsonMap); + grant_type = jsonMap.get("grant_type"); + CommonExceptionEnum.FRAME_EXCEPTION_COMMON_DATA_OTHER_ERROR.assertStringNotNullByKey("请求参数缺少grant_type",grant_type); + } + + String url = client_Url; + String rJson = ""; + if("refresh_token".equals(grant_type)){ + String oldToken = jsonMap.get("old_token"); + CommonExceptionEnum.FRAME_EXCEPTION_COMMON_DATA_OTHER_ERROR.assertStringNotNullByKey("请求参数缺少old_token",oldToken); + String data = json+"&client_id="+client_id+"&client_secret="+client_secret; + rJson = HttpsUtils.refreshHttpPost(url,data,client_id); + authTokenService.delRedis(REDIS_USER_KEY + oldToken); + rmap = JSON.parseObject(rJson,Map.class); + }else if("authorization_code".equals(grant_type)){ + url +="?grant_type="+grant_type+"&client_id="+client_id+"&client_secret="+client_secret+"&code="+code+"&redirect_uri="+redirect_uri; + rJson = HttpsUtils.authorizationCodeHttpPost(url); + rmap = JSON.parseObject(rJson,Map.class); + log.info("--------------rmap:"+rmap); + Map map = (Map)rmap.get("data"); + log.info("--------------map:"+map); + String token = (String)map.get("value"); + log.info("--------------token:"+token); + Cookie theC = new Cookie("mall3_token",token); + theC.setMaxAge(-1); + theC.setPath("/"); + response.addCookie(theC); + } + + + return ResponseEntity.ok(rmap); + } + + + public static void main(String arge[]){ + + String json = "grant_ty=refresh_token&refresh_token=77ccffba-9abb-4a4a-8745-f5c6f2813fb3"; + System.out.println(json.substring(json.indexOf("grant_type")+11,json.indexOf("&"))); + } + + +} diff --git a/src/main/java/com/chinaunicom/mall/ebtp/userinfo/controller/CheckTokenController.java b/src/main/java/com/chinaunicom/mall/ebtp/userinfo/controller/CheckTokenController.java new file mode 100644 index 0000000..096cd03 --- /dev/null +++ b/src/main/java/com/chinaunicom/mall/ebtp/userinfo/controller/CheckTokenController.java @@ -0,0 +1,43 @@ +package com.chinaunicom.mall.ebtp.userinfo.controller; + +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +@Slf4j +@RestController +@RequestMapping("/v1/checkToken") +public class CheckTokenController { + + + @Value("${check.tokentime.timeLimit}") + private String timeLimit; + + @Value("${check.tokentime.onof}") + private String onof; + + @Value("${check.tokentime.checkprivateKey}") + private String checkprivateKey; + + @Value("${check.tokentime.checkpublicKey}") + private String checkpublicKey; + + /** + * 获取checkToken信息 + * + * @param + * @return + */ +// @GetMapping("/getCheckTokenVo") +// public BaseResponse getCheckTokenVo(@RequestParam(value="ps",required = false) String ps){ +// CommonExceptionEnum.LOGIN_CHECK_TOKEN_EXPIRATION.assertStringNotNullByKey("网络异常",ps); +// CheckTokenVo vo = new CheckTokenVo(); +// vo.setTimeLimit(timeLimit); +// vo.setOnof(onof); +// vo.setCheckprivateKey(checkprivateKey); +// vo.setCheckpublicKey(checkpublicKey); +// return BaseResponse.success(vo); +// } + +} diff --git a/src/main/java/com/chinaunicom/mall/ebtp/userinfo/controller/ProviderForSerController.java b/src/main/java/com/chinaunicom/mall/ebtp/userinfo/controller/ProviderForSerController.java new file mode 100644 index 0000000..8da943a --- /dev/null +++ b/src/main/java/com/chinaunicom/mall/ebtp/userinfo/controller/ProviderForSerController.java @@ -0,0 +1,205 @@ +package com.chinaunicom.mall.ebtp.userinfo.controller; + +import cn.hutool.core.date.DateUnit; +import cn.hutool.core.date.DateUtil; +import cn.hutool.core.util.ObjectUtil; +import cn.hutool.json.JSONUtil; +import com.chinaunicom.mall.ebtp.common.base.entity.BaseResponse; +import com.chinaunicom.mall.ebtp.faceCompare.util.Sm2Encryptor; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.StringUtils; +import org.bouncycastle.crypto.InvalidCipherTextException; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Qualifier; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.data.redis.core.RedisTemplate; +import org.springframework.web.bind.annotation.*; +import org.springframework.web.servlet.ModelAndView; +import org.springframework.web.servlet.view.RedirectView; + +import javax.servlet.http.HttpServletResponse; +import java.io.IOException; +import java.security.MessageDigest; +import java.security.NoSuchAlgorithmException; +import java.text.SimpleDateFormat; +import java.time.LocalDateTime; +import java.time.ZoneId; +import java.util.Date; +import java.util.Map; +import java.util.concurrent.TimeUnit; + +/** + * @author : misaki + * @version : + * @date : 2021年05月28日 17:28 + * @description : + * @modified By : + * http://10.242.31.158:8100/auth/decide + */ +@Api(value = "招投标单点地址", tags = "招投标单点地址") +@RestController +@RequestMapping("/outer/v1.0/auth") +@Slf4j +public class ProviderForSerController { + @Autowired(required = false) + @Qualifier("userinfoRedisTemplate") + private RedisTemplate redisTemplate; + + @Value("${system_url}") + private String systemUrl; + + @Value("${public_key}") + private String publicKey; + + @Value("${ztb.clientId}") + private String ztbClientId; + + @Value("${ztb.clientSecret:}") + private String ztbClientSecret; + + @Value("${ztb.url}") + private String ztbUrl; + @Value("${ztb.url2}") + private String ztbUrl2; + + @ApiOperation(value = "合作方单点招投标地址") + @GetMapping("/partnerSso/{clientId}/{nonceStr}/{timestamp}/{loginId}/{sign}") + public ModelAndView partnerSso(@PathVariable("clientId")String clientId, + @PathVariable("nonceStr")String nonceStr, + @PathVariable("timestamp")String timestamp, + @PathVariable("loginId")String loginId, + @PathVariable("sign")String sign, + @RequestParam(value = "number",required = false) String number, + @RequestParam(value = "type",required = false) String type, + HttpServletResponse response)throws IOException { + response.setContentType("text/html; charset=UTF-8"); + + Object o = redisTemplate.opsForValue().get("partnerSso:"+nonceStr); + if (o != null){ + BaseResponse baseResponse = new BaseResponse(403,false,"请勿重复请求!",""); + response.getWriter().write(JSONUtil.toJsonStr(baseResponse)); + return null; + } + redisTemplate.opsForValue().set("partnerSso:"+nonceStr, 2, 20, TimeUnit.SECONDS); + // 有效期验证 + Date requestDate= DateUtil.parse(timestamp, "yyyy-MM-ddHH:mm:ss"); + long num = DateUtil.between(requestDate,new Date(), DateUnit.SECOND); + long maxNum = 60L; + if(num>maxNum){ + BaseResponse baseResponse = new BaseResponse(403,false,"签文已失效!",""); + response.getWriter().write(JSONUtil.toJsonStr(baseResponse)); + return null; + } + if(!ztbClientId.equals(clientId)){ + BaseResponse baseResponse = new BaseResponse(403,false,"未识别的clientId!",""); + response.getWriter().write(JSONUtil.toJsonStr(baseResponse)); + return null; + } + //loginId = "ex-zhouyz45"; + String signStr = "loginId="+loginId+"&clientId="+clientId+"&" + + "clientSecret="+ztbClientSecret+"" + + "&nonceStr="+nonceStr+"" + + "&number="+number+"" + + "&type="+type; + if(StringUtils.isEmpty(sign) || ObjectUtil.notEqual(md5(signStr),(sign))){ + BaseResponse baseResponse = new BaseResponse(401,false,"验签失败!",""); + response.getWriter().write(JSONUtil.toJsonStr(baseResponse)); + return null; + } + // 调用接口获取encodeUrl + String zturl = ztbUrl; + if(number!=null&&!"".equals(number)){ + zturl = ztbUrl2 +"&number="+number+"&type="+type; + } + String encodeUrl = generateEncodeUrl(ztbClientId,loginId,zturl,publicKey,null); + String url = systemUrl + "/auth/decide?" + encodeUrl; + log.info("合作方单点招投标地址:ProviderForSerController+decide------接口请求参数打印:{}", url); + ModelAndView modelAndView = new ModelAndView(new RedirectView(url)); + return modelAndView; + } + + public String generateEncodeUrl(String clientId, String uid, String redirectUrl, + String pKey,Map params) { + Sm2Encryptor sm2Encryptor = new Sm2Encryptor(); + LocalDateTime now = LocalDateTime.now(); + String splitChar = "@@"; + String char1 = "?"; + String char2 = "&"; + StringBuilder builder = new StringBuilder(100); + builder.append(clientId).append(splitChar); + builder.append(uid).append(splitChar); + if (params != null && !params.isEmpty()) { + builder.append(redirectUrl); + if (redirectUrl.contains(char1)) { + builder.append(char2); + } else { + builder.append(char1); + } + for (Map.Entry entry : params.entrySet()) { + builder.append(entry.getKey()).append("=").append(entry.getValue()).append(char2); + } + builder.deleteCharAt(builder.length() - 1).append(splitChar); + } else { + builder.append(redirectUrl).append(splitChar); + } + builder.append(now.atZone(ZoneId.systemDefault()).toInstant().toEpochMilli()); + try { + return sm2Encryptor.encryptString(builder.toString(), pKey); + } catch (InvalidCipherTextException e) { + e.printStackTrace(); + } + return ""; + } + /** + * MD5加密 + * @param plainText + */ + public static String md5(String plainText) { + try { + MessageDigest md = MessageDigest.getInstance("MD5"); + md.update(plainText.getBytes()); + byte[] b = md.digest(); + int i; + StringBuffer buf = new StringBuffer(""); + for (int offset = 0; offset < b.length; offset++) { + i = b[offset]; + if (i < 0) { + i += 256; + } + if (i < 16) { + buf.append("0"); + } + buf.append(Integer.toHexString(i)); + } + return buf.toString(); + } catch (NoSuchAlgorithmException e) { + return null; + } + } + + public static void main(String args[]){ + String loginId = "ex-wanghy623"; + String clientId = "KgPEkttG"; + String ztbClientSecret = "KKoiuheawiiHI3Ujsa45Oaow"; + Date date = new Date(); + SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMddHHmmss"); + SimpleDateFormat sdf2 = new SimpleDateFormat("yyyy-MM-ddHH:mm:ss"); + String nonceStr = sdf.format(date); + String timestamp = sdf2.format(date); + + String number = "SS00852406000068"; + String type = "procurement_mode_1"; + + String signStr = "loginId="+loginId+"&clientId="+clientId+"" + + "&clientSecret="+ztbClientSecret+"" + + "&nonceStr="+nonceStr+"" + + "&number="+number+"" + + "&type="+type; + String sign = md5(signStr); + String url = "/"+clientId+"/"+nonceStr+"/"+timestamp+"/"+loginId+"/"+sign+"?number="+number+"&type="+type; + String http ="http://10.125.18.237:8100/core-service-ebtp-userinfo/outer/v1.0/auth/partnerSso"; + System.out.println(http+url); + } +} diff --git a/src/main/java/com/chinaunicom/mall/ebtp/userinfo/controller/UserInfoController.java b/src/main/java/com/chinaunicom/mall/ebtp/userinfo/controller/UserInfoController.java new file mode 100644 index 0000000..79f19d0 --- /dev/null +++ b/src/main/java/com/chinaunicom/mall/ebtp/userinfo/controller/UserInfoController.java @@ -0,0 +1,239 @@ +package com.chinaunicom.mall.ebtp.userinfo.controller; + +import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.JSONObject; +import com.chinaunicom.mall.ebtp.cloud.security.starter.entity.SecurityEntity; +import com.chinaunicom.mall.ebtp.common.base.entity.BaseCacheUser; +import com.chinaunicom.mall.ebtp.common.base.service.IBaseCacheUserService; +import com.chinaunicom.mall.ebtp.common.exception.common.CommonExceptionEnum; +import com.chinaunicom.mall.ebtp.faceCompare.feign.SupplierbaseFeignClient; +import com.chinaunicom.mall.ebtp.userinfo.entity.*; +import com.chinaunicom.mall.ebtp.userinfo.service.EbtpUserInfoService; +import com.chinaunicom.mall.ebtp.userinfo.utils.BaseCertService; +import com.chinaunicom.mall.ebtp.userinfo.utils.HttpUtils; +import com.chinaunicom.mall.ebtp.userinfo.utils.UserinfoConstants; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang.StringUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Qualifier; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.data.redis.core.RedisTemplate; +import org.springframework.http.HttpStatus; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.*; + +import javax.servlet.http.Cookie; +import javax.servlet.http.HttpServletResponse; +import java.nio.charset.StandardCharsets; +import java.security.MessageDigest; +import java.util.HashMap; +import java.util.Map; +import java.util.concurrent.TimeUnit; + +import static com.chinaunicom.mall.ebtp.cloud.security.starter.common.Constants.TOKEN_PREFIX; + +@Slf4j +@RestController +@RequestMapping("/v1/userinfo/") +public class UserInfoController { + + + @Autowired + private EbtpUserInfoService ebtpUserInfoService; + + @Autowired + private SupplierbaseFeignClient supplierbaseFeignClient; + + @Autowired + private IBaseCacheUserService cacheUserService; + @Autowired(required = false) + @Qualifier("cacheRedisTemplate") + private RedisTemplate redisTemplate; + + @Autowired + private BaseCertService baseCertService; + + @Value("${mconfig.checkTokenPath}") + private String checkTokenPath; + + private static Map securityEntityMap; + + /** + * 获取用户信息 + * + * @param token (认证token) + * @return + */ + @GetMapping("get") + public ResponseEntity getUserInfo( + @RequestHeader(name = "Authorization", required = false) String token) { + if (StringUtils.isEmpty(token)) { + log.error("access token is empty"); + return ResponseEntity.status(HttpStatus.UNAUTHORIZED).build(); + } + return ResponseEntity.ok(cacheUserService.getCacheUser()); + } + + + /** + * 刷新redis缓存的信息 + * + * @return + */ + @PostMapping("refresh") + public ResponseEntity refreshToken() { + return ResponseEntity.ok(ebtpUserInfoService.refresh()); + } + + /** + * 系统登出 + * @param token + * @return + */ + @GetMapping("logout") + public AuthLogoutResponse logout(@RequestHeader(name = "Authorization") String token){ + return ebtpUserInfoService.logout(token.replaceAll(TOKEN_PREFIX, "")); + } + /** + * 供应商根据机构查询机构成员接口 封装 + * + * @return + */ + @PostMapping("findUserCountListBySupplierCodePage") + public ResponseEntity findUserCountListBySupplierCodePage(@RequestBody SupplierUserVo vo) { + + //if(vo.getPartnerMdmCode().equals(cacheUserService.getCacheUser().getOrganizationId())){ + vo.setPartnerMdmCode(cacheUserService.getCacheUser().getOrganizationId()); + Object object = supplierbaseFeignClient.findUserCountListBySupplierCodePage(vo); + Map map = JSONObject.parseObject(JSONObject.toJSONString(object)); + log.info("-------供应商根据机构查询机构成员接口 封装---:"+map); + map.put("code",map.get("code")!=null?map.get("code").toString():""); + return ResponseEntity.ok(map); + //}else{ + // return ResponseEntity.ok(null); + //} + } + + /** + * 获取验证码 + * @param + * @return + */ + @GetMapping("getCert") + public ResponseEntity getCert(@RequestHeader(name = "Authorization", required = false) String token){ + BaseCert cert = baseCertService.choose(); + Map map = JSONObject.parseObject(JSONObject.toJSONString(cert)); + String key = "cert_"+token; + redisTemplate.opsForHash().putAll(key,map); + redisTemplate.expire(key,2, TimeUnit.MINUTES); + + return ResponseEntity.ok(cert); + } + + public static void main(String args[]){ + } + + /** + * 专家登录 + * @paramorderPayP2PReceive + * @return + */ + @PostMapping("expertLogin") + public ResponseEntity> expertLogin(HttpServletResponse response,@RequestBody ExpertLoginUser user) { + + log.info("--------------ExpertLoginUser:"+user); + CommonExceptionEnum.FRAME_EXCEPTION_COMMON_NOT_FIND.assertStringNotNullByKey("账号",user.getIdentityCard()); + CommonExceptionEnum.FRAME_EXCEPTION_COMMON_NOT_FIND.assertStringNotNullByKey("密码",user.getPassword()); + CommonExceptionEnum.FRAME_EXCEPTION_COMMON_NOT_FIND.assertStringNotNullByKey("验证码",user.getCaptcha()); + CommonExceptionEnum.FRAME_EXCEPTION_COMMON_NOT_FIND.assertStringNotNullByKey("clientId",user.getClientId()); + Map rmap = ebtpUserInfoService.expertLoginCheck(user); + setCookie(response,rmap); + return ResponseEntity.ok(rmap); + } + + private void setCookie(HttpServletResponse response,Map rmap){ + Boolean b = UserinfoConstants.okCode.equals(rmap.get(UserinfoConstants.responseCode)); + if(b) { + log.info("--------------rmap:" + rmap); + Map map = (Map) rmap.get("data"); + log.info("--------------map:" + + map); + String token = (String) map.get("value"); + log.info("--------------token:" + token); + Cookie theC = new Cookie("mall3_token", token); + theC.setMaxAge(-1); + theC.setPath("/"); + response.addCookie(theC); + } + } + + /** + * 专家密码修改 + * @param + * @return + */ + @PostMapping("reSetPassExpeBaseInfo") + public ResponseEntity> reSetPassExpeBaseInfo(HttpServletResponse response, @RequestBody ExpertUpdateUser user) { + + log.info("--------------reSetPassExpeBaseInfo:"+user); + CommonExceptionEnum.FRAME_EXCEPTION_COMMON_NOT_FIND.assertStringNotNullByKey("账号",user.getIdentityCard()); + CommonExceptionEnum.FRAME_EXCEPTION_COMMON_NOT_FIND.assertStringNotNullByKey("新密码",user.getNewPassword()); + CommonExceptionEnum.FRAME_EXCEPTION_COMMON_NOT_FIND.assertStringNotNullByKey("旧密码",user.getOldPassword()); + CommonExceptionEnum.FRAME_EXCEPTION_COMMON_NOT_FIND.assertStringNotNullByKey("验证码",user.getCode()); + + return ResponseEntity.ok(ebtpUserInfoService.reSetPassExpeBaseInfo(user)); + } + + public static String MD5min(String str) { + String result = ""; + try { + MessageDigest md5 = MessageDigest.getInstance("MD5"); + md5.update(str.getBytes(StandardCharsets.UTF_8)); + byte[] b = md5.digest(); + StringBuilder buf = new StringBuilder(""); + for(int offset = 0; offset < b.length; ++offset) { + int i = b[offset]; + if (i < 0) { + i += 256; + } + if (i < 16) { + buf.append("0"); + } + buf.append(Integer.toHexString(i)); + } + result = buf.toString(); + return result; + } catch (Exception var7) { + return null; + } + } + + @PostMapping("put/user") + public ResponseEntity putUser(@RequestBody SecurityEntity securityEntity){ + String token = UserInfoController.MD5min(securityEntity.getUserid()); + securityEntityMap.put(token,securityEntity); + return ResponseEntity.ok(token); + } + + @GetMapping("getList/user") + public ResponseEntity getListUser(){ + return ResponseEntity.ok(securityEntityMap); + } + + @GetMapping("oauth/check_token") + public SecurityEntity check_token(@RequestParam("token") String token){ + SecurityEntity securityEntity = new SecurityEntity(); + try { + String path = checkTokenPath+"?token="+token; + log.info("path:"+path); + String str = HttpUtils.checkTokenHttpGet(path); + + securityEntity = JSON.parseObject(str,SecurityEntity.class); + //Object o = unifastOAuthBdClient.get(token); + }catch (Exception e){ + e.printStackTrace(); + } + return securityEntity; + } + +} diff --git a/src/main/java/com/chinaunicom/mall/ebtp/userinfo/controller/UserPasswordController.java b/src/main/java/com/chinaunicom/mall/ebtp/userinfo/controller/UserPasswordController.java new file mode 100644 index 0000000..57ddbad --- /dev/null +++ b/src/main/java/com/chinaunicom/mall/ebtp/userinfo/controller/UserPasswordController.java @@ -0,0 +1,31 @@ +package com.chinaunicom.mall.ebtp.userinfo.controller; + + +import com.chinaunicom.mall.ebtp.cloud.security.starter.entity.SecurityEntity; +import com.chinaunicom.mall.ebtp.common.base.entity.BaseResponse; +import com.chinaunicom.mall.ebtp.userinfo.service.IUserPasswordService; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import org.springframework.web.bind.annotation.*; + +import javax.annotation.Resource; + +@RestController +@Api(tags = "") +@RequestMapping("/v1/userpassword") +public class UserPasswordController { + + @Resource + private IUserPasswordService iuserPasswordService; + + /** + * 查询数据 + * + * @return + */ + @ApiOperation("查询数据") + @PostMapping("/validatePassword") + public BaseResponse validatePassword(@RequestParam("code") String code) { + return BaseResponse.success(iuserPasswordService.validatePassword(code)); + } +} diff --git a/src/main/java/com/chinaunicom/mall/ebtp/userinfo/dao/BaseRoleMapper.java b/src/main/java/com/chinaunicom/mall/ebtp/userinfo/dao/BaseRoleMapper.java new file mode 100644 index 0000000..e53910a --- /dev/null +++ b/src/main/java/com/chinaunicom/mall/ebtp/userinfo/dao/BaseRoleMapper.java @@ -0,0 +1,12 @@ +package com.chinaunicom.mall.ebtp.userinfo.dao; + + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.chinaunicom.mall.ebtp.userinfo.entity.BaseRole; +import org.apache.ibatis.annotations.Mapper; + +@Mapper +public interface BaseRoleMapper extends BaseMapper { + + +} diff --git a/src/main/java/com/chinaunicom/mall/ebtp/userinfo/dao/BaseUserMapper.java b/src/main/java/com/chinaunicom/mall/ebtp/userinfo/dao/BaseUserMapper.java new file mode 100644 index 0000000..0add4a3 --- /dev/null +++ b/src/main/java/com/chinaunicom/mall/ebtp/userinfo/dao/BaseUserMapper.java @@ -0,0 +1,12 @@ +package com.chinaunicom.mall.ebtp.userinfo.dao; + + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.chinaunicom.mall.ebtp.userinfo.entity.BaseUser; +import org.apache.ibatis.annotations.Mapper; + +@Mapper +public interface BaseUserMapper extends BaseMapper { + + +} diff --git a/src/main/java/com/chinaunicom/mall/ebtp/userinfo/dao/UserPasswordMapper.java b/src/main/java/com/chinaunicom/mall/ebtp/userinfo/dao/UserPasswordMapper.java new file mode 100644 index 0000000..f68e73f --- /dev/null +++ b/src/main/java/com/chinaunicom/mall/ebtp/userinfo/dao/UserPasswordMapper.java @@ -0,0 +1,13 @@ +package com.chinaunicom.mall.ebtp.userinfo.dao; + + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.chinaunicom.mall.ebtp.userinfo.entity.UserPassword; + +/** + * @author daixc + */ +public interface UserPasswordMapper extends BaseMapper { + + +} diff --git a/src/main/java/com/chinaunicom/mall/ebtp/userinfo/dao/mapper/UserPasswordMapper.xml b/src/main/java/com/chinaunicom/mall/ebtp/userinfo/dao/mapper/UserPasswordMapper.xml new file mode 100644 index 0000000..8e4c11c --- /dev/null +++ b/src/main/java/com/chinaunicom/mall/ebtp/userinfo/dao/mapper/UserPasswordMapper.xml @@ -0,0 +1,16 @@ + + + + + + + + + + + update user_password + set delete_flag="deleted" + where ID = #{id,jdbcType=BIGINT} + + \ No newline at end of file diff --git a/src/main/java/com/chinaunicom/mall/ebtp/userinfo/entity/AuthCodeVo.java b/src/main/java/com/chinaunicom/mall/ebtp/userinfo/entity/AuthCodeVo.java new file mode 100644 index 0000000..299d154 --- /dev/null +++ b/src/main/java/com/chinaunicom/mall/ebtp/userinfo/entity/AuthCodeVo.java @@ -0,0 +1,9 @@ +package com.chinaunicom.mall.ebtp.userinfo.entity; + +import lombok.Data; + +@Data +public class AuthCodeVo { + private String mobile; + private String authCode; +} diff --git a/src/main/java/com/chinaunicom/mall/ebtp/userinfo/entity/AuthLogoutResponse.java b/src/main/java/com/chinaunicom/mall/ebtp/userinfo/entity/AuthLogoutResponse.java new file mode 100644 index 0000000..84c59e4 --- /dev/null +++ b/src/main/java/com/chinaunicom/mall/ebtp/userinfo/entity/AuthLogoutResponse.java @@ -0,0 +1,38 @@ +package com.chinaunicom.mall.ebtp.userinfo.entity; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.experimental.Accessors; + +@Data +@Accessors(chain = true) +@ApiModel +public class AuthLogoutResponse { + + private static final Long serialVersionUID = 1L; + + /** + * 编码 + */ + @ApiModelProperty(value = "编码") + private String code; + + /** + * 是否成功 + */ + @ApiModelProperty(value = "是否成功") + private boolean success; + + /** + * 消息 + */ + @ApiModelProperty(value = "消息") + private String message; + + /** + * 数据 + */ + @ApiModelProperty(value = "数据") + private String data; +} diff --git a/src/main/java/com/chinaunicom/mall/ebtp/userinfo/entity/BaseCert.java b/src/main/java/com/chinaunicom/mall/ebtp/userinfo/entity/BaseCert.java new file mode 100644 index 0000000..5c5ae2b --- /dev/null +++ b/src/main/java/com/chinaunicom/mall/ebtp/userinfo/entity/BaseCert.java @@ -0,0 +1,39 @@ +package com.chinaunicom.mall.ebtp.userinfo.entity; + +import java.io.Serializable; + +/** + * @author ligen + * + */ +public class BaseCert implements Serializable { + private static final long serialVersionUID = 8742944090042055374L; + + /** + * 验证码key + */ + private String key; + + /** + * 图片base64码 + */ + private String image; + + public String getKey() { + return key; + } + + public BaseCert setKey(String key) { + this.key = key; + return this; + } + + public String getImage() { + return image; + } + + public BaseCert setImage(String image) { + this.image = image; + return this; + } +} diff --git a/src/main/java/com/chinaunicom/mall/ebtp/userinfo/entity/BaseRole.java b/src/main/java/com/chinaunicom/mall/ebtp/userinfo/entity/BaseRole.java new file mode 100644 index 0000000..0a6c79b --- /dev/null +++ b/src/main/java/com/chinaunicom/mall/ebtp/userinfo/entity/BaseRole.java @@ -0,0 +1,47 @@ +package com.chinaunicom.mall.ebtp.userinfo.entity; + +import com.baomidou.mybatisplus.annotation.TableName; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.experimental.Accessors; + +import java.io.Serializable; + +/** + * 功能模块bean + * + * @author zyx + */ +@Data +@Accessors(chain = true) +@ApiModel +@TableName(value = "maint_base_role", autoResultMap = true) +public class BaseRole implements Serializable { + + private static final Long serialVersionUID = 1L; + + /** + * 姓名 + */ + @ApiModelProperty(value = "角色") + private String role; + + /** + * 账号 + */ + @ApiModelProperty(value = "备注") + private String remarks; + + /** + * role_id + */ + @ApiModelProperty(value = "role_id") + private String roleId; + + /** + * 账号 + */ + @ApiModelProperty(value = "状态,0-默认") + private int status; +} diff --git a/src/main/java/com/chinaunicom/mall/ebtp/userinfo/entity/BaseUser.java b/src/main/java/com/chinaunicom/mall/ebtp/userinfo/entity/BaseUser.java new file mode 100644 index 0000000..641cc8d --- /dev/null +++ b/src/main/java/com/chinaunicom/mall/ebtp/userinfo/entity/BaseUser.java @@ -0,0 +1,64 @@ +package com.chinaunicom.mall.ebtp.userinfo.entity; + +import com.baomidou.mybatisplus.annotation.TableName; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.experimental.Accessors; + +import java.io.Serializable; + +/** + * 功能模块bean + * + * @author zyx + */ +@Data +@Accessors(chain = true) +@ApiModel +@TableName(value = "maint_base_user", autoResultMap = true) +public class BaseUser implements Serializable { + + private static final Long serialVersionUID = 1L; + /** + * id + */ + @ApiModelProperty(value = "编号") + private String id; + + /** + * 姓名 + */ + @ApiModelProperty(value = "姓名") + private String name; + + /** + * 账号 + */ + @ApiModelProperty(value = "账号") + private String account; + + /** + * 密码 + */ + @ApiModelProperty(value = "密码") + private String password; + + /** + * 省份 + */ + @ApiModelProperty(value = "省份") + private String province; + + /** + * 角色 + */ + @ApiModelProperty(value = "角色") + private String role; + + /** + * 租户 + */ + @ApiModelProperty(value = "租户") + private String tenant; +} diff --git a/src/main/java/com/chinaunicom/mall/ebtp/userinfo/entity/ExpertLoginUser.java b/src/main/java/com/chinaunicom/mall/ebtp/userinfo/entity/ExpertLoginUser.java new file mode 100644 index 0000000..50b0be3 --- /dev/null +++ b/src/main/java/com/chinaunicom/mall/ebtp/userinfo/entity/ExpertLoginUser.java @@ -0,0 +1,64 @@ +package com.chinaunicom.mall.ebtp.userinfo.entity; + +import com.baomidou.mybatisplus.annotation.TableName; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.experimental.Accessors; + +import java.io.Serializable; + +/** + * 功能模块bean + * + * @author zyx + */ +@Data +public class ExpertLoginUser { + + /** + * identityCard 账号 身份证号 + */ + @ApiModelProperty(value = "identityCard") + private String identityCard; + + /** + * 密码 + */ + @ApiModelProperty(value = "密码") + private String password; + + /** + * captcha + */ + @ApiModelProperty(value = "captcha") + private String captcha; + + /** + * token + */ + @ApiModelProperty(value = "token") + private String token; + + /** + * clientId + */ + @ApiModelProperty(value = "clientId") + private String clientId; + + /** + * 手机号 + */ + @ApiModelProperty(value = "tel") + private String tel; + /** + * 手机验证码 + */ + @ApiModelProperty(value = "pcaptcha") + private String pcaptcha; + /** + * 评审口令 + */ + @ApiModelProperty(value = "verificationCode") + private String verificationCode; +} diff --git a/src/main/java/com/chinaunicom/mall/ebtp/userinfo/entity/ExpertUpdateUser.java b/src/main/java/com/chinaunicom/mall/ebtp/userinfo/entity/ExpertUpdateUser.java new file mode 100644 index 0000000..8ac476e --- /dev/null +++ b/src/main/java/com/chinaunicom/mall/ebtp/userinfo/entity/ExpertUpdateUser.java @@ -0,0 +1,43 @@ +package com.chinaunicom.mall.ebtp.userinfo.entity; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +/** + * 功能模块bean + * + * @author zyx + */ +@Data +public class ExpertUpdateUser { + + /** + * identityCard 账号 身份证号 + */ + @ApiModelProperty(value = "identityCard") + private String identityCard; + + /** + * 新密码 + */ + @ApiModelProperty(value = "新密码") + private String newPassword; + /** + * 旧密码 + */ + @ApiModelProperty(value = "旧密码") + private String oldPassword; + + /** + * token + */ + @ApiModelProperty(value = "token") + private String token; + + /** + * 验证码 + */ + @ApiModelProperty(value = "验证码") + private String code; + +} diff --git a/src/main/java/com/chinaunicom/mall/ebtp/userinfo/entity/SupplierUserVo.java b/src/main/java/com/chinaunicom/mall/ebtp/userinfo/entity/SupplierUserVo.java new file mode 100644 index 0000000..3b2bb44 --- /dev/null +++ b/src/main/java/com/chinaunicom/mall/ebtp/userinfo/entity/SupplierUserVo.java @@ -0,0 +1,48 @@ +package com.chinaunicom.mall.ebtp.userinfo.entity; + +import com.baomidou.mybatisplus.annotation.TableName; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.experimental.Accessors; + +import javax.validation.constraints.Min; +import javax.validation.constraints.NotNull; +import java.io.Serializable; + +/** + * 功能模块bean + * + * @author zyx + */ +@Data +@Accessors(chain = true) +@ApiModel +public class SupplierUserVo { + + @ApiModelProperty("当前页") + @NotNull + @Min(0) + private Integer current; + + @ApiModelProperty("每页显示条数") + @NotNull + @Min(0) + private Integer pageSize; + + @ApiModelProperty("每页显示条数") + @NotNull + @Min(0) + private Integer pageNum; + + /** + * 机构id + */ + private String partnerMdmCode; + /** + * 当前用户 + */ + private String empName; + + +} diff --git a/src/main/java/com/chinaunicom/mall/ebtp/userinfo/entity/UserPassword.java b/src/main/java/com/chinaunicom/mall/ebtp/userinfo/entity/UserPassword.java new file mode 100644 index 0000000..fbdddd6 --- /dev/null +++ b/src/main/java/com/chinaunicom/mall/ebtp/userinfo/entity/UserPassword.java @@ -0,0 +1,33 @@ +package com.chinaunicom.mall.ebtp.userinfo.entity; + +import com.baomidou.mybatisplus.annotation.TableName; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; + +import java.io.Serializable; + +/** + * 实体类 UserPassword + * + * @auto.generated + */ +@Data +@Accessors(chain = true) +@ApiModel +@EqualsAndHashCode(callSuper = false) +@TableName(value = "user_password", autoResultMap = true) +public class UserPassword implements Serializable { + + private static final long serialVersionUID = 1L; + + /** + * + */ + @ApiModelProperty(value = "") + private String password; + + +} diff --git a/src/main/java/com/chinaunicom/mall/ebtp/userinfo/entity/vo/SsoVO.java b/src/main/java/com/chinaunicom/mall/ebtp/userinfo/entity/vo/SsoVO.java new file mode 100644 index 0000000..49e8bd0 --- /dev/null +++ b/src/main/java/com/chinaunicom/mall/ebtp/userinfo/entity/vo/SsoVO.java @@ -0,0 +1,32 @@ +/** + * Copyright (c) 2022, CHINAUNICOM. All rights reserved. + */ +package com.chinaunicom.mall.ebtp.userinfo.entity.vo; + +import lombok.Data; + +import java.io.Serializable; +import java.util.Map; + +/** + * + * @file: cn.chinaunicom.sdsi.business.provider.vo.SsoVO + * @description: + * @author: lichangming + * @date: 2022-05-19 + * @version: V1.0 + * @update [序号][日期YYYY-MM-DD] [更改人姓名][变更描述] + */ +@Data +public class SsoVO implements Serializable { + + private String clientId; + + private String url; + + private Map params; + + private String token; + + private String uid; +} diff --git a/src/main/java/com/chinaunicom/mall/ebtp/userinfo/fallback/UnicomOAuthClientFallback.java b/src/main/java/com/chinaunicom/mall/ebtp/userinfo/fallback/UnicomOAuthClientFallback.java new file mode 100644 index 0000000..ba8cb9e --- /dev/null +++ b/src/main/java/com/chinaunicom/mall/ebtp/userinfo/fallback/UnicomOAuthClientFallback.java @@ -0,0 +1,15 @@ +package com.chinaunicom.mall.ebtp.userinfo.fallback; + +import com.chinaunicom.mall.ebtp.userinfo.entity.AuthLogoutResponse; +import com.chinaunicom.mall.ebtp.userinfo.service.UnicomOAuthClient; +import org.springframework.stereotype.Component; + +@Component +public class UnicomOAuthClientFallback implements UnicomOAuthClient { + + @Override + public AuthLogoutResponse logout(String token) { + return null; + } + +} diff --git a/src/main/java/com/chinaunicom/mall/ebtp/userinfo/fallback/UnicomOAuthClientFallbackFactory.java b/src/main/java/com/chinaunicom/mall/ebtp/userinfo/fallback/UnicomOAuthClientFallbackFactory.java new file mode 100644 index 0000000..1c78793 --- /dev/null +++ b/src/main/java/com/chinaunicom/mall/ebtp/userinfo/fallback/UnicomOAuthClientFallbackFactory.java @@ -0,0 +1,18 @@ +package com.chinaunicom.mall.ebtp.userinfo.fallback; + +import com.chinaunicom.mall.ebtp.userinfo.service.UnicomOAuthClient; +import feign.hystrix.FallbackFactory; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Component; + +@Slf4j +@Component +public class UnicomOAuthClientFallbackFactory implements FallbackFactory { + + @Override + public UnicomOAuthClient create(Throwable cause) { + log.error("UnifastOAuthClient error : " +cause.getMessage()); + return new UnicomOAuthClientFallback(); + } + +} diff --git a/src/main/java/com/chinaunicom/mall/ebtp/userinfo/service/AuthTokenService.java b/src/main/java/com/chinaunicom/mall/ebtp/userinfo/service/AuthTokenService.java new file mode 100644 index 0000000..44b3f83 --- /dev/null +++ b/src/main/java/com/chinaunicom/mall/ebtp/userinfo/service/AuthTokenService.java @@ -0,0 +1,13 @@ +package com.chinaunicom.mall.ebtp.userinfo.service; + +public interface AuthTokenService { + + + /** + * 删除redis缓存的信息 + * + * @return + */ + public boolean delRedis(String key); + +} diff --git a/src/main/java/com/chinaunicom/mall/ebtp/userinfo/service/EbtpUserInfoService.java b/src/main/java/com/chinaunicom/mall/ebtp/userinfo/service/EbtpUserInfoService.java new file mode 100644 index 0000000..5527be7 --- /dev/null +++ b/src/main/java/com/chinaunicom/mall/ebtp/userinfo/service/EbtpUserInfoService.java @@ -0,0 +1,39 @@ +package com.chinaunicom.mall.ebtp.userinfo.service; + +import com.chinaunicom.mall.ebtp.userinfo.entity.AuthLogoutResponse; +import com.chinaunicom.mall.ebtp.userinfo.entity.ExpertLoginUser; +import com.chinaunicom.mall.ebtp.userinfo.entity.ExpertUpdateUser; + +import java.util.Map; + +public interface EbtpUserInfoService { + + + /** + * 刷新redis缓存的信息 + * + * @return + */ + public boolean refresh(); + + /** + * 系统登出 + * @param token + * @return + */ + public AuthLogoutResponse logout(String token); + + + /** + * 专家登录校验 + * @param user + * @return + */ + Map expertLoginCheck(ExpertLoginUser user); + /** + * 专家面修改 + * @param user + * @return + */ + Map reSetPassExpeBaseInfo(ExpertUpdateUser user); +} diff --git a/src/main/java/com/chinaunicom/mall/ebtp/userinfo/service/IUserPasswordService.java b/src/main/java/com/chinaunicom/mall/ebtp/userinfo/service/IUserPasswordService.java new file mode 100644 index 0000000..c17943f --- /dev/null +++ b/src/main/java/com/chinaunicom/mall/ebtp/userinfo/service/IUserPasswordService.java @@ -0,0 +1,15 @@ +package com.chinaunicom.mall.ebtp.userinfo.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.chinaunicom.mall.ebtp.userinfo.entity.UserPassword; + +/** + * 对数据表 user_password 操作的 service + * + * @author Auto create + */ +public interface IUserPasswordService extends IService { + + + boolean validatePassword(String code); +} diff --git a/src/main/java/com/chinaunicom/mall/ebtp/userinfo/service/UnicomOAuthClient.java b/src/main/java/com/chinaunicom/mall/ebtp/userinfo/service/UnicomOAuthClient.java new file mode 100644 index 0000000..5a61589 --- /dev/null +++ b/src/main/java/com/chinaunicom/mall/ebtp/userinfo/service/UnicomOAuthClient.java @@ -0,0 +1,19 @@ +package com.chinaunicom.mall.ebtp.userinfo.service; + +import com.chinaunicom.mall.ebtp.userinfo.entity.AuthLogoutResponse; +import com.chinaunicom.mall.ebtp.userinfo.fallback.UnicomOAuthClientFallbackFactory; +import org.springframework.cloud.openfeign.FeignClient; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestParam; + +/** + * 认证中心数据服务客户端 + * + * @author Ajaxfan + */ +@FeignClient(value = "${user.auth.resource.serviceId:mall-auth}", + fallbackFactory = UnicomOAuthClientFallbackFactory.class) +public interface UnicomOAuthClient { + @GetMapping("logout") + AuthLogoutResponse logout(@RequestParam("mall3_token") String token); +} diff --git a/src/main/java/com/chinaunicom/mall/ebtp/userinfo/service/impl/AuthTokenServiceImpl.java b/src/main/java/com/chinaunicom/mall/ebtp/userinfo/service/impl/AuthTokenServiceImpl.java new file mode 100644 index 0000000..c962caf --- /dev/null +++ b/src/main/java/com/chinaunicom/mall/ebtp/userinfo/service/impl/AuthTokenServiceImpl.java @@ -0,0 +1,43 @@ +package com.chinaunicom.mall.ebtp.userinfo.service.impl; + + +import com.chinaunicom.mall.ebtp.userinfo.service.AuthTokenService; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Qualifier; +import org.springframework.data.redis.core.RedisTemplate; +import org.springframework.stereotype.Service; + +import java.util.Optional; + +/** + * @author chinazqb + */ +@Slf4j +@Service +public class AuthTokenServiceImpl implements AuthTokenService { + + @Autowired + @Qualifier("userinfoRedisTemplate") + private RedisTemplate redisTemplate; + + /** + * 删除token缓存 + * + * @return + */ + @Override + public boolean delRedis(String key) { + log.info("redisTemplate:"+redisTemplate); + //清除redis中token + Optional o = Optional.ofNullable(this.redisTemplate.opsForValue().get(key)); + log.info("redisTemplate o:"+o); + if (o.isPresent()) { + this.redisTemplate.delete(key); + log.info("[RequestShardValue]:has removed key={}", key); + }else{ + return false; + } + return true; + } +} diff --git a/src/main/java/com/chinaunicom/mall/ebtp/userinfo/service/impl/EbtpUserInfoServiceImpl.java b/src/main/java/com/chinaunicom/mall/ebtp/userinfo/service/impl/EbtpUserInfoServiceImpl.java new file mode 100644 index 0000000..9867ffc --- /dev/null +++ b/src/main/java/com/chinaunicom/mall/ebtp/userinfo/service/impl/EbtpUserInfoServiceImpl.java @@ -0,0 +1,217 @@ +package com.chinaunicom.mall.ebtp.userinfo.service.impl; + + +import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.JSONObject; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import com.chinaunicom.mall.ebtp.common.exception.common.CommonExceptionEnum; +import com.chinaunicom.mall.ebtp.common.util.JsonUtils; +import com.chinaunicom.mall.ebtp.faceCompare.entity.BizAssessRoom; +import com.chinaunicom.mall.ebtp.faceCompare.feign.AssessjFeignClient; +import com.chinaunicom.mall.ebtp.faceCompare.feign.ExtendFeignClient; +import com.chinaunicom.mall.ebtp.faceCompare.feign.RsmsFeignClient; +import com.chinaunicom.mall.ebtp.test.RSA; +import com.chinaunicom.mall.ebtp.userinfo.dao.BaseRoleMapper; +import com.chinaunicom.mall.ebtp.userinfo.dao.BaseUserMapper; +import com.chinaunicom.mall.ebtp.userinfo.entity.*; +import com.chinaunicom.mall.ebtp.userinfo.service.EbtpUserInfoService; +import com.chinaunicom.mall.ebtp.userinfo.service.UnicomOAuthClient; +import com.chinaunicom.mall.ebtp.userinfo.utils.HttpsUtils; +import com.chinaunicom.mall.ebtp.userinfo.utils.UserinfoConstants; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Qualifier; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.data.redis.core.RedisTemplate; +import org.springframework.http.ResponseEntity; +import org.springframework.stereotype.Service; +import org.springframework.web.bind.annotation.RequestBody; + +import javax.annotation.Resource; +import java.net.URLDecoder; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.concurrent.TimeUnit; +import java.util.stream.Collectors; + + +import static com.chinaunicom.mall.ebtp.cloud.security.starter.common.Constants.*; +@Slf4j +@Service +public class EbtpUserInfoServiceImpl implements EbtpUserInfoService { + + @Autowired + private BaseUserMapper baseUserMapper; + @Autowired + private BaseRoleMapper baseRoleMapper; + + @Autowired + @Qualifier("userinfoRedisTemplate") + private RedisTemplate redisTemplate; + + @Resource + private UnicomOAuthClient unicomOAuthClient; + + @Autowired + private RsmsFeignClient rsmsFeignClient; + + @Autowired + private AssessjFeignClient assessjFeignClient; + + @Autowired + private ExtendFeignClient extendFeignClient; + + @Value("${auth.oauth.expert_url}") + private String expert_url; //="http://10.242.31.158:8100/auth/expertLogin"; + + @Value("${jury.loginCheck.privateKey}") + private String privateKey; + + @Value("${auth.oauth.expert_update_url}") + private String expert_update_url; + /** + * 删除token缓存 + * + * @return + */ + @Override + public boolean refresh() { + Map map = new HashMap<>(); + List users = baseUserMapper.selectList(Wrappers.lambdaQuery(BaseUser.class).eq(BaseUser::getTenant, "ebtp_mall")); + map.put(USERS, JsonUtils.objectToJson(users)); + List roles = baseRoleMapper.selectList(Wrappers.emptyWrapper()); + map.put(ROLES, JsonUtils.objectToJson(roles)); + redisTemplate.opsForValue().set(REDIS_USER_KEY_EXTEND, JsonUtils.objectToJson(map), 24, TimeUnit.HOURS); + return true; + } + + public EbtpUserInfoServiceImpl() { + super(); + } + + /** + * 系统登出 + * @param token + * @return + */ + @Override + public AuthLogoutResponse logout(String token){ + AuthLogoutResponse response; + try{ + //调用认证中心登出 + response = unicomOAuthClient.logout(token); + //如果注销成功,删除redis + try{ + if(response.isSuccess() && response.getData().equals("success")) { + redisTemplate.delete(REDIS_USER_KEY + token); + } + }finally { + return response; + } + }catch(Exception e){ + response = new AuthLogoutResponse(); + response.setCode("1").setSuccess(false).setMessage("注销失败").setData("error"); + return response; + } + } + + @Override + public Map expertLoginCheck(ExpertLoginUser user){ + Boolean b = false; + //先校验认证中心 + log.info("身份证解密前:"+user.getIdentityCard()); + String identityCard = RSA.decrypt(user.getIdentityCard(),privateKey); + log.info("身份证解密结果:"+identityCard); + user.setIdentityCard(identityCard); + + Map map = JSON.parseObject(JSON.toJSONString(user), Map.class); + String json =""; + for(String key :map.keySet()){ + if(!"".equals(json)){ + json+="&"; + } + json+=key+"="+map.get(key); + } + String rJson = HttpsUtils.expertHttpPost(expert_url, json, user.getClientId()); + Map rmap = JSON.parseObject(rJson, Map.class); + b = UserinfoConstants.okCode.equals(rmap.get(UserinfoConstants.responseCode)); + + if(b) { + //手机验证码 + if(user.getPcaptcha()!=null&&!"".equals(user.getPcaptcha())&&user.getTel()!=null&&!"".equals(user.getTel())){ + + /** + * extend会解密 这里只是展示 + */ + String cTel = RSA.decrypt(user.getTel(),privateKey); + log.info("解密后手机号:"+cTel); + + AuthCodeVo vo = new AuthCodeVo(); + vo.setMobile(user.getTel()); + vo.setAuthCode(user.getPcaptcha()); + + Boolean telCheck = extendFeignClient.authCodeCheck(vo).getData(); + if(telCheck!=null&&telCheck){ + //b = true; + }else{ + CommonExceptionEnum.FRAME_EXCEPTION_COMMON_DATA_OTHER_ERROR.customValidName("短信验证码已失效",true); + } + }else if(user.getVerificationCode()!=null&&!"".equals(user.getVerificationCode())){//评审室口令 + //获取当前登录专家对应评审室 + List roomIds = rsmsFeignClient.getRoomByCertificate(user.getIdentityCard()).getData(); + log.info("roomIds:"+roomIds); + //无参与评标 + CommonExceptionEnum.FRAME_EXCEPTION_COMMON_DATA_OTHER_ERROR.assertListNotNullByName("短信验证码或口令错误0021",roomIds); + + List assessRoomList = assessjFeignClient.getByIds(roomIds).getData(); + List haveList = assessRoomList.stream().filter(a->"2".equals(String.valueOf(a.getStatus())) + &&user.getVerificationCode().equals(String.valueOf(a.getVerificationCode()))).distinct().collect(Collectors.toList()); + log.info("-------haveList-------:"+haveList); + if(haveList!=null&&haveList.size()>0){ + // b = true; + }else{ + CommonExceptionEnum.FRAME_EXCEPTION_COMMON_DATA_OTHER_ERROR.customValidName("验证码或口令错误0022",true); + } + + }else{ + CommonExceptionEnum.FRAME_EXCEPTION_COMMON_DATA_OTHER_ERROR.customValidName("验证码或口令错误0000",true); + } + + log.info("----------rmap------" + rmap); + return rmap; + }else{ + return rmap; + } + } + + + /** + * 专家面修改 + * @param user + * @return + */ + @Override + public Map reSetPassExpeBaseInfo(ExpertUpdateUser user){ + log.info("身份证解密前:"+user.getIdentityCard()); + String identityCard = RSA.decrypt(user.getIdentityCard(),privateKey); + log.info("身份证解密结果:"+identityCard); + log.info("新密码解密前:"+user.getNewPassword()); + String newPassword = RSA.decrypt(user.getNewPassword(),privateKey); + log.info("新密码解密结果:"+newPassword); + log.info("旧密码解密前:"+user.getOldPassword()); + String oldPassword = RSA.decrypt(user.getOldPassword(),privateKey); + log.info("新密码解密结果:"+oldPassword); + String url = expert_update_url+"?identityCard="+identityCard+"&oldPassword=" + +oldPassword+"&newPassword="+newPassword+"&newPassword1="+newPassword+"&token="+user.getToken()+"&code="+user.getCode(); + String rJson = HttpsUtils.authorizationCodeHttpPost(url); + Map rmap = JSON.parseObject(rJson, Map.class); + return rmap; + } + + public static void main(String args[]){ + Integer s = 2; + System.out.println(s.equals(2)); + } + +} diff --git a/src/main/java/com/chinaunicom/mall/ebtp/userinfo/service/impl/UserPasswordServiceImpl.java b/src/main/java/com/chinaunicom/mall/ebtp/userinfo/service/impl/UserPasswordServiceImpl.java new file mode 100644 index 0000000..6f90d59 --- /dev/null +++ b/src/main/java/com/chinaunicom/mall/ebtp/userinfo/service/impl/UserPasswordServiceImpl.java @@ -0,0 +1,27 @@ +package com.chinaunicom.mall.ebtp.userinfo.service.impl; + + +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.chinaunicom.mall.ebtp.userinfo.dao.UserPasswordMapper; +import com.chinaunicom.mall.ebtp.userinfo.entity.UserPassword; +import com.chinaunicom.mall.ebtp.userinfo.service.IUserPasswordService; +import org.apache.commons.lang3.StringUtils; +import org.springframework.stereotype.Service; + +/** + * 对数据表 user_password 操作的 serviceImpl + * + * @author daixc + */ +@Service +public class UserPasswordServiceImpl extends ServiceImpl implements IUserPasswordService { + + @Override + public boolean validatePassword(String code) { + UserPassword userPassword = this.list().get(0); + if (StringUtils.isNotBlank(code) && code.equals(userPassword.getPassword())) { + return true; + } + return false; + } +} diff --git a/src/main/java/com/chinaunicom/mall/ebtp/userinfo/utils/BaseCertService.java b/src/main/java/com/chinaunicom/mall/ebtp/userinfo/utils/BaseCertService.java new file mode 100644 index 0000000..b42a4cc --- /dev/null +++ b/src/main/java/com/chinaunicom/mall/ebtp/userinfo/utils/BaseCertService.java @@ -0,0 +1,118 @@ +package com.chinaunicom.mall.ebtp.userinfo.utils; + +import com.chinaunicom.mall.ebtp.userinfo.entity.BaseCert; +import org.apache.commons.codec.binary.Base64; +import org.springframework.stereotype.Service; + + +import javax.imageio.ImageIO; +import java.awt.*; +import java.awt.image.BufferedImage; +import java.io.ByteArrayOutputStream; +import java.io.IOException; +import java.math.BigInteger; +import java.security.MessageDigest; +import java.security.NoSuchAlgorithmException; +import java.sql.Timestamp; +import java.text.SimpleDateFormat; +import java.util.Date; +import java.util.Random; + +/** + * @author ligen + * + */ +@Service +public class BaseCertService { + // 验证码图片中可以出现的字符集,可根据需要修改 + private final static char mapTable[] = { 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'j', 'k', 'm', 'n', 'p', 'q', 'r', + 's', 't', 'u', 'v', 'w', 'x', 'y', 'z', '2', '3', '4', '5', '6', '7', '8', '9' }; + private final static Color[] color = new Color[] { Color.black, Color.blue, Color.green, Color.gray, Color.red, + Color.darkGray }; + + public BaseCert choose() { + String result = generateCertImage(); + if (result.isEmpty() == false) { + Integer index = result.indexOf(" "); + String code = result.substring(0, index); + String image = result.substring(index + 1); + + String text = Timestamp.valueOf((new SimpleDateFormat("yyyy-MM-dd 00:00:00")).format(new Date())) + code; + String key = this.encode(text); + BaseCert cert = new BaseCert().setImage(image).setKey(key); + return cert; + } + return null; + } + + /** + * 功能:生成彩色验证码图片 width为生成图片的宽度 height为生成图片的高度 os为页面的输出流 + * + * @return 返回值验证码字符串 + */ + public String generateCertImage() { + Random rand = new Random(); + Integer width = 60; + Integer height = 30; + BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_USHORT_565_RGB); + + // 获取图形上下文 + Graphics g = image.getGraphics(); + // 设定背景色 + g.setColor(new Color(0xCCCCCC)); + g.fillRect(0, 0, width, height); + // 画边框 + g.setColor(Color.black); + g.drawRect(0, 0, width - 1, height - 1); + // 取随机产生的认证码 + String code = ""; + // 如果要生成更多位的认证码,则加大数值 + for (int i = 0; i < 4; ++i) { + code += mapTable[(int) (mapTable.length * rand.nextDouble())]; + } + // 将认证码显示到图像中,如果要生成更多位的认证码,增加drawString语句 + g.setFont(new Font("Atlantic Inline", Font.PLAIN, 20)); + g.setColor(color[(int) (color.length * rand.nextDouble())]); + g.drawString(String.valueOf(code.charAt(0)), 8, (int) (15 + rand.nextDouble() * 5)); + g.setColor(color[(int) (color.length * rand.nextDouble())]); + g.drawString(String.valueOf(code.charAt(1)), 20, (int) (15 + rand.nextDouble() * 5)); + g.setColor(color[(int) (color.length * rand.nextDouble())]); + g.drawString(String.valueOf(code.charAt(2)), 35, (int) (15 + rand.nextDouble() * 5)); + g.setColor(color[(int) (color.length * rand.nextDouble())]); + g.drawString(String.valueOf(code.charAt(3)), 47, (int) (15 + rand.nextDouble() * 5)); + // 随机产生10个干扰点 + for (int i = 0; i < 10; i++) { + g.setColor(color[(int) (color.length * rand.nextDouble())]); + int x = rand.nextInt(width); + int y = rand.nextInt(height); + g.drawOval(x, y, 1, 1); + } + // 释放图形上下文 + g.dispose(); + + try { + // 输出图像到页面 + ByteArrayOutputStream os = new ByteArrayOutputStream(); + ImageIO.write(image, "JPEG", os); + return code + " " + Base64.encodeBase64String(os.toByteArray()); + + } catch (IOException e) { + return ""; + } + } + + public String encode(String str) { + // 生成一个MD5加密计算摘要 + try { + MessageDigest md = MessageDigest.getInstance("MD5"); + // 计算md5函数 + md.update(str.getBytes()); + // digest()最后确定返回md5 hash值,返回值为8为字符串。因为md5 hash值是16位的hex值,实际上就是8位的字符 + // BigInteger函数则将8位的字符串转换成16位hex值,用字符串来表示;得到字符串形式的hash值 + return new BigInteger(1, md.digest()).toString(16); + } catch (NoSuchAlgorithmException e) { + + } + return ""; + } +} diff --git a/src/main/java/com/chinaunicom/mall/ebtp/userinfo/utils/HttpUtils.java b/src/main/java/com/chinaunicom/mall/ebtp/userinfo/utils/HttpUtils.java new file mode 100644 index 0000000..cb48ea4 --- /dev/null +++ b/src/main/java/com/chinaunicom/mall/ebtp/userinfo/utils/HttpUtils.java @@ -0,0 +1,139 @@ +package com.chinaunicom.mall.ebtp.userinfo.utils; + +import lombok.extern.slf4j.Slf4j; + +import java.io.BufferedReader; +import java.io.InputStream; +import java.io.InputStreamReader; +import java.io.PrintWriter; +import java.net.HttpURLConnection; +import java.net.URL; + +@Slf4j +public class HttpUtils { + + public static String checkTokenHttpGet(String path) { + String str = ""; + try { + URL url = new URL(path); + //打开和url之间的连接 + HttpURLConnection conn = (HttpURLConnection) url.openConnection(); + PrintWriter out = null; + + /**设置URLConnection的参数和普通的请求属性****start***/ + + conn.setRequestProperty("Content-Type", "application/json; charset=UTF-8"); + conn.setRequestProperty("Accept", "application/json"); + conn.setRequestProperty("Accept-Encoding", ""); + conn.setRequestProperty("clientId", "bVS46ElU"); + + /**设置URLConnection的参数和普通的请求属性****end***/ + conn.setDoOutput(true); + conn.setDoInput(true); + + //conn.setRequestMethod("POST");//GET和POST必须全大写 + /**GET方法请求*****start*/ + /** + * 如果只是发送GET方式请求,使用connet方法建立和远程资源之间的实际连接即可; + * 如果发送POST方式的请求,需要获取URLConnection实例对应的输出流来发送请求参数。 + * */ + conn.connect(); + + /**GET方法请求*****end*/ + + /***POST方法请求****start*/ +// out = new PrintWriter(conn.getOutputStream());//获取URLConnection对象对应的输出流 +// +// out.print(data);//发送请求参数即数据 +// +// out.flush();//缓冲数据 + + /***POST方法请求****end*/ + + //获取URLConnection对象对应的输入流 + InputStream is = conn.getInputStream(); + //构造一个字符流缓存 + BufferedReader br = new BufferedReader(new InputStreamReader(is)); + + String line = br.readLine(); + while (line != null) { + str = new String(line.getBytes(), "UTF-8");//解决中文乱码问题 + System.out.println(str); + line = br.readLine(); + } + //关闭流 + is.close(); + //断开连接,最好写上,disconnect是在底层tcp socket链接空闲时才切断。如果正在被其他线程使用就不切断。 + //固定多线程的话,如果不disconnect,链接会增多,直到收发不出信息。写上disconnect后正常一些。 + conn.disconnect(); + //System.out.println("完整结束"); + } catch (Exception e) { + log.error("错误信息",e); + //e.printStackTrace(); + } + return str; + } + public static String httpPost(String path, String data) { + String str = ""; + try { + log.info("path:"+path); + log.info("data:"+data); + URL url = new URL(path); + + //打开和url之间的连接 + HttpURLConnection conn = (HttpURLConnection) url.openConnection(); + PrintWriter out = null; + + /**设置URLConnection的参数和普通的请求属性****start***/ + + conn.setRequestProperty("Content-Type", "application/json; charset=UTF-8"); + conn.setRequestProperty("Accept", "application/json"); + conn.setRequestProperty("Accept-Encoding", ""); + + /**设置URLConnection的参数和普通的请求属性****end***/ + conn.setDoOutput(true); + conn.setDoInput(true); + + conn.setRequestMethod("POST");//GET和POST必须全大写 + /**GET方法请求*****start*/ + /** + * 如果只是发送GET方式请求,使用connet方法建立和远程资源之间的实际连接即可; + * 如果发送POST方式的请求,需要获取URLConnection实例对应的输出流来发送请求参数。 + * */ + conn.connect(); + + /**GET方法请求*****end*/ + + /***POST方法请求****start*/ + out = new PrintWriter(conn.getOutputStream());//获取URLConnection对象对应的输出流 + + out.print(data);//发送请求参数即数据 + + out.flush();//缓冲数据 + + /***POST方法请求****end*/ + + //获取URLConnection对象对应的输入流 + InputStream is = conn.getInputStream(); + //构造一个字符流缓存 + BufferedReader br = new BufferedReader(new InputStreamReader(is)); + + String line = br.readLine(); + while (line != null) { + str = new String(line.getBytes(), "UTF-8");//解决中文乱码问题 + System.out.println(str); + line = br.readLine(); + } + //关闭流 + is.close(); + //断开连接,最好写上,disconnect是在底层tcp socket链接空闲时才切断。如果正在被其他线程使用就不切断。 + //固定多线程的话,如果不disconnect,链接会增多,直到收发不出信息。写上disconnect后正常一些。 + conn.disconnect(); + //System.out.println("完整结束"); + } catch (Exception e) { + log.error("错误信息",e); + //e.printStackTrace(); + } + return str; + } +} diff --git a/src/main/java/com/chinaunicom/mall/ebtp/userinfo/utils/HttpsUtils.java b/src/main/java/com/chinaunicom/mall/ebtp/userinfo/utils/HttpsUtils.java new file mode 100644 index 0000000..993b39b --- /dev/null +++ b/src/main/java/com/chinaunicom/mall/ebtp/userinfo/utils/HttpsUtils.java @@ -0,0 +1,135 @@ +package com.chinaunicom.mall.ebtp.userinfo.utils; + +import com.chinaunicom.mall.ebtp.common.exception.common.CommonExceptionEnum; +import lombok.extern.slf4j.Slf4j; +import org.springframework.http.HttpEntity; +import org.springframework.http.HttpHeaders; +import org.springframework.http.ResponseEntity; +import org.springframework.util.MultiValueMap; +import org.springframework.web.client.RestTemplate; + +import java.io.*; +import java.net.HttpURLConnection; +import java.net.URL; +import java.nio.charset.StandardCharsets; +import java.util.HashMap; +import java.util.Map; + +@Slf4j +public class HttpsUtils { + public static String refreshHttpPost(String path, String data,String clientId){ + String str = ""; + try { + log.info("-------path:"+path); + log.info("-------data:"+data); + URL url = new URL(path); + HttpURLConnection conn = (HttpURLConnection)url.openConnection(); + conn.setRequestProperty("Content-Type", "application/x-www-form-urlencoded"); + conn.setRequestProperty("clientId", clientId); + conn.setDoOutput(true); + conn.setDoInput(true); + conn.setRequestMethod("POST"); + OutputStream out = conn.getOutputStream(); + out.write(data.getBytes()); + out.flush(); + out.close(); + InputStream is = conn.getInputStream(); + BufferedReader br = new BufferedReader(new InputStreamReader(is)); + + for(String line = br.readLine(); line != null; line = br.readLine()) { + str = new String(line.getBytes(), "UTF-8"); + System.out.println(str); + } + + is.close(); + conn.disconnect(); + } catch (Exception var9) { + CommonExceptionEnum.FRAME_EXCEPTION_COMMON_DATA_OTHER_ERROR.customValidName("请求code换token接口异常"+var9.getMessage(),true); + log.error("请求code换token接口异常",var9); + } + + return str; + } + public static String authorizationCodeHttpPost(String path){ + String str = ""; + try { + URL url = new URL(path); + HttpURLConnection conn = (HttpURLConnection)url.openConnection(); + PrintWriter out = null; + conn.setRequestProperty("Content-Type", "application/json; charset=UTF-8"); + conn.setDoOutput(true); + conn.setDoInput(true); + conn.setRequestMethod("POST"); + out = new PrintWriter(conn.getOutputStream()); + out.flush(); + InputStream is = conn.getInputStream(); + BufferedReader br = new BufferedReader(new InputStreamReader(is)); + for(String line = br.readLine(); line != null; line = br.readLine()) { + str = new String(line.getBytes(), "UTF-8"); + System.out.println(str); + } + + is.close(); + conn.disconnect(); + } catch (Exception var9) { + CommonExceptionEnum.FRAME_EXCEPTION_COMMON_DATA_OTHER_ERROR.customValidName("请求code换token接口异常"+var9.getMessage(),true); + log.error("请求code换token接口异常",var9); + } + + return str; + } + + public static void main(String args[]){ + Map map = new HashMap(); + map.put("identityCard","331081198909263032"); + map.put("password","041461f3e0621be23917ab9c74294083adb9571b82537bc46a2c553938445870e99905a3bf5507e5be462b403954ea4205c5578e3431dec8e3dd8c71ef3b3f615363fe269dea415186188458bb17e6e0d2a6a2f97c58883fb68839748f465df48fc5d5a1961f68"); + map.put("captcha","WRZN"); + map.put("token","toxc5izzhjnjmgc3"); + + map.put("clientId","KgPEkttG"); + + String url = "http://10.242.31.158:8100/auth/expertLogin";//请求地址 + String json = ""; + for(String key :map.keySet()){ + if(!"".equals(json)){ + json+="&"; + } + json+=key+"="+map.get(key); + } + refreshHttpPost(url,json,"KgPEkttG"); + } + + public static String expertHttpPost(String path, String data,String clientId){ + String str = ""; + try { + log.info("-------path:"+path); + log.info("-------data:"+data); + URL url = new URL(path); + HttpURLConnection conn = (HttpURLConnection)url.openConnection(); + conn.setRequestProperty("Content-Type", "application/x-www-form-urlencoded;charset=UTF-8"); + conn.setRequestProperty("clientId", clientId); + conn.setDoOutput(true); + conn.setDoInput(true); + conn.setRequestMethod("POST"); + OutputStream out = conn.getOutputStream(); + out.write(data.getBytes("utf-8")); + out.flush(); + out.close(); + InputStream is = conn.getInputStream(); + BufferedReader br = new BufferedReader(new InputStreamReader(is)); + + for(String line = br.readLine(); line != null; line = br.readLine()) { + str = new String(line.getBytes(), "UTF-8"); + System.out.println(str); + } + + is.close(); + conn.disconnect(); + } catch (Exception var9) { + CommonExceptionEnum.FRAME_EXCEPTION_COMMON_DATA_OTHER_ERROR.customValidName("专家登录异常"+var9.getMessage(),true); + log.error("专家登录异常",var9); + } + + return str; + } +} diff --git a/src/main/java/com/chinaunicom/mall/ebtp/userinfo/utils/UserinfoConstants.java b/src/main/java/com/chinaunicom/mall/ebtp/userinfo/utils/UserinfoConstants.java new file mode 100644 index 0000000..b2b6d62 --- /dev/null +++ b/src/main/java/com/chinaunicom/mall/ebtp/userinfo/utils/UserinfoConstants.java @@ -0,0 +1,8 @@ +package com.chinaunicom.mall.ebtp.userinfo.utils; + +import lombok.Data; + +public class UserinfoConstants { + public static String okCode = "1"; + public static String responseCode = "code"; +} diff --git a/src/main/java/com/chinaunicom/mall/ebtp/zglt/controller/ExpertController.java b/src/main/java/com/chinaunicom/mall/ebtp/zglt/controller/ExpertController.java new file mode 100644 index 0000000..6fe7b00 --- /dev/null +++ b/src/main/java/com/chinaunicom/mall/ebtp/zglt/controller/ExpertController.java @@ -0,0 +1,75 @@ +package com.chinaunicom.mall.ebtp.zglt.controller; + + +import com.chinaunicom.mall.ebtp.common.base.entity.BaseResponse; +import com.chinaunicom.mall.ebtp.common.base.service.IBaseCacheUserService; +import com.chinaunicom.mall.ebtp.test.RSA; +import com.chinaunicom.mall.ebtp.zglt.utils.MdConstants; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.web.bind.annotation.*; +import org.springframework.web.servlet.view.RedirectView; + +import java.net.URLDecoder; +import java.net.URLEncoder; +import java.text.SimpleDateFormat; +import java.util.Date; + +/** + * 2.0单点功能 + * + * @author: zhqbin + * @date: 2022/11/01 + * @version: V1.0 + */ +@Slf4j +@RestController +@Api(tags = "专家单点功能") +@RequestMapping("/expert/v1") +public class ExpertController { + + @Autowired + private IBaseCacheUserService cacheUserService; + @Value("${expert.public-key}") + private String publicKey; + @Value("${expert.url}") + private String experturl; + @Value("${app.id}") + private String user_key; + @ApiOperation(value = "重定向") + @GetMapping(value = "/redirectExpert/{token}") + public RedirectView redirectExpert2(@PathVariable String token){ + return redirectExpert(token,null); + } + @ApiOperation(value = "重定向") + @GetMapping(value = "/redirectExpert/{token}/{value}") + public RedirectView redirectExpert(@PathVariable String token,@PathVariable String value) { + String url = experturl; + SimpleDateFormat format = new SimpleDateFormat("yyyyMMddHHmmss"); + //token = token.replaceAll("Bearer ",""); + String time = format.format(new Date()); + log.info("md原文{}",time+user_key+token); + String md = MdConstants.getSha256(time+user_key+token); + log.info("md密文{}",md); + try{ + String key = time+token+"#"+md; + log.info("publicKey:{}",publicKey); + String str = URLEncoder.encode(RSA.encrypt(key, publicKey),"utf-8"); + log.info("str:{}",str); + value = value!=null&&!"".equals(value)?"&"+value:""; + url = url+"?key="+str+"&"+value; + log.info("url:{}",url); + RedirectView redirectView = new RedirectView(url); + return redirectView; + }catch (Exception e){ + log.error("跳转专家库重定向异常",e); + e.printStackTrace(); + } + + return null; + } + +} diff --git a/src/main/java/com/chinaunicom/mall/ebtp/zglt/controller/ZgltController.java b/src/main/java/com/chinaunicom/mall/ebtp/zglt/controller/ZgltController.java new file mode 100644 index 0000000..86007d2 --- /dev/null +++ b/src/main/java/com/chinaunicom/mall/ebtp/zglt/controller/ZgltController.java @@ -0,0 +1,63 @@ +package com.chinaunicom.mall.ebtp.zglt.controller; + + +import com.chinaunicom.mall.ebtp.common.base.entity.BaseResponse; +import com.chinaunicom.mall.ebtp.common.base.service.IBaseCacheUserService; +import com.chinaunicom.mall.ebtp.test.RSA; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import java.text.SimpleDateFormat; +import java.util.Date; + +/** + * 2.0单点功能 + * + * @author: zhqbin + * @date: 2022/11/01 + * @version: V1.0 + */ +@Slf4j +@RestController +@Api(tags = "2.0单点功能") +@RequestMapping("/zglt/v1") +public class ZgltController { + + @Autowired + private IBaseCacheUserService cacheUserService; + @Value("${zglt.public-key}") + private String publicKey; + @Value("${zglt.url}") + private String zglturl; + + @ApiOperation(value = "获取2.0登录url") + @GetMapping(value = "/getUrl") + public BaseResponse getUrl() { + String url = zglturl; + SimpleDateFormat format = new SimpleDateFormat("yyyyMMddHHmmss"); + String userId = cacheUserService.getCacheUser().getUserId()+"_"+format.format(new Date()); + log.info("userId{}",userId); + byte[] data = userId.getBytes(); + try{ + log.info("publicKey{}",publicKey); + byte[] encodedData = RSA.encryptByPublicKey(data, publicKey); + log.info("encodedData{}",encodedData); + String dlh = java.net.URLEncoder.encode(RSA.encryptBASE64(encodedData), "utf-8"); + log.info("dlh{}",dlh); + return BaseResponse.success(url+"?dlh="+dlh); + }catch (Exception e){ + log.error("获取2.0单点登录地址异常",e); + e.printStackTrace(); + } + + return BaseResponse.fail("获取2.0单点登录地址异常", "获取2.0单点登录地址异常"); + } + +} diff --git a/src/main/java/com/chinaunicom/mall/ebtp/zglt/utils/MdConstants.java b/src/main/java/com/chinaunicom/mall/ebtp/zglt/utils/MdConstants.java new file mode 100644 index 0000000..f6e74d1 --- /dev/null +++ b/src/main/java/com/chinaunicom/mall/ebtp/zglt/utils/MdConstants.java @@ -0,0 +1,28 @@ +package com.chinaunicom.mall.ebtp.zglt.utils; + +import java.math.BigInteger; +import java.security.MessageDigest; +import java.security.NoSuchAlgorithmException; + +public class MdConstants { + + + public static String getSha256(String str) { + try { + // 初始化MessageDigest并指定MD5算法 + MessageDigest md = MessageDigest.getInstance("SHA-256"); + md.update(str.getBytes()); + // 将字节转换为十六进制字符串 + return new BigInteger(1, md.digest()).toString(16); + } catch (NoSuchAlgorithmException e) { + throw new RuntimeException(e); + } + } + + public static void main(String[] args) { + + String originalString = "Hello, World!"; + System.out.println("Original String: " + originalString); + System.out.println("SHA-256 Hash: " + MdConstants.getSha256(originalString)); + } +} diff --git a/src/main/resources/application-master.yml b/src/main/resources/application-master.yml index 2804c2f..7c0fca9 100644 --- a/src/main/resources/application-master.yml +++ b/src/main/resources/application-master.yml @@ -143,6 +143,16 @@ mconfig: service-name-system: sys-manager-ebtp-project wfSectionNo: '080' wfSectionName: 标段重新评审审批单 + feign: + name: + extend: biz-service-ebtp-extend #扩展服务 + supplier: core-service-supplierbase #供应商库 + assess: biz-service-ebtp-process #评审室 + rsms: biz-service-ebtp-rsms #评审服务 + cloud_mall_auth: http://10.238.52.52:8100/auth + checkTokenPath: http://10.238.52.52:8100/auth/oauth/check_token + xmzxUrl: http://10.238.52.52:8100/ + # 用户暴露给 prometheus 的健康数据 management: @@ -153,3 +163,81 @@ management: cors: allowed-origins: "*" allowed-methods: "*" + + +client: + clientHttpUrl: http://10.125.18.237:8100/auth/oauth/token?grant_type=client_credentials&client_id=bVS46ElU&client_secret=58ea04ba02475c8da2321cc99849d2a10f15b749 +allow: + apis: + - ^POST./?v1/userpassword/validatePassword$ + - ^GET./?v1/userinfo/get$ + - ^POST\./?outer/v1/ebtp/face/faceCompare$ + - ^POST\./?outer/v1/ebtp/face/getRequestId$ + - ^POST\./?outer/v1/ebtp/face/start$ + - ^POST\./?outer/v1/ebtp/face/getTocken$ + - ^GET./?v1/userinfo/getCert$ + - ^POST\./?v1/auth/oauth/token$ + - ^GET./?v1/userinfo/expertMessageCode$ + - ^POST\./?v1/userinfo/expertLogin$ + - ^POST\./?v1/userinfo/reSetPassExpeBaseInfo$ + - ^POST\./?v1/userinfo/put/user$ + - ^GET\./?v1/userinfo/getList/user$ + - ^GET\./?v1/userinfo/oauth/check_token$ + - ^GET\./?outer/v1.0/auth/.*$ + +#feign调用 +mall: + core_service_document_center: + serviceId: core-service-document-center + core_service_expert: + serviceId: mall-expe + +# 任务调度生成token配置 +job: + system-id: http://10.125.18.237:8100 + client-id: bVS46ElU + public-key: 0428D625CEEB71CE823BD7D78DFEE7B122F2DA5C4D21E32253AD684D0FE21810394A799639C0CDFBFEB535A1DFD6A366A637E582CE0B1466A5FE7858841135DE6B + +facecompare: + url: https://10.124.147.36:8000/api/naturePersonCenter/faceRecognition/faceCompare/v1 +livingDetectRequestId: + url: http://10.124.150.230:8000/api/chinaUnicom/dataMidPlatform/authenticationCenter/getRequestId/v1 +livingDetectStart: + url: http://10.124.150.230:8000/api/chinaUnicom/dataMidPlatform/authenticationCenter/livingDetectStart/v1 + +#2.0单点mall-auth +zglt: + url: # https://uscm.chinaunicom.cn:18012/zglt/sso/login_zbxm_dddl.jsp + public-key: MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCW8XfLUQAuH7CFbaNsGuSPnwdeHK/X8bvt6NCZq7FQphxGMPji+AZTegZKUWOok07FfXVewjXv6kLJOba8LwwvSf2b1Y2cXdewgN/wxWL2OUiy14sxKtEGdT56vuIAugDbZ4l2DoUP4+Kb3ebmThGOYyAThKRkmGW4NuGqETdDDQIDAQAB + +auth: + oauth: + client_id: KgPEkttG + client_secret: ae5bdb183c502355d2055b3de73300aa73cbfdf3 + client_Url: http://10.125.18.237:8100/auth/oauth/token + expert_url: http://10.125.18.237:8100/auth/expertLogin + expert_update_url: http://10.125.18.237:8100/api/mall-expe/v1/expebaseinfo/reSetPassExpeBaseInfo +jury: + loginCheck: + privateKey: MIICdwIBADANBgkqhkiG9w0BAQEFAASCAmEwggJdAgEAAoGBAKCRZhAWOVGsKxBAE1mPq6jwoRBqZ4+bFoLo7gkjlKgQudc+VMIkiVBMbVfOf9qOqMNXj/lmZkAf5q5JPiP0vmofyqejFPUA37KFRjqExX2rEXTR7WAFzzWZgk7afDBpCNGwYSirzp710/XNfmQ6Ty8xk3r+DnTxrUrYhY3CkanTAgMBAAECgYA8WMkqLKAYUQPSVLKxC20xzlZKbCNF9rzMMK0d5DB/xeGCwxtp5/9vnXnO8X5d7xYAbM1gp5qwaQzy3fYr31UcxHiFTcZMgvN6z32FNBEkejCLaKIFZjaMBn36dStdzpAP+OOclwpXDGpGQO0UKLKshAfl5dsS+fq+nHpOugz52QJBAPUCG9Xzy5TrMiqL9n1TLe1qR+ALfELZHFheevIkyShJtcqlte8u640H0CHDXF9lniisMFn4xChqkxiTUsees58CQQCnxYDP+JfmqORO4Cx2DLCCqOpaOkuxdZo8eSh80s3zbmtdqoMpeYZglVNLuSYKNul8WWF3qeGqcnLULDE6P31NAkEAtSLt+WvYoyyPVi1L+rO4TMI6iUV0hOeGsT6InuTbY1G7eSqyKzcBJq8UDSIl9NFn8KH8zUfBni/MuGqS1Mpb+QJATiPTBwpF1Yy8KXCHxMPMQk7iN/wG3TRlDd1wWhLlEYhQQWP1iw+q4rkp/o7RhNhmjyAiIVXiYTzE9sVOeE6x0QJBAJYmBmOKfxw3rzpjDU+e9I6w0AbpiBzlnviEToZfnDwVH9mjF++H/wDRTDqozIiAE2aN/wqXwqhoWGgVWMlp9Xc= +cors: + allowed-origins1: http://localhost:3000 + allowed-origins2: http://10.125.18.237:18022 +expert: + url: http://10.120.63.249:18038/redirect + public-key: MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQC6RZjuqNxVqWZpcFYBxXaj7CbmGtflxkRLG/33vxFph6mkqCmIoCcj33tPwHqY3zFTFuqkt6d06GjjgajjYm/PoQQXWvDGIzudtLjq70QsDqUfv0d7554eCqpcacHfWd5FdsSmQ90jWBotDLH4YjkWqm/mYJx1EZZ6bXGgWMlFtQIDAQAB + private-key: MIICdwIBADANBgkqhkiG9w0BAQEFAASCAmEwggJdAgEAAoGBALpFmO6o3FWpZmlwVgHFdqPsJuYa1+XGREsb/fe/EWmHqaSoKYigJyPfe0/AepjfMVMW6qS3p3ToaOOBqONib8+hBBda8MYjO520uOrvRCwOpR+/R3vnnh4Kqlxpwd9Z3kV2xKZD3SNYGi0MsfhiORaqb+ZgnHURlnptcaBYyUW1AgMBAAECgYBNygzg9kH1wCXVuKUiXj16nX9tLx6khZU1rL31/aQe5xnQeq3FseRGlejgWGiaePMXWQWqvku/heNvx1EpjI1Wd9Q8Qqr+fx6PMRAObxZO0eKxBxw7H37wWcFWatkZT82lAucLaUJSM12rQn9N1k4AA2FftP359yGCJIAvHJM67QJBAPOPdylwLfsLZQOmd4lM2SEUOib3uAj+247JoQlgW8Ur3oJHNQtuJPrJqfTDYWcwUdugW6Ddp+oml+tJqfXuTfMCQQDDyRae7aM9cHgALtM5n3TmDNyPqpihWIT9vzAqFmcXLkFsT0nWt/A77FaH+Vyu10j2RSdo6xnEzsjLj3ufLH+3AkEAwSPpeODOdZ+JkSV28VgRbtvdaX1TYT7I2SgnHYpd+7NYFbNl6xSDGqTEs6YkHXIB18oIHz7moxXLrveRYcaB5QJAHxrXiTBf+ubfacgGruTygYoRkJGd5iRWHKo/ULB2eGxU4IxIQuC+PgbySHAJlY2GffnGpRiU43um0xBcp5E+SQJBAN66yTl49KH61qBf9+k304fg3YMIXB1gBUeTDmVooXUQCL1X6lOsgeZvwiyq6r+ERQNve+MMgYaEU4/qASOtsoc= +check: + tokentime: + timeLimit: 10000 + onof: 0 + checkprivateKey: MIIBVAIBADANBgkqhkiG9w0BAQEFAASCAT4wggE6AgEAAkEAk7N3OeQS9WJa/v5dX/s9/DCKpJ8kOjR1Zrh1X+TF98udqGbGBWmiyVk2SqGPA4Q9kUCWw46CocjE047gx5AFrQIDAQABAkAIHG/stvCvlxImNLPOBI8X3VaPycmEhML5vCF9/aM9g1SuFa298Q5W8FqAmm8SE5lRpw2yyToWtLbufJtAa7wFAiEAxViJBkLU4wfPCwiPiAn17owXbocC9rj3fAzEH9DYDdcCIQC/mZp4ujO035Qqw2QQeFWpDc/vITx1OTWaxq6/LvvwGwIgXTZLSmzItw9aKOD7QotJ4UnES41zxetp4er5u/leA3MCIGcRw2ZEjII1b+hdOdweT75kfsId9/77apm7Xc/c/4yXAiEAnBrCiVXRNN+slO0MYaxynr4eIiPG/EjYBYxXlwBpeOc= + checkpublicKey: MFwwDQYJKoZIhvcNAQEBBQADSwAwSAJBAJOzdznkEvViWv7+XV/7PfwwiqSfJDo0dWa4dV/kxffLnahmxgVposlZNkqhjwOEPZFAlsOOgqHIxNOO4MeQBa0CAwEAAQ== + +system_url: https://bidding.chinaunicomglobal.com:18023 +#3.0 入参加密使用publicKey +public_key: "04819CF427F9150FEEBD91E8D2346F203FC47312D212022A967D8372EA30B9581CCEEFCE2670BDDAF2E8DA1620EA73948126078ED9FF9773AA3A94EE6C80035A18" +# 合作方单点招投标3.0配置 +ztb.clientId: KgPEkttG +ztb.clientSecret: KKoiuheawiiHI3Ujsa45Oaow +ztb.url: https://bidding.chinaunicomglobal.com:18023/redirect?page=ChoiceLogin \ No newline at end of file