【原】無腦操作:HTML5 + CSS + JavaScript實現比賽排程

来源:https://www.cnblogs.com/iflytek/archive/2018/08/08/9442084.html
-Advertisement-
Play Games

1、背景:朋友請幫忙做一個比賽排程軟體 2、需求: ① 比賽人數未知,可以通過文本文件讀取參賽人員名稱; ② 對參賽人員隨機分組,一組兩人,兩兩PK,如果是奇數人數,某一個參賽人員成為幸運兒自動晉級; ③ 比賽線下進行,比賽結束後,可以線上選擇每組中晉級人員; ④ 晉級人員進行下一輪比賽分組,依此類 ...


1、背景:朋友請幫忙做一個比賽排程軟體

2、需求:

① 比賽人數未知,可以通過文本文件讀取參賽人員名稱;

② 對參賽人員隨機分組,一組兩人,兩兩PK,如果是奇數人數,某一個參賽人員成為幸運兒自動晉級;

③ 比賽線下進行,比賽結束後,可以線上選擇每組中晉級人員;

④ 晉級人員進行下一輪比賽分組,依此類推,直至最後一輪。

看完了以上的需求,聰明的你會做出什麼樣的分析和設計呢?以下是我的愚見。

3、分析:

① 考慮到該朋友的實際情況和業務需求,這個比賽排程軟體顯然越簡單越傻瓜越好,所以在實現架構上不考慮BS架構,而考慮單頁面呈現+參賽人員名稱文本文檔形式。

② 根據需求,大致繪製如下功能示意圖,顯然這樣設計也是為了實現起來方便

