后台管理框架整合

master
yqy 1 year ago
parent efea5b9e65
commit 0cffd50c87

@ -1,6 +1,8 @@
package com.baiye.modules.distribute.controller; package com.baiye.modules.distribute.controller;
import com.baiye.modules.distribute.service.ClueService; import com.baiye.modules.distribute.service.ClueService;
import com.baiye.result.R;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.tags.Tag; import io.swagger.v3.oas.annotations.tags.Tag;
import lombok.RequiredArgsConstructor; import lombok.RequiredArgsConstructor;
import org.springframework.web.bind.annotation.*; import org.springframework.web.bind.annotation.*;

@ -49,7 +49,7 @@ public class ClueFileController {
@GetMapping("/generate") @GetMapping("/generate")
@Operation(summary = "生成秘钥") @Operation(summary = "生成秘钥")
public R<String> generateSecretKey() { public R<Map<String, Object>> generateSecretKey() {
return R.ok(clueFileService.generateSecretKey()); return R.ok(clueFileService.generateSecretKey());
} }

@ -1,7 +1,9 @@
package com.baiye.modules.distribute.controller; package com.baiye.modules.distribute.controller;
import com.baiye.modules.distribute.dto.PushClueDTO; import com.baiye.modules.distribute.dto.DBPushClueDTO;
import com.baiye.modules.distribute.dto.ReceivePushLeadsDTO;
import com.baiye.modules.distribute.service.OutsideReqService; import com.baiye.modules.distribute.service.OutsideReqService;
import com.baiye.result.BaseResultCode;
import com.baiye.result.R; import com.baiye.result.R;
import lombok.RequiredArgsConstructor; import lombok.RequiredArgsConstructor;
import org.springframework.web.bind.annotation.*; import org.springframework.web.bind.annotation.*;
@ -22,9 +24,18 @@ public class OutsideReqController {
*/ */
@PostMapping("/pushClue/{userId}/{origin}") @PostMapping("/pushClue/{userId}/{origin}")
public R<Object> pushClue(@PathVariable("userId") String userId, @PathVariable("origin") Integer origin, public R<Object> pushClue(@PathVariable("userId") String userId, @PathVariable("origin") Integer origin,
@RequestBody PushClueDTO pushClueDTO) { @RequestBody DBPushClueDTO DBPushClueDTO) {
outsideReqService.pushClue(userId, origin, pushClueDTO); outsideReqService.pushClue(userId, origin, DBPushClueDTO);
return R.ok(); return R.ok();
} }
/**
*
* @return
*/
@PostMapping("/pushLeads")
public R<Object> externalPushClue(@RequestBody ReceivePushLeadsDTO receivePushLeadsDTO){
return outsideReqService.externalPushClue(receivePushLeadsDTO) ? R.ok()
: R.failed(BaseResultCode.UPDATE_DATABASE_ERROR, "删除文件失败");
}
} }

@ -0,0 +1,24 @@
package com.baiye.modules.distribute.dto;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
/**
* @Author YQY
* @Date 2023/8/10
*/
@Data
public class ClueDTO {
@Schema(title = "线索来源")
private String originName;
@Schema(title = "手机号")
private String nid;
@Schema(title = "线索时间")
private String clueTime;
@Schema(title = "线索备注")
private String remark;
}

