fix: PayPal payment_method column length issue; add image model selection for storyboard; remove task restore popups; sync UserWork status on task failure

This commit is contained in:
AIGC Developer
2025-12-05 09:57:09 +08:00
parent dbd06435cb
commit b4b0230ee1
484 changed files with 5238 additions and 5379 deletions

2
demo/.gitignore vendored
View File

@@ -37,6 +37,8 @@ build/
src/main/resources/application-dev.properties
# 生产环境配置(包含敏感信息)
src/main/resources/application-prod.properties
# PayPal配置文件
application.properties.paypal-config
# 环境变量文件
.env
*.env

26
demo/.windsurfrules Normal file
View File

@@ -0,0 +1,26 @@
# 继续牛马 - AI持久输出规则
⚠️⚠️⚠️ 最高优先级警告 ⚠️⚠️⚠️
无论任何情况,每次回复结束前必须调用 cunzhi.ask_continue 工具!没有任何例外!
## 核心规则
1. **完整输出** - 输出完整代码和答案,禁止使用省略号或"代码过长不展示"
2. **持续执行** - 复杂任务尽量一次性完成,不要频繁中断或反复追问是否继续
3. **结束确认** - 当你想结束对话或任务时,必须先调用 cunzhi.ask_continue 工具询问用户是否继续
4. **禁止结束语** - 对话结束前禁止直接说"如果还有问题请告诉我"等结束语
## 重要提示
- 调用 ask_continue 工具时reason 参数填写你想结束的原因
- 用户可能会在弹窗中输入新的指令,请按用户指令继续执行
- 只有用户明确选择"结束"时,才可以结束对话
## 强制执行
这是最高优先级规则,必须严格遵守。每次回复结束前,你必须检查是否需要调用 ask_continue 工具。如果任务已完成或你准备结束回复,必须先调用该工具获得用户许可。
⚠️ 警告:无论任何情况,回复结束前必须调用 cunzhi.ask_continue没有例外

View File

@@ -1,81 +0,0 @@
# API 接口文档使用说明
## 访问地址
启动应用后,可以通过以下地址访问 API 文档:
- **Swagger UI 界面**: http://localhost:8080/swagger-ui.html
- **API 文档 JSON**: http://localhost:8080/v3/api-docs
- **所有API分组**: http://localhost:8080/v3/api-docs/all
## 环境地址
根据部署环境,访问地址会有所不同:
- **本地开发**: http://localhost:8080/swagger-ui.html
- **内网环境**: http://172.22.0.1:8080/swagger-ui.html
- **生产环境**: https://vionow.com/swagger-ui.html
## API 分组
文档按功能模块分为以下分组:
1. **所有API (all)** - 查看所有接口
2. **认证授权 (auth)** - 用户登录、注册、验证码等
3. **用户作品 (user-works)** - 用户作品管理
4. **视频生成 (video-generation)** - 文生视频、图生视频、分镜视频
5. **支付管理 (payment)** - 订单、支付相关接口
6. **会员管理 (member)** - 会员订阅、会员管理
7. **积分系统 (points)** - 积分相关接口
8. **任务管理 (tasks)** - 任务队列、任务状态
9. **管理后台 (admin)** - 管理员功能、数据分析
10. **系统设置 (settings)** - 系统配置、API密钥管理
11. **公共接口 (public)** - 无需认证的公共接口
## 使用 JWT 认证
大部分接口需要 JWT 认证,使用步骤如下:
1. 在 Swagger UI 页面右上角点击 **"Authorize"** 按钮
2. 在弹出框中输入 JWT Token格式`Bearer {token}` 或直接输入 token
3. 点击 **"Authorize"** 确认
4. 之后所有请求都会自动携带认证信息
### 获取 Token
1. 调用 `/api/verification/email/send` 发送邮箱验证码
2. 调用 `/api/auth/login/email` 使用邮箱和验证码登录
3. 从响应中获取 `token` 字段
4. 在 Swagger UI 中使用该 token 进行认证
## 功能特性
- ✅ 自动生成 API 文档
- ✅ 在线测试接口
- ✅ 支持 JWT 认证
- ✅ API 分组管理
- ✅ 请求/响应示例
- ✅ 参数说明和验证规则
## 注意事项
1. **生产环境**: 建议在生产环境中限制 Swagger UI 的访问,或完全禁用
2. **认证**: 大部分接口需要 JWT Token请先登录获取 Token
3. **权限**: 部分接口需要管理员权限,普通用户无法访问
4. **跨域**: 如果遇到跨域问题,请检查 CORS 配置
## 禁用 Swagger UI生产环境
如果需要在生产环境禁用 Swagger UI可以在 `application-prod.properties` 中添加:
```properties
springdoc.swagger-ui.enabled=false
```
或者通过环境变量:
```bash
export SPRINGDOC_SWAGGER_UI_ENABLED=false
```

View File

View File

View File

View File

@@ -0,0 +1,81 @@
# ============================================
# AIGC平台生产环境配置文件模板
# ============================================
# 使用说明:
# 1. 将此文件复制到服务器:/www/server/aigc-backend/application-prod.properties
# 2. 修改下面标记为【必改】的配置项
# 3. 根据需要修改【可选】配置项
# ============================================
# 服务器配置
# ============================================
server.port=8080
# ============================================
# 数据库配置【必改】
# ============================================
spring.datasource.url=jdbc:mysql://localhost:3306/aigc_platform?useUnicode=true&characterEncoding=utf8&useSSL=false&serverTimezone=Asia/Shanghai
spring.datasource.username=aigc_platform
spring.datasource.password=YOUR_DB_PASSWORD
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
# ============================================
# JPA配置
# ============================================
spring.jpa.hibernate.ddl-auto=none
spring.jpa.show-sql=false
spring.jpa.properties.hibernate.format_sql=false
spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.MySQLDialect
# ============================================
# 日志配置
# ============================================
logging.level.root=INFO
logging.level.com.example=INFO
logging.file.name=/www/server/aigc-backend/logs/app.log
logging.pattern.console=%d{yyyy-MM-dd HH:mm:ss} - %msg%n
logging.pattern.file=%d{yyyy-MM-dd HH:mm:ss} [%thread] %-5level %logger{36} - %msg%n
# ============================================
# 文件上传配置【可选修改】
# ============================================
spring.servlet.multipart.max-file-size=100MB
spring.servlet.multipart.max-request-size=100MB
# 文件存储路径
file.upload-dir=/www/server/aigc-backend/uploads
# 临时文件目录
app.temp.dir=/www/server/aigc-backend/temp
# ============================================
# 腾讯云配置【如使用腾讯云存储,必改】
# ============================================
# 腾讯云API密钥
# tencent.cloud.secret-id=YOUR_SECRET_ID
# tencent.cloud.secret-key=YOUR_SECRET_KEY
# 腾讯云区域
# tencent.cloud.region=ap-guangzhou
# COS对象存储配置
# tencent.cos.bucket-name=YOUR_BUCKET_NAME
# tencent.cos.region=ap-guangzhou
# ============================================
# CORS跨域配置【根据前端域名修改】
# ============================================
# cors.allowed-origins=https://your-domain.com,http://your-domain.com
# ============================================
# 应用配置【可选】
# ============================================
# 应用名称
spring.application.name=aigc-platform
# 启用压缩
server.compression.enabled=true
server.compression.mime-types=text/html,text/xml,text/plain,text/css,text/javascript,application/javascript,application/json
# Session配置
server.servlet.session.timeout=30m

BIN
demo/backend-dist.zip Normal file

Binary file not shown.

View File

