43 lines
2.2 KiB
Python
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 ''
|