Browse Source

测试通过

qdy 3 months ago
parent
commit
a393177edf
10 changed files with 461 additions and 173 deletions
  1. BIN
      .DS_Store
  2. 0
    10
      db.yaml
  3. 82
    0
      gct.sh
  4. 32
    3
      go.mod
  5. 77
    8
      go.sum
  6. 125
    152
      main.go
  7. 66
    0
      routes/heath.go
  8. 31
    0
      routes/info.go
  9. 18
    0
      routes/query.go
  10. 30
    0
      routes/queryCSV.go

BIN
.DS_Store View File


+ 0
- 10
db.yaml View File

@@ -1,10 +0,0 @@
1
-database:
2
-  type: "oracle"  # mysql, postgres, oracle, sqlserver
3
-  host: "161.189.7.134"
4
-  port: 1521
5
-  username: "x6_stock_dev"
6
-  password: "mosdev"
7
-  database: "ORCL"
8
-  max_open_conns: 100
9
-  max_idle_conns: 10
10
-  conn_max_lifetime: 300

+ 82
- 0
gct.sh View 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 已创建并推送。"

+ 32
- 3
go.mod View File

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

+ 77
- 8
go.sum View File

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

+ 125
- 152
main.go View File

@@ -2,203 +2,176 @@ package main
2 2
 
3 3
 import (
4 4
 	"database/sql"
5
-	"encoding/json"
6 5
 	"fmt"
7 6
 	"log"
8 7
 	"net/http"
8
+	"strings"
9 9
 	"time"
10 10
 
11 11
 	"git.x2erp.com/qdy/go-base/types"
12
-	// 注意:这里要使用 factory 包的正确导入路径(和你原代码一致)
13 12
 	"git.x2erp.com/qdy/go-db/factory"
14
-	"github.com/gorilla/mux"
13
+	"git.x2erp.com/qdy/go-service-agent/routes"
14
+	"github.com/gin-gonic/gin"
15 15
 )
16 16
 
17
-// 全局变量,只初始化一次(复用原逻辑,确保工厂和DB连接单例)
18
-var dbFactory *factory.DBFactory
19
-var db *sql.DB
20
-
21
-// QueryRequest 请求结构体(接收前端SQL参数)
22
-type QueryRequest struct {
23
-	SQL string `json:"sql"`
24
-}
17
+// 单例实例
18
+var (
19
+	dbFactory *factory.DBFactory
20
+	db        *sql.DB
21
+)
25 22
 
