查看: 428|回复: 39

audioplayer修正版(存档)

[复制链接]
  • 打卡等级:Lv9.本地传说
  • 打卡总天数:1859
  • 打卡月天数:2
  • 打卡总奖励:193887
  • 最近打卡:2026-10-22 22:15:16

3265

主题

13万

回帖

28万

积分

管理员

花潮帅哥鼠牛虎兔龙蛇马羊猴鸡狗猪多彩人生星月交辉奔放热烈海样胸怀春风拂面火热情怀优雅迷人神秘浪漫相遇之美鹰傲苍穹花好月圆紫色情节飞龙在天王者至尊大将风范音画大师天籁妙音共看流星风雨同行我心永远幸福快乐喜乐安康侠骨柔肠心想事成开朗大方花潮管理

发表于 2026-6-4 17:47 | 显示全部楼层 |阅读模式

请马上登录,朋友们都在花潮里等着你哦:)

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

×
  1. /** audioplayer.js(2026年6月4日更新)

  2.     在指定父元素生成播放器+全屏按钮,
  3.     支持添加多个自定义音频控制按钮,
  4.     支持热键操作(F11、Alt+X/N/P/L)

  5.     1. 前台配置:
  6.     let option = {
  7.         pa: '.pa'; // 或者 '#pa' | pa
  8.         urls: [
  9.             ['歌曲地址1', '曲名1'],
  10.             ['歌曲地址2', '曲名2'],
  11.         ],
  12.         fs: false, // 禁用全屏按钮,缺省值 true(启用)
  13.         btns: [dom1, dom2, dom2], // 自定义播放控制器(若需要)
  14.     }

  15.     2. 实例化举例:const aud = new AudPlayer(option);

  16.     3. 前台CSS:
  17.     ① 播 放 器: .player { width: 420px; bottom: 10px; right: 20px; color: gold; }
  18.     ② 全屏按钮: .btnFs { top: 20px; right: 20px; color: gold; }
  19. */
  20. class AudPlayer {
  21.     constructor(config = {}) {
  22.         // 基础配置
  23.         this.config = {
  24.             pa: config.pa || document.body,
  25.             urls: config.urls || [],
  26.             fs: true,
  27.             btns: config.btns,
  28.         };

  29.         // 关键DOM+核心状态
  30.         this.pa = this.getParentElement();
  31.         this.aud = new Audio();
  32.         this.fs_btn = null;
  33.         this.playList = [...this.config.urls]; // 原始歌单
  34.         this.randomQueue = []; // 随机播放队列
  35.         this.currentIndex = 0; // 当前播放索引
  36.         this.isPlaying = false;
  37.         this.isSingle = this.playList.length === 1;

  38.         // 初始化
  39.         this.generateUI();
  40.         this.initRandomQueue();
  41.         this.placeMList();
  42.         this.displayPlayer();
  43.         this.bindAudEvents();
  44.         this.playFirst();
  45.     }

  46.     // 加载+播放曲目
  47.     loadTrack(index) {
  48.         if (index < 0 || index >= this.playList.length) return;
  49.         this.currentIndex = index;
  50.         const [url, title] = this.playList[index];

  51.         this.aud.src = url;
  52.         this.aud.play().catch(err => this.showError('自动播放受限,请点击播放按钮'));

  53.         // 歌单高亮+翻页
  54.         if (!this.isSingle) {
  55.             this.mlist.dataset.currentsong = '正在播放 :' + title;
  56.             const lists = this.mlist.querySelectorAll('li');
  57.             const curList = this.mlist.querySelector(`li[data-idx="${index}"]`);
  58.             lists.forEach(li => li.classList.remove('list-highlight'));
  59.             curList.classList.add('list-highlight');
  60.             const ol = curList.parentNode;
  61.             const distance = curList.offsetTop - curList.offsetHeight - 10;
  62.             ol.scrollTo({left: 0, top: distance, behavior: 'smooth'});
  63.         }
  64.         this.mState();
  65.     }

  66.     // 首次播放
  67.     playFirst() {
  68.         const idx = Math.floor(Math.random() * this.playList.length);
  69.         this.loadTrack(idx);
  70.     }

  71.     // 手动选曲(不影响随机队列)
  72.     selectTrack(index) {
  73.         this.loadTrack(index);
  74.     }

  75.     // 上一首
  76.     playPrev() {
  77.         if (this.isSingle) return;
  78.         let prevIndex = this.currentIndex - 1;
  79.         if (prevIndex < 0) prevIndex = this.playList.length - 1;
  80.         this.loadTrack(prevIndex);
  81.     }

  82.     // 下一首
  83.     playNext() {
  84.         if (this.isSingle) return;
  85.         let nextIndex = this.currentIndex + 1;
  86.         if (nextIndex >= this.playList.length) nextIndex = 0;
  87.         this.loadTrack(nextIndex);
  88.     }

  89.     // 切换播放/暂停
  90.     togglePlay() {
  91.         if (this.isPlaying) {
  92.               this.aud.pause();
  93.         } else {
  94.             this.aud.play().catch(err => this.showError('播放失败,请检查音频链接'));
  95.         }
  96.     }

  97.     // 按钮、视频等状态维护
  98.     mState() {
  99.         const vids = this.pa.querySelectorAll('video');
  100.         if (this.aud.paused) {
  101.             this.playbtn.classList.remove('clip-pause');
  102.             this.playbtn.classList.add('clip-play');
  103.             this.pa.style.setProperty('--state', 'paused');
  104.             if (vids) vids.forEach(vid => vid.pause());
  105.         } else {
  106.             this.playbtn.classList.remove('clip-play');
  107.               this.playbtn.classList.add('clip-pause');
  108.               this.pa.style.setProperty('--state', 'running');
  109.               if (vids) vids.forEach(vid => vid.play());
  110.         }
  111.     }

  112.     // 播放结束处理
  113.     handlePlayEnd() {
  114.         if (this.isSingle) {
  115.             // 单曲循环
  116.             this.aud.currentTime = 0;
  117.             this.aud.play();
  118.         } else {
  119.             // 多曲:从随机队列取歌
  120.             if (this.randomQueue.length === 0) {
  121.                 this.resetRandomQueue(); // 周期结束,重置随机队列
  122.             }
  123.             const nextTrack = this.randomQueue.shift();
  124.             const nextIndex = this.playList.findIndex(item => item[0] === nextTrack[0]);
  125.             this.loadTrack(nextIndex);
  126.         }
  127.     }

  128.     // 初始化随机播放队列
  129.     initRandomQueue() {
  130.         if (this.isSingle) return;
  131.         this.randomQueue = [...this.playList].sort(() => Math.random() - 0.5);
  132.     }

  133.     // 重置随机队列(一个周期结束后)
  134.     resetRandomQueue() {
  135.         this.initRandomQueue();
  136.     }

  137.     // 音频事件绑定
  138.     bindAudEvents() {
  139.         // 时间更新
  140.         this.aud.addEventListener('timeupdate', () => {
  141.             const { currentTime, duration } = this.aud;
  142.             this.prog.style.setProperty('--prog',  `${currentTime / duration * 100}%`);
  143.             this.tmsg.textContent = `${this.s2m(currentTime)} / ${this.s2m(duration)}`;
  144.         });

  145.         // 播放结束
  146.         this.aud.addEventListener('ended', () => {
  147.             this.handlePlayEnd();
  148.         });

  149.         // 播放/暂停状态同步
  150.         this.aud.addEventListener('play', () => {
  151.             this.isPlaying = true;
  152.             this.mState();
  153.         });

  154.         // 暂停
  155.         this.aud.addEventListener('pause', () => {
  156.             this.isPlaying = false;
  157.             this.mState();
  158.         });

  159.         // 出错
  160.         this.aud.addEventListener('error', (e) => {
  161.             this.showError(`播放失败:${this.playList[this.currentIndex][1]}`);
  162.             this.handlePlayEnd();
  163.         });
  164.     }

  165.     // 创建UI
  166.     generateUI() {
  167.         if (document.querySelector('#audio-player-style')) return;
  168.         const style = document.createElement('style');
  169.         style.id = 'audio-player-style';
  170.         style.textContent = [
  171.             `.player { position: absolute; padding: 6px; width: 460px; height: 40px; line-height: 40px; display: flex; align-items: center; gap: 10px; transition: .75s; opacity: var(--opacity); }`,
  172.             `.player * { box-sizing: border-box; }`,
  173.             `.aud-btn { width: 35px; height: 35px; border: 1px solid currentColor; border-radius: 50%; cursor: pointer; position: relative; display: grid; place-items: center; }`,
  174.             `.aud-btn:hover { background: rgba(0,0,0,.25); }`,
  175.             `.aud-btn::before { content: ''; position: absolute; width: 50%; height: 50%; background: currentColor; clip-path: var(--clip-path); }`,
  176.             `.aud-prog { flex-grow: 1; height: 12px; background: linear-gradient(to right, currentColor var(--prog), transparent var(--prog), transparent 0); border: 1px solid currentColor; border-radius: 12px; cursor: pointer; --prog: 0%; }`,
  177.             `.common-btn { width: 26px; height: 26px; border: 1px solid currentColor; border-radius: 6px; padding: 0; font: normal 16px/26px sans-serif; text-align: center; user-select: none; cursor: pointer; }`,
  178.             `.common-btn:hover { background: rgba(0,0,0,.25); }`,
  179.             `.music-list { position: absolute; left: 50%; transform: translateX(-50%); width: 100%; max-width: 460px; min-height: 100%; height: 232px; border-radius: 6px; background: rgba(0,0,0,.25); box-shadow: 3px 3px 6px gray; display: none; }`,
  180.             `.music-list::before { position: sticky; content: attr(data-currentsong); font-weight: bold; padding: 5px 15px;}`,
  181.             `.music-list ol { height: 160px; overflow: auto; scrollbar-width: thin; scrollbar-color: currentColor transparent; }`,
  182.             `.music-list ol li span { cursor: pointer; }`,
  183.             `.music-list ol li span:hover { opacity: .75; }`,
  184.             `.aud-tmsg { user-select: none; cursor: default; }`,
  185.             `.clip-play { --clip-path: polygon(0 0, 0 100%, 100% 50%);}`,
  186.             `.clip-pause { --clip-path: polygon(45% 0, 45% 100%, 10% 100%, 10% 0, 90% 0, 90% 100%, 55% 100%, 55% 0); }`,
  187.             `.list-highlight { color: red; }`,
  188.             `.btnFs { position: absolute; padding: 6px 12px; border: 3px solid currentColor; border-radius: 12px; font-size: 1.2em; color: currentColor; background: rgba(0,0,0,.25); transition: .75s; opacity: var(--opacity); user-select: none; cursor: pointer; }`,
  189.             `.btnFs:hover { font-weight: bold; }`,
  190.         ].join('');
  191.         document.head.appendChild(style);

  192.         // 播放器容器
  193.         this.player = document.createElement('div');
  194.         this.player.classList.add('player');

  195.         // 前一首按钮
  196.         if (!this.isSingle) {
  197.             const btnPrev = document.createElement('div');
  198.             btnPrev.classList.add('common-btn');
  199.             btnPrev.textContent = '←';
  200.             btnPrev.title = '前一首(Alt+P)';
  201.             btnPrev.addEventListener('click', () => this.playPrev());
  202.             this.player.appendChild(btnPrev);
  203.         }

  204.         // 播放|暂停按钮
  205.         this.playbtn = document.createElement('div');
  206.         this.playbtn.classList.add('aud-btn', 'clip-pause');
  207.         this.playbtn.title = '播放/暂停(Alt+X)';
  208.         this.playbtn.addEventListener('click', () => this.togglePlay());
  209.         this.player.appendChild(this.playbtn);

  210.         // 下一首按钮
  211.         if (!this.isSingle) {
  212.             const btnNext = document.createElement('div');
  213.             btnNext.classList.add('common-btn');
  214.             btnNext.textContent = '→';
  215.             btnNext.title = '下一首(Alt+N)';
  216.             btnNext.addEventListener('click', () => this.playNext());
  217.             this.player.appendChild(btnNext);
  218.         }

  219.         // 进度条
  220.         this.prog = document.createElement('div');
  221.         this.prog.classList.add('aud-prog');
  222.         this.prog.addEventListener('click', (e) => {
  223.             const duration = this.aud.duration;
  224.             if (isNaN(duration)) return;
  225.             this.aud.currentTime = duration * e.offsetX / this.prog.offsetWidth;
  226.         });
  227.         this.prog.addEventListener('mousemove', (e) => {
  228.             const duration = this.aud.duration;
  229.             this.prog.title = this.s2m(duration * e.offsetX / this.prog.offsetWidth);
  230.         });
  231.         this.player.appendChild(this.prog);

  232.         // 数字时间
  233.         this.tmsg = document.createElement('div');
  234.         this.tmsg.classList.add('aud-tmsg');
  235.         this.tmsg.textContent = '00:00 / 00:00';
  236.         this.player.appendChild(this.tmsg);

  237.         // 列表控制按钮
  238.         if (!this.isSingle) {
  239.         this.listControl = document.createElement('div');
  240.         this.listControl.classList.add('common-btn');
  241.         this.listControl.textContent = '▼';
  242.         this.listControl.title = '音乐列表(Alt+L)';

  243.         // 列表弹出/收起+按钮箭头变换
  244.         this.listControl.addEventListener('click', () => {
  245.             let hide = this.mlist.style.display === 'block';
  246.             this.mlist.style.display = hide ? 'none' : 'block';
  247.             this.listControl.textContent = this.listControl.textContent === '▲' ? '▼' : '▲';
  248.             if (!hide) {
  249.                 const li = this.mlist.querySelector(`li[data-idx="${this.currentIndex}"]`);
  250.                 const ol = li.parentNode;
  251.                 const distance = li.offsetTop - li.offsetHeight - 10;
  252.                 ol.scrollTo({left: 0, top: distance, behavior: 'smooth'});
  253.             }
  254.         });
  255.         this.player.appendChild(this.listControl);
  256.         // 音乐列表
  257.         this.mlist = document.createElement('div');
  258.         this.mlist.classList.add('music-list');
  259.         this.generateMusicList();
  260.         this.player.appendChild(this.mlist);
  261.         }

  262.         // 全屏按钮
  263.         if (this.config.fs) {
  264.             this.fs_btn = document.createElement('div');
  265.             this.fs_btn.classList.add('btnFs');
  266.             this.fullScreen(this.fs_btn);
  267.             this.pa.appendChild(this.fs_btn);
  268.         }

  269.         this.pa.appendChild(this.player);

  270.         // 自定义添加的播放按钮(数组doms传参)
  271.         if (this.config.btns) {
  272.             this.config.btns.forEach(btn => {
  273.                 btn.title = '播放/暂停(Alt+X)';
  274.                 btn.addEventListener('click', () => {
  275.                     this.togglePlay();
  276.                 });
  277.             });
  278.         }

  279.         // 热键
  280.         document.addEventListener('keydown', (e) => {
  281.             if(e.altKey) {
  282.                 if (e.key === 'x') this.togglePlay();
  283.                 if (e.key === 'p') this.playPrev();
  284.                 if (e.key === 'n') this.playNext();
  285.                 if (e.key === 'l') this.listControl.click();
  286.             }
  287.         });
  288.     }

  289.     // 列表定位+控制按钮状态
  290.     placeMList() {
  291.         if (this.isSingle) return;
  292.         const style = window.getComputedStyle(this.player);
  293.         const up = parseInt(style.getPropertyValue('bottom')) >= parseInt(style.getPropertyValue('top'));
  294.         const ar = ['▲','▼' ];
  295.         this.listControl.textContent = ar[+up];
  296.         this.mlist.style.setProperty(`${up ? 'top' : 'bottom'}`, '100%');
  297.     }

  298.     // 生成列表
  299.     generateMusicList() {
  300.         const ol = document.createElement('ol');
  301.         this.playList.forEach((list, idx) => {
  302.             const li = document.createElement('li');
  303.             li.innerHTML = `<span>${list[1]}</span>`;
  304.             li.dataset.idx = idx;
  305.             li.onclick = () => {
  306.                 this.selectTrack(idx);
  307.             }
  308.             ol.appendChild(li);
  309.         });
  310.         this.mlist.appendChild(ol);
  311.     }

  312.     // 全屏
  313.     fullScreen = (btn) => {
  314.         let isFullscreen = false;
  315.         btn.textContent = '进入全屏';
  316.         btn.title = 'F11';
  317.         btn.addEventListener('click', () => {
  318.             isFullscreen ? document.exitFullscreen() : this.pa.requestFullscreen();
  319.         });

  320.         document.addEventListener('fullscreenchange', () => {
  321.             if (document.fullscreenElement !== null) {
  322.                 isFullscreen = true;
  323.                 btn.textContent = '退出全屏';
  324.             } else {
  325.                 isFullscreen = false;
  326.                 btn.textContent = '进入全屏';
  327.             }
  328.         });

  329.         document.addEventListener('keydown', (e) => {
  330.             if (e.key === 'F11') {
  331.                 e.preventDefault();
  332.                 isFullscreen ? document.exitFullscreen() : this.pa.requestFullscreen();
  333.             }
  334.         });
  335.     };

  336.     // 播放器+全屏隐身现身
  337.     displayPlayer() {
  338.         let timerId;
  339.         this.pa.addEventListener('mousemove', () => {
  340.         clearTimeout(timerId);
  341.             this.pa.style.setProperty('--opacity', '1');
  342.             timerId = setTimeout(() => this.pa.style.setProperty('--opacity', '0'), 3000);
  343.         });
  344.     }

  345.       // 获取元素(支持 id/class/元素实体)
  346.       getParentElement() {
  347.           const pa = this.config.pa;
  348.           if (pa instanceof HTMLElement) return pa;
  349.           return document.querySelector(pa) || document.body;
  350.       }

  351.     // 错误处理
  352.       showError(msg) {
  353.           if (this.mlist) {
  354.               this.mlist.dataset.currentsong = msg;
  355.           } else console.log(msg);
  356.       }

  357.     // 时间格式化
  358.     s2m(seconds) {
  359.         const min = Math.floor(seconds / 60).toString().padStart(2, '0');
  360.         const sec = Math.floor(seconds % 60).toString().padStart(2, '0');
  361.         return `${min}:${sec}`;
  362.     }
  363. }
