通道的增删接口实现,数据表和目录结构调整

This commit is contained in:
2025-03-26 14:57:44 +08:00
parent 727297f4ee
commit 1ac87f79c6
36 changed files with 6753 additions and 153 deletions

149
pkg/env/env.go vendored Normal file
View File

@@ -0,0 +1,149 @@
package env
import (
"log/slog"
"os"
"strconv"
"github.com/gofiber/fiber/v2/log"
"github.com/joho/godotenv"
)
// region app
var (
AppName = "platform"
AppPort = "8080"
)
func loadApp() {
_AppName := os.Getenv("APP_NAME")
if _AppName != "" {
AppName = _AppName
}
_AppPort := os.Getenv("APP_PORT")
if _AppPort != "" {
AppPort = _AppPort
}
}
// endregion
// region db
var (
DbHost = "localhost"
DbPort = "5432"
DbName string
DbUserName string
DbPassword string
)
func loadDb() {
_DbHost := os.Getenv("DB_HOST")
if _DbHost != "" {
DbHost = _DbHost
}
_DbPort := os.Getenv("DB_PORT")
if _DbPort != "" {
DbPort = _DbPort
}
_DbName := os.Getenv("DB_NAME")
if _DbName != "" {
DbName = _DbName
} else {
panic("环境变量 DB_NAME 的值为空")
}
_DbUserName := os.Getenv("DB_USERNAME")
if _DbUserName != "" {
DbUserName = _DbUserName
} else {
panic("环境变量 DB_USERNAME 的值为空")
}
_DbPassword := os.Getenv("DB_PASSWORD")
if _DbPassword != "" {
DbPassword = _DbPassword
} else {
panic("环境变量 DB_PASSWORD 的值为空")
}
}
// endregion
// region redis
var (
RedisHost = "localhost"
RedisPort = "6379"
RedisDb = 0
RedisPass = ""
)
func loadRedis() {
_RedisHost := os.Getenv("REDIS_HOST")
if _RedisHost != "" {
RedisHost = _RedisHost
}
_RedisPort := os.Getenv("REDIS_PORT")
if _RedisPort != "" {
RedisPort = _RedisPort
}
_RedisDb := os.Getenv("REDIS_DB")
if _RedisDb != "" {
atoi, err := strconv.Atoi(_RedisDb)
if err != nil {
panic("环境变量 REDIS_DB 的值不是数字")
}
RedisDb = atoi
}
_RedisPass := os.Getenv("REDIS_PASS")
if _RedisPass != "" {
RedisPass = _RedisPass
}
}
// endregion
// region log
var (
LogLevel = slog.LevelDebug
)
func loadLog() {
_LogLevel := os.Getenv("LOG_LEVEL")
switch _LogLevel {
case "debug":
LogLevel = slog.LevelDebug
case "info":
LogLevel = slog.LevelInfo
case "warn":
LogLevel = slog.LevelWarn
case "error":
LogLevel = slog.LevelError
}
}
// endregion
func Init() {
err := godotenv.Load()
if err != nil {
log.Debug("❓ 没有本地环境变量")
} else {
log.Debug("✔ 加载本地环境变量")
}
loadApp()
loadDb()
loadRedis()
loadLog()
}

26
pkg/logs/logs.go Normal file
View File

@@ -0,0 +1,26 @@
package logs
import (
"log/slog"
"os"
"platform/pkg/env"
"time"
"github.com/lmittmann/tint"
)
func Init() {
slog.SetDefault(slog.New(
tint.NewHandler(os.Stdout, &tint.Options{
Level: env.LogLevel,
TimeFormat: time.Kitchen,
ReplaceAttr: func(_ []string, attr slog.Attr) slog.Attr {
err, ok := attr.Value.Any().(error)
if ok {
return tint.Err(err)
}
return attr
},
}),
))
}

42
pkg/orm/orm.go Normal file
View File

