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()); } }