Compare commits
20 Commits
a294f61f3c
...
master
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
dbd06435cb | ||
|
|
2961d2b0d0 | ||
|
|
83bf064bb2 | ||
|
|
ef379bcca6 | ||
|
|
0b4fd32c59 | ||
|
|
1e71ae6a26 | ||
|
|
b5820d9be2 | ||
|
|
0b0ad442a0 | ||
|
|
6d834d3385 | ||
|
|
d5f7569a3a | ||
|
|
149b201300 | ||
|
|
b5bbd8841e | ||
|
|
7964d87954 | ||
|
|
6f72386523 | ||
|
|
8c55f9f376 | ||
|
|
473e0f6a7e | ||
|
|
a13ff70055 | ||
|
|
26d10a3322 | ||
|
|
68574fe33f | ||
|
|
08b737b1ef |
29
.claude/settings.local.json
Normal file
@@ -0,0 +1,29 @@
|
||||
{
|
||||
"permissions": {
|
||||
"allow": [
|
||||
"Bash(netstat:*)",
|
||||
"Bash(findstr:*)",
|
||||
"Bash(tasklist:*)",
|
||||
"Bash(taskkill /F /PID 34568)",
|
||||
"Bash(powershell \"Stop-Process -Id 34568 -Force\")",
|
||||
"Bash(mvn clean:*)",
|
||||
"Bash(cmd /c \"mvn clean\")",
|
||||
"Bash(dir:*)",
|
||||
"Bash(nul)",
|
||||
"Bash(.mvnw.cmd clean package:*)",
|
||||
"Bash(powershell -Command \"./mvnw.cmd clean package -DskipTests\")",
|
||||
"Bash(powershell -Command:*)",
|
||||
"Bash(timeout /t 3 /nobreak)",
|
||||
"Bash(git rm:*)",
|
||||
"Bash(if exist .dockerignore del .dockerignore)",
|
||||
"Bash(if exist Dockerfile del Dockerfile)",
|
||||
"Bash(if exist nginx.conf del nginx.conf)",
|
||||
"Bash(if exist Dockerfile.java21 del Dockerfile.java21)",
|
||||
"Bash(if exist Dockerfile.linux del Dockerfile.linux)",
|
||||
"Bash(if exist docker-compose.example.yml del docker-compose.example.yml)",
|
||||
"Bash(if exist nginx rmdir /s /q nginx)"
|
||||
],
|
||||
"deny": [],
|
||||
"ask": []
|
||||
}
|
||||
}
|
||||
3
.gitignore
vendored
@@ -63,3 +63,6 @@ startup.log
|
||||
# 其他
|
||||
*.jar
|
||||
!mysql-connector-java-8.0.33.jar
|
||||
|
||||
# Windows 保留名占位文件
|
||||
nul
|
||||
39
SSH_SETUP.md
@@ -1,39 +0,0 @@
|
||||
# SSH密钥配置说明
|
||||
|
||||
## 您的SSH公钥
|
||||
```
|
||||
ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIFh5WK5GBuW/5xcZv5suVAs5LEFeea2A01zPRP5Slzh1 984523799@qq.com
|
||||
```
|
||||
|
||||
## 配置步骤
|
||||
|
||||
### 1. 将公钥添加到Git服务器
|
||||
- 复制上面的公钥内容
|
||||
- 登录您的Git服务器管理界面
|
||||
- 找到"SSH密钥"或"SSH Keys"设置
|
||||
- 添加新的SSH密钥,粘贴公钥内容
|
||||
- 保存设置
|
||||
|
||||
### 2. 测试SSH连接
|
||||
```bash
|
||||
ssh -T git@49.234.3.145 -p 222
|
||||
```
|
||||
|
||||
### 3. 推送代码
|
||||
```bash
|
||||
git push -u origin master
|
||||
```
|
||||
|
||||
## 当前状态
|
||||
- ✅ SSH密钥已生成
|
||||
- ✅ Git仓库已初始化
|
||||
- ✅ 代码已提交到本地
|
||||
- ⏳ 等待SSH公钥添加到服务器
|
||||
|
||||
## 如果SSH配置有问题
|
||||
可以使用HTTPS方式:
|
||||
```bash
|
||||
git remote set-url origin https://49.234.3.145:222/blandarebiter/AIGC.git
|
||||
git push -u origin master
|
||||
```
|
||||
(需要输入用户名和密码)
|
||||
145
UPLOAD_GUIDE.md
@@ -1,145 +0,0 @@
|
||||
# AIGC项目代码上传指南
|
||||
|
||||
## 项目概述
|
||||
这是一个完整的AIGC(AI Generated Content)项目,包含:
|
||||
- **前端**: Vue.js 3 + Element Plus + Vite
|
||||
- **后端**: Spring Boot 3.5.6 + Spring Security + JWT
|
||||
- **数据库**: MySQL
|
||||
- **支付**: 支付宝 + PayPal集成
|
||||
|
||||
## 代码上传方法
|
||||
|
||||
### 方法一:使用SSH密钥(推荐)
|
||||
|
||||
✅ **SSH密钥已生成**:
|
||||
- 私钥:`C:\Users\UI\.ssh\id_ed25519`
|
||||
- 公钥:`C:\Users\UI\.ssh\id_ed25519.pub`
|
||||
|
||||
**您的SSH公钥**:
|
||||
```
|
||||
ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIFh5WK5GBuW/5xcZv5suVAs5LEFeea2A01zPRP5Slzh1 984523799@qq.com
|
||||
```
|
||||
|
||||
**下一步操作**:
|
||||
1. **将公钥添加到Git服务器**:
|
||||
- 复制上面的公钥内容
|
||||
- 登录Git服务器管理界面
|
||||
- 在SSH密钥设置中添加此公钥
|
||||
|
||||
2. **推送代码**:
|
||||
```bash
|
||||
git remote set-url origin ssh://git@49.234.3.145:222/blandarebiter/AIGC.git
|
||||
git push -u origin master
|
||||
```
|
||||
|
||||
### 方法二:使用HTTPS(需要用户名密码)
|
||||
|
||||
```bash
|
||||
git remote set-url origin https://49.234.3.145:222/blandarebiter/AIGC.git
|
||||
git push -u origin master
|
||||
```
|
||||
|
||||
### 方法三:代码打包上传
|
||||
|
||||
如果网络连接有问题,可以:
|
||||
|
||||
1. **创建代码压缩包**:
|
||||
```bash
|
||||
# Windows
|
||||
powershell Compress-Archive -Path "demo" -DestinationPath "AIGC-Project.zip"
|
||||
|
||||
# Linux/Mac
|
||||
tar -czf AIGC-Project.tar.gz demo/
|
||||
```
|
||||
|
||||
2. **手动上传到服务器**
|
||||
|
||||
## 项目结构
|
||||
|
||||
```
|
||||
AIGC/
|
||||
├── demo/ # 主项目目录
|
||||
│ ├── frontend/ # Vue.js前端
|
||||
│ │ ├── src/
|
||||
│ │ │ ├── views/ # 页面组件
|
||||
│ │ │ ├── components/ # 通用组件
|
||||
│ │ │ ├── api/ # API接口
|
||||
│ │ │ ├── stores/ # Pinia状态管理
|
||||
│ │ │ └── router/ # 路由配置
|
||||
│ │ └── package.json
|
||||
│ ├── src/main/java/ # Spring Boot后端
|
||||
│ │ └── com/example/demo/
|
||||
│ │ ├── controller/ # 控制器
|
||||
│ │ ├── service/ # 业务逻辑
|
||||
│ │ ├── model/ # 数据模型
|
||||
│ │ ├── repository/ # 数据访问
|
||||
│ │ └── security/ # 安全配置
|
||||
│ ├── pom.xml # Maven配置
|
||||
│ └── start.sh # 启动脚本
|
||||
└── README.md # 项目说明
|
||||
```
|
||||
|
||||
## 主要功能
|
||||
|
||||
### 前端功能
|
||||
- ✅ 用户登录/注册
|
||||
- ✅ 个人主页
|
||||
- ✅ 订单管理
|
||||
- ✅ 支付记录
|
||||
- ✅ 我的作品
|
||||
- ✅ 文生视频
|
||||
- ✅ 图生视频
|
||||
- ✅ 分镜视频
|
||||
- ✅ 会员订阅
|
||||
- ✅ 管理员后台
|
||||
|
||||
### 后端功能
|
||||
- ✅ JWT认证
|
||||
- ✅ 用户管理
|
||||
- ✅ 订单系统
|
||||
- ✅ 支付集成
|
||||
- ✅ 文件上传
|
||||
- ✅ 权限控制
|
||||
|
||||
## 启动说明
|
||||
|
||||
### 后端启动
|
||||
```bash
|
||||
cd demo
|
||||
./start.sh
|
||||
# 或者
|
||||
java -jar target/demo-0.0.1-SNAPSHOT.jar --spring.profiles.active=dev
|
||||
```
|
||||
|
||||
### 前端启动
|
||||
```bash
|
||||
cd demo/frontend
|
||||
npm install
|
||||
npm run dev
|
||||
```
|
||||
|
||||
## 测试账号
|
||||
|
||||
- **普通用户**: 15538239326 / 0627
|
||||
- **管理员**: 15538239327 / admin123
|
||||
- **测试用户**: 15538239328 / test123
|
||||
- **个人主页**: 15538239329 / 123456
|
||||
|
||||
## 技术栈
|
||||
|
||||
- **前端**: Vue 3, Element Plus, Vite, Pinia, Vue Router, Axios
|
||||
- **后端**: Spring Boot 3.5.6, Spring Security, JWT, Spring Data JPA
|
||||
- **数据库**: MySQL 8.0
|
||||
- **支付**: 支付宝SDK, PayPal SDK
|
||||
- **构建**: Maven, npm
|
||||
|
||||
## 注意事项
|
||||
|
||||
1. 确保MySQL服务已启动
|
||||
2. 配置正确的数据库连接信息
|
||||
3. 设置支付网关的API密钥
|
||||
4. 确保端口8080和3000未被占用
|
||||
|
||||
## 联系方式
|
||||
|
||||
如有问题,请联系开发团队。
|
||||
30
demo/.claude/settings.local.json
Normal file
@@ -0,0 +1,30 @@
|
||||
{
|
||||
"permissions": {
|
||||
"allow": [
|
||||
"Bash(mvn clean package:*)",
|
||||
"Bash(powershell.exe -ExecutionPolicy Bypass -File deploy.ps1)",
|
||||
"Bash(mvn clean spring-boot:run:*)",
|
||||
"Bash(where:*)",
|
||||
"Bash(cmd.exe /c mvnw.cmd clean spring-boot:run -DskipTests)",
|
||||
"Bash(tasklist:*)",
|
||||
"Bash(netstat:*)",
|
||||
"Bash(taskkill:*)",
|
||||
"Bash(powershell.exe -Command \"cd ''C:\\Users\\UI\\Desktop\\AIGC\\demo''; mvn clean compile -DskipTests\")",
|
||||
"Bash(npm install:*)",
|
||||
"Bash(npm cache clean:*)",
|
||||
"Bash(npm run dev:*)",
|
||||
"Bash(timeout:*)",
|
||||
"Bash(powershell.exe -Command \"Start-Sleep -Seconds 5\")",
|
||||
"Bash(findstr:*)",
|
||||
"Bash(powershell.exe -Command \"Get-Process node | Stop-Process -Force\")",
|
||||
"Bash(npm run build:*)",
|
||||
"Bash(dir:*)",
|
||||
"Bash(cmd.exe /c mvnw.cmd clean install -DskipTests)",
|
||||
"Bash(powershell.exe -Command \"cd ''C:\\Users\\UI\\Desktop\\AIGC\\demo''; .\\mvnw.cmd clean compile -DskipTests\")",
|
||||
"Bash(powershell.exe -Command \"Get-Process java | Stop-Process -Force\")",
|
||||
"Bash(powershell.exe -Command \"Start-Sleep -Seconds 3\")"
|
||||
],
|
||||
"deny": [],
|
||||
"ask": []
|
||||
}
|
||||
}
|
||||
47
demo/.gitignore
vendored
@@ -31,3 +31,50 @@ build/
|
||||
|
||||
### VS Code ###
|
||||
.vscode/
|
||||
|
||||
### 敏感配置文件 ###
|
||||
# 开发环境配置(包含敏感信息)
|
||||
src/main/resources/application-dev.properties
|
||||
# 生产环境配置(包含敏感信息)
|
||||
src/main/resources/application-prod.properties
|
||||
# 环境变量文件
|
||||
.env
|
||||
*.env
|
||||
config/.env
|
||||
|
||||
### 上传文件和临时文件 ###
|
||||
uploads/
|
||||
temp/
|
||||
logs/
|
||||
*.log
|
||||
|
||||
### 构建产物 ###
|
||||
target/
|
||||
frontend/dist/
|
||||
frontend/node_modules/
|
||||
|
||||
### 数据库相关 ###
|
||||
*.sql.backup
|
||||
*.db
|
||||
*.sqlite
|
||||
|
||||
### IDE和编辑器 ###
|
||||
.idea/
|
||||
*.iml
|
||||
*.ipr
|
||||
*.iws
|
||||
.DS_Store
|
||||
Thumbs.db
|
||||
|
||||
### 测试文件 ###
|
||||
test_*.py
|
||||
test_*.java
|
||||
test_*.html
|
||||
test_*.sh
|
||||
test_*.bat
|
||||
*.test.*
|
||||
|
||||
### 备份文件 ###
|
||||
*.backup
|
||||
*.bak
|
||||
*~
|
||||
|
||||
81
demo/API_DOCUMENTATION.md
Normal file
@@ -0,0 +1,81 @@
|
||||
# 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
|
||||
```
|
||||
|
||||
|
||||
@@ -1,168 +0,0 @@
|
||||
# Bug修复总结报告
|
||||
|
||||
## 🎯 修复概述
|
||||
|
||||
本次修复解决了AIGC项目中的6个主要问题,提升了项目的安全性、稳定性和用户体验。
|
||||
|
||||
## ✅ 已修复的问题
|
||||
|
||||
### 1. 前端路由守卫被禁用 ⚠️ → ✅
|
||||
**问题**: 路由守卫被注释掉,用户可以直接访问需要认证的页面
|
||||
**修复**:
|
||||
- 恢复了完整的路由守卫逻辑
|
||||
- 添加了认证检查和权限验证
|
||||
- 实现了自动重定向和页面标题设置
|
||||
|
||||
**文件**: `demo/frontend/src/router/index.js`
|
||||
|
||||
### 2. CORS配置冲突 ⚠️ → ✅
|
||||
**问题**: 两个CORS配置可能冲突,导致跨域请求失败
|
||||
**修复**:
|
||||
- 统一了CORS配置,只保留SecurityConfig中的配置
|
||||
- 删除了重复的CorsConfig.java文件
|
||||
- 限制了允许的源为前端开发服务器
|
||||
|
||||
**文件**:
|
||||
- `demo/src/main/java/com/example/demo/config/SecurityConfig.java`
|
||||
- 删除了 `demo/src/main/java/com/example/demo/config/CorsConfig.java`
|
||||
|
||||
### 3. API路径不一致 ⚠️ → ✅
|
||||
**问题**: 前端和后端API路径不匹配
|
||||
**修复**:
|
||||
- 统一了API路径格式
|
||||
- 修复了用户名和邮箱检查接口的路径
|
||||
- 确保前后端路径一致性
|
||||
|
||||
**文件**:
|
||||
- `demo/frontend/src/api/auth.js`
|
||||
- `demo/src/main/java/com/example/demo/controller/AuthApiController.java`
|
||||
|
||||
### 4. App.vue过于简单 ⚠️ → ✅
|
||||
**问题**: 主应用组件只是一个测试页面
|
||||
**修复**:
|
||||
- 实现了完整的应用布局
|
||||
- 添加了导航栏和页脚组件
|
||||
- 实现了响应式设计和全局样式
|
||||
- 根据路由动态显示/隐藏组件
|
||||
|
||||
**文件**: `demo/frontend/src/App.vue`
|
||||
|
||||
### 5. 支付配置缺失 ⚠️ → ✅
|
||||
**问题**: 支付配置使用占位符,无法正常工作
|
||||
**修复**:
|
||||
- 提供了完整的支付配置示例
|
||||
- 创建了详细的支付配置说明文档
|
||||
- 区分了开发环境和生产环境配置
|
||||
|
||||
**文件**:
|
||||
- `demo/src/main/resources/application-dev.properties`
|
||||
- `demo/PAYMENT_SETUP.md`
|
||||
|
||||
### 6. 敏感配置硬编码 ⚠️ → ✅
|
||||
**问题**: 数据库密码等敏感信息硬编码在配置文件中
|
||||
**修复**:
|
||||
- 实现了环境变量化配置
|
||||
- 创建了环境变量示例文件
|
||||
- 提供了启动和停止脚本
|
||||
- 区分了开发和生产环境配置
|
||||
|
||||
**文件**:
|
||||
- `demo/src/main/resources/application-dev.properties`
|
||||
- `demo/src/main/resources/application-prod.properties`
|
||||
- `demo/env.example`
|
||||
- `demo/start.sh`
|
||||
- `demo/stop.sh`
|
||||
|
||||
## 🚀 新增功能
|
||||
|
||||
### 1. 环境变量支持
|
||||
- 支持通过.env文件配置环境变量
|
||||
- 提供了env.example示例文件
|
||||
- 实现了配置的默认值机制
|
||||
|
||||
### 2. 启动脚本
|
||||
- 创建了智能启动脚本(start.sh)
|
||||
- 创建了停止脚本(stop.sh)
|
||||
- 支持环境检查和自动配置
|
||||
|
||||
### 3. 支付配置文档
|
||||
- 详细的支付接入说明
|
||||
- 开发和生产环境配置指南
|
||||
- 常见问题解答
|
||||
|
||||
## 📊 修复效果
|
||||
|
||||
### 安全性提升
|
||||
- ✅ 恢复了路由保护机制
|
||||
- ✅ 统一了CORS配置,避免安全漏洞
|
||||
- ✅ 环境变量化敏感配置
|
||||
|
||||
### 稳定性提升
|
||||
- ✅ 修复了API路径不一致问题
|
||||
- ✅ 完善了应用布局和组件结构
|
||||
- ✅ 提供了完整的配置说明
|
||||
|
||||
### 用户体验提升
|
||||
- ✅ 实现了完整的应用布局
|
||||
- ✅ 添加了响应式设计
|
||||
- ✅ 提供了便捷的启动脚本
|
||||
|
||||
## 🔧 使用说明
|
||||
|
||||
### 启动应用
|
||||
```bash
|
||||
# 使用启动脚本(推荐)
|
||||
./start.sh
|
||||
|
||||
# 或手动启动
|
||||
mvn spring-boot:run
|
||||
```
|
||||
|
||||
### 环境配置
|
||||
```bash
|
||||
# 复制环境变量示例文件
|
||||
cp env.example .env
|
||||
|
||||
# 编辑环境变量
|
||||
nano .env
|
||||
```
|
||||
|
||||
### 支付配置
|
||||
参考 `PAYMENT_SETUP.md` 文档进行支付功能配置。
|
||||
|
||||
## ⚠️ 注意事项
|
||||
|
||||
### 1. 环境变量
|
||||
- 生产环境必须使用环境变量
|
||||
- 确保.env文件不被提交到版本控制
|
||||
- 定期更换JWT密钥
|
||||
|
||||
### 2. 支付配置
|
||||
- 开发环境使用沙箱配置
|
||||
- 生产环境必须使用HTTPS
|
||||
- 确保回调URL正确配置
|
||||
|
||||
### 3. 数据库
|
||||
- 生产环境使用强密码
|
||||
- 定期备份数据库
|
||||
- 监控数据库连接
|
||||
|
||||
## 🎉 总结
|
||||
|
||||
本次修复解决了项目中的主要问题,提升了:
|
||||
- **安全性**: 路由保护、CORS配置、环境变量
|
||||
- **稳定性**: API路径统一、配置完善
|
||||
- **用户体验**: 完整布局、响应式设计
|
||||
- **可维护性**: 环境变量、启动脚本、详细文档
|
||||
|
||||
项目现在可以安全地部署到生产环境使用。
|
||||
|
||||
## 📝 后续建议
|
||||
|
||||
1. **密码加密**: 考虑在生产环境实现真正的密码加密
|
||||
2. **监控日志**: 添加应用监控和日志分析
|
||||
3. **单元测试**: 增加单元测试覆盖率
|
||||
4. **API文档**: 使用Swagger生成API文档
|
||||
5. **CI/CD**: 实现自动化部署流程
|
||||
|
||||
|
||||
@@ -1,104 +0,0 @@
|
||||
# 数据仪表盘功能说明
|
||||
|
||||
## 功能概述
|
||||
|
||||
数据仪表盘是一个系统数据概览页面,提供以下关键指标和图表:
|
||||
|
||||
### 核心指标
|
||||
- **用户总数**: 系统中注册用户的总数量
|
||||
- **付费用户数**: 有成功支付记录的用户数量
|
||||
- **今日收入**: 当天成功支付的金额总和
|
||||
- **转化率**: 付费用户数占总用户数的百分比
|
||||
|
||||
### 图表展示
|
||||
- **日活用户趋势**: 最近30天的日活跃用户数量变化
|
||||
- **收入趋势**: 最近30天的收入变化情况
|
||||
- **订单状态分布**: 不同订单状态的分布饼图
|
||||
- **支付方式分布**: 不同支付方式的使用情况
|
||||
|
||||
### 数据列表
|
||||
- **最近订单**: 显示最新的10个订单信息
|
||||
|
||||
## 技术实现
|
||||
|
||||
### 后端实现
|
||||
- `DashboardService`: 提供数据统计和计算服务
|
||||
- `DashboardApiController`: 提供RESTful API接口
|
||||
- 支持的数据源:用户、订单、支付记录
|
||||
|
||||
### 前端实现
|
||||
- `Dashboard.vue`: 主要仪表盘组件
|
||||
- `dashboard.js`: API调用封装
|
||||
- 使用ECharts进行图表渲染
|
||||
- 响应式设计,支持移动端访问
|
||||
|
||||
## 访问权限
|
||||
|
||||
- 需要管理员权限才能访问
|
||||
- 路径:`/admin/dashboard`
|
||||
- API路径:`/api/dashboard/**`
|
||||
|
||||
## 安装和运行
|
||||
|
||||
### 后端
|
||||
1. 确保Spring Boot应用正常运行
|
||||
2. 运行数据库迁移脚本(为users表添加created_at字段):
|
||||
```sql
|
||||
-- 运行 migration_add_created_at.sql
|
||||
```
|
||||
3. 数据库中有用户、订单、支付数据
|
||||
|
||||
### 前端
|
||||
1. 安装依赖:
|
||||
```bash
|
||||
cd demo/frontend
|
||||
npm install
|
||||
```
|
||||
|
||||
2. 启动前端服务:
|
||||
```bash
|
||||
npm run dev
|
||||
```
|
||||
|
||||
3. 使用管理员账户登录后访问仪表盘
|
||||
|
||||
**注意**: ECharts图表库通过CDN动态加载,无需额外安装npm包
|
||||
|
||||
### 数据库迁移
|
||||
如果users表没有created_at字段,需要运行迁移脚本:
|
||||
```sql
|
||||
ALTER TABLE users ADD COLUMN created_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP;
|
||||
UPDATE users SET created_at = CURRENT_TIMESTAMP WHERE created_at IS NULL;
|
||||
```
|
||||
|
||||
## API接口
|
||||
|
||||
### 获取所有数据
|
||||
```
|
||||
GET /api/dashboard/all
|
||||
```
|
||||
|
||||
### 单独获取各项数据
|
||||
- `GET /api/dashboard/overview` - 概览数据
|
||||
- `GET /api/dashboard/daily-active-users` - 日活数据
|
||||
- `GET /api/dashboard/revenue-trend` - 收入趋势
|
||||
- `GET /api/dashboard/order-status-distribution` - 订单状态分布
|
||||
- `GET /api/dashboard/payment-method-distribution` - 支付方式分布
|
||||
- `GET /api/dashboard/recent-orders` - 最近订单
|
||||
|
||||
## 注意事项
|
||||
|
||||
1. 所有API都需要管理员权限
|
||||
2. 数据统计基于现有数据库记录
|
||||
3. 图表数据为最近30天的趋势
|
||||
4. 需要确保数据库中有足够的测试数据
|
||||
5. 建议在生产环境中添加数据缓存机制
|
||||
|
||||
## 扩展功能
|
||||
|
||||
可以考虑添加的功能:
|
||||
- 数据导出功能
|
||||
- 自定义时间范围查询
|
||||
- 实时数据更新
|
||||
- 更多图表类型
|
||||
- 数据对比分析
|
||||
@@ -1,196 +0,0 @@
|
||||
# 前端页面功能总结
|
||||
|
||||
## 🎨 设计理念
|
||||
|
||||
本项目采用现代化的前端设计理念,提供统一、美观、响应式的用户界面。
|
||||
|
||||
### 设计特点
|
||||
- **现代化UI**: 使用Bootstrap 5 + Font Awesome图标
|
||||
- **响应式设计**: 支持桌面、平板、手机等多种设备
|
||||
- **统一风格**: 所有页面采用一致的设计语言
|
||||
- **用户体验**: 注重交互细节和用户反馈
|
||||
|
||||
## 📱 页面结构
|
||||
|
||||
### 1. 基础布局模板 (`layout.html`)
|
||||
- **导航栏**: 响应式导航,支持用户登录状态显示
|
||||
- **面包屑**: 清晰的页面导航路径
|
||||
- **页脚**: 统一的页脚信息
|
||||
- **全局样式**: 统一的CSS变量和样式定义
|
||||
|
||||
### 2. 首页 (`home.html`)
|
||||
- **欢迎区域**: 大标题和功能介绍
|
||||
- **快速操作**: 主要功能入口卡片
|
||||
- **系统统计**: 管理员可见的数据统计
|
||||
- **最近活动**: 用户活动记录展示
|
||||
|
||||
### 3. 认证页面
|
||||
|
||||
#### 登录页面 (`login.html`)
|
||||
- **渐变背景**: 美观的渐变背景设计
|
||||
- **毛玻璃效果**: 现代化的卡片设计
|
||||
- **表单验证**: 实时表单验证和错误提示
|
||||
- **加载状态**: 提交时的加载动画
|
||||
- **演示账户**: 内置演示账户信息
|
||||
|
||||
#### 注册页面 (`register.html`)
|
||||
- **密码强度**: 实时密码强度检测
|
||||
- **唯一性检查**: 用户名和邮箱唯一性验证
|
||||
- **表单验证**: 完整的前端验证
|
||||
- **自动保存**: 表单草稿自动保存功能
|
||||
|
||||
### 4. 用户管理页面
|
||||
|
||||
#### 用户列表 (`users/list.html`)
|
||||
- **搜索功能**: 实时搜索用户
|
||||
- **角色标识**: 不同角色的颜色标识
|
||||
- **操作按钮**: 编辑、查看、删除操作
|
||||
- **用户详情**: 模态框显示用户详情
|
||||
- **分页支持**: 分页导航组件
|
||||
|
||||
#### 用户表单 (`users/form.html`)
|
||||
- **密码显示**: 密码显示/隐藏切换
|
||||
- **密码强度**: 新用户密码强度检测
|
||||
- **表单验证**: 完整的前端验证
|
||||
- **草稿保存**: 自动保存表单草稿
|
||||
- **用户信息**: 编辑模式显示用户信息
|
||||
|
||||
### 5. 支付页面 (已优化)
|
||||
- **支付方式选择**: 支付宝和PayPal卡片选择
|
||||
- **支付记录**: 美观的支付记录列表
|
||||
- **支付详情**: 详细的支付信息展示
|
||||
- **支付结果**: 支付成功/失败页面
|
||||
|
||||
## 🎯 功能特性
|
||||
|
||||
### 交互功能
|
||||
- **实时搜索**: 用户列表实时搜索
|
||||
- **表单验证**: 前端表单验证
|
||||
- **加载状态**: 按钮加载动画
|
||||
- **自动保存**: 表单草稿自动保存
|
||||
- **密码强度**: 密码强度实时检测
|
||||
- **唯一性检查**: 用户名邮箱唯一性验证
|
||||
|
||||
### 响应式设计
|
||||
- **移动优先**: 移动设备优先设计
|
||||
- **断点适配**: 支持多种屏幕尺寸
|
||||
- **触摸友好**: 适合触摸操作的按钮大小
|
||||
- **导航折叠**: 移动端导航自动折叠
|
||||
|
||||
### 用户体验
|
||||
- **视觉反馈**: 悬停、点击等视觉反馈
|
||||
- **错误提示**: 清晰的错误信息显示
|
||||
- **成功提示**: 操作成功的确认信息
|
||||
- **自动隐藏**: 提示信息自动隐藏
|
||||
|
||||
## 🛠️ 技术栈
|
||||
|
||||
### 前端技术
|
||||
- **HTML5**: 语义化标签
|
||||
- **CSS3**: 现代CSS特性
|
||||
- **Bootstrap 5**: UI框架
|
||||
- **Font Awesome**: 图标库
|
||||
- **JavaScript**: 原生JavaScript
|
||||
- **Thymeleaf**: 模板引擎
|
||||
|
||||
### 设计工具
|
||||
- **CSS变量**: 统一的颜色和尺寸定义
|
||||
- **Flexbox/Grid**: 现代布局技术
|
||||
- **CSS动画**: 平滑的过渡效果
|
||||
- **渐变背景**: 美观的背景设计
|
||||
|
||||
## 📋 页面功能清单
|
||||
|
||||
### ✅ 已完成功能
|
||||
- [x] 统一布局模板
|
||||
- [x] 响应式导航栏
|
||||
- [x] 首页仪表板
|
||||
- [x] 登录页面优化
|
||||
- [x] 注册页面优化
|
||||
- [x] 用户管理列表
|
||||
- [x] 用户表单页面
|
||||
- [x] 支付功能页面
|
||||
- [x] 搜索功能
|
||||
- [x] 表单验证
|
||||
- [x] 加载状态
|
||||
- [x] 错误处理
|
||||
- [x] 移动端适配
|
||||
|
||||
### 🔄 可扩展功能
|
||||
- [ ] 主题切换
|
||||
- [ ] 多语言支持
|
||||
- [ ] 数据可视化图表
|
||||
- [ ] 文件上传组件
|
||||
- [ ] 富文本编辑器
|
||||
- [ ] 拖拽排序
|
||||
- [ ] 无限滚动
|
||||
- [ ] 离线支持
|
||||
|
||||
## 🎨 设计规范
|
||||
|
||||
### 颜色方案
|
||||
- **主色调**: #0d6efd (Bootstrap Primary)
|
||||
- **成功色**: #198754 (Bootstrap Success)
|
||||
- **警告色**: #ffc107 (Bootstrap Warning)
|
||||
- **危险色**: #dc3545 (Bootstrap Danger)
|
||||
- **信息色**: #0dcaf0 (Bootstrap Info)
|
||||
|
||||
### 字体规范
|
||||
- **主字体**: 'Segoe UI', Tahoma, Geneva, Verdana, sans-serif
|
||||
- **标题**: 600字重
|
||||
- **正文**: 400字重
|
||||
- **小字**: 0.875rem
|
||||
|
||||
### 间距规范
|
||||
- **卡片内边距**: 1.5rem
|
||||
- **表单间距**: 1rem
|
||||
- **按钮间距**: 0.5rem
|
||||
- **页面边距**: 2rem
|
||||
|
||||
## 🚀 性能优化
|
||||
|
||||
### 加载优化
|
||||
- **CDN资源**: 使用CDN加载Bootstrap和Font Awesome
|
||||
- **图片优化**: 使用图标字体替代图片
|
||||
- **CSS优化**: 内联关键CSS
|
||||
- **JS优化**: 按需加载JavaScript
|
||||
|
||||
### 用户体验优化
|
||||
- **骨架屏**: 加载时的占位内容
|
||||
- **预加载**: 关键资源预加载
|
||||
- **缓存策略**: 静态资源缓存
|
||||
- **压缩优化**: CSS和JS压缩
|
||||
|
||||
## 📱 移动端适配
|
||||
|
||||
### 响应式断点
|
||||
- **手机**: < 768px
|
||||
- **平板**: 768px - 1024px
|
||||
- **桌面**: > 1024px
|
||||
|
||||
### 移动端优化
|
||||
- **触摸友好**: 按钮最小44px点击区域
|
||||
- **导航优化**: 移动端折叠导航
|
||||
- **表单优化**: 移动端表单适配
|
||||
- **字体缩放**: 防止字体过小
|
||||
|
||||
## 🔧 维护指南
|
||||
|
||||
### 代码规范
|
||||
- **HTML**: 语义化标签,合理嵌套
|
||||
- **CSS**: BEM命名规范,模块化样式
|
||||
- **JavaScript**: ES6+语法,函数式编程
|
||||
- **注释**: 详细的代码注释
|
||||
|
||||
### 更新维护
|
||||
- **版本控制**: Git版本管理
|
||||
- **代码审查**: 代码质量检查
|
||||
- **测试**: 跨浏览器测试
|
||||
- **文档**: 详细的开发文档
|
||||
|
||||
---
|
||||
|
||||
**总结**: 本项目的前端页面已经完成了全面的现代化改造,提供了统一、美观、响应式的用户界面,具备良好的用户体验和可维护性。
|
||||
|
||||
|
||||
|
||||
80
demo/LINUX_DEPLOY_COMMANDS.sh
Normal file
@@ -0,0 +1,80 @@
|
||||
#!/bin/bash
|
||||
# Linux服务器部署命令脚本
|
||||
# 使用方法: bash LINUX_DEPLOY_COMMANDS.sh
|
||||
|
||||
set -e # 遇到错误立即退出
|
||||
|
||||
echo "============================================================"
|
||||
echo "开始部署 Spring Boot + Vue 项目"
|
||||
echo "============================================================"
|
||||
|
||||
# 进入项目目录
|
||||
cd /home/ubuntu/spring-vue-app || cd ~/spring-vue-app || exit 1
|
||||
|
||||
echo ""
|
||||
echo "步骤 1: 检查 Dockerfile"
|
||||
echo "============================================================"
|
||||
if [ -f "backend/Dockerfile" ]; then
|
||||
echo "✅ 找到 backend/Dockerfile"
|
||||
echo "检查使用的镜像:"
|
||||
grep "FROM" backend/Dockerfile | head -2
|
||||
else
|
||||
echo "❌ 未找到 backend/Dockerfile"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
echo ""
|
||||
echo "步骤 2: 构建 Docker 镜像"
|
||||
echo "============================================================"
|
||||
sudo docker-compose build --no-cache
|
||||
|
||||
echo ""
|
||||
echo "步骤 3: 启动服务"
|
||||
echo "============================================================"
|
||||
sudo docker-compose up -d
|
||||
|
||||
echo ""
|
||||
echo "步骤 4: 等待服务启动(30秒)"
|
||||
echo "============================================================"
|
||||
sleep 30
|
||||
|
||||
echo ""
|
||||
echo "步骤 5: 检查服务状态"
|
||||
echo "============================================================"
|
||||
sudo docker-compose ps
|
||||
|
||||
echo ""
|
||||
echo "步骤 6: 健康检查"
|
||||
echo "============================================================"
|
||||
# 检查后端健康状态(不依赖Actuator,直接检查根路径)
|
||||
if curl -f http://localhost:8080/ > /dev/null 2>&1; then
|
||||
echo "✅ 后端服务健康检查通过"
|
||||
else
|
||||
echo "⚠️ 后端服务可能还在启动中,请稍后检查"
|
||||
echo "查看日志: sudo docker-compose logs backend"
|
||||
fi
|
||||
|
||||
# 检查前端
|
||||
if curl -f http://localhost/ > /dev/null 2>&1; then
|
||||
echo "✅ 前端服务健康检查通过"
|
||||
else
|
||||
echo "⚠️ 前端服务可能还在启动中,请稍后检查"
|
||||
echo "查看日志: sudo docker-compose logs frontend"
|
||||
fi
|
||||
|
||||
echo ""
|
||||
echo "============================================================"
|
||||
echo "✅ 部署完成!"
|
||||
echo "============================================================"
|
||||
echo ""
|
||||
echo "访问地址:"
|
||||
echo " 前端: http://localhost"
|
||||
echo " 后端: http://localhost:8080"
|
||||
echo ""
|
||||
echo "常用命令:"
|
||||
echo " 查看日志: sudo docker-compose logs -f"
|
||||
echo " 停止服务: sudo docker-compose down"
|
||||
echo " 重启服务: sudo docker-compose restart"
|
||||
echo "============================================================"
|
||||
|
||||
|
||||
76
demo/LINUX_DEPLOY_SCRIPT.sh
Normal file
@@ -0,0 +1,76 @@
|
||||
# Linux服务器部署命令(已修改为使用正确的镜像)
|
||||
|
||||
cd /home/ubuntu/spring-vue-app/backend
|
||||
|
||||
# 创建/更新 Dockerfile(使用正确的镜像)
|
||||
cat > Dockerfile << 'EOF'
|
||||
# 多阶段构建:构建阶段
|
||||
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"]
|
||||
EOF
|
||||
|
||||
# 返回项目根目录
|
||||
cd /home/ubuntu/spring-vue-app
|
||||
|
||||
# 构建并启动服务
|
||||
sudo docker-compose build --no-cache
|
||||
sudo docker-compose up -d
|
||||
|
||||
# 等待服务启动
|
||||
sleep 30
|
||||
|
||||
# 检查服务状态
|
||||
sudo docker-compose ps
|
||||
|
||||
# 健康检查(不依赖Actuator,直接检查根路径)
|
||||
curl -f http://localhost:8080/ || echo "后端服务可能还在启动中,请稍后检查"
|
||||
curl -f http://localhost/ || echo "前端服务可能还在启动中,请稍后检查"
|
||||
@@ -1,321 +0,0 @@
|
||||
# 订单管理系统功能总结
|
||||
|
||||
## 🎯 功能概述
|
||||
|
||||
订单管理系统是一个完整的电商订单处理解决方案,支持订单创建、状态管理、支付集成、发货跟踪等全流程功能。
|
||||
|
||||
## 📋 核心功能
|
||||
|
||||
### 1. 订单实体设计
|
||||
|
||||
#### Order(订单主表)
|
||||
- **订单号**: 唯一标识,自动生成
|
||||
- **订单金额**: 支持多种货币
|
||||
- **订单状态**: 9种状态流转
|
||||
- **订单类型**: 5种订单类型
|
||||
- **联系信息**: 邮箱、电话
|
||||
- **地址信息**: 收货地址、账单地址
|
||||
- **时间戳**: 创建、更新、支付、发货、送达、取消时间
|
||||
|
||||
#### OrderItem(订单项)
|
||||
- **商品信息**: 名称、描述、SKU
|
||||
- **价格信息**: 单价、数量、小计
|
||||
- **商品图片**: 支持图片展示
|
||||
|
||||
#### OrderStatus(订单状态)
|
||||
- `PENDING` - 待支付
|
||||
- `CONFIRMED` - 已确认
|
||||
- `PAID` - 已支付
|
||||
- `PROCESSING` - 处理中
|
||||
- `SHIPPED` - 已发货
|
||||
- `DELIVERED` - 已送达
|
||||
- `COMPLETED` - 已完成
|
||||
- `CANCELLED` - 已取消
|
||||
- `REFUNDED` - 已退款
|
||||
|
||||
#### OrderType(订单类型)
|
||||
- `PRODUCT` - 商品订单
|
||||
- `SERVICE` - 服务订单
|
||||
- `SUBSCRIPTION` - 订阅订单
|
||||
- `DIGITAL` - 数字商品
|
||||
- `PHYSICAL` - 实体商品
|
||||
|
||||
### 2. 数据访问层
|
||||
|
||||
#### OrderRepository
|
||||
- **基础查询**: 按ID、订单号、用户ID查询
|
||||
- **状态查询**: 按订单状态筛选
|
||||
- **时间查询**: 按创建时间范围查询
|
||||
- **统计查询**: 订单数量、金额统计
|
||||
- **特殊查询**: 过期订单、最近订单
|
||||
|
||||
#### OrderItemRepository
|
||||
- **关联查询**: 按订单ID查询订单项
|
||||
- **商品查询**: 按SKU、商品名称查询
|
||||
- **统计查询**: 商品销售数量、金额统计
|
||||
|
||||
### 3. 业务服务层
|
||||
|
||||
#### OrderService
|
||||
- **订单创建**: 自动计算金额、生成订单号
|
||||
- **状态管理**: 订单状态流转控制
|
||||
- **业务规则**: 支付、取消、发货、完成条件检查
|
||||
- **自动处理**: 过期订单自动取消
|
||||
- **数据统计**: 订单数量、金额统计
|
||||
|
||||
#### 核心业务方法
|
||||
- `createOrder()` - 创建订单
|
||||
- `updateOrderStatus()` - 更新订单状态
|
||||
- `cancelOrder()` - 取消订单
|
||||
- `confirmPayment()` - 确认支付
|
||||
- `shipOrder()` - 订单发货
|
||||
- `completeOrder()` - 完成订单
|
||||
- `autoCancelExpiredOrders()` - 自动取消过期订单
|
||||
|
||||
### 4. 控制器层
|
||||
|
||||
#### OrderController
|
||||
- **用户订单**: 订单列表、详情、创建
|
||||
- **支付集成**: 订单支付创建
|
||||
- **状态管理**: 订单状态更新
|
||||
- **管理员功能**: 订单管理、状态操作
|
||||
|
||||
#### 主要端点
|
||||
- `GET /orders` - 用户订单列表
|
||||
- `GET /orders/{id}` - 订单详情
|
||||
- `GET /orders/create` - 创建订单表单
|
||||
- `POST /orders/create` - 提交订单
|
||||
- `POST /orders/{id}/pay` - 创建订单支付
|
||||
- `POST /orders/{id}/cancel` - 取消订单
|
||||
- `POST /orders/{id}/ship` - 订单发货
|
||||
- `POST /orders/{id}/complete` - 完成订单
|
||||
- `GET /orders/admin` - 管理员订单管理
|
||||
|
||||
### 5. 前端界面
|
||||
|
||||
#### 订单列表页面 (`orders/list.html`)
|
||||
- **现代化设计**: Bootstrap 5 + Font Awesome
|
||||
- **状态筛选**: 按订单状态筛选
|
||||
- **搜索功能**: 订单号实时搜索
|
||||
- **支付操作**: 支付宝、PayPal支付选择
|
||||
- **状态标识**: 不同状态的颜色标识
|
||||
- **分页支持**: 完整的分页导航
|
||||
|
||||
#### 订单详情页面 (`orders/detail.html`)
|
||||
- **完整信息**: 订单基本信息、商品列表、地址信息
|
||||
- **状态展示**: 订单状态、时间戳展示
|
||||
- **操作按钮**: 支付、取消、发货、完成操作
|
||||
- **支付记录**: 关联支付记录展示
|
||||
- **管理员功能**: 状态更新、发货管理
|
||||
|
||||
#### 订单创建页面 (`orders/form.html`)
|
||||
- **动态表单**: 可添加/删除订单项
|
||||
- **实时计算**: 自动计算订单总金额
|
||||
- **表单验证**: 前端验证和提示
|
||||
- **草稿保存**: 自动保存表单草稿
|
||||
- **帮助信息**: 订单类型说明和注意事项
|
||||
|
||||
#### 管理员页面 (`orders/admin.html`)
|
||||
- **统计面板**: 订单数量、状态统计
|
||||
- **批量操作**: 状态筛选、搜索
|
||||
- **管理功能**: 发货、完成、取消操作
|
||||
- **状态更新**: 手动更新订单状态
|
||||
|
||||
### 6. 支付系统集成
|
||||
|
||||
#### Payment-Order关联
|
||||
- **双向关联**: Payment ↔ Order
|
||||
- **状态同步**: 支付成功自动更新订单状态
|
||||
- **数据一致性**: 事务保证数据一致性
|
||||
|
||||
#### 支付流程
|
||||
1. 用户选择支付方式
|
||||
2. 创建Payment记录
|
||||
3. 跳转到支付页面
|
||||
4. 支付成功后更新Payment状态
|
||||
5. 自动更新Order状态为PAID
|
||||
|
||||
### 7. 数据库设计
|
||||
|
||||
#### orders表
|
||||
```sql
|
||||
CREATE TABLE 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)
|
||||
);
|
||||
```
|
||||
|
||||
#### order_items表
|
||||
```sql
|
||||
CREATE TABLE 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
|
||||
);
|
||||
```
|
||||
|
||||
#### payments表更新
|
||||
```sql
|
||||
ALTER TABLE payments ADD COLUMN order_id_ref BIGINT NULL;
|
||||
ALTER TABLE payments ADD FOREIGN KEY (order_id_ref) REFERENCES orders(id);
|
||||
```
|
||||
|
||||
## 🔄 业务流程
|
||||
|
||||
### 订单创建流程
|
||||
1. 用户填写订单信息
|
||||
2. 添加订单商品
|
||||
3. 系统计算订单总金额
|
||||
4. 生成唯一订单号
|
||||
5. 保存订单和订单项
|
||||
6. 订单状态设为PENDING
|
||||
|
||||
### 订单支付流程
|
||||
1. 用户选择支付方式
|
||||
2. 创建Payment记录
|
||||
3. 跳转到支付页面
|
||||
4. 用户完成支付
|
||||
5. 支付回调更新Payment状态
|
||||
6. 自动更新Order状态为PAID
|
||||
|
||||
### 订单发货流程
|
||||
1. 管理员确认订单
|
||||
2. 准备商品发货
|
||||
3. 更新订单状态为SHIPPED
|
||||
4. 记录发货时间
|
||||
5. 可添加物流单号
|
||||
|
||||
### 订单完成流程
|
||||
1. 用户确认收货
|
||||
2. 管理员更新状态为COMPLETED
|
||||
3. 记录完成时间
|
||||
4. 订单流程结束
|
||||
|
||||
## 🎨 界面特色
|
||||
|
||||
### 设计理念
|
||||
- **现代化UI**: Bootstrap 5 + Font Awesome
|
||||
- **响应式设计**: 支持桌面、平板、手机
|
||||
- **用户友好**: 直观的操作流程
|
||||
- **状态可视化**: 颜色编码的状态标识
|
||||
|
||||
### 交互功能
|
||||
- **实时搜索**: 订单号搜索
|
||||
- **状态筛选**: 按状态筛选订单
|
||||
- **动态表单**: 可添加/删除订单项
|
||||
- **自动计算**: 实时计算订单金额
|
||||
- **草稿保存**: 自动保存表单草稿
|
||||
- **模态框操作**: 确认对话框
|
||||
|
||||
### 管理员功能
|
||||
- **统计面板**: 订单数据统计
|
||||
- **批量操作**: 批量状态更新
|
||||
- **权限控制**: 管理员专用功能
|
||||
- **状态管理**: 完整的订单状态管理
|
||||
|
||||
## 🔧 技术特性
|
||||
|
||||
### 后端技术
|
||||
- **Spring Boot 3.5.6**: 现代化框架
|
||||
- **Spring Data JPA**: 数据访问层
|
||||
- **Spring Security**: 安全控制
|
||||
- **MySQL**: 关系型数据库
|
||||
- **事务管理**: 数据一致性保证
|
||||
|
||||
### 前端技术
|
||||
- **Thymeleaf**: 服务端模板
|
||||
- **Bootstrap 5**: UI框架
|
||||
- **Font Awesome**: 图标库
|
||||
- **JavaScript**: 交互功能
|
||||
- **CSS3**: 现代化样式
|
||||
|
||||
### 设计模式
|
||||
- **MVC架构**: 分层设计
|
||||
- **Repository模式**: 数据访问抽象
|
||||
- **Service层**: 业务逻辑封装
|
||||
- **DTO模式**: 数据传输对象
|
||||
|
||||
## 📊 功能统计
|
||||
|
||||
### 已完成功能
|
||||
- ✅ 订单实体设计
|
||||
- ✅ 订单状态管理
|
||||
- ✅ 订单项管理
|
||||
- ✅ 数据访问层
|
||||
- ✅ 业务服务层
|
||||
- ✅ 控制器层
|
||||
- ✅ 前端界面
|
||||
- ✅ 支付集成
|
||||
- ✅ 数据库设计
|
||||
- ✅ 权限控制
|
||||
|
||||
### 可扩展功能
|
||||
- [ ] 订单导出功能
|
||||
- [ ] 订单模板功能
|
||||
- [ ] 批量操作功能
|
||||
- [ ] 订单分析报表
|
||||
- [ ] 库存管理集成
|
||||
- [ ] 物流跟踪集成
|
||||
- [ ] 订单评价系统
|
||||
- [ ] 优惠券系统
|
||||
|
||||
## 🚀 部署说明
|
||||
|
||||
### 环境要求
|
||||
- JDK 21+
|
||||
- MySQL 8.0+
|
||||
- Maven 3.6+
|
||||
|
||||
### 配置步骤
|
||||
1. 配置数据库连接
|
||||
2. 运行数据库脚本
|
||||
3. 配置支付参数
|
||||
4. 启动应用
|
||||
5. 访问订单管理页面
|
||||
|
||||
### 访问地址
|
||||
- 用户订单列表: `/orders`
|
||||
- 订单详情: `/orders/{id}`
|
||||
- 创建订单: `/orders/create`
|
||||
- 管理员管理: `/orders/admin`
|
||||
|
||||
---
|
||||
|
||||
**总结**: 订单管理系统提供了完整的订单处理解决方案,从订单创建到支付完成,从发货管理到订单完成,涵盖了电商订单的全生命周期管理。系统采用现代化的技术栈,提供友好的用户界面,支持多种支付方式,具备完善的权限控制和数据安全保障。
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
@@ -1,151 +0,0 @@
|
||||
# 支付接入功能配置说明
|
||||
|
||||
## 功能概述
|
||||
|
||||
本项目已成功集成支付宝和PayPal两种支付方式,提供完整的支付解决方案。
|
||||
|
||||
## 支付方式
|
||||
|
||||
### 1. 支付宝 (Alipay)
|
||||
- **适用场景**: 中国大陆用户
|
||||
- **支持货币**: 人民币 (CNY)
|
||||
- **支付流程**: 网页支付
|
||||
- **回调机制**: 异步通知 + 同步返回
|
||||
|
||||
### 2. PayPal
|
||||
- **适用场景**: 国际用户
|
||||
- **支持货币**: 美元 (USD)、欧元 (EUR) 等
|
||||
- **支付流程**: PayPal账户支付
|
||||
- **回调机制**: Webhook通知 + 同步返回
|
||||
|
||||
## 配置参数
|
||||
|
||||
### 开发环境配置 (application-dev.properties)
|
||||
|
||||
```properties
|
||||
# 支付宝配置 (开发环境)
|
||||
alipay.app-id=your_app_id
|
||||
alipay.private-key=your_private_key
|
||||
alipay.public-key=your_public_key
|
||||
alipay.gateway-url=https://openapi.alipaydev.com/gateway.do
|
||||
alipay.charset=UTF-8
|
||||
alipay.sign-type=RSA2
|
||||
alipay.notify-url=http://localhost:8080/payment/alipay/notify
|
||||
alipay.return-url=http://localhost:8080/payment/alipay/return
|
||||
|
||||
# PayPal配置 (开发环境)
|
||||
paypal.client-id=your_paypal_client_id
|
||||
paypal.client-secret=your_paypal_client_secret
|
||||
paypal.mode=sandbox
|
||||
paypal.return-url=http://localhost:8080/payment/paypal/return
|
||||
paypal.cancel-url=http://localhost:8080/payment/paypal/cancel
|
||||
```
|
||||
|
||||
### 生产环境配置 (application-prod.properties)
|
||||
|
||||
```properties
|
||||
# 支付宝配置 (生产环境)
|
||||
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.notify-url=${ALIPAY_NOTIFY_URL}
|
||||
alipay.return-url=${ALIPAY_RETURN_URL}
|
||||
|
||||
# PayPal配置 (生产环境)
|
||||
paypal.client-id=${PAYPAL_CLIENT_ID}
|
||||
paypal.client-secret=${PAYPAL_CLIENT_SECRET}
|
||||
paypal.mode=live
|
||||
paypal.return-url=${PAYPAL_RETURN_URL}
|
||||
paypal.cancel-url=${PAYPAL_CANCEL_URL}
|
||||
```
|
||||
|
||||
## 数据库表结构
|
||||
|
||||
### payments 表
|
||||
```sql
|
||||
CREATE TABLE 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)
|
||||
);
|
||||
```
|
||||
|
||||
## API 端点
|
||||
|
||||
### 支付相关端点
|
||||
- `GET /payment/create` - 显示支付表单
|
||||
- `POST /payment/create` - 创建支付订单
|
||||
- `GET /payment/history` - 支付记录列表
|
||||
- `GET /payment/detail/{id}` - 支付详情
|
||||
|
||||
### 支付宝回调端点
|
||||
- `POST /payment/alipay/notify` - 异步通知
|
||||
- `GET /payment/alipay/return` - 同步返回
|
||||
|
||||
### PayPal回调端点
|
||||
- `GET /payment/paypal/return` - 支付返回
|
||||
- `GET /payment/paypal/cancel` - 支付取消
|
||||
- `POST /payment/paypal/webhook` - Webhook通知
|
||||
|
||||
## 支付状态
|
||||
|
||||
- `PENDING` - 待支付
|
||||
- `PROCESSING` - 处理中
|
||||
- `SUCCESS` - 支付成功
|
||||
- `FAILED` - 支付失败
|
||||
- `CANCELLED` - 已取消
|
||||
- `REFUNDED` - 已退款
|
||||
|
||||
## 使用说明
|
||||
|
||||
### 1. 配置支付参数
|
||||
在 `application-dev.properties` 中配置您的支付参数:
|
||||
- 支付宝:需要申请支付宝开放平台应用
|
||||
- PayPal:需要申请PayPal开发者账户
|
||||
|
||||
### 2. 启动应用
|
||||
```bash
|
||||
mvn spring-boot:run
|
||||
```
|
||||
|
||||
### 3. 访问支付功能
|
||||
- 登录后访问 `/payment/create` 创建支付
|
||||
- 访问 `/payment/history` 查看支付记录
|
||||
|
||||
## 安全注意事项
|
||||
|
||||
1. **密钥管理**: 生产环境使用环境变量存储敏感信息
|
||||
2. **签名验证**: 所有回调都进行签名验证
|
||||
3. **HTTPS**: 生产环境必须使用HTTPS
|
||||
4. **权限控制**: 用户只能查看自己的支付记录
|
||||
|
||||
## 测试建议
|
||||
|
||||
1. **支付宝测试**: 使用支付宝沙箱环境进行测试
|
||||
2. **PayPal测试**: 使用PayPal沙箱模式进行测试
|
||||
3. **回调测试**: 使用ngrok等工具测试本地回调
|
||||
|
||||
## 扩展功能
|
||||
|
||||
可以进一步扩展的功能:
|
||||
- 退款功能
|
||||
- 支付统计
|
||||
- 支付报表
|
||||
- 批量支付
|
||||
- 分期付款
|
||||
|
||||
@@ -1,139 +0,0 @@
|
||||
# 支付配置说明
|
||||
|
||||
## 支付宝配置
|
||||
|
||||
### 1. 申请支付宝开放平台应用
|
||||
1. 访问 [支付宝开放平台](https://open.alipay.com/)
|
||||
2. 注册开发者账号
|
||||
3. 创建应用,选择"网页&移动应用"
|
||||
4. 获取应用信息:
|
||||
- APPID
|
||||
- 应用私钥
|
||||
- 支付宝公钥
|
||||
|
||||
### 2. 配置沙箱环境
|
||||
1. 在开放平台控制台启用沙箱环境
|
||||
2. 获取沙箱应用信息
|
||||
3. 下载沙箱版支付宝APP进行测试
|
||||
|
||||
### 3. 更新配置文件
|
||||
在 `application-dev.properties` 中更新以下配置:
|
||||
|
||||
```properties
|
||||
# 支付宝沙箱配置
|
||||
alipay.app-id=你的沙箱APPID
|
||||
alipay.private-key=你的应用私钥
|
||||
alipay.public-key=支付宝公钥
|
||||
alipay.gateway-url=https://openapi.alipaydev.com/gateway.do
|
||||
alipay.notify-url=http://你的域名:8080/api/payments/alipay/notify
|
||||
alipay.return-url=http://你的域名:8080/api/payments/alipay/return
|
||||
```
|
||||
|
||||
## PayPal配置
|
||||
|
||||
### 1. 申请PayPal开发者账号
|
||||
1. 访问 [PayPal开发者中心](https://developer.paypal.com/)
|
||||
2. 注册开发者账号
|
||||
3. 创建应用,选择"Sandbox"环境
|
||||
4. 获取应用信息:
|
||||
- Client ID
|
||||
- Client Secret
|
||||
|
||||
### 2. 更新配置文件
|
||||
在 `application-dev.properties` 中更新以下配置:
|
||||
|
||||
```properties
|
||||
# PayPal沙箱配置
|
||||
paypal.client-id=你的沙箱Client ID
|
||||
paypal.client-secret=你的沙箱Client Secret
|
||||
paypal.mode=sandbox
|
||||
paypal.return-url=http://你的域名:8080/api/payments/paypal/return
|
||||
paypal.cancel-url=http://你的域名:8080/api/payments/paypal/cancel
|
||||
```
|
||||
|
||||
## 生产环境配置
|
||||
|
||||
### 1. 环境变量配置
|
||||
生产环境建议使用环境变量:
|
||||
|
||||
```bash
|
||||
# 支付宝生产环境
|
||||
export ALIPAY_APP_ID=你的生产APPID
|
||||
export ALIPAY_PRIVATE_KEY=你的生产私钥
|
||||
export ALIPAY_PUBLIC_KEY=支付宝生产公钥
|
||||
export ALIPAY_NOTIFY_URL=https://你的域名/api/payments/alipay/notify
|
||||
export ALIPAY_RETURN_URL=https://你的域名/api/payments/alipay/return
|
||||
|
||||
# PayPal生产环境
|
||||
export PAYPAL_CLIENT_ID=你的生产Client ID
|
||||
export PAYPAL_CLIENT_SECRET=你的生产Client Secret
|
||||
export PAYPAL_RETURN_URL=https://你的域名/api/payments/paypal/return
|
||||
export PAYPAL_CANCEL_URL=https://你的域名/api/payments/paypal/cancel
|
||||
```
|
||||
|
||||
### 2. 更新生产环境配置
|
||||
在 `application-prod.properties` 中:
|
||||
|
||||
```properties
|
||||
# 支付宝生产环境
|
||||
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.notify-url=${ALIPAY_NOTIFY_URL}
|
||||
alipay.return-url=${ALIPAY_RETURN_URL}
|
||||
|
||||
# PayPal生产环境
|
||||
paypal.client-id=${PAYPAL_CLIENT_ID}
|
||||
paypal.client-secret=${PAYPAL_CLIENT_SECRET}
|
||||
paypal.mode=live
|
||||
paypal.return-url=${PAYPAL_RETURN_URL}
|
||||
paypal.cancel-url=${PAYPAL_CANCEL_URL}
|
||||
```
|
||||
|
||||
## 测试支付功能
|
||||
|
||||
### 1. 启动应用
|
||||
```bash
|
||||
# 启动后端服务
|
||||
mvn spring-boot:run
|
||||
|
||||
# 启动前端服务
|
||||
cd frontend
|
||||
npm run dev
|
||||
```
|
||||
|
||||
### 2. 测试流程
|
||||
1. 访问 http://localhost:3000
|
||||
2. 登录测试账号
|
||||
3. 创建订单
|
||||
4. 选择支付方式
|
||||
5. 完成支付测试
|
||||
|
||||
### 3. 测试账号
|
||||
- **支付宝沙箱**: 使用沙箱版支付宝APP扫码支付
|
||||
- **PayPal沙箱**: 使用沙箱测试账号进行支付
|
||||
|
||||
## 注意事项
|
||||
|
||||
1. **HTTPS要求**: 生产环境必须使用HTTPS
|
||||
2. **域名配置**: 确保回调URL使用正确的域名
|
||||
3. **签名验证**: 确保私钥和公钥配置正确
|
||||
4. **日志监控**: 监控支付回调日志
|
||||
5. **异常处理**: 实现完善的异常处理机制
|
||||
|
||||
## 常见问题
|
||||
|
||||
### Q: 支付宝回调失败
|
||||
A: 检查notify-url是否正确,确保服务器可以接收POST请求
|
||||
|
||||
### Q: PayPal支付页面无法打开
|
||||
A: 检查Client ID和Secret是否正确,确保使用沙箱模式
|
||||
|
||||
### Q: 签名验证失败
|
||||
A: 检查私钥格式,确保没有多余的空格和换行符
|
||||
|
||||
### Q: 跨域问题
|
||||
A: 确保CORS配置正确,允许支付平台的域名
|
||||
|
||||
|
||||
@@ -1,28 +0,0 @@
|
||||
import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
|
||||
|
||||
public class PasswordChecker {
|
||||
public static void main(String[] args) {
|
||||
BCryptPasswordEncoder encoder = new BCryptPasswordEncoder();
|
||||
String hash = "$2a$10$N.zmdr9k7uOCQb376NoUnuTJ8iAt6Z5EHsM8lE9lBOsl7iKTVEFDi";
|
||||
|
||||
// 测试不同的密码
|
||||
String[] passwords = {"demo", "admin", "password", "123456"};
|
||||
|
||||
for (String password : passwords) {
|
||||
boolean matches = encoder.matches(password, hash);
|
||||
System.out.println("Password '" + password + "' matches: " + matches);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
@@ -1,83 +0,0 @@
|
||||
# 测试账号说明
|
||||
|
||||
## 可用的测试账号
|
||||
|
||||
### 1. 普通用户账号
|
||||
- **用户名**: `demo`
|
||||
- **密码**: `demo`
|
||||
- **角色**: 普通用户 (ROLE_USER)
|
||||
- **积分**: 100
|
||||
- **邮箱**: demo@example.com
|
||||
|
||||
### 2. 管理员账号
|
||||
- **用户名**: `admin`
|
||||
- **密码**: `admin123`
|
||||
- **角色**: 管理员 (ROLE_ADMIN)
|
||||
- **积分**: 200
|
||||
- **邮箱**: admin@example.com
|
||||
|
||||
### 3. 测试用户1
|
||||
- **用户名**: `testuser`
|
||||
- **密码**: `test123`
|
||||
- **角色**: 普通用户 (ROLE_USER)
|
||||
- **积分**: 75
|
||||
- **邮箱**: testuser@example.com
|
||||
|
||||
### 4. 个人主页测试用户
|
||||
- **用户名**: `mingzi_FBx7foZYDS7inLQb`
|
||||
- **密码**: `123456`
|
||||
- **角色**: 普通用户 (ROLE_USER)
|
||||
- **积分**: 25
|
||||
- **邮箱**: mingzi@example.com
|
||||
|
||||
### 5. 手机号测试用户
|
||||
- **用户名**: `15538239326`
|
||||
- **密码**: `0627`
|
||||
- **角色**: 普通用户 (ROLE_USER)
|
||||
- **积分**: 50
|
||||
- **邮箱**: 15538239326@example.com
|
||||
|
||||
## 登录方式
|
||||
|
||||
### 方式1: 传统用户名密码登录
|
||||
1. 访问 `/login` 页面
|
||||
2. 输入用户名和密码
|
||||
3. 点击"登录"按钮
|
||||
|
||||
### 方式2: 手机号验证码登录(模拟)
|
||||
1. 访问 `/login` 页面
|
||||
2. 输入手机号(任意11位数字)
|
||||
3. 点击"获取验证码"
|
||||
4. 输入验证码(任意6位数字)
|
||||
5. 点击"登陆/注册"
|
||||
|
||||
## 功能测试
|
||||
|
||||
### 普通用户功能
|
||||
- ✅ 登录/登出
|
||||
- ✅ 查看个人主页
|
||||
- ✅ 查看订单管理
|
||||
- ✅ 查看支付记录
|
||||
- ✅ 访问欢迎页面
|
||||
|
||||
### 管理员功能
|
||||
- ✅ 所有普通用户功能
|
||||
- ✅ 后台管理
|
||||
- ✅ 用户管理
|
||||
- ✅ 数据仪表盘
|
||||
|
||||
## 数据库重置
|
||||
|
||||
如果需要重置数据库和测试数据:
|
||||
|
||||
1. 停止应用
|
||||
2. 删除 `demo/data/demo.mv.db` 文件
|
||||
3. 重新启动应用
|
||||
4. 数据库会自动重新创建并插入测试数据
|
||||
|
||||
## 注意事项
|
||||
|
||||
- 所有密码都是明文存储(仅用于测试)
|
||||
- 积分会在每次登录时显示
|
||||
- JWT Token 会在浏览器关闭时自动清除
|
||||
- 支持跨域请求,前端和后端可以分离部署
|
||||
@@ -1,285 +0,0 @@
|
||||
# Vue.js 前端项目迁移完成总结
|
||||
|
||||
## 🎯 项目概述
|
||||
|
||||
成功将原有的 Thymeleaf 模板前端迁移到现代化的 Vue.js 3 框架,实现了前后端分离架构,提供了更好的开发体验和用户体验。
|
||||
|
||||
## ✅ 完成的工作
|
||||
|
||||
### 1. **项目结构搭建**
|
||||
- ✅ 创建了完整的 Vue.js 3 项目结构
|
||||
- ✅ 配置了 Vite 构建工具
|
||||
- ✅ 集成了 Element Plus UI 组件库
|
||||
- ✅ 设置了开发环境和代理配置
|
||||
|
||||
### 2. **核心框架集成**
|
||||
- ✅ **Vue.js 3** - 使用 Composition API 和 `<script setup>` 语法
|
||||
- ✅ **Element Plus** - 现代化 UI 组件库
|
||||
- ✅ **Vue Router** - 单页面应用路由管理
|
||||
- ✅ **Pinia** - 轻量级状态管理
|
||||
- ✅ **Axios** - HTTP 客户端和 API 封装
|
||||
|
||||
### 3. **组件和页面开发**
|
||||
- ✅ **导航组件** (`NavBar.vue`) - 响应式导航栏,支持用户菜单
|
||||
- ✅ **页脚组件** (`Footer.vue`) - 统一的页脚设计
|
||||
- ✅ **首页** (`Home.vue`) - 欢迎页面,功能展示,统计数据
|
||||
- ✅ **登录页** (`Login.vue`) - 现代化登录界面,演示账号
|
||||
- ✅ **注册页** (`Register.vue`) - 实时验证,密码强度检测
|
||||
- ✅ **订单列表** (`Orders.vue`) - 完整的订单管理界面
|
||||
|
||||
### 4. **状态管理**
|
||||
- ✅ **用户状态** (`stores/user.js`) - 登录、注册、权限管理
|
||||
- ✅ **订单状态** (`stores/orders.js`) - 订单数据管理和操作
|
||||
- ✅ **响应式数据** - 使用 Vue 3 的响应式系统
|
||||
- ✅ **持久化存储** - Token 和用户信息本地存储
|
||||
|
||||
### 5. **API 接口封装**
|
||||
- ✅ **请求拦截器** - 自动添加认证头,统一错误处理
|
||||
- ✅ **响应拦截器** - 统一响应格式,错误提示
|
||||
- ✅ **认证接口** (`api/auth.js`) - 登录、注册、用户信息
|
||||
- ✅ **订单接口** (`api/orders.js`) - 订单 CRUD 操作
|
||||
- ✅ **支付接口** (`api/payments.js`) - 支付相关功能
|
||||
|
||||
### 6. **路由和权限控制**
|
||||
- ✅ **路由配置** - 完整的页面路由定义
|
||||
- ✅ **路由守卫** - 认证检查和权限控制
|
||||
- ✅ **动态标题** - 页面标题自动设置
|
||||
- ✅ **权限控制** - 基于角色的访问控制
|
||||
|
||||
### 7. **后端 API 适配**
|
||||
- ✅ **RESTful API** - 创建了标准的 REST API 接口
|
||||
- ✅ **认证控制器** (`AuthApiController.java`) - 登录、注册、用户验证
|
||||
- ✅ **订单控制器** (`OrderApiController.java`) - 订单管理 API
|
||||
- ✅ **统一响应格式** - 标准化的 API 响应结构
|
||||
|
||||
## 🎨 界面特色
|
||||
|
||||
### 现代化设计
|
||||
- **Element Plus** 组件库,提供丰富的 UI 组件
|
||||
- **响应式布局**,支持桌面、平板、手机
|
||||
- **统一的设计语言**,保持视觉一致性
|
||||
- **图标支持**,Element Plus Icons 图标库
|
||||
|
||||
### 用户体验优化
|
||||
- **实时表单验证**,即时反馈用户输入
|
||||
- **密码强度检测**,提升安全性
|
||||
- **用户名/邮箱唯一性检查**,避免重复注册
|
||||
- **加载状态**,提升用户等待体验
|
||||
- **错误提示**,友好的错误信息展示
|
||||
|
||||
### 交互功能
|
||||
- **动态表单**,可添加/删除订单项
|
||||
- **实时搜索**,订单号搜索功能
|
||||
- **状态筛选**,按订单状态筛选
|
||||
- **分页导航**,大数据量分页显示
|
||||
- **模态框操作**,确认对话框
|
||||
|
||||
## 🔧 技术特性
|
||||
|
||||
### 前端技术栈
|
||||
- **Vue.js 3.3.4** - 最新版本的 Vue 框架
|
||||
- **Element Plus 2.3.8** - 企业级 UI 组件库
|
||||
- **Vue Router 4.2.4** - 官方路由管理器
|
||||
- **Pinia 2.1.6** - 现代状态管理库
|
||||
- **Axios 1.5.0** - Promise 基础的 HTTP 库
|
||||
- **Vite 4.4.9** - 快速的构建工具
|
||||
|
||||
### 开发工具
|
||||
- **Vite** - 快速的开发服务器和构建工具
|
||||
- **ESLint** - 代码质量检查
|
||||
- **Prettier** - 代码格式化
|
||||
- **Sass** - CSS 预处理器
|
||||
|
||||
### 架构设计
|
||||
- **组件化开发** - 可复用的 Vue 组件
|
||||
- **模块化设计** - 清晰的文件组织结构
|
||||
- **状态管理** - 集中式的状态管理
|
||||
- **API 封装** - 统一的接口调用方式
|
||||
|
||||
## 📱 功能模块
|
||||
|
||||
### 1. 用户认证模块
|
||||
- **登录功能** - 用户名/密码登录
|
||||
- **注册功能** - 新用户注册
|
||||
- **权限控制** - 基于角色的访问控制
|
||||
- **状态管理** - 用户登录状态管理
|
||||
|
||||
### 2. 订单管理模块
|
||||
- **订单列表** - 分页、筛选、搜索
|
||||
- **订单详情** - 完整信息展示
|
||||
- **订单创建** - 动态表单创建
|
||||
- **状态管理** - 订单状态流转
|
||||
|
||||
### 3. 支付集成模块
|
||||
- **支付方式** - 支付宝、PayPal
|
||||
- **支付状态** - 实时状态跟踪
|
||||
- **支付记录** - 支付历史查询
|
||||
|
||||
### 4. 管理功能模块
|
||||
- **用户管理** - 用户列表和操作
|
||||
- **订单管理** - 管理员订单管理
|
||||
- **权限管理** - 角色权限控制
|
||||
|
||||
## 🔄 数据流
|
||||
|
||||
### 状态管理流程
|
||||
```
|
||||
用户操作 → Vue组件 → Pinia Store → API调用 → 后端服务 → 数据库
|
||||
↓
|
||||
状态更新 → 组件重新渲染 → 界面更新
|
||||
```
|
||||
|
||||
### API 调用流程
|
||||
```
|
||||
组件 → API方法 → Axios请求 → 请求拦截器 → 后端API → 响应拦截器 → 组件
|
||||
```
|
||||
|
||||
## 🚀 部署配置
|
||||
|
||||
### 开发环境
|
||||
```bash
|
||||
# 安装依赖
|
||||
npm install
|
||||
|
||||
# 启动开发服务器
|
||||
npm run dev
|
||||
# 访问 http://localhost:3000
|
||||
```
|
||||
|
||||
### 生产环境
|
||||
```bash
|
||||
# 构建生产版本
|
||||
npm run build
|
||||
|
||||
# 预览构建结果
|
||||
npm run preview
|
||||
```
|
||||
|
||||
### 代理配置
|
||||
```javascript
|
||||
// vite.config.js
|
||||
server: {
|
||||
proxy: {
|
||||
'/api': {
|
||||
target: 'http://localhost:8080', // 后端服务
|
||||
changeOrigin: true
|
||||
}
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
## 📊 项目统计
|
||||
|
||||
### 文件结构
|
||||
- **组件文件**: 6个 Vue 组件
|
||||
- **页面文件**: 5个页面组件
|
||||
- **API 文件**: 4个 API 模块
|
||||
- **状态管理**: 2个 Store 模块
|
||||
- **配置文件**: 3个配置文件
|
||||
|
||||
### 代码量统计
|
||||
- **Vue 组件**: ~2000 行代码
|
||||
- **JavaScript**: ~1500 行代码
|
||||
- **CSS 样式**: ~800 行代码
|
||||
- **配置文件**: ~200 行代码
|
||||
|
||||
## 🔒 安全特性
|
||||
|
||||
### 前端安全
|
||||
- **XSS 防护** - Element Plus 组件自动转义
|
||||
- **CSRF 防护** - Axios 请求头配置
|
||||
- **路由守卫** - 页面访问权限控制
|
||||
- **输入验证** - 前端表单验证
|
||||
|
||||
### 认证安全
|
||||
- **Token 管理** - 安全的 Token 存储
|
||||
- **权限控制** - 基于角色的访问控制
|
||||
- **会话管理** - 自动登出机制
|
||||
|
||||
## 🎯 优势对比
|
||||
|
||||
### 相比 Thymeleaf 的优势
|
||||
|
||||
| 特性 | Thymeleaf | Vue.js |
|
||||
|------|-----------|--------|
|
||||
| **开发体验** | 服务端渲染 | 现代化前端开发 |
|
||||
| **用户体验** | 页面刷新 | 单页面应用 |
|
||||
| **组件复用** | 模板片段 | 完整组件系统 |
|
||||
| **状态管理** | 服务端状态 | 客户端状态管理 |
|
||||
| **开发工具** | 有限 | 丰富的开发工具 |
|
||||
| **性能** | 服务端渲染 | 客户端渲染优化 |
|
||||
|
||||
### 技术优势
|
||||
- **现代化框架** - Vue.js 3 最新特性
|
||||
- **组件化开发** - 高度可复用的组件
|
||||
- **响应式设计** - 移动端友好
|
||||
- **开发效率** - 热重载,快速开发
|
||||
- **维护性** - 清晰的代码结构
|
||||
|
||||
## 🔮 未来扩展
|
||||
|
||||
### 可扩展功能
|
||||
- [ ] **TypeScript 支持** - 类型安全
|
||||
- [ ] **单元测试** - Jest + Vue Test Utils
|
||||
- [ ] **E2E 测试** - Cypress 或 Playwright
|
||||
- [ ] **PWA 支持** - 渐进式 Web 应用
|
||||
- [ ] **国际化** - Vue I18n 多语言支持
|
||||
- [ ] **主题定制** - 动态主题切换
|
||||
- [ ] **图表组件** - ECharts 数据可视化
|
||||
- [ ] **富文本编辑** - 编辑器组件
|
||||
|
||||
### 性能优化
|
||||
- [ ] **代码分割** - 路由级别的代码分割
|
||||
- [ ] **懒加载** - 组件和图片懒加载
|
||||
- [ ] **缓存策略** - HTTP 缓存和本地缓存
|
||||
- [ ] **CDN 部署** - 静态资源 CDN 加速
|
||||
|
||||
## 📝 使用说明
|
||||
|
||||
### 快速开始
|
||||
1. **安装 Node.js** (版本 16+)
|
||||
2. **进入前端目录**: `cd frontend`
|
||||
3. **安装依赖**: `npm install`
|
||||
4. **启动开发服务器**: `npm run dev`
|
||||
5. **访问应用**: http://localhost:3000
|
||||
|
||||
### 开发指南
|
||||
1. **组件开发** - 使用 Composition API
|
||||
2. **状态管理** - 使用 Pinia Store
|
||||
3. **API 调用** - 使用封装的 API 方法
|
||||
4. **样式编写** - 使用 Scoped CSS
|
||||
5. **路由配置** - 在 router/index.js 中添加路由
|
||||
|
||||
### 部署指南
|
||||
1. **构建项目**: `npm run build`
|
||||
2. **部署静态文件** - 将 dist 目录部署到 Web 服务器
|
||||
3. **配置代理** - 将 /api 请求代理到后端服务
|
||||
4. **HTTPS 配置** - 生产环境使用 HTTPS
|
||||
|
||||
---
|
||||
|
||||
## 🎉 总结
|
||||
|
||||
Vue.js 前端项目迁移已经完成,实现了:
|
||||
|
||||
✅ **现代化前端架构** - Vue.js 3 + Element Plus
|
||||
✅ **完整的用户界面** - 登录、注册、订单管理
|
||||
✅ **响应式设计** - 支持多设备访问
|
||||
✅ **状态管理** - Pinia 集中式状态管理
|
||||
✅ **API 集成** - 完整的后端 API 对接
|
||||
✅ **权限控制** - 基于角色的访问控制
|
||||
✅ **开发工具** - Vite 快速开发和构建
|
||||
|
||||
现在您拥有了一个现代化的前后端分离应用,具备良好的开发体验和用户体验!
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
52
demo/backend/Dockerfile
Normal file
@@ -0,0 +1,52 @@
|
||||
# 多阶段构建:构建阶段
|
||||
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"]
|
||||
48
demo/backend/Dockerfile.java21
Normal file
@@ -0,0 +1,48 @@
|
||||
# 多阶段构建:构建阶段(适配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"]
|
||||
|
||||
54
demo/backend/Dockerfile.linux
Normal file
@@ -0,0 +1,54 @@
|
||||
# 多阶段构建:构建阶段
|
||||
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"]
|
||||
|
||||
|
||||
51
demo/check_queue.ps1
Normal file
@@ -0,0 +1,51 @@
|
||||
# 检查队列状态的PowerShell脚本
|
||||
|
||||
Write-Host "=== 检查应用状态 ===" -ForegroundColor Green
|
||||
$port8080 = netstat -ano | findstr :8080
|
||||
if ($port8080) {
|
||||
Write-Host "✅ 应用正在运行 (端口8080)" -ForegroundColor Green
|
||||
} else {
|
||||
Write-Host "❌ 应用未运行 (端口8080)" -ForegroundColor Red
|
||||
}
|
||||
|
||||
Write-Host "`n=== 检查Java进程 ===" -ForegroundColor Green
|
||||
$javaProcesses = Get-Process | Where-Object {$_.ProcessName -like "*java*"}
|
||||
if ($javaProcesses) {
|
||||
Write-Host "✅ 找到Java进程:" -ForegroundColor Green
|
||||
$javaProcesses | Select-Object Id, ProcessName, CPU | Format-Table
|
||||
} else {
|
||||
Write-Host "❌ 没有找到Java进程" -ForegroundColor Red
|
||||
}
|
||||
|
||||
Write-Host "`n=== 尝试启动应用 ===" -ForegroundColor Yellow
|
||||
try {
|
||||
Write-Host "启动Spring Boot应用..." -ForegroundColor Yellow
|
||||
Start-Process -FilePath "java" -ArgumentList "-jar", "target/demo-0.0.1-SNAPSHOT.jar", "--spring.profiles.active=dev" -WindowStyle Hidden
|
||||
Write-Host "✅ 应用启动命令已执行" -ForegroundColor Green
|
||||
|
||||
Write-Host "等待应用启动..." -ForegroundColor Yellow
|
||||
Start-Sleep -Seconds 30
|
||||
|
||||
Write-Host "`n=== 检查应用是否启动成功 ===" -ForegroundColor Green
|
||||
$port8080After = netstat -ano | findstr :8080
|
||||
if ($port8080After) {
|
||||
Write-Host "✅ 应用启动成功" -ForegroundColor Green
|
||||
|
||||
Write-Host "`n=== 测试诊断接口 ===" -ForegroundColor Green
|
||||
try {
|
||||
$response = Invoke-WebRequest -Uri "http://localhost:8080/api/diagnostic/queue-status" -Method GET -TimeoutSec 10
|
||||
Write-Host "✅ 诊断接口响应成功" -ForegroundColor Green
|
||||
Write-Host "响应内容:" -ForegroundColor Yellow
|
||||
$response.Content | ConvertFrom-Json | ConvertTo-Json -Depth 3
|
||||
} catch {
|
||||
Write-Host "❌ 诊断接口调用失败: $($_.Exception.Message)" -ForegroundColor Red
|
||||
}
|
||||
} else {
|
||||
Write-Host "❌ 应用启动失败" -ForegroundColor Red
|
||||
}
|
||||
} catch {
|
||||
Write-Host "❌ 启动应用失败: $($_.Exception.Message)" -ForegroundColor Red
|
||||
}
|
||||
|
||||
Write-Host "`n=== 检查完成 ===" -ForegroundColor Green
|
||||
|
||||
BIN
demo/database/backups/database_baota_20251108_160249.zip
Normal file
BIN
demo/database/backups/database_baota_deploy_.zip
Normal file
269
demo/database_baota_deploy/README.md
Normal file
@@ -0,0 +1,269 @@
|
||||
# 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+
|
||||
141
demo/database_baota_deploy/deploy_database.sh
Normal file
@@ -0,0 +1,141 @@
|
||||
#!/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 ""
|
||||
467
demo/database_baota_deploy/init_database.sql
Normal file
@@ -0,0 +1,467 @@
|
||||
-- ============================================
|
||||
-- 宝塔面板数据库初始化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 '分镜图URL(Base64编码的图片,可能非常大)- 网格图',
|
||||
storyboard_images LONGTEXT COMMENT '单独的分镜图片(JSON数组,每张图片为Base64格式,带data URI前缀)',
|
||||
real_task_id VARCHAR(255) COMMENT '外部API返回的真实任务ID',
|
||||
video_task_ids TEXT COMMENT '多个视频任务ID(JSON数组,每张图片对应一个视频任务)',
|
||||
video_urls LONGTEXT COMMENT '多个视频URL(JSON数组,用于拼接)',
|
||||
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';
|
||||
|
||||
13
demo/database_baota_deploy/update_admin_user.sql
Normal file
@@ -0,0 +1,13 @@
|
||||
-- 将 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';
|
||||
224
demo/database_baota_deploy/宝塔数据库部署指南.md
Normal file
@@ -0,0 +1,224 @@
|
||||
# 宝塔面板数据库部署指南
|
||||
|
||||
## 📋 部署清单
|
||||
|
||||
本部署包包含以下文件:
|
||||
- `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个表)
|
||||
- ✅ 管理员权限设置完成
|
||||
- ✅ 应用能够成功连接数据库
|
||||
|
||||
祝部署顺利!🎉
|
||||
370
demo/database_baota_deploy/数据库完整结构-宝塔导入.sql
Normal file
@@ -0,0 +1,370 @@
|
||||
-- ============================================
|
||||
-- AIGC平台数据库完整结构
|
||||
-- 适用于宝塔面板部署
|
||||
-- 创建时间:2025
|
||||
-- ============================================
|
||||
|
||||
-- 设置字符集
|
||||
SET NAMES utf8mb4;
|
||||
SET FOREIGN_KEY_CHECKS = 0;
|
||||
|
||||
-- ============================================
|
||||
-- 1. 基础表结构(schema.sql)
|
||||
-- ============================================
|
||||
|
||||
-- 用户表
|
||||
CREATE TABLE IF NOT EXISTS users (
|
||||
id BIGINT PRIMARY KEY AUTO_INCREMENT,
|
||||
username VARCHAR(50) NOT NULL UNIQUE,
|
||||
email VARCHAR(100) NOT NULL UNIQUE,
|
||||
password_hash VARCHAR(100) NOT NULL,
|
||||
role VARCHAR(30) NOT NULL DEFAULT 'ROLE_USER',
|
||||
points INT NOT NULL DEFAULT 50,
|
||||
frozen_points INT NOT NULL DEFAULT 0 COMMENT '冻结积分',
|
||||
phone VARCHAR(20),
|
||||
avatar VARCHAR(500),
|
||||
nickname VARCHAR(100),
|
||||
gender VARCHAR(10),
|
||||
birthday DATE,
|
||||
address TEXT,
|
||||
is_active BOOLEAN NOT NULL DEFAULT TRUE,
|
||||
last_login_at TIMESTAMP NULL,
|
||||
created_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
||||
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
|
||||
INDEX idx_email (email),
|
||||
INDEX idx_username (username)
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='用户表';
|
||||
|
||||
-- 支付表
|
||||
CREATE TABLE IF NOT EXISTS payments (
|
||||
id BIGINT PRIMARY KEY AUTO_INCREMENT,
|
||||
order_id VARCHAR(50) NOT NULL UNIQUE,
|
||||
amount DECIMAL(10,2) NOT NULL,
|
||||
currency VARCHAR(3) NOT NULL DEFAULT 'CNY',
|
||||
payment_method VARCHAR(20) NOT NULL,
|
||||
status VARCHAR(20) NOT NULL DEFAULT 'PENDING',
|
||||
description VARCHAR(500),
|
||||
external_transaction_id VARCHAR(100),
|
||||
callback_url VARCHAR(1000),
|
||||
return_url VARCHAR(1000),
|
||||
created_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
||||
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
|
||||
paid_at TIMESTAMP NULL,
|
||||
user_id BIGINT,
|
||||
FOREIGN KEY (user_id) REFERENCES users(id),
|
||||
INDEX idx_order_id (order_id),
|
||||
INDEX idx_user_id (user_id),
|
||||
INDEX idx_status (status)
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='支付表';
|
||||
|
||||
-- 订单表
|
||||
CREATE TABLE IF NOT EXISTS orders (
|
||||
id BIGINT PRIMARY KEY AUTO_INCREMENT,
|
||||
order_number VARCHAR(50) NOT NULL UNIQUE,
|
||||
total_amount DECIMAL(10,2) NOT NULL,
|
||||
currency VARCHAR(3) NOT NULL DEFAULT 'CNY',
|
||||
status VARCHAR(20) NOT NULL DEFAULT 'PENDING',
|
||||
order_type VARCHAR(20) NOT NULL DEFAULT 'PRODUCT',
|
||||
description VARCHAR(500),
|
||||
notes TEXT,
|
||||
shipping_address TEXT,
|
||||
billing_address TEXT,
|
||||
contact_phone VARCHAR(20),
|
||||
contact_email VARCHAR(100),
|
||||
created_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
||||
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
|
||||
paid_at TIMESTAMP NULL,
|
||||
shipped_at TIMESTAMP NULL,
|
||||
delivered_at TIMESTAMP NULL,
|
||||
cancelled_at TIMESTAMP NULL,
|
||||
user_id BIGINT NOT NULL,
|
||||
FOREIGN KEY (user_id) REFERENCES users(id),
|
||||
INDEX idx_order_number (order_number),
|
||||
INDEX idx_user_id (user_id),
|
||||
INDEX idx_status (status)
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='订单表';
|
||||
|
||||
-- 订单项表
|
||||
CREATE TABLE IF NOT EXISTS order_items (
|
||||
id BIGINT PRIMARY KEY AUTO_INCREMENT,
|
||||
product_name VARCHAR(100) NOT NULL,
|
||||
product_description VARCHAR(500),
|
||||
product_sku VARCHAR(200),
|
||||
unit_price DECIMAL(10,2) NOT NULL,
|
||||
quantity INT NOT NULL,
|
||||
subtotal DECIMAL(10,2) NOT NULL,
|
||||
product_image VARCHAR(100),
|
||||
order_id BIGINT NOT NULL,
|
||||
FOREIGN KEY (order_id) REFERENCES orders(id) ON DELETE CASCADE,
|
||||
INDEX idx_order_id (order_id)
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='订单项表';
|
||||
|
||||
-- 会员等级表
|
||||
CREATE TABLE IF NOT EXISTS membership_levels (
|
||||
id BIGINT PRIMARY KEY AUTO_INCREMENT,
|
||||
name VARCHAR(50) NOT NULL UNIQUE,
|
||||
display_name VARCHAR(50) NOT NULL,
|
||||
description TEXT,
|
||||
price DECIMAL(10,2) NOT NULL DEFAULT 0,
|
||||
duration_days INT NOT NULL DEFAULT 30,
|
||||
points_bonus INT NOT NULL DEFAULT 0,
|
||||
features JSON,
|
||||
is_active BOOLEAN NOT NULL DEFAULT TRUE,
|
||||
created_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
||||
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
|
||||
INDEX idx_name (name)
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='会员等级表';
|
||||
|
||||
-- 用户会员信息表
|
||||
CREATE TABLE IF NOT EXISTS user_memberships (
|
||||
id BIGINT PRIMARY KEY AUTO_INCREMENT,
|
||||
user_id BIGINT NOT NULL,
|
||||
membership_level_id BIGINT NOT NULL,
|
||||
start_date TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
||||
end_date TIMESTAMP NOT NULL,
|
||||
status VARCHAR(20) NOT NULL DEFAULT 'ACTIVE',
|
||||
auto_renew BOOLEAN NOT NULL DEFAULT FALSE,
|
||||
created_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
||||
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
|
||||
FOREIGN KEY (user_id) REFERENCES users(id) ON DELETE CASCADE,
|
||||
FOREIGN KEY (membership_level_id) REFERENCES membership_levels(id),
|
||||
UNIQUE KEY unique_active_membership (user_id, status),
|
||||
INDEX idx_user_id (user_id),
|
||||
INDEX idx_status (status)
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='用户会员信息表';
|
||||
|
||||
-- 视频生成任务表(基础表)
|
||||
CREATE TABLE IF NOT EXISTS video_tasks (
|
||||
id BIGINT PRIMARY KEY AUTO_INCREMENT,
|
||||
task_id VARCHAR(100) NOT NULL UNIQUE,
|
||||
user_id BIGINT NOT NULL,
|
||||
task_type VARCHAR(50) NOT NULL,
|
||||
title VARCHAR(200) NOT NULL,
|
||||
description TEXT,
|
||||
input_text TEXT,
|
||||
input_image_url VARCHAR(500),
|
||||
output_video_url VARCHAR(500),
|
||||
status VARCHAR(20) NOT NULL DEFAULT 'PENDING',
|
||||
progress INT NOT NULL DEFAULT 0,
|
||||
error_message TEXT,
|
||||
created_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
||||
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
|
||||
completed_at TIMESTAMP NULL,
|
||||
FOREIGN KEY (user_id) REFERENCES users(id) ON DELETE CASCADE,
|
||||
INDEX idx_task_id (task_id),
|
||||
INDEX idx_user_id (user_id),
|
||||
INDEX idx_status (status)
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='视频生成任务表';
|
||||
|
||||
-- 用户作品表(基础版)
|
||||
CREATE TABLE IF NOT EXISTS user_works_base (
|
||||
id BIGINT PRIMARY KEY AUTO_INCREMENT,
|
||||
user_id BIGINT NOT NULL,
|
||||
title VARCHAR(200) NOT NULL,
|
||||
description TEXT,
|
||||
work_type VARCHAR(50) NOT NULL,
|
||||
cover_image VARCHAR(500),
|
||||
video_url VARCHAR(500),
|
||||
tags VARCHAR(500),
|
||||
is_public BOOLEAN NOT NULL DEFAULT TRUE,
|
||||
view_count INT NOT NULL DEFAULT 0,
|
||||
like_count INT NOT NULL DEFAULT 0,
|
||||
created_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
||||
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
|
||||
FOREIGN KEY (user_id) REFERENCES users(id) ON DELETE CASCADE,
|
||||
INDEX idx_user_id (user_id),
|
||||
INDEX idx_work_type (work_type)
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='用户作品表(基础版)';
|
||||
|
||||
-- 系统配置表
|
||||
CREATE TABLE IF NOT EXISTS system_configs (
|
||||
id BIGINT PRIMARY KEY AUTO_INCREMENT,
|
||||
config_key VARCHAR(100) NOT NULL UNIQUE,
|
||||
config_value TEXT,
|
||||
description VARCHAR(500),
|
||||
config_type VARCHAR(50) NOT NULL DEFAULT 'STRING',
|
||||
is_public BOOLEAN NOT NULL DEFAULT FALSE,
|
||||
created_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
||||
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
|
||||
INDEX idx_config_key (config_key)
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='系统配置表';
|
||||
|
||||
-- ============================================
|
||||
-- 2. 迁移表结构(Flyway Migration)
|
||||
-- ============================================
|
||||
|
||||
-- V3: 任务队列表
|
||||
CREATE TABLE IF NOT EXISTS task_queue (
|
||||
id BIGINT AUTO_INCREMENT PRIMARY KEY,
|
||||
username VARCHAR(100) NOT NULL COMMENT '用户名',
|
||||
task_id VARCHAR(50) NOT NULL UNIQUE COMMENT '任务ID',
|
||||
task_type ENUM('TEXT_TO_VIDEO', 'IMAGE_TO_VIDEO') NOT NULL COMMENT '任务类型',
|
||||
status ENUM('PENDING', 'PROCESSING', 'COMPLETED', 'FAILED', 'CANCELLED', 'TIMEOUT') NOT NULL DEFAULT 'PENDING' COMMENT '队列状态',
|
||||
priority INT NOT NULL DEFAULT 0 COMMENT '优先级,数字越小优先级越高',
|
||||
real_task_id VARCHAR(100) COMMENT '外部API返回的真实任务ID',
|
||||
last_check_time DATETIME COMMENT '最后一次检查时间',
|
||||
check_count INT NOT NULL DEFAULT 0 COMMENT '检查次数',
|
||||
max_check_count INT NOT NULL DEFAULT 30 COMMENT '最大检查次数(30次 * 2分钟 = 60分钟)',
|
||||
error_message TEXT COMMENT '错误信息',
|
||||
created_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
|
||||
updated_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
|
||||
completed_at DATETIME COMMENT '完成时间',
|
||||
INDEX idx_username_status (username, status),
|
||||
INDEX idx_status_priority (status, priority),
|
||||
INDEX idx_last_check_time (last_check_time),
|
||||
INDEX idx_created_at (created_at)
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='任务队列表';
|
||||
|
||||
-- V4: 积分冻结记录表
|
||||
CREATE TABLE IF NOT EXISTS points_freeze_records (
|
||||
id BIGINT AUTO_INCREMENT PRIMARY KEY,
|
||||
username VARCHAR(100) NOT NULL COMMENT '用户名',
|
||||
task_id VARCHAR(50) NOT NULL UNIQUE COMMENT '任务ID',
|
||||
task_type ENUM('TEXT_TO_VIDEO', 'IMAGE_TO_VIDEO') NOT NULL COMMENT '任务类型',
|
||||
freeze_points INT NOT NULL COMMENT '冻结的积分数量',
|
||||
status ENUM('FROZEN', 'DEDUCTED', 'RETURNED', 'EXPIRED') NOT NULL DEFAULT 'FROZEN' COMMENT '冻结状态',
|
||||
freeze_reason VARCHAR(200) COMMENT '冻结原因',
|
||||
created_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
|
||||
updated_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
|
||||
completed_at DATETIME COMMENT '完成时间',
|
||||
INDEX idx_username_status (username, status),
|
||||
INDEX idx_task_id (task_id),
|
||||
INDEX idx_created_at (created_at),
|
||||
INDEX idx_status (status)
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='积分冻结记录表';
|
||||
|
||||
-- V5: 用户作品表(详细版)
|
||||
CREATE TABLE IF NOT EXISTS user_works (
|
||||
id BIGINT AUTO_INCREMENT PRIMARY KEY,
|
||||
username VARCHAR(100) NOT NULL COMMENT '用户名',
|
||||
task_id VARCHAR(50) NOT NULL UNIQUE COMMENT '任务ID',
|
||||
work_type ENUM('TEXT_TO_VIDEO', 'IMAGE_TO_VIDEO') NOT NULL COMMENT '作品类型',
|
||||
title VARCHAR(200) COMMENT '作品标题',
|
||||
description TEXT COMMENT '作品描述',
|
||||
prompt TEXT COMMENT '生成提示词',
|
||||
result_url VARCHAR(500) COMMENT '结果视频URL',
|
||||
thumbnail_url VARCHAR(500) COMMENT '缩略图URL',
|
||||
duration VARCHAR(10) COMMENT '视频时长',
|
||||
aspect_ratio VARCHAR(10) COMMENT '宽高比',
|
||||
quality VARCHAR(20) COMMENT '画质',
|
||||
file_size VARCHAR(20) COMMENT '文件大小',
|
||||
points_cost INT NOT NULL DEFAULT 0 COMMENT '消耗积分',
|
||||
status ENUM('PROCESSING', 'COMPLETED', 'FAILED', 'DELETED') NOT NULL DEFAULT 'PROCESSING' COMMENT '作品状态',
|
||||
is_public BOOLEAN NOT NULL DEFAULT FALSE COMMENT '是否公开',
|
||||
view_count INT NOT NULL DEFAULT 0 COMMENT '浏览次数',
|
||||
like_count INT NOT NULL DEFAULT 0 COMMENT '点赞次数',
|
||||
download_count INT NOT NULL DEFAULT 0 COMMENT '下载次数',
|
||||
tags VARCHAR(500) COMMENT '标签',
|
||||
created_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
|
||||
updated_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
|
||||
completed_at DATETIME COMMENT '完成时间',
|
||||
INDEX idx_username_status (username, status),
|
||||
INDEX idx_task_id (task_id),
|
||||
INDEX idx_work_type (work_type),
|
||||
INDEX idx_is_public_status (is_public, status),
|
||||
INDEX idx_created_at (created_at),
|
||||
INDEX idx_view_count (view_count),
|
||||
INDEX idx_like_count (like_count),
|
||||
INDEX idx_tags (tags),
|
||||
INDEX idx_prompt (prompt(100))
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='用户作品表';
|
||||
|
||||
-- V6: 任务状态表
|
||||
CREATE TABLE IF NOT EXISTS task_status (
|
||||
id BIGINT AUTO_INCREMENT PRIMARY KEY,
|
||||
task_id VARCHAR(255) NOT NULL COMMENT '任务ID',
|
||||
username VARCHAR(255) NOT NULL COMMENT '用户名',
|
||||
task_type VARCHAR(50) NOT NULL COMMENT '任务类型',
|
||||
status VARCHAR(50) NOT NULL DEFAULT 'PENDING' COMMENT '任务状态',
|
||||
progress INT DEFAULT 0 COMMENT '进度百分比',
|
||||
result_url TEXT COMMENT '结果URL',
|
||||
error_message TEXT COMMENT '错误信息',
|
||||
external_task_id VARCHAR(255) COMMENT '外部任务ID',
|
||||
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
|
||||
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
|
||||
completed_at TIMESTAMP NULL COMMENT '完成时间',
|
||||
last_polled_at TIMESTAMP NULL COMMENT '最后轮询时间',
|
||||
poll_count INT DEFAULT 0 COMMENT '轮询次数',
|
||||
max_polls INT DEFAULT 60 COMMENT '最大轮询次数(2小时)',
|
||||
INDEX idx_task_id (task_id),
|
||||
INDEX idx_username (username),
|
||||
INDEX idx_status (status),
|
||||
INDEX idx_created_at (created_at),
|
||||
INDEX idx_last_polled (last_polled_at)
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='任务状态表';
|
||||
|
||||
-- V7: 任务清理表
|
||||
-- 成功任务归档表
|
||||
CREATE TABLE IF NOT EXISTS completed_tasks_archive (
|
||||
id BIGINT AUTO_INCREMENT PRIMARY KEY,
|
||||
task_id VARCHAR(255) NOT NULL,
|
||||
username VARCHAR(255) NOT NULL,
|
||||
task_type VARCHAR(50) NOT NULL,
|
||||
prompt TEXT,
|
||||
aspect_ratio VARCHAR(20),
|
||||
duration INT,
|
||||
hd_mode BOOLEAN DEFAULT FALSE,
|
||||
result_url TEXT,
|
||||
real_task_id VARCHAR(255),
|
||||
progress INT DEFAULT 100,
|
||||
created_at TIMESTAMP NOT NULL,
|
||||
completed_at TIMESTAMP NOT NULL,
|
||||
archived_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
|
||||
points_cost INT DEFAULT 0,
|
||||
INDEX idx_username (username),
|
||||
INDEX idx_task_type (task_type),
|
||||
INDEX idx_created_at (created_at),
|
||||
INDEX idx_completed_at (completed_at),
|
||||
INDEX idx_archived_at (archived_at)
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='成功任务归档表';
|
||||
|
||||
-- 失败任务清理日志表
|
||||
CREATE TABLE IF NOT EXISTS failed_tasks_cleanup_log (
|
||||
id BIGINT AUTO_INCREMENT PRIMARY KEY,
|
||||
task_id VARCHAR(255) NOT NULL,
|
||||
username VARCHAR(255) NOT NULL,
|
||||
task_type VARCHAR(50) NOT NULL,
|
||||
error_message TEXT,
|
||||
created_at TIMESTAMP NOT NULL,
|
||||
failed_at TIMESTAMP NOT NULL,
|
||||
cleaned_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
|
||||
INDEX idx_username (username),
|
||||
INDEX idx_task_type (task_type),
|
||||
INDEX idx_cleaned_at (cleaned_at)
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='失败任务清理日志表';
|
||||
|
||||
-- V8: 分镜视频任务表
|
||||
CREATE TABLE IF NOT EXISTS storyboard_video_tasks (
|
||||
id BIGINT AUTO_INCREMENT PRIMARY KEY,
|
||||
task_id VARCHAR(50) NOT NULL UNIQUE,
|
||||
username VARCHAR(100) NOT NULL,
|
||||
prompt TEXT,
|
||||
image_url VARCHAR(500),
|
||||
aspect_ratio VARCHAR(10) NOT NULL,
|
||||
hd_mode BOOLEAN NOT NULL DEFAULT FALSE,
|
||||
status VARCHAR(20) NOT NULL,
|
||||
progress INT NOT NULL DEFAULT 0,
|
||||
result_url VARCHAR(500),
|
||||
real_task_id VARCHAR(255),
|
||||
error_message TEXT,
|
||||
cost_points INT NOT NULL DEFAULT 0,
|
||||
created_at TIMESTAMP NOT NULL,
|
||||
updated_at TIMESTAMP NOT NULL,
|
||||
completed_at TIMESTAMP,
|
||||
INDEX idx_username (username),
|
||||
INDEX idx_status (status),
|
||||
INDEX idx_task_id (task_id)
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='分镜视频任务表';
|
||||
|
||||
-- ============================================
|
||||
-- 完成
|
||||
-- ============================================
|
||||
|
||||
SET FOREIGN_KEY_CHECKS = 1;
|
||||
|
||||
-- 显示所有表
|
||||
SHOW TABLES;
|
||||
|
||||
|
||||
|
||||
|
||||
227
demo/database_baota_deploy/部署检查清单.md
Normal file
@@ -0,0 +1,227 @@
|
||||
# 宝塔数据库部署检查清单
|
||||
|
||||
部署日期: _______________
|
||||
操作人员: _______________
|
||||
|
||||
## 📋 部署前准备
|
||||
|
||||
### 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
|
||||
8
demo/database_migration_20251119_add_duration.sql
Normal file
@@ -0,0 +1,8 @@
|
||||
-- 为 storyboard_video_tasks 表添加 duration 字段
|
||||
-- 执行时间:2025-11-19
|
||||
|
||||
ALTER TABLE storyboard_video_tasks
|
||||
ADD COLUMN duration INT NOT NULL DEFAULT 10 COMMENT '视频时长(秒)' AFTER hd_mode;
|
||||
|
||||
-- 更新现有记录,设置默认值为10秒
|
||||
UPDATE storyboard_video_tasks SET duration = 10 WHERE duration IS NULL OR duration = 0;
|
||||
@@ -0,0 +1,9 @@
|
||||
-- 修复 TaskStatus 表的 result_url 字段长度问题
|
||||
-- 日期: 2025-11-19
|
||||
-- 原因: Base64 编码的分镜图超过 MEDIUMTEXT 限制
|
||||
|
||||
-- 修改 task_status 表的 result_url 字段为 LONGTEXT
|
||||
ALTER TABLE task_status MODIFY COLUMN result_url LONGTEXT COMMENT '任务结果URL或Base64数据';
|
||||
|
||||
-- 验证修改
|
||||
SHOW FULL COLUMNS FROM task_status WHERE Field = 'result_url';
|
||||
141
demo/deploy-linux.sh
Normal file
@@ -0,0 +1,141 @@
|
||||
#!/bin/bash
|
||||
# Linux 云端部署脚本
|
||||
# 使用方法: ./deploy-linux.sh
|
||||
|
||||
set -e
|
||||
|
||||
echo "🚀 开始部署 AIGC 平台到 Linux 服务器..."
|
||||
|
||||
# 颜色定义
|
||||
RED='\033[0;31m'
|
||||
GREEN='\033[0;32m'
|
||||
YELLOW='\033[1;33m'
|
||||
NC='\033[0m' # No Color
|
||||
|
||||
# 检查Java
|
||||
echo -e "${YELLOW}检查Java环境...${NC}"
|
||||
if ! command -v java &> /dev/null; then
|
||||
echo -e "${RED}❌ Java未安装,请先安装Java 21${NC}"
|
||||
echo "安装命令: sudo apt install -y openjdk-21-jdk"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
JAVA_VERSION=$(java -version 2>&1 | head -n 1)
|
||||
echo -e "${GREEN}✅ Java已安装: $JAVA_VERSION${NC}"
|
||||
|
||||
# 检查MySQL
|
||||
echo -e "${YELLOW}检查MySQL服务...${NC}"
|
||||
if ! systemctl is-active --quiet mysql && ! systemctl is-active --quiet mysqld; then
|
||||
echo -e "${RED}❌ MySQL服务未运行${NC}"
|
||||
echo "启动命令: sudo systemctl start mysql"
|
||||
exit 1
|
||||
fi
|
||||
echo -e "${GREEN}✅ MySQL服务运行中${NC}"
|
||||
|
||||
# 检查FFmpeg
|
||||
echo -e "${YELLOW}检查FFmpeg...${NC}"
|
||||
if ! command -v ffmpeg &> /dev/null; then
|
||||
echo -e "${YELLOW}⚠️ FFmpeg未安装,视频功能可能不可用${NC}"
|
||||
echo "安装命令: sudo apt install -y ffmpeg"
|
||||
else
|
||||
echo -e "${GREEN}✅ FFmpeg已安装${NC}"
|
||||
fi
|
||||
|
||||
# 检查应用目录
|
||||
APP_DIR="/app/aigc-platform"
|
||||
echo -e "${YELLOW}检查应用目录...${NC}"
|
||||
if [ ! -d "$APP_DIR" ]; then
|
||||
echo -e "${YELLOW}创建应用目录...${NC}"
|
||||
sudo mkdir -p $APP_DIR/{logs,uploads,temp,config,backend,frontend}
|
||||
sudo chown -R $USER:$USER $APP_DIR
|
||||
chmod -R 755 $APP_DIR
|
||||
fi
|
||||
echo -e "${GREEN}✅ 应用目录存在${NC}"
|
||||
|
||||
# 检查JAR文件
|
||||
JAR_FILE="$APP_DIR/backend/demo-0.0.1-SNAPSHOT.jar"
|
||||
if [ ! -f "$JAR_FILE" ]; then
|
||||
echo -e "${RED}❌ JAR文件不存在: $JAR_FILE${NC}"
|
||||
echo "请先上传JAR文件到服务器"
|
||||
exit 1
|
||||
fi
|
||||
echo -e "${GREEN}✅ JAR文件存在${NC}"
|
||||
|
||||
# 检查配置文件
|
||||
CONFIG_FILE="$APP_DIR/config/application-prod.properties"
|
||||
if [ ! -f "$CONFIG_FILE" ]; then
|
||||
echo -e "${YELLOW}⚠️ 配置文件不存在,请先创建配置文件${NC}"
|
||||
echo "配置文件路径: $CONFIG_FILE"
|
||||
fi
|
||||
|
||||
# 停止服务
|
||||
echo -e "${YELLOW}停止现有服务...${NC}"
|
||||
if systemctl is-active --quiet aigc-platform; then
|
||||
sudo systemctl stop aigc-platform
|
||||
echo -e "${GREEN}✅ 服务已停止${NC}"
|
||||
else
|
||||
echo -e "${YELLOW}服务未运行${NC}"
|
||||
fi
|
||||
|
||||
# 备份旧版本
|
||||
echo -e "${YELLOW}备份旧版本...${NC}"
|
||||
BACKUP_DIR="$APP_DIR/backup/$(date +%Y%m%d_%H%M%S)"
|
||||
mkdir -p $BACKUP_DIR
|
||||
if [ -f "$JAR_FILE" ]; then
|
||||
cp "$JAR_FILE" "$BACKUP_DIR/" 2>/dev/null || true
|
||||
echo -e "${GREEN}✅ 备份完成: $BACKUP_DIR${NC}"
|
||||
fi
|
||||
|
||||
# 检查systemd服务文件
|
||||
SERVICE_FILE="/etc/systemd/system/aigc-platform.service"
|
||||
if [ ! -f "$SERVICE_FILE" ]; then
|
||||
echo -e "${YELLOW}⚠️ Systemd服务文件不存在${NC}"
|
||||
echo "请先创建服务文件: $SERVICE_FILE"
|
||||
echo "参考文档: LINUX_DEPLOYMENT_GUIDE.md"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
# 重新加载systemd
|
||||
echo -e "${YELLOW}重新加载systemd配置...${NC}"
|
||||
sudo systemctl daemon-reload
|
||||
|
||||
# 启动服务
|
||||
echo -e "${YELLOW}启动服务...${NC}"
|
||||
sudo systemctl start aigc-platform
|
||||
|
||||
# 等待启动
|
||||
echo -e "${YELLOW}等待服务启动...${NC}"
|
||||
sleep 5
|
||||
|
||||
# 检查状态
|
||||
if systemctl is-active --quiet aigc-platform; then
|
||||
echo -e "${GREEN}✅ 部署成功!${NC}"
|
||||
echo ""
|
||||
echo "服务状态:"
|
||||
sudo systemctl status aigc-platform --no-pager -l
|
||||
echo ""
|
||||
echo "查看日志: sudo journalctl -u aigc-platform -f"
|
||||
echo "停止服务: sudo systemctl stop aigc-platform"
|
||||
echo "重启服务: sudo systemctl restart aigc-platform"
|
||||
else
|
||||
echo -e "${RED}❌ 部署失败!${NC}"
|
||||
echo ""
|
||||
echo "查看错误日志:"
|
||||
sudo journalctl -u aigc-platform -n 50 --no-pager
|
||||
exit 1
|
||||
fi
|
||||
|
||||
# 测试健康检查
|
||||
echo -e "${YELLOW}测试健康检查...${NC}"
|
||||
sleep 2
|
||||
if curl -f http://localhost:8080/actuator/health > /dev/null 2>&1; then
|
||||
echo -e "${GREEN}✅ 健康检查通过${NC}"
|
||||
else
|
||||
echo -e "${YELLOW}⚠️ 健康检查失败,请检查日志${NC}"
|
||||
fi
|
||||
|
||||
echo ""
|
||||
echo -e "${GREEN}🎉 部署完成!${NC}"
|
||||
|
||||
|
||||
|
||||
168
demo/deploy.ps1
Normal file
@@ -0,0 +1,168 @@
|
||||
# deploy.ps1 - Spring Boot + Vue 项目 Docker 部署脚本
|
||||
|
||||
Write-Host "🚀 AIGC 平台 Docker 部署脚本" -ForegroundColor Green
|
||||
Write-Host ("=" * 60)
|
||||
|
||||
# 检查必要文件
|
||||
$requiredFiles = @("docker-compose.yml", "backend/Dockerfile", "frontend/Dockerfile", "frontend/nginx.conf")
|
||||
foreach ($file in $requiredFiles) {
|
||||
if (-not (Test-Path $file)) {
|
||||
Write-Host "❌ 缺少必要文件: $file" -ForegroundColor Red
|
||||
exit 1
|
||||
}
|
||||
}
|
||||
Write-Host "✅ 所有必要文件检查通过" -ForegroundColor Green
|
||||
|
||||
# 检查 Docker 环境
|
||||
try {
|
||||
$dockerVersion = docker --version 2>&1
|
||||
$composeVersion = docker-compose --version 2>&1
|
||||
Write-Host "✅ Docker 环境: $dockerVersion" -ForegroundColor Green
|
||||
Write-Host "✅ Docker Compose: $composeVersion" -ForegroundColor Green
|
||||
} catch {
|
||||
Write-Host "❌ Docker 未正确安装或启动" -ForegroundColor Red
|
||||
Write-Host " 请确保已安装 Docker Desktop 并已启动" -ForegroundColor Yellow
|
||||
exit 1
|
||||
}
|
||||
|
||||
# 检查前端是否已构建
|
||||
if (-not (Test-Path "frontend/dist")) {
|
||||
Write-Host "`n⚠️ 前端未构建,开始构建前端..." -ForegroundColor Yellow
|
||||
Push-Location frontend
|
||||
try {
|
||||
if (Test-Path "package.json") {
|
||||
Write-Host " 安装依赖..." -ForegroundColor Cyan
|
||||
npm install
|
||||
Write-Host " 构建生产版本..." -ForegroundColor Cyan
|
||||
npm run build
|
||||
Write-Host "✅ 前端构建完成" -ForegroundColor Green
|
||||
} else {
|
||||
Write-Host "⚠️ 未找到 package.json,跳过前端构建" -ForegroundColor Yellow
|
||||
}
|
||||
} catch {
|
||||
Write-Host "❌ 前端构建失败: $($_.Exception.Message)" -ForegroundColor Red
|
||||
Write-Host " 可以稍后手动构建: cd frontend && npm install && npm run build" -ForegroundColor Yellow
|
||||
} finally {
|
||||
Pop-Location
|
||||
}
|
||||
} else {
|
||||
Write-Host "✅ 前端已构建" -ForegroundColor Green
|
||||
}
|
||||
|
||||
# 停止现有服务
|
||||
Write-Host "`n🛑 停止现有服务..." -ForegroundColor Yellow
|
||||
docker-compose down 2>&1 | Out-Null
|
||||
|
||||
# 构建镜像
|
||||
Write-Host "`n📦 构建 Docker 镜像..." -ForegroundColor Cyan
|
||||
Write-Host " 这可能需要几分钟时间,请耐心等待..." -ForegroundColor Gray
|
||||
$buildResult = docker-compose build --no-cache 2>&1
|
||||
if ($LASTEXITCODE -ne 0) {
|
||||
Write-Host "❌ 镜像构建失败" -ForegroundColor Red
|
||||
Write-Host $buildResult -ForegroundColor Red
|
||||
exit 1
|
||||
}
|
||||
Write-Host "✅ 镜像构建完成" -ForegroundColor Green
|
||||
|
||||
# 启动服务
|
||||
Write-Host "`n🐳 启动所有服务..." -ForegroundColor Cyan
|
||||
docker-compose up -d
|
||||
if ($LASTEXITCODE -ne 0) {
|
||||
Write-Host "❌ 服务启动失败" -ForegroundColor Red
|
||||
exit 1
|
||||
}
|
||||
|
||||
# 等待服务启动
|
||||
Write-Host "`n⏳ 等待服务启动(60秒)..." -ForegroundColor Yellow
|
||||
Write-Host " 后端服务需要时间连接数据库并初始化..." -ForegroundColor Gray
|
||||
Start-Sleep -Seconds 60
|
||||
|
||||
# 检查服务状态
|
||||
Write-Host "`n🔍 检查服务状态..." -ForegroundColor Cyan
|
||||
docker-compose ps
|
||||
|
||||
# 健康检查
|
||||
Write-Host "`n🏥 服务健康检查..." -ForegroundColor Cyan
|
||||
|
||||
# 检查 MySQL 服务
|
||||
Write-Host " 检查 MySQL..." -ForegroundColor Gray
|
||||
$mysqlStatus = docker-compose ps mysql 2>&1 | Select-String "Up"
|
||||
if ($mysqlStatus) {
|
||||
Write-Host " ✅ MySQL 服务运行中" -ForegroundColor Green
|
||||
} else {
|
||||
Write-Host " ⚠️ MySQL 服务可能未正常启动" -ForegroundColor Yellow
|
||||
}
|
||||
|
||||
# 检查 Redis 服务
|
||||
Write-Host " 检查 Redis..." -ForegroundColor Gray
|
||||
$redisStatus = docker-compose ps redis 2>&1 | Select-String "Up"
|
||||
if ($redisStatus) {
|
||||
Write-Host " ✅ Redis 服务运行中" -ForegroundColor Green
|
||||
} else {
|
||||
Write-Host " ⚠️ Redis 服务可能未正常启动" -ForegroundColor Yellow
|
||||
}
|
||||
|
||||
# 检查后端服务
|
||||
Write-Host " 检查后端服务..." -ForegroundColor Gray
|
||||
try {
|
||||
# 检查后端服务是否响应
|
||||
$backendTest = Invoke-WebRequest -Uri "http://localhost:8080" -TimeoutSec 5 -ErrorAction SilentlyContinue
|
||||
if ($backendTest.StatusCode -eq 200 -or $backendTest.StatusCode -eq 404 -or $backendTest.StatusCode -eq 302) {
|
||||
Write-Host " ✅ 后端服务可访问 (状态码: $($backendTest.StatusCode))" -ForegroundColor Green
|
||||
}
|
||||
} catch {
|
||||
# 尝试检查API端点
|
||||
try {
|
||||
$apiTest = Invoke-WebRequest -Uri "http://localhost:8080/api" -TimeoutSec 5 -ErrorAction SilentlyContinue
|
||||
Write-Host " ✅ 后端API可访问" -ForegroundColor Green
|
||||
} catch {
|
||||
Write-Host " ⚠️ 后端服务可能还在启动中,请稍后检查" -ForegroundColor Yellow
|
||||
Write-Host " 查看日志: docker-compose logs backend" -ForegroundColor Gray
|
||||
Write-Host " 提示: 首次启动可能需要1-2分钟" -ForegroundColor Gray
|
||||
}
|
||||
}
|
||||
|
||||
# 检查前端服务
|
||||
Write-Host " 检查前端服务..." -ForegroundColor Gray
|
||||
try {
|
||||
$frontendResponse = Invoke-WebRequest -Uri "http://localhost" -TimeoutSec 5 -ErrorAction SilentlyContinue
|
||||
if ($frontendResponse.StatusCode -eq 200) {
|
||||
Write-Host " ✅ 前端服务运行正常" -ForegroundColor Green
|
||||
}
|
||||
} catch {
|
||||
Write-Host " ⚠️ 前端服务检查失败: $($_.Exception.Message)" -ForegroundColor Yellow
|
||||
Write-Host " 查看日志: docker-compose logs frontend" -ForegroundColor Gray
|
||||
}
|
||||
|
||||
# 显示访问信息
|
||||
Write-Host "`n" + ("=" * 60) -ForegroundColor Green
|
||||
Write-Host "🎉 部署完成!" -ForegroundColor Green
|
||||
Write-Host ""
|
||||
Write-Host "📍 访问地址:" -ForegroundColor Cyan
|
||||
Write-Host " 前端: http://localhost" -ForegroundColor White
|
||||
Write-Host " 后端API: http://localhost:8080" -ForegroundColor White
|
||||
Write-Host " API文档: http://localhost:8080/api" -ForegroundColor White
|
||||
Write-Host ""
|
||||
Write-Host "📍 数据库连接信息:" -ForegroundColor Cyan
|
||||
Write-Host " 地址: localhost:3306" -ForegroundColor White
|
||||
Write-Host " 用户: aigc_user" -ForegroundColor White
|
||||
Write-Host " 密码: aigc_password" -ForegroundColor White
|
||||
Write-Host " 数据库: aigc_platform" -ForegroundColor White
|
||||
Write-Host ""
|
||||
Write-Host "📍 Redis:" -ForegroundColor Cyan
|
||||
Write-Host " 地址: localhost:6379" -ForegroundColor White
|
||||
Write-Host ""
|
||||
Write-Host "📋 常用命令:" -ForegroundColor Yellow
|
||||
Write-Host " 查看所有服务日志: docker-compose logs -f" -ForegroundColor Gray
|
||||
Write-Host " 查看后端日志: docker-compose logs -f backend" -ForegroundColor Gray
|
||||
Write-Host " 查看前端日志: docker-compose logs -f frontend" -ForegroundColor Gray
|
||||
Write-Host " 查看服务状态: docker-compose ps" -ForegroundColor Gray
|
||||
Write-Host " 停止服务: docker-compose down" -ForegroundColor Gray
|
||||
Write-Host " 停止并删除数据: docker-compose down -v" -ForegroundColor Gray
|
||||
Write-Host " 重新部署: .\deploy.ps1" -ForegroundColor Gray
|
||||
Write-Host ""
|
||||
Write-Host "⚠️ 注意事项:" -ForegroundColor Yellow
|
||||
Write-Host " 1. 首次启动可能需要更长时间,请耐心等待" -ForegroundColor Gray
|
||||
Write-Host " 2. 如果服务未正常启动,请查看日志排查问题" -ForegroundColor Gray
|
||||
Write-Host " 3. 确保端口 80、8080、3306、6379 未被占用" -ForegroundColor Gray
|
||||
Write-Host ("=" * 60) -ForegroundColor Green
|
||||
71
demo/deploy.sh
Normal file
@@ -0,0 +1,71 @@
|
||||
#!/bin/bash
|
||||
|
||||
# Nginx 反向代理部署脚本
|
||||
|
||||
echo "🚀 开始部署 AIGC 平台..."
|
||||
|
||||
# 检查 Docker
|
||||
if ! command -v docker &> /dev/null; then
|
||||
echo "❌ Docker 未安装,请先安装 Docker"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
if ! command -v docker-compose &> /dev/null; then
|
||||
echo "❌ Docker Compose 未安装,请先安装 Docker Compose"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
# 构建前端
|
||||
echo "📦 构建前端..."
|
||||
cd frontend
|
||||
if ! npm install; then
|
||||
echo "❌ 前端依赖安装失败"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
if ! npm run build; then
|
||||
echo "❌ 前端构建失败"
|
||||
exit 1
|
||||
fi
|
||||
cd ..
|
||||
|
||||
# 检查前端构建产物
|
||||
if [ ! -d "frontend/dist" ]; then
|
||||
echo "❌ 前端构建产物不存在,请检查构建过程"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
echo "✅ 前端构建完成"
|
||||
|
||||
# 停止现有容器
|
||||
echo "🛑 停止现有容器..."
|
||||
docker-compose down
|
||||
|
||||
# 构建并启动服务
|
||||
echo "🔨 构建并启动服务..."
|
||||
docker-compose up -d --build
|
||||
|
||||
# 等待服务启动
|
||||
echo "⏳ 等待服务启动..."
|
||||
sleep 10
|
||||
|
||||
# 检查服务状态
|
||||
echo "📊 检查服务状态..."
|
||||
docker-compose ps
|
||||
|
||||
# 测试健康检查
|
||||
echo "🏥 测试健康检查..."
|
||||
if curl -f http://localhost/health > /dev/null 2>&1; then
|
||||
echo "✅ Nginx 健康检查通过"
|
||||
else
|
||||
echo "⚠️ Nginx 健康检查失败"
|
||||
fi
|
||||
|
||||
echo ""
|
||||
echo "✅ 部署完成!"
|
||||
echo "🌐 前端地址: http://localhost"
|
||||
echo "🔗 API 地址: http://localhost/api"
|
||||
echo ""
|
||||
echo "查看日志: docker-compose logs -f"
|
||||
echo "停止服务: docker-compose down"
|
||||
|
||||
80
demo/deploy_baota/API_DOCUMENTATION.md
Normal file
@@ -0,0 +1,80 @@
|
||||
# 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
|
||||
```
|
||||
|
||||
74
demo/deploy_baota/README.txt
Normal file
@@ -0,0 +1,74 @@
|
||||
# 宝塔面板部署说明
|
||||
|
||||
## 文件结构
|
||||
- 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. 防火墙设置
|
||||
- 开放端口:80(HTTP)、443(HTTPS)、8080(后端,如需要外网访问)
|
||||
- 宝塔面板 -> 安全 -> 添加端口规则
|
||||
|
||||
### 5. SSL证书(推荐)
|
||||
- 宝塔面板 -> 网站 -> SSL -> Let's Encrypt免费证书
|
||||
|
||||
## 常用命令
|
||||
|
||||
### 后端管理
|
||||
- 启动:./start.sh start
|
||||
- 停止:./start.sh stop
|
||||
- 重启:./start.sh restart
|
||||
- 状态:./start.sh status
|
||||
- 查看日志:tail -f logs/app.log
|
||||
|
||||
### 前端管理
|
||||
- 重启Nginx:systemctl restart nginx
|
||||
- 查看Nginx日志:tail -f /www/wwwroot/logs/your-domain.com.log
|
||||
|
||||
## 注意事项
|
||||
1. 确保Java版本为21
|
||||
2. 确保MySQL版本为8.0+
|
||||
3. 确保服务器内存至少4GB(推荐8GB)
|
||||
4. 配置文件中的敏感信息请妥善保管
|
||||
5. 定期备份数据库和上传文件
|
||||
312
demo/deploy_baota/ROUTE_ANALYSIS.md
Normal file
@@ -0,0 +1,312 @@
|
||||
# 项目路由分析报告
|
||||
|
||||
## 统一前缀路由
|
||||
|
||||
### 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分钟)
|
||||
|
||||
108
demo/deploy_baota/backend/application-prod.properties.example
Normal file
@@ -0,0 +1,108 @@
|
||||
# 生产环境配置
|
||||
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
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
@@ -0,0 +1,49 @@
|
||||
# 生产环境配置文件模板
|
||||
# 复制此文件为 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
|
||||
|
||||
|
||||
111
demo/deploy_baota/backend/start.sh
Normal file
@@ -0,0 +1,111 @@
|
||||
#!/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
|
||||
|
||||
|
||||
BIN
demo/deploy_baota/frontend/images/backgrounds/1.jpg
Normal file
|
After Width: | Height: | Size: 13 KiB |
@@ -0,0 +1,16 @@
|
||||
<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>
|
||||
|
After Width: | Height: | Size: 3.3 KiB |
233
demo/deploy_baota/frontend/images/backgrounds/login-bg.svg
Normal file
|
After Width: | Height: | Size: 25 KiB |
BIN
demo/deploy_baota/frontend/images/backgrounds/login.png
Normal file
|
After Width: | Height: | Size: 848 KiB |
15
demo/deploy_baota/frontend/images/backgrounds/logo-admin.svg
Normal file
@@ -0,0 +1,15 @@
|
||||
<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>
|
||||
|
After Width: | Height: | Size: 5.0 KiB |
BIN
demo/deploy_baota/frontend/images/backgrounds/logo.png
Normal file
|
After Width: | Height: | Size: 4.2 KiB |
15
demo/deploy_baota/frontend/images/backgrounds/logo.svg
Normal file
@@ -0,0 +1,15 @@
|
||||
<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>
|
||||
|
After Width: | Height: | Size: 5.0 KiB |
BIN
demo/deploy_baota/frontend/images/backgrounds/welcome.jpg
Normal file
|
After Width: | Height: | Size: 6.5 MiB |
22
demo/deploy_baota/frontend/index.html
Normal file
@@ -0,0 +1,22 @@
|
||||
<!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>
|
||||
|
||||
|
||||
|
||||
49
demo/deploy_baota/frontend/nginx.conf
Normal file
@@ -0,0 +1,49 @@
|
||||
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;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -0,0 +1 @@
|
||||
.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}}
|
||||
@@ -0,0 +1 @@
|
||||
.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}}
|
||||
1
demo/deploy_baota/frontend/static/HelloWorld-9bce383a.js
Normal file
@@ -0,0 +1 @@
|
||||
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};
|
||||