Jelajahi Sumber

添加404页面及相关资源文件

新增了404错误页面,包含样式和脚本文件,并添加了相关的图片和占位文件。同时配置了CNAME文件以支持自定义域名。
SongZihuan 3 bulan lalu
induk
melakukan
36ced6300b
52 mengubah file dengan 286 tambahan dan 162 penghapusan
  1. 1 0
      docs/.__ignore__
  2. 1 0
      docs/404.html
  3. 1 0
      docs/CNAME
  4. 5 0
      docs/CONFIG.json
  5. 1 0
      docs/contributors.html
  6. 13 0
      docs/contributors.json
  7. TEMPAT SAMPAH
      docs/images/logo_big.206cc4d1d74bdc7da7b87bec5c589559.png
  8. TEMPAT SAMPAH
      docs/images/songzihuan.54c9cf7e92f3ca071a4c2509383e7a8d.jpg
  9. 1 0
      docs/index.html
  10. 1 0
      docs/js/common.0dee9d5740aedb18f6be.bundle.js
  11. 10 0
      docs/js/common.0dee9d5740aedb18f6be.bundle.js.LICENSE.txt
  12. 0 0
      docs/js/contributors.0dee9d5740aedb18f6be.bundle.js
  13. 1 0
      docs/js/index.0dee9d5740aedb18f6be.bundle.js
  14. 1 0
      docs/js/leave.0dee9d5740aedb18f6be.bundle.js
  15. 1 0
      docs/js/notfound.0dee9d5740aedb18f6be.bundle.js
  16. 0 0
      docs/js/sponsors.0dee9d5740aedb18f6be.bundle.js
  17. 1 0
      docs/leave.html
  18. 1 0
      docs/sponsors.html
  19. 26 0
      docs/sponsors.json
  20. 4 0
      docs/style/common.0dee9d5740aedb18f6be.bundle.css
  21. 3 0
      docs/style/contributors.0dee9d5740aedb18f6be.bundle.css
  22. 4 0
      docs/style/index.0dee9d5740aedb18f6be.bundle.css
  23. 3 0
      docs/style/leave.0dee9d5740aedb18f6be.bundle.css
  24. 3 0
      docs/style/notfound.0dee9d5740aedb18f6be.bundle.css
  25. 3 0
      docs/style/sponsors.0dee9d5740aedb18f6be.bundle.css
  26. 4 3
      package.json
  27. 4 3
      src/404.js
  28. 1 1
      src/common.js
  29. 7 5
      src/contributors.js
  30. 3 0
      src/html/404.html
  31. 0 2
      src/html/contributors.html
  32. 0 2
      src/html/index.html
  33. 0 2
      src/html/leave.html
  34. 0 2
      src/html/sponsors.html
  35. 5 3
      src/index.js
  36. 51 44
      src/js/beian.js
  37. 27 25
      src/js/contributors.js
  38. 4 6
      src/js/copyright.js
  39. 6 6
      src/js/leave.js
  40. 27 25
      src/js/sponsors.js
  41. 5 3
      src/leave.js
  42. 0 0
      src/main.js
  43. 7 6
      src/sponsors.js
  44. 6 0
      src/style/404.css
  45. 4 0
      src/style/beian.css
  46. 5 1
      src/style/index.css
  47. 4 0
      src/style/leave.css
  48. 3 3
      src/utils.js
  49. 12 13
      src/utils/string.js
  50. 3 3
      webpack_config_dev.js
  51. 11 2
      webpack_config_github.js
  52. 2 2
      webpack_config_prod.js

+ 1 - 0
docs/.__ignore__

@@ -0,0 +1 @@
+Placeholder file, meaningless.

+ 1 - 0
docs/404.html

@@ -0,0 +1 @@
+<!doctype html><html lang="zh"><head><meta charset="UTF-8"><meta name="viewport" content="width=device-width,initial-scale=1"><title>404 Not Found</title><link href="./style/common.0dee9d5740aedb18f6be.bundle.css" rel="stylesheet"><link href="./style/notfound.0dee9d5740aedb18f6be.bundle.css" rel="stylesheet"></head><body><header><h1>404 Not Found</h1></header><main><p>抱歉,您访问的页面不存在。</p><p><a href="/">返回首页</a></p></main><footer><div id="copyright-container"></div></footer><script defer="defer" src="./js/common.0dee9d5740aedb18f6be.bundle.js"></script><script defer="defer" src="./js/notfound.0dee9d5740aedb18f6be.bundle.js"></script></body></html>

+ 1 - 0
docs/CNAME

@@ -0,0 +1 @@
+cas.song-zh.com

+ 5 - 0
docs/CONFIG.json

@@ -0,0 +1,5 @@
+{
+  "ICP": "粤ICP备2022108417号",
+  "WANGAN": "粤公网安备44011402000783号",
+  "注释:": "若您要运行此网站,并公开发布,请根据当地法律进行ICP备案和网安备案。"
+}

+ 1 - 0
docs/contributors.html

