提交图

127 次代码提交

作者 SHA1 备注 提交日期
XuqmGroup
0572bbdd38 fix(ci): 修复 Jenkinsfile.tenant-web/ops-web 缓存穿透和错误处理
- 添加 --build-arg GIT_COMMIT 使 Docker 每次提交都重新构建源码层
- 添加 NO_CACHE 参数支持强制禁用缓存
- 修复 bat 错误处理(if %errorlevel% neq 0 exit /b 1)
- Deploy 阶段添加 lock('prod-deploy') + retry(2) 防并发失败
- Dockerfile.ops: 将 COPY ops-platform 移到 yarn install 之后,添加 ARG GIT_COMMIT

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-06-11 17:05:43 +08:00
XuqmGroup
07d6307b5d fix(ci): 修复 bat 脚本错误处理,Docker 失败时立即退出
原 || exit /b %ERRORLEVEL% 在 Windows bat 中无法可靠捕获 Docker API
错误(Docker Desktop 宕机时返回 500 但 %ERRORLEVEL% 可能仍为 0),
导致构建失败时管道仍标记为 SUCCESS。改为 if %errorlevel% neq 0 exit /b 1。

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-06-11 15:20:16 +08:00
XuqmGroup
50eb60b895 fix(ci): 部署阶段加 lock(prod-deploy) 和 retry,防止并发 pull 失败
多个 Jenkins job 同时向同一服务器执行 docker pull 时,containerd
ingest 目录存在 rename 竞争,会出现 "no such file or directory"
错误。通过全局锁 prod-deploy 序列化所有部署操作(与 Server
Jenkinsfile 共享同一锁名),并加 retry(2) 兜底。

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-06-11 15:16:37 +08:00
XuqmGroup
58f7fb4a44 fix(web): 修复双垂直滚动条并优化Docker构建缓存策略
- MainLayout: 为侧边栏添加 overflow:hidden,避免 el-aside 默认
  overflow:auto 在菜单内容较多时产生第二条垂直滚动条
- Dockerfile.tenant: 将 COPY 源码移至 yarn install 之后并引入
  GIT_COMMIT ARG,确保每次提交都重新构建源码层,防止 --cache-from
  错误复用旧层导致更新未生效
