把数据库和第三方接口一键包成带鉴权的 API(图形话操作),数据同步,异常检测通知
一个 Windows 客户端的实现与踩坑
目标读者:需要把内部数据库 / 第三方接口开放给其他系统调用的后端、集成、实施同学。
读完你能判断这套东西是否适合你的场景,也能照着把第一个接口跑通。
一、先说场景:我们被什么卡住了
这两年做集成项目,反复遇到同一类需求:
- 学校/单位的业务库(MySQL、SQL Server、国产信创库…)要开放数据给第三方系统,但不允许外部直连数据库;
- 上游第三方接口要先登录取 Token,再拿 Token 去取数,中间还要翻页抓全;
- 有些接口"只差一个 IP",要在 5 个上游之间轮询或故障转移;
- 数据还要定时同步进另一个库,供报表系统用。
标准做法是:写后端接口 → 配鉴权 → 加监控,每个项目重来一遍。工期紧的时候,一个人一周只能交付很少的接口。
所以我做了一个Windows 桌面客户端:连上数据库 / 配好上游接口,在界面上点几下就把它们包装成带 AppID + Token 鉴权的下游 API,而且网关就跑在本机,数据不出内网。
二、方案选型:为什么不用现成的
| 方案 | 不选的原因 |
|---|---|
| Kong / APISIX 等网关 | 面向的是"已有微服务",不是"从数据库表直接生成接口";部署运维成本高,实施同学在客户现场装不动 |
| n8n / Node-RED 之类的编排 | 编排能力不错,但没有"统一鉴权 + 凭证发放 + 调用统计"这条产品线,也不适合交付给非技术用户 |
| 自己写 Spring Boot 接口 | 最灵活,但每个项目都要重写一遍鉴权、分页、字段映射、日志,重复劳动 |
| 低代码平台 | 数据要上云,客户(尤其学校、政务)不接受 |
于是走了"本地客户端 + 本机网关"这条路:客户端负责配置,网关负责对外提供 API。
三、整体架构
┌──────────────────────── 本机(Windows) ────────────────────────┐ 浏览器 / 第三方 ──▶ │ Fastify 网关 (127.0.0.1:8787) │ Postman / 业务系统 │ ├─ POST /auth/token 用 AppID/AppSecret 换 JWT │ │ ├─ GET /gw/:id 按接口 ID 调用 │ │ ├─ GET /你配的下游路径 例如 /api/undergraduate │ │ └─ 统一响应 {code,message,data} + 调用日志 │ │ │ │ Electron 客户端(界面层) │ │ ├─ 数据源 / 接口调试 / 接口包装 / 接口编排 / 数据同步 │ │ ├─ 终端控制(SSH/SCP/RDP/VNC)/ 图情业务(MARC/SIP2) │ │ └─ 数据看盘 / 应用凭证 │ │ │ │ 本地 SQLite(接口定义、凭证、日志、连接),敏感字段用系统密钥加密 │ └────────────────────────────────────────────────────────────────┘ │ ┌───────────────┴────────────────┐ ▼ ▼ 数据库(MySQL/PG/SQL Server/国产库) 第三方 HTTP 接口技术栈:Electron 35 + Vue 3 + Element Plus + ECharts;网关是主进程内嵌的 Fastify;本地库是 SQLite(node:sqlite)。
四、功能详解(每个模块都配了操作录屏)
4.1 数据库操作:像 Navicat 一样看数据、改数据![]()
图 1:连上数据源 → 选表 → 分页浏览 → 进入编辑模式改数据。左侧还能切换数据库账号有权限看到的其它库。
- 测试连接、连接信息(主机/用户/库)一目了然;
- 左侧选表、右侧分页看数据(默认 100 条/页,可选 50/100/200/500/1000),表头排序、多条件筛选;
- 双击单元格就能改,支持加行、删行,改完点保存;保存前能看实际执行的 SQL;
- 没有主键的表也能改:界面让你选一个"能唯一标识每行"的字段(如读者账号)当定位字段,系统用它做
WHERE;一个都不选时按整行字段匹配,并在影响多行时明确提示; - 数据库账号能看到哪些库,就能切换着看(权限完全由数据库账号决定)。
支持的数据库:
| 类别 | 数据库 | 默认端口 | 接入方式 |
|---|---|---|---|
| 常用 | MySQL / PostgreSQL / SQLite / SQL Server | 3306 / 5432 / 文件 / 1433 | 原生驱动 |
| 国产信创 | 达梦 DM8、DM9 | 5236 | 达梦官方 Node 驱动 dmdb |
| 国产信创 | 人大金仓 KingbaseES | 54321 | PostgreSQL 协议 |
| 国产信创 | 瀚高 HighGo | 5866 | PostgreSQL 协议 |
| 国产信创 | OceanBase | 2881 | MySQL 协议 |
| 国产信创 | 南大通用 GBase 8a | 5258 | MySQL 协议 |
| 商业 | Oracle | 1521 | 官方纯 JS 驱动(不需要装 Oracle 客户端) |
说明:国产库多数兼容 PostgreSQL / MySQL 协议,所以查询、分页、建表这些逻辑完全复用现有驱动;Oracle 和达梦用各自官方驱动。这几家我还在收集真机环境实测反馈,有环境的同学欢迎留言。
4.2 接口调试:类 Postman,调通了才好包装
图 2:保存的接口按目录树管理;填地址点「发送」,右侧直接看格式化后的响应体和实际请求头。
- 支持 OpenAPI 3.x 文档导入,自动生成接口目录;
- 认证方式覆盖:API Key(header/query)、Basic、Bearer、OAuth2 客户端凭证、自定义签名(id + secret + timestamp + nonce → HMAC-SHA256);
- 上游要先登录取 Token 的场景:配好"取 Token 接口",之后 401 自动重取,有效期内容复用;
- 分页抓全:填好页码/每页条数参数名,一键把 10 万条数据翻完并导出(Excel / JSON);
- 调通的接口可保存成目录树(两级目录、可拖拽归类),后面直接用于接口包装、编排、同步。
4.3 接口包装(二次包装):从数据表一键生成下游接口
图 3:选数据源 → 选表 → 勾要生成的操作(分页查询 / 按主键查询 / 新增 / 更新 / 删除 / 按条件查询)→ 生成。
生成出来的接口自带:
- 统一响应体
{ code, message, data }; - 字段映射:重命名、隐藏、类型转换都在界面上配;
- 分页;
- Token 鉴权(见下一节)。
4.4 鉴权:AppID / AppSecret → Token
在「应用凭证」里给每个调用方生成一套AppID+AppSecret(密钥只明文展示一次,库里只存哈希),调用方两步拿到数据:
# 第 1 步:换 token(有效期 2 小时,过期重新换)curl-XPOST http://127.0.0.1:8787/auth/token\-H"Content-Type: application/json"\-d'{"appId":"你的AppID","appSecret":"你的AppSecret"}'# → {"code":0,"data":{"accessToken":"eyJhbGci...","expiresIn":7200,"tokenType":"Bearer"}}# 第 2 步:带上 token 调业务接口curl"http://127.0.0.1:8787/gw/接口ID"\-H"Authorization: Bearer eyJhbGci..."Node.js 版:
// 1) 换 tokenconstres=awaitfetch('http://127.0.0.1:8787/auth/token',{method:'POST',headers:{'Content-Type':'application/json'},body:JSON.stringify({appId:'你的AppID',appSecret:'你的AppSecret'})})const{data}=awaitres.json()// data.accessToken / data.expiresIn = 7200 秒// 2) 带 token 调业务接口constr=awaitfetch('http://127.0.0.1:8787/gw/接口ID',{headers:{Authorization:'Bearer '+data.accessToken}})console.log(awaitr.json())// { code: 0, message: 'ok', data: ... }免 token 公开访问:有些场景(比如自己写个页面看看数据)不想走 token,可以把某个只读接口的「公开访问」开关打开,之后浏览器直接打开地址就能拿到数据:
http://127.0.0.1:8787/api/undergraduate写操作(POST/PUT/DELETE/PATCH)不允许开公开访问——避免地址泄露后被人随意改数据;打开时还会弹一次风险确认。
4.5 接口编排:图形化连线,解决"先取 Token 再取数"
图 4:画布上拖节点、连线表示执行顺序;上游节点可以「提取变量」(如把data.accessToken提取成token),下游节点用{{token}}引用。
- 从「接口调试」调通的接口里添加节点,节点之间连线表示先后;
- 组合策略支持:轮询、故障转移、合并、依赖链;
- 保存前可以「测试整条编排」,逐节点看耗时、变量和预览数据。
4.6 数据同步:库到库、接口到库,定时自动搬
图 5:每个任务能看到来源→目标、定时周期、最近一次执行结果;点「立即同步」可以手动跑一次。
- 来源可以是数据库表,也可以是接口(含编排好的组合接口);
- 目标库支持 MySQL / SQL Server / PostgreSQL 等;目标表不存在会自动建表(可选按主键增量更新、自动加"数据更新时间"列);
- 定时执行:按分钟 / 小时 / 天,程序重启后调度自动恢复;
- 接口来源支持翻页抓全:一直翻到某页返回条数小于每页条数为止,10 万条不用人工翻页;
- 每次同步都留日志(成功、失败、耗时、写入行数),失败也能排查。
4.7 终端控制:一个客户端连服务器
图 6:SSH 交互终端;切到别的页面再回来,会话还在、历史输出自动回放;右侧可切 SCP 图形化文件管理 / RDP / VNC。
- SSH / Telnet交互终端(xterm),断线可续、切页不丢会话;
- SCP 图形化文件管理:进目录、上传(支持拖拽)、下载、改名、删除、在线查看/编辑文本;
- RDP:调系统自带 mstsc;
- VNC:内嵌在自己的窗口里(noVNC + 本地 WebSocket 桥),不用另装 VNC 软件;
- 连接可建目录分类(两级)、目录可折叠,密码/私钥用系统密钥加密保存在本机。
4.8 图情业务:图书馆编目那点事
图 7:选中 Excel 后确认工作表与表头,再逐字段映射到 MARC(020/200/210/905/906…),生成前可预览。
这块是图书馆项目里踩出来的,通用低代码平台基本不碰:
- Excel 单册数据 → CNMARC(ISO2709):字段映射自定义,同一种书的多复本自动合并成一条书目 + 多个 906 馆藏字段;编码支持 UTF-8 / GBK;
- MARC 批量批处理:把某个字段的子字段复制/移动到另一个字段(例如给所有 906 补索书号),单次可处理 10 万条;
- ISO 文件按体积切分:第三方系统有导入大小限制时,按 50MB 等阈值切分;
- SIP2 自助借还调试:连 SIP2 服务逐条测试登录、借书、还书、改密码、查读者、查图书,并保留原始报文日志;
- 每次导出都本地留档,Excel 被删了也能重新导出。
4.9 数据看盘 + 其他
- 仪表盘:总调用量、成功率、平均/P95 耗时、近 7 天趋势、接口调用排行、错误分布、最近调用明细;
- 多主题(浅色/深色共 8 套)、侧边栏可折叠;
- 配置迁移:整客户端配置加密导出,换机器导入(导入导出要邮箱验证码);
- 开机自启、自动更新、升级后自动自检并发邮件、内置反馈(可截图/录屏/留言直达作者)。
五、几个实现上的坑(这部分可能对你最有用)
- 内嵌 VNC:Electron 里没有现成 VNC 客户端。做法是主进程连目标 5900,在本机
127.0.0.1起一个只服务单连接的 WebSocket 服务(相当于内置 websockify),渲染层用 noVNC 连本地 ws。踩坑点:noVNC 用了顶层 await,打包和开发环境的构建目标都要设成esnext,否则 esbuild 直接报Top-level await is not available。 - Fastify 的重复路由:
@fastify/cors自己注册了OPTIONS /*,这时候再写app.all('/*')会抛FST_ERR_DUPLICATED_ROUTE,整个网关起不来。改成按方法逐个注册;另外 GET 会自动附带 HEAD,别重复注册 HEAD。 - 新字段没存库:SQLite 表是按固定字段列表写的,加了新功能字段必须同时改「建表 + ALTER 升级 + 写入 + 读取」四处,否则界面开关点了不生效(我就在这栽过一次)。
- 敏感信息:数据库密码、AppSecret、上游 token 全部用 Electron 的
safeStorage加密落库;AppSecret 只存哈希,只在创建/重置那一次明文展示。 - MySQL 空闲断连:客户现场常遇到
wait_timeout断开,做法是每次操作独立连接 + 命中"可重试错误"时自动重连一次,用户侧无感。
六、适用与不适用
适合:内网数据对外提供只读/小批量写入接口;把上游接口取数再加工;图书馆编目与自助借还调试;实施人员在没有运维支持的环境里快速交付接口。
不适合:需要横向扩展的高并发网关(它是单机网关);多租户 SaaS 化对外服务;K8s 环境下的服务治理。
七、下载与试用
- 官网(含六大功能的动图演示):https://www.yuner.fun
- 直接下载 Windows 客户端:https://www.yuner.fun/download.html
系统要求:Windows 10 / 11 64 位,安装包约 90 MB。可以先用试用版跑通整个流程,正式版按台授权、终身有效。
八、写在最后
这个工具的出发点很朴素:把集成项目里重复了无数遍的那几件事,做成点几下就能交付的东西。
如果你也在做类似的事,欢迎在评论区说说你的场景——尤其是国产数据库(达梦、金仓、OceanBase、GBase)的环境,我这边还在收集实测反馈。有具体问题我会尽量回复。
标签建议:API网关数据库低代码ElectronFastify数据集成图书馆MARC国产数据库