qdy 3 mesi fa
commit
2d9c2c8cd1
8 ha cambiato i file con 656 aggiunte e 0 eliminazioni
  1. 55
    0
      auth/authentication.go
  2. 82
    0
      gct.sh
  3. 54
    0
      go.mod
  4. 135
    0
      go.sum
  5. 174
    0
      main.go
  6. 41
    0
      routes/heath.go
  7. 31
    0
      routes/info.go
  8. 84
    0
      routes/init_table.go

+ 55
- 0
auth/authentication.go Vedi File

@@ -0,0 +1,55 @@
1
+package auth
2
+
3
+import (
4
+	"net/http"
5
+	"strings"
6
+
7
+	"github.com/gin-gonic/gin"
8
+
9
+	"git.x2erp.com/qdy/go-base/config"
10
+)
11
+
12
+func AuthMiddleware() gin.HandlerFunc {
13
+	return func(c *gin.Context) {
14
+		// 从 Header 中获取 token
15
+		authHeader := c.GetHeader("Authorization")
16
+		if authHeader == "" {
17
+			c.JSON(http.StatusUnauthorized, gin.H{
18
+				"success": false,
19
+				"error":   "Authorization header is required",
20
+			})
21
+			c.Abort()
22
+			return
23
+		}
24
+
25
+		// 检查 Bearer token 格式
26
+		parts := strings.Split(authHeader, " ")
27
+		if len(parts) != 2 || parts[0] != "Bearer" {
28
+			c.JSON(http.StatusUnauthorized, gin.H{
29
+				"success": false,
30
+				"error":   "Authorization header format must be Bearer {token}",
31
+			})
32
+			c.Abort()
33
+			return
34
+		}
35
+
36
+		tokenString := parts[1]
37
+		configTokenString := config.GetConfig().GetAuth().Token
38
+
39
+		// 比较 token 是否相等
40
+		if tokenString != configTokenString {
41
+			c.JSON(http.StatusUnauthorized, gin.H{
42
+				"success": false,
43
+				"error":   "Invalid token",
44
+			})
45
+			c.Abort()
46
+			return
47
+		}
48
+
49
+		// Token 验证通过,可以存储一些上下文信息
50
+		c.Set("authenticated", true)
51
+		c.Set("authType", "token")
52
+
53
+		c.Next()
54
+	}
55
+}

+ 82
- 0
gct.sh Vedi File