- Jenkinsfile: 传入 GIT_COMMIT 构建参数;新增 NO_CACHE 参数,缓存
  异常时可强制全量重建

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-06-11 15:11:43 +08:00
XuqmGroup
90c9705ff1 feat(system): 添加系统更新检查和选择性更新功能
- 新增 streamSelectiveUpdate 函数支持选择性服务更新
- 添加 UpdateCheckResult 接口定义版本更新检查结果
- 实现 checkForUpdates 函数获取版本更新信息
- 在安全中心视图添加版本信息显示和更新检查按钮
- 添加选择性更新对话框支持按服务选择更新
- 实现版本管理视图中的实时更新通知配置
- 添加从 IM 导入灰度成员功能
- 移除应用密钥管理相关的重复组件实现
2026-06-11 14:11:06 +08:00
XuqmGroup
8abcf59147 feat(app): 支持多平台包名配置和应用信息编辑功能
- 后端增加至少填写一个平台包名的验证逻辑
- 前端调整应用数据模型,将包名字段改为可选类型
- 添加应用详情页的编辑功能和表单验证
- 优化应用列表页包名显示逻辑,支持多平台包名展示
- 重构应用配置指引页面,按平台分类展示商店配置指南
- 在版本管理页面增加包名配置检查和相应提示
- 新增应用信息编辑弹窗组件和相关业务逻辑
2026-06-11 13:04:28 +08:00
XuqmGroup
0a8011d9be refactor(version): 优化版本管理中的灰度发布配置
- 移除 GrayMemberGroup 和 GraySelectionSource 类型定义
- 添加 GrayTag 类型定义以支持标签模式
- 重命名 normalizeCallbackUrl 函数为 normalizeUrl
- 简化灰度发布配置逻辑,移除本地选择源相关代码
- 将灰度同步回调URL和发布回调URL统一为 graySyncUrl 和 publishCallbackUrl
- 更新灰度成员加载逻辑为标签加载逻辑
- 移除成员模式下的回调地址验证和选择源设置
- 简化灰度模式切换条件判断逻辑
2026-06-11 12:36:27 +08:00
XuqmGroup
f116b63369 feat(update): 重构灰度发布系统并新增标签管理功能
- 灰度模式简化为 PERCENT 和 MEMBERS 两种
- 新增成员标签系统,支持标签 CRUD 和按标签选择发版
- 成员同步保留已有标签,手动成员不受同步影响
- 支持标签 + 额外成员组合选择:groupNames + extraMemberIds
- 发布时回调集成方获取成员列表,支持 AppSecret 签名验证
- 从 IM 服务导入成员功能
- 修复 isInGrayRelease() 中的 String.contains() 误匹配 bug
- 移除 IM_PUSH_USERS、CUSTOMER_SYNC、CUSTOMER_CALLBACK 模式
- 更新前端界面,优化灰度成员选择体验
- 添加发布配置和操作日志等相关数据库表结构
2026-06-11 12:30:13 +08:00
XuqmGroup
cbc29cf255 feat(update): 添加 API Key 管理和 WebSocket 实时通知功能
- 新增 API Key 管理功能,支持外部工具认证调用平台 API
- 实现 WebSocket 实时通知,版本发布时推送轻量通知给客户端
- 添加 APK 文件哈希校验,支持已下载检测和直接安装
- 支持外部 APK 上传使用 API Key 认证
- 优化私有化部署自动注入 nginx WebSocket 代理配置
- 扩展 SDK 功能包括已下载检测、直接安装和实时通知监听
2026-06-11 12:25:16 +08:00
XuqmGroup
cd39c7fb30 feat(app): 添加重新生成应用配置文件功能
- 在AppController中新增regenerateConfigFile接口
- 在AppService中实现重新生成配置文件的业务逻辑
- 记录重新生成配置文件的操作日志
- 在前端API中添加重新生成功能调用方法
- 在应用详情页面添加重新生成按钮和确认对话框
- 实现重新生成配置文件的前端交互逻辑
2026-06-02 17:43:36 +08:00
XuqmGroup
348c04ba72 refactor(app): 将许可证文件功能替换为配置文件功能
- 替换 LicenseFileCrypto 为 ConfigFileCrypto 加密类
- 将 /license-file 相关接口重命名为 /config-file
- 修改数据库实体中的 licenseFileContent 字段为 configFileContent
- 更新前端 API 调用从 downloadLicenseFile 改为 downloadConfigFile
- 将安全中心的 License 文件解析功能改为 Config 文件解析
- 更新文件扩展名从 .xuqmlicense 改为 .xuqmconfig
- 修改后端服务方法 ensureLicenseFile 为 ensureConfigFile
- 调整加密解密逻辑以支持新的配置文件格式
2026-06-02 17:35:29 +08:00
XuqmGroup
62966dcf20 feat(ui): 添加服务应用切换记忆功能并优化菜单结构
- 在IM、授权、推送、版本管理视图中添加最近使用应用的记忆功能
- 新增serviceApp工具函数用于存储和获取最近使用的应用
- 将系统日志、数据库、操作日志菜单项归类到运维管理子菜单
- 修复实体类索引字段命名不一致问题
- 在安全配置中启用方法级别安全注解支持
2026-05-28 10:53:13 +08:00
XuqmGroup
db3158d2e4 refactor(logs): 更新操作日志视图中的推送服务注释
- 修改了推送服务相关的注释说明
- 移除了重复的用户信息编辑和状态变更操作日志条目
- 添加了关于与im-service重复的说明注释
2026-05-27 17:30:03 +08:00
XuqmGroup
5b2a89e964 feat(logs): 添加操作日志功能支持推送和授权模块
- 在JwtAuthFilter中设置认证详情到claims
- 为license-service添加LicenseOperationLog相关实体、仓库和服务
- 为push-service添加PushOperationLog相关实体、仓库和服务
- 在LicenseAdminController中注入并使用操作日志记录授权变更
- 在PushManagementController中注入并使用操作日志记录推送操作
- 更新OperationLogService以支持从JWT claims获取用户信息
- 扩展OperationLogService支持推送和授权操作日志查询
- 在前端OperationLogView中添加推送和授权日志选项卡
- 添加LicenseOperationLog和PushOperationLog接口定义
- 实现推送和授权日志的数据加载和分页功能
- 添加操作类型和资源类型的标签映射支持
2026-05-27 13:36:16 +08:00
XuqmGroup
908916fefd feat(logs): 添加即时通讯操作日志并优化界面显示
- 在 operation log 视图中新增即时通讯标签页
- 为 IM 服务添加操作摘要、资源类型等字段支持
- 统一三个标签页的操作类型和资源类型的中文映射
- 重构操作摘要生成功能,区分租户平台、即时通讯和版本管理
- 优化表格列宽度和布局显示
- 添加 IM 日志的数据加载和分页功能
- 新增 IM 应用选择和页面切换事件处理
- 在 API 定义中添加 summary 字段支持
2026-05-27 12:52:29 +08:00
XuqmGroup
4b13f64966 feat(log): 优化操作日志记录和展示功能
- 在OperationLogEntity实体中新增summary和ipAddress字段存储摘要和IP信息
- 修改operationLogService.record方法支持传入操作摘要信息
- 实现客户端IP地址解析功能,支持X-Forwarded-For和X-Real-IP头
- 更新系统更新服务中的数据库表结构迁移逻辑,增加NOT NULL列处理
- 优化前端操作日志页面展示,添加标签分类和详情弹窗功能
- 在系统更新流式响应中增加网络连接异常处理机制
- 添加Nginx代理配置中的缓冲区设置以支持实时日志流式传输
2026-05-27 12:27:43 +08:00
XuqmGroup
38e138f955 fix(core): 统一全局异常处理器并添加数据库管理功能
- 在所有服务的GlobalExceptionHandler中添加HttpServletRequest参数以记录请求上下文
- 统一异常响应格式为ResponseEntity<ApiResponse<Void>>并改进错误日志记录
- 添加对多种异常类型的处理包括参数验证、请求方法不支持、权限拒绝等
- 为业务异常添加不同级别的日志记录(warn/error)和状态码映射
- 在前端系统API中新增数据库表管理相关接口定义和实现
- 添加数据库表列表、列信息和数据查询的API调用函数
2026-05-27 11:51:19 +08:00
XuqmGroup
ba48d9f535 feat(components): 添加新的Element Plus组件支持
- 集成ElCheckbox组件支持
- 集成ElSkeleton组件支持
- 集成ElTabs和ElTabPane标签页组件支持
2026-05-23 00:32:18 +08:00
XuqmGroup
ad734ff204 feat(system-logs): 两端平台新增服务日志查看页面
- tenant-platform: /system-logs 页面,私有化模式下侧边栏显示;支持服务切换、
  行数选择、刷新间隔配置(5s/10s/30s/1min)、自动滚动
