Browse Source

更新赞助者和贡献者页面

更新了赞助者和贡献者相关页面的文字和功能,新增了404错误页面,并调整了部分文件的导入顺序。
SongZihuan 3 tháng trước cách đây
mục cha
commit
bbf92ba2f6

+ 13 - 0
public/contributors.json

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

+ 3 - 0
src/404.js

@@ -0,0 +1,3 @@
+import "./style/header.css"
+import "./style/404.css"
+import "./style/footer.css"

BIN
src/assets/image/touxiang.png


BIN
src/assets/image/touxiang_contributors.png


BIN
src/assets/image/touxiang_sponsors.png


+ 7 - 0
src/contributors.js

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

+ 17 - 0
src/html/404.html

@@ -0,0 +1,17 @@
+<!DOCTYPE html>
+<html lang="zh">
+<head>
+    <meta charset="UTF-8">
+    <meta name="viewport" content="width=device-width, initial-scale=1.0">
+    <title>404 Not Found</title>
+</head>
+<body>
+<header>
+    <h1>404 Not Found</h1>
+</header>
+<main>
+    <p>抱歉,您访问的页面不存在。</p>
+    <p><a href="/">返回首页</a></p>
+</main>
+</body>
+</html>

+ 9 - 7
src/html/contributors.html

@@ -3,16 +3,16 @@
 <head>
     <meta charset="UTF-8">
     <meta name="viewport" content="width=device-width, initial-scale=1.0">
-    <title>赞助商列表</title>
+    <title>贡献者列表</title>
 </head>
 <body>
 
 <header>
-    <h1>赞助商列表</h1>
+    <h1>贡献者列表</h1>
 </header>
 
 <main>
-    <table id="sponsor-table">
+    <table id="contributor-table">
         <thead>
         <tr>
             <th>Logo</th>
@@ -21,9 +21,7 @@
             <th>邮箱</th>
             <th>联系电话</th>
             <th>联系网站</th>
-            <th>赞助时间</th>
-            <th>赞助金额</th>
-            <th>累计赞助金额</th>
+            <th>贡献经历</th>
             <th>备注</th>
         </tr>
         </thead>
@@ -31,6 +29,10 @@
         </tbody>
     </table>
 </main>
-<script src="../js/sponsors.js"></script>
+<footer>
+    <div id="copyright-container"></div>
+</footer>
+<script src="../js/copyright.js"></script>
+<script src="../js/contributors.js"></script>
 </body>
 </html>

+ 2 - 2
src/html/index.html

@@ -9,12 +9,12 @@
     <h1>宋子桓(Song Zihuan)的项目贡献与赞助平台</h1>
 </header>
 <main>
-    <p>欢迎来到我的项目贡献者与赞助记录网站。这里,我衷心感谢所有为我的项目做出贡献的朋友和支持我的赞助。</p>
+    <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="./sponsors.html" class="button" target="_blank">赞助页面</a>
         <a href="./contributors.html" class="button" target="_blank">贡献者页面</a>
     </div>
 </main>

+ 5 - 4
src/html/leave.html

@@ -10,7 +10,7 @@
   <h1> 你即将离开本站 </h1>
 </header>
 <main>
-  <p>你即将离开本站,前往赞助/贡献者提供的个人或商业网站。本网站不对此些网站做任何担保,请您小心谨慎,谨防上当受骗。</p>
+  <p>你即将离开本站,前往赞助/贡献者提供的个人或商业网站。本网站不对此些网站做任何担保,请您小心谨慎,谨防上当受骗。</p>
   <p>溃烂和操作相关网页时,请遵守当地法律法规和中国的法律法规,谢谢。</p>
   <p id="destinationURL"></p>
   <div class="buttons">
@@ -19,8 +19,9 @@
   </div>
 </main>
 
-<script>
-  document.getElementById("destinationURL").innerText = "目标URL: " + (new URLSearchParams(window.location.search).get('toURL') || '未提供');
-</script>
+<footer>
+  <div id="copyright-container"></div>
+</footer>
+<script src="../js/copyright.js"></script>
 </body>
 </html>

+ 6 - 2
src/html/sponsors.html

@@ -3,12 +3,12 @@
 <head>
     <meta charset="UTF-8">
     <meta name="viewport" content="width=device-width, initial-scale=1.0">
-    <title>赞助列表</title>
+    <title>赞助列表</title>
 </head>
 <body>
 
 <header>
