Vue项目案例-头条新闻

news2024/11/26 15:30:28

目录

1.项目介绍

1.1项目功能

1.2数据接口

1.3设计思路

2.创建项目并安装依赖

2.1创建步骤

2.2工程目录结构

2.3配置文件代码

3.App主组件开发

3.1设计思路

3.2对应代码

4.共通组件开发

4.1设计思路

4.2对应代码

5.头条新闻组件开发

5.1设计思路

5.2对应代码

6.分类新闻组件开发

6.1设计思路

6.2对应代码

7.项目打包


1.项目介绍

1.1项目功能

该案例为使用Vue2.X设计的头条新闻小项目。对应的功能比较简单,主要是有两个功能模块,一个为头条新闻,另一个是分类新闻。对应的设计效果图如下:

该项目的顶部有两个导航栏,分别是头条新闻和分类新闻。点击对应的导航会有相应的新闻出现。分类新闻部分还可以选择对应的新闻分类来选择自己想要的新闻种类。点击对应的新闻列表会跳转到对应的详细新闻的界面。同时,分类新闻会随机抽取一张底下新闻的图片进行展示,并且点击之后也会跳转到对应的新闻。

1.2数据接口

该项目使用到的数据接口为:聚合数据:https://www.juhe.cn/

申请 “新闻头条” 数据接⼝: https://www.juhe.cn/docs/api/id/235 (不可直接跨域访问)

按照聚合数据⽹站的规定,进⾏注册以及实名认证,然后申请 “新闻头条” 数据接⼝。

选择新闻头条的API,并且之后需要记住自己的key值,后续需要用到。

1.3设计思路

本项目的设计思路为:把最上面的标题以及导航栏放在APP主组件中, 然后再设计头条新闻组件和分类新闻组件,分别存放这两个页面独有的东西,最后再设计一个共通组件,该组件专门用于存放新闻列表。

2.创建项目并安装依赖

2.1创建步骤

1️⃣打开命令行窗口,去到你想要创建文件的对应文件中, 输入vue create news。注意文件名不能有大写字母。(这里需要等待一段时间,如果一直没有响应可以点下回车)

2️⃣安装完成之后点击Manually select features, 自定义配置。

3️⃣然后选择Router, 到对应的配置前点空格即可选中。其他的不需要选择。

4️⃣版本选择2.x

5️⃣之后的选择如下:

