Browse Source

获取jsapi鉴权配置信息

master
luoweijian 2 weeks ago
parent
commit
17528529bf
  1. 6
      pom.xml
  2. 3
      src/main/java/com/project/ding/config/DingProperties.java
  3. 19
      src/main/java/com/project/ding/config/DingTalkConfiguration.java
  4. 2
      src/main/java/com/project/ding/config/DtConfig.java
  5. 22
      src/main/java/com/project/ding/controller/DingJsApiController.java
  6. 134
      src/main/java/com/project/ding/utils/DingUtil.java
  7. 3
      src/main/java/com/project/exam/application/ExamRecordApplicationService.java
  8. 6
      src/main/java/com/project/exam/application/impl/ExamRecordApplicationServiceImpl.java
  9. 19
      src/main/java/com/project/exam/controller/AdminExamRecordController.java
  10. 4
      src/main/java/com/project/exam/controller/ExamRecordController.java
  11. 4
      src/main/java/com/project/exam/domain/dto/ExamRecordDTO.java
  12. 26
      src/main/java/com/project/exam/domain/dto/ExportExamRecordDTO.java
  13. 9
      src/main/java/com/project/exam/domain/service/AdminExportExamRecordDomainService.java
  14. 54
      src/main/java/com/project/exam/domain/service/handler/ExamResultColorHandler.java
  15. 22
      src/main/java/com/project/exam/domain/service/impl/AdminExportExamRecordDomainServiceImpl.java
  16. 9
      src/main/java/com/project/exam/domain/service/impl/AdminSearchExamRecordDomainServiceImpl.java
  17. 1
      src/main/resources/application.yml

6
pom.xml

@ -40,6 +40,12 @@
<lombok.version>1.18.30</lombok.version> <lombok.version>1.18.30</lombok.version>
</properties> </properties>
<dependencies> <dependencies>
<!-- 钉钉官方 Java SDK (新版) -->
<dependency>
<groupId>com.aliyun</groupId>
<artifactId>dingtalk</artifactId>
<version>2.2.12</version>
</dependency>
<dependency> <dependency>
<groupId>io.minio</groupId> <groupId>io.minio</groupId>
<artifactId>minio</artifactId> <artifactId>minio</artifactId>

3
src/main/java/com/project/ding/config/DingProperties.java

@ -10,5 +10,6 @@ import org.springframework.stereotype.Component;
public class DingProperties { public class DingProperties {
private String appKey; private String appKey;
private String appSecret; private String appSecret;
private Long agentId; private String agentId;
private String corpId;
} }

19
src/main/java/com/project/ding/config/DingTalkConfiguration.java

@ -0,0 +1,19 @@
package com.project.ding.config;
import com.aliyun.dingtalkoauth2_1_0.Client;
import com.aliyun.teaopenapi.models.Config;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
public class DingTalkConfiguration {
@Bean
public Client dingTalkClient() throws Exception {
// 使用 com.aliyun.teaopenapi.models.Config
Config config = new Config();
config.protocol = "https";
config.regionId = "central";
return new Client(config);
}
}

2
src/main/java/com/project/ding/config/DtConfig.java

