diff --git a/im-platform/src/main/java/com/bx/implatform/controller/LoginController.java b/im-platform/src/main/java/com/bx/implatform/controller/LoginController.java index ef45259..0330756 100644 --- a/im-platform/src/main/java/com/bx/implatform/controller/LoginController.java +++ b/im-platform/src/main/java/com/bx/implatform/controller/LoginController.java @@ -1,11 +1,13 @@ package com.bx.implatform.controller; +import cn.hutool.core.util.ObjectUtil; import cn.hutool.json.JSONObject; import com.bx.implatform.dto.LoginDTO; import com.bx.implatform.dto.ModifyPwdDTO; import com.bx.implatform.dto.RegisterDTO; import com.bx.implatform.result.Result; import com.bx.implatform.result.ResultUtils; +import com.bx.implatform.service.IImBaiduConfigurationService; import com.bx.implatform.service.ImAgentService; import com.bx.implatform.service.UserService; import com.bx.implatform.util.BaiduTranslationUtils; @@ -26,6 +28,10 @@ public class LoginController { private final ImAgentService agentService; + private final IImBaiduConfigurationService baiduConfigurationService; + + private final BaiduTranslationUtils baiduTranslationUtils; + @PostMapping("/login") @Operation(summary = "用户登录", description = "用户登录") public Result login(@Valid @RequestBody LoginDTO dto) { @@ -89,10 +95,22 @@ public class LoginController { //翻译目标国家 String country = jsonObject.getStr("country"); String trans = ""; - if(country == null || country.isEmpty()) { - trans = BaiduTranslationUtils.translate(str, "zh"); + + BaiduTranslationUtils translator = baiduTranslationUtils; + + //如果代理有配置,则使用代理的百度配置 + if(ObjectUtil.isNull(baiduConfigurationService.getByToken())) { + if (country == null || country.isEmpty()) { + trans = translator.translate(str, "zh"); + } else { + trans = translator.translate(str, country); + } }else{ - trans = BaiduTranslationUtils.translate(str, country); + if (country == null || country.isEmpty()) { + trans = translator.translateByAgentConfiguration(str, "zh"); + } else { + trans = translator.translateByAgentConfiguration(str, country); + } } return ResultUtils.success(trans,"success"); diff --git a/im-platform/src/main/java/com/bx/implatform/controller/UserController.java b/im-platform/src/main/java/com/bx/implatform/controller/UserController.java index 31fd57c..151967c 100644 --- a/im-platform/src/main/java/com/bx/implatform/controller/UserController.java +++ b/im-platform/src/main/java/com/bx/implatform/controller/UserController.java @@ -217,7 +217,7 @@ public class UserController { if (StrUtil.isNotBlank(currentUserUniqueToken)) { queryWrapper.eq(User::getUniqueToken, currentUserUniqueToken); } else { - queryWrapper.isNull(User::getUniqueToken).or().eq(User::getUniqueToken, ""); + return ResultUtils.error(XSS_PARAM_ERROR); } List availableUsers = userService.list(queryWrapper); diff --git a/im-platform/src/main/java/com/bx/implatform/entity/ImBaiduConfiguration.java b/im-platform/src/main/java/com/bx/implatform/entity/ImBaiduConfiguration.java new file mode 100644 index 0000000..2a6874f --- /dev/null +++ b/im-platform/src/main/java/com/bx/implatform/entity/ImBaiduConfiguration.java @@ -0,0 +1,65 @@ +package com.bx.implatform.entity; + + +import com.baomidou.mybatisplus.annotation.*; +import lombok.Data; +import java.util.Date; + + +/** + * 百度翻译配置对象 im_baidu_configuration + * + * @author Blue + * @date 2026-04-21 + */ +@Data +@TableName("im_baidu_configuration") +public class ImBaiduConfiguration { + /** + * 主键ID + */ + @TableId(value = "id") + private Long id; + + /** + * 唯一token + */ + private String uniqueToken; + + /** + * appId + */ + private String appId; + + /** + * SECRET_KEY + */ + private String secretKey; + + /** + * 备注 + */ + private String remark; + + /** + * 创建时间 + */ + private Date createdTime; + + /** + * 更新时间 + */ + private Date updatedTime; + + /** + * 创建者ID + */ + private Long creatorId; + + /** + * 更新者ID + */ + private Long updaterId; + + +} diff --git a/im-platform/src/main/java/com/bx/implatform/mapper/ImBaiduConfigurationMapper.java b/im-platform/src/main/java/com/bx/implatform/mapper/ImBaiduConfigurationMapper.java new file mode 100644 index 0000000..d8a2d74 --- /dev/null +++ b/im-platform/src/main/java/com/bx/implatform/mapper/ImBaiduConfigurationMapper.java @@ -0,0 +1,7 @@ +package com.bx.implatform.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.bx.implatform.entity.ImBaiduConfiguration; + +public interface ImBaiduConfigurationMapper extends BaseMapper { +} diff --git a/im-platform/src/main/java/com/bx/implatform/service/IImBaiduConfigurationService.java b/im-platform/src/main/java/com/bx/implatform/service/IImBaiduConfigurationService.java new file mode 100644 index 0000000..bafd68f --- /dev/null +++ b/im-platform/src/main/java/com/bx/implatform/service/IImBaiduConfigurationService.java @@ -0,0 +1,11 @@ +package com.bx.implatform.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.bx.implatform.entity.ImBaiduConfiguration; + + +public interface IImBaiduConfigurationService extends IService { + + ImBaiduConfiguration getByToken(); + +} diff --git a/im-platform/src/main/java/com/bx/implatform/service/impl/ImBaiduConfigurationServiceImpl.java b/im-platform/src/main/java/com/bx/implatform/service/impl/ImBaiduConfigurationServiceImpl.java new file mode 100644 index 0000000..a89bbf6 --- /dev/null +++ b/im-platform/src/main/java/com/bx/implatform/service/impl/ImBaiduConfigurationServiceImpl.java @@ -0,0 +1,52 @@ +package com.bx.implatform.service.impl; + +import cn.hutool.core.util.ObjectUtil; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.bx.implatform.entity.ImBaiduConfiguration; +import com.bx.implatform.entity.User; +import com.bx.implatform.mapper.ImBaiduConfigurationMapper; +import com.bx.implatform.mapper.UserMapper; +import com.bx.implatform.service.IImBaiduConfigurationService; +import com.bx.implatform.session.SessionContext; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Service; + +import java.util.List; + +@Slf4j +@Service +@RequiredArgsConstructor +public class ImBaiduConfigurationServiceImpl extends ServiceImpl implements IImBaiduConfigurationService { + + private final UserMapper userMapper; + + private final ImBaiduConfigurationMapper baiduConfigurationMapper; + + @Override + public ImBaiduConfiguration getByToken() { + Long userId = SessionContext.getSession().getUserId(); + if(userId == null){ + return null; + } + + User user = userMapper.selectById(userId); + if(user == null || ObjectUtil.isNull(user)){ + return null; + } + + + String token = user.getUniqueToken(); + + LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); + queryWrapper.eq(ImBaiduConfiguration::getUniqueToken, token); + List list = baiduConfigurationMapper.selectList(queryWrapper); + + if(list == null || list.isEmpty()){ + return null; + } + + return list.get(0); + } +} diff --git a/im-platform/src/main/java/com/bx/implatform/service/impl/UserServiceImpl.java b/im-platform/src/main/java/com/bx/implatform/service/impl/UserServiceImpl.java index 4be77a7..4686ca8 100644 --- a/im-platform/src/main/java/com/bx/implatform/service/impl/UserServiceImpl.java +++ b/im-platform/src/main/java/com/bx/implatform/service/impl/UserServiceImpl.java @@ -655,9 +655,16 @@ public class UserServiceImpl extends ServiceImpl implements Us @Override public List getEnableChangeCustomerList(Long userId) { + User user = this.getById(userId); + + if(user == null || ObjectUtil.isNull(user)){ + return new ArrayList<>(); + } + LambdaQueryWrapper queryWrapper = Wrappers.lambdaQuery(); queryWrapper.ne(User::getId, userId); queryWrapper.eq(User::getIsCustomer, 2); + queryWrapper.eq(User::getUniqueToken, user.getUniqueToken()); return this.list(queryWrapper); } diff --git a/im-platform/src/main/java/com/bx/implatform/util/BaiduTranslationUtils.java b/im-platform/src/main/java/com/bx/implatform/util/BaiduTranslationUtils.java index bf5b222..1b26caf 100644 --- a/im-platform/src/main/java/com/bx/implatform/util/BaiduTranslationUtils.java +++ b/im-platform/src/main/java/com/bx/implatform/util/BaiduTranslationUtils.java @@ -6,7 +6,13 @@ import cn.hutool.http.HttpRequest; import cn.hutool.http.HttpResponse; import cn.hutool.json.JSONObject; import cn.hutool.json.JSONUtil; +import com.bx.implatform.entity.ImBaiduConfiguration; +import com.bx.implatform.service.IImBaiduConfigurationService; +import com.bx.implatform.service.ImAgentService; +import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; import java.nio.charset.StandardCharsets; import java.util.List; @@ -15,6 +21,8 @@ import java.util.List; * 百度翻译工具类 */ @Slf4j +@Component +@RequiredArgsConstructor public class BaiduTranslationUtils { /** @@ -32,6 +40,8 @@ public class BaiduTranslationUtils { */ private static final String SECRET_KEY = "bGdLDbZgM3WMOL09_1qI"; + private final IImBaiduConfigurationService baiduConfigurationService; + /** * 翻译文本 * @@ -40,7 +50,7 @@ public class BaiduTranslationUtils { * @param to 目标语言 * @return 翻译结果 */ - public static String translate(String query, String from, String to) { + public String translate(String query, String from, String to) { try { // 生成随机数 String salt = RandomUtil.randomNumbers(10); @@ -91,7 +101,75 @@ public class BaiduTranslationUtils { * @param to 目标语言 * @return 翻译结果 */ - public static String translate(String query, String to) { + public String translate(String query, String to) { return translate(query, "auto", to); } + + + /** + * 翻译文本 + * + * @param query 待翻译文本 + * @param from 源语言,可设置为"auto"自动检测 + * @param to 目标语言 + * @return 翻译结果 + */ + public String translateByAgentConfiguration(String query, String from, String to) { + try { + + ImBaiduConfiguration configuration = baiduConfigurationService.getByToken(); + + // 生成随机数 + String salt = RandomUtil.randomNumbers(10); + + // 生成签名:appid+q+salt+密钥的MD5值 + String signStr = configuration.getAppId() + query + salt + configuration.getSecretKey(); + String sign = DigestUtil.md5Hex(signStr); + + String url = "https://fanyi-api.baidu.com/api/trans/vip/translate"; + // 发送请求 + HttpResponse response = HttpRequest.post(url) + .form("q", query) + .form("from", from) + .form("to", to) + .form("appid", configuration.getAppId()) + .form("salt", salt) + .form("sign", sign) + .execute(); + + // 解析响应 + String body = response.body(); + JSONObject result = JSONUtil.parseObj(body); + + // 检查是否有错误 + if (result.containsKey("error_code")) { + log.error("百度翻译失败,错误码:{},错误信息:{}", result.getStr("error_code"), result.getStr("error_msg")); + return result.getStr("error_msg") == null ? "system error" : "system error:" + result.getStr("error_msg"); + } + + // 获取翻译结果 + List transResults = result.getBeanList("trans_result", JSONObject.class); + if (transResults == null || transResults.isEmpty()) { + log.error("百度翻译结果为空"); + return "result empty"; + } + + // 返回第一条翻译结果 + return transResults.get(0).getStr("dst"); + } catch (Exception e) { + log.error("百度翻译异常", e); + return "translation unknown error"; + } + } + + /** + * 翻译文本(自动检测源语言) + * + * @param query 待翻译文本 + * @param to 目标语言 + * @return 翻译结果 + */ + public String translateByAgentConfiguration(String query, String to) { + return translateByAgentConfiguration(query, "auto", to); + } } diff --git a/im-platform/src/main/resources/application-dev.yml b/im-platform/src/main/resources/application-dev.yml index 4383cd9..2de2b09 100644 --- a/im-platform/src/main/resources/application-dev.yml +++ b/im-platform/src/main/resources/application-dev.yml @@ -37,13 +37,12 @@ webrtc: # redis: # host: localhost # port: 6379 -# password: PmEpfRjpBnTN6CgW # #minio: # endpoint: http://127.0.0.1:9001 #内网地址 -# domain: http://8.166.112.125:3478:9001 #外网访问地址 +# domain: http://ksuser.pyxxkj.com #外网访问地址 # accessKey: admin -# secretKey: 3fBSt6AkgFuD77D6 +# secretKey: 3fBSt6AkgFuD77D6999 # bucketName: box-im # imagePath: image # filePath: file