feat: 添加后台登录验证码、记住密码功能,优化媒体资源与前端规范
- 新增后台登录图形验证码功能,完善登录安全防护 - 新增登录rememberMe参数,控制Refresh Token的会话持久化策略 - 实现OSS私有桶媒体URL自动签名,统一处理图片资源的临时访问签名 - 新增素材库数据库表与上传API,规范媒体资源管理流程 - 统一前端UI图标使用@element-plus/icons-vue,重构布局图标组件 - 登录页新增验证码输入、刷新功能,添加账号记忆与记住密码逻辑 - 更新全套文档,补充API契约、技术决策记录与集成流程说明 - 修复多个业务页面的图标展示问题,新增认证流程相关测试用例
This commit is contained in:
1 parent
2c8c327de7
commit
6245159e7c
35 files changed
+914
-79
No files matched your search
@@ -0,0 +1,65 @@
|
||||
"""Create the media asset table required by admin uploads."""
|
||||
|
||||
from alembic import op
|
||||
import sqlalchemy as sa
|
||||
from sqlalchemy import inspect
|
||||
|
||||
|
||||
revision = "0034_media_assets"
|
||||
down_revision = "0033_remove_site_versions"
|
||||
branch_labels = None
|
||||
depends_on = None
|
||||
|
||||
DEFAULT_DEPT_ID = "00000000-0000-0000-0000-000000000001"
|
||||
|
||||
|
||||
def _table_names() -> set[str]:
|
||||
return set(inspect(op.get_bind()).get_table_names())
|
||||
|
||||
|
||||
def upgrade() -> None:
|
||||
if "MediaAsset" in _table_names():
|
||||
return
|
||||
|
||||
op.create_table(
|
||||
"MediaAsset",
|
||||
sa.Column("id", sa.String(), nullable=False),
|
||||
sa.Column("url", sa.String(), nullable=False, unique=True),
|
||||
sa.Column("name", sa.String(), nullable=True),
|
||||
sa.Column("mimeType", sa.String(), nullable=True),
|
||||
sa.Column("sizeBytes", sa.Integer(), nullable=True),
|
||||
sa.Column("group", sa.String(), nullable=True),
|
||||
sa.Column(
|
||||
"deptId",
|
||||
sa.String(),
|
||||
nullable=False,
|
||||
server_default=sa.text(f"'{DEFAULT_DEPT_ID}'"),
|
||||
),
|
||||
sa.Column("createdById", sa.String(), nullable=True),
|
||||
sa.Column("createdAt", sa.DateTime(), nullable=False),
|
||||
sa.Column("updatedAt", sa.DateTime(), nullable=False),
|
||||
sa.ForeignKeyConstraint(
|
||||
["deptId"],
|
||||
["AdminDepartment.id"],
|
||||
name="fk_MediaAsset_deptId",
|
||||
ondelete="RESTRICT",
|
||||
),
|
||||
sa.ForeignKeyConstraint(
|
||||
["createdById"],
|
||||
["AdminUser.id"],
|
||||
name="fk_MediaAsset_createdById",
|
||||
ondelete="SET NULL",
|
||||
),
|
||||
sa.PrimaryKeyConstraint("id"),
|
||||
)
|
||||
op.create_index("ix_MediaAsset_deptId", "MediaAsset", ["deptId"])
|
||||
op.create_index("ix_MediaAsset_createdById", "MediaAsset", ["createdById"])
|
||||
|
||||
|
||||
def downgrade() -> None:
|
||||
if "MediaAsset" not in _table_names():
|
||||
return
|
||||
|
||||
op.drop_index("ix_MediaAsset_createdById", table_name="MediaAsset")
|
||||
op.drop_index("ix_MediaAsset_deptId", table_name="MediaAsset")
|
||||
op.drop_table("MediaAsset")
|
||||
Reference in new issue
Block a user