6️⃣等待安装之后,进入对应的文件下:安装axios以及qs(注意:如何你电脑没有安装淘宝镜像,无法使用cnpm,需要先安装之后才能够使用cnpm指令。或者直接npm也可以安装,只不过需要耗费时间。

暗转之后有显示对应的版本号就是安装成功了!

7️⃣安装之后进入对应的文件中,然后运行npm run serve,若出现以下的页面,则代表项目创建成功!

2.2工程目录结构

项目创建完成之后需要先清楚到其他原本不需要的组件和文件,对应项目的目录如下:

2.3配置文件代码

package.json⽂件
{
  "name": "topnews",
  "version": "0.1.0",
  "private": true,
  "scripts": {
    "serve": "vue-cli-service serve",
    "build": "vue-cli-service build"
  },
  "dependencies": {
    "axios": "^0.20.0",
    "core-js": "^3.6.5",
    "vue": "^2.6.11",
    "vue-router": "^3.2.0"
  },
  "devDependencies": {
    "@vue/cli-plugin-babel": "~4.5.0",
    "@vue/cli-plugin-router": "~4.5.0",
    "@vue/cli-service": "~4.5.0",
    "vue-template-compiler": "^2.6.11"
  },
  "browserslist": [
    "> 1%",
    "last 2 versions",
    "not dead"
  ]
}
这部分我们并不需要自己写,在我们加载依赖的时候就已经自动生成了。
vue.config.js⽂件
module.exports = {
	devServer:{
		port:8080,                           //修改工程启动端口
		proxy:{
			'/juheNews':{
				target:'http://v.juhe.cn/',  //需要跨越访问的url
				ws:'true',                   //设置代理webSocket
				changeOrigin:true,           //允许跨越
				pathRewrite:{
					'^/juheNews':''          //重写路径
				}
			}
		}
	}
}

该文件主要是可以修改访问的端口号,以及使用了proxy解决了跨域的问题。

main.js⽂件
import Vue from 'vue'
import App from './App.vue'
import router from './router'

import axios from 'axios'
import qs from 'qs'

Vue.prototype.$axios = axios;
Vue.prototype.$qs = qs;

Vue.config.productionTip = false

new Vue({
  router,
  render: h => h(App)
}).$mount('#app')

该文件为项目的入口文件,在该文件中引入了外部的资源,并且让axios以及qs添加到原型中,因此在其他的文件使用它们时就不需要再进行导入了,直接使用$axios以及$qs即可以使用。

路由配置⽂件
import Vue from 'vue'
import VueRouter from 'vue-router'
import TopNews from '../views/TopNews.vue'
import TypeNews from '../views/TypeNews.vue'

Vue.use(VueRouter)

const routes = [
	{
		path: '/',
		name: 'Home',
		component: TopNews
	},{
		path: '/topNews',
		name: 'TopNews',
		component: TopNews
	},{
		path: '/typeNews',
		name: 'TypeNews',
		component: TypeNews
	}
]

const router = new VueRouter({
	routes
})

export default router

该文件主要对路由进行了设计,让主页显示topnews路由,需要注意的是路由的名字不能相同。

3.App主组件开发

3.1设计思路

该部分主要存放了标题以及对应的导航栏。对导航栏绑定事件,但点击对应的导航时,会触发事件,并传入对应的参数,让其显示相应的路由组件。而created函数主要是为了避免页面刷新之后,无法保留原本点击的页面。

3.2对应代码

<template>
	<div id="app">
		<header>新闻头条</header>
		<nav>
			<ul>
				<li :class="{navinit:isActive=='topNews'}" @click="changeNav('topNews')">头条新闻</li>
				<li :class="{navinit:isActive=='typeNews'}" @click="changeNav('typeNews')">分类新闻</li>
			</ul>
		</nav>
		<router-view />
	</div>
</template>

<script>
	export default{
		data(){
			return {
				isActive:'typeNews'
			}
		},
		created() {
			let path = location.href;
			this.isActive = path.substring(path.lastIndexOf('/')+1);
		},
		methods:{
			changeNav(param){
				this.isActive = param;
				if(param=='topNews'){
					this.$router.push('/topNews');
				}else if(param=='typeNews'){
					this.$router.push('/typeNews');
				}
			}
		}
	}
</script>

<style>
	/******************** css reset ********************/
	html,body,div,header,nav,h1,h2,h3,h4,h5,h6,ul,li{
		margin: 0;
		padding: 0;
		font-family: "微软雅黑";
	}
	ul{
		list-style: none;
	}
	a{
		text-decoration: none;
	}
	
	header{
		width: 100%;
		height: 48px;
		background-color: #E03D3E;
		
		display: flex;
		justify-content: center;
		align-items: center;
		
		font-size: 20px;
		color: #fff;
		/*设置字间距*/
		letter-spacing: 4px;
	}
	nav{
		width: 100%;
		height: 56px;
		display: flex;
		justify-content: center;
		align-items: center;
	}
	nav ul{
		width: 160px;
		height: 26px;
		
		display: flex;
		justify-content: space-between;
	}
	nav ul li{
		width: 70px;
		height: 26px;
		
		display: flex;
		justify-content: center;
		align-items: center;
	}
	.navinit{
		color: #E03D3E;
		border-bottom: solid 2px #E03D3E;
	}
</style>

4.共通组件开发

4.1设计思路

该部分主要是实现新闻列表的展示,因此主要是接受其父组件,也就是Topnews以及Typenews两个组件对其传入的值。并使用v-for遍历数据,让显示在列表上。

4.2对应代码

<template>
	<div>
		<ul>
			<li v-for="item in data" @click="toNews(item.url)" :key="item.id">
				<div class="img-box" v-show="item.thumbnail_pic_s">
					<img :src="item.thumbnail_pic_s">
				</div>
				<div class="text-box">
					<h3>{{item.title | titleFilter}}</h3>
					<p>{{item.date}}</p>
				</div>
			</li>
		</ul>
	</div>
</template>

<script>
	export default{
		props:['data'],
		methods:{
			toNews(url){
				location.href = url;
			}
		},
		filters:{
			titleFilter(value){
				if(value.length>24){
					value=value.substr(0,24)+'...';
				}
				return value;
			},


		}
	}
</script>

<style scoped>
	ul{
		width: 100%;
	}
	ul li{
		box-sizing: border-box;
		padding: 6px;
		width: 100%;
		height: 93px;
		
		display: flex;
		border-bottom: dashed 1px #AAA;
		
		user-select: none;
		cursor: pointer;
	}
	ul li .img-box{
		flex: 0 0 100px;
		height: 80px;
	}
	ul li .img-box img{
		width: 100px;
		height: 80px;
	}
	ul li .text-box{
		flex: 1;
		box-sizing: border-box;
		padding-left: 10px;
	}
	ul li .text-box h3{
		font-size: 16px;
		font-weight: 300;
	}
	ul li .text-box p{
		font-size: 14px;
		text-align: right;
		
	}
</style>

5.头条新闻组件开发

5.1设计思路

该组件主要是利用axios向数据接口发送请求得到新闻数据,并将其数据传送给子组件,也就是传给上面的共通组件。如何你对组件间的通信不太懂的,可以看看我之前发布的文章:http://t.csdn.cn/AEFrI

5.2对应代码

<template>
	<div>
		<img src="../assets/logo.png">
		<NewsList :data="newsList"></NewsList>
	</div>
</template>

<script>
	import NewsList from '../components/NewsList'
	
	export default{
		data(){
			return {
				newsList:[]
			}
		},
		created() {
			this.$axios.get('/juheNews/toutiao/index',{
				params:{
					type:'top',
					key:'自己的key值'
				}
			}).then(response=> {
					this.newsList = response.data.result.data;
				})
				.catch(error=> {
					console.log(error);
				});
		},
		components:{
			NewsList
		}
	}
</script>

<style scoped>
	img{
		width: 100%;
		height: 100px;
		display: block;
	}
</style>

6.分类新闻组件开发

6.1设计思路

该组件主要是再向数据接口传一个新闻类型的参数,并将返回的数据传递给共同组件。同时在返回的数据中,随机挑选一条新闻,并将对应的新闻图片放在页面上,并且设计对应的链接跳转到对应的新闻详细页面。并且默认页面上的新闻类型为社会类型。

6.2对应代码

<template>
	<div>
		<div class="news-img">
			<a :href="news.url">
				<img :src="news.thumbnail_pic_s">
			</a>
		</div>
		<div class="type-news">
			<ul>
				<li v-for="item in typeList" :class="{typeinit:isAlive==item.id}" @click="change(item.id)" :key="item.id">
				    {{item.name}}
				</li>
			</ul>
		</div>
		<NewsList :data="newsList"></NewsList>
	</div>
</template>

<script>
	import NewsList from '../components/NewsList';
	export default{
		data(){
			return {
				typeList:[
					{id:'shehui',name:'社会'},
					{id:'guonei',name:'国内'},
					{id:'guoji',name:'国际'},
					{id:'yule',name:'娱乐'},
					{id:'tiyu',name:'体育'},
					{id:'junshi',name:'军事'},
					{id:'keji',name:'科技'},
					{id:'caijing',name:'财经'},
					{id:'shishang',name:'时尚'}
				],
				isAlive:'shehui',
				newsList:[],
				news:{}
			}
		},
		created() {
			this.getNews('shehui');
		},
		methods:{
			getNews(type){
				this.$axios.get('/juheNews/toutiao/index',{
					params:{
						type:type,
						key:'e78f3ce657ae840a4056b7d9f76b38d1'
					}
				}).then(response=> {
						this.newsList = response.data.result.data;
						this.news = this.newsList[Math.floor(Math.random()*this.newsList.length)];
					})
					.catch(error=> {
						console.log(error);
					});
			},
			change(id){
				this.isAlive = id;
				this.getNews(id);
			}
		},
		components:{
			NewsList
		}
	}
</script>

<style scoped>
	.news-img img{
		width: 100%;
		height: 200px;
		display: block;
	}
	.type-news{
		width: 100%;
		margin-top: 8px;
	}
	.type-news ul{
		width: 100%;
		
		display: flex;
		justify-content: center;
		flex-wrap: wrap;
	}
	.type-news ul li{
		box-sizing: border-box;
		width: 48px;
		height: 22px;
		border: solid 1px #E03D3E;
		border-radius: 11px;
		margin: 5px 10px;
		
		font-size: 14px;
		color: #E03D3E;
		
		display: flex;
		justify-content: center;
		align-items: center;
	}
	
	.typeinit{
		background-color: #E03D3E;
		color: #fff !important;     /*!important:将优先级提升最高*/
	}
</style>

7.项目打包

在项目的配置文件vue.config.js文件中,设置打包基本目录,输出目录医用级静态资源目录。之后在终端中进入文件,并输入npm run build。则项目打包成功。打包之后的文件将会保存在项目根目录的dist文件夹中。

module.exports = {
	// 打包基本目录
	publicPath:'./',
	// 输出目录
	outputDir:'dist',
	// 静态资源目录
	assetsDir:'assets',
	devServer:{
		port:8080,                           //修改工程启动端口
		proxy:{
			'/juheNews':{
				target:'http://v.juhe.cn/',  //需要跨越访问的url
				ws:'true',                   //设置代理webSocket
				changeOrigin:true,           //允许跨越
				pathRewrite:{
					'^/juheNews':''          //重写路径
				}
			}
		}
	}
}

至此,本次项目就结束啦!赶快去试一下吧,有啥不懂的也可以留言进行提问,或者给我私信!拜拜~~

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

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

相关文章

Android -BLE 蓝牙模块开发

Android-Ble蓝牙开发Demo示例–扫描,连接,发送和接收数据,分包解包(附源码) - 简书前言 万物互联的物联网时代的已经来临&#xff0c;ble蓝牙开发在其中扮演着举重若轻的角色。最近刚好闲一点&#xff0c;抽时间梳理下这块的知识点。 涉及ble蓝牙通讯的客户端(开启、扫描、连接…

【OLED驱动】:stm32F103的四线模拟IIC驱动的0.96寸OLED屏幕显示数字,字母,汉字,图片的例程

文章目录 前言 一、四线OLED是什么&#xff1f; 二、IIC原理 1.四线0.96寸OLED是IIC驱动来实现显示 2.IIC协议的OLED屏幕 3.STM32驱动代码 4.IIC使用代码 总结 前言 最近在做一个开源方案 — 平衡车&#xff0c;即将开源硬件和软件&#xff0c;会在CSDN上开源&#xff0…

Vue2+Vue3基础入门到实战项目(五)——课程学习笔记

大家好&#xff0c; Capybara 继续与大家一起学习Vue框架。书读百遍其义自见。 day06 路由进阶 路由模块封装 router/index.js 所抽离内容包括&#xff1a;导入组件、&#xff08;额外需要&#xff09;导入Vue、导入VueRouter插件、 创建路由对象、导出路由对象 需要注意路径…

上线检查工具(待完善)

根据V11《CEBPM系统上线CheckList》整理而得&#xff0c;适用于V11&#xff0c;DHERP&#xff0c;Oracle和MSSQL数据库&#xff0c;检查内容还不完善。 上图&#xff1a; 1&#xff09;数据库连接 2&#xff09;双击[连接别名]&#xff0c;可选择历史连接 3&#xff09;主界面…

若依 MyBatis改为MyBatis-Plus

主要内容&#xff1a;升级成mybatis-plus&#xff0c;代码生成也是mybatis-plus版本 跟着我一步一步来&#xff0c;就可完成升级&#xff01; 检查&#xff1a;启动程序&#xff0c;先保证若依能启动 第一步&#xff1a;添加依赖 这里需要在两个地方添加&#xff0c;一个是最…

CSRF攻击原理及防护

CSRF攻击原理及防护 0x01 CSRF是什么 ssrf 服务端请求伪造 CSRF全称为跨站请求伪造&#xff08;Cross-site request forgery&#xff09;&#xff0c;是一种网络攻击方式&#xff0c;也被称为 one-click attack 或者 session riding。 0x02 CSRF攻击原理 CSRF攻击利用网站…

flutter架构全面解析

Flutter 是一个跨平台的 UI 工具集&#xff0c;它的设计初衷&#xff0c;就是允许在各种操作系统上复用同样的代码&#xff0c;例如 iOS 和 Android&#xff0c;同时让应用程序可以直接与底层平台服务进行交互。如此设计是为了让开发者能够在不同的平台上&#xff0c;都能交付拥…

智慧公厕三大数字化远景,畅通数字化循环、夯实数字化基建、开创数字化创新

智慧公厕&#xff1a;实现数字化远景&#xff0c;提升公厕使用、建设与管理的创新之路 在现代社会中&#xff0c;公厕作为城市基础设施的重要组成部分&#xff0c;对城市形象和居民生活质量有着重要影响。然而&#xff0c;一些传统公厕管理的繁琐和配置设施的陈旧&#xff0c;…

centos7升级openssh版本

linux升级openssh版本&#xff0c;升级到8.6p1 小白教程&#xff0c;一看就会&#xff0c;一做就成。 1.下载rpm包 2.编写一键安装脚本&#xff08;然后执行&#xff09; #把所有的rpm包&#xff0c;我都放到了/ydy目录&#xff0c;下面安装时&#xff0c;也指定了这个目录 #编…

Golang-GJSON 快速而简单的方法来从 json 文档获取值

GJSON 是一个 Go 包&#xff0c;它提供了一种快速而简单的方法来从 json 文档获取值。它具有单行搜索、点符号路径、迭代和解析 json 行等功能。 GJSON 也可用于Python和Rust 入门 安装中 要开始使用GJSON 请安装 Go 并运行 go get &#xff1a; $ go get -u github.com/ti…

HarmonyOS开发:走进静态共享包的依赖与使用

前言 在上一篇&#xff0c;我们进行了动态共享包的开发和使用&#xff0c;由于动态共享包有一定的局限性&#xff0c;比如&#xff0c;调用共享包资源还得要通过工具类进行调用&#xff0c;再比如仅用于应用内部代码、资源的共享&#xff0c;如果我想要开源&#xff0c;以远程依…

STM32纯中断方式发送接收数据(串行通信;keil arm5;)

除了main文件其他文件均无修改&#xff0c;正常运行--在keil arm5内

【腾讯云Cloud Studio实战训练营】戏说cloud studio

文章目录 前言产品概述项目体验登录空间模板模板项目体验 总结 前言 在奇幻世界中&#xff0c;存在着一片神秘的云海&#xff0c;被人们称为腾讯云云端开发环境 Cloud Studio。这片云海是一座巨大的浮岛&#xff0c;上面漂浮着一个集成式开发环境&#xff08;Integrated Devel…

2023年行研行业研究报告

第一章 行业概述 1.1 行研行业 行业定义为同一类别的经济活动&#xff0c;这涉及生产相似产品、应用相同生产工艺或提供同类服务的集合&#xff0c;如食品饮料行业、服饰行业、机械制造行业、金融服务行业和移动互联网行业等。 为满足全球金融业的需求&#xff0c;1999年8月…

指针练习(2)

1. int main() {int a[5][5];int(*p)[4];p a;printf("%p,%d\n", &p[4][2] - &a[4][2], &p[4][2] - &a[4][2]);return 0; } 解析&#xff1a;a是一个5行5列的二维数组&#xff0c;而p是一个访问4个元素的数组指针&#xff0c;将数组a的首元素地址也…

【开发问题系列】CSV转Excel

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:kuan 的首页,持续学…

innovus: 加IO buffer

我正在「拾陆楼」和朋友们讨论有趣的话题&#xff0c;你⼀起来吧&#xff1f; 拾陆楼知识星球入口 set fid [open $net_file w] foreach port_name $input_ports { set net [get_nets -q -of_object [get_ports $port_name]] set net_name [get_attribute $net full_name] …

python实现对excel表中的某列数据进行排序

如下需要对webCms中的B列数据进行升序排序&#xff0c;且不能影响到其他列、工作表中的数据和格式。 import pandas as pd import openpyxl from openpyxl.utils.dataframe import dataframe_to_rows# 读取 Excel 文件 file_path 1.xlsx sheet_name webCms# 读取 Excel 文件并…

Java之文件操作与IO

目录 一.认识文件 1.1文件是什么&#xff1f; 1.2文件的组织 1.3文件路径 1.4文件的分类 二.文件操作 2.1File概述 三.文件内容操作--IO 3.1JavaIO的认识 3.2Reader和Writer ⭐Reader类 ⭐Writer类 3.2FileInputStream和FileOutputStream ⭐FileInputStream类 …

scala基础

scala 基础 1. scala简介 scala是运行在 JVM 上的多范式编程语言&#xff0c;同时支持面向对象和面向函数编程早期scala刚出现的时候&#xff0c;并没有怎么引起重视&#xff0c;随着Spark和Kafka这样基于scala的大数据框架的兴起&#xff0c;scala逐步进入大数据开发者的眼帘…