This commit is contained in:
12600k-rog-d4
2025-12-09 20:33:57 +08:00
parent 144ed3cbdf
commit 8f4d399cfd
1498 changed files with 3778 additions and 3654 deletions

View File

@@ -0,0 +1,419 @@
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()
}