From 530e54a5961f9ba7319ee4ffa236f45aee828773 Mon Sep 17 00:00:00 2001 From: Miao_Spring <539943419@qq.com> Date: Wed, 27 Mar 2024 22:05:00 +0800 Subject: [PATCH] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E7=99=BB=E5=BD=95=E5=8A=9F?= =?UTF-8?q?=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitignore | 4 + miaoShareConfig.json | 10 +- package-lock.json | 134 +++++++++++++++++++++-- package.json | 5 +- public/111.ico | Bin 0 -> 4286 bytes public/favicon.ico | Bin 4286 -> 10723 bytes server.js | 176 +++++++++++++++++++++++------- src/App.vue | 106 +++++++++++++------ src/func/download.js | 2 +- src/func/getQuery.js | 8 ++ src/pinia/store.js | 23 +++- src/views/accountInfo.vue | 18 ++++ src/views/chat.vue | 188 ++++++++++++++++++++------------- src/views/downloadFileMiao.vue | 8 +- src/views/login.vue | 89 ++++++++++++++++ src/views/uploadFileMiao.vue | 4 +- testjwt.js | 17 +++ 17 files changed, 632 insertions(+), 160 deletions(-) create mode 100644 public/111.ico create mode 100644 src/func/getQuery.js create mode 100644 src/views/accountInfo.vue create mode 100644 src/views/login.vue create mode 100644 testjwt.js diff --git a/.gitignore b/.gitignore index f85d509..20d47b9 100644 --- a/.gitignore +++ b/.gitignore @@ -32,3 +32,7 @@ coverage # files created with miaoShare service temp miaoShare.db +addUser.js + +# JWT SK +*.key \ No newline at end of file diff --git a/miaoShareConfig.json b/miaoShareConfig.json index 3f33f53..2c993b2 100644 --- a/miaoShareConfig.json +++ b/miaoShareConfig.json @@ -1,3 +1,11 @@ { - "PORT":17057 + "PORT":17057, + "userGroupSetting":{ + "admin":{ + "cloudCapacity":2147483648 + }, + "guest":{ + "cloudCapacity":2147483648 + } + } } \ No newline at end of file diff --git a/package-lock.json b/package-lock.json index b389250..7023e6c 100644 --- a/package-lock.json +++ b/package-lock.json @@ -13,6 +13,8 @@ "express": "^4.18.2", "file-saver": "^2.0.5", "js-base64": "^3.7.7", + "jsonwebtoken": "^9.0.2", + "node-cron": "^3.0.3", "pinia": "^2.1.7", "sm-crypto": "^0.3.13", "uuid": "^9.0.1", @@ -24,12 +26,13 @@ "ws": "^8.16.0" }, "devDependencies": { + "@vicons/fluent": "^0.12.0", "@vicons/ionicons5": "^0.12.0", "@vitejs/plugin-vue": "^5.0.3", "better-sqlite3": "^8.7.0", "concurrently": "^8.2.2", "cors": "^2.8.5", - "naive-ui": "^2.37.3", + "naive-ui": "^2.38.1", "vfonts": "^0.0.3", "vite": "^5.0.11" } @@ -656,6 +659,12 @@ "@types/lodash": "*" } }, + "node_modules/@vicons/fluent": { + "version": "0.12.0", + "resolved": "https://registry.npmmirror.com/@vicons/fluent/-/fluent-0.12.0.tgz", + "integrity": "sha512-ATCiqPuiJ6RI5GBlD3BIpZ9Xw4MsCA4RpI5oR6MCti4quS4mX1Gp6N74FCzw7lgOj+80rV4HMKhZTVInwimpVQ==", + "dev": true + }, "node_modules/@vicons/ionicons5": { "version": "0.12.0", "resolved": "https://registry.npmmirror.com/@vicons/ionicons5/-/ionicons5-0.12.0.tgz", @@ -889,6 +898,11 @@ "ieee754": "^1.1.13" } }, + "node_modules/buffer-equal-constant-time": { + "version": "1.0.1", + "resolved": "https://registry.npmmirror.com/buffer-equal-constant-time/-/buffer-equal-constant-time-1.0.1.tgz", + "integrity": "sha512-zRpUiDwd/xk6ADqPMATG8vc9VPrkck7T07OIx0gnjmJAnHnTVXNQG3vfvWNuiZIkwu9KrKdA1iJKfsfTVxE6NA==" + }, "node_modules/bytes": { "version": "3.1.2", "resolved": "https://registry.npmmirror.com/bytes/-/bytes-3.1.2.tgz", @@ -1174,6 +1188,14 @@ "node": ">=8" } }, + "node_modules/ecdsa-sig-formatter": { + "version": "1.0.11", + "resolved": "https://registry.npmmirror.com/ecdsa-sig-formatter/-/ecdsa-sig-formatter-1.0.11.tgz", + "integrity": "sha512-nagl3RYrbNv6kQkeJIpt6NJZy8twLB/2vtz6yN9Z4vRKHN4/QZJIEbqohALSgwKdnksuY3k5Addp5lg8sVoVcQ==", + "dependencies": { + "safe-buffer": "^5.0.1" + } + }, "node_modules/ee-first": { "version": "1.1.1", "resolved": "https://registry.npmmirror.com/ee-first/-/ee-first-1.1.1.tgz", @@ -1577,6 +1599,51 @@ "resolved": "https://registry.npmmirror.com/jsbn/-/jsbn-1.1.0.tgz", "integrity": "sha512-4bYVV3aAMtDTTu4+xsDYa6sy9GyJ69/amsu9sYF2zqjiEoZA5xJi3BrfX3uY+/IekIu7MwdObdbDWpoZdBv3/A==" }, + "node_modules/jsonwebtoken": { + "version": "9.0.2", + "resolved": "https://registry.npmmirror.com/jsonwebtoken/-/jsonwebtoken-9.0.2.tgz", + "integrity": "sha512-PRp66vJ865SSqOlgqS8hujT5U4AOgMfhrwYIuIhfKaoSCZcirrmASQr8CX7cUg+RMih+hgznrjp99o+W4pJLHQ==", + "dependencies": { + "jws": "^3.2.2", + "lodash.includes": "^4.3.0", + "lodash.isboolean": "^3.0.3", + "lodash.isinteger": "^4.0.4", + "lodash.isnumber": "^3.0.3", + "lodash.isplainobject": "^4.0.6", + "lodash.isstring": "^4.0.1", + "lodash.once": "^4.0.0", + "ms": "^2.1.1", + "semver": "^7.5.4" + }, + "engines": { + "node": ">=12", + "npm": ">=6" + } + }, + "node_modules/jsonwebtoken/node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmmirror.com/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" + }, + "node_modules/jwa": { + "version": "1.4.1", + "resolved": "https://registry.npmmirror.com/jwa/-/jwa-1.4.1.tgz", + "integrity": "sha512-qiLX/xhEEFKUAJ6FiBMbes3w9ATzyk5W7Hvzpa/SLYdxNtng+gcurvrI7TbACjIXlsJyr05/S1oUhZrc63evQA==", + "dependencies": { + "buffer-equal-constant-time": "1.0.1", + "ecdsa-sig-formatter": "1.0.11", + "safe-buffer": "^5.0.1" + } + }, + "node_modules/jws": { + "version": "3.2.2", + "resolved": "https://registry.npmmirror.com/jws/-/jws-3.2.2.tgz", + "integrity": "sha512-YHlZCB6lMTllWDtSPHz/ZXTsi8S00usEV6v1tjq8tOUZzw7DpSDWVXjXDre6ed1w/pd495ODpHZYSdkRTsa0HA==", + "dependencies": { + "jwa": "^1.4.1", + "safe-buffer": "^5.0.1" + } + }, "node_modules/lodash": { "version": "4.17.21", "resolved": "https://registry.npmmirror.com/lodash/-/lodash-4.17.21.tgz", @@ -1589,11 +1656,45 @@ "integrity": "sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw==", "dev": true }, + "node_modules/lodash.includes": { + "version": "4.3.0", + "resolved": "https://registry.npmmirror.com/lodash.includes/-/lodash.includes-4.3.0.tgz", + "integrity": "sha512-W3Bx6mdkRTGtlJISOvVD/lbqjTlPPUDTMnlXZFnVwi9NKJ6tiAk6LVdlhZMm17VZisqhKcgzpO5Wz91PCt5b0w==" + }, + "node_modules/lodash.isboolean": { + "version": "3.0.3", + "resolved": "https://registry.npmmirror.com/lodash.isboolean/-/lodash.isboolean-3.0.3.tgz", + "integrity": "sha512-Bz5mupy2SVbPHURB98VAcw+aHh4vRV5IPNhILUCsOzRmsTmSQ17jIuqopAentWoehktxGd9e/hbIXq980/1QJg==" + }, + "node_modules/lodash.isinteger": { + "version": "4.0.4", + "resolved": "https://registry.npmmirror.com/lodash.isinteger/-/lodash.isinteger-4.0.4.tgz", + "integrity": "sha512-DBwtEWN2caHQ9/imiNeEA5ys1JoRtRfY3d7V9wkqtbycnAmTvRRmbHKDV4a0EYc678/dia0jrte4tjYwVBaZUA==" + }, + "node_modules/lodash.isnumber": { + "version": "3.0.3", + "resolved": "https://registry.npmmirror.com/lodash.isnumber/-/lodash.isnumber-3.0.3.tgz", + "integrity": "sha512-QYqzpfwO3/CWf3XP+Z+tkQsfaLL/EnUlXWVkIk5FUPc4sBdTehEqZONuyRt2P67PXAk+NXmTBcc97zw9t1FQrw==" + }, + "node_modules/lodash.isplainobject": { + "version": "4.0.6", + "resolved": "https://registry.npmmirror.com/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz", + "integrity": "sha512-oSXzaWypCMHkPC3NvBEaPHf0KsA5mvPrOPgQWDsbg8n7orZ290M0BmC/jgRZ4vcJ6DTAhjrsSYgdsW/F+MFOBA==" + }, + "node_modules/lodash.isstring": { + "version": "4.0.1", + "resolved": "https://registry.npmmirror.com/lodash.isstring/-/lodash.isstring-4.0.1.tgz", + "integrity": "sha512-0wJxfxH1wgO3GrbuP+dTTk7op+6L41QCXbGINEmD+ny/G/eCqGzxyCsh7159S+mgDDcoarnBw6PC1PS5+wUGgw==" + }, + "node_modules/lodash.once": { + "version": "4.1.1", + "resolved": "https://registry.npmmirror.com/lodash.once/-/lodash.once-4.1.1.tgz", + "integrity": "sha512-Sb487aTOCr9drQVL8pIxOzVhafOjZN9UU54hiN8PU3uAiSV7lx1yYNpbNmex2PK6dSJoNTSJUUswT651yww3Mg==" + }, "node_modules/lru-cache": { "version": "6.0.0", "resolved": "https://registry.npmmirror.com/lru-cache/-/lru-cache-6.0.0.tgz", "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "dev": true, "dependencies": { "yallist": "^4.0.0" }, @@ -1690,9 +1791,9 @@ "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" }, "node_modules/naive-ui": { - "version": "2.37.3", - "resolved": "https://registry.npmmirror.com/naive-ui/-/naive-ui-2.37.3.tgz", - "integrity": "sha512-aUkHFXVIluSi8Me+npbcsdv1NYhVMj5t9YaruoCESlqmfqspj+R2QHEVXkTtUI1kQwVrABMCtAGq/wountqjZA==", + "version": "2.38.1", + "resolved": "https://registry.npmmirror.com/naive-ui/-/naive-ui-2.38.1.tgz", + "integrity": "sha512-AnU1FQ7K/CbhguAX++V4kCFjk7h7RvWt4nvZPRjORMpq+fUIlzD+EcQ5Cv1VqDloNF8+eMv4Akc2Ogacc9S+5A==", "dev": true, "dependencies": { "@css-render/plugin-bem": "^0.15.12", @@ -1756,6 +1857,25 @@ "node": ">=10" } }, + "node_modules/node-cron": { + "version": "3.0.3", + "resolved": "https://registry.npmmirror.com/node-cron/-/node-cron-3.0.3.tgz", + "integrity": "sha512-dOal67//nohNgYWb+nWmg5dkFdIwDm8EpeGYMekPMrngV3637lqnX0lbUcCtgibHTz6SEz7DAIjKvKDFYCnO1A==", + "dependencies": { + "uuid": "8.3.2" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/node-cron/node_modules/uuid": { + "version": "8.3.2", + "resolved": "https://registry.npmmirror.com/uuid/-/uuid-8.3.2.tgz", + "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", + "bin": { + "uuid": "dist/bin/uuid" + } + }, "node_modules/object-assign": { "version": "4.1.1", "resolved": "https://registry.npmmirror.com/object-assign/-/object-assign-4.1.1.tgz", @@ -2056,7 +2176,6 @@ "version": "7.6.0", "resolved": "https://registry.npmmirror.com/semver/-/semver-7.6.0.tgz", "integrity": "sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg==", - "dev": true, "dependencies": { "lru-cache": "^6.0.0" }, @@ -2581,8 +2700,7 @@ "node_modules/yallist": { "version": "4.0.0", "resolved": "https://registry.npmmirror.com/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" }, "node_modules/yargs": { "version": "17.7.2", diff --git a/package.json b/package.json index 17af1a2..967c93d 100644 --- a/package.json +++ b/package.json @@ -17,6 +17,8 @@ "express": "^4.18.2", "file-saver": "^2.0.5", "js-base64": "^3.7.7", + "jsonwebtoken": "^9.0.2", + "node-cron": "^3.0.3", "pinia": "^2.1.7", "sm-crypto": "^0.3.13", "uuid": "^9.0.1", @@ -28,12 +30,13 @@ "ws": "^8.16.0" }, "devDependencies": { + "@vicons/fluent": "^0.12.0", "@vicons/ionicons5": "^0.12.0", "@vitejs/plugin-vue": "^5.0.3", "better-sqlite3": "^8.7.0", "concurrently": "^8.2.2", "cors": "^2.8.5", - "naive-ui": "^2.37.3", + "naive-ui": "^2.38.1", "vfonts": "^0.0.3", "vite": "^5.0.11" } diff --git a/public/111.ico b/public/111.ico new file mode 100644 index 0000000000000000000000000000000000000000..df36fcfb72584e00488330b560ebcf34a41c64c2 GIT binary patch literal 4286 zcmds*O-Phc6o&64GDVCEQHxsW(p4>LW*W<827=Unuo8sGpRux(DN@jWP-e29Wl%wj zY84_aq9}^Am9-cWTD5GGEo#+5Fi2wX_P*bo+xO!)p*7B;iKlbFd(U~_d(U?#hLj56 zPhFkj-|A6~Qk#@g^#D^U0XT1cu=c-vu1+SElX9NR;kzAUV(q0|dl0|%h|dI$%VICy zJnu2^L*Te9JrJMGh%-P79CL0}dq92RGU6gI{v2~|)p}sG5x0U*z<8U;Ij*hB9z?ei z@g6Xq-pDoPl=MANPiR7%172VA%r)kevtV-_5H*QJKFmd;8yA$98zCxBZYXTNZ#QFk2(TX0;Y2dt&WitL#$96|gJY=3xX zpCoi|YNzgO3R`f@IiEeSmKrPSf#h#Qd<$%Ej^RIeeYfsxhPMOG`S`Pz8q``=511zm zAm)MX5AV^5xIWPyEu7u>qYs?pn$I4nL9J!=K=SGlKLXpE<5x+2cDTXq?brj?n6sp= zphe9;_JHf40^9~}9i08r{XM$7HB!`{Ys~TK0kx<}ZQng`UPvH*11|q7&l9?@FQz;8 zx!=3<4seY*%=OlbCbcae?5^V_}*K>Uo6ZWV8mTyE^B=DKy7-sdLYkR5Z?paTgK-zyIkKjIcpyO z{+uIt&YSa_$QnN_@t~L014dyK(fOOo+W*MIxbA6Ndgr=Y!f#Tokqv}n<7-9qfHkc3 z=>a|HWqcX8fzQCT=dqVbogRq!-S>H%yA{1w#2Pn;=e>JiEj7Hl;zdt-2f+j2%DeVD zsW0Ab)ZK@0cIW%W7z}H{&~yGhn~D;aiP4=;m-HCo`BEI+Kd6 z={Xwx{TKxD#iCLfl2vQGDitKtN>z|-AdCN|$jTFDg0m3O`WLD4_s#$S literal 0 HcmV?d00001 diff --git a/public/favicon.ico b/public/favicon.ico index df36fcfb72584e00488330b560ebcf34a41c64c2..7e0c56bdd9c98becba677bfb083f7028a47c5de4 100644 GIT binary patch literal 10723 zcmY*fbyQSQw+9J9x;v!1Q%X`&L>Q2v1{fGd7`nTWkgg#GVNj5e?v!p2k#3Ogt~Y$^ zdvC4x$Gvymd+t7G?|shM@!Kcz-P<>KFQ{LjprGKXsVcokK98O*EKKBG7OHbT3Nd_jlEYssUa{EWl7Gsi%_V>_xEx}c!ocRpRHWE|>&C@7qsYD)5Yo~HW? zUcP!$3vx#dTUkDbLtr5|nC)c{3%cq!S7y`~8@!sbIPSvtX+?$K0%;fv>YIJfMa!?R zPn;KpW<|$9#Kr_0(ek{g$`BHn*HLaWJ zubY+&D26tpJ6I1;^RIF7Vw4cQBUrGOF6yAR*JUd+S$}Lw-JtrUubs3)3OKqxBDH3;h{_kFN+bm-*-MXe8CAJ z)8hRdQ;k3qdap$&TYz)(mS@?765DJbzrH0vr~hK=@)m!r?Xw0m{jvz9c&|}~?W4z5 zSaP4u*CJZzSrX(86A{6^Ac>OB4^jIZEtSz$9k$iRlhwqU66;(1Nd_0rPPD9NWQ(^^ zw)b!N@FNt-R1Uop@{2e2yXG`eyIh0kytm_6)ygjFPvm}F$o$NGNY@~yUuH?K@3dWL zJYW8s>bMI~A@EUC(s?^t-R}PU887ik%D7@cJnPJZnB9l*H{9&k!Dqe3!AB_UeQu`Z zwrOpfv+p=W-U4a{V;}}n_e2nZoI*6pua{s$Q@{b2$$jeRR*~GQci{8-=Vj@KZU;-S zP%+v@)`DV+-3+#I2B#uMM$%Nlhj*##X;IHp%KSaT%M%_xMH3M?#x$GqdsnTrv-0M( zv#{oymh3ba?PJ@W4TUaG8CLprpG*459bNlw!<`|d1dhpE&6809-_Dn)-zU$JDsvVN z8$Tmb_y|@=JwL8bHMk`|!mi*rLh)G38u)HW1I#Q^?i{GeC?lF3VkIJuXHo~d#SZ^m zJ}p*e7`HAXk#5iacI2(LFrGnUq_{FrK};{7*&q`Csd|P@18^`uVNl{H8z$z09QV0_ zPs_!E+pRr;ib55cGB08{3!8GZ|F$$=8WP`Rw>>AzV791sj6yRTY}9sH_6KBBTMWgh zh6}%p88gqE!g5{=gm}gKcm=Y1xBPKCzdgXh3?VpKuEYqos{u05WgA?~tD7B~Fivoz z;g$z4N&sD4G&ruXa&@d}hKwQoe})e2jr<<8MMGmoE=bi%dK?0TiW3U4V%YBwl*#*gI6d^ z%jfEII~T(r@h~61Y*U+wPT?@3V%X{Lb}24cxtN_^cUDU>Te$|l8Oo4G2#z)XqU6h! z‡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 literal 4286 zcmds*O-Phc6o&64GDVCEQHxsW(p4>LW*W<827=Unuo8sGpRux(DN@jWP-e29Wl%wj zY84_aq9}^Am9-cWTD5GGEo#+5Fi2wX_P*bo+xO!)p*7B;iKlbFd(U~_d(U?#hLj56 zPhFkj-|A6~Qk#@g^#D^U0XT1cu=c-vu1+SElX9NR;kzAUV(q0|dl0|%h|dI$%VICy zJnu2^L*Te9JrJMGh%-P79CL0}dq92RGU6gI{v2~|)p}sG5x0U*z<8U;Ij*hB9z?ei z@g6Xq-pDoPl=MANPiR7%172VA%r)kevtV-_5H*QJKFmd;8yA$98zCxBZYXTNZ#QFk2(TX0;Y2dt&WitL#$96|gJY=3xX zpCoi|YNzgO3R`f@IiEeSmKrPSf#h#Qd<$%Ej^RIeeYfsxhPMOG`S`Pz8q``=511zm zAm)MX5AV^5xIWPyEu7u>qYs?pn$I4nL9J!=K=SGlKLXpE<5x+2cDTXq?brj?n6sp= zphe9;_JHf40^9~}9i08r{XM$7HB!`{Ys~TK0kx<}ZQng`UPvH*11|q7&l9?@FQz;8 zx!=3<4seY*%=OlbCbcae?5^V_}*K>Uo6ZWV8mTyE^B=DKy7-sdLYkR5Z?paTgK-zyIkKjIcpyO z{+uIt&YSa_$QnN_@t~L014dyK(fOOo+W*MIxbA6Ndgr=Y!f#Tokqv}n<7-9qfHkc3 z=>a|HWqcX8fzQCT=dqVbogRq!-S>H%yA{1w#2Pn;=e>JiEj7Hl;zdt-2f+j2%DeVD zsW0Ab)ZK@0cIW%W7z}H{&~yGhn~D;aiP4=;m-HCo`BEI+Kd6 z={Xwx{TKxD#iCLfl2vQGDitKtN>z|-AdCN|$jTFDg0m3O`WLD4_s#$S diff --git a/server.js b/server.js index 8603fc3..70076f4 100644 --- a/server.js +++ b/server.js @@ -5,15 +5,23 @@ import fs from "fs"; import { WebSocketServer } from "ws"; import http from "http"; import { v4 as uuid4 } from "uuid"; -// import Config from "./miaoShareConfig.json" +import jwt from "jsonwebtoken"; +import sha256 from "crypto-js/sha256.js"; +import Config from './miaoShareConfig.json' assert { type: 'json' }; +// function loadJSON(path){ +// return JSON.parse(fs.readFileSync(path).toString()); +// } +// const Config = loadJSON("./miaoShareConfig.json"); const HOST = "0.0.0.0"; -// const PORT = Config.PORT -const PORT = 17057; +const PORT = Config.PORT +// const PORT = 17057; const fileDir = "./temp"; const dbPath = "./miaoShare.db"; const PATH = "./dist"; +const JWT_SK = fs.readFileSync("JWT_SK.key").toString(); + // 上传文件最大大小:200MB const uploadMaxSize = 200 * 1024 * 1024; // 一天的毫秒数 @@ -24,27 +32,43 @@ const LifeOfFile = millisecondsOfOneDay * 3; // 数据库相关 const db = new Database(dbPath, { verbose: null }); -db.prepare( +db.exec( `CREATE TABLE IF NOT EXISTS id2fileName ( id CHAR(8) PRIMARY KEY NOT NULL UNIQUE, fileName TEXT NOT NULL, timestamp INT NOT NULL, freeze tinyint(1) NOT NULL, - downloadCredit INT NOT NULL + downloadCredit INT NOT NULL, + fileSize INT NOT NULL, + sender_id CHAR(32) NOT NULL );` -).run(); +); +db.exec(` +CREATE TABLE IF NOT EXISTS USERS( + user_id CHAR(32) PRIMARY KEY UNIQUE, + password_hash CHAR(32) NOT NULL, + user_group VARCHAR(32) NOT NULL, + uploadFilesSizeCount BIGINT NOT NULL, + email CHAR(64) +);`); +const stmt_getPermissionGroup = db.prepare("SELECT user_group FROM USERS WHERE user_id = ? AND password_hash = ?"); const stmt_getFileName = db.prepare(`SELECT fileName FROM id2fileName WHERE id = ?`); +const stmt_getUserUploadFilesSizeCount = db.prepare("SELECT uploadFilesSizeCount FROM USERS WHERE user_id = ?"); +const stmt_getUserGroup = db.prepare("SELECT user_group FROM USERS WHERE user_id = ?"); const stmt_getTimestamp = db.prepare(`SELECT timestamp FROM id2fileName WHERE id = ?`); +const stmt_getFileSize = db.prepare(`SELECT fileSize FROM id2fileName WHERE id = ?`); const stmt_getFreeze = db.prepare(`SELECT freeze FROM id2fileName WHERE id = ?`); const stmt_getDownloadCredit = db.prepare(`SELECT downloadCredit FROM id2fileName WHERE id = ?`); -const stmt_getFreezenIDs = db.prepare(`SELECT id FROM id2fileName WHERE freeze = 1`); -const stmt_insertId2FileName = db.prepare(`INSERT INTO id2fileName (id, fileName, timestamp, freeze, downloadCredit) VALUES (?, ?, ?, ?, ?)`); +const stmt_getFreezenIDs = db.prepare(`SELECT id,fileSize,sender_id FROM id2fileName WHERE freeze = 1`); +const stmt_insertId2FileName = db.prepare(`INSERT INTO id2fileName (id, fileName, timestamp, freeze, downloadCredit, fileSize, sender_id) VALUES (?, ?, ?, ?, ?, ?, ?)`); const stmt_deleteExpireData = db.prepare(`DELETE FROM id2fileName WHERE freeze=1`); 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 stmt_updateUserUploadFilesSizeCount = db.prepare(`UPDATE USERS SET uploadFilesSizeCount=uploadFilesSizeCount+? WHERE user_id = ?`); +const stmt_updateUserUploadFilesSizeCount_d = db.prepare(`UPDATE USERS SET uploadFilesSizeCount=uploadFilesSizeCount-? WHERE user_id = ?`); -const db_insert = (id, fileName, downloadCredit) => { - stmt_insertId2FileName.run(id, fileName, parseInt(Date.now()), 0, downloadCredit); +const db_insert = (id, fileName, downloadCredit, fileSize, senderId) => { + stmt_insertId2FileName.run(id, fileName, parseInt(Date.now()), 0, downloadCredit, fileSize, senderId); }; const db_getFileName = id => { try { @@ -78,6 +102,22 @@ const db_getTimestamp = id => { return stmt_getTimestamp.get(id)["timestamp"]; }; +const db_getFileSize = id => { + return stmt_getFileSize.get(id)["fileSize"]; +}; +const db_getUserUploadFilesSizeCount = id => { + return stmt_getUserUploadFilesSizeCount.get(id)["uploadFilesSizeCount"]; +}; + +function db_updateUserUploadFilesSizeCount(id,size){ + return stmt_updateUserUploadFilesSizeCount.run(size,id) +} + +// 减 +function db_updateUserUploadFilesSizeCount_d(id,size){ + return stmt_updateUserUploadFilesSizeCount_d.run(size,id) +} + // 更新存储的文件,删除已经被冻结的文件以及相关记录,然后冻结过期文件 const updateDBAndFiles = () => { try { @@ -85,6 +125,9 @@ const updateDBAndFiles = () => { stmt_deleteExpireData.run(); for (let row of rows) { let fileName = row["id"]; + let sid = row['sender_id'] + let fsize = row['fileSize'] + db_updateUserUploadFilesSizeCount_d(sid,fsize) let path = fileDir + "/" + fileName; try { fs.unlink(path, e => { @@ -117,6 +160,15 @@ if (!fs.existsSync(fileDir)) { fs.mkdirSync(fileDir); } +function db_getPermissionGroup(id, pwdH) { + let res = stmt_getPermissionGroup.get(id, pwdH); + // console.log(id,pwdH,res) + if (res && res.user_group) { + return res.user_group; + } + return null; +} + function generateId(isGID) { var returnStr = "", range = 8, @@ -134,10 +186,11 @@ function generateId(isGID) { } // 上传文件接口 -function uploadFile(req, res, fileName, downloadCredit) { +function uploadFile(req, res, fileName, downloadCredit, fileSize) { let id = generateId(); const fileStream = fs.createWriteStream(fileDir + "/" + id); - db_insert(id, fileName, downloadCredit); + db_insert(id, fileName, downloadCredit, fileSize, req.sender_id); + db_updateUserUploadFilesSizeCount(req.sender_id,fileSize) // tempMap[id] = fileName; // console.log(tempMap); req.pipe(fileStream); @@ -184,9 +237,54 @@ function downloadFile(req, res, fileId) { } } +const getUserGroup = (function(){ + const cache = {} + return function(userId){ + if(!cache[userId]){ + cache[userId]= stmt_getUserGroup.get(userId)['user_group'] + } + return cache[userId] + } +})() + +// 验证token +const verifyToken = (req, res, next) => { + try { + const token = req.headers.authorization.split(" ")[1]; // 从Authorization头中提取JWT + console.log(req.headers.authorization,token) + let verifyData = jwt.verify(token, JWT_SK); + if (verifyData.exp > parseInt(Date.now())) { + throw "token has expired"; + } + req.sender_id = verifyData.id + next(); + } catch (err) { + console.log(err) + return res.status(401).json({ message: "Invalid token", err }); + } +}; + app.use(express.static(PATH)); +app.post("/user/login", express.json(),function (req, res) { + res.header("Access-Control-Allow-Origin", "*"); + res.header("Access-Control-Allow-Headers", "*"); + res.header("Access-Control-Allow-Methods", "POST"); + // console.log(req.body) + let { id, pwd } = req.body; + console.log(req.body) + let pwdH = sha256(id + pwd).toString(); + let userGroup = db_getPermissionGroup(id, pwdH); + if (userGroup !== null) { + res.writeHead(200); + let token = jwt.sign({ id, pwd }, JWT_SK, { expiresIn: "168h" }); + res.end(JSON.stringify({ status: "Success", userGroup, token })); + } else { + res.end(JSON.stringify({ status: "Error" })); + } + // console.log(req) +}); // app.all() -app.post("/file/upload", function (req, res) { +app.post("/file/upload", verifyToken, function (req, res) { res.header("Access-Control-Allow-Origin", "*"); res.header("Access-Control-Allow-Headers", "*"); res.header("Access-Control-Allow-Methods", "POST"); @@ -198,15 +296,15 @@ app.post("/file/upload", function (req, res) { if (!fileName) { res.statusCode = 500; res.end("FileName Not Found"); - } else if (fileSize > uploadMaxSize) { + } else if (fileSize > uploadMaxSize || db_getUserUploadFilesSizeCount(req.sender_id) + fileSize > Config.userGroupSetting[getUserGroup(req.sender_id)].cloudCapacity) { res.statusCode = 500; res.end("Maximum size limit exceeded"); } else { - uploadFile(req, res, fileName, downloadCredit); + uploadFile(req, res, fileName, downloadCredit, fileSize); } }); -app.get("/file/download", function (req, res) { +app.get("/file/download", verifyToken, function (req, res) { res.header("Access-Control-Allow-Origin", "*"); res.header("Access-Control-Allow-Headers", "*"); res.header("Access-Control-Allow-Methods", "GET"); @@ -234,29 +332,29 @@ const groupsMap = {}; const LifeOfGroup = millisecondsOfOneDay * 1; // const LifeOfGroup = 0; // 根据uuid查询加入的群组 -const uuid2Groups={} +const uuid2Groups = {}; db.exec( - `CREATE TABLE IF NOT EXISTS GROUPS ( + `CREATE TABLE IF NOT EXISTS CHATGROUPS ( 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_getExpiredGroups = db.prepare(`SELECT gID FROM CHATGROUPS WHERE activeTimestamp < ? `); -const stmt_getGroupVerify = db.prepare(`SELECT verify FROM GROUPS WHERE gID = ? `); +const stmt_getGroupVerify = db.prepare(`SELECT verify FROM CHATGROUPS WHERE gID = ? `); -const stmt_insertGROUPS = db.prepare(`INSERT INTO GROUPS (gID,verify, activeTimestamp) VALUES (?, ?, ?)`); +const stmt_insertCHATGROUPS = db.prepare(`INSERT INTO CHATGROUPS (gID,verify, activeTimestamp) VALUES (?, ?, ?)`); -const stmt_updateGROUPS_ActiveTimestamp = db.prepare(`UPDATE GROUPS SET activeTimestamp=? WHERE gID=?`); +const stmt_updateCHATGROUPS_ActiveTimestamp = db.prepare(`UPDATE CHATGROUPS SET activeTimestamp=? WHERE gID=?`); -const stmt_deleteGroup = db.prepare(`DELETE FROM GROUPS WHERE gID=?`); +const stmt_deleteGroup = db.prepare(`DELETE FROM CHATGROUPS WHERE gID=?`); const generateStmt_insertMessage_map = {}; -const updateGROUPS = () => { +const updateCHATGROUPS = () => { // console.log(1) try { let gIDs = stmt_getExpiredGroups.all(parseInt(Date.now()) - LifeOfGroup); @@ -270,8 +368,8 @@ const updateGROUPS = () => { return; } }; -updateGROUPS(); -setInterval(updateGROUPS, 1000 * 3600 * 3); +updateCHATGROUPS(); +setInterval(updateCHATGROUPS, 1000 * 3600 * 3); // 创建群组的数据库 function createGroupTableDB(gID, verify) { @@ -283,7 +381,7 @@ function createGroupTableDB(gID, verify) { timestamp INT NOT NULL );` ); - stmt_insertGROUPS.run(gID, verify, parseInt(Date.now())); + stmt_insertCHATGROUPS.run(gID, verify, parseInt(Date.now())); } // 插入信息 @@ -295,7 +393,7 @@ function insertMessageByGID(gID, msg, from, timestamp) { } function updateActiveTimestamp(gID) { - stmt_updateGROUPS_ActiveTimestamp.run(parseInt(Date.now()), gID); + stmt_updateCHATGROUPS_ActiveTimestamp.run(parseInt(Date.now()), gID); } function createGroup(verify) { @@ -307,13 +405,13 @@ function createGroup(verify) { } function getGroupVerify(gID) { - initMsgHistory(gID) + initMsgHistory(gID); return groupsMap[gID].verify; } // 正式加入群组 function joinGroup(socket, gID, callback) { - initMsgHistory(gID) + initMsgHistory(gID); groupsMap[gID].member.push(socket); updateActiveTimestamp(gID); callback(); @@ -321,13 +419,13 @@ function joinGroup(socket, gID, callback) { // 暂时这么写 function getHistory(gID) { - initMsgHistory(gID) + initMsgHistory(gID); return groupsMap[gID].msgHistory; } function broadcastMsg(gID, msg, from) { - const timestamp = parseInt(Date.now()) - initMsgHistory(gID) + const timestamp = parseInt(Date.now()); + initMsgHistory(gID); updateActiveTimestamp(gID); insertMessageByGID(gID, msg, from, timestamp); @@ -338,7 +436,7 @@ function broadcastMsg(gID, msg, from) { } } -function initMsgHistory(gID){ +function initMsgHistory(gID) { if (!groupsMap[gID]) { let verify = stmt_getGroupVerify.get(gID).verify; // 暂时这么写 @@ -346,7 +444,7 @@ function initMsgHistory(gID){ .prepare(`SELECT message,type,sender,timestamp FROM ${gID}`) .all() .map(v => { - return { type: v.type, msg: v.message,from:v.sender,timestamp:v.timestamp }; + return { type: v.type, msg: v.message, from: v.sender, timestamp: v.timestamp }; }); // console.log(msgHistory) groupsMap[gID] = { verify, member: [], msgHistory }; @@ -359,8 +457,8 @@ wss.on("connection", socket => { const no = wss.clients.size; const joinedGroup = []; var uuid = uuid4(); - function setUuid(new_uuid){ - uuid = new_uuid + function setUuid(new_uuid) { + uuid = new_uuid; } socket.on("message", message => { try { @@ -392,14 +490,14 @@ wss.on("connection", socket => { } } else if (type === "message") { let gID = msg.gID; - broadcastMsg(gID, msg.msg,uuid); + 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 + uuid = msg.uuid; } } } diff --git a/src/App.vue b/src/App.vue index c8acd07..39d6cc8 100644 --- a/src/App.vue +++ b/src/App.vue @@ -3,85 +3,121 @@ import upload from "./views/uploadFileMiao.vue"; import download from "./views/downloadFileMiao.vue"; import setting from "./views/setting.vue"; 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 login from "./views/login.vue"; +import account from "./views/accountInfo.vue"; +import getQueryString from '@/func/getQuery' +import { NNotificationProvider, NMessageProvider, NCard, NMenu, NIcon,NModalProvider } from 'naive-ui' +import { ref, watch, h ,shallowRef, onMounted, computed} from "vue"; +// import { useRoute } from "vue-router"; import { ArrowUpCircleOutline as uploadIcon, ArrowDownCircleOutline as downloadIcon, ChatboxEllipsesOutline as chatIcon, - SettingsOutline as settingIcon + SettingsOutline as settingIcon, + PersonOutline as AccountIcon } from '@vicons/ionicons5' +import { useSettingStore } from "@/pinia/store"; + +const settingData = useSettingStore(); const activePage = ref('upload') const isComponent = shallowRef(upload) watch(activePage, () => { - isComponent.value={upload,download,setting,chat}[activePage.value] + isComponent.value={upload,download,setting,chat,login,account}[activePage.value] }) function renderIcon(icon) { return () => h(NIcon, null, { default: () => h(icon) }) } -const menuOptions = [ +const menuOptions = ref([ { label: '上传', key: 'upload', icon: renderIcon(uploadIcon), + disabled:computed(()=>{ + // console.log(settingData) + return settingData.token === null + }) }, { label: '下载', key: 'download', icon: renderIcon(downloadIcon), + disabled:computed(()=>{ + return settingData.token === null + }) }, { label: 'Chat', key: 'chat', icon: renderIcon(chatIcon), + disabled:computed(()=>{ + return settingData.token === null + }) }, { label: '设置', key: 'setting', icon: renderIcon(settingIcon), + disabled:computed(()=>{ + return settingData.token === null + }) + }, + { + label:'账户', + key:'account', + icon: renderIcon(AccountIcon), + disabled:computed(()=>{ + return settingData.token === null + }) } -] +]) +// function getQueryString(key) { +// var reg = new RegExp('(^|&)' + key + '=([^&]*)(&|$)', 'i'); +// var r = window.location.search.substr(1).match(reg); +// if (r != null) { +// return unescape(r[2]); +// } +// return null; +// } +onMounted(()=>{ + let aP = getQueryString('aP') + // console.log(aP) + if(aP){ + activePage.value = aP + } + if(settingData.token === null){ + aP = activePage.value + activePage.value = 'login' + // 登录后跳原来的activePage + const w = watch(()=>settingData.token,()=>{ + activePage.value = aP + w() + }) + } +}) \ No newline at end of file diff --git a/src/views/uploadFileMiao.vue b/src/views/uploadFileMiao.vue index f6c598d..783f39f 100644 --- a/src/views/uploadFileMiao.vue +++ b/src/views/uploadFileMiao.vue @@ -37,7 +37,7 @@