From 8d92550458e7ccfa2ecb41975354fdb8215d628b Mon Sep 17 00:00:00 2001
From: gsw945 <gsw945@foxmail.com>
Date: Wed, 18 May 2022 11:17:03 +0800
Subject: [PATCH] fix error `mindoc:runtime error: invalid memory address or
 nil pointer dereference`

---
 controllers/DocumentController.go | 34 +++++++++++++++++--------------
 go.mod                            | 23 ---------------------
 go.sum                            |  1 +
 models/CommentModel.go            | 20 ++++++++++--------
 static/js/kancloud.js             |  3 +++
 views/document/default_read.tpl   |  4 +++-
 6 files changed, 38 insertions(+), 47 deletions(-)

diff --git a/controllers/DocumentController.go b/controllers/DocumentController.go
index 13bc4b0e..c9e341a0 100644
--- a/controllers/DocumentController.go
+++ b/controllers/DocumentController.go
@@ -68,10 +68,12 @@ func (c *DocumentController) Index() {
 
 			c.Data["Description"] = utils.AutoSummary(doc.Release, 120)
 
-			// 获取评论、分页
-			comments, count, _ := models.NewComment().QueryCommentByDocumentId(doc.DocumentId, 1, conf.PageSize, c.Member)
-			page := pagination.PageUtil(int(count), 1, conf.PageSize, comments)
-			c.Data["Page"] = page
+			if bookResult.IsDisplayComment {
+				// 获取评论、分页
+				comments, count, _ := models.NewComment().QueryCommentByDocumentId(doc.DocumentId, 1, conf.PageSize, c.Member)
+				page := pagination.PageUtil(int(count), 1, conf.PageSize, comments)
+				c.Data["Page"] = page
+			}
 		}
 	} else {
 		c.Data["Title"] = i18n.Tr(c.Lang, "blog.summary")
@@ -154,13 +156,13 @@ func (c *DocumentController) Read() {
 
 	if c.IsAjax() {
 		var data struct {
-			DocId  int `json:"doc_id"`
-			DocIdentify  string `json:"doc_identify"`
-			DocTitle  string `json:"doc_title"`
-			Body      string `json:"body"`
-			Title     string `json:"title"`
-			Version   int64  `json:"version"`
-			ViewCount int    `json:"view_count"`
+			DocId       int    `json:"doc_id"`
+			DocIdentify string `json:"doc_identify"`
+			DocTitle    string `json:"doc_title"`
+			Body        string `json:"body"`
+			Title       string `json:"title"`
+			Version     int64  `json:"version"`
+			ViewCount   int    `json:"view_count"`
 		}
 		data.DocId = doc.DocumentId
 		data.DocIdentify = doc.Identify
@@ -174,10 +176,12 @@ func (c *DocumentController) Read() {
 	} else {
 		c.Data["DocumentId"] = doc.DocumentId
 		c.Data["DocIdentify"] = doc.Identify
-		// 获取评论、分页
-		comments, count, _ := models.NewComment().QueryCommentByDocumentId(doc.DocumentId, 1, conf.PageSize, c.Member)
-		page := pagination.PageUtil(int(count), 1, conf.PageSize, comments)
-		c.Data["Page"] = page
+		if bookResult.IsDisplayComment {
+			// 获取评论、分页
+			comments, count, _ := models.NewComment().QueryCommentByDocumentId(doc.DocumentId, 1, conf.PageSize, c.Member)
+			page := pagination.PageUtil(int(count), 1, conf.PageSize, comments)
+			c.Data["Page"] = page
+		}
 	}
 
 	tree, err := models.NewDocument().CreateDocumentTreeForHtml(bookResult.BookId, doc.DocumentId)
diff --git a/go.mod b/go.mod
index c6833120..3418db85 100644
--- a/go.mod
+++ b/go.mod
@@ -20,32 +20,9 @@ require (
 require (
 	github.com/Unknwon/goconfig v0.0.0-20200908083735-df7de6a44db8 // indirect
 	github.com/andybalholm/cascadia v1.2.0 // indirect
-	github.com/beorn7/perks v1.0.1 // indirect
 	github.com/bradfitz/gomemcache v0.0.0-20190913173617-a41fca850d0b // indirect
-	github.com/cespare/xxhash/v2 v2.1.1 // indirect
-	github.com/go-redis/redis/v7 v7.4.0 // indirect
-	github.com/go-sql-driver/mysql v1.5.0 // indirect
-	github.com/golang/freetype v0.0.0-20170609003504-e2365dfdc4a0 // indirect
-	github.com/golang/protobuf v1.4.2 // indirect
-	github.com/gomodule/redigo v2.0.0+incompatible // indirect
-	github.com/hashicorp/golang-lru v0.5.4 // indirect
 	github.com/lib/pq v1.7.0 // indirect
-	github.com/matttproud/golang_protobuf_extensions v1.0.1 // indirect
-	github.com/mitchellh/mapstructure v1.3.3 // indirect
-	github.com/pkg/errors v0.9.1 // indirect
-	github.com/prometheus/client_golang v1.7.0 // indirect
-	github.com/prometheus/client_model v0.2.0 // indirect
-	github.com/prometheus/common v0.10.0 // indirect
-	github.com/prometheus/procfs v0.1.3 // indirect
-	github.com/rivo/uniseg v0.2.0 // indirect
-	github.com/shiena/ansicolor v0.0.0-20151119151921-a422bbe96644 // indirect
 	github.com/smartystreets/goconvey v1.6.4 // indirect
-	golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9 // indirect
-	golang.org/x/image v0.0.0-20190227222117-0694c2d4d067 // indirect
-	golang.org/x/net v0.0.0-20201021035429-f5854403a974 // indirect
-	golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f // indirect
-	golang.org/x/text v0.3.3 // indirect
-	google.golang.org/protobuf v1.23.0 // indirect
 	gopkg.in/asn1-ber.v1 v1.0.0-00010101000000-000000000000 // indirect
 	gopkg.in/yaml.v2 v2.3.0 // indirect
 )
diff --git a/go.sum b/go.sum
index 25c3c5b0..3eca6695 100644
--- a/go.sum
+++ b/go.sum
@@ -59,6 +59,7 @@ github.com/go-kit/kit v0.8.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2
 github.com/go-kit/kit v0.9.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as=
 github.com/go-logfmt/logfmt v0.3.0/go.mod h1:Qt1PoO58o5twSAckw1HlFXLmHsOX5/0LbT9GBnD5lWE=
 github.com/go-logfmt/logfmt v0.4.0/go.mod h1:3RMwSq7FuexP4Kalkev3ejPJsZTpXXBr9+V4qmtdjCk=
+github.com/go-redis/redis v6.14.2+incompatible h1:UE9pLhzmWf+xHNmZsoccjXosPicuiNaInPgym8nzfg0=
 github.com/go-redis/redis v6.14.2+incompatible/go.mod h1:NAIEuMOZ/fxfXJIrKDQDz8wamY7mA7PouImQ2Jvg6kA=
 github.com/go-redis/redis/v7 v7.4.0 h1:7obg6wUoj05T0EpY0o8B59S9w5yeMWql7sw2kwNW1x4=
 github.com/go-redis/redis/v7 v7.4.0/go.mod h1:JDNMw23GTyLNC4GZu9njt15ctBQVn7xjRfnwdHj/Dcg=
diff --git a/models/CommentModel.go b/models/CommentModel.go
index 37b65f0a..1ada1c09 100644
--- a/models/CommentModel.go
+++ b/models/CommentModel.go
@@ -61,7 +61,7 @@ func (m *Comment) CanDelete(user_memberid int, user_bookrole conf.BookRole) bool
 }
 
 // 根据文档id查询文档评论
-func (m *Comment) QueryCommentByDocumentId(doc_id, page, pagesize int, member *Member) (comments []Comment, count int64, ret_page int) {
+func (m *Comment) QueryCommentByDocumentId(doc_id, page, pagesize int, member *Member) (comments []*Comment, count int64, ret_page int) {
 	doc, err := NewDocument().Find(doc_id)
 	if err != nil {
 		return
@@ -69,22 +69,26 @@ func (m *Comment) QueryCommentByDocumentId(doc_id, page, pagesize int, member *M
 
 	o := orm.NewOrm()
 	count, _ = o.QueryTable(m.TableNameWithPrefix()).Filter("document_id", doc_id).Count()
-	if -1 == page {     // 请求最后一页
+	if -1 == page { // 请求最后一页
 		var total int = int(count)
-		if total % pagesize == 0 {
+		if total%pagesize == 0 {
 			page = total / pagesize
 		} else {
-			page = total / pagesize + 1
+			page = total/pagesize + 1
 		}
 	}
 	offset := (page - 1) * pagesize
 	ret_page = page
 	o.QueryTable(m.TableNameWithPrefix()).Filter("document_id", doc_id).OrderBy("comment_date").Offset(offset).Limit(pagesize).All(&comments)
 
-	bookRole, _ := NewRelationship().FindForRoleId(doc.BookId, member.MemberId)
+	// 需要判断未登录的情况
+	var bookRole conf.BookRole
+	if member != nil {
+		bookRole, _ = NewRelationship().FindForRoleId(doc.BookId, member.MemberId)
+	}
 	for i := 0; i < len(comments); i++ {
-		comments[i].Index = (i + 1) + (page - 1) * pagesize
-		if comments[i].CanDelete(member.MemberId, bookRole) {
+		comments[i].Index = (i + 1) + (page-1)*pagesize
+		if member != nil && comments[i].CanDelete(member.MemberId, bookRole) {
 			comments[i].ShowDel = 1
 		}
 	}
@@ -178,4 +182,4 @@ func (m *Comment) Find(id int, cols ...string) (*Comment, error) {
 		return m, err
 	}
 	return m, nil
-}
\ No newline at end of file
+}
diff --git a/static/js/kancloud.js b/static/js/kancloud.js
index df7ba3de..75a60799 100644
--- a/static/js/kancloud.js
+++ b/static/js/kancloud.js
@@ -60,6 +60,9 @@ function timeFormat($time) {
 
 // 点击翻页
 function pageClicked($page, $docid) {
+    if (!window.IS_DISPLAY_COMMENT) {
+        return;
+    }
     $("#articleComment").removeClass('not-show-comment');
     $.ajax({
         url : "/comment/lists?page=" + $page + "&docid=" + $docid,
diff --git a/views/document/default_read.tpl b/views/document/default_read.tpl
index 5e6ec3d0..3f85a3de 100644
--- a/views/document/default_read.tpl
+++ b/views/document/default_read.tpl
@@ -32,6 +32,7 @@
         window.IS_ENABLE_IFRAME = '{{conf "enable_iframe" }}' === 'true';
         window.BASE_URL = '{{urlfor "HomeController.Index" }}';
         window.IS_DOCUMENT_INDEX = '{{if .IS_DOCUMENT_INDEX}}true{{end}}' === 'true';
+        window.IS_DISPLAY_COMMENT = '{{if .Model.IsDisplayComment}}true{{end}}' === 'true';
     </script>
     <script type="text/javascript">window.book={"identify":"{{.Model.Identify}}"};</script>
     <style>
@@ -349,7 +350,8 @@ $(function () {
             window.jsTree.jstree().open_all()
         }
     });
-    if (!window.IS_DOCUMENT_INDEX) {
+
+    if (!window.IS_DOCUMENT_INDEX && IS_DISPLAY_COMMENT) {
         pageClicked(-1, parseInt($('#doc_id').val()));
     }
 });