dy-dashboard/services/permission_model.py
2026-10-28 11:14:17 +08:00

43 lines
2.2 KiB
Python

"""权限模型公共能力:岗位权限表初始化与历史配置迁移。"""
from services.db import query
_POSITION_PERMISSION_READY = False
SYSTEM_ROLES = ('super_admin', 'admin', 'viewer', '查看者')
def ensure_position_permissions():
"""幂等创建岗位权限表,并复制历史上误存为角色的岗位权限。"""
global _POSITION_PERMISSION_READY
if _POSITION_PERMISSION_READY:
return
query("""CREATE TABLE IF NOT EXISTS position_operation_permissions (
id BIGINT AUTO_INCREMENT PRIMARY KEY,
position_code VARCHAR(80) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL,
page VARCHAR(100) NOT NULL,
operation VARCHAR(100) NOT NULL,
permission TINYINT NOT NULL DEFAULT 0,
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
UNIQUE KEY uq_position_page_operation (position_code, page, operation),
KEY idx_position_permission_code (position_code)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci""")
# 旧版把采购计划、采购跟单、产品开发、运营专员等岗位当成 role 保存。
# INSERT IGNORE 只做首次迁移,之后管理员修改岗位权限不会被历史数据覆盖。
query("""INSERT IGNORE INTO position_operation_permissions
(position_code,page,operation,permission)
SELECT p.position_code,r.page,r.operation,r.permission
FROM role_operation_permissions r
INNER JOIN user_positions p ON BINARY p.position_code=BINARY r.role
WHERE r.role NOT IN ('super_admin','admin','viewer','查看者')""")
query("""INSERT IGNORE INTO position_operation_permissions
(position_code,page,operation,permission)
SELECT p.position_code,r.page,'view',r.permission
FROM role_permissions r
INNER JOIN user_positions p ON BINARY p.position_code=BINARY r.role
WHERE r.role NOT IN ('super_admin','admin','viewer','查看者')""")
_POSITION_PERMISSION_READY = True
def user_position_code(user_id):
rows = query("SELECT position FROM dashboard_users WHERE id=%s LIMIT 1", (user_id,))
return str(rows[0].get('position') or '').strip() if rows else ''