Compare commits

...
3 Commits
Author SHA1 Message Date
539943419 ec5fcf1ee7 添加心跳包检测 2024-03-22 16:38:33 +08:00
539943419 127f58bd36 添加chat功能 2024-03-22 14:35:46 +08:00
539943419 08e7820f37 拆分部分文件 2024-03-21 20:37:10 +08:00
17 changed files with 1169 additions and 406 deletions

No files matched your search

+6 -4
View File
@@ -11,10 +11,12 @@
<script type="module" src="/src/main.js"></script> <script type="module" src="/src/main.js"></script>
<style> <style>
html,body,#app{ html,body,#app{
margin: 0; margin: 0;
padding: 0; padding: 0;
height: 100%; height: 100%;
display: flex; width:100%;
max-width: 100%;
display: flex;
} }
</style> </style>
</body> </body>
+3
View File
@@ -0,0 +1,3 @@
{
"PORT":17057
}
+106 -17
View File
@@ -9,21 +9,26 @@
"version": "1.2.0", "version": "1.2.0",
"dependencies": { "dependencies": {
"aes-js": "^3.1.2", "aes-js": "^3.1.2",
"better-sqlite3": "^8.7.0", "crypto-js": "^4.2.0",
"cors": "^2.8.5",
"express": "^4.18.2", "express": "^4.18.2",
"file-saver": "^2.0.5", "file-saver": "^2.0.5",
"js-base64": "^3.7.6", "js-base64": "^3.7.6",
"pinia": "^2.1.7", "pinia": "^2.1.7",
"sm-crypto": "^0.3.13", "sm-crypto": "^0.3.13",
"uuid": "^9.0.1",
"vicons": "^0.0.1", "vicons": "^0.0.1",
"vue": "^3.4.15", "vue": "^3.4.15",
"vue-clipboard3": "^2.0.0", "vue-clipboard3": "^2.0.0",
"vue-router": "^4.2.5" "vue-router": "^4.2.5",
"websocket-heartbeat-js": "^1.1.3",
"ws": "^8.16.0"
}, },
"devDependencies": { "devDependencies": {
"@vicons/ionicons5": "^0.12.0",
"@vitejs/plugin-vue": "^5.0.3", "@vitejs/plugin-vue": "^5.0.3",
"better-sqlite3": "^8.7.0",
"concurrently": "^8.2.2", "concurrently": "^8.2.2",
"cors": "^2.8.5",
"naive-ui": "^2.37.3", "naive-ui": "^2.37.3",
"vfonts": "^0.0.3", "vfonts": "^0.0.3",
"vite": "^5.0.11" "vite": "^5.0.11"
@@ -651,6 +656,12 @@
"@types/lodash": "*" "@types/lodash": "*"
} }
}, },
"node_modules/@vicons/ionicons5": {
"version": "0.12.0",
"resolved": "https://registry.npmmirror.com/@vicons/ionicons5/-/ionicons5-0.12.0.tgz",
"integrity": "sha512-Iy1EUVRpX0WWxeu1VIReR1zsZLMc4fqpt223czR+Rpnrwu7pt46nbnC2ycO7ItI/uqDLJxnbcMC7FujKs9IfFA==",
"dev": true
},
"node_modules/@vitejs/plugin-vue": { "node_modules/@vitejs/plugin-vue": {
"version": "5.0.3", "version": "5.0.3",
"resolved": "https://registry.npmmirror.com/@vitejs/plugin-vue/-/plugin-vue-5.0.3.tgz", "resolved": "https://registry.npmmirror.com/@vitejs/plugin-vue/-/plugin-vue-5.0.3.tgz",
@@ -811,12 +822,14 @@
"node_modules/base64-js": { "node_modules/base64-js": {
"version": "1.5.1", "version": "1.5.1",
"resolved": "https://registry.npmmirror.com/base64-js/-/base64-js-1.5.1.tgz", "resolved": "https://registry.npmmirror.com/base64-js/-/base64-js-1.5.1.tgz",
"integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==" "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==",
"dev": true
}, },
"node_modules/better-sqlite3": { "node_modules/better-sqlite3": {
"version": "8.7.0", "version": "8.7.0",
"resolved": "https://registry.npmmirror.com/better-sqlite3/-/better-sqlite3-8.7.0.tgz", "resolved": "https://registry.npmmirror.com/better-sqlite3/-/better-sqlite3-8.7.0.tgz",
"integrity": "sha512-99jZU4le+f3G6aIl6PmmV0cxUIWqKieHxsiF7G34CVFiE+/UabpYqkU0NJIkY/96mQKikHeBjtR27vFfs5JpEw==", "integrity": "sha512-99jZU4le+f3G6aIl6PmmV0cxUIWqKieHxsiF7G34CVFiE+/UabpYqkU0NJIkY/96mQKikHeBjtR27vFfs5JpEw==",
"dev": true,
"hasInstallScript": true, "hasInstallScript": true,
"dependencies": { "dependencies": {
"bindings": "^1.5.0", "bindings": "^1.5.0",
@@ -827,6 +840,7 @@
"version": "1.5.0", "version": "1.5.0",
"resolved": "https://registry.npmmirror.com/bindings/-/bindings-1.5.0.tgz", "resolved": "https://registry.npmmirror.com/bindings/-/bindings-1.5.0.tgz",
"integrity": "sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ==", "integrity": "sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ==",
"dev": true,
"dependencies": { "dependencies": {
"file-uri-to-path": "1.0.0" "file-uri-to-path": "1.0.0"
} }
@@ -835,6 +849,7 @@
"version": "4.1.0", "version": "4.1.0",
"resolved": "https://registry.npmmirror.com/bl/-/bl-4.1.0.tgz", "resolved": "https://registry.npmmirror.com/bl/-/bl-4.1.0.tgz",
"integrity": "sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==", "integrity": "sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==",
"dev": true,
"dependencies": { "dependencies": {
"buffer": "^5.5.0", "buffer": "^5.5.0",
"inherits": "^2.0.4", "inherits": "^2.0.4",
@@ -868,6 +883,7 @@
"version": "5.7.1", "version": "5.7.1",
"resolved": "https://registry.npmmirror.com/buffer/-/buffer-5.7.1.tgz", "resolved": "https://registry.npmmirror.com/buffer/-/buffer-5.7.1.tgz",
"integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==",
"dev": true,
"dependencies": { "dependencies": {
"base64-js": "^1.3.1", "base64-js": "^1.3.1",
"ieee754": "^1.1.13" "ieee754": "^1.1.13"
@@ -923,7 +939,8 @@
"node_modules/chownr": { "node_modules/chownr": {
"version": "1.1.4", "version": "1.1.4",
"resolved": "https://registry.npmmirror.com/chownr/-/chownr-1.1.4.tgz", "resolved": "https://registry.npmmirror.com/chownr/-/chownr-1.1.4.tgz",
"integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==" "integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==",
"dev": true
}, },
"node_modules/clipboard": { "node_modules/clipboard": {
"version": "2.0.11", "version": "2.0.11",
@@ -1027,6 +1044,7 @@
"version": "2.8.5", "version": "2.8.5",
"resolved": "https://registry.npmmirror.com/cors/-/cors-2.8.5.tgz", "resolved": "https://registry.npmmirror.com/cors/-/cors-2.8.5.tgz",
"integrity": "sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==", "integrity": "sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==",
"dev": true,
"dependencies": { "dependencies": {
"object-assign": "^4", "object-assign": "^4",
"vary": "^1" "vary": "^1"
@@ -1035,6 +1053,11 @@
"node": ">= 0.10" "node": ">= 0.10"
} }
}, },
"node_modules/crypto-js": {
"version": "4.2.0",
"resolved": "https://registry.npmmirror.com/crypto-js/-/crypto-js-4.2.0.tgz",
"integrity": "sha512-KALDyEYgpY+Rlob/iriUtjV6d5Eq+Y191A5g4UqLAi8CyGP9N1+FdVbkc1SxKc2r4YAYqG8JzO2KGL+AizD70Q=="
},
"node_modules/css-render": { "node_modules/css-render": {
"version": "0.15.12", "version": "0.15.12",
"resolved": "https://registry.npmmirror.com/css-render/-/css-render-0.15.12.tgz", "resolved": "https://registry.npmmirror.com/css-render/-/css-render-0.15.12.tgz",
@@ -1089,6 +1112,7 @@
"version": "6.0.0", "version": "6.0.0",
"resolved": "https://registry.npmmirror.com/decompress-response/-/decompress-response-6.0.0.tgz", "resolved": "https://registry.npmmirror.com/decompress-response/-/decompress-response-6.0.0.tgz",
"integrity": "sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==", "integrity": "sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==",
"dev": true,
"dependencies": { "dependencies": {
"mimic-response": "^3.1.0" "mimic-response": "^3.1.0"
}, },
@@ -1100,6 +1124,7 @@
"version": "0.6.0", "version": "0.6.0",
"resolved": "https://registry.npmmirror.com/deep-extend/-/deep-extend-0.6.0.tgz", "resolved": "https://registry.npmmirror.com/deep-extend/-/deep-extend-0.6.0.tgz",
"integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==", "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==",
"dev": true,
"engines": { "engines": {
"node": ">=4.0.0" "node": ">=4.0.0"
} }
@@ -1144,6 +1169,7 @@
"version": "2.0.2", "version": "2.0.2",
"resolved": "https://registry.npmmirror.com/detect-libc/-/detect-libc-2.0.2.tgz", "resolved": "https://registry.npmmirror.com/detect-libc/-/detect-libc-2.0.2.tgz",
"integrity": "sha512-UX6sGumvvqSaXgdKGUsgZWqcUyIXZ/vZTrlRT/iobiKhGL0zL4d3osHj3uqllWJK+i+sixDS/3COVEOFbupFyw==", "integrity": "sha512-UX6sGumvvqSaXgdKGUsgZWqcUyIXZ/vZTrlRT/iobiKhGL0zL4d3osHj3uqllWJK+i+sixDS/3COVEOFbupFyw==",
"dev": true,
"engines": { "engines": {
"node": ">=8" "node": ">=8"
} }
@@ -1171,6 +1197,7 @@
"version": "1.4.4", "version": "1.4.4",
"resolved": "https://registry.npmmirror.com/end-of-stream/-/end-of-stream-1.4.4.tgz", "resolved": "https://registry.npmmirror.com/end-of-stream/-/end-of-stream-1.4.4.tgz",
"integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==",
"dev": true,
"dependencies": { "dependencies": {
"once": "^1.4.0" "once": "^1.4.0"
} }
@@ -1266,6 +1293,7 @@
"version": "2.0.3", "version": "2.0.3",
"resolved": "https://registry.npmmirror.com/expand-template/-/expand-template-2.0.3.tgz", "resolved": "https://registry.npmmirror.com/expand-template/-/expand-template-2.0.3.tgz",
"integrity": "sha512-XYfuKMvj4O35f/pOXLObndIRvyQ+/+6AhODh+OKWj9S9498pHHn/IMszH+gt0fBCRWMNfk1ZSp5x3AifmnI2vg==", "integrity": "sha512-XYfuKMvj4O35f/pOXLObndIRvyQ+/+6AhODh+OKWj9S9498pHHn/IMszH+gt0fBCRWMNfk1ZSp5x3AifmnI2vg==",
"dev": true,
"engines": { "engines": {
"node": ">=6" "node": ">=6"
} }
@@ -1319,7 +1347,8 @@
"node_modules/file-uri-to-path": { "node_modules/file-uri-to-path": {
"version": "1.0.0", "version": "1.0.0",
"resolved": "https://registry.npmmirror.com/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz", "resolved": "https://registry.npmmirror.com/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz",
"integrity": "sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==" "integrity": "sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==",
"dev": true
}, },
"node_modules/finalhandler": { "node_modules/finalhandler": {
"version": "1.2.0", "version": "1.2.0",
@@ -1357,7 +1386,8 @@
"node_modules/fs-constants": { "node_modules/fs-constants": {
"version": "1.0.0", "version": "1.0.0",
"resolved": "https://registry.npmmirror.com/fs-constants/-/fs-constants-1.0.0.tgz", "resolved": "https://registry.npmmirror.com/fs-constants/-/fs-constants-1.0.0.tgz",
"integrity": "sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==" "integrity": "sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==",
"dev": true
}, },
"node_modules/fsevents": { "node_modules/fsevents": {
"version": "2.3.3", "version": "2.3.3",
@@ -1405,7 +1435,8 @@
"node_modules/github-from-package": { "node_modules/github-from-package": {
"version": "0.0.0", "version": "0.0.0",
"resolved": "https://registry.npmmirror.com/github-from-package/-/github-from-package-0.0.0.tgz", "resolved": "https://registry.npmmirror.com/github-from-package/-/github-from-package-0.0.0.tgz",
"integrity": "sha512-SyHy3T1v2NUXn29OsWdxmK6RwHD+vkj3v8en8AOBZ1wBQ/hCAQ5bAQTD02kW4W9tUp/3Qh6J8r9EvntiyCmOOw==" "integrity": "sha512-SyHy3T1v2NUXn29OsWdxmK6RwHD+vkj3v8en8AOBZ1wBQ/hCAQ5bAQTD02kW4W9tUp/3Qh6J8r9EvntiyCmOOw==",
"dev": true
}, },
"node_modules/good-listener": { "node_modules/good-listener": {
"version": "1.2.2", "version": "1.2.2",
@@ -1505,7 +1536,8 @@
"node_modules/ieee754": { "node_modules/ieee754": {
"version": "1.2.1", "version": "1.2.1",
"resolved": "https://registry.npmmirror.com/ieee754/-/ieee754-1.2.1.tgz", "resolved": "https://registry.npmmirror.com/ieee754/-/ieee754-1.2.1.tgz",
"integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==" "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==",
"dev": true
}, },
"node_modules/inherits": { "node_modules/inherits": {
"version": "2.0.4", "version": "2.0.4",
@@ -1515,7 +1547,8 @@
"node_modules/ini": { "node_modules/ini": {
"version": "1.3.8", "version": "1.3.8",
"resolved": "https://registry.npmmirror.com/ini/-/ini-1.3.8.tgz", "resolved": "https://registry.npmmirror.com/ini/-/ini-1.3.8.tgz",
"integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==" "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==",
"dev": true
}, },
"node_modules/ipaddr.js": { "node_modules/ipaddr.js": {
"version": "1.9.1", "version": "1.9.1",
@@ -1560,6 +1593,7 @@
"version": "6.0.0", "version": "6.0.0",
"resolved": "https://registry.npmmirror.com/lru-cache/-/lru-cache-6.0.0.tgz", "resolved": "https://registry.npmmirror.com/lru-cache/-/lru-cache-6.0.0.tgz",
"integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==",
"dev": true,
"dependencies": { "dependencies": {
"yallist": "^4.0.0" "yallist": "^4.0.0"
}, },
@@ -1633,6 +1667,7 @@
"version": "3.1.0", "version": "3.1.0",
"resolved": "https://registry.npmmirror.com/mimic-response/-/mimic-response-3.1.0.tgz", "resolved": "https://registry.npmmirror.com/mimic-response/-/mimic-response-3.1.0.tgz",
"integrity": "sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==", "integrity": "sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==",
"dev": true,
"engines": { "engines": {
"node": ">=10" "node": ">=10"
} }
@@ -1640,12 +1675,14 @@
"node_modules/minimist": { "node_modules/minimist": {
"version": "1.2.8", "version": "1.2.8",
"resolved": "https://registry.npmmirror.com/minimist/-/minimist-1.2.8.tgz", "resolved": "https://registry.npmmirror.com/minimist/-/minimist-1.2.8.tgz",
"integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==" "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==",
"dev": true
}, },
"node_modules/mkdirp-classic": { "node_modules/mkdirp-classic": {
"version": "0.5.3", "version": "0.5.3",
"resolved": "https://registry.npmmirror.com/mkdirp-classic/-/mkdirp-classic-0.5.3.tgz", "resolved": "https://registry.npmmirror.com/mkdirp-classic/-/mkdirp-classic-0.5.3.tgz",
"integrity": "sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A==" "integrity": "sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A==",
"dev": true
}, },
"node_modules/ms": { "node_modules/ms": {
"version": "2.0.0", "version": "2.0.0",
@@ -1696,7 +1733,8 @@
"node_modules/napi-build-utils": { "node_modules/napi-build-utils": {
"version": "1.0.2", "version": "1.0.2",
"resolved": "https://registry.npmmirror.com/napi-build-utils/-/napi-build-utils-1.0.2.tgz", "resolved": "https://registry.npmmirror.com/napi-build-utils/-/napi-build-utils-1.0.2.tgz",
"integrity": "sha512-ONmRUqK7zj7DWX0D9ADe03wbwOBZxNAfF20PlGfCWQcD3+/MakShIHrMqx9YwPTfxDdF1zLeL+RGZiR9kGMLdg==" "integrity": "sha512-ONmRUqK7zj7DWX0D9ADe03wbwOBZxNAfF20PlGfCWQcD3+/MakShIHrMqx9YwPTfxDdF1zLeL+RGZiR9kGMLdg==",
"dev": true
}, },
"node_modules/negotiator": { "node_modules/negotiator": {
"version": "0.6.3", "version": "0.6.3",
@@ -1710,6 +1748,7 @@
"version": "3.54.0", "version": "3.54.0",
"resolved": "https://registry.npmmirror.com/node-abi/-/node-abi-3.54.0.tgz", "resolved": "https://registry.npmmirror.com/node-abi/-/node-abi-3.54.0.tgz",
"integrity": "sha512-p7eGEiQil0YUV3ItH4/tBb781L5impVmmx2E9FRKF7d18XXzp4PGT2tdYMFY6wQqgxD0IwNZOiSJ0/K0fSi/OA==", "integrity": "sha512-p7eGEiQil0YUV3ItH4/tBb781L5impVmmx2E9FRKF7d18XXzp4PGT2tdYMFY6wQqgxD0IwNZOiSJ0/K0fSi/OA==",
"dev": true,
"dependencies": { "dependencies": {
"semver": "^7.3.5" "semver": "^7.3.5"
}, },
@@ -1721,6 +1760,7 @@
"version": "4.1.1", "version": "4.1.1",
"resolved": "https://registry.npmmirror.com/object-assign/-/object-assign-4.1.1.tgz", "resolved": "https://registry.npmmirror.com/object-assign/-/object-assign-4.1.1.tgz",
"integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==",
"dev": true,
"engines": { "engines": {
"node": ">=0.10.0" "node": ">=0.10.0"
} }
@@ -1745,6 +1785,7 @@
"version": "1.4.0", "version": "1.4.0",
"resolved": "https://registry.npmmirror.com/once/-/once-1.4.0.tgz", "resolved": "https://registry.npmmirror.com/once/-/once-1.4.0.tgz",
"integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==",
"dev": true,
"dependencies": { "dependencies": {
"wrappy": "1" "wrappy": "1"
} }
@@ -1828,6 +1869,7 @@
"version": "7.1.1", "version": "7.1.1",
"resolved": "https://registry.npmmirror.com/prebuild-install/-/prebuild-install-7.1.1.tgz", "resolved": "https://registry.npmmirror.com/prebuild-install/-/prebuild-install-7.1.1.tgz",
"integrity": "sha512-jAXscXWMcCK8GgCoHOfIr0ODh5ai8mj63L2nWrjuAgXE6tDyYGnx4/8o/rCgU+B4JSyZBKbeZqzhtwtC3ovxjw==", "integrity": "sha512-jAXscXWMcCK8GgCoHOfIr0ODh5ai8mj63L2nWrjuAgXE6tDyYGnx4/8o/rCgU+B4JSyZBKbeZqzhtwtC3ovxjw==",
"dev": true,
"dependencies": { "dependencies": {
"detect-libc": "^2.0.0", "detect-libc": "^2.0.0",
"expand-template": "^2.0.3", "expand-template": "^2.0.3",
@@ -1865,6 +1907,7 @@
"version": "3.0.0", "version": "3.0.0",
"resolved": "https://registry.npmmirror.com/pump/-/pump-3.0.0.tgz", "resolved": "https://registry.npmmirror.com/pump/-/pump-3.0.0.tgz",
"integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==",
"dev": true,
"dependencies": { "dependencies": {
"end-of-stream": "^1.1.0", "end-of-stream": "^1.1.0",
"once": "^1.3.1" "once": "^1.3.1"
@@ -1907,6 +1950,7 @@
"version": "1.2.8", "version": "1.2.8",
"resolved": "https://registry.npmmirror.com/rc/-/rc-1.2.8.tgz", "resolved": "https://registry.npmmirror.com/rc/-/rc-1.2.8.tgz",
"integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==", "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==",
"dev": true,
"dependencies": { "dependencies": {
"deep-extend": "^0.6.0", "deep-extend": "^0.6.0",
"ini": "~1.3.0", "ini": "~1.3.0",
@@ -1921,6 +1965,7 @@
"version": "3.6.2", "version": "3.6.2",
"resolved": "https://registry.npmmirror.com/readable-stream/-/readable-stream-3.6.2.tgz", "resolved": "https://registry.npmmirror.com/readable-stream/-/readable-stream-3.6.2.tgz",
"integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==",
"dev": true,
"dependencies": { "dependencies": {
"inherits": "^2.0.3", "inherits": "^2.0.3",
"string_decoder": "^1.1.1", "string_decoder": "^1.1.1",
@@ -2011,6 +2056,7 @@
"version": "7.6.0", "version": "7.6.0",
"resolved": "https://registry.npmmirror.com/semver/-/semver-7.6.0.tgz", "resolved": "https://registry.npmmirror.com/semver/-/semver-7.6.0.tgz",
"integrity": "sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg==", "integrity": "sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg==",
"dev": true,
"dependencies": { "dependencies": {
"lru-cache": "^6.0.0" "lru-cache": "^6.0.0"
}, },
@@ -2107,12 +2153,14 @@
"node_modules/simple-concat": { "node_modules/simple-concat": {
"version": "1.0.1", "version": "1.0.1",
"resolved": "https://registry.npmmirror.com/simple-concat/-/simple-concat-1.0.1.tgz", "resolved": "https://registry.npmmirror.com/simple-concat/-/simple-concat-1.0.1.tgz",
"integrity": "sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q==" "integrity": "sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q==",
"dev": true
}, },
"node_modules/simple-get": { "node_modules/simple-get": {
"version": "4.0.1", "version": "4.0.1",
"resolved": "https://registry.npmmirror.com/simple-get/-/simple-get-4.0.1.tgz", "resolved": "https://registry.npmmirror.com/simple-get/-/simple-get-4.0.1.tgz",
"integrity": "sha512-brv7p5WgH0jmQJr1ZDDfKDOSeWWg+OVypG99A/5vYGPqJ6pxiaHLy8nxtFjBA7oMa01ebA9gfh1uMCFqOuXxvA==", "integrity": "sha512-brv7p5WgH0jmQJr1ZDDfKDOSeWWg+OVypG99A/5vYGPqJ6pxiaHLy8nxtFjBA7oMa01ebA9gfh1uMCFqOuXxvA==",
"dev": true,
"dependencies": { "dependencies": {
"decompress-response": "^6.0.0", "decompress-response": "^6.0.0",
"once": "^1.3.1", "once": "^1.3.1",
@@ -2153,6 +2201,7 @@
"version": "1.3.0", "version": "1.3.0",
"resolved": "https://registry.npmmirror.com/string_decoder/-/string_decoder-1.3.0.tgz", "resolved": "https://registry.npmmirror.com/string_decoder/-/string_decoder-1.3.0.tgz",
"integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==",
"dev": true,
"dependencies": { "dependencies": {
"safe-buffer": "~5.2.0" "safe-buffer": "~5.2.0"
} }
@@ -2187,6 +2236,7 @@
"version": "2.0.1", "version": "2.0.1",
"resolved": "https://registry.npmmirror.com/strip-json-comments/-/strip-json-comments-2.0.1.tgz", "resolved": "https://registry.npmmirror.com/strip-json-comments/-/strip-json-comments-2.0.1.tgz",
"integrity": "sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==", "integrity": "sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==",
"dev": true,
"engines": { "engines": {
"node": ">=0.10.0" "node": ">=0.10.0"
} }
@@ -2207,6 +2257,7 @@
"version": "2.1.1", "version": "2.1.1",
"resolved": "https://registry.npmmirror.com/tar-fs/-/tar-fs-2.1.1.tgz", "resolved": "https://registry.npmmirror.com/tar-fs/-/tar-fs-2.1.1.tgz",
"integrity": "sha512-V0r2Y9scmbDRLCNex/+hYzvp/zyYjvFbHPNgVTKfQvVrb6guiE/fxP+XblDNR011utopbkex2nM4dHNV6GDsng==", "integrity": "sha512-V0r2Y9scmbDRLCNex/+hYzvp/zyYjvFbHPNgVTKfQvVrb6guiE/fxP+XblDNR011utopbkex2nM4dHNV6GDsng==",
"dev": true,
"dependencies": { "dependencies": {
"chownr": "^1.1.1", "chownr": "^1.1.1",
"mkdirp-classic": "^0.5.2", "mkdirp-classic": "^0.5.2",
@@ -2218,6 +2269,7 @@
"version": "2.2.0", "version": "2.2.0",
"resolved": "https://registry.npmmirror.com/tar-stream/-/tar-stream-2.2.0.tgz", "resolved": "https://registry.npmmirror.com/tar-stream/-/tar-stream-2.2.0.tgz",
"integrity": "sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==", "integrity": "sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==",
"dev": true,
"dependencies": { "dependencies": {
"bl": "^4.0.3", "bl": "^4.0.3",
"end-of-stream": "^1.4.1", "end-of-stream": "^1.4.1",
@@ -2267,6 +2319,7 @@
"version": "0.6.0", "version": "0.6.0",
"resolved": "https://registry.npmmirror.com/tunnel-agent/-/tunnel-agent-0.6.0.tgz", "resolved": "https://registry.npmmirror.com/tunnel-agent/-/tunnel-agent-0.6.0.tgz",
"integrity": "sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==", "integrity": "sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==",
"dev": true,
"dependencies": { "dependencies": {
"safe-buffer": "^5.0.1" "safe-buffer": "^5.0.1"
}, },
@@ -2297,7 +2350,8 @@
"node_modules/util-deprecate": { "node_modules/util-deprecate": {
"version": "1.0.2", "version": "1.0.2",
"resolved": "https://registry.npmmirror.com/util-deprecate/-/util-deprecate-1.0.2.tgz", "resolved": "https://registry.npmmirror.com/util-deprecate/-/util-deprecate-1.0.2.tgz",
"integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==" "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==",
"dev": true
}, },
"node_modules/utils-merge": { "node_modules/utils-merge": {
"version": "1.0.1", "version": "1.0.1",
@@ -2307,6 +2361,14 @@
"node": ">= 0.4.0" "node": ">= 0.4.0"
} }
}, },
"node_modules/uuid": {
"version": "9.0.1",
"resolved": "https://registry.npmmirror.com/uuid/-/uuid-9.0.1.tgz",
"integrity": "sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA==",
"bin": {
"uuid": "dist/bin/uuid"
}
},
"node_modules/vary": { "node_modules/vary": {
"version": "1.1.2", "version": "1.1.2",
"resolved": "https://registry.npmmirror.com/vary/-/vary-1.1.2.tgz", "resolved": "https://registry.npmmirror.com/vary/-/vary-1.1.2.tgz",
@@ -2462,6 +2524,11 @@
"vue": "^3.0.11" "vue": "^3.0.11"
} }
}, },
"node_modules/websocket-heartbeat-js": {
"version": "1.1.3",
"resolved": "https://registry.npmmirror.com/websocket-heartbeat-js/-/websocket-heartbeat-js-1.1.3.tgz",
"integrity": "sha512-wiCMVsWK7KflVCC5f+rSTyzILDZX88A7BJfdJXt5THNDut7uUNP83r5AvdZ1El/8yOwGujC7K3iuxj96CT4gbQ=="
},
"node_modules/wrap-ansi": { "node_modules/wrap-ansi": {
"version": "7.0.0", "version": "7.0.0",
"resolved": "https://registry.npmmirror.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz", "resolved": "https://registry.npmmirror.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz",
@@ -2479,7 +2546,28 @@
"node_modules/wrappy": { "node_modules/wrappy": {
"version": "1.0.2", "version": "1.0.2",
"resolved": "https://registry.npmmirror.com/wrappy/-/wrappy-1.0.2.tgz", "resolved": "https://registry.npmmirror.com/wrappy/-/wrappy-1.0.2.tgz",
"integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==" "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==",
"dev": true
},
"node_modules/ws": {
"version": "8.16.0",
"resolved": "https://registry.npmmirror.com/ws/-/ws-8.16.0.tgz",
"integrity": "sha512-HS0c//TP7Ina87TfiPUz1rQzMhHrl/SG2guqRcTOIUYD2q8uhUdNHZYJUaQ8aTGPzCh+c6oawMKW35nFl1dxyQ==",
"engines": {
"node": ">=10.0.0"
},
"peerDependencies": {
"bufferutil": "^4.0.1",
"utf-8-validate": ">=5.0.2"
},
"peerDependenciesMeta": {
"bufferutil": {
"optional": true
},
"utf-8-validate": {
"optional": true
}
}
}, },
"node_modules/y18n": { "node_modules/y18n": {
"version": "5.0.8", "version": "5.0.8",
@@ -2493,7 +2581,8 @@
"node_modules/yallist": { "node_modules/yallist": {
"version": "4.0.0", "version": "4.0.0",
"resolved": "https://registry.npmmirror.com/yallist/-/yallist-4.0.0.tgz", "resolved": "https://registry.npmmirror.com/yallist/-/yallist-4.0.0.tgz",
"integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==",
"dev": true
}, },
"node_modules/yargs": { "node_modules/yargs": {
"version": "17.7.2", "version": "17.7.2",
+11 -5
View File
@@ -4,29 +4,35 @@
"private": true, "private": true,
"type": "module", "type": "module",
"scripts": { "scripts": {
"dev": "vite", "vite": "vite",
"server": "concurrently \"node server.js\" \"node server_page.js\"", "dev": "concurrently \"node server.js\" \"vite\"",
"server": "concurrently \"node server.js\"",
"miaoShare": "concurrently \"node server.js\" \"vite\"", "miaoShare": "concurrently \"node server.js\" \"vite\"",
"build": "vite build", "build": "vite build",
"preview": "vite preview" "preview": "vite preview"
}, },
"dependencies": { "dependencies": {
"aes-js": "^3.1.2", "aes-js": "^3.1.2",
"crypto-js": "^4.2.0",
"express": "^4.18.2", "express": "^4.18.2",
"file-saver": "^2.0.5", "file-saver": "^2.0.5",
"js-base64": "^3.7.6", "js-base64": "^3.7.6",
"pinia": "^2.1.7", "pinia": "^2.1.7",
"sm-crypto": "^0.3.13", "sm-crypto": "^0.3.13",
"uuid": "^9.0.1",
"vicons": "^0.0.1", "vicons": "^0.0.1",
"vue": "^3.4.15", "vue": "^3.4.15",
"vue-clipboard3": "^2.0.0", "vue-clipboard3": "^2.0.0",
"vue-router": "^4.2.5" "vue-router": "^4.2.5",
"websocket-heartbeat-js": "^1.1.3",
"ws": "^8.16.0"
}, },
"devDependencies": { "devDependencies": {
"better-sqlite3": "^8.7.0", "@vicons/ionicons5": "^0.12.0",
"cors": "^2.8.5",
"@vitejs/plugin-vue": "^5.0.3", "@vitejs/plugin-vue": "^5.0.3",
"better-sqlite3": "^8.7.0",
"concurrently": "^8.2.2", "concurrently": "^8.2.2",
"cors": "^2.8.5",
"naive-ui": "^2.37.3", "naive-ui": "^2.37.3",
"vfonts": "^0.0.3", "vfonts": "^0.0.3",
"vite": "^5.0.11" "vite": "^5.0.11"
+370 -164
View File
@@ -1,213 +1,419 @@
import express from 'express' import express from "express";
import cors from 'cors' import cors from "cors";
import Database from 'better-sqlite3'; import Database from "better-sqlite3";
import fs from "fs" import fs from "fs";
import { WebSocketServer } from "ws";
import http from "http";
import { v4 as uuid4 } from "uuid";
// import Config from "./miaoShareConfig.json"
const HOST = "0.0.0.0";
// const PORT = Config.PORT
const HOST = '0.0.0.0' const PORT = 17057;
const PORT = '17058'
const fileDir = "./temp"; const fileDir = "./temp";
const dbPath = './miaoShare.db' const dbPath = "./miaoShare.db";
const PATH = "./dist";
// 上传文件最大大小:200MB // 上传文件最大大小:200MB
const uploadMaxSize=200*1024*1024 const uploadMaxSize = 200 * 1024 * 1024;
// 一天的毫秒数 // 一天的毫秒数
const millisecondsOfTheDay = parseInt(24*3600*1000) const millisecondsOfOneDay = parseInt(24 * 3600 * 1000);
// 文件3天过期 // 文件3天过期
const LifeOfFile=millisecondsOfTheDay*3 const LifeOfFile = millisecondsOfOneDay * 3;
// const LifeOfFile=0 // const LifeOfFile=0
// 数据库相关 // 数据库相关
const db = new Database(dbPath, { verbose: null }); const db = new Database(dbPath, { verbose: null });
db.prepare(`CREATE TABLE IF NOT EXISTS id2fileName ( db.prepare(
`CREATE TABLE IF NOT EXISTS id2fileName (
id CHAR(8) PRIMARY KEY NOT NULL UNIQUE, id CHAR(8) PRIMARY KEY NOT NULL UNIQUE,
fileName TEXT NOT NULL, fileName TEXT NOT NULL,
timestamp INT NOT NULL, timestamp INT NOT NULL,
freeze tinyint(1) NOT NULL, freeze tinyint(1) NOT NULL,
downloadCredit INT NOT NULL downloadCredit INT NOT NULL
);`).run() );`
const stmt_getFileName = db.prepare(`SELECT fileName FROM id2fileName WHERE id = ?`) ).run();
const stmt_getTimestamp = db.prepare(`SELECT timestamp FROM id2fileName WHERE id = ?`) const stmt_getFileName = db.prepare(`SELECT fileName FROM id2fileName WHERE id = ?`);
const stmt_getFreeze = db.prepare(`SELECT freeze FROM id2fileName WHERE id = ?`) const stmt_getTimestamp = db.prepare(`SELECT timestamp FROM id2fileName WHERE id = ?`);
const stmt_getDownloadCredit = db.prepare(`SELECT downloadCredit FROM id2fileName WHERE id = ?`) const stmt_getFreeze = db.prepare(`SELECT freeze FROM id2fileName WHERE id = ?`);
const stmt_getFreezenIDs = db.prepare(`SELECT id FROM id2fileName WHERE freeze = 1`) const stmt_getDownloadCredit = db.prepare(`SELECT downloadCredit FROM id2fileName WHERE id = ?`);
const stmt_insertId2FileName = db.prepare(`INSERT INTO id2fileName (id, fileName, timestamp, freeze, downloadCredit) VALUES (?, ?, ?, ?, ?)`) const stmt_getFreezenIDs = db.prepare(`SELECT id FROM id2fileName WHERE freeze = 1`);
const stmt_deleteExpireData = db.prepare(`DELETE FROM id2fileName WHERE freeze=1`) const stmt_insertId2FileName = db.prepare(`INSERT INTO id2fileName (id, fileName, timestamp, freeze, downloadCredit) VALUES (?, ?, ?, ?, ?)`);
const stmt_freezeExpireData = db.prepare(`UPDATE id2fileName SET freeze=1 WHERE timestamp < ? OR downloadCredit < 1`) const stmt_deleteExpireData = db.prepare(`DELETE FROM id2fileName WHERE freeze=1`);
const stmt_updateDownloadCredit = db.prepare(`UPDATE id2fileName SET downloadCredit=downloadCredit-1 WHERE id = ?`) const stmt_freezeExpireData = db.prepare(`UPDATE id2fileName SET freeze=1 WHERE timestamp < ? OR downloadCredit < 1`);
const stmt_updateDownloadCredit = db.prepare(`UPDATE id2fileName SET downloadCredit=downloadCredit-1 WHERE id = ?`);
const db_insert = (id,fileName,downloadCredit)=>{ const db_insert = (id, fileName, downloadCredit) => {
stmt_insertId2FileName.run(id,fileName,parseInt(Date.now()),0,downloadCredit) stmt_insertId2FileName.run(id, fileName, parseInt(Date.now()), 0, downloadCredit);
} };
const db_getFileName = (id)=>{ const db_getFileName = id => {
try{ try {
if(stmt_getFreeze.get(id)['freeze'] == 1)return null if (stmt_getFreeze.get(id)["freeze"] == 1) return null;
return stmt_getFileName.get(id)['fileName'] return stmt_getFileName.get(id)["fileName"];
}catch(e){ } catch (e) {
return null return null;
} }
} };
// 检查是否可下载 // 检查是否可下载
const db_downloadable = (id)=>{ const db_downloadable = id => {
try{ try {
// 懒 // 懒
if(stmt_getDownloadCredit.get(id)['downloadCredit'] < 1)return false if (stmt_getDownloadCredit.get(id)["downloadCredit"] < 1) return false;
if(stmt_getFreeze.get(id)['freeze'] == 1)return false if (stmt_getFreeze.get(id)["freeze"] == 1) return false;
return true return true;
}catch(e){ } catch (e) {
return false return false;
} }
} };
const db_updateDownloadCredit = (id)=>{ const db_updateDownloadCredit = id => {
try{ try {
stmt_updateDownloadCredit.run(id) stmt_updateDownloadCredit.run(id);
return true return true;
}catch(e){ } catch (e) {
return false return false;
} }
} };
const db_getTimestamp = (id)=>{ const db_getTimestamp = id => {
return stmt_getTimestamp.get(id)['timestamp'] return stmt_getTimestamp.get(id)["timestamp"];
} };
// 更新存储的文件,删除已经被冻结的文件以及相关记录,然后冻结过期文件 // 更新存储的文件,删除已经被冻结的文件以及相关记录,然后冻结过期文件
const updateFiles = ()=>{ const updateDBAndFiles = () => {
try{ try {
let rows = stmt_getFreezenIDs.all() let rows = stmt_getFreezenIDs.all();
stmt_deleteExpireData.run() stmt_deleteExpireData.run();
for(let row of rows){ for (let row of rows) {
let fileName = row['id'] let fileName = row["id"];
let path = fileDir + '/' + fileName let path = fileDir + "/" + fileName;
try{ try {
fs.unlink(path,(e)=>{if(e)throw e}) fs.unlink(path, e => {
}catch(e){ if (e) throw e;
console.log(e) });
continue } catch (e) {
} console.log(e);
} continue;
stmt_freezeExpireData.run(parseInt(Date.now()) - LifeOfFile) }
}catch(e){ }
console.log(e) stmt_freezeExpireData.run(parseInt(Date.now()) - LifeOfFile);
return } catch (e) {
} console.log(e);
} return;
updateFiles() }
};
updateDBAndFiles();
// 3小时更新一次 // 3小时更新一次
setInterval(updateFiles,1000*3600*3) setInterval(updateDBAndFiles, 1000 * 3600 * 3);
// // 测试环境一分钟更新一次,记得注释掉
// setInterval(updateDBAndFiles, 1000 * 60);
const app = express();
var app = express();
app.use(cors()); app.use(cors());
var tempMap = {} app.options("*", cors());
// var tempMap = {}
if (!fs.existsSync(fileDir)) { if (!fs.existsSync(fileDir)) {
fs.mkdirSync(fileDir); fs.mkdirSync(fileDir);
} }
function generateId(){ function generateId(isGID) {
var returnStr = "", var returnStr = "",
range = 8, range = 8,
charStr = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789'; charStr = "ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";
for(var i=0; i<range; i++){ for (var i = 0; i < range; i++) {
var index = Math.round(Math.random() * 35); if (isGID === true && i == 0) {
returnStr += charStr.substring(index,index+1); var index = parseInt(Math.random() * 26);
} } else {
return returnStr; var index = parseInt(Math.random() * 36);
}
returnStr += charStr.substring(index, index + 1);
}
return returnStr;
} }
// 上传文件接口 // 上传文件接口
function uploadFile(req, res, fileName, downloadCredit){ function uploadFile(req, res, fileName, downloadCredit) {
let id = generateId(); let id = generateId();
const fileStream = fs.createWriteStream(fileDir + '/' + id); const fileStream = fs.createWriteStream(fileDir + "/" + id);
db_insert(id,fileName,downloadCredit) db_insert(id, fileName, downloadCredit);
// tempMap[id] = fileName; // tempMap[id] = fileName;
// console.log(tempMap); // console.log(tempMap);
req.pipe(fileStream); req.pipe(fileStream);
res.on('data',(c)=>{console.log(c)}) res.on("data", c => {
req.on("end", function () { console.log(c);
fileStream.end(); });
res.statusCode = 200; req.on("end", function () {
res.end(id); fileStream.end();
}); res.statusCode = 200;
req.on("error", err => { res.end(id);
fileStream.end(); });
res.statusCode = 500; req.on("error", err => {
res.end("File save failed: " + err.message); fileStream.end();
}); res.statusCode = 500;
res.end("File save failed: " + err.message);
});
} }
function downloadFile(req, res, fileId){ function downloadFile(req, res, fileId) {
try { try {
if(db_downloadable(fileId) == false){ if (db_downloadable(fileId) == false) {
res.writeHead(404); res.writeHead(404);
res.end(null); res.end(null);
return return;
} }
db_updateDownloadCredit(fileId) db_updateDownloadCredit(fileId);
var fileName = db_getFileName(fileId) var fileName = db_getFileName(fileId);
if(fileName == null){ if (fileName == null) {
res.writeHead(404); res.writeHead(404);
res.end(null); res.end(null);
return return;
} }
let data = fs.readFileSync(fileDir + '/' + fileId); let data = fs.readFileSync(fileDir + "/" + fileId);
res.writeHead(200, { res.writeHead(200, {
"Content-Type": "application/octet-stream ", "Content-Type": "application/octet-stream ",
"File-Name": fileName, "File-Name": fileName,
'Content-Length':data.length, "Content-Length": data.length
}); });
res.end(data); res.end(data);
} catch (err) { } catch (err) {
console.log(err); console.log(err);
res.writeHead(404); res.writeHead(404);
res.end(null); res.end(null);
} }
} }
// 设置一些通用的中间件 app.use(express.static(PATH));
// app.use(bodyParser.json());
// app.use(bodyParser.urlencoded({extended: true}));
// app.all() // app.all()
app.post('/file/upload', function(req, res){ app.post("/file/upload", function (req, res) {
res.header("Access-Control-Allow-Origin", "*"); res.header("Access-Control-Allow-Origin", "*");
res.header("Access-Control-Allow-Headers", "*"); res.header("Access-Control-Allow-Headers", "*");
res.header("Access-Control-Allow-Methods", "POST"); res.header("Access-Control-Allow-Methods", "POST");
res.header("Access-Control-Expose-Headers", "File-Name"); res.header("Access-Control-Expose-Headers", "File-Name");
var fileSize = parseInt(req.get('Content-Length')) var fileSize = parseInt(req.get("Content-Length"));
var fileName = req.query.fileName; var fileName = req.query.fileName;
var downloadCredit = parseInt(req.query.downloadCredit); var downloadCredit = parseInt(req.query.downloadCredit);
if(downloadCredit == -1)downloadCredit = 2147483647 if (downloadCredit == -1) downloadCredit = 2147483647;
if(!fileName){ if (!fileName) {
res.statusCode = 500; res.statusCode = 500;
res.end("FileName Not Found"); res.end("FileName Not Found");
}else if(fileSize > uploadMaxSize){ } else if (fileSize > uploadMaxSize) {
res.statusCode = 500; res.statusCode = 500;
res.end("Maximum size limit exceeded"); res.end("Maximum size limit exceeded");
} } else {
else{ uploadFile(req, res, fileName, downloadCredit);
uploadFile(req, res, fileName, downloadCredit); }
}
}); });
app.get('/file/download', function(req, res){ app.get("/file/download", function (req, res) {
res.header("Access-Control-Allow-Origin", "*"); res.header("Access-Control-Allow-Origin", "*");
res.header("Access-Control-Allow-Headers", "*"); res.header("Access-Control-Allow-Headers", "*");
res.header("Access-Control-Allow-Methods", "GET"); res.header("Access-Control-Allow-Methods", "GET");
res.header("Access-Control-Expose-Headers", "File-Name"); res.header("Access-Control-Expose-Headers", "File-Name");
var fileId = req.query.fileName; var fileId = req.query.fileName;
if(!fileId){ if (!fileId) {
res.statusCode = 500; res.statusCode = 500;
res.end("FileName Not Found"); res.end("FileName Not Found");
}else{ } else {
downloadFile(req, res, fileId); downloadFile(req, res, fileId);
} }
}); });
// 启动服务器 // // 启动服务器
app.listen(PORT, HOST, function(){ // app.listen(PORT, HOST, function(){
// console.log('Example app listening on port ' + PORT + '.'); // console.log(app)
// // console.log(`miaoShare server listening on ${}`)
// });
const server = http.createServer(app);
const wss = new WebSocketServer({ server });
// 先实现最低限度功能,暂时不考虑身份认证
const groupsMap = {};
// 三天不活跃的群组将被清除
const LifeOfGroup = millisecondsOfOneDay * 3;
// const LifeOfGroup = 0;
// 根据uuid查询加入的群组
const uuid2Groups={}
db.exec(
`CREATE TABLE IF NOT EXISTS GROUPS (
gID CHAR(8) PRIMARY KEY UNIQUE NOT NULL,
verify TEXT NOT NULL,
activeTimestamp INT NOT NULL
);`
);
const stmt_getExpiredGroups = db.prepare(`SELECT gID FROM GROUPS WHERE activeTimestamp < ? `);
const stmt_getGroupVerify = db.prepare(`SELECT verify FROM GROUPS WHERE gID = ? `);
const stmt_insertGROUPS = db.prepare(`INSERT INTO GROUPS (gID,verify, activeTimestamp) VALUES (?, ?, ?)`);
const stmt_updateGROUPS_ActiveTimestamp = db.prepare(`UPDATE GROUPS SET activeTimestamp=? WHERE gID=?`);
const stmt_deleteGroup = db.prepare(`DELETE FROM GROUPS WHERE gID=?`);
const generateStmt_insertMessage_map = {};
const updateGROUPS = () => {
// console.log(1)
try {
let gIDs = stmt_getExpiredGroups.all(parseInt(Date.now()) - LifeOfGroup);
for (let row of gIDs) {
let gID = row.gID;
db.exec(`DROP TABLE IF EXISTS ${gID}`);
stmt_deleteGroup.run(gID);
}
} catch (e) {
console.log(e);
return;
}
};
updateGROUPS();
setInterval(updateGROUPS, 1000 * 3600 * 3);
// 创建群组的数据库
function createGroupTableDB(gID, verify) {
db.exec(
`CREATE TABLE IF NOT EXISTS ${gID} (
message TEXT NOT NULL,
type TEXT NOT NULL,
sender TEXT NOT NULL,
timestamp INT NOT NULL
);`
);
stmt_insertGROUPS.run(gID, verify, parseInt(Date.now()));
}
// 插入信息
function insertMessageByGID(gID, msg, from) {
if (!generateStmt_insertMessage_map[gID]) {
generateStmt_insertMessage_map[gID] = db.prepare(`INSERT INTO ${gID} (message,type,sender, timestamp) VALUES (?, ?, ?, ?)`);
}
generateStmt_insertMessage_map[gID].run(msg, "gMsg", from, parseInt(Date.now()));
}
function updateActiveTimestamp(gID) {
stmt_updateGROUPS_ActiveTimestamp.run(parseInt(Date.now()), gID);
}
function createGroup(verify) {
// 暂时不考虑id随机生成时重复的问题
let gID = generateId(true);
groupsMap[gID] = { verify, member: [], msgHistory: [] };
createGroupTableDB(gID, verify);
return gID;
}
function getGroupVerify(gID) {
initMsgHistory(gID)
return groupsMap[gID].verify;
}
// 正式加入群组
function joinGroup(socket, gID, callback) {
initMsgHistory(gID)
groupsMap[gID].member.push(socket);
updateActiveTimestamp(gID);
callback();
}
// 暂时这么写
function getHistory(gID) {
initMsgHistory(gID)
return groupsMap[gID].msgHistory;
}
function broadcastMsg(gID, msg, from) {
initMsgHistory(gID)
updateActiveTimestamp(gID);
insertMessageByGID(gID, msg, from);
let bmsg = JSON.stringify({ type: "gMsg", gID, msg });
groupsMap[gID].msgHistory.push({ type: "gMsg", msg, from });
for (let socket of groupsMap[gID].member) {
socket.send(bmsg);
}
}
function initMsgHistory(gID){
if (!groupsMap[gID]) {
let verify = stmt_getGroupVerify.get(gID).verify;
// 暂时这么写
let msgHistory = db
.prepare(`SELECT message,type FROM ${gID}`)
.all()
.map(v => {
return { msg: v.message, type: v.type };
});
// console.log(msgHistory)
groupsMap[gID] = { verify, member: [], msgHistory };
}
}
// 灵车
wss.on("connection", socket => {
console.log("新的连接已建立");
const no = wss.clients.size;
const joinedGroup = [];
var uuid = uuid4();
function setUuid(new_uuid){
uuid = new_uuid
}
socket.on("message", message => {
try {
console.log(message.toString());
let msg = JSON.parse(message.toString());
if (msg.type) {
let type = msg.type;
// 创建群组
if (type === "create") {
socket.send(JSON.stringify({ type: "sMsg", type1: "create", gID: createGroup(msg.verify) }));
} else if (type === "join") {
// 加入群组——客端验证key
if (msg.type1 === "verify") {
// 已经加入则return
if (joinedGroup.includes(msg.gID)) {
return;
}
socket.send(JSON.stringify({ type: "sMsg", type1: "joinVerify", verify: getGroupVerify(msg.gID), gID: msg.gID }));
} else if (msg.type1 === "success") {
if (joinedGroup.includes(msg.gID)) {
return;
}
// 成功加入
joinGroup(socket, msg.gID, () => {
joinedGroup.push(msg.gID);
// 不考虑失败属于是
socket.send(JSON.stringify({ type: "sMsg", gID: msg.gID, type1: "history", history: JSON.stringify(getHistory(msg.gID)) }));
});
}
} else if (type === "message") {
let gID = msg.gID;
broadcastMsg(gID, msg.msg,uuid);
} else if (type === "heartbeat") {
socket.send(JSON.stringify({ type: "sMsg", type1: "heartbeat" }));
} else if (type === "uuid") {
if (msg.type1 === "get") {
socket.send(JSON.stringify({ type: "sMsg", type1: "uuid", uuid }));
} else if (msg.type1 === "set") {
uuid = msg.uuid
}
}
}
} catch (e) {
console.log(e);
}
});
socket.on("close", () => {
for (let gID of joinedGroup) {
groupsMap[gID].member = groupsMap[gID].member.filter(v => v !== socket);
}
console.log(`No.${no} exit.`);
console.log(groupsMap);
});
}); });
server.listen(PORT, HOST, () => {});
+2
View File
@@ -1,3 +1,5 @@
// 已废弃
import express from 'express' import express from 'express'
const HOST = '0.0.0.0' const HOST = '0.0.0.0'
+87 -17
View File
@@ -1,8 +1,50 @@
<script setup> <script setup>
import uploadFileMiao from "./components/uploadFileMiao.vue"; import upload from "./views/uploadFileMiao.vue";
import downloadFileMiao from "./components/downloadFileMiao.vue"; import download from "./views/downloadFileMiao.vue";
import settingMiao from "./components/setting.vue"; import setting from "./views/setting.vue";
import {NNotificationProvider,NMessageProvider,NCard,NTabs,NTabPane} from 'naive-ui' import chat from "./views/chat.vue";
import { NNotificationProvider, NMessageProvider, NCard, NMenu, NIcon } from 'naive-ui'
import { ref, watch, h ,shallowRef} from "vue";
// import { RouterView, useRouter } from "vue-router";
import {
ArrowUpCircleOutline as uploadIcon,
ArrowDownCircleOutline as downloadIcon,
ChatboxEllipsesOutline as chatIcon,
SettingsOutline as settingIcon
} from '@vicons/ionicons5'
const activePage = ref('upload')
const isComponent = shallowRef(upload)
watch(activePage, () => {
isComponent.value={upload,download,setting,chat}[activePage.value]
})
function renderIcon(icon) {
return () => h(NIcon, null, { default: () => h(icon) })
}
const menuOptions = [
{
label: '上传',
key: 'upload',
icon: renderIcon(uploadIcon),
},
{
label: '下载',
key: 'download',
icon: renderIcon(downloadIcon),
},
{
label: 'Chat',
key: 'chat',
icon: renderIcon(chatIcon),
},
{
label: '设置',
key: 'setting',
icon: renderIcon(settingIcon),
}
]
</script> </script>
@@ -12,17 +54,35 @@ import {NNotificationProvider,NMessageProvider,NCard,NTabs,NTabPane} from 'naive
<n-notification-provider placement="bottom-right" :max="3"> <n-notification-provider placement="bottom-right" :max="3">
<n-message-provider> <n-message-provider>
<n-card content-style="padding: 0; margin:0;" id="theCard"> <n-card content-style="padding: 0; margin:0;" id="theCard">
<n-tabs type="line" size="large" :tabs-padding="20" pane-style="padding: 20px;"> <div id="menu">
<n-tab-pane name="上传文件"> <n-menu mode="horizontal" :responsive="true" v-model:value="activePage" :options="menuOptions" :icon-size="26"></n-menu>
<uploadFileMiao style /> </div>
</n-tab-pane>
<n-tab-pane name="下载文件"> <div style="padding: 20px;">
<downloadFileMiao style/> <KeepAlive>
</n-tab-pane> <component :is="isComponent"></component>
<n-tab-pane name="设置"> </KeepAlive>
<settingMiao style="max-width:100%" /> <!-- <router-view v-slot="{ Component }">
</n-tab-pane> <keep-alive :include=['uploadFileMiao']>
</n-tabs> <component :is="Component" :key="$route.fullPath"/>
</keep-alive>
</router-view> -->
</div>
<!-- <n-tabs type="line" size="large" :tabs-padding="20" pane-style="padding: 20px;"
display-directive="show">
<n-tab-pane name="上传文件">
<uploadFileMiao style />
</n-tab-pane>
<n-tab-pane name="下载文件">
<downloadFileMiao style />
</n-tab-pane>
<n-tab-pane name="miaoChat">
<chat style />
</n-tab-pane>
<n-tab-pane name="设置">
<settingMiao style="max-width:100%" />
</n-tab-pane>
</n-tabs> -->
</n-card> </n-card>
</n-message-provider> </n-message-provider>
</n-notification-provider> </n-notification-provider>
@@ -39,9 +99,19 @@ import {NNotificationProvider,NMessageProvider,NCard,NTabs,NTabPane} from 'naive
justify-content: center; justify-content: center;
align-items: center; align-items: center;
} }
#theCard { #theCard {
width: 50%; width: 40vw;
height: 80%; height: 90vh;
}
#menu{
width: 100%;
height: auto;
/* background-color: blue; */
padding-top: 5px;
border-bottom: 1px solid rgb(60, 60, 60, 0.1);
user-select: none
} }
@media screen and (max-width:768px) { @media screen and (max-width:768px) {
#theCard { #theCard {
+76
View File
@@ -0,0 +1,76 @@
import aesjs from "aes-js";
import { Base64 } from "js-base64";
import { saveAs } from "file-saver";
import { sm4 } from "sm-crypto";
const blob2Uint8Array = function (blob) {
return new Promise((resolve, reject) => {
let reader = new FileReader();
reader.readAsArrayBuffer(blob);
reader.onload = function () {
let buffer = reader.result;
let uint8array = new Uint8Array(buffer);
resolve(uint8array);
};
reader.onerror = function () {
reject(reader.error);
};
});
};
const decrypt = (key, data) => {
key = key.trim()
return blob2Uint8Array(data).then(data => {
// 无加密
if (key.length === 0) {
return data;
}
// SM4
if (key.length === 19) {
key = [...aesjs.utils.utf8.toBytes(key.substring(3))];
// console.log([...data])
var decryptedBytes = new Uint8Array(sm4.decrypt([...data], key, { output: "array" }));
return decryptedBytes;
} else {
// AES
key = aesjs.utils.utf8.toBytes(key);
var aesCtr = new aesjs.ModeOfOperation.ctr(key, new aesjs.Counter(5));
var decryptedBytes = aesCtr.decrypt(data);
return decryptedBytes;
}
});
};
const decryptString = (key, str) => {
key = key.trim()
console.log(key.length)
// 无加密
if (key.length === 0) {
// return sm4.decrypt(str, "miaospringmiaospringmiaospringao");
return Base64.decode(str)
}
// SM4
// console.log(key,key.length)
if (key.length === 19) {
key = [...aesjs.utils.utf8.toBytes(key.substring(3))];
return sm4.decrypt(str, key);
}
// AES
var data = new Uint8Array(
Base64.decode(str)
.split(",")
.map(n => parseInt(n))
);
key = aesjs.utils.utf8.toBytes(key);
var aesCtr = new aesjs.ModeOfOperation.ctr(key, new aesjs.Counter(5));
var decryptedBytes = aesCtr.decrypt(data);
var decryptedStr = aesjs.utils.utf8.fromBytes(decryptedBytes);
return decryptedStr;
};
const downloadFromUint8Array = (data, fileName) => {
let uint8Array = data;
let blob = new Blob([uint8Array], { type: "text/plain" });
// 使用file-saver.js
saveAs(blob, fileName);
};
export { blob2Uint8Array, decrypt, decryptString, downloadFromUint8Array };
+111
View File
@@ -0,0 +1,111 @@
import aesjs from "aes-js";
import { Base64 } from "js-base64";
import { sm4 } from 'sm-crypto'
// const setting = useSettingStore();
// const message = useMessage();
// 生成密钥
const generateKey = function(setting) {
if(setting.activeFuction === "不加密"){
return ''
}
var charMap = ""
for(let i of setting.activeKeyMap){
if(i === 'A-Z'){
charMap = charMap + 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'
}else if(i === "a-z"){
charMap = charMap + 'abcdefghijklmnopqrstuvwxyz'
}else if(i === '0-9'){
charMap = charMap + '0123456789'
}
}
var returnStr = "",
length = setting.activeFuction !== "AES256" ? 16 : 32
// charMap = "ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";
for (var i = 0; i < length; i++) {
var index = parseInt(Math.random() * charMap.length);
returnStr += charMap.substring(index, index + 1);
}
if(setting.activeFuction === "SM4"){
returnStr = 'SM4' + returnStr
}
// console.log(returnStr,returnStr.length)
return returnStr;
};
const blob2Uint8Array = function(blob) {
return new Promise((resolve, reject) => {
let reader = new FileReader();
reader.readAsArrayBuffer(blob);
reader.onload = function() {
let buffer = reader.result;
let uint8array = new Uint8Array(buffer);
resolve(uint8array);
};
reader.onerror = function() {
reject(reader.error);
};
});
};
const AES = (key,data)=>{
key = aesjs.utils.utf8.toBytes(key);
var aesCtr = new aesjs.ModeOfOperation.ctr(key, new aesjs.Counter(5));
var encryptedBytes = aesCtr.encrypt(data);
return encryptedBytes;
}
const SM4 = (key,data)=>{
// console.log(key)
var encryptedBytes = sm4.encrypt(data,key,{padding: 'pkcs#7',output:'array'});
// console.log(encryptedBytes, sm4.decrypt(encryptedBytes, key,{output:'array'}))
return new Uint8Array(encryptedBytes);
}
const encrypt = (key, data, fileName, setting, message) => {
// if(!encryptFunction){
// encryptFunction = setting.activeFuction
// }
let encryptFunction = {0:'不加密',16:'AES128',19:'SM4',32:'AES256'}[key.length]
return blob2Uint8Array(data).then(data => {
let encrypted_data = null
if(encryptFunction === "不加密"|| key === ''){
encrypted_data = data
// AES
}else if(encryptFunction != "SM4"){
message.info(`开始加密${fileName}`);
encrypted_data = AES(key,data)
message.info(`${fileName}加密完成`);
// SM4
}else{
message.info(`开始加密${fileName}`);
key = [...aesjs.utils.utf8.toBytes(key.substring(3))];
encrypted_data = SM4(key,data)
message.info(`${fileName}加密完成`);
}
return encrypted_data
});
};
// setting为pinia存储的setting。。。
const encryptString = (key, str, setting) => {
// if(!encryptFunction){
// encryptFunction = setting.activeFuction
// }
// console.log(key,key.length)
let encryptFunction = {0:'不加密',16:'AES128',19:'SM4',32:'AES256'}[key.length]
if(encryptFunction === "不加密" || key === ''){
// return sm4.encrypt(str, 'miaospringmiaospringmiaospringao')
return Base64.encode(str)
}else if(encryptFunction !== "SM4"){
key = aesjs.utils.utf8.toBytes(key);
var data = aesjs.utils.utf8.toBytes(str);
var aesCtr = new aesjs.ModeOfOperation.ctr(key, new aesjs.Counter(5));
var encryptedBytes = aesCtr.encrypt(data);
return Base64.encode(encryptedBytes);
}else{
key = [...aesjs.utils.utf8.toBytes(key.substring(3))];
// console.log(key)
return sm4.encrypt(str, key)
}
};
export {encrypt,encryptString,generateKey}
+2 -2
View File
@@ -3,7 +3,7 @@ import 'vfonts/Lato.css'
import { createApp } from "vue"; import { createApp } from "vue";
import App from "./App.vue"; import App from "./App.vue";
import router from "./router"; // import router from "./router";
// import naive from "naive-ui"; // import naive from "naive-ui";
import { createPinia } from "pinia"; import { createPinia } from "pinia";
@@ -14,7 +14,7 @@ import { createPinia } from "pinia";
const pinia = createPinia() const pinia = createPinia()
const app = createApp(App); const app = createApp(App);
app.use(router); // app.use(router);
app.use(pinia); app.use(pinia);
// app.use(naive); // app.use(naive);
+2 -1
View File
@@ -1,4 +1,5 @@
import { defineStore } from "pinia"; import { defineStore } from "pinia";
import config from "../../miaoShareConfig.json"
var activeFuctionLocal = localStorage.getItem('activeFuction') var activeFuctionLocal = localStorage.getItem('activeFuction')
@@ -17,7 +18,7 @@ export const useSettingStore = defineStore("setting", {
state: () => ({ state: () => ({
activeFuction: activeFuctionLocal, activeFuction: activeFuctionLocal,
activeKeyMap:JSON.parse(activeKeyMap), activeKeyMap:JSON.parse(activeKeyMap),
serverPort:"17058" serverPort:config.PORT
}), }),
getters: { getters: {
// double: state => state.count * 2 // double: state => state.count * 2
+42 -14
View File
@@ -1,22 +1,50 @@
// 未使用
import { createRouter, createWebHistory } from 'vue-router' import { createRouter, createWebHistory } from 'vue-router'
// import HomeView from '../views/HomeView.vue' import uploadFileMiao from "../views/uploadFileMiao.vue";
import downloadFileMiao from "../views/downloadFileMiao.vue";
import settingMiao from "../views/setting.vue";
import chat from "../views/chat.vue";
const router = createRouter({ const router = createRouter({
history: createWebHistory(import.meta.env.BASE_URL), history: createWebHistory(import.meta.env.BASE_URL),
routes: [ routes: [
// { {
// path: '/', path: '/',
// name: 'home', redirect: '/upload',
// component: HomeView },
// }, {
// { path: '/upload',
// path: '/about', name: 'upload',
// name: 'about', component: uploadFileMiao,
// // route level code-splitting meta: {
// // this generates a separate chunk (About.[hash].js) for this route keepAlive: true,
// // which is lazy-loaded when the route is visited. }
// component: () => import('../views/AboutView.vue') },
// } {
path: '/download',
name: 'download',
component: downloadFileMiao,
meta: {
keepAlive: true,
}
},
{
path: '/setting',
name: 'setting',
component: settingMiao,
meta: {
keepAlive: true,
}
},
{
path: '/chat',
name: 'chat',
component: chat,
meta: {
keepAlive: true,
}
},
] ]
}) })
+171
View File
@@ -0,0 +1,171 @@
<template>
<n-button @click="createGroup">
createTest
</n-button>
<n-text> createTest gID:{{ gID }}<br />key:{{ key }}<br />code:{{ gID+key }}</n-text>
<n-input
v-model:value="codeInput"
type="textarea"
placeholder="测试加入群组"
/>
<n-button @click="joinGroup(codeInput)">
joinTest
</n-button>
<n-input
v-model:value="msg"
type="textarea"
placeholder="测试发送信息"
/>
<n-button @click="sendMsg(codeInput.substring(0,8),msg)">
sendMsgTest
</n-button>
<n-button @click="data.length = 0">
clearMsg
</n-button>
<n-data-table
:columns="columns"
:data="data"
:row-props="null"
:max-height="250"
:bordered="false"
:single-line="false"
/>
</template>
<script setup>
import {ref} from 'vue'
import {NText,NDataTable,NButton,NInput} from 'naive-ui'
import { useSettingStore } from "@/pinia/store";
import { generateKey,encryptString } from '@/func/upload';
import { decryptString } from '@/func/download';
import WebsocketHeartbeatJs from 'websocket-heartbeat-js';
const setting = useSettingStore();
const serverPort = setting.serverPort;
const baseUrl = 'ws' + "://" + location.hostname + ":" + serverPort;
const columns = [
{
title: "from",
key: "from"
},
{
title: "message",
key: "msg"
},
];
const data = ref([])
const gID = ref('')
const codeInput = ref('')
const key = ref('')
const msg = ref('')
const joinedGroup = []
const uuid = ref('')
const gID2key = {}
const options = {
url: baseUrl,
pingTimeout: 20000,
pongTimeout: 10000,
reconnectTimeout: 3000,
pingMsg: JSON.stringify({type:'heartbeat'})
}
let socket = new WebsocketHeartbeatJs(options);
// const socket = new WebSocket(baseUrl);
// socket.addEventListener("open", (event) => {
// // socket.send("");
// });
socket.onmessage= (event) => {
const msg = JSON.parse(event.data)
data.value.push({from:'server',msg:event.data})
if(msg.type){
let type = msg.type
if(type === 'sMsg'){
let type1 = msg.type1
if(type1 === 'create'){
gID.value=msg.gID
}else if(type1 === 'joinVerify'){
let gID = msg.gID
let key = gID2key[gID].key
// console.log(gID2key,gID,key)
let res = decryptString(key,msg.verify)
console.log(res,key,msg.verify)
if(res === 'miaoSpring'){
socket.send(JSON.stringify({type:'join',type1:'success',gID}))
joinedGroup.push(msg.gID)
}
}else if(type1 === 'history'){
let gID = msg.gID
let key = gID2key[gID].key
for(let m of JSON.parse(msg.history)){
data.value.push({from:'decrypt',msg:decryptString(key,m.msg)})
}
}else if(type1 === 'uuid'){
uuid.value = msg.uuid
}
}else if(type === 'gMsg'){
let gID = msg.gID
let key = gID2key[gID].key
data.value.push({from:'decrypt',msg:decryptString(key,msg.msg)})
}
}
};
socket.onopen = ()=>{
if(uuid.value){
socket.send(JSON.stringify({type:'uuid',type1:'set',uuid:uuid.value}))
}else{
socket.send(JSON.stringify({type:'uuid',type1:'get'}))
}
console.log(joinedGroup)
let toJoin = [...joinedGroup]
joinedGroup.length = 0
for(let gID of toJoin){
let code = gID+gID2key[gID].key
console.log(code)
joinGroup(code)
}
}
socket.onreconnect = (e) => {
console.log('reconnecting...');
}
function createGroup(){
let keyt = generateKey(setting)
key.value = keyt
socket.send(JSON.stringify({type:'create',verify:encryptString(keyt,'miaoSpring',setting)}))
}
function joinGroup(code){
var gID = code.substring(0, 8);
var key = code.substring(8);
if(joinedGroup.includes(gID)){
return
}
gID2key[gID] = {}
gID2key[gID].key = key
joinGroup_Verify(gID)
}
function joinGroup_Verify(gID){
socket.send(JSON.stringify({type:'join',type1:'verify',gID}))
}
function sendMsg(gID,msg){
let key = gID2key[gID].key
msg = encryptString(key,msg,setting)
socket.send(JSON.stringify({type:'message',msg,gID}))
}
</script>
<style>
</style>
@@ -22,17 +22,15 @@
:max-height="250" :max-height="250"
:bordered="false" :bordered="false"
:single-line="false" :single-line="false"
style="user-select: none;"
/> />
</div> </div>
</template> </template>
<script setup> <script setup>
import { ref, onMounted } from "vue"; import { ref, onMounted } from "vue";
import aesjs from "aes-js";
import { Base64 } from "js-base64";
import { saveAs } from "file-saver";
import { useSettingStore } from "@/pinia/store"; import { useSettingStore } from "@/pinia/store";
import { sm4 } from "sm-crypto"; import {decrypt, decryptString, downloadFromUint8Array} from '../func/download'
import {NInput,NFlex,NDataTable,NButton} from 'naive-ui' import {NInput,NFlex,NDataTable,NButton} from 'naive-ui'
var downloadFileID = ref(); var downloadFileID = ref();
@@ -46,83 +44,85 @@ var baseUrl =
location.protocol + "//" + location.hostname + ":" + serverPort + "/"; location.protocol + "//" + location.hostname + ":" + serverPort + "/";
// console.log(baseUrl); // console.log(baseUrl);
const blob2Uint8Array = function(blob) { // const blob2Uint8Array = function(blob) {
return new Promise((resolve, reject) => { // return new Promise((resolve, reject) => {
let reader = new FileReader(); // let reader = new FileReader();
reader.readAsArrayBuffer(blob); // reader.readAsArrayBuffer(blob);
reader.onload = function() { // reader.onload = function() {
let buffer = reader.result; // let buffer = reader.result;
let uint8array = new Uint8Array(buffer); // let uint8array = new Uint8Array(buffer);
resolve(uint8array); // resolve(uint8array);
}; // };
reader.onerror = function() { // reader.onerror = function() {
reject(reader.error); // reject(reader.error);
}; // };
}); // });
}; // };
const decrypt = (key, data) => { // const decrypt = (key, data) => {
return blob2Uint8Array(data).then(data => { // return blob2Uint8Array(data).then(data => {
// 无加密 // // 无加密
if(key.length === 0){ // if(key.length === 0){
return data // return data
} // }
// SM4 // // SM4
if (key.length >= 34) { // if (key.length >= 34) {
key = key.substring(3); // key = key.substring(3);
// console.log([...data]) // // console.log([...data])
var decryptedBytes = new Uint8Array( // var decryptedBytes = new Uint8Array(
sm4.decrypt([...data], key, { output: "array" }) // sm4.decrypt([...data], key, { output: "array" })
); // );
return decryptedBytes; // return decryptedBytes;
} else { // } else {
// AES // // AES
key = aesjs.utils.utf8.toBytes(key); // key = aesjs.utils.utf8.toBytes(key);
var aesCtr = new aesjs.ModeOfOperation.ctr( // var aesCtr = new aesjs.ModeOfOperation.ctr(
key, // key,
new aesjs.Counter(5) // new aesjs.Counter(5)
); // );
var decryptedBytes = aesCtr.decrypt(data); // var decryptedBytes = aesCtr.decrypt(data);
return decryptedBytes; // return decryptedBytes;
} // }
}); // });
}; // };
const decryptString = (key, str) => { // const decryptString = (key, str) => {
// 无加密 // // 无加密
if(key.length === 0){ // if(key.length === 0){
return sm4.decrypt(str, 'miaospringmiaospringmiaospringao'); // return sm4.decrypt(str, 'miaospringmiaospringmiaospringao');
} // }
// SM4 // // SM4
// console.log(key,key.length) // // console.log(key,key.length)
if (key.length >= 34) { // if (key.length >= 34) {
key = key.substring(3); // key = key.substring(3);
return sm4.decrypt(str, key); // return sm4.decrypt(str, key);
} // }
// AES // // AES
var data = new Uint8Array( // var data = new Uint8Array(
Base64.decode(str) // Base64.decode(str)
.split(",") // .split(",")
.map(n => parseInt(n)) // .map(n => parseInt(n))
); // );
key = aesjs.utils.utf8.toBytes(key); // key = aesjs.utils.utf8.toBytes(key);
var aesCtr = new aesjs.ModeOfOperation.ctr(key, new aesjs.Counter(5)); // var aesCtr = new aesjs.ModeOfOperation.ctr(key, new aesjs.Counter(5));
var decryptedBytes = aesCtr.decrypt(data); // var decryptedBytes = aesCtr.decrypt(data);
var decryptedStr = aesjs.utils.utf8.fromBytes(decryptedBytes); // var decryptedStr = aesjs.utils.utf8.fromBytes(decryptedBytes);
return decryptedStr; // return decryptedStr;
}; // };
// const downloadFromUint8Array = (data, fileName) => {
// let uint8Array = data;
// let blob = new Blob([uint8Array], { type: "text/plain" });
// // 使用file-saver.js
// saveAs(blob, fileName);
// //let url = URL.createObjectURL(blob);
// //let a = document.createElement("a");
// //a.href = url;
// //a.download = fileName;
// //a.click();
// //URL.revokeObjectURL(url);
// };
const downloadFromUint8Array = (data, fileName) => {
let uint8Array = data;
let blob = new Blob([uint8Array], { type: "text/plain" });
// 使用file-saver.js
saveAs(blob, fileName);
//let url = URL.createObjectURL(blob);
//let a = document.createElement("a");
//a.href = url;
//a.download = fileName;
//a.click();
//URL.revokeObjectURL(url);
};
// 刷新展示的下载进度 // 刷新展示的下载进度
const updateDownloadQuene = (code, key, value) => { const updateDownloadQuene = (code, key, value) => {
for (let index in downloadQuene.value) { for (let index in downloadQuene.value) {
@@ -2,7 +2,7 @@
<div> <div>
<n-list hoverable> <n-list hoverable>
<n-list-item> <n-list-item>
<p style="font-size:larger;position:absolute;left:5px;">选择加密算法:</p> <p style="font-size:larger;position:absolute;left:5px;user-select: none;">选择加密算法:</p>
<br /> <br />
<!-- <br /> --> <!-- <br /> -->
<!-- <br /> --> <!-- <br /> -->
@@ -16,7 +16,7 @@
</n-flex> </n-flex>
</n-list-item> </n-list-item>
<n-list-item> <n-list-item>
<p style="font-size:larger;position:absolute;left:5px;">选择密钥组成:</p> <p style="font-size:larger;position:absolute;left:5px;user-select: none;">选择密钥组成:</p>
<br /> <br />
<n-flex justify="end"> <n-flex justify="end">
<span v-for="k in keyButtons" style="margin:5px"> <span v-for="k in keyButtons" style="margin:5px">
@@ -11,8 +11,8 @@
<!-- <div style="margin-bottom: 12px"> <!-- <div style="margin-bottom: 12px">
<n-icon size="48" :depth="3"></n-icon> <n-icon size="48" :depth="3"></n-icon>
</div>--> </div>-->
<n-text style="font-size: 16px">点击此处或者拖动文件到该区域来上传</n-text> <n-text style="font-size: 16px;user-select: none;">点击此处或者拖动文件到该区域来上传</n-text>
<n-p depth="3" style="margin: 8px 0 0 0"> <n-p depth="3" style="margin: 8px 0 0 0;user-select: none;">
最大支持200MB大小文件,其实只是懒得做分片上传而已 最大支持200MB大小文件,其实只是懒得做分片上传而已
<br />虽然理论上没有人有能力审查你上传的东西 <br />虽然理论上没有人有能力审查你上传的东西
<br />反正没人用写这么多干什么。。。 <br />反正没人用写这么多干什么。。。
@@ -31,58 +31,57 @@
:max-height="250" :max-height="250"
:bordered="false" :bordered="false"
:single-line="false" :single-line="false"
style="user-select: none;"
/> />
</div> </div>
</template> </template>
<script setup> <script setup>
import { ref, onMounted } from "vue"; import { ref, onMounted } from "vue";
import aesjs from "aes-js"; // import aesjs from "aes-js";
import { Base64 } from "js-base64"; // import { Base64 } from "js-base64";
import { useMessage, useNotification } from "naive-ui"; import { useMessage, useNotification } from "naive-ui";
import useClipboard from "vue-clipboard3"; import useClipboard from "vue-clipboard3";
import { useSettingStore } from "@/pinia/store"; import { useSettingStore } from "@/pinia/store";
import { sm4 } from 'sm-crypto' // import { sm4 } from 'sm-crypto'
import {NUpload,NUploadDragger,NText,NP,NFlex,NDataTable,NButton,NInputNumber} from 'naive-ui' import {NUpload,NUploadDragger,NText,NP,NFlex,NDataTable,NButton,NInputNumber} from 'naive-ui'
import {encrypt,encryptString,generateKey} from '../func/upload'
const setting = useSettingStore(); const setting = useSettingStore();
const { toClipboard } = useClipboard(); const { toClipboard } = useClipboard();
const message = useMessage(); const message = useMessage();
const notification = useNotification(); const notification = useNotification();
// 目前使用加密
const activeFuction = setting.activeFuction;
// 启用的密钥组成
const activeKeyButtons = setting.activeKeyMap;
// 服务端端口 // 服务端端口
const serverPort = setting.serverPort; const serverPort = setting.serverPort;
// console.log(activeFuction,activeKeyButtons) // console.log(activeFuction,activeKeyButtons)
var charMap = "" // var charMap = ""
for(let i of setting.activeKeyMap){ // for(let i of setting.activeKeyMap){
if(i === 'A-Z'){ // if(i === 'A-Z'){
charMap = charMap + 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' // charMap = charMap + 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'
}else if(i === "a-z"){ // }else if(i === "a-z"){
charMap = charMap + 'abcdefghijklmnopqrstuvwxyz' // charMap = charMap + 'abcdefghijklmnopqrstuvwxyz'
}else if(i === '0-9'){ // }else if(i === '0-9'){
charMap = charMap + '0123456789' // charMap = charMap + '0123456789'
} // }
} // }
// 生成密钥 // // 生成密钥
const generateKey = function() { // const generateKey = function() {
if(setting.activeFuction === "不加密"){ // if(setting.activeFuction === "不加密"){
return '' // return ''
} // }
var returnStr = "", // var returnStr = "",
length = setting.activeFuction === "AES128" ? 16 : 32 // length = setting.activeFuction === "AES128" ? 16 : 32
// charMap = "ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789"; // // charMap = "ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";
for (var i = 0; i < length; i++) { // for (var i = 0; i < length; i++) {
var index = Math.round(Math.random() * charMap.length); // var index = Math.round(Math.random() * charMap.length);
returnStr += charMap.substring(index, index + 1); // returnStr += charMap.substring(index, index + 1);
} // }
return returnStr; // return returnStr;
}; // };
// 上传文件用 // 上传文件用
const uploadRef = ref(null); const uploadRef = ref(null);
@@ -99,69 +98,68 @@ const baseUrl =
location.protocol + "//" + location.hostname + ":" + serverPort + "/"; location.protocol + "//" + location.hostname + ":" + serverPort + "/";
const blob2Uint8Array = function(blob) { // const blob2Uint8Array = function(blob) {
return new Promise((resolve, reject) => { // return new Promise((resolve, reject) => {
let reader = new FileReader(); // let reader = new FileReader();
reader.readAsArrayBuffer(blob); // reader.readAsArrayBuffer(blob);
reader.onload = function() { // reader.onload = function() {
let buffer = reader.result; // let buffer = reader.result;
let uint8array = new Uint8Array(buffer); // let uint8array = new Uint8Array(buffer);
resolve(uint8array); // resolve(uint8array);
}; // };
reader.onerror = function() { // reader.onerror = function() {
reject(reader.error); // reject(reader.error);
}; // };
}); // });
}; // };
// 包含AES128和AES256 // // 包含AES128和AES256
const AES = (key,data)=>{ // const AES = (key,data)=>{
key = aesjs.utils.utf8.toBytes(key); // key = aesjs.utils.utf8.toBytes(key);
var aesCtr = new aesjs.ModeOfOperation.ctr(key, new aesjs.Counter(5)); // var aesCtr = new aesjs.ModeOfOperation.ctr(key, new aesjs.Counter(5));
var encryptedBytes = aesCtr.encrypt(data); // var encryptedBytes = aesCtr.encrypt(data);
return encryptedBytes; // return encryptedBytes;
} // }
const SM4 = (key,data)=>{ // const SM4 = (key,data)=>{
// console.log(key) // // console.log(key)
var encryptedBytes = sm4.encrypt(data,key,{padding: 'pkcs#7',output:'array'}); // var encryptedBytes = sm4.encrypt(data,key,{padding: 'pkcs#7',output:'array'});
// console.log(encryptedBytes, sm4.decrypt(encryptedBytes, key,{output:'array'})) // // console.log(encryptedBytes, sm4.decrypt(encryptedBytes, key,{output:'array'}))
return new Uint8Array(encryptedBytes); // return new Uint8Array(encryptedBytes);
} // }
const encrypt = (key, data, fileName) => { // const encrypt = (key, data, fileName) => {
return blob2Uint8Array(data).then(data => { // return blob2Uint8Array(data).then(data => {
let encrypted_data = null // let encrypted_data = null
if(setting.activeFuction === "不加密"){ // if(setting.activeFuction === "不加密"){
encrypted_data = data // encrypted_data = data
}else if(setting.activeFuction != "SM4"){ // }else if(setting.activeFuction != "SM4"){
message.info(`开始加密${fileName}`); // message.info(`开始加密${fileName}`);
encrypted_data = AES(key,data) // encrypted_data = AES(key,data)
message.info(`${fileName}加密完成`); // message.info(`${fileName}加密完成`);
}else{ // }else{
message.info(`开始加密${fileName}`); // message.info(`开始加密${fileName}`);
encrypted_data = SM4(key,data) // encrypted_data = SM4(key,data)
message.info(`${fileName}加密完成`); // message.info(`${fileName}加密完成`);
} // }
return encrypted_data // return encrypted_data
}); // });
}; // };
const encryptString = (key, str) => { // const encryptString = (key, str) => {
// console.log(key) // // console.log(key)
if(setting.activeFuction === "不加密"){ // if(setting.activeFuction === "不加密"){
return sm4.encrypt(str, 'miaospringmiaospringmiaospringao') // return sm4.encrypt(str, 'miaospringmiaospringmiaospringao')
}else if(setting.activeFuction !== "SM4"){ // }else if(setting.activeFuction !== "SM4"){
key = aesjs.utils.utf8.toBytes(key); // key = aesjs.utils.utf8.toBytes(key);
var data = aesjs.utils.utf8.toBytes(str); // var data = aesjs.utils.utf8.toBytes(str);
var aesCtr = new aesjs.ModeOfOperation.ctr(key, new aesjs.Counter(5)); // var aesCtr = new aesjs.ModeOfOperation.ctr(key, new aesjs.Counter(5));
var encryptedBytes = aesCtr.encrypt(data); // var encryptedBytes = aesCtr.encrypt(data);
return Base64.encode(encryptedBytes); // return Base64.encode(encryptedBytes);
}else{ // }else{
return sm4.encrypt(str, key) // return sm4.encrypt(str, key)
} // }
}; // };
const clickUpload = function(){ const clickUpload = function(){
// for(let i of uploadRef.value)console.log(i) // for(let i of uploadRef.value)console.log(i)
// console.log(uploadRef.value) // console.log(uploadRef.value)
message.info(`开始上传`);
uploadRef.value.submit(); uploadRef.value.submit();
} }
@@ -184,13 +182,13 @@ const customRequest = ({
onError, onError,
onProgress onProgress
}) => { }) => {
// console.log(file);
file = file.file; file = file.file;
var fileName = file.name; var fileName = file.name;
const key = generateKey(); const key = generateKey(setting);
const encryptedFileName = encryptString(key, fileName); const encryptedFileName = encryptString(key, fileName, setting);
var f = new Blob([file]); var f = new Blob([file]);
encrypt(key, f, fileName).then(data => { encrypt(key, f, fileName, setting, message).then(data => {
message.info(`开始上传${fileName}`);
const params = { const params = {
fileName: encryptedFileName, fileName: encryptedFileName,
downloadCredit:downloadCredit.value == null ? -1 : downloadCredit.value downloadCredit:downloadCredit.value == null ? -1 : downloadCredit.value
@@ -211,9 +209,9 @@ const customRequest = ({
if (xhr.readyState === 4 && xhr.status === 200) { if (xhr.readyState === 4 && xhr.status === 200) {
let id = xhr.responseText; let id = xhr.responseText;
let code = id + key let code = id + key
if(setting.activeFuction === "SM4"){ // if(setting.activeFuction === "SM4"){
code = id + 'SM4' + key // code = id + 'SM4' + key
} // }
file_Code_Map.value.push({ file_Code_Map.value.push({
code: code, code: code,
fileName: fileName fileName: fileName
+2 -2
View File
@@ -14,8 +14,8 @@ export default defineConfig({
} }
}, },
server:{ server:{
host:'0.0.0.0', // host:'0.0.0.0',
port:'17057', port:'17058',
open:true, open:true,
}, },
}) })