复制代码


评分

参与人数 3威望 +110 金钱 +220 经验 +110 收起 理由
霜染枫丹 + 30 + 60 + 30 匠心独运,细节精致入微!
杨帆 + 30 + 60 + 30 匠心独运,细节精致入微!
红影 + 50 + 100 + 50 匠心独运,细节精致入微!

查看全部评分

  • 打卡等级:Lv9.本地传说
  • 打卡总天数:1859
  • 打卡月天数:2
  • 打卡总奖励:193887
  • 最近打卡:2026-10-22 22:15:16

3265

主题

13万

回帖

28万

积分

管理员

花潮帅哥鼠牛虎兔龙蛇马羊猴鸡狗猪多彩人生星月交辉奔放热烈海样胸怀春风拂面火热情怀优雅迷人神秘浪漫相遇之美鹰傲苍穹花好月圆紫色情节飞龙在天王者至尊大将风范音画大师天籁妙音共看流星风雨同行我心永远幸福快乐喜乐安康侠骨柔肠心想事成开朗大方花潮管理

 楼主| 发表于 2026-6-4 17:50 | 显示全部楼层
2026年6月4日修正版:

一、修复业已发现的 bugs;

二、更改曲目列表翻滚机制(改用 scroll API 替换 scrollIntoView API)。
回复 支持 反对

