diff --git a/controllers/BookController.go b/controllers/BookController.go index 690c859b..d63d5a73 100644 --- a/controllers/BookController.go +++ b/controllers/BookController.go @@ -415,13 +415,13 @@ func (c *BookController) Users() { func (c *BookController) Create() { if c.Ctx.Input.IsPost() { - book_name := strings.TrimSpace(c.GetString("book_name", "")) + bookName := strings.TrimSpace(c.GetString("book_name", "")) identify := strings.TrimSpace(c.GetString("identify", "")) description := strings.TrimSpace(c.GetString("description", "")) privatelyOwned, _ := strconv.Atoi(c.GetString("privately_owned")) - comment_status := c.GetString("comment_status") + commentStatus := c.GetString("comment_status") - if book_name == "" { + if bookName == "" { c.JsonResult(6001, "项目名称不能为空") } if identify == "" { @@ -439,8 +439,8 @@ func (c *BookController) Create() { if privatelyOwned != 0 && privatelyOwned != 1 { privatelyOwned = 1 } - if comment_status != "open" && comment_status != "closed" && comment_status != "group_only" && comment_status != "registered_only" { - comment_status = "closed" + if commentStatus != "open" && commentStatus != "closed" && commentStatus != "group_only" && commentStatus != "registered_only" { + commentStatus = "closed" } book := models.NewBook() book.Cover = conf.GetDefaultCover() @@ -477,11 +477,11 @@ func (c *BookController) Create() { c.JsonResult(6006, "项目标识已存在") } - book.BookName = book_name + book.BookName = bookName book.Description = description book.CommentCount = 0 book.PrivatelyOwned = privatelyOwned - book.CommentStatus = comment_status + book.CommentStatus = commentStatus book.Identify = identify book.DocCount = 0 book.MemberId = c.Member.MemberId @@ -509,6 +509,26 @@ func (c *BookController) Create() { } c.JsonResult(6001, "error") } +//复制项目 +func (c *BookController) Copy(){ + if c.Ctx.Input.IsPost() { + identify := strings.TrimSpace(c.GetString("identify", "")) + if identify == "" { + c.JsonResult(6001,"参数错误") + } + book := models.NewBook() + err := book.Copy(identify) + if err != nil { + c.JsonResult(6002,"复制项目出错") + }else{ + bookResult, err := models.NewBookResult().FindByIdentify(book.Identify, c.Member.MemberId) + if err != nil { + beego.Error("查询失败") + } + c.JsonResult(0,"ok",bookResult) + } + } +} //导入zip压缩包 func (c *BookController) Import() { diff --git a/models/BookModel.go b/models/BookModel.go index f03cab6c..2d2ec14c 100644 --- a/models/BookModel.go +++ b/models/BookModel.go @@ -159,6 +159,112 @@ func (book *Book) Update(cols ...string) error { return err } +//复制项目 +func (book *Book) Copy(identify string) error { + o := orm.NewOrm() + + err := o.QueryTable(book.TableNameWithPrefix()).Filter("identify",identify).One(book) + + if err != nil { + beego.Error("查询项目时出错 -> ",err) + return err + } + if err := o.Begin();err != nil { + beego.Error("开启事物时出错 -> ",err) + return err + } + + bookId := book.BookId + book.BookId = 0 + book.Identify = book.Identify + fmt.Sprintf("%s-%s",identify,strconv.FormatInt(time.Now().UnixNano(), 32)) + book.BookName = book.BookName + "[副本]" + book.CreateTime = time.Now() + book.CommentCount = 0 + book.HistoryCount = 0 + + if _,err := o.Insert(book);err != nil { + beego.Error("复制项目时出错 -> ",err) + o.Rollback() + return err + } + var rels []*Relationship + + if _,err := o.QueryTable(NewRelationship().TableNameWithPrefix()).Filter("book_id",bookId).All(&rels); err != nil { + beego.Error("复制项目关系时出错 -> ",err) + o.Rollback() + return err + } + + for _,rel := range rels { + rel.BookId = book.BookId + rel.RelationshipId = 0 + if _,err := o.Insert(rel);err != nil { + beego.Error("复制项目关系时出错 -> ",err) + o.Rollback() + return err + } + } + + var docs []*Document + + if _,err := o.QueryTable(NewDocument().TableNameWithPrefix()).Filter("book_id",bookId).Filter("parent_id",0).All(&docs);err != nil && err != orm.ErrNoRows { + beego.Error("读取项目文档时出错 -> ",err) + o.Rollback() + return err + } + if len(docs) > 0 { + if err := recursiveInsertDocument(docs,o,book.BookId,0);err != nil { + beego.Error("复制项目时出错 -> ",err) + o.Rollback() + return err + } + } + + return o.Commit() +} +//递归的复制文档 +func recursiveInsertDocument(docs []*Document,o orm.Ormer,bookId int,parentId int) error { + for _,doc := range docs { + + docId := doc.DocumentId + doc.DocumentId = 0 + doc.ParentId = parentId + doc.BookId = bookId + doc.Version = time.Now().Unix() + + if _,err := o.Insert(doc);err != nil { + beego.Error("插入项目时出错 -> ",err) + return err + } + + var attachList []*Attachment + //读取所有附件列表 + if _,err := o.QueryTable(NewAttachment().TableNameWithPrefix()).Filter("document_id",docId).All(&attachList); err == nil { + for _,attach := range attachList { + attach.BookId = bookId + attach.DocumentId = doc.DocumentId + attach.AttachmentId = 0 + if _,err := o.Insert(attach);err != nil { + return err + } + } + } + var subDocs []*Document + + if _,err := o.QueryTable(NewDocument().TableNameWithPrefix()).Filter("parent_id",docId).All(&subDocs);err != nil && err != orm.ErrNoRows { + beego.Error("读取文档时出错 -> ",err) + return err + } + if len(subDocs) > 0{ + + if err := recursiveInsertDocument(subDocs,o,bookId,doc.DocumentId);err != nil { + return err + } + } + } + return nil +} + //根据指定字段查询结果集. func (book *Book) FindByField(field string, value interface{},cols ...string) ([]*Book, error) { o := orm.NewOrm() @@ -465,6 +571,7 @@ func (book *Book) ResetDocumentNumber(bookId int) { } } +//导入项目 func (book *Book) ImportBook(zipPath string) error { if !filetil.FileExists(zipPath) { return errors.New("文件不存在 => " + zipPath) diff --git a/models/DocumentModel.go b/models/DocumentModel.go index b1214acd..fa8ac688 100644 --- a/models/DocumentModel.go +++ b/models/DocumentModel.go @@ -96,6 +96,7 @@ func (m *Document) InsertOrUpdate(cols ...string) error { m.Identify = fmt.Sprintf("%s-%s",identify,strconv.FormatInt(time.Now().UnixNano(), 32)) } + if m.OrderSort == 0{ sort,_ := o.QueryTable(m.TableNameWithPrefix()).Filter("book_id",m.BookId).Filter("parent_id",m.ParentId).Count() m.OrderSort = int(sort) + 1 diff --git a/routers/router.go b/routers/router.go index 3f2368e5..1450d652 100644 --- a/routers/router.go +++ b/routers/router.go @@ -25,11 +25,13 @@ func init() { beego.Router("/manager/books", &controllers.ManagerController{}, "*:Books") beego.Router("/manager/books/edit/:key", &controllers.ManagerController{}, "*:EditBook") beego.Router("/manager/books/delete", &controllers.ManagerController{}, "*:DeleteBook") + beego.Router("/manager/comments", &controllers.ManagerController{}, "*:Comments") - beego.Router("/manager/books/token", &controllers.ManagerController{}, "post:CreateToken") beego.Router("/manager/setting", &controllers.ManagerController{}, "*:Setting") + beego.Router("/manager/books/token", &controllers.ManagerController{}, "post:CreateToken") beego.Router("/manager/books/transfer", &controllers.ManagerController{}, "post:Transfer") beego.Router("/manager/books/open", &controllers.ManagerController{}, "post:PrivatelyOwned") + beego.Router("/manager/attach/list", &controllers.ManagerController{}, "*:AttachList") beego.Router("/manager/attach/detailed/:id", &controllers.ManagerController{}, "*:AttachDetailed") beego.Router("/manager/attach/delete", &controllers.ManagerController{}, "post:AttachDelete") @@ -52,6 +54,7 @@ func init() { beego.Router("/book/users/change", &controllers.BookMemberController{}, "post:ChangeRole") beego.Router("/book/users/delete", &controllers.BookMemberController{}, "post:RemoveMember") beego.Router("/book/users/import", &controllers.BookController{},"post:Import") + beego.Router("/book/users/copy", &controllers.BookController{},"post:Copy") beego.Router("/book/setting/save", &controllers.BookController{}, "post:SaveBook") beego.Router("/book/setting/open", &controllers.BookController{}, "post:PrivatelyOwned") diff --git a/views/book/index.tpl b/views/book/index.tpl index fcb6df06..b477e8ab 100644 --- a/views/book/index.tpl +++ b/views/book/index.tpl @@ -74,6 +74,7 @@ @@ -269,6 +270,7 @@ +