返回列表 发布新帖
查看: 108|回复: 0

[代码技巧] 子比主题 – 左下角音乐播放器美化版

[复制链接]
SunJu_FaceMall
社区贡献

315

主题

190

回帖

1万

积分

等级头衔
Icon组别 : 管理员
Icon等级 :

积分成就
   钻石 : 524 颗
   贡献 : 1849 点
   金币 : 12 枚
Icon在线时间 : 1297 小时
Icon注册时间 : 2024-11-22
Icon最后登录 : 2025-12-9

荣誉勋章

会员LV.1会员LV.2会员LV.3会员LV.4会员LV.5会员LV.6会员LV.7会员LV.8会员LV.9会员LV.10

风云·优秀版主

飞流名人堂成员

1

实名认证 手机认证 vip vip-year FLLTCN发表于 2025-10-10 17:38:08 | 查看全部 |阅读模式 浙江金华

资源无需等待,交易就趁现在,全面资源整合网络大咖云集,让你轻松玩转互联网!

您需要 登录 才可以下载或查看,没有账号?立即注册

×
腾飞博客逛论坛的时候发现一个美化播放器,这个播放器还是不错的,腾飞博客用了一下,是从从MetingAPI获取播放列表的,我觉得喜欢的可以换一下接口换成你的,接口网上很多,喜欢的自行部署吧!

image.webp
这款美化版本的播放器还是不错的,音乐跟着歌词同步,并且当播放音乐的时候还左下角还有封面旋转的效果!

代码部署


