mirror of https://github.com/mindoc-org/mindoc.git
修改了退出登录后在已经打开的页面上切换文档时呈现的一直处于加载中的假象。
parent
9e2fbccc92
commit
15ad23a030
5
TODO
5
TODO
|
@ -1,6 +1,6 @@
|
|||
1、把 log 提取出 dbgout 之类的方法;
|
||||
1、把 log 提取出 dbgout 之类的方法;已改作 beego.Info() 调用;
|
||||
2、把源代码里的 TODO 完成;
|
||||
3、Export 的两个 URL 应该可以合并,用是否有 :id 来区分;这样 0 号文档输出整个 book 更顺;
|
||||
3、Export 的两个 URL 应该可以合并,用是否有 :id 来区分;这样 0 号文档输出整个 book 更顺;已完成;
|
||||
4、统一代码风格,空格、命名之类的;
|
||||
5、美化 PDF 的输出格式;
|
||||
6、自动登录新开标签页而且并不能跳转至起始请求页的问题;
|
||||
|
@ -8,4 +8,3 @@
|
|||
8、[自动]展示历史版本;增强历史版本对比显示的能力;
|
||||
9、[自动]展示作者信息;也许可以和上一需求合并考虑;
|
||||
10、查看了解评论功能;
|
||||
|
||||
|
|
|
@ -29,12 +29,12 @@ import (
|
|||
"github.com/russross/blackfriday"
|
||||
)
|
||||
|
||||
//DocumentController struct.
|
||||
// DocumentController struct
|
||||
type DocumentController struct {
|
||||
BaseController
|
||||
}
|
||||
|
||||
//判断用户是否可以阅读文档.
|
||||
// 判断用户是否可以阅读文档
|
||||
func isReadable(identify, token string, c *DocumentController) *models.BookResult {
|
||||
book, err := models.NewBook().FindByFieldFirst("identify", identify)
|
||||
|
||||
|
@ -45,7 +45,6 @@ func isReadable(identify, token string, c *DocumentController) *models.BookResul
|
|||
|
||||
// 如果文档是私有的
|
||||
if book.PrivatelyOwned == 1 && !c.Member.IsAdministrator() {
|
||||
|
||||
is_ok := false
|
||||
|
||||
if c.Member != nil {
|
||||
|
@ -54,25 +53,24 @@ func isReadable(identify, token string, c *DocumentController) *models.BookResul
|
|||
is_ok = true
|
||||
}
|
||||
}
|
||||
|
||||
if book.PrivateToken != "" && !is_ok {
|
||||
//如果有访问的Token,并且该项目设置了访问Token,并且和用户提供的相匹配,则记录到Session中.
|
||||
//如果用户未提供Token且用户登录了,则判断用户是否参与了该项目.
|
||||
//如果用户未登录,则从Session中读取Token.
|
||||
// 如果有访问的 Token,并且该项目设置了访问 Token,并且和用户提供的相匹配,则记录到 Session 中。
|
||||
// 如果用户未提供 Token 且用户登录了,则判断用户是否参与了该项目。
|
||||
// 如果用户未登录,则从 Session 中读取 Token。
|
||||
if token != "" && strings.EqualFold(token, book.PrivateToken) {
|
||||
c.SetSession(identify, token)
|
||||
|
||||
} else if token, ok := c.GetSession(identify).(string); !ok || !strings.EqualFold(token, book.PrivateToken) {
|
||||
c.Abort("403")
|
||||
}
|
||||
} else if !is_ok {
|
||||
c.Abort("403")
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
bookResult := book.ToBookResult()
|
||||
|
||||
if c.Member != nil {
|
||||
|
||||
rel, err := models.NewRelationship().FindByBookIdAndMemberId(bookResult.BookId, c.Member.MemberId)
|
||||
|
||||
if err == nil {
|
||||
|
@ -80,8 +78,8 @@ func isReadable(identify, token string, c *DocumentController) *models.BookResul
|
|||
bookResult.RoleId = rel.RoleId
|
||||
bookResult.RelationshipId = rel.RelationshipId
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
// 判断是否需要显示评论框
|
||||
if bookResult.CommentStatus == "closed" {
|
||||
bookResult.IsDisplayComment = false
|
||||
|
@ -96,20 +94,35 @@ func isReadable(identify, token string, c *DocumentController) *models.BookResul
|
|||
return bookResult
|
||||
}
|
||||
|
||||
//文档首页.
|
||||
func isUserLoggedIn(c *DocumentController) bool {
|
||||
return c.Member != nil && c.Member.MemberId > 0
|
||||
}
|
||||
|
||||
func promptUserToLogIn(c *DocumentController) {
|
||||
if c.IsAjax() {
|
||||
c.JsonResult(6000, "需要[重]登录。")
|
||||
} else {
|
||||
c.Redirect(beego.URLFor("AccountController.Login"), 302)
|
||||
}
|
||||
}
|
||||
|
||||
// 文档首页
|
||||
func (c *DocumentController) Index() {
|
||||
c.Prepare()
|
||||
|
||||
identify := c.Ctx.Input.Param(":key")
|
||||
token := c.GetString("token")
|
||||
|
||||
if identify == "" {
|
||||
c.Abort("404")
|
||||
}
|
||||
//如果没有开启你们访问则跳转到登录
|
||||
if !c.EnableAnonymous && c.Member == nil {
|
||||
c.Redirect(beego.URLFor("AccountController.Login"), 302)
|
||||
|
||||
// 如果没有开启匿名访问则跳转到登录
|
||||
if !c.EnableAnonymous && !isUserLoggedIn(c) {
|
||||
promptUserToLogIn(c)
|
||||
return
|
||||
}
|
||||
|
||||
bookResult := isReadable(identify, token, c)
|
||||
|
||||
c.TplName = "document/" + bookResult.Theme + "_read.tpl"
|
||||
|
@ -131,9 +144,10 @@ func (c *DocumentController) Index() {
|
|||
beego.Info("DocumentController.Index(): c.Data[\"DocumentId\"] = ", 0)
|
||||
}
|
||||
|
||||
//阅读文档.
|
||||
// 阅读文档
|
||||
func (c *DocumentController) Read() {
|
||||
c.Prepare()
|
||||
|
||||
identify := c.Ctx.Input.Param(":key")
|
||||
token := c.GetString("token")
|
||||
id := c.GetString(":id")
|
||||
|
@ -145,9 +159,9 @@ func (c *DocumentController) Read() {
|
|||
c.Abort("404")
|
||||
}
|
||||
|
||||
//如果没有开启你们访问则跳转到登录
|
||||
if !c.EnableAnonymous && c.Member == nil {
|
||||
c.Redirect(beego.URLFor("AccountController.Login"), 302)
|
||||
// 如果没有开启匿名访问则跳转到登录
|
||||
if !c.EnableAnonymous && !isUserLoggedIn(c) {
|
||||
promptUserToLogIn(c)
|
||||
return
|
||||
}
|
||||
|
||||
|
@ -174,6 +188,7 @@ func (c *DocumentController) Read() {
|
|||
if doc.BookId != bookResult.BookId {
|
||||
c.Abort("403")
|
||||
}
|
||||
|
||||
attach, err := models.NewAttachment().FindListByDocumentId(doc.DocumentId)
|
||||
if err == nil {
|
||||
doc.AttachList = attach
|
||||
|
@ -190,6 +205,7 @@ func (c *DocumentController) Read() {
|
|||
contentSelection.SetAttr("src", utils.JoinURI(cdnimg, src))
|
||||
}
|
||||
})
|
||||
|
||||
html, err := query.Html()
|
||||
if err != nil {
|
||||
beego.Error(err)
|
||||
|
@ -197,7 +213,6 @@ func (c *DocumentController) Read() {
|
|||
doc.Release = html
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
// assemble doc info, added by dandycheung, 2017-12-20
|
||||
|
@ -244,7 +259,7 @@ func (c *DocumentController) Read() {
|
|||
c.Data["Content"] = template.HTML(doc.Release)
|
||||
}
|
||||
|
||||
//编辑文档.
|
||||
// 编辑文档
|
||||
func (c *DocumentController) Edit() {
|
||||
c.Prepare()
|
||||
|
||||
|
@ -254,6 +269,7 @@ func (c *DocumentController) Edit() {
|
|||
}
|
||||
|
||||
bookResult := models.NewBookResult()
|
||||
|
||||
var err error
|
||||
// 如果是超级管理者,则不判断权限
|
||||
if c.Member.IsAdministrator() {
|
||||
|
@ -261,18 +277,17 @@ func (c *DocumentController) Edit() {
|
|||
if err != nil {
|
||||
c.JsonResult(6002, "项目不存在或权限不足")
|
||||
}
|
||||
bookResult = book.ToBookResult()
|
||||
|
||||
bookResult = book.ToBookResult()
|
||||
} else {
|
||||
bookResult, err = models.NewBookResult().FindByIdentify(identify, c.Member.MemberId)
|
||||
|
||||
if err != nil {
|
||||
beego.Error("DocumentController.Edit => ", err)
|
||||
|
||||
c.Abort("403")
|
||||
}
|
||||
if bookResult.RoleId == conf.BookObserver {
|
||||
|
||||
if bookResult.RoleId == conf.BookObserver {
|
||||
c.JsonResult(6002, "项目不存在或权限不足")
|
||||
}
|
||||
}
|
||||
|
@ -307,11 +322,11 @@ func (c *DocumentController) Edit() {
|
|||
c.Data["Result"] = template.JS("[]")
|
||||
}
|
||||
}
|
||||
c.Data["BaiDuMapKey"] = beego.AppConfig.DefaultString("baidumapkey", "")
|
||||
|
||||
c.Data["BaiDuMapKey"] = beego.AppConfig.DefaultString("baidumapkey", "")
|
||||
}
|
||||
|
||||
//创建一个文档.
|
||||
// 创建一个文档
|
||||
func (c *DocumentController) Create() {
|
||||
identify := c.GetString("identify")
|
||||
doc_identify := c.GetString("doc_identify")
|
||||
|
@ -322,20 +337,24 @@ func (c *DocumentController) Create() {
|
|||
if identify == "" {
|
||||
c.JsonResult(6001, "参数错误")
|
||||
}
|
||||
|
||||
if doc_name == "" {
|
||||
c.JsonResult(6004, "文档名称不能为空")
|
||||
}
|
||||
|
||||
if doc_identify != "" {
|
||||
if ok, err := regexp.MatchString(`^[a-z]+[a-zA-Z0-9_\-]*$`, doc_identify); !ok || err != nil {
|
||||
|
||||
c.JsonResult(6003, "文档标识只能包含小写字母、数字,以及“-”和“_”符号,并且只能小写字母开头")
|
||||
}
|
||||
|
||||
d, _ := models.NewDocument().FindByFieldFirst("identify", doc_identify)
|
||||
if d.DocumentId > 0 && d.DocumentId != doc_id {
|
||||
c.JsonResult(6006, "文档标识已被使用")
|
||||
}
|
||||
}
|
||||
|
||||
book_id := 0
|
||||
|
||||
// 如果是超级管理员则不判断权限
|
||||
if c.Member.IsAdministrator() {
|
||||
book, err := models.NewBook().FindByFieldFirst("identify", identify)
|
||||
|
@ -343,6 +362,7 @@ func (c *DocumentController) Create() {
|
|||
beego.Error(err)
|
||||
c.JsonResult(6002, "项目不存在或权限不足")
|
||||
}
|
||||
|
||||
book_id = book.BookId
|
||||
} else {
|
||||
bookResult, err := models.NewBookResult().FindByIdentify(identify, c.Member.MemberId)
|
||||
|
@ -351,8 +371,10 @@ func (c *DocumentController) Create() {
|
|||
beego.Error("FindByIdentify => ", err)
|
||||
c.JsonResult(6002, "项目不存在或权限不足")
|
||||
}
|
||||
|
||||
book_id = bookResult.BookId
|
||||
}
|
||||
|
||||
if parent_id > 0 {
|
||||
doc, err := models.NewDocument().Find(parent_id)
|
||||
if err != nil || doc.BookId != book_id {
|
||||
|
@ -364,9 +386,11 @@ func (c *DocumentController) Create() {
|
|||
|
||||
document.MemberId = c.Member.MemberId
|
||||
document.BookId = book_id
|
||||
|
||||
if doc_identify != "" {
|
||||
document.Identify = doc_identify
|
||||
}
|
||||
|
||||
document.Version = time.Now().Unix()
|
||||
document.DocumentName = doc_name
|
||||
document.ParentId = parent_id
|
||||
|
@ -375,14 +399,12 @@ func (c *DocumentController) Create() {
|
|||
beego.Error("InsertOrUpdate => ", err)
|
||||
c.JsonResult(6005, "保存失败")
|
||||
} else {
|
||||
|
||||
c.JsonResult(0, "ok", document)
|
||||
}
|
||||
}
|
||||
|
||||
//上传附件或图片.
|
||||
// 上传附件或图片
|
||||
func (c *DocumentController) Upload() {
|
||||
|
||||
identify := c.GetString("identify")
|
||||
doc_id, _ := c.GetInt("doc_id")
|
||||
is_attach := true
|
||||
|
@ -401,6 +423,7 @@ func (c *DocumentController) Upload() {
|
|||
c.JsonResult(6003, "没有发现需要上传的文件")
|
||||
}
|
||||
}
|
||||
|
||||
if err != nil {
|
||||
c.JsonResult(6002, err.Error())
|
||||
}
|
||||
|
@ -416,7 +439,9 @@ func (c *DocumentController) Upload() {
|
|||
if !conf.IsAllowUploadFileExt(ext) {
|
||||
c.JsonResult(6004, "不允许的文件类型")
|
||||
}
|
||||
|
||||
book_id := 0
|
||||
|
||||
// 如果是超级管理员,则不判断权限
|
||||
if c.Member.IsAdministrator() {
|
||||
book, err := models.NewBook().FindByFieldFirst("identify", identify)
|
||||
|
@ -424,8 +449,8 @@ func (c *DocumentController) Upload() {
|
|||
if err != nil {
|
||||
c.JsonResult(6006, "文档不存在或权限不足")
|
||||
}
|
||||
book_id = book.BookId
|
||||
|
||||
book_id = book.BookId
|
||||
} else {
|
||||
book, err := models.NewBookResult().FindByIdentify(identify, c.Member.MemberId)
|
||||
|
||||
|
@ -434,12 +459,15 @@ func (c *DocumentController) Upload() {
|
|||
if err == orm.ErrNoRows {
|
||||
c.JsonResult(6006, "权限不足")
|
||||
}
|
||||
|
||||
c.JsonResult(6001, err.Error())
|
||||
}
|
||||
|
||||
// 如果没有编辑权限
|
||||
if book.RoleId != conf.BookEditor && book.RoleId != conf.BookAdmin && book.RoleId != conf.BookFounder {
|
||||
c.JsonResult(6006, "权限不足")
|
||||
}
|
||||
|
||||
book_id = book.BookId
|
||||
}
|
||||
|
||||
|
@ -448,15 +476,14 @@ func (c *DocumentController) Upload() {
|
|||
if err != nil {
|
||||
c.JsonResult(6007, "文档不存在")
|
||||
}
|
||||
|
||||
if doc.BookId != book_id {
|
||||
c.JsonResult(6008, "文档不属于指定的项目")
|
||||
}
|
||||
}
|
||||
|
||||
fileName := "attach_" + strconv.FormatInt(time.Now().UnixNano(), 16)
|
||||
|
||||
filePath := filepath.Join(commands.WorkingDirectory, "uploads", time.Now().Format("200601"), fileName+ext)
|
||||
|
||||
path := filepath.Dir(filePath)
|
||||
|
||||
os.MkdirAll(path, os.ModePerm)
|
||||
|
@ -467,6 +494,7 @@ func (c *DocumentController) Upload() {
|
|||
beego.Error("SaveToFile => ", err)
|
||||
c.JsonResult(6005, "保存文件失败")
|
||||
}
|
||||
|
||||
attachment := models.NewAttachment()
|
||||
attachment.BookId = book_id
|
||||
attachment.FileName = moreFile.Filename
|
||||
|
@ -478,16 +506,17 @@ func (c *DocumentController) Upload() {
|
|||
if fileInfo, err := os.Stat(filePath); err == nil {
|
||||
attachment.FileSize = float64(fileInfo.Size())
|
||||
}
|
||||
|
||||
if doc_id > 0 {
|
||||
attachment.DocumentId = doc_id
|
||||
}
|
||||
|
||||
if strings.EqualFold(ext, ".jpg") || strings.EqualFold(ext, ".jpeg") || strings.EqualFold(ext, ".png") || strings.EqualFold(ext, ".gif") {
|
||||
|
||||
attachment.HttpPath = "/" + strings.Replace(strings.TrimPrefix(filePath, commands.WorkingDirectory), "\\", "/", -1)
|
||||
if strings.HasPrefix(attachment.HttpPath, "//") {
|
||||
attachment.HttpPath = string(attachment.HttpPath[1:])
|
||||
}
|
||||
|
||||
is_attach = false
|
||||
}
|
||||
|
||||
|
@ -498,6 +527,7 @@ func (c *DocumentController) Upload() {
|
|||
beego.Error("Attachment Insert => ", err)
|
||||
c.JsonResult(6006, "文件保存失败")
|
||||
}
|
||||
|
||||
if attachment.HttpPath == "" {
|
||||
attachment.HttpPath = beego.URLFor("DocumentController.DownloadAttachment", ":key", identify, ":attach_id", attachment.AttachmentId)
|
||||
|
||||
|
@ -516,11 +546,12 @@ func (c *DocumentController) Upload() {
|
|||
"is_attach": is_attach,
|
||||
"attach": attachment,
|
||||
}
|
||||
|
||||
c.Ctx.Output.JSON(result, true, false)
|
||||
c.StopRun()
|
||||
}
|
||||
|
||||
//DownloadAttachment 下载附件.
|
||||
// 下载附件
|
||||
func (c *DocumentController) DownloadAttachment() {
|
||||
c.Prepare()
|
||||
|
||||
|
@ -533,6 +564,7 @@ func (c *DocumentController) DownloadAttachment() {
|
|||
if c.Member != nil {
|
||||
member_id = c.Member.MemberId
|
||||
}
|
||||
|
||||
book_id := 0
|
||||
|
||||
// 判断用户是否参与了项目
|
||||
|
@ -544,6 +576,7 @@ func (c *DocumentController) DownloadAttachment() {
|
|||
if err != nil {
|
||||
c.Abort("404")
|
||||
}
|
||||
|
||||
// 如果不是超级管理员则判断权限
|
||||
if c.Member == nil || c.Member.Role != conf.MemberSuperRole {
|
||||
// 如果项目是私有的,并且 token 不正确
|
||||
|
@ -556,6 +589,7 @@ func (c *DocumentController) DownloadAttachment() {
|
|||
} else {
|
||||
book_id = bookResult.BookId
|
||||
}
|
||||
|
||||
// 查找附件
|
||||
attachment, err := models.NewAttachment().Find(attach_id)
|
||||
|
||||
|
@ -567,15 +601,16 @@ func (c *DocumentController) DownloadAttachment() {
|
|||
c.Abort("500")
|
||||
}
|
||||
}
|
||||
|
||||
if attachment.BookId != book_id {
|
||||
c.Abort("404")
|
||||
}
|
||||
c.Ctx.Output.Download(filepath.Join(commands.WorkingDirectory, attachment.FilePath), attachment.FileName)
|
||||
|
||||
c.Ctx.Output.Download(filepath.Join(commands.WorkingDirectory, attachment.FilePath), attachment.FileName)
|
||||
c.StopRun()
|
||||
}
|
||||
|
||||
//删除附件.
|
||||
// 删除附件
|
||||
func (c *DocumentController) RemoveAttachment() {
|
||||
c.Prepare()
|
||||
attach_id, _ := c.GetInt("attach_id")
|
||||
|
@ -583,40 +618,45 @@ func (c *DocumentController) RemoveAttachment() {
|
|||
if attach_id <= 0 {
|
||||
c.JsonResult(6001, "参数错误")
|
||||
}
|
||||
|
||||
attach, err := models.NewAttachment().Find(attach_id)
|
||||
|
||||
if err != nil {
|
||||
beego.Error(err)
|
||||
c.JsonResult(6002, "附件不存在")
|
||||
}
|
||||
|
||||
document, err := models.NewDocument().Find(attach.DocumentId)
|
||||
|
||||
if err != nil {
|
||||
beego.Error(err)
|
||||
c.JsonResult(6003, "文档不存在")
|
||||
}
|
||||
|
||||
if c.Member.Role != conf.MemberSuperRole {
|
||||
rel, err := models.NewRelationship().FindByBookIdAndMemberId(document.BookId, c.Member.MemberId)
|
||||
if err != nil {
|
||||
beego.Error(err)
|
||||
c.JsonResult(6004, "权限不足")
|
||||
}
|
||||
|
||||
if rel.RoleId == conf.BookObserver {
|
||||
c.JsonResult(6004, "权限不足")
|
||||
}
|
||||
}
|
||||
err = attach.Delete()
|
||||
|
||||
err = attach.Delete()
|
||||
if err != nil {
|
||||
beego.Error(err)
|
||||
c.JsonResult(6005, "删除失败")
|
||||
}
|
||||
|
||||
os.Remove(filepath.Join(commands.WorkingDirectory, attach.FilePath))
|
||||
|
||||
c.JsonResult(0, "ok", attach)
|
||||
}
|
||||
|
||||
//删除文档.
|
||||
// 删除文档
|
||||
func (c *DocumentController) Delete() {
|
||||
c.Prepare()
|
||||
|
||||
|
@ -624,6 +664,7 @@ func (c *DocumentController) Delete() {
|
|||
doc_id, err := c.GetInt("doc_id", 0)
|
||||
|
||||
book_id := 0
|
||||
|
||||
// 如果是超级管理员则忽略权限判断
|
||||
if c.Member.IsAdministrator() {
|
||||
book, err := models.NewBook().FindByFieldFirst("identify", identify)
|
||||
|
@ -631,6 +672,7 @@ func (c *DocumentController) Delete() {
|
|||
beego.Error("FindByIdentify => ", err)
|
||||
c.JsonResult(6002, "项目不存在或权限不足")
|
||||
}
|
||||
|
||||
book_id = book.BookId
|
||||
} else {
|
||||
bookResult, err := models.NewBookResult().FindByIdentify(identify, c.Member.MemberId)
|
||||
|
@ -639,6 +681,7 @@ func (c *DocumentController) Delete() {
|
|||
beego.Error("FindByIdentify => ", err)
|
||||
c.JsonResult(6002, "项目不存在或权限不足")
|
||||
}
|
||||
|
||||
book_id = bookResult.BookId
|
||||
}
|
||||
|
||||
|
@ -656,17 +699,19 @@ func (c *DocumentController) Delete() {
|
|||
if doc.BookId != book_id {
|
||||
c.JsonResult(6004, "参数错误")
|
||||
}
|
||||
|
||||
// 递归删除项目下的文档以及子文档
|
||||
err = doc.RecursiveDocument(doc.DocumentId)
|
||||
if err != nil {
|
||||
c.JsonResult(6005, "删除失败")
|
||||
}
|
||||
|
||||
// 重置文档数量统计
|
||||
models.NewBook().ResetDocumentNumber(doc.BookId)
|
||||
c.JsonResult(0, "ok")
|
||||
}
|
||||
|
||||
//获取文档内容.
|
||||
// 获取文档内容
|
||||
func (c *DocumentController) Content() {
|
||||
c.Prepare()
|
||||
|
||||
|
@ -676,13 +721,16 @@ func (c *DocumentController) Content() {
|
|||
if err != nil {
|
||||
doc_id, _ = strconv.Atoi(c.Ctx.Input.Param(":id"))
|
||||
}
|
||||
|
||||
book_id := 0
|
||||
|
||||
// 如果是超级管理员,则忽略权限
|
||||
if c.Member.IsAdministrator() {
|
||||
book, err := models.NewBook().FindByFieldFirst("identify", identify)
|
||||
if err != nil {
|
||||
c.JsonResult(6002, "项目不存在或权限不足")
|
||||
}
|
||||
|
||||
book_id = book.BookId
|
||||
} else {
|
||||
bookResult, err := models.NewBookResult().FindByIdentify(identify, c.Member.MemberId)
|
||||
|
@ -691,6 +739,7 @@ func (c *DocumentController) Content() {
|
|||
beego.Error("FindByIdentify => ", err)
|
||||
c.JsonResult(6002, "项目不存在或权限不足")
|
||||
}
|
||||
|
||||
book_id = bookResult.BookId
|
||||
}
|
||||
|
||||
|
@ -709,13 +758,16 @@ func (c *DocumentController) Content() {
|
|||
if err != nil {
|
||||
c.JsonResult(6003, "读取文档错误")
|
||||
}
|
||||
|
||||
if doc.BookId != book_id {
|
||||
c.JsonResult(6004, "保存的文档不属于指定项目")
|
||||
}
|
||||
|
||||
if doc.Version != version && !strings.EqualFold(is_cover, "yes") {
|
||||
beego.Info("%d|", version, doc.Version)
|
||||
c.JsonResult(6005, "文档已被修改确定要覆盖吗?")
|
||||
}
|
||||
|
||||
history := models.NewDocumentHistory()
|
||||
history.DocumentId = doc_id
|
||||
history.Content = doc.Content
|
||||
|
@ -733,12 +785,15 @@ func (c *DocumentController) Content() {
|
|||
} else {
|
||||
doc.Markdown = markdown
|
||||
}
|
||||
|
||||
doc.Version = time.Now().Unix()
|
||||
doc.Content = content
|
||||
|
||||
if err := doc.InsertOrUpdate(); err != nil {
|
||||
beego.Error("InsertOrUpdate => ", err)
|
||||
c.JsonResult(6006, "保存失败")
|
||||
}
|
||||
|
||||
// 如果启用了文档历史,则添加历史文档
|
||||
if c.EnableDocumentHistory {
|
||||
_, err = history.InsertOrUpdate()
|
||||
|
@ -749,15 +804,17 @@ func (c *DocumentController) Content() {
|
|||
|
||||
c.JsonResult(0, "ok", doc)
|
||||
}
|
||||
doc, err := models.NewDocument().Find(doc_id)
|
||||
|
||||
doc, err := models.NewDocument().Find(doc_id)
|
||||
if err != nil {
|
||||
c.JsonResult(6003, "文档不存在")
|
||||
}
|
||||
|
||||
attach, err := models.NewAttachment().FindListByDocumentId(doc.DocumentId)
|
||||
if err == nil {
|
||||
doc.AttachList = attach
|
||||
}
|
||||
|
||||
c.JsonResult(0, "ok", doc)
|
||||
}
|
||||
|
||||
|
@ -782,6 +839,7 @@ func (c *DocumentController) GetDocumentById(id string) (doc *models.Document, e
|
|||
return nil, err
|
||||
}
|
||||
}
|
||||
|
||||
return doc, nil
|
||||
}
|
||||
|
||||
|
@ -791,19 +849,19 @@ func (c *DocumentController) Export(single_doc bool) {
|
|||
c.TplName = "document/export.tpl"
|
||||
|
||||
identify := c.Ctx.Input.Param(":key")
|
||||
|
||||
output := c.GetString("output")
|
||||
|
||||
token := c.GetString("token")
|
||||
|
||||
if identify == "" {
|
||||
c.Abort("404")
|
||||
}
|
||||
//如果没有开启你们访问则跳转到登录
|
||||
if !c.EnableAnonymous && c.Member == nil {
|
||||
c.Redirect(beego.URLFor("AccountController.Login"), 302)
|
||||
|
||||
output := c.GetString("output")
|
||||
token := c.GetString("token")
|
||||
|
||||
// 如果没有开启匿名访问则跳转到登录
|
||||
if !c.EnableAnonymous && !isUserLoggedIn(c) {
|
||||
promptUserToLogIn(c)
|
||||
return
|
||||
}
|
||||
|
||||
bookResult := models.NewBookResult()
|
||||
if c.Member != nil && c.Member.IsAdministrator() {
|
||||
book, err := models.NewBook().FindByIdentify(identify)
|
||||
|
@ -811,32 +869,32 @@ func (c *DocumentController) Export(single_doc bool) {
|
|||
beego.Error(err)
|
||||
c.Abort("500")
|
||||
}
|
||||
|
||||
bookResult = book.ToBookResult()
|
||||
} else {
|
||||
bookResult = isReadable(identify, token, c)
|
||||
}
|
||||
if bookResult.PrivatelyOwned == 0 {
|
||||
//TODO 私有项目禁止导出
|
||||
}
|
||||
docs, err := models.NewDocument().FindListByBookId(bookResult.BookId)
|
||||
|
||||
if bookResult.PrivatelyOwned == 0 {
|
||||
// TODO: 私有项目禁止导出
|
||||
}
|
||||
|
||||
docs, err := models.NewDocument().FindListByBookId(bookResult.BookId)
|
||||
if err != nil {
|
||||
beego.Error(err)
|
||||
c.Abort("500")
|
||||
}
|
||||
|
||||
if output == "pdf" {
|
||||
|
||||
exe := beego.AppConfig.String("wkhtmltopdf")
|
||||
|
||||
if exe == "" {
|
||||
c.TplName = "errors/error.tpl"
|
||||
c.Data["ErrorMessage"] = "没有配置PDF导出程序"
|
||||
c.Data["ErrorCode"] = 50010
|
||||
return
|
||||
}
|
||||
dpath := "cache/" + bookResult.Identify
|
||||
|
||||
dpath := "cache/" + bookResult.Identify
|
||||
os.MkdirAll(dpath, 0766)
|
||||
|
||||
pathList := list.New()
|
||||
|
@ -859,21 +917,22 @@ func (c *DocumentController) Export(single_doc bool) {
|
|||
pdfpath := filepath.Join("cache", identify+"_"+c.CruSession.SessionID()+".pdf")
|
||||
|
||||
if _, err := os.Stat(pdfpath); os.IsNotExist(err) {
|
||||
|
||||
wkhtmltopdf.SetPath(beego.AppConfig.String("wkhtmltopdf"))
|
||||
pdfg, err := wkhtmltopdf.NewPDFGenerator()
|
||||
pdfg.MarginBottom.Set(35)
|
||||
|
||||
pdfg, err := wkhtmltopdf.NewPDFGenerator()
|
||||
if err != nil {
|
||||
beego.Error(err)
|
||||
c.Abort("500")
|
||||
}
|
||||
|
||||
pdfg.MarginBottom.Set(35)
|
||||
|
||||
for e := pathList.Front(); e != nil; e = e.Next() {
|
||||
if page, ok := e.Value.(string); ok {
|
||||
pdfg.AddPage(wkhtmltopdf.NewPage(page))
|
||||
}
|
||||
}
|
||||
|
||||
err = pdfg.Create()
|
||||
if err != nil {
|
||||
beego.Error(err)
|
||||
|
@ -896,13 +955,13 @@ func (c *DocumentController) Export(single_doc bool) {
|
|||
c.Abort("404")
|
||||
}
|
||||
|
||||
//生成项目访问的二维码.
|
||||
// 生成项目访问的二维码
|
||||
func (c *DocumentController) QrCode() {
|
||||
c.Prepare()
|
||||
|
||||
identify := c.GetString(":key")
|
||||
|
||||
book, err := models.NewBook().FindByIdentify(identify)
|
||||
|
||||
if err != nil || book.BookId <= 0 {
|
||||
c.Abort("404")
|
||||
}
|
||||
|
@ -913,12 +972,13 @@ func (c *DocumentController) QrCode() {
|
|||
beego.Error(err)
|
||||
c.Abort("500")
|
||||
}
|
||||
code, err = barcode.Scale(code, 150, 150)
|
||||
|
||||
code, err = barcode.Scale(code, 150, 150)
|
||||
if err != nil {
|
||||
beego.Error(err)
|
||||
c.Abort("500")
|
||||
}
|
||||
|
||||
c.Ctx.ResponseWriter.Header().Set("Content-Type", "image/png")
|
||||
|
||||
// imgpath := filepath.Join("cache","qrcode",identify + ".png")
|
||||
|
@ -930,7 +990,7 @@ func (c *DocumentController) QrCode() {
|
|||
}
|
||||
}
|
||||
|
||||
//项目内搜索.
|
||||
// 项目内搜索
|
||||
func (c *DocumentController) Search() {
|
||||
c.Prepare()
|
||||
|
||||
|
@ -941,21 +1001,24 @@ func (c *DocumentController) Search() {
|
|||
if identify == "" {
|
||||
c.JsonResult(6001, "参数错误")
|
||||
}
|
||||
if !c.EnableAnonymous && c.Member == nil {
|
||||
c.Redirect(beego.URLFor("AccountController.Login"), 302)
|
||||
|
||||
if !c.EnableAnonymous && !isUserLoggedIn(c) {
|
||||
promptUserToLogIn(c)
|
||||
return
|
||||
}
|
||||
|
||||
bookResult := isReadable(identify, token, c)
|
||||
|
||||
docs, err := models.NewDocumentSearchResult().SearchDocument(keyword, bookResult.BookId)
|
||||
|
||||
if err != nil {
|
||||
beego.Error(err)
|
||||
c.JsonResult(6002, "搜索结果错误")
|
||||
}
|
||||
|
||||
if len(docs) < 0 {
|
||||
c.JsonResult(404, "没有数据库")
|
||||
}
|
||||
|
||||
for _, doc := range docs {
|
||||
doc.BookId = bookResult.BookId
|
||||
doc.BookName = bookResult.BookName
|
||||
|
@ -966,9 +1029,10 @@ func (c *DocumentController) Search() {
|
|||
c.JsonResult(0, "ok", docs)
|
||||
}
|
||||
|
||||
//文档历史列表.
|
||||
// 文档历史列表
|
||||
func (c *DocumentController) History() {
|
||||
c.Prepare()
|
||||
|
||||
c.TplName = "document/history.tpl"
|
||||
|
||||
identify := c.GetString("identify")
|
||||
|
@ -976,6 +1040,7 @@ func (c *DocumentController) History() {
|
|||
pageIndex, _ := c.GetInt("page", 1)
|
||||
|
||||
book_id := 0
|
||||
|
||||
// 如果是超级管理员则忽略权限判断
|
||||
if c.Member.IsAdministrator() {
|
||||
book, err := models.NewBook().FindByFieldFirst("identify", identify)
|
||||
|
@ -984,16 +1049,17 @@ func (c *DocumentController) History() {
|
|||
c.Data["ErrorMessage"] = "项目不存在或权限不足"
|
||||
return
|
||||
}
|
||||
|
||||
book_id = book.BookId
|
||||
c.Data["Model"] = book
|
||||
} else {
|
||||
bookResult, err := models.NewBookResult().FindByIdentify(identify, c.Member.MemberId)
|
||||
|
||||
if err != nil || bookResult.RoleId == conf.BookObserver {
|
||||
beego.Error("FindByIdentify => ", err)
|
||||
c.Data["ErrorMessage"] = "项目不存在或权限不足"
|
||||
return
|
||||
}
|
||||
|
||||
book_id = bookResult.BookId
|
||||
c.Data["Model"] = bookResult
|
||||
}
|
||||
|
@ -1004,12 +1070,12 @@ func (c *DocumentController) History() {
|
|||
}
|
||||
|
||||
doc, err := models.NewDocument().Find(doc_id)
|
||||
|
||||
if err != nil {
|
||||
beego.Error("Delete => ", err)
|
||||
c.Data["ErrorMessage"] = "获取历史失败"
|
||||
return
|
||||
}
|
||||
|
||||
// 如果文档所属项目错误
|
||||
if doc.BookId != book_id {
|
||||
c.Data["ErrorMessage"] = "参数错误"
|
||||
|
@ -1017,7 +1083,6 @@ func (c *DocumentController) History() {
|
|||
}
|
||||
|
||||
historis, totalCount, err := models.NewDocumentHistory().FindToPager(doc_id, pageIndex, conf.PageSize)
|
||||
|
||||
if err != nil {
|
||||
beego.Error("FindToPager => ", err)
|
||||
c.Data["ErrorMessage"] = "获取历史失败"
|
||||
|
@ -1030,13 +1095,13 @@ func (c *DocumentController) History() {
|
|||
|
||||
if totalCount > 0 {
|
||||
html := utils.GetPagerHtml(c.Ctx.Request.RequestURI, pageIndex, conf.PageSize, totalCount)
|
||||
|
||||
c.Data["PageHtml"] = html
|
||||
}
|
||||
}
|
||||
|
||||
func (c *DocumentController) DeleteHistory() {
|
||||
c.Prepare()
|
||||
|
||||
c.TplName = "document/history.tpl"
|
||||
|
||||
identify := c.GetString("identify")
|
||||
|
@ -1046,7 +1111,9 @@ func (c *DocumentController) DeleteHistory() {
|
|||
if history_id <= 0 {
|
||||
c.JsonResult(6001, "参数错误")
|
||||
}
|
||||
|
||||
book_id := 0
|
||||
|
||||
// 如果是超级管理员则忽略权限判断
|
||||
if c.Member.IsAdministrator() {
|
||||
book, err := models.NewBook().FindByFieldFirst("identify", identify)
|
||||
|
@ -1054,14 +1121,15 @@ func (c *DocumentController) DeleteHistory() {
|
|||
beego.Error("FindByIdentify => ", err)
|
||||
c.JsonResult(6002, "项目不存在或权限不足")
|
||||
}
|
||||
|
||||
book_id = book.BookId
|
||||
} else {
|
||||
bookResult, err := models.NewBookResult().FindByIdentify(identify, c.Member.MemberId)
|
||||
|
||||
if err != nil || bookResult.RoleId == conf.BookObserver {
|
||||
beego.Error("FindByIdentify => ", err)
|
||||
c.JsonResult(6002, "项目不存在或权限不足")
|
||||
}
|
||||
|
||||
book_id = bookResult.BookId
|
||||
}
|
||||
|
||||
|
@ -1070,25 +1138,28 @@ func (c *DocumentController) DeleteHistory() {
|
|||
}
|
||||
|
||||
doc, err := models.NewDocument().Find(doc_id)
|
||||
|
||||
if err != nil {
|
||||
beego.Error("Delete => ", err)
|
||||
c.JsonResult(6001, "获取历史失败")
|
||||
}
|
||||
|
||||
// 如果文档所属项目错误
|
||||
if doc.BookId != book_id {
|
||||
c.JsonResult(6001, "参数错误")
|
||||
}
|
||||
|
||||
err = models.NewDocumentHistory().Delete(history_id, doc_id)
|
||||
if err != nil {
|
||||
beego.Error(err)
|
||||
c.JsonResult(6002, "删除失败")
|
||||
}
|
||||
|
||||
c.JsonResult(0, "ok")
|
||||
}
|
||||
|
||||
func (c *DocumentController) RestoreHistory() {
|
||||
c.Prepare()
|
||||
|
||||
c.TplName = "document/history.tpl"
|
||||
|
||||
identify := c.GetString("identify")
|
||||
|
@ -1098,6 +1169,7 @@ func (c *DocumentController) RestoreHistory() {
|
|||
if history_id <= 0 {
|
||||
c.JsonResult(6001, "参数错误")
|
||||
}
|
||||
|
||||
book_id := 0
|
||||
// 如果是超级管理员则忽略权限判断
|
||||
if c.Member.IsAdministrator() {
|
||||
|
@ -1106,14 +1178,15 @@ func (c *DocumentController) RestoreHistory() {
|
|||
beego.Error("FindByIdentify => ", err)
|
||||
c.JsonResult(6002, "项目不存在或权限不足")
|
||||
}
|
||||
|
||||
book_id = book.BookId
|
||||
} else {
|
||||
bookResult, err := models.NewBookResult().FindByIdentify(identify, c.Member.MemberId)
|
||||
|
||||
if err != nil || bookResult.RoleId == conf.BookObserver {
|
||||
beego.Error("FindByIdentify => ", err)
|
||||
c.JsonResult(6002, "项目不存在或权限不足")
|
||||
}
|
||||
|
||||
book_id = bookResult.BookId
|
||||
}
|
||||
|
||||
|
@ -1122,26 +1195,30 @@ func (c *DocumentController) RestoreHistory() {
|
|||
}
|
||||
|
||||
doc, err := models.NewDocument().Find(doc_id)
|
||||
|
||||
if err != nil {
|
||||
beego.Error("Delete => ", err)
|
||||
c.JsonResult(6001, "获取历史失败")
|
||||
}
|
||||
|
||||
// 如果文档所属项目错误
|
||||
if doc.BookId != book_id {
|
||||
c.JsonResult(6001, "参数错误")
|
||||
}
|
||||
|
||||
err = models.NewDocumentHistory().Restore(history_id, doc_id, c.Member.MemberId)
|
||||
if err != nil {
|
||||
beego.Error(err)
|
||||
c.JsonResult(6002, "删除失败")
|
||||
}
|
||||
|
||||
c.JsonResult(0, "ok", doc)
|
||||
}
|
||||
|
||||
func (c *DocumentController) Compare() {
|
||||
c.Prepare()
|
||||
|
||||
c.TplName = "document/compare.tpl"
|
||||
|
||||
history_id, _ := strconv.Atoi(c.Ctx.Input.Param(":id"))
|
||||
identify := c.Ctx.Input.Param(":key")
|
||||
|
||||
|
@ -1156,17 +1233,18 @@ func (c *DocumentController) Compare() {
|
|||
c.Abort("403")
|
||||
return
|
||||
}
|
||||
|
||||
book_id = book.BookId
|
||||
c.Data["Model"] = book
|
||||
editor = book.Editor
|
||||
} else {
|
||||
bookResult, err := models.NewBookResult().FindByIdentify(identify, c.Member.MemberId)
|
||||
|
||||
if err != nil || bookResult.RoleId == conf.BookObserver {
|
||||
beego.Error("FindByIdentify => ", err)
|
||||
c.Abort("403")
|
||||
return
|
||||
}
|
||||
|
||||
book_id = bookResult.BookId
|
||||
c.Data["Model"] = bookResult
|
||||
editor = bookResult.Editor
|
||||
|
@ -1181,11 +1259,12 @@ func (c *DocumentController) Compare() {
|
|||
beego.Error("DocumentController.Compare => ", err)
|
||||
c.ShowErrorPage(60003, err.Error())
|
||||
}
|
||||
doc, err := models.NewDocument().Find(history.DocumentId)
|
||||
|
||||
doc, err := models.NewDocument().Find(history.DocumentId)
|
||||
if doc.BookId != book_id {
|
||||
c.ShowErrorPage(60002, "参数错误")
|
||||
}
|
||||
|
||||
c.Data["HistoryId"] = history_id
|
||||
c.Data["DocumentId"] = doc.DocumentId
|
||||
|
||||
|
@ -1198,7 +1277,7 @@ func (c *DocumentController) Compare() {
|
|||
}
|
||||
}
|
||||
|
||||
//递归生成文档序列数组.
|
||||
// 递归生成文档序列数组
|
||||
func RecursiveFun(parent_id int, prefix, dpath string, c *DocumentController, book *models.BookResult, docs []*models.Document, paths *list.List) {
|
||||
for _, item := range docs {
|
||||
if item.ParentId == parent_id {
|
||||
|
@ -1221,7 +1300,6 @@ func EachFun(prefix, dpath string, c *DocumentController, book *models.BookResul
|
|||
paths.PushBack(fpath)
|
||||
|
||||
f, err := os.OpenFile(fpath, os.O_CREATE|os.O_RDWR, 0777)
|
||||
|
||||
if err != nil {
|
||||
beego.Error(err)
|
||||
c.Abort("500")
|
||||
|
@ -1241,13 +1319,14 @@ func EachFun(prefix, dpath string, c *DocumentController, book *models.BookResul
|
|||
contentSelection.SetAttr("src", c.BaseUrl()+src)
|
||||
}
|
||||
})
|
||||
html, err = doc.Html()
|
||||
|
||||
html, err = doc.Html()
|
||||
if err != nil {
|
||||
f.Close()
|
||||
beego.Error(err)
|
||||
c.Abort("500")
|
||||
}
|
||||
|
||||
// html = strings.Replace(html, "<img src=\"/uploads", "<img src=\"" + c.BaseUrl() + "/uploads", -1)
|
||||
|
||||
f.WriteString(html)
|
||||
|
|
|
@ -53,7 +53,8 @@ function loadDocument($url,$id,$callback) {
|
|||
events.data('doc_info_' + $id, doc_info);
|
||||
|
||||
events.trigger('article.open', { $url : $url, $init : true, $id : $id });
|
||||
|
||||
} else if (res.errcode === 6000) {
|
||||
window.location.href = "/";
|
||||
} else {
|
||||
layer.msg("加载失败");
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue