成为全栈

FungLeo21 小时前
postgresql·golang·sqlite·go·数据库迁移·成为全栈
成为全栈·Go 后端篇·从 Node SQLite 到 PostgreSQL:把迁移做成独立交付物数据搬迁不是把表导成 JSON 再导入。它要锁定源快照、定义字段规范、遵守父子顺序、拒绝危险目标,并在真实写入后核对关系和计数。
FungLeo1 天前
golang·集成测试·差分测试·成为全栈·后端测试·数据库测试
成为全栈·Go 后端篇·Go 后端怎么测试:从成功响应到故障后置状态测试的价值不在“代码跑过”,而在于它能把关键业务不变量变成失败时也可检查的证据。对重写项目,成功响应、数据库状态、跨语言差分和客户端 smoke 各自证明不同事情。
FungLeo1 天前
flutter·golang·go·成为全栈·兼容测试·taro 小程序
成为全栈·Go 后端篇·换后端不改前端:四个客户端如何做兼容回归后端实现换了,客户端可以不改源码,但这不代表只要 API 地址能访问就算兼容。登录载体、响应边界、缓存状态、上传和平台传输都要沿原请求链实际跑一遍。
FungLeo4 天前
golang·go·gorm·数据库事务·分类树·成为全栈
成为全栈·Go 后端篇·分类树与标签关系:目录变更为何需要协调分类和标签看似是两张简单的字典表,但文章既保存外键关系,也保留面向列表的冗余展示字段。目录改名、移动和删除会触及文章数据,不是单行 CRUD。
FungLeo4 天前
golang·go·gorm·分页查询·成为全栈·sql安全
成为全栈·Go 后端篇·文章查询与展示投影:安全分页、排序和软删除列表接口不只是拼几个 WHERE 条件。它还要隔离未发布内容、稳定排序、限制重查询成本,并确保摘要查询不会顺手加载整篇正文。
FungLeo6 天前
golang·go·jwt·身份认证·成为全栈·bcrypt
成为全栈·Go 后端篇·跨语言认证兼容:Node 与 Go 如何互认 JWT 和密码“同样是 HS256”和“同样使用 bcrypt”不等于两个后端天然兼容。身份声明、过期边界、Cookie 优先级和密码字节处理都可能让旧客户端突然无法登录。
FungLeo6 天前
golang·node.js·go·openapi·契约测试·成为全栈
成为全栈·Go 后端篇·重写之前先锁基线:契约、Node 版本与行为清单重写同一套后端,第一步不是创建 Go 项目,而是搞清楚“同一套”究竟指什么。本文代码快照:Go 后端提交 ceac4e0;API 契约 1.12.0,SHA-256 为 7b252c7ca701b45fdfd2a1e9dc7650085ff36e4ee9644265ad3fb6c485a5e030;Node 对照为 node-backend-v1.0.4,提交 7effc0276ffdf2fbd8183ec2e60d544ed8998bec。
FungLeo7 天前
golang·node.js·go·合约测试·差分测试·成为全栈·api兼容
成为全栈·Go 后端篇·契约一致性与差分测试:两套实现如何互相校验两个后端返回相同 JSON,不代表整个系统等价;一个已知差异也不一定是缺陷。差分测试要严格保留关键行为,只规范化明确的随机部分,再由契约和产品事实判断差异。
FungLeo8 天前
golang·go·领域驱动设计·gorm·分层架构·成为全栈
成为全栈·Go 后端篇·用 Go 重写分层架构:领域包、装配根与最小抽象语言迁移最容易复制的是语法,最值得重新审视的是边界。一个清晰的 Go 工程要让请求入口、业务规则、数据模型和基础设施各自承担有限责任。
FungLeo16 天前
flutter·移动开发·深色模式·可访问性·成为全栈·大字号适配
成为全栈·Flutter App 篇·主题与可访问性:深浅色、大字号和触控体验这一篇讲视觉,但重点不在"好看",在**“这些颜色和尺寸从哪来,以及谁来保证它们一直是对的”**。做 App 的过程里有个反复出现的现象:设计稿上写的是 A,开发实现的是 B,评审时没人发现。
FungLeo17 天前
flutter·移动开发·跨端开发·成为全栈·api契约·全栈复盘
成为全栈·Flutter App 篇·第四批复盘:复用了什么,移动端又新增了什么到这一篇,四个批次做完了。先摆数据,因为复盘最容易变成感想,而数字不会骗人:契约:54 paths / 68 operations,五端共享。
FungLeo19 天前
flutter·移动开发·markdown编辑器·表单设计·成为全栈·草稿保存
成为全栈·Flutter App 篇·Markdown 编辑器:编辑、预览与离开保护编辑器有两个按钮:编辑、预览。切一下。就这样。我最初的实现就是切一下——然后发现用户抱怨"预览之后回来,我的东西没了"。
FungLeo19 天前
flutter·dart·身份认证·数据隔离·成为全栈·会员中心
成为全栈·Flutter App 篇·会员中心:资料、密码、通知与私有数据缓存会员中心是整个 App 里私有数据最集中的一页。我原本以为它最简单——一个列表,几行用户信息,几个设置项。
FungLeo20 天前
flutter·网络安全·移动开发·webview·路由管理·成为全栈
成为全栈·Flutter App 篇·内置 WebView:网页历史、App 返回与外链安全做这个功能的时候,我被一个看起来根本不该成为问题的问题卡住了。用户点文章里的一个外部链接,进入内置网页。在网页里点了两个链接(网页内部 A → B),然后按手机上的返回键。
FungLeo20 天前
flutter·markdown·dart·代码高亮·成为全栈·移动阅读
成为全栈·Flutter App 篇·Flutter Markdown 阅读器:支持范围与渲染边界做阅读器之前我先问了一个问题:App 里渲染的 Markdown,和 Web 上渲染的,是同一样东西吗?
FungLeo20 天前
flutter·锚点·阅读体验·成为全栈·markdown目录·api契约
成为全栈·Flutter App 篇·服务端目录与文章辅助阅读:锚点、上下篇、浏览量和阅读历史上一篇解决了"目录项怎么绑到标题上"。这篇接着说文章页里其余那些看起来都很小、但每个都有自己的坑的功能:目录面板、上下篇、浏览量、阅读历史。
FungLeo21 天前
flutter·移动开发·标签·搜索·分类管理·成为全栈
成为全栈·Flutter App 篇·分类、标签与搜索:移动端内容发现上一篇把首页接上了真实接口。接下来是内容发现的三个入口:分类、标签、搜索。这三个功能看起来是三个页面,实际做完才发现它们共享一个核心难题,而且这个难题的解法写在契约里——如果我们没仔细读契约,会写出三份互相不兼容的代码。
FungLeo21 天前
flutter·移动开发·下拉刷新·分页加载·列表优化·成为全栈
成为全栈·Flutter App 篇·列表分页与下拉刷新:去重、失败保留和返回位置做列表页的时候我写过一句很自豪的代码:上线第三天,用户反馈:“首页文章会重复。”我一开始不信。服务端分页是干净的,第 1 页 12 条、第 2 页 12 条,去重逻辑能有什么问题?直到我打开日志,看到同一个 id 在列表里出现了两次。
FungLeo22 天前
flutter·jwt·移动安全·身份认证·token刷新·成为全栈
成为全栈·Flutter App 篇·Refresh Token 旋转与并发 401:安全存储与会话代次上一篇文章末尾留了个伏笔:缓存键里那个 session:${api.userId}:${api.epoch},我一直没解释 epoch 是什么。今天补上——顺便讲一个我在接入真实后端时被"教育"的问题。
FungLeo23 天前
flutter·限流·dart·dio·错误处理·成为全栈
成为全栈·Flutter App 篇·移动端错误与限流:429、重试和写请求边界上一篇做完令牌轮换,我以为"网络层最难的部分"已经过去了。结果联调第二天就撞上另一个。场景:用户狂点点赞按钮。服务端按 IP 限流,30 秒内第 5 次请求返回 429。我的第一版处理是:看到 429 就重试。