1、实现富文本编辑器

2、实现文档转换为PDF、MOBI、EPUB、Word格式
3、实现登录后跳转到来源地址
This commit is contained in:
Minho
2018-01-26 17:17:38 +08:00
parent e1ec6bb788
commit 882d93e7b0
57 changed files with 1572 additions and 1475 deletions

View File

@@ -14,6 +14,7 @@ import (
"github.com/lifei6671/mindoc/conf"
"github.com/lifei6671/mindoc/models"
"github.com/lifei6671/mindoc/utils"
"net/url"
)
// AccountController 用户登录与注册
@@ -32,14 +33,17 @@ func (c *AccountController) Login() {
Time time.Time
}
// 显式指定的 URL 参数优先;为了统一处理,将之更新到 Session 中
turl := c.GetString("turl", "")
if turl != "" {
c.SetSession("turl", turl)
if member, ok := c.GetSession(conf.LoginSessionName).(models.Member); ok && member.MemberId > 0 {
u := c.GetString("url")
if u == "" {
u = c.Ctx.Request.Header.Get("Referer")
}
if u == "" {
u = beego.URLFor("HomeController.Index")
}
c.Redirect(u,302)
}
beego.Info("AccountController.Login(): turl is: " + turl)
// 如果 Cookie 中存在登录信息
if cookie, ok := c.GetSecureCookie(conf.GetAppKey(), "login"); ok {
if err := utils.Decode(cookie, &remember); err == nil {
@@ -81,26 +85,35 @@ func (c *AccountController) Login() {
c.SetSecureCookie(conf.GetAppKey(), "login", v)
}
}
u,_ := url.PathUnescape(c.GetString("url"))
if u == "" {
u = c.Ctx.Request.Header.Get("Referer")
}
if u == "" {
u = beego.URLFor("HomeController.Index")
}
data := c.LoggedIn(true)
c.JsonResult(0, "ok", data)
c.JsonResult(0, "ok", u)
} else {
logs.Error("用户登录 =>", err)
c.JsonResult(500, "账号或密码错误", nil)
}
}else{
u,_ := url.PathUnescape(c.GetString("url"))
if u == "" {
u = c.Ctx.Request.Header.Get("Referer")
}
if u == "" {
u = beego.URLFor("HomeController.Index")
}
c.Data["url"] = url.PathEscape(u)
}
}
// 登录成功后的操作,如重定向到原始请求页面
func (c *AccountController) LoggedIn(isPost bool) interface{} {
turl := ""
value := c.GetSession("turl")
if value != nil {
turl = value.(string)
}
c.DelSession("turl")
beego.Info("AccountController.LoggedIn(): turl is: " + turl)
turl := c.GetString("url")
if !isPost {
// 检查是否存在 turl 参数,如果有则重定向至 turl 处,否则进入 Home 页面
@@ -111,7 +124,7 @@ func (c *AccountController) LoggedIn(isPost bool) interface{} {
return nil
} else {
var data struct {
TURL string `json:"turl"`
TURL string `json:"url"`
}
data.TURL = turl
return data
@@ -369,7 +382,9 @@ func (c *AccountController) Logout() {
c.SetSecureCookie(conf.GetAppKey(), "login", "", -3600)
c.Redirect(beego.URLFor("AccountController.Login"), 302)
u := c.Ctx.Request.Header.Get("Referer")
c.Redirect(beego.URLFor("AccountController.Login","url",u), 302)
}
// 验证码

View File

@@ -1,53 +1,52 @@
package controllers
import (
"bytes"
"github.com/lifei6671/mindoc/models"
"github.com/lifei6671/mindoc/conf"
"github.com/astaxie/beego"
"strings"
"encoding/json"
"github.com/astaxie/beego"
"github.com/lifei6671/mindoc/conf"
"github.com/lifei6671/mindoc/models"
"io"
"strings"
)
type BaseController struct {
beego.Controller
Member *models.Member
Option map[string]string
EnableAnonymous bool
Member *models.Member
Option map[string]string
EnableAnonymous bool
EnableDocumentHistory bool
}
// Prepare 预处理.
func (c *BaseController) Prepare (){
func (c *BaseController) Prepare() {
c.Data["SiteName"] = "MinDoc"
c.Data["Member"] = models.Member{}
c.EnableAnonymous = false
c.EnableDocumentHistory = false
if member,ok := c.GetSession(conf.LoginSessionName).(models.Member); ok && member.MemberId > 0{
if member, ok := c.GetSession(conf.LoginSessionName).(models.Member); ok && member.MemberId > 0 {
c.Member = &member
c.Data["Member"] = c.Member
}else{
} else {
//c.Member = models.NewMember()
//c.Member.Find(1)
//c.Data["Member"] = *c.Member
}
c.Data["BaseUrl"] = c.Ctx.Input.Scheme() + "://" + c.Ctx.Request.Host
conf.BaseUrl = c.BaseUrl()
c.Data["BaseUrl"] = c.BaseUrl()
if options,err := models.NewOption().All();err == nil {
c.Option = make(map[string]string,len(options))
for _,item := range options {
if options, err := models.NewOption().All(); err == nil {
c.Option = make(map[string]string, len(options))
for _, item := range options {
c.Data[item.OptionName] = item.OptionValue
c.Option[item.OptionName] = item.OptionValue
if strings.EqualFold(item.OptionName,"ENABLE_ANONYMOUS") && item.OptionValue == "true" {
if strings.EqualFold(item.OptionName, "ENABLE_ANONYMOUS") && item.OptionValue == "true" {
c.EnableAnonymous = true
}
if strings.EqualFold(item.OptionName,"ENABLE_DOCUMENT_HISTORY") && item.OptionValue == "true" {
if strings.EqualFold(item.OptionName, "ENABLE_DOCUMENT_HISTORY") && item.OptionValue == "true" {
c.EnableDocumentHistory = true
}
}
@@ -68,13 +67,13 @@ func (c *BaseController) SetMember(member models.Member) {
}
// JsonResult 响应 json 结果
func (c *BaseController) JsonResult(errCode int,errMsg string,data ...interface{}){
jsonData := make(map[string]interface{},3)
func (c *BaseController) JsonResult(errCode int, errMsg string, data ...interface{}) {
jsonData := make(map[string]interface{}, 3)
jsonData["errcode"] = errCode
jsonData["message"] = errMsg
if len(data) > 0 && data[0] != nil{
if len(data) > 0 && data[0] != nil {
jsonData["data"] = data[0]
}
@@ -86,13 +85,13 @@ func (c *BaseController) JsonResult(errCode int,errMsg string,data ...interface{
c.Ctx.ResponseWriter.Header().Set("Content-Type", "application/json; charset=utf-8")
io.WriteString(c.Ctx.ResponseWriter,string(returnJSON))
io.WriteString(c.Ctx.ResponseWriter, string(returnJSON))
c.StopRun()
}
// ExecuteViewPathTemplate 执行指定的模板并返回执行结果.
func (c *BaseController) ExecuteViewPathTemplate(tplName string,data interface{}) (string,error){
func (c *BaseController) ExecuteViewPathTemplate(tplName string, data interface{}) (string, error) {
var buf bytes.Buffer
viewPath := c.ViewPath
@@ -102,28 +101,28 @@ func (c *BaseController) ExecuteViewPathTemplate(tplName string,data interface{}
}
if err := beego.ExecuteViewPathTemplate(&buf,tplName,viewPath,data); err != nil {
return "",err
if err := beego.ExecuteViewPathTemplate(&buf, tplName, viewPath, data); err != nil {
return "", err
}
return buf.String(),nil
return buf.String(), nil
}
func (c *BaseController) BaseUrl() string {
baseUrl := beego.AppConfig.DefaultString("baseurl","")
baseUrl := beego.AppConfig.DefaultString("baseurl", "")
if baseUrl != "" {
if strings.HasSuffix(baseUrl,"/"){
baseUrl = strings.TrimSuffix(baseUrl,"/")
if strings.HasSuffix(baseUrl, "/") {
baseUrl = strings.TrimSuffix(baseUrl, "/")
}
}else{
} else {
baseUrl = c.Ctx.Input.Scheme() + "://" + c.Ctx.Request.Host
}
return baseUrl
}
//显示错误信息页面.
func (c *BaseController) ShowErrorPage(errCode int,errMsg string) {
func (c *BaseController) ShowErrorPage(errCode int, errMsg string) {
c.TplName = "errors/error.tpl"
c.Data["ErrorMessage"] = errMsg
c.Data["ErrorCode"] = errCode
c.StopRun()
}
}

View File

@@ -1,25 +1,24 @@
package controllers
import (
"strings"
"regexp"
"strconv"
"time"
"encoding/json"
"html/template"
"errors"
"fmt"
"path/filepath"
"html/template"
"os"
"path/filepath"
"regexp"
"strconv"
"strings"
"time"
"github.com/lifei6671/mindoc/models"
"github.com/lifei6671/mindoc/utils"
"github.com/astaxie/beego"
"github.com/astaxie/beego/orm"
"github.com/astaxie/beego/logs"
"github.com/astaxie/beego/orm"
"github.com/lifei6671/mindoc/conf"
"github.com/lifei6671/mindoc/graphics"
"github.com/lifei6671/mindoc/commands"
"github.com/lifei6671/mindoc/models"
"github.com/lifei6671/mindoc/utils"
)
type BookController struct {
@@ -32,10 +31,10 @@ func (c *BookController) Index() {
pageIndex, _ := c.GetInt("page", 1)
books,totalCount,err := models.NewBook().FindToPager(pageIndex,conf.PageSize,c.Member.MemberId)
books, totalCount, err := models.NewBook().FindToPager(pageIndex, conf.PageSize, c.Member.MemberId)
if err != nil {
logs.Error("BookController.Index => ",err)
logs.Error("BookController.Index => ", err)
c.Abort("500")
}
@@ -43,14 +42,14 @@ func (c *BookController) Index() {
html := utils.GetPagerHtml(c.Ctx.Request.RequestURI, pageIndex, conf.PageSize, totalCount)
c.Data["PageHtml"] = html
}else {
} else {
c.Data["PageHtml"] = ""
}
b,err := json.Marshal(books)
b, err := json.Marshal(books)
if err != nil || len(books) <= 0{
if err != nil || len(books) <= 0 {
c.Data["Result"] = template.JS("[]")
}else{
} else {
c.Data["Result"] = template.JS(string(b))
}
}
@@ -62,11 +61,11 @@ func (c *BookController) Dashboard() {
key := c.Ctx.Input.Param(":key")
if key == ""{
if key == "" {
c.Abort("404")
}
book,err := models.NewBookResult().FindByIdentify(key,c.Member.MemberId)
book, err := models.NewBookResult().FindByIdentify(key, c.Member.MemberId)
if err != nil {
if err == models.ErrPermissionDenied {
c.Abort("403")
@@ -79,17 +78,17 @@ func (c *BookController) Dashboard() {
}
// Setting 项目设置 .
func (c *BookController) Setting() {
func (c *BookController) Setting() {
c.Prepare()
c.TplName = "book/setting.tpl"
key := c.Ctx.Input.Param(":key")
if key == ""{
if key == "" {
c.Abort("404")
}
book,err := models.NewBookResult().FindByIdentify(key,c.Member.MemberId)
book, err := models.NewBookResult().FindByIdentify(key, c.Member.MemberId)
if err != nil {
if err == orm.ErrNoRows {
c.Abort("404")
@@ -104,225 +103,224 @@ func (c *BookController) Setting() {
c.Abort("403")
}
if book.PrivateToken != "" {
book.PrivateToken = c.BaseUrl() + beego.URLFor("DocumentController.Index",":key",book.Identify,"token",book.PrivateToken)
book.PrivateToken = c.BaseUrl() + beego.URLFor("DocumentController.Index", ":key", book.Identify, "token", book.PrivateToken)
}
c.Data["Model"] = book
}
//保存项目信息
func (c *BookController) SaveBook() {
bookResult,err := c.IsPermission()
func (c *BookController) SaveBook() {
bookResult, err := c.IsPermission()
if err != nil {
c.JsonResult(6001,err.Error())
c.JsonResult(6001, err.Error())
}
book,err := models.NewBook().Find(bookResult.BookId)
book, err := models.NewBook().Find(bookResult.BookId)
if err != nil {
logs.Error("SaveBook => ",err)
c.JsonResult(6002,err.Error())
logs.Error("SaveBook => ", err)
c.JsonResult(6002, err.Error())
}
book_name := strings.TrimSpace(c.GetString("book_name"))
description := strings.TrimSpace(c.GetString("description",""))
description := strings.TrimSpace(c.GetString("description", ""))
comment_status := c.GetString("comment_status")
tag := strings.TrimSpace(c.GetString("label"))
editor := strings.TrimSpace(c.GetString("editor"))
auto_release := strings.TrimSpace(c.GetString("auto_release")) == "on"
if strings.Count(description,"") > 500 {
c.JsonResult(6004,"项目描述不能大于500字")
if strings.Count(description, "") > 500 {
c.JsonResult(6004, "项目描述不能大于500字")
}
if comment_status != "open" && comment_status != "closed" && comment_status != "group_only" && comment_status != "registered_only" {
comment_status = "closed"
}
if tag != ""{
tags := strings.Split(tag,",")
if tag != "" {
tags := strings.Split(tag, ",")
if len(tags) > 10 {
c.JsonResult(6005,"最多允许添加10个标签")
c.JsonResult(6005, "最多允许添加10个标签")
}
}
if editor != "markdown" && editor != "html" {
editor = "markdown"
}
book.BookName = book_name
book.Description = description
book.CommentStatus = comment_status
book.Label = tag
book.Editor = editor
book.BookName = book_name
book.Description = description
book.CommentStatus = comment_status
book.Label = tag
book.Editor = editor
if auto_release {
book.AutoRelease = 1
}else{
} else {
book.AutoRelease = 0
}
if err := book.Update();err != nil {
c.JsonResult(6006,"保存失败")
if err := book.Update(); err != nil {
c.JsonResult(6006, "保存失败")
}
bookResult.BookName = book_name
bookResult.Description = description
bookResult.CommentStatus = comment_status
bookResult.Label = tag
c.JsonResult(0,"ok",bookResult)
c.JsonResult(0, "ok", bookResult)
}
//设置项目私有状态.
func (c *BookController) PrivatelyOwned() {
func (c *BookController) PrivatelyOwned() {
status := c.GetString("status")
if status != "open" && status != "close" {
c.JsonResult(6003,"参数错误")
c.JsonResult(6003, "参数错误")
}
state := 0
if status == "open" {
state = 0
}else{
} else {
state = 1
}
bookResult,err := c.IsPermission()
bookResult, err := c.IsPermission()
if err != nil {
c.JsonResult(6001,err.Error())
c.JsonResult(6001, err.Error())
}
//只有创始人才能变更私有状态
if bookResult.RoleId != conf.BookFounder {
c.JsonResult(6002,"权限不足")
c.JsonResult(6002, "权限不足")
}
book,err := models.NewBook().Find(bookResult.BookId)
book, err := models.NewBook().Find(bookResult.BookId)
if err != nil {
c.JsonResult(6005,"项目不存在")
c.JsonResult(6005, "项目不存在")
}
book.PrivatelyOwned = state
err = book.Update()
if err != nil {
logs.Error("PrivatelyOwned => ",err)
c.JsonResult(6004,"保存失败")
logs.Error("PrivatelyOwned => ", err)
c.JsonResult(6004, "保存失败")
}
c.JsonResult(0,"ok")
c.JsonResult(0, "ok")
}
// Transfer 转让项目.
func (c *BookController) Transfer() {
func (c *BookController) Transfer() {
c.Prepare()
account := c.GetString("account")
if account == "" {
c.JsonResult(6004,"接受者账号不能为空")
c.JsonResult(6004, "接受者账号不能为空")
}
member,err := models.NewMember().FindByAccount(account)
member, err := models.NewMember().FindByAccount(account)
if err != nil {
logs.Error("FindByAccount => ",err)
c.JsonResult(6005,"接受用户不存在")
logs.Error("FindByAccount => ", err)
c.JsonResult(6005, "接受用户不存在")
}
if member.Status != 0 {
c.JsonResult(6006,"接受用户已被禁用")
c.JsonResult(6006, "接受用户已被禁用")
}
if member.MemberId == c.Member.MemberId {
c.JsonResult(6007,"不能转让给自己")
c.JsonResult(6007, "不能转让给自己")
}
bookResult,err := c.IsPermission()
bookResult, err := c.IsPermission()
if err != nil {
c.JsonResult(6001,err.Error())
c.JsonResult(6001, err.Error())
}
err = models.NewRelationship().Transfer(bookResult.BookId,c.Member.MemberId,member.MemberId)
err = models.NewRelationship().Transfer(bookResult.BookId, c.Member.MemberId, member.MemberId)
if err != nil {
logs.Error("Transfer => ",err)
c.JsonResult(6008,err.Error())
logs.Error("Transfer => ", err)
c.JsonResult(6008, err.Error())
}
c.JsonResult(0,"ok")
c.JsonResult(0, "ok")
}
//上传项目封面.
func (c *BookController) UploadCover() {
func (c *BookController) UploadCover() {
bookResult,err := c.IsPermission()
bookResult, err := c.IsPermission()
if err != nil {
c.JsonResult(6001,err.Error())
c.JsonResult(6001, err.Error())
}
book,err := models.NewBook().Find(bookResult.BookId)
book, err := models.NewBook().Find(bookResult.BookId)
if err != nil {
logs.Error("SaveBook => ",err)
c.JsonResult(6002,err.Error())
logs.Error("SaveBook => ", err)
c.JsonResult(6002, err.Error())
}
file,moreFile,err := c.GetFile("image-file")
file, moreFile, err := c.GetFile("image-file")
defer file.Close()
if err != nil {
logs.Error("",err.Error())
c.JsonResult(500,"读取文件异常")
logs.Error("", err.Error())
c.JsonResult(500, "读取文件异常")
}
ext := filepath.Ext(moreFile.Filename)
if !strings.EqualFold(ext,".png") && !strings.EqualFold(ext,".jpg") && !strings.EqualFold(ext,".gif") && !strings.EqualFold(ext,".jpeg") {
c.JsonResult(500,"不支持的图片格式")
if !strings.EqualFold(ext, ".png") && !strings.EqualFold(ext, ".jpg") && !strings.EqualFold(ext, ".gif") && !strings.EqualFold(ext, ".jpeg") {
c.JsonResult(500, "不支持的图片格式")
}
x1 ,_ := strconv.ParseFloat(c.GetString("x"),10)
y1 ,_ := strconv.ParseFloat(c.GetString("y"),10)
w1 ,_ := strconv.ParseFloat(c.GetString("width"),10)
h1 ,_ := strconv.ParseFloat(c.GetString("height"),10)
x1, _ := strconv.ParseFloat(c.GetString("x"), 10)
y1, _ := strconv.ParseFloat(c.GetString("y"), 10)
w1, _ := strconv.ParseFloat(c.GetString("width"), 10)
h1, _ := strconv.ParseFloat(c.GetString("height"), 10)
x := int(x1)
y := int(y1)
width := int(w1)
height := int(h1)
fileName := "cover_" + strconv.FormatInt(time.Now().UnixNano(), 16)
fileName := "cover_" + strconv.FormatInt(time.Now().UnixNano(), 16)
filePath := filepath.Join("uploads",time.Now().Format("200601"),fileName + ext)
filePath := filepath.Join("uploads", time.Now().Format("200601"), fileName+ext)
path := filepath.Dir(filePath)
os.MkdirAll(path, os.ModePerm)
err = c.SaveToFile("image-file",filePath)
err = c.SaveToFile("image-file", filePath)
if err != nil {
logs.Error("",err)
c.JsonResult(500,"图片保存失败")
logs.Error("", err)
c.JsonResult(500, "图片保存失败")
}
defer func(filePath string) {
os.Remove(filePath)
}(filePath)
//剪切图片
subImg,err := graphics.ImageCopyFromFile(filePath,x,y,width,height)
if err != nil{
logs.Error("graphics.ImageCopyFromFile => ",err)
c.JsonResult(500,"图片剪切")
}
filePath = filepath.Join(commands.WorkingDirectory,"uploads",time.Now().Format("200601"),fileName + "_small" + ext)
//生成缩略图并保存到磁盘
err = graphics.ImageResizeSaveFile(subImg,175,230,filePath)
subImg, err := graphics.ImageCopyFromFile(filePath, x, y, width, height)
if err != nil {
logs.Error("ImageResizeSaveFile => ",err.Error())
c.JsonResult(500,"保存图片失败")
logs.Error("graphics.ImageCopyFromFile => ", err)
c.JsonResult(500, "图片剪切")
}
url := "/" + strings.Replace(strings.TrimPrefix(filePath,commands.WorkingDirectory),"\\","/",-1)
filePath = filepath.Join(conf.WorkingDirectory, "uploads", time.Now().Format("200601"), fileName+"_small"+ext)
if strings.HasPrefix(url,"//") {
//生成缩略图并保存到磁盘
err = graphics.ImageResizeSaveFile(subImg, 175, 230, filePath)
if err != nil {
logs.Error("ImageResizeSaveFile => ", err.Error())
c.JsonResult(500, "保存图片失败")
}
url := "/" + strings.Replace(strings.TrimPrefix(filePath, conf.WorkingDirectory), "\\", "/", -1)
if strings.HasPrefix(url, "//") {
url = string(url[1:])
}
@@ -330,15 +328,15 @@ func (c *BookController) UploadCover() {
book.Cover = url
if err := book.Update() ; err != nil {
c.JsonResult(6001,"保存图片失败")
if err := book.Update(); err != nil {
c.JsonResult(6001, "保存图片失败")
}
//如果原封面不是默认封面则删除
if old_cover != conf.GetDefaultCover() {
os.Remove("." + old_cover)
}
c.JsonResult(0,"ok",url)
c.JsonResult(0, "ok", url)
}
// Users 用户列表.
@@ -347,13 +345,13 @@ func (c *BookController) Users() {
c.TplName = "book/users.tpl"
key := c.Ctx.Input.Param(":key")
pageIndex,_ := c.GetInt("page",1)
pageIndex, _ := c.GetInt("page", 1)
if key == ""{
if key == "" {
c.Abort("404")
}
book,err := models.NewBookResult().FindByIdentify(key,c.Member.MemberId)
book, err := models.NewBookResult().FindByIdentify(key, c.Member.MemberId)
if err != nil {
if err == models.ErrPermissionDenied {
c.Abort("403")
@@ -363,20 +361,20 @@ func (c *BookController) Users() {
c.Data["Model"] = *book
members,totalCount,err := models.NewMemberRelationshipResult().FindForUsersByBookId(book.BookId,pageIndex,15)
members, totalCount, err := models.NewMemberRelationshipResult().FindForUsersByBookId(book.BookId, pageIndex, 15)
if totalCount > 0 {
html := utils.GetPagerHtml(c.Ctx.Request.RequestURI, pageIndex, 10, totalCount)
c.Data["PageHtml"] = html
}else{
} else {
c.Data["PageHtml"] = ""
}
b,err := json.Marshal(members)
b, err := json.Marshal(members)
if err != nil {
c.Data["Result"] = template.JS("[]")
}else{
} else {
c.Data["Result"] = template.JS(string(b))
}
}
@@ -385,28 +383,28 @@ func (c *BookController) Users() {
func (c *BookController) Create() {
if c.Ctx.Input.IsPost() {
book_name := strings.TrimSpace(c.GetString("book_name",""))
identify := strings.TrimSpace(c.GetString("identify",""))
description := strings.TrimSpace(c.GetString("description",""))
privately_owned,_ := strconv.Atoi(c.GetString("privately_owned"))
book_name := strings.TrimSpace(c.GetString("book_name", ""))
identify := strings.TrimSpace(c.GetString("identify", ""))
description := strings.TrimSpace(c.GetString("description", ""))
privately_owned, _ := strconv.Atoi(c.GetString("privately_owned"))
comment_status := c.GetString("comment_status")
if book_name == "" {
c.JsonResult(6001,"项目名称不能为空")
c.JsonResult(6001, "项目名称不能为空")
}
if identify == "" {
c.JsonResult(6002,"项目标识不能为空")
c.JsonResult(6002, "项目标识不能为空")
}
if ok,err := regexp.MatchString(`^[a-z]+[a-zA-Z0-9_\-]*$`,identify); !ok || err != nil {
c.JsonResult(6003,"项目标识只能包含小写字母、数字,以及“-”和“_”符号,并且只能小写字母开头")
if ok, err := regexp.MatchString(`^[a-z]+[a-zA-Z0-9_\-]*$`, identify); !ok || err != nil {
c.JsonResult(6003, "项目标识只能包含小写字母、数字,以及“-”和“_”符号,并且只能小写字母开头")
}
if strings.Count(identify,"") > 50 {
c.JsonResult(6004,"文档标识不能超过50字")
if strings.Count(identify, "") > 50 {
c.JsonResult(6004, "文档标识不能超过50字")
}
if strings.Count(description,"") > 500 {
c.JsonResult(6004,"项目描述不能大于500字")
if strings.Count(description, "") > 500 {
c.JsonResult(6004, "项目描述不能大于500字")
}
if privately_owned !=0 && privately_owned != 1 {
if privately_owned != 0 && privately_owned != 1 {
privately_owned = 1
}
if comment_status != "open" && comment_status != "closed" && comment_status != "group_only" && comment_status != "registered_only" {
@@ -415,39 +413,39 @@ func (c *BookController) Create() {
book := models.NewBook()
if books,_ := book.FindByField("identify",identify); len(books) > 0 {
c.JsonResult(6006,"项目标识已存在")
if books, _ := book.FindByField("identify", identify); len(books) > 0 {
c.JsonResult(6006, "项目标识已存在")
}
book.BookName = book_name
book.BookName = book_name
book.Description = description
book.CommentCount = 0
book.PrivatelyOwned = privately_owned
book.CommentStatus = comment_status
book.Identify = identify
book.DocCount = 0
book.MemberId = c.Member.MemberId
book.Identify = identify
book.DocCount = 0
book.MemberId = c.Member.MemberId
book.CommentCount = 0
book.Version = time.Now().Unix()
book.Cover = conf.GetDefaultCover()
book.Editor = "markdown"
book.Theme = "default"
book.Version = time.Now().Unix()
book.Cover = conf.GetDefaultCover()
book.Editor = "markdown"
book.Theme = "default"
err := book.Insert()
if err != nil {
logs.Error("Insert => ",err)
c.JsonResult(6005,"保存项目失败")
logs.Error("Insert => ", err)
c.JsonResult(6005, "保存项目失败")
}
bookResult,err := models.NewBookResult().FindByIdentify(book.Identify,c.Member.MemberId)
bookResult, err := models.NewBookResult().FindByIdentify(book.Identify, c.Member.MemberId)
if err != nil {
beego.Error(err)
}
c.JsonResult(0,"ok",bookResult)
c.JsonResult(0, "ok", bookResult)
}
c.JsonResult(6001,"error")
c.JsonResult(6001, "error")
}
// CreateToken 创建访问来令牌.
@@ -455,22 +453,22 @@ func (c *BookController) CreateToken() {
action := c.GetString("action")
bookResult ,err := c.IsPermission()
bookResult, err := c.IsPermission()
if err != nil {
if err == models.ErrPermissionDenied {
c.JsonResult(403,"权限不足")
c.JsonResult(403, "权限不足")
}
if err == orm.ErrNoRows {
c.JsonResult(404,"项目不存在")
c.JsonResult(404, "项目不存在")
}
logs.Error("生成阅读令牌失败 =>",err)
c.JsonResult(6002,err.Error())
logs.Error("生成阅读令牌失败 =>", err)
c.JsonResult(6002, err.Error())
}
book := models.NewBook()
if _,err := book.Find(bookResult.BookId);err != nil {
c.JsonResult(6001,"项目不存在")
if _, err := book.Find(bookResult.BookId); err != nil {
c.JsonResult(6001, "项目不存在")
}
if action == "create" {
if bookResult.PrivatelyOwned == 0 {
@@ -482,14 +480,14 @@ func (c *BookController) CreateToken() {
logs.Error("生成阅读令牌失败 => ", err)
c.JsonResult(6003, "生成阅读令牌失败")
}
c.JsonResult(0, "ok", c.BaseUrl() + beego.URLFor("DocumentController.Index",":key",book.Identify,"token",book.PrivateToken))
}else{
c.JsonResult(0, "ok", c.BaseUrl()+beego.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,"删除令牌失败")
if err := book.Update(); err != nil {
logs.Error("CreateToken => ", err)
c.JsonResult(6004, "删除令牌失败")
}
c.JsonResult(0,"ok","")
c.JsonResult(0, "ok", "")
}
}
@@ -497,25 +495,25 @@ func (c *BookController) CreateToken() {
func (c *BookController) Delete() {
c.Prepare()
bookResult ,err := c.IsPermission()
bookResult, err := c.IsPermission()
if err != nil {
c.JsonResult(6001,err.Error())
c.JsonResult(6001, err.Error())
}
if bookResult.RoleId != conf.BookFounder {
c.JsonResult(6002,"只有创始人才能删除项目")
c.JsonResult(6002, "只有创始人才能删除项目")
}
err = models.NewBook().ThoroughDeleteBook(bookResult.BookId)
if err == orm.ErrNoRows {
c.JsonResult(6002,"项目不存在")
c.JsonResult(6002, "项目不存在")
}
if err != nil {
logs.Error("删除项目 => ",err)
c.JsonResult(6003,"删除失败")
logs.Error("删除项目 => ", err)
c.JsonResult(6003, "删除失败")
}
c.JsonResult(0,"ok")
c.JsonResult(0, "ok")
}
//发布项目.
@@ -524,15 +522,15 @@ func (c *BookController) Release() {
identify := c.GetString("identify")
book_id := 0
bookId := 0
if c.Member.IsAdministrator() {
book,err := models.NewBook().FindByFieldFirst("identify",identify)
book, err := models.NewBook().FindByFieldFirst("identify", identify)
if err != nil {
}
book_id = book.BookId
}else {
bookId = book.BookId
} else {
book, err := models.NewBookResult().FindByIdentify(identify, c.Member.MemberId)
if err != nil {
@@ -548,15 +546,18 @@ func (c *BookController) Release() {
if book.RoleId != conf.BookAdmin && book.RoleId != conf.BookFounder && book.RoleId != conf.BookEditor {
c.JsonResult(6003, "权限不足")
}
book_id = book.BookId
bookId = book.BookId
}
go func(identify string) {
models.NewDocument().ReleaseContent(book_id)
models.NewDocument().ReleaseContent(bookId)
//当文档发布后,需要删除已缓存的转换项目
outputPath := filepath.Join(beego.AppConfig.DefaultString("book_output_path", "cache"), strconv.Itoa(bookId))
os.RemoveAll(outputPath)
}(identify)
c.JsonResult(0,"发布任务已推送到任务队列,稍后将在后台执行。")
c.JsonResult(0, "发布任务已推送到任务队列,稍后将在后台执行。")
}
//文档排序.
@@ -570,94 +571,91 @@ func (c *BookController) SaveSort() {
book_id := 0
if c.Member.IsAdministrator() {
book,err := models.NewBook().FindByFieldFirst("identify",identify)
book, err := models.NewBook().FindByFieldFirst("identify", identify)
if err != nil {
}
book_id = book.BookId
}else{
bookResult,err := models.NewBookResult().FindByIdentify(identify,c.Member.MemberId)
} else {
bookResult, err := models.NewBookResult().FindByIdentify(identify, c.Member.MemberId)
if err != nil {
beego.Error("DocumentController.Edit => ",err)
beego.Error("DocumentController.Edit => ", err)
c.Abort("403")
}
if bookResult.RoleId == conf.BookObserver {
c.JsonResult(6002,"项目不存在或权限不足")
c.JsonResult(6002, "项目不存在或权限不足")
}
book_id = bookResult.BookId
}
content := c.Ctx.Input.RequestBody
var docs []map[string]interface{}
err := json.Unmarshal(content,&docs)
err := json.Unmarshal(content, &docs)
if err != nil {
beego.Error(err)
c.JsonResult(6003,"数据错误")
c.JsonResult(6003, "数据错误")
}
for _,item := range docs {
if doc_id,ok := item["id"].(float64);ok {
doc,err := models.NewDocument().Find(int(doc_id));
for _, item := range docs {
if doc_id, ok := item["id"].(float64); ok {
doc, err := models.NewDocument().Find(int(doc_id))
if err != nil {
beego.Error(err)
continue;
}
if doc.BookId != book_id {
logs.Info("%s","权限错误")
continue;
}
sort,ok := item["sort"].(float64);
if !ok {
beego.Info("排序数字转换失败 => ",item)
continue
}
parent_id,ok := item["parent"].(float64)
if doc.BookId != book_id {
logs.Info("%s", "权限错误")
continue
}
sort, ok := item["sort"].(float64)
if !ok {
beego.Info("父分类转换失败 => ",item)
beego.Info("排序数字转换失败 => ", item)
continue
}
parent_id, ok := item["parent"].(float64)
if !ok {
beego.Info("父分类转换失败 => ", item)
continue
}
if parent_id > 0 {
if parent,err := models.NewDocument().Find(int(parent_id)); err != nil || parent.BookId != book_id {
if parent, err := models.NewDocument().Find(int(parent_id)); err != nil || parent.BookId != book_id {
continue
}
}
doc.OrderSort = int(sort)
doc.ParentId = int(parent_id)
if err := doc.InsertOrUpdate(); err != nil {
fmt.Printf("%s",err.Error())
fmt.Printf("%s", err.Error())
beego.Error(err)
}
}else{
fmt.Printf("文档ID转换失败 => %+v",item)
} else {
fmt.Printf("文档ID转换失败 => %+v", item)
}
}
c.JsonResult(0,"ok")
c.JsonResult(0, "ok")
}
func (c *BookController) IsPermission() (*models.BookResult,error) {
func (c *BookController) IsPermission() (*models.BookResult, error) {
identify := c.GetString("identify")
book ,err := models.NewBookResult().FindByIdentify(identify,c.Member.MemberId)
book, err := models.NewBookResult().FindByIdentify(identify, c.Member.MemberId)
if err != nil {
if err == models.ErrPermissionDenied {
return book,errors.New("权限不足")
return book, errors.New("权限不足")
}
if err == orm.ErrNoRows {
return book,errors.New("项目不存在")
return book, errors.New("项目不存在")
}
return book,err
return book, err
}
if book.RoleId != conf.BookAdmin && book.RoleId != conf.BookFounder {
return book,errors.New("权限不足")
return book, errors.New("权限不足")
}
return book,nil
return book, nil
}

View File

@@ -3,10 +3,10 @@ package controllers
import (
"errors"
"github.com/lifei6671/mindoc/models"
"github.com/astaxie/beego/orm"
"github.com/astaxie/beego/logs"
"github.com/astaxie/beego/orm"
"github.com/lifei6671/mindoc/conf"
"github.com/lifei6671/mindoc/models"
)
type BookMemberController struct {
@@ -14,31 +14,31 @@ type BookMemberController struct {
}
// AddMember 参加参与用户.
func (c *BookMemberController) AddMember() {
func (c *BookMemberController) AddMember() {
identify := c.GetString("identify")
account := c.GetString("account")
role_id,_ := c.GetInt("role_id",3)
role_id, _ := c.GetInt("role_id", 3)
if identify == "" || account == ""{
c.JsonResult(6001,"参数错误")
if identify == "" || account == "" {
c.JsonResult(6001, "参数错误")
}
book ,err := c.IsPermission()
book, err := c.IsPermission()
if err != nil {
c.JsonResult(6001,err.Error())
c.JsonResult(6001, err.Error())
}
member := models.NewMember()
if _,err := member.FindByAccount(account) ; err != nil {
c.JsonResult(404,"用户不存在")
if _, err := member.FindByAccount(account); err != nil {
c.JsonResult(404, "用户不存在")
}
if member.Status == 1 {
c.JsonResult(6003,"用户已被禁用")
c.JsonResult(6003, "用户已被禁用")
}
if _,err := models.NewRelationship().FindForRoleId(book.BookId,member.MemberId);err == nil {
c.JsonResult(6003,"用户已存在该项目中")
if _, err := models.NewRelationship().FindForRoleId(book.BookId, member.MemberId); err == nil {
c.JsonResult(6003, "用户已存在该项目中")
}
relationship := models.NewRelationship()
@@ -53,53 +53,52 @@ func (c *BookMemberController) AddMember() {
memberRelationshipResult.BookId = book.BookId
memberRelationshipResult.ResolveRoleName()
c.JsonResult(0,"ok",memberRelationshipResult)
c.JsonResult(0, "ok", memberRelationshipResult)
}
c.JsonResult(500,err.Error())
c.JsonResult(500, err.Error())
}
// 变更指定用户在指定项目中的权限
func (c *BookMemberController) ChangeRole() {
identify := c.GetString("identify")
member_id,_ := c.GetInt("member_id",0)
role,_ := c.GetInt("role_id",0)
member_id, _ := c.GetInt("member_id", 0)
role, _ := c.GetInt("role_id", 0)
if identify == "" || member_id <=0 {
c.JsonResult(6001,"参数错误")
if identify == "" || member_id <= 0 {
c.JsonResult(6001, "参数错误")
}
if member_id == c.Member.MemberId {
c.JsonResult(6006,"不能变更自己的权限")
c.JsonResult(6006, "不能变更自己的权限")
}
book ,err := models.NewBookResult().FindByIdentify(identify,c.Member.MemberId)
book, err := models.NewBookResult().FindByIdentify(identify, c.Member.MemberId)
if err != nil {
if err == models.ErrPermissionDenied {
c.JsonResult(403,"权限不足")
c.JsonResult(403, "权限不足")
}
if err == orm.ErrNoRows {
c.JsonResult(404,"项目不存在")
c.JsonResult(404, "项目不存在")
}
c.JsonResult(6002,err.Error())
c.JsonResult(6002, err.Error())
}
if book.RoleId != 0 && book.RoleId != 1 {
c.JsonResult(403,"权限不足")
c.JsonResult(403, "权限不足")
}
member := models.NewMember()
if _,err := member.Find(member_id); err != nil {
c.JsonResult(6003,"用户不存在")
if _, err := member.Find(member_id); err != nil {
c.JsonResult(6003, "用户不存在")
}
if member.Status == 1 {
c.JsonResult(6004,"用户已被禁用")
c.JsonResult(6004, "用户已被禁用")
}
relationship,err := models.NewRelationship().UpdateRoleId(book.BookId,member_id,role);
relationship, err := models.NewRelationship().UpdateRoleId(book.BookId, member_id, role)
if err != nil {
logs.Error("变更用户在项目中的权限 => ",err)
c.JsonResult(6005,err.Error())
logs.Error("变更用户在项目中的权限 => ", err)
c.JsonResult(6005, err.Error())
}
memberRelationshipResult := models.NewMemberRelationshipResult().FromMember(member)
@@ -108,58 +107,58 @@ func (c *BookMemberController) ChangeRole() {
memberRelationshipResult.BookId = book.BookId
memberRelationshipResult.ResolveRoleName()
c.JsonResult(0,"ok",memberRelationshipResult)
c.JsonResult(0, "ok", memberRelationshipResult)
}
// 删除参与者.
func (c *BookMemberController) RemoveMember() {
func (c *BookMemberController) RemoveMember() {
identify := c.GetString("identify")
member_id,_ := c.GetInt("member_id",0)
member_id, _ := c.GetInt("member_id", 0)
if identify == "" || member_id <=0 {
c.JsonResult(6001,"参数错误")
if identify == "" || member_id <= 0 {
c.JsonResult(6001, "参数错误")
}
if member_id == c.Member.MemberId {
c.JsonResult(6006,"不能删除自己")
c.JsonResult(6006, "不能删除自己")
}
book ,err := models.NewBookResult().FindByIdentify(identify,c.Member.MemberId)
book, err := models.NewBookResult().FindByIdentify(identify, c.Member.MemberId)
if err != nil {
if err == models.ErrPermissionDenied {
c.JsonResult(403,"权限不足")
c.JsonResult(403, "权限不足")
}
if err == orm.ErrNoRows {
c.JsonResult(404,"项目不存在")
c.JsonResult(404, "项目不存在")
}
c.JsonResult(6002,err.Error())
c.JsonResult(6002, err.Error())
}
//如果不是创始人也不是管理员则不能操作
if book.RoleId != conf.BookFounder && book.RoleId != conf.BookAdmin {
c.JsonResult(403,"权限不足")
c.JsonResult(403, "权限不足")
}
err = models.NewRelationship().DeleteByBookIdAndMemberId(book.BookId,member_id)
err = models.NewRelationship().DeleteByBookIdAndMemberId(book.BookId, member_id)
if err != nil {
c.JsonResult(6007,err.Error())
c.JsonResult(6007, err.Error())
}
c.JsonResult(0,"ok")
c.JsonResult(0, "ok")
}
func (c *BookMemberController) IsPermission() (*models.BookResult,error) {
func (c *BookMemberController) IsPermission() (*models.BookResult, error) {
identify := c.GetString("identify")
book ,err := models.NewBookResult().FindByIdentify(identify,c.Member.MemberId)
book, err := models.NewBookResult().FindByIdentify(identify, c.Member.MemberId)
if err != nil {
if err == models.ErrPermissionDenied {
return book,errors.New("权限不足")
return book, errors.New("权限不足")
}
if err == orm.ErrNoRows {
return book,errors.New("项目不存在")
return book, errors.New("项目不存在")
}
return book,err
return book, err
}
if book.RoleId != conf.BookAdmin && book.RoleId != conf.BookFounder {
return book,errors.New("权限不足")
return book, errors.New("权限不足")
}
return book,nil
}
return book, nil
}

View File

@@ -4,16 +4,16 @@ type CommentController struct {
BaseController
}
func (c *CommentController) Lists() {
func (c *CommentController) Lists() {
}
func (c *CommentController) Create() {
c.JsonResult(0,"ok")
c.JsonResult(0, "ok")
}
func (c *CommentController) Index() {
func (c *CommentController) Index() {
c.Prepare()
c.TplName = "comment/index.tpl"
}
}

View File

@@ -11,7 +11,7 @@ import (
"strconv"
"strings"
"time"
"net/url"
"image/png"
"bytes"
@@ -21,7 +21,6 @@ import (
"github.com/astaxie/beego/orm"
"github.com/boombuler/barcode"
"github.com/boombuler/barcode/qr"
"github.com/lifei6671/mindoc/commands"
"github.com/lifei6671/mindoc/conf"
"github.com/lifei6671/mindoc/models"
"github.com/lifei6671/mindoc/utils"
@@ -101,12 +100,10 @@ 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() + ").")
c.SetSession("turl", c.Ctx.Request.URL.RequestURI())
if c.IsAjax() {
c.JsonResult(6000, "需要[重]登录。")
c.JsonResult(6000, "请重新登录。")
} else {
c.Redirect(beego.URLFor("AccountController.Login"), 302)
c.Redirect(beego.URLFor("AccountController.Login")+ "?url=" + url.PathEscape(conf.BaseUrl+ c.Ctx.Request.URL.RequestURI()), 302)
}
}
@@ -156,8 +153,7 @@ func (c *DocumentController) Read() {
token := c.GetString("token")
id := c.GetString(":id")
c.Data["DocumentId"] = id // added by dandycheung, 2017-12-08, for exporting
beego.Info("DocumentController.Read(): c.Data[\"DocumentId\"] = ", id, ", IsAjax = ", c.IsAjax())
c.Data["DocumentId"] = id
if identify == "" || id == "" {
c.Abort("404")
@@ -393,7 +389,6 @@ func (c *DocumentController) Create() {
document.Identify = doc_identify
document.Version = time.Now().Unix()
document.DocumentName = doc_name
document.ParentId = parent_id
@@ -438,11 +433,10 @@ func (c *DocumentController) Upload() {
}
beego.Info(conf.GetUploadFileSize())
beego.Info(moreFile.Size)
if conf.GetUploadFileSize() > 0 && moreFile.Size > conf.GetUploadFileSize() {
c.JsonResult(6009,"查过文件允许的上传最大值")
if conf.GetUploadFileSize() > 0 && moreFile.Size > conf.GetUploadFileSize() {
c.JsonResult(6009, "查过文件允许的上传最大值")
}
ext := filepath.Ext(moreFile.Filename)
if ext == "" {
@@ -498,7 +492,7 @@ func (c *DocumentController) Upload() {
}
fileName := "attach_" + strconv.FormatInt(time.Now().UnixNano(), 16)
filePath := filepath.Join(commands.WorkingDirectory, "uploads", time.Now().Format("200601"), fileName+ext)
filePath := filepath.Join(conf.WorkingDirectory, "uploads", time.Now().Format("200601"), fileName+ext)
path := filepath.Dir(filePath)
os.MkdirAll(path, os.ModePerm)
@@ -515,7 +509,7 @@ func (c *DocumentController) Upload() {
attachment.FileName = moreFile.Filename
attachment.CreateAt = c.Member.MemberId
attachment.FileExt = ext
attachment.FilePath = strings.TrimPrefix(filePath, commands.WorkingDirectory)
attachment.FilePath = strings.TrimPrefix(filePath, conf.WorkingDirectory)
attachment.DocumentId = doc_id
if fileInfo, err := os.Stat(filePath); err == nil {
@@ -527,7 +521,7 @@ func (c *DocumentController) Upload() {
}
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)
attachment.HttpPath = "/" + strings.Replace(strings.TrimPrefix(filePath, conf.WorkingDirectory), "\\", "/", -1)
if strings.HasPrefix(attachment.HttpPath, "//") {
attachment.HttpPath = string(attachment.HttpPath[1:])
}
@@ -621,7 +615,7 @@ func (c *DocumentController) DownloadAttachment() {
c.Abort("404")
}
c.Ctx.Output.Download(filepath.Join(commands.WorkingDirectory, attachment.FilePath), attachment.FileName)
c.Ctx.Output.Download(filepath.Join(conf.WorkingDirectory, attachment.FilePath), attachment.FileName)
c.StopRun()
}
@@ -666,7 +660,7 @@ func (c *DocumentController) RemoveAttachment() {
c.JsonResult(6005, "删除失败")
}
os.Remove(filepath.Join(commands.WorkingDirectory, attach.FilePath))
os.Remove(filepath.Join(conf.WorkingDirectory, attach.FilePath))
c.JsonResult(0, "ok", attach)
}
@@ -819,15 +813,13 @@ func (c *DocumentController) Content() {
beego.Error("DocumentHistory InsertOrUpdate => ", err)
}
}
if auto_release {
if auto_release {
go func(identify string) {
models.NewDocument().ReleaseContent(book_id)
}(identify)
}
c.JsonResult(0, "ok", doc)
}
@@ -844,7 +836,6 @@ func (c *DocumentController) Content() {
c.JsonResult(0, "ok", doc)
}
func (c *DocumentController) GetDocumentById(id string) (doc *models.Document, err error) {
doc = models.NewDocument()
if doc_id, err := strconv.Atoi(id); err == nil {
@@ -894,55 +885,33 @@ func (c *DocumentController) Export() {
bookResult = isReadable(identify, token, c)
}
if bookResult.PrivatelyOwned == 0 {
// TODO: 私有项目禁止导出
}
if !strings.HasPrefix(bookResult.Cover,"http:://") && !strings.HasPrefix(bookResult.Cover,"https:://"){
if !strings.HasPrefix(bookResult.Cover, "http:://") && !strings.HasPrefix(bookResult.Cover, "https:://") {
bookResult.Cover = c.BaseUrl() + bookResult.Cover
}
eBookResult,err := bookResult.Converter(c.CruSession.SessionID())
eBookResult, err := bookResult.Converter(c.CruSession.SessionID())
if err != nil {
beego.Error("转换文档失败:" + bookResult.BookName + " -> " + err.Error())
c.Abort("500")
}
if output == "pdf" {
c.Ctx.Output.Download(eBookResult.PDFPath, identify + ".pdf")
c.Ctx.Output.Download(eBookResult.PDFPath, bookResult.BookName+".pdf")
//如果没有开启缓存则10分钟后删除
if !bookResult.IsCacheEBook {
defer func(pdfpath string) {
time.Sleep(time.Minute * 10)
os.Remove(filepath.Dir(pdfpath))
}(eBookResult.PDFPath)
}
c.StopRun()
}else if output == "epub" {
c.Ctx.Output.Download(eBookResult.PDFPath, identify + ".epub")
c.Abort("200")
} else if output == "epub" {
c.Ctx.Output.Download(eBookResult.EpubPath, bookResult.BookName+".epub")
//如果没有开启缓存则10分钟后删除
if !bookResult.IsCacheEBook {
defer func(pdfpath string) {
time.Sleep(time.Minute * 10)
os.Remove(filepath.Dir(pdfpath))
}(eBookResult.EpubPath)
}
c.StopRun()
}else if output == "mobi" {
c.Ctx.Output.Download(eBookResult.PDFPath, identify + ".epub")
c.Abort("200")
} else if output == "mobi" {
c.Ctx.Output.Download(eBookResult.MobiPath, bookResult.BookName+".epub")
//如果没有开启缓存则10分钟后删除
if !bookResult.IsCacheEBook {
defer func(pdfpath string) {
time.Sleep(time.Minute * 10)
os.Remove(filepath.Dir(pdfpath))
}(eBookResult.MobiPath)
}
c.StopRun()
c.Abort("200")
} else if output == "docx" {
c.Ctx.Output.Download(eBookResult.WordPath, bookResult.BookName+".epub")
c.Abort("200")
}
c.Abort("404")

View File

@@ -1,10 +1,12 @@
package controllers
import (
"net/url"
"github.com/astaxie/beego"
"github.com/lifei6671/mindoc/models"
"github.com/lifei6671/mindoc/utils"
"math"
"github.com/lifei6671/mindoc/conf"
)
type HomeController struct {
@@ -16,9 +18,9 @@ func (c *HomeController) Index() {
c.TplName = "home/index.tpl"
//如果没有开启匿名访问,则跳转到登录页面
if !c.EnableAnonymous && c.Member == nil {
c.Redirect(beego.URLFor("AccountController.Login"),302)
c.Redirect(beego.URLFor("AccountController.Login") + "?url=" + url.PathEscape(conf.BaseUrl + c.Ctx.Request.URL.RequestURI()), 302)
}
pageIndex,_ := c.GetInt("page",1)
pageIndex, _ := c.GetInt("page", 1)
pageSize := 18
member_id := 0
@@ -26,7 +28,7 @@ func (c *HomeController) Index() {
if c.Member != nil {
member_id = c.Member.MemberId
}
books,totalCount,err := models.NewBook().FindForHomeToPager(pageIndex,pageSize,member_id)
books, totalCount, err := models.NewBook().FindForHomeToPager(pageIndex, pageSize, member_id)
if err != nil {
beego.Error(err)
@@ -36,18 +38,18 @@ func (c *HomeController) Index() {
html := utils.GetPagerHtml(c.Ctx.Request.RequestURI, pageIndex, pageSize, totalCount)
c.Data["PageHtml"] = html
}else {
} else {
c.Data["PageHtml"] = ""
}
c.Data["TotalPages"] = int(math.Ceil(float64(totalCount) / float64(pageSize)))
c.Data["Lists"] = books
labels ,totalCount,err := models.NewLabel().FindToPager(1,10)
labels, totalCount, err := models.NewLabel().FindToPager(1, 10)
if err != nil {
c.Data["Labels"] = make([]*models.Label,0)
}else{
c.Data["Labels"] = make([]*models.Label, 0)
} else {
c.Data["Labels"] = labels
}
}

View File

@@ -1,10 +1,10 @@
package controllers
import (
"github.com/lifei6671/mindoc/models"
"github.com/astaxie/beego/orm"
"github.com/astaxie/beego"
"github.com/astaxie/beego/orm"
"github.com/lifei6671/mindoc/conf"
"github.com/lifei6671/mindoc/models"
"github.com/lifei6671/mindoc/utils"
"math"
)
@@ -18,7 +18,7 @@ func (c *LabelController) Prepare() {
//如果没有开启你们访问则跳转到登录
if !c.EnableAnonymous && c.Member == nil {
c.Redirect(beego.URLFor("AccountController.Login"),302)
c.Redirect(beego.URLFor("AccountController.Login"), 302)
return
}
}
@@ -29,16 +29,16 @@ func (c *LabelController) Index() {
c.TplName = "label/index.tpl"
labelName := c.Ctx.Input.Param(":key")
pageIndex,_ := c.GetInt("page",1)
pageIndex, _ := c.GetInt("page", 1)
if labelName == "" {
c.Abort("404")
}
_,err := models.NewLabel().FindFirst("label_name",labelName)
_, err := models.NewLabel().FindFirst("label_name", labelName)
if err != nil {
if err == orm.ErrNoRows {
c.Abort("404")
}else{
} else {
beego.Error(err)
c.Abort("500")
}
@@ -47,7 +47,7 @@ func (c *LabelController) Index() {
if c.Member != nil {
member_id = c.Member.MemberId
}
search_result,totalCount,err := models.NewBook().FindForLabelToPager(labelName,pageIndex,conf.PageSize,member_id)
search_result, totalCount, err := models.NewBook().FindForLabelToPager(labelName, pageIndex, conf.PageSize, member_id)
if err != nil {
beego.Error(err)
@@ -57,7 +57,7 @@ func (c *LabelController) Index() {
html := utils.GetPagerHtml(c.Ctx.Request.RequestURI, pageIndex, conf.PageSize, totalCount)
c.Data["PageHtml"] = html
}else {
} else {
c.Data["PageHtml"] = ""
}
c.Data["Lists"] = search_result
@@ -69,25 +69,22 @@ func (c *LabelController) List() {
c.Prepare()
c.TplName = "label/list.tpl"
pageIndex,_ := c.GetInt("page",1)
pageIndex, _ := c.GetInt("page", 1)
pageSize := 200
labels ,totalCount,err := models.NewLabel().FindToPager(pageIndex,pageSize)
labels, totalCount, err := models.NewLabel().FindToPager(pageIndex, pageSize)
if err != nil {
c.ShowErrorPage(50001,err.Error())
c.ShowErrorPage(50001, err.Error())
}
if totalCount > 0 {
html := utils.GetPagerHtml(c.Ctx.Request.RequestURI, pageIndex, pageSize, totalCount)
c.Data["PageHtml"] = html
}else {
} else {
c.Data["PageHtml"] = ""
}
c.Data["TotalPages"] = int(math.Ceil(float64(totalCount) / float64(pageSize)))
c.Data["Labels"] = labels
}

View File

@@ -13,7 +13,6 @@ import (
"github.com/lifei6671/mindoc/models"
"github.com/lifei6671/mindoc/utils"
"path/filepath"
"github.com/lifei6671/mindoc/commands"
"strconv"
)
@@ -21,7 +20,7 @@ type ManagerController struct {
BaseController
}
func (c *ManagerController) Prepare (){
func (c *ManagerController) Prepare() {
c.BaseController.Prepare()
if !c.Member.IsAdministrator() {
@@ -42,7 +41,7 @@ func (c *ManagerController) Users() {
pageIndex, _ := c.GetInt("page", 0)
members, totalCount, err := models.NewMember().FindToPager(pageIndex, 15)
members, totalCount, err := models.NewMember().FindToPager(pageIndex, conf.PageSize)
if err != nil {
c.Data["ErrorMessage"] = err.Error()
@@ -50,7 +49,7 @@ func (c *ManagerController) Users() {
}
if totalCount > 0 {
html := utils.GetPagerHtml(c.Ctx.Request.RequestURI, pageIndex, 10, int(totalCount))
html := utils.GetPagerHtml(c.Ctx.Request.RequestURI, pageIndex, conf.PageSize, int(totalCount))
c.Data["PageHtml"] = html
} else {
@@ -139,10 +138,10 @@ func (c *ManagerController) UpdateMemberStatus() {
c.JsonResult(6002, "用户不存在")
}
if member.MemberId == c.Member.MemberId {
c.JsonResult(6004,"不能变更自己的状态")
c.JsonResult(6004, "不能变更自己的状态")
}
if member.Role == conf.MemberSuperRole {
c.JsonResult(6005,"不能变更超级管理员的状态")
c.JsonResult(6005, "不能变更超级管理员的状态")
}
member.Status = status
@@ -171,10 +170,10 @@ func (c *ManagerController) ChangeMemberRole() {
c.JsonResult(6002, "用户不存在")
}
if member.MemberId == c.Member.MemberId {
c.JsonResult(6004,"不能变更自己的权限")
c.JsonResult(6004, "不能变更自己的权限")
}
if member.Role == conf.MemberSuperRole {
c.JsonResult(6005,"不能变更超级管理员的权限")
c.JsonResult(6005, "不能变更超级管理员的权限")
}
member.Role = role
@@ -191,13 +190,13 @@ func (c *ManagerController) EditMember() {
c.Prepare()
c.TplName = "manager/edit_users.tpl"
member_id,_ := c.GetInt(":id",0)
member_id, _ := c.GetInt(":id", 0)
if member_id <= 0 {
c.Abort("404")
}
member ,err := models.NewMember().Find(member_id)
member, err := models.NewMember().Find(member_id)
if err != nil {
beego.Error(err)
@@ -213,64 +212,64 @@ func (c *ManagerController) EditMember() {
member.Phone = phone
member.Description = description
if password1 != "" && password2 != password1 {
c.JsonResult(6001,"确认密码不正确")
c.JsonResult(6001, "确认密码不正确")
}
if password1 != "" && member.AuthMethod != conf.AuthMethodLDAP{
if password1 != "" && member.AuthMethod != conf.AuthMethodLDAP {
member.Password = password1
}
if err := member.Valid(password1 == "");err != nil {
c.JsonResult(6002,err.Error())
if err := member.Valid(password1 == ""); err != nil {
c.JsonResult(6002, err.Error())
}
if password1 != "" {
password,err := utils.PasswordHash(password1)
password, err := utils.PasswordHash(password1)
if err != nil {
beego.Error(err)
c.JsonResult(6003,"对用户密码加密时出错")
c.JsonResult(6003, "对用户密码加密时出错")
}
member.Password = password
}
if err := member.Update();err != nil {
if err := member.Update(); err != nil {
beego.Error(err)
c.JsonResult(6004,"保存失败")
c.JsonResult(6004, "保存失败")
}
c.JsonResult(0,"ok")
c.JsonResult(0, "ok")
}
c.Data["Model"] = member
}
//删除一个用户,并将该用户的所有信息转移到超级管理员上.
func (c *ManagerController) DeleteMember() {
func (c *ManagerController) DeleteMember() {
c.Prepare()
member_id,_ := c.GetInt("id",0)
member_id, _ := c.GetInt("id", 0)
if member_id <= 0 {
c.JsonResult(404,"参数错误")
c.JsonResult(404, "参数错误")
}
member ,err := models.NewMember().Find(member_id)
member, err := models.NewMember().Find(member_id)
if err != nil {
beego.Error(err)
c.JsonResult(500,"用户不存在")
c.JsonResult(500, "用户不存在")
}
if member.Role == conf.MemberSuperRole {
c.JsonResult(500,"不能删除超级管理员")
c.JsonResult(500, "不能删除超级管理员")
}
superMember,err := models.NewMember().FindByFieldFirst("role",0)
superMember, err := models.NewMember().FindByFieldFirst("role", 0)
if err != nil {
beego.Error(err)
c.JsonResult(5001,"未能找到超级管理员")
c.JsonResult(5001, "未能找到超级管理员")
}
err = models.NewMember().Delete(member_id,superMember.MemberId)
err = models.NewMember().Delete(member_id, superMember.MemberId)
if err != nil {
beego.Error(err)
c.JsonResult(5002,"删除失败")
c.JsonResult(5002, "删除失败")
}
c.JsonResult(0,"ok")
c.JsonResult(0, "ok")
}
//项目列表.
@@ -572,9 +571,9 @@ func (c *ManagerController) AttachList() {
c.Data["PageHtml"] = ""
}
for _,item := range attachList {
for _, item := range attachList {
p := filepath.Join(commands.WorkingDirectory,item.FilePath)
p := filepath.Join(conf.WorkingDirectory, item.FilePath)
item.IsExist = utils.FileExists(p)
@@ -583,27 +582,27 @@ func (c *ManagerController) AttachList() {
}
//附件详情.
func (c *ManagerController) AttachDetailed() {
func (c *ManagerController) AttachDetailed() {
c.Prepare()
c.TplName = "manager/attach_detailed.tpl"
attach_id,_ := strconv.Atoi(c.Ctx.Input.Param(":id"))
attach_id, _ := strconv.Atoi(c.Ctx.Input.Param(":id"))
if attach_id <= 0 {
c.Abort("404")
}
attach,err := models.NewAttachmentResult().Find(attach_id)
attach, err := models.NewAttachmentResult().Find(attach_id)
if err != nil {
beego.Error("AttachDetailed => ",err)
beego.Error("AttachDetailed => ", err)
if err == orm.ErrNoRows {
c.Abort("404")
}else{
} else {
c.Abort("500")
}
}
attach.FilePath = filepath.Join(commands.WorkingDirectory,attach.FilePath)
attach.FilePath = filepath.Join(conf.WorkingDirectory, attach.FilePath)
attach.HttpPath = c.BaseUrl() + attach.HttpPath
attach.IsExist = utils.FileExists(attach.FilePath)
@@ -612,43 +611,22 @@ func (c *ManagerController) AttachDetailed() {
}
//删除附件.
func (c *ManagerController) AttachDelete() {
func (c *ManagerController) AttachDelete() {
c.Prepare()
attach_id,_ := c.GetInt("attach_id")
attach_id, _ := c.GetInt("attach_id")
if attach_id <= 0 {
c.Abort("404")
}
attach,err := models.NewAttachment().Find(attach_id)
attach, err := models.NewAttachment().Find(attach_id)
if err != nil {
beego.Error("AttachDelete => ",err)
c.JsonResult(6001,err.Error())
beego.Error("AttachDelete => ", err)
c.JsonResult(6001, err.Error())
}
if err := attach.Delete();err != nil {
beego.Error("AttachDelete => ",err)
c.JsonResult(6002,err.Error())
if err := attach.Delete(); err != nil {
beego.Error("AttachDelete => ", err)
c.JsonResult(6002, err.Error())
}
c.JsonResult(0,"ok")
c.JsonResult(0, "ok")
}

View File

@@ -1,31 +1,31 @@
package controllers
import (
"github.com/lifei6671/mindoc/models"
"github.com/lifei6671/mindoc/conf"
"github.com/lifei6671/mindoc/utils"
"github.com/astaxie/beego"
"strings"
"github.com/lifei6671/mindoc/conf"
"github.com/lifei6671/mindoc/models"
"github.com/lifei6671/mindoc/utils"
"regexp"
"strconv"
"strings"
)
type SearchController struct {
BaseController
}
func (c *SearchController) Index() {
func (c *SearchController) Index() {
c.Prepare()
c.TplName = "search/index.tpl"
//如果没有开启你们访问则跳转到登录
if !c.EnableAnonymous && c.Member == nil {
c.Redirect(beego.URLFor("AccountController.Login"),302)
c.Redirect(beego.URLFor("AccountController.Login"), 302)
return
}
keyword := c.GetString("keyword")
pageIndex,_ := c.GetInt("page",1)
pageIndex, _ := c.GetInt("page", 1)
c.Data["BaseUrl"] = c.BaseUrl()
@@ -35,7 +35,7 @@ func (c *SearchController) Index() {
if c.Member != nil {
member_id = c.Member.MemberId
}
search_result,totalCount,err := models.NewDocumentSearchResult().FindToPager(keyword,pageIndex,conf.PageSize,member_id)
search_result, totalCount, err := models.NewDocumentSearchResult().FindToPager(keyword, pageIndex, conf.PageSize, member_id)
if err != nil {
beego.Error(err)
@@ -45,12 +45,12 @@ func (c *SearchController) Index() {
html := utils.GetPagerHtml(c.Ctx.Request.RequestURI, pageIndex, conf.PageSize, totalCount)
c.Data["PageHtml"] = html
}else {
} else {
c.Data["PageHtml"] = ""
}
if len(search_result) > 0 {
for _,item := range search_result {
item.DocumentName = strings.Replace(item.DocumentName,keyword,"<em>" + keyword + "</em>",-1)
for _, item := range search_result {
item.DocumentName = strings.Replace(item.DocumentName, keyword, "<em>"+keyword+"</em>", -1)
if item.Description != "" {
src := item.Description
@@ -79,13 +79,13 @@ func (c *SearchController) Index() {
if len(r) > 100 {
src = string(r[:100])
}else{
} else {
src = string(r)
}
item.Description = strings.Replace(src, keyword, "<em>" + keyword + "</em>", -1)
item.Description = strings.Replace(src, keyword, "<em>"+keyword+"</em>", -1)
}
if item.Identify == ""{
if item.Identify == "" {
item.Identify = strconv.Itoa(item.DocumentId)
}
if item.ModifyTime.IsZero() {

View File

@@ -3,24 +3,23 @@ package controllers
import (
"fmt"
"os"
"strings"
"path/filepath"
"strconv"
"strings"
"time"
"github.com/astaxie/beego/logs"
"github.com/lifei6671/mindoc/conf"
"github.com/lifei6671/mindoc/graphics"
"github.com/lifei6671/mindoc/models"
"github.com/lifei6671/mindoc/utils"
"github.com/lifei6671/mindoc/graphics"
"github.com/lifei6671/mindoc/conf"
"github.com/lifei6671/mindoc/commands"
)
type SettingController struct {
BaseController
}
func (c *SettingController) Index() {
func (c *SettingController) Index() {
c.TplName = "setting/index.tpl"
if c.Ctx.Input.IsPost() {
@@ -43,131 +42,129 @@ func (c *SettingController) Index() {
}
}
func (c *SettingController) Password() {
func (c *SettingController) Password() {
c.TplName = "setting/password.tpl"
if c.Ctx.Input.IsPost() {
if c.Member.AuthMethod == conf.AuthMethodLDAP {
c.JsonResult(6009,"当前用户不支持修改密码")
c.JsonResult(6009, "当前用户不支持修改密码")
}
password1 := c.GetString("password1")
password2 := c.GetString("password2")
password3 := c.GetString("password3")
if password1 == "" {
c.JsonResult(6003,"原密码不能为空")
c.JsonResult(6003, "原密码不能为空")
}
if password2 == "" {
c.JsonResult(6004,"新密码不能为空")
c.JsonResult(6004, "新密码不能为空")
}
if count := strings.Count(password2,""); count < 6 || count > 18 {
c.JsonResult(6009,"密码必须在6-18字之间")
if count := strings.Count(password2, ""); count < 6 || count > 18 {
c.JsonResult(6009, "密码必须在6-18字之间")
}
if password2 != password3 {
c.JsonResult(6003,"确认密码不正确")
c.JsonResult(6003, "确认密码不正确")
}
if ok,_ := utils.PasswordVerify(c.Member.Password,password1) ; !ok {
c.JsonResult(6005,"原始密码不正确")
if ok, _ := utils.PasswordVerify(c.Member.Password, password1); !ok {
c.JsonResult(6005, "原始密码不正确")
}
if password1 == password2 {
c.JsonResult(6006,"新密码不能和原始密码相同")
c.JsonResult(6006, "新密码不能和原始密码相同")
}
pwd,err := utils.PasswordHash(password2)
pwd, err := utils.PasswordHash(password2)
if err != nil {
c.JsonResult(6007,"密码加密失败")
c.JsonResult(6007, "密码加密失败")
}
c.Member.Password = pwd
if err := c.Member.Update();err != nil {
c.JsonResult(6008,err.Error())
if err := c.Member.Update(); err != nil {
c.JsonResult(6008, err.Error())
}
c.JsonResult(0,"ok")
c.JsonResult(0, "ok")
}
}
// Upload 上传图片
func (c *SettingController) Upload() {
file,moreFile,err := c.GetFile("image-file")
file, moreFile, err := c.GetFile("image-file")
defer file.Close()
if err != nil {
logs.Error("",err.Error())
c.JsonResult(500,"读取文件异常")
logs.Error("", err.Error())
c.JsonResult(500, "读取文件异常")
}
ext := filepath.Ext(moreFile.Filename)
if !strings.EqualFold(ext,".png") && !strings.EqualFold(ext,".jpg") && !strings.EqualFold(ext,".gif") && !strings.EqualFold(ext,".jpeg") {
c.JsonResult(500,"不支持的图片格式")
if !strings.EqualFold(ext, ".png") && !strings.EqualFold(ext, ".jpg") && !strings.EqualFold(ext, ".gif") && !strings.EqualFold(ext, ".jpeg") {
c.JsonResult(500, "不支持的图片格式")
}
x1 ,_ := strconv.ParseFloat(c.GetString("x"),10)
y1 ,_ := strconv.ParseFloat(c.GetString("y"),10)
w1 ,_ := strconv.ParseFloat(c.GetString("width"),10)
h1 ,_ := strconv.ParseFloat(c.GetString("height"),10)
x1, _ := strconv.ParseFloat(c.GetString("x"), 10)
y1, _ := strconv.ParseFloat(c.GetString("y"), 10)
w1, _ := strconv.ParseFloat(c.GetString("width"), 10)
h1, _ := strconv.ParseFloat(c.GetString("height"), 10)
x := int(x1)
y := int(y1)
width := int(w1)
height := int(h1)
fmt.Println(x,x1,y,y1)
fmt.Println(x, x1, y, y1)
fileName := "avatar_" + strconv.FormatInt(time.Now().UnixNano(), 16)
fileName := "avatar_" + strconv.FormatInt(time.Now().UnixNano(), 16)
filePath := filepath.Join(commands.WorkingDirectory,"uploads" , time.Now().Format("200601") , fileName + ext)
filePath := filepath.Join(conf.WorkingDirectory, "uploads", time.Now().Format("200601"), fileName+ext)
path := filepath.Dir(filePath)
os.MkdirAll(path, os.ModePerm)
err = c.SaveToFile("image-file",filePath)
err = c.SaveToFile("image-file", filePath)
if err != nil {
logs.Error("",err)
c.JsonResult(500,"图片保存失败")
logs.Error("", err)
c.JsonResult(500, "图片保存失败")
}
//剪切图片
subImg,err := graphics.ImageCopyFromFile(filePath,x,y,width,height)
subImg, err := graphics.ImageCopyFromFile(filePath, x, y, width, height)
if err != nil {
logs.Error("ImageCopyFromFile => ",err)
c.JsonResult(6001,"头像剪切失败")
logs.Error("ImageCopyFromFile => ", err)
c.JsonResult(6001, "头像剪切失败")
}
os.Remove(filePath)
filePath = filepath.Join(commands.WorkingDirectory,"uploads" , time.Now().Format("200601") , fileName + "_small" + ext)
filePath = filepath.Join(conf.WorkingDirectory, "uploads", time.Now().Format("200601"), fileName+"_small"+ext)
err = graphics.ImageResizeSaveFile(subImg,120,120,filePath)
err = graphics.ImageResizeSaveFile(subImg, 120, 120, filePath)
//err = graphics.SaveImage(filePath,subImg)
if err != nil {
logs.Error("保存文件失败 => ",err.Error())
c.JsonResult(500,"保存文件失败")
logs.Error("保存文件失败 => ", err.Error())
c.JsonResult(500, "保存文件失败")
}
url := "/" + strings.Replace(strings.TrimPrefix(filePath,commands.WorkingDirectory),"\\","/",-1)
if strings.HasPrefix(url,"//") {
url := "/" + strings.Replace(strings.TrimPrefix(filePath, conf.WorkingDirectory), "\\", "/", -1)
if strings.HasPrefix(url, "//") {
url = string(url[1:])
}
if member,err := models.NewMember().Find(c.Member.MemberId);err == nil {
if member, err := models.NewMember().Find(c.Member.MemberId); err == nil {
avater := member.Avatar
member.Avatar = url
err := member.Update();
err := member.Update()
if err == nil {
if strings.HasPrefix(avater,"/uploads/") {
os.Remove(filepath.Join(commands.WorkingDirectory,avater))
if strings.HasPrefix(avater, "/uploads/") {
os.Remove(filepath.Join(conf.WorkingDirectory, avater))
}
c.SetMember(*member)
}else{
c.JsonResult(60001,"保存头像失败")
} else {
c.JsonResult(60001, "保存头像失败")
}
}
c.JsonResult(0,"ok",url)
}
c.JsonResult(0, "ok", url)
}