Compare commits

...

10 Commits

Author SHA1 Message Date
azalea 38d7796fda Merge pull request #1 from TeamPortalPhantom/fix-typo
docs(README): fix typo
2025-05-22 09:06:56 +09:00
Ethan Riley bdeb9ebc46 docs(README): fix typo
Unfortunately, Python 10 was not found.
2025-05-21 12:03:03 -04:00
azalea 390d341bc1 [F] Fix width 2025-03-25 13:59:33 -04:00
azalea 313156aa00 [+] Serve https 2025-03-25 13:57:41 -04:00
azalea 51fa829117 [O] Force https 2025-03-25 13:47:36 -04:00
azalea 161e728927 [+] Scanning icon 2025-03-25 13:45:31 -04:00
azalea c7cd9ab7fa [+] Iconify 2025-03-25 13:40:20 -04:00
azalea 7addba7798 [+] WebNFC 2025-03-25 13:39:04 -04:00
azalea f27955238f [+] HTTPS 2025-03-25 13:38:56 -04:00
azalea 27de08873d [+] WebNFC 2025-03-25 12:58:35 -04:00
12 changed files with 183 additions and 16 deletions
+6 -4
View File
@@ -1,12 +1,12 @@
# AimeWeb
Segatools 读卡器(选卡器?)前端,用来在没有读卡器的时候可以选择刷不同的卡的工具
Segatools 读卡器前端,用来在没有读卡器的时候可以选择刷不同的卡的工具
![](img_1.png)
<img src="image.png" width="50%">
# 装
需要安装 python > 10
需要安装 Python > 3.10
```
git clone https://github.com/MaigoLabs/AimeWeb
@@ -32,4 +32,6 @@ python src/main.py
# 用
浏览器打开 `http://{LAN ip}:8249`
浏览器打开 `https://{LAN ip}:8249`
(注意是 httpS 不是 http!!! 这是因为只有 https 才能使用 WebNFC)
BIN
View File
Binary file not shown.

After

Width:  |  Height:  |  Size: 294 KiB

