package handler import ( "encoding/json" "net/http" "soul-api/internal/database" "soul-api/internal/model" "github.com/gin-gonic/gin" ) var defaultMatchTypes = []gin.H{ gin.H{"id": "partner", "label": "创业合伙", "matchLabel": "创业伙伴", "icon": "⭐", "matchFromDB": true, "showJoinAfterMatch": false, "price": 1, "enabled": true}, gin.H{"id": "investor", "label": "资源对接", "matchLabel": "资源对接", "icon": "👥", "matchFromDB": false, "showJoinAfterMatch": true, "price": 1, "enabled": true}, gin.H{"id": "mentor", "label": "导师顾问", "matchLabel": "商业顾问", "icon": "❤️", "matchFromDB": false, "showJoinAfterMatch": true, "price": 1, "enabled": true}, gin.H{"id": "team", "label": "团队招募", "matchLabel": "加入项目", "icon": "🎮", "matchFromDB": false, "showJoinAfterMatch": true, "price": 1, "enabled": true}, } // MatchConfigGet GET /api/match/config func MatchConfigGet(c *gin.Context) { db := database.DB() var cfg model.SystemConfig if err := db.Where("config_key = ?", "match_config").First(&cfg).Error; err != nil { c.JSON(http.StatusOK, gin.H{ "success": true, "data": gin.H{ "matchTypes": defaultMatchTypes, "freeMatchLimit": 3, "matchPrice": 1, "settings": gin.H{"enableFreeMatches": true, "enablePaidMatches": true, "maxMatchesPerDay": 10}, }, "source": "default", }) return } var config map[string]interface{} _ = json.Unmarshal(cfg.ConfigValue, &config) matchTypes := defaultMatchTypes if v, ok := config["matchTypes"].([]interface{}); ok && len(v) > 0 { matchTypes = make([]gin.H, 0, len(v)) for _, t := range v { if m, ok := t.(map[string]interface{}); ok { enabled := true if e, ok := m["enabled"].(bool); ok && !e { enabled = false } if enabled { matchTypes = append(matchTypes, gin.H(m)) } } } if len(matchTypes) == 0 { matchTypes = defaultMatchTypes } } freeMatchLimit := 3 if v, ok := config["freeMatchLimit"].(float64); ok { freeMatchLimit = int(v) } matchPrice := 1 if v, ok := config["matchPrice"].(float64); ok { matchPrice = int(v) } settings := gin.H{"enableFreeMatches": true, "enablePaidMatches": true, "maxMatchesPerDay": 10} if s, ok := config["settings"].(map[string]interface{}); ok { for k, v := range s { settings[k] = v } } c.JSON(http.StatusOK, gin.H{"success": true, "data": gin.H{ "matchTypes": matchTypes, "freeMatchLimit": freeMatchLimit, "matchPrice": matchPrice, "settings": settings, }, "source": "database"}) } // MatchConfigPost POST /api/match/config func MatchConfigPost(c *gin.Context) { c.JSON(http.StatusOK, gin.H{"success": true}) } // MatchUsers POST /api/match/users func MatchUsers(c *gin.Context) { var body struct { UserID string `json:"userId" binding:"required"` MatchType string `json:"matchType"` } if err := c.ShouldBindJSON(&body); err != nil { c.JSON(http.StatusBadRequest, gin.H{"success": false, "message": "缺少用户ID"}) return } var users []model.User if err := database.DB().Where("id != ?", body.UserID).Order("created_at DESC").Limit(20).Find(&users).Error; err != nil || len(users) == 0 { c.JSON(http.StatusOK, gin.H{"success": false, "message": "暂无匹配用户", "data": nil}) return } // 随机选一个 idx := 0 if len(users) > 1 { idx = int(users[0].CreatedAt.Unix() % int64(len(users))) } r := users[idx] nickname := "微信用户" if r.Nickname != nil { nickname = *r.Nickname } avatar := "" if r.Avatar != nil { avatar = *r.Avatar } wechat := "" if r.WechatID != nil { wechat = *r.WechatID } phone := "" if r.Phone != nil { phone = *r.Phone if len(phone) == 11 { phone = phone[:3] + "****" + phone[7:] } } intro := "来自Soul创业派对的伙伴" matchLabels := map[string]string{"partner": "找伙伴", "investor": "资源对接", "mentor": "导师顾问", "team": "团队招募"} tag := matchLabels[body.MatchType] if tag == "" { tag = "找伙伴" } c.JSON(http.StatusOK, gin.H{ "success": true, "data": gin.H{ "id": r.ID, "nickname": nickname, "avatar": avatar, "wechat": wechat, "phone": phone, "introduction": intro, "tags": []string{"创业者", tag}, "matchScore": 80 + (r.CreatedAt.Unix() % 20), "commonInterests": []gin.H{ gin.H{"icon": "📚", "text": "都在读《创业派对》"}, gin.H{"icon": "💼", "text": "对创业感兴趣"}, gin.H{"icon": "🎯", "text": "相似的发展方向"}, }, }, "totalUsers": len(users), }) }