From 8289245dd1e9e9e51f3b528ce11c68b5a402068d Mon Sep 17 00:00:00 2001 From: Karlcarlo Date: Tue, 8 Sep 2026 00:10:14 +0800 Subject: [PATCH] =?UTF-8?q?=E8=BA=AB=E4=BB=BD=E6=A8=A1=E5=9E=8Bv3:=20?= =?UTF-8?q?=E6=98=BE=E5=BC=8F=20authorized=20=E7=8A=B6=E6=80=81(=E9=80=80?= =?UTF-8?q?=E5=87=BA=E5=8F=AA=E7=BF=BB=E7=8A=B6=E6=80=81=E4=B8=8D=E6=B8=85?= =?UTF-8?q?=E8=B5=84=E6=96=99);=20=E6=8E=88=E6=9D=83=E7=BB=93=E6=9E=9C?= =?UTF-8?q?=E5=90=8C=E6=AD=A5=E8=A6=86=E7=9B=96=E5=BA=94=E7=94=A8=E6=A1=A3?= =?UTF-8?q?=E6=A1=88(=E5=90=AB=E6=96=B0=E6=89=8B=E6=9C=BA=E5=8F=B7);=20PUT?= =?UTF-8?q?=20/profile=20=E6=94=B6=E6=98=B5=E7=A7=B0/=E5=A4=B4=E5=83=8F(?= =?UTF-8?q?=E8=B5=84=E6=96=99=E7=BC=96=E8=BE=91=E8=90=BD=E5=BA=93);=20pfSa?= =?UTF-8?q?ve=20=E5=A4=B4=E5=83=8F=E4=B8=8A=E4=BC=A0+=E8=90=BD=E5=BA=93=20?= =?UTF-8?q?(v26090709)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- index.html | 10 ++++----- js/app.js | 66 +++++++++++++++++++++++++++++++++--------------------- 2 files changed, 45 insertions(+), 31 deletions(-) diff --git a/index.html b/index.html index 96acbf3..8269961 100644 --- a/index.html +++ b/index.html @@ -6,8 +6,8 @@ 妈妈盒子 · 孕育陪伴 - - + + @@ -1758,8 +1758,8 @@ 加载失败/离线时 window.wx 为 undefined,goMall() 会降级为 toast 提示, 不影响应用其余功能。 --> - - -
v26090708
+ + +
v26090709
diff --git a/js/app.js b/js/app.js index e2636df..4a5deb2 100644 --- a/js/app.js +++ b/js/app.js @@ -1929,18 +1929,11 @@ const day = Math.min(6, Math.max(0, parseInt(pgDay.value, 10) || 0)); const sexBtn = $('#pgSex .pick.is-active'); - /* ---- 妈妈那半 ---- - 身份模型:展示名「授权登录昵称优先」——state.userName 若来自授权登录 - (applyRemoteProfile 写入且 _authNameFromAuth 标记),弹窗昵称不覆盖它, - 只作本地展示 fallback(state.localName)。 */ - if (!state._authNameFromAuth) { - $('#meName').textContent = name; - state.userName = name; - } - if (avBig.classList.contains('has-img')) { - meAvatarImg.src = avPreview.src; - meAvatar.classList.add('has-img'); - } + /* ---- 妈妈那半(本地即时生效)---- + 身份模型:卡片统一读档案;资料编辑的昵称/头像也是档案的一部分(最后写者胜)。 + 落库在下方 fetch(头像需先上传换 URL)。 */ + $('#meName').textContent = name; + state.userName = name; /* ⚠️ 这里原来还有一行 state.userBio = bio 和一次 syncBio() 调用。 一句话签名整块已按用户要求删除(输入框 #pfBio、展示行 #meBio、 syncBio()、state.userBio 四处一起删),别只加回其中一处。 */ @@ -1952,15 +1945,41 @@ state.babySex = (sexBtn && sexBtn.dataset.sex) || 'unknown'; state.due = parseDay(pgDue.value); - /* ---- 落库:孕育字段走 PUT /profile(只收 babyName/babySex/dueDate, - 显示字段后端明确不收)→ 刷新/重进后资料不丢。失败静默,本地已生效。 ---- */ + /* ---- 落库:PUT /profile(孕育字段 + 昵称/头像)→ 刷新/重进后资料不丢。 + 若弹窗里新选了头像(avFile 有文件),先 POST /upload 换正式 URL 再一起提交; + 上传失败则跳过头像字段(昵称/孕育照存)。断网/接口失败静默,本地已生效。 ---- */ var _oid = hashParam('openid'); - if (_oid) { + function _putProfile(avatarUrl) { + if (!_oid) return; + var body = { + babyName: babyName, + babySex: state.babySex, + dueDate: state.due ? toISO(state.due) : '', + userName: name + }; + if (avatarUrl) { + body.avatar = avatarUrl; + meAvatarImg.src = avatarUrl; /* 用正式 URL 替换 base64 预览 */ + } fetch('/api/mp/public/mama-box/profile?openid=' + encodeURIComponent(_oid), { method: 'PUT', headers: { 'Content-Type': 'application/json' }, - body: JSON.stringify({ babyName: babyName, babySex: state.babySex, dueDate: state.due ? toISO(state.due) : '' }) - }).catch(function () { /* 断网时保持本地值,页面照常用 */ }); + body: JSON.stringify(body) + }).catch(function () { /* 保持本地值 */ }); + } + var newAvatarFile = (avFile.files && avFile.files[0]) || null; + if (newAvatarFile && avBig.classList.contains('has-img')) { + var fd = new FormData(); + fd.append('file', newAvatarFile, newAvatarFile.name || 'avatar.png'); + fetch('/api/upload', { method: 'POST', body: fd }) + .then(function (r) { return r.json(); }) + .then(function (res) { + var url = res && res.result && res.result.url; + _putProfile(url || ''); + }) + .catch(function () { _putProfile(''); }); + } else { + _putProfile(''); } /* ⚠️ syncPregnancy() 就是用户说的「同步到孕期卡上边」那一步 —— @@ -4001,21 +4020,16 @@ if (p.babySex && p.babySex !== 'unknown') state.babySex = p.babySex; if (p.dueDate) { const d = parseDay(p.dueDate); if (d) state.due = d; } /* 状态化「我的」页:未授权→占位+显示授权入口;已授权→资料+隐藏授权入口;已建档(B→C)由孕期信息卡引导 */ - var _auth = !!(p.userName || p.avatar || p.phone); + var _authorized = !!p.authorized || !!p.isAuthorized; var _n = $('#meName'); if (_n) _n.textContent = p.userName || '未登录'; if (p.avatar) { var _ai = $('#meAvatarImg'), _aw = $('#meAvatar'); if (_ai) _ai.src = p.avatar; if (_aw) _aw.classList.add('has-img'); } - var _box = $('#meAuthBox'); if (_box) _box.style.display = _auth ? 'none' : ''; - /* 授权信息优先:后端返回的 userName/avatar 即「授权登录信息」(含 CRMEB 同步), - 标记 _authNameFromAuth —— 「我的资料」弹窗保存时不覆盖它(见 pfSave)。 */ - if (p.userName) { - state._authNameFromAuth = true; - } - /* 退出按钮只在已登录(任一授权资料非空)时显示 —— 未登录"退出"没有意义 */ - var _lx = $('#meLogoutBtn'); if (_lx) _lx.style.display = _auth ? '' : 'none'; + /* 授权入口:未授权时显示(引导先授权);退出按钮:已授权时显示 */ + var _box = $('#meAuthBox'); if (_box) _box.style.display = _authorized ? 'none' : ''; + var _lx = $('#meLogoutBtn'); if (_lx) _lx.style.display = _authorized ? '' : 'none'; if (!p.userName) { var _ai2 = $('#meAvatarImg'); if (_ai2) _ai2.removeAttribute('src'); } } if (pg && pg.code === 200 && pg.result) {