@ -7,7 +7,7 @@ import lombok.Data;
* @Date 2023/8/7 * @Date 2023/8/7
*/ */
@Data @Data
public class PushClueDTO { public class DBPushClueDTO {
private String app_id; private String app_id;

@ -0,0 +1,17 @@
package com.baiye.modules.distribute.dto;
import lombok.Data;
import java.util.List;
/**
* @Author YQY
* @Date 2023/8/10
*/
@Data
public class ReceivePushLeadsDTO {
private String appKey;
private List<String> clueList;
}

@ -42,10 +42,19 @@ public class ClueRecordEntity extends BaseEntity {
@Schema(title = "备注") @Schema(title = "备注")
private String remark; private String remark;
@Schema(title = "渠道类型")
private String channelType;
@Schema(title = "渠道标识")
private String channelIdentifying;
@Schema(title = "成功条数") @Schema(title = "成功条数")
private Integer successNum = 0; private Integer successNum = 0;
@Schema(title = "失败条数") @Schema(title = "失败条数")
private Integer failNum = 0; private Integer failNum = 0;
@Schema(title = "分配状态: 0:未分配 1:已分配")
private Integer allocationStatus = 0;
} }

@ -22,6 +22,9 @@ public class UserSecretKeyEntity extends BaseEntity {
@Schema(title = "ID") @Schema(title = "ID")
private Long id; private Long id;
@Schema(title = "appKey")
private String appKey;
@Schema(title = "私钥") @Schema(title = "私钥")
private String privateKey; private String privateKey;

@ -14,6 +14,6 @@ public interface ClueFileService {
/** /**
* *
*/ */
String generateSecretKey(); Map<String, Object> generateSecretKey();
} }

@ -1,12 +1,14 @@
package com.baiye.modules.distribute.service; package com.baiye.modules.distribute.service;
import com.baiye.modules.distribute.dto.PushClueDTO; import com.baiye.modules.distribute.dto.DBPushClueDTO;
import com.baiye.modules.distribute.dto.ReceivePushLeadsDTO;
public interface OutsideReqService { public interface OutsideReqService {
/** /**
* *
*/ */
void pushClue(String userId, Integer origin, PushClueDTO pushClueDTO); void pushClue(String userId, Integer origin, DBPushClueDTO DBPushClueDTO);
Boolean externalPushClue(ReceivePushLeadsDTO receivePushLeadsDTO);
} }

@ -1,6 +1,9 @@
package com.baiye.modules.distribute.service.impl; package com.baiye.modules.distribute.service.impl;
import cn.hutool.core.util.IdUtil; import cn.hutool.core.util.IdUtil;
import cn.hutool.poi.excel.ExcelReader;
import cn.hutool.poi.excel.ExcelUtil;
import com.baiye.constant.UploadTemplateHeadConstant;
import com.baiye.exception.BadRequestException; import com.baiye.exception.BadRequestException;
import com.baiye.modules.distribute.entity.ClueRecordEntity; import com.baiye.modules.distribute.entity.ClueRecordEntity;
import com.baiye.modules.distribute.entity.UserSecretKeyEntity; import com.baiye.modules.distribute.entity.UserSecretKeyEntity;
@ -11,14 +14,21 @@ import com.baiye.security.util.SecurityUtils;
import com.baiye.system.properties.FileProperties; import com.baiye.system.properties.FileProperties;
import com.baiye.util.AppUtils; import com.baiye.util.AppUtils;
import com.baiye.util.FileUtil; import com.baiye.util.FileUtil;
import com.baiye.util.RsaUtil;
import com.baiye.utils.ClueFileTestingUtil; import com.baiye.utils.ClueFileTestingUtil;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import lombok.RequiredArgsConstructor; import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import org.springframework.web.multipart.MultipartFile; import org.springframework.web.multipart.MultipartFile;
import java.io.File; import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.nio.charset.StandardCharsets;
import java.security.KeyPair;
import java.text.SimpleDateFormat; import java.text.SimpleDateFormat;
import java.util.*; import java.util.*;
@ -52,6 +62,21 @@ public class ClueFileServiceImpl implements ClueFileService {
clueRecordEntity.setTaskId(taskId); clueRecordEntity.setTaskId(taskId);
clueRecordEntity.setOldFileName(multipartFile.getOriginalFilename()); clueRecordEntity.setOldFileName(multipartFile.getOriginalFilename());
clueRecordEntity.setUrl(Objects.requireNonNull(file).getPath()); clueRecordEntity.setUrl(Objects.requireNonNull(file).getPath());
// 获取文件中的来源 null为为止
InputStream inputStream;
try {
inputStream = new FileInputStream(file);
} catch (IOException e) {
throw new BadRequestException("读取文件错误");
}
ExcelReader reader = ExcelUtil.getReader(inputStream);
List<Object> readRow = reader.readRow(1);
int index = excelHeadList.indexOf(UploadTemplateHeadConstant.HEAD_ORIGIN);
String channelStr = (String) readRow.get(index);
if (StringUtils.isBlank(channelStr)) channelStr = "未知";
clueRecordEntity.setChannelType(SecurityUtils.getUser().getUsername() + "-" + channelStr);
clueRecordEntity.setChannelIdentifying(channelStr);
clueRecordService.save(clueRecordEntity); clueRecordService.save(clueRecordEntity);
Map<String, Object> returnMap = new HashMap<>(); Map<String, Object> returnMap = new HashMap<>();
@ -61,34 +86,43 @@ public class ClueFileServiceImpl implements ClueFileService {
} }
@Override @Override
public String generateSecretKey() { public Map<String, Object> generateSecretKey() {
Map<String, Object> map = new HashMap<>();
UserSecretKeyEntity entity = userSecretKeyMapper.selectOne(new LambdaQueryWrapper<UserSecretKeyEntity>().eq(UserSecretKeyEntity::getCreateBy, SecurityUtils.getCurrentUserId())); UserSecretKeyEntity entity = userSecretKeyMapper.selectOne(new LambdaQueryWrapper<UserSecretKeyEntity>().eq(UserSecretKeyEntity::getCreateBy, SecurityUtils.getCurrentUserId()));
if (entity != null && entity.getId() != null) { if (entity != null && entity.getId() != null) {
return entity.getPublicKey(); map.put("appKey", entity.getAppKey());
map.put("publicKey", entity.getPublicKey());
return map;
} }
try { try {
// 生成秘钥对 // 生成秘钥对
// KeyPair keyPair = RsaUtil.getKeyPair(); KeyPair keyPair = RsaUtil.getKeyPair();
// String privateKey = new String(Base64.getEncoder().encode(keyPair.getPrivate().getEncoded()), String privateKey = new String(Base64.getEncoder().encode(keyPair.getPrivate().getEncoded()),
// StandardCharsets.UTF_8); StandardCharsets.UTF_8);
// String publicKey = new String(Base64.getEncoder().encode(keyPair.getPublic().getEncoded()), String publicKey = new String(Base64.getEncoder().encode(keyPair.getPublic().getEncoded()),
// StandardCharsets.UTF_8); StandardCharsets.UTF_8);
String appId = AppUtils.getAppId(); String appId = AppUtils.getAppId();
UserSecretKeyEntity userSecretKeyEntity = userSecretKeyMapper.selectOne(new LambdaQueryWrapper<UserSecretKeyEntity>().eq(UserSecretKeyEntity::getPublicKey, appId));
while (true){ while (true){
UserSecretKeyEntity userSecretKeyEntity = userSecretKeyMapper.selectOne(new LambdaQueryWrapper<UserSecretKeyEntity>().eq(UserSecretKeyEntity::getPublicKey, appId));
// 插入数据,返回数据
if (userSecretKeyEntity == null || userSecretKeyEntity.getId() == null){ if (userSecretKeyEntity == null || userSecretKeyEntity.getId() == null){
String appSecret = AppUtils.getAppSecret(appId);
// 插入数据
UserSecretKeyEntity keyEntity = new UserSecretKeyEntity(); UserSecretKeyEntity keyEntity = new UserSecretKeyEntity();
keyEntity.setPublicKey(appId); keyEntity.setAppKey(appId);
keyEntity.setPrivateKey(appSecret); keyEntity.setPublicKey(publicKey);
keyEntity.setPrivateKey(privateKey);
userSecretKeyMapper.insert(keyEntity); userSecretKeyMapper.insert(keyEntity);
return appId; map.put("appKey", appId);
map.put("publicKey", publicKey);
return map;
}else { }else {
// 重复的appId,重新生成 // 重复的appId,重新生成
appId = AppUtils.getAppId(); appId = AppUtils.getAppId();
privateKey = new String(Base64.getEncoder().encode(keyPair.getPrivate().getEncoded()),
StandardCharsets.UTF_8);
publicKey = new String(Base64.getEncoder().encode(keyPair.getPublic().getEncoded()),
StandardCharsets.UTF_8);
} }
} }
} catch (Exception e) { } catch (Exception e) {

@ -1,17 +1,27 @@
package com.baiye.modules.distribute.service.impl; package com.baiye.modules.distribute.service.impl;
import cn.hutool.core.collection.CollUtil;
import cn.hutool.json.JSONUtil; import cn.hutool.json.JSONUtil;
import com.baiye.modules.distribute.dto.PushClueDTO; import com.baiye.modules.distribute.dto.ClueDTO;
import com.baiye.modules.distribute.dto.DBPushClueDTO;
import com.baiye.modules.distribute.dto.ReceivePushLeadsDTO;
import com.baiye.modules.distribute.entity.ClueEntity; import com.baiye.modules.distribute.entity.ClueEntity;
import com.baiye.modules.distribute.entity.UserSecretKeyEntity;
import com.baiye.modules.distribute.mapper.UserSecretKeyMapper;
import com.baiye.modules.distribute.service.ClueService; import com.baiye.modules.distribute.service.ClueService;
import com.baiye.modules.distribute.service.OutsideReqService; import com.baiye.modules.distribute.service.OutsideReqService;
import com.baiye.util.MobileUtil; import com.baiye.util.MobileUtil;
import com.baiye.util.RsaUtil;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import lombok.RequiredArgsConstructor; import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.BeanUtils;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import java.nio.charset.StandardCharsets; import java.nio.charset.StandardCharsets;
import java.util.ArrayList;
import java.util.Base64; import java.util.Base64;
import java.util.List;
/** /**
* @Author YQY * @Author YQY
@ -24,10 +34,12 @@ public class OutsideReqServiceImpl implements OutsideReqService {
private final ClueService clueService; private final ClueService clueService;
private final UserSecretKeyMapper userSecretKeyMapper;
@Override @Override
public void pushClue(String userId, Integer origin, PushClueDTO pushClueDTO) { public void pushClue(String userId, Integer origin, DBPushClueDTO DBPushClueDTO) {
// 解密验证资源手机号 // 解密验证资源手机号
String mobile = pushClueDTO.getMobile(); String mobile = DBPushClueDTO.getMobile();
byte[] mobileDecode = Base64.getDecoder().decode(mobile); byte[] mobileDecode = Base64.getDecoder().decode(mobile);
String mobileDecodeStr = new String(mobileDecode, StandardCharsets.UTF_8); String mobileDecodeStr = new String(mobileDecode, StandardCharsets.UTF_8);
boolean bool = MobileUtil.checkPhone(mobileDecodeStr); boolean bool = MobileUtil.checkPhone(mobileDecodeStr);
@ -35,7 +47,7 @@ public class OutsideReqServiceImpl implements OutsideReqService {
// 添加资源信息 // 添加资源信息
ClueEntity clueEntity = new ClueEntity(); ClueEntity clueEntity = new ClueEntity();
clueEntity.setNid(mobileDecodeStr); clueEntity.setNid(mobileDecodeStr);
clueEntity.setOtherClue(JSONUtil.toJsonStr(pushClueDTO)); clueEntity.setOtherClue(JSONUtil.toJsonStr(DBPushClueDTO));
byte[] userIdDecode = Base64.getDecoder().decode(userId); byte[] userIdDecode = Base64.getDecoder().decode(userId);
String userIdDecodeStr = new String(userIdDecode, StandardCharsets.UTF_8); String userIdDecodeStr = new String(userIdDecode, StandardCharsets.UTF_8);
clueEntity.setCreateBy(Long.parseLong(userIdDecodeStr)); clueEntity.setCreateBy(Long.parseLong(userIdDecodeStr));
@ -43,4 +55,27 @@ public class OutsideReqServiceImpl implements OutsideReqService {
} }
} }
@Override
public Boolean externalPushClue(ReceivePushLeadsDTO receivePushLeadsDTO) {
String appKey = receivePushLeadsDTO.getAppKey();
List<String> clueList = receivePushLeadsDTO.getClueList();
UserSecretKeyEntity entity = userSecretKeyMapper.selectOne(new LambdaQueryWrapper<UserSecretKeyEntity>().eq(UserSecretKeyEntity::getAppKey, appKey));
if (entity != null && CollUtil.isNotEmpty(clueList)){
List<ClueEntity> clueEntityList = new ArrayList<>();
for (String clueStr : clueList) {
String jsonStr = null;
try {
jsonStr = RsaUtil.decryptByPrivateKey(clueStr, RsaUtil.getPrivateKey(entity.getPrivateKey()));
} catch (Exception e) {
log.error("解密失败");
}
ClueDTO clueDTO = JSONUtil.toBean(jsonStr, ClueDTO.class);
ClueEntity clueEntity = new ClueEntity();
BeanUtils.copyProperties(clueDTO, clueEntity);
}
return clueService.saveBatch(clueEntityList);
}
return true;
}
} }

@ -40,6 +40,15 @@ public class ClueRecordVO implements Serializable {
@Schema(title = "失败条数") @Schema(title = "失败条数")
private Integer failNum; private Integer failNum;
@Schema(title = "渠道类型")
private String channelType;
@Schema(title = "分配状态: 0:未分配 1:已分配")
private Integer allocationStatus = 0;
@Schema(title = "渠道标识")
private String channelIdentifying;
@Schema(title = "创建时间") @Schema(title = "创建时间")
private LocalDateTime createTime; private LocalDateTime createTime;

@ -10,6 +10,9 @@
cr.remark, cr.remark,
cr.success_num, cr.success_num,
cr.fail_num, cr.fail_num,
cr.channel_type,
cr.channel_identifying,
cr.allocation_status,
cr.create_time, cr.create_time,
cr.update_time cr.update_time
</sql> </sql>

Loading…
Cancel
Save