Skip to content

Commit ce3ee6a

Browse files
committed
将需要生成电子书的书籍加入到队列
1 parent f5b9d13 commit ce3ee6a

File tree

3 files changed

+149
-8
lines changed

3 files changed

+149
-8
lines changed

commands/command.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -99,6 +99,7 @@ func RegisterModel() {
9999
models.NewSign(),
100100
models.NewBookCounter(),
101101
models.NewDownloadCounter(),
102+
models.NewEbook(),
102103
)
103104
migrate.RegisterMigration()
104105
}

controllers/BookController.go

Lines changed: 12 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -729,8 +729,7 @@ func (this *BookController) Release() {
729729
this.JsonResult(0, "发布任务已推送到任务队列,稍后将在后台执行。")
730730
}
731731

732-
//生成下载文档
733-
//加锁,防止用户不停地点击生成下载文档造成服务器资源开销.
732+
// 生成电子书
734733
func (this *BookController) Generate() {
735734
identify := this.GetString(":key")
736735

@@ -743,15 +742,20 @@ func (this *BookController) Generate() {
743742
beego.Error(err)
744743
this.JsonResult(1, "书籍不存在")
745744
}
746-
//书籍正在生成离线文档
747-
if isGenerating := utils.BooksGenerate.Exist(book.BookId); isGenerating {
748-
this.JsonResult(1, "上一次下载文档生成任务正在后台执行,请您稍后再执行新的下载文档生成操作")
745+
746+
ebookModel := models.NewEbook()
747+
748+
// 电子书不是处于完成状态,不允许再添加到电子书生成队列中
749+
if ok := ebookModel.IsFinish(book.BookId); !ok {
750+
this.JsonResult(1, "电子书生成任务已在处理中,如需再次生成,请您稍后再试。")
749751
}
750752

751-
baseUrl := "http://localhost:" + beego.AppConfig.String("httpport")
752-
go new(models.Document).GenerateBook(book, baseUrl)
753+
// 添加到电子书生成队列
754+
if err = ebookModel.AddToGenerate(book.BookId); err != nil {
755+
this.JsonResult(1, err.Error())
756+
}
753757

754-
this.JsonResult(0, "下载文档生成任务已交由后台执行,请您耐心等待。")
758+
this.JsonResult(0, "电子书生成任务已交由后台执行,请您耐心等待。")
755759
}
756760

757761
//文档排序.

models/ebook.go

Lines changed: 136 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,136 @@
1+
package models
2+
3+
import (
4+
"errors"
5+
"time"
6+
7+
"github.com/astaxie/beego"
8+
"github.com/astaxie/beego/orm"
9+
)
10+
11+
type Ebook struct {
12+
Id int
13+
Title string // 电子书名称
14+
Keywords string // 关键字
15+
Description string // 摘要
16+
Path string // 文件路径。如果是网站生成的电子书,则为电子书的路径,否则为URL地址
17+
BookID int `orm:"default(0);column(book_id);index"` // 所属书籍ID
18+
Ext string `orm:"size(8);index"` // 文件扩展名
19+
Status int `orm:"default(0);index"` // 0:待处理; 1: 转换中;2: 转换完成
20+
Size int64 `orm:"default(0)"` // 电子书大小
21+
DownloadCount int `orm:"default(0)"` // 电子书被下载次数
22+
CreatedAt time.Time `orm:"auto_now_add;type(datetime)"`
23+
UpdatedAt time.Time `orm:"auto_now;type(datetime)"`
24+
}
25+
26+
var convert2ebookRunning = false
27+
28+
const (
29+
EBookStatusPending = 0 // 待处理
30+
EBookStatusProccessing = 1 // 处理中
31+
EBookStatusSuccess = 2 // 转换成功
32+
EBookStatusFailure = 3 // 失败
33+
)
34+
35+
func NewEbook() *Ebook {
36+
return &Ebook{}
37+
}
38+
39+
func (m *Ebook) GetEBookByBookID(bookID int) (books []Ebook) {
40+
if bookID <= 0 {
41+
return
42+
}
43+
44+
if _, err := orm.NewOrm().QueryTable(m).Filter("book_id", bookID).All(&books); err != nil && err != orm.ErrNoRows {
45+
beego.Error(err)
46+
}
47+
return
48+
}
49+
50+
func (m *Ebook) GetEBook(id int) (book Ebook) {
51+
if id <= 0 {
52+
return
53+
}
54+
err := orm.NewOrm().QueryTable(m).Filter("id", id).One(&book)
55+
if err != nil {
56+
beego.Error(err)
57+
}
58+
return
59+
}
60+
61+
// 添加书籍到电子书生成队列
62+
func (m *Ebook) AddToGenerate(bookID int) (err error) {
63+
var (
64+
ebooks []Ebook
65+
exts = []string{".pdf", ".mobi", ".epub"}
66+
)
67+
68+
b, _ := NewBook().Find(bookID)
69+
if b == nil || b.BookId == 0 {
70+
return errors.New("书籍不存在")
71+
}
72+
for _, ext := range exts {
73+
ebooks = append(ebooks, Ebook{
74+
Title: b.BookName,
75+
Keywords: b.Label,
76+
Description: b.Description,
77+
BookID: bookID,
78+
Ext: ext,
79+
Status: EBookStatusPending,
80+
})
81+
}
82+
83+
if _, err = orm.NewOrm().InsertMulti(len(ebooks), &ebooks); err != nil {
84+
beego.Error(err)
85+
}
86+
return
87+
}
88+
89+
// 电子书状态(最新的状态)
90+
func (m *Ebook) Stats(bookID int) (stats map[string]Ebook) {
91+
var (
92+
ebooks []Ebook
93+
limit = 4 // 先默认为4,即四个扩展名:.pdf,.epub,.mobi,.docx
94+
)
95+
stats = make(map[string]Ebook)
96+
o := orm.NewOrm()
97+
o.QueryTable(m).Filter("book_id", bookID).OrderBy("-id").Limit(limit).All(&ebooks)
98+
if len(ebooks) == 0 {
99+
return
100+
}
101+
102+
for _, ebook := range ebooks {
103+
if _, ok := stats[ebook.Ext]; !ok {
104+
stats[ebook.Ext] = ebook
105+
}
106+
}
107+
return
108+
}
109+
110+
// 查询书籍是否处于完成状态。失败也是完成状态的一种。
111+
func (m *Ebook) IsFinish(bookID int) (ok bool) {
112+
count, err := orm.NewOrm().QueryTable(m).Filter("book_id", bookID).Filter("status__in", EBookStatusPending, EBookStatusProccessing).Count()
113+
if err != nil {
114+
beego.Error(err)
115+
return
116+
}
117+
return count == 0
118+
}
119+
120+
// 生成电子书
121+
func (m *Ebook) convert2ebook() {
122+
if convert2ebookRunning {
123+
return
124+
}
125+
convert2ebookRunning = true
126+
o := orm.NewOrm()
127+
o.QueryTable(m).Filter("book_id__gt", 0).Filter("status", EBookStatusProccessing).Update(orm.Params{"status": EBookStatusPending})
128+
for {
129+
var ebook Ebook
130+
o.QueryTable(m).Filter("book_id__gt", 0).Filter("status", EBookStatusPending).OrderBy("id").One(&ebook)
131+
if ebook.Id > 0 {
132+
// 根据电子书的ID,查找现有的电子书的队列
133+
}
134+
time.Sleep(5 * time.Second)
135+
}
136+
}

0 commit comments

Comments
 (0)