增加用户访问数据总表

This commit is contained in:
super
2026-03-22 21:27:41 +08:00
parent 12318f8770
commit 7ffe5279a3
3 changed files with 46 additions and 1 deletions

View File

@@ -13,6 +13,24 @@ from werkzeug.security import generate_password_hash
from utils.db import get_db from utils.db import get_db
from utils.auth import admin_required, get_current_admin_role from utils.auth import admin_required, get_current_admin_role
ALLOWED_DEDUPE_TOTAL_DATA_ADMIN_USERNAMES = {'刘丽泓'}
def _can_access_dedupe_total_data(role, current_row):
if role == 'super_admin':
return True
if role != 'admin' or not current_row:
return False
return (current_row.get('username') or '').strip() in ALLOWED_DEDUPE_TOTAL_DATA_ADMIN_USERNAMES
def _ensure_dedupe_total_data_access():
role, current_row = get_current_admin_role()
if not _can_access_dedupe_total_data(role, current_row):
return None, None, (jsonify({'success': False, 'error': '无权限访问数据去重总数据'}), 403)
return role, current_row, None
from ali_oss import upload_file as oss_upload_file from ali_oss import upload_file as oss_upload_file
try: try:
@@ -138,6 +156,7 @@ def list_users():
'page': page, 'page': page,
'page_size': page_size, 'page_size': page_size,
'current_user_role': role, 'current_user_role': role,
'current_user_username': current_row.get('username') or '',
'admins': admins, 'admins': admins,
}) })
except Exception as e: except Exception as e:
@@ -603,6 +622,9 @@ def upload_version():
@admin_api.route('/dedupe-total-data') @admin_api.route('/dedupe-total-data')
@admin_required @admin_required
def list_dedupe_total_data(): def list_dedupe_total_data():
_, _, denied = _ensure_dedupe_total_data_access()
if denied:
return denied
page = max(1, int(request.args.get('page', 1))) page = max(1, int(request.args.get('page', 1)))
page_size = min(100, max(1, int(request.args.get('page_size', 15)))) page_size = min(100, max(1, int(request.args.get('page_size', 15))))
keyword = (request.args.get('keyword') or '').strip() keyword = (request.args.get('keyword') or '').strip()
@@ -634,6 +656,9 @@ def list_dedupe_total_data():
@admin_api.route('/dedupe-total-data/import/<import_id>') @admin_api.route('/dedupe-total-data/import/<import_id>')
@admin_required @admin_required
def dedupe_total_data_import_progress(import_id): def dedupe_total_data_import_progress(import_id):
_, _, denied = _ensure_dedupe_total_data_access()
if denied:
return denied
result, error_response, status = _proxy_backend_java( result, error_response, status = _proxy_backend_java(
'GET', 'GET',
f'/api/admin/dedupe-total-data/import/{import_id}', f'/api/admin/dedupe-total-data/import/{import_id}',
@@ -658,6 +683,9 @@ def dedupe_total_data_import_progress(import_id):
@admin_api.route('/dedupe-total-data/import', methods=['POST']) @admin_api.route('/dedupe-total-data/import', methods=['POST'])
@admin_required @admin_required
def import_dedupe_total_data(): def import_dedupe_total_data():
_, _, denied = _ensure_dedupe_total_data_access()
if denied:
return denied
file_storage = request.files.get('file') file_storage = request.files.get('file')
if not file_storage or file_storage.filename == '': if not file_storage or file_storage.filename == '':
return jsonify({'success': False, 'error': '请选择 Excel 文件'}) return jsonify({'success': False, 'error': '请选择 Excel 文件'})
@@ -682,6 +710,9 @@ def import_dedupe_total_data():
@admin_api.route('/dedupe-total-data/delete-import/<import_id>') @admin_api.route('/dedupe-total-data/delete-import/<import_id>')
@admin_required @admin_required
def dedupe_total_data_delete_import_progress(import_id): def dedupe_total_data_delete_import_progress(import_id):
_, _, denied = _ensure_dedupe_total_data_access()
if denied:
return denied
result, error_response, status = _proxy_backend_java( result, error_response, status = _proxy_backend_java(
'GET', 'GET',
f'/api/admin/dedupe-total-data/delete-import/{import_id}', f'/api/admin/dedupe-total-data/delete-import/{import_id}',
@@ -706,6 +737,9 @@ def dedupe_total_data_delete_import_progress(import_id):
@admin_api.route('/dedupe-total-data/delete-import', methods=['POST']) @admin_api.route('/dedupe-total-data/delete-import', methods=['POST'])
@admin_required @admin_required
def delete_import_dedupe_total_data(): def delete_import_dedupe_total_data():
_, _, denied = _ensure_dedupe_total_data_access()
if denied:
return denied
file_storage = request.files.get('file') file_storage = request.files.get('file')
if not file_storage or file_storage.filename == '': if not file_storage or file_storage.filename == '':
return jsonify({'success': False, 'error': '请选择 Excel 文件'}) return jsonify({'success': False, 'error': '请选择 Excel 文件'})
@@ -730,6 +764,9 @@ def delete_import_dedupe_total_data():
@admin_api.route('/dedupe-total-data', methods=['POST']) @admin_api.route('/dedupe-total-data', methods=['POST'])
@admin_required @admin_required
def create_dedupe_total_data(): def create_dedupe_total_data():
_, _, denied = _ensure_dedupe_total_data_access()
if denied:
return denied
data = request.get_json() or {} data = request.get_json() or {}
payload = {'dataValue': (data.get('data_value') or '').strip()} payload = {'dataValue': (data.get('data_value') or '').strip()}
result, error_response, status = _proxy_backend_java( result, error_response, status = _proxy_backend_java(
@@ -754,6 +791,9 @@ def create_dedupe_total_data():
@admin_api.route('/dedupe-total-data/<int:item_id>', methods=['PUT']) @admin_api.route('/dedupe-total-data/<int:item_id>', methods=['PUT'])
@admin_required @admin_required
def update_dedupe_total_data(item_id): def update_dedupe_total_data(item_id):
_, _, denied = _ensure_dedupe_total_data_access()
if denied:
return denied
data = request.get_json() or {} data = request.get_json() or {}
payload = {'dataValue': (data.get('data_value') or '').strip()} payload = {'dataValue': (data.get('data_value') or '').strip()}
result, error_response, status = _proxy_backend_java( result, error_response, status = _proxy_backend_java(
@@ -778,6 +818,9 @@ def update_dedupe_total_data(item_id):
@admin_api.route('/dedupe-total-data/<int:item_id>', methods=['DELETE']) @admin_api.route('/dedupe-total-data/<int:item_id>', methods=['DELETE'])
@admin_required @admin_required
def delete_dedupe_total_data(item_id): def delete_dedupe_total_data(item_id):
_, _, denied = _ensure_dedupe_total_data_access()
if denied:
return denied
result, error_response, status = _proxy_backend_java( result, error_response, status = _proxy_backend_java(
'DELETE', 'DELETE',
f'/api/admin/dedupe-total-data/{item_id}', f'/api/admin/dedupe-total-data/{item_id}',

View File

@@ -444,6 +444,7 @@
// ========== 用户管理 ========== // ========== 用户管理 ==========
var userPage = 1, userPageSize = 15; var userPage = 1, userPageSize = 15;
var currentUserRole = 'admin'; var currentUserRole = 'admin';
var currentUserUsername = '';
var adminsList = []; var adminsList = [];
function roleLabel(role) { function roleLabel(role) {
if (role === 'super_admin') return '超级管理员'; if (role === 'super_admin') return '超级管理员';
@@ -469,6 +470,7 @@
return; return;
} }
currentUserRole = res.current_user_role || 'admin'; currentUserRole = res.current_user_role || 'admin';
currentUserUsername = (res.current_user_username || '').trim();
adminsList = res.admins || []; adminsList = res.admins || [];
var items = res.items || []; var items = res.items || [];
if (items.length === 0) { if (items.length === 0) {
@@ -514,7 +516,7 @@
function updateDedupeTotalDataAccess() { function updateDedupeTotalDataAccess() {
var tab = document.querySelector('.tab[data-tab="dedupe-total-data"]'); var tab = document.querySelector('.tab[data-tab="dedupe-total-data"]');
var panel = document.getElementById('panel-dedupe-total-data'); var panel = document.getElementById('panel-dedupe-total-data');
var canUse = currentUserRole === 'admin' || currentUserRole === 'super_admin'; var canUse = currentUserRole === 'super_admin' || (currentUserRole === 'admin' && currentUserUsername === '刘丽泓');
if (tab) tab.style.display = canUse ? '' : 'none'; if (tab) tab.style.display = canUse ? '' : 'none';
if (panel) panel.style.display = canUse ? '' : 'none'; if (panel) panel.style.display = canUse ? '' : 'none';
if (!canUse && tab && tab.classList.contains('active')) { if (!canUse && tab && tab.classList.contains('active')) {