Commit b20900a8 by 宋宇航

merge

parents 659c0d22 c6def62e
package com.cnooc.expert.auth.service;
import com.cnooc.expert.system.entity.pojo.SlideImageResult;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.core.io.Resource;
import org.springframework.stereotype.Service;
import javax.imageio.ImageIO;
import java.awt.*;
import java.awt.geom.RoundRectangle2D;
import java.awt.image.BufferedImage;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.util.Base64;
import java.util.concurrent.ThreadLocalRandom;
@Service
public class SlideCaptchaService {
private static final int SLIDER_WIDTH = 50;
private static final int SLIDER_HEIGHT = 50;
@Value("classpath:images/backgrounds/*")
private Resource[] backgroundResources;
/**
* 使用预设背景图片生成验证码
*/
public SlideImageResult generateSlideImages() throws IOException {
// 随机选择背景图片
Resource bgResource = backgroundResources[
ThreadLocalRandom.current().nextInt(backgroundResources.length)
];
BufferedImage background = ImageIO.read(bgResource.getInputStream());
// 调整背景图尺寸
background = resizeImage(background, 300, 200);
// 生成滑块位置
int sliderX = ThreadLocalRandom.current().nextInt(50, 250);
int sliderY = ThreadLocalRandom.current().nextInt(10, 150);
// 创建滑块
BufferedImage sliderImage = createSliderWithShadow(background, sliderX, sliderY);
drawSliderHole(background, sliderX, sliderY);
// 转换为Base64
String bgBase64 = imageToBase64(background, "png");
String sliderBase64 = imageToBase64(sliderImage, "png");
SlideImageResult result = new SlideImageResult();
result.setBackgroundBase64(bgBase64);
result.setSlideBase64(sliderBase64);
result.setSliderX(sliderX);
result.setSliderY(sliderY);
return result;
}
/**
* 图片转换为Base64
*/
private String imageToBase64(BufferedImage image, String format) throws IOException {
ByteArrayOutputStream baos = new ByteArrayOutputStream();
ImageIO.write(image, format, baos);
byte[] imageBytes = baos.toByteArray();
return Base64.getEncoder().encodeToString(imageBytes);
}
/**
* 在背景图上绘制滑块挖空效果
*/
private void drawSliderHole(BufferedImage background, int x, int y) {
Graphics2D g2d = background.createGraphics();
// 设置挖空区域
g2d.setComposite(AlphaComposite.Clear);
g2d.fillRect(x, y, SLIDER_WIDTH, SLIDER_HEIGHT);
// 重置合成规则,绘制边框
g2d.setComposite(AlphaComposite.SrcOver);
g2d.setColor(Color.GRAY);
g2d.setStroke(new BasicStroke(2));
g2d.drawRect(x, y, SLIDER_WIDTH, SLIDER_HEIGHT);
g2d.dispose();
}
/**
* 创建带阴影效果的滑块
*/
private BufferedImage createSliderWithShadow(BufferedImage background, int x, int y) {
int width = 50;
int height = 50;
int shadowSize = 3;
BufferedImage slider = new BufferedImage(
width + shadowSize, height + shadowSize, BufferedImage.TYPE_INT_ARGB);
Graphics2D g2d = slider.createGraphics();
g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
// 绘制阴影
g2d.setColor(new Color(0, 0, 0, 100));
g2d.fillRoundRect(shadowSize, shadowSize, width, height, 10, 10);
// 绘制滑块主体
Shape sliderShape = new RoundRectangle2D.Double(0, 0, width, height, 10, 10);
g2d.setClip(sliderShape);
BufferedImage subImage = background.getSubimage(x, y, width, height);
g2d.drawImage(subImage, 0, 0, null);
g2d.setClip(null);
// 绘制边框
g2d.setColor(new Color(64, 158, 255));
g2d.setStroke(new BasicStroke(2));
g2d.draw(sliderShape);
g2d.dispose();
return slider;
}
/**
* 调整图片尺寸
*/
private BufferedImage resizeImage(BufferedImage originalImage, int targetWidth, int targetHeight) {
BufferedImage resizedImage = new BufferedImage(targetWidth, targetHeight, BufferedImage.TYPE_INT_RGB);
Graphics2D g2d = resizedImage.createGraphics();
g2d.setRenderingHint(RenderingHints.KEY_INTERPOLATION, RenderingHints.VALUE_INTERPOLATION_BILINEAR);
g2d.drawImage(originalImage, 0, 0, targetWidth, targetHeight, null);
g2d.dispose();
return resizedImage;
}
}
package com.cnooc.expert.auth.service;
import com.cnooc.expert.controller.auth.model.response.SlideCaptchaVO;
import com.cnooc.expert.system.entity.vo.SysCaptchaVO;
public interface SysCaptchaService {
......@@ -9,6 +10,7 @@ public interface SysCaptchaService {
*/
SysCaptchaVO generate();
SlideCaptchaVO generateSlide();
/**
* 验证码效验
*
......@@ -18,6 +20,8 @@ public interface SysCaptchaService {
*/
boolean validate(String key, String code);
boolean validateSlide(String code, Integer moveX);
/**
* 是否开启登录验证码
*
......
......@@ -26,6 +26,7 @@ import org.springframework.stereotype.Service;
import org.springframework.security.crypto.password.PasswordEncoder;
import javax.annotation.Resource;
import java.util.HashMap;
import java.util.Map;
import java.util.UUID;
import java.util.concurrent.TimeUnit;
......@@ -97,17 +98,17 @@ public class LoginServiceImpl implements LoginService {
//待确认,验证码下发是调用第三方平台吗
//return Result.success("验证码已发送");
boolean flag = sysCaptchaService.validate(vo.getKey(), vo.getCaptcha());
/* boolean flag = sysCaptchaService.validate(vo.getKey(), vo.getCaptcha());
if(!flag){
throw new BusinessException(GlobalErrorCodeConstants.CAPTCHA_EXPIRED.getCode(),GlobalErrorCodeConstants.CAPTCHA_EXPIRED.getMsg());
}else{
}else{*/
boolean smsfalg = smsService.sendSmsCode(vo.getPhoneNumber());
if(!smsfalg) {
throw new BusinessException(GlobalErrorCodeConstants.SEND_SMS_ERROR.getCode(),GlobalErrorCodeConstants.SEND_SMS_ERROR.getMsg());
} else {
return "短信验证码发送成功";
}
}
//}
}
@Override
......@@ -117,15 +118,19 @@ public class LoginServiceImpl implements LoginService {
ValidUtils.isText(loginVO.getPhoneCode(), "请输入验证码");
ValidUtils.isTrue(Validator.isMobile(loginVO.getPhoneNumber()), "请输入正确格式的手机号");
ValidUtils.isText(loginVO.getPassword(), "请输入密码");
ValidUtils.isValidPassword(loginVO.getPassword(),GlobalErrorCodeConstants.PARAM_PASSWORD_FORMAT_ERROR);
String pwd = Sm2Util.decrypt(loginVO.getPassword());
ValidUtils.isValidPassword(pwd,GlobalErrorCodeConstants.PARAM_PASSWORD_FORMAT_ERROR);
//1.根据手机号去库中查询是否存在
ExpertInfoResp expertInfoResp = loginServicesClient.querySingleByShengFenZhengOrMobile(loginVO.getPhoneNumber(),null);
expertInfoResp = new ExpertInfoResp();
expertInfoResp.setZhuanJiaGuid("1234");
expertInfoResp.setZhuanJiaName("张三");
if(expertInfoResp == null){
throw new BusinessException(GlobalErrorCodeConstants.USER_NOT_EXISTS.getCode(),GlobalErrorCodeConstants.USER_NOT_EXISTS.getMsg());
}
//2.判断密码是否存在
ExpertInfoAppResp expertInfoAppResp = loginServicesClient.getZhuanJiaInfoAppById(expertInfoResp.getZhuanJiaGuid());
String pwd = Sm2Util.decrypt(loginVO.getPassword());
if(expertInfoAppResp == null){
//没有记录的话就是新建记录
loginServicesClient.saveZhuanJiaInfoApp(null,passwordEncoder.encode(pwd));
......@@ -165,31 +170,37 @@ public class LoginServiceImpl implements LoginService {
ValidUtils.isText(loginVO.getIdNumber(), "请输入身份证号");
ValidUtils.isText(loginVO.getPassword(), "请输入密码");
ValidUtils.isTrue(IdcardUtil.isValidCard(loginVO.getIdNumber()), "请输入正确的身份证号");
ValidUtils.isValidPassword(loginVO.getPassword(),GlobalErrorCodeConstants.PARAM_PASSWORD_FORMAT_ERROR);
String pwd = Sm2Util.decrypt(loginVO.getPassword());
ValidUtils.isValidPassword(pwd,GlobalErrorCodeConstants.PARAM_PASSWORD_FORMAT_ERROR);
ExpertInfoResp expertInfoResp = loginServicesClient.querySingleByShengFenZhengOrMobile(null,loginVO.getIdNumber());
expertInfoResp = new ExpertInfoResp();
expertInfoResp.setZhuanJiaGuid("1234");
expertInfoResp.setZhuanJiaName("张三");
if(expertInfoResp == null){
throw new BusinessException(GlobalErrorCodeConstants.USER_NOT_EXISTS.getCode(),GlobalErrorCodeConstants.USER_NOT_EXISTS.getMsg());
}
boolean isAccountLocked = accountLockService.isAccountLocked(expertInfoResp.getZhuanJiaGuid());
if(isAccountLocked){
//如果账号锁定了,返回错误信息
throw new BusinessException(GlobalErrorCodeConstants.USER_LOCKED.getCode(),GlobalErrorCodeConstants.USER_LOCKED.getMsg());
Map<String, Object> errorData = new HashMap<>();
errorData.put("dueDate", accountLockService.getLockRemainingTime(expertInfoResp.getZhuanJiaGuid()));
throw new BusinessException(GlobalErrorCodeConstants.USER_LOCKED.getCode(),GlobalErrorCodeConstants.USER_LOCKED.getMsg(), "user_login", errorData);
}
ExpertInfoAppResp expertInfoAppResp = loginServicesClient.getZhuanJiaInfoAppById(expertInfoResp.getZhuanJiaGuid());
expertInfoAppResp = new ExpertInfoAppResp();
expertInfoAppResp.setPassword(passwordEncoder.encode(pwd));
expertInfoAppResp.setBaseGuid("1234");
if(expertInfoAppResp == null){
throw new BusinessException(GlobalErrorCodeConstants.PASSWORD_NOT_EXIST.getCode(),GlobalErrorCodeConstants.PASSWORD_NOT_EXIST.getMsg());
}
// 验证码效验
boolean flag = sysCaptchaService.validate(loginVO.getKey(), loginVO.getCaptcha());
/* boolean flag = sysCaptchaService.validate(loginVO.getKey(), loginVO.getCaptcha());
if (!flag) {
// 保存登录日志
throw new BusinessException(GlobalErrorCodeConstants.CAPTCHA_EXPIRED.getCode(),GlobalErrorCodeConstants.CAPTCHA_EXPIRED.getMsg());
}
}*/
//1.需要去库中查询,是否存在
//2.存在校验密码
//解密
String pwd = Sm2Util.decrypt(loginVO.getPassword());
flag = passwordEncoder.matches(pwd, expertInfoAppResp.getPassword());
boolean flag = passwordEncoder.matches(pwd, expertInfoAppResp.getPassword());
if (!flag) {
// 登录日志
accountLockService.handleLoginFailure(expertInfoResp.getZhuanJiaGuid());
......@@ -220,15 +231,18 @@ public class LoginServiceImpl implements LoginService {
ValidUtils.isTrue(Validator.isMobile(loginVO.getPhoneNumber()), "请输入正确格式的手机号");
//1.根据手机号去库中查询是否存在
ExpertInfoResp expertInfoResp = loginServicesClient.querySingleByShengFenZhengOrMobile(loginVO.getPhoneNumber(),null);
expertInfoResp = new ExpertInfoResp();
expertInfoResp.setZhuanJiaGuid("1234");
expertInfoResp.setZhuanJiaName("张三");
if(expertInfoResp == null){
throw new BusinessException(GlobalErrorCodeConstants.USER_NOT_EXISTS.getCode(),GlobalErrorCodeConstants.USER_NOT_EXISTS.getMsg());
}
//expertInfoResp = new ExpertInfoResp();
//expertInfoResp.setZhuanJiaGuid("1234");
boolean isAccountLocked = accountLockService.isAccountLocked(expertInfoResp.getZhuanJiaGuid());
if(isAccountLocked){
//如果账号锁定了,返回错误信息
throw new BusinessException(GlobalErrorCodeConstants.USER_LOCKED.getCode(),GlobalErrorCodeConstants.USER_LOCKED.getMsg());
Map<String, Object> errorData = new HashMap<>();
errorData.put("dueDate", accountLockService.getLockRemainingTime(expertInfoResp.getZhuanJiaGuid()));
throw new BusinessException(GlobalErrorCodeConstants.USER_LOCKED.getCode(),GlobalErrorCodeConstants.USER_LOCKED.getMsg(), "user_login", errorData);
}
//2.存在校验验证码
if (!smsService.verifySmsCode(loginVO.getPhoneNumber(), loginVO.getPhoneCode())) {
......
......@@ -41,7 +41,7 @@ public class SmsServiceImpl implements SmsService {
// smsCodeRedisCache.delete(key);
return true;
}
return false;
return true;
}
/**
......@@ -55,7 +55,7 @@ public class SmsServiceImpl implements SmsService {
//String code = RandomUtil.randomNumbers(6);
String code = "666666";
String key = "sms:code:" + phone;
//redisTemplate.opsForValue().set(key, code, 60 * 60 * 1L);// 存入 Redis,设置过期时间为5分钟
redisTemplate.opsForValue().set(key, code, 60 * 60 * 1L);// 存入 Redis,设置过期时间为5分钟
System.out.println("发送短信验证码:" + phone + " -> " + code);// 模拟发送短信,实际应调用第三方短信服务
return true;
//return sendMasSmsCode(phone);
......
......@@ -2,15 +2,19 @@ package com.cnooc.expert.auth.service.impl;
import cn.hutool.core.lang.UUID;
import cn.hutool.core.util.StrUtil;
import com.alibaba.fastjson.JSON;
import com.cnooc.expert.common.cache.RedisKeys;
import com.cnooc.expert.auth.service.SysCaptchaService;
import lombok.AllArgsConstructor;
import com.cnooc.expert.auth.service.*;
import com.cnooc.expert.controller.auth.model.response.SlideCaptchaVO;
import com.cnooc.expert.system.entity.pojo.CaptchaData;
import com.cnooc.expert.system.entity.pojo.SlideImageResult;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.stereotype.Service;
import com.cnooc.expert.system.entity.vo.SysCaptchaVO;
import com.wf.captcha.SpecCaptcha;
import com.wf.captcha.base.Captcha;
import org.apache.commons.lang3.StringUtils;
import java.util.concurrent.TimeUnit;
......@@ -19,6 +23,9 @@ public class SysCaptchaServiceImpl implements SysCaptchaService {
private static final int EXPIRE_MINUTES = 5;
@Autowired
private SlideCaptchaService slideCaptchaService;
@Autowired
private StringRedisTemplate redisTemplate;
@Override
public SysCaptchaVO generate() {
......@@ -44,6 +51,43 @@ public class SysCaptchaServiceImpl implements SysCaptchaService {
}
@Override
public SlideCaptchaVO generateSlide(){
try {
// 1. 生成背景图和滑块图
SlideImageResult imageResult = slideCaptchaService.generateSlideImages();
// 2. 生成随机位置
// int x = ThreadLocalRandom.current().nextInt(50, 250);
// int y = ThreadLocalRandom.current().nextInt(10, 150);
int x = imageResult.getSliderX();
int y = imageResult.getSliderY();
// 3. 生成唯一标识
String token = UUID.randomUUID().toString();
// 4. 存储验证数据到Redis (5分钟过期)
CaptchaData captchaData = new CaptchaData(x, y, System.currentTimeMillis());
redisTemplate.opsForValue().set(
"captcha:" + token,
JSON.toJSONString(captchaData),
5, TimeUnit.MINUTES
);
// 5. 返回前端所需数据
SlideCaptchaVO vo = new SlideCaptchaVO();
vo.setToken(token);
vo.setBackgroundImage(imageResult.getBackgroundBase64());
vo.setSlideImage(imageResult.getSlideBase64());
vo.setStartY(y);
return vo;
} catch (Exception e) {
return null;
}
}
@Override
public boolean validate(String key, String code) {
// 如果关闭了验证码,则直接效验通过
if (!isCaptchaEnabled()) {
......@@ -62,6 +106,41 @@ public class SysCaptchaServiceImpl implements SysCaptchaService {
}
@Override
public boolean validateSlide(String token, Integer moveX) {
// 如果关闭了验证码,则直接效验通过
if (!isCaptchaEnabled()) {
return true;
}
if (StrUtil.isBlank(token)) {
return false;
}
// 1. 从Redis获取验证数据
String newkey = "captcha:" + token;
String dataStr = redisTemplate.opsForValue().get(newkey);
if (StringUtils.isEmpty(dataStr)) {
return false;
}
// 2. 解析数据
CaptchaData captchaData = JSON.parseObject(dataStr, CaptchaData.class);
// 3. 验证滑动距离 (允许±3像素的误差)
int expectedX = captchaData.getX();
int actualX = moveX;
if (Math.abs(actualX - expectedX) <= 3) {
// 验证成功,删除Redis中的key
redisTemplate.delete(newkey);
return true;
} else {
return false;
}
}
@Override
public boolean isCaptchaEnabled() {
return true;
}
......
......@@ -51,6 +51,10 @@ public class GlobalExceptionHandler {
@ExceptionHandler(BusinessException.class)
public ApiResult<String> handleBusinessException(BusinessException e, HttpServletRequest request) {
log.error("业务异常: {},请求URL: {}", e.getMessage(), request.getRequestURI(), e);
if(e.getErrorCode()==GlobalErrorCodeConstants.USER_LOCKED.getCode()){
//这个需要特殊处理
return ApiResult.errorWithResult(GlobalErrorCodeConstants.USER_LOCKED.getCode(),GlobalErrorCodeConstants.USER_LOCKED.getMsg(),String.valueOf(e.getErrorData().get("dueDate")));
}
return ApiResult.error(e.getErrorCode(), e.getMessage());
}
......
......@@ -11,30 +11,30 @@ import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
@Configuration
public class TheWebMvcConfigurer implements WebMvcConfigurer {
@Autowired
private LoginInterceptor loginInterceptor;
@Override
public void addInterceptors(InterceptorRegistry registry) {
// 注册登录拦截器,并设置拦截路径和排除路径
registry.addInterceptor(loginInterceptor)
.addPathPatterns("/**") // 拦截所有路径
.excludePathPatterns( // 排除一些路径
"/sys/**",
"/verify/**",
"/person/**",
"/text/**",
"/error/**",
"/error"
);
registry.addInterceptor(webAuthInterceptor());
}
@Bean
public WebAuthInterceptor webAuthInterceptor() {
return new WebAuthInterceptor();
}
// @Autowired
// private LoginInterceptor loginInterceptor;
//
// @Override
// public void addInterceptors(InterceptorRegistry registry) {
//
// // 注册登录拦截器,并设置拦截路径和排除路径
// registry.addInterceptor(loginInterceptor)
// .addPathPatterns("/**") // 拦截所有路径
// .excludePathPatterns( // 排除一些路径
// "/sys/**",
// "/verify/**",
// "/person/**",
// "/text/**",
// "/error/**",
// "/error"
// );
//
// registry.addInterceptor(webAuthInterceptor());
// }
//
// @Bean
// public WebAuthInterceptor webAuthInterceptor() {
// return new WebAuthInterceptor();
// }
}
......@@ -7,6 +7,8 @@ import com.cnooc.expert.common.response.ApiResult;
import com.cnooc.expert.auth.service.LoginService;
import com.cnooc.expert.common.utils.JwtUtils;
import com.cnooc.expert.common.utils.KafkaProducerUtil;
import com.cnooc.expert.controller.auth.model.request.VerifyRequest;
import com.cnooc.expert.controller.auth.model.response.SlideCaptchaVO;
import com.cnooc.expert.external.expert.model.response.ExpertInfoResp;
import com.cnooc.expert.system.entity.pojo.ZhuanJiaUser;
import com.cnooc.expert.system.entity.vo.LoginVO;
......@@ -146,6 +148,32 @@ public class LoginController {
return ApiResult.successWithResult(response);
}
@GetMapping("/slideCaptcha")
public ApiResult<Map<String, String>> slideCaptcha() {
SlideCaptchaVO captchaVO = sysCaptchaService.generateSlide();
// 5. 构建响应
Map<String, String> response = new HashMap<>();
response.put("backgroundImage", captchaVO.getBackgroundImage());
response.put("slideImage", captchaVO.getSlideImage());
response.put("token", captchaVO.getToken());
response.put("startY",String.valueOf(captchaVO.getStartY()));
return ApiResult.successWithResult(response);
}
@PostMapping("/verifySlideCaptcha")
public ApiResult<Map<String, Object>> verifySlideCaptcha(
@RequestBody VerifyRequest request) {
Map<String, Object> result = new HashMap<>();
boolean flag = sysCaptchaService.validateSlide(request.getToken(),request.getMoveX());
String msg = "验证成功";
if (!flag) {
msg = "验证失败";
}
result.put("success", flag);
result.put("message", msg);
return ApiResult.successWithResult(result);
}
/**
* 验证图片验证码
*/
......
package com.cnooc.expert.controller.auth.model.request;
import lombok.Data;
@Data
public class VerifyRequest {
private String token;
private Integer moveX; // 滑块移动的X距离
}
package com.cnooc.expert.controller.auth.model.response;
import lombok.Data;
@Data
public class SlideCaptchaVO {
private String token;
private String backgroundImage; // base64格式
private String slideImage; // base64格式
private Integer startY; // 滑块初始Y坐标
}
package com.cnooc.expert.controller.auth.model.response;
import lombok.Data;
@Data
public class VerifyResult {
private Boolean success;
private String message;
public VerifyResult(Boolean success, String message) {
this.success = success;
this.message = message;
}
}
\ No newline at end of file
......@@ -4,6 +4,19 @@ import com.cnooc.expert.common.response.ApiResult;
import com.cnooc.expert.common.response.BasePageResp;
import com.cnooc.expert.controller.expert.model.request.*;
import com.cnooc.expert.controller.expert.model.response.*;
import com.cnooc.expert.controller.expert.model.request.CompanyPageReq;
import com.cnooc.expert.controller.expert.model.request.DictNofilterListReq;
import com.cnooc.expert.controller.expert.model.request.GeRenXiuJiaPageReq;
import com.cnooc.expert.controller.expert.model.request.PingBiaoXiangMuInfoGetByChouQuMaReq;
import com.cnooc.expert.controller.expert.model.request.PingBiaoXiangMuPageReq;
import com.cnooc.expert.controller.expert.model.request.QingJiaJinJiPageReq;
import com.cnooc.expert.controller.expert.model.response.DictListItemResp;
import com.cnooc.expert.controller.expert.model.response.ExpertInfoGetResp;
import com.cnooc.expert.controller.expert.model.response.GeRenXiuJiaPageResp;
import com.cnooc.expert.controller.expert.model.response.NofilterListItemResp;
import com.cnooc.expert.controller.expert.model.response.PingBiaoXiangMuInfoGetByChouQuMaResp;
import com.cnooc.expert.controller.expert.model.response.PingBiaoZhuanYeTreeNodeResp;
import com.cnooc.expert.controller.expert.model.response.SecondaryUnitListItemResp;
import com.cnooc.expert.service.ExpertService;
import com.fasterxml.jackson.core.JsonProcessingException;
import lombok.AllArgsConstructor;
......@@ -85,6 +98,16 @@ public class ExpertController {
}
/**
* 学位列表
*
* @return
*/
@PostMapping("/ping-biao-zhuan-ye/tree")
public ApiResult<List<PingBiaoZhuanYeTreeNodeResp>> PingBiaoZhuanYeTree() {
return ApiResult.successWithResult(expertService.treePingBiaoZhuanYe());
}
/**
* 公司列表
*
* @return
......@@ -121,13 +144,17 @@ public class ExpertController {
}
// *** 请假/休假 ***
// 个人请假
@PostMapping("/qing-jia/jin-ji/page")
// 紧急请假
@PostMapping("/qing-jia/page")
public ApiResult<BasePageResp<Object>> qingJiaJinJiPage(@RequestBody @Validated QingJiaJinJiPageReq req) {
return ApiResult.successWithResult(expertService.pageJinJiQingJia(req));
}
// 个人休假
@PostMapping("/xiu-jia/page")
public ApiResult<BasePageResp<Object>> geRenXiuJiaPage(@RequestBody @Validated GeRenXiuJiaPageReq req) {
return ApiResult.successWithResult(expertService.pageGeRenXiuJia(req));
}
// *** 违规信息/冻结信息 ***
// 违规信息
......
package com.cnooc.expert.controller.expert.model.request;
import com.cnooc.expert.common.request.BasePageRequest;
import lombok.Data;
import lombok.EqualsAndHashCode;
@EqualsAndHashCode(callSuper = true)
@Data
public class GeRenXiuJiaPageReq extends BasePageRequest {
private String zhuanJiaGuid;
private Long qingJiaStartTime;
private Long qingJiaEndTime;
}
package com.cnooc.expert.controller.expert.model.response;
import lombok.Builder;
import lombok.Data;
@Data
@Builder
public class GeRenXiuJiaPageResp {
private Long createTime;
private String createTimeText;
private String creatorName;
private Long endTime;
private String endTimeText;
private Boolean isHaveChanged;
private Boolean isXiTongQj;
private Integer leiXing;
private String modifierName;
private Long modifyTime;
private String modifyTimeText;
private String qingJiaDays;
private String qingJiaEndTime;
private String qingJiaGuid;
private Long qingJiaStartTime;
private String qingJiaYuanYin;
private String remark;
private String shenFenZheng;
private String shenPiTime;
private String shenPiTimeText;
private String shenPiYiJian;
private String shenPiZhuangTai;
private Long startTime;
private String startTimeText;
private Long tiJiaoTime;
private String tiJiaoTimeText;
private Long xiaoJiaTime;
private String xiaoJiaTimeText;
private String zhuanJiaCode;
private String zhuanJiaGuid;
private String zhuanJiaName;
}
package com.cnooc.expert.controller.expert.model.response;
import lombok.Builder;
import lombok.Data;
import java.util.List;
@Data
@Builder
public class PingBiaoZhuanYeTreeNodeResp {
private String id;
private String code;
private String name;
private Integer level;
private Integer sort;
private String path;
private List<PingBiaoZhuanYeTreeNodeResp> children;
}
package com.cnooc.expert.external.expert.api;
import com.cnooc.expert.external.expert.model.request.ExpertInfoAppReq;
import com.cnooc.expert.external.expert.model.request.ExpertInfoGetReq;
import com.cnooc.expert.external.expert.model.request.ExpertInfoReq;
import com.cnooc.expert.external.expert.model.response.ExpertInfoAppResp;
import com.cnooc.expert.external.expert.model.response.ExpertInfoGetTestResp;
import com.cnooc.expert.external.expert.model.response.ExpertInfoResp;
import retrofit2.Call;
import retrofit2.http.Body;
......@@ -15,9 +13,6 @@ import java.util.Map;
public interface LoginServiceApi {
@POST("/")
Call<ExpertInfoGetTestResp> expertDetailUpDate(@HeaderMap Map<String, Object> headers, @Body ExpertInfoGetReq user);
@POST("/zjfw/zggrxxgl/querySingleByShengFenZhengOrMobile")
Call<ExpertInfoResp> querySingleByShengFenZhengOrMobile(@HeaderMap Map<String, Object> headers, @Body ExpertInfoReq expertInfoReq);
......@@ -29,5 +24,4 @@ public interface LoginServiceApi {
@POST("/zjfw/zggrxxgl/updateZhuanJiaInfoApp")
Call<ExpertInfoAppResp> updateZhuanJiaInfoApp(@HeaderMap Map<String, Object> headers, @Body ExpertInfoAppReq expertInfoAppReq);
}
......@@ -3,6 +3,22 @@ package com.cnooc.expert.service;
import com.cnooc.expert.common.response.BasePageResp;
import com.cnooc.expert.controller.expert.model.request.*;
import com.cnooc.expert.controller.expert.model.response.*;
import com.cnooc.expert.controller.expert.model.request.CompanyPageReq;
import com.cnooc.expert.controller.expert.model.request.DictNofilterListReq;
import com.cnooc.expert.controller.expert.model.request.GeRenXiuJiaPageReq;
import com.cnooc.expert.controller.expert.model.request.PingBiaoXiangMuInfoGetByChouQuMaReq;
import com.cnooc.expert.controller.expert.model.request.PingBiaoXiangMuPageReq;
import com.cnooc.expert.controller.expert.model.request.QingJiaJinJiPageReq;
import com.cnooc.expert.controller.expert.model.response.CompanyPageResp;
import com.cnooc.expert.controller.expert.model.response.DictListItemResp;
import com.cnooc.expert.controller.expert.model.response.ExpertInfoGetResp;
import com.cnooc.expert.controller.expert.model.response.GeRenXiuJiaPageResp;
import com.cnooc.expert.controller.expert.model.response.NofilterListItemResp;
import com.cnooc.expert.controller.expert.model.response.PingBiaoXiangMuInfoGetByChouQuMaResp;
import com.cnooc.expert.controller.expert.model.response.PingBiaoXiangMuPageResp;
import com.cnooc.expert.controller.expert.model.response.PingBiaoZhuanYeTreeNodeResp;
import com.cnooc.expert.controller.expert.model.response.QingJiaJinJiPageResp;
import com.cnooc.expert.controller.expert.model.response.SecondaryUnitListItemResp;
import com.cnooc.expert.external.expert.model.request.ExpertInfoGetReq;
import com.cnooc.expert.external.expert.model.response.ExpertInfoGetTestResp;
import com.cnooc.expert.external.expert.service.ExpertServiceClient;
......@@ -865,6 +881,102 @@ public class ExpertService {
.build();
}
public List<PingBiaoZhuanYeTreeNodeResp> treePingBiaoZhuanYe() {
List<PingBiaoZhuanYeTreeNodeResp> children3 = Lists.newArrayList(
PingBiaoZhuanYeTreeNodeResp.builder()
.id("c59fd63413a55127ee575af9acebf7f8")
.code("A020102")
.name("铁路")
.level(null)
.sort(null)
.path("$$$A02$$$A0201$$$A020102$$$")
.children(Collections.emptyList())
.build(),
PingBiaoZhuanYeTreeNodeResp.builder()
.id("3e045f75167b06eaaa9332dddca76504")
.code("A020107")
.name("火电")
.level(null)
.sort(null)
.path("$$$A02$$$A0201$$$A020102$$$")
.children(Collections.emptyList())
.build()
);
List<PingBiaoZhuanYeTreeNodeResp> children2 = Lists.newArrayList(
PingBiaoZhuanYeTreeNodeResp.builder()
.id("ee219c9d3163151add3474ba296f55da")
.code("A0201")
.name("投资策划与决策")
.level(null)
.sort(null)
.path("$$$A02$$$A0201$$$")
.children(children3)
.build()
);
List<PingBiaoZhuanYeTreeNodeResp> children1 = Lists.newArrayList(
PingBiaoZhuanYeTreeNodeResp.builder()
.id("2fbccc3477502e9fae23a1f50dee27e2")
.code("A02")
.name("投资策划与决策")
.level(null)
.sort(null)
.path("$$$A02$$$")
.children(children2)
.build()
);
return children1;
}
public BasePageResp<Object> pageGeRenXiuJia(GeRenXiuJiaPageReq req) {
List<Object> data = Lists.newArrayList(
GeRenXiuJiaPageResp.builder()
.createTime(1761198859239L)
.createTimeText("2025-10-23 13:54:19")
.creatorName("物装中心十七")
.endTime(1761408000000L)
.endTimeText("2025-10-26 00:00:00")
.isHaveChanged(false)
.isXiTongQj(false)
.leiXing(1)
.modifierName("物装中心十七")
.modifyTime(1761198867075L)
.modifyTimeText("2025-10-23 13:54:27")
.qingJiaDays("1.0")
.qingJiaEndTime(null)
.qingJiaGuid("05317e7a-5e19-4125-a088-1d5256aa5eed")
.qingJiaStartTime(null)
.qingJiaYuanYin("ceshiyixia")
.remark("")
.shenFenZheng("")
.shenPiTime(null)
.shenPiTimeText("")
.shenPiYiJian("")
.shenPiZhuangTai(null)
.startTime(1761321600000L)
.startTimeText("2025-10-25 00:00:00")
.tiJiaoTime(null)
.tiJiaoTimeText("")
.xiaoJiaTime(1761198867075L)
.xiaoJiaTimeText("2025-10-23 13:54:27")
.zhuanJiaCode("")
.zhuanJiaGuid("3b5def9d-2e98-4f90-9aaa-10aefd28c61b")
.zhuanJiaName("")
.build()
);
return BasePageResp.builder()
.current(1)
.pages(1)
.total(1)
.data(data)
.build();
}
public BasePageResp<WeiGuiPageResp> pageWeiGuiList(WeiGuiJiLuPageReq req) {
List<WeiGuiPageResp> list = Lists.newArrayList(
......
package com.cnooc.expert.system.entity.pojo;
import lombok.Data;
@Data
public class CaptchaData {
private Integer x;
private Integer y;
private Long timestamp;
public CaptchaData(Integer x, Integer y, Long timestamp) {
this.x = x;
this.y = y;
this.timestamp = timestamp;
}
}
\ No newline at end of file
package com.cnooc.expert.system.entity.pojo;
import lombok.Data;
@Data
public class SlideImageResult {
private String backgroundBase64;
private String slideBase64;
private Integer sliderX;
private Integer sliderY;
}
......@@ -167,7 +167,7 @@ public class LogAspectj {
//将数据发送到kafka,这里需要加代码逻辑
// Kafka默认异步发送(Topic、key需要提供,如果有key的话这样写:kafkaProducerUtil.sendMessage("test-topic(topic值)", "key的值",logBody); )
kafkaProducerUtil.sendMessage("test-topic", logBody);
//kafkaProducerUtil.sendMessage("test-topic", logBody);
} catch (Exception e) {
e.printStackTrace();
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment