diff --git a/Database/index.js b/Database/index.js new file mode 100644 index 0000000..f78e1ab --- /dev/null +++ b/Database/index.js @@ -0,0 +1,13 @@ +const mysql = require('mysql2/promise'); + +async function initSQL() { + const connection = await mysql.createConnection({ + host: 'localhost', + user: 'root', + database: 'rgvofficial', + password: 'root' + }); + global.SQL = connection +} + +module.exports = initSQL; \ No newline at end of file diff --git a/app.js b/app.js index 9849534..3290f1d 100644 --- a/app.js +++ b/app.js @@ -9,6 +9,12 @@ const {koaBody} = require('koa-body')// 支持form-data,支持文件,不 const index = require('./routes/index') const users = require('./routes/users') const fileStorage = require('./routes/fileStorage') +const menu = require('./routes/menu') +const container = require('./routes/container') + +const initSQL = require('./Database/index'); + +initSQL() // error handler onerror(app) @@ -48,10 +54,14 @@ app.use(koaBody({ app.use(index.routes(), index.allowedMethods()) app.use(users.routes(), users.allowedMethods()) app.use(fileStorage.routes(), fileStorage.allowedMethods()) +app.use(menu.routes(), menu.allowedMethods()) +app.use(container.routes(), container.allowedMethods()) +global.dirname = __dirname // error-handling app.on('error', (err, ctx) => { console.error('server error', err, ctx) }); + module.exports = app diff --git a/fileStorage/16762068728143c6ccd311ca.jpg b/fileStorage/16762068728143c6ccd311ca.jpg new file mode 100644 index 0000000..faf958a Binary files /dev/null and b/fileStorage/16762068728143c6ccd311ca.jpg differ diff --git a/package.json b/package.json index cc02ed8..4a671ae 100644 --- a/package.json +++ b/package.json @@ -19,6 +19,7 @@ "koa-router": "^7.4.0", "koa-static": "^5.0.0", "koa-views": "^6.2.0", + "mysql2": "^3.1.2", "pug": "^2.0.3" }, "devDependencies": { diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 8973760..9b6477d 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -11,6 +11,7 @@ specifiers: koa-router: ^7.4.0 koa-static: ^5.0.0 koa-views: ^6.2.0 + mysql2: ^3.1.2 nodemon: ^1.19.1 pug: ^2.0.3 @@ -25,6 +26,7 @@ dependencies: koa-router: registry.npmmirror.com/koa-router/7.4.0 koa-static: registry.npmmirror.com/koa-static/5.0.0 koa-views: registry.npmmirror.com/koa-views/6.3.1_pug@2.0.4 + mysql2: registry.npmmirror.com/mysql2/3.1.2 pug: registry.npmmirror.com/pug/2.0.4 devDependencies: @@ -1109,6 +1111,13 @@ packages: version: 1.0.0 dev: false + registry.npmmirror.com/denque/2.1.0: + resolution: {integrity: sha512-HVQE3AAb/pxF8fQAoiqpvg9i3evqug3hoiwakOyZAwJm+6vZehbkYXZ0l4JxS+I3QxM97v5aaRNhj8v5oBhekw==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/denque/-/denque-2.1.0.tgz} + name: denque + version: 2.1.0 + engines: {node: '>=0.10'} + dev: false + registry.npmmirror.com/depd/1.1.2: resolution: {integrity: sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/depd/-/depd-1.1.2.tgz} name: depd @@ -1354,6 +1363,14 @@ packages: version: 1.1.1 dev: false + registry.npmmirror.com/generate-function/2.3.1: + resolution: {integrity: sha512-eeB5GfMNeevm/GRYq20ShmsaGcmI81kIX2K9XQx5miC8KdHaC6Jm0qQ8ZNeGOi7wYB8OsdxKs+Y2oVuTFuVwKQ==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/generate-function/-/generate-function-2.3.1.tgz} + name: generate-function + version: 2.3.1 + dependencies: + is-property: registry.npmmirror.com/is-property/1.0.2 + dev: false + registry.npmmirror.com/get-intrinsic/1.2.0: resolution: {integrity: sha512-L049y6nFOuom5wGyRc3/gdTLO94dySVKRACj1RmJZBQXlbTMhtNIgkWkUHq+jYmZvKf14EW1EoJnnjbmoHij0Q==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/get-intrinsic/-/get-intrinsic-1.2.0.tgz} name: get-intrinsic @@ -1585,6 +1602,15 @@ packages: safer-buffer: registry.npmmirror.com/safer-buffer/2.1.2 dev: false + registry.npmmirror.com/iconv-lite/0.6.3: + resolution: {integrity: sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/iconv-lite/-/iconv-lite-0.6.3.tgz} + name: iconv-lite + version: 0.6.3 + engines: {node: '>=0.10.0'} + dependencies: + safer-buffer: registry.npmmirror.com/safer-buffer/2.1.2 + dev: false + registry.npmmirror.com/ignore-by-default/1.0.1: resolution: {integrity: sha512-Ius2VYcGNk7T90CppJqcIkS5ooHUZyIQK+ClZfMfMNFEF9VSE73Fq+906u/CWu92x4gzZMWOwfFYckPObzdEbA==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/ignore-by-default/-/ignore-by-default-1.0.1.tgz} name: ignore-by-default @@ -1848,6 +1874,12 @@ packages: version: 2.2.2 dev: false + registry.npmmirror.com/is-property/1.0.2: + resolution: {integrity: sha512-Ks/IoX00TtClbGQr4TWXemAnktAQvYB7HzcCxDGqEZU6oCmb2INHuOoKxbtR+HFkmYWBKv/dOZtGRiAjDhj92g==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/is-property/-/is-property-1.0.2.tgz} + name: is-property + version: 1.0.2 + dev: false + registry.npmmirror.com/is-redirect/1.0.0: resolution: {integrity: sha512-cr/SlUEe5zOGmzvj9bUyC4LVvkNVAXu4GytXLNMr1pny+a65MpQ9IJzFHD5vi7FyJgb4qt27+eS3TuQnqB+RQw==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/is-redirect/-/is-redirect-1.0.0.tgz} name: is-redirect @@ -2249,6 +2281,12 @@ packages: version: 4.17.21 dev: false + registry.npmmirror.com/long/5.2.1: + resolution: {integrity: sha512-GKSNGeNAtw8IryjjkhZxuKB3JzlcLTwjtiQCHKvqQet81I93kXslhDQruGI/QsddO83mcDToBVy7GqGS/zYf/A==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/long/-/long-5.2.1.tgz} + name: long + version: 5.2.1 + dev: false + registry.npmmirror.com/longest/1.0.1: resolution: {integrity: sha512-k+yt5n3l48JU4k8ftnKG6V7u32wyH2NfKzeMto9F/QRE0amxy/LayxwlvjjkZEIzqR+19IrtFO8p5kB9QaYUFg==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/longest/-/longest-1.0.1.tgz} name: longest @@ -2271,6 +2309,13 @@ packages: pseudomap: registry.npmmirror.com/pseudomap/1.0.2 yallist: registry.npmmirror.com/yallist/2.1.2 + registry.npmmirror.com/lru-cache/7.14.1: + resolution: {integrity: sha512-ysxwsnTKdAx96aTRdhDOCQfDgbHnt8SK0KY8SEjO0wHinhWOFTESbjVCMPbU1uGXg/ch4lifqx0wfjOawU2+WA==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/lru-cache/-/lru-cache-7.14.1.tgz} + name: lru-cache + version: 7.14.1 + engines: {node: '>=12'} + dev: false + registry.npmmirror.com/make-dir/1.3.0: resolution: {integrity: sha512-2w31R7SJtieJJnQtGc7RVL2StM2vGYVfqUOvUDxH6bC6aJTxPxTF0GnIgCyu7tjockiUWAYQRbxa7vKn34s5sQ==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/make-dir/-/make-dir-1.3.0.tgz} name: make-dir @@ -2400,6 +2445,22 @@ packages: name: ms version: 2.1.3 + registry.npmmirror.com/mysql2/3.1.2: + resolution: {integrity: sha512-NXz6sUvHSEOKz1jv3koSga7eb2dHrwD/mnPmqbbZzMRvjQcSpb0Eh0ectWyYt1U60CLlEbjoA3XYjjbbReRF5Q==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/mysql2/-/mysql2-3.1.2.tgz} + name: mysql2 + version: 3.1.2 + engines: {node: '>= 8.0'} + dependencies: + denque: registry.npmmirror.com/denque/2.1.0 + generate-function: registry.npmmirror.com/generate-function/2.3.1 + iconv-lite: registry.npmmirror.com/iconv-lite/0.6.3 + long: registry.npmmirror.com/long/5.2.1 + lru-cache: registry.npmmirror.com/lru-cache/7.14.1 + named-placeholders: registry.npmmirror.com/named-placeholders/1.1.3 + seq-queue: registry.npmmirror.com/seq-queue/0.0.5 + sqlstring: registry.npmmirror.com/sqlstring/2.3.3 + dev: false + registry.npmmirror.com/mz/2.7.0: resolution: {integrity: sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/mz/-/mz-2.7.0.tgz} name: mz @@ -2410,6 +2471,15 @@ packages: thenify-all: registry.npmmirror.com/thenify-all/1.6.0 dev: false + registry.npmmirror.com/named-placeholders/1.1.3: + resolution: {integrity: sha512-eLoBxg6wE/rZkJPhU/xRX1WTpkFEwDJEN96oxFrTsqBdbT5ec295Q+CoHrL9IT0DipqKhmGcaZmwOt8OON5x1w==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/named-placeholders/-/named-placeholders-1.1.3.tgz} + name: named-placeholders + version: 1.1.3 + engines: {node: '>=12.0.0'} + dependencies: + lru-cache: registry.npmmirror.com/lru-cache/7.14.1 + dev: false + registry.npmmirror.com/nan/2.17.0: resolution: {integrity: sha512-2ZTgtl0nJsO0KQCjEpxcIr5D+Yv90plTitZt9JBfQvVJDS5seMl3FOvsh3+9CoYWXf/1l5OaZzzF6nDm4cagaQ==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/nan/-/nan-2.17.0.tgz} name: nan @@ -3036,6 +3106,12 @@ packages: version: 5.7.1 hasBin: true + registry.npmmirror.com/seq-queue/0.0.5: + resolution: {integrity: sha512-hr3Wtp/GZIc/6DAGPDcV4/9WoZhjrkXsi5B/07QgX8tsdc6ilr7BFM6PM6rbdAX1kFSDYeZGLipIZZKyQP0O5Q==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/seq-queue/-/seq-queue-0.0.5.tgz} + name: seq-queue + version: 0.0.5 + dev: false + registry.npmmirror.com/set-value/2.0.1: resolution: {integrity: sha512-JxHc1weCN68wRY0fhCoXpyK55m/XPHafOmK4UWD7m2CI14GMcFypt4w/0+NV5f/ZMby2F6S2wwA7fgynh9gWSw==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/set-value/-/set-value-2.0.1.tgz} name: set-value @@ -3179,6 +3255,13 @@ packages: extend-shallow: registry.npmmirror.com/extend-shallow/3.0.2 dev: true + registry.npmmirror.com/sqlstring/2.3.3: + resolution: {integrity: sha512-qC9iz2FlN7DQl3+wjwn3802RTyjCx7sDvfQEXchwa6CWOx07/WVfh91gBmQ9fahw8snwGEWU3xGzOt4tFyHLxg==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/sqlstring/-/sqlstring-2.3.3.tgz} + name: sqlstring + version: 2.3.3 + engines: {node: '>= 0.6'} + dev: false + registry.npmmirror.com/static-extend/0.1.2: resolution: {integrity: sha512-72E9+uLc27Mt718pMHt9VMNiAL4LMsmDbBva8mxWUCkT07fSzEGMYUCk0XWY6lp0j6RBAG4cJ3mWuZv2OE3s0g==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/static-extend/-/static-extend-0.1.2.tgz} name: static-extend diff --git a/routes/container.js b/routes/container.js new file mode 100644 index 0000000..85dc2e9 --- /dev/null +++ b/routes/container.js @@ -0,0 +1,87 @@ +const router = require('koa-router')() + + +// 全局路由 +router.prefix('/container') +router.get('/', async (ctx, next) => { + const arg = ctx.request.query + if (!Object.keys(arg).includes('menuId')) { + ctx.body = { + data: {}, + state: false, + message: '缺少MenuId' + } + return + } + const [rows, fields] = await global.SQL.execute('SELECT * FROM `container` WHERE `isdelete` = 0 AND `menuId` = ?', [arg.menuId]); + ctx.body = { + data: rows, + state: true, + message: '获取内容成功' + } +}) +router.delete('/', async (ctx, next) => { + const arg = ctx.request.query + console.log(arg) + if (!Object.keys(arg).includes('id')) { + ctx.body = { + data: {}, + state: false, + message: '缺少id' + } + return + } + const [rows, fields] = await global.SQL.execute('UPDATE container SET isdelete = 1 WHERE `id` = ?', [arg.id]); + ctx.body = { + data: rows, + state: true, + message: '删除内容成功' + } +}) +router.put('/', async (ctx, next) => { + const arg = ctx.request.body + const field = ['id', 'name', 'rank', 'config', 'body'] + const noField = [] + field.map(item => { + if (!Object.keys(arg).includes(item)) noField.push(item) + }) + if (noField.length != 0) { + ctx.body = { + data: {}, + state: false, + message: '缺少' + noField + } + return + } + const [rows, fields] = await global.SQL.execute('UPDATE container SET name = ? , rank = ? , config = ? , body = ? WHERE id = ?', [arg.name, arg.rank, arg.config, arg.body, Number(arg.id)]); + ctx.body = ctx.body = { + data: rows, + state: true, + message: '更新成功' + } +}) +router.post('/createContainer', async (ctx, next) => { + const arg = ctx.request.body + const field = ['menuId', 'name', 'rank', 'config', 'body'] + const noField = [] + field.map(item => { + if (!Object.keys(arg).includes(item)) noField.push(item) + }) + if (noField.length != 0) { + ctx.body = { + data: {}, + state: false, + message: '缺少' + noField + } + return + } + const createTime = new Date().getTime() + const [rows, fields] = await global.SQL.execute('INSERT INTO container (menuid, name, rank, config, body, createTime) VALUES (?, ?, ?, ?, ?, ?)', [arg.menuId, arg.name, arg.rank, arg.config, arg.body, createTime]); + ctx.body = ctx.body = { + data: rows, + state: true, + message: '创建成功' + } +}) + +module.exports = router diff --git a/routes/fileStorage.js b/routes/fileStorage.js index 4e16b7c..65bf910 100644 --- a/routes/fileStorage.js +++ b/routes/fileStorage.js @@ -39,19 +39,41 @@ router.post('/putfile', async (ctx) => { status:'error', }; } + console.log(file.newFilename) + console.log(arg.md5) const md5 = await readFileMd5(file.filepath) + console.log(md5) + if(md5 == arg.md5){ + const createTime = new Date().getTime() + const [rows, fields] = await global.SQL.execute('SELECT * FROM `file` WHERE `md5` = ?', [arg.md5]); + let filename = createTime.toString() + parseInt(Math.random() * 10000000000000).toString(16) +'.'+ file.newFilename.split('.').slice(-1) + if(rows.length == 0){ + await global.SQL.execute('INSERT INTO `file` (md5, filename, createTime, filesize) VALUES (?, ?, ?, ?)', [arg.md5, filename, createTime, file.size]); + const reader = fs.createReadStream(file.filepath); // 创建可读流 + const upStream = fs.createWriteStream(global.dirname + '/fileStorage/' + filename); // 创建可写流 + reader.pipe(upStream); // 可读流通过管道写入可写流 + }else{ + filename = rows[0].filename + } + return ctx.body = { + message:'上传成功', + state: true, + data:{ + md5, + filename + } + }; + }else{ + return ctx.body = { + message:'文件损坏', + state:false, + }; + } // const file = ctx.request.files.file; // 获取上传文件 // const reader = fs.createReadStream(file.filepath); // 创建可读流 // const upStream = fs.createWriteStream('./StaticFile_Backup/' + ctx.request.body.dirname + '/' + ctx.request.body.key); // 创建可写流 // reader.pipe(upStream); // 可读流通过管道写入可写流 - return ctx.body = { - message:'上传成功', - status:'ok', - data:{ - md5 - } - }; }); router.get('/string', async (ctx, next) => { diff --git a/routes/menu.js b/routes/menu.js new file mode 100644 index 0000000..d8c1533 --- /dev/null +++ b/routes/menu.js @@ -0,0 +1,22 @@ +const router = require('koa-router')() + +// 全局路由 +router.prefix('/menu') +router.get('/getMenu', async (ctx, next) => { + const [rows, fields] = await global.SQL.execute('SELECT * FROM `menu` WHERE `isdelete` = 0'); + ctx.body = rows +}) +router.delete('/deleteMenu', async (ctx, next) => { + const [rows, fields] = await global.SQL.execute('SELECT * FROM `menu` WHERE `isdelete` = 0'); + ctx.body = rows +}) +router.put('/updateMenu', async (ctx, next) => { + const [rows, fields] = await global.SQL.execute('SELECT * FROM `menu` WHERE `isdelete` = 0'); + ctx.body = rows +}) +router.post('/createMenu', async (ctx, next) => { + const [rows, fields] = await global.SQL.execute('SELECT * FROM `menu` WHERE `isdelete` = 0'); + ctx.body = rows +}) + +module.exports = router