Pārlūkot izejas kodu

update AlbumPost.vue

reghao 2 nedēļas atpakaļ
vecāks
revīzija
dcf2444e91
1 mainītis faili ar 297 papildinājumiem un 82 dzēšanām
  1. 297 82
      src/views/my/AlbumPost.vue

+ 297 - 82
src/views/my/AlbumPost.vue

@@ -4,34 +4,35 @@
       <div v-if="albumInfo" class="album-info-wrapper">
         <div class="album-cover-box">
           <el-image lazy fit="cover" class="header-cover-img" :src="albumInfo.coverUrl" />
+          <div class="cover-glass-overlay"></div>
         </div>
 
         <div class="album-detail-content">
           <div class="top-row">
             <h2 class="album-title">{{ albumInfo.title || '播放列表' }}</h2>
-            <el-button type="primary" size="small" icon="el-icon-video-play" class="play-all-btn" @click="onPlayAlbum">播放全部</el-button>
+            <el-button type="primary" size="medium" icon="el-icon-video-play" class="play-all-btn" @click="onPlayAlbum">播放全部</el-button>
           </div>
 
           <div class="filter-row">
             <div class="select-group">
               <span class="label hidden-xs-only">切换列表:</span>
               <el-select
-                  v-model="queryInfo.albumId"
-                  size="small"
-                  class="album-select"
-                  @change="onSelectChange"
+                v-model="queryInfo.albumId"
+                size="small"
+                class="album-select-custom"
+                @change="onSelectChange"
               >
                 <el-option
-                    v-for="(item, index) in allAlbums"
-                    :key="index"
-                    :label="item.label"
-                    :value="item.value"
+                  v-for="(item, index) in allAlbums"
+                  :key="index"
+                  :label="item.label"
+                  :value="item.value"
                 />
               </el-select>
             </div>
             <div class="stats-tags">
-              <el-tag size="mini" effect="plain" type="info">{{ albumInfo.total }} 个稿件</el-tag>
-              <el-tag size="mini" effect="plain" type="success" class="mgl-8">{{ albumInfo.scopeStr }}</el-tag>
+              <el-tag size="small" effect="plain" class="custom-tag-grey">{{ albumInfo.total }} 个稿件</el-tag>
+              <el-tag size="small" effect="dark" class="custom-tag-success mgl-8">{{ albumInfo.scopeStr }}</el-tag>
             </div>
           </div>
         </div>
@@ -45,21 +46,24 @@
 
       <el-row :gutter="20" class="video-grid">
         <el-col
-            v-for="(item, index) in dataList"
-            :key="index"
-            :xs="12" :sm="8" :md="6" :lg="4" :xl="4"
-            class="video-col"
+          v-for="(item, index) in dataList"
+          :key="index"
+          :xs="12" :sm="8" :md="6" :lg="4" :xl="4"
+          class="video-col"
         >
-          <el-card :body-style="{ padding: '0px' }" class="video-card" shadow="hover">
+          <el-card :body-style="{ padding: '0px' }" class="video-card-modern" shadow="never">
             <div class="card-image-box">
               <router-link :to="`/video/${item.videoId}`" target="_blank">
                 <el-image lazy fit="cover" class="card-cover" :src="item.coverUrl" />
                 <div class="card-badges">
-                  <span class="duration">{{ item.duration }}</span>
-                  <span class="device-icon">
+                  <span class="duration-badge"><i class="el-icon-time" /> {{ item.duration }}</span>
+                  <span class="device-icon-badge">
                     <i :class="item.horizontal ? 'el-icon-monitor' : 'el-icon-mobile-phone'" />
                   </span>
                 </div>
+                <div class="play-hover-mask">
+                  <i class="el-icon-video-play play-center-icon" />
+                </div>
               </router-link>
             </div>
 
@@ -78,10 +82,10 @@
               <div class="card-btns">
                 <el-button-group class="full-width-btns">
                   <el-tooltip content="设为封面" placement="top" :disabled="screenWidth < 768">
-                    <el-button size="mini" icon="el-icon-picture-outline" @click="onSetCover(item)"></el-button>
+                    <el-button size="mini" class="btn-action-grey" icon="el-icon-picture-outline" @click="onSetCover(item)"></el-button>
                   </el-tooltip>
                   <el-tooltip content="删除收藏" placement="top" :disabled="screenWidth < 768">
-                    <el-button size="mini" type="danger" plain icon="el-icon-delete" @click="onDeleteItem(item)"></el-button>
+                    <el-button size="mini" class="btn-action-danger" icon="el-icon-delete" @click="onDeleteItem(item)"></el-button>
                   </el-tooltip>
                 </el-button-group>
               </div>
