用到的应用:1.webstorm2.NavicatforMySQL3.postman一.使用express创建项目1.npminstallexpress-gen
用到的应用: 1.webstorm 2.Navicat for MySQL 3.postman
一.使用express创建项目
1.
npm install express-generator -g
2.
express myapp
二.使用Navicat for MySQL将mysql表引入,开启数据库
三.项目中引入sequlize-auto
参考文档:https://github.com/sequelize/sequelize-auto
1.
npm install -g sequelize-auto
2.创建auto.js
var SequelizeAuto = require('sequelize-auto')
var auto = new SequelizeAuto('hhdj', 'root', 'root', {host: 'localhost',
dialect: 'mysql',
directory: './models', // prevents the program from writing to disk
port: '3306',
additional: {timestamps: false
//...
}}
)
auto.run(function (err) {if (err) throw err;
console.log(auto.tables); // table list
console.log(auto.foreignKeys); // foreign key list
});
运行auto.js 命令: node ./auto.js
此时会在根目录下创建models文件夹
3.在此文件夹下创建index.js
写一个模板处理数据库映射,建create.js
let fs = require('fs')
let files = fs.readdirSync('./models')
let models = []
// 解析名称做成驼峰命名法
files.forEach(item => {if (item != 'index.js') {let names = item.split('.')[0].split('_')let name = ''
for (let i &#61; 1; i <names.length; i&#43;&#43;) {name &#43;&#61; names[i].substring(0,1).toUpperCase() &#43; names[i].substring(1)}models.push({name: name, path: &#39;./&#39; &#43; item})}
})
// 文件内容模板
const template &#61; &#96;
var Sequelize &#61; require(&#39;sequelize&#39;);
// 创建数据库连接
var sequelize &#61; new Sequelize(&#39;hhdj&#39;, &#39;root&#39;, &#39;root&#39;, {
host: &#39;localhost&#39;,
dialect: &#39;mysql&#39;,
pool: {
max: 5,
min: 0,
idle: 10000
}
})
// 数据库模型名称及lujing
const models &#61;${JSON.stringify(models, null, 4)}
// 数据模型输出
models.forEach(item &#61;> {
module.exports[item.name] &#61; require(item.path)(sequelize, Sequelize)
})
&#96;
fs.writeFile("./models/index.js", template, function () {console.log(&#39;创建成功&#39;)
}) 运行&#xff1a; node ./create.js,
此时可在index.js中看到&#xff1a;
var Sequelize &#61; require(&#39;sequelize&#39;);
// 创建数据库连接
var sequelize &#61; new Sequelize(&#39;hhdj&#39;, &#39;root&#39;, &#39;root&#39;, {host: &#39;localhost&#39;,
dialect: &#39;mysql&#39;,
pool: {max: 5,
min: 0,
idle: 10000
}
})
// 数据库模型名称及lujing
const models &#61;[{"name": "ApplyInfo",
"path": "./tb_apply_info.js"
},
{"name": "Branch",
"path": "./tb_branch.js"
},
{"name": "Carousel",
"path": "./tb_carousel.js"
},
{"name": "Comment",
"path": "./tb_comment.js"
},
{"name": "CommentRelation",
"path": "./tb_comment_relation.js"
},
{"name": "CommentUser",
"path": "./tb_comment_user.js"
},
{"name": "Coordinate",
"path": "./tb_coordinate.js"
},
{"name": "Forum",
"path": "./tb_forum.js"
},
{"name": "ForumComment",
"path": "./tb_forum_comment.js"
},
{"name": "Impress",
"path": "./tb_impress.js"
},
{"name": "Integral",
"path": "./tb_integral.js"
},
{"name": "IntegralRule",
"path": "./tb_integral_rule.js"
},
{"name": "News",
"path": "./tb_news.js"
},
{"name": "Notice",
"path": "./tb_notice.js"
},
{"name": "PartyStyle",
"path": "./tb_party_style.js"
},
{"name": "Payfee",
"path": "./tb_payfee.js"
},
{"name": "Picture",
"path": "./tb_picture.js"
},
{"name": "Report",
"path": "./tb_report.js"
},
{"name": "StudyFile",
"path": "./tb_study_file.js"
},
{"name": "User",
"path": "./tb_user.js"
},
{"name": "Manager",
"path": "./user_manager.js"
}
]
// 数据模型输出
models.forEach(item &#61;> {module.exports[item.name] &#61; require(item.path)(sequelize, Sequelize)
})
到此数据库部分写完了。
四。在routes文件夹下创建api文件夹&#xff0c;index.js
1.封装一个登陆接口。
a&#xff0c;先写一个util.js处理接口格式与检查token
var jwt &#61; require(&#39;jwt-simple&#39;)
var User &#61; require(&#39;../models&#39;).User
module.exports &#61; function () {// 检查token
this.checkToken &#61; (req, res, next) &#61;> {var t &#61; req.headers[&#39;access-token&#39;]if (!t) {res.send(this.setResult(300, &#39;no token&#39;))return
}var token &#61; jwt.decode(t, &#39;hhdjj&#39;)User.find({where: {id: token.id}}).then(r &#61;>{req.TOKEN_USER &#61; rnext()}).catch(r &#61;> {res.send(this.setResult(300, &#39;token验证失败&#39;))})}// 设置token
this.setToken &#61; (obj) &#61;> {return jwt.encode(obj, &#39;hhdjj&#39;)}// 接口统一返回格式
this.setResult &#61; (code, message&#61;&#39;success&#39;, data &#61; null) &#61;> {return {code: code,
message: message,
data: data}}
}
b&#xff0c;在index.js写入
const express &#61; require(&#39;express&#39;)
const router &#61;express.Router()
var Util &#61; require(&#39;./util&#39;)
var a &#61;new Util()
var crypto &#61; require(&#39;crypto&#39;) // 用于密码加密
var User &#61; require(&#39;../models&#39;).User
router.post(&#39;/user/login&#39;,function(req, res, next) {
var phone &#61; req.body.phone
var password &#61; req.body.passwordif (!phone) {res.send(a.setResult(301, &#39;账号空&#39;))return
}if (!password) {res.send(a.setResult(301, &#39;账号空&#39;))return
}var md5 &#61; crypto.createHash(&#39;md5&#39;) // md5加密
var upPassword &#61; password &#43; &#39;hhdj&#39;
var params &#61; {where: {password: md5.update(upPassword).digest(&#39;hex&#39;),
phone: phone
}}User.findOne(params).then( su &#61;> {res.send(a.setResult(200, &#39;success&#39;, a.setToken(su)))}).catch( ex &#61;> {// res.send({code: 500, message: &#39;error&#39;})
res.send(a.setResult(500, &#39;error&#39;))}))
module.exports &#61; router c.此时运行项目并使用postman调试。
五&#xff0c;使用apidoc写接口文档
接口文档&#xff1a;http://apidocjs.com/#demo
先下载 &#xff1a; npm install apidoc --save
在上面的index.js写入
/**
* &#64;api {post} /user/login Request User information
* &#64;apiName 登录
* &#64;apiGroup User
*
* &#64;apiParam {String} phone 手机号.
* &#64;apiParam {String} password 密码
*
* &#64;apiSuccess {String} code 200 of the User.
* &#64;apiSuccess {String} message success of the User.
* &#64;apiSuccess {String} data 数据 of the User
*
* &#64;apiSuccessExample Success-Response:
* HTTP/1.1 200 OK
* {
* &#39;code&#39;: 200,
* &#39;message&#39;: &#39;success&#39;,
* &#39;data&#39;: su
* }
*
* &#64;apiError UserNotFound The id of the User was not found.
*
* &#64;apiErrorExample Error-Response:
* HTTP/1.1 404 Not Found
* {
* &#39;code&#39;: 500,
* &#39;message&#39;: &#39;error&#39;
* }
*/
在文档根目录下创建apidoc.json&#xff0c;写入
{"name": "name",
"version": "1.0.0",
"description": "apiDoc basic example",
"title": "title",
"url" : "localhost:3000"
} 运行
apidoc -i routes/api/ -o apidoc/
此时会生成一个apidoc的文件夹&#xff0c;下面有个index.html,打开&#xff0c;即可看到我们封号的接口文档。