656 lines
		
	
	
		
			17 KiB
		
	
	
	
		
			Vue
		
	
	
	
		
		
			
		
	
	
			656 lines
		
	
	
		
			17 KiB
		
	
	
	
		
			Vue
		
	
	
	
|  | <template> | |||
|  |   <view class="history-page"> | |||
|  |     <header-bar title="历史记录" @leftClick="handleLeftClick"></header-bar> | |||
|  | 
 | |||
|  |     <view class="tab-container"> | |||
|  |       <view class="custom-tab"> | |||
|  |         <view | |||
|  |           v-for="tab in tabList" | |||
|  |           :key="tab.id" | |||
|  |           :class="['tab-item', { active: activeTab === tab.id }]" | |||
|  |           @click="switchTab(tab.id)" | |||
|  |         > | |||
|  |           <text class="tab-text">{{ tab.name }}</text> | |||
|  |           <view class="tab-underline" v-if="activeTab === tab.id"></view> | |||
|  |         </view> | |||
|  |       </view> | |||
|  | 
 | |||
|  |       <view class="more-icon-container" @click="toggleMoreMenu"> | |||
|  |         <image | |||
|  |           class="more-icon" | |||
|  |           src="/static/common/images/icon-more.png" | |||
|  |           mode="scaleToFill" | |||
|  |         ></image> | |||
|  |       </view> | |||
|  | 
 | |||
|  |       <!-- 右上角弹出菜单:批量删除 --> | |||
|  |       <view v-if="isMoreMenuVisible" class="more-menu" @click.stop> | |||
|  |         <view class="menu-card" @click="handleBatchDeleteClick"> | |||
|  |           <!-- <image | |||
|  |             class="menu-icon" | |||
|  |             src="/static/common/images/icon_delete.png" | |||
|  |             mode="widthFix" | |||
|  |           /> --> | |||
|  |           <u-icon name="trash" color="#FF647D" size="28"></u-icon> | |||
|  |           <text class="menu-text">批量删除</text> | |||
|  |         </view> | |||
|  |       </view> | |||
|  |     </view> | |||
|  | 
 | |||
|  |     <!-- 点击其他区域关闭弹层 --> | |||
|  |     <view v-if="isMoreMenuVisible" class="overlay" @click="hideMoreMenu"></view> | |||
|  | 
 | |||
|  |     <!-- 内容区域包装器 --> | |||
|  |     <view class="content-wrapper"> | |||
|  |       <!-- 历史记录列表(按日期分组,日期固定在上方) --> | |||
|  |       <view class="history-list"> | |||
|  |         <view | |||
|  |           class="date-group" | |||
|  |           v-for="group in groupedHistoryList" | |||
|  |           :key="group.header" | |||
|  |         > | |||
|  |           <view class="date-header">{{ group.header }}</view> | |||
|  | 
 | |||
|  |           <view class="history-item" v-for="item in group.items" :key="item.id"> | |||
|  |             <!-- 批量删除模式下的选择框 --> | |||
|  |             <view | |||
|  |               class="item-checkbox" | |||
|  |               v-if="isBatchDeleteMode" | |||
|  |               @click="toggleItemSelection(item.id)" | |||
|  |             > | |||
|  |               <view | |||
|  |                 class="checkbox" | |||
|  |                 :class="{ checked: selectedItems.includes(item.id) }" | |||
|  |               > | |||
|  |                 <text class="checkmark" v-if="selectedItems.includes(item.id)" | |||
|  |                   >✓</text | |||
|  |                 > | |||
|  |               </view> | |||
|  |             </view> | |||
|  | 
 | |||
|  |             <!-- 历史记录内容 --> | |||
|  |             <view class="item-content"> | |||
|  |               <view class="item-header"> | |||
|  |                 <view class="item-icon"> | |||
|  |                   <text class="icon-text">B</text> | |||
|  |                 </view> | |||
|  |                 <view class="item-title">{{ item.title }}</view> | |||
|  |               </view> | |||
|  |               <view class="item-description">{{ item.content }}</view> | |||
|  |             </view> | |||
|  |           </view> | |||
|  |         </view> | |||
|  |       </view> | |||
|  |     </view> | |||
|  | 
 | |||
