import React, { useState, useEffect } from 'react'; import { useNavigate } from 'react-router-dom'; import { useAuth } from '../contexts/AuthContext'; import { commonApi, http } from '../api'; import { motion, AnimatePresence } from 'framer-motion'; import { Users, ArrowLeft, Plus, X, User, Phone, Shield, Trash2, AlertCircle, Edit2, Building2, BookOpen, MessageSquare, Info } from 'lucide-react'; import { useResponsive } from '../hooks/useResponsive'; import { encryptPhone, maskPhone } from '../utils/crypto'; import { UserManual } from '../components/UserManual'; import { FeedbackModal } from '../components/FeedbackModal'; import { AboutModal } from '../components/VersionUpdate'; interface Member { id: string; username: string; phone: string | null; created_at: string; } export function MemberManage() { const navigate = useNavigate(); const { auth } = useAuth(); const { isMobile } = useResponsive(); const [members, setMembers] = useState([]); const [loading, setLoading] = useState(true); const [showModal, setShowModal] = useState(false); const [showDeleteConfirm, setShowDeleteConfirm] = useState(null); // 表单状态 const [formData, setFormData] = useState({ username: '', displayName: '', phone: '', password: '' }); const [submitting, setSubmitting] = useState(false); const [error, setError] = useState(''); // 主账号编辑状态 const [showEditMasterModal, setShowEditMasterModal] = useState(false); const [masterFormData, setMasterFormData] = useState({ displayName: '', phone: '', password: '' }); const [editingMaster, setEditingMaster] = useState(false); // 公司信息 const [companyInfo, setCompanyInfo] = useState<{ name: string; contact_phone: string | null; role: string; } | null>(null); // 帮助系统弹窗状态 const [showUserManual, setShowUserManual] = useState(false); const [showFeedback, setShowFeedback] = useState(false); const [showAbout, setShowAbout] = useState(false); useEffect(() => { if (!auth.user) return; // 只有主账号可以管理子账号 if (!auth.user.is_master) { navigate('/'); return; } fetchMembers(); fetchCompanyInfo(); }, [auth.user]); const fetchCompanyInfo = async () => { if (!auth.user?.company_id) return; try { const data = await commonApi.getCompany(auth.user.company_id); if (data) { setCompanyInfo(data as any); } } catch { // ignore } }; const fetchMembers = async () => { setLoading(true); try { const data = await commonApi.listMembers(); const subMembers = (data || []) .filter((m: any) => !m.profile?.is_master) .map((m: any) => ({ id: m.profile?.id || m.id, username: m.profile?.username || '', phone: m.profile?.phone || null, created_at: m.profile?.created_at || m.created_at })); setMembers(subMembers); } catch { setMembers([]); } setLoading(false); }; const handleOpenModal = () => { setFormData({ username: '', displayName: '', phone: '', password: '' }); setError(''); setShowModal(true); }; const handleCloseModal = () => { setShowModal(false); setFormData({ username: '', displayName: '', phone: '', password: '' }); setError(''); }; const handleOpenEditMaster = () => { setMasterFormData({ displayName: (auth.user as any)?.display_name || auth.user?.username || '', phone: auth.user?.phone || '', password: '' }); setShowEditMasterModal(true); }; const handleCloseEditMaster = () => { setShowEditMasterModal(false); setMasterFormData({ displayName: '', phone: '', password: '' }); }; const handleUpdateMaster = async (e: React.FormEvent) => { e.preventDefault(); if (!masterFormData.phone.trim()) { setError('请输入手机号'); return; } if (!/^1[3-9]\d{9}$/.test(masterFormData.phone)) { setError('请输入正确的手机号'); return; } setEditingMaster(true); try { await http.put('/common/profile', { display_name: masterFormData.displayName, phone: encryptPhone(masterFormData.phone) }); if (masterFormData.password && masterFormData.password.length >= 6) { await http.put('/common/password', { password: masterFormData.password }); } window.location.reload(); } catch (err: any) { setError('更新失败:' + (err.message || '')); } setEditingMaster(false); }; const validateForm = () => { if (!formData.username.trim()) return '请输入用户名'; if (formData.username.length < 3) return '用户名至少3个字符'; if (!formData.displayName.trim()) return '请输入姓名'; if (!formData.password.trim()) return '请输入密码'; if (formData.password.length < 6) return '密码至少6个字符'; if (!formData.phone.trim()) return '请输入手机号'; if (!/^1[3-9]\d{9}$/.test(formData.phone)) { return '请输入正确的手机号'; } return ''; }; const handleSubmit = async (e: React.FormEvent) => { e.preventDefault(); const validationError = validateForm(); if (validationError) { setError(validationError); return; } if (!auth.user?.company_id) { setError('请先登录'); return; } setSubmitting(true); setError(''); try { await commonApi.createMember({ username: formData.username.trim(), password: formData.password, display_name: formData.displayName, phone: formData.phone || undefined }); await fetchMembers(); handleCloseModal(); } catch (err: any) { setError('创建子账号失败:' + (err.message || '')); } setSubmitting(false); }; const handleDelete = async (memberId: string) => { try { await commonApi.deleteMember(memberId); setMembers(members.filter(m => m.id !== memberId)); setShowDeleteConfirm(null); } catch { // ignore } }; // 根据角色获取主题色 const getThemeColors = () => { const role = companyInfo?.role || 'purchaser'; switch (role) { case 'textile': return { primary: 'emerald', bg: 'bg-emerald-50', bgHover: 'hover:bg-emerald-100', text: 'text-emerald-500', border: 'border-emerald-200', ring: 'focus:ring-emerald-400', button: 'bg-emerald-400 hover:bg-emerald-500', gradient: 'from-emerald-400 to-teal-400' }; case 'washing': return { primary: 'violet', bg: 'bg-violet-50', bgHover: 'hover:bg-violet-100', text: 'text-violet-500', border: 'border-violet-200', ring: 'focus:ring-violet-400', button: 'bg-violet-400 hover:bg-violet-500', gradient: 'from-violet-400 to-fuchsia-400' }; default: return { primary: 'amber', bg: 'bg-amber-50', bgHover: 'hover:bg-amber-100', text: 'text-amber-500', border: 'border-amber-200', ring: 'focus:ring-amber-400', button: 'bg-amber-400 hover:bg-amber-500', gradient: 'from-amber-400 to-orange-400' }; } }; const theme = getThemeColors(); // 如果不是主账号,显示无权限 if (!auth.user?.is_master) { return (

无权限访问

只有主账号可以管理账号

); } return (
{/* 头部 */}

账号管理

管理公司成员账号

添加子账号
{/* 主账号信息卡片 */}

当前登录账号

{auth.user?.username}

主账号
编辑
{/* 数据完整性监控入口 */}

系统管理

navigate('/admin/data-integrity')} className={`flex items-center gap-3 p-4 w-full ${theme.bg} rounded-xl ${theme.bgHover} transition-colors text-left`} >

