Softhub軟件下載站實戰開發(十九):軟件信息展示

上一篇文章中我們上線了軟件分離展示,本篇文章我們聚焦軟件信息展示

軟件列表信息展示

soft.gif

  • 點擊一級分類查詢該分類下所以軟件
  • 分類切換要有動畫效果
  • 分頁支持

核心實現

<transition-grouptag="div"class="software-grid"@before-enter="beforeEnter"@enter="enter":css="false">
<div v-for="(item, index) in softwareList" :key="item.id" :data-index="index"><SoftwareCard :software="item" @download="onDownload" @show-detail="showSoftwareDetail" />
</div>
</transition-group>
<n-pagination
v-if="total > pageSize"
v-model:page="page"
:page-size="pageSize"
:page-count="Math.ceil(total / pageSize)"
style="margin-top: 24px; text-align: center;"
@update:page="handlePageChange"
/>

軟件詳情信息展示

點擊展示詳情

detail1.gif

懸浮顯示默認資源
image.png

核心實現

<template><div class="software-card-wrapper"><n-card class="software-card" hoverable @click="showDetail"@mouseenter="handleMouseEnter"@mouseleave="handleMouseLeave"><div class="card-content"><div class="card-icon-img" :class="{ 'no-cover': !hasCover || imageError }"><template v-if="hasCover && !imageError"><img :src="coverImageUrl" width="72" height="72" :alt="software.softwareName"@error="handleImageError"@load="handleImageLoad"/></template><template v-else><div class="placeholder-cover">{{ software.softwareName ? software.softwareName.charAt(0).toUpperCase() : 'S' }}</div></template></div><div class="card-details"><div class="software-name" :title="software.softwareName">{{ software.softwareName }}</div><n-text depth="3" class="software-remark" :title="software.remark || '暫無備注'">{{ software.remark || '暫無備注' }}</n-text></div></div></n-card><!-- 懸浮彈框 - 移到卡片外部 --><n-popover :show="isHovered" placement="right" :show-arrow="true":trigger="'manual'":keep-alive-on-hover="true"@mouseenter="handlePopoverEnter"@mouseleave="handlePopoverLeave"><template #trigger><div class="card-trigger-area"></div></template><div class="software-popover"><div class="popover-header"><div class="popover-title">{{ software.softwareName }}</div><div class="popover-desc">{{ software.remark || '暫無描述' }}</div></div><div class="popover-content"><!-- 加載狀態 --><div v-if="loadingResource" class="loading-resource"><n-spin size="small" /><span>加載資源信息...</span></div><!-- 有默認資源 --><template v-else-if="defaultResource"><div class="resource-item"><div class="resource-info"><div class="resource-name">{{ defaultResource.resourceName || defaultResource.originName || '默認資源' }}</div><div class="resource-meta"><span class="resource-size">{{ formatBytes(defaultResource.size) }}</span><span class="resource-version" v-if="defaultResource.version">|v{{ defaultResource.version }}</span></div></div><n-icon class="download-icon" @click.stop="downloadDefaultResource"title="下載資源"><CloudDownloadOutline /></n-icon></div></template><!-- 無默認資源 --><template v-else><div class="no-resource"><n-icon class="no-resource-icon"><CloudDownloadOutline /></n-icon><span>暫無可下載資源</span></div></template></div></div></n-popover></div>
</template>

軟件搜索

image.png

核心實現

<template><div class="content-container"><div class="search-header"><div class="search-info"><h2 class="search-title">搜索結果</h2><p class="search-summary">關鍵詞 "{{ keyword }}" 共找到 {{ total }} 個軟件</p></div></div><!-- 加載狀態 --><div v-if="loading" class="loading-container"><n-spin size="large" /><p>搜索中...</p></div><!-- 空狀態 --><div v-else-if="softwareList.length === 0" class="empty-container"><n-empty description="未找到相關軟件" /></div><!-- 搜索結果 --><div v-else class="search-results"><transition-group tag="div" class="software-grid"@before-enter="beforeEnter"@enter="enter":css="false"><div v-for="(software, index) in softwareList" :key="software.id" :data-index="index"><SoftwareCard:software="software"@show-detail="showSoftwareDetail"@download="downloadSoftware"/></div></transition-group><!-- 分頁 --><div class="pagination-container"><n-paginationv-if="total > pageSize"v-model:page="page":page-size="pageSize":page-count="Math.ceil(total / pageSize)":item-count="total"show-size-picker:page-sizes="[12, 20, 50, 100]"@update:page="handlePageChange"@update:page-size="handlePageSizeChange"/></div></div></div>
</template>

