From 2d410989d32380d31ae3fe6d42aa3b3ba9e09d00 Mon Sep 17 00:00:00 2001
From: lrj <owen.stl@gmail.com>
Date: 星期五, 03 十月 2025 22:13:29 +0800
Subject: [PATCH] UI优化和bug修复: 1.调整小程序消息列表图标样式 2.优化web端比赛晋级页面布局 3.修复小程序消息列表日期显示问题

---
 web/src/views/next-list.vue                                                         |   14 ++-
 wx/pages/message/utils.wxs                                                          |   48 +++++++++---
 backend/src/main/java/com/rongyichuang/player/dto/PromotionCompetitionResponse.java |   10 ++
 backend/src/main/resources/graphql/player.graphqls                                  |   57 ++++++++++++++
 web/src/api/promotion.js                                                            |    1 
 wx/pages/index/index.wxss                                                           |    8 ++
 wx/pages/message/message.wxml                                                       |    4 
 backend/src/main/java/com/rongyichuang/player/service/PromotionService.java         |    4 
 web/src/views/carousel/index.vue                                                    |   34 ++++++++
 wx/pages/message/message.wxss                                                       |   11 ++
 10 files changed, 164 insertions(+), 27 deletions(-)

diff --git a/backend/src/main/java/com/rongyichuang/player/dto/PromotionCompetitionResponse.java b/backend/src/main/java/com/rongyichuang/player/dto/PromotionCompetitionResponse.java
index d5521b4..bcf3ffe 100644
--- a/backend/src/main/java/com/rongyichuang/player/dto/PromotionCompetitionResponse.java
+++ b/backend/src/main/java/com/rongyichuang/player/dto/PromotionCompetitionResponse.java
@@ -10,6 +10,7 @@
 public class PromotionCompetitionResponse {
     
     private Long id;
+    private Long competitionId;
     private String competitionName;
     private String stageName;
     private Integer maxParticipants;
@@ -26,6 +27,7 @@
     
     public PromotionCompetitionResponse(Activity competition, Activity stage, Integer currentCount) {
         this.id = stage.getId();
+        this.competitionId = competition.getId();
         this.competitionName = competition.getName();
         this.stageName = stage.getName();
         this.maxParticipants = stage.getPlayerMax();
@@ -49,6 +51,14 @@
         this.id = id;
     }
     
+    public Long getCompetitionId() {
+        return competitionId;
+    }
+    
+    public void setCompetitionId(Long competitionId) {
+        this.competitionId = competitionId;
+    }
+    
     public String getCompetitionName() {
         return competitionName;
     }
diff --git a/backend/src/main/java/com/rongyichuang/player/service/PromotionService.java b/backend/src/main/java/com/rongyichuang/player/service/PromotionService.java
index 9ab63c2..4ca32ea 100644
--- a/backend/src/main/java/com/rongyichuang/player/service/PromotionService.java
+++ b/backend/src/main/java/com/rongyichuang/player/service/PromotionService.java
@@ -246,8 +246,8 @@
                 return PromotionResult.failure("璇烽�夋嫨瑕佹檵绾х殑鍙傝禌鑰�");
             }
             
-            // 鏌ヨ鐩爣鏅嬬骇闃舵淇℃伅锛堢敤鎴风偣鍑荤殑闃舵灏辨槸瑕佹檵绾у埌鐨勯樁娈碉級
-            Activity targetStage = activityRepository.findById(input.getCompetitionId()).orElse(null);
+            // 鏌ヨ鐩爣鏅嬬骇闃舵淇℃伅
+            Activity targetStage = activityRepository.findById(input.getTargetStageId()).orElse(null);
             if (targetStage == null) {
                 return PromotionResult.failure("鐩爣鏅嬬骇闃舵涓嶅瓨鍦�");
             }