@@ -0,0 +1,82 @@
1
+#!/bin/bash
2
+
3
+# 脚本用法:./git-commit-and-tag.sh "你的提交描述" "版本号"
4
+
5
+# 检查参数数量
6
+if [ $# -ne 2 ]; then
7
+    echo "错误: 脚本需要2个参数。"
8
+    echo "用法: $0 \"提交描述\" \"版本号\""
9
+    echo "示例: $0 \"修复了登录问题\" \"v1.2.3\""
10
+    exit 1
11
+fi
12
+
13
+# 分配参数
14
+COMMIT_MESSAGE="$1"
15
+VERSION_TAG="$2"
16
+
17
+# 检查当前目录是否为Git仓库
18
+if ! git rev-parse --git-dir > /dev/null 2>&1; then
19
+    echo "错误: 当前目录不是一个Git仓库。"
20
+    exit 1
21
+fi
22
+
23
+echo "开始处理提交和版本标签..."
24
+echo "提交描述: $COMMIT_MESSAGE"
25
+echo "版本标签: $VERSION_TAG"
26
+
27
+# 检查是否有未提交的更改
28
+if [ -n "$(git status --porcelain)" ]; then
29
+    echo "检测到未提交的更改,正在提交..."
30
+    
31
+    # 添加所有更改到暂存区
32
+    git add .
33
+    
34
+    # 进行提交
35
+    git commit -m "$COMMIT_MESSAGE"
36
+    if [ $? -ne 0 ]; then
37
+        echo "错误: 提交失败。"
38
+        exit 1
39
+    fi
40
+    echo "✅ 更改已提交"
41
+else
42
+    echo "提示: 没有未提交的更改,跳过提交步骤"
43
+    
44
+    # 检查是否有未提交的commit但未推送
45
+    LOCAL_COMMITS=$(git log @{u}..HEAD --oneline 2>/dev/null | wc -l)
46
+    if [ $LOCAL_COMMITS -eq 0 ]; then
47
+        echo "错误: 没有需要推送的提交。"
48
+        exit 1
49
+    else
50
+        echo "检测到 $LOCAL_COMMITS 个本地提交等待推送"
51
+    fi
52
+fi
53
+
54
+# 检查标签是否已存在
55
+if git rev-parse "$VERSION_TAG" >/dev/null 2>&1; then
56
+    echo "错误: 标签 '$VERSION_TAG' 已经存在。"
57
+    exit 1
58
+fi
59
+
60
+# 创建标签
61
+git tag "$VERSION_TAG"
62
+if [ $? -ne 0 ]; then
63
+    echo "错误: 创建标签失败。"
64
+    exit 1
65
+fi
66
+echo "✅ 标签 '$VERSION_TAG' 已创建"
67
+
68
+# 推送到远程仓库并推送标签
69
+echo "正在推送到远程仓库..."
70
+git push
71
+if [ $? -ne 0 ]; then
72
+    echo "错误: 推送提交失败。"
73
+    exit 1
74
+fi
75
+
76
+git push origin "$VERSION_TAG"
77
+if [ $? -ne 0 ]; then
78
+    echo "错误: 推送标签失败。"
79
+    exit 1
80
+fi
81
+
82
+echo "✅ 完成!提交已推送,版本标签 $VERSION_TAG 已创建并推送。"

+ 54
- 0
go.mod Vedi File

@@ -0,0 +1,54 @@
1
+module git.x2erp.com/qdy/go-service-vbdx
2
+
3
+go 1.25.4
4
+
5
+require (
6
+	git.x2erp.com/qdy/go-base v0.1.9
7
+	git.x2erp.com/qdy/go-db v0.1.13
8
+	github.com/gin-gonic/gin v1.11.0
9
+	github.com/gorilla/mux v1.8.1
10
+)
11
+
12
+require (
13
+	filippo.io/edwards25519 v1.1.0 // indirect
14
+	git.x2erp.com/qdy/go-service-agent v0.1.13
15
+	github.com/bytedance/sonic v1.14.0 // indirect
16
+	github.com/bytedance/sonic/loader v0.3.0 // indirect
17
+	github.com/cloudwego/base64x v0.1.6 // indirect
18
+	github.com/gabriel-vasile/mimetype v1.4.8 // indirect
19
+	github.com/gin-contrib/sse v1.1.0 // indirect
20
+	github.com/go-playground/locales v0.14.1 // indirect
21
+	github.com/go-playground/universal-translator v0.18.1 // indirect
22
+	github.com/go-playground/validator/v10 v10.27.0 // indirect
23
+	github.com/go-sql-driver/mysql v1.9.3 // indirect
24
+	github.com/goccy/go-json v0.10.2 // indirect
25
+	github.com/goccy/go-yaml v1.18.0 // indirect
26
+	github.com/golang-sql/civil v0.0.0-20220223132316-b832511892a9 // indirect
27
+	github.com/golang-sql/sqlexp v0.1.0 // indirect
28
+	github.com/google/uuid v1.6.0 // indirect
29
+	github.com/json-iterator/go v1.1.12 // indirect
30
+	github.com/klauspost/cpuid/v2 v2.3.0 // indirect
31
+	github.com/leodido/go-urn v1.4.0 // indirect
32
+	github.com/lib/pq v1.10.9 // indirect
33
+	github.com/mattn/go-isatty v0.0.20 // indirect
34
+	github.com/microsoft/go-mssqldb v1.9.4 // indirect
35
+	github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421 // indirect
36
+	github.com/modern-go/reflect2 v1.0.2 // indirect
37
+	github.com/pelletier/go-toml/v2 v2.2.4 // indirect
38
+	github.com/quic-go/qpack v0.5.1 // indirect
39
+	github.com/quic-go/quic-go v0.54.0 // indirect
40
+	github.com/sijms/go-ora/v2 v2.9.0 // indirect
41
+	github.com/twitchyliquid64/golang-asm v0.15.1 // indirect
42
+	github.com/ugorji/go/codec v1.3.0 // indirect
43
+	go.uber.org/mock v0.5.0 // indirect
44
+	golang.org/x/arch v0.20.0 // indirect
45
+	golang.org/x/crypto v0.45.0 // indirect
46
+	golang.org/x/mod v0.29.0 // indirect
47
+	golang.org/x/net v0.47.0 // indirect
48
+	golang.org/x/sync v0.18.0 // indirect
49
+	golang.org/x/sys v0.38.0 // indirect
50
+	golang.org/x/text v0.31.0 // indirect
51
+	golang.org/x/tools v0.38.0 // indirect
52
+	google.golang.org/protobuf v1.36.9 // indirect
53
+	gopkg.in/yaml.v2 v2.4.0 // indirect
54
+)

+ 135
- 0
go.sum Vedi File

@@ -0,0 +1,135 @@
1
+filippo.io/edwards25519 v1.1.0 h1:FNf4tywRC1HmFuKW5xopWpigGjJKiJSV0Cqo0cJWDaA=
2
+filippo.io/edwards25519 v1.1.0/go.mod h1:BxyFTGdWcka3PhytdK4V28tE5sGfRvvvRV7EaN4VDT4=
3
+git.x2erp.com/qdy/go-base v0.1.9 h1:SuyYSt3Gp7aXiUQRCBNwhrusJ53wlCnagiTYs5eITlY=
4
+git.x2erp.com/qdy/go-base v0.1.9/go.mod h1:Q+YLwpCoU8CVSnzATLdz2LAzVMlz/CEGzo8DePf7cug=
5
+git.x2erp.com/qdy/go-db v0.1.12 h1:z4VfTbIMNhBbpPmjRRtSjEkXet7nvVRjTd92+IFsGbw=
6
+git.x2erp.com/qdy/go-db v0.1.12/go.mod h1:tcHV7sqEFYWbL/196NZxVnbdHevefRppggMTARVXQtE=
7
+git.x2erp.com/qdy/go-db v0.1.13 h1:gx1Ld+b3QRaO7VvyBm4fipafGkl0Yl+4ERzromAtck4=
8
+git.x2erp.com/qdy/go-db v0.1.13/go.mod h1:tcHV7sqEFYWbL/196NZxVnbdHevefRppggMTARVXQtE=
9
+git.x2erp.com/qdy/go-service-agent v0.1.13 h1:h5kMd9bGu6HcTQ60j/mqdtHC1HfJ7uxwOaYas3EjQZY=
10
+git.x2erp.com/qdy/go-service-agent v0.1.13/go.mod h1:51jbunlX5YI+LyUYaScojAGhra1dhnQL85QkbgVfnts=
11
+github.com/Azure/azure-sdk-for-go/sdk/azcore v1.18.0 h1:Gt0j3wceWMwPmiazCa8MzMA0MfhmPIz0Qp0FJ6qcM0U=
12
+github.com/Azure/azure-sdk-for-go/sdk/azcore v1.18.0/go.mod h1:Ot/6aikWnKWi4l9QB7qVSwa8iMphQNqkWALMoNT3rzM=
13
+github.com/Azure/azure-sdk-for-go/sdk/azidentity v1.10.1 h1:B+blDbyVIG3WaikNxPnhPiJ1MThR03b3vKGtER95TP4=
14
+github.com/Azure/azure-sdk-for-go/sdk/azidentity v1.10.1/go.mod h1:JdM5psgjfBf5fo2uWOZhflPWyDBZ/O/CNAH9CtsuZE4=
15
+github.com/Azure/azure-sdk-for-go/sdk/internal v1.11.1 h1:FPKJS1T+clwv+OLGt13a8UjqeRuh0O4SJ3lUriThc+4=
16
+github.com/Azure/azure-sdk-for-go/sdk/internal v1.11.1/go.mod h1:j2chePtV91HrC22tGoRX3sGY42uF13WzmmV80/OdVAA=
17
+github.com/Azure/azure-sdk-for-go/sdk/security/keyvault/azkeys v1.3.1 h1:Wgf5rZba3YZqeTNJPtvqZoBu1sBN/L4sry+u2U3Y75w=
18
+github.com/Azure/azure-sdk-for-go/sdk/security/keyvault/azkeys v1.3.1/go.mod h1:xxCBG/f/4Vbmh2XQJBsOmNdxWUY5j/s27jujKPbQf14=
19
+github.com/Azure/azure-sdk-for-go/sdk/security/keyvault/internal v1.1.1 h1:bFWuoEKg+gImo7pvkiQEFAc8ocibADgXeiLAxWhWmkI=
20
+github.com/Azure/azure-sdk-for-go/sdk/security/keyvault/internal v1.1.1/go.mod h1:Vih/3yc6yac2JzU4hzpaDupBJP0Flaia9rXXrU8xyww=
21
+github.com/AzureAD/microsoft-authentication-library-for-go v1.4.2 h1:oygO0locgZJe7PpYPXT5A29ZkwJaPqcva7BVeemZOZs=
22
+github.com/AzureAD/microsoft-authentication-library-for-go v1.4.2/go.mod h1:wP83P5OoQ5p6ip3ScPr0BAq0BvuPAvacpEuSzyouqAI=
23
+github.com/bytedance/sonic v1.14.0 h1:/OfKt8HFw0kh2rj8N0F6C/qPGRESq0BbaNZgcNXXzQQ=
24
+github.com/bytedance/sonic v1.14.0/go.mod h1:WoEbx8WTcFJfzCe0hbmyTGrfjt8PzNEBdxlNUO24NhA=
25
+github.com/bytedance/sonic/loader v0.3.0 h1:dskwH8edlzNMctoruo8FPTJDF3vLtDT0sXZwvZJyqeA=
26
+github.com/bytedance/sonic/loader v0.3.0/go.mod h1:N8A3vUdtUebEY2/VQC0MyhYeKUFosQU6FxH2JmUe6VI=
27
+github.com/cloudwego/base64x v0.1.6 h1:t11wG9AECkCDk5fMSoxmufanudBtJ+/HemLstXDLI2M=
28
+github.com/cloudwego/base64x v0.1.6/go.mod h1:OFcloc187FXDaYHvrNIjxSe8ncn0OOM8gEHfghB2IPU=
29
+github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
30
+github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=
31
+github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
32
+github.com/gabriel-vasile/mimetype v1.4.8 h1:FfZ3gj38NjllZIeJAmMhr+qKL8Wu+nOoI3GqacKw1NM=
33
+github.com/gabriel-vasile/mimetype v1.4.8/go.mod h1:ByKUIKGjh1ODkGM1asKUbQZOLGrPjydw3hYPU2YU9t8=
34
+github.com/gin-contrib/sse v1.1.0 h1:n0w2GMuUpWDVp7qSpvze6fAu9iRxJY4Hmj6AmBOU05w=
35
+github.com/gin-contrib/sse v1.1.0/go.mod h1:hxRZ5gVpWMT7Z0B0gSNYqqsSCNIJMjzvm6fqCz9vjwM=
36
+github.com/gin-gonic/gin v1.11.0 h1:OW/6PLjyusp2PPXtyxKHU0RbX6I/l28FTdDlae5ueWk=
37
+github.com/gin-gonic/gin v1.11.0/go.mod h1:+iq/FyxlGzII0KHiBGjuNn4UNENUlKbGlNmc+W50Dls=
38
+github.com/go-playground/assert/v2 v2.2.0 h1:JvknZsQTYeFEAhQwI4qEt9cyV5ONwRHC+lYKSsYSR8s=
39
+github.com/go-playground/assert/v2 v2.2.0/go.mod h1:VDjEfimB/XKnb+ZQfWdccd7VUvScMdVu0Titje2rxJ4=
40
+github.com/go-playground/locales v0.14.1 h1:EWaQ/wswjilfKLTECiXz7Rh+3BjFhfDFKv/oXslEjJA=
41
+github.com/go-playground/locales v0.14.1/go.mod h1:hxrqLVvrK65+Rwrd5Fc6F2O76J/NuW9t0sjnWqG1slY=
42
+github.com/go-playground/universal-translator v0.18.1 h1:Bcnm0ZwsGyWbCzImXv+pAJnYK9S473LQFuzCbDbfSFY=
43
+github.com/go-playground/universal-translator v0.18.1/go.mod h1:xekY+UJKNuX9WP91TpwSH2VMlDf28Uj24BCp08ZFTUY=
44
+github.com/go-playground/validator/v10 v10.27.0 h1:w8+XrWVMhGkxOaaowyKH35gFydVHOvC0/uWoy2Fzwn4=
45
+github.com/go-playground/validator/v10 v10.27.0/go.mod h1:I5QpIEbmr8On7W0TktmJAumgzX4CA1XNl4ZmDuVHKKo=
46
+github.com/go-sql-driver/mysql v1.9.3 h1:U/N249h2WzJ3Ukj8SowVFjdtZKfu9vlLZxjPXV1aweo=
47
+github.com/go-sql-driver/mysql v1.9.3/go.mod h1:qn46aNg1333BRMNU69Lq93t8du/dwxI64Gl8i5p1WMU=
48
+github.com/goccy/go-json v0.10.2 h1:CrxCmQqYDkv1z7lO7Wbh2HN93uovUHgrECaO5ZrCXAU=
49
+github.com/goccy/go-json v0.10.2/go.mod h1:6MelG93GURQebXPDq3khkgXZkazVtN9CRI+MGFi0w8I=
50
+github.com/goccy/go-yaml v1.18.0 h1:8W7wMFS12Pcas7KU+VVkaiCng+kG8QiFeFwzFb+rwuw=
51
+github.com/goccy/go-yaml v1.18.0/go.mod h1:XBurs7gK8ATbW4ZPGKgcbrY1Br56PdM69F7LkFRi1kA=
52
+github.com/golang-jwt/jwt/v5 v5.2.2 h1:Rl4B7itRWVtYIHFrSNd7vhTiz9UpLdi6gZhZ3wEeDy8=
53
+github.com/golang-jwt/jwt/v5 v5.2.2/go.mod h1:pqrtFR0X4osieyHYxtmOUWsAWrfe1Q5UVIyoH402zdk=
54
+github.com/golang-sql/civil v0.0.0-20220223132316-b832511892a9 h1:au07oEsX2xN0ktxqI+Sida1w446QrXBRJ0nee3SNZlA=
55
+github.com/golang-sql/civil v0.0.0-20220223132316-b832511892a9/go.mod h1:8vg3r2VgvsThLBIFL93Qb5yWzgyZWhEmBwUJWevAkK0=
56
+github.com/golang-sql/sqlexp v0.1.0 h1:ZCD6MBpcuOVfGVqsEmY5/4FtYiKz6tSyUv9LPEDei6A=
57
+github.com/golang-sql/sqlexp v0.1.0/go.mod h1:J4ad9Vo8ZCWQ2GMrC4UCQy1JpCbwU9m3EOqtpKwwwHI=
58
+github.com/google/go-cmp v0.7.0 h1:wk8382ETsv4JYUZwIsn6YpYiWiBsYLSJiTsyBybVuN8=
59
+github.com/google/go-cmp v0.7.0/go.mod h1:pXiqmnSA92OHEEa9HXL2W4E7lf9JzCmGVUdgjX3N/iU=
60
+github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg=
61
+github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0=
62
+github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
63
+github.com/gorilla/mux v1.8.1 h1:TuBL49tXwgrFYWhqrNgrUNEY92u81SPhu7sTdzQEiWY=
64
+github.com/gorilla/mux v1.8.1/go.mod h1:AKf9I4AEqPTmMytcMc0KkNouC66V3BtZ4qD5fmWSiMQ=
65
+github.com/json-iterator/go v1.1.12 h1:PV8peI4a0ysnczrg+LtxykD8LfKY9ML6u2jnxaEnrnM=
66
+github.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo=
67
+github.com/klauspost/cpuid/v2 v2.3.0 h1:S4CRMLnYUhGeDFDqkGriYKdfoFlDnMtqTiI/sFzhA9Y=
68
+github.com/klauspost/cpuid/v2 v2.3.0/go.mod h1:hqwkgyIinND0mEev00jJYCxPNVRVXFQeu1XKlok6oO0=
69
+github.com/kylelemons/godebug v1.1.0 h1:RPNrshWIDI6G2gRW9EHilWtl7Z6Sb1BR0xunSBf0SNc=
70
+github.com/kylelemons/godebug v1.1.0/go.mod h1:9/0rRGxNHcop5bhtWyNeEfOS8JIWk580+fNqagV/RAw=
71
+github.com/leodido/go-urn v1.4.0 h1:WT9HwE9SGECu3lg4d/dIA+jxlljEa1/ffXKmRjqdmIQ=
72
+github.com/leodido/go-urn v1.4.0/go.mod h1:bvxc+MVxLKB4z00jd1z+Dvzr47oO32F/QSNjSBOlFxI=
73
+github.com/lib/pq v1.10.9 h1:YXG7RB+JIjhP29X+OtkiDnYaXQwpS4JEWq7dtCCRUEw=
74
+github.com/lib/pq v1.10.9/go.mod h1:AlVN5x4E4T544tWzH6hKfbfQvm3HdbOxrmggDNAPY9o=
75
+github.com/mattn/go-isatty v0.0.20 h1:xfD0iDuEKnDkl03q4limB+vH+GxLEtL/jb4xVJSWWEY=
76
+github.com/mattn/go-isatty v0.0.20/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y=
77
+github.com/microsoft/go-mssqldb v1.9.4 h1:sHrj3GcdgkxytZ09aZ3+ys72pMeyEXJowT44j74pNgs=
78
+github.com/microsoft/go-mssqldb v1.9.4/go.mod h1:GBbW9ASTiDC+mpgWDGKdm3FnFLTUsLYN3iFL90lQ+PA=
79
+github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421 h1:ZqeYNhU3OHLH3mGKHDcjJRFFRrJa6eAM5H+CtDdOsPc=
80
+github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q=
81
+github.com/modern-go/reflect2 v1.0.2 h1:xBagoLtFs94CBntxluKeaWgTMpvLxC4ur3nMaC9Gz0M=
82
+github.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk=
83
+github.com/pelletier/go-toml/v2 v2.2.4 h1:mye9XuhQ6gvn5h28+VilKrrPoQVanw5PMw/TB0t5Ec4=
84
+github.com/pelletier/go-toml/v2 v2.2.4/go.mod h1:2gIqNv+qfxSVS7cM2xJQKtLSTLUE9V8t9Stt+h56mCY=
85
+github.com/pkg/browser v0.0.0-20240102092130-5ac0b6a4141c h1:+mdjkGKdHQG3305AYmdv1U2eRNDiU2ErMBj1gwrq8eQ=
86
+github.com/pkg/browser v0.0.0-20240102092130-5ac0b6a4141c/go.mod h1:7rwL4CYBLnjLxUqIJNnCWiEdr3bn6IUYi15bNlnbCCU=
87
+github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=
88
+github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
89
+github.com/quic-go/qpack v0.5.1 h1:giqksBPnT/HDtZ6VhtFKgoLOWmlyo9Ei6u9PqzIMbhI=
90
+github.com/quic-go/qpack v0.5.1/go.mod h1:+PC4XFrEskIVkcLzpEkbLqq1uCoxPhQuvK5rH1ZgaEg=
91
+github.com/quic-go/quic-go v0.54.0 h1:6s1YB9QotYI6Ospeiguknbp2Znb/jZYjZLRXn9kMQBg=
92
+github.com/quic-go/quic-go v0.54.0/go.mod h1:e68ZEaCdyviluZmy44P6Iey98v/Wfz6HCjQEm+l8zTY=
93
+github.com/sijms/go-ora/v2 v2.9.0 h1:+iQbUeTeCOFMb5BsOMgUhV8KWyrv9yjKpcK4x7+MFrg=
94
+github.com/sijms/go-ora/v2 v2.9.0/go.mod h1:QgFInVi3ZWyqAiJwzBQA+nbKYKH77tdp1PYoCqhR2dU=
95
+github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
96
+github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw=
97
+github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo=
98
+github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI=
99
+github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
100
+github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU=
101
+github.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4=
102
+github.com/stretchr/testify v1.11.1 h1:7s2iGBzp5EwR7/aIZr8ao5+dra3wiQyKjjFuvgVKu7U=
103
+github.com/stretchr/testify v1.11.1/go.mod h1:wZwfW3scLgRK+23gO65QZefKpKQRnfz6sD981Nm4B6U=
104
+github.com/twitchyliquid64/golang-asm v0.15.1 h1:SU5vSMR7hnwNxj24w34ZyCi/FmDZTkS4MhqMhdFk5YI=
105
+github.com/twitchyliquid64/golang-asm v0.15.1/go.mod h1:a1lVb/DtPvCB8fslRZhAngC2+aY1QWCk3Cedj/Gdt08=
106
+github.com/ugorji/go/codec v1.3.0 h1:Qd2W2sQawAfG8XSvzwhBeoGq71zXOC/Q1E9y/wUcsUA=
107
+github.com/ugorji/go/codec v1.3.0/go.mod h1:pRBVtBSKl77K30Bv8R2P+cLSGaTtex6fsA2Wjqmfxj4=
108
+go.uber.org/mock v0.5.0 h1:KAMbZvZPyBPWgD14IrIQ38QCyjwpvVVV6K/bHl1IwQU=
109
+go.uber.org/mock v0.5.0/go.mod h1:ge71pBPLYDk7QIi1LupWxdAykm7KIEFchiOqd6z7qMM=
110
+golang.org/x/arch v0.20.0 h1:dx1zTU0MAE98U+TQ8BLl7XsJbgze2WnNKF/8tGp/Q6c=
111
+golang.org/x/arch v0.20.0/go.mod h1:bdwinDaKcfZUGpH09BB7ZmOfhalA8lQdzl62l8gGWsk=
112
+golang.org/x/crypto v0.45.0 h1:jMBrvKuj23MTlT0bQEOBcAE0mjg8mK9RXFhRH6nyF3Q=
113
+golang.org/x/crypto v0.45.0/go.mod h1:XTGrrkGJve7CYK7J8PEww4aY7gM3qMCElcJQ8n8JdX4=
114
+golang.org/x/mod v0.29.0 h1:HV8lRxZC4l2cr3Zq1LvtOsi/ThTgWnUk/y64QSs8GwA=
115
+golang.org/x/mod v0.29.0/go.mod h1:NyhrlYXJ2H4eJiRy/WDBO6HMqZQ6q9nk4JzS3NuCK+w=
116
+golang.org/x/net v0.47.0 h1:Mx+4dIFzqraBXUugkia1OOvlD6LemFo1ALMHjrXDOhY=
117
+golang.org/x/net v0.47.0/go.mod h1:/jNxtkgq5yWUGYkaZGqo27cfGZ1c5Nen03aYrrKpVRU=
118
+golang.org/x/sync v0.18.0 h1:kr88TuHDroi+UVf+0hZnirlk8o8T+4MrK6mr60WkH/I=
119
+golang.org/x/sync v0.18.0/go.mod h1:9KTHXmSnoGruLpwFjVSX0lNNA75CykiMECbovNTZqGI=
120
+golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
121
+golang.org/x/sys v0.38.0 h1:3yZWxaJjBmCWXqhN1qh02AkOnCQ1poK6oF+a7xWL6Gc=
122
+golang.org/x/sys v0.38.0/go.mod h1:OgkHotnGiDImocRcuBABYBEXf8A9a87e/uXjp9XT3ks=
123
+golang.org/x/text v0.31.0 h1:aC8ghyu4JhP8VojJ2lEHBnochRno1sgL6nEi9WGFGMM=
124
+golang.org/x/text v0.31.0/go.mod h1:tKRAlv61yKIjGGHX/4tP1LTbc13YSec1pxVEWXzfoeM=
125
+golang.org/x/tools v0.38.0 h1:Hx2Xv8hISq8Lm16jvBZ2VQf+RLmbd7wVUsALibYI/IQ=
126
+golang.org/x/tools v0.38.0/go.mod h1:yEsQ/d/YK8cjh0L6rZlY8tgtlKiBNTL14pGDJPJpYQs=
127
+google.golang.org/protobuf v1.36.9 h1:w2gp2mA27hUeUzj9Ex9FBjsBm40zfaDtEWow293U7Iw=
128
+google.golang.org/protobuf v1.36.9/go.mod h1:fuxRtAxBytpl4zzqUh6/eyUujkJdNiuEkXntxiD/uRU=
129
+gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405 h1:yhCVgyC4o1eVCa2tZl7eS0r+SDo693bJlVdllGtEeKM=
130
+gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
131
+gopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY=
132
+gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ=
133
+gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
134
+gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=
135
+gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=

+ 174
- 0
main.go Vedi File

@@ -0,0 +1,174 @@
1
+package main
2
+
3
+import (
4
+	"database/sql"
5
+	"fmt"
6
+	"log"
7
+	"net/http"
8
+	"strings"
9
+	"time"
10
+
11
+	"git.x2erp.com/qdy/go-base/types"
12
+	"git.x2erp.com/qdy/go-db/factory"
13
+	"git.x2erp.com/qdy/go-service-vbdx/auth"
14
+	"git.x2erp.com/qdy/go-service-vbdx/routes"
15
+	"github.com/gin-gonic/gin"
16
+)
17
+
18
+// 单例实例
19
+var (
20
+	dbFactory *factory.DBFactory
21
+	db        *sql.DB
22
+)
23
+
24
+// initDB 初始化数据库连接(单例)
25
+func initDB() error {
26
+	var err error
27
+
28
+	// 创建数据库工厂(单例)
29
+	if dbFactory == nil {
30
+		dbFactory, err = factory.NewDBFactory()
31
+		if err != nil {
32
+			return fmt.Errorf("failed to create DB factory: %v", err)
33
+		}
34
+	}
35
+
36
+	// 创建数据库连接(单例)
37
+	if db == nil {
38
+		db, err = dbFactory.CreateDB()
39
+		if err != nil {
40
+			return fmt.Errorf("failed to create database connection: %v", err)
41
+		}
42
+	}
43
+
44
+	// 测试连接
45
+	config := dbFactory.GetConfig()
46
+	if err := factory.TestConnection(db, config.GetDatabase().Type); err != nil {
47
+		return fmt.Errorf("database connection test failed: %v", err)
48
+	}
49
+
50
+	return nil
51
+}
52
+
53
+func main() {
54
+	// 1. 初始化数据库(单例)
55
+	if err := initDB(); err != nil {
56
+		log.Fatalf("Database initialization failed: %v", err)
57
+	}
58
+
59
+	// 2. 显示基础信息
60
+	drivers := dbFactory.GetAvailableDrivers()
61
+	config := dbFactory.GetConfig()
62
+
63
+	log.Printf("Service Port: %d", config.GetService().Port)
64
+	log.Printf("Service IdleTimeout: %d", config.GetService().IdleTimeout)
65
+	log.Printf("Service ReadTimeout: %d", config.GetService().ReadTimeout)
66
+	log.Printf("Service WriteTimeout: %d", config.GetService().WriteTimeout)
67
+	log.Printf("Service TrustedProxies: %s", config.GetService().TrustedProxies)
68
+
69
+	log.Printf("Available database drivers: %v", drivers)
70
+	log.Printf("Using database type: %s", config.GetDatabase().Type)
71
+	log.Printf("Database host: %s:%d", config.GetDatabase().Host, config.GetDatabase().Port)
72
+	log.Printf("Database name: %s", config.GetDatabase().Database)
73
+	log.Println("Database connection test passed!")
74
+
75
+	// 3. 启动Gin HTTP服务
76
+	startHTTPServer()
77
+}
78
+
79
+// 启动HTTP服务器
80
+func startHTTPServer() {
81
+	//建立路由
82
+	router := gin.Default()
83
+	config := dbFactory.GetConfig()
84
+	serviceConfig := config.GetService()
85
+
86
+	// 核心路由
87
+	router.GET("/api/health", routes.HealthHandler(db, config.GetDatabase().Type))
88
+	router.POST("/api/init/table", auth.AuthMiddleware(), routes.ExecuteDDLHandler(db))
89
+	//router.POST("/api/query/csv", auth.AuthMiddleware(), withQueryRequest(routes.QueryHandlerCSV(db)))
90
+	router.GET("/api/info", routes.InfoHandler(dbFactory))
91
+
92
+	// 日志输出配置信息
93
+	log.Printf("Service Port: %d", serviceConfig.Port)
94
+	log.Printf("Service IdleTimeout: %d", serviceConfig.IdleTimeout)
95
+	log.Printf("Service ReadTimeout: %d", serviceConfig.ReadTimeout)
96
+	log.Printf("Service WriteTimeout: %d", serviceConfig.WriteTimeout)
97
+	log.Printf("Service TrustedProxies: %s", serviceConfig.TrustedProxies)
98
+
99
+	// 设置可信代理
100
+	setupTrustedProxies(router, serviceConfig.TrustedProxies)
101
+
102
+	// 启动服务
103
+	log.Println("POST /api/query  - Execute SQL query to JSON")
104
+	log.Println("POST /api/query/csv  - Execute SQL query to CSV")
105
+	log.Println("GET  /api/health - Health check")
106
+	log.Println("GET  /api/info   - Database info")
107
+
108
+	// 创建HTTP服务器配置
109
+	server := &http.Server{
110
+		Addr:         fmt.Sprintf(":%d", serviceConfig.Port),
111
+		Handler:      router,
112
+		IdleTimeout:  time.Duration(serviceConfig.IdleTimeout) * time.Second,
113
+		ReadTimeout:  time.Duration(serviceConfig.ReadTimeout) * time.Second,
114
+		WriteTimeout: time.Duration(serviceConfig.WriteTimeout) * time.Second,
115
+	}
116
+
117
+	log.Printf("Starting HTTP server on port %d", serviceConfig.Port)
118
+	if err := server.ListenAndServe(); err != nil && err != http.ErrServerClosed {
119
+		log.Fatalf("Failed to start server: %v", err)
120
+	}
121
+}
122
+
123
+// 参数绑定包装器
124
+func withQueryRequest(handler func(c *gin.Context, req types.QueryRequest)) gin.HandlerFunc {
125
+	return func(c *gin.Context) {
126
+		var req types.QueryRequest
127
+		if err := c.ShouldBindJSON(&req); err != nil {
128
+			c.JSON(400, &types.QueryResult{
129
+				Success: false,
130
+				Error:   "Invalid request: " + err.Error(),
131
+				Data:    nil,
132
+			})
133
+			return
134
+		}
135
+
136
+		handler(c, req)
137
+	}
138
+}
139
+
140
+// 设置可信代理
141
+func setupTrustedProxies(router *gin.Engine, trustedProxiesStr string) {
142
+	if trustedProxiesStr == "" {
143
+		setupTrustedProxiesRouter(router, nil)
144
+		return
145
+	}
146
+
147
+	// 按逗号分割字符串,并去除空格
148
+	proxies := strings.Split(trustedProxiesStr, ",")
149
+	trimmedProxies := make([]string, 0, len(proxies))
150
+
151
+	for _, proxy := range proxies {
152
+		trimmed := strings.TrimSpace(proxy)
153
+		if trimmed != "" {
154
+			trimmedProxies = append(trimmedProxies, trimmed)
155
+		}
156
+	}
157
+
158
+	if len(trimmedProxies) > 0 {
159
+		setupTrustedProxiesRouter(router, trimmedProxies)
160
+	} else {
161
+		setupTrustedProxiesRouter(router, nil)
162
+	}
163
+}
164
+
165
+func setupTrustedProxiesRouter(router *gin.Engine, trimmedProxies []string) {
166
+
167
+	err := router.SetTrustedProxies(trimmedProxies)
168
+	if err != nil {
169
+		log.Printf("Warning: Failed to set trusted proxies: %v", err)
170
+	} else {
171
+		log.Printf("Trusted proxies set: %v", trimmedProxies)
172
+	}
173
+
174
+}

+ 41
- 0
routes/heath.go Vedi File

@@ -0,0 +1,41 @@
1
+package routes
2
+
3
+import (
4
+	"database/sql"
5
+	"time"
6
+
7
+	"github.com/gin-gonic/gin"
8
+
9
+	"git.x2erp.com/qdy/go-base/types"
10
+	"git.x2erp.com/qdy/go-db/factory"
11
+)
12
+
13
+// HealthHandler 返回一个处理函数
14
+func HealthHandler(db *sql.DB, dbType string) gin.HandlerFunc {
15
+	return func(c *gin.Context) {
16
+
17
+		err := factory.TestConnection(db, dbType)
18
+		success := err == nil
19
+
20
+		status := "DOWN"
21
+		if success {
22
+			status = "UP"
23
+		}
24
+
25
+		c.JSON(200, &types.QueryResult{
26
+			Success: success,
27
+			Data: map[string]interface{}{
28
+				"status":         status,
29
+				"time":           time.Now().Format(time.RFC3339),
30
+				"database":       dbType,
31
+				"databaseStatus": status,
32
+			},
33
+			Error: func() string {
34
+				if err != nil {
35
+					return err.Error()
36
+				}
37
+				return ""
38
+			}(),
39
+		})
40
+	}
41
+}

+ 31
- 0
routes/info.go Vedi File

@@ -0,0 +1,31 @@
1
+package routes
2
+
3
+import (
4
+	"time"
5
+
6
+	"github.com/gin-gonic/gin"
7
+
8
+	"git.x2erp.com/qdy/go-base/types"
9
+	"git.x2erp.com/qdy/go-db/factory"
10
+)
11
+
12
+// InfoHandler 数据库信息
13
+func InfoHandler(dbFactory *factory.DBFactory) gin.HandlerFunc {
14
+	return func(c *gin.Context) {
15
+		config := dbFactory.GetConfig()
16
+		drivers := dbFactory.GetAvailableDrivers()
17
+
18
+		c.JSON(200, &types.QueryResult{
19
+			Success: true,
20
+			Data: map[string]interface{}{
21
+				"database_type":     config.GetDatabase().Type,
22
+				"database_host":     config.GetDatabase().Host,
23
+				"database_port":     config.GetDatabase().Port,
24
+				"database_name":     config.GetDatabase().Database,
25
+				"available_drivers": drivers,
26
+				"service_time":      time.Now().Format(time.RFC3339),
27
+			},
28
+			Error: "",
29
+		})
30
+	}
31
+}

+ 84
- 0
routes/init_table.go Vedi File

@@ -0,0 +1,84 @@
1
+package routes
2
+
3
+import (
4
+	"database/sql"
5
+	"log"
6
+
7
+	"git.x2erp.com/qdy/go-base/types"
8
+	"git.x2erp.com/qdy/go-db/factory"
9
+	"github.com/gin-gonic/gin"
10
+)
11
+
12
+// 定义表结构
13
+type tableDDL struct {
14
+	TableName string
15
+	SQL       string
16
+}
17
+
18
+// 最简单的使用方式 - 直接在代码中维护
19
+func ExecuteDDLHandler(db *sql.DB) func(c *gin.Context) {
20
+	return func(c *gin.Context) {
21
+
22
+		tables := getTableDDLs()
23
+
24
+		success := []string{}
25
+		failures := map[string]string{}
26
+
27
+		// 直接遍历 tables 切片
28
+		for _, table := range tables {
29
+			if err := factory.ExecuteDDL(db, table.SQL); err != nil {
30
+				failures[table.TableName] = err.Error()
31
+				log.Printf("[%s] 失败: %v", table.TableName, err)
32
+			} else {
33
+				success = append(success, table.TableName)
34
+				log.Printf("[%s] 成功", table.TableName)
35
+			}
36
+		}
37
+
38
+		successState := true
39
+		if len(failures) > 0 {
40
+			successState = false // 这里用 = 赋值,不是 :=
41
+		}
42
+
43
+		c.JSON(200, types.QueryResult{
44
+			Success: successState,
45
+
46
+			Data: gin.H{
47
+				"success":  success,
48
+				"failures": failures,
49
+			},
50
+		})
51
+
52
+	}
53
+}
54
+
55
+// 获取所有表定义
56
+func getTableDDLs() []tableDDL {
57
+	return []tableDDL{
58
+		{
59
+			TableName: "etl_service",
60
+			SQL: `
61
+                CREATE TABLE IF NOT EXISTS etl_service (
62
+                    etl_service_name VARCHAR(255) PRIMARY KEY,
63
+                    etl_ip VARCHAR(50) NOT NULL,
64
+                    etl_port INTEGER NOT NULL,
65
+                    create_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP
66
+                );
67
+            `,
68
+		},
69
+		{
70
+			TableName: "etl_agent",
71
+			SQL: `
72
+                CREATE TABLE IF NOT EXISTS etl_agent (
73
+                    agent_id  VARCHAR(50) PRIMARY KEY,
74
+                    agent_name VARCHAR(100) NOT NULL,
75
+                    agent_url VARCHAR(512)  NOT NULL,
76
+					agent_token VARCHAR(512)  NOT NULL,
77
+                    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
78
+                );
79
+            `,
80
+		},
81
+
82
+		// 添加新表在这里插入新的 TableDDL
83
+	}
84
+}

Loading…
Annulla
Salva