使用道具 举报

  • 打卡等级:Lv9.本地传说
  • 打卡总天数:1055
  • 打卡月天数:3
  • 打卡总奖励:116426
  • 最近打卡:2026-10-26 13:14:20

1898

主题

33万

回帖

40万

积分

管理员

花潮美女虎龙狗猪多彩人生星月交辉海样胸怀火热情怀优雅迷人神秘浪漫缤纷心情草莓情怀蝴蝶情怀心曲飞扬星星情怀七彩绚丽活泼开朗女儿情怀相遇之美一往情深花好月圆心香一瓣紫色情节飞龙在天金剪刀天籁妙音妙笔生花风雨同行我心永远天长地久幸福快乐绚丽缤纷喜乐安康中秋征文周年庆指尖上的流年舞会之星分析(喊冤)章总结章杀人王小强章最佳杀刺临屏写诗七夕诗钟活动第五届风云第六届风云情人节花潮管理

发表于 2026-6-4 21:46 | 显示全部楼层
越调整越完美。黑黑辛苦了
 
回复 支持 反对

使用道具 举报

  • 打卡等级:Lv8.本地老炮
  • 打卡总天数:586
  • 打卡月天数:1
  • 打卡总奖励:44137
  • 最近打卡:2026-10-23 13:47:12