首頁展示

首頁目前展示每個大分類前20個軟件
image.png

<template><div class="home-container"><!-- 加載狀態 --><div v-if="loading" class="loading-container"><n-spin size="large" /><p>加載軟件列表中...</p></div><!-- 空狀態 --><div v-else-if="categoryList.length === 0" class="empty-container"><n-empty description="暫無軟件分類" /></div><!-- 分類和軟件列表 --><div v-else class="categories-container"><div v-for="categoryData in categoryList" :key="categoryData.category.id" class="category-section"><!-- 分類標題 --><div class="category-header"><div class="category-title"><font-awesome-icon v-if="categoryData.category.icon && getIconObject(categoryData.category.icon)" :icon="getIconObject(categoryData.category.icon)" class="category-icon"/><font-awesome-icon v-else :icon="['fas', 'folder']" class="category-icon"/><h2>{{ categoryData.category.categoryName }}</h2></div></div><!-- 軟件列表 --><transition-group v-if="categoryData.softwareList && categoryData.softwareList.length > 0" tag="div" class="software-grid"@before-enter="beforeEnter"@enter="enter":css="false"><div v-for="(software, index) in categoryData.softwareList":key="software.id":data-index="index"><SoftwareCard:software="software"@download="onDownload"@show-detail="showSoftwareDetail"/></div></transition-group><!-- 分類內無軟件 --><div v-else class="category-empty"><n-empty description="該分類暫無軟件" size="small" /></div></div></div></div>
</template>

資源集列表

image.png
image.png

如果軟件包含在資源集中,也可以直接跳轉過去,查詢該資源集下其它軟件
image.png

核心實現

<template><div class="content-container"><!-- 資源集列表 --><div v-if="!selectedResourceSet" class="resources-grid"><div v-if="loading" class="loading-container"><n-spin size="large" /><p>加載資源集中...</p></div><div v-else-if="resourceSets.length === 0" class="empty-container"><n-empty description="暫無資源集" /></div><divv-elsev-for="resourceSet in resourceSets":key="resourceSet.id"class="resource-card"@click="selectResourceSet(resourceSet)"><div class="resource-image"><font-awesome-icon v-if="getIconObject(resourceSet.icon)" :icon="getIconObject(resourceSet.icon)" class="icon"/><font-awesome-icon v-else :icon="['fas', 'folder']" class="icon"/></div><div class="resource-info"><h3>{{ resourceSet.name }}</h3><p>{{ resourceSet.description || resourceSet.remark || '暫無描述' }}</p><div class="resource-meta"><span><i class="fas fa-cube"></i> {{ resourceSet.softwareCount || 0 }}個軟件</span></div></div></div></div><!-- 資源集詳情 --><div v-else class="resource-detail"><div class="resource-header"><div class="breadcrumb-simple"><span class="breadcrumb-link" @click="backToList">資源集</span><span class="breadcrumb-separator">/</span><span class="breadcrumb-current">{{ selectedResourceSet.name }}</span></div><div class="resource-header-content"><h2 class="resource-title">{{ selectedResourceSet.name }}</h2><p class="resource-description">{{ selectedResourceSet.description || selectedResourceSet.remark || '暫無描述' }}</p></div></div><div v-if="loadingSoftware" class="loading-container"><n-spin size="large" /><p>加載軟件列表中...</p></div><div v-else-if="softwareList.length === 0" class="empty-container"><n-empty description="該資源集暫無軟件" /></div><transition-group v-else tag="div" class="software-grid"@before-enter="beforeEnter"@enter="enter":css="false"><div v-for="(software, index) in softwareList" :key="software.id" :data-index="index"><SoftwareCard:software="software"@show-detail="showSoftwareDetail"@download="downloadSoftware"/></div></transition-group></div></div>
</template>

softhub系列往期文章

  1. Softhub軟件下載站實戰開發(一):項目總覽
  2. Softhub軟件下載站實戰開發(二):項目基礎框架搭建
  3. Softhub軟件下載站實戰開發(三):平臺管理模塊實戰
  4. Softhub軟件下載站實戰開發(四):代碼生成器設計與實現
  5. Softhub軟件下載站實戰開發(五):分類模塊實現
  6. Softhub軟件下載站實戰開發(六):軟件配置面板實現
  7. Softhub軟件下載站實戰開發(七):集成MinIO實現文件存儲功能
  8. Softhub軟件下載站實戰開發(八):編寫軟件后臺管理
  9. Softhub軟件下載站實戰開發(九):編寫軟件配置管理界面
  10. Softhub軟件下載站實戰開發(十):實現圖片視頻上傳下載接口
  11. Softhub軟件下載站實戰開發(十一):軟件分片上傳接口實現
  12. Softhub軟件下載站實戰開發(十二):軟件管理編輯頁面實現
  13. Softhub軟件下載站實戰開發(十三):軟件管理前端分片上傳實現
  14. Softhub軟件下載站實戰開發(十四):軟件收藏集設計
  15. Softhub軟件下載站實戰開發(十五):儀表盤API設計
  16. Softhub軟件下載站實戰開發(十六):儀表盤前端設計與實現
  17. Softhub軟件下載站實戰開發(十七):用戶端API設計
  18. Softhub軟件下載站實戰開發(十八):軟件分類展示

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/89868.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/89868.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/89868.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

