import React, { useState, useEffect, useRef } from 'react'; import axios from '../../services/axios'; import { toast } from 'react-toastify'; // 添加全局样式 const globalStyles = { modalOpen: { overflow: 'hidden', }, cursorPointer: { cursor: 'pointer', }, pageContainer: { padding: '20px', backgroundColor: '#f8f9fa', minHeight: 'calc(100vh - 56px)', }, }; const CategoryPermissionManagement = () => { const [users, setUsers] = useState([]); const [categories, setCategories] = useState([]); const [permissions, setPermissions] = useState([]); const [loading, setLoading] = useState(true); const [selectedUser, setSelectedUser] = useState(null); const [selectedCategories, setSelectedCategories] = useState([]); const [inheritToChildren, setInheritToChildren] = useState(true); const [showPermissionModal, setShowPermissionModal] = useState(false); const [searchQuery, setSearchQuery] = useState(''); const [searchResults, setSearchResults] = useState([]); const [isSearching, setIsSearching] = useState(false); const searchTimeoutRef = useRef(null); // 获取用户列表 const fetchUsers = async (search = '') => { try { const params = {}; if (search) { params.search = search; } const res = await axios.get('/api/admin/users', { params }); if (search) { setSearchResults(res.data.users); } else { setUsers(res.data.users); } } catch (err) { toast.error('获取用户列表失败'); console.error(err); } }; // 获取分类列表 const fetchCategories = async () => { try { const res = await axios.get('/api/admin/categories'); // 检查返回的数据结构 console.log('API返回的分类数据:', res.data); // 确保categories是一个数组 let categoriesData = []; if (res.data && res.data.categories) { // 如果API返回的是 {categories: [...]} 格式 categoriesData = res.data.categories || []; } else if (Array.isArray(res.data)) { // 如果API直接返回数组 categoriesData = res.data; } else { console.error('API返回的分类数据格式不正确:', res.data); categoriesData = []; } // 确保每个分类对象都有id和name属性 const formattedCategories = categoriesData.map(cat => { return { ...cat, id: cat.id || cat._id || cat.category_id || '', name: cat.name || cat.category_name || '未命名分类', children: cat.children || [] }; }); setCategories(formattedCategories); } catch (err) { toast.error('获取分类列表失败'); console.error(err); setCategories([]); } }; // 获取权限列表 const fetchPermissions = async (userId = null) => { try { setLoading(true); const params = {}; if (userId) { params.user_id = userId; } const res = await axios.get('/api/admin/category-permissions', { params }); setPermissions(res.data.permissions); } catch (err) { toast.error('获取权限列表失败'); console.error(err); } finally { setLoading(false); } }; useEffect(() => { fetchUsers(); fetchCategories(); fetchPermissions(); return () => { if (searchTimeoutRef.current) { clearTimeout(searchTimeoutRef.current); } }; }, []); // 处理搜索输入变化 const handleSearchChange = (e) => { const query = e.target.value; setSearchQuery(query); // 清除之前的定时器 if (searchTimeoutRef.current) { clearTimeout(searchTimeoutRef.current); } if (query.trim()) { searchTimeoutRef.current = setTimeout(() => { setIsSearching(true); fetchUsers(query); }, 300); } else { setIsSearching(false); setSearchResults([]); } }; // 清除搜索 const clearSearch = () => { setSearchQuery(''); setIsSearching(false); setSearchResults([]); }; // 选择用户时获取该用户的权限 const handleUserSelect = (userId) => { setSelectedUser(userId); fetchPermissions(userId); }; // 打开权限分配模态框 const handleOpenPermissionModal = (userId) => { setSelectedUser(userId); setSelectedCategories([]); setInheritToChildren(true); setShowPermissionModal(true); }; // 处理分类选择 const handleCategorySelect = (categoryId) => { if (selectedCategories.includes(categoryId)) { setSelectedCategories(selectedCategories.filter(id => id !== categoryId)); } else { setSelectedCategories([...selectedCategories, categoryId]); } }; // 批量分配权限 const handleBatchAssignPermissions = async () => { if (!selectedUser || selectedCategories.length === 0) { toast.error('请选择用户和至少一个分类'); return; } try { const res = await axios.post(`/api/admin/users/${selectedUser}/category-permissions/batch`, { category_ids: selectedCategories, inherit_to_children: inheritToChildren }); toast.success(res.data.message); setShowPermissionModal(false); fetchPermissions(selectedUser); } catch (err) { toast.error('分配权限失败: ' + (err.response?.data?.message || err.message)); console.error(err); } }; // 删除权限 const handleDeletePermission = async (permissionId) => { if (!window.confirm('确定要删除此权限吗?')) { return; } try { await axios.delete(`/api/admin/category-permissions/${permissionId}`); toast.success('权限删除成功'); fetchPermissions(selectedUser); } catch (err) { toast.error('删除权限失败'); console.error(err); } }; // 更新权限继承设置 const handleUpdatePermission = async (permissionId, inheritToChildren) => { try { await axios.put(`/api/admin/category-permissions/${permissionId}`, { inherit_to_children: inheritToChildren }); toast.success('权限更新成功'); fetchPermissions(selectedUser); } catch (err) { toast.error('更新权限失败'); console.error(err); } }; // 递归渲染分类树 const renderCategoryTree = (categories, level = 0) => { return categories.map(category => (
| 用户 | 分类 | 继承子分类 | 操作 |
|---|---|---|---|
| {getUserName(permission.user_id)} | {getCategoryName(permission.category_id)} |
handleUpdatePermission(permission.id, !permission.inherit_to_children)}
/>
|