diff --git a/backend/src/main/resources/graphql/player.graphqls b/backend/src/main/resources/graphql/player.graphqls
index 6a5f120..8ab03f6 100644
--- a/backend/src/main/resources/graphql/player.graphqls
+++ b/backend/src/main/resources/graphql/player.graphqls
@@ -19,6 +19,10 @@
     activityPlayerDetail(id: ID!): ActivityPlayerDetailResponse
     # 寰俊绔幏鍙栭�夋墜鎶ュ悕鐘舵��
     getPlayerRegistrationState(activityId: ID!): PlayerRegistrationResponse
+    # 鑾峰彇姣旇禌鏅嬬骇鍒楄〃
+    promotionCompetitions(name: String, page: Int, size: Int): [PromotionCompetitionResponse!]!
+    # 鑾峰彇鍙檵绾у弬璧涜�呭垪琛�
+    promotableParticipants(currentStageId: ID!): PromotableParticipantsResponse
 }
 
 extend type Mutation {
@@ -29,6 +33,8 @@
     submitActivityRegistration(input: ActivityRegistrationInput!): ActivityRegistrationResponse
     # 淇濆瓨璇勫璇勫垎
     saveActivityPlayerRating(input: ActivityPlayerRatingInput!): Boolean
+    # 鎵ц瀛﹀憳鏅嬬骇鎿嶄綔
+    promoteParticipants(input: PromotionInput!): PromotionResult
 }
 
 type ActivityPlayer {
@@ -232,4 +238,55 @@
 input ActivityPlayerRatingItemInput {
     itemId: ID!
     score: Float!
+}
+
+# 姣旇禌鏅嬬骇鍒楄〃鍝嶅簲绫诲瀷
+type PromotionCompetitionResponse {
+    id: ID!
+    competitionId: ID!
+    competitionName: String!
+    stageName: String!
+    maxParticipants: Int
+    currentCount: Int!
+    status: Int
+    startTime: String
+    endTime: String
+    sortOrder: Int
+    state: Int
+}
+
+# 鍙檵绾у弬璧涜�呭垪琛ㄥ搷搴旂被鍨�
+type PromotableParticipantsResponse {
+    participants: [PromotableParticipantResponse!]!
+    selectableCount: Int
+    totalCount: Int
+    previousStageName: String
+    currentStageName: String
+}
+
+# 鍙檵绾у弬璧涜�呭搷搴旂被鍨�
+type PromotableParticipantResponse {
+    id: ID!
+    playerName: String
+    projectName: String
+    phone: String
+    averageScore: Float
+    ratingCount: Int
+    applyTime: String
+    state: Int
+    playerId: ID
+}
+
+# 鏅嬬骇鎿嶄綔杈撳叆绫诲瀷
+input PromotionInput {
+    competitionId: ID!
+    participantIds: [ID!]!
+    targetStageId: ID!
+}
+
+# 鏅嬬骇鎿嶄綔缁撴灉绫诲瀷
+type PromotionResult {
+    success: Boolean!
+    message: String
+    promotedCount: Int
 }
\ No newline at end of file
diff --git a/web/src/api/promotion.js b/web/src/api/promotion.js
index 2878790..c2b315d 100644
--- a/web/src/api/promotion.js
+++ b/web/src/api/promotion.js
@@ -5,6 +5,7 @@
   query GetPromotionCompetitions($name: String, $page: Int, $size: Int) {
     promotionCompetitions(name: $name, page: $page, size: $size) {
       id
+      competitionId
       competitionName
       stageName
       maxParticipants
diff --git a/web/src/views/carousel/index.vue b/web/src/views/carousel/index.vue
index c305d0c..648baf0 100644
--- a/web/src/views/carousel/index.vue
+++ b/web/src/views/carousel/index.vue
@@ -60,8 +60,8 @@
         <el-table-column prop="createTime" label="鍒涘缓鏃堕棿" width="180" />
         <el-table-column label="鎿嶄綔" width="120" fixed="right">
           <template #default="{ row }">
-            <el-button type="primary" size="small" @click="handleEdit(row)" :icon="Edit" circle title="缂栬緫"></el-button>
-            <el-button type="danger" size="small" @click="handleDelete(row)" :icon="Delete" circle title="鍒犻櫎"></el-button>
+            <el-button text size="small" @click="handleEdit(row)" :icon="Edit" class="action-btn edit-btn" title="缂栬緫"></el-button>
+            <el-button text size="small" @click="handleDelete(row)" :icon="Delete" class="action-btn delete-btn" title="鍒犻櫎"></el-button>
           </template>
         </el-table-column>
       </el-table>
@@ -681,6 +681,36 @@
   }
 }
 
+/* 鎿嶄綔鎸夐挳鏍峰紡 */
+.action-btn {
+  padding: 8px !important;
+  margin: 0 6px;
+  border-radius: 6px;
+  transition: all 0.2s ease;
+  background: transparent !important;
+  border: none !important;
+}
+
+.edit-btn {
+  color: #409eff !important;
+}
+
+.edit-btn:hover {
+  color: #337ecc !important;
+  background: rgba(64, 158, 255, 0.1) !important;
+  transform: scale(1.2);
+}
+
+.delete-btn {
+  color: #f56c6c !important;
+}
+
+.delete-btn:hover {
+  color: #dd6161 !important;
+  background: rgba(245, 108, 108, 0.1) !important;
+  transform: scale(1.2);
+}
+
 .header-actions {
   display: flex;
   gap: 10px;
diff --git a/web/src/views/next-list.vue b/web/src/views/next-list.vue
index addeb22..a8200db 100644
--- a/web/src/views/next-list.vue
+++ b/web/src/views/next-list.vue
@@ -27,7 +27,6 @@
           <el-icon><Search /></el-icon>
           鎼滅储
         </el-button>
-        <el-button @click="resetSearch">閲嶇疆</el-button>
       </div>
     </div>
 
@@ -222,6 +221,7 @@
 import { ElMessage, ElMessageBox } from 'element-plus'
 import { Search, TrophyBase, InfoFilled } from '@element-plus/icons-vue'
 import PromotionApi from '@/api/promotion'
+import { getActivity } from '@/api/activity'
 
 const router = useRouter()
 
@@ -393,6 +393,8 @@
   selectedParticipants.value = selection
 }
 
+
+
 // 纭鏅嬬骇
 const confirmPromotion = async () => {
   if (selectedParticipants.value.length === 0) {
@@ -418,10 +420,10 @@
       const participantIds = selectedParticipants.value.map(p => p.id)
       
       const result = await PromotionApi.promoteParticipants(
-        selectedCompetition.value.id,
-        participantIds,
-        null // 鐩爣闃舵ID锛岃繖閲屽彲浠ユ牴鎹渶瑕佽缃�
-      )
+          selectedCompetition.value.competitionId, // 涓绘瘮璧汭D
+          participantIds,
+          selectedCompetition.value.id // 褰撳墠闃舵ID浣滀负鐩爣闃舵ID
+        )
       
       if (result && result.success) {
         ElMessage.success(result.message || `鎴愬姛鏅嬬骇 ${result.promotedCount} 鍚嶄汉鍛榒)
@@ -558,7 +560,7 @@
 .search-toolbar {
   display: flex;
   align-items: center;
-  justify-content: space-between;
+  justify-content: flex-end;
   margin-bottom: 20px;
   padding: 16px;
   background-color: #f9fafb;
diff --git a/wx/pages/index/index.wxss b/wx/pages/index/index.wxss
index 10ba3b4..df62744 100644
--- a/wx/pages/index/index.wxss
+++ b/wx/pages/index/index.wxss
@@ -268,6 +268,14 @@
   width: 140rpx;
   text-align: center;
   /* align-self 宸茬Щ闄わ紝鐢辩埗绾� .btn-row 鎺у埗瀵归綈 */
+  /* 绉婚櫎button榛樿鏍峰紡 */
+  margin: 0;
+  position: static;
+  display: inline-block;
+}
+
+.ghost-btn::after {
+  border: none;
 }
 
 .ghost-btn:active {
diff --git a/wx/pages/message/message.wxml b/wx/pages/message/message.wxml
index f9c22e5..1738522 100644
--- a/wx/pages/message/message.wxml
+++ b/wx/pages/message/message.wxml
@@ -19,8 +19,8 @@
     <view wx:else class="message-list">
       <view wx:for="{{messages}}" wx:key="id" class="message-card">
         <view class="icon-wrapper">
-          <!-- 鎸夎姹備娇鐢ㄧ粺涓�鍥炬爣 -->
-          <icon type="info" size="22" color="#FFFFFF"></icon>
+          <!-- 浣跨敤鏇村悎閫傜殑娑堟伅鍥炬爣 -->
+          <text class="icon ic-comment"></text>
         </view>
         <view class="text-wrapper">
           <text class="title">{{item.content}}</text>
diff --git a/wx/pages/message/message.wxss b/wx/pages/message/message.wxss
index 620b929..bb839f8 100644
--- a/wx/pages/message/message.wxss
+++ b/wx/pages/message/message.wxss
@@ -75,10 +75,10 @@
 }
 
 .icon-wrapper {
-  width: 80rpx;
-  height: 80rpx;
+  width: 60rpx;
+  height: 60rpx;
   border-radius: 50%;
-  background-color: #007aff; /* 缁熶竴浣跨敤钃濊壊 */
+  background-color: #e6f3ff; /* 娴呰摑鑹茶儗鏅� */
   display: flex;
   align-items: center;
   justify-content: center;
@@ -86,6 +86,11 @@
   flex-shrink: 0;
 }
 
+.icon-wrapper .icon {
+  font-size: 28rpx;
+  color: #007aff; /* 娣辫摑鑹插浘鏍� */
+}
+
 .text-wrapper {
   display: flex;
   flex-direction: column;
diff --git a/wx/pages/message/utils.wxs b/wx/pages/message/utils.wxs
index 687c244..ef6572f 100644
--- a/wx/pages/message/utils.wxs
+++ b/wx/pages/message/utils.wxs
@@ -1,19 +1,43 @@
 var formatTime = function (dateStr) {
   if (!dateStr) return '';
-  // 鍏煎 iOS
-  var date = getDate(dateStr.split('-').join('/')); 
-  var year = date.getFullYear();
-  var month = date.getMonth() + 1;
-  var day = date.getDate();
-  var hour = date.getHours();
-  var minute = date.getMinutes();
-
-  var formatNumber = function(n) {
-    n = n.toString();
-    return n[1] ? n : '0' + n;
+  
+  var date;
+  
+  // 澶勭悊鏃堕棿鎴筹紙鏁板瓧锛�
+  if (typeof dateStr === 'number') {
+    date = getDate(dateStr);
+  } 
+  // 澶勭悊瀛楃涓叉牸寮忕殑鏃ユ湡
+  else if (typeof dateStr === 'string') {
+    // 灏濊瘯鐩存帴瑙f瀽
+    date = getDate(dateStr);
+  } 
+  else {
+    return '';
   }
+  
+  // 妫�鏌ユ棩鏈熷璞℃槸鍚﹀垱寤烘垚鍔�
+  try {
+    var year = date.getFullYear();
+    var month = date.getMonth() + 1;
+    var day = date.getDate();
+    var hour = date.getHours();
+    var minute = date.getMinutes();
+    
+    // 濡傛灉鑾峰彇鍒扮殑鍊兼槸NaN锛岃鏄庢棩鏈熸棤鏁�
+    if (year !== year || month !== month || day !== day) {
+      return '';
+    }
+    
+    return year + '-' + formatNumber(month) + '-' + formatNumber(day) + ' ' + formatNumber(hour) + ':' + formatNumber(minute);
+  } catch (e) {
+    return '';
+  }
+}
 
-  return year + '-' + formatNumber(month) + '-' + formatNumber(day) + ' ' + formatNumber(hour) + ':' + formatNumber(minute);
+var formatNumber = function(n) {
+  n = n.toString();
+  return n[1] ? n : '0' + n;
 }
 
 module.exports = {

--
Gitblit v1.8.0