diff --git a/app/.autod.conf.js b/app/.autod.conf.js new file mode 100755 index 0000000..b835cda --- /dev/null +++ b/app/.autod.conf.js @@ -0,0 +1,28 @@ +'use strict'; + +module.exports = { + write: true, + prefix: '^', + plugin: 'autod-egg', + test: [ + 'test', + 'benchmark', + ], + dep: [ + 'egg' + ], + devdep: [ + 'egg-ci', + 'egg-bin', + 'autod', + 'eslint', + 'eslint-config-egg', + 'supertest', + 'webstorm-disable-index', + ], + exclude: [ + './test/fixtures', + './dist', + ], +}; + diff --git a/app/.eslintignore b/app/.eslintignore new file mode 100755 index 0000000..4ebc8ae --- /dev/null +++ b/app/.eslintignore @@ -0,0 +1 @@ +coverage diff --git a/app/.eslintrc b/app/.eslintrc new file mode 100755 index 0000000..c799fe5 --- /dev/null +++ b/app/.eslintrc @@ -0,0 +1,3 @@ +{ + "extends": "eslint-config-egg" +} diff --git a/app/.gitignore b/app/.gitignore new file mode 100755 index 0000000..edced7d --- /dev/null +++ b/app/.gitignore @@ -0,0 +1,15 @@ +package.json +logs/ +npm-debug.log +/node_modules +/mymodel +/onlinepayApiLog +coverage/ +.idea/ +run/ +.DS_Store +*.swp +yarn.lock +.vscode/ +config/env_config.js +config/env_config_local.js diff --git a/app/.travis.yml b/app/.travis.yml new file mode 100755 index 0000000..47cc542 --- /dev/null +++ b/app/.travis.yml @@ -0,0 +1,11 @@ +sudo: false +language: node_js +node_js: + - '6' + - '8' +install: + - npm i npminstall && npminstall +script: + - npm run ci +after_script: + - npminstall codecov && codecov diff --git a/app/app.js b/app/app.js new file mode 100755 index 0000000..6447117 --- /dev/null +++ b/app/app.js @@ -0,0 +1,19 @@ +'use strict'; + +const path = require('path'); +const redis = require('egg-redis/lib/redis'); + +module.exports = app => { + // 把xml解析器放到前面去 + // app.config.coreMiddleware.unshift('xmlBody'); + // 挂载 util相关函数到app下 + const utilDirectory = path.join(app.config.baseDir, 'app/util'); + app.loader.loadToApp(utilDirectory, 'util'); + // 挂载params + const paramsDirectory = path.join(app.config.baseDir, 'app/form'); + app.loader.loadToContext(paramsDirectory, 'form'); + + // 挂载另一份Orm + app.orm = require('koa-orm')(app.config.koaOrm).database; + redis(app); +}; diff --git a/app/app/controller/player.js b/app/app/controller/player.js new file mode 100755 index 0000000..8ab9318 --- /dev/null +++ b/app/app/controller/player.js @@ -0,0 +1,85 @@ +'use strict'; +const Controller = require('egg').Controller; + +class PlayerController extends Controller { + + + async test() { + let params = { + "name": "klkkkk", + "playerId": 1, + "position": "C" + } + let exsit = await this.ctx.service.player.findOne(params.playerId) + if (!exsit) { + exsit = await this.ctx.service.player.create(params) + } + console.log(exsit, '---数据库结果') + + params.name = 'updateKkkkk' + params.position = 'B' + let updateRes = await this.ctx.service.player.update(params) + + console.log(updateRes, '---修改结果') + + let delRes = await this.ctx.service.player.del(params.playerId) + + console.log(delRes, '---删除结果') + } + + async create() { + try { + let params = this.ctx.form.create.checkData({ + ...this.ctx.request.body + }) + let res = await this.ctx.service.player.create(params) + return this.ctx.body = this.ctx.out.success(res) + } catch (err) { + return this.ctx.body = this.ctx.out.error(err.code, err.message); + } + } + + async update() { + try { + let params = this.ctx.form.create.checkData({ + ...this.ctx.request.body + }) + let res = await this.ctx.service.player.update(params) + return this.ctx.body = this.ctx.out.success(res) + } catch (err) { + return this.ctx.body = this.ctx.out.error(err.code, err.message); + } + } + + async findOne() { + try { + let urlArr = this.ctx.request.url.split('/') + let params = this.ctx.form.findOne.checkData({ + ...this.ctx.request.query, + playerId: parseInt(urlArr[urlArr.length - 1]) + }) + let res = await this.ctx.service.player.findOne(params.playerId) + return this.ctx.body = this.ctx.out.success(res) + } catch (err) { + return this.ctx.body = this.ctx.out.error(err.code, err.message); + } + } + + + async del() { + try { + let urlArr = this.ctx.request.url.split('/') + let params = this.ctx.form.findOne.checkData({ + ...this.ctx.request.query, + playerId: parseInt(urlArr[urlArr.length - 1]) + }) + let res = await this.ctx.service.player.del(params.playerId) + return this.ctx.body = this.ctx.out.success(res) + } catch (err) { + return this.ctx.body = this.ctx.out.error(err.code, err.message); + } + } + +} + +module.exports = PlayerController; \ No newline at end of file diff --git a/app/app/core/base_controller.js b/app/app/core/base_controller.js new file mode 100755 index 0000000..13e25a6 --- /dev/null +++ b/app/app/core/base_controller.js @@ -0,0 +1,49 @@ +const { Controller } = require('egg'); +const fs = require('fs'); +const path = require('path'); +const pump = require('mz-modules/pump'); +const UUID = require('uuid'); + +class BaseController extends Controller { + success(data, page) { + this.ctx.body = { + errcode: 200, + errmsg: 'ok', + data, + page, + }; + } + + error(errcode, errmsg) { + this.ctx.body = { + errcode: errcode === undefined ? 500 : errcode, + errmsg, + }; + } + + async upload(flage) { + const { service, ctx } = this; + const parts = ctx.multipart({ autoFields: true }); + const files = []; + + let stream; + while ((stream = await parts()) != null) { + let filename = stream.filename.toLowerCase(); + const baseFilenamePath = filename.split('.'); + const subfix = baseFilenamePath[baseFilenamePath.length - 1]; + filename = UUID.v4() + '.' + subfix; + const target = path.join(this.config.baseDir, 'app/public', filename); + const writeStream = fs.createWriteStream(target); + await pump(stream, writeStream); + files.push({ filed: filename, filepath: target }); + } + if (flage == true) { + return files; + } + this.success(files); + ctx.status = 200; + + } + +} +module.exports = BaseController; diff --git a/app/app/extend/application.js b/app/app/extend/application.js new file mode 100755 index 0000000..81da371 --- /dev/null +++ b/app/app/extend/application.js @@ -0,0 +1,4 @@ +'use strict'; +module.exports = { + +}; diff --git a/app/app/extend/context.js b/app/app/extend/context.js new file mode 100755 index 0000000..62c4141 --- /dev/null +++ b/app/app/extend/context.js @@ -0,0 +1,25 @@ +'use strict'; +// 用于请求内传递参数 +const ctxData = Symbol('Context#ctxData'); +const out = new (require('./out.js'))(); +module.exports = { + get isIOS() { + const iosReg = /iphone|ipad|ipod/i; + return iosReg.test(this.get('user-agent')); + }, + // 获取传递数据 + getData(key) { + if (!this[ctxData]) { + return undefined; + } + return this[ctxData].get(key); + }, + // 设置传递参数 + setData(key, val) { + if (!this[ctxData]) { + this[ctxData] = new Map(); + } + this[ctxData].set(key, val); + }, + out, +}; diff --git a/app/app/extend/helper.js b/app/app/extend/helper.js new file mode 100755 index 0000000..54b8443 --- /dev/null +++ b/app/app/extend/helper.js @@ -0,0 +1,53 @@ +'use strict'; +const crypto = require('crypto'); +const md5 = require('md5'); +module.exports = { + /** + * 获取当前时间秒为单位的时间戳 + */ + currentTimestamp() { + return parseInt(Date.parse(new Date()).toString().substr(0, 10)); + }, + getDbType() { + if (!this.ctx.getData('dbType')) { + this.ctx.setData('dbType', 'writeDdObj'); + if (this.ctx.app.config.readDdObj && this.ctx.app.config.readOnlyRouter[this.ctx.path]) { + this.ctx.setData('dbType', 'readDdObj'); + } + } + return this.ctx.getData('dbType'); + }, + + getDbIndex(dbType, dbKey) { + const dataKey = 'dbIndex_' + dbType + dbKey; + if (!this.ctx.getData(dataKey)) { + let index = 0; + if (this.ctx.app.config[dbType][dbKey].length > 1) { + index = parseInt(Math.random() * this.ctx.app.config[dbType][dbKey].length); + } + this.ctx.setData(dataKey, index); + } + return this.ctx.getData(dataKey); + }, + + getDbModel(modelName, forceModel = '') { + if (!forceModel) { + if (modelName == 'sequelize') { + throw Error('require forceModel'); + } + forceModel = modelName; + } + const dataKey = 'dbName_' + forceModel; + if (!this.ctx.getData(dataKey)) { + let dbType = this.getDbType(), + dbKey = 'default'; + if (this.ctx.app.config.modelNotDefault[forceModel]) { + dbKey = this.ctx.app.config.modelNotDefault[forceModel]; + } + const index = this.getDbIndex(dbType, dbKey); + + this.ctx.setData(dataKey, this.ctx.app.config[dbType][dbKey][index]); + } + return this.ctx.app.orm(this.ctx.getData(dataKey))[modelName]; + }, +}; diff --git a/app/app/extend/out.js b/app/app/extend/out.js new file mode 100755 index 0000000..c4ed9dd --- /dev/null +++ b/app/app/extend/out.js @@ -0,0 +1,22 @@ +'use strict'; + +class Out { + success(data, page) { + return { + errcode: 0, + errmsg: 'ok', + data, + page, + }; + } + error(errcode, errmsg) { + if (errmsg.indexOf('connect ') > -1 || errmsg.indexOf('Connect ') > -1 || errmsg.indexOf('denied ') > -1) { + errmsg = '网络异常,请稍后重试'; + } + return { + errcode: errcode === undefined ? 500 : Number(errcode), + errmsg, + }; + } +} +module.exports = Out; diff --git a/app/app/form/create.js b/app/app/form/create.js new file mode 100755 index 0000000..7192ade --- /dev/null +++ b/app/app/form/create.js @@ -0,0 +1,52 @@ +'use strict'; + +module.exports = app => { + const Parameter = require('parameter'); + + class Create { + // 构造检查对象 + constructor(ctx) { + this.ctx = ctx; + this.param = new Parameter(); + this.rule = { + name: { + type: 'string', + required: true, + }, + id: { + type: 'int', + required: true, + }, + position: { + type: 'string', + required: true, + }, + }; + } + + // 检查数据 + checkData(data) { + this.data = data; + const res = this.param.validate(this.rule, this.data); + if (res != undefined) { + throw new app.util.businessError('10002', res[0].field + ' ' + res[0].code); + } + this.checkAfterValidate(); + return this.formate(); + } + + // 校验器 + checkAfterValidate() { } + + // 数据处理 + formate() { + return { + name: this.data.name, + playerId: this.data.id, + position: this.data.position, + }; + } + } + + return Create; +}; diff --git a/app/app/form/find_one.js b/app/app/form/find_one.js new file mode 100755 index 0000000..c6fc45f --- /dev/null +++ b/app/app/form/find_one.js @@ -0,0 +1,43 @@ +'use strict'; + +module.exports = app => { + const Parameter = require('parameter'); + + class FindOne { + // 构造检查对象 + constructor(ctx) { + this.ctx = ctx; + this.param = new Parameter(); + this.rule = { + playerId: { + type: 'int', + required: true, + }, + + }; + } + + // 检查数据 + checkData(data) { + this.data = data; + const res = this.param.validate(this.rule, this.data); + if (res != undefined) { + throw new app.util.businessError('10002', res[0].field + ' ' + res[0].code); + } + this.checkAfterValidate(); + return this.formate(); + } + + // 校验器 + checkAfterValidate() { } + + // 数据处理 + formate() { + return { + playerId: this.data.playerId, + }; + } + } + + return FindOne; +}; diff --git a/app/app/middleware/koa_orm.js b/app/app/middleware/koa_orm.js new file mode 100755 index 0000000..666fa0b --- /dev/null +++ b/app/app/middleware/koa_orm.js @@ -0,0 +1,5 @@ +'use strict'; + +module.exports = options => { + return require('koa-orm')(options).middleware; +}; diff --git a/app/app/middleware/xml_body.js b/app/app/middleware/xml_body.js new file mode 100755 index 0000000..95b6cfa --- /dev/null +++ b/app/app/middleware/xml_body.js @@ -0,0 +1,2 @@ +'use strict'; +module.exports = require('koa-xml-body'); diff --git a/app/app/model/player.js b/app/app/model/player.js new file mode 100755 index 0000000..2b213db --- /dev/null +++ b/app/app/model/player.js @@ -0,0 +1,45 @@ +/* indent size: 2 */ + +module.exports = function(sequelize, DataTypes) { + const Player = sequelize.define('Player', { + id: { + type: DataTypes.INTEGER(11), + allowNull: false, + primaryKey: true, + autoIncrement: true, + }, + playerId: { + type: DataTypes.INTEGER(11), + allowNull: false, + defaultValue: '0', + field: 'player_id', + }, + name: { + type: DataTypes.STRING(50), + allowNull: false, + defaultValue: '', + }, + position: { + type: DataTypes.STRING(50), + allowNull: false, + defaultValue: '', + }, + created: { + type: DataTypes.INTEGER(11), + allowNull: false, + defaultValue: '0', + }, + modified: { + type: DataTypes.INTEGER(11), + allowNull: false, + defaultValue: '0', + }, + }, { + freezeTableName: true, + timestamps: false, + tableName: 'player', + }); + + + return Player; +}; diff --git a/app/app/router.js b/app/app/router.js new file mode 100755 index 0000000..a9ee786 --- /dev/null +++ b/app/app/router.js @@ -0,0 +1,8 @@ +'use strict'; +module.exports = app => { + app.post('/v1/player', app.controller.player.create); + app.put('/v1/player', app.controller.player.update); + app.get('/v1/player/:playerId', app.controller.player.findOne); + app.delete('/v1/player/:playerId', app.controller.player.del); + app.post('/v1/test', app.controller.player.test); +}; diff --git a/app/app/service/base_model_define.js b/app/app/service/base_model_define.js new file mode 100755 index 0000000..1d510e6 --- /dev/null +++ b/app/app/service/base_model_define.js @@ -0,0 +1,35 @@ +'use strict'; + +const Service = require('egg').Service; + +class BaseModelDefineService extends Service { + + constructor(ctx) { + super(ctx); + this._models = {}; + } + + baseModelGet(key) { + if (this._models[key] == null) { + this._models[key] = this.ctx.helper.getDbModel(key); + } + return this._models[key]; + } + + get sequelize() { + const key = 'sequelize_Player'; + if (this._models[key] == null) { + this._models[key] = this.ctx.helper.getDbModel('sequelize', 'Player'); + } + return this._models[key]; + } + + + get Player() { + return this.baseModelGet('Player'); + } + + +} + +module.exports = BaseModelDefineService; diff --git a/app/app/service/player.js b/app/app/service/player.js new file mode 100755 index 0000000..edbbb0b --- /dev/null +++ b/app/app/service/player.js @@ -0,0 +1,57 @@ +'use strict'; +const BaseService = require('./base_model_define'); +class PlayerService extends BaseService { + constructor(ctx) { + super(ctx); + } + + async create(data) { + const exsit = await this.Player.findOne({ + where: { + playerId: data.playerId, + }, + raw: true, + }); + if (exsit) { + return exsit; + } + + const tn = this.ctx.helper.currentTimestamp(); + data.created = tn; + data.modified = tn; + return await this.Player.create(data); + } + + async update(data) { + const tn = this.ctx.helper.currentTimestamp(); + data.created = tn; + data.modified = tn; + return await this.Player.update(data, { + where: { + playerId: data.playerId, + }, + }); + } + + + async findOne(playerId) { + return await this.Player.findOne({ + where: { + playerId, + }, + raw: true, + }); + } + + async del(playerId) { + return await this.Player.destroy({ + where: { + playerId, + }, + }); + } + + +} + +module.exports = PlayerService; diff --git a/app/app/util/business_error.js b/app/app/util/business_error.js new file mode 100755 index 0000000..b87def2 --- /dev/null +++ b/app/app/util/business_error.js @@ -0,0 +1,15 @@ +'use strict'; + +const Code = require('./exception.js'); + +class BusinessError extends Error { + constructor(code, message) { + if (!message) { + message = Code[code]; + } + super(message); + this.code = code; + } +} + +module.exports = BusinessError; diff --git a/app/app/util/exception.js b/app/app/util/exception.js new file mode 100755 index 0000000..9f8e5e7 --- /dev/null +++ b/app/app/util/exception.js @@ -0,0 +1,13 @@ +'use strict'; + +const Code = { + 50000: '', + 10001: '访问出错!', + 10002: 'form校验出错!', + 10500: '访问频繁!', + 104101201: '网络错误', + 105111002: '数据不存在', + +}; + +module.exports = Code; diff --git a/app/appveyor.yml b/app/appveyor.yml new file mode 100755 index 0000000..3d15e52 --- /dev/null +++ b/app/appveyor.yml @@ -0,0 +1,15 @@ +environment: + matrix: + - nodejs_version: '6' + - nodejs_version: '8' + +install: + - ps: Install-Product node $env:nodejs_version + - npm i npminstall && node_modules\.bin\npminstall + +test_script: + - node --version + - npm --version + - npm run test + +build: off diff --git a/app/config/config.default.js b/app/config/config.default.js new file mode 100755 index 0000000..911a2e2 --- /dev/null +++ b/app/config/config.default.js @@ -0,0 +1,49 @@ +'use strict'; + +module.exports = appInfo => { + const config = exports = require('./env_config.js')(appInfo); + config.modelNotDefault = require('./model_not_default.js')(appInfo); + if (!config.defaultDbName) config.defaultDbName = config.koaOrm[0].name; + if (!config.readDdArr) config.readDdArr = []; + + /** + * some description + * @member Config#test + * @property {String} key - some description + */ + config.keys = appInfo.name + '_klsdjklfhdjkfh'; + // 配置需要的中间件,数组顺序即为中间件的加载顺序 + config.middleware = [ 'koaOrm' ]; + // xml数据过滤配置 插件放到app.js里面 + // config.xmlBody = { + // //limit: 128, + // encoding: 'utf8', // lib will detect it from `content-type` + // xmlOptions: { + // explicitArray: false + // }, + // onerror: (err, ctx) => { + // ctx.throw(err.status, err.message); + // } + // }; + + + // 跨域白名单 + config.security = { + csrf: { + enable: false, + ignoreJSON: true, + }, + domainWhiteList: [ + + ], + }; + // 跨域配置 + config.cors = { + origin: '*', + // credentials: true, // 开启认证 + allowMethods: 'GET,HEAD,PUT,POST,DELETE,PATCH', + }; + + + return config; +}; diff --git a/app/config/model_not_default.js b/app/config/model_not_default.js new file mode 100755 index 0000000..0895373 --- /dev/null +++ b/app/config/model_not_default.js @@ -0,0 +1,9 @@ +'use strict'; + +module.exports = appInfo => { + const order = exports = { + + }; + + return order; +}; diff --git a/app/config/plugin.js b/app/config/plugin.js new file mode 100755 index 0000000..18d34c3 --- /dev/null +++ b/app/config/plugin.js @@ -0,0 +1,4 @@ +exports.cors = { + enable: true, + package: 'egg-cors', +}; diff --git a/app/index.js b/app/index.js new file mode 100755 index 0000000..e613c9f --- /dev/null +++ b/app/index.js @@ -0,0 +1,10 @@ +'use strict'; + +module.exports = require('./lib/framework.js'); +process.env.EGG_SERVER_ENV = 'prod'; +process.env.NODE_ENV = 'production'; + +require('egg').startCluster({ + baseDir: __dirname, + // port: 7001, // default to 7001 +}); diff --git a/app/lib/framework.js b/app/lib/framework.js new file mode 100755 index 0000000..db18eb4 --- /dev/null +++ b/app/lib/framework.js @@ -0,0 +1,22 @@ +'use strict'; + +const path = require('path'); +const egg = require('egg'); +const EGG_PATH = Symbol.for('egg#eggPath'); + +class Application extends egg.Application { + get [EGG_PATH]() { + return path.dirname(__dirname); + } +} + +class Agent extends egg.Agent { + get [EGG_PATH]() { + return path.dirname(__dirname); + } +} + +module.exports = Object.assign(egg, { + Application, + Agent, +}); diff --git a/app/package.json b/app/package.json index 6b480b3..d4b1298 100755 --- a/app/package.json +++ b/app/package.json @@ -1,28 +1,104 @@ { - "private": true, - "name": "node-examination", - "version": "0.0.1", - "description": "Building a RESTful CRUD API with Node.js, Express/Koa and MongoDB.", - "main": "server.js", - "scripts": { - "start": "NODE_ENV=development node server.js", - "start:prod": "NODE_ENV=production node server.js", - "test": "echo \"Error: no test specified\" && exit 1" - }, + "name": "api", + "version": "1.0.0", + "description": "", "dependencies": { - "express": "^4.17.1", - "mongoose": "^5.9.2" + "MD5": "^1.3.0", + "ali-oss": "^6.2.1", + "alipay-sdk": "^3.0.8", + "async": "^2.6.1", + "co-wechat": "^2.4.0", + "crypto": "^1.0.1", + "crypto-js": "^3.1.9-1", + "egg": "^2.0.0", + "egg-cors": "^2.2.3", + "egg-mysql": "^3.0.0", + "egg-redis": "^1.0.2", + "egg-scripts": "^1.2.0", + "egg-validate": "^1.0.0", + "excel-export": "^0.5.1", + "express": "^4.17.3", + "fast-xml-parser": "^3.12.16", + "fdfs": "^1.0.4", + "formstream": "^1.1.0", + "hiredis": "^0.5.0", + "httpx": "^2.1.2", + "images": "^3.2.3", + "json-bigint": "^0.3.0", + "jsrsasign": "^8.0.12", + "jszip": "^3.2.2", + "koa-multer": "^1.0.2", + "koa-orm": "^2.3.0", + "koa-xml-body": "^2.0.0", + "md5": "^2.2.1", + "mysql2": "^1.4.2", + "node-forge": "^0.8.5", + "node-rsa": "^1.0.7", + "node-xlsx": "^0.11.0", + "nodejs-base64": "^1.0.3", + "pkg": "^4.3.4", + "q": "^1.5.0", + "qrcode": "^0.9.0", + "redis": "^2.8.0", + "request": "^2.83.0", + "ssh2-sftp-client": "^4.2.4", + "stream-wormhole": "^1.1.0", + "svg-captcha": "^1.4.0", + "tedious": "^2.0.0", + "urlencode": "^1.1.0", + "utf8": "^3.0.0", + "uuid": "^3.3.2", + "xml2js": "^0.4.19" }, "devDependencies": { - "chai": "^4.2.0" + "autod": "^3.0.1", + "autod-egg": "^1.0.0", + "egg-bin": "^4.3.5", + "egg-ci": "^1.8.0", + "egg-mock": "^3.13.1", + "eslint": "^4.12.1", + "eslint-config-egg": "^5.1.1", + "supertest": "^3.0.0", + "webstorm-disable-index": "^1.2.0" }, "engines": { - "node": ">=10.15.0" + "node": ">=6.0.0" + }, + "bin": { + "payment": "index.js" + }, + "scripts": { + "test": "npm run lint -- --fix && egg-bin pkgfiles && npm run test-local", + "test-local": "egg-bin test", + "cov": "egg-bin cov", + "dev": "egg-bin dev --port=3000", + "lint": "eslint .", + "ci": "npm run lint && egg-bin pkgfiles --check && npm run cov", + "autod": "autod", + "pkgfiles": "egg-bin pkgfiles", + "start": "egg-scripts start --daemon --title=egg-server-onlinepaytest", + "stop": "egg-scripts stop --title=egg-server-onlinepaytest", + "migrate:new": "egg-sequelize migration:create", + "migrate:up": "egg-sequelize db:migrate", + "migrate:down": "egg-sequelize db:migrate:undo" + }, + "ci": { + "version": "6, 8" + }, + "repository": { + "type": "git", + "url": "" }, - "browserslist": [ - ">0.2%", - "not dead", - "not ie <= 11", - "not op_mini all" - ] + "keywords": [ + "egg", + "egg-framework" + ], + "author": "dengly", + "files": [ + "app", + "config", + "lib", + "index.js" + ], + "license": "MIT" } diff --git a/app/server.js b/app/server.js deleted file mode 100755 index 72e5b39..0000000 --- a/app/server.js +++ /dev/null @@ -1,11 +0,0 @@ -const express = require('express'); - -const app = express(); - -app.get('/', (req, res) => { - res.json({"message": "Building a RESTful CRUD API with Node.js, Express/Koa and MongoDB."}); -}); - -app.listen(3000, () => { - console.log("Server is listening on port 3000"); -}); \ No newline at end of file diff --git a/swagger/package.json b/swagger/package.json index 5f2eaee..97d6ffd 100755 --- a/swagger/package.json +++ b/swagger/package.json @@ -15,6 +15,7 @@ "dependencies": { "connect": "^3.7.0", "js-yaml": "^3.13.1", + "mongodb": "^4.4.0", "swagger-tools": "0.10.4" } } diff --git a/swagger/service/PlayerService.js b/swagger/service/PlayerService.js index 319fb15..1127d04 100755 --- a/swagger/service/PlayerService.js +++ b/swagger/service/PlayerService.js @@ -1,6 +1,6 @@ 'use strict'; - - +var MongoClient = require('mongodb').MongoClient; +var url = "mongodb://localhost:27017/"; /** * Create a new player * @@ -8,13 +8,31 @@ * body Player Player object * no response value expected for this operation **/ -exports.addPlayer = function(body) { - return new Promise(function(resolve, reject) { - resolve(); +exports.addPlayer = function (body) { + return new Promise(function (resolve, reject) { + MongoClient.connect(url, function (err, db) { + if (err) throw err; + var dbo = db.db("nbadb"); + dbo.collection("player").find({ "id": body.id }).toArray(function (err, examples) { // 返回集合中所有数据 + if (err) throw err; + if (Object.keys(examples).length > 0) { + db.close(); + resolve(examples[Object.keys(examples)[0]]['_id']); + } else { + dbo.collection("player").insertOne(body, function (err, res) { + db.close(); + if (err) throw err; + resolve(res.insertedId); + }); + } + + }); + }); }); } + /** * Deletes a player * @@ -22,9 +40,19 @@ exports.addPlayer = function(body) { * playerId Long Player id to delete * no response value expected for this operation **/ -exports.deletePlayer = function(playerId) { - return new Promise(function(resolve, reject) { - resolve(); +exports.deletePlayer = function (playerId) { + return new Promise(function (resolve, reject) { + MongoClient.connect(url, function (err, db) { + if (err) throw err; + var dbo = db.db("nbadb"); + var whereStr = { "id": playerId }; // 查询条件 + dbo.collection("player").deleteOne(whereStr, function (err, res) { + db.close(); + if (err) throw err; + resolve(res); + }); + }); + }); } @@ -36,19 +64,23 @@ exports.deletePlayer = function(playerId) { * playerId Long ID of player to return * returns Player **/ -exports.getPlayerById = function(playerId) { - return new Promise(function(resolve, reject) { - var examples = {}; - examples['application/json'] = { - "name" : "LeBron", - "id" : 0, - "position" : "C" -}; - if (Object.keys(examples).length > 0) { - resolve(examples[Object.keys(examples)[0]]); - } else { - resolve(); - } +exports.getPlayerById = function (playerId) { + return new Promise(function (resolve, reject) { + MongoClient.connect(url, function (err, db) { + if (err) throw err; + var dbo = db.db("nbadb"); + dbo.collection("player").find({ "id": playerId }).toArray(function (err, examples) { // 返回集合中所有数据 + db.close(); + if (err) throw err; + if (Object.keys(examples).length > 0) { + resolve(examples[Object.keys(examples)[0]]); + } else { + resolve(); + } + + }); + }); + }); } @@ -60,9 +92,20 @@ exports.getPlayerById = function(playerId) { * body Player Player object that needs to be added to the team * no response value expected for this operation **/ -exports.updatePlayer = function(body) { - return new Promise(function(resolve, reject) { - resolve(); +exports.updatePlayer = function (body) { + return new Promise(function (resolve, reject) { + MongoClient.connect(url, function (err, db) { + if (err) throw err; + var dbo = db.db("nbadb"); + var whereStr = { "id": body.id }; // 查询条件 + var updateStr = { $set: body }; + dbo.collection("player").updateOne(whereStr, updateStr, function (err, res) { + db.close(); + if (err) throw err; + resolve(res); + }); + }); + }); }