import { Building2, Clock3, FileText, Filter, Layers, PackageCheck, Phone, RotateCw, Search, User, Users, } from 'lucide-react' import { useEffect, useState } from 'react' import { api } from '../../api' import { StatusBadge } from '../../components/StatusBadge' import { formatDate, formatDateTime } from '../../utils/date' import type { Course, CourseStatus } from '../../types' type StatusFilter = 'ALL' | CourseStatus export function AdminCourses() { const [courses, setCourses] = useState([]) const [loading, setLoading] = useState(true) const [error, setError] = useState('') const [statusFilter, setStatusFilter] = useState('ALL') const [keyword, setKeyword] = useState('') const loadCourses = () => { setLoading(true) api.admin .listCourses({ status: statusFilter, keyword }) .then((r) => setCourses(r.courses)) .catch((err) => setError(err.message)) .finally(() => setLoading(false)) } useEffect(() => { loadCourses() }, [statusFilter]) const handleSearch = (e: React.FormEvent) => { e.preventDefault() loadCourses() } return (

全部课程

查看全平台课程及其当前状态

{error &&
{error}
} {/* 筛选与搜索工具条 */}
setKeyword(e.target.value)} placeholder="搜索课程名、用户手机或姓名…" />
{/* 课程列表 */} {loading ? (
正在查询课程…
) : courses.length === 0 ? (

没有找到符合条件的课程

尝试切换状态筛选条件或清空搜索关键字。

) : (
{courses.map((course) => ( ))}
课程名称与大纲 提交制作用户信息 素材 / 讲师 / 交付 当前状态 创建 / 更新时间 提交 / 交付时间
{course.name} {course.description && ( {course.description} )}
共 {course.episodes?.length || 1} 集
{/* 醒目的提交用户信息单元格 */}
{(course.creator?.contactName || course.creator?.phone || '用')[0]}
{course.creator?.contactName || '未填写联系人'} {course.organizationName || '个人工作区'} {course.creator?.phone || '无手机号'}
{course.assets?.length || 0} 资产 {course.instructors?.length || 0} 讲师 {course.deliverables && course.deliverables.length > 0 && ( {course.deliverables.length} 交付物 )}
建: {formatDate(course.createdAt)} 更: {formatDateTime(course.updatedAt || course.createdAt)}
提: {course.submittedAt ? new Date(course.submittedAt).toLocaleDateString('zh-CN') : '未提交'} {course.completedAt && ( 成: {new Date(course.completedAt).toLocaleDateString('zh-CN')} )}
)}
) }