缘起
撞单那回我正好在场:同一台机身被两个人订了同一个周末,定金都收了,最后争的是谁先开的口。那台机器一天的租金不算便宜,要赔两边都不肯让。他们的档期记在几个人的脑子里,台账是一份谁都能改的共享表格。
那天之后我觉得,租赁这门生意的核心其实就一句话:同一件东西,同一时间,只能在一个人的手上。
背景
把这句话落成系统,要处理的是设备租赁特有的一圈事:按序列号管到每一台机器而不是按型号管一堆;档期要能在下单时就发现冲突;租期到期、逾期、延租都要有人被提醒;押金、损坏赔付、维修记录得挂在具体那台机器上;客户和复购关系要留得下来;闲置中的设备还得说得出这一台到底赚没赚回本钱。三端可用、开箱即用是顺带的要求——做这行的人不会为了记一笔订单去装数据库。
方案
构建三端一体(PC Web + 移动端 H5 + 后端)的 monorepo 系统,把租赁经营全流程数字化:
- 订单状态机:待确认 → 待发货 → 已借出 → 已归还 → 已完结,任意未完结态可取消;「已延期 / 待归还」为派生标记,不污染状态字段
- 档期可视化 + 防撞单:列表 / 甘特双视图,同一套档期校验逻辑同时服务 PC 与移动端
- 设备台账:状态(空闲 / 维修 / 报废)与「出租中」由活跃订单实时派生,不落冗余计数器
- 租客管理:累计下单与消费金额实时聚合,复租一键调取客户资料
- 支出台账:维修 / 运费 / 配件等多维记录,与营收口径构成完整损益核算
- RBAC 系统管理:用户-角色-权限三级模型,按权限码(如
order:view)精细控制 - 移动端五大场景:今日待办、档期时间轴、30 秒极速录单、卡片式状态流转、经营报表
技术架构
| 模块 | 技术选型 |
|---|---|
| PC 前端 | Vue3 + Element Plus + Pinia + ECharts |
| 移动端 | Vue3 + Vant + Pinia(按需引入 + 路由懒加载) |
| 后端 | Go + Gin + GORM |
| 数据库 | SQLite(开箱即用)/ MySQL(生产) |
| 鉴权 | JWT + RBAC 权限码两级中间件 |
| 工程 | Makefile 统一入口 + 架构护栏测试 + OpenSpec 规格流 |
三端统一约定(stores/ 目录、@ 路径别名、JSON snake_case),架构护栏测试把分层铁律编译成会红的静态检查,make test / make smoke 作为强校验入口。
成果
档期冲突从「靠脑子记」变成系统级约束,防撞单校验同源服务于双端;设备回本进度、单台创收从拍脑袋变成实时可查的经营看板。移动端承担快速录单与提醒场景,PC 端负责甘特图与完整看板;SQLite 开箱即用与单二进制部署,让小微企业也能零运维用上专业租赁管理工具。
体验
系统已部署,PC 与移动端可分别体验:
- PC 端:reo.bennywen.xyz
- 移动端(推荐手机打开):reo.bennywen.xyz/m