|  |     <!-- 批量删除操作栏 --> | |||
|  |     <view class="batch-actions" v-if="isBatchDeleteMode"> | |||
|  |       <view class="select-all-container" @click="toggleSelectAll"> | |||
|  |         <view class="checkbox" :class="{ checked: selectAll }"> | |||
|  |           <text class="checkmark" v-if="selectAll">✓</text> | |||
|  |         </view> | |||
|  |         <text class="select-all-text">全选</text> | |||
|  |       </view> | |||
|  |       <view class="function-btn"> | |||
|  |         <view class="cancel-btn" @click="cancelBatchDelete">取消</view> | |||
|  |         <view class="delete-btn" @click="batchDelete">删除</view> | |||
|  |       </view> | |||
|  |     </view> | |||
|  | 
 | |||
|  |     <!-- 提示 --> | |||
|  |     <u-toast ref="uToast" /> | |||
|  |   </view> | |||
|  | </template> | |||
|  | 
 | |||
|  | <script> | |||
|  | import HeaderBar from "@/components/HeaderBar.vue"; | |||
|  | 
 | |||
|  | export default { | |||
|  |   components: { | |||
|  |     HeaderBar, | |||
|  |   }, | |||
|  |   data() { | |||
|  |     return { | |||
|  |       activeTab: "1", // 当前激活的tab
 | |||
|  |       tabList: [ | |||
|  |         { id: "1", name: "AI咨询" }, | |||
|  |         { id: "2", name: "人工咨询" }, | |||
|  |       ], | |||
|  |       isBatchDeleteMode: false, // 是否为批量删除模式
 | |||
|  |       isMoreMenuVisible: false, // 右上角更多菜单是否可见
 | |||
|  |       selectedItems: [], // 选中的项目
 | |||
|  |       selectAll: false, // 是否全选
 | |||
|  |       historyList: [ | |||
|  |         { | |||
|  |           id: 1, | |||
|  |           title: "学校哪些专业比较好?", | |||
|  |           content: | |||
|  |             "学校哪些专业比较好?学校哪些专业比较好?学校哪些专业比较好?学校哪些专业比较好?学校哪些专业比较好?学校哪些专业比较好?学校哪些专业比较好?", | |||
|  |           time: new Date().getTime(), // 今天
 | |||
|  |           type: "ai", | |||
|  |         }, | |||
|  |         { | |||
|  |           id: 2, | |||
|  |           title: "学校哪些专业比较好?", | |||
|  |           content: | |||
|  |             "学校哪些专业比较好?学校哪些专业比较好?学校哪些专业比较好?学校哪些专业比较好?学校哪些专业比较好?学校哪些专业比较好?学校哪些专业比较好?", | |||
|  |           time: new Date().getTime(), // 今天
 | |||
|  |           type: "ai", | |||
|  |         }, | |||
|  |         { | |||
|  |           id: 3, | |||
|  |           title: "学校哪些专业比较好?", | |||
|  |           content: | |||
|  |             "学校哪些专业比较好?学校哪些专业比较好?学校哪些专业比较好?学校哪些专业比较好?学校哪些专业比较好?学校哪些专业比较好?学校哪些专业比较好?", | |||
|  |           time: new Date().getTime(), // 今天
 | |||
|  |           type: "ai", | |||
|  |         }, | |||
|  |         { | |||
|  |           id: 4, | |||
|  |           title: "学校哪些专业比较好?", | |||
|  |           content: | |||
|  |             "学校哪些专业比较好?学校哪些专业比较好?学校哪些专业比较好?学校哪些专业比较好?学校哪些专业比较好?学校哪些专业比较好?学校哪些专业比较好?", | |||
|  |           time: new Date().getTime(), // 今天
 | |||
|  |           type: "ai", | |||
|  |         }, | |||
|  |         { | |||
|  |           id: 5, | |||
|  |           title: "学校哪些专业比较好?", | |||
|  |           content: | |||
|  |             "学校哪些专业比较好?学校哪些专业比较好?学校哪些专业比较好?学校哪些专业比较好?学校哪些专业比较好?学校哪些专业比较好?学校哪些专业比较好?", | |||
|  |           time: new Date().getTime() - 24 * 60 * 60 * 1000 * 2, // 2天前
 | |||
|  |           type: "ai", | |||
|  |         }, | |||
|  |         { | |||
|  |           id: 6, | |||
|  |           title: "学校哪些专业比较好?", | |||
|  |           content: | |||
|  |             "学校哪些专业比较好?学校哪些专业比较好?学校哪些专业比较好?学校哪些专业比较好?学校哪些专业比较好?学校哪些专业比较好?学校哪些专业比较好?", | |||
|  |           time: new Date().getTime() - 365 * 24 * 60 * 60 * 1000, // 去年
 | |||
|  |           type: "human", | |||
|  |         }, | |||
|  |         { | |||
|  |           id: 7, | |||
|  |           title: "学校哪些专业比较好?", | |||
|  |           content: | |||
|  |             "学校哪些专业比较好?学校哪些专业比较好?学校哪些专业比较好?学校哪些专业比较好?学校哪些专业比较好?学校哪些专业比较好?学校哪些专业比较好?", | |||
|  |           time: new Date().getTime() - 24 * 60 * 60 * 1000 * 5, // 5天前
 | |||
|  |           type: "human", | |||
|  |         }, | |||
|  |       ], | |||
|  |     }; | |||
|  |   }, | |||
|  |   computed: { | |||
|  |     // 根据当前tab过滤历史记录
 | |||
|  |     filteredHistoryList() { | |||
|  |       return this.historyList.filter((item) => { | |||
|  |         if (this.activeTab === "1") { | |||
|  |           return item.type === "ai"; | |||
|  |         } else { | |||
|  |           return item.type === "human"; | |||
|  |         } | |||
|  |       }); | |||
|  |     }, | |||
|  | 
 | |||
|  |     // 按日期分组后的历史记录(日期标题固定在上方)
 | |||
|  |     groupedHistoryList() { | |||
|  |       // 先按时间倒序
 | |||
|  |       const list = [...this.filteredHistoryList].sort( | |||
|  |         (a, b) => b.time - a.time | |||
|  |       ); | |||
|  |       const groups = []; | |||
|  |       let currentHeader = null; | |||
|  |       let currentItems = []; | |||
|  | 
 | |||
|  |       list.forEach((item) => { | |||
|  |         const header = this.formatTime(item.time); | |||
|  |         if (header !== currentHeader) { | |||
|  |           if (currentItems.length) { | |||
|  |             groups.push({ header: currentHeader, items: currentItems }); | |||
|  |           } | |||
|  |           currentHeader = header; | |||
|  |           currentItems = [item]; | |||
|  |         } else { | |||
|  |           currentItems.push(item); | |||
|  |         } | |||
|  |       }); | |||
|  |       if (currentItems.length) { | |||
|  |         groups.push({ header: currentHeader, items: currentItems }); | |||
|  |       } | |||
|  |       return groups; | |||
|  |     }, | |||
|  |   }, | |||
|  |   methods: { | |||
|  |     // 格式化时间显示
 | |||
|  |     formatTime(timestamp) { | |||
|  |       const now = new Date(); | |||
|  |       const date = new Date(timestamp); | |||
|  |       const today = new Date(now.getFullYear(), now.getMonth(), now.getDate()); | |||
|  |       const itemDate = new Date( | |||
|  |         date.getFullYear(), | |||
|  |         date.getMonth(), | |||
|  |         date.getDate() | |||
|  |       ); | |||
|  | 
 | |||
|  |       // 计算时间差
 | |||
|  |       const diffTime = today.getTime() - itemDate.getTime(); | |||
|  |       const diffDays = Math.floor(diffTime / (1000 * 60 * 60 * 24)); | |||
|  | 
 | |||
|  |       // 今天
 | |||
|  |       if (diffDays === 0) { | |||
|  |         return `${String(date.getMonth() + 1).padStart(2, "0")}/${String( | |||
|  |           date.getDate() | |||
|  |         ).padStart(2, "0")}`;
 | |||
|  |       } | |||
|  | 
 | |||
|  |       // 本周内(1-6天前)
 | |||
|  |       if (diffDays > 0 && diffDays <= 6) { | |||
|  |         const weekdays = [ | |||
|  |           "周日", | |||
|  |           "周一", | |||
|  |           "周二", | |||
|  |           "周三", | |||
|  |           "周四", | |||
|  |           "周五", | |||
|  |           "周六", | |||
|  |         ]; | |||
|  |         return weekdays[date.getDay()]; | |||
|  |       } | |||
|  | 
 | |||
|  |       // 今年但不是本周
 | |||
|  |       if (date.getFullYear() === now.getFullYear()) { | |||
|  |         return `${String(date.getMonth() + 1).padStart(2, "0")}/${String( | |||
|  |           date.getDate() | |||
|  |         ).padStart(2, "0")}`;
 | |||
|  |       } | |||
|  | 
 | |||
|  |       // 往年
 | |||
|  |       return `${date.getFullYear()}/${String(date.getMonth() + 1).padStart( | |||
|  |         2, | |||
|  |         "0" | |||
|  |       )}/${String(date.getDate()).padStart(2, "0")}`;
 | |||
|  |     }, | |||
|  | 
 | |||
|  |     handleLeftClick() { | |||
|  |       uni.navigateBack(); | |||
|  |     }, | |||
|  | 
 | |||
|  |     switchTab(tab) { | |||
|  |       this.activeTab = tab; | |||
|  |     }, | |||
|  | 
 | |||
|  |     // 显示/隐藏右上角更多菜单
 | |||
|  |     toggleMoreMenu() { | |||
|  |       this.isMoreMenuVisible = !this.isMoreMenuVisible; | |||
|  |     }, | |||
|  |     // 点击蒙层隐藏更多菜单
 | |||
|  |     hideMoreMenu() { | |||
|  |       this.isMoreMenuVisible = false; | |||
|  |     }, | |||
|  |     // 取消批量删除模式
 | |||
|  |     cancelBatchDelete() { | |||
|  |       this.isBatchDeleteMode = false; | |||
|  |     }, | |||
|  | 
 | |||
|  |     // 点击“批量删除”菜单项,进入批量删除模式
 | |||
|  |     handleBatchDeleteClick() { | |||
|  |       this.isMoreMenuVisible = false; | |||
|  |       if (!this.isBatchDeleteMode) { | |||
|  |         this.toggleBatchDeleteMode(); | |||
|  |       } | |||
|  |     }, | |||
|  | 
 | |||
|  |     // 切换批量删除模式
 | |||
|  |     toggleBatchDeleteMode() { | |||
|  |       this.isBatchDeleteMode = !this.isBatchDeleteMode; | |||
|  |       if (!this.isBatchDeleteMode) { | |||
|  |         // 退出批量删除模式时清空选中项
 | |||
|  |         this.selectedItems = []; | |||
|  |         this.selectAll = false; | |||
|  |       } | |||
|  |     }, | |||
|  | 
 | |||
|  |     // 切换单个项目选中状态
 | |||
|  |     toggleItemSelection(itemId) { | |||
|  |       const index = this.selectedItems.indexOf(itemId); | |||
|  |       if (index > -1) { | |||
|  |         this.selectedItems.splice(index, 1); | |||
|  |       } else { | |||
|  |         this.selectedItems.push(itemId); | |||
|  |       } | |||
|  |       // 更新全选状态
 | |||
|  |       this.selectAll = | |||
|  |         this.selectedItems.length === this.filteredHistoryList.length; | |||
|  |     }, | |||
|  | 
 | |||
|  |     // 切换全选状态
 | |||
|  |     toggleSelectAll() { | |||
|  |       this.selectAll = !this.selectAll; | |||
|  |       if (this.selectAll) { | |||
|  |         this.selectedItems = this.filteredHistoryList.map((item) => item.id); | |||
|  |       } else { | |||
|  |         this.selectedItems = []; | |||
|  |       } | |||
|  |     }, | |||
|  | 
 | |||
|  |     // 批量删除选中项
 | |||
|  |     batchDelete() { | |||
|  |       if (this.selectedItems.length === 0) { | |||
|  |         this.$refs.uToast.show({ | |||
|  |           title: "请选择要删除的项目", | |||
|  |           type: "warning", | |||
|  |         }); | |||
|  |         return; | |||
|  |       } | |||
|  | 
 | |||
|  |       // 删除选中的项目
 | |||
|  |       this.historyList = this.historyList.filter( | |||
|  |         (item) => !this.selectedItems.includes(item.id) | |||
|  |       ); | |||
|  | 
 | |||
|  |       // 重置状态
 | |||
|  |       this.selectedItems = []; | |||
|  |       this.selectAll = false; | |||
|  |       this.isBatchDeleteMode = false; | |||
|  | 
 | |||
|  |       this.$refs.uToast.show({ | |||
|  |         title: "删除成功", | |||
|  |         type: "success", | |||
|  |       }); | |||
|  |     }, | |||
|  | 
 | |||
|  |     handleDelete(item, callback) { | |||
|  |       console.log("handleDelete", item); | |||
|  | 
 | |||
|  |       setTimeout(() => { | |||
|  |         this.$refs.uToast.show({ | |||
|  |           title: "撤回成功", | |||
|  |           type: "success", | |||
|  |         }); | |||
|  |         callback(true); | |||
|  |       }, 1500); | |||
|  |     }, | |||
|  |   }, | |||
|  | }; | |||
|  | </script> | |||
|  | 
 | |||
