feat(admin, miniapp): 优化数据库迁移逻辑与小程序图片资源处理
- 为后端Admin新增migration_compat工具,支持离线迁移时的基线资源检查,重构全部alembic迁移脚本适配离线模式,避免重复创建已存在的数据库表和字段 - 完善初始数据库迁移脚本,添加默认部门种子数据,新增ConciergeAdvisor详情字段从JSON到JSONB的类型转换迁移 - 小程序端新增图片资源解析工具resolveNetworkImage,实现本地静态资源到CDN的自动映射,添加图片加载容错降级机制 - 完善HeroSlide类型定义,新增actionLabel字段,优化首页轮播组件的文本渲染与错误处理逻辑 - 新增对应测试用例验证迁移路径正确性与前端数据处理逻辑 - 新增临时 brainstorm UI对比草稿与开发临时状态文件
This commit is contained in:
1 parent
96bcc7c032
commit
4e04feda5b
27 files changed
+2695
-377
No files matched your search
@@ -5,7 +5,10 @@ Revises:
|
||||
Create Date: 2026-06-30
|
||||
"""
|
||||
|
||||
from datetime import datetime, timezone
|
||||
|
||||
from alembic import context, op
|
||||
import sqlalchemy as sa
|
||||
from sqlalchemy import inspect
|
||||
from app.database import Base
|
||||
from app import models # noqa: F401
|
||||
@@ -16,6 +19,41 @@ down_revision = None
|
||||
branch_labels = None
|
||||
depends_on = None
|
||||
|
||||
DEFAULT_DEPT_ID = "00000000-0000-0000-0000-000000000001"
|
||||
|
||||
|
||||
def _seed_default_department(bind) -> None:
|
||||
department_table = sa.table(
|
||||
"AdminDepartment",
|
||||
sa.column("id", sa.String()),
|
||||
sa.column("name", sa.String()),
|
||||
sa.column("sortOrder", sa.Integer()),
|
||||
sa.column("isActive", sa.Boolean()),
|
||||
sa.column("createdAt", sa.DateTime()),
|
||||
sa.column("updatedAt", sa.DateTime()),
|
||||
)
|
||||
if context.is_offline_mode():
|
||||
should_seed = True
|
||||
else:
|
||||
should_seed = bind.execute(
|
||||
sa.text('SELECT 1 FROM "AdminDepartment" LIMIT 1')
|
||||
).first() is None
|
||||
if should_seed:
|
||||
timestamp = datetime.now(timezone.utc).replace(tzinfo=None)
|
||||
op.bulk_insert(
|
||||
department_table,
|
||||
[
|
||||
{
|
||||
"id": DEFAULT_DEPT_ID,
|
||||
"name": "默认部门",
|
||||
"sortOrder": 0,
|
||||
"isActive": True,
|
||||
"createdAt": timestamp,
|
||||
"updatedAt": timestamp,
|
||||
}
|
||||
],
|
||||
)
|
||||
|
||||
|
||||
def upgrade() -> None:
|
||||
bind = op.get_bind()
|
||||
@@ -26,6 +64,8 @@ def upgrade() -> None:
|
||||
for table in Base.metadata.sorted_tables:
|
||||
if table.name not in existing_tables:
|
||||
table.create(bind)
|
||||
if "AdminDepartment" in Base.metadata.tables:
|
||||
_seed_default_department(bind)
|
||||
|
||||
|
||||
def downgrade() -> None:
|
||||
|
||||
Reference in new issue
Block a user