Files
lv8girl/internal/controllers/user.go
2026-02-23 23:50:04 +08:00

99 lines
2.3 KiB
Go

package controllers
import (
"net/http"
"os"
"path/filepath"
"strconv"
"strings"
"time"
"github.com/gin-gonic/gin"
"lv8girl/internal/middleware"
"lv8girl/internal/services"
)
type UserController struct {
userSvc *services.UserService
}
func NewUserController() *UserController {
return &UserController{
userSvc: services.NewUserService(),
}
}
func (c *UserController) ShowProfile(ctx *gin.Context) {
currentUserID, currentUsername, currentUserRole, isLoggedIn := middleware.GetCurrentUser(ctx)
userIDStr := ctx.Param("id")
var userID uint
if userIDStr == "" {
userID = currentUserID
} else {
userID = parseUint(userIDStr)
}
if userID == 0 {
ctx.Redirect(http.StatusFound, "/")
return
}
profile, err := c.userSvc.GetUserProfile(currentUserID, userID)
if err != nil {
ctx.String(http.StatusNotFound, "用户不存在")
return
}
avatar := ""
if profile.User.Avatar != "" {
avatar = "/" + profile.User.Avatar
}
ctx.HTML(http.StatusOK, "profile.html", gin.H{
"IsLoggedIn": isLoggedIn,
"CurrentUserID": currentUserID,
"CurrentUsername": currentUsername,
"CurrentUserRole": currentUserRole,
"User": profile.User,
"UserAvatar": avatar,
"Posts": profile.Posts,
"PostCount": profile.PostCount,
"IsOwner": profile.IsOwner,
"UnreadCount": profile.UnreadCount,
"Message": "",
})
}
func (c *UserController) UploadAvatar(ctx *gin.Context) {
userID, _, _, _ := middleware.GetCurrentUser(ctx)
file, err := ctx.FormFile("avatar")
if err != nil {
ctx.Redirect(http.StatusFound, "/profile?error=上传失败")
return
}
if file.Size > 2*1024*1024 {
ctx.Redirect(http.StatusFound, "/profile?error=图片大小不能超过2MB")
return
}
ext := strings.ToLower(filepath.Ext(file.Filename))
filename := "avatar_" + strconv.FormatUint(uint64(userID), 10) + "_" + time.Now().Format("20060102150405") + ext
uploadDir := "uploads/avatars"
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.Redirect(http.StatusFound, "/profile?error=保存失败")
return
}
c.userSvc.UpdateAvatar(userID, imagePath)
ctx.Redirect(http.StatusFound, "/profile?success=头像更新成功")
}