Browse Source

增加本地嵌入式数据库,修复一些遗留问题

zhusiqing 4 years ago
parent
commit
63dc151d0f

+ 1 - 0
.gitignore

@@ -1,3 +1,4 @@
 node_modules
 dist
 logs
+db

+ 2 - 0
package.json

@@ -25,6 +25,7 @@
     "koa-session": "^6.0.0",
     "koa-static": "^5.0.0",
     "log4js": "^6.3.0",
+    "nedb": "^1.8.0",
     "node-cache": "^5.1.2",
     "nodemon": "^2.0.4",
     "pm2": "^4.4.1",
@@ -35,6 +36,7 @@
     "@types/koa-bodyparser": "^4.3.0",
     "@types/koa-router": "^7.4.1",
     "@types/koa-session": "^5.10.2",
+    "@types/nedb": "^1.8.11",
     "@types/node": "^14.11.2",
     "@types/redis": "^2.8.27",
     "ts-node": "^9.0.0",

+ 3 - 0
src/app.ts

@@ -19,6 +19,7 @@ import logsMiddleware from './middlewares/logs';
 import responseMiddleware from './middlewares/response';
 import sessionMiddleware from './middlewares/session';
 // import authMiddleware from './middlewares/auth';
+import localDbMiddleware from './middlewares/localDb';
 
 import { loggerInstance } from './utils/logger';
 
@@ -37,6 +38,8 @@ app.use(koaStatic(path.join(__dirname, config.staticPath)))
 app.use(responseMiddleware());
 // post params解析
 app.use(bodyParser());
+// 本地嵌入式数据库
+app.use(localDbMiddleware())
 // 日志
 app.use(logsMiddleware());
 // redis

+ 10 - 4
src/config.ts

@@ -1,7 +1,7 @@
-import path from 'path';
+import { resolve } from 'path';
 const env = process.env.NODE_ENV;
 
