diff --git a/package-lock.json b/package-lock.json index e0618f3..4da92f9 100644 --- a/package-lock.json +++ b/package-lock.json @@ -9,6 +9,7 @@ "version": "1.2.0", "dependencies": { "aes-js": "^3.1.2", + "crypto-js": "^4.2.0", "express": "^4.18.2", "file-saver": "^2.0.5", "js-base64": "^3.7.6", @@ -21,6 +22,7 @@ "ws": "^8.16.0" }, "devDependencies": { + "@vicons/ionicons5": "^0.12.0", "@vitejs/plugin-vue": "^5.0.3", "better-sqlite3": "^8.7.0", "concurrently": "^8.2.2", @@ -652,6 +654,12 @@ "@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": { "version": "5.0.3", "resolved": "https://registry.npmmirror.com/@vitejs/plugin-vue/-/plugin-vue-5.0.3.tgz", @@ -1043,6 +1051,11 @@ "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": { "version": "0.15.12", "resolved": "https://registry.npmmirror.com/css-render/-/css-render-0.15.12.tgz", diff --git a/package.json b/package.json index b9ca30a..4292980 100644 --- a/package.json +++ b/package.json @@ -12,6 +12,7 @@ }, "dependencies": { "aes-js": "^3.1.2", + "crypto-js": "^4.2.0", "express": "^4.18.2", "file-saver": "^2.0.5", "js-base64": "^3.7.6", @@ -24,6 +25,7 @@ "ws": "^8.16.0" }, "devDependencies": { + "@vicons/ionicons5": "^0.12.0", "@vitejs/plugin-vue": "^5.0.3", "better-sqlite3": "^8.7.0", "concurrently": "^8.2.2", diff --git a/server.js b/server.js index 1ba3580..c75f17e 100644 --- a/server.js +++ b/server.js @@ -1,213 +1,395 @@ -import express from 'express' -import cors from 'cors' -import Database from 'better-sqlite3'; -import fs from "fs" +import express from "express"; +import cors from "cors"; +import Database from "better-sqlite3"; +import fs from "fs"; +import { WebSocketServer } from "ws"; +import http from "http"; // import Config from "./miaoShareConfig.json" - -const HOST = '0.0.0.0' +const HOST = "0.0.0.0"; // const PORT = Config.PORT -const PORT = 17057 +const PORT = 17057; const fileDir = "./temp"; -const dbPath = './miaoShare.db' +const dbPath = "./miaoShare.db"; const PATH = "./dist"; + // 上传文件最大大小:200MB -const uploadMaxSize=200*1024*1024 +const uploadMaxSize = 200 * 1024 * 1024; // 一天的毫秒数 -const millisecondsOfTheDay = parseInt(24*3600*1000) +const millisecondsOfOneDay = parseInt(24 * 3600 * 1000); // 文件3天过期 -const LifeOfFile=millisecondsOfTheDay*3 +const LifeOfFile = millisecondsOfOneDay * 3; // const LifeOfFile=0 // 数据库相关 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, fileName TEXT NOT NULL, timestamp INT NOT NULL, freeze tinyint(1) NOT NULL, downloadCredit INT NOT NULL -);`).run() -const stmt_getFileName = db.prepare(`SELECT fileName FROM id2fileName WHERE id = ?`) -const stmt_getTimestamp = db.prepare(`SELECT timestamp 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_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 = ?`) +);` +).run(); +const stmt_getFileName = db.prepare(`SELECT fileName FROM id2fileName WHERE id = ?`); +const stmt_getTimestamp = db.prepare(`SELECT timestamp 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_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 db_insert = (id,fileName,downloadCredit)=>{ - stmt_insertId2FileName.run(id,fileName,parseInt(Date.now()),0,downloadCredit) -} -const db_getFileName = (id)=>{ - try{ - if(stmt_getFreeze.get(id)['freeze'] == 1)return null - return stmt_getFileName.get(id)['fileName'] - }catch(e){ - return null - } -} +const db_insert = (id, fileName, downloadCredit) => { + stmt_insertId2FileName.run(id, fileName, parseInt(Date.now()), 0, downloadCredit); +}; +const db_getFileName = id => { + try { + if (stmt_getFreeze.get(id)["freeze"] == 1) return null; + return stmt_getFileName.get(id)["fileName"]; + } catch (e) { + return null; + } +}; // 检查是否可下载 -const db_downloadable = (id)=>{ - try{ - // 懒 - if(stmt_getDownloadCredit.get(id)['downloadCredit'] < 1)return false - if(stmt_getFreeze.get(id)['freeze'] == 1)return false - return true - }catch(e){ - return false - } -} -const db_updateDownloadCredit = (id)=>{ - try{ - stmt_updateDownloadCredit.run(id) - return true - }catch(e){ - return false - } -} +const db_downloadable = id => { + try { + // 懒 + if (stmt_getDownloadCredit.get(id)["downloadCredit"] < 1) return false; + if (stmt_getFreeze.get(id)["freeze"] == 1) return false; + return true; + } catch (e) { + return false; + } +}; +const db_updateDownloadCredit = id => { + try { + stmt_updateDownloadCredit.run(id); + return true; + } catch (e) { + return false; + } +}; -const db_getTimestamp = (id)=>{ - return stmt_getTimestamp.get(id)['timestamp'] -} +const db_getTimestamp = id => { + return stmt_getTimestamp.get(id)["timestamp"]; +}; // 更新存储的文件,删除已经被冻结的文件以及相关记录,然后冻结过期文件 -const updateDBAndFiles = ()=>{ - try{ - let rows = stmt_getFreezenIDs.all() - stmt_deleteExpireData.run() - for(let row of rows){ - let fileName = row['id'] - let path = fileDir + '/' + fileName - try{ - fs.unlink(path,(e)=>{if(e)throw e}) - }catch(e){ - console.log(e) - continue - } - } - stmt_freezeExpireData.run(parseInt(Date.now()) - LifeOfFile) - }catch(e){ - console.log(e) - return - } -} -updateDBAndFiles() +const updateDBAndFiles = () => { + try { + let rows = stmt_getFreezenIDs.all(); + stmt_deleteExpireData.run(); + for (let row of rows) { + let fileName = row["id"]; + let path = fileDir + "/" + fileName; + try { + fs.unlink(path, e => { + if (e) throw e; + }); + } catch (e) { + console.log(e); + continue; + } + } + stmt_freezeExpireData.run(parseInt(Date.now()) - LifeOfFile); + } catch (e) { + console.log(e); + return; + } +}; +updateDBAndFiles(); // 3小时更新一次 -setInterval(updateDBAndFiles,1000*3600*3) +setInterval(updateDBAndFiles, 1000 * 3600 * 3); +// // 测试环境一分钟更新一次,记得注释掉 +// setInterval(updateDBAndFiles, 1000 * 60); +const app = express(); -var app = express(); app.use(cors()); -app.options('*', cors()); -var tempMap = {} +app.options("*", cors()); +// var tempMap = {} if (!fs.existsSync(fileDir)) { - fs.mkdirSync(fileDir); + fs.mkdirSync(fileDir); } -function generateId(){ - var returnStr = "", - range = 8, - charStr = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789'; - - for(var i=0; i{console.log(c)}) - req.on("end", function () { - fileStream.end(); - res.statusCode = 200; - res.end(id); - }); - req.on("error", err => { - fileStream.end(); - res.statusCode = 500; - res.end("File save failed: " + err.message); - }); +function uploadFile(req, res, fileName, downloadCredit) { + let id = generateId(); + const fileStream = fs.createWriteStream(fileDir + "/" + id); + db_insert(id, fileName, downloadCredit); + // tempMap[id] = fileName; + // console.log(tempMap); + req.pipe(fileStream); + res.on("data", c => { + console.log(c); + }); + req.on("end", function () { + fileStream.end(); + res.statusCode = 200; + res.end(id); + }); + req.on("error", err => { + fileStream.end(); + res.statusCode = 500; + res.end("File save failed: " + err.message); + }); } -function downloadFile(req, res, fileId){ - try { - if(db_downloadable(fileId) == false){ - res.writeHead(404); - res.end(null); - return - } - db_updateDownloadCredit(fileId) - var fileName = db_getFileName(fileId) - if(fileName == null){ - res.writeHead(404); - res.end(null); - return - } - let data = fs.readFileSync(fileDir + '/' + fileId); - res.writeHead(200, { - "Content-Type": "application/octet-stream ", - "File-Name": fileName, - 'Content-Length':data.length, - }); - res.end(data); - } catch (err) { - console.log(err); - res.writeHead(404); - res.end(null); - } +function downloadFile(req, res, fileId) { + try { + if (db_downloadable(fileId) == false) { + res.writeHead(404); + res.end(null); + return; + } + db_updateDownloadCredit(fileId); + var fileName = db_getFileName(fileId); + if (fileName == null) { + res.writeHead(404); + res.end(null); + return; + } + let data = fs.readFileSync(fileDir + "/" + fileId); + res.writeHead(200, { + "Content-Type": "application/octet-stream ", + "File-Name": fileName, + "Content-Length": data.length + }); + res.end(data); + } catch (err) { + console.log(err); + res.writeHead(404); + res.end(null); + } } - app.use(express.static(PATH)); // 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-Headers", "*"); res.header("Access-Control-Allow-Methods", "POST"); res.header("Access-Control-Expose-Headers", "File-Name"); - var fileSize = parseInt(req.get('Content-Length')) - var fileName = req.query.fileName; - var downloadCredit = parseInt(req.query.downloadCredit); - if(downloadCredit == -1)downloadCredit = 2147483647 - if(!fileName){ - res.statusCode = 500; - res.end("FileName Not Found"); - }else if(fileSize > uploadMaxSize){ - res.statusCode = 500; - res.end("Maximum size limit exceeded"); - } - else{ - uploadFile(req, res, fileName, downloadCredit); - } + var fileSize = parseInt(req.get("Content-Length")); + var fileName = req.query.fileName; + var downloadCredit = parseInt(req.query.downloadCredit); + if (downloadCredit == -1) downloadCredit = 2147483647; + if (!fileName) { + res.statusCode = 500; + res.end("FileName Not Found"); + } else if (fileSize > uploadMaxSize) { + res.statusCode = 500; + res.end("Maximum size limit exceeded"); + } else { + 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-Headers", "*"); res.header("Access-Control-Allow-Methods", "GET"); res.header("Access-Control-Expose-Headers", "File-Name"); - var fileId = req.query.fileName; - if(!fileId){ - res.statusCode = 500; - res.end("FileName Not Found"); - }else{ - downloadFile(req, res, fileId); - } + var fileId = req.query.fileName; + if (!fileId) { + res.statusCode = 500; + res.end("FileName Not Found"); + } else { + downloadFile(req, res, fileId); + } }); -// 启动服务器 -app.listen(PORT, HOST, function(){ +// // 启动服务器 +// app.listen(PORT, HOST, function(){ +// 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; + + +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,sender){ + 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',sender,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) { + 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}; + } + return groupsMap[gID].verify; +} + +// 正式加入群组 +function joinGroup(socket, gID, callback) { + groupsMap[gID].member.push(socket); + updateActiveTimestamp(gID) + callback(); +} + +// 暂时这么写 +function getHistory(gID) { + return groupsMap[gID].msgHistory; +} + +function broadcastMsg(gID, msg) { + updateActiveTimestamp(gID) + insertMessageByGID(gID,msg,'NULL') + + let bmsg = JSON.stringify({ type: "gMsg", gID, msg }) + groupsMap[gID].msgHistory.push({ type: "gMsg", msg }); + for (let socket of groupsMap[gID].member) { + socket.send(bmsg); + } +} + +wss.on("connection", socket => { + console.log("新的连接已建立"); + const no = wss.clients.size; + const joinedGroup = [] + 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); + } + } + } 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, () => {}); diff --git a/src/App.vue b/src/App.vue index caeb590..d194142 100644 --- a/src/App.vue +++ b/src/App.vue @@ -1,8 +1,50 @@ @@ -12,17 +54,35 @@ import {NNotificationProvider,NMessageProvider,NCard,NTabs,NTabPane} from 'naive - - - - - - - - - - - + + +
+ + + + +
+
@@ -39,9 +99,19 @@ import {NNotificationProvider,NMessageProvider,NCard,NTabs,NTabPane} from 'naive justify-content: center; align-items: center; } + #theCard { - width: 50%; - height: 80%; + width: 40vw; + 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) { #theCard { diff --git a/src/func/download.js b/src/func/download.js index 5cba942..2f42fa1 100644 --- a/src/func/download.js +++ b/src/func/download.js @@ -18,14 +18,15 @@ const blob2Uint8Array = function (blob) { }); }; const decrypt = (key, data) => { + key = key.trim() return blob2Uint8Array(data).then(data => { // 无加密 if (key.length === 0) { return data; } // SM4 - if (key.length >= 34) { - key = key.substring(3); + 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; @@ -39,14 +40,17 @@ const decrypt = (key, data) => { }); }; const decryptString = (key, str) => { + key = key.trim() + console.log(key.length) // 无加密 if (key.length === 0) { - return sm4.decrypt(str, "miaospringmiaospringmiaospringao"); + // return sm4.decrypt(str, "miaospringmiaospringmiaospringao"); + return Base64.decode(str) } // SM4 // console.log(key,key.length) - if (key.length >= 34) { - key = key.substring(3); + if (key.length === 19) { + key = [...aesjs.utils.utf8.toBytes(key.substring(3))]; return sm4.decrypt(str, key); } // AES @@ -67,13 +71,6 @@ const downloadFromUint8Array = (data, fileName) => { 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); }; export { blob2Uint8Array, decrypt, decryptString, downloadFromUint8Array }; diff --git a/src/func/upload.js b/src/func/upload.js index ca9d1d1..aa4cca3 100644 --- a/src/func/upload.js +++ b/src/func/upload.js @@ -21,13 +21,17 @@ const generateKey = function(setting) { } } var returnStr = "", - length = setting.activeFuction === "AES128" ? 16 : 32 + length = setting.activeFuction !== "AES256" ? 16 : 32 // charMap = "ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789"; for (var i = 0; i < length; i++) { - var index = Math.round(Math.random() * charMap.length); + 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) { @@ -61,12 +65,15 @@ const encrypt = (key, data, fileName, setting, message) => { let encrypted_data = null if(setting.activeFuction === "不加密"){ encrypted_data = data + // AES }else if(setting.activeFuction != "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}加密完成`); } @@ -76,9 +83,10 @@ const encrypt = (key, data, fileName, setting, message) => { // setting为pinia存储的setting。。。 const encryptString = (key, str, setting) => { - // console.log(key) - if(setting.activeFuction === "不加密"){ - return sm4.encrypt(str, 'miaospringmiaospringmiaospringao') + // console.log(key,key.length) + if(setting.activeFuction === "不加密" || key === ''){ + // return sm4.encrypt(str, 'miaospringmiaospringmiaospringao') + return Base64.encode(str) }else if(setting.activeFuction !== "SM4"){ key = aesjs.utils.utf8.toBytes(key); var data = aesjs.utils.utf8.toBytes(str); @@ -86,6 +94,8 @@ const encryptString = (key, str, setting) => { 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) } }; diff --git a/src/main.js b/src/main.js index ea866fc..7f54543 100644 --- a/src/main.js +++ b/src/main.js @@ -3,7 +3,7 @@ import 'vfonts/Lato.css' import { createApp } from "vue"; import App from "./App.vue"; -import router from "./router"; +// import router from "./router"; // import naive from "naive-ui"; import { createPinia } from "pinia"; @@ -14,7 +14,7 @@ import { createPinia } from "pinia"; const pinia = createPinia() const app = createApp(App); -app.use(router); +// app.use(router); app.use(pinia); // app.use(naive); diff --git a/src/router/index.js b/src/router/index.js index ef2c539..87302f9 100644 --- a/src/router/index.js +++ b/src/router/index.js @@ -1,22 +1,50 @@ +// 未使用 + 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({ history: createWebHistory(import.meta.env.BASE_URL), routes: [ - // { - // path: '/', - // name: 'home', - // component: HomeView - // }, - // { - // path: '/about', - // name: 'about', - // // route level code-splitting - // // this generates a separate chunk (About.[hash].js) for this route - // // which is lazy-loaded when the route is visited. - // component: () => import('../views/AboutView.vue') - // } + { + path: '/', + redirect: '/upload', + }, + { + path: '/upload', + name: 'upload', + component: uploadFileMiao, + meta: { + keepAlive: true, + } + }, + { + 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, + } + }, ] }) diff --git a/src/views/chat.vue b/src/views/chat.vue new file mode 100644 index 0000000..ca56dfc --- /dev/null +++ b/src/views/chat.vue @@ -0,0 +1,139 @@ + + + + + \ No newline at end of file diff --git a/src/components/downloadFileMiao.vue b/src/views/downloadFileMiao.vue similarity index 99% rename from src/components/downloadFileMiao.vue rename to src/views/downloadFileMiao.vue index 34c4d50..58d0cf7 100644 --- a/src/components/downloadFileMiao.vue +++ b/src/views/downloadFileMiao.vue @@ -22,6 +22,7 @@ :max-height="250" :bordered="false" :single-line="false" + style="user-select: none;" /> diff --git a/src/components/setting.vue b/src/views/setting.vue similarity index 96% rename from src/components/setting.vue rename to src/views/setting.vue index 7ebea07..2db58d9 100644 --- a/src/components/setting.vue +++ b/src/views/setting.vue @@ -2,7 +2,7 @@
-

选择加密算法:

+

选择加密算法:


@@ -16,7 +16,7 @@
-

选择密钥组成:

+

选择密钥组成:


diff --git a/src/components/uploadFileMiao.vue b/src/views/uploadFileMiao.vue similarity index 95% rename from src/components/uploadFileMiao.vue rename to src/views/uploadFileMiao.vue index 2fdc1bd..f6c598d 100644 --- a/src/components/uploadFileMiao.vue +++ b/src/views/uploadFileMiao.vue @@ -11,8 +11,8 @@ - 点击此处或者拖动文件到该区域来上传 - + 点击此处或者拖动文件到该区域来上传 + 最大支持200MB大小文件,其实只是懒得做分片上传而已
虽然理论上没有人有能力审查你上传的东西
反正没人用写这么多干什么。。。 @@ -31,6 +31,7 @@ :max-height="250" :bordered="false" :single-line="false" + style="user-select: none;" />
@@ -208,9 +209,9 @@ const customRequest = ({ if (xhr.readyState === 4 && xhr.status === 200) { let id = xhr.responseText; let code = id + key - if(setting.activeFuction === "SM4"){ - code = id + 'SM4' + key - } + // if(setting.activeFuction === "SM4"){ + // code = id + 'SM4' + key + // } file_Code_Map.value.push({ code: code, fileName: fileName diff --git a/vite.config.js b/vite.config.js index 474ac92..f6ff2bf 100644 --- a/vite.config.js +++ b/vite.config.js @@ -14,7 +14,7 @@ export default defineConfig({ } }, server:{ - host:'0.0.0.0', + // host:'0.0.0.0', port:'17058', open:true, },