Softhub软件下载站实战开发(十八):软件分类展示

Softhub软件下载站实战开发(十八):软件分类展示 🖥️

在之前文章中,我们实现了后台管理相关部分,本篇文章开始我们来实现用户端页面,由于内网使用,不需要sso优化等特性,我们不采用nuxt,仍然是开发单页应用。

用户端项目概述

我们正在开发一个名为Softhub的现代化软件下载站,采用Vue 3 + Vite技术栈:

  • 前端架构:基于Vue 3的Composition API
  • UI框架:Naive UI + 自定义样式
  • 状态管理:Pinia集中式状态管理
  • 路由系统:Vue Router实现SPA导航
  • 图标系统:FontAwesome全图标支持

代码实现

导航栏

image.png

为了不显单调,我们为logo部分增加点特效

.logo {display: flex;align-items: center;margin-right: 40px;position: relative;cursor: pointer;transition: all 0.3s ease;
}.logo:hover {transform: scale(1.05) rotate(-2deg);
}.logo:hover .logo-main {text-shadow: 0 0 20px rgba(255, 255, 255, 0.8);transform: translateY(-2px) scale(1.1);font-size: 2rem;
}.logo:hover .logo-shadow {opacity: 0.8;transform: translateY(4px) scale(1.1);font-size: 2rem;
}.logo-text {position: relative;display: flex;flex-direction: column;align-items: center;
}.logo-main {font-size: 1.8rem;font-weight: 700;color: #fff;position: relative;z-index: 2;animation: float 3s ease-in-out infinite;transition: all 0.3s ease;text-shadow: 0 2px 4px rgba(0, 0, 0, 0.3);
}.logo-shadow {font-size: 1.8rem;font-weight: 700;color: rgba(255, 255, 255, 0.2);position: absolute;top: 2px;left: 0;z-index: 1;animation: float-shadow 3s ease-in-out infinite;transition: all 0.3s ease;filter: blur(1px);
}@keyframes float {0%, 100% {transform: translateY(0px);}50% {transform: translateY(-3px);}
}@keyframes float-shadow {0%, 100% {transform: translateY(2px);opacity: 0.2;}50% {transform: translateY(5px);opacity: 0.3;}
}/* 添加背景光效 */
.logo::before {content: '';position: absolute;top: -20px;left: -20px;right: -20px;bottom: -20px;background: radial-gradient(circle, rgba(255, 255, 255, 0.1) 0%, transparent 70%);opacity: 0;transition: opacity 0.3s ease;pointer-events: none;
}.logo:hover::before {opacity: 1;
}

这样,我们在移入移出logo的时候会有一个光晕倾斜效果,页面正常显示的时候会上下轻微浮动,增加两动感。

导航栏主要布局

AppHeader.vue

<template><header><div class="header-container"><div class="logo"><div class="logo-text"><span class="logo-main">SoftHub</span><span class="logo-shadow">SoftHub</span></div></div><ul class="main-nav"><li><router-link to="/" :class="{ active: $route.path === '/' }">首页</router-link></li><li><router-link to="/categories" :class="{ active: $route.path === '/categories' }">分类导航</router-link></li><li><router-link to="/resources" :class="{ active: $route.path === '/resources' }">资源集</router-link></li></ul><div class="search-box"><i class="fas fa-search"></i><inputtype="text"v-model="searchQuery"@keyup.enter="handleSearch"@input="handleInput"placeholder="搜索软件、工具、资源..."/></div></div></header>
</template>

主要layout

<template><div><AppHeader /><div class="main-container"><router-view /></div><!-- 软件详情弹窗 --><SoftwareDetailModalv-model:isVisible="isModalVisible":detail="selectedSoftware"@close="closeModal"/></div>
</template>

分类

分类请求逻辑

ComponentStoreAPI请求分类数据返回缓存数据发起网络请求返回分类数据返回新鲜数据alt[已有缓存][无缓存]ComponentStoreAPI

为减少复杂度,只支持二级分类

第一层为大分类,第二级为该领域细分分类

效果
image.png

<template><n-card title="分类"><n-space vertical size="large"><div><n-tag v-for="c in firstCategories" :key="c.id" :type="activeCategory === c.id ? 'primary' : 'default'" @click="selectCategory(c)" class="category-tag" style="cursor:pointer; margin-right: 8px;"><font-awesome-icon v-if="c.icon && getIconObject(c.icon)" :icon="getIconObject(c.icon)" class="category-icon"/><font-awesome-icon v-else :icon="['fas', 'folder']" class="category-icon"/>{{ c.categoryName }}</n-tag></div><div v-if="secondCategories.length"><n-tag v-for="sc in secondCategories" :key="sc.id" :type="activeSubCategory === sc.id ? 'primary' : 'default'" @click="selectSubCategory(sc)" class="subcategory-tag" style="margin-right: 8px;">{{ sc.categoryName }}</n-tag></div><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-paginationv-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"/></n-space></n-card>
</template>

在悬浮上tag分类时,分类也需要有一个明显的效果示意
image.png
我们需要为标签设计点样式,增强动画效果