- ops-platform: /system-logs 页面,始终可见;复用相同交互,通过 ROLE_OPS 接口获取日志

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-22 23:22:58 +08:00
XuqmGroup
e999d4d443 feat(system): 添加系统版本查询和数据库迁移功能
- 移除 license-service 中 DeviceEntity 的 device_id 唯一约束注解
- 添加 /api/system/version 接口用于查询当前部署版本
- 实现数据库 schema 版本化迁移机制
- 添加自动执行数据库迁移的功能
- 在前端安全中心界面显示当前版本和迁移状态
- 优化配置文件修复逻辑和代码结构
2026-05-22 23:04:36 +08:00
XuqmGroup
ee20767d57 fix(security-center): add missing isMobile ref and fix Jenkins build failure handling
- Add isMobile reactive ref with resize listener in SecurityCenterView
  to fix TypeScript build error TS2339
- Fix Jenkinsfile: use '|| exit /b %ERRORLEVEL%' after docker build/push
  and ssh deploy commands so Windows bat steps actually fail the pipeline
  when a command returns non-zero exit code

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-05-22 19:33:38 +08:00
XuqmGroup
a8db0519ae feat(security-center): add license file parser
- SecurityCenterView: add license file upload/parse card with ElUpload and ElDescriptions
- appApi: add parseLicenseFile() calling POST /api/apps/license/parse

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-05-22 18:38:17 +08:00
XuqmGroup
655c5bc598 web: decouple license file download from license service status
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-05-22 17:57:01 +08:00
XuqmGroup
e965c012e6 feat(security-center): add reset container operation alongside update
- system.ts: extract streamOperation helper; add streamSystemReset export
- SecurityCenterView: replace single update button with update/reset descriptions table; shared dialog driven by operationType ref

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-22 15:33:35 +08:00
XuqmGroup
d0b7a51c2c fix(version): 修复版本管理中文件删除按钮文本显示问题
- 删除按钮文本从"删除重新上传"改为"删除"
- 保持原有的删除功能不变
- 优化界面文本简洁性
2026-05-21 18:39:34 +08:00
XuqmGroup
7465ee9b65 fix(version): 修复应用包上传文件为空时的处理逻辑
- 添加文件存在性检查避免空值传递
- 调整代码顺序确保正确的执行流程
- 防止因空文件导致的应用包检测异常
- 优化上传表单的数据初始化逻辑
2026-05-21 18:31:21 +08:00
XuqmGroup
293df1f821 fix(update): 修复版本列表排序并改进Android包上传功能
- 将版本查询排序从versionCode改为createdAt以正确显示最新版本
- 为Android包上传表单添加已上传文件显示区域
- 实现删除已上传文件的功能以便重新上传
- 添加上传组件引用以支持文件清除操作
- 增加Document和Delete图标导入用于文件管理界面
- 添加已上传文件信息的样式和布局支持
2026-05-21 18:20:06 +08:00
XuqmGroup
cfe8d19da9 fix: 修正服务端 UTC LocalDateTime 在浏览器中的解析偏差
Jackson 配置 time-zone: UTC,LocalDateTime 序列化为不含时区后缀的
ISO 字符串(如 "2026-05-21T14:30:00")。浏览器将此类字符串视为本地
时间,导致非中国时区或非 UTC+8 环境出现 8 小时偏差。
修复:formatTime 对无时区后缀的 ISO 字符串补充 'Z',确保按 UTC 解析
后再转换为北京时间。

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-21 16:49:55 +08:00
XuqmGroup
f3c58866df feat(license): 支持在租户平台修改 License 过期时间
描述详情框中的过期时间行增加内联日期选择器,与最大设备数保持
相同的行内编辑交互,支持设置具体日期或留空(永久有效)。

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-21 16:24:39 +08:00
XuqmGroup
c4373c8cc1 feat: 全平台时间显示统一为北京时间 (Asia/Shanghai)
新增 formatTime 工具函数,强制使用 Asia/Shanghai 时区,
替换两个平台所有视图中裸 toLocaleString('zh-CN') 调用。

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-21 16:09:55 +08:00
XuqmGroup
2b7857a820 fix(app-detail): License 文件下载行简化为纯下载按钮
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-21 15:31:53 +08:00
XuqmGroup
3c98850a36 feat(app-detail): 下载 license 文件移至应用信息卡片,附 SDK 接入引导
- 授权管理页不再显示下载入口
- 应用信息卡片新增 "SDK 接入文件" 行(LICENSE 开通后可见),
  包含下载按钮和 autoInitialize 使用说明

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-21 15:25:17 +08:00
XuqmGroup
ef0876fc5d feat(security): 一键更新 UI + 私有/公有化条件渲染
- 安全中心按部署模式条件显示:PRIVATE 显示更新卡片,PUBLIC 显示迁移卡片
- 新增 api/system.ts:getDeploymentStatus + streamSystemUpdate(流式日志)
- 更新进度用暗色终端风格日志框展示,自动滚动到底部
- RESTART_SELF 事件后轮询服务恢复,最长等待 90s

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-21 14:47:10 +08:00
XuqmGroup
66129cb89d feat(license): 租户平台新增最大设备数编辑,ops 彻底移除 license 管理入口
ops-platform:
- AppDetailView: 移除整个 License 授权管理卡片(含设备数查看和 maxDevices 编辑)
- ops.ts: 移除 LicenseStatusInfo 类型、getAppLicense / updateMaxDevices API