@@ -0,0 +1 @@
+<!doctype html><html lang="zh"><head><meta charset="UTF-8"><meta name="viewport" content="width=device-width,initial-scale=1"><title>贡献者列表</title><link href="./style/common.0dee9d5740aedb18f6be.bundle.css" rel="stylesheet"><link href="./style/contributors.0dee9d5740aedb18f6be.bundle.css" rel="stylesheet"></head><body><header><h1>贡献者列表</h1></header><main><table id="contributor-table"><thead><tr><th>Logo</th><th>类型</th><th>名称</th><th>邮箱</th><th>联系电话</th><th>联系网站</th><th>贡献经历</th><th>备注</th></tr></thead><tbody></tbody></table></main><footer><div id="copyright-container"></div></footer><script defer="defer" src="./js/common.0dee9d5740aedb18f6be.bundle.js"></script><script defer="defer" src="./js/contributors.0dee9d5740aedb18f6be.bundle.js"></script></body></html>

+ 13 - 0
docs/contributors.json

@@ -0,0 +1,13 @@
+{
+  "data": [
+    {
+      "type": "个人",
+      "name": "宋子桓",
+      "email": "songzihuan@song-zh.com",
+      "phone": "-",
+      "website": "https://song-zh.com",
+      "info": "开发了多个开源程序",
+      "remark": ""
+    }
+  ]
+}

TEMPAT SAMPAH
docs/images/logo_big.206cc4d1d74bdc7da7b87bec5c589559.png


TEMPAT SAMPAH
docs/images/songzihuan.54c9cf7e92f3ca071a4c2509383e7a8d.jpg


+ 1 - 0
docs/index.html

@@ -0,0 +1 @@
+<!doctype html><html lang="zh"><head><meta charset="UTF-8"><title>宋子桓的项目贡献与赞助主页</title><link href="./style/common.0dee9d5740aedb18f6be.bundle.css" rel="stylesheet"><link href="./style/index.0dee9d5740aedb18f6be.bundle.css" rel="stylesheet"></head><body><header><h1>宋子桓(Song Zihuan)的项目贡献与赞助平台</h1></header><main><p>欢迎来到我的项目贡献者与赞助者记录网站。这里,我衷心感谢所有为我的项目做出贡献的朋友和支持我的赞助者。</p><p>目前,我们的赞助主要通过 <a href="https://afdian.com/a/SongZihuan" target="_blank">爱发电</a> 进行。如果您愿意支持我的工作,非常欢迎您加入赞助行列。</p><p>我的项目通常采用 <a href="https://mit-license.song-zh.com" target="_blank">MIT开源协议</a>,鼓励共享与创新。</p><div class="buttons"><a href="./sponsors.html" class="button" target="_blank">赞助者页面</a> <a href="./contributors.html" class="button" target="_blank">贡献者页面</a></div></main><footer><div id="copyright-container"></div><div id="tcp-container"></div><div id="wangan-container"></div></footer><script defer="defer" src="./js/common.0dee9d5740aedb18f6be.bundle.js"></script><script defer="defer" src="./js/index.0dee9d5740aedb18f6be.bundle.js"></script></body></html>

File diff ditekan karena terlalu besar
+ 1 - 0
docs/js/common.0dee9d5740aedb18f6be.bundle.js


+ 10 - 0
docs/js/common.0dee9d5740aedb18f6be.bundle.js.LICENSE.txt

@@ -0,0 +1,10 @@
+/*!
+ * jQuery JavaScript Library v3.7.1
+ * https://jquery.com/
+ *
+ * Copyright OpenJS Foundation and other contributors
+ * Released under the MIT license
+ * https://jquery.org/license
+ *
+ * Date: 2023-08-28T13:37Z
+ */

File diff ditekan karena terlalu besar
+ 0 - 0
docs/js/contributors.0dee9d5740aedb18f6be.bundle.js


+ 1 - 0
docs/js/index.0dee9d5740aedb18f6be.bundle.js

@@ -0,0 +1 @@
+(()=>{"use strict";const e=`<p>Copyright &copy; ${(new Date).getFullYear()} 宋子桓(Song Zihuan). All rights reserved.</p>`,t=document.getElementById("copyright-container");t&&(t.innerHTML=e),document.addEventListener("DOMContentLoaded",void fetch("/CONFIG.json").then((e=>{if(!e.ok)throw new Error("Network response was not ok");return e.text().then((e=>{const t=JSON.parse(e);if("object"!=typeof t||null===t)throw new Error("Config data error");return t}))})).then((e=>{if(e&&e.ICP){const t=document.getElementById("tcp-container");if(null!==t){const n=document.createElement("p"),o=document.createElement("a");o.href="https://beian.miit.gov.cn/",o.target="_blank",o.textContent=e.ICP,n.appendChild(o),t.appendChild(n)}}if(window.WangAn&&e&&e.WANGAN){const t=document.getElementById("wangan-container");if(null!==t){const n=document.createElement("p"),o=document.createElement("img"),r=document.createElement("a");o.id="WANGAN_LOGO",o.alt="网络安全图标",o.src=window.WangAn,o.style="vertical-align: middle",e.WANGAN_NUM=window.utils.stringTool.extractNumbersFromString(e.WANGAN),r.href=`https://www.beian.gov.cn/portal/registerSystemInfo?recordcode=${e.WANGAN_NUM}`,r.target="_blank",r.textContent=e.WANGAN,n.appendChild(o),n.appendChild(r),t.appendChild(n)}}})).catch((e=>{})))})();

