diff --git a/dao/db.go b/dao/db.go index 537e8a5..1ed2b4f 100644 --- a/dao/db.go +++ b/dao/db.go @@ -3,6 +3,7 @@ package dao import ( "fmt" "gorm.io/driver/mysql" + "gorm.io/driver/postgres" "gorm.io/gorm" "videoplayer/proto" ) @@ -10,9 +11,17 @@ import ( var DB *gorm.DB func Init() error { - dsn := proto.MYSQL_DSN + var db *gorm.DB + var err error + var dsn string + if proto.Config.DB == 0 { + dsn = proto.Config.MYSQL_DSN + db, err = gorm.Open(mysql.Open(dsn), &gorm.Config{}) + } else if proto.Config.DB == 1 { + dsn = proto.Config.PG_DSN + db, err = gorm.Open(postgres.Open(dsn), &gorm.Config{}) + } - db, err := gorm.Open(mysql.Open(dsn), &gorm.Config{}) if err != nil { panic("failed to connect database") return err diff --git a/go.mod b/go.mod index c36b8b9..d311974 100644 --- a/go.mod +++ b/go.mod @@ -9,7 +9,8 @@ require ( github.com/google/uuid v1.6.0 github.com/gorilla/websocket v1.5.3 gorm.io/driver/mysql v1.5.6 - gorm.io/gorm v1.25.7 + gorm.io/driver/postgres v1.5.9 + gorm.io/gorm v1.25.10 ) require ( @@ -26,20 +27,27 @@ require ( github.com/go-playground/validator/v10 v10.20.0 // indirect github.com/go-sql-driver/mysql v1.7.0 // indirect github.com/goccy/go-json v0.10.2 // indirect + github.com/jackc/pgpassfile v1.0.0 // indirect + github.com/jackc/pgservicefile v0.0.0-20221227161230-091c0ba34f0a // indirect + github.com/jackc/pgx/v5 v5.5.5 // indirect + github.com/jackc/puddle/v2 v2.2.1 // indirect github.com/jinzhu/inflection v1.0.0 // indirect github.com/jinzhu/now v1.1.5 // indirect github.com/json-iterator/go v1.1.12 // indirect github.com/klauspost/cpuid/v2 v2.2.7 // indirect + github.com/kr/text v0.2.0 // indirect github.com/leodido/go-urn v1.4.0 // indirect github.com/mattn/go-isatty v0.0.20 // indirect github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect github.com/modern-go/reflect2 v1.0.2 // indirect github.com/pelletier/go-toml/v2 v2.2.2 // indirect + github.com/rogpeppe/go-internal v1.12.0 // indirect github.com/twitchyliquid64/golang-asm v0.15.1 // indirect github.com/ugorji/go/codec v1.2.12 // indirect golang.org/x/arch v0.8.0 // indirect golang.org/x/crypto v0.23.0 // indirect golang.org/x/net v0.25.0 // indirect + golang.org/x/sync v0.1.0 // indirect golang.org/x/sys v0.20.0 // indirect golang.org/x/text v0.15.0 // indirect google.golang.org/protobuf v1.34.1 // indirect diff --git a/go.sum b/go.sum index 27961a6..ff6741f 100644 --- a/go.sum +++ b/go.sum @@ -8,6 +8,7 @@ github.com/cloudwego/base64x v0.1.4 h1:jwCgWpFanWmN8xoIUHa2rtzmkd5J2plF/dnLS6Xd/ github.com/cloudwego/base64x v0.1.4/go.mod h1:0zlkT4Wn5C6NdauXdJRhSKRlJvmclQ1hhJgA0rcu/8w= github.com/cloudwego/iasm v0.2.0 h1:1KNIy1I1H9hNNFEEH3DVnI4UujN+1zjpuk6gwHLTssg= github.com/cloudwego/iasm v0.2.0/go.mod h1:8rXZaNYT2n95jn+zTI1sDr+IgcD2GVs0nlbbQPiEFhY= +github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= @@ -44,6 +45,14 @@ github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/gorilla/websocket v1.5.3 h1:saDtZ6Pbx/0u+bgYQ3q96pZgCzfhKXGPqt7kZ72aNNg= github.com/gorilla/websocket v1.5.3/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= +github.com/jackc/pgpassfile v1.0.0 h1:/6Hmqy13Ss2zCq62VdNG8tM1wchn8zjSGOBJ6icpsIM= +github.com/jackc/pgpassfile v1.0.0/go.mod h1:CEx0iS5ambNFdcRtxPj5JhEz+xB6uRky5eyVu/W2HEg= +github.com/jackc/pgservicefile v0.0.0-20221227161230-091c0ba34f0a h1:bbPeKD0xmW/Y25WS6cokEszi5g+S0QxI/d45PkRi7Nk= +github.com/jackc/pgservicefile v0.0.0-20221227161230-091c0ba34f0a/go.mod h1:5TJZWKEWniPve33vlWYSoGYefn3gLQRzjfDlhSJ9ZKM= +github.com/jackc/pgx/v5 v5.5.5 h1:amBjrZVmksIdNjxGW/IiIMzxMKZFelXbUoPNb+8sjQw= +github.com/jackc/pgx/v5 v5.5.5/go.mod h1:ez9gk+OAat140fv9ErkZDYFWmXLfV+++K0uAOiwgm1A= +github.com/jackc/puddle/v2 v2.2.1 h1:RhxXJtFG022u4ibrCSMSiu5aOq1i77R3OHKNJj77OAk= +github.com/jackc/puddle/v2 v2.2.1/go.mod h1:vriiEXHvEE654aYKXXjOvZM39qJ0q+azkZFrfEOc3H4= 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= @@ -54,6 +63,10 @@ github.com/klauspost/cpuid/v2 v2.0.9/go.mod h1:FInQzS24/EEf25PyTYn52gqo7WaD8xa02 github.com/klauspost/cpuid/v2 v2.2.7 h1:ZWSB3igEs+d0qvnxR/ZBzXVmxkgt8DdzP6m9pfuVLDM= github.com/klauspost/cpuid/v2 v2.2.7/go.mod h1:Lcz8mBdAVJIBVzewtcLocK12l3Y+JytZYpaMropDUws= github.com/knz/go-libedit v1.10.1/go.mod h1:MZTVkCWyz0oBc7JOWP3wNAzd002ZbM/5hgShxwh4x8M= +github.com/kr/pretty v0.3.0 h1:WgNl7dwNpEZ6jJ9k1snq4pZsg7DOEN8hP9Xw0Tsjwk0= +github.com/kr/pretty v0.3.0/go.mod h1:640gp4NfQd8pI5XOwp5fnNeVWj67G7CFk/SaSQn7NBk= +github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= +github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= github.com/leodido/go-urn v1.4.0 h1:WT9HwE9SGECu3lg4d/dIA+jxlljEa1/ffXKmRjqdmIQ= github.com/leodido/go-urn v1.4.0/go.mod h1:bvxc+MVxLKB4z00jd1z+Dvzr47oO32F/QSNjSBOlFxI= github.com/mattn/go-isatty v0.0.20 h1:xfD0iDuEKnDkl03q4limB+vH+GxLEtL/jb4xVJSWWEY= @@ -73,6 +86,8 @@ github.com/pelletier/go-toml/v2 v2.2.2 h1:aYUidT7k73Pcl9nb2gScu7NSrKCSHIDE89b3+6 github.com/pelletier/go-toml/v2 v2.2.2/go.mod h1:1t835xjRzz80PqgE6HHgN2JOsmgYu/h4qDAS4n929Rs= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= +github.com/rogpeppe/go-internal v1.12.0 h1:exVL4IDcn6na9z1rAb56Vxr+CgyK3nn3O+epU5NdKM8= +github.com/rogpeppe/go-internal v1.12.0/go.mod h1:E+RYuTGaKKdloAfM02xzb0FW3Paa99yedzYV+kq4uf4= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw= github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo= @@ -96,6 +111,8 @@ golang.org/x/crypto v0.23.0 h1:dIJU/v2J8Mdglj/8rJ6UUOM3Zc9zLZxVZwwxMooUSAI= golang.org/x/crypto v0.23.0/go.mod h1:CKFgDieR+mRhux2Lsu27y0fO304Db0wZe70UKqHu0v8= golang.org/x/net v0.25.0 h1:d/OCCoBEUq33pjydKrGQhw7IlUPI2Oylr+8qLx49kac= golang.org/x/net v0.25.0/go.mod h1:JkAGAh7GEvH74S6FOH42FLoXpXbE/aqXSrIQjXgsiwM= +golang.org/x/sync v0.1.0 h1:wsuoTGHzEhffawBOhz5CYhcrV4IdKZbEyZjBMuTp12o= +golang.org/x/sync v0.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.20.0 h1:Od9JTbYCk261bKm4M/mw7AklTlFYIa0bIp9BgSm1S8Y= @@ -106,8 +123,9 @@ golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543 h1:E7g+9GITq07hpfrRu66IV golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= google.golang.org/protobuf v1.34.1 h1:9ddQBjfCyZPOHPUiPxpYESBLc+T8P3E+Vo4IbKZgFWg= google.golang.org/protobuf v1.34.1/go.mod h1:c6P6GXX6sHbq/GpV6MGZEdwhWPcYBgnhAHhKbcUYpos= -gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405 h1:yhCVgyC4o1eVCa2tZl7eS0r+SDo693bJlVdllGtEeKM= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= +gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q= gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7 h1:uRGJdciOHaEIrze2W8Q3AKkepLTh2hOroT7a+7czfdQ= gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7/go.mod h1:dt/ZhP58zS4L8KSrWDmTeBkI65Dw0HsyUHuEVlX15mw= gopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY= @@ -117,7 +135,10 @@ 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/driver/mysql v1.5.6 h1:Ld4mkIickM+EliaQZQx3uOJDJHtrd70MxAUqWqlx3Y8= gorm.io/driver/mysql v1.5.6/go.mod h1:sEtPWMiqiN1N1cMXoXmBbd8C6/l+TESwriotuRRpkDM= -gorm.io/gorm v1.25.7 h1:VsD6acwRjz2zFxGO50gPO6AkNs7KKnvfzUjHQhZDz/A= +gorm.io/driver/postgres v1.5.9 h1:DkegyItji119OlcaLjqN11kHoUgZ/j13E0jkJZgD6A8= +gorm.io/driver/postgres v1.5.9/go.mod h1:DX3GReXH+3FPWGrrgffdvCk3DQ1dwDPdmbenSkweRGI= gorm.io/gorm v1.25.7/go.mod h1:hbnx/Oo0ChWMn1BIhpy1oYozzpM15i4YPuHDmfYtwg8= +gorm.io/gorm v1.25.10 h1:dQpO+33KalOA+aFYGlK+EfxcI5MbO7EP2yYygwh9h+s= +gorm.io/gorm v1.25.10/go.mod h1:hbnx/Oo0ChWMn1BIhpy1oYozzpM15i4YPuHDmfYtwg8= nullprogram.com/x/optparse v1.0.0/go.mod h1:KdyPE+Igbe0jQUrVfMqDMeJQIJZEuyV7pjYmp6pbG50= rsc.io/pdf v0.1.1/go.mod h1:n8OzWcQ6Sp37PL01nO98y4iUCRdTGarVfzxY20ICaU4= diff --git a/handler/user.go b/handler/user.go index b990ba2..bc53b8d 100644 --- a/handler/user.go +++ b/handler/user.go @@ -15,8 +15,6 @@ import ( "videoplayer/worker" ) -var signingKey = []byte(proto.TOKEN_SECRET) - func SetUpUserGroup(router *gin.Engine) { userGroup := router.Group("/user") userGroup.POST("/register", registerHandler) @@ -170,7 +168,7 @@ func GetQRStatus(c *gin.Context) { default: // 解析 JWT 令牌 token, err := jwt.Parse(str, func(token *jwt.Token) (interface{}, error) { - return signingKey, nil + return proto.SigningKey, nil }) if err != nil { c.JSON(200, gin.H{"error": err.Error(), "code": proto.TokenParseError, "message": "error"}) @@ -230,7 +228,7 @@ func loginHandler(c *gin.Context) { "id": user.ID, "exp": time.Now().Add(time.Hour * 10).Unix(), // 令牌过期时间, 10小时后过期 }) - tokenString, err = token.SignedString(signingKey) + tokenString, err = token.SignedString(proto.SigningKey) if err != nil { c.JSON(200, gin.H{"error": err.Error(), "code": proto.TokenGenerationError, "message": "error"}) return @@ -287,7 +285,7 @@ func registerHandler(c *gin.Context) { "id": id, "exp": time.Now().Add(time.Hour * 10).Unix(), // 令牌过期时间, 1分钟后过期 }) - tokenString, err = token.SignedString(signingKey) + tokenString, err = token.SignedString(proto.SigningKey) if err != nil { c.JSON(200, gin.H{"error": err.Error(), "code": proto.TokenGenerationError, "message": "error"}) return diff --git a/main.go b/main.go index a36e428..471a34b 100644 --- a/main.go +++ b/main.go @@ -12,10 +12,7 @@ import ( "videoplayer/worker" ) -var signingKey = []byte(proto.TOKEN_SECRET) - func main() { - r := gin.Default() gin.SetMode(gin.ReleaseMode) err := dao.Init() @@ -43,6 +40,14 @@ func init() { os.MkdirAll(proto.CID_BASE_DIR, os.ModePerm) os.MkdirAll(proto.CID_BASE_DIR+"script", os.ModePerm) os.MkdirAll(proto.CID_BASE_DIR+"workspace", os.ModePerm) + //读取配置文件 + //文件地址/home/videoplayer/vp.conf + configPath := "/home/videoplayer/vp.conf" + //读取配置文件 + err := proto.ReadConfig(configPath) + if err != nil { + panic("failed to read config file:" + err.Error()) + } } func writeLogger(c *gin.Context) { @@ -94,21 +99,22 @@ func JWTAuthMiddleware() gin.HandlerFunc { }) return } - redisToken := worker.GetRedis(tokenString) - - if redisToken == "" { - c.AbortWithStatus(200) - c.JSON(200, gin.H{ - "message": "NOT_LOGIN", - "error": "server token is empty", - "code": proto.TokenIsNull, - }) - return + if proto.Config.TOKEN_USE_REDIS { + redisToken := worker.GetRedis(tokenString) + if redisToken == "" { + c.AbortWithStatus(200) + c.JSON(200, gin.H{ + "message": "NOT_LOGIN", + "error": "server token is empty", + "code": proto.TokenIsNull, + }) + return + } } - // 解析 JWT 令牌 + // 使用加密secret 解析 JWT 令牌 token, err := jwt.Parse(tokenString, func(token *jwt.Token) (interface{}, error) { - return signingKey, nil + return proto.SigningKey, nil }) // 验证令牌 diff --git a/proto/conf.go b/proto/conf.go index ec3a8ff..427fa4b 100644 --- a/proto/conf.go +++ b/proto/conf.go @@ -1,6 +1,14 @@ package proto -import "gorm.io/gorm" +import ( + "encoding/json" + "fmt" + "gorm.io/gorm" + "os" +) + +var Config ConfigStruct +var SigningKey = []byte{} const ( MYSQL_USER = "video_t2" @@ -51,3 +59,35 @@ type User struct { Email string `gorm:"column:email"` Gender string `gorm:"column:gender"` } + +type ConfigStruct struct { + DB int `json:"db"` // 0: mysql, 1: pg + MYSQL_DSN string `json:"mysql_dsn"` + PG_DSN string `json:"pg_dsn"` + REDIS_ADDR string `json:"redis_addr"` + TOKEN_USE_REDIS bool `json:"token_use_redis"` + REDIS_User_PW bool `json:"redis_user_pw"` // 是否使用密码 + REDIS_PASSWORD string `json:"redis_password"` + REDIS_DB int `json:"redis_db"` + TOKEN_SECRET string `json:"token_secret"` + CID_BASE_DIR string `json:"cid_base_dir"` + FILE_BASE_DIR string `json:"file_base_dir"` +} + +// 读取配置文件 +func ReadConfig(path string) error { + //读json文件 + file, err := os.Open(path) + if err != nil { + fmt.Println("Error opening config file") + return err + } + defer file.Close() + decoder := json.NewDecoder(file) + err = decoder.Decode(&Config) + if err != nil { + fmt.Println("Error decoding config") + } + SigningKey = []byte(Config.TOKEN_SECRET) + return err +} diff --git a/vp.conf b/vp.conf new file mode 100644 index 0000000..a641abd --- /dev/null +++ b/vp.conf @@ -0,0 +1,13 @@ +{ + "db":0, + "mysql_dsn":"video_t2:2t2SKHmWEYj2xFKF@tcp(127.0.0.1:3306)/video_t2?charset=utf8mb4&parseTime=True&loc=Local", + "pg_dsn":"", + "redis_addr":"127.0.0.1:6379", + "redis_db":2, + "redis_user_pw":true, + "token_use_redis":true, + "redis_password":"lj502138", + "token_secret":"mfjurnc_32ndj9dfhj", + "cid_base_dir":"/home/lijun/cid/", + "file_base_dir":"/home/lijun/file/", +} \ No newline at end of file diff --git a/worker/redis.go b/worker/redis.go index 5349147..e2ff908 100644 --- a/worker/redis.go +++ b/worker/redis.go @@ -15,12 +15,21 @@ import ( var redisClient *redis.Client // Redis 客户端, 用于连接 Redis 服务器 func InitRedis() error { ctx := context.Background() - // 连接redis - redisClient = redis.NewClient(&redis.Options{ - Addr: proto.REDIS_ADDR, // Redis 服务器地址 - Password: proto.REDIS_PASSWORD, // 如果 Redis 设置了密码 - DB: proto.REIDS_DB, // 使用的数据库编号 - }) + + if proto.Config.REDIS_User_PW == false { + // 连接redis + redisClient = redis.NewClient(&redis.Options{ + Addr: proto.Config.REDIS_ADDR, // Redis 服务器地址 + DB: proto.Config.REDIS_DB, // 使用的数据库编号 + }) + } else { + // 连接redis + redisClient = redis.NewClient(&redis.Options{ + Addr: proto.Config.REDIS_ADDR, // Redis 服务器地址 + Password: proto.Config.REDIS_PASSWORD, // 如果 Redis 设置了密码 + DB: proto.Config.REDIS_DB, // 使用的数据库编号 + }) + } // 验证 Redis 客户端是否可以正常工作 _, err := redisClient.Ping(ctx).Result()