mirror of
				https://github.com/TeaOSLab/EdgeAPI.git
				synced 2025-11-04 16:00:24 +08:00 
			
		
		
		
	初步实现安装界面
This commit is contained in:
		@@ -1,11 +1,66 @@
 | 
				
			|||||||
#!/usr/bin/env bash
 | 
					#!/usr/bin/env bash
 | 
				
			||||||
 | 
					
 | 
				
			||||||
ROOT=`dirname $0`
 | 
					function build() {
 | 
				
			||||||
 | 
						ROOT=$(dirname $0)
 | 
				
			||||||
 | 
						NAME="edge-api"
 | 
				
			||||||
 | 
						DIST="../dist/${NAME}"
 | 
				
			||||||
 | 
						OS=${1}
 | 
				
			||||||
 | 
						ARCH=${2}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
# building installer
 | 
						if [ -z $OS ]; then
 | 
				
			||||||
architects=( "amd64" "386" )
 | 
							echo "usage: build.sh OS ARCH"
 | 
				
			||||||
for arch in "${architects[@]}"
 | 
							exit
 | 
				
			||||||
do
 | 
						fi
 | 
				
			||||||
	# TODO support arm, mips ...
 | 
						if [ -z $ARCH ]; then
 | 
				
			||||||
	env GOOS=linux GOARCH=${arch} go build --ldflags="-s -w" -o $ROOT/installers/installer-helper-linux-${arch} $ROOT/../cmd/installer-helper/main.go
 | 
							echo "usage: build.sh OS ARCH"
 | 
				
			||||||
done
 | 
							exit
 | 
				
			||||||
 | 
						fi
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						VERSION_DATA=$(cat ../internal/const/const.go)
 | 
				
			||||||
 | 
						re="Version[ ]+=[ ]+\"([0-9.]+)\""
 | 
				
			||||||
 | 
						if [[ $VERSION_DATA =~ $re ]]; then
 | 
				
			||||||
 | 
							VERSION=${BASH_REMATCH[1]}
 | 
				
			||||||
 | 
						else
 | 
				
			||||||
 | 
							echo "could not match version"
 | 
				
			||||||
 | 
							exit
 | 
				
			||||||
 | 
						fi
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						ZIP="${NAME}-${OS}-${ARCH}-v${VERSION}.zip"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						# copy files
 | 
				
			||||||
 | 
						echo "copying ..."
 | 
				
			||||||
 | 
						if [ ! -d $DIST ]; then
 | 
				
			||||||
 | 
							mkdir $DIST
 | 
				
			||||||
 | 
							mkdir $DIST/bin
 | 
				
			||||||
 | 
							mkdir $DIST/configs
 | 
				
			||||||
 | 
							mkdir $DIST/logs
 | 
				
			||||||
 | 
						fi
 | 
				
			||||||
 | 
						cp configs/api.template.yaml $DIST/configs/
 | 
				
			||||||
 | 
						cp configs/db.template.yaml $DIST/configs/
 | 
				
			||||||
 | 
						cp -R deploy $DIST/
 | 
				
			||||||
 | 
						cp -R installers $DIST/
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						# building installer
 | 
				
			||||||
 | 
						echo "building installer ..."
 | 
				
			||||||
 | 
						architects=("amd64" "386")
 | 
				
			||||||
 | 
						for arch in "${architects[@]}"; do
 | 
				
			||||||
 | 
							# TODO support arm, mips ...
 | 
				
			||||||
 | 
							env GOOS=linux GOARCH=${arch} go build --ldflags="-s -w" -o $ROOT/installers/installer-helper-linux-${arch} $ROOT/../cmd/installer-helper/main.go
 | 
				
			||||||
 | 
						done
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						# building api node
 | 
				
			||||||
 | 
						env GOOS=$OS GOARCH=$ARCH go build --ldflags="-s -w" -o $DIST/bin/edge-api $ROOT/../cmd/edge-api/main.go
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						echo "zip files"
 | 
				
			||||||
 | 
						cd "${DIST}/../" || exit
 | 
				
			||||||
 | 
						if [ -f "${ZIP}" ]; then
 | 
				
			||||||
 | 
							rm -f "${ZIP}"
 | 
				
			||||||
 | 
						fi
 | 
				
			||||||
 | 
						zip -r -X -q "${ZIP}" ${NAME}/
 | 
				
			||||||
 | 
						rm -rf ${NAME}
 | 
				
			||||||
 | 
						cd - || exit
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						echo "[done]"
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					build $1 $2
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -0,0 +1,2 @@
 | 
				
			|||||||
 | 
					nodeId: "${nodeId}"
 | 
				
			||||||
 | 
					secret: "${secret}"
 | 
				
			||||||
@@ -1,11 +1,11 @@
 | 
				
			|||||||
default:
 | 
					default:
 | 
				
			||||||
  db: "dev"
 | 
					  db: "prod"
 | 
				
			||||||
  prefix: ""
 | 
					  prefix: ""
 | 
				
			||||||
 | 
					
 | 
				
			||||||
dbs:
 | 
					dbs:
 | 
				
			||||||
  dev:
 | 
					  prod:
 | 
				
			||||||
    driver: "mysql"
 | 
					    driver: "mysql"
 | 
				
			||||||
    dsn: "root:123456@tcp(127.0.0.1:3306)/db_shield?charset=utf8mb4&timeout=30s"
 | 
					    dsn: "root:123456@tcp(127.0.0.1:3306)/db_edge?charset=utf8mb4&timeout=30s"
 | 
				
			||||||
    prefix: "shield"
 | 
					    prefix: "edge"
 | 
				
			||||||
    models:
 | 
					    models:
 | 
				
			||||||
      package: internal/web/models
 | 
					      package: internal/web/models
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										3
									
								
								build/sqls/build.sh
									
									
									
									
									
										Executable file
									
								
							
							
						
						
									
										3
									
								
								build/sqls/build.sh
									
									
									
									
									
										Executable file
									
								
							@@ -0,0 +1,3 @@
 | 
				
			|||||||
 | 
					#!/usr/bin/env bash
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					go run `dirname $0`/../../cmd/sql-generate/main.go -dir=`dirname $0`
 | 
				
			||||||
							
								
								
									
										638
									
								
								build/sqls/full.sql
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										638
									
								
								build/sqls/full.sql
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,638 @@
 | 
				
			|||||||
 | 
					CREATE TABLE `edgeAPINodes` (
 | 
				
			||||||
 | 
					  `id` int(11) unsigned NOT NULL AUTO_INCREMENT COMMENT 'ID',
 | 
				
			||||||
 | 
					  `isOn` tinyint(1) unsigned DEFAULT '1' COMMENT '是否启用',
 | 
				
			||||||
 | 
					  `clusterId` int(11) unsigned DEFAULT '0' COMMENT '专用集群ID',
 | 
				
			||||||
 | 
					  `uniqueId` varchar(32) DEFAULT NULL COMMENT '唯一ID',
 | 
				
			||||||
 | 
					  `secret` varchar(32) DEFAULT NULL COMMENT '密钥',
 | 
				
			||||||
 | 
					  `name` varchar(255) DEFAULT NULL COMMENT '名称',
 | 
				
			||||||
 | 
					  `description` varchar(1024) DEFAULT NULL COMMENT '描述',
 | 
				
			||||||
 | 
					  `http` json DEFAULT NULL COMMENT '监听的HTTP配置',
 | 
				
			||||||
 | 
					  `https` json DEFAULT NULL COMMENT '监听的HTTPS配置',
 | 
				
			||||||
 | 
					  `accessAddrs` json DEFAULT NULL COMMENT '外部访问地址',
 | 
				
			||||||
 | 
					  `order` int(11) unsigned DEFAULT '0' COMMENT '排序',
 | 
				
			||||||
 | 
					  `state` tinyint(1) unsigned DEFAULT '1' COMMENT '状态',
 | 
				
			||||||
 | 
					  `createdAt` bigint(11) unsigned DEFAULT '0' COMMENT '创建时间',
 | 
				
			||||||
 | 
					  `adminId` int(11) unsigned DEFAULT '0' COMMENT '管理员ID',
 | 
				
			||||||
 | 
					  `weight` int(11) unsigned DEFAULT '0' COMMENT '权重',
 | 
				
			||||||
 | 
					  `status` json DEFAULT NULL COMMENT '运行状态',
 | 
				
			||||||
 | 
					  PRIMARY KEY (`id`),
 | 
				
			||||||
 | 
					  UNIQUE KEY `uniqueId` (`uniqueId`) USING BTREE
 | 
				
			||||||
 | 
					) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='API节点';
 | 
				
			||||||
 | 
					CREATE TABLE `edgeAPITokens` (
 | 
				
			||||||
 | 
					  `id` int(11) unsigned NOT NULL AUTO_INCREMENT COMMENT 'ID',
 | 
				
			||||||
 | 
					  `nodeId` varchar(32) DEFAULT NULL COMMENT '节点ID',
 | 
				
			||||||
 | 
					  `secret` varchar(255) DEFAULT NULL COMMENT '节点密钥',
 | 
				
			||||||
 | 
					  `role` varchar(64) DEFAULT NULL COMMENT '节点角色',
 | 
				
			||||||
 | 
					  `state` tinyint(1) unsigned DEFAULT '1' COMMENT '状态',
 | 
				
			||||||
 | 
					  PRIMARY KEY (`id`),
 | 
				
			||||||
 | 
					  KEY `nodeId` (`nodeId`)
 | 
				
			||||||
 | 
					) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='API令牌管理';
 | 
				
			||||||
 | 
					CREATE TABLE `edgeAdmins` (
 | 
				
			||||||
 | 
					  `id` int(11) unsigned NOT NULL AUTO_INCREMENT COMMENT 'ID',
 | 
				
			||||||
 | 
					  `username` varchar(64) DEFAULT NULL COMMENT '用户名',
 | 
				
			||||||
 | 
					  `password` varchar(32) DEFAULT NULL COMMENT '密码',
 | 
				
			||||||
 | 
					  `fullname` varchar(64) DEFAULT NULL COMMENT '全名',
 | 
				
			||||||
 | 
					  `isSuper` tinyint(1) unsigned DEFAULT '0' COMMENT '是否为超级管理员',
 | 
				
			||||||
 | 
					  `createdAt` bigint(11) unsigned DEFAULT '0' COMMENT '创建时间',
 | 
				
			||||||
 | 
					  `updatedAt` bigint(11) unsigned DEFAULT '0' COMMENT '修改时间',
 | 
				
			||||||
 | 
					  `state` tinyint(1) unsigned DEFAULT '1' COMMENT '状态',
 | 
				
			||||||
 | 
					  PRIMARY KEY (`id`)
 | 
				
			||||||
 | 
					) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='管理员';
 | 
				
			||||||
 | 
					CREATE TABLE `edgeDBNodes` (
 | 
				
			||||||
 | 
					  `id` int(11) unsigned NOT NULL AUTO_INCREMENT COMMENT 'ID',
 | 
				
			||||||
 | 
					  `isOn` tinyint(1) unsigned DEFAULT '1' COMMENT '是否启用',
 | 
				
			||||||
 | 
					  `role` varchar(255) DEFAULT NULL COMMENT '数据库角色',
 | 
				
			||||||
 | 
					  `name` varchar(255) DEFAULT NULL COMMENT '名称',
 | 
				
			||||||
 | 
					  `description` varchar(1024) DEFAULT NULL COMMENT '描述',
 | 
				
			||||||
 | 
					  `host` varchar(255) DEFAULT NULL COMMENT '主机',
 | 
				
			||||||
 | 
					  `port` int(11) unsigned DEFAULT '0' COMMENT '端口',
 | 
				
			||||||
 | 
					  `database` varchar(255) DEFAULT NULL COMMENT '数据库名称',
 | 
				
			||||||
 | 
					  `username` varchar(255) DEFAULT NULL COMMENT '用户名',
 | 
				
			||||||
 | 
					  `password` varchar(255) DEFAULT NULL COMMENT '密码',
 | 
				
			||||||
 | 
					  `charset` varchar(255) DEFAULT NULL COMMENT '通讯字符集',
 | 
				
			||||||
 | 
					  `connTimeout` int(11) unsigned DEFAULT '0' COMMENT '连接超时时间(秒)',
 | 
				
			||||||
 | 
					  `state` tinyint(1) unsigned DEFAULT '1' COMMENT '状态',
 | 
				
			||||||
 | 
					  `createdAt` bigint(11) unsigned DEFAULT '0' COMMENT '创建时间',
 | 
				
			||||||
 | 
					  `weight` int(11) unsigned DEFAULT '0' COMMENT '权重',
 | 
				
			||||||
 | 
					  `order` int(11) unsigned DEFAULT '0' COMMENT '排序',
 | 
				
			||||||
 | 
					  `adminId` int(11) unsigned DEFAULT '0' COMMENT '管理员ID',
 | 
				
			||||||
 | 
					  PRIMARY KEY (`id`)
 | 
				
			||||||
 | 
					) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='数据库节点';
 | 
				
			||||||
 | 
					CREATE TABLE `edgeFileChunks` (
 | 
				
			||||||
 | 
					  `id` int(11) unsigned NOT NULL AUTO_INCREMENT COMMENT 'ID',
 | 
				
			||||||
 | 
					  `fileId` int(11) unsigned DEFAULT '0' COMMENT '文件ID',
 | 
				
			||||||
 | 
					  `data` longblob COMMENT '分块内容',
 | 
				
			||||||
 | 
					  PRIMARY KEY (`id`),
 | 
				
			||||||
 | 
					  KEY `fileId` (`fileId`)
 | 
				
			||||||
 | 
					) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='文件片段';
 | 
				
			||||||
 | 
					CREATE TABLE `edgeFiles` (
 | 
				
			||||||
 | 
					  `id` int(11) unsigned NOT NULL AUTO_INCREMENT COMMENT 'ID',
 | 
				
			||||||
 | 
					  `adminId` int(11) unsigned DEFAULT '0' COMMENT '管理员ID',
 | 
				
			||||||
 | 
					  `userId` int(11) unsigned DEFAULT '0' COMMENT '用户ID',
 | 
				
			||||||
 | 
					  `description` varchar(255) DEFAULT NULL COMMENT '文件描述',
 | 
				
			||||||
 | 
					  `filename` varchar(255) DEFAULT NULL COMMENT '文件名',
 | 
				
			||||||
 | 
					  `size` int(11) unsigned DEFAULT '0' COMMENT '文件尺寸',
 | 
				
			||||||
 | 
					  `createdAt` bigint(11) unsigned DEFAULT '0' COMMENT '创建时间',
 | 
				
			||||||
 | 
					  `order` int(11) unsigned DEFAULT '0' COMMENT '排序',
 | 
				
			||||||
 | 
					  `type` varchar(64) DEFAULT '' COMMENT '类型',
 | 
				
			||||||
 | 
					  `state` tinyint(1) unsigned DEFAULT '1' COMMENT '状态',
 | 
				
			||||||
 | 
					  PRIMARY KEY (`id`),
 | 
				
			||||||
 | 
					  KEY `type` (`type`)
 | 
				
			||||||
 | 
					) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='文件管理';
 | 
				
			||||||
 | 
					CREATE TABLE `edgeHTTPAccessLogPolicies` (
 | 
				
			||||||
 | 
					  `id` int(11) unsigned NOT NULL AUTO_INCREMENT COMMENT 'ID',
 | 
				
			||||||
 | 
					  `templateId` int(11) unsigned DEFAULT '0' COMMENT '模版ID',
 | 
				
			||||||
 | 
					  `adminId` int(11) unsigned DEFAULT '0' COMMENT '管理员ID',
 | 
				
			||||||
 | 
					  `userId` int(11) unsigned DEFAULT '0' COMMENT '用户ID',
 | 
				
			||||||
 | 
					  `state` tinyint(1) unsigned DEFAULT '1' COMMENT '状态',
 | 
				
			||||||
 | 
					  `createdAt` bigint(11) unsigned DEFAULT '0' COMMENT '创建时间',
 | 
				
			||||||
 | 
					  `name` varchar(255) DEFAULT NULL COMMENT '名称',
 | 
				
			||||||
 | 
					  `isOn` tinyint(1) unsigned DEFAULT '1' COMMENT '是否启用',
 | 
				
			||||||
 | 
					  `type` varchar(255) DEFAULT NULL COMMENT '存储类型',
 | 
				
			||||||
 | 
					  `options` json DEFAULT NULL COMMENT '存储选项',
 | 
				
			||||||
 | 
					  `conds` json DEFAULT NULL COMMENT '请求条件',
 | 
				
			||||||
 | 
					  PRIMARY KEY (`id`)
 | 
				
			||||||
 | 
					) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='访问日志策略';
 | 
				
			||||||
 | 
					CREATE TABLE `edgeHTTPAccessLogs` (
 | 
				
			||||||
 | 
					  `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT 'ID',
 | 
				
			||||||
 | 
					  `serverId` int(11) unsigned DEFAULT '0' COMMENT '服务ID',
 | 
				
			||||||
 | 
					  `nodeId` int(11) unsigned DEFAULT '0' COMMENT '节点ID',
 | 
				
			||||||
 | 
					  `status` int(3) unsigned DEFAULT '0' COMMENT '状态码',
 | 
				
			||||||
 | 
					  `createdAt` bigint(11) unsigned DEFAULT '0' COMMENT '创建时间',
 | 
				
			||||||
 | 
					  `content` json DEFAULT NULL COMMENT '日志内容',
 | 
				
			||||||
 | 
					  `requestId` varchar(128) DEFAULT NULL COMMENT '请求ID',
 | 
				
			||||||
 | 
					  PRIMARY KEY (`id`),
 | 
				
			||||||
 | 
					  KEY `serverId` (`serverId`),
 | 
				
			||||||
 | 
					  KEY `nodeId` (`nodeId`),
 | 
				
			||||||
 | 
					  KEY `serverId_status` (`serverId`,`status`),
 | 
				
			||||||
 | 
					  KEY `requestId` (`requestId`)
 | 
				
			||||||
 | 
					) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
 | 
				
			||||||
 | 
					CREATE TABLE `edgeHTTPAccessLogs_20201010` (
 | 
				
			||||||
 | 
					  `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT 'ID',
 | 
				
			||||||
 | 
					  `serverId` int(11) unsigned DEFAULT '0' COMMENT '服务ID',
 | 
				
			||||||
 | 
					  `nodeId` int(11) unsigned DEFAULT '0' COMMENT '节点ID',
 | 
				
			||||||
 | 
					  `status` int(3) unsigned DEFAULT '0' COMMENT '状态码',
 | 
				
			||||||
 | 
					  `createdAt` bigint(11) unsigned DEFAULT '0' COMMENT '创建时间',
 | 
				
			||||||
 | 
					  `content` json DEFAULT NULL COMMENT '日志内容',
 | 
				
			||||||
 | 
					  `day` varchar(8) DEFAULT NULL COMMENT '日期Ymd',
 | 
				
			||||||
 | 
					  PRIMARY KEY (`id`),
 | 
				
			||||||
 | 
					  KEY `serverId` (`serverId`),
 | 
				
			||||||
 | 
					  KEY `nodeId` (`nodeId`),
 | 
				
			||||||
 | 
					  KEY `serverId_status` (`serverId`,`status`)
 | 
				
			||||||
 | 
					) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
 | 
				
			||||||
 | 
					CREATE TABLE `edgeHTTPCachePolicies` (
 | 
				
			||||||
 | 
					  `id` int(11) unsigned NOT NULL AUTO_INCREMENT COMMENT 'ID',
 | 
				
			||||||
 | 
					  `adminId` int(11) unsigned DEFAULT '0' COMMENT '管理员ID',
 | 
				
			||||||
 | 
					  `userId` int(11) unsigned DEFAULT '0' COMMENT '用户ID',
 | 
				
			||||||
 | 
					  `templateId` int(11) unsigned DEFAULT '0' COMMENT '模版ID',
 | 
				
			||||||
 | 
					  `isOn` tinyint(1) unsigned DEFAULT '1' COMMENT '是否启用',
 | 
				
			||||||
 | 
					  `name` varchar(255) DEFAULT NULL COMMENT '名称',
 | 
				
			||||||
 | 
					  `capacity` json DEFAULT NULL COMMENT '容量数据',
 | 
				
			||||||
 | 
					  `maxKeys` bigint(20) unsigned DEFAULT '0' COMMENT '最多Key值',
 | 
				
			||||||
 | 
					  `maxSize` json DEFAULT NULL COMMENT '最大缓存内容尺寸',
 | 
				
			||||||
 | 
					  `type` varchar(255) DEFAULT NULL COMMENT '存储类型',
 | 
				
			||||||
 | 
					  `options` json DEFAULT NULL COMMENT '存储选项',
 | 
				
			||||||
 | 
					  `createdAt` bigint(11) unsigned DEFAULT '0' COMMENT '创建时间',
 | 
				
			||||||
 | 
					  `state` tinyint(1) unsigned DEFAULT '1' COMMENT '状态',
 | 
				
			||||||
 | 
					  `description` varchar(1024) DEFAULT NULL COMMENT '描述',
 | 
				
			||||||
 | 
					  PRIMARY KEY (`id`)
 | 
				
			||||||
 | 
					) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='HTTP缓存策略';
 | 
				
			||||||
 | 
					CREATE TABLE `edgeHTTPFirewallPolicies` (
 | 
				
			||||||
 | 
					  `id` int(11) unsigned NOT NULL AUTO_INCREMENT COMMENT 'ID',
 | 
				
			||||||
 | 
					  `templateId` int(11) unsigned DEFAULT '0' COMMENT '模版ID',
 | 
				
			||||||
 | 
					  `adminId` int(11) unsigned DEFAULT '0' COMMENT '管理员ID',
 | 
				
			||||||
 | 
					  `userId` int(11) unsigned DEFAULT '0' COMMENT '用户ID',
 | 
				
			||||||
 | 
					  `state` tinyint(1) unsigned DEFAULT '1' COMMENT '状态',
 | 
				
			||||||
 | 
					  `createdAt` bigint(11) unsigned DEFAULT '0' COMMENT '创建时间',
 | 
				
			||||||
 | 
					  `isOn` tinyint(1) unsigned DEFAULT '1' COMMENT '是否启用',
 | 
				
			||||||
 | 
					  `name` varchar(255) DEFAULT NULL COMMENT '名称',
 | 
				
			||||||
 | 
					  `description` varchar(1024) DEFAULT NULL COMMENT '描述',
 | 
				
			||||||
 | 
					  `inbound` json DEFAULT NULL COMMENT '入站规则',
 | 
				
			||||||
 | 
					  `outbound` json DEFAULT NULL COMMENT '出站规则',
 | 
				
			||||||
 | 
					  PRIMARY KEY (`id`)
 | 
				
			||||||
 | 
					) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='HTTP防火墙';
 | 
				
			||||||
 | 
					CREATE TABLE `edgeHTTPFirewallRuleGroups` (
 | 
				
			||||||
 | 
					  `id` int(11) unsigned NOT NULL AUTO_INCREMENT COMMENT 'ID',
 | 
				
			||||||
 | 
					  `isOn` tinyint(1) unsigned DEFAULT '1' COMMENT '是否启用',
 | 
				
			||||||
 | 
					  `name` varchar(255) DEFAULT NULL COMMENT '名称',
 | 
				
			||||||
 | 
					  `description` varchar(1024) DEFAULT NULL COMMENT '描述',
 | 
				
			||||||
 | 
					  `code` varchar(255) DEFAULT NULL COMMENT '代号',
 | 
				
			||||||
 | 
					  `adminId` int(11) unsigned DEFAULT '0' COMMENT '管理员ID',
 | 
				
			||||||
 | 
					  `userId` int(11) unsigned DEFAULT '0' COMMENT '用户ID',
 | 
				
			||||||
 | 
					  `state` tinyint(1) unsigned DEFAULT '1' COMMENT '状态',
 | 
				
			||||||
 | 
					  `sets` json DEFAULT NULL COMMENT '规则集列表',
 | 
				
			||||||
 | 
					  `createdAt` bigint(11) unsigned DEFAULT '0' COMMENT '创建时间',
 | 
				
			||||||
 | 
					  PRIMARY KEY (`id`)
 | 
				
			||||||
 | 
					) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='防火墙规则分组';
 | 
				
			||||||
 | 
					CREATE TABLE `edgeHTTPFirewallRuleSets` (
 | 
				
			||||||
 | 
					  `id` int(11) unsigned NOT NULL AUTO_INCREMENT COMMENT 'ID',
 | 
				
			||||||
 | 
					  `isOn` tinyint(1) unsigned DEFAULT '1' COMMENT '是否启用',
 | 
				
			||||||
 | 
					  `code` varchar(255) DEFAULT NULL COMMENT '代号',
 | 
				
			||||||
 | 
					  `name` varchar(255) DEFAULT NULL COMMENT '名称',
 | 
				
			||||||
 | 
					  `description` varchar(1024) DEFAULT NULL COMMENT '描述',
 | 
				
			||||||
 | 
					  `createdAt` bigint(11) unsigned DEFAULT '0' COMMENT '创建时间',
 | 
				
			||||||
 | 
					  `rules` json DEFAULT NULL COMMENT '规则列表',
 | 
				
			||||||
 | 
					  `connector` varchar(64) DEFAULT NULL COMMENT '规则之间的关系',
 | 
				
			||||||
 | 
					  `state` tinyint(1) unsigned DEFAULT '1' COMMENT '状态',
 | 
				
			||||||
 | 
					  `adminId` int(11) unsigned DEFAULT '0' COMMENT '管理员ID',
 | 
				
			||||||
 | 
					  `userId` int(11) unsigned DEFAULT '0' COMMENT '用户ID',
 | 
				
			||||||
 | 
					  `action` varchar(255) DEFAULT NULL COMMENT '执行的动作',
 | 
				
			||||||
 | 
					  `actionOptions` json DEFAULT NULL COMMENT '动作的选项',
 | 
				
			||||||
 | 
					  PRIMARY KEY (`id`)
 | 
				
			||||||
 | 
					) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='防火墙规则集';
 | 
				
			||||||
 | 
					CREATE TABLE `edgeHTTPFirewallRules` (
 | 
				
			||||||
 | 
					  `id` int(11) unsigned NOT NULL AUTO_INCREMENT COMMENT 'ID',
 | 
				
			||||||
 | 
					  `isOn` tinyint(1) unsigned DEFAULT '1' COMMENT '是否启用',
 | 
				
			||||||
 | 
					  `description` varchar(1024) DEFAULT NULL COMMENT '说明',
 | 
				
			||||||
 | 
					  `param` varchar(1024) DEFAULT NULL COMMENT '参数',
 | 
				
			||||||
 | 
					  `operator` varchar(255) DEFAULT NULL COMMENT '操作符',
 | 
				
			||||||
 | 
					  `value` varchar(1024) DEFAULT NULL COMMENT '对比值',
 | 
				
			||||||
 | 
					  `isCaseInsensitive` tinyint(1) unsigned DEFAULT '1' COMMENT '是否大小写不敏感',
 | 
				
			||||||
 | 
					  `checkpointOptions` json DEFAULT NULL COMMENT '检查点参数',
 | 
				
			||||||
 | 
					  `state` tinyint(1) unsigned DEFAULT '1' COMMENT '状态',
 | 
				
			||||||
 | 
					  `createdAt` bigint(11) unsigned DEFAULT '0' COMMENT '创建时间',
 | 
				
			||||||
 | 
					  `adminId` int(11) unsigned DEFAULT '0' COMMENT '管理员ID',
 | 
				
			||||||
 | 
					  `userId` int(11) unsigned DEFAULT '0' COMMENT '用户ID',
 | 
				
			||||||
 | 
					  PRIMARY KEY (`id`)
 | 
				
			||||||
 | 
					) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='防火墙规则';
 | 
				
			||||||
 | 
					CREATE TABLE `edgeHTTPGzips` (
 | 
				
			||||||
 | 
					  `id` int(11) unsigned NOT NULL AUTO_INCREMENT COMMENT 'ID',
 | 
				
			||||||
 | 
					  `adminId` int(11) unsigned DEFAULT '0' COMMENT '管理员ID',
 | 
				
			||||||
 | 
					  `userId` int(11) unsigned DEFAULT '0' COMMENT '用户ID',
 | 
				
			||||||
 | 
					  `isOn` tinyint(1) unsigned DEFAULT '1' COMMENT '是否启用',
 | 
				
			||||||
 | 
					  `level` int(11) unsigned DEFAULT '0' COMMENT '压缩级别',
 | 
				
			||||||
 | 
					  `minLength` json DEFAULT NULL COMMENT '可压缩最小值',
 | 
				
			||||||
 | 
					  `maxLength` json DEFAULT NULL COMMENT '可压缩最大值',
 | 
				
			||||||
 | 
					  `state` tinyint(1) unsigned DEFAULT '1' COMMENT '状态',
 | 
				
			||||||
 | 
					  `createdAt` bigint(11) unsigned DEFAULT '0' COMMENT '创建时间',
 | 
				
			||||||
 | 
					  `conds` json DEFAULT NULL COMMENT '条件',
 | 
				
			||||||
 | 
					  PRIMARY KEY (`id`)
 | 
				
			||||||
 | 
					) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='Gzip配置';
 | 
				
			||||||
 | 
					CREATE TABLE `edgeHTTPHeaderPolicies` (
 | 
				
			||||||
 | 
					  `id` int(11) unsigned NOT NULL AUTO_INCREMENT COMMENT 'ID',
 | 
				
			||||||
 | 
					  `isOn` tinyint(1) unsigned NOT NULL DEFAULT '1' COMMENT '是否启用',
 | 
				
			||||||
 | 
					  `state` tinyint(1) unsigned DEFAULT '1' COMMENT '状态',
 | 
				
			||||||
 | 
					  `adminId` int(11) unsigned DEFAULT '0' COMMENT '管理员ID',
 | 
				
			||||||
 | 
					  `userId` int(11) unsigned DEFAULT '0' COMMENT '用户ID',
 | 
				
			||||||
 | 
					  `createdAt` bigint(11) unsigned DEFAULT '0' COMMENT '创建时间',
 | 
				
			||||||
 | 
					  `addHeaders` json DEFAULT NULL COMMENT '添加的Header',
 | 
				
			||||||
 | 
					  `addTrailers` json DEFAULT NULL COMMENT '添加的Trailers',
 | 
				
			||||||
 | 
					  `setHeaders` json DEFAULT NULL COMMENT '设置Header',
 | 
				
			||||||
 | 
					  `replaceHeaders` json DEFAULT NULL COMMENT '替换Header内容',
 | 
				
			||||||
 | 
					  `expires` json DEFAULT NULL COMMENT 'Expires单独设置',
 | 
				
			||||||
 | 
					  `deleteHeaders` json DEFAULT NULL COMMENT '删除的Headers',
 | 
				
			||||||
 | 
					  PRIMARY KEY (`id`)
 | 
				
			||||||
 | 
					) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='Header定义';
 | 
				
			||||||
 | 
					CREATE TABLE `edgeHTTPHeaders` (
 | 
				
			||||||
 | 
					  `id` int(11) unsigned NOT NULL AUTO_INCREMENT COMMENT 'ID',
 | 
				
			||||||
 | 
					  `adminId` int(11) unsigned DEFAULT '0' COMMENT '管理员ID',
 | 
				
			||||||
 | 
					  `userId` int(11) unsigned DEFAULT '0' COMMENT '用户ID',
 | 
				
			||||||
 | 
					  `templateId` int(11) unsigned DEFAULT '0' COMMENT '模版ID',
 | 
				
			||||||
 | 
					  `isOn` tinyint(1) unsigned DEFAULT '1' COMMENT '是否启用',
 | 
				
			||||||
 | 
					  `name` varchar(255) DEFAULT NULL COMMENT '名称',
 | 
				
			||||||
 | 
					  `value` varchar(1024) DEFAULT NULL COMMENT '值',
 | 
				
			||||||
 | 
					  `order` int(11) unsigned DEFAULT '0' COMMENT '排序',
 | 
				
			||||||
 | 
					  `status` json DEFAULT NULL COMMENT '状态码设置',
 | 
				
			||||||
 | 
					  `state` tinyint(1) unsigned DEFAULT '1' COMMENT '状态',
 | 
				
			||||||
 | 
					  `createdAt` bigint(11) unsigned DEFAULT '0' COMMENT '创建时间',
 | 
				
			||||||
 | 
					  PRIMARY KEY (`id`)
 | 
				
			||||||
 | 
					) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='HTTP Header';
 | 
				
			||||||
 | 
					CREATE TABLE `edgeHTTPLocations` (
 | 
				
			||||||
 | 
					  `id` int(11) unsigned NOT NULL AUTO_INCREMENT COMMENT 'ID',
 | 
				
			||||||
 | 
					  `templateId` int(11) unsigned DEFAULT '0' COMMENT '模版ID',
 | 
				
			||||||
 | 
					  `adminId` int(11) unsigned DEFAULT '0' COMMENT '管理员ID',
 | 
				
			||||||
 | 
					  `userId` int(11) unsigned DEFAULT '0' COMMENT '用户ID',
 | 
				
			||||||
 | 
					  `parentId` int(11) unsigned DEFAULT '0' COMMENT '父级ID',
 | 
				
			||||||
 | 
					  `state` tinyint(1) unsigned DEFAULT '1' COMMENT '状态',
 | 
				
			||||||
 | 
					  `createdAt` bigint(11) unsigned DEFAULT '0' COMMENT '创建时间',
 | 
				
			||||||
 | 
					  `pattern` varchar(1024) DEFAULT NULL COMMENT '匹配规则',
 | 
				
			||||||
 | 
					  `isOn` tinyint(1) unsigned DEFAULT '1' COMMENT '是否启用',
 | 
				
			||||||
 | 
					  `name` varchar(255) DEFAULT NULL COMMENT '名称',
 | 
				
			||||||
 | 
					  `description` varchar(1024) DEFAULT NULL COMMENT '描述',
 | 
				
			||||||
 | 
					  `webId` int(11) unsigned DEFAULT '0' COMMENT 'Web配置ID',
 | 
				
			||||||
 | 
					  `reverseProxy` json DEFAULT NULL COMMENT '反向代理',
 | 
				
			||||||
 | 
					  `urlPrefix` varchar(1024) DEFAULT NULL COMMENT 'URL前缀',
 | 
				
			||||||
 | 
					  `isBreak` tinyint(1) unsigned DEFAULT '0' COMMENT '是否终止匹配',
 | 
				
			||||||
 | 
					  `conds` json DEFAULT NULL COMMENT '匹配条件',
 | 
				
			||||||
 | 
					  PRIMARY KEY (`id`)
 | 
				
			||||||
 | 
					) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='路径规则配置';
 | 
				
			||||||
 | 
					CREATE TABLE `edgeHTTPPages` (
 | 
				
			||||||
 | 
					  `id` int(11) unsigned NOT NULL AUTO_INCREMENT COMMENT 'ID',
 | 
				
			||||||
 | 
					  `adminId` int(11) unsigned DEFAULT '0' COMMENT '管理员ID',
 | 
				
			||||||
 | 
					  `userId` int(11) unsigned DEFAULT '0' COMMENT '用户ID',
 | 
				
			||||||
 | 
					  `isOn` tinyint(1) unsigned DEFAULT '0' COMMENT '是否启用',
 | 
				
			||||||
 | 
					  `statusList` json DEFAULT NULL COMMENT '状态列表',
 | 
				
			||||||
 | 
					  `url` varchar(1024) DEFAULT NULL COMMENT '页面URL',
 | 
				
			||||||
 | 
					  `newStatus` int(3) DEFAULT NULL COMMENT '新状态码',
 | 
				
			||||||
 | 
					  `state` tinyint(1) unsigned DEFAULT '1' COMMENT '状态',
 | 
				
			||||||
 | 
					  `createdAt` bigint(11) unsigned DEFAULT '0' COMMENT '创建时间',
 | 
				
			||||||
 | 
					  PRIMARY KEY (`id`)
 | 
				
			||||||
 | 
					) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='特殊页面';
 | 
				
			||||||
 | 
					CREATE TABLE `edgeHTTPRewriteRules` (
 | 
				
			||||||
 | 
					  `id` int(11) unsigned NOT NULL AUTO_INCREMENT COMMENT 'ID',
 | 
				
			||||||
 | 
					  `adminId` int(11) unsigned DEFAULT '0' COMMENT '管理员ID',
 | 
				
			||||||
 | 
					  `userId` int(11) unsigned DEFAULT '0' COMMENT '用户ID',
 | 
				
			||||||
 | 
					  `templateId` int(11) unsigned DEFAULT '0' COMMENT '模版ID',
 | 
				
			||||||
 | 
					  `isOn` tinyint(1) unsigned DEFAULT '1' COMMENT '是否启用',
 | 
				
			||||||
 | 
					  `state` tinyint(1) unsigned DEFAULT '1' COMMENT '状态',
 | 
				
			||||||
 | 
					  `createdAt` bigint(11) unsigned DEFAULT '0' COMMENT '创建时间',
 | 
				
			||||||
 | 
					  `pattern` varchar(1024) DEFAULT NULL COMMENT '匹配规则',
 | 
				
			||||||
 | 
					  `replace` varchar(1024) DEFAULT NULL COMMENT '跳转后的地址',
 | 
				
			||||||
 | 
					  `mode` varchar(255) DEFAULT NULL COMMENT '替换模式',
 | 
				
			||||||
 | 
					  `redirectStatus` int(3) unsigned DEFAULT '0' COMMENT '跳转的状态码',
 | 
				
			||||||
 | 
					  `proxyHost` varchar(255) DEFAULT NULL COMMENT '代理的主机名',
 | 
				
			||||||
 | 
					  `isBreak` tinyint(1) unsigned DEFAULT '1' COMMENT '是否终止解析',
 | 
				
			||||||
 | 
					  `withQuery` tinyint(1) unsigned DEFAULT '1' COMMENT '是否保留URI参数',
 | 
				
			||||||
 | 
					  `conds` json DEFAULT NULL COMMENT '匹配条件',
 | 
				
			||||||
 | 
					  PRIMARY KEY (`id`)
 | 
				
			||||||
 | 
					) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='重写规则';
 | 
				
			||||||
 | 
					CREATE TABLE `edgeHTTPWebs` (
 | 
				
			||||||
 | 
					  `id` int(11) unsigned NOT NULL AUTO_INCREMENT COMMENT 'ID',
 | 
				
			||||||
 | 
					  `isOn` tinyint(1) unsigned DEFAULT '1' COMMENT '是否启用',
 | 
				
			||||||
 | 
					  `templateId` int(11) unsigned DEFAULT '0' COMMENT '模版ID',
 | 
				
			||||||
 | 
					  `adminId` int(11) unsigned DEFAULT '0' COMMENT '管理员ID',
 | 
				
			||||||
 | 
					  `userId` int(11) unsigned DEFAULT '0' COMMENT '用户ID',
 | 
				
			||||||
 | 
					  `state` tinyint(1) unsigned DEFAULT '1' COMMENT '状态',
 | 
				
			||||||
 | 
					  `createdAt` bigint(11) unsigned DEFAULT '0' COMMENT '创建时间',
 | 
				
			||||||
 | 
					  `root` json DEFAULT NULL COMMENT '根目录',
 | 
				
			||||||
 | 
					  `charset` json DEFAULT NULL COMMENT '字符集',
 | 
				
			||||||
 | 
					  `shutdown` json DEFAULT NULL COMMENT '临时关闭页面配置',
 | 
				
			||||||
 | 
					  `pages` json DEFAULT NULL COMMENT '特殊页面',
 | 
				
			||||||
 | 
					  `redirectToHttps` json DEFAULT NULL COMMENT '跳转到HTTPS设置',
 | 
				
			||||||
 | 
					  `indexes` json DEFAULT NULL COMMENT '首页文件列表',
 | 
				
			||||||
 | 
					  `maxRequestBodySize` json DEFAULT NULL COMMENT '最大允许的请求内容尺寸',
 | 
				
			||||||
 | 
					  `requestHeader` json DEFAULT NULL COMMENT '请求Header配置',
 | 
				
			||||||
 | 
					  `responseHeader` json DEFAULT NULL COMMENT '响应Header配置',
 | 
				
			||||||
 | 
					  `accessLog` json DEFAULT NULL COMMENT '访问日志配置',
 | 
				
			||||||
 | 
					  `stat` json DEFAULT NULL COMMENT '统计配置',
 | 
				
			||||||
 | 
					  `gzip` json DEFAULT NULL COMMENT 'Gzip配置',
 | 
				
			||||||
 | 
					  `cache` json DEFAULT NULL COMMENT '缓存配置',
 | 
				
			||||||
 | 
					  `firewall` json DEFAULT NULL COMMENT '防火墙设置',
 | 
				
			||||||
 | 
					  `locations` json DEFAULT NULL COMMENT '路径规则配置',
 | 
				
			||||||
 | 
					  `websocket` json DEFAULT NULL COMMENT 'Websocket设置',
 | 
				
			||||||
 | 
					  `rewriteRules` json DEFAULT NULL COMMENT '重写规则配置',
 | 
				
			||||||
 | 
					  PRIMARY KEY (`id`)
 | 
				
			||||||
 | 
					) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='HTTP Web';
 | 
				
			||||||
 | 
					CREATE TABLE `edgeHTTPWebsockets` (
 | 
				
			||||||
 | 
					  `id` int(11) unsigned NOT NULL AUTO_INCREMENT COMMENT 'ID',
 | 
				
			||||||
 | 
					  `adminId` int(11) unsigned DEFAULT '0' COMMENT '管理员ID',
 | 
				
			||||||
 | 
					  `userId` int(11) unsigned DEFAULT '0' COMMENT '用户ID',
 | 
				
			||||||
 | 
					  `createdAt` bigint(11) unsigned DEFAULT '0' COMMENT '创建时间',
 | 
				
			||||||
 | 
					  `state` tinyint(1) unsigned DEFAULT '1' COMMENT '状态',
 | 
				
			||||||
 | 
					  `isOn` tinyint(1) unsigned DEFAULT '1' COMMENT '是否启用',
 | 
				
			||||||
 | 
					  `handshakeTimeout` json DEFAULT NULL COMMENT '握手超时时间',
 | 
				
			||||||
 | 
					  `allowAllOrigins` tinyint(1) unsigned DEFAULT '1' COMMENT '是否支持所有源',
 | 
				
			||||||
 | 
					  `allowedOrigins` json DEFAULT NULL COMMENT '支持的源域名列表',
 | 
				
			||||||
 | 
					  `requestSameOrigin` tinyint(1) unsigned DEFAULT '1' COMMENT '是否请求一样的Origin',
 | 
				
			||||||
 | 
					  `requestOrigin` varchar(255) DEFAULT NULL COMMENT '请求Origin',
 | 
				
			||||||
 | 
					  PRIMARY KEY (`id`)
 | 
				
			||||||
 | 
					) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='Websocket设置';
 | 
				
			||||||
 | 
					CREATE TABLE `edgeLogs` (
 | 
				
			||||||
 | 
					  `id` int(11) unsigned NOT NULL AUTO_INCREMENT COMMENT 'ID',
 | 
				
			||||||
 | 
					  `level` varchar(32) DEFAULT NULL COMMENT '级别',
 | 
				
			||||||
 | 
					  `description` varchar(255) DEFAULT NULL COMMENT '描述',
 | 
				
			||||||
 | 
					  `createdAt` bigint(11) unsigned DEFAULT '0' COMMENT '创建时间',
 | 
				
			||||||
 | 
					  `action` varchar(255) DEFAULT NULL COMMENT '动作',
 | 
				
			||||||
 | 
					  `userId` int(11) unsigned DEFAULT '0' COMMENT '用户ID',
 | 
				
			||||||
 | 
					  `adminId` int(11) unsigned DEFAULT '0' COMMENT '管理员ID',
 | 
				
			||||||
 | 
					  `providerId` int(11) unsigned DEFAULT '0' COMMENT '供应商ID',
 | 
				
			||||||
 | 
					  `ip` varchar(32) DEFAULT NULL COMMENT 'IP地址',
 | 
				
			||||||
 | 
					  `type` varchar(255) DEFAULT 'admin' COMMENT '类型:admin, user',
 | 
				
			||||||
 | 
					  PRIMARY KEY (`id`)
 | 
				
			||||||
 | 
					) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='操作日志';
 | 
				
			||||||
 | 
					CREATE TABLE `edgeNodeClusters` (
 | 
				
			||||||
 | 
					  `id` int(11) unsigned NOT NULL AUTO_INCREMENT COMMENT 'ID',
 | 
				
			||||||
 | 
					  `adminId` int(11) unsigned DEFAULT '0' COMMENT '管理员ID',
 | 
				
			||||||
 | 
					  `userId` int(11) unsigned DEFAULT '0' COMMENT '用户ID',
 | 
				
			||||||
 | 
					  `name` varchar(255) DEFAULT NULL COMMENT '名称',
 | 
				
			||||||
 | 
					  `useAllAPINodes` tinyint(1) unsigned DEFAULT '1' COMMENT '是否使用所有API节点',
 | 
				
			||||||
 | 
					  `apiNodes` json DEFAULT NULL COMMENT '使用的API节点',
 | 
				
			||||||
 | 
					  `installDir` varchar(512) DEFAULT NULL COMMENT '安装目录',
 | 
				
			||||||
 | 
					  `order` int(11) unsigned DEFAULT '0' COMMENT '排序',
 | 
				
			||||||
 | 
					  `createdAt` bigint(11) unsigned DEFAULT '0' COMMENT '创建时间',
 | 
				
			||||||
 | 
					  `grantId` int(11) unsigned DEFAULT '0' COMMENT '默认认证方式',
 | 
				
			||||||
 | 
					  `state` tinyint(1) unsigned DEFAULT '1' COMMENT '状态',
 | 
				
			||||||
 | 
					  PRIMARY KEY (`id`)
 | 
				
			||||||
 | 
					) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='节点集群';
 | 
				
			||||||
 | 
					CREATE TABLE `edgeNodeGrants` (
 | 
				
			||||||
 | 
					  `id` int(11) unsigned NOT NULL AUTO_INCREMENT COMMENT 'ID',
 | 
				
			||||||
 | 
					  `name` varchar(255) DEFAULT NULL COMMENT '名称',
 | 
				
			||||||
 | 
					  `method` varchar(64) DEFAULT NULL COMMENT '登录方式',
 | 
				
			||||||
 | 
					  `username` varchar(255) DEFAULT NULL COMMENT '用户名',
 | 
				
			||||||
 | 
					  `password` varchar(255) DEFAULT NULL COMMENT '密码',
 | 
				
			||||||
 | 
					  `su` tinyint(1) unsigned DEFAULT '1' COMMENT '是否需要su',
 | 
				
			||||||
 | 
					  `privateKey` varchar(4096) DEFAULT NULL COMMENT '密钥',
 | 
				
			||||||
 | 
					  `description` varchar(255) DEFAULT NULL COMMENT '备注',
 | 
				
			||||||
 | 
					  `nodeId` int(11) unsigned DEFAULT '0' COMMENT '专有节点',
 | 
				
			||||||
 | 
					  `state` tinyint(1) unsigned DEFAULT '1' COMMENT '状态',
 | 
				
			||||||
 | 
					  `createdAt` bigint(11) unsigned DEFAULT '0' COMMENT '创建时间',
 | 
				
			||||||
 | 
					  PRIMARY KEY (`id`)
 | 
				
			||||||
 | 
					) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='节点授权';
 | 
				
			||||||
 | 
					CREATE TABLE `edgeNodeGroups` (
 | 
				
			||||||
 | 
					  `id` int(11) unsigned NOT NULL AUTO_INCREMENT COMMENT 'ID',
 | 
				
			||||||
 | 
					  `name` varchar(255) DEFAULT NULL COMMENT '名称',
 | 
				
			||||||
 | 
					  `order` int(11) unsigned DEFAULT '0' COMMENT '排序',
 | 
				
			||||||
 | 
					  `createdAt` bigint(11) unsigned DEFAULT '0' COMMENT '创建时间',
 | 
				
			||||||
 | 
					  `state` tinyint(1) unsigned DEFAULT '1' COMMENT '状态',
 | 
				
			||||||
 | 
					  PRIMARY KEY (`id`)
 | 
				
			||||||
 | 
					) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='节点分组';
 | 
				
			||||||
 | 
					CREATE TABLE `edgeNodeIPAddresses` (
 | 
				
			||||||
 | 
					  `id` int(11) unsigned NOT NULL AUTO_INCREMENT COMMENT 'ID',
 | 
				
			||||||
 | 
					  `nodeId` int(11) unsigned DEFAULT '0' COMMENT '节点ID',
 | 
				
			||||||
 | 
					  `name` varchar(255) DEFAULT NULL COMMENT '名称',
 | 
				
			||||||
 | 
					  `ip` varchar(128) DEFAULT NULL COMMENT 'IP地址',
 | 
				
			||||||
 | 
					  `description` varchar(255) DEFAULT NULL COMMENT '描述',
 | 
				
			||||||
 | 
					  `state` tinyint(1) unsigned DEFAULT '1' COMMENT '状态',
 | 
				
			||||||
 | 
					  `order` int(11) unsigned DEFAULT '0' COMMENT '排序',
 | 
				
			||||||
 | 
					  PRIMARY KEY (`id`),
 | 
				
			||||||
 | 
					  KEY `nodeId` (`nodeId`)
 | 
				
			||||||
 | 
					) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='节点IP地址';
 | 
				
			||||||
 | 
					CREATE TABLE `edgeNodeLogins` (
 | 
				
			||||||
 | 
					  `id` int(11) unsigned NOT NULL AUTO_INCREMENT COMMENT 'ID',
 | 
				
			||||||
 | 
					  `nodeId` int(11) unsigned DEFAULT '0' COMMENT '节点ID',
 | 
				
			||||||
 | 
					  `name` varchar(255) DEFAULT NULL COMMENT '名称',
 | 
				
			||||||
 | 
					  `type` varchar(255) DEFAULT NULL COMMENT '类型:ssh,agent',
 | 
				
			||||||
 | 
					  `params` json DEFAULT NULL COMMENT '配置参数',
 | 
				
			||||||
 | 
					  `state` tinyint(1) unsigned DEFAULT '1' COMMENT '状态',
 | 
				
			||||||
 | 
					  PRIMARY KEY (`id`),
 | 
				
			||||||
 | 
					  KEY `nodeId` (`nodeId`)
 | 
				
			||||||
 | 
					) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='节点登录信息';
 | 
				
			||||||
 | 
					CREATE TABLE `edgeNodeLogs` (
 | 
				
			||||||
 | 
					  `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT 'ID',
 | 
				
			||||||
 | 
					  `role` varchar(64) DEFAULT NULL COMMENT '节点角色',
 | 
				
			||||||
 | 
					  `createdAt` bigint(11) unsigned DEFAULT '0' COMMENT '创建时间',
 | 
				
			||||||
 | 
					  `tag` varchar(255) DEFAULT NULL COMMENT '标签',
 | 
				
			||||||
 | 
					  `description` varchar(1024) DEFAULT NULL COMMENT '描述',
 | 
				
			||||||
 | 
					  `level` varchar(32) DEFAULT NULL COMMENT '级别',
 | 
				
			||||||
 | 
					  `nodeId` int(11) unsigned DEFAULT '0' COMMENT '节点ID',
 | 
				
			||||||
 | 
					  `day` varchar(8) DEFAULT NULL COMMENT '日期',
 | 
				
			||||||
 | 
					  PRIMARY KEY (`id`),
 | 
				
			||||||
 | 
					  KEY `level` (`level`),
 | 
				
			||||||
 | 
					  KEY `day` (`day`),
 | 
				
			||||||
 | 
					  KEY `role_nodeId` (`role`,`nodeId`) USING BTREE
 | 
				
			||||||
 | 
					) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='节点日志';
 | 
				
			||||||
 | 
					CREATE TABLE `edgeNodeRegions` (
 | 
				
			||||||
 | 
					  `id` int(11) unsigned NOT NULL AUTO_INCREMENT COMMENT 'ID',
 | 
				
			||||||
 | 
					  `name` varchar(255) DEFAULT NULL COMMENT '名称',
 | 
				
			||||||
 | 
					  `order` int(11) unsigned DEFAULT '0' COMMENT '排序',
 | 
				
			||||||
 | 
					  `createdAt` bigint(11) unsigned DEFAULT '0' COMMENT '创建时间',
 | 
				
			||||||
 | 
					  `state` tinyint(1) unsigned DEFAULT '1' COMMENT '状态',
 | 
				
			||||||
 | 
					  PRIMARY KEY (`id`)
 | 
				
			||||||
 | 
					) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='节点区域';
 | 
				
			||||||
 | 
					CREATE TABLE `edgeNodes` (
 | 
				
			||||||
 | 
					  `id` int(11) unsigned NOT NULL AUTO_INCREMENT COMMENT 'ID',
 | 
				
			||||||
 | 
					  `adminId` int(11) unsigned DEFAULT '0' COMMENT '管理员ID',
 | 
				
			||||||
 | 
					  `userId` int(11) unsigned DEFAULT '0' COMMENT '用户ID',
 | 
				
			||||||
 | 
					  `isOn` tinyint(1) unsigned DEFAULT '1' COMMENT '是否启用',
 | 
				
			||||||
 | 
					  `uniqueId` varchar(32) DEFAULT NULL COMMENT '节点ID',
 | 
				
			||||||
 | 
					  `secret` varchar(32) DEFAULT NULL COMMENT '密钥',
 | 
				
			||||||
 | 
					  `name` varchar(255) DEFAULT NULL COMMENT '节点名',
 | 
				
			||||||
 | 
					  `code` varchar(255) DEFAULT NULL COMMENT '代号',
 | 
				
			||||||
 | 
					  `clusterId` int(11) unsigned DEFAULT '0' COMMENT '集群ID',
 | 
				
			||||||
 | 
					  `regionId` int(11) unsigned DEFAULT '0' COMMENT '区域ID',
 | 
				
			||||||
 | 
					  `groupId` int(11) unsigned DEFAULT '0' COMMENT '分组ID',
 | 
				
			||||||
 | 
					  `createdAt` bigint(11) unsigned DEFAULT '0' COMMENT '创建时间',
 | 
				
			||||||
 | 
					  `status` json DEFAULT NULL COMMENT '最新的状态',
 | 
				
			||||||
 | 
					  `version` int(11) unsigned DEFAULT '0' COMMENT '当前版本号',
 | 
				
			||||||
 | 
					  `latestVersion` int(11) unsigned DEFAULT '0' COMMENT '最后版本号',
 | 
				
			||||||
 | 
					  `installDir` varchar(512) DEFAULT NULL COMMENT '安装目录',
 | 
				
			||||||
 | 
					  `isInstalled` tinyint(1) unsigned DEFAULT '0' COMMENT '是否已安装',
 | 
				
			||||||
 | 
					  `installStatus` json DEFAULT NULL COMMENT '安装状态',
 | 
				
			||||||
 | 
					  `state` tinyint(1) unsigned DEFAULT '1' COMMENT '状态',
 | 
				
			||||||
 | 
					  `connectedAPINodes` json DEFAULT NULL COMMENT '当前连接的API节点',
 | 
				
			||||||
 | 
					  `maxCPU` int(4) unsigned DEFAULT '0' COMMENT '可以使用的最多CPU',
 | 
				
			||||||
 | 
					  PRIMARY KEY (`id`),
 | 
				
			||||||
 | 
					  KEY `uniqueId` (`uniqueId`),
 | 
				
			||||||
 | 
					  KEY `clusterId` (`clusterId`),
 | 
				
			||||||
 | 
					  KEY `groupId` (`groupId`),
 | 
				
			||||||
 | 
					  KEY `regionId` (`regionId`)
 | 
				
			||||||
 | 
					) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='节点';
 | 
				
			||||||
 | 
					CREATE TABLE `edgeOrigins` (
 | 
				
			||||||
 | 
					  `id` int(11) unsigned NOT NULL AUTO_INCREMENT COMMENT 'ID',
 | 
				
			||||||
 | 
					  `adminId` int(11) unsigned DEFAULT '0' COMMENT '管理员ID',
 | 
				
			||||||
 | 
					  `userId` int(11) unsigned DEFAULT '0' COMMENT '用户ID',
 | 
				
			||||||
 | 
					  `isOn` tinyint(1) unsigned DEFAULT '1' COMMENT '是否启用',
 | 
				
			||||||
 | 
					  `name` varchar(255) DEFAULT NULL COMMENT '名称',
 | 
				
			||||||
 | 
					  `version` int(11) unsigned DEFAULT '0' COMMENT '版本',
 | 
				
			||||||
 | 
					  `addr` json DEFAULT NULL COMMENT '地址',
 | 
				
			||||||
 | 
					  `description` varchar(512) DEFAULT NULL COMMENT '描述',
 | 
				
			||||||
 | 
					  `code` varchar(255) DEFAULT NULL COMMENT '代号',
 | 
				
			||||||
 | 
					  `weight` int(11) unsigned DEFAULT '0' COMMENT '权重',
 | 
				
			||||||
 | 
					  `connTimeout` json DEFAULT NULL COMMENT '连接超时',
 | 
				
			||||||
 | 
					  `readTimeout` json DEFAULT NULL COMMENT '读超时',
 | 
				
			||||||
 | 
					  `idleTimeout` json DEFAULT NULL COMMENT '空闲连接超时',
 | 
				
			||||||
 | 
					  `maxFails` int(11) unsigned DEFAULT '0' COMMENT '最多失败次数',
 | 
				
			||||||
 | 
					  `maxConns` int(11) unsigned DEFAULT '0' COMMENT '最大并发连接数',
 | 
				
			||||||
 | 
					  `maxIdleConns` int(11) unsigned DEFAULT '0' COMMENT '最多空闲连接数',
 | 
				
			||||||
 | 
					  `httpRequestURI` varchar(1024) DEFAULT NULL COMMENT '转发后的请求URI',
 | 
				
			||||||
 | 
					  `httpRequestHeader` json DEFAULT NULL COMMENT '请求Header配置',
 | 
				
			||||||
 | 
					  `httpResponseHeader` json DEFAULT NULL COMMENT '响应Header配置',
 | 
				
			||||||
 | 
					  `host` varchar(255) DEFAULT NULL COMMENT '自定义主机名',
 | 
				
			||||||
 | 
					  `healthCheck` json DEFAULT NULL COMMENT '健康检查设置',
 | 
				
			||||||
 | 
					  `cert` json DEFAULT NULL COMMENT '证书设置',
 | 
				
			||||||
 | 
					  `ftp` json DEFAULT NULL COMMENT 'FTP相关设置',
 | 
				
			||||||
 | 
					  `createdAt` bigint(11) unsigned DEFAULT '0' COMMENT '创建时间',
 | 
				
			||||||
 | 
					  `state` tinyint(1) unsigned DEFAULT '1' COMMENT '状态',
 | 
				
			||||||
 | 
					  PRIMARY KEY (`id`)
 | 
				
			||||||
 | 
					) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='源站';
 | 
				
			||||||
 | 
					CREATE TABLE `edgeProviders` (
 | 
				
			||||||
 | 
					  `id` int(11) unsigned NOT NULL AUTO_INCREMENT COMMENT 'ID',
 | 
				
			||||||
 | 
					  `username` varchar(64) DEFAULT NULL COMMENT '用户名',
 | 
				
			||||||
 | 
					  `password` varchar(32) DEFAULT NULL COMMENT '密码',
 | 
				
			||||||
 | 
					  `fullname` varchar(64) DEFAULT NULL COMMENT '真实姓名',
 | 
				
			||||||
 | 
					  `createdAt` bigint(11) unsigned DEFAULT '0' COMMENT '创建时间',
 | 
				
			||||||
 | 
					  `updatedAt` bigint(11) unsigned DEFAULT '0' COMMENT '修改时间',
 | 
				
			||||||
 | 
					  `state` tinyint(1) unsigned DEFAULT '1' COMMENT '状态',
 | 
				
			||||||
 | 
					  PRIMARY KEY (`id`)
 | 
				
			||||||
 | 
					) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='供应商';
 | 
				
			||||||
 | 
					CREATE TABLE `edgeReverseProxies` (
 | 
				
			||||||
 | 
					  `id` int(11) unsigned NOT NULL AUTO_INCREMENT COMMENT 'ID',
 | 
				
			||||||
 | 
					  `adminId` int(11) unsigned DEFAULT '0' COMMENT '管理员ID',
 | 
				
			||||||
 | 
					  `userId` int(11) unsigned DEFAULT '0' COMMENT '用户ID',
 | 
				
			||||||
 | 
					  `templateId` int(11) unsigned DEFAULT '0' COMMENT '模版ID',
 | 
				
			||||||
 | 
					  `isOn` tinyint(1) unsigned DEFAULT '1' COMMENT '是否启用',
 | 
				
			||||||
 | 
					  `scheduling` json DEFAULT NULL COMMENT '调度算法',
 | 
				
			||||||
 | 
					  `primaryOrigins` json DEFAULT NULL COMMENT '主要源站',
 | 
				
			||||||
 | 
					  `backupOrigins` json DEFAULT NULL COMMENT '备用源站',
 | 
				
			||||||
 | 
					  `stripPrefix` varchar(255) DEFAULT NULL COMMENT '去除URL前缀',
 | 
				
			||||||
 | 
					  `requestHost` varchar(255) DEFAULT NULL COMMENT '请求Host',
 | 
				
			||||||
 | 
					  `requestURI` varchar(1024) DEFAULT NULL COMMENT '请求URI',
 | 
				
			||||||
 | 
					  `autoFlush` tinyint(1) unsigned DEFAULT '0' COMMENT '是否自动刷新缓冲区',
 | 
				
			||||||
 | 
					  `state` tinyint(1) unsigned DEFAULT '1' COMMENT '状态',
 | 
				
			||||||
 | 
					  `createdAt` bigint(11) unsigned DEFAULT '0' COMMENT '创建时间',
 | 
				
			||||||
 | 
					  PRIMARY KEY (`id`)
 | 
				
			||||||
 | 
					) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='反向代理配置';
 | 
				
			||||||
 | 
					CREATE TABLE `edgeSSLCertGroups` (
 | 
				
			||||||
 | 
					  `id` int(11) unsigned NOT NULL AUTO_INCREMENT COMMENT 'ID',
 | 
				
			||||||
 | 
					  `adminId` int(11) unsigned DEFAULT '0' COMMENT '管理员ID',
 | 
				
			||||||
 | 
					  `userId` int(11) unsigned DEFAULT '0' COMMENT '用户ID',
 | 
				
			||||||
 | 
					  `name` varchar(255) DEFAULT NULL COMMENT '分组名',
 | 
				
			||||||
 | 
					  `order` int(11) unsigned DEFAULT '0' COMMENT '分组排序',
 | 
				
			||||||
 | 
					  `state` tinyint(1) unsigned DEFAULT '0' COMMENT '状态',
 | 
				
			||||||
 | 
					  `createdAt` bigint(11) unsigned DEFAULT '0' COMMENT '创建时间',
 | 
				
			||||||
 | 
					  PRIMARY KEY (`id`)
 | 
				
			||||||
 | 
					) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='证书分组';
 | 
				
			||||||
 | 
					CREATE TABLE `edgeSSLCerts` (
 | 
				
			||||||
 | 
					  `id` int(11) unsigned NOT NULL AUTO_INCREMENT COMMENT 'ID',
 | 
				
			||||||
 | 
					  `adminId` int(11) unsigned DEFAULT '0' COMMENT '管理员ID',
 | 
				
			||||||
 | 
					  `userId` int(11) unsigned DEFAULT '0' COMMENT '用户ID',
 | 
				
			||||||
 | 
					  `state` tinyint(1) unsigned DEFAULT '1' COMMENT '状态',
 | 
				
			||||||
 | 
					  `createdAt` bigint(11) unsigned DEFAULT '0' COMMENT '创建时间',
 | 
				
			||||||
 | 
					  `updatedAt` bigint(11) unsigned DEFAULT '0' COMMENT '修改时间',
 | 
				
			||||||
 | 
					  `isOn` tinyint(1) unsigned DEFAULT '1' COMMENT '是否启用',
 | 
				
			||||||
 | 
					  `name` varchar(255) DEFAULT NULL COMMENT '证书名',
 | 
				
			||||||
 | 
					  `description` varchar(1024) DEFAULT NULL COMMENT '描述',
 | 
				
			||||||
 | 
					  `certData` blob COMMENT '证书内容',
 | 
				
			||||||
 | 
					  `keyData` blob COMMENT '密钥内容',
 | 
				
			||||||
 | 
					  `serverName` varchar(255) DEFAULT NULL COMMENT '证书使用的主机名',
 | 
				
			||||||
 | 
					  `isCA` tinyint(1) unsigned DEFAULT '0' COMMENT '是否为CA证书',
 | 
				
			||||||
 | 
					  `groupIds` json DEFAULT NULL COMMENT '证书分组',
 | 
				
			||||||
 | 
					  `timeBeginAt` bigint(11) unsigned DEFAULT '0' COMMENT '开始时间',
 | 
				
			||||||
 | 
					  `timeEndAt` bigint(11) unsigned DEFAULT '0' COMMENT '结束时间',
 | 
				
			||||||
 | 
					  `dnsNames` json DEFAULT NULL COMMENT 'DNS名称列表',
 | 
				
			||||||
 | 
					  `commonNames` json DEFAULT NULL COMMENT '发行单位列表',
 | 
				
			||||||
 | 
					  PRIMARY KEY (`id`)
 | 
				
			||||||
 | 
					) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='SSL证书';
 | 
				
			||||||
 | 
					CREATE TABLE `edgeSSLPolicies` (
 | 
				
			||||||
 | 
					  `id` int(11) unsigned NOT NULL AUTO_INCREMENT COMMENT 'ID',
 | 
				
			||||||
 | 
					  `adminId` int(11) unsigned DEFAULT '0' COMMENT '管理员ID',
 | 
				
			||||||
 | 
					  `userId` int(11) unsigned DEFAULT '0' COMMENT '用户ID',
 | 
				
			||||||
 | 
					  `isOn` tinyint(1) unsigned DEFAULT '1' COMMENT '是否启用',
 | 
				
			||||||
 | 
					  `certs` json DEFAULT NULL COMMENT '证书列表',
 | 
				
			||||||
 | 
					  `clientCACerts` json DEFAULT NULL COMMENT '客户端证书',
 | 
				
			||||||
 | 
					  `clientAuthType` int(11) unsigned DEFAULT '0' COMMENT '客户端认证类型',
 | 
				
			||||||
 | 
					  `minVersion` varchar(32) DEFAULT NULL COMMENT '支持的SSL最小版本',
 | 
				
			||||||
 | 
					  `cipherSuitesIsOn` tinyint(1) unsigned DEFAULT '0' COMMENT '是否自定义加密算法套件',
 | 
				
			||||||
 | 
					  `cipherSuites` json DEFAULT NULL COMMENT '加密算法套件',
 | 
				
			||||||
 | 
					  `hsts` json DEFAULT NULL COMMENT 'HSTS设置',
 | 
				
			||||||
 | 
					  `http2Enabled` tinyint(1) unsigned DEFAULT '1' COMMENT '是否启用HTTP/2',
 | 
				
			||||||
 | 
					  `state` tinyint(1) unsigned DEFAULT '1' COMMENT '状态',
 | 
				
			||||||
 | 
					  `createdAt` bigint(11) unsigned DEFAULT '0' COMMENT '创建时间',
 | 
				
			||||||
 | 
					  PRIMARY KEY (`id`)
 | 
				
			||||||
 | 
					) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='SSL配置策略';
 | 
				
			||||||
 | 
					CREATE TABLE `edgeServerGroups` (
 | 
				
			||||||
 | 
					  `id` int(11) unsigned NOT NULL AUTO_INCREMENT COMMENT 'ID',
 | 
				
			||||||
 | 
					  `adminId` int(11) unsigned DEFAULT '0' COMMENT '管理员ID',
 | 
				
			||||||
 | 
					  `userId` int(11) unsigned DEFAULT '0' COMMENT '用户ID',
 | 
				
			||||||
 | 
					  `name` varchar(255) DEFAULT NULL COMMENT '名称',
 | 
				
			||||||
 | 
					  `order` int(11) unsigned DEFAULT '0' COMMENT '排序',
 | 
				
			||||||
 | 
					  `createdAt` bigint(11) unsigned DEFAULT '0' COMMENT '创建时间',
 | 
				
			||||||
 | 
					  `state` tinyint(1) unsigned DEFAULT '1' COMMENT '状态',
 | 
				
			||||||
 | 
					  PRIMARY KEY (`id`)
 | 
				
			||||||
 | 
					) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='服务分组';
 | 
				
			||||||
 | 
					CREATE TABLE `edgeServers` (
 | 
				
			||||||
 | 
					  `id` int(11) unsigned NOT NULL AUTO_INCREMENT COMMENT 'ID',
 | 
				
			||||||
 | 
					  `isOn` tinyint(1) unsigned DEFAULT '1' COMMENT '是否启用',
 | 
				
			||||||
 | 
					  `userId` int(11) unsigned DEFAULT '0' COMMENT '用户ID',
 | 
				
			||||||
 | 
					  `adminId` int(11) unsigned DEFAULT '0' COMMENT '管理员ID',
 | 
				
			||||||
 | 
					  `type` varchar(64) DEFAULT NULL COMMENT '服务类型',
 | 
				
			||||||
 | 
					  `name` varchar(255) DEFAULT NULL COMMENT '名称',
 | 
				
			||||||
 | 
					  `description` varchar(512) DEFAULT NULL COMMENT '描述',
 | 
				
			||||||
 | 
					  `serverNames` json DEFAULT NULL COMMENT '域名列表',
 | 
				
			||||||
 | 
					  `http` json DEFAULT NULL COMMENT 'HTTP配置',
 | 
				
			||||||
 | 
					  `https` json DEFAULT NULL COMMENT 'HTTPS配置',
 | 
				
			||||||
 | 
					  `tcp` json DEFAULT NULL COMMENT 'TCP配置',
 | 
				
			||||||
 | 
					  `tls` json DEFAULT NULL COMMENT 'TLS配置',
 | 
				
			||||||
 | 
					  `unix` json DEFAULT NULL COMMENT 'Unix配置',
 | 
				
			||||||
 | 
					  `udp` json DEFAULT NULL COMMENT 'UDP配置',
 | 
				
			||||||
 | 
					  `webId` int(11) unsigned DEFAULT '0' COMMENT 'WEB配置',
 | 
				
			||||||
 | 
					  `reverseProxy` json DEFAULT NULL COMMENT '反向代理配置',
 | 
				
			||||||
 | 
					  `groupIds` json DEFAULT NULL COMMENT '分组ID列表',
 | 
				
			||||||
 | 
					  `config` json DEFAULT NULL COMMENT '服务配置,自动生成',
 | 
				
			||||||
 | 
					  `configMd5` varchar(32) DEFAULT NULL COMMENT 'Md5',
 | 
				
			||||||
 | 
					  `clusterId` int(11) unsigned DEFAULT '0' COMMENT '集群ID',
 | 
				
			||||||
 | 
					  `includeNodes` json DEFAULT NULL COMMENT '部署条件',
 | 
				
			||||||
 | 
					  `excludeNodes` json DEFAULT NULL COMMENT '节点排除条件',
 | 
				
			||||||
 | 
					  `version` int(11) unsigned DEFAULT '0' COMMENT '版本号',
 | 
				
			||||||
 | 
					  `createdAt` bigint(11) unsigned DEFAULT '0' COMMENT '创建时间',
 | 
				
			||||||
 | 
					  `state` tinyint(1) unsigned DEFAULT '1' COMMENT '状态',
 | 
				
			||||||
 | 
					  PRIMARY KEY (`id`),
 | 
				
			||||||
 | 
					  KEY `userId` (`userId`),
 | 
				
			||||||
 | 
					  KEY `adminId` (`adminId`),
 | 
				
			||||||
 | 
					  KEY `isUpdating_state` (`state`) USING BTREE
 | 
				
			||||||
 | 
					) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='服务';
 | 
				
			||||||
 | 
					CREATE TABLE `edgeSysEvents` (
 | 
				
			||||||
 | 
					  `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT 'ID',
 | 
				
			||||||
 | 
					  `type` varchar(255) DEFAULT NULL COMMENT '类型',
 | 
				
			||||||
 | 
					  `params` json DEFAULT NULL COMMENT '参数',
 | 
				
			||||||
 | 
					  `createdAt` bigint(11) unsigned DEFAULT '0' COMMENT '创建时间',
 | 
				
			||||||
 | 
					  PRIMARY KEY (`id`)
 | 
				
			||||||
 | 
					) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='系统事件';
 | 
				
			||||||
 | 
					CREATE TABLE `edgeSysLockers` (
 | 
				
			||||||
 | 
					  `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT 'ID',
 | 
				
			||||||
 | 
					  `key` varchar(255) DEFAULT NULL COMMENT '键值',
 | 
				
			||||||
 | 
					  `version` bigint(20) unsigned DEFAULT '0' COMMENT '版本号',
 | 
				
			||||||
 | 
					  `timeoutAt` bigint(11) unsigned DEFAULT '0' COMMENT '超时时间',
 | 
				
			||||||
 | 
					  PRIMARY KEY (`id`),
 | 
				
			||||||
 | 
					  UNIQUE KEY `key` (`key`)
 | 
				
			||||||
 | 
					) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='并发锁';
 | 
				
			||||||
 | 
					CREATE TABLE `edgeSysSettings` (
 | 
				
			||||||
 | 
					  `id` int(11) unsigned NOT NULL AUTO_INCREMENT COMMENT 'ID',
 | 
				
			||||||
 | 
					  `userId` int(11) unsigned DEFAULT '0' COMMENT '用户ID',
 | 
				
			||||||
 | 
					  `code` varchar(255) DEFAULT NULL COMMENT '代号',
 | 
				
			||||||
 | 
					  `value` json DEFAULT NULL COMMENT '配置值',
 | 
				
			||||||
 | 
					  PRIMARY KEY (`id`),
 | 
				
			||||||
 | 
					  UNIQUE KEY `code` (`code`)
 | 
				
			||||||
 | 
					) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='系统配置';
 | 
				
			||||||
 | 
					CREATE TABLE `edgeTCPFirewallPolicies` (
 | 
				
			||||||
 | 
					  `id` int(11) unsigned NOT NULL AUTO_INCREMENT COMMENT 'ID',
 | 
				
			||||||
 | 
					  `adminId` int(11) DEFAULT NULL COMMENT '管理员ID',
 | 
				
			||||||
 | 
					  `userId` int(11) unsigned DEFAULT '0' COMMENT '用户ID',
 | 
				
			||||||
 | 
					  `templateId` int(11) unsigned DEFAULT '0' COMMENT '模版ID',
 | 
				
			||||||
 | 
					  PRIMARY KEY (`id`)
 | 
				
			||||||
 | 
					) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='TCP防火墙';
 | 
				
			||||||
 | 
					CREATE TABLE `edgeUsers` (
 | 
				
			||||||
 | 
					  `id` int(11) unsigned NOT NULL AUTO_INCREMENT COMMENT 'ID',
 | 
				
			||||||
 | 
					  `username` varchar(64) DEFAULT NULL COMMENT '用户名',
 | 
				
			||||||
 | 
					  `password` varchar(32) DEFAULT NULL COMMENT '密码',
 | 
				
			||||||
 | 
					  `fullname` varchar(64) DEFAULT NULL COMMENT '真实姓名',
 | 
				
			||||||
 | 
					  `createdAt` bigint(11) unsigned DEFAULT '0' COMMENT '创建时间',
 | 
				
			||||||
 | 
					  `updatedAt` bigint(11) unsigned DEFAULT '0' COMMENT '修改时间',
 | 
				
			||||||
 | 
					  `state` tinyint(1) unsigned DEFAULT '1' COMMENT '状态',
 | 
				
			||||||
 | 
					  PRIMARY KEY (`id`)
 | 
				
			||||||
 | 
					) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='用户';
 | 
				
			||||||
 | 
					CREATE TABLE `edgeVersions` (
 | 
				
			||||||
 | 
					  `id` bigint(16) unsigned NOT NULL AUTO_INCREMENT COMMENT 'ID',
 | 
				
			||||||
 | 
					  `version` varchar(64) DEFAULT NULL,
 | 
				
			||||||
 | 
					  PRIMARY KEY (`id`)
 | 
				
			||||||
 | 
					) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='数据库结构版本';
 | 
				
			||||||
@@ -1,18 +1,47 @@
 | 
				
			|||||||
package main
 | 
					package main
 | 
				
			||||||
 | 
					
 | 
				
			||||||
import (
 | 
					import (
 | 
				
			||||||
 | 
						"encoding/json"
 | 
				
			||||||
	"github.com/TeaOSLab/EdgeAPI/internal/apps"
 | 
						"github.com/TeaOSLab/EdgeAPI/internal/apps"
 | 
				
			||||||
	teaconst "github.com/TeaOSLab/EdgeAPI/internal/const"
 | 
						teaconst "github.com/TeaOSLab/EdgeAPI/internal/const"
 | 
				
			||||||
	"github.com/TeaOSLab/EdgeAPI/internal/nodes"
 | 
						"github.com/TeaOSLab/EdgeAPI/internal/nodes"
 | 
				
			||||||
 | 
						"github.com/TeaOSLab/EdgeAPI/internal/setup"
 | 
				
			||||||
	_ "github.com/TeaOSLab/EdgeAPI/internal/tasks"
 | 
						_ "github.com/TeaOSLab/EdgeAPI/internal/tasks"
 | 
				
			||||||
 | 
						"github.com/iwind/TeaGo/Tea"
 | 
				
			||||||
	_ "github.com/iwind/TeaGo/bootstrap"
 | 
						_ "github.com/iwind/TeaGo/bootstrap"
 | 
				
			||||||
 | 
						"github.com/iwind/TeaGo/maps"
 | 
				
			||||||
 | 
						"log"
 | 
				
			||||||
 | 
						"os"
 | 
				
			||||||
)
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func main() {
 | 
					func main() {
 | 
				
			||||||
 | 
						if !Tea.IsTesting() {
 | 
				
			||||||
 | 
							Tea.Env = "prod"
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
	app := apps.NewAppCmd()
 | 
						app := apps.NewAppCmd()
 | 
				
			||||||
	app.Version(teaconst.Version)
 | 
						app.Version(teaconst.Version)
 | 
				
			||||||
	app.Product(teaconst.ProductName)
 | 
						app.Product(teaconst.ProductName)
 | 
				
			||||||
	app.Usage(teaconst.ProcessName + " [start|stop|restart]")
 | 
						app.Usage(teaconst.ProcessName + " [start|stop|restart|setup]")
 | 
				
			||||||
 | 
						app.On("setup", func() {
 | 
				
			||||||
 | 
							setupCmd := setup.NewSetupFromCmd()
 | 
				
			||||||
 | 
							err := setupCmd.Run()
 | 
				
			||||||
 | 
							result := maps.Map{}
 | 
				
			||||||
 | 
							if err != nil {
 | 
				
			||||||
 | 
								result["isOk"] = false
 | 
				
			||||||
 | 
								result["error"] = err.Error()
 | 
				
			||||||
 | 
							} else {
 | 
				
			||||||
 | 
								result["isOk"] = true
 | 
				
			||||||
 | 
								result["adminNodeId"] = setupCmd.AdminNodeId
 | 
				
			||||||
 | 
								result["adminNodeSecret"] = setupCmd.AdminNodeSecret
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							resultJSON, err := json.Marshal(result)
 | 
				
			||||||
 | 
							if err != nil {
 | 
				
			||||||
 | 
								log.Fatal(err.Error())
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							_, _ = os.Stdout.Write(resultJSON)
 | 
				
			||||||
 | 
						})
 | 
				
			||||||
	app.Run(func() {
 | 
						app.Run(func() {
 | 
				
			||||||
		nodes.NewAPINode().Start()
 | 
							nodes.NewAPINode().Start()
 | 
				
			||||||
	})
 | 
						})
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										103
									
								
								cmd/sql-generate/main.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										103
									
								
								cmd/sql-generate/main.go
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,103 @@
 | 
				
			|||||||
 | 
					package main
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import (
 | 
				
			||||||
 | 
						"bytes"
 | 
				
			||||||
 | 
						"flag"
 | 
				
			||||||
 | 
						"fmt"
 | 
				
			||||||
 | 
						"github.com/iwind/TeaGo/Tea"
 | 
				
			||||||
 | 
						_ "github.com/iwind/TeaGo/bootstrap"
 | 
				
			||||||
 | 
						"github.com/iwind/TeaGo/logs"
 | 
				
			||||||
 | 
						"go/format"
 | 
				
			||||||
 | 
						"io/ioutil"
 | 
				
			||||||
 | 
						"os"
 | 
				
			||||||
 | 
						"path/filepath"
 | 
				
			||||||
 | 
						"strings"
 | 
				
			||||||
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func main() {
 | 
				
			||||||
 | 
						var dir string
 | 
				
			||||||
 | 
						flag.StringVar(&dir, "dir", "", "SQL dir")
 | 
				
			||||||
 | 
						flag.Parse()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if len(dir) == 0 {
 | 
				
			||||||
 | 
							fmt.Println("[ERROR]'dir' should not be empty")
 | 
				
			||||||
 | 
							return
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						sourceDir := filepath.Dir(Tea.Root)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						// full
 | 
				
			||||||
 | 
						fullSQLFile := dir + "/full.sql"
 | 
				
			||||||
 | 
						_, err := os.Stat(fullSQLFile)
 | 
				
			||||||
 | 
						if err != nil {
 | 
				
			||||||
 | 
							if os.IsNotExist(err) {
 | 
				
			||||||
 | 
								fmt.Println("[ERROR]'full.sql' not found")
 | 
				
			||||||
 | 
								return
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							fmt.Println("[ERROR]checking 'full.sql' failed: " + err.Error())
 | 
				
			||||||
 | 
							return
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						matches, err := filepath.Glob(dir + "/*.sql")
 | 
				
			||||||
 | 
						if err != nil {
 | 
				
			||||||
 | 
							fmt.Println("[ERROR]" + err.Error())
 | 
				
			||||||
 | 
							return
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						versionsCode := "// generated\npackage sqls\n\nvar SQLVersions = []map[string]string{"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						for _, match := range matches {
 | 
				
			||||||
 | 
							baseName := filepath.Base(match)
 | 
				
			||||||
 | 
							logs.Println("reading " + baseName + " ...")
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							data, err := ioutil.ReadFile(match)
 | 
				
			||||||
 | 
							if err != nil {
 | 
				
			||||||
 | 
								fmt.Println("[ERROR]" + err.Error())
 | 
				
			||||||
 | 
								return
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							version := baseName[:strings.LastIndex(baseName, ".")]
 | 
				
			||||||
 | 
							versionsCode += "\n" + `{ "version": "` + version + `", "sql": SQL_` + version + ` },`
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							code := "// generated\npackage sqls \n\n"
 | 
				
			||||||
 | 
							lines := bytes.Split(data, []byte{'\n'})
 | 
				
			||||||
 | 
							for index, line := range lines {
 | 
				
			||||||
 | 
								if index == 0 {
 | 
				
			||||||
 | 
									code += "var SQL_" + version + " = "
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
								code += `"` + string(line) + `\n"`
 | 
				
			||||||
 | 
								if index != len(lines)-1 {
 | 
				
			||||||
 | 
									code += "+"
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
								code += "\n"
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							code += "\n"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							codeBytes, err := format.Source([]byte(code))
 | 
				
			||||||
 | 
							if err != nil {
 | 
				
			||||||
 | 
								fmt.Println("[ERROR]" + err.Error())
 | 
				
			||||||
 | 
								return
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							fmt.Println("writing sql_" + version + ".go ...")
 | 
				
			||||||
 | 
							err = ioutil.WriteFile(sourceDir+"/internal/setup/sqls/sql_"+version+".go", codeBytes, 0666)
 | 
				
			||||||
 | 
							if err != nil {
 | 
				
			||||||
 | 
								fmt.Println("[ERROR]" + err.Error())
 | 
				
			||||||
 | 
								return
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							fmt.Println("ok")
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						versionsCode += "\n}"
 | 
				
			||||||
 | 
						versionsCodeBytes, err := format.Source([]byte(versionsCode))
 | 
				
			||||||
 | 
						if err != nil {
 | 
				
			||||||
 | 
							fmt.Println("[ERROR]" + err.Error())
 | 
				
			||||||
 | 
							return
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						fmt.Println("writing sqls.go ...")
 | 
				
			||||||
 | 
						err = ioutil.WriteFile(sourceDir+"/internal/setup/sqls/sqls.go", versionsCodeBytes, 0666)
 | 
				
			||||||
 | 
						if err != nil {
 | 
				
			||||||
 | 
							fmt.Println("[ERROR]" + err.Error())
 | 
				
			||||||
 | 
							return
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						fmt.Println("ok")
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
							
								
								
									
										1
									
								
								dist/.gitignore
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										1
									
								
								dist/.gitignore
									
									
									
									
										vendored
									
									
										Normal file
									
								
							@@ -0,0 +1 @@
 | 
				
			|||||||
 | 
					*.zip
 | 
				
			||||||
							
								
								
									
										
											BIN
										
									
								
								dist/edge-api/bin/edge-api
									
									
									
									
										vendored
									
									
										Executable file
									
								
							
							
						
						
									
										
											BIN
										
									
								
								dist/edge-api/bin/edge-api
									
									
									
									
										vendored
									
									
										Executable file
									
								
							
										
											Binary file not shown.
										
									
								
							
							
								
								
									
										2
									
								
								dist/edge-api/configs/api.template.yaml
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										2
									
								
								dist/edge-api/configs/api.template.yaml
									
									
									
									
										vendored
									
									
										Normal file
									
								
							@@ -0,0 +1,2 @@
 | 
				
			|||||||
 | 
					nodeId: "${nodeId}"
 | 
				
			||||||
 | 
					secret: "${secret}"
 | 
				
			||||||
							
								
								
									
										11
									
								
								dist/edge-api/configs/db.template.yaml
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										11
									
								
								dist/edge-api/configs/db.template.yaml
									
									
									
									
										vendored
									
									
										Normal file
									
								
							@@ -0,0 +1,11 @@
 | 
				
			|||||||
 | 
					default:
 | 
				
			||||||
 | 
					  db: "prod"
 | 
				
			||||||
 | 
					  prefix: ""
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					dbs:
 | 
				
			||||||
 | 
					  prod:
 | 
				
			||||||
 | 
					    driver: "mysql"
 | 
				
			||||||
 | 
					    dsn: "root:123456@tcp(127.0.0.1:3306)/db_edge?charset=utf8mb4&timeout=30s"
 | 
				
			||||||
 | 
					    prefix: "edge"
 | 
				
			||||||
 | 
					    models:
 | 
				
			||||||
 | 
					      package: internal/web/models
 | 
				
			||||||
							
								
								
									
										1
									
								
								dist/edge-api/deploy/.gitignore
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										1
									
								
								dist/edge-api/deploy/.gitignore
									
									
									
									
										vendored
									
									
										Normal file
									
								
							@@ -0,0 +1 @@
 | 
				
			|||||||
 | 
					*.zip
 | 
				
			||||||
							
								
								
									
										1
									
								
								dist/edge-api/installers/.gitignore
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										1
									
								
								dist/edge-api/installers/.gitignore
									
									
									
									
										vendored
									
									
										Normal file
									
								
							@@ -0,0 +1 @@
 | 
				
			|||||||
 | 
					installer-*
 | 
				
			||||||
							
								
								
									
										2
									
								
								go.mod
									
									
									
									
									
								
							
							
						
						
									
										2
									
								
								go.mod
									
									
									
									
									
								
							@@ -9,7 +9,7 @@ require (
 | 
				
			|||||||
	github.com/go-sql-driver/mysql v1.5.0
 | 
						github.com/go-sql-driver/mysql v1.5.0
 | 
				
			||||||
	github.com/go-yaml/yaml v2.1.0+incompatible
 | 
						github.com/go-yaml/yaml v2.1.0+incompatible
 | 
				
			||||||
	github.com/golang/protobuf v1.4.2
 | 
						github.com/golang/protobuf v1.4.2
 | 
				
			||||||
	github.com/iwind/TeaGo v0.0.0-20201010005321-430e836dee8a
 | 
						github.com/iwind/TeaGo v0.0.0-20201013075636-119886e49c04
 | 
				
			||||||
	github.com/pkg/sftp v1.12.0
 | 
						github.com/pkg/sftp v1.12.0
 | 
				
			||||||
	golang.org/x/crypto v0.0.0-20200820211705-5c72a883971a
 | 
						golang.org/x/crypto v0.0.0-20200820211705-5c72a883971a
 | 
				
			||||||
	google.golang.org/grpc v1.32.0
 | 
						google.golang.org/grpc v1.32.0
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										2
									
								
								go.sum
									
									
									
									
									
								
							
							
						
						
									
										2
									
								
								go.sum
									
									
									
									
									
								
							@@ -64,6 +64,8 @@ github.com/iwind/TeaGo v0.0.0-20201009121920-5ab994526a80 h1:GFObMYO7mqeE+2n/4AA
 | 
				
			|||||||
github.com/iwind/TeaGo v0.0.0-20201009121920-5ab994526a80/go.mod h1:KU4mS7QNiZ7QWEuDBk1zw0/Q2LrAPZv3tycEFBsuUwc=
 | 
					github.com/iwind/TeaGo v0.0.0-20201009121920-5ab994526a80/go.mod h1:KU4mS7QNiZ7QWEuDBk1zw0/Q2LrAPZv3tycEFBsuUwc=
 | 
				
			||||||
github.com/iwind/TeaGo v0.0.0-20201010005321-430e836dee8a h1:sO6uDbQOEe6/tIB3o31vn6eD/JmkKGErKgcOA/Cpb+Q=
 | 
					github.com/iwind/TeaGo v0.0.0-20201010005321-430e836dee8a h1:sO6uDbQOEe6/tIB3o31vn6eD/JmkKGErKgcOA/Cpb+Q=
 | 
				
			||||||
github.com/iwind/TeaGo v0.0.0-20201010005321-430e836dee8a/go.mod h1:KU4mS7QNiZ7QWEuDBk1zw0/Q2LrAPZv3tycEFBsuUwc=
 | 
					github.com/iwind/TeaGo v0.0.0-20201010005321-430e836dee8a/go.mod h1:KU4mS7QNiZ7QWEuDBk1zw0/Q2LrAPZv3tycEFBsuUwc=
 | 
				
			||||||
 | 
					github.com/iwind/TeaGo v0.0.0-20201013075636-119886e49c04 h1:QXRSB5x9pJFZLC7dCxDx9CRXAx9en1Uk3QdfzC8wMC8=
 | 
				
			||||||
 | 
					github.com/iwind/TeaGo v0.0.0-20201013075636-119886e49c04/go.mod h1:KU4mS7QNiZ7QWEuDBk1zw0/Q2LrAPZv3tycEFBsuUwc=
 | 
				
			||||||
github.com/json-iterator/go v1.1.10 h1:Kz6Cvnvv2wGdaG/V8yMvfkmNiXq9Ya2KUv4rouJJr68=
 | 
					github.com/json-iterator/go v1.1.10 h1:Kz6Cvnvv2wGdaG/V8yMvfkmNiXq9Ya2KUv4rouJJr68=
 | 
				
			||||||
github.com/json-iterator/go v1.1.10/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4=
 | 
					github.com/json-iterator/go v1.1.10/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4=
 | 
				
			||||||
github.com/kr/fs v0.1.0 h1:Jskdu9ieNAYnjxsi0LbQp1ulIKZV1LAFgK1tWhpZgl8=
 | 
					github.com/kr/fs v0.1.0 h1:Jskdu9ieNAYnjxsi0LbQp1ulIKZV1LAFgK1tWhpZgl8=
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -52,3 +52,12 @@ func (this *APIConfig) SetNumberId(numberId int64) {
 | 
				
			|||||||
func (this *APIConfig) NumberId() int64 {
 | 
					func (this *APIConfig) NumberId() int64 {
 | 
				
			||||||
	return this.numberId
 | 
						return this.numberId
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// 保存到文件
 | 
				
			||||||
 | 
					func (this *APIConfig) WriteFile(path string) error {
 | 
				
			||||||
 | 
						data, err := yaml.Marshal(this)
 | 
				
			||||||
 | 
						if err != nil {
 | 
				
			||||||
 | 
							return err
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						return ioutil.WriteFile(path, data, 0666)
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -1,9 +1,12 @@
 | 
				
			|||||||
package models
 | 
					package models
 | 
				
			||||||
 | 
					
 | 
				
			||||||
import (
 | 
					import (
 | 
				
			||||||
 | 
						"github.com/TeaOSLab/EdgeAPI/internal/errors"
 | 
				
			||||||
	_ "github.com/go-sql-driver/mysql"
 | 
						_ "github.com/go-sql-driver/mysql"
 | 
				
			||||||
	"github.com/iwind/TeaGo/Tea"
 | 
						"github.com/iwind/TeaGo/Tea"
 | 
				
			||||||
	"github.com/iwind/TeaGo/dbs"
 | 
						"github.com/iwind/TeaGo/dbs"
 | 
				
			||||||
 | 
						"github.com/iwind/TeaGo/types"
 | 
				
			||||||
 | 
						stringutil "github.com/iwind/TeaGo/utils/string"
 | 
				
			||||||
)
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
const (
 | 
					const (
 | 
				
			||||||
@@ -24,7 +27,13 @@ func NewAdminDAO() *AdminDAO {
 | 
				
			|||||||
	}).(*AdminDAO)
 | 
						}).(*AdminDAO)
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
var SharedAdminDAO = NewAdminDAO()
 | 
					var SharedAdminDAO *AdminDAO
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func init() {
 | 
				
			||||||
 | 
						dbs.OnReady(func() {
 | 
				
			||||||
 | 
							SharedAdminDAO = NewAdminDAO()
 | 
				
			||||||
 | 
						})
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// 启用条目
 | 
					// 启用条目
 | 
				
			||||||
func (this *AdminDAO) EnableAdmin(id uint32) (rowsAffected int64, err error) {
 | 
					func (this *AdminDAO) EnableAdmin(id uint32) (rowsAffected int64, err error) {
 | 
				
			||||||
@@ -71,7 +80,7 @@ func (this *AdminDAO) FindAdminFullname(adminId int) (string, error) {
 | 
				
			|||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// 检查用户名、密码
 | 
					// 检查用户名、密码
 | 
				
			||||||
func (this *AdminDAO) CheckAdminPassword(username string, encryptedPassword string) (int, error) {
 | 
					func (this *AdminDAO) CheckAdminPassword(username string, encryptedPassword string) (int64, error) {
 | 
				
			||||||
	if len(username) == 0 || len(encryptedPassword) == 0 {
 | 
						if len(username) == 0 || len(encryptedPassword) == 0 {
 | 
				
			||||||
		return 0, nil
 | 
							return 0, nil
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
@@ -80,5 +89,46 @@ func (this *AdminDAO) CheckAdminPassword(username string, encryptedPassword stri
 | 
				
			|||||||
		Attr("password", encryptedPassword).
 | 
							Attr("password", encryptedPassword).
 | 
				
			||||||
		Attr("state", AdminStateEnabled).
 | 
							Attr("state", AdminStateEnabled).
 | 
				
			||||||
		ResultPk().
 | 
							ResultPk().
 | 
				
			||||||
		FindIntCol(0)
 | 
							FindInt64Col(0)
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// 根据用户名查询管理员ID
 | 
				
			||||||
 | 
					func (this *AdminDAO) FindAdminIdWithUsername(username string) (int64, error) {
 | 
				
			||||||
 | 
						one, err := this.Query().
 | 
				
			||||||
 | 
							Attr("username", username).
 | 
				
			||||||
 | 
							State(AdminStateEnabled).
 | 
				
			||||||
 | 
							ResultPk().
 | 
				
			||||||
 | 
							Find()
 | 
				
			||||||
 | 
						if err != nil {
 | 
				
			||||||
 | 
							return 0, err
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						if one == nil {
 | 
				
			||||||
 | 
							return 0, nil
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						return int64(one.(*Admin).Id), nil
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// 更改管理员密码
 | 
				
			||||||
 | 
					func (this *AdminDAO) UpdateAdminPassword(adminId int64, password string) error {
 | 
				
			||||||
 | 
						if adminId <= 0 {
 | 
				
			||||||
 | 
							return errors.New("invalid adminId")
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						op := NewAdminOperator()
 | 
				
			||||||
 | 
						op.Id = adminId
 | 
				
			||||||
 | 
						op.Password = stringutil.Md5(password)
 | 
				
			||||||
 | 
						_, err := this.Save(op)
 | 
				
			||||||
 | 
						return err
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// 创建管理员
 | 
				
			||||||
 | 
					func (this *AdminDAO) CreateAdmin(username string, password string, fullname string) (int64, error) {
 | 
				
			||||||
 | 
						op := NewAdminOperator()
 | 
				
			||||||
 | 
						op.Username = username
 | 
				
			||||||
 | 
						op.Password = stringutil.Md5(password)
 | 
				
			||||||
 | 
						op.Fullname = fullname
 | 
				
			||||||
 | 
						_, err := this.Save(op)
 | 
				
			||||||
 | 
						if err != nil {
 | 
				
			||||||
 | 
							return 0, err
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						return types.Int64(op.Id), nil
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -1,12 +1,15 @@
 | 
				
			|||||||
package models
 | 
					package models
 | 
				
			||||||
 | 
					
 | 
				
			||||||
import (
 | 
					import (
 | 
				
			||||||
 | 
						"encoding/json"
 | 
				
			||||||
	"errors"
 | 
						"errors"
 | 
				
			||||||
	_ "github.com/go-sql-driver/mysql"
 | 
						_ "github.com/go-sql-driver/mysql"
 | 
				
			||||||
	"github.com/iwind/TeaGo/Tea"
 | 
						"github.com/iwind/TeaGo/Tea"
 | 
				
			||||||
	"github.com/iwind/TeaGo/dbs"
 | 
						"github.com/iwind/TeaGo/dbs"
 | 
				
			||||||
 | 
						"github.com/iwind/TeaGo/maps"
 | 
				
			||||||
	"github.com/iwind/TeaGo/rands"
 | 
						"github.com/iwind/TeaGo/rands"
 | 
				
			||||||
	"github.com/iwind/TeaGo/types"
 | 
						"github.com/iwind/TeaGo/types"
 | 
				
			||||||
 | 
						"strconv"
 | 
				
			||||||
)
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
const (
 | 
					const (
 | 
				
			||||||
@@ -27,7 +30,13 @@ func NewAPINodeDAO() *APINodeDAO {
 | 
				
			|||||||
	}).(*APINodeDAO)
 | 
						}).(*APINodeDAO)
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
var SharedAPINodeDAO = NewAPINodeDAO()
 | 
					var SharedAPINodeDAO *APINodeDAO
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func init() {
 | 
				
			||||||
 | 
						dbs.OnReady(func() {
 | 
				
			||||||
 | 
							SharedAPINodeDAO = NewAPINodeDAO()
 | 
				
			||||||
 | 
						})
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// 启用条目
 | 
					// 启用条目
 | 
				
			||||||
func (this *APINodeDAO) EnableAPINode(id int64) error {
 | 
					func (this *APINodeDAO) EnableAPINode(id int64) error {
 | 
				
			||||||
@@ -87,7 +96,7 @@ func (this *APINodeDAO) CreateAPINode(name string, description string, httpJSON
 | 
				
			|||||||
		return 0, err
 | 
							return 0, err
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	secret := rands.String(32)
 | 
						secret := rands.String(32)
 | 
				
			||||||
	err = SharedApiTokenDAO.CreateAPIToken(uniqueId, secret, NodeRoleAPI)
 | 
						err = NewApiTokenDAO().CreateAPIToken(uniqueId, secret, NodeRoleAPI)
 | 
				
			||||||
	if err != nil {
 | 
						if err != nil {
 | 
				
			||||||
		return
 | 
							return
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
@@ -183,6 +192,33 @@ func (this *APINodeDAO) ListEnabledAPINodes(offset int64, size int64) (result []
 | 
				
			|||||||
	return
 | 
						return
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// 根据主机名和端口获取ID
 | 
				
			||||||
 | 
					func (this *APINodeDAO) FindEnabledAPINodeIdWithAddr(protocol string, host string, port int) (int64, error) {
 | 
				
			||||||
 | 
						addr := maps.Map{
 | 
				
			||||||
 | 
							"protocol":  protocol,
 | 
				
			||||||
 | 
							"host":      host,
 | 
				
			||||||
 | 
							"portRange": strconv.Itoa(port),
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						addrJSON, err := json.Marshal(addr)
 | 
				
			||||||
 | 
						if err != nil {
 | 
				
			||||||
 | 
							return 0, err
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						one, err := this.Query().
 | 
				
			||||||
 | 
							State(APINodeStateEnabled).
 | 
				
			||||||
 | 
							Where("JSON_CONTAINS(accessAddrs, :addr)").
 | 
				
			||||||
 | 
							Param("addr", string(addrJSON)).
 | 
				
			||||||
 | 
							ResultPk().
 | 
				
			||||||
 | 
							Find()
 | 
				
			||||||
 | 
						if err != nil {
 | 
				
			||||||
 | 
							return 0, err
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						if one == nil {
 | 
				
			||||||
 | 
							return 0, nil
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						return int64(one.(*APINode).Id), nil
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// 生成唯一ID
 | 
					// 生成唯一ID
 | 
				
			||||||
func (this *APINodeDAO) genUniqueId() (string, error) {
 | 
					func (this *APINodeDAO) genUniqueId() (string, error) {
 | 
				
			||||||
	for {
 | 
						for {
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -2,4 +2,32 @@ package models
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
import (
 | 
					import (
 | 
				
			||||||
	_ "github.com/go-sql-driver/mysql"
 | 
						_ "github.com/go-sql-driver/mysql"
 | 
				
			||||||
 | 
						"runtime"
 | 
				
			||||||
 | 
						"testing"
 | 
				
			||||||
)
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func TestAPINodeDAO_FindEnabledAPINodeIdWithAddr(t *testing.T) {
 | 
				
			||||||
 | 
						dao := NewAPINodeDAO()
 | 
				
			||||||
 | 
						{
 | 
				
			||||||
 | 
							apiNodeId, err := dao.FindEnabledAPINodeIdWithAddr("http", "127.0.0.1", 123)
 | 
				
			||||||
 | 
							if err != nil {
 | 
				
			||||||
 | 
								t.Fatal(err)
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							t.Log("apiNodeId:", apiNodeId)
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						{
 | 
				
			||||||
 | 
							apiNodeId, err := dao.FindEnabledAPINodeIdWithAddr("http", "127.0.0.1", 8003)
 | 
				
			||||||
 | 
							if err != nil {
 | 
				
			||||||
 | 
								t.Fatal(err)
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							t.Log("apiNodeId:", apiNodeId)
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func BenchmarkAPINodeDAO_New(b *testing.B) {
 | 
				
			||||||
 | 
						runtime.GOMAXPROCS(1)
 | 
				
			||||||
 | 
						for i := 0; i < b.N; i++ {
 | 
				
			||||||
 | 
							_ = NewAPINodeDAO()
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -17,6 +17,7 @@ type APINode struct {
 | 
				
			|||||||
	CreatedAt   uint64 `field:"createdAt"`   // 创建时间
 | 
						CreatedAt   uint64 `field:"createdAt"`   // 创建时间
 | 
				
			||||||
	AdminId     uint32 `field:"adminId"`     // 管理员ID
 | 
						AdminId     uint32 `field:"adminId"`     // 管理员ID
 | 
				
			||||||
	Weight      uint32 `field:"weight"`      // 权重
 | 
						Weight      uint32 `field:"weight"`      // 权重
 | 
				
			||||||
 | 
						Status      string `field:"status"`      // 运行状态
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
type APINodeOperator struct {
 | 
					type APINodeOperator struct {
 | 
				
			||||||
@@ -35,6 +36,7 @@ type APINodeOperator struct {
 | 
				
			|||||||
	CreatedAt   interface{} // 创建时间
 | 
						CreatedAt   interface{} // 创建时间
 | 
				
			||||||
	AdminId     interface{} // 管理员ID
 | 
						AdminId     interface{} // 管理员ID
 | 
				
			||||||
	Weight      interface{} // 权重
 | 
						Weight      interface{} // 权重
 | 
				
			||||||
 | 
						Status      interface{} // 运行状态
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func NewAPINodeOperator() *APINodeOperator {
 | 
					func NewAPINodeOperator() *APINodeOperator {
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -24,7 +24,13 @@ func NewApiTokenDAO() *ApiTokenDAO {
 | 
				
			|||||||
	}).(*ApiTokenDAO)
 | 
						}).(*ApiTokenDAO)
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
var SharedApiTokenDAO = NewApiTokenDAO()
 | 
					var SharedApiTokenDAO *ApiTokenDAO
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func init() {
 | 
				
			||||||
 | 
						dbs.OnReady(func() {
 | 
				
			||||||
 | 
							SharedApiTokenDAO = NewApiTokenDAO()
 | 
				
			||||||
 | 
						})
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// 启用条目
 | 
					// 启用条目
 | 
				
			||||||
func (this *ApiTokenDAO) EnableApiToken(id uint32) (rowsAffected int64, err error) {
 | 
					func (this *ApiTokenDAO) EnableApiToken(id uint32) (rowsAffected int64, err error) {
 | 
				
			||||||
@@ -67,6 +73,18 @@ func (this *ApiTokenDAO) FindEnabledTokenWithNode(nodeId string) (*ApiToken, err
 | 
				
			|||||||
	return nil, err
 | 
						return nil, err
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// 根据角色获取节点
 | 
				
			||||||
 | 
					func (this *ApiTokenDAO) FindEnabledTokenWithRole(role string) (*ApiToken, error) {
 | 
				
			||||||
 | 
						one, err := this.Query().
 | 
				
			||||||
 | 
							Attr("role", role).
 | 
				
			||||||
 | 
							State(ApiTokenStateEnabled).
 | 
				
			||||||
 | 
							Find()
 | 
				
			||||||
 | 
						if one != nil {
 | 
				
			||||||
 | 
							return one.(*ApiToken), nil
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						return nil, err
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// 保存API Token
 | 
					// 保存API Token
 | 
				
			||||||
func (this *ApiTokenDAO) CreateAPIToken(nodeId string, secret string, role NodeRole) error {
 | 
					func (this *ApiTokenDAO) CreateAPIToken(nodeId string, secret string, role NodeRole) error {
 | 
				
			||||||
	op := NewApiTokenOperator()
 | 
						op := NewApiTokenOperator()
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -26,7 +26,13 @@ func NewDBNodeDAO() *DBNodeDAO {
 | 
				
			|||||||
	}).(*DBNodeDAO)
 | 
						}).(*DBNodeDAO)
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
var SharedDBNodeDAO = NewDBNodeDAO()
 | 
					var SharedDBNodeDAO *DBNodeDAO
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func init() {
 | 
				
			||||||
 | 
						dbs.OnReady(func() {
 | 
				
			||||||
 | 
							SharedDBNodeDAO = NewDBNodeDAO()
 | 
				
			||||||
 | 
						})
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// 启用条目
 | 
					// 启用条目
 | 
				
			||||||
func (this *DBNodeDAO) EnableDBNode(id int64) error {
 | 
					func (this *DBNodeDAO) EnableDBNode(id int64) error {
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -25,7 +25,9 @@ type HTTPAccessLogDAOWrapper struct {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
func init() {
 | 
					func init() {
 | 
				
			||||||
	initializer := NewDBNodeInitializer()
 | 
						initializer := NewDBNodeInitializer()
 | 
				
			||||||
	go initializer.Start()
 | 
						dbs.OnReady(func() {
 | 
				
			||||||
 | 
							go initializer.Start()
 | 
				
			||||||
 | 
						})
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// 获取获取DAO
 | 
					// 获取获取DAO
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -20,7 +20,13 @@ func NewFileChunkDAO() *FileChunkDAO {
 | 
				
			|||||||
	}).(*FileChunkDAO)
 | 
						}).(*FileChunkDAO)
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
var SharedFileChunkDAO = NewFileChunkDAO()
 | 
					var SharedFileChunkDAO *FileChunkDAO
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func init() {
 | 
				
			||||||
 | 
						dbs.OnReady(func() {
 | 
				
			||||||
 | 
							SharedFileChunkDAO = NewFileChunkDAO()
 | 
				
			||||||
 | 
						})
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// 创建文件Chunk
 | 
					// 创建文件Chunk
 | 
				
			||||||
func (this *FileChunkDAO) CreateFileChunk(fileId int, data []byte) error {
 | 
					func (this *FileChunkDAO) CreateFileChunk(fileId int, data []byte) error {
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -27,7 +27,13 @@ func NewFileDAO() *FileDAO {
 | 
				
			|||||||
	}).(*FileDAO)
 | 
						}).(*FileDAO)
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
var SharedFileDAO = NewFileDAO()
 | 
					var SharedFileDAO *FileDAO
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func init() {
 | 
				
			||||||
 | 
						dbs.OnReady(func() {
 | 
				
			||||||
 | 
							SharedFileDAO = NewFileDAO()
 | 
				
			||||||
 | 
						})
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// 启用条目
 | 
					// 启用条目
 | 
				
			||||||
func (this *FileDAO) EnableFile(id int64) error {
 | 
					func (this *FileDAO) EnableFile(id int64) error {
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -20,7 +20,13 @@ import (
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
type HTTPAccessLogDAO dbs.DAO
 | 
					type HTTPAccessLogDAO dbs.DAO
 | 
				
			||||||
 | 
					
 | 
				
			||||||
var SharedHTTPAccessLogDAO = NewHTTPAccessLogDAO()
 | 
					var SharedHTTPAccessLogDAO *HTTPAccessLogDAO
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func init() {
 | 
				
			||||||
 | 
						dbs.OnReady(func() {
 | 
				
			||||||
 | 
							SharedHTTPAccessLogDAO = NewHTTPAccessLogDAO()
 | 
				
			||||||
 | 
						})
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func NewHTTPAccessLogDAO() *HTTPAccessLogDAO {
 | 
					func NewHTTPAccessLogDAO() *HTTPAccessLogDAO {
 | 
				
			||||||
	return dbs.NewDAO(&HTTPAccessLogDAO{
 | 
						return dbs.NewDAO(&HTTPAccessLogDAO{
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -27,7 +27,13 @@ func NewHTTPAccessLogPolicyDAO() *HTTPAccessLogPolicyDAO {
 | 
				
			|||||||
	}).(*HTTPAccessLogPolicyDAO)
 | 
						}).(*HTTPAccessLogPolicyDAO)
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
var SharedHTTPAccessLogPolicyDAO = NewHTTPAccessLogPolicyDAO()
 | 
					var SharedHTTPAccessLogPolicyDAO *HTTPAccessLogPolicyDAO
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func init() {
 | 
				
			||||||
 | 
						dbs.OnReady(func() {
 | 
				
			||||||
 | 
							SharedHTTPAccessLogPolicyDAO = NewHTTPAccessLogPolicyDAO()
 | 
				
			||||||
 | 
						})
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// 初始化
 | 
					// 初始化
 | 
				
			||||||
func (this *HTTPAccessLogPolicyDAO) Init() {
 | 
					func (this *HTTPAccessLogPolicyDAO) Init() {
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -29,7 +29,13 @@ func NewHTTPCachePolicyDAO() *HTTPCachePolicyDAO {
 | 
				
			|||||||
	}).(*HTTPCachePolicyDAO)
 | 
						}).(*HTTPCachePolicyDAO)
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
var SharedHTTPCachePolicyDAO = NewHTTPCachePolicyDAO()
 | 
					var SharedHTTPCachePolicyDAO *HTTPCachePolicyDAO
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func init() {
 | 
				
			||||||
 | 
						dbs.OnReady(func() {
 | 
				
			||||||
 | 
							SharedHTTPCachePolicyDAO = NewHTTPCachePolicyDAO()
 | 
				
			||||||
 | 
						})
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// 初始化
 | 
					// 初始化
 | 
				
			||||||
func (this *HTTPCachePolicyDAO) Init() {
 | 
					func (this *HTTPCachePolicyDAO) Init() {
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -28,7 +28,13 @@ func NewHTTPFirewallPolicyDAO() *HTTPFirewallPolicyDAO {
 | 
				
			|||||||
	}).(*HTTPFirewallPolicyDAO)
 | 
						}).(*HTTPFirewallPolicyDAO)
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
var SharedHTTPFirewallPolicyDAO = NewHTTPFirewallPolicyDAO()
 | 
					var SharedHTTPFirewallPolicyDAO *HTTPFirewallPolicyDAO
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func init() {
 | 
				
			||||||
 | 
						dbs.OnReady(func() {
 | 
				
			||||||
 | 
							SharedHTTPFirewallPolicyDAO = NewHTTPFirewallPolicyDAO()
 | 
				
			||||||
 | 
						})
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// 初始化
 | 
					// 初始化
 | 
				
			||||||
func (this *HTTPFirewallPolicyDAO) Init() {
 | 
					func (this *HTTPFirewallPolicyDAO) Init() {
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -27,7 +27,13 @@ func NewHTTPFirewallRuleDAO() *HTTPFirewallRuleDAO {
 | 
				
			|||||||
	}).(*HTTPFirewallRuleDAO)
 | 
						}).(*HTTPFirewallRuleDAO)
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
var SharedHTTPFirewallRuleDAO = NewHTTPFirewallRuleDAO()
 | 
					var SharedHTTPFirewallRuleDAO *HTTPFirewallRuleDAO
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func init() {
 | 
				
			||||||
 | 
						dbs.OnReady(func() {
 | 
				
			||||||
 | 
							SharedHTTPFirewallRuleDAO = NewHTTPFirewallRuleDAO()
 | 
				
			||||||
 | 
						})
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// 初始化
 | 
					// 初始化
 | 
				
			||||||
func (this *HTTPFirewallRuleDAO) Init() {
 | 
					func (this *HTTPFirewallRuleDAO) Init() {
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -28,7 +28,13 @@ func NewHTTPFirewallRuleGroupDAO() *HTTPFirewallRuleGroupDAO {
 | 
				
			|||||||
	}).(*HTTPFirewallRuleGroupDAO)
 | 
						}).(*HTTPFirewallRuleGroupDAO)
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
var SharedHTTPFirewallRuleGroupDAO = NewHTTPFirewallRuleGroupDAO()
 | 
					var SharedHTTPFirewallRuleGroupDAO *HTTPFirewallRuleGroupDAO
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func init() {
 | 
				
			||||||
 | 
						dbs.OnReady(func() {
 | 
				
			||||||
 | 
							SharedHTTPFirewallRuleGroupDAO = NewHTTPFirewallRuleGroupDAO()
 | 
				
			||||||
 | 
						})
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// 初始化
 | 
					// 初始化
 | 
				
			||||||
func (this *HTTPFirewallRuleGroupDAO) Init() {
 | 
					func (this *HTTPFirewallRuleGroupDAO) Init() {
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -29,7 +29,13 @@ func NewHTTPFirewallRuleSetDAO() *HTTPFirewallRuleSetDAO {
 | 
				
			|||||||
	}).(*HTTPFirewallRuleSetDAO)
 | 
						}).(*HTTPFirewallRuleSetDAO)
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
var SharedHTTPFirewallRuleSetDAO = NewHTTPFirewallRuleSetDAO()
 | 
					var SharedHTTPFirewallRuleSetDAO *HTTPFirewallRuleSetDAO
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func init() {
 | 
				
			||||||
 | 
						dbs.OnReady(func() {
 | 
				
			||||||
 | 
							SharedHTTPFirewallRuleSetDAO = NewHTTPFirewallRuleSetDAO()
 | 
				
			||||||
 | 
						})
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// 初始化
 | 
					// 初始化
 | 
				
			||||||
func (this *HTTPFirewallRuleSetDAO) Init() {
 | 
					func (this *HTTPFirewallRuleSetDAO) Init() {
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -29,7 +29,13 @@ func NewHTTPGzipDAO() *HTTPGzipDAO {
 | 
				
			|||||||
	}).(*HTTPGzipDAO)
 | 
						}).(*HTTPGzipDAO)
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
var SharedHTTPGzipDAO = NewHTTPGzipDAO()
 | 
					var SharedHTTPGzipDAO *HTTPGzipDAO
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func init() {
 | 
				
			||||||
 | 
						dbs.OnReady(func() {
 | 
				
			||||||
 | 
							SharedHTTPGzipDAO = NewHTTPGzipDAO()
 | 
				
			||||||
 | 
						})
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// 初始化
 | 
					// 初始化
 | 
				
			||||||
func (this *HTTPGzipDAO) Init() {
 | 
					func (this *HTTPGzipDAO) Init() {
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -28,7 +28,13 @@ func NewHTTPHeaderDAO() *HTTPHeaderDAO {
 | 
				
			|||||||
	}).(*HTTPHeaderDAO)
 | 
						}).(*HTTPHeaderDAO)
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
var SharedHTTPHeaderDAO = NewHTTPHeaderDAO()
 | 
					var SharedHTTPHeaderDAO *HTTPHeaderDAO
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func init() {
 | 
				
			||||||
 | 
						dbs.OnReady(func() {
 | 
				
			||||||
 | 
							SharedHTTPHeaderDAO = NewHTTPHeaderDAO()
 | 
				
			||||||
 | 
						})
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// 初始化
 | 
					// 初始化
 | 
				
			||||||
func (this *HTTPHeaderDAO) Init() {
 | 
					func (this *HTTPHeaderDAO) Init() {
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -28,7 +28,13 @@ func NewHTTPHeaderPolicyDAO() *HTTPHeaderPolicyDAO {
 | 
				
			|||||||
	}).(*HTTPHeaderPolicyDAO)
 | 
						}).(*HTTPHeaderPolicyDAO)
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
var SharedHTTPHeaderPolicyDAO = NewHTTPHeaderPolicyDAO()
 | 
					var SharedHTTPHeaderPolicyDAO *HTTPHeaderPolicyDAO
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func init() {
 | 
				
			||||||
 | 
						dbs.OnReady(func() {
 | 
				
			||||||
 | 
							SharedHTTPHeaderPolicyDAO = NewHTTPHeaderPolicyDAO()
 | 
				
			||||||
 | 
						})
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// 初始化
 | 
					// 初始化
 | 
				
			||||||
func (this *HTTPHeaderPolicyDAO) Init() {
 | 
					func (this *HTTPHeaderPolicyDAO) Init() {
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -28,7 +28,13 @@ func NewHTTPLocationDAO() *HTTPLocationDAO {
 | 
				
			|||||||
	}).(*HTTPLocationDAO)
 | 
						}).(*HTTPLocationDAO)
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
var SharedHTTPLocationDAO = NewHTTPLocationDAO()
 | 
					var SharedHTTPLocationDAO *HTTPLocationDAO
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func init() {
 | 
				
			||||||
 | 
						dbs.OnReady(func() {
 | 
				
			||||||
 | 
							SharedHTTPLocationDAO = NewHTTPLocationDAO()
 | 
				
			||||||
 | 
						})
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// 初始化
 | 
					// 初始化
 | 
				
			||||||
func (this *HTTPLocationDAO) Init() {
 | 
					func (this *HTTPLocationDAO) Init() {
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -28,7 +28,13 @@ func NewHTTPPageDAO() *HTTPPageDAO {
 | 
				
			|||||||
	}).(*HTTPPageDAO)
 | 
						}).(*HTTPPageDAO)
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
var SharedHTTPPageDAO = NewHTTPPageDAO()
 | 
					var SharedHTTPPageDAO *HTTPPageDAO
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func init() {
 | 
				
			||||||
 | 
						dbs.OnReady(func() {
 | 
				
			||||||
 | 
							SharedHTTPPageDAO = NewHTTPPageDAO()
 | 
				
			||||||
 | 
						})
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// 初始化
 | 
					// 初始化
 | 
				
			||||||
func (this *HTTPPageDAO) Init() {
 | 
					func (this *HTTPPageDAO) Init() {
 | 
				
			||||||
@@ -121,7 +127,6 @@ func (this *HTTPPageDAO) UpdatePage(pageId int64, statusList []string, url strin
 | 
				
			|||||||
	op.NewStatus = newStatus
 | 
						op.NewStatus = newStatus
 | 
				
			||||||
	_, err = this.Save(op)
 | 
						_, err = this.Save(op)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					 | 
				
			||||||
	return err
 | 
						return err
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -27,7 +27,13 @@ func NewHTTPRewriteRuleDAO() *HTTPRewriteRuleDAO {
 | 
				
			|||||||
	}).(*HTTPRewriteRuleDAO)
 | 
						}).(*HTTPRewriteRuleDAO)
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
var SharedHTTPRewriteRuleDAO = NewHTTPRewriteRuleDAO()
 | 
					var SharedHTTPRewriteRuleDAO *HTTPRewriteRuleDAO
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func init() {
 | 
				
			||||||
 | 
						dbs.OnReady(func() {
 | 
				
			||||||
 | 
							SharedHTTPRewriteRuleDAO = NewHTTPRewriteRuleDAO()
 | 
				
			||||||
 | 
						})
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// 初始化
 | 
					// 初始化
 | 
				
			||||||
func (this *HTTPRewriteRuleDAO) Init() {
 | 
					func (this *HTTPRewriteRuleDAO) Init() {
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -31,7 +31,13 @@ func NewHTTPWebDAO() *HTTPWebDAO {
 | 
				
			|||||||
	}).(*HTTPWebDAO)
 | 
						}).(*HTTPWebDAO)
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
var SharedHTTPWebDAO = NewHTTPWebDAO()
 | 
					var SharedHTTPWebDAO *HTTPWebDAO
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func init() {
 | 
				
			||||||
 | 
						dbs.OnReady(func() {
 | 
				
			||||||
 | 
							SharedHTTPWebDAO = NewHTTPWebDAO()
 | 
				
			||||||
 | 
						})
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func (this *HTTPWebDAO) Init() {
 | 
					func (this *HTTPWebDAO) Init() {
 | 
				
			||||||
	this.DAOObject.Init()
 | 
						this.DAOObject.Init()
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -29,7 +29,13 @@ func NewHTTPWebsocketDAO() *HTTPWebsocketDAO {
 | 
				
			|||||||
	}).(*HTTPWebsocketDAO)
 | 
						}).(*HTTPWebsocketDAO)
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
var SharedHTTPWebsocketDAO = NewHTTPWebsocketDAO()
 | 
					var SharedHTTPWebsocketDAO *HTTPWebsocketDAO
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func init() {
 | 
				
			||||||
 | 
						dbs.OnReady(func() {
 | 
				
			||||||
 | 
							SharedHTTPWebsocketDAO = NewHTTPWebsocketDAO()
 | 
				
			||||||
 | 
						})
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// 启用条目
 | 
					// 启用条目
 | 
				
			||||||
func (this *HTTPWebsocketDAO) EnableHTTPWebsocket(id int64) error {
 | 
					func (this *HTTPWebsocketDAO) EnableHTTPWebsocket(id int64) error {
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -19,7 +19,13 @@ func NewLogDAO() *LogDAO {
 | 
				
			|||||||
	}).(*LogDAO)
 | 
						}).(*LogDAO)
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
var SharedLogDAO = NewLogDAO()
 | 
					var SharedLogDAO *LogDAO
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func init() {
 | 
				
			||||||
 | 
						dbs.OnReady(func() {
 | 
				
			||||||
 | 
							SharedLogDAO = NewLogDAO()
 | 
				
			||||||
 | 
						})
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// 创建管理员日志
 | 
					// 创建管理员日志
 | 
				
			||||||
func (this *LogDAO) CreateAdminLog(adminId int64, level string, description string, action string, ip string) error {
 | 
					func (this *LogDAO) CreateAdminLog(adminId int64, level string, description string, action string, ip string) error {
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -26,7 +26,13 @@ func NewNodeClusterDAO() *NodeClusterDAO {
 | 
				
			|||||||
	}).(*NodeClusterDAO)
 | 
						}).(*NodeClusterDAO)
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
var SharedNodeClusterDAO = NewNodeClusterDAO()
 | 
					var SharedNodeClusterDAO *NodeClusterDAO
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func init() {
 | 
				
			||||||
 | 
						dbs.OnReady(func() {
 | 
				
			||||||
 | 
							SharedNodeClusterDAO = NewNodeClusterDAO()
 | 
				
			||||||
 | 
						})
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// 启用条目
 | 
					// 启用条目
 | 
				
			||||||
func (this *NodeClusterDAO) EnableNodeCluster(id int64) error {
 | 
					func (this *NodeClusterDAO) EnableNodeCluster(id int64) error {
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -32,7 +32,13 @@ func NewNodeDAO() *NodeDAO {
 | 
				
			|||||||
	}).(*NodeDAO)
 | 
						}).(*NodeDAO)
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
var SharedNodeDAO = NewNodeDAO()
 | 
					var SharedNodeDAO *NodeDAO
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func init() {
 | 
				
			||||||
 | 
						dbs.OnReady(func() {
 | 
				
			||||||
 | 
							SharedNodeDAO = NewNodeDAO()
 | 
				
			||||||
 | 
						})
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// 启用条目
 | 
					// 启用条目
 | 
				
			||||||
func (this *NodeDAO) EnableNode(id uint32) (rowsAffected int64, err error) {
 | 
					func (this *NodeDAO) EnableNode(id uint32) (rowsAffected int64, err error) {
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -26,7 +26,13 @@ func NewNodeGrantDAO() *NodeGrantDAO {
 | 
				
			|||||||
	}).(*NodeGrantDAO)
 | 
						}).(*NodeGrantDAO)
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
var SharedNodeGrantDAO = NewNodeGrantDAO()
 | 
					var SharedNodeGrantDAO *NodeGrantDAO
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func init() {
 | 
				
			||||||
 | 
						dbs.OnReady(func() {
 | 
				
			||||||
 | 
							SharedNodeGrantDAO = NewNodeGrantDAO()
 | 
				
			||||||
 | 
						})
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// 启用条目
 | 
					// 启用条目
 | 
				
			||||||
func (this *NodeGrantDAO) EnableNodeGrant(id uint32) (rowsAffected int64, err error) {
 | 
					func (this *NodeGrantDAO) EnableNodeGrant(id uint32) (rowsAffected int64, err error) {
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -24,7 +24,13 @@ func NewNodeGroupDAO() *NodeGroupDAO {
 | 
				
			|||||||
	}).(*NodeGroupDAO)
 | 
						}).(*NodeGroupDAO)
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
var SharedNodeGroupDAO = NewNodeGroupDAO()
 | 
					var SharedNodeGroupDAO *NodeGroupDAO
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func init() {
 | 
				
			||||||
 | 
						dbs.OnReady(func() {
 | 
				
			||||||
 | 
							SharedNodeGroupDAO = NewNodeGroupDAO()
 | 
				
			||||||
 | 
						})
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// 启用条目
 | 
					// 启用条目
 | 
				
			||||||
func (this *NodeGroupDAO) EnableNodeGroup(id uint32) (rowsAffected int64, err error) {
 | 
					func (this *NodeGroupDAO) EnableNodeGroup(id uint32) (rowsAffected int64, err error) {
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -26,7 +26,13 @@ func NewNodeIPAddressDAO() *NodeIPAddressDAO {
 | 
				
			|||||||
	}).(*NodeIPAddressDAO)
 | 
						}).(*NodeIPAddressDAO)
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
var SharedNodeIPAddressDAO = NewNodeIPAddressDAO()
 | 
					var SharedNodeIPAddressDAO *NodeIPAddressDAO
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func init() {
 | 
				
			||||||
 | 
						dbs.OnReady(func() {
 | 
				
			||||||
 | 
							SharedNodeIPAddressDAO = NewNodeIPAddressDAO()
 | 
				
			||||||
 | 
						})
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// 启用条目
 | 
					// 启用条目
 | 
				
			||||||
func (this *NodeIPAddressDAO) EnableAddress(id int64) (err error) {
 | 
					func (this *NodeIPAddressDAO) EnableAddress(id int64) (err error) {
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -25,7 +25,13 @@ func NewNodeLogDAO() *NodeLogDAO {
 | 
				
			|||||||
	}).(*NodeLogDAO)
 | 
						}).(*NodeLogDAO)
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
var SharedNodeLogDAO = NewNodeLogDAO()
 | 
					var SharedNodeLogDAO *NodeLogDAO
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func init() {
 | 
				
			||||||
 | 
						dbs.OnReady(func() {
 | 
				
			||||||
 | 
							SharedNodeLogDAO = NewNodeLogDAO()
 | 
				
			||||||
 | 
						})
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// 创建日志
 | 
					// 创建日志
 | 
				
			||||||
func (this *NodeLogDAO) CreateLog(nodeRole NodeRole, nodeId int64, level string, tag string, description string, createdAt int64) error {
 | 
					func (this *NodeLogDAO) CreateLog(nodeRole NodeRole, nodeId int64, level string, tag string, description string, createdAt int64) error {
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -28,7 +28,13 @@ func NewNodeLoginDAO() *NodeLoginDAO {
 | 
				
			|||||||
	}).(*NodeLoginDAO)
 | 
						}).(*NodeLoginDAO)
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
var SharedNodeLoginDAO = NewNodeLoginDAO()
 | 
					var SharedNodeLoginDAO *NodeLoginDAO
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func init() {
 | 
				
			||||||
 | 
						dbs.OnReady(func() {
 | 
				
			||||||
 | 
							SharedNodeLoginDAO = NewNodeLoginDAO()
 | 
				
			||||||
 | 
						})
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// 启用条目
 | 
					// 启用条目
 | 
				
			||||||
func (this *NodeLoginDAO) EnableNodeLogin(id uint32) (rowsAffected int64, err error) {
 | 
					func (this *NodeLoginDAO) EnableNodeLogin(id uint32) (rowsAffected int64, err error) {
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -30,7 +30,13 @@ func NewOriginDAO() *OriginDAO {
 | 
				
			|||||||
	}).(*OriginDAO)
 | 
						}).(*OriginDAO)
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
var SharedOriginDAO = NewOriginDAO()
 | 
					var SharedOriginDAO *OriginDAO
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func init() {
 | 
				
			||||||
 | 
						dbs.OnReady(func() {
 | 
				
			||||||
 | 
							SharedOriginDAO = NewOriginDAO()
 | 
				
			||||||
 | 
						})
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// 初始化
 | 
					// 初始化
 | 
				
			||||||
func (this *OriginDAO) Init() {
 | 
					func (this *OriginDAO) Init() {
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -24,7 +24,13 @@ func NewProviderDAO() *ProviderDAO {
 | 
				
			|||||||
	}).(*ProviderDAO)
 | 
						}).(*ProviderDAO)
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
var SharedProviderDAO = NewProviderDAO()
 | 
					var SharedProviderDAO *ProviderDAO
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func init() {
 | 
				
			||||||
 | 
						dbs.OnReady(func() {
 | 
				
			||||||
 | 
							SharedProviderDAO = NewProviderDAO()
 | 
				
			||||||
 | 
						})
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// 启用条目
 | 
					// 启用条目
 | 
				
			||||||
func (this *ProviderDAO) EnableProvider(id uint32) (rowsAffected int64, err error) {
 | 
					func (this *ProviderDAO) EnableProvider(id uint32) (rowsAffected int64, err error) {
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -28,7 +28,13 @@ func NewReverseProxyDAO() *ReverseProxyDAO {
 | 
				
			|||||||
	}).(*ReverseProxyDAO)
 | 
						}).(*ReverseProxyDAO)
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
var SharedReverseProxyDAO = NewReverseProxyDAO()
 | 
					var SharedReverseProxyDAO *ReverseProxyDAO
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func init() {
 | 
				
			||||||
 | 
						dbs.OnReady(func() {
 | 
				
			||||||
 | 
							SharedReverseProxyDAO = NewReverseProxyDAO()
 | 
				
			||||||
 | 
						})
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// 初始化
 | 
					// 初始化
 | 
				
			||||||
func (this *ReverseProxyDAO) Init() {
 | 
					func (this *ReverseProxyDAO) Init() {
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -32,7 +32,13 @@ func NewServerDAO() *ServerDAO {
 | 
				
			|||||||
	}).(*ServerDAO)
 | 
						}).(*ServerDAO)
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
var SharedServerDAO = NewServerDAO()
 | 
					var SharedServerDAO *ServerDAO
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func init() {
 | 
				
			||||||
 | 
						dbs.OnReady(func() {
 | 
				
			||||||
 | 
							SharedServerDAO = NewServerDAO()
 | 
				
			||||||
 | 
						})
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// 初始化
 | 
					// 初始化
 | 
				
			||||||
func (this *ServerDAO) Init() {
 | 
					func (this *ServerDAO) Init() {
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -24,22 +24,30 @@ func NewServerGroupDAO() *ServerGroupDAO {
 | 
				
			|||||||
	}).(*ServerGroupDAO)
 | 
						}).(*ServerGroupDAO)
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
var SharedServerGroupDAO = NewServerGroupDAO()
 | 
					var SharedServerGroupDAO *ServerGroupDAO
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func init() {
 | 
				
			||||||
 | 
						dbs.OnReady(func() {
 | 
				
			||||||
 | 
							SharedServerGroupDAO = NewServerGroupDAO()
 | 
				
			||||||
 | 
						})
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// 启用条目
 | 
					// 启用条目
 | 
				
			||||||
func (this *ServerGroupDAO) EnableServerGroup(id uint32) (rowsAffected int64, err error) {
 | 
					func (this *ServerGroupDAO) EnableServerGroup(id uint32) error {
 | 
				
			||||||
	return this.Query().
 | 
						_, err := this.Query().
 | 
				
			||||||
		Pk(id).
 | 
							Pk(id).
 | 
				
			||||||
		Set("state", ServerGroupStateEnabled).
 | 
							Set("state", ServerGroupStateEnabled).
 | 
				
			||||||
		Update()
 | 
							Update()
 | 
				
			||||||
 | 
						return err
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// 禁用条目
 | 
					// 禁用条目
 | 
				
			||||||
func (this *ServerGroupDAO) DisableServerGroup(id uint32) (rowsAffected int64, err error) {
 | 
					func (this *ServerGroupDAO) DisableServerGroup(id uint32) error {
 | 
				
			||||||
	return this.Query().
 | 
						_, err := this.Query().
 | 
				
			||||||
		Pk(id).
 | 
							Pk(id).
 | 
				
			||||||
		Set("state", ServerGroupStateDisabled).
 | 
							Set("state", ServerGroupStateDisabled).
 | 
				
			||||||
		Update()
 | 
							Update()
 | 
				
			||||||
 | 
						return err
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// 查找启用中的条目
 | 
					// 查找启用中的条目
 | 
				
			||||||
@@ -56,9 +64,8 @@ func (this *ServerGroupDAO) FindEnabledServerGroup(id uint32) (*ServerGroup, err
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
// 根据主键查找名称
 | 
					// 根据主键查找名称
 | 
				
			||||||
func (this *ServerGroupDAO) FindServerGroupName(id uint32) (string, error) {
 | 
					func (this *ServerGroupDAO) FindServerGroupName(id uint32) (string, error) {
 | 
				
			||||||
	name, err := this.Query().
 | 
						return this.Query().
 | 
				
			||||||
		Pk(id).
 | 
							Pk(id).
 | 
				
			||||||
		Result("name").
 | 
							Result("name").
 | 
				
			||||||
		FindCol("")
 | 
							FindStringCol("")
 | 
				
			||||||
	return name.(string), err
 | 
					 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -29,7 +29,13 @@ func NewSSLCertDAO() *SSLCertDAO {
 | 
				
			|||||||
	}).(*SSLCertDAO)
 | 
						}).(*SSLCertDAO)
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
var SharedSSLCertDAO = NewSSLCertDAO()
 | 
					var SharedSSLCertDAO *SSLCertDAO
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func init() {
 | 
				
			||||||
 | 
						dbs.OnReady(func() {
 | 
				
			||||||
 | 
							SharedSSLCertDAO = NewSSLCertDAO()
 | 
				
			||||||
 | 
						})
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// 初始化
 | 
					// 初始化
 | 
				
			||||||
func (this *SSLCertDAO) Init() {
 | 
					func (this *SSLCertDAO) Init() {
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -24,7 +24,13 @@ func NewSSLCertGroupDAO() *SSLCertGroupDAO {
 | 
				
			|||||||
	}).(*SSLCertGroupDAO)
 | 
						}).(*SSLCertGroupDAO)
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
var SharedSSLCertGroupDAO = NewSSLCertGroupDAO()
 | 
					var SharedSSLCertGroupDAO *SSLCertGroupDAO
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func init() {
 | 
				
			||||||
 | 
						dbs.OnReady(func() {
 | 
				
			||||||
 | 
							SharedSSLCertGroupDAO = NewSSLCertGroupDAO()
 | 
				
			||||||
 | 
						})
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// 启用条目
 | 
					// 启用条目
 | 
				
			||||||
func (this *SSLCertGroupDAO) EnableSSLCertGroup(id uint32) error {
 | 
					func (this *SSLCertGroupDAO) EnableSSLCertGroup(id uint32) error {
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -29,7 +29,13 @@ func NewSSLPolicyDAO() *SSLPolicyDAO {
 | 
				
			|||||||
	}).(*SSLPolicyDAO)
 | 
						}).(*SSLPolicyDAO)
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
var SharedSSLPolicyDAO = NewSSLPolicyDAO()
 | 
					var SharedSSLPolicyDAO *SSLPolicyDAO
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func init() {
 | 
				
			||||||
 | 
						dbs.OnReady(func() {
 | 
				
			||||||
 | 
							SharedSSLPolicyDAO = NewSSLPolicyDAO()
 | 
				
			||||||
 | 
						})
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// 初始化
 | 
					// 初始化
 | 
				
			||||||
func (this *SSLPolicyDAO) Init() {
 | 
					func (this *SSLPolicyDAO) Init() {
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -21,7 +21,13 @@ func NewSysEventDAO() *SysEventDAO {
 | 
				
			|||||||
	}).(*SysEventDAO)
 | 
						}).(*SysEventDAO)
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
var SharedSysEventDAO = NewSysEventDAO()
 | 
					var SharedSysEventDAO *SysEventDAO
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func init() {
 | 
				
			||||||
 | 
						dbs.OnReady(func() {
 | 
				
			||||||
 | 
							SharedSysEventDAO = NewSysEventDAO()
 | 
				
			||||||
 | 
						})
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// 创建事件
 | 
					// 创建事件
 | 
				
			||||||
func (this *SysEventDAO) CreateEvent(event EventInterface) error {
 | 
					func (this *SysEventDAO) CreateEvent(event EventInterface) error {
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -21,7 +21,13 @@ func NewSysLockerDAO() *SysLockerDAO {
 | 
				
			|||||||
	}).(*SysLockerDAO)
 | 
						}).(*SysLockerDAO)
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
var SharedSysLockerDAO = NewSysLockerDAO()
 | 
					var SharedSysLockerDAO *SysLockerDAO
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func init() {
 | 
				
			||||||
 | 
						dbs.OnReady(func() {
 | 
				
			||||||
 | 
							SharedSysLockerDAO = NewSysLockerDAO()
 | 
				
			||||||
 | 
						})
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// 开锁
 | 
					// 开锁
 | 
				
			||||||
func (this *SysLockerDAO) Lock(key string, timeout int64) (bool, error) {
 | 
					func (this *SysLockerDAO) Lock(key string, timeout int64) (bool, error) {
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -26,7 +26,13 @@ func NewSysSettingDAO() *SysSettingDAO {
 | 
				
			|||||||
	}).(*SysSettingDAO)
 | 
						}).(*SysSettingDAO)
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
var SharedSysSettingDAO = NewSysSettingDAO()
 | 
					var SharedSysSettingDAO *SysSettingDAO
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func init() {
 | 
				
			||||||
 | 
						dbs.OnReady(func() {
 | 
				
			||||||
 | 
							SharedSysSettingDAO = NewSysSettingDAO()
 | 
				
			||||||
 | 
						})
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// 设置配置
 | 
					// 设置配置
 | 
				
			||||||
func (this *SysSettingDAO) UpdateSetting(codeFormat string, valueJSON []byte, codeFormatArgs ...interface{}) error {
 | 
					func (this *SysSettingDAO) UpdateSetting(codeFormat string, valueJSON []byte, codeFormatArgs ...interface{}) error {
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -19,7 +19,13 @@ func NewTCPFirewallPolicyDAO() *TCPFirewallPolicyDAO {
 | 
				
			|||||||
	}).(*TCPFirewallPolicyDAO)
 | 
						}).(*TCPFirewallPolicyDAO)
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
var SharedTCPFirewallPolicyDAO = NewTCPFirewallPolicyDAO()
 | 
					var SharedTCPFirewallPolicyDAO *TCPFirewallPolicyDAO
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func init() {
 | 
				
			||||||
 | 
						dbs.OnReady(func() {
 | 
				
			||||||
 | 
							SharedTCPFirewallPolicyDAO = NewTCPFirewallPolicyDAO()
 | 
				
			||||||
 | 
						})
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// 初始化
 | 
					// 初始化
 | 
				
			||||||
func (this *TCPFirewallPolicyDAO) Init() {
 | 
					func (this *TCPFirewallPolicyDAO) Init() {
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -24,7 +24,13 @@ func NewUserDAO() *UserDAO {
 | 
				
			|||||||
	}).(*UserDAO)
 | 
						}).(*UserDAO)
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
var SharedUserDAO = NewUserDAO()
 | 
					var SharedUserDAO *UserDAO
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func init() {
 | 
				
			||||||
 | 
						dbs.OnReady(func() {
 | 
				
			||||||
 | 
							SharedUserDAO = NewUserDAO()
 | 
				
			||||||
 | 
						})
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// 启用条目
 | 
					// 启用条目
 | 
				
			||||||
func (this *UserDAO) EnableUser(id uint32) (rowsAffected int64, err error) {
 | 
					func (this *UserDAO) EnableUser(id uint32) (rowsAffected int64, err error) {
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										28
									
								
								internal/db/models/version_dao.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										28
									
								
								internal/db/models/version_dao.go
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,28 @@
 | 
				
			|||||||
 | 
					package models
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import (
 | 
				
			||||||
 | 
						_ "github.com/go-sql-driver/mysql"
 | 
				
			||||||
 | 
						"github.com/iwind/TeaGo/Tea"
 | 
				
			||||||
 | 
						"github.com/iwind/TeaGo/dbs"
 | 
				
			||||||
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					type VersionDAO dbs.DAO
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func NewVersionDAO() *VersionDAO {
 | 
				
			||||||
 | 
						return dbs.NewDAO(&VersionDAO{
 | 
				
			||||||
 | 
							DAOObject: dbs.DAOObject{
 | 
				
			||||||
 | 
								DB:     Tea.Env,
 | 
				
			||||||
 | 
								Table:  "edgeVersions",
 | 
				
			||||||
 | 
								Model:  new(Version),
 | 
				
			||||||
 | 
								PkName: "id",
 | 
				
			||||||
 | 
							},
 | 
				
			||||||
 | 
						}).(*VersionDAO)
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					var SharedVersionDAO *VersionDAO
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func init() {
 | 
				
			||||||
 | 
						dbs.OnReady(func() {
 | 
				
			||||||
 | 
							SharedVersionDAO = NewVersionDAO()
 | 
				
			||||||
 | 
						})
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
							
								
								
									
										5
									
								
								internal/db/models/version_dao_test.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										5
									
								
								internal/db/models/version_dao_test.go
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,5 @@
 | 
				
			|||||||
 | 
					package models
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import (
 | 
				
			||||||
 | 
						_ "github.com/go-sql-driver/mysql"
 | 
				
			||||||
 | 
					)
 | 
				
			||||||
							
								
								
									
										16
									
								
								internal/db/models/version_model.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										16
									
								
								internal/db/models/version_model.go
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,16 @@
 | 
				
			|||||||
 | 
					package models
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// 数据库结构版本
 | 
				
			||||||
 | 
					type Version struct {
 | 
				
			||||||
 | 
						Id      uint64 `field:"id"`      // ID
 | 
				
			||||||
 | 
						Version string `field:"version"` //
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					type VersionOperator struct {
 | 
				
			||||||
 | 
						Id      interface{} // ID
 | 
				
			||||||
 | 
						Version interface{} //
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func NewVersionOperator() *VersionOperator {
 | 
				
			||||||
 | 
						return &VersionOperator{}
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
							
								
								
									
										1
									
								
								internal/db/models/version_model_ext.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										1
									
								
								internal/db/models/version_model_ext.go
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1 @@
 | 
				
			|||||||
 | 
					package models
 | 
				
			||||||
@@ -8,6 +8,7 @@ import (
 | 
				
			|||||||
	"github.com/TeaOSLab/EdgeAPI/internal/rpc/services"
 | 
						"github.com/TeaOSLab/EdgeAPI/internal/rpc/services"
 | 
				
			||||||
	"github.com/TeaOSLab/EdgeAPI/internal/utils"
 | 
						"github.com/TeaOSLab/EdgeAPI/internal/utils"
 | 
				
			||||||
	"github.com/TeaOSLab/EdgeCommon/pkg/rpc/pb"
 | 
						"github.com/TeaOSLab/EdgeCommon/pkg/rpc/pb"
 | 
				
			||||||
 | 
						"github.com/iwind/TeaGo/dbs"
 | 
				
			||||||
	"github.com/iwind/TeaGo/logs"
 | 
						"github.com/iwind/TeaGo/logs"
 | 
				
			||||||
	"google.golang.org/grpc"
 | 
						"google.golang.org/grpc"
 | 
				
			||||||
	"google.golang.org/grpc/credentials"
 | 
						"google.golang.org/grpc/credentials"
 | 
				
			||||||
@@ -28,6 +29,9 @@ func NewAPINode() *APINode {
 | 
				
			|||||||
func (this *APINode) Start() {
 | 
					func (this *APINode) Start() {
 | 
				
			||||||
	logs.Println("[API]start api node, pid: " + strconv.Itoa(os.Getpid()))
 | 
						logs.Println("[API]start api node, pid: " + strconv.Itoa(os.Getpid()))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						// 数据库通知启动
 | 
				
			||||||
 | 
						dbs.NotifyReady()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	// 读取配置
 | 
						// 读取配置
 | 
				
			||||||
	config, err := configs.SharedAPIConfig()
 | 
						config, err := configs.SharedAPIConfig()
 | 
				
			||||||
	if err != nil {
 | 
						if err != nil {
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -52,9 +52,10 @@ func (this *AdminService) CreateAdminLog(ctx context.Context, req *pb.CreateAdmi
 | 
				
			|||||||
		return nil, err
 | 
							return nil, err
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	err = models.SharedLogDAO.CreateAdminLog(userId, req.Level, req.Description, req.Action, req.Ip)
 | 
						err = models.SharedLogDAO.CreateAdminLog(userId, req.Level, req.Description, req.Action, req.Ip)
 | 
				
			||||||
	return &pb.CreateAdminLogResponse{
 | 
						if err != nil {
 | 
				
			||||||
		IsOk: err != nil,
 | 
							return nil, err
 | 
				
			||||||
	}, err
 | 
						}
 | 
				
			||||||
 | 
						return &pb.CreateAdminLogResponse{}, nil
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func (this *AdminService) CheckAdminExists(ctx context.Context, req *pb.CheckAdminExistsRequest) (*pb.CheckAdminExistsResponse, error) {
 | 
					func (this *AdminService) CheckAdminExists(ctx context.Context, req *pb.CheckAdminExistsRequest) (*pb.CheckAdminExistsResponse, error) {
 | 
				
			||||||
@@ -95,3 +96,28 @@ func (this *AdminService) FindAdminFullname(ctx context.Context, req *pb.FindAdm
 | 
				
			|||||||
		Fullname: fullname,
 | 
							Fullname: fullname,
 | 
				
			||||||
	}, nil
 | 
						}, nil
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// 创建或修改管理员
 | 
				
			||||||
 | 
					func (this *AdminService) CreateOrUpdateAdmin(ctx context.Context, req *pb.CreateOrUpdateAdminRequest) (*pb.CreateOrUpdateAdminResponse, error) {
 | 
				
			||||||
 | 
						_, _, err := rpcutils.ValidateRequest(ctx, rpcutils.UserTypeAdmin, rpcutils.UserTypeAPI)
 | 
				
			||||||
 | 
						if err != nil {
 | 
				
			||||||
 | 
							return nil, err
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						adminId, err := models.SharedAdminDAO.FindAdminIdWithUsername(req.Username)
 | 
				
			||||||
 | 
						if err != nil {
 | 
				
			||||||
 | 
							return nil, err
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						if adminId > 0 {
 | 
				
			||||||
 | 
							err = models.SharedAdminDAO.UpdateAdminPassword(adminId, req.Password)
 | 
				
			||||||
 | 
							if err != nil {
 | 
				
			||||||
 | 
								return nil, err
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							return &pb.CreateOrUpdateAdminResponse{AdminId: adminId}, nil
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						adminId, err = models.SharedAdminDAO.CreateAdmin(req.Username, req.Password, "管理员")
 | 
				
			||||||
 | 
						if err != nil {
 | 
				
			||||||
 | 
							return nil, err
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						return &pb.CreateOrUpdateAdminResponse{AdminId: adminId}, nil
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -2,6 +2,7 @@ package services
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
import (
 | 
					import (
 | 
				
			||||||
	"context"
 | 
						"context"
 | 
				
			||||||
 | 
						teaconst "github.com/TeaOSLab/EdgeAPI/internal/const"
 | 
				
			||||||
	"github.com/TeaOSLab/EdgeAPI/internal/db/models"
 | 
						"github.com/TeaOSLab/EdgeAPI/internal/db/models"
 | 
				
			||||||
	rpcutils "github.com/TeaOSLab/EdgeAPI/internal/rpc/utils"
 | 
						rpcutils "github.com/TeaOSLab/EdgeAPI/internal/rpc/utils"
 | 
				
			||||||
	"github.com/TeaOSLab/EdgeCommon/pkg/rpc/pb"
 | 
						"github.com/TeaOSLab/EdgeCommon/pkg/rpc/pb"
 | 
				
			||||||
@@ -180,3 +181,13 @@ func (this *APINodeService) FindEnabledAPINode(ctx context.Context, req *pb.Find
 | 
				
			|||||||
	}
 | 
						}
 | 
				
			||||||
	return &pb.FindEnabledAPINodeResponse{Node: result}, nil
 | 
						return &pb.FindEnabledAPINodeResponse{Node: result}, nil
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// 获取当前API节点的版本
 | 
				
			||||||
 | 
					func (this *APINodeService) FindCurrentAPINodeVersion(ctx context.Context, req *pb.FindCurrentAPINodeVersionRequest) (*pb.FindCurrentAPINodeVersionResponse, error) {
 | 
				
			||||||
 | 
						_, _, err := rpcutils.ValidateRequest(ctx)
 | 
				
			||||||
 | 
						if err != nil {
 | 
				
			||||||
 | 
							return nil, err
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						return &pb.FindCurrentAPINodeVersionResponse{Version: teaconst.Version}, nil
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -28,6 +28,7 @@ const (
 | 
				
			|||||||
	UserTypeStat     = "stat"
 | 
						UserTypeStat     = "stat"
 | 
				
			||||||
	UserTypeDNS      = "dns"
 | 
						UserTypeDNS      = "dns"
 | 
				
			||||||
	UserTypeLog      = "log"
 | 
						UserTypeLog      = "log"
 | 
				
			||||||
 | 
						UserTypeAPI      = "api"
 | 
				
			||||||
)
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// 校验请求
 | 
					// 校验请求
 | 
				
			||||||
@@ -51,23 +52,7 @@ func ValidateRequest(ctx context.Context, userTypes ...UserType) (userType UserT
 | 
				
			|||||||
	}
 | 
						}
 | 
				
			||||||
	nodeUserId := int64(0)
 | 
						nodeUserId := int64(0)
 | 
				
			||||||
	if apiToken == nil {
 | 
						if apiToken == nil {
 | 
				
			||||||
		// 我们从节点中获取
 | 
							return UserTypeNode, 0, errors.New("context: invalid api token")
 | 
				
			||||||
		node, err := models.SharedNodeDAO.FindEnabledNodeWithUniqueId(nodeId)
 | 
					 | 
				
			||||||
		if err != nil {
 | 
					 | 
				
			||||||
			return UserTypeNone, 0, err
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
		if node == nil {
 | 
					 | 
				
			||||||
			return UserTypeNone, 0, err
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
		nodeUserId = int64(node.Id)
 | 
					 | 
				
			||||||
		apiToken = &models.ApiToken{
 | 
					 | 
				
			||||||
			Id:     0,
 | 
					 | 
				
			||||||
			NodeId: nodeId,
 | 
					 | 
				
			||||||
			Secret: node.Secret,
 | 
					 | 
				
			||||||
			Role:   "node",
 | 
					 | 
				
			||||||
			State:  1,
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	tokens := md.Get("token")
 | 
						tokens := md.Get("token")
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										7
									
								
								internal/setup/config.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										7
									
								
								internal/setup/config.go
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,7 @@
 | 
				
			|||||||
 | 
					package setup
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					type Config struct {
 | 
				
			||||||
 | 
						APINodeProtocol string
 | 
				
			||||||
 | 
						APINodeHost     string
 | 
				
			||||||
 | 
						APINodePort     int
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
							
								
								
									
										187
									
								
								internal/setup/setup.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										187
									
								
								internal/setup/setup.go
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,187 @@
 | 
				
			|||||||
 | 
					package setup
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import (
 | 
				
			||||||
 | 
						"encoding/json"
 | 
				
			||||||
 | 
						"github.com/TeaOSLab/EdgeAPI/internal/configs"
 | 
				
			||||||
 | 
						"github.com/TeaOSLab/EdgeAPI/internal/db/models"
 | 
				
			||||||
 | 
						"github.com/TeaOSLab/EdgeAPI/internal/errors"
 | 
				
			||||||
 | 
						"github.com/TeaOSLab/EdgeCommon/pkg/serverconfigs"
 | 
				
			||||||
 | 
						"github.com/go-yaml/yaml"
 | 
				
			||||||
 | 
						"github.com/iwind/TeaGo/Tea"
 | 
				
			||||||
 | 
						"github.com/iwind/TeaGo/cmd"
 | 
				
			||||||
 | 
						"github.com/iwind/TeaGo/dbs"
 | 
				
			||||||
 | 
						"github.com/iwind/TeaGo/types"
 | 
				
			||||||
 | 
						"io/ioutil"
 | 
				
			||||||
 | 
						"os"
 | 
				
			||||||
 | 
						"strconv"
 | 
				
			||||||
 | 
						"strings"
 | 
				
			||||||
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					type Setup struct {
 | 
				
			||||||
 | 
						config *Config
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						// 要返回的数据
 | 
				
			||||||
 | 
						AdminNodeId     string
 | 
				
			||||||
 | 
						AdminNodeSecret string
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func NewSetup(config *Config) *Setup {
 | 
				
			||||||
 | 
						return &Setup{
 | 
				
			||||||
 | 
							config: config,
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func NewSetupFromCmd() *Setup {
 | 
				
			||||||
 | 
						args := cmd.ParseArgs(strings.Join(os.Args[1:], " "))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						config := &Config{}
 | 
				
			||||||
 | 
						for _, arg := range args {
 | 
				
			||||||
 | 
							index := strings.Index(arg, "=")
 | 
				
			||||||
 | 
							if index <= 0 {
 | 
				
			||||||
 | 
								continue
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							value := arg[index+1:]
 | 
				
			||||||
 | 
							value = strings.Trim(value, "\"'")
 | 
				
			||||||
 | 
							switch arg[:index] {
 | 
				
			||||||
 | 
							case "-api-node-protocol":
 | 
				
			||||||
 | 
								config.APINodeProtocol = value
 | 
				
			||||||
 | 
							case "-api-node-host":
 | 
				
			||||||
 | 
								config.APINodeHost = value
 | 
				
			||||||
 | 
							case "-api-node-port":
 | 
				
			||||||
 | 
								config.APINodePort = types.Int(value)
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						return NewSetup(config)
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func (this *Setup) Run() error {
 | 
				
			||||||
 | 
						if this.config == nil {
 | 
				
			||||||
 | 
							return errors.New("config should not be nil")
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if len(this.config.APINodeProtocol) == 0 {
 | 
				
			||||||
 | 
							return errors.New("api node protocol should not be empty")
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						if this.config.APINodeProtocol != "http" && this.config.APINodeProtocol != "https" {
 | 
				
			||||||
 | 
							return errors.New("invalid api node protocol: " + this.config.APINodeProtocol)
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						if len(this.config.APINodeHost) == 0 {
 | 
				
			||||||
 | 
							return errors.New("api node host should not be empty")
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						if this.config.APINodePort <= 0 {
 | 
				
			||||||
 | 
							return errors.New("api node port should not be less than 1")
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						// 执行SQL
 | 
				
			||||||
 | 
						config := &dbs.Config{}
 | 
				
			||||||
 | 
						configData, err := ioutil.ReadFile(Tea.ConfigFile("db.yaml"))
 | 
				
			||||||
 | 
						if err != nil {
 | 
				
			||||||
 | 
							return err
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						err = yaml.Unmarshal(configData, config)
 | 
				
			||||||
 | 
						if err != nil {
 | 
				
			||||||
 | 
							return err
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						for _, db := range config.DBs {
 | 
				
			||||||
 | 
							// 可以同时运行多条语句
 | 
				
			||||||
 | 
							db.Dsn += "&multiStatements=true"
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						dbConfig, ok := config.DBs[Tea.Env]
 | 
				
			||||||
 | 
						if !ok {
 | 
				
			||||||
 | 
							return errors.New("can not find database config for env '" + Tea.Env + "'")
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						executor := NewSQLExecutor(dbConfig)
 | 
				
			||||||
 | 
						err = executor.Run()
 | 
				
			||||||
 | 
						if err != nil {
 | 
				
			||||||
 | 
							return err
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						// Admin节点信息
 | 
				
			||||||
 | 
						apiTokenDAO := models.NewApiTokenDAO()
 | 
				
			||||||
 | 
						token, err := apiTokenDAO.FindEnabledTokenWithRole("admin")
 | 
				
			||||||
 | 
						if err != nil {
 | 
				
			||||||
 | 
							return err
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						if token == nil {
 | 
				
			||||||
 | 
							return errors.New("can not find admin node token, please run the setup again")
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						this.AdminNodeId = token.NodeId
 | 
				
			||||||
 | 
						this.AdminNodeSecret = token.Secret
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						// 检查API节点
 | 
				
			||||||
 | 
						dao := models.NewAPINodeDAO()
 | 
				
			||||||
 | 
						apiNodeId, err := dao.FindEnabledAPINodeIdWithAddr(this.config.APINodeProtocol, this.config.APINodeHost, this.config.APINodePort)
 | 
				
			||||||
 | 
						if err != nil {
 | 
				
			||||||
 | 
							return err
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						if apiNodeId == 0 {
 | 
				
			||||||
 | 
							addr := &serverconfigs.NetworkAddressConfig{
 | 
				
			||||||
 | 
								Protocol:  serverconfigs.Protocol(this.config.APINodeProtocol),
 | 
				
			||||||
 | 
								Host:      this.config.APINodeHost,
 | 
				
			||||||
 | 
								PortRange: strconv.Itoa(this.config.APINodePort),
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							addrsJSON, err := json.Marshal([]*serverconfigs.NetworkAddressConfig{addr})
 | 
				
			||||||
 | 
							if err != nil {
 | 
				
			||||||
 | 
								return errors.New("json encode api node addr failed: " + err.Error())
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							var httpJSON []byte = nil
 | 
				
			||||||
 | 
							var httpsJSON []byte = nil
 | 
				
			||||||
 | 
							if this.config.APINodeProtocol == "http" {
 | 
				
			||||||
 | 
								httpConfig := &serverconfigs.HTTPProtocolConfig{}
 | 
				
			||||||
 | 
								httpConfig.IsOn = true
 | 
				
			||||||
 | 
								httpConfig.Listen = []*serverconfigs.NetworkAddressConfig{
 | 
				
			||||||
 | 
									{
 | 
				
			||||||
 | 
										PortRange: strconv.Itoa(this.config.APINodePort),
 | 
				
			||||||
 | 
									},
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
								httpJSON, err = json.Marshal(httpConfig)
 | 
				
			||||||
 | 
								if err != nil {
 | 
				
			||||||
 | 
									return errors.New("json encode api node http config failed: " + err.Error())
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							if this.config.APINodeProtocol == "https" {
 | 
				
			||||||
 | 
								// TODO 如果在安装过程中开启了HTTPS,需要同时上传SSL证书
 | 
				
			||||||
 | 
								httpsConfig := &serverconfigs.HTTPSProtocolConfig{}
 | 
				
			||||||
 | 
								httpsConfig.IsOn = true
 | 
				
			||||||
 | 
								httpsConfig.Listen = []*serverconfigs.NetworkAddressConfig{
 | 
				
			||||||
 | 
									{
 | 
				
			||||||
 | 
										PortRange: strconv.Itoa(this.config.APINodePort),
 | 
				
			||||||
 | 
									},
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
								httpsJSON, err = json.Marshal(httpsConfig)
 | 
				
			||||||
 | 
								if err != nil {
 | 
				
			||||||
 | 
									return errors.New("json encode api node https config failed: " + err.Error())
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							// 创建API节点
 | 
				
			||||||
 | 
							nodeId, err := dao.CreateAPINode("默认API节点", "这是默认创建的第一个API节点", httpJSON, httpsJSON, addrsJSON, true)
 | 
				
			||||||
 | 
							if err != nil {
 | 
				
			||||||
 | 
								return errors.New("create api node in database failed: " + err.Error())
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							apiNodeId = nodeId
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						apiNode, err := dao.FindEnabledAPINode(apiNodeId)
 | 
				
			||||||
 | 
						if err != nil {
 | 
				
			||||||
 | 
							return err
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						if apiNode == nil {
 | 
				
			||||||
 | 
							return errors.New("apiNode should not be nil")
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						// 保存配置
 | 
				
			||||||
 | 
						apiConfig := &configs.APIConfig{
 | 
				
			||||||
 | 
							NodeId: apiNode.UniqueId,
 | 
				
			||||||
 | 
							Secret: apiNode.Secret,
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						err = apiConfig.WriteFile(Tea.ConfigFile("api.yaml"))
 | 
				
			||||||
 | 
						if err != nil {
 | 
				
			||||||
 | 
							return errors.New("save config failed: " + err.Error())
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						return nil
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
							
								
								
									
										19
									
								
								internal/setup/setup_test.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										19
									
								
								internal/setup/setup_test.go
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,19 @@
 | 
				
			|||||||
 | 
					package setup
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import (
 | 
				
			||||||
 | 
						_ "github.com/iwind/TeaGo/bootstrap"
 | 
				
			||||||
 | 
						"testing"
 | 
				
			||||||
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func TestSetup_Run(t *testing.T) {
 | 
				
			||||||
 | 
						setup := NewSetup(&Config{
 | 
				
			||||||
 | 
							APINodeProtocol: "http",
 | 
				
			||||||
 | 
							APINodeHost:     "127.0.0.1",
 | 
				
			||||||
 | 
							APINodePort:     8003,
 | 
				
			||||||
 | 
						})
 | 
				
			||||||
 | 
						err := setup.Run()
 | 
				
			||||||
 | 
						if err != nil {
 | 
				
			||||||
 | 
							t.Fatal(err)
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						t.Log("OK")
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
							
								
								
									
										279
									
								
								internal/setup/sql_executor.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										279
									
								
								internal/setup/sql_executor.go
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,279 @@
 | 
				
			|||||||
 | 
					package setup
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import (
 | 
				
			||||||
 | 
						teaconst "github.com/TeaOSLab/EdgeAPI/internal/const"
 | 
				
			||||||
 | 
						"github.com/TeaOSLab/EdgeAPI/internal/errors"
 | 
				
			||||||
 | 
						"github.com/TeaOSLab/EdgeAPI/internal/setup/sqls"
 | 
				
			||||||
 | 
						_ "github.com/go-sql-driver/mysql"
 | 
				
			||||||
 | 
						"github.com/iwind/TeaGo/dbs"
 | 
				
			||||||
 | 
						"github.com/iwind/TeaGo/lists"
 | 
				
			||||||
 | 
						"github.com/iwind/TeaGo/rands"
 | 
				
			||||||
 | 
						"github.com/iwind/TeaGo/types"
 | 
				
			||||||
 | 
						stringutil "github.com/iwind/TeaGo/utils/string"
 | 
				
			||||||
 | 
						"sort"
 | 
				
			||||||
 | 
						"strings"
 | 
				
			||||||
 | 
						"time"
 | 
				
			||||||
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					type SQLExecutor struct {
 | 
				
			||||||
 | 
						dbConfig *dbs.DBConfig
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func NewSQLExecutor(dbConfig *dbs.DBConfig) *SQLExecutor {
 | 
				
			||||||
 | 
						return &SQLExecutor{
 | 
				
			||||||
 | 
							dbConfig: dbConfig,
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func (this *SQLExecutor) Run() error {
 | 
				
			||||||
 | 
						db, err := dbs.NewInstanceFromConfig(this.dbConfig)
 | 
				
			||||||
 | 
						if err != nil {
 | 
				
			||||||
 | 
							return err
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						tableNames, err := db.TableNames()
 | 
				
			||||||
 | 
						if err != nil {
 | 
				
			||||||
 | 
							return err
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						// 检查已有数据
 | 
				
			||||||
 | 
						if lists.ContainsString(tableNames, "edgeVersions") {
 | 
				
			||||||
 | 
							stmt, err := db.Prepare("SELECT version FROM " + db.TablePrefix() + "Versions")
 | 
				
			||||||
 | 
							if err != nil {
 | 
				
			||||||
 | 
								return err
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							defer func() {
 | 
				
			||||||
 | 
								_ = stmt.Close()
 | 
				
			||||||
 | 
							}()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							rows, err := stmt.Query()
 | 
				
			||||||
 | 
							if err != nil {
 | 
				
			||||||
 | 
								return err
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							defer func() {
 | 
				
			||||||
 | 
								_ = rows.Close()
 | 
				
			||||||
 | 
							}()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							// 对比版本
 | 
				
			||||||
 | 
							oldVersion := ""
 | 
				
			||||||
 | 
							if rows.Next() {
 | 
				
			||||||
 | 
								err = rows.Scan(&oldVersion)
 | 
				
			||||||
 | 
								if err != nil {
 | 
				
			||||||
 | 
									return errors.New("query version failed: " + err.Error())
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							if oldVersion == teaconst.Version {
 | 
				
			||||||
 | 
								err = this.checkData(db)
 | 
				
			||||||
 | 
								if err != nil {
 | 
				
			||||||
 | 
									return err
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
								return nil
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							oldVersion = strings.Replace(oldVersion, "_", ".", -1)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							upgradeVersions := []string{}
 | 
				
			||||||
 | 
							sqlMap := map[string]string{} // version => sql
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							for _, m := range sqls.SQLVersions {
 | 
				
			||||||
 | 
								version, _ := m["version"]
 | 
				
			||||||
 | 
								if version == "full" {
 | 
				
			||||||
 | 
									continue
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
								version = strings.Replace(version, "_", ".", -1)
 | 
				
			||||||
 | 
								if len(oldVersion) == 0 || stringutil.VersionCompare(version, oldVersion) > 0 {
 | 
				
			||||||
 | 
									upgradeVersions = append(upgradeVersions, version)
 | 
				
			||||||
 | 
									sql, _ := m["sql"]
 | 
				
			||||||
 | 
									sqlMap[version] = sql
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							// 如果没有可以升级的版本,直接返回
 | 
				
			||||||
 | 
							if len(upgradeVersions) == 0 {
 | 
				
			||||||
 | 
								err = this.checkData(db)
 | 
				
			||||||
 | 
								if err != nil {
 | 
				
			||||||
 | 
									return err
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
								return nil
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							sort.Slice(upgradeVersions, func(i, j int) bool {
 | 
				
			||||||
 | 
								return stringutil.VersionCompare(upgradeVersions[i], upgradeVersions[j]) < 0
 | 
				
			||||||
 | 
							})
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							// 执行升级的SQL
 | 
				
			||||||
 | 
							for _, version := range upgradeVersions {
 | 
				
			||||||
 | 
								sql := sqlMap[version]
 | 
				
			||||||
 | 
								_, err = db.Exec(sql)
 | 
				
			||||||
 | 
								if err != nil {
 | 
				
			||||||
 | 
									if !this.canIgnoreError(err) {
 | 
				
			||||||
 | 
										return errors.New("exec upgrade sql for version '" + version + "' failed: " + err.Error())
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
									}
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
								err = this.updateVersion(db, version)
 | 
				
			||||||
 | 
								if err != nil {
 | 
				
			||||||
 | 
									return err
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							// 检查数据
 | 
				
			||||||
 | 
							err = this.checkData(db)
 | 
				
			||||||
 | 
							if err != nil {
 | 
				
			||||||
 | 
								return err
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							return nil
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						// 全新安装
 | 
				
			||||||
 | 
						fullSQL, found := this.findFullSQL()
 | 
				
			||||||
 | 
						if !found {
 | 
				
			||||||
 | 
							return errors.New("not found full setup sql")
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						// 执行SQL
 | 
				
			||||||
 | 
						_, err = db.Exec(fullSQL)
 | 
				
			||||||
 | 
						if err != nil {
 | 
				
			||||||
 | 
							return errors.New("create tables failed: " + err.Error())
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						// 检查数据
 | 
				
			||||||
 | 
						err = this.checkData(db)
 | 
				
			||||||
 | 
						if err != nil {
 | 
				
			||||||
 | 
							return err
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						return nil
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// 查找完整的SQL
 | 
				
			||||||
 | 
					func (this *SQLExecutor) findFullSQL() (sql string, found bool) {
 | 
				
			||||||
 | 
						for _, m := range sqls.SQLVersions {
 | 
				
			||||||
 | 
							code, _ := m["version"]
 | 
				
			||||||
 | 
							if code == "full" {
 | 
				
			||||||
 | 
								sql, found = m["sql"]
 | 
				
			||||||
 | 
								return
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						return
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// 检查数据
 | 
				
			||||||
 | 
					func (this *SQLExecutor) checkData(db *dbs.DB) error {
 | 
				
			||||||
 | 
						// 检查管理员
 | 
				
			||||||
 | 
						err := this.checkAdmin(db)
 | 
				
			||||||
 | 
						if err != nil {
 | 
				
			||||||
 | 
							return err
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						// 检查管理员平台节点
 | 
				
			||||||
 | 
						err = this.checkAdminNode(db)
 | 
				
			||||||
 | 
						if err != nil {
 | 
				
			||||||
 | 
							return err
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						// 更新版本号
 | 
				
			||||||
 | 
						err = this.updateVersion(db, teaconst.Version)
 | 
				
			||||||
 | 
						if err != nil {
 | 
				
			||||||
 | 
							return err
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						return nil
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// 检查管理员
 | 
				
			||||||
 | 
					func (this *SQLExecutor) checkAdmin(db *dbs.DB) error {
 | 
				
			||||||
 | 
						stmt, err := db.Prepare("SELECT COUNT(*) FROM edgeAdmins")
 | 
				
			||||||
 | 
						if err != nil {
 | 
				
			||||||
 | 
							return errors.New("check admin failed: " + err.Error())
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						defer func() {
 | 
				
			||||||
 | 
							_ = stmt.Close()
 | 
				
			||||||
 | 
						}()
 | 
				
			||||||
 | 
						col, err := stmt.FindCol(0)
 | 
				
			||||||
 | 
						if err != nil {
 | 
				
			||||||
 | 
							return errors.New("check admin failed: " + err.Error())
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						count := types.Int(col)
 | 
				
			||||||
 | 
						if count == 0 {
 | 
				
			||||||
 | 
							_, err = db.Exec("INSERT INTO edgeAdmins (username, password, fullname, isSuper, createdAt, state) VALUES (?, ?, ?, ?, ?, ?)", "admin", stringutil.Md5("123456"), "管理员", 1, time.Now().Unix(), 1)
 | 
				
			||||||
 | 
							if err != nil {
 | 
				
			||||||
 | 
								return errors.New("create admin failed: " + err.Error())
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						return nil
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// 检查管理员平台节点
 | 
				
			||||||
 | 
					func (this *SQLExecutor) checkAdminNode(db *dbs.DB) error {
 | 
				
			||||||
 | 
						stmt, err := db.Prepare("SELECT COUNT(*) FROM edgeAPITokens WHERE role='admin'")
 | 
				
			||||||
 | 
						if err != nil {
 | 
				
			||||||
 | 
							return err
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						defer func() {
 | 
				
			||||||
 | 
							_ = stmt.Close()
 | 
				
			||||||
 | 
						}()
 | 
				
			||||||
 | 
						col, err := stmt.FindCol(0)
 | 
				
			||||||
 | 
						if err != nil {
 | 
				
			||||||
 | 
							return err
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						count := types.Int(col)
 | 
				
			||||||
 | 
						if count > 0 {
 | 
				
			||||||
 | 
							return nil
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						nodeId := rands.HexString(32)
 | 
				
			||||||
 | 
						secret := rands.String(32)
 | 
				
			||||||
 | 
						_, err = db.Exec("INSERT INTO edgeAPITokens (nodeId, secret, role) VALUES (?, ?, ?)", nodeId, secret, "admin")
 | 
				
			||||||
 | 
						if err != nil {
 | 
				
			||||||
 | 
							return err
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						return nil
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// 更新版本号
 | 
				
			||||||
 | 
					func (this *SQLExecutor) updateVersion(db *dbs.DB, version string) error {
 | 
				
			||||||
 | 
						stmt, err := db.Prepare("SELECT COUNT(*) FROM edgeVersions")
 | 
				
			||||||
 | 
						if err != nil {
 | 
				
			||||||
 | 
							return errors.New("query version failed: " + err.Error())
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						defer func() {
 | 
				
			||||||
 | 
							_ = stmt.Close()
 | 
				
			||||||
 | 
						}()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						col, err := stmt.FindCol(0)
 | 
				
			||||||
 | 
						if err != nil {
 | 
				
			||||||
 | 
							return errors.New("query version failed: " + err.Error())
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						count := types.Int(col)
 | 
				
			||||||
 | 
						if count > 0 {
 | 
				
			||||||
 | 
							_, err = db.Exec("UPDATE edgeVersions SET version=?", version)
 | 
				
			||||||
 | 
							if err != nil {
 | 
				
			||||||
 | 
								return errors.New("update version failed: " + err.Error())
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							return nil
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						_, err = db.Exec("INSERT edgeVersions (version) VALUES (?)", version)
 | 
				
			||||||
 | 
						if err != nil {
 | 
				
			||||||
 | 
							return errors.New("create version failed: " + err.Error())
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						return nil
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// 判断某个错误是否可以忽略
 | 
				
			||||||
 | 
					func (this *SQLExecutor) canIgnoreError(err error) bool {
 | 
				
			||||||
 | 
						if err == nil {
 | 
				
			||||||
 | 
							return true
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						// Error 1050: Table 'xxx' already exists
 | 
				
			||||||
 | 
						if strings.Contains(err.Error(), "Error 1050") {
 | 
				
			||||||
 | 
							return true
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						return false
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
							
								
								
									
										19
									
								
								internal/setup/sql_executor_test.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										19
									
								
								internal/setup/sql_executor_test.go
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,19 @@
 | 
				
			|||||||
 | 
					package setup
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import (
 | 
				
			||||||
 | 
						"github.com/iwind/TeaGo/dbs"
 | 
				
			||||||
 | 
						"testing"
 | 
				
			||||||
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func TestSQLExecutor_Run(t *testing.T) {
 | 
				
			||||||
 | 
						executor := NewSQLExecutor(&dbs.DBConfig{
 | 
				
			||||||
 | 
							Driver: "mysql",
 | 
				
			||||||
 | 
							Prefix: "edge",
 | 
				
			||||||
 | 
							Dsn:    "root:123456@tcp(127.0.0.1:3306)/db_edge_new?charset=utf8mb4&multiStatements=true",
 | 
				
			||||||
 | 
						})
 | 
				
			||||||
 | 
						err := executor.Run()
 | 
				
			||||||
 | 
						if err != nil {
 | 
				
			||||||
 | 
							t.Fatal(err)
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						t.Log("ok")
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
							
								
								
									
										642
									
								
								internal/setup/sqls/sql_full.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										642
									
								
								internal/setup/sqls/sql_full.go
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,642 @@
 | 
				
			|||||||
 | 
					// generated
 | 
				
			||||||
 | 
					package sqls
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					var SQL_full = "CREATE TABLE `edgeAPINodes` (\n" +
 | 
				
			||||||
 | 
						"  `id` int(11) unsigned NOT NULL AUTO_INCREMENT COMMENT 'ID',\n" +
 | 
				
			||||||
 | 
						"  `isOn` tinyint(1) unsigned DEFAULT '1' COMMENT '是否启用',\n" +
 | 
				
			||||||
 | 
						"  `clusterId` int(11) unsigned DEFAULT '0' COMMENT '专用集群ID',\n" +
 | 
				
			||||||
 | 
						"  `uniqueId` varchar(32) DEFAULT NULL COMMENT '唯一ID',\n" +
 | 
				
			||||||
 | 
						"  `secret` varchar(32) DEFAULT NULL COMMENT '密钥',\n" +
 | 
				
			||||||
 | 
						"  `name` varchar(255) DEFAULT NULL COMMENT '名称',\n" +
 | 
				
			||||||
 | 
						"  `description` varchar(1024) DEFAULT NULL COMMENT '描述',\n" +
 | 
				
			||||||
 | 
						"  `http` json DEFAULT NULL COMMENT '监听的HTTP配置',\n" +
 | 
				
			||||||
 | 
						"  `https` json DEFAULT NULL COMMENT '监听的HTTPS配置',\n" +
 | 
				
			||||||
 | 
						"  `accessAddrs` json DEFAULT NULL COMMENT '外部访问地址',\n" +
 | 
				
			||||||
 | 
						"  `order` int(11) unsigned DEFAULT '0' COMMENT '排序',\n" +
 | 
				
			||||||
 | 
						"  `state` tinyint(1) unsigned DEFAULT '1' COMMENT '状态',\n" +
 | 
				
			||||||
 | 
						"  `createdAt` bigint(11) unsigned DEFAULT '0' COMMENT '创建时间',\n" +
 | 
				
			||||||
 | 
						"  `adminId` int(11) unsigned DEFAULT '0' COMMENT '管理员ID',\n" +
 | 
				
			||||||
 | 
						"  `weight` int(11) unsigned DEFAULT '0' COMMENT '权重',\n" +
 | 
				
			||||||
 | 
						"  `status` json DEFAULT NULL COMMENT '运行状态',\n" +
 | 
				
			||||||
 | 
						"  PRIMARY KEY (`id`),\n" +
 | 
				
			||||||
 | 
						"  UNIQUE KEY `uniqueId` (`uniqueId`) USING BTREE\n" +
 | 
				
			||||||
 | 
						") ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='API节点';\n" +
 | 
				
			||||||
 | 
						"CREATE TABLE `edgeAPITokens` (\n" +
 | 
				
			||||||
 | 
						"  `id` int(11) unsigned NOT NULL AUTO_INCREMENT COMMENT 'ID',\n" +
 | 
				
			||||||
 | 
						"  `nodeId` varchar(32) DEFAULT NULL COMMENT '节点ID',\n" +
 | 
				
			||||||
 | 
						"  `secret` varchar(255) DEFAULT NULL COMMENT '节点密钥',\n" +
 | 
				
			||||||
 | 
						"  `role` varchar(64) DEFAULT NULL COMMENT '节点角色',\n" +
 | 
				
			||||||
 | 
						"  `state` tinyint(1) unsigned DEFAULT '1' COMMENT '状态',\n" +
 | 
				
			||||||
 | 
						"  PRIMARY KEY (`id`),\n" +
 | 
				
			||||||
 | 
						"  KEY `nodeId` (`nodeId`)\n" +
 | 
				
			||||||
 | 
						") ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='API令牌管理';\n" +
 | 
				
			||||||
 | 
						"CREATE TABLE `edgeAdmins` (\n" +
 | 
				
			||||||
 | 
						"  `id` int(11) unsigned NOT NULL AUTO_INCREMENT COMMENT 'ID',\n" +
 | 
				
			||||||
 | 
						"  `username` varchar(64) DEFAULT NULL COMMENT '用户名',\n" +
 | 
				
			||||||
 | 
						"  `password` varchar(32) DEFAULT NULL COMMENT '密码',\n" +
 | 
				
			||||||
 | 
						"  `fullname` varchar(64) DEFAULT NULL COMMENT '全名',\n" +
 | 
				
			||||||
 | 
						"  `isSuper` tinyint(1) unsigned DEFAULT '0' COMMENT '是否为超级管理员',\n" +
 | 
				
			||||||
 | 
						"  `createdAt` bigint(11) unsigned DEFAULT '0' COMMENT '创建时间',\n" +
 | 
				
			||||||
 | 
						"  `updatedAt` bigint(11) unsigned DEFAULT '0' COMMENT '修改时间',\n" +
 | 
				
			||||||
 | 
						"  `state` tinyint(1) unsigned DEFAULT '1' COMMENT '状态',\n" +
 | 
				
			||||||
 | 
						"  PRIMARY KEY (`id`)\n" +
 | 
				
			||||||
 | 
						") ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='管理员';\n" +
 | 
				
			||||||
 | 
						"CREATE TABLE `edgeDBNodes` (\n" +
 | 
				
			||||||
 | 
						"  `id` int(11) unsigned NOT NULL AUTO_INCREMENT COMMENT 'ID',\n" +
 | 
				
			||||||
 | 
						"  `isOn` tinyint(1) unsigned DEFAULT '1' COMMENT '是否启用',\n" +
 | 
				
			||||||
 | 
						"  `role` varchar(255) DEFAULT NULL COMMENT '数据库角色',\n" +
 | 
				
			||||||
 | 
						"  `name` varchar(255) DEFAULT NULL COMMENT '名称',\n" +
 | 
				
			||||||
 | 
						"  `description` varchar(1024) DEFAULT NULL COMMENT '描述',\n" +
 | 
				
			||||||
 | 
						"  `host` varchar(255) DEFAULT NULL COMMENT '主机',\n" +
 | 
				
			||||||
 | 
						"  `port` int(11) unsigned DEFAULT '0' COMMENT '端口',\n" +
 | 
				
			||||||
 | 
						"  `database` varchar(255) DEFAULT NULL COMMENT '数据库名称',\n" +
 | 
				
			||||||
 | 
						"  `username` varchar(255) DEFAULT NULL COMMENT '用户名',\n" +
 | 
				
			||||||
 | 
						"  `password` varchar(255) DEFAULT NULL COMMENT '密码',\n" +
 | 
				
			||||||
 | 
						"  `charset` varchar(255) DEFAULT NULL COMMENT '通讯字符集',\n" +
 | 
				
			||||||
 | 
						"  `connTimeout` int(11) unsigned DEFAULT '0' COMMENT '连接超时时间(秒)',\n" +
 | 
				
			||||||
 | 
						"  `state` tinyint(1) unsigned DEFAULT '1' COMMENT '状态',\n" +
 | 
				
			||||||
 | 
						"  `createdAt` bigint(11) unsigned DEFAULT '0' COMMENT '创建时间',\n" +
 | 
				
			||||||
 | 
						"  `weight` int(11) unsigned DEFAULT '0' COMMENT '权重',\n" +
 | 
				
			||||||
 | 
						"  `order` int(11) unsigned DEFAULT '0' COMMENT '排序',\n" +
 | 
				
			||||||
 | 
						"  `adminId` int(11) unsigned DEFAULT '0' COMMENT '管理员ID',\n" +
 | 
				
			||||||
 | 
						"  PRIMARY KEY (`id`)\n" +
 | 
				
			||||||
 | 
						") ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='数据库节点';\n" +
 | 
				
			||||||
 | 
						"CREATE TABLE `edgeFileChunks` (\n" +
 | 
				
			||||||
 | 
						"  `id` int(11) unsigned NOT NULL AUTO_INCREMENT COMMENT 'ID',\n" +
 | 
				
			||||||
 | 
						"  `fileId` int(11) unsigned DEFAULT '0' COMMENT '文件ID',\n" +
 | 
				
			||||||
 | 
						"  `data` longblob COMMENT '分块内容',\n" +
 | 
				
			||||||
 | 
						"  PRIMARY KEY (`id`),\n" +
 | 
				
			||||||
 | 
						"  KEY `fileId` (`fileId`)\n" +
 | 
				
			||||||
 | 
						") ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='文件片段';\n" +
 | 
				
			||||||
 | 
						"CREATE TABLE `edgeFiles` (\n" +
 | 
				
			||||||
 | 
						"  `id` int(11) unsigned NOT NULL AUTO_INCREMENT COMMENT 'ID',\n" +
 | 
				
			||||||
 | 
						"  `adminId` int(11) unsigned DEFAULT '0' COMMENT '管理员ID',\n" +
 | 
				
			||||||
 | 
						"  `userId` int(11) unsigned DEFAULT '0' COMMENT '用户ID',\n" +
 | 
				
			||||||
 | 
						"  `description` varchar(255) DEFAULT NULL COMMENT '文件描述',\n" +
 | 
				
			||||||
 | 
						"  `filename` varchar(255) DEFAULT NULL COMMENT '文件名',\n" +
 | 
				
			||||||
 | 
						"  `size` int(11) unsigned DEFAULT '0' COMMENT '文件尺寸',\n" +
 | 
				
			||||||
 | 
						"  `createdAt` bigint(11) unsigned DEFAULT '0' COMMENT '创建时间',\n" +
 | 
				
			||||||
 | 
						"  `order` int(11) unsigned DEFAULT '0' COMMENT '排序',\n" +
 | 
				
			||||||
 | 
						"  `type` varchar(64) DEFAULT '' COMMENT '类型',\n" +
 | 
				
			||||||
 | 
						"  `state` tinyint(1) unsigned DEFAULT '1' COMMENT '状态',\n" +
 | 
				
			||||||
 | 
						"  PRIMARY KEY (`id`),\n" +
 | 
				
			||||||
 | 
						"  KEY `type` (`type`)\n" +
 | 
				
			||||||
 | 
						") ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='文件管理';\n" +
 | 
				
			||||||
 | 
						"CREATE TABLE `edgeHTTPAccessLogPolicies` (\n" +
 | 
				
			||||||
 | 
						"  `id` int(11) unsigned NOT NULL AUTO_INCREMENT COMMENT 'ID',\n" +
 | 
				
			||||||
 | 
						"  `templateId` int(11) unsigned DEFAULT '0' COMMENT '模版ID',\n" +
 | 
				
			||||||
 | 
						"  `adminId` int(11) unsigned DEFAULT '0' COMMENT '管理员ID',\n" +
 | 
				
			||||||
 | 
						"  `userId` int(11) unsigned DEFAULT '0' COMMENT '用户ID',\n" +
 | 
				
			||||||
 | 
						"  `state` tinyint(1) unsigned DEFAULT '1' COMMENT '状态',\n" +
 | 
				
			||||||
 | 
						"  `createdAt` bigint(11) unsigned DEFAULT '0' COMMENT '创建时间',\n" +
 | 
				
			||||||
 | 
						"  `name` varchar(255) DEFAULT NULL COMMENT '名称',\n" +
 | 
				
			||||||
 | 
						"  `isOn` tinyint(1) unsigned DEFAULT '1' COMMENT '是否启用',\n" +
 | 
				
			||||||
 | 
						"  `type` varchar(255) DEFAULT NULL COMMENT '存储类型',\n" +
 | 
				
			||||||
 | 
						"  `options` json DEFAULT NULL COMMENT '存储选项',\n" +
 | 
				
			||||||
 | 
						"  `conds` json DEFAULT NULL COMMENT '请求条件',\n" +
 | 
				
			||||||
 | 
						"  PRIMARY KEY (`id`)\n" +
 | 
				
			||||||
 | 
						") ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='访问日志策略';\n" +
 | 
				
			||||||
 | 
						"CREATE TABLE `edgeHTTPAccessLogs` (\n" +
 | 
				
			||||||
 | 
						"  `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT 'ID',\n" +
 | 
				
			||||||
 | 
						"  `serverId` int(11) unsigned DEFAULT '0' COMMENT '服务ID',\n" +
 | 
				
			||||||
 | 
						"  `nodeId` int(11) unsigned DEFAULT '0' COMMENT '节点ID',\n" +
 | 
				
			||||||
 | 
						"  `status` int(3) unsigned DEFAULT '0' COMMENT '状态码',\n" +
 | 
				
			||||||
 | 
						"  `createdAt` bigint(11) unsigned DEFAULT '0' COMMENT '创建时间',\n" +
 | 
				
			||||||
 | 
						"  `content` json DEFAULT NULL COMMENT '日志内容',\n" +
 | 
				
			||||||
 | 
						"  `requestId` varchar(128) DEFAULT NULL COMMENT '请求ID',\n" +
 | 
				
			||||||
 | 
						"  PRIMARY KEY (`id`),\n" +
 | 
				
			||||||
 | 
						"  KEY `serverId` (`serverId`),\n" +
 | 
				
			||||||
 | 
						"  KEY `nodeId` (`nodeId`),\n" +
 | 
				
			||||||
 | 
						"  KEY `serverId_status` (`serverId`,`status`),\n" +
 | 
				
			||||||
 | 
						"  KEY `requestId` (`requestId`)\n" +
 | 
				
			||||||
 | 
						") ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;\n" +
 | 
				
			||||||
 | 
						"CREATE TABLE `edgeHTTPAccessLogs_20201010` (\n" +
 | 
				
			||||||
 | 
						"  `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT 'ID',\n" +
 | 
				
			||||||
 | 
						"  `serverId` int(11) unsigned DEFAULT '0' COMMENT '服务ID',\n" +
 | 
				
			||||||
 | 
						"  `nodeId` int(11) unsigned DEFAULT '0' COMMENT '节点ID',\n" +
 | 
				
			||||||
 | 
						"  `status` int(3) unsigned DEFAULT '0' COMMENT '状态码',\n" +
 | 
				
			||||||
 | 
						"  `createdAt` bigint(11) unsigned DEFAULT '0' COMMENT '创建时间',\n" +
 | 
				
			||||||
 | 
						"  `content` json DEFAULT NULL COMMENT '日志内容',\n" +
 | 
				
			||||||
 | 
						"  `day` varchar(8) DEFAULT NULL COMMENT '日期Ymd',\n" +
 | 
				
			||||||
 | 
						"  PRIMARY KEY (`id`),\n" +
 | 
				
			||||||
 | 
						"  KEY `serverId` (`serverId`),\n" +
 | 
				
			||||||
 | 
						"  KEY `nodeId` (`nodeId`),\n" +
 | 
				
			||||||
 | 
						"  KEY `serverId_status` (`serverId`,`status`)\n" +
 | 
				
			||||||
 | 
						") ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;\n" +
 | 
				
			||||||
 | 
						"CREATE TABLE `edgeHTTPCachePolicies` (\n" +
 | 
				
			||||||
 | 
						"  `id` int(11) unsigned NOT NULL AUTO_INCREMENT COMMENT 'ID',\n" +
 | 
				
			||||||
 | 
						"  `adminId` int(11) unsigned DEFAULT '0' COMMENT '管理员ID',\n" +
 | 
				
			||||||
 | 
						"  `userId` int(11) unsigned DEFAULT '0' COMMENT '用户ID',\n" +
 | 
				
			||||||
 | 
						"  `templateId` int(11) unsigned DEFAULT '0' COMMENT '模版ID',\n" +
 | 
				
			||||||
 | 
						"  `isOn` tinyint(1) unsigned DEFAULT '1' COMMENT '是否启用',\n" +
 | 
				
			||||||
 | 
						"  `name` varchar(255) DEFAULT NULL COMMENT '名称',\n" +
 | 
				
			||||||
 | 
						"  `capacity` json DEFAULT NULL COMMENT '容量数据',\n" +
 | 
				
			||||||
 | 
						"  `maxKeys` bigint(20) unsigned DEFAULT '0' COMMENT '最多Key值',\n" +
 | 
				
			||||||
 | 
						"  `maxSize` json DEFAULT NULL COMMENT '最大缓存内容尺寸',\n" +
 | 
				
			||||||
 | 
						"  `type` varchar(255) DEFAULT NULL COMMENT '存储类型',\n" +
 | 
				
			||||||
 | 
						"  `options` json DEFAULT NULL COMMENT '存储选项',\n" +
 | 
				
			||||||
 | 
						"  `createdAt` bigint(11) unsigned DEFAULT '0' COMMENT '创建时间',\n" +
 | 
				
			||||||
 | 
						"  `state` tinyint(1) unsigned DEFAULT '1' COMMENT '状态',\n" +
 | 
				
			||||||
 | 
						"  `description` varchar(1024) DEFAULT NULL COMMENT '描述',\n" +
 | 
				
			||||||
 | 
						"  PRIMARY KEY (`id`)\n" +
 | 
				
			||||||
 | 
						") ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='HTTP缓存策略';\n" +
 | 
				
			||||||
 | 
						"CREATE TABLE `edgeHTTPFirewallPolicies` (\n" +
 | 
				
			||||||
 | 
						"  `id` int(11) unsigned NOT NULL AUTO_INCREMENT COMMENT 'ID',\n" +
 | 
				
			||||||
 | 
						"  `templateId` int(11) unsigned DEFAULT '0' COMMENT '模版ID',\n" +
 | 
				
			||||||
 | 
						"  `adminId` int(11) unsigned DEFAULT '0' COMMENT '管理员ID',\n" +
 | 
				
			||||||
 | 
						"  `userId` int(11) unsigned DEFAULT '0' COMMENT '用户ID',\n" +
 | 
				
			||||||
 | 
						"  `state` tinyint(1) unsigned DEFAULT '1' COMMENT '状态',\n" +
 | 
				
			||||||
 | 
						"  `createdAt` bigint(11) unsigned DEFAULT '0' COMMENT '创建时间',\n" +
 | 
				
			||||||
 | 
						"  `isOn` tinyint(1) unsigned DEFAULT '1' COMMENT '是否启用',\n" +
 | 
				
			||||||
 | 
						"  `name` varchar(255) DEFAULT NULL COMMENT '名称',\n" +
 | 
				
			||||||
 | 
						"  `description` varchar(1024) DEFAULT NULL COMMENT '描述',\n" +
 | 
				
			||||||
 | 
						"  `inbound` json DEFAULT NULL COMMENT '入站规则',\n" +
 | 
				
			||||||
 | 
						"  `outbound` json DEFAULT NULL COMMENT '出站规则',\n" +
 | 
				
			||||||
 | 
						"  PRIMARY KEY (`id`)\n" +
 | 
				
			||||||
 | 
						") ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='HTTP防火墙';\n" +
 | 
				
			||||||
 | 
						"CREATE TABLE `edgeHTTPFirewallRuleGroups` (\n" +
 | 
				
			||||||
 | 
						"  `id` int(11) unsigned NOT NULL AUTO_INCREMENT COMMENT 'ID',\n" +
 | 
				
			||||||
 | 
						"  `isOn` tinyint(1) unsigned DEFAULT '1' COMMENT '是否启用',\n" +
 | 
				
			||||||
 | 
						"  `name` varchar(255) DEFAULT NULL COMMENT '名称',\n" +
 | 
				
			||||||
 | 
						"  `description` varchar(1024) DEFAULT NULL COMMENT '描述',\n" +
 | 
				
			||||||
 | 
						"  `code` varchar(255) DEFAULT NULL COMMENT '代号',\n" +
 | 
				
			||||||
 | 
						"  `adminId` int(11) unsigned DEFAULT '0' COMMENT '管理员ID',\n" +
 | 
				
			||||||
 | 
						"  `userId` int(11) unsigned DEFAULT '0' COMMENT '用户ID',\n" +
 | 
				
			||||||
 | 
						"  `state` tinyint(1) unsigned DEFAULT '1' COMMENT '状态',\n" +
 | 
				
			||||||
 | 
						"  `sets` json DEFAULT NULL COMMENT '规则集列表',\n" +
 | 
				
			||||||
 | 
						"  `createdAt` bigint(11) unsigned DEFAULT '0' COMMENT '创建时间',\n" +
 | 
				
			||||||
 | 
						"  PRIMARY KEY (`id`)\n" +
 | 
				
			||||||
 | 
						") ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='防火墙规则分组';\n" +
 | 
				
			||||||
 | 
						"CREATE TABLE `edgeHTTPFirewallRuleSets` (\n" +
 | 
				
			||||||
 | 
						"  `id` int(11) unsigned NOT NULL AUTO_INCREMENT COMMENT 'ID',\n" +
 | 
				
			||||||
 | 
						"  `isOn` tinyint(1) unsigned DEFAULT '1' COMMENT '是否启用',\n" +
 | 
				
			||||||
 | 
						"  `code` varchar(255) DEFAULT NULL COMMENT '代号',\n" +
 | 
				
			||||||
 | 
						"  `name` varchar(255) DEFAULT NULL COMMENT '名称',\n" +
 | 
				
			||||||
 | 
						"  `description` varchar(1024) DEFAULT NULL COMMENT '描述',\n" +
 | 
				
			||||||
 | 
						"  `createdAt` bigint(11) unsigned DEFAULT '0' COMMENT '创建时间',\n" +
 | 
				
			||||||
 | 
						"  `rules` json DEFAULT NULL COMMENT '规则列表',\n" +
 | 
				
			||||||
 | 
						"  `connector` varchar(64) DEFAULT NULL COMMENT '规则之间的关系',\n" +
 | 
				
			||||||
 | 
						"  `state` tinyint(1) unsigned DEFAULT '1' COMMENT '状态',\n" +
 | 
				
			||||||
 | 
						"  `adminId` int(11) unsigned DEFAULT '0' COMMENT '管理员ID',\n" +
 | 
				
			||||||
 | 
						"  `userId` int(11) unsigned DEFAULT '0' COMMENT '用户ID',\n" +
 | 
				
			||||||
 | 
						"  `action` varchar(255) DEFAULT NULL COMMENT '执行的动作',\n" +
 | 
				
			||||||
 | 
						"  `actionOptions` json DEFAULT NULL COMMENT '动作的选项',\n" +
 | 
				
			||||||
 | 
						"  PRIMARY KEY (`id`)\n" +
 | 
				
			||||||
 | 
						") ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='防火墙规则集';\n" +
 | 
				
			||||||
 | 
						"CREATE TABLE `edgeHTTPFirewallRules` (\n" +
 | 
				
			||||||
 | 
						"  `id` int(11) unsigned NOT NULL AUTO_INCREMENT COMMENT 'ID',\n" +
 | 
				
			||||||
 | 
						"  `isOn` tinyint(1) unsigned DEFAULT '1' COMMENT '是否启用',\n" +
 | 
				
			||||||
 | 
						"  `description` varchar(1024) DEFAULT NULL COMMENT '说明',\n" +
 | 
				
			||||||
 | 
						"  `param` varchar(1024) DEFAULT NULL COMMENT '参数',\n" +
 | 
				
			||||||
 | 
						"  `operator` varchar(255) DEFAULT NULL COMMENT '操作符',\n" +
 | 
				
			||||||
 | 
						"  `value` varchar(1024) DEFAULT NULL COMMENT '对比值',\n" +
 | 
				
			||||||
 | 
						"  `isCaseInsensitive` tinyint(1) unsigned DEFAULT '1' COMMENT '是否大小写不敏感',\n" +
 | 
				
			||||||
 | 
						"  `checkpointOptions` json DEFAULT NULL COMMENT '检查点参数',\n" +
 | 
				
			||||||
 | 
						"  `state` tinyint(1) unsigned DEFAULT '1' COMMENT '状态',\n" +
 | 
				
			||||||
 | 
						"  `createdAt` bigint(11) unsigned DEFAULT '0' COMMENT '创建时间',\n" +
 | 
				
			||||||
 | 
						"  `adminId` int(11) unsigned DEFAULT '0' COMMENT '管理员ID',\n" +
 | 
				
			||||||
 | 
						"  `userId` int(11) unsigned DEFAULT '0' COMMENT '用户ID',\n" +
 | 
				
			||||||
 | 
						"  PRIMARY KEY (`id`)\n" +
 | 
				
			||||||
 | 
						") ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='防火墙规则';\n" +
 | 
				
			||||||
 | 
						"CREATE TABLE `edgeHTTPGzips` (\n" +
 | 
				
			||||||
 | 
						"  `id` int(11) unsigned NOT NULL AUTO_INCREMENT COMMENT 'ID',\n" +
 | 
				
			||||||
 | 
						"  `adminId` int(11) unsigned DEFAULT '0' COMMENT '管理员ID',\n" +
 | 
				
			||||||
 | 
						"  `userId` int(11) unsigned DEFAULT '0' COMMENT '用户ID',\n" +
 | 
				
			||||||
 | 
						"  `isOn` tinyint(1) unsigned DEFAULT '1' COMMENT '是否启用',\n" +
 | 
				
			||||||
 | 
						"  `level` int(11) unsigned DEFAULT '0' COMMENT '压缩级别',\n" +
 | 
				
			||||||
 | 
						"  `minLength` json DEFAULT NULL COMMENT '可压缩最小值',\n" +
 | 
				
			||||||
 | 
						"  `maxLength` json DEFAULT NULL COMMENT '可压缩最大值',\n" +
 | 
				
			||||||
 | 
						"  `state` tinyint(1) unsigned DEFAULT '1' COMMENT '状态',\n" +
 | 
				
			||||||
 | 
						"  `createdAt` bigint(11) unsigned DEFAULT '0' COMMENT '创建时间',\n" +
 | 
				
			||||||
 | 
						"  `conds` json DEFAULT NULL COMMENT '条件',\n" +
 | 
				
			||||||
 | 
						"  PRIMARY KEY (`id`)\n" +
 | 
				
			||||||
 | 
						") ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='Gzip配置';\n" +
 | 
				
			||||||
 | 
						"CREATE TABLE `edgeHTTPHeaderPolicies` (\n" +
 | 
				
			||||||
 | 
						"  `id` int(11) unsigned NOT NULL AUTO_INCREMENT COMMENT 'ID',\n" +
 | 
				
			||||||
 | 
						"  `isOn` tinyint(1) unsigned NOT NULL DEFAULT '1' COMMENT '是否启用',\n" +
 | 
				
			||||||
 | 
						"  `state` tinyint(1) unsigned DEFAULT '1' COMMENT '状态',\n" +
 | 
				
			||||||
 | 
						"  `adminId` int(11) unsigned DEFAULT '0' COMMENT '管理员ID',\n" +
 | 
				
			||||||
 | 
						"  `userId` int(11) unsigned DEFAULT '0' COMMENT '用户ID',\n" +
 | 
				
			||||||
 | 
						"  `createdAt` bigint(11) unsigned DEFAULT '0' COMMENT '创建时间',\n" +
 | 
				
			||||||
 | 
						"  `addHeaders` json DEFAULT NULL COMMENT '添加的Header',\n" +
 | 
				
			||||||
 | 
						"  `addTrailers` json DEFAULT NULL COMMENT '添加的Trailers',\n" +
 | 
				
			||||||
 | 
						"  `setHeaders` json DEFAULT NULL COMMENT '设置Header',\n" +
 | 
				
			||||||
 | 
						"  `replaceHeaders` json DEFAULT NULL COMMENT '替换Header内容',\n" +
 | 
				
			||||||
 | 
						"  `expires` json DEFAULT NULL COMMENT 'Expires单独设置',\n" +
 | 
				
			||||||
 | 
						"  `deleteHeaders` json DEFAULT NULL COMMENT '删除的Headers',\n" +
 | 
				
			||||||
 | 
						"  PRIMARY KEY (`id`)\n" +
 | 
				
			||||||
 | 
						") ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='Header定义';\n" +
 | 
				
			||||||
 | 
						"CREATE TABLE `edgeHTTPHeaders` (\n" +
 | 
				
			||||||
 | 
						"  `id` int(11) unsigned NOT NULL AUTO_INCREMENT COMMENT 'ID',\n" +
 | 
				
			||||||
 | 
						"  `adminId` int(11) unsigned DEFAULT '0' COMMENT '管理员ID',\n" +
 | 
				
			||||||
 | 
						"  `userId` int(11) unsigned DEFAULT '0' COMMENT '用户ID',\n" +
 | 
				
			||||||
 | 
						"  `templateId` int(11) unsigned DEFAULT '0' COMMENT '模版ID',\n" +
 | 
				
			||||||
 | 
						"  `isOn` tinyint(1) unsigned DEFAULT '1' COMMENT '是否启用',\n" +
 | 
				
			||||||
 | 
						"  `name` varchar(255) DEFAULT NULL COMMENT '名称',\n" +
 | 
				
			||||||
 | 
						"  `value` varchar(1024) DEFAULT NULL COMMENT '值',\n" +
 | 
				
			||||||
 | 
						"  `order` int(11) unsigned DEFAULT '0' COMMENT '排序',\n" +
 | 
				
			||||||
 | 
						"  `status` json DEFAULT NULL COMMENT '状态码设置',\n" +
 | 
				
			||||||
 | 
						"  `state` tinyint(1) unsigned DEFAULT '1' COMMENT '状态',\n" +
 | 
				
			||||||
 | 
						"  `createdAt` bigint(11) unsigned DEFAULT '0' COMMENT '创建时间',\n" +
 | 
				
			||||||
 | 
						"  PRIMARY KEY (`id`)\n" +
 | 
				
			||||||
 | 
						") ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='HTTP Header';\n" +
 | 
				
			||||||
 | 
						"CREATE TABLE `edgeHTTPLocations` (\n" +
 | 
				
			||||||
 | 
						"  `id` int(11) unsigned NOT NULL AUTO_INCREMENT COMMENT 'ID',\n" +
 | 
				
			||||||
 | 
						"  `templateId` int(11) unsigned DEFAULT '0' COMMENT '模版ID',\n" +
 | 
				
			||||||
 | 
						"  `adminId` int(11) unsigned DEFAULT '0' COMMENT '管理员ID',\n" +
 | 
				
			||||||
 | 
						"  `userId` int(11) unsigned DEFAULT '0' COMMENT '用户ID',\n" +
 | 
				
			||||||
 | 
						"  `parentId` int(11) unsigned DEFAULT '0' COMMENT '父级ID',\n" +
 | 
				
			||||||
 | 
						"  `state` tinyint(1) unsigned DEFAULT '1' COMMENT '状态',\n" +
 | 
				
			||||||
 | 
						"  `createdAt` bigint(11) unsigned DEFAULT '0' COMMENT '创建时间',\n" +
 | 
				
			||||||
 | 
						"  `pattern` varchar(1024) DEFAULT NULL COMMENT '匹配规则',\n" +
 | 
				
			||||||
 | 
						"  `isOn` tinyint(1) unsigned DEFAULT '1' COMMENT '是否启用',\n" +
 | 
				
			||||||
 | 
						"  `name` varchar(255) DEFAULT NULL COMMENT '名称',\n" +
 | 
				
			||||||
 | 
						"  `description` varchar(1024) DEFAULT NULL COMMENT '描述',\n" +
 | 
				
			||||||
 | 
						"  `webId` int(11) unsigned DEFAULT '0' COMMENT 'Web配置ID',\n" +
 | 
				
			||||||
 | 
						"  `reverseProxy` json DEFAULT NULL COMMENT '反向代理',\n" +
 | 
				
			||||||
 | 
						"  `urlPrefix` varchar(1024) DEFAULT NULL COMMENT 'URL前缀',\n" +
 | 
				
			||||||
 | 
						"  `isBreak` tinyint(1) unsigned DEFAULT '0' COMMENT '是否终止匹配',\n" +
 | 
				
			||||||
 | 
						"  `conds` json DEFAULT NULL COMMENT '匹配条件',\n" +
 | 
				
			||||||
 | 
						"  PRIMARY KEY (`id`)\n" +
 | 
				
			||||||
 | 
						") ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='路径规则配置';\n" +
 | 
				
			||||||
 | 
						"CREATE TABLE `edgeHTTPPages` (\n" +
 | 
				
			||||||
 | 
						"  `id` int(11) unsigned NOT NULL AUTO_INCREMENT COMMENT 'ID',\n" +
 | 
				
			||||||
 | 
						"  `adminId` int(11) unsigned DEFAULT '0' COMMENT '管理员ID',\n" +
 | 
				
			||||||
 | 
						"  `userId` int(11) unsigned DEFAULT '0' COMMENT '用户ID',\n" +
 | 
				
			||||||
 | 
						"  `isOn` tinyint(1) unsigned DEFAULT '0' COMMENT '是否启用',\n" +
 | 
				
			||||||
 | 
						"  `statusList` json DEFAULT NULL COMMENT '状态列表',\n" +
 | 
				
			||||||
 | 
						"  `url` varchar(1024) DEFAULT NULL COMMENT '页面URL',\n" +
 | 
				
			||||||
 | 
						"  `newStatus` int(3) DEFAULT NULL COMMENT '新状态码',\n" +
 | 
				
			||||||
 | 
						"  `state` tinyint(1) unsigned DEFAULT '1' COMMENT '状态',\n" +
 | 
				
			||||||
 | 
						"  `createdAt` bigint(11) unsigned DEFAULT '0' COMMENT '创建时间',\n" +
 | 
				
			||||||
 | 
						"  PRIMARY KEY (`id`)\n" +
 | 
				
			||||||
 | 
						") ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='特殊页面';\n" +
 | 
				
			||||||
 | 
						"CREATE TABLE `edgeHTTPRewriteRules` (\n" +
 | 
				
			||||||
 | 
						"  `id` int(11) unsigned NOT NULL AUTO_INCREMENT COMMENT 'ID',\n" +
 | 
				
			||||||
 | 
						"  `adminId` int(11) unsigned DEFAULT '0' COMMENT '管理员ID',\n" +
 | 
				
			||||||
 | 
						"  `userId` int(11) unsigned DEFAULT '0' COMMENT '用户ID',\n" +
 | 
				
			||||||
 | 
						"  `templateId` int(11) unsigned DEFAULT '0' COMMENT '模版ID',\n" +
 | 
				
			||||||
 | 
						"  `isOn` tinyint(1) unsigned DEFAULT '1' COMMENT '是否启用',\n" +
 | 
				
			||||||
 | 
						"  `state` tinyint(1) unsigned DEFAULT '1' COMMENT '状态',\n" +
 | 
				
			||||||
 | 
						"  `createdAt` bigint(11) unsigned DEFAULT '0' COMMENT '创建时间',\n" +
 | 
				
			||||||
 | 
						"  `pattern` varchar(1024) DEFAULT NULL COMMENT '匹配规则',\n" +
 | 
				
			||||||
 | 
						"  `replace` varchar(1024) DEFAULT NULL COMMENT '跳转后的地址',\n" +
 | 
				
			||||||
 | 
						"  `mode` varchar(255) DEFAULT NULL COMMENT '替换模式',\n" +
 | 
				
			||||||
 | 
						"  `redirectStatus` int(3) unsigned DEFAULT '0' COMMENT '跳转的状态码',\n" +
 | 
				
			||||||
 | 
						"  `proxyHost` varchar(255) DEFAULT NULL COMMENT '代理的主机名',\n" +
 | 
				
			||||||
 | 
						"  `isBreak` tinyint(1) unsigned DEFAULT '1' COMMENT '是否终止解析',\n" +
 | 
				
			||||||
 | 
						"  `withQuery` tinyint(1) unsigned DEFAULT '1' COMMENT '是否保留URI参数',\n" +
 | 
				
			||||||
 | 
						"  `conds` json DEFAULT NULL COMMENT '匹配条件',\n" +
 | 
				
			||||||
 | 
						"  PRIMARY KEY (`id`)\n" +
 | 
				
			||||||
 | 
						") ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='重写规则';\n" +
 | 
				
			||||||
 | 
						"CREATE TABLE `edgeHTTPWebs` (\n" +
 | 
				
			||||||
 | 
						"  `id` int(11) unsigned NOT NULL AUTO_INCREMENT COMMENT 'ID',\n" +
 | 
				
			||||||
 | 
						"  `isOn` tinyint(1) unsigned DEFAULT '1' COMMENT '是否启用',\n" +
 | 
				
			||||||
 | 
						"  `templateId` int(11) unsigned DEFAULT '0' COMMENT '模版ID',\n" +
 | 
				
			||||||
 | 
						"  `adminId` int(11) unsigned DEFAULT '0' COMMENT '管理员ID',\n" +
 | 
				
			||||||
 | 
						"  `userId` int(11) unsigned DEFAULT '0' COMMENT '用户ID',\n" +
 | 
				
			||||||
 | 
						"  `state` tinyint(1) unsigned DEFAULT '1' COMMENT '状态',\n" +
 | 
				
			||||||
 | 
						"  `createdAt` bigint(11) unsigned DEFAULT '0' COMMENT '创建时间',\n" +
 | 
				
			||||||
 | 
						"  `root` json DEFAULT NULL COMMENT '根目录',\n" +
 | 
				
			||||||
 | 
						"  `charset` json DEFAULT NULL COMMENT '字符集',\n" +
 | 
				
			||||||
 | 
						"  `shutdown` json DEFAULT NULL COMMENT '临时关闭页面配置',\n" +
 | 
				
			||||||
 | 
						"  `pages` json DEFAULT NULL COMMENT '特殊页面',\n" +
 | 
				
			||||||
 | 
						"  `redirectToHttps` json DEFAULT NULL COMMENT '跳转到HTTPS设置',\n" +
 | 
				
			||||||
 | 
						"  `indexes` json DEFAULT NULL COMMENT '首页文件列表',\n" +
 | 
				
			||||||
 | 
						"  `maxRequestBodySize` json DEFAULT NULL COMMENT '最大允许的请求内容尺寸',\n" +
 | 
				
			||||||
 | 
						"  `requestHeader` json DEFAULT NULL COMMENT '请求Header配置',\n" +
 | 
				
			||||||
 | 
						"  `responseHeader` json DEFAULT NULL COMMENT '响应Header配置',\n" +
 | 
				
			||||||
 | 
						"  `accessLog` json DEFAULT NULL COMMENT '访问日志配置',\n" +
 | 
				
			||||||
 | 
						"  `stat` json DEFAULT NULL COMMENT '统计配置',\n" +
 | 
				
			||||||
 | 
						"  `gzip` json DEFAULT NULL COMMENT 'Gzip配置',\n" +
 | 
				
			||||||
 | 
						"  `cache` json DEFAULT NULL COMMENT '缓存配置',\n" +
 | 
				
			||||||
 | 
						"  `firewall` json DEFAULT NULL COMMENT '防火墙设置',\n" +
 | 
				
			||||||
 | 
						"  `locations` json DEFAULT NULL COMMENT '路径规则配置',\n" +
 | 
				
			||||||
 | 
						"  `websocket` json DEFAULT NULL COMMENT 'Websocket设置',\n" +
 | 
				
			||||||
 | 
						"  `rewriteRules` json DEFAULT NULL COMMENT '重写规则配置',\n" +
 | 
				
			||||||
 | 
						"  PRIMARY KEY (`id`)\n" +
 | 
				
			||||||
 | 
						") ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='HTTP Web';\n" +
 | 
				
			||||||
 | 
						"CREATE TABLE `edgeHTTPWebsockets` (\n" +
 | 
				
			||||||
 | 
						"  `id` int(11) unsigned NOT NULL AUTO_INCREMENT COMMENT 'ID',\n" +
 | 
				
			||||||
 | 
						"  `adminId` int(11) unsigned DEFAULT '0' COMMENT '管理员ID',\n" +
 | 
				
			||||||
 | 
						"  `userId` int(11) unsigned DEFAULT '0' COMMENT '用户ID',\n" +
 | 
				
			||||||
 | 
						"  `createdAt` bigint(11) unsigned DEFAULT '0' COMMENT '创建时间',\n" +
 | 
				
			||||||
 | 
						"  `state` tinyint(1) unsigned DEFAULT '1' COMMENT '状态',\n" +
 | 
				
			||||||
 | 
						"  `isOn` tinyint(1) unsigned DEFAULT '1' COMMENT '是否启用',\n" +
 | 
				
			||||||
 | 
						"  `handshakeTimeout` json DEFAULT NULL COMMENT '握手超时时间',\n" +
 | 
				
			||||||
 | 
						"  `allowAllOrigins` tinyint(1) unsigned DEFAULT '1' COMMENT '是否支持所有源',\n" +
 | 
				
			||||||
 | 
						"  `allowedOrigins` json DEFAULT NULL COMMENT '支持的源域名列表',\n" +
 | 
				
			||||||
 | 
						"  `requestSameOrigin` tinyint(1) unsigned DEFAULT '1' COMMENT '是否请求一样的Origin',\n" +
 | 
				
			||||||
 | 
						"  `requestOrigin` varchar(255) DEFAULT NULL COMMENT '请求Origin',\n" +
 | 
				
			||||||
 | 
						"  PRIMARY KEY (`id`)\n" +
 | 
				
			||||||
 | 
						") ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='Websocket设置';\n" +
 | 
				
			||||||
 | 
						"CREATE TABLE `edgeLogs` (\n" +
 | 
				
			||||||
 | 
						"  `id` int(11) unsigned NOT NULL AUTO_INCREMENT COMMENT 'ID',\n" +
 | 
				
			||||||
 | 
						"  `level` varchar(32) DEFAULT NULL COMMENT '级别',\n" +
 | 
				
			||||||
 | 
						"  `description` varchar(255) DEFAULT NULL COMMENT '描述',\n" +
 | 
				
			||||||
 | 
						"  `createdAt` bigint(11) unsigned DEFAULT '0' COMMENT '创建时间',\n" +
 | 
				
			||||||
 | 
						"  `action` varchar(255) DEFAULT NULL COMMENT '动作',\n" +
 | 
				
			||||||
 | 
						"  `userId` int(11) unsigned DEFAULT '0' COMMENT '用户ID',\n" +
 | 
				
			||||||
 | 
						"  `adminId` int(11) unsigned DEFAULT '0' COMMENT '管理员ID',\n" +
 | 
				
			||||||
 | 
						"  `providerId` int(11) unsigned DEFAULT '0' COMMENT '供应商ID',\n" +
 | 
				
			||||||
 | 
						"  `ip` varchar(32) DEFAULT NULL COMMENT 'IP地址',\n" +
 | 
				
			||||||
 | 
						"  `type` varchar(255) DEFAULT 'admin' COMMENT '类型:admin, user',\n" +
 | 
				
			||||||
 | 
						"  PRIMARY KEY (`id`)\n" +
 | 
				
			||||||
 | 
						") ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='操作日志';\n" +
 | 
				
			||||||
 | 
						"CREATE TABLE `edgeNodeClusters` (\n" +
 | 
				
			||||||
 | 
						"  `id` int(11) unsigned NOT NULL AUTO_INCREMENT COMMENT 'ID',\n" +
 | 
				
			||||||
 | 
						"  `adminId` int(11) unsigned DEFAULT '0' COMMENT '管理员ID',\n" +
 | 
				
			||||||
 | 
						"  `userId` int(11) unsigned DEFAULT '0' COMMENT '用户ID',\n" +
 | 
				
			||||||
 | 
						"  `name` varchar(255) DEFAULT NULL COMMENT '名称',\n" +
 | 
				
			||||||
 | 
						"  `useAllAPINodes` tinyint(1) unsigned DEFAULT '1' COMMENT '是否使用所有API节点',\n" +
 | 
				
			||||||
 | 
						"  `apiNodes` json DEFAULT NULL COMMENT '使用的API节点',\n" +
 | 
				
			||||||
 | 
						"  `installDir` varchar(512) DEFAULT NULL COMMENT '安装目录',\n" +
 | 
				
			||||||
 | 
						"  `order` int(11) unsigned DEFAULT '0' COMMENT '排序',\n" +
 | 
				
			||||||
 | 
						"  `createdAt` bigint(11) unsigned DEFAULT '0' COMMENT '创建时间',\n" +
 | 
				
			||||||
 | 
						"  `grantId` int(11) unsigned DEFAULT '0' COMMENT '默认认证方式',\n" +
 | 
				
			||||||
 | 
						"  `state` tinyint(1) unsigned DEFAULT '1' COMMENT '状态',\n" +
 | 
				
			||||||
 | 
						"  PRIMARY KEY (`id`)\n" +
 | 
				
			||||||
 | 
						") ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='节点集群';\n" +
 | 
				
			||||||
 | 
						"CREATE TABLE `edgeNodeGrants` (\n" +
 | 
				
			||||||
 | 
						"  `id` int(11) unsigned NOT NULL AUTO_INCREMENT COMMENT 'ID',\n" +
 | 
				
			||||||
 | 
						"  `name` varchar(255) DEFAULT NULL COMMENT '名称',\n" +
 | 
				
			||||||
 | 
						"  `method` varchar(64) DEFAULT NULL COMMENT '登录方式',\n" +
 | 
				
			||||||
 | 
						"  `username` varchar(255) DEFAULT NULL COMMENT '用户名',\n" +
 | 
				
			||||||
 | 
						"  `password` varchar(255) DEFAULT NULL COMMENT '密码',\n" +
 | 
				
			||||||
 | 
						"  `su` tinyint(1) unsigned DEFAULT '1' COMMENT '是否需要su',\n" +
 | 
				
			||||||
 | 
						"  `privateKey` varchar(4096) DEFAULT NULL COMMENT '密钥',\n" +
 | 
				
			||||||
 | 
						"  `description` varchar(255) DEFAULT NULL COMMENT '备注',\n" +
 | 
				
			||||||
 | 
						"  `nodeId` int(11) unsigned DEFAULT '0' COMMENT '专有节点',\n" +
 | 
				
			||||||
 | 
						"  `state` tinyint(1) unsigned DEFAULT '1' COMMENT '状态',\n" +
 | 
				
			||||||
 | 
						"  `createdAt` bigint(11) unsigned DEFAULT '0' COMMENT '创建时间',\n" +
 | 
				
			||||||
 | 
						"  PRIMARY KEY (`id`)\n" +
 | 
				
			||||||
 | 
						") ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='节点授权';\n" +
 | 
				
			||||||
 | 
						"CREATE TABLE `edgeNodeGroups` (\n" +
 | 
				
			||||||
 | 
						"  `id` int(11) unsigned NOT NULL AUTO_INCREMENT COMMENT 'ID',\n" +
 | 
				
			||||||
 | 
						"  `name` varchar(255) DEFAULT NULL COMMENT '名称',\n" +
 | 
				
			||||||
 | 
						"  `order` int(11) unsigned DEFAULT '0' COMMENT '排序',\n" +
 | 
				
			||||||
 | 
						"  `createdAt` bigint(11) unsigned DEFAULT '0' COMMENT '创建时间',\n" +
 | 
				
			||||||
 | 
						"  `state` tinyint(1) unsigned DEFAULT '1' COMMENT '状态',\n" +
 | 
				
			||||||
 | 
						"  PRIMARY KEY (`id`)\n" +
 | 
				
			||||||
 | 
						") ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='节点分组';\n" +
 | 
				
			||||||
 | 
						"CREATE TABLE `edgeNodeIPAddresses` (\n" +
 | 
				
			||||||
 | 
						"  `id` int(11) unsigned NOT NULL AUTO_INCREMENT COMMENT 'ID',\n" +
 | 
				
			||||||
 | 
						"  `nodeId` int(11) unsigned DEFAULT '0' COMMENT '节点ID',\n" +
 | 
				
			||||||
 | 
						"  `name` varchar(255) DEFAULT NULL COMMENT '名称',\n" +
 | 
				
			||||||
 | 
						"  `ip` varchar(128) DEFAULT NULL COMMENT 'IP地址',\n" +
 | 
				
			||||||
 | 
						"  `description` varchar(255) DEFAULT NULL COMMENT '描述',\n" +
 | 
				
			||||||
 | 
						"  `state` tinyint(1) unsigned DEFAULT '1' COMMENT '状态',\n" +
 | 
				
			||||||
 | 
						"  `order` int(11) unsigned DEFAULT '0' COMMENT '排序',\n" +
 | 
				
			||||||
 | 
						"  PRIMARY KEY (`id`),\n" +
 | 
				
			||||||
 | 
						"  KEY `nodeId` (`nodeId`)\n" +
 | 
				
			||||||
 | 
						") ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='节点IP地址';\n" +
 | 
				
			||||||
 | 
						"CREATE TABLE `edgeNodeLogins` (\n" +
 | 
				
			||||||
 | 
						"  `id` int(11) unsigned NOT NULL AUTO_INCREMENT COMMENT 'ID',\n" +
 | 
				
			||||||
 | 
						"  `nodeId` int(11) unsigned DEFAULT '0' COMMENT '节点ID',\n" +
 | 
				
			||||||
 | 
						"  `name` varchar(255) DEFAULT NULL COMMENT '名称',\n" +
 | 
				
			||||||
 | 
						"  `type` varchar(255) DEFAULT NULL COMMENT '类型:ssh,agent',\n" +
 | 
				
			||||||
 | 
						"  `params` json DEFAULT NULL COMMENT '配置参数',\n" +
 | 
				
			||||||
 | 
						"  `state` tinyint(1) unsigned DEFAULT '1' COMMENT '状态',\n" +
 | 
				
			||||||
 | 
						"  PRIMARY KEY (`id`),\n" +
 | 
				
			||||||
 | 
						"  KEY `nodeId` (`nodeId`)\n" +
 | 
				
			||||||
 | 
						") ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='节点登录信息';\n" +
 | 
				
			||||||
 | 
						"CREATE TABLE `edgeNodeLogs` (\n" +
 | 
				
			||||||
 | 
						"  `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT 'ID',\n" +
 | 
				
			||||||
 | 
						"  `role` varchar(64) DEFAULT NULL COMMENT '节点角色',\n" +
 | 
				
			||||||
 | 
						"  `createdAt` bigint(11) unsigned DEFAULT '0' COMMENT '创建时间',\n" +
 | 
				
			||||||
 | 
						"  `tag` varchar(255) DEFAULT NULL COMMENT '标签',\n" +
 | 
				
			||||||
 | 
						"  `description` varchar(1024) DEFAULT NULL COMMENT '描述',\n" +
 | 
				
			||||||
 | 
						"  `level` varchar(32) DEFAULT NULL COMMENT '级别',\n" +
 | 
				
			||||||
 | 
						"  `nodeId` int(11) unsigned DEFAULT '0' COMMENT '节点ID',\n" +
 | 
				
			||||||
 | 
						"  `day` varchar(8) DEFAULT NULL COMMENT '日期',\n" +
 | 
				
			||||||
 | 
						"  PRIMARY KEY (`id`),\n" +
 | 
				
			||||||
 | 
						"  KEY `level` (`level`),\n" +
 | 
				
			||||||
 | 
						"  KEY `day` (`day`),\n" +
 | 
				
			||||||
 | 
						"  KEY `role_nodeId` (`role`,`nodeId`) USING BTREE\n" +
 | 
				
			||||||
 | 
						") ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='节点日志';\n" +
 | 
				
			||||||
 | 
						"CREATE TABLE `edgeNodeRegions` (\n" +
 | 
				
			||||||
 | 
						"  `id` int(11) unsigned NOT NULL AUTO_INCREMENT COMMENT 'ID',\n" +
 | 
				
			||||||
 | 
						"  `name` varchar(255) DEFAULT NULL COMMENT '名称',\n" +
 | 
				
			||||||
 | 
						"  `order` int(11) unsigned DEFAULT '0' COMMENT '排序',\n" +
 | 
				
			||||||
 | 
						"  `createdAt` bigint(11) unsigned DEFAULT '0' COMMENT '创建时间',\n" +
 | 
				
			||||||
 | 
						"  `state` tinyint(1) unsigned DEFAULT '1' COMMENT '状态',\n" +
 | 
				
			||||||
 | 
						"  PRIMARY KEY (`id`)\n" +
 | 
				
			||||||
 | 
						") ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='节点区域';\n" +
 | 
				
			||||||
 | 
						"CREATE TABLE `edgeNodes` (\n" +
 | 
				
			||||||
 | 
						"  `id` int(11) unsigned NOT NULL AUTO_INCREMENT COMMENT 'ID',\n" +
 | 
				
			||||||
 | 
						"  `adminId` int(11) unsigned DEFAULT '0' COMMENT '管理员ID',\n" +
 | 
				
			||||||
 | 
						"  `userId` int(11) unsigned DEFAULT '0' COMMENT '用户ID',\n" +
 | 
				
			||||||
 | 
						"  `isOn` tinyint(1) unsigned DEFAULT '1' COMMENT '是否启用',\n" +
 | 
				
			||||||
 | 
						"  `uniqueId` varchar(32) DEFAULT NULL COMMENT '节点ID',\n" +
 | 
				
			||||||
 | 
						"  `secret` varchar(32) DEFAULT NULL COMMENT '密钥',\n" +
 | 
				
			||||||
 | 
						"  `name` varchar(255) DEFAULT NULL COMMENT '节点名',\n" +
 | 
				
			||||||
 | 
						"  `code` varchar(255) DEFAULT NULL COMMENT '代号',\n" +
 | 
				
			||||||
 | 
						"  `clusterId` int(11) unsigned DEFAULT '0' COMMENT '集群ID',\n" +
 | 
				
			||||||
 | 
						"  `regionId` int(11) unsigned DEFAULT '0' COMMENT '区域ID',\n" +
 | 
				
			||||||
 | 
						"  `groupId` int(11) unsigned DEFAULT '0' COMMENT '分组ID',\n" +
 | 
				
			||||||
 | 
						"  `createdAt` bigint(11) unsigned DEFAULT '0' COMMENT '创建时间',\n" +
 | 
				
			||||||
 | 
						"  `status` json DEFAULT NULL COMMENT '最新的状态',\n" +
 | 
				
			||||||
 | 
						"  `version` int(11) unsigned DEFAULT '0' COMMENT '当前版本号',\n" +
 | 
				
			||||||
 | 
						"  `latestVersion` int(11) unsigned DEFAULT '0' COMMENT '最后版本号',\n" +
 | 
				
			||||||
 | 
						"  `installDir` varchar(512) DEFAULT NULL COMMENT '安装目录',\n" +
 | 
				
			||||||
 | 
						"  `isInstalled` tinyint(1) unsigned DEFAULT '0' COMMENT '是否已安装',\n" +
 | 
				
			||||||
 | 
						"  `installStatus` json DEFAULT NULL COMMENT '安装状态',\n" +
 | 
				
			||||||
 | 
						"  `state` tinyint(1) unsigned DEFAULT '1' COMMENT '状态',\n" +
 | 
				
			||||||
 | 
						"  `connectedAPINodes` json DEFAULT NULL COMMENT '当前连接的API节点',\n" +
 | 
				
			||||||
 | 
						"  `maxCPU` int(4) unsigned DEFAULT '0' COMMENT '可以使用的最多CPU',\n" +
 | 
				
			||||||
 | 
						"  PRIMARY KEY (`id`),\n" +
 | 
				
			||||||
 | 
						"  KEY `uniqueId` (`uniqueId`),\n" +
 | 
				
			||||||
 | 
						"  KEY `clusterId` (`clusterId`),\n" +
 | 
				
			||||||
 | 
						"  KEY `groupId` (`groupId`),\n" +
 | 
				
			||||||
 | 
						"  KEY `regionId` (`regionId`)\n" +
 | 
				
			||||||
 | 
						") ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='节点';\n" +
 | 
				
			||||||
 | 
						"CREATE TABLE `edgeOrigins` (\n" +
 | 
				
			||||||
 | 
						"  `id` int(11) unsigned NOT NULL AUTO_INCREMENT COMMENT 'ID',\n" +
 | 
				
			||||||
 | 
						"  `adminId` int(11) unsigned DEFAULT '0' COMMENT '管理员ID',\n" +
 | 
				
			||||||
 | 
						"  `userId` int(11) unsigned DEFAULT '0' COMMENT '用户ID',\n" +
 | 
				
			||||||
 | 
						"  `isOn` tinyint(1) unsigned DEFAULT '1' COMMENT '是否启用',\n" +
 | 
				
			||||||
 | 
						"  `name` varchar(255) DEFAULT NULL COMMENT '名称',\n" +
 | 
				
			||||||
 | 
						"  `version` int(11) unsigned DEFAULT '0' COMMENT '版本',\n" +
 | 
				
			||||||
 | 
						"  `addr` json DEFAULT NULL COMMENT '地址',\n" +
 | 
				
			||||||
 | 
						"  `description` varchar(512) DEFAULT NULL COMMENT '描述',\n" +
 | 
				
			||||||
 | 
						"  `code` varchar(255) DEFAULT NULL COMMENT '代号',\n" +
 | 
				
			||||||
 | 
						"  `weight` int(11) unsigned DEFAULT '0' COMMENT '权重',\n" +
 | 
				
			||||||
 | 
						"  `connTimeout` json DEFAULT NULL COMMENT '连接超时',\n" +
 | 
				
			||||||
 | 
						"  `readTimeout` json DEFAULT NULL COMMENT '读超时',\n" +
 | 
				
			||||||
 | 
						"  `idleTimeout` json DEFAULT NULL COMMENT '空闲连接超时',\n" +
 | 
				
			||||||
 | 
						"  `maxFails` int(11) unsigned DEFAULT '0' COMMENT '最多失败次数',\n" +
 | 
				
			||||||
 | 
						"  `maxConns` int(11) unsigned DEFAULT '0' COMMENT '最大并发连接数',\n" +
 | 
				
			||||||
 | 
						"  `maxIdleConns` int(11) unsigned DEFAULT '0' COMMENT '最多空闲连接数',\n" +
 | 
				
			||||||
 | 
						"  `httpRequestURI` varchar(1024) DEFAULT NULL COMMENT '转发后的请求URI',\n" +
 | 
				
			||||||
 | 
						"  `httpRequestHeader` json DEFAULT NULL COMMENT '请求Header配置',\n" +
 | 
				
			||||||
 | 
						"  `httpResponseHeader` json DEFAULT NULL COMMENT '响应Header配置',\n" +
 | 
				
			||||||
 | 
						"  `host` varchar(255) DEFAULT NULL COMMENT '自定义主机名',\n" +
 | 
				
			||||||
 | 
						"  `healthCheck` json DEFAULT NULL COMMENT '健康检查设置',\n" +
 | 
				
			||||||
 | 
						"  `cert` json DEFAULT NULL COMMENT '证书设置',\n" +
 | 
				
			||||||
 | 
						"  `ftp` json DEFAULT NULL COMMENT 'FTP相关设置',\n" +
 | 
				
			||||||
 | 
						"  `createdAt` bigint(11) unsigned DEFAULT '0' COMMENT '创建时间',\n" +
 | 
				
			||||||
 | 
						"  `state` tinyint(1) unsigned DEFAULT '1' COMMENT '状态',\n" +
 | 
				
			||||||
 | 
						"  PRIMARY KEY (`id`)\n" +
 | 
				
			||||||
 | 
						") ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='源站';\n" +
 | 
				
			||||||
 | 
						"CREATE TABLE `edgeProviders` (\n" +
 | 
				
			||||||
 | 
						"  `id` int(11) unsigned NOT NULL AUTO_INCREMENT COMMENT 'ID',\n" +
 | 
				
			||||||
 | 
						"  `username` varchar(64) DEFAULT NULL COMMENT '用户名',\n" +
 | 
				
			||||||
 | 
						"  `password` varchar(32) DEFAULT NULL COMMENT '密码',\n" +
 | 
				
			||||||
 | 
						"  `fullname` varchar(64) DEFAULT NULL COMMENT '真实姓名',\n" +
 | 
				
			||||||
 | 
						"  `createdAt` bigint(11) unsigned DEFAULT '0' COMMENT '创建时间',\n" +
 | 
				
			||||||
 | 
						"  `updatedAt` bigint(11) unsigned DEFAULT '0' COMMENT '修改时间',\n" +
 | 
				
			||||||
 | 
						"  `state` tinyint(1) unsigned DEFAULT '1' COMMENT '状态',\n" +
 | 
				
			||||||
 | 
						"  PRIMARY KEY (`id`)\n" +
 | 
				
			||||||
 | 
						") ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='供应商';\n" +
 | 
				
			||||||
 | 
						"CREATE TABLE `edgeReverseProxies` (\n" +
 | 
				
			||||||
 | 
						"  `id` int(11) unsigned NOT NULL AUTO_INCREMENT COMMENT 'ID',\n" +
 | 
				
			||||||
 | 
						"  `adminId` int(11) unsigned DEFAULT '0' COMMENT '管理员ID',\n" +
 | 
				
			||||||
 | 
						"  `userId` int(11) unsigned DEFAULT '0' COMMENT '用户ID',\n" +
 | 
				
			||||||
 | 
						"  `templateId` int(11) unsigned DEFAULT '0' COMMENT '模版ID',\n" +
 | 
				
			||||||
 | 
						"  `isOn` tinyint(1) unsigned DEFAULT '1' COMMENT '是否启用',\n" +
 | 
				
			||||||
 | 
						"  `scheduling` json DEFAULT NULL COMMENT '调度算法',\n" +
 | 
				
			||||||
 | 
						"  `primaryOrigins` json DEFAULT NULL COMMENT '主要源站',\n" +
 | 
				
			||||||
 | 
						"  `backupOrigins` json DEFAULT NULL COMMENT '备用源站',\n" +
 | 
				
			||||||
 | 
						"  `stripPrefix` varchar(255) DEFAULT NULL COMMENT '去除URL前缀',\n" +
 | 
				
			||||||
 | 
						"  `requestHost` varchar(255) DEFAULT NULL COMMENT '请求Host',\n" +
 | 
				
			||||||
 | 
						"  `requestURI` varchar(1024) DEFAULT NULL COMMENT '请求URI',\n" +
 | 
				
			||||||
 | 
						"  `autoFlush` tinyint(1) unsigned DEFAULT '0' COMMENT '是否自动刷新缓冲区',\n" +
 | 
				
			||||||
 | 
						"  `state` tinyint(1) unsigned DEFAULT '1' COMMENT '状态',\n" +
 | 
				
			||||||
 | 
						"  `createdAt` bigint(11) unsigned DEFAULT '0' COMMENT '创建时间',\n" +
 | 
				
			||||||
 | 
						"  PRIMARY KEY (`id`)\n" +
 | 
				
			||||||
 | 
						") ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='反向代理配置';\n" +
 | 
				
			||||||
 | 
						"CREATE TABLE `edgeSSLCertGroups` (\n" +
 | 
				
			||||||
 | 
						"  `id` int(11) unsigned NOT NULL AUTO_INCREMENT COMMENT 'ID',\n" +
 | 
				
			||||||
 | 
						"  `adminId` int(11) unsigned DEFAULT '0' COMMENT '管理员ID',\n" +
 | 
				
			||||||
 | 
						"  `userId` int(11) unsigned DEFAULT '0' COMMENT '用户ID',\n" +
 | 
				
			||||||
 | 
						"  `name` varchar(255) DEFAULT NULL COMMENT '分组名',\n" +
 | 
				
			||||||
 | 
						"  `order` int(11) unsigned DEFAULT '0' COMMENT '分组排序',\n" +
 | 
				
			||||||
 | 
						"  `state` tinyint(1) unsigned DEFAULT '0' COMMENT '状态',\n" +
 | 
				
			||||||
 | 
						"  `createdAt` bigint(11) unsigned DEFAULT '0' COMMENT '创建时间',\n" +
 | 
				
			||||||
 | 
						"  PRIMARY KEY (`id`)\n" +
 | 
				
			||||||
 | 
						") ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='证书分组';\n" +
 | 
				
			||||||
 | 
						"CREATE TABLE `edgeSSLCerts` (\n" +
 | 
				
			||||||
 | 
						"  `id` int(11) unsigned NOT NULL AUTO_INCREMENT COMMENT 'ID',\n" +
 | 
				
			||||||
 | 
						"  `adminId` int(11) unsigned DEFAULT '0' COMMENT '管理员ID',\n" +
 | 
				
			||||||
 | 
						"  `userId` int(11) unsigned DEFAULT '0' COMMENT '用户ID',\n" +
 | 
				
			||||||
 | 
						"  `state` tinyint(1) unsigned DEFAULT '1' COMMENT '状态',\n" +
 | 
				
			||||||
 | 
						"  `createdAt` bigint(11) unsigned DEFAULT '0' COMMENT '创建时间',\n" +
 | 
				
			||||||
 | 
						"  `updatedAt` bigint(11) unsigned DEFAULT '0' COMMENT '修改时间',\n" +
 | 
				
			||||||
 | 
						"  `isOn` tinyint(1) unsigned DEFAULT '1' COMMENT '是否启用',\n" +
 | 
				
			||||||
 | 
						"  `name` varchar(255) DEFAULT NULL COMMENT '证书名',\n" +
 | 
				
			||||||
 | 
						"  `description` varchar(1024) DEFAULT NULL COMMENT '描述',\n" +
 | 
				
			||||||
 | 
						"  `certData` blob COMMENT '证书内容',\n" +
 | 
				
			||||||
 | 
						"  `keyData` blob COMMENT '密钥内容',\n" +
 | 
				
			||||||
 | 
						"  `serverName` varchar(255) DEFAULT NULL COMMENT '证书使用的主机名',\n" +
 | 
				
			||||||
 | 
						"  `isCA` tinyint(1) unsigned DEFAULT '0' COMMENT '是否为CA证书',\n" +
 | 
				
			||||||
 | 
						"  `groupIds` json DEFAULT NULL COMMENT '证书分组',\n" +
 | 
				
			||||||
 | 
						"  `timeBeginAt` bigint(11) unsigned DEFAULT '0' COMMENT '开始时间',\n" +
 | 
				
			||||||
 | 
						"  `timeEndAt` bigint(11) unsigned DEFAULT '0' COMMENT '结束时间',\n" +
 | 
				
			||||||
 | 
						"  `dnsNames` json DEFAULT NULL COMMENT 'DNS名称列表',\n" +
 | 
				
			||||||
 | 
						"  `commonNames` json DEFAULT NULL COMMENT '发行单位列表',\n" +
 | 
				
			||||||
 | 
						"  PRIMARY KEY (`id`)\n" +
 | 
				
			||||||
 | 
						") ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='SSL证书';\n" +
 | 
				
			||||||
 | 
						"CREATE TABLE `edgeSSLPolicies` (\n" +
 | 
				
			||||||
 | 
						"  `id` int(11) unsigned NOT NULL AUTO_INCREMENT COMMENT 'ID',\n" +
 | 
				
			||||||
 | 
						"  `adminId` int(11) unsigned DEFAULT '0' COMMENT '管理员ID',\n" +
 | 
				
			||||||
 | 
						"  `userId` int(11) unsigned DEFAULT '0' COMMENT '用户ID',\n" +
 | 
				
			||||||
 | 
						"  `isOn` tinyint(1) unsigned DEFAULT '1' COMMENT '是否启用',\n" +
 | 
				
			||||||
 | 
						"  `certs` json DEFAULT NULL COMMENT '证书列表',\n" +
 | 
				
			||||||
 | 
						"  `clientCACerts` json DEFAULT NULL COMMENT '客户端证书',\n" +
 | 
				
			||||||
 | 
						"  `clientAuthType` int(11) unsigned DEFAULT '0' COMMENT '客户端认证类型',\n" +
 | 
				
			||||||
 | 
						"  `minVersion` varchar(32) DEFAULT NULL COMMENT '支持的SSL最小版本',\n" +
 | 
				
			||||||
 | 
						"  `cipherSuitesIsOn` tinyint(1) unsigned DEFAULT '0' COMMENT '是否自定义加密算法套件',\n" +
 | 
				
			||||||
 | 
						"  `cipherSuites` json DEFAULT NULL COMMENT '加密算法套件',\n" +
 | 
				
			||||||
 | 
						"  `hsts` json DEFAULT NULL COMMENT 'HSTS设置',\n" +
 | 
				
			||||||
 | 
						"  `http2Enabled` tinyint(1) unsigned DEFAULT '1' COMMENT '是否启用HTTP/2',\n" +
 | 
				
			||||||
 | 
						"  `state` tinyint(1) unsigned DEFAULT '1' COMMENT '状态',\n" +
 | 
				
			||||||
 | 
						"  `createdAt` bigint(11) unsigned DEFAULT '0' COMMENT '创建时间',\n" +
 | 
				
			||||||
 | 
						"  PRIMARY KEY (`id`)\n" +
 | 
				
			||||||
 | 
						") ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='SSL配置策略';\n" +
 | 
				
			||||||
 | 
						"CREATE TABLE `edgeServerGroups` (\n" +
 | 
				
			||||||
 | 
						"  `id` int(11) unsigned NOT NULL AUTO_INCREMENT COMMENT 'ID',\n" +
 | 
				
			||||||
 | 
						"  `adminId` int(11) unsigned DEFAULT '0' COMMENT '管理员ID',\n" +
 | 
				
			||||||
 | 
						"  `userId` int(11) unsigned DEFAULT '0' COMMENT '用户ID',\n" +
 | 
				
			||||||
 | 
						"  `name` varchar(255) DEFAULT NULL COMMENT '名称',\n" +
 | 
				
			||||||
 | 
						"  `order` int(11) unsigned DEFAULT '0' COMMENT '排序',\n" +
 | 
				
			||||||
 | 
						"  `createdAt` bigint(11) unsigned DEFAULT '0' COMMENT '创建时间',\n" +
 | 
				
			||||||
 | 
						"  `state` tinyint(1) unsigned DEFAULT '1' COMMENT '状态',\n" +
 | 
				
			||||||
 | 
						"  PRIMARY KEY (`id`)\n" +
 | 
				
			||||||
 | 
						") ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='服务分组';\n" +
 | 
				
			||||||
 | 
						"CREATE TABLE `edgeServers` (\n" +
 | 
				
			||||||
 | 
						"  `id` int(11) unsigned NOT NULL AUTO_INCREMENT COMMENT 'ID',\n" +
 | 
				
			||||||
 | 
						"  `isOn` tinyint(1) unsigned DEFAULT '1' COMMENT '是否启用',\n" +
 | 
				
			||||||
 | 
						"  `userId` int(11) unsigned DEFAULT '0' COMMENT '用户ID',\n" +
 | 
				
			||||||
 | 
						"  `adminId` int(11) unsigned DEFAULT '0' COMMENT '管理员ID',\n" +
 | 
				
			||||||
 | 
						"  `type` varchar(64) DEFAULT NULL COMMENT '服务类型',\n" +
 | 
				
			||||||
 | 
						"  `name` varchar(255) DEFAULT NULL COMMENT '名称',\n" +
 | 
				
			||||||
 | 
						"  `description` varchar(512) DEFAULT NULL COMMENT '描述',\n" +
 | 
				
			||||||
 | 
						"  `serverNames` json DEFAULT NULL COMMENT '域名列表',\n" +
 | 
				
			||||||
 | 
						"  `http` json DEFAULT NULL COMMENT 'HTTP配置',\n" +
 | 
				
			||||||
 | 
						"  `https` json DEFAULT NULL COMMENT 'HTTPS配置',\n" +
 | 
				
			||||||
 | 
						"  `tcp` json DEFAULT NULL COMMENT 'TCP配置',\n" +
 | 
				
			||||||
 | 
						"  `tls` json DEFAULT NULL COMMENT 'TLS配置',\n" +
 | 
				
			||||||
 | 
						"  `unix` json DEFAULT NULL COMMENT 'Unix配置',\n" +
 | 
				
			||||||
 | 
						"  `udp` json DEFAULT NULL COMMENT 'UDP配置',\n" +
 | 
				
			||||||
 | 
						"  `webId` int(11) unsigned DEFAULT '0' COMMENT 'WEB配置',\n" +
 | 
				
			||||||
 | 
						"  `reverseProxy` json DEFAULT NULL COMMENT '反向代理配置',\n" +
 | 
				
			||||||
 | 
						"  `groupIds` json DEFAULT NULL COMMENT '分组ID列表',\n" +
 | 
				
			||||||
 | 
						"  `config` json DEFAULT NULL COMMENT '服务配置,自动生成',\n" +
 | 
				
			||||||
 | 
						"  `configMd5` varchar(32) DEFAULT NULL COMMENT 'Md5',\n" +
 | 
				
			||||||
 | 
						"  `clusterId` int(11) unsigned DEFAULT '0' COMMENT '集群ID',\n" +
 | 
				
			||||||
 | 
						"  `includeNodes` json DEFAULT NULL COMMENT '部署条件',\n" +
 | 
				
			||||||
 | 
						"  `excludeNodes` json DEFAULT NULL COMMENT '节点排除条件',\n" +
 | 
				
			||||||
 | 
						"  `version` int(11) unsigned DEFAULT '0' COMMENT '版本号',\n" +
 | 
				
			||||||
 | 
						"  `createdAt` bigint(11) unsigned DEFAULT '0' COMMENT '创建时间',\n" +
 | 
				
			||||||
 | 
						"  `state` tinyint(1) unsigned DEFAULT '1' COMMENT '状态',\n" +
 | 
				
			||||||
 | 
						"  PRIMARY KEY (`id`),\n" +
 | 
				
			||||||
 | 
						"  KEY `userId` (`userId`),\n" +
 | 
				
			||||||
 | 
						"  KEY `adminId` (`adminId`),\n" +
 | 
				
			||||||
 | 
						"  KEY `isUpdating_state` (`state`) USING BTREE\n" +
 | 
				
			||||||
 | 
						") ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='服务';\n" +
 | 
				
			||||||
 | 
						"CREATE TABLE `edgeSysEvents` (\n" +
 | 
				
			||||||
 | 
						"  `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT 'ID',\n" +
 | 
				
			||||||
 | 
						"  `type` varchar(255) DEFAULT NULL COMMENT '类型',\n" +
 | 
				
			||||||
 | 
						"  `params` json DEFAULT NULL COMMENT '参数',\n" +
 | 
				
			||||||
 | 
						"  `createdAt` bigint(11) unsigned DEFAULT '0' COMMENT '创建时间',\n" +
 | 
				
			||||||
 | 
						"  PRIMARY KEY (`id`)\n" +
 | 
				
			||||||
 | 
						") ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='系统事件';\n" +
 | 
				
			||||||
 | 
						"CREATE TABLE `edgeSysLockers` (\n" +
 | 
				
			||||||
 | 
						"  `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT 'ID',\n" +
 | 
				
			||||||
 | 
						"  `key` varchar(255) DEFAULT NULL COMMENT '键值',\n" +
 | 
				
			||||||
 | 
						"  `version` bigint(20) unsigned DEFAULT '0' COMMENT '版本号',\n" +
 | 
				
			||||||
 | 
						"  `timeoutAt` bigint(11) unsigned DEFAULT '0' COMMENT '超时时间',\n" +
 | 
				
			||||||
 | 
						"  PRIMARY KEY (`id`),\n" +
 | 
				
			||||||
 | 
						"  UNIQUE KEY `key` (`key`)\n" +
 | 
				
			||||||
 | 
						") ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='并发锁';\n" +
 | 
				
			||||||
 | 
						"CREATE TABLE `edgeSysSettings` (\n" +
 | 
				
			||||||
 | 
						"  `id` int(11) unsigned NOT NULL AUTO_INCREMENT COMMENT 'ID',\n" +
 | 
				
			||||||
 | 
						"  `userId` int(11) unsigned DEFAULT '0' COMMENT '用户ID',\n" +
 | 
				
			||||||
 | 
						"  `code` varchar(255) DEFAULT NULL COMMENT '代号',\n" +
 | 
				
			||||||
 | 
						"  `value` json DEFAULT NULL COMMENT '配置值',\n" +
 | 
				
			||||||
 | 
						"  PRIMARY KEY (`id`),\n" +
 | 
				
			||||||
 | 
						"  UNIQUE KEY `code` (`code`)\n" +
 | 
				
			||||||
 | 
						") ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='系统配置';\n" +
 | 
				
			||||||
 | 
						"CREATE TABLE `edgeTCPFirewallPolicies` (\n" +
 | 
				
			||||||
 | 
						"  `id` int(11) unsigned NOT NULL AUTO_INCREMENT COMMENT 'ID',\n" +
 | 
				
			||||||
 | 
						"  `adminId` int(11) DEFAULT NULL COMMENT '管理员ID',\n" +
 | 
				
			||||||
 | 
						"  `userId` int(11) unsigned DEFAULT '0' COMMENT '用户ID',\n" +
 | 
				
			||||||
 | 
						"  `templateId` int(11) unsigned DEFAULT '0' COMMENT '模版ID',\n" +
 | 
				
			||||||
 | 
						"  PRIMARY KEY (`id`)\n" +
 | 
				
			||||||
 | 
						") ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='TCP防火墙';\n" +
 | 
				
			||||||
 | 
						"CREATE TABLE `edgeUsers` (\n" +
 | 
				
			||||||
 | 
						"  `id` int(11) unsigned NOT NULL AUTO_INCREMENT COMMENT 'ID',\n" +
 | 
				
			||||||
 | 
						"  `username` varchar(64) DEFAULT NULL COMMENT '用户名',\n" +
 | 
				
			||||||
 | 
						"  `password` varchar(32) DEFAULT NULL COMMENT '密码',\n" +
 | 
				
			||||||
 | 
						"  `fullname` varchar(64) DEFAULT NULL COMMENT '真实姓名',\n" +
 | 
				
			||||||
 | 
						"  `createdAt` bigint(11) unsigned DEFAULT '0' COMMENT '创建时间',\n" +
 | 
				
			||||||
 | 
						"  `updatedAt` bigint(11) unsigned DEFAULT '0' COMMENT '修改时间',\n" +
 | 
				
			||||||
 | 
						"  `state` tinyint(1) unsigned DEFAULT '1' COMMENT '状态',\n" +
 | 
				
			||||||
 | 
						"  PRIMARY KEY (`id`)\n" +
 | 
				
			||||||
 | 
						") ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='用户';\n" +
 | 
				
			||||||
 | 
						"CREATE TABLE `edgeVersions` (\n" +
 | 
				
			||||||
 | 
						"  `id` bigint(16) unsigned NOT NULL AUTO_INCREMENT COMMENT 'ID',\n" +
 | 
				
			||||||
 | 
						"  `version` varchar(64) DEFAULT NULL,\n" +
 | 
				
			||||||
 | 
						"  PRIMARY KEY (`id`)\n" +
 | 
				
			||||||
 | 
						") ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='数据库结构版本';\n" +
 | 
				
			||||||
 | 
						"\n"
 | 
				
			||||||
							
								
								
									
										6
									
								
								internal/setup/sqls/sqls.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										6
									
								
								internal/setup/sqls/sqls.go
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,6 @@
 | 
				
			|||||||
 | 
					// generated
 | 
				
			||||||
 | 
					package sqls
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					var SQLVersions = []map[string]string{
 | 
				
			||||||
 | 
						{"version": "full", "sql": SQL_full},
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
		Reference in New Issue
	
	Block a user