+ 1 - 0
docs/js/leave.0dee9d5740aedb18f6be.bundle.js

@@ -0,0 +1 @@
+(()=>{"use strict";const e=new URLSearchParams(window.location.search).get("toURL");e||window.close(),document.addEventListener("DOMContentLoaded",(function(){document.getElementById("destinationURL").innerText="前往地址: "+e||0}));const n=`<p>Copyright &copy; ${(new Date).getFullYear()} 宋子桓(Song Zihuan). All rights reserved.</p>`,t=document.getElementById("copyright-container");t&&(t.innerHTML=n)})();

+ 1 - 0
docs/js/notfound.0dee9d5740aedb18f6be.bundle.js

@@ -0,0 +1 @@
+(()=>{"use strict";const e=`<p>Copyright &copy; ${(new Date).getFullYear()} 宋子桓(Song Zihuan). All rights reserved.</p>`,t=document.getElementById("copyright-container");t&&(t.innerHTML=e)})();

File diff ditekan karena terlalu besar
+ 0 - 0
docs/js/sponsors.0dee9d5740aedb18f6be.bundle.js


+ 1 - 0
docs/leave.html

@@ -0,0 +1 @@
+<!doctype html><html lang="zh"><head><meta charset="UTF-8"><title>即将前往...</title><link href="./style/common.0dee9d5740aedb18f6be.bundle.css" rel="stylesheet"><link href="./style/leave.0dee9d5740aedb18f6be.bundle.css" rel="stylesheet"></head><body><header><h1>你即将离开本站</h1></header><main><p>你即将离开本站,前往赞助者/贡献者提供的个人或商业网站。本网站不对此些网站做任何担保,请您小心谨慎,谨防上当受骗。</p><p>溃烂和操作相关网页时,请遵守当地法律法规和中国的法律法规,谢谢。</p><p id="destinationURL"></p><div class="buttons"><button class="button" onclick="gotoURL()">确定</button> <button class="button" onclick="closePage()">取消</button></div></main><footer><div id="copyright-container"></div></footer><script defer="defer" src="./js/common.0dee9d5740aedb18f6be.bundle.js"></script><script defer="defer" src="./js/leave.0dee9d5740aedb18f6be.bundle.js"></script></body></html>

+ 1 - 0
docs/sponsors.html

@@ -0,0 +1 @@
+<!doctype html><html lang="zh"><head><meta charset="UTF-8"><meta name="viewport" content="width=device-width,initial-scale=1"><title>赞助者列表</title><link href="./style/common.0dee9d5740aedb18f6be.bundle.css" rel="stylesheet"><link href="./style/sponsors.0dee9d5740aedb18f6be.bundle.css" rel="stylesheet"></head><body><header><h1>赞助者列表</h1></header><main><table id="sponsor-table"><thead><tr><th>Logo</th><th>类型</th><th>名称</th><th>邮箱</th><th>联系电话</th><th>联系网站</th><th>赞助时间</th><th>赞助金额</th><th>累计赞助金额</th><th>备注</th></tr></thead><tbody></tbody></table></main><footer><div id="copyright-container"></div></footer><script defer="defer" src="./js/common.0dee9d5740aedb18f6be.bundle.js"></script><script defer="defer" src="./js/sponsors.0dee9d5740aedb18f6be.bundle.js"></script></body></html>

+ 26 - 0
docs/sponsors.json

@@ -0,0 +1,26 @@
+{
+  "data": [
+    {
+      "type": "个人",
+      "name": "宋子桓",
+      "email": "songzihuan@song-zh.com",
+      "phone": "-",
+      "website": "https://song-zh.com",
+      "sponsorDate": "2025/1/7",
+      "amount": "¥5.00",
+      "totalAmount": "¥10.00",
+      "remark": ""
+    },
+    {
+      "type": "个人",
+      "name": "宋子桓",
+      "email": "songzihuan@song-zh.com",
+      "phone": "-",
+      "website": "https://song-zh.com",
+      "sponsorDate": "2025/1/7",
+      "amount": "¥5.00",
+      "totalAmount": "¥5.00",
+      "remark": ""
+    }
+  ]
+}

+ 4 - 0
docs/style/common.0dee9d5740aedb18f6be.bundle.css

