# 收银台系统开发计划 ## 1. 项目概述 ### 1.1 项目目标 开发一个最小化的收银台系统,支持Windows平台安装部署,实现完全本地化数据存储和离线运行。 ### 1.2 核心功能 - 商品扫码录入 - 价格计算 - 多种支付方式支持 - 小票打印 - 日结报表生成 - 触屏操作支持 ### 1.3 技术要求 - 单机部署,所有组件(数据库、服务、前端)打包在一个安装包中 - 完全离线运行,不依赖网络连接 - 支持硬件设备集成(扫码枪、小票打印机、钱箱) - 简洁直观的用户界面 ## 2. 需求分析 ### 2.1 功能需求 #### 2.1.1 商品管理 - 商品信息录入(名称、价格、条码、分类) - 商品信息修改和删除 - 商品库存管理(可选) - 商品搜索和筛选 #### 2.1.2 收银功能 - 条码扫描录入商品 - 手动选择商品 - 数量修改 - 价格计算(含折扣、优惠) - 购物车管理 - 订单挂起和恢复 #### 2.1.3 支付处理 - 现金支付 - 刷卡支付(模拟) - 移动支付(模拟) - 混合支付 - 找零计算 #### 2.1.4 小票打印 - 小票模板设计 - 自动打印设置 - 打印预览 - 重新打印功能 #### 2.1.5 报表统计 - 日销售报表 - 商品销售排行 - 收银员业绩统计 - 数据导出功能 ### 2.2 非功能需求 #### 2.2.1 性能需求 - 系统响应时间 < 1秒 - 支持1000+商品数据 - 支持100+单日交易记录 #### 2.2.2 可用性需求 - 7×24小时稳定运行 - 数据备份和恢复 - 异常处理机制 #### 2.2.3 兼容性需求 - Windows 7/8/10/11支持 - 支持多种扫码枪型号 - 支持多种小票打印机 ## 3. 技术架构设计 ### 3.1 整体架构 ``` ┌─────────────────────────────────────────────────────────┐ │ Electron 主进程 │ ├─────────────────────────────────────────────────────────┤ │ ┌─────────────┐ ┌─────────────┐ ┌─────────────┐ │ │ │ 渲染进程 │ │ 本地服务 │ │ 数据库 │ │ │ │ (React) │ │ (Express) │ │ (SQLite) │ │ │ └─────────────┘ └─────────────┘ └─────────────┘ │ ├─────────────────────────────────────────────────────────┤ │ 硬件接口层 │ │ ┌─────────────┐ ┌─────────────┐ ┌─────────────┐ │ │ │ 扫码枪 │ │ 小票打印机 │ │ 钱箱 │ │ │ └─────────────┘ └─────────────┘ └─────────────┘ │ └─────────────────────────────────────────────────────────┘ ``` ### 3.2 技术选型 #### 3.2.1 桌面应用框架 - **Electron**: 跨平台桌面应用开发框架 - 优势:Web技术栈、跨平台、丰富的生态系统 - 版本:最新稳定版 #### 3.2.2 前端技术 - **React**: 用户界面开发 - 优势:组件化、生态丰富、开发效率高 - 版本:18.x - **Ant Design**: UI组件库 - 优势:丰富的企业级组件、适合收银台界面 - **React Router**: 前端路由管理 #### 3.2.3 后端服务 - **Node.js + Express**: 本地HTTP服务 - 优势:JavaScript全栈、轻量级、易于集成 - **SQLite**: 本地数据库 - 优势:无需安装、文件型数据库、ACID事务支持 - **Sequelize**: ORM框架 - 优势:数据库操作抽象、迁移支持 #### 3.2.4 硬件集成 - **node-serialport**: 串口通信(扫码枪、钱箱) - **node-thermal-printer**: 小票打印机控制 - **USB设备检测库**: USB设备识别 #### 3.2.5 打包部署 - **electron-builder**: 应用打包 - 优势:跨平台打包、自动更新、安装程序生成 ### 3.3 目录结构 ``` minishouyin/ ├── src/ │ ├── main/ # Electron主进程 │ │ ├── main.js # 主进程入口 │ │ ├── menu.js # 应用菜单 │ │ └── ipc.js # IPC通信处理 │ ├── renderer/ # 渲染进程(前端) │ │ ├── components/ # React组件 │ │ ├── pages/ # 页面组件 │ │ ├── services/ # API服务 │ │ ├── utils/ # 工具函数 │ │ └── App.js # 应用入口 │ └── server/ # 本地服务 │ ├── app.js # Express应用 │ ├── routes/ # API路由 │ ├── models/ # 数据模型 │ ├── controllers/ # 控制器 │ └── database/ # 数据库配置 ├── assets/ # 静态资源 │ ├── icons/ # 应用图标 │ └── images/ # 图片资源 ├── build/ # 构建配置 ├── dist/ # 构建输出 ├── package.json └── README.md ``` ## 4. 数据架构设计 ### 4.1 数据库设计 #### 4.1.1 商品表 (products) ```sql CREATE TABLE products ( id INTEGER PRIMARY KEY AUTOINCREMENT, barcode VARCHAR(50) UNIQUE NOT NULL, -- 商品条码 name VARCHAR(200) NOT NULL, -- 商品名称 category_id INTEGER, -- 分类ID price DECIMAL(10,2) NOT NULL, -- 售价 cost_price DECIMAL(10,2), -- 成本价 stock INTEGER DEFAULT 0, -- 库存数量 unit VARCHAR(20), -- 单位 image_url VARCHAR(500), -- 商品图片 description TEXT, -- 商品描述 is_active BOOLEAN DEFAULT 1, -- 是否启用 created_at DATETIME DEFAULT CURRENT_TIMESTAMP, updated_at DATETIME DEFAULT CURRENT_TIMESTAMP, FOREIGN KEY (category_id) REFERENCES categories(id) ); ``` #### 4.1.2 商品分类表 (categories) ```sql CREATE TABLE categories ( id INTEGER PRIMARY KEY AUTOINCREMENT, name VARCHAR(100) NOT NULL, -- 分类名称 parent_id INTEGER, -- 父分类ID sort_order INTEGER DEFAULT 0, -- 排序 is_active BOOLEAN DEFAULT 1, -- 是否启用 created_at DATETIME DEFAULT CURRENT_TIMESTAMP, FOREIGN KEY (parent_id) REFERENCES categories(id) ); ``` #### 4.1.3 订单表 (orders) ```sql CREATE TABLE orders ( id INTEGER PRIMARY KEY AUTOINCREMENT, order_no VARCHAR(50) UNIQUE NOT NULL, -- 订单号 total_amount DECIMAL(10,2) NOT NULL, -- 总金额 discount_amount DECIMAL(10,2) DEFAULT 0, -- 折扣金额 paid_amount DECIMAL(10,2) NOT NULL, -- 实付金额 payment_method VARCHAR(50) NOT NULL, -- 支付方式 payment_status VARCHAR(20) DEFAULT 'paid', -- 支付状态 cashier_id INTEGER, -- 收银员ID customer_info TEXT, -- 客户信息(JSON) notes TEXT, -- 备注 created_at DATETIME DEFAULT CURRENT_TIMESTAMP, updated_at DATETIME DEFAULT CURRENT_TIMESTAMP ); ``` #### 4.1.4 订单明细表 (order_items) ```sql CREATE TABLE order_items ( id INTEGER PRIMARY KEY AUTOINCREMENT, order_id INTEGER NOT NULL, -- 订单ID product_id INTEGER NOT NULL, -- 商品ID quantity INTEGER NOT NULL, -- 数量 unit_price DECIMAL(10,2) NOT NULL, -- 单价 total_price DECIMAL(10,2) NOT NULL, -- 小计 discount_amount DECIMAL(10,2) DEFAULT 0, -- 折扣金额 created_at DATETIME DEFAULT CURRENT_TIMESTAMP, FOREIGN KEY (order_id) REFERENCES orders(id), FOREIGN KEY (product_id) REFERENCES products(id) ); ``` #### 4.1.5 收银员表 (cashiers) ```sql CREATE TABLE cashiers ( id INTEGER PRIMARY KEY AUTOINCREMENT, username VARCHAR(50) UNIQUE NOT NULL, -- 用户名 password VARCHAR(100) NOT NULL, -- 密码(加密) name VARCHAR(100) NOT NULL, -- 姓名 role VARCHAR(20) DEFAULT 'cashier', -- 角色 is_active BOOLEAN DEFAULT 1, -- 是否启用 last_login_at DATETIME, -- 最后登录时间 created_at DATETIME DEFAULT CURRENT_TIMESTAMP ); ``` #### 4.1.6 系统设置表 (settings) ```sql CREATE TABLE settings ( id INTEGER PRIMARY KEY AUTOINCREMENT, key VARCHAR(100) UNIQUE NOT NULL, -- 设置键 value TEXT, -- 设置值 description TEXT, -- 描述 updated_at DATETIME DEFAULT CURRENT_TIMESTAMP ); ``` ### 4.2 数据库初始化脚本 ```sql -- 插入默认商品分类 INSERT INTO categories (name, sort_order) VALUES ('饮料', 1), ('零食', 2), ('日用品', 3), ('烟酒', 4); -- 插入示例商品 INSERT INTO products (barcode, name, category_id, price, stock, unit) VALUES ('6901234567890', '可口可乐330ml', 1, 3.50, 100, '瓶'), ('6901234567891', '百事可乐330ml', 1, 3.50, 100, '瓶'), ('6901234567892', '乐事薯片原味', 2, 8.50, 50, '袋'), ('6901234567893', '旺旺雪饼', 2, 5.00, 80, '袋'); -- 插入默认收银员 INSERT INTO cashiers (username, password, name, role) VALUES ('admin', 'pbkdf2_sha256$...', '管理员', 'admin'), ('cashier1', 'pbkdf2_sha256$...', '收银员1', 'cashier'); -- 插入系统设置 INSERT INTO settings (key, value, description) VALUES ('shop_name', '迷你收银台', '店铺名称'), ('shop_address', '', '店铺地址'), ('shop_phone', '', '店铺电话'), ('receipt_header', '欢迎光临', '小票抬头'), ('receipt_footer', '谢谢惠顾,欢迎再次光临', '小票底部'), ('auto_print', 'true', '自动打印小票'), ('tax_rate', '0.00', '税率'); ``` ## 5. 开发实施步骤 ### 5.1 第一阶段:项目初始化与基础架构搭建(预计2天) #### 5.1.1 项目初始化 - 创建项目目录结构 - 初始化package.json - 配置Electron主进程 - 配置开发环境和构建工具 #### 5.1.2 基础服务搭建 - 创建Express服务器 - 配置SQLite数据库连接 - 设置Sequelize ORM - 实现基础API路由结构 #### 5.1.3 前端基础框架 - 创建React应用结构 - 配置Ant Design UI库 - 设置React Router路由 - 实现基础布局组件 ### 5.2 第二阶段:核心功能开发(预计5天) #### 5.2.1 商品管理模块(1天) - 商品列表展示 - 商品添加/编辑/删除 - 商品分类管理 - 商品搜索功能 #### 5.2.2 购物车功能(1天) - 商品添加到购物车 - 购物车商品数量修改 - 购物车商品删除 - 价格计算与折扣 #### 5.2.3 订单处理(1天) - 订单创建 - 支付方式选择 - 订单确认与提交 - 订单历史查询 #### 5.2.4 小票打印(1天) - 小票模板设计 - 打印机连接与配置 - 小票打印功能实现 - 打印预览功能 #### 5.2.5 报表统计(1天) - 日销售报表 - 商品销售统计 - 收银员业绩统计 - 数据导出功能 ### 5.3 第三阶段:硬件集成与优化(预计3天) #### 5.3.1 扫码枪集成(1天) - 串口扫码枪连接 - 条码识别与解析 - 扫码事件处理 - 键盘模式扫码支持 #### 5.3.2 小票打印机集成(1天) - 热敏打印机驱动 - 打印参数配置 - 打印状态监控 - 异常处理机制 #### 5.3.3 钱箱控制(1天) - 钱箱连接与控制 - 开钱箱指令发送 - 支付完成后自动开箱 - 手动开箱功能 ### 5.4 第四阶段:系统优化与打包(预计2天) #### 5.4.1 性能优化 - 数据库查询优化 - 前端渲染优化 - 内存使用优化 - 启动速度优化 #### 5.4.2 异常处理与日志 - 全局异常捕获 - 错误日志记录 - 操作日志记录 - 数据备份机制 #### 5.4.3 应用打包 - electron-builder配置 - 应用图标与资源处理 - 安装程序生成 - 自动更新机制 ### 5.5 第五阶段:测试与部署(预计2天) #### 5.5.1 功能测试 - 各功能模块测试 - 硬件兼容性测试 - 异常场景测试 - 性能压力测试 #### 5.5.2 部署准备 - 用户手册编写 - 安装指南制作 - 演示数据准备 - 最终打包发布 ## 6. 关键技术实现 ### 6.1 Electron主进程与渲染进程通信 ```javascript // 主进程 (main.js) const { ipcMain } = require('electron'); // 处理硬件设备操作 ipcMain.handle('open-cash-drawer', async () => { try { // 打开钱箱逻辑 return { success: true }; } catch (error) { return { success: false, error: error.message }; } }); // 渲染进程 (React组件) const { ipcRenderer } = window.require('electron'); const openCashDrawer = async () => { const result = await ipcRenderer.invoke('open-cash-drawer'); if (result.success) { message.success('钱箱已打开'); } else { message.error(`打开钱箱失败: ${result.error}`); } }; ``` ### 6.2 本地服务器与前端通信 ```javascript // API服务封装 class ApiService { constructor() { this.baseUrl = 'http://localhost:3001/api'; } async getProducts() { const response = await fetch(`${this.baseUrl}/products`); return response.json(); } async createOrder(orderData) { const response = await fetch(`${this.baseUrl}/orders`, { method: 'POST', headers: { 'Content-Type': 'application/json', }, body: JSON.stringify(orderData), }); return response.json(); } } ``` ### 6.3 小票打印实现 ```javascript // 打印服务 const printer = require('node-thermal-printer'); const printReceipt = async (orderData) => { try { await printer.init({ type: printer.printerTypes.EPSON, interface: 'printer:auto' }); printer.alignCenter(); printer.println('迷你收银台'); printer.drawLine(); printer.alignLeft(); printer.println(`订单号: ${orderData.orderNo}`); printer.println(`时间: ${new Date().toLocaleString()}`); printer.drawLine(); // 打印商品明细 orderData.items.forEach(item => { printer.println(`${item.name} x${item.quantity} ${item.totalPrice}`); }); printer.drawLine(); printer.println(`总计: ${orderData.totalAmount}`); printer.println(`支付方式: ${orderData.paymentMethod}`); printer.cut(); await printer.execute(); return { success: true }; } catch (error) { return { success: false, error: error.message }; } }; ``` ## 7. 风险评估与应对 ### 7.1 技术风险 - **硬件兼容性问题**: 不同品牌型号的扫码枪、打印机可能存在兼容性差异 - 应对:提供设备配置界面,支持多种设备驱动 - **性能瓶颈**: 大量商品数据可能导致查询缓慢 - 应对:数据库索引优化,分页加载,本地缓存 ### 7.2 开发风险 - **跨平台兼容性**: Windows不同版本可能存在差异 - 应对:多版本测试,兼容性处理 - **Electron应用体积**: 打包后应用可能较大 - 应对:资源优化,按需加载,压缩打包 ### 7.3 用户体验风险 - **操作复杂性**: 收银员可能不熟悉电脑操作 - 应对:简化界面设计,大按钮布局,触屏优化 ## 8. 项目交付物 1. **可执行安装包**: Windows平台安装程序 2. **源代码**: 完整的项目源代码 3. **技术文档**: 系统架构、API文档、数据库设计 4. **用户手册**: 安装指南、使用说明、常见问题 5. **演示数据**: 示例商品数据、测试账号 ## 9. 后续扩展计划 1. **移动端支持**: 开发Android版本 2. **会员系统**: 会员管理、积分、储值功能 3. **库存管理**: 进销存管理、库存预警 4. **多店连锁**: 多门店数据同步、集中管理 5. **云端备份**: 本地数据云端备份与恢复 6. **数据分析**: 销售趋势分析、客户消费分析 --- 本开发计划基于最小可行产品(MVP)原则,优先实现核心功能,确保系统稳定可靠,后续可根据实际使用情况逐步扩展功能。