Przeglądaj źródła

实现项目复制功能

lifei6671 7 lat temu
rodzic
commit
c5fb0c760b

+ 27 - 7
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() {

+ 107 - 0
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)

+ 1 - 0
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

+ 4 - 1
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")

+ 24 - 0
views/book/index.tpl

@@ -74,6 +74,7 @@
                                             </template>
                                             <template v-if="item.role_id == 0">
                                             <li><a :href="'javascript:deleteBook(\''+item.identify+'\');'">删除</a></li>
+                                            <li><a :href="'javascript:copyBook(\''+item.identify+'\');'">复制</a></li>
                                             </template>
                                         </ul>
 
@@ -269,6 +270,7 @@
 <script src="{{cdnjs "/static/js/jquery.form.js"}}" type="text/javascript"></script>
 <script src="{{cdnjs "/static/bootstrap/plugins/bootstrap-fileinput/4.4.7/js/fileinput.min.js"}}"></script>
 <script src="{{cdnjs "/static/bootstrap/plugins/bootstrap-fileinput/4.4.7/js/locales/zh.js"}}"></script>
+<script src="{{cdnjs "/static/layer/layer.js"}}" type="text/javascript" ></script>
 <script src="{{cdnjs "/static/js/main.js"}}" type="text/javascript"></script>
 <script type="text/javascript">
     /**
@@ -364,6 +366,28 @@
         $("#deleteBookModal").find("input[name='identify']").val($id);
         $("#deleteBookModal").modal("show");
     }
+    function copyBook($id){
+        var index = layer.load()
+        $.ajax({
+           url : "{{urlfor "BookController.Copy"}}" ,
+            data : {"identify":$id},
+            type : "POST",
+            dataType : "json",
+            success : function ($res) {
+                layer.close(index);
+                if ($res.errcode === 0) {
+                    window.app.lists.splice(0, 0, $res.data);
+                    $("#addBookDialogModal").modal("hide");
+                } else {
+                    layer.msg($res.message);
+                }
+            },
+            error : function () {
+                layer.close(index);
+                layer.msg('服务器异常');
+            }
+        });
+    }
 
     $(function () {
         $("#addBookDialogModal").on("show.bs.modal",function () {

+ 16 - 14
views/home/index.tpl

@@ -41,25 +41,27 @@
 
             <div class="manual-list">
                 {{range $index,$item := .Lists}}
-                <div class="list-item">
-                    <dl class="manual-item-standard">
-                        <dt>
-                            <a href="{{urlfor "DocumentController.Index" ":key" $item.Identify}}" title="{{$item.BookName}}-{{$item.CreateName}}" target="_blank">
-                                <img src="{{cdnimg $item.Cover}}" class="cover" alt="{{$item.BookName}}-{{$item.CreateName}}" onerror="this.src='{{cdnimg "static/images/book.jpg"}}';">
-                            </a>
-                        </dt>
-                        <dd>
-                            <a href="{{urlfor "DocumentController.Index" ":key" $item.Identify}}" class="name" title="{{$item.BookName}}-{{$item.CreateName}}" target="_blank">{{$item.BookName}}</a>
-                        </dd>
-                        <dd>
+                    <div class="list-item">
+                        <dl class="manual-item-standard">
+                            <dt>
+                                <a href="{{urlfor "DocumentController.Index" ":key" $item.Identify}}" title="{{$item.BookName}}-{{$item.CreateName}}" target="_blank">
+                                    <img src="{{cdnimg $item.Cover}}" class="cover" alt="{{$item.BookName}}-{{$item.CreateName}}" onerror="this.src='{{cdnimg "static/images/book.jpg"}}';">
+                                </a>
+                            </dt>
+                            <dd>
+                                <a href="{{urlfor "DocumentController.Index" ":key" $item.Identify}}" class="name" title="{{$item.BookName}}-{{$item.CreateName}}" target="_blank">{{$item.BookName}}</a>
+                            </dd>
+                            <dd>
                             <span class="author">
                                 <b class="text">作者</b>
                                 <b class="text">-</b>
                                 <b class="text">{{if eq $item.RealName "" }}{{$item.CreateName}}{{else}}{{$item.RealName}}{{end}}</b>
                             </span>
-                        </dd>
-                    </dl>
-                </div>
+                            </dd>
+                        </dl>
+                    </div>
+                {{else}}
+                    <div class="text-center" style="height: 200px;margin: 100px;font-size: 28px;">暂无项目</div>
                 {{end}}
                 <div class="clearfix"></div>
             </div>

+ 2 - 2
views/widgets/footer.tpl

@@ -1,11 +1,11 @@
 <div class="footer">
     <div class="container">
         <div class="row text-center border-top">
-            <span><a href="https://www.iminho.me">MinDoc</a></span>
+            <span><a href="https://www.iminho.me" target="_blank">MinDoc</a></span>
             <span>&nbsp;·&nbsp;</span>
             <span><a href="https://github.com/lifei6671/mindoc/issues" target="_blank">意见反馈</a></span>
             <span>&nbsp;·&nbsp;</span>
-            <span><a href="https://github.com/lifei6671/mindoc">Github</a></span>
+            <span><a href="https://github.com/lifei6671/mindoc" target="_blank">Github</a></span>
         </div>
         {{if ne .site_beian ""}}
         <div class="row text-center">