add
This commit is contained in:
Binary file not shown.
@@ -0,0 +1,432 @@
|
||||
"""init: 27 tables
|
||||
|
||||
Revision ID: d659ecc1b6e7
|
||||
Revises:
|
||||
Create Date: 2026-10-15 09:21:58.395583
|
||||
"""
|
||||
from alembic import op
|
||||
import sqlalchemy as sa
|
||||
from sqlalchemy.dialects import mysql
|
||||
|
||||
revision = 'd659ecc1b6e7'
|
||||
down_revision = None
|
||||
branch_labels = None
|
||||
depends_on = None
|
||||
|
||||
|
||||
def upgrade() -> None:
|
||||
# ### commands auto generated by Alembic - please adjust! ###
|
||||
op.create_table('admin_logs',
|
||||
sa.Column('id', mysql.BIGINT(unsigned=True), autoincrement=True, nullable=False),
|
||||
sa.Column('admin_id', mysql.BIGINT(unsigned=True), nullable=False),
|
||||
sa.Column('action', sa.String(length=50), nullable=False),
|
||||
sa.Column('target', sa.String(length=100), nullable=False),
|
||||
sa.Column('detail', sa.String(length=1000), nullable=False),
|
||||
sa.Column('ip', sa.String(length=45), nullable=False),
|
||||
sa.Column('created_at', sa.DateTime(), server_default=sa.text('now()'), nullable=False),
|
||||
sa.PrimaryKeyConstraint('id')
|
||||
)
|
||||
op.create_index('idx_admin_created', 'admin_logs', ['admin_id', 'created_at'], unique=False)
|
||||
op.create_table('admin_users',
|
||||
sa.Column('id', mysql.BIGINT(unsigned=True), autoincrement=True, nullable=False),
|
||||
sa.Column('username', sa.String(length=50), nullable=False),
|
||||
sa.Column('password_hash', sa.String(length=255), nullable=False),
|
||||
sa.Column('name', sa.String(length=50), nullable=False),
|
||||
sa.Column('role', sa.String(length=20), nullable=False, comment='super/reviewer/operator'),
|
||||
sa.Column('status', sa.SmallInteger(), nullable=False, comment='1正常 0禁用'),
|
||||
sa.Column('last_login_at', sa.DateTime(), nullable=True),
|
||||
sa.Column('created_at', sa.DateTime(), server_default=sa.text('now()'), nullable=False),
|
||||
sa.PrimaryKeyConstraint('id'),
|
||||
sa.UniqueConstraint('username')
|
||||
)
|
||||
op.create_table('asset_transactions',
|
||||
sa.Column('id', mysql.BIGINT(unsigned=True), autoincrement=True, nullable=False),
|
||||
sa.Column('user_id', mysql.BIGINT(unsigned=True), nullable=False),
|
||||
sa.Column('change_amount', sa.Numeric(precision=12, scale=1), nullable=False),
|
||||
sa.Column('balance_after', sa.Numeric(precision=12, scale=1), nullable=False),
|
||||
sa.Column('biz_type', sa.SmallInteger(), nullable=False, comment='1充值返利 2完整观看 3点赞 4提现 5提现退回 6返利扣回 7后台调整'),
|
||||
sa.Column('biz_id', sa.String(length=64), nullable=False),
|
||||
sa.Column('remark', sa.String(length=200), nullable=False),
|
||||
sa.Column('created_at', sa.DateTime(), server_default=sa.text('now()'), nullable=False),
|
||||
sa.PrimaryKeyConstraint('id')
|
||||
)
|
||||
op.create_index('idx_biz', 'asset_transactions', ['biz_type', 'biz_id'], unique=False)
|
||||
op.create_index('idx_user_created', 'asset_transactions', ['user_id', 'created_at'], unique=False)
|
||||
op.create_table('asset_wallets',
|
||||
sa.Column('user_id', mysql.BIGINT(unsigned=True), nullable=False),
|
||||
sa.Column('assets', sa.Numeric(precision=12, scale=1), nullable=False, comment='当前资产(允许为负)'),
|
||||
sa.Column('total_earned', sa.Numeric(precision=14, scale=1), nullable=False),
|
||||
sa.Column('total_withdrawn', sa.Numeric(precision=14, scale=1), nullable=False),
|
||||
sa.Column('version', sa.Integer(), nullable=False),
|
||||
sa.Column('updated_at', sa.DateTime(), server_default=sa.text('now()'), nullable=False),
|
||||
sa.PrimaryKeyConstraint('user_id')
|
||||
)
|
||||
op.create_table('categories',
|
||||
sa.Column('id', mysql.INTEGER(unsigned=True), autoincrement=True, nullable=False),
|
||||
sa.Column('name', sa.String(length=50), nullable=False),
|
||||
sa.Column('sort', sa.Integer(), nullable=False),
|
||||
sa.Column('status', sa.SmallInteger(), nullable=False, comment='1启用 0停用'),
|
||||
sa.PrimaryKeyConstraint('id')
|
||||
)
|
||||
op.create_table('comments',
|
||||
sa.Column('id', mysql.BIGINT(unsigned=True), autoincrement=True, nullable=False),
|
||||
sa.Column('video_id', mysql.BIGINT(unsigned=True), nullable=False),
|
||||
sa.Column('user_id', mysql.BIGINT(unsigned=True), nullable=False),
|
||||
sa.Column('parent_id', mysql.BIGINT(unsigned=True), nullable=False, comment='0=一级评论'),
|
||||
sa.Column('reply_to_user_id', mysql.BIGINT(unsigned=True), nullable=True),
|
||||
sa.Column('content', sa.String(length=500), nullable=False),
|
||||
sa.Column('like_count', sa.Integer(), nullable=False),
|
||||
sa.Column('status', sa.SmallInteger(), nullable=False, comment='1正常 2已删除 3审核中'),
|
||||
sa.Column('reward_counted', sa.SmallInteger(), nullable=False, comment='是否已计入评论奖励进度'),
|
||||
sa.Column('created_at', sa.DateTime(), server_default=sa.text('now()'), nullable=False),
|
||||
sa.PrimaryKeyConstraint('id')
|
||||
)
|
||||
op.create_index('idx_user_video', 'comments', ['user_id', 'video_id'], unique=False)
|
||||
op.create_index('idx_video', 'comments', ['video_id', 'status', 'created_at'], unique=False)
|
||||
op.create_table('favorites',
|
||||
sa.Column('id', mysql.BIGINT(unsigned=True), autoincrement=True, nullable=False),
|
||||
sa.Column('user_id', mysql.BIGINT(unsigned=True), nullable=False),
|
||||
sa.Column('video_id', mysql.BIGINT(unsigned=True), nullable=False),
|
||||
sa.Column('created_at', sa.DateTime(), server_default=sa.text('now()'), nullable=False),
|
||||
sa.PrimaryKeyConstraint('id')
|
||||
)
|
||||
op.create_index('idx_video', 'favorites', ['video_id'], unique=False)
|
||||
op.create_index('uk_user_video', 'favorites', ['user_id', 'video_id'], unique=True)
|
||||
op.create_table('likes',
|
||||
sa.Column('id', mysql.BIGINT(unsigned=True), autoincrement=True, nullable=False),
|
||||
sa.Column('user_id', mysql.BIGINT(unsigned=True), nullable=False),
|
||||
sa.Column('video_id', mysql.BIGINT(unsigned=True), nullable=False),
|
||||
sa.Column('created_at', sa.DateTime(), server_default=sa.text('now()'), nullable=False),
|
||||
sa.PrimaryKeyConstraint('id')
|
||||
)
|
||||
op.create_index('idx_video', 'likes', ['video_id'], unique=False)
|
||||
op.create_index('uk_user_video', 'likes', ['user_id', 'video_id'], unique=True)
|
||||
op.create_table('notifications',
|
||||
sa.Column('id', mysql.BIGINT(unsigned=True), autoincrement=True, nullable=False),
|
||||
sa.Column('user_id', mysql.BIGINT(unsigned=True), nullable=False, comment='接收人'),
|
||||
sa.Column('type', sa.SmallInteger(), nullable=False, comment='1审核结果 2提现进度 3系统公告 4评论回复'),
|
||||
sa.Column('title', sa.String(length=100), nullable=False),
|
||||
sa.Column('content', sa.String(length=500), nullable=False),
|
||||
sa.Column('biz_id', sa.String(length=64), nullable=False),
|
||||
sa.Column('is_read', sa.SmallInteger(), nullable=False),
|
||||
sa.Column('created_at', sa.DateTime(), server_default=sa.text('now()'), nullable=False),
|
||||
sa.PrimaryKeyConstraint('id')
|
||||
)
|
||||
op.create_index('idx_user_read', 'notifications', ['user_id', 'is_read', 'id'], unique=False)
|
||||
op.create_table('point_transactions',
|
||||
sa.Column('id', mysql.BIGINT(unsigned=True), autoincrement=True, nullable=False),
|
||||
sa.Column('user_id', mysql.BIGINT(unsigned=True), nullable=False),
|
||||
sa.Column('change_amount', sa.Integer(), nullable=False, comment='正增负减'),
|
||||
sa.Column('balance_after', sa.Integer(), nullable=False),
|
||||
sa.Column('biz_type', sa.SmallInteger(), nullable=False, comment='1充值 2观看 3评论奖励 4会员 5赠送 6调整 7扣回 8推荐奖励'),
|
||||
sa.Column('biz_id', sa.String(length=64), nullable=False),
|
||||
sa.Column('remark', sa.String(length=200), nullable=False),
|
||||
sa.Column('created_at', sa.DateTime(), server_default=sa.text('now()'), nullable=False),
|
||||
sa.PrimaryKeyConstraint('id')
|
||||
)
|
||||
op.create_index('idx_biz', 'point_transactions', ['biz_type', 'biz_id'], unique=False)
|
||||
op.create_index('idx_user_created', 'point_transactions', ['user_id', 'created_at'], unique=False)
|
||||
op.create_table('recharge_orders',
|
||||
sa.Column('id', mysql.BIGINT(unsigned=True), autoincrement=True, nullable=False),
|
||||
sa.Column('order_no', sa.String(length=32), nullable=False),
|
||||
sa.Column('user_id', mysql.BIGINT(unsigned=True), nullable=False),
|
||||
sa.Column('amount_fen', sa.Integer(), nullable=False, comment='人民币金额(分)'),
|
||||
sa.Column('points', sa.Integer(), nullable=False, comment='应到账积分'),
|
||||
sa.Column('pay_method', sa.SmallInteger(), nullable=False, comment='1支付宝 2微信 3USDT'),
|
||||
sa.Column('status', sa.SmallInteger(), nullable=False, comment='0待支付 1已支付 2已关闭 3已退款'),
|
||||
sa.Column('third_trade_no', sa.String(length=64), nullable=True),
|
||||
sa.Column('usdt_amount', sa.Numeric(precision=18, scale=6), nullable=True),
|
||||
sa.Column('usdt_rate', sa.Numeric(precision=10, scale=4), nullable=True),
|
||||
sa.Column('paid_at', sa.DateTime(), nullable=True),
|
||||
sa.Column('expire_at', sa.DateTime(), nullable=False),
|
||||
sa.Column('created_at', sa.DateTime(), server_default=sa.text('now()'), nullable=False),
|
||||
sa.Column('updated_at', sa.DateTime(), server_default=sa.text('now()'), nullable=False),
|
||||
sa.PrimaryKeyConstraint('id'),
|
||||
sa.UniqueConstraint('order_no'),
|
||||
sa.UniqueConstraint('third_trade_no')
|
||||
)
|
||||
op.create_index('idx_user_status', 'recharge_orders', ['user_id', 'status'], unique=False)
|
||||
op.create_table('recharge_packages',
|
||||
sa.Column('id', mysql.INTEGER(unsigned=True), autoincrement=True, nullable=False),
|
||||
sa.Column('amount_yuan', sa.Integer(), nullable=False),
|
||||
sa.Column('points', sa.Integer(), nullable=False, comment='基础积分=金额x汇率'),
|
||||
sa.Column('bonus_points', sa.Integer(), nullable=False),
|
||||
sa.Column('sort', sa.Integer(), nullable=False),
|
||||
sa.Column('status', sa.SmallInteger(), nullable=False, comment='1上架 0下架'),
|
||||
sa.Column('created_at', sa.DateTime(), server_default=sa.text('now()'), nullable=False),
|
||||
sa.Column('updated_at', sa.DateTime(), server_default=sa.text('now()'), nullable=False),
|
||||
sa.PrimaryKeyConstraint('id')
|
||||
)
|
||||
op.create_table('referrals',
|
||||
sa.Column('id', mysql.BIGINT(unsigned=True), autoincrement=True, nullable=False),
|
||||
sa.Column('inviter_id', mysql.BIGINT(unsigned=True), nullable=False, comment='推荐人'),
|
||||
sa.Column('invitee_id', mysql.BIGINT(unsigned=True), nullable=False, comment='被推荐人'),
|
||||
sa.Column('invite_code', sa.String(length=10), nullable=False),
|
||||
sa.Column('status', sa.SmallInteger(), nullable=False, comment='0待激活 1有效 2无效 3风控冻结'),
|
||||
sa.Column('risk_flag', sa.String(length=50), nullable=False),
|
||||
sa.Column('register_ip', sa.String(length=45), nullable=False),
|
||||
sa.Column('activated_at', sa.DateTime(), nullable=True),
|
||||
sa.Column('created_at', sa.DateTime(), server_default=sa.text('now()'), nullable=False),
|
||||
sa.PrimaryKeyConstraint('id')
|
||||
)
|
||||
op.create_index('idx_inviter', 'referrals', ['inviter_id', 'created_at'], unique=False)
|
||||
op.create_index('idx_status', 'referrals', ['status', 'created_at'], unique=False)
|
||||
op.create_index('uk_invitee', 'referrals', ['invitee_id'], unique=True)
|
||||
op.create_table('reports',
|
||||
sa.Column('id', mysql.BIGINT(unsigned=True), autoincrement=True, nullable=False),
|
||||
sa.Column('user_id', mysql.BIGINT(unsigned=True), nullable=False, comment='举报人'),
|
||||
sa.Column('target_type', sa.SmallInteger(), nullable=False, comment='1视频 2评论'),
|
||||
sa.Column('target_id', mysql.BIGINT(unsigned=True), nullable=False),
|
||||
sa.Column('reason_type', sa.SmallInteger(), nullable=False, comment='1色情低俗 2暴力血腥 3侵权 4广告营销 5其他'),
|
||||
sa.Column('remark', sa.String(length=200), nullable=False),
|
||||
sa.Column('status', sa.SmallInteger(), nullable=False, comment='0待处理 1已处理 2已驳回'),
|
||||
sa.Column('handle_result', sa.String(length=50), nullable=False),
|
||||
sa.Column('admin_id', mysql.BIGINT(unsigned=True), nullable=True),
|
||||
sa.Column('created_at', sa.DateTime(), server_default=sa.text('now()'), nullable=False),
|
||||
sa.Column('handled_at', sa.DateTime(), nullable=True),
|
||||
sa.PrimaryKeyConstraint('id')
|
||||
)
|
||||
op.create_index('idx_status', 'reports', ['status', 'created_at'], unique=False)
|
||||
op.create_index('uk_user_target', 'reports', ['user_id', 'target_type', 'target_id'], unique=True)
|
||||
op.create_table('sensitive_words',
|
||||
sa.Column('id', mysql.INTEGER(unsigned=True), autoincrement=True, nullable=False),
|
||||
sa.Column('word', sa.String(length=50), nullable=False),
|
||||
sa.Column('created_at', sa.DateTime(), server_default=sa.text('now()'), nullable=False),
|
||||
sa.PrimaryKeyConstraint('id'),
|
||||
sa.UniqueConstraint('word')
|
||||
)
|
||||
op.create_table('system_configs',
|
||||
sa.Column('config_key', sa.String(length=50), nullable=False),
|
||||
sa.Column('config_value', sa.String(length=500), nullable=False),
|
||||
sa.Column('description', sa.String(length=200), nullable=False),
|
||||
sa.Column('updated_by', mysql.BIGINT(unsigned=True), nullable=True),
|
||||
sa.Column('updated_at', sa.DateTime(), server_default=sa.text('now()'), nullable=False),
|
||||
sa.PrimaryKeyConstraint('config_key')
|
||||
)
|
||||
op.create_table('tags',
|
||||
sa.Column('id', mysql.INTEGER(unsigned=True), autoincrement=True, nullable=False),
|
||||
sa.Column('name', sa.String(length=20), nullable=False),
|
||||
sa.Column('video_count', sa.Integer(), nullable=False, comment='冗余'),
|
||||
sa.Column('created_at', sa.DateTime(), server_default=sa.text('now()'), nullable=False),
|
||||
sa.PrimaryKeyConstraint('id'),
|
||||
sa.UniqueConstraint('name')
|
||||
)
|
||||
op.create_table('transcode_tasks',
|
||||
sa.Column('id', mysql.BIGINT(unsigned=True), autoincrement=True, nullable=False),
|
||||
sa.Column('video_id', mysql.BIGINT(unsigned=True), nullable=False),
|
||||
sa.Column('source_url', sa.String(length=500), nullable=False),
|
||||
sa.Column('task_status', sa.SmallInteger(), nullable=False, comment='0排队 1转码中 2成功 3失败'),
|
||||
sa.Column('priority', sa.SmallInteger(), nullable=False, comment='0普通 1优先(会员)'),
|
||||
sa.Column('retry_count', sa.Integer(), nullable=False),
|
||||
sa.Column('error_msg', sa.String(length=500), nullable=False),
|
||||
sa.Column('created_at', sa.DateTime(), server_default=sa.text('now()'), nullable=False),
|
||||
sa.Column('updated_at', sa.DateTime(), server_default=sa.text('now()'), nullable=False),
|
||||
sa.PrimaryKeyConstraint('id')
|
||||
)
|
||||
op.create_index('idx_pick', 'transcode_tasks', ['task_status', 'priority', 'created_at'], unique=False)
|
||||
op.create_table('users',
|
||||
sa.Column('id', mysql.BIGINT(unsigned=True), autoincrement=True, nullable=False),
|
||||
sa.Column('phone', sa.String(length=20), nullable=True, comment='手机号'),
|
||||
sa.Column('email', sa.String(length=100), nullable=True, comment='邮箱'),
|
||||
sa.Column('password_hash', sa.String(length=255), nullable=False),
|
||||
sa.Column('nickname', sa.String(length=50), nullable=False),
|
||||
sa.Column('avatar_url', sa.String(length=500), nullable=False),
|
||||
sa.Column('gender', sa.SmallInteger(), nullable=False, comment='0未知 1男 2女'),
|
||||
sa.Column('bio', sa.String(length=200), nullable=False),
|
||||
sa.Column('status', sa.SmallInteger(), nullable=False, comment='1正常 2封禁 3已注销'),
|
||||
sa.Column('register_type', sa.SmallInteger(), nullable=False, comment='1手机 2邮箱'),
|
||||
sa.Column('invite_code', sa.String(length=10), nullable=False, comment='我的邀请码'),
|
||||
sa.Column('register_ip', sa.String(length=45), nullable=False),
|
||||
sa.Column('last_login_at', sa.DateTime(), nullable=True),
|
||||
sa.Column('last_login_ip', sa.String(length=45), nullable=False),
|
||||
sa.Column('deactivate_at', sa.DateTime(), nullable=True, comment='注销发起时间(7天冻结期)'),
|
||||
sa.Column('created_at', sa.DateTime(), server_default=sa.text('now()'), nullable=False),
|
||||
sa.Column('updated_at', sa.DateTime(), server_default=sa.text('now()'), nullable=False),
|
||||
sa.PrimaryKeyConstraint('id'),
|
||||
sa.UniqueConstraint('email'),
|
||||
sa.UniqueConstraint('invite_code'),
|
||||
sa.UniqueConstraint('phone')
|
||||
)
|
||||
op.create_index('idx_status_created', 'users', ['status', 'created_at'], unique=False)
|
||||
op.create_table('video_earnings',
|
||||
sa.Column('video_id', mysql.BIGINT(unsigned=True), nullable=False),
|
||||
sa.Column('author_id', mysql.BIGINT(unsigned=True), nullable=False),
|
||||
sa.Column('complete_views', sa.Integer(), nullable=False, comment='累计完整观看次数'),
|
||||
sa.Column('views_settled', sa.Integer(), nullable=False, comment='已结算的完整观看刻度'),
|
||||
sa.Column('likes_accrued', sa.Integer(), nullable=False, comment='累计点赞(取消会回退)'),
|
||||
sa.Column('likes_settled', sa.Integer(), nullable=False, comment='已结算的点赞刻度'),
|
||||
sa.Column('updated_at', sa.DateTime(), server_default=sa.text('now()'), nullable=False),
|
||||
sa.PrimaryKeyConstraint('video_id')
|
||||
)
|
||||
op.create_index('idx_author', 'video_earnings', ['author_id'], unique=False)
|
||||
op.create_table('video_tags',
|
||||
sa.Column('id', mysql.BIGINT(unsigned=True), autoincrement=True, nullable=False),
|
||||
sa.Column('video_id', mysql.BIGINT(unsigned=True), nullable=False),
|
||||
sa.Column('tag_id', mysql.INTEGER(unsigned=True), nullable=False),
|
||||
sa.PrimaryKeyConstraint('id')
|
||||
)
|
||||
op.create_index('idx_tag', 'video_tags', ['tag_id', 'video_id'], unique=False)
|
||||
op.create_index('uk_video_tag', 'video_tags', ['video_id', 'tag_id'], unique=True)
|
||||
op.create_table('videos',
|
||||
sa.Column('id', mysql.BIGINT(unsigned=True), autoincrement=True, nullable=False),
|
||||
sa.Column('user_id', mysql.BIGINT(unsigned=True), nullable=False, comment='作者'),
|
||||
sa.Column('category_id', sa.Integer(), nullable=False),
|
||||
sa.Column('title', sa.String(length=100), nullable=False),
|
||||
sa.Column('description', sa.String(length=500), nullable=False),
|
||||
sa.Column('cover_url', sa.String(length=500), nullable=False),
|
||||
sa.Column('video_url', sa.String(length=500), nullable=False, comment='m3u8地址'),
|
||||
sa.Column('duration', sa.Integer(), nullable=False, comment='秒'),
|
||||
sa.Column('file_size', sa.BigInteger(), nullable=False),
|
||||
sa.Column('width', sa.Integer(), nullable=False),
|
||||
sa.Column('height', sa.Integer(), nullable=False),
|
||||
sa.Column('status', sa.SmallInteger(), nullable=False, comment='0转码中 1待审核 2已发布 3拒绝 4下架 5转码失败/已删除'),
|
||||
sa.Column('reject_reason', sa.String(length=200), nullable=False),
|
||||
sa.Column('reviewer_id', mysql.BIGINT(unsigned=True), nullable=True),
|
||||
sa.Column('reviewed_at', sa.DateTime(), nullable=True),
|
||||
sa.Column('is_priority', sa.SmallInteger(), nullable=False),
|
||||
sa.Column('view_count', sa.BigInteger(), nullable=False),
|
||||
sa.Column('like_count', sa.Integer(), nullable=False),
|
||||
sa.Column('comment_count', sa.Integer(), nullable=False),
|
||||
sa.Column('favorite_count', sa.Integer(), nullable=False),
|
||||
sa.Column('published_at', sa.DateTime(), nullable=True),
|
||||
sa.Column('created_at', sa.DateTime(), server_default=sa.text('now()'), nullable=False),
|
||||
sa.Column('updated_at', sa.DateTime(), server_default=sa.text('now()'), nullable=False),
|
||||
sa.PrimaryKeyConstraint('id')
|
||||
)
|
||||
op.create_index('idx_category', 'videos', ['category_id', 'status'], unique=False)
|
||||
op.create_index('idx_feed', 'videos', ['status', 'published_at'], unique=False)
|
||||
op.create_index('idx_user_status', 'videos', ['user_id', 'status'], unique=False)
|
||||
op.create_table('watch_records',
|
||||
sa.Column('id', mysql.BIGINT(unsigned=True), autoincrement=True, nullable=False),
|
||||
sa.Column('subject_type', sa.SmallInteger(), nullable=False, comment='1用户 2游客'),
|
||||
sa.Column('subject_id', sa.String(length=64), nullable=False, comment='user_id或device_id'),
|
||||
sa.Column('video_id', mysql.BIGINT(unsigned=True), nullable=False),
|
||||
sa.Column('watch_date', sa.Date(), nullable=False),
|
||||
sa.Column('cost_type', sa.SmallInteger(), nullable=False, comment='0免费 1积分 2会员 3本人'),
|
||||
sa.Column('cost_points', sa.Integer(), nullable=False),
|
||||
sa.Column('watch_duration', sa.Integer(), nullable=False, comment='秒'),
|
||||
sa.Column('position', sa.Integer(), nullable=False, comment='最后播放进度(秒),续播用'),
|
||||
sa.Column('created_at', sa.DateTime(), server_default=sa.text('now()'), nullable=False),
|
||||
sa.PrimaryKeyConstraint('id')
|
||||
)
|
||||
op.create_index('idx_subject', 'watch_records', ['subject_type', 'subject_id', 'created_at'], unique=False)
|
||||
op.create_index('uk_dedup', 'watch_records', ['subject_type', 'subject_id', 'video_id', 'watch_date'], unique=True)
|
||||
op.create_table('withdrawals',
|
||||
sa.Column('id', mysql.BIGINT(unsigned=True), autoincrement=True, nullable=False),
|
||||
sa.Column('withdraw_no', sa.String(length=32), nullable=False),
|
||||
sa.Column('user_id', mysql.BIGINT(unsigned=True), nullable=False),
|
||||
sa.Column('assets', sa.Numeric(precision=12, scale=1), nullable=False),
|
||||
sa.Column('amount_fen', sa.Integer(), nullable=False, comment='折合人民币(分)'),
|
||||
sa.Column('channel', sa.SmallInteger(), nullable=False, comment='1支付宝 2微信 3USDT'),
|
||||
sa.Column('account', sa.String(length=200), nullable=False),
|
||||
sa.Column('status', sa.SmallInteger(), nullable=False, comment='0待审核 1已打款 2已拒绝'),
|
||||
sa.Column('reason', sa.String(length=200), nullable=False),
|
||||
sa.Column('admin_id', mysql.BIGINT(unsigned=True), nullable=True),
|
||||
sa.Column('created_at', sa.DateTime(), server_default=sa.text('now()'), nullable=False),
|
||||
sa.Column('processed_at', sa.DateTime(), nullable=True),
|
||||
sa.PrimaryKeyConstraint('id'),
|
||||
sa.UniqueConstraint('withdraw_no')
|
||||
)
|
||||
op.create_index('idx_status', 'withdrawals', ['status', 'created_at'], unique=False)
|
||||
op.create_index('idx_user', 'withdrawals', ['user_id', 'created_at'], unique=False)
|
||||
op.create_table('membership_orders',
|
||||
sa.Column('id', mysql.BIGINT(unsigned=True), autoincrement=True, nullable=False),
|
||||
sa.Column('order_no', sa.String(length=32), nullable=False),
|
||||
sa.Column('user_id', mysql.BIGINT(unsigned=True), nullable=False),
|
||||
sa.Column('plan_code', sa.String(length=20), nullable=False, comment='trial/month/year/lifetime'),
|
||||
sa.Column('points_cost', sa.Integer(), nullable=False, comment='赠送为 0'),
|
||||
sa.Column('duration_days', sa.Integer(), nullable=False, comment='0=终身'),
|
||||
sa.Column('start_at', sa.DateTime(), nullable=False),
|
||||
sa.Column('end_at', sa.DateTime(), nullable=True, comment='终身为 NULL'),
|
||||
sa.Column('source', sa.SmallInteger(), nullable=False, comment='1积分购买 2活动赠送'),
|
||||
sa.Column('created_at', sa.DateTime(), server_default=sa.text('now()'), nullable=False),
|
||||
sa.ForeignKeyConstraint(['user_id'], ['users.id'], ),
|
||||
sa.PrimaryKeyConstraint('id'),
|
||||
sa.UniqueConstraint('order_no')
|
||||
)
|
||||
op.create_index('idx_user', 'membership_orders', ['user_id', 'created_at'], unique=False)
|
||||
op.create_table('user_membership',
|
||||
sa.Column('user_id', mysql.BIGINT(unsigned=True), nullable=False),
|
||||
sa.Column('is_member', sa.SmallInteger(), nullable=False),
|
||||
sa.Column('current_plan', sa.String(length=20), nullable=False, comment='trial/month/year/lifetime'),
|
||||
sa.Column('is_lifetime', sa.SmallInteger(), nullable=False),
|
||||
sa.Column('expire_at', sa.DateTime(), nullable=True, comment='终身卡为 NULL'),
|
||||
sa.Column('updated_at', sa.DateTime(), server_default=sa.text('now()'), nullable=False),
|
||||
sa.ForeignKeyConstraint(['user_id'], ['users.id'], ),
|
||||
sa.PrimaryKeyConstraint('user_id')
|
||||
)
|
||||
op.create_table('user_wallets',
|
||||
sa.Column('user_id', mysql.BIGINT(unsigned=True), nullable=False),
|
||||
sa.Column('points', mysql.INTEGER(unsigned=True), nullable=False),
|
||||
sa.Column('total_recharge', mysql.INTEGER(unsigned=True), nullable=False),
|
||||
sa.Column('total_earned', mysql.INTEGER(unsigned=True), nullable=False),
|
||||
sa.Column('total_consumed', mysql.INTEGER(unsigned=True), nullable=False),
|
||||
sa.Column('version', sa.Integer(), nullable=False, comment='乐观锁'),
|
||||
sa.Column('updated_at', sa.DateTime(), server_default=sa.text('now()'), nullable=False),
|
||||
sa.ForeignKeyConstraint(['user_id'], ['users.id'], ),
|
||||
sa.PrimaryKeyConstraint('user_id')
|
||||
)
|
||||
# ### end Alembic commands ###
|
||||
|
||||
|
||||
def downgrade() -> None:
|
||||
# ### commands auto generated by Alembic - please adjust! ###
|
||||
op.drop_table('user_wallets')
|
||||
op.drop_table('user_membership')
|
||||
op.drop_index('idx_user', table_name='membership_orders')
|
||||
op.drop_table('membership_orders')
|
||||
op.drop_index('idx_user', table_name='withdrawals')
|
||||
op.drop_index('idx_status', table_name='withdrawals')
|
||||
op.drop_table('withdrawals')
|
||||
op.drop_index('uk_dedup', table_name='watch_records')
|
||||
op.drop_index('idx_subject', table_name='watch_records')
|
||||
op.drop_table('watch_records')
|
||||
op.drop_index('idx_user_status', table_name='videos')
|
||||
op.drop_index('idx_feed', table_name='videos')
|
||||
op.drop_index('idx_category', table_name='videos')
|
||||
op.drop_table('videos')
|
||||
op.drop_index('uk_video_tag', table_name='video_tags')
|
||||
op.drop_index('idx_tag', table_name='video_tags')
|
||||
op.drop_table('video_tags')
|
||||
op.drop_index('idx_author', table_name='video_earnings')
|
||||
op.drop_table('video_earnings')
|
||||
op.drop_index('idx_status_created', table_name='users')
|
||||
op.drop_table('users')
|
||||
op.drop_index('idx_pick', table_name='transcode_tasks')
|
||||
op.drop_table('transcode_tasks')
|
||||
op.drop_table('tags')
|
||||
op.drop_table('system_configs')
|
||||
op.drop_table('sensitive_words')
|
||||
op.drop_index('uk_user_target', table_name='reports')
|
||||
op.drop_index('idx_status', table_name='reports')
|
||||
op.drop_table('reports')
|
||||
op.drop_index('uk_invitee', table_name='referrals')
|
||||
op.drop_index('idx_status', table_name='referrals')
|
||||
op.drop_index('idx_inviter', table_name='referrals')
|
||||
op.drop_table('referrals')
|
||||
op.drop_table('recharge_packages')
|
||||
op.drop_index('idx_user_status', table_name='recharge_orders')
|
||||
op.drop_table('recharge_orders')
|
||||
op.drop_index('idx_user_created', table_name='point_transactions')
|
||||
op.drop_index('idx_biz', table_name='point_transactions')
|
||||
op.drop_table('point_transactions')
|
||||
op.drop_index('idx_user_read', table_name='notifications')
|
||||
op.drop_table('notifications')
|
||||
op.drop_index('uk_user_video', table_name='likes')
|
||||
op.drop_index('idx_video', table_name='likes')
|
||||
op.drop_table('likes')
|
||||
op.drop_index('uk_user_video', table_name='favorites')
|
||||
op.drop_index('idx_video', table_name='favorites')
|
||||
op.drop_table('favorites')
|
||||
op.drop_index('idx_video', table_name='comments')
|
||||
op.drop_index('idx_user_video', table_name='comments')
|
||||
op.drop_table('comments')
|
||||
op.drop_table('categories')
|
||||
op.drop_table('asset_wallets')
|
||||
op.drop_index('idx_user_created', table_name='asset_transactions')
|
||||
op.drop_index('idx_biz', table_name='asset_transactions')
|
||||
op.drop_table('asset_transactions')
|
||||
op.drop_table('admin_users')
|
||||
op.drop_index('idx_admin_created', table_name='admin_logs')
|
||||
op.drop_table('admin_logs')
|
||||
# ### end Alembic commands ###
|
||||
Reference in New Issue
Block a user