From d6892eb3d656c5c65856765a8268da4256aba113 Mon Sep 17 00:00:00 2001 From: Rodger-Wang <1367893453@qq.com> Date: Wed, 23 Sep 2026 23:36:28 +0800 Subject: [PATCH] =?UTF-8?q?=E5=90=8E=E5=8F=B0=E7=AE=A1=E7=90=86=E4=B8=8B?= =?UTF-8?q?=E8=BD=BD=E8=90=BD=E5=9C=B0=E9=A1=B5=EF=BC=9B=E5=AE=9E=E5=90=8D?= =?UTF-8?q?=E8=AE=A4=E8=AF=81=E6=98=BE=E9=9A=90=E4=B8=8E=E6=B8=B8=E5=AE=A2?= =?UTF-8?q?=E7=99=BB=E5=BD=95=E5=90=8C=E4=B8=80=E4=B8=AA=E5=8F=A3=E5=AD=90?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 下载落地页(版本与分发页) - 「下载与说明」区顶部新增「下载页」一行:编辑 / 保存 / 查看 + 地址输入框 - 编辑:CodeMirror 编辑线上 HTML,改动自动存浏览器草稿;保存才发布到分发桶 (服务端 PutObject,强制 text/html;charset=utf-8 + no-cache),地址写入 app_release.download_page - 查看:右侧抽屉预览,可切「当前编辑内容 / 线上版本」、手机 / 电脑尺寸 - 地址只能改文件名,域名与 /<应用>/ 目录由服务端卡死(TestParseDistPageURL) - 新接口 api_getdistpage / api_savedistpage;admin 新增 codemirror 依赖 实名认证显隐 - 能看到游客登录的那一版(送审版本)才显示实名认证并按实名限制功能; 其余版本实名整个隐藏,功能不受实名限制。不分 Android / iOS - 服务端:comm.AppRelease.ShowIdVerify(= ShowTourists)→ DBChannelApp.idverify 下发 - 客户端:VersionUpdateService.showIdVerify → IdVerifyGuard 隐藏即放行; 「我的」页实名行、卡片「未认证」角标跟着显隐;老服务端无 idverify 时退回 tourists - 后台「游客显隐控制」页说明改为同时控制游客登录与实名认证 Co-Authored-By: Claude Opus 5.5 (1M context) --- CLAUDE.md | 35 ++ apps/admin/app/components/AppReleasePanel.vue | 3 + apps/admin/app/components/DistPageManager.vue | 347 ++++++++++++++++++ apps/admin/app/pages/guestaccess.vue | 21 +- apps/admin/package.json | 4 + apps/admin/pnpm-lock.yaml | 197 ++++++++++ .../lib/core/utils/id_verify_guard.dart | 13 +- .../lib/data/models/channel_app_model.dart | 12 + .../lib/data/models/channel_app_model.g.dart | 2 + .../data/services/version_update_service.dart | 9 + .../modules/profile/views/profile_view.dart | 19 +- .../test/id_verify_visibility_test.dart | 49 +++ apps/proto/db.proto | 1 + apps/services/comm/apprelease.go | 18 + apps/services/comm/apprelease_test.go | 17 + apps/services/modules/console/api_config.go | 2 + apps/services/modules/console/api_distpage.go | 229 ++++++++++++ .../modules/console/api_distpage_test.go | 39 ++ apps/services/modules/console/server.go | 7 + apps/services/modules/user/model_user.go | 1 + apps/services/modules/user/module_test.go | 11 + apps/services/pb/db.pb.go | 13 +- deploy/dl/README.md | 4 + 23 files changed, 1036 insertions(+), 17 deletions(-) create mode 100644 apps/admin/app/components/DistPageManager.vue create mode 100644 apps/client/test/id_verify_visibility_test.dart create mode 100644 apps/services/modules/console/api_distpage.go create mode 100644 apps/services/modules/console/api_distpage_test.go diff --git a/CLAUDE.md b/CLAUDE.md index b13da5cc..a17251de 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -569,6 +569,20 @@ EAIMAR 客户端不再从 `env` 兼容层拿第三方凭据,改走**自己的 请求失败后缓存时间戳已落下,而缓存命中分支**不重算** `_isShowTourists`。 splash 那次失败之后,登录页再怎么重进都是隐藏的。 +#### 实名认证与游客登录同一个口子(2026-09-23) + +实名认证**不再恒定生效**:能看到游客登录的那一版(送审版本)才显示实名认证并按实名限制功能, +其余版本实名整个隐藏(「我的」页那一行、卡片「未认证」角标都不显示),**所有功能不受实名限制**。 +不分 Android / iOS,后台只有「游客显隐控制」一个开关。 + +- 服务端 `comm.AppRelease.ShowIdVerify`(目前 = `ShowTourists`)→ `DBChannelApp.idverify` 随 `user_getchannelapp` 下发。 + 单独一个字段是为了将来拆开控制时不用再发 App。 +- 客户端 `VersionUpdateService.showIdVerify`(RxBool)→ `IdVerifyGuard.entryShown`;`required` 第一条就是 + 「隐藏即放行」,所有 `blocked()` 调用点不用改。老服务端没有 `idverify` 时 `AppInfo` 退回读 `tourists`。 +- 拿不到配置 = 隐藏 = 放行(用户定的失败方向)。服务端本来就没有按实名拦截的接口,实名状态接口照常可用。 +- ⚠️ 本规则之前发布的老包仍恒定要求实名,用户决定不处理。 +- 性别锁定(已实名则性别以身份证为准)与入口显隐无关,保留。 + ### EMAI 助手的端侧指令(2026-08-29 接入) 百炼多模态会在 `RespondingContent` 这一帧里下发端侧函数调用,客户端原先**整个丢掉**了 @@ -1718,6 +1732,22 @@ google 的 aab 需要单独出)。原来靠打包时写进 `.env` 的 `Channel [auth.ts](apps/admin/app/stores/auth.ts) 的 `hasAccess` 兼容放行——同 「应用环境配置 → 服务与环境配置」那次的处理。 +### 下载落地页在后台编辑发布(2026-09-23) + +「版本与分发」页「下载与说明」区顶部的「下载页」一行管理分发桶上的静态页 +(外包装二维码指向的 `https://dl.ymaikj.com/<应用>/download.html`)。组件 +[DistPageManager.vue](apps/admin/app/components/DistPageManager.vue),后端 +[api_distpage.go](apps/services/modules/console/api_distpage.go)(`api_getdistpage` / `api_savedistpage`)。 + +- **编辑只存草稿**(浏览器 localStorage,按 应用+地址 分开),**「保存」才发布**:服务端 PutObject 覆盖, + 强制 `text/html; charset=utf-8` + `Cache-Control: no-cache`,地址写进 `app_release.download_page`。 + 读写都走服务端,不走浏览器直传;不做备份(用户定的)。 +- 地址只能改文件名:域名必须是分发域名、路径恰好 `/<应用>/<名>.html`(`parseDistPageURL`,`TestParseDistPageURL` 守着)。 + 放宽等于让人在公共桶上挂任意页面、或覆盖别的应用的页面 / `android/` 下的安装包。 +- ⚠️ 从此**后台是这份页面的唯一来源**,`deploy/dl/` 里的文件只是初始模板。改了仓库不会生效, + 反过来用仓库文件手传 OSS 会覆盖掉后台改过的版本。 +- `download_page` 与版本字段同一行,保存仍是「读整行 → 只改这一列 → 写回」,同游客显隐那条规矩。 + ### 配置分家:channel_app 与 app_release(2026-08-31) 后台的发版类配置拆成两张表,边界是「**这一项会不会因渠道而异**」: @@ -2424,6 +2454,11 @@ Google 语音、Google 登录、微信支付、支付宝、微软翻译——都 `Insert` 一次默认超管、返回值还没接。改成**只在账号不存在时**插入。 ⚠️ 别图省事改用 `Save`/Upsert:那会把运营改过的密码在每次重启时刷回配置文件里的初始值。 +⚠️ **微信登录 2026-09-23 起支持热更**(`wechat_auth.Reload`,登记在 `services/home/configreload.go`)。 +此前它不在热更清单里、且 `OnInit` 对空 AppSecret 也报 `success`:正式服在后台补填 AppSecret 后仍持续 +`41004 appsecret missing`,直到重启。现在空 AppID/AppSecret 启动即 WARN 降级,后台保存后即时生效, +填错则本次重载失败、保留旧配置。**其余 auth(google_auth 等)仍需重启**,要扩展照这个 Reload 补。 + 顺带两处:`sys/auth/*` 五个包的 logger 名全被复制成了 `sys.tavily`(所以 firebase 的错误显示成 `[sys.tavily]`,查的时候会被带偏),已各改各名;`google_auth` 原先 `newSys` 无条件返回成功、日志打 `init sys.google_auth success!`,而配置指的 json 根本不存在,直到有人点 Google 登录才失败—— diff --git a/apps/admin/app/components/AppReleasePanel.vue b/apps/admin/app/components/AppReleasePanel.vue index f23e9b55..205b77b5 100644 --- a/apps/admin/app/components/AppReleasePanel.vue +++ b/apps/admin/app/components/AppReleasePanel.vue @@ -57,6 +57,8 @@
下载与说明
+ + 默认下载地址(网页下载页)
@@ -128,6 +130,7 @@ import { ref, reactive, computed, watch, onMounted } from 'vue' import { useApi } from '~/composables/useApi' import { useToast } from '~/composables/useToast' +import DistPageManager from '~/components/DistPageManager.vue' interface AppRelease { version: string diff --git a/apps/admin/app/components/DistPageManager.vue b/apps/admin/app/components/DistPageManager.vue new file mode 100644 index 00000000..5a327a0a --- /dev/null +++ b/apps/admin/app/components/DistPageManager.vue @@ -0,0 +1,347 @@ +