forked from TruthHun/BookStack
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathBaseController.go
More file actions
218 lines (192 loc) · 8.03 KB
/
BaseController.go
File metadata and controls
218 lines (192 loc) · 8.03 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
package api
import (
"compress/gzip"
"encoding/json"
"fmt"
"io"
"net/http"
"strconv"
"strings"
"sync"
"time"
"github.com/astaxie/beego/orm"
"github.com/TruthHun/BookStack/utils"
"github.com/TruthHun/BookStack/models"
"github.com/astaxie/beego"
)
type BaseController struct {
beego.Controller
Token string
}
type APIResponse struct {
Message string `json:"message"`
Data interface{} `json:"data,omitempty"`
}
type APIUser struct {
Uid int `json:"uid"`
Token string `json:"token,omitempty"`
Account string `json:"username,omitempty"` //对应 member.account
Nickname string `json:"nickname"`
Email string `json:"email,omitempty"`
Phone string `json:"phone,omitempty"`
Avatar string `json:"avatar"`
Description string `json:"intro,omitempty"`
}
type APIBook struct {
BookId int `json:"book_id"`
BookName string `json:"book_name"`
Identify string `json:"identify"`
OrderIndex int `json:"sort"`
Description string `json:"description"`
Label string `json:"tags"`
Vcnt int `json:"view"` // 阅读
Star int `json:"star"` // 收藏
Lang string `json:"lang"`
Cover string `json:"cover"`
Score int `json:"score"` // 文档项目评分,默认40,即4.0星
CntScore int `json:"cnt_score"` // 评分个数
CntComment int `json:"cnt_comment"` // 评论人数
DocCount int `json:"cnt_doc"` // 章节数量
ReleaseTime time.Time `json:"updated_at"` // 更新时间。这里用书籍的release_time 作为最后的更新时间。因为现有的更新时间不准
CreateTime time.Time `json:"created_at"` // 新建时间
MemberId int `json:"uid,omitempty"`
User string `json:"user,omitempty"` // 分享人
Author string `json:"author,omitempty"` // 原作者
AuthorURL string `json:"author_url,omitempty"` // 原作者连接地址
DocReaded int `json:"cnt_readed"` //已读章节
IsStar bool `json:"is_star"` //是否已收藏到书架
//PrivatelyOwned int `json:"private"`
}
type APIRegister struct {
Nickname string `form:"nickname"`
Account string `form:"username"`
Password string `form:"password"`
RePassword string `form:"re_password"`
Email string `form:"email"`
}
type APIDoc struct {
DocumentId int `json:"id"`
ParentId int `json:"pid"`
DocumentName string `json:"title"`
Identify string `json:"identify"`
BookId int `json:"book_id"`
BookName string `json:"book_name"`
OrderSort int `json:"sort"`
Release string `json:"content,omitempty"`
CreateTime time.Time `json:"created_at,omitempty"`
MemberId int `json:"uid"`
ModifyTime time.Time `json:"updated_at,omitempty"`
Vcnt int `json:"vcnt"`
Readed bool `json:"readed"`
Bookmark bool `json:"bookmark"`
}
type APIDocV2 struct {
DocumentId int `json:"id"`
ParentId int `json:"pid"`
DocumentName string `json:"title"`
Identify string `json:"identify"`
BookId int `json:"book_id"`
BookName string `json:"book_name"`
OrderSort int `json:"sort"`
Release interface{} `json:"content,omitempty"`
CreateTime time.Time `json:"created_at,omitempty"`
MemberId int `json:"uid"`
ModifyTime time.Time `json:"updated_at,omitempty"`
Vcnt int `json:"vcnt"`
Readed bool `json:"readed"`
Bookmark bool `json:"bookmark"`
}
type WechatForm struct {
UserInfo string `form:"userInfo"`
Code string `form:"code"`
}
type WechatBindForm struct {
Username string `form:"username"`
Password string `form:"password"`
RePassword string `form:"re_password"`
Nickname string `form:"nickname"`
Email string `form:"email"`
Sess string `form:"sess"`
}
//###################################//
const (
messageInternalServerError = "服务内部错误,请联系管理员"
messageUsernameOrPasswordError = "用户名或密码不正确"
messageLoginSuccess = "登录成功"
messageRequiredLogin = "您未登录或者您的登录已过期,请重新登录"
messageLogoutSuccess = "退出登录成功"
messageSuccess = "操作成功"
messageBadRequest = "请求参数不正确"
messageNotFound = "资源不存在"
messageEmailError = "邮箱格式不正确"
messageRequiredInput = "请输入必填项"
messageNotEqualTwicePassword = "两次输入密码不一致"
maxPageSize = 30
)
// 微信小程序支持的 HTML 标签:https://developers.weixin.qq.com/miniprogram/dev/component/rich-text.html
var weixinTags = []string{"a", "abbr", "address", "article", "aside", "b", "bdi", "bdo", "big", "blockquote", "br", "caption", "center", "cite", "code", "col", "colgroup", "dd", "del", "div", "dl", "dt", "em", "fieldset", "font", "footer", "h1", "h2", "h3", "h4", "h5", "h6", "header", "hr", "i", "img", "ins", "label", "legend", "li", "mark", "nav", "ol", "p", "pre", "q", "rt", "ruby", "s", "section", "small", "span", "strong", "sub", "sup", "table", "tbody", "td", "tfoot", "th", " thead", "tr", "tt", "u", "ul"}
var appTags = []string{"a", "abbr", "b", "blockquote", "br", "code", "col", "colgroup", "dd", "del", "div", "dl", "dt", "em", "fieldset", "h1", "h2", "h3", "h4", "h5", "h6", "header", "hr", "i", "img", "ins", "label", "legend", "li", "ol", "p", "q", "span", "strong", "sub", "sup", "table", "tbody", "td", "tfoot", "th", "thead", "tr", "tt", "ul"}
var weixinTagsMap, appTagsMap sync.Map
func init() {
for _, tag := range weixinTags {
weixinTagsMap.Store(tag, true)
}
for _, tag := range appTags {
appTagsMap.Store(tag, true)
}
}
//###################################//
func (this *BaseController) Response(httpStatus int, message string, data ...interface{}) {
resp := APIResponse{Message: message}
if len(data) > 0 {
resp.Data = data[0]
}
returnJSON, err := json.Marshal(resp)
if err != nil {
beego.Error(err)
}
this.Ctx.ResponseWriter.Header().Set("Content-Type", "application/json; charset=utf-8")
if strings.Contains(strings.ToLower(this.Ctx.Request.Header.Get("Accept-Encoding")), "gzip") { //gzip压缩
this.Ctx.ResponseWriter.Header().Set("Content-Encoding", "gzip")
this.Ctx.ResponseWriter.WriteHeader(httpStatus)
w := gzip.NewWriter(this.Ctx.ResponseWriter)
defer w.Close()
w.Write(returnJSON)
w.Flush()
} else {
io.WriteString(this.Ctx.ResponseWriter, string(returnJSON))
}
this.StopRun()
}
// 验证access token
func (this *BaseController) Prepare() {
//在微信小程序中:网络请求的 referer 是不可以设置的,格式固定为 https://servicewechat.com/{appid}/{version}/page-frame.html,其中 {appid} 为小程序的 appid,{version} 为小程序的版本号,版本号为 0 表示为开发版。
appId := strings.ToLower(beego.AppConfig.DefaultString("appid", ""))
limitReferer := beego.AppConfig.DefaultBool("limitReferer", false)
if appId != "" && limitReferer && beego.AppConfig.String("runmode") != "dev" { // 限定请求的微信小程序的appid
prefix := fmt.Sprintf("https://servicewechat.com/%v/", appId)
if !strings.HasPrefix(strings.ToLower(this.Ctx.Request.Referer()), prefix) {
this.Response(http.StatusNotFound, "not found")
}
}
this.Token = this.Ctx.Request.Header.Get("Authorization")
}
func (this *BaseController) isLogin() (uid int) {
return models.NewAuth().GetByToken(this.Token).Uid
}
func (this *BaseController) completeLink(path string) string {
if path == "" {
return ""
}
return utils.JoinURL(models.GetAPIStaticDomain(), path)
}
// 根据标识查询书籍id,标识可以是数字也可以是字符串
func (this *BaseController) getBookIdByIdentify(identify string) (bookId int) {
bookId, _ = strconv.Atoi(identify)
if bookId > 0 {
return
}
book := models.NewBook()
orm.NewOrm().QueryTable(book).Filter("identify", identify).One(book, "book_id")
return book.BookId
}