将下面的代码丢到:子比主题–>>自定义底部HTML代码即可,里面的接口自己找一下网上的接口,对接一下自己的歌单就可以!
  1. <style>
  2.     .meting-player-container * {
  3.         margin: 0;
  4.         padding: 0;
  5.         box-sizing: border-box;
  6.         font-family: 'Microsoft YaHei', sans-serif;
  7.     }

  8.     .meting-player-container {
  9.         position: fixed;
  10.         left: 20px;
  11.         bottom: 70px;
  12.         z-index: 1000;
  13.         width: 360px;
  14.         transition: all 0.3s ease;
  15.     }

  16.         .meting-player-container.minimized {
  17.             width: 50px;
  18.             height: 50px;
  19.         }

  20.     .meting-player-main {
  21.         background: rgba(60, 66, 64, 0.9);
  22.         border-radius: 12px;
  23.         overflow: hidden;
  24.         box-shadow: 0 5px 15px rgba(0, 0, 0, 0.3);
  25.         color: white;
  26.         display: flex;
  27.         flex-direction: column;
  28.         transition: all 0.3s ease;
  29.     }

  30.     .minimized .meting-player-main {
  31.         height: 50px;
  32.         width: 50px;
  33.         border-radius: 50%;
  34.         display: flex;
  35.         align-items: center;
  36.         justify-content: center;
  37.     }

  38.     .meting-album-cover {
  39.         display: none;
  40.         width: 40px;
  41.         height: 40px;
  42.         border-radius: 50%;
  43.         object-fit: cover;
  44.         animation: meting-rotate 10s linear infinite;
  45.         animation-play-state: paused;
  46.     }

  47.     .minimized .meting-album-cover {
  48.         display: block;
  49.     }

  50.     .playing .meting-album-cover {
  51.         animation-play-state: running;
  52.     }

  53.     @keyframes meting-rotate {
  54.         100% {
  55.             transform: rotate(360deg);
  56.         }
  57.     }

  58.     .meting-player-header {
  59.         display: flex;
  60.         align-items: center;
  61.         padding: 12px 15px;
  62.         border-bottom: 1px solid rgba(255, 255, 255, 0.1);
  63.     }

  64.     .minimized .meting-player-header {
  65.         display: none;
  66.     }

  67.     .meting-song-info {
  68.         flex: 1;
  69.         overflow: hidden;
  70.     }

  71.     .meting-song-title {
  72.         font-size: 14px;
  73.         white-space: nowrap;
  74.         overflow: hidden;
  75.         text-overflow: ellipsis;
  76.     }

  77.     .meting-song-artist {
  78.         font-size: 12px;
  79.         opacity: 0.8;
  80.         white-space: nowrap;
  81.         overflow: hidden;
  82.         text-overflow: ellipsis;
  83.     }

  84.     .meting-player-controls {
  85.         display: flex;
  86.         flex-direction: column;
  87.         padding: 15px;
  88.     }

  89.     .minimized .meting-player-controls {
  90.         display: none;
  91.     }

  92.     .meting-progress-top {
  93.         display: flex;
  94.         align-items: center;
  95.         margin-bottom: 15px;
  96.         width: 100%;
  97.     }

  98.     .meting-progress-container {
  99.         flex: 1;
  100.         height: 12px;
  101.         background: rgba(255, 255, 255, 0.3);
  102.         border-radius: 6px;
  103.         margin-right: 10px;
  104.         cursor: pointer;
  105.         position: relative;
  106.     }

  107.     .meting-progress-bar {
  108.         height: 100%;
  109.         background: #1db954;
  110.         border-radius: 6px;
  111.         width: 0%;
  112.     }

  113.     .meting-time-display {
  114.         font-size: 12px;
  115.         opacity: 0.8;
  116.         min-width: 80px;
  117.         text-align: center;
  118.     }

  119.     .meting-controls-bottom {
  120.         display: flex;
  121.         align-items: center;
  122.         justify-content: space-between;
  123.         width: 100%;
  124.     }

  125.     .meting-control-buttons {
  126.         display: flex;
  127.         align-items: center;
  128.     }

  129.     .meting-control-btn {
  130.         background: none;
  131.         border: none;
  132.         color: white;
  133.         font-size: 20px;
  134.         cursor: pointer;
  135.         margin: 0 5px;
  136.         outline: none;
  137.         transition: all 0.2s;
  138.         width: 32px;
  139.         height: 32px;
  140.         display: flex;
  141.         align-items: center;
  142.         justify-content: center;
  143.     }

  144.         .meting-control-btn:hover {
  145.             color: #1db954;
  146.         }

  147.     .meting-play-pause {
  148.         font-size: 32px;
  149.         width: 40px;
  150.         height: 40px;
  151.     }

  152.     .meting-volume-container {
  153.         display: flex;
  154.         align-items: center;
  155.     }

  156.     .meting-volume-btn {
  157.         background: none;
  158.         border: none;
  159.         color: white;
  160.         font-size: 18px;
  161.         cursor: pointer;
  162.         outline: none;
  163.         width: 24px;
  164.         height: 24px;
  165.         display: flex;
  166.         align-items: center;
  167.         justify-content: center;
  168.     }

  169.     .meting-volume-slider {
  170.         width: 80px;
  171.         margin-left: 5px;
  172.         -webkit-appearance: none;
  173.         height: 4px;
  174.         background: rgba(255, 255, 255, 0.3);
  175.         border-radius: 2px;
  176.         outline: none;
  177.     }

  178.         .meting-volume-slider::-webkit-slider-thumb {
  179.             -webkit-appearance: none;
  180.             width: 12px;
  181.             height: 12px;
  182.             border-radius: 50%;
  183.             background: #fff;
  184.             cursor: pointer;
  185.         }

  186.     .meting-toggle-player {
  187.         position: absolute;
  188.         top: -10px;
  189.         right: -10px;
  190.         width: 24px;
  191.         height: 24px;
  192.         border-radius: 50%;
  193.         background: #1db954;
  194.         color: white;
  195.         display: flex;
  196.         align-items: center;
  197.         justify-content: center;
  198.         cursor: pointer;
  199.         box-shadow: 0 2px 5px rgba(0, 0, 0, 0.2);
  200.         border: none;
  201.         font-size: 14px;
  202.         transition: all 0.2s;
  203.     }

  204.         .meting-toggle-player:hover {
  205.             transform: scale(1.1);
  206.         }

  207.     .meting-lyrics-container {
  208.         position: fixed;
  209.         bottom: 0;
  210.         left: 0;
  211.         right: 0;
  212.         text-align: center;
  213.         padding: 10px;
  214.         background: rgba(0, 0, 0, 0.5);
  215.         color: white;
  216.         font-size: 16px;
  217.         z-index: 900;
  218.         transition: all 0.3s;
  219.     }

  220.     .meting-lyrics-line {
  221.         margin: 5px 0;
  222.         opacity: 0.5;
  223.         transition: all 0.3s;
  224.     }

  225.         .meting-lyrics-line.active {
  226.             opacity: 1;
  227.             color: #1db954;
  228.             font-weight: bold;
  229.             transform: scale(1.05);
  230.         }

  231.     .meting-playlist-btn {
  232.         background: none;
  233.         border: none;
  234.         color: white;
  235.         font-size: 20px;
  236.         cursor: pointer;
  237.         margin-left: 10px;
  238.         outline: none;
  239.         width: 24px;
  240.         height: 24px;
  241.         display: flex;
  242.         align-items: center;
  243.         justify-content: center;
  244.     }

  245.     .meting-lyrics-btn {
  246.         background: none;
  247.         border: none;
  248.         color: white;
  249.         font-size: 16px;
  250.         cursor: pointer;
  251.         margin-left: 10px;
  252.         outline: none;
  253.         width: 24px;
  254.         height: 24px;
  255.         display: flex;
  256.         align-items: center;
  257.         justify-content: center;
  258.         font-weight: bold;
  259.     }

  260.         .meting-lyrics-btn.active {
  261.             color: #1db954;
  262.         }

  263.     /* 重新设计播放列表样式 - 更美观的电脑端播放列表 */
  264.     .meting-playlist-container {
  265.         position: absolute;
  266.         bottom: calc(100% + 10px); /* 与控制面板之间添加间隙 */
  267.         left: 0;
  268.         right: 0;
  269.         background: rgba(60, 66, 64, 0.9); /* 透明度与控制台一致 */
  270.         backdrop-filter: blur(10px);
  271.         border-radius: 12px; /* 四个角都是圆角 */
  272.         max-height: 400px;
  273.         overflow-y: auto;
  274.         display: none;
  275.         padding: 15px;
  276.         box-shadow: 0 -5px 25px rgba(0, 0, 0, 0.4);
  277.         border: 1px solid rgba(255, 255, 255, 0.1);
  278.         scrollbar-width: thin;
  279.         scrollbar-color: #1db954 rgba(255, 255, 255, 0.1);
  280.     }

  281.         .meting-playlist-container::-webkit-scrollbar {
  282.             width: 6px;
  283.         }

  284.         .meting-playlist-container::-webkit-scrollbar-track {
  285.             background: rgba(255, 255, 255, 0.05);
  286.             border-radius: 3px;
  287.         }

  288.         .meting-playlist-container::-webkit-scrollbar-thumb {
  289.             background-color: #1db954;
  290.             border-radius: 3px;
  291.         }

  292.         .meting-playlist-container.show {
  293.             display: block;
  294.         }

  295.     .meting-playlist-header {
  296.         display: flex;
  297.         justify-content: space-between;
  298.         align-items: center;
  299.         margin-bottom: 15px;
  300.         padding-bottom: 10px;
  301.         border-bottom: 1px solid rgba(255, 255, 255, 0.1);
  302.     }

  303.     .meting-playlist-title {
  304.         font-size: 16px;
  305.         font-weight: bold;
  306.         color: #fff;
  307.     }

  308.     .meting-playlist-count {
  309.         font-size: 13px;
  310.         opacity: 0.7;
  311.     }

  312.     .meting-playlist-items {
  313.         display: flex;
  314.         flex-direction: column;
  315.         gap: 8px;
  316.     }

  317.     .meting-playlist-item {
  318.         padding: 12px 15px;
  319.         border-radius: 8px;
  320.         cursor: pointer;
  321.         display: flex;
  322.         align-items: center;
  323.         transition: all 0.2s ease;
  324.         background: rgba(255, 255, 255, 0.03);
  325.     }

  326.         .meting-playlist-item:hover {
  327.             background: rgba(29, 185, 84, 0.15);
  328.             transform: translateY(-2px);
  329.         }

  330.         .meting-playlist-item.playing {
  331.             background: rgba(29, 185, 84, 0.2);
  332.             box-shadow: 0 4px 12px rgba(29, 185, 84, 0.2);
  333.         }

  334.             .meting-playlist-item.playing .meting-playlist-item-index {
  335.                 color: #1db954;
  336.                 font-weight: bold;
  337.             }

  338.             .meting-playlist-item.playing .meting-playlist-item-title {
  339.                 color: #1db954;
  340.             }

  341.     .meting-playlist-item-index {
  342.         margin-right: 15px;
  343.         font-size: 14px;
  344.         opacity: 0.8;
  345.         min-width: 24px;
  346.         text-align: center;
  347.         transition: all 0.2s ease;
  348.     }

  349.     .meting-playlist-item-info {
  350.         flex: 1;
  351.         overflow: hidden;
  352.         min-width: 0;
  353.     }

  354.     .meting-playlist-item-title {
  355.         font-size: 14px;
  356.         font-weight: 500;
  357.         white-space: nowrap;
  358.         overflow: hidden;
  359.         text-overflow: ellipsis;
  360.         margin-bottom: 3px;
  361.         transition: all 0.2s ease;
  362.     }

  363.     .meting-playlist-item-artist {
  364.         font-size: 12px;
  365.         opacity: 0.7;
  366.         white-space: nowrap;
  367.         overflow: hidden;
  368.         text-overflow: ellipsis;
  369.     }

  370.     .meting-playlist-item-duration {
  371.         font-size: 12px;
  372.         opacity: 0.6;
  373.         margin-left: 10px;
  374.         min-width: 40px;
  375.         text-align: right;
  376.     }

  377.     .meting-mode-btn {
  378.         background: none;
  379.         border: none;
  380.         color: white;
  381.         font-size: 16px;
  382.         cursor: pointer;
  383.         margin-left: 5px;
  384.         outline: none;
  385.         width: 24px;
  386.         height: 24px;
  387.         display: flex;
  388.         align-items: center;
  389.         justify-content: center;
  390.     }

  391.     /* 手机端适配 */
  392.     @media screen and (max-width: 768px) {
  393.         .meting-player-container {
  394.             left: 10px;
  395.             right: auto;
  396.             bottom: 20px;
  397.             width: auto;
  398.             max-width: 320px;
  399.             margin: 0;
  400.         }

  401.         .meting-player-main {
  402.             border-radius: 10px;
  403.         }

  404.         .meting-player-header {
  405.             padding: 10px;
  406.         }

  407.         .meting-song-title {
  408.             font-size: 13px;
  409.         }

  410.         .meting-song-artist {
  411.             font-size: 11px;
  412.         }

  413.         .meting-player-controls {
  414.             padding: 10px;
  415.         }

  416.         .meting-progress-top {
  417.             flex-direction: row;
  418.             align-items: center;
  419.             margin-bottom: 10px;
  420.         }

  421.         .meting-time-display {
  422.             margin-top: 0;
  423.             min-width: auto;
  424.             text-align: right;
  425.             font-size: 11px;
  426.             margin-left: 10px;
  427.         }

  428.         .meting-controls-bottom {
  429.             flex-direction: row;
  430.             gap: 5px;
  431.         }

  432.         .meting-volume-container {
  433.             width: auto;
  434.             justify-content: flex-end;
  435.         }

  436.         .meting-volume-slider {
  437.             flex: 1;
  438.             max-width: 80px;
  439.         }

  440.         .meting-control-btn {
  441.             font-size: 18px;
  442.             margin: 0 3px;
  443.             width: 28px;
  444.             height: 28px;
  445.         }

  446.         .meting-play-pause {
  447.             font-size: 28px;
  448.             width: 36px;
  449.             height: 36px;
  450.         }

  451.         .meting-toggle-player {
  452.             top: -8px;
  453.             right: -8px;
  454.             width: 20px;
  455.             height: 20px;
  456.             font-size: 12px;
  457.         }

  458.         .meting-lyrics-container {
  459.             font-size: 14px;
  460.             padding: 8px;
  461.             z-index: 800;
  462.         }

  463.         /* 手机端播放列表样式 */
  464.         .meting-playlist-container {
  465.             max-height: 200px;
  466.             border-radius: 10px; /* 四个角都是圆角 */
  467.             padding: 10px;
  468.             bottom: calc(100% + 8px); /* 与控制面板之间添加间隙 */
  469.             background: rgba(60, 66, 64, 0.9); /* 透明度与控制台一致 */
  470.         }

  471.         .meting-playlist-header {
  472.             margin-bottom: 10px;
  473.             padding-bottom: 8px;
  474.         }

  475.         .meting-playlist-title {
  476.             font-size: 14px;
  477.         }

  478.         .meting-playlist-count {
  479.             font-size: 11px;
  480.         }

  481.         .meting-playlist-item {
  482.             padding: 10px 12px;
  483.             border-radius: 6px;
  484.         }

  485.         .meting-playlist-item-index {
  486.             margin-right: 12px;
  487.             font-size: 12px;
  488.             min-width: 20px;
  489.         }

  490.         .meting-playlist-item-title {
  491.             font-size: 13px;
  492.         }

  493.         .meting-playlist-item-artist {
  494.             font-size: 11px;
  495.         }

  496.         .meting-playlist-item-duration {
  497.             font-size: 11px;
  498.             min-width: 35px;
  499.         }

  500.         .meting-lyrics-container:not([style*="display: none"]) {
  501.             height: auto;
  502.         }

  503.         .meting-lyrics-container[style*="display: none"] ~ .meting-player-container {
  504.             bottom: 10px;
  505.         }
  506.     }

  507.     /* 小屏手机适配 */
  508.     @media screen and (max-width: 480px) {
  509.         .meting-player-container {
  510.             left: 5px;
  511.             right: auto;
  512.             bottom: 10px;
  513.             max-width: 300px;
  514.         }

  515.         .meting-player-header {
  516.             padding: 8px;
  517.         }

  518.         .meting-song-title {
  519.             font-size: 12px;
  520.         }

  521.         .meting-song-artist {
  522.             font-size: 10px;
  523.         }

  524.         .meting-control-btn {
  525.             font-size: 16px;
  526.             margin: 0 2px;
  527.             width: 24px;
  528.             height: 24px;
  529.         }

  530.         .meting-play-pause {
  531.             font-size: 24px;
  532.             width: 32px;
  533.             height: 32px;
  534.         }

  535.         .meting-lyrics-btn,
  536.         .meting-playlist-btn,
  537.         .meting-mode-btn {
  538.             font-size: 16px;
  539.             margin-left: 5px;
  540.             width: 20px;
  541.             height: 20px;
  542.         }

  543.         .meting-time-display {
  544.             font-size: 10px;
  545.         }

  546.         .meting-lyrics-container {
  547.             font-size: 13px;
  548.             padding: 5px;
  549.         }

  550.         .meting-volume-slider {
  551.             max-width: 60px;
  552.         }

  553.         /* 小屏手机播放列表样式 */
  554.         .meting-playlist-container {
  555.             max-height: 180px;
  556.             padding: 8px;
  557.             bottom: calc(100% + 5px); /* 与控制面板之间添加间隙 */
  558.             border-radius: 8px; /* 四个角都是圆角 */
  559.             background: rgba(60, 66, 64, 0.9); /* 透明度与控制台一致 */
  560.         }

  561.         .meting-playlist-item {
  562.             padding: 8px 10px;
  563.         }

  564.         .meting-playlist-item-index {
  565.             margin-right: 10px;
  566.             font-size: 11px;
  567.             min-width: 18px;
  568.         }

  569.         .meting-playlist-item-title {
  570.             font-size: 12px;
  571.         }

  572.         .meting-playlist-item-artist {
  573.             font-size: 10px;
  574.         }

  575.         .meting-playlist-item-duration {
  576.             display: none;
  577.         }
  578.     }
  579. </style>
  580. <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/4.7.0/css/font-awesome.min.css">
  581. <div class="meting-player-container">
  582.     <div class="meting-player-main">
  583.         <img class="meting-album-cover" src="" alt="专辑封面">
  584.         <div class="meting-player-header">
  585.             <div class="meting-song-info">
  586.                 <div class="meting-song-title">正在加载...</div>
  587.                 <div class="meting-song-artist">请稍候</div>
  588.             </div>
  589.             <button class="meting-lyrics-btn">词</button>
  590.             <button class="meting-playlist-btn"><i class="fa fa-list"></i></button>
  591.             <button class="meting-mode-btn"><i class="fa fa-random"></i></button>
  592.         </div>
  593.         <div class="meting-player-controls">
  594.             <div class="meting-progress-top">
  595.                 <div class="meting-progress-container">
  596.                     <div class="meting-progress-bar"></div>
  597.                 </div>
  598.                 <div class="meting-time-display">00:00 / 00:00</div>
  599.             </div>
  600.             <div class="meting-controls-bottom">
  601.                 <div class="meting-control-buttons">
  602.                     <button class="meting-control-btn meting-prev-btn"><i class="fa fa-step-backward"></i></button>
  603.                     <button class="meting-control-btn meting-play-pause"><i class="fa fa-play"></i></button>
  604.                     <button class="meting-control-btn meting-next-btn"><i class="fa fa-step-forward"></i></button>
  605.                 </div>
  606.                 <div class="meting-volume-container">
  607.                     <button class="meting-volume-btn"><i class="fa fa-volume-up"></i></button>
  608.                     <input type="range" class="meting-volume-slider" min="0" max="100" value="80">
  609.                 </div>
  610.             </div>
  611.         </div>
  612.         <div class="meting-playlist-container">
  613.             <div class="meting-playlist-header">
  614.                 <div class="meting-playlist-title">播放列表</div>
  615.                 <div class="meting-playlist-count">0 首歌曲</div>
  616.             </div>
  617.             <div class="meting-playlist-items"></div>
  618.         </div>
  619.     </div>
  620.     <button class="meting-toggle-player"><i class="fa fa-minus"></i></button>
  621. </div>

  622. <div class="meting-lyrics-container">
  623.     <div class="meting-lyrics-line">歌词加载中...</div>
  624. </div>

  625. <script>
  626.     (function () {
  627.         // 播放器状态
  628.         const playerState = {
  629.             playlist: [],
  630.             currentIndex: 0,
  631.             isPlaying: false,
  632.             volume: 80,
  633.             currentTime: 0,
  634.             duration: 0,
  635.             mode: 'random', // random, sequential, loop
  636.             minimized: false,
  637.             lyricsVisible: true,
  638.             lyricsAutoHide: true,
  639.             lastPlayedSong: null,
  640.             lastPlayedPosition: 0,
  641.             autoPlayBlocked: false
  642.         };

  643.         // DOM元素
  644.         const elements = {
  645.             playerContainer: document.querySelector('.meting-player-container'),
  646.             playerMain: document.querySelector('.meting-player-main'),
  647.             albumCover: document.querySelector('.meting-album-cover'),
  648.             songTitle: document.querySelector('.meting-song-title'),
  649.             songArtist: document.querySelector('.meting-song-artist'),
  650.             playPauseBtn: document.querySelector('.meting-play-pause'),
  651.             prevBtn: document.querySelector('.meting-prev-btn'),
  652.             nextBtn: document.querySelector('.meting-next-btn'),
  653.             progressContainer: document.querySelector('.meting-progress-container'),
  654.             progressBar: document.querySelector('.meting-progress-bar'),
  655.             timeDisplay: document.querySelector('.meting-time-display'),
  656.             volumeBtn: document.querySelector('.meting-volume-btn'),
  657.             volumeSlider: document.querySelector('.meting-volume-slider'),
  658.             togglePlayerBtn: document.querySelector('.meting-toggle-player'),
  659.             lyricsContainer: document.querySelector('.meting-lyrics-container'),
  660.             lyricsLine: document.querySelector('.meting-lyrics-line'),
  661.             playlistBtn: document.querySelector('.meting-playlist-btn'),
  662.             playlistContainer: document.querySelector('.meting-playlist-container'),
  663.             playlistItems: document.querySelector('.meting-playlist-items'),
  664.             playlistTitle: document.querySelector('.meting-playlist-title'),
  665.             playlistCount: document.querySelector('.meting-playlist-count'),
  666.             modeBtn: document.querySelector('.meting-mode-btn'),
  667.             lyricsBtn: document.querySelector('.meting-lyrics-btn')
  668.         };

  669.         // 音频元素
  670.         const audio = new Audio();
  671.         audio.volume = playerState.volume / 100;

  672.         // 从localStorage加载状态
  673.         function loadPlayerState() {
  674.             const savedState = localStorage.getItem('metingPlayerState');
  675.             if (savedState) {
  676.                 const state = JSON.parse(savedState);
  677.                 playerState.currentIndex = state.currentIndex || 0;
  678.                 playerState.isPlaying = state.isPlaying || false;
  679.                 playerState.volume = state.volume || 80;
  680.                 playerState.currentTime = state.currentTime || 0;
  681.                 playerState.mode = state.mode || 'random';
  682.                 playerState.minimized = state.minimized || false;
  683.                 playerState.lyricsVisible = state.lyricsVisible !== undefined ? state.lyricsVisible : true;
  684.                 playerState.lyricsAutoHide = state.lyricsAutoHide !== undefined ? state.lyricsAutoHide : true;
  685.                 playerState.lastPlayedSong = state.lastPlayedSong || null;
  686.                 playerState.lastPlayedPosition = state.lastPlayedPosition || 0;

  687.                 // 应用保存的状态
  688.                 audio.volume = playerState.volume / 100;
  689.                 elements.volumeSlider.value = playerState.volume;

  690.                 if (playerState.minimized) {
  691.                     elements.playerContainer.classList.add('minimized');
  692.                     elements.togglePlayerBtn.innerHTML = '<i class="fa fa-plus"></i>';
  693.                 }

  694.                 // 应用歌词显示状态
  695.                 updateLyricsVisibility();
  696.                 updateLyricsButton();

  697.                 updateModeButton();
  698.                 updateVolumeIcon();
  699.             }
  700.         }

  701.         // 保存状态到localStorage
  702.         function savePlayerState() {
  703.             playerState.currentTime = audio.currentTime;

  704.             if (playerState.playlist.length > 0 && playerState.currentIndex >= 0) {
  705.                 const currentSong = playerState.playlist[playerState.currentIndex];
  706.                 playerState.lastPlayedSong = {
  707.                     id: currentSong.id || currentSong.name,
  708.                     name: currentSong.name,
  709.                     artist: currentSong.artist
  710.                 };
  711.                 playerState.lastPlayedPosition = audio.currentTime;
  712.             }

  713.             localStorage.setItem('metingPlayerState', JSON.stringify(playerState));
  714.         }

  715.         // 更新歌词按钮状态
  716.         function updateLyricsButton() {
  717.             if (playerState.lyricsVisible) {
  718.                 elements.lyricsBtn.classList.add('active');
  719.             } else {
  720.                 elements.lyricsBtn.classList.remove('active');
  721.             }
  722.         }

  723.         // 更新歌词可见性
  724.         function updateLyricsVisibility() {
  725.             if (playerState.lyricsVisible && !playerState.autoPlayBlocked) {
  726.                 elements.lyricsContainer.style.display = 'block';
  727.                 adjustPlayerPosition();
  728.             } else {
  729.                 elements.lyricsContainer.style.display = 'none';
  730.                 resetPlayerPosition();
  731.             }
  732.         }

  733.         // 调整播放器位置(确保在歌词上方)
  734.         function adjustPlayerPosition() {
  735.             if (window.matchMedia('(max-width: 768px)').matches) {
  736.                 const lyricsHeight = elements.lyricsContainer.offsetHeight;
  737.                 elements.playerContainer.style.bottom = (lyricsHeight + 10) + 'px';
  738.             }
  739.         }

  740.         // 重置播放器位置(歌词隐藏时)
  741.         function resetPlayerPosition() {
  742.             if (window.matchMedia('(max-width: 768px)').matches) {
  743.                 elements.playerContainer.style.bottom = '10px';
  744.             }
  745.         }

  746.         // 更新模式按钮
  747.         function updateModeButton() {
  748.             switch (playerState.mode) {
  749.                 case 'random':
  750.                     elements.modeBtn.innerHTML = '<i class="fa fa-random"></i>';
  751.                     break;
  752.                 case 'sequential':
  753.                     elements.modeBtn.innerHTML = '<i class="fa fa-arrow-right"></i>';
  754.                     break;
  755.                 case 'loop':
  756.                     elements.modeBtn.innerHTML = '<i class="fa fa-repeat"></i>';
  757.                     break;
  758.             }
  759.         }

  760.         // 更新音量图标
  761.         function updateVolumeIcon() {
  762.             const volume = elements.volumeSlider.value;
  763.             let iconClass = 'fa-volume-up';

  764.             if (volume == 0) {
  765.                 iconClass = 'fa-volume-off';
  766.             } else if (volume < 33) {
  767.                 iconClass = 'fa-volume-down';
  768.             }

  769.             elements.volumeBtn.innerHTML = `<i class="fa ${iconClass}"></i>`;
  770.         }

  771.         // 从MetingAPI获取播放列表
  772.         async function fetchPlaylist() {
  773.             try {
  774.                 const response = await fetch('https://music.3e0.cn/?server=tencent&type=playlist&id=3771408184');
  775.                 const playlist = await response.json();

  776.                 if (Array.isArray(playlist) && playlist.length > 0) {
  777.                     playerState.playlist = playlist;
  778.                     renderPlaylist();

  779.                     // 检查是否有上次播放的歌曲记录
  780.                     let targetIndex = 0;
  781.                     let targetPosition = 0;

  782.                     if (playerState.lastPlayedSong) {
  783.                         // 尝试找到上次播放的歌曲
  784.                         const foundIndex = playlist.findIndex(song =>
  785.                             (song.id && song.id === playerState.lastPlayedSong.id) ||
  786.                             (song.name === playerState.lastPlayedSong.name && song.artist === playerState.lastPlayedSong.artist)
  787.                         );

  788.                         if (foundIndex !== -1) {
  789.                             targetIndex = foundIndex;
  790.                             targetPosition = playerState.lastPlayedPosition;
  791.                         }
  792.                     } else if (playerState.currentIndex >= 0 && playerState.currentIndex < playlist.length) {
  793.                         // 使用保存的索引
  794.                         targetIndex = playerState.currentIndex;
  795.                         targetPosition = playerState.currentTime;
  796.                     }

  797.                     // 加载歌曲
  798.                     loadSong(targetIndex, targetPosition);

  799.                     // 如果是播放状态,开始播放
  800.                     if (playerState.isPlaying) {
  801.                         setTimeout(() => {
  802.                             audio.play().catch(e => {
  803.                                 console.log('自动播放被阻止:', e);
  804.                                 playerState.autoPlayBlocked = true;
  805.                                 playerState.isPlaying = false;
  806.                                 elements.playPauseBtn.innerHTML = '<i class="fa fa-play"></i>';
  807.                                 elements.playerMain.classList.remove('playing');

  808.                                 // 自动播放被阻止时隐藏歌词
  809.                                 updateLyricsVisibility();
  810.                                 savePlayerState();
  811.                             });
  812.                         }, 500);
  813.                     }
  814.                 } else {
  815.                     console.error('获取播放列表失败');
  816.                     elements.songTitle.textContent = '获取播放列表失败';
  817.                 }
  818.             } catch (error) {
  819.                 console.error('获取播放列表出错:', error);
  820.                 elements.songTitle.textContent = '获取播放列表出错';
  821.             }
  822.         }

  823.         // 渲染播放列表
  824.         function renderPlaylist() {
  825.             elements.playlistItems.innerHTML = '';
  826.             elements.playlistCount.textContent = `${playerState.playlist.length} 首歌曲`;

  827.             playerState.playlist.forEach((song, index) => {
  828.                 const item = document.createElement('div');
  829.                 item.className = 'meting-playlist-item';
  830.                 if (index === playerState.currentIndex) {
  831.                     item.classList.add('playing');
  832.                 }

  833.                 // 格式化歌曲时长
  834.                 let durationText = '';
  835.                 if (song.duration) {
  836.                     const minutes = Math.floor(song.duration / 60);
  837.                     const seconds = Math.floor(song.duration % 60);
  838.                     durationText = `${minutes}:${seconds.toString().padStart(2, '0')}`;
  839.                 }

  840.                 item.innerHTML = `
  841.                 <div class="meting-playlist-item-index">${index + 1}</div>
  842.                 <div class="meting-playlist-item-info">
  843.                     <div class="meting-playlist-item-title">${song.name}</div>
  844.                     <div class="meting-playlist-item-artist">${song.artist}</div>
  845.                 </div>
  846.                 <div class="meting-playlist-item-duration">${durationText}</div>
  847.             `;

  848.                 // 修改播放列表项点击事件处理 - 修复歌词显示问题
  849.                 item.addEventListener('click', () => {
  850.                     // 设置播放状态为true
  851.                     playerState.isPlaying = true;
  852.                     // 更新播放按钮状态
  853.                     elements.playPauseBtn.innerHTML = '<i class="fa fa-pause"></i>';
  854.                     elements.playerMain.classList.add('playing');

  855.                     // 确保歌词正确显示 - 修复的关键代码
  856.                     playerState.autoPlayBlocked = false;
  857.                     updateLyricsVisibility();

  858.                     // 加载并播放歌曲
  859.                     loadSong(index);
  860.                     audio.play().catch(e => {
  861.                         console.log('播放被阻止:', e);
  862.                         playerState.autoPlayBlocked = true;
  863.                         playerState.isPlaying = false;
  864.                         elements.playPauseBtn.innerHTML = '<i class="fa fa-play"></i>';
  865.                         elements.playerMain.classList.remove('playing');

  866.                         // 播放被阻止时隐藏歌词
  867.                         updateLyricsVisibility();
  868.                         savePlayerState();
  869.                     });
  870.                 });

  871.                 elements.playlistItems.appendChild(item);
  872.             });

  873.             // 如果播放列表显示,自动滚动到当前播放的歌曲
  874.             if (elements.playlistContainer.classList.contains('show')) {
  875.                 scrollToCurrentSong();
  876.             }
  877.         }

  878.         // 滚动到当前播放的歌曲
  879.         function scrollToCurrentSong() {
  880.             const currentItem = elements.playlistItems.children[playerState.currentIndex];
  881.             if (currentItem) {
  882.                 currentItem.scrollIntoView({ behavior: 'smooth', block: 'nearest' });
  883.             }
  884.         }

  885.         // 加载歌曲
  886.         function loadSong(index, position = 0) {
  887.             if (index < 0 || index >= playerState.playlist.length) return;

  888.             const song = playerState.playlist[index];
  889.             playerState.currentIndex = index;

  890.             elements.songTitle.textContent = song.name;
  891.             elements.songArtist.textContent = song.artist;

  892.             // 设置专辑封面 - 使用API返回的pic字段
  893.             if (song.pic) {
  894.                 elements.albumCover.src = song.pic;
  895.             }

  896.             audio.src = song.url;
  897.             audio.load();

  898.             // 设置播放位置
  899.             audio.onloadedmetadata = function () {
  900.                 if (position > 0 && position < audio.duration) {
  901.                     audio.currentTime = position;
  902.                     playerState.currentTime = position;
  903.                 }

  904.                 if (playerState.isPlaying) {
  905.                     audio.play().catch(e => {
  906.                         console.log('播放被阻止:', e);
  907.                         playerState.autoPlayBlocked = true;
  908.                         playerState.isPlaying = false;
  909.                         elements.playPauseBtn.innerHTML = '<i class="fa fa-play"></i>';
  910.                         elements.playerMain.classList.remove('playing');

  911.                         // 播放被阻止时隐藏歌词
  912.                         updateLyricsVisibility();
  913.                         savePlayerState();
  914.                     });
  915.                     elements.playerMain.classList.add('playing');
  916.                 } else {
  917.                     elements.playerMain.classList.remove('playing');
  918.                 }
  919.             };

  920.             // 加载歌词
  921.             fetchLyrics(song.lrc);

  922.             // 更新播放列表高亮
  923.             const items = document.querySelectorAll('.meting-playlist-item');
  924.             items.forEach((item, i) => {
  925.                 if (i === index) {
  926.                     item.classList.add('playing');
  927.                 } else {
  928.                     item.classList.remove('playing');
  929.                 }
  930.             });

  931.             // 自动滚动到当前播放的歌曲
  932.             scrollToCurrentSong();

  933.             // 保存状态
  934.             savePlayerState();

  935.             // 确保歌词显示状态正确 - 新增的修复代码
  936.             updateLyricsVisibility();
  937.         }

  938.         // 获取歌词
  939.         async function fetchLyrics(url) {
  940.             try {
  941.                 const response = await fetch(url);
  942.                 const text = await response.text();
  943.                 parseLyrics(text);
  944.             } catch (error) {
  945.                 console.error('获取歌词失败:', error);
  946.                 elements.lyricsLine.textContent = '歌词加载失败';
  947.             }
  948.         }

  949.         // 解析歌词
  950.         function parseLyrics(text) {
  951.             const lines = text.split('\n');
  952.             const lyrics = [];

  953.             // 解析歌词行
  954.             const regex = /\[(\d+):(\d+)\.(\d+)\](.*)/;
  955.             lines.forEach(line => {
  956.                 const match = line.match(regex);
  957.                 if (match) {
  958.                     const minutes = parseInt(match[1]);
  959.                     const seconds = parseInt(match[2]);
  960.                     const milliseconds = parseInt(match[3]);
  961.                     const text = match[4].trim();

  962.                     const time = minutes * 60 + seconds + milliseconds / 100;
  963.                     lyrics.push({ time, text });
  964.                 }
  965.             });

  966.             // 按时间排序
  967.             lyrics.sort((a, b) => a.time - b.time);

  968.             // 存储歌词
  969.             playerState.lyrics = lyrics;
  970.             elements.lyricsLine.textContent = lyrics.length > 0 ? lyrics[0].text : '暂无歌词';

  971.             // 歌词加载后调整播放器位置
  972.             setTimeout(adjustPlayerPosition, 100);
  973.         }

  974.         // 更新歌词显示
  975.         function updateLyrics() {
  976.             if (!playerState.lyrics || !playerState.lyricsVisible || playerState.autoPlayBlocked) return;

  977.             const currentTime = audio.currentTime;
  978.             let currentLine = '';

  979.             for (let i = playerState.lyrics.length - 1; i >= 0; i--) {
  980.                 if (currentTime >= playerState.lyrics[i].time) {
  981.                     currentLine = playerState.lyrics[i].text;
  982.                     break;
  983.                 }
  984.             }

  985.             elements.lyricsLine.textContent = currentLine || '♪';
  986.         }

  987.         // 播放/暂停
  988.         function togglePlay() {
  989.             if (audio.paused) {
  990.                 audio.play().then(() => {
  991.                     playerState.isPlaying = true;
  992.                     playerState.autoPlayBlocked = false;
  993.                     elements.playPauseBtn.innerHTML = '<i class="fa fa-pause"></i>';
  994.                     elements.playerMain.classList.add('playing');

  995.                     // 播放时显示歌词
  996.                     updateLyricsVisibility();
  997.                 }).catch(e => {
  998.                     console.log('播放被阻止:', e);
  999.                     playerState.autoPlayBlocked = true;
  1000.                     playerState.isPlaying = false;
  1001.                     elements.playPauseBtn.innerHTML = '<i class="fa fa-play"></i>';
  1002.                     elements.playerMain.classList.remove('playing');

  1003.                     // 播放被阻止时隐藏歌词
  1004.                     updateLyricsVisibility();
  1005.                 });
  1006.             } else {
  1007.                 audio.pause();
  1008.                 playerState.isPlaying = false;
  1009.                 elements.playPauseBtn.innerHTML = '<i class="fa fa-play"></i>';
  1010.                 elements.playerMain.classList.remove('playing');

  1011.                 // 暂停时自动隐藏歌词
  1012.                 if (playerState.lyricsAutoHide && playerState.lyricsVisible) {
  1013.                     elements.lyricsContainer.style.display = 'none';
  1014.                     resetPlayerPosition();
  1015.                 }
  1016.             }
  1017.             savePlayerState();
  1018.         }

  1019.         // 切换歌词显示/隐藏
  1020.         function toggleLyrics() {
  1021.             playerState.lyricsVisible = !playerState.lyricsVisible;

  1022.             updateLyricsVisibility();
  1023.             updateLyricsButton();

  1024.             savePlayerState();
  1025.         }

  1026.         // 下一首 - 修复播放状态问题
  1027.         function nextSong() {
  1028.             let nextIndex;

  1029.             switch (playerState.mode) {
  1030.                 case 'random':
  1031.                     nextIndex = Math.floor(Math.random() * playerState.playlist.length);
  1032.                     break;
  1033.                 case 'sequential':
  1034.                     nextIndex = (playerState.currentIndex + 1) % playerState.playlist.length;
  1035.                     break;
  1036.                 case 'loop':
  1037.                     nextIndex = playerState.currentIndex;
  1038.                     break;
  1039.             }

  1040.             // 设置播放状态并更新UI - 修复的关键代码
  1041.             playerState.isPlaying = true;
  1042.             playerState.autoPlayBlocked = false;
  1043.             elements.playPauseBtn.innerHTML = '<i class="fa fa-pause"></i>';
  1044.             elements.playerMain.classList.add('playing');

  1045.             // 确保歌词显示
  1046.             updateLyricsVisibility();

  1047.             // 加载并播放歌曲
  1048.             loadSong(nextIndex);
  1049.             audio.play().catch(e => {
  1050.                 console.log('播放被阻止:', e);
  1051.                 playerState.autoPlayBlocked = true;
  1052.                 playerState.isPlaying = false;
  1053.                 elements.playPauseBtn.innerHTML = '<i class="fa fa-play"></i>';
  1054.                 elements.playerMain.classList.remove('playing');

  1055.                 // 播放被阻止时隐藏歌词
  1056.                 updateLyricsVisibility();
  1057.                 savePlayerState();
  1058.             });
  1059.         }

  1060.         // 上一首 - 修复播放状态问题
  1061.         function prevSong() {
  1062.             let prevIndex;

  1063.             switch (playerState.mode) {
  1064.                 case 'random':
  1065.                     prevIndex = Math.floor(Math.random() * playerState.playlist.length);
  1066.                     break;
  1067.                 case 'sequential':
  1068.                     prevIndex = (playerState.currentIndex - 1 + playerState.playlist.length) % playerState.playlist.length;
  1069.                     break;
  1070.                 case 'loop':
  1071.                     prevIndex = playerState.currentIndex;
  1072.                     break;
  1073.             }

  1074.             // 设置播放状态并更新UI - 修复的关键代码
  1075.             playerState.isPlaying = true;
  1076.             playerState.autoPlayBlocked = false;
  1077.             elements.playPauseBtn.innerHTML = '<i class="fa fa-pause"></i>';
  1078.             elements.playerMain.classList.add('playing');

  1079.             // 确保歌词显示
  1080.             updateLyricsVisibility();

  1081.             // 加载并播放歌曲
  1082.             loadSong(prevIndex);
  1083.             audio.play().catch(e => {
  1084.                 console.log('播放被阻止:', e);
  1085.                 playerState.autoPlayBlocked = true;
  1086.                 playerState.isPlaying = false;
  1087.                 elements.playPauseBtn.innerHTML = '<i class="fa fa-play"></i>';
  1088.                 elements.playerMain.classList.remove('playing');

  1089.                 // 播放被阻止时隐藏歌词
  1090.                 updateLyricsVisibility();
  1091.                 savePlayerState();
  1092.             });
  1093.         }

  1094.         // 切换播放模式
  1095.         function toggleMode() {
  1096.             const modes = ['random', 'sequential', 'loop'];
  1097.             const currentIndex = modes.indexOf(playerState.mode);
  1098.             playerState.mode = modes[(currentIndex + 1) % modes.length];
  1099.             updateModeButton();
  1100.             savePlayerState();
  1101.         }

  1102.         // 切换播放器最小化状态
  1103.         function toggleMinimize() {
  1104.             playerState.minimized = !playerState.minimized;

  1105.             if (playerState.minimized) {
  1106.                 elements.playerContainer.classList.add('minimized');
  1107.                 elements.togglePlayerBtn.innerHTML = '<i class="fa fa-plus"></i>';
  1108.                 // 隐藏播放列表
  1109.                 elements.playlistContainer.classList.remove('show');
  1110.             } else {
  1111.                 elements.playerContainer.classList.remove('minimized');
  1112.                 elements.togglePlayerBtn.innerHTML = '<i class="fa fa-minus"></i>';
  1113.             }

  1114.             savePlayerState();
  1115.         }

  1116.         // 切换播放列表显示
  1117.         function togglePlaylist() {
  1118.             // 如果正在最小化状态,先退出最小化
  1119.             if (playerState.minimized) {
  1120.                 toggleMinimize();
  1121.             }
  1122.             elements.playlistContainer.classList.toggle('show');

  1123.             // 如果播放列表显示,则滚动到当前播放的歌曲
  1124.             if (elements.playlistContainer.classList.contains('show')) {
  1125.                 // 使用setTimeout确保播放列表渲染完成
  1126.                 setTimeout(() => {
  1127.                     scrollToCurrentSong();
  1128.                 }, 0);
  1129.             }
  1130.         }

  1131.         // 更新进度条
  1132.         function updateProgress() {
  1133.             const percent = (audio.currentTime / audio.duration) * 100;
  1134.             elements.progressBar.style.width = `${percent}%`;

  1135.             const currentMinutes = Math.floor(audio.currentTime / 60);
  1136.             const currentSeconds = Math.floor(audio.currentTime % 60);
  1137.             const durationMinutes = Math.floor(audio.duration / 60);
  1138.             const durationSeconds = Math.floor(audio.duration % 60);

  1139.             elements.timeDisplay.textContent =
  1140.                 `${currentMinutes.toString().padStart(2, '0')}:${currentSeconds.toString().padStart(2, '0')} / ${durationMinutes.toString().padStart(2, '0')}:${durationSeconds.toString().padStart(2, '0')}`;

  1141.             updateLyrics();

  1142.             // 定期保存播放状态(每5秒)
  1143.             if (Math.floor(audio.currentTime) % 5 === 0) {
  1144.                 savePlayerState();
  1145.             }
  1146.         }

  1147.         // 设置进度
  1148.         function setProgress(e) {
  1149.             const width = elements.progressContainer.clientWidth;
  1150.             const clickX = e.offsetX;
  1151.             const duration = audio.duration;

  1152.             audio.currentTime = (clickX / width) * duration;
  1153.             savePlayerState();
  1154.         }

  1155.         // 设置音量
  1156.         function setVolume() {
  1157.             const volume = elements.volumeSlider.value;
  1158.             audio.volume = volume / 100;
  1159.             playerState.volume = volume;

  1160.             updateVolumeIcon();
  1161.             savePlayerState();
  1162.         }

  1163.         // 初始化事件监听
  1164.         function initEventListeners() {
  1165.             elements.playPauseBtn.addEventListener('click', togglePlay);
  1166.             elements.prevBtn.addEventListener('click', prevSong);
  1167.             elements.nextBtn.addEventListener('click', nextSong);
  1168.             elements.progressContainer.addEventListener('click', setProgress);
  1169.             elements.volumeSlider.addEventListener('input', setVolume);
  1170.             elements.togglePlayerBtn.addEventListener('click', toggleMinimize);
  1171.             elements.lyricsBtn.addEventListener('click', toggleLyrics);
  1172.             elements.playlistBtn.addEventListener('click', togglePlaylist);
  1173.             elements.modeBtn.addEventListener('click', toggleMode);

  1174.             audio.addEventListener('timeupdate', updateProgress);
  1175.             audio.addEventListener('ended', nextSong);

  1176.             // 页面关闭前保存状态
  1177.             window.addEventListener('beforeunload', savePlayerState);

  1178.             // 页面可见性变化时保存状态
  1179.             document.addEventListener('visibilitychange', function () {
  1180.                 if (document.hidden) {
  1181.                     savePlayerState();
  1182.                 }
  1183.             });

  1184.             // 窗口大小变化时调整播放器位置
  1185.             window.addEventListener('resize', function () {
  1186.                 if (playerState.lyricsVisible && !playerState.autoPlayBlocked) {
  1187.                     adjustPlayerPosition();
  1188.                 } else {
  1189.                     resetPlayerPosition();
  1190.                 }
  1191.             });
  1192.         }

  1193.         // 初始化播放器
  1194.         function initPlayer() {
  1195.             loadPlayerState();
  1196.             initEventListeners();
  1197.             fetchPlaylist();
  1198.         }

  1199.         // 启动播放器
  1200.         initPlayer();
  1201.     })();
  1202. </script>