379

主题

4482

回帖

2万

积分

版主

花潮帅哥鼠牛虎兔龙蛇马羊猴鸡狗猪多彩人生鹰傲苍穹飞龙在天王者至尊大将风范花潮版主

发表于 2026-6-4 22:42 | 显示全部楼层
马黑黑 发表于 2026-6-4 17:50
2026年6月4日修正版:

一、修复业已发现的 bugs;

匠心之作,经典奉献,谢谢分享
★青春是一个人的精神生命,奋斗是一个人最大的体面,学习是一个人最美的姿态。
回复 支持 反对

使用道具 举报

  • 打卡等级:Lv9.本地传说
  • 打卡总天数:1859
  • 打卡月天数:2
  • 打卡总奖励:193887
  • 最近打卡:2026-10-22 22:15:16

3265

主题

13万

回帖

28万

积分

管理员

花潮帅哥鼠牛虎兔龙蛇马羊猴鸡狗猪多彩人生星月交辉奔放热烈海样胸怀春风拂面火热情怀优雅迷人神秘浪漫相遇之美鹰傲苍穹花好月圆紫色情节飞龙在天王者至尊大将风范音画大师天籁妙音共看流星风雨同行我心永远幸福快乐喜乐安康侠骨柔肠心想事成开朗大方花潮管理

 楼主| 发表于 2026-6-4 22:45 | 显示全部楼层
