Ver código fonte

调整目录结构

kobe6258 8 meses atrás
pai
commit
f3a5a1b081

+ 5 - 5
component/cache/redis.go → common/component/cache/redis.go

@@ -2,8 +2,8 @@ package cache
 
 import (
 	"context"
-	config2 "eta_mini_ht_api/component/config"
-	logger "eta_mini_ht_api/component/log"
+	config "eta_mini_ht_api/common/component/config"
+	logger "eta_mini_ht_api/common/component/log"
 	"github.com/go-redis/redis/v8"
 	"log"
 	"strings"
@@ -18,13 +18,13 @@ var (
 
 func GetInstance() *RedisCache {
 	once.Do(func() {
-		redisConf, ok := config2.GetConfig("redis").(*config2.RedisConfig)
+		redisConf, ok := config.GetConfig("redis").(*config.RedisConfig)
 		// 检查是否成功获取到RedisConfig实例
 		if !ok {
 			logger.Info("加载redis配置失败")
 			return
 		}
-		opts, ok := redisConf.GetConfig().(config2.RedisOpts)
+		opts, ok := redisConf.GetConfig().(config.RedisOpts)
 		// 检查Host是否已设置,然后初始化或执行相应操作
 		if ok && opts.Host != "" {
 			logger.Info("初始化redis")
@@ -37,7 +37,7 @@ func GetInstance() *RedisCache {
 	})
 	return redisCache
 }
-func newRedis(opts config2.RedisOpts) *RedisCache {
+func newRedis(opts config.RedisOpts) *RedisCache {
 	if &opts == nil || opts.Host == "" {
 		log.Fatalf("redis 连接失败")
 	}

+ 6 - 0
common/component/component.go

@@ -0,0 +1,6 @@
+package component
+
+import (
+	_ "eta_mini_ht_api/common/component/cache"
+	_ "eta_mini_ht_api/common/component/log"
+)

+ 0 - 0
component/config/config.go → common/component/config/config.go


+ 0 - 0
component/config/redis_config.go → common/component/config/redis_config.go


+ 0 - 0
component/config/wechat_config.go → common/component/config/wechat_config.go


+ 11 - 1
component/database/data_base.go → common/component/database/data_base.go

@@ -1,8 +1,18 @@
 package database
 
-import "github.com/beego/beego/v2/core/logs"
+import (
+	"database/sql"
+	"github.com/beego/beego/v2/core/logs"
+)
 
 type DataBase interface {
+	Exec(query string, args ...interface{}) (sql.Result, error)
+}
+type Tx interface {
+	Commit() error
+	Rollback() error
+	Exec(query string, args ...interface{}) (sql.Result, error)
+	Query(query string, args ...interface{}) (*sql.Rows, error)
 }
 
 var dbs = make(map[string]DBInstance)

+ 80 - 0
common/component/database/mysql.go

@@ -0,0 +1,80 @@
+package database
+
+import (
+	"database/sql"
+	"gorm.io/gorm"
+)
+
+type MysqlDataBase struct {
+	db *gorm.DB
+}
+
+func NewGORMAdapter(db *gorm.DB) *MysqlDataBase {
+	return &MysqlDataBase{db: db}
+}
+
+func (a *MysqlDataBase) Begin() (Tx, error) {
+	return &GORMTxAdapter{tx: a.db.Begin()}, nil
+}
+
+func (a *MysqlDataBase) Commit() error {
+	return a.db.Commit().Error
+}
+
+func (a *MysqlDataBase) Rollback() error {
+	return a.db.Rollback().Error
+}
+
+func (a *MysqlDataBase) Exec(query string, args ...interface{}) (sql.Result, error) {
+	res := a.db.Exec(query, args...)
+	return &gormResultAdapter{res}, res.Error
+}
+
+func (a *MysqlDataBase) Query(query string, args ...interface{}) (*sql.Rows, error) {
+	rows, err := a.db.Raw(query, args...).Rows()
+	if err != nil {
+		return nil, err
+	}
+	return rows, nil
+}
+
+type GORMTxAdapter struct {
+	tx *gorm.DB
+}
+
+func (t *GORMTxAdapter) Commit() error {
+	return t.tx.Commit().Error
+}
+
+func (t *GORMTxAdapter) Rollback() error {
+	return t.tx.Rollback().Error
+}
+
+func (t *GORMTxAdapter) Exec(query string, args ...interface{}) (sql.Result, error) {
+	res := t.tx.Exec(query, args...)
+	return &gormResultAdapter{res}, res.Error
+}
+
+func (t *GORMTxAdapter) Query(query string, args ...interface{}) (*sql.Rows, error) {
+	rows, err := t.tx.Raw(query, args...).Rows()
+	if err != nil {
+		return nil, err
+	}
+	return rows, nil
+}
+
+type gormResultAdapter struct {
+	res *gorm.DB
+}
+
+func (r *gormResultAdapter) LastInsertId() (int64, error) {
+	return r.res.RowsAffected, nil
+}
+
+func (r *gormResultAdapter) RowsAffected() (int64, error) {
+	return r.res.RowsAffected, nil
+}
+
+func init() {
+	Register("mysql", MY)
+}

+ 55 - 0
common/component/database/oracle.go

@@ -0,0 +1,55 @@
+package database
+
+import "database/sql"
+
+type OracleDataBase struct {
+	dbConn *sql.DB
+}
+
+func (a *OracleDataBase) Begin() (Tx, error) {
+	tx, err := a.dbConn.Begin()
+	if err != nil {
+		return nil, err
+	}
+	return &SQLTxAdapter{tx: tx}, nil
+}
+
+func (a *OracleDataBase) Commit() error {
+	// This is not applicable for sql.DB as it doesn't have a Commit method on the DB itself.
+	// This method is here for interface consistency.
+	return nil
+}
+
+func (a *OracleDataBase) Rollback() error {
+	// This is not applicable for sql.DB as it doesn't have a Rollback method on the DB itself.
+	// This method is here for interface consistency.
+	return nil
+}
+
+func (a *OracleDataBase) Exec(query string, args ...interface{}) (sql.Result, error) {
+	return a.dbConn.Exec(query, args...)
+}
+
+func (a *OracleDataBase) Query(query string, args ...interface{}) (*sql.Rows, error) {
+	return a.dbConn.Query(query, args...)
+}
+
+type SQLTxAdapter struct {
+	tx *sql.Tx
+}
+
+func (t *SQLTxAdapter) Commit() error {
+	return t.tx.Commit()
+}
+
+func (t *SQLTxAdapter) Rollback() error {
+	return t.tx.Rollback()
+}
+
+func (t *SQLTxAdapter) Exec(query string, args ...interface{}) (sql.Result, error) {
+	return t.tx.Exec(query, args...)
+}
+
+func (t *SQLTxAdapter) Query(query string, args ...interface{}) (*sql.Rows, error) {
+	return t.tx.Query(query, args...)
+}

+ 0 - 0
component/log/log_plugin.go → common/component/log/log_plugin.go


+ 0 - 0
component/wechat/http/request.go → common/component/wechat/http/request.go


+ 0 - 0
component/wechat/http/response.go → common/component/wechat/http/response.go


+ 0 - 0
component/wechat/wechat_client.go → common/component/wechat/wechat_client.go


+ 0 - 6
component/component.go

@@ -1,6 +0,0 @@
-package component
-
-import (
-	_ "eta_mini_ht_api/component/cache"
-	_ "eta_mini_ht_api/component/log"
-)

+ 1 - 1
conf/log/log_config.json

@@ -1,5 +1,5 @@
 {
-  "filepath": "",
+  "filepath": "../etalogs",
   "appenders": [
     {
       "type": "console",

+ 5 - 0
go.mod

@@ -9,11 +9,15 @@ require (
 )
 
 require (
+	filippo.io/edwards25519 v1.1.0 // indirect
 	github.com/beorn7/perks v1.0.1 // indirect
 	github.com/cespare/xxhash/v2 v2.2.0 // indirect
 	github.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f // indirect
 	github.com/fatih/color v1.16.0 // indirect
+	github.com/go-sql-driver/mysql v1.8.1 // indirect
 	github.com/hashicorp/golang-lru v0.5.4 // indirect
+	github.com/jinzhu/inflection v1.0.0 // indirect
+	github.com/jinzhu/now v1.1.5 // indirect
 	github.com/kr/text v0.2.0 // indirect
 	github.com/mattn/go-colorable v0.1.13 // indirect
 	github.com/mattn/go-isatty v0.0.20 // indirect
@@ -29,4 +33,5 @@ require (
 	golang.org/x/text v0.15.0 // indirect
 	google.golang.org/protobuf v1.34.1 // indirect
 	gopkg.in/yaml.v3 v3.0.1 // indirect
+	gorm.io/gorm v1.25.10 // indirect
 )

+ 10 - 0
go.sum

@@ -1,3 +1,5 @@
+filippo.io/edwards25519 v1.1.0 h1:FNf4tywRC1HmFuKW5xopWpigGjJKiJSV0Cqo0cJWDaA=
+filippo.io/edwards25519 v1.1.0/go.mod h1:BxyFTGdWcka3PhytdK4V28tE5sGfRvvvRV7EaN4VDT4=
 github.com/beego/beego/v2 v2.2.2 h1:h6TNybAiMPXx9RXxK71Wz+JkPE7rpsL+ctjSZpv5yB0=
 github.com/beego/beego/v2 v2.2.2/go.mod h1:A3BC73uulBnqW3O1uBEN7q+oykprxipZTYRdZtEuKyY=
 github.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM=
@@ -17,10 +19,16 @@ github.com/fsnotify/fsnotify v1.4.9 h1:hsms1Qyu0jgnwNXIxa+/V/PDsU6CfLf6CNO8H7IWo
 github.com/fsnotify/fsnotify v1.4.9/go.mod h1:znqG4EE+3YCdAaPaxE2ZRY/06pZUdp0tY4IgpuI1SZQ=
 github.com/go-redis/redis/v8 v8.11.5 h1:AcZZR7igkdvfVmQTPnu9WE37LRrO/YrBH5zWyjDC0oI=
 github.com/go-redis/redis/v8 v8.11.5/go.mod h1:gREzHqY1hg6oD9ngVRbLStwAWKhA0FEgq8Jd4h5lpwo=
+github.com/go-sql-driver/mysql v1.8.1 h1:LedoTUt/eveggdHS9qUFC1EFSa8bU2+1pZjSRpvNJ1Y=
+github.com/go-sql-driver/mysql v1.8.1/go.mod h1:wEBSXgmK//2ZFJyE+qWnIsVGmvmEKlqwuVSjsCm7DZg=
 github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI=
 github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY=
 github.com/hashicorp/golang-lru v0.5.4 h1:YDjusn29QI/Das2iO9M0BHnIbxPeyuCHsjMW+lJfyTc=
 github.com/hashicorp/golang-lru v0.5.4/go.mod h1:iADmTwqILo4mZ8BN3D2Q6+9jd8WM5uGBxy+E8yxSoD4=
+github.com/jinzhu/inflection v1.0.0 h1:K317FqzuhWc8YvSVlFMCCUb36O/S9MCKRDI7QkRKD/E=
+github.com/jinzhu/inflection v1.0.0/go.mod h1:h+uFLlag+Qp1Va5pdKtLDYj+kHp5pxUVkryuEj+Srlc=
+github.com/jinzhu/now v1.1.5 h1:/o9tlHleP7gOFmsnYNz3RGnqzefHA47wQpKrrdTIwXQ=
+github.com/jinzhu/now v1.1.5/go.mod h1:d3SSVoowX0Lcu0IBviAWJpolVfI5UJVZZ7cO71lE/z8=
 github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE=
 github.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk=
 github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY=
@@ -77,3 +85,5 @@ gopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY=
 gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ=
 gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=
 gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
+gorm.io/gorm v1.25.10 h1:dQpO+33KalOA+aFYGlK+EfxcI5MbO7EP2yYygwh9h+s=
+gorm.io/gorm v1.25.10/go.mod h1:hbnx/Oo0ChWMn1BIhpy1oYozzpM15i4YPuHDmfYtwg8=

+ 12 - 2
main.go

@@ -1,12 +1,14 @@
 package main
 
 import (
+	_ "eta_mini_ht_api/common/component"
+	logger "eta_mini_ht_api/common/component/log"
 	"eta_mini_ht_api/common/exception/panic_recover"
-	_ "eta_mini_ht_api/component"
-	logger "eta_mini_ht_api/component/log"
 	"eta_mini_ht_api/middleware"
 	_ "eta_mini_ht_api/routers"
 	"github.com/beego/beego/v2/server/web"
+	"github.com/beego/beego/v2/server/web/filter/cors"
+	"time"
 )
 
 func main() {
@@ -16,6 +18,14 @@ func main() {
 	}
 
 	logger.Info("初始化成功")
+	web.InsertFilter("*", web.BeforeRouter, cors.Allow(&cors.Options{
+		AllowAllOrigins:  true, // 允许所有来源的请求
+		AllowMethods:     []string{"GET", "POST", "PUT", "DELETE", "OPTIONS"},
+		AllowHeaders:     []string{"Origin", "Authorization", "Access-Control-Allow-Origin", "Access-Control-Allow-Headers", "Content-Type"},
+		ExposeHeaders:    []string{"Content-Length"},
+		AllowCredentials: true,
+		MaxAge:           12 * time.Hour,
+	}))
 	//增加授权拦截
 	web.InsertFilter("*", web.BeforeRouter, middleware.AuthMiddleware())
 	//web.ErrorHandler("*", panic_recover.PanicAdvice)

+ 8 - 3
middleware/auth_middleware.go

@@ -1,7 +1,7 @@
 package middleware
 
 import (
-	"github.com/beego/beego/v2/core/logs"
+	logger "eta_mini_ht_api/common/component/log"
 	"github.com/beego/beego/v2/server/web"
 	"github.com/beego/beego/v2/server/web/context"
 	"net/http"
@@ -15,10 +15,15 @@ const (
 
 func AuthMiddleware() web.FilterFunc {
 	return func(ctx *context.Context) {
+		path := ctx.Input.URL()
+		logger.Info("请求路径" + path)
+		if path == "/swagger" || path == "/swagger/*" || path == "/favicon.ico" {
+			return
+		}
 		auth := ctx.Input.Header("author")
 		if auth == "" {
-			logs.Error("author is empty")
-			ctx.Abort(http.StatusForbidden, UNAUTHORIZED)
+			logger.Error("author is empty")
+			ctx.Abort(http.StatusUnauthorized, UNAUTHORIZED)
 		}
 	}
 }

BIN
swagger.zip


BIN
swagger/favicon-16x16.png


BIN
swagger/favicon-32x32.png


+ 60 - 0
swagger/index.html

@@ -0,0 +1,60 @@
+<!-- HTML for static distribution bundle build -->
+<!DOCTYPE html>
+<html lang="en">
+  <head>
+    <meta charset="UTF-8">
+    <title>Swagger UI</title>
+    <link rel="stylesheet" type="text/css" href="./swagger-ui.css" />
+    <link rel="icon" type="image/png" href="./favicon-32x32.png" sizes="32x32" />
+    <link rel="icon" type="image/png" href="./favicon-16x16.png" sizes="16x16" />
+    <style>
+      html
+      {
+        box-sizing: border-box;
+        overflow: -moz-scrollbars-vertical;
+        overflow-y: scroll;
+      }
+
+      *,
+      *:before,
+      *:after
+      {
+        box-sizing: inherit;
+      }
+
+      body
+      {
+        margin:0;
+        background: #fafafa;
+      }
+    </style>
+  </head>
+
+  <body>
+    <div id="swagger-ui"></div>
+
+    <script src="./swagger-ui-bundle.js" charset="UTF-8"> </script>
+    <script src="./swagger-ui-standalone-preset.js" charset="UTF-8"> </script>
+    <script>
+    window.onload = function() {
+      // Begin Swagger UI call region
+      const ui = SwaggerUIBundle({
+        url: "https://petstore.swagger.io/v2/swagger.json",
+        dom_id: '#swagger-ui',
+        deepLinking: true,
+        presets: [
+          SwaggerUIBundle.presets.apis,
+          SwaggerUIStandalonePreset
+        ],
+        plugins: [
+          SwaggerUIBundle.plugins.DownloadUrl
+        ],
+        layout: "StandaloneLayout"
+      });
+      // End Swagger UI call region
+
+      window.ui = ui;
+    };
+  </script>
+  </body>
+</html>

+ 79 - 0
swagger/oauth2-redirect.html

@@ -0,0 +1,79 @@
+<!doctype html>
+<html lang="en-US">
+<head>
+    <title>Swagger UI: OAuth2 Redirect</title>
+</head>
+<body>
+<script>
+    'use strict';
+    function run () {
+        var oauth2 = window.opener.swaggerUIRedirectOauth2;
+        var sentState = oauth2.state;
+        var redirectUrl = oauth2.redirectUrl;
+        var isValid, qp, arr;
+
+        if (/code|token|error/.test(window.location.hash)) {
+            qp = window.location.hash.substring(1);
+        } else {
+            qp = location.search.substring(1);
+        }
+
+        arr = qp.split("&");
+        arr.forEach(function (v,i,_arr) { _arr[i] = '"' + v.replace('=', '":"') + '"';});
+        qp = qp ? JSON.parse('{' + arr.join() + '}',
+                function (key, value) {
+                    return key === "" ? value : decodeURIComponent(value);
+                }
+        ) : {};
+
+        isValid = qp.state === sentState;
+
+        if ((
+          oauth2.auth.schema.get("flow") === "accessCode" ||
+          oauth2.auth.schema.get("flow") === "authorizationCode" ||
+          oauth2.auth.schema.get("flow") === "authorization_code"
+        ) && !oauth2.auth.code) {
+            if (!isValid) {
+                oauth2.errCb({
+                    authId: oauth2.auth.name,
+                    source: "auth",
+                    level: "warning",
+                    message: "Authorization may be unsafe, passed state was changed in server Passed state wasn't returned from auth server"
+                });
+            }
+
+            if (qp.code) {
+                delete oauth2.state;
+                oauth2.auth.code = qp.code;
+                oauth2.callback({auth: oauth2.auth, redirectUrl: redirectUrl});
+            } else {
+                let oauthErrorMsg;
+                if (qp.error) {
+                    oauthErrorMsg = "["+qp.error+"]: " +
+                        (qp.error_description ? qp.error_description+ ". " : "no accessCode received from the server. ") +
+                        (qp.error_uri ? "More info: "+qp.error_uri : "");
+                }
+
+                oauth2.errCb({
+                    authId: oauth2.auth.name,
+                    source: "auth",
+                    level: "error",
+                    message: oauthErrorMsg || "[Authorization failed]: no accessCode received from the server"
+                });
+            }
+        } else {
+            oauth2.callback({auth: oauth2.auth, token: qp, isValid: isValid, redirectUrl: redirectUrl});
+        }
+        window.close();
+    }
+
+    if (document.readyState !== 'loading') {
+        run();
+    } else {
+        document.addEventListener('DOMContentLoaded', function () {
+            run();
+        });
+    }
+</script>
+</body>
+</html>

Diferenças do arquivo suprimidas por serem muito extensas
+ 1 - 0
swagger/swagger-ui-bundle.js


Diferenças do arquivo suprimidas por serem muito extensas
+ 0 - 0
swagger/swagger-ui-bundle.js.map


Diferenças do arquivo suprimidas por serem muito extensas
+ 0 - 0
swagger/swagger-ui-es-bundle-core.js


Diferenças do arquivo suprimidas por serem muito extensas
+ 1 - 0
swagger/swagger-ui-es-bundle.js


Diferenças do arquivo suprimidas por serem muito extensas
+ 1 - 0
swagger/swagger-ui-standalone-preset.js


Diferenças do arquivo suprimidas por serem muito extensas
+ 0 - 0
swagger/swagger-ui-standalone-preset.js.map


Diferenças do arquivo suprimidas por serem muito extensas
+ 1 - 0
swagger/swagger-ui.css


Diferenças do arquivo suprimidas por serem muito extensas
+ 0 - 0
swagger/swagger-ui.css.map


Diferenças do arquivo suprimidas por serem muito extensas
+ 0 - 0
swagger/swagger-ui.js


Diferenças do arquivo suprimidas por serem muito extensas
+ 0 - 0
swagger/swagger-ui.js.map


+ 4 - 0
swagger/swagger.json

@@ -3,6 +3,10 @@
     "info": {
         "contact": {}
     },
+    "schemes": [
+        "http",
+        "https"
+    ],
     "basePath": "/v1",
     "paths": {
         "/user/": {

Alguns arquivos não foram mostrados porque muitos arquivos mudaram nesse diff