+5 -4
View File
@@ -29,9 +29,9 @@ app.add_middleware(
# Configuration
PATH = Path(AIME_PATH)
AUDIO_EFFECT = Path(__file__).parent / 'audio/mixkit-gaming-lock-2848.wav'
HTML = Path(__file__).parent.parent / "web/dist/index.html"
SRC = Path(__file__).parent
AUDIO_EFFECT = SRC / 'audio/mixkit-gaming-lock-2848.wav'
HTML = SRC / "../web/dist/index.html"
@app.get("/", response_class=HTMLResponse)
@@ -72,4 +72,5 @@ def scan(uid: str):
if __name__ == '__main__':
uvicorn.run(app, host="0.0.0.0", port=PORT)
uvicorn.run(app, host="0.0.0.0", port=PORT,
ssl_keyfile=SRC / "ssl/key.pem", ssl_certfile=SRC / "ssl/cert.pem")
+19
View File
@@ -0,0 +1,19 @@
-----BEGIN CERTIFICATE-----
MIIDCTCCAfGgAwIBAgIUD64vvWlj2rQtvU4DMiV9Xk1z1wAwDQYJKoZIhvcNAQEL
BQAwFDESMBAGA1UEAwwJbG9jYWxob3N0MB4XDTI1MDMyNTE3NDkyOVoXDTI2MDMy
NTE3NDkyOVowFDESMBAGA1UEAwwJbG9jYWxob3N0MIIBIjANBgkqhkiG9w0BAQEF
AAOCAQ8AMIIBCgKCAQEAy7oTote+7MWDTsXg8HeEfLkua5NzhwiHYjH4WPDMSjqy
+qw0nzbQzfZtVcssL9/09+GGeSJmLSWXhM5fCmIRSTnEVl+LTRbhtWkciB8HOWwQ
+kbCfyBcLGpTaOWNJqizf9lBRFMll7OkaX78iYiMjNXU6kS2lI89wA3Jm+n8UDSO
u/e8j1ejNqbg3czB3lJaCT62d1wj+rpGrLjUKqYavbYMx3j8jXbiiGpMkkdmbuxL
xUYPhZPOeef1UC26B3EyxsxlieIzYi5avdIRZ6BZupjBwaE0pUI8DiDrGGRUmE1f
uZuycE7CeTNTsA/8ZcECTuElGtHzdGVAyN9ZcGTPmQIDAQABo1MwUTAdBgNVHQ4E
FgQU/svjM0Q8b6m6yR2pnhV6LBQuvnAwHwYDVR0jBBgwFoAU/svjM0Q8b6m6yR2p
nhV6LBQuvnAwDwYDVR0TAQH/BAUwAwEB/zANBgkqhkiG9w0BAQsFAAOCAQEAaAgA
3xUSzQ6f5Vr/Lb7GlKZfjYzF7yA7V2vuyzXx6q5omtKGR7Ipkn6n7Whh4B68KRod
bqsYc1+bPiRndAIrD2866y1CrjCbLLROPN9RsOcgWkoUAvMqS4ECzmsFujrpfRL7
i0Gkjq2SJMfH+B/S3YIjay+umozjhOp/fVPDkXVIuDxCQ5e5ZkXAVl2LdV99WgEg
xgm4iMRqDd0wInFr14CgszgvnlCWJvkFYeZ5uwlQyGtTNS3wE8QfovBKu1ITw3mL
2w4zbvpxQArXg/hSIZj2LiAwbWezPZ7cR7qtsGchxrhIhQwGIgsYFL+KYDmOeB8p
nSPSlCDks8fEbc9d8A==
-----END CERTIFICATE-----
+28
View File
@@ -0,0 +1,28 @@
-----BEGIN PRIVATE KEY-----
MIIEvgIBADANBgkqhkiG9w0BAQEFAASCBKgwggSkAgEAAoIBAQDLuhOi177sxYNO
xeDwd4R8uS5rk3OHCIdiMfhY8MxKOrL6rDSfNtDN9m1Vyywv3/T34YZ5ImYtJZeE
zl8KYhFJOcRWX4tNFuG1aRyIHwc5bBD6RsJ/IFwsalNo5Y0mqLN/2UFEUyWXs6Rp
fvyJiIyM1dTqRLaUjz3ADcmb6fxQNI6797yPV6M2puDdzMHeUloJPrZ3XCP6ukas
uNQqphq9tgzHePyNduKIakySR2Zu7EvFRg+Fk8555/VQLboHcTLGzGWJ4jNiLlq9
0hFnoFm6mMHBoTSlQjwOIOsYZFSYTV+5m7JwTsJ5M1OwD/xlwQJO4SUa0fN0ZUDI
31lwZM+ZAgMBAAECggEAQMv3x+D/+FXf7DOS1ljlOjg58/xLj+TeDpTfLQa1q1xd
Jc6U1Bj+s6uP3exHqxh71UWVXDzdK7nbpeFvqCFF5zjo4iH0b/n5oxYB/aeEyDY/
diMAZKe5uWS+D8yHJwccRGsoz570g3ofLnC1yNa2AWtXk4V0Xu7qUIXyHFWBK07h
7wyZ+KqlG8KYRVM2HDyFLZCd/K2XJvpkye7aqkVJobGRgEhQeGLCcUJcSsmzSxgE
gfJ+mBCeAnymCHL7H6WyP4OruHQRB/h+E61TqoiJqz+Pca+HBUFjYV5GT9ATl0+M
U2+mwHnrxo8McFJ+PMvqECHxsHz2nFQZrfiPoLC9wwKBgQD/mHJyPHmZIYeW00SP
kIXd3PtlFXfsUiNYxr/dGj/CGRr24yhMK3u5CIHD14XD/CUNkZBNKL+o5O0Iz/r5
dRli1W/v8eJQn3tuaHtzhBZpOGkZWtxtRcPsEHUo4E7n+4MOMC78i81Nc9bCvSNC
az1fQ62Fui+/oyuTFDkiscMAGwKBgQDMDJ2KK+cyrHtn1jtYqM8A+IeuiIch62sX
+G+VfijOJt2/JNZ/gaI1vONTfm+xI7NYiKXz2Y/0DLpqWng1ehVSbJTlTdKJbmL+
wN6WFF4DNBeKd/aHPfwUIl8+RDaEib14cDrHMg+LO20x/ZeKtcE8bpOfWPyOOsAz
8/T/eBOyWwKBgQDbiTKMAnujVtRibRaPhWAmH5/ixBzcY/SuVRAJNnmbGvs5IgXD
3vmHBdKHx3/CxbmBvQzH6X8t72vVTObSC42BgbiCzS1JeKKJQ779im/Bcs17FLsO
NIVDJyOqt3eu9C4uKp7BFseBhkTpwZEehIQTZksN+Mz4eot76jvlG/BVDwKBgDtn
0NXRQlY2cRch/9UoEFwv/xCJHw55A4zO/21+dVLPbe+gQfKNQzRx8Zz1Sn8/7Y7w
+Z+sz4Q10G/2Ntka2epNQmwf5BOu15Njg2oeM+Cq4c+mbVeibClQeHogUd70Wv0d
b39ey7e1bW0Ib34qvD9j0gaqWZzu7dYySDm4M8PRAoGBAOP5e9/3kaomt0NuUqMZ
1iTkJLjWiMcKJ69/voI7QTa2+1gN6JWVMk2DCJW4hKEmwYkFeD/7vpzBJhOC65AA
6RrNpRIYscfI+dSZd19fqpYCCLjzBXOEF1TKH5wTLp7KZQ9uNoxvab/I8M1dL+ii
o17BCGNY53MkS3/KweR8JO1u
-----END PRIVATE KEY-----
+59
View File
@@ -3,16 +3,21 @@
"workspaces": {
"": {
"name": "web",
"dependencies": {
"@iconify/svelte": "^4.2.0",
},
"devDependencies": {
"@sveltejs/vite-plugin-svelte": "^5.0.3",
"@tailwindcss/vite": "^4.0.15",
"@tsconfig/svelte": "^5.0.4",
"@types/w3c-web-nfc": "^1.0.4",
"sass-embedded": "^1.86.0",
"svelte": "^5.20.2",
"svelte-check": "^4.1.4",
"tailwindcss": "^4.0.15",
"typescript": "~5.7.2",
"vite": "^6.2.0",
"vite-plugin-mkcert": "^1.17.8",
"vite-plugin-singlefile": "^2.2.0",
},
},
@@ -72,6 +77,10 @@
"@esbuild/win32-x64": ["@esbuild/win32-x64@0.25.1", "", { "os": "win32", "cpu": "x64" }, "sha512-Y1EQdcfwMSeQN/ujR5VayLOJ1BHaK+ssyk0AEzPjC+t1lITgsnccPqFjb6V+LsTp/9Iov4ysfjxLaGJ9RPtkVg=="],
"@iconify/svelte": ["@iconify/svelte@4.2.0", "", { "dependencies": { "@iconify/types": "^2.0.0" }, "peerDependencies": { "svelte": ">4.0.0" } }, "sha512-fEl0T7SAPonK7xk6xUlRPDmFDZVDe2Z7ZstlqeDS/sS8ve2uyU+Qa8rTWbIqzZJlRvONkK5kVXiUf9nIc+6OOQ=="],
"@iconify/types": ["@iconify/types@2.0.0", "", {}, "sha512-+wluvCrRhXrhyOmRDJ3q8mux9JkKy5SJ/v8ol2tu4FVjyYvtEzkc/3pK15ET6RKg4b4w4BmTk1+gsCUhf21Ykg=="],
"@jridgewell/gen-mapping": ["@jridgewell/gen-mapping@0.3.8", "", { "dependencies": { "@jridgewell/set-array": "^1.2.1", "@jridgewell/sourcemap-codec": "^1.4.10", "@jridgewell/trace-mapping": "^0.3.24" } }, "sha512-imAbBGkb+ebQyxKgzv5Hu2nmROxoDOXHh80evxdoXNOrvAnVx7zimzc1Oo5h9RlfV4vPXaE2iM5pOFbvOCClWA=="],
"@jridgewell/resolve-uri": ["@jridgewell/resolve-uri@3.1.2", "", {}, "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw=="],
@@ -158,30 +167,52 @@
"@types/estree": ["@types/estree@1.0.6", "", {}, "sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw=="],
"@types/w3c-web-nfc": ["@types/w3c-web-nfc@1.0.4", "", {}, "sha512-AxTfPROOzdBhpBhrmwNn19gk36nK9SwRppSVe2C2y0TFuz/nzJ1m9oYC5DNoMeajEhHL44M+zxcH8GTkhgYteQ=="],
"acorn": ["acorn@8.14.1", "", { "bin": { "acorn": "bin/acorn" } }, "sha512-OvQ/2pUDKmgfCg++xsTX1wGxfTaszcHVcTctW4UJB4hibJx2HXxxO5UmVgyjMa+ZDsiaf5wWLXYpRWMmBI0QHg=="],
"aria-query": ["aria-query@5.3.2", "", {}, "sha512-COROpnaoap1E2F000S62r6A60uHZnmlvomhfyT2DlTcrY1OrBKn2UhH7qn5wTC9zMvD0AY7csdPSNwKP+7WiQw=="],
"asynckit": ["asynckit@0.4.0", "", {}, "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q=="],
"axios": ["axios@1.8.4", "", { "dependencies": { "follow-redirects": "^1.15.6", "form-data": "^4.0.0", "proxy-from-env": "^1.1.0" } }, "sha512-eBSYY4Y68NNlHbHBMdeDmKNtDgXWhQsJcGqzO3iLUM0GraQFSS9cVgPX5I9b3lbdFKyYoAEGAZF1DwhTaljNAw=="],
"axobject-query": ["axobject-query@4.1.0", "", {}, "sha512-qIj0G9wZbMGNLjLmg1PT6v2mE9AH2zlnADJD/2tC6E00hgmhUOfEB6greHPAfLRSufHqROIUTkw6E+M3lH0PTQ=="],
"braces": ["braces@3.0.3", "", { "dependencies": { "fill-range": "^7.1.1" } }, "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA=="],
"buffer-builder": ["buffer-builder@0.2.0", "", {}, "sha512-7VPMEPuYznPSoR21NE1zvd2Xna6c/CloiZCfcMXR1Jny6PjX0N4Nsa38zcBFo/FMK+BlA+FLKbJCQ0i2yxp+Xg=="],
"call-bind-apply-helpers": ["call-bind-apply-helpers@1.0.2", "", { "dependencies": { "es-errors": "^1.3.0", "function-bind": "^1.1.2" } }, "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ=="],
"chokidar": ["chokidar@4.0.3", "", { "dependencies": { "readdirp": "^4.0.1" } }, "sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA=="],
"clsx": ["clsx@2.1.1", "", {}, "sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA=="],
"colorjs.io": ["colorjs.io@0.5.2", "", {}, "sha512-twmVoizEW7ylZSN32OgKdXRmo1qg+wT5/6C3xu5b9QsWzSFAhHLn2xd8ro0diCsKfCj1RdaTP/nrcW+vAoQPIw=="],
"combined-stream": ["combined-stream@1.0.8", "", { "dependencies": { "delayed-stream": "~1.0.0" } }, "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg=="],
"debug": ["debug@4.4.0", "", { "dependencies": { "ms": "^2.1.3" } }, "sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA=="],
"deepmerge": ["deepmerge@4.3.1", "", {}, "sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A=="],
"delayed-stream": ["delayed-stream@1.0.0", "", {}, "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ=="],
"detect-libc": ["detect-libc@2.0.3", "", {}, "sha512-bwy0MGW55bG41VqxxypOsdSdGqLwXPI/focwgTYCFMbdUiBAxLg9CFzG08sz2aqzknwiX7Hkl0bQENjg8iLByw=="],
"dunder-proto": ["dunder-proto@1.0.1", "", { "dependencies": { "call-bind-apply-helpers": "^1.0.1", "es-errors": "^1.3.0", "gopd": "^1.2.0" } }, "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A=="],
"enhanced-resolve": ["enhanced-resolve@5.18.1", "", { "dependencies": { "graceful-fs": "^4.2.4", "tapable": "^2.2.0" } }, "sha512-ZSW3ma5GkcQBIpwZTSRAI8N71Uuwgs93IezB7mf7R60tC8ZbJideoDNKjHn2O9KIlx6rkGTTEk1xUCK2E1Y2Yg=="],
"es-define-property": ["es-define-property@1.0.1", "", {}, "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g=="],
"es-errors": ["es-errors@1.3.0", "", {}, "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw=="],
"es-object-atoms": ["es-object-atoms@1.1.1", "", { "dependencies": { "es-errors": "^1.3.0" } }, "sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA=="],
"es-set-tostringtag": ["es-set-tostringtag@2.1.0", "", { "dependencies": { "es-errors": "^1.3.0", "get-intrinsic": "^1.2.6", "has-tostringtag": "^1.0.2", "hasown": "^2.0.2" } }, "sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA=="],
"esbuild": ["esbuild@0.25.1", "", { "optionalDependencies": { "@esbuild/aix-ppc64": "0.25.1", "@esbuild/android-arm": "0.25.1", "@esbuild/android-arm64": "0.25.1", "@esbuild/android-x64": "0.25.1", "@esbuild/darwin-arm64": "0.25.1", "@esbuild/darwin-x64": "0.25.1", "@esbuild/freebsd-arm64": "0.25.1", "@esbuild/freebsd-x64": "0.25.1", "@esbuild/linux-arm": "0.25.1", "@esbuild/linux-arm64": "0.25.1", "@esbuild/linux-ia32": "0.25.1", "@esbuild/linux-loong64": "0.25.1", "@esbuild/linux-mips64el": "0.25.1", "@esbuild/linux-ppc64": "0.25.1", "@esbuild/linux-riscv64": "0.25.1", "@esbuild/linux-s390x": "0.25.1", "@esbuild/linux-x64": "0.25.1", "@esbuild/netbsd-arm64": "0.25.1", "@esbuild/netbsd-x64": "0.25.1", "@esbuild/openbsd-arm64": "0.25.1", "@esbuild/openbsd-x64": "0.25.1", "@esbuild/sunos-x64": "0.25.1", "@esbuild/win32-arm64": "0.25.1", "@esbuild/win32-ia32": "0.25.1", "@esbuild/win32-x64": "0.25.1" }, "bin": { "esbuild": "bin/esbuild" } }, "sha512-BGO5LtrGC7vxnqucAe/rmvKdJllfGaYWdyABvyMoXQlfYMb2bbRuReWR5tEGE//4LcNJj9XrkovTqNYRFZHAMQ=="],
"esm-env": ["esm-env@1.2.2", "", {}, "sha512-Epxrv+Nr/CaL4ZcFGPJIYLWFom+YeV1DqMLHJoEd9SYRxNbaFruBwfEX/kkHUJf55j2+TUbmDcmuilbP1TmXHA=="],
@@ -192,12 +223,30 @@
"fill-range": ["fill-range@7.1.1", "", { "dependencies": { "to-regex-range": "^5.0.1" } }, "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg=="],
"follow-redirects": ["follow-redirects@1.15.9", "", {}, "sha512-gew4GsXizNgdoRyqmyfMHyAmXsZDk6mHkSxZFCzW9gwlbtOW44CDtYavM+y+72qD/Vq2l550kMF52DT8fOLJqQ=="],
"form-data": ["form-data@4.0.2", "", { "dependencies": { "asynckit": "^0.4.0", "combined-stream": "^1.0.8", "es-set-tostringtag": "^2.1.0", "mime-types": "^2.1.12" } }, "sha512-hGfm/slu0ZabnNt4oaRZ6uREyfCj6P4fT/n6A1rGV+Z0VdGXjfOhVUpkn6qVQONHGIFwmveGXyDs75+nr6FM8w=="],
"fsevents": ["fsevents@2.3.3", "", { "os": "darwin" }, "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw=="],
"function-bind": ["function-bind@1.1.2", "", {}, "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA=="],
"get-intrinsic": ["get-intrinsic@1.3.0", "", { "dependencies": { "call-bind-apply-helpers": "^1.0.2", "es-define-property": "^1.0.1", "es-errors": "^1.3.0", "es-object-atoms": "^1.1.1", "function-bind": "^1.1.2", "get-proto": "^1.0.1", "gopd": "^1.2.0", "has-symbols": "^1.1.0", "hasown": "^2.0.2", "math-intrinsics": "^1.1.0" } }, "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ=="],
"get-proto": ["get-proto@1.0.1", "", { "dependencies": { "dunder-proto": "^1.0.1", "es-object-atoms": "^1.0.0" } }, "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g=="],
"gopd": ["gopd@1.2.0", "", {}, "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg=="],
"graceful-fs": ["graceful-fs@4.2.11", "", {}, "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ=="],
"has-flag": ["has-flag@4.0.0", "", {}, "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ=="],
"has-symbols": ["has-symbols@1.1.0", "", {}, "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ=="],
"has-tostringtag": ["has-tostringtag@1.0.2", "", { "dependencies": { "has-symbols": "^1.0.3" } }, "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw=="],
"hasown": ["hasown@2.0.2", "", { "dependencies": { "function-bind": "^1.1.2" } }, "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ=="],
"immutable": ["immutable@5.0.3", "", {}, "sha512-P8IdPQHq3lA1xVeBRi5VPqUm5HDgKnx0Ru51wZz5mjxHr5n3RWhjIpOFU7ybkUxfB+5IToy+OLaHYDBIWsv+uw=="],
"is-number": ["is-number@7.0.0", "", {}, "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng=="],
@@ -234,8 +283,14 @@
"magic-string": ["magic-string@0.30.17", "", { "dependencies": { "@jridgewell/sourcemap-codec": "^1.5.0" } }, "sha512-sNPKHvyjVf7gyjwS4xGTaW/mCnF8wnjtifKBEhxfZ7E/S8tQ0rssrwGNn6q8JH/ohItJfSQp9mBtQYuTlH5QnA=="],
"math-intrinsics": ["math-intrinsics@1.1.0", "", {}, "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g=="],
"micromatch": ["micromatch@4.0.8", "", { "dependencies": { "braces": "^3.0.3", "picomatch": "^2.3.1" } }, "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA=="],
"mime-db": ["mime-db@1.52.0", "", {}, "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg=="],
"mime-types": ["mime-types@2.1.35", "", { "dependencies": { "mime-db": "1.52.0" } }, "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw=="],
"mri": ["mri@1.2.0", "", {}, "sha512-tzzskb3bG8LvYGFF/mDTpq3jpI6Q9wc3LEmBaghu+DdCssd1FakN7Bc0hVNmEyGq1bq3RgfkCb3cmQLpNPOroA=="],
"ms": ["ms@2.1.3", "", {}, "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA=="],
@@ -248,6 +303,8 @@
"postcss": ["postcss@8.5.3", "", { "dependencies": { "nanoid": "^3.3.8", "picocolors": "^1.1.1", "source-map-js": "^1.2.1" } }, "sha512-dle9A3yYxlBSrt8Fu+IpjGT8SY8hN0mlaA6GY8t0P5PjIOZemULz/E2Bnm/2dcUOena75OTNkHI76uZBNUUq3A=="],
"proxy-from-env": ["proxy-from-env@1.1.0", "", {}, "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg=="],
"readdirp": ["readdirp@4.1.2", "", {}, "sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg=="],
"rollup": ["rollup@4.36.0", "", { "dependencies": { "@types/estree": "1.0.6" }, "optionalDependencies": { "@rollup/rollup-android-arm-eabi": "4.36.0", "@rollup/rollup-android-arm64": "4.36.0", "@rollup/rollup-darwin-arm64": "4.36.0", "@rollup/rollup-darwin-x64": "4.36.0", "@rollup/rollup-freebsd-arm64": "4.36.0", "@rollup/rollup-freebsd-x64": "4.36.0", "@rollup/rollup-linux-arm-gnueabihf": "4.36.0", "@rollup/rollup-linux-arm-musleabihf": "4.36.0", "@rollup/rollup-linux-arm64-gnu": "4.36.0", "@rollup/rollup-linux-arm64-musl": "4.36.0", "@rollup/rollup-linux-loongarch64-gnu": "4.36.0", "@rollup/rollup-linux-powerpc64le-gnu": "4.36.0", "@rollup/rollup-linux-riscv64-gnu": "4.36.0", "@rollup/rollup-linux-s390x-gnu": "4.36.0", "@rollup/rollup-linux-x64-gnu": "4.36.0", "@rollup/rollup-linux-x64-musl": "4.36.0", "@rollup/rollup-win32-arm64-msvc": "4.36.0", "@rollup/rollup-win32-ia32-msvc": "4.36.0", "@rollup/rollup-win32-x64-msvc": "4.36.0", "fsevents": "~2.3.2" }, "bin": { "rollup": "dist/bin/rollup" } }, "sha512-zwATAXNQxUcd40zgtQG0ZafcRK4g004WtEl7kbuhTWPvf07PsfohXl39jVUvPF7jvNAIkKPQ2XrsDlWuxBd++Q=="],
@@ -324,6 +381,8 @@
"vite": ["vite@6.2.2", "", { "dependencies": { "esbuild": "^0.25.0", "postcss": "^8.5.3", "rollup": "^4.30.1" }, "optionalDependencies": { "fsevents": "~2.3.3" }, "peerDependencies": { "@types/node": "^18.0.0 || ^20.0.0 || >=22.0.0", "jiti": ">=1.21.0", "less": "*", "lightningcss": "^1.21.0", "sass": "*", "sass-embedded": "*", "stylus": "*", "sugarss": "*", "terser": "^5.16.0", "tsx": "^4.8.1", "yaml": "^2.4.2" }, "optionalPeers": ["@types/node", "jiti", "less", "lightningcss", "sass", "sass-embedded", "stylus", "sugarss", "terser", "tsx", "yaml"], "bin": { "vite": "bin/vite.js" } }, "sha512-yW7PeMM+LkDzc7CgJuRLMW2Jz0FxMOsVJ8Lv3gpgW9WLcb9cTW+121UEr1hvmfR7w3SegR5ItvYyzVz1vxNJgQ=="],
"vite-plugin-mkcert": ["vite-plugin-mkcert@1.17.8", "", { "dependencies": { "axios": "^1.8.3", "debug": "^4.4.0", "picocolors": "^1.1.1" }, "peerDependencies": { "vite": ">=3" } }, "sha512-S+4tNEyGqdZQ3RLAG54ETeO2qyURHWrVjUWKYikLAbmhh/iJ+36gDEja4OWwFyXNuvyXcZwNt5TZZR9itPeG5Q=="],
"vite-plugin-singlefile": ["vite-plugin-singlefile@2.2.0", "", { "dependencies": { "micromatch": "^4.0.8" }, "peerDependencies": { "rollup": "^4.35.0", "vite": "^5.4.11 || ^6.0.0" } }, "sha512-Ik1wXmJaGzeQtUeIV7JprDUqqy6DlLzXAY27Blei5peE4c9VJF+Kp9xWDJeuX0RJUZmFbIAuw1/RAh06A+Ql7w=="],
"vitefu": ["vitefu@1.0.6", "", { "peerDependencies": { "vite": "^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0" }, "optionalPeers": ["vite"] }, "sha512-+Rex1GlappUyNN6UfwbVZne/9cYC4+R2XDk9xkNXBKMw6HQagdX9PgZ8V2v1WUSK1wfBLp7qbI1+XSNIlB1xmA=="],
+3 -2
View File
File diff suppressed because one or more lines are too long
+6 -1
View File
@@ -5,12 +5,14 @@
"@sveltejs/vite-plugin-svelte": "^5.0.3",
"@tailwindcss/vite": "^4.0.15",
"@tsconfig/svelte": "^5.0.4",
"@types/w3c-web-nfc": "^1.0.4",
"sass-embedded": "^1.86.0",
"svelte": "^5.20.2",
"svelte-check": "^4.1.4",
"tailwindcss": "^4.0.15",
"typescript": "~5.7.2",
"vite": "^6.2.0",
"vite-plugin-mkcert": "^1.17.8",
"vite-plugin-singlefile": "^2.2.0"
},
"private": true,
@@ -20,5 +22,8 @@
"preview": "vite preview",
"check": "svelte-check --tsconfig ./tsconfig.app.json && tsc -p tsconfig.node.json"
},
"type": "module"
"type": "module",
"dependencies": {
"@iconify/svelte": "^4.2.0"
}
}
+43 -3
View File
@@ -1,4 +1,5 @@
<script lang="ts">
import Icon from "@iconify/svelte";
import { post } from "./sdk";
import { slide } from "svelte/transition";
@@ -27,8 +28,8 @@
if (!/^\d{20}$/.test(inputCard) && !/^[0-9A-Fa-f]{16}$/.test(inputCard))
return error = "卡号格式不对"
cards.push({ id: inputCard, name: inputName })
cards = cards
// If already exist, remove existing
cards = [...cards.filter(c => c.id !== inputCard), { id: inputCard, name: inputName }]
localStorage.setItem("cards", JSON.stringify(cards))
inputCard = ""
inputName = ""
@@ -38,11 +39,41 @@
cards = cards.filter(c => c !== card)
localStorage.setItem("cards", JSON.stringify(cards))
}
const nfcAvail = 'NDEFReader' in window
let nfcScanning = false
async function startNFCScan() {
if (!nfcAvail) return error = "NFC 不支持"
if (nfcScanning) return
nfcScanning = true
try {
const ndef = new NDEFReader()
await ndef.scan()
ndef.onreadingerror = () => { error = "读取 NFC 失败,试试别的卡" }
ndef.onreading = ({message, serialNumber}: NDEFReadingEvent) => {
console.log(serialNumber, message)
const c = serialNumber?.toUpperCase().replaceAll(":", "")
if (!c) return error = "无法读取卡号"
if (c.startsWith("012E")) inputName = "FeliCa"
else inputName = "NFC Card"
// Force c to be 16-characters and starting with 012E
inputCard = "012E" + c.padStart(16, "0").slice(4, 16)
}
} catch (err) { error = `无法启动 NFC,请检查权限或设备支持: ${err}` }
}
</script>
<main>
<h1>AimeWeb</h1>
<p>点击一个卡就可以刷了,没有卡的话请先添加卡片。如果不知道卡号的话可以去 NFC Tools 扫</p>
<p>点击一个卡就可以刷了,没有卡的话请先在下面添加卡片。
{#if !nfcAvail} 如果不知道卡号的话可以用 NFC Tools App 扫 {/if}</p>
<div class="error">{error}</div>
<div class="cards flex flex-col gap-2">
@@ -77,6 +108,15 @@
<input id="add-name" placeholder="名称 (e.g. Aime)" bind:value={inputName}>
</div>
<button on:click={addCard}>添加</button>
{#if nfcAvail}
<button on:click={startNFCScan}>
{#if nfcScanning}
<Icon icon="line-md:loading-twotone-loop" /> NFC 扫描中...
{:else}
NFC 扫描
{/if}
</button>
{/if}
</div>
</main>
+8
View File
@@ -49,6 +49,11 @@ button
background-color: #1a1a1a
cursor: pointer
transition: border-color 0.25s
display: flex
align-items: center
justify-content: center
gap: 0.5rem
button:hover
border-color: #646cff
@@ -57,6 +62,9 @@ button:focus,
button:focus-visible
outline: 4px auto -webkit-focus-ring-color
svg.iconify
display: inline-block
// Expand and shrink (breathing) animation when clicked
//@keyframes breathing
// 0%
+2 -1
View File
@@ -14,7 +14,8 @@
"allowJs": true,
"checkJs": true,
"isolatedModules": true,
"moduleDetection": "force"
"moduleDetection": "force",
"experimentalDecorators": true
},
"include": ["src/**/*.ts", "src/**/*.js", "src/**/*.svelte"]
}
+4 -1
View File
@@ -2,12 +2,15 @@ import { defineConfig } from 'vite'
import { svelte } from '@sveltejs/vite-plugin-svelte'
import tailwindcss from '@tailwindcss/vite'
import { viteSingleFile } from "vite-plugin-singlefile"
import mkcert from 'vite-plugin-mkcert'
// https://vite.dev/config/
export default defineConfig({
server: { https: true },
plugins: [
svelte(),
tailwindcss(),
viteSingleFile()
viteSingleFile(),
mkcert()
],
})