我是一名全栈开发者,主要在仓储与物流领域做系统落地。和只写某一层不同, 我习惯把整条链路走完:从 MySQL 表结构与 Node.js 接口,到网页管理后台、安卓原生 App,再到 Linux 上的部署与运维。
这让我对「真实作业现场需要什么」有第一手的理解——仓管在货架间用手机扫码、管理员在电脑前统筹库存、 团队需要像对讲机一样即时沟通。把这些复杂流程做成简单耐用的工具,是我一直在做的事。
工作之外,我关注实时通信(SSE / WebRTC)、移动端工程化(Jetpack Compose)、多租户数据隔离与人机交互, 踩过的坑会整理成右侧的技术笔记。
围绕一个真实系统长期打磨,覆盖前端、后端、移动端与部署运维。
这里放我长期维护的作品,更多是给自己和身边团队解决真实问题,而非商业产品宣传。
源于真实仓库场景的全栈实践:一线人员用手机扫码完成上货、找货与盘点, 管理员在网页端统筹商品、库存与任务,团队通过对讲机式的频段语音实时协同。 从界面设计、实时通信到多租户权限,均由个人独立设计与实现。
把项目里真正踩过、解决过的问题记下来,点击展开阅读。
仓库环境里,文字沟通太慢,团队更习惯对讲机式的“按住就说、松手即播”。我没有上重型的 IM 长连接, 而是用 Server-Sent Events 做了一条单向、轻量、天然支持断线重连的广播通道。
频段对讲的数据流是明显的“一人发、多人收”,服务端只需要向同频道成员推消息。SSE 基于 HTTP、 自动重连、按事件类型分发,正好契合;真正需要双向低延迟的单人视频通话,才交给 WebRTC。
其一是浏览器的自动播放策略:后台标签页里新建的 Audio 会被拦截,
需要在用户首次点击时“解锁”一次音频上下文,并维护一个播放队列依次播完。
其二是在线状态不能靠“有没有发过言”判断,否则没说话的人永远显示离线。 最终用 60 秒心跳 + 成员上下线事件实时驱动在线列表,切频道也会广播。
早期页面是一屏一屏堆出来的,颜色、圆角、间距各写各的,很快就出现“配色打架”。 重构的关键不是逐屏美化,而是先把视觉语言收敛成一组设计令牌。
在 Color.kt 与主题里固定主色、辅色、背景、文字、分隔线、成功 / 警告 / 危险等语义色,
以及圆角、阴影、间距梯度。页面只允许引用令牌,不再写死十六进制色值。
把页面骨架抽成统一的“眉标 + 大标题 + 白卡组 + 底部操作区”,底部导航用半透明毛玻璃承载, 中间凸起扫码主按钮。这样新页面天然一致,旧页面也能按同一模板快速对齐。
结论:设计系统的价值不在好看,而在“之后每加一屏,都不需要重新做视觉决策”。
系统要同时服务多家公司,且彼此数据互不可见。多租户最怕的是“以为隔离了”, 所以我把隔离做在服务端的强制作用域里,而不是相信前端传参。
所有业务表带 company_id,查询统一经过中间件注入当前用户所属公司,
越权访问其它公司数据直接 403。共享是例外、需显式授权且可随时收回,默认一律隔离。
把权限拆成“模块 : 动作”的粒度(例如 arrivals:confirm、checks:record),
角色勾选权限点;再保留一组登录即可用的基线权限(看对讲、改个人资料),避免新员工进来一片空白。
每一层隔离都配了针对独立数据库的断言测试,确保改动不会在不知不觉中击穿租户边界。