From 7b3e4f0672991a3a14dee4dc8b982e6fb546f24c Mon Sep 17 00:00:00 2001 From: lifei6671 Date: Wed, 14 Nov 2018 15:57:55 +0800 Subject: [PATCH] =?UTF-8?q?feat:=E5=AE=9E=E7=8E=B0=E9=A1=B9=E7=9B=AE?= =?UTF-8?q?=E5=AF=86=E7=A0=81=E8=AE=BF=E9=97=AE=E5=8A=9F=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- controllers/AccountController.go | 54 +++++------ controllers/BaseController.go | 5 + controllers/BookController.go | 8 +- controllers/DocumentController.go | 125 +++++++------------------ models/BookModel.go | 4 +- models/BookResult.go | 7 +- views/book/edit.tpl | 0 views/book/setting.tpl | 7 +- views/book/team.tpl | 12 +-- views/document/default_read.tpl | 6 +- views/document/document_password.tpl | 135 +++++++++++++++++++++++++++ 11 files changed, 228 insertions(+), 135 deletions(-) delete mode 100644 views/book/edit.tpl create mode 100644 views/document/document_password.tpl diff --git a/controllers/AccountController.go b/controllers/AccountController.go index 0e099a78..b22d0962 100644 --- a/controllers/AccountController.go +++ b/controllers/AccountController.go @@ -221,7 +221,7 @@ func (c *AccountController) Register() { // 找回密码 func (c *AccountController) FindPassword() { c.TplName = "account/find_password_setp1.tpl" - mail_conf := conf.GetMailConfig() + mailConf := conf.GetMailConfig() if c.Ctx.Input.IsPost() { @@ -231,7 +231,7 @@ func (c *AccountController) FindPassword() { if email == "" { c.JsonResult(6005, "邮箱地址不能为空") } - if !mail_conf.EnableMail { + if !mailConf.EnableMail { c.JsonResult(6004, "未启用邮件服务") } @@ -260,23 +260,23 @@ func (c *AccountController) FindPassword() { beego.Error(err) c.JsonResult(6008, "发送邮件失败") } - if count > mail_conf.MailNumber { + if count > mailConf.MailNumber { c.JsonResult(6008, "发送次数太多,请稍候再试") } - member_token := models.NewMemberToken() + memberToken := models.NewMemberToken() - member_token.Token = string(utils.Krand(32, utils.KC_RAND_KIND_ALL)) - member_token.Email = email - member_token.MemberId = member.MemberId - member_token.IsValid = false - if _, err := member_token.InsertOrUpdate(); err != nil { + memberToken.Token = string(utils.Krand(32, utils.KC_RAND_KIND_ALL)) + memberToken.Email = email + memberToken.MemberId = member.MemberId + memberToken.IsValid = false + if _, err := memberToken.InsertOrUpdate(); err != nil { c.JsonResult(6009, "邮件发送失败") } data := map[string]interface{}{ "SITE_NAME": c.Option["SITE_NAME"], - "url": conf.URLFor("AccountController.FindPassword", "token", member_token.Token, "mail", email), + "url": conf.URLFor("AccountController.FindPassword", "token", memberToken.Token, "mail", email), "BaseUrl": c.BaseUrl(), } @@ -332,16 +332,16 @@ func (c *AccountController) FindPassword() { //if err != nil { // beego.Error("邮件发送失败 => ", email, err) //} - }(mail_conf, email, body) + }(mailConf, email, body) c.JsonResult(0, "ok", conf.URLFor("AccountController.Login")) } token := c.GetString("token") - mail := c.GetString("mail") + email := c.GetString("mail") - if token != "" && mail != "" { - member_token, err := models.NewMemberToken().FindByFieldFirst("token", token) + if token != "" && email != "" { + memberToken, err := models.NewMemberToken().FindByFieldFirst("token", token) if err != nil { beego.Error(err) @@ -349,15 +349,15 @@ func (c *AccountController) FindPassword() { c.TplName = "errors/error.tpl" return } - sub_time := member_token.SendTime.Sub(time.Now()) + subTime := memberToken.SendTime.Sub(time.Now()) - if !strings.EqualFold(member_token.Email, mail) || sub_time.Minutes() > float64(mail_conf.MailExpired) || !member_token.ValidTime.IsZero() { + if !strings.EqualFold(memberToken.Email, email) || subTime.Minutes() > float64(mailConf.MailExpired) || !memberToken.ValidTime.IsZero() { c.Data["ErrorMessage"] = "验证码已过期,请重新操作。" c.TplName = "errors/error.tpl" return } - c.Data["Email"] = member_token.Email - c.Data["Token"] = member_token.Token + c.Data["Email"] = memberToken.Email + c.Data["Token"] = memberToken.Token c.TplName = "account/find_password_setp2.tpl" } @@ -370,7 +370,7 @@ func (c *AccountController) ValidEmail() { password2 := c.GetString("password2") captcha := c.GetString("code") token := c.GetString("token") - mail := c.GetString("mail") + email := c.GetString("mail") if password1 == "" { c.JsonResult(6001, "密码不能为空") @@ -392,20 +392,20 @@ func (c *AccountController) ValidEmail() { c.JsonResult(6001, "验证码不正确") } - mail_conf := conf.GetMailConfig() - member_token, err := models.NewMemberToken().FindByFieldFirst("token", token) + mailConf := conf.GetMailConfig() + memberToken, err := models.NewMemberToken().FindByFieldFirst("token", token) if err != nil { beego.Error(err) c.JsonResult(6007, "邮件已失效") } - sub_time := member_token.SendTime.Sub(time.Now()) + subTime := memberToken.SendTime.Sub(time.Now()) - if !strings.EqualFold(member_token.Email, mail) || sub_time.Minutes() > float64(mail_conf.MailExpired) || !member_token.ValidTime.IsZero() { + if !strings.EqualFold(memberToken.Email, email) || subTime.Minutes() > float64(mailConf.MailExpired) || !memberToken.ValidTime.IsZero() { c.JsonResult(6008, "验证码已过期,请重新操作。") } - member, err := models.NewMember().Find(member_token.MemberId) + member, err := models.NewMember().Find(memberToken.MemberId) if err != nil { beego.Error(err) c.JsonResult(6005, "用户不存在") @@ -420,9 +420,9 @@ func (c *AccountController) ValidEmail() { member.Password = hash err = member.Update("password") - member_token.ValidTime = time.Now() - member_token.IsValid = true - member_token.InsertOrUpdate() + memberToken.ValidTime = time.Now() + memberToken.IsValid = true + memberToken.InsertOrUpdate() if err != nil { beego.Error(err) diff --git a/controllers/BaseController.go b/controllers/BaseController.go index 834c761c..b3d6a8d1 100644 --- a/controllers/BaseController.go +++ b/controllers/BaseController.go @@ -79,6 +79,10 @@ func (c *BaseController) Prepare() { } } +//判断用户是否登录. +func (c *BaseController)isUserLoggedIn() bool { + return c.Member != nil && c.Member.MemberId > 0 +} // SetMember 获取或设置当前登录用户信息,如果 MemberId 小于 0 则标识删除 Session func (c *BaseController) SetMember(member models.Member) { @@ -189,6 +193,7 @@ func (c *BaseController) ShowErrorPage(errCode int, errMsg string) { } } + func (c *BaseController) CheckErrorResult(code int,err error) { if err != nil { c.ShowErrorPage(code, err.Error()) diff --git a/controllers/BookController.go b/controllers/BookController.go index 69de0231..80be3d24 100644 --- a/controllers/BookController.go +++ b/controllers/BookController.go @@ -73,15 +73,12 @@ func (c *BookController) Dashboard() { if key == "" { c.Abort("404") } - if c.Member == nil { - c.ShowErrorPage(500,"aaaa") - } + book, err := models.NewBookResult().FindByIdentify(key, c.Member.MemberId) if err != nil { if err == models.ErrPermissionDenied { c.Abort("403") } - beego.Error(err) c.Abort("500") } @@ -172,6 +169,7 @@ func (c *BookController) SaveBook() { book.Editor = editor book.HistoryCount = historyCount book.IsDownload = 0 + book.BookPassword = c.GetString("bPassword") if autoRelease { book.AutoRelease = 1 @@ -282,7 +280,7 @@ func (c *BookController) Transfer() { err = models.NewRelationship().Transfer(bookResult.BookId, c.Member.MemberId, member.MemberId) if err != nil { - logs.Error("Transfer => ", err) + logs.Error("转让项目失败 -> ", err) c.JsonResult(6008, err.Error()) } c.JsonResult(0, "ok") diff --git a/controllers/DocumentController.go b/controllers/DocumentController.go index 1a88c324..cf461f1c 100644 --- a/controllers/DocumentController.go +++ b/controllers/DocumentController.go @@ -1,7 +1,6 @@ package controllers import ( - "container/list" "encoding/json" "html/template" "net/http" @@ -14,9 +13,6 @@ import ( "net/url" "image/png" "fmt" - "bytes" - - "github.com/PuerkitoBio/goquery" "github.com/astaxie/beego" "github.com/astaxie/beego/orm" "github.com/boombuler/barcode" @@ -49,12 +45,12 @@ func (c *DocumentController) Index() { } // 如果没有开启匿名访问则跳转到登录 - if !c.EnableAnonymous && !isUserLoggedIn(c) { + if !c.EnableAnonymous && !c.isUserLoggedIn() { promptUserToLogIn(c) return } - bookResult := isReadable(identify, token, c) + bookResult := c.isReadable(identify, token) c.TplName = "document/" + bookResult.Theme + "_read.tpl" @@ -104,12 +100,12 @@ func (c *DocumentController) Read() { } // 如果没有开启匿名访问则跳转到登录 - if !c.EnableAnonymous && !isUserLoggedIn(c) { + if !c.EnableAnonymous && !c.isUserLoggedIn() { promptUserToLogIn(c) return } - bookResult := isReadable(identify, token, c) + bookResult := c.isReadable(identify, token) c.TplName = fmt.Sprintf("document/%s_read.tpl", bookResult.Theme) @@ -246,7 +242,7 @@ func (c *DocumentController) Edit() { if conf.GetUploadFileSize() > 0 { c.Data["UploadFileSize"] = conf.GetUploadFileSize() - }else{ + } else { c.Data["UploadFileSize"] = "undefined"; } } @@ -815,7 +811,7 @@ func (c *DocumentController) Export() { token := c.GetString("token") // 如果没有开启匿名访问则跳转到登录 - if !c.EnableAnonymous && !isUserLoggedIn(c) { + if !c.EnableAnonymous && !c.isUserLoggedIn() { promptUserToLogIn(c) return } @@ -836,7 +832,7 @@ func (c *DocumentController) Export() { } bookResult = models.NewBookResult().ToBookResult(*book) } else { - bookResult = isReadable(identify, token, c) + bookResult = c.isReadable(identify, token) } if !bookResult.IsDownload { c.ShowErrorPage(200, "当前项目没有开启导出功能") @@ -944,12 +940,12 @@ func (c *DocumentController) Search() { c.JsonResult(6001, "参数错误") } - if !c.EnableAnonymous && !isUserLoggedIn(c) { + if !c.EnableAnonymous && !c.isUserLoggedIn() { promptUserToLogIn(c) return } - bookResult := isReadable(identify, token, c) + bookResult := c.isReadable(identify, token) docs, err := models.NewDocumentSearchResult().SearchDocument(keyword, bookResult.BookId) if err != nil { @@ -1220,64 +1216,8 @@ func (c *DocumentController) Compare() { } } -// 递归生成文档序列数组 -func RecursiveFun(parentId int, prefix, dpath string, c *DocumentController, book *models.BookResult, docs []*models.Document, paths *list.List) { - for _, item := range docs { - if item.ParentId == parentId { - EachFun(prefix, dpath, c, book, item, paths) - - for _, sub := range docs { - if sub.ParentId == item.DocumentId { - prefix += strconv.Itoa(item.ParentId) + strconv.Itoa(item.OrderSort) + strconv.Itoa(item.DocumentId) - RecursiveFun(item.DocumentId, prefix, dpath, c, book, docs, paths) - break - } - } - } - } -} - -func EachFun(prefix, dpath string, c *DocumentController, book *models.BookResult, item *models.Document, paths *list.List) { - name := prefix + strconv.Itoa(item.ParentId) + strconv.Itoa(item.OrderSort) + strconv.Itoa(item.DocumentId) - fpath := dpath + "/" + name + ".html" - paths.PushBack(fpath) - - f, err := os.OpenFile(fpath, os.O_CREATE|os.O_RDWR, 0777) - if err != nil { - beego.Error(err) - c.ShowErrorPage(500, "系统错误") - } - - html, err := c.ExecuteViewPathTemplate("document/export.tpl", map[string]interface{}{"Model": book, "Lists": item, "BaseUrl": c.BaseUrl()}) - if err != nil { - f.Close() - beego.Error(err) - c.ShowErrorPage(500, "系统错误") - } - - buf := bytes.NewReader([]byte(html)) - doc, err := goquery.NewDocumentFromReader(buf) - doc.Find("img").Each(func(i int, contentSelection *goquery.Selection) { - if src, ok := contentSelection.Attr("src"); ok && strings.HasPrefix(src, "/uploads/") { - contentSelection.SetAttr("src", c.BaseUrl()+src) - } - }) - - html, err = doc.Html() - if err != nil { - f.Close() - beego.Error(err) - c.ShowErrorPage(500, "系统错误") - } - - // html = strings.Replace(html, "", err) + } + c.CustomAbort(200, body) + } + } else { + c.ShowErrorPage(403, "权限不足") + } } } - //// 判断是否需要显示评论框 - //if bookResult.CommentStatus == "closed" { - // bookResult.IsDisplayComment = false - //} else if bookResult.CommentStatus == "open" { - // bookResult.IsDisplayComment = true - //} else if bookResult.CommentStatus == "group_only" { - // bookResult.IsDisplayComment = bookResult.RelationshipId > 0 - //} else if bookResult.CommentStatus == "registered_only" { - // bookResult.IsDisplayComment = true - //} - return bookResult } -func isUserLoggedIn(c *DocumentController) bool { - return c.Member != nil && c.Member.MemberId > 0 -} - func promptUserToLogIn(c *DocumentController) { beego.Info("Access " + c.Ctx.Request.URL.RequestURI() + " not permitted.") beego.Info(" Access will be redirected to login page(SessionId: " + c.CruSession.SessionID() + ").") diff --git a/models/BookModel.go b/models/BookModel.go index 5f96c43b..ffeb7b17 100644 --- a/models/BookModel.go +++ b/models/BookModel.go @@ -47,6 +47,8 @@ type Book struct { PrivatelyOwned int `orm:"column(privately_owned);type(int);default(0)" json:"privately_owned"` // 当项目是私有时的访问Token. PrivateToken string `orm:"column(private_token);size(500);null" json:"private_token"` + //访问密码. + BookPassword string `orm:"column(book_password);size(500);null" json:"book_password"` //状态:0 正常/1 已删除 Status int `orm:"column(status);type(int);default(0)" json:"status"` //默认的编辑器. @@ -919,7 +921,7 @@ where mtr.book_id = ? and mtm.member_id = ? order by mtm.role_id asc limit 1;` if err != nil { beego.Error("查询用户项目角色出错 -> book_id=", bookId, " member_id=", memberId, err) - return 0, nil + return 0, err } return conf.BookRole(roleId), nil } diff --git a/models/BookResult.go b/models/BookResult.go index 16ae940b..49976596 100644 --- a/models/BookResult.go +++ b/models/BookResult.go @@ -39,6 +39,7 @@ type BookResult struct { Publisher string `json:"publisher"` PrivatelyOwned int `json:"privately_owned"` PrivateToken string `json:"private_token"` + BookPassword string `json:"book_password"` DocCount int `json:"doc_count"` CommentStatus string `json:"comment_status"` CommentCount int `json:"comment_count"` @@ -93,11 +94,11 @@ func (m *BookResult) FindByIdentify(identify string, memberId int) (*BookResult, err := NewBook().QueryTable().Filter("identify", identify).One(&book) if err != nil { - beego.Error("获取项目失败 ->",err) + beego.Error("获取项目失败 ->", err) return m, err } - roleId,err := NewBook().FindForRoleId(book.BookId,memberId) + roleId, err := NewBook().FindForRoleId(book.BookId, memberId) if err != nil { return m, ErrPermissionDenied @@ -126,7 +127,6 @@ func (m *BookResult) FindByIdentify(identify string, memberId int) (*BookResult, m.RealName = member.RealName } - if m.RoleId == conf.BookFounder { m.RoleName = "创始人" } else if m.RoleId == conf.BookAdmin { @@ -185,6 +185,7 @@ func (m *BookResult) ToBookResult(book Book) *BookResult { m.Description = strings.Replace(book.Description, "\r\n", "
", -1) m.PrivatelyOwned = book.PrivatelyOwned m.PrivateToken = book.PrivateToken + m.BookPassword = book.BookPassword m.DocCount = book.DocCount m.CommentStatus = book.CommentStatus m.CommentCount = book.CommentCount diff --git a/views/book/edit.tpl b/views/book/edit.tpl deleted file mode 100644 index e69de29b..00000000 diff --git a/views/book/setting.tpl b/views/book/setting.tpl index 97910dfe..5d877305 100644 --- a/views/book/setting.tpl +++ b/views/book/setting.tpl @@ -26,7 +26,7 @@ @@ -124,6 +124,11 @@ +
+ + +

没有访问权限访问项目时需要提供的密码

+
{{end}}
diff --git a/views/book/team.tpl b/views/book/team.tpl index 346b8cd4..b40dfa00 100644 --- a/views/book/team.tpl +++ b/views/book/team.tpl @@ -27,15 +27,11 @@
diff --git a/views/document/default_read.tpl b/views/document/default_read.tpl index 87b3778d..3219cf8e 100644 --- a/views/document/default_read.tpl +++ b/views/document/default_read.tpl @@ -45,7 +45,11 @@ {{if gt .Member.MemberId 0}} {{if eq .Model.RoleId 0 1 2}} {{end}} {{end}} diff --git a/views/document/document_password.tpl b/views/document/document_password.tpl new file mode 100644 index 00000000..772220cd --- /dev/null +++ b/views/document/document_password.tpl @@ -0,0 +1,135 @@ + + + + + + + + + 请输入项目密码 - Powered by MinDoc + + + + + +
+
+
+
请输入阅读密码
+
+ +
+
+ + +
+
+
+
+
+ + + + + \ No newline at end of file