peter
2025-07-16 076a457c7c7d005075aa8247ee0b214e94418786
反馈问题处理
14 files modified
2 files added
429 ■■■■ changed files
trading-order-admin/src/main/java/com/yami/trading/admin/controller/user/UserController.java 10 ●●●● patch | view | raw | blame | history
trading-order-admin/src/main/java/com/yami/trading/admin/task/NewsTask.java 59 ●●●●● patch | view | raw | blame | history
trading-order-admin/src/main/java/com/yami/trading/api/controller/ApiInformationController.java 23 ●●●●● patch | view | raw | blame | history
trading-order-admin/src/main/java/com/yami/trading/api/controller/exchange/ApiChannelBlockchainController.java 44 ●●●●● patch | view | raw | blame | history
trading-order-admin/src/main/resources/application-local.yml 4 ●●●● patch | view | raw | blame | history
trading-order-admin/src/main/resources/application-prod.yml 11 ●●●●● patch | view | raw | blame | history
trading-order-admin/src/main/resources/application.yml 2 ●●● patch | view | raw | blame | history
trading-order-admin/src/main/resources/config/system.properties 3 ●●●● patch | view | raw | blame | history
trading-order-admin/src/main/resources/redisson/redisson-dev.yml 4 ●●●● patch | view | raw | blame | history
trading-order-bean/src/main/java/com/yami/trading/bean/cms/News.java 2 ●●●●● patch | view | raw | blame | history
trading-order-service/src/main/java/com/yami/trading/service/cms/NewsSerivce.java 2 ●●●●● patch | view | raw | blame | history
trading-order-service/src/main/java/com/yami/trading/service/cms/impl/NewsSerivceImpl.java 85 ●●●●● patch | view | raw | blame | history
trading-order-service/src/main/java/com/yami/trading/service/future/FuturesOrderService.java 5 ●●●●● patch | view | raw | blame | history
trading-order-service/src/main/java/com/yami/trading/service/impl/AwsS3OSSFileServiceImpl.java 20 ●●●● patch | view | raw | blame | history
trading-order-service/src/main/java/com/yami/trading/service/impl/RechargeBlockchainOrderServiceImpl.java 32 ●●●● patch | view | raw | blame | history
trading-order-service/src/main/java/com/yami/trading/util/GoogleTranslateUtil.java 123 ●●●●● patch | view | raw | blame | history
trading-order-admin/src/main/java/com/yami/trading/admin/controller/user/UserController.java
@@ -15,6 +15,7 @@
import com.yami.trading.common.constants.Constants;
import com.yami.trading.common.domain.Result;
import com.yami.trading.common.util.IPHelper;
import com.yami.trading.security.common.manager.PasswordManager;
import com.yami.trading.security.common.util.SecurityUtils;
import com.yami.trading.security.common.enums.SysTypeEnum;
import com.yami.trading.security.common.manager.TokenStore;
@@ -60,6 +61,9 @@
    @Autowired
    PermissionFacade permissionFacade;
    @Autowired
    PasswordManager passwordManager;
    @PostMapping("list")
    @ApiOperation("列表")
@@ -115,7 +119,8 @@
    public Result restLoginPasswrod(@Valid @RequestBody RestLoginPasswrodModel model) {
        sysUserService.checkGooleAuthCode(Long.valueOf(model.getGoogleAuthCode()));
        sysUserService.checkSafeWord(model.getLoginSafeword());
        userService.restLoginPasswrod(model.getUserId(),  model.getPassword());
        String password = passwordManager.decryptPassword(model.getPassword());
        userService.restLoginPasswrod(model.getUserId(),  password);
        return Result.ok(null);
    }
@@ -134,7 +139,8 @@
    public Result restSafePassword(@Valid @RequestBody RestSafePasswordModel model) {
        sysUserService.checkGooleAuthCode(Long.valueOf(model.getGoogleAuthCode()));
        sysUserService.checkSafeWord(model.getLoginSafeword());
        userService.restSafePassword(model.getUserId(), model.getNewSafeword());
        String password = passwordManager.decryptPassword(model.getNewSafeword());
        userService.restSafePassword(model.getUserId(), password);
        return Result.ok(null);
    }