杨帆 发表于 2026-6-4 22:42
匠心之作,经典奉献,谢谢分享

言重了,玩玩而已
回复 支持 反对

使用道具 举报

  • 打卡等级:Lv9.本地传说
  • 打卡总天数:1859
  • 打卡月天数:2
  • 打卡总奖励:193887
  • 最近打卡:2026-10-22 22:15:16

3265

主题

13万

回帖

28万

积分

管理员

花潮帅哥鼠牛虎兔龙蛇马羊猴鸡狗猪多彩人生星月交辉奔放热烈海样胸怀春风拂面火热情怀优雅迷人神秘浪漫相遇之美鹰傲苍穹花好月圆紫色情节飞龙在天王者至尊大将风范音画大师天籁妙音共看流星风雨同行我心永远幸福快乐喜乐安康侠骨柔肠心想事成开朗大方花潮管理

 楼主| 发表于 2026-6-4 22:46 | 显示全部楼层
红影 发表于 2026-6-4 21:46
越调整越完美。黑黑辛苦了

不会有完美。通常都是发现了问题就去解决问题,然后在解决问题的同时又制造了更多的问题
回复 支持 反对

使用道具 举报

  • 打卡等级:Lv8.本地老炮
  • 打卡总天数:586
  • 打卡月天数:1
  • 打卡总奖励:44137
  • 最近打卡:2026-10-23 13:47:12

