Ethanfly 5 дней назад
Родитель
Сommit
8690559b73

+ 2 - 2
client/src/views/Analytics/Work/index.vue

@@ -92,9 +92,9 @@
             :value="platform.value"
           />
         </el-select>
-        <!-- 排序统一按发布时间倒序,这里仅保留一个选项以避免误解 -->
-        <el-select v-model="sortBy" style="width: 160px">
+        <el-select v-model="sortBy" style="width: 200px" @change="handleFilterChange">
           <el-option label="按发布时间倒序排列" value="publish_desc" />
+          <el-option label="按播放量倒序排列" value="views_desc" />
         </el-select>
         <el-input 
           v-model="searchKeyword" 

+ 36 - 5
server/src/services/WorkDayStatisticsService.ts

@@ -1437,16 +1437,47 @@ export class WorkDayStatisticsService {
       const kw = `%${keyword.trim()}%`;
       qb.andWhere('w.title LIKE :kw', { kw });
     }
-
-    // 排序:统一按发布时间倒序(最新的在前)
+    // SQL 里只按发布时间倒序,具体排序口径在内存中根据 sortBy 再处理
     qb.orderBy('w.publish_time', 'DESC');
 
     // 先获取全部满足条件的作品聚合行,再在内存中做分页和汇总
     const allRows = await qb.getRawMany();
 
-    const total = allRows.length;
+    // 根据 sortBy 对结果进行排序
+    const sortedRows = [...allRows];
+    sortedRows.sort((a, b) => {
+      const getNum = (v: unknown) => Number(v) || 0;
+      if (sortBy === 'views_desc') {
+        return getNum(b.viewsCount) - getNum(a.viewsCount);
+      }
+      if (sortBy === 'likes_desc') {
+        return getNum(b.likesCount) - getNum(a.likesCount);
+      }
+      if (sortBy === 'comments_desc') {
+        return getNum(b.commentsCount) - getNum(a.commentsCount);
+      }
+
+      // 发布时间排序(默认 publish_desc)
+      const toTime = (v: unknown) => {
+        if (!v) return 0;
+        if (v instanceof Date) return v.getTime();
+        const t = new Date(String(v)).getTime();
+        return Number.isNaN(t) ? 0 : t;
+      };
+
+      const ta = toTime(a.publishTime);
+      const tb = toTime(b.publishTime);
+
+      if (sortBy === 'publish_asc') {
+        return ta - tb;
+      }
+      // publish_desc
+      return tb - ta;
+    });
+
+    const total = sortedRows.length;
     const offset = (page - 1) * pageSize;
-    const pagedRows = allRows.slice(offset, offset + pageSize);
+    const pagedRows = sortedRows.slice(offset, offset + pageSize);
 
     let totalViews = 0;
     let totalComments = 0;
@@ -1455,7 +1486,7 @@ export class WorkDayStatisticsService {
     let totalLikes = 0;
 
     // 汇总统计使用所有作品(而不是当前页),确保顶部统计口径统一
-    for (const row of allRows) {
+    for (const row of sortedRows) {
       const views = Number(row.viewsCount) || 0;
       const comments = Number(row.commentsCount) || 0;
       const shares = Number(row.sharesCount) || 0;