Skip to content

Commit

Permalink
refactor: 规范go代码
Browse files Browse the repository at this point in the history
  • Loading branch information
twbworld committed Feb 9, 2024
1 parent ceb5f74 commit 1a6f191
Show file tree
Hide file tree
Showing 20 changed files with 492 additions and 930 deletions.
2 changes: 1 addition & 1 deletion Dockerfile
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
##编译
FROM --platform=$TARGETPLATFORM golang:1.21 AS builder
FROM --platform=$TARGETPLATFORM golang:1.22 AS builder
WORKDIR /app
ARG TARGETARCH
ENV GO111MODULE=on
Expand Down
10 changes: 0 additions & 10 deletions config/appConfig.go

This file was deleted.

10 changes: 10 additions & 0 deletions config/app_config.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
package config

type AppConfig struct {
ProjectName string `default:"VPN会员系统" json:"projectName" info:"本项目名称"`
GinAddr string `default:":80" json:"ginAddr" info:"gin监听的地址"`
EnvPath string `default:"config/.env" json:"envPath" info:"敏感配置文件的路径"`
ClashPath string `default:"config/clash.ini" json:"clashPath" info:"clash默认配置文件"`
GinLogPath string `default:"log/gin.log" json:"ginLogPath" info:"gin日志文件"`
RunLogPath string `default:"log/run.log" json:"runLogPath" info:"运行日志文件"`
}
30 changes: 13 additions & 17 deletions controller/index.go → controller/api.go
Original file line number Diff line number Diff line change
Expand Up @@ -14,42 +14,38 @@ import (
"github.com/gin-gonic/gin"
)