复制代码


本帖被以下淘专辑推荐:

路虽远,行则将至;事虽难,做则必成。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

飞流广播+ 发布

系统消息:柒沐已经连续答对3道难题,逆天学霸谁与争锋?!#每日答题#
10-30 17:02
系统消息:柒沐已经连续答对10道难题,逆天学霸谁与争锋?!#每日答题#
10-09 09:07
系统消息:柒沐已经连续答对3道难题,逆天学霸谁与争锋?!#每日答题#
09-24 09:00
系统消息:柒沐已经连续答对3道难题,逆天学霸谁与争锋?!#每日答题#
09-11 11:40
系统消息:柒沐已经连续答对3道难题,逆天学霸谁与争锋?!#每日答题#
09-02 09:17
系统消息:柒沐已经连续答对3道难题,逆天学霸谁与争锋?!#每日答题#
08-27 08:56
系统消息:柒沐已经连续答对3道难题,逆天学霸谁与争锋?!#每日答题#
08-20 15:12
系统消息:柒沐已经连续答对3道难题,逆天学霸谁与争锋?!#每日答题#
08-03 10:22
系统消息:柒沐已经连续答对10道难题,逆天学霸谁与争锋?!#每日答题#
06-30 08:57
系统消息:柒沐已经连续答对3道难题,逆天学霸谁与争锋?!#每日答题#
06-18 09:14
系统消息:清风网络已经连续答对10道难题,逆天学霸谁与争锋?!#每日答题#
04-11 09:40
系统消息:清风网络已经连续答对3道难题,逆天学霸谁与争锋?!#每日答题#
04-10 09:31
系统消息:IXM77777已经连续答对3道难题,逆天学霸谁与争锋?!#每日答题#
04-09 13:44
系统消息:清风网络已经连续答对3道难题,逆天学霸谁与争锋?!#每日答题#
04-09 09:22
系统消息:柒沐已经连续答对10道难题,逆天学霸谁与争锋?!#每日答题#
04-09 08:52
系统消息:清风网络已经连续答对3道难题,逆天学霸谁与争锋?!#每日答题#
04-08 09:24
系统消息:柒沐已经连续答对3道难题,逆天学霸谁与争锋?!#每日答题#
04-07 09:02
系统消息:柒沐已经连续答对10道难题,逆天学霸谁与争锋?!#每日答题#
02-27 09:35
系统消息:柒沐已经连续答对3道难题,逆天学霸谁与争锋?!#每日答题#
02-26 09:06
系统消息:柒沐已经连续答对3道难题,逆天学霸谁与争锋?!#每日答题#
02-25 08:49
站内通告