.software-grid {display: grid;grid-template-columns: repeat(auto-fill, minmax(260px, 1fr));gap: 16px;margin-top: 24px;
}.category-tag {cursor: pointer;margin-right: 8px;transition: transform 0.2s cubic-bezier(0.4,0,0.2,1), box-shadow 0.2s cubic-bezier(0.4,0,0.2,1), background-color 0.2s;font-size: 1.1rem;padding: 0 18px;border-radius: 20px;margin-bottom: 8px;display: inline-flex;align-items: center;gap: 8px;
}.category-tag:hover {transform: translateY(-4px) scale(1.08) rotate(-2deg);box-shadow: 0 4px 16px rgba(58, 123, 213, 0.15);
}.category-tag:not(.n-tag--primary-type):hover {background-color: #3a7bd5;color: #fff;
}.category-icon {margin-right: 4px;font-size: 1rem;
}.subcategory-tag {cursor: pointer;margin-right: 8px;transition: transform 0.18s cubic-bezier(0.4,0,0.2,1), box-shadow 0.18s cubic-bezier(0.4,0,0.2,1), background-color 0.18s;font-size: 1rem;padding: 0 14px;border-radius: 16px;margin-bottom: 6px;
}.subcategory-tag:hover {transform: translateY(-2px) scale(1.05);box-shadow: 0 2px 8px rgba(58, 123, 213, 0.1);
}.subcategory-tag:not(.n-tag--primary-type):hover {background-color: #3a7bd5;color: #fff;
}

关键动画效果

元素动画效果实现方式
Logo悬浮放大+阴影transform + text-shadow
导航菜单下划线滑入::after伪元素 + scaleX动画
搜索框聚焦放大transform: scale(1.05)

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设计

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/pingmian/89606.shtml
繁体地址,请注明出处:http://hk.pswp.cn/pingmian/89606.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

linux--------------------BlockQueue的生产者消费模型

1.基础BlockingQueue的生产者消费模型 1.1 BlockQueue 在多线程编程中阻塞队列是一种常用于实现生产者和消费者模型的数据结构&#xff0c;它与普通的队列区别在于&#xff0c;当队列为空时&#xff0c;从队列获取元素的操作将被阻塞&#xff0c;直到队列中放入了新的数据。当…

堆排序算法详解:原理、实现与C语言代码

堆排序&#xff08;Heap Sort&#xff09;是一种高效的排序算法&#xff0c;利用二叉堆数据结构实现。其核心思想是将待排序序列构造成一个大顶堆&#xff08;或小顶堆&#xff09;&#xff0c;通过反复调整堆结构完成排序。下面从原理到实现进行详细解析。一、核心概念&#x…

SSM框架——注入类型

引用类型的注入&#xff1a;Setter方法简单类型的注入&#xff1a;定义简单实例和方法在配置文件中对bean进行配置&#xff0c;使用porperty属性 值用value&#xff08;ref是用来获取bean的&#xff09;构造器方法&#xff1a;构造器方法中需要写name&#xff0c;这样程序就会耦…

信息学奥赛一本通 1552:【例 1】点的距离

【题目链接】 ybt 1552&#xff1a;【例 1】点的距离 【题目考点】 1. 最近公共祖先&#xff08;LCA&#xff09;&#xff1a;倍增求LCA 知识点讲解见&#xff1a;洛谷 P3379 【模板】最近公共祖先&#xff08;LCA&#xff09; 【解题思路】 首先用邻接表保存输入的无权图…

1Panel中的OpenResty使用alias

问题 在服务器上使用了1Panel的OpenResty来管理网站服务&#xff0c;当作是一个Nginx用&#xff0c;想做一个alias来直接管理某个文件夹的文件&#xff0c;于是直接在其中一个网站中使用了alias配置。 location /upload {alias /root/upload;autoindex on;charset utf-8;charse…

小明记账簿焕新记:从单色到多彩的主题进化之路

【从冷静蓝到多彩世界&#xff0c;这一次我们重新定义记账美学】 曾经&#xff0c;打开“小明记账簿”是一片沉稳的蓝色海洋&#xff0c;它像一位理性的财务管家&#xff0c;默默守护着你的每一笔收支。但总有人悄悄问&#xff1a;“能不能多一些颜色&#xff1f;”今天&#x…

Apache IoTDB(1):时序数据库介绍与单机版安装部署指南

目录一、Apache IoTDB 是什么&#xff1f;1.1 产品介绍1.2 产品体系1.3 产品架构二、IoTDB 环境配置2.1 Linux系统需准备环境2.2 Windows系统需准备环境2.3 网络配置2.3.1 关闭防火墙2.3.2 查看端口是否占用2.3.3 避雷经验三、IoTDB 单机版系统部署安装指南3.1 产品下载3.2 注意…

Python 图片爬取入门:从手动下载到自动批量获取

前言 想批量下载网页图片却嫌手动保存太麻烦&#xff1f;本文用 Python 带你实现自动爬取&#xff0c;从分析网站到代码运行&#xff0c;步骤清晰&#xff0c;新手也能快速上手&#xff0c;轻松搞定图片批量获取。 1.安装模块 在开始爬取图片前&#xff0c;我们需要准备好工具…

