feat: migrate from Element Plus to Ant Design Vue and update Vite configuration for better dependency management

- Updated Vite configuration to manually chunk Ant Design Vue for improved dependency management.
- Added a comprehensive migration testing checklist for transitioning from Element Plus 2.13.0 to Ant Design Vue 4.x, covering various components and functionalities.
This commit is contained in:
2026-01-03 01:38:38 +08:00
parent 42a1046750
commit 827c9198ae
57 changed files with 5517 additions and 2982 deletions
@@ -1,72 +0,0 @@
"""
数据库迁移脚本:为 task_templates 表添加 parent_id 字段
运行方法:
python backend/scripts/migrate_add_parent_id_to_templates.py
"""
import sys
import os
from pathlib import Path
# 设置 UTF-8 编码输出(Windows 兼容)
if sys.platform == "win32":
import io
sys.stdout = io.TextIOWrapper(sys.stdout.buffer, encoding='utf-8')
sys.stderr = io.TextIOWrapper(sys.stderr.buffer, encoding='utf-8')
# 添加项目根目录到 Python 路径
project_root = Path(__file__).parent.parent.parent
sys.path.insert(0, str(project_root))
from sqlalchemy import text
from backend.models.database import engine, SessionLocal
def migrate():
"""为 task_templates 表添加 parent_id 字段"""
print("=" * 60)
print("开始数据库迁移:添加 parent_id 字段到 task_templates 表")
print("=" * 60)
db = SessionLocal()
try:
# 检查字段是否已存在
result = db.execute(text(
"SELECT COUNT(*) FROM pragma_table_info('task_templates') WHERE name='parent_id'"
))
field_exists = result.fetchone()[0] > 0
if field_exists:
print("⚠️ parent_id 字段已存在,跳过迁移")
return
# 添加 parent_id 字段
print("📝 正在添加 parent_id 字段...")
db.execute(text(
"ALTER TABLE task_templates ADD COLUMN parent_id INTEGER"
))
db.commit()
print("✅ parent_id 字段添加成功")
# 创建外键约束(SQLite 不支持直接添加外键,需要重建表)
print("\n📝 注意:SQLite 不支持直接添加外键约束")
print(" 如需外键约束,请重建表或在下次完整迁移时处理")
print("\n" + "=" * 60)
print("✅ 数据库迁移完成!")
print("=" * 60)
except Exception as e:
print(f"\n❌ 迁移失败: {str(e)}")
db.rollback()
import traceback
traceback.print_exc()
sys.exit(1)
finally:
db.close()
if __name__ == "__main__":
migrate()
@@ -1,57 +0,0 @@
"""
添加 payload_config 字段到 check_in_tasks 表的迁移脚本
运行方式:
python backend/scripts/migrate_add_payload_config.py
.venv/Scripts/python.exe backend/scripts/migrate_add_payload_config.py
"""
import sys
import os
from pathlib import Path
# 添加项目根目录到 Python 路径
project_root = Path(__file__).resolve().parent.parent.parent
sys.path.insert(0, str(project_root))
from sqlalchemy import text
from backend.models.database import engine
def migrate():
"""执行迁移"""
print("开始迁移:添加 payload_config 字段...")
with engine.connect() as conn:
# 检查字段是否已存在
result = conn.execute(text("PRAGMA table_info(check_in_tasks)"))
columns = [row[1] for row in result]
if 'payload_config' in columns:
print("[OK] payload_config 字段已存在,跳过迁移")
return
# 添加 payload_config 字段(JSON 文本,存储完整的 payload 配置)
print("添加 payload_config 字段...")
conn.execute(text("""
ALTER TABLE check_in_tasks
ADD COLUMN payload_config TEXT DEFAULT '{}' NOT NULL
"""))
conn.commit()
print("[OK] payload_config 字段添加成功")
print("\n注意:现有任务的 payload_config 默认为空 JSON {}")
print(" Worker 将使用默认的固定字段值。")
print(" 新创建的任务将从模板继承完整的 payload 配置。")
if __name__ == "__main__":
try:
migrate()
print("\n[SUCCESS] 迁移完成!")
except Exception as e:
print(f"\n[ERROR] 迁移失败: {e}")
import traceback
traceback.print_exc()
sys.exit(1)
@@ -1,132 +0,0 @@
"""
删除 check_in_tasks 表中不再需要的旧列的迁移脚本
删除的列:
- signature (VARCHAR) - 已在 payload_config 中
- texts (VARCHAR) - 已在 payload_config 中
- values (TEXT) - 已在 payload_config 中
- thread_id (VARCHAR) - 已在 payload_config 的 ThreadId 中
- email (VARCHAR) - 从 user 表的 email 字段获取
新架构只保留:
- id, user_id, payload_config, name, is_active, created_at, updated_at
运行方式:
python backend/scripts/migrate_remove_old_columns.py
venv/Scripts/python.exe backend/scripts/migrate_remove_old_columns.py
"""
import sys
import os
from pathlib import Path
# 添加项目根目录到 Python 路径
project_root = Path(__file__).resolve().parent.parent.parent
sys.path.insert(0, str(project_root))
from sqlalchemy import text, inspect
from backend.models.database import engine
def migrate():
"""执行迁移:删除旧列"""
print("开始迁移:删除 check_in_tasks 表中的旧列...")
print("将删除的列: signature, texts, values, thread_id, email")
print("=" * 60)
with engine.connect() as conn:
# 检查表结构
inspector = inspect(engine)
columns = [col['name'] for col in inspector.get_columns('check_in_tasks')]
print(f"\n当前表列: {', '.join(columns)}")
old_columns = ['signature', 'texts', 'values', 'thread_id', 'email']
columns_to_remove = [col for col in old_columns if col in columns]
if not columns_to_remove:
print("\n[OK] 旧列已被删除,跳过迁移")
return
print(f"\n需要删除的列: {', '.join(columns_to_remove)}")
# SQLite 不支持直接 DROP COLUMN,需要重建表
# 步骤:
# 1. 创建新表(只包含需要的列)
# 2. 复制数据
# 3. 删除旧表
# 4. 重命名新表
print("\n正在重建表结构...")
# 1. 创建新表
conn.execute(text("""
CREATE TABLE check_in_tasks_new (
id INTEGER PRIMARY KEY AUTOINCREMENT,
user_id INTEGER NOT NULL,
payload_config TEXT NOT NULL DEFAULT '{}',
name VARCHAR(100) DEFAULT '',
is_active BOOLEAN DEFAULT 1,
created_at DATETIME DEFAULT CURRENT_TIMESTAMP,
updated_at DATETIME,
FOREIGN KEY (user_id) REFERENCES users(id) ON DELETE CASCADE
)
"""))
print(" [OK] 创建新表结构")
# 2. 复制数据(只复制保留的列)
conn.execute(text("""
INSERT INTO check_in_tasks_new
(id, user_id, payload_config, name, is_active, created_at, updated_at)
SELECT
id, user_id, payload_config, name, is_active, created_at, updated_at
FROM check_in_tasks
"""))
print(" [OK] 复制数据到新表")
# 3. 删除旧表
conn.execute(text("DROP TABLE check_in_tasks"))
print(" [OK] 删除旧表")
# 4. 重命名新表
conn.execute(text("ALTER TABLE check_in_tasks_new RENAME TO check_in_tasks"))
print(" [OK] 重命名新表")
# 5. 重建索引
conn.execute(text("""
CREATE INDEX ix_check_in_tasks_user_id ON check_in_tasks(user_id)
"""))
conn.execute(text("""
CREATE INDEX ix_check_in_tasks_id ON check_in_tasks(id)
"""))
conn.execute(text("""
CREATE INDEX ix_task_user_active ON check_in_tasks(user_id, is_active)
"""))
print(" [OK] 重建索引")
conn.commit()
print("\n[SUCCESS] 表结构迁移成功!")
print("\n新的表结构:")
inspector = inspect(engine)
new_columns = [col['name'] for col in inspector.get_columns('check_in_tasks')]
print(f" 列: {', '.join(new_columns)}")
if __name__ == "__main__":
try:
migrate()
print("\n" + "=" * 60)
print("[完成] 迁移成功完成!")
print("\n数据库已更新为新架构:")
print(" - 删除了 signature, texts, values, thread_id, email 列")
print(" - 保留了 payload_config 列(存储完整的 JSON payload")
print(" - ThreadId 现在存储在 payload_config 中")
print(" - Email 现在从 user 表获取")
print("=" * 60)
except Exception as e:
print(f"\n[ERROR] 迁移失败: {e}")
import traceback
traceback.print_exc()
sys.exit(1)
@@ -0,0 +1,135 @@
"""
删除 users 表中 registered_ip 列的迁移脚本
删除的列:
- registered_ip (VARCHAR) - 注册IP地址,不再需要
新架构中移除该字段以保护用户隐私。
运行方式:
python backend/scripts/migrate_remove_registered_ip.py
venv/Scripts/python.exe backend/scripts/migrate_remove_registered_ip.py
"""
import sys
import os
from pathlib import Path
# 添加项目根目录到 Python 路径
project_root = Path(__file__).resolve().parent.parent.parent
sys.path.insert(0, str(project_root))
from sqlalchemy import text, inspect
from backend.models.database import engine
def migrate():
"""执行迁移:删除 registered_ip 列"""
print("开始迁移:删除 users 表中的 registered_ip 列...")
print("=" * 60)
with engine.connect() as conn:
# 检查表结构
inspector = inspect(engine)
columns = [col['name'] for col in inspector.get_columns('users')]
print(f"\n当前表列: {', '.join(columns)}")
if 'registered_ip' not in columns:
print("\n[OK] registered_ip 列已被删除,跳过迁移")
return
print(f"\n需要删除的列: registered_ip")
# SQLite 不支持直接 DROP COLUMN,需要重建表
# 步骤:
# 1. 创建新表(不包含 registered_ip
# 2. 复制数据
# 3. 删除旧表
# 4. 重命名新表
print("\n正在重建表结构...")
# 1. 创建新表
conn.execute(text("""
CREATE TABLE users_new (
id INTEGER PRIMARY KEY AUTOINCREMENT,
jwt_sub VARCHAR(200) UNIQUE,
alias VARCHAR(50) NOT NULL UNIQUE,
email VARCHAR(100),
password_hash VARCHAR(200),
authorization TEXT,
jwt_exp VARCHAR(20) DEFAULT '0',
role VARCHAR(20) DEFAULT 'user',
is_approved BOOLEAN DEFAULT 0,
created_at DATETIME DEFAULT CURRENT_TIMESTAMP,
updated_at DATETIME
)
"""))
print(" [OK] 创建新表结构")
# 2. 复制数据(不包含 registered_ip
conn.execute(text("""
INSERT INTO users_new
(id, jwt_sub, alias, email, password_hash, authorization, jwt_exp,
role, is_approved, created_at, updated_at)
SELECT
id, jwt_sub, alias, email, password_hash, authorization, jwt_exp,
role, is_approved, created_at, updated_at
FROM users
"""))
print(" [OK] 复制数据到新表")
# 3. 删除旧表
conn.execute(text("DROP TABLE users"))
print(" [OK] 删除旧表")
# 4. 重命名新表
conn.execute(text("ALTER TABLE users_new RENAME TO users"))
print(" [OK] 重命名新表")
# 5. 重建索引
conn.execute(text("""
CREATE INDEX ix_users_jwt_sub ON users(jwt_sub)
"""))
conn.execute(text("""
CREATE INDEX ix_users_alias ON users(alias)
"""))
conn.execute(text("""
CREATE INDEX ix_users_role ON users(role)
"""))
conn.execute(text("""
CREATE INDEX ix_users_is_approved ON users(is_approved)
"""))
conn.execute(text("""
CREATE INDEX ix_users_id ON users(id)
"""))
conn.execute(text("""
CREATE INDEX ix_user_role_approved ON users(role, is_approved)
"""))
print(" [OK] 重建索引")
conn.commit()
print("\n[SUCCESS] 表结构迁移成功!")
print("\n新的表结构:")
inspector = inspect(engine)
new_columns = [col['name'] for col in inspector.get_columns('users')]
print(f" 列: {', '.join(new_columns)}")
if __name__ == "__main__":
try:
migrate()
print("\n" + "=" * 60)
print("[完成] 迁移成功完成!")
print("\n数据库已更新为新架构:")
print(" - 删除了 registered_ip 列(保护用户隐私)")
print(" - 保留了所有其他用户数据")
print("=" * 60)
except Exception as e:
print(f"\n[ERROR] 迁移失败: {e}")
import traceback
traceback.print_exc()
sys.exit(1)