379

主题

4482

回帖

2万

积分

版主

花潮帅哥鼠牛虎兔龙蛇马羊猴鸡狗猪多彩人生鹰傲苍穹飞龙在天王者至尊大将风范花潮版主

发表于 2026-6-4 22:54 | 显示全部楼层
马黑黑 发表于 2026-6-4 22:46
不会有完美。通常都是发现了问题就去解决问题,然后在解决问题的同时又制造了更多的问题

是啊,问题 + 解决 = 进步,循环 = 创新
★青春是一个人的精神生命,奋斗是一个人最大的体面,学习是一个人最美的姿态。
回复 支持 反对

使用道具 举报

  • 打卡等级:Lv9.本地传说
  • 打卡总天数:1859
  • 打卡月天数:2
  • 打卡总奖励:193887
  • 最近打卡:2026-10-22 22:15:16

3265

主题

13万

回帖

28万

积分

管理员

花潮帅哥鼠牛虎兔龙蛇马羊猴鸡狗猪多彩人生星月交辉奔放热烈海样胸怀春风拂面火热情怀优雅迷人神秘浪漫相遇之美鹰傲苍穹花好月圆紫色情节飞龙在天王者至尊大将风范音画大师天籁妙音共看流星风雨同行我心永远幸福快乐喜乐安康侠骨柔肠心想事成开朗大方花潮管理

 楼主| 发表于 2026-6-4 22:56 | 显示全部楼层
杨帆 发表于 2026-6-4 22:54
是啊,问题 + 解决 = 进步,循环 = 创新

写一个完全没有问题的东东不容易
回复 支持 反对

使用道具 举报

  • 打卡等级:Lv8.本地老炮
  • 打卡总天数:586
  • 打卡月天数:1
  • 打卡总奖励:44137
  • 最近打卡:2026-10-23 13:47:12

379

主题

4482

回帖

2万

积分

版主

花潮帅哥鼠牛虎兔龙蛇马羊猴鸡狗猪多彩人生鹰傲苍穹飞龙在天王者至尊大将风范花潮版主

发表于 2026-6-4 23:02 | 显示全部楼层
马黑黑 发表于 2026-6-4 22:56
写一个完全没有问题的东东不容易

是,太不容易了~不过,其重点不在于完全没问题,而在于发现问题并不断解决问题
★青春是一个人的精神生命,奋斗是一个人最大的体面,学习是一个人最美的姿态。
回复 支持 反对

使用道具 举报

  • 打卡等级:Lv7.热心大叔
  • 打卡总天数:201
  • 打卡月天数:0
  • 打卡总奖励:20426
  • 最近打卡:2026-06-29 00:40:34

350

主题

3685

回帖

2万

积分

版主

花潮美女鼠牛虎兔龙蛇马羊猴鸡狗猪七彩绚丽金剪刀开朗大方花潮版主

发表于 2026-6-4 23:21 | 显示全部楼层
这个看着头晕,说明我看看就可以了
回复 支持 反对

使用道具 举报

  • 打卡等级:Lv9.本地传说
  • 打卡总天数:1859
  • 打卡月天数:2
  • 打卡总奖励:193887
  • 最近打卡:2026-10-22 22:15:16

3265

主题

13万

回帖

28万

积分

管理员

花潮帅哥鼠牛虎兔龙蛇马羊猴鸡狗猪多彩人生星月交辉奔放热烈海样胸怀春风拂面火热情怀优雅迷人神秘浪漫相遇之美鹰傲苍穹花好月圆紫色情节飞龙在天王者至尊大将风范音画大师天籁妙音共看流星风雨同行我心永远幸福快乐喜乐安康侠骨柔肠心想事成开朗大方花潮管理

 楼主| 发表于 2026-6-5 12:22 | 显示全部楼层
霜染枫丹 发表于 2026-6-4 23:21
这个看着头晕,说明我看看就可以了

回复 支持 反对

使用道具 举报

  • 打卡等级:Lv9.本地传说
  • 打卡总天数:1859
  • 打卡月天数:2
  • 打卡总奖励:193887
  • 最近打卡:2026-10-22 22:15:16

3265

主题

13万

回帖

28万

积分

管理员

花潮帅哥鼠牛虎兔龙蛇马羊猴鸡狗猪多彩人生星月交辉奔放热烈海样胸怀春风拂面火热情怀优雅迷人神秘浪漫相遇之美鹰傲苍穹花好月圆紫色情节飞龙在天王者至尊大将风范音画大师天籁妙音共看流星风雨同行我心永远幸福快乐喜乐安康侠骨柔肠心想事成开朗大方花潮管理

 楼主| 发表于 2026-6-5 12:23 | 显示全部楼层
