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
XuqmGroup
6b891bee92
feat(tenant-platform): service activation realtime + store review retry
...
- Add IM real-time notification for service activation approval/rejection
(LicenseManagementView, PushManagementView, AppDetailView)
- Add retry button for FAILED and REJECTED stores in version review detail
- Refactor storeReviewRealtime to single shared IM connection
- Bump @xuqm/vue3-sdk to 0.2.3 (fixes sendSync crash when SDK uninitialized)
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-16 14:27:02 +08:00
XuqmGroup
ce05fa4fe3
fix: sync store review detail dialog items when loadAppVersions refreshes table data
2026-05-16 13:28:58 +08:00
XuqmGroup
e912a5e65e
docs: remove WebSocket doc, strip Update from server SDKs, add Harmony license
...
- Remove docs/server/websocket.md and sidebar entry
- Server API: remove Update 服务 section (only IM + Push)
- Go/Python/Java SDK docs: remove Update from intro and capability tables
- RN license: remove manual initialize(baseUrl) section
- Flutter license: remove manual initialize(baseUrl) section
- Flutter/Harmony: fix git URLs to xuqmGroup org
- Harmony: add LicenseSDK to modules table and create harmony/license.md
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-16 11:56:40 +08:00
Dev
88e5a70d87
feat: 授权管理页面+路由,IM状态30s轮询,移除接入文档,ops去除appKey/平台列,Jenkinsfile固定main分支
2026-05-16 11:31:21 +08:00
XuqmGroup
b153521a91
docs(flutter/license): use canonical xuqm_flutter_license import path
...
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-16 02:47:23 +08:00
XuqmGroup
06436394ed
docs: fix version numbers, add license SDK docs; fix service gating reactivity
...
- Android: correct version header 0.5.x→0.4.x, add sdk-license to module table, update artifact versions to 0.4.10
- iOS: correct min version iOS 14→16, bump version to 0.2.0, update SPM ref to from: "0.2.0"
- RN: fix version 0.3.x→0.2.x, standardize npm registry URL, add @xuqm/rn-license to module table
- Flutter: update git ref to v0.2.2, add xuqm_flutter_license to module tables
- Add new docs: ios/license, rn/push, rn/license, flutter/push, flutter/update, flutter/license
- tenant-platform: make appKey a computed ref in Push/VersionManagementView to fix service gating reactivity on route change
- tenant-platform: add requestActivation API endpoint
- tenant-platform: add IM service gating UI (checkServiceEnabled + activation dialog)
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-16 02:23:57 +08:00
XuqmGroup
65914b0ec2
feat: ops租户筛选 + 服务去平台化 + 补全Flutter/H5/小程序文档
...
- AppListView: 添加租户模糊搜索筛选,显示租户名称
- AppDetailView: 功能服务表去掉平台列,按服务类型展示
- ops.ts: listApps 支持 tenantId 参数,AppItem 添加 tenantName
- 新增 Flutter/H5/小程序 setup.md 和 im.md 文档
- config.ts: sidebar 添加 Flutter/H5/小程序子页面
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-05-16 00:26:53 +08:00
XuqmGroup
ceb22c6286
fix: Jenkins checkout 使用 BRANCH 参数而非 scm 默认分支
...
checkout scm 忽略 BRANCH 参数,使用 Jenkins 任务配置的 SCM 分支。
改为显式 checkout 并引用 params.BRANCH,确保构建最新代码。
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-05-15 23:56:46 +08:00
XuqmGroup
b8831de24a
chore: update yarn.lock
...
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-05-15 23:22:16 +08:00