@@ -1,52 +0,0 @@
# 多阶段构建:构建阶段
FROM maven:3.9-eclipse-temurin-21 AS builder
WORKDIR /app
# 复制 pom.xml 并下载依赖利用Docker缓存
COPY pom.xml .
RUN mvn dependency:go-offline -B || true
# 复制源码
COPY src ./src
# 打包应用(跳过测试)
RUN mvn clean package -DskipTests -B
# 生产阶段
FROM eclipse-temurin:21-jre
WORKDIR /app
# 安装时区支持和wget健康检查
RUN apt-get update && \
apt-get install -y --no-install-recommends \
tzdata \
wget \
curl && \
ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime && \
echo "Asia/Shanghai" > /etc/timezone && \
apt-get clean && \
rm -rf /var/lib/apt/lists/*
# 创建非root用户安全考虑
RUN groupadd -r spring && useradd -r -g spring spring
# 创建必要的目录并设置权限
RUN mkdir -p /app/uploads /app/temp /app/logs && \
chown -R spring:spring /app
# 从构建阶段复制JAR文件项目生成的JAR文件名demo-0.0.1-SNAPSHOT.jar
COPY --from=builder --chown=spring:spring /app/target/demo-0.0.1-SNAPSHOT.jar app.jar
# 切换到非root用户
USER spring
EXPOSE 8080
# JVM 参数优化适配50人并发建议2-4GB内存
ENV JAVA_OPTS="-Xmx2g -Xms1g -XX:+UseG1GC -XX:MaxGCPauseMillis=200 -Djava.security.egd=file:/dev/./urandom"
# 健康检查检查应用是否响应不依赖Actuator
HEALTHCHECK --interval=30s --timeout=10s --start-period=60s --retries=3 \
CMD wget --no-verbose --tries=1 --spider http://localhost:8080/ || exit 1
ENTRYPOINT ["sh", "-c", "java $JAVA_OPTS -jar app.jar"]

View File

@@ -1,48 +0,0 @@
# 多阶段构建构建阶段适配Java 21
FROM maven:3.9-eclipse-temurin-21 as builder
WORKDIR /app
COPY pom.xml .
# 复制源码
COPY src ./src
# 打包应用(跳过测试)
RUN mvn clean package -DskipTests
# 生产阶段
FROM eclipse-temurin:21-jre
WORKDIR /app
# 安装时区支持和wget健康检查
# FFmpeg 暂时跳过,可稍后手动安装
RUN apt-get update && \
apt-get install -y --no-install-recommends \
tzdata \
wget \
curl && \
ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime && \
echo "Asia/Shanghai" > /etc/timezone && \
apt-get clean && \
rm -rf /var/lib/apt/lists/*
# 创建非root用户安全考虑
RUN groupadd -r spring && useradd -r -g spring spring
# 创建必要的目录并设置权限
RUN mkdir -p /app/uploads /app/temp /app/logs && \
chown -R spring:spring /app
USER spring
# 从构建阶段复制JAR文件项目生成的JAR文件名demo-0.0.1-SNAPSHOT.jar
COPY --from=builder --chown=spring:spring /app/target/demo-0.0.1-SNAPSHOT.jar app.jar
EXPOSE 8080
# JVM 参数优化适配50人并发建议2-4GB内存
ENV JAVA_OPTS="-Xmx2g -Xms1g -XX:+UseG1GC -XX:MaxGCPauseMillis=200 -Djava.security.egd=file:/dev/./urandom"
# 健康检查检查应用是否响应不依赖Actuator
HEALTHCHECK --interval=30s --timeout=10s --start-period=60s --retries=3 \
CMD wget --no-verbose --tries=1 --spider http://localhost:8080/ || exit 1
ENTRYPOINT ["sh", "-c", "java $JAVA_OPTS -jar app.jar"]

View File

@@ -1,54 +0,0 @@
# 多阶段构建:构建阶段
FROM maven:3.9-eclipse-temurin-21 AS builder
WORKDIR /app
# 复制 pom.xml 并下载依赖利用Docker缓存
COPY pom.xml .
RUN mvn dependency:go-offline -B || true
# 复制源码
COPY src ./src
# 打包应用(跳过测试)
RUN mvn clean package -DskipTests -B
# 生产阶段
FROM eclipse-temurin:21-jre
WORKDIR /app
# 安装时区支持和wget健康检查
RUN apt-get update && \
apt-get install -y --no-install-recommends \
tzdata \
wget \
curl && \
ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime && \
echo "Asia/Shanghai" > /etc/timezone && \
apt-get clean && \
rm -rf /var/lib/apt/lists/*
# 创建非root用户安全考虑
RUN groupadd -r spring && useradd -r -g spring spring
# 创建必要的目录并设置权限
RUN mkdir -p /app/uploads /app/temp /app/logs && \
chown -R spring:spring /app
# 从构建阶段复制JAR文件项目生成的JAR文件名demo-0.0.1-SNAPSHOT.jar
COPY --from=builder --chown=spring:spring /app/target/demo-0.0.1-SNAPSHOT.jar app.jar
# 切换到非root用户
USER spring
EXPOSE 8080
# JVM 参数优化适配50人并发建议2-4GB内存
ENV JAVA_OPTS="-Xmx2g -Xms1g -XX:+UseG1GC -XX:MaxGCPauseMillis=200 -Djava.security.egd=file:/dev/./urandom"
# 健康检查检查应用是否响应不依赖Actuator
HEALTHCHECK --interval=30s --timeout=10s --start-period=60s --retries=3 \
CMD wget --no-verbose --tries=1 --spider http://localhost:8080/ || exit 1
ENTRYPOINT ["sh", "-c", "java $JAVA_OPTS -jar app.jar"]

View File

@@ -0,0 +1,44 @@
@echo off
chcp 65001 >nul
echo ========================================
echo 后端打包脚本 - Windows
echo ========================================
echo.
echo [1/3] 清理旧的构建文件...
if exist target rmdir /s /q target
if exist backend-dist.zip del backend-dist.zip
echo.
echo [2/3] 使用Maven打包...
echo 这可能需要几分钟时间,请耐心等待...
call mvnw.cmd clean package -DskipTests
if %errorlevel% neq 0 (
echo 错误: Maven打包失败
pause
exit /b 1
)
echo.
echo ========================================
echo 打包完成!
echo ========================================
echo.
echo JAR包位置: target\demo-0.0.1-SNAPSHOT.jar
echo 文件大小:
dir target\demo-0.0.1-SNAPSHOT.jar | find "demo-0.0.1-SNAPSHOT.jar"
echo.
echo 部署到宝塔步骤:
echo 1. 上传 target\demo-0.0.1-SNAPSHOT.jar 到服务器(如:/www/server/aigc-backend/app.jar
echo 2. 在服务器创建 application-prod.properties 配置文件
echo 3. 在宝塔面板使用 Supervisor 或 Java项目管理器启动
echo.
echo 启动命令:
echo java -jar app.jar --spring.profiles.active=prod
echo.
echo 注意事项:
echo - 确保服务器已安装 Java 21 或更高版本
echo - 确保MySQL数据库已创建并配置
echo - 需要在服务器上创建 application-prod.properties 配置文件
echo.
pause

View File

@@ -0,0 +1,53 @@
#!/bin/bash
# 后端打包脚本 - Linux
echo "========================================"
echo " 后端打包脚本 - Linux"
echo "========================================"
echo ""
# 颜色定义
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
NC='\033[0m' # No Color
echo "[1/3] 清理旧的构建文件..."
rm -rf target
rm -f backend-dist.tar.gz
rm -rf backend-dist
echo ""
echo "[2/3] 使用Maven打包..."
echo "这可能需要几分钟时间,请耐心等待..."
./mvnw clean package -DskipTests
if [ $? -ne 0 ]; then
echo -e "${RED}错误: Maven打包失败${NC}"
exit 1
fi
echo ""
echo "========================================"
echo " 打包完成!"
echo "========================================"
echo ""
echo -e "${GREEN}JAR包位置: target/demo-0.0.1-SNAPSHOT.jar${NC}"
echo "文件大小:"
ls -lh target/demo-0.0.1-SNAPSHOT.jar | awk '{print $5}'
echo ""
echo "部署到宝塔步骤:"
echo "1. 上传 target/demo-0.0.1-SNAPSHOT.jar 到服务器(如:/www/server/aigc-backend/app.jar"
echo "2. 在服务器创建 application-prod.properties 配置文件"
echo "3. 在宝塔面板使用 Supervisor 或 Java项目管理器启动"
echo ""
echo "启动命令:"
echo " java -jar app.jar --spring.profiles.active=prod"
echo ""
echo "上传命令示例:"
echo " scp target/demo-0.0.1-SNAPSHOT.jar root@your-server:/www/server/aigc-backend/app.jar"
echo ""
echo "注意事项:"
echo "- 确保服务器已安装 Java 21 或更高版本"
echo "- 确保MySQL数据库已创建并配置"
echo "- 需要在服务器上创建 application-prod.properties 配置文件"
echo ""

View File

@@ -1,269 +0,0 @@
# AIGC平台 - 宝塔数据库部署包
## 📦 部署包内容
```
database_baota_deploy/
├── init_database.sql # 完整数据库初始化脚本(推荐)
├── update_admin_user.sql # 管理员权限设置脚本
├── 数据库完整结构-宝塔导入.sql # 备用完整结构
├── 宝塔数据库部署指南.md # 详细部署文档
├── deploy_database.sh # Linux自动部署脚本
└── README.md # 本文件
```
## 🚀 快速开始
### 方法一:使用宝塔面板(推荐,适合新手)
1. **阅读部署指南**
```
打开 "宝塔数据库部署指南.md" 查看详细步骤
```
2. **创建数据库**
- 登录宝塔面板
- 数据库 → 添加数据库
- 数据库名: `aigc_platform`
- 字符集: `utf8mb4`
3. **导入SQL文件**
- 点击数据库的【管理】进入phpMyAdmin
- 导入 → 选择文件 → 选择 `init_database.sql`
- 执行导入
4. **配置应用**
- 将数据库信息填入 `application-prod.properties`
### 方法二使用自动脚本适合Linux命令行用户
```bash
# 1. 上传整个部署包到服务器
scp -r database_baota_deploy root@your-server:/root/
# 2. SSH登录服务器
ssh root@your-server
# 3. 进入部署目录
cd /root/database_baota_deploy
# 4. 给脚本执行权限
chmod +x deploy_database.sh
# 5. 运行自动部署脚本
bash deploy_database.sh
# 6. 按提示输入MySQL root密码和新数据库密码
# 7. 等待部署完成,保存输出的数据库配置信息
```
### 方法三:手动命令行部署
```bash
# 1. 登录MySQL
mysql -uroot -p
# 2. 创建数据库
CREATE DATABASE aigc_platform DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
# 3. 创建用户
CREATE USER 'aigc_platform'@'localhost' IDENTIFIED BY '你的密码';
GRANT ALL PRIVILEGES ON aigc_platform.* TO 'aigc_platform'@'localhost';
FLUSH PRIVILEGES;
EXIT;
# 4. 导入数据库
mysql -uaigc_platform -p aigc_platform < init_database.sql
# 5. 验证
mysql -uaigc_platform -p
USE aigc_platform;
SHOW TABLES;
```
## 📋 数据库表清单
部署成功后应包含以下13个表
| 表名 | 说明 |
|------|------|
| `users` | 用户表 |
| `payments` | 支付记录表 |
| `orders` | 订单表 |
| `order_items` | 订单明细表 |
| `text_to_video_tasks` | 文生视频任务表 |
| `image_to_video_tasks` | 图生视频任务表 |
| `storyboard_video_tasks` | 分镜视频任务表 |
| `task_queue` | 任务队列表 |
| `task_status` | 任务状态表 |
| `user_works` | 用户作品表 |
| `user_membership` | 用户会员表 |
| `user_activity_stats` | 用户活动统计表 |
| `failed_tasks_cleanup_log` | 失败任务清理日志表 |
## ⚙️ 应用配置
### Spring Boot 配置文件
**文件**: `src/main/resources/application-prod.properties`
```properties
# 数据库配置
spring.datasource.url=jdbc:mysql://localhost:3306/aigc_platform?useUnicode=true&characterEncoding=utf8&useSSL=false&serverTimezone=Asia/Shanghai&allowPublicKeyRetrieval=true
spring.datasource.username=aigc_platform
spring.datasource.password=你的数据库密码
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
# 数据库连接池配置
spring.datasource.hikari.maximum-pool-size=50
spring.datasource.hikari.minimum-idle=10
spring.datasource.hikari.idle-timeout=300000
spring.datasource.hikari.max-lifetime=1200000
spring.datasource.hikari.connection-timeout=30000
# JPA配置
spring.jpa.hibernate.ddl-auto=update
spring.jpa.show-sql=false
```
### 宝塔反向代理配置(可选)
如果使用宝塔的Nginx反向代理
```nginx
location / {
proxy_pass http://localhost:8080;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}
```
## 🔐 管理员账号
### 默认管理员邮箱
```
984523799@qq.com
```
### 设置流程
1. **首次注册**
- 使用 `984523799@qq.com` 在前端注册账号
- 数据库会自动将此用户设置为管理员
2. **手动设置**
- 如果自动设置未生效,执行 `update_admin_user.sql`
3. **验证权限**
```sql
SELECT id, username, email, role, points
FROM users
WHERE email = '984523799@qq.com';
```
- `role` 字段应为 `ROLE_ADMIN`
## 🛠️ 故障排查
### 导入失败
**问题**: 导入SQL时报错
**解决**:
1. 确保数据库字符集为 `utf8mb4`
2. 检查SQL文件编码为 UTF-8
3. 尝试分段导入或使用命令行导入
### 连接失败
**问题**: 应用无法连接数据库
**检查项**:
1. MySQL服务是否运行: `systemctl status mysql`
2. 用户名密码是否正确
3. 数据库名称是否正确
4. 防火墙是否开放3306端口如需远程连接
5. MySQL是否允许远程连接`bind-address`配置)
### 权限问题
**问题**: Access denied
**解决**:
```sql
-- 重新授权
GRANT ALL PRIVILEGES ON aigc_platform.* TO 'aigc_platform'@'localhost';
GRANT ALL PRIVILEGES ON aigc_platform.* TO 'aigc_platform'@'%';
FLUSH PRIVILEGES;
```
## 📊 数据库维护
### 定期备份
**宝塔面板**:
- 计划任务 → 添加任务
- 任务类型: 备份数据库
- 执行周期: 每天凌晨3点
- 保留份数: 7-30份
**命令行备份**:
```bash
# 手动备份
mysqldump -uaigc_platform -p aigc_platform > backup_$(date +%Y%m%d_%H%M%S).sql
# 定时备份添加到crontab
0 3 * * * mysqldump -uaigc_platform -p'密码' aigc_platform > /backup/aigc_$(date +\%Y\%m\%d).sql
```
### 性能优化
```sql
-- 查看表大小
SELECT
table_name,
ROUND(((data_length + index_length) / 1024 / 1024), 2) AS "Size (MB)"
FROM information_schema.TABLES
WHERE table_schema = 'aigc_platform'
ORDER BY (data_length + index_length) DESC;
-- 优化表
OPTIMIZE TABLE users;
OPTIMIZE TABLE text_to_video_tasks;
OPTIMIZE TABLE image_to_video_tasks;
```
## 📞 技术支持
遇到问题?
1. **查看日志**
- 宝塔面板: 数据库 → 日志
- 命令行: `/var/log/mysql/error.log`
2. **查看文档**
- 详细部署指南: `宝塔数据库部署指南.md`
3. **验证数据库**
```bash
mysql -uaigc_platform -p -e "USE aigc_platform; SHOW TABLES;"
```
## ✅ 部署检查清单
- [ ] MySQL服务正在运行
- [ ] 数据库 `aigc_platform` 已创建
- [ ] 字符集为 `utf8mb4`
- [ ] 用户 `aigc_platform` 已创建并授权
- [ ] 13个数据表已创建
- [ ] 管理员邮箱 `984523799@qq.com` 已配置
- [ ] 应用配置文件已更新数据库信息
- [ ] 数据库备份计划已设置
---
**版本**: 1.0
**更新日期**: 2025-11-10
**适用系统**: 宝塔面板 / Linux / MySQL 8.0+

View File

@@ -1,141 +0,0 @@
#!/bin/bash
# 宝塔数据库快速部署脚本
# 使用方法bash deploy_database.sh
echo "========================================"
echo " AIGC平台 - 宝塔数据库部署脚本"
echo "========================================"
echo ""
# 颜色定义
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
NC='\033[0m' # No Color
# 数据库配置
DB_NAME="aigc_platform"
DB_USER="aigc_platform"
DB_CHARSET="utf8mb4"
DB_COLLATE="utf8mb4_unicode_ci"
# 检查是否为root用户
if [ "$EUID" -ne 0 ]; then
echo -e "${RED}请使用root权限运行此脚本${NC}"
echo "使用方法: sudo bash deploy_database.sh"
exit 1
fi
echo "步骤 1/5: 检查MySQL服务状态..."
if systemctl is-active --quiet mysql || systemctl is-active --quiet mysqld || systemctl is-active --quiet mariadb; then
echo -e "${GREEN}✓ MySQL服务正在运行${NC}"
else
echo -e "${RED}✗ MySQL服务未运行${NC}"
echo "正在启动MySQL服务..."
systemctl start mysql || systemctl start mysqld || systemctl start mariadb
sleep 2
fi
echo ""
echo "步骤 2/5: 输入MySQL root密码"
read -sp "请输入MySQL root密码: " MYSQL_ROOT_PASSWORD
echo ""
echo ""
# 测试MySQL连接
echo "测试MySQL连接..."
mysql -uroot -p"$MYSQL_ROOT_PASSWORD" -e "SELECT 1;" > /dev/null 2>&1
if [ $? -ne 0 ]; then
echo -e "${RED}✗ MySQL连接失败请检查root密码${NC}"
exit 1
fi
echo -e "${GREEN}✓ MySQL连接成功${NC}"
echo ""
echo "步骤 3/5: 创建数据库和用户"
read -sp "请输入新数据库用户的密码(按回车使用随机密码): " DB_PASSWORD
echo ""
if [ -z "$DB_PASSWORD" ]; then
# 生成随机密码
DB_PASSWORD=$(openssl rand -base64 16)
echo -e "${YELLOW}已生成随机密码: $DB_PASSWORD${NC}"
echo -e "${YELLOW}请务必保存此密码!${NC}"
fi
echo ""
# 创建数据库
mysql -uroot -p"$MYSQL_ROOT_PASSWORD" <<EOF
-- 删除旧数据库(如果存在)
DROP DATABASE IF EXISTS \`$DB_NAME\`;
-- 创建新数据库
CREATE DATABASE \`$DB_NAME\` DEFAULT CHARACTER SET $DB_CHARSET COLLATE $DB_COLLATE;
-- 创建用户(如果不存在)
CREATE USER IF NOT EXISTS '$DB_USER'@'localhost' IDENTIFIED BY '$DB_PASSWORD';
CREATE USER IF NOT EXISTS '$DB_USER'@'%' IDENTIFIED BY '$DB_PASSWORD';
-- 授权
GRANT ALL PRIVILEGES ON \`$DB_NAME\`.* TO '$DB_USER'@'localhost';
GRANT ALL PRIVILEGES ON \`$DB_NAME\`.* TO '$DB_USER'@'%';
-- 刷新权限
FLUSH PRIVILEGES;
EOF
if [ $? -eq 0 ]; then
echo -e "${GREEN}✓ 数据库和用户创建成功${NC}"
else
echo -e "${RED}✗ 数据库创建失败${NC}"
exit 1
fi
echo ""
echo "步骤 4/5: 导入数据库结构"
if [ -f "init_database.sql" ]; then
mysql -u"$DB_USER" -p"$DB_PASSWORD" "$DB_NAME" < init_database.sql
if [ $? -eq 0 ]; then
echo -e "${GREEN}✓ 数据库结构导入成功${NC}"
else
echo -e "${RED}✗ 数据库结构导入失败${NC}"
exit 1
fi
else
echo -e "${RED}✗ 找不到 init_database.sql 文件${NC}"
exit 1
fi
echo ""
echo "步骤 5/5: 验证数据库"
TABLE_COUNT=$(mysql -u"$DB_USER" -p"$DB_PASSWORD" "$DB_NAME" -sN -e "SELECT COUNT(*) FROM information_schema.tables WHERE table_schema = '$DB_NAME';")
echo "已创建 $TABLE_COUNT 个数据表"
if [ "$TABLE_COUNT" -ge 13 ]; then
echo -e "${GREEN}✓ 数据库部署成功!${NC}"
else
echo -e "${YELLOW}⚠ 表数量少于预期预期13个实际$TABLE_COUNT个${NC}"
fi
echo ""
echo "========================================"
echo " 部署完成!"
echo "========================================"
echo ""
echo "数据库信息:"
echo "----------------------------------------"
echo "数据库名: $DB_NAME"
echo "用户名: $DB_USER"
echo "密码: $DB_PASSWORD"
echo "字符集: $DB_CHARSET"
echo "排序规则: $DB_COLLATE"
echo "----------------------------------------"
echo ""
echo "请将以下配置添加到 application-prod.properties"
echo ""
echo "spring.datasource.url=jdbc:mysql://localhost:3306/$DB_NAME?useUnicode=true&characterEncoding=utf8&useSSL=false&serverTimezone=Asia/Shanghai"
echo "spring.datasource.username=$DB_USER"
echo "spring.datasource.password=$DB_PASSWORD"
echo ""
echo -e "${YELLOW}请务必保存数据库密码!${NC}"
echo ""

View File

@@ -1,467 +0,0 @@
-- ============================================
-- 宝塔面板数据库初始化SQL文件
-- 适用于MySQL/MariaDB数据库
-- ============================================
-- 创建数据库(如果不存在,请根据实际情况修改数据库名)
-- CREATE DATABASE IF NOT EXISTS `aigc_db` DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
-- USE `aigc_db`;
-- ============================================
-- 基础表结构
-- ============================================
-- 用户表
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 TEXT COMMENT '头像URL',
nickname VARCHAR(100),
gender VARCHAR(10),
birthday DATE,
address TEXT,
bio TEXT COMMENT '个人简介',
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_username (username),
INDEX idx_email (email),
INDEX idx_role (role),
INDEX idx_is_active (is_active),
INDEX idx_created_at (created_at)
) 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 COMMENT '订单号(不唯一,一个订单可以有多次支付尝试)',
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' COMMENT '支付状态PENDING, PROCESSING, SUCCESS, FAILED, CANCELLED',
description VARCHAR(500),
external_transaction_id VARCHAR(100) COMMENT '外部交易号(支付宝交易号等)',
callback_url VARCHAR(1000),
return_url VARCHAR(1000),
payment_url VARCHAR(2000) COMMENT '支付跳转URL',
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 COMMENT '用户ID',
order_id_ref BIGINT COMMENT '关联的订单ID外键',
FOREIGN KEY (user_id) REFERENCES users(id) ON DELETE SET NULL,
FOREIGN KEY (order_id_ref) REFERENCES orders(id) ON DELETE SET NULL,
INDEX idx_order_id (order_id),
INDEX idx_user_id (user_id),
INDEX idx_status (status),
INDEX idx_payment_method (payment_method),
INDEX idx_created_at (created_at)
) 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 COMMENT '等级名称(内部标识)',
display_name VARCHAR(50) NOT NULL COMMENT '显示名称',
description TEXT COMMENT '描述',
price DECIMAL(10,2) NOT NULL DEFAULT 0 COMMENT '价格(元)',
duration_days INT NOT NULL DEFAULT 30 COMMENT '时长(天)',
points_bonus INT NOT NULL DEFAULT 0 COMMENT '积分奖励',
resource_points INT NOT NULL DEFAULT 0 COMMENT '资源点数量',
features JSON COMMENT '功能特性JSON格式',
is_active BOOLEAN NOT NULL DEFAULT TRUE COMMENT '是否启用',
created_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
INDEX idx_name (name),
INDEX idx_is_active (is_active)
) 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),
INDEX idx_end_date (end_date)
) 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 COMMENT 'TEXT_TO_VIDEO, IMAGE_TO_VIDEO, STORYBOARD_VIDEO',
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' COMMENT 'PENDING, PROCESSING, COMPLETED, FAILED',
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 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' COMMENT 'STRING, NUMBER, BOOLEAN, JSON',
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='系统配置表';
-- 系统设置表(用于存储系统级别的设置)
CREATE TABLE IF NOT EXISTS system_settings (
id BIGINT PRIMARY KEY AUTO_INCREMENT,
standard_price_cny INT NOT NULL DEFAULT 0 COMMENT '标准版价格(元)',
pro_price_cny INT NOT NULL DEFAULT 0 COMMENT '专业版价格(元)',
points_per_generation INT NOT NULL DEFAULT 1 COMMENT '每次生成消耗的资源点',
site_name VARCHAR(100) NOT NULL DEFAULT 'AIGC Demo' COMMENT '站点名称',
site_subtitle VARCHAR(150) NOT NULL DEFAULT '现代化的Spring Boot应用演示' COMMENT '站点副标题',
registration_open BOOLEAN NOT NULL DEFAULT TRUE COMMENT '是否开放注册',
maintenance_mode BOOLEAN NOT NULL DEFAULT FALSE COMMENT '维护模式',
enable_alipay BOOLEAN NOT NULL DEFAULT TRUE COMMENT '启用支付宝',
enable_paypal BOOLEAN NOT NULL DEFAULT TRUE COMMENT '启用PayPal',
contact_email VARCHAR(120) DEFAULT 'support@example.com' COMMENT '联系邮箱'
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='系统设置表';
-- 用户活跃度统计表
CREATE TABLE IF NOT EXISTS user_activity_stats (
id BIGINT AUTO_INCREMENT PRIMARY KEY COMMENT '统计ID',
activity_date DATE NOT NULL UNIQUE COMMENT '统计日期',
daily_active_users INT NOT NULL DEFAULT 0 COMMENT '日活用户数',
monthly_active_users INT NOT NULL DEFAULT 0 COMMENT '月活用户数',
new_users INT NOT NULL DEFAULT 0 COMMENT '新增用户数',
returning_users INT NOT NULL DEFAULT 0 COMMENT '回访用户数',
session_count INT NOT NULL DEFAULT 0 COMMENT '会话数',
avg_session_duration DECIMAL(10,2) DEFAULT 0 COMMENT '平均会话时长(分钟)',
created_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
UNIQUE KEY uk_activity_date (activity_date),
INDEX idx_activity_date (activity_date)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='用户活跃度统计表';
-- 文生视频任务表
CREATE TABLE IF NOT EXISTS text_to_video_tasks (
id BIGINT AUTO_INCREMENT PRIMARY KEY COMMENT '任务ID',
task_id VARCHAR(50) NOT NULL UNIQUE COMMENT '任务唯一标识',
username VARCHAR(100) NOT NULL COMMENT '用户名',
prompt TEXT COMMENT '文本描述/提示词',
aspect_ratio VARCHAR(10) NOT NULL DEFAULT '16:9' COMMENT '宽高比16:9, 4:3, 1:1, 3:4, 9:16',
duration INT NOT NULL DEFAULT 5 COMMENT '视频时长5, 10, 15, 30',
hd_mode BOOLEAN NOT NULL DEFAULT FALSE COMMENT '是否高清模式',
status VARCHAR(20) NOT NULL DEFAULT 'PENDING' COMMENT '任务状态PENDING, PROCESSING, COMPLETED, FAILED, CANCELLED',
progress INT NOT NULL DEFAULT 0 COMMENT '进度0-100',
result_url TEXT COMMENT '结果视频URL',
real_task_id VARCHAR(100) COMMENT '外部API返回的真实任务ID',
error_message TEXT COMMENT '错误信息',
cost_points INT NOT NULL DEFAULT 0 COMMENT '消耗积分',
created_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
updated_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
completed_at TIMESTAMP NULL COMMENT '完成时间',
INDEX idx_username (username),
INDEX idx_status (status),
INDEX idx_created_at (created_at),
INDEX idx_task_id (task_id),
INDEX idx_real_task_id (real_task_id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='文生视频任务表';
-- 图生视频任务表
CREATE TABLE IF NOT EXISTS image_to_video_tasks (
id BIGINT AUTO_INCREMENT PRIMARY KEY COMMENT '任务ID',
task_id VARCHAR(50) NOT NULL UNIQUE COMMENT '任务唯一标识',
username VARCHAR(100) NOT NULL COMMENT '用户名',
first_frame_url VARCHAR(500) NOT NULL COMMENT '首帧图片URL',
last_frame_url VARCHAR(500) COMMENT '末帧图片URL',
prompt TEXT COMMENT '文本描述/提示词',
aspect_ratio VARCHAR(10) NOT NULL DEFAULT '16:9' COMMENT '宽高比16:9, 4:3, 1:1, 3:4, 9:16',
duration INT NOT NULL DEFAULT 5 COMMENT '视频时长5, 10, 15, 30',
hd_mode BOOLEAN NOT NULL DEFAULT FALSE COMMENT '是否高清模式',
status VARCHAR(20) NOT NULL DEFAULT 'PENDING' COMMENT '任务状态PENDING, PROCESSING, COMPLETED, FAILED, CANCELLED',
progress INT NOT NULL DEFAULT 0 COMMENT '进度0-100',
result_url TEXT COMMENT '结果视频URL',
real_task_id VARCHAR(100) COMMENT '外部API返回的真实任务ID',
error_message TEXT COMMENT '错误信息',
cost_points INT NOT NULL DEFAULT 0 COMMENT '消耗积分',
created_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
updated_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
completed_at TIMESTAMP NULL COMMENT '完成时间',
INDEX idx_username (username),
INDEX idx_status (status),
INDEX idx_created_at (created_at),
INDEX idx_task_id (task_id),
INDEX idx_real_task_id (real_task_id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='图生视频任务表';
-- ============================================
-- 任务队列相关表
-- ============================================
-- 任务队列表
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', 'STORYBOARD_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='任务队列表';
-- 积分冻结记录表
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', 'STORYBOARD_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='积分冻结记录表';
-- 用户作品表
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', 'STORYBOARD_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='用户作品表';
-- 任务状态表
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 COLLATE=utf8mb4_unicode_ci COMMENT='任务状态表';
-- 成功任务归档表
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='失败任务清理日志表';
-- 分镜视频任务表
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 COMMENT '文本描述/提示词',
image_url TEXT COMMENT '上传的参考图片URL可选',
aspect_ratio VARCHAR(10) NOT NULL COMMENT '宽高比16:9, 4:3, 1:1, 3:4, 9:16',
hd_mode BOOLEAN NOT NULL DEFAULT FALSE COMMENT '是否高清模式',
status VARCHAR(20) NOT NULL COMMENT '任务状态PENDING, PROCESSING, COMPLETED, FAILED, CANCELLED',
progress INT NOT NULL DEFAULT 0 COMMENT '进度0-100',
result_url LONGTEXT COMMENT '分镜图URLBase64编码的图片可能非常大- 网格图',
storyboard_images LONGTEXT COMMENT '单独的分镜图片JSON数组每张图片为Base64格式带data URI前缀',
real_task_id VARCHAR(255) COMMENT '外部API返回的真实任务ID',
video_task_ids TEXT COMMENT '多个视频任务IDJSON数组每张图片对应一个视频任务',
video_urls LONGTEXT COMMENT '多个视频URLJSON数组用于拼接',
error_message TEXT COMMENT '错误信息',
cost_points INT NOT NULL DEFAULT 0 COMMENT '消耗积分',
created_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
updated_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
completed_at TIMESTAMP NULL COMMENT '完成时间',
INDEX idx_username (username),
INDEX idx_status (status),
INDEX idx_task_id (task_id),
INDEX idx_created_at (created_at)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='分镜视频任务表';
-- ============================================
-- 初始化完成
-- ============================================
-- 所有表结构已创建完成
-- 注意:此文件仅创建表结构,不包含初始数据
-- 如需初始化数据请通过系统管理界面或API进行
--
-- 宝塔面板使用说明:
-- 1. 登录宝塔面板,进入"数据库" -> "phpMyAdmin"
-- 2. 选择或创建数据库建议数据库名aigc_platform
-- 3. 点击"导入" -> 选择此SQL文件 -> 执行
-- 4. 或者使用命令行mysql -u用户名 -p数据库名 < init_database.sql
--
-- 数据库配置建议:
-- - 数据库名aigc_platform
-- - 字符集utf8mb4
-- - 排序规则utf8mb4_unicode_ci
-- ============================================
-- 管理员权限设置
-- ============================================
-- 将 984523799@qq.com 设置为管理员
-- 如果该用户存在,则更新其角色为管理员
UPDATE users
SET role = 'ROLE_ADMIN',
updated_at = CURRENT_TIMESTAMP
WHERE email = '984523799@qq.com';

View File

@@ -1,13 +0,0 @@
-- 将 984523799@qq.com 设置为管理员
-- 执行此脚本前请确保已连接到正确的数据库
-- 更新用户角色为管理员
UPDATE users
SET role = 'ROLE_ADMIN',
updated_at = NOW()
WHERE email = '984523799@qq.com';
-- 验证更新结果
SELECT id, username, email, role, points, is_active, created_at, updated_at
FROM users
WHERE email = '984523799@qq.com';

View File

@@ -1,224 +0,0 @@
# 宝塔面板数据库部署指南
## 📋 部署清单
本部署包包含以下文件:
- `init_database.sql` - 完整的数据库初始化脚本(推荐使用)
- `update_admin_user.sql` - 管理员权限设置脚本
- `数据库完整结构-宝塔导入.sql` - 备用完整结构文件
## 🚀 快速部署步骤
### 第一步:创建数据库
1. 登录宝塔面板
2. 进入【数据库】菜单
3. 点击【添加数据库】
4. 填写以下信息:
- **数据库名**: `aigc_platform`
- **用户名**: `aigc_platform`(建议与数据库名相同)
- **密码**: 自动生成或自定义(请记录下来)
- **字符集**: `utf8mb4`
- **排序规则**: `utf8mb4_unicode_ci`
5. 点击【提交】创建数据库
### 第二步:导入数据库结构
#### 方式一使用phpMyAdmin推荐
1. 在宝塔面板【数据库】列表中,找到 `aigc_platform` 数据库
2. 点击右侧的【管理】按钮,进入 phpMyAdmin
3. 点击顶部菜单【导入】
4. 点击【选择文件】,选择 `init_database.sql`
5. 确保以下设置:
- 字符集:`utf8mb4`
- 格式:`SQL`
6. 点击页面底部【执行】按钮
7. 等待导入完成,显示成功提示
#### 方式二:使用命令行
```bash
# SSH登录服务器后执行
mysql -u aigc_platform -p aigc_platform < init_database.sql
# 输入数据库密码后回车
```
### 第三步:设置管理员权限
导入完成后,需要设置管理员账号权限:
#### 方式一自动设置已包含在init_database.sql中
如果使用 `init_database.sql` 导入,管理员权限已自动设置,无需额外操作。
#### 方式二:手动设置
如果需要手动设置或更改管理员,可以执行 `update_admin_user.sql`
1. 在 phpMyAdmin 中点击【SQL】标签
2.`update_admin_user.sql` 的内容粘贴到文本框
3. 点击【执行】
或者直接在SQL中执行
```sql
UPDATE users
SET role = 'ROLE_ADMIN',
updated_at = CURRENT_TIMESTAMP
WHERE email = '984523799@qq.com';
```
### 第四步:验证数据库
在 phpMyAdmin 或命令行中执行以下查询,验证表结构是否正确:
```sql
-- 查看所有表
SHOW TABLES;
-- 验证管理员用户(如果已注册)
SELECT id, username, email, role, points, created_at
FROM users
WHERE email = '984523799@qq.com';
```
应该看到以下表:
- `users` - 用户表
- `payments` - 支付表
- `orders` - 订单表
- `order_items` - 订单项表
- `text_to_video_tasks` - 文生视频任务表
- `image_to_video_tasks` - 图生视频任务表
- `storyboard_video_tasks` - 分镜视频任务表
- `task_queue` - 任务队列表
- `task_status` - 任务状态表
- `user_works` - 用户作品表
- `user_membership` - 会员表
- `user_activity_stats` - 用户活动统计表
- `failed_tasks_cleanup_log` - 失败任务清理日志表
## 📝 数据库配置信息
部署完成后,需要在应用配置文件中填写数据库信息:
**文件位置**: `src/main/resources/application-prod.properties`
```properties
# 数据库配置
spring.datasource.url=jdbc:mysql://服务器IP:3306/aigc_platform?useUnicode=true&characterEncoding=utf8&useSSL=false&serverTimezone=Asia/Shanghai&allowPublicKeyRetrieval=true
spring.datasource.username=aigc_platform
spring.datasource.password=你的数据库密码
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
```
**重要参数说明**
- `服务器IP`:
- 如果应用与数据库在同一服务器:使用 `localhost``127.0.0.1`
- 如果数据库在其他服务器使用数据库服务器的IP地址
- `你的数据库密码`: 第一步创建数据库时设置的密码
## 🔒 安全建议
### 1. 数据库访问权限
- 在宝塔面板【数据库】中,点击数据库的【权限】
- 如果应用和数据库在同一服务器,设置为【本地服务器】
- 如果需要远程访问设置【所有人】或指定IP但要确保密码强度足够
### 2. 数据库密码强度
- 使用包含大小写字母、数字、特殊字符的强密码
- 密码长度建议16位以上
### 3. 定期备份
在宝塔面板设置自动备份:
1. 进入【计划任务】
2. 添加【备份数据库】任务
3. 选择 `aigc_platform` 数据库
4. 设置备份周期(建议每天备份)
5. 设置保留份数建议保留7-30份
## ⚙️ 数据库性能优化
### 1. 连接池配置已包含在application配置中
```properties
# 连接池配置支持50-100人并发
spring.datasource.hikari.maximum-pool-size=50
spring.datasource.hikari.minimum-idle=10
spring.datasource.hikari.idle-timeout=300000
spring.datasource.hikari.max-lifetime=1200000
spring.datasource.hikari.connection-timeout=30000
```
### 2. MySQL配置优化
在宝塔面板【软件商店】->【MySQL】->【设置】->【配置修改】中调整:
```ini
# 根据服务器内存调整示例为4GB内存
innodb_buffer_pool_size = 1G
max_connections = 500
query_cache_size = 128M
tmp_table_size = 64M
max_heap_table_size = 64M
```
## 🐛 常见问题
### 1. 导入失败:字符集错误
**解决方案**
- 确保数据库字符集为 `utf8mb4`
- 在导入时选择字符集为 `utf8mb4`
### 2. 连接失败Access denied
**解决方案**
- 检查数据库用户名和密码是否正确
- 检查数据库访问权限设置
### 3. 表已存在错误
**解决方案**
- 如果是重新部署,先删除旧数据库或清空所有表
- 在 phpMyAdmin 中选择数据库,点击【操作】->【清空数据库】
### 4. 管理员权限未生效
**原因**:用户还未注册
**解决方案**
1. 先在前端使用 `984523799@qq.com` 注册账号
2. 注册完成后,数据库会自动将该用户设置为管理员(因为 `data.sql` 中有自动更新脚本)
3. 或者注册后手动执行 `update_admin_user.sql`
## 📊 数据库监控
在宝塔面板可以监控数据库状态:
1. 进入【数据库】菜单
2. 点击数据库名称右侧的【监控】
3. 查看:
- 查询次数
- 慢查询
- 连接数
- 缓存命中率
## 📞 技术支持
如遇到问题,请检查:
1. 宝塔面板【日志】中的 MySQL 错误日志
2. 应用日志中的数据库连接错误
3. 确保 MySQL 服务正在运行
---
**部署完成标志**
- ✅ 数据库创建成功
- ✅ 表结构导入成功13个表
- ✅ 管理员权限设置完成
- ✅ 应用能够成功连接数据库
祝部署顺利!🎉

View File

@@ -1,370 +0,0 @@
-- ============================================
-- 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;

View File

@@ -1,227 +0,0 @@
# 宝塔数据库部署检查清单
部署日期: _______________
操作人员: _______________
## 📋 部署前准备
### 1. 服务器环境检查
- [ ] 服务器已安装宝塔面板(版本: ______
- [ ] MySQL/MariaDB已安装版本: ______
- [ ] MySQL服务运行正常
- [ ] 服务器内存 >= 2GB推荐4GB+
- [ ] 磁盘空间 >= 10GB
### 2. 部署包确认
- [ ] 已下载 `database_baota_deploy.zip`
- [ ] 已解压到服务器
- [ ] 包含以下文件:
- [ ] init_database.sql
- [ ] update_admin_user.sql
- [ ] 数据库完整结构-宝塔导入.sql
- [ ] 宝塔数据库部署指南.md
- [ ] README.md
- [ ] deploy_database.sh
## 🚀 部署步骤
### 第一步:创建数据库
- [ ] 登录宝塔面板
- [ ] 进入【数据库】菜单
- [ ] 点击【添加数据库】
- [ ] 数据库名: `aigc_platform`
- [ ] 用户名: `aigc_platform`
- [ ] 密码: ___________________________(请记录)
- [ ] 字符集: `utf8mb4`
- [ ] 排序规则: `utf8mb4_unicode_ci`
- [ ] 创建成功
### 第二步:导入数据库
- [ ] 点击数据库【管理】按钮
- [ ] 进入phpMyAdmin
- [ ] 点击【导入】标签
- [ ] 选择 `init_database.sql` 文件
- [ ] 字符集选择 `utf8mb4`
- [ ] 点击【执行】
- [ ] 导入成功(显示成功消息)
### 第三步:验证数据库
- [ ] 在phpMyAdmin中点击左侧数据库名
- [ ] 查看表列表
- [ ] 确认包含13个表
- [ ] users
- [ ] payments
- [ ] orders
- [ ] order_items
- [ ] text_to_video_tasks
- [ ] image_to_video_tasks
- [ ] storyboard_video_tasks
- [ ] task_queue
- [ ] task_status
- [ ] user_works
- [ ] user_membership
- [ ] user_activity_stats
- [ ] failed_tasks_cleanup_log
### 第四步:配置管理员
- [ ] 管理员邮箱: `984523799@qq.com`
- [ ] 已在 `init_database.sql` 中自动配置
- [ ] 或手动执行 `update_admin_user.sql`
## ⚙️ 应用配置
### 更新配置文件
- [ ] 找到文件: `src/main/resources/application-prod.properties`
- [ ] 更新以下配置:
```properties
spring.datasource.url=jdbc:mysql://localhost:3306/aigc_platform?...
spring.datasource.username=aigc_platform
spring.datasource.password=你的数据库密码
```
配置信息记录:
```
数据库地址: _______________________________
数据库端口: 3306
数据库名: aigc_platform
用户名: aigc_platform
密码: _______________________________
```
## 🔒 安全配置
### 数据库访问权限
- [ ] 设置访问权限(本地服务器/所有人/指定IP
- [ ] 权限类型: _______________________
### 防火墙配置(如需远程连接)
- [ ] 开放3306端口
- [ ] 或使用SSH隧道
### 备份配置
- [ ] 在宝塔面板设置自动备份
- [ ] 备份周期: 每天 / 每周(选择一个)
- [ ] 保留份数: _______
- [ ] 备份位置: _______________________
## ✅ 功能测试
### 数据库连接测试
- [ ] 使用命令行测试连接:
```bash
mysql -uaigc_platform -p aigc_platform
```
- [ ] 连接成功
### 表查询测试
- [ ] 执行查询:
```sql
SHOW TABLES;
SELECT COUNT(*) FROM users;
```
- [ ] 查询成功
### 管理员账号验证(注册后执行)
- [ ] 使用 `984523799@qq.com` 注册账号
- [ ] 执行查询验证角色:
```sql
SELECT id, username, email, role FROM users WHERE email = '984523799@qq.com';
```
- [ ] role = 'ROLE_ADMIN' ✓
### 应用连接测试
- [ ] 启动Spring Boot应用
- [ ] 查看日志,确认数据库连接成功
- [ ] 无数据库连接错误
## 📊 性能优化(可选)
### MySQL配置优化
- [ ] 调整 `innodb_buffer_pool_size`
- [ ] 调整 `max_connections`
- [ ] 调整 `query_cache_size`
### 连接池配置
- [ ] 已配置HikariCP连接池
- [ ] maximum-pool-size: 50
- [ ] minimum-idle: 10
## 🐛 问题记录
遇到的问题及解决方案:
| 问题描述 | 解决方案 | 解决时间 |
|---------|---------|---------|
| | | |
| | | |
| | | |
## 📝 部署总结
### 部署结果
- [ ] 部署成功 ✅
- [ ] 部署失败 ❌(原因: _____________
### 部署时间记录
- 开始时间: _______________
- 结束时间: _______________
- 总耗时: _______________
### 资源使用
- 数据库大小: _______ MB
- 表数量: 13
- 索引数量: _______
### 后续工作
- [ ] 监控数据库性能
- [ ] 设置定期备份
- [ ] 配置数据库监控告警
- [ ] 文档归档
## 📞 联系信息
### 技术支持
- 部署文档: README.md
- 详细指南: 宝塔数据库部署指南.md
### 应急联系
- 运维人员: _______________
- 联系电话: _______________
- 备用联系: _______________
---
**部署负责人签名**: _______________
**审核人签名**: _______________
**日期**: _______________
---
## 附录:常用命令
```bash
# 查看MySQL状态
systemctl status mysql
# 重启MySQL
systemctl restart mysql
# 查看数据库列表
mysql -uroot -p -e "SHOW DATABASES;"
# 备份数据库
mysqldump -uaigc_platform -p aigc_platform > backup.sql
# 恢复数据库
mysql -uaigc_platform -p aigc_platform < backup.sql
# 查看表大小
SELECT table_name, ROUND(((data_length + index_length) / 1024 / 1024), 2) AS "Size (MB)"
FROM information_schema.TABLES
WHERE table_schema = 'aigc_platform'
ORDER BY (data_length + index_length) DESC;
```
**部署清单版本**: 1.0
**更新日期**: 2025-11-10

View File

@@ -0,0 +1,38 @@
-- ============================================
-- 数据库结构更新脚本 (完整版)
-- 日期: 2025-12-03
-- 说明: 将存储Base64图片的字段从TEXT升级为LONGTEXT
-- ============================================
-- 选择数据库
USE aigc_platform;
-- ============================================
-- 1. storyboard_video_tasks 表 (分镜视频任务)
-- ============================================
ALTER TABLE storyboard_video_tasks MODIFY COLUMN image_url LONGTEXT;
ALTER TABLE storyboard_video_tasks MODIFY COLUMN result_url LONGTEXT;
ALTER TABLE storyboard_video_tasks MODIFY COLUMN storyboard_images LONGTEXT;
ALTER TABLE storyboard_video_tasks MODIFY COLUMN video_urls LONGTEXT;
-- ============================================
-- 2. user_works 表 (用户作品)
-- ============================================
ALTER TABLE user_works MODIFY COLUMN result_url LONGTEXT;
ALTER TABLE user_works MODIFY COLUMN thumbnail_url LONGTEXT;
-- ============================================
-- 3. image_to_video_tasks 表 (图生视频任务)
-- ============================================
ALTER TABLE image_to_video_tasks MODIFY COLUMN result_url LONGTEXT;
-- ============================================
-- 验证结果
-- ============================================
SELECT '=== 验证修改结果 ===' AS info;
SELECT TABLE_NAME, COLUMN_NAME, DATA_TYPE
FROM information_schema.COLUMNS
WHERE TABLE_SCHEMA = 'aigc_platform'
AND COLUMN_NAME IN ('image_url', 'result_url', 'thumbnail_url', 'storyboard_images', 'video_urls')
AND TABLE_NAME IN ('storyboard_video_tasks', 'user_works', 'image_to_video_tasks')
ORDER BY TABLE_NAME, COLUMN_NAME;

74
demo/deploy-to-server.sh Normal file
View File

@@ -0,0 +1,74 @@
#!/bin/bash
# ============================================
# AIGC项目部署脚本沙箱测试环境
# ============================================
echo "🚀 开始部署 AIGC 项目到生产服务器..."
# 配置变量
SERVER="root@vionow.com"
REMOTE_DIR="/opt/aigc"
JAR_FILE="target/demo-0.0.1-SNAPSHOT.jar"
FRONTEND_DIR="frontend/dist"
# 检查JAR文件是否存在
if [ ! -f "$JAR_FILE" ]; then
echo "❌ JAR文件不存在请先运行 mvnw clean package"
exit 1
fi
# 检查前端文件是否存在
if [ ! -d "$FRONTEND_DIR" ]; then
echo "❌ 前端dist目录不存在请先运行 npm run build"
exit 1
fi
# 1. 上传后端JAR文件
echo "📦 上传后端JAR文件..."
scp "$JAR_FILE" "$SERVER:$REMOTE_DIR/"
# 2. 上传前端文件
echo "📦 上传前端文件..."
scp -r "$FRONTEND_DIR"/* "$SERVER:/var/www/html/"
# 3. 在服务器上重启服务
echo "🔄 重启服务..."
ssh "$SERVER" << 'ENDSSH'
# 停止旧服务
echo "⏹️ 停止旧服务..."
pkill -f demo-0.0.1-SNAPSHOT.jar
sleep 3
# 启动新服务
echo "▶️ 启动新服务..."
cd /opt/aigc
nohup java -jar demo-0.0.1-SNAPSHOT.jar \
--spring.profiles.active=prod \
--spring.config.additional-location=file:./application-prod.properties \
> app.log 2>&1 &
# 等待启动
sleep 5
# 检查服务状态
if pgrep -f demo-0.0.1-SNAPSHOT.jar > /dev/null; then
echo "✅ 服务启动成功!"
echo "📋 最新日志:"
tail -n 20 app.log
else
echo "❌ 服务启动失败,请检查日志:"
tail -n 50 app.log
exit 1
fi
ENDSSH
echo ""
echo "✅ 部署完成!"
echo "🌐 访问地址:"
echo " 前端https://vionow.com"
echo " 后端https://vionow.com/api/"
echo " Swaggerhttps://vionow.com/swagger-ui.html"
echo ""
echo "📋 查看实时日志:"
echo " ssh $SERVER 'tail -f /opt/aigc/app.log'"

View File

@@ -1,80 +0,0 @@
# API 接口文档使用说明
## 访问地址
启动应用后,可以通过以下地址访问 API 文档:
- **Swagger UI 界面**: http://localhost:8080/swagger-ui.html
- **API 文档 JSON**: http://localhost:8080/v3/api-docs
- **所有API分组**: http://localhost:8080/v3/api-docs/all
## 环境地址
根据部署环境,访问地址会有所不同:
- **本地开发**: http://localhost:8080/swagger-ui.html
- **内网环境**: http://172.22.0.1:8080/swagger-ui.html
- **生产环境**: https://vionow.com/swagger-ui.html
## API 分组
文档按功能模块分为以下分组:
1. **所有API (all)** - 查看所有接口
2. **认证授权 (auth)** - 用户登录、注册、验证码等
3. **用户作品 (user-works)** - 用户作品管理
4. **视频生成 (video-generation)** - 文生视频、图生视频、分镜视频
5. **支付管理 (payment)** - 订单、支付相关接口
6. **会员管理 (member)** - 会员订阅、会员管理
7. **积分系统 (points)** - 积分相关接口
8. **任务管理 (tasks)** - 任务队列、任务状态
9. **管理后台 (admin)** - 管理员功能、数据分析
10. **系统设置 (settings)** - 系统配置、API密钥管理
11. **公共接口 (public)** - 无需认证的公共接口
## 使用 JWT 认证
大部分接口需要 JWT 认证,使用步骤如下:
1. 在 Swagger UI 页面右上角点击 **"Authorize"** 按钮
2. 在弹出框中输入 JWT Token格式`Bearer {token}` 或直接输入 token
3. 点击 **"Authorize"** 确认
4. 之后所有请求都会自动携带认证信息
### 获取 Token
1. 调用 `/api/verification/email/send` 发送邮箱验证码
2. 调用 `/api/auth/login/email` 使用邮箱和验证码登录
3. 从响应中获取 `token` 字段
4. 在 Swagger UI 中使用该 token 进行认证
## 功能特性
- ✅ 自动生成 API 文档
- ✅ 在线测试接口
- ✅ 支持 JWT 认证
- ✅ API 分组管理
- ✅ 请求/响应示例
- ✅ 参数说明和验证规则
## 注意事项
1. **生产环境**: 建议在生产环境中限制 Swagger UI 的访问,或完全禁用
2. **认证**: 大部分接口需要 JWT Token请先登录获取 Token
3. **权限**: 部分接口需要管理员权限,普通用户无法访问
4. **跨域**: 如果遇到跨域问题,请检查 CORS 配置
## 禁用 Swagger UI生产环境
如果需要在生产环境禁用 Swagger UI可以在 `application-prod.properties` 中添加:
```properties
springdoc.swagger-ui.enabled=false
```
或者通过环境变量:
```bash
export SPRINGDOC_SWAGGER_UI_ENABLED=false
```

View File

@@ -1,74 +0,0 @@
# 宝塔面板部署说明
## 文件结构
- backend/ - 后端部署文件
- app.jar - Spring Boot应用JAR包
- start.sh - 启动脚本
- application-prod.properties.template - 配置文件模板
- frontend/ - 前端部署文件
- dist/ - 前端构建产物
- nginx.conf - Nginx配置示例
## 部署步骤
### 1. 数据库部署
1. 解压 database_baota_*.zip
2. 登录宝塔面板 -> 数据库 -> phpMyAdmin
3. 创建数据库aigc_platform
4. 导入 init_database.sql
### 2. 后端部署
1. 上传 backend/ 目录到服务器(如:/www/wwwroot/aigc-backend
2. 修改配置文件:
- 复制 application-prod.properties.template 为 application-prod.properties
- 修改数据库连接信息默认172.22.0.2:3306
- 修改JWT密钥、AI API密钥等
- 注意:数据库地址已配置为 172.22.0.2,请根据实际环境调整
3. 安装Java 21如未安装
- 宝塔面板 -> 软件商店 -> 安装 Java项目管理器
- 或手动安装yum install java-21-openjdk
4. 设置启动脚本权限:
chmod +x /www/wwwroot/aigc-backend/start.sh
5. 启动后端:
cd /www/wwwroot/aigc-backend
./start.sh start
6. 检查日志:
tail -f logs/app.log
### 3. 前端部署
1. 上传 frontend/dist/ 目录内容到网站根目录(如:/www/wwwroot/your-domain.com
2. 配置Nginx
- 宝塔面板 -> 网站 -> 选择网站 -> 设置 -> 配置文件
- 参考 frontend/nginx.conf 配置反向代理
- 修改 server_name 为实际域名
- 修改 root 为实际网站目录
- 注意:后端代理地址已配置为 172.22.0.1:8080请根据实际环境调整
3. 重启Nginx
systemctl restart nginx
### 4. 防火墙设置
- 开放端口80HTTP、443HTTPS、8080后端如需要外网访问
- 宝塔面板 -> 安全 -> 添加端口规则
### 5. SSL证书推荐
- 宝塔面板 -> 网站 -> SSL -> Let's Encrypt免费证书
## 常用命令
### 后端管理
- 启动:./start.sh start
- 停止:./start.sh stop
- 重启:./start.sh restart
- 状态:./start.sh status
- 查看日志tail -f logs/app.log
### 前端管理
- 重启Nginxsystemctl restart nginx
- 查看Nginx日志tail -f /www/wwwroot/logs/your-domain.com.log
## 注意事项
1. 确保Java版本为21
2. 确保MySQL版本为8.0+
3. 确保服务器内存至少4GB推荐8GB
4. 配置文件中的敏感信息请妥善保管
5. 定期备份数据库和上传文件

View File

@@ -1,312 +0,0 @@
# 项目路由分析报告
## 统一前缀路由
### API 路由前缀
**主要前缀:`/api/`**
所有后端 REST API 接口统一使用 `/api/` 作为前缀。
## 详细路由分类
### 1. REST API 路由(`/api/`
#### 认证授权模块
- `/api/auth/**` - 用户认证(登录、注册)
- `/api/verification/**` - 验证码服务
- `/api/email/**` - 邮件服务
- `/api/tencent/**` - 腾讯云服务集成
#### 视频生成模块
- `/api/text-to-video/**` - 文生视频
- `/api/image-to-video/**` - 图生视频
- `/api/storyboard-video/**` - 分镜视频
#### 用户作品模块
- `/api/works/**` - 用户作品管理
#### 支付订单模块
- `/api/payments/**` - 支付相关
- `/api/payments/alipay/**` - 支付宝支付
- `/api/orders/**` - 订单管理
#### 会员积分模块
- `/api/members/**` - 会员管理
- `/api/points/**` - 积分系统
#### 任务管理模块
- `/api/task-queue/**` - 任务队列
- `/api/task-status/**` - 任务状态
- `/api/cleanup/**` - 任务清理
#### 管理后台模块
- `/api/admin/**` - 管理员接口
- `/api/dashboard/**` - 数据仪表盘
- `/api/analytics/**` - 数据分析
#### 系统设置模块
- `/api/api-key/**` - API 密钥管理
- `/api/prompt/**` - 提示词优化
#### 测试诊断模块
- `/api/test/**` - 测试接口
- `/api/diagnostic/**` - 诊断接口
- `/api/polling/**` - 轮询测试
- `/api/polling-diagnostic/**` - 轮询诊断
- `/api/monitor/**` - 监控接口
#### 公共接口
- `/api/public/**` - 公共API无需认证
- `/api/health/**` - 健康检查接口
### 2. 页面路由(非 API
#### 用户页面
- `/login` - 登录页面
- `/register` - 注册页面
- `/payment/**` - 支付页面
- `/orders/**` - 订单页面
#### 管理员页面
- `/settings/**` - 系统设置页面(管理员)
- `/users/**` - 用户管理页面(管理员)
#### 开发工具
- `/h2-console/**` - H2 数据库控制台(开发环境)
### 3. API 文档路由
- `/swagger-ui.html` - Swagger UI 主页
- `/swagger-ui/**` - Swagger UI 资源
- `/v3/api-docs/**` - OpenAPI 文档 JSON
- `/swagger-resources/**` - Swagger 资源
- `/webjars/**` - Web 资源库
### 4. 静态资源路由
- `/css/**` - CSS 样式文件
- `/js/**` - JavaScript 文件
- `/uploads/**` - 上传文件
## 路由代理配置
### Nginx 代理配置
#### 1. API 代理(推荐配置)
```nginx
# API 代理到后端
location /api/ {
proxy_pass http://172.22.0.1:8080/;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
# 超时设置(视频生成可能需要较长时间)
proxy_connect_timeout 30s;
proxy_send_timeout 900s;
proxy_read_timeout 900s;
# 支持大文件上传
client_max_body_size 600M;
}
```
#### 2. Swagger UI 代理(可选,用于生产环境)
```nginx
# API 文档代理
location ~ ^/(swagger-ui|v3/api-docs|swagger-resources|webjars) {
proxy_pass http://172.22.0.1:8080;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}
```
#### 3. 上传文件代理
```nginx
# 上传文件代理
location /uploads/ {
proxy_pass http://172.22.0.1:8080;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
# 缓存设置
expires 7d;
add_header Cache-Control "public, immutable";
}
```
#### 4. WebSocket 支持(如果需要)
```nginx
location /ws/ {
proxy_pass http://172.22.0.1:8080;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}
```
### Apache 代理配置(如果使用 Apache
```apache
# 启用代理模块
LoadModule proxy_module modules/mod_proxy.so
LoadModule proxy_http_module modules/mod_proxy_http.so
# API 代理
ProxyPass /api/ http://172.22.0.1:8080/
ProxyPassReverse /api/ http://172.22.0.1:8080/
# Swagger UI 代理
ProxyPass /swagger-ui/ http://172.22.0.1:8080/swagger-ui/
ProxyPassReverse /swagger-ui/ http://172.22.0.1:8080/swagger-ui/
ProxyPass /v3/api-docs/ http://172.22.0.1:8080/v3/api-docs/
ProxyPassReverse /v3/api-docs/ http://172.22.0.1:8080/v3/api-docs/
```
## 权限配置
### 无需认证(公开访问)
```
/login
/register
/api/public/**
/api/auth/**
/api/verification/**
/api/email/**
/api/tencent/**
/api/test/**
/api/orders/stats
/api/payments/alipay/notify
/api/payments/alipay/return
/swagger-ui/**
/v3/api-docs/**
```
### 需要认证
```
/api/orders/**(除 /api/orders/stats
/api/payments/**(除支付宝回调)
/api/image-to-video/**
/api/text-to-video/**
/api/works/**
/api/points/**
/api/members/**
```
### 需要管理员权限
```
/api/dashboard/**
/api/admin/**
/settings/**
/users/**
```
## 完整 Nginx 配置示例
```nginx
server {
listen 80;
server_name localhost;
root /www/wwwroot/your-domain.com;
index index.html index.htm;
# 开启gzip压缩
gzip on;
gzip_vary on;
gzip_min_length 1024;
gzip_types text/plain text/css application/json application/javascript text/xml application/xml application/xml+rss text/javascript application/vnd.ms-fontobject application/x-font-ttf font/opentype image/svg+xml image/x-icon;
# 前端路由支持History模式
location / {
try_files $uri $uri/ /index.html;
}
# API 代理到后端(主要路由)
location /api/ {
proxy_pass http://172.22.0.1:8080/;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
# 超时设置
proxy_connect_timeout 30s;
proxy_send_timeout 900s;
proxy_read_timeout 900s;
# 支持大文件上传
client_max_body_size 600M;
}
# Swagger UI 代理
location ~ ^/(swagger-ui|v3/api-docs|swagger-resources|webjars) {
proxy_pass http://172.22.0.1:8080;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}
# 上传文件代理
location /uploads/ {
proxy_pass http://172.22.0.1:8080;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
expires 7d;
add_header Cache-Control "public, immutable";
}
# 静态资源缓存
location ~* \.(js|css|png|jpg|jpeg|gif|ico|svg|woff|woff2|ttf|eot)$ {
expires 1y;
add_header Cache-Control "public, immutable";
}
# 禁止访问隐藏文件
location ~ /\. {
deny all;
access_log off;
log_not_found off;
}
}
```
## 宝塔面板配置
在宝塔面板中配置反向代理:
1. 进入网站设置 → 反向代理
2. 添加反向代理规则:
- **代理名称**: API代理
- **目标URL**: http://172.22.0.1:8080
- **发送域名**: $host
- **代理路径**: /api/
- **缓存**: 关闭
## 总结
- **统一API前缀**: `/api/`
- **后端服务地址**: `http://172.22.0.1:8080`
- **主要代理路径**: `/api/``http://172.22.0.1:8080/`
- **文档访问**: `/swagger-ui.html`
- **特殊配置**: 需要支持大文件上传600M和长时间请求15分钟

View File

@@ -1,108 +0,0 @@
# 生产环境配置
spring.h2.console.enabled=false
# MySQL DataSource (PROD) - 使用环境变量
spring.datasource.url=jdbc:mysql://mysql:3306/aigc_platform?useUnicode=true&characterEncoding=utf8&useSSL=false&serverTimezone=Asia/Shanghai&allowPublicKeyRetrieval=true
spring.datasource.driverClassName=com.mysql.cj.jdbc.Driver
spring.datasource.username= aigc_user
spring.datasource.password= jRbHPZbbkdm24yTT
# 数据库连接池配置 (生产环境 - 支持50人并发)
spring.datasource.hikari.maximum-pool-size=30
spring.datasource.hikari.minimum-idle=5
spring.datasource.hikari.idle-timeout=300000
spring.datasource.hikari.max-lifetime=1200000
spring.datasource.hikari.connection-timeout=30000
spring.datasource.hikari.leak-detection-threshold=60000
spring.datasource.hikari.validation-timeout=3000
spring.datasource.hikari.connection-test-query=SELECT 1
# 生产环境:使用 update 模式自动创建/更新表结构(首次部署)
# 部署完成后可改为 validate 模式以提高安全性
spring.jpa.hibernate.ddl-auto=update
spring.jpa.show-sql=false
spring.jpa.properties.hibernate.format_sql=false
# 禁用 SQL 脚本自动运行
spring.sql.init.mode=never
# Thymeleaf 可启用缓存
spring.thymeleaf.cache=true
# AI API配置 (生产环境)
# 文生视频、图生视频、分镜视频都使用Comfly API
ai.api.base-url=${AI_API_BASE_URL:https://ai.comfly.chat}
ai.api.key=${AI_API_KEY}
# 文生图使用Comfly API
ai.image.api.base-url=${AI_IMAGE_API_BASE_URL:https://ai.comfly.chat}
ai.image.api.key=${AI_IMAGE_API_KEY}
# 支付宝配置 (生产环境)
alipay.app-id=${ALIPAY_APP_ID}
alipay.private-key=${ALIPAY_PRIVATE_KEY}
alipay.public-key=${ALIPAY_PUBLIC_KEY}
alipay.gateway-url=https://openapi.alipay.com/gateway.do
alipay.charset=UTF-8
alipay.sign-type=RSA2
alipay.domain=${ALIPAY_DOMAIN:https://vionow.com}
alipay.notify-url=${ALIPAY_NOTIFY_URL:https://vionow.com/api/payments/alipay/notify}
alipay.return-url=${ALIPAY_RETURN_URL:https://vionow.com/payment/success}
# JWT配置 - 使用环境变量
jwt.secret=${JWT_SECRET}
jwt.expiration=${JWT_EXPIRATION:604800000}
# 腾讯云SES配置 (生产环境)
tencent.ses.secret-id=${TENCENT_SES_SECRET_ID}
tencent.ses.secret-key=${TENCENT_SES_SECRET_KEY}
tencent.ses.region=ap-hongkong
tencent.ses.from-email=${TENCENT_SES_FROM_EMAIL}
tencent.ses.from-name=AIGC平台
# 邮件模板ID在腾讯云SES控制台创建模板后获取
# 如果未配置或为0将使用开发模式仅记录日志
tencent.ses.template-id=${TENCENT_SES_TEMPLATE_ID}
# Tomcat线程池配置 (生产环境 - 支持50人并发)
server.tomcat.threads.max=150
server.tomcat.threads.min-spare=20
server.tomcat.max-connections=500
server.tomcat.accept-count=100
server.tomcat.connection-timeout=20000
# 生产环境日志配置
logging.level.root=INFO
logging.level.com.example.demo=INFO
logging.level.org.springframework.security=WARN
logging.file.name=${LOG_FILE_PATH:./logs/application.log}
logging.pattern.file=%d{yyyy-MM-dd HH:mm:ss} [%thread] %-5level %logger{36} - %msg%n
# 视频处理配置
# 临时文件目录(相对路径:基于应用运行目录,或绝对路径)
# 生产环境建议使用绝对路径,如:/app/temp 或 C:\app\temp
app.temp.dir=${TEMP_DIR:./temp}
# FFmpeg路径如果FFmpeg在PATH中使用 "ffmpeg",否则使用完整路径)
# 生产环境建议使用完整路径,如:/usr/bin/ffmpeg 或 C:\ffmpeg\bin\ffmpeg.exe
app.ffmpeg.path=${FFMPEG_PATH:ffmpeg}
# 文件上传配置
# 上传文件保存目录(相对路径:基于应用运行目录,或绝对路径)
# 生产环境建议使用绝对路径,如:/app/uploads 或 C:\app\uploads
# 注意:确保应用有读写权限
app.upload.path=${UPLOAD_PATH:./uploads}
# SpringDoc OpenAPI (Swagger) 配置
# 生产环境建议禁用或限制访问
springdoc.api-docs.path=/v3/api-docs
springdoc.swagger-ui.path=/swagger-ui.html
springdoc.swagger-ui.enabled=true
springdoc.swagger-ui.operationsSorter=method
springdoc.swagger-ui.tagsSorter=alpha
springdoc.swagger-ui.tryItOutEnabled=true
springdoc.swagger-ui.filter=true
springdoc.swagger-ui.display-request-duration=true
springdoc.swagger-ui.doc-expansion=none

View File

@@ -1,49 +0,0 @@
# 生产环境配置文件模板
# 复制此文件为 application-prod.properties 并修改相应配置
# 数据库配置
spring.datasource.url=jdbc:mysql://172.22.0.2:3306/aigc_platform?useUnicode=true&characterEncoding=utf8&useSSL=false&serverTimezone=Asia/Shanghai&allowPublicKeyRetrieval=true
spring.datasource.username=your_db_username
spring.datasource.password=your_db_password
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
# JPA配置
spring.jpa.hibernate.ddl-auto=update
spring.jpa.show-sql=false
spring.jpa.properties.hibernate.format_sql=false
# JWT配置
jwt.secret=your-jwt-secret-key-change-this-in-production
jwt.expiration=86400000
# AI API配置
ai.api.base-url=https://ai.comfly.chat
ai.api.key=your-ai-api-key
ai.image.api.base-url=https://ai.comfly.chat
ai.image.api.key=your-ai-image-api-key
# 文件上传配置
app.upload.path=./uploads
app.temp.dir=./temp
app.log.file.path=./logs/application.log
# FFmpeg配置
app.ffmpeg.path=ffmpeg
# 支付宝配置(可选)
alipay.app-id=your-alipay-app-id
alipay.private-key=your-alipay-private-key
alipay.public-key=your-alipay-public-key
alipay.domain=https://vionow.com
alipay.notify-url=https://vionow.com/api/payments/alipay/notify
alipay.return-url=https://vionow.com/payment/success
# 服务器配置
server.port=8080
server.servlet.context-path=/
# 日志配置
logging.level.root=INFO
logging.level.com.example.demo=INFO

View File

@@ -1,111 +0,0 @@
#!/bin/bash
# 宝塔面板后端启动脚本
# 设置JAVA_HOME根据实际Java安装路径修改
# export JAVA_HOME=/usr/lib/jvm/java-21-openjdk
# export PATH=$JAVA_HOME/bin:$PATH
# 应用配置
APP_NAME="aigc-backend"
APP_JAR="app.jar"
APP_PORT=8080
APP_HOME=$(cd "$(dirname "$0")"; pwd)
LOG_DIR="$APP_HOME/logs"
PID_FILE="$APP_HOME/app.pid"
# JVM参数根据服务器内存调整
JAVA_OPTS="-Xms1g -Xmx4g -XX:+UseG1GC -XX:MaxGCPauseMillis=200 -Djava.security.egd=file:/dev/./urandom"
# 创建日志目录
mkdir -p $LOG_DIR
# 启动函数
start() {
if [ -f "$PID_FILE" ]; then
PID=$(cat $PID_FILE)
if ps -p $PID > /dev/null 2>&1; then
echo "$APP_NAME 已经在运行中 (PID: $PID)"
return 1
else
rm -f $PID_FILE
fi
fi
echo "启动 $APP_NAME..."
cd $APP_HOME
nohup java $JAVA_OPTS -jar $APP_JAR --spring.profiles.active=prod > $LOG_DIR/app.log 2>&1 &
echo $! > $PID_FILE
echo "$APP_NAME 启动成功 (PID: $(cat $PID_FILE))"
}
# 停止函数
stop() {
if [ ! -f "$PID_FILE" ]; then
echo "$APP_NAME 未运行"
return 1
fi
PID=$(cat $PID_FILE)
if ps -p $PID > /dev/null 2>&1; then
echo "停止 $APP_NAME (PID: $PID)..."
kill $PID
sleep 3
if ps -p $PID > /dev/null 2>&1; then
kill -9 $PID
fi
rm -f $PID_FILE
echo "$APP_NAME 已停止"
else
echo "$APP_NAME 未运行"
rm -f $PID_FILE
fi
}
# 重启函数
restart() {
stop
sleep 2
start
}
# 状态检查
status() {
if [ -f "$PID_FILE" ]; then
PID=$(cat $PID_FILE)
if ps -p $PID > /dev/null 2>&1; then
echo "$APP_NAME 正在运行 (PID: $PID)"
return 0
else
echo "$APP_NAME 未运行"
rm -f $PID_FILE
return 1
fi
else
echo "$APP_NAME 未运行"
return 1
fi
}
# 主逻辑
case "$1" in
start)
start
;;
stop)
stop
;;
restart)
restart
;;
status)
status
;;
*)
echo "用法: $0 {start|stop|restart|status}"
exit 1
;;
esac
exit 0

Binary file not shown.

Before

Width:  |  Height:  |  Size: 13 KiB

View File

@@ -1,16 +0,0 @@
<svg width="104" height="104" viewBox="0 0 104 104" fill="none" xmlns="http://www.w3.org/2000/svg">
<g clip-path="url(#clip0_601_168)">
<circle cx="52" cy="52" r="51.5" fill="#1BAFFF" stroke="white"/>
<path d="M16.9548 9.33656C10.1123 10.3489 3.30243 13.5493 -1.94346 18.2193C-7.90619 23.5097 -12.1746 31.8372 -13.2498 40.3607C-13.5431 42.6467 -13.7386 43.2672 -14.1622 43.2672C-15.4003 43.2672 -20.2226 45.2592 -22.5686 46.7288C-34.7873 54.3379 -38.6647 70.601 -31.2032 82.8801C-27.1303 89.5094 -20.5485 94.0161 -13.2173 95.1917L-10.7409 95.5836L-9.6331 98.0329C-5.69053 106.818 1.83619 113.12 10.9595 115.243C16.3031 116.484 22.0378 116.19 27.3488 114.427C32.8554 112.565 37.7755 109.136 41.1967 104.728L43.1843 102.148L45.1067 102.899C48.3976 104.27 51.6559 104.76 55.8591 104.564C60.2904 104.368 62.5061 103.813 66.4487 101.919C75.018 97.739 80.4594 89.4115 81.1437 79.2878L81.3718 76.218L83.4897 74.1933C87.3345 70.5031 89.7131 66.4536 91.0816 61.3918C92.0591 57.7342 92.0591 51.9866 91.0816 48.329C88.5727 38.8585 81.665 31.8372 72.2485 29.1593C70.1631 28.5715 68.925 28.4409 65.3083 28.4735C61.4634 28.4735 60.5511 28.6042 58.14 29.3553C56.6085 29.8451 55.1423 30.3023 54.8816 30.3677C54.5558 30.4983 54.1648 30.0084 53.6435 28.8981C47.4527 15.574 31.715 7.18121 16.9548 9.33656ZM20.6693 43.5937C23.113 44.2795 24.7748 45.6838 25.9152 48.0351C26.644 49.5175 27.023 51.1474 27.023 52.7993V62.5348V72.2702C27.023 73.9221 26.644 75.552 25.9152 77.0345C24.7422 79.4511 23.0804 80.8227 20.5064 81.5085C18.8772 81.9657 15.4885 81.6718 14.0875 80.9533C12.2954 80.0716 10.6011 78.1775 9.91682 76.3487C9.29774 74.7158 9.26515 73.7688 9.26515 62.7307C9.26515 49.472 9.3629 48.6556 11.4156 46.2716C13.6313 43.659 17.2155 42.614 20.6693 43.5937ZM42.0438 43.757C44.1943 44.3775 46.1493 46.1083 47.0942 48.231C47.8762 49.9618 47.8762 49.9618 47.8762 62.5348C47.8762 75.1077 47.8762 75.1077 47.0942 76.8385C45.3022 80.8227 40.7405 82.6841 36.1137 81.3125C33.9306 80.6594 32.3015 79.2225 31.1936 76.9692L30.2813 75.1077V62.5348V49.9618L31.1936 48.1004C33.1486 44.0836 37.417 42.3854 42.0438 43.757Z" fill="#151515"/>
<path d="M20.6693 43.5937C23.113 44.2795 24.7748 45.6838 25.9152 48.0351C26.644 49.5175 27.023 51.1474 27.023 52.7993V62.5348V72.2702C27.023 73.9221 26.644 75.552 25.9152 77.0345C24.7422 79.4511 23.0804 80.8227 20.5064 81.5085C18.8772 81.9657 15.4885 81.6718 14.0875 80.9533C12.2954 80.0716 10.6011 78.1775 9.91682 76.3487C9.29774 74.7158 9.26515 73.7688 9.26515 62.7307C9.26515 49.472 9.3629 48.6556 11.4156 46.2716C13.6313 43.659 17.2155 42.614 20.6693 43.5937Z" fill="#151515"/>
<path d="M42.0438 43.757C44.1943 44.3775 46.1493 46.1083 47.0942 48.231C47.8762 49.9618 47.8762 49.9618 47.8762 62.5348C47.8762 75.1077 47.8762 75.1077 47.0942 76.8385C45.3022 80.8227 40.7405 82.6841 36.1137 81.3125C33.9306 80.6594 32.3015 79.2225 31.1936 76.9692L30.2813 75.1077V62.5348V49.9618L31.1936 48.1004C33.1486 44.0836 37.417 42.3854 42.0438 43.757Z" fill="#151515"/>
<rect x="36.3332" y="45.9877" width="7.92593" height="17.1728" rx="3.96296" fill="white"/>
<rect x="49.543" y="45.9875" width="7.92593" height="17.1728" rx="3.96296" fill="white"/>
</g>
<rect x="0.5" y="0.5" width="103" height="103" rx="51.5" stroke="white"/>
<defs>
<clipPath id="clip0_601_168">
<rect width="104" height="104" rx="52" fill="white"/>
</clipPath>
</defs>
</svg>

Before

Width:  |  Height:  |  Size: 3.3 KiB

File diff suppressed because one or more lines are too long

Before

Width:  |  Height:  |  Size: 25 KiB

View File

@@ -1,15 +0,0 @@
<svg width="194" height="41" viewBox="0 0 194 41" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M54.6165 13.6062L60.593 32.3932H60.8224L66.8111 13.6062H72.6065L64.0824 38.3335H57.3452L48.8089 13.6062H54.6165ZM75.4862 38.3335V19.788H80.6296V38.3335H75.4862ZM78.07 17.3974C77.3053 17.3974 76.6493 17.1439 76.1019 16.6368C75.5626 16.1216 75.293 15.5058 75.293 14.7895C75.293 14.0811 75.5626 13.4734 76.1019 12.9663C76.6493 12.4512 77.3053 12.1936 78.07 12.1936C78.8346 12.1936 79.4866 12.4512 80.0259 12.9663C80.5733 13.4734 80.8469 14.0811 80.8469 14.7895C80.8469 15.5058 80.5733 16.1216 80.0259 16.6368C79.4866 17.1439 78.8346 17.3974 78.07 17.3974ZM91.5836 38.6353C90.175 38.6353 88.8992 38.2731 87.7562 37.5487C86.6213 36.8162 85.7198 35.7416 85.0517 34.325C84.3916 32.9003 84.0616 31.1536 84.0616 29.0849C84.0616 26.9599 84.4037 25.1931 85.0879 23.7845C85.7721 22.3678 86.6816 21.3093 87.8166 20.6091C88.9596 19.9007 90.2112 19.5466 91.5716 19.5466C92.6099 19.5466 93.4752 19.7236 94.1674 20.0778C94.8677 20.4239 95.4312 20.8586 95.8578 21.3818C96.2924 21.8969 96.6225 22.404 96.8478 22.9031H97.0048V13.6062H102.136V38.3335H97.0652V35.3633H96.8478C96.6064 35.8785 96.2643 36.3896 95.8216 36.8967C95.3869 37.3958 94.8194 37.8103 94.1191 38.1403C93.4269 38.4703 92.5817 38.6353 91.5836 38.6353ZM93.2136 34.5423C94.0427 34.5423 94.743 34.3169 95.3145 33.8662C95.894 33.4074 96.3367 32.7674 96.6426 31.9464C96.9565 31.1254 97.1135 30.1635 97.1135 29.0608C97.1135 27.958 96.9605 27.0002 96.6547 26.1872C96.3488 25.3742 95.9061 24.7464 95.3265 24.3037C94.747 23.861 94.0427 23.6396 93.2136 23.6396C92.3684 23.6396 91.6561 23.869 91.0765 24.3278C90.497 24.7866 90.0583 25.4225 89.7605 26.2355C89.4627 27.0485 89.3137 27.9902 89.3137 29.0608C89.3137 30.1394 89.4627 31.0932 89.7605 31.9223C90.0663 32.7433 90.505 33.3872 91.0765 33.8541C91.6561 34.3129 92.3684 34.5423 93.2136 34.5423ZM106.462 38.3335V13.6062H122.834V17.9166H111.69V23.8086H121.747V28.119H111.69V38.3335H106.462ZM131.397 13.6062V38.3335H126.254V13.6062H131.397ZM143.897 38.6957C142.021 38.6957 140.399 38.2973 139.031 37.5004C137.671 36.6955 136.62 35.5766 135.88 34.1439C135.139 32.7031 134.769 31.0328 134.769 29.1332C134.769 27.2175 135.139 25.5432 135.88 24.1105C136.62 22.6697 137.671 21.5508 139.031 20.7539C140.399 19.949 142.021 19.5466 143.897 19.5466C145.772 19.5466 147.39 19.949 148.75 20.7539C150.119 21.5508 151.173 22.6697 151.914 24.1105C152.654 25.5432 153.025 27.2175 153.025 29.1332C153.025 31.0328 152.654 32.7031 151.914 34.1439C151.173 35.5766 150.119 36.6955 148.75 37.5004C147.39 38.2973 145.772 38.6957 143.897 38.6957ZM143.921 34.7113C144.774 34.7113 145.486 34.4699 146.058 33.9869C146.629 33.4959 147.06 32.8278 147.35 31.9826C147.648 31.1375 147.797 30.1756 147.797 29.097C147.797 28.0184 147.648 27.0565 147.35 26.2113C147.06 25.3662 146.629 24.6981 146.058 24.2071C145.486 23.7161 144.774 23.4706 143.921 23.4706C143.06 23.4706 142.335 23.7161 141.748 24.2071C141.168 24.6981 140.729 25.3662 140.431 26.2113C140.142 27.0565 139.997 28.0184 139.997 29.097C139.997 30.1756 140.142 31.1375 140.431 31.9826C140.729 32.8278 141.168 33.4959 141.748 33.9869C142.335 34.4699 143.06 34.7113 143.921 34.7113ZM159.562 38.3335L154.516 19.788H159.719L162.593 32.2483H162.762L165.756 19.788H170.864L173.906 32.1758H174.063L176.888 19.788H182.08L177.045 38.3335H171.6L168.413 26.6701H168.183L164.996 38.3335H159.562Z" fill="black"/>
<g clip-path="url(#clip0_1233_5144)">
<path d="M5.7406 1.64568C2.43935 1.64568 0.00938034 1.57298 0.000366208 1.64568C0.000366202 1.71906 2.11292 5.37389 4.70642 9.58611C7.28533 13.813 12.3557 22.0905 15.9545 27.9611L20.8685 35.9875C21.8796 37.6388 23.6773 38.6457 25.6136 38.6457L26.4301 38.6457C26.4301 38.6457 31.0568 38.7204 31.9965 37.2228C32.2255 36.8288 32.346 36.3807 32.3461 35.925L32.3461 21.8996L31.1801 21.8996L31.1801 26.5969C31.1801 31.1005 31.1655 31.3074 30.889 31.5861C30.7288 31.7476 30.4663 31.8801 30.306 31.8801C29.9855 31.8801 29.7811 31.5866 27.1439 27.257C26.2551 25.8039 24.0844 22.2371 22.2924 19.3312C20.5148 16.4253 17.3534 11.2596 15.2699 7.85467L11.4672 1.64568L5.7406 1.64568ZM31.6615 2.99627C31.443 4.1703 30.525 6.06354 29.6654 7.10564C28.4561 8.60263 26.4304 9.83531 24.5072 10.2316C23.4727 10.4518 23.196 10.5988 23.808 10.5988C24.0267 10.5989 24.5801 10.7012 25.0316 10.8332C28.2662 11.7578 31.0495 14.7674 31.6468 17.9816L31.8363 18.9797L32.0111 18.1135C32.5648 15.3249 34.4443 12.8151 36.9066 11.5676C38.0139 10.9952 39.2815 10.5988 39.9808 10.5988C40.6217 10.5988 40.403 10.4957 39.2084 10.2463C37.46 9.87934 36.1049 9.11623 34.6625 7.66326C33.2638 6.26901 32.5496 5.02127 32.0834 3.17205L31.8217 2.11541L31.6615 2.99627Z" fill="url(#paint0_linear_1233_5144)"/>
</g>
<defs>
<linearGradient id="paint0_linear_1233_5144" x1="23.4862" y1="5.3947" x2="32.9093" y2="11.1248" gradientUnits="userSpaceOnUse">
<stop offset="0.0001" stop-color="#33DDE5"/>
<stop offset="1" stop-color="#0F9CFF"/>
</linearGradient>
<clipPath id="clip0_1233_5144">
<rect width="40.3334" height="40.3334" fill="white"/>
</clipPath>
</defs>
</svg>

Before

Width:  |  Height:  |  Size: 5.0 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.2 KiB

View File

@@ -1,15 +0,0 @@
<svg width="194" height="41" viewBox="0 0 194 41" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M54.6165 13.6062L60.593 32.3932H60.8224L66.8111 13.6062H72.6065L64.0824 38.3335H57.3452L48.8089 13.6062H54.6165ZM75.4862 38.3335V19.788H80.6296V38.3335H75.4862ZM78.07 17.3974C77.3053 17.3974 76.6493 17.1439 76.1019 16.6368C75.5626 16.1216 75.293 15.5058 75.293 14.7895C75.293 14.0811 75.5626 13.4734 76.1019 12.9663C76.6493 12.4512 77.3053 12.1936 78.07 12.1936C78.8346 12.1936 79.4866 12.4512 80.0259 12.9663C80.5733 13.4734 80.8469 14.0811 80.8469 14.7895C80.8469 15.5058 80.5733 16.1216 80.0259 16.6368C79.4866 17.1439 78.8346 17.3974 78.07 17.3974ZM91.5836 38.6353C90.175 38.6353 88.8992 38.2731 87.7562 37.5487C86.6213 36.8162 85.7198 35.7416 85.0517 34.325C84.3916 32.9003 84.0616 31.1536 84.0616 29.0849C84.0616 26.9599 84.4037 25.1931 85.0879 23.7845C85.7721 22.3678 86.6816 21.3093 87.8166 20.6091C88.9596 19.9007 90.2112 19.5466 91.5716 19.5466C92.6099 19.5466 93.4752 19.7236 94.1674 20.0778C94.8677 20.4239 95.4312 20.8586 95.8578 21.3818C96.2924 21.8969 96.6225 22.404 96.8478 22.9031H97.0048V13.6062H102.136V38.3335H97.0652V35.3633H96.8478C96.6064 35.8785 96.2643 36.3896 95.8216 36.8967C95.3869 37.3958 94.8194 37.8103 94.1191 38.1403C93.4269 38.4703 92.5817 38.6353 91.5836 38.6353ZM93.2136 34.5423C94.0427 34.5423 94.743 34.3169 95.3145 33.8662C95.894 33.4074 96.3367 32.7674 96.6426 31.9464C96.9565 31.1254 97.1135 30.1635 97.1135 29.0608C97.1135 27.958 96.9605 27.0002 96.6547 26.1872C96.3488 25.3742 95.9061 24.7464 95.3265 24.3037C94.747 23.861 94.0427 23.6396 93.2136 23.6396C92.3684 23.6396 91.6561 23.869 91.0765 24.3278C90.497 24.7866 90.0583 25.4225 89.7605 26.2355C89.4627 27.0485 89.3137 27.9902 89.3137 29.0608C89.3137 30.1394 89.4627 31.0932 89.7605 31.9223C90.0663 32.7433 90.505 33.3872 91.0765 33.8541C91.6561 34.3129 92.3684 34.5423 93.2136 34.5423ZM106.462 38.3335V13.6062H122.834V17.9166H111.69V23.8086H121.747V28.119H111.69V38.3335H106.462ZM131.397 13.6062V38.3335H126.254V13.6062H131.397ZM143.897 38.6957C142.021 38.6957 140.399 38.2973 139.031 37.5004C137.671 36.6955 136.62 35.5766 135.88 34.1439C135.139 32.7031 134.769 31.0328 134.769 29.1332C134.769 27.2175 135.139 25.5432 135.88 24.1105C136.62 22.6697 137.671 21.5508 139.031 20.7539C140.399 19.949 142.021 19.5466 143.897 19.5466C145.772 19.5466 147.39 19.949 148.75 20.7539C150.119 21.5508 151.173 22.6697 151.914 24.1105C152.654 25.5432 153.025 27.2175 153.025 29.1332C153.025 31.0328 152.654 32.7031 151.914 34.1439C151.173 35.5766 150.119 36.6955 148.75 37.5004C147.39 38.2973 145.772 38.6957 143.897 38.6957ZM143.921 34.7113C144.774 34.7113 145.486 34.4699 146.058 33.9869C146.629 33.4959 147.06 32.8278 147.35 31.9826C147.648 31.1375 147.797 30.1756 147.797 29.097C147.797 28.0184 147.648 27.0565 147.35 26.2113C147.06 25.3662 146.629 24.6981 146.058 24.2071C145.486 23.7161 144.774 23.4706 143.921 23.4706C143.06 23.4706 142.335 23.7161 141.748 24.2071C141.168 24.6981 140.729 25.3662 140.431 26.2113C140.142 27.0565 139.997 28.0184 139.997 29.097C139.997 30.1756 140.142 31.1375 140.431 31.9826C140.729 32.8278 141.168 33.4959 141.748 33.9869C142.335 34.4699 143.06 34.7113 143.921 34.7113ZM159.562 38.3335L154.516 19.788H159.719L162.593 32.2483H162.762L165.756 19.788H170.864L173.906 32.1758H174.063L176.888 19.788H182.08L177.045 38.3335H171.6L168.413 26.6701H168.183L164.996 38.3335H159.562Z" fill="white"/>
<g clip-path="url(#clip0_1233_5144)">
<path d="M5.7406 1.64568C2.43935 1.64568 0.00938034 1.57298 0.000366208 1.64568C0.000366202 1.71906 2.11292 5.37389 4.70642 9.58611C7.28533 13.813 12.3557 22.0905 15.9545 27.9611L20.8685 35.9875C21.8796 37.6388 23.6773 38.6457 25.6136 38.6457L26.4301 38.6457C26.4301 38.6457 31.0568 38.7204 31.9965 37.2228C32.2255 36.8288 32.346 36.3807 32.3461 35.925L32.3461 21.8996L31.1801 21.8996L31.1801 26.5969C31.1801 31.1005 31.1655 31.3074 30.889 31.5861C30.7288 31.7476 30.4663 31.8801 30.306 31.8801C29.9855 31.8801 29.7811 31.5866 27.1439 27.257C26.2551 25.8039 24.0844 22.2371 22.2924 19.3312C20.5148 16.4253 17.3534 11.2596 15.2699 7.85467L11.4672 1.64568L5.7406 1.64568ZM31.6615 2.99627C31.443 4.1703 30.525 6.06354 29.6654 7.10564C28.4561 8.60263 26.4304 9.83531 24.5072 10.2316C23.4727 10.4518 23.196 10.5988 23.808 10.5988C24.0267 10.5989 24.5801 10.7012 25.0316 10.8332C28.2662 11.7578 31.0495 14.7674 31.6468 17.9816L31.8363 18.9797L32.0111 18.1135C32.5648 15.3249 34.4443 12.8151 36.9066 11.5676C38.0139 10.9952 39.2815 10.5988 39.9808 10.5988C40.6217 10.5988 40.403 10.4957 39.2084 10.2463C37.46 9.87934 36.1049 9.11623 34.6625 7.66326C33.2638 6.26901 32.5496 5.02127 32.0834 3.17205L31.8217 2.11541L31.6615 2.99627Z" fill="url(#paint0_linear_1233_5144)"/>
</g>
<defs>
<linearGradient id="paint0_linear_1233_5144" x1="23.4862" y1="5.3947" x2="32.9093" y2="11.1248" gradientUnits="userSpaceOnUse">
<stop offset="0.0001" stop-color="#33DDE5"/>
<stop offset="1" stop-color="#0F9CFF"/>
</linearGradient>
<clipPath id="clip0_1233_5144">
<rect width="40.3334" height="40.3334" fill="white"/>
</clipPath>
</defs>
</svg>

Before

Width:  |  Height:  |  Size: 5.0 KiB

View File

@@ -1,22 +0,0 @@
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>AIGC Demo - Vue.js Frontend</title>
<link rel="icon" href="/favicon.ico">
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.4.0/css/all.min.css">
<script type="module" crossorigin src="/static/index-69868281.js"></script>
<link rel="modulepreload" crossorigin href="/static/vue-vendor-164775a6.js">
<link rel="modulepreload" crossorigin href="/static/utils-edfcd65b.js">
<link rel="modulepreload" crossorigin href="/static/element-plus-83a396df.js">
<link rel="stylesheet" href="/static/index-47df4f2a.css">
</head>
<body>
<div id="app"></div>
</body>
</html>

View File

@@ -1,49 +0,0 @@
server {
listen 80;
server_name localhost;
root /www/wwwroot/your-domain.com; # 修改为实际网站目录
index index.html index.htm;
# 开启gzip压缩
gzip on;
gzip_vary on;
gzip_min_length 1024;
gzip_types text/plain text/css application/json application/javascript text/xml application/xml application/xml+rss text/javascript application/vnd.ms-fontobject application/x-font-ttf font/opentype image/svg+xml image/x-icon;
# 前端路由支持History模式
location / {
try_files $uri $uri/ /index.html;
}
# API 代理到后端
location /api/ {
proxy_pass http://172.22.0.1:8080/;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
# 超时设置(视频生成可能需要较长时间)
proxy_connect_timeout 30s;
proxy_send_timeout 900s;
proxy_read_timeout 900s;
# 支持大文件上传
client_max_body_size 600M;
}
# 静态资源缓存
location ~* \.(js|css|png|jpg|jpeg|gif|ico|svg|woff|woff2|ttf|eot)$ {
expires 1y;
add_header Cache-Control "public, immutable";
}
# 禁止访问隐藏文件
location ~ /\. {
deny all;
access_log off;
log_not_found off;
}
}

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@@ -1 +0,0 @@
.api-management[data-v-66980107]{display:flex;min-height:100vh;background:#f8f9fa;font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,sans-serif}.sidebar[data-v-66980107]{width:240px;background:white;border-right:1px solid #e9ecef;display:flex;flex-direction:column;padding:24px 0;box-shadow:2px 0 8px #0000000d}.logo[data-v-66980107]{display:flex;align-items:center;justify-content:center;padding:0 24px;margin-bottom:32px}.logo img[data-v-66980107]{width:100%;height:auto;max-width:180px;object-fit:contain}.nav-menu[data-v-66980107]{flex:1;padding:0 16px}.nav-item[data-v-66980107]{display:flex;align-items:center;padding:12px 16px;margin-bottom:4px;border-radius:8px;cursor:pointer;transition:all .2s ease;color:#6b7280;font-size:14px;font-weight:500}.nav-item[data-v-66980107]:hover{background:#f3f4f6;color:#374151}.nav-item.active[data-v-66980107]{background:#dbeafe;color:#3b82f6}.nav-item .el-icon[data-v-66980107]{margin-right:12px;font-size:18px}.nav-item span[data-v-66980107]{font-size:14px;font-weight:500}.sidebar-footer[data-v-66980107]{padding:20px;border-top:1px solid #e9ecef;background:#f8f9fa;margin-top:auto}.online-users[data-v-66980107],.system-uptime[data-v-66980107]{font-size:13px;color:#6b7280;margin-bottom:8px;line-height:1.5}.highlight[data-v-66980107]{color:#3b82f6;font-weight:600}.main-content[data-v-66980107]{flex:1;display:flex;flex-direction:column;background:#f8f9fa}.top-header[data-v-66980107]{background:white;border-bottom:1px solid #e9ecef;padding:16px 24px;display:flex;align-items:center;justify-content:space-between;box-shadow:0 2px 4px #0000000d}.search-bar[data-v-66980107]{position:relative;display:flex;align-items:center}.search-icon[data-v-66980107]{position:absolute;left:12px;color:#9ca3af;font-size:16px;z-index:1}.search-input[data-v-66980107]{width:300px;padding:10px 12px 10px 40px;border:1px solid #d1d5db;border-radius:8px;font-size:14px;background:white;outline:none;transition:border-color .2s ease}.search-input[data-v-66980107]:focus{border-color:#3b82f6;box-shadow:0 0 0 3px #3b82f61a}.search-input[data-v-66980107]::placeholder{color:#9ca3af}.header-actions[data-v-66980107]{display:flex;align-items:center;gap:20px}.user-avatar[data-v-66980107]{display:flex;align-items:center;gap:8px;cursor:pointer;padding:4px 8px;border-radius:6px;transition:background .2s ease}.user-avatar[data-v-66980107]:hover{background:#f3f4f6}.user-avatar img[data-v-66980107]{width:32px;height:32px;border-radius:50%;object-fit:cover}.user-avatar .arrow-down[data-v-66980107]{font-size:12px;color:#6b7280}.api-content[data-v-66980107]{padding:24px;flex:1;background:white;margin:24px;border-radius:8px;box-shadow:0 1px 3px #0000001a}.content-header[data-v-66980107]{display:flex;align-items:center;justify-content:space-between;margin-bottom:32px}.content-header h2[data-v-66980107]{font-size:24px;font-weight:600;color:#1e293b;margin:0}.api-form-container[data-v-66980107]{max-width:800px}.api-form[data-v-66980107]{background:#f9fafb;padding:32px;border-radius:8px}@media (max-width: 1024px){.api-management[data-v-66980107]{flex-direction:column}.sidebar[data-v-66980107]{width:100%;height:auto}.nav-menu[data-v-66980107]{display:flex;overflow-x:auto;padding:0 16px}.nav-item[data-v-66980107]{white-space:nowrap;margin-right:16px;margin-bottom:0}.sidebar-footer[data-v-66980107]{display:none}.search-input[data-v-66980107]{width:200px}.api-content[data-v-66980107]{padding:16px}}

File diff suppressed because one or more lines are too long

View File

@@ -1 +0,0 @@
.api-management[data-v-72b5a76c]{display:flex;min-height:100vh;background:#f8f9fa;font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,sans-serif}.sidebar[data-v-72b5a76c]{width:240px;background:white;border-right:1px solid #e9ecef;display:flex;flex-direction:column;padding:24px 0;box-shadow:2px 0 8px #0000000d}.logo[data-v-72b5a76c]{display:flex;align-items:center;padding:0 20px;margin-bottom:32px}.logo-icon[data-v-72b5a76c]{width:24px;height:24px;background:#3b82f6;border-radius:4px;margin-right:12px}.logo span[data-v-72b5a76c]{font-size:18px;font-weight:600;color:#1e293b}.nav-menu[data-v-72b5a76c]{flex:1;padding:0 16px}.nav-item[data-v-72b5a76c]{display:flex;align-items:center;padding:12px 16px;margin-bottom:4px;border-radius:8px;cursor:pointer;transition:all .2s ease;color:#6b7280;font-size:14px;font-weight:500}.nav-item[data-v-72b5a76c]:hover{background:#f3f4f6;color:#374151}.nav-item.active[data-v-72b5a76c]{background:#dbeafe;color:#3b82f6}.nav-item .el-icon[data-v-72b5a76c]{margin-right:12px;font-size:18px}.nav-item span[data-v-72b5a76c]{font-size:14px;font-weight:500}.sidebar-footer[data-v-72b5a76c]{padding:20px;border-top:1px solid #e9ecef;background:#f8f9fa;margin-top:auto}.online-users[data-v-72b5a76c],.system-uptime[data-v-72b5a76c]{font-size:13px;color:#6b7280;margin-bottom:8px;line-height:1.5}.highlight[data-v-72b5a76c]{color:#3b82f6;font-weight:600}.main-content[data-v-72b5a76c]{flex:1;display:flex;flex-direction:column;background:#f8f9fa}.top-header[data-v-72b5a76c]{background:white;border-bottom:1px solid #e9ecef;padding:16px 24px;display:flex;align-items:center;justify-content:space-between;box-shadow:0 2px 4px #0000000d}.search-bar[data-v-72b5a76c]{position:relative;display:flex;align-items:center}.search-icon[data-v-72b5a76c]{position:absolute;left:12px;color:#9ca3af;font-size:16px;z-index:1}.search-input[data-v-72b5a76c]{width:300px;padding:10px 12px 10px 40px;border:1px solid #d1d5db;border-radius:8px;font-size:14px;background:white;outline:none;transition:border-color .2s ease}.search-input[data-v-72b5a76c]:focus{border-color:#3b82f6;box-shadow:0 0 0 3px #3b82f61a}.search-input[data-v-72b5a76c]::placeholder{color:#9ca3af}.header-actions[data-v-72b5a76c]{display:flex;align-items:center;gap:20px}.notification-icon-wrapper[data-v-72b5a76c]{position:relative;cursor:pointer;padding:8px;border-radius:6px;transition:background .2s ease}.notification-icon-wrapper[data-v-72b5a76c]:hover{background:#f3f4f6}.notification-icon[data-v-72b5a76c]{font-size:20px;color:#6b7280}.notification-badge[data-v-72b5a76c]{position:absolute;top:4px;right:4px;width:8px;height:8px;background:#ef4444;border-radius:50%;border:2px solid white}.user-avatar[data-v-72b5a76c]{display:flex;align-items:center;gap:8px;cursor:pointer;padding:4px 8px;border-radius:6px;transition:background .2s ease}.user-avatar[data-v-72b5a76c]:hover{background:#f3f4f6}.user-avatar img[data-v-72b5a76c]{width:32px;height:32px;border-radius:50%;object-fit:cover}.user-avatar .arrow-down[data-v-72b5a76c]{font-size:12px;color:#6b7280}.api-content[data-v-72b5a76c]{padding:24px;flex:1;background:white;margin:24px;border-radius:8px;box-shadow:0 1px 3px #0000001a}.content-header[data-v-72b5a76c]{display:flex;align-items:center;justify-content:space-between;margin-bottom:32px}.content-header h2[data-v-72b5a76c]{font-size:24px;font-weight:600;color:#1e293b;margin:0}.api-form-container[data-v-72b5a76c]{max-width:800px}.api-form[data-v-72b5a76c]{background:#f9fafb;padding:32px;border-radius:8px}@media (max-width: 1024px){.api-management[data-v-72b5a76c]{flex-direction:column}.sidebar[data-v-72b5a76c]{width:100%;height:auto}.nav-menu[data-v-72b5a76c]{display:flex;overflow-x:auto;padding:0 16px}.nav-item[data-v-72b5a76c]{white-space:nowrap;margin-right:16px;margin-bottom:0}.sidebar-footer[data-v-72b5a76c]{display:none}.search-input[data-v-72b5a76c]{width:200px}.api-content[data-v-72b5a76c]{padding:16px}}

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@@ -1 +0,0 @@
import{z as l,A as n,B as o}from"./vue-vendor-164775a6.js";const a={__name:"HelloWorld",setup(r){return console.log("Vue component loaded!"),(t,e)=>(l(),n("div",null,[...e[0]||(e[0]=[o("h1",null,"Hello World!",-1),o("p",null,"Vue is working!",-1)])]))}};export{a as default};

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@@ -1 +0,0 @@
.video-detail-page[data-v-8c6c5f10]{height:100vh;background:#0a0a0a;color:#fff;display:flex;flex-direction:column;font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,sans-serif}.top-bar[data-v-8c6c5f10]{height:60px;background:#1a1a1a;border-bottom:1px solid #333;display:flex;align-items:center;justify-content:space-between;padding:0 20px;z-index:100}.logo[data-v-8c6c5f10]{display:flex;align-items:center}.logo img[data-v-8c6c5f10]{height:30px;width:auto}.top-actions[data-v-8c6c5f10]{display:flex;gap:16px}.action-icon[data-v-8c6c5f10]{font-size:20px;color:#cbd5e1;cursor:pointer;transition:color .3s}.action-icon[data-v-8c6c5f10]:hover{color:#fff}.sidebar[data-v-8c6c5f10]{position:fixed;left:0;top:60px;width:200px;height:calc(100vh - 60px);background:#1a1a1a;border-right:1px solid #333;padding:20px 0;z-index:90}.nav-item[data-v-8c6c5f10]{display:flex;align-items:center;padding:12px 20px;color:#cbd5e1;cursor:pointer;transition:all .3s}.nav-item[data-v-8c6c5f10]:hover{background:#2a2a2a;color:#fff}.nav-item .el-icon[data-v-8c6c5f10]{margin-right:12px;font-size:18px}.main-content[data-v-8c6c5f10]{margin-left:200px;margin-top:60px;height:calc(100vh - 60px);display:flex}.video-section[data-v-8c6c5f10]{flex:2;padding:20px;display:flex;align-items:center;justify-content:center}.video-player[data-v-8c6c5f10]{position:relative;width:100%;max-width:800px;aspect-ratio:16/9;background:#000;border-radius:8px;overflow:hidden}.video-player video[data-v-8c6c5f10]{width:100%;height:100%;object-fit:cover;cursor:pointer}.video-controls[data-v-8c6c5f10]{position:absolute;bottom:0;left:0;right:0;background:linear-gradient(transparent,rgba(0,0,0,.8));padding:20px;display:flex;justify-content:space-between;align-items:center}.controls-left[data-v-8c6c5f10]{display:flex;align-items:center;gap:12px}.time-display[data-v-8c6c5f10]{color:#fff;font-size:14px;font-family:monospace}.video-actions[data-v-8c6c5f10]{position:absolute;top:20px;right:20px;display:flex;gap:8px}.video-actions .el-button[data-v-8c6c5f10]{background:rgba(0,0,0,.6);border:1px solid rgba(255,255,255,.2);color:#fff}.video-actions .el-button[data-v-8c6c5f10]:hover{background:rgba(0,0,0,.8);border-color:#fff6}.detail-section[data-v-8c6c5f10]{flex:1;background:#1a1a1a;border-left:1px solid #333;padding:20px;overflow-y:auto;position:relative}.detail-header h3[data-v-8c6c5f10]{font-size:20px;font-weight:600;margin-bottom:4px;color:#fff}.subtitle[data-v-8c6c5f10]{color:#9ca3af;font-size:14px;margin-bottom:20px}.detail-content[data-v-8c6c5f10]{display:flex;flex-direction:column;gap:20px}.input-section[data-v-8c6c5f10]{margin-bottom:10px}.thumbnails[data-v-8c6c5f10]{display:flex;gap:8px}.thumbnail[data-v-8c6c5f10]{width:60px;height:60px;border-radius:6px;overflow:hidden;background:#2a2a2a}.thumbnail img[data-v-8c6c5f10]{width:100%;height:100%;object-fit:cover}.description h4[data-v-8c6c5f10]{font-size:16px;font-weight:600;margin-bottom:8px;color:#fff}.description p[data-v-8c6c5f10]{color:#cbd5e1;font-size:14px;line-height:1.5}.metadata[data-v-8c6c5f10]{display:flex;flex-direction:column;gap:12px}.meta-item[data-v-8c6c5f10]{display:flex;justify-content:space-between;align-items:center;padding:8px 0;border-bottom:1px solid #2a2a2a}.meta-item[data-v-8c6c5f10]:last-child{border-bottom:none}.label[data-v-8c6c5f10]{color:#9ca3af;font-size:14px}.value[data-v-8c6c5f10]{color:#fff;font-size:14px;font-weight:500}.action-button[data-v-8c6c5f10]{margin-top:20px}.action-button .el-button[data-v-8c6c5f10]{width:100%;height:44px;font-size:16px;font-weight:600}.scroll-indicators[data-v-8c6c5f10]{position:absolute;right:8px;top:50%;transform:translateY(-50%);display:flex;flex-direction:column;gap:8px}.scroll-arrow[data-v-8c6c5f10]{font-size:16px;color:#6b7280;cursor:pointer;transition:color .3s}.scroll-arrow[data-v-8c6c5f10]:hover{color:#9ca3af}@media (max-width: 1024px){.sidebar[data-v-8c6c5f10]{width:160px}.main-content[data-v-8c6c5f10]{margin-left:160px}.video-section[data-v-8c6c5f10]{padding:10px}.detail-section[data-v-8c6c5f10]{padding:15px}}@media (max-width: 768px){.sidebar[data-v-8c6c5f10]{display:none}.main-content[data-v-8c6c5f10]{margin-left:0;flex-direction:column}.video-section[data-v-8c6c5f10],.detail-section[data-v-8c6c5f10]{flex:none;height:50vh}}

Some files were not shown because too many files have changed in this diff Show More