[HDLBits] Cs450/gshare

Branch direction predictor 分支方向預測器 A branch direction predictor generates taken/not-taken predictions of the direction of conditional branch instructions. It sits near the front of the processor pipeline, and is responsible for directing instructio…

[學習] 雙邊帶調制 (DSB) 與單邊帶調制 (SSB) 深度對比

雙邊帶調制 (DSB) 與單邊帶調制 (SSB) 深度對比 文章目錄雙邊帶調制 (DSB) 與單邊帶調制 (SSB) 深度對比**數學原理****調制表達式與頻譜****時域特性****頻域特性****Python 仿真代碼****仿真結果分析****工程應用建議**數學原理 設基帶信號為 m(t)m(t)m(t)&#xff08;帶寬為…

Gitee 提交信息的規范

在使用 git push 命令將代碼推送到 Gitee&#xff08;或任何 Git 平臺&#xff09;時&#xff0c;引號中的信息通常指的是 提交信息&#xff08;Commit Message&#xff09;。提交信息是對本次代碼修改的簡要描述&#xff0c;規范的提交信息有助于團隊協作和版本管理。 Gitee 提…

C 語言經典編程題實戰:從基礎算法到趣味問題全解析

在 C 語言學習過程中&#xff0c;通過實戰編程題鞏固知識點是非常有效的方式。本文整理了一系列經典 C 語言編程題&#xff0c;涵蓋基礎計算、邏輯判斷、圖形打印等多個維度&#xff0c;并附上完整代碼與解析&#xff0c;適合初學者參考學習上機題1.計算n以內所有正奇數的和 ?…

Chapter 3 Design of Switching Power Regulators

Chapter 3 Design of Switching Power Regulators Power Management Techniques for Integrated Circuit Design by Ke-Horng Chen 這本書比較深, 簡單介紹基本概念后, 就直接拋出大段公式和結論, 一章講其他書幾章內容, 適合有一定基礎, 想進一步做電源系統的人查閱. 優點是不…

算法題(176):three states

審題&#xff1a; 本題需要我們找到最佳鋪設道路&#xff0c;將三個國家聯通起來&#xff0c;然后輸出最佳鋪設道路的鋪設數量&#xff0c;若沒有聯通方法則輸出-1 思路&#xff1a; 首先我們正面思考&#xff1a;只需從某個點出發然后搜索到三個國家即可&#xff0c;最后對比所…

BIOS+MBR微內核加載loader程序實現過程

上一篇講到的微內核程序是由BIOS例程自動加載到內存中運行的,而且大小有限,能做的事情有限。我們知道內核程序大小是可以擴展的不能只有512字節,同時在加載運行內核前還需要完成一些必要的實模式下才能做的準備工作。所以單純在實模式下只使用微內核程序是不太夠的,就有了加…

使用Proxy設計模式來增強類的功能:ToastProxy和DesktopToast的設計關系

使用代理模式來增強類的功能&#xff1a;ToastProxy和DesktopToast Documentation: v1.0.0 Specified for Version v1.12.0&#xff0c;First Release in 2025/7/12 Documenation belongs to Projects: Charliechen114514/CCIMXDesktop: This is a Simple Desktop with Common …

瑞芯微2025開發者大會之見聞

序言本人參加了2025年的瑞芯微開發者大會&#xff0c;在展覽區看到了很多有意思的音視頻產品&#xff0c;下面按照產品類型分類給大家做一下展示。期間并沒有將所有展出物進行拍攝&#xff0c;但是基本已經覆蓋大部分內容。1、RK3566該芯片內置DSP音頻處理器&#xff0c;藍牙5.…

【最新】Java的幾種設計模式詳解及適用業務場景

? 1. 單例模式&#xff08;Singleton&#xff09; 定義&#xff1a;確保類只有一個實例&#xff0c;并提供全局訪問點。優點&#xff1a;節省資源、控制訪問。場景&#xff1a;數據庫連接池、日志管理器、配置中心。代碼要點&#xff1a; 構造方法私有靜態變量保存唯一實例公共…