@@ -0,0 +1,4 @@
+/*! normalize.css v8.0.1 | MIT License | github.com/necolas/normalize.css */html{line-height:1.15;-webkit-text-size-adjust:100%}body{margin:0}main{display:block}h1{font-size:2em;margin:.67em 0}hr{box-sizing:content-box;height:0;overflow:visible}pre{font-family:monospace,monospace;font-size:1em}a{background-color:transparent}abbr[title]{border-bottom:none;text-decoration:underline;text-decoration:underline dotted}b,strong{font-weight:bolder}code,kbd,samp{font-family:monospace,monospace;font-size:1em}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sub{bottom:-0.25em}sup{top:-0.5em}img{border-style:none}button,input,optgroup,select,textarea{font-family:inherit;font-size:100%;line-height:1.15;margin:0}button,input{overflow:visible}button,select{text-transform:none}button,[type=button],[type=reset],[type=submit]{-webkit-appearance:button}button::-moz-focus-inner,[type=button]::-moz-focus-inner,[type=reset]::-moz-focus-inner,[type=submit]::-moz-focus-inner{border-style:none;padding:0}button:-moz-focusring,[type=button]:-moz-focusring,[type=reset]:-moz-focusring,[type=submit]:-moz-focusring{outline:1px dotted ButtonText}fieldset{padding:.35em .75em .625em}legend{box-sizing:border-box;color:inherit;display:table;max-width:100%;padding:0;white-space:normal}progress{vertical-align:baseline}textarea{overflow:auto}[type=checkbox],[type=radio]{box-sizing:border-box;padding:0}[type=number]::-webkit-inner-spin-button,[type=number]::-webkit-outer-spin-button{height:auto}[type=search]{-webkit-appearance:textfield;outline-offset:-2px}[type=search]::-webkit-search-decoration{-webkit-appearance:none}::-webkit-file-upload-button{-webkit-appearance:button;font:inherit}details{display:block}summary{display:list-item}template{display:none}[hidden]{display:none}
+body,h1,p{margin:0;padding:0}body{font-family:Arial,sans-serif;line-height:1.6;color:#333;background-color:#f4f4f4}
+a{color:#007bff;text-decoration:none}a:hover{text-decoration:underline}
+.button{display:inline-block;padding:.8rem 1.6rem;font-size:1rem;background-color:#007bff;color:white;border:none;cursor:pointer;text-decoration:none;border-radius:4px;transition:background-color .3s ease}.button:hover{background-color:#0056b3}

+ 3 - 0
docs/style/contributors.0dee9d5740aedb18f6be.bundle.css

@@ -0,0 +1,3 @@
+header{background-color:#333;color:white;text-align:center;padding:1rem}header h1{margin-bottom:0}
+main{width:95%;margin:3rem auto;padding:2rem;background-color:#fff;box-shadow:0 0 10px rgba(0, 0, 0, 0.1)}table{width:100%;border-collapse:collapse}th,td{border:1px solid #ccc;padding:8px;text-align:left}th{background-color:#f2f2f2;font-weight:bold}tr td{text-align:center}img.logo{max-width:80px;max-height:80px;width:auto;height:auto}
+footer{background-color:#333;color:white;width:100%;text-align:center;padding-top:1rem;padding-bottom:1rem;position:absolute;bottom:0}

+ 4 - 0
docs/style/index.0dee9d5740aedb18f6be.bundle.css

@@ -0,0 +1,4 @@
+header{background-color:#333;color:white;text-align:center;padding:1rem}header h1{margin-bottom:0}
+main{max-width:800px;margin:3rem auto;padding:2rem;background-color:#fff;box-shadow:0 0 10px rgba(0, 0, 0, 0.1)}p{margin-bottom:1rem}footer p{margin-bottom:0}
+footer{background-color:#333;color:white;width:100%;text-align:center;padding-top:1rem;padding-bottom:1rem;position:absolute;bottom:0}
+#WANGAN_LOGO{max-width:20px;max-height:20px}

+ 3 - 0
docs/style/leave.0dee9d5740aedb18f6be.bundle.css

@@ -0,0 +1,3 @@
+header{background-color:#333;color:white;text-align:center;padding:1rem}header h1{margin-bottom:0}
+main{max-width:800px;margin:3rem auto;padding:2rem;background-color:#fff;box-shadow:0 0 10px rgba(0, 0, 0, 0.1)}p{margin-bottom:1rem}footer p{margin-bottom:0}
+footer{background-color:#333;color:white;width:100%;text-align:center;padding-top:1rem;padding-bottom:1rem;position:absolute;bottom:0}

+ 3 - 0
docs/style/notfound.0dee9d5740aedb18f6be.bundle.css

@@ -0,0 +1,3 @@
+header{background-color:#333;color:white;text-align:center;padding:1rem}header h1{margin-bottom:0}
+main{max-width:800px;margin:3rem auto;padding:2rem;background-color:#fff;box-shadow:0 0 10px rgba(0, 0, 0, 0.1);text-align:center}p{font-size:1.5em;color:#666;margin-bottom:1rem}footer p{font-size:1rem;color:white;margin-bottom:0}
+footer{background-color:#333;color:white;width:100%;text-align:center;padding-top:1rem;padding-bottom:1rem;position:absolute;bottom:0}

+ 3 - 0
docs/style/sponsors.0dee9d5740aedb18f6be.bundle.css

@@ -0,0 +1,3 @@
+header{background-color:#333;color:white;text-align:center;padding:1rem}header h1{margin-bottom:0}
+main{width:95%;margin:3rem auto;padding:2rem;background-color:#fff;box-shadow:0 0 10px rgba(0, 0, 0, 0.1)}table{width:100%;border-collapse:collapse}th,td{border:1px solid #ccc;padding:8px;text-align:left}th{background-color:#f2f2f2;font-weight:bold}tr td{text-align:center}img.logo{max-width:80px;max-height:80px;width:auto;height:auto}
+footer{background-color:#333;color:white;width:100%;text-align:center;padding-top:1rem;padding-bottom:1rem;position:absolute;bottom:0}

+ 4 - 3
package.json

@@ -4,8 +4,8 @@
   "description": "宋子桓项目的支持者和贡献者项目名单",
   "repository": "https://github.com/SongZihuan/contributions-and-sponsorships",
   "bug": "https://github.com/SongZihuan/contributions-and-sponsorships/issues",
-  "homepage": "https://github.com/SongZihuan/contributions-and-sponsorships",
-  "module": "./src/index.js",
+  "homepage": "https://cas.song-zh.com",
+  "module": "./src/main.js",
   "type": "module",
   "private": true,
   "engines": {
@@ -23,7 +23,8 @@
     "build:prod": "npx webpack --config webpack_config_prod.js",
     "build:prod:run": "npx pnpm build:prod && npx pnpm prod",
     "github": "npx webpack server --config webpack_config_github.js",
-    "build:github": "npx webpack --config webpack_config_github.js && node github-page/cname.js"
+    "build:github": "npx webpack --config webpack_config_github.js",
+    "build:github:run": "npx pnpm build:github && npx pnpm github"
   },
   "devDependencies": {
     "@babel/core": "^7.26.0",

+ 4 - 3
src/404.js

@@ -1,3 +1,4 @@
-import "./style/header.css"
-import "./style/404.css"
-import "./style/footer.css"
+import './style/header.css'
+import './style/404.css'
+import './style/footer.css'
+import './js/copyright.js'

+ 1 - 1
src/common.js

@@ -1,6 +1,6 @@
 // 清理状态
 import 'normalize.css'
-import "./style/body.css"
+import './style/body.css'
 import './style/a.css'
 import './style/button.css'
 import './utils.js'

+ 7 - 5
src/contributors.js

@@ -1,7 +1,9 @@
-import "./style/header.css"
-import "./style/contributors.css"
-import "./style/footer.css"
+import './style/header.css'
+import './style/contributors.css'
+import './style/footer.css'
+import './js/contributors.js'
+import './js/copyright.js'
 
-import defaultLogo from "./assets/image/touxiang_contributors.png"
+import defaultLogo from './assets/image/touxiang_contributors.png'
 
-window.defaultLogo = defaultLogo
+window.defaultLogo = defaultLogo

+ 3 - 0
src/html/404.html

@@ -13,5 +13,8 @@
     <p>抱歉,您访问的页面不存在。</p>
     <p><a href="/">返回首页</a></p>
 </main>
+<footer>
+    <div id="copyright-container"></div>
+</footer>
 </body>
 </html>

+ 0 - 2
src/html/contributors.html

@@ -32,7 +32,5 @@
 <footer>
     <div id="copyright-container"></div>
 </footer>
-<script src="../js/copyright.js"></script>
-<script src="../js/contributors.js"></script>
 </body>
 </html>

+ 0 - 2
src/html/index.html

@@ -23,7 +23,5 @@
     <div id="tcp-container"></div>
     <div id="wangan-container"></div>
 </footer>
-<script src="../js/copyright.js"></script>
-<script src="../js/beian.js"></script>
 </body>
 </html>

+ 0 - 2
src/html/leave.html

@@ -3,7 +3,6 @@
 <head>
   <meta charset="UTF-8">
   <title>即将前往...</title>
-  <script src="../js/leave.js"></script>
 </head>
 <body>
 <header>
@@ -22,6 +21,5 @@
 <footer>
   <div id="copyright-container"></div>
 </footer>
-<script src="../js/copyright.js"></script>
 </body>
 </html>

+ 0 - 2
src/html/sponsors.html

@@ -34,7 +34,5 @@
 <footer>
     <div id="copyright-container"></div>
 </footer>
-<script src="../js/copyright.js"></script>
-<script src="../js/sponsors.js"></script>
 </body>
 </html>

+ 5 - 3
src/index.js

@@ -1,3 +1,5 @@
-import "./style/header.css"
-import "./style/index.css"
-import "./style/footer.css"
+import './style/header.css'
+import './style/index.css'
+import './style/footer.css'
+import './js/copyright.js'
+import './js/beian.js'

+ 51 - 44
src/js/beian.js

@@ -1,54 +1,61 @@
-fetch("/CONFIG.json")
-    .then(response => {
-        if (!response.ok) {
-            throw new Error('Network response was not ok');
-        }
+import '../style/beian.css'
+
+function beian() {
+  fetch('/CONFIG.json')
+    .then((response) => {
+      if (!response.ok) {
+        throw new Error('Network response was not ok')
+      }
 
-        return response.text().then(text => {
-            const data = JSON.parse(text);
-            if (typeof data !== "object" || data === null) {
-                throw new Error('Config data error');
-            }
-            return data
-        })
+      return response.text().then((text) => {
+        const data = JSON.parse(text)
+        if (typeof data !== 'object' || data === null) {
+          throw new Error('Config data error')
+        }
+        return data
+      })
     })
-    .then(CONFIG => {
-        if (CONFIG && CONFIG.ICP) {
-            const container = document.getElementById('tcp-container');
-            if (container !== null) {
-                const p = document.createElement('p');
-                const a = document.createElement('a');
-                a.href = "https://beian.miit.gov.cn/";
-                a.target = "_blank"
-                a.textContent = CONFIG.ICP;
-                p.appendChild(a);
-                container.appendChild(p);
-            }
+    .then((CONFIG) => {
+      if (CONFIG && CONFIG.ICP) {
+        const container = document.getElementById('tcp-container')
+        if (container !== null) {
+          const p = document.createElement('p')
+          const a = document.createElement('a')
+          a.href = 'https://beian.miit.gov.cn/'
+          a.target = '_blank'
+          a.textContent = CONFIG.ICP
+          p.appendChild(a)
+          container.appendChild(p)
         }
+      }
 
-        if (window.WangAn && CONFIG && CONFIG.WANGAN) {
-            const container = document.getElementById('wangan-container');
-            if (container !== null) {
-                const p = document.createElement('p');
-                const img = document.createElement('img');
-                const a = document.createElement('a');
+      if (window.WangAn && CONFIG && CONFIG.WANGAN) {
+        const container = document.getElementById('wangan-container')
+        if (container !== null) {
+          const p = document.createElement('p')
+          const img = document.createElement('img')
+          const a = document.createElement('a')
 
-                img.alt = "网络安全图标"
-                img.src = window.WangAn;
-                img.style = "vertical-align: middle"
+          img.id = 'WANGAN_LOGO'
+          img.alt = '网络安全图标'
+          img.src = window.WangAn
+          img.style = 'vertical-align: middle'
 
-                CONFIG.WANGAN_NUM = window.utils.stringTool.extractNumbersFromString(CONFIG.WANGAN)
+          CONFIG.WANGAN_NUM = window.utils.stringTool.extractNumbersFromString(CONFIG.WANGAN)
 
-                a.href = `https://www.beian.gov.cn/portal/registerSystemInfo?recordcode=${CONFIG.WANGAN_NUM}`;
-                a.target = "_blank";
-                a.textContent = CONFIG.WANGAN;
+          a.href = `https://www.beian.gov.cn/portal/registerSystemInfo?recordcode=${CONFIG.WANGAN_NUM}`
+          a.target = '_blank'
+          a.textContent = CONFIG.WANGAN
 
-                p.appendChild(img)
-                p.appendChild(a);
-                container.appendChild(p);
-            }
+          p.appendChild(img)
+          p.appendChild(a)
+          container.appendChild(p)
         }
+      }
     })
-    .catch(error => {
-        console.error('There has been a problem with your fetch operation:', error);
-    });
+    .catch((error) => {
+      console.error('There has been a problem with your fetch operation:', error)
+    })
+}
+
+document.addEventListener('DOMContentLoaded', beian())

+ 27 - 25
src/js/contributors.js

@@ -1,37 +1,39 @@
 async function fetchContributors() {
-    try {
-        const response = await fetch('/contributors.json');
-        if (!response.ok) {
-            throw new Error('网络错误');
-        }
-        const contributorsData = await response.json();
-        populateTable(contributorsData);
-    } catch (error) {
-        console.error('获取贡献者数据时出错:', error);
+  try {
+    const response = await fetch('/contributors.json')
+    if (!response.ok) {
+      throw new Error('网络错误')
     }
+    const contributorsData = await response.json()
+    populateTable(contributorsData)
+  } catch (error) {
+    console.error('获取贡献者数据时出错:', error)
+  }
 }
 
 function populateTable(contributors) {
-    const tableBody = document.querySelector('#contributor-table tbody');
-    contributors.data.forEach(contributor => {
-        const row = document.createElement('tr');
-        let website = contributor.website
-        if (website !== "" || website !== "#") {
-            website = "/leave.html?toURL=" + encodeURIComponent(contributor.website)
-        }
+  const tableBody = document.querySelector('#contributor-table tbody')
+  if (tableBody) {
+    contributors.data.forEach((contributor) => {
+      const row = document.createElement('tr')
+      let website = contributor.website
+      if (website !== '' || website !== '#') {
+        website = '/leave.html?toURL=' + encodeURIComponent(contributor.website)
+      }
 
-        row.innerHTML = `
+      row.innerHTML = `
                 <td><img class="logo" src="${contributor.logo || window.defaultLogo}" alt="Logo"></td>
-                <td>${contributor.type || "匿名"}</td>
-                <td>${contributor.name || "匿名"}</td>
-                <td>${contributor.email || "-"}</td>
-                <td>${contributor.phone || "-"}</td>
+                <td>${contributor.type || '匿名'}</td>
+                <td>${contributor.name || '匿名'}</td>
+                <td>${contributor.email || '-'}</td>
+                <td>${contributor.phone || '-'}</td>
                 <td><a href="${website}" target="_blank">访问网站</a></td>
                 <td>${contributor.info}</td>
-                <td>${contributor.remark}</td>`;
-        tableBody.appendChild(row);
-    });
+                <td>${contributor.remark}</td>`
+      tableBody.appendChild(row)
+    })
+  }
 }
 
 // 页面加载完成后执行
-document.addEventListener('DOMContentLoaded', fetchContributors);
+document.addEventListener('DOMContentLoaded', fetchContributors)

+ 4 - 6
src/js/copyright.js

@@ -1,10 +1,8 @@
-const currentYear = new Date().getFullYear();
-const copyrightTemplate = `<p>&copy; ${currentYear} 宋子桓(Song Zihuan). All rights reserved.</p>`;
+const currentYear = new Date().getFullYear()
+const copyrightTemplate = `<p>Copyright &copy; ${currentYear} 宋子桓(Song Zihuan). All rights reserved.</p>`
 
-const containerElement = document.getElementById('copyright-container');
+const containerElement = document.getElementById('copyright-container')
 // 将生成的版权信息插入到页面指定位置
 if (containerElement) {
-    containerElement.innerHTML = copyrightTemplate;
+  containerElement.innerHTML = copyrightTemplate
 }
-
-console.log("containerElement", containerElement)

+ 6 - 6
src/js/leave.js

@@ -1,20 +1,20 @@
-const urlParams = new URLSearchParams(window.location.search);
-const toURL = urlParams.get("toURL");
+const urlParams = new URLSearchParams(window.location.search)
+const toURL = urlParams.get('toURL')
 
 if (!toURL) {
-    window.close()
+  window.close()
 }
 
 function gotoURL() {
-    window.location.href = toURL;
+  window.location.href = toURL
 }
 
 function closePage() {
-    window.close();
+  window.close()
 }
 
 function setUrl() {
-    document.getElementById("destinationURL").innerText = "前往地址: " + toURL || '未知';
+  document.getElementById('destinationURL').innerText = '前往地址: ' + toURL || '未知'
 }
 
 document.addEventListener('DOMContentLoaded', setUrl)

+ 27 - 25
src/js/sponsors.js

@@ -1,39 +1,41 @@
 async function fetchSponsors() {
-    try {
-        const response = await fetch('/sponsors.json');
-        if (!response.ok) {
-            throw new Error('网络错误');
-        }
-        const sponsorsData = await response.json();
-        populateTable(sponsorsData);
-    } catch (error) {
-        console.error('获取赞助者数据时出错:', error);
+  try {
+    const response = await fetch('/sponsors.json')
+    if (!response.ok) {
+      throw new Error('网络错误')
     }
+    const sponsorsData = await response.json()
+    populateTable(sponsorsData)
+  } catch (error) {
+    console.error('获取赞助者数据时出错:', error)
+  }
 }
 
 function populateTable(sponsors) {
-    const tableBody = document.querySelector('#sponsor-table tbody');
-    sponsors.data.forEach(sponsor => {
-        const row = document.createElement('tr');
-        let website = sponsor.website
-        if (website !== "" || website !== "#") {
-            website = "/leave.html?toURL=" + encodeURIComponent(sponsor.website)
-        }
+  const tableBody = document.querySelector('#sponsor-table tbody')
+  if (tableBody) {
+    sponsors.data.forEach((sponsor) => {
+      const row = document.createElement('tr')
+      let website = sponsor.website
+      if (website !== '' || website !== '#') {
+        website = '/leave.html?toURL=' + encodeURIComponent(sponsor.website)
+      }
 
-        row.innerHTML = `
+      row.innerHTML = `
                 <td><img class="logo" src="${sponsor.logo || window.defaultLogo}" alt="Logo"></td>
-                <td>${sponsor.type || "匿名"}</td>
-                <td>${sponsor.name || "匿名"}</td>
-                <td>${sponsor.email || "-"}</td>
-                <td>${sponsor.phone || "-"}</td>
+                <td>${sponsor.type || '匿名'}</td>
+                <td>${sponsor.name || '匿名'}</td>
+                <td>${sponsor.email || '-'}</td>
+                <td>${sponsor.phone || '-'}</td>
                 <td><a href="${website}" target="_blank">访问网站</a></td>
                 <td>${sponsor.sponsorDate}</td>
                 <td>¥${sponsor.amount}</td>
                 <td>¥${sponsor.totalAmount}</td>
-                <td>${sponsor.remark}</td>`;
-        tableBody.appendChild(row);
-    });
+                <td>${sponsor.remark}</td>`
+      tableBody.appendChild(row)
+    })
+  }
 }
 
 // 页面加载完成后执行
-document.addEventListener('DOMContentLoaded', fetchSponsors);
+document.addEventListener('DOMContentLoaded', fetchSponsors)

+ 5 - 3
src/leave.js

@@ -1,3 +1,5 @@
-import "./style/header.css"
-import "./style/leave.css"
-import "./style/footer.css"
+import './style/header.css'
+import './style/leave.css'
+import './style/footer.css'
+import './js/leave.js'
+import './js/copyright.js'

+ 0 - 0
src/main.js


+ 7 - 6
src/sponsors.js

@@ -1,7 +1,8 @@
-import "./style/header.css"
-import "./style/sponsors.css"
-import "./style/footer.css"
+import './style/header.css'
+import './style/sponsors.css'
+import './style/footer.css'
+import './js/sponsors.js'
+import './js/copyright.js'
+import defaultLogo from './assets/image/touxiang_sponsors.png'
 
-import defaultLogo from "./assets/image/touxiang_sponsors.png"
-
-window.defaultLogo = defaultLogo
+window.defaultLogo = defaultLogo

+ 6 - 0
src/style/404.css

@@ -12,4 +12,10 @@ p {
     font-size: 1.5em;
     color: #666;
     margin-bottom: 1rem;
+}
+
+footer p {
+    font-size: 1rem;
+    color: white;
+    margin-bottom: 0;
 }

+ 4 - 0
src/style/beian.css

@@ -0,0 +1,4 @@
+#WANGAN_LOGO {
+    max-width: 20px;
+    max-height: 20px;
+}

+ 5 - 1
src/style/index.css

@@ -9,4 +9,8 @@ main {
 
 p {
     margin-bottom: 1rem;
-}
+}
+
+footer p {
+    margin-bottom: 0;
+}

+ 4 - 0
src/style/leave.css

@@ -9,4 +9,8 @@ main {
 
 p {
     margin-bottom: 1rem;
+}
+
+footer p {
+    margin-bottom: 0;
 }

+ 3 - 3
src/utils.js

@@ -1,8 +1,8 @@
-import stringTool from "./utils/string.js"
+import stringTool from './utils/string.js'
 
 const utils = {
-    stringTool,
+  stringTool
 }
 
 window.utils = utils
-export default utils
+export default utils

+ 12 - 13
src/utils/string.js

@@ -1,19 +1,18 @@
 export function extractNumbersFromString(str) {
-    // 正则表达式匹配非数字字符后紧跟数字,然后是更多非数字字符
-    const regex = /[^0-9]+(\d+)[^0-9]+/g
-    let matches = ""
-    let match = null
+  // 正则表达式匹配非数字字符后紧跟数字,然后是更多非数字字符
+  const regex = /[^0-9]+(\d+)[^0-9]+/g
+  let matches = ''
+  let match = null
 
-    // 使用正则表达式的全局搜索来查找所有匹配项
-    while ((match = regex.exec(str)) !== null) {
-        // 提取数字部分并添加到结果数组
-        matches += match[1].toString()
-    }
-    return matches
+  // 使用正则表达式的全局搜索来查找所有匹配项
+  while ((match = regex.exec(str)) !== null) {
+    // 提取数字部分并添加到结果数组
+    matches += match[1].toString()
+  }
+  return matches
 }
 
-
 const stringTool = {
-    extractNumbersFromString
+  extractNumbersFromString
 }
-export default stringTool
+export default stringTool

+ 3 - 3
webpack_config_dev.js

@@ -26,8 +26,8 @@ const config = {
     index: path.resolve(__dirname, 'src/index.js'),
     leave: path.resolve(__dirname, 'src/leave.js'),
     sponsors: path.resolve(__dirname, 'src/sponsors.js'),
-    contributors: path.resolve(__dirname, "src/contributors.js"),
-    notfound: path.resolve(__dirname, "src/404.js"),
+    contributors: path.resolve(__dirname, 'src/contributors.js'),
+    notfound: path.resolve(__dirname, 'src/404.js')
   },
 
   output: {
@@ -111,7 +111,7 @@ const config = {
     new CopyWebpackPlugin({
       patterns: [
         { from: 'public', to: './' },
-        { from: './config.json', to: './CONFIG.json' },
+        { from: './config.json', to: './CONFIG.json' }
       ]
     }),
     new HtmlWebpackPlugin({

+ 11 - 2
webpack_config_github.js

@@ -40,7 +40,8 @@ const config = {
     index: path.resolve(__dirname, 'src/index.js'),
     leave: path.resolve(__dirname, 'src/leave.js'),
     sponsors: path.resolve(__dirname, 'src/sponsors.js'),
-    contributors: path.resolve(__dirname, "src/contributors.js")
+    contributors: path.resolve(__dirname, 'src/contributors.js'),
+    notfound: path.resolve(__dirname, 'src/404.js')
   },
 
   output: {
@@ -138,7 +139,7 @@ const config = {
     new CopyWebpackPlugin({
       patterns: [
         { from: 'public', to: './' },
-        { from: './config.json', to: './CONFIG.json' },
+        { from: './config.json', to: './CONFIG.json' }
       ]
     }),
     new HtmlWebpackPlugin({
@@ -173,6 +174,14 @@ const config = {
       minify: html_minify,
       publicPath: './'
     }),
+    new HtmlWebpackPlugin({
+      inject: 'body',
+      template: path.resolve(__dirname, 'src/html/404.html'), //指定模板文件
+      filename: '404.html',
+      chunks: ['common', 'notfound'],
+      minify: html_minify,
+      publicPath: './'
+    }),
     new MiniCssExtractPlugin({
       filename: 'style/[name].[fullhash].bundle.css',
       chunkFilename: 'css/[id].bundle.css'

+ 2 - 2
webpack_config_prod.js

@@ -39,7 +39,7 @@ const config = {
     index: path.resolve(__dirname, 'src/index.js'),
     leave: path.resolve(__dirname, 'src/leave.js'),
     sponsors: path.resolve(__dirname, 'src/sponsors.js'),
-    contributors: path.resolve(__dirname, "src/contributors.js")
+    contributors: path.resolve(__dirname, 'src/contributors.js')
   },
 
   output: {
@@ -123,7 +123,7 @@ const config = {
     new CopyWebpackPlugin({
       patterns: [
         { from: 'public', to: './' },
-        { from: './config.json', to: './CONFIG.json' },
+        { from: './config.json', to: './CONFIG.json' }
       ]
     }),
     new HtmlWebpackPlugin({

Beberapa file tidak ditampilkan karena terlalu banyak file yang berubah dalam diff ini