|  | <style lang="scss" scoped> | |||
|  | .history-page { | |||
|  |   height: 100vh; | |||
|  |   background-color: #ffffff; | |||
|  |   display: flex; | |||
|  |   flex-direction: column; | |||
|  |   position: relative; | |||
|  |   padding-top: 88rpx; | |||
|  | 
 | |||
|  |   .tab-container { | |||
|  |     display: flex; | |||
|  |     justify-content: space-between; | |||
|  |     align-items: center; | |||
|  |     position: relative; | |||
|  |   } | |||
|  | 
 | |||
|  |   .custom-tab { | |||
|  |     padding: 0 30rpx; | |||
|  |     margin: 24rpx 0; | |||
|  |     display: flex; | |||
|  |     justify-content: space-between; | |||
|  |     align-items: center; | |||
|  | 
 | |||
|  |     .tab-item { | |||
|  |       position: relative; | |||
|  |       padding: 12rpx 0; | |||
|  |       margin-right: 80rpx; | |||
|  |       cursor: pointer; | |||
|  | 
 | |||
|  |       .tab-text { | |||
|  |         font-size: 32rpx; | |||
|  |         font-weight: 500; | |||
|  |         color: #505866; | |||
|  |         letter-spacing: 0.04rpx; | |||
|  |       } | |||
|  | 
 | |||
|  |       &.active .tab-text { | |||
|  |         color: #4f6aff; | |||
|  |         font-weight: 600; | |||
|  |       } | |||
|  | 
 | |||
|  |       .tab-underline { | |||
|  |         position: absolute; | |||
|  |         bottom: 0; | |||
|  |         left: 50%; | |||
|  |         transform: translateX(-50%); | |||
|  |         right: 0; | |||
|  |         width: 80rpx; | |||
|  |         height: 4rpx; | |||
|  |         background-color: #4f6aff; | |||
|  |         border-radius: 2rpx; | |||
|  |       } | |||
|  |     } | |||
|  |   } | |||
|  | 
 | |||
|  |   .more-icon-container { | |||
|  |     width: 50rpx; | |||
|  |     height: 50rpx; | |||
|  |     margin-right: 30rpx; | |||
|  | 
 | |||
|  |     .more-icon { | |||
|  |       width: 50rpx; | |||
|  |       height: 10rpx; | |||
|  |       margin-right: 30rpx; | |||
|  |     } | |||
|  |   } | |||
|  | 
 | |||
|  |   /* 右上角更多菜单弹层 */ | |||
|  |   .more-menu { | |||
|  |     position: absolute; | |||
|  |     top: 80rpx; | |||
|  |     right: 30rpx; | |||
|  |     z-index: 100; | |||
|  |     background-color: #ffffff; | |||
|  |     border: 1rpx solid rgba(79, 106, 255, 0.12); | |||
|  |     border-radius: 24rpx; | |||
|  |     box-shadow: 0 8rpx 24rpx rgba(0, 0, 0, 0.08); | |||
|  |     padding: 24rpx 28rpx; | |||
|  |   } | |||
|  | 
 | |||
|  |   .menu-card { | |||
|  |     display: flex; | |||
|  |     align-items: center; | |||
|  |     gap: 6rpx; | |||
|  | 
 | |||
|  |     // .menu-icon {
 | |||
|  |     //   color: #FF647D;
 | |||
|  |     //   width: 32rpx;
 | |||
|  |     //   height: 32rpx;
 | |||
|  |     //   margin-right: 12rpx;
 | |||
|  |     // }
 | |||
|  | 
 | |||
|  |     .menu-text { | |||
|  |       font-size: 28rpx; | |||
|  |       color: #ff647d; | |||
|  |       letter-spacing: 2rpx; | |||
|  |     } | |||
|  |   } | |||
|  | 
 | |||
|  |   /* 点击其它区域关闭的遮罩(透明) */ | |||
|  |   .overlay { | |||
|  |     position: fixed; | |||
|  |     left: 0; | |||
|  |     top: 0; | |||
|  |     right: 0; | |||
|  |     bottom: 0; | |||
|  |     z-index: 99; | |||
|  |     background: rgba(0, 0, 0, 0); | |||
|  |   } | |||
|  | 
 | |||
|  |   .content-wrapper { | |||
|  |     padding: 30rpx; | |||
|  |     flex: 1; | |||
|  |     overflow-y: auto; | |||
|  |   } | |||
|  | 
 | |||
|  |   .history-list { | |||
|  |     .date-group { | |||
|  |       margin-bottom: 32rpx; | |||
|  |     } | |||
|  | 
 | |||
|  |     .date-header { | |||
|  |       font-size: 26rpx; | |||
|  |       color: #9aa0a8; | |||
|  |       margin-bottom: 16rpx; | |||
|  |       line-height: 1; | |||
|  |     } | |||
|  | 
 | |||
|  |     .history-item { | |||
|  |       display: flex; | |||
|  |       align-items: flex-start; | |||
|  |       padding: 24rpx 0; | |||
|  | 
 | |||
|  |       .item-checkbox { | |||
|  |         margin-right: 24rpx; | |||
|  |         padding-top: 8rpx; | |||
|  |         cursor: pointer; | |||
|  |         width: 48rpx; | |||
|  |         flex: 0 0 48rpx; /* 固定宽度,避免内容因显隐而抖动 */ | |||
|  | 
 | |||
|  |         .checkbox { | |||
|  |           width: 40rpx; | |||
|  |           height: 40rpx; | |||
|  |           border: 2rpx solid #d9d9d9; | |||
|  |           border-radius: 50%; | |||
|  |           display: flex; | |||
|  |           align-items: center; | |||
|  |           justify-content: center; | |||
|  |           background-color: #ffffff; | |||
|  | 
 | |||
|  |           &.checked { | |||
|  |             background-color: #ff4757; | |||
|  |             border-color: #ff4757; | |||
|  | 
 | |||
|  |             .checkmark { | |||
|  |               color: #ffffff; | |||
|  |               font-size: 22rpx; | |||
|  |               font-weight: bold; | |||
|  |             } | |||
|  |           } | |||
|  |         } | |||
|  |       } | |||
|  | 
 | |||
|  |       .item-content { | |||
|  |         flex: 1; | |||
|  | 
 | |||
|  |         .item-header { | |||
|  |           display: flex; | |||
|  |           align-items: center; | |||
|  |           margin-bottom: 24rpx; | |||
|  | 
 | |||
|  |           .item-icon { | |||
|  |             width: 48rpx; | |||
|  |             height: 48rpx; | |||
|  |             background-color: #4f6aff; | |||
|  |             border-radius: 50%; | |||
|  |             display: flex; | |||
|  |             align-items: center; | |||
|  |             justify-content: center; | |||
|  |             margin-right: 16rpx; | |||
|  | 
 | |||
|  |             .icon-text { | |||
|  |               color: #ffffff; | |||
|  |               font-size: 24rpx; | |||
|  |               font-weight: bold; | |||
|  |             } | |||
|  |           } | |||
|  | 
 | |||
|  |           .item-title { | |||
|  |             font-size: 32rpx; | |||
|  |             font-weight: bold; | |||
|  |             color: #333333; | |||
|  |             flex: 1; | |||
|  |           } | |||
|  |         } | |||
|  | 
 | |||
|  |         .item-description { | |||
|  |           letter-spacing: 0.04rpx; | |||
|  |           font-size: 28rpx; | |||
|  |           color: #666666; | |||
|  |           line-height: 1.5; | |||
|  |           margin-bottom: 12rpx; | |||
|  |           overflow: hidden; | |||
|  |           text-overflow: ellipsis; | |||
|  |           display: -webkit-box; | |||
|  |           -webkit-line-clamp: 3; | |||
|  |           -webkit-box-orient: vertical; | |||
|  |         } | |||
|  |       } | |||
|  |     } | |||
|  |   } | |||
|  | 
 | |||
|  |   .batch-actions { | |||
|  |     height: 130rpx; | |||
|  |     display: flex; | |||
|  |     justify-content: space-between; | |||
|  |     align-items: center; | |||
|  |     padding: 0 30rpx; | |||
|  |     border-top: 1rpx solid #eeeeee; | |||
|  | 
 | |||
|  |     .select-all-container { | |||
|  |       display: flex; | |||
|  |       align-items: center; | |||
|  |       cursor: pointer; | |||
|  | 
 | |||
|  |       .checkbox { | |||
|  |         width: 40rpx; | |||
|  |         height: 40rpx; | |||
|  |         border: 2rpx solid #d9d9d9; | |||
|  |         border-radius: 50%; | |||
|  |         display: flex; | |||
|  |         align-items: center; | |||
|  |         justify-content: center; | |||
|  |         background-color: #ffffff; | |||
|  | 
 | |||
|  |         &.checked { | |||
|  |           background-color: #ff4757; | |||
|  |           border-color: #ff4757; | |||
|  | 
 | |||
|  |           .checkmark { | |||
|  |             color: #ffffff; | |||
|  |             font-size: 22rpx; | |||
|  |             font-weight: bold; | |||
|  |           } | |||
|  |         } | |||
|  |       } | |||
|  | 
 | |||
|  |       .select-all-text { | |||
|  |         margin-left: 16rpx; | |||
|  |         font-size: 28rpx; | |||
|  |         color: #333333; | |||
|  |       } | |||
|  |     } | |||
|  | 
 | |||
|  |     .function-btn { | |||
|  |       display: flex; | |||
|  |       align-items: center; | |||
|  |       gap: 20rpx; | |||
|  | 
 | |||
|  |       .cancel-btn { | |||
|  |         background-color: #e5e3e3e4; | |||
|  |         color: #333333; | |||
|  |         padding: 16rpx 32rpx; | |||
|  |         border-radius: 16rpx; | |||
|  |         font-size: 28rpx; | |||
|  |         cursor: pointer; | |||
|  |       } | |||
|  |       .delete-btn { | |||
|  |         background-color: #ff4757; | |||
|  |         color: #ffffff; | |||
|  |         padding: 16rpx 32rpx; | |||
|  |         border-radius: 16rpx; | |||
|  |         font-size: 28rpx; | |||
|  |         cursor: pointer; | |||
|  |       } | |||
|  |     } | |||
|  |   } | |||
|  | } | |||
|  | </style> |