Vue3+node.js网易云音乐实战项目(三)

一、头部导航栏布局

image-20220613085300007

首先我们看最上面这里的布局,大致可分为三个模块,顶部左边,顶部中间,顶部右边

那么我们在component创建一下子组件,命名为topNav.vue

image-20220613091653753

为了让这个整体好看一点,我在 App.vue 这加了一点整体的样式

  *{
    margin: 0;
    padding: 0;
    box-sizing: border-box;
    font-family: "微软雅黑";
  }

  // 渐变背景色
  html{
     background:linear-gradient(top,rgb(232,235,242),rgb(255,255,255)) no-repeat ;
     background:-webkit-linear-gradient(top,rgb(232,235,242),rgb(255,255,255)) no-repeat;
  }

先把基础的东西填进去然后在调整样式

image-20220613091746009

看看效果

image-20220613091803098

很明显现在的图标很大,我们先调整图片的大小

.icon{
      width: 0.4rem;
      height: 0.4rem ;
}

image-20220613092005496

然后我们在利用flex布局让它从两端对齐,并设置边距,让它看起来好看一点

    .topNav{
        width: 7.5rem;
        height: 0.8rem;
        display: flex;
        justify-content: space-between;
        align-items: center;
        padding: 0 0.2rem;
	}

image-20220613092137723

最后调整一下中间的文字,平均分布

    .topCenter{
      width: 4.5rem;
      display: flex;
      justify-content: space-around;
    }

image-20220613092420073

然后我们在修它的选中状态 active 变粗

 <!-- 修改成active -->
<!-- 顶部中间 -->
    <div class="topCenter">
      <span class="navBtn">我的</span>
      <span class="navBtn active" >发现</span>
      <span class="navBtn">云村</span>
      <span class="navBtn">视频</span>
    </div>
    .topCenter{
      width: 4.5rem;
      display: flex;
      justify-content: space-around;
      .active{
        font-weight: 900;
      }
    }

image-20220613093318757

整体代码 topNav.vue

<template>
  <div class="topNav">
          <!-- 顶部左边 -->
    <div class="topLeft">
      <svg class="icon" aria-hidden="true">
        <use xlink:href="#icon-liebiao2"></use>
      </svg>
    </div>
    <!-- 顶部中间 -->
    <div class="topCenter">
      <span class="navBtn">我的</span>
      <span class="navBtn active" >发现</span>
      <span class="navBtn">云村</span>
      <span class="navBtn">视频</span>
    </div>
    <!-- 顶部右边 -->
    <div class="topRight">
         <svg class="icon search_img" aria-hidden="true">
          <use xlink:href="#icon-sousuo"></use>
      </svg>
    </div>
  </div>
</template>

<style lang="less" scoped>
    .topNav{
    width: 7.5rem;
    height: 1rem;
    display: flex;
    justify-content: space-between;
    align-items: center;
    padding: 0 0.2rem;
    .icon{
      width: 0.4rem;
      height: 0.4rem ;
    }
    
    .topCenter{
      width: 4.5rem;
      display: flex;
      justify-content: space-around;
      .active{
        font-weight: 900;
      }
    }
  }
</style>

二、轮播图的实现

实现了顶部之后,我们现在来实现轮播图,轮播图这里我就偷个懒,利用vant去实现。

vue3 npm 安装

# Vue 3 项目,安装最新版 Vant
npm i vant

文档地址:https://vant-contrib.gitee.io/vant/#/zh-CN/quickstart


我们在main.js中引用vant

import { createApp } from 'vue'
import { Swipe, SwipeItem } from 'vant';
import 'vant/lib/index.css';

createApp(App).use(Swipe).use(SwipeItem).mount('#app')

我们同样在components创建一个swipe.vue子组件,然后在HomeView.vue中注册一下

image-20220613111700356

在swipe.vue,我们使用vant官方的例子,利用懒加载的方式做轮播图(这里的图片我放在了assets下,需要自己创建一个img文件夹放图片)

<template>
    <van-swipe :autoplay="3000" lazy-render>
        <van-swipe-item v-for="image in images" :key="image">
            <img :src="image" />
        </van-swipe-item>
    </van-swipe>
</template>

<script>

export default {
 setup() {
    const images = [
        require('@/assets/img/1.jpg'),
        require('@/assets/img/2.jpeg'),
        require('@/assets/img/3.jpeg'),
        require('@/assets/img/4.png'),
    ];
    return { images };
  },
}
</script>

效果

354633442

​ 现在来调整一下样式,使图片的宽度适中

<style>
.van-swipe{
    width: 7rem;
    height: 2.7rem;
    margin:0 auto;
    border-radius: 0.3rem;
    border: red 1px solid;
        /* 使下面的点变成红色 */
     --van-swipe-indicator-active-background-color:rgb(255, 61, 61);
}
.van-swipe-item img{
    width: 100%;
}

效果

354633444

这里是红边框可以去掉,只是拿来做演示用

三、请求网易的banner图

完成了轮播图的效果,我们请求一下api,这里安装一下axios

npm install axios

然后我们在src创建一个专门api文件夹

image-20220614161740459

里面发送一下请求,由于接口文档已经说明了这一条,所以大家在编写axios请求时注意一下,文档所有接口都可以使用get请求,但为了真实一点,我使用了post请求

image-20220614161931603

import axios from 'axios'

// 请求banner
 function postBanner(type1){
   return  axios.post(`http://localhost:3000/banner?type=${type1}`).then((res)=>{
       return res.data.banners ;
    })
}

