diff --git a/main.go b/main.go index 0eac00a..48c8cf2 100644 --- a/main.go +++ b/main.go @@ -2,21 +2,39 @@ package main import ( "fmt" + "github.com/gin-gonic/gin" + "github.com/go-pripro/shop/models" + "github.com/go-pripro/shop/pkg/logging" "github.com/go-pripro/shop/pkg/setting" "github.com/go-pripro/shop/routers" + "log" "net/http" ) -func main() { - router := routers.InitRouter() +func init() { + setting.Setup() + models.Setup() + logging.Setup() +} + +func main() { + gin.SetMode(setting.ServerSetting.RunMode) + + routersInit := routers.InitRouter() + readTimeout := setting.ServerSetting.ReadTimeout + writeTimeout := setting.ServerSetting.WriteTimeout + endPoint := fmt.Sprintf(":%d", setting.ServerSetting.HttpPort) + maxHeaderBytes := 1 << 20 s := &http.Server{ - Addr: fmt.Sprintf(":%d", setting.HTTPPort), - Handler: router, - ReadTimeout: setting.ReadTimeout, - WriteTimeout: setting.WriteTimeout, - MaxHeaderBytes: 1 << 20, + Addr: endPoint, + Handler: routersInit, + ReadTimeout: readTimeout, + WriteTimeout: writeTimeout, + MaxHeaderBytes: maxHeaderBytes, } + log.Printf("[info] start http server listening %s", endPoint) + s.ListenAndServe() -} \ No newline at end of file +} diff --git a/models/models.go b/models/models.go index cdb7c7c..dc6ff03 100644 --- a/models/models.go +++ b/models/models.go @@ -18,38 +18,22 @@ type Model struct { DeleteOn int `json:"deleted_on"` } -func init() { - var ( - err error - dbType, dbName, user, password, host, port, tablePrefix string - ) +func Setup() { + var err error - sec, err := setting.Cfg.GetSection("database") - if err != nil { - log.Fatal(2, "Fail to get section 'database': %v", err) - } - - dbType = sec.Key("Type").String() - dbName = sec.Key("Name").String() - user = sec.Key("User").String() - password = sec.Key("Password").String() - host = sec.Key("Host").String() - port = sec.Key("Port").String() - tablePrefix = sec.Key("TablePrefix").String() - - db, err = gorm.Open(dbType, fmt.Sprintf("host=%s user=%s dbname=%s port=%s sslmode=disable password=%s", - host, - user, - dbName, - port, - password)) + db, err = gorm.Open(setting.DatabaseSetting.Type, fmt.Sprintf("host=%s user=%s dbname=%s port=%s sslmode=disable password=%s", + setting.DatabaseSetting.Host, + setting.DatabaseSetting.User, + setting.DatabaseSetting.Name, + setting.DatabaseSetting.Port, + setting.DatabaseSetting.Password)) if err != nil { - log.Println(err) + log.Fatalf("models.Setup err: %v", err) } gorm.DefaultTableNameHandler = func(db *gorm.DB, defaultTableName string) string { - return tablePrefix + defaultTableName + return setting.DatabaseSetting.TablePrefix + defaultTableName } db.AutoMigrate(&Employee{}) diff --git a/pkg/file/file.go b/pkg/file/file.go new file mode 100644 index 0000000..6e44e20 --- /dev/null +++ b/pkg/file/file.go @@ -0,0 +1,92 @@ +package file + +import ( + "fmt" + "io/ioutil" + "mime/multipart" + "os" + "path" +) + +// GetSize get the file size 获取文件大小 +func GetSize(f multipart.File) (int, error) { + content, err := ioutil.ReadAll(f) + + return len(content), err +} + +// GetExt get the file ext 获取文件后缀 +func GetExt(fileName string) string { + return path.Ext(fileName) +} + +// CheckNotExist check if the file exists 检查文件是否存在 +func CheckNotExist(src string) bool { + _, err := os.Stat(src) + + return os.IsNotExist(err) +} + +// CheckPermission check if the file has permission 检查文件权限 +func CheckPermission(src string) bool { + _, err := os.Stat(src) + + return os.IsPermission(err) +} + +// IsNotExistMkDir create a directory if it does not exist 如果不存在则新建文件夹 +func IsNotExistMkDir(src string) error { + if notExist := CheckNotExist(src); notExist == true { + if err := MkDir(src); err != nil { + return err + } + } + + return nil +} + +// MkDir create a directory 新建文件夹 +func MkDir(src string) error { + err := os.MkdirAll(src, os.ModePerm) + if err != nil { + return err + } + + return nil +} + +// Open a file according to a specific mode 打开文件 +func Open(name string, flag int, perm os.FileMode) (*os.File, error) { + f, err := os.OpenFile(name, flag, perm) + if err != nil { + return nil, err + } + + return f, nil +} + +// MustOpen maximize trying to open the file +func MustOpen(fileName, filePath string) (*os.File, error) { + dir, err := os.Getwd() + if err != nil { + return nil, fmt.Errorf("os.Getwd err: %v", err) + } + + src := dir + "/" + filePath + perm := CheckPermission(src) + if perm == true { + return nil, fmt.Errorf("file.CheckPermission Permission denied src: %s", src) + } + + err = IsNotExistMkDir(src) + if err != nil { + return nil, fmt.Errorf("file.IsNotExistMkDir src: %s, err: %v", src, err) + } + + f, err := Open(src+fileName, os.O_APPEND|os.O_CREATE|os.O_RDWR, 0644) + if err != nil { + return nil, fmt.Errorf("Fail to OpenFile :%v", err) + } + + return f, nil +} \ No newline at end of file diff --git a/pkg/logging/file.go b/pkg/logging/file.go index 1c58afe..36ed276 100644 --- a/pkg/logging/file.go +++ b/pkg/logging/file.go @@ -2,43 +2,41 @@ package logging import ( "fmt" - "log" + "github.com/go-pripro/shop/pkg/file" + "github.com/go-pripro/shop/pkg/setting" "os" "time" ) -var ( - LogSavePath = "runtime/logs/" - LogSaveName = "log" - LogFileExt = "log" - TimeFormat = "20060102" -) func getLogFilePath() string { - return fmt.Sprintf("%s", LogSavePath) + return fmt.Sprintf("%s%s", setting.AppSetting.RuntimeRootPath, setting.AppSetting.LogSavePath) } -func getLogFileFullPath() string { - prefixPath := getLogFilePath() - suffixPath := fmt.Sprintf("%s%s.%s", LogSaveName, time.Now().Format(TimeFormat), LogFileExt) - return fmt.Sprintf("%s%s", prefixPath, suffixPath) + +func getLogFileName() string { + return fmt.Sprintf("%s%s.%s", + setting.AppSetting.LogSavename, + time.Now().Format(setting.AppSetting.TimeFormat), + setting.AppSetting.LogFileExt, + ) } -func openLogFile(filePath string) *os.File { - _, err := os.Stat(filePath) - switch { - case os.IsNotExist(err): - mkDir() - case os.IsPermission(err): - log.Fatalf("Permission :%v", err) - } - handle, err := os.OpenFile(filePath, os.O_APPEND | os.O_CREATE | os.O_WRONLY, 0644) + +func openLogFile(fileName, filePath string) (*os.File, error) { + dir, err := os.Getwd() if err != nil { - log.Fatalf("Fail to OpenFile :%v", err) + return nil, fmt.Errorf("os.Getwd err: %v", err) } - return handle -} -func mkDir() { - dir, _ := os.Getwd() - err := os.MkdirAll(dir + "/" + getLogFilePath(), os.ModePerm) + src := dir + "/" + filePath + perm := file.CheckPermission(src) + if perm == true { + return nil, fmt.Errorf("file.CheckPermission Permission denied src: %s", src) + } + err = file.IsNotExistMkDir(src) if err != nil { - panic(err) + return nil, fmt.Errorf("file.IsNotExistMkDir src: %s, err: %v", src, err) } + f, err := file.Open(src + fileName, os.O_APPEND|os.O_CREATE|os.O_WRONLY, 0644) + if err != nil { + return nil, fmt.Errorf("Fail to OpenFile :%v", err) + } + return f, nil } \ No newline at end of file diff --git a/pkg/logging/log.go b/pkg/logging/log.go index f31bbce..6cc23b7 100644 --- a/pkg/logging/log.go +++ b/pkg/logging/log.go @@ -27,9 +27,16 @@ const ( FATAL ) -func init() { - filePath := getLogFileFullPath() - F = openLogFile(filePath) +func Setup() { + var err error + + filePath := getLogFilePath() + fileName := getLogFileName() + F, err = openLogFile(fileName, filePath) + if err != nil { + log.Fatalf("logging.Setup err: %v", err) + } + logger = log.New(F, DefaultPrefix, log.LstdFlags) } func Debug(v ...interface{}) { diff --git a/pkg/setting/setting.go b/pkg/setting/setting.go index 4f01f10..4bcb3d8 100644 --- a/pkg/setting/setting.go +++ b/pkg/setting/setting.go @@ -6,50 +6,66 @@ import ( "time" ) -var Cfg *ini.File -var ( +type App struct { + JwtSecret string + PageSize int + RuntimeRootPath string + + ImagePrefixUrl string + ImageSavePath string + ImageMaxSize int + ImageAllowExts []string + + LogSavePath string + LogSavename string + LogFileExt string + TimeFormat string +} + +var AppSetting = &App{} + +type Server struct { RunMode string - HTTPPort int + HttpPort int ReadTimeout time.Duration WriteTimeout time.Duration - PageSize int - JwtSecret string -) +} -func init() { - var err error - Cfg, err = ini.Load("conf/app.ini") +var ServerSetting = &Server{} + +type Database struct { + Type string + User string + Password string + Host string + Port string + Name string + TablePrefix string +} + +var DatabaseSetting = &Database{} + +func Setup() { + Cfg, err := ini.Load("conf/app.ini") if err != nil { log.Fatalf("Fail to parse 'conf/app.ini': %v", err) } - LoadBase() - LoadServer() - LoadApp() -} - -func LoadBase() { - //RunMode = Cfg.Section("server").Key("RUN_MODE").MustString("debug") -} - -func LoadServer() { - sec, err := Cfg.GetSection("server") + err = Cfg.Section("app").MapTo(AppSetting) if err != nil { - log.Fatalf("Fail to get section 'sever' : %v", err) + log.Fatalf("Cfg.MapTo AppSetting err: %v", err) } - RunMode = sec.Key("RunMode").MustString("debug") - HTTPPort = sec.Key("HttpPort").MustInt(8000) - ReadTimeout = time.Duration(sec.Key("ReadTimeout").MustUint(60)) * time.Second - WriteTimeout = time.Duration(sec.Key("WriteTimeout").MustInt(60)) * time.Second -} - -func LoadApp() { - sec, err := Cfg.GetSection("app") + err = Cfg.Section("server").MapTo(ServerSetting) if err != nil { - log.Fatalf("Fail to get section 'app':%v", err) + log.Fatalf("Cfg.MapTo ServerSetting err: %v", err) } - JwtSecret = sec.Key("JwtSecret").MustString("!@#!@#!@#!@@#!@#") - PageSize = sec.Key("WriteTimeout").MustInt(10) + ServerSetting.ReadTimeout *= time.Second + ServerSetting.WriteTimeout *= time.Second + + err = Cfg.Section("database").MapTo(DatabaseSetting) + if err != nil { + log.Fatalf("Cfg.MapTo DatabaseSetting err: %v", err) + } } diff --git a/pkg/util/jwt.go b/pkg/util/jwt.go index 38470c1..001b750 100644 --- a/pkg/util/jwt.go +++ b/pkg/util/jwt.go @@ -6,7 +6,7 @@ import ( "time" ) -var jwtSecret = []byte(setting.JwtSecret) +var jwtSecret = []byte(setting.AppSetting.JwtSecret) type Claims struct { Username string `json:"username"` diff --git a/pkg/util/pagenation.go b/pkg/util/pagenation.go index 0afc4af..a371f25 100644 --- a/pkg/util/pagenation.go +++ b/pkg/util/pagenation.go @@ -10,7 +10,7 @@ func GetPage(c *gin.Context) int { result := 0 page, _ := com.StrTo(c.Query("page")).Int() if page > 0 { - result = (page - 1) * setting.PageSize + result = (page - 1) * setting.AppSetting.PageSize } return result diff --git a/routers/admin/v1/employee.go b/routers/admin/v1/employee.go index 87f7549..6cfee9d 100644 --- a/routers/admin/v1/employee.go +++ b/routers/admin/v1/employee.go @@ -75,7 +75,7 @@ func GetEmployees(c *gin.Context) { if ! valid.HasErrors() { code = e.SUCCESS - data["lists"] = models.GetEmployees(util.GetPage(c), setting.PageSize, maps) + data["lists"] = models.GetEmployees(util.GetPage(c), setting.AppSetting.PageSize, maps) data["total"] = models.GetEmployeeTotal(maps) } else { for _, err := range valid.Errors { diff --git a/routers/router.go b/routers/router.go index 6fb2573..605bcdc 100644 --- a/routers/router.go +++ b/routers/router.go @@ -15,7 +15,7 @@ func InitRouter() *gin.Engine { r.Use(gin.Recovery()) - gin.SetMode(setting.RunMode) + gin.SetMode(setting.ServerSetting.RunMode) r.GET("/ping", func(c *gin.Context) { c.JSON(200, gin.H{