杨帆 发表于 2026-6-4 23:02
是,太不容易了~不过,其重点不在于完全没问题,而在于发现问题并不断解决问题

只能如此吧
回复 支持 反对

使用道具 举报

  • 打卡等级:Lv9.本地传说
  • 打卡总天数:1055
  • 打卡月天数:3
  • 打卡总奖励:116426
  • 最近打卡:2026-10-26 13:14:20

1898

主题

33万

回帖

40万

积分

管理员

花潮美女虎龙狗猪多彩人生星月交辉海样胸怀火热情怀优雅迷人神秘浪漫缤纷心情草莓情怀蝴蝶情怀心曲飞扬星星情怀七彩绚丽活泼开朗女儿情怀相遇之美一往情深花好月圆心香一瓣紫色情节飞龙在天金剪刀天籁妙音妙笔生花风雨同行我心永远天长地久幸福快乐绚丽缤纷喜乐安康中秋征文周年庆指尖上的流年舞会之星分析(喊冤)章总结章杀人王小强章最佳杀刺临屏写诗七夕诗钟活动第五届风云第六届风云情人节花潮管理

发表于 2026-6-6 20:01 | 显示全部楼层
马黑黑 发表于 2026-6-4 22:46
不会有完美。通常都是发现了问题就去解决问题,然后在解决问题的同时又制造了更多的问题

解决问题的通知,发现更多问题,不是制造的问题呢,然后继续解决,不断靠近完美。
就像趋于无限大是一样的道理。
 
回复 支持 反对

使用道具 举报

  • 打卡等级:Lv9.本地传说
  • 打卡总天数:1859
  • 打卡月天数:2
  • 打卡总奖励:193887
  • 最近打卡:2026-10-22 22:15:16

3265

主题

13万

回帖

28万

积分

管理员

花潮帅哥鼠牛虎兔龙蛇马羊猴鸡狗猪多彩人生星月交辉奔放热烈海样胸怀春风拂面火热情怀优雅迷人神秘浪漫相遇之美鹰傲苍穹花好月圆紫色情节飞龙在天王者至尊大将风范音画大师天籁妙音共看流星风雨同行我心永远幸福快乐喜乐安康侠骨柔肠心想事成开朗大方花潮管理

 楼主| 发表于 2026-6-6 20:18 | 显示全部楼层
红影 发表于 2026-6-6 20:01
解决问题的通知,发现更多问题,不是制造的问题呢,然后继续解决,不断靠近完美。
就像趋于无限大是一样 ...

现在我终于能够理解很多维护了很久的项目,突然就放弃了。原因当然是多方面的、综合的,其中之一是越维护越没有底气,因为问题可能会更多
回复 支持 反对

使用道具 举报

  • 打卡等级:Lv9.本地传说
  • 打卡总天数:1055
  • 打卡月天数:3
  • 打卡总奖励:116426
  • 最近打卡:2026-10-26 13:14:20

1898

主题

33万

回帖

40万

积分

管理员

花潮美女虎龙狗猪多彩人生星月交辉海样胸怀火热情怀优雅迷人神秘浪漫缤纷心情草莓情怀蝴蝶情怀心曲飞扬星星情怀七彩绚丽活泼开朗女儿情怀相遇之美一往情深花好月圆心香一瓣紫色情节飞龙在天金剪刀天籁妙音妙笔生花风雨同行我心永远天长地久幸福快乐绚丽缤纷喜乐安康中秋征文周年庆指尖上的流年舞会之星分析(喊冤)章总结章杀人王小强章最佳杀刺临屏写诗七夕诗钟活动第五届风云第六届风云情人节花潮管理

发表于 2026-6-6 21:29 | 显示全部楼层
马黑黑 发表于 2026-6-6 20:18
现在我终于能够理解很多维护了很久的项目,突然就放弃了。原因当然是多方面的、综合的,其中之一是越维护 ...

能够发现那么多问题,本身也是进步,前进本来就是螺旋式的,虽然有更多的问题的,但后来的问题比之前的问题层次更高了。
 
回复 支持 反对

使用道具 举报

  • 打卡等级:Lv9.本地传说
  • 打卡总天数:1859
  • 打卡月天数:2
  • 打卡总奖励:193887
  • 最近打卡:2026-10-22 22:15:16

3265

主题

13万

回帖

28万

积分

管理员

花潮帅哥鼠牛虎兔龙蛇马羊猴鸡狗猪多彩人生星月交辉奔放热烈海样胸怀春风拂面火热情怀优雅迷人神秘浪漫相遇之美鹰傲苍穹花好月圆紫色情节飞龙在天王者至尊大将风范音画大师天籁妙音共看流星风雨同行我心永远幸福快乐喜乐安康侠骨柔肠心想事成开朗大方花潮管理

 楼主| 发表于 2026-6-7 09:15 | 显示全部楼层