aspect-ratio: 1 / 1样式在部分手机浏览器中失效的问题怎么解决?

最近在uniapp开发时又遇到了安卓手机不兼容问题&#xff0c;ios系统无影响。开发背景&#xff1a;小编想通过网格布局来实现答题卡的布局&#xff0c;实现五列多行的形式。代码片段&#xff1a;<view class"question-grid"><viewv-for"(question, inde…

RecyclerView与ListView深度对比分析

1. 使用流程对比ListView: 布局XML&#xff1a; 在布局文件中放置 <ListView> 控件&#xff0c;指定 id (如 android:id"id/listView")。数据适配器 (Adapter)&#xff1a; 继承 BaseAdapter 或 ArrayAdapter / CursorAdapter / SimpleAdapter。 重写 getCount…

deepseekAI对接大模型的网页PHP源码带管理后台(可实现上传分析文件)

前端后端都已进行优化&#xff0c;新增可上传文件功能&#xff08;拖拽进去也可以&#xff09;&#xff0c;后端进行风格主题设置&#xff0c;优化数据结构&#xff01;依旧测试网站&#xff1a;iEPMS我的工具箱&#xff0c;你的智慧助手&#xff01;还是那句话兄弟们轻点搞我的…

NJU 凸优化导论(9) 对偶(II)KKT条件+变形重构

https://www.lamda.nju.edu.cn/chengq/optfall24/slides/Lecture_9.pdf 目录 关于对偶的一些解释 1. Max-min characterization 最大最小准则 2. Saddle-point Interpretation 鞍点解释 3. Game interpretation 博弈论里的对偶 Optimality Conditions 最优条件 1. Certi…

Vue Swiper组件

Vue 渐进式JavaScript 框架 基于Vue2的学习笔记 - Vue Swiper组件实现笔记 目录 Swiper组件 下载swiper 创建swiper组件 保存时修复 编写swiper内容 引入swiper 使用swiper Swiper子组件 创建Swiper列表组件 使用子组件 增加生命周期 增加图片显示 加载数据 渲染…

Linux:lvs集群技术

一.集群和分布式1.1 集群集群是为了解决某个特定问题将多台计算机组合起来形成的单个系统。即当单独一台主机无法承载现有的用户请求量&#xff1b;或者一台主机因为单一故障导致业务中断的时候&#xff0c;就可以增加服务主机数&#xff0c;这些主机在一起提供服务&#xff0c…

【管理】持续交付2.0:业务引领的DevOps-精要增订本,读书笔记(理论模型,技术架构,业务价值)

【管理】持续交付2.0&#xff1a;业务引领的DevOps-精要增订本&#xff0c;读书笔记&#xff08;理论模型&#xff0c;技术架构&#xff0c;业务价值&#xff09; 文章目录1、持续交付的理论模型&#xff08;第1-3章&#xff09;1.1 结构图1.2 持续交付的演进1.3 双环模型理论体…

Wilcox检验的星星怎么规定的?

在 R 里&#xff0c;常见的把 p 值映射为“星号”标记&#xff08;显著性水平&#xff09;的规则通常是&#xff1a;p 值范围标记p ≤ 0.0001“****”0.0001 < p ≤ 0.001“***”0.001 < p ≤ 0.01“**”0.01 < p ≤ 0.05“*”0.05 < p ≤ 0.1“.”p > 0.1…

https与DNS的运行流程

HTTPS流程&#xff1a;HTTPS核心:加了TLS层&#xff0c;加密传输身份认证TLS:信息加密、校验机制、身份证书TLS&#xff08;Transport Layer Security&#xff09;握手是建立安全通信通道的关键过程&#xff0c;发生在客户端&#xff08;如浏览器&#xff09;和服务器之间。其主…

板子 5.29--7.19

板子 5.29–7.19 目录 1. 树状数组 2. KMP 3. 矩阵快速幂 4. 数位DP 5. 状压枚举子集 6. 快速幂&#xff08;新版 7. priority_queue 8. dijkstra 9. 单调栈 10. debug内容 1. 树状数组 // 树状数组 快速求前缀和 / 前缀最大值 // 维护位置数量(离散化)...// (区间加 区间求和…

min-max容斥学习笔记

最近报了航电的春季赛&#xff0c;在一道题目里面遇到了做法&#xff0c;感觉挺有意思。 考虑一个&#xff08;多重&#xff09;集合S{ai}S\{a_i\}S{ai​}&#xff0c;有如下的等式成立 min⁡ai∈S(ai)∑T⊆S,T≠∅(−1)∣T∣−1max⁡ai∈T(ai)\min_{a_i\in S}(a_i)\sum_{T\sub…

使用帆软制作项目

https://zhuanlan.zhihu.com/p/23429318335 项目背景 为加快大数据体系建设&#xff0c;稳步推进数字化转型战略&#xff0c;规范数据架构体系和数据治理体系&#xff0c;运用大数据推进全行数字化转型建设&#xff0c;为业务发展提供创新动力&#xff0c;目标是利用金融科技和…