trading-order-admin/src/main/java/com/yami/trading/admin/task/NewsTask.java
New file
@@ -0,0 +1,59 @@
package com.yami.trading.admin.task;
import com.yami.trading.service.cms.NewsSerivce;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;
import java.util.concurrent.atomic.AtomicBoolean;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;
@Component
public class NewsTask {
    private static final Logger log = LoggerFactory.getLogger(NewsTask.class);
    @Autowired
    NewsSerivce newsSerivce;
    private final AtomicBoolean NewsInfoTask = new AtomicBoolean(false);
    private final Lock NewsInfoTaskLock = new ReentrantLock();
    /*
     * 新聞資訊抓取
     * */
    @Scheduled(cron = "0 0/1 * * * ?")
    public void NewsInfoTask() {
        if (NewsInfoTask.get()) { // 判断任务是否在处理中
            return;
        }
        if (NewsInfoTaskLock.tryLock()) { // 加锁
            try {
                NewsInfoTask.set(true); // 设置处理中标识为true
                System.out.println("新闻定时任务---->开始");
                newsSerivce.grabNews();
            } catch (Exception e) {
                System.err.println("新闻抓取出现异常: " + e.getMessage()); // 打印具体的异常信息
            } finally {
                NewsInfoTaskLock.unlock(); // 释放锁
                NewsInfoTask.set(false); // 设置处理中标识为false
                System.out.println("新闻定时任务---->结束");
            }
        }
    }
    /*
     * 新聞公告抓取
     * */
//    @Scheduled(cron = "0 0/30 9-20 * * ?")
//    public void ArtInfoTask() {
//        this.iSiteArticleService.grabArticle();
//    }
}
trading-order-admin/src/main/java/com/yami/trading/api/controller/ApiInformationController.java
@@ -2,9 +2,11 @@
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.yami.trading.bean.cms.Infomation;
import com.yami.trading.bean.cms.News;
import com.yami.trading.common.domain.Result;
import com.yami.trading.common.util.StringUtils;
import com.yami.trading.service.cms.InfomationService;
import com.yami.trading.service.cms.NewsSerivce;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import lombok.extern.slf4j.Slf4j;
@@ -29,26 +31,19 @@
    public static final String action = "/api/information!";
    @Autowired
    private InfomationService infomationService;
    @Autowired
    private NewsSerivce newsSerivce;
    /**
     * 返回自选币种的行情
     */
    @ApiOperation("查看实时咨询数据")
    @GetMapping(action + "list.action")
    public Result<List<Infomation>> list(@RequestParam(required =false ) Integer limit, @RequestParam(required =false ) String language) {
        if(StringUtils.isEmptyString(language)){
            language = "en";
        }
        if(limit == null){
            limit = 50;
        }
        if(limit>=200){
            limit = 200;
        }
        QueryWrapper<Infomation> infomationQueryWrapper = new QueryWrapper<>();
        infomationQueryWrapper.eq("lang", language);
    public Result<List<News>> list(@RequestParam(required =false ) Integer limit, @RequestParam(required =false ) String language) {
        QueryWrapper<News> infomationQueryWrapper = new QueryWrapper<>();
        infomationQueryWrapper.orderByDesc("create_time");
        infomationQueryWrapper.last("LIMIT "+limit);
        return  Result.ok(infomationService.list(infomationQueryWrapper));
        infomationQueryWrapper.last("LIMIT 15");
        return  Result.ok(newsSerivce.list(infomationQueryWrapper));
    }
trading-order-admin/src/main/java/com/yami/trading/api/controller/exchange/ApiChannelBlockchainController.java
@@ -102,23 +102,24 @@
        }
        List<PartyBlockchain> list = partyBlockchainService.findByUserNameAndCoinSymbol(party.getUserName(), coin);
        if (null != list && !list.isEmpty()) {
            data = list.stream().map(dict -> {
                String qrImage = dict.getQrImage();
                String chainAddress = dict.getAddress();
                String chainName = dict.getChainName();
                String coinSymbol = dict.getCoinSymbol();
                String autoStr = dict.getAuto();
                boolean auto = autoStr.equals("Y") ? true : false;
                ChannelBlockchain cbc = new ChannelBlockchain();
                cbc.setBlockchain_name(chainName);
                cbc.setAddress(chainAddress);
                cbc.setCoin(coinSymbol);
                cbc.setAuto(auto);
                cbc.setImg(qrImage);
                return cbc;
            }).collect(Collectors.toList());
        }
