Browse Source

feat:1、增加项目搜索
2、移除对项目标签和项目令牌的支持

lifei6671 6 years ago
parent
commit
1a40caaa6c

+ 46 - 52
controllers/BookController.go

@@ -139,7 +139,7 @@ func (c *BookController) SaveBook() {
 	bookName := strings.TrimSpace(c.GetString("book_name"))
 	bookName := strings.TrimSpace(c.GetString("book_name"))
 	description := strings.TrimSpace(c.GetString("description", ""))
 	description := strings.TrimSpace(c.GetString("description", ""))
 	commentStatus := c.GetString("comment_status")
 	commentStatus := c.GetString("comment_status")
-	tag := strings.TrimSpace(c.GetString("label"))
+	//tag := strings.TrimSpace(c.GetString("label"))
 	editor := strings.TrimSpace(c.GetString("editor"))
 	editor := strings.TrimSpace(c.GetString("editor"))
 	autoRelease := strings.TrimSpace(c.GetString("auto_release")) == "on"
 	autoRelease := strings.TrimSpace(c.GetString("auto_release")) == "on"
 	publisher := strings.TrimSpace(c.GetString("publisher"))
 	publisher := strings.TrimSpace(c.GetString("publisher"))
@@ -156,12 +156,7 @@ func (c *BookController) SaveBook() {
 	if commentStatus != "open" && commentStatus != "closed" && commentStatus != "group_only" && commentStatus != "registered_only" {
 	if commentStatus != "open" && commentStatus != "closed" && commentStatus != "group_only" && commentStatus != "registered_only" {
 		commentStatus = "closed"
 		commentStatus = "closed"
 	}
 	}
-	if tag != "" {
-		tags := strings.Split(tag, ",")
-		if len(tags) > 10 {
-			c.JsonResult(6005, "最多允许添加10个标签")
-		}
-	}
+
 	if !models.NewItemsets().Exist(itemId) {
 	if !models.NewItemsets().Exist(itemId) {
 		c.JsonResult(6006, "项目空间不存在")
 		c.JsonResult(6006, "项目空间不存在")
 	}
 	}
@@ -173,7 +168,7 @@ func (c *BookController) SaveBook() {
 	book.Description = description
 	book.Description = description
 	book.CommentStatus = commentStatus
 	book.CommentStatus = commentStatus
 	book.Publisher = publisher
 	book.Publisher = publisher
-	book.Label = tag
+	//book.Label = tag
 	book.Editor = editor
 	book.Editor = editor
 	book.HistoryCount = historyCount
 	book.HistoryCount = historyCount
 	book.IsDownload = 0
 	book.IsDownload = 0
@@ -211,7 +206,6 @@ func (c *BookController) SaveBook() {
 	bookResult.BookName = bookName
 	bookResult.BookName = bookName
 	bookResult.Description = description
 	bookResult.Description = description
 	bookResult.CommentStatus = commentStatus
 	bookResult.CommentStatus = commentStatus
-	bookResult.Label = tag
 
 
 	beego.Info("用户 [", c.Member.Account, "] 修改了项目 ->", book)
 	beego.Info("用户 [", c.Member.Account, "] 修改了项目 ->", book)
 
 
@@ -646,49 +640,49 @@ func (c *BookController) Import() {
 }
 }
 
 
 // CreateToken 创建访问来令牌.
 // CreateToken 创建访问来令牌.
-func (c *BookController) CreateToken() {
-
-	action := c.GetString("action")
-
-	bookResult, err := c.IsPermission()
-
-	if err != nil {
-		if err == models.ErrPermissionDenied {
-			c.JsonResult(403, "权限不足")
-		}
-		if err == orm.ErrNoRows {
-			c.JsonResult(404, "项目不存在")
-		}
-		logs.Error("生成阅读令牌失败 =>", err)
-		c.JsonResult(6002, err.Error())
-	}
-	book := models.NewBook()
-
-	if _, err := book.Find(bookResult.BookId); err != nil {
-		c.JsonResult(6001, "项目不存在")
-	}
-	if action == "create" {
-		if bookResult.PrivatelyOwned == 0 {
-			c.JsonResult(6001, "公开项目不能创建阅读令牌")
-		}
-
-		book.PrivateToken = string(utils.Krand(conf.GetTokenSize(), utils.KC_RAND_KIND_ALL))
-		if err := book.Update(); err != nil {
-			logs.Error("生成阅读令牌失败 => ", err)
-			c.JsonResult(6003, "生成阅读令牌失败")
-		}
-		beego.Info("用户[", c.Member.Account, "]创建项目令牌 ->", book.PrivateToken)
-		c.JsonResult(0, "ok", conf.URLFor("DocumentController.Index", ":key", book.Identify, "token", book.PrivateToken))
-	} else {
-		book.PrivateToken = ""
-		if err := book.Update(); err != nil {
-			logs.Error("CreateToken => ", err)
-			c.JsonResult(6004, "删除令牌失败")
-		}
-		beego.Info("用户[", c.Member.Account, "]创建项目令牌 ->", book.PrivateToken)
-		c.JsonResult(0, "ok", "")
-	}
-}
+//func (c *BookController) CreateToken() {
+//
+//	action := c.GetString("action")
+//
+//	bookResult, err := c.IsPermission()
+//
+//	if err != nil {
+//		if err == models.ErrPermissionDenied {
+//			c.JsonResult(403, "权限不足")
+//		}
+//		if err == orm.ErrNoRows {
+//			c.JsonResult(404, "项目不存在")
+//		}
+//		logs.Error("生成阅读令牌失败 =>", err)
+//		c.JsonResult(6002, err.Error())
+//	}
+//	book := models.NewBook()
+//
+//	if _, err := book.Find(bookResult.BookId); err != nil {
+//		c.JsonResult(6001, "项目不存在")
+//	}
+//	if action == "create" {
+//		if bookResult.PrivatelyOwned == 0 {
+//			c.JsonResult(6001, "公开项目不能创建阅读令牌")
+//		}
+//
+//		book.PrivateToken = string(utils.Krand(conf.GetTokenSize(), utils.KC_RAND_KIND_ALL))
+//		if err := book.Update(); err != nil {
+//			logs.Error("生成阅读令牌失败 => ", err)
+//			c.JsonResult(6003, "生成阅读令牌失败")
+//		}
+//		beego.Info("用户[", c.Member.Account, "]创建项目令牌 ->", book.PrivateToken)
+//		c.JsonResult(0, "ok", conf.URLFor("DocumentController.Index", ":key", book.Identify, "token", book.PrivateToken))
+//	} else {
+//		book.PrivateToken = ""
+//		if err := book.Update(); err != nil {
+//			logs.Error("CreateToken => ", err)
+//			c.JsonResult(6004, "删除令牌失败")
+//		}
+//		beego.Info("用户[", c.Member.Account, "]创建项目令牌 ->", book.PrivateToken)
+//		c.JsonResult(0, "ok", "")
+//	}
+//}
 
 
 // Delete 删除项目.
 // Delete 删除项目.
 func (c *BookController) Delete() {
 func (c *BookController) Delete() {

+ 1 - 0
controllers/SearchController.go

@@ -40,6 +40,7 @@ func (c *SearchController) Index() {
 		searchResult, totalCount, err := models.NewDocumentSearchResult().FindToPager(sqltil.EscapeLike(keyword), pageIndex, conf.PageSize, memberId)
 		searchResult, totalCount, err := models.NewDocumentSearchResult().FindToPager(sqltil.EscapeLike(keyword), pageIndex, conf.PageSize, memberId)
 
 
 		if err != nil {
 		if err != nil {
+			beego.Error("搜索失败 ->",err)
 			return
 			return
 		}
 		}
 		if totalCount > 0 {
 		if totalCount > 0 {

+ 90 - 14
models/DocumentSearchResult.go

@@ -59,16 +59,34 @@ FROM (
          LEFT JOIN md_relationship AS rel ON book.book_id = rel.book_id AND rel.role_id = 0
          LEFT JOIN md_relationship AS rel ON book.book_id = rel.book_id AND rel.role_id = 0
          LEFT JOIN md_members AS member ON rel.member_id = member.member_id
          LEFT JOIN md_members AS member ON rel.member_id = member.member_id
        WHERE book.privately_owned = 0 AND (doc.document_name LIKE ? OR doc.release LIKE ?)
        WHERE book.privately_owned = 0 AND (doc.document_name LIKE ? OR doc.release LIKE ?)
+     UNION ALL
+SELECT
+  book.book_id AS document_id,
+  book.modify_time,
+  book.create_time,
+  book.book_name AS document_name,
+  book.identify,
+  book.description,
+  book.identify  AS book_identify,
+  book.book_name,
+  rel.member_id,
+  member.account AS author,
+  'book'     AS search_type
+FROM  md_books AS book
+       LEFT JOIN md_relationship AS rel ON book.book_id = rel.book_id AND rel.role_id = 0
+       LEFT JOIN md_members AS member ON rel.member_id = member.member_id
+WHERE book.privately_owned = 0 AND (book.book_name LIKE ? OR book.description LIKE ?)
+
        UNION ALL
        UNION ALL
        SELECT
        SELECT
-         blog.blog_id,
+         blog.blog_id AS document_id,
          blog.modify_time,
          blog.modify_time,
          blog.create_time,
          blog.create_time,
-         blog.blog_title,
+         blog.blog_title as document_name,
          blog.blog_identify,
          blog.blog_identify,
          blog.blog_release,
          blog.blog_release,
          blog.blog_identify,
          blog.blog_identify,
-         blog.blog_title,
+         blog.blog_title as book_name,
          blog.member_id,
          blog.member_id,
          member.account,
          member.account,
          'blog' AS search_type
          'blog' AS search_type
@@ -97,8 +115,19 @@ LIMIT ?, ?;`
 		}
 		}
 
 
 		totalCount += c
 		totalCount += c
+		//查询项目的数量
+		sql4 := `SELECT count(*) as total_count FROM md_books as book
+WHERE book.privately_owned = 0 AND (book.book_name LIKE ? OR book.description LIKE ?);`
 
 
-		_, err = o.Raw(sql2, keyword, keyword,keyword,keyword, offset, pageSize).QueryRows(&searchResult)
+		err = o.Raw(sql4, keyword, keyword).QueryRow(&c)
+		if err != nil {
+			beego.Error("查询搜索结果失败 -> ",err)
+			return
+		}
+
+		totalCount += c
+
+		_, err = o.Raw(sql2, keyword, keyword,keyword,keyword,keyword,keyword, offset, pageSize).QueryRows(&searchResult)
 		if err != nil {
 		if err != nil {
 			beego.Error("查询搜索结果失败 -> ",err)
 			beego.Error("查询搜索结果失败 -> ",err)
 			return
 			return
@@ -112,7 +141,7 @@ LIMIT ?, ?;`
                    	from md_team_relationship as mtr
                    	from md_team_relationship as mtr
 					left join md_team_member as mtm on mtm.team_id=mtr.team_id and mtm.member_id=? order by role_id desc )as t group by t.role_id,t.team_member_id,t.book_id) as team 
 					left join md_team_member as mtm on mtm.team_id=mtr.team_id and mtm.member_id=? order by role_id desc )as t group by t.role_id,t.team_member_id,t.book_id) as team 
 					on team.book_id = book.book_id
 					on team.book_id = book.book_id
-WHERE (book.privately_owned = 0 OR rel1.relationship_id > 0 or team.team_member_id > 0)  AND (doc.document_name LIKE ? OR doc.release LIKE ?) `
+WHERE (book.privately_owned = 0 OR rel1.relationship_id > 0 or team.team_member_id > 0)  AND (doc.document_name LIKE ? OR doc.release LIKE ?);`
 
 
 		sql2 := `SELECT *
 		sql2 := `SELECT *
 FROM (
 FROM (
@@ -148,14 +177,43 @@ FROM (
        UNION ALL
        UNION ALL
 
 
        SELECT
        SELECT
-         blog.blog_id,
+         book.book_id AS document_id,
+         book.modify_time,
+         book.create_time,
+         book.book_name AS document_name,
+         book.identify,
+         book.description AS description,
+         book.identify  AS book_identify,
+         book.book_name,
+         rel.member_id,
+         member.account AS author,
+         'book'     AS search_type
+       FROM md_books AS book
+         LEFT JOIN md_relationship AS rel ON book.book_id = rel.book_id AND rel.role_id = 0
+         LEFT JOIN md_members AS member ON rel.member_id = member.member_id
+         LEFT JOIN md_relationship AS rel1 ON book.book_id = rel1.book_id AND rel1.member_id = ?
+         LEFT JOIN (SELECT *
+                    FROM (SELECT
+                            book_id,
+                            team_member_id,
+                            role_id
+                          FROM md_team_relationship AS mtr
+                            LEFT JOIN md_team_member AS mtm ON mtm.team_id = mtr.team_id AND mtm.member_id = ?
+                          ORDER BY role_id DESC) AS t
+                    GROUP BY t.role_id, t.team_member_id, t.book_id) AS team
+           ON team.book_id = book.book_id
+       WHERE (book.privately_owned = 0 OR rel1.relationship_id > 0 OR team.team_member_id > 0) AND
+             (book.book_name LIKE ? OR book.description LIKE ?)
+ UNION ALL
+       SELECT
+         blog.blog_id AS document_id, 
          blog.modify_time,
          blog.modify_time,
          blog.create_time,
          blog.create_time,
-         blog.blog_title,
-         blog.blog_identify,
-         blog.blog_release,
-         blog.blog_identify,
-         blog.blog_title,
+         blog.blog_title as document_name,
+         blog.blog_identify as identify,
+         blog.blog_release as description,
+         blog.blog_identify  AS book_identify,
+         blog.blog_title as book_name,
          blog.member_id,
          blog.member_id,
          member.account,
          member.account,
          'blog' AS search_type
          'blog' AS search_type
@@ -185,7 +243,25 @@ LIMIT ?, ?;`
 		}
 		}
 
 
 		totalCount += c
 		totalCount += c
-		_, err = o.Raw(sql2, memberId, memberId, keyword, keyword,memberId,keyword, keyword, offset, pageSize).QueryRows(&searchResult)
+
+		sql4 := `SELECT count(*) as total_count FROM md_books as book
+  LEFT JOIN md_relationship AS rel ON book.book_id = rel.book_id AND rel.role_id = 0
+  LEFT JOIN md_relationship AS rel1 ON book.book_id = rel1.book_id AND rel1.member_id = ?
+			left join (select * from (select book_id,team_member_id,role_id
+                   	from md_team_relationship as mtr
+					left join md_team_member as mtm on mtm.team_id=mtr.team_id and mtm.member_id=? order by role_id desc )as t group by t.role_id,t.team_member_id,t.book_id) as team
+					on team.book_id = book.book_id
+WHERE (book.privately_owned = 0 OR rel1.relationship_id > 0 or team.team_member_id > 0)  AND (book.book_name LIKE ? OR book.description LIKE ?);`
+
+		err = o.Raw(sql4,memberId, memberId,keyword, keyword).QueryRow(&c)
+		if err != nil {
+			beego.Error("查询搜索结果失败 -> ",err)
+			return
+		}
+
+		totalCount += c
+
+		_, err = o.Raw(sql2, memberId, memberId, keyword, keyword,memberId,memberId,keyword, keyword,memberId,keyword, keyword,offset, pageSize).QueryRows(&searchResult)
 		if err != nil {
 		if err != nil {
 			return
 			return
 		}
 		}
@@ -194,13 +270,13 @@ LIMIT ?, ?;`
 }
 }
 
 
 //项目内搜索.
 //项目内搜索.
-func (m *DocumentSearchResult) SearchDocument(keyword string, book_id int) (docs []*DocumentSearchResult, err error) {
+func (m *DocumentSearchResult) SearchDocument(keyword string, bookId int) (docs []*DocumentSearchResult, err error) {
 	o := orm.NewOrm()
 	o := orm.NewOrm()
 
 
 	sql := "SELECT * FROM md_documents WHERE book_id = ? AND (document_name LIKE ? OR `release` LIKE ?) "
 	sql := "SELECT * FROM md_documents WHERE book_id = ? AND (document_name LIKE ? OR `release` LIKE ?) "
 	keyword = "%" + keyword + "%"
 	keyword = "%" + keyword + "%"
 
 
-	_, err = o.Raw(sql, book_id, keyword, keyword).QueryRows(&docs)
+	_, err = o.Raw(sql, bookId, keyword, keyword).QueryRows(&docs)
 
 
 	return
 	return
 }
 }

+ 0 - 1
routers/router.go

@@ -88,7 +88,6 @@ func init() {
 	beego.Router("/book/setting/open", &controllers.BookController{}, "post:PrivatelyOwned")
 	beego.Router("/book/setting/open", &controllers.BookController{}, "post:PrivatelyOwned")
 	beego.Router("/book/setting/transfer", &controllers.BookController{}, "post:Transfer")
 	beego.Router("/book/setting/transfer", &controllers.BookController{}, "post:Transfer")
 	beego.Router("/book/setting/upload", &controllers.BookController{}, "post:UploadCover")
 	beego.Router("/book/setting/upload", &controllers.BookController{}, "post:UploadCover")
-	beego.Router("/book/setting/token", &controllers.BookController{}, "post:CreateToken")
 	beego.Router("/book/setting/delete", &controllers.BookController{}, "post:Delete")
 	beego.Router("/book/setting/delete", &controllers.BookController{}, "post:Delete")
 
 
 	beego.Router("/book/team/add", &controllers.BookController{}, "POST:TeamAdd")
 	beego.Router("/book/team/add", &controllers.BookController{}, "POST:TeamAdd")

+ 13 - 0
static/css/main.css

@@ -441,6 +441,19 @@ textarea{
     font-size: 16px;
     font-size: 16px;
     font-weight: 400;
     font-weight: 400;
 }
 }
+.manual-search-reader .search-item .title .label{
+    color: #fff;
+    padding-top: .3em;
+}
+.manual-search-reader .search-item .title .mark-book{
+    background-color: #009a61;
+}
+.manual-search-reader .search-item .title .mark-blog{
+    background-color: #0084FF;
+}
+.manual-search-reader .search-item .title .mark-doc{
+    background-color: #337ab7;
+}
 .manual-search-reader .search-item .description{
 .manual-search-reader .search-item .description{
     color: #666;
     color: #666;
     line-height: 25px;
     line-height: 25px;

+ 0 - 17
views/book/setting.tpl

@@ -82,11 +82,6 @@
                                 <textarea rows="3" class="form-control" name="description" style="height: 90px" placeholder="项目描述">{{.Model.Description}}</textarea>
                                 <textarea rows="3" class="form-control" name="description" style="height: 90px" placeholder="项目描述">{{.Model.Description}}</textarea>
                                 <p class="text">描述信息不超过500个字符,支持Markdown语法</p>
                                 <p class="text">描述信息不超过500个字符,支持Markdown语法</p>
                             </div>
                             </div>
-                            <div class="form-group">
-                                <label>标签</label>
-                                <input type="text" class="form-control" name="label" placeholder="项目标签" value="{{.Model.Label}}">
-                                <p class="text">最多允许添加10个标签,多个标签请用“,”分割</p>
-                            </div>
                             <div class="form-group">
                             <div class="form-group">
                                 <label>编辑器</label>
                                 <label>编辑器</label>
                                 <div class="radio">
                                 <div class="radio">
@@ -99,18 +94,6 @@
                                 </div>
                                 </div>
                             </div>
                             </div>
                 {{if eq .Model.PrivatelyOwned 1}}
                 {{if eq .Model.PrivatelyOwned 1}}
-                <div class="form-group">
-                    <label>访问令牌</label>
-                    <div class="row">
-                        <div class="col-sm-10">
-                            <input type="text" name="token" id="token" class="form-control" placeholder="访问令牌" readonly value="{{.Model.PrivateToken}}">
-                        </div>
-                        <div class="col-sm-2">
-                            <button type="button" class="btn btn-success btn-sm" id="createToken" data-loading-text="生成" data-action="create">生成</button>
-                            <button type="button" class="btn btn-danger btn-sm" id="deleteToken" data-loading-text="删除" data-action="delete">删除</button>
-                        </div>
-                    </div>
-                </div>
                 <div class="form-group">
                 <div class="form-group">
                     <label>访问密码</label>
                     <label>访问密码</label>
                     <input type="text" name="bPassword" id="bPassword" class="form-control" placeholder="访问密码" value="{{.Model.BookPassword}}">
                     <input type="text" name="bPassword" id="bPassword" class="form-control" placeholder="访问密码" value="{{.Model.BookPassword}}">

+ 9 - 2
views/search/index.tpl

@@ -27,9 +27,14 @@
                 <div class="search-item">
                 <div class="search-item">
                     <div class="title">
                     <div class="title">
                 {{if eq $item.SearchType "document"}}
                 {{if eq $item.SearchType "document"}}
+                    <span class="label mark-doc">文档</span>
                         <a href="{{urlfor "DocumentController.Read" ":key" $item.BookIdentify ":id" $item.Identify}}" title="{{$item.DocumentName}}" target="_blank">{{str2html $item.DocumentName}}</a>
                         <a href="{{urlfor "DocumentController.Read" ":key" $item.BookIdentify ":id" $item.Identify}}" title="{{$item.DocumentName}}" target="_blank">{{str2html $item.DocumentName}}</a>
-                 {{else}}
-                        <a href="{{urlfor "BlogController.Index" ":id" $item.DocumentId}}" title="{{$item.DocumentName}}" target="_blank">{{str2html $item.DocumentName}}</a>
+                 {{else if eq $item.SearchType "book"}}
+                    <span class="label mark-book">项目</span>
+                    <a href="{{urlfor "DocumentController.Index" ":key" $item.Identify}}" title="{{$item.BookName}}" target="_blank"> {{str2html $item.DocumentName}}</a>
+                {{else}}
+                    <span class="label mark-blog">文章</span>
+                        <a href="{{urlfor "BlogController.Index" ":id" $item.DocumentId}}" title="{{$item.DocumentName}}" target="_blank"> {{str2html $item.DocumentName}}</a>
                 {{end}}
                 {{end}}
                     </div>
                     </div>
                     <div class="description">
                     <div class="description">
@@ -38,6 +43,8 @@
                     <div class="source">
                     <div class="source">
                         {{if eq $item.SearchType "document"}}
                         {{if eq $item.SearchType "document"}}
                         <span class="item">来自项目:<a href="{{urlfor "DocumentController.Index" ":key" $item.BookIdentify}}" target="_blank">{{$item.BookName}}</a></span>
                         <span class="item">来自项目:<a href="{{urlfor "DocumentController.Index" ":key" $item.BookIdentify}}" target="_blank">{{$item.BookName}}</a></span>
+                        {{else if eq $item.SearchType "book"}}
+                            <span class="item">项目:<a href="{{urlfor "DocumentController.Index" ":key" $item.Identify}}" target="_blank">{{$item.BookName}}</a></span>
                         {{else}}
                         {{else}}
                         <span class="item">来自文章:<a href="{{urlfor "BlogController.Index" ":id" $item.DocumentId}}" target="_blank">{{$item.BookName}}</a></span>
                         <span class="item">来自文章:<a href="{{urlfor "BlogController.Index" ":id" $item.DocumentId}}" target="_blank">{{$item.BookName}}</a></span>
                         {{end}}
                         {{end}}