# Conflicts: # .cursor/agent/软件测试/evolution/索引.md resolved by yongxu-dev version # .cursor/skills/testing/SKILL.md resolved by yongxu-dev version # .gitignore resolved by yongxu-dev version # miniprogram/app.js resolved by yongxu-dev version # miniprogram/app.json resolved by yongxu-dev version # miniprogram/pages/chapters/chapters.js resolved by yongxu-dev version # miniprogram/pages/index/index.js resolved by yongxu-dev version # miniprogram/pages/index/index.wxml resolved by yongxu-dev version # miniprogram/pages/match/match.js resolved by yongxu-dev version # miniprogram/pages/my/my.js resolved by yongxu-dev version # miniprogram/pages/my/my.wxml resolved by yongxu-dev version # miniprogram/pages/my/my.wxss resolved by yongxu-dev version # miniprogram/pages/read/read.js resolved by yongxu-dev version # miniprogram/pages/read/read.wxml resolved by yongxu-dev version # miniprogram/pages/read/read.wxss resolved by yongxu-dev version # miniprogram/pages/wallet/wallet.js resolved by yongxu-dev version # miniprogram/pages/wallet/wallet.wxml resolved by yongxu-dev version # miniprogram/pages/wallet/wallet.wxss resolved by yongxu-dev version # miniprogram/utils/ruleEngine.js resolved by yongxu-dev version # miniprogram/utils/trackClick.js resolved by yongxu-dev version # soul-admin/dist/index.html resolved by yongxu-dev version # soul-admin/src/components/RichEditor.tsx resolved by yongxu-dev version # soul-admin/src/layouts/AdminLayout.tsx resolved by yongxu-dev version # soul-admin/src/pages/api-docs/ApiDocsPage.tsx resolved by yongxu-dev version # soul-admin/src/pages/content/ContentPage.tsx resolved by yongxu-dev version # soul-admin/src/pages/settings/SettingsPage.tsx resolved by yongxu-dev version # soul-admin/tsconfig.tsbuildinfo resolved by yongxu-dev version # soul-api/.env.production resolved by yongxu-dev version # soul-api/internal/database/database.go resolved by yongxu-dev version # soul-api/internal/handler/balance.go resolved by yongxu-dev version # soul-api/internal/handler/book.go resolved by yongxu-dev version # soul-api/internal/handler/ckb_open.go resolved by yongxu-dev version # soul-api/internal/handler/db.go resolved by yongxu-dev version # soul-api/internal/handler/db_book.go resolved by yongxu-dev version # soul-api/internal/handler/db_person.go resolved by yongxu-dev version # soul-api/internal/handler/search.go resolved by yongxu-dev version # soul-api/internal/handler/upload.go resolved by yongxu-dev version # soul-api/internal/router/router.go resolved by yongxu-dev version # soul-api/wechat/info.log resolved by yongxu-dev version # 开发文档/10、项目管理/运营与变更.md resolved by yongxu-dev version # 开发文档/1、需求/需求汇总.md resolved by yongxu-dev version
148 lines
4.5 KiB
Go
148 lines
4.5 KiB
Go
package handler
|
||
|
||
import (
|
||
"net/http"
|
||
"strconv"
|
||
|
||
"soul-api/internal/database"
|
||
"soul-api/internal/model"
|
||
|
||
"github.com/gin-gonic/gin"
|
||
"gorm.io/gorm"
|
||
)
|
||
|
||
// MiniprogramUserRules GET /api/miniprogram/user-rules(小程序端,只返回启用的规则)
|
||
func MiniprogramUserRules(c *gin.Context) {
|
||
db := database.DB()
|
||
var rules []model.UserRule
|
||
if err := db.Where("enabled = ?", true).Order("sort ASC, id ASC").Find(&rules).Error; err != nil {
|
||
c.JSON(http.StatusOK, gin.H{"success": false, "error": err.Error()})
|
||
return
|
||
}
|
||
out := make([]gin.H, 0, len(rules))
|
||
for _, r := range rules {
|
||
out = append(out, gin.H{"id": r.ID, "title": r.Title, "description": r.Description, "trigger": r.Trigger, "sort": r.Sort})
|
||
}
|
||
c.JSON(http.StatusOK, gin.H{"success": true, "rules": out})
|
||
}
|
||
|
||
// DBUserRulesList GET /api/db/user-rules
|
||
func DBUserRulesList(c *gin.Context) {
|
||
db := database.DB()
|
||
var rules []model.UserRule
|
||
if err := db.Order("sort ASC, id ASC").Find(&rules).Error; err != nil {
|
||
c.JSON(http.StatusOK, gin.H{"success": false, "error": err.Error()})
|
||
return
|
||
}
|
||
c.JSON(http.StatusOK, gin.H{"success": true, "rules": rules})
|
||
}
|
||
|
||
// MiniprogramUserRulesGet GET /api/miniprogram/user-rules 小程序规则引擎:返回启用的规则,无需鉴权
|
||
func MiniprogramUserRulesGet(c *gin.Context) {
|
||
db := database.DB()
|
||
var rules []model.UserRule
|
||
if err := db.Where("enabled = ?", true).Order("sort ASC, id ASC").Find(&rules).Error; err != nil {
|
||
c.JSON(http.StatusOK, gin.H{"success": false, "error": err.Error()})
|
||
return
|
||
}
|
||
c.JSON(http.StatusOK, gin.H{"success": true, "rules": rules})
|
||
}
|
||
|
||
// DBUserRulesAction POST/PUT/DELETE /api/db/user-rules
|
||
func DBUserRulesAction(c *gin.Context) {
|
||
db := database.DB()
|
||
|
||
switch c.Request.Method {
|
||
case http.MethodPost:
|
||
var body struct {
|
||
Title string `json:"title" binding:"required"`
|
||
Description string `json:"description"`
|
||
Trigger string `json:"trigger"`
|
||
Sort int `json:"sort"`
|
||
Enabled *bool `json:"enabled"`
|
||
}
|
||
if err := c.ShouldBindJSON(&body); err != nil {
|
||
c.JSON(http.StatusBadRequest, gin.H{"success": false, "error": "参数错误"})
|
||
return
|
||
}
|
||
enabled := true
|
||
if body.Enabled != nil {
|
||
enabled = *body.Enabled
|
||
}
|
||
rule := model.UserRule{
|
||
Title: trimSpace(body.Title),
|
||
Description: body.Description,
|
||
Trigger: trimSpace(body.Trigger),
|
||
Sort: body.Sort,
|
||
Enabled: enabled,
|
||
}
|
||
if err := db.Create(&rule).Error; err != nil {
|
||
c.JSON(http.StatusOK, gin.H{"success": false, "error": err.Error()})
|
||
return
|
||
}
|
||
c.JSON(http.StatusOK, gin.H{"success": true, "rule": rule})
|
||
|
||
case http.MethodPut:
|
||
var body struct {
|
||
ID uint `json:"id" binding:"required"`
|
||
Title string `json:"title"`
|
||
Description string `json:"description"`
|
||
Trigger string `json:"trigger"`
|
||
Sort *int `json:"sort"`
|
||
Enabled *bool `json:"enabled"`
|
||
}
|
||
if err := c.ShouldBindJSON(&body); err != nil {
|
||
c.JSON(http.StatusBadRequest, gin.H{"success": false, "error": "参数错误"})
|
||
return
|
||
}
|
||
var rule model.UserRule
|
||
if err := db.First(&rule, body.ID).Error; err != nil {
|
||
if err == gorm.ErrRecordNotFound {
|
||
c.JSON(http.StatusNotFound, gin.H{"success": false, "error": "规则不存在"})
|
||
return
|
||
}
|
||
c.JSON(http.StatusOK, gin.H{"success": false, "error": err.Error()})
|
||
return
|
||
}
|
||
updates := make(map[string]interface{})
|
||
if body.Title != "" {
|
||
updates["title"] = trimSpace(body.Title)
|
||
}
|
||
updates["description"] = body.Description
|
||
updates["trigger"] = trimSpace(body.Trigger)
|
||
if body.Sort != nil {
|
||
updates["sort"] = *body.Sort
|
||
}
|
||
if body.Enabled != nil {
|
||
updates["enabled"] = *body.Enabled
|
||
}
|
||
if err := db.Model(&rule).Updates(updates).Error; err != nil {
|
||
c.JSON(http.StatusOK, gin.H{"success": false, "error": err.Error()})
|
||
return
|
||
}
|
||
var updated model.UserRule
|
||
_ = db.First(&updated, body.ID)
|
||
c.JSON(http.StatusOK, gin.H{"success": true, "rule": updated})
|
||
|
||
case http.MethodDelete:
|
||
idStr := c.Query("id")
|
||
if idStr == "" {
|
||
c.JSON(http.StatusBadRequest, gin.H{"success": false, "error": "缺少 id"})
|
||
return
|
||
}
|
||
id, err := strconv.ParseUint(idStr, 10, 32)
|
||
if err != nil {
|
||
c.JSON(http.StatusBadRequest, gin.H{"success": false, "error": "id 无效"})
|
||
return
|
||
}
|
||
if err := db.Delete(&model.UserRule{}, uint(id)).Error; err != nil {
|
||
c.JSON(http.StatusOK, gin.H{"success": false, "error": err.Error()})
|
||
return
|
||
}
|
||
c.JSON(http.StatusOK, gin.H{"success": true})
|
||
|
||
default:
|
||
c.JSON(http.StatusMethodNotAllowed, gin.H{"success": false, "error": "方法不支持"})
|
||
}
|
||
}
|