tenant-platform:
- license.ts: 新增 updateAppLicense() 调用 PATCH /api/license/admin/apps/{appKey}
- LicenseManagementView: 「最大设备数」旁新增「修改」按钮,
  弹出行内 InputNumber 编辑,保存后刷新显示

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-21 12:47:03 +08:00
XuqmGroup
290a6999fe feat(deploy): 完成私有化部署全流程验收
- 更新部署进度文档,标记P5-02/P5-03为已完成状态
- 修复中文乱码问题,MySQL数据层使用UNHEX函数配合nginx字符集设置
- 配置im-service和update-service的内部服务URL,从127.0.0.1改为Docker服务名
- 实现全功能验收,nginx为所有服务添加路由映射并返回正确的状态码
- 创建私有化部署默认信息文档,记录完整的部署配置和访问地址
- 添加部署清理脚本clean.sh,支持一键清理容器、配置和数据目录
- 更新敏感配置模板,添加详细的密码和密钥配置说明
- 优化前端实时消息轮询机制,通过WebSocket心跳检测决定是否启用HTTP轮询回退
2026-05-19 19:23:28 +08:00
XuqmGroup
3900d25d51 feat(tenant-platform): migration key UI + app market publish options
- Add migrate API client (request-code / generate-key)
- SecurityCenterView: 私有化部署迁移 card with email verify → one-time key dialog
- VersionManagementView: remove preflight check dialog; open submit directly
- VersionManagementView: replace 手动上架/审核后自动/定时 with 立即上架/计划上架 only

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-19 15:12:56 +08:00
XuqmGroup
b6f2aedc70 docs(private): 更新私有化SDK设计文档添加配置管理和错误码规范
- Flutter包名格式从xuqm_private_flutter_*改为xuqm_private_*
- 添加configVersion字段用于追踪配置变更,格式为YYYY.MM.DD-序号
- 添加配置版本管理说明,包含schemaVersion兼容性策略
- 添加配置热更新机制,支持冷加载和热加载两种方式
- 添加多环境配置支持,可通过activeProfile指定生效环境
- 添加统一错误码规范,覆盖配置缺失、格式错误、版本不兼容等场景
- 更新验收标准,包含热更新、多环境切换、错误码一致性要求
- 添加私有化开发计划中的错误码规范、文档同步、数据迁移等任务
- 补充MySQL运维细节、证书自动续期、监控告警、日志收集等部署要求
- 添加性能基准指标,包含HTTP API、WebSocket、文件传输等性能要求
- 修复应用商店审核状态轮询中的逻辑错误,添加小米商店特殊处理
- 更新前端界面显示审核版本信息,优化状态刷新逻辑
2026-05-18 19:17:44 +08:00
XuqmGroup
a1e4d5741b docs(private): 完善私有化部署开发计划和设计规范
- 增加实时进度和交接规则,定义任务状态枚举和更新格式
- 创建任务进度台账,涵盖P0-P5阶段全部开发任务
- 补充部署仓库交付边界确认和进度审计规范
- 完善MySQL/Redis双模式支持,增加external/managed选项
- 增加离线部署、安全治理、可观测性等完整交付能力
- 更新仓库结构设计,增加secrets.env、observability、data目录
- 补充健康检查、诊断脚本、升级回滚、备份恢复详细要求
- 优化应用商店审核状态查询逻辑,增加手动刷新接口
- 修复小米和VIVO商店状态查询中的版本匹配逻辑错误
- 增加缓存键版本隔离,防止不同版本状态混淆
- 优化厂商API连通性检查和审核状态轮询机制
2026-05-18 19:00:38 +08:00
XuqmGroup
b77ccc663a feat(private-deploy): 支持 MySQL/Redis 外部连接和托管模式部署
- 添加 external 和 managed 两种数据库/缓存模式支持
- 实现 MySQL/Redis 托管安装脚本和配置向导
- 支持客户自备连接或部署脚本新建基础设施
- 更新部署文档说明不同模式的配置和验证要求
- 添加应用版本防重复上传和删除功能
- 实现应用商店预提交检查和发布计划功能
2026-05-18 18:37:10 +08:00
XuqmGroup
57f8b36fab docs(deploy): 移除 Jenkins 配置和 Android Demo 计划文档
- 删除 jenkins-setup.md 完整的 Jenkins 服务配置指南
- 更新 README.md 部署文档标题为公有化部署文档
- 添加私有化部署说明章节和相关设计文档链接
- 从 REST API 设计文档中移除 demo-service 相关描述
- 更新推送架构图中业务服务端描述为客户端服务器
- 删除 android-demo-plan.md Android Demo 开发计划文档
- 删除 multi-platform-im-roadmap.md 多平台 IM 路线图文档
- 删除 java-im-server-sdk-plan.md Java IM 服务端 SDK 计划文档
2026-05-18 17:57:05 +08:00
XuqmGroup
d08a6fd16a fix(update): remove confusing '直接上传' badge from store review card
The badge was not meaningful to users who just need to know if the
version is live on the store. Removed it — the '已上线' state label is
sufficient.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-18 17:53:16 +08:00
XuqmGroup
1310488835 feat(update): show 已上线 state and pre-existing badge for store review
- reviewLabel: APPROVED now displays '已上线' instead of '已通过'
- parseStoreReview: extract liveOnStore and preExisting fields from JSON
- Store review dialog card: show '直接上传' badge when preExisting=true,
  indicating the version was published directly to the store rather than
  via the platform submission flow

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-18 17:30:38 +08:00
XuqmGroup
416783047c feat(tenant-platform): editable changelog with audit trail in version table
Adds an edit button (pencil icon) on each row's changelog cell.
Clicking it opens a dialog pre-filled with the current text; saving
calls PATCH /app/{id}/changelog and refreshes the list and op-log.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-18 16:48:20 +08:00
XuqmGroup
7d100a9efc fix(auth): use auth.logout() instead of localStorage.removeItem in interceptors
When a 401/expired-token fires in client.ts or file.ts, the handlers were
clearing localStorage but not the Pinia auth.token ref. The route guard
reads Pinia, so router.push('/login') was immediately bounced back to
/dashboard, leaving the user in a ghost-authenticated state where all API
calls failed with 401.

