首次提交
This commit is contained in:
@@ -0,0 +1,118 @@
|
||||
package handlers
|
||||
|
||||
import (
|
||||
"net/http"
|
||||
"strconv"
|
||||
|
||||
"github.com/gin-gonic/gin"
|
||||
"github.com/inchstep/server/internal/middleware"
|
||||
"github.com/inchstep/server/internal/services"
|
||||
)
|
||||
|
||||
type AdminHandler struct {
|
||||
adminSvc *services.AdminService
|
||||
jwtSecret string
|
||||
}
|
||||
|
||||
func NewAdminHandler(adminSvc *services.AdminService, jwtSecret string) *AdminHandler {
|
||||
return &AdminHandler{adminSvc: adminSvc, jwtSecret: jwtSecret}
|
||||
}
|
||||
|
||||
type adminLoginReq struct {
|
||||
Username string `json:"username" binding:"required"`
|
||||
Password string `json:"password" binding:"required"`
|
||||
}
|
||||
|
||||
func (h *AdminHandler) Login(c *gin.Context) {
|
||||
var req adminLoginReq
|
||||
if err := c.ShouldBindJSON(&req); err != nil {
|
||||
middleware.Error(c, http.StatusBadRequest, 400, "参数格式错误")
|
||||
return
|
||||
}
|
||||
|
||||
admin, err := h.adminSvc.Login(req.Username, req.Password)
|
||||
if err != nil {
|
||||
middleware.Error(c, http.StatusUnauthorized, 401, err.Error())
|
||||
return
|
||||
}
|
||||
|
||||
token, _ := middleware.GenerateToken(admin.ID, h.jwtSecret)
|
||||
middleware.Success(c, gin.H{
|
||||
"admin": admin,
|
||||
"token": token,
|
||||
})
|
||||
}
|
||||
|
||||
func (h *AdminHandler) Dashboard(c *gin.Context) {
|
||||
stats, err := h.adminSvc.GetDashboardStats()
|
||||
if err != nil {
|
||||
middleware.Error(c, http.StatusInternalServerError, 500, err.Error())
|
||||
return
|
||||
}
|
||||
middleware.Success(c, stats)
|
||||
}
|
||||
|
||||
func (h *AdminHandler) ListUsers(c *gin.Context) {
|
||||
page, _ := strconv.Atoi(c.DefaultQuery("page", "1"))
|
||||
pageSize, _ := strconv.Atoi(c.DefaultQuery("pageSize", "20"))
|
||||
users, total, err := h.adminSvc.ListUsers(page, pageSize)
|
||||
if err != nil {
|
||||
middleware.Error(c, http.StatusInternalServerError, 500, err.Error())
|
||||
return
|
||||
}
|
||||
middleware.Success(c, gin.H{"list": users, "total": total, "page": page})
|
||||
}
|
||||
|
||||
func (h *AdminHandler) ListPosts(c *gin.Context) {
|
||||
page, _ := strconv.Atoi(c.DefaultQuery("page", "1"))
|
||||
pageSize, _ := strconv.Atoi(c.DefaultQuery("pageSize", "20"))
|
||||
posts, total, err := h.adminSvc.ListPosts(page, pageSize)
|
||||
if err != nil {
|
||||
middleware.Error(c, http.StatusInternalServerError, 500, err.Error())
|
||||
return
|
||||
}
|
||||
middleware.Success(c, gin.H{"list": posts, "total": total, "page": page})
|
||||
}
|
||||
|
||||
func (h *AdminHandler) ListAdmins(c *gin.Context) {
|
||||
admins, err := h.adminSvc.ListAdmins()
|
||||
if err != nil {
|
||||
middleware.Error(c, http.StatusInternalServerError, 500, err.Error())
|
||||
return
|
||||
}
|
||||
middleware.Success(c, admins)
|
||||
}
|
||||
|
||||
type createAdminReq struct {
|
||||
Username string `json:"username" binding:"required"`
|
||||
Password string `json:"password" binding:"required"`
|
||||
Role string `json:"role"`
|
||||
Nickname *string `json:"nickname"`
|
||||
}
|
||||
|
||||
func (h *AdminHandler) CreateAdmin(c *gin.Context) {
|
||||
var req createAdminReq
|
||||
if err := c.ShouldBindJSON(&req); err != nil {
|
||||
middleware.Error(c, http.StatusBadRequest, 400, "参数格式错误")
|
||||
return
|
||||
}
|
||||
role := req.Role
|
||||
if role == "" {
|
||||
role = "admin"
|
||||
}
|
||||
admin, err := h.adminSvc.CreateAdmin(req.Username, req.Password, role, req.Nickname)
|
||||
if err != nil {
|
||||
middleware.Error(c, http.StatusConflict, 409, err.Error())
|
||||
return
|
||||
}
|
||||
middleware.Success(c, admin)
|
||||
}
|
||||
|
||||
func (h *AdminHandler) DisableAdmin(c *gin.Context) {
|
||||
id := c.Param("id")
|
||||
if err := h.adminSvc.DisableAdmin(id); err != nil {
|
||||
middleware.Error(c, http.StatusInternalServerError, 500, err.Error())
|
||||
return
|
||||
}
|
||||
middleware.Success(c, nil)
|
||||
}
|
||||
@@ -0,0 +1,228 @@
|
||||
package handlers
|
||||
|
||||
import (
|
||||
"net/http"
|
||||
"strconv"
|
||||
"time"
|
||||
|
||||
"github.com/gin-gonic/gin"
|
||||
"github.com/inchstep/server/internal/middleware"
|
||||
"github.com/inchstep/server/internal/models"
|
||||
"github.com/inchstep/server/internal/services"
|
||||
)
|
||||
|
||||
type CheckInHandler struct {
|
||||
checkinSvc *services.CheckInService
|
||||
pointsSvc *services.PointsService
|
||||
}
|
||||
|
||||
func NewCheckInHandler(cs *services.CheckInService, ps *services.PointsService) *CheckInHandler {
|
||||
return &CheckInHandler{checkinSvc: cs, pointsSvc: ps}
|
||||
}
|
||||
|
||||
// ---------- 打卡项 ----------
|
||||
|
||||
func (h *CheckInHandler) CreateItem(c *gin.Context) {
|
||||
userID := middleware.GetUserID(c)
|
||||
var item models.CheckInItem
|
||||
if err := c.ShouldBindJSON(&item); err != nil {
|
||||
middleware.Error(c, http.StatusBadRequest, 400, "参数格式错误")
|
||||
return
|
||||
}
|
||||
if item.Name == "" {
|
||||
middleware.Error(c, http.StatusBadRequest, 400, "打卡项名称不能为空")
|
||||
return
|
||||
}
|
||||
if err := h.checkinSvc.CreateItem(userID, &item); err != nil {
|
||||
middleware.Error(c, http.StatusInternalServerError, 500, err.Error())
|
||||
return
|
||||
}
|
||||
middleware.Success(c, item)
|
||||
}
|
||||
|
||||
func (h *CheckInHandler) ListItems(c *gin.Context) {
|
||||
userID := middleware.GetUserID(c)
|
||||
items, err := h.checkinSvc.GetUserItems(userID)
|
||||
if err != nil {
|
||||
middleware.Error(c, http.StatusInternalServerError, 500, err.Error())
|
||||
return
|
||||
}
|
||||
middleware.Success(c, items)
|
||||
}
|
||||
|
||||
func (h *CheckInHandler) GetItem(c *gin.Context) {
|
||||
userID := middleware.GetUserID(c)
|
||||
id := c.Param("id")
|
||||
item, err := h.checkinSvc.GetItemByID(id, userID)
|
||||
if err != nil {
|
||||
middleware.Error(c, http.StatusNotFound, 404, "打卡项不存在")
|
||||
return
|
||||
}
|
||||
middleware.Success(c, item)
|
||||
}
|
||||
|
||||
func (h *CheckInHandler) UpdateItem(c *gin.Context) {
|
||||
userID := middleware.GetUserID(c)
|
||||
id := c.Param("id")
|
||||
var updates map[string]interface{}
|
||||
if err := c.ShouldBindJSON(&updates); err != nil {
|
||||
middleware.Error(c, http.StatusBadRequest, 400, "参数格式错误")
|
||||
return
|
||||
}
|
||||
item, err := h.checkinSvc.UpdateItem(id, userID, updates)
|
||||
if err != nil {
|
||||
middleware.Error(c, http.StatusInternalServerError, 500, err.Error())
|
||||
return
|
||||
}
|
||||
middleware.Success(c, item)
|
||||
}
|
||||
|
||||
func (h *CheckInHandler) DeleteItem(c *gin.Context) {
|
||||
userID := middleware.GetUserID(c)
|
||||
id := c.Param("id")
|
||||
if err := h.checkinSvc.DeleteItem(id, userID); err != nil {
|
||||
middleware.Error(c, http.StatusInternalServerError, 500, err.Error())
|
||||
return
|
||||
}
|
||||
middleware.Success(c, nil)
|
||||
}
|
||||
|
||||
func (h *CheckInHandler) PauseItem(c *gin.Context) {
|
||||
userID := middleware.GetUserID(c)
|
||||
id := c.Param("id")
|
||||
if err := h.checkinSvc.PauseItem(id, userID); err != nil {
|
||||
middleware.Error(c, http.StatusInternalServerError, 500, err.Error())
|
||||
return
|
||||
}
|
||||
middleware.Success(c, nil)
|
||||
}
|
||||
|
||||
func (h *CheckInHandler) ResumeItem(c *gin.Context) {
|
||||
userID := middleware.GetUserID(c)
|
||||
id := c.Param("id")
|
||||
if err := h.checkinSvc.ResumeItem(id, userID); err != nil {
|
||||
middleware.Error(c, http.StatusInternalServerError, 500, err.Error())
|
||||
return
|
||||
}
|
||||
middleware.Success(c, nil)
|
||||
}
|
||||
|
||||
// ---------- 打卡记录 ----------
|
||||
|
||||
type createRecordReq struct {
|
||||
ItemID string `json:"itemId" binding:"required"`
|
||||
CheckDate string `json:"checkDate"`
|
||||
Note *string `json:"note,omitempty"`
|
||||
Images *string `json:"images,omitempty"`
|
||||
}
|
||||
|
||||
func (h *CheckInHandler) CreateRecord(c *gin.Context) {
|
||||
userID := middleware.GetUserID(c)
|
||||
var req createRecordReq
|
||||
if err := c.ShouldBindJSON(&req); err != nil {
|
||||
middleware.Error(c, http.StatusBadRequest, 400, "参数格式错误")
|
||||
return
|
||||
}
|
||||
|
||||
checkDate := time.Now()
|
||||
if req.CheckDate != "" {
|
||||
if parsed, err := time.Parse("2006-01-02", req.CheckDate); err == nil {
|
||||
checkDate = parsed
|
||||
}
|
||||
}
|
||||
|
||||
record, err := h.checkinSvc.CreateRecord(userID, req.ItemID, checkDate, req.Note, req.Images)
|
||||
if err != nil {
|
||||
middleware.Error(c, http.StatusBadRequest, 400, err.Error())
|
||||
return
|
||||
}
|
||||
|
||||
// 发放打卡积分
|
||||
h.pointsSvc.AwardCheckIn(userID)
|
||||
|
||||
middleware.Success(c, record)
|
||||
}
|
||||
|
||||
type makeupRecordReq struct {
|
||||
ItemID string `json:"itemId" binding:"required"`
|
||||
CheckDate string `json:"checkDate" binding:"required"`
|
||||
}
|
||||
|
||||
func (h *CheckInHandler) MakeupRecord(c *gin.Context) {
|
||||
userID := middleware.GetUserID(c)
|
||||
var req makeupRecordReq
|
||||
if err := c.ShouldBindJSON(&req); err != nil {
|
||||
middleware.Error(c, http.StatusBadRequest, 400, "参数格式错误")
|
||||
return
|
||||
}
|
||||
|
||||
checkDate, err := time.Parse("2006-01-02", req.CheckDate)
|
||||
if err != nil {
|
||||
middleware.Error(c, http.StatusBadRequest, 400, "日期格式错误,请使用 YYYY-MM-DD")
|
||||
return
|
||||
}
|
||||
|
||||
record, err := h.checkinSvc.MakeupRecord(userID, req.ItemID, checkDate, 5)
|
||||
if err != nil {
|
||||
middleware.Error(c, http.StatusBadRequest, 400, err.Error())
|
||||
return
|
||||
}
|
||||
middleware.Success(c, record)
|
||||
}
|
||||
|
||||
func (h *CheckInHandler) GetRecords(c *gin.Context) {
|
||||
userID := middleware.GetUserID(c)
|
||||
itemID := c.Query("itemId")
|
||||
|
||||
startStr := c.DefaultQuery("start", time.Now().AddDate(0, -1, 0).Format("2006-01-02"))
|
||||
endStr := c.DefaultQuery("end", time.Now().Format("2006-01-02"))
|
||||
|
||||
start, _ := time.Parse("2006-01-02", startStr)
|
||||
end, _ := time.Parse("2006-01-02", endStr)
|
||||
end = end.Add(24 * time.Hour)
|
||||
|
||||
records, err := h.checkinSvc.GetRecords(userID, itemID, start, end)
|
||||
if err != nil {
|
||||
middleware.Error(c, http.StatusInternalServerError, 500, err.Error())
|
||||
return
|
||||
}
|
||||
middleware.Success(c, records)
|
||||
}
|
||||
|
||||
func (h *CheckInHandler) GetStreak(c *gin.Context) {
|
||||
userID := middleware.GetUserID(c)
|
||||
itemID := c.Param("id")
|
||||
streak, err := h.checkinSvc.GetStreak(itemID, userID)
|
||||
if err != nil {
|
||||
middleware.Error(c, http.StatusInternalServerError, 500, err.Error())
|
||||
return
|
||||
}
|
||||
middleware.Success(c, gin.H{"itemId": itemID, "streak": streak})
|
||||
}
|
||||
|
||||
func (h *CheckInHandler) GetMonthlyStats(c *gin.Context) {
|
||||
userID := middleware.GetUserID(c)
|
||||
yearStr := c.DefaultQuery("year", strconv.Itoa(time.Now().Year()))
|
||||
monthStr := c.DefaultQuery("month", strconv.Itoa(int(time.Now().Month())))
|
||||
|
||||
year, _ := strconv.Atoi(yearStr)
|
||||
month, _ := strconv.Atoi(monthStr)
|
||||
|
||||
stats, err := h.checkinSvc.GetMonthlyStats(userID, year, month)
|
||||
if err != nil {
|
||||
middleware.Error(c, http.StatusInternalServerError, 500, err.Error())
|
||||
return
|
||||
}
|
||||
middleware.Success(c, stats)
|
||||
}
|
||||
|
||||
|
||||
func (h *CheckInHandler) GetTodayStatus(c *gin.Context) {
|
||||
userID := middleware.GetUserID(c)
|
||||
status, err := h.checkinSvc.GetTodayStatus(userID)
|
||||
if err != nil {
|
||||
middleware.Error(c, http.StatusInternalServerError, 500, err.Error())
|
||||
return
|
||||
}
|
||||
middleware.Success(c, status)
|
||||
}
|
||||
@@ -0,0 +1,215 @@
|
||||
package handlers
|
||||
|
||||
import (
|
||||
"net/http"
|
||||
"strconv"
|
||||
|
||||
"github.com/gin-gonic/gin"
|
||||
"github.com/inchstep/server/internal/middleware"
|
||||
"github.com/inchstep/server/internal/models"
|
||||
"github.com/inchstep/server/internal/services"
|
||||
)
|
||||
|
||||
type SocialHandler struct {
|
||||
socialSvc *services.SocialService
|
||||
}
|
||||
|
||||
func NewSocialHandler(svc *services.SocialService) *SocialHandler {
|
||||
return &SocialHandler{socialSvc: svc}
|
||||
}
|
||||
|
||||
// ---------- 好友 ----------
|
||||
|
||||
type friendReq struct {
|
||||
FriendID string `json:"friendId" binding:"required"`
|
||||
}
|
||||
|
||||
func (h *SocialHandler) SendFriendRequest(c *gin.Context) {
|
||||
userID := middleware.GetUserID(c)
|
||||
var req friendReq
|
||||
if err := c.ShouldBindJSON(&req); err != nil {
|
||||
middleware.Error(c, http.StatusBadRequest, 400, "参数格式错误")
|
||||
return
|
||||
}
|
||||
if err := h.socialSvc.SendFriendRequest(userID, req.FriendID); err != nil {
|
||||
middleware.Error(c, http.StatusBadRequest, 400, err.Error())
|
||||
return
|
||||
}
|
||||
middleware.Success(c, nil)
|
||||
}
|
||||
|
||||
func (h *SocialHandler) AcceptFriendRequest(c *gin.Context) {
|
||||
userID := middleware.GetUserID(c)
|
||||
var req friendReq
|
||||
if err := c.ShouldBindJSON(&req); err != nil {
|
||||
middleware.Error(c, http.StatusBadRequest, 400, "参数格式错误")
|
||||
return
|
||||
}
|
||||
if err := h.socialSvc.AcceptFriendRequest(userID, req.FriendID); err != nil {
|
||||
middleware.Error(c, http.StatusInternalServerError, 500, err.Error())
|
||||
return
|
||||
}
|
||||
middleware.Success(c, nil)
|
||||
}
|
||||
|
||||
func (h *SocialHandler) RemoveFriend(c *gin.Context) {
|
||||
userID := middleware.GetUserID(c)
|
||||
friendID := c.Param("userId")
|
||||
if err := h.socialSvc.RemoveFriend(userID, friendID); err != nil {
|
||||
middleware.Error(c, http.StatusInternalServerError, 500, err.Error())
|
||||
return
|
||||
}
|
||||
middleware.Success(c, nil)
|
||||
}
|
||||
|
||||
func (h *SocialHandler) ListFriends(c *gin.Context) {
|
||||
userID := middleware.GetUserID(c)
|
||||
friends, err := h.socialSvc.GetFriends(userID)
|
||||
if err != nil {
|
||||
middleware.Error(c, http.StatusInternalServerError, 500, err.Error())
|
||||
return
|
||||
}
|
||||
middleware.Success(c, friends)
|
||||
}
|
||||
|
||||
// ---------- 动态 ----------
|
||||
|
||||
type createPostReq struct {
|
||||
Content *string `json:"content,omitempty"`
|
||||
Images *string `json:"images,omitempty"`
|
||||
Privacy int `json:"privacy"`
|
||||
}
|
||||
|
||||
func (h *SocialHandler) CreatePost(c *gin.Context) {
|
||||
userID := middleware.GetUserID(c)
|
||||
var req createPostReq
|
||||
if err := c.ShouldBindJSON(&req); err != nil {
|
||||
middleware.Error(c, http.StatusBadRequest, 400, "参数格式错误")
|
||||
return
|
||||
}
|
||||
post := &models.Post{
|
||||
UserID: userID,
|
||||
Content: req.Content,
|
||||
Images: req.Images,
|
||||
Privacy: req.Privacy,
|
||||
}
|
||||
if err := h.socialSvc.CreatePost(post); err != nil {
|
||||
middleware.Error(c, http.StatusInternalServerError, 500, err.Error())
|
||||
return
|
||||
}
|
||||
middleware.Success(c, post)
|
||||
}
|
||||
|
||||
func (h *SocialHandler) GetFeed(c *gin.Context) {
|
||||
page, _ := strconv.Atoi(c.DefaultQuery("page", "1"))
|
||||
pageSize, _ := strconv.Atoi(c.DefaultQuery("pageSize", "20"))
|
||||
if page < 1 {
|
||||
page = 1
|
||||
}
|
||||
if pageSize < 1 || pageSize > 100 {
|
||||
pageSize = 20
|
||||
}
|
||||
posts, total, err := h.socialSvc.GetFeed(page, pageSize)
|
||||
if err != nil {
|
||||
middleware.Error(c, http.StatusInternalServerError, 500, err.Error())
|
||||
return
|
||||
}
|
||||
middleware.Success(c, gin.H{
|
||||
"list": posts,
|
||||
"total": total,
|
||||
"page": page,
|
||||
})
|
||||
}
|
||||
|
||||
func (h *SocialHandler) LikePost(c *gin.Context) {
|
||||
postID := c.Param("id")
|
||||
if err := h.socialSvc.LikePost(postID); err != nil {
|
||||
middleware.Error(c, http.StatusInternalServerError, 500, err.Error())
|
||||
return
|
||||
}
|
||||
middleware.Success(c, nil)
|
||||
}
|
||||
|
||||
func (h *SocialHandler) CommentPost(c *gin.Context) {
|
||||
postID := c.Param("id")
|
||||
if err := h.socialSvc.CommentPost(postID); err != nil {
|
||||
middleware.Error(c, http.StatusInternalServerError, 500, err.Error())
|
||||
return
|
||||
}
|
||||
middleware.Success(c, nil)
|
||||
}
|
||||
|
||||
// ---------- 小组 ----------
|
||||
|
||||
func (h *SocialHandler) CreateGroup(c *gin.Context) {
|
||||
userID := middleware.GetUserID(c)
|
||||
var group models.Group
|
||||
if err := c.ShouldBindJSON(&group); err != nil {
|
||||
middleware.Error(c, http.StatusBadRequest, 400, "参数格式错误")
|
||||
return
|
||||
}
|
||||
if err := h.socialSvc.CreateGroup(userID, &group); err != nil {
|
||||
middleware.Error(c, http.StatusInternalServerError, 500, err.Error())
|
||||
return
|
||||
}
|
||||
middleware.Success(c, group)
|
||||
}
|
||||
|
||||
func (h *SocialHandler) JoinGroup(c *gin.Context) {
|
||||
userID := middleware.GetUserID(c)
|
||||
groupID := c.Param("id")
|
||||
if err := h.socialSvc.JoinGroup(groupID, userID); err != nil {
|
||||
middleware.Error(c, http.StatusInternalServerError, 500, err.Error())
|
||||
return
|
||||
}
|
||||
middleware.Success(c, nil)
|
||||
}
|
||||
|
||||
func (h *SocialHandler) LeaveGroup(c *gin.Context) {
|
||||
userID := middleware.GetUserID(c)
|
||||
groupID := c.Param("id")
|
||||
if err := h.socialSvc.LeaveGroup(groupID, userID); err != nil {
|
||||
middleware.Error(c, http.StatusInternalServerError, 500, err.Error())
|
||||
return
|
||||
}
|
||||
middleware.Success(c, nil)
|
||||
}
|
||||
|
||||
func (h *SocialHandler) GetGroupMembers(c *gin.Context) {
|
||||
groupID := c.Param("id")
|
||||
members, err := h.socialSvc.GetGroupMembers(groupID)
|
||||
if err != nil {
|
||||
middleware.Error(c, http.StatusInternalServerError, 500, err.Error())
|
||||
return
|
||||
}
|
||||
middleware.Success(c, members)
|
||||
}
|
||||
|
||||
// ---------- 成就 ----------
|
||||
|
||||
type AchievementHandler struct {
|
||||
pointsSvc *services.PointsService
|
||||
}
|
||||
|
||||
func NewAchievementHandler(ps *services.PointsService) *AchievementHandler {
|
||||
return &AchievementHandler{pointsSvc: ps}
|
||||
}
|
||||
|
||||
func (h *AchievementHandler) ListAll(c *gin.Context) {
|
||||
list, err := h.pointsSvc.GetAllAchievements()
|
||||
if err != nil {
|
||||
middleware.Error(c, http.StatusInternalServerError, 500, err.Error())
|
||||
return
|
||||
}
|
||||
middleware.Success(c, list)
|
||||
}
|
||||
|
||||
func (h *AchievementHandler) ListUserAchievements(c *gin.Context) {
|
||||
userID := middleware.GetUserID(c)
|
||||
list, err := h.pointsSvc.GetUserAchievements(userID)
|
||||
if err != nil {
|
||||
middleware.Error(c, http.StatusInternalServerError, 500, err.Error())
|
||||
return
|
||||
}
|
||||
middleware.Success(c, list)
|
||||
}
|
||||
@@ -0,0 +1,115 @@
|
||||
package handlers
|
||||
|
||||
import (
|
||||
"net/http"
|
||||
|
||||
"github.com/gin-gonic/gin"
|
||||
"github.com/inchstep/server/internal/middleware"
|
||||
"github.com/inchstep/server/internal/services"
|
||||
)
|
||||
|
||||
type UserHandler struct {
|
||||
userSvc *services.UserService
|
||||
jwtSecret string
|
||||
}
|
||||
|
||||
func NewUserHandler(userSvc *services.UserService, jwtSecret string) *UserHandler {
|
||||
return &UserHandler{userSvc: userSvc, jwtSecret: jwtSecret}
|
||||
}
|
||||
|
||||
type registerReq struct {
|
||||
Phone string `json:"phone" binding:"required,len=11"`
|
||||
}
|
||||
|
||||
func (h *UserHandler) Register(c *gin.Context) {
|
||||
var req registerReq
|
||||
if err := c.ShouldBindJSON(&req); err != nil {
|
||||
middleware.Error(c, http.StatusBadRequest, 400, "手机号格式错误")
|
||||
return
|
||||
}
|
||||
|
||||
user, err := h.userSvc.RegisterByPhone(req.Phone)
|
||||
if err != nil {
|
||||
middleware.Error(c, http.StatusConflict, 409, err.Error())
|
||||
return
|
||||
}
|
||||
|
||||
token, _ := middleware.GenerateToken(user.ID, h.jwtSecret)
|
||||
middleware.Success(c, gin.H{
|
||||
"user": user,
|
||||
"token": token,
|
||||
})
|
||||
}
|
||||
|
||||
type loginReq struct {
|
||||
Phone string `json:"phone" binding:"required,len=11"`
|
||||
}
|
||||
|
||||
func (h *UserHandler) Login(c *gin.Context) {
|
||||
var req loginReq
|
||||
if err := c.ShouldBindJSON(&req); err != nil {
|
||||
middleware.Error(c, http.StatusBadRequest, 400, "手机号格式错误")
|
||||
return
|
||||
}
|
||||
|
||||
user, err := h.userSvc.GetByPhone(req.Phone)
|
||||
if err != nil {
|
||||
// 手机号未注册时自动注册
|
||||
user, err = h.userSvc.RegisterByPhone(req.Phone)
|
||||
if err != nil {
|
||||
middleware.Error(c, http.StatusInternalServerError, 500, "注册失败")
|
||||
return
|
||||
}
|
||||
}
|
||||
|
||||
token, _ := middleware.GenerateToken(user.ID, h.jwtSecret)
|
||||
middleware.Success(c, gin.H{
|
||||
"user": user,
|
||||
"token": token,
|
||||
})
|
||||
}
|
||||
|
||||
func (h *UserHandler) GetProfile(c *gin.Context) {
|
||||
userID := middleware.GetUserID(c)
|
||||
user, err := h.userSvc.GetByID(userID)
|
||||
if err != nil {
|
||||
middleware.Error(c, http.StatusNotFound, 404, "用户不存在")
|
||||
return
|
||||
}
|
||||
middleware.Success(c, user)
|
||||
}
|
||||
|
||||
func (h *UserHandler) UpdateProfile(c *gin.Context) {
|
||||
userID := middleware.GetUserID(c)
|
||||
var updates map[string]interface{}
|
||||
if err := c.ShouldBindJSON(&updates); err != nil {
|
||||
middleware.Error(c, http.StatusBadRequest, 400, "请求数据格式错误")
|
||||
return
|
||||
}
|
||||
|
||||
user, err := h.userSvc.UpdateProfile(userID, updates)
|
||||
if err != nil {
|
||||
middleware.Error(c, http.StatusInternalServerError, 500, err.Error())
|
||||
return
|
||||
}
|
||||
middleware.Success(c, user)
|
||||
}
|
||||
|
||||
func (h *UserHandler) DeleteAccount(c *gin.Context) {
|
||||
userID := middleware.GetUserID(c)
|
||||
if err := h.userSvc.DeleteAccount(userID); err != nil {
|
||||
middleware.Error(c, http.StatusInternalServerError, 500, "注销失败")
|
||||
return
|
||||
}
|
||||
middleware.Success(c, nil)
|
||||
}
|
||||
|
||||
func (h *UserHandler) GetPoints(c *gin.Context) {
|
||||
userID := middleware.GetUserID(c)
|
||||
user, err := h.userSvc.GetByID(userID)
|
||||
if err != nil {
|
||||
middleware.Error(c, http.StatusNotFound, 404, "用户不存在")
|
||||
return
|
||||
}
|
||||
middleware.Success(c, gin.H{"points": user.Points})
|
||||
}
|
||||
Reference in New Issue
Block a user