// hello, world

你好,我是 李承泽

全栈开发者 仓储系统独立开发者 open to work

长期专注仓储与物流场景的信息化,习惯一个人把系统从数据库、后端接口、网页后台, 一直做到安卓原生 App 与桌面端。相信好的工具应当在嘈杂的仓库现场也足够顺手。

坐标China
方向仓储物流 · 实时通信
端Web / Android / Desktop
01 · About

关于我

我是一名全栈开发者,主要在仓储与物流领域做系统落地。和只写某一层不同, 我习惯把整条链路走完:从 MySQL 表结构与 Node.js 接口,到网页管理后台、安卓原生 App,再到 Linux 上的部署与运维。

这让我对「真实作业现场需要什么」有第一手的理解——仓管在货架间用手机扫码、管理员在电脑前统筹库存、 团队需要像对讲机一样即时沟通。把这些复杂流程做成简单耐用的工具,是我一直在做的事。

工作之外,我关注实时通信(SSE / WebRTC)、移动端工程化(Jetpack Compose)、多租户数据隔离与人机交互, 踩过的坑会整理成右侧的技术笔记。

现在独立开发一套多端仓储系统
常用语言Kotlin · JavaScript · Python
后端Node.js / Express / MySQL
移动端Android · Compose · WebRTC
偏好简洁、耐用、少打扰
邮箱admin@sqdz888.xyz
02 · Stack

技术栈

围绕一个真实系统长期打磨,覆盖前端、后端、移动端与部署运维。

Web 前端

HTML / CSSJavaScript设计令牌响应式EChartsPWAElectronSSE

后端 / 数据

Node.jsExpressMySQLREST APIRBAC 权限多租户隔离WebRTC 信令JWT

Android 原生

KotlinJetpack ComposeCameraXML KitExoPlayerWebRTCDataStore后台保活

工程 / 运维

LinuxNginxPM2Python / FastAPIOCRGradleHTTPS数据备份
03 · Work

个人项目

这里放我长期维护的作品,更多是给自己和身边团队解决真实问题,而非商业产品宣传。

// flagship project · 独立开发

仓驭 Cangyu 持续迭代中

一套多端仓储作业与管理系统 · Web / Android / Windows

源于真实仓库场景的全栈实践:一线人员用手机扫码完成上货、找货与盘点, 管理员在网页端统筹商品、库存与任务,团队通过对讲机式的频段语音实时协同。 从界面设计、实时通信到多租户权限,均由个人独立设计与实现。

  • 安卓原生(Kotlin + Compose),非网页套壳
  • SSE 频段对讲与单人语音 / 视频通话
  • 扫码上货、盘点、OCR 运单识别
  • 多租户数据隔离与细粒度 RBAC
KotlinNode.jsMySQLWebRTCCompose
下载 Android 版 v1.6.2 在线体验

移动作业端(PWA)

免安装的网页作业端,手机浏览器打开即可扫码作业,可“添加到主屏幕”当 App 使用。

打开看看 →

本站点

你正在看的个人技术博客,单文件原生 HTML/CSS/JS 手写,无框架、无构建,支持深色模式。

回到顶部 →
04 · Notes

技术笔记

把项目里真正踩过、解决过的问题记下来,点击展开阅读。

#01

用 SSE 在仓库里做一台“对讲机”

实时语音广播 · EventSource · 浏览器自动播放策略

仓库环境里,文字沟通太慢,团队更习惯对讲机式的“按住就说、松手即播”。我没有上重型的 IM 长连接, 而是用 Server-Sent Events 做了一条单向、轻量、天然支持断线重连的广播通道。

为什么是 SSE 而不是 WebSocket

频段对讲的数据流是明显的“一人发、多人收”,服务端只需要向同频道成员推消息。SSE 基于 HTTP、 自动重连、按事件类型分发,正好契合;真正需要双向低延迟的单人视频通话,才交给 WebRTC。

两个真正的坑

其一是浏览器的自动播放策略:后台标签页里新建的 Audio 会被拦截, 需要在用户首次点击时“解锁”一次音频上下文,并维护一个播放队列依次播完。

其二是在线状态不能靠“有没有发过言”判断,否则没说话的人永远显示离线。 最终用 60 秒心跳 + 成员上下线事件实时驱动在线列表,切频道也会广播。

#02

用一套设计令牌,把 22 个安卓作业屏统一起来

Jetpack Compose · Design Token · 深色模式

早期页面是一屏一屏堆出来的,颜色、圆角、间距各写各的,很快就出现“配色打架”。 重构的关键不是逐屏美化,而是先把视觉语言收敛成一组设计令牌。

令牌先行

在 Color.kt 与主题里固定主色、辅色、背景、文字、分隔线、成功 / 警告 / 危险等语义色, 以及圆角、阴影、间距梯度。页面只允许引用令牌,不再写死十六进制色值。

结构组件复用

把页面骨架抽成统一的“眉标 + 大标题 + 白卡组 + 底部操作区”,底部导航用半透明毛玻璃承载, 中间凸起扫码主按钮。这样新页面天然一致,旧页面也能按同一模板快速对齐。

结论:设计系统的价值不在好看,而在“之后每加一屏,都不需要重新做视觉决策”。

#03

单台服务器上的多租户:数据隔离与权限矩阵落地

公司级作用域 · RBAC · 越权拦截

系统要同时服务多家公司,且彼此数据互不可见。多租户最怕的是“以为隔离了”, 所以我把隔离做在服务端的强制作用域里,而不是相信前端传参。

行级隔离

所有业务表带 company_id,查询统一经过中间件注入当前用户所属公司, 越权访问其它公司数据直接 403。共享是例外、需显式授权且可随时收回,默认一律隔离。

模块 × 动作的权限矩阵

把权限拆成“模块 : 动作”的粒度(例如 arrivals:confirm、checks:record), 角色勾选权限点;再保留一组登录即可用的基线权限(看对讲、改个人资料),避免新员工进来一片空白。

每一层隔离都配了针对独立数据库的断言测试,确保改动不会在不知不觉中击穿租户边界。

05 · Contact

聊聊技术,或交流仓储数字化

如果你也在做仓储 / 物流系统,或对实时通信、安卓工程化感兴趣,欢迎邮件交流。

admin@sqdz888.xyz