从一个小程序到一座工具箱:uni-app 分包与 Flask 微服务实践
当一个小程序从单一的金价查询逐渐加入计分板、倒数日、汇率、番茄钟和健康打卡时真正困难的不是再写一个页面而是让第十七个工具仍像第一个一样容易接入、独立运行和安全发布。项目预览一、问题不是“页面变多了”「零碎百宝箱」最初是一个金价排行榜后来逐步容纳了 17 个工具。它们的运行形态并不一致瞬间听力、聚会决定器、单位换算等工具可以纯前端运行台球、倒数日等工具要求离线可用同时希望换机后恢复历史金价、油价和汇率依赖定时更新的服务端数据麻将计分以联机房间为主服务端才是事实来源喝水提醒还需要处理微信一次性订阅消息和后台调度。如果所有功能都堆在一个目录、共享任意状态并请求任意接口新功能越多主包体积、命名冲突和回归范围都会同步增长。这个项目的解法是先规定边界再允许工具在边界内自由选择实现。二、总体结构一个壳多种工具形态微信小程序主包首页工具注册表core 基础设施design 设计系统行情类分包计分类分包纯前端分包记录类分包Nginx 路径网关统一认证服务专属 Flask 服务通用 records 服务实例MySQL客户端主包只保留首页和公共能力。每个工具位于packages/tool-slug/并在pages.json中注册为分包。首页不硬编码卡片而由config/tools.js的注册表驱动名称、分类、图标、主题、入口和启用状态都在一处声明。这种结构带来两个直接收益用户只在进入某个工具时下载对应分包主包不会随着工具数量线性膨胀。新工具的接入点是显式的建分包、注册页面、登记工具不会偷偷依赖另一个工具的内部代码。项目进一步规定分包之间禁止互相import只能依赖主包的core/和design/。这条规则看似严格却能防止“倒数日复用了健康打卡的一段代码后来两个分包必须同时发布”的隐形耦合。三、用工厂函数统一网络边界每个服务在网关下拥有独立前缀。分包只需要声明自己的服务名import{createRequest}from../../core/request;constrequestcreateRequest(gold-price);constresawaitrequest({url:brands,method:GET});公共请求层完成三件事将相对路径拼为/service/api/v1/path从本地读取 JWT 并注入Authorization: Bearer ...收到 401 后静默登录并将原请求重放一次。微信登录本身也做了“单飞”控制。多个并发请求同时发现 token 过期时共享同一个loginPromise而不是同时调用多次wx.loginletloginPromisenull;exportfunctionwxLogin(){if(loginPromise)returnloginPromise;loginPromisedoLogin().finally((){loginPromisenull;});returnloginPromise;}服务端由认证服务用微信临时 code 换取 openid再签发只包含openid和过期时间的 HS256 JWT。所有业务服务共享签名密钥因此可以本地验签不必让每个请求再次穿过认证服务。这是一种适合小型微服务系统的取舍认证入口集中鉴权执行分散。它减少了一次内部网络调用但也意味着密钥轮换必须让所有服务同步更新。四、本地优先不是“有缓存就行”计分、倒数日和健康记录发生在球桌、牌桌或日常打卡中。网络短暂不可用不应该阻塞一次记分所以项目把本地存储定义为主存储云端负责异步备份。所有分包通过命名空间存储避免 key 冲突conststoragecreateStorage(billiards);storage.set(settings,settings);// 实际写入 keybilliards:settings更通用的记录同步由createRecordSync(service)提供。一次同步分为三个阶段records 服务待删队列本地记录records 服务待删队列本地记录1. 补交历史删除仅保留失败项2. 拉取云端记录按 clientKey 合并updatedAt 新者胜3. 分批推送未同步记录返回幂等保存结果这里最容易漏掉的是“删除”。如果用户离线删除一条记录只从本地数组移除下一次拉取时云端旧数据会再次出现。因此删除动作会先写入pendingDeletes云端确认删除后才移出队列。若用户用同一个clientKey重建记录则撤销对应删除意图。服务端按(openid, client_key)幂等 upsert。客户端主导身份服务端负责备份与跨设备恢复双方用updated_at做简单的最后写入者胜出。它并不试图解决协作文档级别的合并冲突但足以覆盖个人记录工具的真实场景。五、后端为什么同时存在专属服务和通用服务给每个工具复制一套 Flask CRUD 很快会产生大量相似代码反过来把所有业务塞进一个服务又会让金价爬虫、麻将房间和喝水提醒互相影响。项目采用两种后端形态专属服务金价、油价、汇率、台球、麻将等具有独特数据模型或调度逻辑的工具通用 records 服务球拍计分、棋牌计分、倒数日、健康记录和自由记分复用同一份代码但以不同容器、数据库名和服务名运行。通用服务复用实现不共享数据。专属服务保留业务表达力不被“万能记录表”限制。这比“一工具一套复制代码”或“所有工具共用一张表”都更平衡。Docker Compose 负责启动 MySQL 和各业务容器Nginx 按路径转发/auth/ - auth:5000 /gold-price/ - gold-price:5000 /mahjong/ - mahjong:5000 /health-log/ - health-log:5000数据库容器还针对小内存服务器关闭了 performance schema并缩小 InnoDB buffer pool。架构设计不仅要画出服务边界也要尊重实际机器的资源上限。六、设计系统只统一外壳工具箱容易走向两个极端要么每个页面完全不同像跳进了另一个应用要么为了统一而抹掉工具个性。项目把颜色、间距、圆角等基础变量集中在design/tokens.scss通用页面头、返回按钮、图标和工具卡使用tb-前缀组件。工具内部仍可以保留自己的交互语言例如金价品牌卡的行情感、听力测试的游戏感、横屏计分板的大字号操作感。统一的是导航、反馈和基础尺度不是所有页面必须长成同一张卡片。七、新工具如何选择落点接入前先判断数据归属而不是先复制最近的目录工具特征推荐形态参考实现无持久数据、无需联网纯前端分包瞬间听力、单位换算个人记录、离线必须可用createRecordSync records 服务倒数日、健康记录业务模型复杂、仍以本地为主专属 store 专属备份 API台球计分多人共享实时状态服务端主存 版本控制麻将计分周期采集公共行情专属服务 调度器 缓存展示金价、油价、汇率这个判断比技术选型本身更重要。离线个人记录和多人联机房间虽然都叫“同步”一致性目标完全不同不应被同一套抽象强行覆盖。八、这套架构的边界当前方案适合中小规模工具箱但仍有明确的演进点JWT 使用共享对称密钥服务数量继续增长时可考虑非对称签名和密钥轮换最后写入者胜出适合个人记录不适合多人同时编辑APScheduler 随应用进程运行便于部署多进程或多副本后应拆为独立 worker各服务独立容器提高隔离性也增加部署和可观测性成本需要统一日志与指标。好的架构不是一开始就上最复杂的组件而是让每种复杂度只出现在真正需要它的工具里。这个项目最值得复用的并非某个框架而是“主包提供稳定能力分包表达业务差异简单工具保持简单复杂工具拥有自己的边界”这一原则。