提供资源交易、信息共享、靓号交流、技术变现、学习问答、兴趣娱乐等全面服务。

1.丰富功能系统,扩展社区特色玩法,打造最好的互联网聚集圈子。

2.准确信息真实交易,安全快捷又方便,让虚拟交易面对面。

3. 天上不会掉馅饼,话术骗术迷人心,切勿脱离平台线下交易,被骗与平台无关!

4. 欺诈骗钱,违规违法将视情受到警告&禁言&封号甚至检举至👮🏻‍♀️处理!

官方Q群:123129钉推群:BAYR2383 站长QQ:3220000000

投诉/建议/商务合作联系

fl@fllt.cn

严禁私下交易,被骗与本站无关。
违反交易细则,取证立查严惩。
  • 钉钉新帖推送群
  • 官方交流QQ群
  • 站长唯一微信号

👮曝光Ta|🧿小黑屋|📴手机页|飞流网 ( 渝ICP备2025054677号-1|电信增值许可 渝B2-20250789 )|网站地图

GMT+8, 2025-12-10 14:22 , Processed in 0.097023 second(s), 61 queries, MemCached On , Gzip On.

Based on XJ-TX X3.5 Licensed

飞流论坛 HanAnalytics icp Astro vhAstro-Theme

关灯 在本版发帖
扫一扫添加微信客服
QQ客服返回顶部
快速回复 返回顶部 返回列表