├── .github
└── workflows
│ └── release.yml
├── .gitignore
├── .vscode
└── settings.json
├── CODE_OF_CONDUCT.md
├── CONTRIBUTING.md
├── LICENSE
├── README.md
├── app
├── app.vue
├── assets
│ └── css
│ │ └── style.css
├── layouts
│ └── default.vue
└── pages
│ └── index.vue
├── nuxt.config.ts
├── package.json
├── pnpm-lock.yaml
├── public
├── favicon.ico
└── images
│ ├── logo.svg
│ └── wechat.png
├── server
└── tsconfig.json
└── tsconfig.json
/.github/workflows/release.yml:
--------------------------------------------------------------------------------
1 | name: Build Release
2 |
3 | on:
4 | push:
5 | tags:
6 | - "v*"
7 |
8 | jobs:
9 | build:
10 | runs-on: ubuntu-latest
11 |
12 | steps:
13 | - name: Setup Bun
14 | uses: oven-sh/setup-bun@v1
15 | with:
16 | bun-version: latest
17 |
18 | - name: Checkout
19 | uses: actions/checkout@v4
20 |
21 | - name: Install Dependencies
22 | run: bun install
23 |
24 | - name: Generate
25 | run: |
26 | bun run generate
27 | cd .output/public
28 | zip -q -r ../../f5-bench-${GITHUB_REF#refs/tags/}.zip .
29 | cd ../../ && ls
30 |
31 | - name: Create Release
32 | uses: softprops/action-gh-release@v2
33 | env:
34 | GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
35 | with:
36 | files: f5-bench-v*.zip
37 |
--------------------------------------------------------------------------------
/.gitignore:
--------------------------------------------------------------------------------
1 | # Nuxt dev/build outputs
2 | .output
3 | .data
4 | .nuxt
5 | .nitro
6 | .cache
7 | dist
8 |
9 | # Node dependencies
10 | node_modules
11 |
12 | # Logs
13 | logs
14 | *.log
15 |
16 | # Misc
17 | .DS_Store
18 | .fleet
19 | .idea
20 |
21 | # Local env files
22 | .env
23 | .env.*
24 | !.env.example
25 |
--------------------------------------------------------------------------------
/.vscode/settings.json:
--------------------------------------------------------------------------------
1 | {
2 | "editor.formatOnSave": true
3 | }
4 |
--------------------------------------------------------------------------------
/CODE_OF_CONDUCT.md:
--------------------------------------------------------------------------------
1 | # 贡献者公约
2 |
3 | ## 我们的承诺
4 |
5 | 身为社区成员、贡献者和领袖,我们承诺使社区参与者不受骚扰,无论其年龄、体型、可见或不可见的缺陷、族裔、性征、性别认同和表达、经验水平、教育程度、社会与经济地位、国籍、相貌、种族、种姓、肤色、宗教信仰、性倾向或性取向如何。
6 |
7 | 我们承诺以有助于建立开放、友善、多样化、包容、健康社区的方式行事和互动。
8 |
9 | ## 我们的准则
10 |
11 | 有助于为我们的社区创造积极环境的行为例子包括但不限于:
12 |
13 | - 表现出对他人的同情和善意
14 | - 尊重不同的主张、观点和感受
15 | - 提出和大方接受建设性意见
16 | - 承担责任并向受我们错误影响的人道歉
17 | - 注重社区共同诉求,而非个人得失
18 |
19 | 不当行为例子包括:
20 |
21 | - 使用情色化的语言或图像,及性引诱或挑逗
22 | - 嘲弄、侮辱或诋毁性评论,以及人身或政治攻击
23 | - 公开或私下的骚扰行为
24 | - 未经他人明确许可,公布他人的私人信息,如物理或电子邮件地址
25 | - 其他有理由认定为违反职业操守的不当行为
26 |
27 | ## 责任和权力
28 |
29 | 社区领袖有责任解释和落实我们所认可的行为准则,并妥善公正地对他们认为不当、威胁、冒犯或有害的任何行为采取纠正措施。
30 |
31 | 社区领导有权力和责任删除、编辑或拒绝或拒绝与本行为准则不相符的评论(comment)、提交(commits)、代码、维基(wiki)编辑、议题(issues)或其他贡献,并在适当时机知采取措施的理由。
32 |
33 | ## 适用范围
34 |
35 | 本行为准则适用于所有社区场合,也适用于在公共场所代表社区时的个人。
36 |
37 | 代表社区的情形包括使用官方电子邮件地址、通过官方社交媒体帐户发帖或在线上或线下活动中担任指定代表。
38 |
39 | ## 监督
40 |
41 | 辱骂、骚扰或其他不可接受的行为可通过 [i@ikxin.com] 向负责监督的社区领袖报告。
42 | 所有投诉都将得到及时和公平的审查和调查。
43 |
44 | 所有社区领袖都有义务尊重任何事件报告者的隐私和安全。
45 |
46 | ## 处理方针
47 |
48 | 社区领袖将遵循下列社区处理方针来明确他们所认定违反本行为准则的行为的处理方式:
49 |
50 | ### 1. 纠正
51 |
52 | **社区影响**:使用不恰当的语言或其他在社区中被认定为不符合职业道德或不受欢迎的行为。
53 |
54 | **处理意见**:由社区领袖发出非公开的书面警告,明确说明违规行为的性质,并解释举止如何不妥。或将要求公开道歉。
55 |
56 | ### 2. 警告
57 |
58 | **社区影响**:单个或一系列违规行为。
59 |
60 | **处理意见**:警告并对连续性行为进行处理。在指定时间内,不得与相关人员互动,包括主动与行为准则执行者互动。这包括避免在社区场所和外部渠道中的互动。违反这些条款可能会导致临时或永久封禁。
61 |
62 | ### 3. 临时封禁
63 |
64 | **社区影响**: 严重违反社区准则,包括持续的不当行为。
65 |
66 | **处理意见**: 在指定时间内,暂时禁止与社区进行任何形式的互动或公开交流。在此期间,不得与相关人员进行公开或私下互动,包括主动与行为准则执行者互动。违反这些条款可能会导致永久封禁。
67 |
68 | ### 4. 永久封禁
69 |
70 | **社区影响**:行为模式表现出违反社区准则,包括持续的不当行为、骚扰个人或攻击或贬低某个类别的个体。
71 |
72 | **处理意见**:永久禁止在社区内进行任何形式的公开互动。
73 |
74 | ## 参见
75 |
76 | 本行为准则改编自 [Contributor Covenant][homepage] 2.1 版, 参见 [https://www.contributor-covenant.org/version/2/1/code_of_conduct.html][v2.1]。
77 |
78 | 社区处理方针灵感来源于 [Mozilla's code of conduct enforcement ladder][Mozilla CoC]。
79 |
80 | 有关本行为准则的常见问题的答案,参见 [https://www.contributor-covenant.org/faq][FAQ]。
81 | 其他语言翻译参见 [https://www.contributor-covenant.org/translations][translations]。
82 |
83 | [homepage]: https://www.contributor-covenant.org
84 | [v2.1]: https://www.contributor-covenant.org/version/2/1/code_of_conduct.html
85 | [Mozilla CoC]: https://github.com/mozilla/diversity
86 | [FAQ]: https://www.contributor-covenant.org/faq
87 | [translations]: https://www.contributor-covenant.org/translations
88 |
--------------------------------------------------------------------------------
/CONTRIBUTING.md:
--------------------------------------------------------------------------------
1 | ## 欢迎来到 f5-bench 贡献指南
2 |
3 | 感谢你投入时间为我们的项目做贡献!你的任何贡献都将反映在 [contributors](https://github.com/ikxin/f5-bench/graphs/contributors) 上。
4 |
5 | 请阅读我们的[贡献者公约](./CODE_OF_CONDUCT.md),以保持我们的社区平易近人和受到尊重。
6 |
7 | 在本指南中,你将得到一个关于贡献工作流程的概述,包括打开一个问题、创建一个 PR、审查和合并 PR。
8 |
9 | 使用本文档左上角的目录图标可以快速进入本指南的特定章节。
10 |
--------------------------------------------------------------------------------
/LICENSE:
--------------------------------------------------------------------------------
1 | MIT License
2 |
3 | Copyright (c) 2024 一纸忘忧
4 |
5 | Permission is hereby granted, free of charge, to any person obtaining a copy
6 | of this software and associated documentation files (the "Software"), to deal
7 | in the Software without restriction, including without limitation the rights
8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9 | copies of the Software, and to permit persons to whom the Software is
10 | furnished to do so, subject to the following conditions:
11 |
12 | The above copyright notice and this permission notice shall be included in all
13 | copies or substantial portions of the Software.
14 |
15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21 | SOFTWARE.
22 |
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 | ## 📖 项目介绍
16 |
17 | 本项目早期灵感来源于 HostLoc 论坛上的[一篇帖子](https://hostloc.com/thread-1312882-1-1.html),当时测试了一下自己的网站,因为该网站没有配置任何访问频率限制,结果很轻松的就将服务器资源给占满了,觉得这个小工具挺有意思的,就想着自己也搭建一个用来给网站进行请求基准测试。
18 |
19 | 经过对原作者 `@主机玩家` 询问是否开放源代码,最终没有收到答复,于是决定自己动手写一个。[原网站](https://f5.serverplayer.com/)核心代码经过了混淆无法阅读,所以本项目仅参考了原网站的思路,并以此为基础进行了重新开发。
20 |
21 | 本项目命名为 [F5 Bench](https://github.com/ikxin/f5-bench),即网站请求基准测试 (Fetch Benchmark) 的意思,F5 既可以用来表示键盘上的[刷新键](https://www.toptal.com/developers/keycode/f5),也可以表示 Fetch 的缩写。
22 |
23 | 本项目的原理也很简单,就是通过 [Fetch API](https://developer.mozilla.org/zh-CN/docs/Web/API/Fetch_API) 来频繁的请求目标网站,从而对目标网站进行请求基准测试,也就是 HostLoc 论坛里常常提到的玩笑梗,通过 F5 刷新对目标网站发起请求基准测试,从而使目标网站服务器资源占满导致崩溃。
24 |
25 | 得益于 [Fetch API](https://developer.mozilla.org/zh-CN/docs/Web/API/Fetch_API) 拥有 [`no-cors` 模式](https://developer.mozilla.org/zh-CN/docs/Web/API/fetch#mode),因此本项目可以绕过 [CORS](https://developer.mozilla.org/zh-CN/docs/Web/HTTP/CORS) 限制,直接对目标网站发起跨域请求,从而实现请求基准测试。
26 |
27 | ## 📝 免责声明
28 |
29 | 基于 Fetch API 发起的网络请求,会携带本机设备的 IP 信息,因此请勿将本工具用于任何非法用途,本项目仅限于开发者用于对自己的网站发起请求基准测试,除此之外的一切使用场景,使用者本人需承担所有责任,本项目不对任何使用场景负责。
30 |
31 | ## 👀 在线演示
32 |
33 | 本项目使用 Cloudflare Pages 进行部署在线演示,禁止使用其进行非法请求基准测试,托管平台会对使用者以及使用记录进行日志文件留存(仅用于规避责任风险)。
34 |
35 | https://f5-bench.ikxin.com
36 |
37 | ## 📦 自行部署
38 |
39 | 在本项目 [Release](https://github.com/ikxin/f5-bench/releases) 页面下载最新版本的压缩包,将其上传到任意静态网站主机中,然后解压到网站根目录即可。
40 |
41 | ## ⭐ 星星
42 |
43 | 
44 |
45 | ## 🧑💻 作者
46 |
47 | Code with ❤️ by [一纸忘忧](https://www.ikxin.com "一纸忘忧")
48 |
49 | ## 📜 开源协议
50 |
51 | [MIT License](./LICENSE "MIT License")
52 |
53 | Copyright (c) 2024 ~ Present
54 |
--------------------------------------------------------------------------------
/app/app.vue:
--------------------------------------------------------------------------------
1 |
29 |
30 |
31 |
32 |
33 |
34 |
35 |
--------------------------------------------------------------------------------
/app/assets/css/style.css:
--------------------------------------------------------------------------------
1 | body {
2 | background-color: var(--color-neutral-2);
3 | color: var(--color-text-2);
4 | }
5 |
6 | html[class="dark-mode"] body {
7 | --red-1: 77, 0, 10;
8 | --red-2: 119, 6, 17;
9 | --red-3: 161, 22, 31;
10 | --red-4: 203, 46, 52;
11 | --red-5: 245, 78, 78;
12 | --red-6: 247, 105, 101;
13 | --red-7: 249, 141, 134;
14 | --red-8: 251, 176, 167;
15 | --red-9: 253, 209, 202;
16 | --red-10: 255, 240, 236;
17 | --orangered-1: 77, 14, 0;
18 | --orangered-2: 119, 30, 5;
19 | --orangered-3: 162, 55, 20;
20 | --orangered-4: 204, 87, 41;
21 | --orangered-5: 247, 126, 69;
22 | --orangered-6: 249, 146, 90;
23 | --orangered-7: 250, 173, 125;
24 | --orangered-8: 252, 198, 161;
25 | --orangered-9: 253, 222, 197;
26 | --orangered-10: 255, 244, 235;
27 | --orange-1: 77, 27, 0;
28 | --orange-2: 121, 48, 4;
29 | --orange-3: 166, 75, 10;
30 | --orange-4: 210, 105, 19;
31 | --orange-5: 255, 141, 31;
32 | --orange-6: 255, 150, 38;
33 | --orange-7: 255, 179, 87;
34 | --orange-8: 255, 205, 135;
35 | --orange-9: 255, 227, 184;
36 | --orange-10: 255, 247, 232;
37 | --gold-1: 77, 45, 0;
38 | --gold-2: 119, 75, 4;
39 | --gold-3: 162, 111, 15;
40 | --gold-4: 204, 150, 31;
41 | --gold-5: 247, 192, 52;
42 | --gold-6: 249, 204, 68;
43 | --gold-7: 250, 220, 108;
44 | --gold-8: 252, 233, 149;
45 | --gold-9: 253, 244, 190;
46 | --gold-10: 255, 252, 232;
47 | --yellow-1: 77, 56, 0;
48 | --yellow-2: 120, 94, 7;
49 | --yellow-3: 163, 134, 20;
50 | --yellow-4: 207, 179, 37;
51 | --yellow-5: 250, 225, 60;
52 | --yellow-6: 251, 233, 75;
53 | --yellow-7: 252, 243, 116;
54 | --yellow-8: 253, 250, 157;
55 | --yellow-9: 254, 254, 198;
56 | --yellow-10: 254, 255, 240;
57 | --lime-1: 42, 77, 0;
58 | --lime-2: 68, 112, 6;
59 | --lime-3: 98, 148, 18;
60 | --lime-4: 132, 183, 35;
61 | --lime-5: 168, 219, 57;
62 | --lime-6: 184, 226, 75;
63 | --lime-7: 203, 233, 112;
64 | --lime-8: 222, 241, 152;
65 | --lime-9: 238, 248, 194;
66 | --lime-10: 253, 255, 238;
67 | --green-1: 0, 77, 28;
68 | --green-2: 4, 102, 37;
69 | --green-3: 10, 128, 45;
70 | --green-4: 18, 154, 55;
71 | --green-5: 29, 180, 64;
72 | --green-6: 39, 195, 70;
73 | --green-7: 80, 210, 102;
74 | --green-8: 126, 225, 139;
75 | --green-9: 178, 240, 183;
76 | --green-10: 235, 255, 236;
77 | --cyan-1: 0, 66, 77;
78 | --cyan-2: 6, 97, 108;
79 | --cyan-3: 17, 131, 139;
80 | --cyan-4: 31, 166, 170;
81 | --cyan-5: 48, 201, 201;
82 | --cyan-6: 63, 212, 207;
83 | --cyan-7: 102, 223, 215;
84 | --cyan-8: 144, 233, 225;
85 | --cyan-9: 190, 244, 237;
86 | --cyan-10: 240, 255, 252;
87 | --blue-1: 0, 26, 77;
88 | --blue-2: 5, 47, 120;
89 | --blue-3: 19, 76, 163;
90 | --blue-4: 41, 113, 207;
91 | --blue-5: 70, 154, 250;
92 | --blue-6: 90, 170, 251;
93 | --blue-7: 125, 193, 252;
94 | --blue-8: 161, 213, 253;
95 | --blue-9: 198, 232, 254;
96 | --blue-10: 234, 248, 255;
97 | --arcoblue-1: 0, 13, 77;
98 | --arcoblue-2: 4, 27, 121;
99 | --arcoblue-3: 14, 50, 166;
100 | --arcoblue-4: 29, 77, 210;
101 | --arcoblue-5: 48, 111, 255;
102 | --arcoblue-6: 60, 126, 255;
103 | --arcoblue-7: 104, 159, 255;
104 | --arcoblue-8: 147, 190, 255;
105 | --arcoblue-9: 190, 218, 255;
106 | --arcoblue-10: 234, 244, 255;
107 | --purple-1: 22, 0, 77;
108 | --purple-2: 39, 6, 110;
109 | --purple-3: 62, 19, 143;
110 | --purple-4: 90, 37, 176;
111 | --purple-5: 123, 61, 209;
112 | --purple-6: 142, 81, 218;
113 | --purple-7: 169, 116, 227;
114 | --purple-8: 197, 154, 237;
115 | --purple-9: 223, 194, 246;
116 | --purple-10: 247, 237, 255;
117 | --pinkpurple-1: 66, 0, 77;
118 | --pinkpurple-2: 101, 3, 112;
119 | --pinkpurple-3: 138, 13, 147;
120 | --pinkpurple-4: 176, 27, 182;
121 | --pinkpurple-5: 217, 46, 217;
122 | --pinkpurple-6: 225, 61, 219;
123 | --pinkpurple-7: 232, 102, 223;
124 | --pinkpurple-8: 240, 146, 230;
125 | --pinkpurple-9: 247, 193, 240;
126 | --pinkpurple-10: 255, 242, 253;
127 | --magenta-1: 77, 0, 52;
128 | --magenta-2: 119, 8, 80;
129 | --magenta-3: 161, 23, 108;
130 | --magenta-4: 203, 43, 136;
131 | --magenta-5: 245, 69, 166;
132 | --magenta-6: 247, 86, 169;
133 | --magenta-7: 249, 122, 184;
134 | --magenta-8: 251, 158, 200;
135 | --magenta-9: 253, 195, 219;
136 | --magenta-10: 255, 232, 241;
137 | --gray-1: 23, 23, 26;
138 | --gray-2: 46, 46, 48;
139 | --gray-3: 72, 72, 73;
140 | --gray-4: 95, 95, 96;
141 | --gray-5: 120, 120, 122;
142 | --gray-6: 146, 146, 147;
143 | --gray-7: 171, 171, 172;
144 | --gray-8: 197, 197, 197;
145 | --gray-9: 223, 223, 223;
146 | --gray-10: 246, 246, 246;
147 | --primary-1: var(--arcoblue-1);
148 | --primary-2: var(--arcoblue-2);
149 | --primary-3: var(--arcoblue-3);
150 | --primary-4: var(--arcoblue-4);
151 | --primary-5: var(--arcoblue-5);
152 | --primary-6: var(--arcoblue-6);
153 | --primary-7: var(--arcoblue-7);
154 | --primary-8: var(--arcoblue-8);
155 | --primary-9: var(--arcoblue-9);
156 | --primary-10: var(--arcoblue-10);
157 | --success-1: var(--green-1);
158 | --success-2: var(--green-2);
159 | --success-3: var(--green-3);
160 | --success-4: var(--green-4);
161 | --success-5: var(--green-5);
162 | --success-6: var(--green-6);
163 | --success-7: var(--green-7);
164 | --success-8: var(--green-8);
165 | --success-9: var(--green-9);
166 | --success-10: var(--green-10);
167 | --danger-1: var(--red-1);
168 | --danger-2: var(--red-2);
169 | --danger-3: var(--red-3);
170 | --danger-4: var(--red-4);
171 | --danger-5: var(--red-5);
172 | --danger-6: var(--red-6);
173 | --danger-7: var(--red-7);
174 | --danger-8: var(--red-8);
175 | --danger-9: var(--red-9);
176 | --danger-10: var(--red-10);
177 | --warning-1: var(--orange-1);
178 | --warning-2: var(--orange-2);
179 | --warning-3: var(--orange-3);
180 | --warning-4: var(--orange-4);
181 | --warning-5: var(--orange-5);
182 | --warning-6: var(--orange-6);
183 | --warning-7: var(--orange-7);
184 | --warning-8: var(--orange-8);
185 | --warning-9: var(--orange-9);
186 | --warning-10: var(--orange-10);
187 | --link-1: var(--arcoblue-1);
188 | --link-2: var(--arcoblue-2);
189 | --link-3: var(--arcoblue-3);
190 | --link-4: var(--arcoblue-4);
191 | --link-5: var(--arcoblue-5);
192 | --link-6: var(--arcoblue-6);
193 | --link-7: var(--arcoblue-7);
194 | --link-8: var(--arcoblue-8);
195 | --link-9: var(--arcoblue-9);
196 | --link-10: var(--arcoblue-10);
197 | }
198 |
199 | html[class="dark-mode"] body {
200 | --color-white: rgba(255, 255, 255, 0.9);
201 | --color-black: #000000;
202 | --color-border: #333335;
203 | --color-bg-1: #17171a;
204 | --color-bg-2: #232324;
205 | --color-bg-3: #2a2a2b;
206 | --color-bg-4: #313132;
207 | --color-bg-5: #373739;
208 | --color-bg-white: #f6f6f6;
209 | --color-text-1: rgba(255, 255, 255, 0.9);
210 | --color-text-2: rgba(255, 255, 255, 0.7);
211 | --color-text-3: rgba(255, 255, 255, 0.5);
212 | --color-text-4: rgba(255, 255, 255, 0.3);
213 | --color-fill-1: rgba(255, 255, 255, 0.04);
214 | --color-fill-2: rgba(255, 255, 255, 0.08);
215 | --color-fill-3: rgba(255, 255, 255, 0.12);
216 | --color-fill-4: rgba(255, 255, 255, 0.16);
217 | --color-primary-light-1: rgba(var(--primary-6), 0.2);
218 | --color-primary-light-2: rgba(var(--primary-6), 0.35);
219 | --color-primary-light-3: rgba(var(--primary-6), 0.5);
220 | --color-primary-light-4: rgba(var(--primary-6), 0.65);
221 | --color-secondary: rgba(var(--gray-9), 0.08);
222 | --color-secondary-hover: rgba(var(--gray-8), 0.16);
223 | --color-secondary-active: rgba(var(--gray-7), 0.24);
224 | --color-secondary-disabled: rgba(var(--gray-9), 0.08);
225 | --color-danger-light-1: rgba(var(--danger-6), 0.2);
226 | --color-danger-light-2: rgba(var(--danger-6), 0.35);
227 | --color-danger-light-3: rgba(var(--danger-6), 0.5);
228 | --color-danger-light-4: rgba(var(--danger-6), 0.65);
229 | --color-success-light-1: rgb(var(--success-6), 0.2);
230 | --color-success-light-2: rgb(var(--success-6), 0.35);
231 | --color-success-light-3: rgb(var(--success-6), 0.5);
232 | --color-success-light-4: rgb(var(--success-6), 0.65);
233 | --color-warning-light-1: rgb(var(--warning-6), 0.2);
234 | --color-warning-light-2: rgb(var(--warning-6), 0.35);
235 | --color-warning-light-3: rgb(var(--warning-6), 0.5);
236 | --color-warning-light-4: rgb(var(--warning-6), 0.65);
237 | --color-link-light-1: rgb(var(--link-6), 0.2);
238 | --color-link-light-2: rgb(var(--link-6), 0.35);
239 | --color-link-light-3: rgb(var(--link-6), 0.5);
240 | --color-link-light-4: rgb(var(--link-6), 0.65);
241 | --color-tooltip-bg: #373739;
242 | --color-spin-layer-bg: rgba(51, 51, 51, 0.6);
243 | --color-menu-dark-bg: #232324;
244 | --color-menu-light-bg: #232324;
245 | --color-menu-dark-hover: var(--color-fill-2);
246 | --color-mask-bg: rgba(23, 23, 26, 0.6);
247 | }
248 |
249 | .arco-tooltip-content {
250 | padding: 12px !important;
251 | }
--------------------------------------------------------------------------------
/app/layouts/default.vue:
--------------------------------------------------------------------------------
1 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
20 |
21 |
22 |
23 |
24 |
25 |
28 |
29 |
30 |
31 |
32 |
33 |
34 |
35 |
36 |
37 |
38 |
39 |
40 |
41 |
42 |
43 |
44 |
45 |
46 |
47 |
48 |
49 |
--------------------------------------------------------------------------------
/app/pages/index.vue:
--------------------------------------------------------------------------------
1 |
55 |
56 |
57 |
58 |
64 |
80 |
84 |
85 |
90 |
91 |
92 |
98 |
99 | 我确认以上 URL 仅用于测试
100 |
101 |
102 |
108 |
109 | 对其造成的一切后果,本人承担所有责任
110 |
111 |
112 |
113 |
117 |
118 |
119 |
120 | {{ count }} 次
121 |
122 |
123 | {{ qps.toFixed(0) }} 次/秒
124 |
125 |
126 | {{ countTime / 1000 }} 秒
127 |
128 |
129 |
130 |
131 |
132 |
--------------------------------------------------------------------------------
/nuxt.config.ts:
--------------------------------------------------------------------------------
1 | // https://nuxt.com/docs/api/configuration/nuxt-config
2 | export default defineNuxtConfig({
3 | devtools: { enabled: true },
4 | compatibilityDate: "2025-02-11",
5 | css: ["~/assets/css/style.css"],
6 | future: {
7 | compatibilityVersion: 4,
8 | },
9 | modules: [
10 | "@nuxt/icon",
11 | "@nuxtjs/color-mode",
12 | "@nuxtjs/tailwindcss",
13 | "arco-design-nuxt-module",
14 | ],
15 | });
16 |
--------------------------------------------------------------------------------
/package.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "nuxt-app",
3 | "private": true,
4 | "type": "module",
5 | "version": "0.1.2",
6 | "packageManager": "pnpm@10.3.0",
7 | "scripts": {
8 | "build": "nuxt build",
9 | "dev": "nuxt dev",
10 | "generate": "nuxt generate",
11 | "preview": "nuxt preview",
12 | "postinstall": "nuxt prepare"
13 | },
14 | "dependencies": {
15 | "@iconify-json/lucide": "^1.2.28",
16 | "@nuxt/icon": "^1.10.3",
17 | "@nuxtjs/color-mode": "^3.5.2",
18 | "@nuxtjs/tailwindcss": "^6.13.1",
19 | "arco-design-nuxt-module": "^0.2.1",
20 | "nuxt": "^3.15.4",
21 | "vue": "^3.5.13",
22 | "vue-router": "^4.5.0"
23 | }
24 | }
25 |
--------------------------------------------------------------------------------
/public/favicon.ico:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ikxin/f5-bench/f84c13cf9b196874ed8835547b14553bc76fde82/public/favicon.ico
--------------------------------------------------------------------------------
/public/images/logo.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/public/images/wechat.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ikxin/f5-bench/f84c13cf9b196874ed8835547b14553bc76fde82/public/images/wechat.png
--------------------------------------------------------------------------------
/server/tsconfig.json:
--------------------------------------------------------------------------------
1 | {
2 | "extends": "../.nuxt/tsconfig.server.json"
3 | }
4 |
--------------------------------------------------------------------------------
/tsconfig.json:
--------------------------------------------------------------------------------
1 | {
2 | // https://nuxt.com/docs/guide/concepts/typescript
3 | "extends": "./.nuxt/tsconfig.json"
4 | }
5 |
--------------------------------------------------------------------------------