Files
teapot_system/商品详情与订单页面设计文档.md

395 lines
21 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 铜壶管理系统 - 商品展示、详情与订单管理设计文档
## 1. 项目概述
本项目面向内部商品管理、销售下单与库房贴标场景,建设一套网页端铜壶管理系统。系统需要支持商品目录管理、款式展示、商品详情维护、订单创建、订单完成流转、标签按量导出、月度/年度统计分析,以及多用户登录和权限分级控制。
本次设计明确以下前提:
1. 采用前后端分离架构,前端独立部署,后端提供 API 服务。
2. 商品上传图片必须存入数据库,不直接依赖本地磁盘路径。
3. 标签文件下载由后端统一生成和输出。
4. 订单在填写快递单号前属于未完成状态,可编辑、可删除;填写快递单号并确认后才算完成。
5. 系统支持两类用户:管理员与普通用户;管理员拥有全量权限,普通用户权限由管理员创建和分配。
---
## 2. 设计原则
1. **前后端职责清晰**:前端负责页面展示、交互与状态管理;后端负责业务规则、数据持久化、文件处理、标签生成与统计计算。
2. **左侧目录常驻**:详情页不采用遮挡主界面的弹窗形式,而是采用系统内部独立详情路由,左侧目录固定保留。
3. **媒体数据统一管理**:图片采用数据库二进制存储,列表页与详情页通过独立接口读取缩略图或原图。
4. **订单闭环管理**:订单从加购、创建、编辑、完成、统计形成闭环,并保留详情追溯能力。
5. **权限前后端一致**:前端负责菜单、页面和按钮级可见性控制,后端负责接口级鉴权,避免仅前端隐藏导致越权。
6. **非商品类目可轻量处理**:如商标图片、宣传物料等类目可以不进入商品详情业务流程,仅提供预览或下载。
---
## 3. 总体架构设计
### 3.1 系统组成
系统拆分为三个核心层:
* **前端管理端**:负责登录页、权限菜单、目录树、商品卡片墙、商品详情编辑、订单列表、订单详情、统计报表、用户管理等页面。
* **后端服务端**:负责认证鉴权、用户管理、类目管理、商品管理、图片上传入库、订单流转、标签文件导出、统计报表接口。
* **数据库**:保存用户账号、权限数据、业务数据、订单数据、图片二进制内容、标签文件元数据及必要日志。
### 3.2 建议技术选型
为保证后续开发效率与维护性,建议采用以下技术栈:
* **前端**Vue 3 + Vite + Vue Router + Pinia + Element Plus
* **后端**Spring Boot + Spring Security + JWT + MyBatis-Plus + Spring Validation
* **数据库**SQLite 3
* **标签导出**:后端使用 PDF 模板生成库输出 PDF或按需打包 ZIP
### 3.3 部署方式
* 前端作为独立静态站点部署,可通过 Nginx 提供访问。
* 后端独立部署为 API 服务,对外提供 RESTful 接口。
* SQLite 作为本地数据库文件随同后端部署,统一负责业务表与图片二进制数据存储。
* 前端与后端通过 HTTP API 通信,不直接访问数据库。
* 为降低写入锁竞争,系统建议采用单机单实例部署,避免多节点同时写入同一个 SQLite 文件。
---
## 4. 页面信息架构与导航设计
### 4.1 页面布局
系统采用“左侧目录树 + 右侧主内容区 + 顶部功能区”的布局:
* **左侧目录树**:显示所有型号、类目以及对应款式子节点。
* **右侧主内容区**:根据当前路由显示款式墙、商品详情页、订单列表、订单详情或统计页面。
* **顶部功能区**:显示当前待下单商品数量、当前登录用户、退出登录入口;管理员可从顶部进入用户管理页面。
### 4.2 路由建议
建议前端至少包含以下页面路由:
* `/login`:登录页
* `/categories/:categoryId`:某个型号或类目的款式墙页面
* `/products/:productId`:某个款式的独立详情页
* `/orders`:订单列表页
* `/orders/:orderId`:订单详情页
* `/statistics`:统计分析页
* `/system/users`:用户管理页,仅管理员可访问
### 4.3 左侧目录交互规则
* 点击型号节点:右侧显示该型号下全部款式卡片。
* 点击款式子节点:右侧直接跳转到该产品详情页。
* 点击不需要详情页的类目:右侧显示素材列表、预览区或下载按钮,不进入商品业务详情页。
* 左侧目录支持新增、编辑、删除、排序。
* 某型号下的产品款式支持新增、编辑、删除,新增后自动同步到目录子节点。
### 4.4 权限展示规则
* 未登录用户只能访问登录页,不能直接进入业务页面。
* 登录后前端根据当前用户权限动态渲染菜单、页面入口和操作按钮。
* 管理员可见全部模块,包括商品管理、订单管理、统计和用户管理。
* 普通用户只显示已授权模块;即使手动输入地址,后端接口仍需再次校验权限。
---
## 5. 核心功能模块设计
### 5.1 用户登录与权限管理
系统需要支持多用户登录,并采用“管理员 + 普通用户”的两类用户模型:
* **管理员用户**:默认拥有全部页面查看、数据编辑、订单处理、统计查看、用户管理和权限分配能力。
* **普通用户**:账号由管理员创建,权限由管理员按需分配,不默认拥有全部功能。
* **登录方式**:采用用户名与密码登录,后端签发登录令牌,前端通过路由守卫校验登录状态。
* **用户管理**:管理员可以新增普通用户、编辑基础信息、重置密码、启用/停用账号、分配权限。
* **权限粒度**:至少区分页面访问权限与操作权限,例如商品查看、商品编辑、附件上传、订单查看、订单处理、订单完成、统计查看、用户管理。
* **典型普通用户示例**
* 客户用户:可浏览商品列表与商品详情,仅查看商品图片画廊,不展示基础资料与标签信息,不可编辑商品,不可处理订单。
* 打包工用户:可查看订单列表与订单详情,可处理未完成订单、填写快递单号并完成订单,可按需下载标签,不可编辑商品和用户。
### 5.2 左侧目录结构管理
目录管理模块需要满足以下能力:
* 支持多级树形结构,至少包含“型号/类目/款式”三级概念。
* 创建类目时必须配置 `requires_detail_page`,明确该类目是否进入商品详情流程。
* 标准商品类目进入商品管理流程;非标准类目进入素材预览/下载流程。
* 左侧目录支持实时刷新,确保新增产品后可直接点击进入详情页。
### 5.3 主界面:款式墙
当左侧选中某个需要详情页的型号或商品类目时,右侧显示该型号下的款式卡片墙:
* 卡片显示商品缩略图、款式名称、SKU、库存状态、批发价、库存数量。
* 状态标签区分为:可售、停产、库存多、库存少。
* 卡片右下角提供快捷加购按钮,点击后加入待下单列表。
* 点击卡片主体跳转到独立商品详情页。
* 支持搜索、按状态筛选、按名称筛选、分页或懒加载。
### 5.4 款式详情页
商品详情页采用**独立页面路由**,不是浏览器弹出窗口,也不是遮挡主界面的弹窗。进入详情页后,左侧目录继续保留,用户可以在目录与详情之间快速切换。
详情页需要支持以下编辑和展示能力:
* 基础信息型号、款式名称、SKU、批发价、库存数量、库存状态、备注。
* 图片管理:支持上传产品缩略图、原图和多张详情图;支持设置主图、调整顺序、删除图片。
* 原图下载:点击图片可下载数据库中保存的原图。
* 标签文件管理:支持上传标签模板文件,支持预览文件信息与重新上传。
* 下单操作:支持输入数量后加入订单。
建议详情页分为以下区域:
1. **基础资料区**:编辑 SKU、名称、价格、库存和状态。
2. **图片管理区**:上传缩略图、上传原图、多图列表、主图设置、拖拽调整图片顺序、原图下载。
3. **标签文件区**:上传标签模板、查看模板版本、下载模板。
4. **操作区**:保存、返回列表、加入订单。
权限补充要求:
* 只拥有商品查看权限的普通用户进入商品详情时,仅展示全部商品图片,不展示基础资料、标签信息以及原图/标签下载入口。
* 只有拥有商品编辑或附件管理权限的用户才可修改商品基础信息、上传图片和更新标签文件。
### 5.5 订单中心与订单列表页
订单模块从“类似购物车”的待下单中心演进为正式订单管理模块。
订单列表页需要包含:
* 全部订单
* 未完成订单
* 已完成订单
* 月度统计入口
* 年度统计入口
订单列表页功能要求:
* 展示订单编号、创建时间、商品款式数量合计、订单总价、订单状态、快递单号。
* 未完成订单允许继续编辑商品数量、删除商品、删除整单。
* 已完成订单默认只允许查看详情;管理员额外保留删除整单能力。
* 页面支持按订单状态、日期范围、关键词筛选。
* 无订单权限的用户不显示订单入口;只有拥有订单查看权限的用户才可访问订单列表。
### 5.6 订单详情页
订单详情页用于查看和处理单个订单的完整内容,需要单独页面展示,而不是仅在右侧侧边栏中查看。
订单详情页至少包含以下信息:
* 订单基础信息:订单号、创建时间、状态、快递单号、完成时间。
* 商品明细产品型号、款式名称、SKU、数量、单价、小计。
* 金额汇总:商品总数量、订单总价。
* 标签下载:从订单详情页统一触发,不再放在右侧订单摘要中。
订单详情页业务规则:
* 未完成订单:可编辑商品数量、删除商品、删除订单、填写快递单号。
* 已完成订单:信息只读,保留标签文件下载能力;管理员可删除整单。
* 点击“完成订单”前必须填写快递单号;填写成功后订单状态更新为已完成。
* 只有拥有订单处理权限的用户才可修改订单明细;只有拥有订单完成权限的用户才可填写快递单号并完成订单。
### 5.7 标签按量下载
标签下载是本系统的关键业务功能,必须由后端统一计算和输出:
* 系统读取订单中每个款式的购买数量。
* 按数量复制对应款式的标签模板内容。
* 输出为可打印的 PDF或按客户需求输出 ZIP 包。
* 标签下载入口放在订单详情页中,由用户针对单个订单执行。
### 5.8 月度与年度统计
统计页面需要支持月度与年度两个维度,并输出:
* 每款产品的销量数量
* 每款产品的单价
* 每款产品的小计金额
* 当前月份总销售额
* 当前年份总销售额
统计页面建议支持以下筛选条件:
* 年份
* 月份
* 型号/类目
* 款式名称或 SKU
* 建议仅管理员或拥有统计查看权限的用户访问
---
## 6. 媒体与附件存储设计
### 6.1 图片入库要求
根据本项目要求,商品图片必须存数据库,不依赖磁盘目录路径。建议采用“业务表 + 文件表分离”的方式:
* 商品表只保留业务字段和主图引用,不直接保存大体积二进制字段。
* 文件表单独保存图片二进制内容、缩略图二进制内容、文件元数据。
* 列表查询只返回文件 ID、文件名称和访问接口不在列表接口中直接返回 BLOB 内容。
* SQLite 附件表使用 BLOB 字段保存文件内容,建议控制单张图片大小并定期归档历史数据。
### 6.2 图片处理建议
* 上传原图后,由后端生成缩略图并一并入库。
* 前端列表页默认加载缩略图接口,详情页按需加载原图接口。
* 同一款式支持多图,需支持主图标识与排序。
* 建议对图片大小、格式进行限制,例如 JPG、PNG、WEBP单张不超过 10MB。
### 6.3 标签文件处理建议
标签文件可与图片共用统一附件表,通过 `file_role` 字段区分图片与标签模板:
* 图片文件:`COVER``DETAIL`
* 标签文件:`LABEL_TEMPLATE`
对于标签模板文件,建议保存文件元数据与二进制内容,便于后端统一生成导出内容与备份。
---
## 7. 关键数据模型建议
### 7.1 类目表 Category
* `id`:主键
* `parent_id`:父级类目 ID
* `name`:类目名称
* `sort_no`:排序号
* `requires_detail_page`:是否需要详情页
* `category_type`:类目类型,区分商品类目与素材类目
* `created_at`:创建时间
* `updated_at`:更新时间
### 7.2 商品表 ProductItem
* `id`:主键
* `category_id`:所属类目 ID
* `sku`:商品 SKU
* `name`:款式名称
* `model_name`:所属型号名称快照或冗余字段
* `status`:状态,建议值为 `AVAILABLE``DISCONTINUED``HIGH_STOCK``LOW_STOCK`
* `wholesale_price`:批发价格
* `stock_quantity`:库存数量
* `cover_asset_id`:主图附件 ID
* `remark`:备注
* `created_at`:创建时间
* `updated_at`:更新时间
### 7.3 附件表 FileAsset
* `id`:主键
* `business_type`:业务类型,如 `PRODUCT`
* `business_id`:业务对象 ID
* `file_role`:文件角色,如 `COVER``DETAIL``LABEL_TEMPLATE`
* `file_name`:文件名
* `mime_type`:文件类型
* `file_size`:文件大小
* `content_blob`:原始二进制内容
* `preview_blob`:缩略图或预览二进制内容
* `sort_no`:排序号
* `is_primary`:是否主图
* `sha256`:文件摘要
* `created_at`:创建时间
### 7.4 订单表 Order
* `id`:主键
* `order_no`:订单编号
* `status`:订单状态,建议值为 `PENDING``COMPLETED``CANCELLED`
* `total_quantity`:商品总数量
* `total_amount`:订单总金额
* `express_no`:快递单号
* `remark`:订单备注
* `created_at`:创建时间
* `completed_at`:完成时间
### 7.5 订单明细表 OrderItem
* `id`:主键
* `order_id`:订单 ID
* `product_id`:商品 ID
* `product_name_snapshot`:商品名称快照
* `sku_snapshot`SKU 快照
* `model_name_snapshot`:型号名称快照
* `unit_price`:下单时单价快照
* `quantity`:数量
* `line_amount`:小计金额
### 7.6 订单日志表 OrderOperationLog建议
* `id`:主键
* `order_id`:订单 ID
* `operation_type`:操作类型
* `operation_content`:操作内容
* `created_at`:操作时间
### 7.7 用户表 UserAccount
* `id`:主键
* `username`:登录账号
* `password_hash`:密码哈希值
* `display_name`:显示名称
* `user_type`:用户类型,建议值为 `ADMIN``NORMAL`
* `status`:账号状态,建议值为 `ENABLED``DISABLED`
* `last_login_at`:最近登录时间
* `created_by`:创建人 ID
* `created_at`:创建时间
* `updated_at`:更新时间
### 7.8 用户权限表 UserPermission
* `id`:主键
* `user_id`:用户 ID
* `permission_code`:权限编码,如 `PRODUCT_VIEW``PRODUCT_EDIT``ASSET_UPLOAD``ORDER_VIEW``ORDER_PROCESS``ORDER_COMPLETE``STATISTICS_VIEW``USER_MANAGE`
* `permission_name`:权限名称
* `created_at`:创建时间
说明:管理员默认拥有全量权限;普通用户通过权限表进行授权。
---
## 8. 接口规划建议
### 8.1 认证与用户接口
* `POST /api/auth/login`:用户名密码登录
* `POST /api/auth/logout`:退出登录
* `GET /api/auth/me`:获取当前登录用户及权限
* `GET /api/users`:分页查询用户列表,仅管理员可用
* `POST /api/users`:新增普通用户,仅管理员可用
* `PUT /api/users/{id}`:编辑用户基础信息,仅管理员可用
* `PUT /api/users/{id}/password`:重置用户密码,仅管理员可用
* `PUT /api/users/{id}/status`:启用或停用用户,仅管理员可用
* `PUT /api/users/{id}/permissions`:分配用户权限,仅管理员可用
### 8.2 类目接口
* `GET /api/categories/tree`:获取类目树
* `POST /api/categories`:新增类目
* `PUT /api/categories/{id}`:编辑类目
* `DELETE /api/categories/{id}`:删除类目
### 8.3 商品接口
* `GET /api/categories/{id}/products`:获取某类目下商品列表
* `GET /api/products/{id}`:获取商品详情
* `POST /api/products`:新增商品
* `PUT /api/products/{id}`:编辑商品
* `DELETE /api/products/{id}`:删除商品
### 8.4 附件接口
* `GET /api/products/{id}/assets`:获取商品附件元数据列表
* `POST /api/products/{id}/assets`:上传商品图片或标签文件
* `GET /api/products/{id}/assets/{assetId}/download`:获取原图或标签文件下载流
* `PUT /api/products/{id}/assets/{assetId}/primary`:将图片附件设为主图
* `PUT /api/products/{id}/assets/image-order`:按拖拽结果更新商品图片顺序
* `DELETE /api/products/{id}/assets/{assetId}`:删除附件
### 8.5 订单接口
* `POST /api/orders`:创建订单
* `GET /api/orders`:查询订单列表
* `GET /api/orders/{id}`:查询订单详情
* `PUT /api/orders/{id}`:编辑未完成订单
* `DELETE /api/orders/{id}`:删除未完成订单;管理员可删除已完成订单
* `POST /api/orders/{id}/complete`:填写快递单号并完成订单
* `GET /api/orders/{id}/labels/download`:按当前订单数量导出标签文件
### 8.6 统计接口
* `GET /api/statistics/monthly`:月度统计
* `GET /api/statistics/yearly`:年度统计
---
## 9. 关键业务规则
1. 所有业务接口默认要求登录后访问;登录成功后才能进入系统主界面。
2. 管理员用户拥有全部页面查看、数据编辑、订单处理、统计查看和用户管理权限。
3. 普通用户账号必须由管理员创建,权限必须由管理员分配;未授权功能默认不可访问。
4. 前端必须根据权限控制菜单、路由和按钮显示,后端必须同步校验接口权限,不能只依赖前端隐藏。
5. `requires_detail_page = false` 的类目不进入商品详情页,不要求维护价格、库存等业务字段。
6. 商品详情页必须支持直接上传图片和标签文件,并支持多图管理。
7. 只拥有商品查看权限的普通用户可以浏览商品详情,但不可编辑商品、上传附件或删除数据。
8. 停产商品默认不可直接加入订单;如需下单,应由后端做显式校验或弹出确认。
9. 下单数量不得超过库存数量,库存不足时必须提示并拦截。
10. 未完成订单允许编辑、删除;已完成订单默认只允许查看,但管理员可删除整单。
11. 只有拥有订单处理或订单完成权限的用户才可修改订单、填写快递单号并完成订单。
12. 标签下载入口统一放在订单详情页,不保留在右侧订单摘要中。
13. 统计页面仅管理员或拥有统计查看权限的用户可访问。
14. 统计数据建议基于订单明细快照字段计算,避免商品后续改价影响历史统计结果。
15. 所有附件列表接口默认只返回元数据,不直接返回数据库二进制内容。
---
## 10. 非功能要求
1. **性能**:商品列表与订单列表接口不得直接加载 BLOB 字段;图片通过独立接口按需读取。
2. **安全**:上传接口需校验文件类型、大小与权限;下载接口需校验访问权限;密码必须加密存储;登录接口需具备基础防暴力破解能力。
3. **稳定性**订单创建、订单完成、库存扣减等操作必须在事务中处理SQLite 建议启用 WAL 模式并控制并发写入。
4. **备份**:由于图片保存在 SQLite 数据库文件中,备份策略必须覆盖数据库主文件及其相关日志文件。
5. **可维护性**:接口统一返回结构,前后端统一错误码与提示文案。
---
## 11. 验收标准
1. 系统支持用户名密码登录,未登录状态不能直接进入业务页面。
2. 管理员用户可查看和编辑全部模块,并可进入用户管理页面。
3. 管理员可创建普通用户、重置密码、启用或停用账号,并分配权限。
4. 仅拥有商品查看权限的普通用户只能浏览商品列表和商品详情,不显示编辑、上传、删除按钮。
5. 拥有订单处理权限的打包工用户可查看订单、填写快递单号并完成订单,但不可编辑商品和用户。
6. 左侧目录支持类目与商品节点的新增、编辑、删除、跳转。
7. 商品卡片墙可正常展示缩略图、状态、价格、库存并支持快捷加购。
8. 商品详情页可编辑 SKU、价格、库存状态、库存数量并支持多图上传与标签文件上传。
9. 图片上传后保存在数据库中,刷新页面后仍可读取和下载原图。
10. 订单列表页支持全部、未完成、已完成筛选。
11. 未完成订单可编辑和删除;填写快递单号后可完成订单并转为只读。
12. 订单详情页可查看完整商品明细并执行标签按量下载。
13. 月度和年度统计页面能正确统计每款商品数量、单价、小计与总价。