Calling auth.logout() clears both Pinia state and localStorage atomically,
so the route guard correctly allows the redirect to /login.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-18 14:12:03 +08:00
XuqmGroup
eba5133fed fix: file upload 403 no longer clears token or triggers logout
403 from the file service (e.g. permissions/CORS error) was incorrectly
treated as an auth failure, removing the token and redirecting to login.
403 should only show an error message; only 401 indicates an auth failure.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-18 13:31:11 +08:00
XuqmGroup
4b8eea2622 fix: remove orphaned container before docker compose recreate in correct Jenkinsfile
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-17 12:44:14 +08:00
XuqmGroup
c54ba18f8a fix deploy: remove orphaned container before docker compose recreate
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-17 12:35:05 +08:00
XuqmGroup
36deeb218f remove manual review button; store review is now fully automated via polling
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-17 12:15:06 +08:00
XuqmGroup
42b1868f54 fix: submit dialog pre-deselects and disables already-reviewing stores
- parseStoreReview state shown per store with review tag
- UNDER_REVIEW/APPROVED stores are disabled + labeled "审核进行中,将跳过"
- openSubmitStoreDialog filters them out of default selectedStores

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-16 15:58:56 +08:00
XuqmGroup
61dd09763a feat: add app transfer, parallel upload toggle, webhook type config, fix Chinese encoding in JWT
- ops-platform: add 一键转移 button and dialog to AppListView; add transferApp API call
- tenant-platform/update: parallel upload toggle in 凭据配置 tab; REVIEW_WEBHOOK notifyType select (钉钉/企微/飞书/自定义); select field support in store config dialog with visibleWhen
- tenant-platform/jwt: fix Chinese garble in right-corner nickname by decoding JWT payload as UTF-8 via TextDecoder instead of raw atob()

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-16 15:34:42 +08:00