lv8girl!
This commit is contained in:
121
internal/controllers/discussion.go
Normal file
121
internal/controllers/discussion.go
Normal file
@@ -0,0 +1,121 @@
|
||||
package controllers
|
||||
|
||||
import (
|
||||
"net/http"
|
||||
"os"
|
||||
"path/filepath"
|
||||
"strings"
|
||||
"time"
|
||||
|
||||
"github.com/gin-gonic/gin"
|
||||
"lv8girl/internal/middleware"
|
||||
"lv8girl/internal/services"
|
||||
)
|
||||
|
||||
type DiscussionController struct {
|
||||
discussionSvc *services.DiscussionService
|
||||
}
|
||||
|
||||
func NewDiscussionController() *DiscussionController {
|
||||
return &DiscussionController{
|
||||
discussionSvc: services.NewDiscussionService(),
|
||||
}
|
||||
}
|
||||
|
||||
func (c *DiscussionController) ShowNewPost(ctx *gin.Context) {
|
||||
userID, username, userRole, _ := middleware.GetCurrentUser(ctx)
|
||||
ctx.HTML(http.StatusOK, "post_discussion.html", gin.H{
|
||||
"IsLoggedIn": true,
|
||||
"UserID": userID,
|
||||
"Username": username,
|
||||
"UserRole": userRole,
|
||||
"Error": "",
|
||||
"Success": "",
|
||||
})
|
||||
}
|
||||
|
||||
func (c *DiscussionController) CreatePost(ctx *gin.Context) {
|
||||
userID, username, userRole, _ := middleware.GetCurrentUser(ctx)
|
||||
|
||||
title := strings.TrimSpace(ctx.PostForm("title"))
|
||||
content := strings.TrimSpace(ctx.PostForm("content"))
|
||||
|
||||
if title == "" || content == "" {
|
||||
ctx.HTML(http.StatusOK, "post_discussion.html", gin.H{
|
||||
"IsLoggedIn": true,
|
||||
"UserID": userID,
|
||||
"Username": username,
|
||||
"UserRole": userRole,
|
||||
"Error": "标题和内容不能为空",
|
||||
"Success": "",
|
||||
})
|
||||
return
|
||||
}
|
||||
|
||||
var imagePath string
|
||||
file, err := ctx.FormFile("image")
|
||||
if err == nil {
|
||||
if file.Size > 2*1024*1024 {
|
||||
ctx.HTML(http.StatusOK, "post_discussion.html", gin.H{
|
||||
"IsLoggedIn": true,
|
||||
"UserID": userID,
|
||||
"Username": username,
|
||||
"UserRole": userRole,
|
||||
"Error": "图片大小不能超过2MB",
|
||||
"Success": "",
|
||||
})
|
||||
return
|
||||
}
|
||||
|
||||
ext := strings.ToLower(filepath.Ext(file.Filename))
|
||||
filename := "post_" + time.Now().Format("20060102150405") + "_" + randomString(8) + ext
|
||||
uploadDir := "uploads/posts"
|
||||
|
||||
if _, err := os.Stat(uploadDir); os.IsNotExist(err) {
|
||||
os.MkdirAll(uploadDir, 0755)
|
||||
}
|
||||
|
||||
imagePath = filepath.Join(uploadDir, filename)
|
||||
if err := ctx.SaveUploadedFile(file, imagePath); err != nil {
|
||||
ctx.HTML(http.StatusOK, "post_discussion.html", gin.H{
|
||||
"IsLoggedIn": true,
|
||||
"UserID": userID,
|
||||
"Username": username,
|
||||
"UserRole": userRole,
|
||||
"Error": "图片保存失败",
|
||||
"Success": "",
|
||||
})
|
||||
return
|
||||
}
|
||||
}
|
||||
|
||||
if err := c.discussionSvc.CreatePost(userID, title, content, imagePath); err != nil {
|
||||
ctx.HTML(http.StatusOK, "post_discussion.html", gin.H{
|
||||
"IsLoggedIn": true,
|
||||
"UserID": userID,
|
||||
"Username": username,
|
||||
"UserRole": userRole,
|
||||
"Error": "发帖失败,请稍后重试",
|
||||
"Success": "",
|
||||
})
|
||||
return
|
||||
}
|
||||
|
||||
ctx.HTML(http.StatusOK, "post_discussion.html", gin.H{
|
||||
"IsLoggedIn": true,
|
||||
"UserID": userID,
|
||||
"Username": username,
|
||||
"UserRole": userRole,
|
||||
"Error": "",
|
||||
"Success": "帖子已提交,等待管理员审核。",
|
||||
})
|
||||
}
|
||||
|
||||
func randomString(n int) string {
|
||||
const letters = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789"
|
||||
b := make([]byte, n)
|
||||
for i := range b {
|
||||
b[i] = letters[time.Now().UnixNano()%int64(len(letters))]
|
||||
}
|
||||
return string(b)
|
||||
}
|
||||
Reference in New Issue
Block a user