zlwu vor 1 Jahr
Ursprung
Commit
6e6be1ecbe
1 geänderte Dateien mit 143 neuen und 51 gelöschten Zeilen
  1. 143 51
      web/src/views/xg/xsjcxx/stuRoster/index.vue

+ 143 - 51
web/src/views/xg/xsjcxx/stuRoster/index.vue

@@ -136,64 +136,97 @@
                   </el-tooltip>
                 </template>
               </el-table-column>
+
+              <!-- 空状态插槽 -->
+              <template #empty>
+                <div class="empty-container">
+                  <el-empty :image-size="120" description="暂无学生数据">
+                    <template #image>
+                      <el-icon size="120" color="#c0c4cc">
+                        <Picture />
+                      </el-icon>
+                    </template>
+                    <template #description>
+                      <span class="empty-description">暂无学生数据</span>
+                    </template>
+                  </el-empty>
+                </div>
+              </template>
             </el-table>
           </div>
 
           <!-- 卡片视图 -->
           <div v-else class="card-view-container">
-            <div class="card-scroll-container">
-              <el-row :gutter="16">
-                <el-col v-for="item in studentList" :key="item.id" :span="6" class="mb-6">
-                  <el-card shadow="hover" class="student-card" @dblclick="handleDetail(item)">
-                    <div class="card-header">
-                      <div class="student-photo">
-                        <el-avatar
-                          :size="100"
-                          :src="item.photoUrl"
-                          :icon="!item.photoUrl ? (item.gender === '0' ? 'Male' : 'Female') : undefined"
-                          :class="{
-                            'male-placeholder': !item.photoUrl && item.gender === '0',
-                            'female-placeholder': !item.photoUrl && item.gender === '1'
-                          }"
-                        >
-                          <template v-if="!item.photoUrl">
-                            <div
-                              class="no-photo-placeholder"
-                              :class="{ 'male-placeholder': item.gender === '0', 'female-placeholder': item.gender === '1' }"
-                            >
-                              <el-icon size="96" small :color="item.gender === '0' ? '#409eff' : '#e91e63'">
-                                <Male v-if="item.gender === '0'" />
-                                <Female v-else />
-                              </el-icon>
-                              <span class="no-photo-text">{{ item.gender === '0' ? '男生' : '女生' }}</span>
-                            </div>
-                          </template>
-                        </el-avatar>
+            <div v-loading="loading" class="card-scroll-container">
+              <!-- 有数据时显示卡片列表 -->
+              <div v-if="studentList && studentList.length > 0">
+                <el-row :gutter="16">
+                  <el-col v-for="item in studentList" :key="item.id" :span="6" class="mb-6">
+                    <el-card shadow="hover" class="student-card" @dblclick="handleDetail(item)">
+                      <div class="card-header">
+                        <div class="student-photo">
+                          <el-avatar
+                            :size="100"
+                            :src="item.photoUrl"
+                            :icon="!item.photoUrl ? (item.gender === '0' ? 'Male' : 'Female') : undefined"
+                            :class="{
+                              'male-placeholder': !item.photoUrl && item.gender === '0',
+                              'female-placeholder': !item.photoUrl && item.gender === '1'
+                            }"
+                          >
+                            <template v-if="!item.photoUrl">
+                              <div
+                                class="no-photo-placeholder"
+                                :class="{ 'male-placeholder': item.gender === '0', 'female-placeholder': item.gender === '1' }"
+                              >
+                                <el-icon size="96" small :color="item.gender === '0' ? '#409eff' : '#e91e63'">
+                                  <Male v-if="item.gender === '0'" />
+                                  <Female v-else />
+                                </el-icon>
+                                <span class="no-photo-text">{{ item.gender === '0' ? '男生' : '女生' }}</span>
+                              </div>
+                            </template>
+                          </el-avatar>
+                        </div>
+                        <div class="student-info">
+                          <h3 class="student-name">{{ item.name }}</h3>
+                          <p class="student-no">{{ item.studentNo }}</p>
+                          <el-tag :type="getStatusType(item.studentStatus)" size="small">
+                            {{ getStudentStatusLabel(item.studentStatus) }}
+                          </el-tag>
+                        </div>
                       </div>
