news 2026/4/28 8:23:21

企业级门户网站设计与实现:基于SpringBoot + Vue3的全栈解决方案(Day 6)

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
企业级门户网站设计与实现:基于SpringBoot + Vue3的全栈解决方案(Day 6)

交互优化与数据动态化

前言

前五天的开发工作完成了项目的基础架构、首页开发、文章列表页面、文章详情页面、公共组件抽离和功能完善。第六天的开发工作将重点关注交互优化与数据动态化,包括顶部导航激活状态优化、热门分类动态数据完善、热门文章动态数据获取以及UI细节优化,进一步提升用户体验和代码质量。

一、顶部导航交互优化

1. 一级栏目点击效果优化

问题描述

之前的实现中,有二级导航的一级栏目使用了cursor-not-allowed样式来表示不可点击,但这个效果不够美观,影响用户体验。

解决方案

移除cursor-not-allowed样式,改用@click.prevent阻止默认跳转行为,同时保持鼠标划过效果:

<!-- 桌面导航 - 有二级导航的一级栏目 --> <div v-if="item.children && item.children.length > 0" class="relative group"> <a href="#" @click.prevent :class="['px-3 py-2 text-sm font-medium flex items-center gap-1 relative', activeNavId === item.id ? 'text-bank-primary bg-slate-50 rounded-md' : 'text-slate-600 hover:text-bank-primary hover:bg-slate-50 rounded-md transition-colors']"> {{ item.name }} <svg class="w-4 h-4" fill="none" stroke="currentColor" viewBox="0 0 24 24"> <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M19 9l-7 7-7-7" /> </svg> </a> </div>
移动端菜单优化

移动端的一级栏目使用@click.preventcursor-pointer样式:

<!-- 移动菜单 - 有二级导航的一级栏目 --> <div v-if="item.children && item.children.length > 0"> <div @click.prevent :class="['block px-3 py-2 text-base font-medium cursor-pointer', activeNavId === item.id ? 'text-bank-primary bg-slate-50 rounded-md' : 'text-slate-700 hover:text-bank-primary']"> {{ item.name }} </div> <a v-for="child in item.children" :key="child.id" :href="`/list?categoryId=${child.id}`" :class="['block px-6 py-2 text-base font-medium pl-4 border-l-2 border-slate-200', activeNavId === child.id ? 'text-bank-primary bg-slate-50' : 'text-slate-600 hover:text-bank-primary']"> {{ child.name }} </a> </div>

2. 路由感知的激活状态

使用 Vue Router 的useRoute获取当前路由信息,根据路由路径和参数动态判断激活状态:

