项目重构: 整理目录结构, 更新前后端代码, 添加测试和数据库迁移
This commit is contained in:
0
demo/docs/DATABASE_SCHEMA_GUIDE.md
Normal file
0
demo/docs/DATABASE_SCHEMA_GUIDE.md
Normal file
0
demo/docs/PAYMENT_EVENTS_FLOW.md
Normal file
0
demo/docs/PAYMENT_EVENTS_FLOW.md
Normal file
370
demo/docs/数据库完整结构-宝塔导入.sql
Normal file
370
demo/docs/数据库完整结构-宝塔导入.sql
Normal file
@@ -0,0 +1,370 @@
|
||||
-- ============================================
|
||||
-- AIGC平台数据库完整结构
|
||||
-- 适用于宝塔面板部署
|
||||
-- 创建时间:2025
|
||||
-- ============================================
|
||||
|
||||
-- 设置字符集
|
||||
SET NAMES utf8mb4;
|
||||
SET FOREIGN_KEY_CHECKS = 0;
|
||||
|
||||
-- ============================================
|
||||
-- 1. 基础表结构(schema.sql)
|
||||
-- ============================================
|
||||
|
||||
-- 用户表
|
||||
CREATE TABLE IF NOT EXISTS users (
|
||||
id BIGINT PRIMARY KEY AUTO_INCREMENT,
|
||||
username VARCHAR(50) NOT NULL UNIQUE,
|
||||
email VARCHAR(100) NOT NULL UNIQUE,
|
||||
password_hash VARCHAR(100) NOT NULL,
|
||||
role VARCHAR(30) NOT NULL DEFAULT 'ROLE_USER',
|
||||
points INT NOT NULL DEFAULT 50,
|
||||
frozen_points INT NOT NULL DEFAULT 0 COMMENT '冻结积分',
|
||||
phone VARCHAR(20),
|
||||
avatar VARCHAR(500),
|
||||
nickname VARCHAR(100),
|
||||
gender VARCHAR(10),
|
||||
birthday DATE,
|
||||
address TEXT,
|
||||
is_active BOOLEAN NOT NULL DEFAULT TRUE,
|
||||
last_login_at TIMESTAMP NULL,
|
||||
created_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
||||
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
|
||||
INDEX idx_email (email),
|
||||
INDEX idx_username (username)
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='用户表';
|
||||
|
||||
-- 支付表
|
||||
CREATE TABLE IF NOT EXISTS payments (
|
||||
id BIGINT PRIMARY KEY AUTO_INCREMENT,
|
||||
order_id VARCHAR(50) NOT NULL UNIQUE,
|
||||
amount DECIMAL(10,2) NOT NULL,
|
||||
currency VARCHAR(3) NOT NULL DEFAULT 'CNY',
|
||||
payment_method VARCHAR(20) NOT NULL,
|
||||
status VARCHAR(20) NOT NULL DEFAULT 'PENDING',
|
||||
description VARCHAR(500),
|
||||
external_transaction_id VARCHAR(100),
|
||||
callback_url VARCHAR(1000),
|
||||
return_url VARCHAR(1000),
|
||||
created_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
||||
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
|
||||
paid_at TIMESTAMP NULL,
|
||||
user_id BIGINT,
|
||||
FOREIGN KEY (user_id) REFERENCES users(id),
|
||||
INDEX idx_order_id (order_id),
|
||||
INDEX idx_user_id (user_id),
|
||||
INDEX idx_status (status)
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='支付表';
|
||||
|
||||
-- 订单表
|
||||
CREATE TABLE IF NOT EXISTS orders (
|
||||
id BIGINT PRIMARY KEY AUTO_INCREMENT,
|
||||
order_number VARCHAR(50) NOT NULL UNIQUE,
|
||||
total_amount DECIMAL(10,2) NOT NULL,
|
||||
currency VARCHAR(3) NOT NULL DEFAULT 'CNY',
|
||||
status VARCHAR(20) NOT NULL DEFAULT 'PENDING',
|
||||
order_type VARCHAR(20) NOT NULL DEFAULT 'PRODUCT',
|
||||
description VARCHAR(500),
|
||||
notes TEXT,
|
||||
shipping_address TEXT,
|
||||
billing_address TEXT,
|
||||
contact_phone VARCHAR(20),
|
||||
contact_email VARCHAR(100),
|
||||
created_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
||||
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
|
||||
paid_at TIMESTAMP NULL,
|
||||
shipped_at TIMESTAMP NULL,
|
||||
delivered_at TIMESTAMP NULL,
|
||||
cancelled_at TIMESTAMP NULL,
|
||||
user_id BIGINT NOT NULL,
|
||||
FOREIGN KEY (user_id) REFERENCES users(id),
|
||||
INDEX idx_order_number (order_number),
|
||||
INDEX idx_user_id (user_id),
|
||||
INDEX idx_status (status)
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='订单表';
|
||||
|
||||
-- 订单项表
|
||||
CREATE TABLE IF NOT EXISTS order_items (
|
||||
id BIGINT PRIMARY KEY AUTO_INCREMENT,
|
||||
product_name VARCHAR(100) NOT NULL,
|
||||
product_description VARCHAR(500),
|
||||
product_sku VARCHAR(200),
|
||||
unit_price DECIMAL(10,2) NOT NULL,
|
||||
quantity INT NOT NULL,
|
||||
subtotal DECIMAL(10,2) NOT NULL,
|
||||
product_image VARCHAR(100),
|
||||
order_id BIGINT NOT NULL,
|
||||
FOREIGN KEY (order_id) REFERENCES orders(id) ON DELETE CASCADE,
|
||||
INDEX idx_order_id (order_id)
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='订单项表';
|
||||
|
||||
-- 会员等级表
|
||||
CREATE TABLE IF NOT EXISTS membership_levels (
|
||||
id BIGINT PRIMARY KEY AUTO_INCREMENT,
|
||||
name VARCHAR(50) NOT NULL UNIQUE,
|
||||
display_name VARCHAR(50) NOT NULL,
|
||||
description TEXT,
|
||||
price DECIMAL(10,2) NOT NULL DEFAULT 0,
|
||||
duration_days INT NOT NULL DEFAULT 30,
|
||||
points_bonus INT NOT NULL DEFAULT 0,
|
||||
features JSON,
|
||||
is_active BOOLEAN NOT NULL DEFAULT TRUE,
|
||||
created_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
||||
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
|
||||
INDEX idx_name (name)
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='会员等级表';
|
||||
|
||||
-- 用户会员信息表
|
||||
CREATE TABLE IF NOT EXISTS user_memberships (
|
||||
id BIGINT PRIMARY KEY AUTO_INCREMENT,
|
||||
user_id BIGINT NOT NULL,
|
||||
membership_level_id BIGINT NOT NULL,
|
||||
start_date TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
||||
end_date TIMESTAMP NOT NULL,
|
||||
status VARCHAR(20) NOT NULL DEFAULT 'ACTIVE',
|
||||
auto_renew BOOLEAN NOT NULL DEFAULT FALSE,
|
||||
created_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
||||
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
|
||||
FOREIGN KEY (user_id) REFERENCES users(id) ON DELETE CASCADE,
|
||||
FOREIGN KEY (membership_level_id) REFERENCES membership_levels(id),
|
||||
UNIQUE KEY unique_active_membership (user_id, status),
|
||||
INDEX idx_user_id (user_id),
|
||||
INDEX idx_status (status)
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='用户会员信息表';
|
||||
|
||||
-- 视频生成任务表(基础表)
|
||||
CREATE TABLE IF NOT EXISTS video_tasks (
|
||||
id BIGINT PRIMARY KEY AUTO_INCREMENT,
|
||||
task_id VARCHAR(100) NOT NULL UNIQUE,
|
||||
user_id BIGINT NOT NULL,
|
||||
task_type VARCHAR(50) NOT NULL,
|
||||
title VARCHAR(200) NOT NULL,
|
||||
description TEXT,
|
||||
input_text TEXT,
|
||||
input_image_url VARCHAR(500),
|
||||
output_video_url VARCHAR(500),
|
||||
status VARCHAR(20) NOT NULL DEFAULT 'PENDING',
|
||||
progress INT NOT NULL DEFAULT 0,
|
||||
error_message TEXT,
|
||||
created_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
||||
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
|
||||
completed_at TIMESTAMP NULL,
|
||||
FOREIGN KEY (user_id) REFERENCES users(id) ON DELETE CASCADE,
|
||||
INDEX idx_task_id (task_id),
|
||||
INDEX idx_user_id (user_id),
|
||||
INDEX idx_status (status)
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='视频生成任务表';
|
||||
|
||||
-- 用户作品表(基础版)
|
||||
CREATE TABLE IF NOT EXISTS user_works_base (
|
||||
id BIGINT PRIMARY KEY AUTO_INCREMENT,
|
||||
user_id BIGINT NOT NULL,
|
||||
title VARCHAR(200) NOT NULL,
|
||||
description TEXT,
|
||||
work_type VARCHAR(50) NOT NULL,
|
||||
cover_image VARCHAR(500),
|
||||
video_url VARCHAR(500),
|
||||
tags VARCHAR(500),
|
||||
is_public BOOLEAN NOT NULL DEFAULT TRUE,
|
||||
view_count INT NOT NULL DEFAULT 0,
|
||||
like_count INT NOT NULL DEFAULT 0,
|
||||
created_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
||||
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
|
||||
FOREIGN KEY (user_id) REFERENCES users(id) ON DELETE CASCADE,
|
||||
INDEX idx_user_id (user_id),
|
||||
INDEX idx_work_type (work_type)
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='用户作品表(基础版)';
|
||||
|
||||
-- 系统配置表
|
||||
CREATE TABLE IF NOT EXISTS system_configs (
|
||||
id BIGINT PRIMARY KEY AUTO_INCREMENT,
|
||||
config_key VARCHAR(100) NOT NULL UNIQUE,
|
||||
config_value TEXT,
|
||||
description VARCHAR(500),
|
||||
config_type VARCHAR(50) NOT NULL DEFAULT 'STRING',
|
||||
is_public BOOLEAN NOT NULL DEFAULT FALSE,
|
||||
created_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
||||
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
|
||||
INDEX idx_config_key (config_key)
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='系统配置表';
|
||||
|
||||
-- ============================================
|
||||
-- 2. 迁移表结构(Flyway Migration)
|
||||
-- ============================================
|
||||
|
||||
-- V3: 任务队列表
|
||||
CREATE TABLE IF NOT EXISTS task_queue (
|
||||
id BIGINT AUTO_INCREMENT PRIMARY KEY,
|
||||
username VARCHAR(100) NOT NULL COMMENT '用户名',
|
||||
task_id VARCHAR(50) NOT NULL UNIQUE COMMENT '任务ID',
|
||||
task_type ENUM('TEXT_TO_VIDEO', 'IMAGE_TO_VIDEO') NOT NULL COMMENT '任务类型',
|
||||
status ENUM('PENDING', 'PROCESSING', 'COMPLETED', 'FAILED', 'CANCELLED', 'TIMEOUT') NOT NULL DEFAULT 'PENDING' COMMENT '队列状态',
|
||||
priority INT NOT NULL DEFAULT 0 COMMENT '优先级,数字越小优先级越高',
|
||||
real_task_id VARCHAR(100) COMMENT '外部API返回的真实任务ID',
|
||||
last_check_time DATETIME COMMENT '最后一次检查时间',
|
||||
check_count INT NOT NULL DEFAULT 0 COMMENT '检查次数',
|
||||
max_check_count INT NOT NULL DEFAULT 30 COMMENT '最大检查次数(30次 * 2分钟 = 60分钟)',
|
||||
error_message TEXT COMMENT '错误信息',
|
||||
created_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
|
||||
updated_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
|
||||
completed_at DATETIME COMMENT '完成时间',
|
||||
INDEX idx_username_status (username, status),
|
||||
INDEX idx_status_priority (status, priority),
|
||||
INDEX idx_last_check_time (last_check_time),
|
||||
INDEX idx_created_at (created_at)
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='任务队列表';
|
||||
|
||||
-- V4: 积分冻结记录表
|
||||
CREATE TABLE IF NOT EXISTS points_freeze_records (
|
||||
id BIGINT AUTO_INCREMENT PRIMARY KEY,
|
||||
username VARCHAR(100) NOT NULL COMMENT '用户名',
|
||||
task_id VARCHAR(50) NOT NULL UNIQUE COMMENT '任务ID',
|
||||
task_type ENUM('TEXT_TO_VIDEO', 'IMAGE_TO_VIDEO') NOT NULL COMMENT '任务类型',
|
||||
freeze_points INT NOT NULL COMMENT '冻结的积分数量',
|
||||
status ENUM('FROZEN', 'DEDUCTED', 'RETURNED', 'EXPIRED') NOT NULL DEFAULT 'FROZEN' COMMENT '冻结状态',
|
||||
freeze_reason VARCHAR(200) COMMENT '冻结原因',
|
||||
created_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
|
||||
updated_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
|
||||
completed_at DATETIME COMMENT '完成时间',
|
||||
INDEX idx_username_status (username, status),
|
||||
INDEX idx_task_id (task_id),
|
||||
INDEX idx_created_at (created_at),
|
||||
INDEX idx_status (status)
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='积分冻结记录表';
|
||||
|
||||
-- V5: 用户作品表(详细版)
|
||||
CREATE TABLE IF NOT EXISTS user_works (
|
||||
id BIGINT AUTO_INCREMENT PRIMARY KEY,
|
||||
username VARCHAR(100) NOT NULL COMMENT '用户名',
|
||||
task_id VARCHAR(50) NOT NULL UNIQUE COMMENT '任务ID',
|
||||
work_type ENUM('TEXT_TO_VIDEO', 'IMAGE_TO_VIDEO') NOT NULL COMMENT '作品类型',
|
||||
title VARCHAR(200) COMMENT '作品标题',
|
||||
description TEXT COMMENT '作品描述',
|
||||
prompt TEXT COMMENT '生成提示词',
|
||||
result_url VARCHAR(500) COMMENT '结果视频URL',
|
||||
thumbnail_url VARCHAR(500) COMMENT '缩略图URL',
|
||||
duration VARCHAR(10) COMMENT '视频时长',
|
||||
aspect_ratio VARCHAR(10) COMMENT '宽高比',
|
||||
quality VARCHAR(20) COMMENT '画质',
|
||||
file_size VARCHAR(20) COMMENT '文件大小',
|
||||
points_cost INT NOT NULL DEFAULT 0 COMMENT '消耗积分',
|
||||
status ENUM('PROCESSING', 'COMPLETED', 'FAILED', 'DELETED') NOT NULL DEFAULT 'PROCESSING' COMMENT '作品状态',
|
||||
is_public BOOLEAN NOT NULL DEFAULT FALSE COMMENT '是否公开',
|
||||
view_count INT NOT NULL DEFAULT 0 COMMENT '浏览次数',
|
||||
like_count INT NOT NULL DEFAULT 0 COMMENT '点赞次数',
|
||||
download_count INT NOT NULL DEFAULT 0 COMMENT '下载次数',
|
||||
tags VARCHAR(500) COMMENT '标签',
|
||||
created_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
|
||||
updated_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
|
||||
completed_at DATETIME COMMENT '完成时间',
|
||||
INDEX idx_username_status (username, status),
|
||||
INDEX idx_task_id (task_id),
|
||||
INDEX idx_work_type (work_type),
|
||||
INDEX idx_is_public_status (is_public, status),
|
||||
INDEX idx_created_at (created_at),
|
||||
INDEX idx_view_count (view_count),
|
||||
INDEX idx_like_count (like_count),
|
||||
INDEX idx_tags (tags),
|
||||
INDEX idx_prompt (prompt(100))
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='用户作品表';
|
||||
|
||||
-- V6: 任务状态表
|
||||
CREATE TABLE IF NOT EXISTS task_status (
|
||||
id BIGINT AUTO_INCREMENT PRIMARY KEY,
|
||||
task_id VARCHAR(255) NOT NULL COMMENT '任务ID',
|
||||
username VARCHAR(255) NOT NULL COMMENT '用户名',
|
||||
task_type VARCHAR(50) NOT NULL COMMENT '任务类型',
|
||||
status VARCHAR(50) NOT NULL DEFAULT 'PENDING' COMMENT '任务状态',
|
||||
progress INT DEFAULT 0 COMMENT '进度百分比',
|
||||
result_url TEXT COMMENT '结果URL',
|
||||
error_message TEXT COMMENT '错误信息',
|
||||
external_task_id VARCHAR(255) COMMENT '外部任务ID',
|
||||
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
|
||||
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
|
||||
completed_at TIMESTAMP NULL COMMENT '完成时间',
|
||||
last_polled_at TIMESTAMP NULL COMMENT '最后轮询时间',
|
||||
poll_count INT DEFAULT 0 COMMENT '轮询次数',
|
||||
max_polls INT DEFAULT 60 COMMENT '最大轮询次数(2小时)',
|
||||
INDEX idx_task_id (task_id),
|
||||
INDEX idx_username (username),
|
||||
INDEX idx_status (status),
|
||||
INDEX idx_created_at (created_at),
|
||||
INDEX idx_last_polled (last_polled_at)
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='任务状态表';
|
||||
|
||||
-- V7: 任务清理表
|
||||
-- 成功任务归档表
|
||||
CREATE TABLE IF NOT EXISTS completed_tasks_archive (
|
||||
id BIGINT AUTO_INCREMENT PRIMARY KEY,
|
||||
task_id VARCHAR(255) NOT NULL,
|
||||
username VARCHAR(255) NOT NULL,
|
||||
task_type VARCHAR(50) NOT NULL,
|
||||
prompt TEXT,
|
||||
aspect_ratio VARCHAR(20),
|
||||
duration INT,
|
||||
hd_mode BOOLEAN DEFAULT FALSE,
|
||||
result_url TEXT,
|
||||
real_task_id VARCHAR(255),
|
||||
progress INT DEFAULT 100,
|
||||
created_at TIMESTAMP NOT NULL,
|
||||
completed_at TIMESTAMP NOT NULL,
|
||||
archived_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
|
||||
points_cost INT DEFAULT 0,
|
||||
INDEX idx_username (username),
|
||||
INDEX idx_task_type (task_type),
|
||||
INDEX idx_created_at (created_at),
|
||||
INDEX idx_completed_at (completed_at),
|
||||
INDEX idx_archived_at (archived_at)
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='成功任务归档表';
|
||||
|
||||
-- 失败任务清理日志表
|
||||
CREATE TABLE IF NOT EXISTS failed_tasks_cleanup_log (
|
||||
id BIGINT AUTO_INCREMENT PRIMARY KEY,
|
||||
task_id VARCHAR(255) NOT NULL,
|
||||
username VARCHAR(255) NOT NULL,
|
||||
task_type VARCHAR(50) NOT NULL,
|
||||
error_message TEXT,
|
||||
created_at TIMESTAMP NOT NULL,
|
||||
failed_at TIMESTAMP NOT NULL,
|
||||
cleaned_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
|
||||
INDEX idx_username (username),
|
||||
INDEX idx_task_type (task_type),
|
||||
INDEX idx_cleaned_at (cleaned_at)
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='失败任务清理日志表';
|
||||
|
||||
-- V8: 分镜视频任务表
|
||||
CREATE TABLE IF NOT EXISTS storyboard_video_tasks (
|
||||
id BIGINT AUTO_INCREMENT PRIMARY KEY,
|
||||
task_id VARCHAR(50) NOT NULL UNIQUE,
|
||||
username VARCHAR(100) NOT NULL,
|
||||
prompt TEXT,
|
||||
image_url VARCHAR(500),
|
||||
aspect_ratio VARCHAR(10) NOT NULL,
|
||||
hd_mode BOOLEAN NOT NULL DEFAULT FALSE,
|
||||
status VARCHAR(20) NOT NULL,
|
||||
progress INT NOT NULL DEFAULT 0,
|
||||
result_url VARCHAR(500),
|
||||
real_task_id VARCHAR(255),
|
||||
error_message TEXT,
|
||||
cost_points INT NOT NULL DEFAULT 0,
|
||||
created_at TIMESTAMP NOT NULL,
|
||||
updated_at TIMESTAMP NOT NULL,
|
||||
completed_at TIMESTAMP,
|
||||
INDEX idx_username (username),
|
||||
INDEX idx_status (status),
|
||||
INDEX idx_task_id (task_id)
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='分镜视频任务表';
|
||||
|
||||
-- ============================================
|
||||
-- 完成
|
||||
-- ============================================
|
||||
|
||||
SET FOREIGN_KEY_CHECKS = 1;
|
||||
|
||||
-- 显示所有表
|
||||
SHOW TABLES;
|
||||
|
||||
|
||||
|
||||
|
||||
299
demo/docs/环境变量配置说明-宝塔部署.md
Normal file
299
demo/docs/环境变量配置说明-宝塔部署.md
Normal file
@@ -0,0 +1,299 @@
|
||||
# 环境变量配置说明 - 宝塔部署
|
||||
|
||||
## 📋 必需的环境变量
|
||||
|
||||
### 1. 数据库配置
|
||||
|
||||
```bash
|
||||
# MySQL数据库主机地址(本地数据库使用127.0.0.1或localhost)
|
||||
DB_HOST=127.0.0.1
|
||||
|
||||
# MySQL数据库端口(默认3306)
|
||||
DB_PORT=3306
|
||||
|
||||
# 数据库名称
|
||||
DB_NAME=aigc_platform
|
||||
|
||||
# 数据库用户名
|
||||
DB_USERNAME=aigc_user
|
||||
|
||||
# 数据库密码(请替换为你的实际密码)
|
||||
DB_PASSWORD=your_secure_password_here
|
||||
```
|
||||
|
||||
### 2. JWT配置
|
||||
|
||||
```bash
|
||||
# JWT密钥(请生成一个足够长的随机字符串,至少64字符)
|
||||
JWT_SECRET=your-very-long-secret-key-at-least-64-characters-for-production-security
|
||||
|
||||
# JWT过期时间(毫秒,默认604800000=7天)
|
||||
JWT_EXPIRATION=604800000
|
||||
```
|
||||
|
||||
### 3. AI API配置
|
||||
|
||||
```bash
|
||||
# AI API基础URL
|
||||
AI_API_BASE_URL=https://ai.comfly.chat
|
||||
AI_API_KEY=your_ai_api_key
|
||||
|
||||
# 图片生成API配置
|
||||
AI_IMAGE_API_BASE_URL=https://ai.comfly.chat
|
||||
AI_IMAGE_API_KEY=your_ai_image_api_key
|
||||
```
|
||||
|
||||
### 4. 支付宝配置
|
||||
|
||||
```bash
|
||||
# 支付宝应用ID
|
||||
ALIPAY_APP_ID=your_alipay_app_id
|
||||
|
||||
# 支付宝私钥
|
||||
ALIPAY_PRIVATE_KEY=your_alipay_private_key
|
||||
|
||||
# 支付宝公钥
|
||||
ALIPAY_PUBLIC_KEY=your_alipay_public_key
|
||||
|
||||
# 域名配置
|
||||
ALIPAY_DOMAIN=https://yourdomain.com
|
||||
|
||||
# 回调URL
|
||||
ALIPAY_NOTIFY_URL=https://yourdomain.com/api/payments/alipay/notify
|
||||
ALIPAY_RETURN_URL=https://yourdomain.com/payment/success
|
||||
```
|
||||
|
||||
### 5. 腾讯云SES邮件服务配置
|
||||
|
||||
```bash
|
||||
# 腾讯云SES Secret ID
|
||||
TENCENT_SES_SECRET_ID=your_tencent_ses_secret_id
|
||||
|
||||
# 腾讯云SES Secret Key
|
||||
TENCENT_SES_SECRET_KEY=your_tencent_ses_secret_key
|
||||
|
||||
# 发件邮箱
|
||||
TENCENT_SES_FROM_EMAIL=noreply@yourdomain.com
|
||||
|
||||
# 邮件模板ID
|
||||
TENCENT_SES_TEMPLATE_ID=your_template_id
|
||||
```
|
||||
|
||||
### 6. 文件路径配置(可选)
|
||||
|
||||
```bash
|
||||
# FFmpeg可执行文件路径(Linux服务器)
|
||||
FFMPEG_PATH=/usr/bin/ffmpeg
|
||||
|
||||
# 临时文件目录
|
||||
TEMP_DIR=/app/temp
|
||||
|
||||
# 上传文件目录
|
||||
UPLOAD_PATH=/app/uploads
|
||||
|
||||
# 日志文件路径
|
||||
LOG_FILE_PATH=/app/logs/application.log
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 🔧 宝塔面板设置环境变量
|
||||
|
||||
### 方式一:通过启动脚本设置
|
||||
|
||||
在宝塔面板创建启动脚本 `start.sh`:
|
||||
|
||||
```bash
|
||||
#!/bin/bash
|
||||
|
||||
# 设置环境变量
|
||||
export DB_HOST=127.0.0.1
|
||||
export DB_PORT=3306
|
||||
export DB_NAME=aigc_platform
|
||||
export DB_USERNAME=aigc_user
|
||||
export DB_PASSWORD=jRbHPZbbkdm24yTT
|
||||
|
||||
export JWT_SECRET=aigc-demo-secret-key-for-jwt-token-generation-2025-production-version-secure
|
||||
|
||||
export AI_API_BASE_URL=https://ai.comfly.chat
|
||||
export AI_API_KEY=sk-xCX1X12e8Dpj4mRJKFMxFUnV29pzJQpPeuZFGqTwYOorjvOQ
|
||||
|
||||
export AI_IMAGE_API_BASE_URL=https://ai.comfly.chat
|
||||
export AI_IMAGE_API_KEY=sk-xCX1X12e8Dpj4mRJKFMxFUnV29pzJQpPeuZFGqTwYOorjvOQ
|
||||
|
||||
export ALIPAY_APP_ID=your_app_id
|
||||
export ALIPAY_PRIVATE_KEY=your_private_key
|
||||
export ALIPAY_PUBLIC_KEY=your_public_key
|
||||
export ALIPAY_DOMAIN=https://yourdomain.com
|
||||
export ALIPAY_NOTIFY_URL=https://yourdomain.com/api/payments/alipay/notify
|
||||
export ALIPAY_RETURN_URL=https://yourdomain.com/payment/success
|
||||
|
||||
export TENCENT_SES_SECRET_ID=your_secret_id
|
||||
export TENCENT_SES_SECRET_KEY=your_secret_key
|
||||
export TENCENT_SES_FROM_EMAIL=noreply@yourdomain.com
|
||||
export TENCENT_SES_TEMPLATE_ID=your_template_id
|
||||
|
||||
export FFMPEG_PATH=/usr/bin/ffmpeg
|
||||
export TEMP_DIR=/app/temp
|
||||
export UPLOAD_PATH=/app/uploads
|
||||
export LOG_FILE_PATH=/app/logs/application.log
|
||||
|
||||
# 启动应用
|
||||
java -jar -Dspring.profiles.active=prod demo-0.0.1-SNAPSHOT.jar
|
||||
```
|
||||
|
||||
赋予执行权限:
|
||||
```bash
|
||||
chmod +x start.sh
|
||||
```
|
||||
|
||||
### 方式二:创建 .env 文件
|
||||
|
||||
创建 `.env` 文件:
|
||||
|
||||
```bash
|
||||
# 数据库配置
|
||||
DB_HOST=127.0.0.1
|
||||
DB_PORT=3306
|
||||
DB_NAME=aigc_platform
|
||||
DB_USERNAME=aigc_user
|
||||
DB_PASSWORD=jRbHPZbbkdm24yTT
|
||||
|
||||
# JWT配置
|
||||
JWT_SECRET=aigc-demo-secret-key-for-jwt-token-generation-2025-production-version-secure
|
||||
JWT_EXPIRATION=604800000
|
||||
|
||||
# AI API配置
|
||||
AI_API_BASE_URL=https://ai.comfly.chat
|
||||
AI_API_KEY=sk-xCX1X12e8Dpj4mRJKFMxFUnV29pzJQpPeuZFGqTwYOorjvOQ
|
||||
AI_IMAGE_API_BASE_URL=https://ai.comfly.chat
|
||||
AI_IMAGE_API_KEY=sk-xCX1X12e8Dpj4mRJKFMxFUnV29pzJQpPeuZFGqTwYOorjvOQ
|
||||
|
||||
# 支付宝配置
|
||||
ALIPAY_APP_ID=your_app_id
|
||||
ALIPAY_PRIVATE_KEY=your_private_key
|
||||
ALIPAY_PUBLIC_KEY=your_public_key
|
||||
ALIPAY_DOMAIN=https://yourdomain.com
|
||||
ALIPAY_NOTIFY_URL=https://yourdomain.com/api/payments/alipay/notify
|
||||
ALIPAY_RETURN_URL=https://yourdomain.com/payment/success
|
||||
|
||||
# 腾讯云SES配置
|
||||
TENCENT_SES_SECRET_ID=your_secret_id
|
||||
TENCENT_SES_SECRET_KEY=your_secret_key
|
||||
TENCENT_SES_FROM_EMAIL=noreply@yourdomain.com
|
||||
TENCENT_SES_TEMPLATE_ID=your_template_id
|
||||
|
||||
# 文件路径配置
|
||||
FFMPEG_PATH=/usr/bin/ffmpeg
|
||||
TEMP_DIR=/app/temp
|
||||
UPLOAD_PATH=/app/uploads
|
||||
LOG_FILE_PATH=/app/logs/application.log
|
||||
```
|
||||
|
||||
使用 `source` 加载环境变量后启动:
|
||||
```bash
|
||||
source .env && java -jar -Dspring.profiles.active=prod demo-0.0.1-SNAPSHOT.jar
|
||||
```
|
||||
|
||||
### 方式三:systemd服务配置
|
||||
|
||||
创建 systemd 服务文件 `/etc/systemd/system/aigc-platform.service`:
|
||||
|
||||
```ini
|
||||
[Unit]
|
||||
Description=AIGC Platform Service
|
||||
After=network.target mysql.service
|
||||
|
||||
[Service]
|
||||
Type=simple
|
||||
User=www
|
||||
WorkingDirectory=/www/wwwroot/aigc-platform
|
||||
ExecStart=/usr/bin/java -jar -Dspring.profiles.active=prod demo-0.0.1-SNAPSHOT.jar
|
||||
|
||||
# 环境变量配置
|
||||
Environment="DB_HOST=127.0.0.1"
|
||||
Environment="DB_PORT=3306"
|
||||
Environment="DB_NAME=aigc_platform"
|
||||
Environment="DB_USERNAME=aigc_user"
|
||||
Environment="DB_PASSWORD=jRbHPZbbkdm24yTT"
|
||||
Environment="JWT_SECRET=your-jwt-secret-key"
|
||||
Environment="AI_API_BASE_URL=https://ai.comfly.chat"
|
||||
Environment="AI_API_KEY=your_api_key"
|
||||
|
||||
Restart=always
|
||||
RestartSec=10
|
||||
|
||||
[Install]
|
||||
WantedBy=multi-user.target
|
||||
```
|
||||
|
||||
启动服务:
|
||||
```bash
|
||||
systemctl daemon-reload
|
||||
systemctl enable aigc-platform
|
||||
systemctl start aigc-platform
|
||||
systemctl status aigc-platform
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## ✅ 配置验证
|
||||
|
||||
启动应用后,检查日志确认数据库连接成功:
|
||||
|
||||
```bash
|
||||
# 查看启动日志
|
||||
tail -f logs/application.log
|
||||
|
||||
# 应该看到类似的日志:
|
||||
# INFO - HikariPool-1 - Starting...
|
||||
# INFO - HikariPool-1 - Start completed.
|
||||
# INFO - Started DemoApplication in X.XX seconds
|
||||
```
|
||||
|
||||
测试数据库连接:
|
||||
```bash
|
||||
curl http://localhost:8080/api/health/ping
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 🔐 安全建议
|
||||
|
||||
1. **不要将 .env 文件或包含密钥的启动脚本提交到Git**
|
||||
```bash
|
||||
echo ".env" >> .gitignore
|
||||
echo "start.sh" >> .gitignore
|
||||
```
|
||||
|
||||
2. **定期更换JWT密钥和数据库密码**
|
||||
|
||||
3. **生产环境使用强密码**
|
||||
- 数据库密码:至少16位,包含大小写字母、数字、特殊字符
|
||||
- JWT密钥:至少64字符随机字符串
|
||||
|
||||
4. **限制数据库访问**
|
||||
- 仅允许应用服务器IP访问MySQL
|
||||
- 不要使用root用户,创建专用数据库用户
|
||||
|
||||
5. **启用HTTPS**
|
||||
- 生产环境务必配置SSL证书
|
||||
- 在Nginx/宝塔面板配置HTTPS
|
||||
|
||||
---
|
||||
|
||||
## 📝 快速配置模板(本地测试用)
|
||||
|
||||
```bash
|
||||
# 最小化配置(使用默认值)
|
||||
export DB_HOST=127.0.0.1
|
||||
export DB_USERNAME=aigc_user
|
||||
export DB_PASSWORD=jRbHPZbbkdm24yTT
|
||||
export JWT_SECRET=aigc-demo-secret-key-for-jwt-token-generation-2025
|
||||
|
||||
# 启动应用
|
||||
java -jar -Dspring.profiles.active=prod demo-0.0.1-SNAPSHOT.jar
|
||||
```
|
||||
|
||||
|
||||
|
||||
Reference in New Issue
Block a user