Files
common-server-public/archive/bbs-go-active/server/internal/controllers/api/user_controller.go
12600k-rog-d4 8f4d399cfd 20251209
2025-12-09 20:33:57 +08:00

420 lines
11 KiB
Go
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
package api
import (
"bbs-go/internal/models/constants"
"bbs-go/internal/pkg/errs"
"bbs-go/internal/pkg/msg"
"bbs-go/internal/pkg/validate"
"strconv"
"strings"
"time"
"github.com/kataras/iris/v12"
"github.com/mlogclub/simple/common/dates"
"github.com/mlogclub/simple/common/strs"
"github.com/mlogclub/simple/sqls"
"github.com/mlogclub/simple/web"
"github.com/mlogclub/simple/web/params"
"github.com/spf13/cast"
"bbs-go/internal/cache"
"bbs-go/internal/controllers/render"
"bbs-go/internal/models"
"bbs-go/internal/services"
)
type UserController struct {
Ctx iris.Context
}
// 获取当前登录用户
func (c *UserController) GetCurrent() *web.JsonResult {
user := services.UserTokenService.GetCurrent(c.Ctx)
if user != nil {
return web.JsonData(render.BuildUserProfile(user))
}
return web.JsonSuccess()
}
// 用户详情
func (c *UserController) GetBy(userId int64) *web.JsonResult {
user := cache.UserCache.Get(userId)
if user != nil && user.Status != constants.StatusDeleted {
return web.JsonData(render.BuildUserDetail(user))
}
return web.JsonErrorMsg("用户不存在")
}
// 修改用户资料
func (c *UserController) PostEditBy(userId int64) *web.JsonResult {
user := services.UserTokenService.GetCurrent(c.Ctx)
if user == nil {
return web.JsonError(errs.NotLogin)
}
if user.Id != userId {
return web.JsonErrorMsg("无权限")
}
var (
nickname = strings.TrimSpace(params.FormValue(c.Ctx, "nickname"))
homePage = params.FormValue(c.Ctx, "homePage")
description = params.FormValue(c.Ctx, "description")
gender = strings.TrimSpace(params.FormValue(c.Ctx, "gender"))
birthdayStr = strings.TrimSpace(params.FormValue(c.Ctx, "birthday"))
birthday *time.Time
err error
)
if len(nickname) == 0 {
return web.JsonErrorMsg("昵称不能为空")
}
if strs.IsNotBlank(gender) {
if gender != string(constants.GenderMale) && gender != string(constants.GenderFemale) {
return web.JsonErrorMsg("性别数据错误")
}
}
if strs.IsNotBlank(birthdayStr) {
*birthday, err = dates.Parse(birthdayStr, dates.FmtDate)
if err != nil {
return web.JsonError(err)
}
}
if len(homePage) > 0 && validate.IsURL(homePage) != nil {
return web.JsonErrorMsg("个人主页地址错误")
}
columns := map[string]interface{}{
"nickname": nickname,
"home_page": homePage,
"description": description,
"gender": gender,
}
if birthday != nil {
columns["birthday"] = birthday
}
err = services.UserService.Updates(user.Id, columns)
if err != nil {
return web.JsonError(err)
}
return web.JsonSuccess()
}
// 修改头像
func (c *UserController) PostUpdateAvatar() *web.JsonResult {
user := services.UserTokenService.GetCurrent(c.Ctx)
if user == nil {
return web.JsonError(errs.NotLogin)
}
avatar := strings.TrimSpace(params.FormValue(c.Ctx, "avatar"))
if len(avatar) == 0 {
return web.JsonErrorMsg("头像不能为空")
}
err := services.UserService.UpdateAvatar(user.Id, avatar)
if err != nil {
return web.JsonError(err)
}
return web.JsonSuccess()
}
func (c *UserController) PostUpdateNickname() *web.JsonResult {
user := services.UserTokenService.GetCurrent(c.Ctx)
if user == nil {
return web.JsonError(errs.NotLogin)
}
nickname := strings.TrimSpace(params.FormValue(c.Ctx, "nickname"))
if len(nickname) == 0 {
return web.JsonErrorMsg("Nickname cannot be empty")
}
err := services.UserService.UpdateNickname(user.Id, nickname)
if err != nil {
return web.JsonErrorMsg(err.Error())
}
return web.JsonSuccess()
}
func (c *UserController) PostUpdateDescription() *web.JsonResult {
user := services.UserTokenService.GetCurrent(c.Ctx)
if user == nil {
return web.JsonError(errs.NotLogin)
}
description := strings.TrimSpace(params.FormValue(c.Ctx, "description"))
err := services.UserService.UpdateDescription(user.Id, description)
if err != nil {
return web.JsonErrorMsg(err.Error())
}
return web.JsonSuccess()
}
func (c *UserController) PostUpdateGender() *web.JsonResult {
user := services.UserTokenService.GetCurrent(c.Ctx)
if user == nil {
return web.JsonError(errs.NotLogin)
}
gender := strings.TrimSpace(params.FormValue(c.Ctx, "gender"))
err := services.UserService.UpdateGender(user.Id, gender)
if err != nil {
return web.JsonErrorMsg(err.Error())
}
return web.JsonSuccess()
}
func (c *UserController) PostUpdateBirthday() *web.JsonResult {
user := services.UserTokenService.GetCurrent(c.Ctx)
if user == nil {
return web.JsonError(errs.NotLogin)
}
birthday := strings.TrimSpace(params.FormValue(c.Ctx, "birthday"))
err := services.UserService.UpdateBirthday(user.Id, birthday)
if err != nil {
return web.JsonErrorMsg(err.Error())
}
return web.JsonSuccess()
}
// 设置用户名
func (c *UserController) PostSetUsername() *web.JsonResult {
user := services.UserTokenService.GetCurrent(c.Ctx)
if user == nil {
return web.JsonError(errs.NotLogin)
}
username := strings.TrimSpace(params.FormValue(c.Ctx, "username"))
err := services.UserService.SetUsername(user.Id, username)
if err != nil {
return web.JsonError(err)
}
return web.JsonSuccess()
}
// 设置邮箱
func (c *UserController) PostSetEmail() *web.JsonResult {
user := services.UserTokenService.GetCurrent(c.Ctx)
if user == nil {
return web.JsonError(errs.NotLogin)
}
email := strings.TrimSpace(params.FormValue(c.Ctx, "email"))
err := services.UserService.SetEmail(user.Id, email)
if err != nil {
return web.JsonError(err)
}
return web.JsonSuccess()
}
// 设置密码
func (c *UserController) PostSetPassword() *web.JsonResult {
user := services.UserTokenService.GetCurrent(c.Ctx)
if user == nil {
return web.JsonError(errs.NotLogin)
}
password := params.FormValue(c.Ctx, "password")
rePassword := params.FormValue(c.Ctx, "rePassword")
err := services.UserService.SetPassword(user.Id, password, rePassword)
if err != nil {
return web.JsonError(err)
}
return web.JsonSuccess()
}
// 修改密码
func (c *UserController) PostUpdatePassword() *web.JsonResult {
user := services.UserTokenService.GetCurrent(c.Ctx)
if user == nil {
return web.JsonError(errs.NotLogin)
}
var (
oldPassword = params.FormValue(c.Ctx, "oldPassword")
password = params.FormValue(c.Ctx, "password")
rePassword = params.FormValue(c.Ctx, "rePassword")
)
if err := services.UserService.UpdatePassword(user.Id, oldPassword, password, rePassword); err != nil {
return web.JsonError(err)
}
return web.JsonSuccess()
}
// 设置背景图
func (c *UserController) PostSet_background_image() *web.JsonResult {
user := services.UserTokenService.GetCurrent(c.Ctx)
if user == nil {
return web.JsonError(errs.NotLogin)
}
backgroundImage := params.FormValue(c.Ctx, "backgroundImage")
if strs.IsBlank(backgroundImage) {
return web.JsonErrorMsg("请上传图片")
}
if err := services.UserService.UpdateBackgroundImage(user.Id, backgroundImage); err != nil {
return web.JsonError(err)
}
return web.JsonSuccess()
}
// 用户收藏
func (c *UserController) GetFavorites() *web.JsonResult {
user := services.UserTokenService.GetCurrent(c.Ctx)
cursor := params.FormValueInt64Default(c.Ctx, "cursor", 0)
// 用户必须登录
if user == nil {
return web.JsonError(errs.NotLogin)
}
// 查询列表
limit := 20
var favorites []models.Favorite
if cursor > 0 {
favorites = services.FavoriteService.Find(sqls.NewCnd().Where("user_id = ? and id < ?",
user.Id, cursor).Desc("id").Limit(20))
} else {
favorites = services.FavoriteService.Find(sqls.NewCnd().Where("user_id = ?", user.Id).Desc("id").Limit(limit))
}
hasMore := false
if len(favorites) > 0 {
cursor = favorites[len(favorites)-1].Id
hasMore = len(favorites) >= limit
}
return web.JsonCursorData(render.BuildFavorites(favorites), strconv.FormatInt(cursor, 10), hasMore)
}
// 获取最近3条未读消息
func (c *UserController) GetMsgrecent() *web.JsonResult {
user := services.UserTokenService.GetCurrent(c.Ctx)
var count int64 = 0
var messages []models.Message
if user != nil {
count = services.MessageService.GetUnReadCount(user.Id)
messages = services.MessageService.Find(sqls.NewCnd().Eq("user_id", user.Id).
Eq("status", msg.StatusUnread).Limit(3).Desc("id"))
}
return web.NewEmptyRspBuilder().Put("count", count).Put("messages", render.BuildMessages(messages)).JsonResult()
}
// 用户消息
func (c *UserController) GetMessages() *web.JsonResult {
user, err := services.UserTokenService.CheckLogin(c.Ctx)
if err != nil {
return web.JsonError(errs.NotLogin)
}
var (
limit = 20
cursor, _ = params.GetInt64(c.Ctx, "cursor")
)
cnd := sqls.NewCnd().Eq("user_id", user.Id).Limit(limit).Desc("id")
if cursor > 0 {
cnd.Lt("id", cursor)
}
list := services.MessageService.Find(cnd)
var (
nextCursor = cursor
hasMore = false
)
if len(list) > 0 {
nextCursor = list[len(list)-1].Id
hasMore = len(list) == limit
}
// 全部标记为已读
services.MessageService.MarkRead(user.Id)
return web.JsonCursorData(render.BuildMessages(list), cast.ToString(nextCursor), hasMore)
}
// 用户积分记录
func (c *UserController) GetScore_logs() *web.JsonResult {
user, err := services.UserTokenService.CheckLogin(c.Ctx)
if err != nil {
return web.JsonError(err)
}
var (
limit = 20
cursor, _ = params.GetInt64(c.Ctx, "cursor")
)
cnd := sqls.NewCnd().Eq("user_id", user.Id).Limit(limit).Desc("id")
if cursor > 0 {
cnd.Lt("id", cursor)
}
list := services.UserScoreLogService.Find(cnd)
var (
nextCursor = cursor
hasMore = false
)
if len(list) > 0 {
nextCursor = list[len(list)-1].Id
hasMore = len(list) == limit
}
return web.JsonCursorData(list, cast.ToString(nextCursor), hasMore)
}
// 积分排行
func (c *UserController) GetScoreRank() *web.JsonResult {
users := cache.UserCache.GetScoreRank()
var results []*models.UserInfo
for _, user := range users {
results = append(results, render.BuildUserInfo(&user))
}
return web.JsonData(results)
}
// 禁言
func (c *UserController) PostForbidden() *web.JsonResult {
user := services.UserTokenService.GetCurrent(c.Ctx)
if user == nil {
return web.JsonError(errs.NotLogin)
}
if !user.HasAnyRole(constants.RoleOwner, constants.RoleAdmin) {
return web.JsonErrorMsg("无权限")
}
var (
userId = params.FormValueInt64Default(c.Ctx, "userId", 0)
days = params.FormValueIntDefault(c.Ctx, "days", 0)
reason = params.FormValue(c.Ctx, "reason")
)
if userId < 0 {
return web.JsonErrorMsg("请传入userId")
}
if days == -1 && !user.HasRole(constants.RoleOwner) {
return web.JsonErrorMsg("无永久禁言权限")
}
if days == 0 {
services.UserService.RemoveForbidden(user.Id, userId, c.Ctx.Request())
} else {
if err := services.UserService.Forbidden(user.Id, userId, days, reason, c.Ctx.Request()); err != nil {
return web.JsonError(err)
}
}
return web.JsonSuccess()
}
// PostEmailVerify 请求邮箱验证邮件
func (c *UserController) PostSend_verify_email() *web.JsonResult {
user := services.UserTokenService.GetCurrent(c.Ctx)
if user == nil {
return web.JsonError(errs.NotLogin)
}
if err := services.UserService.SendEmailVerifyEmail(user.Id); err != nil {
return web.JsonError(err)
}
return web.JsonSuccess()
}
// PostVerify_email 获取邮箱验证码
func (c *UserController) PostVerify_email() *web.JsonResult {
token := params.FormValue(c.Ctx, "token")
if strs.IsBlank(token) {
return web.JsonErrorMsg("Illegal request")
}
var (
email string
err error
)
if email, err = services.UserService.VerifyEmail(token); err != nil {
return web.JsonError(err)
}
return web.NewEmptyRspBuilder().Put("email", email).JsonResult()
}