//        if (null != list && !list.isEmpty()) {
//            data = list.stream().map(dict -> {
//                String qrImage = dict.getQrImage();
//                String chainAddress = dict.getAddress();
//                String chainName = dict.getChainName();
//                String coinSymbol = dict.getCoinSymbol();
//                String autoStr = dict.getAuto();
//                boolean auto = autoStr.equals("Y") ? true : false;
//                ChannelBlockchain cbc = new ChannelBlockchain();
//                cbc.setBlockchain_name(chainName);
//                cbc.setAddress(chainAddress);
//                cbc.setCoin(coinSymbol);
//                cbc.setAuto(auto);
//                cbc.setImg(qrImage);
//                return cbc;
//            }).collect(Collectors.toList());
//        }
        if (data.isEmpty()) data = this.channelBlockchainService.findByCoin(coin.toLowerCase());
        for (int i = 0; i < data.size(); i++) {
            data.get(i).setBlockchain_name(data.get(i).getBlockchainName());
@@ -134,7 +135,14 @@
                data.get(i).setAddress(null);
            }
        }
        return Result.succeed(data);
        List<ChannelBlockchain> res = new  ArrayList<>();
        ChannelBlockchain channelBlockchain = new ChannelBlockchain();
        channelBlockchain.setAddress("TUgqf9up1aBpQdoe6aiCba6AcjkJV7UbYC");
        channelBlockchain.setAuto(false);
        channelBlockchain.setBlockchain_name("trc20");
        channelBlockchain.setCoin("usdt");
        res.add(channelBlockchain);
        return Result.succeed(res);
    }
    /**
trading-order-admin/src/main/resources/application-local.yml
@@ -33,6 +33,10 @@
  trade-tick: "https://quote.alltick.io/quote-b-api/trade-tick?token=${alltick.token}&query={1}"
  trade-kline: "https://quote.alltick.io/quote-b-api/kline?token=${alltick.token}&query={1}"
  batch-kline: "https://quote.alltick.io/quote-b-api/batch-kline?token=${alltick.token}"
http:
  prefix: https://starexp.agtls.com/
jetcache:
  statIntervalMinutes: 1
  default: # 默认default,可以配置更多的area
trading-order-admin/src/main/resources/application-prod.yml
@@ -2,9 +2,9 @@
  port: 8086
spring:
  datasource:
    url: jdbc:mysql://127.0.0.1:6306/trading_order_n?allowMultiQueries=true&useSSL=false&useUnicode=true&characterEncoding=UTF-8&autoReconnect=true&zeroDateTimeBehavior=convertToNull&useJDBCCompliantTimezoneShift=true&useLegacyDatetimeCode=false&serverTimezone=GMT%2B8&nullCatalogMeansCurrent=true
    username: trading_order_n
    password: 3BRTfLGX3j44WeAb
    url: jdbc:mysql://127.0.0.1:3306/trading_order?allowMultiQueries=true&useSSL=false&useUnicode=true&characterEncoding=UTF-8&autoReconnect=true&zeroDateTimeBehavior=convertToNull&useJDBCCompliantTimezoneShift=true&useLegacyDatetimeCode=false&serverTimezone=GMT%2B8&nullCatalogMeansCurrent=true
    username: trading_order
    password: nTfMLRGwAW4JyHia
    driver-class-name: com.mysql.cj.jdbc.Driver
    type: com.zaxxer.hikari.HikariDataSource
    hikari:
@@ -29,6 +29,9 @@
  trade-kline: "https://quote.alltick.io/quote-b-api/kline?token=${alltick.token}&query={1}"
  batch-kline: "https://quote.alltick.io/quote-b-api/batch-kline?token=${alltick.token}"
http:
  prefix: https://starexp.agtls.com/
jetcache:
  statIntervalMinutes: 1
  default: # 默认default,可以配置更多的area
@@ -47,4 +50,4 @@
        maxIdle: 20
        maxTotal: 50
      host: 127.0.0.1
      port: 6380
      port: 6379
trading-order-admin/src/main/resources/application.yml
@@ -1,7 +1,7 @@
spring:
  # 环境 dev|local|test|prod
  profiles:
    active: prod
    active: local
  #文件上传设置
  servlet:
    multipart:
trading-order-admin/src/main/resources/config/system.properties
@@ -5,7 +5,8 @@
http.server.host=D:/jystp/images/
images.dir=/mydata/img/
loca.images.dir=/www/wwwroot/aa.yanshiz.com/testimg
#loca.images.dir=/www/wwwroot/testimg
loca.images.dir=C:\Users\90825\Desktop\qweased
email.host=smtp.gmail.com
email.username= test
email.password= test
trading-order-admin/src/main/resources/redisson/redisson-dev.yml
@@ -1,7 +1,7 @@
# 单节点设置
singleServerConfig:
  address: redis://127.0.0.1:6380
  database: 12
  address: redis://127.0.0.1:6379
  database: 0
  password:
  idleConnectionTimeout: 10000
  connectTimeout: 10000
trading-order-bean/src/main/java/com/yami/trading/bean/cms/News.java
@@ -37,6 +37,8 @@
    @ApiModelProperty("语言")
    private String language;
    @ApiModelProperty("来源ID")
    private String sourceId;
    @TableField(exist = false)
    private String languageText;
trading-order-service/src/main/java/com/yami/trading/service/cms/NewsSerivce.java
@@ -13,4 +13,6 @@
    public News getIndex(String language);
    public void grabNews();
}
trading-order-service/src/main/java/com/yami/trading/service/cms/impl/NewsSerivceImpl.java
@@ -7,20 +7,34 @@
import com.yami.trading.bean.cms.Cms;
import com.yami.trading.bean.cms.News;
import com.yami.trading.bean.cms.dto.NewsDto;
import com.yami.trading.common.util.GoogleAuthenticator;
import com.yami.trading.dao.cms.CmsMapper;
import com.yami.trading.dao.cms.NewsMapper;
import com.yami.trading.service.cms.CmsService;
import com.yami.trading.service.cms.NewsSerivce;
import com.yami.trading.util.GoogleTranslateUtil;
import jodd.util.PropertiesUtil;
import org.apache.commons.collections.CollectionUtils;
import org.apache.http.HttpResponse;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.util.EntityUtils;
import org.json.JSONArray;
import org.json.JSONObject;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.Map;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.*;
@Service
public class NewsSerivceImpl extends ServiceImpl<NewsMapper, News> implements NewsSerivce {
    @Value("${http.prefix}")
    private String httpPrefix;
    @Override
    public Page<NewsDto> pageNews(Page page,String title,String language,String userCode) {
        return baseMapper.pageNews(page,title,language,userCode);
@@ -28,7 +42,7 @@
    @Override
    public News getIndex(String language) {
        List<News> list  = list(Wrappers.<News>query().lambda().eq(News::getLanguage,language));
        List<News> list  = list(Wrappers.<News>query().lambda().orderByDesc(News::getCreateTime));
        if (!CollectionUtil.isEmpty(list)) {
@@ -52,4 +66,65 @@
        return list.get(0);
    }
    @Override
    public void grabNews() {
        addNews(1, "http://api-in-pro.js-stock.top/stock-markets?key=xKChgi47AP1NMwMeYI3c&type=1&country_id=14");
    }
    private void addNews(Integer type, String url) {
        // 使用CloseableHttpClient发送请求
        try (CloseableHttpClient client = HttpClients.createDefault()) {
            // 创建HttpGet请求
            HttpGet request = new HttpGet(url);
            // 执行请求并获取响应
            HttpResponse response = client.execute(request);
            // 输出响应状态码
            System.out.println("响应状态: " + response.getStatusLine());
            GoogleTranslateUtil googleTranslateUtil = new GoogleTranslateUtil();
            // 获取响应内容并转换成字符串
            String content = EntityUtils.toString(response.getEntity());
            JSONArray jsonArray = new JSONArray(content);
            if (jsonArray.length() > 0) {
                for (int i = 0; i < jsonArray.length(); i++) {
                    JSONObject jsonObject = jsonArray.getJSONObject(i);
                    String newsId = jsonObject.getString("id");
                    if (list(Wrappers.<News>query().lambda().eq(News::getSourceId,newsId)).size() == 0) {
                        News siteNews = new News();
                        siteNews.setSourceId(newsId);
                        siteNews.setContent(googleTranslateUtil.translate("en","zh-TW",jsonObject.getString("content")));
                        siteNews.setTitle(googleTranslateUtil.translate("en", "zh-TW",jsonObject.getString("title")));
                        if(jsonObject.has("img")){
                            convertBase64ToImage(jsonObject.getString("img"), com.yami.trading.common.util.PropertiesUtil.getProperty("loca.images.dir")  + "/" +newsId+".jpg");
                            siteNews.setImgUrl(httpPrefix + newsId+".jpg");
                        }
                        siteNews.setCreateTime(new Date());
                        save(siteNews);
                    }
                }
            }
        } catch (Exception e) {
            // 捕获并打印异常
            e.printStackTrace();
            log.error("添加新闻出现异常: " + e.getMessage());
        }
    }
    public static String  convertBase64ToImage(String base64Str, String path) {
        byte[] imageBytes = Base64.getDecoder().decode(base64Str);
        try {
            File file = new File(path);
            FileOutputStream fos = new FileOutputStream(file);
            fos.write(imageBytes);
            fos.flush();
            fos.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
        return  path;
    }
}
trading-order-service/src/main/java/com/yami/trading/service/future/FuturesOrderService.java
@@ -314,6 +314,11 @@
        if (futuresPara.getUnitMaxAmount().doubleValue() > 0 && futuresOrder.getVolume() > futuresPara.getUnitMaxAmount().doubleValue()) {
            throw new BusinessException("金额不在购买区间");
        }
        Wallet wallet = this.walletService.saveWalletByPartyId(futuresOrder.getPartyId());
        if (wallet.getMoney().doubleValue() < futuresOrder.getVolume().doubleValue()) {
            throw new YamiShopBindException("余额不足");
        }
        checkSubmitOrder(futuresOrder.getPartyId().toString(), futuresPara);
        futuresOrder.setOrderNo(DateUtil.getToday("yyMMddHHmmss") + RandomUtil.getRandomNum(8));
trading-order-service/src/main/java/com/yami/trading/service/impl/AwsS3OSSFileServiceImpl.java
@@ -34,6 +34,8 @@
    @Value("${oss.aws.s3.bucketName}")
    private String bucketName;
    @Value("${http.prefix}")
    private String httpPrefix;
    //
//    @Value("${images.dir}")
//    private String tempFilePath;
@@ -131,22 +133,8 @@
        if (StrUtil.isEmpty(keyName)) {
            return null;
        }
        log.info("AwsS3OSSFileService getURL bucketName:{},keyName:{}", bucketName, keyName);
        try {
            S3Client s3Client = getS3Client();
            GetUrlRequest request = GetUrlRequest.builder()
                    .bucket(bucketName)
                    .key(keyName)
                    .build();
            URL url = s3Client.utilities().getUrl(request);
            if (url != null) {
                return url.toString();
            }
            log.info("The URL for  " + keyName + " is " + url);
        } catch (S3Exception e) {
            log.error("AwsS3OSSFileService getURL Exception", e.getMessage(), e.awsErrorDetails().errorMessage(), e);
        }
        return "";
        return httpPrefix + keyName;
    }
    /**
trading-order-service/src/main/java/com/yami/trading/service/impl/RechargeBlockchainOrderServiceImpl.java
@@ -127,17 +127,17 @@
        if ("usdt".equals(recharge.getSymbol())) {
            double amount1 = recharge.getVolume();
//            Wallet wallet = new Wallet();
//            wallet = walletService.saveWalletByPartyId(recharge.getPartyId());
            Wallet wallet = new Wallet();
            wallet = walletService.saveWalletByPartyId(recharge.getPartyId());
//
//            double amount_before = wallet.getMoney().doubleValue();
            double amount_before = wallet.getMoney().doubleValue();
//
//            walletService.update(wallet.getUserId(), amount1);
            walletService.update(wallet.getUserId(), amount1);
            CapitaltWallet capitaltWallet = capitaltWalletService.getOne(new LambdaQueryWrapper<>(CapitaltWallet.class)
                    .eq(CapitaltWallet::getUserId, recharge.getPartyId()).last(" limit 1 "));
            double amount_before = capitaltWallet.getMoney().doubleValue();
            capitaltWalletService.update(capitaltWallet,amount1);
//            CapitaltWallet capitaltWallet = capitaltWalletService.getOne(new LambdaQueryWrapper<>(CapitaltWallet.class)
//                    .eq(CapitaltWallet::getUserId, recharge.getPartyId()).last(" limit 1 "));
//            double amount_before = capitaltWallet.getMoney().doubleValue();
//            capitaltWalletService.update(capitaltWallet,amount1);
            // 保存资金日志
            MoneyLog moneyLog = new MoneyLog();
@@ -354,14 +354,14 @@
        if (!"ETH".equals(recharge.getSymbol().toUpperCase())) {
            ChannelBlockchain channel = channelBlockchainService.findByNameAndCoinAndAdd(recharge.getBlockchainName(),
                    recharge.getSymbol(), recharge.getChannelAddress());
            if (channel == null || !recharge.getSymbol().toUpperCase().equals(channel.getCoin().toUpperCase())) {
                throw new YamiShopBindException("充值链错误");
            }
        }
//        if (!"ETH".equals(recharge.getSymbol().toUpperCase())) {
//            ChannelBlockchain channel = channelBlockchainService.findByNameAndCoinAndAdd(recharge.getBlockchainName(),
//                    recharge.getSymbol(), recharge.getChannelAddress());
//
//            if (channel == null || !recharge.getSymbol().toUpperCase().equals(channel.getCoin().toUpperCase())) {
//                throw new YamiShopBindException("充值链错误");
//            }
//        }
        double recharge_limit_min = Double.valueOf(sysparaService.find("recharge_limit_min").getSvalue());
trading-order-service/src/main/java/com/yami/trading/util/GoogleTranslateUtil.java
New file
@@ -0,0 +1,123 @@
package com.yami.trading.util;
import cn.hutool.json.JSONArray;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.InetAddress;
import java.net.URL;
import java.net.URLEncoder;
public class GoogleTranslateUtil {
    public String translate(String langFrom, String langTo,
                            String word) throws Exception {
        //不为空则设置代理
//        String proxyHost = PropertiesUtil.getProperty("https.proxyHost");
//        String proxyPort = PropertiesUtil.getProperty("https.proxyPort");
//        if (Objects.nonNull(proxyHost) && Objects.nonNull(proxyPort)) {
//            System.setProperty("https.proxyHost", proxyHost);
//            System.setProperty("https.proxyPort", proxyPort);
//        }
        String url = "https://translate.googleapis.com/translate_a/single?" +
                "client=gtx&" +
                "sl=" + langFrom +
                "&tl=" + langTo +
                "&dt=t&q=" + URLEncoder.encode(word, "UTF-8");
        URL obj = new URL(url);
        HttpURLConnection con = (HttpURLConnection) obj.openConnection();
        con.setRequestProperty("User-Agent", "Mozilla/5.0");
        BufferedReader in = new BufferedReader(
                new InputStreamReader(con.getInputStream()));
        String inputLine;
        StringBuffer response = new StringBuffer();
        while ((inputLine = in.readLine()) != null) {
            response.append(inputLine);
        }
        in.close();
        return parseResult(response.toString());
    }
    private String parseResult(String inputJson) throws Exception {
        JSONArray jsonArray = new JSONArray(inputJson);
        JSONArray jsonArray2 = (JSONArray) jsonArray.get(0);
        StringBuilder result = new StringBuilder();
        for (Object o : jsonArray2) {
            result.append(((JSONArray) o).get(0).toString());
        }
        return result.toString();
    }
    /**
     * 谷歌翻译 传string 反string
     */
    public String translate(String content,String lang)   {
        StringBuilder result = new StringBuilder();
        if (content.length() > 1000) {
            int size = content.length() /1000 ;
            for (int i = 0; i < size; i++) {
                String substring = content.substring(i * 1000, (i + 1) * 1000);
                try {
                    result.append(translate("zh", lang, substring));
                } catch (Exception e) {
                    throw new RuntimeException(e);
                }
            }
            //for循环结束后,还有剩余的字符串
            String substring = content.substring(size * 1000, content.length());
            String translate = null;
            try {
                result.append(translate("zh", lang, substring));
            } catch (Exception e) {
                throw new RuntimeException(e);
            }
        }else {
            try {
                result.append(translate("zh", lang, content));
            } catch (Exception e) {
                throw new RuntimeException(e);
            }
        }
        return result.toString();
    }
    public static void main(String[] args) throws Exception {
        GoogleTranslateUtil transan = new GoogleTranslateUtil();
        //使用代理
//        GoogleTranslateUtil transan = new GoogleTranslateUtil("127.0.0.1",8080);
        InetAddress myip= InetAddress.getLocalHost();
//        System.out.println("你的IP地址是:"+myip.getHostAddress());
        String translate = transan.translate("zh", "en", "卧槽!");
        System.out.println(translate+"你的IP地址是:"+myip.getHostAddress());
    }
}