"""rebuild users, permissions, role_permissions tables Revision ID: a1b2c3d4e5f6 Revises: 3e108afa9bba Create Date: 2026-04-05 """ from typing import Sequence, Union from alembic import op import sqlalchemy as sa from sqlalchemy.dialects import postgresql revision: str = 'a1b2c3d4e5f6' down_revision: Union[str, None] = '3e108afa9bba' branch_labels: Union[str, Sequence[str], None] = None depends_on: Union[str, Sequence[str], None] = None def upgrade() -> None: conn = op.get_bind() insp = sa.inspect(conn) existing = insp.get_table_names() # 创建 permissions 表(如不存在) if 'permissions' not in existing: op.create_table( 'permissions', sa.Column('id', sa.BigInteger(), autoincrement=True, nullable=False), sa.Column('name', sa.String(length=100), nullable=False), sa.Column('code', sa.String(length=50), nullable=False), sa.Column('module', sa.String(length=50), nullable=True), sa.Column('description', sa.Text(), nullable=True), sa.PrimaryKeyConstraint('id'), sa.UniqueConstraint('code'), ) # 创建 users 表(如不存在) if 'users' not in existing: op.create_table( 'users', sa.Column('id', sa.BigInteger(), autoincrement=True, nullable=False), sa.Column('casdoor_id', sa.String(length=100), nullable=False), sa.Column('username', sa.String(length=100), nullable=False), sa.Column('email', sa.String(length=255), nullable=True), sa.Column('role', sa.String(length=50), nullable=True, server_default='user'), sa.Column('assigned_area', sa.String(length=100), nullable=True), sa.Column('assigned_school', sa.String(length=200), nullable=True), sa.Column('is_active', sa.Boolean(), nullable=True, server_default='true'), sa.Column('last_login', postgresql.TIMESTAMP(), nullable=True), sa.Column('created_at', postgresql.TIMESTAMP(), server_default=sa.text('now()'), nullable=True), sa.PrimaryKeyConstraint('id'), sa.UniqueConstraint('casdoor_id'), ) op.create_index('ix_users_id', 'users', ['id'], unique=False) # 创建 role_permissions 关联表(如不存在) if 'role_permissions' not in existing: op.create_table( 'role_permissions', sa.Column('role', sa.String(length=50), nullable=False), sa.Column('permission_id', sa.BigInteger(), nullable=False), sa.ForeignKeyConstraint(['permission_id'], ['permissions.id']), sa.PrimaryKeyConstraint('role', 'permission_id'), ) # 插入默认权限数据(跳过已存在的) permissions_table = sa.table( 'permissions', sa.column('name', sa.String), sa.column('code', sa.String), sa.column('module', sa.String), sa.column('description', sa.Text), ) op.bulk_insert(permissions_table, [ {'name': '查看设备', 'code': 'device.view', 'module': 'device', 'description': '查看设备列表和详情'}, {'name': '触发检查', 'code': 'device.check', 'module': 'device', 'description': '手动触发设备状态检查'}, {'name': '导入设备', 'code': 'device.import', 'module': 'device', 'description': '通过Excel导入设备数据'}, {'name': '编辑设备', 'code': 'device.edit', 'module': 'device', 'description': '编辑设备信息'}, {'name': '删除设备', 'code': 'device.delete', 'module': 'device', 'description': '删除设备记录'}, {'name': '查看OLT', 'code': 'olt.view', 'module': 'olt', 'description': '查看OLT设备列表'}, {'name': '管理OLT', 'code': 'olt.manage', 'module': 'olt', 'description': '添加、编辑、删除OLT设备'}, {'name': '查看用户', 'code': 'user.view', 'module': 'user', 'description': '查看用户列表'}, {'name': '管理用户', 'code': 'user.manage', 'module': 'user', 'description': '修改用户角色和权限'}, {'name': '系统管理', 'code': 'system.admin', 'module': 'system', 'description': '系统级管理操作'}, ]) # 插入默认角色权限 op.execute(""" INSERT INTO role_permissions (role, permission_id) SELECT 'area_admin', id FROM permissions WHERE code IN ('device.view', 'device.check', 'olt.view') """) op.execute(""" INSERT INTO role_permissions (role, permission_id) SELECT 'school_admin', id FROM permissions WHERE code IN ('device.view') """) op.execute(""" INSERT INTO role_permissions (role, permission_id) SELECT 'user', id FROM permissions WHERE code IN ('device.view') """) def downgrade() -> None: op.drop_table('role_permissions') op.drop_index('ix_users_id', table_name='users') op.drop_table('users') op.drop_table('permissions')