日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

调用网易云Api接口实现移动Web网易云部分功能(搜索+列表+播放)

發布時間:2023/12/10 编程问答 39 豆豆
生活随笔 收集整理的這篇文章主要介紹了 调用网易云Api接口实现移动Web网易云部分功能(搜索+列表+播放) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

知識點自測

  • 知道reset.css和flexible.js的作用
  • 什么是組件庫-例如bootstrap作用
  • yarn命令的使用
  • 組件名字用name屬性方式注冊
  • 如何自定義組件庫樣式

鋪墊(自學)

本地接口項目部署

下載網易云音樂node接口項目, 在本地啟動, 為我們vue項目提供數據支持

項目地址

備用地址

下載后, 安裝所有依賴, 在本地啟動起來, 測試訪問此地址是否有數據

http://localhost:3000, 看到如下頁面就成功了

> 總結: 前端請求本地的node項目, node服務器偽裝請求去拿網易云音樂服務器數據轉發回給自己前端

學習目標

  • 能夠掌握vant組件庫的使用
  • 能夠掌握vant組件自定義樣式能力
  • 能夠掌握組件庫使用和文檔使用能力
  • 能夠完成網易云音樂案例
  • 1.1 網易云音樂-本地接口啟動

    目的: 啟動本地網易云音樂API服務

    1.2 網易云音樂-前端項目初始化

    目標: 初始化項目, 下載必備包, 引入初始文件, 配置按需自動引入vant, 創建頁面組件

  • 初始化工程

    vue create music-demo
  • 下載需要的所有第三方依賴包

    yarn add axios vant vue-router
  • 引入筆記代碼里準備好的reset.css和flexible.js - 實現樣式初始化和適配問題 - 引入到main.js

  • 本次vant使用自動按需引入的方式

    文檔: https://vant-contrib.gitee.io/vant/#/zh-CN/quickstart

    yarn add babel-plugin-import -D

    在babel.config.js - 添加插件配置

    plugins: [['import', {libraryName: 'vant',libraryDirectory: 'es',style: true}, 'vant'] ]
  • 1.3 網易云音樂-需求分析

    根據需求, 創建路由所需要的5個頁面的組件

    Layout(布局, 頂部導航和底部導航) > 二級路由 Home 和 Search以及播放Play


    創建需要的views下的頁面組件4個

    views/Layout/index.vue - 負責布局(上下導航 - 中間二級路由切換首頁和搜索頁面)

    /* 中間內容區域 - 容器樣式(留好上下導航所占位置) */ .main {padding-top: 46px;padding-bottom: 50px; }

    views/Home/index.vue - 標題和歌名樣式

    /* 標題 */ .title {padding: 0.266667rem 0.24rem;margin: 0 0 0.24rem 0;background-color: #eee;color: #333;font-size: 15px; } /* 推薦歌單 - 歌名 */ .song_name {font-size: 0.346667rem;padding: 0 0.08rem;margin-bottom: 0.266667rem;word-break: break-all;text-overflow: ellipsis;display: -webkit-box; /** 對象作為伸縮盒子模型顯示 **/-webkit-box-orient: vertical; /** 設置或檢索伸縮盒對象的子元素的排列方式 **/-webkit-line-clamp: 2; /** 顯示的行數 **/overflow: hidden; /** 隱藏超出的內容 **/ }

    views/Search/index.vue

    /* 搜索容器的樣式 */ .search_wrap {padding: 0.266667rem; }/*熱門搜索文字標題樣式 */ .hot_title {font-size: 0.32rem;color: #666; }/* 熱搜詞_容器 */ .hot_name_wrap {margin: 0.266667rem 0; }/* 熱搜詞_樣式 */ .hot_item {display: inline-blockheight: 0.853333rem;margin-right: 0.213333rem;margin-bottom: 0.213333rem;padding: 0 0.373333rem;font-size: 0.373333rem;line-height: 0.853333rem;color: #333;border-color: #d3d4da;border-radius: 0.853333rem;border: 1px solid #d3d4da; }

    Play頁面的index(可以全文復制)

    <template><div class="play"><!-- 模糊背景(靠樣式設置), 固定定位 --><divclass="song-bg":style="`background-image: url(${songInfo && songInfo.al && songInfo.al.picUrl}?imageView&thumbnail=360y360&quality=75&tostatic=0);`"></div><!-- 播放頁頭部導航 --><div class="header"><van-iconname="arrow-left"size="20"class="left-incon"@click="$router.back()"/></div><!-- 留聲機 - 容器 --><div class="song-wrapper"><!-- 留聲機本身(靠css動畫做旋轉) --><divclass="song-turn ani":style="`animation-play-state:${playState ? 'running' : 'paused'}`"><div class="song-img"><!-- &&寫法是為了防止報錯, 有字段再繼續往下訪問屬性 --><imgstyle="width: 100%":src="`${songInfo && songInfo.al && songInfo.al.picUrl}?imageView&thumbnail=360y360&quality=75&tostatic=0`"alt=""/></div></div><!-- 播放按鈕 --><div class="start-box" @click="audioStart"><span class="song-start" v-show="!playState"></span></div><!-- 播放歌詞容器 --><div class="song-msg"><!-- 歌曲名 --><h2 class="m-song-h2"><span class="m-song-sname">{{ songInfo.name }}-{{songInfo && songInfo.ar && songInfo.ar[0].name}}</span></h2><!-- 歌詞部分-隨著時間切換展示一句歌詞 --><div class="lrcContent"><p class="lrc">{{ curLyric }}</p></div></div><!-- 留聲機 - 唱臂 --><div class="needle" :style="`transform: rotate(${needleDeg});`"></div></div><!-- 播放音樂真正的標簽看接口文檔: 音樂地址需要帶id去獲取(但是有的歌曲可能404)https://binaryify.github.io/NeteaseCloudMusicApi/#/?id=%e8%8e%b7%e5%8f%96%e9%9f%b3%e4%b9%90-url--><audioref="audio"preload="true":src="`https://music.163.com/song/media/outer/url?id=${id}.mp3`"></audio></div> </template><script> // 獲取歌曲詳情和 歌曲的歌詞接口 import { getSongByIdAPI, getLyricByIdAPI } from "@/api"; import { Icon } from "vant"; export default {components: {[Icon.name]: Icon,},name: "play",data() {return {playState: false, // 音樂播放狀態(true暫停, false播放)id: this.$route.query.id, // 上一頁傳過來的音樂idsongInfo: {}, // 歌曲信息lyric: {}, // 歌詞枚舉對象(需要在js拿到歌詞寫代碼處理后, 按照格式保存到這個對象)curLyric: "", // 當前顯示哪句歌詞lastLy: "", // 記錄當前播放歌詞};},computed: {needleDeg() {// 留聲機-唱臂的位置屬性return this.playState ? "-7deg" : "-38deg";},},methods: {async getSong() {// 獲取歌曲詳情, 和歌詞方法const res = await getSongByIdAPI(this.id);this.songInfo = res.data.songs[0];// 獲取-并調用_formatLyr方法, 處理歌詞const lyrContent = await getLyricByIdAPI(this.id);const lyricStr = lyrContent.data.lrc.lyric;this.lyric = this._formatLyr(lyricStr);// 初始化完畢先顯示零秒歌詞this.curLyric = this.lyric[0];},_formatLyr(lyricStr) {// 可以看network觀察歌詞數據是一個大字符串, 進行拆分.let reg = /\[.+?\]/g; //let timeArr = lyricStr.match(reg); // 匹配所有[]字符串以及里面的一切內容, 返回數組console.log(timeArr); // ["[00:00.000]", "[00:01.000]", ......]let contentArr = lyricStr.split(/\[.+?\]/).slice(1); // 按照[]拆分歌詞字符串, 返回一個數組(下標為0位置元素不要,后面的留下所以截取)console.log(contentArr);let lyricObj = {}; // 保存歌詞的對象, key是秒, value是顯示的歌詞timeArr.forEach((item, index) => {// 拆分[00:00.000]這個格式字符串, 把分鐘數字取出, 轉換成秒let ms = item.split(":")[0].split("")[2] * 60;// 拆分[00:00.000]這個格式字符串, 把十位的秒拿出來, 如果是0, 去拿下一位數字, 否則直接用2位的值let ss =item.split(":")[1].split(".")[0].split("")[0] === "0"? item.split(":")[1].split(".")[0].split("")[1]: item.split(":")[1].split(".")[0];// 秒數作為key, 對應歌詞作為valuelyricObj[ms + Number(ss)] = contentArr[index];});// 返回得到的歌詞對象(可以打印看看)console.log(lyricObj);return lyricObj;},audioStart() {// 播放按鈕 - 點擊事件if (!this.playState) {// 如果狀態為falsethis.$refs.audio.play(); // 調用audio標簽的內置方法play可以繼續播放聲音} else {this.$refs.audio.pause(); // 暫停audio的播放}this.playState = !this.playState; // 點擊設置對立狀態},showLyric() {// 監聽播放audio進度, 切換歌詞顯示this.$refs.audio.addEventListener("timeupdate", () => {let curTime = Math.floor(this.$refs.audio.currentTime);// 避免空白出現if (this.lyric[curTime]) {this.curLyric = this.lyric[curTime];this.lastLy = this.curLyric;} else {this.curLyric = this.lastLy;}});},},mounted() {this.getSong();this.showLyric();console.log(this.$route.query.id);}, }; </script><style scoped> .header {height: 50px; } .play {position: fixed;top: 0;left: 0;right: 0;bottom: 0;z-index: 1000; } .song-bg {background-color: #161824;background-position: 50%;background-repeat: no-repeat;background-size: auto 100%;transform: scale(1.5);transform-origin: center;position: fixed;left: 0;right: 0;top: 0;height: 100%;overflow: hidden;z-index: 1;opacity: 1;filter: blur(25px); /*模糊背景 */ } .song-bg::before {/*純白色的圖片做背景, 歌詞白色看不到了, 在背景前加入一個黑色半透明蒙層解決 */content: " ";background: rgba(0, 0, 0, 0.5);position: absolute;left: 0;top: 0;right: 0;bottom: 0; } .song-wrapper {position: fixed;width: 247px;height: 247px;left: 50%;top: 50px;transform: translateX(-50%);z-index: 10001; } .song-turn {width: 100%;height: 100%;background: url("./img/bg.png") no-repeat;background-size: 100%; } .start-box {position: absolute;width: 156px;height: 156px;position: absolute;left: 50%;top: 50%;transform: translate(-50%, -50%);display: flex;justify-content: center;align-items: center; } .song-start {width: 56px;height: 56px;background: url("./img/start.png");background-size: 100%; } .needle {position: absolute;transform-origin: left top;background: url("./img/needle-ab.png") no-repeat;background-size: contain;width: 73px;height: 118px;top: -40px;left: 112px;transition: all 0.6s; } .song-img {width: 154px;height: 154px;position: absolute;left: 50%;top: 50%;overflow: hidden;border-radius: 50%;transform: translate(-50%, -50%); } .m-song-h2 {margin-top: 20px;text-align: center;font-size: 18px;color: #fefefe;overflow: hidden;white-space: nowrap;text-overflow: ellipsis; } .lrcContent {margin-top: 50px; } .lrc {font-size: 14px;color: #fff;text-align: center; } .left-incon {position: absolute;top: 10px;left: 10px;font-size: 24px;z-index: 10001;color: #fff; } .ani {animation: turn 5s linear infinite; } @keyframes turn {0% {-webkit-transform: rotate(0deg);}100% {-webkit-transform: rotate(360deg);} } </style>

    1.4 網易云音樂-路由準備

    目標: 準備路由配置, 顯示不同路由頁面

    router/index.js - 準備路由 - 以及默認顯示Layout, 然后Layout默認顯示二級路由的首頁

    // 路由-相關模塊 import Vue from 'vue' import VueRouter from 'vue-router' import Layout from '@/views/Layout' import Home from '@/views/Home' import Search from '@/views/Search' import Play from '@/views/Play'Vue.use(VueRouter) const routes = [{path: '/',redirect: '/layout'},{path: '/layout',component: Layout,redirect: '/layout/home',children: [{path: 'home',component: Home,meta: { // meta保存路由對象額外信息的title: "首頁"}},{path: 'search',component: Search,meta: {title: "搜索"}}]},{path: '/play',component: Play} ]const router = new VueRouter({routes })export default router

    main.js - 引入路由對象, 注冊到new Vue中

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

    App.vue中留好router-view顯示路由頁面

    <template><div><router-view></router-view></div> </template>

    總結: 把項目的框搭好, 逐個攻破

    1.5 網易云音樂-Tabbar組件

    目標: 點擊底部導航, 切換路由頁面顯示

    文檔: https://vant-contrib.gitee.io/vant/#/zh-CN/tabbar

  • 注冊Tabbar組件, 在main.js中

    import { Tabbar, TabbarItem } from 'vant'; Vue.use(Tabbar); Vue.use(TabbarItem);
  • 在Layout.vue中使用

    <template><div><div class="main"><!-- 二級路由-掛載點 --><router-view></router-view></div><van-tabbar route><van-tabbar-item replace to="/layout/home" icon="home-o">首頁</van-tabbar-item><van-tabbar-item replace to="/layout/search" icon="search">搜索</van-tabbar-item></van-tabbar></div> </template><script> export default { } </script><style scoped> /* 中間內容區域 - 容器樣式(留好上下導航所占位置) */ .main {padding-top: 46px;padding-bottom: 50px; } </style>
  • 開啟路由模式 route屬性, 和to屬性指向要切換的路由路徑

    <van-tabbar route><van-tabbar-item icon="home-o" to="/layout/home">首頁</van-tabbar-item><van-tabbar-item icon="search" to="/layout/search">搜索</van-tabbar-item> </van-tabbar>
  • 總結: van-tabbar開啟route

    1.6 網易云音樂-NavBar導航組件

    目標: 實現頂部標題展示

    文檔: https://vant-contrib.gitee.io/vant/#/zh-CN/nav-bar

  • main.js - 注冊NavBar組件

    import { NavBar } from 'vant'; Vue.use(NavBar);
  • 復制文檔里的, 然后刪刪只留標題

    <van-nav-bar :title="activeTitle" fixed /><script>export default {activeTitle: "首頁"} </script>
  • 1.7 網易云音樂-NavBar標題切換

    目標: 實現點擊底部導航/刷新非第一頁面頁面, 導航標題正確顯示

    • 在router/index.js - 給$route里需要導航標題的添加meta元信息屬性

      {path: '/layout',component: Layout,redirect: '/layout/home',children: [{path: 'home',component: Home,meta: { // meta保存路由對象額外信息的title: "首頁"}},{path: 'search',component: Search,meta: {title: "搜索"}}]},

      Layout.vue中監聽$route改變:

      給導航active的值設置$route里的元信息的標題

      export default {data() {return {activeTitle: this.$route.meta.title, // "默認"頂部導航要顯示的標題 (默認獲取當前路由對象里的meta中title值)};},// 路由切換 - 偵聽$route對象改變watch: {$route() {this.activeTitle = this.$route.meta.title; // 提取切換后路由信息對象里的title顯示},}, };

    總結: 點擊底部導航和刷新當前網頁, 都能保證導航標題的正確顯示

    1.8 網易云音樂-網絡請求封裝

    目標: 不想把網絡請求散落在各個邏輯頁面里, 不然以后找起來改起來很麻煩

  • 封裝utils/request.js - 基于axios進行二次封裝 - 設置基礎地址

    // 網絡請求 - 二次封裝 import axios from 'axios' axios.defaults.baseURL = "http://localhost:3000" export default axios
  • 封裝src/api/Home.js

    統一封裝網絡請求方法

    // 文件名-盡量和模塊頁面文件名統一(方便查找) import request from '@/utils/request'// 首頁 - 推薦歌單 export const recommendMusic = params => request({url: '/personalized',params// 將來外面可能傳入params的值 {limit: 20} })
  • 在src/api/index.js - 統一導出接口供外部使用

    // api文件夾下 各個請求模塊js, 都統一來到index.js再向外導出 import {recommendMusic} from './Home'export const recommendMusicAPI = recommendMusic // 請求推薦歌單的方法導出
  • 在main.js - 測試使用一下.

    import { recommendMusicAPI } from '@/api/index' async function myFn(){const res = await recommendMusicAPI({limit: 6});console.log(res); } myFn();
  • 總結: 封裝網絡請求方法目的, 方便我們統一管理

    1.9 網易云音樂-首頁-推薦歌單

    接口地址: /personalized

  • 布局采用van-row和van-col

    布局文檔https://vant-contrib.gitee.io/vant/#/zh-CN/col

  • 使用vant內置的圖片組件來顯示圖片

  • 在main.js注冊使用的組件

    import { Col, Row, Image as VanImage } from 'vant';Vue.use(Col); Vue.use(Row); Vue.use(VanImage);
  • 在api/index.js下定義推薦歌單的接口方法

    // 首頁 - 推薦歌單 export const recommendMusic = params => request({url: '/personalized',params// 將來外面可能傳入params的值 {limit: 20} })
  • 把數據請求回來, 用van-image和p標簽展示推薦歌單和歌單名字

    <template><div><p class="title">推薦歌單</p><van-row gutter="6"><van-col span="8" v-for="obj in reList" :key="obj.id"><van-image width="100%" height="3rem" fit="cover" :src="obj.picUrl" /><p class="song_name">{{ obj.name }}</p></van-col></van-row></div> </template><script> import { recommendMusicAPI } from "@/api"; export default {data() {return {reList: [], // 推薦歌單數據};},async created() {const res = await recommendMusicAPI({limit: 6,});console.log(res);this.reList = res.data.result;}, }; </script>
  • 1.10 網易云音樂- 首頁-最新音樂

    目標: van-cell單元格使用

    請求地址: /personalized/newsong

  • 引入van-cell使用 - 注冊組件main.js中

    import {Cell} from 'vant'; Vue.use(Cell);
  • 定義接口請求方法 - api/index.js

    // 首頁 - 推薦最新音樂 export const newMusic = params => request({url: "/personalized/newsong",params })
  • 列表數據鋪設 - 插入自定義標簽

    <template><div><p class="title">推薦歌單</p><div><van-row gutter="5"><van-col span="8" v-for="obj in recommendList" :key="obj.id"><van-image fit="cover" :src="obj.picUrl" /><p class="song_name">{{ obj.name }}</p></van-col></van-row></div><p class="title">最新音樂</p><van-cell center v-for="obj in songList" :key="obj.id" :title="obj.name" :label="obj.song.artists[0].name + ' - ' + obj.name"><template #right-icon><van-icon name="play-circle-o" size="0.6rem"/></template></van-cell></div> </template><script> import { recommendMusicAPI, newMusicAPI } from "@/api"; export default {data() {return {reList: [], // 推薦歌單數據songList: [], // 最新音樂數據};},async created() {const res = await recommendMusicAPI({limit: 6,});console.log(res);this.reList = res.data.result;const res2 = await newMusicAPI({limit: 20})console.log(res2);this.songList = res2.data.result}, }; </script>
  • 1.11 網易云音樂-搜索-熱搜關鍵字

    目標: 完成熱搜關鍵字鋪設

    搜索框 – van-search組件

    api/Search.js – 熱搜關鍵字 - 接口方法

    Search/index.vue引入-獲取熱搜關鍵字 - 鋪設頁面

    點擊文字填充到輸入框

  • 準備搜索界面標簽
  • <template><div><van-searchshape="round"placeholder="請輸入搜索關鍵詞"/><!-- 搜索下容器 --><div class="search_wrap"><!-- 標題 --><p class="hot_title">熱門搜索</p><!-- 熱搜關鍵詞容器 --><div class="hot_name_wrap"><!-- 每個搜索關鍵詞 --><spanclass="hot_item">熱搜關鍵字</span></div></div></div> </template> <script> export default {} </script><style scoped> /* 搜索容器的樣式 */ .search_wrap {padding: 0.266667rem; }/*熱門搜索文字標題樣式 */ .hot_title {font-size: 0.32rem;color: #666; }/* 熱搜詞_容器 */ .hot_name_wrap {margin: 0.266667rem 0; }/* 熱搜詞_樣式 */ .hot_item {display: inline-block;height: 0.853333rem;margin-right: 0.213333rem;margin-bottom: 0.213333rem;padding: 0 0.373333rem;font-size: 0.373333rem;line-height: 0.853333rem;color: #333;border-color: #d3d4da;border-radius: 0.853333rem;border: 1px solid #d3d4da; }/* 給單元格設置底部邊框 */ .van-cell {border-bottom: 1px solid lightgray; } </style>
  • api/Search.js - 定義熱門搜索接口方法和搜索結果方法
  • import request from '@/utils/request'// 熱搜關鍵字 export const hotSearch = () => request({url: '/search/hot' })// 搜索結果列表 export const searchResult = params => request({url: '/cloudsearch',params })
  • api/index.js - 導入使用并統一導出
  • // 統一出口 // 你也可以在邏輯頁面里.vue中直接引入@/api/Home下的網絡請求工具方法 // 為什么: 我們可以把api所有的方法都統一到一處. import {recommendMusic, hotMusic} from '@/api/Home' import {hotSearch, searchResult} from '@/api/Search'export const recommendMusicAPI = recommendMusic // 把網絡請求方法拿過來 導出 export const hotMusicAPI = hotMusic // 把獲取最新音樂的, 網絡請求方法導出export const hotSearchAPI = hotSearch // 熱搜 export const searchResultAPI = searchResult // 搜索結果
  • created中請求接口-拿到熱搜關鍵詞列表
  • <!-- 每個搜索關鍵詞 --> <spanclass="hot_item"v-for="(obj, index) in hotArr":key="index">{{ obj.first }}</span><script>// 目標: 鋪設熱搜關鍵字// 1. 搜索框van-search組件, 關鍵詞標簽和樣式// 2. 找接口, api/Search.js里定義獲取搜索關鍵詞的請求方法// 3. 引入到當前頁面, 調用接口拿到數據循環鋪設頁面// 4. 點擊關鍵詞把值賦予給van-search的v-model變量import { hotSearchAPI } from "@/api";export default {data(){return {hotArr: [], // 熱搜關鍵字}},async created() {const res = await hotSearchAPI();console.log(res);this.hotArr = res.data.result.hots;},} </script>
  • 點擊熱詞填充到輸入框
  • <van-searchshape="round"v-model="value"placeholder="請輸入搜索關鍵詞"/> <!-- 每個搜索關鍵詞 --> <spanclass="hot_item"v-for="(obj, index) in hotArr":key="index"@click="fn(obj.first)">{{ obj.first }}</span> </div><script>export default {data(){return {value: "",hotArr: [], // 熱搜關鍵字}},// ...省略了createdmethods: {async fn(val) {// 點擊熱搜關鍵詞this.value = val; // 選中的關鍵詞顯示到搜索框},}} </script>

    總結: 寫好標簽和樣式, 拿到數據循環鋪設, 點擊關鍵詞填入到van-search中

    1.12 網易云音樂-搜索-點擊熱詞-搜索結果

    目標: 點擊熱詞填充到輸入框-出搜索結果

    api/Search.js - 搜索結果, 接口方法

    Search/index.vue引入-獲取搜索結果 - 鋪設頁面

    和熱搜關鍵字容器 – 互斥顯示

    點擊文字填充到輸入框, 請求搜索結果鋪設

  • 搜索結果顯示區域標簽+樣式(直接復制/vant文檔找)
  • <!-- 搜索結果 --><div class="search_wrap"><!-- 標題 --><p class="hot_title">最佳匹配</p><van-cellcentertitle='結果名字'><template #right-icon><van-icon name="play-circle-o" size="0.6rem"/></template></van-cell></div>
  • 點擊 - 獲取搜索結果 - 循環鋪設頁面
  • <template><div><van-search shape="round" v-model="value" placeholder="請輸入搜索關鍵詞" /><!-- 搜索下容器 --><div class="search_wrap"><!-- 標題 --><p class="hot_title">熱門搜索</p><!-- 熱搜關鍵詞容器 --><div class="hot_name_wrap"><!-- 每個搜索關鍵詞 --><spanclass="hot_item"v-for="(obj, index) in hotArr":key="index"@click="fn(obj.first)">{{ obj.first }}</span></div></div><!-- 搜索結果 --><div class="search_wrap"><!-- 標題 --><p class="hot_title">最佳匹配</p><van-cellcenterv-for="obj in resultList":key="obj.id":title="obj.name":label="obj.ar[0].name + ' - ' + obj.name"><template #right-icon><van-icon name="play-circle-o" size="0.6rem"/></template></van-cell></div></div> </template> <script> // 目標: 鋪設熱搜關鍵字 // 1. 搜索框van-search組件, 關鍵詞標簽和樣式 // 2. 找接口, api/Search.js里定義獲取搜索關鍵詞的請求方法 // 3. 引入到當前頁面, 調用接口拿到數據循環鋪設頁面 // 4. 點擊關鍵詞把值賦予給van-search的v-model變量// 目標: 鋪設搜索結果 // 1. 找到搜索結果的接口 - api/Search.js定義請求方法 // 2. 再定義methods里getListFn方法(獲取數據) // 3. 在點擊事件方法里調用getListFn方法拿到搜索結果數據 // 4. 鋪設頁面(首頁van-cell標簽復制過來) // 5. 把數據保存到data后, 循環van-cell使用即可(切換歌手字段) // 6. 互斥顯示搜索結果和熱搜關鍵詞 import { hotSearchAPI, searchResultListAPI } from "@/api"; export default {data() {return {value: "",hotArr: [], // 熱搜關鍵字resultList: [], // 搜索結果};},async created() {const res = await hotSearchAPI();console.log(res);this.hotArr = res.data.result.hots;},methods: {async getListFn() {return await searchResultListAPI({keywords: this.value,limit: 20,}); // 把搜索結果return出去// (難點):// async修飾的函數 -> 默認返回一個全新Promise對象// 這個Promise對象的結果就是async函數內return的值// 拿到getListFn的返回值用await提取結果},async fn(val) {// 點擊熱搜關鍵詞this.value = val; // 選中的關鍵詞顯示到搜索框const res = await this.getListFn();console.log(res);this.resultList = res.data.result.songs;},}, }; </script>
  • 互斥顯示, 熱搜關鍵詞和搜索結果列表
  • 總結: 點擊熱詞后, 調用接口傳入關鍵詞, 返回數據鋪設

    1.13 網易云音樂-輸入框-搜索結果

    目標: 監測輸入框改變-拿到搜索結果

    觀察van-search組件是否支持和實現input事件

    綁定@input事件和方法

    在事件處理方法中獲取對應的值使用

    如果搜索不存在的數據-要注意接口返回字段不同

  • 綁定@input事件在van-search上
  • <van-search shape="round" v-model="value" placeholder="請輸入搜索關鍵詞" @input="inputFn"/>
  • 實現輸入框改變 - 獲取搜索結果鋪設
  • async inputFn() {// 輸入框值改變if (this.value.length === 0) {// 搜索關鍵詞如果沒有, 就把搜索結果清空阻止網絡請求發送(提前return)this.resultList = [];return;}const res = await this.getListFn();console.log(res);// 如果搜索結果響應數據沒有songs字段-無數據if (res.data.result.songs === undefined) {this.resultList = [];return;}this.resultList = res.data.result.songs; },

    總結: 監測輸入框改變-保存新的關鍵詞去請求結果回來鋪設

    1.14 網易云音樂-搜索結果-加載更多

    目標: 觸底后, 加載下一頁數據

    觀察接口文檔: 發現需要傳入offset和分頁公式

    van-list組件監測觸底執行onload事件

    配合后臺接口, 傳遞下一頁的標識

    拿到下一頁數據后追加到當前數組末尾即可

  • 設置van-list組件實現相應的屬性和方法, 讓page++去請求下頁數據
  • <van-listv-model="loading":finished="finished"finished-text="沒有更多了"@load="onLoad"><van-cellcenterv-for="obj in resultList":key="obj.id":title="obj.name":label="obj.ar[0].name + ' - ' + obj.name"><template #right-icon><van-icon name="play-circle-o" size="0.6rem" /></template></van-cell></van-list> <script> // 目標: 加載更多 // 1. 集成list組件-定義相關的變量(搞懂變量的作用) -監測觸底事件 // 2. 一旦觸底, 自動執行onload方法 // 3. 對page++, 給后臺傳遞offset偏移量參數-請求下一頁的數據 // 4. 把當前數據和下一頁新來的數據拼接起來用在當前 頁面的數組里 // (切記) - 加載更多數據后,一定要把loading改成false, 保證下一次還能觸發onload方法 export default {data() {return {value: "",hotArr: [], // 熱搜關鍵字resultList: [], // 搜索結果loading: false, // 加載中 (狀態) - 只有為false, 才能觸底后自動觸發onload方法finished: false, // 未加載全部 (如果設置為true, 底部就不會再次執行onload, 代表全部加載完成)page: 1, // 當前搜索結果的頁碼};},// ...省略其他methods: {async getListFn() {return await searchResultListAPI({keywords: this.value,limit: 20,offset: (this.page - 1) * 20, // 固定公式}); // 把搜索結果return出去// (難點):// async修飾的函數 -> 默認返回一個全新Promise對象// 這個Promise對象的結果就是async函數內return的值// 拿到getListFn的返回值用await提取結果},async onLoad() {// 觸底事件(要加載下一頁的數據咯), 內部會自動把loading改為truethis.page++;const res = await this.getListFn();this.resultList = [...this.resultList, ...res.data.result.songs];this.loading = false; // 數據加載完畢-保證下一次還能觸發onload},}, }; </script>

    總結: list組件負責UI層監測觸底, 執行onload函數, page++, 請求下頁數據, 和現在數據合并顯示更多, 設置loading為false, 確保下次觸底還能執行onLoad

    1.15 網易云音樂-加載更多-bug修復

    目標: 如果只有一頁數據/無數據判斷

    無數據/只有一頁數據, finished為true

    防止list組件觸底再加載更多

    還要測試-按鈕點擊/輸入框有數據情況的加載更多

    正確代碼

    async fn(val) {// 點擊熱搜關鍵詞 + this.finished = false; // 點擊新關鍵詞-可能有新的數據this.value = val; // 選中的關鍵詞顯示到搜索框const res = await this.getListFn();console.log(res);this.resultList = res.data.result.songs; + this.loading = false; // 本次數據加載完畢-才能讓list加載更多},async inputFn() { + this.finished = false // 輸入框關鍵字改變-可能有新數據(不一定加載完成了)// 輸入框值改變if (this.value.length === 0) {// 搜索關鍵詞如果沒有, 就把搜索結果清空阻止網絡請求發送(提前return)this.resultList = [];return;}const res = await this.getListFn();console.log(res);+ // 如果搜索結果響應數據沒有songs字段-無數據 + if (res.data.result.songs === undefined) { + this.resultList = []; + return; + }this.resultList = res.data.result.songs; + this.loading = false;},async onLoad() {// 觸底事件(要加載下一頁的數據咯), 內部會自動把loading改為truethis.page++;const res = await this.getListFn(); + if (res.data.result.songs === undefined) { // 沒有更多數據了 + this.finished = true; // 全部加載完成(list不會在觸發onload方法) + this.loading = false; // 本次加載完成 + return; + }this.resultList = [...this.resultList, ...res.data.result.songs]; + this.loading = false; // 數據加載完畢-保證下一次還能觸發onload},

    總結: 在3個函數 上和下, 設置finished還未完成, 最后要把loading改成false, 判斷songs字段, 對這里的值要非常熟悉才可以

    1.16 網易云音樂-輸入框-防抖

    目標: 輸入框觸發頻率過高

    輸入框輸入"asdfghjkl"

    ? 接著快速的刪除

    ? 每次改變-馬上發送網絡請求

    ? 網絡請求異步耗時 – 數據回來后還是鋪設到頁面上

    解決:

    ? 引入防抖功能

    async inputFn() {// 目標: 輸入框改變-邏輯代碼-慢點執行// 解決: 防抖// 概念: 計時n秒, 最后執行一次, 如果再次觸發, 重新計時// 效果: 用戶在n秒內不觸發這個事件了, 才會開始執行邏輯代碼if (this.timer) clearTimeout(this.timer);this.timer = setTimeout(async () => {this.finished = false; // 輸入框關鍵字改變-可能有新數據(不一定加載完成了)// 輸入框值改變if (this.value.length === 0) {// 搜索關鍵詞如果沒有, 就把搜索結果清空阻止網絡請求發送(提前return)this.resultList = [];return;}const res = await this.getListFn();console.log(res);// 如果搜索結果響應數據沒有songs字段-無數據if (res.data.result.songs === undefined) {this.resultList = [];return;}this.resultList = res.data.result.songs;this.loading = false;}, 900); },

    總結: 降低函數執行頻率

    1.17 網易云音樂-頁碼bug修復

    目標: 第一個關鍵詞page已經+到了10, 再第二個關鍵詞應該從1開始

    加載更多時, page已經往后計數了

    重新獲取時, page不是從第一頁獲取的

    點擊搜索/輸入框搜索時, 把page改回1

    代碼如下:

    async fn(val) {// 點擊熱搜關鍵詞 + this.page = 1; // 點擊重新獲取第一頁數據this.finished = false; // 點擊新關鍵詞-可能有新的數據this.value = val; // 選中的關鍵詞顯示到搜索框const res = await this.getListFn();console.log(res);this.resultList = res.data.result.songs;this.loading = false; // 本次數據加載完畢-才能讓list加載更多},async inputFn() {// 目標: 輸入框改變-邏輯代碼-慢點執行// 解決: 防抖// 概念: 計時n秒, 最后執行一次, 如果再次觸發, 重新計時// 效果: 用戶在n秒內不觸發這個事件了, 才會開始執行邏輯代碼if (this.timer) clearTimeout(this.timer);this.timer = setTimeout(async () => { + this.page = 1; // 點擊重新獲取第一頁數據this.finished = false; // 輸入框關鍵字改變-可能有新數據(不一定加載完成了)// 輸入框值改變if (this.value.length === 0) {// 搜索關鍵詞如果沒有, 就把搜索結果清空阻止網絡請求發送(提前return)this.resultList = [];return;}const res = await this.getListFn();console.log(res);// 如果搜索結果響應數據沒有songs字段-無數據if (res.data.result.songs === undefined) {this.resultList = [];return;}this.resultList = res.data.result.songs;this.loading = false;}, 900);},

    總結: 切換時, 讓page頁面回到1

    1.18 網易云音樂-Layout邊距優化

    目標: 上下導航會蓋住中間內容

    我們的頭部導航和底部導航擋住了中間內容

    給中間路由頁面設置上下內邊距即可

    在Layout/index.vue中

    /* 中間內容區域 - 容器樣式(留好上下導航所占位置) */ .main {padding-top: 46px;padding-bottom: 50px; }

    1.19 網易云音樂-SongItem封裝

    目標: 把首頁和搜索結果的歌曲cell封裝起來

    創建src/components/SongItem.vue

    <template><van-cell center :title="name" :label="author + ' - ' + name"><template #right-icon><van-icon name="play-circle-o" size="0.6rem"/></template></van-cell> </template><script> export default {props: {name: String, // 歌名author: String, // 歌手id: Number, // 歌曲id (標記這首歌曲-為將來跳轉播放頁做準備)} }; </script><style scoped> /* 給單元格設置底部邊框 */ .van-cell {border-bottom: 1px solid lightgray; } </style>

    Home/index.vue - 重構

    注意: author字段不同

    <SongItem v-for="obj in songList":key="obj.id":name="obj.name":author="obj.song.artists[0].name":id="obj.id" ></SongItem>

    Search/index.vue - 重構

    注意: author字段不同

    <SongItemv-for="obj in resultList":key="obj.id":name="obj.name":author="obj.ar[0].name":id="obj.id" ></SongItem>

    總結: 遇到重復標簽要封裝

    1.20 網易云音樂-播放音樂

    目標: 從預習資料拿到播放的api和頁面, 配置好路由規則

    時間關系,這個頁面不用寫, 直接用, 注釋在備課代碼里寫好了

    組件SongItem里 – 點擊事件

    api/Play.js – 提前準備好 – 接口方法

    跳轉到Play頁面 – 把歌曲id帶過進去

    在SongItem.vue - 點擊播放字體圖標

    methods: {playFn(){this.$router.push({path: '/play',query: {id: this.id // 歌曲id, 通過路由跳轉傳遞過去}})} }

    總結: 準備好播放頁, 點擊播放傳歌曲id過去, 到播放頁-再請求響應數據和歌曲地址用audio標簽播放

    1.21 網易云音樂-vant適配

    目標: 切換不同機型, 刷新后看看標簽大小適配嗎

    • postcss – 配合webpack翻譯css代碼
    • postcss-pxtorem – 配合webpack, 自動把px轉成rem
    • 新建postcss.config.js – 設置相關配置
    • 重啟服務器, 再次觀察Vant組件是否適配
  • 下載postcss和postcss-pxtorem@5.1.1

    postcss作用: 是對css代碼做降級處理

    postcss-pxtorem: 自動把所有代碼里的css樣式的px, 自動轉rem

  • src/新建postcss.config.js

  • module.exports = {plugins: {'postcss-pxtorem': {// 能夠把所有元素的px單位轉成Rem// rootValue: 轉換px的基準值。// 例如一個元素寬是75px,則換成rem之后就是2rem。rootValue: 37.5,propList: ['*']}} }

    附全文代碼——與案例代碼實現方法不統一


    api/Home.js

    // 文件名-盡量和模塊頁面文件名統一(方便查找) import request from '@/utils/request' // import axios from 'axios'// 首頁 - 推薦歌單 export const recommendMusic = params => request({url: '/personalized',params// 將來外面可能傳入params的值 {limit: 20} })// 首頁 - 推薦最新音樂 export const newMusic = params => request({url: "/personalized/newsong",params })

    api/index.js

    // api文件夾下 各個請求模塊js, 都統一來到index.js再向外導出 import {recommendMusic, newMusic} from './Home' // import {hotSearch, searchResultList} from './Search' import {getSongById, getLyricById} from './Play'export const recommendMusicAPI = recommendMusic // 請求推薦歌單的方法導出 export const newMusicAPI = newMusic // 首頁 - 最新音樂// export const hotSearchAPI = hotSearch // 搜索 - 熱搜關鍵詞 // export const searchResultListAPI = searchResultList // 搜索 = 搜索結果export const getSongByIdAPI = getSongById // 歌曲 - 播放地址 export const getLyricByIdAPI = getLyricById // 歌曲 - 歌詞數據

    api/Play.js

    import request from '../utils/request'// 播放頁 - 獲取歌曲詳情 export const getSongById = (id) => request({url: `/song/detail?ids=${id}`,method: "GET" })// 播放頁 - 獲取歌詞 export const getLyricById = (id) => request({url: `/lyric?id=${id}`,method: "GET" })

    api/Search.js

    // 搜索模塊 import request from '@/utils/request'// 熱搜關鍵字 export function hotSearch() {return request({// method: 'get'url: '/search/hot'}) }// 搜索結果 export const searchResultList = params => request({url: '/cloudsearch',params })// export const hotSearch = params => request({ // url: '/search/hot', // params // })// 搜索結果 // export const searchResultList = params => request({ // url: '/cloudsearch', // params // })

    剩下的…可以私信我,我打包了,實在貼不動了

    以iphone6為基準, 37.5px為基準值換算rem

    今日總結

    • 掌握vant組件庫的使用 - 找組件, 引組件, 用組件
    • 能夠對vant組件自帶樣式進行覆蓋自定義
    • 遇到重復的標簽, 自己也封裝了一個復用的組件
    • 掌握查詢文檔和使用每個屬性的方式

    總結

    以上是生活随笔為你收集整理的调用网易云Api接口实现移动Web网易云部分功能(搜索+列表+播放)的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

    久久久免费网站 | 久久五月情影视 | 激情五月av | 欧美国产日韩在线观看 | 中文字幕一区二区在线观看 | 欧洲在线免费视频 | 91精品入口 | 色综合人人 | 久久草网站 | 日韩免费一区 | 六月丁香激情综合色啪小说 | 9在线观看免费高清完整版在线观看明 | 视频国产在线观看18 | 夜夜操天天 | 国产特级毛片aaaaaa高清 | 日韩在线 一区二区 | 亚洲涩涩网站 | 人人dvd| 天堂av在线网 | 五月婷婷在线观看 | 啪啪激情网 | 中文字幕韩在线第一页 | 中文字幕av全部资源www中文字幕在线观看 | 最新av免费在线观看 | 香蕉在线视频播放网站 | 一区二区理论片 | 色婷婷在线视频 | 亚洲激情网站免费观看 | 深爱五月激情五月 | 亚洲精品高清一区二区三区四区 | 国产五月色婷婷六月丁香视频 | 久久视频免费看 | 国内少妇自拍视频一区 | 中文字幕在线观看网站 | 91桃色在线观看视频 | 免费看色网站 | 国产午夜视频在线观看 | 国语精品免费视频 | 婷婷资源站| 国产手机视频精品 | 久久精品毛片 | 国产美女永久免费 | 国内外成人在线视频 | av片中文字幕 | 99热国内精品 | 久草免费电影 | 国产中文字幕在线 | 欧美激情精品久久久久久变态 | 久久电影日韩 | 欧美视频一区二 | 一区av在线播放 | 久久国产精品久久精品 | 日本美女xx | 国产.精品.日韩.另类.中文.在线.播放 | 国产精品国产亚洲精品看不卡15 | 久久超 | 国产成人精品一区二区三区 | 黄色av电影在线观看 | 91在线看黄| 日韩影片在线观看 | 久久香蕉电影 | 免费观看黄 | 国产亚洲精品久久19p | 少妇bbb| 欧美日本啪啪无遮挡网站 | 天堂va在线高清一区 | 亚洲香蕉在线观看 | 在线日本看片免费人成视久网 | 高清av免费看 | 天天干,天天干 | 国产69精品久久99的直播节目 | 色在线中文字幕 | 五月婷婷六月丁香 | 激情视频免费在线 | 婷五月激情 | 天天操天天操天天操天天操天天操 | 久久国产精品视频 | 亚洲一二视频 | 欧美一级电影片 | 丁香综合 | 99国产精品一区二区 | 久久99精品久久久久久久久久久久 | 五月婷在线观看 | a黄色影院| 婷婷色中文字幕 | 91九色蝌蚪视频在线 | 波多野结衣小视频 | 欧美久久成人 | a久久久久久 | 欧美亚洲另类在线视频 | 国产一区二区观看 | 国产永久免费 | 国产在线日韩 | 免费开视频 | 精品日韩在线一区 | 国产精品麻豆视频 | 欧美 国产 视频 | 日本不卡123区 | 中文字幕日韩国产 | 中文字幕 在线看 | 91久久精 | 天天天天天天干 | 91人人澡 | 91在线免费播放视频 | 精品视频中文字幕 | 精品在线视频一区二区三区 | 国产黄色a| www.狠狠| 欧美成人理伦片 | 久久一区二区三区超碰国产精品 | 黄色成人小视频 | 精品黄色片| 免费在线观看91 | 青青网视频 | 天天射天天干天天插 | 91精品网站| 婷香五月 | 99久久夜色精品国产亚洲 | 美女视频黄免费的久久 | 国产一区视频免费在线观看 | 天天干com | 婷婷六月综合亚洲 | 精品久久久精品 | 国产亚洲在线观看 | 久久玖| 国产精品com | 五月婷婷丁香激情 | 日韩日韩日韩日韩 | 三上悠亚在线免费 | 国产高清99 | 欧美激情综合五月色丁香小说 | 91视频首页 | 中文字幕美女免费在线 | 麻豆免费视频网站 | 国产欧美日韩精品一区二区免费 | 欧美精品xxx| 日本久久久久久久久久 | 国产精品一区电影 | a视频免费 | 麻豆视频在线播放 | 日本精品久久久一区二区三区 | 干综合网| 中文字幕国内精品 | 国产99色 | 免费网址你懂的 | 亚洲精品视频二区 | 久久9999久久免费精品国产 | 在线播放精品一区二区三区 | 久久精品网| 日本丰满少妇免费一区 | 国产精品欧美日韩 | 久久大香线蕉app | 在线免费黄色毛片 | 黄色国产在线 | 日本特黄特色aaa大片免费 | 在线观看蜜桃视频 | 在线国产视频 | 久久久久二区 | 国产成人99av超碰超爽 | 91免费在线播放 | 久久午夜视频 | 婷婷射五月 | 波多野结衣在线播放一区 | 日韩免费高清 | 国产精品久久久区三区天天噜 | 在线 成人 | 久久天天操 | 美女久久久久久久久久久 | 午夜精品一区二区三区在线播放 | 最近中文字幕大全中文字幕免费 | 视频二区在线 | 日本中文不卡 | 欧美激情综合网 | 丰满少妇在线观看 | 免费看污黄网站 | 国产精华国产精品 | 91精品国产网站 | 亚洲成人第一区 | 成人99免费视频 | 亚洲精品av中文字幕在线在线 | www.xxxx变态.com| 91黄色视屏 | 美女天天操 | 色婷婷综合成人av | 国产精品久久久区三区天天噜 | 激情网五月| 免费高清在线观看成人 | 狠狠干狠狠插 | 成人免费在线观看电影 | 综合网天天射 | 国产99久久久精品视频 | 在线免费观看视频 | 欧美成人影音 | 精品免费久久久久久 | 日韩av成人在线 | 日韩精品中文字幕一区二区 | 国产精品99久久免费黑人 | 婷婷在线网站 | 国产精品刺激对白麻豆99 | 国产精品a久久 | 欧美性受极品xxxx喷水 | 91av视频网 | 久久久免费毛片 | 久久精品一区二区三区中文字幕 | 亚洲乱码国产乱码精品天美传媒 | 日韩电影在线看 | 夜夜躁日日躁狠狠久久88av | 97精品国产97久久久久久久久久久久 | 亚洲天堂香蕉 | 天天操天天怕 | 99久久精品久久久久久动态片 | 成人欧美一区二区三区在线观看 | 欧美精品免费一区二区 | 国产亚洲精品美女久久 | 521色香蕉网站在线观看 | 天天综合网久久综合网 | 人人超碰人人 | av免费看电影 | 国产美女精品视频免费观看 | 狠狠色丁香婷综合久久 | 国产精品一区二区62 | 久久综合视频网 | 亚洲国产成人久久综合 | 中文字幕999 | 久久你懂得 | 国产69精品久久99不卡的观看体验 | 中文字幕高清av | 天天碰天天操视频 | 免费观看一级特黄欧美大片 | 国产精品一区二区三区在线播放 | 欧美另类巨大 | 欧美精品一区二区免费 | 成人一级视频在线观看 | 久久久受www免费人成 | 一二三精品视频 | 婷婷在线网 | 亚洲精品欧洲精品 | 亚洲午夜精品电影 | 国产天天爽 | 免费色视频网址 | 国内精品亚洲 | 天天搞天天| 国产精品久久一区二区无卡 | 久久伦理 | 国产免费观看高清完整版 | 在线观看视频精品 | 欧美久久久久久久久久久 | 欧美亚洲国产精品久久高清浪潮 | 最新中文字幕在线资源 | 精品国产三级a∨在线欧美 免费一级片在线观看 | 精品一区二区在线免费观看 | 日本在线观看一区 | 日本中文字幕在线视频 | 日韩免费在线视频观看 | 国产永久免费高清在线观看视频 | 国产不卡精品视频 | 蜜臀久久99精品久久久久久网站 | 91久久精品日日躁夜夜躁国产 | 日本中文字幕在线 | 天天操天天拍 | 麻豆国产网站 | 成年人国产精品 | 一区二区成人国产精品 | 精品夜夜嗨av一区二区三区 | 日本少妇久久久 | 日韩精品欧美专区 | 精品一二三区视频 | 日韩欧美一级二级 | 欧美有色 | 久久综合成人网 | 蜜臀久久99精品久久久酒店新书 | 欧美日本不卡高清 | 深夜成人av | 狠狠狠色丁香婷婷综合久久五月 | 日日夜夜综合网 | 国产高清在线一区 | 国产手机av | 91精品在线免费观看视频 | 日本成人中文字幕在线观看 | 免费看日韩| 亚洲精品国产精品乱码不99热 | 97超碰伊人| 狠狠狠色丁香婷婷综合激情 | 超碰人人在 | 亚洲在线精品 | 99久久超碰中文字幕伊人 | 亚洲国产日韩精品 | 97超碰资源总站 | 91精品国产99久久久久久久 | 99热在线观看免费 | 国产特黄色片 | 99综合视频 | 日韩精品中文字幕久久臀 | 国产视频在线一区二区 | 日日夜夜狠狠操 | 最近免费在线观看 | av电影一区| 亚洲理论影院 | 欧美色综合久久 | 中文字幕 国产专区 | 最近免费中文字幕mv在线视频3 | 亚洲国产播放 | 久久综合福利 | 亚洲 欧美 变态 国产 另类 | 亚洲精品日韩一区二区电影 | 美女黄濒 | 91爱看片 | 日韩精品资源 | av大全在线免费观看 | 一区二区三区电影大全 | 欧美日韩精品区 | 欧美精品v国产精品 | 亚洲狠狠操 | 天天综合久久综合 | 男女男视频 | 五月婷婷六月综合 | 国产亚洲片 | 国产精品自产拍在线观看中文 | 欧美一区三区四区 | 国产精品免费麻豆入口 | 国产精品美女久久久久久 | 91av福利视频 | 美女网站视频一区 | 4438全国亚洲精品观看视频 | 9999毛片| 精品在线视频一区二区三区 | 最新日韩视频 | 狠狠搞,com| 午夜久久精品 | 日韩av有码在线 | 欧美一区成人 | 国产精品青草综合久久久久99 | 中文字幕av播放 | 欧美日韩一区二区三区不卡 | 精品久久久久久国产91 | 97在线观看免费观看高清 | 免费在线成人av | 免费在线观看av片 | 97成人精品区在线播放 | 97在线精品 | 国产精品不卡av | 97精品国产97久久久久久久久久久久 | 国产在线观看免费 | 日韩黄色大片在线观看 | 91视频免费看 | 黄色在线免费观看网址 | 99视频导航| 色播亚洲婷婷 | 97超碰站 | 日日夜夜噜 | 久久官网| 黄色毛片一级片 | 黄色一及电影 | 日本中文字幕高清 | 日韩深夜在线观看 | 最新日本中文字幕 | 在线观看免费成人 | 国产成人一二三 | 福利久久久| 中文永久免费观看 | 99视频在线观看视频 | 国产一区二三区好的 | 免费黄色网址网站 | 美女一二三区 | 亚洲精品国产精品国自 | 六月丁香激情网 | 久久久国产一区二区三区 | 一区二区三区三区在线 | 婷婷丁香五 | 99精品国产99久久久久久97 | 97天天综合网 | 人人插人人草 | 中中文字幕av在线 | 亚洲国产人午在线一二区 | se婷婷| 欧洲一区精品 | 亚洲一区av| 久久伊人婷婷 | 日韩av黄| 在线观看视频在线观看 | 国产日韩在线视频 | 婷婷六月激情 | 奇米7777狠狠狠琪琪视频 | 国产精品不卡在线播放 | 麻豆国产视频下载 | 五月亚洲 | 欧美在线视频日韩 | 91在线文字幕 | 国产精品k频道 | 国产精品免费视频观看 | 国产高清精品在线 | 91成人久久 | 国产精品美女在线观看 | 日本精品小视频 | 日韩在线观看你懂得 | 亚洲欧美视频 | www亚洲精品| 激情视频久久 | av在线收看| 日日爽 | 亚洲国产视频网站 | 成人av在线影院 | 日韩中文字幕免费看 | 成人性生交大片免费看中文网站 | 色婷婷国产 | 最近日韩中文字幕中文 | 综合网在线视频 | 欧美亚洲精品在线观看 | 亚洲国产激情 | 操操操干干干 | 国产视频美女 | 色欧美88888久久久久久影院 | 波多野结衣视频一区 | 欧美日韩免费观看一区=区三区 | 激情综合网五月 | 国产免费中文字幕 | 欧美日韩免费观看一区二区三区 | 久久久.com| 久草在线视频资源 | 欧美日韩高清在线观看 | 成人黄色在线 | 开心丁香婷婷深爱五月 | 亚洲涩涩涩| 国产视频每日更新 | 黄色影院在线免费观看 | 国产大尺度视频 | 亚洲精品网页 | 亚洲一区二区三区在线看 | 91香蕉久久 | www.久久爱.cn | 久久精品中文字幕免费mv | 成年人精品 | 人人澡人| 国产亚洲精品女人久久久久久 | 黄色亚洲免费 | 美女久久久久久久 | 国产美腿白丝袜足在线av | 午夜精品导航 | www.黄色片.com| 超碰97在线资源站 | 欧美肥妇free | 91视频亚洲 | 狠狠操狠狠干天天操 | 中文字幕一区二区三区视频 | 国产很黄很色的视频 | 美女在线观看av | 色999精品| 国内精品久久久久久久久 | 黄色国产成人 | 色射爱 | 香蕉视频在线网站 | 亚洲综合色婷婷 | 在线看中文字幕 | 久久亚洲热 | 男女日麻批 | 中文字幕久久亚洲 | 日韩电影一区二区三区在线观看 | 色婷婷狠 | 不卡av在线播放 | 久久亚洲婷婷 | 婷婷丁香激情网 | 国产精品久久艹 | 日韩欧美综合精品 | 五月亚洲 | 毛片3| av资源中文字幕 | 久久久久国产精品午夜一区 | 国产精品第一页在线观看 | 久久久影院官网 | 激情五月婷婷激情 | 精品久久久久久亚洲综合网 | 五月的婷婷| 亚洲最新视频在线播放 | 黄色一级性片 | 国产一区成人在线 | 久久尤物电影视频在线观看 | av福利在线看 | 久久久首页 | 高清久久久久久 | 天天操天天干天天操天天干 | 97视频免费在线观看 | 99精品国产亚洲 | 在线中文字幕电影 | 日韩精品一二三 | 日韩理论在线播放 | 国产精品成人一区二区三区吃奶 | 天天干天天干 | 久久视频国产精品免费视频在线 | 精品女同一区二区三区在线观看 | 中文字幕在线观看av | 黄色天堂在线观看 | 日韩在线播放视频 | 五月婷婷丁香 | 亚洲性xxxx| 欧美视频18 | 亚洲精品在线播放视频 | 天堂在线一区二区 | 亚洲最大成人网4388xx | 日日成人网 | 在线99| 亚洲www天堂com | 99精品视频在线播放观看 | 日日操夜 | 91麻豆精品国产91久久久无需广告 | 91精品999 | 美国av片在线观看 | 伊人看片| av免费试看 | 日日天天| 日本中文在线播放 | 天天综合天天做天天综合 | 成人网在线免费视频 | 成人av手机在线 | 99久久精品免费看 | 精品免费观看视频 | 亚洲黄色免费网站 | 午夜精品久久久久 | 国产专区欧美专区 | 国产精品ssss在线亚洲 | 日韩精品视频一二三 | 色久av| 国产精品免费在线观看视频 | 久久综合精品国产一区二区三区 | 91豆花在线 | 最近中文字幕大全 | 国产日韩欧美在线一区 | 激情视频区 | 久久婷婷一区二区三区 | 久久一区91 | 日韩av在线网站 | 色噜噜狠狠狠狠色综合久不 | 亚洲永久精品在线 | 欧美少妇影院 | 国产精品久久一区二区无卡 | 国偷自产中文字幕亚洲手机在线 | 国产精品三级视频 | 中文字幕亚洲五码 | av大片免费在线观看 | 视频一区二区视频 | 国产成人777777 | 亚洲综合精品视频 | 日韩一级电影网站 | 十八岁免进欧美 | 成 人 黄 色视频免费播放 | 一区二区激情视频 | 天天天天色射综合 | www.夜夜操.com | 人人狠狠综合久久亚洲 | av电影在线播放 | 国产玖玖精品视频 | 91精品国产92久久久久 | 久久久久免费精品国产小说色大师 | 国产精品免费在线播放 | 国产精品视频专区 | 天天操天天操天天操天天 | 久久久久久国产精品亚洲78 | 国产在线高清精品 | 国产中文字幕网 | 国产免费观看久久 | 色的网站在线观看 | 在线观看免费成人av | 久久国产精品系列 | 国产日本在线观看 | 亚洲视频2| 香蕉在线观看 | 狠狠的干 | a一片一级| 国产黄色看片 | 国产剧情av在线播放 | 亚洲美女在线一区 | 中文字幕在线播放一区 | 中文字幕在线一二 | 99久久婷婷国产一区二区三区 | 亚洲日日日 | 亚洲精品乱码久久久久久高潮 | 亚洲一级二级 | 狠狠干干 | 国产黄影院色大全免费 | 婷婷色在线播放 | 五月婷婷开心中文字幕 | 最新国产精品亚洲 | 日韩av电影中文字幕在线观看 | 91热在线| 色www永久免费 | 日韩av资源在线观看 | 国产日本三级 | 国产精品18p | 在线观看91久久久久久 | 国产人成在线视频 | 四虎影视精品成人 | 国产视频一二区 | av黄在线播放 | 日本精品一区二区 | av电影在线免费 | 免费看污的网站 | 亚洲精品乱码久久久久久蜜桃91 | 久久av不卡 | 国产精品国产三级国产aⅴ9色 | 亚洲粉嫩av | 美女黄网站视频免费 | 91人人澡人人爽 | 国产一区高清在线观看 | 天天干天天干天天干天天干天天干天天干 | 日韩理论在线 | 国产精品手机在线播放 | 精品国产亚洲在线 | 欧美老人xxxx18 | 国产在线一区二区 | 久艹视频在线观看 | 日韩在线视频免费观看 | 免费a视频在线 | 99九九免费视频 | 在线视频欧美亚洲 | 成人av一二三区 | 日韩欧美一区二区三区视频 | 久久免费中文视频 | 国产精品一区二区在线观看免费 | 中文字幕高清在线 | 久久久久网址 | 狠狠干电影 | 美女视频免费一区二区 | 国产69久久| 91专区在线观看 | 欧美伦理一区 | 涩涩网站在线播放 | 日韩网站在线免费观看 | 岛国精品一区二区 | 日韩精品欧美视频 | 一本一道久久a久久精品蜜桃 | 丝袜护士aⅴ在线白丝护士 天天综合精品 | 欧美精品一二 | 国产涩涩网站 | 亚洲视频一区二区三区在线观看 | 亚洲精品永久免费视频 | 看av免费网站 | 日韩欧美在线国产 | 国产69精品久久99的直播节目 | 久久黄色影视 | 欧美日韩亚洲一 | 成年人在线电影 | 国产精品乱码久久久 | 亚洲高清在线视频 | 91c网站色版视频 | 在线观看国产91 | 一区二区三区日韩在线 | 亚洲欧美日本一区二区三区 | 久久伊人国产精品 | 国产精品免费久久久 | 日韩成人精品一区二区三区 | 国产免费人成xvideos视频 | 天天操夜夜做 | 亚洲免费不卡 | 日本黄色片一区二区 | 天天操婷婷 | 手机成人av在线 | 日韩视频中文字幕在线观看 | 精品五月天 | 97超碰超碰久久福利超碰 | 9ⅰ精品久久久久久久久中文字幕 | 99这里都是精品 | 国产精品一区二区 91 | 亚洲视频 在线观看 | 久操综合| 国语精品免费视频 | 亚洲精品www久久久 www国产精品com | 免费黄色a网站 | 开心激情综合网 | 久久久久福利视频 | 精品久久久久国产 | 国产精品久久久久9999吃药 | 麻豆精品视频在线 | 中文永久免费观看 | 精产嫩模国品一二三区 | 欧美日韩观看 | 亚洲一级免费电影 | 激情五月亚洲 | 麻豆国产精品一区二区三区 | 日本久久久久久科技有限公司 | 久久国产免费视频 | 91免费国产在线观看 | 国产精品久久 | 日韩午夜剧场 | 亚洲精品一区二区三区在线观看 | 中文字幕一区二区三区四区 | 国产日韩欧美在线观看视频 | 香蕉视频久久久 | 国产1区2区3区精品美女 | 日本久久免费视频 | 91精品国产综合久久福利不卡 | 国产在线黄色 | 国产成人精品国内自产拍免费看 | 国产伦精品一区二区三区… | 亚洲在线精品 | 综合色在线观看 | 天堂在线免费视频 | 精品国产一区二 | 一本—道久久a久久精品蜜桃 | 91丨porny丨九色 | 91丨九色丨蝌蚪丨老版 | 日本免费一二三区 | 亚洲区视频在线 | 国产亚洲精品日韩在线tv黄 | 久久天天综合网 | 香蕉久久久久 | 免费午夜视频在线观看 | 久久久久久高潮国产精品视 | 婷婷久月 | 日韩在线 | 粉嫩av一区二区三区四区在线观看 | 国产91精品一区二区 | 国产一级在线视频 | 国产精品99久久99久久久二8 | 在线天堂中文在线资源网 | 国产v欧美 | 日批网站在线观看 | 色综合小说 | 在线观看免费一级片 | av免费片| 国产小视频福利在线 | 最新免费av在线 | 日韩av电影网站在线观看 | 国产手机视频在线观看 | 欧美色图视频一区 | 午夜精品电影 | 日韩精品一区二区三区视频播放 | 亚洲综合色av | 99久久久国产精品 | 久久免费在线观看 | 波多野结依在线观看 | 婷婷视频| 国产视频999 | 亚洲精品美女视频 | 超碰在线观看av.com | 69精品视频在线观看 | 日韩久久影院 | 欧美亚洲专区 | 日日爱av| 欧美激情精品久久久久久免费印度 | 成人一级在线 | 国产中文a| 97人人模人人爽人人喊网 | 婷婷六月天丁香 | av字幕在线| 97在线观看视频国产 | 人人搞人人搞 | 亚洲精品成人在线 | 91九色蝌蚪在线 | 久av电影| 国产在线精品二区 | 亚洲精品午夜一区人人爽 | av免费片 | 欧美a在线免费观看 | 久久精品国产免费看久久精品 | 美女网站在线观看 | 黄色一级免费网站 | 97成人在线观看 | 伊人久久电影网 | 欧美日韩高清一区二区 国产亚洲免费看 | 中文字幕免费高清av | 亚洲高清视频在线 | 五月婷久久 | 亚洲高清视频在线 | 久久久久久伊人 | 国产一区二区手机在线观看 | 99国产精品久久久久久久久久 | 亚洲黄色片在线 | 亚洲精品中文在线 | 国产精品久久久久久五月尺 | 国产亚洲婷婷免费 | 美女在线免费观看视频 | 久操中文字幕在线观看 | 国产专区一| 成年人在线观看免费视频 | 亚洲精品美女久久久久 | 夜夜高潮夜夜爽国产伦精品 | 中文字幕视频网站 | 亚洲黄网址| 精品国产一区二 | 中文字幕在线视频第一页 | 国产午夜精品一区二区三区欧美 | 欧美91精品久久久久国产性生爱 | 精品国产99国产精品 | 国产97在线播放 | 日日爽天天 | 亚洲一级影院 | 久久视频在线 | 五月婷婷婷婷婷 | 永久免费毛片 | 国产精品女视频 | 97超碰人 | 九九热在线观看视频 | 久久99精品国产一区二区三区 | 亚洲小视频在线 | 亚洲国产视频a | 日韩中文字幕网站 | 免费观看av网站 | 欧美大片aaa | 亚洲国产97在线精品一区 | 国产麻豆精品在线观看 | 色综合a| 制服丝袜成人在线 | 亚洲免费观看在线视频 | 亚洲激情在线视频 | 亚洲永久精品国产 | 福利区在线观看 | 在线视频欧美日韩 | 91精品久久久久久久久久入口 | 免费色网 | 精品免费久久 | 九七视频在线 | 在线免费高清一区二区三区 | 国产精品一区二区三区在线播放 | 天天草av| 久久精品91视频 | 午夜性生活 | 在线 高清 中文字幕 | 国产美女免费观看 | 中文字幕在线观看免费观看 | 国产女人40精品一区毛片视频 | 久草在线99 | 亚洲综合在线一区二区三区 | 亚洲午夜在线视频 | 久久精品网站免费观看 | 六月激情丁香 | 国产一级一片免费播放放a 一区二区三区国产欧美 | 国产精品久久久久久久久婷婷 | 国产亚洲视频在线 | 久久午夜电影网 | 国产精彩视频一区二区 | 在线视频精品 | 日韩午夜电影院 | 91精品久久久久久综合乱菊 | 中文视频一区二区 | 久久伊人91| 天天操·夜夜操 | 九九免费在线观看视频 | 91成人精品一区在线播放69 | 99久久精品国产免费看不卡 | 久久高视频 | 天天色棕合合合合合合 | 在线导航av | 欧亚日韩精品一区二区在线 | 亚洲成人免费 | 亚洲精品女人久久久 | 99在线精品视频观看 | 亚洲成a人片在线www | 91亚洲精品久久久久图片蜜桃 | 国产国产人免费人成免费视频 | 久草精品电影 | 中文字幕视频免费观看 | www黄色大片| 久久人人做 | 精品资源在线 | 日韩国产在线观看 | 欧美夫妻性生活电影 | 欧美成人一区二区 | 欧美爽爽爽 | 日本黄色一级电影 | 手机在线看永久av片免费 | 亚洲精品在线视频观看 | 久久男人中文字幕资源站 | 狠狠色婷婷丁香六月 | 免费色视频在线 | 最近高清中文字幕 | 久久不射网站 | 久久免费看 | 日韩激情片在线观看 | 97碰在线视频 | 西西www4444大胆在线 | 亚洲91网站 | 久久av不卡 | 国产高清视频在线观看 | 免费国产ww | 中文字幕在线视频国产 | av在线播放不卡 | 国产视频丨精品|在线观看 国产精品久久久久久久久久久久午夜 | 免费看黄色毛片 | 永久免费看av | 在线免费观看黄色小说 | 亚洲.www | 在线免费黄色av | 黄色在线免费观看网址 | 免费精品视频在线观看 | 69亚洲精品 | 96久久精品 | 97超碰人人澡 | 色综合久久久 | 久久伊人八月婷婷综合激情 | 91av在线播放视频 | 成全在线视频免费观看 | 97看片 | 国产一区二区在线免费播放 | 欧美一进一出抽搐大尺度视频 | 国产精品美女久久久久久久 | 在线91视频 | 欧美a级在线免费观看 | 国产成人亚洲在线观看 | 91九色蝌蚪视频在线 | 久草视频在线资源 | 欧美男男激情videos | 999成人 | 久草在线高清 | 99热最新精品| 99热国产在线 | 精品国产伦一区二区三区观看体验 | 色婷婷九月 | 在线天堂中文www视软件 | 国产不卡高清 | 国产在线免费观看 | 国产在线观看,日本 | 亚洲日本va午夜在线电影 | 丝袜av网站| 狠狠狠狠狠狠狠狠干 | 91传媒在线播放 | 久久久精品99 | 激情偷乱人伦小说视频在线观看 | 亚洲日本在线视频观看 | 欧美一区二区视频97 | 丁香激情视频 | 91福利视频在线 | 欧洲高潮三级做爰 | 国内精品久久久久久中文字幕 | 黄色一级免费 | 欧美一级免费高清 | 4438全国亚洲精品在线观看视频 | 国产91av视频在线观看 | 国产 一区二区三区 在线 | 夜夜骑天天操 | 成人av电影免费 | 色狠狠综合 | 五月婷婷激情综合网 | 天天干天天做 | 色综合婷婷 | 人人爱人人舔 | 成人91在线观看 | 亚洲免费精品视频 | av电影在线观看完整版一区二区 | 成人午夜毛片 | 色综合a| 精品国产一区在线观看 | 中文字幕在线观看免费高清电影 | 亚洲国产网址 | 四虎视频 | 蜜桃传媒一区二区 | 又紧又大又爽精品一区二区 | 久久精品毛片 | 日韩城人在线 | 97色噜噜| 国产亚洲片 | 亚洲精品中文在线观看 | 精品国产伦一区二区三区观看体验 | 亚洲国产精品成人综合 | 在线国产日本 | 奇米影视8888 | 天天操狠狠干 | 免费网址在线播放 | 国产精品原创在线 | 视频国产精品 | 久久久免费高清视频 | 成人影音在线 | 婷婷六月天在线 | 日韩精品免费 | 久久国产麻豆 | av电影一区 | 伊在线视频 | 免费无遮挡动漫网站 | 精品久久久久久国产91 | 超碰在线99 | 日韩精品免费一区二区在线观看 | 日韩三级视频在线看 | 国产在线观看二区 | 久久免费视频精品 | 久草在线视频首页 | 91精品少妇偷拍99 | 在线免费中文字幕 | 毛片基地黄久久久久久天堂 | 欧美视频国产视频 | 黄色大片中国 | 91av社区 | 亚洲免费精品视频 | 久草在线电影网 | 日韩在线播放视频 | 三三级黄色片之日韩 | 欧美大片www | 日韩成人精品一区二区 | 在线观看91精品视频 | 亚洲精品黄 | 在线国产观看 | 三级视频日韩 | 91看片在线 | 免费av网站在线看 | 久久一区二区免费视频 | 亚洲精品中文字幕在线观看 | 国产精品免费av | 欧美黄色高清 | 中文字幕在线观看第一页 | 91精品婷婷国产综合久久蝌蚪 | 精品一区二区三区久久 |