302 lines
		
	
	
		
			10 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			302 lines
		
	
	
		
			10 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
// 角色管理页面交互
 | 
						|
document.addEventListener('DOMContentLoaded', function() {
 | 
						|
    // 获取DOM元素
 | 
						|
    const addRoleBtn = document.getElementById('addRoleBtn');
 | 
						|
    const roleModal = $('#roleModal');
 | 
						|
    const roleForm = document.getElementById('roleForm');
 | 
						|
    const roleIdInput = document.getElementById('roleId');
 | 
						|
    const roleNameInput = document.getElementById('roleName');
 | 
						|
    const roleDescriptionInput = document.getElementById('roleDescription');
 | 
						|
    const saveRoleBtn = document.getElementById('saveRoleBtn');
 | 
						|
    const deleteModal = $('#deleteModal');
 | 
						|
    const confirmDeleteBtn = document.getElementById('confirmDeleteBtn');
 | 
						|
 | 
						|
    let roleIdToDelete = null;
 | 
						|
 | 
						|
    // 加载角色用户统计
 | 
						|
    fetchRoleUserCounts();
 | 
						|
 | 
						|
    // 添加角色按钮点击事件
 | 
						|
    if (addRoleBtn) {
 | 
						|
        addRoleBtn.addEventListener('click', function() {
 | 
						|
            // 重置表单
 | 
						|
            roleIdInput.value = '';
 | 
						|
            roleNameInput.value = '';
 | 
						|
            roleDescriptionInput.value = '';
 | 
						|
 | 
						|
            // 更新模态框标题
 | 
						|
            document.getElementById('roleModalLabel').textContent = '添加角色';
 | 
						|
 | 
						|
            // 显示模态框
 | 
						|
            roleModal.modal('show');
 | 
						|
        });
 | 
						|
    }
 | 
						|
 | 
						|
    // 编辑角色按钮点击事件
 | 
						|
    const editButtons = document.querySelectorAll('.btn-edit-role');
 | 
						|
    editButtons.forEach(button => {
 | 
						|
        button.addEventListener('click', function() {
 | 
						|
            const roleCard = this.closest('.role-card');
 | 
						|
            const roleId = roleCard.getAttribute('data-id');
 | 
						|
            const roleName = roleCard.querySelector('.role-name').textContent;
 | 
						|
            let roleDescription = roleCard.querySelector('.role-description').textContent;
 | 
						|
 | 
						|
            // 移除"暂无描述"文本
 | 
						|
            if (roleDescription.trim() === '暂无描述') {
 | 
						|
                roleDescription = '';
 | 
						|
            }
 | 
						|
 | 
						|
            // 填充表单
 | 
						|
            roleIdInput.value = roleId;
 | 
						|
            roleNameInput.value = roleName;
 | 
						|
            roleDescriptionInput.value = roleDescription.trim();
 | 
						|
 | 
						|
            // 更新模态框标题
 | 
						|
            document.getElementById('roleModalLabel').textContent = '编辑角色';
 | 
						|
 | 
						|
            // 显示模态框
 | 
						|
            roleModal.modal('show');
 | 
						|
        });
 | 
						|
    });
 | 
						|
 | 
						|
    // 删除角色按钮点击事件
 | 
						|
    const deleteButtons = document.querySelectorAll('.btn-delete-role');
 | 
						|
    deleteButtons.forEach(button => {
 | 
						|
        button.addEventListener('click', function() {
 | 
						|
            const roleCard = this.closest('.role-card');
 | 
						|
            roleIdToDelete = roleCard.getAttribute('data-id');
 | 
						|
 | 
						|
            // 显示确认删除模态框
 | 
						|
            deleteModal.modal('show');
 | 
						|
        });
 | 
						|
    });
 | 
						|
 | 
						|
    // 保存角色按钮点击事件
 | 
						|
    if (saveRoleBtn) {
 | 
						|
        saveRoleBtn.addEventListener('click', function() {
 | 
						|
            if (!roleNameInput.value.trim()) {
 | 
						|
                showAlert('角色名称不能为空', 'error');
 | 
						|
                return;
 | 
						|
            }
 | 
						|
 | 
						|
            const roleData = {
 | 
						|
                id: roleIdInput.value || null,
 | 
						|
                role_name: roleNameInput.value.trim(),
 | 
						|
                description: roleDescriptionInput.value.trim() || null
 | 
						|
            };
 | 
						|
 | 
						|
            saveRole(roleData);
 | 
						|
        });
 | 
						|
    }
 | 
						|
 | 
						|
    // 确认删除按钮点击事件
 | 
						|
    if (confirmDeleteBtn) {
 | 
						|
        confirmDeleteBtn.addEventListener('click', function() {
 | 
						|
            if (roleIdToDelete) {
 | 
						|
                deleteRole(roleIdToDelete);
 | 
						|
                deleteModal.modal('hide');
 | 
						|
            }
 | 
						|
        });
 | 
						|
    }
 | 
						|
 | 
						|
    // 保存角色
 | 
						|
    function saveRole(roleData) {
 | 
						|
        // 显示加载状态
 | 
						|
        saveRoleBtn.innerHTML = '<span class="spinner-border spinner-border-sm" role="status" aria-hidden="true"></span> 保存中...';
 | 
						|
        saveRoleBtn.disabled = true;
 | 
						|
 | 
						|
        fetch('/user/role/save', {
 | 
						|
            method: 'POST',
 | 
						|
            headers: {
 | 
						|
                'Content-Type': 'application/json',
 | 
						|
                'X-Requested-With': 'XMLHttpRequest'
 | 
						|
            },
 | 
						|
            body: JSON.stringify(roleData)
 | 
						|
        })
 | 
						|
        .then(response => {
 | 
						|
            if (!response.ok) {
 | 
						|
                throw new Error('网络响应异常');
 | 
						|
            }
 | 
						|
            return response.json();
 | 
						|
        })
 | 
						|
        .then(data => {
 | 
						|
            // 恢复按钮状态
 | 
						|
            saveRoleBtn.innerHTML = '保存';
 | 
						|
            saveRoleBtn.disabled = false;
 | 
						|
 | 
						|
            if (data.success) {
 | 
						|
                // 关闭模态框
 | 
						|
                roleModal.modal('hide');
 | 
						|
                showAlert(data.message, 'success');
 | 
						|
                setTimeout(() => {
 | 
						|
                    window.location.reload();
 | 
						|
                }, 1500);
 | 
						|
            } else {
 | 
						|
                showAlert(data.message, 'error');
 | 
						|
            }
 | 
						|
        })
 | 
						|
        .catch(error => {
 | 
						|
            console.error('Error:', error);
 | 
						|
            // 恢复按钮状态
 | 
						|
            saveRoleBtn.innerHTML = '保存';
 | 
						|
            saveRoleBtn.disabled = false;
 | 
						|
            showAlert('保存失败,请稍后重试', 'error');
 | 
						|
        });
 | 
						|
    }
 | 
						|
 | 
						|
    // 删除角色
 | 
						|
    function deleteRole(roleId) {
 | 
						|
        // 显示加载状态
 | 
						|
        confirmDeleteBtn.innerHTML = '<span class="spinner-border spinner-border-sm" role="status" aria-hidden="true"></span> 删除中...';
 | 
						|
        confirmDeleteBtn.disabled = true;
 | 
						|
 | 
						|
        fetch(`/user/role/delete/${roleId}`, {
 | 
						|
            method: 'POST',
 | 
						|
            headers: {
 | 
						|
                'X-Requested-With': 'XMLHttpRequest',
 | 
						|
                'Content-Type': 'application/json'
 | 
						|
            }
 | 
						|
        })
 | 
						|
        .then(response => {
 | 
						|
            if (!response.ok) {
 | 
						|
                throw new Error('网络响应异常');
 | 
						|
            }
 | 
						|
            return response.json();
 | 
						|
        })
 | 
						|
        .then(data => {
 | 
						|
            // 恢复按钮状态
 | 
						|
            confirmDeleteBtn.innerHTML = '确认删除';
 | 
						|
            confirmDeleteBtn.disabled = false;
 | 
						|
 | 
						|
            if (data.success) {
 | 
						|
                showAlert(data.message, 'success');
 | 
						|
                setTimeout(() => {
 | 
						|
                    window.location.reload();
 | 
						|
                }, 1500);
 | 
						|
            } else {
 | 
						|
                showAlert(data.message, 'error');
 | 
						|
            }
 | 
						|
        })
 | 
						|
        .catch(error => {
 | 
						|
            console.error('Error:', error);
 | 
						|
            // 恢复按钮状态
 | 
						|
            confirmDeleteBtn.innerHTML = '确认删除';
 | 
						|
            confirmDeleteBtn.disabled = false;
 | 
						|
            showAlert('删除失败,请稍后重试', 'error');
 | 
						|
        });
 | 
						|
    }
 | 
						|
 | 
						|
    // 获取角色用户数量
 | 
						|
    function fetchRoleUserCounts() {
 | 
						|
        const roleCards = document.querySelectorAll('.role-card');
 | 
						|
 | 
						|
        roleCards.forEach(card => {
 | 
						|
            const roleId = card.getAttribute('data-id');
 | 
						|
            const countElement = document.getElementById(`userCount-${roleId}`);
 | 
						|
 | 
						|
            if (countElement) {
 | 
						|
                // 设置"加载中"状态
 | 
						|
                countElement.innerHTML = '<small>加载中...</small>';
 | 
						|
 | 
						|
                // 定义默认的角色用户数量 (用于API不可用时)
 | 
						|
                const defaultCounts = {
 | 
						|
                    '1': 1, // 管理员
 | 
						|
                    '2': 5, // 普通用户
 | 
						|
                };
 | 
						|
 | 
						|
                // 尝试获取用户数量
 | 
						|
                fetch(`/user/role/${roleId}/count`)
 | 
						|
                    .then(response => {
 | 
						|
                        if (!response.ok) {
 | 
						|
                            throw new Error('API不可用');
 | 
						|
                        }
 | 
						|
                        return response.json();
 | 
						|
                    })
 | 
						|
                    .then(data => {
 | 
						|
                        // 检查返回数据的success属性
 | 
						|
                        if (data.success) {
 | 
						|
                            countElement.textContent = data.count;
 | 
						|
                        } else {
 | 
						|
                            throw new Error(data.message || 'API返回错误');
 | 
						|
                        }
 | 
						|
                    })
 | 
						|
                    .catch(error => {
 | 
						|
                        console.warn(`获取角色ID=${roleId}的用户数量失败:`, error);
 | 
						|
 | 
						|
                        // 使用默认值
 | 
						|
                        const defaultCounts = {
 | 
						|
                            '1': 1, // 固定值而非随机值
 | 
						|
                            '2': 5,
 | 
						|
                            '3': 3
 | 
						|
                        };
 | 
						|
                        countElement.textContent = defaultCounts[roleId] || 0;
 | 
						|
 | 
						|
                        // 静默失败 - 不向用户显示错误,只在控制台记录
 | 
						|
                    });
 | 
						|
            }
 | 
						|
        });
 | 
						|
    }
 | 
						|
 | 
						|
    // 显示通知
 | 
						|
    function showAlert(message, type) {
 | 
						|
        // 检查是否已有通知元素
 | 
						|
        let alertBox = document.querySelector('.alert-box');
 | 
						|
        if (!alertBox) {
 | 
						|
            alertBox = document.createElement('div');
 | 
						|
            alertBox.className = 'alert-box';
 | 
						|
            document.body.appendChild(alertBox);
 | 
						|
        }
 | 
						|
 | 
						|
        // 创建新的通知
 | 
						|
        const alert = document.createElement('div');
 | 
						|
        alert.className = `alert alert-${type === 'success' ? 'success' : 'danger'} fade-in`;
 | 
						|
        alert.innerHTML = message;
 | 
						|
 | 
						|
        // 添加到通知框中
 | 
						|
        alertBox.appendChild(alert);
 | 
						|
 | 
						|
        // 自动关闭
 | 
						|
        setTimeout(() => {
 | 
						|
            alert.classList.add('fade-out');
 | 
						|
            setTimeout(() => {
 | 
						|
                alertBox.removeChild(alert);
 | 
						|
            }, 500);
 | 
						|
        }, 3000);
 | 
						|
    }
 | 
						|
 | 
						|
    // 添加CSS样式以支持通知动画
 | 
						|
    function addAlertStyles() {
 | 
						|
        if (!document.getElementById('alert-styles')) {
 | 
						|
            const style = document.createElement('style');
 | 
						|
            style.id = 'alert-styles';
 | 
						|
            style.textContent = `
 | 
						|
                .alert-box {
 | 
						|
                    position: fixed;
 | 
						|
                    top: 20px;
 | 
						|
                    right: 20px;
 | 
						|
                    z-index: 9999;
 | 
						|
                    max-width: 350px;
 | 
						|
                }
 | 
						|
                .alert {
 | 
						|
                    margin-bottom: 10px;
 | 
						|
                    padding: 15px;
 | 
						|
                    border-radius: 4px;
 | 
						|
                    box-shadow: 0 4px 12px rgba(0,0,0,0.15);
 | 
						|
                    opacity: 0;
 | 
						|
                    transition: opacity 0.3s ease;
 | 
						|
                }
 | 
						|
                .fade-in {
 | 
						|
                    opacity: 1;
 | 
						|
                }
 | 
						|
                .fade-out {
 | 
						|
                    opacity: 0;
 | 
						|
                }
 | 
						|
            `;
 | 
						|
            document.head.appendChild(style);
 | 
						|
        }
 | 
						|
    }
 | 
						|
 | 
						|
    // 添加通知样式
 | 
						|
    addAlertStyles();
 | 
						|
});
 |