command.go 5.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224
  1. package commands
  2. import (
  3. "encoding/gob"
  4. "fmt"
  5. "net/url"
  6. "os"
  7. "time"
  8. "flag"
  9. "path/filepath"
  10. "strings"
  11. "github.com/astaxie/beego"
  12. "github.com/astaxie/beego/logs"
  13. "github.com/astaxie/beego/orm"
  14. "github.com/lifei6671/gocaptcha"
  15. "github.com/lifei6671/godoc/commands/migrate"
  16. "github.com/lifei6671/godoc/conf"
  17. "github.com/lifei6671/godoc/models"
  18. "github.com/lifei6671/godoc/utils"
  19. "log"
  20. )
  21. var (
  22. ConfigurationFile = "./conf/app.conf"
  23. WorkingDirectory = "./"
  24. LogFile = "./logs"
  25. )
  26. // RegisterDataBase 注册数据库
  27. func RegisterDataBase() {
  28. adapter := beego.AppConfig.String("db_adapter")
  29. if adapter == "mysql" {
  30. host := beego.AppConfig.String("db_host")
  31. database := beego.AppConfig.String("db_database")
  32. username := beego.AppConfig.String("db_username")
  33. password := beego.AppConfig.String("db_password")
  34. timezone := beego.AppConfig.String("timezone")
  35. port := beego.AppConfig.String("db_port")
  36. dataSource := fmt.Sprintf("%s:%s@tcp(%s:%s)/%s?charset=utf8mb4&parseTime=true&loc=%s", username, password, host, port, database, url.QueryEscape(timezone))
  37. orm.RegisterDataBase("default", "mysql", dataSource)
  38. location, err := time.LoadLocation(timezone)
  39. if err == nil {
  40. orm.DefaultTimeLoc = location
  41. } else {
  42. log.Fatalln(err)
  43. }
  44. } else if adapter == "sqlite3" {
  45. database := beego.AppConfig.String("db_database")
  46. dbPath := filepath.Dir(database)
  47. os.MkdirAll(dbPath, 0777)
  48. orm.RegisterDataBase("default", "sqlite3", database)
  49. }
  50. }
  51. // RegisterModel 注册Model
  52. func RegisterModel() {
  53. orm.RegisterModelWithPrefix(conf.GetDatabasePrefix(),
  54. new(models.Member),
  55. new(models.Book),
  56. new(models.Relationship),
  57. new(models.Option),
  58. new(models.Document),
  59. new(models.Attachment),
  60. new(models.Logger),
  61. new(models.MemberToken),
  62. new(models.DocumentHistory),
  63. new(models.Migration),
  64. )
  65. migrate.RegisterMigration()
  66. }
  67. // RegisterLogger 注册日志
  68. func RegisterLogger(log string) {
  69. logs.SetLogFuncCall(true)
  70. logs.SetLogger("console")
  71. logs.EnableFuncCallDepth(true)
  72. logs.Async()
  73. logPath := filepath.Join(log, "log.log")
  74. if _, err := os.Stat(logPath); os.IsNotExist(err) {
  75. os.MkdirAll(log, 0777)
  76. if f, err := os.Create(logPath); err == nil {
  77. f.Close()
  78. beego.SetLogger("file", fmt.Sprintf(`{"filename":"%s"}`, logPath))
  79. }
  80. }
  81. beego.SetLogFuncCall(true)
  82. beego.BeeLogger.Async()
  83. }
  84. // RunCommand 注册orm命令行工具
  85. func RegisterCommand() {
  86. if len(os.Args) >= 2 && os.Args[1] == "install" {
  87. ResolveCommand(os.Args[2:])
  88. Install()
  89. } else if len(os.Args) >= 2 && os.Args[1] == "version" {
  90. ResolveCommand(os.Args[2:])
  91. CheckUpdate()
  92. } else if len(os.Args) >= 2 && os.Args[1] == "migrate" {
  93. ResolveCommand(os.Args[2:])
  94. migrate.RunMigration()
  95. }
  96. }
  97. func RegisterFunction() {
  98. beego.AddFuncMap("config", models.GetOptionValue)
  99. beego.AddFuncMap("cdn", func(p string) string {
  100. cdn := beego.AppConfig.DefaultString("cdn", "")
  101. if strings.HasPrefix(p, "/") && strings.HasSuffix(cdn, "/") {
  102. return cdn + string(p[1:])
  103. }
  104. if !strings.HasPrefix(p, "/") && !strings.HasSuffix(cdn, "/") {
  105. return cdn + "/" + p
  106. }
  107. return cdn + p
  108. })
  109. beego.AddFuncMap("cdnjs", func(p string) string {
  110. cdn := beego.AppConfig.DefaultString("cdnjs", "")
  111. if strings.HasPrefix(p, "/") && strings.HasSuffix(cdn, "/") {
  112. return cdn + string(p[1:])
  113. }
  114. if !strings.HasPrefix(p, "/") && !strings.HasSuffix(cdn, "/") {
  115. return cdn + "/" + p
  116. }
  117. return cdn + p
  118. })
  119. beego.AddFuncMap("cdncss", func(p string) string {
  120. cdn := beego.AppConfig.DefaultString("cdncss", "")
  121. if strings.HasPrefix(p, "/") && strings.HasSuffix(cdn, "/") {
  122. return cdn + string(p[1:])
  123. }
  124. if !strings.HasPrefix(p, "/") && !strings.HasSuffix(cdn, "/") {
  125. return cdn + "/" + p
  126. }
  127. return cdn + p
  128. })
  129. beego.AddFuncMap("cdnimg", func(p string) string {
  130. cdn := beego.AppConfig.DefaultString("cdnimg", "")
  131. if strings.HasPrefix(p, "/") && strings.HasSuffix(cdn, "/") {
  132. return cdn + string(p[1:])
  133. }
  134. if !strings.HasPrefix(p, "/") && !strings.HasSuffix(cdn, "/") {
  135. return cdn + "/" + p
  136. }
  137. return cdn + p
  138. })
  139. }
  140. func ResolveCommand(args []string) {
  141. flagSet := flag.NewFlagSet("MinDoc command: ", flag.ExitOnError)
  142. flagSet.StringVar(&ConfigurationFile, "config", "", "MinDoc configuration file.")
  143. flagSet.StringVar(&WorkingDirectory, "dir", "", "MinDoc working directory.")
  144. flagSet.StringVar(&LogFile, "log", "", "MinDoc log file path.")
  145. flagSet.Parse(args)
  146. if WorkingDirectory == "" {
  147. if p, err := filepath.Abs(os.Args[0]); err == nil {
  148. WorkingDirectory = filepath.Dir(p)
  149. }
  150. }
  151. if LogFile == "" {
  152. LogFile = filepath.Join(WorkingDirectory,"logs")
  153. }
  154. if ConfigurationFile == "" {
  155. ConfigurationFile = filepath.Join(WorkingDirectory,"conf","app.conf")
  156. config := filepath.Join(WorkingDirectory,"conf","app.conf.example")
  157. if !utils.FileExists(ConfigurationFile) && utils.FileExists(config){
  158. utils.CopyFile(config,ConfigurationFile)
  159. }
  160. }
  161. err := beego.LoadAppConfig("ini", ConfigurationFile)
  162. if err != nil {
  163. log.Println("An error occurred:", err)
  164. os.Exit(1)
  165. }
  166. uploads := filepath.Join(WorkingDirectory, "uploads")
  167. os.MkdirAll(uploads,0666)
  168. beego.BConfig.WebConfig.StaticDir["/static"] = filepath.Join(WorkingDirectory, "static")
  169. beego.BConfig.WebConfig.StaticDir["/uploads"] = uploads
  170. beego.BConfig.WebConfig.ViewsPath = filepath.Join(WorkingDirectory, "views")
  171. fonts := filepath.Join(WorkingDirectory, "static", "fonts")
  172. if !utils.FileExists(fonts) {
  173. log.Fatal("Font path not exist.")
  174. }
  175. gocaptcha.ReadFonts(filepath.Join(WorkingDirectory, "static", "fonts"), ".ttf")
  176. RegisterDataBase()
  177. RegisterModel()
  178. RegisterLogger(LogFile)
  179. }
  180. func init() {
  181. gocaptcha.ReadFonts("./static/fonts", ".ttf")
  182. gob.Register(models.Member{})
  183. if p,err := filepath.Abs(os.Args[0]);err == nil{
  184. WorkingDirectory = filepath.Dir(p)
  185. }
  186. }