4、實現:看到這裡,聰明的你肯定有更好的實現方式啦!還請不低賜教哦!以下是我的實現寫法

  1 <!DOCTYPE html>
  2 <html lang="en">
  3 
  4 <head>
  5     <meta charset="UTF-8">
  6     <meta name="viewport" content="width=device-width, initial-scale=1.0">
  7     <meta http-equiv="X-UA-Compatible" content="ie=edge">
  8     <title>湯胖專用_比賽排程器</title>
  9     <style>
 10         label {
 11             color: red;
 12         }
 13 
 14         div {
 15             display: inline;
 16             margin: 5px;
 17             padding: 2px;
 18         }
 19 
 20         .initDiv {
 21             background-color: black;
 22             color: white;
 23         }
 24 
 25         .matchDiv {
 26             background-color: orange;
 27             color: black;
 28         }
 29 
 30         .playerDiv {
 31             background-color: pink;
 32             color: black;
 33         }
 34 
 35         .resultDiv {
 36             background-color: green;
 37             color: white;
 38         }
 39 
 40         .resultData {
 41             background-color: blue;
 42             color: white;
 43         }
 44 
 45         .selectDiv {
 46             background-color: #666666;
 47             color: white;
 48         }
 49     </style>
 50 </head>
 51 
 52 <body>
 53     <fieldset>
 54         <legend>湯胖專用_比賽排程器の使用說明</legend>
 55         <ol>
 56             <li>選擇的文件必須是utf-8格式</li>
 57             <li>使用Chrome瀏覽器或360瀏覽器的極速模式</li>
 58             <li>第一輪排程時,選擇要使用的文本文件(參考模板文件)</li>
 59             <li>後續排程時,先點擊刷新頁面,再點擊開始排程,即可使用上輪保存的過關人員</li>
 60         </ol>
 61     </fieldset>
 62     <hr/>
 63     <div>
 64         <input type="file" id="btnFiles" />
 65         <input type="button" id="btnPlan" value="步驟2、開始排程" />
 66         <input type="button" id="btnSave" value="步驟3、保存數據" />
 67         <input type="button" id="btnUpdate" value="步驟4、刷新頁面" />
 68         <hr/>
 69     </div>
 70     <script>
 71         var arr = [];
 72         var resultData = [];
 73 
 74         // 擴展數組功能:實現隨機排序
 75         if (!Array.prototype.shuffle) {
 76             Array.prototype.shuffle = function () {
 77                 for (var j, x, i = this.length; i; j = parseInt(Math.random() * i), x = this[--i], this[i] =
 78                     this[j], this[j] = x);
 79                 return this;
 80             };
 81         }
 82 
 83         // 擴展數組功能:實現刪除指定值元素
 84         if (!Array.prototype.removeByValue) {
 85             Array.prototype.removeByValue = function (val) {
 86                 for (var i = 0; i < this.length; i++) {
 87                     if (this[i] == val) {
 88                         this.splice(i, 1);
 89                         break;
 90                     }
 91                 }
 92             };
 93         }
 94 
 95         // 頁面初始化
 96         window.onload = function () {
 97             var btnFiles = document.getElementById('btnFiles');
 98             var btnPlan = document.getElementById('btnPlan');
 99             var btnSave = document.getElementById('btnSave');
100             var btnUpdate = document.getElementById('btnUpdate');
101 
102             btnFiles.onchange = importFile;
103             btnPlan.onclick = matchPlan;
104             btnSave.onclick = saveData;
105             btnUpdate.onclick = updatePage;
106         };
107 
108         // 以CSS類名獲取元素
109         var getClass = function (classname) {
110             return document.getElementsByClassName(classname);
111         };
112 
113         var importFile = function () {
114             // 獲取讀取的File對象
115             var selectedFile = document.getElementById("btnFiles").files[0];
116             if (selectedFile.name) {
117                 // 讀取選中文件的文件名
118                 var name = selectedFile.name;
119                 // 讀取選中文件的大小
120                 var size = selectedFile.size;
121 
122                 // 讀取操作
123                 var reader = new FileReader();
124                 // 讀取文件的內容
125                 reader.readAsText(selectedFile);
126 
127                 reader.onload = function () {
128                     // 當讀取完成之後會回調這個函數,然後文件內容存儲到result
129                     var temparr = this.result.split(/[\s\n]/);
130                     temparr.forEach(function (v, i) {
131                         if (v != '') {
132                             arr.push(v);
133                         }
134                     });
135 
136                     // 第一輪排程時,文本文件內容存儲在sessionStorage中,後續均使用sessionStorage
137                     sessionStorage.setItem('resultData', arr);
138                 };
139             }
140         };
141 
142         var matchPlan = function () {
143             if (sessionStorage.getItem('resultData')) {
144                 arr = sessionStorage.getItem('resultData').split(',');
145             }
146 
147             var initLabel = document.createElement('label');
148             initLabel.className = 'initLabel';
149             initLabel.innerText = '初始數據:';
150             document.body.appendChild(initLabel);
151 
152             for (var i = 0; i < arr.length; i++) {
153                 var tempdiv = document.createElement('div');
154                 tempdiv.id = 'initDiv' + i;
155                 tempdiv.className = 'initDiv';
156                 tempdiv.innerText = arr[i];
157                 document.body.appendChild(tempdiv);
158             }
159 
160             // 隨機排序
161             arr.shuffle();
162 
163             // 換行
164             document.body.appendChild(document.createElement('br'));
165             document.body.appendChild(document.createElement('br'));
166 
167             // 顯示參賽人員數據
168             var matchLabel = document.createElement('label');
169             matchLabel.innerText = '隨機排序:';
170             document.body.appendChild(matchLabel);
171 
172             for (var i = 0; i < arr.length; i++) {
173                 var tempdiv = document.createElement('div');
174                 tempdiv.id = 'matchDiv' + i;
175                 tempdiv.className = 'matchDiv';
176                 tempdiv.innerText = arr[i];
177                 document.body.appendChild(tempdiv);
178             }
179 
180             document.body.appendChild(document.createElement('hr'));
181 
182             var temp = document.createElement('label');
183             temp.className = 'initLabel';
184             temp.innerText = '比賽分組:';
185             document.body.appendChild(temp);
186 
187             // 換行
188             document.body.appendChild(document.createElement('br'));
189             document.body.appendChild(document.createElement('br'));
190 
191             for (var i = 0; i < arr.length; i++) {
192                 if (i % 2 == 0) {
193                     var groupLabel = document.createElement('label');
194                     groupLabel.innerText = "" + (Math.round(i / 2) + 1) + "組:";
195                     document.body.appendChild(groupLabel);
196 
197                     var player1div = document.createElement('div');
198                     player1div.id = 'playerDiv' + i;
199                     player1div.className = 'playerDiv';
200                     player1div.innerText = arr[i];
201                     document.body.appendChild(player1div);
202                 } else {
203                     var groupLabel = document.createElement('label');
204                     groupLabel.className = 'initLabel';
205                     groupLabel.innerText = " VS ";
206                     document.body.appendChild(groupLabel);
207 
208                     var player2div = document.createElement('div');
209                     player2div.id = 'playerDiv' + i;
210                     player2div.className = 'playerDiv';
211                     player2div.innerText = arr[i];
212                     document.body.appendChild(player2div);
213 
214                     // 換行
215                     document.body.appendChild(document.createElement('br'));
216                     document.body.appendChild(document.createElement('br'));
217                 }
218             }
219 
220             document.body.appendChild(document.createElement('hr
              
您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • "" ) 為什麼想寫這篇文章 工作這些年我所做的事情總是迴圈著,剛工作的時候html、js、jQuery用的也很溜,可是後面的七年都沒寫過前端代碼。現在由於項目原因,時不時的需要去寫點前端代碼,可是前端的世界已經在nodejs的幫助下發生了翻天覆地的變化,一個又一個的框架層出不窮。這篇文章記錄下我這 ...
  • 1、選中要刪除的學生信息 2、點擊 刪除選中 按鈕,把覆選框中的值取出提交到後臺 3、後臺獲取選中的id 4、前端也跟著刪除數據 示例代碼: 前端代碼: 後臺代碼:(只附上刪除的Servlet代碼) ...
  • 最近在項目開發中,有的地方用到了下拉覆選框,於是再網上找了一下,有很多種寫法,但自己感覺不是很好,又不想用插件,因為感覺引入的js太大,功能太繁雜,於是決定自己寫一個小demo,效果如下: (改善:當遇到選項比較多時,可以定義一個數組插入到HTML中,實現下拉的選項,可以參考省市區聯動的寫法:htt ...
  • 這節課講解 打包多頁面應用過程中的 提取公共代碼 部分。相比於 ,`4.0 optimization.splitChunks 3.0 CommonsChunkPlugin`插件。在使用和配置上,更加方便和清晰。 " 本節課源碼" " 所有課程源碼" 1. 準備工作 按照慣例,我們在 文件夾下創建 和 ...
  • 最近在類似於滴滴軟體的一款小程式,工程確實有點大,很多東西都是第一次做。這次記錄一下關於左滑刪除的一個代碼記錄。主要的思想就是計算滑動距離的大小來使用css中的 transition 控制滑動的效果,主流的都是控制邊距margin來達到左滑的效果。 根據我所拿到的ui,我所運用的是使用寬度和radi ...
  • ES6 為對象字面量添加了幾個實用的功能,雖然這幾個新功能基本上都是語法糖,但確實方便。 一、屬性的簡潔表示法 當定義一個對象時,允許直接寫入一個變數,作為對象的屬性,變數名就是屬性名。 例1: 與例2: 是相同的。 二、方法的簡潔表示法 下麵的例子是方法的簡潔表示法(例3) 和下例是完全等同的(例 ...
  • 規則 BFC觸發原理 作用 如果裡面的兩個div為浮動,那麼設置 .layout {overflow: hidden} 2. 防止margin重疊 總結: BFC通俗地說:就是一個容器,裡外不相互影響,記住:清除浮動的時候,如果使用 overflow: hidden,是存在缺點的,如果超過了範圍,那 ...
  • 1.技術棧 1.小程式; 2.使用了有贊提供的UI庫zan ui 3.express+mongoose+nginx; 2.功能介紹 1.假設有一天你在廣東的一間便利店裡面品嘗一瓶可口可樂,這時,你拿出了這個小程式“商品手賬”掃描這瓶可樂的商品條碼,然後寫下一段留言。 2.時間一晃就到了幾年後,這時你 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...