Rodger-Wang
24e17b3434
收拢积压改动:恒玄 OTA、发版配置拆表、实名认证、芯片厂商/代工厂管理等
把工作区里积压的多轮改动一次性入库。主要几块:
客户端
- 恒玄 OTA 打通:新增 local_plugins/bes_ota_manager(自包含 BES SDK,
Android Java + iOS ObjC,SPP OTA 2.0),路由切到 BesOtaUpgradeView /
BesOtaUpgradeController,配套下载服务;杰理那套文件保留但已不挂路由。
- 通话翻译新增阿里 3.5 档(alibaba35_language_config.dart,
qwen3.5-livetranslate-flash-realtime + 实时声音复刻)。
- 实名认证接入、游客登录改走服务端 api_sgin 的 Tourists 分支、
功能闸门由 GuestGuard 改为 IdVerifyGuard。
- 41 个语种文案同步(OTA 新增 28 个 key 等)。
- 默认主题改为浅色,不跟随系统。
服务端
- 发版类配置拆表:app_release(版本控制 / 游客显隐,一应用一行)与
channel_app(渠道级下载地址 / 上架状态 / 支付渠道)分家,
新增 comm/apprelease.go 与 console/api_apprelease.go。
- 授权码字符串整体移除:删除 utils/license 包,新增 utils/devcode
(MAC 规范化与 PID 反解),配套迁移 SQL 在 docs/migrations/。
- console 新增芯片厂商、代工厂、用户管理接口与对应 admin 页面。
- 身份证实名核验(sys/idverify)与第三方服务的服务端专用类别。
其它
- .gitignore 补挡 apps/services/lego/sys/gin/log-*.log:gin 子系统跑起来
会按时间戳滚动生成日志(多为 0 字节),与 apps/services/comm/log 同一
性质,不进版本管理。已跟踪的 log-2026-08-20 那个仍在库里,未动。
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
1 month ago
Rodger-Wang
d7fad60658
设备表合表:license_<pid> 分表 → 全局 device_mac,只按 MAC 校验
设备的身份是它自己的 MAC,本来就全局唯一,定位一台设备不需要 pid。
原先按产品切分表,pid 既是查询键、又得由客户端猜出来,猜错就报
"这台 MAC 没登记在该产品下"——提示指向数据缺失,实际数据好好的。
触发改造的事故:一台已正确导入的 DEEPVOICE 耳机(MAC 在 license_b022,
产品 45090,status=0 未绑过)连不上、弹"设备连接受限"。根因是产品 45090
的 devicetype 被配成 2(BLE双端)而不是 1(经典蓝牙):客户端
_resolveProductId 第一步就 where(devicetype==1) 把整个产品滤掉,候选只剩
Echo-one,名字互不包含 → 兜底退回 headsets.first.id = 45091,服务端拿错
pid 去 license_b023 查,自然查不到。而且就算 pid 猜对也过不去——服务端
只有 devicetype==1 才走 MAC 反查,2 会走 else 分支从空 code 反解 pid、
回退写死的 45058。
改动:
- 新增全局表 device_mac(comm.TableDeviceMac),主键 code = MAC;
productid 降为归属列,不再是查询键。TableLicense 标记废弃,只留给迁移读。
- registry.go 的 migrateLicenseToDeviceMac 每次启动跑、幂等:
① code := devicemac 修存量 → ② 按两表列名交集做 INSERT ... ON CONFLICT
DO NOTHING(不能 SELECT *:各分表建于不同时期,有的多 factoryid/probatch)
→ ③ productid 为空的用表名里的 pid 补上。孤儿分表里也是真实发出去的设备,
一并搬。搬完刻意不删旧表——不可逆数据,旧表是出问题时唯一的回退依据。
- binddevice / unbinddevice 改为先按 code 再按 MAC 全局定位,命中行的
productid 才是产品。req.Pid 不再采信。杰理链路也顺带不需要 devcode
反解 pid 了。
- 新增 comm.ScopeToProduct:合表后分表那层天然隔离没有了,每个"按产品"
的读写都必须显式带 productid,漏一处就跨产品操作——查询多列几行只是
难看,批量禁用 / 按批次删除漏掉就是删别人产品的数据。它会把调用方的
条件整体括起来,防止 "a=? or b=?" 让 or 把 productid 短路掉。
- 导入查重改成全局:同一个 MAC 出现在两个产品下会让按 MAC 反查出现歧义。
- 客户端删掉 _resolveProductId,binddevice 只报 MAC 不传 pid。
按需求明确不做应用隔离:MAC 存在即放行。
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
1 month ago
Rodger-Wang
946204cc3c
翻译延迟优化:接上阿里增量文本、面对面/同传去掉固定等待
通话翻译:阿里百炼端到端协议本来就是流式的(音频 response.audio.delta
一直在逐帧回灌),但增量文本订阅的事件名是错的——代码监听
response.audio_transcript.delta(字段 delta),而实时语音翻译
audio+text 模态实际发的是 response.audio_transcript.text(字段 text),
.delta 是 OpenAI Realtime / 通义 Omni 的写法。于是 onPartialText 一次
都不触发,译文只在 .done 时整句蹦出来,看着像"等说完才翻"。
现在两套名字都认、两个字段都取,并按首次出现的事件名锁定,防止服务端
兼容层双发导致文本累计两遍。Android / iOS 两端同改。
面对面 / 同声翻译(走 ASR → HTTP 机器翻译 → TTS 三段串行):
- 补上 Speech_SegmentationSilenceTimeoutMs=300,原来一行没设走 Azure
默认 500ms,这是"说完到出译文"里唯一一段纯等待;
- 同传 / 音视频改单语 ASR,关掉连续语种识别(它要缓冲够音频、给候选
语言逐个打分才敢出 final)。只有面对面需要判断"谁在说",仍保持双语;
- 中间结果翻译从"每 300ms 无条件发"改成 700ms + 至少多 4 个字 +
CancelToken 撤旧请求 + 序号丢弃过期结果。中间译文只上屏不播报,
原来一句 5 秒的话要打十几次真实服务商调用,还会跟 final 抢链路;
- TTS 提到 _updateExistingHistoryItem 最前,不再排在浮窗 / 写历史 /
记统计那串 await 之后;
- startRecognition 先 await onInit 那次 changeTranslationMode,堵掉
"进页面立刻点开始 → 落到默认 zh-CN/en-US"的竞态。
AuthInterceptor 的 DioExceptionType.cancel 分支不再弹红色"请求已取消"
——取消永远是客户端自己发起的,不改的话中间结果一接上就会一路狂弹。
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
1 month ago
Rodger-Wang
90abb0ad42
身份证实名核验、翻译与新用户开户礼
本次会话开始前就已存在于工作区的改动,一并提交。主要是三块:
1) 身份证实名核验(sys/idverify + user 模块)
接入阿里云 Id2MetaVerify、腾讯云 IdCardVerification、创蓝三家 provider,
无状态工厂——配置在 svc_config 里按应用作用域存,调用时才解析。
客户端接口 user_idverify / user_getidverify。
凭据是云账号主 AK/SK,故新增服务端专用类别 comm.SvcCatIdVerify=11,
由 svcresolve.go 在下发口整条跳过,svcpool_serveronly_test.go 守着这条底线。
2) 翻译(sys/aliyun/translate + comm/lang.go)
语言码归一与阿里云翻译调用。
3) 新用户开户礼(newuser_gift.go)
配套 api_sgin 建号流程。
注:go test ./modules/user/ 里的 TestApiProbeAppConfigV3 会失败,但与本次改动无关
——那是打线上接口的联调探针,硬编码的域名 app-dev.voitrans.net 已废弃、JWT 也过期了,
该文件自 b2577e16 起未改动过。go test -short 会跳过它,其余全部通过。
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
1 month ago
Rodger-Wang
0663446f0c
运行日志 apps/services/comm/log 移出版本管理
lego 未配置日志路径时会在工作目录写 ./log,本地跑一次服务或 go test 就被覆写一次,
每次都产生一条无意义 diff(内容是同一条微信支付密钥解密失败的告警,只有时间戳在变)。
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
1 month ago
Rodger-Wang
2d1ee0b783
apps/client 首次入库(Flutter 移动端)
从 /Users/yunyanzhineng/work/eaimar_client-main 搬入,未带原 .git,历史留在原仓库。
3215 个文件 / 约 118MB,其中约 40MB 是构建必需的预编译 SDK(azure_speech 的
MicrosoftCognitiveServicesSpeech.xcframework、device_jieli 的 JL_BLEKit 等)。
build/ (5.2G)、ios/Pods/ (311M)、android/.gradle/ (120M) 已由 .gitignore 挡掉。
本次入库的代码包含两项刚做完的改动:
1) 游客登录入口接上服务端开关。此前 _checkGuestLoginConfig() 恒定写死 true,
入口根本不读配置。现改为取服务端算好的结论,并把入口所在的 Builder 改成 Obx
——配置是异步拿到的,Builder 只渲染 onInit 时的初值 false,入口再也不会出现。
拿不到配置时按隐藏处理:默认显示会在送审期把不该露的入口露给审核员。
⚠️ 已发布的老客户端关不掉(写死 true),只对本版及以后生效。
2) iOS 上架合规修复:
- 移除 ATT/IDFA:删掉 Info.plist 的 NSUserTrackingUsageDescription、
SKAdNetworkItems、NSAdvertisingAttributionReportEndpoint,删掉 splash 里的
授权请求与 app_tracking_transparency 依赖。本 App 从不读取 IDFA,也没有任何
广告/归因 SDK,弹框纯粹劝退用户,还要在 App Store Connect 申报追踪数据类型。
- ios/Podfile 里那段 config.build_settings.delete('NSUserTrackingUsageDescription')
是无效代码(该 key 在 Info.plist 里,不是 build setting),换成注释说明。
- 通讯录符号(ITMS-90683 被拒原因)随之一并解决:permission_handler 走 SPM 后
按 Info.plist 有无对应 key 决定编不编,判定结果被 SwiftPM 按内容哈希缓存,
改完 plist 必须清 DerivedData 与 manifests 缓存才会重新求值。
另附 GOOGLE_PLAY_RELEASE_CHECKLIST.md:Google Play 上架阻塞项的实测梳理
(targetSdk 36 与 Billing 8 的 2026-08-31 期限、16KB 页对齐不合规的两个 .so、
支付回退逻辑的下架风险)。
⚠️ android/app/sign/ 下的 eaimar.keystore 与 Eaimar.properties(含明文签名密码)
随本次提交入库,与本仓库"私有仓库下接受真实凭据"的既有取舍一致。
仓库若要公开,这两个必须先摘出去。
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
1 month ago
Rodger-Wang
db47e0f3f0
游客登录入口改为后台按版本控制
需求:后台一个开关控制游客登录按钮显隐,且只对指定版本号的客户端生效,
其余版本一律隐藏(应用商店送审场景:只给正在过审的那一版开)。
白名单语义(comm.ChannelApp.ShowTourists):
- tourists=false → 全部隐藏
- tourists=true 且 touristsversion 空 → 全部隐藏(没点名任何版本 = 谁都不放行)
- tourists=true 且 touristsversion=X → 只有版本号等于 X 的客户端可见
留空按"全隐藏"而非"全放行"是刻意选的失败方向:判宽的后果是不该露游客入口的版本
露了出去(过审风险、白嫖新用户开户礼),判严只是入口少显示。要全部隐藏就取消勾选,
后台 saveChannelApp 会拒绝"勾了开关却没填版本"这种等于没开的配置。
判定放在服务端,与 NeedForceUpdate/IsReviewing 同规矩:客户端在 user_getchannelapps
的请求里带 version,服务端把每条渠道配置的 tourists 换算成结论再下发。版本比较各端
各写一遍必然出现实现不一致,而这个开关直接关系到过审,判错代价高。
touristsversion 是 channel_app 的后加列,console 启动时用 ADD COLUMN IF NOT EXISTS
补上——CreateTable 对已存在的表跳过 AutoMigrate,不补就永远没这列。
注:db.proto / user_msg.proto / CLAUDE.md 里另有先于本次改动就存在的编辑,一并带上。
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
1 month ago
Rodger-Wang
2f81aaef93
构建产物与依赖目录移出版本管理
apps/admin/.output 与 apps/admin/node_modules 此前被纳入 git 跟踪(共 18425 个文件),
每跑一次 nuxt build 就产生数百个哈希文件的增删,真实代码 diff 被完全淹没。
部署不依赖仓库里这份产物:apps/admin/Dockerfile 是 COPY . . 之后 RUN pnpm build
在镜像内重新构建,且 .dockerignore 已排除 node_modules/.nuxt/.output——仓库里这份
从来没被用到过。
只从索引移除(git rm --cached),磁盘文件保留,本地 dev/build 不受影响。
.gitignore 同时补上此前遗漏的 .DS_Store。
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
1 month ago
Rodger-Wang
bdfcb1ecbd
站点品牌名改为翊迈SaaS管理平台
- console 的 SiteName 与 admin 的页面标题统一改名,部署模板
(console.yaml.example / env.example) 同步跟上
- 侧栏与登录页标题由后端 api_getsiteinfo 下发,改 CONSOLE_SITE_NAME
即可生效,无需重建镜像;浏览器标签页在 nuxt.config.ts 里,需重建
- dev-deploy.sh 的 along 档案密钥改为 ${DEV_KEY:-原路径},保留原默认值
的同时允许用环境变量覆盖,便于在没有该路径密钥的开发机上部署
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2 months ago
liwei1dao
bb3b1c7a3a
上传代码
2 months ago
liwei1dao
b2577e16fa
上传最新的平台代码
2 months ago
liwei1dao
af05ff12ce
上传代码
2 months ago
liwei1dao
1639cf35a0
上传代码
2 months ago
liwei1dao
aca7204e57
上传代码
2 months ago
liwei1dao
8924a3cd3b
上传服务后台代码
2 months ago
liwei1dao
554a4ab501
上传最新的版本代码
2 months ago
liwei1dao
948e368996
上传代码
2 months ago
liwei1dao
59e54eb575
上传发布版本
2 months ago
liwei1dao
6f7cfe3bb2
上传主版本
2 months ago
liwei1dao
a36f0a016a
上传服务端代码
2 months ago
liwei1dao
7660f33258
上传最新代码
2 months ago
liwei1dao
97ecbf9df5
上传新版本的管理后台
2 months ago
liwei1dao
18ffb48466
上传代码
2 months ago
liwei1dao
e270cf89b6
上传新版本管理后台
2 months ago
liwei1dao
6e5da54cf8
上传代码
3 months ago
liwei1dao
1f0f42adb8
移除误提交的 82MB home 服务编译二进制并忽略各服务同名产物
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
3 months ago
liwei1dao
af9e210f9a
会议记录接入后台服务编排:三段独立选路+客户端可选总结模型,移除旧 yaml 四套凭据模式
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
3 months ago
liwei1dao
a25b0c9fc0
上传最新的服务后台代码
3 months ago
liwei1dao
040af15192
上传基础服务代码
3 months ago
liwei1dao
d7445984cb
添加 授权吗 的方案
3 months ago
liwei1dao
197d544062
上传管理后台的系统升级和服务配置逻辑优化
3 months ago
liwei1dao
99de0fa26f
上传代码修复
3 months ago
liwei1dao
1390f50144
优化邮件登陆服务
3 months ago
liwei1dao
eaecd00d20
上传基本版本
3 months ago
liwei1dao
603dc89073
上传优化节点部署代码
3 months ago
liwei1dao
1d25322437
上传当前版本
3 months ago
liwei1dao
b493d5b4b1
上传部署代码
3 months ago
liwei1dao
c44d7145b0
上传主界面
3 months ago
liwei1dao
ae39fdeef1
优化会议记录
4 months ago
liwei1dao
1b2f74e0c0
优化部署脚本
4 months ago
liwei1dao
ec7d512172
上传基础开发版
4 months ago
liwei1dao
66d561dc1b
上传代码
4 months ago
liwei1dao
ce15363123
上传服务端代码优化
4 months ago
liwei1dao
188a0f5c55
上传版本服务服务集群代码和管理后台
4 months ago
liwei1dao
d4daf15ae7
上传新版本服务框架代码
4 months ago
liwei1dao
715f8e3818
上传厨师版本
4 months ago