From e6b8443b0c926f54b583d371d42633234becd59d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=8D=A1=E8=8B=A5?= Date: Tue, 24 Mar 2026 12:54:39 +0800 Subject: [PATCH] =?UTF-8?q?fix:=20=E5=A4=B4=E5=83=8F=E6=98=B5=E7=A7=B0?= =?UTF-8?q?=E9=A1=B5=E4=B8=8E=E8=A7=84=E5=88=99=E5=BC=95=E6=93=8E=EF=BC=9B?= =?UTF-8?q?=E7=94=A8=E6=88=B7=E9=A1=B5=E4=B8=8E=20user/user=5Frule=20API?= =?UTF-8?q?=EF=BC=9B=E6=9B=B4=E6=96=B0=20admin=20dist?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Made-with: Cursor --- .../pages/avatar-nickname/avatar-nickname.js | 20 +- .../avatar-nickname/avatar-nickname.wxml | 8 +- .../avatar-nickname/avatar-nickname.wxss | 7 + miniprogram/utils/ruleEngine.js | 106 +++++- .../{index-Dz0mx7au.js => index-Dk6CvQRe.js} | 322 +++++++++--------- soul-admin/dist/index.html | 2 +- soul-admin/src/pages/users/UsersPage.tsx | 47 ++- soul-api/internal/handler/user.go | 4 + soul-api/internal/model/user_rule.go | 23 ++ 9 files changed, 354 insertions(+), 185 deletions(-) rename soul-admin/dist/assets/{index-Dz0mx7au.js => index-Dk6CvQRe.js} (83%) diff --git a/miniprogram/pages/avatar-nickname/avatar-nickname.js b/miniprogram/pages/avatar-nickname/avatar-nickname.js index 7390cc52..5293a5b5 100644 --- a/miniprogram/pages/avatar-nickname/avatar-nickname.js +++ b/miniprogram/pages/avatar-nickname/avatar-nickname.js @@ -12,11 +12,29 @@ Page({ saving: false, showPrivacyModal: false, nicknameInputFocus: false, + /** 规则引擎传入:avatar | nickname,用于高亮对应区块 */ + uiFocus: '', }, - onLoad() { + onLoad(options) { this.setData({ statusBarHeight: app.globalData.statusBarHeight || 44 }) + const focus = String(options.focus || '').toLowerCase() + if (focus === 'avatar' || focus === 'nickname') { + this.setData({ uiFocus: focus }) + } this.loadFromUser() + if (focus === 'nickname') { + setTimeout(() => { + if (typeof wx.requirePrivacyAuthorize === 'function') { + wx.requirePrivacyAuthorize({ + success: () => this.setData({ nicknameInputFocus: true }), + fail: () => {}, + }) + } else { + this.setData({ nicknameInputFocus: true }) + } + }, 400) + } }, loadFromUser() { diff --git a/miniprogram/pages/avatar-nickname/avatar-nickname.wxml b/miniprogram/pages/avatar-nickname/avatar-nickname.wxml index c3bbdf27..6a920990 100644 --- a/miniprogram/pages/avatar-nickname/avatar-nickname.wxml +++ b/miniprogram/pages/avatar-nickname/avatar-nickname.wxml @@ -11,11 +11,13 @@ 设置对外展示信息 - 头像与昵称会出现在名片与匹配卡片上,方便伙伴认出你。 + 请先换一张清晰头像,伙伴更容易认出你。 + 请改一个真实好记的昵称,方便伙伴称呼你。 + 头像与昵称会出现在名片与匹配卡片上,方便伙伴认出你。 - + + @@ -1549,7 +1577,8 @@ export function UsersPage() { )} - ))} + ) + })} )} @@ -1899,7 +1928,7 @@ export function UsersPage() {
- setRuleForm({ ...ruleForm, trigger: e.target.value })} /> + setRuleForm({ ...ruleForm, trigger: e.target.value })} />
diff --git a/soul-api/internal/handler/user.go b/soul-api/internal/handler/user.go index f0e890c9..1e178b96 100644 --- a/soul-api/internal/handler/user.go +++ b/soul-api/internal/handler/user.go @@ -687,6 +687,10 @@ func userTrackActionLabelCN(action string) string { return "完善资料" case "fill_avatar": return "设置头像" + case "update_avatar": + return "完善头像" + case "update_nickname": + return "修改昵称" case "visit_page": return "访问页面" case "first_pay": diff --git a/soul-api/internal/model/user_rule.go b/soul-api/internal/model/user_rule.go index 6546d135..b8e5a89c 100644 --- a/soul-api/internal/model/user_rule.go +++ b/soul-api/internal/model/user_rule.go @@ -8,6 +8,29 @@ import ( // RuleJSON 存储 JSON 数组/对象的列(user_rules 的 trigger_conditions 等) type RuleJSON []byte +// MarshalJSON 原样输出 JSON,避免 encoding/json 将 []byte 编成 base64 导致前端把 triggerConditions 当字符串而 .map 崩溃 +func (r RuleJSON) MarshalJSON() ([]byte, error) { + if len(r) == 0 { + return []byte("null"), nil + } + out := make([]byte, len(r)) + copy(out, r) + return out, nil +} + +// UnmarshalJSON 接收请求体中的原始 JSON(对象/数组) +func (r *RuleJSON) UnmarshalJSON(data []byte) error { + if r == nil { + return nil + } + if len(data) == 0 || string(data) == "null" { + *r = nil + return nil + } + *r = append((*r)[0:0], data...) + return nil +} + func (r RuleJSON) Value() (driver.Value, error) { return []byte(r), nil } func (r *RuleJSON) Scan(value interface{}) error { if value == nil {