从一个小程序到一座工具箱: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各服务独立容器提高隔离性也增加部署和可观测性成本需要统一日志与指标。好的架构不是一开始就上最复杂的组件而是让每种复杂度只出现在真正需要它的工具里。这个项目最值得复用的并非某个框架而是“主包提供稳定能力分包表达业务差异简单工具保持简单复杂工具拥有自己的边界”这一原则。

相关新闻

终极指南:5步掌握Java-Deobfuscator专业反混淆技术

终极指南:5步掌握Java-Deobfuscator专业反混淆技术

终极指南:5步掌握Java-Deobfuscator专业反混淆技术 【免费下载链接】deobfuscator The real deal 项目地址: https://gitcode.com/gh_mirrors/de/deobfuscator Java-Deobfuscator是一款专业级的Java代码反混淆工具,能够有效对抗市面上主流商业混淆…

2026/10/18 13:16:54 阅读更多 →
如何在Windows和Linux上免费畅玩Switch游戏:Ryujinx模拟器终极指南

如何在Windows和Linux上免费畅玩Switch游戏:Ryujinx模拟器终极指南

如何在Windows和Linux上免费畅玩Switch游戏:Ryujinx模拟器终极指南 【免费下载链接】Ryujinx 用 C# 编写的实验性 Nintendo Switch 模拟器 项目地址: https://gitcode.com/GitHub_Trending/ry/Ryujinx 你是否梦想在PC上体验任天堂Switch的精彩游戏世界&#…

2026/10/18 13:17:18 阅读更多 →
如何构建稳定可靠的Nintendo Switch定制固件:Atmosphere完整技术解析与操作指南

如何构建稳定可靠的Nintendo Switch定制固件:Atmosphere完整技术解析与操作指南

如何构建稳定可靠的Nintendo Switch定制固件:Atmosphere完整技术解析与操作指南 【免费下载链接】Atmosphere-stable 大气层整合包系统稳定版 项目地址: https://gitcode.com/gh_mirrors/at/Atmosphere-stable Atmosphere作为目前最稳定、最安全的Nintendo S…

2026/10/18 13:17:20 阅读更多 →

最新新闻

纯Win32+GDI实现的C++俄罗斯方块实战工程

纯Win32+GDI实现的C++俄罗斯方块实战工程

简介:这是一份面向C初学者与图形界面实践者的俄罗斯方块小游戏完整开源项目,聚焦于Windows平台下的MFC框架开发,适用于算法逻辑理解、GUI事件响应及内存绘图(CMyMemDC)等核心技能训练。资源共27个文件,包含…

2026/10/19 20:33:34 阅读更多 →
深度学习放射组学预测乳腺癌腋窝淋巴结状态

深度学习放射组学预测乳腺癌腋窝淋巴结状态

1. 项目概述:这不是“AI看片”,而是把影像里肉眼看不见的纹理变成临床决策依据“Day 15. Deep learning radiomics can predict axillary lymph node status in early-stage breast cancer”——这个标题乍看像某份科研日志的随手记录,但背后…

2026/10/19 20:32:32 阅读更多 →
企业级AI Agent落地:数据、流程与人,才是真正的瓶颈

企业级AI Agent落地:数据、流程与人,才是真正的瓶颈

落地企业级AI Agent一年,最颠覆我认知的一点是:模型能力从来不是真正的瓶颈。 去年年初,我们团队接到一个任务——在某制造集团内部落地企业级AI Agent,覆盖客服问答、供应链协同、内部知识检索几个方向。立项时团队吵得最凶的是…

2026/10/19 20:32:32 阅读更多 →
Claude Code 编程工作流:从自然语言到高效代码的 AI 搭档

Claude Code 编程工作流:从自然语言到高效代码的 AI 搭档

最近这段时间,我在几个项目的开发里大量使用了 Claude Code 这套编程工作流。说句实话,用过之后再看以前的编码习惯,多少有点回不去了。它不是那种锦上添花的效率小工具,而是直接改变了你和代码之间的交互方式:过去你坐…

