重构动物模型和路由系统,优化查询逻辑并新增商户和促销活动功能

This commit is contained in:
ylweng
2025-09-22 02:04:07 +08:00
parent 5fc1a4fcb9
commit 47c816270d
54 changed files with 5384 additions and 4639 deletions

View File

@@ -253,49 +253,392 @@ erDiagram
```sql
CREATE TABLE users (
id INT PRIMARY KEY AUTO_INCREMENT COMMENT '用户ID',
openid VARCHAR(100) UNIQUE NOT NULL COMMENT '微信openid',
unionid VARCHAR(100) COMMENT '微信unionid',
nickname VARCHAR(50) NOT NULL COMMENT '用户昵称',
avatar VARCHAR(255) COMMENT '头像URL',
gender ENUM('male', 'female', 'unknown') DEFAULT 'unknown' COMMENT '性别',
birthday DATE COMMENT '生日',
phone VARCHAR(20) UNIQUE COMMENT '手机号码',
email VARCHAR(100) UNIQUE COMMENT '邮箱地址',
province VARCHAR(50) COMMENT '省份',
city VARCHAR(50) COMMENT '城市',
travel_count INT DEFAULT 0 COMMENT '旅行次数',
animal_claim_count INT DEFAULT 0 COMMENT '认领动物数量',
real_name VARCHAR(50) COMMENT '真实姓名',
nickname VARCHAR(50) COMMENT '用户昵称',
avatar_url VARCHAR(255) COMMENT '头像URL',
user_type ENUM('regular','vip','premium') DEFAULT 'regular' COMMENT '用户类型',
status ENUM('active','inactive','banned') DEFAULT 'active' COMMENT '用户状态',
balance DECIMAL(10,2) DEFAULT 0.00 COMMENT '账户余额',
points INT DEFAULT 0 COMMENT '积分',
level ENUM('bronze', 'silver', 'gold', 'platinum') DEFAULT 'bronze' COMMENT '用户等级',
status ENUM('active', 'inactive', 'banned') DEFAULT 'active' COMMENT '用户状态',
level INT DEFAULT 1 COMMENT '用户等级',
last_login_at TIMESTAMP COMMENT '最后登录时间',
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
deleted_at TIMESTAMP NULL COMMENT '删除时间',
INDEX idx_openid (openid),
INDEX idx_phone (phone),
INDEX idx_email (email),
INDEX idx_status (status),
INDEX idx_user_type (user_type),
INDEX idx_level (level),
INDEX idx_created_at (created_at)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='用户基础信息表';
```
#### 1.2 用户兴趣表 (user_interests)
#### 1.2 管理员表 (admins)
```sql
CREATE TABLE user_interests (
id INT PRIMARY KEY AUTO_INCREMENT COMMENT '兴趣ID',
CREATE TABLE admins (
id INT PRIMARY KEY AUTO_INCREMENT COMMENT '管理员ID',
username VARCHAR(50) UNIQUE NOT NULL COMMENT '用户名',
password VARCHAR(255) NOT NULL COMMENT '密码',
email VARCHAR(100) UNIQUE COMMENT '邮箱',
nickname VARCHAR(50) COMMENT '昵称',
avatar VARCHAR(255) COMMENT '头像',
role ENUM('super_admin','admin','editor') DEFAULT 'admin' COMMENT '角色',
status ENUM('active','inactive') DEFAULT 'active' COMMENT '状态',
last_login TIMESTAMP COMMENT '最后登录时间',
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
INDEX idx_username (username),
INDEX idx_email (email),
INDEX idx_role (role),
INDEX idx_status (status)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='管理员表';
```
### 2. 商家管理模块
#### 2.1 商家表 (merchants)
```sql
CREATE TABLE merchants (
id INT PRIMARY KEY AUTO_INCREMENT COMMENT '商家ID',
user_id INT NOT NULL COMMENT '关联用户ID',
name VARCHAR(100) NOT NULL COMMENT '商家名称',
description TEXT COMMENT '商家描述',
address VARCHAR(255) COMMENT '地址',
latitude DECIMAL(10,8) COMMENT '纬度',
longitude DECIMAL(11,8) COMMENT '经度',
contact_phone VARCHAR(20) COMMENT '联系电话',
business_hours VARCHAR(100) COMMENT '营业时间',
images JSON COMMENT '商家图片',
rating DECIMAL(3,2) DEFAULT 0.00 COMMENT '评分',
review_count INT DEFAULT 0 COMMENT '评价数量',
status ENUM('active','inactive','pending') DEFAULT 'pending' COMMENT '状态',
verified_at TIMESTAMP NULL COMMENT '认证时间',
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
FOREIGN KEY (user_id) REFERENCES users(id) ON DELETE CASCADE,
INDEX idx_user_id (user_id),
INDEX idx_status (status),
INDEX idx_rating (rating),
INDEX idx_location (latitude, longitude)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='商家信息表';
```
### 3. 动物认领模块
#### 3.1 动物表 (animals)
```sql
CREATE TABLE animals (
id INT PRIMARY KEY AUTO_INCREMENT COMMENT '动物ID',
name VARCHAR(50) NOT NULL COMMENT '动物名称',
type VARCHAR(30) NOT NULL COMMENT '动物类型',
breed VARCHAR(50) COMMENT '品种',
age INT COMMENT '年龄',
gender ENUM('male','female','unknown') DEFAULT 'unknown' COMMENT '性别',
description TEXT COMMENT '描述',
images JSON COMMENT '图片',
price DECIMAL(10,2) NOT NULL COMMENT '认领价格',
daily_cost DECIMAL(8,2) COMMENT '日常费用',
location VARCHAR(100) COMMENT '所在地',
farmer_id INT COMMENT '农场主ID',
status ENUM('available','claimed','unavailable') DEFAULT 'available' COMMENT '状态',
health_status VARCHAR(50) COMMENT '健康状态',
vaccination_records JSON COMMENT '疫苗记录',
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
deleted_at TIMESTAMP NULL COMMENT '删除时间',
FOREIGN KEY (farmer_id) REFERENCES users(id) ON DELETE SET NULL,
INDEX idx_farmer_id (farmer_id),
INDEX idx_type (type),
INDEX idx_status (status),
INDEX idx_price (price)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='动物信息表';
```
#### 3.2 动物认领表 (animal_claims)
```sql
CREATE TABLE animal_claims (
id INT PRIMARY KEY AUTO_INCREMENT COMMENT '认领ID',
animal_id INT NOT NULL COMMENT '动物ID',
user_id INT NOT NULL COMMENT '用户ID',
interest_name VARCHAR(50) NOT NULL COMMENT '兴趣名称',
interest_type ENUM('travel', 'food', 'sports', 'culture', 'nature') COMMENT '兴趣类型',
contact_info VARCHAR(100) COMMENT '联系信息',
status ENUM('pending','approved','rejected','cancelled') DEFAULT 'pending' COMMENT '状态',
reviewed_by INT COMMENT '审核人ID',
reviewed_at TIMESTAMP NULL COMMENT '审核时间',
review_note TEXT COMMENT '审核备注',
start_date DATE COMMENT '开始日期',
end_date DATE COMMENT '结束日期',
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
deleted_at TIMESTAMP NULL COMMENT '删除时间',
FOREIGN KEY (animal_id) REFERENCES animals(id) ON DELETE CASCADE,
FOREIGN KEY (user_id) REFERENCES users(id) ON DELETE CASCADE,
INDEX idx_animal_id (animal_id),
INDEX idx_user_id (user_id),
INDEX idx_status (status)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='动物认领表';
```
### 4. 旅行计划模块
#### 4.1 旅行计划表 (travel_plans)
```sql
CREATE TABLE travel_plans (
id INT PRIMARY KEY AUTO_INCREMENT COMMENT '计划ID',
title VARCHAR(100) NOT NULL COMMENT '计划标题',
destination VARCHAR(100) NOT NULL COMMENT '目的地',
description TEXT COMMENT '描述',
start_date DATE NOT NULL COMMENT '开始日期',
end_date DATE NOT NULL COMMENT '结束日期',
max_participants INT DEFAULT 10 COMMENT '最大参与人数',
current_participants INT DEFAULT 0 COMMENT '当前参与人数',
price_per_person DECIMAL(10,2) NOT NULL COMMENT '每人价格',
includes JSON COMMENT '包含项目',
excludes JSON COMMENT '不包含项目',
itinerary JSON COMMENT '行程安排',
images JSON COMMENT '图片',
requirements TEXT COMMENT '参与要求',
created_by INT NOT NULL COMMENT '创建者ID',
status ENUM('draft','published','cancelled','completed') DEFAULT 'draft' COMMENT '状态',
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
FOREIGN KEY (created_by) REFERENCES users(id) ON DELETE CASCADE,
INDEX idx_created_by (created_by),
INDEX idx_destination (destination),
INDEX idx_status (status),
INDEX idx_start_date (start_date)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='旅行计划表';
```
#### 4.2 旅行报名表 (travel_registrations)
```sql
CREATE TABLE travel_registrations (
id INT PRIMARY KEY AUTO_INCREMENT COMMENT '报名ID',
travel_plan_id INT NOT NULL COMMENT '旅行计划ID',
user_id INT NOT NULL COMMENT '用户ID',
participants INT DEFAULT 1 COMMENT '参与人数',
message TEXT COMMENT '留言',
emergency_contact VARCHAR(50) COMMENT '紧急联系人',
emergency_phone VARCHAR(20) COMMENT '紧急联系电话',
status ENUM('pending','approved','rejected','cancelled') DEFAULT 'pending' COMMENT '状态',
reject_reason TEXT COMMENT '拒绝原因',
applied_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP COMMENT '申请时间',
responded_at TIMESTAMP NULL COMMENT '响应时间',
FOREIGN KEY (travel_plan_id) REFERENCES travel_plans(id) ON DELETE CASCADE,
FOREIGN KEY (user_id) REFERENCES users(id) ON DELETE CASCADE,
INDEX idx_travel_plan_id (travel_plan_id),
INDEX idx_user_id (user_id),
INDEX idx_status (status)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='旅行报名表';
```
### 5. 花卉产品模块
#### 5.1 花卉表 (flowers)
```sql
CREATE TABLE flowers (
id INT PRIMARY KEY AUTO_INCREMENT COMMENT '花卉ID',
name VARCHAR(100) NOT NULL COMMENT '花卉名称',
scientific_name VARCHAR(100) COMMENT '学名',
category VARCHAR(50) COMMENT '分类',
color VARCHAR(30) COMMENT '颜色',
bloom_season VARCHAR(50) COMMENT '花期',
care_level ENUM('easy','medium','hard') DEFAULT 'medium' COMMENT '养护难度',
description TEXT COMMENT '描述',
care_instructions TEXT COMMENT '养护说明',
image VARCHAR(255) COMMENT '主图片',
images JSON COMMENT '图片集',
price DECIMAL(8,2) NOT NULL COMMENT '价格',
stock_quantity INT DEFAULT 0 COMMENT '库存数量',
farmer_id INT COMMENT '农场主ID',
status ENUM('available','out_of_stock','discontinued') DEFAULT 'available' COMMENT '状态',
seasonal_availability JSON COMMENT '季节性供应',
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
FOREIGN KEY (farmer_id) REFERENCES users(id) ON DELETE SET NULL,
INDEX idx_farmer_id (farmer_id),
INDEX idx_category (category),
INDEX idx_status (status),
INDEX idx_price (price)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='花卉产品表';
```
### 6. 订单管理模块
#### 6.1 订单表 (orders)
```sql
CREATE TABLE orders (
id INT PRIMARY KEY AUTO_INCREMENT COMMENT '订单ID',
order_number VARCHAR(32) UNIQUE NOT NULL COMMENT '订单号',
user_id INT NOT NULL COMMENT '用户ID',
total_amount DECIMAL(15,2) NOT NULL COMMENT '订单总金额',
status ENUM('pending','paid','shipped','delivered','cancelled','refunded') DEFAULT 'pending' COMMENT '订单状态',
payment_status ENUM('unpaid','paid','refunded','partial_refund') DEFAULT 'unpaid' COMMENT '支付状态',
payment_method VARCHAR(20) COMMENT '支付方式',
payment_time TIMESTAMP NULL COMMENT '支付时间',
shipping_address JSON COMMENT '收货地址',
contact_info JSON COMMENT '联系信息',
notes TEXT COMMENT '备注',
ordered_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP COMMENT '下单时间',
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
FOREIGN KEY (user_id) REFERENCES users(id) ON DELETE CASCADE,
INDEX idx_user_id (user_id),
INDEX idx_order_number (order_number),
INDEX idx_status (status),
INDEX idx_payment_status (payment_status)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='订单表';
```
#### 6.2 支付表 (payments)
```sql
CREATE TABLE payments (
id INT PRIMARY KEY AUTO_INCREMENT COMMENT '支付ID',
order_id INT NOT NULL COMMENT '订单ID',
user_id INT NOT NULL COMMENT '用户ID',
amount DECIMAL(15,2) NOT NULL COMMENT '支付金额',
payment_method ENUM('wechat','alipay','balance','points') NOT NULL COMMENT '支付方式',
status ENUM('pending','success','failed','cancelled','refunded') DEFAULT 'pending' COMMENT '支付状态',
transaction_id VARCHAR(100) COMMENT '交易流水号',
paid_amount DECIMAL(15,2) COMMENT '实际支付金额',
paid_at TIMESTAMP NULL COMMENT '支付时间',
FOREIGN KEY (order_id) REFERENCES orders(id) ON DELETE CASCADE,
FOREIGN KEY (user_id) REFERENCES users(id) ON DELETE CASCADE,
INDEX idx_order_id (order_id),
INDEX idx_user_id (user_id),
INDEX idx_status (status),
INDEX idx_transaction_id (transaction_id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='支付记录表';
```
#### 6.3 退款表 (refunds)
```sql
CREATE TABLE refunds (
id INT PRIMARY KEY AUTO_INCREMENT COMMENT '退款ID',
payment_id INT NOT NULL COMMENT '支付ID',
user_id INT NOT NULL COMMENT '用户ID',
refund_amount DECIMAL(15,2) NOT NULL COMMENT '退款金额',
refund_reason VARCHAR(255) NOT NULL COMMENT '退款原因',
status ENUM('pending','processing','completed','rejected') DEFAULT 'pending' COMMENT '退款状态',
processed_by INT COMMENT '处理人ID',
processed_at TIMESTAMP NULL COMMENT '处理时间',
process_remark TEXT COMMENT '处理备注',
refund_transaction_id VARCHAR(100) COMMENT '退款交易号',
refunded_at TIMESTAMP NULL COMMENT '退款完成时间',
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
deleted_at TIMESTAMP NULL COMMENT '删除时间',
FOREIGN KEY (payment_id) REFERENCES payments(id) ON DELETE CASCADE,
FOREIGN KEY (user_id) REFERENCES users(id) ON DELETE CASCADE,
INDEX idx_payment_id (payment_id),
INDEX idx_user_id (user_id),
INDEX idx_status (status)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='退款记录表';
```
### 7. 系统辅助表
#### 7.1 邮箱验证表 (email_verifications)
```sql
CREATE TABLE email_verifications (
id INT PRIMARY KEY AUTO_INCREMENT COMMENT '验证ID',
email VARCHAR(100) NOT NULL COMMENT '邮箱地址',
code VARCHAR(10) NOT NULL COMMENT '验证码',
type ENUM('register','reset_password','change_email') NOT NULL COMMENT '验证类型',
expires_at TIMESTAMP NOT NULL COMMENT '过期时间',
used_at TIMESTAMP NULL COMMENT '使用时间',
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
INDEX idx_email (email),
INDEX idx_code (code),
INDEX idx_expires_at (expires_at)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='邮箱验证表';
```
#### 7.2 密码重置表 (password_resets)
```sql
CREATE TABLE password_resets (
id INT PRIMARY KEY AUTO_INCREMENT COMMENT '重置ID',
user_id INT NOT NULL COMMENT '用户ID',
token VARCHAR(100) NOT NULL COMMENT '重置令牌',
expires_at TIMESTAMP NOT NULL COMMENT '过期时间',
used_at TIMESTAMP NULL COMMENT '使用时间',
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
FOREIGN KEY (user_id) REFERENCES users(id) ON DELETE CASCADE,
UNIQUE KEY uk_user_interest (user_id, interest_name),
INDEX idx_user_id (user_id),
INDEX idx_interest_type (interest_type)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='用户兴趣表';
INDEX idx_token (token),
INDEX idx_expires_at (expires_at)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='密码重置表';
```
#### 7.3 登录尝试表 (login_attempts)
```sql
CREATE TABLE login_attempts (
id INT PRIMARY KEY AUTO_INCREMENT COMMENT '尝试ID',
identifier VARCHAR(100) NOT NULL COMMENT '标识符(用户名/邮箱/手机)',
ip_address VARCHAR(45) NOT NULL COMMENT 'IP地址',
user_agent TEXT COMMENT '用户代理',
success TINYINT(1) DEFAULT 0 COMMENT '是否成功',
failure_reason VARCHAR(100) COMMENT '失败原因',
attempted_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP COMMENT '尝试时间',
INDEX idx_identifier (identifier),
INDEX idx_ip_address (ip_address),
INDEX idx_attempted_at (attempted_at)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='登录尝试记录表';
```
## 5. 表关系图
### 5.1 外键关系
根据实际数据库结构,以下是表之间的外键关系:
```mermaid
erDiagram
users ||--o{ animal_claims : "user_id"
users ||--o{ animals : "farmer_id"
users ||--o{ flowers : "farmer_id"
users ||--o{ merchants : "user_id"
users ||--o{ orders : "user_id"
users ||--o{ password_resets : "user_id"
users ||--o{ payments : "user_id"
users ||--o{ refunds : "user_id"
users ||--o{ travel_plans : "created_by"
users ||--o{ travel_registrations : "user_id"
animals ||--o{ animal_claims : "animal_id"
orders ||--o{ payments : "order_id"
payments ||--o{ refunds : "payment_id"
travel_plans ||--o{ travel_registrations : "travel_plan_id"
```
### 5.2 核心业务关系说明
1. **用户中心关系**
- 用户可以认领多个动物 (users → animal_claims)
- 用户可以作为农场主管理动物和花卉 (users → animals/flowers)
- 用户可以注册为商家 (users → merchants)
- 用户可以下订单和支付 (users → orders → payments)
2. **旅行业务关系**
- 用户创建旅行计划 (users → travel_plans)
- 其他用户报名参与旅行 (users → travel_registrations)
- 旅行计划与报名记录关联 (travel_plans → travel_registrations)
3. **交易业务关系**
- 订单关联支付记录 (orders → payments)
- 支付记录可以产生退款 (payments → refunds)
- 所有交易都关联到用户 (users → orders/payments/refunds)
### 2. 商家管理模块
#### 2.1 商家表 (merchants)
@@ -480,46 +823,137 @@ CREATE TABLE animal_updates (
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='动物更新记录表';
```
### 5. 商品订单模块
## 6. 数据库索引优化
#### 5.1 商品表 (products)
```sql
CREATE TABLE products (
id INT PRIMARY KEY AUTO_INCREMENT COMMENT '商品ID',
merchant_id INT NOT NULL COMMENT '商家ID',
category_id INT COMMENT '分类ID',
name VARCHAR(100) NOT NULL COMMENT '商品名称',
description TEXT COMMENT '商品描述',
price DECIMAL(10,2) NOT NULL COMMENT '商品价格',
original_price DECIMAL(10,2) COMMENT '原价',
stock INT DEFAULT 0 COMMENT '库存数量',
min_order_quantity INT DEFAULT 1 COMMENT '最小起订量',
max_order_quantity INT COMMENT '最大订购量',
images JSON COMMENT '商品图片数组',
specifications JSON COMMENT '商品规格',
tags VARCHAR(255) COMMENT '商品标签',
weight DECIMAL(8,3) COMMENT '商品重量(公斤)',
dimensions VARCHAR(50) COMMENT '商品尺寸',
shelf_life INT COMMENT '保质期(天)',
storage_conditions TEXT COMMENT '储存条件',
delivery_info TEXT COMMENT '配送信息',
rating DECIMAL(3,2) DEFAULT 5.00 COMMENT '商品评分',
review_count INT DEFAULT 0 COMMENT '评价数量',
sales_count INT DEFAULT 0 COMMENT '销售数量',
status ENUM('active', 'inactive', 'out_of_stock', 'discontinued') DEFAULT 'active' COMMENT '商品状态',
sort_order INT DEFAULT 0 COMMENT '排序权重',
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
FOREIGN KEY (merchant_id) REFERENCES merchants(id) ON DELETE CASCADE,
INDEX idx_merchant_id (merchant_id),
INDEX idx_category_id (category_id),
INDEX idx_price (price),
INDEX idx_status (status),
INDEX idx_rating (rating),
INDEX idx_sales_count (sales_count)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='商品信息表';
```
### 6.1 主要索引策略
#### 用户表 (users) 索引
- 主键索引:`PRIMARY KEY (id)`
- 状态索引:`INDEX idx_status (status)` - 用于用户状态筛选
- 用户类型索引:`INDEX idx_user_type (user_type)` - 用于用户类型查询
- 等级索引:`INDEX idx_level (level)` - 用于用户等级排序
- 创建时间索引:`INDEX idx_created_at (created_at)` - 用于时间范围查询
#### 管理员表 (admins) 索引
- 主键索引:`PRIMARY KEY (id)`
- 唯一索引:`UNIQUE KEY (username)`, `UNIQUE KEY (email)`
- 角色索引:`INDEX idx_role (role)` - 用于权限管理
- 状态索引:`INDEX idx_status (status)` - 用于状态筛选
#### 商家表 (merchants) 索引
- 主键索引:`PRIMARY KEY (id)`
- 外键索引:`INDEX idx_user_id (user_id)` - 关联用户查询
- 状态索引:`INDEX idx_status (status)` - 商家状态筛选
- 评分索引:`INDEX idx_rating (rating)` - 评分排序
- 地理位置复合索引:`INDEX idx_location (latitude, longitude)` - 地理位置查询
#### 动物表 (animals) 索引
- 主键索引:`PRIMARY KEY (id)`
- 外键索引:`INDEX idx_farmer_id (farmer_id)` - 农场主查询
- 类型索引:`INDEX idx_type (type)` - 动物类型筛选
- 状态索引:`INDEX idx_status (status)` - 动物状态筛选
- 价格索引:`INDEX idx_price (price)` - 价格排序
#### 旅行计划表 (travel_plans) 索引
- 主键索引:`PRIMARY KEY (id)`
- 外键索引:`INDEX idx_created_by (created_by)` - 创建者查询
- 目的地索引:`INDEX idx_destination (destination)` - 目的地搜索
- 状态索引:`INDEX idx_status (status)` - 计划状态筛选
- 开始日期索引:`INDEX idx_start_date (start_date)` - 日期排序
#### 订单表 (orders) 索引
- 主键索引:`PRIMARY KEY (id)`
- 外键索引:`INDEX idx_user_id (user_id)` - 用户订单查询
- 订单号唯一索引:`UNIQUE KEY (order_number)` - 订单号查询
- 状态索引:`INDEX idx_status (status)` - 订单状态筛选
- 支付状态索引:`INDEX idx_payment_status (payment_status)` - 支付状态筛选
### 6.2 查询优化建议
1. **分页查询优化**
- 使用 `LIMIT``OFFSET` 进行分页
- 对于大数据量分页,建议使用游标分页
2. **复合索引使用**
- 按照查询频率和选择性创建复合索引
- 遵循最左前缀原则
3. **避免全表扫描**
- 在 WHERE 条件中使用索引字段
- 避免在索引字段上使用函数
## 7. 数据库安全策略
### 7.1 访问控制
- 使用专用数据库用户,限制权限
- 定期更换数据库密码
- 启用SSL连接加密
### 7.2 数据加密
- 敏感字段(如密码)使用哈希加密
- 个人信息字段考虑加密存储
- 传输过程使用HTTPS协议
### 7.3 备份策略
- 每日自动备份数据库
- 定期测试备份恢复流程
- 异地备份保证数据安全
## 8. 性能监控与优化
### 8.1 监控指标
- 查询响应时间
- 数据库连接数
- 慢查询日志分析
- 索引使用率统计
### 8.2 优化策略
- 定期分析慢查询并优化
- 监控表大小,适时进行分区
- 定期更新表统计信息
- 合理设置数据库参数
## 9. 数据库维护
### 9.1 日常维护
- 定期检查数据库状态
- 清理过期的临时数据
- 监控磁盘空间使用
- 更新数据库统计信息
### 9.2 版本管理
- 使用数据库迁移脚本管理结构变更
- 记录每次结构变更的版本号
- 保持开发、测试、生产环境一致
## 10. 总结
本数据库设计文档基于解班客项目的实际需求,涵盖了用户管理、商家管理、动物认领、旅行计划、花卉产品、订单支付等核心业务模块。设计遵循了数据库设计的最佳实践,包括:
1. **规范化设计**:避免数据冗余,保证数据一致性
2. **性能优化**:合理设计索引,优化查询性能
3. **扩展性**:预留扩展空间,支持业务发展
4. **安全性**:实施访问控制和数据加密
5. **可维护性**:清晰的表结构和完善的文档
### 10.1 当前数据库统计
- **总表数**14张表
- **核心业务表**8张users, admins, merchants, animals, animal_claims, travel_plans, travel_registrations, flowers, orders, payments, refunds
- **辅助系统表**3张email_verifications, password_resets, login_attempts
- **外键关系**13个外键约束
### 10.2 后续优化方向
1. 根据业务发展需要,考虑添加缓存层
2. 对于高频查询表,考虑读写分离
3. 监控数据增长,适时进行分库分表
4. 完善数据备份和灾难恢复方案
---
**文档版本**v2.0
**最后更新**2024年1月
**维护人员**:开发团队
**审核状态**:已审核
#### 5.2 订单表 (orders)
```sql