相关新闻

PixiJS Live2D插件终极指南:5个常见问题与解决方案

PixiJS Live2D插件终极指南:5个常见问题与解决方案

PixiJS Live2D插件终极指南:5个常见问题与解决方案 【免费下载链接】pixi-live2d-display A PixiJS plugin to display Live2D models of any kind. 项目地址: https://gitcode.com/gh_mirrors/pi/pixi-live2d-display PixiJS Live2D显示插件是一个强大的开源…

2026/7/29 20:15:36阅读更多 →
LiveKit服务器性能终极实战:从零构建高并发实时通信系统

LiveKit服务器性能终极实战:从零构建高并发实时通信系统

LiveKit服务器性能终极实战:从零构建高并发实时通信系统 【免费下载链接】livekit End-to-end realtime stack for connecting humans and AI 项目地址: https://gitcode.com/GitHub_Trending/li/livekit 你是否在为实时音视频应用的性能瓶颈而烦恼&#xff…

2026/7/29 20:15:36阅读更多 →
Ultralytics yolo下载

Ultralytics yolo下载

1. 官方Github仓库 主仓库:https://github.com/ultralytics/ultralytics 模型权重托管仓库:https://github.com/ultralytics/assets/releases 2. 全部.pt预训练权重直链(v8.3.0版本,YOLOv8YOLO11) # yolov8l 检测 h…