func Index(ctx *gin.Context) {
func Subscribe(ctx *gin.Context) {
// ctx.Header("content-type", "text/html; charset=UTF-8")

params := regexp.MustCompile(`^/(.*)\.html$`).FindStringSubmatch(ctx.Request.URL.Path)
var user model.Users
dao.GetUsersByUserName(&user, params[1])

if ctx.Request.Host[:5] == "clash" {
if res := service.ClashHandle(&user); res != "" {
ctx.String(http.StatusOK, res)
return
}
res := service.SetProtocol(ctx.Request.Host[:5]).Handle(&user)
if res == "" {
res = service.SetProtocol("").Handle(&user)
}
ctx.String(http.StatusOK, service.XrayHandle(&user))

ctx.String(http.StatusOK, res)
}

func Tg(ctx *gin.Context) {
var err error

defer func() {
if p := recover(); p != nil || err != nil {
if p != nil {
global.Log.Errorln(p)
} else {
global.Log.Errorln(err)
}
if p := recover(); p != nil {
global.Log.Errorln(p)
service.TgSend(`系统错误, 请按"/start"重新设置`)
errMsg, _ := json.Marshal(map[string]string{"error": "系统出错"})
ctx.Writer.WriteHeader(http.StatusBadRequest)
ctx.Writer.Header().Set("Content-Type", "application/json")
_, _ = ctx.Writer.Write(errMsg)
ctx.Writer.Write(errMsg)
}
service.IsTgSend = false
}()

service.IsTgSend = false
err = service.Webhook(ctx)

if err := service.Webhook(ctx); err != nil {
panic(err)
}

}
168 changes: 81 additions & 87 deletions dao/db.go
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,6 @@ package dao

import (
"encoding/json"
"errors"
"fmt"

"github.com/twbworld/proxy/global"
Expand All @@ -13,54 +12,65 @@ import (
_ "github.com/mattn/go-sqlite3"
)

var DB *sqlx.DB
var (
DB *sqlx.DB
dbRes class
tx *sqlx.Tx
)

type db struct{}
type mysql struct{}
type sqlite struct{}
type class interface {
createTable() error
connect()
createTable()
getVersion() string
}

func (d db) setDB(t string) (class, error) {
switch t {
func init() {
switch global.Config.Env.Db.Type {
case "sqlite":
s := sqlite{}
err := s.connect()
return s, err
case "mysql":
m := mysql{}
err := m.connect()
return m, err
dbRes = s
default:
return nil, errors.New("参数错误[okjdoi]: " + t)
m := mysql{}
dbRes = m
}
}

func (s sqlite) createTable() (err error) {
var u []string
err = DB.Select(&u, "SELECT name _id FROM sqlite_master WHERE type ='table'")
if err != nil {
return errors.New("错误[giosjfio]: " + err.Error())
func transaction() func() {
var err error
if tx, err = DB.Beginx(); err != nil {
panic(err)
}

tx, err := DB.Beginx()
if err != nil {
return errors.New("开启事务失败[iufghs]: " + err.Error())
}
defer func() {
return func() {
if p := recover(); p != nil {
tx.Rollback()
global.Log.Println("错误[huiosdjghioa]", p)
} else if err != nil {
panic(p)
} else if e := tx.Commit(); e != nil {
tx.Rollback()
} else {
err = tx.Commit()
if err != nil {
err = errors.New("错误[fgdjgo]: " + err.Error())
}
panic(e)
}
}()
}
}

func Start() {
if dbRes == nil {
b, _ := json.Marshal(global.Config.Env.Db)
panic("缺少数据库信息[igoujsd]: " + string(b))
}
dbRes.connect()
dbRes.createTable()
}

func (sqlite) createTable() {
var u []string
err := DB.Select(&u, "SELECT name _id FROM sqlite_master WHERE type ='table'")
if err != nil {
panic(err)
}

defer transaction()()

if utils.InSlice(&u, "users") < 0 {
global.Log.Infoln("开始创建users表[soidfjo]")
Expand All @@ -77,11 +87,11 @@ func (s sqlite) createTable() (err error) {
"expiryDate" text(10) NOT NULL DEFAULT ''
);`)
if err != nil {
return errors.New("错误[ugfdhsn]: " + err.Error())
panic(err)
}
_, err = tx.Exec(`CREATE INDEX "password" ON "users" ( "password" ASC );`)
if err != nil {
return errors.New("错误[jfgfds]: " + err.Error())
panic(err)
}

sql := "INSERT INTO `users`(`username`, `password`, `passwordShow`, `quota`) VALUES(:username, :password, :passwordShow, :quota)"
Expand All @@ -92,7 +102,7 @@ func (s sqlite) createTable() (err error) {
"quota": "-1",
})
if err != nil {
return errors.New("错误[tyudsfsadm]: " + err.Error())
panic(err)
}
}

Expand All @@ -106,49 +116,31 @@ func (s sqlite) createTable() (err error) {
"update_time" text NOT NULL DEFAULT ''
);`)
if err != nil {
return errors.New("错误[jdgfsrsag]: " + err.Error())
panic(err)
}

_, err = tx.Exec(`CREATE UNIQUE INDEX "idx_key" ON "system_info" ( "key" ASC );`)
if err != nil {
return errors.New("错误[hjdrsrtgf]: " + err.Error())
panic(err)
}
}

return
}

func (m mysql) createTable() (err error) {
func (mysql) createTable() {
var u []string
DB.Select(&u, "SHOW TABLES")
err := DB.Select(&u, "SHOW TABLES")
if err != nil {
return errors.New("错误[hsfds]: " + err.Error())
panic("错误[hsfxds]: " + err.Error())
}

tx, err := DB.Beginx()
if err != nil {
return errors.New("开启事务失败[khhdsfg]: " + err.Error())
}
defer func() {
if p := recover(); p != nil {
tx.Rollback()
global.Log.Println("错误[eoirtujge]", p)
} else if err != nil {
tx.Rollback()
} else {
err = tx.Commit()
if err != nil {
err = errors.New("错误[kjdgsz]: " + err.Error())
}
}
}()
defer transaction()()

if utils.InSlice(&u, "users") < 0 {
global.Log.Infoln("开始创建users表[gdhfd]")

_, err = tx.Exec("CREATE TABLE `users` ( `id` int unsigned NOT NULL AUTO_INCREMENT, `username` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '用户名', `password` char(56) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '密码', `passwordShow` varchar(255) NOT NULL, `quota` bigint NOT NULL DEFAULT '0' COMMENT '流量限制, 单位byte,1G=1073741824byte;-1:不限', `download` bigint unsigned NOT NULL DEFAULT '0' COMMENT '下行流量', `upload` bigint unsigned NOT NULL DEFAULT '0' COMMENT '上行流量', `useDays` int DEFAULT '0', `expiryDate` char(10) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT '' COMMENT '限期; 年-月-日', PRIMARY KEY (`id`), KEY `password` (`password`) ) ENGINE=InnoDB AUTO_INCREMENT=10 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='用户表';")
if err != nil {
return errors.New("错误[kghjffsd]: " + err.Error())
panic(err)
}

sql := "INSERT INTO `users`(`username`, `password`, `passwordShow`, `quota`) VALUES(:username, :password, :passwordShow, :quota)"
Expand All @@ -159,7 +151,7 @@ func (m mysql) createTable() (err error) {
"quota": "-1",
})
if err != nil {
return errors.New("错误[jghgsd]: " + err.Error())
panic(err)
}
}

Expand All @@ -169,60 +161,62 @@ func (m mysql) createTable() (err error) {
_, err = tx.Exec("CREATE TABLE `system_info` ( `id` int unsigned NOT NULL AUTO_INCREMENT, `key` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '', `value` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '', `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, PRIMARY KEY (`id`), UNIQUE KEY `idx_key` (`key`) USING BTREE ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='系统配置表';")

if err != nil {
return errors.New("错误[ghjdfgs]: " + err.Error())
panic(err)
}
}
return
}

func (s sqlite) connect() (err error) {
global.Log.Infoln("连接sqlite服务[poeriw]: ", global.Config.Env.Db.SqlitePath)
func (sqlite) getVersion() string {
var t string
sql := "SELECT sqlite_version()"
DB.Get(&t, sql)
return t
}

func (mysql) getVersion() string {
var t string
sql := "SELECT version()"
DB.Get(&t, sql)
return t
}

func (s sqlite) connect() {
var err error

DB, err = sqlx.Open("sqlite3", global.Config.Env.Db.SqlitePath)
if err != nil {
return errors.New("数据库连接失败[jgadsfgas]: " + err.Error())
panic("数据库连接失败[jgadsfgas]: " + err.Error())
}
err = DB.Ping() //没有数据库会创建
if err != nil {
return errors.New("数据库连接失败[khdsfgs]: " + err.Error())
panic("数据库连接失败[khdsfgs]: " + global.Config.Env.Db.SqlitePath + err.Error())
}
DB.SetMaxOpenConns(20)
DB.SetMaxIdleConns(10)

return
global.Log.Infof("%s版本: %s; 地址: %s", global.Config.Env.Db.Type, s.getVersion(), global.Config.Env.Db.SqlitePath)
}
func (m mysql) connect() (err error) {
func (m mysql) connect() {
var err error
dsn := fmt.Sprintf("%s:%s@tcp(%s:%s)/%s?charset=utf8mb4&parseTime=True&loc=Local", global.Config.Env.Db.MysqlUsername, global.Config.Env.Db.MysqlPassword, global.Config.Env.Db.MysqlHost, global.Config.Env.Db.MysqlPort, global.Config.Env.Db.MysqlDbname)

global.Log.Infoln("连接mysql服务[giodjg]: ", dsn)

//也可以使用MustConnect连接不成功就panic
DB, err = sqlx.Connect("mysql", dsn)
if err != nil {
return errors.New("数据库连接失败[ujefaf]: " + err.Error())
panic("数据库连接失败[ujefaf]: " + dsn + err.Error())
}

DB.SetMaxOpenConns(20)
DB.SetMaxIdleConns(10)

return
err = DB.Ping()
if err != nil {
panic("数据库连接失败[ujefddsaf]: " + dsn + err.Error())
}

global.Log.Infof("%s版本: %s; 地址: %s", global.Config.Env.Db.Type, m.getVersion(), dsn)
}

func Close() (err error) {
return DB.Close()
}

func Init() {
dbRes, err := new(db).setDB(global.Config.Env.Db.Type)
if err != nil {
panic(err)
}
if dbRes == nil {
b, _ := json.Marshal(global.Config.Env.Db)
panic("缺少数据库信息[igoujsd]: " + string(b))
}
err = dbRes.createTable()
if err != nil {
panic(err)
}
}
Loading

0 comments on commit 1a6f191

Please sign in to comment.