@ -22,7 +22,7 @@ public class DtConfig {
config.setAppSecret(dingTalkProperties.getAppSecret()); config.setAppSecret(dingTalkProperties.getAppSecret());
if (dingTalkProperties.getAgentId() != null) { if (dingTalkProperties.getAgentId() != null) {
config.setAgentId(dingTalkProperties.getAgentId()); config.setAgentId(Long.valueOf(dingTalkProperties.getAgentId()));
} }
DtService dtService = new DtServiceImpl(); DtService dtService = new DtServiceImpl();

22
src/main/java/com/project/ding/controller/DingJsApiController.java

@ -0,0 +1,22 @@
package com.project.ding.controller;
import com.project.base.domain.result.Result;
import com.project.ding.utils.DingUtil;
import jakarta.servlet.http.HttpServletRequest;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import java.util.Map;
@RestController
@RequestMapping("/api/ding/jsApi")
public class DingJsApiController {
@Autowired
private DingUtil dingUtil;
@RequestMapping("/getConfig")
public Result<Map<String,String>> getConfig(HttpServletRequest request){
//AuthHelper 就是上面方法的类
return Result.success(dingUtil.getConfig(request));
}
}

134
src/main/java/com/project/ding/utils/DingUtil.java

@ -1,11 +1,12 @@
package com.project.ding.utils; package com.project.ding.utils;
import cn.hutool.core.bean.BeanUtil; import cn.hutool.core.bean.BeanUtil;
import com.aliyun.dingtalkoauth2_1_0.models.CreateJsapiTicketResponse;
import com.aliyun.teautil.models.RuntimeOptions;
import com.fasterxml.jackson.core.type.TypeReference; import com.fasterxml.jackson.core.type.TypeReference;
import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.databind.ObjectMapper;
import com.github.tingyugetc520.ali.dingtalk.api.DtService; import com.github.tingyugetc520.ali.dingtalk.api.DtService;
import com.github.tingyugetc520.ali.dingtalk.bean.department.DtDepart; import com.github.tingyugetc520.ali.dingtalk.bean.department.DtDepart;
import com.github.tingyugetc520.ali.dingtalk.bean.message.DtCorpConversationMessage; import com.github.tingyugetc520.ali.dingtalk.bean.message.DtCorpConversationMessage;
import com.github.tingyugetc520.ali.dingtalk.bean.message.DtMessage; import com.github.tingyugetc520.ali.dingtalk.bean.message.DtMessage;
import com.github.tingyugetc520.ali.dingtalk.error.DtErrorException; import com.github.tingyugetc520.ali.dingtalk.error.DtErrorException;
@ -13,26 +14,49 @@ import com.google.common.collect.Lists;
import com.google.gson.JsonObject; import com.google.gson.JsonObject;
import com.jayway.jsonpath.JsonPath; import com.jayway.jsonpath.JsonPath;
import com.project.appeal.domain.dto.AppealDTO; import com.project.appeal.domain.dto.AppealDTO;
import com.project.ding.config.DingProperties;
import com.project.ding.domain.dto.DepartmentDTO; import com.project.ding.domain.dto.DepartmentDTO;
import com.project.ding.domain.dto.DingUserDTO; import com.project.ding.domain.dto.DingUserDTO;
import com.project.ding.domain.dto.UserDTO; import com.project.ding.domain.dto.UserDTO;
import io.vavr.control.Try; import io.vavr.control.Try;
import jakarta.servlet.http.HttpServletRequest;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.scheduling.annotation.Async; import org.springframework.scheduling.annotation.Async;
import org.springframework.stereotype.Component; import org.springframework.stereotype.Component;
import com.aliyun.dingtalkoauth2_1_0.Client;
import com.aliyun.dingtalkoauth2_1_0.models.CreateJsapiTicketHeaders;
import java.net.URLDecoder;
import java.nio.charset.StandardCharsets;
import java.security.MessageDigest;
import java.time.LocalDateTime; import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter; import java.time.format.DateTimeFormatter;
import java.util.ArrayList; import java.util.*;
import java.util.Date; import java.util.concurrent.TimeUnit;
import java.util.List;
import java.util.stream.Collectors; import java.util.stream.Collectors;
@Component @Component
public class DingUtil { public class DingUtil {
@Autowired @Autowired
private DtService dtService; private DtService dtService;
@Autowired
private StringRedisTemplate redisTemplate;
@Autowired
private Client dingTalkClient; // 之前创建好的新版 SDK Client
@Autowired
private DingProperties dingTalkProperties;
private static final String TICKET_KEY = "dingtalk:jsapi_ticket";
public List<DepartmentDTO> getAllDepartment() throws Exception { public List<DepartmentDTO> getAllDepartment() throws Exception {
List<DtDepart> list = dtService.getDepartmentService().list(null, true); List<DtDepart> list = dtService.getDepartmentService().list(null, true);
@ -42,10 +66,112 @@ public class DingUtil {
BeanUtil.copyProperties(dtDepart , departmentDTO); BeanUtil.copyProperties(dtDepart , departmentDTO);
res.add(departmentDTO); res.add(departmentDTO);
} }
return res; return res;
} }
public String getJsapiTicket(String url) throws Exception {
// 1. 先从 Redis 拿
String ticket = redisTemplate.opsForValue().get(TICKET_KEY + url);
if (ticket != null) {
return ticket;
}
// 2. 如果 Redis 没了,加锁去钉钉查,防止高并发下多个请求同时冲击钉钉接口
synchronized (TICKET_KEY + url) {
// 二次检查
ticket = redisTemplate.opsForValue().get(TICKET_KEY + url);
if (ticket != null) return ticket;
// 3. 获取 AccessToken (也建议通过 Redis 拿,逻辑同下)
String accessToken = dtService.getAccessToken();
// 4. 调用新版 SDK 获取 Ticket
CreateJsapiTicketHeaders createJsapiTicketHeaders = new CreateJsapiTicketHeaders();
createJsapiTicketHeaders.xAcsDingtalkAccessToken = accessToken;
String jsapiTicket = "";
try {
CreateJsapiTicketResponse jsapiTicketResponse = dingTalkClient.createJsapiTicketWithOptions(createJsapiTicketHeaders, new RuntimeOptions());
// 5. 存入 Redis,设置 7000 秒过期(留出 200 秒冗余)
jsapiTicket = jsapiTicketResponse.getBody().getJsapiTicket();
redisTemplate.opsForValue().set(TICKET_KEY + url, jsapiTicket
, 7000, TimeUnit.SECONDS);
} catch (Exception e) {
// 如果 V2 接口报错,部分企业应用可能需要降级调用 V1 接口(钉钉目前的过渡期特征)
throw new Exception("获取JsapiTicket失败: " + e.getMessage());
}
return jsapiTicket;
}
}
public Map<String, String> getConfig(HttpServletRequest request) {
String urlString = request.getRequestURL().toString();
String queryString = request.getQueryString();
String queryStringEncode = null;
String url;
if (queryString != null) {
queryStringEncode = URLDecoder.decode(queryString);
url = urlString + "?" + queryStringEncode;
} else {
url = urlString;
}
String nonceStr = "abcdefg";
long timeStamp = System.currentTimeMillis() / 1000;
String signedUrl = url;
String ticket = null;
String signature = null;
String agentid = null;
try {
String path = request.getServletContext().getRealPath("/");
ticket = getJsapiTicket(path);
signature = sign(ticket, nonceStr, timeStamp, signedUrl);
agentid = dingTalkProperties.getAgentId();
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
Map<String,String> resMap = new HashMap<>();
resMap.put("jsticket" , ticket);
resMap.put("signature" , signature);
resMap.put("nonceStr" , nonceStr);
resMap.put("corpId" , dingTalkProperties.getCorpId());
resMap.put("agentid" , agentid);
return resMap;
}
public static String sign(String jsticket, String nonceStr, long timeStamp, String url) throws Exception {
// 1. 拼接字符串。注意:顺序必须固定,参数名必须全小写
// 提示:url 建议直接用前端传过来的原始值(去掉 # 之后的部分)
String plain = "jsapi_ticket=" + jsticket +
"&noncestr=" + nonceStr +
"&timestamp=" + timeStamp +
"&url=" + url;
try {
// 2. 钉钉 JSAPI 签名必须使用 SHA-1
MessageDigest sha1 = MessageDigest.getInstance("SHA-1");
// 3. 计算哈希值
byte[] digest = sha1.digest(plain.getBytes(StandardCharsets.UTF_8));
// 4. JDK 17 优雅写法:将 byte 数组转为 16 进制字符串
return HexFormat.of().formatHex(digest);
} catch (Exception e) {
throw new RuntimeException("计算钉钉签名失败", e);
}
}
public String getUserIdByCode(String code) { public String getUserIdByCode(String code) {
return Try.of(() -> dtService.getOauth2Service().getUserInfo(code).getUserId()) return Try.of(() -> dtService.getOauth2Service().getUserInfo(code).getUserId())
.getOrElse(""); .getOrElse("");

3
src/main/java/com/project/exam/application/ExamRecordApplicationService.java

@ -5,6 +5,7 @@ import com.project.base.domain.result.Result;
import com.project.exam.domain.dto.ExamRecordDTO; import com.project.exam.domain.dto.ExamRecordDTO;
import com.project.exam.domain.dto.ExamRecordPictureDTO; import com.project.exam.domain.dto.ExamRecordPictureDTO;
import com.project.exam.domain.param.ExamRecordParam; import com.project.exam.domain.param.ExamRecordParam;
import jakarta.servlet.http.HttpServletResponse;
import org.springframework.web.multipart.MultipartFile; import org.springframework.web.multipart.MultipartFile;
public interface ExamRecordApplicationService { public interface ExamRecordApplicationService {
@ -18,4 +19,6 @@ public interface ExamRecordApplicationService {
Result<ExamRecordPictureDTO> savePicture(MultipartFile file, Long recordId) throws Exception; Result<ExamRecordPictureDTO> savePicture(MultipartFile file, Long recordId) throws Exception;
Result<PageResult<ExamRecordDTO>> adminSearch(ExamRecordParam param) throws Exception; Result<PageResult<ExamRecordDTO>> adminSearch(ExamRecordParam param) throws Exception;
void export(ExamRecordParam appealParam, HttpServletResponse response) throws Exception;
} }

6
src/main/java/com/project/exam/application/impl/ExamRecordApplicationServiceImpl.java

@ -8,6 +8,7 @@ import com.project.exam.domain.dto.ExamRecordDTO;
import com.project.exam.domain.dto.ExamRecordPictureDTO; import com.project.exam.domain.dto.ExamRecordPictureDTO;
import com.project.exam.domain.param.ExamRecordParam; import com.project.exam.domain.param.ExamRecordParam;
import com.project.exam.domain.service.*; import com.project.exam.domain.service.*;
import jakarta.servlet.http.HttpServletResponse;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import org.springframework.web.multipart.MultipartFile; import org.springframework.web.multipart.MultipartFile;
@ -35,6 +36,11 @@ public class ExamRecordApplicationServiceImpl implements ExamRecordApplicationSe
return adminSearchExamRecordDomainService.adminSearch(param); return adminSearchExamRecordDomainService.adminSearch(param);
} }
@Override
public void export(ExamRecordParam appealParam, HttpServletResponse response) throws Exception {
}
@Override @Override
public Result<ExamRecordDTO> assemblePaper(Long taskId) throws Exception { public Result<ExamRecordDTO> assemblePaper(Long taskId) throws Exception {
return Result.success(assemblePaperDomainService.assemblePaper(taskId , SecurityUtils.getUserId())); return Result.success(assemblePaperDomainService.assemblePaper(taskId , SecurityUtils.getUserId()));

19
src/main/java/com/project/exam/controller/AdminExamRecordController.java

@ -1,8 +1,17 @@
package com.project.exam.controller; package com.project.exam.controller;
import com.github.tingyugetc520.ali.dingtalk.error.DtErrorException;
import com.project.appeal.domain.param.AppealParam;
import com.project.base.domain.result.PageResult;
import com.project.base.domain.result.Result;
import com.project.exam.application.ExamRecordApplicationService; import com.project.exam.application.ExamRecordApplicationService;
import com.project.exam.domain.dto.ExamRecordDTO;
import com.project.exam.domain.param.ExamRecordParam;
import jakarta.servlet.http.HttpServletResponse;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
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.RequestMapping;
import org.springframework.web.bind.annotation.RestController; import org.springframework.web.bind.annotation.RestController;
@ -10,7 +19,17 @@ import org.springframework.web.bind.annotation.RestController;
@RequestMapping("/api/admin/examRecord") @RequestMapping("/api/admin/examRecord")
public class AdminExamRecordController { public class AdminExamRecordController {
@Autowired @Autowired
private ExamRecordApplicationService examRecordApplicationService; private ExamRecordApplicationService examRecordApplicationService;
@GetMapping("/search")
public Result<PageResult<ExamRecordDTO>> adminSearch(ExamRecordParam param) throws Exception{
return examRecordApplicationService.adminSearch(param);
}
@GetMapping("/export")
public void export(ExamRecordParam appealParam, HttpServletResponse response) throws Exception {
}
} }

4
src/main/java/com/project/exam/controller/ExamRecordController.java

@ -19,10 +19,6 @@ public class ExamRecordController {
@Autowired @Autowired
private ExamRecordApplicationService examRecordApplicationService; private ExamRecordApplicationService examRecordApplicationService;
@PostMapping("/adminSearch")
public Result<PageResult<ExamRecordDTO>> adminSearch(ExamRecordParam param) throws Exception{
return examRecordApplicationService.adminSearch(param);
}
@PostMapping("/assemblePaper") @PostMapping("/assemblePaper")
public Result<ExamRecordDTO> assemblePaper(Long taskId) throws Exception{ public Result<ExamRecordDTO> assemblePaper(Long taskId) throws Exception{
return examRecordApplicationService.assemblePaper(taskId); return examRecordApplicationService.assemblePaper(taskId);

4
src/main/java/com/project/exam/domain/dto/ExamRecordDTO.java

@ -17,6 +17,8 @@ import java.util.function.Supplier;
public class ExamRecordDTO extends BaseDTO { public class ExamRecordDTO extends BaseDTO {
private Long id; private Long id;
private Long taskUserId; private Long taskUserId;
private String userName;
private Double score; private Double score;
private Boolean pass = Boolean.FALSE; private Boolean pass = Boolean.FALSE;
@ -38,6 +40,8 @@ public class ExamRecordDTO extends BaseDTO {
private String taskName; private String taskName;
private Integer serialNumber;
private List<ExamRecordPictureDTO> pictureDTOList = new ArrayList<>(); private List<ExamRecordPictureDTO> pictureDTOList = new ArrayList<>();
@Data @Data

26
src/main/java/com/project/exam/domain/dto/ExportExamRecordDTO.java

@ -0,0 +1,26 @@
package com.project.exam.domain.dto;
import com.alibaba.excel.annotation.ExcelProperty;
import com.project.base.domain.dto.BaseDTO;
import lombok.Data;
@Data
public class ExportExamRecordDTO extends BaseDTO {
@ExcelProperty("序号")
private Integer serialNumber;
@ExcelProperty("关联子产品产品线")
private String subLineName;
@ExcelProperty("考试任务名称")
private String taskName;
@ExcelProperty("用户名")
private String userName;
@ExcelProperty("考试得分")
private String score;
@ExcelProperty("考试结果")
private String result;
}

9
src/main/java/com/project/exam/domain/service/AdminExportExamRecordDomainService.java

@ -0,0 +1,9 @@
package com.project.exam.domain.service;
import com.project.exam.domain.param.ExamRecordParam;
import jakarta.servlet.http.HttpServletResponse;
public interface AdminExportExamRecordDomainService {
void export(ExamRecordParam appealParam, HttpServletResponse response) throws Exception;
}

54
src/main/java/com/project/exam/domain/service/handler/ExamResultColorHandler.java

@ -0,0 +1,54 @@
package com.project.exam.domain.service.handler;
import com.alibaba.excel.metadata.Head;
import com.alibaba.excel.metadata.data.WriteCellData;
import com.alibaba.excel.write.handler.CellWriteHandler;
import com.alibaba.excel.write.metadata.holder.WriteSheetHolder;
import com.alibaba.excel.write.metadata.holder.WriteTableHolder;
import org.apache.poi.ss.usermodel.*;
import java.util.List;
public class ExamResultColorHandler implements CellWriteHandler {
private CellStyle redStyle = null;
private static final String COLUMN_EXAM_RESULT = "考试结果";
private static final String VALUE_NOT_PASSED = "未通过";
@Override
public void afterCellDispose(WriteSheetHolder writeSheetHolder, WriteTableHolder writeTableHolder,
List<WriteCellData<?>> cellDataList, Cell cell, Head head,
Integer relativeRowIndex, Boolean isHead) {
// 1. 跳过表头
if (isHead) {
return;
}
// 2. 找到“考试结果”这一列 (根据列名匹配更稳健)
if (head != null && COLUMN_EXAM_RESULT.equals(head.getHeadNameList().get(0))) {
String cellValue = cell.getStringCellValue();
if (VALUE_NOT_PASSED.equals(cellValue)) {
// 3. 优化点:如果样式还没创建过,则创建它
if (redStyle == null) {
Workbook workbook = writeSheetHolder.getSheet().getWorkbook();
// 创建新样式
redStyle = workbook.createCellStyle();
// 克隆当前单元格默认样式(保留边框、对齐等)
redStyle.cloneStyleFrom(cell.getCellStyle());
// 创建字体并设为红色
Font font = workbook.createFont();
font.setColor(IndexedColors.RED.getIndex());
font.setBold(true); // 可选:加粗突出
redStyle.setFont(font);
}
// 4. 直接应用缓存好的样式
cell.setCellStyle(redStyle);
}
}
}
}

22
src/main/java/com/project/exam/domain/service/impl/AdminExportExamRecordDomainServiceImpl.java

@ -0,0 +1,22 @@
package com.project.exam.domain.service.impl;
import com.project.base.domain.result.PageResult;
import com.project.base.domain.result.Result;
import com.project.exam.domain.dto.ExamRecordDTO;
import com.project.exam.domain.param.ExamRecordParam;
import com.project.exam.domain.service.AdminExportExamRecordDomainService;
import com.project.exam.domain.service.AdminSearchExamRecordDomainService;
import jakarta.servlet.http.HttpServletResponse;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
@Service
public class AdminExportExamRecordDomainServiceImpl implements AdminExportExamRecordDomainService {
@Autowired
private AdminSearchExamRecordDomainService adminSearchExamRecordDomainService;
@Override
public void export(ExamRecordParam appealParam, HttpServletResponse response) throws Exception {
Result<PageResult<ExamRecordDTO>> pageResultResult = adminSearchExamRecordDomainService.adminSearch(appealParam);
}
}

9
src/main/java/com/project/exam/domain/service/impl/AdminSearchExamRecordDomainServiceImpl.java

@ -19,6 +19,9 @@ import com.project.exam.domain.service.ExamRecordPictureBaseService;
import com.project.information.domain.entity.ProductLineEntity; import com.project.information.domain.entity.ProductLineEntity;
import com.project.information.domain.service.ProductLineBaseService; import com.project.information.domain.service.ProductLineBaseService;
import com.project.information.utils.MinIoUtils; import com.project.information.utils.MinIoUtils;
import com.project.task.domain.dto.TaskUserDTO;
import com.project.task.domain.entity.TaskUserEntity;
import com.project.task.domain.service.TaskUserBaseService;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
@ -40,6 +43,9 @@ public class AdminSearchExamRecordDomainServiceImpl implements AdminSearchExamRe
@Autowired @Autowired
private MinIoUtils minIoUtils; private MinIoUtils minIoUtils;
@Autowired
private TaskUserBaseService taskUserBaseService;
@Override @Override
public Result<PageResult<ExamRecordDTO>> adminSearch(ExamRecordParam param) throws Exception { public Result<PageResult<ExamRecordDTO>> adminSearch(ExamRecordParam param) throws Exception {
LambdaQueryWrapper<ExamRecordEntity> queryWrapper = new LambdaQueryWrapper<>(); LambdaQueryWrapper<ExamRecordEntity> queryWrapper = new LambdaQueryWrapper<>();
@ -84,6 +90,9 @@ public class AdminSearchExamRecordDomainServiceImpl implements AdminSearchExamRe
dto.setPassHtml(ExamRecordPassTextEnum.Fail.getHtml()); dto.setPassHtml(ExamRecordPassTextEnum.Fail.getHtml());
} }
TaskUserDTO taskUserDTO = taskUserBaseService.getById(dto.getTaskUserId()).toDTO(TaskUserDTO::new);
dto.setUserName(taskUserDTO.getUserName());
return dto; return dto;
} }

1
src/main/resources/application.yml

@ -71,6 +71,7 @@ ding:
appKey: dinggl2ktuhdhoczkg2o appKey: dinggl2ktuhdhoczkg2o
appSecret: nK104mgXPbkCWjX1I-EcYiubjM0FJAYcfqBKPkVcyvrBsLMF9XK1g9Qd_QVOndcK appSecret: nK104mgXPbkCWjX1I-EcYiubjM0FJAYcfqBKPkVcyvrBsLMF9XK1g9Qd_QVOndcK
agentId: 4283077101 agentId: 4283077101
corpId: ding13d71da66ad91ff0f5bf40eda33b7ba0
algo: algo:
clusterUrl: /api/algorithm/v1/cluster clusterUrl: /api/algorithm/v1/cluster
baseUrl: / baseUrl: /
Loading…
Cancel
Save