16 KiB
16 KiB
收银台系统开发计划
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)
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)
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)
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)
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)
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)
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 数据库初始化脚本
-- 插入默认商品分类
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主进程与渲染进程通信
// 主进程 (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 本地服务器与前端通信
// 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 小票打印实现
// 打印服务
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. 项目交付物
- 可执行安装包: Windows平台安装程序
- 源代码: 完整的项目源代码
- 技术文档: 系统架构、API文档、数据库设计
- 用户手册: 安装指南、使用说明、常见问题
- 演示数据: 示例商品数据、测试账号
9. 后续扩展计划
- 移动端支持: 开发Android版本
- 会员系统: 会员管理、积分、储值功能
- 库存管理: 进销存管理、库存预警
- 多店连锁: 多门店数据同步、集中管理
- 云端备份: 本地数据云端备份与恢复
- 数据分析: 销售趋势分析、客户消费分析
本开发计划基于最小可行产品(MVP)原则,优先实现核心功能,确保系统稳定可靠,后续可根据实际使用情况逐步扩展功能。