diff --git a/demo/ALIPAY_SETUP_GUIDE.md b/demo/ALIPAY_SETUP_GUIDE.md index 0cf1689..c4d2ced 100644 --- a/demo/ALIPAY_SETUP_GUIDE.md +++ b/demo/ALIPAY_SETUP_GUIDE.md @@ -213,3 +213,6 @@ ngrok http 8080 + + + diff --git a/demo/CODE_REVIEW_REPORT.md b/demo/CODE_REVIEW_REPORT.md index 84b31ee..6697737 100644 --- a/demo/CODE_REVIEW_REPORT.md +++ b/demo/CODE_REVIEW_REPORT.md @@ -108,3 +108,6 @@ - 类型转换警告 + + + diff --git a/demo/EMAIL_VERIFICATION_LOGIN_GUIDE.md b/demo/EMAIL_VERIFICATION_LOGIN_GUIDE.md index c356bcc..baa79ba 100644 --- a/demo/EMAIL_VERIFICATION_LOGIN_GUIDE.md +++ b/demo/EMAIL_VERIFICATION_LOGIN_GUIDE.md @@ -274,3 +274,6 @@ if (result.success) { + + + diff --git a/demo/FRP_QUICK_START.md b/demo/FRP_QUICK_START.md new file mode 100644 index 0000000..60def89 --- /dev/null +++ b/demo/FRP_QUICK_START.md @@ -0,0 +1,89 @@ +# FRP 快速开始指南 + +## 最简单的配置方法(使用 OpenFrp) + +### 1. 注册并创建隧道 + +1. 访问:https://www.openfrp.net/ +2. 注册账号并登录 +3. 点击"创建隧道" +4. 配置: + - 节点:选择国内节点 + - 类型:HTTP + - 本地端口:8080 + - 域名:使用系统分配的或自定义 +5. 创建成功后,记录: + - 访问地址(如:`https://xxx.openfrp.net`) + - 服务器地址 + - Token + +### 2. 下载 FRP 客户端 + +1. 访问:https://github.com/fatedier/frp/releases +2. 下载最新版本的 Windows 版本(如:`frp_0.52.3_windows_amd64.zip`) +3. 解压到 `demo` 目录 + +### 3. 配置 FRP 客户端 + +1. 在 `demo` 目录下创建 `frpc.ini` 文件 +2. 复制 `frpc.ini.example` 的内容 +3. 修改配置: + ```ini + [common] + server_addr = 从OpenFrp控制台获取 + server_port = 7000 + token = 从OpenFrp控制台获取 + + [payment] + type = http + local_ip = 127.0.0.1 + local_port = 8080 + custom_domains = 你的域名.openfrp.net + ``` + +### 4. 启动 FRP + +双击运行 `start-frpc.bat`,或手动运行: + +```powershell +cd demo +.\frpc.exe -c frpc.ini +``` + +### 5. 更新配置文件 + +更新以下文件中的回调URL: + +**`demo/src/main/resources/application-dev.properties`:** +```properties +alipay.notify-url=https://你的域名.openfrp.net/api/payments/alipay/notify +alipay.return-url=https://你的域名.openfrp.net/api/payments/alipay/return +``` + +**`demo/src/main/resources/payment.properties`:** +```properties +alipay.domain=https://你的域名.openfrp.net +alipay.notify-url=https://你的域名.openfrp.net/api/payments/alipay/notify +alipay.return-url=https://你的域名.openfrp.net/api/payments/alipay/return +``` + +### 6. 重启服务器 + +重启 Spring Boot 应用,新的回调地址就会生效。 + +### 7. 测试 + +1. 访问 `https://你的域名.openfrp.net` - 应该能看到应用 +2. 测试回调接口: + ```powershell + Invoke-WebRequest -Uri "https://你的域名.openfrp.net/api/payments/alipay/notify" -Method HEAD + ``` + 应该返回 200,而不是 302 + +## 注意事项 + +- FRP 客户端需要一直运行,关闭后内网穿透会断开 +- 免费服务可能有流量限制,建议用于开发测试 +- 生产环境建议使用固定域名和服务器 + + diff --git a/demo/IJPAY_USAGE_GUIDE.md b/demo/IJPAY_USAGE_GUIDE.md index d134911..5500ddd 100644 --- a/demo/IJPAY_USAGE_GUIDE.md +++ b/demo/IJPAY_USAGE_GUIDE.md @@ -227,3 +227,6 @@ A: IJPay 是对原生 SDK 的封装,提供了更简洁的 API。底层实现 - 支付宝开放平台:https://open.alipay.com + + + diff --git a/demo/IMAGE_TO_VIDEO_API_README.md b/demo/IMAGE_TO_VIDEO_API_README.md index e434f9f..5578f1e 100644 --- a/demo/IMAGE_TO_VIDEO_API_README.md +++ b/demo/IMAGE_TO_VIDEO_API_README.md @@ -294,3 +294,6 @@ grep "img2vid_abc123def456" logs/application.log + + + diff --git a/demo/POINTS_FREEZE_SYSTEM_README.md b/demo/POINTS_FREEZE_SYSTEM_README.md index 170a426..9ba4a3e 100644 --- a/demo/POINTS_FREEZE_SYSTEM_README.md +++ b/demo/POINTS_FREEZE_SYSTEM_README.md @@ -295,3 +295,6 @@ public TaskQueue addTextToVideoTask(String username, String taskId) { + + + diff --git a/demo/PasswordChecker.java b/demo/PasswordChecker.java index 2005028..9904ead 100644 --- a/demo/PasswordChecker.java +++ b/demo/PasswordChecker.java @@ -36,6 +36,9 @@ public class PasswordChecker { + + + diff --git a/demo/TENCENT_SES_STARTUP_CHECKLIST.md b/demo/TENCENT_SES_STARTUP_CHECKLIST.md index 564db90..94318d3 100644 --- a/demo/TENCENT_SES_STARTUP_CHECKLIST.md +++ b/demo/TENCENT_SES_STARTUP_CHECKLIST.md @@ -286,3 +286,6 @@ ResourceNotFound.TemplateNotFound + + + diff --git a/demo/TEXT_TO_VIDEO_API_README.md b/demo/TEXT_TO_VIDEO_API_README.md index a239715..3df0e90 100644 --- a/demo/TEXT_TO_VIDEO_API_README.md +++ b/demo/TEXT_TO_VIDEO_API_README.md @@ -304,3 +304,6 @@ const startPolling = (taskId) => { + + + diff --git a/demo/USER_WORKS_SYSTEM_README.md b/demo/USER_WORKS_SYSTEM_README.md index c884bd3..84bb02a 100644 --- a/demo/USER_WORKS_SYSTEM_README.md +++ b/demo/USER_WORKS_SYSTEM_README.md @@ -174,3 +174,6 @@ const updateWork = async (workId, updateData) => { + + + diff --git a/demo/fix_database_columns.sql b/demo/fix_database_columns.sql new file mode 100644 index 0000000..5cc908f --- /dev/null +++ b/demo/fix_database_columns.sql @@ -0,0 +1,40 @@ +-- 修复数据库列类型:将 VARCHAR 改为 TEXT 以支持 Base64 图片数据 +-- 执行前请先备份数据库! + +USE aigc_platform; + +-- 检查当前列类型(可选,用于查看当前状态) +-- DESCRIBE storyboard_video_tasks; + +-- 更新 storyboard_video_tasks 表 +ALTER TABLE storyboard_video_tasks +MODIFY COLUMN result_url TEXT COMMENT '分镜图结果URL(Base64编码)', +MODIFY COLUMN image_url TEXT COMMENT '参考图片URL', +MODIFY COLUMN prompt TEXT COMMENT '文本描述'; + +-- 更新 text_to_video_tasks 表 +ALTER TABLE text_to_video_tasks +MODIFY COLUMN result_url TEXT COMMENT '视频结果URL'; + +-- 更新 image_to_video_tasks 表 +ALTER TABLE image_to_video_tasks +MODIFY COLUMN result_url TEXT COMMENT '视频结果URL'; + +-- 更新 user_works 表 +ALTER TABLE user_works +MODIFY COLUMN result_url TEXT COMMENT '作品结果URL', +MODIFY COLUMN thumbnail_url TEXT COMMENT '缩略图URL', +MODIFY COLUMN description TEXT COMMENT '作品描述', +MODIFY COLUMN prompt TEXT COMMENT '生成提示词'; + +-- 更新 users 表 +ALTER TABLE users +MODIFY COLUMN avatar TEXT COMMENT '用户头像URL'; + +-- 验证更新结果(可选) +-- DESCRIBE storyboard_video_tasks; +-- DESCRIBE text_to_video_tasks; +-- DESCRIBE image_to_video_tasks; +-- DESCRIBE user_works; +-- DESCRIBE users; + diff --git a/demo/frontend/README.md b/demo/frontend/README.md index cbef172..a65255e 100644 --- a/demo/frontend/README.md +++ b/demo/frontend/README.md @@ -436,6 +436,9 @@ MIT License + + + diff --git a/demo/frontend/package.json b/demo/frontend/package.json index 30a90d0..b5fd11f 100644 --- a/demo/frontend/package.json +++ b/demo/frontend/package.json @@ -15,7 +15,8 @@ "pinia": "^2.1.6", "axios": "^1.5.0", "element-plus": "^2.3.8", - "@element-plus/icons-vue": "^2.1.0" + "@element-plus/icons-vue": "^2.1.0", + "qrcode": "^1.5.3" }, "devDependencies": { "@vitejs/plugin-vue": "^4.3.4", diff --git a/demo/frontend/src/App-backup.vue b/demo/frontend/src/App-backup.vue index 2d9a1ba..f429eb5 100644 --- a/demo/frontend/src/App-backup.vue +++ b/demo/frontend/src/App-backup.vue @@ -33,6 +33,9 @@ console.log('App.vue 加载成功') + + + diff --git a/demo/frontend/src/App.vue b/demo/frontend/src/App.vue index 9a1da28..f0e3090 100644 --- a/demo/frontend/src/App.vue +++ b/demo/frontend/src/App.vue @@ -594,6 +594,67 @@ main.with-navbar { font-family: inherit; } +/* 移除 el-dialog 的所有可能的白色边框 */ +.payment-modal-dialog, +.payment-modal-dialog.el-dialog, +.payment-modal-dialog.el-dialog--center, +.payment-modal-dialog.el-dialog--center.payment-modal, +.el-overlay-dialog .payment-modal-dialog, +.el-overlay-dialog .payment-modal-dialog.el-dialog, +.el-overlay-dialog .payment-modal-dialog.el-dialog--center, +.el-overlay-dialog .payment-modal-dialog.el-dialog--center.payment-modal, +.el-overlay.payment-modal-overlay.el-modal-dialog .payment-modal-dialog, +.el-overlay.payment-modal-overlay.el-modal-dialog .payment-modal-dialog.el-dialog, +.el-overlay.payment-modal-overlay.el-modal-dialog .payment-modal-dialog.el-dialog--center, +.el-overlay.payment-modal-overlay.el-modal-dialog .payment-modal-dialog.el-dialog--center.payment-modal { + background: #000000 !important; + background-color: #000000 !important; + border: none !important; + border-width: 0 !important; + border-style: none !important; + border-color: transparent !important; + outline: none !important; + outline-width: 0 !important; + outline-style: none !important; + outline-color: transparent !important; + box-shadow: 0 8px 32px rgba(0, 0, 0, 0.6) !important; +} + +.payment-modal-dialog .el-dialog__body, +.payment-modal-dialog .el-dialog__header { + background: #000000 !important; + background-color: #000000 !important; + border: none !important; + border-width: 0 !important; + border-left: none !important; + border-right: none !important; + border-top: none !important; + border-bottom: none !important; + outline: none !important; +} + +/* 全局覆盖所有可能的对话框背景 */ +.el-overlay.payment-modal-overlay.el-modal-dialog .el-dialog, +.el-overlay.payment-modal-overlay.el-modal-dialog .el-dialog.el-dialog--center, +.el-overlay.payment-modal-overlay.el-modal-dialog .el-dialog.el-dialog--center.payment-modal, +.el-overlay.payment-modal-overlay.el-modal-dialog .payment-modal-dialog, +.el-overlay.payment-modal-overlay.el-modal-dialog .payment-modal-dialog.el-dialog, +.el-overlay.payment-modal-overlay.el-modal-dialog .payment-modal-dialog.el-dialog--center, +.el-overlay.payment-modal-overlay.el-modal-dialog .payment-modal-dialog.el-dialog--center.payment-modal, +.el-overlay-dialog .el-dialog.el-dialog--center.payment-modal, +.el-overlay-dialog .payment-modal-dialog.el-dialog--center.payment-modal, +.el-dialog.el-dialog--center.payment-modal, +.payment-modal-dialog.el-dialog.el-dialog--center.payment-modal, +/* 使用属性选择器覆盖所有包含 payment-modal 的对话框 */ +[class*="payment-modal"][class*="el-dialog"], +[class*="payment-modal"][class*="el-dialog--center"], +.el-dialog[class*="payment-modal"], +.payment-modal-dialog[class*="el-dialog"] { + background: #000000 !important; + background-color: #000000 !important; + background-image: none !important; +} + /* 滚动条样式 */ ::-webkit-scrollbar { width: 8px; diff --git a/demo/frontend/src/api/payments.js b/demo/frontend/src/api/payments.js index cac60a0..49644cb 100644 --- a/demo/frontend/src/api/payments.js +++ b/demo/frontend/src/api/payments.js @@ -52,3 +52,8 @@ export const handleAlipayCallback = (params) => { export const getPaymentStats = () => { return api.get('/payments/stats') } + +// 获取用户订阅信息 +export const getUserSubscriptionInfo = () => { + return api.get('/payments/subscription/info') +} diff --git a/demo/frontend/src/api/request.js b/demo/frontend/src/api/request.js index f897890..cc67d94 100644 --- a/demo/frontend/src/api/request.js +++ b/demo/frontend/src/api/request.js @@ -9,8 +9,13 @@ const api = axios.create({ baseURL: getApiBaseURL(), timeout: 900000, // 增加到15分钟,适应视频生成时间 withCredentials: true, + maxRedirects: 0, // 不自动跟随重定向,手动处理302 headers: { 'Content-Type': 'application/json' + }, + validateStatus: function (status) { + // 允许所有状态码,包括302,让拦截器处理 + return status >= 200 && status < 600 } }) @@ -19,8 +24,11 @@ api.interceptors.request.use( (config) => { // 使用JWT认证,添加Authorization头 const token = sessionStorage.getItem('token') - if (token) { + if (token && token !== 'null' && token.trim() !== '') { config.headers.Authorization = `Bearer ${token}` + console.log('请求拦截器:添加Authorization头,token长度:', token.length) + } else { + console.warn('请求拦截器:未找到有效的token') } return config }, @@ -33,6 +41,33 @@ api.interceptors.request.use( // 响应拦截器 api.interceptors.response.use( (response) => { + // 检查是否是HTML响应(可能是302重定向的结果) + if (response.data && typeof response.data === 'string' && response.data.trim().startsWith(' { + + + diff --git a/demo/frontend/src/components/Footer.vue b/demo/frontend/src/components/Footer.vue index 0f53109..11b6a1f 100644 --- a/demo/frontend/src/components/Footer.vue +++ b/demo/frontend/src/components/Footer.vue @@ -95,6 +95,9 @@ + + + diff --git a/demo/frontend/src/components/PaymentModal.vue b/demo/frontend/src/components/PaymentModal.vue index 3cbc736..f9c2569 100644 --- a/demo/frontend/src/components/PaymentModal.vue +++ b/demo/frontend/src/components/PaymentModal.vue @@ -8,9 +8,9 @@ :close-on-click-modal="false" :close-on-press-escape="true" @close="handleClose" - center :show-close="true" custom-class="payment-modal-dialog" + :modal-class="'payment-modal-overlay'" >
请使用支付宝扫描上方二维码完成支付
支付完成后页面将自动更新