export {postBanner}

​ 然后我们来到我们的swipe.vue界面,请求一下数据并渲染到页面上

​ 这里说明一下banner接口请求出来的数据均为对象类型数据

image-20220614164643402

​ 这里有三种方法 1、ref存储数据 2、reactive([])存储数据(不太推荐) 3、reactive([])嵌套一个对象去存储(推荐

  1. ref存储数据

    <template>
        <van-swipe :autoplay="3000" lazy-render>
            <van-swipe-item v-for="(image,index) in images" :key="index">
                <img :src="image.pic" />
            </van-swipe-item>
        </van-swipe>
    </template>
    
    <script>
    import {onMounted,reactive,ref} from 'vue'
    import {postBanner} from '@/api/index'
    
    export default {
       setup() {
            let  images = ref([])
            onMounted(async()=>{
                getSwipeAPI()
            })
           async function getSwipeAPI(){
              images.value = await postBanner(1)
            }
            console.log(images);
        return { images };
      }, 
    }
    </script>
    
  2. reactive([])嵌套一个对象去存储(推荐)

<template>
    <van-swipe :autoplay="3000" lazy-render>
        <van-swipe-item v-for="(image,index) in images2.list" :key="index">
            <img :src="image.pic" />
        </van-swipe-item>
    </van-swipe>
</template>

<script>
import {onMounted,reactive,ref} from 'vue'
import {postBanner} from '@/api/index'

export default {
   setup() {
        let images2 = reactive({
            list:[]
        })
        onMounted(async()=>{
            getSwipeAPI()
        })
       async function getSwipeAPI(){
          images2.list = await postBanner(1)
        }
    return {images2};
  },
}
</script>
  1. reactive([])通过push存储(不推荐)
<template>
<div v-for="(image,index1) in images3" :key="index1">
    <van-swipe :autoplay="3000" lazy-render>
        <van-swipe-item v-for="(i,index) in image" :key="index">
            <img :src="i" />
        </van-swipe-item>
    </van-swipe>
</div>
</template>

<script>
import {onMounted,reactive,ref} from 'vue'
import {postBanner} from '@/api/index'

export default {
   setup() {
        let images3 = reactive([])
        onMounted(async()=>{
            getSwipeAPI()
        })
       async function getSwipeAPI(){
          let x = await postBanner(1)
            x = x.map(v=>v.pic)
          images3.push(x)
        }
        console.log(images3);
    return {images3};
  },
}
</script>

效果

3546334442

四 链接

Vue3+node.js网易云音乐实战项目(一): https://blog.csdn.net/NITIQ/article/details/125358363?spm=1001.2014.3001.5501
Vue3+node.js实战项目网易云音乐APP(二): https://blog.csdn.net/NITIQ/article/details/125358401?spm=1001.2014.3001.5502
Vue3+node.js网易云音乐实战项目(三): https://blog.csdn.net/NITIQ/article/details/125358446?spm=1001.2014.3001.5502
Vue3+node.js网易云音乐实战项目(四): https://blog.csdn.net/NITIQ/article/details/125358476?spm=1001.2014.3001.5502

未完…

未完…

  • 7
    点赞
  • 37
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 7
    评论
好的,我可以为您提供一些基本的思路。首先,我们需要建立一个基于Vue3的前端页面,然后使用Node.js来实现后端接口,以便将数据保存到数据库中。以下是详细步骤: 1. 创建Vue3项目 我们可以使用Vue CLI来创建一个新的Vue3项目。在终端中输入以下命令: ``` vue create volunteer-activity ``` 2. 安装所需的依赖包 我们需要安装一些必要的依赖包,包括axios(与后端进行通信),element-plus(UI框架)等。在终端中输入以下命令: ``` cd volunteer-activity npm install axios element-plus --save ``` 3. 创建前端页面 我们可以使用Vue3的组件来构建前端页面。可以创建一个发布活动的表单,包括活动名称、活动时间、活动地点、活动描述等信息。可以使用Element Plus的表单组件,如el-form、el-form-item等。 4. 创建Node.js后端 我们需要使用Node.js来实现后端接口,以便将数据保存到数据库中。可以使用Express框架来实现。在终端中输入以下命令: ``` npm install express body-parser mongoose --save ``` 5. 定义数据模型 我们需要定义一个数据模型,以便在数据库中保存活动数据。可以使用Mongoose库来定义数据模型。在后端代码中,可以创建一个活动模型,在其中定义活动名称、活动时间、活动地点、活动描述等属性。 6. 定义路由 我们需要定义一个路由,以便在前端页面中通过axios与后端进行通信。可以使用Express框架来定义路由。在后端代码中,可以创建一个活动路由,其中包括创建活动、获取所有活动、获取单个活动、更新活动、删除活动等功能。 7. 实现前后端数据交互 我们需要在前端页面中使用axios来与后端进行通信。可以创建一个提交表单的方法,在其中使用axios向后端发送数据。在后端代码中,可以使用Mongoose库来连接数据库,并通过调用活动模型来保存、更新、获取、删除活动数据。 8. 测试并部署 我们可以在本地测试前后端数据交互是否正常。如果一切正常,可以将应用程序部署到服务器上。 以上是基于Vue3和Node.js实现志愿者活动发布页面的大致流程。需要注意的是,这只是一个基本的示例,具体的实现可能会有所不同,具体实现还需要根据实际情况进行调整。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

周粥粥ya

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值