Repository navigation
这一版的主要内容
1.0 之后第一个功能版本。主角是数据变更审计:谁、什么时候、从哪来,把哪个对象的哪个字段从什么改成了什么。兼容承诺没有破坏(镜像改名期间新旧两个名字都推)。
数据变更审计(#260 · #281)
- 字段级前后对比,在会话层统一拦截,不靠各写路径自己记(#262)
- 接入的对象:用户(含二次验证、第三方账号)· 部门 · 角色 · 菜单 · 参数配置 · 开放应用 / Webhook 端点 · 群机器人 / 通知策略 · 短信配置 · 存储 · 模型密钥 / MCP 凭据 · 数据范围 / 规则 · 定时任务 · 字典 · 流程定义(#262 · #267 · #284 · #286 · #291)
- 密钥、令牌、Webhook 地址这类只记「改过」,不记值
- 各页行操作里的「变更记录」抽屉 · 「日志管理 → 数据变更」页(按对象 / 操作人 / 来源 / 字段 / 时间筛)· 单字段历史 · 导出 · 和操作日志按请求互跳(#262 · #271 · #280)
- 防篡改链:每行带序号和签名,超管可「校验完整性」,配
DATA_CHANGE_CHAIN_KEY后防得住能改库的人(#271 · #278) - AI 助手能查变更记录(「谁改了张伟的部门」)(#272)
安全
- 操作日志漏打码的凭据(#283):参数配置里像密钥的那几行(如
EMAIL_PASSWORD)、批量保存的请求体、登录 / 刷新响应里的access_token、模型密钥的api_key等原来会原样进操作日志。现在一律打码,并加了守卫扫全部接口的字段名;迁移会清掉已经写进去的旧记录 - 短信配置的凭据不能再从
options绕进库,已经存进去的由迁移删掉(#284) - 登录日志记下「账号被锁」「IP 被锁」「被强制下线」(#273 · #275)
- 按上游 FBA 补的四处:连接串密码、操作日志关停丢批、IPv6 属地、热重载锁(#277)
- 依赖安全告警清零:桌面端 Electron 升到 42.11.18(装进安装包的运行时)· Pillow 13 / tornado 6.6 等 · 前端单测换 vitest 4 · Expo SDK 57 补丁版(#294)
其他
- 登录 / 操作日志默认保留期 30 天 → 180 天(《网络安全法》六个月下限)(#261 · #282)
- 写接口的事务在响应发出之前提交(#268)
- 日期选择:跳年月、草稿、区间重选、时间滚动列、手输、按月按年(#269 · #274)
- 从抽屉 / 菜单里的链接跳去别的页签,浮层不再残留(#280)
- AI 对话落库、Redis 重启后限流 500、macOS 开发环境 beat 崩溃等修复(#263 · #279)
fba init在最后提交时报「雪花算法未初始化」、整条回滚 —— 快速开始第一步就失败;pnpm db:reset的向导里填了别的 Redis 时同样失败。CI 现在对新库补跑一遍fba init(#292 · #296)- 移动端审批:办理失败(别人先办了)时面板和原因不再一起消失 · 服务端没装审批插件时首页不再一直报错 · 发起页的流程预告改成对发起人说话(#258)
- 文档站:19 个功能页(每页配截图)· 开发者工具页 · 侧边栏按领域分组(#285)
升级说明
- 数据库迁移:照常
pnpm db:upgrade,或者让 compose 里的migrate服务自动跑。其中两条会改写旧数据:清理操作日志里漏打码的凭据(aq000000operalogsecret,逐行提交、可重复跑)、删掉短信配置options里混进去的凭据(ar000000smsoptcreds) - 🔴 建议升级后更换 SMTP 授权码和模型的 API Key:迁移清得掉表里的记录,清不掉已经导出、备份或被人看过的。访问令牌会自己过期,不用管
- 日志保留期默认改成 180 天,日志表会比原来大(本机实测操作日志平均每条约 2 KB)。管理员自己调过天数的不受影响
- 想让防篡改链防得住能改库的人,在
.env配DATA_CHANGE_CHAIN_KEY(不配也能用,只防手滑改库) - 镜像名改成
fra-api/fra-web,1.1.x 期间旧名字fba-api/fba-web照常推送 - 🔴 后端不再支持 Python 3.10,最低 3.11(官方镜像和 CI 一直是 3.13,不受影响;自己在 3.10 上跑的要先升 Python)。从上游带过来的
apps/api/Dockerfile基础镜像也换成了 3.13
桌面客户端
fastapi-react-admin 的桌面客户端 —— 把 web 后台装进 Electron 外壳,
提供浏览器给不了的四件事:静默打印、本地硬件、凭据托管、自动更新。
后台本身(页面、权限、多页签)和浏览器版是同一份代码。
下哪个
| 平台 | 文件 | 说明 |
|---|---|---|
| Windows 10/11 x64 | admin-desktop-<版本>-setup.exe |
NSIS 安装向导,装到当前用户(%LOCALAPPDATA%\Programs),不需要管理员 |
| macOS Apple Silicon | ...-arm64.dmg |
M1 及以后 |
| macOS Intel | ...-x64.dmg(文件名不带 arm64) |
|
| Linux x64 | ...-x86_64.AppImage |
chmod +x 后直接运行,不用装 |
.blockmap 与 latest*.yml 是自动更新用的,人不需要下载。
装完第一件事:填后端地址
首次启动会让你填服务器地址(如 https://admin.example.com)。它是运行期配置,
存在用户目录里 —— 所以同一个安装包可以连不同环境,不用为每个环境各打一版。
已知限制(都是刻意的取舍,不是漏做)
- 🔴 所有平台的包都没有代码签名。
- Windows:SmartScreen 会拦一次 →「更多信息」→「仍要运行」
- macOS:Gatekeeper 会说**「已损坏,应移到废纸篓」**。这不是包坏了,是没有公证:
右键 →「打开」,或者xattr -dr com.apple.quarantine /Applications/Admin\ Desktop.app - Linux:AppImage 不需要签名
- 想去掉这些提示:Windows 侧有面向开源项目的免费证书方案(SignPath Foundation),
macOS 侧没有免费路,需要 Apple Developer Program($99/年)
- 🔴 macOS 上的自动更新不工作(未签名)。electron-updater 要校验运行中应用的代码签名,
拿不到就拒绝安装更新。Windows 与 Linux(AppImage) 的自动更新正常 - 读卡器等本地硬件是桩模式:厂商的原生助手不在仓库里(那是现场的东西),
所以这个包里没有。界面上相关功能会走模拟数据 - 打印:Windows 上是真的静默打印;macOS/Linux 上打印链路能跑,但没有在真机标签机上验过
更新从哪来
默认读这个仓库的 Release。内网部署(客户出不去公网)可以在客户机的 config.json 里
填 updateUrl,指向自己的静态目录 —— 不用为内网单独打一版。
What's Changed
- fix(mobile): 审批评审的四条 —— 409 后面板不消失 · 没装插件不报错 · 发起页预告对发起人说话 · 规则两端共用一份(#257) by @ita201125 in #258
- docs: README 照 vben / Ant Design Pro 的写法 —— 顶部加语言切换行 by @yilecoding in #259
- fix: AI 对话落库 · Redis 重启后限流 500 · Windows 开发流程 · 删除弹窗 · 审批系统意见多语言 by @ita201125 in #263
- feat: 数据变更审计 —— 谁、什么时候、从哪来,把哪个字段从什么改成了什么(#260) by @yilecoding in #262
- fix(ui): 日历能跳年月、能选明年、跟界面语言 —— «‹ 年 月 ›» 表头 + 年/月面板(#264 #265) by @ita201125 in #269
- chore(gitignore): .claude/ 只放行技能 / 子代理 / 命令,本机配置不进仓库 by @ita201125 in #270
- feat(audit): 数据变更审计二期 —— 用户的二次验证 · 第三方账号(#260) by @yilecoding in #267
- fix(db): 写接口的事务在响应发出之前提交 by @yilecoding in #268
- feat(audit): 数据变更审计二期 —— 单字段历史 · 导出 · 防篡改链(#260) by @yilecoding in #271
- chore(deploy): 镜像改名 fba-api / fba-web → fra-api / fra-web,1.1.x 期间两个名字都推 by @yilecoding in #276
- feat(ai): AI 助手查数据变更记录 —— 「谁改了张伟的部门」(#260) by @yilecoding in #272
- fix(audit): 防篡改链按评审修(#271 合并时这个提交还没进去) by @yilecoding in #278
- feat(auth): 登录日志记下「账号被锁」「IP 被锁」「被强制下线」(#273) by @yilecoding in #275
- fix(api): 按上游 FBA 54 个提交审下来要补的 4 处 —— 连接串密码 · 操作日志关停丢批 · IPv6 属地 · 热重载锁 by @yilecoding in #277
- feat(ui): 日期选择补齐草稿 / 区间重选 / 时间滚动列 / 手输 / 按月按年(#266 的 P2+P3) by @ita201125 in #274
- fix: 修复 macOS 开发环境 Beat 启动崩溃 by @yilecoding in #279
- fix(platform): 从抽屉 / 菜单里的链接跳去别的页签,浮层跟着走掉 by @yilecoding in #280
- fix(task): 登录 / 操作日志默认保留 30 天 → 180 天(网络安全法的六个月下限) by @yilecoding in #282
- fix(api): 操作日志漏打码的凭据 —— 参数配置的 value · 列表请求体 · access_token / api_key 等 · 迁移清理旧记录 by @yilecoding in #283
- feat(audit): 数据变更审计接入带密钥的对象 —— 开放应用 · Webhook · 群机器人 · 短信 · 存储 · 模型密钥 · MCP 凭据(#281 第一批) by @yilecoding in #284
- docs(site): 功能页第一批 —— 登录与安全样板页 · 侧边栏按领域分组 · 总览对齐 README · 源码链接进闸门(#285) by @yilecoding in #287
- docs(site): 功能页第二批 —— 导入导出 · 用户角色部门菜单 · 日志与审计三个新页 + 五个旧页补界面入口与开关(#285) by @yilecoding in #288
- docs(site): 功能页第三批 —— 工作台 · 定时任务 · 监控 · 插件 · 参数配置与字典五个新页 + 剩余旧页补全(#285) by @yilecoding in #289
- docs(site): 开发者工具页 + 更正「接口对不上类型检查就报错」的对外说法(#285) by @yilecoding in #290
- docs(site): 功能页首图 —— 19 个功能页都配上截图(#285 最后一项) by @yilecoding in #293
- feat(audit): 数据变更审计接入数据权限 · 通知策略(#281 第二批) by @yilecoding in #286
- feat(audit): 数据变更审计接入定时任务 · 字典 · 流程定义(#281 第三批) by @yilecoding in #291
- chore(deps): 依赖安全告警一次清掉 —— Python 下限 3.11 · electron · vitest 4 · Expo 补丁版(#294) by @yilecoding in #295
- fix(cli): fba init 提交时报「雪花算法未初始化」整条回滚 —— 快速开始第一步失败 · CI 补跑 fba init by @yilecoding in #292
- fix(cli): #292 评审 —— 雪花节点包在事务外 · --auto 用新填的 Redis · 自增模式不占 · 释放失败不冒 by @yilecoding in #296
Full Changelog: v1.0.1...v1.1.0