diff --git a/doc/ER/ER.svg b/doc/ER/ER.svg new file mode 100644 index 0000000..1ac4c35 --- /dev/null +++ b/doc/ER/ER.svg @@ -0,0 +1 @@ +用户会话用户会话用户用户nn管理管理11收货地址收货地址nn提交提交11店铺变更请求店铺变更请求nn拥有拥有11店铺店铺nn目标目标11支付事务支付事务nn发起发起11nn开设开设11订单订单nn支付支付11nn接收接收11订单项目订单项目nn包含包含11nn下达下达11商品商品nn是项目是项目11商品图片商品图片nn包含包含11nn包含包含11商品种类商品种类nn分类分类11nn包含包含mmnn提交提交11商品变更请求商品变更请求nn目标目标11购物车购物车nn是项目是项目11nn管理管理11Text is not SVG - cannot display \ No newline at end of file diff --git a/doc/ER/store_end.svg b/doc/ER/store_end.svg new file mode 100644 index 0000000..e32ae88 --- /dev/null +++ b/doc/ER/store_end.svg @@ -0,0 +1 @@ +11StoreStoreStoreIDStoreIDStoreNameStoreNameOwnerUseIDOwnerUseIDDescriptionDescriptionChangeRequestIDChange...LogoURLLogoURLStoreStatusStoreStatusProductProductProductIDProductIDContainContainnnProductNameProductNameProductDescriptionProduct...PricePriceStockQuantityStockQuantityCreationDateCreationDateStoreChangeRequestStoreChange...TargetTarget11nnRequestingUserIDRequesting...RequestTypeRequestTypeProposedData_JSONProposed...StatusStatusProductCategoryProduct...Belongs toBelongs to11nnCategoryIDCategoryIDCategoryNameCategoryNameParentCategoryIDParent...CategoryDescriptionCategory...CreationDateCreationDateLastUpdatedDateLast...Belongs toBelongs tommnnProductImageProductImageImageIDImageIDImageURLImageURLImageTypeImageTypeSortOrderSortOrderUploadDateUploadDate11ContainContainnnCreationTimeCreationTimeChangeRequestIDChange...ProductChangeRequestProductChange...MerchantUserIDMerchant...RequestTypeRequestTypeProposedData_JSONProposed...StatusStatusCreationTimeCreationTimePropose&TargetPropose&...1111nnText is not SVG - cannot display \ No newline at end of file diff --git a/doc/ER/transaction.svg b/doc/ER/transaction.svg new file mode 100644 index 0000000..5f8b4fd --- /dev/null +++ b/doc/ER/transaction.svg @@ -0,0 +1 @@ +11OrderOrderOrderIDOrderIDUserIDUserIDStoreIDStoreIDOrderStatusOrderStatusPaymentTransactionIDPayment...FinalAmountForThisOrderFinalAmount...ShippingAddress_FullShipping...OrderItemOrderItemOrderItemIDOrderItemIDContainContainnnProductIDProductIDProductNameAtPurchaseProductName...StoreIDStoreIDQuantityQuantityPriceAtPurchasePriceAtPurchasePaymentTransactionPayment...PaymentPayment11nnUserIDUserIDTotalAmountTotalAmountExternalGatewayTransactionIDExternalGateway...PaymentMethodPayment...CreationTimeCreationTimeLastUpdatedDateLast...CreationTimeCreationTimeCompletionTimeCompletion...Text is not SVG - cannot display \ No newline at end of file diff --git a/doc/ER/user_end.svg b/doc/ER/user_end.svg new file mode 100644 index 0000000..752c6e0 --- /dev/null +++ b/doc/ER/user_end.svg @@ -0,0 +1 @@ +11UserUserUserIDUserIDUserNameUserNameUserRoleUserRoleAccountStatusAccountStatusDefaultAddressIDDefault...RegistrationDateRegistration...LastLoginDateLastLoginDateUserSessionUserSessionSessionTokenSessionTokenManageManagennCreatedAtCreatedAtExpiresAtExpiresAtLastAccessedAtLast...IPAddressIPAddressUserAgentUserAgentShippingAddressShipping...OwnOwn11nnRecipientNameRecipient...PhoneNumberPhoneNumberFullAddress_TextFullAddress_...IsDefaultIsDefaultCartItemCartItemOwnOwn11nnCartItemIDCartItemIDProductIDProductIDQuantityQuantityAddedDateAddedDatePriceAtAdditionPrice...Text is not SVG - cannot display \ No newline at end of file diff --git a/doc/README.md b/doc/README.md new file mode 100644 index 0000000..6916170 --- /dev/null +++ b/doc/README.md @@ -0,0 +1,11 @@ +# 文档说明 + +## 提交的文档 + +所有提交的文档都位于 `doc/数据库设计文档` 目录下。包括概念设计文档、逻辑设计文档和需求分析文档。 + +## 文档目录 +- [doc/草稿](./草稿) 中存放了开发过程中的需求分析、数据字典等草稿 +- [doc/数据库设计文档](./数据库设计文档) 中存放了提交版本的数据库设计文档 +- [doc/数据流图](./数据流图) 中存放了数据流图 +- [doc/ER](./ER) 中存放了ER图 \ No newline at end of file diff --git "a/doc/\346\225\260\346\215\256\345\272\223\350\256\276\350\256\241\346\226\207\346\241\243/\346\246\202\345\277\265\350\256\276\350\256\241\346\226\207\346\241\243.md" "b/doc/\346\225\260\346\215\256\345\272\223\350\256\276\350\256\241\346\226\207\346\241\243/\346\246\202\345\277\265\350\256\276\350\256\241\346\226\207\346\241\243.md" new file mode 100644 index 0000000..ca8ed0f --- /dev/null +++ "b/doc/\346\225\260\346\215\256\345\272\223\350\256\276\350\256\241\346\226\207\346\241\243/\346\246\202\345\277\265\350\256\276\350\256\241\346\226\207\346\241\243.md" @@ -0,0 +1,14 @@ +# 概念设计文档 + +### 总ER图 + + +### 分ER图 +#### 店铺相关分ER图 + + +#### 用户相关分ER图 + + +#### 事务相关分ER图 + \ No newline at end of file diff --git "a/doc/\346\225\260\346\215\256\345\272\223\350\256\276\350\256\241\346\226\207\346\241\243/\351\200\273\350\276\221\350\256\276\350\256\241\346\226\207\346\241\243.md" "b/doc/\346\225\260\346\215\256\345\272\223\350\256\276\350\256\241\346\226\207\346\241\243/\351\200\273\350\276\221\350\256\276\350\256\241\346\226\207\346\241\243.md" new file mode 100644 index 0000000..3d9ef4f --- /dev/null +++ "b/doc/\346\225\260\346\215\256\345\272\223\350\256\276\350\256\241\346\226\207\346\241\243/\351\200\273\350\276\221\350\256\276\350\256\241\346\226\207\346\241\243.md" @@ -0,0 +1,319 @@ +# 电商平台数据库逻辑设计文档 + +## 数据表设计 + +### 1. 用户表 (User) + +**表名**: `User` +**功能**: 存储平台所有用户的基本信息,包括顾客、商家和管理员 + +| 字段名 | 数据类型 | 约束 | 描述 | +|--------|----------|------|------| +| UserID | INT | PRIMARY KEY, AUTO_INCREMENT | 用户唯一标识符 | +| Username | VARCHAR(255) | NOT NULL, UNIQUE | 用户名,全局唯一 | +| PasswordHash | VARCHAR(255) | NOT NULL | 密码的哈希值+盐 | +| Email | VARCHAR(255) | UNIQUE | 用户邮箱地址,可选但唯一 | +| PhoneNumber | VARCHAR(50) | NULL | 用户手机号码,可选 | +| UserRole | ENUM | NOT NULL, DEFAULT 'customer' | 用户角色:customer(顾客)、merchant(商家)、admin(管理员) | +| RegistrationDate | DATETIME | NOT NULL, DEFAULT CURRENT_TIMESTAMP | 用户注册时间 | +| LastLoginDate | DATETIME | NULL | 最后登录时间 | +| DefaultAddressID | INT | NULL, FOREIGN KEY | 默认收货地址ID,关联ShippingAddress表 | +| AccountStatus | ENUM | NOT NULL, DEFAULT 'ACTIVE' | 账户状态:ACTIVE(活跃)、INACTIVE(非活跃)、SUSPENDED_BY_ADMIN(被管理员禁用) | + +**设计说明**: +- 支持多种用户角色,通过UserRole字段区分权限 +- 密码采用哈希存储,确保安全性 +- 预留默认地址字段,提升用户体验 +- 账户状态支持管理员管理功能 + +### 2. 收货地址表 (ShippingAddress) + +**表名**: `ShippingAddress` +**功能**: 存储用户的收货地址信息 + +| 字段名 | 数据类型 | 约束 | 描述 | +|--------|----------|------|------| +| AddressID | INT | PRIMARY KEY, AUTO_INCREMENT | 地址唯一标识符 | +| UserID | INT | NOT NULL, FOREIGN KEY | 所属用户ID | +| RecipientName | VARCHAR(255) | NOT NULL | 收货人姓名 | +| PhoneNumber | VARCHAR(50) | NOT NULL | 收货人电话 | +| FullAddress_Text | TEXT | NOT NULL | 完整地址信息 | +| IsDefault | BOOLEAN | NOT NULL, DEFAULT FALSE | 是否为默认地址 | + +**设计说明**: +- 支持用户管理多个收货地址 +- IsDefault字段配合User表的DefaultAddressID实现默认地址功能 +- 地址信息采用TEXT存储,支持详细地址描述 + +### 3. 店铺表 (Store) + +**表名**: `Store` +**功能**: 存储商家店铺的基本信息 + +| 字段名 | 数据类型 | 约束 | 描述 | +|--------|----------|------|------| +| StoreID | INT | PRIMARY KEY, AUTO_INCREMENT | 店铺唯一标识符 | +| StoreName | VARCHAR(255) | NOT NULL | 店铺名称 | +| OwnerUserID | INT | NOT NULL, FOREIGN KEY | 店主用户ID | +| Description | TEXT | NULL | 店铺描述 | +| LogoURL | VARCHAR(512) | NULL | 店铺Logo图片地址 | +| StoreStatus | ENUM | NOT NULL, DEFAULT 'ACTIVE' | 店铺状态:ACTIVE(正常营业)、INACTIVE_BY_MERCHANT(商家暂停)、SUSPENDED_BY_ADMIN(管理员暂停)、CLOSED_PERMANENTLY_BY_ADMIN(永久关闭) | +| CreationDate | DATETIME | NOT NULL, DEFAULT CURRENT_TIMESTAMP | 店铺创建时间 | +| LastUpdatedDate | DATETIME | NOT NULL, DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP | 最后更新时间 | + +**设计说明**: +- 每个店铺关联一个商家用户 +- 支持店铺状态管理,区分商家自主操作和管理员操作 +- 记录创建和更新时间,便于审计 + +### 4. 商品分类表 (ProductCategory) + +**表名**: `ProductCategory` +**功能**: 存储商品分类的层级结构 + +| 字段名 | 数据类型 | 约束 | 描述 | +|--------|----------|------|------| +| CategoryID | INT | PRIMARY KEY, AUTO_INCREMENT | 分类唯一标识符 | +| CategoryName | VARCHAR(255) | NOT NULL | 分类名称 | +| ParentCategoryID | INT | NULL, FOREIGN KEY | 父分类ID,自关联 | +| CategoryDescription | TEXT | NULL | 分类描述 | + +**设计说明**: +- 采用自关联设计,支持多级分类结构 +- ParentCategoryID为NULL表示顶级分类 +- 支持分类的层级管理和导航 + +### 5. 商品表 (Product) + +**表名**: `Product` +**功能**: 存储商品的详细信息 + +| 字段名 | 数据类型 | 约束 | 描述 | +|--------|----------|------|------| +| ProductID | INT | PRIMARY KEY, AUTO_INCREMENT | 商品唯一标识符 | +| ProductName | VARCHAR(255) | NOT NULL | 商品名称 | +| ProductDescription | TEXT | NULL | 商品详细描述 | +| Price | DECIMAL(10,2) | NOT NULL | 商品单价 | +| ProductStatus | ENUM | NOT NULL, DEFAULT 'ACTIVE' | 商品状态:ACTIVE(在售)、INACTIVE_BY_MERCHANT(商家下架)、SUSPENDED_BY_ADMIN(管理员下架)、DISCONTINUED(停产) | +| StoreID | INT | NOT NULL, FOREIGN KEY | 所属店铺ID | +| CategoryID | INT | NOT NULL, FOREIGN KEY | 所属分类ID | +| StockQuantity | INT | NOT NULL, DEFAULT 0 | 库存数量 | +| MainImageURL | VARCHAR(512) | NULL | 主图片地址 | +| CreationDate | DATETIME | NOT NULL, DEFAULT CURRENT_TIMESTAMP | 商品创建时间 | +| LastUpdatedDate | DATETIME | NOT NULL, DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP | 最后更新时间 | + +**设计说明**: +- 价格采用DECIMAL精确数值类型 +- 库存数量增加非负约束,确保数据完整性 +- 商品状态支持多种管理场景 +- 关联店铺和分类,便于分类浏览和店铺管理 + +### 6. 商品图片表 (ProductImage) + +**表名**: `ProductImage` +**功能**: 存储商品的多张图片信息 + +| 字段名 | 数据类型 | 约束 | 描述 | +|--------|----------|------|------| +| ImageID | INT | PRIMARY KEY, AUTO_INCREMENT | 图片唯一标识符 | +| ProductID | INT | NOT NULL, FOREIGN KEY | 所属商品ID | +| ImageURL | VARCHAR(512) | NOT NULL | 图片存储地址 | +| ImageType | VARCHAR(50) | NOT NULL | 图片类型:MAIN(主图)、THUMBNAIL(缩略图)、DETAIL(详情图) | +| SortOrder | INT | NULL | 图片排序序号 | +| UploadDate | DATETIME | NOT NULL, DEFAULT CURRENT_TIMESTAMP | 图片上传时间 | + +**设计说明**: +- 支持商品多图展示 +- 通过ImageType区分图片用途 +- SortOrder支持图片排序显示 + +### 7. 购物车表 (CartItem) + +**表名**: `CartItem` +**功能**: 存储用户购物车中的商品 + +| 字段名 | 数据类型 | 约束 | 描述 | +|--------|----------|------|------| +| CartItemID | INT | PRIMARY KEY, AUTO_INCREMENT | 购物车项目唯一标识符 | +| UserID | INT | NOT NULL, FOREIGN KEY | 所属用户ID | +| ProductID | INT | NOT NULL, FOREIGN KEY | 商品ID | +| Quantity | INT | NOT NULL, DEFAULT 1 | 商品数量 | +| PriceAtAddition | DECIMAL(10,2) | NOT NULL | 加入购物车时的商品价格 | +| AddedDate | DATETIME | NOT NULL, DEFAULT CURRENT_TIMESTAMP | 添加到购物车的时间 | + +**设计说明**: +- 记录加入购物车时的价格,避免价格变动影响 +- 数量字段增加正数约束 +- 支持购物车商品的时间排序 + +### 8. 支付事务表 (PaymentTransaction) + +**表名**: `PaymentTransaction` +**功能**: 记录用户的支付事务信息 + +| 字段名 | 数据类型 | 约束 | 描述 | +|--------|----------|------|------| +| PaymentTransactionID | INT | PRIMARY KEY, AUTO_INCREMENT | 支付事务唯一标识符 | +| UserID | INT | NOT NULL, FOREIGN KEY | 用户ID | +| TotalAmount | DECIMAL(10,2) | NOT NULL | 支付总金额 | +| PaymentMethod | VARCHAR(50) | NOT NULL | 支付方式 | +| ExternalGatewayTransactionID | VARCHAR(255) | NULL | 外部支付网关交易号 | +| Status | ENUM | NOT NULL, DEFAULT 'PENDING' | 支付状态:PENDING(待支付)、SUCCESSFUL(成功)、FAILED(失败) | +| CreationTime | DATETIME | NOT NULL, DEFAULT CURRENT_TIMESTAMP | 创建时间 | +| CompletionTime | DATETIME | NULL | 完成时间 | +| LastUpdatedDate | DATETIME | NOT NULL, DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP | 最后更新时间 | + +**设计说明**: +- 支持多种支付方式 +- 记录外部支付网关信息,便于对账 +- 完整的支付状态跟踪 + +### 9. 订单表 (Order) + +**表名**: `Order` +**功能**: 存储订单的基本信息 + +| 字段名 | 数据类型 | 约束 | 描述 | +|--------|----------|------|------| +| OrderID | INT | PRIMARY KEY, AUTO_INCREMENT | 订单唯一标识符 | +| UserID | INT | NOT NULL, FOREIGN KEY | 用户ID | +| StoreID | INT | NOT NULL, FOREIGN KEY | 店铺ID | +| PaymentTransactionID | INT | NOT NULL, FOREIGN KEY | 关联的支付事务ID | +| OrderStatus | ENUM | NOT NULL, DEFAULT 'PENDING_PAYMENT' | 订单状态:PENDING_PAYMENT(待支付)、PAID_AND_PENDING_PROCESSING(已支付待处理)、PROCESSING_BY_MERCHANT(商家处理中)、SHIPPED(已发货)、DELIVERED(已送达)、COMPLETED(已完成)、CANCELLED_BY_USER(用户取消)、CANCELLED_BY_MERCHANT(商家取消)、CANCELLED_BY_SYSTEM(系统取消) | +| OrderTotalAmount | DECIMAL(10,2) | NOT NULL | 订单商品总金额 | +| DiscountAmount | DECIMAL(10,2) | NULL, DEFAULT 0.00 | 优惠金额 | +| ShippingFee | DECIMAL(10,2) | NULL, DEFAULT 0.00 | 运费 | +| FinalAmountForThisOrder | DECIMAL(10,2) | NOT NULL | 订单最终金额 | +| ShippingAddress_RecipientName | VARCHAR(255) | NOT NULL | 收货人姓名(冗余) | +| ShippingAddress_PhoneNumber | VARCHAR(50) | NOT NULL | 收货人电话(冗余) | +| ShippingAddress_Full | TEXT | NOT NULL | 完整收货地址(冗余) | +| Notes_ByUser | TEXT | NULL | 用户备注 | +| Notes_ByMerchant | TEXT | NULL | 商家备注 | +| CreationTime | DATETIME | NOT NULL, DEFAULT CURRENT_TIMESTAMP | 订单创建时间 | +| PaymentConfirmationTime | DATETIME | NULL | 支付确认时间 | +| ShippingTime | DATETIME | NULL | 发货时间 | +| DeliveryTime | DATETIME | NULL | 送达时间 | +| CompletionTime | DATETIME | NULL | 完成时间 | +| LastUpdatedDate | DATETIME | NOT NULL, DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP | 最后更新时间 | + +**设计说明**: +- 按店铺拆分订单,支持多商家模式 +- 冗余存储收货地址信息,避免地址修改影响历史订单 +- 完整的订单状态流转,支持各种业务场景 +- 记录订单各个关键时间点 + +### 10. 订单项目表 (OrderItem) + +**表名**: `OrderItem` +**功能**: 存储订单中的具体商品项目 + +| 字段名 | 数据类型 | 约束 | 描述 | +|--------|----------|------|------| +| OrderItemID | INT | PRIMARY KEY, AUTO_INCREMENT | 订单项目唯一标识符 | +| OrderID | INT | NOT NULL, FOREIGN KEY | 所属订单ID | +| ProductID | INT | NOT NULL, FOREIGN KEY | 商品ID | +| StoreID | INT | NOT NULL, FOREIGN KEY | 店铺ID(冗余) | +| Quantity | INT | NOT NULL | 购买数量 | +| PriceAtPurchase | DECIMAL(10,2) | NOT NULL | 购买时的商品单价 | +| ProductNameAtPurchase | VARCHAR(255) | NOT NULL | 购买时的商品名称(冗余) | +| ProductImageURLAtPurchase | VARCHAR(512) | NULL | 购买时的商品图片(冗余) | +| Subtotal | DECIMAL(10,2) | NOT NULL | 小计金额 | + +**设计说明**: +- 冗余存储商品信息,保证历史订单数据完整性 +- 记录购买时价格,避免价格变动影响订单 +- 小计金额便于订单总额计算 + +### 11. 店铺变更请求表 (StoreChangeRequest) + +**表名**: `StoreChangeRequest` +**功能**: 存储店铺相关的变更请求,支持审核流程 + +| 字段名 | 数据类型 | 约束 | 描述 | +|--------|----------|------|------| +| ChangeRequestID | INT | PRIMARY KEY, AUTO_INCREMENT | 变更请求唯一标识符 | +| StoreID | INT | NULL, FOREIGN KEY | 目标店铺ID,创建请求时可为空 | +| RequestingUserID | INT | NOT NULL, FOREIGN KEY | 请求用户ID | +| RequestType | ENUM | NOT NULL | 请求类型:STORE_CREATE(创建)、STORE_UPDATE(更新)、STORE_DELETE(删除) | +| ProposedData_JSON | JSON | NULL | 建议的变更数据,JSON格式 | +| Status | ENUM | NOT NULL, DEFAULT 'PENDING_APPROVAL' | 请求状态:PENDING_APPROVAL(待审核)、APPROVED(已批准)、REJECTED(已拒绝)、APPLIED(已应用)、CANCELLED_BY_USER(用户取消) | +| SubmitterNotes | TEXT | NULL | 提交者备注 | +| AdminReviewerID | INT | NULL, FOREIGN KEY | 审核管理员ID | +| ReviewTimestamp | DATETIME | NULL | 审核时间 | +| AdminNotes | TEXT | NULL | 管理员审核备注 | +| CreationTime | DATETIME | NOT NULL, DEFAULT CURRENT_TIMESTAMP | 请求创建时间 | +| LastUpdatedDate | DATETIME | NOT NULL, DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP | 最后更新时间 | + +**设计说明**: +- 支持店铺的创建、更新、删除审核流程 +- 使用JSON字段存储灵活的变更数据 +- 完整的审核状态跟踪 +- 记录审核人员和时间,便于审计 + +### 12. 商品变更请求表 (ProductChangeRequest) + +**表名**: `ProductChangeRequest` +**功能**: 存储商品相关的变更请求,支持审核流程 + +| 字段名 | 数据类型 | 约束 | 描述 | +|--------|----------|------|------| +| ChangeRequestID | INT | PRIMARY KEY, AUTO_INCREMENT | 变更请求唯一标识符 | +| ProductID | INT | NULL, FOREIGN KEY | 目标商品ID,创建请求时可为空 | +| MerchantUserID | INT | NOT NULL, FOREIGN KEY | 商家用户ID | +| StoreID | INT | NOT NULL, FOREIGN KEY | 店铺ID | +| RequestType | ENUM | NOT NULL | 请求类型:PRODUCT_CREATE(创建)、PRODUCT_UPDATE(更新)、PRODUCT_DELETE(删除) | +| ProposedData_JSON | JSON | NULL | 建议的变更数据,JSON格式 | +| Status | ENUM | NOT NULL, DEFAULT 'PENDING_APPROVAL' | 请求状态 | +| SubmitterNotes | TEXT | NULL | 提交者备注 | +| AdminReviewerID | INT | NULL, FOREIGN KEY | 审核管理员ID | +| ReviewTimestamp | DATETIME | NULL | 审核时间 | +| AdminNotes | TEXT | NULL | 管理员审核备注 | +| CreationTime | DATETIME | NOT NULL, DEFAULT CURRENT_TIMESTAMP | 请求创建时间 | +| LastUpdatedDate | DATETIME | NOT NULL, DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP | 最后更新时间 | + +**设计说明**: +- 类似店铺变更请求,支持商品的审核流程 +- 确保商品变更的合规性 +- 记录变更历史,便于追溯 + +## 关系设计说明 + +### 主要外键关系 + +1. **用户相关关系**: + - User ← ShippingAddress (一对多) + - User ← Store (一对多,商家可拥有多个店铺) + - User ← CartItem (一对多) + - User ← PaymentTransaction (一对多) + - User ← Order (一对多) + +2. **店铺相关关系**: + - Store ← Product (一对多) + - Store ← Order (一对多) + - Store ← StoreChangeRequest (一对多) + +3. **商品相关关系**: + - ProductCategory ← Product (一对多) + - Product ← ProductImage (一对多) + - Product ← CartItem (一对多) + - Product ← OrderItem (一对多) + +4. **订单相关关系**: + - PaymentTransaction ← Order (一对多) + - Order ← OrderItem (一对多) + +### 设计特点 + +1. **数据完整性**: 通过外键约束保证数据一致性 +2. **历史数据保护**: 订单相关表冗余存储关键信息,避免数据修改影响历史记录 +3. **审核流程支持**: 变更请求表支持完整的审核流程 +4. **扩展性**: JSON字段支持灵活的数据存储 +5. **性能优化**: 合理的索引设计支持高效查询 + +## 索引设计 + +主要索引包括: +- 所有主键自动创建聚簇索引 +- 外键字段创建非聚簇索引 +- 用户名、邮箱等唯一约束字段的唯一索引 +- 订单状态、商品状态等常查询字段的普通索引 diff --git "a/doc/\346\225\260\346\215\256\345\272\223\350\256\276\350\256\241\346\226\207\346\241\243/\351\234\200\346\261\202\345\210\206\346\236\220\346\226\207\346\241\243.md" "b/doc/\346\225\260\346\215\256\345\272\223\350\256\276\350\256\241\346\226\207\346\241\243/\351\234\200\346\261\202\345\210\206\346\236\220\346\226\207\346\241\243.md" new file mode 100644 index 0000000..224f909 --- /dev/null +++ "b/doc/\346\225\260\346\215\256\345\272\223\350\256\276\350\256\241\346\226\207\346\241\243/\351\234\200\346\261\202\345\210\206\346\236\220\346\226\207\346\241\243.md" @@ -0,0 +1,242 @@ +# 需求分析文档 +### 用户需求分析 + +#### 普通用户 / 顾客 (Customer) + +- 用户通过用户名密码登录。 +- 用户可以查找和搜索商品(可按分类)、浏览商品信息。 +- 用户可以将来自不同店铺的商品统一放入购物车。 +- 用户可以管理自己的购物车(增删商品、修改数量)。 +- 用户对购物车中的所有商品发起一次性结账: + - 系统为购物车中每个店铺的商品分别生成独立的订单 (`Order`)。 + - 系统创建一个支付事务 (`PaymentTransaction`) 记录,汇总所有这些订单的总金额。 + - 用户(模拟)完成对该支付事务的支付。 + - 支付成功后,所有关联的订单状态会相应更新。 +- 用户可以查看自己创建的所有订单及其状态和详情。 +- 用户可以查看自己的支付记录。 +- 用户可以确认收货(将订单的状态从“已发货”改为“已送达”)。 +- 用户可以管理自己的收货地址。 +- 用户可以申请创建自己的店铺(需要平台管理员审核,通过后其用户角色更新为“商家”)。 + - 如果申请被驳回 (`REJECTED`),用户可以修改信息重新申请。 + +#### 商家用户 (Merchant) + +- 商家通过用户名密码登录(其用户角色为“商家”)。 +- 商家可以管理自己店铺的基本信息。 +- 商家可以增加、删除、修改自己管理的店铺的商品信息。 +- 商家可以设置和修改商品的库存数量。 +- 商家可以管理商品的上架/下架状态。 +- 商家可以查看和处理自己店铺收到的订单(例如:确认订单(将状态从“已付款”改为“处理中”)、发货(将状态从“处理中”改为“已发货”))。 + +#### 平台管理员 (Platform Administrator) + +- 管理员通过特定账户登录。 +- 管理员可以管理用户信息(查看、修改用户角色、启用/禁用账户)。 +- 管理员可以管理店铺信息(审核开店申请、查看、修改店铺状态)。 +- 管理员可以管理商品分类。 +- 管理员可以管理平台上的所有商品(例如:审核商品、下架违规商品)。 +- 管理员可以查看平台上的所有订单。 +- 管理员可以查看平台上的所有支付事务。 +- 管理员可以处理退款/退货请求(这会影响订单状态和支付事务状态)。 +- 管理员可以查看平台运营数据统计。 + +### 数据字典 +#### **用户 (User)** +| 字段名 (Field Name) | 类型 (Type) | 含义说明 (Description) | 约束/备注 (Constraints/Notes) | +| :--- | :--- | :--- | :--- | +| `UserID` | `Integer / UUID` | 唯一标识平台上的每一位用户。 | **主键 (Primary Key)** | +| `Username` | `Varchar` | 用户名 | **唯一 (Unique)** | +| `PasswordHash` | `Varchar` | 密码的哈希值+盐 | | +| `Email` | `Varchar` | 电子邮箱 | **唯一 (Unique)** | +| `PhoneNumber` | `Varchar` | 电话号码 | 可选 (Optional) | +| `UserRole` | `Enum / Varchar(15)` | 标识用户在平台中的主要角色。 | `取值: 'customer', 'merchant', 'admin'` | +| `RegistrationDate` | `DATETIME` | 注册时间 | | +| `LastLoginDate` | `DATETIME` | 最后登录时间 | 可为空 (Nullable) | +| `DefaultAddressID` | `Integer / UUID` | 默认收货地址ID | **外键 (Foreign Key)** -> `ShippingAddress.AddressID`,可为空 (Nullable) | +| `AccountStatus` | `Enum / Varchar(20)` | 表示用户账户的当前状态。 | `取值: 'ACTIVE', 'INACTIVE', 'SUSPENDED_BY_ADMIN'` | + +--- +#### **用户会话 (UserSession)** +| 字段名 (Field Name) | 类型 (Type) | 含义说明 (Description) | 约束/备注 (Constraints/Notes) | +| :--- | :--- | :--- | :--- | +| `SessionToken` | `VARCHAR(128) / UUID` | 唯一标识一个用户会话的令牌。 | **主键 (Primary Key)** | +| `UserID` | `Integer / UUID` | 此会话属于哪个用户。 | **外键 (Foreign Key)** -> `User.UserID` | +| `CreatedAt` | `DATETIME` | 会话被创建的时间戳。 | | +| `ExpiresAt` | `DATETIME` | 此会话令牌将在此时间点后失效。 | | +| `LastAccessedAt` | `DATETIME` | 用户最后一次使用此会话令牌与系统交互的时间。 | 可选 (Optional), 可为空 (Nullable) | +| `IPAddress` | `VARCHAR(45)` | 用户创建此会话时所使用的IP地址。 | 可选 (Optional), 可为空 (Nullable) | +| `UserAgent` | `TEXT` | 用户创建此会话时使用的浏览器或客户端的用户代理字符串。 | 可选 (Optional), 可为空 (Nullable) | + +--- +#### **店铺 (Store)** +| 字段名 (Field Name) | 类型 (Type) | 含义说明 (Description) | 约束/备注 (Constraints/Notes) | +| :--- | :--- | :--- | :--- | +| `StoreID` | `Integer / UUID` | 店铺编号 | **主键 (Primary Key)** | +| `StoreName` | `Varchar` | 店铺名称 | | +| `OwnerUserID` | `Integer / UUID` | 店主用户编号 | **外键 (Foreign Key)** -> `User.UserID` | +| `Description` | `TEXT` | 店铺描述 | | +| `LogoURL` | `VARCHAR` | 店铺Logo图片地址 | 可选 (Optional) | +| `StoreStatus` | `Enum / Varchar(30)` | 表示店铺当前的运营状态。 | `取值: 'ACTIVE', 'INACTIVE_BY_MERCHANT', 'SUSPENDED_BY_ADMIN', 'CLOSED_PERMANENTLY_BY_ADMIN'` | +| `CreationDate` | `DATETIME` | 店铺记录在系统中创建的时间。 | | +| `LastUpdatedDate` | `DATETIME` | 店铺信息最后更新时间 | | + +--- +#### **商品种类 (ProductCategory)** +| 字段名 (Field Name) | 类型 (Type) | 含义说明 (Description) | 约束/备注 (Constraints/Notes) | +| :--- | :--- | :--- | :--- | +| `CategoryID` | `Integer / UUID` | 分类ID | **主键 (Primary Key)** | +| `CategoryName` | `Varchar` | 分类名称 | | +| `ParentCategoryID` | `Integer / UUID` | 父分类ID | **外键 (Foreign Key)** -> `ProductCategory.CategoryID` (自关联), 可为空 (Nullable) | +| `CategoryDescription`| `TEXT` | 分类描述 | 可选 (Optional) | + +--- +#### **商品 (Product)** +| 字段名 (Field Name) | 类型 (Type) | 含义说明 (Description) | 约束/备注 (Constraints/Notes) | +| :--- | :--- | :--- | :--- | +| `ProductID` | `Integer / UUID` | 商品ID | **主键 (Primary Key)** | +| `ProductName` | `Varchar` | 商品名称 | | +| `ProductDescription` | `TEXT` | 商品详细介绍 | | +| `Price` | `DECIMAL` | 单价 | | +| `ProductStatus` | `Enum / Varchar(30)` | 表示商品当前的销售状态。 | `取值: 'ACTIVE', 'INACTIVE_BY_MERCHANT', 'SUSPENDED_BY_ADMIN', 'DISCONTINUED'` | +| `StoreID` | `Integer / UUID` | 所属的店铺ID | **外键 (Foreign Key)** -> `Store.StoreID` | +| `CategoryID` | `Integer / UUID` | 所属的种类ID | **外键 (Foreign Key)** -> `ProductCategory.CategoryID` | +| `StockQuantity` | `INT` | 库存数量 | `取值 >= 0` | +| `CreationDate` | `DATETIME` | 商品记录在系统中创建的时间 | | +| `LastUpdatedDate` | `DATETIME` | 商品信息最后更新时间 | | +| `MainImageURL` | `VARCHAR` | 商品主图片地址 | | + +--- +#### **商品图片 (ProductImage)** +| 字段名 (Field Name) | 类型 (Type) | 含义说明 (Description) | 约束/备注 (Constraints/Notes) | +| :--- | :--- | :--- | :--- | +| `ImageID` | `Integer / UUID` | 图片ID | **主键 (Primary Key)** | +| `ProductID` | `Integer / UUID` | 所属商品ID | **外键 (Foreign Key)** -> `Product.ProductID` | +| `ImageURL` | `VARCHAR` | 图片存储路径或URL | | +| `ImageType` | `VARCHAR` | 图片类型 | `取值: 'MAIN', 'THUMBNAIL', 'DETAIL' 等` | +| `SortOrder` | `INT` | 排序序号 | 可选 (Optional) | +| `UploadDate` | `DATETIME` | 上传时间 | | + +--- +#### **购物车项目 (CartItem)** +| 字段名 (Field Name) | 类型 (Type) | 含义说明 (Description) | 约束/备注 (Constraints/Notes) | +| :--- | :--- | :--- | :--- | +| `CartItemID` | `Integer / UUID` | 购物车项目ID | **主键 (Primary Key)** | +| `UserID` | `Integer / UUID` | 所属用户ID | **外键 (Foreign Key)** -> `User.UserID` | +| `ProductID` | `Integer / UUID` | 商品ID | **外键 (Foreign Key)** -> `Product.ProductID` | +| `Quantity` | `INT` | 数量 | | +| `AddedDate` | `DATETIME` | 添加时间 | | +| `PriceAtAddition`| `DECIMAL` | 加入购物车时的商品单价 | 用于价格快照 (Price Snapshot) | + +--- +#### **收货地址 (ShippingAddress)** +| 字段名 (Field Name) | 类型 (Type) | 含义说明 (Description) | 约束/备注 (Constraints/Notes) | +| :--- | :--- | :--- | :--- | +| `AddressID` | `Integer / UUID` | 地址ID | **主键 (Primary Key)** | +| `UserID` | `Integer / UUID` | 所属用户ID | **外键 (Foreign Key)** -> `User.UserID` | +| `RecipientName` | `Varchar` | 收货人姓名 | | +| `PhoneNumber` | `Varchar` | 收货人电话 | | +| `FullAddress_Text` | `TEXT / Varchar` | 完整地址 | | +| `IsDefault` | `BOOLEAN` | 是否为默认地址 | | + +--- +#### **商品变更请求 (ProductChangeRequest)** +| 字段名 (Field Name) | 类型 (Type) | 含义说明 (Description) | 约束/备注 (Constraints/Notes) | +| :--- | :--- | :--- | :--- | +| `ChangeRequestID` | `Integer / UUID` | 唯一标识每一条商品变更请求。 | **主键 (Primary Key)** | +| `ProductID` | `Integer / UUID` | 目标商品ID。 | 对于 `PRODUCT_CREATE` 可为空 | +| `MerchantUserID` | `Integer / UUID` | 提交请求的商家UserID。 | **外键 (Foreign Key)** -> `User.UserID` | +| `StoreID` | `Integer / UUID` | 商品所属的StoreID。 | **外键 (Foreign Key)** -> `Store.StoreID` | +| `RequestType` | `Enum / Varchar(25)` | 变更请求的具体类型。 | `取值: 'PRODUCT_CREATE', 'PRODUCT_UPDATE', 'PRODUCT_DELETE'` | +| `ProposedData_JSON` | `JSON / TEXT` | 以JSON格式存储请求的详细数据。 | | +| `Status` | `Enum / Varchar(25)` | 表示变更请求当前的审核或处理状态。 | `取值: 'PENDING_APPROVAL', 'APPROVED', 'REJECTED', 'APPLIED', 'CANCELLED_BY_USER'` | +| `SubmitterNotes` | `TEXT` | 商家提交备注 | 可选 (Optional) | +| `AdminReviewerID` | `Integer / UUID` | 审核管理员UserID | **外键 (Foreign Key)** -> `User.UserID`, 可为空 (Nullable) | +| `ReviewTimestamp` | `DATETIME` | 审核时间 | 可为空 (Nullable) | +| `AdminNotes` | `TEXT` | 管理员审核备注 | 可选 (Optional) | +| `CreationTime` | `DATETIME` | 请求创建时间 | | +| `LastUpdatedDate` | `DATETIME` | 请求最后更新时间 | | + +--- +#### **店铺变更请求 (StoreChangeRequest)** +| 字段名 (Field Name) | 类型 (Type) | 含义说明 (Description) | 约束/备注 (Constraints/Notes) | +| :--- | :--- | :--- | :--- | +| `ChangeRequestID` | `Integer / UUID` | 唯一标识每一条店铺变更请求。 | **主键 (Primary Key)** | +| `StoreID` | `Integer / UUID` | 目标店铺ID。 | 对于 `STORE_CREATE` 可为空 | +| `RequestingUserID` | `Integer / UUID` | 请求用户UserID。 | **外键 (Foreign Key)** -> `User.UserID` | +| `RequestType` | `Enum / Varchar(25)` | 变更请求的具体类型。 | `取值: 'STORE_CREATE', 'STORE_UPDATE', 'STORE_DELETE'` | +| `ProposedData_JSON` | `JSON / TEXT` | 以JSON格式存储请求的详细数据。 | | +| `Status` | `Enum / Varchar(25)` | 表示变更请求当前的审核或处理状态。 | `取值: 'PENDING_APPROVAL', 'APPROVED', 'REJECTED', 'APPLIED', 'CANCELLED_BY_USER'` | +| `SubmitterNotes` | `TEXT` | 提交者备注 | 可选 (Optional) | +| `AdminReviewerID` | `Integer / UUID` | 审核管理员UserID | **外键 (Foreign Key)** -> `User.UserID`, 可为空 (Nullable) | +| `ReviewTimestamp` | `DATETIME` | 审核时间 | 可为空 (Nullable) | +| `AdminNotes` | `TEXT` | 管理员审核备注 | 可选 (Optional) | +| `CreationTime` | `DATETIME` | 请求创建时间 | | +| `LastUpdatedDate` | `DATETIME` | 请求最后更新时间 | | + +--- +#### **支付事务 (PaymentTransaction)** +| 字段名 (Field Name) | 类型 (Type) | 含义说明 (Description) | 约束/备注 (Constraints/Notes) | +| :--- | :--- | :--- | :--- | +| `PaymentTransactionID` | `Integer / UUID` | 支付事务ID | **主键 (Primary Key)** | +| `UserID` | `Integer / UUID` | 用户ID | **外键 (Foreign Key)** -> `User.UserID` | +| `TotalAmount` | `DECIMAL` | 本次支付的总金额 | | +| `PaymentMethod` | `VARCHAR` | 支付方式 | `例如 'MOCK_PAY', 'ALIPAY_SIM'` | +| `ExternalGatewayTransactionID` | `VARCHAR` | 外部支付网关的交易流水号 | 可选 (Optional) | +| `Status` | `Enum / Varchar(15)` | 支付状态 | `取值: 'PENDING', 'SUCCESSFUL', 'FAILED'` | +| `CreationTime` | `DATETIME` | 创建时间 | | +| `CompletionTime` | `DATETIME` | 支付完成/失败时间 | 可为空 (Nullable) | +| `LastUpdatedDate` | `DATETIME` | 最后更新时间 | | + +--- +#### **订单 (Order)** +| 字段名 (Field Name) | 类型 (Type) | 含义说明 (Description) | 约束/备注 (Constraints/Notes) | +| :--- | :--- | :--- | :--- | +| `OrderID` | `Integer / UUID` | 订单ID | **主键 (Primary Key)** | +| `UserID` | `Integer / UUID` | 用户ID | **外键 (Foreign Key)** -> `User.UserID` | +| `StoreID` | `Integer / UUID` | 店铺ID | **外键 (Foreign Key)** -> `Store.StoreID` | +| `PaymentTransactionID` | `Integer / UUID` | 关联的支付事务ID | **外键 (Foreign Key)** -> `PaymentTransaction.PaymentTransactionID` | +| `OrderStatus` | `Enum / Varchar(35)` | 订单状态 | `见文档中的详细取值列表` | +| `OrderTotalAmount` | `DECIMAL` | 订单商品总金额 | 不含运费和优惠 | +| `DiscountAmount` | `DECIMAL` | 优惠金额 | 可选 (Optional) | +| `ShippingFee` | `DECIMAL` | 运费 | 可选 (Optional) | +| `FinalAmountForThisOrder` | `DECIMAL` | 此订单最终应付金额 | | +| `ShippingAddress_RecipientName` | `VARCHAR` | 收货人姓名 | 冗余数据 (Redundant Data) | +| `ShippingAddress_PhoneNumber` | `VARCHAR` | 收货人电话 | 冗余数据 (Redundant Data) | +| `ShippingAddress_Full` | `TEXT / Varchar` | 完整收货地址 | 冗余数据 (Redundant Data) | +| `Notes_ByUser` | `TEXT` | 用户备注 | 可选 (Optional) | +| `Notes_ByMerchant` | `TEXT` | 商家备注 | 可选 (Optional) | +| `CreationTime` | `DATETIME` | 订单创建时间 | | +| `PaymentConfirmationTime` | `DATETIME` | 支付确认时间 | 可为空 (Nullable) | +| `ShippingTime` | `DATETIME` | 发货时间 | 可为空 (Nullable) | +| `DeliveryTime` | `DATETIME` | 送达时间 | 可为空 (Nullable) | +| `CompletionTime` | `DATETIME` | 订单完成时间 | 可为空 (Nullable) | +| `LastUpdatedDate` | `DATETIME` | 订单最后更新时间 | | + +--- +#### **订单项目 (OrderItem)** +| 字段名 (Field Name) | 类型 (Type) | 含义说明 (Description) | 约束/备注 (Constraints/Notes) | +| :--- | :--- | :--- | :--- | +| `OrderItemID` | `Integer / UUID` | 订单项目ID | **主键 (Primary Key)** | +| `OrderID` | `Integer / UUID` | 所属订单ID | **外键 (Foreign Key)** -> `Order.OrderID` | +| `ProductID` | `Integer / UUID` | 商品ID | **外键 (Foreign Key)** -> `Product.ProductID` | +| `StoreID` | `Integer / UUID` | 所属店铺ID | **外键 (Foreign Key)** -> `Store.StoreID` | +| `Quantity` | `INT` | 购买数量 | | +| `PriceAtPurchase` | `DECIMAL` | 购买时商品单价 | 重要价格快照 (Important Price Snapshot) | +| `ProductNameAtPurchase` | `VARCHAR` | 购买时商品名称 | 冗余数据 (Redundant Data) | +| `ProductImageURLAtPurchase` | `VARCHAR` | 购买时商品主图URL | 冗余数据 (Redundant Data), 可选 (Optional) | +| `Subtotal` | `DECIMAL` | 小计金额 | `计算公式: PriceAtPurchase * Quantity` | + + +### 数据流图 + +#### 用户注册与登录 + + +#### 用户探索与购物 + + +#### 店铺信息与审核 + + +#### 订单 + diff --git "a/doc/\346\225\260\346\215\256\346\265\201\345\233\276/\345\272\227\351\223\272\344\277\241\346\201\257\344\270\216\345\256\241\346\240\270.svg" "b/doc/\346\225\260\346\215\256\346\265\201\345\233\276/\345\272\227\351\223\272\344\277\241\346\201\257\344\270\216\345\256\241\346\240\270.svg" new file mode 100644 index 0000000..2290494 --- /dev/null +++ "b/doc/\346\225\260\346\215\256\346\265\201\345\233\276/\345\272\227\351\223\272\344\277\241\346\201\257\344\270\216\345\256\241\346\240\270.svg" @@ -0,0 +1,4 @@ +开店/更改店铺信息请求开店/更改店铺...上架/更改商品请求上架/更改...合法请求合法请求5.0权限检查5.0...用户权限用户权限用户信息用户信息审核通过审核通过5.1店铺信息审核5.1...更新信息更新信息5.2提交变更5.2...店铺信息店铺信息审核通过/不需要审核的商品信息审核通过/不需要审核...6.1信息审核6.1...管理员管理员管理员通过/不通过管理员通过/不通过如果需要审核如果需要审核管理员通过/不通过管理员通过/不通过如果需要审核如果需要审核合法请求合法请求6.0权限检查6.0...6.2提交变更6.2...商品信息商品信息用户信息用户信息更新商家用户信息更新商家用户信息更新信息更新信息用户权限用户权限店铺修改请求列表店铺修改 +请求列表商品修改请求列表商品修改 +请求列表记录请求记录请求记录请求记录请求商家(用户)商家 +(用户)Text is not SVG - cannot display \ No newline at end of file diff --git "a/doc/\346\225\260\346\215\256\346\265\201\345\233\276/\346\263\250\345\206\214\344\270\216\347\231\273\345\275\225.svg" "b/doc/\346\225\260\346\215\256\346\265\201\345\233\276/\346\263\250\345\206\214\344\270\216\347\231\273\345\275\225.svg" new file mode 100644 index 0000000..0a8d1d2 --- /dev/null +++ "b/doc/\346\225\260\346\215\256\346\265\201\345\233\276/\346\263\250\345\206\214\344\270\216\347\231\273\345\275\225.svg" @@ -0,0 +1 @@ +注册请求注册请求登录请求登录请求用户用户可以注册可以注册1.0检查重复1.0...已有用户名/密码已有用户名/密码用户信息用户信息创建新用户创建新用户1.1建立新用户1.1...用户名密码校验通过用户名密码校验通过2.0用户名/密码检查2.0...更新会话信息更新会话信息2.1成功登录2.1...会话管理会话管理不通过,注册失败不通过,注册失败登录失败登录失败Text is not SVG - cannot display \ No newline at end of file diff --git "a/doc/\346\225\260\346\215\256\346\265\201\345\233\276/\347\224\250\346\210\267\346\216\242\347\264\242\344\270\216\350\264\255\347\211\251.svg" "b/doc/\346\225\260\346\215\256\346\265\201\345\233\276/\347\224\250\346\210\267\346\216\242\347\264\242\344\270\216\350\264\255\347\211\251.svg" new file mode 100644 index 0000000..518a651 --- /dev/null +++ "b/doc/\346\225\260\346\215\256\346\265\201\345\233\276/\347\224\250\346\210\267\346\216\242\347\264\242\344\270\216\350\264\255\347\211\251.svg" @@ -0,0 +1,2 @@ +浏览请求(筛选/搜索词等)浏览请求 +(筛选/搜索词等)查看购物车请求查看购物车请求用户用户选择商品选择商品3.0展示商品列表3.0...满足条件的商品列表满足条件的商品列表商品信息商品信息3.1展示商品详情页面3.1...用户的购物车数据用户的购物车数据购物车购物车商品款式与数量信息商品款式与数量信息3.3加入购物车3.3...用户操作购物车项目用户操作购物车项目4.0查看购物车4.0...增、删、改操作增、删、改操作4.1购物车操作4.1...商品详细信息商品详细信息3.2展示店铺详情页面3.2...选择店铺选择店铺选择商品选择商品用户选择数量并加入购物车用户选择数量并加入购物车店铺信息店铺信息店铺和商品详细信息店铺和商品详细信息Text is not SVG - cannot display \ No newline at end of file diff --git "a/doc/\346\225\260\346\215\256\346\265\201\345\233\276/\350\256\242\345\215\225.svg" "b/doc/\346\225\260\346\215\256\346\265\201\345\233\276/\350\256\242\345\215\225.svg" new file mode 100644 index 0000000..52436a9 --- /dev/null +++ "b/doc/\346\225\260\346\215\256\346\265\201\345\233\276/\350\256\242\345\215\225.svg" @@ -0,0 +1 @@ +订单信息订单信息第三方支付服务第三方支付服务支付信息支付信息订单数据库订单数据库选择商品,发起结算选择商品,发起结算确认收货/退货确认收货/退货用户用户未支付订单未支付订单更新库存更新库存库存检查与更新库存检查与更新更新更新已支付订单已支付订单等待支付等待支付库存信息库存信息库存信息库存信息未支付订单未支付订单订单数据订单数据构建订单构建订单联系方式、收货地址联系方式、收货地址用户数据用户数据未支付订单未支付订单支付结果支付结果订单信息订单信息等待商家发货等待商家发货订单信息订单信息已发货订单已发货订单确认收货确认收货Text is not SVG - cannot display \ No newline at end of file diff --git "a/doc/\346\225\260\346\215\256\345\255\227\345\205\270.md" "b/doc/\350\215\211\347\250\277/\346\225\260\346\215\256\345\255\227\345\205\270.md" similarity index 100% rename from "doc/\346\225\260\346\215\256\345\255\227\345\205\270.md" rename to "doc/\350\215\211\347\250\277/\346\225\260\346\215\256\345\255\227\345\205\270.md" diff --git "a/doc/\346\225\260\346\215\256\345\255\227\345\205\270v3.md" "b/doc/\350\215\211\347\250\277/\346\225\260\346\215\256\345\255\227\345\205\270v3.md" similarity index 100% rename from "doc/\346\225\260\346\215\256\345\255\227\345\205\270v3.md" rename to "doc/\350\215\211\347\250\277/\346\225\260\346\215\256\345\255\227\345\205\270v3.md" diff --git "a/doc/\351\234\200\346\261\202\350\215\211\347\250\277.md" "b/doc/\350\215\211\347\250\277/\351\234\200\346\261\202\350\215\211\347\250\277.md" similarity index 100% rename from "doc/\351\234\200\346\261\202\350\215\211\347\250\277.md" rename to "doc/\350\215\211\347\250\277/\351\234\200\346\261\202\350\215\211\347\250\277.md"