@@ -92,13 +96,13 @@
 
       <div class="pagination-wrapper">
         <el-pagination
-            background
-            :small="screenWidth < 768"
-            layout="total, prev, pager, next"
-            :page-size="pageSize"
-            :current-page="currentPage"
-            :total="totalSize"
-            @current-change="handleCurrentChange"
+          background
+          :small="screenWidth < 768"
+          layout="total, prev, pager, next"
+          :page-size="pageSize"
+          :current-page="currentPage"
+          :total="totalSize"
+          @current-change="handleCurrentChange"
         />
       </div>
     </main>
@@ -115,7 +119,7 @@ export default {
   data() {
     return {
       allAlbums: [],
-      queryInfo: { albumId: null, pn: 1 },
+      queryInfo: { albumId: 0, pn: 1 },
       screenWidth: document.body.clientWidth,
       currentPage: 1,
       pageSize: 12,
@@ -166,7 +170,7 @@ export default {
           this.dataList = resp.data.pageList.list
           this.totalSize = resp.data.pageList.totalSize
           this.albumInfo = resp.data.albumInfo
-          this.queryInfo.albumId = this.albumInfo.albumId
+          this.queryInfo.albumId = this.albumInfo.albumId + ''
         }
       })
     },
@@ -199,141 +203,352 @@ export default {
 </script>
 
 <style scoped>
-/* 1. 基础容器与布局修复 */
+/* ==================== 1. 全局容器与精细化头部 ==================== */
 .album-page-container {
-  padding: 0;
-  max-width: 1400px; /* 限制 PC 端最大宽度,防止卡片过稀疏 */
+  padding: 16px;
+  max-width: 1440px;
   margin: 0 auto;
 }
 
 .album-header-card {
-  background: #fff;
-  border-radius: 8px;
-  padding: 24px;
-  margin-bottom: 20px;
-  box-shadow: 0 2px 12px rgba(0,0,0,0.04);
+  background: #ffffff;
+  border-radius: 12px;
+  padding: 28px;
+  margin-bottom: 24px;
+  border: 1px solid #f0f2f5;
+  box-shadow: 0 4px 20px rgba(0, 0, 0, 0.02);
 }
 
 .album-info-wrapper {
   display: flex;
-  gap: 24px;
+  gap: 28px;
+  align-items: center;
 }
 
 .album-cover-box {
-  width: 180px;
-  height: 110px;
+  position: relative;
+  width: 192px;
+  height: 120px;
   flex-shrink: 0;
-  border-radius: 6px;
+  border-radius: 8px;
   overflow: hidden;
+  box-shadow: 0 8px 16px rgba(0, 0, 0, 0.08);
 }
 
-.header-cover-img { width: 100%; height: 100%; }
+.header-cover-img {
+  width: 100%;
+  height: 100%;
+  transition: transform 0.6s ease;
+}
 
-.album-detail-content { flex: 1; min-width: 0; display: flex; flex-direction: column; justify-content: space-between; }
+.album-cover-box:hover .header-cover-img {
+  transform: scale(1.05);
+}
 
-.top-row { display: flex; justify-content: space-between; align-items: flex-start; }
+.album-detail-content {
+  flex: 1;
+  min-width: 0;
+  display: flex;
+  flex-direction: column;
+  gap: 16px;
+}
 
-.album-title { margin: 0; font-size: 20px; color: #303133; font-weight: 600; }
+.top-row {
+  display: flex;
+  justify-content: space-between;
+  align-items: center;
+}
 
-.filter-row { display: flex; align-items: center; justify-content: space-between; margin-top: 15px; }
+.album-title {
+  margin: 0;
+  font-size: 22px;
+  color: #1d2129;
+  font-weight: 600;
+  letter-spacing: -0.2px;
+}
 
-.select-group { display: flex; align-items: center; }
+.play-all-btn {
+  background: #409EFF;
+  border: none;
+  padding: 10px 20px;
+  font-weight: 500;
+  border-radius: 6px;
+  box-shadow: 0 4px 12px rgba(64, 158, 255, 0.3);
+  transition: all 0.25s ease;
+}
 
-.album-select { width: 200px; }
+.play-all-btn:hover {
+  transform: translateY(-1px);
+  box-shadow: 0 6px 16px rgba(64, 158, 255, 0.45);
+}
+
+.filter-row {
+  display: flex;
+  align-items: center;
+  justify-content: space-between;
+  border-top: 1px dashed #f2f3f5;
+  padding-top: 16px;
+}
+
+.select-group {
+  display: flex;
+  align-items: center;
+}
+
+.select-group .label {
+  font-size: 13px;
+  color: #86909c;
+}
+
+/* 隐藏 Element 默认边框线,改为平滑现代化设计 */
+::v-deep .album-select-custom .el-input__inner {
+  border-radius: 6px;
+  background-color: #f2f3f5;
+  border: 1px solid transparent;
+  color: #4e5969;
+  font-weight: 500;
+  transition: all 0.2s;
+}
+
+::v-deep .album-select-custom .el-input__inner:focus {
+  background-color: #ffffff;
+  border-color: #409EFF;
+}
+
+/* 细化标签层级 */
+.custom-tag-grey {
+  background-color: #f2f3f5 !important;
+  color: #4e5969 !important;
+  border: none !important;
+  border-radius: 4px;
+}
+
+.custom-tag-success {
+  background-color: #e8ffea !important;
+  color: #00b42a !important;
+  border: none !important;
+  border-radius: 4px;
+  font-weight: 500;
+}
 
 .mgl-8 { margin-left: 8px; }
 
-/* 2. 视频卡片 PC 端优化 */
-.video-grid { margin: 0 -10px; } /* 抵消 col 的 padding */
+/* ==================== 2. 视频网格与现代卡片 ==================== */
+.video-grid { margin: 0 -10px; }
 
-.video-card {
-  border-radius: 8px;
-  border: 1px solid #ebeef5;
-  margin-bottom: 20px;
-  transition: all 0.3s ease;
+.video-card-modern {
+  border-radius: 10px;
+  border: 1px solid #f2f3f5;
+  background: #ffffff;
+  margin-bottom: 24px;
+  transition: all 0.3s cubic-bezier(0.25, 0.8, 0.25, 1);
+  overflow: hidden;
+}
+
+/* 鼠标悬浮整体上浮、带柔和拟物阴影 */
+.video-card-modern:hover {
+  transform: translateY(-4px);
+  box-shadow: 0 12px 24px rgba(29, 33, 41, 0.08);
+  border-color: #e5e6eb;
 }
 
 .card-image-box {
   position: relative;
   width: 100%;
-  padding-top: 56.25%; /* 16:9 比例锁定 */
+  padding-top: 56.25%;
+  background-color: #f7f8fa;
+  overflow: hidden;
 }
 
 .card-cover {
   position: absolute;
   top: 0; left: 0;
   width: 100%; height: 100%;
+  transition: transform 0.4s ease;
+}
+
+.video-card-modern:hover .card-cover {
+  transform: scale(1.04);
+}
+
+/* 悬浮遮罩及中心播放小图标 */
+.play-hover-mask {
+  position: absolute;
+  top: 0; left: 0; width: 100%; height: 100%;
+  background: rgba(0, 0, 0, 0.2);
+  display: flex;
+  justify-content: center;
+  align-items: center;
+  opacity: 0;
+  transition: opacity 0.25s ease;
 }
 
+.video-card-modern:hover .play-hover-mask {
+  opacity: 1;
+}
+
+.play-center-icon {
+  font-size: 36px;
+  color: rgba(255, 255, 255, 0.9);
+  text-shadow: 0 2px 8px rgba(0,0,0,0.3);
+}
+
+/* 精致的小微章 */
 .card-badges {
   position: absolute;
-  bottom: 6px; left: 0; right: 0;
-  padding: 0 8px;
+  bottom: 0; left: 0; right: 0;
+  padding: 20px 8px 6px 8px;
   display: flex;
   justify-content: space-between;
-  background: linear-gradient(transparent, rgba(0,0,0,0.6));
-  color: #fff; font-size: 12px;
+  align-items: center;
+  background: linear-gradient(to top, rgba(0, 0, 0, 0.55) 0%, rgba(0, 0, 0, 0) 100%);
+  color: #fff;
+  font-size: 11px;
+  z-index: 2;
+}
+
+.duration-badge {
+  background: rgba(0, 0, 0, 0.6);
+  padding: 2px 6px;
+  border-radius: 4px;
+  letter-spacing: 0.2px;
+  display: flex;
+  align-items: center;
+  gap: 3px;
+}
+
+.device-icon-badge {
+  background: rgba(0, 0, 0, 0.6);
+  width: 20px;
+  height: 20px;
+  border-radius: 50%;
+  display: flex;
+  justify-content: center;
+  align-items: center;
 }
 
 .card-info { padding: 12px; }
 
+.video-title-link { text-decoration: none; }
+
 .video-title {
-  margin: 0 0 10px 0;
+  margin: 0 0 8px 0;
   font-size: 14px;
-  height: 40px; /* 两行高度固定 */
+  font-weight: 500;
+  height: 40px;
   line-height: 20px;
-  color: #303133;
+  color: #1d2129;
+  transition: color 0.2s;
   display: -webkit-box;
   -webkit-line-clamp: 2;
   -webkit-box-orient: vertical;
   overflow: hidden;
 }
 
+.video-card-modern:hover .video-title {
+  color: #409EFF;
+}
+
 .video-meta {
   display: flex;
   justify-content: space-between;
+  align-items: center;
   font-size: 12px;
-  color: #909399;
+  color: #86909c;
   margin-bottom: 12px;
 }
 
-.user-link { color: #606266; text-decoration: none; max-width: 60%; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
+.user-link {
+  color: #4e5969;
+  text-decoration: none;
+  max-width: 60%;
+  overflow: hidden;
+  text-overflow: ellipsis;
+  white-space: nowrap;
+  display: flex;
+  align-items: center;
+  gap: 3px;
+}
 .user-link:hover { color: #409EFF; }
 
-/* 按钮组 */
-.full-width-btns { display: flex; width: 100%; }
-.full-width-btns .el-button { flex: 1; }
+/* ==================== 3. 功能按钮卡片优化 ==================== */
+.card-btns {
+  border-top: 1px dashed #f2f3f5;
+  padding-top: 10px;
+  margin-top: 4px;
+}
+
+.full-width-btns { display: flex; width: 100%; gap: 8px; }
+.full-width-btns .el-button {
+  flex: 1;
+  border-radius: 4px !important;
+  border: 1px solid #f2f3f5;
+}
 
-.pagination-wrapper { padding: 40px 0; display: flex; justify-content: center; }
+.btn-action-grey {
+  background: #f7f8fa;
+  color: #4e5969;
+}
+.btn-action-grey:hover {
+  background: #e8f4ff !important;
+  color: #409EFF !important;
+  border-color: #c6e2ff !important;
+}
 
-/* 3. 移动端专项适配修复溢出 */
+.btn-action-danger {
+  background: #fffdfd;
+  color: #f56c6c;
+}
+.btn-action-danger:hover {
+  background: #fef0f0 !important;
+  color: #f56c6c !important;
+  border-color: #fde2e2 !important;
+}
+
+.pagination-wrapper { padding: 32px 0 16px 0; display: flex; justify-content: center; }
+
+/* ==================== 4. 完美移动端响应式适配 ==================== */
 @media screen and (max-width: 768px) {
-  .album-header-card { padding: 15px; margin-bottom: 15px; }
+  .album-page-container { padding: 10px; }
+
+  .album-header-card { padding: 16px; margin-bottom: 16px; border-radius: 8px; }
+
+  .album-info-wrapper { flex-direction: column; gap: 14px; align-items: stretch; text-align: left; }
 
-  .album-info-wrapper { flex-direction: column; gap: 12px; align-items: center; text-align: center; }
+  .album-cover-box { width: 100%; height: auto; padding-top: 45%; /* 移动端调整大拉伸或者横幅 */ }
+  .album-cover-box .header-cover-img { position: absolute; top:0; left:0; }
 
-  .album-cover-box { width: 140px; height: 85px; }
+  .top-row { flex-direction: row; align-items: center; gap: 12px; }
 
-  .top-row { flex-direction: column; align-items: center; gap: 10px; }
+  .album-title { font-size: 18px; flex: 1; }
 
-  .album-title { font-size: 16px; }
+  .play-all-btn { padding: 8px 14px; font-size: 12px; }
 
-  .filter-row { flex-direction: column; gap: 10px; align-items: stretch; }
+  .filter-row { flex-direction: column; gap: 12px; align-items: stretch; border-top: 1px solid #f2f3f5; }
 
-  .album-select { width: 100%; }
+  .album-select-custom { width: 100%; }
 
-  .video-grid { margin: 0 -5px; }
+  .stats-tags { display: flex; justify-content: flex-start; }
 
-  .video-col { padding: 0 5px !important; }
+  .video-grid { margin: 0 -4px; }
 
-  .video-title { font-size: 13px; height: 36px; line-height: 18px; margin-bottom: 6px; }
+  .video-col { padding: 0 4px !important; }
 
-  .video-meta { flex-direction: column; gap: 4px; margin-bottom: 8px; }
+  .video-card-modern { border-radius: 6px; margin-bottom: 8px; }
 
   .card-info { padding: 8px; }
+
+  .video-title { font-size: 13px; height: 36px; line-height: 18px; margin-bottom: 4px; }
+
+  .video-meta { flex-direction: column; align-items: flex-start; gap: 2px; margin-bottom: 8px; font-size: 11px; }
+
+  .user-link { max-width: 100%; }
+
+  .card-btns { padding-top: 8px; }
+  .full-width-btns { gap: 4px; }
+  .full-width-btns .el-button { padding: 6px 0; }
 }
 
-/* 隐藏辅助类 */
 @media screen and (max-width: 767px) {
   .hidden-xs-only { display: none !important; }
 }