@@ -0,0 +1,42 @@
package orm
import (
"fmt"
"log/slog"
"platform/pkg/env"
"platform/web/queries"
"gorm.io/gorm"
"gorm.io/gorm/schema"
)
import "gorm.io/driver/postgres"
func Init() {
// 连接数据库
dsn := fmt.Sprintf(
"host=%s user=%s password=%s dbname=%s port=%s sslmode=disable TimeZone=Asia/Shanghai",
env.DbHost, env.DbUserName, env.DbPassword, env.DbName, env.DbPort,
)
db, err := gorm.Open(postgres.Open(dsn), &gorm.Config{
NamingStrategy: schema.NamingStrategy{
SingularTable: true,
},
})
if err != nil {
slog.Error("gorm 初始化数据库失败:", slog.Any("err", err))
panic(err)
}
// 连接池
conn, err := db.DB()
if err != nil {
slog.Error("gorm 初始化数据库失败:", slog.Any("err", err))
panic(err)
}
conn.SetMaxIdleConns(10)
conn.SetMaxOpenConns(100)
// 初始化查询工具
queries.SetDefault(db)
}

18
pkg/rds/rds.go Normal file
View File

@@ -0,0 +1,18 @@
package rds
import (
"net"
"platform/pkg/env"
"github.com/redis/go-redis/v9"
)
var Client *redis.Client
func Init() {
Client = redis.NewClient(&redis.Options{
Addr: net.JoinHostPort(env.RedisHost, env.RedisPort),
DB: env.RedisDb,
Password: env.RedisPass,
})
}

126
pkg/remote/remote.go Normal file
View File

@@ -0,0 +1,126 @@
package remote
import (
"encoding/json"
"errors"
"io"
"net/http"
"strings"
)
type client struct {
gatewayUrl string
username string
password string
cloudUrl string
token string
}
var Client client
func Init() error {
// todo 从环境变量中获取参数
Client = client{
gatewayUrl: "http://110.40.82.248:9990",
username: "api",
password: "123456",
cloudUrl: "http://103.139.212.110",
}
return nil
}
type PortConfig struct {
Port string `json:"port"`
Edge []string `json:"edge"`
Type string `json:"type"`
Time int `json:"time"`
Status bool `json:"status"`
Rate int `json:"rate"`
Whitelist []string `json:"whitelist"`
Userpass string `json:"userpass"`
AutoEdgeConfig AutoEdgeConfig `json:"auto_edge_config"`
}
type AutoEdgeConfig struct {
Province string `json:"province"`
City string `json:"city"`
Isp string `json:"isp"`
Count int `json:"count"`
PacketLoss int `json:"packet_loss"`
}
func (c *client) PortConfigs(params ...PortConfig) error {
resp, err := c.requestCloud("/port/configs", params)
if err != nil {
return err
}
defer func(Body io.ReadCloser) {
_ = Body.Close()
}(resp.Body)
if resp.StatusCode != http.StatusOK {
return errors.New("failed to configure port")
}
body, err := io.ReadAll(resp.Body)
if err != nil {
return err
}
var result map[string]any
err = json.Unmarshal(body, &result)
if err != nil {
return err
}
if result["code"] != 0 {
return errors.New("failed to configure port")
}
return nil
}
func (c *client) requestGateway(url string, data any) (*http.Response, error) {
jsonData, err := json.Marshal(data)
if err != nil {
return nil, err
}
req, err := http.NewRequest("POST", c.gatewayUrl+url, strings.NewReader(string(jsonData)))
if err != nil {
return nil, err
}
req.Header.Set("Content-Type", "application/json")
req.SetBasicAuth(c.username, c.password)
resp, err := http.DefaultClient.Do(req)
if err != nil {
return nil, err
}
return resp, nil
}
func (c *client) requestCloud(url string, data any) (*http.Response, error) {
jsonData, err := json.Marshal(data)
if err != nil {
return nil, err
}
req, err := http.NewRequest("POST", c.cloudUrl+url, strings.NewReader(string(jsonData)))
if err != nil {
return nil, err
}
req.Header.Set("Content-Type", "application/json")
req.Header.Set("token", c.token)
resp, err := http.DefaultClient.Do(req)
if err != nil {
return nil, err
}
return resp, nil
}