1 技术栈
egg+node
项目在线地址
http://47.100.30.67:7001
项目git地址
https://github.com/jiqingpeng/mars/tree/master/fe/egg-example
2 快速入门
egg官方推荐直接使用脚手架,只需几条简单指令,即可快速生成项目(npm >=6.1.0):
mkdir egg-example && cd egg-example
npm init egg --type=simple
npm i
启动项目:
npm run dev
open http://localhost:7001
3 项目目录结构
- app/router.js 用于配置 URL 路由规则,具体参见 Router 。
- app/controller/** 用于解析用户的输入,处理后返回相应的结果,具体参见Controller。
- app/model/** 框架内置对象,也可以理解为接口名称.具体参见Model。
- config/config.default.js 用于编写配置文件.具体参见配置。
- config/plugin.js 用于配置需要加载的插件,具体参见插件。
4 项目详细解析
app/router.js下代码解析
'use strict';
/**
* @param {Egg.Application} app - egg application
*/
module.exports = app => {
const { router, controller } = app;
router.get('/', controller.home.render);//home表接口
router.resources('users', '/users', controller.users);//users表接口
router.resources('info', '/info', controller.info);//users表接口
router.resources('test', '/test', controller.test);//test表接口
router.resources('phone', '/phone', controller.phone);//phone表接口
};
app/controller/info.js
// app/controller/users.js
const Controller = require ('egg').Controller;
// 转整数方法
function toInt (str) {
if (typeof str === 'number') return str;
if (!str) return str;
return parseInt (str, 10) || 0;
}
//过滤对象中的空属性
function filterJson (data) {
const json = {};
for (item in data) {
if (data[item]) {
json[item] = data[item];
}
}
return json;
}
class InfoController extends Controller {
//
async index () {
const ctx = this.ctx;
let {offset, limit, sex, nick} = ctx.query;
const where = filterJson ({sex, nick});
offset = toInt (offset);
limit = toInt (limit);
let total = null;
let result = null;
if (JSON.stringify (where) === '{}') {
total = (await this.app.model.Info.findAll ({})).length;
result = await this.app.model.Info.findAll ({
offset,
limit,
include: [
{
model: this.app.model.Phone
}
]
});
} else {
total = (await this.app.model.Info.findAll ({
where: where,
})).length;
result = await this.app.model.Info.findAll ({
offset,
limit,
where: where,
include: [
{
model: this.app.model.Phone
}
]
});
}
ctx.body = {
data: result,
total,
};
ctx.status = 201;
}
async show () {
const ctx = this.ctx;
const {id} = this.ctx.params;
const Info = await ctx.model.Info.findById (id, {
include: [
{
model: this.app.model.Phone,
},
],
});
ctx.body = {
status: true,
res: Info,
};
ctx.status = 201;
}
async create () {
const ctx = this.ctx;
const {phone_id, nick, sex, head_url} = ctx.request.body;
const info = await ctx.model.Info.create ({phone_id, nick, sex, head_url});
ctx.status = 201;
ctx.body = {
state: true,
res: info,
};
}
async update () {
const ctx = this.ctx;
const id = toInt (ctx.params.id);
const result = await ctx.model.Info.findById (id);
const {nick, sex, head_url} = ctx.request.body;
await result.update ({nick, sex, head_url});
ctx.status = 201;
ctx.body = {
state: true,
res: result,
};
}
async destroy (id) {
const ctx = this.ctx;
await ctx.delete (id);
ctx.status = 200;
}
}
module.exports = InfoController;
- findByID/findAll等方法以及参数limt,offset,where等查询规则的使用是基于 promise 的 Node.js ORM的一个库 Sequelize具体参见 Sequelize Docs 中文文档版 。
- index/update/show/create/destroy restful风格定义接口规则如下图
详情参见https://eggjs.org/zh-cn/basics/router.html 。
5 接口文档
phone
请求url:
- http://47.100.30.67:7001/info
请求方式:
- GET
参数:
参数名 | 是否必填 | 类型 | 说明 |
---|---|---|---|
phone | 否 | string | 手机号 |
注意 http get请求参数要放在URL中,除非做特殊处理
请求url:
- http://47.100.30.67:7001/info
请求方式:
- POST
参数:
参数名 | 是否必填 | 类型 | 说明 |
---|---|---|---|
phone | 是 | string | 手机号 |
pwd | 是 | string | 密码 |
请求url:
- http://47.100.30.67:7001/info
请求方式:
- PUT
参数:
参数名 | 是否必填 | 类型 | 说明 |
---|---|---|---|
pwd | 否 | string | 密码 |
请求url:
- http://47.100.30.67:7001/info
请求方式:
- DELETE
参数:
参数名 | 是否必填 | 类型 | 说明 |
---|---|---|---|
id | 是 | int | 账号id |