-                      <div class="student-info">
-                        <h3 class="student-name">{{ item.name }}</h3>
-                        <p class="student-no">{{ item.studentNo }}</p>
-                        <el-tag :type="getStatusType(item.studentStatus)" size="small">
-                          {{ getStudentStatusLabel(item.studentStatus) }}
-                        </el-tag>
+                      <div class="card-content">
+                        <p><strong>院系:</strong>{{ item.collegeName || '未设置' }}</p>
+                        <p><strong>专业:</strong>{{ item.majorName || '未设置' }}</p>
+                        <p><strong>班级:</strong>{{ item.className || '未设置' }}</p>
+                        <p><strong>手机:</strong>{{ item.phone || '未设置' }}</p>
+                        <p><strong>入学年份:</strong>{{ item.enrollmentYear || '未设置' }}</p>
                       </div>
-                    </div>
-                    <div class="card-content">
-                      <p><strong>院系:</strong>{{ item.collegeName || '未设置' }}</p>
-                      <p><strong>专业:</strong>{{ item.majorName || '未设置' }}</p>
-                      <p><strong>班级:</strong>{{ item.className || '未设置' }}</p>
-                      <p><strong>手机:</strong>{{ item.phone || '未设置' }}</p>
-                      <p><strong>入学年份:</strong>{{ item.enrollmentYear || '未设置' }}</p>
-                    </div>
-                    <div class="card-hint">
-                      <el-text type="primary" size="small">
-                        <el-icon class="mr-1"><View /></el-icon>
-                        双击查看详情
-                      </el-text>
-                    </div>
-                  </el-card>
-                </el-col>
-              </el-row>
+                      <div class="card-hint">
+                        <el-text type="primary" size="small">
+                          <el-icon class="mr-1"><View /></el-icon>
+                          双击查看详情
+                        </el-text>
+                      </div>
+                    </el-card>
+                  </el-col>
+                </el-row>
+              </div>
+
+              <!-- 无数据时显示空状态 -->
+              <div v-else-if="!loading" class="card-empty-container">
+                <el-empty :image-size="160" description="暂无学生数据">
+                  <template #image>
+                    <el-icon size="160" color="#c0c4cc">
+                      <Picture />
+                    </el-icon>
+                  </template>
+                  <template #description>
+                    <span class="empty-description">暂无学生数据</span>
+                  </template>
+                </el-empty>
+              </div>
             </div>
 
             <!-- 卡片视图分页 -->
@@ -1229,6 +1262,48 @@ onMounted(() => {
   font-weight: 500;
 }
 
+/* 空状态容器样式 */
+.empty-container {
+  display: flex;
+  align-items: center;
+  justify-content: center;
+  min-height: 400px;
+  padding: 40px 20px;
+}
+
+.card-empty-container {
+  display: flex;
+  align-items: center;
+  justify-content: center;
+  min-height: 400px;
+  height: 100%;
+  width: 100%;
+  padding: 40px 20px;
+}
+
+.empty-description {
+  color: #909399;
+  font-size: 16px;
+  margin-top: 16px;
+}
+
+.card-empty-container .empty-description {
+  color: #909399;
+  font-size: 18px;
+  margin-top: 20px;
+}
+
+/* 空状态图标和文字的间距优化 */
+.empty-container :deep(.el-empty__description),
+.card-empty-container :deep(.el-empty__description) {
+  margin-top: 16px;
+}
+
+.empty-container :deep(.el-empty__image),
+.card-empty-container :deep(.el-empty__image) {
+  margin-bottom: 20px;
+}
+
 /* 响应式布局 */
 @media (max-width: 1200px) {
   .left-panel {
@@ -1293,5 +1368,22 @@ onMounted(() => {
   .card-content {
     font-size: 12px;
   }
+
+  /* 移动端空状态样式调整 */
+  .empty-container,
+  .card-empty-container {
+    min-height: 300px;
+    padding: 20px 10px;
+  }
+
+  .empty-description,
+  .card-empty-container .empty-description {
+    font-size: 14px;
+  }
+
+  .empty-container :deep(.el-empty__image) .el-icon,
+  .card-empty-container :deep(.el-empty__image) .el-icon {
+    font-size: 100px !important;
+  }
 }
 </style>