feat: 完成代码逻辑错误修复和任务清理系统实现

主要更新:
- 修复了所有主要的代码逻辑错误
- 实现了完整的任务清理系统
- 添加了系统设置页面的任务清理管理功能
- 修复了API调用认证问题
- 优化了密码加密和验证机制
- 统一了错误处理模式
- 添加了详细的文档和测试工具

新增功能:
- 任务清理管理界面
- 任务归档和清理日志
- API监控和诊断工具
- 完整的测试套件

技术改进:
- 修复了Repository方法调用错误
- 统一了模型方法调用
- 改进了类型安全性
- 优化了代码结构和可维护性
This commit is contained in:
AIGC Developer
2025-10-27 10:46:49 +08:00
parent 473e0f6a7e
commit 8c55f9f376
161 changed files with 22720 additions and 327 deletions

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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='任务队列表';

View File

@@ -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='积分冻结记录表';

View File

@@ -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='用户作品表';

View File

@@ -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='任务状态表';

View File

@@ -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='失败任务清理日志表';

View File

@@ -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
-- 如果需要数据库层约束,可以使用触发器或存储过程
-- 这里我们依赖应用层的验证逻辑

View File

@@ -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
-- 如果需要数据库层约束,可以使用触发器或存储过程
-- 这里我们依赖应用层的验证逻辑

View 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

View File

@@ -568,3 +568,5 @@

View File

@@ -484,3 +484,5 @@

View File

@@ -523,3 +523,5 @@