2026/7/29 20:15:36阅读更多 →
Python异步子域名探测实战:从CT日志到DNS枚举的进阶工具开发

Python异步子域名探测实战:从CT日志到DNS枚举的进阶工具开发

1. 项目概述:从脚本小子到专业工具的跨越上次我们聊了用Python实现子域名探测的基础方法,主要是基于字典的暴力枚举。那篇文章发布后,很多朋友留言说“学到了”、“思路清晰”,但也有人提出:“效率是不是有点低&#x…

2026/7/29 21:27:47阅读更多 →
seqlearn未来展望:序列学习工具包的路线图与社区贡献指南

seqlearn未来展望:序列学习工具包的路线图与社区贡献指南

seqlearn未来展望:序列学习工具包的路线图与社区贡献指南 【免费下载链接】seqlearn Sequence learning toolkit for Python 项目地址: https://gitcode.com/gh_mirrors/se/seqlearn seqlearn是一个专为Python设计的序列分类工具包,旨在扩展sciki…

2026/7/29 21:27:47阅读更多 →
Scratch小猫走迷宫:图形化编程入门实践与核心逻辑解析

Scratch小猫走迷宫:图形化编程入门实践与核心逻辑解析

1. 项目概述:从“玩物”到“立志”的编程启蒙最近几年,少儿编程的热度一直居高不下,很多家长都在琢磨怎么让孩子既能接触电脑,又能学点“真东西”,而不是单纯地玩游戏。我自己带过不少编程启蒙班,发现一个特…

2026/7/29 21:27:47阅读更多 →
基于SpringBoot+Vue的家用车辆美容养护管理系统设计与实现开题报告

基于SpringBoot+Vue的家用车辆美容养护管理系统设计与实现开题报告

、课题研究背景与意义 (一)研究背景 随着国民经济水平的持续提升与汽车工业的快速发展,家用汽车普及率逐年攀升,汽车已成为大众日常出行的核心交通工具。随着家用车辆保有量的不断增长,车主对车辆定期美容、保养、维修…

2026/7/29 21:27:47阅读更多 →
Source Han Serif CN:如何用开源方案解决中文字体商用困境?

Source Han Serif CN:如何用开源方案解决中文字体商用困境?

Source Han Serif CN:如何用开源方案解决中文字体商用困境? 【免费下载链接】source-han-serif-ttf Source Han Serif TTF 项目地址: https://gitcode.com/gh_mirrors/so/source-han-serif-ttf 在中文设计领域,商用字体授权费用动辄数…

2026/7/29 21:27:47阅读更多 →
Luckysheet 内网部署教程:后端生成 Excel,前端只读预览

Luckysheet 内网部署教程:后端生成 Excel,前端只读预览

Luckysheet 内网部署教程:后端生成 Excel,前端只读预览 一、场景说明 在企业后台管理系统中,常见需求是:后端根据业务数据生成 Excel 报表,前端直接从接口下载该文件并进行在线预览,用户只能查看、不能编…

2026/7/29 21:25:47阅读更多 →
覆盖国产 + 海外 + 开源模型,OpenClaw 2.7.9 Windows/Mac 双端部署详解

覆盖国产 + 海外 + 开源模型,OpenClaw 2.7.9 Windows/Mac 双端部署详解

🔹 工具基础介绍 OpenClaw 是开源生态中一款实用性较强的本地智能工具,凭借本地离线运行、可视化图形操作和任务自动化三大核心特性,赢得了众多用户的青睐。与普通在线对话AI工具不同,它属于能够直接操控本机软硬件的智能数字员工…

2026/7/29 9:47:45阅读更多 →
伺服阀焊完微漏毁整机?精密激光焊接三关锁住高压

伺服阀焊完微漏毁整机?精密激光焊接三关锁住高压