import { useRoute } from 'vue-router'; const route = useRoute(); const activeNavId = computed(() => { // 首页路径 if (route.path === '/') { return '2045904451398049793'; // 首页栏目ID } // 文章列表页面,从URL参数获取categoryId if (route.path === '/list' && route.query.categoryId) { const categoryId = route.query.categoryId; // 如果是二级栏目,返回对应的一级栏目ID if (childToParentMap.value[categoryId]) { return childToParentMap.value[categoryId]; } return categoryId; } return ''; });

3. 二级栏目到一级栏目的映射

构建映射表,实现选择二级栏目时高亮对应的一级栏目:

const childToParentMap = ref({}); navList.value.forEach(parent => { if (parent.children) { parent.children.forEach(child => { childToParentMap.value[child.id] = parent.id; }); } });

二、热门分类动态数据

1. 功能需求

首页的热门分类板块需要动态显示每个一级栏目下的前四个二级栏目及其文章数量,点击"查看全部"跳转到所有栏目的文章列表。

2. 核心函数实现

// 根据栏目名称获取前四个二级栏目 function getTopFourSubcategories(categoryName) { const category = fullNavList.value.find(item => item.name === categoryName && item.level === 1); if (category) { const childCategories = fullNavList.value.filter(item => item.pid === category.id); return childCategories .sort((a, b) => (categoryArticleCounts.value[b.id] || 0) - (categoryArticleCounts.value[a.id] || 0)) .slice(0, 4); } return []; } // 根据栏目ID获取文章数量 function getArticleCountById(categoryId) { return categoryArticleCounts.value[categoryId] || 0; } // 根据栏目名称获取栏目ID function getCategoryIdByName(categoryName) { const category = fullNavList.value.find(item => item.name === categoryName && item.level === 1); return category ? category.id : ''; }

3. 模板修改

<!-- Tech Category --> <div class="bg-white rounded-xl bank-card-shadow overflow-hidden"> <div class="p-4 flex items-center gap-3 bg-blue-500"> <div class="w-10 h-10 rounded-lg bg-white/20 flex items-center justify-center"> <i>三、底部组件复用

1. 组件抽离

将首页的底部 footer 代码抽离成独立的Footer.vue组件,便于统一管理和维护。

2. 组件使用

修改 Home.vue,移除重复的 footer 代码,改为引用 Footer 组件:

<template> <div class="font-sans antialiased bg-slate-50 min-h-screen"> <!-- Header --> <Header /> <!-- Main Content --> <main> <!-- 内容区域 --> </main> <!-- Footer --> <Footer /> </div> </template> <script setup> import Header from '../components/Header.vue'; import Footer from '../components/Footer.vue'; </script>

四、热门文章动态数据

1. API 函数添加

article.ts中添加通过iz_hot字段筛选热门文章的 API 函数:

/** * 获取热门文章(通过iz_hot字段筛选) * @param limit 数量限制 * @returns Promise<any> */ export const getHotArticlesByHotFlag = (limit: number = 5) => { return defHttp.get({ url: Api.GetArticleList, params: { izHot: '1', pageNo: 1, pageSize: limit, column: 'publishTime', order: 'desc' } }); };

2. ArticleList.vue 实现

// 热门文章数据 const hotArticles = ref([]); // 获取热门文章(通过iz_hot字段筛选) async function fetchHotArticles() { try { const response = await getHotArticlesByHotFlag(5); if (response.success && response.result) { hotArticles.value = response.result.records || []; } else { hotArticles.value = []; } } catch (error) { console.error('获取热门文章失败:', error); hotArticles.value = []; } } // 组件挂载时执行 onMounted(() => { fetchNavList(); fetchArticles(); fetchHotArticles(); initLucideIcons(); });

3. ArticleDetail.vue 实现

// 热门文章 const hotArticles = ref([]); // 获取热门文章(通过iz_hot字段筛选) async function fetchHotArticles() { try { const response = await getHotArticlesByHotFlag(5); if (response.success && response.result) { hotArticles.value = (response.result.records || []).map(item => ({ id: item.id, title: item.title, views: item.clickCount || 0 })); } else { hotArticles.value = []; } } catch (error) { console.error('获取热门文章失败:', error); hotArticles.value = []; } }

4. 模板修改

<!-- Hot Articles --> <div class="bg-white rounded-xl border border-slate-200 p-4"> <h3 class="text-sm font-semibold text-slate-800 mb-4">热门文章</h3> <ul class="space-y-4"> <li v-for="(article, index) in hotArticles" :key="article.id" class="flex items-start gap-3"> <span :class="['flex-shrink-0 w-6 h-6 rounded-full flex items-center justify-center text-xs font-medium', index === 0 ? 'bg-bank-primary text-white' : 'bg-slate-200 text-slate-600']">{{ index + 1 }}</span> <div class="flex-1 min-w-0"> <a :href="'/article/' + article.id" class="text-sm text-slate-700 hover:text-bank-primary transition-colors line-clamp-2"> {{ article.title }} </a> <div class="text-xs text-slate-400 mt-1">{{ article.views || 0 }} 阅读</div> </div> </li> </ul> </div>

五、UI 细节优化

1. 热门文章间距调整

增加文章标题之间的上下行间距,提升阅读体验:

<ul class="space-y-4"> <!-- 之前是 space-y-3 --> ... </ul>

2. 热门文章卡片样式

使用flex-1 min-w-0确保长标题正确换行:

<div class="flex-1 min-w-0"> <a :href="'/article/' + article.id" class="text-sm text-slate-700 hover:text-bank-primary transition-colors line-clamp-2"> {{ article.title }} </a> <div class="text-xs text-slate-400 mt-1">{{ article.views || 0 }} 阅读</div> </div>

六、项目结构

经过六天的开发,项目结构如下:

fintech-vue3/ ├── src/ │ ├── api/ │ │ ├── article.ts # 文章相关API │ │ └── nav.ts # 导航相关API │ ├── components/ │ │ ├── Footer.vue # 底部公共组件 │ │ └── Header.vue # 顶部导航公共组件 │ ├── pages/ │ │ ├── Home.vue # 首页 │ │ ├── ArticleList.vue # 文章列表页 │ │ └── ArticleDetail.vue # 文章详情页 │ ├── router/ │ │ └── index.js # 路由配置 │ ├── utils/ │ │ └── http/ │ │ └── axios.ts # HTTP请求封装 │ ├── style.css # 全局样式 │ ├── App.vue # 根组件 │ └── main.js # 入口文件 ├── public/ │ └── index.html ├── package.json └── vite.config.js

七、后续计划

1. 功能扩展

  • 添加用户登录注册功能

  • 实现文章评论功能

  • 添加文章收藏功能

  • 实现用户个人中心

  • 添加文章搜索功能

2. 性能优化

  • 实现图片懒加载

  • 添加骨架屏提升首屏体验

  • 优化列表滚动性能

  • 实现路由级别的代码分割

3. SEO优化

  • 添加 meta 标签

  • 实现服务端渲染(SSR)

  • 生成 sitemap.xml

  • 优化页面加载速度

4. 移动端适配

  • 优化移动端布局

  • 添加手势操作

  • 实现 PWA 功能

  • 适配深色模式

5. 部署上线

  • 配置 CI/CD 自动化部署

  • 设置生产环境配置

  • 配置 CDN 加速

  • 实施监控和日志系统

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/28 8:22:48

3步轻松下载任何在线视频:Video DownloadHelper伴侣应用终极指南

3步轻松下载任何在线视频&#xff1a;Video DownloadHelper伴侣应用终极指南 【免费下载链接】vdhcoapp Companion application for Video DownloadHelper browser add-on 项目地址: https://gitcode.com/gh_mirrors/vd/vdhcoapp 你是否曾经遇到过想保存在线课程、收藏精…

作者头像 李华
网站建设 2026/4/28 8:20:22

戴尔G15终极散热解决方案:免费开源温度控制中心完全指南

戴尔G15终极散热解决方案&#xff1a;免费开源温度控制中心完全指南 【免费下载链接】tcc-g15 Thermal Control Center for Dell G15 - open source alternative to AWCC 项目地址: https://gitcode.com/gh_mirrors/tc/tcc-g15 你是否厌倦了官方AWCC软件的臃肿和隐私问题…

作者头像 李华
网站建设 2026/4/28 8:20:22

Voxtral-4B-TTS-2603核心技术剖析:卷积神经网络在声纹建模中的角色

Voxtral-4B-TTS-2603核心技术剖析&#xff1a;卷积神经网络在声纹建模中的角色 1. 语音合成的技术革命 近年来&#xff0c;语音合成技术取得了突破性进展。Voxtral-4B-TTS-2603作为新一代语音合成模型&#xff0c;其核心创新之一就是巧妙运用卷积神经网络(CNN)来处理语音信号…

作者头像 李华
网站建设 2026/4/28 8:17:57

拼接最大数:你以为是贪心?其实是在“做选择的人生模拟”

🔥 拼接最大数:你以为是贪心?其实是在“做选择的人生模拟” 一、引子:很多人写对了代码,却没搞懂本质 这道题(Create Maximum Number),不少人第一次写的时候都会觉得: “这不就是贪心吗?每次选最大的数字就完了。” 然后一提交—— 要么WA(错误答案),要么超时…

作者头像 李华
网站建设 2026/4/28 8:14:27

SmolFactory:极简模块化生产力工具的设计与实践

1. 项目概述&#xff1a;当极简主义遇上生产力工具在数字工具泛滥的今天&#xff0c;我们常常陷入功能过剩的困境。SmolFactory&#xff08;小工厂&#xff09;这个命名本身就传递着一种哲学——用最小的设计实现最大的效能。这不是又一个试图解决所有问题的全能应用&#xff0…

作者头像 李华
网站建设 2026/4/28 8:12:03

Qwen3.5-4B-AWQ惊艳案例:中文长文档理解+英文图表解析双语输出

Qwen3.5-4B-AWQ惊艳案例&#xff1a;中文长文档理解英文图表解析双语输出 1. 模型概述 Qwen3.5-4B-AWQ-4bit是由阿里云通义千问团队推出的轻量级稠密模型&#xff0c;经过4bit AWQ量化后显存占用仅约3GB&#xff0c;可在RTX 3060/4060等消费级显卡上流畅运行。这款模型在保持…

作者头像 李华