diff --git a/commands/command.go b/commands/command.go index 6726f189..dc37e65e 100644 --- a/commands/command.go +++ b/commands/command.go @@ -194,32 +194,31 @@ func ResolveCommand(args []string) { } } if conf.LogFile == "" { - conf.LogFile = filepath.Join(conf.WorkingDirectory, "logs") + conf.LogFile = conf.WorkingDir("runtime","logs") } if conf.ConfigurationFile == "" { - conf.ConfigurationFile = filepath.Join(conf.WorkingDirectory, "conf", "app.conf") - config := filepath.Join(conf.WorkingDirectory, "conf", "app.conf.example") + conf.ConfigurationFile = conf.WorkingDir( "conf", "app.conf") + config := conf.WorkingDir("conf", "app.conf.example") if !filetil.FileExists(conf.ConfigurationFile) && filetil.FileExists(config) { filetil.CopyFile(conf.ConfigurationFile, config) } } - gocaptcha.ReadFonts(filepath.Join(conf.WorkingDirectory, "static", "fonts"), ".ttf") - - err := beego.LoadAppConfig("ini", conf.ConfigurationFile) - - if err != nil { - log.Println("An error occurred:", err) - os.Exit(1) + if err := gocaptcha.ReadFonts(conf.WorkingDir( "static", "fonts"), ".ttf");err != nil { + log.Fatal("读取字体文件时出错 -> ",err) } - uploads := filepath.Join(conf.WorkingDirectory, "uploads") + + if err := beego.LoadAppConfig("ini", conf.ConfigurationFile);err != nil { + log.Fatal("An error occurred:", err) + } + uploads := conf.WorkingDir("uploads") os.MkdirAll(uploads, 0666) beego.BConfig.WebConfig.StaticDir["/static"] = filepath.Join(conf.WorkingDirectory, "static") beego.BConfig.WebConfig.StaticDir["/uploads"] = uploads - beego.BConfig.WebConfig.ViewsPath = filepath.Join(conf.WorkingDirectory, "views") + beego.BConfig.WebConfig.ViewsPath = conf.WorkingDir("views") - fonts := filepath.Join(conf.WorkingDirectory, "static", "fonts") + fonts := conf.WorkingDir("static", "fonts") if !filetil.FileExists(fonts) { log.Fatal("Font path not exist.") diff --git a/conf/enumerate.go b/conf/enumerate.go index ceeb9acf..c2ae126f 100644 --- a/conf/enumerate.go +++ b/conf/enumerate.go @@ -289,4 +289,11 @@ func URLForWithCdnJs(p string) string { return cdn + "/" + p } return cdn + p +} + +func WorkingDir(elem ...string) string { + + elems := append([]string{ WorkingDirectory },elem...) + + return filepath.Join(elems...) } \ No newline at end of file diff --git a/controllers/DocumentController.go b/controllers/DocumentController.go index 8b8cdb10..3dfe0249 100644 --- a/controllers/DocumentController.go +++ b/controllers/DocumentController.go @@ -882,7 +882,10 @@ func (c *DocumentController) Export() { c.Abort("200") }else if output == "pdf" || output == "epub" || output == "docx" || output == "mobi"{ - models.BackgroupConvert(c.CruSession.SessionID(),bookResult) + if err := models.BackgroupConvert(c.CruSession.SessionID(),bookResult);err != nil { + c.ShowErrorPage(500,"导出失败,请查看系统日志") + } + c.ShowErrorPage(200,"文档正在后台转换,请稍后再下载") }else{ c.ShowErrorPage(200,"不支持的文件格式") diff --git a/converter/converter.go b/converter/converter.go index 79926a7e..b4d32dc4 100644 --- a/converter/converter.go +++ b/converter/converter.go @@ -72,6 +72,13 @@ var ( ebookConvert = "ebook-convert" ) +func CheckConvertCommand() error { + args := []string{ "--version" } + cmd := exec.Command(ebookConvert, args...) + + return cmd.Run() +} + // 接口文档 https://manual.calibre-ebook.com/generated/en/ebook-convert.html#table-of-contents //根据json配置文件,创建文档转化对象 func NewConverter(configFile string, debug ...bool) (converter *Converter, err error) { diff --git a/models/BookResult.go b/models/BookResult.go index 861c5cfb..d91c9ce1 100644 --- a/models/BookResult.go +++ b/models/BookResult.go @@ -27,7 +27,7 @@ import ( ) var( - exportLimitWorkerChannel = gopool.NewChannelPool(conf.GetExportProcessNum(),conf.GetExportQueueLimitNum()) + exportLimitWorkerChannel = gopool.NewChannelPool(conf.GetExportLimitNum(),conf.GetExportQueueLimitNum()) ) type BookResult struct { @@ -215,14 +215,21 @@ func (m *BookResult) ToBookResult(book Book) *BookResult { } //后台转换 -func BackgroupConvert(sessionId string,bookResult *BookResult){ +func BackgroupConvert(sessionId string,bookResult *BookResult) error { + + if err := converter.CheckConvertCommand(); err != nil { + beego.Error("检查转换程序失败 -> ",err) + return err + } err := exportLimitWorkerChannel.LoadOrStore(bookResult.Identify, func() { bookResult.Converter(sessionId) }) if err != nil { beego.Error("将导出任务加入任务队列失败 -> ",err) + return err } exportLimitWorkerChannel.Start() + return nil } //导出PDF、word等格式