所谓液压伺服阀体的精密激光焊接,是用激光束对阀座壳体(通常为不锈钢或铝合金)进行密封焊接,使阀体在21-35MPa的高压液压油或压缩气体中长期运行而不发生介质泄漏。液压伺服阀是高端液压系统的"大脑"。从航空航天飞行控…

2026/7/29 7:00:19阅读更多 →
D2DX:三步实现《暗黑破坏神2》高清宽屏体验的终极指南

D2DX:三步实现《暗黑破坏神2》高清宽屏体验的终极指南

D2DX:三步实现《暗黑破坏神2》高清宽屏体验的终极指南 【免费下载链接】d2dx D2DX is a complete solution to make Diablo II run well on modern PCs, with high fps and better resolutions. 项目地址: https://gitcode.com/gh_mirrors/d2/d2dx 你是否还在…

2026/7/29 7:58:51阅读更多 →
28. Agent 执行到一半想暂停?用 interrupt 给它设个“关卡“!

28. Agent 执行到一半想暂停?用 interrupt 给它设个“关卡“!

28. Agent 执行到一半想暂停?用 interrupt 给它设个“关卡“! 在构建复杂的 Agent 系统时,我们经常会遇到这样的场景:Agent 正在执行一个多步骤的任务,比如“下单购买商品”,但执行到一半时,我们…

2026/7/29 0:01:46阅读更多 →
自律同行,突破无界!NANK南卡正式官宣曾舜晞成为品牌代言人

自律同行,突破无界!NANK南卡正式官宣曾舜晞成为品牌代言人

近日,国际专注开放式技术研发的声学品牌Nank南卡,正式官宣实力艺人曾舜晞担任品牌代言人。消息一经发出便轰动全网。为什么耳机品牌不选择流量明星、老牌歌手?而且是选择曾舜晞?让我们一起来探索一下!比起短期的流量&a…

2026/7/29 0:01:46阅读更多 →
【RT-DETR多模态创新改进】CVPR 2025 | 独家特征融合创新改进篇 | 引入RLAB残差线性注意力模块,有效融合并强调多尺度特征,多种改进点,适合红外与可见光融合目标检测任务,有效涨点

【RT-DETR多模态创新改进】CVPR 2025 | 独家特征融合创新改进篇 | 引入RLAB残差线性注意力模块,有效融合并强调多尺度特征,多种改进点,适合红外与可见光融合目标检测任务,有效涨点

一、本文介绍 🔥本文在RT-DETR多模态融合目标检测中引入RLAB残差线性注意力模块,可在不同模态特征交互阶段进行多次残差细化,使可见光、红外等特征在尺度、语义和空间位置上更好对齐;随后将细化特征与解码器输出拼接并生成Q、K、V,通过线性注意力自适应强化关键通道、目…

2026/7/29 0:01:46阅读更多 →
YOLOv8推理性能优化:从1.2FPS到35FPS的全链路加速实践

YOLOv8推理性能优化:从1.2FPS到35FPS的全链路加速实践

如果你在部署 YOLOv8 时,发现推理速度只有可怜的 1-2 FPS,而别人的演示视频却能跑到 30 FPS 以上,那么问题很可能不在模型本身,而在于你的整个处理链路。很多开发者拿到一个训练好的 YOLOv8 模型后,会直接使用官方示例…

2026/7/28 20:22:24阅读更多 →
Coze与Dify对比指南:低代码AI应用开发从入门到实战

Coze与Dify对比指南:低代码AI应用开发从入门到实战

1. 从零到一:为什么你需要了解 Coze 和 Dify?如果你对 AI 应用开发感兴趣,但一看到“大模型”、“智能体”、“工作流”这些词就头疼,觉得门槛太高,那这篇文章就是为你准备的。很多开发者,包括我自己&#…

2026/7/29 4:31:51阅读更多 →
AI生图工具怎么选?2026年6月版实测对比

AI生图工具怎么选?2026年6月版实测对比

做自媒体的朋友应该都有体会:配图一直是个让人头疼的问题。2026年,AI生图工具已经非常成熟了,但工具太多反而不知道怎么选。以下是截至2026年6月我对主流AI生图工具的实测对比。Midjourney V8.1:速度之王2026年6月11日&#xff0c…

2026/7/29 14:26:42阅读更多 →