-
Notifications
You must be signed in to change notification settings - Fork 0
/
route.go
290 lines (273 loc) · 7.01 KB
/
route.go
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
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
package main
import (
"fmt"
"strconv"
"time"
"github.com/gin-gonic/gin"
)
type LoginResponseData struct {
Username string `json: "username"`
Uid int `json: "uid"`
Token string `json: "token"`
ExpireTime time.Time `json: "expire_time"`
}
type DeliveryPost struct {
Content string `json: "content"`
Title string `json: "title"`
}
type DeliveryComment struct {
Content string `json: "content"`
ReplyText string `json: "reply_text,omitempty"`
}
type RenderPost struct {
Content string `json: "content"`
Title string `json: "title`
Pid int `json: "pid"`
Likes int `json: "likes"`
Replys int `json: "replys"`
}
type RenderComment struct {
Name string `json: "name"` // 表示回复者的名字
Content string `json: "content"`
ReplyText string `json: "reply_text,omitempty"` // 楼中楼
}
// 注册和登陆采用表单
func Register(c *gin.Context) {
username, ok := c.GetPostForm("username")
var response UniverseResponse
if !ok || username == "" {
response = ErrorResponse(fmt.Sprint("Bad Username"))
c.JSON(400, response)
return
}
password, ok := c.GetPostForm("password")
if !ok || password == "" {
response = ErrorResponse(fmt.Sprintf("check your password"))
c.JSON(400, response)
return
}
err := SaveUser(username, password)
if err != nil {
response = ErrorResponse(fmt.Sprintf("Register failed, please contact admin"))
c.JSON(400, response)
return
}
response = SuccessResponse(nil)
c.JSON(200, response)
return
}
func Login(c *gin.Context) {
username, ok := c.GetPostForm("username")
var response UniverseResponse
if !ok || username == "" {
response = ErrorResponse(fmt.Sprint("Bad Username"))
c.JSON(400, response)
return
}
password, ok := c.GetPostForm("password")
if !ok || password == "" {
response = ErrorResponse(fmt.Sprintf("check your password"))
c.JSON(400, response)
return
}
passwordHash := HashStr(password)
user, err := FindUserByUsername(username, passwordHash)
if err != nil {
response = ErrorResponse(fmt.Sprintln(err))
c.JSON(400, response)
return
}
uid := user.Id
token, expireTime, err2 := GenToken(uid)
if err2 != nil {
response = ErrorResponse(fmt.Sprintf("Generate token failed, please contact admin"))
c.JSON(400, response)
return
}
//token, exprire_at := GenToken(uid)
loginResponseData := LoginResponseData{
Username: username,
Uid: uid,
Token: token,
ExpireTime: expireTime,
}
response = SuccessResponse(loginResponseData)
c.JSON(200, response)
return
}
func GetUserInfo(c *gin.Context) {
uid, ok := c.Get("uid")
var response UniverseResponse
if !ok {
response = ErrorResponse(fmt.Sprintf("can not get the info by token"))
c.JSON(400, response)
return
}
user, err := FindUserByUid(uid.(int))
if err != nil {
response = ErrorResponse(fmt.Sprintf("can not find user"))
c.JSON(400, response)
return
}
username := user.Name
response = SuccessResponse(gin.H{
"username": username,
"uid": user.Id,
})
c.JSON(200, response)
return
}
func PostNewPost(c *gin.Context) {
uid, ok := c.Get("uid")
var response UniverseResponse
if !ok {
response = ErrorResponse(fmt.Sprintf("can not get the info by token"))
c.JSON(400, response)
return
}
var newpost DeliveryPost
err := c.BindJSON(&newpost)
if err != nil {
response = ErrorResponse(fmt.Sprintf("invalid json format"))
c.JSON(400, response)
return
}
err2 := PostOne(newpost.Content, newpost.Title, newpost.Title, uid.(int))
if err2 != nil {
response = ErrorResponse(fmt.Sprintf("store post error, please contact the admin"))
c.JSON(400, response)
return
}
response = SuccessResponse(nil)
c.JSON(200, response)
}
// 首先是获取参数
func PostNewComment(c *gin.Context) {
pid := c.Param("pid") // 获取pid
uid, ok := c.Get("uid")
var response UniverseResponse
if !ok {
response = ErrorResponse(fmt.Sprintf("can not get the info by token"))
c.JSON(400, response)
return
}
var comment DeliveryComment
err := c.BindJSON(&comment)
if err != nil {
response = ErrorResponse(fmt.Sprint("invalid json format"))
c.JSON(400, response)
return
}
pid2, err3 := strconv.Atoi(pid)
if err3 != nil {
response = ErrorResponse(fmt.Sprintf("invalid pid"))
c.JSON(400, response)
return
}
err2 := PostComment(comment.Content, comment.ReplyText, uid.(int), pid2)
if err2 != nil {
response = ErrorResponse(fmt.Sprint("store comment error, please contact the admin"))
c.JSON(400, response)
return
}
err4 := UpdatePost(pid2)
if err4 != nil {
response = ErrorResponse(fmt.Sprintf("update replys wrong, please contact the admin"))
c.JSON(400, response)
return
}
response = SuccessResponse(nil)
c.JSON(200, response)
}
// Posts
func GetPosts(c *gin.Context) {
// GetPosts;
// 这个东西不需要鉴权;
var datas []RenderPost
var response UniverseResponse
// 获取全部的posts
posts, err := GetAllPosts()
if err != nil {
response = ErrorResponse(fmt.Sprint("get posts error, please contact the admin"))
c.JSON(400, response)
}
for _, v := range *posts {
data := RenderPost{
Title: v.Title,
Content: v.Text,
Pid: v.Pid,
Replys: v.Replys,
Likes: v.Likes,
}
datas = append(datas, data)
}
response = SuccessResponse(datas)
c.JSON(200, response)
}
func GetOnePostInfo(c *gin.Context) {
pid := c.Param("pid")
pid2, err := strconv.Atoi(pid)
var response UniverseResponse
if err != nil {
response = ErrorResponse(fmt.Sprintf("invalid pid"))
c.JSON(400, response)
}
var post RenderPost
p, err2 := GetPostByPid(pid2)
if err2 != nil {
response = ErrorResponse(fmt.Sprintf("can not find the post"))
c.JSON(400, response)
}
post = RenderPost{
Pid: pid2,
Title: p.Title,
Content: p.Text,
Likes: p.Likes,
Replys: p.Replys,
}
response = SuccessResponse(post)
c.JSON(200, response)
}
func GetOnePostComment(c *gin.Context) {
//获取参数
pid := c.Param("pid") // 获取pid
pid2, err := strconv.Atoi(pid)
var response UniverseResponse
if err != nil {
response = ErrorResponse(fmt.Sprintf("invalid pid"))
c.JSON(400, response)
}
var comments []RenderComment
datas, err2 := GetCommentsByPid(pid2)
if err2 != nil {
response = ErrorResponse(fmt.Sprintf("find data wrong, please contact the admin"))
c.JSON(400, response)
}
for _, data := range *datas {
// 根据pid 和 uid生成一个名字
name := GenName(data.Pid, data.Uid)
comment := RenderComment{
Name: name,
Content: data.Text,
ReplyText: data.ReplyText,
}
comments = append(comments, comment)
}
response = SuccessResponse(comments)
c.JSON(200, response)
}
func ListenHttp() {
r := gin.Default()
r1 := r.Group("/api/v0")
r1.POST("/register", Register)
r1.POST("/login", Login)
r1.GET("/userInfo", JWTAuth(), GetUserInfo)
r1.POST("/post", JWTAuth(), PostNewPost)
r1.POST("/post/:pid", JWTAuth(), PostNewComment)
r1.GET("/post", JWTAuth(), GetPosts)
// 获取的是下面的所有的评论
// 关键在于保证每一个人的
r1.GET("/post/:pid", JWTAuth(), GetOnePostInfo)
r1.GET("/post/:pid/replys", JWTAuth(), GetOnePostComment)
r.Run(":8080")
}