- 博客(459)
- 资源 (11)
- 问答 (1)
- 收藏
- 关注
原创 成为全栈·React 管理后台篇·文章管理工作流:保存修改、投稿、发布与下架
普通保存一篇已发布文章,却意外把它改回草稿,是前端没有忠实表达后端状态机的典型问题。本文说明如何让保存修改保留原状态,把发布、审核和下架设计成显式动作,并处理发布专属校验、新建转编辑、权限限制、确认提示和表单基线更新,让按钮文案与真实业务结果保持一致。
2026-09-20 10:29:14
363
原创 成为全栈·React 管理后台篇·Markdown 编辑器:预览、暗色主题与连续图片粘贴
Markdown 编辑器能显示工具栏,并不代表它已经适合真实写作。本文从连续粘图时异步回调用旧 value 覆盖新正文的问题出发,介绍受控值与 latest ref、Promise 上传队列、光标插入、单图失败隔离和上传计数,并进一步处理窄屏单栏、实时预览、暗色主题、高度约束及离开保护等第三方编辑器集成边界。
2026-09-20 10:15:55
127
原创 成为全栈·React 管理后台篇·表单页范式:校验、数据回填与未保存保护
表单校验正确,并不代表用户的输入不会丢失。本文从后台重新拉取数据覆盖正在编辑的正文这一真实问题出发,说明如何区分服务端基线和表单工作副本,只做一次自动回填,并在保存成功后重建 dirty 基线;同时处理隐藏面板错误定位、新建转编辑、防重复提交,以及应用内导航和浏览器关闭的未保存保护。
2026-09-19 10:24:31
393
原创 成为全栈·React 管理后台篇·列表页范式:让分页、筛选和返回位置进入 URL
管理后台列表页的页码、筛选、排序和关键词,描述的是用户正在查看的完整数据集合。本文从编辑后返回却丢失工作位置的问题出发,介绍如何用 URL 承载查询状态,统一参数校验和写入规则,并解决防抖搜索误重置页码、总页数缩小后的页码夹正,以及列表到编辑页的完整返回位置恢复。
2026-09-19 10:20:16
242
原创 成为全栈·React 管理后台篇·前端鉴权闭环:内存令牌、刷新旋转与路由守卫
本文构建React管理后台前端鉴权闭环,解决令牌存储、刷新并发、路由守卫与异常处理四大痛点。通过将accessToken存于内存提升安全性,利用HttpOnly Cookie实现页面重载后会话恢复;采用“刷新令牌旋转”机制,使并发401请求共享同一刷新Promise,避免重复调用;路由守卫等待boot状态落定,防止跳转闪烁;并基于错误码区分可刷新与强制登出场景,确保鉴权逻辑完整、安全且用户体验一致。
2026-09-18 10:10:08
348
原创 成为全栈·React 管理后台篇·TanStack Query 不只是缓存:失效、派生与失败恢复
本文深入解析 TanStack Query 在管理后台中的核心应用,强调其不仅是缓存工具,更是维护数据一致性与业务关系的枢纽。通过合理设计 query key、精准使用 invalidateQueries 与 setQueryData、审慎选择乐观更新、避免派生数据冗余,并结合 staleTime 与失败恢复策略,实现高效、可靠的状态管理。关键在于:查询键是远端事实的地址,失效是业务逻辑的表达,而失败恢复的本质是让用户始终面对可信状态。
2026-09-18 10:05:07
568
原创 成为全栈·React 管理后台篇·服务端状态、会话状态、界面状态:不要都塞进 Zustand
管理后台里的文章列表、登录令牌、侧栏偏好和表单草稿都有不同的权威来源与生命周期。本文从把所有数据塞进全局 store 导致的双源问题出发,说明如何在 TanStack Query、Zustand、React Hook Form、URL 和组件状态之间划分职责,并讨论用户资料同时存在于会话快照和接口缓存时,怎样避免两个真相源。
2026-09-17 10:31:25
445
原创 成为全栈·React 管理后台篇·OpenAPI 生成类型,为什么请求函数仍然手写
OpenAPI 可以生成类型,也可以生成完整请求 SDK,但两者并不是同一个决定。本文从分页字段漂移的真实问题出发,介绍 OpenAPI、生成类型、业务别名和薄 API 函数的四层边界,比较完整 SDK 与手写请求层的成本,并说明契约出现偏差时如何用反向测试和变更流程守住唯一事实源。
2026-09-17 10:27:46
305
原创 成为全栈·React 管理后台篇·请求层封装:统一信封、业务错误与并发 401
管理后台首屏多个请求同时收到 401 时,如果各自刷新一次,旋转 refresh token 会让后续刷新全部失效。本文从这个真实竞态出发,拆解统一响应信封、ApiError、业务码判断和请求重放边界,并使用共享 Promise 将并发刷新收敛为一次,再通过延迟测试稳定复现并锁住这条关键链路。
2026-09-16 10:24:23
257
原创 成为全栈·React 管理后台篇·后台骨架:布局、数据路由与分层守卫
管理后台的骨架不只是一套侧栏布局,更要保证菜单入口、路由访问和权限反馈彼此一致。本文以 React Router 数据路由为基础,拆解裸页、后台主壳、三层守卫和能力函数的协作方式,说明登录恢复中间态、来源地址、页面懒加载及前后端权限边界,并给出适合不同项目规模的取舍标准。
2026-09-16 10:14:14
320
原创 成为全栈·React 管理后台篇·Vite + React + TypeScript:搭起一个有门禁的后台工程
Vite 创建的 React 项目能快速运行,却不会自动拥有可维护性。本文以一套真实管理后台为素材,拆解 TypeScript strict、路径别名、Biome、Vitest 和生产构建各自负责的边界,说明生成代码为何应明确排除、四道门禁为何不能互相替代,并给出当前工程的实际配置与验证结果。
2026-09-15 10:31:50
336
原创 成为全栈·Node 后端篇·数据建模手艺:状态机、冗余计数与适配层的心法清单
收官篇不做新功能,把散落三十篇的建模手艺拧成一张清单:状态机用字段 + 转移矩阵表达生命周期、读多写少时把聚合降级为冗余字段、用唯一约束当锁做零成本幂等、把会变的东西摁进适配层、按读路径选 JSON 列还是关联表、软删除 + isNull 全站统一,最后附 31 篇回顾地图。
2026-09-15 10:20:54
326
原创 成为全栈·Node 后端篇·通知系统:事件消费与已读态管理
通知是互动链路的最后一环。本文讲一张 notifications 表如何同时服务列表、未读数与已读标记:可见性上"仅本人、越权即 404",语义上是评论三态与审核流的下游消费者;并诚实交代本批只做"读与标记",写通知的触发不在这批——这是范围声明,不是偷懒。
2026-09-14 10:40:59
396
原创 成为全栈·Node 后端篇·点赞系统:幂等点赞与计数原子增减
点赞不是简单的 +1。本文讲幂等:用关联表 + ON CONFLICT DO NOTHING 保证并发双发也只加一次、取消点赞时把计数下限夹在 0 防负数、读多写少时存冗余 likeCount 而非每次 COUNT;顺带说明"我的点赞"接口返回裸数组这一契约取舍。
2026-09-14 10:35:59
422
原创 成为全栈·Node 后端篇·辅助接口:相邻、相关、目录、统计与搜索
上一篇、相关文章、目录、统计这些辅助接口最容易被"顺手加"成各自为政。本文讲它们如何薄路由落地:按发布时间定上一篇 / 下一篇、用"共享标签 + 同分类"给相关文章打分并附演算示例、parseToc 纯函数生成目录,并展示公开可见性铁律如何贯穿所有读接口。
2026-09-12 12:28:15
461
原创 成为全栈·Node 后端篇·评论内容安全:敏感词过滤、三态审核与级联删除
评论区既要留得住人,也要控得住风险。本文讲评论安全的三件套:敏感词命中转等长星号并按违规比率定审核态、approved / reviewing / rejected 三态审核流让 reviewing 做人工兜底、公开列表只吐 approved;删除父评论时如何级联子回复,以及过滤为何必须放在服务端。
2026-09-12 12:22:24
351
原创 成为全栈·Node 后端篇·阅读量防刷:去重、冷却与计数写分离
阅读量若每次调用就 +1,很快会变成自欺欺人的数字。本文讲真实实现的三件套:用"时间桶"做去重与 24 小时冷却、去重与计数分开写避免主表行锁竞争、唯一约束兜住并发;也如实交代匿名身份下去重只是尽力而为,且阅读量只统计已发布文章。
2026-09-11 11:21:25
299
原创 成为全栈·Node 后端篇·分类树:无限级分类的存储、查询与环检测
无限级分类的存储、查询与环检测:用 parentId 自关联存层级(以及为何刻意不声明外键引用)、取全量在内存里组装成树、深度四级封顶防失控、环检测防止把节点挂到自己的子孙下、删除守卫 x-cascade:none,外加各分类已发布文章计数与面包屑回溯的实现。
2026-09-11 11:16:52
412
原创 成为全栈·Node 后端篇·一套后端双部署:适配层如何让一份代码跑在两套运行时
项目里为什么有两个入口?本文讲"一套代码双部署"的适配层设计:Drizzle 的 SQLite dialect 统一两端、setDb / getDb 注入模式把数据库实例化摁在边界、两个入口复用同一个 createApp、app.ts 绝不在顶层创建默认实例——让同一份业务代码在自管 Node 与 Cloudflare Workers 两套运行时上各自跑起来。
2026-09-10 11:09:10
406
原创 成为全栈·Node 后端篇·部署上线:从本地起服到真正对外服务
本地起服与"用户能从公网访问"之间,隔着一串环境变量、数据库迁移、HTTPS、CORS 与进程守护。本文对照真实代码讲两条部署路线(自管 Linux 与 Cloudflare Workers)、环境变量这个真正的"旋钮"、STORAGE_DRIVER 存储开关与 CORS 生产配置,并附一张症状 → 根因 → 代码依据的翻车对照表。
2026-09-10 10:52:53
251
原创 成为全栈·Node 后端篇·容器化:给 Node 应用写一个像样的 Dockerfile
容器化是把"环境"也变成代码的一部分。本文为项目写一份像样的 Dockerfile:先看清要装进去的产物,再讲多阶段构建如何只把运行产物带进镜像、基础镜像与 Node 版本怎么选、.dockerignore 怎么挡脏文件、为什么必须非 root 运行,以及首次部署前那两个不能忘的动作:migrate 与 seed。
2026-09-09 10:11:18
217
原创 成为全栈·Node 后端篇·后端测试策略:单元、集成与测试数据库
测试全绿不等于没缺陷,关键在测得对不对。本文讲后端测试策略:不引 supertest 也能用 app.request 发真实请求、测试库用 :memory: + beforeEach 做到互不污染、门禁全绿但错误码与契约不一致的真实教训,以及补测试要专打边界与并发、ESM 与脚本门禁的坑。
2026-09-09 10:08:48
281
原创 成为全栈·Node 后端篇·接口文档自动化:让 OpenAPI 与代码不脱节
文档与代码是两份东西,只要存在两份,迟早会漂移。本文讲更彻底的解法:让 OpenAPI 契约为唯一事实源,用"结构门 + 语义门"两道机器校验把代码与契约焊死;并以真实踩坑说明信封格式冲突、注释与 README 数字这类沉默技术债如何随契约一并治理。
2026-09-08 10:47:48
229
原创 成为全栈·Node 后端篇·全文搜索:从 LIKE 到全文索引
搜索框人人会写,但 LIKE '%词%' 的真实代价常被低估:前导 % 走不了索引、没有相关性排序、中文分词直接失灵。本文帮你判断自己的场景停在哪一段——先用 LIKE 跑起来、用 SCAN_LIMIT 封顶,再谈什么时候才值得上 Meilisearch / Elasticsearch 这类专用引擎。
2026-09-08 10:46:18
732
原创 成为全栈·Node 后端篇·文件上传:R2 / 本地磁盘双实现与签名直传
文件上传看着只有三步,坑全在"收下之后"。本文讲用一层存储适配层同时伺候 Cloudflare R2 与本地磁盘:以 SHA-256 内容寻址让同一份文件不重复落盘,在信任边界做大小与类型校验,防路径遍历与 SVG 的 XSS,删除时靠引用计数护栏决定物理文件去留。
2026-09-07 10:38:14
638
原创 成为全栈·Node 后端篇·文章 CRUD 与投稿状态机
本文讲内容站文章 CRUD 与投稿状态机的落地。先用 draft / pending / published 三态把"谁能直接发、谁发完要审"说清,再讲 member 不可自发布的领域规则如何写进 service,随后走一遍薄路由的 CRUD 端点,以及软删除、slug 部分唯一、标签同步这三个一不留神就漏的坑。
2026-09-07 10:33:34
519
原创 成为全栈·Node 后端篇·列表接口三件套:分页、筛选、排序
列表接口三件套的工程化做法:分页用 offset + 稳定键保证不重不漏;筛选用白名单 DSL,让用户永远拼不出 SQL;排序用带符号字段名并限定基表列,避开连表后的 ambiguous column 报错;再用 SCAN_LIMIT 给 LIKE 全表扫描装一个刹车。
2026-09-06 11:21:06
433
原创 成为全栈·Node 后端篇·分类与标签:多对多关系的建模与查询
围绕"一篇文章挂多个标签、一个标签下躺着几百篇文章"的建模问题,讲多对多关系为什么用中间表存、列表查询怎么避开 N+1、"某标签下有多少篇文章"如何精确统计(而不是靠 JSON 子串匹配),以及删除时"引用存在即拒"的守卫和写入入口唯一的原则。
2026-09-06 11:14:57
463
原创 成为全栈·Node 后端篇·权限模型:从认证到 RBAC
本文区分了认证与授权两个不同概念,基于 RBAC 搭建三层权限模型,划分 member、editor、admin 三种角色,严格划定编辑仅可管理内容、管理员管控用户与站点配置的权限边界。项目以 guard 函数作为授权判断的核心原语,同时支持角色阶梯放行与资源归属放行两套规则;并且严格区分资源不存在返回 404、无访问权限返回 403,避免攻击者遍历探测资源。系统增设两道安全护栏,禁止管理员修改自身角色状态,同时保留至少一名活跃管理员,防止出现无最高权限账号的死锁困境。另外文章提及删除资源前需要校验外部引用
2026-09-05 10:32:02
404
原创 成为全栈·Node 后端篇·注册登录全流程实现
本篇文章完整落地 Node 后端注册、登录、令牌刷新、登出整套认证链路。密码采用 bcryptjs 慢哈希加密存储,杜绝明文入库,纯 JS 实现适配本地与 Cloudflare 双部署环境。注册接口强制新用户角色为普通会员,搭配前置查重与唯一约束异常捕获,抵御并发重复注册问题。登录接口统一返回相同错误码,避免攻击者枚举探测账号。登录成功后签发双令牌:一小时有效期无状态 JWT 访问令牌,以及存入数据库、支持旋转吊销的有状态刷新令牌,刷新令牌存放于 HttpOnly Cookie 提升安全性。登出时直接删除刷
2026-09-05 10:30:04
445
原创 成为全栈·Node 后端篇·认证方案:JWT 还是 Session
本文对比后端两大主流认证方案 JWT 与 Session,Session 会话状态保存在服务端,令牌吊销简单,但水平扩展不便;JWT 属于无状态令牌,适合边缘、Serverless 部署,却存在令牌签发后难以提前作废的短板。项目最终采用折中方案:短期 1 小时有效期的 JWT 作为访问令牌实现无状态鉴权,刷新令牌存入数据库表做有状态管理,支持随时吊销、登出作废。将用户角色存入 JWT 载荷可以免去每次鉴权查询数据库,但是角色更新存在短暂延迟,需要权衡取舍。同时将 401 认证失败场景拆解为 5 种细分业务码
2026-09-04 10:41:05
794
原创 成为全栈·Node 后端篇·结构化日志与请求链路追踪
本文讲解 Node 后端结构化日志与请求链路追踪的建设思路。普通 console.log 难以满足线上排查问题的需求,核心解决方案是为每一次请求生成唯一 requestId 充当 traceId,让整条请求链路的所有日志都携带该标识,故障排查时便可一键还原完整执行轨迹。文章介绍 debug、info、warn、error 四级日志分级管理策略,以此控制生产环境日志噪音。结构化 JSON 日志能够实现日志检索与数据聚合统计,远优于拼接式字符串日志。同时提出日志落盘存储、敏感信息脱敏、日志字段命名与项目契约保持
2026-09-04 10:37:43
369
原创 成为全栈·Node 后端篇·参数校验:为什么必须在最外层做
# 成为全栈·Node 后端篇·参数校验:为什么必须在最外层做从前端转后端的同学,最常带过来的一个误区是:"校验不就是表单那边 `required`、正则匹配一下吗?我前端都验过了,后端还要再验?"要命就在这句话上。前端校验是为了**用户体验**——你输错邮箱,页面立刻红字提示,不用等请求往返。但前端校验**绝对不等于安全**。任何人都可以打开浏览器 DevTools,绕过你的 JS,直接发一个构造好的恶意请求。如果你的后端也"信任"前端传来的数据,那等于把家门钥匙挂在"请随手关门"的提示牌上。举个具
2026-09-03 10:37:13
259
原创 成为全栈·Node 后端篇·错误处理:异常分层与全局捕获
本文讲解Node后端分层异常与全局捕获方案,将错误划分为业务异常、校验异常、未知异常三类。搭建全局错误中间件,让所有异常最终收敛至统一响应信封,无需在每个接口编写try‑catch。采用常量对象管理错误码,借助类型检查提前发现拼写错误。作者结合项目实战总结教训:自动化门禁校验通过不代表语义符合契约,需额外编写契约比对脚本。针对用户名唯一这类并发场景,摒弃先查后插写法,通过捕获数据库唯一约束冲突转换为业务错误。同时定下生产环境安全规则,未知异常堆栈仅留存服务日志,绝不向外泄露给前端。
2026-09-03 10:35:48
311
原创 成为全栈·Node 后端篇·统一响应结构:HTTP 状态码与业务码如何分工
本文介绍 Node 后端接口统一响应信封方案,制定包含code、message、data、requestId、timestamp五字段的返回契约,一套格式适配所有成功、失败与分页列表接口。文章厘清 HTTP 状态码与业务码的分工,HTTP 码供网关、浏览器识别传输状态,业务码交由前端细化处理业务场景。项目采用原生 Response 构造响应,解除 Hono 框架依赖,适配 Node 与 Cloudflare 双部署,同时建立业务码‑HTTP 码集中映射表,通过类型校验防止错误码遗漏。并结合实战案例说明,当代
2026-09-02 09:36:08
271
原创 成为全栈·Node 后端篇·配置管理:环境变量、多环境与密钥安全
本文讲解 Node 后端分层配置与密钥安全工程方案。采用三层配置优先级:代码默认兜底、环境变量覆盖、平台运行时注入,实现一套代码适配多环境。规范 .env 存真实密钥不入库、.env.example 作为公开配置模板,杜绝密钥硬编码与提交泄露。针对 Node/Cloudflare 双部署割裂问题,通过环境单例封装统一读取配置,摒弃框架专属 c.env,保证两端代码一致。同时预置管理员种子环境变量,解决项目初始化无超级管理员的死锁问题,从配置层面保障项目安全、可复现、可无缝环境切换。
2026-09-02 09:32:03
460
原创 成为全栈·Node 后端篇·数据迁移:schema 变更如何不弄脏线上数据
本文聚焦 Node 后端项目的数据迁移方案,讲解线上修改数据表结构的安全实践。文章首先剖析手动执行 ALTER TABLE 改动线上库带来不可追溯、无法复现等多重风险,提出所有结构变更都应写成版本化迁移脚本。结合项目本地环境与 Cloudflare D1 双部署的架构,设计两套差异化迁移路径:本地开发使用内联语句数组循环执行,依靠IF NOT EXISTS实现幂等重置;生产环境借助 drizzle‑kit 生成迁移文件,于部署流水线执行,两条路径同源共用一份 schema 定义。同时点明 better‑sq
2026-09-01 10:38:20
334
原创 成为全栈·Node 后端篇·ORM 为什么选 Drizzle:类型安全与 D1 适配
本文讲解 Node 后端 ORM 选型决策,对比手写 SQL 与 ORM 的差异,分析 Prisma、TypeORM 的不足,最终选定 Drizzle 作为项目 ORM 方案。Drizzle 采用 TypeScript 定义 Schema,无需独立生成步骤,运行时轻量,语法贴近原生 SQL,对 Cloudflare D1 支持良好,适配项目本地 SQLite 与 Cloudflare D1 双部署需求,同一份 Schema 定义可同时用于建表、类型安全查询与双环境运行,避免字段不匹配问题。
2026-09-01 10:33:11
261
原创 成为全栈·Node 后端篇·数据库选型:关系型还是文档型
本文围绕Node后端数据库选型展开对比,剖析关系型数据库与文档型数据库的差异,结合专栏网站关联密集、强一致性、多跨表聚合统计的业务特征,最终选定关系型方案。为达成一份代码同时部署至Linux服务器与Cloudflare D1的目标,项目采用SQLite语义,本地选用better‑sqlite3规避Node实验模块不稳定风险。通过封装`getDb()`数据库适配层,将本地SQLite与D1之间的类型转换收口于单一文件,业务代码无需感知底层驱动差异。同时指出SQLite外键约束默认关闭的隐患,相关校验逻辑交由应
2026-08-31 11:08:39
394
原创 成为全栈·Node 后端篇·分层架构:Controller、Service、Repository 的边界
本文基于Hono+TypeScript后端实战,讲解Controller‑Service‑Repository分层架构,解决项目迭代后期代码臃肿混乱的问题。作者结合十年前端开发经验,对照前端分层思维,给出一套七目录后端工程结构,并明确各层职责边界:routes作为薄控制器仅承担鉴权、参数校验、调用服务、封装响应,禁止直接访问数据库;services存放全部业务规则、状态流转、数据读写逻辑,是数据库访问的唯一入口;shared放置无业务耦合的基础设施代码,尽量做到零框架依赖;types只存放类型定义,以此规避
2026-08-31 11:04:03
501
黑苹果USB无线网卡驱动,适用于mac10.15.x的版本,祝大家好用!
2020-08-04
win10系统iis伪静态配置安装文件64位版
2015-12-17
黑苹果 Clover 引导编辑器 Mac 版本
2020-05-03
Sip 软件免费版,MacOS 下好用的屏幕取色软件
2020-05-03
文本替换专家2.5(无需注册版|非破解)
2015-11-24
让黑苹果系统,支持安卓手机分享USB网络 HoRNDIS-9.2
2020-09-01
用于 MAC上卸载 Creative Cloud 的工具
2017-02-27
FengFocus jQuery焦点图插件
2015-09-04
Sublime Text 3/64 精心调配版 by FungLeo
2015-08-26
移动端css文字使用什么单位最合适?
2015-08-26
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