红影 发表于 2026-6-6 21:29
能够发现那么多问题,本身也是进步,前进本来就是螺旋式的,虽然有更多的问题的,但后来的问题比之前的问 ...

问题是靠大家发现的
回复 支持 反对

使用道具 举报

  • 打卡等级:Lv9.本地传说
  • 打卡总天数:1055
  • 打卡月天数:3
  • 打卡总奖励:116426
  • 最近打卡:2026-10-26 13:14:20

1898

主题

33万

回帖

40万

积分

管理员

花潮美女虎龙狗猪多彩人生星月交辉海样胸怀火热情怀优雅迷人神秘浪漫缤纷心情草莓情怀蝴蝶情怀心曲飞扬星星情怀七彩绚丽活泼开朗女儿情怀相遇之美一往情深花好月圆心香一瓣紫色情节飞龙在天金剪刀天籁妙音妙笔生花风雨同行我心永远天长地久幸福快乐绚丽缤纷喜乐安康中秋征文周年庆指尖上的流年舞会之星分析(喊冤)章总结章杀人王小强章最佳杀刺临屏写诗七夕诗钟活动第五届风云第六届风云情人节花潮管理

发表于 2026-6-8 13:52 | 显示全部楼层
马黑黑 发表于 2026-6-7 09:15
问题是靠大家发现的

嗯,人多力量大。
 
回复 支持 反对

使用道具 举报

  • 打卡等级:Lv9.本地传说
  • 打卡总天数:1859
  • 打卡月天数:2
  • 打卡总奖励:193887
  • 最近打卡:2026-10-22 22:15:16

3265

主题

13万

回帖

28万

积分

管理员

花潮帅哥鼠牛虎兔龙蛇马羊猴鸡狗猪多彩人生星月交辉奔放热烈海样胸怀春风拂面火热情怀优雅迷人神秘浪漫相遇之美鹰傲苍穹花好月圆紫色情节飞龙在天王者至尊大将风范音画大师天籁妙音共看流星风雨同行我心永远幸福快乐喜乐安康侠骨柔肠心想事成开朗大方花潮管理

 楼主| 发表于 2026-6-8 20:48 | 显示全部楼层
红影 发表于 2026-6-8 13:52
嗯,人多力量大。

所言极是
回复 支持 反对

使用道具 举报

  • 打卡等级:Lv9.本地传说
  • 打卡总天数:1055
  • 打卡月天数:3
  • 打卡总奖励:116426
  • 最近打卡:2026-10-26 13:14:20

1898

主题

33万

回帖

40万

积分

管理员

花潮美女虎龙狗猪多彩人生星月交辉海样胸怀火热情怀优雅迷人神秘浪漫缤纷心情草莓情怀蝴蝶情怀心曲飞扬星星情怀七彩绚丽活泼开朗女儿情怀相遇之美一往情深花好月圆心香一瓣紫色情节飞龙在天金剪刀天籁妙音妙笔生花风雨同行我心永远天长地久幸福快乐绚丽缤纷喜乐安康中秋征文周年庆指尖上的流年舞会之星分析(喊冤)章总结章杀人王小强章最佳杀刺临屏写诗七夕诗钟活动第五届风云第六届风云情人节花潮管理

发表于 2026-6-12 23:30 | 显示全部楼层

那也需要懂的人多点,不懂的多了也没用啊
 
回复 支持 反对

使用道具 举报

  • 打卡等级:Lv9.本地传说
  • 打卡总天数:1859
  • 打卡月天数:2
  • 打卡总奖励:193887
  • 最近打卡:2026-10-22 22:15:16

3265

主题

13万

回帖

28万

积分

管理员

花潮帅哥鼠牛虎兔龙蛇马羊猴鸡狗猪多彩人生星月交辉奔放热烈海样胸怀春风拂面火热情怀优雅迷人神秘浪漫相遇之美鹰傲苍穹花好月圆紫色情节飞龙在天王者至尊大将风范音画大师天籁妙音共看流星风雨同行我心永远幸福快乐喜乐安康侠骨柔肠心想事成开朗大方花潮管理

 楼主| 发表于 2026-6-13 07:59 | 显示全部楼层
红影 发表于 2026-6-12 23:30
那也需要懂的人多点,不懂的多了也没用啊

想懂就会懂,人人都可以做懂王
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关注公众号

相关侵权、举报、投诉及建议等,请发 E-mail:394232409@qq.com

Powered by Discuz! X5.0 © 2001-2026 Discuz! Team.|蜀ICP备17032287号-1

在本版发帖
关注公众号
返回顶部