Просмотр исходного кода

🐛 fix(silver-jobs): 修复数据加载异常处理和空状态显示问题

- 为数据获取添加错误状态处理,确保失败时正确重置数据和总数
- 为统计数据计算添加安全检查,防止空数据时报错
- 为表格添加空状态文本显示,优化用户体验
- 为公司选择下拉框添加空数组处理,避免渲染错误
- 添加错误日志打印,便于问题排查
yourname 8 месяцев назад
Родитель
Сommit
4211e7830c
1 измененных файлов с 26 добавлено и 10 удалено
  1. 26 10
      src/client/admin/pages/SilverJobs.tsx

+ 26 - 10
src/client/admin/pages/SilverJobs.tsx

@@ -232,11 +232,18 @@ export const SilverJobsPage: React.FC = () => {
 
       if (response.status === 200) {
         const result = await response.json();
-        setData(result.data);
-        setTotal(result.pagination.total);
+        setData(result.data || []);
+        setTotal(result.pagination?.total || 0);
+      } else {
+        setData([]);
+        setTotal(0);
+        message.error('获取岗位数据失败');
       }
     } catch (error) {
+      console.error('获取岗位数据失败:', error);
       message.error('获取岗位数据失败');
+      setData([]);
+      setTotal(0);
     } finally {
       setLoading(false);
     }
@@ -255,10 +262,15 @@ export const SilverJobsPage: React.FC = () => {
 
       if (response.status === 200) {
         const result = await response.json();
-        setCertifiedCompanies(result.data);
+        setCertifiedCompanies(result.data || []);
+      } else {
+        setCertifiedCompanies([]);
+        message.error('获取已认证公司列表失败');
       }
     } catch (error) {
+      console.error('获取已认证公司列表失败:', error);
       message.error('获取已认证公司列表失败');
+      setCertifiedCompanies([]);
     } finally {
       setCompaniesLoading(false);
     }
@@ -266,12 +278,13 @@ export const SilverJobsPage: React.FC = () => {
 
   // 获取统计数据
   const getStats = () => {
+    const safeData = data || [];
     const stats = {
-      total: data.length,
-      published: data.filter(item => item.status === 1).length,
-      draft: data.filter(item => item.status === 0).length,
-      closed: data.filter(item => item.status === 2).length,
-      filled: data.filter(item => item.status === 3).length,
+      total: safeData.length,
+      published: safeData.filter(item => item && item.status === 1).length,
+      draft: safeData.filter(item => item && item.status === 0).length,
+      closed: safeData.filter(item => item && item.status === 2).length,
+      filled: safeData.filter(item => item && item.status === 3).length,
     };
     return stats;
   };
@@ -480,7 +493,7 @@ export const SilverJobsPage: React.FC = () => {
       <Card>
         <Table
           columns={columns}
-          dataSource={data}
+          dataSource={data || []}
           loading={loading}
           rowKey="id"
           pagination={{
@@ -496,6 +509,9 @@ export const SilverJobsPage: React.FC = () => {
             },
           }}
           scroll={{ x: 'max-content' }}
+          locale={{
+            emptyText: loading ? '加载中...' : '暂无数据'
+          }}
         />
       </Card>
 
@@ -588,7 +604,7 @@ export const SilverJobsPage: React.FC = () => {
                 (option?.children as string)?.toLowerCase().includes(input.toLowerCase())
               }
             >
-              {certifiedCompanies.map(company => (
+              {(certifiedCompanies || []).map(company => (
                 <Option key={company.id} value={company.id}>
                   {company.name}
                 </Option>