2026-01-02 14:14:59 +08:00
< template >
< div class = "home-view" >
< section class = "section-container" >
< div class = "section-header" >
< h2 class = "section-title" > 推荐歌单 < / h2 >
< div class = "more" > 查看全部 < Icon icon = "lucide:chevron-right" / > < / div >
< / div >
< div class = "playlist-grid" >
< div
v - for = "item in playlistData"
: key = "item.id"
class = "playlist-card"
@ click = "handlePlayListClick(item)"
>
< div class = "cover-wrapper" >
< img :src = "item.img" :alt = "item.name" loading = "lazy" / >
< div class = "play-count" >
< Icon icon = "lucide:play" width = "12" / >
< span > { { item . play _count } } < / span >
< / div >
< / div >
< div class = "playlist-info" >
< div class = "playlist-name" > { { item . name } } < / div >
< div class = "playlist-author" > { { item . author } } < / div >
< / div >
< / div >
< / div >
< / section >
< / div >
< / template >
< script setup lang = "ts" >
import { ref } from 'vue' ;
import { Icon } from '@iconify/vue' ;
// 注入你提供的 JSON 数据
const playlistData = ref ( [
{
"play_count" : "4.7万" ,
"id" : "17387580241" ,
"author" : "张大佛爷张大佛爷" ,
"name" : "巴西Funk: 来首精神氮泵助力燃脂" ,
"time" : "2025-11-02" ,
"img" : "http://p2.music.126.net/YkpQqGGlHR4DD8BjGTQe8Q==/109951172228935288.jpg" ,
"total" : 30 ,
"desc" : "巴西放克( Funk brasileiro),通常在巴西被称为\"Funk\", 是一种受嘻哈音乐( Hip Hop) 影响的音乐风 格,起源于里约热内卢的贫民区(也称为贫民窟)。里约放克(Funk carioca) 最初源自电音放克( Electro) 和迈阿密贝 斯( Miami Bass),之后逐渐发展出独特的风格,并成为巴西低收入青少年中最受欢迎的音乐类型之一。\n\n听说巴西Funk和健身很搭噢! " ,
"source" : "wy"
} ,
{
"play_count" : "3.6万" ,
"id" : "14435495551" ,
"author" : "凌晨一点的莱茵猫" ,
"name" : "ACG治愈 | 回忆复刻 重温动漫里的温情时刻" ,
"time" : "2025-10-18" ,
"img" : "http://p2.music.126.net/uPWibcRbc7u3vDD44gXA0A==/109951172205320822.jpg" ,
"total" : 99 ,
"desc" : "不是所有治愈都需要大段对白\n一段旋律就够了\n\n可以是主角低谷时的背景音\n也可以是圆满结局的收尾曲\n\n每一段都裹着当时的情绪\n现在听依旧能暖到心里最软的地方" ,
"source" : "wy"
} ,
{
"play_count" : "3万" ,
"id" : "17438630520" ,
"author" : "露露在发呆" ,
"name" : "跑步 •鬼灭之刃超燃和风主题歌" ,
"time" : "2025-11-15" ,
"img" : "http://p2.music.126.net/DuKyLyYhKd2YhWsRYkd9DQ==/109951172287476927.jpg" ,
"total" : 26 ,
"desc" : "鬼灭之刃即将迎来无限城终极大决战, 精选历代TV番、剧场版主题曲与超人气配乐插曲, 与动画同样出彩的是其独特美妙的日式和风电子流行曲风, 给你今日份的运动计划注入来自鬼灭之刃的二次元能量吧, 适配有氧、无氧运动 全适配, 高能KPOP祝你今天也能量满满燃爆卡路里! " ,
"source" : "wy"
} ,
{
"play_count" : "1.7万" ,
"id" : "17430413151" ,
"author" : "心语馆" ,
"name" : "【高质量轻音】享受宁静 沉浸自然" ,
"time" : "2025-11-13" ,
"img" : "http://p2.music.126.net/El8lldCevbObAYAcBz0kvg==/109951172275960287.jpg" ,
"total" : 72 ,
"desc" : "当城市喧嚣渐远\n让音符化作自然的信使\n\n钢琴的澄澈如林间晨露\n弦乐的温柔似晚风拂叶\n\n虫鸣与流水声悄然交织\n每一段旋律都在勾勒远山\n\n晴空与旷野的轮廓\n无需刻意追寻\n\n只需闭上眼\n便能在旋律里触摸自然 的呼吸\n\n让身心沉潜于这份不被打扰的宁静\n重拾内心的松弛与澄澈……" ,
"source" : "wy"
} ,
{
"play_count" : "4681" ,
"id" : "17440686473" ,
"author" : "與鯨島" ,
"name" : "刘宇|我生如刀锋 自当斩荆棘" ,
"time" : "2025-11-15" ,
"img" : "http://p2.music.126.net/l6q13AT-n47NICqDGf90lw==/109951172291475298.jpg" ,
"total" : 50 ,
"desc" : "他说:\n“我接受来自四面八方的欢呼鼓舞, 也接受不明缘由的流言与我接受来自四面八方的欢呼鼓舞, 也 接受不明缘由的流言与误解。我低谷过,但没人能熄灭我跳动的火焰。眼前不变的是光明和希望,再尖锐的噪音也无法打 断已经响起的旋律,仍在舞蹈,就是我的态度。”\n\n“我很早之前就说过, 恶评它其实不会伤害到我, 哪怕我说的一句话 , 它没有错误, 有些人都可以在TA的立场上找出这句话的错误, 我觉得这个不太需要去考虑的, 因为你做什么事情问心无 愧最重要。”\n\n“我觉得你们也在发光, 是因为你们的光汇聚在一起, 我才能这么明亮。”\n\n“天赋固然重要, 但我想要 才更重要。”\n\n“愿你我皆被温柔以待, 身处泥泞也嗅得大地芳香。”\n\n“我想告诉你们的是, 是你们的光唤醒了我心中 的那颗种子,我知道有一天,这颗种子,可以成为为你们遮挡伤害的那棵大树,请相信我。”\n\n“谢谢您曾对我说, 要去 做那个扇风的人,要让全世界知道这把扇子扇出来的风,叫中国风。”\n\n“国风推广这条路, 其实我的初心一直不变, 依 旧在前行,也理解我作为公众人物应该负担起更多的责误解。我低谷过,但没人能熄灭我跳动的火焰。眼前不变的是光明 和希望,再尖锐的噪音也无法打断已经响起的旋律,仍在舞蹈,就是我的态度。”\n\n“我很早之前就说过, 恶评它其实不 会伤害到我, 哪怕我说的一句话, 它没有错误, 有些人都可以在TA的立场上找出这句话的错误, 我觉得这个不太需要去考 虑的,因为你做什么事情问心无愧最重要。”\n\n“我觉得你们也在发光, 是因为你们的光汇聚在一起, 我才能这么明亮。”\n\n“天赋固然重要, 但我想要才更重要。”\n\n“愿你我皆被温柔以待, 身处泥泞也嗅得大地芳香。”\n\n“我想告诉你们的是, 是你们的光唤醒了我心中的那颗种子, 我知道有一天, 这颗种子, 可以成为为你们遮挡伤害的那棵大树, 请相信我。”\n\n“谢谢您曾对我说, 要去做那个扇风的人, 要让全世界知道这把扇子扇出来的风, 叫中国风。”\n\n“国风推广这条路, 其实我的初心一直不变, 依旧在前行, 也理解我作为公众人物应该负担起更多的责任、传播的重任。希望未来不负期望, 能号召更多的年轻的朋友关注和热爱国风、传统文化。”\n\n“把冠军定在道路上, 而不是目标上。”\n\n“你们带着特别热 情,特别想要跟你传达他们的爱的时候,你就觉得,这点累算什么。”\n\n“太在意恶评, 是对好评的不负责。”\n\n" ,
"source" : "wy"
} ,
{
"play_count" : "2.1万" ,
"id" : "17412466554" ,
"author" : "走马川行北海边" ,
"name" : "网上很火韩语歌曲|宿命感拉满氛围神曲" ,
"time" : "2025-11-08" ,
"img" : "http://p2.music.126.net/Rf9Nx1eefoGbqGhqq84SBw==/109951172254139596.jpg" ,
"total" : 72 ,
"desc" : "前奏一响,便是跨越时空的宿命羁绊。这些火爆全网的韩语神曲,藏着韩剧里初雪拔剑的悸动、跨越百年的深情,也藏着爱而不得的怅惘与命中注定的奔赴。空灵声线交织着缱绻旋律,氛围感直接拉满,每一段旋律都像在诉说: 有些人,遇见即是宿命,哪怕兜兜转转,也终会被命运牵引。戴上耳机,沉浸式坠入这场关于宿命的浪漫与遗憾。" ,
"source" : "wy"
} ,
{
"play_count" : "1.2万" ,
"id" : "17426483259" ,
"author" : "心语馆" ,
"name" : "【欧美旋律控】前奏封神 耳熟能详欧美神曲" ,
"time" : "2025-11-12" ,
"img" : "http://p2.music.126.net/4EiMzo9LAGbNjwF79ecuZg==/109951172271263928.jpg" ,
"total" : 67 ,
"desc" : "这份歌单,是资深乐迷私藏的欧美旋律宝库。从格莱美获奖金曲,到小众音乐人的惊艳之作,每一首都经过时间与口碑的双重检验。\n\n有Adele用灵魂嗓音唱出的《Rolling in the Deep》, 那强烈鼓点和凄美钢琴交织, 让失恋 的痛楚与坚强直击人心; 也有Coldplay用《Viva la Vida》带来的摇滚盛宴, 壮丽弦乐搭配激昂节奏, 展现帝国兴衰。这 里既有流行、摇滚、民谣等主流风格, 也不乏R&B、电子乐等小众类型, 满足不同音乐偏好。\n\n无论你是在午后闲暇、深夜独处, 还是在通勤路上, 这些旋律都能为你带来极致的听觉享受, 让你沉浸在欧美音乐的独特魅力中, 一听就上瘾, 循 环到停不下来 。" ,
"source" : "wy"
} ,
{
"play_count" : "4198" ,
"id" : "17514849470" ,
"author" : "心语馆" ,
"name" : "【高质量轻音】清新宁静 明亮自然" ,
"time" : "2025-12-04" ,
"img" : "http://p2.music.126.net/v0jiaItY2fD3LuQVrdt_Cg==/109951172384635472.jpg" ,
"total" : 71 ,
"desc" : "蝉鸣躲进树荫,落叶在石阶上打了个转。木吉他的弦音裹着松针的气息,手鼓轻得像松鼠踩过腐叶。不必追赶时间,只需闭眼,让音符替你接住林间漏下的每一缕暖阳。" ,
"source" : "wy"
} ,
{
"play_count" : "1万" ,
"id" : "14407617761" ,
"author" : "露露在发呆" ,
"name" : "华语R&B: 像一只蝴蝶飞过废墟" ,
"time" : "2025-10-11" ,
"img" : "http://p2.music.126.net/nYl-Rts9LlhdrGRIx5St-g==/109951172136819703.jpg" ,
"total" : 58 ,
"desc" : "我瞒着所有人装作迈过了很多坎,故意显得很开心的样子,事实上只有我知道,阴影就是阴影,有些坎我永远也迈不过去,有些事一时半会释怀,我承认你很好,有些事跟我喜欢你没关系,有些事没在一个频道上,更没办法将两 件事放一起衡量。" ,
"source" : "wy"
} ,
{
"play_count" : "8188" ,
"id" : "17511869819" ,
"author" : "有只黑猫叫灰心" ,
"name" : "「韩语宿命感」首尔晚风里的心跳" ,
"time" : "2025-12-04" ,
"img" : "http://p2.music.126.net/wXRLNUreaGRVcU7CYe20KA==/109951172381558389.jpg" ,
"total" : 50 ,
"desc" : "ᥫᩣ当首尔的晚风裹着便利店的暖光掠过耳机线, 韩语歌词里那些轻颤的音节, 正藏着和你同频的心跳共振。这是专属于宿命感的BGM——每一段旋律都像被按下慢放的初遇镜头: 是走廊转角撞进眼底的视线, 是咖啡杯沿碰在一起时的轻响, 是晚风里没说出口的「恰好我也喜欢你」。耳机里的每一句, 都是藏在旋律里的、只属于你的心动序章✨" ,
"source" : "wy"
}
] ) ;
2026-01-03 14:32:25 +08:00
import { useRouter } from 'vue-router' ;
const router = useRouter ( ) ;
2026-01-02 14:14:59 +08:00
const handlePlayListClick = ( item : any ) => {
2026-01-03 14:32:25 +08:00
router . push ( ` /playlist/ ${ item . id } ` ) ;
2026-01-02 14:14:59 +08:00
} ;
< / script >
< style scoped lang = "scss" >
. home - view {
2026-01-03 14:32:25 +08:00
padding : 20 px 0 40 px 0 ;
2026-01-02 14:14:59 +08:00
. section - container {
margin - bottom : 40 px ;
2026-01-03 14:32:25 +08:00
padding : 0 20 px ;
2026-01-02 14:14:59 +08:00
. section - header {
display : flex ;
justify - content : space - between ;
align - items : flex - end ;
margin - bottom : 20 px ;
. section - title {
font - size : 24 px ;
font - weight : 800 ;
2026-01-03 14:32:25 +08:00
color : var ( -- text - primary ) ;
2026-01-02 14:14:59 +08:00
margin : 0 ;
}
. more {
font - size : 13 px ;
2026-01-03 14:32:25 +08:00
color : var ( -- text - secondary ) ;
2026-01-02 14:14:59 +08:00
display : flex ;
align - items : center ;
cursor : pointer ;
transition : color 0.2 s ;
2026-01-03 14:32:25 +08:00
& : hover { color : # 6366 f1 ; }
2026-01-02 14:14:59 +08:00
}
}
}
. playlist - grid {
display : grid ;
// 使用 auto-fill 实现响应式列数
grid - template - columns : repeat ( auto - fill , minmax ( 180 px , 1 fr ) ) ;
gap : 24 px ;
. playlist - card {
cursor : pointer ;
transition : all 0.3 s cubic - bezier ( 0.25 , 0.46 , 0.45 , 0.94 ) ;
& : hover {
. cover - wrapper {
transform : translateY ( - 8 px ) ;
box - shadow : 0 12 px 24 px rgba ( 0 , 0 , 0 , 0.15 ) ;
img { transform : scale ( 1.05 ) ; }
}
. playlist - name { color : # ff6b6b ; }
}
. cover - wrapper {
position : relative ;
aspect - ratio : 1 ;
border - radius : 14 px ;
overflow : hidden ;
background : # f0f0f0 ;
margin - bottom : 12 px ;
transition : all 0.4 s ease ;
box - shadow : 0 4 px 12 px rgba ( 0 , 0 , 0 , 0.05 ) ;
img {
width : 100 % ;
height : 100 % ;
object - fit : cover ;
transition : transform 0.6 s ease ;
}
. play - count {
position : absolute ;
top : 8 px ;
right : 8 px ;
background : rgba ( 0 , 0 , 0 , 0.4 ) ;
backdrop - filter : blur ( 8 px ) ;
color : white ;
padding : 4 px 10 px ;
border - radius : 20 px ;
font - size : 11 px ;
display : flex ;
align - items : center ;
gap : 4 px ;
z - index : 2 ;
}
}
. playlist - info {
. playlist - name {
font - size : 14 px ;
font - weight : 600 ;
line - height : 1.4 ;
color : # 333 ;
margin - bottom : 4 px ;
// 两行文本截断
display : - webkit - box ;
- webkit - line - clamp : 2 ;
- webkit - box - orient : vertical ;
overflow : hidden ;
transition : color 0.2 s ;
}
. playlist - author {
font - size : 12 px ;
color : # 999 ;
}
}
}
}
}
< / style >