26
-func main() {
23
+// initDB 初始化数据库连接(单例)
24
+func initDB() error {
27 25
 	var err error
28 26
 
29
-	// 1. 创建数据库工厂(只执行一次)
30
-	dbFactory, err = factory.NewDBFactory()
31
-	if err != nil {
32
-		log.Fatalf("Failed to create DB factory: %v", err)
27
+	// 创建数据库工厂(单例)
28
+	if dbFactory == nil {
29
+		dbFactory, err = factory.NewDBFactory()
30
+		if err != nil {
31
+			return fmt.Errorf("failed to create DB factory: %v", err)
32
+		}
33 33
 	}
34 34
 
35
-	// 2. 显示基础信息(保留原日志输出)
36
-	drivers := dbFactory.GetAvailableDrivers()
37
-	fmt.Printf("Available database drivers: %v\n", drivers)
35
+	// 创建数据库连接(单例)
36
+	if db == nil {
37
+		db, err = dbFactory.CreateDB()
38
+		if err != nil {
39
+			return fmt.Errorf("failed to create database connection: %v", err)
40
+		}
41
+	}
38 42
 
43
+	// 测试连接
39 44
 	config := dbFactory.GetConfig()
40
-	fmt.Printf("Using database type: %s\n", config.Database.Type)
41
-	fmt.Printf("Database host: %s:%d\n", config.Database.Host, config.Database.Port)
42
-	fmt.Printf("Database name: %s\n", config.Database.Database)
43
-
44
-	// 3. 创建数据库连接(全局复用)
45
-	db, err = dbFactory.CreateDB()
46
-	if err != nil {
47
-		log.Fatalf("Failed to create database connection: %v", err)
45
+	if err := routes.TestConnection(db, config.GetDatabase().Type); err != nil {
46
+		return fmt.Errorf("database connection test failed: %v", err)
48 47
 	}
49
-	defer db.Close()
50 48
 
51
-	// 4. 测试连接(保留原校验逻辑)
52
-	if err := testConnection(db, config.Database.Type); err != nil {
53
-		log.Fatalf("Database connection test failed: %v", err)
54
-	} else {
55
-		fmt.Println("Database connection test passed!")
49
+	return nil
50
+}
51
+
52
+func main() {
53
+	// 1. 初始化数据库(单例)
54
+	if err := initDB(); err != nil {
55
+		log.Fatalf("Database initialization failed: %v", err)
56 56
 	}
57 57
 
58
-	// 5. 启动HTTP服务
58
+	// 2. 显示基础信息
59
+	drivers := dbFactory.GetAvailableDrivers()
60
+	config := dbFactory.GetConfig()
61
+
62
+	log.Printf("Service Port: %d", config.GetService().Port)
63
+	log.Printf("Service IdleTimeout: %d", config.GetService().IdleTimeout)
64
+	log.Printf("Service ReadTimeout: %d", config.GetService().ReadTimeout)
65
+	log.Printf("Service WriteTimeout: %d", config.GetService().WriteTimeout)
66
+	log.Printf("Service TrustedProxies: %s", config.GetService().TrustedProxies)
67
+
68
+	log.Printf("Available database drivers: %v", drivers)
69
+	log.Printf("Using database type: %s", config.GetDatabase().Type)
70
+	log.Printf("Database host: %s:%d", config.GetDatabase().Host, config.GetDatabase().Port)
71
+	log.Printf("Database name: %s", config.GetDatabase().Database)
72
+	log.Println("Database connection test passed!")
73
+
74
+	// 3. 启动Gin HTTP服务
59 75
 	startHTTPServer()
60 76
 }
61 77
 
62
-// 启动HTTP服务器(简化,直接使用全局DB连接)
78
+// 启动HTTP服务器
63 79
 func startHTTPServer() {
64
-	router := mux.NewRouter()
80
+	router := gin.Default()
81
+
82
+	// 添加中间件 重复注册
83
+	//router.Use(gin.Logger())
84
+	//router.Use(gin.Recovery())
85
+
86
+	// 核心路由
87
+	router.GET("/api/health", routes.HealthHandler(db, "oracle"))
88
+	router.POST("/api/query", withQueryRequest(routes.QueryHandler(db)))
89
+	router.POST("/api/query/csv", withQueryRequest(routes.QueryHandlerCSV(db)))
90
+	router.GET("/api/info", routes.InfoHandler(dbFactory))
91
+
92
+	config := dbFactory.GetConfig()
93
+	serviceConfig := config.GetService()
65 94
 
66
-	// 核心路由:SQL查询(POST)- 直接返回 types.QueryResult
67
-	router.HandleFunc("/api/query", queryHandler).Methods("POST")
68
-	// 辅助路由:健康检查、数据库信息(保留原功能)
69
-	router.HandleFunc("/api/health", healthHandler).Methods("GET")
70
-	router.HandleFunc("/api/info", infoHandler).Methods("GET")
95
+	// 日志输出配置信息
96
+	log.Printf("Service Port: %d", serviceConfig.Port)
97
+	log.Printf("Service IdleTimeout: %d", serviceConfig.IdleTimeout)
98
+	log.Printf("Service ReadTimeout: %d", serviceConfig.ReadTimeout)
99
+	log.Printf("Service WriteTimeout: %d", serviceConfig.WriteTimeout)
100
+	log.Printf("Service TrustedProxies: %s", serviceConfig.TrustedProxies)
71 101
 
72
-	// 服务器配置(保留原超时设置)
102
+	// 设置可信代理
103
+	setupTrustedProxies(router, serviceConfig.TrustedProxies)
104
+
105
+	// 启动服务
106
+	log.Println("POST /api/query  - Execute SQL query to JSON")
107
+	log.Println("POST /api/query/csv  - Execute SQL query to CSV")
108
+	log.Println("GET  /api/health - Health check")
109
+	log.Println("GET  /api/info   - Database info")
110
+
111
+	// 创建HTTP服务器配置
73 112
 	server := &http.Server{
74
-		Addr:         ":8080",
113
+		Addr:         fmt.Sprintf(":%d", serviceConfig.Port),
75 114
 		Handler:      router,
76
-		ReadTimeout:  30 * time.Second,
77
-		WriteTimeout: 30 * time.Second,
78
-		IdleTimeout:  60 * time.Second,
115
+		IdleTimeout:  time.Duration(serviceConfig.IdleTimeout) * time.Second,
116
+		ReadTimeout:  time.Duration(serviceConfig.ReadTimeout) * time.Second,
117
+		WriteTimeout: time.Duration(serviceConfig.WriteTimeout) * time.Second,
79 118
 	}
80 119
 
81
-	// 启动日志(保留原格式)
82
-	fmt.Println("Database microservice starting on :8080")
83
-	fmt.Println("Endpoints:")
84
-	fmt.Println("  POST /api/query  - Execute SQL query (return types.QueryResult)")
85
-	fmt.Println("  GET  /api/health - Health check")
86
-	fmt.Println("  GET  /api/info   - Database info")
87
-
88
-	log.Fatal(server.ListenAndServe())
120
+	log.Printf("Starting HTTP server on port %d", serviceConfig.Port)
121
+	if err := server.ListenAndServe(); err != nil && err != http.ErrServerClosed {
122
+		log.Fatalf("Failed to start server: %v", err)
123
+	}
89 124
 }
90 125
 
91
-// queryHandler SQL查询处理(核心修改)
92
-// 1. 修复 factory.QuickQueryToJSON 调用(确保导入路径正确)
93
-// 2. 直接返回 types.QueryResult,不二次封装
94
-func queryHandler(w http.ResponseWriter, r *http.Request) {
95
-	w.Header().Set("Content-Type", "application/json")
96
-
97
-	// 1. 解析请求参数
98
-	var req QueryRequest
99
-	if err := json.NewDecoder(r.Body).Decode(&req); err != nil {
100
-		// 参数错误时,返回 types.QueryResult 格式的错误响应
101
-		json.NewEncoder(w).Encode(&types.QueryResult{
102
-			Success: false,
103
-			Error:   fmt.Sprintf("Invalid request body: %v", err),
104
-			Data:    nil,
105
-		})
106
-		return
126
+// 参数绑定包装器
127
+func withQueryRequest(handler func(c *gin.Context, req types.QueryRequest)) gin.HandlerFunc {
128
+	return func(c *gin.Context) {
129
+		var req types.QueryRequest
130
+		if err := c.ShouldBindJSON(&req); err != nil {
131
+			c.JSON(400, &types.QueryResult{
132
+				Success: false,
133
+				Error:   "Invalid request: " + err.Error(),
134
+				Data:    nil,
135
+			})
136
+			return
137
+		}
138
+
139
+		handler(c, req)
107 140
 	}
141
+}
108 142
 
109
-	// 2. 校验SQL非空
110
-	if req.SQL == "" {
111
-		json.NewEncoder(w).Encode(&types.QueryResult{
112
-			Success: false,
113
-			Error:   "SQL statement cannot be empty",
114
-			Data:    nil,
115
-		})
143
+// 设置可信代理
144
+func setupTrustedProxies(router *gin.Engine, trustedProxiesStr string) {
145
+	if trustedProxiesStr == "" {
146
+		setupTrustedProxiesRouter(router, nil)
116 147
 		return
117 148
 	}
118 149
 
119
-	// 3. 核心逻辑:调用 factory.QuickQueryToJSON(确保工厂包导出了该方法)
120
-	// 注意:如果仍提示 undefined,检查 factory 包是否真的导出了 QuickQueryToJSON(首字母大写)
121
-	result := factory.QuickQueryToJSON(db, req.SQL)
150
+	// 按逗号分割字符串,并去除空格
151
+	proxies := strings.Split(trustedProxiesStr, ",")
152
+	trimmedProxies := make([]string, 0, len(proxies))
122 153
 
123
-	// 4. 直接返回结果(types.QueryResult 原生格式)
124
-	json.NewEncoder(w).Encode(result)
125
-}
126
-
127
-// healthHandler 健康检查(修复语法错误,保持返回格式统一)
128
-func healthHandler(w http.ResponseWriter, r *http.Request) {
129
-	w.Header().Set("Content-Type", "application/json")
130
-
131
-	// 校验DB连接状态
132
-	err := db.Ping()
133
-	success := err == nil
154
+	for _, proxy := range proxies {
155
+		trimmed := strings.TrimSpace(proxy)
156
+		if trimmed != "" {
157
+			trimmedProxies = append(trimmedProxies, trimmed)
158
+		}
159
+	}
134 160
 
135
-	// 标准 if-else 赋值状态
136
-	var status string
137
-	if success {
138
-		status = "UP"
161
+	if len(trimmedProxies) > 0 {
162
+		setupTrustedProxiesRouter(router, trimmedProxies)
139 163
 	} else {
140
-		status = "DOWN"
164
+		setupTrustedProxiesRouter(router, nil)
141 165
 	}
142
-
143
-	// 返回 types.QueryResult 格式(和查询接口保持一致)
144
-	json.NewEncoder(w).Encode(&types.QueryResult{
145
-		Success: success,
146
-		Data: map[string]interface{}{
147
-			"status":   status,
148
-			"time":     time.Now().Format(time.RFC3339),
149
-			"database": dbFactory.GetConfig().Database.Type,
150
-		},
151
-		Error: func() string {
152
-			if err != nil {
153
-				return err.Error()
154
-			}
155
-			return ""
156
-		}(),
157
-	})
158 166
 }
159 167
 
160
-// infoHandler 数据库信息(返回 types.QueryResult 格式)
161
-func infoHandler(w http.ResponseWriter, r *http.Request) {
162
-	w.Header().Set("Content-Type", "application/json")
168
+func setupTrustedProxiesRouter(router *gin.Engine, trimmedProxies []string) {
163 169
 
164
-	config := dbFactory.GetConfig()
165
-	drivers := dbFactory.GetAvailableDrivers()
166
-
167
-	// 直接返回 types.QueryResult 格式
168
-	json.NewEncoder(w).Encode(&types.QueryResult{
169
-		Success: true,
170
-		Data: map[string]interface{}{
171
-			"database_type":     config.Database.Type,
172
-			"database_host":     fmt.Sprintf("%s:%d", config.Database.Host, config.Database.Port),
173
-			"database_name":     config.Database.Database,
174
-			"available_drivers": drivers,
175
-			"service_time":      time.Now().Format(time.RFC3339),
176
-		},
177
-		Error: "",
178
-	})
179
-}
180
-
181
-// testConnection 测试数据库连接(保留原逻辑)
182
-func testConnection(db *sql.DB, dbType string) error {
183
-	var query string
184
-	switch dbType {
185
-	case "mysql", "postgres", "sqlserver":
186
-		query = "SELECT 1"
187
-	case "oracle":
188
-		query = "SELECT 1 FROM DUAL"
189
-	default:
190
-		query = "SELECT 1"
191
-	}
192
-
193
-	var result int
194
-	err := db.QueryRow(query).Scan(&result)
170
+	err := router.SetTrustedProxies(trimmedProxies)
195 171
 	if err != nil {
196
-		return fmt.Errorf("test query failed: %v", err)
197
-	}
198
-
199
-	if result != 1 {
200
-		return fmt.Errorf("unexpected test result: %d", result)
172
+		log.Printf("Warning: Failed to set trusted proxies: %v", err)
173
+	} else {
174
+		log.Printf("Trusted proxies set: %v", trimmedProxies)
201 175
 	}
202 176
 
203
-	return nil
204 177
 }

+ 66
- 0
routes/heath.go View File

@@ -0,0 +1,66 @@
1
+package routes
2
+
3
+import (
4
+	"database/sql"
5
+	"fmt"
6
+	"time"
7
+
8
+	"github.com/gin-gonic/gin"
9
+
10
+	"git.x2erp.com/qdy/go-base/types"
11
+)
12
+
13
+// HealthHandler 返回一个处理函数
14
+func HealthHandler(db *sql.DB, dbType string) gin.HandlerFunc {
15
+	return func(c *gin.Context) {
16
+
17
+		err := 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
+}
42
+
43
+// testConnection 测试数据库连接
44
+func TestConnection(db *sql.DB, dbType string) error {
45
+	var query string
46
+	switch dbType {
47
+	case "mysql", "postgres", "sqlserver":
48
+		query = "SELECT 1"
49
+	case "oracle":
50
+		query = "SELECT 1 FROM DUAL"
51
+	default:
52
+		query = "SELECT 1"
53
+	}
54
+
55
+	var result int
56
+	err := db.QueryRow(query).Scan(&result)
57
+	if err != nil {
58
+		return err
59
+	}
60
+
61
+	if result != 1 {
62
+		return fmt.Errorf("unexpected test result: %d", result)
63
+	}
64
+
65
+	return nil
66
+}

+ 31
- 0
routes/info.go View 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
+}

+ 18
- 0
routes/query.go View File

@@ -0,0 +1,18 @@
1
+package routes
2
+
3
+import (
4
+	"database/sql"
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
+// 创建带 db 的 handler
13
+func QueryHandler(db *sql.DB) func(c *gin.Context, req types.QueryRequest) {
14
+	return func(c *gin.Context, req types.QueryRequest) {
15
+		result := factory.QuickQueryToJSON(db, req.SQL)
16
+		c.JSON(200, result)
17
+	}
18
+}

+ 30
- 0
routes/queryCSV.go View File

@@ -0,0 +1,30 @@
1
+package routes
2
+
3
+import (
4
+	"database/sql"
5
+
6
+	"github.com/gin-gonic/gin"
7
+
8
+	"git.x2erp.com/qdy/go-base/mycsv"
9
+	"git.x2erp.com/qdy/go-base/types"
10
+	"git.x2erp.com/qdy/go-db/factory"
11
+)
12
+
13
+// 创建带 db 的 handler
14
+func QueryHandlerCSV(db *sql.DB) func(c *gin.Context, req types.QueryRequest) {
15
+	return func(c *gin.Context, req types.QueryRequest) {
16
+		csvData, err := factory.QuickQueryToCSV(db, req.SQL)
17
+		if err != nil {
18
+			// 错误时也返回CSV格式,而不是JSON
19
+			errorCSV := mycsv.CreateStringToCSV(err.Error())
20
+			c.Header("Content-Type", "text/csv; charset=utf-8")
21
+			c.Header("X-Error", "true") // 可选:通过header标记这是错误响应
22
+			c.Data(400, "text/csv; charset=utf-8", errorCSV)
23
+			return
24
+		}
25
+
26
+		// 成功返回CSV数据
27
+		c.Header("Content-Type", "text/csv; charset=utf-8")
28
+		c.Data(200, "text/csv; charset=utf-8", csvData)
29
+	}
30
+}

Loading…
Cancel
Save