-    <h1>赞助列表</h1>
+    <h1>赞助列表</h1>
 </header>
 
 <main>
@@ -31,6 +31,10 @@
         </tbody>
     </table>
 </main>
+<footer>
+    <div id="copyright-container"></div>
+</footer>
+<script src="../js/copyright.js"></script>
 <script src="../js/sponsors.js"></script>
 </body>
 </html>

+ 2 - 1
src/index.js

@@ -1,2 +1,3 @@
 import "./style/header.css"
-import "./style/index.css"
+import "./style/index.css"
+import "./style/footer.css"

+ 37 - 0
src/js/contributors.js

@@ -0,0 +1,37 @@
+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);
+    }
+}
+
+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)
+        }
+
+        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><a href="${website}" target="_blank">访问网站</a></td>
+                <td>${contributor.info}</td>
+                <td>${contributor.remark}</td>`;
+        tableBody.appendChild(row);
+    });
+}
+
+// 页面加载完成后执行
+document.addEventListener('DOMContentLoaded', fetchContributors);

+ 6 - 0
src/js/leave.js

@@ -12,3 +12,9 @@ function gotoURL() {
 function closePage() {
     window.close();
 }
+
+function setUrl() {
+    document.getElementById("destinationURL").innerText = "前往地址: " + toURL || '未知';
+}
+
+document.addEventListener('DOMContentLoaded', setUrl)

+ 1 - 1
src/js/sponsors.js

@@ -7,7 +7,7 @@ async function fetchSponsors() {
         const sponsorsData = await response.json();
         populateTable(sponsorsData);
     } catch (error) {
-        console.error('获取赞助数据时出错:', error);
+        console.error('获取赞助数据时出错:', error);
     }
 }
 

+ 2 - 1
src/leave.js

@@ -1,2 +1,3 @@
 import "./style/header.css"
-import "./style/leave.css"
+import "./style/leave.css"
+import "./style/footer.css"

+ 3 - 1
src/sponsors.js

@@ -1,5 +1,7 @@
 import "./style/header.css"
 import "./style/sponsors.css"
-import defaultLogo from "./assets/image/touxiang.png"
+import "./style/footer.css"
+
+import defaultLogo from "./assets/image/touxiang_sponsors.png"
 
 window.defaultLogo = defaultLogo

+ 15 - 0
src/style/404.css

@@ -0,0 +1,15 @@
+/* Main content styles */
+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;
+}

+ 35 - 0
src/style/contributors.css

@@ -0,0 +1,35 @@
+/* Main content styles */
+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;
+}

+ 11 - 0
src/style/footer.css

@@ -0,0 +1,11 @@
+/*Footer styles */
+footer {
+    background-color: #333;
+    color: white;
+    width: 100%;
+    text-align: center;
+    padding-top: 1rem;
+    padding-bottom: 1rem;
+    position: absolute;
+    bottom: 0;
+}

+ 1 - 13
src/style/index.css

@@ -9,16 +9,4 @@ main {
 
 p {
     margin-bottom: 1rem;
-}
-
-/*Footer styles */
-footer {
-    background-color: #333;
-    color: white;
-    width: 100%;
-    text-align: center;
-    padding-top: 1rem;
-    padding-bottom: 1rem;
-    position: absolute;
-    bottom: 0;
-}
+}

+ 16 - 0
webpack_config_dev.js

@@ -26,6 +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"),
   },
 
   output: {
@@ -133,6 +135,20 @@ const config = {
       chunks: ['common', 'sponsors'],
       publicPath: './'
     }),
+    new HtmlWebpackPlugin({
+      inject: 'body',
+      template: path.resolve(__dirname, 'src/html/contributors.html'), //指定模板文件
+      filename: 'contributors.html',
+      chunks: ['common', 'contributors'],
+      publicPath: './'
+    }),
+    new HtmlWebpackPlugin({
+      inject: 'body',
+      template: path.resolve(__dirname, 'src/html/404.html'), //指定模板文件
+      filename: '404.html',
+      chunks: ['common', 'notfound'],
+      publicPath: './'
+    }),
     new MiniCssExtractPlugin({
       filename: 'style/[name].[fullhash].bundle.css',
       chunkFilename: 'css/[id].bundle.css'

+ 18 - 129
webpack_config_github.js

@@ -3,7 +3,6 @@ import HtmlWebpackPlugin from 'html-webpack-plugin'
 import MiniCssExtractPlugin from 'mini-css-extract-plugin'
 import CopyWebpackPlugin from 'copy-webpack-plugin'
 import TerserPlugin from 'terser-webpack-plugin'
-import filetool from 'huan-file-tool'
 import { fileURLToPath } from 'url'
 
 const __filename = fileURLToPath(import.meta.url)
@@ -25,85 +24,6 @@ const html_minify = {
   minifyURLs: true
 }
 
-const HTMMLPlugin = []
-
-const { localPathResult: AllHTMLLocalFile4xx } = filetool.filewaalk.getAllFilePaths(
-  path.resolve(__dirname, 'src/html/error/4xx')
-)
-AllHTMLLocalFile4xx.forEach((filePath) => {
-  if (!filePath.endsWith('.html')) {
-    return
-  }
-
-  if (filePath.includes('signal')) {
-    HTMMLPlugin.push(
-      new HtmlWebpackPlugin({
-        inject: 'body',
-        template: path.resolve(__dirname, 'src/html/error/4xx', filePath), //指定模板文件
-        filename: path.join('error/4xx', filePath),
-        chunks: ['signal'],
-        publicPath: '../../'
-      })
-    )
-    return
-  }
-
-  if (filePath.includes('404')) {
-    HTMMLPlugin.push(
-      new HtmlWebpackPlugin({
-        inject: 'body',
-        template: path.resolve(__dirname, 'src/html/error/4xx', filePath), //指定模板文件
-        filename: path.join('error/4xx', filePath),
-        chunks: ['common', 'err404'],
-        publicPath: '../../'
-      })
-    )
-    return
-  }
-
-  HTMMLPlugin.push(
-    new HtmlWebpackPlugin({
-      inject: 'body',
-      template: path.resolve(__dirname, 'src/html/error/4xx', filePath), //指定模板文件
-      filename: path.join('error/4xx', filePath),
-      chunks: ['common', 'err4xx'],
-      publicPath: '../../'
-    })
-  )
-})
-
-const { localPathResult: AllHTMLLocalFile5xx } = filetool.filewaalk.getAllFilePaths(
-  path.resolve(__dirname, 'src/html/error/5xx')
-)
-AllHTMLLocalFile5xx.forEach((filePath) => {
-  if (!filePath.endsWith('.html')) {
-    return
-  }
-
-  if (filePath.includes('signal')) {
-    HTMMLPlugin.push(
-      new HtmlWebpackPlugin({
-        inject: 'body',
-        template: path.resolve(__dirname, 'src/html/error/5xx', filePath), //指定模板文件
-        filename: path.join('error/5xx', filePath),
-        chunks: ['signal'],
-        publicPath: '../../'
-      })
-    )
-    return
-  }
-
-  HTMMLPlugin.push(
-    new HtmlWebpackPlugin({
-      inject: 'body',
-      template: path.resolve(__dirname, 'src/html/error/5xx', filePath), //指定模板文件
-      filename: path.join('error/5xx', filePath),
-      chunks: ['common', 'err5xx'],
-      publicPath: '../../'
-    })
-  )
-})
-
 const config = {
   mode: mode,
 
@@ -118,13 +38,9 @@ const config = {
   entry: {
     common: path.resolve(__dirname, 'src/common.js'),
     index: path.resolve(__dirname, 'src/index.js'),
-    signal: path.resolve(__dirname, 'src/signal.js'),
-    new: path.resolve(__dirname, 'src/new.js'),
-    license: path.resolve(__dirname, 'src/license.js'),
-    mitorg: path.resolve(__dirname, 'src/mitorg.js'),
-    err4xx: path.resolve(__dirname, 'src/4xx.js'),
-    err404: path.resolve(__dirname, 'src/404.js'),
-    err5xx: path.resolve(__dirname, 'src/5xx.js')
+    leave: path.resolve(__dirname, 'src/leave.js'),
+    sponsors: path.resolve(__dirname, 'src/sponsors.js'),
+    contributors: path.resolve(__dirname, "src/contributors.js")
   },
 
   output: {
@@ -178,7 +94,7 @@ const config = {
               limit: 8192, // 8KB 以下的文件将被转换为 Data URL
               fallback: 'file-loader',
               outputPath: 'images', // 类似于 file-loader 的配置
-              name: '[name].[fullhash].[ext]'
+              name: '[name].[hash].[ext]'
             }
           }
         ]
@@ -192,7 +108,7 @@ const config = {
               limit: 8192, // 8KB 以下的文件将被转换为 Data URL
               fallback: 'file-loader',
               outputPath: 'videos', // 类似于 file-loader 的配置
-              name: '[name].[fullhash].[ext]'
+              name: '[name].[hash].[ext]'
             }
           }
         ]
@@ -206,7 +122,7 @@ const config = {
               limit: 8192, // 8KB 以下的文件将被转换为 Data URL
               fallback: 'file-loader',
               outputPath: 'fonts', // 类似于 file-loader 的配置
-              name: '[name].[fullhash].[ext]'
+              name: '[name].[hash].[ext]'
             }
           }
         ]
@@ -222,15 +138,12 @@ const config = {
     new CopyWebpackPlugin({
       patterns: [
         { from: 'public', to: './' },
-        { from: './config.json', to: './SH_CONFIG.json' },
-        { from: './LICENSE', to: './' },
-        { from: './LICENSE_CN', to: './' }
+        { from: './config.json', to: './CONFIG.json' },
       ]
     }),
-    ...HTMMLPlugin,
     new HtmlWebpackPlugin({
       inject: 'body',
-      template: path.resolve(__dirname, 'src', 'html', 'index.html'), //指定模板文件
+      template: path.resolve(__dirname, 'src/html/index.html'), //指定模板文件
       filename: 'index.html',
       chunks: ['common', 'index'],
       minify: html_minify,
@@ -238,54 +151,30 @@ const config = {
     }),
     new HtmlWebpackPlugin({
       inject: 'body',
-      template: path.resolve(__dirname, 'src', 'html', 'LICENSE_US.html'), //指定模板文件
-      filename: 'LICENSE_US.html',
-      chunks: ['common', 'license'],
-      minify: html_minify,
-      publicPath: './'
-    }),
-    new HtmlWebpackPlugin({
-      inject: 'body',
-      template: path.resolve(__dirname, 'src', 'html', 'LICENSE_CN.html'), //指定模板文件
-      filename: 'LICENSE_CN.html',
-      chunks: ['common', 'license'],
-      minify: html_minify,
-      publicPath: './'
-    }),
-    new HtmlWebpackPlugin({
-      inject: 'body',
-      template: path.resolve(__dirname, 'src', 'html', 'mitorg.html'), //指定模板文件
-      filename: 'mitorg.html',
-      chunks: ['common', 'mitorg'],
-      minify: html_minify,
-      publicPath: './'
-    }),
-    new HtmlWebpackPlugin({
-      inject: 'body',
-      template: path.resolve(__dirname, 'src', 'html', 'index.new.signal.html'), //指定模板文件
-      filename: 'index.new.signal.html',
-      chunks: ['common', 'new', 'signal'], // 此signal要设置common
+      template: path.resolve(__dirname, 'src/html/leave.html'), //指定模板文件
+      filename: 'leave.html',
+      chunks: ['common', 'leave'],
       minify: html_minify,
       publicPath: './'
     }),
     new HtmlWebpackPlugin({
       inject: 'body',
-      template: path.resolve(__dirname, 'src', 'html', 'index.new.html'), //指定模板文件
-      filename: 'index.new.html',
-      chunks: ['common', 'new'],
+      template: path.resolve(__dirname, 'src/html/sponsors.html'), //指定模板文件
+      filename: 'sponsors.html',
+      chunks: ['common', 'sponsors'],
       minify: html_minify,
       publicPath: './'
     }),
     new HtmlWebpackPlugin({
       inject: 'body',
-      template: path.resolve(__dirname, 'src/html/error/4xx/404.signal.html'), //指定模板文件
-      filename: '404.html',
-      chunks: ['common', 'signal'], // 此signal要设置common
+      template: path.resolve(__dirname, 'src/html/contributors.html'), //指定模板文件
+      filename: 'contributors.html',
+      chunks: ['common', 'contributors'],
       minify: html_minify,
       publicPath: './'
     }),
     new MiniCssExtractPlugin({
-      filename: 'style/[name].[hash].bundle.css',
+      filename: 'style/[name].[fullhash].bundle.css',
       chunkFilename: 'css/[id].bundle.css'
     })
   ],

+ 18 - 129
webpack_config_prod.js

@@ -2,7 +2,6 @@ import path from 'path'
 import HtmlWebpackPlugin from 'html-webpack-plugin'
 import MiniCssExtractPlugin from 'mini-css-extract-plugin'
 import CopyWebpackPlugin from 'copy-webpack-plugin'
-import filetool from 'huan-file-tool'
 import { fileURLToPath } from 'url'
 
 const __filename = fileURLToPath(import.meta.url)
@@ -24,85 +23,6 @@ const html_minify = {
   minifyURLs: true
 }
 
-const HTMMLPlugin = []
-
-const { localPathResult: AllHTMLLocalFile4xx } = filetool.filewaalk.getAllFilePaths(
-  path.resolve(__dirname, 'src/html/error/4xx')
-)
-AllHTMLLocalFile4xx.forEach((filePath) => {
-  if (!filePath.endsWith('.html')) {
-    return
-  }
-
-  if (filePath.includes('signal.html')) {
-    HTMMLPlugin.push(
-      new HtmlWebpackPlugin({
-        inject: 'body',
-        template: path.resolve(__dirname, 'src/html/error/4xx', filePath), //指定模板文件
-        filename: path.join('error/4xx', filePath),
-        chunks: ['signal'],
-        publicPath: '../../'
-      })
-    )
-    return
-  }
-
-  if (filePath.includes('400.html')) {
-    HTMMLPlugin.push(
-      new HtmlWebpackPlugin({
-        inject: 'body',
-        template: path.resolve(__dirname, 'src/html/error/4xx', filePath), //指定模板文件
-        filename: path.join('error/4xx', filePath),
-        chunks: ['common', 'err404'],
-        publicPath: '../../'
-      })
-    )
-    return
-  }
-
-  HTMMLPlugin.push(
-    new HtmlWebpackPlugin({
-      inject: 'body',
-      template: path.resolve(__dirname, 'src/html/error/4xx', filePath), //指定模板文件
-      filename: path.join('error/4xx', filePath),
-      chunks: ['common', 'err4xx'],
-      publicPath: '../../'
-    })
-  )
-})
-
-const { localPathResult: AllHTMLLocalFile5xx } = filetool.filewaalk.getAllFilePaths(
-  path.resolve(__dirname, 'src/html/error/5xx')
-)
-AllHTMLLocalFile5xx.forEach((filePath) => {
-  if (!filePath.endsWith('.html')) {
-    return
-  }
-
-  if (filePath.includes('signal.html')) {
-    HTMMLPlugin.push(
-      new HtmlWebpackPlugin({
-        inject: 'body',
-        template: path.resolve(__dirname, 'src/html/error/5xx', filePath), //指定模板文件
-        filename: path.join('error/5xx', filePath),
-        chunks: ['signal'],
-        publicPath: '../../'
-      })
-    )
-    return
-  }
-
-  HTMMLPlugin.push(
-    new HtmlWebpackPlugin({
-      inject: 'body',
-      template: path.resolve(__dirname, 'src/html/error/5xx', filePath), //指定模板文件
-      filename: path.join('error/5xx', filePath),
-      chunks: ['common', 'err5xx'],
-      publicPath: '../../'
-    })
-  )
-})
-
 const config = {
   mode: mode,
 
@@ -117,13 +37,9 @@ const config = {
   entry: {
     common: path.resolve(__dirname, 'src/common.js'),
     index: path.resolve(__dirname, 'src/index.js'),
-    signal: path.resolve(__dirname, 'src/signal.js'),
-    new: path.resolve(__dirname, 'src/new.js'),
-    license: path.resolve(__dirname, 'src/license.js'),
-    mitorg: path.resolve(__dirname, 'src/mitorg.js'),
-    err4xx: path.resolve(__dirname, 'src/4xx.js'),
-    err404: path.resolve(__dirname, 'src/404.js'),
-    err5xx: path.resolve(__dirname, 'src/5xx.js')
+    leave: path.resolve(__dirname, 'src/leave.js'),
+    sponsors: path.resolve(__dirname, 'src/sponsors.js'),
+    contributors: path.resolve(__dirname, "src/contributors.js")
   },
 
   output: {
@@ -163,7 +79,7 @@ const config = {
               limit: 8192, // 8KB 以下的文件将被转换为 Data URL
               fallback: 'file-loader',
               outputPath: 'images', // 类似于 file-loader 的配置
-              name: '[name].[fullhash].[ext]'
+              name: '[name].[hash].[ext]'
             }
           }
         ]
@@ -177,7 +93,7 @@ const config = {
               limit: 8192, // 8KB 以下的文件将被转换为 Data URL
               fallback: 'file-loader',
               outputPath: 'videos', // 类似于 file-loader 的配置
-              name: '[name].[fullhash].[ext]'
+              name: '[name].[hash].[ext]'
             }
           }
         ]
@@ -191,7 +107,7 @@ const config = {
               limit: 8192, // 8KB 以下的文件将被转换为 Data URL
               fallback: 'file-loader',
               outputPath: 'fonts', // 类似于 file-loader 的配置
-              name: '[name].[fullhash].[ext]'
+              name: '[name].[hash].[ext]'
             }
           }
         ]
@@ -207,15 +123,12 @@ const config = {
     new CopyWebpackPlugin({
       patterns: [
         { from: 'public', to: './' },
-        { from: './config.json', to: './SH_CONFIG.json' },
-        { from: './LICENSE', to: './' },
-        { from: './LICENSE_CN', to: './' }
+        { from: './config.json', to: './CONFIG.json' },
       ]
     }),
-    ...HTMMLPlugin,
     new HtmlWebpackPlugin({
       inject: 'body',
-      template: path.resolve(__dirname, 'src', 'html', 'index.html'), //指定模板文件
+      template: path.resolve(__dirname, 'src/html/index.html'), //指定模板文件
       filename: 'index.html',
       chunks: ['common', 'index'],
       minify: html_minify,
@@ -223,54 +136,30 @@ const config = {
     }),
     new HtmlWebpackPlugin({
       inject: 'body',
-      template: path.resolve(__dirname, 'src', 'html', 'LICENSE_US.html'), //指定模板文件
-      filename: 'LICENSE_US.html',
-      chunks: ['common', 'license'],
-      minify: html_minify,
-      publicPath: './'
-    }),
-    new HtmlWebpackPlugin({
-      inject: 'body',
-      template: path.resolve(__dirname, 'src/html/LICENSE_CN.html'), //指定模板文件
-      filename: 'LICENSE_CN.html',
-      chunks: ['common', 'license'],
-      minify: html_minify,
-      publicPath: './'
-    }),
-    new HtmlWebpackPlugin({
-      inject: 'body',
-      template: path.resolve(__dirname, 'src', 'html', 'mitorg.html'), //指定模板文件
-      filename: 'mitorg.html',
-      chunks: ['common', 'mitorg'],
-      minify: html_minify,
-      publicPath: './'
-    }),
-    new HtmlWebpackPlugin({
-      inject: 'body',
-      template: path.resolve(__dirname, 'src', 'html', 'index.new.signal.html'), //指定模板文件
-      filename: 'index.new.signal.html',
-      chunks: ['common', 'new', 'signal'], // 此signal要设置common
+      template: path.resolve(__dirname, 'src/html/leave.html'), //指定模板文件
+      filename: 'leave.html',
+      chunks: ['common', 'leave'],
       minify: html_minify,
       publicPath: './'
     }),
     new HtmlWebpackPlugin({
       inject: 'body',
-      template: path.resolve(__dirname, 'src', 'html', 'index.new.html'), //指定模板文件
-      filename: 'index.new.html',
-      chunks: ['common', 'new'],
+      template: path.resolve(__dirname, 'src/html/sponsors.html'), //指定模板文件
+      filename: 'sponsors.html',
+      chunks: ['common', 'sponsors'],
       minify: html_minify,
       publicPath: './'
     }),
     new HtmlWebpackPlugin({
       inject: 'body',
-      template: path.resolve(__dirname, 'src/html/error/4xx/404.signal.html'), //指定模板文件
-      filename: '404.html',
-      chunks: ['common', 'signal'], // 此signal要设置common
+      template: path.resolve(__dirname, 'src/html/contributors.html'), //指定模板文件
+      filename: 'contributors.html',
+      chunks: ['common', 'contributors'],
       minify: html_minify,
       publicPath: './'
     }),
     new MiniCssExtractPlugin({
-      filename: 'style/[name].[hash].bundle.css',
+      filename: 'style/[name].[fullhash].bundle.css',
       chunkFilename: 'css/[id].bundle.css'
     })
   ],