更新日期:2026-08-13 评估范围:
lc_garage当前前端、后端、设备接入和自动化测试代码 状态说明:本文用于记录尚未完成的业务闭环和生产风险,不代表相关模块完全没有代码。 本次更新:基于全量代码复查(资金支付财务 / 设备通行告警 / 平台工程安全三个领域),新增安全漏洞小节与工程缺陷清单。
当前项目已经具备单机人工收费停车场的基础业务链路,包括停车场配置、车辆管理、统一进出场、停车会话、数字票、人工收费、支付流水、月卡、交接班、报表、道闸模拟、小票打印和异常处置闭环。
距离正式运营仍缺少的关键闭环:
“存在支付方式配置”不等同于“已经接入真实支付”。当前非现金支付主要用于业务流程确认,尚未连接实际支付终端或支付网关。
seed.go 授予 618 角色 /user/admin_register 权限,而注册接口(internal/api/v1/system/sys_user.go:157-179)直接使用请求体的 AuthorityId 建用户、不校验目标角色 → 618 可注册一个 888 管理员账号获得全部权限。数据库中 618 实际拥有 105 条 Casbin 规则(可改收费单价、删停车场、退月卡、黑名单 CRUD),角色粒度过粗。middleware/operation.go:78-87 请求体原文入库(密码/token/支付字段明文),/user/changePassword 等接口的旧密码+新密码被完整记录;响应体无限增长入库(respPool 死代码,响应截断分支写错字段 record.Body 应为 record.Resp)。router.go:67 StaticFS 无鉴权,车牌抓拍图片可猜测 URL 访问。/dashboard/monitor(CPU/内存信息)与 /swagger/* 公开免鉴权(router.go:73,86)。service/system/sys_api.go:39-48,124-139),但路由仍静态注册;启动种子幂等重建 → “权限重启复活”。seed.go:41-83),源码公开默认凭据。dao/camera.go:12-13,无加密 hook)。seed.go:443-444),且无审批。当前情况
payment_record 无渠道订单号、无支付状态字段;外部模式实收金额被丢弃(payment/service/service.go:372-378);数字票 payment_order_no 出场时传空串(vehicle.go:712)。业务影响
FeeConfig.FreeExitMinutes(默认 15,存量库经 DDL default 一次性迁移)——支付后超时限出场按实际时长全额重算差额,未补缴拒绝放行,补缴后刷新支付时间;vehicle.go paid 分支与预览接口已落地(overtime/overtime_fee/overtime_diff 字段),前后端交互与 10 个测试用例已完成。完成标准
当前情况(2026-08-12 更新)
incident_record 异常事件表 + internal/modules/incident/ 模块,详见 doc/异常处置设计.md。reason 可选参数)、设备离线(在线→离线转换,重连自动关闭)。event_log 时间线审计。device_command_log 指令流水已实现;前端页面已重写;自动化测试已覆盖。仍待接入的异常类型(埋点为预留扩展点)
print_failed 已定义零调用,待打印任务持久化后接线)、支付失败/不确定(待支付订单层)、余位为负/会话与票状态不一致(待对账任务)。当前情况
printer/service/service.go:75 闭包内不检查 srl.Write 返回);打印失败不标设备 offline、不落 incident。完成标准
monthly/service/service.go:75,124)。refunded 并删除白名单,没有退款金额、退款流水和审批;且 Unscoped().Delete 会物理删除该车辆所有“白名单”记录,误伤管理员手动添加的永久白名单(monthly/service/service.go:149-151)。monthly/service/service.go:38-44)。payment_method='cash'(shift/service/service.go:41-43 裸 SQL),POS、扫码、月卡等流水漏计。report/service/service.go:16-33)。payment_record 与 digital_ticket 金额无交叉校验。expired 状态和状态流转规则,但 ExpireAt 字段从未被赋值,无定时任务把票转 expired(定时任务仅 ClearDB,timer.go:17-22);Summary 的 expired 统计恒为 0。UHFReader 获取道闸设备,读卡器和道闸控制器共用设备模型;无法完整表达通道多设备拓扑。config.yaml:191):开启时停用全部 UHF/RFID,开闸“永远成功”,生产误开无任何代码级校验/告警。_ = 吞掉(serial_reader.go:115);响应帧内容丢弃不校验 ACK(reader.go:401-405);SendAndRecv 与主读循环共享无锁 buffer 存在竞态(serial_reader.go:16,91-98)。reader.go:219-221)。LotId 查询条件、容量低于当前在场车辆数校验,以及存在未出场会话时禁止删除。reconcileParkingLotOccupancy 发现漂移不埋点不告警。fmt.Printf 直出 20+ 处(passage/uhf/shift/timer),自定义 GinRecovery 中间件未启用。| 功能 | 当前状态 | 目标能力 |
|---|---|---|
| 车牌摄像头接入 | 只有 camera 数据实体 |
摄像头配置、RTSP/SDK、OCR 回调、置信度、抓拍、防重复识别、通道绑定 |
| 中央缴费机 | 只有支付入口概念 | 终端注册、心跳、订单查询、支付、出场校验、远程配置 |
| LED 余位屏 | 未实现 | 屏幕配置、协议适配、余位推送、离线重试 |
| 线上支付 | 未实现 | 微信/支付宝等下单、回调、查询、退款和对账 |
| 设备告警中心 | 未实现 | 在线状态、故障事件、告警等级、确认和恢复 |
| 远程设备诊断 | 未实现 | 设备参数、连通性测试、指令测试、诊断审计 |
| 数据备份恢复 | 未实现 | SQLite 备份、校验、恢复、保留策略和恢复演练(当前无 WAL、busy_timeout=0 并发写锁风险) |
| 数据归档清理 | 未实现 | 历史会话、日志、抓拍图片的归档和容量管理(仅 ClearDB 清 2 张表) |
| 报表导出打印 | 未实现 | Excel/PDF 导出、日结单、月报和打印 |
| 打印任务管理 | 未实现 | 打印机配置、任务队列、状态、失败重试和重打权限 |
| 短信/邮件验证 | 模拟实现 | 服务商配置、发送限制、验证码校验和审计 |
| 通道事件持久化 | 内存 50 条队列 | 落库、重启恢复、与异常/指令流水联动 |
core 从未调用 gin.SetMode(gin.ReleaseMode));os.Exit(0) 用成功码退出(gorm.go:74);ListenAndServe 失败仅 log 进程不退(server.go:44)。journal_mode=delete)、无 busy_timeout,多协程并发写有锁冲突风险;无自动备份。deploy/ 全套与项目布局脱节(gva 原版遗留,引用不存在的 server/ 目录)。/api 前缀;cmd_backend_only 不托管前端,前端 env 写死 VITE_BASE_API=/api,直接部署时 404。view/report/enter.vue:212 引用未定义的 t,列表加载失败时 ReferenceError。pinia/modules/user.js:91-98);request.js 401 处理依赖用户点击“重新登录”,取消则不登出。现有自动化测试覆盖停车会话、数字票、支付金额边界、重复和并发支付、事务回滚、道闸接口、USB 票据版式、异常处置(状态机/埋点/权限)、月卡事务、计费引擎与收费配置校验。以下范围仍缺少完整测试:
admin_register 提权(AuthorityId 校验 + 撤销 618 权限)、操作日志脱敏、uploads 鉴权、种子默认凭据处理。os.Exit 与 release 模式。项目进度.md、相关流程文档和测试报告。