feat: 新增音频播放器功能及MV预览组件

style: 优化页面布局及样式细节

refactor: 重构音频播放逻辑与进度条控制

docs: 更新README说明音频播放功能

test: 添加音频播放器交互测试用例
This commit is contained in:
DESKTOP-RQ919RC\Pc
2025-09-10 19:00:23 +08:00
parent 8a6bef2214
commit 3d380d82de
37 changed files with 1629 additions and 11 deletions

View File

@@ -5,10 +5,32 @@
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>朴见潮音官网</title>
<script src="./js/vue.global.js"></script>
<script src="./js/artplayer.js"></script>
<link rel="stylesheet" href="./css/index.css" />
<style>
[v-cloak] {
display: none;
}
</style>
</head>
<body>
<div class="content" id="appIndex">
<div class="content" id="appIndex" v-cloak>
<!-- 原生audio标签隐藏 -->
<audio ref="audioPlayer" preload="none" loop></audio>
<div class="sidebar flexflex">
<div class="pointer">
<div class="item" :data-index="'01'"></div>
<div class="item active" :data-index="'02'"></div>
<div class="item" :data-index="'03'"></div>
<div class="item" :data-index="'04'"></div>
</div>
<div class="arrow">
<img class="item top" src="./img/arrow-white.svg" />
<img class="item bottom" src="./img/arrow-orange.svg" />
</div>
</div>
<div class="introduce">
<div class="head flexacenter">
<div class="logo mar1200">
@@ -42,7 +64,8 @@
<img class="bj bj3" src="./img/album-bj3.svg" />
<img class="bj bj4" src="./img/album-bj4.png" />
<img class="bj bj5" src="./img/album-bj5.svg" />
<img class="play" src="./img/play-white-icon.svg" />
<img v-if="!audioHeadState" class="play" @click="manageAudio('./mp3/1.MP3','head')" src="./img/play-white-icon.svg" />
<img v-else class="play" @click="closeAll()" src="./img/pause-white-icon.svg" />
</div>
</div>
<div class="trait flexflex mar1200">
@@ -67,19 +90,132 @@
<img class="line line-6" src="./img/works-line-6.svg" />
</div>
<div class="mv-box mar1200">
<div class="item flexflex">
<div class="serial">01</div>
<div class="item flexflex" v-for="(item, index) in 6" :key="index">
<img class="serial-icon" src="./img/serial-icon.png" />
<div class="serial">{{ index + 1}}</div>
<div class="title">深港双城故事</div>
<div class="text">中国AIGC产业联盟AIGCxChina
温州市社科联
温州市新闻媒体中心
第一届AI音乐春晚 正选节目</div>
<div class="text">{{ text }}</div>
<div class="time">2024.12</div>
<div class="media" @click="openPreview(index)">
<img class="img" src="./img/mv-1.svg" />
<img class="play" src="./img/play-white-icon.svg" />
</div>
</div>
</div>
<div class="audio-box mar1200 flexflex">
<div class="item" v-for="(item, index) in audioList" :key="index">
<img class="serial-icon" src="./img/serial-icon.png" />
<div class="serial">{{ index + 1 }}</div>
<div class="content flexflex">
<div class="album">
<img class="img" src="./img/audio-img.png" />
<img class="icon" src="./img/record-icon.png" />
</div>
<div class="info flexflex">
<div class="name">画Remix</div>
<div class="subtitle">AI音乐榜冠军</div>
<div class="time">2024.3</div>
<div class="progress-bar flexacenter">
<div class="bar white" :style="{ width: item.progress + '%' }"></div>
<div class="circle"></div>
<div class="bar black flex1"></div>
</div>
<div class="operate flexcenter">
<img class="speed left" src="./img/speed-left.png" @click="fastForward('slow', item.url, 'works')" />
<img v-if="item.state" class="play" @click="closeAll()" src="./img/pause-black-icon.svg" />
<img v-else class="play" @click="manageAudio(item.url, 'works')" src="./img/play-black-icon.svg" />
<img class="speed right" src="./img/speed-right.png" @click="fastForward('fast', item.url, 'works')" />
</div>
</div>
</div>
</div>
</div>
<img class="bj2" src="./img/works-bj2.png" />
</div>
<div class="custom">
<div class="custom-box mar1200 flexflex">
<img class="title" src="./img/custom-title.png" />
<div class="subtitle">往事可成追忆,把你的故事谱成歌</div>
<div class="list flexflex mar1200">
<div class="item flexacenter" v-for="(item, index) in 6" :key="index">
<div class="info flexflex">
<div class="name">画Remix</div>
<div class="lyric">走过的路汇成星河,脚下的路更辽阔</div>
<div class="progress-bar flexacenter">
<div class="bar white" :style="{ width: progress + '%' }"></div>
<div class="circle"></div>
<div class="bar black" :style="{ width: (100 - progress) + '%' }"></div>
</div>
<div class="operate flexcenter">
<img class="speed left" src="./img/speed-left.png" />
<img class="play" src="./img/play-black-icon.svg" />
<img class="speed right" src="./img/speed-right.png" />
</div>
</div>
<img class="info-img" src="./img/custom-img.png" />
</div>
</div>
<div class="bottom flexcenter">
<img class="bj" src="./img/custom-bj-1.svg" />
<img class="bj" src="./img/custom-bj-2.svg" />
<img class="bj" src="./img/custom-bj-1.svg" />
</div>
</div>
</div>
<div class="student">
<div class="student-box flexflex">
<img class="title" src="./img/student-title.png" alt="" />
<div class="list">
<img class="img" src="./img/student-img.png" />
</div>
<div class="name">《听风少年的梦幻之城》</div>
<div class="info flexacenter">
<img class="icon" src="./img/student-icon.svg" />
林林林 | 7岁 | 广州
</div>
<div class="progress-bar flexacenter">
<div class="bar white" :style="{ width: progress + '%' }"></div>
<div class="circle"></div>
<div class="bar black" :style="{ width: (100 - progress) + '%' }"></div>
</div>
<!-- <div class="time-display">
<span>{{ formatTime(currentTime) }}</span>
<span>/</span>
<span>{{ formatTime(duration) }}</span>
</div> -->
<div class="operate flexcenter">
<img class="cut left" src="./img/cut-left.svg" />
<img class="speed left" src="./img/speed-white-left.png" />
<img class="play" src="./img/play-white-icon.svg" />
<img class="speed right" src="./img/speed-white-right.png" />
<img class="cut right" src="./img/cut-right.svg" />
</div>
</div>
<div class="contact flexflex mar1200">
<img class="title" src="./img/contact-title.png" />
<div class="hint">我们可以为你提供AI音乐定制服务谱写你独有的人生歌曲</div>
<div class="hint">我们可以为你提供AI音乐教学培训服务让你拥有独立完成音乐作品的能力</div>
<img class="arrows" src="./img/arrows-yellow.svg" />
<img class="WeChat" src="./img/WeChat-img.jpg" />
<img class="logo" src="./img/logo-black.png" />
</div>
</div>
<div class="footer flexcenter">
<img class="logo" src="./img/ai-title.png" />
<div class="text">广州九微科技有限公司 | Copyright 2001-2025 GTER All Rights Reserved | 粤ICP备14050432号</div>
</div>
<div v-if="previewState" class="preview flexcenter">
<img class="close" @click="closePreview()" src="./img/close.svg" />
<div class="artplayer-app"></div>
</div>
</div>
<script src="./js/index.js"></script>