TranslateService.java 4.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157
  1. package com.njuzr.eaibackend.service;
  2. import com.njuzr.eaibackend.dto.TranslationDTO;
  3. import com.njuzr.eaibackend.exception.MyException;
  4. import com.njuzr.eaibackend.mapper.TranslationMapper;
  5. import com.njuzr.eaibackend.po.Translation;
  6. import com.njuzr.eaibackend.utils.WebClientUtil;
  7. import lombok.AllArgsConstructor;
  8. import lombok.Data;
  9. import lombok.extern.slf4j.Slf4j;
  10. import org.springframework.beans.factory.annotation.Value;
  11. import org.springframework.http.HttpStatus;
  12. import org.springframework.stereotype.Service;
  13. import java.security.MessageDigest;
  14. import java.security.NoSuchAlgorithmException;
  15. import java.util.Date;
  16. import java.util.List;
  17. import java.util.Objects;
  18. import java.util.UUID;
  19. /**
  20. * @author: Leonezhurui
  21. * @Date: 2024/3/21 - 01:15
  22. * @Package: EAI-Backend
  23. */
  24. @Slf4j
  25. @Service
  26. public class TranslateService {
  27. @Value("${youdao.appKey}")
  28. private String appKey;
  29. @Value("${youdao.appSecret}")
  30. private String appSecret;
  31. private final WebClientUtil webClientUtil = new WebClientUtil("http://localhost:5000/api/translate");
  32. private final TranslationMapper translationMapper;
  33. public TranslateService(TranslationMapper translationMapper) {
  34. this.translationMapper = translationMapper;
  35. }
  36. public String translate(Long assignmentId, Long userId, TranslationDTO translationDTO) {
  37. // 1 请求,构造请求条件
  38. // String salt = UUID.randomUUID().toString();
  39. // String curtime = String.valueOf(System.currentTimeMillis() / 1000);
  40. // String sign;
  41. // try {
  42. // sign = calculateSign(appKey, appSecret, translationDTO.getQ(), salt, curtime);
  43. // } catch (NoSuchAlgorithmException e) {
  44. // log.error(e.getMessage());
  45. // throw MyException.create(HttpStatus.INTERNAL_SERVER_ERROR, "不支持SHA-256算法");
  46. // }
  47. // MyRequestObject request = new MyRequestObject(
  48. // translationDTO.getQ(),
  49. // translationDTO.getFrom(),
  50. // translationDTO.getTo(),
  51. // appKey,
  52. // salt,
  53. // sign,
  54. // "v3",
  55. // curtime
  56. // );
  57. MyResponseObject response = webClientUtil.post("", translationDTO, MyResponseObject.class);
  58. if (Objects.equals(response.getCode(), 200)) {
  59. Translation translation = new Translation();
  60. translation.setUserId(userId);
  61. translation.setAssignmentId(assignmentId);
  62. translation.setQueryText(translationDTO.getQ());
  63. translation.setQueryResult(response.data);
  64. translation.setTargetLanguage(translationDTO.getTo());
  65. translation.setQueryTime(new Date());
  66. translationMapper.insert(translation);
  67. } else {
  68. log.error("请求字典出错");
  69. throw MyException.create(HttpStatus.INTERNAL_SERVER_ERROR, "请求字典出错");
  70. }
  71. return response.data;
  72. }
  73. @Data
  74. @AllArgsConstructor
  75. public static class MyRequestObject {
  76. private String q;
  77. private String from;
  78. private String to;
  79. private String appKey;
  80. private String salt;
  81. private String sign;
  82. private String signType;
  83. private String curtime;
  84. }
  85. @Data
  86. public static class MyResponseObject {
  87. private int code;
  88. private String data;
  89. private String msg;
  90. }
  91. /**
  92. * 计算鉴权签名 -
  93. * 计算方式 : sign = sha256(appKey + input(q) + salt + curtime + appSecret)
  94. *
  95. * @param appKey 您的应用ID
  96. * @param appSecret 您的应用密钥
  97. * @param q 请求内容
  98. * @param salt 随机值
  99. * @param curtime 当前时间戳(秒)
  100. * @return 鉴权签名sign
  101. */
  102. public String calculateSign(String appKey, String appSecret, String q, String salt, String curtime)
  103. throws NoSuchAlgorithmException {
  104. String strSrc = appKey + getInput(q) + salt + curtime + appSecret;
  105. return encrypt(strSrc);
  106. }
  107. private String encrypt(String strSrc) throws NoSuchAlgorithmException {
  108. byte[] bt = strSrc.getBytes();
  109. MessageDigest md = MessageDigest.getInstance("SHA-256");
  110. md.update(bt);
  111. byte[] bts = md.digest();
  112. StringBuilder des = new StringBuilder();
  113. for (byte b : bts) {
  114. String tmp = (Integer.toHexString(b & 0xFF));
  115. if (tmp.length() == 1) {
  116. des.append("0");
  117. }
  118. des.append(tmp);
  119. }
  120. return des.toString();
  121. }
  122. private static String getInput(String input) {
  123. if (input == null) {
  124. return null;
  125. }
  126. String result;
  127. int len = input.length();
  128. if (len <= 20) {
  129. result = input;
  130. } else {
  131. String startStr = input.substring(0, 10);
  132. String endStr = input.substring(len - 10, len);
  133. result = startStr + len + endStr;
  134. }
  135. return result;
  136. }
  137. }