-export = {
+export default {
   port: 9900,
   checkHost: ['localhost', '127.0.0.1'],
   redis: {
@@ -19,8 +19,14 @@ export = {
   logs: {
     env,
     appLogLevel: 'debug',
-    dir: path.resolve(__dirname, '../logs')
+    dir: resolve(__dirname, '../logs')
   },
   // 静态页面目录
-  staticPath: '../public'
+  staticPath: '../public',
+  // 本地嵌入式数据库
+  localDb: {
+    dir: resolve(__dirname, '../db'),
+    user: 'dbUser.json',
+    doc: 'dbDoc.json'
+  }
 };

+ 9 - 7
src/controllers/document.ts

@@ -1,6 +1,7 @@
 import { Context } from 'koa';
+import services from '../services';
 
-interface InterfacePostDocument {
+export interface InterfaceDocument {
   method: string
   title: string
   url: string
@@ -14,23 +15,24 @@ interface InterfaceRequestList {
   content?: string
 }
 
-export const postDocument = (ctx: Context) => {
-  const { method, title, url, requestList = [] }: InterfacePostDocument = ctx.request.body;
+export const putDocument = async (ctx: Context) => {
+  const { method, title, url, requestList = [] }: InterfaceDocument = ctx.request.body;
   if (!method || !title || !url) {
     ctx.status = 400;
-    ctx.body = ctx.$response(null, '必填项参数缺失', false);
+    ctx.body = ctx.$response(null, '必填项参数缺失', false, 400000);
     return
   }
   const errorRequestList = requestList.filter(el => (!el.title || !el.type));
   console.log(errorRequestList);
   if (errorRequestList.length) {
     ctx.status = 400;
-    ctx.body = ctx.$response(null, '必填项参数缺失', false);
+    ctx.body = ctx.$response(null, '必填项参数缺失', false, 400000);
     return
   }
-  ctx.body = ctx.$response(ctx.request.body);
+  const data = await services.document.putDocument(ctx, ctx.request.body)
+  ctx.body = ctx.$response(data.data, data.message, data.success, data.code)
 };
 
 export default {
-  postDocument
+  putDocument
 }

+ 7 - 6
src/controllers/index.ts

@@ -9,6 +9,7 @@ const home = async (ctx: Context) => {
   ctx.body = 'home';
 };
 
+// 读取验证码
 const code = async (ctx: Context) => {
   interface params {
     phone?: string
@@ -17,7 +18,7 @@ const code = async (ctx: Context) => {
   params.phone = ctx.query.phone
   if (!params.phone) {
     ctx.status = 400;
-    ctx.body = ctx.$response(null, 'phone参数缺失', false);
+    ctx.body = ctx.$response(null, 'phone参数缺失', false, 400000);
     return;
   };
   const body = await services.code(ctx, params);
@@ -27,11 +28,11 @@ const code = async (ctx: Context) => {
 const login = async (ctx: Context) => {
   const { username, password } = ctx.request.body
   if (!username) {
-    ctx.body = ctx.$response(null, '用户名不能为空', false)
+    ctx.body = ctx.$response(null, '用户名不能为空', false, 400000)
     return
   }
   if (!password) {
-    ctx.body = ctx.$response(null, '密码不能为空', false)
+    ctx.body = ctx.$response(null, '密码不能为空', false, 400000)
     return
   }
   const dbInfo = {
@@ -41,14 +42,14 @@ const login = async (ctx: Context) => {
   if (username === dbInfo.username && password === dbInfo.password) {
     if (ctx.session) {
       if (ctx.session.user) {
-        ctx.body = ctx.$response(null, '用户已登录', true)
+        ctx.body = ctx.$response(null, '用户已登录')
         return
       }
       ctx.session.user = username
     }
-    ctx.body = ctx.$response({ username }, '登录成功', true)
+    ctx.body = ctx.$response({ username }, '登录成功')
   } else {
-    ctx.body = ctx.$response(null, '用户名或者密码错误', false)
+    ctx.body = ctx.$response(null, '用户名或者密码错误', false, 400000)
   }
 }
 

+ 1 - 1
src/middlewares/limit.ts

@@ -1,6 +1,6 @@
 import { Context, Next } from 'koa';
 import config from '../config';
-export = () => {
+export default () => {
   return async (ctx: Context, next: Next) => {
     const host: string = ctx.host
     const isMatch = config.checkHost.find(el => host.match(el))

+ 30 - 0
src/middlewares/localDb.ts

@@ -0,0 +1,30 @@
+import Nedb from 'nedb';
+import { resolve } from 'path';
+import config from '../config';
+
+export interface InterfaceDB {
+  user: Nedb
+  doc: Nedb
+};
+
+const { localDb } = config;
+
+const filename = name => resolve(localDb.dir, name);
+
+const db: InterfaceDB = {
+  user: new Nedb({
+    filename: filename(localDb.user),
+    autoload: true
+  }),
+  doc: new Nedb({
+    filename: filename(localDb.doc),
+    autoload: true
+  })
+};
+
+export default () => {
+  return async(ctx, next) => {
+    ctx.$db = db;
+    await next();
+  };
+};

+ 1 - 1
src/middlewares/logs.ts

@@ -1,7 +1,7 @@
 import { Context, Next } from 'koa';
 import { middlewareLog } from '../utils/logger';
 
-export = () => {
+export default () => {
   const loggerMiddleware = middlewareLog();
   return async(ctx: Context, next: Next) => {
     // 静态文件不处理

+ 2 - 3
src/middlewares/redis.ts

@@ -81,10 +81,9 @@ const setexCache = (key: string, ttl: number, value: string, ) => setCache(key,
 
 // 初始化测试
 // client.setex('test', 30, '111111');
-// send_sms_verify_code_sms_
-// 18339012129
+// send_sms_verify_code_sms_13500001111
 
-export = () => {
+export default () => {
   return async (ctx, next) => {
     console.log(isUseRedis);
     if (isUseRedis) { // 如果redis连接失败,采用内存

+ 1 - 1
src/middlewares/response.ts

@@ -1,5 +1,5 @@
 import response from '../utils/response';
-export = () => {
+export default () => {
   return async(ctx, next) => {
     ctx.$response = response;
     await next();

+ 1 - 1
src/router.ts

@@ -8,7 +8,7 @@ apiRouter.get('/code', controllers.code);
 apiRouter.post('/login', controllers.login);
 apiRouter.get('/logout', controllers.logout);
 apiRouter.get('/user-info', controllers.userInfo);
-apiRouter.put('/document', controllers.document.postDocument)
+apiRouter.put('/document', controllers.document.putDocument)
 // 主路由
 const router = new Router<DefaultState, Context>();
 router.get('/', controllers.home);

+ 42 - 0
src/services/document.ts

@@ -0,0 +1,42 @@
+import { Context } from 'koa';
+import { InterfaceResponseData } from '../utils/response';
+import { InterfaceDocument } from '../controllers/document';
+
+export const putDocument = async (ctx: Context, params: InterfaceDocument) :Promise<InterfaceResponseData> => {
+  return new Promise(resolve => {
+    const reData: InterfaceResponseData = {
+      data: null,
+      message: '',
+      success: false,
+      code: 400000
+    }
+    ctx.$db.doc.findOne({ url: params.url }, (err, docs) => {
+      if (err) {
+        ctx.$log.error(err)
+        ctx.status = 500
+        return
+      }
+      if (docs) {
+        reData.message = 'url已存在'
+        resolve(reData)
+        return
+      }
+      ctx.$db.doc.insert(params, (err, doc) => {
+        if (err) {
+          ctx.$log.error(err)
+          ctx.status = 500
+          return
+        }
+        reData.data = doc;
+        reData.message = '保存成功'
+        reData.success = true
+        reData.code = 200
+        resolve(reData)
+      })
+    })
+  })
+};
+
+export default {
+  putDocument
+}

+ 3 - 1
src/services/index.ts

@@ -1,9 +1,11 @@
 import { Context } from 'koa';
+import document from './document';
 export const code = async (ctx: Context, params) => {
   const code = await ctx.$redis.get(`send_sms_verify_code_sms_${params.phone}`);
   return code || 'no code';
 };
 
 export default {
-  code
+  code,
+  document
 }

+ 2 - 0
src/typings/index.d.ts

@@ -2,6 +2,7 @@ import { Application, Context, DefaultContext } from 'koa';
 import { IMiddleware } from 'koa-router';
 import { RedisClient } from 'redis';
 import response from '../utils/response';
+import { InterfaceDB } from '../middlewares/localDb';
 
 interface interfaceRedis {
   get: (key: string) => Promise<string>
@@ -26,5 +27,6 @@ declare module 'koa' {
     $redis: interfaceRedis
     $response: response
     $log: interfaceLog
+    $db: InterfaceDB
   }
 }

+ 9 - 3
src/utils/response.ts

@@ -1,5 +1,11 @@
-interface responseHandle {
-  (data: any, message?: string, success?: boolean, code?: number): { data: any, message: string, success: boolean, code: number }
+export interface InterfaceResponseData {
+  data: any
+  message?: string
+  success?: boolean
+  code?: number
+}
+export interface responseHandle {
+  (responseData): { data: any, message: string, success: boolean, code: number }
 }
 
 const responseHandle: responseHandle = (data, message = 'success', success = true, code = 200) => {
@@ -11,4 +17,4 @@ const responseHandle: responseHandle = (data, message = 'success', success = tru
   };
 };
 
-export = responseHandle;
+export default responseHandle;

+ 62 - 1
yarn.lock

@@ -231,6 +231,13 @@
   resolved "https://registry.yarnpkg.com/@types/mime/-/mime-2.0.3.tgz#c893b73721db73699943bfc3653b1deb7faa4a3a"
   integrity sha512-Jus9s4CDbqwocc5pOAnh8ShfrnMcPHuJYzVcSUU7lrh8Ni5HuIqX3oilL86p3dlTrk0LzHRCgA/GQ7uNCw6l2Q==
 
+"@types/nedb@^1.8.11":
+  version "1.8.11"
+  resolved "https://registry.yarnpkg.com/@types/nedb/-/nedb-1.8.11.tgz#a8f9d9c8d43d12e98df7cbcfeb5f107bbb0971c0"
+  integrity sha512-qHQRLZ0e6l/XK/2Qb2v5N1ujmdttYkUvnRI4nPIifMy6vYwoAnER10xhX13isWjjQtNsrjNLinZgDDguzPmEKw==
+  dependencies:
+    "@types/node" "*"
+
 "@types/node@*", "@types/node@^14.11.2":
   version "14.11.2"
   resolved "https://registry.yarnpkg.com/@types/node/-/node-14.11.2.tgz#2de1ed6670439387da1c9f549a2ade2b0a799256"
@@ -375,6 +382,11 @@ async-listener@^0.6.0:
     semver "^5.3.0"
     shimmer "^1.1.0"
 
+async@0.2.10:
+  version "0.2.10"
+  resolved "https://registry.yarnpkg.com/async/-/async-0.2.10.tgz#b6bbe0b0674b9d719708ca38de8c237cb526c3d1"
+  integrity sha1-trvgsGdLnXGXCMo43owjfLUmw9E=
+
 async@1.5:
   version "1.5.2"
   resolved "https://registry.yarnpkg.com/async/-/async-1.5.2.tgz#ec6a61ae56480c0c3cb241c95618e20892f9672a"
@@ -414,6 +426,13 @@ binary-extensions@^2.0.0:
   resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-2.1.0.tgz#30fa40c9e7fe07dbc895678cd287024dea241dd9"
   integrity sha512-1Yj8h9Q+QDF5FzhMs/c9+6UntbD5MkRfRwac8DoEm9ZfUBZ7tZ55YcGVAzEe4bXsdQHEk+s9S5wsOKVdZrw0tQ==
 
+binary-search-tree@0.2.5:
+  version "0.2.5"
+  resolved "https://registry.yarnpkg.com/binary-search-tree/-/binary-search-tree-0.2.5.tgz#7dbb3b210fdca082450dad2334c304af39bdc784"
+  integrity sha1-fbs7IQ/coIJFDa0jNMMErzm9x4Q=
+  dependencies:
+    underscore "~1.4.4"
+
 blessed@0.1.81:
   version "0.1.81"
   resolved "https://registry.yarnpkg.com/blessed/-/blessed-0.1.81.tgz#f962d687ec2c369570ae71af843256e6d0ca1129"
@@ -1268,6 +1287,11 @@ ignore-by-default@^1.0.1:
   resolved "https://registry.yarnpkg.com/ignore-by-default/-/ignore-by-default-1.0.1.tgz#48ca6d72f6c6a3af00a9ad4ae6876be3889e2b09"
   integrity sha1-SMptcvbGo68Aqa1K5odr44ieKwk=
 
+immediate@~3.0.5:
+  version "3.0.6"
+  resolved "https://registry.yarnpkg.com/immediate/-/immediate-3.0.6.tgz#9db1dbd0faf8de6fbe0f5dd5e56bb606280de69b"
+  integrity sha1-nbHb0Pr43m++D13V5Wu2BigN5ps=
+
 import-lazy@^2.1.0:
   version "2.1.0"
   resolved "https://registry.yarnpkg.com/import-lazy/-/import-lazy-2.1.0.tgz#05698e3d45c88e8d7e9d92cb0584e77f096f3e43"
@@ -1585,6 +1609,20 @@ levn@~0.3.0:
     prelude-ls "~1.1.2"
     type-check "~0.3.2"
 
+lie@3.1.1:
+  version "3.1.1"
+  resolved "https://registry.yarnpkg.com/lie/-/lie-3.1.1.tgz#9a436b2cc7746ca59de7a41fa469b3efb76bd87e"
+  integrity sha1-mkNrLMd0bKWd56QfpGmz77dr2H4=
+  dependencies:
+    immediate "~3.0.5"
+
+localforage@^1.3.0:
+  version "1.9.0"
+  resolved "https://registry.yarnpkg.com/localforage/-/localforage-1.9.0.tgz#f3e4d32a8300b362b4634cc4e066d9d00d2f09d1"
+  integrity sha512-rR1oyNrKulpe+VM9cYmcFn6tsHuokyVHFaCM3+osEmxaHTbEk8oQu6eGDfS6DQLWi/N67XRmB8ECG37OES368g==
+  dependencies:
+    lie "3.1.1"
+
 lodash@^4.17.14:
   version "4.17.20"
   resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.20.tgz#b44a9b6297bcb698f1c51a3545a2b3b368d59c52"
@@ -1669,7 +1707,7 @@ minimatch@^3.0.4:
   dependencies:
     brace-expansion "^1.1.7"
 
-minimist@^1.2.0:
+minimist@^1.2.0, minimist@^1.2.5:
   version "1.2.5"
   resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.5.tgz#67d66014b66a6a8aaa0c083c5fd58df4e4e97602"
   integrity sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==
@@ -1679,6 +1717,13 @@ mkdirp@1.0.4:
   resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-1.0.4.tgz#3eb5ed62622756d79a5f0e2a221dfebad75c2f7e"
   integrity sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==
 
+mkdirp@~0.5.1:
+  version "0.5.5"
+  resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.5.tgz#d91cefd62d1436ca0f41620e251288d420099def"
+  integrity sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==
+  dependencies:
+    minimist "^1.2.5"
+
 module-details-from-path@^1.0.3:
   version "1.0.3"
   resolved "https://registry.yarnpkg.com/module-details-from-path/-/module-details-from-path-1.0.3.tgz#114c949673e2a8a35e9d35788527aa37b679da2b"
@@ -1711,6 +1756,17 @@ mute-stream@~0.0.4:
   resolved "https://registry.yarnpkg.com/mute-stream/-/mute-stream-0.0.8.tgz#1630c42b2251ff81e2a283de96a5497ea92e5e0d"
   integrity sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==
 
+nedb@^1.8.0:
+  version "1.8.0"
+  resolved "https://registry.yarnpkg.com/nedb/-/nedb-1.8.0.tgz#0e3502cd82c004d5355a43c9e55577bd7bd91d88"
+  integrity sha1-DjUCzYLABNU1WkPJ5VV3vXvZHYg=
+  dependencies:
+    async "0.2.10"
+    binary-search-tree "0.2.5"
+    localforage "^1.3.0"
+    mkdirp "~0.5.1"
+    underscore "~1.4.4"
+
 needle@2.4.0:
   version "2.4.0"
   resolved "https://registry.yarnpkg.com/needle/-/needle-2.4.0.tgz#6833e74975c444642590e15a750288c5f939b57c"
@@ -2518,6 +2574,11 @@ undefsafe@^2.0.2:
   dependencies:
     debug "^2.2.0"
 
+underscore@~1.4.4:
+  version "1.4.4"
+  resolved "https://registry.yarnpkg.com/underscore/-/underscore-1.4.4.tgz#61a6a32010622afa07963bf325203cf12239d604"
+  integrity sha1-YaajIBBiKvoHljvzJSA88SI51gQ=
+
 unique-string@^2.0.0:
   version "2.0.0"
   resolved "https://registry.yarnpkg.com/unique-string/-/unique-string-2.0.0.tgz#39c6451f81afb2749de2b233e3f7c5e8843bd89d"