数据完整性监控

查看系统数据一致性与错误率

{/* 帮助与支持卡片 */}

帮助与支持

setShowUserManual(true)} className={`flex items-center gap-3 p-4 ${theme.bg} rounded-xl ${theme.bgHover} transition-colors text-left`} >

用户手册

详细使用指南

setShowFeedback(true)} className={`flex items-center gap-3 p-4 ${theme.bg} rounded-xl ${theme.bgHover} transition-colors text-left`} >

用户反馈

提交问题或建议

setShowAbout(true)} className={`flex items-center gap-3 p-4 ${theme.bg} rounded-xl ${theme.bgHover} transition-colors text-left`} >

关于

版本信息与版权

{/* 子账号列表 */} {loading ? (
加载中...
) : members.length === 0 ? (

暂无子账号

点击右上角"添加子账号"按钮创建

添加子账号
) : (

子账号列表 ({members.length})

{members.map((member) => (

{member.username}

{member.phone && ( {maskPhone(member.phone)} )}
{new Date(member.created_at).toLocaleDateString('zh-CN')} 创建
))}
)}
{/* 添加子账号弹窗 */} {showModal && (

添加子账号

setFormData({ ...formData, username: e.target.value })} className={`w-full pl-10 pr-4 py-2.5 border border-gray-300 rounded-lg ${theme.ring} focus:border-transparent transition-all`} placeholder="请输入用户名(至少3个字符)" required />
setFormData({ ...formData, displayName: e.target.value })} className={`w-full pl-10 pr-4 py-2.5 border border-gray-300 rounded-lg ${theme.ring} focus:border-transparent transition-all`} placeholder="请输入姓名" required />
setFormData({ ...formData, phone: e.target.value })} className={`w-full pl-10 pr-4 py-2.5 border border-gray-300 rounded-lg ${theme.ring} focus:border-transparent transition-all`} placeholder="请输入手机号" required />
setFormData({ ...formData, password: e.target.value })} className={`w-full px-4 py-2.5 border border-gray-300 rounded-lg ${theme.ring} focus:border-transparent transition-all`} placeholder="请输入密码(至少6个字符)" required />
{error && ( {error} )}
{submitting ? '创建中...' : '创建子账号'}
)}
{/* 编辑主账号弹窗 */} {showEditMasterModal && (

编辑主账号

{/* 公司信息(只读) */}

公司信息

{/* 公司名称 - 只读 */}
{/* 角色类型 - 只读 */}
{/* 账号信息(只读) */}

账号信息

{/* 用户名 - 只读 */}
{/* 可编辑字段 */}
{/* 姓名 - 可编辑 */}
setMasterFormData({ ...masterFormData, displayName: e.target.value })} className={`w-full pl-10 pr-4 py-2.5 border border-gray-300 rounded-lg ${theme.ring} focus:border-transparent transition-all`} placeholder="请输入姓名" required />
{/* 手机号 - 可编辑 */}
setMasterFormData({ ...masterFormData, phone: e.target.value })} className={`w-full pl-10 pr-4 py-2.5 border border-gray-300 rounded-lg ${theme.ring} focus:border-transparent transition-all`} placeholder="请输入手机号" required />
{/* 登录密码 - 可编辑 */}
setMasterFormData({ ...masterFormData, password: e.target.value })} className={`w-full px-4 py-2.5 border border-gray-300 rounded-lg ${theme.ring} focus:border-transparent transition-all`} placeholder="请输入新密码(至少6个字符)" />

留空则保持原密码不变

{error && ( {error} )}
{editingMaster ? '保存中...' : '保存修改'}
)}
{/* 删除确认弹窗 */} {showDeleteConfirm && (

确认删除

删除后该子账号将无法登录,是否确认删除?

)}
{/* 用户手册弹窗 */} setShowUserManual(false)} /> {/* 用户反馈弹窗 */} setShowFeedback(false)} /> {/* 关于窗口 */} setShowAbout(false)} />
); }