2026/10/19 20:32:32 阅读更多 →
kubeadm离线安装Kubernetes集群:镜像准备与常见故障排查

kubeadm离线安装Kubernetes集群:镜像准备与常见故障排查

最近有个朋友问我,能不能在不折腾网络的前提下,用 kubeadm 装一个指定版本的 Kubernetes 集群。他试过几次 kubeadm init ,每次都在拉取 registry.k8s.io 这一步超时,要么就是预检阶段卡了几分钟直接报错。这个问题在受网络限…

2026/10/19 20:31:29 阅读更多 →
UDP+TCP+多线程+Swing:局域网P2P即时通信课设全解析

UDP+TCP+多线程+Swing:局域网P2P即时通信课设全解析

简介:广东工业大学计算机网络课程设计项目,实现基于P2P的局域网即时通信系统,面向计网课设、Java网络编程与P2P应用开发者。系统采用P2P架构,程序既是服务器又是客户端,通过3333端口扫描局域网在线对等方,完…

2026/10/19 20:29:26 阅读更多 →

日新闻

频率跟踪型PWM电源设计:臭氧发生器谐振点漂移与软开关实现

频率跟踪型PWM电源设计:臭氧发生器谐振点漂移与软开关实现

简介:本资源为电源技术方向的学术研究文档,聚焦介质阻挡放电型臭氧发生器电源的频率跟踪型PWM控制策略,面向电力电子、高压电源及臭氧应用领域的科研人员与工程技术人员。针对负载呈容性、等效电容随外加电压升高而增大、谐振频率随之漂移的难…

2026/10/19 0:00:47 阅读更多 →
Vibe Coding 遇上 TaoToken:把开发者思维圣殿的灵感流接入统一 Key 通道

Vibe Coding 遇上 TaoToken:把开发者思维圣殿的灵感流接入统一 Key 通道

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/19 0:00:47 阅读更多 →
HundredCV-Chat话题建模实战教程:利用4,871个内置话题标签构建主题分析系统

HundredCV-Chat话题建模实战教程:利用4,871个内置话题标签构建主题分析系统

【免费下载链接】HundredCV-Chat 项目地址: https://ai.gitcode.com/hf_mirrors/Jax-dan/HundredCV-Chat 点击查看 免费下载 HundredCV-Chat 是一个由 100 位青年简历数据开发而来的中文多轮对话数据集,共包含 24,750 组日常闲聊对话和 4,871 个话题标签…

2026/10/19 0:00:47 阅读更多 →

周新闻

基于GMM的语音识别系统原理与MATLAB实现详解

基于GMM的语音识别系统原理与MATLAB实现详解

说到基于高斯混合模型(GMM)的语音识别系统,很多人第一反应就是一堆数学公式,觉得门槛很高。但如果你真的在MATLAB里把它落地跑通,会发现核心其实就是三件事:把声音变成特征向量,用GMM给每个类别…

2026/10/19 10:02:04 阅读更多 →
数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理这四个字听起来挺唬人,但落到具体操作上,无非就是让计算机按你的想法“摆弄”像素。我在一个模拟项目X里用了一套特别经典的基础处理流程:对图像做反白、改调色板、彩色转灰度,最后把像素数据导出成txt文件。单看每一…

2026/10/19 17:32:41 阅读更多 →
机器人大脑技术盘点:具身智能的感知、决策与数据闭环

机器人大脑技术盘点:具身智能的感知、决策与数据闭环

如果你的信息流最近也天天刷到“机器人大脑”这个词,你会发现一个很有意思的现象:每个人说的“大脑”根本不是同一个东西。有人指的是大语言模型,有人指的是运动控制系统,还有人指的是能理解物理世界的端到端模型。在2026年这个时…

2026/10/19 1:30:52 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/19 2:54:50 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/19 9:10:22 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/18 12:16:16 阅读更多 →