Build and Publish Server / build (push) Successful in 4m30s
- 新增商业化模块:Stripe/Binance Pay 支付、邮箱登录、订单管理 - 新增数据模型:ReportProduct, ReportEntitlement, ReportSnapshot, PaymentEvent, EmailLoginCode - 新增 API:/api/commerce/checkout, /api/commerce/webhooks/*, /api/commerce/orders/* - 新增管理后台:订单列表、统计图表、统一 AdminHeader 组件 - 新增中间件测试:RateLimit, Auth, CORS 共 7 个测试用例 - 新增 AGENTS.md 项目代理指令文件 - 新增 REMINDER.md 商业化功能开发规范 - 修复 JWT 解析:添加 WithValidMethods 限制 HS256 - 修复 GetPayStatus:增加用户权限校验 - 更新 .gitignore 和 README.md
124 lines
6.5 KiB
Go
124 lines
6.5 KiB
Go
package service
|
|
|
|
import (
|
|
"encoding/json"
|
|
"errors"
|
|
"fmt"
|
|
)
|
|
|
|
type premiumTrait struct {
|
|
Gift string
|
|
Caution string
|
|
Field string
|
|
Rhythm string
|
|
}
|
|
|
|
type premiumSnapshot struct {
|
|
ID string `json:"id"`
|
|
Result struct {
|
|
EightChar struct {
|
|
DayMaster string `json:"dayMaster"`
|
|
DayMasterElement string `json:"dayMasterElement"`
|
|
} `json:"eightChar"`
|
|
DecadeFortunes []struct {
|
|
Ganzhi string `json:"ganzhi"`
|
|
StartAge int `json:"startAge"`
|
|
} `json:"decadeFortunes"`
|
|
} `json:"result"`
|
|
Elements struct {
|
|
Dominant string `json:"dominant"`
|
|
Weakest string `json:"weakest"`
|
|
} `json:"elements"`
|
|
Shensha []struct {
|
|
Name string `json:"name"`
|
|
Type string `json:"type"`
|
|
} `json:"shensha"`
|
|
Sections []premiumSection `json:"sections"`
|
|
}
|
|
|
|
type premiumSection struct {
|
|
Index string `json:"index"`
|
|
Title string `json:"title"`
|
|
Kicker string `json:"kicker"`
|
|
Summary string `json:"summary"`
|
|
Details []string `json:"details"`
|
|
}
|
|
|
|
var premiumTraits = map[string]premiumTrait{
|
|
"木": {Gift: "成长力、规划感与同理心", Caution: "容易把长期目标变成眼前压力", Field: "教育、内容、设计与长期经营", Rhythm: "先建立根基,再持续放大优势"},
|
|
"火": {Gift: "表达力、行动力与感染力", Caution: "节奏过快时容易透支专注", Field: "传播、品牌、销售与创新项目", Rhythm: "抓住窗口,但为决策保留冷静期"},
|
|
"土": {Gift: "稳定性、承诺感与资源整合力", Caution: "求稳过度时会错过变化", Field: "管理、运营、资产与服务业", Rhythm: "稳中求变,用小步试错替代停滞"},
|
|
"金": {Gift: "判断力、边界感与执行标准", Caution: "标准过高时容易显得紧绷", Field: "技术、金融、法律与精细管理", Rhythm: "先定规则,再给关系留出弹性"},
|
|
"水": {Gift: "洞察力、适应力与信息敏感度", Caution: "选择过多时容易分散心力", Field: "研究、咨询、贸易与流动型工作", Rhythm: "聚焦一个主航道,让变化服务目标"},
|
|
}
|
|
|
|
var supportingElements = map[string]string{"木": "水", "火": "木", "土": "火", "金": "土", "水": "金"}
|
|
|
|
func buildPremiumSnapshot(raw string) (string, error) {
|
|
var snapshot premiumSnapshot
|
|
if err := json.Unmarshal([]byte(raw), &snapshot); err != nil {
|
|
return "", fmt.Errorf("invalid report snapshot: %w", err)
|
|
}
|
|
if snapshot.ID == "" || snapshot.Result.EightChar.DayMaster == "" || snapshot.Elements.Dominant == "" {
|
|
return "", errors.New("report snapshot is missing chart data")
|
|
}
|
|
|
|
dominant := premiumTraits[snapshot.Elements.Dominant]
|
|
dayMaster := premiumTraits[snapshot.Result.EightChar.DayMasterElement]
|
|
if dayMaster.Gift == "" {
|
|
dayMaster = dominant
|
|
}
|
|
helpful := supportingElements[snapshot.Result.EightChar.DayMasterElement]
|
|
if helpful == "" {
|
|
helpful = snapshot.Elements.Weakest
|
|
}
|
|
positiveStars := make([]string, 0, 3)
|
|
cautionStars := make([]string, 0, 2)
|
|
for _, star := range snapshot.Shensha {
|
|
if star.Type == "吉" && len(positiveStars) < 3 {
|
|
positiveStars = append(positiveStars, star.Name)
|
|
}
|
|
if star.Type == "凶" && len(cautionStars) < 2 {
|
|
cautionStars = append(cautionStars, star.Name)
|
|
}
|
|
}
|
|
starText := "命局本身的稳定结构"
|
|
if len(positiveStars) > 0 {
|
|
starText = joinChinese(positiveStars)
|
|
}
|
|
cautionText := "节奏失衡"
|
|
if len(cautionStars) > 0 {
|
|
cautionText = joinChinese(cautionStars)
|
|
}
|
|
firstFortune := "人生节奏呈阶段性变化。"
|
|
if len(snapshot.Result.DecadeFortunes) > 0 {
|
|
fortune := snapshot.Result.DecadeFortunes[0]
|
|
firstFortune = fmt.Sprintf("首步大运为%s,约从%d岁进入阶段转换。", fortune.Ganzhi, fortune.StartAge)
|
|
}
|
|
|
|
snapshot.Sections = []premiumSection{
|
|
{Index: "壹", Title: "性格底色", Kicker: snapshot.Result.EightChar.DayMaster + " · 内在驱动力", Summary: fmt.Sprintf("你的日主为%s,核心优势集中在%s。", snapshot.Result.EightChar.DayMaster, dayMaster.Gift), Details: []string{fmt.Sprintf("五行以%s较突出,做事更重视%s。", snapshot.Elements.Dominant, dominant.Gift), fmt.Sprintf("需要留意:%s。", dayMaster.Caution), fmt.Sprintf("真正适合你的成长方式是:%s。", dayMaster.Rhythm)}},
|
|
{Index: "贰", Title: "事业天赋", Kicker: "能力结构 · 职场定位", Summary: fmt.Sprintf("你的优势更容易在%s中形成复利。", dominant.Field), Details: []string{fmt.Sprintf("适合承担需要%s的角色。", dayMaster.Gift), fmt.Sprintf("命局中的%s,提示你应主动经营专业信用与协作关系。", starText), "比起频繁换方向,更适合建立可重复的方法与个人标签。"}},
|
|
{Index: "叁", Title: "财富节奏", Kicker: "积累方式 · 风险边界", Summary: fmt.Sprintf("财富策略宜围绕“%s”展开。", dominant.Rhythm), Details: []string{fmt.Sprintf("优先把%s转化成可计价的产品或服务。", dayMaster.Gift), fmt.Sprintf("遇到%s对应的冲动时,应延迟重大财务决定。", cautionText), "收入结构宜同时保留稳定现金流与小比例成长投入。"}},
|
|
{Index: "肆", Title: "关系模式", Kicker: "亲密关系 · 沟通课题", Summary: fmt.Sprintf("关系中的吸引力来自%s,长久则依赖清晰表达。", dayMaster.Gift), Details: []string{"你更需要能理解你节奏、也尊重边界的伴侣。", "情绪紧张时,先描述事实与需要,避免用结论代替沟通。", "重要关系中要刻意安排稳定相处,而不是只依赖临时热情。"}},
|
|
{Index: "伍", Title: "身心能量", Kicker: "五行平衡 · 日常建议", Summary: fmt.Sprintf("%s相对偏弱,日常可借%s的意象建立平衡感。", snapshot.Elements.Weakest, helpful), Details: []string{"把作息、运动和独处时间当作长期资产。", "高压期减少多线程任务,让注意力回到一个明确目标。", "所有健康问题应以正规医疗意见为准,本报告不替代诊断。"}},
|
|
{Index: "陆", Title: "大运路线", Kicker: "阶段重点 · 行动窗口", Summary: firstFortune, Details: []string{"大运用于观察阶段主题,不代表确定事件。", fmt.Sprintf("顺势的关键是持续放大%s,并管理%s。", dayMaster.Gift, dayMaster.Caution), "完整报告保留十步大运时间轴,方便长期回看。"}},
|
|
}
|
|
encoded, err := json.Marshal(snapshot)
|
|
if err != nil {
|
|
return "", fmt.Errorf("encode premium snapshot: %w", err)
|
|
}
|
|
return string(encoded), nil
|
|
}
|
|
|
|
func joinChinese(values []string) string {
|
|
result := ""
|
|
for index, value := range values {
|
|
if index > 0 {
|
|
result += "、"
|
|
}
|
|
result += value
|
|
}
|
|
return result
|
|
}
|