feat: 完成代码逻辑错误修复和任务清理系统实现
主要更新: - 修复了所有主要的代码逻辑错误 - 实现了完整的任务清理系统 - 添加了系统设置页面的任务清理管理功能 - 修复了API调用认证问题 - 优化了密码加密和验证机制 - 统一了错误处理模式 - 添加了详细的文档和测试工具 新增功能: - 任务清理管理界面 - 任务归档和清理日志 - API监控和诊断工具 - 完整的测试套件 技术改进: - 修复了Repository方法调用错误 - 统一了模型方法调用 - 改进了类型安全性 - 优化了代码结构和可维护性
This commit is contained in:
@@ -7,23 +7,32 @@ spring.datasource.driverClassName=com.mysql.cj.jdbc.Driver
|
||||
spring.datasource.username=${DB_USERNAME:root}
|
||||
spring.datasource.password=${DB_PASSWORD:177615}
|
||||
|
||||
# 数据库连接池配置
|
||||
spring.datasource.hikari.maximum-pool-size=20
|
||||
spring.datasource.hikari.minimum-idle=5
|
||||
spring.datasource.hikari.idle-timeout=300000
|
||||
spring.datasource.hikari.max-lifetime=1200000
|
||||
spring.datasource.hikari.connection-timeout=20000
|
||||
spring.datasource.hikari.leak-detection-threshold=60000
|
||||
|
||||
spring.jpa.hibernate.ddl-auto=update
|
||||
spring.jpa.show-sql=true
|
||||
spring.jpa.properties.hibernate.format_sql=true
|
||||
|
||||
# 初始化脚本仅在开发环境开启
|
||||
spring.sql.init.mode=always
|
||||
spring.sql.init.platform=mysql
|
||||
# 初始化脚本仅在开发环境开启(与JPA DDL冲突,暂时禁用)
|
||||
# spring.sql.init.mode=always
|
||||
# spring.sql.init.platform=mysql
|
||||
|
||||
# 支付宝配置 (开发环境 - 沙箱测试)
|
||||
alipay.app-id=2021000000000000
|
||||
alipay.private-key=MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQC...
|
||||
alipay.public-key=MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA...
|
||||
# 请替换为您的实际配置
|
||||
alipay.app-id=您的APPID
|
||||
alipay.private-key=您的应用私钥
|
||||
alipay.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/api/payments/alipay/notify
|
||||
alipay.return-url=http://localhost:8080/api/payments/alipay/return
|
||||
alipay.notify-url=http://您的域名:8080/api/payments/alipay/notify
|
||||
alipay.return-url=http://您的域名:8080/api/payments/alipay/return
|
||||
|
||||
# PayPal配置 (开发环境 - 沙箱模式)
|
||||
paypal.client-id=your_paypal_sandbox_client_id
|
||||
@@ -36,10 +45,13 @@ paypal.cancel-url=http://localhost:8080/api/payments/paypal/cancel
|
||||
jwt.secret=${JWT_SECRET:aigc-demo-secret-key-for-jwt-token-generation-very-long-secret-key}
|
||||
jwt.expiration=${JWT_EXPIRATION:604800000}
|
||||
|
||||
# 日志配置
|
||||
logging.level.com.example.demo.security.JwtAuthenticationFilter=DEBUG
|
||||
logging.level.com.example.demo.util.JwtUtils=DEBUG
|
||||
logging.level.org.springframework.security=DEBUG
|
||||
# AI API配置
|
||||
ai.api.base-url=http://116.62.4.26:8081
|
||||
ai.api.key=ak_5f13ec469e6047d5b8155c3cc91350e2
|
||||
|
||||
# 任务清理配置
|
||||
task.cleanup.retention-days=30
|
||||
task.cleanup.archive-retention-days=365
|
||||
|
||||
|
||||
|
||||
|
||||
@@ -7,6 +7,16 @@ spring.datasource.driverClassName=com.mysql.cj.jdbc.Driver
|
||||
spring.datasource.username=${DB_USERNAME}
|
||||
spring.datasource.password=${DB_PASSWORD}
|
||||
|
||||
# 数据库连接池配置 (生产环境)
|
||||
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=20000
|
||||
spring.datasource.hikari.leak-detection-threshold=60000
|
||||
spring.datasource.hikari.validation-timeout=3000
|
||||
spring.datasource.hikari.connection-test-query=SELECT 1
|
||||
|
||||
# 强烈建议生产环境禁用自动建表
|
||||
spring.jpa.hibernate.ddl-auto=validate
|
||||
spring.jpa.show-sql=false
|
||||
|
||||
@@ -6,3 +6,20 @@ spring.profiles.active=dev
|
||||
# 服务器配置
|
||||
server.address=localhost
|
||||
server.port=8080
|
||||
|
||||
# 文件上传配置
|
||||
spring.servlet.multipart.max-file-size=10MB
|
||||
spring.servlet.multipart.max-request-size=20MB
|
||||
spring.servlet.multipart.enabled=true
|
||||
|
||||
# 应用配置
|
||||
app.upload.path=uploads
|
||||
app.video.output.path=outputs
|
||||
|
||||
# JWT配置
|
||||
jwt.secret=aigc-demo-secret-key-for-jwt-token-generation-2025
|
||||
jwt.expiration=86400000
|
||||
|
||||
# AI API配置
|
||||
ai.api.base-url=http://116.62.4.26:8081
|
||||
ai.api.key=ak_5f13ec469e6047d5b8155c3cc91350e2
|
||||
|
||||
@@ -0,0 +1,24 @@
|
||||
-- 创建任务队列表
|
||||
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='任务队列表';
|
||||
|
||||
|
||||
@@ -0,0 +1,23 @@
|
||||
-- 添加用户冻结积分字段
|
||||
ALTER TABLE users ADD COLUMN frozen_points INT NOT NULL DEFAULT 0 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') 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='积分冻结记录表';
|
||||
|
||||
|
||||
@@ -0,0 +1,36 @@
|
||||
-- 创建用户作品表
|
||||
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='用户作品表';
|
||||
@@ -0,0 +1,26 @@
|
||||
-- 创建任务状态表
|
||||
CREATE TABLE 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='任务状态表';
|
||||
|
||||
|
||||
@@ -0,0 +1,38 @@
|
||||
-- 创建成功任务导出表
|
||||
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='失败任务清理日志表';
|
||||
@@ -0,0 +1,34 @@
|
||||
-- 创建图生视频任务表
|
||||
CREATE TABLE IF NOT EXISTS image_to_video_tasks (
|
||||
id BIGINT AUTO_INCREMENT PRIMARY KEY,
|
||||
task_id VARCHAR(50) NOT NULL UNIQUE,
|
||||
username VARCHAR(100) NOT NULL,
|
||||
first_frame_url VARCHAR(500) NOT NULL,
|
||||
last_frame_url VARCHAR(500),
|
||||
prompt TEXT,
|
||||
aspect_ratio VARCHAR(10) NOT NULL DEFAULT '16:9',
|
||||
duration INT NOT NULL DEFAULT 5,
|
||||
hd_mode BOOLEAN NOT NULL DEFAULT FALSE,
|
||||
status VARCHAR(20) NOT NULL DEFAULT 'PENDING',
|
||||
progress INT DEFAULT 0,
|
||||
result_url VARCHAR(500),
|
||||
real_task_id VARCHAR(100),
|
||||
error_message TEXT,
|
||||
cost_points INT DEFAULT 0,
|
||||
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
|
||||
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
|
||||
completed_at TIMESTAMP NULL,
|
||||
|
||||
INDEX idx_username (username),
|
||||
INDEX idx_status (status),
|
||||
INDEX idx_created_at (created_at),
|
||||
INDEX idx_task_id (task_id)
|
||||
);
|
||||
|
||||
-- 注意:MySQL的CHECK约束支持有限,以下约束在应用层进行验证
|
||||
-- 任务状态应该在应用层验证:PENDING, PROCESSING, COMPLETED, FAILED, CANCELLED
|
||||
-- 时长应该在应用层验证:1-60秒
|
||||
-- 进度应该在应用层验证:0-100
|
||||
|
||||
-- 如果需要数据库层约束,可以使用触发器或存储过程
|
||||
-- 这里我们依赖应用层的验证逻辑
|
||||
@@ -0,0 +1,32 @@
|
||||
-- 创建文生视频任务表
|
||||
CREATE TABLE IF NOT EXISTS text_to_video_tasks (
|
||||
id BIGINT AUTO_INCREMENT PRIMARY KEY,
|
||||
task_id VARCHAR(50) NOT NULL UNIQUE,
|
||||
username VARCHAR(100) NOT NULL,
|
||||
prompt TEXT,
|
||||
aspect_ratio VARCHAR(10) NOT NULL DEFAULT '16:9',
|
||||
duration INT NOT NULL DEFAULT 5,
|
||||
hd_mode BOOLEAN NOT NULL DEFAULT FALSE,
|
||||
status VARCHAR(20) NOT NULL DEFAULT 'PENDING',
|
||||
progress INT DEFAULT 0,
|
||||
result_url VARCHAR(500),
|
||||
real_task_id VARCHAR(100),
|
||||
error_message TEXT,
|
||||
cost_points INT DEFAULT 0,
|
||||
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
|
||||
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
|
||||
completed_at TIMESTAMP NULL,
|
||||
|
||||
INDEX idx_username (username),
|
||||
INDEX idx_status (status),
|
||||
INDEX idx_created_at (created_at),
|
||||
INDEX idx_task_id (task_id)
|
||||
);
|
||||
|
||||
-- 注意:MySQL的CHECK约束支持有限,以下约束在应用层进行验证
|
||||
-- 任务状态应该在应用层验证:PENDING, PROCESSING, COMPLETED, FAILED, CANCELLED
|
||||
-- 时长应该在应用层验证:1-60秒
|
||||
-- 进度应该在应用层验证:0-100
|
||||
|
||||
-- 如果需要数据库层约束,可以使用触发器或存储过程
|
||||
-- 这里我们依赖应用层的验证逻辑
|
||||
18
demo/src/main/resources/payment.properties
Normal file
18
demo/src/main/resources/payment.properties
Normal file
@@ -0,0 +1,18 @@
|
||||
# 支付配置
|
||||
# 支付宝配置 - 请替换为您的实际配置
|
||||
alipay.app-id=您的APPID
|
||||
alipay.private-key=您的应用私钥
|
||||
alipay.public-key=支付宝公钥
|
||||
alipay.server-url=https://openapi.alipaydev.com/gateway.do
|
||||
alipay.domain=http://您的域名:8080
|
||||
alipay.app-cert-path=classpath:cert/alipay/appCertPublicKey.crt
|
||||
alipay.ali-pay-cert-path=classpath:cert/alipay/alipayCertPublicKey_RSA2.crt
|
||||
alipay.ali-pay-root-cert-path=classpath:cert/alipay/alipayRootCert.crt
|
||||
|
||||
# PayPal支付配置
|
||||
paypal.client-id=your_paypal_client_id_here
|
||||
paypal.client-secret=your_paypal_client_secret_here
|
||||
paypal.mode=sandbox
|
||||
paypal.return-url=http://localhost:8080/api/payments/paypal/return
|
||||
paypal.cancel-url=http://localhost:8080/api/payments/paypal/cancel
|
||||
paypal.domain=http://localhost:8080
|
||||
@@ -568,3 +568,5 @@
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
@@ -484,3 +484,5 @@
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
@@ -523,3 +523,5 @@
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
Reference in New Issue
Block a user