|
|
@@ -0,0 +1,213 @@
|
|
|
+# 商店限购功能优化
|
|
|
+
|
|
|
+## 任务概述
|
|
|
+
|
|
|
+根据用户需求,对商店系统的限购功能进行全面优化,实现:
|
|
|
+- 单次购买限制
|
|
|
+- 周期性购买数量限购(周/月/年/永久)
|
|
|
+- 灵活的限购配置管理
|
|
|
+
|
|
|
+## 实现内容
|
|
|
+
|
|
|
+### 1. 枚举类创建
|
|
|
+
|
|
|
+#### PURCHASE_LIMIT_PERIOD(限购周期枚举)
|
|
|
+- **文件位置**:`app/Module/Shop/Enums/PURCHASE_LIMIT_PERIOD.php`
|
|
|
+- **支持周期**:永久、每日、每周、每月、每年
|
|
|
+- **核心功能**:
|
|
|
+ - 获取下次重置时间
|
|
|
+ - 检查是否需要重置计数
|
|
|
+ - 周期类型名称获取
|
|
|
+
|
|
|
+#### PURCHASE_LIMIT_TYPE(限购类型枚举)
|
|
|
+- **文件位置**:`app/Module/Shop/Enums/PURCHASE_LIMIT_TYPE.php`
|
|
|
+- **支持类型**:单次购买限制、周期性购买限制
|
|
|
+- **功能描述**:提供限购类型的标准化定义
|
|
|
+
|
|
|
+### 2. 模型层扩展
|
|
|
+
|
|
|
+#### ShopPurchaseLimit(限购配置模型)
|
|
|
+- **文件位置**:`app/Module/Shop/Models/ShopPurchaseLimit.php`
|
|
|
+- **核心功能**:
|
|
|
+ - 管理限购规则配置
|
|
|
+ - 用户购买计数查询
|
|
|
+ - 限购验证逻辑
|
|
|
+ - 计数增加和重置
|
|
|
+
|
|
|
+#### ShopUserPurchaseCounter(用户购买计数模型)
|
|
|
+- **文件位置**:`app/Module/Shop/Models/ShopUserPurchaseCounter.php`
|
|
|
+- **核心功能**:
|
|
|
+ - 记录用户购买计数
|
|
|
+ - 自动重置过期计数
|
|
|
+ - 限制达成检查
|
|
|
+
|
|
|
+#### ShopItem模型扩展
|
|
|
+- **新增字段**:`max_single_buy`(单次购买限制)
|
|
|
+- **新增关联**:`purchaseLimits`、`activePurchaseLimits`
|
|
|
+- **新增方法**:
|
|
|
+ - `canUserPurchaseWithLimits()`:统一限购检查
|
|
|
+ - `updatePurchaseLimitCounters()`:更新限购计数
|
|
|
+
|
|
|
+### 3. 数据库结构
|
|
|
+
|
|
|
+#### 新增表
|
|
|
+
|
|
|
+**kku_shop_purchase_limits(限购配置表)**
|
|
|
+```sql
|
|
|
+CREATE TABLE `kku_shop_purchase_limits` (
|
|
|
+ `id` int unsigned NOT NULL AUTO_INCREMENT,
|
|
|
+ `shop_item_id` int unsigned NOT NULL,
|
|
|
+ `limit_type` tinyint NOT NULL,
|
|
|
+ `limit_period` tinyint NOT NULL DEFAULT '0',
|
|
|
+ `max_quantity` int NOT NULL,
|
|
|
+ `name` varchar(100) NOT NULL,
|
|
|
+ `description` text,
|
|
|
+ `is_active` tinyint(1) NOT NULL DEFAULT '1',
|
|
|
+ `sort_order` int NOT NULL DEFAULT '0',
|
|
|
+ `created_at` timestamp NULL DEFAULT NULL,
|
|
|
+ `updated_at` timestamp NULL DEFAULT NULL,
|
|
|
+ PRIMARY KEY (`id`),
|
|
|
+ KEY `shop_purchase_limits_shop_item_id_index` (`shop_item_id`),
|
|
|
+ CONSTRAINT `shop_purchase_limits_shop_item_id_foreign` FOREIGN KEY (`shop_item_id`) REFERENCES `kku_shop_items` (`id`) ON DELETE CASCADE
|
|
|
+);
|
|
|
+```
|
|
|
+
|
|
|
+**kku_shop_user_purchase_counters(用户购买计数表)**
|
|
|
+```sql
|
|
|
+CREATE TABLE `kku_shop_user_purchase_counters` (
|
|
|
+ `id` int unsigned NOT NULL AUTO_INCREMENT,
|
|
|
+ `limit_id` int unsigned NOT NULL,
|
|
|
+ `user_id` int unsigned NOT NULL,
|
|
|
+ `current_count` int NOT NULL DEFAULT '0',
|
|
|
+ `last_reset_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
|
|
+ `created_at` timestamp NULL DEFAULT NULL,
|
|
|
+ `updated_at` timestamp NULL DEFAULT NULL,
|
|
|
+ PRIMARY KEY (`id`),
|
|
|
+ UNIQUE KEY `shop_user_purchase_counters_limit_user_unique` (`limit_id`, `user_id`),
|
|
|
+ CONSTRAINT `shop_user_purchase_counters_limit_id_foreign` FOREIGN KEY (`limit_id`) REFERENCES `kku_shop_purchase_limits` (`id`) ON DELETE CASCADE
|
|
|
+);
|
|
|
+```
|
|
|
+
|
|
|
+#### 修改表
|
|
|
+
|
|
|
+**kku_shop_items表新增字段**
|
|
|
+```sql
|
|
|
+ALTER TABLE `kku_shop_items`
|
|
|
+ADD COLUMN `max_single_buy` int NOT NULL DEFAULT '0' COMMENT '单次最大购买数量(0表示无限制)' AFTER `max_buy`;
|
|
|
+```
|
|
|
+
|
|
|
+### 4. 验证逻辑优化
|
|
|
+
|
|
|
+#### ShopBuyLimitValidator更新
|
|
|
+- **文件位置**:`app/Module/Shop/Validators/ShopBuyLimitValidator.php`
|
|
|
+- **优化内容**:
|
|
|
+ - 使用新的统一限购检查方法
|
|
|
+ - 简化验证逻辑
|
|
|
+ - 提供更准确的错误信息
|
|
|
+
|
|
|
+#### BuyHandler更新
|
|
|
+- **文件位置**:`app/Module/AppGame/Handler/Shop/BuyHandler.php`
|
|
|
+- **新增功能**:
|
|
|
+ - 购买成功后更新限购计数
|
|
|
+ - 支持多种限购规则的计数更新
|
|
|
+
|
|
|
+### 5. 后台管理功能
|
|
|
+
|
|
|
+#### ShopPurchaseLimitRepository(数据仓库)
|
|
|
+- **文件位置**:`app/Module/Shop/Repositorys/ShopPurchaseLimitRepository.php`
|
|
|
+- **核心功能**:
|
|
|
+ - 限购配置的CRUD操作
|
|
|
+ - 批量查询优化
|
|
|
+ - 状态切换管理
|
|
|
+
|
|
|
+#### ShopPurchaseLimitController(控制器)
|
|
|
+- **文件位置**:`app/Module/Shop/Controllers/ShopPurchaseLimitController.php`
|
|
|
+- **管理功能**:
|
|
|
+ - 限购配置管理
|
|
|
+ - 批量状态切换
|
|
|
+ - 配置复制功能
|
|
|
+
|
|
|
+#### ShopItemRepository更新
|
|
|
+- **文件位置**:`app/Module/Shop/Repositorys/ShopItemRepository.php`
|
|
|
+- **新增功能**:
|
|
|
+ - 商品选择选项获取
|
|
|
+ - 支持限购配置快速跳转
|
|
|
+
|
|
|
+### 6. 文档和说明
|
|
|
+
|
|
|
+#### 功能说明文档
|
|
|
+- **文件位置**:`app/Module/Shop/Docs/商店限购功能优化说明.md`
|
|
|
+- **内容包含**:
|
|
|
+ - 功能概述和使用说明
|
|
|
+ - 数据库结构说明
|
|
|
+ - 代码示例和最佳实践
|
|
|
+ - 性能优化建议
|
|
|
+
|
|
|
+## 核心特性
|
|
|
+
|
|
|
+### 1. 灵活的限购配置
|
|
|
+- 支持多种限购类型和周期
|
|
|
+- 可为单个商品配置多个限购规则
|
|
|
+- 支持规则优先级和状态管理
|
|
|
+
|
|
|
+### 2. 自动计数管理
|
|
|
+- 自动检测和重置过期计数
|
|
|
+- 支持不同周期的计数重置
|
|
|
+- 高效的批量查询优化
|
|
|
+
|
|
|
+### 3. 向后兼容
|
|
|
+- 保持与现有`max_buy`字段的兼容
|
|
|
+- 不影响现有购买流程
|
|
|
+- 渐进式功能升级
|
|
|
+
|
|
|
+### 4. 性能优化
|
|
|
+- 批量查询减少数据库访问
|
|
|
+- 智能计数重置机制
|
|
|
+- 索引优化提升查询效率
|
|
|
+
|
|
|
+## 使用示例
|
|
|
+
|
|
|
+### 设置单次购买限制
|
|
|
+```php
|
|
|
+$shopItem = ShopItem::find(1);
|
|
|
+$shopItem->max_single_buy = 5; // 单次最多购买5个
|
|
|
+$shopItem->save();
|
|
|
+```
|
|
|
+
|
|
|
+### 创建周期性限购
|
|
|
+```php
|
|
|
+ShopPurchaseLimit::create([
|
|
|
+ 'shop_item_id' => 1,
|
|
|
+ 'limit_type' => PURCHASE_LIMIT_TYPE::PERIODIC_PURCHASE,
|
|
|
+ 'limit_period' => PURCHASE_LIMIT_PERIOD::DAILY,
|
|
|
+ 'max_quantity' => 3,
|
|
|
+ 'name' => '每日限购',
|
|
|
+ 'is_active' => true,
|
|
|
+]);
|
|
|
+```
|
|
|
+
|
|
|
+### 检查购买限制
|
|
|
+```php
|
|
|
+list($canPurchase, $errorMessage, $remainingQuantity) =
|
|
|
+ $shopItem->canUserPurchaseWithLimits($userId, $quantity);
|
|
|
+```
|
|
|
+
|
|
|
+## 部署说明
|
|
|
+
|
|
|
+### 1. 数据库迁移
|
|
|
+执行以下SQL文件:
|
|
|
+- `app/Module/Shop/Databases/GenerateSql/modify_shop_items_add_single_buy_limit.sql`
|
|
|
+- `app/Module/Shop/Databases/GenerateSql/shop_purchase_limits.sql`
|
|
|
+- `app/Module/Shop/Databases/GenerateSql/shop_user_purchase_counters.sql`
|
|
|
+
|
|
|
+### 2. 后台路由配置
|
|
|
+需要添加限购配置管理的路由和菜单项。
|
|
|
+
|
|
|
+### 3. 权限配置
|
|
|
+为相关用户分配限购配置管理权限。
|
|
|
+
|
|
|
+## 总结
|
|
|
+
|
|
|
+本次优化成功实现了商店系统的高级限购功能,提供了灵活、强大且易于管理的限购解决方案。新功能完全向后兼容,不影响现有业务流程,同时为未来的业务需求提供了良好的扩展性。
|
|
|
+
|
|
|
+通过合理的数据库设计、优化的查询逻辑和完善的管理界面,新的限购系统能够满足各种复杂的业务场景需求。
|