feat: 商品详情页、XLS导入修复、分页选择器、导出功能
后端: - 新增 product_images 表,支持每商品最多5张图(服务端压缩至1200px/JPEG85%) - products 表新增 public_id(UUID)、description 字段 - 新增商品详情接口、二维码接口、公开商品接口(无鉴权) - 修复 XLS 导入:OLE2 magic bytes 检测 + 临时文件解析,兼容 extrame/xls - 修复商品/名称/系列/规格三张表导入数据为0(LastCol()=0 bug) - 所有导入接口返回 total/imported/skipped 统计 - config 新增 StorageConfig,支持 STORAGE_* 环境变量覆盖 - 种子数据修复:products 补 public_id、新增 product_images TRUNCATE、schema.sql 表名修正 前端: - 商品详情页:图片上传/删除、描述内联编辑、二维码弹窗、公开链接复制 - 公开商品页:无鉴权路由 /product/:public_id,Flutter Web SPA - 商品详情列表(批次追踪)商品名超链接跳转详情页 - 导航「商品管理」改名「商品详情」 - 所有列表表格新增每页条数选择(10/20/50/100) - 表格列头内嵌筛选(FilterableColumnHeader) - 导出 Excel 功能(入库/出库/库存/财务/批次/往来单位) - 网络恢复自动刷新 + 离线缓存展示 Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
@@ -102,7 +102,9 @@ CREATE TABLE IF NOT EXISTS `products` (
|
||||
`brand` VARCHAR(100) DEFAULT NULL COMMENT '品牌',
|
||||
`purchase_price` DECIMAL(16,2) DEFAULT NULL COMMENT '参考进价',
|
||||
`sale_price` DECIMAL(16,2) DEFAULT NULL COMMENT '参考售价',
|
||||
`public_id` CHAR(36) NOT NULL DEFAULT '' COMMENT 'UUID,公开URL使用',
|
||||
`min_stock` INT DEFAULT 0 COMMENT '库存预警值',
|
||||
`description` TEXT DEFAULT NULL COMMENT '商品描述',
|
||||
`custom_fields` JSON DEFAULT NULL COMMENT '动态扩展字段',
|
||||
`remark` VARCHAR(500) DEFAULT NULL,
|
||||
`created_at` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
||||
@@ -113,9 +115,25 @@ CREATE TABLE IF NOT EXISTS `products` (
|
||||
KEY `idx_category` (`category_id`),
|
||||
KEY `idx_deleted_at` (`deleted_at`),
|
||||
UNIQUE KEY `uk_product_code` (`shop_id`, `code`),
|
||||
UNIQUE KEY `uk_public_id` (`public_id`),
|
||||
FULLTEXT KEY `ft_name` (`name`)
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='商品';
|
||||
|
||||
-- ------------------------------------------------------------
|
||||
-- 商品图片
|
||||
-- ------------------------------------------------------------
|
||||
CREATE TABLE IF NOT EXISTS `product_images` (
|
||||
`id` BIGINT UNSIGNED NOT NULL AUTO_INCREMENT,
|
||||
`product_id` BIGINT UNSIGNED NOT NULL,
|
||||
`shop_id` BIGINT UNSIGNED NOT NULL,
|
||||
`url` VARCHAR(500) NOT NULL COMMENT '相对路径,如 /images/products/1/xxx.jpg',
|
||||
`sort_order` INT NOT NULL DEFAULT 0,
|
||||
`created_at` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
||||
PRIMARY KEY (`id`),
|
||||
KEY `idx_product_id` (`product_id`),
|
||||
KEY `idx_shop_id` (`shop_id`)
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='商品图片';
|
||||
|
||||
-- ------------------------------------------------------------
|
||||
-- 仓库
|
||||
-- ------------------------------------------------------------
|
||||
@@ -146,6 +164,7 @@ CREATE TABLE IF NOT EXISTS `partners` (
|
||||
`phone` VARCHAR(30) DEFAULT NULL,
|
||||
`address` VARCHAR(255) DEFAULT NULL,
|
||||
`bank_account` VARCHAR(100) DEFAULT NULL COMMENT '银行账号',
|
||||
`status` ENUM('enabled','disabled') NOT NULL DEFAULT 'enabled' COMMENT '正常/禁用',
|
||||
`custom_fields` JSON DEFAULT NULL,
|
||||
`remark` VARCHAR(500) DEFAULT NULL,
|
||||
`created_at` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
||||
@@ -255,7 +274,7 @@ CREATE TABLE IF NOT EXISTS `stock_out_items` (
|
||||
-- ------------------------------------------------------------
|
||||
-- 库存(实时)
|
||||
-- ------------------------------------------------------------
|
||||
CREATE TABLE IF NOT EXISTS `inventory` (
|
||||
CREATE TABLE IF NOT EXISTS `inventories` (
|
||||
`id` BIGINT UNSIGNED NOT NULL AUTO_INCREMENT,
|
||||
`shop_id` BIGINT UNSIGNED NOT NULL,
|
||||
`warehouse_id` BIGINT UNSIGNED NOT NULL,
|
||||
@@ -358,4 +377,50 @@ CREATE TABLE IF NOT EXISTS `number_rules` (
|
||||
UNIQUE KEY `uk_shop_type` (`shop_id`, `type`)
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='单号规则';
|
||||
|
||||
-- ------------------------------------------------------------
|
||||
-- 基础数据选项
|
||||
-- ------------------------------------------------------------
|
||||
CREATE TABLE IF NOT EXISTS `product_name_options` (
|
||||
`id` BIGINT UNSIGNED NOT NULL AUTO_INCREMENT,
|
||||
`shop_id` BIGINT UNSIGNED NOT NULL,
|
||||
`code` VARCHAR(50) DEFAULT NULL COMMENT '选项编号',
|
||||
`name` VARCHAR(200) NOT NULL COMMENT '名称',
|
||||
`remark` VARCHAR(500) DEFAULT NULL,
|
||||
`created_at` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
||||
`updated_at` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
|
||||
`deleted_at` DATETIME DEFAULT NULL,
|
||||
PRIMARY KEY (`id`),
|
||||
KEY `idx_shop_id` (`shop_id`),
|
||||
KEY `idx_deleted_at` (`deleted_at`)
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='商品名称选项';
|
||||
|
||||
CREATE TABLE IF NOT EXISTS `product_series_options` (
|
||||
`id` BIGINT UNSIGNED NOT NULL AUTO_INCREMENT,
|
||||
`shop_id` BIGINT UNSIGNED NOT NULL,
|
||||
`code` VARCHAR(50) DEFAULT NULL COMMENT '选项编号',
|
||||
`name` VARCHAR(200) NOT NULL COMMENT '系列名称',
|
||||
`remark` VARCHAR(500) DEFAULT NULL,
|
||||
`created_at` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
||||
`updated_at` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
|
||||
`deleted_at` DATETIME DEFAULT NULL,
|
||||
PRIMARY KEY (`id`),
|
||||
KEY `idx_shop_id` (`shop_id`),
|
||||
KEY `idx_deleted_at` (`deleted_at`)
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='商品系列选项';
|
||||
|
||||
CREATE TABLE IF NOT EXISTS `product_spec_options` (
|
||||
`id` BIGINT UNSIGNED NOT NULL AUTO_INCREMENT,
|
||||
`shop_id` BIGINT UNSIGNED NOT NULL,
|
||||
`code` VARCHAR(50) DEFAULT NULL COMMENT '选项编号',
|
||||
`name` VARCHAR(200) NOT NULL COMMENT '规格名称',
|
||||
`quantity` INT DEFAULT 0 COMMENT '单品数量',
|
||||
`remark` VARCHAR(500) DEFAULT NULL,
|
||||
`created_at` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
||||
`updated_at` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
|
||||
`deleted_at` DATETIME DEFAULT NULL,
|
||||
PRIMARY KEY (`id`),
|
||||
KEY `idx_shop_id` (`shop_id`),
|
||||
KEY `idx_deleted_at` (`deleted_at`)
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='商品规格选项';
|
||||
|
||||
SET FOREIGN_KEY_CHECKS = 1;
|
||||
|
||||
Reference in New Issue
Block a user