重构动物模型和路由系统,优化查询逻辑并新增商户和促销活动功能
This commit is contained in:
562
docs/数据库设计文档.md
562
docs/数据库设计文档.md
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user