單鏈表的手動實現+相關OJ題

目錄 鏈表的介紹 單鏈表的手動實現 單鏈表的基本框架 打印鏈表&#xff1a; 獲取表長&#xff1a; 頭插法新增節點&#xff1a; 尾插法新增節點&#xff1a; 在指定下標插入&#xff1a; 鏈表的查找 刪除鏈表中第一個出現的key&#xff1a; 刪除鏈表中所有key值 鏈表…

梯度提升之原理

簡介 梯度提升主要是基于數學最值問題 數學描述 目標函數為 obj(θ)∑i1nl(yi,y^i(t))∑k1tw(fk)obj(\theta) \sum_{i1}^n l(y_i, \hat y_i^{(t)}) \sum_{k1}^t w(f_k)obj(θ)i1∑n?l(yi?,y^?i(t)?)k1∑t?w(fk?) 其中ttt表示集成的樹的個數&#xff0c;y^i(t)y^i(t?1)…

[學習] Hilbert變換:從數學原理到物理意義的深度解析與仿真實驗(完整實驗代碼)

Hilbert變換&#xff1a;從數學原理到物理意義的深度解析與仿真實驗 文章目錄Hilbert變換&#xff1a;從數學原理到物理意義的深度解析與仿真實驗一、數學原理二、作用與物理意義1.構造解析信號2.相位移動特性3.應用場景三、仿真實驗實驗1&#xff1a;正弦信號的Hilbert變換實驗…

對話弋途科技:當AI重構汽車大腦,一場車載操作系統的“覺醒年代“開始了

&#xff08;圖片來源&#xff1a;Pixels&#xff09;站在未來看歷史&#xff0c;AI汽車剛剛開始。數科星球原創作者丨苑晶編輯丨大兔當特斯拉的自動駕駛仍在全球引發爭議時&#xff0c;中國智能汽車戰場已悄然開啟第二幕。從"四個輪子的大手機"到"移動智能空間…

?機器學習量化交易模型全面剖析報告基于因子庫的機器學習交易模型構建指南

目錄 第一章&#xff1a;機器學習在加密貨幣量化交易中的應用概述 范式轉變&#xff1a;從傳統因子到機器學習驅動的策略 為什么選擇機器學習&#xff1f;機遇、挑戰與核心概念 機遇 挑戰 核心概念 第二章&#xff1a;為機器學習準備您的因子庫 理解量化因子作為機器學…

內容創作智能體:多模態內容生成的完整解決方案

內容創作智能體&#xff1a;多模態內容生成的完整解決方案 &#x1f31f; 嗨&#xff0c;我是IRpickstars&#xff01; &#x1f30c; 總有一行代碼&#xff0c;能點亮萬千星辰。 &#x1f50d; 在技術的宇宙中&#xff0c;我愿做永不停歇的探索者。 ? 用代碼丈量世界&…

測試學習之——Pytest Day4

Pytest作為Python中功能強大且易于使用的測試框架&#xff0c;深受開發者喜愛。它不僅提供了簡潔的測試編寫方式&#xff0c;還通過豐富的配置選項、靈活的標記機制和強大的數據驅動能力&#xff0c;極大地提升了測試效率和可維護性。本文將深入探討Pytest的配置意義與層級、常…

【軟件系統架構】系列七:系統性能——路由器性能深入解析

目錄 一、路由器的核心功能 二、路由器性能核心指標 1. 吞吐量&#xff08;Throughput&#xff09; 2. 并發連接數&#xff08;Session Capacity&#xff09; 3. 每秒連接數&#xff08;CPS&#xff0c;Connections Per Second&#xff09; 4. 轉發延遲&#xff08;Laten…

【數據結構】第一講 —— 概論

【數據結構】第一講 —— 概論 文章目錄【數據結構】第一講 —— 概論1.1 基本概念和常用術語1.2 了解數據結構1. 數據結構2. 數據的邏輯結構3. 數據的物理結構&#xff08;存儲結構&#xff09;4. 數據的運算1.3 算法的描述和分析1.3.1 算法的描述1.3.21.1 基本概念和常用術語…

全面解析MySQL(2)——CRUD基礎

1.CreateCreate(創建)&#xff1a;添加新數據到數據庫中#基礎語法 insert into table_name (column1,column2,column3, ...) values (value1,value2,value3, ...);1.1 單行全列插入value中值的數量和順序必須和column?致describe demo1; -----------------------------------…